ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGMwZjI5MzAuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw4OSArMSwzOTYgQEAKLS9NYWtlZmlsZQotL01ha2VmaWxlLmluCi0vYWNsb2NhbC5tNAotL2F1dG9tNHRlLmNhY2hlCisjIGdlbmVyaWMgaWdub3JlcworKi5sYQorKi5sbworKi5vCisqLmRlcHMKKyouZGlyc3RhbXAKKyoubGlicworKi5sb2cKKyoudHJzCisqLnN1bworKi5weWMKKyouY2FjaGUKKyoudXNlcgorKi5pcGNoCisqLnNkZgorKi5qYXIKKyouZXhlCisqLmRsbAorKl9SZVNoYXJwZXIqCisqLm9wZW5zZGYKKyouc3dwCisqLmhpCisqfgordGFncworCisuKnByb2plY3QKKy5jbGFzc3BhdGgKKy5kdWIKKy5zZXR0aW5ncworLmNoZWNrc3R5bGUKK2p1bml0Ki5wcm9wZXJ0aWVzCisuaWRlYQorKi5pbWwKKyouaXByCisqLml3cworZ2VuLSoKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYWNsb2NhbC5tNAorYWNpbmNsdWRlLm00CithcGFjaGUtdGhyaWZ0LXRlc3QtbGlicmFyeQorYXV0b200dGUuY2FjaGUKK2NtYWtlLSoKK2R1Yi5zZWxlY3Rpb25zLmpzb24KK2xpYmFwYWNoZS10aHJpZnQuYQorbm9kZV9tb2R1bGVzCitjb21waWxlCit0ZXN0LWRyaXZlcgorZXJsX2NyYXNoLmR1bXAKK3Byb2plY3QubG9jay5qc29uCisKKy5zb25hcgorLkRTX1N0b3JlCisuc3ZuCisudmFncmFudAorLnZzY29kZQorLnZzCisKKy9hY2xvY2FsL2xpYnRvb2wubTQKKy9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwotL2NvbXBpbGVyL2NwcC8uZGVwcwotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZQotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5pbgorL2F1dG9zY2FuLSoubG9nCisvY21ha2VfKgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5kYgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5WQy5vcGVuZGIKKy9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisvY29tcGlsZXIvY3BwL3Rlc3QvKnRlc3QKKy9jb21waWxlci9jcHAvdGVzdC90aHJpZnQtZ2VuLSoKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL2dlbi5zdGFtcAorL2NvbXBpbGVyL2NwcC9EZWJ1ZworL2NvbXBpbGVyL2NwcC9SZWxlYXNlCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbGlicGFyc2UuYQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvdmVyc2lvbi5oCiAvY29tcGlsZXIvY3BwL3RocmlmdAotL2NvbXBpbGVyL2NwcC8qLm8KIC9jb21waWxlci9jcHAvdGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oCi0vY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC90aHJpZnR5LmhoCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAvY29uZmlnLioKIC9jb25maWd1cmUKIC9jb25maWd1cmUubGluZW5vCiAvY29uZmlndXJlLnNjYW4KKy9jb250cmliLy52YWdyYW50LworL2NvbnRyaWIvZmIzMDMvY29uZmlnLmNhY2hlCisvY29udHJpYi9mYjMwMy9jb25maWcubG9nCisvY29udHJpYi9mYjMwMy9jb25maWcuc3RhdHVzCisvY29udHJpYi9mYjMwMy9jb25maWd1cmUKKy9jb250cmliL2ZiMzAzL2NwcC9saWJmYjMwMy5hCisvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLworL2NvbnRyaWIvZmIzMDMvcHkvYnVpbGQvCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UtcmVtb3RlCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL19faW5pdF9fLnB5CisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9jb25zdGFudHMucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKLS9pZi9NYWtlZmlsZQotL2lmL01ha2VmaWxlLmluCiAvaW5zdGFsbC1zaAotL2xpYi9NYWtlZmlsZQotL2xpYi9NYWtlZmlsZS5pbgotL2xpYi9lcmwvZWJpbgotL2xpYi9jcHAvLmRlcHMKLS9saWIvY3BwLy5saWJzCi0vbGliL2NwcC9NYWtlZmlsZQotL2xpYi9jcHAvTWFrZWZpbGUuaW4KKy9saWIvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL2xpYi9jbC9saWIKKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC5saXNwCisvbGliL2NsL2V4dGVybmFscy8KKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC8KKy9saWIvY3BwL0RlYnVnLworL2xpYi9jcHAvRGVidWctbXQvCisvbGliL2NwcC9SZWxlYXNlLworL2xpYi9jcHAvUmVsZWFzZS1tdC8KKy9saWIvY3BwL3NyYy90aHJpZnQvcXQvbW9jX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaAorL2xpYi9jcHAvc3JjL3RocmlmdC9zdGFtcC1oMgorL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsKKy9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xzVGVzdAorL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9FbnVtVGVzdAorL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0CisvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0CisvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdAorL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdAorL2xpYi9jcHAvdGVzdC9SZWZsZWN0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKKy9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAorL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVEludGVycnVwdFRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdAorL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdAorL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1VuaXRUZXN0cworL2xpYi9jcHAvdGVzdC9abGliVGVzdAorL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QKKy9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3lfdGVzdAorL2xpYi9jcHAvdGVzdC9saW5rX3Rlc3QKKy9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yX3Rlc3QKKy9saWIvY3BwL3Rlc3QvdGVzdHMueG1sCiAvbGliL2NwcC9jb25jdXJyZW5jeV90ZXN0Ci0vbGliL2NwcC8qLm8KLS9saWIvY3BwLyoubGEKLS9saWIvY3BwLyoubG8KIC9saWIvY3BwLyoucGMKLS9saWIvY3NoYXJwL01ha2VmaWxlCi0vbGliL2NzaGFycC9NYWtlZmlsZS5pbgorL2xpYi9jcHAveDY0L0RlYnVnLworL2xpYi9jcHAveDY0L0RlYnVnLW10LworL2xpYi9jcHAveDY0L1JlbGVhc2UKKy9saWIvY3BwL3g2NC9SZWxlYXNlLW10CisvbGliL2NfZ2xpYi8qLmdjZGEKKy9saWIvY19nbGliLyouZ2NubworL2xpYi9jX2dsaWIvKi5sb1QKKy9saWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY19nbGliL3NyYy90aHJpZnQvc3RhbXAtaDMKKy9saWIvY19nbGliL3Rlc3QvKi5nY25vCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLnNoCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLXRlc3QqCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QKKy9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8KKy9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlcgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIKKy9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uCisvbGliL2NfZ2xpYi90aHJpZnRjLnBjCisvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCisvbGliL2NzaGFycC8qKi9iaW4vCisvbGliL2NzaGFycC8qKi9vYmovCisvbGliL2NzaGFycC9zcmMvcGFja2FnZXMKKy9saWIvZC90ZXN0LyoucGVtCisvbGliL2QvbGlidGhyaWZ0ZCouYQorL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdAorL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdAorL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsKKy9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50CisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIKKy9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0CisvbGliL2QvdW5pdHRlc3QvCisvbGliL2RhcnQvY292ZXJhZ2UKKy9saWIvZGFydC8qKi8ucGFja2FnZXMKKy9saWIvZGFydC8qKi9wYWNrYWdlcworL2xpYi9kYXJ0LyoqLy5wdWIvCisvbGliL2RhcnQvKiovcHVic3BlYy5sb2NrCisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXF1ZXN0CisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXNwb25zZQorL2xpYi9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvbGliL2RlbHBoaS8qKi8qLmxvY2FsCisvbGliL2RlbHBoaS8qKi8qLmRjdQorL2xpYi9kZWxwaGkvKiovKi4yMDA3CisvbGliL2RlbHBoaS8qKi8qLmRwcm9qCisvbGliL2RlbHBoaS8qKi9jb2RlZ2VuLyouYmF0CisvbGliL2VybC8uZXVuaXQKKy9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvZXJsLy5yZWJhci8KKy9saWIvZXJsL2RlcHMvCisvbGliL2VybC9lYmluCisvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMKKy9saWIvZXJsL3Rlc3QvKi5iZWFtCisvbGliL2VybC90ZXN0LyouaHJsCisvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CisvbGliL2hheGUvdGVzdC9iaW4KKy9saWIvaGF4ZS90ZXN0L2RhdGEudG1wCiAvbGliL2hzL2Rpc3QKLS9saWIvamF2YS9NYWtlZmlsZQotL2xpYi9qYXZhL01ha2VmaWxlLmluCisvbGliL2phdmEvLmdyYWRsZQorL2xpYi9qYXZhL2FuZHJvaWQvLmdyYWRsZQogL2xpYi9qYXZhL2J1aWxkCi0vbGliL2phdmEvZ2VuLWphdmEKLS9saWIvamF2YS9nZW4tamF2YWJlYW4KLS9saWIvamF2YS9saWJ0aHJpZnQuamFyCisvbGliL2phdmEvdGFyZ2V0CisvbGliL2pzL2Rpc3QKKy9saWIvanMvZG9jCisvbGliL2pzL3Rlc3QvYnVpbGQKKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKKy9saWIvbm9kZWpzL2NvdmVyYWdlCisvbGliL25vZGVqcy9ub2RlX21vZHVsZXMvCiAvbGliL3BlcmwvTUFOSUZFU1QKLS9saWIvcGVybC9NYWtlZmlsZQotL2xpYi9wZXJsL01ha2VmaWxlLmluCisvbGliL3BlcmwvTVlNRVRBLmpzb24KKy9saWIvcGVybC9NWU1FVEEueW1sCiAvbGliL3BlcmwvTWFrZWZpbGUtcGVybC5tawogL2xpYi9wZXJsL2JsaWIKIC9saWIvcGVybC9wbV90b19ibGliCi0vbGliL3BlcmwvdGVzdC9NYWtlZmlsZQotL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvcGVybC90ZXN0L2dlbi1wZXJsCi0vbGliL3B5L01ha2VmaWxlCi0vbGliL3B5L01ha2VmaWxlLmluCiAvbGliL3B5L2J1aWxkCi0vbGliL3JiL01ha2VmaWxlCi0vbGliL3JiL01ha2VmaWxlLmluCisvbGliL3B5L3RocmlmdC5lZ2ctaW5mby8KKy9saWIvcmIvR2VtZmlsZS5sb2NrCisvbGliL3JiL2RlYnVnX3Byb3RvX3Rlc3QKKy9saWIvcmIvLmNvbmZpZworL2xpYi9yYi9leHQvY29uZnRlc3QuZFNZTS8KKy9saWIvcmIvZXh0L21rbWYubG9nCisvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmJ1bmRsZQorL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5zbworL2xpYi9yYi90ZXN0LworL2xpYi9yYi90aHJpZnQtKi5nZW0KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLioKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCisvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2x0bWFpbi5zaAorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWlzc2luZworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWtpbnN0YWxsZGlycworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy8KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wubG8KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3J1bi10ZXN0cy5waHAKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5sYQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvdG1wLXBocC5pbmkKKy9saWIvcGhwL3NyYy9wYWNrYWdlcy8KKy9saWIvcGhwL3Rlc3QvVEVTVC0qLnhtbAorL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KKy9saWIvcHkvZGlzdC8KKy9saWIvZXJsL2xvZ3MvCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKKy9saWIvZ28vdGVzdC9nb3BhdGgvCisvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZworL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCi0vdGVzdC8uZGVwcwotL3Rlc3QvLmxpYnMKLS90ZXN0LyoubwotL3Rlc3QvKi5sYQotL3Rlc3QvKi5sbwotL3Rlc3QvQmVuY2htYXJrCi0vdGVzdC9EZWJ1Z1Byb3RvVGVzdAotL3Rlc3QvSlNPTlByb3RvVGVzdAotL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAotL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdAotL3Rlc3QvVW5pdFRlc3RzCi0vdGVzdC9NYWtlZmlsZQotL3Rlc3QvTWFrZWZpbGUuaW4KLS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0Ci0vdGVzdC9SZWZsZWN0aW9uVGVzdAotL3Rlc3QvZ2VuLWNwcAotL3Rlc3QvamF2YS9NYWtlZmlsZQotL3Rlc3QvamF2YS9NYWtlZmlsZS5hbQotL3Rlc3QvamF2YS9NYWtlZmlsZS5pbgotL3Rlc3QvamF2YS9idWlsZAotL3Rlc3QvamF2YS9nZW4tamF2YQotL3Rlc3QvamF2YS90aHJpZnR0ZXN0LmphcgotL3Rlc3QvcHkvTWFrZWZpbGUKLS90ZXN0L3B5L01ha2VmaWxlLmluCi0vdGVzdC9weS9nZW4tcHkKLS90ZXN0L3JiL01ha2VmaWxlCi0vdGVzdC9yYi9NYWtlZmlsZS5pbgorL3Rlc3QvZmVhdHVyZXMvcmVzdWx0cy5qc29uCisvdGVzdC9yZXN1bHRzLmpzb24KKy90ZXN0L2NfZ2xpYi90ZXN0X2NsaWVudAorL3Rlc3QvY19nbGliL3Rlc3Rfc2VydmVyCisvdGVzdC9jbC9UZXN0U2VydmVyCisvdGVzdC9jbC9UZXN0Q2xpZW50CisvdGVzdC9jcHAvU3RyZXNzVGVzdAorL3Rlc3QvY3BwL1N0cmVzc1Rlc3ROb25CbG9ja2luZworL3Rlc3QvY3BwL1Rlc3RDbGllbnQKKy90ZXN0L2NwcC9UZXN0U2VydmVyCisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCisvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcworL3Rlc3QvZGFydC8qKi9wYWNrYWdlcworL3Rlc3QvZGFydC8qKi8ucHViLworL3Rlc3QvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90ZXN0L2xvZy8KKy90ZXN0L3Rlc3QubG9nCisvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgorL3Rlc3QvZXJsL2ViaW4KKy90ZXN0L2dvL2Jpbi8KKy90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CisvdGVzdC9nby9nb3BhdGgKKy90ZXN0L2dvL3BrZy8KKy90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbworL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCisvdGVzdC9nby9zcmMvZ2VuLworL3Rlc3QvZ28vc3JjL3RocmlmdAorL3Rlc3QvaGF4ZS9iaW4KKy90ZXN0L2hzL1Rlc3RDbGllbnQKKy90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCisvdGVzdC9yYi9HZW1maWxlLmxvY2sKKy90ZXN0L25ldGNvcmUvKiovYmluCisvdGVzdC9uZXRjb3JlLyoqL29iagorL3Rlc3QvbmV0Y29yZS9UaHJpZnQKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3JzL0NhcmdvLmxvY2sKKy90ZXN0L3JzL3NyYy90aHJpZnRfdGVzdC5ycworL3Rlc3QvcnMvYmluLworL3Rlc3QvcnMvdGFyZ2V0LworL3Rlc3QvcnMvKi5pbWwKKy90ZXN0L3JzLyoqLyouaW1sCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLmxpc3AKKy90dXRvcmlhbC9jbC9leHRlcm5hbHMvCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLworL3R1dG9yaWFsL2NsL1R1dG9yaWFsQ2xpZW50CisvdHV0b3JpYWwvY2wvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvdHV0b3JpYWwvY2wvbGliLworL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbFNlcnZlcgorL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9jbGllbnQKKy90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfc2VydmVyCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9vYmoKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL2JpbgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9iaW4KKy90dXRvcmlhbC9kL2FzeW5jX2NsaWVudAorL3R1dG9yaWFsL2QvY2xpZW50CisvdHV0b3JpYWwvZC9zZXJ2ZXIKKy90dXRvcmlhbC9kYXJ0LyoqLy5wYWNrYWdlcworL3R1dG9yaWFsL2RhcnQvKiovcGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqLy5wdWIvCisvdHV0b3JpYWwvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5kc2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLnR2c2NvbmZpZworL3R1dG9yaWFsL2RlbHBoaS8qKi9kY3UKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy90dXRvcmlhbC9nby9nb3BhdGgKKy90dXRvcmlhbC9nby9nby10dXRvcmlhbAorL3R1dG9yaWFsL2dvL2NhbGN1bGF0b3ItcmVtb3RlCisvdHV0b3JpYWwvZ28vc3JjL3NoYXJlZAorL3R1dG9yaWFsL2dvL3NyYy90dXRvcmlhbAorL3R1dG9yaWFsL2dvL3NyYy9naXQuYXBhY2hlLm9yZworL3R1dG9yaWFsL2dvL3NyYy9nb2xhbmcub3JnCisvdHV0b3JpYWwvaGF4ZS9iaW4KKy90dXRvcmlhbC9ocy9kaXN0LworL3R1dG9yaWFsL2phdmEvYnVpbGQvCisvdHV0b3JpYWwvanMvYnVpbGQvCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9iaW4KKy90dXRvcmlhbC9uZXRjb3JlLyoqL29iagorL3R1dG9yaWFsL25ldGNvcmUvVGhyaWZ0CisvdHV0b3JpYWwvcnMvKi5pbWwKKy90dXRvcmlhbC9ycy9zcmMvc2hhcmVkLnJzCisvdHV0b3JpYWwvcnMvc3JjL3R1dG9yaWFsLnJzCisvdHV0b3JpYWwvcnMvYmluCisvdHV0b3JpYWwvcnMvdGFyZ2V0CisvdHV0b3JpYWwvcnMvQ2FyZ28ubG9jawogL3lsd3JhcAorCmRpZmYgLS1naXQgYS8ucnVzdGZtdC50b21sIGIvLnJ1c3RmbXQudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvLnJ1c3RmbXQudG9tbApAQCAtMCwwICsxLDY0IEBACittYXhfd2lkdGggPSAxMDAKK2hhcmRfdGFicyA9IGZhbHNlCit0YWJfc3BhY2VzID0gNAorbmV3bGluZV9zdHlsZSA9ICJBdXRvIgordXNlX3NtYWxsX2hldXJpc3RpY3MgPSAiRGVmYXVsdCIKK2luZGVudF9zdHlsZSA9ICJCbG9jayIKK3dyYXBfY29tbWVudHMgPSBmYWxzZQorZm9ybWF0X2RvY19jb21tZW50cyA9IGZhbHNlCitjb21tZW50X3dpZHRoID0gODAKK25vcm1hbGl6ZV9jb21tZW50cyA9IGZhbHNlCitub3JtYWxpemVfZG9jX2F0dHJpYnV0ZXMgPSBmYWxzZQorbGljZW5zZV90ZW1wbGF0ZV9wYXRoID0gIiIKK2Zvcm1hdF9zdHJpbmdzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19tYXRjaGVycyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fYm9kaWVzID0gdHJ1ZQorZW1wdHlfaXRlbV9zaW5nbGVfbGluZSA9IHRydWUKK3N0cnVjdF9saXRfc2luZ2xlX2xpbmUgPSB0cnVlCitmbl9zaW5nbGVfbGluZSA9IGZhbHNlCit3aGVyZV9zaW5nbGVfbGluZSA9IGZhbHNlCitpbXBvcnRzX2luZGVudCA9ICJCbG9jayIKK2ltcG9ydHNfbGF5b3V0ID0gIk1peGVkIgorbWVyZ2VfaW1wb3J0cyA9IGZhbHNlCityZW9yZGVyX2ltcG9ydHMgPSB0cnVlCityZW9yZGVyX21vZHVsZXMgPSB0cnVlCityZW9yZGVyX2ltcGxfaXRlbXMgPSBmYWxzZQordHlwZV9wdW5jdHVhdGlvbl9kZW5zaXR5ID0gIldpZGUiCitzcGFjZV9iZWZvcmVfY29sb24gPSBmYWxzZQorc3BhY2VfYWZ0ZXJfY29sb24gPSB0cnVlCitzcGFjZXNfYXJvdW5kX3JhbmdlcyA9IGZhbHNlCitiaW5vcF9zZXBhcmF0b3IgPSAiRnJvbnQiCityZW1vdmVfbmVzdGVkX3BhcmVucyA9IHRydWUKK2NvbWJpbmVfY29udHJvbF9leHByID0gdHJ1ZQorb3ZlcmZsb3dfZGVsaW1pdGVkX2V4cHIgPSBmYWxzZQorc3RydWN0X2ZpZWxkX2FsaWduX3RocmVzaG9sZCA9IDAKK2VudW1fZGlzY3JpbV9hbGlnbl90aHJlc2hvbGQgPSAwCittYXRjaF9hcm1fYmxvY2tzID0gdHJ1ZQorZm9yY2VfbXVsdGlsaW5lX2Jsb2NrcyA9IGZhbHNlCitmbl9hcmdzX2RlbnNpdHkgPSAiVGFsbCIKK2JyYWNlX3N0eWxlID0gIlNhbWVMaW5lV2hlcmUiCitjb250cm9sX2JyYWNlX3N0eWxlID0gIkFsd2F5c1NhbWVMaW5lIgordHJhaWxpbmdfc2VtaWNvbG9uID0gdHJ1ZQordHJhaWxpbmdfY29tbWEgPSAiVmVydGljYWwiCittYXRjaF9ibG9ja190cmFpbGluZ19jb21tYSA9IGZhbHNlCitibGFua19saW5lc191cHBlcl9ib3VuZCA9IDEKK2JsYW5rX2xpbmVzX2xvd2VyX2JvdW5kID0gMAorZWRpdGlvbiA9ICIyMDE1IgorbWVyZ2VfZGVyaXZlcyA9IHRydWUKK3VzZV90cnlfc2hvcnRoYW5kID0gZmFsc2UKK3VzZV9maWVsZF9pbml0X3Nob3J0aGFuZCA9IGZhbHNlCitmb3JjZV9leHBsaWNpdF9hYmkgPSB0cnVlCitjb25kZW5zZV93aWxkY2FyZF9zdWZmaXhlcyA9IGZhbHNlCitjb2xvciA9ICJBdXRvIgorcmVxdWlyZWRfdmVyc2lvbiA9ICIxLjAuMCIKK3Vuc3RhYmxlX2ZlYXR1cmVzID0gZmFsc2UKK2Rpc2FibGVfYWxsX2Zvcm1hdHRpbmcgPSBmYWxzZQorc2tpcF9jaGlsZHJlbiA9IGZhbHNlCitoaWRlX3BhcnNlX2Vycm9ycyA9IGZhbHNlCitlcnJvcl9vbl9saW5lX292ZXJmbG93ID0gZmFsc2UKK2Vycm9yX29uX3VuZm9ybWF0dGVkID0gZmFsc2UKK3JlcG9ydF90b2RvID0gIk5ldmVyIgorcmVwb3J0X2ZpeG1lID0gIk5ldmVyIgoraWdub3JlID0gW10KK2VtaXRfbW9kZSA9ICJGaWxlcyIKK21ha2VfYmFja3VwID0gZmFsc2UKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YjVkNQotLS0gL2Rldi9udWxsCisrKyBiLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMTczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIFRyYXZpcyBDSSAtIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy8KKworIworIyBEb2NrZXIgSW50ZWdyYXRpb24KKyMgc2VlOiBidWlsZC9kb2NrZXIvUkVBRE1FLm1kCisjIAorCitzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCisKK3NlcnZpY2VzOgorICAtIGRvY2tlcgorCitpbnN0YWxsOgorICAtIGlmIFtbIGB1bmFtZWAgPT0gIkxpbnV4IiBdXTsgdGhlbiBidWlsZC9kb2NrZXIvcmVmcmVzaC5zaDsgZmkKKworc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icworCitlbnY6CisgIGdsb2JhbDoKKyAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgLSBCVUlMRF9BUkc9IiIKKyAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysgLWUgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT00IgorICAgIC0gRElTVFJPPXVidW50dS1iaW9uaWMKKyAgICAtIEJVSUxEX0xJQlM9IkNQUCBDX0dMSUIgSEFTS0VMTCBKQVZBIFBZVEhPTiBURVNUSU5HIFRVVE9SSUFMUyIgICMgb25seSBtZWFuaW5nZnVsIGZvciBDTWFrZSBidWlsZHMKKyAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT10ZXN0CisgICAgIyBET0NLRVJfUkVQTyAodGhpcyB3b3JrcyBmb3IgYWxsIGJ1aWxkcyBhcyBhIHNvdXJjZSBmb3IgZG9ja2VyIGltYWdlcyAtIHlvdSBjYW4gb3ZlcnJpZGUgZm9yIGZvcmsgYnVpbGRzIGluIHlvdXIgVHJhdmlzIHNldHRpbmdzKQorICAgIC0gRE9DS0VSX1JFUE89InRocmlmdC90aHJpZnQtYnVpbGQiCisgICAgIyBET0NLRVJfVVNFUiAocHJvdmlkZSBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncyBpZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdXBkYXRlIGRvY2tlciBpbWFnZXMgb25jZSwgaW5zdGVhZCBvZiBvbiBldmVyeSBqb2IpCisgICAgIyBET0NLRVJfUEFTUyAoc2FtZSkKKworam9iczoKKyAgaW5jbHVkZToKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYXBhY2hlL3RocmlmdCBvZmZpY2lhbCBQUiBidWlsZHMgY2FuIGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2Igc28gY29tYmluZSBhbGwgY3Jvc3MgdGVzdHMKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisKKyAgICAjIGZvcmsgYmFzZWQgUFIgYnVpbGRzIGNhbm5vdCBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChCaW5hcnkgUHJvdG9jb2wpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGJpbmFyeSknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChIZWFkZXIsIEpTT04gUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhoZWFkZXJ8anNvbiknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBNdWx0aXBsZXhlZCBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8bXVsdGlwbGV4ZWQpJyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogc2NhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBRQSBqb2JzIGZvciBjb2RlIGFuYWx5dGljcyBhbmQgbWV0cmljcworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJTdGF0aWMgQ29kZSBBbmFseXNpcyIKKyAgICAgICAgLSBTQ1JJUFQ9InNjYS5zaCIKKworICAgICMgQyBhbmQgQysrIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAjIEEgYmluYXJ5IGNyYXNoZXMgaWYgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3VycyBhbmQgcHJvZHVjZXMgYSBzdGFjayB0cmFjZS4KKyAgICAjIHB5dGhvbiBpcyBkaXNhYmxlZCwgc2VlOiBUSFJJRlQtNDM2MAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJVQlNhbiIKKyAgICAgICAgLSBTQ1JJUFQ9InVic2FuLnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcHkzIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBhdXRvdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRPRE86IFJlbW92ZSB0aGVtIG9uY2UgbWlncmF0ZWQgdG8gQ01ha2UKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgQmlvbmljKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJBdXRvdG9vbHMgKFVidW50dSBYZW5pYWwpIgorICAgICAgICAtIERJU1RSTz11YnVudHUteGVuaWFsCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNtYWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDTWFrZSIKKworICAgICMgQysrIHNwZWNpZmljIG9wdGlvbnM6IGNvbXBpbGVyIHBsdWctaW4sIHRocmVhZGluZyBtb2RlbAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDKysgKFN0ZCBUaHJlYWQpIGFuZCBQbHVnaW4iCisgICAgICAgIC0gU0NSSVBUPSJjbWFrZS5zaCIKKyAgICAgICAgLSBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCisgICAgICAgIC0gQlVJTERfQVJHPSItRFdJVEhfUExVR0lOPU9OIC1EV0lUSF9TVERUSFJFQURTPU9OIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCisgICAgICAgIC0gQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogZGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9Im1ha2UgZGlzdCIKKyAgICAgICAgLSBTQ1JJUFQ9Im1ha2UtZGlzdC5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEZWJpYW4gUGFja2FnZXMiCisgICAgICAgIC0gU0NSSVBUPSJkcGtnLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjb3Zlcml0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFdlIGJ1aWxkIHRoZSBjb3Zlcml0eSBzY2FuIGJ1aWxkIG9uY2UgbW9udGhseSB1c2luZyBhIHRyYXZpcyBjcm9uIGpvYgorICAgIC0gaWY6IChlbnYoQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwpIElTIHByZXNlbnQpIEFORCAoYnJhbmNoIElOIChtYXN0ZXIpKSBBTkQgKHR5cGUgSU4gKGNyb24pKQorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDb3Zlcml0eSBTY2FuIgorICAgICAgICAtIFNDUklQVD0iY292c2Nhbi5zaCIKKyAgICAgCisKKyAgIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IG9zeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGRpc2FibGVkIGR1ZSB0byB0aGUgdGltZSBkZWxheXMgaXQgaW1wb3NlcyBvbiBidWlsZCBqb2JzCisgICMgLSBvczogb3N4CisgICMgICBvc3hfaW1hZ2U6IHhjb2RlOQorICAjICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKwpkaWZmIC0tZ2l0IGEvQXBhY2hlVGhyaWZ0Lm51c3BlYyBiL0FwYWNoZVRocmlmdC5udXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL0FwYWNoZVRocmlmdC5udXNwZWMKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYSBudWdldCBwYWNrYWdlOgorCisgIDEuIE9wZW4gVGhyaWZ0LnNsbiBpbiBsaWJcY3NoYXJwXHNyYyBhbmQgYnVpbGQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgICBvZiB0aGUgIlRocmlmdCIgYW5kICJUaHJpZnQuNDUiIHByb2plY3RzLgorICAyLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXG5ldGNvcmUgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24gb2YKKyAgICAgdGhlICJUaHJpZnQiIHByb2plY3QuCisgIDMuIG51Z2V0IHNldEFwaUtleSA8eW91ci1hcGkta2V5PgorICAzLiBudWdldCBwYWNrIEFwYWNoZVRocmlmdC5udXNwZWMgLVN5bWJvbHMgLVN5bWJvbFBhY2thZ2VGb3JtYXQgc251cGtnCisgIDQuIG51Z2V0IHB1c2ggQXBhY2hlVGhyaWZ0LjEuMC4wLm51cGtnIC1Tb3VyY2UgaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24KKyAgLS0+CisKKzxwYWNrYWdlIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3BhY2thZ2luZy8yMDEzLzA1L251c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkFwYWNoZVRocmlmdDwvaWQ+CisgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgMS4wLjA8L3RpdGxlPgorICAgIDxhdXRob3JzPkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVyczwvYXV0aG9ycz4KKyAgICA8b3duZXJzPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vd25lcnM+CisgICAgPGxpY2Vuc2UgdHlwZT0iZXhwcmVzc2lvbiI+QXBhY2hlLTIuMDwvbGljZW5zZT4KKyAgICA8cHJvamVjdFVybD5odHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvPC9wcm9qZWN0VXJsPgorICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+dHJ1ZTwvcmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPgorICAgIDxzdW1tYXJ5PkFwYWNoZSBUaHJpZnQgLk5FVCBMaWJyYXJ5PC9zdW1tYXJ5PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIENvbnRhaW5zIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gbGliL2NzaGFycCBmb3IgbmV0MzUgYW5kIG5ldDQ1IGZyYW1ld29ya3MsIAorICAgICAgYW5kIGZyb20gbGliL25ldGNvcmUgZm9yIG5ldHN0YW5kYXJkMi4wIGZyYW1ld29yayBkZXZlbG9wbWVudC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXBvc2l0b3J5IHR5cGU9IkdpdEh1YiIgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIgYnJhbmNoPSJyZWxlYXNlLzEuMC4wIiAvPgorICAgIDx0YWdzPkFwYWNoZSBUaHJpZnQgUlBDPC90YWdzPgorICA8L21ldGFkYXRhPgorICA8ZmlsZXM+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuKiIgdGFyZ2V0PSJsaWJcbmV0MzUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQ0NS4qIiB0YXJnZXQ9ImxpYlxuZXQ0NSIgLz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxuZXRjb3JlXFRocmlmdFxiaW5cUmVsZWFzZVxuZXRzdGFuZGFyZDIuMFwqLioiIHRhcmdldD0ibGliXG5ldHN0YW5kYXJkMi4wIiAvPgorICA8L2ZpbGVzPgorPC9wYWNrYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmluZGV4IDJjMmYzZjguLjI0NGYwZGEgMTAwNjQ0Ci0tLSBhL0NIQU5HRVMKKysrIGIvQ0hBTkdFUwpAQCAtMSw3ICsxLDI4NDIgQEAKLVRocmlmdCBDaGFuZ2Vsb2cKK0FwYWNoZSBUaHJpZnQgQ2hhbmdlbG9nCiAKLVZlcnNpb24gMC40LjAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgTmV3IExhbmd1YWdlcworICAgICogQ29tbW9uIExJU1AgKGNsKQorICAgICogU3dpZnQKKyAgICAqIFR5cGVzY3JpcHQgKG5vZGV0cykKIAorIyMgRGVwcmVjYXRlZCBMYW5ndWFnZXMKKyAgICAqIENvY29hCisKKyMjIEJyZWFraW5nIENoYW5nZXMgKHNpbmNlIDAuMTEuMCkKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGVudW0gdmFyaWFudHMgYXJlIG5vdyBjYW1lbC1jYXNlZCBpbnN0ZWFkIG9mIHVwcGVyY2FzZWQgdG8gY29uZm9ybSB0byBSdXN0IG5hbWluZyBjb252ZW50aW9ucworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDQ3NF0gLSBQSFAgbm93IHVzZXMgdGhlIFBTUi00IGxvYWRlciBieSBkZWZhdWx0IGluc3RlYWQgb2YgY2xhc3MgbWFwcy4KKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBtZXRob2Qgc2lnbmF0dXJlcyBjaGFuZ2VkIGluIHRoZSBjb21waWxlcidzIHRfb29wX2dlbmVyYXRvci4KKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorCisjIyBLbm93biBJc3N1ZXMgKEJsb2NrZXIgb3IgQ3JpdGljYWwpCisgICAgKiBbVEhSSUZULTQwMzddIC0gYnVpbGQ6IHVzZSBhIHNpbmdsZSBidWlsZCBzeXN0ZW0gZm9yIHRocmlmdAorICAgICogW1RIUklGVC00MTE5XSAtIGJ1aWxkOiBib290c3RyYXAuc2ggaXMgbWlzc2luZyBmcm9tIHNvdXJjZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTMyODldIC0gY3NoYXJwOiBzb2NrZXQgZXhoYXVzdGlvbiBpbiBjc2hhcnAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzAyOV0gLSBjb2NvYTogR2V0dGVycyBmb3IgZmllbGRzIGRlZmluZWQgd2l0aCB1cHBlcmNhc2UgbmFtZXMgZG8gbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMzMyNV0gLSBjb2NvYTogRXh0ZW5kZWQgc2VydmljZXMgYXJlbid0IHN1YmNsYXNzZXMgaW4gZ2VuZXJhdGVkIENvY29hCisgICAgKiBbVEhSSUZULTQxMTZdIC0gY29jb2E6IFRocmlmdCBkZS1jYXBpdGFsaXplcyB0aGUgbmFtZSBvZiBJc1NldCBwcm9wZXJ0eSBpbiBDb2NvYQorICAgICogW1RIUklGVC0zODc3XSAtIGNwcDogdGhlIGh0dHAgaW1wbGVtZW50YXRpb24gaXMgbm90IHN0YW5kYXJkOyBpbnRlcm9wIHdpdGggb3RoZXIgbGFuZ3VhZ2VzIGlzIHNwb3R0eSBhdCBiZXN0CisgICAgKiBbVEhSSUZULTQxODBdIC0gY3BwOiBJbXBvc3NpYmxlIHRvIGJ1aWxkIFRocmlmdCBDKysgbGlicmFyeSBmb3IgQW5kcm9pZCAoTkRLKQorICAgICogW1RIUklGVC00Mzg0XSAtIGNwcDogVXNpbmcgbXVsdGlwbGUgYXN5bmMgc2VydmljZXMgc2ltdWx0YW5lb3VzbHkgaXMgbm90IHRocmVhZC1zYWZlCisgICAgKiBbVEhSSUZULTMxMDhdIC0gaGFza2VsbDogRGVmYXVsdGVkIHN0cnVjdCBwYXJhbWV0ZXJzIG9uIGEgc2VydmljZSBnZW5lcmF0ZXMgaW52YWxpZCBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM5OTBdIC0gbm9kZWpzOiBFeGNlcHRpb24gc3dhbGxvd2VkIGJ5IGRlc2VyaWFsaXphdGlvbiBmdW5jdGlvbgorICAgICogW1RIUklGVC00MjE0XSAtIG5vZGVqczogbWFwPGk2NCx2YWx1ZT4ga2V5IHRyZWF0ZWQgYXMgaGV4IHZhbHVlIGluIEphdmFTY3JpcHQKKyAgICAqIFtUSFJJRlQtNDYwMl0gLSBub2RlanM6IEVSUk9SIGluIC4vbm9kZV9tb2R1bGVzL3RocmlmdC9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcyBNb2R1bGUgbm90IGZvdW5kOiBFcnJvcjogQ2FuJ3QgcmVzb2x2ZSAnY2hpbGRfcHJvY2VzcycKKyAgICAqIFtUSFJJRlQtNDYzOV0gLSBub2RlanM6IFNlcXVlbmNlIG51bWJlcmluZyBmb3IgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgYnJva2VuCisgICAgKiBbVEhSSUZULTEzMTBdIC0gcGhwOiBzZXF1ZW5jZSBhbmQgcmVjb25uZWN0aW9uIG1hbmFnZW1lbnQgaXNzdWVzCisgICAgKiBbVEhSSUZULTE1MzhdIC0gcGhwOiBFcnJvciBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIGludDY0IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmUKKyAgICAqIFtUSFJJRlQtMTU4MF0gLSBwaHA6IHRocmlmdCB0eXBlIGk2NCBqYXZhIHRvIHBocCBzZXJpYWxpemUvZGVzZXJlYWxpemUgbm90IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMTk1MF0gLSBwaHA6IFBIUCBnZXRzIHN0dWNrIGluIGluZmluaXRlIGxvb3AKKyAgICAqIFtUSFJJRlQtMjk1NF0gLSBweXRob246IHNlbmRpbmcgaW50IG9yIGZsb2F0IGluIGEgZG91YmxlIGZpZWxkIGJyZWFrcyB0aGUgY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MDgwXSAtIHB5dGhvbjogdW5peCBzb2NrZXRzIGNhbiBnZXQgc3R1Y2sgZm9yZXZlcgorICAgICogW1RIUklGVC00MjgxXSAtIHB5dGhvbjogZ2VuZXJhdGVkIGNvZGUgaXMgb3V0IG9mIG9yZGVyIGFuZCBjYXVzZXMgbG9hZCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtNDY3N10gLSBweTM6IFVuaWNvZGVEZWNpZGVFcnJvciBpbiBQeXRob24zCisKKyMjIEJ1aWxkIFByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNDA2N10gLSBXaW5kb3dzIHRocmlmdCBjb21waWxlciBkaXN0cmlidXRlZCBvbiB0aGUgYXBhY2hlIHdlYiBzaXRlIGhhcyBydW50aW1lIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKyAgICAqIFtUSFJJRlQtNDU3OV0gLSBVc2UgVWJ1bnR1IEJpb25pYyAoMTguMDQgTFRTKSBmb3IgQ0kgYnVpbGRzIGluc3RlYWQgb2YgQXJ0ZnVsICgxNy4xMCkKKyAgICAqIFtUSFJJRlQtNDUwOF0gLSBEZWZpbmUgQ0kgb3BlcmF0aW5nIHN5c3RlbSBjb3ZlcmFnZSBydWxlcyBmb3IgdGhlIHByb2plY3QgYW5kIChob3BlZnVsbHkpIHNpbXBsaWZ5IENJIGEgbGl0dGxlIG1vcmUKKyAgICAqIFtUSFJJRlQtNDM5N10gLSB1YnVudHUgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYnJva2VuIG9uIDE2LjA0CisgICAgKiBbVEhSSUZULTQ1NDVdIC0gQXBwdmV5b3IgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBhIGhhc2tlbGwgLyBjYWJhbCB1cGRhdGUgaW4gY2hvY29sYXRleQorICAgICogW1RIUklGVC00NDUyXSAtIG9wdGltaXplIERvY2tlcmZpbGUgKG9ubHkgb25ldGltZSBhcHQtZ2V0IHVwZGF0ZSkKKyAgICAqIFtUSFJJRlQtNDQ0MF0gLSBybSBgYnVpbGQvZG9ja2VyL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZS5vcmlnYAorICAgICogW1RIUklGVC00MzUyXSAtIFVidW50dSBBcnRmdWwgZG9lc24ndCBhcHBlYXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFRocmlmdCBhbmQgSGF4ZSAzLjQuMgorICAgICogW1RIUklGVC00NjY2XSAtIERMYW5nIENsaWVudCBQb29sIFRlc3QgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ2NzZdIC0gQ0wgdHV0b3JpYWwgYnVpbGQgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ0NTZdIC0gTWFrZSBoYXhlbGliIGRvd25sb2FkIHF1aWV0IHNvIGl0IGRvZXNuJ3QgYmxvdyB1cCB0aGUgYnVpbGQgbG9nCisgICAgKiBbVEhSSUZULTQ2MDVdIC0gYm9vdHN0cmFwLnNoIGZhaWxzIGlmIGF1dG9tYWtlPTEuMTYuMQorCisjIyBjX2dsaWIKKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorICAgICogW1RIUklGVC00NjIyXSAtIGdsaWJDIGNvbXBpbGF0aW9uIGlzc3VlCisgICAgKiBbVEhSSUZULTQ2NzFdIC0gYyBnbGliIGlzIHVuYWJsZSB0byBoYW5kbGUgY2xpZW50IGNsb3NlIHVuZXhwZWN0ZWRseQorCisjIyBjbCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC04Ml0gLSBDb21tb24gTGlzcCBzdXBwb3J0CisKKyMjIGNzaGFycAorICAgICogW1RIUklGVC00NTU4XSAtIHJlc2VydmVkIENzaGFycCBrZXl3b3JkcyBhcmUgbm90IGVzY2FwZWQgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC00NjM3XSAtIEMjIGFzeW5jIG1vZGUgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIHdpdGggaW5oZXJpdGVkIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTQ2NzJdIC0gSUFzeW5jUmVzdWx0IHN0eWxlIG1ldGhvZHMgbm90IGJlaW5nIHN1cHBvcnRlZCBieSBjZXJ0YWluIHRyYW5zcG9ydHMgbGVhZHMgdG8gaXNzdWVzIGluIG1peGVkIElTeW5jL0lBc3luYyB1c2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDUzOV0gLSBBbGxvdyBUQnVmZmVyZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBhcyBiYXNlIGNsYXNzCisgICAgKiBbVEhSSUZULTQ1MzVdIC0gWE1MIGRvY3M7IGNvZGUgY2xlYW51cCAodGFicy0+c3BhY2VzOyBTdHJpbmctPnN0cmluZykKKyAgICAqIFtUSFJJRlQtNDQ5Ml0gLSBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlIG1lbWJlciBvZiBUQXBwbGljYXRpb25FeGNlcHRpb24gY2Fubm90IGJlIGFjY2Vzc2VkCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisgICAgKiBbVEhSSUZULTQ0NTVdIC0gTWlzc2luZyBkaXNwb3NlIGNhbGxzIGluIFRocmVhZGVkU2VydmVyICYgVGhyZWFkcG9vbFNlcnZlcgorICAgICogW1RIUklGVC00NjA5XSAtIGtlZXAgSW5uZXJFeGNlcHRpb24gd2hlcmV2ZXIgYXBwcm9wcmlhdGUKKyAgICAqIFtUSFJJRlQtNDY3M10gLSBJQXN5bmNSZXN1bHQgbm90IHN1cHBvcnRlZCBieSBsYXllcmVkIHRyYW5zcG9ydHMgKGJ1ZmZlcmVkL2ZyYW1lZCkKKworIyMgY3BwCisgICAgKiBbVEhSSUZULTQ0NzZdIC0gVHlwZWNhc3RpbmcgcHJvYmxlbSBvbiBsaXN0IGl0ZW1zCisgICAgKiBbVEhSSUZULTQ0NjVdIC0gVE5vbmJsb2NraW5nU2VydmVyIHRocm93aW5nIFRIUklGVCBMT0dHRVI6IFRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6IFRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykKKyAgICAqIFtUSFJJRlQtNDY4MF0gLSBUQnVmZmVyVHJhbnNwb3J0cy5oIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgKiBbVEhSSUZULTQ2MThdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoIGJlY2F1c2Ugb2YgbGltaXRhdGlvbiBvZiBzZWxlY3QoKQorICAgICogW1RIUklGVC00NjIwXSAtIFRabGliVHJhbnNwb3J0LmNwcCBkb2Vzbid0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIHpsaWIgZmx1c2ggbWFya2VyIGluIHRoZSBidWZmZXIuCisgICAgKiBbVEhSSUZULTQ1NzFdIC0gWmVyb01RIGNvbnRyaWIgbGlicmFyeSBuZWVkcyBhIHJlZnJlc2gKKyAgICAqIFtUSFJJRlQtNDU1OV0gLSBUU1NMU2VydmVyU29ja2V0IGluY29ycmVjdGx5IHByaW50cyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDU3OF0gLSBNb3ZlIGBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcmAgaW50byBtYWluIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0MThdIC0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGlzIGRlcHJlY2F0ZWQ7IHVzZSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldworCisjIyBjb21waWxlcgorICAgICogW1RIUklGVC00NjQ0XSAtIENvbXBpbGVyIGNhbm5vdCBiZSBjb21waWxlZCBvbiBtYWNPUyhtYXliZSBhbHNvIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIGNsYW5nKQorICAgICogW1RIUklGVC00NTMxXSAtIFRocmlmdCBnZW5lcmF0ZXMgd3JvbmcgUHl0aG9uIGNvZGUgZm9yIGltbXV0YWJsZSBzdHJ1Y3R1cmVzIHdpdGggb3B0aW9uYWwgbWVtYmVycworICAgICogW1RIUklGVC00NTEzXSAtIHRocmlmdCBnZW5lcmF0ZWQgY29kZSBpcyBub3Qgc3RhYmxlIGZvciBjb25zdGFudHMKKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBBdm9pZCB1cGRhdGluZyBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUgaWYgdGhlIG91dHB1dCBoYXMgbm90IGNoYW5nZWQKKyAgICAqIFtUSFJJRlQtNDQwMF0gLSBWaXN1YWwgU3R1ZGlvIENvbXBpbGVyIHByb2plY3Qgc2hvdWxkIGxpbmsgcnVudGltZSBzdGF0aWNhbGx5IGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQzOTldIC0gcGx1Z2luLnRocmlmdCB0X2NvbnN0X3ZhbHVlIGlzIG5vdCB1c2VkIGFzIGEgdW5pb24gaW4gQysrIGNvZGUgLS0gZml4IHRoaXMKKyAgICAqIFtUSFJJRlQtNDQ5Nl0gLSBEZWFsaW5nIHdpdGggbGFuZ3VhZ2Uga2V5d29yZHMgaW4gVGhyaWZ0IChlLmcuIHNlcnZpY2UgbWV0aG9kIG5hbWVzKQorICAgICogW1RIUklGVC00MzkzXSAtIHJlcGVhdGVkIHJ1bnMgb2YgY29tcGlsZXIgcHJvZHVjZSBkaWZmZXJlbnQgYmluYXJ5IG91dHB1dCBhdCBwbHVnaW4gaW50ZXJmYWNlCisKKyMjIGRsYW5nCisgICAgKiBbVEhSSUZULTQ0NzhdIC0gVGhyaWZ0IHdpbGwgbm90IGJ1aWxkIHdpdGggZGxhbmcgMi4wNzggb3IgbGF0ZXIKKyAgICAqIFtUSFJJRlQtNDUwM10gLSBkbGFuZyBzZXJ2ZXJzIGxvZ0Vycm9yIG9uIG5vcm1hbCBjbGllbnQgZGlzY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKworIyMgZGFydAorICAgICogW1RIUklGVC00NjQ2XSAtIEVmZmVjdGl2ZSBEYXJ0IGFuZCBFeGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQ0MzldIC0gU2hvdWxkbid0IGRvd25sb2FkIGRhcnQuZGViIGRpcmVjdGx5LgorCisjIyBkZWxwaGkKKyAgICAqIFtUSFJJRlQtNDU2Ml0gLSBDYWxsaW5nIHdyb25nIGV4Y2VwdGlvbiBDVE9SIGxlYWRzIHRvICJjYWxsIGZhaWxlZDogdW5rbm93biByZXN1bHQiIGluc3RlYWQgb2YgdGhlIHJlYWwgZXhjZXB0aW9uIGJlaW5nIHRocm93bgorICAgICogW1RIUklGVC00NTU0XSAtIHVuY29tcGlsZWFibGUgY29kZSB3aXRoIG1lbWJlciBuYW1lcyB0aGF0IGFyZSBhbHNvIHR5cGVzIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDQyMl0gLSBBZGQgQXN5bmMgaW1wbGVtZW50YXRpb24gdmlhIElGdXR1cmUKKyAgICAqIFtUSFJJRlQtNDQ4NV0gLSBQb3NzaWJsZSBpbnZhbGlkIHB0ciBBViB3aXRoIG92ZXJsYXBwZWQgcmVhZC93cml0ZSBvbiBwaXBlcworICAgICogW1RIUklGVC00NTQ5XSAtIFRocmlmdCBleGNlcHRpb25zIHNob3VsZCBkZXJpdmUgZnJvbSBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQ1NDBdIC0gYnVmZmVyZWQgdHJhbnNwb3J0IGJyb2tlbiB3aGVuIHRyeWluZyB0byByZS1vcGVuIGEgZm9ybWVybHkgY2xvc2VkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDczXSAtIE1vdmUgVGhyaWZ0LkNvbnNvbGUucGFzIG91dCBvZiB0aGUgTGlicmFyeQorICAgICogW1RIUklGVC00NDkwXSAtIEFsbG93IGEgZGVmYXVsdCBzZXJ2aWNlIGFzIGZhbGxiYWNrIGZvciBtdWx0aXBsZXggcHJvY2Vzc29ycyBjb25uZWN0ZWQgYnkgb2xkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDQ1NF0gLSBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgKiBbVEhSSUZULTQ0NjFdIC0gQ29tcGlsZXIgZGlyZWN0aXZlIHNob3VsZCBtYXRjaCBEZWxwaGkgWEU0CisgICAgKiBbVEhSSUZULTQ0NjJdIC0gRmlyc3QgbGluZSBpbiBDb25zb2xlIGR1cGxpY2F0ZWQKKyAgICAqIFtUSFJJRlQtNDY0Ml0gLSBGUFUgY3RybCB3b3JkIHNldHRpbmdzIG1heSBjYXVzZSBhbiB1bmV4cGVjdGVkICJkZW5vcm1hbGl6ZWQiIGVycm9yCisgICAgKiBbVEhSSUZULTQ1ODldIC0gSFRUUCBjbGllbnQgdGltZW91dHMgYXJlIGEpIGluY29tcGxldGUgYW5kIGIpIG5vdCB1c2VkIGF0IGFsbAorICAgICogW1RIUklGVC00NTkwXSAtIHJ1bm5pbmcgdGhlIHRlc3QgY2xpZW50IHVzaW5nIEhUVFAgdHJhbnNwb3J0IGxlYWRzIHRvICJDb0luaXRpYWxpemUgbm90IGNhbGxlZCIKKworIyMgZXJsYW5nCisgICAgKiBbVEhSSUZULTQ0OTddIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIHVzZSBtYXAoKSBmb3IgbWFwIHR5cGUKKyAgICAqIFtUSFJJRlQtNDQ5NV0gLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgYWxsb3cgJ3VuZGVmaW5lZCcgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtNDU4MF0gLSBGaXggZXJsYW5nIHR1dG9yaWFsIHVucGFjayBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTQ1ODJdIC0gVWJ1bnR1IFhlbmlhbCBlcmxhbmcgMTguMyAibWFrZSBjaGVjayIgZmFpbHMKKworIyMgZ29sYW5nCisgICAgKiBbVEhSSUZULTQ0NDhdIC0gU3VwcG9ydCBmb3IgZ29sYW5nIDEuNiBhbmQgZWFybGllciBoYXMgYmVlbiBkcm9wcGVkLgorICAgICogW1RIUklGVC00MjUzXSAtIEdvIGdlbmVyYXRvciBhc3NpZ25zIHN0cmluZ3MgdG8gZmllbGQgaW4gY29uc3QgaW5zdGVhZCBvZiBwb2ludGVycy4KKyAgICAqIFtUSFJJRlQtNDU3M10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgQmluYXJ5CisgICAgKiBbVEhSSUZULTQ0NDddIC0gR29sYW5nOiBQYW5pYyBvbiBwLmMuQ2FsbCB3aGVuIHVzaW5nIGRlcHJlY2F0ZWQgaW5pdGlhbGl6ZXJzCisgICAgKiBbVEhSSUZULTQ2NTBdIC0gUmVxdWlyZWQgZmllbGQgaW5jb3JyZWN0bHkgbWFya2VkIGFzIHNldCB3aGVuIGZpZWxkVHlwZSBkb2VzIG5vdCBtYXRjaAorICAgICogW1RIUklGVC00NDg2XSAtIEdvbGFuZzogLXJlbW90ZS5nbyBjbGllbnQgY2xlYW51cAorICAgICogW1RIUklGVC00NTM3XSAtIFRTaW1wbGVTZXJ2ZXIgY2FuIGV4aXQgQWNjZXB0IGxvb3Agd2l0aCBsb2NrIHN0aWxsIGFjcXVpcmVkCisgICAgKiBbVEhSSUZULTQ1MTZdIC0gQWRkIHN1cHBvcnQgZm9yIGdvIDEuMTAKKyAgICAqIFtUSFJJRlQtNDQyMV0gLSBnb2xhbmcgdGVzdHMgcmVseSBvbiBnb21vY2ssIHdoaWNoIGhhcyBjaGFuZ2UgYmVoYXZpb3VyLCBjYXVzaW5nIHRlc3RzIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtNDYyNl0gLSBDb21tdW5pY2F0aW9uIGNyYXNoIHdoZW4gdXNpbmcgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgYW5kIHpsaWIgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ2NTldIC0gZ29sYW5nIHJhY2UgZGV0ZWN0ZWQgd2hlbiBjbG9zaW5nIGxpc3RlbmVyIHNvY2tldAorCisjIyBoYXNrZWxsCisgICAgKiBbVEhSSUZULTQ2MzRdIC0gSGFza2VsbCBidWlsZHMgd2l0aCBvbGRlciBjYWJhbCBjYW5ub3QgcmVjb25jaWxlIGNvbXBsZXggdmVyc2lvbiByZXF1aXJlbWVudHMKKworIyMgamF2YQorICAgICogW1RIUklGVC00MjU5XSAtIFRocmlmdCBkb2VzIG5vdCBjb21waWxlIGR1ZSB0byBBbnQgTWF2ZW4gdGFzayBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMTQxOF0gLSBDb21waWxpbmcgVGhyaWZ0IGZyb20gc291cmNlOiBDbGFzcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkICJ0eXBlZm91bmQiIGVsZW1lbnQKKyAgICAqIFtUSFJJRlQtNDUzMF0gLSBwcm9wb3NhbDogYWRkIG51bGxhYmlsaXR5IGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtNDYxNF0gLSBHZW5lcmF0ZSBtaXNzaW5nIEBOdWxsYWJsZSBhbm5vdGF0aW9ucyBmb3IgSmF2YSBpdGVyYXRvciBnZXR0ZXJzCisgICAgKiBbVEhSSUZULTQ1NTVdIC0gR2V0dGVyIG9mIGJpbmFyeSBmaWVsZCBpbiBKYXZhIGNyZWF0ZXMgdW5uZWNlc3NhcnkgY29weQorICAgICogW1RIUklGVC0zOTgzXSAtIGxpYnRocmlmdCBpcyBkZXBsb3llZCBvbiBjZW50cmFsIHdpdGggcG9tIHBhY2thZ2luZyBpbnN0ZWFkIG9mIGphcgorICAgICogW1RIUklGVC00Mjk0XSAtIEphdmEgQ29uZmlndXJlIEZhaWxzIGZvciBBbnQgPj0gMS4xMAorICAgICogW1RIUklGVC00MTc4XSAtIEphdmEgbGlicmFyaWVzIG1pc3NpbmcgZnJvbSBwYWNrYWdlIHdoZW4gdXNpbmcgY21ha2UKKyAgICAqIFtUSFJJRlQtNDEyMF0gLSBwb20gZmlsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgb3IgcHJvdmlkZWQgaW4gdGhlIGJ1aWxkCisgICAgKiBbVEhSSUZULTE1MDddIC0gTWF2ZW4gY2FuJ3QgZG93bmxvYWQgcmVzb3VyY2UgZnJvbSBjZW50cmFsIHdoZW4gYmVoaW5kIGEgcHJveHkgYW5kIHdvbid0IHVzZSBsb2NhbCByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTQ1NTZdIC0gT3B0aW9uYWwgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBqYXZhIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzM3XSAtIEFibGUgdG8gc2V0IGtleVN0b3JlIGFuZCB0cnVzdFN0b3JlIGFzIElucHV0U3RyZWFtIGluIHRoZSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycworICAgICogW1RIUklGVC00NTY2XSAtIFBhc3MgbWVzc2FnZSBvZiB1bmhhbmRsZWQgZXhjZXB0aW9uIHRvIG9wdGlvbmFsIHJldGhyb3cuCisgICAgKiBbVEhSSUZULTQ1MDZdIC0gUmVtb3ZlIGFzc2VydGlvbiBpbiBKYXZhIFNBU0wgY29kZSB0aGF0IHdvdWxkIGJlIGlnbm9yZWQgaW4gcmVsZWFzZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtNDQ3MF0gLSBJbmNsdWRlIHBvcHVsYXIgSURFIGZpbGUgdGVtcGxhdGVzIHRvIGdpdGlnbm9yZQorICAgICogW1RIUklGVC00NDI5XSAtIE1ha2UgVFRocmVhZFBvb2xTZXJ2ZXIuZXhlY3V0b3JTZXJ2aWNlXyBhdmFpbGFibGUgaW4gaW5oZXJpdGVkIGNsYXNzZXMgYW5kIHJlZmFjdG9yIG1ldGhvZHMgdG8gYmUgYWJsZSBjdXN0b21pemF0aW9uCisgICAgKiBbVEhSSUZULTM3NjldIC0gRml4IGxvZ2ljIG9mIFRIUklGVC0yMjY4CisgICAgKiBbVEhSSUZULTQ0OTRdIC0gSW5jcmVhc2UgSmF2YSBTb2NrZXQgQnVmZmVyIFNpemUKKyAgICAqIFtUSFJJRlQtNDQ5OV0gLSBSZW1vdmUgTWFnaWMgTnVtYmVyIEluIFRGSWxlVHJhbnNwb3J0CisKKyMjIGpzCisgICAgKiBbVEhSSUZULTQ0MDZdIC0gSmF2YVNjcmlwdDogVXNlIG1vZGVybiBQcm9taXNlIGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC00NjI1XSAtIGxldCAvIGNvbnN0IHZhcmlhYmxlIGRlY29yYXRvcnMgZm9yIGVzNiBjb21waWxlcgorICAgICogW1RIUklGVC00NjUzXSAtIEVTNiBDbGFzc2VzCisgICAgKiBbVEhSSUZULTQ1OTJdIC0gSlM6IHJlYWRJMzIgcGVyZm9ybWFuY2Ugb24gbGFyZ2UgYXJyYXlzIGlzIHZlcnkgcG9vciBpbiBDaHJvbWUKKyAgICAqIFtUSFJJRlQtNDUwOV0gLSBqcyBhbmQgbm9kZWpzIGxpYnJhcmllcyBuZWVkIHRvIGJlIHJlZnJlc2hlZCB3aXRoIGN1cnJlbnQgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTQ0MDNdIC0gdGhyaWZ0LmpzOiBJbmNvcnJlY3QgdXNhZ2Ugb2YgJ3RoaXMnIGluIFRXZWJTb2NrZXRUcmFuc3BvcnQuX19vbk9wZW4KKyAgICAqIFtUSFJJRlQtNDQzNl0gLSBEZXNlcmlhbGl6YXRpb24gb2YgbmVzdGVkIGxpc3QgZGlzY2FyZHMgY29udGVudAorICAgICogW1RIUklGVC00NDM3XSAtIEpTIFdlYlNvY2tldCBjbGllbnQgY2FsbGJhY2tzIGludm9rZWQgdHdpY2Ugb24gcGFyYWxsZWwgcmVxdWVzdHMKKyAgICAqIFtUSFJJRlQtNDY3OV0gLSBEdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIGluIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCisgICAgKiBbVEhSSUZULTQ1NTFdIC0gQWRkIHByZXR0aWVyIGZvciBjb25zaXN0ZW50IEpTIGNvZGUgZm9ybWF0dGluZworCisjIyBsdWEKKyAgICAqIFtUSFJJRlQtNDU5MV0gLSBsdWEgY2xpZW50IHVzZXMgdHdvIHdyaXRlKCkgY2FsbHMgcGVyIGZyYW1lZCBtZXNzYWdlIHNlbmQKKyAgICAqIFtUSFJJRlQtMzg2M10gLSBDYW4ndCAibWFrZSBpbnN0YWxsIiBMdWEgTGlicmFyeQorCisjIyBuZXRjb3JlCisgICAgKiBbVEhSSUZULTQ1MjRdIC0gLk5FVCBDb3JlIFNlcnZlciBkb2Vzbid0IGNsb3NlIHByb3Blcmx5IHdoZW4gY2FuY2VsbGVkCisgICAgKiBbVEhSSUZULTQ0MzRdIC0gVXBkYXRlIC5ORVQgQ29yZSBjb21wb25lbnRzLCBhZGQgdGVzdHMgZm9yIC5OZXQgQ29yZSBsaWJyYXJ5IGFuZCAuTmV0IENvcmUgY29tcGlsZXIsIGZpeCBidWdzIGFuZCBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisKKyMjIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDIyNV0gLSBFcnJvciBoYW5kbGluZyBtYWxmb3JtZWQgYXJndW1lbnRzIGxlYWtzIG1lbW9yeSwgY29ycnVwdHMgdHJhbnNwb3J0IGJ1ZmZlcnMgY2F1c2luZyBuZXh0IFJQQyB0byBmYWlsCisgICAgKiBbVEhSSUZULTM5NTBdIC0gTWVtb3J5IGxlYWsgd2hpbGUgY2FsbGluZyBvbmV3YXkgbWV0aG9kCisgICAgKiBbVEhSSUZULTMxNDNdIC0gYWRkIHR5cGVzY3JpcHQgZGlyZWN0b3J5IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtNDU2NF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgY2FuIGxlYXZlIGNvcnJ1cHQgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTQ2NDddIC0gTm9kZS5qcyBGaWxlc2VydmVyIHdlYnJvb3QgcGF0aAorICAgICogW1RIUklGVC00NDg5XSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IGZvciBOb2RlSlMgY2xpZW50CisgICAgKiBbVEhSSUZULTQ0NDNdIC0gbm9kZS5qcyBqc29uX3Byb3RvY29sIHRocm93cyBlcnJvciBpbiBza2lwIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQ2MDRdIC0gTm9kZUpTOiBFeHBvc2UgSW50NjQgZnJvbSBicm93c2VyLmpzIGZvciBjb25zdW1wdGlvbiBieSBicm93c2VyCisgICAgKiBbVEhSSUZULTQ0ODBdIC0gTm9kZUpTIHdhcm5pbmcgb24gYmluYXJ5X3Byb3RvY29sIHdyaXRlTWVzc2FnZUVuZCB3aGVuIHNlcWlkID0gMAorCisjIyBwZXJsCisgICAgKiBbVEhSSUZULTQzODJdIC0gUmVwbGFjZSB0aGUgdXNlIG9mIFBlcmwgSW5kaXJlY3QgT2JqZWN0IFN5bnRheCBjYWxscyB0byBuZXcoKQorICAgICogW1RIUklGVC00NDcxXSAtIFRocmlmdCBDUEFOIHJlbGVhc2UgaXMgbWlzc2luZyBNYWtlZmlsZS5QTCBhbmQgdGhlIGNsaWVudHMgYXJlIHVuYWJsZSB0byBidWlsZCB0aGUgbW9kdWxlCisgICAgKiBbVEhSSUZULTQ0MTZdIC0gUGVybCBDUEFOIFBhY2thZ2luZyBJbXByb3ZlbWVudHMKKworIyMgcGhwCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIGdlbmVyYXRvciB1c2UgUFNSLTQgZGVmYXVsdAorICAgICogW1RIUklGVC00NDYzXSAtIFBIUCBnZW5lcmF0ZWQgY29kZSBtYXRjaCBQU1ItMgorICAgICogW1RIUklGVC00MzczXSAtIEV4dGVuZGluZyBUaHJpZnQgY2xhc3MgcmVzdWx0cyBpbiAiQXR0ZW1wdCBzZXJpYWxpemUgZnJvbSBub24tVGhyaWZ0IG9iamVjdCIKKyAgICAqIFtUSFJJRlQtNDM1NF0gLSBUU29ja2V0IGJsb2NrIG9uIHJlYWQKKyAgICAqIFtUSFJJRlQtNDQyM10gLSBtaWdyYXRlIHBocCBsaWJyYXJ5IHRvIHBzci00CisgICAgKiBbVEhSSUZULTQ2NTZdIC0gaW5maW5pdGUgbG9vcCBpbiBsYXRlc3QgUEhQIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ3N10gLSBUQnVmZmVyZWRUcmFuc3BvcnQgbXVzdCBoYXZlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ0NzVdIC0gbGliL3BocC90ZXN0IHNob3VsZCBiZSBjaGVja2VkIGZvciBQU1ItMgorICAgICogW1RIUklGVC00NDk4XSAtIGFkZCBwaHBjcyBiYWNrCisgICAgKiBbVEhSSUZULTQ0NjBdIC0gcGhwIGxpYnJhcnkgdXNlIFBTUi0yCisgICAgKiBbVEhSSUZULTQ2NDFdIC0gVEN1cmxDbGllbnQgZG9lc24ndCBjaGVjayBmb3IgSFRUUCBzdGF0dXMgY29kZQorICAgICogW1RIUklGVC00NjQ1XSAtIFRDdXJsQ2xpZW50OiBzaG93IGFjdHVhbCBlcnJvciBtZXNzYWdlIHdoZW4gdGhyb3dpbmcgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00Njc0XSAtIEFkZCBzdHJlYW0gY29udGV4dCBzdXBwb3J0IGludG8gUEhQL1RIdHRwQ2xpZW50CisgICAgKiBbVEhSSUZULTQ0NTldIC0gcmVkdWNlIHBocCBsaWJyYXJ5IGRpcmVjdG9yeSBkZXB0aAorCisjIyBweXRob24KKyAgICAqIFtUSFJJRlQtNDY3MF0gLSBUd2lzdGVkLCBzbG90cywgYW5kIHZvaWQgbWV0aG9kIGZhaWxzIHdpdGggIm9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdWNjZXNzJyIKKyAgICAqIFtUSFJJRlQtNDQ2NF0gLSBQb3RlbnRpYWxseSBzZXJ2ZXItY3Jhc2hpbmcgdHlwbyBpbiBQeXRob24gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTQ1NDhdIC0gU3VwcG9ydGluZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBwcm90b2NvbCB3aGVuIHVzaW5nIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbiBQeXRob24KKyAgICAqIFtUSFJJRlQtNDU3N10gLSBPdXRkYXRlZCBjaXBoZXIgc3RyaW5nIGluIHB5dGhvbiB1bml0IHRlc3QKKyAgICAqIFtUSFJJRlQtNDUwNV0gLSBweXRob24gYnVpbGQgb24gVmFncmFudCBXaW5kb3dzIGJveGVzIGZhaWxzCisgICAgKiBbVEhSSUZULTQ2MjFdIC0gVEhlYWRlciBmb3IgUHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NjhdIC0gbWFrZSBzb2NrZXQgYmFja2xvZyBjb25maWd1cmFibGUgZm9yIHB5dGhvbgorICAgICogW1RIUklGVC00NTYxXSAtIFB5dGhvbjogY2xlYW51cCBzb2NrZXQgdGltZW91dCBzZXR0aW5ncworCisjIyBydWJ5CisgICAgKiBbVEhSSUZULTQyODldIC0gVGhyaWZ0IFJTcGVjIHRlc3Qgc3VpdGUgZmFpbHMgd2l0aCBSdWJ5IDIuNC54IGR1ZSB0byBGaXhudW0gZGVwcmVjYXRpb24KKyAgICAqIFtUSFJJRlQtNDM0Ml0gLSBTdXBwb3J0IHJ1YnkgcnNwZWMgMworICAgICogW1RIUklGVC00NTI1XSAtIEFkZCBzc2wgc29ja2V0IG9wdGlvbiB0byBydWJ5IGNyb3NzIHRlc3RzCisgICAgKiBbVEhSSUZULTQ0NTBdIC0gQWRkIHNlZWsgc3VwcG9ydCB0byBUQ29tcGFjdElucHV0UHJvdG9jb2wgaW4gUnVzdAorICAgICogW1RIUklGVC00NjMxXSAtIENvZGVnZW4gQ3JlYXRlcyBJbnZhbGlkIFJ1YnkgZm9yIFJlY3Vyc2l2ZSBTdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQ0NzJdIC0gRml4IHRoZSBnZW5zcGVjIGZvciBydWJ5IHNvIGl0IGRvZXMgbm90IGNvbXBsYWluIGFib3V0IGFuIGludmFsaWQgbGljZW5zZQorCisjIyBydXN0CisgICAgKiBbVEhSSUZULTQ2NjJdIC0gUnVzdCBjb25zdCBzdHJpbmcgY2FsbHMgZnVuY3Rpb24gYXQgY29tcGlsZSB0aW1lCisgICAgKiBbVEhSSUZULTQ2NjFdIC0gUnVzdCBlbnVtIG5hbWUgd3JvbmcgY2FzZSBpbiBnZW5lcmF0ZWQgc3RydWN0cworICAgICogW1RIUklGVC00NjE3XSAtIEF2b2lkIGdlbmVyYXRpbmcgY29uZmxpY3Rpbmcgc3RydWN0IG5hbWVzIGluIFJ1c3QgY29kZQorICAgICogW1RIUklGVC00NTI5XSAtIFJ1c3QgZ2VuZXJhdGlvbiBzaG91bGQgaW5jbHVkZSAjIVthbGxvdyhub25fc25ha2VfY2FzZSldIG9yIGZvcmNlIGNvbmZvcm0gdG8gUnVzdCBzdHlsZSBndWlkZWxpbmVzCisgICAgKiBbVEhSSUZULTQzOTBdIC0gUnVzdCBiaW5hcnkgcHJvdG9jb2wgYW5kIGJ1ZmZlcmVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ0MTldIC0gUnVzdCBmcmFtZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKyAgICAqIFtUSFJJRlQtNDY1OF0gLSBSdXN0J3MgVEJpbmFyeUlucHV0UHJvdG9jb2wgZmFpbHMgd2hlbiBzdHJpY3QgaXMgZmFsc2UKKyAgICAqIFtUSFJJRlQtNDE4N10gLSBEYXJ0IC0+IFJ1c3QgRnJhbWVkIGNyb3NzIHRlc3RzIGZhaWwKKyAgICAqIFtUSFJJRlQtNDY2NF0gLSBSdXN0IGNhbm5vdCBjcmVhdGUgUmVhZEhhbGYvV3JpdGVIYWxmIHRvIGltcGxlbWVudCBjdXN0b20gdHJhbnBvcnRzCisgICAgKiBbVEhSSUZULTQ2NjVdIC0gS2VlcCBSdXN0IGxpYnJhcnkgdXAtdG8tZGF0ZSBvbiBjcmF0ZXMuaW8KKworIyMgc3dpZnQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzc3M10gLSBTd2lmdCBMaWJyYXJ5CisKKyMjIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtNDUxNV0gLSBHcmFjZWZ1bGx5IHNodXRkb3duIGNyb3NzLXRlc3Qgc2VydmVycyB0byBmdWxseSB0ZXN0IHRlYXJkb3duCisgICAgKiBbVEhSSUZULTQwODVdIC0gQWRkIC5ORVQgQ29yZSB0byB0aGUgbWFrZSBjcm9zcyBzdGFuZGFyZCB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQzNThdIC0gQWRkIHVuaXggZG9tYWluIHNvY2tldHMgaW4gcnVieSB0byBjcm9zcyB0ZXN0IC0gY29kZSBleGlzdHMKKworIyMgdHlwZXNjcmlwdCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMS4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMjczM10gLSBFcmxhbmcgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0yNzQwXSAtIFBlcmwgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0zNjEwXSAtIFN0cmVhbWxpbmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiBzZXJ2ZXIgaGFuZGxlcgorICAgICogW1RIUklGVC0zNjg2XSAtIEphdmEgcHJvY2Vzc29yIHNob3VsZCByZXBvcnQgaW50ZXJuYWwgZXJyb3Igb24gdW5jYXVnaHQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNDldIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBIG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDUzXSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDEzNl0gLSBBbGlnbiBpc19iaW5hcnkoKSBtZXRob2Qgd2l0aCBpc19zdHJpbmcoKSB0byBzaW1wbGlmeSB0aG9zZSBjaGVja3MKKyAgICAqIFtUSFJJRlQtNDEzN10gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMgaW4gVGhyaWZ0IENvbXBpbGVyCisgICAgKiBbVEhSSUZULTQxMzhdIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQyOTZdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBweXRob24gbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OF0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIGdvIDEuNiBsYW5ndWFnZQorICAgICogW1RIUklGVC00Mjk5XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC00MzAwXSAtIEZpeCBtYWtlIGNyb3NzIGluIFVidW50dSBYZW5pYWwgZG9ja2VyIGVudmlyb25tZW50LCBvbmNlIGFsbCBsYW5ndWFnZSBzdXBwb3J0IGlzc3VlcyBhcmUgZml4ZWQKKyAgICAqIFtUSFJJRlQtNDMwMl0gLSBGaXggVWJ1bnR1IFhlbmlhbCBtYWtlIGNyb3NzIHRlc3RpbmcgZm9yIGx1YSBhbmQgcGhwNworICAgICogW1RIUklGVC00Mzk4XSAtIFVwZGF0ZSBFWFRSQV9ESVNUIGZvciAibWFrZSBkaXN0IgorCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMzgxXSAtIEZhaWwgZmFzdCBpZiBjb25maWd1cmUgZGV0ZWN0cyBDKysgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTY3N10gLSBNaW5HVyBzdXBwb3J0IGJyb2tlbgorICAgICogW1RIUklGVC0xODA1XSAtIFRocmlmdCBzaG91bGQgbm90IHN3YWxsb3cgQUxMIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCisgICAgKiBbVEhSSUZULTI2NDJdIC0gUmVjdXJzaXZlIHN0cnVjdHMgZG9uJ3Qgd29yayBpbiBweXRob24KKyAgICAqIFtUSFJJRlQtMjg4OV0gLSBzdGFibGUgcmVsZWFzZSAwLjkuMiwgZXJsYW5nIHR1dG9yaWFsIGJyb2tlbgorICAgICogW1RIUklGVC0yOTEzXSAtIFJ1YnkgU2VydmVyIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkCisgICAgKiBbVEhSSUZULTI5OThdIC0gTm9kZS5qczogTWlzc2luZyBoZWFkZXIgZnJvbSBodHRwIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzAwMF0gLSAuTkVUIGltcGxlbWVudGF0aW9uIGhhcyB0cm91YmxlIHdpdGggbWl4ZWQgSVAgbW9kZXMKKyAgICAqIFtUSFJJRlQtMzI4MV0gLSBUcmF2aXMgQ0kgYnVpbGQgcGFzc2VkIGJ1dCB0aGUgbG9nIHNheXMgQlVJTEQgRkFJTEVECisgICAgKiBbVEhSSUZULTMzNThdIC0gTWFrZWZpbGU6MTM2MjogKioqIG1pc3Npbmcgc2VwYXJhdG9yLiBTdG9wLgorICAgICogW1RIUklGVC0zNjAwXSAtIE1ha2UgVFR3aXN0ZWQgc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjAyXSAtIE1ha2UgVG9ybmFkbyBzZXJ2ZXIgc2VuZCBleGNlcHRpb24gb24gdW5leHBlY3RlZCBoYW5kbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM2NTddIC0gRCBURmlsZVdyaXRlclRyYW5zcG9ydCBjbG9zZSBzaG91bGQgdXNlIG5vbi1wcmlvcml0eSBzZW5kCisgICAgKiBbVEhSSUZULTM3MDBdIC0gR28gTWFwIGhhcyB3cm9uZyBkZWZhdWx0IHZhbHVlIHdoZW4gb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzcwM10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgTWFwL1NldC9MaXN0IEZpZWxkcworICAgICogW1RIUklGVC0zNzMwXSAtIHNlcnZlciBsb2cgZXJyb3IgdHdpY2UKKyAgICAqIFtUSFJJRlQtMzc3OF0gLSBnbyBjbGllbnQgY2FuIG5vdCBwYXNzIG1ldGhvZCBwYXJhbWV0ZXIgdG8gc2VydmVyIG9mIG90aGVyIGxhbmd1YWdlIGlmIG5vIGZpZWxkX2lkIGlzIGdpdmVuCisgICAgKiBbVEhSSUZULTM3ODRdIC0gdGhyaWZ0LW1hdmVuLXBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBJREwgaW4gZGVwZW5kZW5jeSBKQVJzCisgICAgKiBbVEhSSUZULTM4MDFdIC0gTm9kZSBUaHJpZnQgY2xpZW50IHRocm93cyBleGNlcHRpb24gd2l0aCBtdWx0aXBsZXhlciBhbmQgcmVzcG9uc2VzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIGEgc2luZ2xlIGJ1ZmZlcgorICAgICogW1RIUklGVC0zODIxXSAtIFRNZW1vcnlCdWZmZXIgYnVmZmVyIG1heSBvdmVyZmxvdyB3aGVuIHJlc2l6aW5nCisgICAgKiBbVEhSSUZULTM4MzJdIC0gVGhyaWZ0IHZlcnNpb24gMC45LjMgZXhhbXBsZSBvbiBXaW5kb3dzLCBWaXN1YWwgU3R1ZGlvLCBsaW5raW5nIGVycm9ycyBkdXJpbmcgY29tcGlsaW5nCisgICAgKiBbVEhSSUZULTM4NDddIC0gdGhyaWZ0L2NvbmZpZy5oIGluY2x1ZGVzIGEgI2RlZmluZSBmb3IgVkVSU0lPTiB3aGljaCB3aWxsIGxpa2VseSBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHVzZXIgZW52aXJvbm1lbnQgb3IgY29kZQorICAgICogW1RIUklGVC0zODczXSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0zODkxXSAtIFROb25ibG9ja2luZ1NlcnZlciBjb25maWd1cmVkIHdpdGggbW9yZSB0aGFuIG9uZSBJTyB0aHJlYWRzIGRvZXMgbm90IGFsd2F5cyByZXR1cm4gZnJvbSBzZXJ2ZSgpIHVwb24gc3RvcCgpCisgICAgKiBbVEhSSUZULTM4OTJdIC0gVGhyaWZ0IHVzZXMgVExTIFNOSSBleHRlbnNpb24gcHJvdmlkZWQgYnkgT3BlblNTTCBsaWJyYXJ5LiBPbGRlciB2ZXJzaW9uIG9mIE9wZW5TU0woPCAwLjkuOGYpIG1heSBjcmVhdGUgcHJvYmxlbSBiZWNhdXNlIHRoZXkgZG8gbm90IHN1cHBvcnQgJ1NTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpJy4KKyAgICAqIFtUSFJJRlQtMzg5NV0gLSBCdWlsZCBmYWlscyB1c2luZyBKYXZhIDEuOCB3aXRoIEFudCA8IDEuOQorICAgICogW1RIUklGVC0zODk2XSAtIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhIHdpdGggbnVtYmVyIHN0cmluZyBrZXkgY2Fubm90IGFjY2VzcyB0aGF0IGRlc2VyaWFsaXplZCBieSBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM5MzhdIC0gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlciBkb2VzIG5vdCB3b3JrIHdpdGggU1NMCisgICAgKiBbVEhSSUZULTM5NDRdIC0gVFNTTFNvY2tldCBoYXMgZGVhZCBjb2RlIGluIGNoZWNrSGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTM5NDZdIC0gSmF2YSAxLjUgY29tcGF0aWJpbGl0eSBicm9rZW4gZm9yIGJpbmFyeSBmaWVsZHMgKGphdmE1IG9wdGlvbikKKyAgICAqIFtUSFJJRlQtMzk2MF0gLSBJbmhlcml0ZWQgc2VydmljZXMgaW4gTHVhIGdlbmVyYXRvciBhcmUgbm90IG5hbWVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zOTYyXSAtIEFudCBidWlsZC54bWwgYnJva2VuIG9uIFdpbmRvd3MgZm9yIEphdmEgbGlicmFyeQorICAgICogW1RIUklGVC0zOTYzXSAtIFRocmlmdC5jYWJhbCBmaWxlbmFtZSBkb2VzIG5vdCBtYXRjaCBtb2R1bGUgbmFtZQorICAgICogW1RIUklGVC0zOTY3XSAtIGdvYmplY3QvZ3BhcmFtLmg6MTY2OjMzOiB3YXJuaW5nOiBlbnVtZXJhdG9yIHZhbHVlIGZvciDigJhHX1BBUkFNX0RFUFJFQ0FURUTigJkgaXMgbm90IGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbgorICAgICogW1RIUklGVC0zOTY4XSAtIERlc2VyaWFsaXppbmcgZW1wdHkgc3RyaW5nL2JpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzk3NF0gLSBVc2luZyBjbGFuZy0zLjggYW5kIFRocmVhZFNhbml0aXplciBvbiB0aGUgY29uY3VycmVuY3lfdGVzdCBjbGFpbXMgYmFkIFBUaHJlYWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMzk4NF0gLSBQSFA3IGV4dGVuc2lvbiBjYXVzZXMgc2VnZmF1bHQKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC00MDA5XSAtIFVzZSBAaW1wbGVtZW50ZXIgaW5zdGVhZCBvZiBpbXBsZW1lbnRzIGluIFRUd2lzdGVkLnB5CisgICAgKiBbVEhSSUZULTQwMTBdIC0gUS5mY2FsbCBtZXNzaW5nIHVwIHdpdGggKnRoaXMqIHBvaW50ZXIgaW5zaWRlIGNhbGxlZCBmdW5jdGlvbgorICAgICogW1RIUklGVC00MDExXSAtIFNldHMgb2YgVGhyaWZ0IHN0cnVjdHMgZ2VuZXJhdGUgR28gY29kZSB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTgorICAgICogW1RIUklGVC00MDEyXSAtIFB5dGhvbiBUd2lzdGVkIGltcGxlbWVudGF0aW9uIHVzZXMgaW1wbGVtZW50cywgbm90IGNvbXBhdGlibGUgd2l0aCBQeTMKKyAgICAqIFtUSFJJRlQtNDAxNF0gLSBhbGlnbiBDIyBtZXRhIGRhdGEgaW4gQXNzZW1ibHlJbmZvLmNzCisgICAgKiBbVEhSSUZULTQwMTVdIC0gRml4IHdyb25nbHkgc3BlbGxlZCAiVGhpcmZ0InMKKyAgICAqIFtUSFJJRlQtNDAxNl0gLSB0ZXN0SW5zYW5pdHkoKSBpbXBsIGRvZXMgbm90IGNvbmZvcm0gdG8gdGVzdCBzcGVjIGluIFRocmlmdFRlc3QudGhyaWZ0CisgICAgKiBbVEhSSUZULTQwMjNdIC0gU2tpcCB1bmV4cGVjdGVkIGZpZWxkIHR5cGVzIG9uIHJlYWQvd3JpdGUKKyAgICAqIFtUSFJJRlQtNDAyNF0gLSBTa2lwKCkgc2hvdWxkIHRocm93IG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDI2XSAtIFRTU0xTb2NrZXQgZG9lc24ndCB3b3JrIHdpdGggUHl0aG9uIDwgMi43LjkKKyAgICAqIFtUSFJJRlQtNDAyOV0gLSBBY2NlbGVyYXRlZCBwcm90b2NvbHMgZG8gbm90IGJ1aWxkIGZyb20gdGhyaWZ0LXB5IDAuMTAuMCBvbiBQeVBJCisgICAgKiBbVEhSSUZULTQwMzFdIC0gR28gcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIGxpc3RzIG9mIHR5cGVkZWYnZWQgYnVpbHQtaW4gdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAzM10gLSBEZWZhdWx0IGJ1aWxkIFdJVEhfUExVR0lOPU9OIGZvciBhbGwgYnVpbGRzIHJlc3VsdHMgaW4gcGFja2FnaW5nIGVycm9ycworICAgICogW1RIUklGVC00MDM0XSAtIENNYWtlIGRvZXNuJ3Qgd29yayB0byBidWlsZCBjb21waWxlciBvbiBNYWNPUworICAgICogW1RIUklGVC00MDM2XSAtIEFkZCAuTkVUIENvcmUgZW52aXJvbm1lbnQvYnVpbGQgc3VwcG9ydCB0byB0aGUgZG9ja2VyIGltYWdlCisgICAgKiBbVEhSSUZULTQwMzhdIC0gc29ja2V0IGNoZWNrOiBjaGVja2luZyBhbiB1bnNpZ25lZCBudW1iZXIgYWdhaW5zdCA+PSAwIG5ldmVyIGZhaWxzCisgICAgKiBbVEhSSUZULTQwNDJdIC0gRXh0cmFjdGlvbkVycm9yIHdoZW4gdXNpbmcgYWNjZWxlcmF0ZWQgdGhyaWZ0IGluIGEgbXVsdGlwcm9jZXNzIHRlc3QKKyAgICAqIFtUSFJJRlQtNDA0M10gLSB0aHJpZnQgcGVybCBkZWJpYW4gcGFja2FnZSBpcyBwbGFjaW5nIGZpbGVzIGluIHRoZSB3cm9uZyBwbGFjZQorICAgICogW1RIUklGVC00MDQ0XSAtIEJ1aWxkIGpvYiAxNyBmYWlsaW5nIG9uIGV2ZXJ5IHB1bGwgcmVxdWVzdDsgaHNwZWMgY29yZSAoaGFza2VsbCkgMi40IGlzc3VlCisgICAgKiBbVEhSSUZULTQwNDZdIC0gTWluR1cgd2l0aCBnY2MgNi4yIGRvZXMgbm90IGNvbXBpbGUgb24gV2luZG93cworICAgICogW1RIUklGVC00MDYwXSAtIFRocmlmdCBwcmludFRvIG9zdHJlYW0gb3ZlcmxvYWQgbWVjaGFuaXNtIGJyZWFrcyBkb3duIHdoZW4gdHlwZXMgYXJlIG5lc3RlZAorICAgICogW1RIUklGVC00MDYyXSAtIFJlbW92ZSBkZWJ1ZyBwcmludCBmcm9tIFRTZXJ2aWNlQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNjVdIC0gRG9jdW1lbnQgUGVybCBGb3JraW5nU2VydmVyIHNpZ25hbCByZXN0cmljdGlvbiBpbXBvc2VkIGJ5IFRIUklGVC0zODQ4IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgY29kZQorICAgICogW1RIUklGVC00MDY4XSAtIEEgY29kZSBjb21tZW50IGluIEphdmEgU2VydmVyU29ja2V0IGlzIHdyb25nIGFyb3VuZCBhY2NlcHQoKQorICAgICogW1RIUklGVC00MDczXSAtIGVudW0gZmlsZXMgYXJlIHN0aWxsIGJlaW5nIGdlbmVyYXRlZCB3aXRoIHVudXNlZCBpbXBvcnRzCisgICAgKiBbVEhSSUZULTQwNzZdIC0gQXBwdmV5b3IgYnVpbGRzIGZhaWxpbmcgYmVjYXVzZSBhbnQgMS45Ljggd2FzIHJlbW92ZWQgZnJvbSBhcGFjaGUgc2VydmVycworICAgICogW1RIUklGVC00MDc3XSAtIEFJX0FERFJDT05GSUcgcmVkZWZpbmVkIGFmdGVyIHJlY2VudCBjaGFuZ2UgdG8gUGxhdGZvcm1Tb2NrZXQgaGVhZGVyCisgICAgKiBbVEhSSUZULTQwNzldIC0gR2VuZXJhdGVkIHBlcmwgY29kZSB0aGF0IHJldHVybnMgc3RydWN0dXJlcyBmcm9tIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBpcyBtaXNzaW5nIGEgbmVjZXNzYXJ5IHVzZSBjbGF1c2UKKyAgICAqIFtUSFJJRlQtNDA4N10gLSBTcHVyaW91cyBleGNlcHRpb24gZGVzdHJveWluZyBUVGhyZWFkZWRTZXJ2ZXIgYmVjYXVzZSBvZiBpbmNvcnJlY3Qgam9pbigpIGNhbGwKKyAgICAqIFtUSFJJRlQtNDEwMl0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgcGVyZm9ybWFuY2UgaXNzdWUgc2luY2UgMC4xMC4wCisgICAgKiBbVEhSSUZULTQxMDZdIC0gY29uY3VycmVuY3lfdGVzdCBmYWlscyByYW5kb21seQorICAgICogW1RIUklGVC00MTA4XSAtIGNfZ2xpYiB0aHJpZnQgc3NsIGhhcyBtdWx0aXBsZSBidWdzIGFuZCBkZXByZWNhdGVkIGZ1bmN0aW9ucworICAgICogW1RIUklGVC00MTA5XSAtIENvbmZpZ3VyZSBTY3JpcHQgdXNlcyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtNDEyOV0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGZkIGxlYWsgd2hlbiBmYWlsaW5nIHRvIGRpc3BhdGNoIG5ldyBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTMxXSAtIEphdmFzY3JpcHQgd2l0aCBXZWJTb2NrZXQgaGFuZGxlcyBvbmV3YXkgbWV0aG9kcyB3cm9uZworICAgICogW1RIUklGVC00MTM0XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cworICAgICogW1RIUklGVC00MTQwXSAtIFVzZSBvZiBub24tdGhyZWFkLXNhZmUgZnVuY3Rpb24gZ210aW1lKCkKKyAgICAqIFtUSFJJRlQtNDE0MV0gLSBJbnN0YWxsYXRpb24gb2YgaGF4ZSBpbiBkb2NrZXIgZmlsZXMgcmVmZXJzIHRvIGEgcmVkaXJlY3QgbGluayBhbmQgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDE0N10gLSBSdXN0OiBwcm90b2NvbCBzaG91bGQgYWNjZXB0IHRyYW5zcG9ydHMgd2l0aCBub24tc3RhdGljIGxpZmV0aW1lCisgICAgKiBbVEhSSUZULTQxNDhdIC0gW21hdmVuLXRocmlmdC1wbHVnaW5dIGNvbXBpbGUgZXJyb3Igd2hpbGUgaW1wb3J0IGEgdGhyaWZ0IGluIGRlcGVuZGVuY3kgamFyIGZpbGUuCisgICAgKiBbVEhSSUZULTQxNDldIC0gU3lzdGVtLm91dCBwb2xsdXRlcyBsb2cgZmlsZXMgCisgICAgKiBbVEhSSUZULTQxNTRdIC0gUEhQIGNsb3NlKCkgb2YgYSBUU29ja2V0IG5lZWRzIHRvIGNsb3NlIGFueSB0eXBlIG9mIHNvY2tldAorICAgICogW1RIUklGVC00MTU4XSAtIG1pbm9yIGlzc3VlIGluIFJFQURNRS1NU1lTMi5tZAorICAgICogW1RIUklGVC00MTU5XSAtIEJ1aWxkaW5nIHRlc3RzIGZhaWxzIG9uIE1TWVMyIChNaW5HVzY0KSBkdWUgdG8gYSAoc21hbGw/KSBsaW5rZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtNDE2MF0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIGZpeCB1c2Ugb2YgY2xvc2VkL2ZyZWVkIGNvbm5lY3Rpb25zCisgICAgKiBbVEhSSUZULTQxNjFdIC0gVE5vbkJsb2NraW5nIHNlcnZlciB1c2luZyB1bmluaXRpYWxpemVkIGV2ZW50IGluIGVycm9yIHBhdGhzCisgICAgKiBbVEhSSUZULTQxNjJdIC0gVE5vbkJsb2NraW5nIGhhbmRsaW5nIG9mIFRTb2NrZXRzIGluIGVycm9yIHN0YXRlIGlzIGluY29ycmVjdCBhZnRlciBmZCBpcyBjbG9zZWQKKyAgICAqIFtUSFJJRlQtNDE2NF0gLSBDb3JlIGluIFRTU0xTb2NrZXQgY2xlYW51cE9wZW5TU0wgd2hlbiBkZXN0cm95aW5nIGEgbXV0ZXggdXNlZCBieSBvcGVuc3NsCisgICAgKiBbVEhSSUZULTQxNjVdIC0gQysrIGJ1aWxkIGhhcyBtYW55IHdhcm5pbmdzIHVuZGVyIGMrKzAzIGR1ZSB0byByZWNlbnQgY2hhbmdlcywgY21ha2UgbmVlZHMgYmV0dGVyIHBsYXRmb3JtLWluZGVwZW5kZW50IGxhbmd1YWdlIGxldmVsIGNvbnRyb2wKKyAgICAqIFtUSFJJRlQtNDE2Nl0gLSBSZWNlbnQgZml4IHRvIHJlbW92ZSBib29zdDo6bGV4aWNhbF9jYXN0IHVzYWdlIGJyb2tlIFZTMjAxMAorICAgICogW1RIUklGVC00MTY3XSAtIE1pc3NpbmcgY29tcGlsZSBmbGFnCisgICAgKiBbVEhSSUZULTQxNzBdIC0gU3VwcG9ydCBsdWEgNS4xIG9yIGVhcmxpZXIgcHJvcGVybHkgZm9yIG9iamVjdCBsZW5ndGggZGV0ZXJtaW5hdGlvbgorICAgICogW1RIUklGVC00MTcyXSAtIG5vZGUuanMgdHV0b3JpYWwgY2xpZW50IGRvZXMgbm90IGltcG9ydCBhc3NlcnQsIGNvbm5lY3Rpb24gaXNzdWVzIGFyZSBub3QgaGFuZGxlZCBwcm9wZXJseQorICAgICogW1RIUklGVC00MTc3XSAtIEphdmEgY29tcGlsZXIgcHJvZHVjZXMgZGVlcCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgY291bGQgbWFrZSBzaGFsbG93IGNvcHkgaW5zdGVhZAorICAgICogW1RIUklGVC00MTg0XSAtIEJ1aWxkaW5nIG9uIEFwcHZleW9yOiBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcTAorICAgICogW1RIUklGVC00MTg1XSAtIGZiMzAzIGNvdW50ZXIgZW5jb2RpbmcgZml4CisgICAgKiBbVEhSSUZULTQxODldIC0gRnJhbWVkL2J1ZmZlcmVkIHRyYW5zcG9ydCBEaXNwb3NlKCkgZG9lcyBub3QgZGlzcG9zZSB0aGUgbmVzdGVkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTkzXSAtIExvd2VyIHRoZSBkZWZhdWx0IG1heFJlYWRCdWZmZXJCeXRlcyBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDE5NV0gLSBDb21waWxhdGlvbiB0byBHTyBwcm9kdWNlcyBicm9rZW4gY29kZQorICAgICogW1RIUklGVC00MTk2XSAtIENhbm5vdCBnZW5lcmF0ZSByZWN1cnNpdmUgUnVzdCB0eXBlcworICAgICogW1RIUklGVC00MjA0XSAtIHR5cG8gaW4gY29tcGFjdCBzcGVjCisgICAgKiBbVEhSSUZULTQyMDZdIC0gU3RyaW5ncyBpbiBjb250YWluZXIgZmllbGRzIGFyZSBub3QgZGVjb2RlZCBwcm9wZXJseSB3aXRoIHB5OmR5bmFtaWMgYW5kIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMDhdIC0gQyMgTmFtZWRQaXBlc1NlcnZlciBub3QgcmVhbGx5IHdvcmtpbmcgaW4gc29tZSBzY2VuYXJpb3MKKyAgICAqIFtUSFJJRlQtNDIxMV0gLSBGaXggR0Vycm9yIGdsaWIgbWFuYWdlbWVudCB1bmRlciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNDIxMl0gLSBjX2dsaWIgZmx1c2ggdHJpZXMgdG8gY2xvc2UgU1NMIGV2ZW4gaWYgc29ja2V0IGlzIGludmFsaWQKKyAgICAqIFtUSFJJRlQtNDIxM10gLSBUcmF2aXMgYnVpbGQgZmFpbHMgYXQgY3VybCAtc1NMIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9pbnN0YWxsLnNoIHwgc2gKKyAgICAqIFtUSFJJRlQtNDIxNV0gLSBHb2xhbmcgVFRyYW5zcG9ydEZhY3RvcnkgUGF0dGVybiBTcXVlbGNoZXMgRXJyb3JzCisgICAgKiBbVEhSSUZULTQyMTZdIC0gR29sYW5nIEh0dHAgQ2xpZW50cyBEbyBOb3QgUmVzcGVjdCBVc2VyIE9wdGlvbnMKKyAgICAqIFtUSFJJRlQtNDIxOF0gLSBTZXQgVENQX05PREVMQVkgZm9yIFBIUCBjbGllbnQgc29ja2V0CisgICAgKiBbVEhSSUZULTQyMTldIC0gR29sYW5nIEhUVFAgY2xpZW50cyBjcmVhdGVkIHdpdGggTmlsIGJ1ZmZlcgorICAgICogW1RIUklGVC00MjMxXSAtIFRKU09OUHJvdG9jb2wgdGhyb3dzIHVuZXhwZWN0ZWQgbm9uLVRocmlmdC1leGNlcHRpb24gb24gbnVsbCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMzJdIC0gLi9jb25maWd1cmUgZG9lcyBiYWQgYW50IHZlcnNpb24gY2hlY2sKKyAgICAqIFtUSFJJRlQtNDIzNF0gLSBUcmF2aXMgYnVpbGQgZmFpbHMgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgd2l0aCAiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgcHJvdG9jb2wgdHlwZSIKKyAgICAqIFtUSFJJRlQtNDIzN10gLSBHbyBUU2VydmVyU29ja2V0IFJhY2UgQ29uZGl0aW9ucworICAgICogW1RIUklGVC00MjQwXSAtIEdvIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgY2xvc2UgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDI0M10gLSBHbyBUU2ltcGxlU2VydmVyIHJhY2Ugb24gd2FpdCBpbiBTdG9wKCkgbWV0aG9kCisgICAgKiBbVEhSSUZULTQyNDVdIC0gR29sYW5nIFRGcmFtZWRUcmFuc3BvcnQncyB3cml0ZUJ1ZmZlciBpbmNyZWFzZXMgaWYgd3JpdGVzIHRvIHRyYW5zcG9ydCBmYWlsZWQKKyAgICAqIFtUSFJJRlQtNDI0Nl0gLSBTZXF1ZW5jZSBudW1iZXIgbWlzbWF0Y2ggb24gbXVsdGlwbGV4ZWQgY2xpZW50cworICAgICogW1RIUklGVC00MjQ3XSAtIENvbXBpbGUgZmFpbHMgd2l0aCBvcGVuc3NsIDEuMQorICAgICogW1RIUklGVC00MjQ4XSAtIENvbXBpbGUgZmFpbHMgLSBzdHJuY3B5LCBtZW1jbXAsIG1lbXNldCBub3QgZGVjbGFyZWQgaW4gc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtNDI1MV0gLSBKYXZhIEVwb2xsIFNlbGVjdG9yIEJ1ZworICAgICogW1RIUklGVC00MjU3XSAtIFR5cGVzY3JpcHQgYXN5bmMgY2FsbGJhY2tzIGRvIG5vdCBwcm92aWRlIHRoZSBjb3JyZWN0IHR5cGVzCisgICAgKiBbVEhSSUZULTQyNThdIC0gQm9vc3Qvc3RkIHRocmVhZCB3cmFwcGluZyBmYXVsdGluZXNzCisgICAgKiBbVEhSSUZULTQyNjBdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlLiBDb250ZXh0IGlzIHBhcmFtZXRlciBpbiBJbnRlcmZhY2Ugbm90IGluIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQyNjFdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlOiBicmVha2luZyBjaGFuZ2UgaW4gZ2VuZXJhdGVkIGNvZGUgcmVnYXJkaW5nIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24gaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTQyNjJdIC0gSW52YWxpZCBiaW5kaW5nIHRvIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoKSB3aXRoIDY0LWJpdCB0YXJnZXRzCisgICAgKiBbVEhSSUZULTQyNjNdIC0gRml4IHVzZSBhZnRlciBmcmVlIGJ1ZyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI2Nl0gLSBFcmxhbmcgbGlicmFyeSB0aHJvd3MgZHVyaW5nIHNraXBwaW5nIGZpZWxkcyBvZiBjb21wb3NpdGUgdHlwZSAobWFwcywgbGlzdHMsIHN0cnVjdHMsIHNldHMpCisgICAgKiBbVEhSSUZULTQyNjhdIC0gRXJsYW5nIGxpYnJhcnkgZW1pdHMgZGVidWdnaW5nIG91dHB1dCBpbiB0cmFuc3BvcnQgbGF5ZXIKKyAgICAqIFtUSFJJRlQtNDI3M10gLSBlcmxhbmc6bm93LzA6IERlcHJlY2F0ZWQgQklGLiAKKyAgICAqIFtUSFJJRlQtNDI3NF0gLSBQeXRob24gZmVhdHVyZSB0ZXN0cyBmb3IgU1NML1RMUyBmYWlsaW5nCisgICAgKiBbVEhSSUZULTQyNzldIC0gV3JvbmcgcGF0aCBpbiBpbmNsdWRlIGRpcmVjdGl2ZSBpbiBnZW5lcmF0ZWQgVGhyaWZ0IHNvdXJjZXMKKyAgICAqIFtUSFJJRlQtNDI4M10gLSBUTmFtZWRQaXBlU2VydmVyIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdAorICAgICogW1RIUklGVC00Mjg0XSAtIEZpbGUgY29udGFpbnMgYSBOQlNQOiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcworICAgICogW1RIUklGVC00MjkwXSAtIEMjIG51bGxhYmxlIG9wdGlvbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBub24tcmVxdWlyZWQgZW51bSBmaWVsZCB3aXRoIGRlZmF1bHQgdmFsdWUKKyAgICAqIFtUSFJJRlQtNDI5Ml0gLSBUaW1lck1hbmFnZXI6OnJlbW92ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICogW1RIUklGVC00MzA3XSAtIE1ha2Ugc3NsLW9wZW4gdGltZW91dCBlZmZlY3RpdmUgaW4gZ29sYW5nIGNsaWVudAorICAgICogW1RIUklGVC00MzEyXSAtIEVybGFuZyBjbGllbnQgY2Fubm90IGNvbm5lY3QgdG8gUHl0aG9uIHNlcnZlcjogZXhjZXB0aW9uIGVycm9yOiBlY29ubnJlZnVzZWQKKyAgICAqIFtUSFJJRlQtNDMxM10gLSBQcm9ncmFtIGNvZGUgb2YgdGhlIEVybGFuZyB0dXRvcmlhbCBmaWxlcyBjb250YWluIHN5bnRheCBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDMxNl0gLSBUQnl0ZUJ1ZmZlci5qYXZhIHdpbGwgcmVhZCB0b28gbXVjaCBkYXRhIGlmIGEgcHJldmlvdXMgcmVhZCByZXR1cm5zIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkCisgICAgKiBbVEhSSUZULTQzMTldIC0gY29tbWFuZCBsaW5lIHN3aXRjaCBmb3IgImV2aHR0cCIgaW5jb3JyZWN0bHkgcmVzb2x2ZWQgdG8gYW5vbiBwaXBlcworICAgICogW1RIUklGVC00MzIzXSAtIHJhbmdlIGNoZWNrIGVycm9ycyBvciBOUEUgaW4gZWRnZSBjYXNlcworICAgICogW1RIUklGVC00MzI0XSAtIGZpZWxkIG5hbWVzIGNhbiBjb25mbGljdCB3aXRoIGxvY2FsIHZhcnMgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtNDMyOF0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IChqb2IgMSkgYW5kIGhheGUgYnVpbGRzIGFyZSBmYWlsaW5nIHNpbmNlIDkvMTEKKyAgICAqIFtUSFJJRlQtNDMyOV0gLSBjX2dsaWIgRG9lc24ndCBoYXZlIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTQzMzFdIC0gQysrOiBUU1NMU29ja2V0cyBidWcgaW4gaGFuZGxpbmcgaHVnZSBtZXNzYWdlcywgYnVnIGluIGhhbmRsaW5nIHBvbGxpbmcKKyAgICAqIFtUSFJJRlQtNDMzMl0gLSBCaW5hcnkgcHJvdG9jb2wgaGFzIG1lbW9yeSBsZWFrcworICAgICogW1RIUklGVC00MzM0XSAtIFBlcmwgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDMzOV0gLSBUaHJpZnQgRnJhbWVkIFRyYW5zcG9ydCBpbiBFcmxhbmcgY3Jhc2hlcyBzZXJ2ZXIgd2hlbiBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAqIFtUSFJJRlQtNDM0MF0gLSBFcmxhbmcgZml4IGEgY3Jhc2ggb24gY2xpZW50IGNsb3NlCisgICAgKiBbVEhSSUZULTQzNTVdIC0gSmF2YXNjcmlwdCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorICAgICogW1RIUklGVC00MzU2XSAtIHRocmlmdF9wcm90b2NvbCBjYWxsIFRyYW5zcG9ydCBjYXVzZSBTZWdtZW50YXRpb24gZmF1bHQKKyAgICAqIFtUSFJJRlQtNDM1OV0gLSBIYXhlIGNvbXBpbGVyIGxvb2tzIGxpa2UgaXQgaXMgcHJvZHVjaW5nIGluY29ycmVjdCBjb2RlIGZvciBtYXAgb3Igc2V0IGtleSB0aGF0IGlzIGJpbmFyeSB0eXBlCisgICAgKiBbVEhSSUZULTQzNjJdIC0gTWlzc2luZyBzaXplLWNoZWNrIGNhbiBsZWFkIHRvIGh1Z2UgbWVtb3J5IGFsbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtNDM2NF0gLSBXZWJzaXRlIGNvbnRyaWJ1dGluZyBndWlkZSBlcnJvbmVvdXNseSByZWNvbW1lbmRzIHN1Ym1pdHRpbmcgcGF0Y2hlcyBpbiBKSVJBCisgICAgKiBbVEhSSUZULTQzNjVdIC0gUGVybCBnZW5lcmF0ZWQgY29kZSB1c2VzIGluZGlyZWN0IG9iamVjdCBzeW50YXgsIHdoaWNoIG9jY2FzaW9uYWxseSBjYXVzZXMgY29tcGlsYXRpb24gZXJyb3JzLgorICAgICogW1RIUklGVC00MzY3XSAtIHB5dGhvbiBUUHJvY2Vzc29yLnByb2Nlc3MgaXMgbWlzc2luZyAic2VsZiIKKyAgICAqIFtUSFJJRlQtNDM3MF0gLSBVYnVudHUgQXJ0ZnVsIGNwcGNoZWNrIGFuZCBmbGFrZTggYXJlIG1vcmUgc3RyaW5nZW50IGFuZCBjYXVzaW5nIFNDQSBidWlsZCBqb2IgZmFpbHVyZXMKKyAgICAqIFtUSFJJRlQtNDM3Ml0gLSBQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiAKKyAgICAqIFtUSFJJRlQtNDM3NF0gLSBjYW5ub3QgbG9hZCB0aHJpZnRfcHJvdG9jb2wgZHVlIHRvIHVuZGVmaW5lZCBzeW1ib2w6IF9aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UKKyAgICAqIFtUSFJJRlQtNDM3NV0gLSBUTWVtb3J5IHRocm93IGJhZF9hbGxvYyBkdWUgdG8gY291bnRlciBvdmVyZmxvdworICAgICogW1RIUklGVC00Mzc2XSAtIENvdmVyaXR5IGhpZ2ggaW1wYWN0IGlzc3VlIHJlc29sdXRpb24KKyAgICAqIFtUSFJJRlQtNDM3N10gLSBoYXhlLiBzb2NrZXQgaGFuZGxlcyBsZWFrIGluIFRTaW1wbGVTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDM4MV0gLSBXcm9uZyBpc3NldCBiaXRmaWVsZCB2YWx1ZSBhZnRlciB0cmFuc21pc3Npb24KKyAgICAqIFtUSFJJRlQtNDM4NV0gLSBHbyByZW1vdGUgY2xpZW50IC11IGZsYWcgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTQzOTJdIC0gY29tcGlsZXIvLi4uLi9wbHVnaW4udGhyaWZ0IHN0cnVjdHMgbWlzLW9yZGVyZWQgYmxvd3MgdXAgb2NhbWwgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTQzOTVdIC0gVW5hYmxlIHRvIGJ1aWxkIGluIHRoZSB1YnVudHUteGVuaWFsIGRvY2tlciBpbWFnZTogY2xhcCAyLjI4IHJlcXVpcmVzIFJ1c3QgMS4yMAorICAgICogW1RIUklGVC00Mzk2XSAtIGluY29uc2lzdGVudCAob3IgcGxhaW4gd3JvbmcpIHZlcnNpb24gbnVtYmVycyBpbiBtYXN0ZXIvdHJ1bmsgCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDE1N10gLSBvdXRkYXRlZCByZWFkbWUgYWJvdXQgSGF4ZSBpbnN0YWxsYXRpb24gb24gTGludXgKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTA1XSAtIG1ha2UgYSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3R1cmVzIHdpdGggbmVnYXRpdmUgdGFncworICAgICogW1RIUklGVC0yODFdIC0gQ29jb2EgbGlicmFyeSBjb2RlIG5lZWRzIGNvbW1lbnRzLCBiYWRseQorICAgICogW1RIUklGVC03NzVdIC0gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZvciBQZXJsCisgICAgKiBbVEhSSUZULTIyMjFdIC0gR2VuZXJhdGUgYysrIGNvZGUgd2l0aCBzdGQ6OnNoYXJlZF9wdHIgaW5zdGVhZCBvZiBib29zdDo6c2hhcmVkX3B0ci4KKyAgICAqIFtUSFJJRlQtMjM2NF0gLSBPQ2FtbDogVXNlIE9hc2lzIGV4Y2x1c2l2ZWx5IGZvciBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTI1MDRdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIHNob3VsZCBhbGxvdyByZWdpc3RlcmluZyBkZWZhdWx0IHByb2Nlc3NvciBjYWxsZWQgaWYgbm8gc2VydmljZSBuYW1lIGlzIHByZXNlbnQKKyAgICAqIFtUSFJJRlQtMzIwN10gLSBFbmFibGUgYnVpbGQgd2l0aCBPcGVuU1NMIDEuMS4wIHNlcmllcworICAgICogW1RIUklGVC0zMjcyXSAtIFBlcmwgU1NMIEF1dGhlbnRpY2F0aW9uIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzM1N10gLSBHZW5lcmF0ZSBFbnVtU2V0L0VudW1NYXAgd2hlcmUgZWxlbWVudHMva2V5cyBhcmUgZW51bXMKKyAgICAqIFtUSFJJRlQtMzM2OV0gLSBJbXBsZW1lbnQgU1NML1RMUyBzdXBwb3J0IG9uIEMgd2l0aCBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMzQ2N10gLSBHbyBNYXBzIGZvciBUaHJpZnQgU2V0cyBTaG91bGQgSGF2ZSBWYWx1ZXMgb2YgVHlwZSBzdHJ1Y3R7fSAKKyAgICAqIFtUSFJJRlQtMzU4MF0gLSBUSGVhZGVyIGZvciBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM2MjddIC0gTWlzc2luZyBiYXNpYyBjb2RlIHN0eWxlIGNvbnNpc3RlbmN5IG9mIEphdmFTY3JpcHQuCisgICAgKiBbVEhSSUZULTM3MDZdIC0gVGhlcmUncyBubyBzdXBwb3J0IGZvciBNdWx0aXBsZXhlZCBwcm90b2NvbCBvbiBjX2dsaWIgbGlicmFyeQorICAgICogW1RIUklGVC0zNzY2XSAtIEFkZCBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgdG8gVFpsaWJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzc3Nl0gLSBHbyBjb2RlIGZyb20gbXVsdGlwbGUgdGhyaWZ0IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTM4MjNdIC0gRXNjYXBlIGRvY3VtZW50YXRpb24gd2hpbGUgZ2VuZXJhdGluZyBub24gZXNjYXBlZCBkb2N1bWV0YXRpb24KKyAgICAqIFtUSFJJRlQtMzg1NF0gLSBhbGxvdyB1c2VycyB0byBjbGVhciByZWFkIGJ1ZmZlcnMKKyAgICAqIFtUSFJJRlQtMzg1OV0gLSBVbml4IERvbWFpbiBTb2NrZXQgU3VwcG9ydCBpbiBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0zOTIxXSAtIEMrKyBjb2RlIHNob3VsZCBwcmludCBlbnVtcyBhcyBzdHJpbmdzCisgICAgKiBbVEhSSUZULTM5MjZdIC0gVGhlcmUgc2hvdWxkIGJlIGFuIGVycm9yIGVtaXR0ZWQgd2hlbiBodHRwIHN0YXR1cyBjb2RlIGlzIG5vdCAyMDAgCisgICAgKiBbVEhSSUZULTQwMDddIC0gTWljcm8tb3B0aW1pemF0aW9uIG9mIFRUcmFuc3BvcnQucHkKKyAgICAqIFtUSFJJRlQtNDA0MF0gLSBBZGQgcmVhbCBjYXVzZSBvZiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXJyb3IgdG8gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNjRdIC0gVXBkYXRlIG5vZGUgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDA2OV0gLSBBbGwgcGVybCBwYWNrYWdlcyBzaG91bGQgaGF2ZSBwcm9wZXIgbmFtZXNwYWNlLCB2ZXJzaW9uIHN5bnRheCwgYW5kIHVzZSBwcm9wZXIgdGhyaWZ0IGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDA3MV0gLSBDb25zb2xpZGF0ZSB0aGUgVHJhdmlzIENJIGpvYnMgd2hlcmUgcG9zc2libGUgdG8gcHV0IGxlc3Mgc3RyZXNzIG9uIHRoZSBBcGFjaGUgRm91bmRhdGlvbidzIGFsbG9jYXRpb24gb2YgQ0kgYnVpbGQgc2xhdmVzCisgICAgKiBbVEhSSUZULTQwNzJdIC0gQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIGN1c3RvbSBoZWFkZXJzIGluIFRDdXJsQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNzVdIC0gQmV0dGVyIE1pbkdXIHN1cHBvcnQgZm9yIGhlYWRlcnMtb25seSBib29zdCAod2l0aG91dCB0aHJlYWQgbGlicmFyeSkKKyAgICAqIFtUSFJJRlQtNDA4MV0gLSBQcm92aWRlIGEgTWluR1cgNjQtYml0IEFwcHZleW9yIENJIGJ1aWxkIGZvciBiZXR0ZXIgcHVsbCByZXF1ZXN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDA4NF0gLSBJbXByb3ZlIFNTTCBzZWN1cml0eSBpbiB0aHJpZnQgYnkgYWRkaW5nIGEgbWFrZSBjcm9zcyBjbGllbnQgdGhhdCBjaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIHByb3RvY29sIGNhbm5vdCBiZSBuZWdvdGlhdGVkCisgICAgKiBbVEhSSUZULTQwOTVdIC0gQWRkIG11bHRpcGxleGVkIHByb3RvY29sIHRvIFRyYXZpcyBDSSBmb3IgbWFrZSBjcm9zcworICAgICogW1RIUklGVC00MDk5XSAtIEF1dG8tZGVyaXZlIEhhc2ggZm9yIGdlbmVyYXRlZCBSdXN0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDExMF0gLSBUaGUgZGViaWFuIGJ1aWxkIGZpbGVzIGRvIG5vdCBwcm9kdWNlIGEgIi1kYmciIHBhY2thZ2UgZm9yIGRlYnVnIHN5bWJvbHMgb2YgbGlidGhyaWZ0MAorICAgICogW1RIUklGVC00MTE0XSAtIFNwYWNlIGFmdGVyICcvLy8nIGluIGRvYyBjb21tZW50cworICAgICogW1RIUklGVC00MTI2XSAtIFZhbGlkYXRlIG9iamVjdHMgaW4gcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC00MTMwXSAtIEVuc3VyZSBBcGFjaGUgSHR0cCBjb25uZWN0aW9uIGlzIHJlbGVhc2VkIGJhY2sgdG8gcG9vbCBhZnRlciB1c2UKKyAgICAqIFtUSFJJRlQtNDE1MV0gLSBUaHJpZnQgTXV0ZXggQ29udGVudGlvbiBQcm9maWxpbmcgKHB0aHJlYWRzKSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC00MTc2XSAtIEltcGxlbWVudCBhIHRocmVhZGVkIGFuZCB0aHJlYWRwb29sIHNlcnZlciB0eXBlIGZvciBSdXN0CisgICAgKiBbVEhSSUZULTQxODNdIC0gTmFtZWQgcGlwZSBjbGllbnQgYmxvY2tzIGZvcmV2ZXIgb24gT3BlbigpIHdoZW4gdGhlcmUgaXMgbm8gc2VydmVyIGF0IHRoZSBvdGhlciBlbmQKKyAgICAqIFtUSFJJRlQtNDE5MF0gLSBpbXByb3ZlIEMjIFRUaHJlYWRQb29sU2VydmVyIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTQxOTddIC0gSW1wbGVtZW50IHRyYW5zcGFyZW50IGd6aXAgY29tcHJlc3Npb24gZm9yIEhUVFAgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQxOThdIC0gUnVieSBzaG91bGQgbG9nIFRocmlmdCBpbnRlcm5hbCBlcnJvcnMgdG8gZ2xvYmFsIGxvZ2dlcgorICAgICogW1RIUklGVC00MjAzXSAtIHRocmlmdCBzZXJ2ZXIgc3RvcCBncmFjZWZ1bGx5CisgICAgKiBbVEhSSUZULTQyMDVdIC0gY19nbGliIGlzIG5vdCBsaW5raW5nIGFnYWluc3QgZ2xpYiArIGdvYmplY3QKKyAgICAqIFtUSFJJRlQtNDIwOV0gLSB3YXJuaW5nIENTMDQxNCBpbiBUW1RMU11TZXJ2ZXJTb2NrZXQuY3MKKyAgICAqIFtUSFJJRlQtNDIxMF0gLSBpbmNsdWRlIFRocmlmdC40NS5jc3Byb2ogaW50byBDSSBydW5zIAorICAgICogW1RIUklGVC00MjE3XSAtIEh0dHBDbGllbnQgc2hvdWxkIHN1cHBvcnQgZ3ppcCBhbmQgZGVmbGF0ZQorICAgICogW1RIUklGVC00MjIyXSAtIFN1cHBvcnQgVW5peCBEb21haW4gU29ja2V0cyBpbiBHb2xhbmcgVFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC00MjMzXSAtIE1ha2UgVEhzSGFTZXJ2ZXIuaW52b2tlciBhdmFpbGFibGUgKGdldCBtZXRob2Qgb25seSkgaW4gaW5oZXJpdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtNDIzNl0gLSBTdXBwb3J0IGNvbnRleHQgaW4gZ28gZ2VuZXJhdGVkIGNvZGUuCisgICAgKiBbVEhSSUZULTQyMzhdIC0gSlNPTiBnZW5lcmF0b3I6IG1ha2UgYW5ub3RhdGlvbi1hd2FyZQorICAgICogW1RIUklGVC00MjY5XSAtIERvbid0IGFwcGVuZCAnLicgdG8gRXJsYW5nIG5hbWVzcGFjZSBpZiBpdCBlbmRzIGluICdfJy4KKyAgICAqIFtUSFJJRlQtNDI3MF0gLSBHZW5lcmF0ZSBFcmxhbmcgbWFwcGluZyBmdW5jdGlvbnMgZm9yIGNvbnN0IG1hcHMgYW5kIGxpc3RzCisgICAgKiBbVEhSSUZULTQyNzVdIC0gQWRkIHN1cHBvcnQgZm9yIHpvcGUuaW50ZXJmYWNlIG9ubHksIGFwYXJ0IGZyb20gdHdpc3RlZCBzdXBwb3J0LgorICAgICogW1RIUklGVC00Mjg1XSAtIFB1bGwgZ2VuZXJhdGVkIHNlbmQvcmVjdiBpbnRvIGxpYnJhcnkgdG8gYWxsb3cgYmVoYXZpb3VyIHRvIGJlIGN1c3RvbWlzZWQKKyAgICAqIFtUSFJJRlQtNDI4N10gLSBBZGQgYysrIGNvbXBpbGVyICJub19za2VsZXRvbiIgZmxhZyBvcHRpb24KKyAgICAqIFtUSFJJRlQtNDI4OF0gLSBJbXBsZW1lbnQgbG9nZ2luZyBsZXZlbHMgcHJvcGVybHkgZm9yIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDI5NV0gLSBSZWZyZXNoIHRoZSBEb2NrZXIgaW1hZ2UgZmlsZSBzdWl0ZSBmb3IgVWJ1bnR1LCBEZWJpYW4sIGFuZCBDZW50T1MKKyAgICAqIFtUSFJJRlQtNDMwNV0gLSBFbWl0IGRkb2MgZm9yIGdlbmVyYXRlZCBpdGVtcworICAgICogW1RIUklGVC00MzA2XSAtIFRocmlmdCBpbXBvcnRzIG5vdCByZXBsaWNhdGVkIHRvIEQgc2VydmljZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtNDMxNV0gLSBBZGQgZGVmYXVsdCBtZXNzYWdlIGZvciBUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDMxOF0gLSBEZWxwaGkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTQzMjVdIC0gU2ltcGxpZnkgYXV0b21ha2UgY3Jvc3MgY29tcGlsYXRpb24gYnkgcmVseWluZyBvbiBvbmUgZ2xvYmFsIFRIUklGVCBjb21waWxlciBwYXRoCisgICAgKiBbVEhSSUZULTQzMjddIC0gSW1wcm92ZSBUaW1lck1hbmFnZXIgQVBJIHRvIGFsbG93IHJlbW92aW5nIHNwZWNpZmljIHRhc2sKKyAgICAqIFtUSFJJRlQtNDMzMF0gLSBBbGxvdyB1bnVzZWQgY3JhdGVzIGluIFJ1c3QgZmlsZXMKKyAgICAqIFtUSFJJRlQtNDMzM10gLSBFcmxhbmcgdHV0b3JpYWwgZXhhbXBsZXMgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHBvcnQgKDk5OTkpCisgICAgKiBbVEhSSUZULTQzNDNdIC0gQ2hhbmdlIENJIGJ1aWxkcyB0byB1c2Ugbm9kZS5qcyA4LnggTFRTIG9uY2UgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTQzNDVdIC0gQ3JlYXRlIGEgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IHRoYXQgdXNlcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGFuZ3VhZ2UgbGV2ZWxzCisgICAgKiBbVEhSSUZULTQzNDZdIC0gQWxsb3cgWmxpYiB0cmFuc3BvcnQgZmFjdG9yeSB0byB3cmFwIG90aGVyIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtNDM0OF0gLSBQZXJsIEhUVFAgQ2xpZW50IGN1c3RvbSBIVFRQIGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtNDM1MF0gLSBVcGRhdGUgbmV0Y29yZSBidWlsZCBmb3IgZG90bmV0IDIuMCBzZGsgYW5kIG1ha2UgY3Jvc3MgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC00MzUxXSAtIFVzZSBUcmF2aXMgQ0kgQnVpbGQgU3RhZ2VzIHRvIG9wdGltaXplIHRoZSBDSSBidWlsZAorICAgICogW1RIUklGVC00MzUzXSAtIGNhbm5vdCByZWFkIHZpYSB0aHJpZnRfcHJvdG9jb2wgYXQgc2VydmVyIHNpZGUKKyAgICAqIFtUSFJJRlQtNDM3OF0gLSBhZGQgc2V0IHN0b3BUaW1lb3V0VW5pdCBtZXRob2QgdG8gVFRocmVhZFBvb2xTZXJ2ZXIKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtNzUwXSAtIEMrKyBDb21waWxlciBWaXJ0dWFsIEZ1bmN0aW9uIE9wdGlvbgorICAgICogW1RIUklGVC0yOTQ1XSAtIEltcGxlbWVudCBzdXBwb3J0IGZvciBSdXN0IGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTM4NTddIC0gdGhyaWZ0IGpzOm5vZGUgY29tcGxpZXIgc3VwcG9ydCBhbiBvYmplY3QgYXMgcGFyYW1ldGVyIG5vdCBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzkzM10gLSBQb3J0IG9mZmljaWFsIEMjIC5ORVQgbGlicmFyeSBmb3IgVGhyaWZ0IHRvIEMjIC5ORVQgQ29yZSBsaWJhcnkKKyAgICAqIFtUSFJJRlQtNDAzOV0gLSBVcGRhdGUgb2YgQXBhY2hlIFRocmlmdCAuTmV0IENvcmUgbGliIAorICAgICogW1RIUklGVC00MTEzXSAtIFByb3ZpZGUgYSBidWZmZXIgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcgaW4gbWVtb3J5IGJ5dGUgc3RyZWFtCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI5NTZdIC0gYXV0b2NvbmYgLSBwb3NzaWJseSB1bmRlZmluZWQgbWFjcm8gLSBBQ19QUk9HX0JJU09OCisgICAgKiBbVEhSSUZULTQyMjNdIC0gQWRkIHN1cHBvcnQgdG8gdGhlIGlzU2VydmluZygpIG1ldGhvZCBmb3IgdGhlIEMrKyBsaWJyYXJ5CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMzYyMl0gLSBGaXggZGVwcmVjYXRlZCB1c2VzIG9mIHN0ZDo6YXV0b19wdHIKKyAgICAqIFtUSFJJRlQtNDAyOF0gLSBQbGVhc2UgcmVtb3ZlIFN5c3RlbS5vdXQuZm9ybWF0IGZyb20gdGhlIHNvdXJjZSBjb2RlCisgICAgKiBbVEhSSUZULTQxODZdIC0gQnVpbGQgYW5kIHRlc3QgcnVzdCBjbGllbnQgaW4gVHJhdmlzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNDI2NF0gLSBQSFAgLSBTdXBwb3J0IGJvdGggc2hhcmVkICYgc3RhdGljIGxpbmtpbmcgb2Ygc29ja2V0cyBsaWJyYXJ5CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtNDM0NF0gLSBEZWZpbmUgYW5kIG1haW50YWluIHRoZSBtaW5pbXVtIGxhbmd1YWdlIGxldmVsIGZvciBhbGwgbGFuZ3VhZ2VzIGluIG9uZSBwbGFjZQorCisJCitUaHJpZnQgMC4xMC4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTE4NDBdIC0gVGhyaWZ0IEdlbmVyYXRlZCBDb2RlIENhdXNlcyBHbG9iYWwgVmFyaWFibGUgTGVha3MKKyAgICAqIFtUSFJJRlQtMTgyOF0gLSBtb2NfVFFUY3BTZXJ2ZXIuY3BwIHdhcyByZW1vdmVkIGZyb20gc291cmNlIHRyZWUgYnV0IGlzIGluIHRocmlmdC0wLjkuMC50YXIuZ3oKKyAgICAqIFtUSFJJRlQtMTc5MF0gLSBjb2NvYTogRHVwbGljYXRlIGludGVyZmFjZSBkZWZpbml0aW9uIGVycm9yCisgICAgKiBbVEhSSUZULTE3NzZdIC0gVFBpcGVTZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCAibGlzdGVuIiwgc28gdGhhdCBUU2VydmVyRXZlbnRIYW5kbGVyIHByZVNlcnZlIHdpbGwgd29yayByaWdodAorICAgICogW1RIUklGVC0xMzUxXSAtIENvbXBpbGVyIGRvZXMgbm90IGNhcmUgYWJvdXQgYmluYXJ5IHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMTIyOV0gLSBQeXRob24gZmFzdGJpbmFyeS5jIGNhbiBub3QgaGFuZGxlIHVuaWNvZGUgYXMgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCisgICAgKiBbVEhSSUZULTc0OV0gLSBDKysgVEJ1ZmZlcmVkVHJhbnNwb3J0cyBkbyBub3QgZmx1c2ggdGhlaXIgYnVmZmVycyBvbiBkZWxldGUKKyAgICAqIFtUSFJJRlQtNzQ3XSAtIEMrKyBUU29ja2V0LT5jbG9zZSBjYWxscyBzaHV0ZG93biBicmVha2luZyBmb3JrZWQgcGFyZW50IHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNzMyXSAtIHNlcnZlciBleGl0cyBhYm5vcm1hbGx5IHdoZW4gY2xpZW50IGNhbGxzIHNlbmRfeHh4IGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyByZWN2X3h4eCBmdW5jdGlvbgorICAgICogW1RIUklGVC0zOTQyXSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgaG9ub3Igc2VuZCBhbmQgcmVjZWl2ZSB0aW1lb3V0cworICAgICogW1RIUklGVC0zOTQxXSAtIFdpblhQIHZlcnNpb24gb2YgdGhyaWZ0X3BvbGwoKSByZWxpZXMgb24gdW5kZWZpbmVkIGJlaGF2aW9yIGJ5IHBhc3NpbmcgYSBkZXN0cnVjdGVkIHZhcmlhYmxlIHRvIHNlbGVjdCgpCisgICAgKiBbVEhSSUZULTM5NDBdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgZm9yIGNvbXBpbGVyIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zOTQzXSAtIENvdmVyaXR5IFNjYW4gaWRlbnRpZmllZCBzb21lIGhpZ2ggc2V2ZXJpdHkgZGVmZWN0cworICAgICogW1RIUklGVC0zOTI5XSAtIFBIUCAibnNnbG9iYWwiIE9wdGlvbiBSZXN1bHRzIGluIFN5bnRheCBFcnJvciBpbiBHZW5lcmF0ZWQgQ29kZSAoVHJhaWxpbmcgQmFja3NsYXNoKQorICAgICogW1RIUklGVC0zOTM2XSAtIENhbm5vdCBjb21waWxlIDAuMTAuMCBkZXZlbG9wbWVudCB0aXAgd2l0aCBWUzIwMTMgYW5kIGVhcmxpZXIgKHNucHJpbnRmLCB1aW50MzJfdCkKKyAgICAqIFtUSFJJRlQtMzkzNV0gLSBJbmNvcnJlY3Qgc2tpcHBpbmcgb2YgbWFwIGFuZCBzZXQKKyAgICAqIFtUSFJJRlQtMzkyMF0gLSBSdWJ5OiBFbnN1cmluZyB0aGF0IEhUVFAgZmFpbHVyZXMgd2lsbCBjbGVhciB0aGUgaHR0cCB0cmFuc3BvcnQgb3V0YnVmIHZhcgorICAgICogW1RIUklGVC0zOTE5XSAtIEMjIFRUTFNTZXJ2ZXJTb2NrZXQgZG9lcyBub3QgdXNlIGNsaWVudFRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMzkxN10gLSBDaGVjayBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSB2ZXJzaW9uCisgICAgKiBbVEhSSUZULTM5MDldIC0gRml4IGNfZ2xpYiBzdGF0aWMgbGliIENNYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTM5MDRdIC0gVHlwbyBpbiBub2RlIHR1dG9yaWFsIGxlYWRzIHRvIHdyb25nIHRyYW5zcG9ydCBiZWluZyB1c2VkCisgICAgKiBbVEhSSUZULTM4NDhdIC0gQXMgYW4gaW1wbGVtZW50ZXIgb2YgYSBwZXJsIHNvY2tldCBzZXJ2ZXIsIEkgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byByZW1lbWJlciB0byBpZ25vcmUgU0lHQ0hMRCBmb3IgaXQgdG8gd29yayBwcm9wZXJseQorICAgICogW1RIUklGVC0zODQ0XSAtIHRocmlmdF9wcm90b2NvbCBjYW5ub3QgY29tcGlsZSBpbiA3LjAuNworICAgICogW1RIUklGVC0zODQzXSAtIGludGVnZXIgaXNzdWVzIHdpdGggSGF4ZSBQSFAgdGFyZ2V0cyBjYXVzZSBaaWdaYWcgZW5jb2RpbmcgdG8gZmFpbAorICAgICogW1RIUklGVC0zODQyXSAtIERhcnQgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGZvciBhIGNvbnN0IHN0cnVjdAorICAgICogW1RIUklGVC0zODQxXSAtIGRhcnQgY29tcGFjdCBwcm90b2NvbCBpbmNvcnJlY3RseSBzZXJpYWxpemVzL2Rlc2VyaWFsaXplZCBkb3VibGVzCisgICAgKiBbVEhSSUZULTM3MDhdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVFByb3RvY29sJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0zNzA0XSAtICJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6IENvdWxkIG5vdCByZWZpbGwgYnVmZmVyIiBtZXNzYWdlIHNob3duIHdoZW4gdXNpbmcgSFRUUCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzY3OF0gLSBGaXggamF2YWRvYyBlcnJvcnMgb24gSkRLIDgKKyAgICAqIFtUSFJJRlQtMzAxNF0gLSBBcHBWZXlvciBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI5OTRdIC0gTm9kZS5qcyBUSlNPTlByb3RvY29sIGNhbm5vdCBiZSB1c2VkIGZvciBvYmplY3Qgc2VyaWFsaXphdGlvbi4KKyAgICAqIFtUSFJJRlQtMjk3NF0gLSB3cml0ZVRvUGFyY2VsIHRocm93cyBOUEUgZm9yIG9wdGlvbmFsIGVudW0gZmllbGRzCisgICAgKiBbVEhSSUZULTI5NDhdIC0gUHl0aG9uIFRKU09OUHJvdG9jb2wgZG9lc24ndCBoYW5kbGUgc3RydWN0cyB3aXRoIGJpbmFyeSBmaWVsZHMgY29udGFpbmluZyBpbnZhbGlkIHVuaWNvZGUuCisgICAgKiBbVEhSSUZULTI4NDVdIC0gQ2hpbGRTZXJ2aWNlLlBsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICAgICogW1RIUklGVC0zMjc2XSAtIEJpbmFyeSBkYXRhIGRvZXMgbm90IGRlY29kZSBjb3JyZWN0bHkgdXNpbmcgdGhlIFRKU09OUHJvdG9jb2wgd2hlbiB0aGUgYmFzZTY0IGVuY29kZWQgZGF0YSBpcyBwYWRkZWQuCisgICAgKiBbVEhSSUZULTMyNTNdIC0gVXNpbmcgbGF0ZXN0IHZlcnNpb24gb2YgRCBnaXZlcyBkZXByZWNhdGlvbiBub3RpY2VzCisgICAgKiBbVEhSSUZULTI4ODNdIC0gVFR3aXN0ZWQucHksIGR1cmluZyBDb25uZWN0aW9uTG9zdCBwcm9jZXNzaW5nOiBleGNlcHRpb25zLlJ1bnRpbWVFcnJvcjogZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbgorICAgICogW1RIUklGVC0yMDE5XSAtIFdyaXRpbmcgb24gYSBkaXNjb25uZWN0ZWQgc29ja2V0IG9uIE1hYyBjYXVzZXMgU0lHIFBJUEUKKyAgICAqIFtUSFJJRlQtMjAyMF0gLSBUaHJpZnQgbGlicmFyeSBoYXMgc29tZSBlbXB0eSBmaWxlcyB0aGF0IGhhdmVuJ3QgcmVhbGx5IGJlZW4gZGVsZXRlZAorICAgICogW1RIUklGVC0yMDQ5XSAtIEdvIGNvbXBpbGVyIGRvZXNuJ3QgYnVpbGQgb24gbmF0aXZlIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjAyNF0gLSBUU2VydmVyLmNwcCB3YXJucyBvbiA2NC1iaXQgcGxhdGZvcm1zIGFib3V0IHRydW5jYXRpbmcgYW4gcmxpbV90IGludG8gYW4gaW50CisgICAgKiBbVEhSSUZULTIwMjNdIC0gZ2V0dGltZW9mZGF5IGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgZXJyb3JzIHdoZW4gbm8gdGltZSB6b25lIGlzIHBhc3NlZCBpbi4KKyAgICAqIFtUSFJJRlQtMjAyMl0gLSBDb0IgYW5kIGRlbnNlIGNvZGUgZ2VuZXJhdGlvbiBzdGlsbCB1c2VzIFRSMSBiaW5kLCBldmVuIHRob3VnaCB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIGNsYW5nCisgICAgKiBbVEhSSUZULTIwMjddIC0gTWlub3IgNjQtYml0IGFuZCBOT01JTk1BWCBpc3N1ZXMgaW4gQysrIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjE1Nl0gLSBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBpcyB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbWlzbGVhZGluZyBpbmZvcm1hdGlvbgorICAgICogW1RIUklGVC0yMTU0XSAtIE1pc3NpbmcgPG9wZXJhdG9yIGJvZHkKKyAgICAqIFtUSFJJRlQtMjE0OF0gLSBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IGltcG9ydHMgbG9nNGoKKyAgICAqIFtUSFJJRlQtMjEwM10gLSBbcHl0aG9uXSBTdXBwb3J0IGZvciBTU0wgY2VydGlmaWNhdGVzIHdpdGggU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lcworICAgICogW1RIUklGVC0xOTMxXSAtIFNlbmRpbmcgYSBmcmFtZSBzaXplIG9mIHplcm8gdG8gYSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2F1c2VzIGFuIGFzc2VydGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTE3NTFdIC0gZGVmaW5pdGlvbiBvZiBpbmNyZWFzZV9tYXhfZmRzIGRvZXNuJ3QgY29tcGlsZSB3aGVuIEhBVkVfU1lTX1JFU09VUkNFX0ggaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMTUyMl0gLSBUU2VydmVyU29ja2V0IHBvdGVudGlhbCBtZW1vcnkgbGVhayB3aXRoIGFkZHJpbmZvICpyZXMwCisgICAgKiBbVEhSSUZULTE1NDddIC0gUHJvYmxlbXMgYnVpbGRpbmcgYWdhaW5zdCBzdGF0aWMgbGliZXZlbnQKKyAgICAqIFtUSFJJRlQtMTU0NV0gLSBHZW5lcmF0ZWQgamF2YXNjcmlwdCBjb2RlIHVzZXMgImZvciBpbiIgZm9yIGxvb3Bpbmcgb3ZlciBhcnJheXMKKyAgICAqIFtUSFJJRlQtMTQ4N10gLSBOYW1lc3BhY2UgcHJvYmxlbSwgY29tcGlsZSBmYWlscyBvbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0xNDcyXSAtIENvbmZpZ3VyYXRpb24gY29uZmxpY3RzIHdpdGggYm9vc3QgcGxhdGZvcm0gaW5jbHVkZSBoZWFkZXIKKyAgICAqIFtUSFJJRlQtNl0gLSBUaHJpZnQgbGlicmFyaWVzIGFuZCBjb21waWxlciBsYWNrIHZlcnNpb24gbnVtYmVyCisgICAgKiBbVEhSSUZULTE2ODBdIC0gbWFrZSBpbnN0YWxsIHJlcXVpcmVzIEdOVSBtYWtlCisgICAgKiBbVEhSSUZULTM4NjldIC0gRGFydCBUdXRvcmlhbCBidWlsZCBmYWlscyB3aXRoIEVycm9yIDY1IGF0ICJwdWIgZ2V0IgorICAgICogW1RIUklGVC0zODYxXSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIHRpbWluZyBvdXQgLSBDKytUU2VydmVySW50ZWdyYXRpb25UZXN0IGFwcGVhcnMgdG8gYmUgaGFuZ2luZworICAgICogW1RIUklGVC0zODU1XSAtIEluIHRoZSBnbyBzaW1wbGUgc2VydmVyLCBpZiBTdG9wKCkgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGl0IGhhbmdzCisgICAgKiBbVEhSSUZULTM4ODVdIC0gUEhQOiBFcnJvciB3aGVuIHJlYWRJNjQgaW4gVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0zODgzXSAtIEdvIFRlc3RBbGxDb25uZWN0aW9uIGNhbiBmYWlsIHdpdGggcG9ydCA5MDkwIGNvbGxpc2lvbgorICAgICogW1RIUklGVC0zODg0XSAtIEZpeCBFcmxhbmcgY29tcGFjdCBwcm90b2NvbCBkb3VibGUgZW5kaWFuZXNzIGFuZCBib29sZWFuIGxpc3QKKyAgICAqIFtUSFJJRlQtMzg4MF0gLSBFcmxhbmcgQ29tcGFjdCBwcm90b2NvbCAtIGJvb2xlYW4gdmFsdWVzIGludmVydGVkCisgICAgKiBbVEhSSUZULTM4NzldIC0gVW5kZWZpbmVkIGV2YWx1YXRpb24gb3JkZXIgY2F1c2VzIGluY29ycmVjdCBwcm9jZXNzaW5nIGluIHRoZSBDKysgbGlicmFyeSBKU09OIHByb3RvY29sCisgICAgKiBbVEhSSUZULTM4NTFdIC0gR29sYW5nIHRocmlmdCBjb250aW51YWxseSBhZGRzIHRoZSB4L3RocmlmdCBjb250ZW50IHR5cGUgCisgICAgKiBbVEhSSUZULTM4NTBdIC0gQWxsIGFwYWNoZSBidWlsZHMgYXJlIGZhaWxpbmcgd2hlbiBpbml0aWF0ZWQgZnJvbSBhIGdpdGh1YiBwdWxsIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzgzN10gLSBUaGlmdCAwLjkuMyBjYW4ndCBiZSBidWlsZCB3aXRoIFF1aWNrQ2hlY2sgMi44LjIgYW5kIHVub3JkZXJlZC1jb250YWluZXJzIDAuMi42CisgICAgKiBbVEhSSUZULTM4MzFdIC0gYnVpbGQgb2YgdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwIGZhaWxzIHdpdGggbmV3ZXIgZ2NjIG9uIHBsYXRmb3JtcyB3aXRoIHVuc2lnbmVkIGNoYXIgZHVlIHRvIG5hcnJvd2luZyBjb252ZXJzaW9ucworICAgICogW1RIUklGVC0zODI3XSAtIHBocCBDb21wYWN0UHJvdG9jb2wgcmVhZEk2NCBmdW5jdGlvbiBoYXMgYnVnLCB3aGVuIHZhbHVlIGhhcyAzMmJpdCB+NjRiaXQsIEV4YW1wbGXvvJp2YWx1ZT0xNDYxNTYzNDU3MDAwIAorICAgICogW1RIUklGVC0zODI1XSAtIEphdmFzY3JpcHQgdGVzdCBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzgxNF0gLSBGaXggY29udGVudGlvbiBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisgICAgKiBbVEhSSUZULTM3OTNdIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBhbnQgdmVyc2lvbiB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZQorICAgICogW1RIUklGVC0zNzg2XSAtIE5vZGUuanMgVExTIGVtaXRzICdjb25uZWN0JyBiZWZvcmUgY29ubmVjdGlvbiBpcyByZWFkeQorICAgICogW1RIUklGVC0zNzgwXSAtIEZpeCBkYXJ0IGludDY0IHVzYWdlIHdoZW4gY29tcGlsZWQgdG8ganMKKyAgICAqIFtUSFJJRlQtMzc4OV0gLSBOb2RlLmpzIGxhY2tzIGFiaWxpdHkgdG8gZGVzdHJveSBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTM3OTZdIC0gVGhlcmUncyBubyAtLWRiZyBmb3IgZGhfc3RyaXAsIG1heWJlIHNvbWVvbmUgaGFzIG1pc3Rha2VuIHRoaXMgZm9yIC0tZGJnLXBhY2thZ2UuCisgICAgKiBbVEhSSUZULTM3OTVdIC0gR2VuZXJhdGVkIGhhc2hWYWx1ZSBtZXRob2QgaW4gU3dpZnQgd2lsbCBvdmVyZmxvdworICAgICogW1RIUklGVC0zNzkwXSAtIEZpeCBEZWxwaGkgbmFtZWQgcGlwZSBjbGllbnQgdG8gdXNlIHRpbWVvdXQgZXZlbiB3aGVuIHBpcGUgZG9lc24ndCB5ZXQgZXhpc3QKKyAgICAqIFtUSFJJRlQtMzc4N10gLSBOb2RlLmpzIENvbm5lY3Rpb24gb2JqZWN0IGRvZXNuJ3QgaGFuZGxlIGVycm9ycyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzc5MV0gLSBEZWxwaGkgcGlwZSBjbGllbnQgbWF5IGZhaWwgZXZlbiBpbiBhIG5vbi1lcnJvciBjb25kaXRpb24KKyAgICAqIFtUSFJJRlQtMzc3MV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZ2V0cyBpbiBpbnZhbGlkIHN0YXRlIG9uIHJlYWQvd3JpdGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTM3NjRdIC0gUEhQICJtYWtlIGluc3RhbGwiIGRvZXMgbm90IGluc3RhbGwgVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIG5vciBUU2ltcGxlSlNPTlByb3RvY29sLnBocAorICAgICogW1RIUklGVC0zNzY4XSAtIFRUaHJlYWRlZFNlcnZlciBtYXkgY3Jhc2ggaWYgaXQgaXMgZGVzdHJveWVkIGltbWVkaWF0ZWx5IGFmdGVyIGl0IHJldHVybnMgZnJvbSBzZXJ2ZSgpOyBUVGhyZWFkZWRTZXJ2ZXIgZGlzY29ubmVjdHMgY2xpZW50cworICAgICogW1RIUklGVC0zNzY1XSAtIG1lbW9yeSBsZWFrIGluIHB5dGhvbiBjb21wYWN0IHByb3RvY29sIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zNzU4XSAtIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6Z2V0VHlwZSBhbmQgVFByb3RvY29sRXhjZXB0aW9uOjpnZXRUeXBlIHNob3VsZCBiZSBjb25zdAorICAgICogW1RIUklGVC0zNzYzXSAtIEZpeCBzZXJpYWxpemF0aW9uIG9mIGk2NCBsYXJnZXIgdGhhbiAyXjUzIGZvciBicm93c2VyaWZ5CisgICAgKiBbVEhSSUZULTM3NTldIC0gcmVxdWlyZWQgZmllbGRzIHRoYXQgYXJlIG5pbCBhcmUgc2lsZW50bHkgaWdub3JlZCBvbiB3cml0ZQorICAgICogW1RIUklGVC0zNzUzXSAtIFRTZXJ2ZXJGcmFtZXdvcms6OnN0b3AgbWF5IGZhaWwgdG8gaW50ZXJydXB0IGNvbm5lY3RlZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3NTVdIC0gVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nIGhpdHMgYXNzZXJ0IGluIGlzcHJpbnQgb24gV2luZG93cyB3aXRoIGRlYnVnIENSVAorICAgICogW1RIUklGVC0zNzUxXSAtIENvbXBpbGVyIGFsbG93cyBmaWVsZCBpZHMgdGhhdCBhcmUgdG9vIGxhcmdlIGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0zNzQ4XSAtIE5vZGUuanMgRGVzZXJpYWxpemF0aW9uIG9mIGxpc3RzIG9mIGxpc3RzIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNzYwXSAtIEZpeCBpbnN0YWxsIHBhdGhzIGV0YyBvZiBkZWJpYW4gcGFja2FnZXMgZm9yIHB5IGFuZCBwZXJsCisgICAgKiBbVEhSSUZULTM3NTddIC0gRml4IHZhcmlvdXMgYnVpbGQgd2FybmluZ3Mgb24gV2luZG93cyB3aXRoIFZTMjAxNSBjb21waWxlcgorICAgICogW1RIUklGVC0zNzUwXSAtIE5TQ29weWluZyBjb3B5V2l0aFpvbmU6IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNoZWNrIGlzU2V0CisgICAgKiBbVEhSSUZULTM3NDddIC0gRHVwbGljYXRlIG5vZGUuanMgYnVpbGQgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM3NDRdIC0gVGhlIHByZWNpc2lvbiBzaG91bGQgYmUgMTcgKDE2IGJpdHMgbmVlZCBhZnRlciBkb3QpIGFmdGVyIGRvdCBmb3IgZG91YmxlIHR5cGUuCisgICAgKiBbVEhSSUZULTM3NDFdIC0gaGF4ZSB0ZXN0IGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNzM5XSAtIERlcHJlY2F0aW9uIHdhcm5pbmcgaW4gY29kZWdlbi9iYXNlLmQKKyAgICAqIFtUSFJJRlQtMzczNV0gLSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTM3MzRdIC0gVG8gY29tcGFyZSB0d28gc3RyaW5nIGFzIGxvd2VyY2FzZS4KKyAgICAqIFtUSFJJRlQtMzc0M10gLSBKYXZhIEpTT04gcHJvdG9jb2wgbGVmdCBpbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzczMV0gLSBQZXJsIG11bHRpcGxleCB0ZXN0IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTM3MjldIC0gUmVzdHJpY3QgcmFrZSB2ZXJzaW9uCisgICAgKiBbVEhSSUZULTM3MjddIC0gSW5jb3JyZWN0IHJlcXVpcmUgcGF0aHMgaW4gTm9kZS5qcyB0dXRvcmlhbAorICAgICogW1RIUklGVC0zNzIzXSAtIEZpeCBMdWEgaW5jbHVkZSBwYXRoCisgICAgKiBbVEhSSUZULTM3MjJdIC0gRml4IGNlcnQgcGF0aCBpbiBDKysgY3Jvc3MgdGVzdHMgZm9yIG5vbi1MaW51eCBwbGF0Zm9ybQorICAgICogW1RIUklGVC0zNzI2XSAtIEZpeCBpbmNvcnJlY3QgY29uZGl0aW9uYWwgaW4gVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5CisgICAgKiBbVEhSSUZULTM3MjVdIC0gU2tpcCBhIGZsYWt5IGNyb3NzIHRlc3QgZW50cnkgKGQtZGFydCBjb21wYWN0IGZyYW1lZC1pcCkKKyAgICAqIFtUSFJJRlQtMzcyNF0gLSBGaXggaW5jb3JyZWN0IHRpbWV2YWwgY29udmVyc2lvbiBpbiBsaWJldmVudC5kCisgICAgKiBbVEhSSUZULTM3MjFdIC0gQ0xPTkUgLSB3aHkgbm90IGFkZCB1bmljb2RlIHN0cmluZ3Mgc3VwcG9ydCB0byBweXRob24gZGlyZWN0bHk/CisgICAgKiBbVEhSSUZULTM3MjBdIC0gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCgpIHJldHVybnMgMCBpZiBub3QgYWxsIHJlcXVlc3RlZCBieXRlcyBjb3VsZCBiZSByZWFkCisgICAgKiBbVEhSSUZULTM3MTldIC0gRGFydCBnZW5lcmF0b3Igc2hvdWxkIHVzZSBsb3dlckNhbWVsQ2FzZSBmb3Igc2VydmljZSBuYW1lcworICAgICogW1RIUklGVC0zOTAyXSAtIFRTb2NrZXQub3BlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzkwMV0gLSBURnJhbWVkVHJhbnNwb3J0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTM4OTNdIC0gQ29tbWFuZCBpbmplY3Rpb24gaW4gZm9ybWF0X2dvX291dHB1dAorICAgICogW1RIUklGVC0zODA3XSAtIFN3aWZ0IGNvbXBpbGVyIGRvZXMgbm90IGVzY2FwZSByZXNlcnZlZCB3b3JkcworICAgICogW1RIUklGVC0zNzk4XSAtIFRIdHRwQ2xpZW50IGRvZXMgbm90IHVzZSBwcm94eSBmcm9tIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICogW1RIUklGVC0zODA5XSAtIHdyb25nL3VudXNlZCBCSU5BUlkgdHlwZSBjb2RlCisgICAgKiBbVEhSSUZULTM4MDZdIC0gU3dpZnQgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBzZWxmLXJlZmVycmluZyBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTM4MDVdIC0gR29sYW5nIHNlcnZlciBzdXNjZXB0aWJsZSB0byBtZW1vcnkgc3Bpa2UgZnJvbSBtYWxmb3JtZWQgbWVzc2FnZQorICAgICogW1RIUklGVC0zNzk3XSAtIEdlbmVyYXRlZCBEZWxwaGkgcHJvY2Vzc29yIHNob3VsZG4ndCBlcnJvciBvdXQgb24gdGltZWQgb3V0IGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMzgxM10gLSBBcHB2ZXlvciBidWlsZHMgcmVmZXJlbmNlIGFuIG9wZW5zc2wgdmVyc2lvbiB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZQorICAgICogW1RIUklGVC0zNjU4XSAtIE1pc3NpbmcgZmlsZSBpbiBUSFJJRlQtMzU5OQorICAgICogW1RIUklGVC0zNjQ5XSAtIFB5dGhvbiBUU2FzbENsaWVudFRyYW5zcG9ydCBpbml0aWFsaXplcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGluY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM2NTBdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24gCisgICAgKiBbVEhSSUZULTM3MTNdIC0gbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2ggaXMgZmxha3kgb24gSmVua2lucworICAgICogW1RIUklGVC0zNjY4XSAtIHJhbmdlIGNoZWNrIGVycm9yIGluIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzY2M10gLSBDTWFrZSBjcHAgdGVzdCBmYWlscyB0byBidWlsZCBvbiBzeXN0ZW0gd2l0aG91dCB6bGliCisgICAgKiBbVEhSSUZULTM3MTJdIC0gVFRvcm5hZG9TZXJ2ZXIgY2Fubm90IGhhbmRsZSBJUHY2IGFkZHJlc3MKKyAgICAqIFtUSFJJRlQtMzcxMF0gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBjYW1lbCBjYXNlIENvbnN0YW50cyBjbGFzcyBuYW1lcworICAgICogW1RIUklGVC0zNjk3XSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IG5hbWUgaW1wb3J0cworICAgICogW1RIUklGVC0zNjkwXSAtIFdvcmsgYXJvdW5kIGRvY2tlciBpbWFnZSBidWlsZCBmYWlsdXJlcyBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzY4OV0gLSB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCBzdGFydCBmYWlsZWQgd2hlbiBzZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNjk1XSAtIEZpeCBEIHRlc3Qgc2NyaXB0cworICAgICogW1RIUklGVC0zNjc1XSAtIFVuaW9uIGlzIG5vdCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBUaHJpZnQgQyBHbGliCisgICAgKiBbVEhSSUZULTM2NzNdIC0gQVBJIGZhaWxzIHdpdGggc3RkOjpleGNlcHRpb24gYWZ0ZXIgYSB0aW1lb3V0IG9jY3VyZWQgaW4gZWFybGllciBhbnkgQVBJIGNhbGwKKyAgICAqIFtUSFJJRlQtMzcwOV0gLSBDb21tZW50IHN5bnRheCBjYW4gcHJvZHVjZSBicm9rZW4gY29kZQorICAgICogW1RIUklGVC0zNzA1XSAtIEdvIG1hcCBoYXMgaW5jb3JyZWN0IHR5cGVzIHdoZW4gdXNlZCB3aXRoIGZvcndhcmQtZGVmaW5lZCB0eXBlcworICAgICogW1RIUklGVC0zNzAyXSAtIEZpeCBjcm9zcyB0ZXN0cyBmb3IgRGFydCBjb21wYWN0IHByb3RvY29sICgzIGZhaWxpbmcpCisgICAgKiBbVEhSSUZULTM2ODNdIC0gQmFkWWllbGRFcnJvciBpbiB0aHJpZnQgcHk6dG9ybmFkbyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzY4Ml0gLSBEbyBub3QgcmV1c2UgcmVmdXNlZCBzb2NrZXRzIGluIHRlc3Qgc2NyaXB0cworICAgICogW1RIUklGVC0zNjgxXSAtIEZpeCBEYXJ0IHR1dG9yaWFsIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2ODBdIC0gSmF2YSBhc3luYyBwcm9jZXNzb3IgZmFpbHMgdG8gbm90aWZ5IGVycm9ycyB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3MTRdIC0gVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3QgZGVmaW5lZCBpbiBqcy9zcmMvdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTM2ODhdIC0gRml4IHNvY2tldCBiaW5kIGZhaWx1cmUgZGV0ZWN0aW9uIG9mIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzY0MV0gLSBSdWJ5IGNsaWVudCBzaG91bGQgdHJ5IHRvIGNvbm5lY3QgdG8gZXZlcnkgcmVzdWx0IG9mIGdldGFkZHJpbmZvCisgICAgKiBbVEhSSUZULTM2MzVdIC0gRCB0cmFuc3BvcnRfdGVzdCBpcyBmbGFreSBvbiBKZW5raW5zIGFuZCBUcmF2aXMKKyAgICAqIFtUSFJJRlQtMzYxOF0gLSBQeXRob24gVFNTTFNvY2tldCBkZXByZWNhdGlvbiBtZXNzYWdlIHNob3VsZCBwcmludCBjYWxsZXIncyBsb2NhdGlvbgorICAgICogW1RIUklGVC0zMTQ1XSAtIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgaGFuZGxlIGJvb2wgYW5kIGVtcHR5IGNvbnRhaW5lcnMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTMxNThdIC0gVEJhc2U8VCxGPiNkZWVwQ29weSBzaG91bGQgcmV0dXJuIFQKKyAgICAqIFtUSFJJRlQtMzE1N10gLSBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFRCYXNlPFQgZXh0ZW5kcyBUQmFzZTxULEY+LCBGIGV4dGVuZHMgVEZpZWxkSWRFbnVtPgorICAgICogW1RIUklGVC0zMTU2XSAtIE5vZGUgVExTOiBzZXJ2ZXIgZXhlY3V0ZXMgcHJvY2Vzc2luZyBsb2dpYyB0d28gZnVsbCB0aW1lcworICAgICogW1RIUklGVC0zMTU0XSAtIHR1dG9yaWFsL3B5LnRvcm5hZG8gdGhyb3cgRU9GIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMDYzXSAtIEMrKyBidWlsZCAtV3VudXNlZC1wYXJhbWV0ZXIgd2FybmluZ3Mgb24gcHJvY2Vzc29yX3Rlc3QsIFRyYW5zcG9ydFRlc3QKKyAgICAqIFtUSFJJRlQtMzA1Nl0gLSBBZGQgc3RyaW5nL2NvbGxlY3Rpb24gbGVuZ3RoIGxpbWl0cyBmb3IgUHl0aG9uIHByb3RvY29sIHJlYWRlcnMKKyAgICAqIFtUSFJJRlQtMzIzN10gLSBGaXggVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlIG1lbW9yeSBsZWFrCisgICAgKiBbVEhSSUZULTMyMzNdIC0gRml4IEMrKyBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIgd29ya2VyIGpvaW4KKyAgICAqIFtUSFJJRlQtMzIzMl0gLSBDYW5ub3QgZGVzZXJpYWxpemUganNvbiBtZXNzYWdlcyBjcmVhdGVkIHdpdGggZmllbGROYW1lc0FzU3RyaW5nIAorICAgICogW1RIUklGVC0zMjA2XSAtIEZpeCBWaXN1YWwgU3R1ZGlvIGJ1aWxkIGZhaWx1cmUgZHVlICdwdGhyZWFkX3NlbGYnOiBpZGVudGlmaWVyIG5vdCBmb3VuZAorICAgICogW1RIUklGVC0zMjAwXSAtIEpTIGFuZCBub2RlanMgZG8gbm90IGVuY29kZSBKU09OIHByb3RvY29sIGJpbmFyeSBmaWVsZHMgYXMgYmFzZTY0CisgICAgKiBbVEhSSUZULTMxOTldIC0gRXhjZXB0aW9uIGZpZWxkIGhhcyBiYXNpYyBtZXRhZGF0YQorICAgICogW1RIUklGVC0zMTgyXSAtIFRGcmFtZWRUcmFuc3BvcnQgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZSBhZnRlciBmcmFtZSBzaXplIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yNTM2XSAtIG5ldyBUU29ja2V0LCB1bmluaXRpYWxpc2VkIHZhbHVlIHJlcG9ydGVkIGJ5IHZhbGdyaW5kCisgICAgKiBbVEhSSUZULTI1MjddIC0gQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgY29kZSBnZW5lcmF0ZWQgZm9yIE5vZGUuanMgc2hvdWxkIGJlIGpzaGludCBjbGVhbgorICAgICogW1RIUklGVC0yNTE5XSAtICJwcm9jZXNzb3IiIGNsYXNzIGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMjQzMV0gLSBURmlsZVRyYW5zcG9ydFRlc3QgZmFpbHMgd2l0aCAiY2hlY2sgZGVsdGEgPCBYWFggZmFpbGVkIgorICAgICogW1RIUklGVC0yNzA4XSAtIEVybGFuZyBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgIm9uZXdheSIgbWVzc2FnZSB0eXBlCisgICAgKiBbVEhSSUZULTMzNzddIC0gRGVlcCBjb3B5IGlzIGFjdHVhbGx5IHNoYWxsb3cgd2hlbiB1c2luZyB0eXBlZGVmIG1lbWJlcnMKKyAgICAqIFtUSFJJRlQtMzM3Nl0gLSBDIyBhbmQgUHl0aG9uIEpTT04gcHJvdG9jb2wgZG91YmxlIHZhbHVlcyBsb3NlIHByZWNpc2lvbgorICAgICogW1RIUklGVC0zMzczXSAtIFZhcmlvdXMgZml4ZXMgZm9yIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cworICAgICogW1RIUklGVC0zMzcwXSAtIGVycm5vIGV4dGVybiB2YXJpYWJsZSByZWRlZmluZWQuIE5vdCBjb21waWxpbmcgZm9yIEFuZHJvaWQKKyAgICAqIFtUSFJJRlQtMzM3OV0gLSAgUG90ZW50aWFsIG91dCBvZiByYW5nZSBwYW5pYyBpbiBHbyBKU09OIHByb3RvY29scworICAgICogW1RIUklGVC0zMzcxXSAtIEFic3RyYWN0IG5hbWVzcGFjZSBVbml4IGRvbWFpbiBzb2NrZXRzIGJyb2tlbiBpbiBDKysKKyAgICAqIFtUSFJJRlQtMzM4MF0gLSBub2RlanM6IDAuOS4yIC0+IDAuOS4zIHVwZ3JhZGUgYnJlYWtzIFByb3RvY29sIGFuZCBUcmFuc3BvcnQgcmVxdWlyZXMKKyAgICAqIFtUSFJJRlQtMzM2N10gLSBGaXggYmFkIGxpbmtzIHRvIGNvZGluZ19zdGFuZGFyZHMubWQgIzYzNCAKKyAgICAqIFtUSFJJRlQtMzQwMV0gLSBOZXN0ZWQgY29sbGVjdGlvbnMgZW1pdCBPYmplY3RpdmUtQyBjb2RlIHRoYXQgY2Fubm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzQwM10gLSBKU09OIFN0cmluZyByZWFkZXIgZG9lc24ndCByZWNvZ25pemUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycworICAgICogW1RIUklGVC0zMzYyXSAtIG1ha2UgY2hlY2sgZmFpbHMgZm9yIEMrKyBhdCB0aGUgU2VjdXJpdHlUZXN0CisgICAgKiBbVEhSSUZULTMzOTVdIC0gQ29jb2EgY29tcGlsZXIgcHJvZHVjZXMgY29ycnVwdCBjb2RlIHdoZW4gYm94aW5nIGVudW1zIGluc2lkZSBtYXAuCisgICAgKiBbVEhSSUZULTMzOTRdIC0gY29tcGlsZXIgZ2VuZXJhdGVzIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTMzODhdIC0gaGFzaCBkb2Vzbid0IHdvcmsgb24gc2V0L2xpc3QKKyAgICAqIFtUSFJJRlQtMzM5MV0gLSBXcm9uZyBib29sIGZvcm1hdHRpbmcgaW4gdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzM5MF0gLSBUVG9ybmFkbyBzZXJ2ZXIgZG9lc24ndCBoYW5kbGUgY2xvc2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTMzODJdIC0gVEJhc2UgY2xhc3MgZm9yIEMrKyBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzOTJdIC0gSmF2YSBUWmxpYlRyYW5zcG9ydCBkb2VzIG5vdCBjbG9zZSBpdHMgd3JhcHBlciBzdHJlYW1zIHVwb24gY2xvc2UoKQorICAgICogW1RIUklGVC0zMzgzXSAtIGk2NCByZWxhdGVkIHdhcm5pbmdzIAorICAgICogW1RIUklGVC0zMzg2XSAtIG1pc2MuIHdhcm5pbmdzIHdpdGggbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zMzg1XSAtIHdhcm5pbmc6IGZvcm1hdCDigJglbHXigJkgZXhwZWN0cyDigJhsb25nIHVuc2lnbmVkIGludOKAmSwgYnV0IGhhcyB0eXBlIOKAmHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OjpzaXplX3R5cGUge2FrYSB1bnNpZ25lZCBpbnR9CisgICAgKiBbVEhSSUZULTMzNTVdIC0gbnBtIFdBUk4gcGFja2FnZS5qc29uIHRocmlmdEAxLjAuMC1kZXYgTm8gbGljZW5zZSBmaWVsZC4KKyAgICAqIFtUSFJJRlQtMzM2MF0gLSBJbXByb3ZlIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cyBmdXJ0aGVyCisgICAgKiBbVEhSSUZULTMzNTldIC0gQmluYXJ5IGZpZWxkIGluY29tcGF0aWJpbGl0aWVzCisgICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorICAgICogW1RIUklGVC0zMzUwXSAtIFB5dGhvbiBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgYXMgQmFzZTY0CisgICAgKiBbVEhSSUZULTM1NzddIC0gYXNzZXJ0aW9uIGZhaWxlZCBhdCBsaW5lIDUxMiBvZiB0ZXN0Y29udGFpbmVydGVzdC5jCisgICAgKiBbVEhSSUZULTM1NzZdIC0gQm9vc3QgdGVzdCAtLWxvZ19mb3JtYXQgYXJnIGRvZXMgbm90IGFjY2VwdCBsb3dlcmNhc2UKKyAgICAqIFtUSFJJRlQtMzU3NV0gLSBHbyBjb21waWxlciB0cmllcyB0byB1c2UgdW5leHBvcnRlZCBsaWJyYXJ5IG1ldGhvZHMgd2hlbiB1c2luZyByZWFkX3dyaXRlX3ByaXZhdGUKKyAgICAqIFtUSFJJRlQtMzU3NF0gLSBDb2NvYSBnZW5lcmF0b3IgbWFrZXMgdW5jb21waWxhYmxlIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtMzU3MF0gLSBSZW1vdmUgZHVwbGljYXRlIGluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCBieSB1cHN0cmVhbQorICAgICogW1RIUklGVC0zNTcxXSAtIE1ha2UgZmVhdHVyZSB0ZXN0IHJlc3VsdCBicm93c2FibGUKKyAgICAqIFtUSFJJRlQtMzU2OV0gLSBjX2dsaWIgcHJvdG9jb2xzIGRvIG5vdCBjaGVjayBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzU2OF0gLSBUSGVhZGVyIHNlcnZlciBjcmFzaGVzIG9uIHJlYWRTbG93CisgICAgKiBbVEhSSUZULTM1NjddIC0gR0xpYi1HT2JqZWN0LUNSSVRJQ0FMICoqOiBnX29iamVjdF91bnJlZjogYXNzZXJ0aW9uICdHX0lTX09CSkVDVCAob2JqZWN0KScgZmFpbGVkCisgICAgKiBbVEhSSUZULTM1NjZdIC0gQysrL1F0OiBUUVRjcFNlcnZlclRlc3Q6OnRlc3RfY29tbXVuaWNhdGUoKSBpcyBuZXZlciBleGVjdXRlZAorICAgICogW1RIUklGVC0zNTY0XSAtIEMrKy9RdDogcG90ZW50aWFsIGNvcmUgZHVtcCBpbiBUUVRjcFNlcnZlciBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gVEFzeW5jUHJvY2Vzc29yOjpwcm9jZXNzKCkKKyAgICAqIFtUSFJJRlQtMzU1OF0gLSB0eXBvcyBpbiBjX2dsaWIgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzU1OV0gLSBGaXggYXdrd2FyZCBleHRyYSBzZW1pLWNvbG9ucyB3aXRoIENvY29hIGNvbnRhaW5lciBsaXRlcmFscworICAgICogW1RIUklGVC0zNTU1XSAtICdjb25maWd1cmUnIHNjcmlwdCBkb2VzIG5vdCBob25vciAtLXdpdGgtb3BlbnNzbD08cGF0aD4gZm9yIGxpYmNyeXB0byBmb3IgQk5faW5pdAorICAgICogW1RIUklGVC0zNTU0XSAtIENvbnN0YW50IGRlY2xzIG1heSBsZWFkIHRvICJFcnJvcjogaW50ZXJuYWwgZXJyb3I6IHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygpIGFscmVhZHkgYWN0aXZlIGZvciBkaWZmZXJlbnQgc3RydWN0IgorICAgICogW1RIUklGVC0zNTUyXSAtIGdsaWJfYyBNZW1vcnkgTGVhaworICAgICogW1RIUklGVC0zNTUxXSAtIFRocmlmdCBwZXJsIGxpYnJhcnkgbWlzc2luZyBwYWNrYWdlIGRlY2xhcmF0aW9uCisgICAgKiBbVEhSSUZULTM1NDldIC0gRXhjZXB0aW9ucyBhcmUgbm90IHByb3Blcmx5IHN0cmluZ2lmaWVkIGluIFBlcmwgbGlicmFyeQorICAgICogW1RIUklGVC0zNTQ2XSAtIE5vZGVKUyBjb2RlIHNob3VsZCBub3QgYmUgbmFtZXNwYWNlZCAoYW5kIGlzIGN1cnJlbnRseSBub3Qgc3RyaWN0LW1vZGUgY29tcGxpYW50KQorICAgICogW1RIUklGVC0zNTQ1XSAtIENvbnRhaW5lciB0eXBlIGxpdGVyYWxzIGRvIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTM1MzhdIC0gUmVtb3ZlIFVuYm91bmRNZXRob2RUeXBlIGluIFRQcm90b2NvbERlY29yYXRvcgorICAgICogW1RIUklGVC0zNTM2XSAtIEVycm9yICdjaGFyJyBkb2VzIG5vdCBjb250YWluIGEgZGVmaW5pdGlvbiBmb3IgJ0lzTG93U3Vycm9nYXRlJyBmb3IgV1A3IHRhcmdldAorICAgICogW1RIUklGVC0zNTM0XSAtIExpbmsgZXJyb3Igd2hlbiBidWlsZGluZyB3aXRoIFF0NQorICAgICogW1RIUklGVC0zNTMzXSAtIENhbiBub3Qgc2VuZCBuaWwgcG9pbnRlciBhcyBzZXJ2aWNlIG1ldGhvZCBhcmd1bWVudAorICAgICogW1RIUklGVC0zNTA3XSAtIFRIdHRwQ2xpZW50IGRvZXMgbm90IHVzZSBwcm94eSBmcm9tIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICogW1RIUklGVC0zNTAyXSAtIEMrKyBUU2VydmVyU29ja2V0IHBhc3NlcyBzbWFsbCBidWZmZXIgdG8gZ2V0c29ja25hbWUKKyAgICAqIFtUSFJJRlQtMzUwMV0gLSBGb3J3YXJkIHNsYXNoIGluIGNvbW1lbnQgY2F1c2VzIGNvbXBpbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM0OThdIC0gQysrIGxpYnJhcnkgYXNzdW1lcyBvcHRpb25hbCBmdW5jdGlvbiBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgaXMgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM0OTddIC0gQnVpbGQgZmFpbHMgd2l0aCAiaW52YWxpZCB1c2Ugb2YgaW5jb21wbGV0ZSB0eXBlIgorICAgICogW1RIUklGVC0zNDk2XSAtIEMrKzogQ29iIHN0eWxlIGNsaWVudCBmYWlscyB3aGVuIHNlbmRpbmcgYSBjb25zZWN1dGl2ZSByZXF1ZXN0CisgICAgKiBbVEhSSUZULTM0OTNdIC0gbGlidGhyaWZ0IGRvZXMgbm90IGNvbXBpbGUgb24gd2luZG93cyB1c2luZyB2aXN1YWwgc3R1ZGlvCisgICAgKiBbVEhSSUZULTM0ODhdIC0gd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdwcm9ncmFtJworICAgICogW1RIUklGVC0zNDg5XSAtIHdhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbiBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIFstV3dyaXRlLXN0cmluZ3NdCisgICAgKiBbVEhSSUZULTM0ODddIC0gRnVsbCBzdXBwb3J0IGZvciBuZXdlciBEZWxwaGkgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMzUyOF0gLSBGaXggd2FybmluZ3MgaW4gdGhyaWZ0LmxsCisgICAgKiBbVEhSSUZULTM1MjddIC0gLWdlbiBweTpkeW5hbWljLHV0ZjhzdHJpbmdzIGlnbm9yZXMgdXRmOHN0cmluZ3Mgb3B0aW9uCisgICAgKiBbVEhSSUZULTM1MjZdIC0gQ29kZSBnZW5lcmF0ZWQgYnkgcHk6dXRmOHN0cmluZ3MgZG9lcyBub3Qgd29yayBmb3IgUHl0aG9uMworICAgICogW1RIUklGVC0zNTI0XSAtIGRjYzMyIHdhcm5pbmcgIlcxMDAwIFN5bWJvbCAnSXNMb3dTdXJyb2dhdGUnIGlzIGRlcHJlY2F0ZWQ6ICdVc2UgVENoYXJIZWxwZXInIiBpbiBUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKKyAgICAqIFtUSFJJRlQtMzUyNV0gLSBweTpkeW5hbWljIGZhaWxzIHRvIGhhbmRsZSBiaW5hcnkgbGlzdC9zZXQvbWFwIGVsZW1lbnQKKyAgICAqIFtUSFJJRlQtMzUyMV0gLSBUU2ltcGxlSlNPTlByb3RvY29sVGVzdCBpcyBub3QgZGV0ZXJtaW5pc3RpYyAoZmFpbHMgd2hlbiBydW4gb24gSkRLIDgpCisgICAgKiBbVEhSSUZULTM1MjBdIC0gRGFydCBUU29ja2V0IG9uRXJyb3Igc3RyZWFtIHNob3VsZCBiZSB0eXBlZCBhcyBPYmplY3QKKyAgICAqIFtUSFJJRlQtMzUxOV0gLSBmYXN0YmluYXJ5IGRvZXMgbm90IHdvcmsgd2l0aCAtZ2VuIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTM1MThdIC0gVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBmaWxlcyB3ZXJlIG1pc3NpbmcgZm9yIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMzUxMl0gLSBjX2dsaWI6IEJ1aWxkIGZhaWxzIGR1ZSB0byBtaXNzaW5nIGZlYXR1cmVzLmgKKyAgICAqIFtUSFJJRlQtMzQ4M10gLSBJbmNvcnJlY3QgZW1wdHkgYmluYXJ5IGhhbmRsaW5nIGludHJvZHVjZWQgYnkgVEhSSUZULTMzNTkKKyAgICAqIFtUSFJJRlQtMzQ3OV0gLSBPbmV3YXkgY2FsbHMgc2hvdWxkIG5vdCByZXR1cm4gZXhjZXB0aW9ucyB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM0NzhdIC0gUmVzdG9yZSBkcm9wcGVkIG1ldGhvZCB0byBUSHNIYVNlcnZlci5qYXZhCisgICAgKiBbVEhSSUZULTM0NzddIC0gUGFyc2VyIGZhaWxzIG9uIGVudW0gaXRlbSB0aGF0IHN0YXJ0cyB3aXRoICdFJyBsZXR0ZXIgYW5kIGNvbnRpbnVlcyB3aXRoIG51bWJlciAKKyAgICAqIFtUSFJJRlQtMzQ3Nl0gLSBNaXNzaW5nIGluY2x1ZGUgaW4gLi9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICAgKiBbVEhSSUZULTM0NzRdIC0gRG9ja2VyOiB0aHJpZnQtY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzQ3M10gLSBXaGVuICJvcHRpb25hbCcgaXMgdXNlZCB3aXRoIGEgc3RydWN0IG1lbWJlciwgQysrIHNlcnZlciBzZWVtcyB0byBub3QgcmV0dXJuIGl0IGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNDY4XSAtIERhcnQgVFNvY2tldFRyYW5zcG9ydCBvbkVycm9yIGhhbmRsZXIgaXMgdG9vIHJlc3RyaWN0aXZlCisgICAgKiBbVEhSSUZULTM0NTFdIC0gdGhyaWZ0X3Byb3RvY29sIFBIUCBleHRlbnNpb24gbWlzc2luZyBjb25maWcubTQgZmlsZQorICAgICogW1RIUklGVC0zNDU2XSAtIHJvdW5kaW5nIGlzc3VlIGluIHN0YXRpYyBhc3NlcnQKKyAgICAqIFtUSFJJRlQtMzQ1NV0gLSBzdHJ1Y3Qgd3JpdGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIGlzIGluY29ycmVjdAorICAgICogW1RIUklGVC0zNDU0XSAtIFB5dGhvbiBUb3JuYWRvIHR1dG9yaWFsIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNDYzXSAtIEphdmEgY2FuJ3QgYmUgZGlzYWJsZWQgaW4gQ01ha2UgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzQ1MF0gLSBOUEUgd2hlbiB1c2luZyBTU0wKKyAgICAqIFtUSFJJRlQtMzQ0OV0gLSBUQmFzZUFzeW5jUHJvY2Vzc29yIGZiLnJlc3BvbnNlUmVhZHkoKSBuZXZlciBjYWxsZWQgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMzQ3MV0gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgdXBwZXJjYXNlIGFyZ3VtZW50IG5hbWVzCisgICAgKiBbVEhSSUZULTM0NzBdIC0gU3BvcmFkaWMgdGltZW91dHMgd2l0aCBwaXBlcworICAgICogW1RIUklGVC0zNDY1XSAtIEdvIENvZGUgV2l0aCBDb21wbGV4IENvbnN0IEluaXRpYWxpemVyIENvbXBpbGF0aW9uIERlcGVuZHMgT24gU3RydWN0IE9yZGVyCisgICAgKiBbVEhSSUZULTM0NjRdIC0gRml4IHNldmVyYWwgZGVmZWN0cyBpbiBjX2dsaWIgY29kZSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzQ2Ml0gLSBDb2NvYSBnZW5lcmF0ZXMgSW5jb3JyZWN0ICNpbXBvcnQgaGVhZGVyIG5hbWVzCisgICAgKiBbVEhSSUZULTM0NTNdIC0gcmVtb3ZlIHJhdF9leGNsdWRlCisgICAgKiBbVEhSSUZULTM0MThdIC0gVXNlIG9mIGNpcGhlcnMgaW4gc3NsLndyYXBfc29ja2V0KCkgYnJlYWtzIHB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eQorICAgICogW1RIUklGVC0zNDE3XSAtICJuYW1lc3BhY2UgeHNkIiBpcyBub3QgcmVhbGx5IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMzQxM10gLSBUaHJpZnQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBHbyB3aGVuIGV4dGVuZGluZyBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTM0MjBdIC0gQysrOiBUU1NMU29ja2V0cyBhcmUgbm90IGludGVycnVwdGFibGUKKyAgICAqIFtUSFJJRlQtMzQxNV0gLSBpbmNsdWRlIHVuaXN0ZC5oIGNvbmRpdGlvbmFsbHkKKyAgICAqIFtUSFJJRlQtMzQxNF0gLSAjaW5jbHVkZSA8cHdkLmg+IGluIFRIZWFkZXJUcmFuc3BvcnQuaCBicmVha3Mgd2luZG93cyBidWlsZAorICAgICogW1RIUklGVC0zNDExXSAtIEdvIGdlbmVyYXRlcyByZW1vdGVzIHdpdGggd3JvbmcgcGFja2FnZSBxdWFsaWZpZXJzIHdoZW4gaW5jbHVkaW5nCisgICAgKiBbVEhSSUZULTM0MzBdIC0gR28gVEh0dHBDbGllbnQgZG9lcyBub3QgcmVhZCBIVFRQIHJlc3BvbnNlIGJvZHkgdG8gY29tcGxldGlvbiB3aGVuIGNsb3NpbmcKKyAgICAqIFtUSFJJRlQtMzQyM10gLSBGaXJzdCBjYWxsIHRvIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdCBmYWlscyB0byBkaXNwYXRjaCBjb3JyZWN0IGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTM0MjJdIC0gR28gVFNlcnZlclNvY2tldCBkb2Vzbid0IGNsb3NlIG9uIEludGVycnVwdAorICAgICogW1RIUklGVC0zNDIxXSAtIHJlYmFyIGFzIGRlcGVuZGVuY3kgaW5zdGVhZCBvZiBidW5kbGluZyAod2FzOiAgcmViYXIgZmFpbHMgaWYgUFdEIGNvbnRhaW5zIFVuaWNvZGUpCisgICAgKiBbVEhSSUZULTM0MjhdIC0gR28gdGVzdCBmYWlscyB3aGVuIHJ1bm5pbmcgbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zNDQ1XSAtIFRocm93YWJsZSBtZXNzYWdlcyBhcmUgaGlkZGVuIGZyb20gSlZNIHN0YWNrIHRyYWNlIG91dHB1dAorICAgICogW1RIUklGVC0zNDQzXSAtIFRocmlmdCBpbmNsdWRlIGNhbiBnZW5lcmF0ZSB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0zNDQ0XSAtIExhcmdlIDY0IGJpdCBJbnRlZ2VyIGRvZXMgbm90IHByZXNlcnZlIHZhbHVlIHRocm91Z2ggTm9kZS5qcyBKU09OUHJvdG9jb2wgCisgICAgKiBbVEhSSUZULTM0MzZdIC0gbWlzYy4gY3Jvc3MgdGVzdCBpc3N1ZXMgd2l0aCBVVEYtOCBwYXRoIG5hbWVzCisgICAgKiBbVEhSSUZULTM0MzVdIC0gUHV0IGdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIGZ1bGxjYW1lbCB0ZXN0cyBpbiBhIHNlcGFyYXRlIHBhY2thZ2UvbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTM0MzNdIC0gRG91YmxlcyBhcmVuJ3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM0MzddIC0gTWluZ3ctdzY0IGJ1aWxkIGZhaWwKKyAgICAqIFtUSFJJRlQtMzQzNF0gLSBEYXJ0IGdlbmVyYXRvciBwcm9kdWNlcyBlbXB0eSBuYW1lIGluIHB1YnNwZWMueWFtbCBmb3IgaW5jbHVkZXMgd2l0aG91dCBuYW1lc3BhY2VzCisgICAgKiBbVEhSSUZULTM0MDhdIC0gSlNPTiBnZW5lcmF0b3IgZW1pdHMgaW5jb3JyZWN0IHR5cGVzCisgICAgKiBbVEhSSUZULTM0MDZdIC0gQ29jb2EgY2xpZW50IHNob3VsZCBub3Qgc2NoZWR1bGUgc3RyZWFtcyBvbiBtYWluIHJ1bmxvb3AKKyAgICAqIFtUSFJJRlQtMzQwNF0gLSBKU09OIFN0cmluZyByZWFkZXIgZG9lc24ndCByZWNvZ25pemUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisgICAgKiBbVEhSSUZULTM2MzZdIC0gRG91YmxlIHByZWNpc2lvbiBpcyBub3QgZnVsbHkgcHJlc2VydmVkIGluIEMrKyBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTM2MzJdIC0gY19nbGliIHRlc3RzZXJpYWxpemF0aW9uIGZhaWxzIHdpdGggZ2xpYiBhc3NlcnRpb24KKyAgICAqIFtUSFJJRlQtMzYxOV0gLSBVc2luZyBUaHJpZnQgMC45LjMgd2l0aCBnb29nbGV0ZXN0IG9uIExpbnV4IGdjYyA0LjkgLyBDKysxMQorICAgICogW1RIUklGVC0zNjE3XSAtIENNYWtlIGRvZXMgbm90IGJ1aWxkIGd2L3htbCBnZW5lcmF0b3JzCisgICAgKiBbVEhSSUZULTM2MTVdIC0gRml4IFB5dGhvbiBTU0wgY2xpZW50IHJlc291cmNlIGxlYWsgb24gY29ubmVjdGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTM2MTZdIC0gbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzY0M10gLSBQZXJsIFNTTCBzZXJ2ZXIgY3J1c2hlcyBpZiBhIGNsaWVudCBkaXNjb25uZWN0IHdpdGhvdXQgaGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTM2MzldIC0gQyMgVGhyaWZ0IGxpYnJhcnkgZm9yY2VzIFRMUyAxLjAsIHRod2FydGluZyBUTFMgMS4yIHVzYWdlCisgICAgKiBbVEhSSUZULTM2MzNdIC0gVHJhdmlzICJDIEMrKyAtIEdDQyIgYnVpbGQgd2FzIHVzaW5nIGNsYW5nCisgICAgKiBbVEhSSUZULTM2MzRdIC0gRml4IFB5dGhvbiBUU29ja2V0IHJlc291cmNlIGxlYWsgb24gY29ubmVjdGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTM2MzBdIC0gRGViaWFuL1VidW50dSBpbnN0YWxsIGRvY3MgbmVlZCBhbiB1cGRhdGUKKyAgICAqIFtUSFJJRlQtMzYyOV0gLSBQYXJzZXIgc2V0cyBleGl0Y29kZSBvbiBlcnJvcnMsIGJ1dCBnZW5lcmF0b3IgZG9lcyBub3QKKyAgICAqIFtUSFJJRlQtMzYwOF0gLSBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0IGlzIGZsYWt5IGluIGplbmtpbnMgVGhyaWZ0LXByZWNvbW1pdCBidWlsZC4KKyAgICAqIFtUSFJJRlQtMzYwMV0gLSBCZXR0ZXIgY29uZm9ybWFuY2UgdG8gUEVQOCBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMzU5OV0gLSBWYWxpZGF0ZSBjbGllbnQgSVAgYWRkcmVzcyBhZ2FpbnN0IGNlcnQncyBTdWJqZWN0QWx0TmFtZQorICAgICogW1RIUklGVC0zNTk4XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGluc3RhbnRpYXRlIGNsaWVudCBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTM1OTddIC0gYG1ha2UgY2hlY2tgIGhhbmdzIGluIGdvIHRlc3RzCisgICAgKiBbVEhSSUZULTM1ODldIC0gRGFydCBnZW5lcmF0b3IgdXNlcyB3cm9uZyBuYW1lIGluIGNvbnN0cnVjdG9yIGZvciB1cHBlcmNhc2UgYXJndW1lbnRzIHdpdGggZGVmYXVsdHMKKyAgICAqIFtUSFJJRlQtMzU4OF0gLSBVc2luZyBUeXBlU2NyaXB0IHdpdGggLS1ub0ltcGxpY2l0QW55IGZhaWxzCisgICAgKiBbVEhSSUZULTM1ODRdIC0gYm9vbGVhbiBmYWxzZSB2YWx1ZSBjYW5ub3QgYmUgdHJhbnNmZXJyZWQKKyAgICAqIFtUSFJJRlQtMzU3OF0gLSBNYWtlIFRIZWFkZXJUcmFuc3BvcnQgZGV0ZWN0IFRDb21wYWN0IGZyYW1lZCBhbmQgdW5mcmFtZWQKKyAgICAqIFtUSFJJRlQtMzMyM10gLSBQeXRob24gbGlicmFyeSBkb2VzIG5vdCBoYW5kbGUgZXNjYXBlZCBmb3J3YXJkIHNsYXNoICgiLyIpIGluIEpTT04KKyAgICAqIFtUSFJJRlQtMzMyMl0gLSBDTWFrZSBnZW5lcmF0ZWQgIm1ha2UgY2hlY2siIGZhaWxlcyBvbiBweXRob25fdGVzdAorICAgICogW1RIUklGVC0zMzIxXSAtIFRocmlmdCBjYW4ndCBiZSBhZGRlZCBhcyBhIHN1YmRpcmVjdG9yeSBvZiBhbm90aGVyIENNYWtlLWJhc2VkIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMzMxNF0gLSBEb3RzIGluIGZpbGUgbmFtZXMgb2YgaW5jbHVkZXMgY2F1c2VzIGRvdHMgaW4gamF2YXNjcmlwdCB2YXJpYWJsZSBuYW1lcworICAgICogW1RIUklGVC0zMzA3XSAtIFNlZ2ZhdWx0IGluIFJ1Ynkgc2VyaWFsaXplcgorICAgICogW1RIUklGVC0zMzA5XSAtIE1pc3NpbmcgVENvbnN0YW50LnBocCBpbiAvbGliL3BocC9NYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0zODEwXSAtIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9sIHB1YmxpYzogdmlydHVhbCB2b2lkIF9fY2RlY2wgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckZyYW1ld29yazo6c2VydmUodm9pZCkKKyAgICAqIFtUSFJJRlQtMzczNl0gLSBDKysgbGlicmFyeSBidWlsZCBmYWlscyBpZiBPcGVuU1NMIGRvZXMgbm90IHN1cnJwb3QgU1NMdjMKKyAgICAqIFtUSFJJRlQtMzg3OF0gLSBDb21waWxlIGVycm9yIGluIFRTU0xTb2NrZXQuY3BwIHdpdGggbmV3IE9wZW5TU0wgW0NSWVBUT19udW1fbG9ja3NdCisgICAgKiBbVEhSSUZULTM5NDldIC0gbWlzc2luZyBtYWtlIGRpc3QgZW50cnkgZm9yIGNvbXBpbGVyL2NwcC90ZXN0CisgICAgKiBbVEhSSUZULTQ0OV0gLSBUaGUgd2lyZSBmb3JtYXQgb2YgdGhlIEpTT04gUHJvdG9jb2wgbWF5IG5vdCBhbHdheXMgYmUgdmFsaWQgSlNPTiBpZiBpdCBjb250YWlucyBub24tVVRGOCBlbmNvZGVkIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMTYyXSAtIFRocmlmdCBzdHJ1Y3R1cmVzIGFyZSB1bmhhc2hhYmxlLCBwcmV2ZW50aW5nIHRoZW0gZnJvbSBiZWluZyB1c2VkIGFzIHNldCBlbGVtZW50cworICAgICogW1RIUklGVC0zOTYxXSAtIFRDb25uZWN0ZWRDbGllbnQgZG9lcyBub3QgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgaWYgYW4gZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIG1lc3NhZ2Ugb2NjdXJlcy4KKyAgICAqIFtUSFJJRlQtMzg4MV0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBkb2NrZXIgZmFpbHVyZXMgKHRocmVlIHJldHJpZXMsIGFuZCBnaXZlcyB1cCkKKyAgICAqIFtUSFJJRlQtMzkzN10gLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggZ2NjLTQuNi54CisgICAgKiBbVEhSSUZULTM5NjRdIC0gVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgPz8/Pz8gZHVlIHRvIGRlcGVuZGVuY3kgb24gZGVmYXVsdCBPUy1kZXBlbmRlbnQgY2hhcnNldAorICAgICogW1RIUklGVC0zMDM4XSAtIFVzZSBvZiB2b2xhdGlsZSBpbiBjcHAgbGlicmFyeQorICAgICogW1RIUklGVC0zMzAxXSAtIEphdmEgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbXBvcnRzIHRoYXQgY2FuIGxlYWQgdG8gY2xhc3MgbmFtZSBjb2xsaXNpb25zIHdpdGggSURMIGRlZmluZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzM0OF0gLSBQSFAgVENvbXBhY3RQcm90b2NvbCBib29sJmludDY0IHJlYWR2YWx1ZSBidWcKKyAgICAqIFtUSFJJRlQtMzk1NV0gLSBUVGhyZWFkZWRTZXJ2ZXIgTWVtb3J5IExlYWsKKyAgICAqIFtUSFJJRlQtMzgyOV0gLSBUaHJpZnQgZG9lcyBub3QgaW5zdGFsbCBQeXRob24gTGlicmFyaWVzIGlmIFR3aXN0ZWQgaXMgbm90IGluc3RhbGxlZAorICAgICogW1RIUklGVC0zOTMyXSAtIEMrKyBUaHJlYWRNYW5hZ2VyIGhhcyBhIHJhcmUgdGVybWluYXRpb24gcmFjZQorICAgICogW1RIUklGVC0zODI4XSAtIGNtYWtlIGZhaWxzIHdoZW4gQm9vc3RfSU5DTFVERV9ESVJTIChhbmQgb3RoZXIgdmFyaWFibGVzIHBhc3NlZCB0byBpbmNsdWRlX2RpcmVjdG9yaWVzKCkpIGlzIGVtcHR5IAorICAgICogW1RIUklGVC0zOTU4XSAtIENNYWtlIFdJVEhfTVQgb3B0aW9uIGZvciB3aW5kb3dzIHN0YXRpYyBydW50aW1lIGxpbmtpbmcgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY21ha2UgYnVpbGQgdHlwZSBSZWxXaXRoRGViSW5mbworICAgICogW1RIUklGVC0zOTU3XSAtIFRDb25uZWN0ZWRDbGllbnQgZG9lcyBub3QgZGlzY29ubmVjdCBmcm9tIGNsaWVudHMgd2hlbiB0aGVpciB0aW1lb3V0IGlzIHJlYWNoZWQuCisgICAgKiBbVEhSSUZULTM5NTNdIC0gVFNTTFNvY2tldDo6Y2xvc2Ugc2hvdWxkIGhhbmRsZSBleGNlcHRpb25zIGZyb20gd2FpdEZvckV2ZW50IGJlY2F1c2UgaXQgaXMgY2FsbGVkIGJ5IHRoZSBkZXN0cnVjdG9yLgorICAgICogW1RIUklGVC0zOTc3XSAtIFBIUCBleHRlbnNpb24gY3JlYXRlcyB1bmRlZmluZWQgdmFsdWVzIHdoZW4gZGVzZXJpYWxpemluZyBzZXRzCisgICAgKiBbVEhSSUZULTM5NDddIC0gc29ja2FkZHIgdHlwZSBpc24ndCBhbHdheXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgcmV0dXJuIG9mIGdldHNvY2tuYW1lCisgICAgKiBbVEhSSUZULTI3NTVdIC0gVGhyZWFkU2FuaXRpemVyIHJlcG9ydHMgZGF0YSByYWNlIGluIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcgorICAgICogW1RIUklGVC0zOTQ4XSAtIGVycm5vIGlzIG5vdCB0aGUgY29ycmVjdCBtZXRob2Qgb2YgZ2V0dGluZyB0aGUgZXJyb3IgaW4gd2luZG93cworICAgICogW1RIUklGVC00MDA4XSAtIGJyb2tlbiBjaSBkdWUgdG8gdXBzdHJlYW0gZGVwZW5kZW5jeSB2ZXJzaW9uaW5nIGJyZWFrCisgICAgKiBbVEhSSUZULTM5OTldIC0gRml4IERlYmlhbiAmIFVidW50dSBwYWNrYWdlIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC0zODg2XSAtIFBIUCBjcm9zcyB0ZXN0IGNsaWVudCByZXR1cm5zIDAgZXZlbiB3aGVuIGZhaWxpbmcKKyAgICAqIFtUSFJJRlQtMzk5N10gLSBidWlsZGluZyB0aHJpZnQgbGlicyBkb2VzIG5vdCBzdXBwb3J0IG5ldyBvcGVuc3NsCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzg2N10gLSBTcGVjaWZ5IEJpbmFyeVByb3RvY29sIGFuZCBDb21wYWN0UHJvdG9jb2wKKworIyMgRXBpYworICAgICogW1RIUklGVC0zMDQ5XSAtIEFzIGFuIGlPUyBkZXZlbG9wZXIsIEkgd2FudCBhIGdlbmVyYXRvciBhbmQgbGlicmFyeSB0aGF0IHByb2R1Y2VzIFN3aWZ0IGNvZGUKKyAgICAqIFtUSFJJRlQtMjMzNl0gLSBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTg2N10gLSBQeXRob24gY2xpZW50L3NlcnZlciBzaG91bGQgc3VwcG9ydCBjbGllbnQtc2lkZSBjZXJ0aWZpY2F0ZXMuCisgICAgKiBbVEhSSUZULTEzMTNdIC0gY19nbGliIGNvbXBhY3Qgc3VwcG9ydAorICAgICogW1RIUklGVC0xMzg1XSAtIG1ha2UgaW5zdGFsbCBkb2Vzbid0IGluc3RhbGwgamF2YSBsaWJyYXJ5IGluIHRoZSBzZXR0ZWQgZm9sZGVyCisgICAgKiBbVEhSSUZULTE0MzddIC0gVXBkYXRlIFJQTSBzcGVjCisgICAgKiBbVEhSSUZULTg0N10gLSBUZXN0IEZyYW1ld29yayBoYXJtb25pemF0aW9uIGFjcm9zcyBhbGwgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTgxOV0gLSBhZGQgRW51bWVyYXRpb24gZm9yIHByb3RvY29sLCB0cmFuc3BvcnQgYW5kIHNlcnZlciB0eXBlcworICAgICogW1RIUklGVC0zOTI3XSAtIEVtaXQgYW4gZXJyb3IgaW5zdGVhZCBvZiB0aHJvdyBhbiBlcnJvciBpbiB0aGUgYXN5bmMgY2FsbGJhY2sKKyAgICAqIFtUSFJJRlQtMzkzMV0gLSBUU2ltcGxlU2VydmVyOiBJZiBwcm9jZXNzIHJlcXVlc3QgZW5jb3VudGVyIFVOS05PV05fTUVUSE9ELCBkb24ndCBjbG9zZSB0cmFuc3BvcnQuCisgICAgKiBbVEhSSUZULTM5MzRdIC0gQXV0b21hdGljYWxseSByZXNvbHZlIE9wZW5TU0wgYmluYXJ5IHZlcnNpb24gb24gV2luZG93cyBDSQorICAgICogW1RIUklGVC0zOTE4XSAtIFJ1biBzdWJzZXQgb2YgbWFrZSBjcm9zcworICAgICogW1RIUklGVC0zOTA4XSAtIFJlbW92ZSByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZyb20gRG9ja2VyZmlsZQorICAgICogW1RIUklGVC0zOTA3XSAtIFNraXAgRG9ja2VyIGltYWdlIGJ1aWxkIG9uIENJIHdoZW4gdW5jaGFuZ2VkCisgICAgKiBbVEhSSUZULTM4NjhdIC0gSmF2YSBzdHJ1Y3QgZXF1YWxzIHNob3VsZCBkbyBpZGVudGl0eSBjaGVjayBiZWZvcmUgZmllbGQgY29tcGFyaXNvbgorICAgICogW1RIUklGVC0zODQ5XSAtIFBvcnQgR28gc2VyaWFsaXplciBhbmQgZGVzZXJpYWxpemVyIHRvIGRhcnQKKyAgICAqIFtUSFJJRlQtMjk4OV0gLSBDb21wbGV0ZSBDTWFrZSBidWlsZCBmb3IgQXBhY2hlIFRocmlmdAorICAgICogW1RIUklGVC0yOTgwXSAtIFRocmlmdE1lbW9yeUJ1ZmZlciBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBvcHRpb24gdG8gdGFrZSBhbiBleGlzdGluZyBidWZmZXIKKyAgICAqIFtUSFJJRlQtMjg1Nl0gLSByZWZhY3RvciBlcmxhbmcgYmFzaWMgdHJhbnNwb3J0cyBhbmQgdW5pZnkgaW50ZXJmYWNlcworICAgICogW1RIUklGVC0yODc3XSAtIE9wdGltaXplIGdlbmVyYXRlZCBoYXNoQ29kZQorICAgICogW1RIUklGVC0yODY5XSAtIEpTT046IHJ1biBzY2hlbWEgdmFsaWRhdGlvbiBmcm9tIHRlc3RzCisgICAgKiBbVEhSSUZULTMxMTJdIC0gW0phdmFdIEFzeW5jTWV0aG9kQ2FsbGJhY2sgc2hvdWxkIGJlIHR5cGVkIGluIGdlbmVyYXRlZCBBc3luY0lmYWNlCisgICAgKiBbVEhSSUZULTMyNjNdIC0gUEhQIGpzb25TZXJpYWxpemUoKSBzaG91bGQgY2FzdCBzY2FsYXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMjkwNV0gLSBDb2NvYSBjb21waWxlciBzaG91bGQgaGF2ZSBvcHRpb24gdG8gcHJvZHVjZSAibW9kZXJuIiBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0yODIxXSAtIEVuYWJsZSB0aGUgdXNlIG9mIGN1c3RvbSBIVFRQLUhlYWRlciBpbiB0aGUgVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwOTNdIC0gYWRkZWQgdGhlIGFiaWxpdHkgdG8gc2V0IGNvbXByZXNzaW9uIGxldmVsIGluIEMrKyB6bGliIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDg5XSAtIENvbXBpbGVyIGlnbm9yZXMgZHVwbGljYXRlIHR5cGVuYW1lcworICAgICogW1RIUklGVC0yMDU2XSAtIE1vdmVkIGFsbCAjaW5jbHVkZSBjb25maWcuaCBzdGF0ZW1lbnRzIHRvICNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisgICAgKiBbVEhSSUZULTIwMzFdIC0gTWFrZSBTT19LRUVQQUxJVkUgY29uZmlndXJhYmxlIGZvciBDKysgbGliCisgICAgKiBbVEhSSUZULTIwMjFdIC0gSW1wcm92ZSBsYXJnZSBiaW5hcnkgcHJvdG9jb2wgc3RyaW5nIHBlcmZvcm1hbmNlCisgICAgKiBbVEhSSUZULTIwMjhdIC0gQ2xlYW51cCB0aHJlYWRpbmcgaGVhZGVycyAvIGxpYnJhcmllcworICAgICogW1RIUklGVC0yMDE0XSAtIENoYW5nZSBDKysgbGliIGluY2x1ZGVzIHRvIHVzZSA8bmFtZXNwYWNlLz4gc3R5bGUgdGhyb3VnaG91dAorICAgICogW1RIUklGVC0yMzEyXSAtIHRyYXZpcy55bWw6IGJ1aWxkIGV2ZXJ5dGhpbmcKKyAgICAqIFtUSFJJRlQtMTkxNV0gLSBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMTczNl0gLSBWaXN1YWwgU3R1ZGlvIHRvcCBsZXZlbCBwcm9qZWN0IGZpbGVzIHdpdGhpbiBtc3ZjCisgICAgKiBbVEhSSUZULTE3MzVdIC0gaW50ZWdyYXRlIHR1dG9yaWFsIGludG8gcmVndWxhciBidWlsZAorICAgICogW1RIUklGVC0xNTMzXSAtIE1ha2UgVFRyYW5zcG9ydCBzaG91bGQgYmUgQ2xvc2VhYmxlCisgICAgKiBbVEhSSUZULTM1XSAtIE1vdmUgbGFuZ3VhZ2UgdGVzdHMgaW50byB0aGVpciBhcHByb3ByaWF0ZSBsaWJyYXJ5IGRpcmVjdG9yeQorICAgICogW1RIUklGVC0xMDc5XSAtIFN1cHBvcnQgaTY0IGluIEFTMworICAgICogW1RIUklGVC0xMTA4XSAtIFNTTCBzdXBwb3J0IGZvciB0aGUgUnVieSBsaWJyYXJ5IAorICAgICogW1RIUklGVC0zODU2XSAtIHVwZGF0ZSBkZWJpYW4gcGFja2FnZSBkZWVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTM4MzNdIC0gaGF4ZSBodHRwIHNlcnZlciBpbXBsZW1lbnRhdGlvbiAoYnkgZW1iZWRpbmcgaW50byBwaHAgd2ViIHNlcnZlcikKKyAgICAqIFtUSFJJRlQtMzgzOV0gLSBQZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIGJpZyBtZXNzYWdlIGRlc2VyaWFsaXphdGlvbiB1c2luZyBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM4MjBdIC0gRXJsYW5nOiBEZXRlY3QgT1RQID49IDE4IHRvIHVzZSBuZXcgdGltZSBjb3JyZWN0aW9uCisgICAgKiBbVEhSSUZULTM4MTZdIC0gUmVkdWNlIGRvY2tlciBidWlsZCBkdXJhdGlvbiBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzgxNV0gLSBQdXQgYXBwdmV5b3IgZGVwZW5kZW5jeSB2ZXJzaW9ucyB0byBvbmUgcGxhY2UKKyAgICAqIFtUSFJJRlQtMzc4OF0gLSBDb21wYXRpYmlsaXR5IGltcHJvdmVtZW50cyBhbmQgV2luNjQgc3VwcG9ydAorICAgICogW1RIUklGVC0zNzkyXSAtIFRpbWVvdXRzIGZvciBhbm9ueW1vdXMgcGlwZXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZQorICAgICogW1RIUklGVC0zNzk0XSAtIFNwbGl0IERlbHBoaSBhcHBsaWNhdGlvbiwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBleGNlcHRpb24gc3VidHlwZXMgaW50byBzZXBhcmF0ZSBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTM3NzRdIC0gVGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGV4Y2VwdGlvbl9uYW1lcyBtZXRhIGluZm8KKyAgICAqIFtUSFJJRlQtMzc2Ml0gLSBGaXggYnVpbGQgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgVGhyaWZ0ICJieXRlIiBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzc1Nl0gLSBJbXByb3ZlIHJlcXVpcmVkbmVzcyBkb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTM3NjFdIC0gQWRkIGRlYmlhbiBwYWNrYWdlIGZvciBQeXRob24zCisgICAgKiBbVEhSSUZULTM3NDJdIC0gaGF4ZSBwaHAgY2xpIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzczM10gLSBTb2NrZXQgdGltZW91dCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMzcyOF0gLSBodHRwIHRyYW5zcG9ydCBmb3IgdGhyaWZ0LWx1YQorICAgICogW1RIUklGVC0zOTA1XSAtIERhcnQgY29tcGlsZXIgZG9lcyBub3QgaW5pdGlhbGl6ZSBib29sLCBpbnQsIGFuZCBkb3VibGUgcHJvcGVydGllcworICAgICogW1RIUklGVC0zOTExXSAtIExvb3NlbiBSdWJ5IGRldiBkZXBlbmRlbmN5IHZlcnNpb24gcmVxdWlyZW1lbnRzCisgICAgKiBbVEhSSUZULTM5MDZdIC0gUnVuIEMjIHRlc3RzIHdpdGggbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zOTAwXSAtIEFkZCBQeXRob24gU1NMIGZsYWdzCisgICAgKiBbVEhSSUZULTM4OTddIC0gUHJvdmlkZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiB0eXBlIGJhc2VkIG9uIFdlYkV4Y2VwdGlvblN0YXR1cyBpbiBjYXNlIG9mIHRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMzgwOF0gLSBNaXNzaW5nIGBET1VCTEVgIGluIHRocmlmdCB0eXBlIGVudW1lcmF0aW9uCisgICAgKiBbVEhSSUZULTM4MDNdIC0gUmVtb3ZlICJmaWxlIiBhdHRyaWJ1dGUgZnJvbSBYTUwgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM2NjBdIC0gQWRkIFY0IG1hcHBlZCBhZGRyZXNzIHRvIHRlc3QgY2xpZW50IGNlcnQncyBhbHRuYW1lCisgICAgKiBbVEhSSUZULTM2NjFdIC0gVXNlIGh0dHBzIHRvIGRvd25sb2FkIG1lY2sgaW4gZXJsYW5nIHRlc3QgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY1OV0gLSBDaGVjayBjb25maWd1cmUgcmVzdWx0IG9mIENNYWtlIG9uIENJCisgICAgKiBbVEhSSUZULTM2NjddIC0gQWRkIFRMUyBTTkkgc3VwcG9ydCB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM2NTFdIC0gTWFrZSBiYWNrcG9ydHMubWF0Y2hfaG9zdG5hbWUgYW5kIGlwYWRkcmVzcyBvcHRpb25hbAorICAgICogW1RIUklGVC0zNjY2XSAtIEJ1aWxkIEQgdHV0b3JpYWwgYXMgcGFydCBvZiBBdXRvdG9vbHMgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY2NV0gLSBBZGQgRCBsaWJldmVudCBhbmQgT3BlblNTTCB0byBkb2NrZXIgaW1hZ2VzCisgICAgKiBbVEhSSUZULTM2NjRdIC0gUmVtb3ZlIG1kNS5jCisgICAgKiBbVEhSSUZULTM2NjJdIC0gQWRkIEhhc2tlbGwgdG8gZGViaWFuIGRvY2tlciBpbWFnZQorICAgICogW1RIUklGVC0zNzExXSAtIEFkZCBEIHRvIGNyb3NzIGxhbmd1YWdlIHRlc3QKKyAgICAqIFtUSFJJRlQtMzY5MV0gLSBSdW4gZmxha2U4IFB5dGhvbiBzdHlsZSBjaGVjayBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzY5Ml0gLSAoUmUpZW5hYmxlIEFwcHZleW9yIEMrKyBhbmQgUHl0aG9uIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NzddIC0gSW1wcm92ZSBDTWFrZSBKYXZhIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NzldIC0gQWRkIHN0ZG91dCBsb2cgdG8gdGVzdEJpbmFyeSBpbiBKYXZhIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTM3MThdIC0gUmVkdWNlIHNpemUgb2YgZG9ja2VyIGltYWdlIGZvciBidWlsZCBlbnZpcm9ubWVudAorICAgICogW1RIUklGVC0zNjk4XSAtIFtUcmF2aXMtQ0ldIEludHJvZHVjZSByZXRyeSB0byBhcHQgY29tbWFuZHMKKyAgICAqIFtUSFJJRlQtMzEyN10gLSBzd2l0Y2ggLXJlY3Vyc2UgdG8gLS1yZWN1cnNlIGFuZCByZXNlcnZlIC1yCisgICAgKiBbVEhSSUZULTMwODddIC0gUGFzcyBvbiBlcnJvcnMgbGlrZSAiY29ubmVjdGlvbiBjbG9zZWQiCisgICAgKiBbVEhSSUZULTMyNDBdIC0gVGhyaWZ0IFB5dGhvbiBjbGllbnQgc2hvdWxkIHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgYW5kIHdpbGRjYXJkIGNlcnRzIGluIFRTU0xTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzIxM10gLSBtYWtlIGNyb3NzIHNob3VsZCBpbmRpY2F0ZSB3aGVuIGl0IHNraXBzIGEga25vd24gZmFpbGluZyB0ZXN0CisgICAgKiBbVEhSSUZULTMyMDhdIC0gRml4IFZpc3VhbCBTdHVkaW8gc29sdXRpb24gYnVpbGQgZmFpbHVyZSBkdWUgdG8gbWlzc2luZyBzb3VyY2UKKyAgICAqIFtUSFJJRlQtMzE4Nl0gLSBBZGQgVFNlcnZlckhUVFAgdG8gR28gbGlicmFyeQorICAgICogW1RIUklGVC0yMzQyXSAtIEFkZCBfX0ZJTEVfXyBhbmQgX19MSU5FX18gdG8gVGhyaWZ0IEMrKyBleGNwZXRpb25zCisgICAgKiBbVEhSSUZULTMzNzJdIC0gQWRkIGRhcnQgZ2VuZXJhdG9yIHRvIFZpc3VhbCBTdHVkaW8gcHJvamVjdAorICAgICogW1RIUklGVC0zMzY2XSAtIFRocmlmdFRlc3QgdG8gaW1wbGVtZW50IHN0YW5kYXJkIHJldHVybiB2YWx1ZXMgCisgICAgKiBbVEhSSUZULTM0MDJdIC0gUHJvdmlkZSBhIHBlcmwgVW5peCBTb2NrZXQgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzM2MV0gLSBJbXByb3ZlIEMjIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzM5M10gLSBJbnRyb2R1Y2UgaTggdG8gcHJvdmlkZSBjb25zaXN0ZW50IHNldCBvZiBUaHJpZnQgSURMIGludGVnZXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzMzOV0gLSBTdXBwb3J0IGZvciBkYXRhYmFzZS9zcWwKKyAgICAqIFtUSFJJRlQtMzU2NV0gLSBDKys6IFRbQXN5bmNdUHJvY2Vzc29yOjpnZXRFdmVudEhhbmRsZXIoKSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgY29uc3QgbWVtYmVyIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0zNTYzXSAtIEMrKy9RdDogcmVtb3ZlZCB1c2FnZSBvZiBtYWNybyBRVF9QUkVQRU5EX05BTUVTUEFDRSBhcyBpdCBpc24ndCBjb25zZXF1ZW50bHkgdXNlZCBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gUXQgdHlwZXMuCisgICAgKiBbVEhSSUZULTM1NjJdIC0gUmVtb3ZlZCB1bnVzZWQgVEFzeW5jUHJvY2Vzc29yOjpnZXRBc3luY1NlcnZlcigpCisgICAgKiBbVEhSSUZULTM1NjFdIC0gQysrL1F0OiBtYWtlIHVzZSBvZiBRX0RJU0FCTEVfQ09QWSgpIHRvIGdldCByaWQgb2YgY29weSBjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgKiBbVEhSSUZULTM1NTZdIC0gY19nbGliIGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzU0NF0gLSBNYWtlIGNyb3NzIHRlc3QgZmFpbCB3aGVuIHNlcnZlciBwcm9jZXNzIGRpZWQgdW5leHBlY3RlZGx5CisgICAgKiBbVEhSSUZULTM1NDBdIC0gTWFrZSBweXRob24gdHV0b3JpYWwgbW9yZSBpbiBsaW5lIHdpdGggUEVQOAorICAgICogW1RIUklGVC0zNTM1XSAtIERhcnQgZ2VuZXJhdG9yIGFyZ3VtZW50IHRvIHByb2R1Y2UgYSBmaWxlIHN0cnVjdHVyZSB1c2FibGUgaW4gcGFyZW50IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzUwNV0gLSBFbmhhbmNlIFB5dGhvbiBUU1NMU29ja2V0CisgICAgKiBbVEhSSUZULTM1MDZdIC0gRWxpbWluYXRlIG9sZCBzdHlsZSBjbGFzc2VzIGZyb20gbGlicmFyeSBjb2RlCisgICAgKiBbVEhSSUZULTM1MDNdIC0gRW5hYmxlIHB5OnV0ZjhzdHJpbmcgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC0zNDk5XSAtIEFkZCBwYWNrYWdlX3ByZWZpeCB0byBweXRob24gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM0OTVdIC0gTWlub3IgZW5oYW5jZW1lbnRzIGFuZCBmaXhlcyBmb3IgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNDg2XSAtIEphdmEgZ2VuZXJhdGVkIGBnZXRGaWVsZFZhbHVlYCBpcyBpbmNvbXBhdGlibGUgd2l0aCBgc2V0RmllbGRWYWx1ZWAgZm9yIGJpbmFyeSB2YWx1ZXMuCisgICAgKiBbVEhSSUZULTM0ODRdIC0gQ29uc29saWRhdGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgaW4gSmF2YSdzIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzUxNl0gLSBBZGQgZmVhdHVyZSB0ZXN0IGZvciBUSGVhZGVyIFRCaW5hcnlQcm90b2NvbCBpbnRlcm9wCisgICAgKiBbVEhSSUZULTM1MTVdIC0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGFuZCB0ZXN0IG9uIENJCisgICAgKiBbVEhSSUZULTM1MTRdIC0gUEhQIDcgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIGJpbmFyeSBwcm90b2NvbAorICAgICogW1RIUklGVC0zNDY5XSAtIERvY2tlcjogRGViaWFuIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzQxNl0gLSBSZXRpcmUgb2xkICJ4eHhfbmFtZXNwYWNlIiBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSURMCisgICAgKiBbVEhSSUZULTM0MjZdIC0gQWxpZ24gYXV0b2dlbiBjb21tZW50IGluIFhTRAorICAgICogW1RIUklGVC0zNDI0XSAtIEFkZCBDTWFrZSBhbmRyb2lkIGJ1aWxkIG9wdGlvbgorICAgICogW1RIUklGVC0zNDM5XSAtIFJ1biBtYWtlIGNyb3NzIHVzaW5nIFB5dGhvbjMgd2hlbiBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzQ0MF0gLSBQeXRob24gbWFrZSBjaGVjayB0YWtlcyB0b28gbXVjaCB0aW1lCisgICAgKiBbVEhSSUZULTM0NDFdIC0gU3RhYmlsaXplIFRyYXZpcy1DSSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzQzMV0gLSBBdm9pZCAic2NoZW1lcyIgSGFzaE1hcCBsb29rdXBzIGR1cmluZyBzdHJ1Y3QgcmVhZHMvd3JpdGVzCisgICAgKiBbVEhSSUZULTM0MzJdIC0gQWRkIGEgVEJ5dGVCdWZmZXIgdHJhbnNwb3J0IHRvIHRoZSBKYXZhIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzQzOF0gLSBFbmFibGUgcHk6bmV3X3N0eWxlIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMzQwNV0gLSBHbyBUSHR0cENsaWVudCBtaXN1c2VzIGh0dHAuQ2xpZW50IG9iamVjdHMKKyAgICAqIFtUSFJJRlQtMzYxNF0gLSBJbXByb3ZlIGxvZ2dpbmcgb2YgdGVzdF9zc2xzb2NrZXQucHkKKyAgICAqIFtUSFJJRlQtMzY0N10gLSBGaXggcGhwIGV4dGVuc2lvbiBidWlsZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zNjQyXSAtIFNwZWVkIHVwIGNyb3NzIHRlc3QgcnVubmVyCisgICAgKiBbVEhSSUZULTM2MzddIC0gSW1wbGVtZW50IGNvbXBhY3QgcHJvdG9jb2wgZm9yIGRhcnQKKyAgICAqIFtUSFJJRlQtMzYxM10gLSBQb3J0IFB5dGhvbiBDIGV4dGVuc2lvbiB0byBQeXRob24gMworICAgICogW1RIUklGVC0zNjEyXSAtIEFkZCBQeXRob24gQyBleHRlbnNpb24gZm9yIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzYxMV0gLSBBZGQgLS1yZWdleCBmaWx0ZXIgdG8gY3Jvc3MgdGVzdCBydW5uZXIKKyAgICAqIFtUSFJJRlQtMzYzMV0gLSBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBMdWEKKyAgICAqIFtUSFJJRlQtMzYwOV0gLSBSZW1vdmUgb3IgcmVwbGFjZSBUZXN0UG9ydEZpeHR1cmUuaAorICAgICogW1RIUklGVC0zNjA1XSAtIEhhdmUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIGFib3V0IGludmFsaWQgYXJndW1lbnRzIGFuZCBvcHRpb25zCisgICAgKiBbVEhSSUZULTM1OTZdIC0gQmV0dGVyIGNvbmZvcm1hbmNlIHRvIFBFUDgKKyAgICAqIFtUSFJJRlQtMzU4NV0gLSBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBMdWEKKyAgICAqIFtUSFJJRlQtMzU4Ml0gLSBFcmxhbmcgbGlicmFyaWVzIHNob3VsZCBoYXZlIHNlcnZpY2UgbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMzU3OV0gLSBJbnRyb2R1Y2UgcmV0cnkgdG8gbWFrZSBjcm9zcworICAgICogW1RIUklGVC0zMzA2XSAtIEphdmE6IFRCaW5hcnlQcm90b2NvbDogVXNlIDEgdGVtcCBidWZmZXIgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIDgKKyAgICAqIFtUSFJJRlQtMzkxMF0gLSBEbyBub3QgaW52b2tlIHBpcCBhcyBwYXJ0IG9mIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtMTg1N10gLSBQeXRob24gMy5YIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTk0NF0gLSBCaW5kaW5nIHRvIHplcm8gcG9ydAorICAgICogW1RIUklGVC0zOTU0XSAtIEVuYWJsZSB0aGUgdXNhZ2Ugb2Ygc3RydWN0cyBjYWxsZWQgIk9iamVjdCIgaW4gSmF2YQorICAgICogW1RIUklGVC0zOTgxXSAtIEVuYWJsZSBhbmFseXplciBzdHJvbmcgbW9kZSBpbiBEYXJ0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzk5OF0gLSBEb2N1bWVudCBhYmlsaXR5IHRvIGFkZCBjdXN0b20gdGFncyB0byB0aHJpZnQgc3RydWN0cworICAgICogW1RIUklGVC00MDA2XSAtIEFkZCBhIHJlbW92ZUV2ZW50TGlzdGVuZXIgbWV0aG9kIG9uIFRTb2NrZXQKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtNjQwXSAtIFN1cHBvcnQgZGVwcmVjYXRpb24KKyAgICAqIFtUSFJJRlQtOTQ4XSAtIFNTTCBzb2NrZXQgc3VwcG9ydCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTc2NF0gLSBhZGQgU3VwcG9ydCBmb3IgVmFsYSBsYW5ndWFnZQorICAgICogW1RIUklGVC0zMDQ2XSAtIEFsbG93IFBTUjQgY2xhc3MgbG9hZGluZyBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgKFBIUCkKKyAgICAqIFtUSFJJRlQtMjExM10gLSBFcmxhbmcgU1NMIFNvY2tldCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE0ODJdIC0gVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgdW5kZXIgUEhQCisgICAgKiBbVEhSSUZULTUxOV0gLSBTdXBwb3J0IGNvbGxlY3Rpb25zIG9mIHR5cGVzIHdpdGhvdXQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgZGVmaW5lIGl0CisgICAgKiBbVEhSSUZULTQ2OF0gLSBSYWNrIE1pZGRsZXdhcmUgQXBwbGljYXRpb24gZm9yIFJhaWxzCisgICAgKiBbVEhSSUZULTE3MDhdIC0gQWRkIGV2ZW50IGhhbmRsZXJzIGZvciBwcm9jZXNzb3IgZXZlbnRzCisgICAgKiBbVEhSSUZULTM4MzRdIC0gRXJsYW5nIG5hbWVzcGFjaW5nIGFuZCBleGNlcHRpb24gbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMjUxMF0gLSBJbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyJ3MgYWJpbGl0eSB0byBsaXN0ZW4gb24gdW5peCBkb21haW4gc29ja2V0cworICAgICogW1RIUklGVC0zMzk3XSAtIEltcGxlbWVudCBUUHJvY2Vzc29yRmFjdG9yeSBpbiBDIyB0byBlbmFibGUgcGVyLWNsaWVudCBwcm9jZXNzb3JzCisgICAgKiBbVEhSSUZULTM1MjNdIC0gWE1MIEdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNTEwXSAtIEFkZCBIdHRwVGFza0FzeW5jSGFuZGxlciBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMzE4XSAtIFBIUDogU2ltcGxlSlNPTlByb3RvY29sIEltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMyOTldIC0gRGFydCBsYW5ndWFnZSBiaW5kaW5ncyBpbiBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjgzNV0gLSBBZGQgcG9zc2liaWxpdHkgdG8gZGlzdHJpYnV0ZSBnZW5lcmF0b3JzIHNlcGFyYXRlbHkgZnJvbSB0aHJpZnQgY29yZSwgYW5kIGxvYWQgdGhlbSBkeW5hbWljYWxseQorICAgICogW1RIUklGVC0xODRdIC0gQWRkIE9TR2kgTWFuaWZlc3QgaGVhZGVycyB0byB0aGUgbGlidGhyaWZ0IGphdmEgbGlicmFyeSB0byBiZSBhYmxlIHRvIHVzZSBUaHJpZnQgaW4gdGhlIE9TR2kgcnVudGltZQorICAgICogW1RIUklGVC0xNDFdIC0gSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJlc2VudCBvbiBzZXJpYWxpemF0aW9uLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTg5MV0gLSBBZGQgV2luZG93cyBBTFBDIHRyYW5zcG9ydCB3aGljaCBpcyByaWdodCBjb3VudGVycGFydCBvZiBVbml4IGRvbWFpbiBzb2NrZXRzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTE4MDhdIC0gVGhlIFRocmlmdCBzdHJ1Y3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgc2VsZi1jb250YWluZWQ/CisgICAgKiBbVEhSSUZULTI4OTVdIC0gVHV0b3JpYWwgY3BwCisgICAgKiBbVEhSSUZULTM4NjBdIC0gRWxlcGhhbnQtYmlyZCBhcHBsaWNhdGlvbiBUZXN0IGZhaWxzIGZvciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMzgxMV0gLSBIVFRQUyBTdXBwb3J0IGZvciBDKysgYXBwbGljYXRpb25zCisgICAgKiBbVEhSSUZULTM1MDldIC0gIm1ha2UgY2hlY2siIGVycm9yCisKKyMjIFN0b3J5CisgICAgKiBbVEhSSUZULTM0NTJdIC0gLnRyYXZpcy55bWw6IE1pZ3JhdGluZyBmcm9tIGxlZ2FjeSB0byBjb250YWluZXItYmFzZWQgaW5mcmFzdHJ1Y3R1cmUKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTgxMV0gLSBydWJ5IHR1dG9yaWFsIGFzIHBhcnQgb2YgdGhlIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjc3OV0gLSBQSFAgVEpTT05Qcm90b2NvbCBlbmNvZGUgdW5pY29kZSBpbnRvIFVDUy00TEUgd2hpY2ggY2FuJ3QgYmUgcGFyc2VkIGJ5IG90aGVyIGxhbmd1YWdlIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIxMTBdIC0gRXJsYW5nOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0zODUyXSAtIEEgVHJhdmlzLUNJIGpvYiBmYWlscyB3aXRoICJ3cml0ZSBlcnJvciIKKyAgICAqIFtUSFJJRlQtMzc0MF0gLSBGaXggaGF4ZWxpYi5qc29uIGNsYXNzcGF0aCAKKyAgICAqIFtUSFJJRlQtMzY1M10gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0zNjUyXSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjU1XSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTM2NTRdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2NTZdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2OTldIC0gRml4IGludGVnZXIgbGltaXQgc3ltYm9sIGluY2x1ZGVzIGluIFB5dGhvbiBDIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zNjkzXSAtIEZpeCBpbmNsdWRlIGlzc3VlIGluIEMrKyBUU1NMU29ja2V0SW50ZXJydXB0VGVzdCBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTM2OTRdIC0gW1dpbmRvd3NdIERpc2FibGUgdGVzdHMgb2YgYSBmZXcgc2VydmVycyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkCisgICAgKiBbVEhSSUZULTM2OTZdIC0gSW5zdGFsbCBwaXAgdG8gQ2VudE9TIERvY2tlciBpbWFnZXMgdG8gZml4IFB5dGhvbiBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzYzOF0gLSBGaXggaGF4ZWxpYi5qc29uCisgICAgKiBbVEhSSUZULTMyNTFdIC0gQWRkIGh0dHAgdHJhbnNwb3J0IGZvciBzZXJ2ZXIgdG8gR28gbGliCisgICAgKiBbVEhSSUZULTI0MjRdIC0gUmVjdXJzaXZlIFR5cGVzCisgICAgKiBbVEhSSUZULTI0MjNdIC0gVEhlYWRlcgorICAgICogW1RIUklGVC0yNDEzXSAtIFB5dGhvbjogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MDldIC0gSmF2YTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTJdIC0gRDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTFdIC0gQysrOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMF0gLSBKYXZhTWU6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNjY4XSAtIFRlc3RTdWl0ZTogZGV0YWlsZWQgcmVzdWx0IG9uIHBhc3NlZCB0ZXN0cyBieSBmZWF0dXJlCisgICAgKiBbVEhSSUZULTI2NTldIC0gcHl0aG9uIFRlc3QgU2VydmVyIGZhaWxzIHdoZW4gdGhyb3dpbmcgVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMzk4XSAtIEFkZCBDTWFrZSBidWlsZCAgZm9yIEhhc2tlbGwgbGlicmFyeSBhbmQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzM5Nl0gLSBEQVJUOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzM2NF0gLSAgIEZpeCBydWJ5IGJpbmFyeSBmaWVsZCBlbmNvZGluZyBpbiBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTMzODFdIC0gRml4IGZvciBtaXNjLiBjb2RlZ2VuIGlzc3VlcyB3aXRoIFRIUklGVC0yOTA1CisgICAgKiBbVEhSSUZULTM1NzNdIC0gTm8gcnVsZSB0byBtYWtlIHRhcmdldCBgLi4vLi4vLi4vdGVzdC9jX2dsaWIvc3JjLy5kZXBzL3Rlc3R0aHJpZnR0ZXN0LXRocmlmdF90ZXN0X2hhbmRsZXIuUG8nLgorICAgICogW1RIUklGVC0zNTcyXSAtICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKyAgICAqIFtUSFJJRlQtMzU0Ml0gLSBBZGQgbGVuZ3RoIGxpbWl0IHN1cHBvcnQgdG8gSmF2YSB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zNTM3XSAtIFJlbW92ZSB0aGUgKG5vdyBvYnNvbGV0ZSkgY3NoYXJwOmFzeW5jY3RwIGZsYWcgCisgICAgKiBbVEhSSUZULTM1MzJdIC0gQWRkIGNvbmZpZ3VyYWJsZSBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIHNpemUgbGltaXQgdG8gUHl0aG9uIHByb3RvY29scworICAgICogW1RIUklGVC0zNTMxXSAtIENyZWF0ZSBjcm9zcyBsYW5nIGZlYXR1cmUgdGVzdCBmb3Igc3RyaW5nIGFuZCBjb250YWluZXIgcmVhZCBsZW5ndGggbGltaXQKKyAgICAqIFtUSFJJRlQtMzQ4Ml0gLSBIYXNrZWxsIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgZW5jb2RlIGJpbmFyeSBmaWVsZCBhcyBCYXNlNjQKKyAgICAqIFtUSFJJRlQtMzQyNV0gLSBNaW5vciBmaXhlcyArIHNpbXBsaWZpY2F0aW9uIGZvciBDZW50T1MgRG9ja2VyZmlsZQorICAgICogW1RIUklGVC0zNDQyXSAtIFJ1biBDTWFrZSB0ZXN0cyBvbiBBcHB2ZXlvcgorICAgICogW1RIUklGVC0zNDA5XSAtIE5vZGVKUyBiaW5hcnkgZmllbGQgaXNzdWVzCisgICAgKiBbVEhSSUZULTM2MjFdIC0gRml4IGxpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyOF0gLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyNV0gLSBLaWxsIHVudXNlZCAjaW5jbHVkZSAiVGVzdFBvcnRGaXh0dXJlLmgiIGluIGxpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAuCisgICAgKiBbVEhSSUZULTM2NDZdIC0gRml4IFB5dGhvbiBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzYyNl0gLSBGaXggbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzLgorICAgICogW1RIUklGVC0zNjI0XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyM10gLSBGaXggRml4IGNwcC9saWIvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNTkyXSAtIEFkZCBiYXNpYyB0ZXN0IGNsaWVudAorICAgICogW1RIUklGVC0zOTgwXSAtIGFkZCBURXh0ZW5kZWRCaW5hcnlQcm90b2NvbC5qYXZhCisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMTgwMV0gLSBTeW5jIHVwIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjb2RlcyBhY3Jvc3MgbGFuZ3VhZ2VzIGFuZCB0aHJpZnQgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTEyNTldIC0gQXV0b21hdGUgdmVyc2lvbmluZyAKKworIyMgVGVzdAorICAgICogW1RIUklGVC0zNDAwXSAtIEFkZCBFcmxhbmcgdG8gY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNTA0XSAtIEZpeCBGYXN0YmluYXJ5VGVzdC5weQorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTM5MjNdIC0gTWF5YmUgcmVtb3ZlIEFlcmVvIGZyb20gdGhlICJQb3dlcmVkIGJ5IiBsaXN0CisgICAgKiBbVEhSSUZULTIxNDldIC0gQWRkIGFuIG9wdGlvbiB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzCisKKworCitUaHJpZnQgMC45LjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMjQ0MV0gLSBDYW5ub3Qgc2h1dGRvd24gVFRocmVhZGVkU2VydmVyIHdoZW4gY2xpZW50cyBhcmUgc3RpbGwgY29ubmVjdGVkCisgICAgKiBbVEhSSUZULTI0NjVdIC0gVEJpbmFyeVByb3RvY29sVCBicmVha3MgaWYgY29waWVkL21vdmVkCisgICAgKiBbVEhSSUZULTI0NzRdIC0gdGhyaWZ0LmggY2F1c2VzIGEgY29tcGlsZSBmYWlsdXJlCisgICAgKiBbVEhSSUZULTI1NDBdIC0gUnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZhaWxzCisgICAgKiBbVEhSSUZULTI1OThdIC0gQWRkIGNoZWNrIGZvciBtaW5pbXVtIEdvIHZlcnNpb24gdG8gY29uZmlndXJlLmFjCisgICAgKiBbVEhSSUZULTI2NDddIC0gY29tcGlsZXItaHM6IGRvbid0IGRlY2FwaXRhbGl6ZSBmaWVsZCBuYW1lcywgZG8gZGVjYXBpdGFsaXplIGFyZ3VtZW50IGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTI3NzNdIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3IgJ29uZXdheScgbWV0aG9kcyBpcyBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTI3ODldIC0gVE5vbmJsb2NraW5nU2VydmVyIGxlYWtzIHNvY2tldCBGRCdzIHVuZGVyIGxvYWQKKyAgICAqIFtUSFJJRlQtMjY4Ml0gLSBUVGhyZWFkZWRTZXJ2ZXIgbGVha3MgcGVyLXRocmVhZCBtZW1vcnkKKyAgICAqIFtUSFJJRlQtMjY3NF0gLSBKYXZhU2NyaXB0OiBkZWNsYXJlIEFjY2VwdDogYW5kIENvbnRlbnQtVHlwZTogaW4gcmVxdWVzdAorICAgICogW1RIUklGVC0zMDc4XSAtIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCdzIGxvZ2dlciBpcyBub3QgbmFtZWQgYWZ0ZXIgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTMwNzddIC0gQysrIFRGaWxlVHJhbnNwb3J0IGlnbm9yZXMgcmV0dXJuIGNvZGUgZnJvbSBmdHJ1bmNhdGUKKyAgICAqIFtUSFJJRlQtMzA2N10gLSBDKysgY3BwY2hlY2sgcGVyZm9ybWFuY2UgcmVsYXRlZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zMDY2XSAtIEMrKyBURGVuc2VQcm90b2NvbCBhc3NlcnQgbW9kaWZpZXMgaW5zdGVhZCBvZiBjaGVja3MKKyAgICAqIFtUSFJJRlQtMzA3MV0gLSBib290c3RyYXAuc2ggb24gVWJ1bnR1IDEyLjA0IChQcmVjaXNlKSBhdXRvbWFrZSBlcnJvcgorICAgICogW1RIUklGVC0zMDY5XSAtIEMrKyBUU2VydmVyU29ja2V0IGxlYWtzIHNvY2tldCBvbiBmY250bCBnZXQgb3Igc2V0IGZsYWdzIGVycm9yCisgICAgKiBbVEhSSUZULTMwNzldIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzA4MF0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGNvbm5lY3Rpb24gbGVhayB3aGlsZSBhY2NlcHQgaHVnZSBudW1iZXIgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTMwODZdIC0gQysrIFZhbGdyaW5kIEVycm9yIENsZWFudXAKKyAgICAqIFtUSFJJRlQtMzA4NV0gLSB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCBuZXZlciB0cnkgdG8gcmVjb25uZWN0CisgICAgKiBbVEhSSUZULTMxMjNdIC0gTWlzc2luZyBpbmNsdWRlIGluIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5oIGJyZWFrcyBidWlsZCBpbiBzb21lIGVudmlyb25tZW50cworICAgICogW1RIUklGVC0zMTI1XSAtIEZpeCB0aGUgbGlzdCBvZiBleHBvcnRlZCBoZWFkZXJzIGluIGF1dG9tYWtlIGlucHV0CisgICAgKiBbVEhSSUZULTMxMjZdIC0gUEhQIEpTT04gc2VyaWFsaXplciBjb252ZXJ0cyBlbXB0eSBvciBpbnQtaW5kZXhlZCBtYXBzIHRvIGxpc3RzCisgICAgKiBbVEhSSUZULTMxMzJdIC0gUHJvcGVybHkgZm9ybWF0IGRhdGUgaW4gSmF2YSBAR2VuZXJhdGVkIGFubm90YXRpb25zCisgICAgKiBbVEhSSUZULTMxMzddIC0gVHJhdmlzIGJ1aWxkIGhhbmdzIGFmdGVyIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzEzOF0gLSAibWFrZSBjaGVjayIgcGFyYWxsZWwgZXhlY3V0aW9uIGlzIHVuZGVybWluaXN0aWMKKyAgICAqIFtUSFJJRlQtMzEzOV0gLSBKUyBsaWJyYXJ5IHRlc3QgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzE0MF0gLSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlzIHRocm93biBieSBKYXZhU2NyaXB0IHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMxMjRdIC0gU29tZSBzaWduZWQvdW5zaWduZWQgd2FybmluZ3Mgd2hpbGUgYnVpbGRpbmcgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzEyOF0gLSBHbyBnZW5lcmF0ZWQgY29kZSBwcm9kdWNlcyBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ2XSAtIEdyYXBodml6IGdlbmVyYXRlcyBmdW5jdGlvbiBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ3XSAtIFNlZ2ZhdWx0IHdoaWxlIHJlY2VpdmluZyBkYXRhCisgICAgKiBbVEhSSUZULTMxNDhdIC0gTWFya2Rvd24gbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcyBhcmUgZGVhZAorICAgICogW1RIUklGVC0zMDkwXSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBNYWNPU1gKKyAgICAqIFtUSFJJRlQtMzA5N10gLSBjbWFrZSB0YXJnZXRzIHVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gb3B0aW9uYWwgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTMwOTRdIC0gbWFzdGVyIGFzIG9mIDIwMTUtQVBSLTEzIGZhaWxzIC1EQk9PU1RfVEhSRUFEUyBjbWFrZSBidWlsZAorICAgICogW1RIUklGVC0zMDk5XSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBGcmVlQlNECisgICAgKiBbVEhSSUZULTMwODldIC0gQXNzaWduaW5nIGRlZmF1bHQgRU5VTSB2YWx1ZXMgcmVzdWx0cyBpbiBub24tY29tcGlsYWJsZSBqYXZhIGNvZGUgaWYgamF2YSBuYW1lc3BhY2UgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzA5M10gLSBtaW5ndyBjb21waWxlIGZpeGVzIGZvciBjKysgbGlicmFyeSAwLjkuMgorICAgICogW1RIUklGVC0zMDk4XSAtIFRocmlmdCBkb2VzIG5vdCBwcmV0dHkgcHJpbnQgYmluYXJ5IHR5cGVkZWZzIHRoZSB3YXkgaXQgZG9lcyBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTMwOTFdIC0gY19nbGliIHNlcnZpY2UgbWV0aG9kIHNob3VsZCByZXR1cm4gcmVzdWx0IGZyb20gaGFuZGxlciBtZXRob2QKKyAgICAqIFtUSFJJRlQtMzA4OF0gLSBUVGhyZWFkUG9vbFNlcnZlciB3aXRoIFNhc2wgYXV0aCBtYXkgbGVhayBDTE9TRV9XQUlUIHNvY2tldAorICAgICogW1RIUklGVC0zMTA5XSAtIENyb3NzIHRlc3QgbG9nIGZpbGUgY2Fubm90IGJlIGJyb3dzZWQgd2hlbiBzZXJ2ZWQgaW4gSFRUUCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzExM10gLSBtNCBDKysxMSBtYWNybyBpc3N1ZQorICAgICogW1RIUklGVC0zMTA1XSAtIEMrKyBsaWJ0aHJpZnRuYiBsaWJyYXJ5IG9uIFdpbmRvd3MgYnVpbGQgZmFpbHVyZQorICAgICogW1RIUklGVC0zMTE1XSAtIFVuY29tcGlsZWFibGUgY29kZSBkdWUgdG8gbmFtZSBjb2xsaXNpb24gd2l0aCBwcmVkZWZpbmVkIHVzZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzExN10gLSBKYXZhIFRTU0xUcmFuc3BvcnRGYWN0b3J5IGNhbid0IGxvYWQgY2VydGlmaWNhdGVzIHdpdGhpbiBKQVIgYXJjaGl2ZQorICAgICogW1RIUklGVC0zMTAyXSAtIGNvdWxkIG5vdCBtYWtlIGNoZWNrIGZvciBHbyBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTMxMjBdIC0gTWlub3Igc3BlbGxpbmcgZXJyb3JzIGFuZCBhbiBvdXRkYXRlZCBVUkwKKyAgICAqIFtUSFJJRlQtMzEyMV0gLSBMaWJydCBkb2VzIG5vdCBleGlzdCBvbiBPUyBYCisgICAgKiBbVEhSSUZULTMxNTJdIC0gQ29tcGlsZXIgZXJyb3Igb24gTWFjIE9TWCAobWlzc2luZyAjaW5jbHVkZSA8Y3N0ZGxpYj4pCisgICAgKiBbVEhSSUZULTMxNjJdIC0gbWFrZSBmYWlscyBmb3IgZG1kIDIuMDY3CisgICAgKiBbVEhSSUZULTMxNjRdIC0gVGhyaWZ0IEMrKyBsaWJyYXJ5IFNTTCBzb2NrZXQgYnkgZGVmYXVsdCBhbGxvd3MgZm9yIHVuc2VjdXJlIFNTTHYzIG5lZ290aWF0aW9uCisgICAgKiBbVEhSSUZULTMxNjhdIC0gRml4IE1hdmVuIFBPTQorICAgICogW1RIUklGVC0zMTcwXSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgY2F1c2VzIGNoYW9zCisgICAgKiBbVEhSSUZULTMxNjldIC0gRG8gbm90IGV4cG9ydCB0aHJpZnQuVGVzdFN0cnVjdCBhbmQgdGhyaWZ0LlRlc3RFbnVtIGluIHRocmlmdCBHbyBsaWJyYXJ5IAorICAgICogW1RIUklGVC0zMTkxXSAtIFBlcmwgY29tcGlsZXIgZG9lcyBub3QgYWRkIHN1cHBvcnQgZm9yIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTMxNzhdIC0gZ2xpYiBDIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzE4OV0gLSBQZXJsIFNlcnZlclNvY2tldCBzaG91bGQgYWxsb3cgYSBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYmUgbGlzdGVuZWQgdG8KKyAgICAqIFtUSFJJRlQtMzI1Ml0gLSBNaXNzaW5nIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBpbiBjcHAgTWFrZWZpbGUsIHNvIGRvZXNuJ3QgaW5zdGFsbAorICAgICogW1RIUklGVC0zMjU1XSAtIFRocmlmdCBnZW5lcmF0b3IgZG9lc24ndCBleGNsdWRlICdwYWNrYWdlJyBrZXl3b3JkIGZvciB0aHJpZnQgcHJvcGVydHkgbmFtZXMgYnJlYWtpbmcgamF2YSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2MF0gLSBtdWx0aXBsZSB3YXJuaW5ncyBpbiBjX2dsaWIgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzI1Nl0gLSBTb21lIEQgdGVzdCB0aW1pbmdzIGFyZSB0b28gYWdncmVzc2l2ZSBmb3Igc2xvdyBtYWNoaW5lcworICAgICogW1RIUklGVC0zMjU3XSAtIHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZQorICAgICogW1RIUklGVC0zMTg0XSAtIFRocmlmdCBHbyBsZWF2ZXMgZmlsZSBkZXNjcmlwdG9ycyBvcGVuCisgICAgKiBbVEhSSUZULTMyMDNdIC0gRE9BUCAtIHBsZWFzZSBmaXggIk9jYW1sIiA9PiAiT0NhbWwiCisgICAgKiBbVEhSSUZULTMyMTBdIC0gKHVuY29tcGlsZWFibGUpIGNvZGUgZ2VuZXJhdGVkIGZvciBzZXJ2ZXIgZXZlbnRzIHdoaWxlIGFyZSBldmVudHMgbm90IGVuYWJsZWQKKyAgICAqIFtUSFJJRlQtMzIxNV0gLSBUSlNPTlByb3RvY29sICcoYysrKSB1c2VzICJ0aHJvdyBuZXciIHRvIHRocm93IGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiAidGhyb3ciCisgICAgKiBbVEhSSUZULTMyMDJdIC0gQWxsb3cgSFNIQVNlcnZlciB0byBjb25maWd1cmUgbWluIGFuZCBtYXggd29ya2VyIHRocmVhZHMgc2VwYXJhdGVseS4KKyAgICAqIFtUSFJJRlQtMzIwNV0gLSBUQ29tcGFjdFByb3RvY29sIHJldHVybiBhIHdyb25nIGVycm9yIHdoZW4gdGhlIGlvLkVPRiBoYXBwZW5zCisgICAgKiBbVEhSSUZULTMyMDldIC0gTEdQTCBtZW50aW9uZWQgaW4gbGljZW5zZSBmaWxlCisgICAgKiBbVEhSSUZULTMxOTddIC0ga2VlcEFsaXZlVGltZSBpcyBoYXJkIGNvZGVkIGFzIDYwIHNlYyBpbiBUVGhyZWFkUG9vbFNlcnZlcgorICAgICogW1RIUklGVC0zMTk2XSAtIE1pc3NwZWxsaW5nIGluIGx1YSBUQmluYXJ5UHJvdG9jb2wgKHN0aXJjdFdyaXRlID0+IHN0cmljdFdyaXRlKQorICAgICogW1RIUklGVC0zMTk4XSAtIEFsbG93IGNvbnN0cnVjdGlvbiBvZiBUVHJhbnNwb3J0RmFjdG9yeSB3aXRoIGEgc3BlY2lmaWVkIG1heExlbmd0aAorICAgICogW1RIUklGVC0zMTkyXSAtIEdvIGltcG9ydCBwYXRocyBjaGFuZ2VkIGluIDEuNCwgYW5kIGV4cGlyZWQgSnVuZSAxCisgICAgKiBbVEhSSUZULTMyNzFdIC0gQ291bGQgbm90IGZpbmQgb3IgbG9hZCBtYWluIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgb24gc29tZSBub24tZW5nbGlzaCBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTMyNzNdIC0gY19nbGliOiBHZW5lcmF0ZWQgY29kZSB0cmllcyB0byBjb252ZXJ0IGJldHdlZW4gZnVuY3Rpb24gYW5kIHZvaWQgcG9pbnRlcnMKKyAgICAqIFtUSFJJRlQtMzI2NF0gLSBGaXggRXJsYW5nIDE2IG5hbWVzcGFjZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzI3MF0gLSByZXVzaW5nIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24gY2F1c2UgZGlydHkgVFNvY2tldAorICAgICogW1RIUklGVC0zMjY3XSAtIGNfZ2xpYjogIkNyaXRpY2FsIiBmYWlsdXJlIGR1cmluZyB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTMyNzddIC0gVEh0dHBDbGllbnQgbGVha3MgY29ubmVjdGlvbnMgaWYgaXQncyB1c2VkIGZvciBtdWx0aXBsZSByZXF1ZXN0cworICAgICogW1RIUklGVC0zMjc4XSAtIE5vZGVKUzogRml4IGV4Y2VwdGlvbiBzdGFjayB0cmFjZXMgYW5kIG5hbWVzCisgICAgKiBbVEhSSUZULTMyNzldIC0gRml4IGEgYnVnIGluIHJldHJ5X21heF9kZWxheSAoTm9kZUpTKQorICAgICogW1RIUklGVC0zMjgwXSAtIEluaXRpYWxpemUgcmV0cnkgdmFyaWFibGVzIG9uIGNvbnN0cnVjdGlvbgorICAgICogW1RIUklGVC0zMjgzXSAtIGNfZ2xpYjogVHV0b3JpYWwgc2VydmVyIGFsd2F5cyBleGl0cyB3aXRoIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMzI4NF0gLSBjX2dsaWI6IEVtcHR5IHNlcnZpY2UgcHJvZHVjZXMgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkyNV0gLSBjX2dsaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xODQ5XSAtIGFmdGVyIHRyYW5zcG9ydC0+b3BlbigpIG9wZW5zIGlzT3BlbiByZXR1cm5zIHRydWUgYW5kIG5leHQgb3BlbigpIGdvZXMgdGhydSB3aGVuIGl0IHNoYWxsIG5vdAorICAgICogW1RIUklGVC0xODY2XSAtIGphdmEgY29tcGlsZXIgZ2VuZXJhdGVzIG5vbi1jb21waWxpbmcgY29kZSB3aXRoIGNvbnN0J3MgZGVmaW5lZCBpbiBhIHRocmlmdCB3aGVuIG5hbWUgaW5jbHVkZXMgbm9uLWlkZW50aWZpZXIgY2hhcnMKKyAgICAqIFtUSFJJRlQtMTkzOF0gLSBGdW5jdGlvblJ1bm5lci5oIC0tIHVzZXMgd3JvbmcgcGF0aCBmb3IgVGhyZWFkLmggd2hlbiBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMTg0NF0gLSBQYXNzd29yZCBzdHJpbmcgbm90IGNsZWFyZWQKKyAgICAqIFtUSFJJRlQtMjAwNF0gLSBUaHJpZnQ6OlVuaW9uIHZpb2xhdGVzIDo9PSBtZXRob2QgY29udHJhY3QgYW5kIGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMjA3M10gLSBUaHJpZnQgQysrIFRIdHRwQ2xpZW50IGVycm9yOiBjYW5ub3QgcmVmaWxsIGJ1ZmZlcgorICAgICogW1RIUklGVC0yMTI3XSAtIEF1dG9jb25mIHNjcmlwdGluZyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBjcm9zcy1jb21waWxlCisgICAgKiBbVEhSSUZULTIxODBdIC0gSW50ZWdlciB0eXBlcyBpc3N1ZXMgaW4gQ29jb2EgbGliIG9uIEFSTTY0CisgICAgKiBbVEhSSUZULTIxODldIC0gR28gbmVlZHMgImlzc2V0IiB0byBmdWxseSBzdXBwb3J0ICJ1bmlvbiIgdHlwZSAoYW5kIG9wdGlvbmFscykKKyAgICAqIFtUSFJJRlQtMjE5Ml0gLSBhdXRvdG9vbHMgb24gUmVkaGF0IGJhc2VkIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMjU0Nl0gLSBjcm9zcyBsYW5ndWFnZSB0ZXN0cyBmYWlscyBhdCAnVGVzdE11bHRpRXhjZXB0aW9uJyB3aGVuIHVzaW5nIG5vZGVqcyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjU0N10gLSBub2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBmYWlscyB0byBjb25uZWN0IHdpdGggY3BwIHVzaW5nIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjU0OF0gLSBOb2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggIC1zc2wKKyAgICAqIFtUSFJJRlQtMTQ3MV0gLSB0b1N0cmluZygpIGRvZXMgbm90IHByaW50IEJ5dGVCdWZmZXIgdmFsdWVzIHdoZW4gbmVzdGVkIGluIGEgTGlzdAorICAgICogW1RIUklGVC0xMjAxXSAtIGdldGFkZHJpbmZvIHJlc291cmNlIGxlYWsKKyAgICAqIFtUSFJJRlQtNjE1XSAtIFRUaHJlYWRQb29sU2VydmVyIGRvZXNuJ3QgY2FsbCB0YXNrX2RvbmUgYWZ0ZXIgcHVsbGluZyB0YXNrcyBmcm9tIGl0J3MgY2xpZW50cyBxdWV1ZQorICAgICogW1RIUklGVC0xNjJdIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCisgICAgKiBbVEhSSUZULTgxMF0gLSBDcmFzaGVkIGNsaWVudCBvbiBUU29ja2V0OjpjbG9zZSB1bmRlciBsb2FkcworICAgICogW1RIUklGVC01NTddIC0gY2hhcnNldCBwcm9ibGVtIHdpdGggZmlsZSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdAorICAgICogW1RIUklGVC0yMzNdIC0gSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZWdhdGl2ZSBoZXggbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMTY0OV0gLSBjb250cmliL3plcm9tcSBkb2VzIG5vdCBidWlsZCBpbiAwLjguMAorICAgICogW1RIUklGVC0xNjQyXSAtIE1pc2NhbGN1bGF0aW9uIGxlYWQgdG8gdGhyb3cgdW5leHBlY3RlZCAiVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIihvciBjYWxsZWQgIkVBR0FJTiAodGltZWQgb3V0KSIpIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xNTg3XSAtIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IGVycm9yCisgICAgKiBbVEhSSUZULTEyNDhdIC0gcG9pbnRlciBzdWJ0cmFjdGlvbiBpbiBUTWVtb3J5QnVmZmVyIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMTc3NF0gLSBTYXNsIFRyYW5zcG9ydCBjbGllbnQgd291bGQgaGFuZyB3aGVuIHRyeWluZyB0byBjb25uZWN0IG5vbi1zYXNsIHRyYW5zcG9ydCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTc1NF0gLSBSYW5nZUVycm9yIGluIGJ1ZmZlciBoYW5kbGluZworICAgICogW1RIUklGVC0xNjE4XSAtIHN0YXRpYyBzdHJ1Y3RNYXAgaW4gRmllbGRNZXRhRGF0YSBpcyBub3QgdGhyZWFkIHNhZmUgYW5kIGNhbiBsZWFkIHRvIGRlYWRsb2NrcworICAgICogW1RIUklGVC0yMzM1XSAtIHRocmlmdCBpbmNvbXBhdGliaWxpdHkgd2l0aCBweTp0b3JuYWRvIGFzIHNlcnZlciwgamF2YSBhcyBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjgwM10gLSBUQ1BfREVGRVJfQUNDRVBUIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb21haW4gc29ja2V0cworICAgICogW1RIUklGVC0yNzk5XSAtIEJ1aWxkIFByb2JsZW0ocyk6IGxkOiBsaWJyYXJ5IG5vdCBmb3VuZCBmb3IgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTI4MDFdIC0gQysrIHRlc3Qgc3VpdGUgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjgwMl0gLSBDKysgdHV0b3JpYWwgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjc5NV0gLSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLmM6ICdkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMnCisgICAgKiBbVEhSSUZULTI4MTddIC0gVFNpbXBsZUpTT05Qcm90b2NvbCByZWFkcyBiZXlvbmQgZW5kIG9mIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMjgyNl0gLSBodG1sOnN0YW5kYWxvbmUgc29tZXRpbWVzIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjgyOV0gLSBTdXBwb3J0IGhheGVsaWIgaW5zdGFsbGF0aW9uIHZpYSBnaXRodWIKKyAgICAqIFtUSFJJRlQtMjgyOF0gLSBzbGlnaHRseSB3cm9uZyBoZWxwIHNjcmVlbiBpbmRlbnQKKyAgICAqIFtUSFJJRlQtMjgzMV0gLSBSZW1vdmVzIGRlYWQgY29kZSBpbiB3ZWJfc2VydmVyLmpzIGludHJvZHVjZWQgaW4gVEhSSUZULTI4MTkKKyAgICAqIFtUSFJJRlQtMjgyM10gLSBBbGwgSlMtdGVzdHMgYXJlIGZhaWxpbmcgd2hlbiBydW4gd2l0aCBncnVudCB0ZXN0CisgICAgKiBbVEhSSUZULTI4MjddIC0gVGhyaWZ0IDAuOS4yIGZhaWxzIHRvIGNvbXBpbGUgb24gWW9zZW1pdGUgZHVlIHRvIHRyMS9mdW5jdGlvbmFsIGluY2x1ZGUgaW4gUHJvY2Vzc29yVGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMjg0M10gLSBBdXRvbWFrZSBjb25maWd1cmUuYWMgaGFzIHBvc3NpYmxlIHR5cG8gcmVsYXRlZCB0byBKYXZhCisgICAgKiBbVEhSSUZULTI4MTNdIC0gbXVsdGlwbGUgaGF4ZSBsaWJyYXJ5IGZpeGVzL2ltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yODI1XSAtIFN1cHBseWluZyB1bmljb2RlIHRvIHB5dGhvbiBUaHJpZnQgY2xpZW50IGNhbiBjYXVzZSBuZXh0IHJlcXVlc3QgYXJndW1lbnRzIHRvIGdldCBvdmVyd3JpdHRlbgorICAgICogW1RIUklGVC0yODQwXSAtIENhYmFsIGZpbGUgcG9pbnRzIHRvIExJQ0VOU0UgZmlsZSBvdXRzaWRlIHRoZSBwYXRoIG9mIHRoZSBIYXNrZWxsIHByb2plY3QuCisgICAgKiBbVEhSSUZULTI4MThdIC0gVHJhaWxpbmcgY29tbWFzIGluIGFycmF5CisgICAgKiBbVEhSSUZULTI4MzBdIC0gQ2xlYW4gdXAgYW50IHdhcm5pbmdzIGluIHR1dG9yaWFsIGRpcgorICAgICogW1RIUklGVC0yODQyXSAtIEVybGFuZyB0aHJpZnQgY2xpZW50IGhhcyBpbmZpbml0ZSB0aW1lb3V0CisgICAgKiBbVEhSSUZULTI4MTBdIC0gRG8gbm90IGxlYXZlIHRoZSB1bmRlcmx5aW5nIFNlcnZlclNvY2tldCBvcGVuIGlmIGNvbnN0cnVjdGlvbiBvZiBUU2VydmVyU29ja2V0IGZhaWxzCisgICAgKiBbVEhSSUZULTI4MTJdIC0gR28gc2VydmVyIGFkZGluZyByZWR1bmRhbnQgYnVmZmVyaW5nIGxheWVyCisgICAgKiBbVEhSSUZULTI4MzldIC0gVEZyYW1lZFRyYW5zcG9ydCByZWFkIGJ1ZworICAgICogW1RIUklGVC0yODQ0XSAtIE5vZGVqcyBzdXBwb3J0IGJyb2tlbiB3aGVuIHJ1bm5pbmcgdW5kZXIgQnJvd3NlcmlmeQorICAgICogW1RIUklGVC0yODE0XSAtIGFyZ3MvcmVzdWx0IGNsYXNzZXMgbm90IGZvdW5kIHdoZW4gbm8gbmFtZXNwYWNlIGlzIHNldAorICAgICogW1RIUklGVC0yODQ3XSAtIGZ1bmN0aW9uIElmVmFsdWUoKSBpcyBhIGR1cGxpY2F0ZSBvZiBTeXN0ZW0uU3RyVXRpbHMuSWZUaGVuCisgICAgKiBbVEhSSUZULTI4NDhdIC0gY2VydGFpbiBEZWxwaGkgdGVzdHMgZG8gbm90IGJ1aWxkIGlmIFR5cGVSZWdpc3RyeSBpcyB1c2VkCisgICAgKiBbVEhSSUZULTI4NTRdIC0gR28gU3RydWN0IHdyaXRlciBhbmQgcmVhZGVyIGxvb3NlcyBpbXBvcnRhbnQgZXJyb3IgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjg1OF0gLSBFbmFibGUgaGVhZGVyIGZpZWxkIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggaW4gVEh0dHBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjg1N10gLSBDIyBnZW5lcmF0b3IgY3JlYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3Igc3RydWN0IGNvbnN0YW50cworICAgICogW1RIUklGVC0yODYwXSAtIERlbHBoaSBzZXJ2ZXIgY2xvc2VzIGNvbm5lY3Rpb24gb24gdW5leHBlY3RlZCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTI4NjhdIC0gRW5oYW5jZSBlcnJvciBoYW5kbGluZyBpbiB0aGUgR28gY2xpZW50IAorICAgICogW1RIUklGVC0yODc5XSAtIFRNZW1vcnlCdWZmZXI6IHVzaW5nIGx1YSBzdHJpbmcgaW4gd3Jvbmcgd2F5CisgICAgKiBbVEhSSUZULTI4NTFdIC0gUmVtb3ZlIHN0cmFuZ2UgcHVibGljIFBlZWsoKSBmcm9tIEdvIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtMjg1Ml0gLSBCZXR0ZXIgT3Blbi9Jc09wZW4vQ2xvc2UgYmVoYXZpb3IgZm9yIFN0cmVhbVRyYW5zcG9ydC4KKyAgICAqIFtUSFJJRlQtMjg3MV0gLSBNaXNzaW5nIHNlbWljb2xvbiBpbiB0aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMjg3Ml0gLSBUaHJlYWRNYW5hZ2VyIGRlYWRsb2NrIGZvciB0YXNrIGV4cGlyYXRpb24KKyAgICAqIFtUSFJJRlQtMjg4MV0gLSBIYW5kbGUgZXJyb3JzIGZyb20gQWNjZXB0KCkgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTI4NDldIC0gU3BlbGwgZXJyb3JzIHJlcG9ydGVkIGJ5IGNvZGVzcGVsbCB0b29sCisgICAgKiBbVEhSSUZULTI4NzBdIC0gQysrIFRKU09OUHJvdG9jb2wgdXNpbmcgbG9jYWxlIGRlcGVuZGVudCBmb3JtYXR0aW5nCisgICAgKiBbVEhSSUZULTI4ODJdIC0gTHVhIEdlbmVyYXRvcjogdXNpbmcgc3RyaW5nLmxlbiBmdW50aW9uIHRvIGdldCBzdHJ1Y3QobWFwLGxpc3Qsc2V0KSBzaXplCisgICAgKiBbVEhSSUZULTI4NjRdIC0gSlNPTiBnZW5lcmF0b3IgbWlzc2luZyBmcm9tIFZpc3VhbCBTdHVkaW8gYnVpbGQgcHJvamVjdCAKKyAgICAqIFtUSFJJRlQtMjg3OF0gLSBHbyB2YWxpZGF0aW9uIHN1cHBvcnQgb2YgcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTI4NzNdIC0gVFBpcGUgYW5kIFRQaXBlU2VydmVyIGRvbid0IGNvbXBpbGUgb24gV2luZG93cyB3aXRoIFVOSUNPREUgZW5hYmxlZAorICAgICogW1RIUklGVC0yODg4XSAtIGltcG9ydCBvZiA8bGltaXRzPiBpcyBtaXNzaW5nIGluIEpTT04gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI5MDBdIC0gUHl0aG9uIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlc2V0IHNvY2tldCB0aW1lb3V0IG9uIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yOTA3XSAtICdudG9obGwnIG1hY3JvIHJlZGVmaW5lZAorICAgICogW1RIUklGVC0yODg0XSAtIE1hcCBkb2VzIG5vdCBzZXJpYWxpemUgY29ycmVjdGx5IGZvciBKU09OIHByb3RvY29sIGluIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjg4N10gLSAtLXdpdGgtb3BlbnNzbCBjb25maWd1cmUgZmxhZyBpcyBpZ25vcmVkCisgICAgKiBbVEhSSUZULTI4OTRdIC0gUEhQIGpzb24gc2VyaWFsaXplciBza2lwcyBtYXBzIHdpdGggaW50L2Jvb2wga2V5cworICAgICogW1RIUklGVC0yOTA0XSAtIGpzb25fcHJvdG9jb2xfdGVzdC5nbyBmYWlscworICAgICogW1RIUklGVC0yOTA2XSAtIGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMjg5MF0gLSBiaW5hcnkgZGF0YSBtYXkgbG9zZSBieXRlcyB3aXRoIEpTT04gdHJhbnNwb3J0IHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMKKyAgICAqIFtUSFJJRlQtMjg5MV0gLSBiaW5hcnkgZGF0YSBtYXkgY2F1c2UgYSBmYWlsdXJlIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworICAgICogW1RIUklGVC0yOTAxXSAtIEZpeCBmb3IgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgZnVuY3Rpb25zICsgaW5kZW50YXRpb24gb2YgSmF2YVNjcmlwdCBtYXBzCisgICAgKiBbVEhSSUZULTI5MTZdIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC0yOTE4XSAtIFJhY2UgY29uZGl0aW9uIGluIFB5dGhvbiBUUHJvY2Vzc1Bvb2xTZXJ2ZXIgdGVzdAorICAgICogW1RIUklGVC0yOTIwXSAtIEVybGFuZyBUaHJpZnQgdGVzdCB1c2VzIHdyb25nIElETCBmaWxlCisgICAgKiBbVEhSSUZULTI5MjJdIC0gJFRSSUFMIGlzIHVzZWQgd2l0aCBQeXRob24gdGVzdHMgYnV0IG5vdCB0ZXN0ZWQgYWNjb3JkaW5nbHkKKyAgICAqIFtUSFJJRlQtMjkxMl0gLSBBdXRvdG9vbCBidWlsZCBmb3IgQysrIFF0IGxpYnJhcnkgaXMgaW52YWxpZAorICAgICogW1RIUklGVC0yOTE0XSAtIGV4cGxpY2l0IGRlcGVuZGVuY3kgdG8gTHVhNS4yIGZhaWxzIG9uIHNvbWUgc3lzdGVtcworICAgICogW1RIUklGVC0yOTEwXSAtIGxpYmV2ZW50IGlzIG5vdCByZWFsbHkgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMjkxMV0gLSBmaXggYysrIHZlcnNpb24gemVyb21xIHRyYW5zcG9ydCwgdGhlIG9sZCB2ZXJzaW9uIGNhbm5vdCB3b3JrCisgICAgKiBbVEhSSUZULTI5MTVdIC0gTHVhIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTI5MTddIC0gIm1ha2UgY2xlYW4iIGJyZWFrcyB0ZXN0L2NfZ2xpYgorICAgICogW1RIUklGVC0yOTE5XSAtIEhheGUgdGVzdCBzZXJ2ZXIgdGltZW91dCB0b28gbGFyZ2UKKyAgICAqIFtUSFJJRlQtMjkyM10gLSBKYXZhU2NyaXB0IGNsaWVudCBhc3N1bWVzIGEgbWVzc2FnZSBiZWluZyB3cml0dGVuCisgICAgKiBbVEhSSUZULTI5MjRdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoZXMgd2hlbiB1c2VyLXByb3ZpZGVkIGV2ZW50X2Jhc2UgaXMgdXNlZAorICAgICogW1RIUklGVC0yOTI1XSAtIENNYWtlIGJ1aWxkIGRvZXMgbm90IHdvcmsgd2l0aCBPcGVuU1NMIG5vciBhbnl0aGluZyBpbnN0YWxsZWQgaW4gbm9uLXN5c3RlbSBsb2NhdGlvbgorICAgICogW1RIUklGVC0yOTMxXSAtIEFjY2VzcyB0byB1bmRlY2xhcmVkIHN0YXRpYyBwcm9wZXJ0eTogVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVECisgICAgKiBbVEhSSUZULTI4OTNdIC0gQ01ha2UgYnVpbGQgZmFpbHMgd2l0aCBib29zdCB0aHJlYWQgb3Igc3RkIHRocmVhZAorICAgICogW1RIUklGVC0yOTAyXSAtIEdlbmVyYXRlZCBjX2dsaWIgY29kZSBkb2VzIG5vdCBjb21waWxlIHdpdGggY2xhbmcKKyAgICAqIFtUSFJJRlQtMjkwM10gLSBRdDQgbGlicmFyeSBidWlsdCB3aXRoIENNYWtlIGRvZXMgbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMjk0Ml0gLSBDU2hhcnAgZ2VuZXJhdGUgaW52YWxpZCBjb2RlIGZvciBwcm9wZXJ0eSBuYW1lZCByZWFkIG9yIHdyaXRlCisgICAgKiBbVEhSSUZULTI5MzJdIC0gTm9kZS5qcyBUaHJpZnQgY29ubmVjdGlvbiBsaWJyYXJpZXMgdGhyb3cgRXhjZXB0aW9ucyBpbnRvIGV2ZW50IGVtaXR0ZXIKKyAgICAqIFtUSFJJRlQtMjkzM10gLSB2MC45LjI6IGRvdWJsZXMgZW5jb2RlZCBpbiBub2RlIHdpdGggY29tcGFjdCBwcm90b2NvbCBjYW5ub3QgYmUgZGVjb2RlZCBieSBweXRob24KKyAgICAqIFtUSFJJRlQtMjkzNF0gLSBjcmVhdGVTZXJ2ZXIgc2lnbmF0dXJlIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTI5ODFdIC0gSURMIHdpdGggbm8gbmFtZXNwYWNlIHByb2R1Y2VzIHVucGFyc2FibGUgUEhQCisgICAgKiBbVEhSSUZULTI5OTldIC0gQWRkaXRpb24gb2YgLmdpdGF0dHJpYnV0ZXMgdGV4dCBhdXRvIGluIFRIUklGVC0yNzI0IGNhdXNlcyBtb2RpZmllZCBmaWxlcyBvbiBjaGVja291dAorICAgICogW1RIUklGVC0yOTQ5XSAtIHR5cG8gaW4gY29tcGlsZXIvY3BwL1JFQURNRS5tZAorICAgICogW1RIUklGVC0yOTU3XSAtIHdhcm5pbmc6IHNvdXJjZSBmaWxlICVzIGlzIGluIGEgc3ViZGlyZWN0b3J5LCBidXQgb3B0aW9uICdzdWJkaXItb2JqZWN0cycgaXMgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMjk1M10gLSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IGlzIG5vdCBTdG9wKClhYmxlCisgICAgKiBbVEhSSUZULTI5NjJdIC0gRG9ja2VyIFRocmlmdCBlbnYgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nCisgICAgKiBbVEhSSUZULTI5NzFdIC0gQysrIHRlc3QgYW5kIHR1dG9yaWFsIHBhcmFsbGVsIGJ1aWxkIGlzIHVuc3RhYmxlCisgICAgKiBbVEhSSUZULTI5NzJdIC0gTWlzc2luZyBiYWNrc2xhc2ggaW4gbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTI5NTFdIC0gRml4IEVybGFuZyBuYW1lIGNvbmZsaWN0IHRlc3QKKyAgICAqIFtUSFJJRlQtMjk1NV0gLSBVc2luZyBsaXN0IG9mIHR5cGVkZWZzIGRvZXMgbm90IGNvbXBpbGUgb24gR28KKyAgICAqIFtUSFJJRlQtMjk2MF0gLSBuYW1lc3BhY2UgcmVncmVzc2lvbiBmb3IgUnVieQorICAgICogW1RIUklGVC0yOTU5XSAtIG5vZGVqczogZml4IGJpbmFyeSB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NjZdIC0gbm9kZWpzOiBGaXggYmFkIHJlZmVyZW5jZXMgdG8gVFByb3RvY29sRXhjZXB0aW9uIGFuZCBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCisgICAgKiBbVEhSSUZULTI5NzBdIC0gZ3J1bnQtanNkb2MgZmFpbHMgZHVlIHRvIGRlcGVuZGVuY3kgaXNzdWVzCisgICAgKiBbVEhSSUZULTMwMDFdIC0gQyMgRXF1YWxzIGZhaWxzIGZvciBiaW5hcnkgZmllbGRzIChieXRlW10pCisgICAgKiBbVEhSSUZULTMwMDNdIC0gTWlzc2luZyBMSUNFTlNFIGZpbGUgcHJldmVudHMgcGFja2FnZSBmcm9tIGJlaW5nIGluc3RhbGxlZAorICAgICogW1RIUklGVC0zMDA4XSAtIE5vZGUuanMgc2VydmVyIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMwMDddIC0gVHJhdmlzIGJ1aWxkIGlzIGJyb2tlbiBiZWNhdXNlIG9mIGRpcmVjdG9yeSBjb25mbGljdAorICAgICogW1RIUklGVC0zMDA5XSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgdXNlIHRoZSBjb3JyZWN0IGhvc3RuYW1lIChicmVha3MgY2VydGlmaWNhdGUgY2hlY2tzKQorICAgICogW1RIUklGVC0zMDExXSAtIEMjIHRlc3Qgc2VydmVyIHRlc3RFeGNlcHRpb24oKSBub3QgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHNwZWNzCisgICAgKiBbVEhSSUZULTMwMTJdIC0gVGltaW5nIHByb2JsZW1zIGluIE5hbWVkUGlwZSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdW5uZWNlc3Nhcnkgb3Blbi9jbG9zZQorICAgICogW1RIUklGVC0zMDE5XSAtIEdvbGFuZyBnZW5lcmF0b3IgbWlzc2luZyBkb2NzdHJpbmcgZm9yIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMzAyMV0gLSBTZXJ2aWNlIHJlbW90ZSB0b29sIGRvZXMgbm90IGltcG9ydCBzdHViIHBhY2thZ2Ugd2l0aCBwYWNrYWdlIHByZWZpeAorICAgICogW1RIUklGVC0zMDI2XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzAyOF0gLSBSZWdyZXNzaW9uIGNhdXNlZCBieSBUSFJJRlQtMjE4MAorICAgICogW1RIUklGVC0zMDE3XSAtIG9yZGVyIG9mIG1hcCBrZXkvdmFsdWUgdHlwZXMgaW5jb3JyZWN0IGZvciBvbmUgQ1RPUgorICAgICogW1RIUklGVC0zMDIwXSAtIENhbm5vdCBjb21waWxlIHRocmlmdCBhcyBDKyswMworICAgICogW1RIUklGVC0zMDI0XSAtIFVzZXItQWdlbnQgIkJhdHRsZU5ldCIgdXNlZCBpbiBzb21lIFRocmlmdCBsaWJyYXJ5IGZpbGVzCisgICAgKiBbVEhSSUZULTMwNDddIC0gVW5ldmVuIGNhbGxzIHRvIGluZGVudF91cCBhbmQgaW5kZW50X2Rvd24gaW4gQ29jb2EgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTMwNDhdIC0gTm9kZUpTIGRlY29kaW5nIG9mIEk2NCBpcyBpbmNvbnNpc3RlbnQgYWNyb3NzIHByb3RvY29scworICAgICogW1RIUklGVC0zMDQzXSAtIGdvIGNvbXBpbGVyIGdlbmVyYXRvciB1c2VzIG5vbiBDKys5OCBjb2RlCisgICAgKiBbVEhSSUZULTMwNDRdIC0gRG9ja2VyIFJFQURNRS5tZCBwYXRocyB0byBEb2NrZXJmaWxlcyBhcmUgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTMwNDBdIC0gYm93ZXIuanNvbiB3cm9uZyAibWFpbiIgcGF0aAorICAgICogW1RIUklGVC0zMDUxXSAtIEdvIFRocmlmdCBnZW5lcmF0b3IgY3JlYXRlcyBiYWQgZ28gY29kZQorICAgICogW1RIUklGVC0zMDU3XSAtIEphdmEgY29tcGlsZXIgYnVpbGQgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTMwNjFdIC0gQysrIFRTU0xTb2NrZXQgc2h1dGRvd24gZGVsYXkvdnVsbmVyYWJpbGl0eQorICAgICogW1RIUklGVC0zMDYyXSAtIEMrKyBUU2VydmVyU29ja2V0IGludmFsaWQgcG9ydCBudW1iZXIgKG92ZXIgOTk5OTk5KSBjYXVzZXMgc3RhY2sgY29ycnVwdGlvbgorICAgICogW1RIUklGVC0zMDY1XSAtIFVwZGF0ZSBsaWJ0aHJpZnQgZGVwZW5kZW5jaWVzIChzbGY0aiwgaHR0cGNvcmUsIGh0dHBjbGllbnQpCisgICAgKiBbVEhSSUZULTMyNDRdIC0gVHlwZVNjcmlwdDogZml4IG5hbWVzcGFjZSBvZiBpbmNsdWRlZCB0eXBlcworICAgICogW1RIUklGVC0zMjQ2XSAtIFJlZHVjZSB0aGUgbnVtYmVyIG9mIHRyaXZpYWwgd2FybmluZ3MgaW4gV2luZG93cyBDKysgQ01ha2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTMyMjRdIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXIgdW5wcmVkaWN0YWJsZSBiZWhhdmlvciBvbiBhY2NlcHQKKyAgICAqIFtUSFJJRlQtMzIzMF0gLSBQeXRob24gY29tcGlsZXIgZ2VuZXJhdGVzIHdyb25nIGNvZGUgaWYgdGhlcmUgaXMgZnVuY3Rpb24gdGhyb3dpbmcgYSB0eXBlZGVmIG9mIGV4Y2VwdGlvbiB3aXRoIGFub3RoZXIgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTMyMzZdIC0gTWF4U2tpcERlcHRoIG5ldmVyIGNoZWNrZWQKKyAgICAqIFtUSFJJRlQtMzIzOV0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzI0MV0gLSBmYXRhbCBlcnJvcjogcnVudGltZTogY2Fubm90IG1hcCBwYWdlcyBpbiBhcmVuYSBhZGRyZXNzIHNwYWNlCisgICAgKiBbVEhSSUZULTMyNDJdIC0gT1NHaSBJbXBvcnQtUGFja2FnZSBkaXJlY3RpdmUgaXMgbWlzc2luZyB0aGUgQXBhY2hlIEhUVFAgcGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMzIzNF0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzIyMl0gLSBUeXBlU2NyaXB0OiBHZW5lcmF0ZWQgRW51bXMgYXJlIHF1b3RlZAorICAgICogW1RIUklGVC0zMjI5XSAtIHVuZXhwZWN0ZWQgVGltZW91dCBleGNlcHRpb24gd2hlbiBkZXNpcmVkIGJ5dGVzIGFyZSBvbmx5IHBhcnRpYWxseSBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzIzMV0gLSBDUFA6IExpbWl0IHJlY3Vyc2lvbiBkZXB0aCB0byA2NAorICAgICogW1RIUklGVC0zMjM1XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMTc1XSAtIGZhc3RiaW5hcnkuYyBweXRob24gZGVzZXJpYWxpemUgY2FuIGNhdXNlIGh1Z2UgYWxsb2NhdGlvbnMgZnJvbSBnYXJiYWdlCisgICAgKiBbVEhSSUZULTMxNzZdIC0gVW5pb24gaW5jb3JyZWN0bHkgaW1wbGVtZW50cyA9PQorICAgICogW1RIUklGVC0zMTc3XSAtIEZhaWxzIHRvIHJ1biByYWtlIHRlc3QKKyAgICAqIFtUSFJJRlQtMzE4MF0gLSBsdWEgcGx1Z2luOiBmcmFtZWQgdHJhbnNwb3J0IGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMxNzldIC0gbHVhIHBsdWdpbiBjYW50IGNvbm5lY3QgdG8gcmVtb3RlIHNlcnZlciBiZWNhdXNlIGZ1bmN0aW9uIGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdCBhbHdheXMgYmluZCBzb2NrZXQgdG8gbG9jYWxob3N0CisgICAgKiBbVEhSSUZULTMyNDhdIC0gVHlwZVNjcmlwdDogYWRkaXRpb25hbCBjb21tYSBpbiBtZXRob2Qgc2lnbmF0dXJlIHdpdGhvdXQgcGFyYW1ldGVycworICAgICogW1RIUklGVC0zMzAyXSAtIEdvIEpTT04gcHJvdG9jb2wgc2hvdWxkIGVuY29kZSBUaHJpZnQgYnl0ZSB0eXBlIGFzIHNpZ25lZCBpbnRlZ2VyIHN0cmluZworICAgICogW1RIUklGVC0zMjk3XSAtIGNfZ2xpYjogYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMyOTRdIC0gVFpsaWJUcmFuc3BvcnQgZm9yIEphdmEgZG9lcyBub3Qgd3JpdGUgZGF0YSBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzI5Nl0gLSBHbyBjcm9zcyB0ZXN0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3BlYworICAgICogW1RIUklGVC0zMjk1XSAtIEMjIGxpYnJhcnkgZG9lcyBub3QgYnVpbGQgb24gTW9ubyA0LjAuMi41IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTMyOTNdIC0gSmF2YVNjcmlwdDogbnVsbCB2YWx1ZXMgdHVybiBpbnRvIGVtcHR5IHN0cnVjdHMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzMxMF0gLSBsaWIvZXJsL1JFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1hdHRpbmcKKyAgICAqIFtUSFJJRlQtMzMxOV0gLSBDU2hhcnAgdHV0b3JpYWwgd2lsbCBub3QgYnVpbGQgdXNpbmcgdGhlICouc2xuCisgICAgKiBbVEhSSUZULTMzMzVdIC0gUnVieSBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzMzOF0gLSBTdHJheSB1bmRlcnNjb3JlIGluIGdlbmVyYXRlZCBnbyB3aGVuIHNlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCAiTmV3IgorICAgICogW1RIUklGVC0zMzI0XSAtIFVwZGF0ZSBHbyBEb2NzIGZvciBwdWxsaW5nIGFsbCBwYWNrYWdlcworICAgICogW1RIUklGVC0zMzQ1XSAtIENsaWVudHMgYmxvY2tlZCBpbmRlZmluaXRlbHkgd2hlbiBhIGphdmEubGFuZy5FcnJvciBpcyB0aHJvd24KKyAgICAqIFtUSFJJRlQtMzMzMl0gLSBtYWtlIGRpc3QgZmFpbHMgb24gY2xlYW4gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzMyNl0gLSBUZXN0cyBkbyBub3QgY29tcGlsZSB1bmRlciAqQlNECisgICAgKiBbVEhSSUZULTMzMzRdIC0gTWFya2Rvd24gbm90YXRpb24gb2YgcHJvdG9jb2wgc3BlYyBpcyBtYWxmb3JtZWQKKyAgICAqIFtUSFJJRlQtMzMzMV0gLSB3YXJuaW5nOiDDouKCrMucZXR5cGXDouKCrOKEoiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzM0OV0gLSBQeXRob24gc2VydmVyIGRvZXMgbm90IGhhbmRsZSBwcm9jZXNzb3IgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzNDNdIC0gRml4IGhhc2tlbGwgUkVBRE1FCisgICAgKiBbVEhSSUZULTMzNDBdIC0gUHl0aG9uOiBlbmFibGUganNvbiB0ZXN0cyBhZ2FpbgorICAgICogW1RIUklGVC0zMzExXSAtIFRvcCBsZXZlbCBSRUFETUUubWQgaGFzIGluY29ycmVjdCBmb3JtbWF0aW5nCisgICAgKiBbVEhSSUZULTI5MzZdIC0gTWlub3IgbWVtb3J5IGxlYWsgaW4gU1NMCisgICAgKiBbVEhSSUZULTMyOTBdIC0gVXNpbmcgZnJvbSBpbiB2YXJpYWJsZSBuYW1lcyBjYXVzZXMgdGhlIGdlbmVyYXRlZCBQeXRob24gY29kZSB0byBoYXZlIGVycm9ycworICAgICogW1RIUklGVC0zMjI1XSAtIEZpeCBUUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGludGVycnVwdCgpCisgICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorICAgICogW1RIUklGVC0yMDA2XSAtIFRCaW5hcnlQcm90b2NvbCBtZXNzYWdlIGhlYWRlciBjYWxsIG5hbWUgbGVuZ3RoIGlzIG5vdCB2YWxpZGF0ZWQgYW5kIGNhbiBiZSB1c2VkIHRvIGNvcmUgdGhlIHNlcnZlcgorICAgICogW1RIUklGVC0zMzI5XSAtIEMrKyBsaWJyYXJ5IHVuaXQgdGVzdHMgZG9uJ3QgY29tcGlsZSBhZ2FpbnN0IHRoZSBuZXcgYm9vc3QtMS41OSB1bml0IHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI2MzBdIC0gd2luZG93czcgNjRiaXQgcGMuIGlwdjQgYW5kIGlwdjYgcGMuY2FuJ3QgdXNlCisgICAgKiBbVEhSSUZULTMzMzZdIC0gVGhyaWZ0IGdlbmVyYXRlZCBzdHJlYW1pbmcgb3BlcmF0b3JzIGFkZGVkIGluIDAuOS4yIGNhbm5vdCBiZSBvdmVycmlkZGVuCisgICAgKiBbVEhSSUZULTI2ODFdIC0gQ29yZSBvZiB1bndpbmRfY2xlYW51cAorICAgICogW1RIUklGVC0zMzE3XSAtIGNwcCBuYW1lc3BhY2Ugb3JnLmFwYWNoZSBpc3N1ZSBhcHBlYXJzIGluIDAuOQorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMyODZdIC0gQXBhY2hlIEFudCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlbmN5CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTIyN10gLSBCeXRlW10gaW4gY29sbGVjdGlvbnMgYXJlbid0IHByZXR0eSBwcmludGVkIGxpa2UgcmVndWxhciBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTI3NDRdIC0gVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjY0NF0gLSBIYXhlIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjc1Nl0gLSByZWdpc3RlciBNZWRpYSBUeXBlIEAgSUFOQQorICAgICogW1RIUklGVC0zMDc2XSAtIENvbXBhdGliaWxpdHkgd2l0aCBIYXhlIDMuMi4wCisgICAgKiBbVEhSSUZULTMwODFdIC0gQysrIENvbnNvbGlkYXRlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3BzIGluIFRTZXJ2ZXJzCisgICAgKiBbVEhSSUZULTMwODNdIC0gQysrIENvbnNvbGlkYXRlIHNlcnZlciBwcm9jZXNzaW5nIGxvb3BzIGluIFRTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzA4NF0gLSBDKysgYWRkIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0IHRvIHRocmVhZGVkIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMzA3NF0gLSAgICAgQWRkIGNvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjIHRvIGdpdGlnbm9yZS4KKyAgICAqIFtUSFJJRlQtMzEzNF0gLSBSZW1vdmUgdXNlIG9mIGRlcHJlY2F0ZWQgInBoYW50b20uYXJncyIKKyAgICAqIFtUSFJJRlQtMzEzM10gLSBBbGxvdyAibWFrZSBjcm9zcyIgYW5kICJtYWtlIHByZWNyb3NzIiB0byBydW4gd2l0aG91dCBidWlsZGluZyBhbGwgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTMxNDJdIC0gTWFrZSBKYXZhU2NyaXB0IHVzZSBkb3dubG9hZGVkIGxpYnJhcmllcworICAgICogW1RIUklGVC0zMTQxXSAtIEltcHJvdmUgbG9nZ2luZyBvZiBKYXZhU2NyaXB0IHRlc3QKKyAgICAqIFtUSFJJRlQtMzE0NF0gLSBQcm9wb3NhbDogbWFrZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW51bXMgaW4gZ2VuZXJhdGVkIGdvIGNvZGUgbGVzcyB2ZXJib3NlCisgICAgKiBbVEhSSUZULTMxMzBdIC0gUmVtb3ZlIHRoZSBsYXN0IHZlc3RpZ2VzIG9mIFRIUklGVF9PVkVSTE9BRF9JRiBmcm9tIFRIUklGVC0xMzE2CisgICAgKiBbVEhSSUZULTMxMzFdIC0gQ29uc29saWRhdGUgc3VnZ2VzdGVkIGltcG9ydCBwYXRoIGZvciBnbyB0aHJpZnQgbGlicmFyeSB0byBnaXQuYXBhY2hlLm9yZyBpbiBkb2NzIGFuZCBjb2RlCisgICAgKiBbVEhSSUZULTMwOTJdIC0gR2VuZXJhdGVkIEhhc2tlbGwgdHlwZXMgc2hvdWxkIGRlcml2ZSBHZW5lcmljCisgICAgKiBbVEhSSUZULTMxMTBdIC0gIFByaW50IGVycm9yIGxvZyBhZnRlciBjcm9zcyB0ZXN0IGZhaWx1cmVzIG9uIFRyYXZpcworICAgICogW1RIUklGVC0zMTE0XSAtIFVzaW5nIGxvY2FsIHRlbXAgdmFyaWFibGVzIHRvIG5vdCBwb2xsdXRlIHRoZSBnbG9iYWwgdGFibGUKKyAgICAqIFtUSFJJRlQtMzEwNl0gLSBDTWFrZSBzdW1tYXJ5IHNob3VsZCBnaXZlIG1vcmUgaW5mb3JtYXRpb24gd2h5IGEgbGlicmFyeSBpcyBzZXQgdG8gb2ZmCisgICAgKiBbVEhSSUZULTMxMTldIC0gSmF2YSdzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGhhcyBpbmRpc3Rpbmd1aXNoYWJsZSBsb2cgbWVzc2FnZXMgaW4gcnVuKCkKKyAgICAqIFtUSFJJRlQtMzEyMl0gLSBKYXZhc2NyaXB0IHN0cnVjdCBjb25zdHJ1Y3RvciBzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBzdHJ1Y3QgYW5kIGNvbnRhaW5lciBtZW1iZXJzIGZyb20gcGxhaW4ganMgYXJndW1lbnRzCisgICAgKiBbVEhSSUZULTMxNTFdIC0gRml4IGxpbmtzIHRvIGdpdC13aXAqIC0gc2hvdWxkIGJlIGdpdC5hcGFjaGUub3JnCisgICAgKiBbVEhSSUZULTMxNjddIC0gV2luZG93cyBidWlsZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBiZSByZXZpc2VkCisgICAgKiBbVEhSSUZULTMxNTVdIC0gbW92ZSBjb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIHRvIGJ1aWxkL2NtYWtlLworICAgICogW1RIUklGVC0zMTYwXSAtIE1ha2UgZ2VuZXJhdGVkIGdvIGVudW1zIGltcGxlbWVudCBUZXh0TWFyc2hhbGxlciBhbmQgVGV4dFVubWFyc2hhbGxlciBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTMxNTBdIC0gQWRkIGFuIG9wdGlvbiB0byB0aHJpZnQgZ28gZ2VuZXJhdG9yIHRvIG1ha2UgUmVhZCBhbmQgV3JpdGUgbWV0aG9kcyBwcml2YXRlCisgICAgKiBbVEhSSUZULTMxNDldIC0gTWFrZSBSZWFkRmllbGROIG1ldGhvZHMgaW4gZ2VuZXJhdGVkIEdvIGNvZGUgcHJpdmF0ZQorICAgICogW1RIUklGVC0zMTcyXSAtIEFkZCB0dXRvcmlhbCB0byBUaHJpZnQgd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtMzIxNF0gLSBBZGQgRXJsYW5nIG9wdGlvbiBmb3IgdXNpbmcgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzCisgICAgKiBbVEhSSUZULTMyMDFdIC0gQ2FwdHVyZSBnaXRodWIgdGVzdCBhcnRpZmFjdHMgZm9yIGZhaWxlZCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2Nl0gLSBjX2dsaWI6IE11bHRpcGxlIGNvbXBpbGVyIHdhcm5pbmdzIGJ1aWxkaW5nIHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzI4NV0gLSBjX2dsaWI6IEJ1aWxkIGxpYnJhcnkgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTE5NTRdIC0gQWxsb3cgZm9yIGEgc2VwYXJhdGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIAorICAgICogW1RIUklGVC0yMDk4XSAtIEFkZCBzdXBwb3J0IGZvciBRdDUrCisgICAgKiBbVEhSSUZULTIxOTldIC0gUmVtb3ZlIERlbnNlIHByb3RvY29sICh3YXM6IG1vdmUgdG8gQ29udHJpYikKKyAgICAqIFtUSFJJRlQtNDA2XSAtIEMrKyBUZXN0IHN1aXRlIGNsZWFudXAKKyAgICAqIFtUSFJJRlQtOTAyXSAtIHNvY2tldCBhbmQgY29ubmVjdCB0aW1lb3V0IGluIFRTb2NrZXQgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQKKyAgICAqIFtUSFJJRlQtMzg4XSAtIFVzZSBhIHNlcGFyYXRlIHdpcmUgZm9ybWF0IGZvciBhc3luYyBjYWxscworICAgICogW1RIUklGVC03MjddIC0gc3VwcG9ydCBuYXRpdmUgQysrIGxhbmd1YWdlIHNwZWNpZmljIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgKiBbVEhSSUZULTE3ODRdIC0gcGVwLTMxMTAgY29tcGxpYW5jZSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIAorICAgICogW1RIUklGVC0xMDI1XSAtIEMrKyBTZXJ2ZXJTb2NrZXQgc2hvdWxkIGluaGVyaXQgZnJvbSBTb2NrZXQgd2l0aCB0aGUgbmVjZXNzYXJ5IEN0b3IgdG8gbGlzdGVuIG9uIGNvbm5lY3Rpb25zIGZyb20gYSBzcGVjaWZpYyBob3N0CisgICAgKiBbVEhSSUZULTIyNjldIC0gQ2FuIGRlcGxveSBsaWJ0aHJpZnQtc291cmNlLmphciB0byBtYXZlbiBjZW50ZXIgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0yODA0XSAtIFB1bGwgYW4gaW50ZXJmYWNlIG91dCBvZiBUQmFzZUFzeW5jUHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTI4MDZdIC0gbW9yZSB3aGl0ZXNwYWNlIGZpeHVwcworICAgICogW1RIUklGVC0yODExXSAtIE1ha2UgcmVtb3RlIHNvY2tldCBhZGRyZXNzIGFjY2Vzc2libGUKKyAgICAqIFtUSFJJRlQtMjgwOV0gLSAuZ2l0aWdub3JlIHVwZGF0ZSBmb3IgY29tcGlsZXIncyB2aXN1YWwgcHJvamVjdAorICAgICogW1RIUklGVC0yODQ2XSAtIEV4cG9zZSBjaXBoZXJzIHBhcmFtZXRlciBmcm9tIHNzbC53cmFwX3NvY2tldCgpCisgICAgKiBbVEhSSUZULTI4NTldIC0gSlNPTiBnZW5lcmF0b3I6IG91dHB1dCBjb21wbGV0ZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yODYxXSAtIGFkZCBidWZmZXJlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjg2NV0gLSBUZXN0IGNhc2UgZm9yIEdvOiBTZXFJZCBvdXQgb2Ygc2VxdWVuY2UKKyAgICAqIFtUSFJJRlQtMjg2Nl0gLSBHbyBnZW5lcmF0b3Igc291cmNlIGNvZGUgaXMgaGFyZCB0byByZWFkIGFuZCBtYWludGFpbgorICAgICogW1RIUklGVC0yODgwXSAtIFJlYWQgdGhlIG5ldHdvcmsgYWRkcmVzcyBmcm9tIHRoZSBsaXN0ZW5lciBpZiBhdmFpbGFibGUuCisgICAgKiBbVEhSSUZULTI4NzVdIC0gVHlwbyBpbiBURGVuc2VQcm90b2NvbC5oIGNvbW1lbnQKKyAgICAqIFtUSFJJRlQtMjg3NF0gLSBUQmluYXJ5UHJvdG9jb2wgIG1lbWJlciB2YXJpYWJsZSAic3RyaW5nX2J1Zl8iIGlzIG5ldmVyIHVzZWQuCisgICAgKiBbVEhSSUZULTI4NTVdIC0gTW92ZSBjb250cmlidXRpbmcubWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMjg2Ml0gLSBFbmFibGUgUlRUSSBhbmQvb3IgYnVpbGQgbWFjcm9zIGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0yODc2XSAtICBBZGQgdGVzdCBmb3IgVEhSSUZULTI1MjYgQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorICAgICogW1RIUklGVC0yODk3XSAtIEdlbmVyYXRlIC1pc0VxdWFsOiBhbmQgLWhhc2ggbWV0aG9kcworICAgICogW1RIUklGVC0yOTA5XSAtIEltcHJvdmUgdHJhdmlzIGJ1aWxkCisgICAgKiBbVEhSSUZULTI5MjFdIC0gTWFrZSBFcmxhbmcgaW1wbCByZWFkeSBmb3IgT1RQIDE4IHJlbGVhc2UgKGRpY3QvMCBhbmQgc2V0LzAgYXJlIGRlcHJlY2F0ZWQpCisgICAgKiBbVEhSSUZULTI5MjhdIC0gUmVuYW1lIHRoZSBlcmxhbmcgdGVzdF9zZXJ2ZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTI5NDBdIC0gQWxsb3cgaW5zdGFsbGluZyBUaHJpZnQgZnJvbSBnaXQgYXMgTlBNIG1vZHVsZSBieSBwcm92aWRpbmcgcGFja2FnZS5qc29uIGluIHRvcCBsZXZlbCBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMjkzN10gLSBBbGxvdyBzZXR0aW5nIGEgbWF4aW11bSBmcmFtZSBzaXplIGluIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjk3Nl0gLSBub2RlanM6IHhociBhbmQgd2Vic29ja2V0IHN1cHBvcnQgZm9yIGJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMjk5Nl0gLSBUZXN0IGZvciBIYXhlIDMuMS4zIG9yIGJldHRlciAKKyAgICAqIFtUSFJJRlQtMjk2OV0gLSBub2RlanM6IERSWSB1cCBsaWJyYXJ5IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NzNdIC0gVXBkYXRlIEhheGUgbGliIHJlYWRtZSByZWdhcmRpbmcgSGF4ZSAzLjEuMworICAgICogW1RIUklGVC0yOTUyXSAtIEltcHJvdmUgaGFuZGxpbmcgb2YgU2VydmVyLlN0b3AoKSAKKyAgICAqIFtUSFJJRlQtMjk2NF0gLSBub2RlanM6IG1vdmUgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGludG8gc2VwYXJhdGUgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjk2M10gLSBub2RlanMgLSBhZGQgdGVzdCBjb3ZlcmFnZQorICAgICogW1RIUklGVC0zMDA2XSAtIEF0dGFjaCAnb21pdGVtcHR5JyBqc29uIHRhZyBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEdvCisgICAgKiBbVEhSSUZULTMwMjddIC0gR28gY29tcGlsZXIgZG9lcyBub3QgZW5zdXJlIGNvbW1vbiBpbml0aWFsaXNtcyBoYXZlIGNvbnNpc3RlbnQgY2FzZQorICAgICogW1RIUklGVC0zMDMwXSAtIFRUaHJlYWRlZFNlcnZlcjogUHJvcGVydHkgZm9yIG51bWJlciBvZiBjbGllbnRUaHJlYWRzCisgICAgKiBbVEhSSUZULTMwMjNdIC0gR28gY29tcGlsZXIgaXMgYSBsaXR0bGUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMKKyAgICAqIFtUSFJJRlQtMzAxOF0gLSBDb21wYWN0IHByb3RvY29sIGZvciBEZWxwaGkKKyAgICAqIFtUSFJJRlQtMzAyNV0gLSBDaGFuZ2UgcHVyZSBJbnQgY29uc3RhbnRzIGludG8gQGVudW1zICh3aGVyZSBwb3NzaWJsZSkKKyAgICAqIFtUSFJJRlQtMzAzMV0gLSBtaWdyYXRlICJzaG91bGRTdG9wIiBmbGFnIHRvIFRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzAyMl0gLSBDb21wYWN0IHByb3RvY29sIGZvciBIYXhlCisgICAgKiBbVEhSSUZULTMwNDFdIC0gR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNsaWVudHMgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTMwNTNdIC0gUGVybCBTU0wgU29ja2V0IFN1cHBvcnQgKEVuY3J5cHRpb24pCisgICAgKiBbVEhSSUZULTMyNDddIC0gR2VuZXJhdGUgYSBDKysgdGhyZWFkLXNhZmUgY2xpZW50CisgICAgKiBbVEhSSUZULTMyMTddIC0gUHJvdmlkZSBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgYmluYXJ5IHByb3RvY29sIGluIEMrKworICAgICogW1RIUklGVC0zMjIzXSAtIFR5cGVTY3JpcHQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIEVudW0gTWFwcworICAgICogW1RIUklGVC0zMjIwXSAtIE9wdGlvbiB0byBzdXBwcmVzcyBAR2VuZXJhdGVkIEFubm90YXRpb24gZW50aXJlbHkKKyAgICAqIFtUSFJJRlQtMzMwMF0gLSBSZWltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhIHVzaW5nIHN0cmVhbXMKKyAgICAqIFtUSFJJRlQtMzI4OF0gLSBjX2dsaWI6IEJ1aWxkIHVuaXQgdGVzdHMgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMzNDddIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM0Ml0gLSBJbXByb3ZlIHJ1YnkgY3Jvc3MgdGVzdCBjbGllbnQgYW5kIHNlcnZlciBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyOTZdIC0gQWRkIEMrKyBCYXNlIGNsYXNzIGZvciBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTMzMzddIC0gQWRkIHRlc3RCb29sIG1ldGhvZCB0byBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC0zMzAzXSAtIERpc2FibGUgY29uY3VycmVudCBjYWJhbCBqb2JzIG9uIFRyYXZpcyB0byBhdm9pZCBHSEMgY3Jhc2gKKyAgICAqIFtUSFJJRlQtMjYyM10gLSBEb2NrZXIgY29udGFpbmVyIGZvciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMzI5OF0gLSB0aHJpZnQgZW5kaWFuIGNvbnZlcnRlcnMgbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTE1NTldIC0gUHJvdmlkZSBtZW1vcnkgcG9vbCBmb3IgVEJpbmFyeVByb3RvY29sIHRvIGVsaW1pbmF0ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbgorICAgICogW1RIUklGVC00MjRdIC0gU3RlYWwgUHJvdG9jb2xCdWZmZXJzJyBWYXJJbnQgaW1wbGVtZW50YXRpb24gZm9yIEMrKworCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0zMDcwXSAtIEFkZCBhYmlsaXR5IHRvIHNldCB0aGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgKiBbVEhSSUZULTE5MDldIC0gSmF2YTogQWRkIGNvbXBpbGVyIGZsYWcgdG8gdXNlIHRoZSAib3B0aW9uIHBhdHRlcm4iIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjA5OV0gLSBTdG9wIFRUaHJlYWRQb29sU2VydmVyIHdpdGggYWxpdmUgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTEyM10gLSBpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0yMzY4XSAtIE5ldyBvcHRpb246IHJldXNlLW9iamVjdHMgZm9yIEphdmEgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI4MzZdIC0gT3B0aW9uYWxseSBnZW5lcmF0ZSBDKysxMSBNb3ZlQ29uc3RydWN0aWJsZSB0eXBlcworICAgICogW1RIUklGVC0yODI0XSAtIEZsYWcgdG8gZGlzYWJsZSBodG1sIGVzY2FwaW5nIGRvY3RleHQKKyAgICAqIFtUSFJJRlQtMjgxOV0gLSBBZGQgV2Vic1NvY2tldCBjbGllbnQgdG8gbm9kZS5qcworICAgICogW1RIUklGVC0zMDUwXSAtIENsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBmb3Igbm9uLWh0dHAgVExTIGluIEMjCisgICAgKiBbVEhSSUZULTMyOTJdIC0gSW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEdvCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI1ODNdIC0gVGhyaWZ0IG9uIHhQQyB0YXJnZXQgKFNwZWVkR29hdCkKKyAgICAqIFtUSFJJRlQtMjU5Ml0gLSB0aHJpZnQgc2VydmVyIHVzaW5nIGNfZ2xpYgorICAgICogW1RIUklGVC0yODMyXSAtIGNfZ2xpYjogSGFuZGxlIHN0cmluZyBsaXN0cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzEzNl0gLSB0aHJpZnQgaW5zdGFsbGF0aW9uIHByb2JsZW0gb24gbWFjCisgICAgKiBbVEhSSUZULTMzNDZdIC0gY19nbGliOiBUdXRvcmlhbHMgZXhhbXBsZSBjcmFzaGVzIHNheWluZyBDYWxjdWxhdG9yLnBpbmcgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI1NzhdIC0gTW92aW5nICdtYWtlIGNyb3NzJyBmcm9tIHRlc3Quc2ggdG8gdGVzdC5weQorICAgICogW1RIUklGVC0yNzM0XSAtIEdvIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0OF0gLSBBZGQgVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjc1M10gLSBNaXNjLiBIYXhlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNjQwXSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzI2Ml0gLSB3YXJuaW5nOiBvdmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIGluIERlbnNlUHJvdG9UZXN0LmNwcAorICAgICogW1RIUklGVC0zMTk0XSAtIENhbid0IGJ1aWxkIHdpdGggZ28gZW5hYmxlZC4gIGdvbW9jayBTQ0MgcGF0aCBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTMyNzVdIC0gY19nbGliIHR1dG9yaWFsIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTExMjVdIC0gTXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjgwN10gLSBQSFAgQ29kZSBTdHlsZQorICAgICogW1RIUklGVC0yODQxXSAtIEFkZCBjb21wcmVoZW5zaXZlIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgd2hvbGUgR28gc3RhY2sKKyAgICAqIFtUSFJJRlQtMjgxNV0gLSBIYXhlOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0yODg2XSAtIEludGVncmF0ZSBiaW5hcnkgdHlwZSBpbiBzdGFuZGFyZCBUaHJpZnQgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0yOTQ2XSAtIEVuaGFuY2UgdXNhYmlsaXR5IG9mIGNyb3NzIHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI5NjddIC0gQWRkIC5lZGl0b3Jjb25maWcgdG8gcm9vdAorICAgICogW1RIUklGVC0zMDMzXSAtIFBlcmw6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTMxNzRdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBkb2Vzbid0IGNoZWNrIGZpcnN0IHdvcmQKKyAgICAqIFtUSFJJRlQtMzE5M10gLSBPcHRpb24gdG8gc3VwcmVzcyBkYXRlIHZhbHVlIGluIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbgorICAgICogW1RIUklGVC0zMzA1XSAtIE1pc3NpbmcgZGlzdCBmaWxlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKyAgICAqIFtUSFJJRlQtMzM0MV0gLSBBZGQgdGVzdEJvb2wgbWV0aG9kcworICAgICogW1RIUklGVC0zMzA4XSAtIEZpeCBicm9rZW4gdGVzdCBjYXNlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKworIyMgVGFzaworICAgICogW1RIUklGVC0yODM0XSAtIFJlbW92ZSBzZW1pLWNvbG9ucyBmcm9tIHB5dGhvbiBjb2RlIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0yODUzXSAtIEFkanVzdCBjb21tZW50cyBub3QgYXBwbHlpbmcgYW55bW9yZSBhZnRlciBUSFJJRlQtMjg1MgorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTMyMTFdIC0gQWRkIG1ha2UgY3Jvc3Mgc3VwcG9ydCBmb3IgcGhwIFRDb21wYWN0UHJvdG9jb2wKKworIyMgV2lzaAorICAgICogW1RIUklGVC0yODM4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjYW4gYmluZCB0byBwb3J0IDAgKGkuZS4sIGdldCBhbiBPUy1hc3NpZ25lZCBwb3J0KSBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgcG9ydCBudW1iZXIKKworCisKK1RocmlmdCAwLjkuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0yNzkzXSAtIEdvIGNvbXBpbGVyIHByb2R1Y2VzIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTE0ODFdIC0gVW5peCBkb21haW4gc29ja2V0cyBpbiBDKysgZG8gbm90IHN1cHBvcnQgdGhlIGFic3RyYWN0IG5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNDU1XSAtIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nIGNhc3RzIGZyb20gc2l6ZV90IHRvIHVpbnQzMl90LCB3aGljaCBpcyBub3Qgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zCisgICAgKiBbVEhSSUZULTE1NzldIC0gUEhQIEV4dGVudGlvbiAtIGZ1bmN0aW9uIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSBub3Qgd29ya2luZyBmcm9tIFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZQorICAgICogW1RIUklGVC0xNTg0XSAtIEVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIG9uIHNpbmdsZS1jb3JlIG1hY2hpbmVzCisgICAgKiBbVEhSSUZULTE2MTRdIC0gVGhyaWZ0IGJ1aWxkIGZyb20gc3ZuIHJlcG8gc291cmNlcyBmYWlscyB3aXRoIGF1dG9tYWtlLTEuMTIKKyAgICAqIFtUSFJJRlQtMTA0N10gLSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSB0cmVhdHMgYXJnIGFzIHN0cmluZyB3aXRob3V0IGNoZWNrLCBzZWdmYXVsdHMgaWYgeW91IHBhc3Mgbm9uLXN0cmluZworICAgICogW1RIUklGVC0xNjM5XSAtIEphdmEvUHl0aG9uOiBTZXJpYWxpemF0aW9uL0Rlc2VyaWFsaXphdGlvbiBvZiBkb3VibGUgdHlwZSB1c2luZyBDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTY0N10gLSBOb2RlSlMgQnVmZmVyZWRUcmFuc3BvcnQgZG9lcyBub3Qgd29yayBiZXlvbmQgdGhlIGhlbGxvLXdvcmxkIGV4YW1wbGUKKyAgICAqIFtUSFJJRlQtMjEzMF0gLSBUaHJpZnQncyBEIGxpYnJhcnkvdGVzdDogcGFydHMgb2YgIm1ha2UgY2hlY2siIGNvZGUgZG8gbm90IGNvbXBpbGUgd2l0aCByZWNlbnQgZG1kLTIuMDYyIHRocm91Z2ggZG1kLTIuMDY0YWxwaGEKKyAgICAqIFtUSFJJRlQtMjE0MF0gLSBFcnJvciBjb21waWxpbmcgY3BwIHR1dG9yaWFscworICAgICogW1RIUklGVC0yMTM5XSAtIE1TVkMgMjAxMiBFcnJvciAtIENhbm5vdCBjb21waWxlIGR1ZSB0byBCb29zdFRocmVhZEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMjEzOF0gLSBwa2djb25maWcgZmlsZSBjcmVhdGVkIHdpdGggd3JvbmcgaW5jbHVkZSBwYXRoCisgICAgKiBbVEhSSUZULTIxNjBdIC0gV2FybmluZyBpbiB0aHJpZnQuaCB3aGVuIGNvbXBpbGluZyB3aXRoIC1XdW51c2VkIGFuZCBOREVCVUcKKyAgICAqIFtUSFJJRlQtMjE1OF0gLSBDb21wYWN0LCBKU09OLCBhbmQgU2ltcGxlSlNPTiBwcm90b2NvbHMgYXJlIG5vdCB3b3JraW5nIGNvcnJlY3RseQorICAgICogW1RIUklGVC0yMTY3XSAtIG5vZGVqcyBsaWIgdGhyb3dzIGVycm9yIGlmIG9wdGlvbnMgYXJndW1lbnQgaXNuJ3QgcGFzc2VkCisgICAgKiBbVEhSSUZULTIyODhdIC0gR28gaW1wbCBvZiBUaHJpZnQgSlNPTiBwcm90b2NvbCB3cm9uZ2x5IHdyaXRlcy9leHBlY3RzIHRydWUvZmFsc2UgZm9yIGJvb2xzCisgICAgKiBbVEhSSUZULTIxNDddIC0gVGhyaWZ0IElETCBncmFtbWFyIGFsbG93cyBmb3IgZG90dGVkIGlkZW50aWZpZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMjE0NV0gLSBSYWNrIGFuZCBUaGluIGFyZSBub3QganVzdCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMjI2N10gLSBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2Ugc29ja2V0IGZhbWlseSBpbiBQeXRob24gVFNvY2tldAorICAgICogW1RIUklGVC0yMjc2XSAtIGphdmEgcGF0aCBpbiBzcGVjIGZpbGUgbmVlZHMgdXBkYXRpbmcKKyAgICAqIFtUSFJJRlQtMjI4MV0gLSBHZW5lcmF0ZWQgc2VuZC9yZWN2IGNvZGUgaWdub3JlcyBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjI4MF0gLSBUSlNPTlByb3RvY29sLkZsdXNoKCkgZG9lcyBub3QgcmVhbGx5IGZsdXNoIHRoZSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjI3NF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGRvIG5vdCBjbG9zZSB0aGVpciBjaGFubmVsIHNlbGVjdG9ycyBvbiBleGl0IGFuZCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMKKyAgICAqIFtUSFJJRlQtMjI2NV0gLSBwaHAgbGlicmFyeSBkb2Vzbid0IGJ1aWxkCisgICAgKiBbVEhSSUZULTIyMzJdIC0gSXNTZXQqIGJyb2tlbiBpbiBHbworICAgICogW1RIUklGVC0yMjQ2XSAtIFVuc2V0IGVudW0gdmFsdWUgaXMgcHJpbnRlZCBieSBUb1N0cmluZygpCisgICAgKiBbVEhSSUZULTIyNDBdIC0gdGhyaWZ0LnZpbSAoY29udHJpYikgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSAndW5pb24nCisgICAgKiBbVEhSSUZULTIyNDNdIC0gVE5vbmJsb2NraW5nU2VydmVyIGluIHRocmlmdCBjcmFzaGVzIHdoZW4gVEZyYW1lZFRyYW5zcG9ydCBvcGVucworICAgICogW1RIUklGVC0yMjMwXSAtIENhbm5vdCBCdWlsZCBvbiBSSEVML0NlbnRvcy9BbWF6b24gTGludXggNi54CisgICAgKiBbVEhSSUZULTIyNDddIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjI1M10gLSBQeXRob24gVG9ybmFkbyBUVG9ybmFkb1NlcnZlciBiYXNlIGNsYXNzIGNoYW5nZQorICAgICogW1RIUklGVC0yMjYxXSAtIGphdmE6IGVycm9yOiB1bm1hcHBhYmxlIGNoYXJhY3RlciBmb3IgZW5jb2RpbmcgQVNDSUkKKyAgICAqIFtUSFJJRlQtMjI1OV0gLSBDIzogdW5leHBlY3RlZCBudWxsIGxvZ0RlbGVnYXRlKCkgcG9pbnRlciBjYXVzZXMgQVYgaW4gVFNlcnZlci5zZXJ2ZSgpCisgICAgKiBbVEhSSUZULTIyMjVdIC0gU1NMQ29udGV4dCBkZXN0cm95IGJlZm9yZSBjbGVhbnVwT3BlblNTTAorICAgICogW1RIUklGVC0yMjI0XSAtIFRTU0xTb2NrZXQuaCBhbmQgVFNTTFNlcnZlclNvY2tldC5oIHNob3VsZCB1c2UgdGhlIHBsYXRmcm9tc29ja2V0IHRvbworICAgICogW1RIUklGVC0yMjI5XSAtIHRocmlmdCBmYWlsZWQgdG8gYnVpbGQgb24gT1NYIDEwLjkgR00KKyAgICAqIFtUSFJJRlQtMjIyN10gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKKyAgICAqIFtUSFJJRlQtMjIxOV0gLSBUaHJpZnQgZ2VtIGZhaWxzIHRvIGJ1aWxkIG9uIE9TIFggTWF2ZXJpY2tzIHdpdGggMS45LjMgcnViaWVzCisgICAgKiBbVEhSSUZULTIyMjZdIC0gVFNlcnZlclNvY2tldCAtIGtlZXBBbGl2ZSB3cm9uZyBpbml0aWFsaXphdGlvbiBvcmRlcgorICAgICogW1RIUklGVC0yMjg1XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEphdmEgZG9lc24ndCBhbGxvdyBhIHNsYXNoICgvKSB0byBiZSBlc2NhcGVkIChcLykKKyAgICAqIFtUSFJJRlQtMjIxNl0gLSBFeHRyYW5lb3VzIHNlbWljb2xvbiBpbiBUUHJvdG9jb2xVdGlsLmggbWFrZXMgY2xhbmcgbWFkCisgICAgKiBbVEhSSUZULTIyMTVdIC0gR2VuZXJhdGVkIEhUTUwvR3JhcGh2aXogbGlzdHMgcmVmZXJlbmNlZCBlbnVtIGlkZW50aWZpZXJzIGFzIFVOS05PV04uCisgICAgKiBbVEhSSUZULTIyMTFdIC0gRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbnRhaW4gbmFtZXNwYWNlIHByZWZpeC4KKyAgICAqIFtUSFJJRlQtMjIxMF0gLSBsaWIvamF2YSBUU2ltcGxlSlNPTlByb3RvY29sIGNhbiBlbWl0IGludmFsaWQgSlNPTgorICAgICogW1RIUklGVC0yMjA5XSAtIFJ1YnkgZ2VuZXJhdG9yIC0tIHBsZWFzZSBuYW1lc3BhY2UgY2xhc3NlcworICAgICogW1RIUklGVC0yMjAyXSAtIERlbHBoaSBUU2VydmVySW1wbC5EZWZhdWx0TG9nRGVsZWdhdGUgbWF5IHN0b3AgdGhlIHNlcnZlciB3aXRoIEkvTy1FcnJvciAxMDUKKyAgICAqIFtUSFJJRlQtMjIwMV0gLSBUZXJuYXJ5IG9wZXJhdG9yIHJldHVybnMgZGlmZmVyZW50IHR5cGVzIChidWlsZCBlcnJvciBmb3Igc29tZSBjb21waWxlcnMpCisgICAgKiBbVEhSSUZULTIyMDBdIC0gbmVzdGVkIHN0cnVjdHMgY2F1c2UgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB0byBzbG93IGRvd24gYXQgZXhjZXNzaXZlIENQVSBsb2FkCisgICAgKiBbVEhSSUZULTIxOTddIC0gZml4IGphciBvdXRwdXQgZGlyZWN0b3J5IGluIHJwbSBzcGVjIGZpbGUKKyAgICAqIFtUSFJJRlQtMjE5Nl0gLSBGaXggaW52YWxpZCBkZXBlbmRlbmN5IGluIE1ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTIxOTRdIC0gTm9kZTogTm90IGFjdHVhbGx5IHByZXBlbmRpbmcgcmVzaWR1YWwgZGF0YSBpbiBURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyCisgICAgKiBbVEhSSUZULTIxOTNdIC0gSmF2YSBjb2RlIGdlbmVyYXRvciBlbWl0cyBzcHVyaW91cyBzZW1pY29sb24gd2hlbiBkZWVwIGNvcHlpbmcgYmluYXJ5IGRhdGEKKyAgICAqIFtUSFJJRlQtMjE5MV0gLSBGaXggY2hhcnAgSlNPTlByb3RvY29sLlJlYWRKU09ORG91YmxlIChzcGVjaWZ5IEludmFyaWFudEN1bHR1cmUpCisgICAgKiBbVEhSSUZULTIyMTRdIC0gU3lzdGVtIGhlYWRlciBzeXMvcGFyYW0uaCBpcyBpbmNsdWRlZCBpbnNpZGUgdGhlIFRocmlmdCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMjE3OF0gLSBUaHJpZnQgZ2VuZXJhdG9yIHJldHVybnMgZXJyb3IgZXhpdCBjb2RlIG9uIC0tdmVyc2lvbgorICAgICogW1RIUklGVC0yMTcxXSAtIE5vZGVKUyBpbXBsZW1lbnRhdGlvbiBoYXMgZXh0cmVtZWx5IGxvdyB0ZXN0IGNvdmVyYWdlCisgICAgKiBbVEhSSUZULTIxODNdIC0gZ2VtIGluc3RhbGwgZmFpbHMgb24genNoCisgICAgKiBbVEhSSUZULTIxODJdIC0gc2VnZmF1bHQgaW4gcmVncmVzc2lvbiB0ZXN0cyAoR0MgYnVnIGluIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKQorICAgICogW1RIUklGVC0yMTgxXSAtIG9uZXdheSBjYWxscyBkb24ndCB3b3JrIGluIE5vZGVKUworICAgICogW1RIUklGVC0yMTY5XSAtIEphdmFNRSBUaHJpZnQgTGlicmFyeSBjYXVzZXMgImphdmEuaW8uSU9FeGNlcHRpb246IE5vIFJlc3BvbnNlIEVudHJpZXMgQXZhaWxhYmxlIiBhZnRlciB1c2luZyB0aGUgVGhyaWZ0IGNsaWVudCBmb3Igc29tZSB0aW1lCisgICAgKiBbVEhSSUZULTIxNjhdIC0gTm9kZS5qcyBhcHBlYXJzIGJyb2tlbiAoYXQgbGVhc3QsIGV4YW1wbGVzIGRvbid0IHdvcmsgYXMgaW50ZW5kZWQpCisgICAgKiBbVEhSSUZULTIyOTNdIC0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpIGxlYXZlcyBmaWxlcyBvcGVuCisgICAgKiBbVEhSSUZULTIyNzldIC0gVFNlcmlhbGl6ZXIgb25seSByZXR1cm5zIHRoZSBmaXJzdCAxMDI0IGJ5dGVzIHNlcmlhbGl6ZWQKKyAgICAqIFtUSFJJRlQtMjI3OF0gLSBCdWZmZXJlZCB0cmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IHdyaXRlcyA+IGJ1ZmZlciBzaXplCisgICAgKiBbVEhSSUZULTIyNzVdIC0gRml4IG1lbW9yeSBsZWFrIGluIGdvbGFuZyBjb21wYWN0X3Byb3RvY29sLgorICAgICogW1RIUklGVC0yMjgyXSAtIEluY29yZWN0IGNvZGUgZ2VuZXJhdGVkIGZvciBzb21lIHR5cGVkZWZzCisgICAgKiBbVEhSSUZULTIwMDldIC0gR28gcmVkZWNsYXJhdGlvbiBlcnJvcgorICAgICogW1RIUklGVC0xOTY0XSAtICdJc3NldCcgY2F1c2VzIHByb2JsZW1zIHdpdGggQyMvLk5FVCBzZXJpYWxpemVycworICAgICogW1RIUklGVC0yMDI2XSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMjEwOF0gLSBGaXggVEFzeW5jQ2xpZW50TWFuYWdlciB0aW1lb3V0IHJhY2UKKyAgICAqIFtUSFJJRlQtMjA2OF0gLSBNdWx0aXBsZSBjYWxscyBmcm9tIHNhbWUgY29ubmVjdGlvbiBhcmUgbm90IHByb2Nlc3NlZCBpbiBub2RlCisgICAgKiBbVEhSSUZULTE3NTBdIC0gTWFrZSBjb21waWxlciBidWlsZCBjbGVhbmx5IHVuZGVyIHZpc3VhbCBzdHVkaW8gMTAKKyAgICAqIFtUSFJJRlQtMTc1NV0gLSBDb21tZW50IHBhcnNpbmcgYnVnCisgICAgKiBbVEhSSUZULTE3NzFdIC0gIm1ha2UgY2hlY2siIGZhaWxzIG9uIHg2NCBmb3IgbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTE4NDFdIC0gTm9kZUpTIFRocmlmdCBpbmNvcnJlY3RseSBwYXJzZXMgbm9uLVVURjgtc3RyaW5nIHR5cGVzCisgICAgKiBbVEhSSUZULTE5MDhdIC0gVXNpbmcgcGhwIHRocmlmdF9wcm90b2NvbCBhY2NlbGVyYXRlZCB0cmFuc2ZlciBjYXVzZXMgY29yZSBkdW1wCisgICAgKiBbVEhSSUZULTE4OTJdIC0gU29ja2V0IHRpbWVvdXRzIGFyZSBkZWNsYXJlZCBpbiBtaWxsaS1zZWNvbmRzLCBidXQgYXJlIGFjdHVhbGx5IHNldCBpbiBtaWNyby1zZWNvbmRzCisgICAgKiBbVEhSSUZULTIzMDNdIC0gVEJ1ZmZlcnJlZFRyYW5zcG9ydCBub3QgcHJvcGVybHkgY2xvc2luZyB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMzEzXSAtIG5vZGVqcyBzZXJ2ZXIgY3Jhc2ggYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIHVzaW5nIE11bHRpcGxleGVkUHJvY2Vzc29yL0ZyYW1lZEJ1ZmZlci9CaW5hcnlQcm90b2NvbAorICAgICogW1RIUklGVC0yMzExXSAtIEdvOiBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIHdoZW4gZXhjZXB0aW9uIG5hbWUgaXMgYSBnbyBrZXl3b3JkCisgICAgKiBbVEhSSUZULTIzMDhdIC0gbm9kZTogVEpTT05Qcm90b2NvbCBwYXJzZSBlcnJvciB3aGVuIHJlYWRpbmcgZnJvbSBidWZmZXJlZCBtZXNzYWdlCisgICAgKiBbVEhSSUZULTIzMTZdIC0gY2NwOiBURmlsZVRyYW5zcG9ydFRlc3QKKyAgICAqIFtUSFJJRlQtMjM1Ml0gLSBtc3ZjIGZhaWxlZCB0byBjb21waWxlIHRocmlmdCB0ZXN0cworICAgICogW1RIUklGVC0yMzM3XSAtIEdvbGFuZyBkb2VzIG5vdCByZXBvcnQgVElNRURfT1VUIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjM0MF0gLSBHZW5lcmF0ZWQgc2VydmVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgcmVzcG9uc2UgdHlwZSBFWENFUFRJT04gb24gdGhlIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9EIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yMzU0XSAtIENvbm5lY3Rpb24gZXJyb3JzIGNhbiBsZWFkIHRvIGNhc2VfY2xhdXNlIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjMzOV0gLSBVbmNhdWdodCBleGNlcHRpb24gaW4gdGhyaWZ0IGMjIGRyaXZlcgorICAgICogW1RIUklGVC0yMzU2XSAtIGMrKyB0aHJpZnQgY2xpZW50IG5vdCB3b3JraW5nIHdpdGggc3NsIChTU0xfY29ubmVjdCBoYW5ncykKKyAgICAqIFtUSFJJRlQtMjMzMV0gLSBNaXNzaW5nIGNhbGwgdG8gUmVhZFN0cnVjdEJlZ2luKCkgaW4gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoKQorICAgICogW1RIUklGVC0yMzIzXSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZ2VuZXJhdGVkIGZvciB0eXBlZGVmJ2Qgc3RydWN0cworICAgICogW1RIUklGVC0yMzIyXSAtIENvcnJlY3RseSBzaG93IHRoZSBudW1iZXIgb2YgdGltZXMgRXhlY3V0b3JTZXJ2aWNlIChqYXZhKSBoYXMgcmVqZWN0ZWQgdGhlIGNsaWVudC4KKyAgICAqIFtUSFJJRlQtMjM4OV0gLSBuYW1lc3BhY2VzIGhhbmRsZWQgd3JvbmdseSBpbiBhY3Jpb25zY3JpcHQgMy4wIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIzODhdIC0gR29MYW5nIC0gRml4IGRhdGEgcmFjZXMgaW4gc2ltcGxlX3NlcnZlciBhbmQgc2VydmVyX3NvY2tldAorICAgICogW1RIUklGVC0yMzg2XSAtIFRocmlmdCByZWZ1c2VzIHRvIGxpbmsgeXlsZXgKKyAgICAqIFtUSFJJRlQtMjM3NV0gLSBFeGNlc3NpdmUgPGJyPidzIGluIGdlbmVyYXRlZCBIVE1MCisgICAgKiBbVEhSSUZULTIzNzNdIC0gd2FybmluZyBDUzA0MTQgaW4gVEh0dHBDbGllbnQuY3M6IHByaXZhdGUgZmllbGQgJ1RocmlmdC5UcmFuc3BvcnQuVEh0dHBDbGllbnQuY29ubmVjdGlvbicgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQKKyAgICAqIFtUSFJJRlQtMjM3Ml0gLSB0aHJpZnQvanNvbl9wcm90b2NvbC5nbzoxNjA6IGZ1bmN0aW9uIGVuZHMgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQKKyAgICAqIFtUSFJJRlQtMjM3MV0gLSBydWJ5IGJ1bmRsZXIgdmVyc2lvbiBmYWlscyBvbiB+MS4zLjEsIHJlbW92ZSBhbmQgdGFrZSBsYXRlc3QgYXZhaWwKKyAgICAqIFtUSFJJRlQtMjM3MF0gLSBDb21waWxlciBTRUdGQVVMVHMgZ2VuZXJhdGluZyBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGNvbXBsZXggc3RydWNyZQorICAgICogW1RIUklGVC0yMzg0XSAtIEJpbmFyeSBtYXAga2V5cyBwcm9kdWNlIHVuY29tcGlsYWJsZSBjb2RlIGluIGdvCisgICAgKiBbVEhSSUZULTIzODBdIC0gdW5yZWFjaGFibGUgY29kZSAoQ0lEIDExNzQ1NDYsIENJRCAxMTc0Njc5KQorICAgICogW1RIUklGVC0yMzc4XSAtIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50cyBvZiBiaW5hcnkgdHlwZSBsZWFkIHRvIHVuY29tcGlsZWFibGUgR28gY29kZQorICAgICogW1RIUklGVC0yMzYzXSAtIElzc3VlIHdpdGggY2hhcmFjdGVyIGVuY29kaW5nIG9mIFN1Y2Nlc3MgcmV0dXJuZWQgZnJvbSBMb2dpbiB1c2luZyBUaHJpZnQgUHJveHkgYW5kIE5vZGVKUworICAgICogW1RIUklGVC0yMzU5XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGNsZWFyIGl0J3MgYnVmZmVyIG9uIGEgZmFpbGVkIGZsdXNoIGNhbGwKKyAgICAqIFtUSFJJRlQtMjQyOF0gLSBQeXRob24gMyBzZXR1cC5weSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTIzNjddIC0gQnVpbGQgZmFpbHVyZTogc3RkbGliIGFuZCBib29zdCBib3RoIGRlZmluZSB1aW50NjRfdAorICAgICogW1RIUklGVC0yMzY1XSAtIEMjIGRlY29kZXMgdG9vIG1hbnkgYmluYXJ5IGJ5dGVzIGZyb20gSlNPTgorICAgICogW1RIUklGVC0yNDAyXSAtIGJ5dGUgY291bnQgb2YgRnJhbWVCdWZmZXIgaW4gQVdBSVRJTkdfQ0xPU0Ugc3RhdGUgaXMgbm90IHN1YnRyYWN0ZWQgZnJvbSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQKKyAgICAqIFtUSFJJRlQtMjM5Nl0gLSBCdWlsZCBFcnJvciBvbiBNYWNPU1gKKyAgICAqIFtUSFJJRlQtMjM5NV0gLSB0aHJpZnQgUnVieSBnZW0gcmVxdWlyZXMgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jeSAndGhpbicgcmVnYXJkbGVzcyBvZiBlbnZpcm9ubWVudAorICAgICogW1RIUklGVC0yNDE0XSAtIGNfZ2xpYiBmaXggc2V2ZXJhbCBidWcuCisgICAgKiBbVEhSSUZULTI0MjBdIC0gR28gYXJndW1lbnQgcGFyc2VyIGZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGRvZXMgbm90IHNraXAgZmllbGRzCisgICAgKiBbVEhSSUZULTI0MzldIC0gQnVnIGluIFRQcm90b2NvbERlY29yYXRvciBDbGFzcyBjYXVzZXMgcGFyc2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQxOV0gLSBnb2xhbmcgLSBGaXggZm10LkVycm9yZiBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0yNDE4XSAtIEdvIGhhbmRsZXIgZnVuY3Rpb24gcGFuaWNzIG9uIGludGVybmFsIGVycm9yCisgICAgKiBbVEhSSUZULTI0MDVdIC0gTm9kZS5qcyBNdWx0aXBsZXhlciB0ZXN0cyBmYWlsIChzaWxlbnRseSkKKyAgICAqIFtUSFJJRlQtMjU4MV0gLSBURkRUcmFuc3BvcnQgZGVzdHJ1Y3RvciBzaG91bGQgbm90IHRocm93CisgICAgKiBbVEhSSUZULTI1NzVdIC0gVGhyaWZ0IGluY2x1ZGVzIHNpZ2luZm9fdCB3aXRoaW4gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0yNTc3XSAtIFRGaWxlVHJhbnNwb3J0ICBtaXNzdXNlIG9mIGNsb3Nlc29ja2V0IG9uIHdpbmRvd3MgcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMjU3Nl0gLSBJbXBsZW1lbnQgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS5za2lwIG1ldGhvZCBpbiBKYXZhU2NyaXB0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjU4OF0gLSBUaHJpZnQgY29tcGlsZXIgaXMgbm90IGJ1aWxkYWJsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKKyAgICAqIFtUSFJJRlQtMjU5NF0gLSBKUyBDb21waWxlcjogU2luZ2xlIHF1b3RlcyBhcmUgbm90IGJlaW5nIGVzY2FwZWQgaW4gY29uc3RhbnRzLgorICAgICogW1RIUklGVC0yNTkxXSAtIFRGcmFtZWRUcmFuc3BvcnQgZG9lcyBub3QgaGFuZGxlIHBheWxvYWRzIHNwbGl0IGFjcm9zcyBwYWNrZXRzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0yNTk5XSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZHVlIHRvIG5hbWluZyBjb25mbGljdHMgd2l0aCBJREwKKyAgICAqIFtUSFJJRlQtMjU5MF0gLSBDKysgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBkb2Vzbid0IGluY2x1ZGUgTXVsdGlwbGV4aW5nIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjU5NV0gLSBOb2RlLmpzOiBGaXggZ2xvYmFsIGxlYWtzIGFuZCBjb3B5LXBhc3RlIGVycm9ycworICAgICogW1RIUklGVC0yNTY1XSAtIGF1dG9jb25mIGZhaWxzIHRvIGZpbmQgbWluZ3ctZysrIGNyb3NzIGNvbXBpbGVyIG9uIHRyYXZpcyBDSQorICAgICogW1RIUklGVC0yNTU1XSAtIGV4Y2Vzc2l2ZSAidW51c2VkIGZpZWxkIiBjb21tZW50cworICAgICogW1RIUklGVC0yNTU0XSAtIGRvdWJsZSBpbml0aWFsaXphdGlvbiBpbiBnZW5lcmF0ZWQgUmVhZCgpIG1ldGhvZAorICAgICogW1RIUklGVC0yNTUxXSAtIE91dE9mTWVtb3J5RXJyb3IgInVuYWJsZSB0byBjcmVhdGUgbmV3IG5hdGl2ZSB0aHJlYWQiIGtpbGxzIHNlcnZlIHRocmVhZAorICAgICogW1RIUklGVC0yNTQzXSAtIEdlbmVyYXRlZCBlbnVtIHR5cGUgaW4gaGFza2VsbCBzaG91bGQgYmUgcXVhbGlmaWVkCisgICAgKiBbVEhSSUZULTI1NjBdIC0gVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKworICAgICogW1RIUklGVC0yNTU5XSAtIENlbnRvcyA2LjUgdW5hYmxlIHRvICJtYWtlIiB3aXRoIFRocmlmdCAwLjkuMQorICAgICogW1RIUklGVC0yNTI2XSAtIEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMjQ1NF0gLSBjX2dsaWI6IFRoZXJlIGlzIG5vIGdldGhvc3RieW5hbWVfcigpIGluIHNvbWUgT1MuCisgICAgKiBbVEhSSUZULTI0NTFdIC0gRG8gbm90IHVzZSBwb2ludGVycyBmb3Igb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMuIERvIG5vdCB3cml0ZSBzdWNoIGZpZWxkcyBpZiBpdHMgdmFsdWUgc2V0IHRvIGRlZmF1bHQuIEFsc28sIGRvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIGFueSBvcHRpb25hbCBmaWVsZHMgbWFwcGVkIHRvIGdvIG1hcCBvciBzbGljZS4gZ2VuZXJhdGUgR2V0IGFjY2Vzc29ycworICAgICogW1RIUklGVC0yNDUwXSAtIGluY2x1ZGUgSG93VG9Db250cmlidXRlIGluIHRoZSBzcmMgcmVwbworICAgICogW1RIUklGVC0yNDQ4XSAtIHRocmlmdC90ZXN0L3Rlc3Quc2ggaGFzIGluY29ycmVjdCBOb2RlLmpzIHRlc3QgcGF0aAorICAgICogW1RIUklGVC0yNDYwXSAtIHVub3BlbmVkIHNvY2tldCBmZCBtdXN0IGJlIGxlc3MgdGhhbiB6ZXJvLgorICAgICogW1RIUklGVC0yNDU5XSAtIC0tdmVyc2lvbiBzaG91bGQgbm90IGV4aXQgMQorICAgICogW1RIUklGVC0yNDY4XSAtIFRpbWVzdGFtcCBoYW5kbGluZworICAgICogW1RIUklGVC0yNDY3XSAtIFVuYWJsZSB0byBidWlsZCBjb250cmliL2ZiMzAzIG9uIE9TWCAxMC45LjIKKyAgICAqIFtUSFJJRlQtMjQ2Nl0gLSBJbXByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgU1NML1RMUyBjb25uZWN0aW9ucyB0aGF0IGRvbid0IGNvbXBsZXRlIGEgaGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTI0NjNdIC0gdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgZmFpbHMgc29tZXRpbWVzCisgICAgKiBbVEhSSUZULTI0NThdIC0gR2VuZXJhdGVkIGdvbGFuZyBzZXJ2ZXIgY29kZSBmb3IgIm9uZXdheSIgbWV0aG9kcyBpcyBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMjQ1Nl0gLSBUSHR0cENsaWVudCBmYWlscyB3aGVuIHVzaW5nIGFzeW5jIHN1cHBvcnQgb3V0c2lkZSBTaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0yNTI0XSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIFRUaHJlYWRlZFNlcnZlciBmaWxlcworICAgICogW1RIUklGVC0yNTIzXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIGZpbGVzCisgICAgKiBbVEhSSUZULTI1MjBdIC0gY3BwOmNvYl9zdHlsZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IC50Y2MgZmlsZQorICAgICogW1RIUklGVC0yNTA4XSAtIFVuY29tcGlsZWFibGUgQyMgY29kZSBkdWUgdG8gbGFuZ3VhZ2Uga2V5d29yZHMgaW4gSURMCisgICAgKiBbVEhSSUZULTI1MDZdIC0gVXBkYXRlIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlcyB0byBiZSB1c2VkIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI1MDVdIC0gZ286IHN0cnVjdCBzaG91bGQgYWx3YXlzIGJlIGEgcG9pbnRlciB0byBhdm9pZCBjb3B5aW5nIG9mIHBvdGVudGlhbGx5IHNpemUtdW5ib3VuZGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMjUxNV0gLSBUTFMgTWV0aG9kIGVycm9yIGR1cmluZyBtYWtlCisgICAgKiBbVEhSSUZULTI1MDNdIC0gQysrOiBGaXggbmFtZSBjb2xsaXNpb24gd2hlbiBhIHN0cnVjdCBoYXMgYSBtZW1iZXIgbmFtZWQgInZhbCIKKyAgICAqIFtUSFJJRlQtMjQ3N10gLSB0aHJpZnQgLS1oZWxwIHRleHQgd2l0aCBtaXNwbGFjZWQgY29tbWEKKyAgICAqIFtUSFJJRlQtMjQ5Ml0gLSB0ZXN0L2NwcCBkb2VzIG5vdCBjb21waWxlIG9uIG1hYworICAgICogW1RIUklGVC0yNTAwXSAtIHNlbmRpbmcgcmFuZG9tIGRhdGEgY3Jhc2hlcyB0aHJpZnQoZ29sYW5nKSBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTI0NzVdIC0gY19nbGliOiBidWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgZnVuY3Rpb24gcmV0dXJuIGFsd2F5cyBUUlVFLgorICAgICogW1RIUklGVC0yNDk1XSAtIEphdmFTY3JpcHQvTm9kZSBzdHJpbmcgY29uc3RhbnRzIGxhY2sgcHJvcGVyIGVzY2FwaW5nCisgICAgKiBbVEhSSUZULTI0OTFdIC0gdW5hYmxlIHRvIGltcG9ydCBnZW5lcmF0ZWQgVGhyaWZ0VGVzdCBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTI0OTBdIC0gY19nbGliOiBpZiBmYWlsIHRvIHJlYWQgYSBleGNlcHRpb24gZnJvbSBzZXJ2ZXIsIGNsaWVudCBtYXkgYmUgb2NjdXJyZWQgZG91YmxlIGZyZWUKKyAgICAqIFtUSFJJRlQtMjQ3MF0gLSBUSHR0cEhhbmRsZXIgc3dhbGxvd3MgZXhjZXB0aW9ucyBmcm9tIHByb2Nlc3NvcgorICAgICogW1RIUklGVC0yNTMzXSAtIEJvb3N0IHZlcnNpb24gaW4gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTI1MzJdIC0gSmF2YSB2ZXJzaW9uIGluIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAqIFtUSFJJRlQtMjUyOV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgc3BsaXQgIFRjcCBkYXRhIGJ1ZyBpbiBub2RlSnMKKyAgICAqIFtUSFJJRlQtMjUzN10gLSBQYXRoIGZvciAiZ28gZ2V0IiBkb2VzIG5vdCB3b3JrIChwdWxsIHJlcXVlc3QgMTE1KQorICAgICogW1RIUklGVC0yNDQzXSAtIE5vZGUgZmFpbHMgY3Jvc3MgbGFuZyB0ZXN0cworICAgICogW1RIUklGVC0yNDM3XSAtIEF1dGhvciBmaWVsZHMgaW4gUHl0aG9uIHNldHVwLnB5IG11c3QgYmUgc3RyaW5ncyBub3QgbGlzdHMuCisgICAgKiBbVEhSSUZULTI0MzVdIC0gSmF2YSBjb21waWxlciBkb2Vzbid0IGxpa2Ugc3RydWN0IG1lbWJlciBuYW1lcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gYW4gZXhpc3RpbmcgZW51bSBvciBzdHJ1Y3QgdHlwZQorICAgICogW1RIUklGVC0yNDM0XSAtIE1pc3NpbmcgbmFtZXNwYWNlIGltcG9ydCBmb3IgcGhwIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yNDMyXSAtIEZsYWt5IHBhcmFsbGVsIGJ1aWxkCisgICAgKiBbVEhSSUZULTI0MzBdIC0gQ3Jhc2ggZHVyaW5nIFRUaHJlYWRQb29sU2VydmVyIHNodXRkb3duCisgICAgKiBbVEhSSUZULTY2N10gLSBQZXJpb2Qgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIGluIGlkZW50aWZpZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMTIxMl0gLSBNZW1iZXJzIGNhcGl0YWwgY2FzZSBjb25mbGljdAorICAgICogW1RIUklGVC0yNTg0XSAtIEVycm9yIGhhbmRsZXIgbm90IGxpc3RlbmVkIG9uIGphdmFzY3JpcHQgY2xpZW50CisgICAgKiBbVEhSSUZULTIyOTRdIC0gSW5jb3JyZWN0IE1ha2VmaWxlIGdlbmVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjYwMV0gLSBGaXggdmFncmFudCB0byB3b3JrIGFnYWluIGZvciBidWlsZHMgYWdhaW4KKyAgICAqIFtUSFJJRlQtMjA5Ml0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIHNob3VsZCByZWxlYXNlIGhhbmRsZXIgYXMgc29vbiBhcyBjb25uZWN0aW9uIGNsb3NlcworICAgICogW1RIUklGVC0yNTU3XSAtIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCisgICAgKiBbVEhSSUZULTI2MDVdIC0gVFNvY2tldCB3YXJuaW5nIG9uIGdjYyA0LjguMworICAgICogW1RIUklGVC0yNjA3XSAtIFRocmVhZE1hbmFnZXIuY3BwIHdhcm5pbmcgb24gY2xhbmcrKyAzLjQKKyAgICAqIFtUSFJJRlQtMTk5OF0gLSBUQ29tcGFjdFByb3RvY29sLnRjYyAtIG9uZSBtb3JlIHdhcm5pbmcgb24gVmlzdWFsIDIwMTAKKyAgICAqIFtUSFJJRlQtMjYxMF0gLSBNU1ZDIHdhcm5pbmcgaW4gVFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtMjYxNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIE1TVkMKKyAgICAqIFtUSFJJRlQtMjYwOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIGNsYW5nIDMuNAorICAgICogW1RIUklGVC0yNjA2XSAtIFRocmVhZE1hbmFnZXIuaCB3YXJuaW5nIGluIGNsYW5nKysgMy40CisgICAgKiBbVEhSSUZULTI2MDldIC0gVEZpbGVUcmFuc3BvcnQuaCB1bnVzZWQgZmllbGQgd2FybmluZyAoY2xhbmcgMy40KQorICAgICogW1RIUklGVC0yNDE2XSAtIENhbm5vdCB1c2UgVENvbXBhY3RQcm90b2NvbCB3aXRoIE1TVkMKKyAgICAqIFtUSFJJRlQtMTgwM10gLSBSdWJ5IFRocmlmdCAwLjkuMCB0cmllcyB0byBlbmNvZGUgVVVJRCB0byBVVEY4IGFuZCBjcmFzaGVzCisgICAgKiBbVEhSSUZULTIzODVdIC0gUHJvYmxlbSB3aXRoIGdldGhvc3RieW5hbWUyIGR1cmluZyBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTIyNjJdIC0gdGhyaWZ0IHNlcnZlciAnTXV0YXRlUm93JyBvcGVyYXRpb24gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBzdWNjZXNzIC8gZmFpbHVyZQorICAgICogW1RIUklGVC0yMDQ4XSAtIFByZWZlciBib29sZWFuIGNvbnRleHQgdG8gbnVsbHB0cl90IGNvbnZlcnNpb24KKyAgICAqIFtUSFJJRlQtMjUyOF0gLSBUaHJpZnQgRXJsYW5nIExpYnJhcnk6IE11bHRpcGxlIHRocmlmdCBhcHBsaWNhdGlvbnMgaW4gb25lIGJ1bmRsZQorICAgICogW1RIUklGVC0xOTk5XSAtIHdhcm5pbmcgb24gZ2NjIDQuNyB3aGlsZSBjb21waWxpbmcgQm9vc3RNdXRleC5jcHAKKyAgICAqIFtUSFJJRlQtMjEwNF0gLSBTdHJ1Y3RzIGxvc2UgYmluYXJ5IGRhdGEgd2hlbiB0cmFuc2ZlcnJlZCBmcm9tIHNlcnZlciB0byBjbGllbnQgaW4gSmF2YQorICAgICogW1RIUklGVC0yMTg0XSAtIHVuZGVmaW5lZCBtZXRob2QgcnNwZWNfdmVyaWZ5IGZvciBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMzUxXSAtIFBIUCBUQ29tcGFjdFByb3RvY29sIGhhcyBmYWlscyB0byBkZWNvZGUgbWVzc2FnZXMKKyAgICAqIFtUSFJJRlQtMjAxNl0gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKKyAgICAqIFtUSFJJRlQtMjI3M10gLSBQbGVhc2UgZGVsZXRlIG9sZCByZWxlYXNlcyBmcm9tIG1pcnJvcmluZyBzeXN0ZW0KKyAgICAqIFtUSFJJRlQtMjI3MF0gLSBGYXVsdHkgbGlicmFyeSB2ZXJzaW9uIG51bWJlcmluZyBhdCBidWlsZCBvciBkb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIyMDNdIC0gVGVzdHMga2VlcGluZyBmYWlsaW5nIG9uIEplbmtpbnMgYW5kIFRyYXZpcyBDSQorICAgICogW1RIUklGVC0yMzk5XSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKKyAgICAqIFtUSFJJRlQtMjU4Ml0gLSAiRmlsZVRyYW5zcG9ydCBlcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRyeWluZyB0byB1c2UgSmF2YSdzIFRGaWxlVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTE2ODJdIC0gTXVsdGlwbGUgdGhyZWFkIGNhbGxpbmcgYSBTZXJ2aWNlIGZ1bmN0aW9uIHVuc2FmZWx5IGNhdXNlcyBtZXNzYWdlIGNvcnJ1cHRpb24gYW5kIHRlcm1pbmF0ZXMgd2l0aCBCcm9rZW4gUGlwZQorICAgICogW1RIUklGVC0yMzU3XSAtIHJlY3Vyc2Ugb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBnZW5lcmF0aW5nIHBocAorICAgICogW1RIUklGVC0yMjQ4XSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5CisgICAgKiBbVEhSSUZULTI0MjZdIC0gY2xhcmlmeSBJUCByaWdodHMgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSBmYnRocmlmdAorICAgICogW1RIUklGVC0yMDQxXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgY29tcGlsYXRpb24gb24gd2luZG93cyAoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyAgICAqIFtUSFJJRlQtMjQwMF0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCisgICAgKiBbVEhSSUZULTE3MTddIC0gRml4IGRlYiBidWlsZCBpbiBqZW5raW5zCisgICAgKiBbVEhSSUZULTIyNjZdIC0gVGhyZWFkTWFuYWdlci5oOjI0OjEwOiBmYXRhbCBlcnJvcjogJ3RyMS9mdW5jdGlvbmFsJyBmaWxlIG5vdCBmb3VuZCBvbiBNYWMgMTAuOSAoTWF2ZXJpY2tzKQorICAgICogW1RIUklGVC0xMzAwXSAtIFRlc3QgZmFpbHVyZXMgd2l0aCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopCisgICAgKiBbVEhSSUZULTI0ODddIC0gVHV0b3JpYWwgcmVxdWlyZXMgdHdvIElETCBmaWxlcyBidXQgb25seSBvbmUgaXMgbGlua2VkIGZyb20gdGhlIFRocmlmdCB3ZWIgc2l0ZQorICAgICogW1RIUklGVC0yMzI5XSAtIG1pc3NpbmcgcmVsZWFzZSB0YWdzIHdpdGhpbiBnaXQKKyAgICAqIFtUSFJJRlQtMjMwNl0gLSBjb25jdXJlbnQgY2xpZW50IGNhbGxzIHdpdGggbm9kZWpzCisgICAgKiBbVEhSSUZULTIyMjJdIC0gcnVieSBnZW0gY2Fubm90IGJlIGNvbXBpbGVkIG9uIE9TIFggbWF2ZXJpY2tzCisgICAgKiBbVEhSSUZULTIzODFdIC0gY29kZSB3aGljaCBnZW5lcmF0ZWQgYnkgdGhyaWZ0Mi9oYmFzZS50aHJpZnQgY29tcGlsZSBlcnJvcgorICAgICogW1RIUklGVC0yMzkwXSAtIG5vIGNsb3NlIGV2ZW50IHdoZW4gY29ubmVjdGlvbiBsb3N0CisgICAgKiBbVEhSSUZULTIxNDZdIC0gVW5hYmxlIHRvIHBhc3MgbXVsdGlwbGUgIi0tZ2VuIiBvcHRpb25zIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMjQzOF0gLSBVbmV4cGVjdGVkIHJlYWRGaWVsZEVuZCBjYWxsIGNhdXNlcyBKU09OIFBhcnNpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTI0OThdIC0gRXJyb3IgbWVzc2FnZSAiSW52YWxpZCBtZXRob2QgbmFtZSIgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgSEJhc2UgVGhyaWZ0IEFQSQorICAgICogW1RIUklGVC04NDFdIC0gQnVpbGQgY3J1ZnQKKyAgICAqIFtUSFJJRlQtMjU3MF0gLSBXcm9uZyBVUkwgZ2l2ZW4gaW4gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RldmVsb3BlcnMKKyAgICAqIFtUSFJJRlQtMjYwNF0gLSBGaXggZGViaWFuIHBhY2thZ2luZworICAgICogW1RIUklGVC0yNjE4XSAtIFVuaWdub3JlIC9hY2xvY2FsIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZAorICAgICogW1RIUklGVC0yNTYyXSAtIC4vY29uZmlndXJlIGNyZWF0ZSBNYWtlRmlsZSBpbiBsaWIvZCB3aXRoIGVycm9ycworICAgICogW1RIUklGVC0yNTkzXSAtIFVuYWJsZSB0byBidWlsZCB0aHJpZnQgb24gdWJ1bnR1LTEyLjA0IChQcmVjaXNlKQorICAgICogW1RIUklGVC0yNDYxXSAtIENhbid0IGluc3RhbGwgdGhyaWZ0LTAuOC4wIG9uIE9TIFggMTAuOS4yCisgICAgKiBbVEhSSUZULTI2MDJdIC0gRml4IG1pc3NpbmcgZGlzdCBmaWxlcworICAgICogW1RIUklGVC0yNjIwXSAtIEZpeCBweXRob24gcGFja2FnaW5nCisgICAgKiBbVEhSSUZULTI1NDVdIC0gVGVzdCBDUFAgZmFpbHMgdG8gYnVpbGQgKHBvc3NpYmx5IHR5cG8pCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NV0gLSBBZGRpbmcgb25lIGxpbmVyIGd1aWRlIHRvIHJlbmFtZSB0aGUgdmVyc2lvbi5oLmluIGFuZCByZW5hbWUgdGhyaWZ0eS5jYy5oCisgICAgKiBbVEhSSUZULTE5OTFdIC0gQWRkIGV4Y2VwdGlvbnMgdG8gZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMjMzNF0gLSBhZGQgYSB0dXRvcmlhbCBmb3Igbm9kZSBKUworICAgICogW1RIUklGVC0yMzkyXSAtIEFjdGlvbnNjcmlwdCB0dXRvcmlhbAorICAgICogW1RIUklGVC0yMzgzXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBSZWJ1cworICAgICogW1RIUklGVC0yMzgyXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBTVE9NUAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDU3XSAtIENhcGFjaXR5IG9mIFRmcmFtZWRUcmFuc3BvcnQgd3JpdGUgYnVmZmVyIGlzIG5ldmVyIHJlc2V0CisgICAgKiBbVEhSSUZULTExMzVdIC0gTm9kZS5qcyB0dXRvcmlhbAorICAgICogW1RIUklGVC0xMzcxXSAtIFNvY2tldCB0aW1lb3V0cyAoU09fUkNWVElNRU8gYW5kIFNPX1NORFRJTUVPKSBub3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMKKyAgICAqIFtUSFJJRlQtMjE0Ml0gLSBNaW5vciB0d2Vha3MgdG8gdGhyaWZ0LmVsIGZvciBiZXR0ZXIgZW1hY3MgcGFja2FnZSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyNjhdIC0gTW9kaWZ5IFRTYXNsVHJhbnNwb3J0IHRvIGlnbm9yZSBUQ1AgaGVhbHRoIGNoZWNrcyBmcm9tIGxvYWRiYWxhbmNlcnMKKyAgICAqIFtUSFJJRlQtMjI2NF0gLSBHaXRIdWIgcGFnZSBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCBUaHJpZnQgaXMgc3RpbGwgaW5jdWJhdGluZworICAgICogW1RIUklGVC0yMjYzXSAtIEFsd2F5cyBnZW5lcmF0ZSBnb29kIGhhc2hDb2RlIGZvciBKYXZhCisgICAgKiBbVEhSSUZULTIyMzNdIC0gSmF2YSBjb21waWxlciBzaG91bGQgZGVmZW5zaXZlbHkgY29weSBpdHMgYmluYXJ5IGlucHV0cworICAgICogW1RIUklGVC0yMjM5XSAtIEFkZHJlc3MgRmluZEJ1Z3MgZXJyb3JzCisgICAgKiBbVEhSSUZULTIyNDldIC0gQWRkIFNNUCBCdWlsZCBvcHRpb24gdG8gdGhyaWZ0LnNwZWMgKGFuZCB0aHJlZSBjb25maWcgZGVmaW5lcykKKyAgICAqIFtUSFJJRlQtMjI1NF0gLSBFeGNlcHRpb25zIGdlbmVyYXRlZCBieSBHbyBjb21waWxlciBzaG91bGQgaW1wbGVtZW50IGVycm9yIGludGVyZmFjZQorICAgICogW1RIUklGVC0yMjYwXSAtIFRocmlmdCBpbXBvc2VzIHVubmVlZGVkIGRlcGVuZGVuY3kgb24gY29tbW9ucy1sYW5nMworICAgICogW1RIUklGVC0yMjU4XSAtIEFkZCBUTFMgdjEuMS8xLjIgc3VwcG9ydCB0byBUU1NMU29ja2V0LmNwcAorICAgICogW1RIUklGVC0yMjA1XSAtIE5vZGUuanMgVGVzdCBTZXJ2ZXIgdG8gc3VwcG9ydCB0ZXN0LmpzIEphdmFTY3JpcHQgQnJvd3NlciB0ZXN0IGFuZCBzdW5kcnkgZml4ZXMKKyAgICAqIFtUSFJJRlQtMjIwNF0gLSBTU0wgY2xpZW50IGZvciB0aGUgY29jb2EgY2xpZW50CisgICAgKiBbVEhSSUZULTIxNzJdIC0gSmF2YSBjb21waWxlciBhbGxvY2F0ZXMgb3B0aW9uYWxzIGFycmF5IGZvciBldmVyeSBzdHJ1Y3Qgd2l0aCBhbiBvcHRpb25hbCBmaWVsZAorICAgICogW1RIUklGVC0yMTg1XSAtIHVzZSBjYWJhbCBpbnN0ZWFkIG9mIHJ1bmhhc2tlbGwgaW4gaGFza2VsbCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjZdIC0gUEhQIENvbnN0YW50IEdlbmVyYXRpb24gUmVmYWN0b3JpbmcKKyAgICAqIFtUSFJJRlQtMjAyOV0gLSBQb3J0IEMrKyB0ZXN0cyB0byBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwNTRdIC0gVFNpbXBsZUZpbGVUcmFuc3BvcnQgLSBKYXZhIExpYiBoYXMgbm8gc3RyYWlnaHQgZm9yd2FyZCBUVHJhbnNwb3J0IGJhc2VkIGZpbGUgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwNDBdIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cworICAgICogW1RIUklGVC0yMDM0XSAtIEdpdmUgZGV2ZWxvcGVycycgQysrIGNvZGUgZGlyZWN0IGFjY2VzcyB0byBzb2NrZXQgRkRzIG9uIHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTIwOTVdIC0gVXNlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMyBjb21wYXRpYmxpdHkKKyAgICAqIFtUSFJJRlQtMTg2OF0gLSBNYWtlIHRoZSBUUEMgYmFja2xvZyBjb25maWd1cmFibGUgaW4gdGhlIEphdmEgc2VydmVycworICAgICogW1RIUklGVC0xODEzXSAtIEFkZCBAR2VuZXJhdGVkIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTIzMDVdIC0gVEZyYW1lZFRyYW5zcG9ydCBlbXB0eSBjb25zdHJ1Y3RvciBzaG91bGQgcHJvYmFibHkgYmUgcHJpdmF0ZQorICAgICogW1RIUklGVC0yMzA0XSAtIE1vdmUgY2xpZW50IGFzc2lnbm1lbnRzIGZyb20gY29uc3RydXRvciBpbiBtZXRob2QKKyAgICAqIFtUSFJJRlQtMjMwOV0gLSBSdWJ5IChnZW0pICYgUEhQIFJQTSBzdWJwYWNrYWdlcworICAgICogW1RIUklGVC0yMzE4XSAtIHBlcmw6IGRlcGVuZGVuY3kgQ2xhc3M6OkFjY2Vzc29yIG5vdCBjaGVja2VkCisgICAgKiBbVEhSSUZULTIzMTddIC0gZXhjbHVkZSB0dXRvcmlhbCBmcm9tIGJ1aWxkCisgICAgKiBbVEhSSUZULTIzMjBdIC0gUHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGRvZXMgbm90IGdldCBhdHRhY2hlZCBieSBwYXJzZXIKKyAgICAqIFtUSFJJRlQtMjM0OV0gLSBHb2xhbmcgLSBpbXByb3ZlIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTIzNDhdIC0gUEhQIEdlbmVyYXRvcjogYWRkIGFycmF5IHR5cGVoaW50IHRvIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0yMzQ0XSAtIGNvbmZpZ3VyZS5hYzogY29tcGlsZXItb25seSBvcHRpb24KKyAgICAqIFtUSFJJRlQtMjM0M10gLSBHb2xhbmcgLSBSZXR1cm4gYSBzaW5nbGUgZXJyb3IgZm9yIGFsbCBleGNlcHRpb25zIGluc3RlYWQgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcworICAgICogW1RIUklGVC0yMzQxXSAtIEVuYWJsZSBnZW5lcmF0aW9uIG9mIERlbHBoaSBYTUxEb2MgY29tbWVudHMgKGEuay5hLiAiSGVscCBJbnNpZ2h0IikKKyAgICAqIFtUSFJJRlQtMjM1NV0gLSBBZGQgU1NMIGFuZCBXZWIgU29ja2V0IFN1cHBvcnQgdG8gTm9kZSBhbmQgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzUwXSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzMwXSAtIEdlbmVyYXRlIFBIUERvYyBjb21tZW50cworICAgICogW1RIUklGVC0yMzMyXSAtIFJQTUJVSUxEOiBydW4gYm9vdHN0cmFwIChpZiBuZWVkZWQpCisgICAgKiBbVEhSSUZULTIzOTFdIC0gc2ltcGxlIHNvY2tldCB0cmFuc3BvcnQgZm9yIGFjdGlvbnNjcmlwdCAzLjAKKyAgICAqIFtUSFJJRlQtMjM3Nl0gLSBub2RlanM6IGFsbG93IFByb21pc2Ugc3R5bGUgY2FsbHMgZm9yIGNsaWVudCBhbmQgc2VydmVyCisgICAgKiBbVEhSSUZULTIzNjldIC0gQWRkIHNzbCBzdXBwb3J0IGZvciBub2RlanMgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjQwMV0gLSBIYXNrZWxsIHR1dG9yaWFsIGNvbXBpbGVzCisgICAgKiBbVEhSSUZULTI0MTddIC0gQyMgVW5pb24gY2xhc3NlcyBhcmUgbm90IHBhcnRpYWwKKyAgICAqIFtUSFJJRlQtMjQxNV0gLSBOYW1lZCBwaXBlcyBzZXJ2ZXIgcGVyZm9ybWFuY2UgJiBtZXNzYWdlIG1vZGUKKyAgICAqIFtUSFJJRlQtMjQwNF0gLSBlbWl0IHdhcm5pbmcgb24gKHR5cGljYWxseSBpbmVmZmljaWVudCkgbGlzdDxieXRlPgorICAgICogW1RIUklGVC0yMzk4XSAtIEltcHJvdmUgTm9kZSBTZXJ2ZXIgTGlicmFyeQorICAgICogW1RIUklGVC0yMzk3XSAtIEFkZCBDT1JTIGFuZCBDU1Agc3VwcG9ydCBmb3IgSmF2YVNjcmlwdCBhbmQgTm9kZS5qcyBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMjQwN10gLSB1c2UgbWFya2Rvd24gKHJlbmFtZSBSRUFETUUgPT4gUkVBRE1FLm1kKQorICAgICogW1RIUklGVC0yMzAwXSAtIEQgY29uZmlndXJlIGluZm8gb3V0cHV0IHNob3VsZCBmb2xsb3cgc2FtZSBmb3JtYXQgYXMgb3RoZXIgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTI1NzldIC0gV2luZG93cyBDRSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI1NzRdIC0gQ29tcGlsZXIgb3B0aW9uIHRvIGdlbmVyYXRlIG5hbWVzcGFjZSBkaXJlY3RvcmllcyBmb3IgUnVieQorICAgICogW1RIUklGVC0yNTcxXSAtIFNpbXBsaWZ5IGNyb3NzIGNvbXBpbGF0aW9uIHVzaW5nIENNYWtlCisgICAgKiBbVEhSSUZULTI1NjldIC0gSW50cm9kdWNlIGZpbGUgdG8gc3BlY2lmeSB0aGlyZCBwYXJ0eSBsaWJyYXJ5IGxvY2F0aW9ucyBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTI1NjhdIC0gSW1wbGVtZW50IG93biBjZXJ0aWZpY2F0ZSBoYW5kbGVyCisgICAgKiBbVEhSSUZULTI1NTJdIC0gZWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb25maWd1cmUuYWMKKyAgICAqIFtUSFJJRlQtMjU0OV0gLSBHZW5lcmF0ZSBqc29uIHRhZyBmb3Igc3RydWN0IG1lbWJlcnMuIHVzZSBnby50YWcgYW5ub3RhdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgdGFnLgorICAgICogW1RIUklGVC0yNTQ0XSAtIEFkZCBzdXBwb3J0IGZvciBzb2NrZXQgdHJhbnNwb3J0IGZvciBjIyBsaWJyYXJ5IHdoZW4gdXNpbmcgV2luZG93cyBQaG9uZSBwcm9qZWN0cworICAgICogW1RIUklGVC0yNDUzXSAtIGhhc2tlbGwgdHV0b3JpYWw6IGZpeCB1cCBkaXZpc2lvbiBieSAwIGV4YW1wbGUKKyAgICAqIFtUSFJJRlQtMjQ0OV0gLSBFbmhhbmNlIHR5cGVkZWYgc3RydWN0dXJlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZm9yd2FyZHMgYW5kIHJlYWwgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMjQ0Nl0gLSBUaGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHNlcnZlciBzdHJlYW0gZXJyb3JzCisgICAgKiBbVEhSSUZULTI0NTVdIC0gQWxsb3cgY2xpZW50IGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIHdpdGggVEh0dHBDbGllbnQKKyAgICAqIFtUSFJJRlQtMjUxMV0gLSBOb2RlLmpzIG5lZWRzIHRoZSBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTI0OTNdIC0gTm9kZS5qcyBsaWIgbmVlZHMgSFRUUCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjUwMl0gLSBPcHRpbWl6ZSBnbyBpbXBsZW1lbnRhdGlvbnMgb2YgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29scyBmb3Igc3BlZWQKKyAgICAqIFtUSFJJRlQtMjQ5NF0gLSBBZGQgZW51bSB0b1N0cmluZyBoZWxwZXIgZnVuY3Rpb24gaW4gY19nbGliCisgICAgKiBbVEhSSUZULTI0NzFdIC0gTWFrZSBjcHAucmVmIGFubm90YXRpb24gbGFuZ3VhZ2UgYWdub3N0aWMKKyAgICAqIFtUSFJJRlQtMjQ5N10gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMjUzNV0gLSBUSlNPTlByb3RvY29sIHdoZW4gc2VyaWFsaXplZCB5aWVsZHMgVEZpZWxkIGlkcyByYXRoZXIgdGhhbiBuYW1lcworICAgICogW1RIUklGVC0yMjIwXSAtIEFkZCBhIG5ldyBzdHJ1Y3Qgc3RydWN0dj8KKyAgICAqIFtUSFJJRlQtMTM1Ml0gLSBUaHJpZnQgc2VydmVyCisgICAgKiBbVEhSSUZULTk4OV0gLSBQdXNoIGJvb3N0IG00IG1hY3JvcyB1cHN0cmVhbQorICAgICogW1RIUklGVC0xMzQ5XSAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBwcmludCBvdXRzCisgICAgKiBbVEhSSUZULTI0OTZdIC0gc2VydmVyIGFuZCBjbGllbnQgZm9yIHRlc3QvZ28sIGFsc28gc2V2ZXJhbCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTExMTRdIC0gTWF2ZW4gcHVibGlzaCBzaG91bGRuJ3QgcmVxdWlyZSBwYXNzd29yZHMgaGFyZGNvZGVkIGluIHNldHRpbmdzLnhtbAorICAgICogW1RIUklGVC0yMDQzXSAtIHZpc3VhbCAyMDEwIHdhcm5pbmdzIC0gdW5yZWFjaGFibGUgY29kZQorICAgICogW1RIUklGVC0xNjgzXSAtIEltcGxlbWVudCBhbHRlcm5hdGl2ZXMgdG8gSmF2YXNjcmlwdCBDbGllbnQgc2lkZSBUcmFuc3BvcnQgcHJvdG9jb2wsIGp1c3QgYXMgTlBBUEkgYW5kIFdlYlNvY2tldC4KKyAgICAqIFtUSFJJRlQtMTc0Nl0gLSBwcm92aWRlIGEgU1BEWCBmaWxlCisgICAgKiBbVEhSSUZULTE3NzJdIC0gU2VyaWFsaXphdGlvbiBkb2VzIG5vdCBjaGVjayB0eXBlcyBvZiBlbWJlZGRlZCBzdHJ1Y3R1cmVzLgorICAgICogW1RIUklGVC0yMzg3XSAtIG5vZGVqczogZXh0ZXJuYWwgaW1wb3J0cyBzaG91bGQgYmUgY2VudHJhbGl6ZWQgaW4gaW5kZXguanMKKyAgICAqIFtUSFJJRlQtMjAzN10gLSBNb3JlIGdlbmVyYWwgbWFjcm8gVEhSSUZUX1VOVVNFRF9WQVJJQUJMRQorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xMDEyXSAtIFRyYW5zcG9ydCBmb3IgRGF0YUlucHV0IERhdGFPdXRwdXQgaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTIyNTZdIC0gVXNpbmcgYysrMTEvYysrMHggc3RkIGxpYnJhcnkgIHJlcGxhY2UgYm9vc3QgbGlicmFyeQorICAgICogW1RIUklGVC0yMjUwXSAtIEpTT04gYW5kIE1lbW9yeUJ1ZmZlciBmb3IgSmF2YU1FCisgICAgKiBbVEhSSUZULTIxMTRdIC0gUHl0aG9uIFNlcnZpY2UgUmVtb3RlIFNTTCBPcHRpb24KKyAgICAqIFtUSFJJRlQtMTcxOV0gLSBTQVNMIGNsaWVudCBzdXBwb3J0IGZvciBQeXRob24KKyAgICAqIFtUSFJJRlQtMTg5NF0gLSBUaHJpZnQgbXVsdGktdGhyZWFkZWQgYXN5bmMgSmF2YSBTZXJ2ZXIgdXNpbmcgSmF2YSA3IEFzeW5jaHJvbm91c0NoYW5uZWxHcm91cAorICAgICogW1RIUklGVC0xODkzXSAtIEhUVFAvSlNPTiBzZXJ2ZXIvY2xpZW50IGZvciBub2RlIGpzCisgICAgKiBbVEhSSUZULTIzNDddIC0gQyMgVExTIFRyYW5zcG9ydCBiYXNlZCBvbiBUSFJJRlQtMTgxCisgICAgKiBbVEhSSUZULTIzNzddIC0gQWxsb3cgYWRkaXRpb24gb2YgY3VzdG9tIEhUVFAgSGVhZGVycyB0byBhbiBIVFRQIFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yNDA4XSAtIE5hbWVkIFBpcGUgVHJhbnNwb3J0IE9wdGlvbiBmb3IgQyMKKyAgICAqIFtUSFJJRlQtMjU3Ml0gLSBBZGQgc3RyaW5nL2NvbGxlY3Rpb24gbGVuZ3RoIGxpbWl0IGNoZWNrcyAoZnJvbSBDKyspIHRvIGphdmEgcHJvdG9jb2wgcmVhZGVycworICAgICogW1RIUklGVC0yNDY5XSAtICJqYXZhOmZ1bGxjYW1lbCIgb3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FtZWwtY2FzZSB1bmRlcnNjb3JlZCBhdHRyaWJ1dGUgbmFtZXMKKyAgICAqIFtUSFJJRlQtNzk1XSAtIEltcG9ydGluZyBzZXJ2aWNlIGZ1bmN0aW9ucyAoc2ltdWxhdGlvbiBtdWx0aXBsZSBpbmhlcml0YW5jZSkKKyAgICAqIFtUSFJJRlQtMjE2NF0gLSBBZGQgYSBHZXQvUG9zdCBIdHRwIFNlcnZlciB0byBOb2RlIGFsb25nIHdpdGggZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMjI1NV0gLSBhZGQgUGFyZW50IENsYXNzIGZvciBnZW5lcmF0ZWQgU3RydWN0IGNsYXNzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI1MzldIC0gVHNvY2tldC5jcHAgYWRkcmluZm8gYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHCisgICAgKiBbVEhSSUZULTI0NDBdIC0gaG93IHRvIGNvbm5lY3QgYXMzIHRvIGphdmEgYnkgdGhyaWZ0ICwKKyAgICAqIFtUSFJJRlQtMjM3OV0gLSBNZW1tb3J5IGxlYWtpbmcgd2hpbGUgdXNpbmcgbXVsdGl0aHJlYWRpbmcgaW4gQysrIHNlcnZlci4KKyAgICAqIFtUSFJJRlQtMjI3N10gLSBUaHJpZnQ6IGluc3RhbGxpbmcgZmIzMDMgZXJyb3IKKyAgICAqIFtUSFJJRlQtMjU2N10gLSBDc2hhcnAgc2xvdyA/CisgICAgKiBbVEhSSUZULTI1NzNdIC0gdGhyaWZ0IDAuOS4yIHJlbGVhc2UKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtOTgxXSAtIGNvY29hOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxMzJdIC0gR286IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTIyOTldIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgUnVieSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyOThdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgQyMgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworICAgICogW1RIUklGVC0yMjk3XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIERlbHBoaSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyNzFdIC0gSmF2YVNjcmlwdDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTIyNTFdIC0gZ28gdGVzdCBmb3IgY29tcGFjdCBwcm90b2NvbCBpcyBub3QgcnVubmluZworICAgICogW1RIUklGVC0yMTk1XSAtIERlbHBoaTogQWRkIGV2ZW50IGhhbmRsZXJzIGZvciBzZXJ2ZXIgYW5kIHByb2Nlc3NpbmcgZXZlbnRzCisgICAgKiBbVEhSSUZULTIxNzZdIC0gVFNpbXBsZUpTT05Qcm90b2NvbC5SZWFkRmllbGRCZWdpbigpIGRvZXMgbm90IHJldHVybiBmaWVsZCB0eXBlIGFuZCBJRAorICAgICogW1RIUklGVC0yMTc1XSAtIFdyb25nIGZpZWxkIHR5cGUgc2V0IGZvciBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjE3NF0gLSBEZXNlcmlhbGl6aW5nIEpTT04gZmFpbHMgaW4gc3BlY2lmaWMgY2FzZXMKKyAgICAqIFtUSFJJRlQtMjA1M10gLSBOb2RlSlM6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0xOTE0XSAtIFB5dGhvbjogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTgxMF0gLSBhZGQgcnVieSB0byB0ZXN0L3Rlc3Quc2gKKyAgICAqIFtUSFJJRlQtMjMxMF0gLSBQSFA6IENsaWVudC1zaWRlIHN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0yMzQ2XSAtIEMjOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjM0NV0gLSBEZWxwaGk6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yMzM4XSAtIEZpcnN0IGRvY3RleHQgd3JvbmdseSBpbnRlcnByZXRlZCBhcyBwcm9ncmFtIGRvY3RleHQgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC0yMzI1XSAtIFNTTCB0ZXN0IGNlcnRpZmljYXRlcworICAgICogW1RIUklGVC0yMzU4XSAtIEMrKzogYWRkIGNvbXBhY3QgcHJvdG9jb2wgdG8gY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC0yNDI1XSAtIFBIUDogU2VydmVyLXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTI0MjFdIC0gVHJlZS9SZWN1cnNpdmUgc3RydWN0IHN1cHBvcnQgaW4gdGhyaWZ0CisgICAgKiBbVEhSSUZULTIyOTBdIC0gVXBkYXRlIEdvIHR1dG9yaWFsIHRvIGFsaWduIHdpdGggVEhSSUZULTIyMzIKKyAgICAqIFtUSFJJRlQtMjU1OF0gLSBDU2hhcnAgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCisgICAgKiBbVEhSSUZULTI1MDddIC0gQWRkaXRpb25hbCBMVUEgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGUgbmVlZGVkPworICAgICogW1RIUklGVC0yNDk5XSAtIENvbXBpbGVyOiBhbGxvdyBhbm5vdGF0aW9ucyB3aXRob3V0ICI9IHZhbHVlIgorICAgICogW1RIUklGVC0yNTM0XSAtIENyb3NzIGxhbmd1YWdlIHRlc3QgcmVzdWx0cyBzaG91bGQgcmVjb3JkZWQgdG8gYSBzdGF0dXMubWQgb3Igc3RhdHVzLmh0bWwgZmlsZSBhdXRvbWF0aWNhbGx5CisgICAgKiBbVEhSSUZULTY2XSAtIEphdmE6IEFsbG93IG11bHRpcGxleGluZyBtdWx0aXBsZSBzZXJ2aWNlcyBvdmVyIGEgc2luZ2xlIFRDUCBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTE2ODFdIC0gQWRkIEx1YSBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE3MjddIC0gUnVieS0xLjk6IGRhdGEgbG9zczogImJpbmFyeSIgZmllbGRzIGFyZSByZS1lbmNvZGVkCisgICAgKiBbVEhSSUZULTE3MjZdIC0gUnVieS0xLjk6ICJiaW5hcnkiIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkgc3RyaW5nIHdob3NlIGVuY29kaW5nIGlzICJVVEYtOCIKKyAgICAqIFtUSFJJRlQtOTg4XSAtIHBlcmw6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkgdmlhIGNvbmZpZ3VyZQorICAgICogW1RIUklGVC0zMzRdIC0gQ29tcGFjdCBQcm90b2NvbCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTI0NDRdIC0gcHVsbCByZXF1ZXN0IDg4OiB0aHJpZnQ6IGNsZWFuIHVwIGVudW0gdmFsdWUgYXNzaWdubWVudAorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTIyMjNdIC0gU3BhbSBsaW5rcyBvbiB3aWtpCisgICAgKiBbVEhSSUZULTI1NjZdIC0gUGxlYXNlIGNyZWF0ZSBhIERPQVAgZmlsZSBmb3IgeW91ciBUTFAKKyAgICAqIFtUSFJJRlQtMjIzN10gLSBVcGRhdGUgYXJjaGl2ZSB0byBjb250YWluIGFsbCB2ZXJzaW9ucworICAgICogW1RIUklGVC05NjJdIC0gVHV0b3JpYWwgcGFnZSBvbiBvdXIgd2Vic2l0ZSBpcyByZWFsbHkgdW5oZWxwZnVsCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMjMyN10gLSBub2RlanM6IG5vZGVqcyB0ZXN0IHN1aXRlIHNob3VsZCBiZSBidW5kbGVkIHdpdGggdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjQ0NV0gLSBUSFJJRlQtMjM4NCAoY29kZSBnZW5lcmF0aW9uIGZvciBnbyBtYXBzIHdpdGggYmluYXJ5IGtleXMpIHNob3VsZCBiZSB0ZXN0ZWQKKyAgICAqIFtUSFJJRlQtMjUwMV0gLSBDIyBUaGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIFRlc3RTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvdGVzdC8KKworIyMgV2lzaAorICAgICogW1RIUklGVC0yMTkwXSAtIEFkZCB0aGUgSmF2YVNjcmlwdCB0aHJpZnQuanMgbGliIHRvIHRoZSBCb3dlciByZWdpc3RyeQorICAgICogW1RIUklGVC0yMDc2XSAtIGJvb3N0OjpvcHRpb25hbCBpbnN0ZWFkIG9mIF9faXNzZXQKKworCisKK1RocmlmdCAwLjkuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDQwXSAtIGRlYmlhbiBwYWNrYWdpbmc6IG1pbm9yLWlzaCBwb2xpY3kgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTQwMl0gLSBHZW5lcmF0ZWQgWV90eXBlcy5qcyBkb2VzIG5vdCByZXF1aXJlKCkgWF90eXBlcy5qcyB3aGVuIGFuIGluY2x1ZGUgaW4gdGhlIElETCBmaWxlIHdhcyB1c2VkCisgICAgKiBbVEhSSUZULTE1NTFdIC0gMiB0aHJpZnQgZmlsZSBkZWZpbmUgb25seSBzdHJ1Y3QgKG5vIHNlcnZpY2UpLCBvbmUgaW5jbHVkZSBhbm90aGVyLCB0aGUgZ2VuIG5vZGVqcyBmaWxlIGRpZG4ndCBoYXZlICJyZXF1aXJlcyIgYXQgdGhlIHRvcAorICAgICogW1RIUklGVC0xMjY0XSAtIFRTb2NrZXRDbGllbnQgaXMgcXVlcmllZCBieSBydW4gbG9vcCBhZnRlciBkZWFsbG9jYXRpb24gaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMTYwMF0gLSBUaHJpZnQgR28gQ29tcGlsZXIgYW5kIExpYnJhcnkgb3V0IG9mIGRhdGUgd2l0aCBHbyAxIFJlbGVhc2UuCisgICAgKiBbVEhSSUZULTE2MDNdIC0gVGhyaWZ0IElETCBhbGxvd3MgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMsIGFyZ3Mgb3Igc3RydWN0IG1lbWJlciBuYW1lcyB0byBiZSB0aGUgc2FtZQorICAgICogW1RIUklGVC0xMDYyXSAtIFByb2JsZW1zIHdpdGggcHl0aG9uIHR1dG9yaWFscworICAgICogW1RIUklGVC04NjRdIC0gZGVmYXVsdCB2YWx1ZSBmYWlscyBpZiBpZGVudGlmaWVyIGlzIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTkzMF0gLSBSdWJ5IGFuZCBIYXNrZWxsIGJpbmRpbmdzIGRvbid0IHByb3Blcmx5IHN1cHBvcnQgREVTVERJUiAobWFrZXMgcGFja2FnaW5nIHBhaW5mdWwpCisgICAgKiBbVEhSSUZULTgyMF0gLSBUaGUgcmVhZExlbmd0aCBhdHRyaWJ1dGUgb2YgVEJpbmFyeVByb3RvY29sIGlzIHVzZWQgYXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYW5kIGlzIGRlY3JlbWVudGVkIG9uIGVhY2ggY2FsbCBvZiBjaGVja1JlYWRMZW5ndGgKKyAgICAqIFtUSFJJRlQtMTY0MF0gLSBOb25lIG9mIHRoZSB0dXRvcmlhbHMgbGlua2VkIG9uIHRoZSB3ZWJzaXRlIGNvbnRhaW4gY29udGVudAorICAgICogW1RIUklGVC0xNjM3XSAtIE5QTSByZWdpc3RyeSBkb2VzIG5vdCBpbmNsdWRlIHZlcnNpb24gMC44CisgICAgKiBbVEhSSUZULTE2NDhdIC0gTm9kZUpTIGNsaWVudHMgYWx3YXlzIHJlY2VpdmUgMCBmb3IgJ2RvdWJsZScgdmFsdWVzLgorICAgICogW1RIUklGVC0xNjYwXSAtIFB5dGhvbiBUaHJpZnQgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIHdpdGggcGlwIGJ1dCBub3QgZWFzeV9pbnN0YWxsCisgICAgKiBbVEhSSUZULTE2NTddIC0gQ2hyb21lIGJyb3dzZXIgc2VuZGluZyBPUFRJT05TIG1ldGhvZCBiZWZvcmUgUE9TVCBpbiB4bWxIdHRwUmVxdWVzdAorICAgICogW1RIUklGVC0yMTE4XSAtIENlcnRpZmljYXRlIGVycm9yIGhhbmRsaW5nIHN0aWxsIGluY29ycmVjdAorICAgICogW1RIUklGVC0yMTM3XSAtIFJ1YnkgdGVzdCBsaWIgZmFpbHMgamVua2lucyBidWlsZCAjODY0CisgICAgKiBbVEhSSUZULTIxMzZdIC0gVmFncmFudCBidWlsZCBub3QgY29tcGlsaW5nIGphdmEsIHJ1YnksIHBocCwgZ28gbGlicyBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMjEzNV0gLSBHTyBsaWIgbGVhdmVzIGJlaGluZCB0ZXN0IGZpbGVzIHRoYXQgYXJlIGF1dG8gZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTIxMzRdIC0gbWluZ3ctY3Jvc3MtY29tcGlsZSBzY3JpcHQgZmFpbGluZyB3aXRoIHN0cmlwIGVycm9ycworICAgICogW1RIUklGVC0yMTMzXSAtIGphdmEgVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhIHRlc3QgZmFpbGluZworICAgICogW1RIUklGVC0yMTI2XSAtIGxpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TVEQqIGZpbGVzIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjVdIC0gZGViaWFuIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjRdIC0gLm8sIC5zbywgLmxhLCAuZGVwcywgLmxpYnMsIGdlbi0qIGZpbGVzIGxlZnQgdHV0b3JpYWxzLCB0ZXN0IGFuZCBsaWIvY3BwIHdoZW4gbWFraW5nIERJU1QKKyAgICAqIFtUSFJJRlQtMjEyM10gLSBHTyBsaWIgbWlzc2luZyBmaWxlcyBpbiBESVNUIGJ1aWxkCisgICAgKiBbVEhSSUZULTIxMjFdIC0gQ29tcGlsYXRpb24gYnVnIGZvciBOb2RlLmpzCisgICAgKiBbVEhSSUZULTIxMjldIC0gcGhwIGV4dCBtaXNzaW5nIGZyb20gZGlzdAorICAgICogW1RIUklGVC0yMTI4XSAtIGxpYiBHTyB0ZXN0cyBmYWlsIHdpdGggZnVuY3QgZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorICAgICogW1RIUklGVC0yMjg2XSAtIEZhaWxlZCB0byBjb21waWxlIFRocmlmdDAuOS4xIHdpdGggYm9vc3QxLjU1IGJ5IFZTMjAxMCBpZiBzZWxlY3QgRGVidWctbXQmeDY0IG1vZGUuCisgICAgKiBbVEhSSUZULTE5NzNdIC0gVENvbXBhY3RQcm90b2NvbCBpbiBDIyBsaWIgZG9lcyBub3Qgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBuZWdhdGl2ZSBpbnQzMiBhbmQgaW50NjQgbnVtYmVyIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xOTkyXSAtIGNhc3RzIGluIFRDb21wYWN0UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKyAgICAqIFtUSFJJRlQtMTkzMF0gLSBDIyBnZW5lcmF0ZXMgdW5zaWduZWQgYnl0ZSBmb3IgVGhyaWZ0ICJieXRlIiB0eXBlCisgICAgKiBbVEhSSUZULTE5MjldIC0gVXBkYXRlIHdlYnNpdGUgdG8gdXNlIE1pcnJvcnMgZm9yIGRvd25sb2FkcworICAgICogW1RIUklGVC0xOTI4XSAtIFJhY2UgbWF5IHN0aWxsIGV4aXN0IGluIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpCisgICAgKiBbVEhSSUZULTE5MzRdIC0gVGFicyBpbiBFeGFtcGxlIHNlY3Rpb24gb24gbWFpbiBwYWdlIGFyZSBub3Qgd29ya2luZworICAgICogW1RIUklGVC0xOTMzXSAtIERlbHBoaSBnZW5lcmF0b3IgY3Jhc2hlcyB3aGVuIGEgdHlwZWRlZiByZWZlcmVuY2VzIGFub3RoZXIgdHlwZWRlZiBmcm9tIGFuIGluY2x1ZGVkIGZpbGUKKyAgICAqIFtUSFJJRlQtMTk0Ml0gLSBCaW5hcnkgYWNjZWxlcmF0ZWQgY3BwIGV4dGVuc2lvbiBkb2VzIG5vdCB1c2UgVGhyaWZ0IG5hbWVzcGFjZXMgZm9yIEV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMTk1OV0gLSBDIzogQWRkIFVuaW9uIFRNZW1vcnlCdWZmZXIgc3VwcG9ydAorICAgICogW1RIUklGVC0xOTU4XSAtIEMjOiBVc2Ugc3RhdGljIE9iamVjdC5FcXVhbHMgaW5zdGVhZCBvZiAuRXF1YWxzKCkgY2FsbHMgaW4gZXF1YWxzCisgICAgKiBbVEhSSUZULTE5NTddIC0gTm9kZUpTIFRGcmFtZWRUcmFuc3BvcnQgYW5kIFRCdWZmZXJlZFRyYW5zcG9ydCByZWFkIGJ5dGVzIGFzIHVuc2lnbmVkCisgICAgKiBbVEhSSUZULTE5NTVdIC0gVW5pb24gVHlwZSB3cml0ZXIgZ2VuZXJhdGVkIGluIEMjIGRvZXMgbm90IFdyaXRlU3RydWN0QmVnaW4KKyAgICAqIFtUSFJJRlQtMTk1Ml0gLSBUcmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMTk0OV0gLSBXUDcgYnVpbGQgYnJva2VuCisgICAgKiBbVEhSSUZULTE5NDNdIC0gZG9jc3RyaW5ncyBmb3IgZW51bSB2YWx1ZXMgYXJlIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjA3MF0gLSBJbXByb3BlciBgSGV4Q2hhcicgYW5kICdIZXhWYWwnIGltcGxlbWVudGF0aW9uIGluIFRKU09OUHJvdG9jb2wuY3MKKyAgICAqIFtUSFJJRlQtMjAxN10gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorICAgICogW1RIUklGVC0yMDMyXSAtIEMjIGNsaWVudCBsZWFrcyBzb2NrZXRzL2hhbmRsZXMKKyAgICAqIFtUSFJJRlQtMTk5Nl0gLSBKYXZhTUUgQ29uc3RhbnRzIGdlbmVyYXRpb24gaXMgYnJva2VuIC8gaW5jb25zaXN0ZW50IHdpdGggcmVndWxhciBKYXZhIGdlbmVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMl0gLSBIYXNrZWxsOiBUZXN0IHVzZSBEYXRhLk1heWJlIGluc3RlYWQgb2YgTWF5YmUKKyAgICAqIFtUSFJJRlQtMjA1MV0gLSBWYWdyYW50IGZhaWxzIHRvIGJ1aWxkIGVybGFuZworICAgICogW1RIUklGVC0yMDUwXSAtIFZhZ3JhbnQgQyMgbGliIGNvbXBpbGUgZmFpbHMgd2l0aCBURXhjZXB0aW9uIG1pc3NpbmcKKyAgICAqIFtUSFJJRlQtMTk3OF0gLSBSdWJ5OiBUaHJpZnQgc2hvdWxkIGFsbG93IGZvciB0aGUgU1NMIHZlcmlmeSBtb2RlIHRvIGJlIHNldAorICAgICogW1RIUklGVC0xOTg0XSAtIG5hbWVzcGFjZSBjb2xsaXNpb24gaW4gcHl0aG9uIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTE5ODhdIC0gV2hlbiB0cnlpbmcgdG8gYnVpbGQgYSBkZWJpYW4gcGFja2FnZSBpdCBmYWlscyBhcyB0aGUgZmlsZSBORVdTIGRvZXNuJ3QgZXhpc3QKKyAgICAqIFtUSFJJRlQtMTk3NV0gLSBUQmluYXJ5UHJvdG9jb2wgQ2hlY2tMZW5ndGggY2FuJ3QgYmUgdXNlZCBmb3IgYSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMTk5NV0gLSAnLicgYWxsb3dlZCBhdCBlbmQgb2YgaWRlbnRpZmllciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0yMTEyXSAtIEVycm9yIGluIEdvIGdlbmVyYXRvciB3aGVuIHVzaW5nIHR5cGVkZWZzIGluIG1hcCBrZXlzCisgICAgKiBbVEhSSUZULTIwODhdIC0gVHlwb3MgaW4gVGhyaWZ0IGNvbXBpbGVyIGhlbHAgdGV4dAorICAgICogW1RIUklGVC0yMDgwXSAtIEMjIG11bHRpcGxleCBwcm9jZXNzb3IgZG9lcyBub3QgY2F0Y2ggSU9FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjA4Ml0gLSBFeGVjdXRpbmcgImdtYWtlIGNsZWFuIiBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjEwMl0gLSBjb25zdGFudHMgYXJlIG5vdCByZWZlcmVuY2luZyB0byBjb3JyZWN0IHR5cGUgd2hlbiBpbmNsdWRlZCBmcm9tIGFub3RoZXIgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtMjEwMF0gLSB0eXBlZGVmcyBhcmUgbm90IGNvcnJlY3RseSByZWZlcmVuY2VkIHdoZW4gaW5jbHVkaW5nIGZyb20gb3RoZXIgdGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTIwNjZdIC0gJ21ha2UgaW5zdGFsbCcgZG9lcyBub3QgaW5zdGFsbCB0d28gaGVhZGVycyByZXF1aXJlZCBmb3IgQysrIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIwNjVdIC0gTm90IHZhbGlkIGNvbnN0YW50cyBmaWxlbmFtZSBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIwNDddIC0gVGhyaWZ0LlByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wsIGludFRvWmlnWmFnIGRhdGEgbG9zdCAoVENvbXBhY3RQcm90b2NvbC5jcykKKyAgICAqIFtUSFJJRlQtMjAzNl0gLSBUaHJpZnQgZ2VtIHdhcm5zIGFib3V0IGNsYXNzIHZhcmlhYmxlIGFjY2VzcyBmcm9tIHRvcCBsZXZlbAorICAgICogW1RIUklGVC0yMDU3XSAtIFZhZ3JhbnQgZmFpbHMgb24gcGhwIHRlc3RzCisgICAgKiBbVEhSSUZULTIxMDVdIC0gR2VuZXJhdGVkIGNvZGUgZm9yIGRlZmF1bHQgdmFsdWVzIG9mIGNvbGxlY3Rpb25zIGlnbm9yZXMgdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICogW1RIUklGVC0yMDkxXSAtIFVubmVjZXNzYXJ5ICdmcmllbmQnIGRlY2xhcmF0aW9uIGNhdXNlcyB3YXJuaW5nIGluIFRXaW5zb2NrU2luZ2xldG9uCisgICAgKiBbVEhSSUZULTIwOTBdIC0gR28gZ2VuZXJhdG9yLCBmaXggaW5jbHVkaW5nIG9mIG90aGVyIHRocmlmdCBmaWxlcworICAgICogW1RIUklGVC0yMTA2XSAtIEZpeCBzdXBwb3J0IGZvciBuYW1lc3BhY2VzIGluIEdPIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0xNzgzXSAtIEMjIGRvZXNuJ3QgaGFuZGxlIHJlcXVpcmVkIGZpZWxkcyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTc4Ml0gLSBhc3luYyBvbmx5IGRlZmluZWQgaW4gc2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMTc3OV0gLSBNaXNzaW5nIHByb2Nlc3NfWFhYWCBtZXRob2QgaW4gZ2VuZXJhdGVkIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gZm9yIGFsbCAnb25ld2F5JyBzZXJ2aWNlIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0xNjkyXSAtIFNPX1JFVVNFQUREUiBhbGxvd3MgZm9yIHNvY2tldCBoaWphY2tpbmcgb24gV2luZG93cworICAgICogW1RIUklGVC0xNzIwXSAtIEpSdWJ5IHRpbWVzIG91dCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMTcxM10gLSBOYW1lZCBhbmQgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0IChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE2OTldIC0gTmF0aXZlIFVuaW9uI3JlYWQgaGFzIGV4dHJhIHJlYWRfZmllbGRfZW5kIGNhbGwKKyAgICAqIFtUSFJJRlQtMTc0OV0gLSBQeXRob24gVFNTTFNvY2tldCBlcnJvciBoYW5kbGluZyBvYnNjdXJlcyBhY3R1YWwgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc0OF0gLSBHdWFyZCBhbmQgUldHdWFyZCBtYWNyb3MgZGVmaW5lZCBpbiBnbG9iYWwgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE3MzRdIC0gRnJvbnQgd2VicGFnZSBpcyBzdGlsbCBhZHZlcnRpc2luZyB2MC44IGFzIGN1cnJlbnQgcmVsZWFzZQorICAgICogW1RIUklGVC0xNzI5XSAtIEMgZ2xpYiByZWZhY3RvciBsZWZ0IGVtcHR5IGZvbGRlcnMgaW4gc3ZuCisgICAgKiBbVEhSSUZULTE3NjddIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE3NjVdIC0gSW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBmb3IgbnVsbCBvciBuZWdhdGl2ZSBrZXlzCisgICAgKiBbVEhSSUZULTE3NzhdIC0gQ29uZmlndXJlIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24gZHVlIHRvIHRhciBmYWlsdXJlCisgICAgKiBbVEhSSUZULTE3NzddIC0gVFBpcGVTZXJ2ZXIgaXMgVU5TVE9QUEFCTEUKKyAgICAqIFtUSFJJRlQtMTc1M10gLSBNdWx0aXBsZSBDKysgV2luZG93cywgT1NYLCBhbmQgaU9TIHBvcnRhYmlsaXR5IGlzc3VlcworICAgICogW1RIUklGVC0xNzU2XSAtICdtYWtlIC1qIDgnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCisgICAgKiBbVEhSSUZULTE3NzNdIC0gUHl0aG9uIGxpYnJhcnkgc2hvdWxkIHJ1biBvbiBweXRob24gMi40CisgICAgKiBbVEhSSUZULTE3NjldIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDKyspCisgICAgKiBbVEhSSUZULTE3NjhdIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDb21waWxlcikKKyAgICAqIFtUSFJJRlQtMTY2Nl0gLSBodG9ubGwgdXNhZ2UgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBnZW5lcmF0ZXMgd2FybmluZyB3aXRoIE1TVkMyMDEwCisgICAgKiBbVEhSSUZULTE5MTldIC0gbGlidGhyaWZ0IGRlcGVuZHMgb24gaHR0cGNvcmUtNC4xLjMgKGRpcmVjdGx5KSBhbmQgaHR0cGNvcmUtNC4xLjQgKHRyYW5zaXRpdmVseSkKKyAgICAqIFtUSFJJRlQtMTg2NF0gLSBpbXBsZW1lbnQgZXZlbnQgaGFuZGxlciBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcgorICAgICogW1RIUklGVC0xODU5XSAtIEdlbmVyYXRlZCBlcnJvciBjKysgY29kZSB3aXRoIC1vdXQgYW5kIGluY2x1ZGVfcHJlZml4IHBhcmFtCisgICAgKiBbVEhSSUZULTE4NjldIC0gVFRocmVhZFBvb2xTZXJ2ZXIgKGphdmEpIGRpZXMgd2hlbiB0aHJlYWRwb29sIGlzIGNvbnN1bWVkCisgICAgKiBbVEhSSUZULTE4NDJdIC0gTWVtb3J5IGxlYWsgd2l0aCBQaXBlcworICAgICogW1RIUklGVC0xODM4XSAtIENhbid0IGJ1aWxkIGNvbXBpbGVyIG9uIE9TIFggYmVjYXVzZSBvZiBtaXNzaW5nIHRocmlmdHkuaAorICAgICogW1RIUklGVC0xODQ2XSAtIFJlc3RvcmUgc29ja2V0LmggaGVhZGVyIHRvIHN1cHBvcnQgYnVpbGRzIHdpdGggQW5kcm9pZCBOREsKKyAgICAqIFtUSFJJRlQtMTg1MF0gLSBtYWtlIGNoZWNrIGhhbmdzIG9uIFRTb2NrZXQgdGVzdHMgaW4gVHJhbnNwb3J0VGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMTg3M10gLSBCaW5hcnkgcHJvdG9jb2wgZmFjdG9yeSBpZ25vcmVzIHN0cnVjdCByZWFkL3dyaXRlIGZsYWdzCisgICAgKiBbVEhSSUZULTE4NzJdIC0gaXNzdWVzIHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0IGJ1ZmZlcgorICAgICogW1RIUklGVC0xOTA0XSAtIEluY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdHlwZWRlZnMgd2hpY2ggdXNlIGluY2x1ZGVkIHR5cGVzCisgICAgKiBbVEhSSUZULTE5MDNdIC0gUEhQIG5hbWVzcGFjZXMgY2F1c2UgYmluYXJ5IHByb3RvY29scyB0byBub3QgYmUgdXNlZAorICAgICogW1RIUklGVC0xODk1XSAtIERlbHBoaTogcmVzZXJ2ZWQgdmFyaWFibGUgbmFtZSAicmVzdWx0IiBub3QgZGV0ZWN0ZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMTg4MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgcmVsZWFzZSBvcGVuIGNvbm5lY3Rpb25zIG9yIHRocmVhZHMgb24gc2h1dGRvd24KKyAgICAqIFtUSFJJRlQtMTg4OF0gLSBKYXZhIFRocmlmdCBjbGllbnQgY2FuJ3QgY29ubmVjdCB0byBQeXRob24gVGhyaWZ0IHNlcnZlciBvbiBzYW1lIGhvc3QKKyAgICAqIFtUSFJJRlQtMTgzMV0gLSBCdWcgaW4gbGlzdCBkZXNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTgyNF0gLSBtYW55IGNvbXBpbGUgd2FybmluZywgYmVjYXNlIFRocmVhZC5oIGluY2x1ZGVzIGNvbmZpZy5oCisgICAgKiBbVEhSSUZULTE4MjNdIC0gTWlzc2luZyBwYXJlbnRoZXNpcyBicmVha3MgIklTXy4uLiIgbWFjcm8gaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTgwNl0gLSBQeXRob24gZ2VuZXJhdGlvbiBhbHdheXMgdHJ1bmNhdGVzIF9faW5pdF9fLnB5IGZpbGVzCisgICAgKiBbVEhSSUZULTE3OTVdIC0gUmFjZSBjb25kaXRpb24gaW4gVFRocmVhZGVkU2VydmVyUG9vbCBqYXZhIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTE3OTRdIC0gQyMgYXN5bmNjdHAgYnJva2VuCisgICAgKiBbVEhSSUZULTE4MDRdIC0gQmluYXJ5K2NvbXBhY3QgcHJvdG9jb2wgc2luZ2xlIGJ5dGUgZXJyb3IgaW4gUnVieSBsaWJyYXJ5IChBUk0gYXJjaGl0ZWN0dXJlKTogY2F1c2VkIGJ5IGRpZmZlcmVudCBjaGFyIHNpZ25lZG5lc3MKKyAgICAqIFtUSFJJRlQtMTgwMF0gLSBEb2N1bWVudGF0aW9uIHRleHQgbm90IGFsd2F5cyBlc2NhcGVkIGNvcnJlY3RseSB3aGVuIHJlbmRlcmVkIHRvIEhUTUwKKyAgICAqIFtUSFJJRlQtMTc4OF0gLSBDIzogQ29uc3RhbnRzIHN0YXRpYyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE4MTZdIC0gTmVlZCAicmVxdWlyZSIgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGluICJ4eHhfdHlwZXMuanMiCisgICAgKiBbVEhSSUZULTE5MDddIC0gQ29tcGlsaW5nIG5hbWVzcGFjZSBhbmQgc3ViLW5hbWVzcGFjZSBkaXJlY3RpdmVzIGZvciB1bnJlY29nbml6ZWQgZ2VuZXJhdG9ycyBzaG91bGQgb25seSBiZSBhIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkxM10gLSBza2lwcGluZyB1bmtub3duIGZpZWxkcyBpbiBqYXZhIHVuaW9ucworICAgICogW1RIUklGVC0yNTUzXSAtIEMrKyBsaW5rZXIgZXJyb3IgLSB0cmFuc3BvcnQvVFNvY2tldAorICAgICogW1RIUklGVC0yNzRdIC0gVG93YXJkcyBhIHdvcmtpbmcgcmVsZWFzZS92ZXJzaW9uaW5nIHByb2Nlc3MKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xOTcxXSAtIFtHcmFwaHZpel0gQWRkcyB0dXRvcmlhbC9nZW5lcmFsIGRlc2NyaXB0aW9uIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMV0gLSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIEV4YW1wbGUgIkMrKyBTZXJ2ZXIiIHRhYiBpcyBicm9rZW4KKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTU3NF0gLSBBcGFjaGUgcHJvamVjdCBicmFuZGluZyByZXF1aXJlbWVudHM6IERPQVAgZmlsZSBbUEFUQ0hdCisgICAgKiBbVEhSSUZULTEzNDddIC0gVW5pZnkgdGhlIGV4Y2VwdGlvbnMgcmV0dXJuZWQgaW4gZ2VuZXJhdGVkIEdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMTM1M10gLSBTd2l0Y2ggdG8gcGVyZm9ybWFuY2UgYnJhbmNoLCBnZXQgcmlkIG9mIEJpbmFyeVBhcnNlcgorICAgICogW1RIUklGVC0xNjI5XSAtIFJ1YnkgMS45IENvbXBhdGliaWxpdHkgZHVyaW5nIFRocmlmdCBjb25maWd1cmUsIG1ha2UsIGluc3RhbGwKKyAgICAqIFtUSFJJRlQtOTkxXSAtIFJlZmFjdG9yIEhhc2tlbGwgY29kZSBhbmQgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTk5MF0gLSBTYW5pZnkgZ2V0dGltZW9mZGF5IHVzYWdlIGNvZGViYXNlLXdpZGUKKyAgICAqIFtUSFJJRlQtNzkxXSAtIExldCBDKysgVFNpbXBsZVNlcnZlciBiZSBkcml2ZW4gYnkgYW4gZXh0ZXJuYWwgbWFpbiBsb29wCisgICAgKiBbVEhSSUZULTIxMTddIC0gQ29jb2EgVEJpbmFyeVByb3RvY29sIHN0cmljdFdyaXRlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CisgICAgKiBbVEhSSUZULTE5NzJdIC0gQWRkIHN1cHBvcnQgZm9yIGFzeW5jIHByb2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMTk3MF0gLSBbR3JhcGh2aXpdIEFkZHMgb3B0aW9uIHRvIHJlbmRlciBleGNlcHRpb25zIHJlbGF0aW9uc2hpcHMKKyAgICAqIFtUSFJJRlQtMTk2Nl0gLSBTdXBwb3J0IGRpZmZlcmVudCBmaWxlcyBmb3IgU1NMIGNlcnRpZmljYXRlcyBhbmQga2V5cworICAgICogW1RIUklGVC0xOTY1XSAtIEFkZHMgR3JhcGh2aXogKGdyYXBoIGRlc2NyaXB0aW9uIGxhbmd1YWdlKSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMTk1Nl0gLSBTd2l0Y2ggdG8gQXBhY2hlIENvbW1vbnMgTGFuZyAzCisgICAgKiBbVEhSSUZULTE5NjJdIC0gTXVsdGlwbGV4IHByb2Nlc3NvciBzaG91bGQgc2VuZCBhbnkgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGJhY2sgdG8gY2xpZW50CisgICAgKiBbVEhSSUZULTE5NjBdIC0gbWFpbigpIGRlY2xhcmVzIDIyIHVudXNlZCBnZW4gYm9vbHMKKyAgICAqIFtUSFJJRlQtMTk1MV0gLSBsaWJ0aHJpZnQuamFyIGhhcyBzb3VyY2UgZmlsZXMgaW4gaXQKKyAgICAqIFtUSFJJRlQtMTk5N10gLSBBZGQgYWNjZXB0IGJhY2tsb2cgY29uZmlndXJhdGlvbiBtZXRob2QgdG8gIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMjAwM10gLSBEZXByZWNhdGUgc2VudW0KKyAgICAqIFtUSFJJRlQtMjA1Ml0gLSBWYWdyYW50IG1hY2hpbmUgaW1hZ2UgZGVmYXVsdHMgdG8gb25seSAzODRNQiBvZiBSQU0KKyAgICAqIFtUSFJJRlQtMTk4MF0gLSBNb2Rlcm5pemUgR28gdG9vbGluZywgZml4IGdvIGNsaWVudCBsaWJhcnkuCisgICAgKiBbVEhSSUZULTE5NzddIC0gQyMgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIGNvbnN0YW50IGZpbGVzIHByZWZpeGVkIHdpdGggdGhyaWZ0IGZpbGUgbmFtZQorICAgICogW1RIUklGVC0xOTg1XSAtIGFkZCBhIFZhZ3JhbnRmaWxlIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQgZnVsbHkgcmVwcm9kdWNhYmxlCisgICAgKiBbVEhSSUZULTE5OTRdIC0gRGVwcmVjYXRlIHNsaXN0CisgICAgKiBbVEhSSUZULTE5OTNdIC0gRmFjdG9yeSB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20ga25vd24gKGdlbmVyYXRlZCkgaW50ZXJmYWNlIHR5cGVzIHdpdGggRGVscGhpCisgICAgKiBbVEhSSUZULTIwODFdIC0gU3BlY2lmaWVkIHRpbWVvdXQgc2hvdWxkIGJlIHVzZWQgaW4gVFNvY2tldC5PcGVuKCkKKyAgICAqIFtUSFJJRlQtMjA4NF0gLSBEZWxwaGk6IEFiaWxpdHkgdG8gY3JlYXRlIGVudGl0eSBUaHJpZnQtZ2VuZXJhdGVkIGluc3RhbmNlcyBiYXNlZCBvbiBUeXBlSW5mbworICAgICogW1RIUklGVC0yMDgzXSAtIEltcHJvdmUgdGhlIGdvIGxpYjogYnVmZmVyZWQgVHJhbnNwb3J0LCBzYXZlIG1lbW9yeSBhbGxvY2F0aW9uLCBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTIxMDldIC0gU2VjdXJlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgaW4gR28KKyAgICAqIFtUSFJJRlQtMjEwN10gLSBtaW5vciBHbyBnZW5lcmF0b3IgZml4ZXMKKyAgICAqIFtUSFJJRlQtMTY5NV0gLSBhbGxvdyB3YXJuaW5nLWZyZWUgY29tcGlsYXRpb24gaW4gVlMgMjAxMiBhbmQgR05VIDQuNgorICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTcxNl0gLSBtYXggYWxsb3dlZCBjb25uZWN0aW9ucyBzaG91bGQgYmUgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCisgICAgKiBbVEhSSUZULTE3MTVdIC0gQWxsb3cgZXhjbHVkaW5nIHB5dGhvbiBwYXJ0cyB3aGVuIGJ1aWxkaW5nIGNvbnRyaWIvZmIzMDMKKyAgICAqIFtUSFJJRlQtMTczM10gLSBGaXggUlBNIGJ1aWxkIGlzc3VlcyBvbiBSSEVMNi9PTDYgc3lzdGVtcworICAgICogW1RIUklGVC0xNzI4XSAtIFVwZ3JhZGF0aW9uIG9mIGh0dHBjb21wb25lbnRzCisgICAgKiBbVEhSSUZULTE4NzZdIC0gVXNlIGVudW0gbmFtZXMgaW5zdGVhZCBvZiBjYXN0ZWQgaW50ZWdlcnMgaW4gYXNzaWdubWVudHMKKyAgICAqIFtUSFJJRlQtMTg3NF0gLSB0aW1lb3V0IGZvciB0aGUgc2VydmVyLXNpZGUgZW5kIG9mIGEgbmFtZWQgcGlwZQorICAgICogW1RIUklGVC0xODk3XSAtIFN1cHBvcnQgdmFsaWRhdGlvbiBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTg5Nl0gLSBBZGQgVEJhc2UgcHJvdG9jb2wgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTE4ODBdIC0gTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseSAob3ZlcmxhcHBlZCkgdG8gYWxsb3cgZm9yIGNsZWFuIHNlcnZlciBzdG9wcworICAgICogW1RIUklGVC0xODc4XSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycworICAgICogW1RIUklGVC0xODgyXSAtIFVzZSBzaW5nbGUgaW5jbHVkZQorICAgICogW1RIUklGVC0xNzkzXSAtIEMjOiBVc2Ugc3RhdGljIHJlYWQgaW5zdGVhZCBvZiBpbnN0YW5jZSByZWFkCisgICAgKiBbVEhSSUZULTE3OTldIC0gT3B0aW9uIHRvIGdlbmVyYXRlIEhUTUwgaW4gInN0YW5kYWxvbmUgbW9kZSIKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTE4OTBdIC0gQysrOiBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5CisgICAgKiBbVEhSSUZULTQ3NF0gLSBHZW5lcmF0aW5nIFJ1Ynkgb24gUmFpbHMgZnJpZW5kbHkgY29kZQorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC04MDFdIC0gUHJvdmlkZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAoaXJiKSB3aGVuIGdlbmVyYXRpbmcgcnVieSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMjkyXSAtIEFuZHJvaWQgTGlicmFyeSBQcm9qZWN0CisgICAgKiBbVEhSSUZULTIwMTJdIC0gTW9kZXJuaXppbmcgR28KKyAgICAqIFtUSFJJRlQtMTk2OV0gLSBDIzogVGVzdHMgbm90IHByb3Blcmx5IGxpbmtlZCBmcm9tIHRoZSBzb2x1dGlvbgorICAgICogW1RIUklGVC0xNzg1XSAtIEMjOiBBZGQgVE1lbW9yeUJ1ZmZlciBzZXJpYWxpemVyL2Rlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xNzgwXSAtIEFkZCBvcHRpb24gdG8gZ2VuZXJhdGUgbnVsbGFibGUgdmFsdWVzCisgICAgKiBbVEhSSUZULTE3ODZdIC0gQyMgVW5pb24gVHlwaW5nCisgICAgKiBbVEhSSUZULTU5MV0gLSBNYWtlIHRoZSBDKysgcnVudGltZSBsaWJyYXJ5IGJlIGNvbXBhdGlibGUgd2l0aCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTUxNF0gLSBBZGQgb3B0aW9uIHRvIGNvbmZpZ3VyZSBjb21waWxlciBvdXRwdXQgZGlyZWN0b3J5CisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTE3NjRdIC0gaG93IHRvIGdldCB0aGUgY29udGV4dCBvZiBjbGllbnQgd2hlbiBvbiBhIHJwYyBjYWxsIGluIHNlcnZlciBzaWRlPworICAgICogW1RIUklGVC0xNzkxXSAtIHRocmlmdCdzIG5hbWVzcGFjZSBkaXJlY3RpdmUgd2hlbiBnZW5lcmF0aW5nIGhhc2tlbGwgY29kZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk0XSAtIEphdmEgdGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIG5vdC4KKyAgICAqIFtUSFJJRlQtMTU5NV0gLSBKYXZhIHRlc3Qgc2VydmVyIHNob3VsZCBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYXMgb2YgVEhSSUZULTE1OTAKKyAgICAqIFtUSFJJRlQtOTg2XSAtIHN0OiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTk4NV0gLSBwaHA6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtOTg0XSAtIG9jYW1sOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjRdIC0gRGVscGhpOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCisgICAgKiBbVEhSSUZULTE5MjJdIC0gQyM6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTk2MV0gLSBDIyB0ZXN0cyBzaG91bGQgYmUgaW4gbGliL2NzaGFycC90ZXN0Ly4uLgorICAgICogW1RIUklGVC0xODIyXSAtIFBIUCB1bml0IHRlc3QgZG9lcyBub3Qgd29yaworICAgICogW1RIUklGVC0xOTAyXSAtIEMrKzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTkwMV0gLSBDIzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTg5OV0gLSBEZWxwaGk6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTU2M10gLSBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorCisKKworVGhyaWZ0IDAuOQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDM4XSAtIGxpYi9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggc2hvdWxkIHJlYWQgdmVyc2lvbiBmcm9tIGNvbmZpZ3VyZS5hYyByYXRoZXIgdGhhbiBhICNkZWZpbmUKKyAgICAqIFtUSFJJRlQtMTQ0Nl0gLSBDb21waWxlIGVycm9yIHdpdGggRGVscGhpIDIwMDkgaW4gY29uc3RhbnQgaW5pdGlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTQ1MF0gLSBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgUnVieQorICAgICogW1RIUklGVC0xNDQ5XSAtIFJ1YnkgY2xpZW50IGRvZXMgbm90IHdvcmsgb24gc29sYXJpcyAoPykKKyAgICAqIFtUSFJJRlQtMTQ0N10gLSBOdWxscG9pbnRlckV4Y2VwdGlvbiBpbiBQcm9jZXNzRnVuY3Rpb24uY2xhc3MgOmluICJvbmV3YXkiIG1ldGhvZAorICAgICogW1RIUklGVC0xNDMzXSAtIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCisgICAgKiBbVEhSSUZULTE0MjldIC0gVGhlIG5vbmJsb2NraW5nIHNlcnZlcnMgaXMgc3VwcG9zZWQgdG8gdXNlIFRyYW5zcG9ydEZhY3RvcnkgdG8gcmVhZCB0aGUgZGF0YQorICAgICogW1RIUklGVC0xNDI3XSAtIFBIUCBsaWJyYXJ5IHVzZXMgbm9uLW11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB3aXRoIG1ic3RyaW5nIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCisgICAgKiBbVEhSSUZULTE0MjFdIC0gRGViaWFuIFBhY2thZ2VzIGNhbiBub3QgYmUgYnVpbHQKKyAgICAqIFtUSFJJRlQtMTM5NF0gLSBUcmVhdG1lbnQgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gQysrIGFuZCBKYXZhCisgICAgKiBbVEhSSUZULTE1MTFdIC0gU2VydmVyIHdpdGggb25ld2F5IHN1cHBvcnQgKCBKQVZBICkKKyAgICAqIFtUSFJJRlQtMTQ5Nl0gLSBQSFAgY29tcGlsZXIgbm90IG5hbWVzcGFjaW5nIGVudW1zCisgICAgKiBbVEhSSUZULTE0OTVdIC0gUEhQIFRlc3RDbGllbnQgZmF0YWxzIG9uIG1pc3NpbmcgY2xhc3MKKyAgICAqIFtUSFJJRlQtMTUwOF0gLSBUU2VydmVyU29ja2V0IGRvZXMgbm90IGFsbG93IGZvciB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIHRvIGJpbmQgdG8KKyAgICAqIFtUSFJJRlQtMTUwNF0gLSBDb2NvYSBHZW5lcmF0b3Igc2hvdWxkIHVzZSBsb2NhbCBmaWxlIGltcG9ydHMgZm9yIGJhc2UgVGhyaWZ0IGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtMTUxMl0gLSBUaHJpZnQgc29ja2V0IHN1cHBvcnQgZm9yIFdpbmRvd3MgWFAKKyAgICAqIFtUSFJJRlQtMTUwMl0gLSBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpOiBEbyBub3QgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UgaWYgc2VydmVyIHdhcyBzdG9wcGVkLgorICAgICogW1RIUklGVC0xNTAxXSAtIFBIUCBvbGQgbmFtZXNwYWNlcyBub3QgZ2VuZXJhdGVkIGZvciBlbnVtcworICAgICogW1RIUklGVC0xNDgzXSAtIGphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciBzZXJ2aWNlcyBpbiBleHRlbmRlZCBjbGF1c2VzCisgICAgKiBbVEhSSUZULTE0NzldIC0gQ29tcGlsZWQgUEhQIHByb2Nlc3MgZnVuY3Rpb25zIG1pc3Npbmcgd3JpdGVNZXNzYWdlRW5kKCkKKyAgICAqIFtUSFJJRlQtMTQ5Ml0gLSBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrIGNvZGUpCisgICAgKiBbVEhSSUZULTE0OTFdIC0gVW5pbml0aWFsaXplIHByb2Nlc3NvckZhY3RvcnlfIG1lbWJlciBpbiBUU2VydmVyLmgKKyAgICAqIFtUSFJJRlQtMTQ3NV0gLSBJbmNvbXBsZXRlIHJlY29yZHMgZ2VuZXJhdGlvbiBmb3IgRXJsYW5nCisgICAgKiBbVEhSSUZULTE0ODZdIC0gSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTQ4OF0gLSBzcmMvY29uY3VycmVuY3kvVGhyZWFkLmg6OTE6NTg6IGVycm9yOiBpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSAncHRocmVhZF90IHtha2EgX29wYXF1ZV9wdGhyZWFkX3QqfScgdG8gJ2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOjppZF90IHtha2EgbG9uZyBsb25nIHVuc2lnbmVkIGludH0nIFstZnBlcm1pc3NpdmVdCisgICAgKiBbVEhSSUZULTE0OTBdIC0gV2luZG93cy1zcGVjaWZpYyBoZWFkZXIgZmlsZXMgLSBmaXhlcyAmIHR3ZWFrcworICAgICogW1RIUklGVC0xNTI2XSAtIFVuaW9uIFR1cGxlU2NoZW1lRmFjdG9yeSByZXR1cm5zIFN0YW5kYXJkU2NoZW1lcworICAgICogW1RIUklGVC0xNTI3XSAtIEdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZVJlYWRTdHJ1Y3QgaW4gdW5pb25zIHJldHVybiBudWxsIHdoZW4gdGhlIHNldGZpZWxkIGlzIHVucmVjb2duaXplZAorICAgICogW1RIUklGVC0xNTI0XSAtIFROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAorICAgICogW1RIUklGVC0xNTI5XSAtIFR1cGxlUHJvdG9jb2wgY2FuIHVuaW50ZW50aW9uYWxseSBpbmNsdWRlIGFuIGV4dHJhIGJ5dGUgaW4gYml0IHZlY3RvcnMgd2hlbiBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIGFuIGludGVncmFsIG9mIDgKKyAgICAqIFtUSFJJRlQtMTQ3M10gLSBKU09OIGNvbnRleHQgc3RhY2sgbWF5IGJlIGxlZnQgaW4gYW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTE0NTZdIC0gU3lzdGVtLk5ldC5IdHRwV2ViUmVxdWVzdCcgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdQcm94eScKKyAgICAqIFtUSFJJRlQtMTQ2OF0gLSBNZW1vcnkgbGVhayBpbiBUU2FzbFNlcnZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0xNDYxXSAtIFJlY2VudCBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2hhbmdlcyBicm9rZSAtLWVuYWJsZS1ib29zdHRocmVhZHM9eWVzLCBXaW5kb3dzCisgICAgKiBbVEhSSUZULTE0NjBdIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0xNDY0XSAtIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2Vzc29yIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJpdmF0ZQorICAgICogW1RIUklGVC0xNDY3XSAtIFBvc3NpYmxlIEFWIHdpdGggZW1wdHkgc3RyaW5ncyB3aGVuIHVzaW5nIEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTUyM10gLSBjbGllbnRUaW1lb3V0IG5vdCB3b3JrZWQgYXMgZXhwZWN0ZWQgaW4gVFNlcnZlclNvY2tldCBjcmVhdGVkIGJ5IFRTU0xUcmFuc3BvcnRGYWN0b3J5CisgICAgKiBbVEhSSUZULTE1MzddIC0gVEZyYW1lZFRyYW5zcG9ydCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTUxOV0gLSBUaGlyZnQgQnVpbGQgRmFpbHVyZSByZWZlcmVuY2luZyByYl9pbnRlcm4yIHN5bWJvbAorICAgICogW1RIUklGVC0xNTE4XSAtIEdlbmVyYXRlZCBDKysgY29kZSBvbmx5IHNlbmRzIHRoZSBmaXJzdCBvcHRpb25hbCBmaWVsZCBpbiB0aGUgd3JpdGUoKSBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuCisgICAgKiBbVEhSSUZULTE1MTVdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNTU0XSAtIEluaGVyaXRlZCBzZXJ2aWNlIG1ldGhvZHMgYXJlIG5vdCByZXNvbHZlZCBpbiBkZXJpdmVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTE1NTNdIC0gdGhyaWZ0IG5vZGVqcyBzZXJ2aWNlIHNpZGUgY2FuJ3QgcmVhZCBtYXAgc3RydWN0dXJlLCBrZXkgYXMgZW51bSwgdmFsdWUgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTE1NzVdIC0gVHlwbyBpbiBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorICAgICogW1RIUklGVC0xMzI3XSAtIEZpeCBTcGVjIFN1aXRlIHVuZGVyIFJ1YnktMS44LjcgKHdvcmtzIGZvciBNUkkgUnVieS0xLjkuMikKKyAgICAqIFtUSFJJRlQtMTMyNl0gLSBvbiBzb21lIHBsYXRmb3JtcywgI2luY2x1ZGUgPHN0ZGludC5oPiBpcyBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQgaW4gVGhyaWZ0LmgKKyAgICAqIFtUSFJJRlQtMTE1OV0gLSBUSHR0cENsaWVudC0+Rmx1c2goKSBpc3N1ZSAoY29ubmVjdGlvbiB0aHJ1IHByb3h5KQorICAgICogW1RIUklGVC0xMjc3XSAtIE5vZGUuanMgc2VyaWFsaXplcyBmYWxzZSBib29sZWFucyBhcyBudWxsCisgICAgKiBbVEhSSUZULTEyMjRdIC0gQ2Fubm90IGluc2VydCBVVEYtOCB0ZXh0CisgICAgKiBbVEhSSUZULTEyNjddIC0gTm9kZS5qcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgorICAgICogW1RIUklGVC0xMzM4XSAtIERvIG5vdCB1c2UgYW4gdW5wYXRjaGVkIGF1dG9jb25mIDIuNjUgdG8gZ2VuZXJhdGUgcmVsZWFzZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTExMjhdIC0gTUFDIE9TIFg6IHRocmlmdC5oIGluY29tcGF0aWJpbGl0eSB3aXRoIFRocmlmdC5oCisgICAgKiBbVEhSSUZULTE2MzFdIC0gRml4IEMrKyBzZXJ2ZXIgY29uc3RydWN0b3IgdHlwb3MKKyAgICAqIFtUSFJJRlQtMTYwMl0gLSBQSFAgQyBFeHRlbnNpb24gaXMgbm90IENvbXBhdGlibGUgd2l0aCBQSFAgNS40CisgICAgKiBbVEhSSUZULTE2MTBdIC0gSVdlYlByb3h5IG5vdCBhdmFpbGFibGUgb24gV1A3IHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTE2MDZdIC0gUmFjZSBjb25kaXRpb24gaW4gQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAorICAgICogW1RIUklGVC0xNjA0XSAtIFB5dGhvbiBleGNlcHRpb24gaGFuZGVsaW5nIGZvciBjaGFuZ2VzIGZyb20gUEVQIDMxMTAKKyAgICAqIFtUSFJJRlQtMTYwN10gLSBJbmNvcnJlY3QgZmlsZSBtb2RlcyBmb3Igc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTU5N10gLSBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMTU5MV0gLSBFbmFibGUgVENQX05PREVMQVkgZm9yIHJ1YnkgZ2VtCisgICAgKiBbVEhSSUZULTE2MjRdIC0gSXNzZXQgR2VuZXJhdGVkIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtMTYyMl0gLSBJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCBvbiByZWFkCisgICAgKiBbVEhSSUZULTE2MjFdIC0gTWVtb3J5IGxlYWtzCisgICAgKiBbVEhSSUZULTE2MTJdIC0gQmFzZTY0IGVuY29kaW5nIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0xNjI3XSAtIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTE1NzFdIC0gVXBkYXRlIFJ1YnkgSFRUUCB0cmFuc3BvcnQgZm9yIHJlY2VudCBSdWJ5IHZlcnNpb25zCisgICAgKiBbVEhSSUZULTEwMjNdIC0gVGhyaWZ0IGVuY29kaW5nICAoVVRGLTgpIGlzc3VlIHdpdGggUnVieSAxLjkuMgorICAgICogW1RIUklGVC0xMDkwXSAtIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgorICAgICogW1RIUklGVC0xMDgyXSAtIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHNvbWV0aW1lcyBjYWxscyBjbG9zZSgpIG9uIGFuIHVuZGVmaW5lZCB2YWx1ZQorICAgICogW1RIUklGVC05NTZdIC0gUHl0aG9uIG1vZHVsZSdzIHZlcnNpb24gbWV0YS1kYXRhIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTk3M10gLSBDb2NvYSBsaWJyYXJ5IHdvbid0IGNvbXBpbGUgdXNpbmcgY2xhbmcKKyAgICAqIFtUSFJJRlQtMTYzMl0gLSBydWJ5OiBkYXRhIGNvcnJ1cHRpb24gaW4gdGhyaWZ0X25hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTY2NV0gLSBUQmluYXJ5UHJvdG9jb2w6IGV4Y2VlZGVkIG1lc3NhZ2UgbGVuZ3RoIHJhaXNlcyBnZW5lcmljIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTY2NF0gLSBSZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIHZhcmlhYmxlIGluIGJ1aWxkIHNjcmlwdAorICAgICogW1RIUklGVC0xNjYzXSAtIEphdmEgVGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0xNjYyXSAtICJyZW1vdmVPYmplY3Q6IiBzaG91bGQgYmUgInJlbW92ZU9ic2VydmVyOiIgaW4gWy1UU29ja2V0U2VydmVyIGRlYWxsb2NdPworICAgICogW1RIUklGVC0xNjQzXSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZworICAgICogW1RIUklGVC0xNjc0XSAtIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAyLjA2MAorICAgICogW1RIUklGVC0xNjczXSAtIFJ1YnkgY29tcGlsZSBmbGFncyBmb3IgZXh0ZW5zaW9uIGZvciBtdWx0aSBhcmNoIGJ1aWxkcyAob3MgeCkKKyAgICAqIFtUSFJJRlQtMTY1NV0gLSBDb25maWd1cmUgc3RpbGwgdHJ5aW5nIHRvIHVzZSB0aHJpZnRfZ2VuZXJhdG9ycyBpbiBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMTY1NF0gLSBjX2dsaWIgdGhyaWZ0X3NvY2tldF9yZWFkKCkgcmV0dXJucyBjb3JydXB0ZWQgZGF0YQorICAgICogW1RIUklGVC0xNjUzXSAtIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGxlYWtzIENMT1NFX1dBSVQgc29ja2V0cworICAgICogW1RIUklGVC0xNjU4XSAtIEphdmEgdGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE2NTZdIC0gU2V0dGluZyBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gdGhhdCAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmciIG9uIGpzIGNsaWVudCBjYW4gd29yay4KKyAgICAqIFtUSFJJRlQtMTY1Ml0gLSBUU2FzbFRyYW5zcG9ydCBkb2VzIG5vdCBsb2cgdGhlIGVycm9yIHdoZW4ga2VyYmVyb3MgYXV0aCBmYWlscworICAgICogW1RIUklGVC0yMjcyXSAtIENMT05FIC0gRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIGluIFRCaW5hcnlQcm90b2NvbC5yZWFkU3RyaW5nCisgICAgKiBbVEhSSUZULTIwODZdIC0gSW52YWxpZCBnZW5lcmF0ZWQgY29kZSBmb3IgTm9kZS5KUyB3aGVuIHVzaW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTY4Nl0gLSB0X3BocF9nZW5lcmF0b3IuY2MgdXNlcyAiYW5kIiBpbnN0ZWFkIG9mICImJiIsIGFuZCBjYXVzZXMgY29tcGlsZXIgZXJyb3JzIHdpdGggVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0xNjkzXSAtIGxpYnRocmlmdCBoYXMgZGVwZW5kZW5jeSBvbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIGh0dHBjb3JlCisgICAgKiBbVEhSSUZULTE2ODldIC0gZG9uJ3QgZXhpdCgtMSkgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTE2NzldIC0gTm9kZUpTOiBwcm90b2NvbCByZWFkU3RyaW5nKCkgc2hvdWxkIHRyZWF0IHN0cmluZyBhcyB1dGY4LCBub3QgYmluYXJ5CisgICAgKiBbVEhSSUZULTE3MjFdIC0gRGlzdCBicm9rZW4gZHVlIHRvIDAuOC4wIHRvIDAuOS4wIGNoYW5nZXMKKyAgICAqIFtUSFJJRlQtMTcxMF0gLSBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTcwOV0gLSBXYXJuaW5nICJCaXR3aXNlLW9yIG9wZXJhdG9yIHVzZWQgb24gYSBzaWduLWV4dGVuZGVkIG9wZXJhbmQ7IGNvbnNpZGVyIGNhc3RpbmcgdG8gYSBzbWFsbGVyIHVuc2lnbmVkIHR5cGUgZmlyc3QiIGluIFRCaW5hcnlQcm90b2NvbC5jcyBhdCBSZWFkSW50NjQoKQorICAgICogW1RIUklGVC0xNzA3XSAtIFtydWJ5XSBBZGp1c3Qgc2VydmVyX3NwZWMucmIgZm9yIFJTcGVjIDIuMTEueCBhbmQgUnVieSAxLjkuMworICAgICogW1RIUklGVC0xNjcxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgY2FsbHMKKyAgICAqIFtUSFJJRlQtMTY3MF0gLSBJbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIFRocmlmdCBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMTY2OV0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE2NjhdIC0gQ29tcGlsZSBlcnJvciBpbiBjb250cmliL2ZiMzAzLCB0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTg0NV0gLSBGaXggY29tcGlsZXIgd2FybmluZyBjYXVzZWQgYnkgaW1wbGljaXQgc3RyaW5nIGNvbnZlcnNpb24gd2l0aCBYY29kZSA0LjYKKyAgICAqIFtUSFJJRlQtMzA0XSAtIEJ1aWxkaW5nIHRoZSBQeXRob24gbGlicmFyeSByZXF1aXJlcyBkZXZlbG9wbWVudCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTM2OV0gLSBzZXRzIGFuZCBtYXBzIGJyZWFrIGVxdWFsaXR5CisgICAgKiBbVEhSSUZULTU1Nl0gLSBSdWJ5IGNvbXBpbGVyIGRvZXMgbm90IGNvcnJlY3RseSByZWZlcnJlZCB0byB0b3AtbGV2ZWwgbW9kdWxlcyB3aGVuIGEgc3VibW9kdWxlIG1hc2tzIHRoZSB0b3AtbGV2ZWwgbmFtZQorICAgICogW1RIUklGVC00ODFdIC0gaW5kZW50YXRpb24gb2YgcnVieSBjbGFzc2VzIGlzIG9mZiBieSBhIGZldworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDk4XSAtIEFsbG93IFRUaHJlYWRlZFBvb2xTZXJ2ZXIuQXJncyB0byBwYXNzIGEgRXhlY3V0b3JTZXJ2aWNlCisgICAgKiBbVEhSSUZULTE0NDRdIC0gRnVuY3Rpb25SdW5uZXIgLSBhZGQgc3ludGFjdGljIHN1Z2FyIHRvIGNyZWF0ZSBzaGFyZWRfcHRycworICAgICogW1RIUklGVC0xNDQzXSAtIGRlZmluZSBhIFRQcm9jZXNzb3IgaGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwcm9jZXNzKCkKKyAgICAqIFtUSFJJRlQtMTQ0MV0gLSBHZW5lcmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgZm9yIGV4Y2VwdGlvbiBjbGFzcyB0byBsZXQgaXQgdXBkYXRlIG1lc3NhZ2UgcHJvcGVydHkgYXV0b21hdGljYWxseS4KKyAgICAqIFtUSFJJRlQtMTUyMF0gLSBFbWJlZCB2ZXJzaW9uIG51bWJlciBpbiBlcmxhbmcgLmFwcCBmaWxlCisgICAgKiBbVEhSSUZULTE0ODBdIC0gcHl0aG9uOiByZW1vdmUgdGFicywgYWRqdXN0IHdoaXRlc3BhY2UgYW5kIGFkZHJlc3MgUEVQOCB3YXJuaW5ncworICAgICogW1RIUklGVC0xNDg1XSAtIFBlcmZvcm1hbmNlOiBwYXNzIGxhcmdlIGFuZC9vciByZWZjb3VudGVkIGFyZ3VtZW50cyBhcyAiY29uc3QiCisgICAgKiBbVEhSSUZULTE0ODRdIC0gSW50cm9kdWNlIHBocHVuaXQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC0xNTMyXSAtIFRoZSB0eXBlIHNwZWNpZmljYXRpb25zIGluIHRoZSBnZW5lcmF0ZWQgRXJsYW5nIGNvZGUgc2hvdWxkIGluY2x1ZGUgInVuZGVmaW5lZCIgd2hlcmUgaXQncyB1c2VkIGFzIGEgZGVmYXVsdCB2YWx1ZQorICAgICogW1RIUklGVC0xNTM0XSAtIFJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgRGVscGhpIGNvZGUgZ2VuZXJhdG9yLgorICAgICogW1RIUklGVC0xNDY5XSAtIEphdmEgaXNzZXQgc3BhY2Ugb3B0aW1pemF0aW9uCisgICAgKiBbVEhSSUZULTE0NjVdIC0gVmlzaWJpbGl0eSBvZiBtZXRob2RzIGluIGdlbmVyYXRlZCBqYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ1M10gLSBEb24ndCBjaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHdoZW4gc2VyaWFsaXppbmcgd2l0aCB0aHJpZnQgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0xNDUyXSAtIGdlbmVyYXRlIGEgc3dhcCgpIG1ldGhvZCBmb3IgYWxsIGdlbmVyYXRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTE0NTFdIC0gRnJhbWVkVHJhbnNwb3J0OiBQcmV2ZW50IGluZmluaXRlIGxvb3Agd2hlbiB3cml0aW5nCisgICAgKiBbVEhSSUZULTE1MjFdIC0gVHdvIHBhdGNoZXMgZm9yIG1vcmUgUGVyZm9ybWFuY2UKKyAgICAqIFtUSFJJRlQtMTU1NV0gLSBEZWxwaGkgdmVyc2lvbiBvZiB0aGUgdHV0b3JpYWwgY29kZQorICAgICogW1RIUklGVC0xNTM1XSAtIFdoeSB0aHJpZnQgZG9uJ3QgdXNlIHdyYXBwZWQgY2xhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcyA/CisgICAgKiBbVEhSSUZULTEyMDRdIC0gUnVieSBhdXRvZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCByZXF1aXJlICd0aHJpZnQnIGdlbQorICAgICogW1RIUklGVC0xMzQ0XSAtIFVzaW5nIHRoZSBodHRwYyBtb2R1bGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhlIGRlcHJlY2F0ZWQgaHR0cCBsYXllcgorICAgICogW1RIUklGVC0xMzQzXSAtIG5vX2F1dG9faW1wb3J0IG1pbi8yIHRvIGF2b2lkIGNvbXBpbGUgd2FybmluZworICAgICogW1RIUklGVC0xMzQwXSAtIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0xNjExXSAtIEltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMTU5M10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIgdG8gdGhlIGhhbmRsZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTE2MTVdIC0gUEhQIE5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNTY3XSAtIFRocmlmdC9jcHA6IEFsbG93IGFsdGVybmF0ZSBjbGFzc2VzIHRvIGJlIHVzZWQgZm9yCisgICAgKiBbVEhSSUZULTEwNzJdIC0gTWlzc2luZyAtIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3IgaW4gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAorICAgICogW1RIUklGVC0xNjUwXSAtIFtydWJ5XSBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCBhcnRpZmFjdHMKKyAgICAqIFtUSFJJRlQtMTY2MV0gLSBbUEFUQ0hdIEFkZCAtLXdpdGgtcXQ0IGNvbmZpZ3VyZSBvcHRpb24KKyAgICAqIFtUSFJJRlQtMTY3NV0gLSBEbyB3ZSBoYXZlIGFueSBwbGFuIHRvIHN1cHBvcnQgc2NhbGE/CisgICAgKiBbVEhSSUZULTE2NDVdIC0gUmVwbGFjZSBPYmplY3QjdGVlIHdpdGggbW9yZSBjb252ZW50aW9uYWwgT2JqZWN0I3RhcCBpbiBzcGVjcworICAgICogW1RIUklGVC0xNjQ0XSAtIFVwZ3JhZGUgUlNwZWMgdG8gMi4xMC54IGFuZCByZWZhY3RvciBzcGVjcyBhcyBuZWVkZWQKKyAgICAqIFtUSFJJRlQtMTY3Ml0gLSBNb25vVG91Y2ggKGFuZCBNb25vIGZvciBBbmRyb2lkKSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTE3MDJdIC0gYSB0aHJpZnQgbWFudWFsCisgICAgKiBbVEhSSUZULTE2OTRdIC0gUmUtRW5hYmxlIHNlcmlhbGl6YXRpb24gZm9yIFdQNyBTaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0xNjkxXSAtIFNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIHN1cHBvcnQgZm9yIERlbHBoaQorICAgICogW1RIUklGVC0xNjg4XSAtIFVwZGF0ZSBJREwgcGFnZSBtYXJrdXAKKyAgICAqIFtUSFJJRlQtMTcyNV0gLSBUdXRvcmlhbCB3ZWIgcGFnZXMgZm9yIERlbHBoaSBhbmQgQyMKKyAgICAqIFtUSFJJRlQtMTcxNF0gLSBbcnVieV0gRXhwbGljaXRseSBhZGQgQ1dEIHRvIFJ1YnkgdGVzdF9zdWl0ZXMucmIKKyAgICAqIFtUSFJJRlQtMzE3XSAtIElzc3VlcyB3aXRoIEphdmEgc3RydWN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtMTY0XSAtIEJ1aWxkIHdlYiB0dXRvcmlhbCBvbiBJbmN1YmF0b3Igd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtNTQxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgcHV0IGtleXdvcmRzIGJlZm9yZSBhbGwgYXJndW1lbnRzLgorICAgICogW1RIUklGVC02ODFdIC0gVGhlIEhUTUwgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBKYXZhRG9jIHN0eWxlIGNvbW1lbnRzIHZlcnkgd2VsbAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xNTAwXSAtIEQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VwcG9ydAorICAgICogW1RIUklGVC0xNTEwXSAtIFRoZXJlIHNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnNvblByb3RvY29sIGZvciBydWJ5CisgICAgKiBbVEhSSUZULTExMTVdIC0gcHl0aG9uIFRCYXNlIGNsYXNzIGZvciBkeW5hbWljIChkZSlzZXJpYWxpemF0aW9uLCBhbmQgX19zbG90c19fIG9wdGlvbiBmb3IgbWVtb3J5IHNhdmluZ3MKKyAgICAqIFtUSFJJRlQtMTk1M10gLSBzdXBwb3J0IGZvciBhc3AubmV0IG12YyAzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTEyMzVdIC0gSG93IGNvdWxkIEkgdXNlIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSB3aXRoVE5vbkJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNjhdIC0gVE5vbmJsb2NraW5nU2VydmVyIHVzYWdlCisgICAgKiBbVEhSSUZULTEwNjFdIC0gUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgMC4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8KKyAgICAqIFtUSFJJRlQtNDkxXSAtIFJpcHBpbmcgcmF3IHB0aHJlYWRzIG91dCBvZiBURmlsZVRyYW5zcG9ydCBhbmQgYXNzb2NpYXRlZCB0ZXN0IGlzc3VlcworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk2XSAtIERlbHBoaTogVGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIHRoZXkgc3VjY2VlZGVkIG9yIG5vdAorICAgICogW1RIUklGVC05ODJdIC0gamF2YW1lOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE3MjJdIC0gQyMgV1A3IEFzc2VtYmx5IGFkZGl0aW9uIGJlYWtzIG1vbm8gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzM2XSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQyMKKworIyMgVGVzdAorICAgICogW1RIUklGVC0xNjEzXSAtIEFkZCBjb2RlIGJhY2sgaW50byBlbXB0eSBzb3VyY2UgZmlsZSBUb1N0cmluZ1Rlc3QuamF2YQorICAgICogW1RIUklGVC0xNzE4XSAtIEluY29ycmVjdCBjaGVjayBpbiBURmlsZVRyYW5zcG9ydFRlc3QKKworIyMgV2lzaAorICAgICogW1RIUklGVC0xNDYzXSAtIERlY291cGxlIFRocmlmdCBJREwgZnJvbSBnZW5lcmF0b3JzCisgICAgKiBbVEhSSUZULTE0NjZdIC0gUHJvcGVyIERvY3VtZW50YXRpb24gZm9yIFRocmlmdCBDIEdsaWIKKyAgICAqIFtUSFJJRlQtMTUzOV0gLSBCdWlsZCBhbmQgZGlzdHJpYnV0ZSB0aGUgZmIzMDMgcHl0aG9uIGxpYnJhcmllcyBhbG9uZyB3aXRoIHRocmlmdAorICAgICogW1RIUklGVC0xNjg1XSAtIFBsZWFzZSBhZGQgImFlcmVvLmNvbSIgdG8gIlBvd2VyZWQgYnkgQXBhY2hlIFRocmlmdCIgbGlzdCBpbiBhYm91dCBwYWdlCisgICAgKiBbVEhSSUZULTMzMF0gLSBUUHJvY2Vzc29yIC0gYWRkaXRpb25hbCBtZXRob2QgdG8gY2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBicm9rZW4KKworCisKK1RocmlmdCAwLjgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTQzNl0gLSBwaXAgaW5zdGFsbCB0aHJpZnQgZmFpbHMgb24gV2luZG93cyB3aXRoICJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IgorICAgICogW1RIUklGVC0xNDMyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZWlyIHN0cnVjdCBkZWZpbml0aW9uIHdpbGwgY2F1c2UgYW4gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTQyOF0gLSBzaGFyZWQudGhyZnQgZG9lcyBub3QgaW5jbHVkZSBuYW1lc3BhY2UgZm9yIHBocCwgc28gdGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlIGluY29ycmVjdCBuYW1lCisgICAgKiBbVEhSSUZULTE0MjZdIC0gRGlzdCBwYWNrYWdlIG1pc3NpbmcgZmlsZXMgZm9yIHJlbGVhc2UgMC44CisgICAgKiBbVEhSSUZULTE0MjVdIC0gVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQorICAgICogW1RIUklGVC0xNDE2XSAtIFB5dGhvbiBVbml0IHRlc3QgaXMgYnJva2VuIG9uIGNpCisgICAgKiBbVEhSSUZULTE0MTldIC0gQWJzdHJhY3ROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjYXRjaCBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTE0MjRdIC0gUnVieSBzcGVjcyBmYWlsIHdoZW4gcnVuIHdpdGggcmFrZQorICAgICogW1RIUklGVC0xNDIwXSAtIE5vbmJsb2NraW5nIGFuZCBIc0hhIHNlcnZlciBzaG91bGQgbWFrZSBzdXJlIHRvIGNsb3NlIGFsbCB0aGVpciBzb2NrZXQgY29ubmVjdGlvbnMgd2hlbiB0aGUgc2VsZWN0b3IgZXhpdHMKKyAgICAqIFtUSFJJRlQtMTQxM10gLSBHZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCByZWFkIE1hcEVuZCAvIExpc3RFbmQgLyBTZXRFbmQKKyAgICAqIFtUSFJJRlQtMTQwOV0gLSBOYW1lIGNvbmZsaWN0IGNoZWNrIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGV4Y2VwdGlvbiBvYmplY3QoRGVscGhpKS4KKyAgICAqIFtUSFJJRlQtMTQwOF0gLSBEZWxwaGkgVGVzdCBTZXJ2ZXI6IEV4Y2VwdGlvbiB0ZXN0IGNhc2UgZmFpbHMgZHVlIHRvIG5hbWluZyBjb25mbGljdCB3aXRoIGUubWVzc2FnZQorICAgICogW1RIUklGVC0xNDA3XSAtIFR5cG8gaW4gUHl0aG9uIHNvY2tldCBzZXJ2ZXIgY2F1c2VzIFRocmlmdCB0byBmYWlsIHdoZW4gd2UgZW5hYmxlIGEgZ2xvYmFsIHNvY2tldCB0aW1vdXQKKyAgICAqIFtUSFJJRlQtMTM5N10gLSBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTE0MDRdIC0gRGVscGhpIGNvbXBpbGVyIGdlbmVyYXRlcyBzdHJ1Y3QgcmVhZGVyIGNvZGUgd2l0aCBwcm9ibGVtLgorICAgICogW1RIUklGVC0xNDAwXSAtIFJ1YnkgbmF0aXZlIGV4dGVuc2lvbiBhYm9ydHMgd2l0aCBfX3N0YWNrX2Noa19mYWlsIGluIE9TWAorICAgICogW1RIUklGVC0xMzk5XSAtIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEzOTBdIC0gRGViaWFuIHBhY2thZ2VzIGJ1aWxkIGZpeCBmb3IgU3F1ZWV6ZSAoYnVpbGQgZnJvbSB0aGUgb2ZmaWNpYWwgIDAuNy4wIHRhcmJhbGwpCisgICAgKiBbVEhSSUZULTEzOTNdIC0gVFRyYW5zcG9ydEV4Y2VwdGlvbidzIHRocm93biBmcm9tIFRIdHRwQ2xpZW50IGNvbnRhaW4gc3VwZXJmbHVvdXMgc2xhc2hlcyBpbiB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTM5Ml0gLSBFbmFibGluZyBib3RoIG5hbWVzcGFjZXMgYW5kIGF1dG9sb2FkaW5nIGluIGdlbmVyYXRlZCBQSFAgY29kZSB3b24ndCB3b3JrLgorICAgICogW1RIUklGVC0xNDA2XSAtIEJ1aWxkIGVycm9yIGFmdGVyIGFwcGx5aW5nIFRIUklGVC0xMzk1CisgICAgKiBbVEhSSUZULTE0MDVdIC0gRGVscGhpIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlcyBjb250YWluZXIgc2VyaWFsaXplciBwcm9wZXJseS4KKyAgICAqIFtUSFJJRlQtMTQxMV0gLSBqYXZhIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIHR5cGUgcGFyYW1ldGVyIGZvciBUQmFzZVByb2Nlc3NvcgorICAgICogW1RIUklGVC0xNDczXSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTMzMV0gLSBSdWJ5IGxpYnJhcnkgZGVzZXJpYWxpemVzIGFuIGVtcHR5IG1hcCB0byBuaWwKKyAgICAqIFtUSFJJRlQtMTMzMF0gLSBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTEzMjhdIC0gVEJhc2VIZWxwZXIudG9TdHJpbmcoLi4uKSBhcHBlbmRzIEJ5dGVCdWZmZXIgZGF0YSBvdXRzaWRlIG9mIHZhbGlkIGJ1ZmZlciByYW5nZQorICAgICogW1RIUklGVC0xMzIyXSAtIE9DYW1sIGxpYiBmYWlsIHRvIGNvbXBpbGU6IFRocmlmdC5tbCBsaW5lIDMwNSwgaW50IHZzIGludDMyIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTExNDNdIC0gQnVpbGQgZG9lc24ndCBkZXRlY3QgY29ycmVjdCBhcmNoaXRlY3R1cmUgdHlwZSBvbiA2NGJpdCBvc3gKKyAgICAqIFtUSFJJRlQtMTIwNV0gLSBwb3J0IHNlcnZlciB1bmR1bHkgZnJhZ2lsZSB3aXRoIGFyYml0cmFyeSBpbnB1dAorICAgICogW1RIUklGVC0xMjc5XSAtIHR5cGUgc2V0IGlzIGhhbmRsZWQgaW5jb3JyZWN0bHkgd2hlbiB3cml0aW5nIG9iamVjdAorICAgICogW1RIUklGVC0xMjk4XSAtIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtMTI2NV0gLSBDKysgY29udGFpbmVyIGRlc2VyaWFsaXplCisgICAgKiBbVEhSSUZULTEyNjNdIC0gcHVibGlzaCBydWJ5IGNsaWVudCB0byBydWJ5Z2VtcworICAgICogW1RIUklGVC0xMzg0XSAtIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCisgICAgKiBbVEhSSUZULTEzODJdIC0gQnVuZGxlIGluc3RhbGwgZG9lc25vdCB3b3JrIGJlY2F1c2UgdGhyaWZ0IGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMTM4MV0gLSBUaHJpZnQgQysrIGxpYnMgaGF2ZSBpbmNvcnJlY3RseSB2ZXJzaW9uZWQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMTM1MF0gLSBHbyBsaWJyYXJ5IGNvZGUgZG9lcyBub3QgYnVpbGQgYXMgb2YgcjYwIChtb3N0IHJlY2VudCByZWxlYXNlKQorICAgICogW1RIUklGVC0xMzY1XSAtIFR1cGxlUHJvdG9jb2wjd3JpdGVCaXRTZXQgdW5pbnRlbnRpb25hbGx5IHdyaXRlcyBhIHZhcmlhYmxlIGxlbmd0aCBieXRlIGFycmF5CisgICAgKiBbVEhSSUZULTEzNTldIC0gLS1nZW4tY29iIGNwcDpjb2Jfc3R5bGUgZG9lcyBub3QgY29tcGlsZSBhbnltb3JlCisgICAgKiBbVEhSSUZULTEzMTldIC0gTWlzbWF0Y2ggYmV0d2VlbiBob3cgYSB1bmlvbiByZWFkcyBhbmQgd3JpdGVzIGEgY29udGFpbmVyCisgICAgKiBbVEhSSUZULTEzMDldIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjM4XSAtIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMKKyAgICAqIFtUSFJJRlQtMTI1NF0gLSBDb2RlIGNhbid0IGJlIGNvbXBpbGVkIGFnYWluc3QgYSByZWd1bGFyIEpSRTogT2JqZWN0LmNsb25lKCkgb3ZlcnJpZGUgaGFzIGEgZGlmZmVyZW50IHJldHVybiB0eXBlCisgICAgKiBbVEhSSUZULTEzNjddIC0gTWFjIE9TWCBidWlsZCBmYWlscyB3aXRoICJubyBzdWNoIGZpbGUgdG8gbG9hZCAtLSBzcGVjL3Jha2Uvc3BlY3Rhc2siCisgICAgKiBbVEhSSUZULTEzNTVdIC0gUnVubmluZyBtYWtlIGluIGxpYi9yYiBkb2Vzbid0IGJ1aWxkIHRoZSBuYXRpdmUgZXh0ZW5zaW9ucworICAgICogW1RIUklGVC0xMzcwXSAtIERlYmlhbiBwYWNrYWdpbmcgc2hvdWxkIEJ1aWxkLURlcGVuZCBvbiBsaWJnbGliMi4wLWRldgorICAgICogW1RIUklGVC0xMzQyXSAtIENvbXBpbGF0aW9uIHByb2JsZW0gb24gV2luZG93cyBvZiBmYXN0YmluYXJ5LmMKKyAgICAqIFtUSFJJRlQtMTM0MV0gLSBUUHJvdG9jb2wuaCBlbmRpYW4gZGV0ZWN0aW9uIHdyb25nIHdpdGggYm9vc3QKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTAyN10gLSAnbWFrZSAtaiAxNicgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTEyMV0gLSBKYXZhIHNlcnZlciBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIDAuNgorICAgICogW1RIUklGVC04NTddIC0gdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMzgwXSAtIFVzZSBzZXR1cHRvb2xzIGZvciBweXRob24gYnVpbGQKKworIyMgRGVwZW5kZW5jeSB1cGdyYWRlCisgICAgKiBbVEhSSUZULTEyNTddIC0gdGhyaWZ0J3MgZGVwZW5kZW5jeSBzY29wZSBvbiBqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpIHNob3VsZCBiZSAncHJvdmlkZWQnCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0NDVdIC0gbWlub3IgQysrIGdlbmVyYXRvciB2YXJpYWJsZSBjbGVhbnVwCisgICAgKiBbVEhSSUZULTE0MzVdIC0gbWFrZSBURXhjZXB0aW9uLk1lc3NhZ2UgcHJvcGVydHkgY29uZm9ybWFudCB0byB0aGUgdXN1YWwgZXhwZWN0YXRpb25zCisgICAgKiBbVEhSSUZULTE0MzFdIC0gUmVuYW1lICdzeXMnIG1vZHVsZSB0byAndXRpbCcKKyAgICAqIFtUSFJJRlQtMTM5Nl0gLSBEZXBoaSBnZW5lcmF0b3IgaGFzIGRlcGVuZGFjeSBvbiBib29zdCAxLjQyIGxhdGVyLgorICAgICogW1RIUklGVC0xMzk1XSAtIFBhdGNoIHRvIHByZXZlbnQgd2FybmluZ3MgZm9yIGludGVnZXIgdHlwZXMgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC0xMjc1XSAtICB0aHJpZnQ6IGFsd2F5cyBwcmVmaXggbmFtZXNwYWNlcyB3aXRoICIgOjoiCisgICAgKiBbVEhSSUZULTEyNzRdIC0gIHRocmlmdDogZmFpbCBjb21waWxhdGlvbiBpZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzCisgICAgKiBbVEhSSUZULTEyNzFdIC0gIHRocmlmdDogZml4IG1pc3NpbmcgbmFtZXNwYWNlIGluIGdlbmVyYXRlZCBsb2NhbAorICAgICogW1RIUklGVC0xMjcwXSAtICB0aHJpZnQ6IGFkZCAtLWFsbG93LW5lZy1rZXlzIGFyZ3VtZW50IHRvIGFsbG93CisgICAgKiBbVEhSSUZULTEzNDVdIC0gQWxsb3cgYnVpbGRpbmcgd2l0aG91dCB0ZXN0cworICAgICogW1RIUklGVC0xMjg2XSAtIE1vZGVybml6ZSB0aGUgVGhyaWZ0IFJ1YnkgTGlicmFyeSBEZXYgRW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMTI4NF0gLSAgdGhyaWZ0OiBmaXggcHJvY2Vzc29yIGluaGVyaXRhbmNlCisgICAgKiBbVEhSSUZULTEyODNdIC0gIHRocmlmdDogd3JhcCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oKSB0byA4MAorICAgICogW1RIUklGVC0xMjgyXSAtIFVwZ3JhZGUgaHR0cGNsaWVudCB0byA0LjEuMiAoZnJvbSA0LjAuMSkKKyAgICAqIFtUSFJJRlQtMTI4MV0gLSAgYWRkIEBnZW5lcmF0ZWQgdG8gdGhlIGRvY2Jsb2NrCisgICAgKiBbVEhSSUZULTEyODBdIC0gIFRocmlmdDogSW1wcm92ZSBNb25pdG9yIGV4Y2VwdGlvbi1mcmVlIGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMTI3OF0gLSBqYXZhZG9jIHdhcm5pbmdzIC0gY29tcGlsYXRpb24KKyAgICAqIFtUSFJJRlQtMTIyN10gLSBFcmxhbmcgaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTI5NV0gLSBEdXBsaWNhdGUgaW5jbHVkZSBpbiBUU29ja2V0LmNwcAorICAgICogW1RIUklGVC0xMjk0XSAtICB0aHJpZnQ6IGZpeCBsb2cgbWVzc2FnZSB0eXBvcyBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTEyOTNdIC0gIHRocmlmdDogaW1wcm92ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zIHRocm93biBieQorICAgICogW1RIUklGVC0xMjkyXSAtICB0aHJpZnQ6IHNpbGVuY2UgbG9nIHNwZXcgZnJvbSBUVGhyZWFkZWRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTI4OF0gLSAgQWxsb3cgdHlwZWRlZmVkIGV4Y2VwdGlvbnMgaW4gdGhyb3dzIGNsYXVzZXMKKyAgICAqIFtUSFJJRlQtMTI5MF0gLSAgdGhyaWZ0OiBUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsZWFuIHVwIHN0YXRlIGluIHRoZQorICAgICogW1RIUklGVC0xMjg3XSAtICB0aHJpZnQ6IHN0YXJ0IHJlZmFjdG9yaW5nIHNvbWUgb2YgdGhlIEMrKyBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMTI4OV0gLSAgdGhyaWZ0OiBpbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkKKyAgICAqIFtUSFJJRlQtMTMwNV0gLSAgdGhyaWZ0OiBtYWtlIFRDb25uZWN0aW9uIGEgcHJpdmF0ZSBpbm5lciBjbGFzcyBvZgorICAgICogW1RIUklGVC0xMzA0XSAtICBUTm9uYmxvY2tpbmdTZXJ2ZXI6IHBhc3MgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCB0bworICAgICogW1RIUklGVC0xMzAyXSAtICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCisgICAgKiBbVEhSSUZULTEzMDFdIC0gIHRocmlmdDogY29uc29saWRhdGUgY29tbW9uIGNvZGUgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNzddIC0gYWJvcnQgUEhQIGRlc2VyaWFsaXphdGlvbiBvbiB1bmtub3duIGZpZWxkIHR5cGUKKyAgICAqIFtUSFJJRlQtMTM3OV0gLSBmaXggdW5pbml0aWFsaXplZCBlbnVtIHZhbHVlcyBpbiB0aHJpZnQgQysrIG9iamVjdHMKKyAgICAqIFtUSFJJRlQtMTM3Nl0gLSBNYWtlIHBvcnQgc3BlY2lmaWNhdGlvbiBvcHRpb24gaW4gdGhyaWZ0IHJlbW90ZQorICAgICogW1RIUklGVC0xMzc1XSAtIGZpeGVkIGEgaGV4IGNoYXIgY29udmVyc2lvbiBidWcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0xMzczXSAtIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCisgICAgKiBbVEhSSUZULTEzNjFdIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgb2YgcHRocmVhZCBieSBib29zdDo6dGhyZWFkCisgICAgKiBbVEhSSUZULTEzMjBdIC0gQ29uc2lzdGVuY3kgb2YgY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaAorICAgICogW1RIUklGVC0xMzE3XSAtICBSZW1vdmUgY29weSBjb25zdHJ1Y3RpYmlsaXR5IGZyb20KKyAgICAqIFtUSFJJRlQtMTMxNl0gLSAgdGhyaWZ0OiB1cGRhdGUgc2VydmVyIGNsYXNzZXMgdG8gYWNjZXB0CisgICAgKiBbVEhSSUZULTEzMTVdIC0gIHRocmlmdDogZ2VuZXJhdGUgc2VydmVyIGludGVyZmFjZSBmYWN0b3J5IGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTMxNF0gLSAgdGhyaWZ0OiBhZGQgVFByb2Nlc3NvckZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTMzNV0gLSAgQWRkIGFjY2VwdCB0aW1lb3V0IHRvIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMTMzNF0gLSAgQWRkIG1vcmUgaW5mbyB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTMzM10gLSAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQorICAgICogW1RIUklGVC0xMzMyXSAtIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIGNsYXNzIHVzZXMgaGFyZCBjb2RlZCB2YWx1ZSBrZXlNYW5hZ2VyVHlwZTogU3VuWDUwOQorICAgICogW1RIUklGVC0xMjUxXSAtIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAorICAgICogW1RIUklGVC0xMzg3XSAtIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCisgICAgKiBbVEhSSUZULTEzMzldIC0gRXh0ZW5kIFR1cGxlIFByb3RvY29sIHRvIFRVbmlvbnMKKyAgICAqIFtUSFJJRlQtMTAzMV0gLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKKyAgICAqIFtUSFJJRlQtMTEzMF0gLSBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBzeW1ib2xpYyBkZWZhdWx0IHZhbHVlIGZvciBvcHRpb25hbCBib29sZWFuCisgICAgKiBbVEhSSUZULTExMjNdIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCisgICAgKiBbVEhSSUZULTM4Nl0gLSBNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBQeXRob24gbGlicmFyeSB3aXRob3V0IHRoZSBleHRlbnNpb24KKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTQwMV0gLSBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCisgICAgKiBbVEhSSUZULTExNjddIC0gSmF2YSBub25ibG9ja2luZyBzZXJ2ZXIgd2l0aCBtb3JlIHRoYW4gb25lIHRocmVhZCBmb3Igc2VsZWN0IGFuZCBoYW5kbGluZyBJTworICAgICogW1RIUklGVC0xMzY2XSAtIERlbHBoaSBnZW5lcmF0b3IsIGxpcmJyYXJ5IGFuZCB1bml0IHRlc3QuCisgICAgKiBbVEhSSUZULTEzNTRdIC0gQWRkIHJha2UgdGFzayB0byBidWlsZCBqdXN0IHRoZSBnZW0gZmlsZQorICAgICogW1RIUklGVC03NjldIC0gUGx1Z2dhYmxlIFNlcmlhbGl6ZXJzCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE0MTVdIC0gZGVscGhpOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEzOTFdIC0gSW1wcm92ZWQgRGVscGhpIFhFIHRlc3QgY2FzZXMKKworCisKK1RocmlmdCAwLjcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTE0MF0gLSBGcmFtZWQgVHJhbnNwb3J0IENsaWVudCB1c2luZyBDIChHbGliKSBMaWJyYXJ5IGhhbmdzIHdoZW4gY29ubmVjdGluZyB0byBSdWJ5IFNlcnZlcgorICAgICogW1RIUklGVC0xMTU0XSAtIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIKKyAgICAqIFtUSFJJRlQtMTE1M10gLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCisgICAgKiBbVEhSSUZULTExNDldIC0gTm9uYmxvY2tpbmcgc2VydmVyIGZhaWxzIHdoZW4gY2xpZW50IGNvbm5lY3Rpb24gaXMgcmVzZXQKKyAgICAqIFtUSFJJRlQtMTE0Nl0gLSBBbmRyb2lkIEluY29tcGF0aWJpbGl0eSA6IGluIEFuZHJvaWQgPCAyLjMgamF2YS5pby5JT0V4Y2VwdGlvbiBkb2Vzbid0IHN1cHBvcnQgZm9yIFRocm93YWJsZSBwYXJhbWV0ZXIgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTEzM10gLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAorICAgICogW1RIUklGVC0xMTMyXSAtIERlc2VyaWFsaXphdGlvbiBlcnJvciBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24gQyMKKyAgICAqIFtUSFJJRlQtMTEzMV0gLSBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZworICAgICogW1RIUklGVC0xMjA4XSAtIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgZm9yIENPTlRBSU5FUl9XUklURSwgQ09OVEFJTkVSX1JFQUQKKyAgICAqIFtUSFJJRlQtMTIwMF0gLSBKUyBjb21waWxlciBnZW5lcmF0ZXMgY29kZSB0aGF0IGNsb2JiZXJzIGV4aXN0aW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTE4M10gLSBQdXJlLXJ1YnkgQ29tcGFjdFByb3RvY29sIHJhaXNlcyBBcmd1bWVudEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyB1bmRlciBSdWJ5IDEuOQorICAgICogW1RIUklGVC0xMTgyXSAtIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQorICAgICogW1RIUklGVC0xMTgxXSAtIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTIzNF0gLSB0aHJpZnQgLS1oZWxwIGlzIG1pc3NpbmcgZG9jIG9uIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTExODBdIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IHR5cGVzLgorICAgICogW1RIUklGVC0xMTk0XSAtIEphdmEgbGliIGRvZXMgbm90IGluc3RhbGwgYXJ0aWZhY3RzIHRvIGxvY2FsIGRpciBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTE5M10gLSBQb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBpbiBub25ibG9ja2luZ19zZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTE5Ml0gLSBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8KKyAgICAqIFtUSFJJRlQtMTE5MF0gLSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgaW4gVE5vbmJsb2NraW5nU2VydmVyLmphdmEgc2hvdWxkIGJlIEF0b21pY0xvbmcgdG8gZml4IEZEIGxlYWthZ2UgYW5kIGdlbmVyYWwgc2VydmVyIG1hbGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTExODddIC0gbm9uYmxvY2tpbmdfc2VydmVyIHNodXRkb3duIHJhY2UgdW5kZXIgUnVieSAxLjkKKyAgICAqIFtUSFJJRlQtMTE3OF0gLSBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+CisgICAgKiBbVEhSSUZULTExNjRdIC0gU2VnbWVudGF0aW9uIGZhdWx0IG9uIE5VTEwgcG9pbnRlciBpbiB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QKKyAgICAqIFtUSFJJRlQtMTE3MV0gLSBQZXJsIHdyaXRlL3JlYWREb3VibGUgYXNzdW1lcyBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTEyMjJdIC0gVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0CisgICAgKiBbVEhSSUZULTEyMjBdIC0gVFByb2Nlc3Nvcjo6cHJvY2VzcyBuZXZlciByZXR1cm5zIGZhbHNlCisgICAgKiBbVEhSSUZULTEyODVdIC0gU3RhYmxlIDAuNy4wIFdpbmRvd3MgY29tcGlsZXIgZXhlIGF2YWlsYWJsZSBvbiB0aGUgd2Vic2lkZSBpcyBub3QgdGhlIGdvb2Qgb25lCisgICAgKiBbVEhSSUZULTEyMThdIC0gY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCisgICAgKiBbVEhSSUZULTEyMTVdIC0gVW5kZWZpbmVkIHByb3BlcnR5IFRoaXJmdCBpbiBsaWIvanMvdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTEyMTFdIC0gV2hlbiB1c2luZyBUSHR0cENsaWVudCwgbm9uIDIwMCByZXNwb25zZXMgbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3BlbgorICAgICogW1RIUklGVC0xMjI4XSAtIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEzMDhdIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjU1XSAtIE1pc21hdGNoIG9mIG1ldGhvZCBuYW1lIGJldHdlZW4gSmF2YU1FJ3MgbGliIGFuZCBnZW5lcmF0ZWQgY29kZSAoY29tcGFyZVRvL2NvbXBhcmVPYmplY3RzKQorICAgICogW1RIUklGVC0xMjUzXSAtIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcKKyAgICAqIFtUSFJJRlQtMTI1Ml0gLSBTZWdmYXVsdCBpbiBSdWJ5IGRlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xMDk0XSAtIGJ1ZyBpbiBUQ29tcGFjdFByb3RvIHB5dGhvbiByZWFkTWVzc2FnZUVuZCBtZXRob2QgYW5kIHVwZGF0ZWQgdGVzdCBjYXNlcworICAgICogW1RIUklGVC0xMDkzXSAtIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0xMDkyXSAtIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTAxMV0gLSBFcnJvciBnZW5lcmF0aW5nIHBhY2thZ2UgaW1wb3J0cyB3aGVuIHVzaW5nIGNsYXNzZXMgZnJvbSBvdGhlciBwYWNrYWdlcworICAgICogW1RIUklGVC0xMDUwXSAtIERlY2xhcmluZyBhbiBhcmd1bWVudCBuYW1lZCAibWFuYWdlciIgdG8gYSBzZXJ2aWNlIG1ldGhvZCBwcm9kdWNlcyBjb2RlIHRoYXQgZmFpbHMgY29tcGlsZSBkdWUgdG8gbmFtZSBjb25mbGljdHMgd2l0aCBwcm90ZWN0ZWQgaXZhcnMgaW4gVEFzeW5jQ2xpZW50CisgICAgKiBbVEhSSUZULTEwNzRdIC0gLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24KKyAgICAqIFtUSFJJRlQtMTA2N10gLSBUb25zIG9mIGJ1Z3MgaW4gcGhwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEwNjVdIC0gVW5leHBlY3RlZCBleGNlcHRpb25zIG5vdCBwcm9wZXIgaGFuZGxlZCBvbiBKUworICAgICogW1RIUklGVC0xMDc2XSAtIEVybGFuZyBUaHJpZnQgc29ja2V0IHNlcnZlciBoYXMgYSBidWcgdGhhdCBjYXVzZXMgamF2YSB0aHJpZnQgY2xpZW50IG9mIGZyYW1lZCBiaW5hcnkgY2xpZW50IHRvIHRocm93ICJvdXQgb2Ygc2VxdWVuY2UiIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xMDU3XSAtIGNhc3RzIGluIFRCaW5hcnlQcm90b2NvbC50Y2MgY2F1c2luZyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIiB3YXJuaW5ncyBmcm9tIGdjYworICAgICogW1RIUklGVC0xMDU1XSAtIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8KKyAgICAqIFtUSFJJRlQtMTA1NF0gLSBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaXMgbWlzc2luZyBhbmQgZmlyc3QgdXNlIG9mIFBLR19DSEVDS19NT0RVTEVTIG1heSBub3QgaGFwcGVuLCBjYXVzZXMgbW9ubyBkZXRlY3Rpb24gdG8gZmFpbAorICAgICogW1RIUklGVC0xMTE3XSAtIEphdmFTY3JpcHQgVW5pdCBUZXN0IGRvZXMgbm90IHdvcmsgYW55bW9yZSBiZWNhdXNlIGxpYnRocmlmdCouamFyIHdoZXJlIG1vdmVkIGJ5IE1hdmVuIERlcGxveW1lbnQKKyAgICAqIFtUSFJJRlQtMTExMV0gLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcworICAgICogW1RIUklGVC0xMDMyXSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQorICAgICogW1RIUklGVC0xMDM2XSAtIEF1dG8tZ2VuZXJhdGVkIEMrKyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aCAiLVdlcnJvciAtV2V4dHJhIC1XYWxsIiBnKysgY29tcGlsZXIgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMTA0MV0gLSBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZworICAgICogW1RIUklGVC0xMTA2XSAtIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgYnV0IG5vIHZpcnR1YWwgZGVzdHJ1Y3Rvci4gQ2F1c2VzIHdhcm5pbmdzIG9uIC1XYWxsCisgICAgKiBbVEhSSUZULTExMDVdIC0gT0NhbWwgZ2VuZXJhdG9yIGRvZXMgbm90IHByZWZpeCBtZXRob2RzIG9mIGluY2x1ZGVkIHN0cnVjdHMgd2l0aCB0aGVpciB0eXBlCisgICAgKiBbVEhSSUZULTExMDRdIC0gSU5TVEFMTERJUlMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGNvbmZpZ3VyZSBzY3JpcHQKKyAgICAqIFtUSFJJRlQtMTEwMl0gLSB0eXBvIGluIGNvbmZpZ3VyZS5hYzogIj09IiBvcGVyYXRvciBpbiAndGVzdCcgKGluc3RlYWQgb2YiJz0iKQorICAgICogW1RIUklGVC0xMTAxXSAtIGJ5dGVidWZmZXIgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIFRCaW5hcnlQcm90b2NvbCB3cml0ZUJpbmFyeQorICAgICogW1RIUklGVC0xMDk4XSAtIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA4MV0gLSBQSFAgdGVzdHMgYnJva2VuIGFuZCBzb21ld2hhdCBpbmNvbXBsZXRlCisgICAgKiBbVEhSSUZULTEwODBdIC0gZXJsYW5nIHRlc3QncyAnbWFrZScgZmFpbHMgb24gTWFjIE9TWAorICAgICogW1RIUklGVC0xMDc4XSAtIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTExMjBdIC0gcHJvdG8uV3JpdGVMaXN0RW5kIGJlaW5nIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtMTExOV0gLSBUSlNPTlByb3RvY29sIGZhaWxzIHRvIFVURjggZGVjb2RlIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtODY3XSAtIFBIUCBhY2NlbGVyYXRvciBtb2R1bGUncyBvdXRwdXQgdHJhbnNwb3J0IGlzIGluY29tcGF0aWJsZSB3aXRoIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtODI2XSAtIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQKKyAgICAqIFtUSFJJRlQtODM1XSAtIEJhZCBBUzMgc3ludGF4IGluIGNvbnN0cnVjdG9ycyB0aGF0IHNldCBkZWZhdWx0IHZhbHVlcworICAgICogW1RIUklGVC03ODhdIC0gdGhyaWZ0X3Byb3RvY29sLnNvOiBtdWx0aWdldC9tdWx0aWdldF9zbGljZSBkb2VzIG5vdCBoYW5kbGUgbW9yZSB0aGFuIDE3IGtleXMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEyNV0gLSBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAorICAgICogW1RIUklGVC0zNDJdIC0gUEhQOiBjYW4ndCBoYXZlIHNldHMgb2YgY29tcGxleCB0eXBlcworICAgICogW1RIUklGVC03MzFdIC0gY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgZm9yIGFudCA+PSAxLjcKKyAgICAqIFtUSFJJRlQtNjkwXSAtIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMKKyAgICAqIFtUSFJJRlQtNjM4XSAtIEJ1ZmZlcmVkVHJhbnNwb3J0ICsgQyBleHRlbnNpb25zIGJsb2NrIHVudGlsIHJlY3YgdGltZW91dCBpcyByZWFjaGVkIG9uIGxhc3QgZnJlYWQgY2FsbAorCisjIyBEZXBlbmRlbmN5IHVwZ3JhZGUKKyAgICAqIFtUSFJJRlQtMTE3N10gLSBVcGRhdGUgdGhyaWZ0IHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBHbydzIG5ldHdvcmtpbmcgbGlicmFyaWVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTExNTVdIC0gUmVtb3ZlIGxvZzRqIGRlcGVuZGVuY3kgZnJvbSBqYXZhIGNsaWVudAorICAgICogW1RIUklGVC0xMTUxXSAtIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTEyMDddIC0gU3VwcG9ydCBERVNURElSIG9uICJtYWtlIGluc3RhbGwiIG9mIHJ1YnkgbGlicworICAgICogW1RIUklGVC0xMTk5XSAtIFVuaW9uIHN0cnVjdHMgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIG1ldGhvZHMgdG8gdGVzdCB3aGV0aGVyIGEgc3BlY2lmaWMgZmllbGQgaXMgY3VycmVudGx5IHNldAorICAgICogW1RIUklGVC0xMjMzXSAtIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUKKyAgICAqIFtUSFJJRlQtMTE4OV0gLSBSdWJ5IGRlc2VyaWFsaXplciBzcGVlZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTE3MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgYW5kIEphdmEgNQorICAgICogW1RIUklGVC0xMTc0XSAtIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCisgICAgKiBbVEhSSUZULTEyMjVdIC0gVENvbXBhY3RQcm90b2NvbCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTEyMjFdIC0gUmVtb3ZlIFNpbXBsZUNhbGxiYWNrLmgKKyAgICAqIFtUSFJJRlQtMTIxN10gLSBVc2UgZXZ1dGlsX3NvY2tldHBhaXIgaW5zdGVhZCBvZiBwaXBlIChXaW5kb3dzIHBvcnQpCisgICAgKiBbVEhSSUZULTEyMTZdIC0gYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5CisgICAgKiBbVEhSSUZULTEyMzFdIC0gUmVtb3ZlIGJvZ3VzIGluY2x1ZGUKKyAgICAqIFtUSFJJRlQtMTIxM10gLSBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC0xMjM3XSAtIEphdmEgZmIzMDMgbWlzc2luZyBzb21lIG1ldGhvZHMKKyAgICAqIFtUSFJJRlQtMTA2M10gLSBGaXggRXJsYW5nIFR1dG9yaWFsIEZpbGVzCisgICAgKiBbVEhSSUZULTEwNTNdIC0gTWFrZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhdmFpbGFibGUgZm9yIGFsbCBzb2NrZXQgcmVsYXRlZCB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTExMDldIC0gRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8KKyAgICAqIFtUSFJJRlQtMTEwN10gLSBpbXByb3ZlbWVudCBmb3IgY29tcGlsZXItZ2VuZXJhdGVkIHB5dGhvbiBmb3IgJ05vbmUnIG9iamVjdCBjb21wYXJpc29ucworICAgICogW1RIUklGVC0xMDY5XSAtIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCisgICAgKiBbVEhSSUZULTEwNDldIC0gQWxsb3cgZm9yIFRTZXJ2ZXJTb2NrZXQgcHl0aG9uIGxpYnJhcnkgdG8gYmluZCB0byBhIHNwZWNpZmljIGhvc3QKKyAgICAqIFtUSFJJRlQtMTEyNl0gLSBFeHRlbmRpbmcgc3RydWN0X2luZm8gZm9yIGVybGFuZyBiaW5kaW5ncworICAgICogW1RIUklGVC0xMTAwXSAtIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtOTk0XSAtIERvbid0IHRyeSB0byBpbnZva2UgcGhwaXplIGlmIHdlIGRvbid0IGhhdmUgaXQKKyAgICAqIFtUSFJJRlQtOTkzXSAtIFNvbWUgaW1wcm92ZW1lbnRzIGluIEMrKyBzdHVicyBmb3Igb25ld2F5IG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtOTk3XSAtIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQorICAgICogW1RIUklGVC00MThdIC0gRG9uJ3QgZG8gcnVudGltZSBzb3J0aW5nIG9mIHN0cnVjdCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTUxXSAtIFRTU0xTZXJ2ZXJTb2NrZXQgYW5kIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjddIC0gR2VuZXJhdGVkIGVybGFuZyB0eXBlcyBkb24ndCBjb250YWluIGRlZmF1bHQgdmFsdWVzIGZvciByZWNvcmRzCisgICAgKiBbVEhSSUZULTExM10gLSB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAorICAgICogW1RIUklGVC0zNjNdIC0gTWF2ZW4gRGVwbG95CisgICAgKiBbVEhSSUZULTQ0N10gLSBNYWtlIGFuIGFic3RyYWN0IGJhc2UgQ2xpZW50IGNsYXNzIHNvIHdlIGNhbiBnZW5lcmF0ZSBsZXNzIGNvZGUKKyAgICAqIFtUSFJJRlQtNjI3XSAtIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEyMzZdIC0gRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50CisgICAgKiBbVEhSSUZULTEwMjFdIC0gRnJhbWVkIHRyYW5zcG9ydCBzdXBwb3J0IGZvciBPQ2FtbAorICAgICogW1RIUklGVC0xMDY4XSAtIFB5dGhvbiBTU0wgU29ja2V0IFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTEwM10gLSBUWmxpYlRyYW5zcG9ydCBmb3IgcHl0aG9uLCBhIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTA4M10gLSBQcmVmb3JraW5nIHB5dGhvbiBwcm9jZXNzIHBvb2wgc2VydmVyCisgICAgKiBbVEhSSUZULTk5OV0gLSBBZGQgVEZvcmtpbmdTZXJ2ZXIKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE1Ml0gLSBBdHRyaWJ1dGVzIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg5Ml0gLSBSZWZhY3RvciBlcmxhbmcgYnVpbGQgc3lzdGVtIHdpdGggcmViYXIKKworIyMgV2lzaAorICAgICogW1RIUklGVC02MjVdIC0gQWRkIHN1cHBvcnQgZm9yICdHbycKKworCisKK1RocmlmdCAwLjYuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xMTMzXSAtIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50CisgICAgKiBbVEhSSUZULTExMzFdIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKKyAgICAqIFtUSFJJRlQtMTA3NF0gLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMTA5XSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCisgICAgKiBbVEhSSUZULTM2M10gLSBNYXZlbiBEZXBsb3kKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTIwNl0gLSBkaWQgdGhlIFRIUklGVCAwLjYuMSBtZXJnZSBUSFJJRlQtNTYzID8KKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE2M10gLSBIb3cgY2FuIGkgdXNlIG11bHRpIHNlcnZpY2UgaW4gb25lIHByb2dyYW0/CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMTExMl0gLSBBcHBseSBUSFJJRlQtMzYzIHRvIDAuNiBicmFuY2gKKyAgICAqIFtUSFJJRlQtMTExM10gLSBBcHBseSBUSFJJRlQtMTA3NCB0byAwLjYgYnJhbmNoCisKKworCitUaHJpZnQgMC42CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTEwMjBdIC0gT0NhbWwgY29tcGlsZXIgZ2VuZXJhdGVzIGludmFsaWQgT0NhbWwKKyAgICAqIFtUSFJJRlQtMTAxNV0gLSBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcKKyAgICAqIFtUSFJJRlQtMTAxM10gLSBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEwMDldIC0gVFVuaW9uIGRvZXMgbm90IGNvcnJlY3RseSBkZWVwIGNvcHkgYSBCeXRlQnVmZmVyCisgICAgKiBbVEhSSUZULTEwMzJdIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCisgICAgKiBbVEhSSUZULTg2OF0gLSBSZWZlcmVuY2luZyBjb25zdGFudCB2YWx1ZXMgZG9lc24ndCB3b3JrIHdpdGggd2l0aCB0eXBlZGVmIHR5cGVzCisgICAgKiBbVEhSSUZULTk3MV0gLSBqYXZhIG1vZHVsZSBjYW4ndCBiZSBjb21waWxlZCB3aXRob3V0IGl2eSBhbmQgbmV0d29yayBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTk3MF0gLSBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIgorICAgICogW1RIUklGVC05NjldIC0gSmF2YSBUdXRvcmlhbCBicm9rZW4sIG1vdmUgQ2FsY3VsYXRvckhhbmRsZXIgdG8gYSBzZXBhcmF0ZSBmaWxlCisgICAgKiBbVEhSSUZULTgwN10gLSBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwKKyAgICAqIFtUSFJJRlQtOTU1XSAtIFRocmlmdCBjb21waWxlciBmb3IgV2luZG93cyB1c2VzIGxvd2VyY2FzZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggY29tcGlsaW5nIG9uIG90aGVyIHBsYXRmb3JtcworICAgICogW1RIUklGVC05OTJdIC0gTmFtaW5nIGNvbnZlbnRpb24gaW4gQyMgY29uc3RydWN0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmaWVsZHMgY2F1c2VzIGNvbXBpbGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTEwMDhdIC0gYnl0ZVtdIGFjY2Vzc29ycyB0aHJvdyBOUEUgb24gdW5zZXQgZmllbGQKKyAgICAqIFtUSFJJRlQtMTAwNl0gLSBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtOTUwXSAtIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuCisgICAgKiBbVEhSSUZULTk3NV0gLSBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QKKyAgICAqIFtUSFJJRlQtOTQ0XSAtIFN1cHBvcnQgYWxsIHZlcnNpb24tNHMgb2YgYmFzZQorICAgICogW1RIUklGVC05MzldIC0gb3B0aW9uYWwgYmluYXJ5IGZpZWxkcyB0aHJvdyBOUEUgb24gZGVmYXVsdCBieXRlW10gZ2V0dGVycworICAgICogW1RIUklGVC05MzVdIC0gUEhQIEV4dGVuc2lvbiBhYm9ydHMgdGhlIGJ1aWxkIGlmIHBocC1jb25maWcgaXMgbm90IGluc3RhbGxlZAorICAgICogW1RIUklGVC05MzNdIC0gSGFza2VsbCdzIFRocmlmdC5jYWJhbCBoYXMgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtOTMyXSAtIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28KKyAgICAqIFtUSFJJRlQtOTA0XSAtIEMjIFRTb2NrZXQgc2hvdWxkIGRpc2FibGUgbmFnbGUgYW5kIGxpbmdlcgorICAgICogW1RIUklGVC05NDFdIC0gTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTk0MF0gLSAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocworICAgICogW1RIUklGVC05MjRdIC0gRml4IGdlbmVyYXRlZCBwaHAgc3RydWN0dXJlIGNvbnN0YW50cworICAgICogW1RIUklGVC05NzldIC0gcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkKKyAgICAqIFtUSFJJRlQtOTc3XSAtIEhleCBDb252ZXJzaW9uIEJ1ZyBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNDddIC0gUEhQIFRTb2NrZXQgVGltZW91dCBJc3N1ZXMKKyAgICAqIFtUSFJJRlQtNTE3XSAtIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwMjRdIC0gQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsCisgICAgKiBbVEhSSUZULTk1OF0gLSBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4KKyAgICAqIFtUSFJJRlQtOTU3XSAtIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLgorICAgICogW1RIUklGVC0xMDAyXSAtIENvZGVTdHlsZTogdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCisgICAgKiBbVEhSSUZULTEwMDVdIC0gR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMKKyAgICAqIFtUSFJJRlQtOTUxXSAtIEFkZCBhIG5ldyBpc1NlcnZpbmcoKSBtZXRob2QgdG8gVFNlcnZlcgorICAgICogW1RIUklGVC05NDNdIC0gU2lsbHkgcmVhZG1lIHR5cG8gZml4LgorICAgICogW1RIUklGVC05NjFdIC0gSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIKKyAgICAqIFtUSFJJRlQtOTYwXSAtIGFkZCBUZXN0U2VydmVyLCBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYWdhaW4KKyAgICAqIFtUSFJJRlQtOTQ5XSAtIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZQorICAgICogW1RIUklGVC05NDZdIC0gQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4KKyAgICAqIFtUSFJJRlQtOTAzXSAtIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyCisgICAgKiBbVEhSSUZULTkxM10gLSBUZXN0IENhc2UgZm9yIFVybCBlbmNvZGVkIHN0cmluZ3MgKyBzaW1wbGUgZW5oYW5jZW1lbnQgdG8gbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaAorICAgICogW1RIUklGVC05MjZdIC0gTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTkyOV0gLSBJbXByb3ZlbWVudHMgdG8gdGhlIEMrKyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTg5M10gLSBhZGQgSmF2YVNjcmlwdCB0byB0aGUgdHV0b3JpYWwgZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMTAwM10gLSBQb2xpc2hpbmcgY19nbGliIGNvZGUKKyAgICAqIFtUSFJJRlQtNzFdIC0gRGViaWFuIHBhY2thZ2luZyBmb3IgdGhyaWZ0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEwMzNdIC0gTm9kZS5qcyBsYW5ndWFnZSB0YXJnZXQKKyAgICAqIFtUSFJJRlQtOTQ3XSAtIFByb3ZpZGUgYSBoZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgVFByb3RvY29sIHVzZWQgdG8gc2VyaWFsaXplIHNvbWUgZGF0YS4KKyAgICAqIFtUSFJJRlQtOTI4XSAtIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycworICAgICogW1RIUklGVC05MjJdIC0gVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyM10gLSBFdmVudC1kcml2ZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyNV0gLSBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKworICAgICogW1RIUklGVC05MjddIC0gQWRkIG9wdGlvbiB0byBtb2RpZnkgdGhlIFBIUCBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMzc3XSAtIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0xMDZdIC0gVFNTTFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC01ODJdIC0gQyBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNzQ1XSAtIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg2Ml0gLSBBc3luYyBjbGllbnQgaXNzdWVzIC8gaW1wcm92ZW1lbnRzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNTgxXSAtIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpCisKKworCitUaHJpZnQgMC41LjAgLSBJbmN1YmF0aW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEhSSUZULTUwNSAgIEJ1aWxkICAgICAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBlbmFibGVkIGNvbXBvbmVudHMgKERhdmlkIFJlaXNzKQorVEhSSUZULTUwNiAgIEJ1aWxkICAgICAgICAgICAgICAgIEFsbG93IFRocmlmdCB0byBiZSBidWlsdCB3aXRob3V0IHRoZSBDKysgbGlicmFyeSAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODQ0ICAgQnVpbGQgICAgICAgICAgICAgICAgQnVpbGQgUmVxdWlyZW1lbnRzIHN0YXRlIGF1dG9jb25mIDIuNTkrIGlzIHJlcXVpcmVkLCBidXQgMi42MCsgaXMgbmVlZGVkIChIYXJsYW4gTGllYmVybWFuLUJlcmcpCitUSFJJRlQtODUwICAgQnVpbGQgICAgICAgICAgICAgICAgUGVybCBydW50aW1lIHJlcXVpcmVzIEJpdDo6VmVjdG9yIHdoaWNoIG1heSBub3QgYmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIGJ1dCBjb25maWd1cmUgZG9lcyBub3QgZmFpbCAoTWljaGFlbCBMdW0pCitUSFJJRlQtODU0ICAgQnVpbGQgICAgICAgICAgICAgICAgUHJvdmlkZSBjb25maWd1cmUgb3B0aW9uIGFuZCBtYWtlIHJ1bGVzIHRvIGJ1aWxkL2luc3RhbGwgcGhwIGV4dGVuc2lvbiAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04NTggICBCdWlsZCAgICAgICAgICAgICAgICBIYXZlIGJvb3RzdHJhcC5zaCBjaGVjayBmb3IgYSBzdWl0YWJsZSBhdXRvY29uZiB2ZXJzaW9uIGJlZm9yZSBydW5uaW5nIChEYXZpZCBSZWlzcykKK1RIUklGVC04NzEgICBCdWlsZCAgICAgICAgICAgICAgICBUaHJpZnQgY29tcGlsZXIgZm9yIFdJbmRvd3MgKGJpbmFyeSBkaXN0cmlidXRpb24pIChEYXZpZCBSZWlzcykKK1RIUklGVC0zMjMgICBDIyAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sIChSb2dlciBNZWllcikKK1RIUklGVC02MzQgICBDIyAgICAgICAgICAgICAgICAgICBDIyBDb21waWxlciBHZW5lcmF0ZXMgSW5jb3JyZWN0IENvZGUgRm9yIEZpZWxkcyB3aGljaCBiZWdpbiB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIgKEpvbiBTIEFraHRhcikKK1RIUklGVC04ODEgICBDIyAgICAgICAgICAgICAgICAgICBhZGQgY3NoYXJwIHRvIHRoZSB0dXRvcmlhbCAoUm9nZXIgTWVpZXIpCitUSFJJRlQtODU2ICAgQysrICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgY3BwIGxpYnJhcnkgZmFpbHMgb24gT1MgWCB3aXRoIG1hbGxvYyBhbmQgZnJlZSBub3QgYmVpbmcgZGVjbGFyZWQgaW4gc2NvcGUgKEphbWVzIENsYXJrZSkKK1RIUklGVC04NjUgICBDKysgICAgICAgICAgICAgICAgICBDKysgY29tcGlsZXIgYnVpbGQgZGVwZW5kcyBvbiBsaWJmbCBldmVuIHdoZW4gZmxleC9sZXggbm90IGRldGVjdGVkIChEYXZpZCBSZWlzcykKK1RIUklGVC05MDAgICBDKysgICAgICAgICAgICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXQgKFJvZ2VyIE1laWVyKQorVEhSSUZULTkyMCAgIEMrKyAgICAgICAgICAgICAgICAgIEMrKyBUZXN0IGFuZCBUdXRvcmlhbCBkb2VzIG5vdCBjb21waWxlIGFueW1vcmUgZHVlIHRvIHRoZSBjaGFuZ2Ugd2l0aGluIEVudW0gaGFuZGxpbmcgKFJvZ2VyIE1laWVyKQorVEhSSUZULTU2NyAgIEMrKyAgICAgICAgICAgICAgICAgIENhbid0IGltbWVkaWF0ZWx5IHN0b3AgYSBUU2ltcGxlU2VydmVyIHRocmVhZCB0aGF0IGlzIGlkbGUgKFJ1c2ggTWFuYmVydCkKK1RIUklGVC03NTYgICBDKysgICAgICAgICAgICAgICAgICBFeHBvc2luZyBUU29ja2V0KGludCkgY29uc3RydWN0b3IgdG8gcHVibGljIChSYWphdCBHb2VsKQorVEhSSUZULTc5OCAgIEMrKyAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlciBsZWFrcyByZXNvdXJjZXMgd2hlbiBkZXN0cm95ZWQgKERhdmlkIFJlaXNzKQorVEhSSUZULTgxMiAgIEMrKywgUHl0aG9uICAgICAgICAgIERlbW8gb2YgVGhyaWZ0IG92ZXIgWmVyb01RIChEYXZpZCBSZWlzcykKK1RIUklGVC02MjkgICBDb2NvYSAgICAgICAgICAgICAgICBVbnVzZWQgRmllbGQgSW4gVFNvY2tldFNlcnZlciBBcHBlYXJzIFRvIEJyZWFrIGlQaG9uZSBCdWlsZCAoSm9uIFMgQWtodGFyKQorVEhSSUZULTgzOCAgIENvY29hICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBDb2NvYSBjbGFzc2VzIGhhdmUgdXNlbGVzcyBAZHluYW1pYyBkZWNsYXJhdGlvbnMgKEtldmluIEJhbGxhcmQpCitUSFJJRlQtODA1ICAgQ29jb2EgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgcHJvY2Vzc19YWFhYIG1ldGhvZHMgZm9yIG9uZXdheSBtZXRob2RzIChCcmFkIFRheWxvcikKK1RIUklGVC01MDcgICBDb21waWxlciAgICAgICAgICAgICBSZW1vdmUgdGhlIGNvbXBpbGVyJ3MgZGVwZW5kZW5jeSBvbiBCb29zdCAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODk1ICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgVGhyaWZ0IGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IHR3byBkaWZmZXJlbnQgZW51bWVyYXRpb25zIHRvIGhhdmUgdGhlIHNhbWUga2V5IG5hbWUgZm9yIG9uZSBvZiB0aGUgZW51bSB2YWx1ZXMgKERhdmlkIFJlaXNzKQorVEhSSUZULTg1MiAgIENvbXBpbGVyIChHZW5lcmFsKSAgIE1pc3NpbmcgbmV3bGluZSBjYXVzZXMgbWFueSBjb21waWxlciB3YXJuaW5ncyAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04NzcgICBDb21waWxlciAoR2VuZXJhbCkgICBzbWFsbHRhbGsgbmFtZXNwYWNlIGRvZXNuJ3Qgd29yayAoQnJ1Y2UgTG93ZWthbXApCitUSFJJRlQtODk3ICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgRG9uJ3QgYWxsb3cgdW5xdWFsaWZpZWQgY29uc3RhbnQgYWNjZXNzIHRvIGVudW0gdmFsdWVzIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTkgICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIEFkZCBhIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZvciBhbGwgbGFuZ3VhZ2VzIChEYXZpZCBSZWlzcykKK1RIUklGVC01OTkgICBFcmxhbmcgICAgICAgICAgICAgICBEb24ndCB1c2UgdW5uZWNlc3NhcnkgcHJvY2Vzc2VzIGluIHRoZSBFcmxhbmcgdHJhbnNwb3J0cyBhbmQgY2xpZW50cyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNjQ2ICAgRXJsYW5nICAgICAgICAgICAgICAgRXJsYW5nIGxpYnJhcnkgaXMgbWlzc2luZyBpbnN0YWxsIHRhcmdldCAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNjk4ICAgRXJsYW5nICAgICAgICAgICAgICAgR2VuZXJhdGVkIG1vZHVsZSBsaXN0IHNob3VsZCBjb250YWluIGF0b21zLCBub3Qgc3RyaW5ncyAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04NjYgICBFcmxhbmcgICAgICAgICAgICAgICB0ZXJtKCkgaW4gc3BlYyBkZWZpbml0aW9ucyBzZWVtcyB0byBub3Qgd29yayBpbiBlcmxhbmcgUjEyIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg4NiAgIEVybGFuZyAgICAgICAgICAgICAgIERpYWx5emVyIHdhcm5pbmcgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtNzg1ICAgRXJsYW5nICAgICAgICAgICAgICAgRnJhbWVkIHRyYW5zcG9ydCBzZXJ2ZXIgcHJvYmxlbXMgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODg0ICAgSFRNTCAgICAgICAgICAgICAgICAgSFRNTCBHZW5lcmF0b3I6IGFkZCBLZXkgYXR0cmlidXRlIHRvIHRoZSBEYXRhIFR5cGVzIFRhYmxlcyAoUm9nZXIgTWVpZXIpCitUSFJJRlQtNjUyICAgSGFza2VsbCAgICAgICAgICAgICAgR2VuZXJhdGVkIGZpZWxkIG5hbWUgZm9yIHN0cnV0IGlzIG5vdCBjYXBpdGFsaXplZCBjb3JyZWN0bHkgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtNzQzICAgSGFza2VsbCAgICAgICAgICAgICAgY29tcGlsZSBlcnJvciB3aXRoIEdIQyA2LjEyLjEgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTAxICAgSGFza2VsbCAgICAgICAgICAgICAgQWxsb3cgdGhlIGJpbmRpbmdzIHRvIGNvbXBpbGUgd2l0aG91dCAtZmdsYXNnb3ctZXh0cyBhbmQgd2l0aCAtV2FsbCAtV2Vycm9yIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkwNSAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCB0aHJpZnQgYmluZGluZ3MgdXNlIGF1dG9tYWtlIHRvIGNvbXBpbGUgYW5kIGluc3RhbGwgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTA2ICAgSGFza2VsbCAgICAgICAgICAgICAgSW1wcm92ZSB0eXBlIG1hcHBpbmdzIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkxNCAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCBiaW5kaW5ncyAnZWFzaWx5JyBjb21waWxhYmxlIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkxOCAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCB0ZXN0cyBydW4gYWdhaW4gKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTE5ICAgSGFza2VsbCAgICAgICAgICAgICAgVXBkYXRlIEhhc2tlbGwgYmluZGluZ3MgUkVBRE1FIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTc4NyAgIEhhc2tlbGwgICAgICAgICAgICAgIEVudW1zIGFyZSBub3QgcmVhZCBjb3JyZWN0bHkgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtMjUwICAgSmF2YSAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIGZvciBUU2VydmVyIChFZCBDZWFzZXIpCitUSFJJRlQtNjkzICAgSmF2YSAgICAgICAgICAgICAgICAgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBqYXZhIGNvZGUgdGhhdCB0aHJvd3MgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBtZXRob2RzLiAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04NDMgICBKYXZhICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTb2NrZXQgY29ubmVjdHMgd2l0aG91dCBhIHRpbWVvdXQgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODQ1ICAgSmF2YSAgICAgICAgICAgICAgICAgYXN5bmMgY2xpZW50IGRvZXMgbm90IHJlc3BlY3QgdGltZW91dCAoTmluZyBMaWFuZykKK1RIUklGVC04NzAgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIGNvbnN0YW50cyBkb24ndCBnZXQgSmF2YWRvYyBjb21tZW50cyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04NzMgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIHRlc3RzIGZhaWwgZHVlIHRvIFRvbyBtYW55IG9wZW4gZmlsZXMgKFRvZGQgTGlwY29uKQorVEhSSUZULTg3NiAgIEphdmEgICAgICAgICAgICAgICAgIEFkZCBTQVNMIHN1cHBvcnQgKEFhcm9uIFQuIE15ZXJzKQorVEhSSUZULTg3OSAgIEphdmEgICAgICAgICAgICAgICAgIFJlbW92ZSBAT3ZlcnJpZGUgZnJvbSBUVW5pb24uY2xlYXIgKERhdmUgRW5nYmVyZykKK1RIUklGVC04ODIgICBKYXZhICAgICAgICAgICAgICAgICBkZWVwIGNvcHkgb2YgYmluYXJ5IGZpZWxkcyBkb2VzIG5vdCBjb3B5IEJ5dGVCdWZmZXIgY2hhcmFjdGVyaXN0aWNzIChhcnJheU9mZnNldCwgcG9zaXRpb24pIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg4OCAgIEphdmEgICAgICAgICAgICAgICAgIGFzeW5jIGNsaWVudCBzaG91bGQgYWxzbyBoYXZlIG5vbmJsb2NraW5nIGNvbm5lY3QgKEVyaWMgSmVuc2VuKQorVEhSSUZULTg5MCAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgdHV0b3JpYWwgZG9lc24ndCB3b3JrIChUb2RkIExpcGNvbikKK1RIUklGVC04OTQgICBKYXZhICAgICAgICAgICAgICAgICBNYWtlIGRlZmF1bHQgYWNjZXNzb3JzIGZvciBiaW5hcnkgZmllbGRzIHJldHVybiBieXRlW107IHByb3ZpZGUgbmV3IGFjY2Vzc29ycyB0byBnZXQgQnl0ZUJ1ZmZlciB2ZXJzaW9uIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg5NiAgIEphdmEgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NvY2tldC5pc09wZW4oKSByZXR1cm5zIHRydWUgZXZlbiBhZnRlciBjbG9zZSgpIChFcmljIEplbnNlbikKK1RIUklGVC05MDcgICBKYXZhICAgICAgICAgICAgICAgICBsaWJmYjMwMyBkb2Vzbid0IGNvbXBpbGUgaW4gMC40LjAgKFRvZGQgTGlwY29uKQorVEhSSUZULTkxMiAgIEphdmEgICAgICAgICAgICAgICAgIEltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIHRvIFNBU0wgaW1wbGVtZW50YXRpb24gKFRvZGQgTGlwY29uKQorVEhSSUZULTkxNyAgIEphdmEgICAgICAgICAgICAgICAgIFRIc0hhU2VydmVyIHNob3VsZCBub3QgYWNjZXB0IGFuIEV4ZWN1dG9yU2VydmljZSB3aXRob3V0IGNhdGNoaW5nIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIChFZCBDZWFzZXIpCitUSFJJRlQtOTMxICAgSmF2YSAgICAgICAgICAgICAgICAgVXNlIGxvZzRqIGZvciBKYXZhIHRlc3RzIChUb2RkIExpcGNvbikKK1RIUklGVC04ODAgICBKYXZhTUUgICAgICAgICAgICAgICBKYXZhTUUgY29kZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgbGlicmFyeSAoRGF2ZSBFbmdiZXJnKQorVEhSSUZULTg0NiAgIEphdmFTY3JpcHQgICAgICAgICAgIEphdmFTY3JpcHQgVGVzdCBGcmFtd29yazogZXh0ZW5kZWQgVGVzdGNhc2VzIChSb2dlciBNZWllcikKK1RIUklGVC04ODUgICBKYXZhU2NyaXB0ICAgICAgICAgICBVcmwgZW5jb2RlZCBzdHJpbmdzIG5ldmVyIGdldCBkZWNvZGVkPyBIb3cgZG8gd2UgZml4IHRoaXM/IChUIEpha2UgTHVjaWFuaSkKK1RIUklGVC05MTEgICBKYXZhU2NyaXB0ICAgICAgICAgICAoSmF2YVNjcmlwdCBjb21waWxlcikgQ29uc3Qgc3RydWN0cywgbWFwcywgc2V0cywgYW5kIGxpc3RzIGdlbmVyYXRlIGEgdHJhaWxpbmcgY29tbWEgKFQgSmFrZSBMdWNpYW5pKQorVEhSSUZULTg2MCAgIE9DYW1sICAgICAgICAgICAgICAgIGNvcHkgbWV0aG9kIGFuZCByZXNldCBtZXRob2QgKExldiBXYWxraW4pCitUSFJJRlQtNjgyICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIGV4dGVuc2lvbiBkb2Vzbid0IGNvbXBpbGUgb24gTWFjIE9TIFggKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODUxICAgUEhQICAgICAgICAgICAgICAgICAgcGhwIGV4dGVuc2lvbiBmYWlscyB0byBjb21waWxlIG9uIGNlbnRvcyA1LnggKFRvZGQgTGlwY29uKQorVEhSSUZULTg0MCAgIFBlcmwgICAgICAgICAgICAgICAgIFBlcmwgcHJvdG9jb2wgaGFuZGxlciBjb3VsZCBiZSBtb3JlIHJvYnVzdCBhZ2FpbnN0IHVucmVjb2duaXNlZCB0eXBlcyAoQ29ucmFkIEh1Z2hlcykKK1RIUklGVC03NTggICBQZXJsICAgICAgICAgICAgICAgICBpbmNvcnJlY3QgZGVmZXJlbmNlIGluIGV4Y2VwdGlvbiBoYW5kbGluZyAoWWFubiBLZXJoZXJ2ZSkKK1RIUklGVC0yNTcgICBQeXRob24gICAgICAgICAgICAgICBTdXBwb3J0IHZhbGlkYXRpb24gb2YgcmVxdWlyZWQgZmllbGRzIChFc3RldmUgRmVybmFuZGV6KQorVEhSSUZULTMzNSAgIFB5dGhvbiAgICAgICAgICAgICAgIENvbXBhY3QgUHJvdG9jb2wgZm9yIFB5dGhvbiAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNTk2ICAgUHl0aG9uICAgICAgICAgICAgICAgTWFrZSBQeXRob24ncyBUQnVmZmVyZWRUcmFuc3BvcnQgdXNlIGEgY29uZmlndXJhYmxlIGlucHV0IGJ1ZmZlciAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNTk3ICAgUHl0aG9uICAgICAgICAgICAgICAgUHl0aG9uIFRIdHRwU2VydmVyIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNTk4ICAgUHl0aG9uICAgICAgICAgICAgICAgQWxsb3cgUHl0aG9uJ3MgdGhyZWFkaW5nIHNlcnZlcnMgdG8gdXNlIGRhZW1vbiB0aHJlYWRzIChEYXZpZCBSZWlzcykKK1RIUklGVC02NjYgICBQeXRob24gICAgICAgICAgICAgICBBbGxvdyB0aGUgaGFuZGxlciB0byBvdmVycmlkZSBIVFRQIHJlc3BvbnNlcyBpbiBUSHR0cFNlcnZlciAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNjczICAgUHl0aG9uICAgICAgICAgICAgICAgR2VuZXJhdGVkIFB5dGhvbiBjb2RlIGhhcyB3aGl0ZXNwYWNlIGlzc3VlcyAoSWFuIEV1cmUpCitUSFJJRlQtNzIxICAgUHl0aG9uICAgICAgICAgICAgICAgVEh0dHBDbGllbnQgaWdub3JlcyB1cmwgcGFyYW1ldGVycyAoVGhvbWFzIEtobykKK1RIUklGVC04MjQgICBQeXRob24gICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uX19zdHJfXygpIHJlZmVycyB0byBjbGFzcyBjb25zdGFudHMgYXMgZ2xvYmFscyAoUGV0ZXIgU2NodWxsZXIpCitUSFJJRlQtODU1ICAgUHl0aG9uICAgICAgICAgICAgICAgSW5jbHVkZSBvcHRpbWl6ZWQgY29tcGlsZWQgcHl0aG9uIG9iamVjdHMgaW4gaW5zdGFsbCAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04NTkgICBQeXRob24gICAgICAgICAgICAgICBBbGxvdyBweTp0d2lzdGVkIHRvIGJlIGdlbmVyYXRlZCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gcHkgKEJydWNlIExvd2VrYW1wKQorVEhSSUZULTg2OSAgIFB5dGhvbiAgICAgICAgICAgICAgIFRTb2NrZXQucHkgb24gTWFjIChhbmQgRnJlZUJTRCkgZG9lc24ndCBoYW5kbGUgRUNPTk5SRVNFVCBmcm9tIHJlY3YoKSAoU3RldmVuIEtuaWdodCkKK1RIUklGVC04NzUgICBQeXRob24gICAgICAgICAgICAgICBJbmNsdWRlIHB5dGhvbiBzZXR1cC5jZmcgaW4gZGlzdCAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC02MTAgICBSdWJ5ICAgICAgICAgICAgICAgICBiaW5hcnlfcHJvdG9jb2wucmIgc2VnZmF1bHRzIFtsaW5lIDg2XSAoVW5hc3NpZ25lZCkKK1RIUklGVC04OTkgICBSdWJ5ICAgICAgICAgICAgICAgICBSdWJ5IHJlYWQgdGltZW91dHMgY2FuIHNvbWV0aW1lcyBiZSAyeCB3aGF0IHRoZXkgc2hvdWxkIGJlIChSeWFuIEtpbmcpCitUSFJJRlQtOTA5ICAgUnVieSAgICAgICAgICAgICAgICAgYWxsb3cgYmxvY2sgYXJndW1lbnQgdG8gc3RydWN0IGNvbnN0cnVjdG9yIChNaWNoYWVsIFN0b2NrdG9uKQorVEhSSUZULTQ1NiAgIFRlc3QgU3VpdGUgICAgICAgICAgIEJhZCBJUCBhZGRyZXNzIHN0cmluZyBpbiB0ZXN0L2NwcC9zcmMvbWFpbi5jcHAgKFJ1c2ggTWFuYmVydCkKKworCitUaHJpZnQgMC40LjAgLSBJbmN1YmF0aW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVEhSSUZULTY1MCAgIEJ1aWxkICAgICAgICBNYWtlIENoZWNrIGZhaWxzIG9uIENlbnRvcy9PU1ggd2l0aCAwLjIuMCB0YXJiYWxsIChBbnRob255IE1vbGluYXJvKQogVEhSSUZULTc3MCAgIEJ1aWxkICAgICAgICBHZXQgJ21ha2UgZGlzdCcgdG8gd29yayB3aXRob3V0IGZpcnN0IGNvbXBpbGluZyBzb3VyY2UgY29kZSAoQW50aG9ueSBNb2xpbmFybykKIFRIUklGVC0xNjAgICBDIyAgICAgICAgICAgQ3JlYXRlZCBUSHR0cFRyYW5zcG9ydCBmb3IgdGhlIEMjIGxpYnJhcnkgYmFzZWQgb24gV2ViSHR0cFJlcXVlc3QgKE1pY2hhZWwgR3JlZW5lKQpAQCAtNDksOCArMjg4NCw4IEBACiBUSFJJRlQtNDU5ICAgUnVieSAgICAgICAgIFJ1YnkgaW5zdGFsbGF0aW9uIGFsd2F5cyB0cmllcyB0byB3cml0ZSB0byAvTGlicmFyeS9SdWJ5L3NpdGUgKE1hdHRoaWV1IEltYmVydCkKIAogCi1WZXJzaW9uIDAuMS4wIFJDMSAvIFVucmVsZWFzZWQKLQorVGhyaWZ0IDAuMS4wIC0gSW5jdWJhdGluZyAobm90IHJlbGVhc2VkKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbXBhdGliaWxpdHkgQnJlYWtpbmcgQ2hhbmdlczoKICAgQysrOgogICAgICogSXQncyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHJlZ2VuZXJhdGluZyBjb2RlIGFuZCByZWJ1aWxkaW5nIHdpbGwgYmUKQEAgLTY3LDggKzI5MDIsNyBAQAogICBFcmxhbmc6CiAgICAgKiBHZW5lcmF0ZWQgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGFuZCB0aGUgbmV3IGNvZGUgd2lsbAogICAgICAgaGF2ZSB0byBiZSBkZXBsb3llZCBhdG9taWNhbGx5IHdpdGggdGhlIG5ldyBsaWJyYXJ5IGNvZGUgW1RIUklGVC0xMzZdCi0gIAotICAKKwogTmV3IEZlYXR1cmVzIGFuZCBCdWcgRml4ZXM6CiAgIEMrKzoKICAgICAqIFN1cHBvcnQgZm9yIFRDb21wYWN0UHJvdG9jb2wgW1RIUklGVC0zMzNdCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTdhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjEpCisKKyMgQ01ha2UgMy4xIHN1cHBvcnRzIEMrKyBzdGFuZGFyZHMgc2VsZWN0aW9uIHdpdGggQ01BS0VfQ1hYX1NUQU5EQVJECisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIFVidW50dSAxNC4wNCwgdHJ5CisjICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L35nZW9yZ2UtZWRpc29uNTUvK2FyY2hpdmUvdWJ1bnR1L2NtYWtlLTMueAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBkZWJpYW4gImplc3NpZSIsIGdldCBpdCBmcm9tIGplc3NpZS1iYWNrcG9ydHMKKyMgT3RoZXJ3aXNlCisjICAgaHR0cDovL2NtYWtlLm9yZworCitwcm9qZWN0KCJBcGFjaGUgVGhyaWZ0IikKKworc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX01PRFVMRV9QQVRIfSIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC9jbWFrZSIpCisKKyMgVE9ETzogYWRkIGBnaXQgcmV2LXBhcnNlIC0tc2hvcnQgSEVBRGAKKyMgUmVhZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBdXRvY29uZiBmaWxlCitmaWxlIChTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlndXJlLmFjIiBDT05GSUdVUkVfQUMgUkVHRVggIkFDX0lOSVRcXCguKlxcKSIgKQorCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgdmVyc2lvbi5oLmluIGZpbGUKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJBQ19JTklUXFwoXFxbLipcXF0sIFxcWyhbMC05XStcXC5bMC05XStcXC5bMC05XSsoLWRldik/KVxcXVxcKSIgIlxcMSIgUEFDS0FHRV9WRVJTSU9OICR7Q09ORklHVVJFX0FDfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogJHtQQUNLQUdFX1ZFUlNJT059IikKKworIyBUaGVzZSBhcmUgaW50ZXJuYWwgdG8gQ01ha2UKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKSgtZGV2KT8iICJcXDEiIHRocmlmdF9WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rKVxcLlswLTldK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuKFswLTldKStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLlswLTldK1xcLihbMC05XSspIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHZlcnNpb246ICR7dGhyaWZ0X1ZFUlNJT059ICgke3RocmlmdF9WRVJTSU9OX01BSk9SfS4ke3RocmlmdF9WRVJTSU9OX01JTk9SfS4ke3RocmlmdF9WRVJTSU9OX1BBVENIfSkiKQorCisjIFNvbWUgZGVmYXVsdCBzZXR0aW5ncworaW5jbHVkZShEZWZpbmVDTWFrZURlZmF1bHRzKQorCisjIEJ1aWxkIHRpbWUgb3B0aW9ucyBhcmUgZGVmaW5lZCBoZXJlCitpbmNsdWRlKERlZmluZU9wdGlvbnMpCitpbmNsdWRlKERlZmluZUluc3RhbGxhdGlvblBhdGhzKQorCisjIEJhc2VkIG9uIHRoZSBvcHRpb25zIHNldCBzb21lIHBsYXRmb3JtIHNwZWNpZmljcworaW5jbHVkZShEZWZpbmVQbGF0Zm9ybVNwZWNpZmMpCisKKyMgR2VuZXJhdGUgdGhlIGNvbmZpZy5oIGZpbGUKK2luY2x1ZGUoQ29uZmlndXJlQ2hlY2tzKQorCisjIFBhY2thZ2UgaXQKK2luY2x1ZGUoQ1BhY2tDb25maWcpCisKKworZmluZF9wYWNrYWdlKFRocmVhZHMpCisKK2luY2x1ZGUoQ1Rlc3QpCitpZihCVUlMRF9URVNUSU5HKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aCB1bml0dGVzdHMiKQorCisgIGVuYWJsZV90ZXN0aW5nKCkKKyAgIyBEZWZpbmUgIm1ha2UgY2hlY2siIGFzIGFsaWFzIGZvciAibWFrZSB0ZXN0IgorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjayBDT01NQU5EIGN0ZXN0KQorZWxzZSAoKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aG91dCB0ZXN0cyIpCitlbmRpZiAoKQorCitpZihCVUlMRF9DT01QSUxFUikKKyAgICBpZihOT1QgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICAgICAgc2V0KFRIUklGVF9DT01QSUxFUiAkPFRBUkdFVF9GSUxFOnRocmlmdC1jb21waWxlcj4pCisgICAgZW5kaWYoKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL2NwcCkKK2Vsc2VpZihFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1jb21waWxlciBJTVBPUlRFRCkKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdC1jb21waWxlciBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1RIUklGVF9DT01QSUxFUn0pCitlbmRpZigpCisKK2lmKEJVSUxEX0NQUCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY3BwKQorICAgIGlmKEJVSUxEX1RVVE9SSUFMUykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdHV0b3JpYWwvY3BwKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBpZihXSVRIX0xJQkVWRU5UIEFORCBXSVRIX1pMSUIgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICAgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvY3BwKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIG1lc3NhZ2UoV0FSTklORyAibGliZXZlbnQgYW5kL29yIFpMSUIgYW5kL29yIE9wZW5TU0wgbm90IGZvdW5kIG9yIGRpc2FibGVkOyB3aWxsIG5vdCBidWlsZCBzb21lIHRlc3RzIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfQ19HTElCKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9jX2dsaWIpCitlbmRpZigpCisKK2lmKEJVSUxEX0pBVkEpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2phdmEpCitlbmRpZigpCisKK2lmKEJVSUxEX1BZVEhPTikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvcHkpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9weSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX0hBU0tFTEwpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2hzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvaHMpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitQUklOVF9DT05GSUdfU1VNTUFSWSgpCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDcxMAotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDExNiBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZSAjCisKK1RoYW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiBjb250cmlidXRpbmcgdG8gdGhlIEFwYWNoZSBUaHJpZnQgcHJvamVjdCEgIEluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgdG8gYmVjb21lIGFjcXVhaW50ZWQgd2l0aCBBcGFjaGUgQ29udHJpYnV0aW9uczoKKworICogW0NvbnRyaWJ1dG9ycyBUZWNoIEd1aWRlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L2NvbnRyaWJ1dG9ycykKKyAqIFtHZXQgaW52b2x2ZWQhXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9nZXRpbnZvbHZlZC5odG1sKQorICogW0xlZ2FsIGFzcGVjdHMgb24gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zIChQYXRjaGVzKV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwjY29udHJpYnV0aW9ucykKKworIyMgR2l0SHViIHB1bGwgcmVxdWVzdHMgIyMKKworVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBzdWJtaXR0aW5nIGNoYW5nZXMuICBXaGVuIHlvdSBzdWJtaXQgYSBwdWxsIHJlcXVlc3QgdGhyb3VnaCBnaXRodWIsCitpdCBhY3RpdmF0ZXMgdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKENJKSBidWlsZCBzeXN0ZW1zIGF0IEFwcHZleW9yIGFuZCBUcmF2aXMgdG8gYnVpbGQgeW91ciBjaGFuZ2VzeGkKK29uIGEgdmFyaWV0eSBvZiBMaW51eCBhbmQgV2luZG93cyBjb25maWd1cmF0aW9ucyBhbmQgcnVuIGFsbCB0aGUgdGVzdCBzdWl0ZXMuICBGb2xsb3cgdGhlc2UgcmVxdWlyZW1lbnRzIAorZm9yIGEgc3VjY2Vzc2Z1bCBwdWxsIHJlcXVlc3Q6CisKKyAxLiBBbGwgY29kZSBjaGFuZ2VzIHJlcXVpcmUgYW4gW0FwYWNoZSBKaXJhIFRIUklGVCBJc3N1ZV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgdGlja2V0LgorCisgMS4gQWxsIHB1bGwgcmVxdWVzdHMgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgY29tbWl0IHBlciBpc3N1ZSwgb3Igd2Ugd2lsbCBhc2sgeW91IHRvIHNxdWFzaCBpdC4KKyAxLiBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIG11c3QgYmVnaW4gd2l0aCB0aGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIsIGZvciBleGFtcGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorICAgICAgICAKKyAxLiBDb21taXQgbWVzc2FnZXMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIGZvciBjb2RlIGNoYW5nZXMgKGRldmlhdGlvbnMgd2lsbCBub3QgYmUgbWVyZ2VkKToKKyAgICAgICAgCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCB1c2UgbGliLyBkaXJlY3RvcnkgbmFtZXMgcGxlYXNlXQorCitJbnN0cnVjdGlvbnM6CisKKyAxLiBDcmVhdGUgYSBmb3JrIGluIHlvdXIgR2l0SHViIGFjY291bnQgb2YgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorIDEuIENsb25lIHRoZSBmb3JrIHRvIHlvdXIgZGV2ZWxvcG1lbnQgc3lzdGVtLgorIDEuIENyZWF0ZSBhIGJyYW5jaCBmb3IgeW91ciBjaGFuZ2VzIChiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KS4KKyAxLiBNb2RpZnkgdGhlIHNvdXJjZSB0byBpbmNsdWRlIHRoZSBpbXByb3ZlbWVudC9idWdmaXgsIGFuZDoKKworICAgICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0dGVkIGNoYW5nZXMhCisgICAgKiBVc2UgdGVzdC1kcml2ZW4gZGV2ZWxvcG1lbnQgKFRERCk6IGFkZCBhIHRlc3QgdGhhdCB3aWxsIGlzb2xhdGUgdGhlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyB0aGUgY2hhbmdlIHRoYXQgZml4ZXMgaXQuCisgICAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2RvY3MvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykuCisgICAgKiBbKm9wdGlvbmFsKl0gVmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2Ugd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIGJ5IGFkZGluZyBhIEdpdEh1YiBzZXJ2aWNlIGhvb2sgdG8gW1RyYXZpcyBDSV0oaHR0cDovL2RvY3MudHJhdmlzLWNpLmNvbS91c2VyL2dldHRpbmctc3RhcnRlZC8jU3RlcC1vbmUlM0EtU2lnbi1pbikgYW5kIFtBcHBWZXlvcl0oaHR0cDovL3d3dy5hcHB2ZXlvci5jb20vZG9jcykuICBZb3UgY2FuIHVzZSB0aGlzIHRlY2huaXF1ZSB0byBydW4gdGhlIFRocmlmdCBDSSBqb2JzIGluIHlvdXIgYWNjb3VudCB0byBjaGVjayB5b3VyIGNoYW5nZXMgYmVmb3JlIHRoZXkgYXJlIG1hZGUgcHVibGljLiAgRXZlcnkgR2l0SHViIHB1bGwgcmVxdWVzdCBpbnRvIFRocmlmdCB3aWxsIHJ1biB0aGUgZnVsbCBDSSBidWlsZCBhbmQgdGVzdCBzdWl0ZSBvbiB5b3VyIGNoYW5nZXMuCisKKyAxLiBTcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFpbnRhaW5zIGNsZWFuIGNoYW5nZSBoaXN0b3J5LgorIDEuIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIHRvIHlvdXIgYnJhbmNoIChwbGVhc2UgdXNlIGlzc3VlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFzIGNvbW1pdCB0aXRsZSwgZS5nLiAiVEhSSUZULTk5OTk6IG1ha2UgaXQgcGVyZmVjdCIpLCB3aXRoIHRoZSBhZmZlY3RlZCBsYW5ndWFnZXMgb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZGVzY3JpcHRpb24uCisgMS4gVXNlIEdpdEh1YiB0byBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgZ29pbmcgZnJvbSB5b3VyIGJyYW5jaCB0byBhcGFjaGU6bWFzdGVyLiAgRW5zdXJlIHRoYXQgdGhlIEppcmEgdGlja2V0IG51bWJlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aXRsZSBvZiB5b3VyIHB1bGwgcmVxdWVzdCwgc2FtZSBhcyB0aGUgY29tbWl0IHRpdGxlLgorIDEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbiwgYW5kIGZvciBhIENJIGJ1aWxkIHRvIGNvbXBsZXRlLgorIDEuIFdhaXQgZm9yIGEgY29tbWl0dGVyIHRvIGNvbW1pdCB5b3VyIHBhdGNoLiAgWW91IGNhbiBudWRnZSB0aGUgY29tbWl0dGVycyBpZiBuZWNlc3NhcnkgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIFtBcGFjaGUgVGhyaWZ0IG1haWxpbmcgbGlzdF0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nKS4KKworIyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHByb2plY3QgbG9jYWxseSAjIworCitGb3IgV2luZG93cyBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0NNYWtlIFJFQURNRV0oL2J1aWxkL2NtYWtlL1JFQURNRS5tZCkuCisKK0ZvciBXaW5kb3dzIE5hdGl2ZSBDKysgYnVpbGRzLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW1dpbkNQUCBSRUFETUVdKC9idWlsZC93aW5jcHAvUkVBRE1FLm1kKS4KKworRm9yIHVuaXggc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtEb2NrZXIgUkVBRE1FXSgvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKKyMjIElmIHlvdSB3YW50IHRvIHJldmlldyBvcGVuIGlzc3Vlcy4uLiAjIworCisgMS4gUmV2aWV3IHRoZSBbR2l0SHViIFB1bGwgUmVxdWVzdCBCYWNrbG9nXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9wdWxscykuICBDb2RlIHJldmlld3MgYXJlIG9wZW4gdG8gYWxsLgorIDIuIFJldmlldyB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuICBZb3UgY2FuIHNlYXJjaCBmb3IgdGlja2V0cyByZWxhdGluZyB0byBsYW5ndWFnZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9yIGN1cnJlbnRseSB1c2luZyB3aXRoIHRocmlmdCwgZm9yIGV4YW1wbGUgYSBKaXJhIHNlYXJjaCAoSXNzdWVzIC0+IFNlYXJjaCBGb3IgSXNzdWVzKSBxdWVyeSBvZiBgYHByb2plY3QgPSBUSFJJRlQgQU5EIGNvbXBvbmVudCBpbiAoIkVybGFuZyAtIExpYnJhcnkiKSBhbmQgc3RhdHVzIG5vdCBpbiAocmVzb2x2ZWQsIGNsb3NlZClgYCB3aWxsIGxvY2F0ZSBhbGwgdGhlIG9wZW4gRXJsYW5nIExpYnJhcnkgaXNzdWVzLgorCisjIyBJZiB5b3UgZGlzY292ZXJlZCBhIGRlZmVjdC4uLiAjIworCisgMS4gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpc3N1ZSBpcyBhbHJlYWR5IGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4KKyAxLiBJZiBub3QsIGNyZWF0ZSBhIHRpY2tldCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UgeW91J3JlIHByb3Bvc2luZyBpbiB0aGUgSmlyYSBpc3N1ZSB0cmFja2VyLgorIDEuIENvbnRyaWJ1dGUgeW91ciBjb2RlIGNoYW5nZXMgdXNpbmcgdGhlIEdpdEh1YiBwdWxsIHJlcXVlc3QgbWV0aG9kOgorCisjIyBDb250cmlidXRpbmcgdmlhIFBhdGNoICMjCisKK1NvbWUgY2hhbmdlcyBkbyBub3QgcmVxdWlyZSBhIGJ1aWxkLCBmb3IgZXhhbXBsZSBpbiBkb2N1bWVudGF0aW9uLiAgRm9yIGNoYW5nZXMgdGhhdCBhcmUgbm90IGNvZGUgb3IgYnVpbGQgcmVsYXRlZCwgeW91IGNhbiBzdWJtaXQgYSBwYXRjaCBvbiBKaXJhIGZvciByZXZpZXcuICBUbyBjcmVhdGUgYSBwYXRjaCBmcm9tIGNoYW5nZXMgaW4geW91ciBsb2NhbCBkaXJlY3Rvcnk6CisKKyAgICBnaXQgZGlmZiA+IC4uL1RIUklGVC1OTk5OLnBhdGNoCisKK3RoZW4gd2FpdCBmb3IgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgY2hhbmdlcywgYW5kIHRoZW4gZm9yIGEgY29tbWl0dGVyIHRvIGFwcGx5IHlvdXIgcGF0Y2guCisKKyMjIEdpdEh1YiByZWNpcGVzIGZvciBQdWxsIFJlcXVlc3RzICMjCisKK1NvbWV0aW1lcyBjb21tbWl0dGVycyBtYXkgYXNrIHlvdSB0byB0YWtlIGFjdGlvbnMgaW4geW91ciBwdWxsIHJlcXVlc3RzLiAgSGVyZSBhcmUgc29tZSByZWNpcGVzIHRoYXQgd2lsbCBoZWxwIHlvdSBhY2NvbXBsaXNoIHRob3NlIHJlcXVlc3RzLiAgVGhlc2UgZXhhbXBsZXMgYXNzdW1lIHlvdSBhcmUgd29ya2luZyBvbiBKaXJhIGlzc3VlIFRIUklGVC05OTk5LiAgWW91IHNob3VsZCBhbHNvIGJlIGZhbWlsaWFyIHdpdGggdGhlIFt1cHN0cmVhbV0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvc3luY2luZy1hLWZvcmsvKSByZXBvc2l0b3J5IGNvbmNlcHQuCisKKyMjIyBTcXVhc2ggeW91ciBjaGFuZ2VzICMjIworCitJZiB5b3UgaGF2ZSBub3Qgc3VibWl0dGVkIGEgcHVsbCByZXF1ZXN0IHlldCwgb3IgaWYgeW91IGhhdmUgbm90IHlldCByZWJhc2VkIHlvdXIgZXhpc3RpbmcgcHVsbCByZXF1ZXN0LCB5b3UgY2FuIHNxdWFzaCBhbGwgeW91ciBjb21taXRzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWtlcyBsaWZlIGVhc2llciBmb3IgdGhlIGNvbW1pdHRlcnMuICBJZiB5b3VyIHB1bGwgcmVxdWVzdCBvbiBHaXRIdWIgaGFzIG1vcmUgdGhhbiBvbmUgY29tbWl0LCB5b3Ugc2hvdWxkIGRvIHRoaXMuCisKKzEuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCBsb2dgYCB0byBpZGVudGlmeSBob3cgbWFueSBjb21taXRzIHlvdSBtYWRlIHNpbmNlIHlvdSBiZWdhbi4KKzIuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCByZWJhc2UgLWkgSEVBRH5OYGAgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMuCiszLiBMZWF2ZSAicHVsbCIgaW4gdGhlIGZpcnN0IGxpbmUuCis0LiBDaGFuZ2UgYWxsIG90aGVyIGxpbmVzIGZyb20gInB1bGwiIHRvICJmaXh1cCIuCis1LiBBbGwgeW91ciBjaGFuZ2VzIGFyZSBub3cgaW4gYSBzaW5nbGUgY29tbWl0LgorCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVsbCByZXF1ZXN0IG91dHN0YW5kaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIGEgImZvcmNlIHB1c2giIHRvIG92ZXJ3cml0ZSBpdCBzaW5jZSB5b3UgY2hhbmdlZCB5b3VyIGNvbW1pdCBoaXN0b3J5OgorCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworQSBtb3JlIGRldGFpbGVkIHdhbGt0aHJvdWdoIG9mIGEgc3F1YXNoIGNhbiBiZSBmb3VuZCBhdCBbR2l0IFJlYWR5XShodHRwOi8vZ2l0cmVhZHkuY29tL2FkdmFuY2VkLzIwMDkvMDIvMTAvc3F1YXNoaW5nLWNvbW1pdHMtd2l0aC1yZWJhc2UuaHRtbCkuCisKKyMjIyBSZWJhc2UgeW91ciBwdWxsIHJlcXVlc3QgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGhhcyBhIGNvbmZsaWN0IHdpdGggbWFzdGVyLCBpdCBuZWVkcyB0byBiZSByZWJhc2VkOgorCisgICAgZ2l0IGNoZWNrb3V0IFRIUklGVC05OTk5CisgICAgZ2l0IHJlYmFzZSB1cHN0cmVhbSBtYXN0ZXIKKyAgICAgIChyZXNvbHZlIGFueSBjb25mbGljdHMsIG1ha2Ugc3VyZSBpdCBidWlsZHMpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworIyMjIEZpeCBhIGJhZCBtZXJnZSAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgY29udGFpbnMgY29tbWl0cyB0aGF0IGFyZSBub3QgeW91cnMsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUgdG8gZml4IHRoZSBiYWQgbWVyZ2UgaW4geW91ciBicmFuY2g6CisKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgZ2l0IHB1bGwgdXBzdHJlYW0gbWFzdGVyCisgICAgZ2l0IGNoZWNrb3V0IC1iIFRIUklGVC05OTk5LXRha2UtMgorICAgIGdpdCBjaGVycnktcGljayAuLi4KKyAgICAgICAgKHBpY2sgb25seSB5b3VyIGNvbW1pdHMgZnJvbSB5b3VyIG9yaWdpbmFsIHB1bGwgcmVxdWVzdCBpbiBhc2NlbmRpbmcgY2hyb25vbG9naWNhbCBvcmRlcikKKyAgICBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIChzZWUgYWJvdmUpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5LXRha2UtMjpUSFJJRlQtOTk5OQorCitUaGlzIHByb2NlZHVyZSB3aWxsIGFwcGx5IG9ubHkgeW91ciBjb21taXRzIGluIG9yZGVyIHRvIHRoZSBjdXJyZW50IG1hc3RlciwgdGhlbiB5b3Ugd2lsbCBzcXVhc2ggdGhlbSB0byBhIHNpbmdsZSBjb21taXQsIGFuZCB0aGVuIHlvdSBmb3JjZSBwdXNoIHlvdXIgbG9jYWwgVEhSSUZULTk5OTktdGFrZS0yIGludG8gcmVtb3RlIFRIUklGVC05OTk5IHdoaWNoIHJlcHJlc2VudHMgeW91ciBwdWxsIHJlcXVlc3QsIHJlcGxhY2luZyBhbGwgdGhlIGNvbW1pdHMgd2l0aCB0aGUgbmV3IG9uZS4KKworIApkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUT1JTIGIvQ09OVFJJQlVUT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk1NGY4Li4wMDAwMDAwCi0tLSBhL0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLUNoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+Ci0tVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhCi0KLU5pdGF5IDxuaXRheWpAZ21haWwuY29tPgotLVN1cHBvcnQgZm9yICJtYWtlIGNoZWNrIgotCi1XaWxsaWFtIE1vcmdhbiA8d0BhZGFwLnR2PgotLU1pc2NlbGxhbmVvdXMgUnVieSBpbXByb3ZlbWVudHMKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1SZXN0cnVjdHVyaW5nIHRoZSB3YXkgQXV0b2NvbmYgaXMgdXNlZAotCi1QYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgotLVNtYWxsdGFsayBiaW5kaW5ncwotCi1EYXZlIFNpbXBzb24gPGRhdmVAcG93ZXJzZXQuY29tPgotLUJldHRlciBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRyYWNraW5nIGluIHRoZSBDKysgc2VydmVyCi0tTWlzY2VsbGFuZW91cyBmaXhlcwotCi1JZ29yIEFmYW5hc3lldiA8YWZhbkBldmVybm90ZS5jb20+Ci0tUGVybCBIdHRwQ2xpZW50IGFuZCBidWdmaXhlcwotCi1Ub2RkIEJlcm1hbiA8dGJlcm1hbkBpbWVlbS5jb20+Ci0tTWluR1cgcG9ydCBvZiB0aGUgY29tcGlsZXIKLS1DIyBiaW5kaW5ncwotLU1TIGJ1aWxkIHRhc2sKLQotLS0tLS0tLS0tLS0tLS0tLQotUmVsZWFzZSAyMDA3MDkxNwotLS0tLS0tLS0tLS0tLS0tLQotCi1EYXZlIEVuZ2JlcmcgPGVuZ2JlcmdAZ21haWwuY29tPgotLUphdmFCZWFuL0phdmFEb2MgZW5oYW5jZW1lbnRzCi0KLUFuZHJldyBNY0dlYWNoaWUgPGdlZWNob3JhbWFAZ21haWwuY29tPgotLUNvY29hL09iamVjdGl2ZS1DIHN1cHBvcnQKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1QeXRob24gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLCBmYXN0YmluYXJ5IHN1cHBvcnQKLQotQW5kcmV3IEx1dG9taXJza2kgPGFuZHlAbHV0by51cz4KLS1BZGRlZCBvcHRpb25hbC9yZXF1aXJlZCBrZXl3b3JkcyBmb3IgQysrIG9iamVjdHMKLS1BZGRlZCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgQysrIHN0cnVjdHMKLQotSm9oYW4gT3NrYXJzc29uIDxqb2hhbkBva3NhcnNzb24ubnU+Ci0tSmF2YSBmaW5kYnVncyBjb21wbGlhbmNlIGZpeGVzCi0KLVBhdWwgU2FhYiA8cHNAcG93ZXJzZXQuY29tPgotLUlQdjYgc3VwcG9ydCBmb3IgVFNvY2tldCBpbiBDKysvUHl0aG9uCi0KLUtldmluIENsYXJrIDxrZXZpbkBwb3dlcnNldC5jb20+Ci0tU2lnbmlmaWNhbnQgb3ZlcmhhdWwgb2YgUnVieSBjb2RlIGdlbmVyYXRpb24gYW5kIHNlcnZlcnMKLQotU2ltb24gRm9ybWFuIDxzZm9ybWFuQGdtYWlsLmNvbT4KLS1UUHJvY2Vzc29yRmFjdG9yeSBhYnN0cmFjdGlvbiBmb3IgSmF2YSBzZXJ2ZXJzCi0KLUpha2UgTHVjaWFuaSA8amFrZXJzQGdtYWlsLmNvbT4KLS1QZXJsIGNvZGUgZ2VuZXJhdGlvbiwgbGlicmFyaWVzLCB0ZXN0IGNvZGUKLQotRGF2aWQgUmVpc3MgPGRyZWlzc0BzdGFuZm9yZC5lZHU+Ci0tc3RyaW5ncy5oIGluY2x1ZGUgZml4IGZvciBiemVybwotLWVuZGlhbm5lc3MgZml4ZXMgb24gVEJpbmFyeVByb3RvY29sIGRvdWJsZSBzZXJpYWxpemF0aW9uCi0taW1wcm92ZWQgbnRvaGxsLGh0b25sbCBpbXBsZW1lbnRhdGlvbgotCi1EYW4gTGkgPGR0b0BkZXYuamF2YS5uZXQ+Ci0tSmF2YSBUZXN0U2VydmVyIGFuZCBUdXRvcmlhbCBGaXhlcwotCi1LZXZpbiBLbyA8a2V2aW4ucy5rb0BnbWFpbC5jb20+Ci0tRml4IGZvciB1bm5lY2Vzc2FyeSBzdGQ6OnN0cmluZyBjb3B5IGNvbnN0cnVjdGlvbiBpbiBQcm90b2NvbC9FeGNlcHRpb24KLQotUGF1bCBRdWVybmEgPHBxdWVybmFAYXBhY2hlLm9yZz4KLS1BdXRvY29uZiBlcnJvciBtZXNzYWdlIGZpeCBmb3IgbGliZXZlbnQgZGV0ZWN0aW9uCi0tY2xvY2tfZ2V0dGltZSBpbXBsZW1lbnRhdGlvbiBmb3IgT1NYCi0KLS0tLS0tLS0tLS0tLS0tLS0KLVJlbGVhc2UgMjAwNzA0MDEKLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RJU0NMQUlNRVIgYi9ESVNDTEFJTUVSCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdlN2VhLi4wMDAwMDAwCi0tLSBhL0RJU0NMQUlNRVIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFwYWNoZSBUaHJpZnQgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRiksIAotc3BvbnNvcmVkIGJ5IHRoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyAKLXVudGlsIGEgZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgYW5kIGRlY2lzaW9uIAotbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4KLVdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24gb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgCi1vZiB0aGUgY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUgZnVsbHkgZW5kb3JzZWQgYnkgdGhlIEFTRi4KZGlmZiAtLWdpdCBhL0xBTkdVQUdFUy5tZCBiL0xBTkdVQUdFUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEzY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvTEFOR1VBR0VTLm1kCkBAIC0wLDAgKzEsMzU1IEBACisjIEFwYWNoZSBUaHJpZnQgTGFuZ3VhZ2UgU3VwcG9ydCAjCisKK0xhc3QgTW9kaWZpZWQ6IDIwMTgtMTItMTcKKworR3VpZGFuY2UgRm9yOiAwLjEyLjAgb3IgbGF0ZXIKKworVGhyaWZ0IHN1cHBvcnRzIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBoYXMgYW4gaW1wcmVzc2l2ZSB0ZXN0IHN1aXRlIHRoYXQgZXhlcmNpc2VzIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcywgcHJvdG9jb2xzLCBhbmQgdHJhbnNwb3J0cyB0aGF0IHJlcHJlc2VudHMgYSBtYXRyaXggb2YgdGhvdXNhbmRzIG9mIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4gIEVhY2ggbGFuZ3VhZ2UgdHlwaWNhbGx5IGhhcyBhIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBhcyB3ZWxsIGFzIHN1cHBvcnQgbGlicmFyaWVzIC0gc29tZSBtYW5kYXRvcnkgYW5kIHNvbWUgb3B0aW9uYWwuICBBbGwgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBiZWxvdyB0byBoZWxwIHlvdSBhc3Nlc3Mgd2hldGhlciB5b3UgY2FuIHVzZSBBcGFjaGUgVGhyaWZ0IHdpdGggeW91ciBwcm9qZWN0LiAgT2J2aW91c2x5IHRoaXMgaXMgYSBjb21wbGV4IG1hdHJpeCB0byBtYWludGFpbiBhbmQgbWF5IG5vdCBiZSBjb3JyZWN0IGluIGFsbCBjYXNlcyAtIGlmIHlvdSBzcG90IGFuIGVycm9yIHBsZWFzZSBpbmZvcm0gdGhlIGRldmVsb3BlcnMgdXNpbmcgdGhlIG1haWxpbmcgbGlzdC4KKworQXBhY2hlIFRocmlmdCBoYXMgYSBjaG9pY2Ugb2YgdHdvIGJ1aWxkIHN5c3RlbXMuICBUaGUgYGF1dG9jb25mYCBidWlsZCBzeXN0ZW0gaXMgdGhlIG1vc3QgY29tcGxldGUgYnVpbGQgYW5kIGlzIHVzZWQgdG8gYnVpbGQgYWxsIHN1cHBvcnRlZCBsYW5ndWFnZXMuICBUaGUgYGNtYWtlYCBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gZGVzaWduYXRlZCBieSB0aGUgcHJvamVjdCB0byByZXBsYWNlIGBhdXRvY29uZmAgaG93ZXZlciB0aGlzIHRyYW5zaXRpb24gd2lsbCB0YWtlIHF1aXRlIHNvbWUgdGltZSB0byBjb21wbGV0ZS4KKworVGhlIExhbmd1YWdlL0xpYnJhcnkgTGV2ZWxzIGluZGljYXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZlcnNpb25zIHRoYXQgYXJlIHVzZWQgaW4gdGhlIFtjb250aW51b3VzIGludGVncmF0aW9uIGVudmlyb25tZW50c10oYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkgKEFwcHZleW9yLCBUcmF2aXMpIGZvciBBcGFjaGUgVGhyaWZ0LiAgT3RoZXIgbGFuZ3VhZ2UgbGV2ZWxzIG1heSBiZSBzdXBwb3J0ZWQgZm9yIGVhY2ggbGFuZ3VhZ2UsIGhvd2V2ZXIgdGVzdGVkIGxlc3MgdGhvcm91Z2hseTsgY2hlY2sgdGhlIFJFQURNRSBmaWxlIGluc2lkZSBlYWNoIGxpYiBkaXJlY3RvcnkgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4gIE5vdGUgdGhhdCB3aGlsZSBhIGxhbmd1YWdlIG1heSBjb250YWluIHN1cHBvcnQgZm9yIHByb3RvY29scywgdHJhbnNwb3J0cywgYW5kIHNlcnZlcnMsIHRoZSBleHRlbnQgdG8gd2hpY2ggZWFjaCBpcyB0ZXN0ZWQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBidWlsZCBwcm9jZXNzIHZhcmllcy4gIFRoZSBkZWZpbml0aXZlIGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBwcm9qZWN0IGlzIGNhbGxlZCB0aGUgImNyb3NzIiB0ZXN0IHdoaWNoIGV4ZWN1dGVzIGEgdGVzdCBtYXRyaXggd2l0aCBjbGllbnRzIGFuZCBzZXJ2ZXJzIGNvbW11bmljYXRpbmcgYWNyb3NzIGxhbmd1YWdlcy4KKworPHRhYmxlIHN0eWxlPSJmb250LXNpemU6IDYwJTsgcGFkZGluZzogMXB4OyI+Cis8dGhlYWQ+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8dGggcm93c3Bhbj0yPk9wZW4gSXNzdWVzPC90aD4KKzwvdHI+Cis8dHI+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjx0aD4mbmJzcDtGaWxlJm5ic3A7PC90aD48dGg+TWVtb3J5PC90aD48dGg+Jm5ic3A7UGlwZSZuYnNwOzwvdGg+PHRoPlNvY2tldDwvdGg+PHRoPiZuYnNwO1RMUyZuYnNwOzwvdGg+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0aD5GcmFtZWQ8L3RoPjx0aD4mbmJzcDtodHRwJm5ic3A7PC90aD48dGg+Jm5ic3A7emxpYiZuYnNwOzwvdGg+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCI+QmluYXJ5PC9hPjwvdGg+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCI+Q29tcGFjdDwvYT48L3RoPjx0aD4mbmJzcDtKU09OJm5ic3A7PC90aD48dGg+TXVsdGlwbGV4PC90aD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRoPkZvcmtpbmc8L3RoPjx0aD5Ob25ibG9ja2luZzwvdGg+PHRoPlNpbXBsZTwvdGg+PHRoPlRocmVhZGVkPC90aD48dGg+VGhyZWFkUG9vbDwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keT4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvYXMzL1JFQURNRS5tZCI+QWN0aW9uU2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPkFjdGlvblNjcmlwdCAzPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3MjIiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY19nbGliL1JFQURNRS5tZCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjQ4LjI8L3RkPjx0ZD4yLjU2LjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzg1NCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NwcC9SRUFETUUubWQiPkMrKzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5DKys5ODwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEzIj5DKys8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NzaGFycC9SRUFETUUubWQiPkMjPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Lk5FVCZuYnNwOzMuNSAvIG1vbm8mbmJzcDszLjIuOC4wPC90ZD48dGQ+Lk5FVCZuYnNwOzQuNi4xIC8gbW9ubyZuYnNwOzQuNi4yLjc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM2MiI+QyMgKC5ORVQpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jb2NvYS9SRUFETUUubWQiPkNvY29hPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5OCI+Q29jb2E8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NsL1JFQURNRS5tZCI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+U0JDTCAxLjQuNTwvdGQ+PHRkPlNCQ0wgMS40LjE1PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MiI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2QvUkVBRE1FLm1kIj5EbGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMDc1LjE8L3RkPjx0ZD4yLjA4My4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTc5MDQiPkQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2RhcnQvUkVBRE1FLm1kIj5EYXJ0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEwLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMjIuMTwvdGQ+PHRkPjEuMjQuMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI4MDA2Ij5EYXJ0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kZWxwaGkvUkVBRE1FLm1kIj5EZWxwaGk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yMDEwPC90ZD48dGQ+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE2NjAxIj5EZWxwaGk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25ldGNvcmUvUkVBRE1FLm1kIj4uTkVUIENvcmU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4xLjQ8L3RkPjx0ZD4yLjIuMTAxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMzExNzYiPi5ORVQgQ29yZTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZXJsL1JFQURNRS5tZCI+RXJsYW5nPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MTguMzwvdGQ+PHRkPjIwLjAuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzkwIj5Fcmxhbmc8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2dvL1JFQURNRS5tZCI+R288L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjcuNjwvdGQ+PHRkPjEuMTEuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE0MzA3Ij5HbzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaHMvUkVBRE1FLm1kIj5IYXNrZWxsPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4xMC4zPC90ZD48dGQ+OC4wLjI8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjcwNCI+SGFza2VsbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaGF4ZS9SRUFETUUubWQiPkhheGU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4zPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjIuMTwvdGQ+PHRkPjMuNC40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMjQzNDciPkhheGU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmEvUkVBRE1FLm1kIj5KYXZhIChTRSk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjguMF8xNTE8L3RkPjx0ZD4xLjguMF8xOTE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNCI+SmF2YSBTRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvamF2YW1lL1JFQURNRS5tZCI+SmF2YSAoTUUpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzc1OSI+SmF2YSBNRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvanMvUkVBRE1FLm1kIj5KYXZhc2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzQxOCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbHVhL1JFQURNRS5tZCI+THVhPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMjwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+NS4xLjU8L3RkPjx0ZD41LjIuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzIyNjU5Ij5MdWE8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGVqcy9SRUFETUUubWQiPm5vZGUuanM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD42Lng8L3RkPjx0ZD44Lng8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMyMCI+bm9kZS5qczwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbm9kZXRzL1JFQURNRS5tZCI+bm9kZS50czwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjEuNjwvdGQ+PHRkPjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjByZXNvbHV0aW9uJTIwJTNEJTIwVW5yZXNvbHZlZCUyMGFuZCUyMENvbXBvbmVudCUyMGluJTIwKCUyMlR5cGVTY3JpcHQlMjAtJTIwTGlicmFyeSUyMiklMjBPUkRFUiUyMEJZJTIwcHJpb3JpdHklMjBERVNDJTJDJTIwdXBkYXRlZCUyMERFU0MiPm5vZGUudHM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL29jYW1sL1JFQURNRS5tZCI+T0NhbWw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+NC4wNC4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM2NjAiPk9DYW1sPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9wZXJsL1JFQURNRS5tZCI+UGVybDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMjIuMTwvdGQ+PHRkPjUuMjYuMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEyIj5QZXJsPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9waHAvUkVBRE1FLm1kIj5QSFA8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD43LjAuMjI8L3RkPjx0ZD43LjIuMTA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjQzMSI+UEhQPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9weS9SRUFETUUubWQiPlB5dGhvbjwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuNy4xMiwgMy41LjI8L3RkPjx0ZD4yLjcuMTVyYzEsIDMuNi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTUiPlB5dGhvbjwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcmIvUkVBRE1FLm1kIj5SdWJ5PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4zLjFwMTEyPC90ZD48dGQ+Mi41LjFwNTc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNiI+UnVieTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcnMvUkVBRE1FLm1kIj5SdXN0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMTcuMDwvdGQ+PHRkPjEuMzAuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxNDIwIj5SdXN0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9zdC9SRUFETUUubWQiPlNtYWxsdGFsazwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NjEiPlNtYWxsdGFsazwvYT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8dGZvb3Q+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49MyBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzwvdHI+Cis8L3Rmb290PgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmluZGV4IDkwYjcwYzIuLjNiNmQ3ZDcgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UKKysrIGIvTElDRU5TRQpAQCAtMjEwLDgyICsyMTAsMTIgQEAKIGNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKLSAgbGliL2VybC9idWlsZC9iZWFtdmVyCi0gIGxpYi9lcmwvYnVpbGQvYnVpbGR0YXJnZXRzLm1rCi0gIGxpYi9lcmwvYnVpbGQvY29sb3JzLm1rCi0gIGxpYi9lcmwvYnVpbGQvZG9jcy5tawotICBsaWIvZXJsL2J1aWxkL21pbWUudHlwZXMKLSAgbGliL2VybC9idWlsZC9vdHAubWsKLSAgbGliL2VybC9idWlsZC9vdHBfc3ViZGlyLm1rCi0gIGxpYi9lcmwvYnVpbGQvcmF3X3Rlc3QubWsKLSAgbGliL2VybC9zcmMvTWFrZWZpbGUKK1BvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKKworICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQogCiBQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgogCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGZpbGVzIGNvbnRhaW4gc29tZSBwb3J0aW9ucyBvZiBjb2RlIGNvbnRyaWJ1dGVkIHVuZGVyCi10aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UgKHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCksIGFuZCByZWxpY2Vuc2VkCi11bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgotCi0gIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAotICBjb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5Ci0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagotICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCi0gIGxpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagotICBsaWIvcmIvbGliL3RocmlmdC5yYgotICBsaWIvc3QvUkVBRE1FCi0gIGxpYi9zdC90aHJpZnQuc3QKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLSAgdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CiAKQEAgLTI5NiwzNiArMjI2LDE0IEBACiAjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvbWQ1LltjaF0gY29tcG9uZW50czoKK0ZvciB0aGUgbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanM6CiAKIC8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgogCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZvciB0aGUgbGliL3JiL3NldHVwLnJiOiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raSwKLWxpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGFuZCBsaWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgY29tcG9uZW50czoKLSAgICAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwNyAgTWFya3VzIE1vdHRsCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIuMQotKHNlZSBkb2MvbGdwbC0yLjEudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UpCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyOTY0OGEwLi41MTE0NTJkCi0tLSBhL01ha2VmaWxlLmFtCisrKyBiL01ha2VmaWxlLmFtCkBAIC0xOSwxMCArMTksMTE3IEBACiAKIEFDTE9DQUxfQU1GTEFHUyA9IC1JIC4vYWNsb2NhbAogCi1TVUJESVJTID0gY29tcGlsZXIvY3BwIGxpYiB0ZXN0CitpZiBXSVRIX1BMVUdJTgorIyBUbyBlbmFibGUgYm9vdHN0cmFwLCBidWlsZCBvcmRlciBpcyBsaWIvY3BwIC0+IGNvbXBpbGVyIC0+IG90aGVycworU1VCRElSUyA9IGxpYi9jcHAgY29tcGlsZXIvY3BwIGxpYgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSBsaWIvY3BwL3Rlc3QKK2VuZGlmCitlbHNlCitTVUJESVJTID0gY29tcGlsZXIvY3BwIGxpYgorZW5kaWYKKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpZiBXSVRIX1RVVE9SSUFMCitTVUJESVJTICs9IHR1dG9yaWFsCitlbmRpZgogCiBkaXN0LWhvb2s6Ci0JZmluZCAkKGRpc3RkaXIpIC1uYW1lICcuW2EtekEtWjAtOV0qJyB8IHhhcmdzIHJtIC1yZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIFwoIC1pbmFtZSAiLkRTX1N0b3JlIiAtb3IgLWluYW1lICIuXyoiIC1vciAtaW5hbWUgIi5naXRpZ25vcmUiIFwpIHwgeGFyZ3Mgcm0gLXJmCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuZGVwcyIgLW9yIC1pbmFtZSAiLmxpYnMiIFwpIHwgeGFyZ3Mgcm0gLXJmCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuc3ZuIiAtb3IgLWluYW1lICIuZ2l0IiBcKSB8IHhhcmdzIHJtIC1yZgogCi1FWFRSQV9ESVNUID0gYm9vdHN0cmFwLnNoIGNsZWFudXAuc2ggZG9jIHR1dG9yaWFsIGNvbnRyaWIgXAotICAgICAgICAgICAgIENPTlRSSUJVVE9SUyBMSUNFTlNFIENIQU5HRVMgRElTQ0xBSU1FUiBOT1RJQ0UKK3ByaW50LXZlcnNpb246CisJQGVjaG8gJChQQUNLQUdFX1ZFUlNJT04pCisKKy5QSE9OWTogcHJlY3Jvc3MgY3Jvc3MKK3ByZWNyb3NzLSU6IGFsbAorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiBhbGwgcHJlY3Jvc3MtdGVzdCBwcmVjcm9zcy1saWIKKworZW1wdHkgOj0KK3NwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCitjb21tYSA6PSAsCisKK0NST1NTX0xBTkdTID0gQE1BWUJFX0NQUEAgQE1BWUJFX0NfR0xJQkAgQE1BWUJFX0NMQCBATUFZQkVfREAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9QWTNAIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AgQE1BWUJFX0RBUlRAIEBNQVlCRV9FUkxBTkdAIEBNQVlCRV9MVUFAIEBNQVlCRV9SU0AgQE1BWUJFX0RPVE5FVENPUkVAIEBNQVlCRV9OT0RFVFNACitDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoQ1JPU1NfTEFOR1MpKQorCitpZiBXSVRIX1BZMworQ1JPU1NfUFk9JChQWVRIT04zKQorZWxzZQorQ1JPU1NfUFk9JChQWVRIT04pCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorY3Jvc3NmZWF0dXJlOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1mZWF0dXJlcyAuKiAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCitlbHNlCisjIGZlYXR1cmUgdGVzdCBuZWVkcyBweXRob24gYnVpbGQKK2Nyb3NzZmVhdHVyZToKK2VuZGlmCisKK2Nyb3NzLSU6IHByZWNyb3NzIGNyb3NzZmVhdHVyZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLWNsaWVudCAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1yZWdleCAiJCoiCisKK2Nyb3NzOiBjcm9zcy0uKgorCitUSU1FUyA9IDEgMiAzCitmYWlsOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSB8fCB0cnVlCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW92ZXJ3cml0ZQorCSQoZm9yZWFjaCB2YXIsJChUSU1FUyksdGVzdC90ZXN0LnB5IC1zIHx8IHRydWU7dGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW1lcmdlOykKKworY29kZXNwZWxsX3NraXBfZmlsZXMgPSBcCisJKi5qYXIgXAorCSouY2xhc3MgXAorCSouc28gXAorCSouYSBcCisJKi5sYSBcCisJKi5vIFwKKwkqLnAxMiBcCisJKk9DYW1sTWFrZWZpbGUgXAorCS5rZXlzdG9yZSBcCisJLnRydXN0c3RvcmUgXAorCUNIQU5HRVMgXAorCWNvbmZpZy5zdWIgXAorCWNvbmZpZ3VyZSBcCisJZGVwY29tcCBcCisJbGlidG9vbC5tNCBcCisJb3V0cHV0LiogXAorCXJlYmFyIFwKKwl0aHJpZnQKKworc2tpcHBlZF9maWxlcyA9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChjb2Rlc3BlbGxfc2tpcF9maWxlcykpCisKK3N0eWxlLWxvY2FsOgorCWNvZGVzcGVsbCAtLXdyaXRlLWNoYW5nZXMgLS1za2lwPSQoc2tpcHBlZF9maWxlcykgLS1kaXNhYmxlLWNvbG9ycworCitFWFRSQV9ESVNUID0gXAorCS5jbGFuZy1mb3JtYXQgXAorCS5lZGl0b3Jjb25maWcgXAorCS50cmF2aXMueW1sIFwKKwkucnVzdGZtdC50b21sIFwKKwkuZG9ja2VyaWdub3JlIFwKKwlhcHB2ZXlvci55bWwgXAorCWJvd2VyLmpzb24gXAorCWJ1aWxkIFwKKwlib290c3RyYXAuc2ggXAorCWNsZWFudXAuc2ggXAorCUNNYWtlTGlzdHMudHh0IFwKKwljb21wb3Nlci5qc29uIFwKKwljb250cmliIFwKKwlDT05UUklCVVRJTkcubWQgXAorCWRlYmlhbiBcCisJZG9jIFwKKwlkb2FwLnJkZiBcCisJcGFja2FnZS5qc29uIFwKKwlzb25hci1wcm9qZWN0LnByb3BlcnRpZXMgXAorCUxBTkdVQUdFUy5tZCBcCisJTElDRU5TRSBcCisJQ0hBTkdFUyBcCisJTk9USUNFIFwKKwlSRUFETUUubWQgXAorCVRocmlmdC5wb2RzcGVjCmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2OWY2MS4uMDAwMDAwMAotLS0gYS9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotUmVsZWFzZSBOb3RlcyBmb3IgVGhyaWZ0IDIwMDgwNDExCi0KLS5lcXVhbHMgYW5kIC5oYXNoQ29kZSgpIGZvciBKYXZhIHNjdHVyY3RzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotSW1wcm92bWVudHMgdG8gdGhlIEMrKyBUU29ja2V0UG9vbCAoZGV2ZWxvcGVkIGJ5IGFraGlsKS4KLQotUEhQIChkZSlzZXJpYWxpemF0aW9uIGV4dGVuc2lvbiAoZGV2ZWxvcGVkIGJ5IGR3ZWF0aGVyZm9yZCkuCi0KLUFkZCBmYjMwMyB0byBjb250cmliIChkZXZlbG9wZWQgYnkgRmFjZWJvb2spLgotCi1USlNPTlByb3RvY29sIGZvciBDKysgYW5kIEphdmEgKGNvbnRyaWJ1dGVkIGJ5IENoYWQgV2FsdGVycyBvZiBQb3dlcnNldCkuCi0KLVN1cHBvcnQgZm9yICJtYWtlIGNoZWNrIiBhbmQgYmV0dGVyIHRlc3RzIChjb250cmlidXRlZCBieSBOaXRheSkuCi0KLVNtYWxsdGFsayBzdXBwb3J0IChjb250cmlidXRlZCBieSBQYXRyaWNrIENvbGxpc29uKS4KLQotRGF2ZSBTaW1wc29uIDxkYXZlQHBvd2Vyc2V0LmNvbT4KLUJldHRlciBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRyYWNraW5nIGluIHRoZSBDKysgc2VydmVyIChjb250cmlidXRlZCBieQotRGF2ZSBTaW1wc29uIG9mIFBvd2Vyc2V0KS4KLQotUGVybCBIdHRwQ2xpZW50IChjb250cmlidXRlZCBieSBJZ29yIEFmYW5hc3lldiBvZiBFdmVybm90ZSkuCi0KLUMjIHN1cHBvcnQgKGNvbnRyaWJ1dGVkIGJ5IFRvZGQgQmVybWFuIG9mIGltZWVtKS4KLQotTWluR1cgcG9ydCBvZiB0aGUgY29tcGlsZXIgKGNvbnRyaWJ1dGVkIGJ5IFRvZGQgQmVybWFuIG9mIGltZWVtKS4KLQotVG9ucyBvZiBzbWFsbCBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KLQotCi1SZWxlYXNlIE5vdGVzIGZvciBUaHJpZnQgMjAwNzA5MTcKLQotVEJpbmFyeVByb3RvY29sIG5vdyBpbmNsdWRlcyBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIG1lc3NhZ2VkLgotVGhpcyBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuICBQbGVhc2Ugc2VlIHRoZQotVEJpbmFyeVByb3RvY29sIGNvbnN0cnVjdG9yIGZvciBzdHJpY3RSZWFkXyBhbmQgc3RyaWN0V3JpdGVfLgotCi1BZGQgYmluYXJ5IHR5cGUgdG8gc3VwcG9ydCBub24tdGV4dCAic3RyaW5ncyIgaW4gSmF2YS4KLQotVFNvY2tldFBvb2wgZm9yIEMrKyAoZGV2ZWxvcGVkIGJ5IGpzb2JlbCkuCi0KLVN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHZpbSBhbmQgZW1hY3MgKGRldmVsb3BlZCBieSBoemhhbyBhbmQgbWFydGluKS4KLQotUGVybCBzdXBwb3J0IChjb250cmlidXRlZCBieSBKYWtlIEx1Y2lhbmkpLgotCi1Fcmxhbmcgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGNwaXJvKS4KLQotUnVieSBBUEkgb3ZlcmhhdWwgKGNvbnRyaWJ1dGVkIGJ5IEtldmluIENsYXJrIG9mIFBvd2Vyc2V0KS4KLQotSVB2NiBzdXBwb3J0IGluIEMrKyBhbmQgUHl0aG9uIChjb250cmlidXRlZCBieSBQYXVsIFNhYWIgb2YgUG93ZXJzZXQpLgotCi1SZWFkL1dyaXRlIGxvY2tzIChkZXZlbG9wZWQgYnkgYm96KS4KLQotT0NhbWwgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGlwcm9jdG9yKS4KLQotSHVtYW4tcmVhZGFibGUgc3RyaW5ncyBmcm9tIFRocmlmdCBzdHJ1Y3R1cmVzIGluIEMrKyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLUhhc2tlbGwgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGlwcm9jdG9yKS4KLQotU3VwcG9ydCBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEMrKyAoY29udHJpYnV0ZWQgYnkgQW5keSBMdXRvbWlyc2t5KS4KLQotU3VwcG9ydCBmb3Igb3BlcmF0b3I9PSBmb3IgVGhyaWZ0IHN0cnVjdHVyZXMgKGNvbnRyaWJ1dGVkIGJ5IEFuZHkgTHV0b21pcnNreSkuCi0KLVB5dGhvbi9DIG1vZHVsZSBmb3IgZmFzdCAoZGUpc2VyaWFsaXphdGlvbiAoY29udHJpYnV0ZWQgYnkgQmVuIE1hdXJlcikuCi0KLUxpbWl0ZWQgcmVmbGVjdGlvbiBmb3IgQysrIHNlcnZpY2VzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotUHl0aG9uIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGRlZmF1bHRzIHRvIC91c3IsIG92ZXJyaWRlIHdpdGggUFlfUFJFRklYLgotCi1TdXBwb3J0IGZvciBKYXZhYmVhbi1zdHlsZSBKYXZhIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IERhdmUgRW5nYmVyZykuCi0KLVREZW5zZVByb3RvY29sIGZvciBDKysgKGV4cGVyaW1lbnRhbCB3YXkgdG8gc2hyaW5rIHN0cnVjdHVyZXMpCi0oZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLUNvY29hL09iamVjdGl2ZSBDIHN1cHBvcnQgKGNvbnRyaWJ1dGVkIGJ5IEFuZHJldyBNY0dlYWNoaWUpLgotCi1UaHJpZnQgbm93IGJ1aWxkcyB3aXRob3V0IGxpYmV2ZW50LgotCi1UWmxpYlRyYW5zcG9ydCBmb3IgQysrIChjb21wcmVzcyBzZXJpYWxpemVkIHN0cnVjdHVyZXMpIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotVG9ucyBvZiBzbWFsbCBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQppbmRleCBjMjM5OTVhLi45MDJkYzhkIDEwMDY0NAotLS0gYS9OT1RJQ0UKKysrIGIvTk9USUNFCkBAIC0xLDUgKzEsNSBAQAogQXBhY2hlIFRocmlmdAotQ29weXJpZ2h0IDIwMDYtMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCitDb3B5cmlnaHQgMjAwNi0yMDE3IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KIAogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGY4YWY0Li4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi1BcGFjaGUgVGhyaWZ0IChhbiBBcGFjaGUgSW5jdWJhdG9yIHByb2plY3QpCi0KLUxhc3QgTW9kaWZpZWQ6IDIwMDktSmFuLTMwCi0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCi1hc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4gVGhyaWZ0IHByb3ZpZGVzIGNsZWFuCi1hYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgotbGV2ZWwgcHJvY2Vzc2luZy4gVGhlIGNvZGUgZ2VuZXJhdGlvbiBzeXN0ZW0gdGFrZXMgYSBzaW1wbGUgZGVmaW5pdGlvbgotbGFuZ3VhZ2UgYXMgaXRzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKLXVzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCi1hY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KLQotRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCB0YWtlIGEgZ2FuZGVyIGF0Ci10aGUgVGhyaWZ0IHdoaXRlcGFwZXIgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gb3IgYXQgdGhlIFJFQURNRSBmaWxlcwotaW4geW91ciBwYXJ0aWN1bGFyIHN1YmRpcmVjdG9yeSBvZiBpbnRlcmVzdC4KLQotSGVpcmFyY2h5Ci09PT09PT09PT0KLQotdGhyaWZ0LwotCi0gIGNvbXBpbGVyLwotICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIsIGltcGxlbWVudGVkIGluIEMrKy4KLQotICBsaWIvCi0gICAgQ29udGFpbnMgdGhlIFRocmlmdCBzb2Z0d2FyZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBzdWJkaXZpZGVkIGJ5Ci0gICAgbGFuZ3VhZ2Ugb2YgaW1wbGVtZW50YXRpb24uCi0KLSAgICBjcHAvCi0gICAgamF2YS8KLSAgICBwaHAvCi0gICAgcHkvCi0gICAgcmIvCi0KLSAgdGVzdC8KLQotICAgIENvbnRhaW5zIHNhbXBsZSBUaHJpZnQgZmlsZXMgYW5kIHRlc3QgY29kZSBhY3Jvc3MgdGhlIHRhcmdldCBwcm9ncmFtbWluZwotICAgIGxhbmd1YWdlcy4KLQotICB0dXRvcmlhbC8KLQotICAgIENvbnRhaW5zIGEgYmFzaWMgdHV0b3JpYWwgdGhhdCB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGV2ZWxvcCBzb2Z0d2FyZQotICAgIHVzaW5nIFRocmlmdC4KLQotUmVxdWlyZW1lbnRzCi09PT09PT09PT09PT0KLQotU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFJlcXVpcmVtZW50cyBmb3IKLWFuIHVwLXRvLWRhdGUgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMuCi0KLVJlc291cmNlcwotPT09PT09PT09Ci0KLU1vcmUgaW5mb3JtYXRpb24gYWJvdXQgVGhyaWZ0IGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgVGhyaWZ0IHdlYnBhZ2UgYXQ6Ci0KLSAgICAgaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3RocmlmdAotCi1BY2tub3dsZWRnbWVudHMKLT09PT09PT09PT09PT09PQotCi1UaHJpZnQgd2FzIGluc3BpcmVkIGJ5IHBpbGxhciwgYSBsaWdodHdlaWdodCBSUEMgdG9vbCB3cml0dGVuIGJ5IEFkYW0gRCdBbmdlbG8sCi1hbmQgYWxzbyBieSBHb29nbGUncyBwcm90b2NvbCBidWZmZXJzLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwKLW5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UKLWRvd25sb2FkZWQgYSB0YXJiYWxsLikgIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgotCi0JLi9ib290c3RyYXAuc2gKLQotT25jZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgYXJlIGdlbmVyYXRlZCwgdGhyaWZ0IGNhbiBiZSBjb25maWd1cmVkLgotRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86Ci0KLQkuL2NvbmZpZ3VyZQotCi1Zb3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGJvb3N0IGZpbGVzIGV4cGxpY2l0bHkuCi1JZiB5b3UgaW5zdGFsbGVkIGJvb3N0IGluIC91c3IvbG9jYWwsIHlvdSB3b3VsZCBydW4gY29uZmlndXJlIGFzIGZvbGxvd3M6Ci0KLQkuL2NvbmZpZ3VyZSAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbAotCi1Ob3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgdGhyaWZ0IEMrKyBsaWJyYXJ5IGlzIHR5cGljYWxseSBidWlsdCB3aXRoIGRlYnVnZ2luZwotc3ltYm9scyBpbmNsdWRlZC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZXNlIG9wdGlvbnMgeW91IHNob3VsZCB1c2UgdGhlCi1DWFhGTEFHUyBvcHRpb24gaW4gY29uZmlndXJlLCBhcyBzdWNoOgotCi0gICAgICAgIC4vY29uZmlndXJlIENYWEZMQUdTPSctZyAtTzInCi0gICAgICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJwotICAgICAgICAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0nLURERUJVR19NWV9GRUFUVVJFJwotCi1SdW4gLi9jb25maWd1cmUgLS1oZWxwIHRvIHNlZSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKLQotUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpbGwgaWdub3JlIHRoZSAtLXByZWZpeCBvcHRpb24KLWFuZCBqdXN0IGluc3RhbGwgd2hlcmV2ZXIgUHl0aG9uJ3MgZGlzdHV0aWxzIHB1dHMgaXQgKHVzdWFsbHkgYWxvbmcKLXRoZSBsaW5lcyBvZiAvdXNyL2xpYi9weXRob25YLlkvc2l0ZS1wYWNrYWdlcy8pLiAgSWYgeW91IG5lZWQgdG8gY29udHJvbAotd2hlcmUgdGhlIFB5dGhvbiBtb2R1bGVzIGFyZSBpbnN0YWxsZWQsIHNldCB0aGUgUFlfUFJFRklYIHZhcmlhYmxlLgotKERFU1RESVIgaXMgcmVzcGVjdGVkIGZvciBQeXRob24gYW5kIEMrKy4pCi0KLU1ha2UgdGhyaWZ0OgotCi0JbWFrZQotCi1Gcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBiZWNvbWUgc3VwZXJ1c2VyIGFuZCBkbzoKLQotCW1ha2UgaW5zdGFsbAotCi1Ob3RlIHRoYXQgc29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scwotYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMgKGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhpcyBhcHBsaWVzCi10byBKYXZhLCBSdWJ5LCBQSFApLgotCi1Mb29rIGZvciB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGxpYi88bGFuZ3VhZ2U+LyBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKLWluc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDllNmUxCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTkyIEBACitBcGFjaGUgVGhyaWZ0Cis9PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCithc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIHBvaW50LXRvLXBvaW50IFJQQy4gVGhyaWZ0IHByb3ZpZGVzIAorY2xlYW4gYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KK2xldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KK2xhbmd1YWdlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKK3VzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworIVtBcGFjaGUgVGhyaWZ0IExheWVyZWQgQXJjaGl0ZWN0dXJlXShkb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nKQorCitUaHJpZnQgbWFrZXMgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgd3JpdHRlbiBpbiBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcyB0byBzaGFyZSBkYXRhIGFuZCBjYWxsIHJlbW90ZSBwcm9jZWR1cmVzLiAgV2l0aCBzdXBwb3J0IAorZm9yIFsyNSBwcm9ncmFtbWluZyBsYW5ndWFnZXNdKExBTkdVQUdFUy5tZCksIGNoYW5jZXMgYXJlIFRocmlmdCAKK3N1cHBvcnRzIHRoZSBsYW5ndWFnZXMgdGhhdCB5b3UgY3VycmVudGx5IHVzZS4KKworVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCithY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KKworRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzZWUgdGhlIFRocmlmdAord2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlCitpbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgorCitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitQcm9qZWN0IEhpZXJhcmNoeQorPT09PT09PT09PT09PT09PT0KKwordGhyaWZ0LworCisgIGNvbXBpbGVyLworCisgICAgQ29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciwgaW1wbGVtZW50ZWQgaW4gQysrLgorCisgIGxpYi8KKworICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQorICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgorCisgICAgY3BwLworICAgIGdvLworICAgIGphdmEvCisgICAgcGhwLworICAgIHB5LworICAgIHJiLworICAgIC4uLgorCisgIHRlc3QvCisKKyAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKKyAgICBsYW5ndWFnZXMuCisKKyAgdHV0b3JpYWwvCisKKyAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKKyAgICB1c2luZyBUaHJpZnQuCisKK0RldmVsb3BtZW50Cis9PT09PT09PT09PQorCitUbyBidWlsZCB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGJ1aWxkcyB0aGUgcHJvamVjdCB5b3Ugc2hvdWxkIHVzZSBkb2NrZXIuCitXZSBoYXZlIFtjb21wcmVoZW5zaXZlIGJ1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgZG9ja2VyXShidWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworUmVxdWlyZW1lbnRzCis9PT09PT09PT09PT0KKworU2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwgZm9yIGEgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMgKG1heSBiZSBzdGFsZSkuICBBbHRlcm5hdGl2ZWx5IHNlZSB0aGUgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50cyBmb3IgYSBsaXN0IG9mIHByZXJlcXVpc2l0ZXMuCisKK1Jlc291cmNlcworPT09PT09PT09CisKK01vcmUgaW5mb3JtYXRpb24gYWJvdXQgVGhyaWZ0IGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgVGhyaWZ0IHdlYnBhZ2UgYXQ6CisKKyAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK0Fja25vd2xlZGdtZW50cworPT09PT09PT09PT09PT09CisKK1RocmlmdCB3YXMgaW5zcGlyZWQgYnkgcGlsbGFyLCBhIGxpZ2h0d2VpZ2h0IFJQQyB0b29sIHdyaXR0ZW4gYnkgQWRhbSBEJ0FuZ2VsbywKK2FuZCBhbHNvIGJ5IEdvb2dsZSdzIHByb3RvY29sIGJ1ZmZlcnMuCisKK0luc3RhbGxhdGlvbgorPT09PT09PT09PT09CisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSB0aGUgZmlyc3QgdGltZSBvdXQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCB5b3Ugd2lsbAorbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdQorZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKyAgICAuL2Jvb3RzdHJhcC5zaAorCitPbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuCitGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworICAgIC4vY29uZmlndXJlCisKK1lvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vc3QgZmlsZXMgZXhwbGljaXRseS4KK0lmIHlvdSBpbnN0YWxsZWQgYm9vc3QgaW4gL3Vzci9sb2NhbCwgeW91IHdvdWxkIHJ1biBjb25maWd1cmUgYXMgZm9sbG93czoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsCisKK05vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSB0aHJpZnQgQysrIGxpYnJhcnkgaXMgdHlwaWNhbGx5IGJ1aWx0IHdpdGggZGVidWdnaW5nCitzeW1ib2xzIGluY2x1ZGVkLiBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhlc2Ugb3B0aW9ucyB5b3Ugc2hvdWxkIHVzZSB0aGUKK0NYWEZMQUdTIG9wdGlvbiBpbiBjb25maWd1cmUsIGFzIHN1Y2g6CisKKyAgICAuL2NvbmZpZ3VyZSBDWFhGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENQUEZMQUdTPSctRERFQlVHX01ZX0ZFQVRVUkUnCisKK1RvIGVuYWJsZSBnY292IHJlcXVpcmVkIG9wdGlvbnMgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIGVuYWJsZSB0aGVtOgorCisgICAgLi9jb25maWd1cmUgIC0tZW5hYmxlLWNvdmVyYWdlCisKK1J1biAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gc2VlIG90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworCitQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgUHl0aG9uIGxpYnJhcnkgd2lsbCBpZ25vcmUgdGhlIC0tcHJlZml4IG9wdGlvbgorYW5kIGp1c3QgaW5zdGFsbCB3aGVyZXZlciBQeXRob24ncyBkaXN0dXRpbHMgcHV0cyBpdCAodXN1YWxseSBhbG9uZwordGhlIGxpbmVzIG9mIC91c3IvbGliL3B5dGhvblguWS9zaXRlLXBhY2thZ2VzLykuICBJZiB5b3UgbmVlZCB0byBjb250cm9sCit3aGVyZSB0aGUgUHl0aG9uIG1vZHVsZXMgYXJlIGluc3RhbGxlZCwgc2V0IHRoZSBQWV9QUkVGSVggdmFyaWFibGUuCisoREVTVERJUiBpcyByZXNwZWN0ZWQgZm9yIFB5dGhvbiBhbmQgQysrLikKKworTWFrZSB0aHJpZnQ6CisKKwltYWtlCisKK0Zyb20gdGhlIHRvcCBkaXJlY3RvcnksIGJlY29tZSBzdXBlcnVzZXIgYW5kIGRvOgorCisJbWFrZSBpbnN0YWxsCisKK05vdGUgdGhhdCBzb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzCitiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcyAoYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGlzIGFwcGxpZXMKK3RvIEphdmEsIFJ1YnksIFBIUCkuCisKK0xvb2sgZm9yIHRoZSBSRUFETUUubWQgZmlsZSBpbiB0aGUgbGliLzxsYW5ndWFnZT4vIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQoraW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorCitUZXN0aW5nCis9PT09PT09CisKK1RoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBjbGllbnQgbGlicmFyeSB0ZXN0cyB0aGF0IGNhbiBhbGwgYmUgcnVuCitmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorCisgICAgICAgICAgbWFrZSAtayBjaGVjaworCitUaGlzIHdpbGwgbWFrZSBhbGwgb2YgdGhlIGxpYnJhcmllcyAoYXMgbmVjZXNzYXJ5KSwgYW5kIHJ1biB0aHJvdWdoCit0aGUgdW5pdCB0ZXN0cyBkZWZpbmVkIGluIGVhY2ggb2YgdGhlIGNsaWVudCBsaWJyYXJpZXMuIElmIGEgc2luZ2xlCitsYW5ndWFnZSBmYWlscywgdGhlIG1ha2UgY2hlY2sgd2lsbCBjb250aW51ZSBvbiBhbmQgcHJvdmlkZSBhIHN5bm9wc2lzCithdCB0aGUgZW5kLgorCitUbyBydW4gdGhlIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUsIHBsZWFzZSBydW46CisKKyAgICAgICAgICBtYWtlIGNyb3NzCisKK1RoaXMgd2lsbCBydW4gYSBzZXQgb2YgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50IGxhbmd1YWdlIGNsaWVudHMgYW5kCitzZXJ2ZXJzLgorCisKZGlmZiAtLWdpdCBhL1RocmlmdC1zd2lmdDMucG9kc3BlYyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZjMDBiCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjCkBAIC0wLDAgKzEsMTYgQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQtc3dpZnQzIgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzkuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuMTAnCisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MS4wLjAiIH0KKyAgcy5zb3VyY2VfZmlsZXMgID0gImxpYi9zd2lmdC9Tb3VyY2VzLyouc3dpZnQiCitlbmQKZGlmZiAtLWdpdCBhL1RocmlmdC5wb2RzcGVjIGIvVGhyaWZ0LnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC5wb2RzcGVjCkBAIC0wLDAgKzEsMTggQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQiCisgIHMudmVyc2lvbiAgICAgICA9ICIxLjAuMCIKKyAgcy5zdW1tYXJ5ICAgICAgID0gIkFwYWNoZSBUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbiBhc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4iCisgIHMuZGVzY3JpcHRpb24gICA9IDw8LURFU0MKK1RoZSBBcGFjaGUgVGhyaWZ0IHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNvZnR3YXJlIGZyYW1ld29yayBmb3IgbmV0d29ya2VkIHNlcnZpY2VzIGRldmVsb3BtZW50IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgIERFU0MKKyAgcy5ob21lcGFnZSAgICAgID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgcy5saWNlbnNlICAgICAgID0geyA6dHlwZSA9PiAnQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJywgOnVybCA9PiAnaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcgfQorICBzLmF1dGhvciAgICAgICAgPSB7ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiID0+ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciIH0KKyAgcy5yZXF1aXJlc19hcmMgID0gdHJ1ZQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc3LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjgnCisgIHMuaW9zLmZyYW1ld29yayA9ICdDRk5ldHdvcmsnCisgIHMub3N4LmZyYW1ld29yayA9ICdDb3JlU2VydmljZXMnCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICdsaWIvY29jb2Evc3JjLyoqLyoue2gsbSxzd2lmdH0nCitlbmQKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCBiL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDExOThiCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00CkBAIC0wLDAgKzEsNTQgQEAKK2RubAorZG5sIENoZWNrIEJpc29uIHZlcnNpb24KK2RubCBBQ19QUk9HX0JJU09OKFtNSU5fVkVSU0lPTj0yLjRdKQorZG5sCitkbmwgV2lsbCBkZWZpbmUgQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTiBpZiBBdXRvbWFrZSBpcyA8IDEuMTEKK2RubCBmb3IgdXNlIHdpdGggLmggaW5jbHVkZXMuCitkbmwKKworQUNfREVGVU4oW0FDX1BST0dfQklTT05dLCBbCitpZiB0ZXN0ICJ4JDEiID0gIngiIDsgdGhlbgorICBiaXNvbl9yZXF1aXJlZF92ZXJzaW9uPSIyLjQiCitlbHNlCisgIGJpc29uX3JlcXVpcmVkX3ZlcnNpb249IiQxIgorZmkKKworQUNfQ0hFQ0tfUFJPRyhoYXZlX3Byb2dfYmlzb24sIFtiaXNvbl0sIFt5ZXNdLFtub10pCisKK0FDX0RFRklORV9VTlFVT1RFRChbQklTT05fVkVSU0lPTl0sIFswLjBdLCBbQmlzb24gdmVyc2lvbiBpZiBiaXNvbiBpcyBub3QgYXZhaWxhYmxlXSkKKworI0RvIG5vdCB1c2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlcywgdXNlIG5ld2VyICouaGgKK2Jpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249ZmFsc2UKKworaWYgdGVzdCAiJGhhdmVfcHJvZ19iaXNvbiIgPSAieWVzIiA7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYmlzb24gdmVyc2lvbiA+PSAkYmlzb25fcmVxdWlyZWRfdmVyc2lvbl0pCisgIGJpc29uX3ZlcnNpb249YGJpc29uIC0tdmVyc2lvbiB8IGhlYWQgLW4gMSB8IGN1dCAnLWQgJyAtZiA0YAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0JJU09OX1ZFUlNJT05dLCBbJGJpc29uX3ZlcnNpb25dLCBbRGVmaW5lcyBiaXNvbiB2ZXJzaW9uXSkKKyAgaWYgdGVzdCAiJGJpc29uX3ZlcnNpb24iIFw8ICIkYmlzb25fcmVxdWlyZWRfdmVyc2lvbiIgOyB0aGVuCisgICAgQklTT049OgorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBBQ19NU0dfRVJST1IoW0Jpc29uIHZlcnNpb24gJGJpc29uX3JlcXVpcmVkX3ZlcnNpb24gb3IgaGlnaGVyIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0hXSkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgQklTT049Ymlzb24KKyAgICBBQ19TVUJTVChCSVNPTikKKworICAgICNWZXJpZnkgYXV0b21ha2UgdmVyc2lvbiAxLjExIGhlYWRlcnMgZm9yIHl5IGZpbGVzIGFyZSAuaCwgPiAxLjEyIHVzZXMgLmhoCisgICAgYXV0b21ha2VfdmVyc2lvbj1gYXV0b21ha2UgLS12ZXJzaW9uIHwgaGVhZCAtbiAxIHwgY3V0ICctZCAnIC1mIDRgCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtBVVRPTUFLRV9WRVJTSU9OXSwgWyRhdXRvbWFrZV92ZXJzaW9uXSwgW0RlZmluZXMgYXV0b21ha2UgdmVyc2lvbl0pCisKKyAgICBpZiB0ZXN0ICIkYXV0b21ha2VfdmVyc2lvbiIgXDwgIjEuMTIiIDsgdGhlbgorICAgICAgI1VzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGUKKyAgICAgIGJpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249dHJ1ZQorICAgICAgZWNobyAiQXV0b21ha2UgdmVyc2lvbiA8IDEuMTIiCisgICAgICBBQ19ERUZJTkUoW0JJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT05dLCBbMV0sIFtVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlXSkKKyAgICBmaQorICBmaQorZWxzZQorICBCSVNPTj06CisgIEFDX01TR19SRVNVTFQoW05PXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKFtCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OXSwgW3Rlc3QgeCRiaXNvbl91c2VfcGFyc2VyX2hfZXh0ZW5zaW9uID0geHRydWVdKQorQUNfU1VCU1QoQklTT04pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CmluZGV4IGU1NmJiNzMuLmQ1NDAzOTUgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAorKysgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKQEAgLTEsMTcgKzEsMTkgQEAKLSMjIyMjIGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYXhfYm9vc3RfYmFzZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9ib29zdF9iYXNlLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQk9PU1RfQkFTRShbTUlOSU1VTS1WRVJTSU9OXSkKKyMgICBBWF9CT09TVF9CQVNFKFtNSU5JTVVNLVZFUlNJT05dLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQogIwogIyBERVNDUklQVElPTgogIwogIyAgIFRlc3QgZm9yIHRoZSBCb29zdCBDKysgbGlicmFyaWVzIG9mIGEgcGFydGljdWxhciB2ZXJzaW9uIChvciBuZXdlcikKICMKLSMgICBJZiBubyBwYXRoIHRvIHRoZSBpbnN0YWxsZWQgYm9vc3QgbGlicmFyeSBpcyBnaXZlbiB0aGUgbWFjcm8KLSMgICBzZWFyY2hzIHVuZGVyIC91c3IsIC91c3IvbG9jYWwsIC9vcHQgYW5kIC9vcHQvbG9jYWwgYW5kIGV2YWx1YXRlcwotIyAgIHRoZSAkQk9PU1RfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRnVydGhlciBkb2N1bWVudGF0aW9uIGlzCi0jICAgYXZhaWxhYmxlIGF0IDxodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0L2luZGV4Lmh0bWw+LgorIyAgIElmIG5vIHBhdGggdG8gdGhlIGluc3RhbGxlZCBib29zdCBsaWJyYXJ5IGlzIGdpdmVuIHRoZSBtYWNybyBzZWFyY2hzCisjICAgdW5kZXIgL3VzciwgL3Vzci9sb2NhbCwgL29wdCBhbmQgL29wdC9sb2NhbCBhbmQgZXZhbHVhdGVzIHRoZQorIyAgICRCT09TVF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0CisjICAgPGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QvaW5kZXguaHRtbD4uCiAjCiAjICAgVGhpcyBtYWNybyBjYWxsczoKICMKQEAgLTIxLDE3OCArMjMsMjc5IEBACiAjCiAjICAgICBIQVZFX0JPT1NUCiAjCi0jIExBU1QgTU9ESUZJQ0FUSU9OCisjIExJQ0VOU0UKICMKLSMgICAyMDA3LTA3LTI4CisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIyAgIENvcHlyaWdodCAoYykgMjAwOSBQZXRlciBBZG9scGhzCiAjCi0jIENPUFlMRUZUCi0jCi0jICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgotIwotIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAotIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAotIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCA0NQorCisjIGV4YW1wbGUgYm9vc3QgcHJvZ3JhbSAobmVlZCB0byBwYXNzIHZlcnNpb24pCittNF9kZWZpbmUoW19BWF9CT09TVF9CQVNFX1BST0dSQU1dLAorICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK11dLFtbCisodm9pZCkgKCh2b2lkKXNpemVvZihjaGFyWzEgLSAyKiEhKChCT09TVF9WRVJTSU9OKSA8ICgkMSkpXSkpOworXV0pXSkKIAogQUNfREVGVU4oW0FYX0JPT1NUX0JBU0VdLAogWwogQUNfQVJHX1dJVEgoW2Jvb3N0XSwKLQlBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0QDw6QD1ESVJAOj5AXSwgW3VzZSBib29zdCAoZGVmYXVsdCBpcyB5ZXMpIC0gaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcm9vdCBkaXJlY3RvcnkgZm9yIGJvb3N0IChvcHRpb25hbCldKSwKLQlbCi0gICAgaWYgdGVzdCAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgotCQl3YW50X2Jvb3N0PSJubyIKLSAgICBlbGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIHdhbnRfYm9vc3Q9InllcyIKLSAgICAgICAgYWNfYm9vc3RfcGF0aD0iIgotICAgIGVsc2UKLQkgICAgd2FudF9ib29zdD0ieWVzIgotICAgICAgICBhY19ib29zdF9wYXRoPSIkd2l0aHZhbCIKLQlmaQorICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdEA8OkA9QVJHQDo+QF0sCisgICAgW3VzZSBCb29zdCBsaWJyYXJ5IGZyb20gYSBzdGFuZGFyZCBsb2NhdGlvbiAoQVJHPXllcyksCisgICAgIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiAoQVJHPTxwYXRoPiksCisgICAgIG9yIGRpc2FibGUgaXQgKEFSRz1ubykKKyAgICAgQDw6QEFSRz15ZXNAOj5AIF0pXSwKKyAgICBbCisgICAgIEFTX0NBU0UoWyR3aXRodmFsXSwKKyAgICAgICBbbm9dLFt3YW50X2Jvb3N0PSJubyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3llc10sW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iJHdpdGh2YWwiXSkKICAgICBdLAogICAgIFt3YW50X2Jvb3N0PSJ5ZXMiXSkKIAotaWYgdGVzdCAieCR3YW50X2Jvb3N0IiA9ICJ4eWVzIjsgdGhlbgotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcT1pZmVsc2UoWyQxXSwgLDEuMjAuMCwkMSkKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfc2hvcnRlbj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9tYWpvcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcKSdgCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLQlpZiB0ZXN0ICJ4JGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3IiID0gIngiIDsgdGhlbgotCQlib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPSIwIgotICAgIAlmaQotCVdBTlRfQk9PU1RfVkVSU0lPTj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9taW5vciBcKiAxMDAgXCsgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3JgCi0JQUNfTVNHX0NIRUNLSU5HKGZvciBib29zdGxpYiA+PSAkYm9vc3RfbGliX3ZlcnNpb25fcmVxKQotCXN1Y2NlZWRlZD1ubwogCi0JZG5sIGZpcnN0IHdlIGNoZWNrIHRoZSBzeXN0ZW0gbG9jYXRpb24gZm9yIGJvb3N0IGxpYnJhcmllcwotCWRubCB0aGlzIGxvY2F0aW9uIGlzdCBjaG9zZW4gaWYgYm9vc3QgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgd2l0aCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbgotCWRubCBvciBpZiB5b3UgaW5zdGFsbCBib29zdCB3aXRoIFJQTQotCWlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotCQlCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoL2xpYiIKLQkJQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZSIKLQllbHNlCi0JCWZvciBhY19ib29zdF9wYXRoX3RtcCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KLQkJCWlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCI7IHRoZW4KLQkJCQlCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoX3RtcC9saWIiCi0JCQkJQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCi0JCQkJYnJlYWs7Ci0JCQlmaQotCQlkb25lCi0JZmkKK0FDX0FSR19XSVRIKFtib29zdC1saWJkaXJdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdC1saWJkaXI9TElCX0RJUl0sCisgICAgW0ZvcmNlIGdpdmVuIGRpcmVjdG9yeSBmb3IgYm9vc3QgbGlicmFyaWVzLgorICAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGxpYnJhcnkgcGF0aCBkZXRlY3Rpb24sCisgICAgIHNvIHVzZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIGRlZmF1bHQgbGlicmFyeSBkZXRlY3Rpb24gZmFpbHMKKyAgICAgYW5kIHlvdSBrbm93IGV4YWN0bHkgd2hlcmUgeW91ciBib29zdCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQuXSldLAorICBbCisgICBBU19JRihbdGVzdCAtZCAiJHdpdGh2YWwiXSwKKyAgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aD0iJHdpdGh2YWwiXSwKKyAgICBbQUNfTVNHX0VSUk9SKFstLXdpdGgtYm9vc3QtbGliZGlyIGV4cGVjdGVkIGRpcmVjdG9yeSBuYW1lXSldKQorICBdLAorICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiJdKQogCi0JQ1BQRkxBR1NfU0FWRUQ9IiRDUFBGTEFHUyIKLQlDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKLQlleHBvcnQgQ1BQRkxBR1MKK0JPT1NUX0xERkxBR1M9IiIKK0JPT1NUX0NQUEZMQUdTPSIiCitBU19JRihbdGVzdCAieCR3YW50X2Jvb3N0IiA9ICJ4eWVzIl0sCisgICAgICBbX0FYX0JPT1NUX0JBU0VfUlVOREVURUNUKFskMV0sWyQyXSxbJDNdKV0pCitBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKK0FDX1NVQlNUKEJPT1NUX0xERkxBR1MpCitdKQogCi0JTERGTEFHU19TQVZFRD0iJExERkxBR1MiCi0JTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xERkxBR1MiCi0JZXhwb3J0IExERkxBR1MKIAotCUFDX0xBTkdfUFVTSChDKyspCi0gICAgIAlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0JQCU6QGluY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotCV1dLCBbWwotCSNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLQkvLyBFdmVyeXRoaW5nIGlzIG9rYXkKLQkjZWxzZQotCSMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotCSNlbmRpZgotCV1dKV0sWworIyBjb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgaW4gJDIgdG8gbnVtZXJpYyBhbmQgYWZmZWN0IHRvIHBvbHltb3JwaGljIHZhciAkMQorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05dLFsKKyAgQVNfSUYoW3Rlc3QgIngkMiIgPSAieCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iMS4yMC4wIl0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIkMiJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zaG9ydGVuPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIiA9ICJ4Il0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW1lvdSBzaG91bGQgYXQgbGVhc3Qgc3BlY2lmeSBsaWJib29zdCBtYWpvciB2ZXJzaW9uXSldKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIiA9ICJ4Il0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIlgkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yIiA9ICJYIl0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQ9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIFwqIDEwMCBcKyAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yYAorICBBU19WQVJfU0VUKCQxLCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVCkKK10pCisKK2RubCBSdW4gdGhlIGRldGVjdGlvbiBvZiBib29zdCBzaG91bGQgYmUgcnVuIG9ubHkgaWYgJHdhbnRfYm9vc3QKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1RdLFsKKyAgICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OKFdBTlRfQk9PU1RfVkVSU0lPTixbJDFdKQorICAgIHN1Y2NlZWRlZD1ubworCisKKyAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCisgICAgZG5sIE9uIDY0LWJpdCBzeXN0ZW1zIGNoZWNrIGZvciBzeXN0ZW0gbGlicmFyaWVzIGluIGJvdGggbGliNjQgYW5kIGxpYi4KKyAgICBkbmwgVGhlIGZvcm1lciBpcyBzcGVjaWZpZWQgYnkgRkhTLCBidXQgZS5nLiBEZWJpYW4gZG9lcyBub3QgYWRoZXJlIHRvCisgICAgZG5sIHRoaXMgKGFzIGl0IHJpc2VzIHByb2JsZW1zIGZvciBnZW5lcmljIG11bHRpLWFyY2ggc3VwcG9ydCkuCisgICAgZG5sIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGNob3NlbiBieSBkZWZhdWx0IHdoZW4gbm8gbGlicmFyaWVzCisgICAgZG5sIGFyZSBmb3VuZCwgZS5nLiB3aGVuIG9ubHkgaGVhZGVyLW9ubHkgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQhCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW3g4Nl82NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYngzMiBsaWIgbGliNjQiXSwKKyAgICAgIFtwcGM2NHxwb3dlcnBjNjR8czM5MHh8c3BhcmM2NHxhYXJjaDY0fHBwYzY0bGV8cG93ZXJwYzY0bGV8cmlzY3Y2NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCJdLAorICAgICAgW2xpYnN1YmRpcnM9ImxpYiJdCisgICAgKQorCisgICAgZG5sIGFsbG93IGZvciByZWFsIG11bHRpLWFyY2ggcGF0aHMgZS5nLiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LiBHaXZlCisgICAgZG5sIHRoZW0gcHJpb3JpdHkgb3ZlciB0aGUgb3RoZXIgcGF0aHMgc2luY2UsIGlmIGxpYnMgYXJlIGZvdW5kIHRoZXJlLCB0aGV5CisgICAgZG5sIGFyZSBhbG1vc3QgYXNzdXJlZGx5IHRoZSBvbmVzIGRlc2lyZWQuCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW2k/ODZdLFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9Il0sCisgICAgICBbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30iXQorICAgICkKKworICAgIGRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKKyAgICBkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KKyAgICBkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAhPSAieCJdLFsKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGluY2x1ZGVzIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0pCisgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdLFsKKyAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIKKyAgICAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluICRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzOyBkbworICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBsaWIgcGF0aCBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIl0pCisgICAgICAgICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiBdLFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBdLAorICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKQorICAgICAgICAgICBkb25lXSxbCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICBdLFsKKyAgICAgICAgaWYgdGVzdCBYIiRjcm9zc19jb21waWxpbmciID0gWHllczsgdGhlbgorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9JG11bHRpYXJjaF9saWJzdWJkaXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9IiRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzIgorICAgICAgICBmaQorICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJHNlYXJjaF9saWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgXSkKKworICAgIGRubCBvdmVyd3JpdGUgbGQgZmxhZ3MgaWYgd2UgaGF2ZSByZXF1aXJlZCBzcGVjaWFsIGRpcmVjdG9yeSB3aXRoCisgICAgZG5sIC0td2l0aC1ib29zdC1saWJkaXIgcGFyYW1ldGVyCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiICE9ICJ4Il0sCisgICAgICAgICAgW0JPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIl0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTildKQorICAgIENQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCisgICAgZXhwb3J0IENQUEZMQUdTCisKKyAgICBMREZMQUdTX1NBVkVEPSIkTERGTEFHUyIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKKyAgICBleHBvcnQgTERGTEFHUworCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQorICAgIEFDX0xBTkdfUFVTSChDKyspCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNKCRXQU5UX0JPT1NUX1ZFUlNJT04pXSxbCiAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotCXN1Y2NlZWRlZD15ZXMKLQlmb3VuZF9zeXN0ZW09eWVzCi0gICAgICAgCV0sWwotICAgICAgIAldKQotCUFDX0xBTkdfUE9QKFtDKytdKQorICAgIHN1Y2NlZWRlZD15ZXMKKyAgICBmb3VuZF9zeXN0ZW09eWVzCisgICAgICAgIF0sWworICAgICAgICBdKQorICAgIEFDX0xBTkdfUE9QKFtDKytdKQogCiAKIAotCWRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKLQlkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCi0JaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIjsgdGhlbgotCQlfdmVyc2lvbj0wCi0JCWlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICAgICAgICAgCQlCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoL2xpYiIKLQkJCWlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aCI7IHRoZW4KLQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAotCQkJCQlWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQlfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0JCQkJCWZpCi0JCQkJCVZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0JCQkJZG9uZQotCQkJZmkKLQkJZWxzZQotCQkJZm9yIGFjX2Jvb3N0X3BhdGggaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCi0JCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotCQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJCV92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKLQkJCQkJCVZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0JCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQkJX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotCSAgICAgICAgICAgICAgIAkJCQkJYmVzdF9wYXRoPSRhY19ib29zdF9wYXRoCi0JCQkJCQlmaQotCQkJCQlkb25lCi0JCQkJZmkKLQkJCWRvbmUKLQotCQkJVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCi0JCQlCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLQkJCUJPT1NUX0xERkxBR1M9Ii1MJGJlc3RfcGF0aC9saWIiCi0KLQkgICAgCQlpZiB0ZXN0ICJ4JEJPT1NUX1JPT1QiICE9ICJ4IjsgdGhlbgotCQkJCWlmIHRlc3QgLWQgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtZCAiJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVC9zdGFnZS9saWIiOyB0aGVuCi0JCQkJCXZlcnNpb25fZGlyPWBleHByIC8vJEJPT1NUX1JPT1QgOiAnLiovXCguKlwpJ2AKLQkJCQkJc3RhZ2VfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9kaXIgfCBzZWQgJ3MvYm9vc3RfLy8nIHwgc2VkICdzL18vLi9nJ2AKLQkJCSAgICAgICAgCXN0YWdlX3ZlcnNpb25fc2hvcnRlbj1gZXhwciAkc3RhZ2VfdmVyc2lvbiA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKLQkJCQkJVl9DSEVDSz1gZXhwciAkc3RhZ2VfdmVyc2lvbl9zaG9ydGVuIFw+XD0gJF92ZXJzaW9uYAotCQkJCSAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgotCQkJCQkJQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCi0JCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKLQkJCQkJCUJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIgotCQkJCQlmaQotCQkJCWZpCi0JICAgIAkJZmkKLQkJZmkKLQotCQlDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKLQkJZXhwb3J0IENQUEZMQUdTCi0JCUxERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgotCQlleHBvcnQgTERGTEFHUwotCi0JCUFDX0xBTkdfUFVTSChDKyspCi0JICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCQlAJTpAaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Ci0JCV1dLCBbWwotCQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JCS8vIEV2ZXJ5dGhpbmcgaXMgb2theQotCQkjZWxzZQotCQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkJI2VuZGlmCi0JCV1dKV0sWwotICAgICAgICAJQUNfTVNHX1JFU1VMVCh5ZXMpCi0JCXN1Y2NlZWRlZD15ZXMKLQkJZm91bmRfc3lzdGVtPXllcwotICAgICAgIAkJXSxbCi0JICAgICAgIAldKQotCQlBQ19MQU5HX1BPUChbQysrXSkKLQlmaQotCi0JaWYgdGVzdCAiJHN1Y2NlZWRlZCIgIT0gInllcyIgOyB0aGVuCi0JCWlmIHRlc3QgIiRfdmVyc2lvbiIgPSAiMCIgOyB0aGVuCi0JCQlBQ19NU0dfRVJST1IoW1tXZSBjb3VsZCBub3QgZGV0ZWN0IHRoZSBib29zdCBsaWJyYXJpZXMgKHZlcnNpb24gJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCi0JCWVsc2UKLQkJCUFDX01TR19OT1RJQ0UoW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCi0JCWZpCi0JZWxzZQotCQlBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKLQkJQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKLQkJQUNfREVGSU5FKEhBVkVfQk9PU1QsLFtkZWZpbmUgaWYgdGhlIEJvb3N0IGxpYnJhcnkgaXMgYXZhaWxhYmxlXSkKLQlmaQotCisgICAgZG5sIGlmIHdlIGZvdW5kIG5vIGJvb3N0IHdpdGggc3lzdGVtIGxheW91dCB3ZSBzZWFyY2ggZm9yIGJvb3N0IGxpYnJhcmllcworICAgIGRubCBidWlsdCBhbmQgaW5zdGFsbGVkIHdpdGhvdXQgdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24gb3IgZm9yIGEgc3RhZ2VkKG5vdCBpbnN0YWxsZWQpIHZlcnNpb24KKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgogICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTX1NBVkVEIgotICAgICAgIAlMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKLWZpCisgICAgICAgIExERkxBR1M9IiRMREZMQUdTX1NBVkVEIgorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9CisgICAgICAgIGZpCisgICAgICAgIF92ZXJzaW9uPTAKKyAgICAgICAgaWYgdGVzdCAtbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIjsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBkbmwgaWYgbm90aGluZyBmb3VuZCBzZWFyY2ggZm9yIGxheW91dCB1c2VkIGluIFdpbmRvd3MgZGlzdHJpYnV0aW9ucworICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRCT09TVF9DUFBGTEFHUyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvYm9vc3QiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2Jvb3N0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkbmwgaWYgd2UgZm91bmQgc29tZXRoaW5nIGFuZCBCT09TVF9MREZMQUdTIHdhcyB1bnNldCBiZWZvcmUKKyAgICAgICAgICAgICAgICBkbmwgKGJlY2F1c2UgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgPSAiIiksIHNldCBpdCBoZXJlLgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRCT09TVF9DUFBGTEFHUyIgJiYgdGVzdCAteiAiJEJPT1NUX0xERkxBR1MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAieHllcyIgOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGggaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9DSEVDSz1gZXhwciAkX3ZlcnNpb25fdG1wIFw+ICRfdmVyc2lvbmAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGg9JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgICAgIFZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAorICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRiZXN0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRiZXN0X3BhdGgvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJGJlc3RfcGF0aC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfUk9PVCIgOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtZCAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciIgJiYgdGVzdCAtciAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9kaXI9YGV4cHIgLy8kQk9PU1RfUk9PVCA6ICcuKi9cKC4qXCknYAorICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uPWBlY2hvICR2ZXJzaW9uX2RpciB8IHNlZCAncy9ib29zdF8vLycgfCBzZWQgJ3MvXy8uL2cnYAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdmVyc2lvbl9zaG9ydGVuPWBleHByICRzdGFnZV92ZXJzaW9uIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAorICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRzdGFnZV92ZXJzaW9uX3Nob3J0ZW4gXD5cPSAkX3ZlcnNpb25gCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiICYmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFdlIHdpbGwgdXNlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgZnJvbSAkQk9PU1RfUk9PVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRCT09TVF9ST09UIgorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorICAgICAgICBleHBvcnQgQ1BQRkxBR1MKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xERkxBR1MiCisgICAgICAgIGV4cG9ydCBMREZMQUdTCisKKyAgICAgICAgQUNfTEFOR19QVVNIKEMrKykKKyAgICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNKCRXQU5UX0JPT1NUX1ZFUlNJT04pXSxbCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgc3VjY2VlZGVkPXllcworICAgICAgICBmb3VuZF9zeXN0ZW09eWVzCisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgIF0pCisgICAgICAgIEFDX0xBTkdfUE9QKFtDKytdKQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4JF92ZXJzaW9uIiA9ICJ4MCIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtbV2UgY291bGQgbm90IGRldGVjdCB0aGUgYm9vc3QgbGlicmFyaWVzICh2ZXJzaW9uICQxIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCisgICAgICAgIGZpCisgICAgICAgICMgZXhlY3V0ZSBBQ1RJT04tSUYtTk9ULUZPVU5EIChpZiBwcmVzZW50KToKKyAgICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgICBlbHNlCisgICAgICAgIEFDX0RFRklORShIQVZFX0JPT1NULCxbZGVmaW5lIGlmIHRoZSBCb29zdCBsaWJyYXJ5IGlzIGF2YWlsYWJsZV0pCisgICAgICAgICMgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQgKGlmIHByZXNlbnQpOgorICAgICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJENQUEZMQUdTX1NBVkVEIgorICAgIExERkxBR1M9IiRMREZMQUdTX1NBVkVEIgogCiBdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00IGIvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTQ4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKQEAgLTAsMCArMSwxMjQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfb3BlbnNzbC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NIRUNLX09QRU5TU0woW2FjdGlvbi1pZi1mb3VuZFssIGFjdGlvbi1pZi1ub3QtZm91bmRdXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBMb29rIGZvciBPcGVuU1NMIGluIGEgbnVtYmVyIG9mIGRlZmF1bHQgc3BvdHMsIG9yIGluIGEgdXNlci1zZWxlY3RlZAorIyAgIHNwb3QgKHZpYSAtLXdpdGgtb3BlbnNzbCkuICBTZXRzCisjCisjICAgICBPUEVOU1NMX0lOQ0xVREVTIHRvIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZXMgcmVxdWlyZWQKKyMgICAgIE9QRU5TU0xfTElCUyB0byB0aGUgLWwgZGlyZWN0aXZlcyByZXF1aXJlZAorIyAgICAgT1BFTlNTTF9MREZMQUdTIHRvIHRoZSAtTCBvciAtUiBmbGFncyByZXF1aXJlZAorIworIyAgIGFuZCBjYWxscyBBQ1RJT04tSUYtRk9VTkQgb3IgQUNUSU9OLUlGLU5PVC1GT1VORCBhcHByb3ByaWF0ZWx5CisjCisjICAgVGhpcyBtYWNybyBzZXRzIE9QRU5TU0xfSU5DTFVERVMgc3VjaCB0aGF0IHNvdXJjZSBmaWxlcyBzaG91bGQgdXNlIHRoZQorIyAgIG9wZW5zc2wvIGRpcmVjdG9yeSBpbiBpbmNsdWRlIGRpcmVjdGl2ZXM6CisjCisjICAgICAjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDksMjAxMCBabWFuZGEgSW5jLiA8aHR0cDovL3d3dy56bWFuZGEuY29tLz4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDksMjAxMCBEdXN0aW4gSi4gTWl0Y2hlbGwgPGR1c3RpbkB6bWFuZGEuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMAorCitBVV9BTElBUyhbQ0hFQ0tfU1NMXSwgW0FYX0NIRUNLX09QRU5TU0xdKQorQUNfREVGVU4oW0FYX0NIRUNLX09QRU5TU0xdLCBbCisgICAgZm91bmQ9ZmFsc2UKKyAgICBBQ19BUkdfV0lUSChbb3BlbnNzbF0sCisgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLW9wZW5zc2w9RElSXSwKKyAgICAgICAgICAgIFtyb290IG9mIHRoZSBPcGVuU1NMIGRpcmVjdG9yeV0pXSwKKyAgICAgICAgWworICAgICAgICAgICAgY2FzZSAiJHdpdGh2YWwiIGluCisgICAgICAgICAgICAiIiB8IHkgfCB5ZSB8IHllcyB8IG4gfCBubykKKyAgICAgICAgICAgIEFDX01TR19FUlJPUihbSW52YWxpZCAtLXdpdGgtb3BlbnNzbCB2YWx1ZV0pCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKSBzc2xkaXJzPSIkd2l0aHZhbCIKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgXSwgWworICAgICAgICAgICAgIyBpZiBwa2ctY29uZmlnIGlzIGluc3RhbGxlZCBhbmQgb3BlbnNzbCBoYXMgaW5zdGFsbGVkIGEgLnBjIGZpbGUsCisgICAgICAgICAgICAjIHRoZW4gdXNlIHRoYXQgaW5mb3JtYXRpb24gYW5kIGRvbid0IHNlYXJjaCBzc2xkaXJzCisgICAgICAgICAgICBBQ19DSEVDS19UT09MKFtQS0dfQ09ORklHXSwgW3BrZy1jb25maWddKQorICAgICAgICAgICAgaWYgdGVzdCB4IiRQS0dfQ09ORklHIiAhPSB4IiI7IHRoZW4KKyAgICAgICAgICAgICAgICBPUEVOU1NMX0xERkxBR1M9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1saWJzLW9ubHktTCAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICQ/ID0gMDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX0xJQlM9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1saWJzLW9ubHktbCAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9JTkNMVURFUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWNmbGFncy1vbmx5LUkgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGZvdW5kPXRydWUKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgIyBubyBzdWNoIGx1Y2s7IHVzZSBzb21lIGRlZmF1bHQgc3NsZGlycworICAgICAgICAgICAgaWYgISAkZm91bmQ7IHRoZW4KKyAgICAgICAgICAgICAgICBzc2xkaXJzPSIvdXNyL2xvY2FsL3NzbCAvdXNyL2xpYi9zc2wgL3Vzci9zc2wgL3Vzci9wa2cgL3Vzci9sb2NhbCAvdXNyIgorICAgICAgICAgICAgZmkKKyAgICAgICAgXQorICAgICAgICApCisKKworICAgICMgbm90ZSB0aGF0IHdlICNpbmNsdWRlIDxvcGVuc3NsL2Zvby5oPiwgc28gdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIHRvIGJlIGluCisgICAgIyBhbiAnb3BlbnNzbCcgc3ViZGlyZWN0b3J5CisKKyAgICBpZiAhICRmb3VuZDsgdGhlbgorICAgICAgICBPUEVOU1NMX0lOQ0xVREVTPQorICAgICAgICBmb3Igc3NsZGlyIGluICRzc2xkaXJzOyBkbworICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igb3BlbnNzbC9zc2wuaCBpbiAkc3NsZGlyXSkKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRzc2xkaXIvaW5jbHVkZS9vcGVuc3NsL3NzbC5oIjsgdGhlbgorICAgICAgICAgICAgICAgIE9QRU5TU0xfSU5DTFVERVM9Ii1JJHNzbGRpci9pbmNsdWRlIgorICAgICAgICAgICAgICAgIE9QRU5TU0xfTERGTEFHUz0iLUwkc3NsZGlyL2xpYiIKKyAgICAgICAgICAgICAgICBPUEVOU1NMX0xJQlM9Ii1sc3NsIC1sY3J5cHRvIgorICAgICAgICAgICAgICAgIGZvdW5kPXRydWUKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorCisgICAgICAgICMgaWYgdGhlIGZpbGUgd2Fzbid0IGZvdW5kLCB3ZWxsLCBnbyBhaGVhZCBhbmQgdHJ5IHRoZSBsaW5rIGFueXdheSAtLSBtYXliZQorICAgICAgICAjIGl0IHdpbGwganVzdCB3b3JrIQorICAgIGZpCisKKyAgICAjIHRyeSB0aGUgcHJlcHJvY2Vzc29yIGFuZCBsaW5rZXIgd2l0aCBvdXIgbmV3IGZsYWdzLAorICAgICMgYmVpbmcgY2FyZWZ1bCBub3QgdG8gcG9sbHV0ZSB0aGUgZ2xvYmFsIExJQlMsIExERkxBR1MsIGFuZCBDUFBGTEFHUworCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGNvbXBpbGluZyBhbmQgbGlua2luZyBhZ2FpbnN0IE9wZW5TU0wgd29ya3NdKQorICAgIGVjaG8gIlRyeWluZyBsaW5rIHdpdGggT1BFTlNTTF9MREZMQUdTPSRPUEVOU1NMX0xERkxBR1M7IiBcCisgICAgICAgICJPUEVOU1NMX0xJQlM9JE9QRU5TU0xfTElCUzsgT1BFTlNTTF9JTkNMVURFUz0kT1BFTlNTTF9JTkNMVURFUyIgPiZBU19NRVNTQUdFX0xPR19GRAorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAkT1BFTlNTTF9MREZMQUdTIgorICAgIExJQlM9IiRPUEVOU1NMX0xJQlMgJExJQlMiCisgICAgQ1BQRkxBR1M9IiRPUEVOU1NMX0lOQ0xVREVTICRDUFBGTEFHUyIKKyAgICBBQ19MSU5LX0lGRUxTRSgKKyAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+XSwgW1NTTF9uZXcoTlVMTCldKV0sCisgICAgICAgIFsKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAkMQorICAgICAgICBdLCBbCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAkMgorICAgICAgICBdKQorICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisKKyAgICBBQ19TVUJTVChbT1BFTlNTTF9JTkNMVURFU10pCisgICAgQUNfU1VCU1QoW09QRU5TU0xfTElCU10pCisgICAgQUNfU1VCU1QoW09QRU5TU0xfTERGTEFHU10pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhlMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSwxNzcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21wYXJlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT01QQVJFX1ZFUlNJT04oVkVSU0lPTl9BLCBPUCwgVkVSU0lPTl9CLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIGNvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3MuIER1ZSB0byB0aGUgdmFyaW91cyBudW1iZXIgb2YKKyMgICBtaW5vci12ZXJzaW9uIG51bWJlcnMgdGhhdCBjYW4gZXhpc3QsIGFuZCB0aGUgZmFjdCB0aGF0IHN0cmluZworIyAgIGNvbXBhcmlzb25zIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG51bWVyaWMgY29tcGFyaXNvbnMsIHRoaXMgaXMgbm90CisjICAgbmVjZXNzYXJpbHkgdHJpdmlhbCB0byBkbyBpbiBhIGF1dG9jb25mIHNjcmlwdC4gVGhpcyBtYWNybyBtYWtlcyBkb2luZworIyAgIHRoZXNlIGNvbXBhcmlzb25zIGVhc3kuCisjCisjICAgVGhlIHNpeCBiYXNpYyBjb21wYXJpc29ucyBhcmUgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIGNoZWNraW5nIGVxdWFsaXR5CisjICAgbGltaXRlZCB0byBhIGNlcnRhaW4gbnVtYmVyIG9mIG1pbm9yLXZlcnNpb24gbGV2ZWxzLgorIworIyAgIFRoZSBvcGVyYXRvciBPUCBkZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBjb21wYXJpc29uIHRvIGRvLCBhbmQgY2FuIGJlIG9uZQorIyAgIG9mOgorIworIyAgICBlcSAgLSBlcXVhbCAodGVzdCBBID09IEIpCisjICAgIG5lICAtIG5vdCBlcXVhbCAodGVzdCBBICE9IEIpCisjICAgIGxlICAtIGxlc3MgdGhhbiBvciBlcXVhbCAodGVzdCBBIDw9IEIpCisjICAgIGdlICAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAodGVzdCBBID49IEIpCisjICAgIGx0ICAtIGxlc3MgdGhhbiAodGVzdCBBIDwgQikKKyMgICAgZ3QgIC0gZ3JlYXRlciB0aGFuICh0ZXN0IEEgPiBCKQorIworIyAgIEFkZGl0aW9uYWxseSwgdGhlIGVxIGFuZCBuZSBvcGVyYXRvciBjYW4gaGF2ZSBhIG51bWJlciBhZnRlciBpdCB0byBsaW1pdAorIyAgIHRoZSB0ZXN0IHRvIHRoYXQgbnVtYmVyIG9mIG1pbm9yIHZlcnNpb25zLgorIworIyAgICBlcTAgLSBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgbmUwIC0gbm90IGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBlcU4gLSBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIyAgICBuZU4gLSBub3QgZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKKyMKKyMgICBXaGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLVRSVUUgYXJlIHJ1biwKKyMgICBvdGhlcndpc2Ugc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSBlbnZpcm9ubWVudAorIyAgIHZhcmlhYmxlICdheF9jb21wYXJlX3ZlcnNpb24nIGlzIGFsd2F5cyBzZXQgdG8gZWl0aGVyICd0cnVlJyBvciAnZmFsc2UnCisjICAgYXMgd2VsbC4KKyMKKyMgICBFeGFtcGxlczoKKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbbHRdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbbHRdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgdHJ1ZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXFdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbZ3RdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgZmFsc2UuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMl0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHR3byBtaW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEwXSxbMy4xNV0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHRoZSBsZXNzZXIgbnVtYmVyIG9mIG1pbm9yCisjICAgdmVyc2lvbnMgb2YgdGhlIHR3byB2YWx1ZXMuCisjCisjICAgTm90ZTogVGhlIGNoYXJhY3RlcnMgdGhhdCBzZXBhcmF0ZSB0aGUgdmVyc2lvbiBudW1iZXJzIGRvIG5vdCBtYXR0ZXIuIEFuCisjICAgZW1wdHkgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHZlcnNpb24gMC4gT1AgaXMgZXZhbHVhdGVkIGJ5IGF1dG9jb25mLCBub3QKKyMgICBjb25maWd1cmUsIHNvIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBhIHZhcmlhYmxlLgorIworIyAgIFRoZSBhdXRob3Igd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBHdWlkbyBEcmFoZWltIHdob3NlIGFkdmljZSBhYm91dAorIyAgIHRoZSBtNF9jYXNlIGFuZCBtNF9pZnZhbG4gZnVuY3Rpb25zIG1ha2UgdGhpcyBtYWNybyBvbmx5IGluY2x1ZGUgdGhlCisjICAgcG9ydGlvbnMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHNwZWNpZmljIGNvbXBhcmlzb24gc3BlY2lmaWVkIGJ5IHRoZQorIyAgIE9QIGFyZ3VtZW50IGluIHRoZSBmaW5hbCBjb25maWd1cmUgc2NyaXB0LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRpbSBUb29sYW4gPHRvb2xhbkBlbGUudXJpLmVkdT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTIKKworZG5sICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX0RFRlVOKFtBWF9DT01QQVJFX1ZFUlNJT05dLCBbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSkKKworICAjIFVzZWQgdG8gaW5kaWNhdGUgdHJ1ZSBvciBmYWxzZSBjb25kaXRpb24KKyAgYXhfY29tcGFyZV92ZXJzaW9uPWZhbHNlCisKKyAgIyBDb252ZXJ0IHRoZSB0d28gdmVyc2lvbiBzdHJpbmdzIHRvIGJlIGNvbXBhcmVkIGludG8gYSBmb3JtYXQgdGhhdAorICAjIGFsbG93cyBhIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi4gIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgYSB2ZXJzaW9uCisgICMgc3RyaW5nIG9mIHRoZSBmb3JtIDEuMTIuNS1yNjE3IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBmb3JtCisgICMgMDAwMTAwMTIwMDA1MDYxNy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG51bWJlciBpcyB6ZXJvIHBhZGRlZCB0byBmb3VyCisgICMgZGlnaXRzLCBhbmQgbm9uIGRpZ2l0cyBhcmUgcmVtb3ZlZC4KKyAgQVNfVkFSX1BVU0hERUYoW0FdLFtheF9jb21wYXJlX3ZlcnNpb25fQV0pCisgIEE9YGVjaG8gIiQxIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgQVNfVkFSX1BVU0hERUYoW0JdLFtheF9jb21wYXJlX3ZlcnNpb25fQl0pCisgIEI9YGVjaG8gIiQzIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgZG5sICMgSW4gdGhlIGNhc2Ugb2YgbGUsIGdlLCBsdCwgYW5kIGd0LCB0aGUgc3RyaW5ncyBhcmUgc29ydGVkIGFzIG5lY2Vzc2FyeQorICBkbmwgIyB0aGVuIHRoZSBmaXJzdCBsaW5lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KKyAgZG5sICMgVGhlIHNlZCByaWdodCBhZnRlciB0aGUgZWNobyBpcyB0byByZW1vdmUgYW55IGluZGVudGVkIHdoaXRlIHNwYWNlLgorICBtNF9jYXNlKG00X3RvbG93ZXIoJDIpLAorICBbbHRdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2d0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFtsZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLAorICBbZ2VdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKKyAgXSxbCisgICAgZG5sIFNwbGl0IHRoZSBvcGVyYXRvciBmcm9tIHRoZSBzdWJ2ZXJzaW9uIGNvdW50IGlmIHByZXNlbnQuCisgICAgbTRfYm1hdGNoKG00X3N1YnN0cigkMiwyKSwKKyAgICBbMF0sWworICAgICAgIyBBIGNvdW50IG9mIHplcm8gbWVhbnMgdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbi4KKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBBIGFuZCBCLgorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BPWBlY2hvICIkQSIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CPWBlY2hvICIkQiIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorCisgICAgICAjIFNldCBBIHRvIG5vIG1vcmUgdGhhbiBCJ3MgbGVuZ3RoIGFuZCBCIHRvIG5vIG1vcmUgdGhhbiBBJ3MgbGVuZ3RoLgorICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQlx9XCkuKi9cMS8iYAorICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgW1swLTldK10sWworICAgICAgIyBBIGNvdW50IGdyZWF0ZXIgdGhhbiB6ZXJvIG1lYW5zIHVzZSBvbmx5IHRoYXQgbWFueSBzdWJ2ZXJzaW9ucworICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICBdLAorICAgIFsuK10sWworICAgICAgQUNfV0FSTklORygKKyAgICAgICAgW2lsbGVnYWwgT1AgbnVtZXJpYyBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdLFtdKQorCisgICAgIyBQYWQgemVyb3MgYXQgZW5kIG9mIG51bWJlcnMgdG8gbWFrZSBzYW1lIGxlbmd0aC4KKyAgICBheF9jb21wYXJlX3ZlcnNpb25fdG1wX0E9IiRBYGVjaG8gJEIgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBCPSIkQmBlY2hvICRBIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQT0iJGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQSIKKworICAgICMgQ2hlY2sgZm9yIGVxdWFsaXR5IG9yIGluZXF1YWxpdHkgYXMgbmVjZXNzYXJ5LgorICAgIG00X2Nhc2UobTRfdG9sb3dlcihtNF9zdWJzdHIoJDIsMCwyKSksCisgICAgW2VxXSxbCisgICAgICB0ZXN0ICJ4JEEiID0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKKyAgICBdLAorICAgIFtuZV0sWworICAgICAgdGVzdCAieCRBIiAhPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sWworICAgICAgQUNfV0FSTklORyhbaWxsZWdhbCBPUCBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdKQorICBdKQorCisgIEFTX1ZBUl9QT1BERUYoW0FdKWRubAorICBBU19WQVJfUE9QREVGKFtCXSlkbmwKKworICBkbmwgIyBFeGVjdXRlIEFDVElPTi1JRi1UUlVFIC8gQUNUSU9OLUlGLUZBTFNFLgorICBpZiB0ZXN0ICIkYXhfY29tcGFyZV92ZXJzaW9uIiA9ICJ0cnVlIiA7IHRoZW4KKyAgICBtNF9pZnZhbG4oWyQ0XSxbJDRdLFs6XSlkbmwKKyAgICBtNF9pZnZhbG4oWyQ1XSxbZWxzZSAkNV0pZG5sCisgIGZpCitdKSBkbmwgQVhfQ09NUEFSRV9WRVJTSU9OCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNApAQCAtMCwwICsxLDk0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHguaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFgoVkVSU0lPTiwgW2V4dHxub2V4dF0sIFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBzcGVjaWZpZWQKKyMgICB2ZXJzaW9uIG9mIHRoZSBDKysgc3RhbmRhcmQuICBJZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kCisjICAgQ1hYQ1BQIHRvIGVuYWJsZSBzdXBwb3J0LiAgVkVSU0lPTiBtYXkgYmUgJzExJyAoZm9yIHRoZSBDKysxMSBzdGFuZGFyZCkKKyMgICBvciAnMTQnIChmb3IgdGhlIEMrKzE0IHN0YW5kYXJkKS4KKyMKKyMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSB0aGlyZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkICdtYW5kYXRvcnknIG9yIGlmIGxlZnQgdW5zcGVjaWZpZWQsCisjICAgaW5kaWNhdGVzIHRoYXQgYmFzZWxpbmUgc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDKysgc3RhbmRhcmQgaXMKKyMgICByZXF1aXJlZCBhbmQgdGhhdCB0aGUgbWFjcm8gc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdAorIyAgIHN1cHBvcnQgaXMgZm91bmQuICBJZiBzcGVjaWZpZWQgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzCisjICAgcmVnYXJkbGVzcywgYWZ0ZXIgZGVmaW5pbmcgSEFWRV9DWFgke1ZFUlNJT059IGlmIGFuZCBvbmx5IGlmIGEKKyMgICBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggS3J6ZXNpbWlyIE5vd2FrIDxxZGxhY3pAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTAKKworZG5sICBUaGlzIG1hY3JvIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGZyb20gdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMSBtYWNybworZG5sICAoc2VyaWFsIHZlcnNpb24gbnVtYmVyIDEzKS4KKworQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF0sIFtkbmwKKyAgbTRfaWYoWyQxXSwgWzExXSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTEgMHgiXSwKKyAgICAgICAgWyQxXSwgWzE0XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTQgMXkiXSwKKyAgICAgICAgWyQxXSwgWzE3XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTcgMXoiXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGZpcnN0IGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKWRubAorICBtNF9pZihbJDJdLCBbXSwgW10sCisgICAgICAgIFskMl0sIFtleHRdLCBbXSwKKyAgICAgICAgWyQyXSwgW25vZXh0XSwgW10sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgYCQyJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskM10sIFtdLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFttYW5kYXRvcnldLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFtvcHRpb25hbF0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD1mYWxzZV0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCB0aGlyZCBhcmd1bWVudCBgJDMnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSkKKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICBhY19zdWNjZXNzPW5vCisKKyAgbTRfaWYoWyQyXSwgW25vZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgc3dpdGNoPSItc3RkPWdudSsrJHthbHRlcm5hdGl2ZX0iCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrJDEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgZmkKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisKKyAgbTRfaWYoWyQyXSwgW2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZG5sIEhQJ3MgYUNDIG5lZWRzICtzdGQ9YysrMTEgYWNjb3JkaW5nIHRvOgorICAgIGRubCBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL3BvcnRhbC9kb3dubG9hZC9maWxlcy91bnByb3QvYUN4eC9QREZfUmVsZWFzZV9Ob3Rlcy83NjkxNDktMDAxLnBkZgorICAgIGRubCBDcmF5J3MgY3JheUNDIG5lZWRzICItaCBzdGQ9YysrMTEiCisgICAgZm9yIGFsdGVybmF0aXZlIGluICR7YXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzfTsgZG8KKyAgICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKyske2FsdGVybmF0aXZlfSArc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICItaCBzdGQ9YysrJHthbHRlcm5hdGl2ZX0iOyBkbworICAgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfJDFdKV0sCisgICAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICAgIENYWD0iJGFjX3NhdmVfQ1hYIl0pCisgICAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgaWYgdGVzdCAtbiAiJENYWENQUCIgOyB0aGVuCisgICAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgICBmaQorICAgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geHllczsgdGhlbgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKyAgQUNfTEFOR19QT1AoW0MrK10pCisgIGlmIHRlc3QgeCRheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZCA9IHh0cnVlOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIEEgY29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBDKyskMSBsYW5ndWFnZSBmZWF0dXJlcyBpcyByZXF1aXJlZC5dKQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgSEFWRV9DWFgkMT0wCisgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKyskMSBzdXBwb3J0IHdhcyBmb3VuZF0pCisgIGVsc2UKKyAgICBIQVZFX0NYWCQxPTEKKyAgICBBQ19ERUZJTkUoSEFWRV9DWFgkMSwxLAorICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKyskMSBzeW50YXhdKQorICBmaQorICBBQ19TVUJTVChIQVZFX0NYWCQxKQorXSkKKworCitkbmwgIFRlc3QgYm9keSBmb3IgY2hlY2tpbmcgQysrMTEgc3VwcG9ydAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTFdLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxNCBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xNF0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CispCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xN10sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE3CispCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxMQorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExXSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTEsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxMSBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDExCit7CisKKyAgbmFtZXNwYWNlIHRlc3Rfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY2hlY2sKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmluYWxfb3ZlcnJpZGUKKyAgeworCisgICAgc3RydWN0IEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBEZXJpdmVkIDogcHVibGljIEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIG92ZXJyaWRlIHt9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZG91YmxlX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGNoZWNrIHt9OworCisgICAgdHlwZWRlZiBjaGVjazx2b2lkPiBzaW5nbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPHZvaWQ+PiBkb3VibGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4gdHJpcGxlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxjaGVjazxjaGVjazx2b2lkPj4+PiBxdWFkcnVwbGVfdHlwZTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZGVjbHR5cGUKKyAgeworCisgICAgaW50CisgICAgZigpCisgICAgeworICAgICAgaW50IGEgPSAxOworICAgICAgZGVjbHR5cGUoYSkgYiA9IDI7CisgICAgICByZXR1cm4gYSArIGI7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90eXBlX2RlZHVjdGlvbgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBpc19zYW1lPFQsIFQ+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgYXV0bworICAgIGFkZChUMSBhMSwgVDIgYTIpIC0+IGRlY2x0eXBlKGExICsgYTIpCisgICAgeworICAgICAgcmV0dXJuIGExICsgYTI7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdChjb25zdCBpbnQgYywgdm9sYXRpbGUgaW50IHYpCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoMCk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShjKT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSh2KT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBhdXRvIGFjID0gYzsKKyAgICAgIGF1dG8gYXYgPSB2OworICAgICAgYXV0byBzdW1pID0gYWMgKyBhdiArICd4JzsKKyAgICAgIGF1dG8gc3VtZiA9IGFjICsgYXYgKyAxLjA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhYyk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhdik+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShzdW1pKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFkZChjLCB2KSk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICByZXR1cm4gKHN1bWYgPiAwLjApID8gc3VtaSA6IGFkZChjLCB2KTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X25vZXhjZXB0CisgIHsKKworICAgIGludCBmKCkgeyByZXR1cm4gMDsgfQorICAgIGludCBnKCkgbm9leGNlcHQgeyByZXR1cm4gMDsgfQorCisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChmKCkpID09IGZhbHNlLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChnKCkpID09IHRydWUsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIHVuc2lnbmVkIGxvbmcgY29uc3RleHByCisgICAgc3RybGVuX2Nfcihjb25zdCBDaGFyVCAqY29uc3QgcywgY29uc3QgdW5zaWduZWQgbG9uZyBhY2MpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuICpzID8gc3RybGVuX2NfcihzICsgMSwgYWNjICsgMSkgOiBhY2M7CisgICAgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gc3RybGVuX2NfcihzLCAwVUwpOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIjEiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJleGFtcGxlIikgPT0gN1VMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwZXhhbXBsZSIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ydmFsdWVfcmVmZXJlbmNlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8IGludCBOID4KKyAgICBzdHJ1Y3QgYW5zd2VyCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgdmFsdWUgPSBOOworICAgIH07CisKKyAgICBhbnN3ZXI8MT4gZihpbnQmKSAgICAgICB7IHJldHVybiBhbnN3ZXI8MT4oKTsgfQorICAgIGFuc3dlcjwyPiBmKGNvbnN0IGludCYpIHsgcmV0dXJuIGFuc3dlcjwyPigpOyB9CisgICAgYW5zd2VyPDM+IGYoaW50JiYpICAgICAgeyByZXR1cm4gYW5zd2VyPDM+KCk7IH0KKworICAgIHZvaWQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBjb25zdCBpbnQgYyA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoaSkpOjp2YWx1ZSA9PSAxLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoYykpOjp2YWx1ZSA9PSAyLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoMCkpOjp2YWx1ZSA9PSAzLCAiIik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF91bmlmb3JtX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCB0ZXN0CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGludCB6ZXJvIHt9OworICAgICAgc3RhdGljIGNvbnN0IGludCBvbmUgezF9OworICAgIH07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHRlc3Q6Onplcm8gPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6b25lID09IDEsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhcworICB7CisKKyAgICB2b2lkCisgICAgdGVzdDEoKQorICAgIHsKKyAgICAgIGF1dG8gbGFtYmRhMSA9IFtdKCl7fTsKKyAgICAgIGF1dG8gbGFtYmRhMiA9IGxhbWJkYTE7CisgICAgICBsYW1iZGExKCk7CisgICAgICBsYW1iZGEyKCk7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDIoKQorICAgIHsKKyAgICAgIGF1dG8gYSA9IFtdKGludCBpLCBpbnQgail7IHJldHVybiBpICsgajsgfSgxLCAyKTsKKyAgICAgIGF1dG8gYiA9IFtdKCkgLT4gaW50IHsgcmV0dXJuICcwJzsgfSgpOworICAgICAgYXV0byBjID0gWz1dKCl7IHJldHVybiBhICsgYjsgfSgpOworICAgICAgYXV0byBkID0gWyZdKCl7IHJldHVybiBjOyB9KCk7CisgICAgICBhdXRvIGUgPSBbYSwgJmJdKGludCB4KSBtdXRhYmxlIHsKKyAgICAgICAgY29uc3QgYXV0byBpZGVudGl0eSA9IFtdKGludCB5KXsgcmV0dXJuIHk7IH07CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IGE7ICsraSkKKyAgICAgICAgICBhICs9IGItLTsKKyAgICAgICAgcmV0dXJuIHggKyBpZGVudGl0eShhICsgYik7CisgICAgICB9KDApOworICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOworICAgIH0KKworICAgIGludAorICAgIHRlc3QzKCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIG51bGxhcnkgPSBbXSgpeyByZXR1cm4gMDsgfTsKKyAgICAgIGNvbnN0IGF1dG8gdW5hcnkgPSBbXShpbnQgeCl7IHJldHVybiB4OyB9OworICAgICAgdXNpbmcgbnVsbGFyeV90ID0gZGVjbHR5cGUobnVsbGFyeSk7CisgICAgICB1c2luZyB1bmFyeV90ID0gZGVjbHR5cGUodW5hcnkpOworICAgICAgY29uc3QgYXV0byBoaWdoZXIxc3QgPSBbXShudWxsYXJ5X3QgZil7IHJldHVybiBmKCk7IH07CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjJuZCA9IFt1bmFyeV0obnVsbGFyeV90IGYxKXsKKyAgICAgICAgcmV0dXJuIFt1bmFyeSwgZjFdKHVuYXJ5X3QgZjIpeyByZXR1cm4gZjIodW5hcnkoZjEoKSkpOyB9OworICAgICAgfTsKKyAgICAgIHJldHVybiBoaWdoZXIxc3QobnVsbGFyeSkgKyBoaWdoZXIybmQobnVsbGFyeSkodW5hcnkpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdmFyaWFkaWNfdGVtcGxhdGVzCisgIHsKKworICAgIHRlbXBsYXRlIDxpbnQuLi4+CisgICAgc3RydWN0IHN1bTsKKworICAgIHRlbXBsYXRlIDxpbnQgTjAsIGludC4uLiBOMXRvTj4KKyAgICBzdHJ1Y3Qgc3VtPE4wLCBOMXRvTi4uLj4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBOMCArIHN1bTxOMXRvTi4uLj46OnZhbHVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8PgorICAgIHN0cnVjdCBzdW08PgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IDA7CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQoc3VtPD46OnZhbHVlID09IDAsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxPjo6dmFsdWUgPT0gMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIzPjo6dmFsdWUgPT0gMjMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxLCAyPjo6dmFsdWUgPT0gMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDUsIDUsIDExPjo6dmFsdWUgPT0gMjEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwyLCAzLCA1LCA3LCAxMSwgMTM+Ojp2YWx1ZSA9PSA0MSwgIiIpOworCisgIH0KKworICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNzI4MTg0L3RlbXBsYXRlLWFsaWFzZXMtYW5kLXNmaW5hZQorICAvLyBDbGFuZyAzLjEgZmFpbHMgd2l0aCBoZWFkZXJzIG9mIGxpYnN0ZCsrIDQuOC4zIHdoZW4gdXNpbmcgc3RkOjpmdW5jdGlvbgorICAvLyBiZWNhdXNlIG9mIHRoaXMuCisgIG5hbWVzcGFjZSB0ZXN0X3RlbXBsYXRlX2FsaWFzX3NmaW5hZQorICB7CisKKyAgICBzdHJ1Y3QgZm9vIHt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBtZW1iZXIgPSB0eXBlbmFtZSBUOjptZW1iZXJfdHlwZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKC4uLikge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKG1lbWJlcjxUPiopIHt9CisKKyAgICB2b2lkIHRlc3QoKTsKKworICAgIHZvaWQgdGVzdCgpIHsgZnVuYzxmb28+KDApOyB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTEKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK11dKQorCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxNAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0XSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTQsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDE0MDJMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxNCBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDE0Cit7CisKKyAgbmFtZXNwYWNlIHRlc3RfcG9seW1vcnBoaWNfbGFtYmRhcworICB7CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYSA9IFtdKGF1dG8mJi4uLiBhcmdzKXsKKyAgICAgICAgY29uc3QgYXV0byBpc3RpbnkgPSBbXShhdXRvIHgpeworICAgICAgICAgIHJldHVybiAoc2l6ZW9mKHgpID09IDFVTCkgPyAxIDogMDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgaW50IGFyZXRpbnlbXSA9IHsgaXN0aW55KGFyZ3MpLi4uIH07CisgICAgICAgIHJldHVybiBhcmV0aW55WzBdOworICAgICAgfTsKKyAgICAgIHJldHVybiBsYW1iZGEoMSwgMUwsIDEuMGYsICcxJyk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9iaW5hcnlfbGl0ZXJhbHMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gaXZpaSA9IDBiMDAwMDAwMDAwMDEwMTAxMDsKKyAgICBzdGF0aWNfYXNzZXJ0KGl2aWkgPT0gNDIsICJ3cm9uZyB2YWx1ZSIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsaXplZF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgY29uc3RleHByIHVuc2lnbmVkIGxvbmcKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICBhdXRvIGxlbmd0aCA9IDBVTDsKKyAgICAgIGZvciAoYXV0byBwID0gczsgKnA7ICsrcCkKKyAgICAgICAgKytsZW5ndGg7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIngiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJ0ZXN0IikgPT0gNFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwdGVzdCIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfaW5pdF9jYXB0dXJlCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTEgPSBbYSA9IHhdKGludCBiKXsgcmV0dXJuIGEgKyBiOyB9OworICAgICAgY29uc3QgYXV0byBsYW1iZGEyID0gW2EgPSBsYW1iZGExKHgpXSgpeyByZXR1cm4gYTsgfTsKKyAgICAgIHJldHVybiBsYW1iZGEyKCk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kaWdpdF9zZXBhcmF0b3JzCisgIHsKKworICAgIGNvbnN0ZXhwciBhdXRvIHRlbl9taWxsaW9uID0gMTAwJzAwMCcwMDA7CisgICAgc3RhdGljX2Fzc2VydCh0ZW5fbWlsbGlvbiA9PSAxMDAwMDAwMDAsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfcmV0dXJuX3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIGF1dG8gZihpbnQmIHgpIHsgcmV0dXJuIHg7IH0KKyAgICBkZWNsdHlwZShhdXRvKSBnKGludCYgeCkgeyByZXR1cm4geDsgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBhdXRvIHggPSAwOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoZih4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCYsIGRlY2x0eXBlKGcoeCkpPjo6dmFsdWUsICIiKTsKKyAgICAgIHJldHVybiB4OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNAorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE3CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTddLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNywgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTcwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE3IGNvbXBpbGVyIgorCisjZWxzZQorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgY3h4MTcKK3sKKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfbGFtYmRhcworICB7CisKKyAgICBjb25zdGV4cHIgaW50IGZvbyA9IFtdKCl7cmV0dXJuIDQyO30oKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Q6Om5lc3RlZF9uYW1lc3BhY2U6OmRlZmluaXRpb25zCisgIHsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZm9sZF9leHByZXNzaW9uCisgIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgaW50IG11bHRpcGx5KEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgKiAuLi4gKiAxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIGJvb2wgYWxsKEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgJiYgLi4uKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX3N0YXRpY19hc3NlcnQKKyAgeworCisgICAgc3RhdGljX2Fzc2VydCAodHJ1ZSk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2F1dG9fYnJhY2VfaW5pdF9saXN0CisgIHsKKworICAgIGF1dG8gZm9vID0gezV9OworICAgIGF1dG8gYmFyIHs1fTsKKworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+LCBkZWNsdHlwZShmb28pPjo6dmFsdWUpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGludCwgZGVjbHR5cGUoYmFyKT46OnZhbHVlKTsKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVuYW1lX2luX3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtZXRlcgorICB7CisKKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gdHlwZW5hbWUgWD4gc3RydWN0IEQ7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZhbGx0aHJvdWdoX25vZGlzY2FyZF9tYXliZV91bnVzZWRfYXR0cmlidXRlcworICB7CisKKyAgICBpbnQgZjEoKQorICAgIHsKKyAgICAgIHJldHVybiA0MjsKKyAgICB9CisKKyAgICBbW25vZGlzY2FyZF1dIGludCBmMigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHVudXNlZCA9IGYxKCk7CisKKyAgICAgIHN3aXRjaCAoZjEoKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIGYxKCk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgIGYxKCk7CisgICAgICB9CisgICAgICByZXR1cm4gZjEoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX2FnZ3JlZ2F0ZV9pbml0aWFsaXphdGlvbgorICB7CisKKyAgICBzdHJ1Y3QgYmFzZTEKKyAgICB7CisgICAgICBpbnQgYjEsIGIyID0gNDI7CisgICAgfTsKKworICAgIHN0cnVjdCBiYXNlMgorICAgIHsKKyAgICAgIGJhc2UyKCkgeworICAgICAgICBiMyA9IDQyOworICAgICAgfQorICAgICAgaW50IGIzOworICAgIH07CisKKyAgICBzdHJ1Y3QgZGVyaXZlZCA6IGJhc2UxLCBiYXNlMgorICAgIHsKKyAgICAgICAgaW50IGQ7CisgICAgfTsKKworICAgIGRlcml2ZWQgZDEge3sxLCAyfSwge30sIDR9OyAgLy8gZnVsbCBpbml0aWFsaXphdGlvbgorICAgIGRlcml2ZWQgZDIge3t9LCB7fSwgNH07ICAgICAgLy8gdmFsdWUtaW5pdGlhbGl6ZWQgYmFzZXMKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZ2VuZXJhbF9yYW5nZV9iYXNlZF9mb3JfbG9vcAorICB7CisKKyAgICBzdHJ1Y3QgaXRlcgorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbnQmIG9wZXJhdG9yKiAoKQorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgY29uc3QgaW50JiBvcGVyYXRvciogKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIGl0ZXImIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICArK2k7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IHNlbnRpbmVsCisgICAgeworICAgICAgaW50IGk7CisgICAgfTsKKworICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgaXRlciYgaSwgY29uc3Qgc2VudGluZWwmIHMpCisgICAgeworICAgICAgcmV0dXJuIGkuaSA9PSBzLmk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gIShpID09IHMpOworICAgIH0KKworICAgIHN0cnVjdCByYW5nZQorICAgIHsKKyAgICAgIGl0ZXIgYmVnaW4oKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezB9OworICAgICAgfQorCisgICAgICBzZW50aW5lbCBlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezV9OworICAgICAgfQorICAgIH07CisKKyAgICB2b2lkIGYoKQorICAgIHsKKyAgICAgIHJhbmdlIHIge307CisKKyAgICAgIGZvciAoYXV0byBpIDogcikKKyAgICAgIHsKKyAgICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHYgPSBpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhX2NhcHR1cmVfYXN0ZXJpc2tfdGhpc19ieV92YWx1ZQorICB7CisKKyAgICBzdHJ1Y3QgdAorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGZvbygpCisgICAgICB7CisgICAgICAgIHJldHVybiBbKnRoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9KCk7CisgICAgICB9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZW51bV9jbGFzc19jb25zdHJ1Y3Rpb24KKyAgeworCisgICAgZW51bSBjbGFzcyBieXRlIDogdW5zaWduZWQgY2hhcgorICAgIHt9OworCisgICAgYnl0ZSBmb28gezQyfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByX2lmCisgIHsKKworICAgIHRlbXBsYXRlIDxib29sIGNvbmQ+CisgICAgaW50IGYgKCkKKyAgICB7CisgICAgICBpZiBjb25zdGV4cHIoY29uZCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDEzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gNDI7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zZWxlY3Rpb25fc3RhdGVtZW50X3dpdGhfaW5pdGlhbGl6ZXIKKyAgeworCisgICAgaW50IGYoKQorICAgIHsKKyAgICAgIHJldHVybiAxMzsKKyAgICB9CisKKyAgICBpbnQgZjIoKQorICAgIHsKKyAgICAgIGlmIChhdXRvIGkgPSBmKCk7IGkgPiAwKQorICAgICAgeworICAgICAgICByZXR1cm4gMzsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChhdXRvIGkgPSBmKCk7IGkgKyA0KQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYXJndW1lbnRfZGVkdWN0aW9uX2Zvcl9jbGFzc190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgcGFpcgorICAgIHsKKyAgICAgIHBhaXIgKFQxIHAxLCBUMiBwMikKKyAgICAgICAgOiBtMSB7cDF9LAorICAgICAgICAgIG0yIHtwMn0KKyAgICAgIHt9CisKKyAgICAgIFQxIG0xOworICAgICAgVDIgbTI7CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHAgPSBwYWlyezEzLCA0MnV9OworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9uX3R5cGVfYXV0b190ZW1wbGF0ZV9wYXJhbWV0ZXJzCisgIHsKKworICAgIHRlbXBsYXRlIDxhdXRvIG4+CisgICAgc3RydWN0IEIKKyAgICB7fTsKKworICAgIEI8NT4gYjE7CisgICAgQjwnYSc+IGIyOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zdHJ1Y3R1cmVkX2JpbmRpbmdzCisgIHsKKworICAgIGludCBhcnJbMl0gPSB7IDEsIDIgfTsKKyAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IHByID0geyAxLCAyIH07CisKKyAgICBhdXRvIGYxKCkgLT4gaW50KCYpWzJdCisgICAgeworICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICBhdXRvIGYyKCkgLT4gc3RkOjpwYWlyPGludCwgaW50PiYKKyAgICB7CisgICAgICByZXR1cm4gcHI7CisgICAgfQorCisgICAgc3RydWN0IFMKKyAgICB7CisgICAgICBpbnQgeDEgOiAyOworICAgICAgdm9sYXRpbGUgZG91YmxlIHkxOworICAgIH07CisKKyAgICBTIGYzKCkKKyAgICB7CisgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgYXV0byBbIHgxLCB5MSBdID0gZjEoKTsKKyAgICBhdXRvJiBbIHhyMSwgeXIxIF0gPSBmMSgpOworICAgIGF1dG8gWyB4MiwgeTIgXSA9IGYyKCk7CisgICAgYXV0byYgWyB4cjIsIHlyMiBdID0gZjIoKTsKKyAgICBjb25zdCBhdXRvIFsgeDMsIHkzIF0gPSBmMygpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leGNlcHRpb25fc3BlY190eXBlX3N5c3RlbQorICB7CisKKyAgICBzdHJ1Y3QgR29vZCB7fTsKKyAgICBzdHJ1Y3QgQmFkIHt9OworCisgICAgdm9pZCBnMSgpIG5vZXhjZXB0OworICAgIHZvaWQgZzIoKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQmFkCisgICAgZihUKiwgVCopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIEdvb2QKKyAgICBmKFQxKiwgVDIqKTsKKworICAgIHN0YXRpY19hc3NlcnQgKHN0ZDo6aXNfc2FtZV92PEdvb2QsIGRlY2x0eXBlKGYoZzEsIGcyKSk+KTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfaW5saW5lX3ZhcmlhYmxlcworICB7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGYoVCkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgZyhUKQorICAgIHsKKyAgICAgIHJldHVybiBUe307CisgICAgfQorCisgICAgdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBmPD4oaW50KQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTw+IGludCBnPD4oaW50KQorICAgIHsKKyAgICAgIHJldHVybiA1OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNworCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCitdXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczM2ZkOAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00CkBAIC0wLDAgKzEsMzkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIEMrKzExCisjICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWCBhbmQgQ1hYQ1BQIHRvIGVuYWJsZQorIyAgIHN1cHBvcnQuCisjCisjICAgVGhpcyBtYWNybyBpcyBhIGNvbnZlbmllbmNlIGFsaWFzIGZvciBjYWxsaW5nIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFgKKyMgICBtYWNybyB3aXRoIHRoZSB2ZXJzaW9uIHNldCB0byBDKysxMS4gIFRoZSB0d28gb3B0aW9uYWwgYXJndW1lbnRzIGFyZQorIyAgIGZvcndhcmRlZCBsaXRlcmFsbHkgYXMgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgcmVzcGVjdGl2ZWx5LgorIyAgIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFggbWFjcm8gZm9yCisjICAgbW9yZSBpbmZvcm1hdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLCB5b3UgYWxzbyBuZWVkIHRvCisjICAgZG93bmxvYWQgdGhlIGF4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBmaWxlLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE1IEdvb2dsZSBJbmMuOyBjb250cmlidXRlZCBieSBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBQYXVsIE5vcm1hbiA8cGVub3JtYW5AbWFjLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgTW9yaXR6IEtsYW1tbGVyIDxtb3JpdHpAa2xhbW1sZXIuZXU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDE4CisKK0FYX1JFUVVJUkVfREVGSU5FRChbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSkKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYKFsxMV0sIFskMV0sIFskMl0pXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfZG1kLm00IGIvYWNsb2NhbC9heF9kbWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiODRiMAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfZG1kLm00CkBAIC0wLDAgKzEsMTA3IEBACitkbmwgQHN5bm9wc2lzIEFYX0RNRAorZG5sCitkbmwgVGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgRE1ELWNvbXBhdGlibGUgRDIgY29tcGlsZXIsIGFuZCAob3B0aW9uYWxseSkKK2RubCBzcGVjaWZpZWQgbW9kdWxlcyBvbiB0aGUgaW1wb3J0IHBhdGguCitkbmwKK2RubCBJZiAiRE1EIiBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCwgdGhhdCB3aWxsIGJlIHRoZSBvbmx5CitkbmwgZG1kIGNvbW1hbmQgdGVzdGVkLiBPdGhlcndpc2UsIGEgaGFyZC1jb2RlZCBsaXN0IHdpbGwgYmUgdXNlZC4KK2RubAorZG5sIEFmdGVyIEFYX0RNRCBydW5zLCB0aGUgc2hlbGwgdmFyaWFibGVzICJzdWNjZXNzIiBhbmQgImF4X2RtZCIgYXJlIHNldCB0bworZG5sICJ5ZXMiIG9yICJubyIsIGFuZCAiRE1EIiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQuIEZ1cnRoZXJtb3JlLAorZG5sICJkbWRfb3B0bGluayIgd2lsbCBiZSBzZXQgdG8gInllcyIgb3IgIm5vIiBkZXBlbmRpbmcgb24gd2hldGhlciBPUFRMSU5LIGlzCitkbmwgdXNlZCBhcyB0aGUgbGlua2VyIChETUQvV2luZG93cyksIGFuZCAiZG1kX29mX2RpcnNlcCIgd2lsbCBiZSBzZXQgdG8gdGhlCitkbmwgZGlyZWN0b3J5IHNlcGFyYXRvciB0byB1c2Ugd2hlbiBwYXNzaW5nIC1vZiB0byBETUQgKE9QVExJTksgcmVxdWlyZXMgYQorZG5sIGJhY2tzbGFzaCkuCitkbmwKK2RubCBBWF9DSEVDS19EX01PRFVMRSBtdXN0IGJlIHJ1biBhZnRlciBBWF9ETUQuIEl0IHRlc3RzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYQorZG5sIG1vZHVsZSBpbiB0aGUgaW1wb3J0IHBhdGggb2YgdGhlIGNob3NlbiBjb21waWxlciwgYW5kIHNldHMgdGhlIHNoZWxsCitkbmwgdmFyaWFibGUgInN1Y2Nlc3MiIHRvICJ5ZXMiIG9yICJubyIuCitkbmwKK2RubCBAY2F0ZWdvcnkgRAorZG5sIEB2ZXJzaW9uIDIwMTEtMDUtMzEKK2RubCBAbGljZW5zZSBBbGxQZXJtaXNzaXZlCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUmVpc3MKK2RubCBDb3B5cmlnaHQgKEMpIDIwMTEgRGF2aWQgTmFkbGluZ2VyCitkbmwgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2RubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKK2RubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKworQUNfREVGVU4oW0FYX0RNRF0sCisgICAgICAgICBbCisgICAgICAgICAgZG5sIEhhcmQtY29kZWQgZGVmYXVsdCBjb21tYW5kcyB0byB0ZXN0LgorICAgICAgICAgIERNRF9QUk9HUz0iZG1kLGdkbWQsbGRtZCIKKworICAgICAgICAgIGRubCBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRETUQiIDsgdGhlbgorICAgICAgICAgICAgRE1EX1BST0dTPSIkRE1EIgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIERNRCkKKworICAgICAgICAgICMgc3RkLmFsZ29yaXRobSBhcyBhIHF1aWNrIHdheSB0byBjaGVjayBmb3IgRDIvUGhvYm9zLgorICAgICAgICAgIGVjaG8gImltcG9ydCBzdGQuYWxnb3JpdGhtOyB2b2lkIG1haW4oKSB7fSIgPiBjb25maWd0ZXN0X2F4X2RtZC5kCisgICAgICAgICAgc3VjY2Vzcz1ubworICAgICAgICAgIG9JRlM9IiRJRlMiCisKKyAgICAgICAgICBJRlM9IiwiCisgICAgICAgICAgZm9yIERNRCBpbiAkRE1EX1BST0dTIDsgZG8KKyAgICAgICAgICAgIElGUz0iJG9JRlMiCisKKyAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkRE1EIGNvbmZpZ3Rlc3RfYXhfZG1kLmRcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgaWYgJERNRCBjb25maWd0ZXN0X2F4X2RtZC5kID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgICAgc3VjY2Vzcz15ZXMKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiICE9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIERNRD0iIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBheF9kbWQ9IiRzdWNjZXNzIgorCisgICAgICAgICAgIyBUZXN0IHdoZXRoZXIgT1BUTElOSyBpcyB1c2VkIGJ5IHRyeWluZyBpZiBETUQgYWNjZXB0cyAtTC8/IHdpdGhvdXQKKyAgICAgICAgICAjIGVycm9yaW5nIG91dC4KKyAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgPT0gInllcyIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBETUQgdXNlcyBPUFRMSU5LKQorICAgICAgICAgICAgZWNobyAiUnVubmluZyBc4oCdJERNRCAtTC8/IGNvbmZpZ3Rlc3RfYXhfZG1kLmRcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgaWYgJERNRCAtTC8/IGNvbmZpZ3Rlc3RfYXhfZG1kLmQgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgICAgZG1kX29wdGxpbms9InllcyIKKworICAgICAgICAgICAgICAjIFRoaXMgYWN0dWFsbHkgcHJvZHVjZXMgZG91YmxlIHNsYXNoZXMgaW4gdGhlIGZpbmFsIGNvbmZpZ3VyZQorICAgICAgICAgICAgICAjIG91dHB1dCwgYnV0IGF0IGxlYXN0IGl0IHdvcmtzLgorICAgICAgICAgICAgICBkbWRfb2ZfZGlyc2VwPSJcXFxcIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgICBkbWRfb3B0bGluaz0ibm8iCisgICAgICAgICAgICAgIGRtZF9vZl9kaXJzZXA9Ii8iCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2RtZCoKKyAgICAgICAgIF0pCisKKworQUNfREVGVU4oW0FYX0NIRUNLX0RfTU9EVUxFXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEQgbW9kdWxlIFskMV0pCisKKyAgICAgICAgICBlY2hvICJpbXBvcnQgJDE7IHZvaWQgbWFpbigpIHt9IiA+IGNvbmZpZ3Rlc3RfYXhfZG1kLmQKKworICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkRE1EIGNvbmZpZ3Rlc3RfYXhfZG1kLmRcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgIGlmICRETUQgLWMgY29uZmlndGVzdF9heF9kbWQuZCA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBmaQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9kbWQqCisgICAgICAgICBdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNCBiL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKaW5kZXggMDNhYjA4ZS4uMDIwMzk2MCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAorKysgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CkBAIC03LDcgKzcsNyBAQAogZG5sIGphdmEgY29tbWFuZCB0ZXN0ZWQuICBPdGhlcndpc2UsIGEgaGFyZC1jb2RlZCBsaXN0IHdpbGwgYmUgdXNlZC4KIGRubCBTaW1pbGFybHkgZm9yICJKQVZBQyIuCiBkbmwKLWRubCBBWF9KQVZBQ19BTkRfSkFWQSBkb2VzIG5vdCBjdXJyZW5seSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgorZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgogZG5sIEphdmEgdmVyc2lvbiwgdGVzdGluZyBmb3Igb25seSBvbmUgb2YgImphdmEiIGFuZCAiamF2YWMiLCBvcgogZG5sIGNvbXBpbGluZyBvciBydW5uaW5nIHVzZXItcHJvdmlkZWQgSmF2YSBjb2RlLgogZG5sCkBAIC01Nyw2ICs1NywxMCBAQAogICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAogICAgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCiAKKyAgICAgICAgICAgICAgIyBwcmV2ZW50ICRKQVZBIFZNIGlzc3VlcyB3aXRoIFVURi04IHBhdGggbmFtZXMgKFRIUklGVC0zMjcxKQorICAgICAgICAgICAgICBvTENfQUxMPSIkTENfQUxMIgorICAgICAgICAgICAgICBMQ19BTEw9IiIKKwogICAgICAgICAgICAgICBJRlM9IiwiCiAgICAgICAgICAgICAgIGZvciBKQVZBIGluICRKQVZBX1BST0dTIDsgZG8KICAgICAgICAgICAgICAgICBJRlM9IiRvSUZTIgpAQCAtNjksNiArNzMsMTAgQEAKIAogICAgICAgICAgICAgICBkb25lCiAKKyAgICAgICAgICAgICAgIyByZXN0b3JlIExDX0FMTAorICAgICAgICAgICAgICBMQ19BTEw9IiRvTENfQUxMIgorICAgICAgICAgICAgICBvTENfQUxMPSIiCisKICAgICAgICAgICAgIGZpCiAKICAgICAgICAgICBkb25lCkBAIC0xMDUsMyArMTEzLDE3IEBACiAKICAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5jbGFzcwogICAgICAgICAgIF0pCisKKworQUNfREVGVU4oW0FYX0NIRUNLX0FOVF9WRVJTSU9OXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGFudCB2ZXJzaW9uID4gJDIpCisgICAgICAgICAgQU5UX1ZBTElEPWBleHByICJ4JChwcmludGYgIiQyXG4kKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykiIHwgc29ydCAtdCAnLicgLWsgMSwxIC1rIDIsMiAtayAzLDMgLWcgfCBzZWQgLW4gMXApIiA9ICJ4JDIiYAorICAgICAgICAgIGlmIHRlc3QgIngkQU5UX1ZBTElEIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgQU5UPSIiCisgICAgICAgICAgZmkKKyAgICAgICAgICBdKQorCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNCBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CmluZGV4IDU2YWVmY2MuLmQ0ZGNkYzkgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CisrKyBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CkBAIC03NSwxMiArNzUsMTQgQEAKICAgICAgICAgICBBQ19MQU5HX1BVU0goW0NdKQogICAgICAgICAgIGRubCBUaGlzIGNhbiBiZSBjaGFuZ2VkIHRvIEFDX0xJTktfSUZFTFNFIGlmIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nLAogICAgICAgICAgIGRubCBidXQgdGhlbiB0aGUgdmVyc2lvbiBjYW5ub3QgYmUgY2hlY2tlZC4KLSAgICAgICAgICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCiAgICAgICAgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogICAgICAgICAgICNpbmNsdWRlIDxldmVudC5oPgogICAgICAgICAgIF1dLCBbWwogICAgICAgICAgIGNvbnN0IGNoYXIqIGxpYl92ZXJzaW9uID0gZXZlbnRfZ2V0X3ZlcnNpb24oKTsKICAgICAgICAgICBjb25zdCBjaGFyKiB3bnRfdmVyc2lvbiA9ICIkV0FOVF9MSUJFVkVOVF9WRVJTSU9OIjsKKyAgICAgICAgICBpbnQgbGliX2RpZ2l0czsKKyAgICAgICAgICBpbnQgd250X2RpZ2l0czsKICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHdhbnQgdmVyc2lvbi4gIFdlIGhhdmUgaXQuICovCiAgICAgICAgICAgICBpZiAoKndudF92ZXJzaW9uID09ICdcMCcgfHwgKndudF92ZXJzaW9uID09ICctJykgewpAQCAtOTMsMTMgKzk1LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiBJbiB0aGUgMS40IHZlcnNpb24gbnVtYmVyaW5nIHN0eWxlLCBpZiB0aGVyZSBhcmUgbW9yZSBkaWdpdHMgKi8KICAgICAgICAgICAgIC8qIGluIG9uZSB2ZXJzaW9uIHRoYW4gdGhlIG90aGVyLCB0aGF0IG9uZSBpcyBoaWdoZXIuICovCi0gICAgICAgICAgICBpbnQgbGliX2RpZ2l0czsKICAgICAgICAgICAgIGZvciAobGliX2RpZ2l0cyA9IDA7CiAgICAgICAgICAgICAgICAgbGliX3ZlcnNpb25bbGliX2RpZ2l0c10gPj0gJzAnICYmCiAgICAgICAgICAgICAgICAgbGliX3ZlcnNpb25bbGliX2RpZ2l0c10gPD0gJzknOwogICAgICAgICAgICAgICAgIGxpYl9kaWdpdHMrKykKICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgaW50IHdudF9kaWdpdHM7CiAgICAgICAgICAgICBmb3IgKHdudF9kaWdpdHMgPSAwOwogICAgICAgICAgICAgICAgIHdudF92ZXJzaW9uW3dudF9kaWdpdHNdID49ICcwJyAmJgogICAgICAgICAgICAgICAgIHdudF92ZXJzaW9uW3dudF9kaWdpdHNdIDw9ICc5JzsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAgICAgICAgICAgZG5sIEFsbG93IHNlYXJjaCBwYXRoIHRvIGJlIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgICAgICBBQ19BUkdfV0lUSChbbGliZXZlbnRdLAotICAgICAgICAgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZXZlbnRAPDpAPURJUkA6PkBdLCBbdXNlIGxpYmV2ZW50IChkZWZhdWx0IGlzIHllcykgLSBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSBmb3IgbGliZXZlbnRdKSwKKyAgICAgICAgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWxpYmV2ZW50QDw6QD1ESVJAOj5AXSwgW3VzZSBsaWJldmVudCBbZGVmYXVsdD15ZXNdLiBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHJvb3QgcHJlZml4IGRpciB3aGVyZSBsaWJldmVudCBpcyBpbnN0YWxsZWRdKSwKICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRfbGliZXZlbnQ9Im5vIgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkYXhfbGliZXZlbnRfcGF0aCI7IHRoZW4KICAgICAgICAgICAgICAgQVhfTElCX0VWRU5UX0RPX0NIRUNLCiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZvciBheF9saWJldmVudF9wYXRoIGluICIiIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgL29wdC9saWJldmVudCAiJExJQkVWRU5UX1JPT1QiIDsgZG8KKyAgICAgICAgICAgICAgZm9yIGF4X2xpYmV2ZW50X3BhdGggaW4gIiIgJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsICRsdF9zeXNyb290L29wdC9saWJldmVudCAiJExJQkVWRU5UX1JPT1QiIDsgZG8KICAgICAgICAgICAgICAgICBBWF9MSUJfRVZFTlRfRE9fQ0hFQ0sKICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgPSAieWVzIjsgdGhlbgogICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2xpYl96bGliLm00IGIvYWNsb2NhbC9heF9saWJfemxpYi5tNAppbmRleCA4YzEwYWI0Li5iZGI5ZTExIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2xpYl96bGliLm00CisrKyBiL2FjbG9jYWwvYXhfbGliX3psaWIubTQKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgICAjICAgKGRlZmluZWQgaW4gdGhlIGxpYnJhcnkpLgogICAgICAgICAgIEFDX0xBTkdfUFVTSChbQ10pCiAgICAgICAgICAgZG5sIFRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gQUNfTElOS19JRkVMU0UgaWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDx6bGliLmg+CiAgICAgICAgICAgI2lmIFpMSUJfVkVSTlVNID49IDB4JFdBTlRfWkxJQl9WRVJTSU9OCiAgICAgICAgICAgI2Vsc2UKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbHVhLm00IGIvYWNsb2NhbC9heF9sdWEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyMDE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfbHVhLm00CkBAIC0wLDAgKzEsNjY0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfbHVhLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19MVUFbKFtNSU5JTVVNLVZFUlNJT05dLCBbVE9PLUJJRy1WRVJTSU9OXSwgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX0hFQURFUlNbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9MSUJTWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfUkVBRExJTkVbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIworIyBERVNDUklQVElPTgorIworIyAgIERldGVjdCBhIEx1YSBpbnRlcnByZXRlciwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEgbWluaW11bSBhbmQgbWF4aW11bQorIyAgIHZlcnNpb24gbnVtYmVyLiBTZXQgdXAgaW1wb3J0YW50IEx1YSBwYXRocywgc3VjaCBhcyB0aGUgZGlyZWN0b3JpZXMgaW4KKyMgICB3aGljaCB0byBpbnN0YWxsIHNjcmlwdHMgYW5kIG1vZHVsZXMgKHNoYXJlZCBsaWJyYXJpZXMpLgorIworIyAgIEFsc28gZGV0ZWN0IEx1YSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuIFRoZSBMdWEgdmVyc2lvbiBjb250YWluZWQgaW4gdGhlCisjICAgaGVhZGVyIGlzIGNoZWNrZWQgdG8gbWF0Y2ggdGhlIEx1YSBpbnRlcnByZXRlciB2ZXJzaW9uIGV4YWN0bHkuIFdoZW4KKyMgICBzZWFyY2hpbmcgZm9yIEx1YSBsaWJyYXJpZXMsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB1c2VkIGFzIGEgc3VmZml4LgorIyAgIFRoaXMgaXMgZG9uZSB3aXRoIHRoZSBnb2FsIG9mIHN1cHBvcnRpbmcgbXVsdGlwbGUgTHVhIGluc3RhbGxzICg1LjEsCisjICAgNS4yLCBhbmQgNS4zIHNpZGUtYnktc2lkZSkuCisjCisjICAgQSBub3RlIG9uIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczogVGhpcyBmaWxlIGhhcyBiZWVuCisjICAgbW9zdGx5IHJld3JpdHRlbiBmb3Igc2VyaWFsIDE4LiBNb3N0IGRldmVsb3BlcnMgc2hvdWxkIGJlIGFibGUgdG8gdXNlCisjICAgdGhlc2UgbWFjcm9zIHdpdGhvdXQgbmVlZGluZyB0byBtb2RpZnkgY29uZmlndXJlLmFjLiBDYXJlIGhhcyBiZWVuIHRha2VuCisjICAgdG8gcHJlc2VydmUgZWFjaCBtYWNybydzIGJlaGF2aW9yLCBidXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXM6CisjCisjICAgMSkgQVhfV0lUSF9MVUEgaXMgZGVwcmVjYXRlZDsgaXQgbm93IGV4cGFuZHMgdG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgYXMKKyMgICBBWF9QUk9HX0xVQSB3aXRoIG5vIGFyZ3VtZW50cy4KKyMKKyMgICAyKSBBWF9MVUFfSEVBREVSUyBub3cgY2hlY2tzIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGRlZmluZWQgaW4gbHVhLmgKKyMgICBtYXRjaGVzIHRoZSBpbnRlcnByZXRlciB2ZXJzaW9uLiBBWF9MVUFfSEVBREVSU19WRVJTSU9OIGlzIHRoZXJlZm9yZQorIyAgIHVubmVjZXNzYXJ5LCBzbyBpdCBpcyBkZXByZWNhdGVkIGFuZCBkb2VzIG5vdCBleHBhbmQgdG8gYW55dGhpbmcuCisjCisjICAgMykgVGhlIGNvbmZpZ3VyZSBmbGFnIC0td2l0aC1sdWEtc3VmZml4IG5vIGxvbmdlciBleGlzdHM7IHRoZSB1c2VyCisjICAgc2hvdWxkIGluc3RlYWQgc3BlY2lmeSB0aGUgTFVBIHByZWNpb3VzIHZhcmlhYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUuCisjICAgU2VlIHRoZSBBWF9QUk9HX0xVQSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4KKyMKKyMgICBQbGVhc2UgcmVhZCB0aGUgbWFjcm8gZGVzY3JpcHRpb25zIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorIworIyAgIFRoaXMgZmlsZSB3YXMgaW5zcGlyZWQgYnkgQW5kcmV3IERhbGtlJ3MgYW5kIEphbWVzIEhlbnN0cmlkZ2UncworIyAgIHB5dGhvbi5tNCBhbmQgVG9tIFBheW5lJ3MsIE1hdHRoaWV1IE1veSdzLCBhbmQgUmV1YmVuIFRob21hcydzIGF4X2x1YS5tNAorIyAgIChzZXJpYWwgMTcpLiBCYXNpY2FsbHksIHRoaXMgZmlsZSBpcyBhIG1hc2gtdXAgb2YgdGhvc2UgdHdvIGZpbGVzLiBJCisjICAgbGlrZSB0byB0aGluayBpdCBjb21iaW5lcyB0aGUgYmVzdCBvZiB0aGUgdHdvIQorIworIyAgIEFYX1BST0dfTFVBOiBTZWFyY2ggZm9yIHRoZSBMdWEgaW50ZXJwcmV0ZXIsIGFuZCBzZXQgdXAgaW1wb3J0YW50IEx1YQorIyAgIHBhdGhzLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQSwgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIHBhdGggb2YgdGhlIEx1YQorIyAgIGludGVycHJldGVyLiBJZiBMVUEgaXMgYmxhbmssIHRoZSB1c2VyJ3MgcGF0aCBpcyBzZWFyY2hlZCBmb3IgYW4KKyMgICBzdWl0YWJsZSBpbnRlcnByZXRlci4KKyMKKyMgICBJZiBNSU5JTVVNLVZFUlNJT04gaXMgc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIHZlcnNpb24gbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gTUlOSU1VTS1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuIElmCisjICAgVE9PLUJJRy1WRVJTSU9OIGlzIGFsc28gc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIHZlcnNpb24gbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gTUlOSU1VTS1WRVJTSU9OIGFuZCBsZXNzIHRoYW4KKyMgICBUT08tQklHLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4KKyMKKyMgICBUaGUgTHVhIHZlcnNpb24gbnVtYmVyLCBMVUFfVkVSU0lPTiwgaXMgZm91bmQgZnJvbSB0aGUgaW50ZXJwcmV0ZXIsIGFuZAorIyAgIHN1YnN0aXR1dGVkLiBMVUFfUExBVEZPUk0gaXMgYWxzbyBmb3VuZCwgYnV0IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChubworIyAgIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uKS4KKyMKKyMgICBGaW5hbGx5LCB0aGUgbWFjcm8gZmluZHMgZm91ciBwYXRoczoKKyMKKyMgICAgIGx1YWRpciAgICAgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgc2NyaXB0cy4KKyMgICAgIHBrZ2x1YWRpciAgICAgICAgICAkbHVhZGlyLyRQQUNLQUdFCisjICAgICBsdWFleGVjZGlyICAgICAgICAgRGlyZWN0b3J5IHRvIGluc3RhbGwgTHVhIG1vZHVsZXMuCisjICAgICBwa2dsdWFleGVjZGlyICAgICAgJGx1YWV4ZWNkaXIvJFBBQ0tBR0UKKyMKKyMgICBUaGVzZSBwYXRocyBhcmUgZm91bmQgYmFzZWQgb24gJHByZWZpeCwgJGV4ZWNfcHJlZml4LCBMdWEncworIyAgIHBhY2thZ2UucGF0aCwgYW5kIHBhY2thZ2UuY3BhdGguIFRoZSBmaXJzdCBwYXRoIG9mIHBhY2thZ2UucGF0aAorIyAgIGJlZ2lubmluZyB3aXRoICRwcmVmaXggaXMgc2VsZWN0ZWQgYXMgbHVhZGlyLiBUaGUgZmlyc3QgcGF0aCBvZgorIyAgIHBhY2thZ2UuY3BhdGggYmVnaW5uaW5nIHdpdGggJGV4ZWNfcHJlZml4IGlzIHVzZWQgYXMgbHVhZXhlY2Rpci4gVGhpcworIyAgIHNob3VsZCB3b3JrIG9uIGFsbCByZWFzb25hYmxlIEx1YSBpbnN0YWxsYXRpb25zLiBJZiBhIHBhdGggY2Fubm90IGJlCisjICAgZGV0ZXJtaW5lZCwgYSBkZWZhdWx0IHBhdGggaXMgdXNlZC4gT2YgY291cnNlLCB0aGUgdXNlciBjYW4gb3ZlcnJpZGUKKyMgICB0aGVzZSBsYXRlciB3aGVuIGludm9raW5nIG1ha2UuCisjCisjICAgICBsdWFkaXIgICAgICAgICAgICAgRGVmYXVsdDogJHByZWZpeC9zaGFyZS9sdWEvJExVQV9WRVJTSU9OCisjICAgICBsdWFleGVjZGlyICAgICAgICAgRGVmYXVsdDogJGV4ZWNfcHJlZml4L2xpYi9sdWEvJExVQV9WRVJTSU9OCisjCisjICAgVGhlc2UgZGlyZWN0b3JpZXMgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgYXMgaW5zdGFsbCBkZXN0aW5hdGlvbnMuIFRoZQorIyAgIHZhcmlhYmxlIG5hbWUgbWludXMgJ2RpcicgbmVlZHMgdG8gYmUgdXNlZCBhcyBhIHByZWZpeCB0byB0aGUKKyMgICBhcHByb3ByaWF0ZSBBdXRvbWFrZSBwcmltYXJ5LCBlLmcuIGx1YV9TQ1JJUFMgb3IgbHVhZXhlY19MSUJSQVJJRVMuCisjCisjICAgSWYgYW4gYWNjZXB0YWJsZSBMdWEgaW50ZXJwcmV0ZXIgaXMgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzCisjICAgcGVyZm9ybWVkLCBvdGhlcndpc2UgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwcmVmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtCisjICAgRk9VTkQgaXMgYmxhbmssIHRoZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50CisjICAgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGdpdmUgJzonIGFzIGFuIGFjdGlvbi4KKyMKKyMgICBBWF9MVUFfSEVBREVSUzogU2VhcmNoIGZvciBMdWEgaGVhZGVycy4gUmVxdWlyZXMgdGhhdCBBWF9QUk9HX0xVQSBiZQorIyAgIGV4cGFuZGVkIGJlZm9yZSB0aGlzIG1hY3JvLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQV9JTkNMVURFLCB3aGljaAorIyAgIG1heSBjb250YWluIEx1YSBzcGVjaWZpYyBpbmNsdWRlIGZsYWdzLCBlLmcuIC1JL3Vzci9pbmNsdWRlL2x1YTUuMS4gSWYKKyMgICBMVUFfSU5DTFVERSBpcyBibGFuaywgdGhlbiB0aGlzIG1hY3JvIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHN1aXRhYmxlCisjICAgZmxhZ3MuCisjCisjICAgTFVBX0lOQ0xVREUgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgdG8gY29tcGlsZSBMdWEgbW9kdWxlcyBvcgorIyAgIGV4ZWN1dGFibGVzIHdpdGggZW1iZWRkZWQgaW50ZXJwcmV0ZXJzLiBUaGUgKl9DUFBGTEFHUyB2YXJpYWJsZXMgc2hvdWxkCisjICAgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuIG15cHJvZ19DUFBGTEFHUyA9ICQoTFVBX0lOQ0xVREUpLgorIworIyAgIFRoaXMgbWFjcm8gc2VhcmNoZXMgZm9yIHRoZSBoZWFkZXIgbHVhLmggKGFuZCBvdGhlcnMpLiBUaGUgc2VhcmNoIGlzCisjICAgcGVyZm9ybWVkIHdpdGggYSBjb21iaW5hdGlvbiBvZiBDUFBGTEFHUywgQ1BBVEgsIGV0YywgYW5kIExVQV9JTkNMVURFLgorIyAgIElmIHRoZSBzZWFyY2ggaXMgdW5zdWNjZXNzZnVsLCB0aGVuIHNvbWUgY29tbW9uIGRpcmVjdG9yaWVzIGFyZSB0cmllZC4KKyMgICBJZiB0aGUgaGVhZGVycyBhcmUgdGhlbiBmb3VuZCwgdGhlbiBMVUFfSU5DTFVERSBpcyBzZXQgYWNjb3JkaW5nbHkuCisjCisjICAgVGhlIHBhdGhzIGF1dG9tYXRpY2FsbHkgc2VhcmNoZWQgYXJlOgorIworIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhWC5ZCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWEvWC5ZCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWFYWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEtWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEvWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWFYWQorIworIyAgIChXaGVyZSBYLlkgaXMgdGhlIEx1YSB2ZXJzaW9uIG51bWJlciwgZS5nLiA1LjEuKQorIworIyAgIFRoZSBMdWEgdmVyc2lvbiBudW1iZXIgZm91bmQgaW4gdGhlIGhlYWRlcnMgaXMgYWx3YXlzIGNoZWNrZWQgdG8gbWF0Y2gKKyMgICB0aGUgTHVhIGludGVycHJldGVyJ3MgdmVyc2lvbiBudW1iZXIuIEx1YSBoZWFkZXJzIHdpdGggbWlzbWF0Y2hlZAorIyAgIHZlcnNpb24gbnVtYmVycyBhcmUgbm90IGFjY2VwdGVkLgorIworIyAgIElmIGhlYWRlcnMgYXJlIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZQorIyAgIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGJsYW5rLCB0aGVuCisjICAgaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yLAorIyAgIHNldCB0aGUgYWN0aW9uIHRvICc6Jy4KKyMKKyMgICBBWF9MVUFfTElCUzogU2VhcmNoIGZvciBMdWEgbGlicmFyaWVzLiBSZXF1aXJlcyB0aGF0IEFYX1BST0dfTFVBIGJlCisjICAgZXhwYW5kZWQgYmVmb3JlIHRoaXMgbWFjcm8uIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBX0xJQiwgd2hpY2ggbWF5CisjICAgY29udGFpbiBMdWEgc3BlY2lmaWMgbGlua2VyIGZsYWdzLCBlLmcuIC1sbHVhNS4xLiBJZiBMVUFfTElCIGlzIGJsYW5rLAorIyAgIHRoZW4gdGhpcyBtYWNybyB3aWxsIGF0dGVtcHQgdG8gZmluZCBzdWl0YWJsZSBmbGFncy4KKyMKKyMgICBMVUFfTElCIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIHRvIGxpbmsgTHVhIG1vZHVsZXMgb3IgZXhlY3V0YWJsZXMgd2l0aAorIyAgIGVtYmVkZGVkIGludGVycHJldGVycy4gVGhlICpfTElCQUREIGFuZCAqX0xEQUREIHZhcmlhYmxlcyBzaG91bGQgYmUgdXNlZAorIyAgIGZvciB0aGlzIHB1cnBvc2UsIGUuZy4gbXltb2RfTElCQUREID0gJChMVUFfTElCKS4KKyMKKyMgICBUaGlzIG1hY3JvIHNlYXJjaGVzIGZvciB0aGUgTHVhIGxpYnJhcnkuIE1vcmUgdGVjaG5pY2FsbHksIGl0IHNlYXJjaGVzCisjICAgZm9yIGEgbGlicmFyeSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBsdWFfbG9hZC4gVGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQKKyMgICB3aXRoIGEgY29tYmluYXRpb24gb2YgTElCUywgTElCUkFSWV9QQVRILCBhbmQgTFVBX0xJQi4KKyMKKyMgICBJZiB0aGUgc2VhcmNoIGRldGVybWluZXMgdGhhdCBzb21lIGxpbmtlciBmbGFncyBhcmUgbWlzc2luZywgdGhlbiB0aG9zZQorIyAgIGZsYWdzIHdpbGwgYmUgYWRkZWQgdG8gTFVBX0xJQi4KKyMKKyMgICBJZiBsaWJyYXJpZXMgYXJlIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZQorIyAgIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGJsYW5rLCB0aGVuCisjICAgaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yLAorIyAgIHNldCB0aGUgYWN0aW9uIHRvICc6Jy4KKyMKKyMgICBBWF9MVUFfUkVBRExJTkU6IFNlYXJjaCBmb3IgcmVhZGxpbmUgaGVhZGVycyBhbmQgbGlicmFyaWVzLiBSZXF1aXJlcyB0aGUKKyMgICBBWF9MSUJfUkVBRExJTkUgbWFjcm8sIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGF4X2xpYl9yZWFkbGluZS5tNCBmcm9tIHRoZQorIyAgIEF1dG9jb25mIEFyY2hpdmUuCisjCisjICAgSWYgYSByZWFkbGluZSBjb21wYXRpYmxlIGxpYnJhcnkgaXMgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzCisjICAgcGVyZm9ybWVkLCBvdGhlcndpc2UgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUmV1YmVuIFRob21hcyA8cnJ0QHNjM2Qub3JnPgorIyAgIENvcHlyaWdodCAoYykgMjAxNCBUaW0gUGVya2lucyA8dHByazc3QGdtYWlsLmNvbT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDQwCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfUFJPR19MVUEoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLAorZG5sICAgICAgICAgICAgIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX1BST0dfTFVBXSwKK1sKKyAgZG5sIENoZWNrIGZvciByZXF1aXJlZCB0b29scy4KKyAgQUNfUkVRVUlSRShbQUNfUFJPR19HUkVQXSkKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgIGRubCBNYWtlIExVQSBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFdLCBbVGhlIEx1YSBpbnRlcnByZXRlciwgZS5nLiAvdXNyL2Jpbi9sdWE1LjFdKQorCisgIGRubCBGaW5kIGEgTHVhIGludGVycHJldGVyLgorICBtNF9kZWZpbmVfZGVmYXVsdChbX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUXSwKKyAgICBbbHVhIGx1YTUuMyBsdWE1MyBsdWE1LjIgbHVhNTIgbHVhNS4xIGx1YTUxIGx1YTUwXSkKKworICBtNF9pZihbJDFdLCBbXSwKKyAgWyBkbmwgTm8gdmVyc2lvbiBjaGVjayBpcyBuZWVkZWQuIEZpbmQgYW55IEx1YSBpbnRlcnByZXRlci4KKyAgICBBU19JRihbdGVzdCAieCRMVUEiID0gJ3gnXSwKKyAgICAgIFtBQ19QQVRIX1BST0dTKFtMVUFdLCBbX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUXSwgWzpdKV0pCisgICAgYXhfZGlzcGxheV9MVUE9J2x1YScKKworICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgIT0gJ3g6J10sCisgICAgICBbIGRubCBBdCBsZWFzdCBjaGVjayBpZiB0aGlzIGlzIGEgTHVhIGludGVycHJldGVyLgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICRMVUEgaXMgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJExVQV0sCisgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgIEFDX01TR19FUlJPUihbbm90IGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgICBdKQorICAgICAgXSkKKyAgXSwKKyAgWyBkbmwgQSB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4KKyAgICBBU19JRihbdGVzdCAieCRMVUEiICE9ICd4J10sCisgICAgWyBkbmwgQ2hlY2sgaWYgdGhpcyBpcyBhIEx1YSBpbnRlcnByZXRlci4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgJExVQSBpcyBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJExVQV0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgIEFDX01TR19FUlJPUihbbm90IGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgXSkKKyAgICAgIGRubCBDaGVjayB0aGUgdmVyc2lvbi4KKyAgICAgIG00X2lmKFskMl0sIFtdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9IndoZXRoZXIgJExVQSB2ZXJzaW9uID49ICQxIl0sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0id2hldGhlciAkTFVBIHZlcnNpb24gPj0gJDEsIDwgJDIiXSkKKyAgICAgIEFDX01TR19DSEVDS0lORyhbJF9heF9jaGVja190ZXh0XSkKKyAgICAgIF9BWF9MVUFfQ0hLX1ZFUihbJExVQV0sIFskMV0sIFskMl0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgIEFDX01TR19FUlJPUihbdmVyc2lvbiBpcyBvdXQgb2YgcmFuZ2UgZm9yIHNwZWNpZmllZCBMVUFdKV0pCisgICAgICBheF9kaXNwbGF5X0xVQT0kTFVBCisgICAgXSwKKyAgICBbIGRubCBUcnkgZWFjaCBpbnRlcnByZXRlciB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHNhdGlzZmllcyBWRVJTSU9OLgorICAgICAgbTRfaWYoWyQyXSwgW10sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0iZm9yIGEgTHVhIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAkMSJdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9ImZvciBhIEx1YSBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gPj0gJDEsIDwgJDIiXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFskX2F4X2NoZWNrX3RleHRdLAorICAgICAgICBbYXhfY3ZfcGF0aGxlc3NfTFVBXSwKKyAgICAgICAgWyBmb3IgYXhfY3ZfcGF0aGxlc3NfTFVBIGluIF9BWF9MVUFfSU5URVJQUkVURVJfTElTVCBub25lOyBkbworICAgICAgICAgICAgdGVzdCAieCRheF9jdl9wYXRobGVzc19MVUEiID0gJ3hub25lJyAmJiBicmVhaworICAgICAgICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRheF9jdl9wYXRobGVzc19MVUFdLCBbXSwgW2NvbnRpbnVlXSkKKyAgICAgICAgICAgIF9BWF9MVUFfQ0hLX1ZFUihbJGF4X2N2X3BhdGhsZXNzX0xVQV0sIFskMV0sIFskMl0sIFticmVha10pCisgICAgICAgICAgZG9uZQorICAgICAgICBdKQorICAgICAgZG5sIFNldCAkTFVBIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mICRheF9jdl9wYXRobGVzc19MVUEuCisgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9wYXRobGVzc19MVUEiID0gJ3hub25lJ10sCisgICAgICAgIFtMVUE9JzonXSwKKyAgICAgICAgW0FDX1BBVEhfUFJPRyhbTFVBXSwgWyRheF9jdl9wYXRobGVzc19MVUFdKV0pCisgICAgICBheF9kaXNwbGF5X0xVQT0kYXhfY3ZfcGF0aGxlc3NfTFVBCisgICAgXSkKKyAgXSkKKworICBBU19JRihbdGVzdCAieCRMVUEiID0gJ3g6J10sCisgIFsgZG5sIFJ1biBhbnkgdXNlci1zcGVjaWZpZWQgYWN0aW9uLCBvciBhYm9ydC4KKyAgICBtNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHN1aXRhYmxlIEx1YSBpbnRlcnByZXRlcl0pXSkKKyAgXSwKKyAgWyBkbmwgUXVlcnkgTHVhIGZvciBpdHMgdmVyc2lvbiBudW1iZXIuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgdmVyc2lvbl0sCisgICAgICBbYXhfY3ZfbHVhX3ZlcnNpb25dLAorICAgICAgWyBkbmwgR2V0IHRoZSBpbnRlcnByZXRlciB2ZXJzaW9uIGluIFguWSBmb3JtYXQuIFRoaXMgc2hvdWxkIHdvcmsgZm9yCisgICAgICAgIGRubCBpbnRlcnByZXRlcnMgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgICAgICAgYXhfY3ZfbHVhX3ZlcnNpb249W2AkTFVBIC1lICcKKyAgICAgICAgICAtLSByZXR1cm4gYSB2ZXJzaW9uIG51bWJlciBpbiBYLlkgZm9ybWF0CisgICAgICAgICAgbG9jYWwgXywgXywgdmVyID0gc3RyaW5nLmZpbmQoX1ZFUlNJT04sICJeTHVhICglZCslLiVkKykiKQorICAgICAgICAgIHByaW50KHZlciknYF0KKyAgICAgIF0pCisgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfbHVhX3ZlcnNpb24iID0gJ3gnXSwKKyAgICAgIFtBQ19NU0dfRVJST1IoW2ludmFsaWQgTHVhIHZlcnNpb24gbnVtYmVyXSldKQorICAgIEFDX1NVQlNUKFtMVUFfVkVSU0lPTl0sIFskYXhfY3ZfbHVhX3ZlcnNpb25dKQorICAgIEFDX1NVQlNUKFtMVUFfU0hPUlRfVkVSU0lPTl0sIFtgZWNobyAiJExVQV9WRVJTSU9OIiB8ICRTRUQgJ3N8XC58fCdgXSkKKworICAgIGRubCBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIG5vdCBzdXBwb3J0ZWQ6CisgICAgZG5sIEF0IHRpbWVzIChsaWtlIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcykgeW91IG1heSB3YW50IHRvIGtub3cKKyAgICBkbmwgd2hpY2ggT1MgcGxhdGZvcm0gTHVhIHRoaW5rcyB0aGlzIGlzLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHBsYXRmb3JtXSwKKyAgICAgIFtheF9jdl9sdWFfcGxhdGZvcm1dLAorICAgICAgW2F4X2N2X2x1YV9wbGF0Zm9ybT1bYCRMVUEgLWUgJ3ByaW50KCJ1bmtub3duIiknYF1dKQorICAgIEFDX1NVQlNUKFtMVUFfUExBVEZPUk1dLCBbJGF4X2N2X2x1YV9wbGF0Zm9ybV0pCisKKyAgICBkbmwgVXNlIHRoZSB2YWx1ZXMgb2YgJHByZWZpeCBhbmQgJGV4ZWNfcHJlZml4IGZvciB0aGUgY29ycmVzcG9uZGluZworICAgIGRubCB2YWx1ZXMgb2YgTFVBX1BSRUZJWCBhbmQgTFVBX0VYRUNfUFJFRklYLiBUaGVzZSBhcmUgbWFkZSBkaXN0aW5jdAorICAgIGRubCB2YXJpYWJsZXMgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiBIb3dldmVyLCB0aGUgZ2VuZXJhbAorICAgIGRubCBjb25zZW5zdXMgaXMgdGhhdCB5b3Ugc2hvdWxkbid0IG5lZWQgdGhpcyBhYmlsaXR5LgorICAgIEFDX1NVQlNUKFtMVUFfUFJFRklYXSwgWycke3ByZWZpeH0nXSkKKyAgICBBQ19TVUJTVChbTFVBX0VYRUNfUFJFRklYXSwgWycke2V4ZWNfcHJlZml4fSddKQorCisgICAgZG5sIEx1YSBwcm92aWRlcyBubyB3YXkgdG8gcXVlcnkgdGhlIHNjcmlwdCBkaXJlY3RvcnksIGFuZCBpbnN0ZWFkCisgICAgZG5sIHByb3ZpZGVzIExVQV9QQVRILiBIb3dldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGEgc2FmZSBlZHVjYXRlZAorICAgIGRubCBndWVzcy4gSWYgdGhlIGJ1aWx0LWluIHNlYXJjaCBwYXRoIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgZG5sIHByZWZpeGVkIGJ5ICRwcmVmaXgsIHRoZW4gd2UgY2FuIHN0b3JlIHNjcmlwdHMgdGhlcmUuIFRoZSBmaXJzdAorICAgIGRubCBtYXRjaGluZyBwYXRoIHdpbGwgYmUgdXNlZC4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBzY3JpcHQgZGlyZWN0b3J5XSwKKyAgICAgIFtheF9jdl9sdWFfbHVhZGlyXSwKKyAgICAgIFsgQVNfSUYoW3Rlc3QgIngkcHJlZml4IiA9ICd4Tk9ORSddLAorICAgICAgICAgIFtheF9sdWFfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeF0sCisgICAgICAgICAgW2F4X2x1YV9wcmVmaXg9JHByZWZpeF0pCisKKyAgICAgICAgZG5sIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgcGF0aC4KKyAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj0iJExVQV9QUkVGSVgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTiIKKworICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbc2NyaXB0XSkKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCisgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgorICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYAorICAgICAgICAgIGF4X2N2X2x1YV9sdWFkaXI9YGVjaG8gIiRheF9sdWFfcHJlZml4ZWRfcGF0aCIgfCBcCisgICAgICAgICAgICAkU0VEICJzfF4kX2F4X3N0cmlwX3ByZWZpeHwkTFVBX1BSRUZJWHwiYAorICAgICAgICBdKQorICAgICAgXSkKKyAgICBBQ19TVUJTVChbbHVhZGlyXSwgWyRheF9jdl9sdWFfbHVhZGlyXSkKKyAgICBBQ19TVUJTVChbcGtnbHVhZGlyXSwgW1wke2x1YWRpcn0vJFBBQ0tBR0VdKQorCisgICAgZG5sIEx1YSBwcm92aWRlcyBubyB3YXkgdG8gcXVlcnkgdGhlIG1vZHVsZSBkaXJlY3RvcnksIGFuZCBpbnN0ZWFkCisgICAgZG5sIHByb3ZpZGVzIExVQV9QQVRILiBIb3dldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGEgc2FmZSBlZHVjYXRlZAorICAgIGRubCBndWVzcy4gSWYgdGhlIGJ1aWx0LWluIHNlYXJjaCBwYXRoIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgZG5sIHByZWZpeGVkIGJ5ICRleGVjX3ByZWZpeCwgdGhlbiB3ZSBjYW4gc3RvcmUgbW9kdWxlcyB0aGVyZS4gVGhlIGZpcnN0CisgICAgZG5sIG1hdGNoaW5nIHBhdGggd2lsbCBiZSB1c2VkLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIG1vZHVsZSBkaXJlY3RvcnldLAorICAgICAgW2F4X2N2X2x1YV9sdWFleGVjZGlyXSwKKyAgICAgIFsgQVNfSUYoW3Rlc3QgIngkZXhlY19wcmVmaXgiID0gJ3hOT05FJ10sCisgICAgICAgICAgW2F4X2x1YV9leGVjX3ByZWZpeD0kYXhfbHVhX3ByZWZpeF0sCisgICAgICAgICAgW2F4X2x1YV9leGVjX3ByZWZpeD0kZXhlY19wcmVmaXhdKQorCisgICAgICAgIGRubCBJbml0aWFsaXplIHRvIHRoZSBkZWZhdWx0IHBhdGguCisgICAgICAgIGF4X2N2X2x1YV9sdWFleGVjZGlyPSIkTFVBX0VYRUNfUFJFRklYL2xpYi9sdWEvJExVQV9WRVJTSU9OIgorCisgICAgICAgIGRubCBUcnkgdG8gZmluZCBhIHBhdGggd2l0aCB0aGUgcHJlZml4LgorICAgICAgICBfQVhfTFVBX0ZORF9QUkZYX1BUSChbJExVQV0sCisgICAgICAgICAgWyRheF9sdWFfZXhlY19wcmVmaXhdLCBbbW9kdWxlXSkKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCisgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgorICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfZXhlY19wcmVmaXgiIHwgJFNFRCAnc3wufC58ZydgCisgICAgICAgICAgYXhfY3ZfbHVhX2x1YWV4ZWNkaXI9YGVjaG8gIiRheF9sdWFfcHJlZml4ZWRfcGF0aCIgfCBcCisgICAgICAgICAgICAkU0VEICJzfF4kX2F4X3N0cmlwX3ByZWZpeHwkTFVBX0VYRUNfUFJFRklYfCJgCisgICAgICAgIF0pCisgICAgICBdKQorICAgIEFDX1NVQlNUKFtsdWFleGVjZGlyXSwgWyRheF9jdl9sdWFfbHVhZXhlY2Rpcl0pCisgICAgQUNfU1VCU1QoW3BrZ2x1YWV4ZWNkaXJdLCBbXCR7bHVhZXhlY2Rpcn0vJFBBQ0tBR0VdKQorCisgICAgZG5sIFJ1biBhbnkgdXNlciBzcGVjaWZpZWQgYWN0aW9uLgorICAgICQzCisgIF0pCitdKQorCitkbmwgQVhfV0lUSF9MVUEgaXMgbm93IHRoZSBzYW1lIHRoaW5nIGFzIEFYX1BST0dfTFVBLgorQUNfREVGVU4oW0FYX1dJVEhfTFVBXSwKK1sKKyAgQUNfTVNHX1dBUk4oW1skMCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIEFYX1BST0dfTFVBIGluc3RlYWRdXSkKKyAgQVhfUFJPR19MVUEKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0NIS19JU19JTlRSUChQUk9HLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9DSEtfSVNfSU5UUlBdLAorWworICBkbmwgQSBtaW5pbWFsIEx1YSBmYWN0b3JpYWwgdG8gcHJvdmUgdGhpcyBpcyBhbiBpbnRlcnByZXRlci4gVGhpcyBzaG91bGQgd29yaworICBkbmwgZm9yIEx1YSBpbnRlcnByZXRlcnMgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgX2F4X2x1YV9mYWN0b3JpYWw9W2AkMSAyPi9kZXYvbnVsbCAtZSAnCisgICAgLS0gYSBzaW1wbGUgZmFjdG9yaWFsCisgICAgZnVuY3Rpb24gZmFjdCAobikKKyAgICAgIGlmIG4gPT0gMCB0aGVuCisgICAgICAgIHJldHVybiAxCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBuICogZmFjdChuLTEpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBwcmludCgiZmFjdCg1KSBpcyAiIC4uIGZhY3QoNSkpJ2BdCisgIEFTX0lGKFt0ZXN0ICIkX2F4X2x1YV9mYWN0b3JpYWwiID0gJ2ZhY3QoNSkgaXMgMTIwJ10sCisgICAgWyQyXSwgWyQzXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0NIS19WRVIoUFJPRywgTUlOSU1VTS1WRVJTSU9OLCBbVE9PLUJJRy1WRVJTSU9OXSwKK2RubCAgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfQ0hLX1ZFUl0sCitbCisgIGRubCBDaGVjayB0aGF0IHRoZSBMdWEgdmVyc2lvbiBpcyB3aXRoaW4gdGhlIGJvdW5kcy4gT25seSB0aGUgbWFqb3IgYW5kIG1pbm9yCisgIGRubCB2ZXJzaW9uIG51bWJlcnMgYXJlIGNvbnNpZGVyZWQuIFRoaXMgc2hvdWxkIHdvcmsgZm9yIEx1YSBpbnRlcnByZXRlcnMKKyAgZG5sIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgIF9heF9sdWFfZ29vZF92ZXJzaW9uPVtgJDEgLWUgJworICAgIC0tIGEgc2NyaXB0IHRvIGNvbXBhcmUgdmVyc2lvbnMKKyAgICBmdW5jdGlvbiB2ZXJzdHIybnVtKHZlcnN0cikKKyAgICAgIGxvY2FsIF8sIF8sIG1ham9ydmVyLCBtaW5vcnZlciA9IHN0cmluZy5maW5kKHZlcnN0ciwgIl4oJWQrKSUuKCVkKykiKQorICAgICAgaWYgbWFqb3J2ZXIgYW5kIG1pbm9ydmVyIHRoZW4KKyAgICAgICAgcmV0dXJuIHRvbnVtYmVyKG1ham9ydmVyKSAqIDEwMCArIHRvbnVtYmVyKG1pbm9ydmVyKQorICAgICAgZW5kCisgICAgZW5kCisgICAgbG9jYWwgbWludmVyID0gdmVyc3RyMm51bSgiJDIiKQorICAgIGxvY2FsIF8sIF8sIHRyaW12ZXIgPSBzdHJpbmcuZmluZChfVkVSU0lPTiwgIl5MdWEgKC4qKSIpCisgICAgbG9jYWwgdmVyID0gdmVyc3RyMm51bSh0cmltdmVyKQorICAgIGxvY2FsIG1heHZlciA9IHZlcnN0cjJudW0oIiQzIikgb3IgMWU5CisgICAgaWYgbWludmVyIDw9IHZlciBhbmQgdmVyIDwgbWF4dmVyIHRoZW4KKyAgICAgIHByaW50KCJ5ZXMiKQorICAgIGVsc2UKKyAgICAgIHByaW50KCJubyIpCisgICAgZW5kJ2BdCisgICAgQVNfSUYoW3Rlc3QgIngkX2F4X2x1YV9nb29kX3ZlcnNpb24iID0gInh5ZXMiXSwKKyAgICAgIFskNF0sIFskNV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9GTkRfUFJGWF9QVEgoUFJPRywgUFJFRklYLCBTQ1JJUFQtT1ItTU9EVUxFLURJUikKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9GTkRfUFJGWF9QVEhdLAorWworICBkbmwgR2V0IHRoZSBzY3JpcHQgb3IgbW9kdWxlIGRpcmVjdG9yeSBieSBxdWVyeWluZyB0aGUgTHVhIGludGVycHJldGVyLAorICBkbmwgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwcmVmaXgsIGFuZCBzZWxlY3RpbmcgdGhlIHNoYWxsb3dlc3QgcGF0aC4gSWYgbm8KKyAgZG5sIHBhdGggaXMgZm91bmQgbWF0Y2hpbmcgdGhlIHByZWZpeCwgdGhlIHJlc3VsdCB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgZG5sIFRoZSB0aGlyZCBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHNlYXJjaCwgaXQgY2FuIGJlICdzY3JpcHQnIG9yCisgIGRubCAnbW9kdWxlJy4gU3VwcGx5aW5nICdzY3JpcHQnIHdpbGwgcGVyZm9ybSB0aGUgc2VhcmNoIHdpdGggcGFja2FnZS5wYXRoCisgIGRubCBhbmQgTFVBX1BBVEgsIGFuZCBzdXBwbHlpbmcgJ21vZHVsZScgd2lsbCBzZWFyY2ggd2l0aCBwYWNrYWdlLmNwYXRoIGFuZAorICBkbmwgTFVBX0NQQVRILiBUaGlzIGlzIGRvbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4wLgorCisgIGF4X2x1YV9wcmVmaXhlZF9wYXRoPVtgJDEgLWUgJworICAgIC0tIGdldCB0aGUgcGF0aCBiYXNlZCBvbiBzZWFyY2ggdHlwZQorICAgIGxvY2FsIHNlYXJjaHR5cGUgPSAiJDMiCisgICAgbG9jYWwgcGF0aHMgPSAiIgorICAgIGlmIHNlYXJjaHR5cGUgPT0gInNjcmlwdCIgdGhlbgorICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5wYXRoKSBvciBMVUFfUEFUSAorICAgIGVsc2VpZiBzZWFyY2h0eXBlID09ICJtb2R1bGUiIHRoZW4KKyAgICAgIHBhdGhzID0gKHBhY2thZ2UgYW5kIHBhY2thZ2UuY3BhdGgpIG9yIExVQV9DUEFUSAorICAgIGVuZAorICAgIC0tIHNlYXJjaCBmb3IgdGhlIHByZWZpeAorICAgIGxvY2FsIHByZWZpeCA9ICInJDInIgorICAgIGxvY2FsIG1pbnBhdGggPSAiIgorICAgIGxvY2FsIG1pbmRlcHRoID0gMWU5CisgICAgc3RyaW5nLmdzdWIocGF0aHMsICIoQDw6QF47QDo+QCspIiwKKyAgICAgIGZ1bmN0aW9uIChwYXRoKQorICAgICAgICBwYXRoID0gc3RyaW5nLmdzdWIocGF0aCwgIiU/LiokIiwgIiIpCisgICAgICAgIHBhdGggPSBzdHJpbmcuZ3N1YihwYXRoLCAiL0A8OkBeL0A6PkAqJCIsICIiKQorICAgICAgICBpZiBzdHJpbmcuZmluZChwYXRoLCBwcmVmaXgpIHRoZW4KKyAgICAgICAgICBsb2NhbCBkZXB0aCA9IHN0cmluZy5sZW4oc3RyaW5nLmdzdWIocGF0aCwgIkA8OkBeL0A6PkAiLCAiIikpCisgICAgICAgICAgaWYgZGVwdGggPCBtaW5kZXB0aCB0aGVuCisgICAgICAgICAgICBtaW5wYXRoID0gcGF0aAorICAgICAgICAgICAgbWluZGVwdGggPSBkZXB0aAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZCkKKyAgICBwcmludChtaW5wYXRoKSdgXQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9IRUFERVJTKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9IRUFERVJTXSwKK1sKKyAgZG5sIENoZWNrIGZvciBMVUFfVkVSU0lPTi4KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMVUFfVkVSU0lPTiBpcyBkZWZpbmVkXSkKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX1ZFUlNJT04iICE9ICd4J10sCisgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIEx1YSBoZWFkZXJzIHdpdGhvdXQga25vd2luZyBMVUFfVkVSU0lPTl0pCisgICAgXSkKKworICBkbmwgTWFrZSBMVUFfSU5DTFVERSBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFfSU5DTFVERV0sIFtUaGUgTHVhIGluY2x1ZGVzLCBlLmcuIC1JL3Vzci9pbmNsdWRlL2x1YTUuMV0pCisKKyAgZG5sIFNvbWUgZGVmYXVsdCBkaXJlY3RvcmllcyB0byBzZWFyY2guCisgIExVQV9TSE9SVF9WRVJTSU9OPWBlY2hvICIkTFVBX1ZFUlNJT04iIHwgJFNFRCAnc3xcLnx8J2AKKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BWF9MVUFfSU5DTFVERV9MSVNUXSwKKyAgICBbIC91c3IvaW5jbHVkZS9sdWEkTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YS8kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEvJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgIF0pCisKKyAgZG5sIFRyeSB0byBmaW5kIHRoZSBoZWFkZXJzLgorICBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICBDUFBGTEFHUz0iJENQUEZMQUdTICRMVUFfSU5DTFVERSIKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbbHVhLmggbHVhbGliLmggbGF1eGxpYi5oIGx1YWNvbmYuaF0pCisgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisKKyAgZG5sIFRyeSBzb21lIG90aGVyIGRpcmVjdG9yaWVzIGlmIExVQV9JTkNMVURFIHdhcyBub3Qgc2V0LgorICBBU19JRihbdGVzdCAieCRMVUFfSU5DTFVERSIgPSAneCcgJiYKKyAgICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiAhPSAneHllcyddLAorICAgIFsgZG5sIFRyeSBzb21lIGNvbW1vbiBpbmNsdWRlIHBhdGhzLgorICAgICAgZm9yIF9heF9pbmNsdWRlX3BhdGggaW4gX0FYX0xVQV9JTkNMVURFX0xJU1Q7IGRvCisgICAgICAgIHRlc3QgISAtZCAiJF9heF9pbmNsdWRlX3BhdGgiICYmIGNvbnRpbnVlCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgTHVhIGhlYWRlcnMgaW5dKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskX2F4X2luY2x1ZGVfcGF0aF0pCisKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhbGliX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2xhdXhsaWJfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhY29uZl9oXSkKKworICAgICAgICBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJF9heF9pbmNsdWRlX3BhdGgiCisgICAgICAgIEFDX0NIRUNLX0hFQURFUlMoW2x1YS5oIGx1YWxpYi5oIGxhdXhsaWIuaCBsdWFjb25mLmhdKQorICAgICAgICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgPSAneHllcyddLAorICAgICAgICAgIFsgTFVBX0lOQ0xVREU9Ii1JJF9heF9pbmNsdWRlX3BhdGgiCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIF0pCisgICAgICBkb25lCisgICAgXSkKKworICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giID0gJ3h5ZXMnXSwKKyAgICBbIGRubCBNYWtlIGEgcHJvZ3JhbSB0byBwcmludCBMVUFfVkVSU0lPTiBkZWZpbmVkIGluIHRoZSBoZWFkZXIuCisgICAgICBkbmwgVE9ETyBJdCB3b3VsZCBiZSByZWFsbHkgbmljZSBpZiB3ZSBjb3VsZCBkbyB0aGlzIHdpdGhvdXQgY29tcGlsaW5nIGEKKyAgICAgIGRubCBwcm9ncmFtLCB0aGVuIGl0IHdvdWxkIHdvcmsgd2hlbiBjcm9zcyBjb21waWxpbmcuIEJ1dCBJJ20gbm90IHN1cmUgaG93CisgICAgICBkbmwgdG8gZG8gdGhpcyByZWxpYWJseS4gRm9yIG5vdywgYXNzdW1lIHZlcnNpb25zIG1hdGNoIHdoZW4gY3Jvc3MgY29tcGlsaW5nLgorCisgICAgICBBU19JRihbdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICd4eWVzJ10sCisgICAgICAgIFsgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMdWEgaGVhZGVyIHZlcnNpb25dLAorICAgICAgICAgICAgW2F4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbl0sCisgICAgICAgICAgICBbIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgICAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJExVQV9JTkNMVURFIgorICAgICAgICAgICAgICBBQ19SVU5fSUZFTFNFKAorICAgICAgICAgICAgICAgIFsgQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgaWYoYXJnYyA+IDEpIHByaW50ZigiJXMiLCBMVUFfVkVSU0lPTik7CisgIGV4aXQoRVhJVF9TVUNDRVNTKTsKK30KK11dKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgWyBheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb249YC4vY29uZnRlc3QkRVhFRVhUIHAgfCBcCisgICAgICAgICAgICAgICAgICAgICRTRUQgLW4gInN8Xkx1YSBcKEA8OkAwLTlAOj5AXHsxLFx9XC5APDpAMC05QDo+QFx7MSxcfVwpLlx7MCxcfXxcMXxwImAKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFtheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb249J3Vua25vd24nXSkKKyAgICAgICAgICAgICAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgICBkbmwgQ29tcGFyZSB0aGlzIHRvIHRoZSBwcmV2aW91c2x5IGZvdW5kIExVQV9WRVJTSU9OLgorICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgTHVhIGhlYWRlciB2ZXJzaW9uIG1hdGNoZXMgJExVQV9WRVJTSU9OXSkKKyAgICAgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb24iID0gIngkTFVBX1ZFUlNJT04iXSwKKyAgICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J3llcycKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J25vJworICAgICAgICAgICAgXSkKKyAgICAgICAgXSwKKyAgICAgICAgWyBBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nIHNvIGFzc3VtaW5nIGhlYWRlciB2ZXJzaW9uIG51bWJlciBtYXRjaGVzXSkKKyAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0neWVzJworICAgICAgICBdKQorICAgIF0pCisKKyAgZG5sIFdhcyBMVUFfSU5DTFVERSBzcGVjaWZpZWQ/CisgIEFTX0lGKFt0ZXN0ICJ4JGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoIiAhPSAneHllcycgJiYKKyAgICAgICAgIHRlc3QgIngkTFVBX0lOQ0xVREUiICE9ICd4J10sCisgICAgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgaGVhZGVycyBmb3Igc3BlY2lmaWVkIExVQV9JTkNMVURFXSldKQorCisgIGRubCBUZXN0IHRoZSBmaW5hbCByZXN1bHQgYW5kIHJ1biB1c2VyIGNvZGUuCisgIEFTX0lGKFt0ZXN0ICJ4JGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoIiA9ICd4eWVzJ10sIFskMV0sCisgICAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgTHVhIGluY2x1ZGVzXSldKV0pCitdKQorCitkbmwgQVhfTFVBX0hFQURFUlNfVkVSU0lPTiBubyBsb25nZXIgZXhpc3RzLCB1c2UgQVhfTFVBX0hFQURFUlMuCitBQ19ERUZVTihbQVhfTFVBX0hFQURFUlNfVkVSU0lPTl0sCitbCisgIEFDX01TR19XQVJOKFtbJDAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBBWF9MVUFfSEVBREVSUyBpbnN0ZWFkXV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX0xJQlMoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX0xJQlNdLAorWworICBkbmwgVE9ETyBTaG91bGQgdGhpcyBtYWNybyBhbHNvIGNoZWNrIHZhcmlvdXMgLUwgZmxhZ3M/CisKKyAgZG5sIENoZWNrIGZvciBMVUFfVkVSU0lPTi4KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMVUFfVkVSU0lPTiBpcyBkZWZpbmVkXSkKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX1ZFUlNJT04iICE9ICd4J10sCisgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIEx1YSBsaWJzIHdpdGhvdXQga25vd2luZyBMVUFfVkVSU0lPTl0pCisgICAgXSkKKworICBkbmwgTWFrZSBMVUFfTElCIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV9MSUJdLCBbVGhlIEx1YSBsaWJyYXJ5LCBlLmcuIC1sbHVhNS4xXSkKKworICBBU19JRihbdGVzdCAieCRMVUFfTElCIiAhPSAneCddLAorICBbIGRubCBDaGVjayB0aGF0IExVQV9MSUJTIHdvcmtzLgorICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtsdWFfbG9hZF0sIFtdLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0neWVzJ10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSdubyddKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgZG5sIENoZWNrIHRoZSByZXN1bHQuCisgICAgQVNfSUYoW3Rlc3QgIngkX2F4X2ZvdW5kX2x1YV9saWJzIiAhPSAneHllcyddLAorICAgICAgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgbGlicyBmb3Igc3BlY2lmaWVkIExVQV9MSUJdKV0pCisgIF0sCisgIFsgZG5sIEZpcnN0IHNlYXJjaCBmb3IgZXh0cmEgbGlicy4KKyAgICBfYXhfbHVhX2V4dHJhX2xpYnM9JycKKworICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtleHBdLCBbbV0pCisgICAgQUNfU0VBUkNIX0xJQlMoW2Rsb3Blbl0sIFtkbF0pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfZXhwIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9leHAiICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW19heF9sdWFfZXh0cmFfbGlicz0iJF9heF9sdWFfZXh0cmFfbGlicyAkYWNfY3Zfc2VhcmNoX2V4cCJdKQorCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfZGxvcGVuIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtfYXhfbHVhX2V4dHJhX2xpYnM9IiRfYXhfbHVhX2V4dHJhX2xpYnMgJGFjX2N2X3NlYXJjaF9kbG9wZW4iXSkKKworICAgIGRubCBUcnkgdG8gZmluZCB0aGUgTHVhIGxpYnMuCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2x1YV9sb2FkXSwKKyAgICAgIFsgbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgICAgbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgICAgbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAgIGx1YS0kTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgICBsdWEgXAorICAgICAgXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J3llcyddLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0nbm8nXSwKKyAgICAgIFskX2F4X2x1YV9leHRyYV9saWJzXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9sdWFfbG9hZCIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfbHVhX2xvYWQiICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW0xVQV9MSUI9IiRhY19jdl9zZWFyY2hfbHVhX2xvYWQgJF9heF9sdWFfZXh0cmFfbGlicyJdKQorICBdKQorCisgIGRubCBUZXN0IHRoZSByZXN1bHQgYW5kIHJ1biB1c2VyIGNvZGUuCisgIEFTX0lGKFt0ZXN0ICJ4JF9heF9mb3VuZF9sdWFfbGlicyIgPSAneHllcyddLCBbJDFdLAorICAgIFttNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIEx1YSBsaWJzXSldKV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX1JFQURMSU5FKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9SRUFETElORV0sCitbCisgIEFYX0xJQl9SRUFETElORQorICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfcmVhZGxpbmVfcmVhZGxpbmVfaCIgIT0gJ3gnICYmCisgICAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9yZWFkbGluZV9oaXN0b3J5X2giICE9ICd4J10sCisgICAgWyBMVUFfTElCU19DRkxBR1M9Ii1ETFVBX1VTRV9SRUFETElORSAkTFVBX0xJQlNfQ0ZMQUdTIgorICAgICAgJDEKKyAgICBdLAorICAgIFskMl0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNzQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSw2MSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3VyZSB0aGF0IC5ORVQgQ29yZSBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQuIElmIHRydWUgdGhlCisjICAgc2hlbGwgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzCisjICAgaW4gQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSAkZG90bmV0Y29yZV92ZXJzaW9uIHZhcmlhYmxlIHdpbGwgYmUKKyMgICBmaWxsZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgdmVyc2lvbi4KKyMKKyMgICBUaGlzIG1hY3JvIHVzZXMgdGhlICRET1RORVRDT1JFIHZhcmlhYmxlIHRvIHBlcmZvcm0gdGhlIGNoZWNrLiBJZgorIyAgICRET1RORVRDT1JFIGlzIG5vdCBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1hY3JvLCB0aGUgbWFjcm8gd2lsbCBmYWlsLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLFtkb3RuZXRdKQorIyAgICAgQUNfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oWzEuMC4yXSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgU2VhcmNoZXMgZm9yIC5ORVQgQ29yZSwgdGhlbiBjaGVja3MgaWYgYXQgbGVhc3QgdmVyc2lvbiAxLjAuMiBpcworIyAgIHByZXNlbnQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVucyBHZXllciA8amVuc2dAYXBhY2hlLm9yZz4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMgorCitBQ19ERUZVTihbQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT05dLFsKKyAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAiJERPVE5FVENPUkUiXSxbCisgICAgICAgIGF4X2RvdG5ldGNvcmVfdmVyc2lvbj0iJDEiCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgLk5FVCBDb3JlIHZlcnNpb25dKQorICAgICAgICBkb3RuZXRjb3JlX3ZlcnNpb249YCRET1RORVRDT1JFIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKEA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcKVwoLipcKS9cMS8nYAorICAgICAgICBBQ19NU0dfUkVTVUxUKCRkb3RuZXRjb3JlX3ZlcnNpb24pCisKKwkgICAgQUNfU1VCU1QoW0RPVE5FVENPUkVfVkVSU0lPTl0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dKQorCisgICAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2RvdG5ldGNvcmVfdmVyc2lvbl0sW2xlXSxbJGRvdG5ldGNvcmVfdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAgICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkKKyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIC5ORVQgQ29yZV0pCisgICAgICAgICQzCisgICAgXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FjYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDYwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2hheGVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfSEFYRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCBoYXhlIHN1cHBvcnRzIHRoZSB2ZXJzaW9uIGluZGljYXRlZC4gSWYgdHJ1ZSB0aGUgc2hlbGwKKyMgICBjb21tYW5kcyBpbiBBQ1RJT04tSUYtVFJVRSBhcmUgZXhlY3V0ZWQuIElmIG5vdCB0aGUgc2hlbGwgY29tbWFuZHMgaW4KKyMgICBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlICRIQVhFX1ZFUlNJT04gdmFyaWFibGUgd2lsbCBiZSBmaWxsZWQgd2l0aAorIyAgIHRoZSBkZXRlY3RlZCB2ZXJzaW9uLgorIworIyAgIFRoaXMgbWFjcm8gdXNlcyB0aGUgJEhBWEUgdmFyaWFibGUgdG8gcGVyZm9ybSB0aGUgY2hlY2suIElmICRIQVhFIGlzIG5vdAorIyAgIHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgbWFjcm8sIHRoZSBtYWNybyB3aWxsIGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJPRyhbSEFYRV0sW2hheGVdKQorIyAgICAgQUNfUFJPR19IQVhFX1ZFUlNJT04oWzMuMS4zXSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgU2VhcmNoZXMgZm9yIEhheGUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMy4xLjMgaXMgcHJlc2VudC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNSBKZW5zIEdleWVyIDxqZW5zZ0BhcGFjaGUub3JnPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAyCisKK0FDX0RFRlVOKFtBWF9QUk9HX0hBWEVfVkVSU0lPTl0sWworICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICAgIEFTX0lGKFt0ZXN0IC1uICIkSEFYRSJdLFsKKyAgICAgICAgYXhfaGF4ZV92ZXJzaW9uPSIkMSIKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBoYXhlIHZlcnNpb25dKQorICAgICAgICBoYXhlX3ZlcnNpb249YCRIQVhFIC12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL14uKiBcKCBAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXCkgLiovXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkaGF4ZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtIQVhFX1ZFUlNJT05dLFskaGF4ZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9oYXhlX3ZlcnNpb25dLFtsZV0sWyRoYXhlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBIYXhlXSkKKyAgICAgICAgJDMKKyAgICBdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQgYi9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjMyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CkBAIC0wLDAgKzEsNzcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19QRVJMX01PRFVMRVMoW01PRFVMRVNdLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBwZXJsIG1vZHVsZXMgYXJlIGF2YWlsYWJsZS4gSWYgdHJ1ZSB0aGUgc2hlbGwKKyMgICBjb21tYW5kcyBpbiBBQ1RJT04tSUYtVFJVRSBhcmUgZXhlY3V0ZWQuIElmIG5vdCB0aGUgc2hlbGwgY29tbWFuZHMgaW4KKyMgICBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gTm90ZSBpZiAkUEVSTCBpcyBub3Qgc2V0IChmb3IgZXhhbXBsZSBieQorIyAgIGNhbGxpbmcgQUNfQ0hFQ0tfUFJPRywgb3IgQUNfUEFUSF9QUk9HKSwgQUNfQ0hFQ0tfUFJPRyhQRVJMLCBwZXJsLCBwZXJsKQorIyAgIHdpbGwgYmUgcnVuLgorIworIyAgIE1PRFVMRVMgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMuIFRvIGNoZWNrIGZvciBhCisjICAgbWluaW11bSB2ZXJzaW9uIG9mIGEgbW9kdWxlLCBhcHBlbmQgdGhlIHZlcnNpb24gbnVtYmVyIHRvIHRoZSBtb2R1bGUKKyMgICBuYW1lLCBzZXBhcmF0ZWQgYnkgYW4gZXF1YWxzIHNpZ24uCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFYX1BST0dfUEVSTF9NT0RVTEVTKCBUZXh0OjpXcmFwIE5ldDo6TERBUD0xLjAuMywgLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKE5lZWQgc29tZSBQZXJsIG1vZHVsZXMpCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgRGVhbiBQb3ZleSA8cG92ZXlAd2VkZ2V0YWlsLmNvbT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgOAorCitBVV9BTElBUyhbQUNfUFJPR19QRVJMX01PRFVMRVNdLCBbQVhfUFJPR19QRVJMX01PRFVMRVNdKQorQUNfREVGVU4oW0FYX1BST0dfUEVSTF9NT0RVTEVTXSxbZG5sCisKK200X2RlZmluZShbYXhfcGVybF9tb2R1bGVzXSkKK200X2ZvcmVhY2goW2F4X3BlcmxfbW9kdWxlXSwgbTRfc3BsaXQobTRfbm9ybWFsaXplKFskMV0pKSwKKwkgIFsKKwkgICBtNF9hcHBlbmQoW2F4X3BlcmxfbW9kdWxlc10sCisJCSAgICAgWyddbTRfYnBhdHN1YnN0KGF4X3BlcmxfbW9kdWxlLD0sWyBdKVsnIF0pCisgICAgICAgICAgXSkKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBwZXJsCitpZiB0ZXN0IC16ICIkUEVSTCI7IHRoZW4KK0FDX0NIRUNLX1BST0coUEVSTCxwZXJsLHBlcmwpCitmaQorCitpZiB0ZXN0ICJ4JFBFUkwiICE9IHg7IHRoZW4KKyAgYXhfcGVybF9tb2R1bGVzX2ZhaWxlZD0wCisgIGZvciBheF9wZXJsX21vZHVsZSBpbiBheF9wZXJsX21vZHVsZXM7IGRvCisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBwZXJsIG1vZHVsZSAkYXhfcGVybF9tb2R1bGUpCisKKyAgICAjIFdvdWxkIGJlIG5pY2UgdG8gbG9nIHJlc3VsdCBoZXJlLCBidXQgY2FuJ3QgcmVseSBvbiBhdXRvY29uZiBpbnRlcm5hbHMKKyAgICAkUEVSTCAtZSAidXNlICRheF9wZXJsX21vZHVsZTsgZXhpdCIgPiAvZGV2L251bGwgMj4mMQorICAgIGlmIHRlc3QgJD8gLW5lIDA7IHRoZW4KKyAgICAgIEFDX01TR19SRVNVTFQobm8pOworICAgICAgYXhfcGVybF9tb2R1bGVzX2ZhaWxlZD0xCisgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKG9rKTsKKyAgICBmaQorICBkb25lCisKKyAgIyBSdW4gb3B0aW9uYWwgc2hlbGwgY29tbWFuZHMKKyAgaWYgdGVzdCAiJGF4X3BlcmxfbW9kdWxlc19mYWlsZWQiID0gMDsgdGhlbgorICAgIDoKKyAgICAkMgorICBlbHNlCisgICAgOgorICAgICQzCisgIGZpCitlbHNlCisgIEFDX01TR19XQVJOKGNvdWxkIG5vdCBmaW5kIHBlcmwpCitmaV0pZG5sCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNCBiL2FjbG9jYWwvYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0Lm00CmluZGV4IDAxOTUyMzMuLjljM2NlYjcgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0Lm00CisrKyBiL2FjbG9jYWwvYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0Lm00CkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICAgICAgICBBQ19ERUZJTkUoW0xPR0lDQUxfUklHSFRfU0hJRlRdLCAyLCBbUG9zc2libGUgdmFsdWUgZm9yIFNJR05FRF9SSUdIVF9TSElGVF9JU10pCiAgICAgICAgICAgQUNfREVGSU5FKFtVTktOT1dOX1JJR0hUX1NISUZUXSwgMywgW1Bvc3NpYmxlIHZhbHVlIGZvciBTSUdORURfUklHSFRfU0hJRlRfSVNdKQogCi0gICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3NfYXJpdGhtZXRpYyIgPSAieWVzIiAmJiB0ZXN0ICIkc3VjY2Vzc19sb2dpY2EiID0gInllcyIgOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3NfYXJpdGhtZXRpYyIgPSAieWVzIiAmJiB0ZXN0ICIkc3VjY2Vzc19sb2dpY2FsIiA9ICJ5ZXMiIDsgdGhlbgogICAgICAgICAgICAgQUNfTVNHX0VSUk9SKCJSaWdodCBzaGlmdCBhcHBlYXJzIHRvIGJlIGJvdGggYXJpdGhtZXRpYyBhbmQgbG9naWNhbCEiKQogICAgICAgICAgIGVsaWYgdGVzdCAiJHN1Y2Nlc3NfYXJpdGhtZXRpYyIgPSAieWVzIiA7IHRoZW4KICAgICAgICAgICAgIGF4X3NpZ25lZF9yaWdodF9zaGlmdD1hcml0aG1ldGljCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNCBiL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00CmluZGV4IDk3OWJlYzYuLjhjMGUzY2IgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00CisrKyBiL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00CkBAIC0xNSwxOCArMTUsNiBAQAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KIAotQUNfREVGVU4oW0FYX1RIUklGVF9HRU5dLAotICAgICAgICAgWwotICAgICAgICAgIEFDX0FSR19FTkFCTEUoW2dlbi0kMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZ2VuLSQxXSwgW2VuYWJsZSB0aGUgJDIgY29tcGlsZXIgQDw6QGRlZmF1bHQ9JDNAOj5AXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBbYXhfdGhyaWZ0X2dlbl8kMT0iJGVuYWJsZXZhbCJdLAotICAgICAgICAgICAgICAgICAgICAgICAgW2F4X3RocmlmdF9nZW5fJDE9JDNdCi0gICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgZG5sIEknZCBsaWtlIHRvIHJ1biB0aGUgQU1fQ09ORElUSU9OQUwgaGVyZSwgYnV0IGF1dG9tYWtlIGxpa2VzCi0gICAgICAgICAgZG5sIGFsbCBBTV9DT05ESVRJT05BTHMgdG8gYmUgbmljZSBhbmQgZXhwbGljaXQgaW4gY29uZmlndXJlLmFjLgotICAgICAgICAgIGRubCBBTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl8kMV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl8kMSIgPSAieWVzIl0pCi0gICAgICAgICBdKQotCiBBQ19ERUZVTihbQVhfVEhSSUZUX0xJQl0sCiAgICAgICAgICBbCiAgICAgICAgICAgQUNfQVJHX1dJVEgoJDEsCkBAIC0zNCw2ICsyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9IiR3aXRodmFsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9JDNdCiAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgIGhhdmVfJDE9bm8KICAgICAgICAgICBkbmwgV2hhdCB3ZSBkbyBoZXJlIGlzIGdvaW5nIHRvIHZhcnkgZnJvbSBsaWJyYXJ5IHRvIGxpYnJhcnksCiAgICAgICAgICAgZG5sIHNvIHdlIGNhbid0IHJlYWxseSBnZW5lcmFsaXplICh5ZXQhKS4KICAgICAgICAgIF0pCmRpZmYgLS1naXQgYS9hcHB2ZXlvci55bWwgYi9hcHB2ZXlvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHZleW9yLnltbApAQCAtMCwwICsxLDExMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBBcHBWZXlvciAtIGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tCisKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JworCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK29zOgorICAtIFZpc3VhbCBTdHVkaW8gMjAxNworCittYXRyaXg6CisgIGFsbG93X2ZhaWx1cmVzOgorICAgICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgZmFzdF9maW5pc2g6IHRydWUKKworZW52aXJvbm1lbnQ6CisgIG1hdHJpeDoKKyAgIC0gUFJPRklMRTogTVNWQzIwMTcKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNjUuMQorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjEuOAorICAgICBQWVRIT05fVkVSU0lPTjogMy42CisgICAgIFFUX1ZFUlNJT046IDUuMTAKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuMTEKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IE1TVkMyMDEzCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjU4LjAKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4wLjIyCisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjUKKyAgICAgUVRfVkVSU0lPTjogNS44CisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjgKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IENZR1dJTgorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjICAtIFBST0ZJTEU6IENZR1dJTgorIyAgICBQTEFURk9STTogeDY0CisjICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisjICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCitpbnN0YWxsOgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKKworYnVpbGRfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1idWlsZC5iYXQKKwordGVzdF9zY3JpcHQ6CisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgLSBjYWxsIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CisKKworIyBhcnRpZmFjdCBjYXB0dXJlIGRpc2FibGVkIGFzIGl0IG1pZ2h0IGluY3JlYXNlIHNlcnZpY2UgY29zdCBmb3IgbGl0dGxlIGdhaW46CisjCisjIGFydGlmYWN0czoKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWluc3QKKyMgICAgbmFtZTogY21ha2UgaW5zdGFsbGVkIGNvbnRlbnQKKyMgICAgdHlwZTogemlwCisjCisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1idWlsZFxUZXN0aW5nCisjICAgIG5hbWU6IGN0ZXN0IG91dHB1dAorIyAgICB0eXBlOiB6aXAKKworIyBSRFAgc3VwcG9ydDogdXNlIG9uZSBvciB0aGUgb3RoZXIuLi4KKyMKKyMgZW5hYmxlcyBSRFAgZm9yIGVhY2ggYnVpbGQgam9iIHNvIHlvdSBjYW4gaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgam9iOgorIyBpbml0OgorIyAgLSBwczogaWV4ICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwcHZleW9yL2NpL21hc3Rlci9zY3JpcHRzL2VuYWJsZS1yZHAucHMxJykpCisjCisjIGVuYWJsZXMgUkRQIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGxvZ2luIGFuZCByZS1ydW4KKyMgY29tbWFuZHMgdG8gc2VlIHdoeSBzb21ldGhpbmcgZmFpbGVkLi4uCisjb25fZmluaXNoOgorIyAgLSBwczogJGJsb2NrUmRwID0gJHRydWU7IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBhbHNvIG5lZWQ6CisjIGVudmlyb25tZW50OgorIyAgIEFQUFZFWU9SX1JEUF9QQVNTV09SRDogdGhyMUZUMjM0NSR4eXpaCmRpZmYgLS1naXQgYS9ib290c3RyYXAuc2ggYi9ib290c3RyYXAuc2gKaW5kZXggNzRlY2RiOC4uMjQ1MmVlYSAxMDA3NTUKLS0tIGEvYm9vdHN0cmFwLnNoCisrKyBiL2Jvb3RzdHJhcC5zaApAQCAtMjAsMTYgKzIwLDQyIEBACiAjCiAKIC4vY2xlYW51cC5zaAotCi1hdXRvc2NhbiB8fCBleGl0IDEKLWFjbG9jYWwgLUkgLi9hY2xvY2FsIHx8IGV4aXQgMQotYXV0b2hlYWRlciB8fCBleGl0IDEKLQotaWYgbGlidG9vbGl6ZSAtLXZlcnNpb24gMSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gIGxpYnRvb2xpemUgLS1jb3B5IC0tYXV0b21ha2UgfHwgZXhpdCAxCi1lbGlmIGdsaWJ0b29saXplIC0tdmVyc2lvbiAxID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLSAgZ2xpYnRvb2xpemUgLS1jb3B5IC0tYXV0b21ha2UgfHwgZXhpdCAxCitpZiB0ZXN0IC1kIGxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgOyB0aGVuCisgICAgaWYgcGhwaXplIC12ID4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIChjZCBsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sICYmIHBocGl6ZSkKKyAgICBmaQogZmkKIAorc2V0IC1lCisKKyMgbGlidG9vbGl6ZSBpcyBjYWxsZWQgImdsaWJ0b29saXplIiBvbiBPU1guCitpZiBsaWJ0b29saXplIC0tdmVyc2lvbiAxID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgTElCVE9PTElaRT1saWJ0b29saXplCitlbGlmIGdsaWJ0b29saXplIC0tdmVyc2lvbiAxID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgTElCVE9PTElaRT1nbGlidG9vbGl6ZQorZWxzZQorICBlY2hvID4mMiAiQ291bGRuJ3QgZmluZCBsaWJ0b29saXplISIKKyAgZXhpdCAxCitmaQorCitmb3JtYXRfdmVyc2lvbiAoKSB7CisgICAgcHJpbnRmICIlMDNkJTAzZCUwM2QlMDNkIiAkKGVjaG8gJDEgfCB0ciAnLicgJyAnKTsKK30KKworIyB3ZSByZXF1aXJlIGF1dG9tYWtlIDEuMTMgb3IgbGF0ZXIKKyMgY2hlY2sgbXVzdCBoYXBwZW4gZXh0ZXJuYWxseSBkdWUgdG8gdXNlIG9mIG5ld2VyIG1hY3JvCitBVVRPTUFLRV9WRVJTSU9OPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBncmVwIGF1dG9tYWtlIHwgZWdyZXAgLW8gJyhbMC05XXsxLH1cLikrWzAtOV17MSx9J2AKK2lmICBbICQoZm9ybWF0X3ZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04pIC1sdCAkKGZvcm1hdF92ZXJzaW9uIDEuMTMpIF07IHRoZW4KKyAgZWNobyA+JjIgImF1dG9tYWtlIHZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04gaXMgdG9vIG9sZCAobmVlZCAxLjEzIG9yIGxhdGVyKSIKKyAgZXhpdCAxCitmaQorCitzZXQgLWUKK2F1dG9zY2FuCiskTElCVE9PTElaRSAtLWNvcHkgLS1hdXRvbWFrZQorYWNsb2NhbCAtSSAuL2FjbG9jYWwKK2F1dG9oZWFkZXIKK3NlZCAnL3VuZGVmIFZFUlNJT04vZCcgY29uZmlnLmhpbiA+IGNvbmZpZy5oaW4yCittdiBjb25maWcuaGluMiBjb25maWcuaGluCiBhdXRvY29uZgotYXV0b21ha2UgLWFjIC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduIHx8IGV4aXQgMQorYXV0b21ha2UgLS1jb3B5IC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduCmRpZmYgLS1naXQgYS9ib3dlci5qc29uIGIvYm93ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvYm93ZXIuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCIsCisgICJtYWluIjogImxpYi9qcy9zcmMvdGhyaWZ0LmpzIiwKKyAgImtleXdvcmRzIjogWworICAgICJ0aHJpZnQiCisgIF0sCisgICJsaWNlbnNlIjogIkFwYWNoZSB2MiIsCisgICJpZ25vcmUiOiBbXQorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI2MjIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfQ1hYX0VYVEVOU0lPTlM9T04gXgorICAtRENNQUtFX0NYWF9GTEFHUz0iLURfR05VX1NPVVJDRSIgXgorICAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04gXgorICAtRFdJVEhfU1REVEhSRUFEUz1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBDWUdXSU4KKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OgorOjogSW5zdGFsbCBhcHQtY3lnIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQKKzo6CisKKyVCQVNIJSAtbGMgIndnZXQgcmF3Z2l0LmNvbS90cmFuc2NvZGUtb3Blbi9hcHQtY3lnL21hc3Rlci9hcHQtY3lnICYmIGluc3RhbGwgYXB0LWN5ZyAvYmluICYmIHJtIC1mIGFwdC1jeWciIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgdXBkYXRlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIGluc3RhbGwgYmlzb24gY21ha2UgZmxleCBnY2MtZysrIGxpYmJvb3N0LWRldmVsIGxpYmV2ZW50LWRldmVsIG1ha2Ugb3BlbnNzbC1kZXZlbCB6bGliLWRldmVsIgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2N2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL21pbmd3MzItbWFrZSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2djYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2crKy5leGUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9L21pbmd3JU5PUk1fUExBVEZPUk0lIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitARUNITyBPTgorICBjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorCS1EQklTT05fRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0iJUJPT1NUX1JPT1QlIiBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorCS1ERkxFWF9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9IiVXSU4zUCVcbXNpbnR0eXBlcyIgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCisKK2NtYWtlIC0tYnVpbGQgLiBeCisgIC0tY29uZmlnICIlQ09ORklHVVJBVElPTiUiIF4KKyAgLS10YXJnZXQgSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2QyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw1OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1ZDCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaG9jbyBmZWF0dXJlIGVuYWJsZSAtbiBhbGxvd0dsb2JhbENvbmZpcm1hdGlvbiB8fCBFWElUIC9CCisKKzo6IFRoaW5ncyB0byBpbnN0YWxsIHdoZW4gTk9UIHJ1bm5pbmcgaW4gYXBwdmV5b3I6CitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cCAteSBjaG9jb2xhdGV5ICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IGN1cmwgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IDd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IHB5dGhvbjMgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IG9wZW5zc2wubGlnaHQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitjaW5zdCAteSBqZGs4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjaW5zdCAteSB3aW5mbGV4Ymlzb24zICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHpsaWIgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC16bGliLmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBsaWJldmVudCAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLWxpYmV2ZW50LmJhdCAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHB5dGhvbiBwYWNrYWdlcyAoY29ycmVjdCBwYXRoIHRvIHBpcCBzZXQgaW4gY2xfc2V0ZW52LmJhdCkKK3BpcC5leGUgXgorICAgIGluc3RhbGwgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBeCisgICAgICAgICAgICBpcGFkZHJlc3MgXgorICAgICAgICAgICAgc2l4IF4KKyAgICAgICAgICAgIHRvcm5hZG8gXgorICAgICAgICAgICAgdHdpc3RlZCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaW5zdCAteSBnaGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzM2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICBJRiAiJU1TVkNST09UJSIgPT0gIiIgKFNFVCBNU1ZDUk9PVD0lJWkpCisgICkKKyAgU0VUIE1TVkNQTEFUPXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBNU1ZDUExBVD1hbWQ2NCkKKworICBTRVQgQ1VSUkVOVERJUj0lQ0QlCisgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICBDRCAlQ1VSUkVOVERJUiUKKyAgRVhJVCAvQgorCis6RU9GCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjogIE1pbkdXIE1ha2VmaWxlcyAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNaW5HVworOjogIE1TWVMgTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNU1lTCis6OiAgVW5peCBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIENZR1dJTgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorICBTRVQgR0VORVJBVE9SPU1pbkdXIE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorICBTRVQgR0VORVJBVE9SPVVuaXggTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1lTIiAoCisgIFNFVCBHRU5FUkFUT1I9TVNZUyBNYWtlZmlsZXMKKykgRUxTRSAoCisgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgR0VOQVJDSD0gV2luNjQKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3IUdFTkFSQ0ghCispCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworRUNITy8KK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorRUNITyBWZXJzaW9ucworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIGJvb3N0ICAgICAgICAgICAgICAgICA9ICVCT09TVF9WRVJTSU9OJQorRUNITyBsaWJldmVudCAgICAgICAgICAgICAgPSAlTElCRVZFTlRfVkVSU0lPTiUKK0VDSE8gcHl0aG9uICAgICAgICAgICAgICAgID0gJVBZVEhPTl9WRVJTSU9OJQorRUNITyBxdCAgICAgICAgICAgICAgICAgICAgPSAlUVRfVkVSU0lPTiUKK0VDSE8gemxpYiAgICAgICAgICAgICAgICAgID0gJVpMSUJfVkVSU0lPTiUKK0VDSE8vCispCitFQ0hPIEFwcHZleW9yIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX0JVSUxEX0ZPTERFUiA9ICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitFQ0hPIENPTkZJR1VSQVRJT04gICAgICAgICA9ICVDT05GSUdVUkFUSU9OJQorRUNITyBQTEFURk9STSAgICAgICAgICAgICAgPSAlUExBVEZPUk0lCitFQ0hPIFBST0ZJTEUgICAgICAgICAgICAgICA9ICVQUk9GSUxFJQorRUNITy8KK0VDSE8gT3VyIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX1NDUklQVFMgICAgICA9ICVBUFBWRVlPUl9TQ1JJUFRTJQorRUNITyBCQVNIICAgICAgICAgICAgICAgICAgPSAlQkFTSCUKK0VDSE8gQk9PU1RfUk9PVCAgICAgICAgICAgID0gJUJPT1NUX1JPT1QlCitFQ0hPIEJPT1NUX0lOQ0xVREVESVIgICAgICA9ICVCT09TVF9JTkNMVURFRElSJQorRUNITyBCT09TVF9MSUJSQVJZRElSICAgICAgPSAlQk9PU1RfTElCUkFSWURJUiUKK0VDSE8gQlVJTERESVIgICAgICAgICAgICAgID0gJUJVSUxERElSJQorRUNITyBDT01QSUxFUiAgICAgICAgICAgICAgPSAlQ09NUElMRVIlCitFQ0hPIEdFTkVSQVRPUiAgICAgICAgICAgICA9ICVHRU5FUkFUT1IlCitFQ0hPIElOU1RESVIgICAgICAgICAgICAgICA9ICVJTlNURElSJQorRUNITyBKQVZBX0hPTUUgICAgICAgICAgICAgPSAlSkFWQV9IT01FJQorRUNITyBPUEVOU1NMX1JPT1QgICAgICAgICAgPSAlT1BFTlNTTF9ST09UJQorRUNITyBTRVRVUCAgICAgICAgICAgICAgICAgPSAlU0VUVVAlCitFQ0hPIFNSQ0RJUiAgICAgICAgICAgICAgICA9ICVTUkNESVIlCitFQ0hPIFdJTjNQICAgICAgICAgICAgICAgICA9ICVXSU4zUCUKK0VDSE8gV0lUSF9QWVRIT04gICAgICAgICAgID0gJVdJVEhfUFlUSE9OJQorRUNITyBaTElCX1NUQVRJQ19TVUZGSVggICAgPSAlWkxJQl9TVEFUSUNfU1VGRklYJQorSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgRUNITy8KKyAgRUNITyBVTklYeSBQQVRICisgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAlQkFTSCUgLWxjICJlY2hvICRQQVRIIgorKQorRUNITy8KK0VDSE8gV2luZG93cyBQQVRICitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gJVBBVEglCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdApAQCAtMCwwICsxLDM1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogSGVscHMgYnVpbGQgdGhyaWZ0IGJ5IHByZXRlbmRpbmcgdG8gYmUgYXBwdmV5b3IKKzo6IFVzYWdlOgorOjogICBjZCBidWlsZFxhcHB2ZXlvcgorOjogICBzaW11bGF0ZS1hcHB2ZXlvci5iYXQgW0RlYnVnfFJlbGVhc2VdIFt4ODZ8eDY0XSBbQ1lHV0lOfE1JTkdXfE1TVkMyMDE/XQorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBBUFBWRVlPUl9CVUlMRF9GT0xERVI9JX5kcDAuLlwuLgorU0VUIENPTkZJR1VSQVRJT049JTEKK1NFVCBQTEFURk9STT0lMgorU0VUIFBST0ZJTEU9JTMKKworQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0ICAgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyNUT0RPOiBTaG91bGQgd2UgYnVuZGxlIHN5c3RlbSBsaWJyYXJpZXMgZm9yIERMTHM/CisjaW5jbHVkZShJbnN0YWxsUmVxdWlyZWRTeXN0ZW1MaWJyYXJpZXMpCisKKyMgRm9yIGhlbHAgdGFrZSBhIGxvb2sgYXQ6CisjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2U6Q1BhY2tDb25maWd1cmF0aW9uCisKKyMjIyBnZW5lcmFsIHNldHRpbmdzCitzZXQoQ1BBQ0tfUEFDS0FHRV9OQU1FICJ0aHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTiAiJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkFwYWNoZSBUaHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1JFQURNRS5tZCIpCitzZXQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vTElDRU5TRSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIikKK3NldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgImRldkB0aHJpZnQuYXBhY2hlLm9yZyIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtDUEFDS19QQUNLQUdFX05BTUV9IikKK3NldChDUEFDS19TWVNURU1fTkFNRSAiJHtDTUFLRV9TWVNURU1fTkFNRX0iKQorCisjIyMgdmVyc2lvbnMKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OX1BBVENIfSkKKworIyMjIHNvdXJjZSBnZW5lcmF0b3IKK3NldChDUEFDS19TT1VSQ0VfR0VORVJBVE9SICJUR1oiKQorc2V0KENQQUNLX1NPVVJDRV9JR05PUkVfRklMRVMgIn4kO1suXXN3cCQ7L1suXXN2bi87L1suXWdpdC87LmdpdGlnbm9yZTsvYnVpbGQvO3RhZ3M7Y3Njb3BlLioiKQorc2V0KENQQUNLX1NPVVJDRV9QQUNLQUdFX0ZJTEVfTkFNRSAiJHtDUEFDS19QQUNLQUdFX05BTUV9LSR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfSIpCisKKyMjIyB6aXAgZ2VuZXJhdG9yCitzZXQoQ1BBQ0tfR0VORVJBVE9SICJaSVAiKQorc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgInRocmlmdCIpCisKKworaWYoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQorICAgIHNldChDUEFDS19HRU5FUkFUT1IgIk5TSVMiKQorICAgIHNldChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19NRU5VX0xJTktTCisgICAgICAgICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciICJBcGFjaGUgVGhyaWZ0IC0gV2ViIFNpdGUiCisgICAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgIkFwYWNoZSBUaHJpZnQgLSBJc3N1ZXMiKQorICAgIHNldChDUEFDS19OU0lTX0NPTlRBQ1QgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQorICAgIHNldChDUEFDS19OU0lTX01PRElGWV9QQVRIICJPTiIpCisgICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCitlbHNlKCkKKyAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJERUIiICkKKyAgICBzZXQoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfTUFJTlRBSU5FUiAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCitlbmRpZigpCisKKworaW5jbHVkZShDUGFjaykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdiZmUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCkBAIC0wLDAgKzEsNzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQoraW5jbHVkZShDaGVja1N5bWJvbEV4aXN0cykKKworaWYgKEludHR5cGVzX0ZPVU5EKQorICAjIFRoaXMgYWxsb3dzIHRoZSBpbnR0eXBlcy5oIGFuZCBzdGRpbnQuaCBjaGVja3MgdG8gc3VjY2VlZCBvbiBwbGF0Zm9ybXMgdGhhdAorICAjIGRvIG5vdCBuYXRpdmVseSBwcm92aWRlIHRoZXJlLgorICBzZXQgKENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKK2VuZGlmICgpCisKK2NoZWNrX2luY2x1ZGVfZmlsZShhcnBhL2luZXQuaCBIQVZFX0FSUEFfSU5FVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGZjbnRsLmggSEFWRV9GQ05UTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGdldG9wdC5oIEhBVkVfR0VUT1BUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoaW50dHlwZXMuaCBIQVZFX0lOVFRZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0ZGIuaCBIQVZFX05FVERCX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0aW5ldC9pbi5oIEhBVkVfTkVUSU5FVF9JTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oIEhBVkVfU0lHTkFMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHB0aHJlYWQuaCBIQVZFX1BUSFJFQURfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvaW9jdGwuaCBIQVZFX1NZU19JT0NUTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wYXJhbS5oIEhBVkVfU1lTX1BBUkFNX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3Jlc291cmNlLmggSEFWRV9TWVNfUkVTT1VSQ0VfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvc29ja2V0LmggSEFWRV9TWVNfU09DS0VUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N0YXQuaCBIQVZFX1NZU19TVEFUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3RpbWUuaCBIQVZFX1NZU19USU1FX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3VuLmggSEFWRV9TWVNfVU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwb2xsLmggSEFWRV9QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BvbGwuaCBIQVZFX1NZU19QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NlbGVjdC5oIEhBVkVfU1lTX1NFTEVDVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNjaGVkLmggSEFWRV9TQ0hFRF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZy5oIEhBVkVfU1RSSU5HX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQorCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZSBIQVZFX0dFVEhPU1RCWU5BTUUpCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHN0cmVycm9yX3IgSEFWRV9TVFJFUlJPUl9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9tYXggSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9taW4gSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOKQorCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWFNvdXJjZUNvbXBpbGVzKQorCitjaGVja19jeHhfc291cmNlX2NvbXBpbGVzKAorICAiCisgICNpbmNsdWRlIDxzdHJpbmcuaD4KKyAgaW50IG1haW4oKXtjaGFyIGI7Y2hhciAqYSA9IHN0cmVycm9yX3IoMCwgJmIsIDApOyByZXR1cm4oMCk7fQorICAiCisgIFNUUkVSUk9SX1JfQ0hBUl9QKQorCisKK3NldChQQUNLQUdFICR7UEFDS0FHRV9OQU1FfSkKK3NldChQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX05BTUV9ICR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSkKKworIyBnZW5lcmF0ZSBhIGNvbmZpZy5oIGZpbGUKK2NvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UvY29uZmlnLmguaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L2NvbmZpZy5oIikKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgQWx3YXlzIGluY2x1ZGUgc3JjZGlyIGFuZCBidWlsZGRpciBpbiBpbmNsdWRlIHBhdGgKKyMgVGhpcyBzYXZlcyB0eXBpbmcgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUll9IGluCisjIGFib3V0IGV2ZXJ5IHN1YmRpcgorIyBzaW5jZSBjbWFrZSAyLjQuMAorc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKKyMgUHV0IHRoZSBpbmNsdWRlIGRpcnMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2Ugb3IgYnVpbGQgdHJlZQorIyBiZWZvcmUgYWxsIG90aGVyIGluY2x1ZGUgZGlycywgc28gdGhlIGhlYWRlcnMgaW4gdGhlIHNvdXJjZXMKKyMgYXJlIHByZWZlcnJlZCBvdmVyIHRoZSBhbHJlYWR5IGluc3RhbGxlZCBvbmVzCisjIHNpbmNlIGNtYWtlIDIuNC4xCitzZXQoQ01BS0VfSU5DTFVERV9ESVJFQ1RPUklFU19QUk9KRUNUX0JFRk9SRSBPTikKKworIyBVc2UgY29sb3JlZCBvdXRwdXQKKyMgc2luY2UgY21ha2UgMi40LjAKK3NldChDTUFLRV9DT0xPUl9NQUtFRklMRSBPTikKKworIyBEZWZpbmUgdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgbGlicmFyaWVzIGhlcmUKK3NldChHRU5FUklDX0xJQl9WRVJTSU9OICIxLjAuMCIpCitzZXQoR0VORVJJQ19MSUJfU09WRVJTSU9OICIwIikKKworIyBTZXQgdGhlIGRlZmF1bHQgYnVpbGQgdHlwZSB0byByZWxlYXNlIHdpdGggZGVidWcgaW5mbworaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSBSZWxXaXRoRGViSW5mbworICAgIENBQ0hFIFNUUklORworICAgICAgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IE5vbmUgRGVidWcgUmVsZWFzZSBSZWxXaXRoRGViSW5mbyBNaW5TaXplUmVsLiIKKyAgKQorZW5kaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorCisjIENyZWF0ZSB0aGUgY29tcGlsZSBjb21tYW5kIGRhdGFiYXNlIGZvciBjbGFuZyBieSBkZWZhdWx0CitzZXQoQ01BS0VfRVhQT1JUX0NPTVBJTEVfQ09NTUFORFMgT04pCisKKyMgUHV0IHRoZSBsaWJyYXJpZXMgYW5kIGJpbmFyaWVzIHRoYXQgZ2V0IGJ1aWx0IGludG8gZGlyZWN0b3JpZXMgYXQgdGhlCisjIHRvcCBvZiB0aGUgYnVpbGQgdHJlZSByYXRoZXIgdGhhbiBpbiBoYXJkLXRvLWZpbmQgbGVhZgorIyBkaXJlY3Rvcmllcy4gVGhpcyBzaW1wbGlmaWVzIG1hbnVhbCB0ZXN0aW5nIGFuZCB0aGUgdXNlIG9mIHRoZSBidWlsZAorIyB0cmVlIHJhdGhlciB0aGFuIGluc3RhbGxlZCB0aHJpZnQgbGlicmFyaWVzLgorc2V0KENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK3NldChDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitzZXQoQ01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vYmluKQorCisjCisjICJycGF0aCIgc3VwcG9ydC4KKyMgU2VlIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL2luZGV4LnBocD90aXRsZT1DTWFrZV9SUEFUSF9oYW5kbGluZworIworIyBPbiBNYWNPU1gsIGZvciBzaGFyZWQgbGlicmFyaWVzLCBlbmFibGUgcnBhdGggc3VwcG9ydC4KK3NldChDTUFLRV9NQUNPU1hfUlBBVEggVFJVRSkKKyMKKyMgT24gYW55IE9TLCBmb3IgZXhlY3V0YWJsZXMsIGFsbG93IGxpbmtpbmcgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGluIG5vbi1zeXN0ZW0KKyMgbG9jYXRpb25zIGFuZCBydW5uaW5nIHRoZSBleGVjdXRhYmxlcyB3aXRob3V0IExEX1BSRUxPQUQgb3Igc2ltaWxhci4KKyMgVGhpcyByZXF1aXJlcyB0aGUgbGlicmFyeSB0byBiZSBidWlsdCB3aXRoIHJwYXRoIHN1cHBvcnQuCitzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIIFRSVUUpCisKKyMKKyMgQysrIExhbmd1YWdlIExldmVsIERlZmF1bHRzIC0gdGhpcyBkZXBlbmRzIG9uIHRoZSBjb21waWxlciBjYXBhYmlsaXRpZXMKKyMKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfU1RBTkRBUkQpCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpICMgQysrMTEKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgQysrMTEgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbGV2ZWwuIikKKyAgbWVzc2FnZShTVEFUVVMgIlRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgQysrIGxhbmd1YWdlIGxldmVsLCBzZXQgQ01BS0VfQ1hYX1NUQU5EQVJEIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCA5OCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAib25seSBDKysxMSBvciBhYm92ZSBDKysgc3RhbmRhcmQgaXMgc3VwcG9ydGVkIikKK2Vsc2VpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDExKQorICAjIHNob3VsZCBub3QgZmFsbGJhY2sgdG8gQysrOTgKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKK2VuZGlmKCkKKworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzZXQoQ01BS0VfQ1hYX0VYVEVOU0lPTlMgT0ZGKSAgICAgICAgIyB1c2Ugc3RhbmRhcmRzIGNvbXBsaWFudCBsYW5ndWFnZSBsZXZlbCBmb3IgcG9ydGFiaWxpdHkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgRGVmaW5lIHRoZSBkZWZhdWx0IGluc3RhbGwgcGF0aHMKK3NldChCSU5fSU5TVEFMTF9ESVIgImJpbiIgQ0FDSEUgUEFUSCAiVGhlIGJpbmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogYmluKSIpCitzZXQoTElCX0lOU1RBTExfRElSICJsaWIke0xJQl9TVUZGSVh9IiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogbGliJHtMSUJfU1VGRklYfSkiKQorc2V0KElOQ0xVREVfSU5TVEFMTF9ESVIgImluY2x1ZGUiIENBQ0hFIFBBVEggIlRoZSBsaWJyYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBpbmNsdWRlKSIpCitzZXQoQ01BS0VfSU5TVEFMTF9ESVIgImNtYWtlIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgY21ha2UgY29uZmlnIGZpbGVzIChkZWZhdWx0OiBjbWFrZSkiKQorc2V0KERPQ19JTlNUQUxMX0RJUiAic2hhcmUvZG9jIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgZG9jdW1lbnRhdGlvbiBmaWxlcyAoZGVmYXVsdDogc2hhcmUvZG9jKSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZmNTNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDIwNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaW5jbHVkZShDTWFrZURlcGVuZGVudE9wdGlvbikKKworc2V0KFRIUklGVF9DT01QSUxFUiAiIiBDQUNIRSBGSUxFUEFUSCAiRXh0ZXJuYWwgVGhyaWZ0IGNvbXBpbGVyIHRvIHVzZSBkdXJpbmcgYnVpbGQiKQorCisjIEFkZGl0aW9uYWwgY29tcG9uZW50cworb3B0aW9uKEJVSUxEX0NPTVBJTEVSICJCdWlsZCBUaHJpZnQgY29tcGlsZXIiIE9OKQorCitpZihCVUlMRF9DT01QSUxFUiBPUiBFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIHNldChIQVZFX0NPTVBJTEVSIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9URVNUSU5HICJCdWlsZCB3aXRoIHVuaXQgdGVzdHMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0VYQU1QTEVTICJCdWlsZCBleGFtcGxlcyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVFVUT1JJQUxTICJCdWlsZCBUaHJpZnQgdHV0b3JpYWxzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorb3B0aW9uKEJVSUxEX0xJQlJBUklFUyAiQnVpbGQgVGhyaWZ0IGxpYnJhcmllcyIgT04pCisKKyMgTGlicmFyaWVzIHRvIGJ1aWxkCisKKyMgRWFjaCBsYW5ndWFnZSBsaWJyYXJ5IGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVzaW5nIHRoZSBXSVRIXzxMQU5HPiBmbGFnLgorIyBCeSBkZWZhdWx0IENNYWtlIGNoZWNrcyBpZiB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciBhIGxhbmd1YWdlIGFyZSBwcmVzZW50CisjIGFuZCBlbmFibGVzIHRoZSBsaWJyYXJ5IGlmIGFsbCBhcmUgZm91bmQuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYXMKKyMgbXVjaCBhcyBwb3NzaWJsZSBidXQgbGVhdmluZyBvdXQgbGlicmFyaWVzIGlmIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldC4KKworb3B0aW9uKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRikKK3NldChCb29zdF9VU0VfU1RBVElDX0xJQlMgJHtXSVRIX0JPT1NUX1NUQVRJQ30pCitpZiAoTk9UIFdJVEhfQk9PU1RfU1RBVElDKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX0FMTF9EWU5fTElOSykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9URVNUX0RZTl9MSU5LKQorZW5kaWYoKQorCisjIEMrKworb3B0aW9uKFdJVEhfQ1BQICJCdWlsZCBDKysgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DUFApCisgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUVVJRVQpCisgICAgIyBOT1RFOiBDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBDKysgc3BlY2lmaWMsCisgICAgIyBidXQgaW4gZnV0dXJlIG90aGVyIGxpYnJhcmllcyBtaWdodCByZXVzZSB0aGVtLgorICAgICMgU28gdGhleSBhcmUgbm90IGRlcGVuZGVudCBvbiBXSVRIX0NQUCBidXQgc2V0dGluZyB0aGVtIHdpdGhvdXQgV0lUSF9DUFAgY3VycmVudGx5CisgICAgIyBoYXMgbm8gZWZmZWN0LgorICAgIGlmKFpMSUJfTElCUkFSWSkKKyAgICAgICAgIyBGaW5kWkxJQi5jbWFrZSBkb2VzIG5vdCBub3JtYWxpemUgcGF0aCBzbyB3ZSBuZWVkIHRvIGRvIGl0IG91cnNlbHZlcy4KKyAgICAgICAgZmlsZShUT19DTUFLRV9QQVRIICR7WkxJQl9MSUJSQVJZfSBaTElCX0xJQlJBUlkpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9aTElCICJCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJaTElCX0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9MSUJFVkVOVCAiQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpYmV2ZW50X0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKFF0NCBRVUlFVCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNCAiQnVpbGQgd2l0aCBRdDQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRVDRfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoUXQ1IFFVSUVUIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9RVDUgIkJ1aWxkIHdpdGggUXQ1IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXQ1X0ZPVU5EIiBPRkYpCisgICAgaWYoJHtXSVRIX1FUNH0gQU5EICR7V0lUSF9RVDV9IEFORCAke0NNQUtFX01BSk9SX1ZFUlNJT059IExFU1MgMykKKyAgICAgICMgY21ha2UgPCAzLjAuMCBjYXVzZXMgY29uZmxpY3Qgd2hlbiBidWlsZGluZyBib3RoIFF0NCBhbmQgUXQ1CisgICAgICBzZXQoV0lUSF9RVDQgT0ZGKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfT1BFTlNTTCAiQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BFTlNTTF9GT1VORCIgT0ZGKQorICAgIG9wdGlvbihXSVRIX1NURFRIUkVBRFMgIkJ1aWxkIHdpdGggQysrIHN0ZDo6dGhyZWFkIHN1cHBvcnQiIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DUFAgIkJ1aWxkIEMrKyBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ1BQO0Jvb3N0X0ZPVU5EIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUExVR0lOICJCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCIgT0ZGCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9DT01QSUxFUjtCVUlMRF9DUFAiIE9GRikKKworIyBDIEdMaWIKK29wdGlvbihXSVRIX0NfR0xJQiAiQnVpbGQgQyAoR0xpYikgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DX0dMSUIpCisgICAgZmluZF9wYWNrYWdlKEdMSUIgUVVJRVQgQ09NUE9ORU5UUyBnb2JqZWN0KQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DX0dMSUI7R0xJQl9GT1VORCIgT0ZGKQorCitpZihCVUlMRF9DUFApCisgICAgc2V0KGJvb3N0X2NvbXBvbmVudHMpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyBzeXN0ZW0gdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBsaXN0KEFQUEVORCBib29zdF9jb21wb25lbnRzIHVuaXRfdGVzdF9mcmFtZXdvcmsgZmlsZXN5c3RlbSBjaHJvbm8gcHJvZ3JhbV9vcHRpb25zKQorICAgIGVuZGlmKCkKKyAgICBpZihib29zdF9jb21wb25lbnRzKQorICAgICAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCBDT01QT05FTlRTICR7Ym9vc3RfY29tcG9uZW50c30pCisgICAgZW5kaWYoKQorZWxzZWlmKEJVSUxEX0NfR0xJQiBBTkQgQlVJTERfVEVTVElORykKKyAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCkKK2VuZGlmKCkKKworIyBKYXZhCitvcHRpb24oV0lUSF9KQVZBICJCdWlsZCBKYXZhIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKEFORFJPSUQpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZSBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0dSQURMRV9GT1VORCIgT0ZGKQorZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZXcgUVVJRVQpCisgICAgZmluZF9wYWNrYWdlKEphdmEgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtKQVZBX0ZPVU5EO0dSQURMRVdfRk9VTkQiIE9GRikKK2VuZGlmKCkKKworIyBQeXRob24KK29wdGlvbihXSVRIX1BZVEhPTiAiQnVpbGQgUHl0aG9uIFRocmlmdCBsaWJyYXJ5IiBPTikKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgUVVJRVQpICMgZm9yIFB5dGhvbiBleGVjdXRhYmxlCitmaW5kX3BhY2thZ2UoUHl0aG9uTGlicyBRVUlFVCkgIyBmb3IgUHl0aG9uLmgKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfUFlUSE9OICJCdWlsZCBQeXRob24gbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX1BZVEhPTjtQWVRIT05MSUJTX0ZPVU5EIiBPRkYpCisKKyMgSGFza2VsbAorb3B0aW9uKFdJVEhfSEFTS0VMTCAiQnVpbGQgSGFza2VsbCBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoR0hDIFFVSUVUKQorZmluZF9wYWNrYWdlKENhYmFsIFFVSUVUKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9IQVNLRUxMICJCdWlsZCBHSEMgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0hBU0tFTEw7R0hDX0ZPVU5EO0NBQkFMX0ZPVU5EIiBPRkYpCisKKyMgQ29tbW9uIGxpYnJhcnkgb3B0aW9ucworb3B0aW9uKFdJVEhfU0hBUkVEX0xJQiAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgT04pCitvcHRpb24oV0lUSF9TVEFUSUNfTElCICJCdWlsZCBzdGF0aWMgbGlicmFyaWVzIiBPTikKK2lmIChOT1QgV0lUSF9TSEFSRURfTElCIEFORCBOT1QgV0lUSF9TVEFUSUNfTElCKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCBidWlsZCB3aXRoIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgb3V0cHV0cyBkaXNhYmxlZCEiKQorZW5kaWYoKQorCisjTk9URTogQysrIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGxpYi9jcHAvQ01ha2VMaXN0cy50eHQKKworIyBWaXN1YWwgU3R1ZGlvIG9ubHkgb3B0aW9ucworaWYoTVNWQykKK29wdGlvbihXSVRIX01UICJCdWlsZCB1c2luZyBNVCBpbnN0ZWFkIG9mIE1EIChNU1ZDIG9ubHkpIiBPRkYpCitlbmRpZihNU1ZDKQorCittYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCitpZihOT1QgJHtmbGFnfSkKKyAgbWVzc2FnZShTVEFUVVMgIiAgIC0gJHtzdW1tYXJ5fSIpCitlbmRpZigpCitlbmRtYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCisKK21hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQorbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHtQQUNLQUdFX1ZFUlNJT059IikKK21lc3NhZ2UoU1RBVFVTICJCdWlsZCBjb25maWd1cmF0aW9uIFN1bW1hcnkiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGNvbXBpbGVyOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydDogICAgICAgICAgICAgICR7V0lUSF9QTFVHSU59IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggdW5pdCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9URVNUSU5HfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBleGFtcGxlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfRVhBTVBMRVN9IikKK01FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9MSUJSQVJJRVN9IikKK21lc3NhZ2UoU1RBVFVTICIgTGFuZ3VhZ2UgbGlicmFyaWVzOiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDKysgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ1BQfSIpCitNRVNTQUdFX0RFUChXSVRIX0NQUCAiRGlzYWJsZWQgYnkgV0lUSF9DUFA9T0ZGIikKK01FU1NBR0VfREVQKEJvb3N0X0ZPVU5EICJCb29zdCBoZWFkZXJzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgICBDKysgTGFuZ3VhZ2UgTGV2ZWw6ICAgICAgICAgICAgICAgICAgICAgICAke0NYWF9MQU5HVUFHRV9MRVZFTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQyAoR0xpYikgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NfR0xJQn0iKQorTUVTU0FHRV9ERVAoV0lUSF9DX0dMSUIgIkRpc2FibGVkIGJ5IFdJVEhfQ19HTElCPU9GRiIpCitNRVNTQUdFX0RFUChHTElCX0ZPVU5EICJHTGliIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSmF2YSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKK01FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgV0lUSF9KQVZBPU9GRiIpCitpZihBTkRST0lEKQorICAgIE1FU1NBR0VfREVQKEdSQURMRV9GT1VORCAiR3JhZGxlIG1pc3NpbmciKQorZWxzZSgpCisgICAgTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQorICAgIE1FU1NBR0VfREVQKEdSQURMRVdfRk9VTkQgIkdyYWRsZSBXcmFwcGVyIG1pc3NpbmciKQorZW5kaWYoKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgUHl0aG9uIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQorTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IFdJVEhfUFlUSE9OPU9GRiIpCitNRVNTQUdFX0RFUChQWVRIT05MSUJTX0ZPVU5EICJQeXRob24gbGlicmFyaWVzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSGFza2VsbCBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0hBU0tFTEx9IikKK01FU1NBR0VfREVQKFdJVEhfSEFTS0VMTCAiRGlzYWJsZWQgYnkgV0lUSF9IQVNLRUxMPU9GRiIpCitNRVNTQUdFX0RFUChHSENfRk9VTkQgIkdIQyBtaXNzaW5nIikKK01FU1NBR0VfREVQKENBQkFMX0ZPVU5EICJDYWJhbCBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgTGlicmFyeSBmZWF0dXJlczoiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc2hhcmVkIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU0hBUkVEX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc3RhdGljIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU1RBVElDX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBCb29zdCBzdGF0aWMgbGluayBsaWJyYXJ5OiAgICAgICAke1dJVEhfQk9PU1RfU1RBVElDfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0OiAgICAgICAgICR7V0lUSF9TVERUSFJFQURTfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICR7V0lUSF9MSUJFVkVOVH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAke1dJVEhfT1BFTlNTTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDQgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ0fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NSBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9RVDV9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1pMSUJ9IikKK21lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKK2VuZG1hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFVuY29tbWVudCB0aGlzIHRvIHNob3cgc29tZSBiYXNpYyBjbWFrZSB2YXJpYWJsZXMgYWJvdXQgcGxhdGZvcm1zCisjIGluY2x1ZGUgKE5ld1BsYXRmb3JtRGVidWcpCisKKyMgVmlzdWFsIFN0dWRpbyBzcGVjaWZpYyBvcHRpb25zCitpZihNU1ZDKQorICAgICNGb3IgdmlzdWFsIHN0dWRpbyB0aGUgbGlicmFyeSBuYW1pbmcgaXMgYXMgZm9sbG93aW5nOgorICAgICMgRHluYW1pYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnQuZGxsICBmb3IgcmVsZWFzZSBsaWJyYXJ5CisgICAgIyAgLSB0aHJpZnRkLmRsbCBmb3IgZGVidWcgbGlicmFyeQorICAgICMKKyAgICAjIFN0YXRpYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnRtZC5saWIgZm9yIC9NRCByZWxlYXNlIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdC5saWIgZm9yIC9NVCByZWxlYXNlIGJ1aWxkCisgICAgIworICAgICMgIC0gdGhyaWZ0bWRkLmxpYiBmb3IgL01EIGRlYnVnIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdGQubGliIGZvciAvTVQgZGVidWcgYnVpbGQKKyAgICAjCisgICAgIyB0aGUgc2FtZSBob2xkcyBmb3Igb3RoZXIgbGlicmFyaWVzIGxpa2UgbGlidGhyaWZ0eiBldGMuCisKKyAgICAjIEZvciBEZWJ1ZyBidWlsZCB0eXBlcywgYXBwZW5kIGEgImQiIHRvIHRoZSBsaWJyYXJ5IG5hbWVzLgorICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxFQVNFX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxXSVRIREVCSU5GT19QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKworICAgICMgQnVpbGQgdXNpbmcgL01UIG9wdGlvbiBpbnN0ZWFkIG9mIC9NRCBpZiB0aGUgV0lUSF9NVCBvcHRpb25zIGlzIHNldAorICAgIGlmKFdJVEhfTVQpCisgICAgICAgIHNldChDb21waWxlckZsYWdzCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19ERUJVRworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZvcmVhY2goQ29tcGlsZXJGbGFnICR7Q29tcGlsZXJGbGFnc30pCisgICAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi9NVCIgJHtDb21waWxlckZsYWd9ICIkeyR7Q29tcGlsZXJGbGFnfX0iKQorICAgICAgICBlbmRmb3JlYWNoKCkKKyAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtdCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgZWxzZShXSVRIX01UKQorICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBlbmRpZihXSVRIX01UKQorCisgICAgIyBEaXNhYmxlIGJvb3N0IGF1dG8gbGlua2luZyBwcmFnbWFzIC0gY21ha2UgaW5jbHVkZXMgdGhlIHJpZ2h0IGZpbGVzCisgICAgYWRkX2RlZmluaXRpb25zKCItREJPT1NUX0FMTF9OT19MSUIiKQorCisgICAgIyBXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IGtub3cgaG93IHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSB5ZXQKKyAgICAjIGFzIHRoZXJlIGFyZSBubyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IgZXhwb3J0cyBmaWxlcyBpbiB0aGUgcHJvamVjdC4KKyAgICBpZiAoV0lUSF9TSEFSRURfTElCKQorICAgICAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIldpbmRvd3MgYnVpbGQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyeSBvdXRwdXQgeWV0LCBwbGVhc2Ugc2V0IC1EV0lUSF9TSEFSRURfTElCPW9mZiIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2RlZmluaXRpb25zKCIvTVAiKSAjIHBhcmFsbGVsIGJ1aWxkCisgICAgYWRkX2RlZmluaXRpb25zKCIvVzMiKSAjIHdhcm5pbmcgbGV2ZWwgMworCisgICAgIyBWUzIwMTAgZG9lcyBub3QgcHJvdmlkZSBpbnR0eXBlcyB3aGljaCB3ZSBuZWVkIGZvciAiUFJJZDY0IiB1c2VkIGluIG1hbnkgcGxhY2VzCisgICAgZmluZF9wYWNrYWdlKEludHR5cGVzKQorICAgIGlmIChJbnR0eXBlc19GT1VORCkKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorICAgICAgIyBPcGVuU1NMIGNvbmZsaWN0cyB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIFBSSWQ2NCB1bmxlc3MgaXQgaXMgZGVmaW5lZCBmaXJzdAorICAgICAgYWRkX2RlZmluaXRpb25zKCIvRklpbnR0eXBlcy5oIikKKyAgICBlbmRpZiAoKQorZWxzZWlmKFVOSVgpCisgIGZpbmRfcHJvZ3JhbSggTUVNT1JZQ0hFQ0tfQ09NTUFORCB2YWxncmluZCApCisgIHNldCggTUVNT1JZQ0hFQ0tfQ09NTUFORF9PUFRJT05TICItLWdlbi1zdXBwcmVzc2lvbnM9YWxsIC0tbGVhay1jaGVjaz1mdWxsIiApCisgIHNldCggTUVNT1JZQ0hFQ0tfU1VQUFJFU1NJT05TX0ZJTEUgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIiApCitlbmRpZigpCisKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfRk9STUFUX01BQ1JPUyIpCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0xJTUlUX01BQ1JPUyIpCisKKyMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQoraWYoV0lUSF9TVERUSFJFQURTKQorICBhZGRfZGVmaW5pdGlvbnMoIi1EVVNFX1NURF9USFJFQUQ9MSIpCitlbmRpZigpCisKKyMgQysrIExhbmd1YWdlIExldmVsCitzZXQoQ1hYX0xBTkdVQUdFX0xFVkVMICJDKyske0NNQUtFX0NYWF9TVEFOREFSRH0iKQoraWYgKENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbY29tcGlsZXIgbXVzdCBzdXBwb3J0IGl0XSIpCitlbHNlKCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbZmFsbGJhY2sgdG8gZWFybGllciBpZiBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGl0XSIpCitlbmRpZigpCitpZiAoQ01BS0VfQ1hYX0VYVEVOU0lPTlMpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW3dpdGggY29tcGlsZXItc3BlY2lmaWMgZXh0ZW5zaW9uc10iKQorZW5kaWYoKQorCitpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitlbmRpZigpCisKKyMgQnVpbGRpbmcgV0lUSF9QTFVHSU4gcmVxdWlyZXMgYm9vc3QgbWVtb3J5IG9wZXJhdGlvbnMsIGZvciBub3csIGFuZCBnY2MgPj0gNC44CitpZiAoV0lUSF9QTFVHSU4pCisgIGlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIiBBTkQgQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICI0LjgiKQorICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVGhyaWZ0IGNvbXBpbGVyIHBsdWctaW4gc3VwcG9ydCBpcyBub3QgcG9zc2libGUgd2l0aCBvbGRlciBnY2MgKCA8IDQuOCApIGNvbXBpbGVyIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAzNzFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBBTlRfRk9VTkQgLSBzeXN0ZW0gaGFzIEFudAorIyAgQW50X0VYRUNVVEFCTEUgLSB0aGUgQW50IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQW50X0VYRUNVVEFCTEUgTkFNRVMgYW50IFBBVEhTICRFTlZ7QU5UX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBbnQgREVGQVVMVF9NU0cgQW50X0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEFudF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgQ2FiYWxfRk9VTkQgLSBzeXN0ZW0gaGFzIENhYmFsCisjICBDYWJhbCAtIHRoZSBDYWJhbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDQUJBTF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQ0FCQUwgTkFNRVMgY2FiYWwgUEFUSFMgJEVOVntIT01FfS8uY2FiYWwvYmluICRFTlZ7Q0FCQUxfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKENBQkFMIERFRkFVTFRfTVNHIENBQkFMKQorbWFya19hc19hZHZhbmNlZChDQUJBTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHSEMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzM4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdIQ19GT1VORCAtIHN5c3RlbSBoYXMgR0hDCisjICBHSEMgLSB0aGUgR0hDIGV4ZWN1dGFibGUKKyMgIFJVTl9IQVNLRUxMX0ZPVU5EIC0gc3lzdGVtIGhhcyBydW5oYXNrZWxsCisjICBSVU5fSEFTS0VMTCAtIHRoZSBydW5oYXNrZWxsIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdIQ19IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR0hDIE5BTUVTIGdoYyBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR0hDIERFRkFVTFRfTVNHIEdIQykKK21hcmtfYXNfYWR2YW5jZWQoR0hDKQorCitmaW5kX3Byb2dyYW0oUlVOX0hBU0tFTEwgTkFNRVMgcnVuaGFza2VsbCBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUlVOX0hBU0tFTEwgREVGQVVMVF9NU0cgUlVOX0hBU0tFTEwpCittYXJrX2FzX2FkdmFuY2VkKFJVTl9IQVNLRUxMKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0xJQi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JlNDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UKQEAgLTAsMCArMSwxMjIgQEAKKyMgLSBUcnkgdG8gZmluZCBHbGliIGFuZCBpdHMgY29tcG9uZW50cyAoZ2lvLCBnb2JqZWN0IGV0YykKKyMgT25jZSBkb25lLCB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBHTElCX0ZPVU5EIC0gc3lzdGVtIGhhcyBHbGliCisjICBHTElCX0lOQ0xVREVfRElSUyAtIHRoZSBHbGliIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIEdMSUJfTElCUkFSSUVTIC0gbGluayB0aGVzZSB0byB1c2UgR2xpYgorIworIyBPcHRpb25hbGx5LCB0aGUgQ09NUE9ORU5UUyBrZXl3b3JkIGNhbiBiZSBwYXNzZWQgdG8gZmluZF9wYWNrYWdlKCkKKyMgYW5kIEdsaWIgY29tcG9uZW50cyBjYW4gYmUgbG9va2VkIGZvci4gIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZworIyBjb21wb25lbnRzIGNhbiBiZSB1c2VkLCBhbmQgdGhleSBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgaWYKKyMgZm91bmQ6CisjCisjICBnaW86ICAgICAgICAgICAgIEdMSUJfR0lPX0xJQlJBUklFUworIyAgZ29iamVjdDogICAgICAgICBHTElCX0dPQkpFQ1RfTElCUkFSSUVTCisjICBnbW9kdWxlOiAgICAgICAgIEdMSUJfR01PRFVMRV9MSUJSQVJJRVMKKyMgIGd0aHJlYWQ6ICAgICAgICAgR0xJQl9HVEhSRUFEX0xJQlJBUklFUworIworIyBOb3RlIHRoYXQgdGhlIHJlc3BlY3RpdmUgX0lOQ0xVREVfRElSIHZhcmlhYmxlcyBhcmUgbm90IHNldCwgc2luY2UKKyMgYWxsIGhlYWRlcnMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBHTElCX0lOQ0xVREVfRElSUy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJhcGhhZWwgS3VibyBkYSBDb3N0YSA8cmFrdWNvQHdlYmtpdC5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTCisjIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSVRTCisjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKK3BrZ19jaGVja19tb2R1bGVzKFBDX0dMSUIgUVVJRVQgZ2xpYi0yLjApCisKK2ZpbmRfbGlicmFyeShHTElCX0xJQlJBUklFUworICAgIE5BTUVTIGdsaWItMi4wCisgICAgSElOVFMgJHtQQ19HTElCX0xJQkRJUn0KKyAgICAgICAgICAke1BDX0dMSUJfTElCUkFSWV9ESVJTfQorKQorCisjIEZpbGVzIGluIGdsaWIncyBtYWluIGluY2x1ZGUgcGF0aCBtYXkgaW5jbHVkZSBnbGliY29uZmlnLmgsIHdoaWNoLAorIyBmb3Igc29tZSBvZGQgcmVhc29uLCBpcyBub3JtYWxseSBpbiAkTElCRElSL2dsaWItMi4wL2luY2x1ZGUuCitnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9HTElCX0xJQlJBUllfRElSICR7R0xJQl9MSUJSQVJJRVN9IFBBVEgpCitmaW5kX3BhdGgoR0xJQkNPTkZJR19JTkNMVURFX0RJUgorICAgIE5BTUVTIGdsaWJjb25maWcuaAorICAgIEhJTlRTICR7UENfTElCRElSfSAke1BDX0xJQlJBUllfRElSU30gJHtfR0xJQl9MSUJSQVJZX0RJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERURJUn0gJHtQQ19HTElCX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2luY2x1ZGUKKykKKworZmluZF9wYXRoKEdMSUJfSU5DTFVERV9ESVIKKyAgICBOQU1FUyBnbGliLmgKKyAgICBISU5UUyAke1BDX0dMSUJfSU5DTFVERURJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERV9ESVJTfQorICAgIFBBVEhfU1VGRklYRVMgZ2xpYi0yLjAKKykKKworc2V0KEdMSUJfSU5DTFVERV9ESVJTICR7R0xJQl9JTkNMVURFX0RJUn0gJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfSkKKworaWYoR0xJQkNPTkZJR19JTkNMVURFX0RJUikKKyAgICAjIFZlcnNpb24gZGV0ZWN0aW9uCisgICAgZmlsZShSRUFEICIke0dMSUJDT05GSUdfSU5DTFVERV9ESVJ9L2dsaWJjb25maWcuaCIgR0xJQkNPTkZJR19IX0NPTlRFTlRTKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01BSk9SX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01BSk9SICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NSU5PUl9WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NSU5PUiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUlDUk9fVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUlDUk8gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHNldChHTElCX1ZFUlNJT04gIiR7R0xJQl9WRVJTSU9OX01BSk9SfS4ke0dMSUJfVkVSU0lPTl9NSU5PUn0uJHtHTElCX1ZFUlNJT05fTUlDUk99IikKK2VuZGlmKCkKKworIyBBZGRpdGlvbmFsIEdsaWIgY29tcG9uZW50cy4gIFdlIG9ubHkgbG9vayBmb3IgbGlicmFyaWVzLCBhcyBub3QgYWxsIG9mIHRoZW0KKyMgaGF2ZSBjb3JyZXNwb25kaW5nIGhlYWRlcnMgYW5kIGFsbCBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgYWxvbmdzaWRlIHRoZSBtYWluCisjIGdsaWIgb25lcy4KK2ZvcmVhY2ggKF9jb21wb25lbnQgJHtHTElCX0ZJTkRfQ09NUE9ORU5UU30pCisgICAgaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdpbyIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dJT19MSUJSQVJJRVMgTkFNRVMgZ2lvLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HSU9fTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ29iamVjdCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dPQkpFQ1RfTElCUkFSSUVTIE5BTUVTIGdvYmplY3QtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dPQkpFQ1RfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ21vZHVsZSIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dNT0RVTEVfTElCUkFSSUVTIE5BTUVTIGdtb2R1bGUtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dNT0RVTEVfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ3RocmVhZCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dUSFJFQURfTElCUkFSSUVTIE5BTUVTIGd0aHJlYWQtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dUSFJFQURfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ2lvLXVuaXgiKQorICAgICAgICAjIGdpby11bml4IGlzIGNvbXBpbGVkIGFzIHBhcnQgb2YgdGhlIGdpbyBsaWJyYXJ5LCBidXQgdGhlIGluY2x1ZGUgcGF0aHMKKyAgICAgICAgIyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgc2hhcmVkIGdsaWIgb25lcy4gU2luY2UgdGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkCisgICAgICAgICMgYnkgV2ViS2l0R1RLKyB3ZSBkb24ndCBnbyB0byBleHRyYW9yZGluYXJ5IG1lYXN1cmVzIGJleW9uZCBwa2ctY29uZmlnLgorICAgICAgICBwa2dfY2hlY2tfbW9kdWxlcyhHSU9fVU5JWCBRVUlFVCBnaW8tdW5peC0yLjApCisgICAgZW5kaWYgKCkKK2VuZGZvcmVhY2ggKCkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhHTElCIFJFUVVJUkVEX1ZBUlMgR0xJQl9JTkNMVURFX0RJUlMgR0xJQl9MSUJSQVJJRVMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1ZBUiAgIEdMSUJfVkVSU0lPTikKKworbWFya19hc19hZHZhbmNlZCgKKyAgICBHTElCQ09ORklHX0lOQ0xVREVfRElSCisgICAgR0xJQl9HSU9fTElCUkFSSUVTCisgICAgR0xJQl9HSU9fVU5JWF9MSUJSQVJJRVMKKyAgICBHTElCX0dNT0RVTEVfTElCUkFSSUVTCisgICAgR0xJQl9HT0JKRUNUX0xJQlJBUklFUworICAgIEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMKKyAgICBHTElCX0lOQ0xVREVfRElSCisgICAgR0xJQl9JTkNMVURFX0RJUlMKKyAgICBHTElCX0xJQlJBUklFUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdyYWRsZS5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR1JBRExFX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGUKKyMgIEdSQURMRV9FWEVDVVRBQkxFIC0gdGhlIEdyYWRsZSBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRV9FWEVDVVRBQkxFIE5BTUVTIGdyYWRsZSBQQVRIUyAkRU5We0dSQURMRV9IT01FfS9iaW4gTk9fQ01BS0VfRklORF9ST09UX1BBVEgpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR3JhZGxlIERFRkFVTFRfTVNHIEdSQURMRV9FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiYjk5OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRVdfRk9VTkQgLSBzeXN0ZW0gaGFzIEdyYWRsZXcKKyMgIEdSQURMRVdfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGV3IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGxvY2F0aW9uIENNQUtFX1NPVVJDRV9ESVIvbGliL2phdmEKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRVdfRVhFQ1VUQUJMRSBncmFkbGV3IFBBVEhTICR7Q01BS0VfU09VUkNFX0RJUn0vbGliL2phdmEgTk9fREVGQVVMVF9QQVRIIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZXcgREVGQVVMVF9NU0cgR1JBRExFV19FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVXX0VYRUNVVEFCTEUpCisKKyMgQnVnZ3kgZmluZF9wcm9ncmFtIGNhbm5vdCBmaW5kIGdyYWRsZXcuYmF0IHdoZW4gZ3JhZGxldyBpcyBhdCB0aGUgc2FtZSBwYXRoCisjIGFuZCBldmVuIGJ1Z2dpZXIgY3Rlc3Qgd2lsbCBub3QgZXhlY3V0ZSBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgZ2l2ZW4uCitpZihDTUFLRV9IT1NUX1dJTjMyKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoLitncmFkbGV3KSQiICJcXDEuYmF0IiBHUkFETEVXX0VYRUNVVEFCTEUgJHtHUkFETEVXX0VYRUNVVEFCTEV9KQorZW5kaWYoQ01BS0VfSE9TVF9XSU4zMikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYxZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGZpbmQgbXNpbnR0eXBlcyBvbiBjb21waWxlcnMgdGhhdCBkb24ndCBwcm92aWRlIGl0LCBmb3IgZXhhbXBsZQorIyAgIFZTMjAxMAorCisjIFVzYWdlOiAKKyMgUHJvdmlkZSBJTlRUWVBFU19ST09UIGlmIHlvdSBuZWVkIGl0CisjIFJlc3VsdDogSU5UVFlQRVNfSU5DTFVERV9ESVJTLCB3aGVyZSB0byBmaW5kIGludHR5cGVzLmgKKyMgUmVzdWx0OiBJbnR0eXBlc19GT1VORCwgSWYgZmFsc2UsIGludHR5cGVzLmggd2FzIG5vdCBmb3VuZAorCitmaW5kX3BhdGgoSU5UVFlQRVNfSU5DTFVERV9ESVJTIGludHR5cGVzLmggSElOVFMgJHtJTlRUWVBFU19ST09UfSkKK2lmIChJTlRUWVBFU19JTkNMVURFX0RJUlMpCisgIHNldChJbnR0eXBlc19GT1VORCBUUlVFKQorZWxzZSAoKQorICBzZXQoSW50dHlwZXNfRk9VTkQgRkFMU0UpCisgIGlmIChJbnR0eXBlc19GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGludHR5cGVzLmgiKQorICBlbmRpZiAoKQorICBtZXNzYWdlKFNUQVRVUyAiaW50dHlwZXMuaCBOT1QgZm91bmQiKQorZW5kaWYgKCkKKworbWFya19hc19hZHZhbmNlZCgKKyAgSU5UVFlQRVNfSU5DTFVERV9ESVJTCispCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2YTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQpAQCAtMCwwICsxLDQ1IEBACisjIGZpbmQgTGliRXZlbnQKKyMgYW4gZXZlbnQgbm90aWZpY2F0aW9uIGxpYnJhcnkgKGh0dHA6Ly9saWJldmVudC5vcmcvKQorIworIyBVc2FnZTogCisjIExJQkVWRU5UX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBMaWJFdmVudCBoZWFkZXJzCisjIExJQkVWRU5UX0xJQlJBUklFUywgTGliRXZlbnQgbGlicmFyaWVzCisjIExpYmV2ZW50X0ZPVU5ELCBJZiBmYWxzZSwgZG8gbm90IHRyeSB0byB1c2UgbGliZXZlbnQKKworc2V0KExJQkVWRU5UX1JPT1QgQ0FDSEUgUEFUSCAiUm9vdCBkaXJlY3Rvcnkgb2YgbGliZXZlbnQgaW5zdGFsbGF0aW9uIikKK3NldChMaWJFdmVudF9FWFRSQV9QUkVGSVhFUyAvdXNyL2xvY2FsIC9vcHQvbG9jYWwgIiRFTlZ7SE9NRX0iICR7TElCRVZFTlRfUk9PVH0pCitmb3JlYWNoKHByZWZpeCAke0xpYkV2ZW50X0VYVFJBX1BSRUZJWEVTfSkKKyAgbGlzdChBUFBFTkQgTGliRXZlbnRfSU5DTFVERV9QQVRIUyAiJHtwcmVmaXh9L2luY2x1ZGUiKQorICBsaXN0KEFQUEVORCBMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFMgIiR7cHJlZml4fS9saWIiKQorZW5kZm9yZWFjaCgpCisKKyMgTG9va2luZyBmb3IgImV2ZW50LmgiIHdpbGwgZmluZCB0aGUgUGxhdGZvcm0gU0RLIGluY2x1ZGUgZGlyIG9uIHdpbmRvd3MKKyMgc28gd2UgYWxzbyBsb29rIGZvciBhIHBlZXIgaGVhZGVyIGxpa2UgZXZodHRwLmggdG8gZ2V0IHRoZSByaWdodCBwYXRoCitmaW5kX3BhdGgoTElCRVZFTlRfSU5DTFVERV9ESVJTIGV2aHR0cC5oIGV2ZW50LmggUEFUSFMgJHtMaWJFdmVudF9JTkNMVURFX1BBVEhTfSkKKworIyAibGliIiBwcmVmaXggaXMgbmVlZGVkIG9uIFdpbmRvd3MgaW4gc29tZSBjYXNlcworIyBuZXdlciB2ZXJzaW9ucyBvZiBsaWJldmVudCB1c2UgdGhyZWUgbGlicmFyaWVzCitmaW5kX2xpYnJhcnkoTElCRVZFTlRfTElCUkFSSUVTIE5BTUVTIGV2ZW50IGV2ZW50X2NvcmUgZXZlbnRfZXh0cmEgbGliZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorCitpZiAoTElCRVZFTlRfTElCUkFSSUVTIEFORCBMSUJFVkVOVF9JTkNMVURFX0RJUlMpCisgIHNldChMaWJldmVudF9GT1VORCBUUlVFKQorICBzZXQoTElCRVZFTlRfTElCUkFSSUVTICR7TElCRVZFTlRfTElCUkFSSUVTfSkKK2Vsc2UgKCkKKyAgc2V0KExpYmV2ZW50X0ZPVU5EIEZBTFNFKQorZW5kaWYgKCkKKworaWYgKExpYmV2ZW50X0ZPVU5EKQorICBpZiAoTk9UIExpYmV2ZW50X0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgbGliZXZlbnQ6ICR7TElCRVZFTlRfTElCUkFSSUVTfSIpCisgIGVuZGlmICgpCitlbHNlICgpCisgIGlmIChMaWJFdmVudF9GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGxpYmV2ZW50LiIpCisgIGVuZGlmICgpCisgIG1lc3NhZ2UoU1RBVFVTICJsaWJldmVudCBOT1QgZm91bmQuIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgICAgTElCRVZFTlRfTElCUkFSSUVTCisgICAgTElCRVZFTlRfSU5DTFVERV9ESVJTCisgICkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL05ld1BsYXRmb3JtRGVidWcuY21ha2UgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIEZvciBkZWJ1Z2dpbmcgbmV3IHBsYXRmb3JtcywganVzdCB0byBzZWUgd2hhdCBzb21lIGVudmlyb25tZW50IGZsYWdzIGFyZS4uLgorIworbWFjcm8oU0hPV0ZMQUcgZmxhZykKKyAgbWVzc2FnZShTVEFUVVMgIiR7ZmxhZ30gPSAkeyR7ZmxhZ319IikKK2VuZG1hY3JvKFNIT1dGTEFHKQorCitzZXQoTkVXUExBVEZPUk1ERUJVRyBPTikKKworaWYoTkVXUExBVEZPUk1ERUJVRykKKyAgU0hPV0ZMQUcoIkFQUExFIikKKyAgU0hPV0ZMQUcoIkJPUkxBTkQiKQorICBTSE9XRkxBRygiQ01BS0VfQ19DT01QSUxFUl9JRCIpCisgIFNIT1dGTEFHKCJDTUFLRV9DWFhfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIikKKyAgU0hPV0ZMQUcoIkNZR1dJTiIpCisgIFNIT1dGTEFHKCJNSU5HVyIpCisgIFNIT1dGTEFHKCJNU1ZDIikKKyAgU0hPV0ZMQUcoIk1TVkNfVkVSU0lPTiIpCisgIFNIT1dGTEFHKCJNU1lTIikKKyAgU0hPV0ZMQUcoIlVOSVgiKQorICBTSE9XRkxBRygiV0FUQ09NIikKKyAgU0hPV0ZMQUcoIldJTjMyIikKK2VuZGlmKE5FV1BMQVRGT1JNREVCVUcpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1JFQURNRS1NU1lTMi5tZApAQCAtMCwwICsxLDYzIEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChNaW5HVzY0L01TWVMyKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKz4gTm90ZTogbGliZXZlbnQgYW5kIGxpYmV2ZW50LWRldmVsIGRvIG5vdCB3b3JrIHdpdGggdGhpcyB0b29sY2hhaW4gYXMgdGhleSBkbyBub3QgcHJvcGVybHkgZGV0ZWN0IG1pbmd3NjQgYW5kIGV4cGVjdCBzb21lIGhlYWRlcnMgdG8gZXhpc3QgdGhhdCBkbyBub3QsIHNvIHRoZSBub24tYmxvY2tpbmcgc2VydmVyIGlzIG5vdCBjdXJyZW50bHkgYnVpbHQgaW50byB0aGlzIHNvbHV0aW9uLgorCisjIyBNU1lTMgorCitEb3dubG9hZCBhbmQgZnVsbHkgdXBncmFkZSBtc3lzMiBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBhdDoKKworICAgIGh0dHBzOi8vbXN5czIuZ2l0aHViLmlvLworCitJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdG9vbGNoYWluIGl0ZW1zIGZvciBDKys6CisKKyAgICAkIHBhY21hbiAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgbWluZ3ctdzY0LXg4Nl82NC1vcGVuc3NsIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LWJvb3N0IG1pbmd3LXc2NC14ODZfNjQtY21ha2UgXAorICAgICAgICAgICAgICAgIG1pbmd3LXc2NC14ODZfNjQtdG9vbGNoYWluIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCitVcGRhdGUgeW91ciBtc3lzMiBiYXNoIHBhdGggdG8gaW5jbHVkZSAvbWluZ3c2NC9iaW4gYnkgYWRkaW5nIGEgbGluZSB0byB5b3VyIH4vLmJhc2hfcHJvZmlsZXMgdXNpbmcgdGhpcyBjb21tYW5kOgorCisgICAgZWNobyAiZXhwb3J0IFBBVEg9L21pbmd3NjQvYmluOlwkUEFUSCIgPj4gfi8uYmFzaF9wcm9maWxlCisKK0FmdGVyIHRoYXQsIGNsb3NlIHlvdXIgc2hlbGwgYW5kIG9wZW4gYSBuZXcgb25lLgorCitVc2UgY21ha2UgdG8gY3JlYXRlIGEgTWluR1cgbWFrZWZpbGUsIG91dCBvZiB0cmVlIChhc3N1bWVzIHlvdSBhcmUgaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlKToKKworICAgIG1rZGlyIC4uL3RocmlmdC1idWlsZAorICAgIGNkIC4uL3RocmlmdC1idWlsZAorICAgIGNtYWtlIC1HIk1pbkdXIE1ha2VmaWxlcyIgLURDTUFLRV9NQUtFX1BST0dSQU09L21pbmd3NjQvYmluL21pbmd3MzItbWFrZSBcCisgICAgICAgLURDTUFLRV9DX0NPTVBJTEVSPXg4Nl82NC13NjQtbWluZ3czMi1nY2MuZXhlIFwKKyAgICAgICAtRENNQUtFX0NYWF9DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZysrLmV4ZSBcCisgICAgICAgLURXSVRIX0xJQkVWRU5UPU9GRiBcCisgICAgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIC1EV0lUSF9TVEFUSUNfTElCPU9OIFwKKyAgICAgICAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX1BZVEhPTj1PRkYgLURXSVRIX1BFUkw9T0ZGIFwKKyAgICAgICAuLi90aHJpZnQKKworQnVpbGQgdGhyaWZ0IChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCitSdW4gdGhlIHRlc3RzIChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGN0ZXN0CisKKz4gSWYgeW91IHJ1biBpbnRvIGlzc3VlcywgY2hlY2sgQXBhY2hlIEppcmEgVEhSSUZULTQwNDYgZm9yIHBhdGNoZXMgcmVsYXRpbmcgdG8gTWluR1c2NC9NU1lTMiBidWlsZHMuCisKKyMjIFRlc3RlZCBXaXRoCisKK21zeXMyIDY0LWJpdCAyMDE2LTEwLTI2IGRpc3RyaWJ1dGlvbgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzEyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBBcGFjaGUgVGhyaWZ0IC0gQ01ha2UgYnVpbGQKKworIyMgR29hbAorRXh0ZW5kIEFwYWNoZSBUaHJpZnQncyAqbWFrZSBjcm9zcyogYXBwcm9hY2ggdG8gdGhlIGJ1aWxkIHN5c3RlbS4KKworRHVlIHRvIGdyb3dpbmcgdGhlIGZpZWxkIG9mIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydCwgYSBwcm9wZXIgZXhlY3V0YWJsZQorYW5kIGxpYnJhcnkgZGV0ZWN0aW9uIG1lY2hhbmlzbSBydW5uaW5nIG9uIGFzIG11Y2ggcGxhdGZvcm1zIGFzIHBvc3NpYmxlCitiZWNvbWVzIHJlcXVpcmVkLiBUaGUgb3RoZXIgYXNwZWN0IHRvIHNpbXBsaWZ5IHRoZSByZWxlYXNlIHByb2Nlc3MgYW5kCitwYWNrYWdlIGdlbmVyYXRpb24gcHJvY2Vzcy4KKworQXMgbmljZSBzaWRlIGJlbmVmaXQgb2YgQ01ha2UgaXMgdGhlIGdlbmVyYXRpb24gb2YgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKK3NwZWNpZmljIHNvdWx0aW9uIGZpbGVzLiA9PiBObyBzb2x1dGlvbiBmaWxlcyB3aXRoaW4gc291cmNlIHRyZWUuCisKKworIyMgVXNhZ2UKK2p1c3QgZG8gdGhpczoKKworICAgIG1rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCisgICAgY21ha2UgLi4KKworaWYgeW91IHVzZSBhIHNwZWNpZmljIHRvb2xjaGFpbiBwYXNzIGl0IHRvIGNtYWtlLCB0aGUgc2FtZSBmb3Igb3B0aW9uczoKKworICAgIGNtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLi4KKyAgICBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmctMy41IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKystMy41IC4uCisgICAgY21ha2UgLURUSFJJRlRfQ09NUElMRVJfSFM9T0ZGIC4uCisgICAgY21ha2UgLURXSVRIX1pMSUI9T04gLi4KKworb3Igb24gV2luZG93cworCisgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgXAorICAgIC1EQk9PU1RfUk9PVD1DOi8zcmRwYXJ0eS9ib29zdF8xXzU4XzAgXAorICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWIxMjgtZGxsIFwKKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KKworYW5kIG9wZW4gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBsaWtlIHdpdGggdGhlIHNvbHV0aW9uIG9yIGRvIHRoaXM6CisKKyAgICBtYWtlCisgICAgbWFrZSBjaGVjaworICAgIG1ha2UgY3Jvc3MKKyAgICBtYWtlIGRpc3QKKwordG8gZ2VuZXJhdGUgYW4gaW5zdGFsbGVyIGFuZCBkaXN0cmlidXRpb24gcGFja2FnZSBkbyB0aGlzOgorCisgICAgY3BhY2sKKworIyMgVE9ETworKiBnaXQgaGFzaCBvciB0YWcgYmFzZWQgdmVyc2lvbmluZyBkZXBlbmRpbmcgb24gc291cmNlIHN0YXRlCisqIGJ1aWxkIHR1dG9yaWFsCisqIGJ1aWxkIHRlc3QKKyogd2l0aC93aXRob3V0IGxhbmd1YWdlIGxpYi88bGFuZz4vCisqIGVuYWJsZS9kaXNhYmxlCisqIG1ha2UgY3Jvc3MKKyogbWFrZSBkaXN0IChjcmVhdGUgYW4gYWxpYXMgdG8gbWFrZSBwYWNrYWdlX3NvdXJjZSkKKyogbWFrZSBkb2MKKyogY3BhY2sgKEMrKyBhbmQgbWFrZSBkaXN0IG9ubHkgPykKKyAgKiB0aHJpZnQtY29tcGlsZXIKKyAgKiBsaWJ0aHJpZnQKKyAgKiB0dXRvcmlhbAorICAqIHRlc3QKKyogbWVyZ2UgaW50byAvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzN2Y5NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQpAQCAtMCwwICsxLDEwNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiIENBQ0hFIFNUUklORyAiU2V0IGRlYnVnIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisKKworbWFjcm8oQUREX0xJQlJBUllfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICBhZGRfbGlicmFyeSgke25hbWV9IFNIQVJFRCAke0FSR059KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfQorICAgICAgICBWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgIFNPVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSApCisgICAgI3NldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMgUFVCTElDX0hFQURFUiAiJHt0aHJpZnRjcHBfSEVBREVSU30iKQorICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9CisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7QklOX0lOU1RBTExfRElSfSIKKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIFBVQkxJQ19IRUFERVIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iKQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgYWRkX2xpYnJhcnkoJHtuYW1lfV9zdGF0aWMgU1RBVElDICR7QVJHTn0pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX1fc3RhdGljIFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfSR7U1RBVElDX1BPU1RGSVh9CisgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKKyAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfV9zdGF0aWMKKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCitlbmRpZigpCisKK2VuZG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0FSR059KQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQpCisKKworbWFjcm8oTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQorCitpZiAoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfSkKK2Vsc2VpZiAoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMICJOb3QgbGlua2luZyB3aXRoIHNoYXJlZCBvciBzdGF0aWMgbGlicmFyaWVzPyIpCitlbmRpZigpCisKK2VuZG1hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkgdGFyZ2V0IGxpYm5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7QVJHTn0gJHtsaWJuYW1lfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH1fc3RhdGljICR7QVJHTn0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmM2QwMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKK3NldChBTkRST0lEX05ESyAiL29wdC9hbmRyb2lkLW5kayIgQ0FDSEUpCitzZXQoQU5EUk9JRF9QTEFURk9STSAiYW5kcm9pZC0xNSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9BUkNIICJhcmNoLWFybSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9UT09MX0FSQ0ggImFuZHJvaWQtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX0NQVSAiYXJtZWFiaS12N2EiIENBQ0hFKQorc2V0KEFORFJPSURfR0NDX1ZFUlNJT04gNC45IENBQ0hFKQorc2V0KEhPU1RfQVJDSCBsaW51eC14ODZfNjQgQ0FDSEUpCisKK3NldChDTUFLRV9TWVNURU1fTkFNRSBBbmRyb2lkKQorc2V0KEFORFJPSURfU1lTUk9PVCAiJHtBTkRST0lEX05ES30vcGxhdGZvcm1zLyR7QU5EUk9JRF9QTEFURk9STX0vJHtBTkRST0lEX0FSQ0h9IikKK3NldChBTkRST0lEX1RSSVBMRVQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpKQorc2V0KEFORFJPSURfU1RMICIke0FORFJPSURfTkRLfS9zb3VyY2VzL2N4eC1zdGwvZ251LWxpYnN0ZCsrLyR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0iKQorCitzZXQoX0NPTVBJTEVSX1JPT1QgJHtBTkRST0lEX05ES30vcHJlYnVpbHQvJHtBTkRST0lEX1RSSVBMRVR9LSR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0vcHJlYnVpbHQvJHtIT1NUX0FSQ0h9KQorc2V0KENNQUtFX0NfQ09NUElMRVIgJHtfQ09NUElMRVJfUk9PVH0vYmluLyR7QU5EUk9JRF9UUklQTEVUfS1nY2MpCitzZXQoQ01BS0VfQ1hDWF9DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWcrKykKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICAke0FORFJPSURfU1RMfS9pbmNsdWRlCisgICAgJHtBTkRST0lEX1NUTH0vbGlicy8ke0FORFJPSURfQ1BVfS9pbmNsdWRlKQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEggJHtBTkRST0lEX1NZU1JPT1R9KQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvY29uZmlnLmguaW4gYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBhZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY29uZmlnLmggZ2VuZXJhdGVkIGJ5IENNYWtlIGZyb20gY29uZmlnLmguaW4gKi8KKworI2lmbmRlZiBDT05GSUdfSAorI2RlZmluZSBDT05GSUdfSAorCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0UgIiR7UEFDS0FHRX0iCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIke1BBQ0tBR0VfQlVHUkVQT1JUfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX05BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIke1BBQ0tBR0VfVEFSTkFNRX0iCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9VUkwgIiR7UEFDS0FHRV9VUkx9IgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiR7UEFDS0FHRV9WRVJTSU9OfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX1NUUklOR30iCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBERUZJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSBpZiB0aGUgQUlfQUREUkNPTkZJRyBzeW1ib2wgaXMgdW5hdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBBSV9BRERSQ09ORklHIDAKKworLyogUG9zc2libGUgdmFsdWUgZm9yIFNJR05FRF9SSUdIVF9TSElGVF9JUyAqLworLyogVE9ETzogVGhpcyBpcyBqdXN0IHNldCB0byAxIGZvciB0aGUgbW9tZW50CisgICBwb3J0IHRoZSBtYWNybyBhY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNCB0byBDTWFrZSB0byBtYWtlIHRoaXMgd29yayAqLworI2RlZmluZSBBUklUSE1FVElDX1JJR0hUX1NISUZUIDEKKworLyogSW5kaWNhdGVzIHRoZSBlZmZlY3Qgb2YgdGhlIHJpZ2h0IHNoaWZ0IG9wZXJhdG9yIG9uIG5lZ2F0aXZlIHNpZ25lZAorICAgaW50ZWdlcnMgKi8KKy8qIFRPRE86IFRoaXMgaXMganVzdCBzZXQgdG8gMSBmb3IgdGhlIG1vbWVudCAqLworI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQorCisvKiBVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlICovCisvKiBUT0RPOiBUaGlzIG1pZ2h0IG5vdyBiZSBuZWNlc3NhcnkgYW55bW9yZSBhcyBpdCBpcyBzZXQgb25seSBmb3IgYXV0b21ha2UgPCAxLjExCisgICBzZWU6IGFjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCAqLworI2NtYWtlZGVmaW5lIEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04gMQorCisvKiByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IHN0ZDo6dGhyZWFkICovCisjY21ha2VkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI2NtYWtlZGVmaW5lIFNUUkVSUk9SX1JfQ0hBUl9QIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSEVBREVSIEZJTEVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkNOVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FVERCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NJR05BTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TRUxFQ1RfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzY2hlZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0aG9zdGJ5bmFtZV9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNjaGVkX2dldF9wcmlvcml0eV9taW4nIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTiAxCisKKworLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KKyNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRjMGViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNCBAQAorIyBDTWFrZSBtaW5ndzMyIGNyb3NzIGNvbXBpbGUgdG9vbGNoYWluIGZpbGUKKworIyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0KK1NFVChDTUFLRV9TWVNURU1fTkFNRSBXaW5kb3dzKQorCisjIHdoaWNoIGNvbXBpbGVycyB0byB1c2UgZm9yIEMgYW5kIEMrKworU0VUKENNQUtFX0NfQ09NUElMRVIgaTU4Ni1taW5ndzMybXN2Yy1nY2MpCitTRVQoQ01BS0VfQ1hYX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZysrKQorU0VUKENNQUtFX1JDX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtd2luZHJlcykKKworIyBoZXJlIGlzIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgbG9jYXRlZAorU0VUKENNQUtFX0ZJTkRfUk9PVF9QQVRIIC91c3IvaTU4Ni1taW5ndzMybXN2YykKKworIyBhZGp1c3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBGSU5EX1hYWCgpIGNvbW1hbmRzOgorIyBzZWFyY2ggaGVhZGVycyBhbmQgbGlicmFyaWVzIGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQsIHNlYXJjaAorIyBwcm9ncmFtcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudAorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKKworc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9GRikKK1NFVChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICItc3RhdGljIikKK3NldChDTUFLRV9DX0ZMQUdTICR7Q01BS0VfQ19GTEFHU30gIi1zdGF0aWMtbGliZ2NjIikKK3NldChDTUFLRV9DWFhfRkxBR1MgJHtDTUFLRV9DWFhfRkxBR1N9ICItc3RhdGljLWxpYnN0ZGMrKyIpCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvUkVBRE1FLm1kIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZkNjkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApAQCAtMCwwICsxLDE5OCBAQAorIyBEb2NrZXIgSW50ZWdyYXRpb24gIworCitEdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IEFwYWNoZSBUaHJpZnQsCitkb2NrZXIgY29udGFpbmVycyBhcmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCB0aGUgcHJvamVjdCBvbiBhCit2YXJpZXR5IG9mIHBsYXRmb3JtcyB0byBwcm92aWRlIG1heGltdW0gdGVzdCBjb3ZlcmFnZS4KKworIyMgQXBwdmV5b3IgSW50ZWdyYXRpb24gIyMKKworQXQgdGhpcyB0aW1lIHRoZSBBcHB2ZXlvciBzY3JpcHRzIGRvIG5vdCB1c2UgZG9ja2VyIGNvbnRhaW5lcnMuCitPbmNlIE1pY3Jvc29mdCBzdXBwb3J0cyBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIHJ1bm5pbmcgaW5zaWRlCituYW5vIGNvbnRhaW5lcnMgKGluc3RlYWQgb2YgQ29yZSwgd2hpY2ggaXMgaHVnZSkgdGhlbiB3ZSB3aWxsCitjb25zaWRlciB1c2luZyBjb250YWluZXJzIGZvciB0aGUgV2luZG93cyBidWlsZHMgYXMgd2VsbC4KKworIyMgVHJhdmlzIENJIEludGVncmF0aW9uICMjCisKK1RoZSBUcmF2aXMgQ0kgc2NyaXB0cyB1c2UgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCitsb2dpYyB0byBkZXRlcm1pbmUgdGhlaXIgYmVoYXZpb3I6CisKKyMjIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgIyMjCisKK3wgVmFyaWFibGUgfCBEZWZhdWx0IHwgVXNhZ2UgfAorfCAtLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLSB8Cit8IGBESVNUUk9gIHwgYHVidW50dS1iaW9uaWNgIHwgU2V0IGJ5IHZhcmlvdXMgYnVpbGQgam9icyBpbiBgLnRyYXZpcy55bWxgIHRvIHJ1biBidWlsZHMgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMuICBOb3QgaW50ZW5kZWQgdG8gYmUgc2V0IGV4dGVybmFsbHkufAorfCBgRE9DS0VSX1JFUE9gIHwgYHRocmlmdC90aHJpZnQtYnVpbGRgIHwgVGhlIG5hbWUgb2YgdGhlIERvY2tlciBIdWIgcmVwb3NpdG9yeSB0byBvYnRhaW4gYW5kIHN0b3JlIGRvY2tlciBpbWFnZXMuIHwKK3wgYERPQ0tFUl9VU0VSYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBuYW1lIGNvbnRhaW5pbmcgdGhlIHJlcG9zaXRvcnkuIHwKK3wgYERPQ0tFUl9QQVNTYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBwYXNzd29yZCB0byB1c2Ugd2hlbiBwdXNoaW5nIG5ldyB0YWdzLiB8CisKK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBkb2NrZXIgaW1hZ2UgdGhhdCBpcyB1c2VkIGluIGJ1aWxkcyBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3b3VsZCBiZTogYHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pY2AKKworIyMjIEZvcmtzICMjIworCitJZiB5b3UgaGF2ZSBmb3JrZWQgdGhlIEFwYWNoZSBUaHJpZnQgcmVwb3NpdG9yeSBhbmQgeW91IHdvdWxkIGxpa2UKK3RvIHVzZSB5b3VyIG93biBEb2NrZXIgSHViIGFjY291bnQgdG8gc3RvcmUgdGhyaWZ0IGJ1aWxkIGltYWdlcywKK3lvdSBjYW4gdXNlIHRoZSBUcmF2aXMgQ0kgd2ViIGludGVyZmFjZSB0byBzZXQgdGhlIGBET0NLRVJfVVNFUmAsCitgRE9DS0VSX1BBU1NgLCBhbmQgYERPQ0tFUl9SRVBPYCB2YXJpYWJsZXMgaW4gYSBzZWN1cmUgbWFubmVyLgorWW91ciBmb3JrIGJ1aWxkcyB3aWxsIHRoZW4gcHVsbCwgcHVzaCwgYW5kIHRhZyB0aGUgZG9ja2VyIGltYWdlcworaW4geW91ciBhY2NvdW50LgorCisjIyMgTG9naWMgIyMjCisKK1RoZSBUcmF2aXMgQ0kgYnVpbGQgcnVucyBpbiB0d28gcGhhc2VzIC0gZmlyc3QgdGhlIGRvY2tlciBpbWFnZXMgYXJlIHJlYnVpbHQKK2ZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgY29udGFpbmVycyBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgRG9ja2VyZmlsZSB0aGF0Cit3YXMgdXNlZCB0byBidWlsZCB0aGUgbW9zdCByZWNlbnQgdGFnLiAgSWYgYSBgRE9DS0VSX1BBU1NgIGVudmlyb25tZW50Cit2YXJpYWJsZSBpcyBzcGVjaWZpZWQsIHRoZSBkb2NrZXIgc3RhZ2UgYnVpbGRzIHdpbGwgYXR0ZW1wdCB0byBsb2cgaW50bworRG9ja2VyIEh1YiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHRhZ3MuCisKKyMjIFN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZSBUcmF2aXMgQ0kgKGNvbnRpbnVvdXMgaW50ZWdyYXRpb24pIGJ1aWxkcyB1c2UgdGhlIFVidW50dSBCaW9uaWMKKygxOC4wNCBMVFMpIGFuZCBYZW5pYWwgKDE2LjA0IExUUykgaW1hZ2VzIHRvIG1heGltaXplIGxhbmd1YWdlIGxldmVsCitjb3ZlcmFnZS4KKworIyMjIFVidW50dSAjIyMKKworKiBiaW9uaWMgKHN0YWJsZSwgY3VycmVudCkKKyogYXJ0ZnVsIChwcmV2aW91cyBzdGFibGUpCisqIHhlbmlhbCAobGVnYWN5KQorCisjIyBVbnN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZXNlIGNvbnRhaW5lcnMgbWF5IGJlIGluIHZhcmlvdXMgc3RhdGVzLCBhbmQgbWF5IG5vdCBidWlsZCBldmVyeXRoaW5nLgorVGhleSBjYW4gYmUgZm91bmQgaW4gdGhlIGBvbGQvYCBzdWJkaXJlY3RvcnkuCisKKyMjIyBDZW50T1MgIyMjCisqIDcuMworICAqIG1ha2UgY2hlY2sgaW4gbGliL3B5IG1heSBoYW5nIGluIHRlc3Rfc3Nsc29ja2V0IC0gcm9vdCBjYXVzZSB1bmtub3duCisKKyMjIyBEZWJpYW4gIyMjCisKKyogamVzc2llCisqIHN0cmV0Y2gKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9jcHAgZmFpbHMgZHVlIHRvIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CisKKyMjIEJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMsIGxvY2FsbHkgIyMKKworV2UgcmVjb21tZW5kIHlvdSBidWlsZCBsb2NhbGx5IHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgZG9lcywgc28gdGhhdCB3aGVuIHlvdQorc3VibWl0IHlvdXIgcHVsbCByZXF1ZXN0IHlvdSB3aWxsIHJ1biBpbnRvIGZld2VyIHN1cnByaXNlcy4gIFRvIG1ha2UgaXQgYQorbGl0dGxlIGVhc2llciwgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB5b3VyIGB+Ly5iYXNoX2FsaWFzZXNgIGZpbGU6CisKKyAgICAjIEtpbGwgYWxsIHJ1bm5pbmcgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJraWxsYWxsPSdkb2NrZXIga2lsbCAkKGRvY2tlciBwcyAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuYz0ncHJpbnRmICJcbj4+PiBEZWxldGluZyBzdG9wcGVkIGNvbnRhaW5lcnNcblxuIiAmJiBkb2NrZXIgcm0gJChkb2NrZXIgcHMgLWEgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmk9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgdW50YWdnZWQgaW1hZ2VzXG5cbiIgJiYgZG9ja2VyIHJtaSAkKGRvY2tlciBpbWFnZXMgLXEgLWYgZGFuZ2xpbmc9dHJ1ZSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzIGFuZCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW49J2RvY2tlcmNsZWFuYyB8fCB0cnVlICYmIGRvY2tlcmNsZWFuaScKKworICAgICMgQnVpbGQgYSB0aHJpZnQgZG9ja2VyIGltYWdlIChydW4gZnJvbSB0b3AgbGV2ZWwgb2YgZ2l0IHJlcG8pOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJidWlsZAorICAgIHsKKyAgICAgIGRvY2tlciBidWlsZCAtdCAkMSBidWlsZC9kb2NrZXIvJDEKKyAgICB9CisKKyAgICAjIFJ1biBhIHRocmlmdCBkb2NrZXIgaW1hZ2U6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcnJ1bgorICAgIHsKKyAgICAgIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCAkMSAvYmluL2Jhc2gKKyAgICB9CisKK1RoZW4sIHRvIHB1bGwgZG93biB0aGUgY3VycmVudCBpbWFnZSBiZWluZyB1c2VkIHRvIGJ1aWxkICh0aGUgc2FtZSB3YXkKK1RyYXZpcyBDSSBkb2VzIGl0KSAtIGlmIGl0IGlzIG91dCBvZiBkYXRlIGluIGFueSB3YXkgaXQgd2lsbCBidWlsZCBhCituZXcgb25lIGZvciB5b3U6CisKKyAgICB0aHJpZnQkIERPQ0tFUl9SRVBPPXRocmlmdC90aHJpZnQtYnVpbGQgRElTVFJPPXVidW50dS1iaW9uaWMgYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKKworVG8gcnVuIGFsbCB1bml0IHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKworVG8gcnVuIHRoZSBjcm9zcyB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaAorCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IHdhbnQgdG8gY2xlYW4gdXAgb2NjYXNpb25hbGx5IHNvIHRoYXQgZG9ja2VyIGlzbid0IHVzaW5nIGxvdHMgb2YgZXh0cmEgZGlzayBzcGFjZToKKworICAgIHRocmlmdCQgZG9ja2VyY2xlYW4KKworWW91IG5lZWQgdG8gcnVuIHRoZSBkb2NrZXIgY29tbWFuZHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbG9jYWwgY2xvbmUgb2YgdGhlCit0aHJpZnQgZ2l0IHJlcG9zaXRvcnkgZm9yIHRoZW0gdG8gd29yay4KKworV2hlbiB5b3UgYXJlIGRvbmUgaW4gdGhlIHJvb3QgZG9ja2VyIHNoZWxsIHlvdSBjYW4gYGV4aXRgIHRvIGdvIGJhY2sgdG8KK3lvdXIgdXNlciBob3N0IHNoZWxsLiAgT25jZSB0aGUgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgdGVzdCBwYXNzZXMgbG9jYWxseSwKK3N1Ym1pdCB0aGUgY2hhbmdlcywgYW5kIGlmIGRlc2lyZWQgc3F1YXNoIHRoZSBwdWxsIHJlcXVlc3QgdG8gb25lIGNvbW1pdAordG8gbWFrZSBpdCBlYXNpZXIgdG8gbWVyZ2UgKHRoZSBjb21taXR0ZXJzIGNhbiBzcXVhc2ggYXQgY29tbWl0IHRpbWUgbm93Cit0aGF0IEdpdEh1YiBpcyB0aGUgbWFzdGVyIHJlcG9zaXRvcnkpLiAgTm93IHlvdSBhcmUgYnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcyEKKworIyMgUmF3IENvbW1hbmRzIGZvciBCdWlsZGluZyB3aXRoIERvY2tlciAjIworCitJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBzYW1lIHNjcmlwdHMgVHJhdmlzIENJIGRvZXMsIHlvdSBjYW4gZG8gaXQgbWFudWFsbHk6CisKK0J1aWxkIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYworCitPcGVuIGEgY29tbWFuZCBwcm9tcHQgaW4gdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgdGhyaWZ0IC9iaW4vYmFzaAorCisjIyBDb3JlIFRvb2wgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworTGFzdCB1cGRhdGVkOiBPY3RvYmVyIDEsIDIwMTcKKworfCBUb29sICAgICAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFudCAgICAgICB8IDEuOS42ICAgICAgICAgfCAxLjEwLjMgICAgICAgIHwgICAgICAgfAorfCBhdXRvY29uZiAgfCAyLjY5ICAgICAgICAgIHwgMi42OSAgICAgICAgICB8ICAgICAgIHwKK3wgYXV0b21ha2UgIHwgMS4xNSAgICAgICAgICB8IDEuMTUuMSAgICAgICAgfCAgICAgICB8Cit8IGJpc29uICAgICB8IDMuMC40ICAgICAgICAgfCAzLjAuNCAgICAgICAgIHwgICAgICAgfAorfCBib29zdCAgICAgfCAxLjU4LjAgICAgICAgIHwgMS42NS4xICAgICAgICB8ICAgICAgIHwKK3wgY21ha2UgICAgIHwgMy41LjEgICAgICAgICB8IDMuMTAuMiAgICAgICAgfCAgICAgICB8Cit8IGNwcGNoZWNrICB8IDEuNzIgICAgICAgICAgfCAxLjgyICAgICAgICAgIHwgICAgICAgfAorfCBmbGV4ICAgICAgfCAyLjYuMCAgICAgICAgIHwgMi42LjQgICAgICAgICB8ICAgICAgIHwKK3wgbGliYzYgICAgIHwgMi4yMyAgICAgICAgICB8IDIuMjcgICAgICAgICAgfCBnbGliYyB8Cit8IGxpYmV2ZW50ICB8IDIuMC4yMSAgICAgICAgfCAyLjEuOCAgICAgICAgIHwgICAgICAgfAorfCBsaWJzdGRjKysgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgbWFrZSAgICAgIHwgNC4xICAgICAgICAgICB8IDQuMSAgICAgICAgICAgfCAgICAgICB8Cit8IG9wZW5zc2wgICB8IDEuMC4yZyAgICAgICAgfCAxLjEuMGcgICAgICAgIHwgICAgICAgfAorfCBxdDUgICAgICAgfCA1LjUuMSAgICAgICAgIHwgNS45LjUgICAgICAgICB8ICAgICAgIHwKKworIyMgQ29tcGlsZXIvTGFuZ3VhZ2UgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworfCBMYW5ndWFnZSAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFzIG9mICAgICB8IE1hciAwNiwgMjAxOCAgfCBKYW4gNCwgMjAxOSAgIHwgICAgICAgfAorfCBhczMgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IEMrKyBnY2MgICB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBDKysgY2xhbmcgfCAzLjggICAgICAgICAgIHwgNi4wICAgICAgICAgICB8ICAgICAgIHwKK3wgQyMgKG1vbm8pIHwgNC4yLjEuMCAgICAgICB8IDQuNi4yLjcgICAgICAgfCAgICAgICB8Cit8IGNfZ2xpYiAgICB8IDIuNDguMiAgICAgICAgfCAyLjU2LjAgICAgICAgIHwgICAgICAgfAorfCBjbCAoc2JjbCkgfCAgICAgICAgICAgICAgIHwgMS40LjE1ICAgICAgICB8ICAgICAgIHwKK3wgY29jb2EgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkICAgICAgICAgfCAyLjA3NS4xICAgICAgIHwgMi4wODMuMSAgICAgICB8ICAgICAgIHwKK3wgZGFydCAgICAgIHwgMS4yMi4xICAgICAgICB8IDEuMjQuMyAgICAgICAgfCAgICAgICB8Cit8IGRlbHBoaSAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZG90bmV0ICAgIHwgMi4xLjQgICAgICAgICB8IDIuMi4xMDEgICAgICAgfCAgICAgICB8Cit8IGVybGFuZyAgICB8IDE4LjMgICAgICAgICAgfCAyMC4yLjIgICAgICAgIHwgICAgICAgfAorfCBnbyAgICAgICAgfCAxLjcuNiAgICAgICAgIHwgMS4xMS40ICAgICAgICB8ICAgICAgIHwKK3wgaGFza2VsbCAgIHwgNy4xMC4zICAgICAgICB8IDguMC4yICAgICAgICAgfCAgICAgICB8Cit8IGhheGUgICAgICB8IDMuMi4xICAgICAgICAgfCAzLjQuNCAgICAgICAgIHwgVEhSSUZULTQzNTI6IGF2b2lkIDMuNC4yIHwKK3wgamF2YSAgICAgIHwgMS44LjBfMTUxICAgICB8IDEuOC4wXzE5MSAgICAgfCAgICAgICB8Cit8IGpzICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgVW5zdXJlIGhvdyB0byBsb29rIGZvciB2ZXJzaW9uIGluZm8/IHwKK3wgbHVhICAgICAgIHwgNS4yLjQgICAgICAgICB8IDUuMi40ICAgICAgICAgfCBMdWEgNS4zOiBzZWUgVEhSSUZULTQzODYgfAorfCBub2RlanMgICAgfCA2LjEzLjAgICAgICAgIHwgOC4xNS4wICAgICAgICB8ICAgICAgIHwKK3wgb2NhbWwgICAgIHwgICAgICAgICAgICAgICB8IDQuMDUuMCAgICAgICAgfCBUSFJJRlQtNDUxNzogb2NhbWwgNC4wMi4zIG9uIHhlbmlhbCBhcHBlYXJzIGJyb2tlbiB8Cit8IHBlcmwgICAgICB8IDUuMjIuMSAgICAgICAgfCA1LjI2LjEgICAgICAgIHwgICAgICAgfAorfCBwaHAgICAgICAgfCA3LjAuMjIgICAgICAgIHwgNy4yLjEwICAgICAgICB8ICAgICAgIHwKK3wgcHl0aG9uICAgIHwgMi43LjEyICAgICAgICB8IDIuNy4xNXJjMSAgICAgfCAgICAgICB8Cit8IHB5dGhvbjMgICB8IDMuNS4yICAgICAgICAgfCAzLjYuNyAgICAgICAgIHwgICAgICAgfAorfCBydWJ5ICAgICAgfCAyLjMuMXAxMTIgICAgIHwgMi41LjFwNTcgICAgICB8ICAgICAgIHwKK3wgcnVzdCAgICAgIHwgMS4xNy4wICAgICAgICB8IDEuMzAuMCAgICAgICAgfCAgICAgICB8Cit8IHNtYWxsdGFsayB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgc3dpZnQgICAgIHwgICAgICAgICAgICAgICB8IDQuMi4xICAgICAgICAgfCAgICAgICB8CmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFjNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDU5IEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEJhc2Ugc3lzdGVtIGJvb3RzdHJhcCBzY3JpcHQKKyRib290c3RyYXBfc2NyaXB0ID0gPDxfX0JPT1RTVFJBUF9fCitlY2hvICJQcm92aXNpb25pbmcgZGVmYXVsdHMiCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgLXkKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIC15CisKKyMgSW5zdGFsbCBkZWZhdWx0IHBhY2thZ2VzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBidWlsZC1lc3NlbnRpYWwgY3VybCBnaXQKKworIyBJbnN0YWxsIGxhdGVzdCBEb2NrZXIgdmVyc2lvbgorc3VkbyBjdXJsIC1zU0wgaHR0cHM6Ly9nZXQuZG9ja2VyLmlvL2dwZyB8IHN1ZG8gYXB0LWtleSBhZGQgLQorc3VkbyBlY2hvICJkZWIgaHR0cDovL2dldC5kb2NrZXIuaW8vdWJ1bnR1IGRvY2tlciBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvY2tlci5saXN0CitzdWRvIGFwdC1nZXQgdXBkYXRlIC15CitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBsaW51eC1pbWFnZS1leHRyYS1gdW5hbWUgLXJgIGF1ZnMtdG9vbHMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGx4Yy1kb2NrZXIKKworZWNobyAiRmluaXNoZWQgcHJvdmlzaW9uaW5nIGRlZmF1bHRzIgorX19CT09UU1RSQVBfXworCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgIGNvbmZpZy52bS5ib3ggPSAidHJ1c3R5NjQiCisgIGNvbmZpZy52bS5ib3hfdXJsID0gImh0dHBzOi8vY2xvdWQtaW1hZ2VzLnVidW50dS5jb20vdmFncmFudC90cnVzdHkvY3VycmVudC90cnVzdHktc2VydmVyLWNsb3VkaW1nLWFtZDY0LXZhZ3JhbnQtZGlzazEuYm94IgorICBjb25maWcuc3NoLmZvcndhcmRfYWdlbnQgPSB0cnVlCisKKyAgY29uZmlnLnZtLnByb3ZpZGVyIDp2aXJ0dWFsYm94IGRvIHx2Ym94fAorICAgIHZib3guY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLW1lbW9yeSIsICIxMDI0Il0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1jcHVzIiwgIjIiXQorICBlbmQKKworICAjIFNldHVwIHRoZSBkZWZhdWx0IGJvb3RzdHJhcCBzY3JpcHQgZm9yIG91ciB1YnVudHUgYmFzZSBib3ggaW1hZ2UKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiAic2hlbGwiLCBpbmxpbmU6ICRib290c3RyYXBfc2NyaXB0CisKKyAgIyBTZXR1cCB0aGUgY3VzdG9tIGRvY2tlciBpbWFnZSBmcm9tIG91ciBVYnVudHUgRG9ja2VyZmlsZQorICBjb25maWcudm0ucHJvdmlzaW9uICJkb2NrZXIiIGRvIHxkfAorICAgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L3VidW50dSIsIGFyZ3M6ICItdCB0aHJpZnQiCisgIGVuZAorCisgICMgU2V0dXAgdGhlIGN1c3RvbSBkb2NrZXIgaW1hZ2UgZnJvbSBvdXIgQ2VudG9zIERvY2tlcmZpbGUKKyAgI2NvbmZpZy52bS5wcm92aXNpb24gImRvY2tlciIgZG8gfGR8CisgICMgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L2NlbnRvcyIsIGFyZ3M6ICItdCB0aHJpZnQtY2VudG9zIgorICAjZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZiYmFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwxOTkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudE9TCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0ICh3aWxsIHVwZGF0ZSB0byAyLjAuMCBzZXBhcmF0ZWx5KQorIyAgLSBoYXhlIChub3QgaW4gY2VudG9zKQorCitGUk9NIGNlbnRvczo3LjMuMTYxMQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK1JVTiB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UKKworIyBHZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGF1dG9jb25mIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJpc29uLWRldmVsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNsYW5nLWFuYWx5emVyIFwKKyAgICAgIGNtYWtlMyBcCisgICAgICBjdXJsIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2NjIFwKKyAgICAgIGdjYy1jKysgXAorICAgICAgZ2RiIFwKKyAgICAgIGdpdCBcCisgICAgICBsaWJ0b29sIFwKKyAgICAgIG00IFwKKyAgICAgIG1ha2UgXAorICAgICAgdGFyIFwKKyAgICAgIHVuemlwIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHdnZXQgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY21ha2UzIC91c3IvYmluL2NtYWtlICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NwYWNrMyAvdXNyL2Jpbi9jcGFjayAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jdGVzdDMgL3Vzci9iaW4vY3Rlc3QKKworIyBDKysgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYm9vc3QtZGV2ZWwtc3RhdGljIFwKKyAgICAgIHpsaWItZGV2ZWwgXAorICAgICAgb3BlbnNzbC1kZXZlbCBcCisgICAgICBsaWJldmVudC1kZXZlbCAmJiBcCisgICAgY2QgL3Vzci9saWI2NCAmJiBcCisgICAgbG4gLXMgbGliYm9vc3RfdGhyZWFkLW10LmEgbGliYm9vc3RfdGhyZWFkLmEKKworIyBDIyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtb25vLWNvcmUgXAorICAgICAgbW9uby1kZXZlbCBcCisgICAgICBtb25vLXdlYi1kZXZlbCBcCisgICAgICBtb25vLWV4dHJhcworCisjIEQgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDc2LjAvZG1kLTIuMDc2LjAtMC5mZWRvcmEueDg2XzY0LnJwbSB4ZGctdXRpbHMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIKKworIyBEYXJ0CitSVU4gY2QgL3Vzci9sb2NhbCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZGFydC1hcmNoaXZlL2NoYW5uZWxzL3N0YWJsZS9yZWxlYXNlLzEuMjQuMi9zZGsvZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHVuemlwIC1xIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICBybSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcAorRU5WIFBBVEggL3Vzci9sb2NhbC9kYXJ0LXNkay9iaW46JFBBVEgKKworIyBFcmxhbmcgRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9ycG0vY2VudG9zL2VybGFuZ19zb2x1dGlvbnMucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2VybGFuZ19zb2x1dGlvbnMucmVwbyAmJiBcCisgICAgeXVtIGluc3RhbGwgLXkgXAorICAgICAgZXJsYW5nLWtlcm5lbCBcCisgICAgICBlcmxhbmctZXJ0cyBcCisgICAgICBlcmxhbmctc3RkbGliIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctcmViYXIgXAorICAgICAgZXJsYW5nLXRvb2xzCisKKyMgR0xpYkMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKKworIyBHbyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuOS5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhhc2tlbGwgRGVwZW5kZW5jaWVzCitSVU4geXVtIC15IGluc3RhbGwgaGFza2VsbC1wbGF0Zm9ybQorCisjIEhheGUgRGVwZW5kZW5jaWVzCisjIE5vdCBpbiBkZWJpYW4vc3RyZXRjaAorCisjIEphdmEgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYW50IFwKKyAgICAgIGp1bml0IFwKKyAgICAgIGFudC1qdW5pdCBcCisgICAgICBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBMdWEgRGVwZW5kZW5jaWVzCisjIEx1YSBpbiBlcGVsIGlzIHRvbyBvbGQgKDUuMS40LCBuZWVkIDUuMikgc28gd2UgZ2V0IHRoZSBsYXRlc3QKK1JVTiB5dW0gaW5zdGFsbCAteSByZWFkbGluZS1kZXZlbCAmJiBcCisgICAgd2dldCAtcSBodHRwOi8vd3d3Lmx1YS5vcmcvZnRwL2x1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgY2QgbHVhLTUuMy40ICYmIFwKKyAgICBzZWQgLWkgJ3MvQ0ZMQUdTPSAvQ0ZMQUdTPSAtZlBJQyAvZycgc3JjL01ha2VmaWxlICYmIFwKKyAgICBtYWtlIGxpbnV4ICYmIFwKKyAgICBtYWtlIGluc3RhbGwgJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgbHVhLTUqCisKKyMgTWluR1cgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbWluZ3czMi1iaW51dGlscyBcCisgICAgICBtaW5ndzMyLWNydCBcCisgICAgICBtaW5ndzMyLW5zaXMKKworIyBOb2RlLmpzIERlcGVuZGVuY2llcworIyBXb3JrIGFyb3VuZCBlcGVsIGlzc3VlIHdoZXJlIHRoZXkgcmVtb3ZlZCBodHRwLXBhcnNlciB0aGF0IG5vZGVqcyBkZXBlbmRzIG9uIQorUlVOIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vb3BlbnNvdXJjZS5lbmRhLmV1L3BhY2thZ2VzL2h0dHAtcGFyc2VyLTIuNy4xLTMuZWw3Lng4Nl82NC5ycG0KK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBub2RlanMgXAorICAgICAgbnBtCisKKyMgT2NhbWwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgb2NhbWwgXAorICAgICAgb2NhbWwtb2NhbWxkb2MgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9vcGFtX2luc3RhbGxlci5zaCAtTyAtIHwgc2ggLXMgL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzICYmIFwKKyAgICBlY2hvICcuIC9yb290Ly5vcGFtL29wYW0taW5pdC9pbml0LnNoID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJyA+PiB+Ly5iYXNocmMKKworIyBQZXJsIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBlcmwgXAorICAgICAgcGVybC12ZXJzaW9uIFwKKyAgICAgIHBlcmwtQml0LVZlY3RvciBcCisgICAgICBwZXJsLUNsYXNzLUFjY2Vzc29yIFwKKyAgICAgIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyIFwKKyAgICAgIHBlcmwtVGVzdC1TaW1wbGUgXAorICAgICAgcGVybC1JTy1Tb2NrZXQtU1NMIFwKKyAgICAgIHBlcmwtTmV0LVNTTGVheSBcCisgICAgICBwZXJsLUNyeXB0LVNTTGVheQorCisjIFBIUCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWRldmVsIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwLXBocHVuaXQtUEhQVW5pdCBcCisgICAgICBiemlwMgorCisjIFB5dGhvbiBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBweXRob24gXAorICAgICAgcHl0aG9uLWRldmVsIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMzQgXAorICAgICAgcHl0aG9uMzQtZGV2ZWwgXAorICAgICAgcHl0aG9uMzQtcGlwIFwKKyAgICAgIHB5dGhvbjM0LXNldHVwdG9vbHMKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorCisjIFJ1YnkgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldmVsIFwKKyAgICAgIHJ1YnlnZW1zICYmIFwKKyAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBSdXN0CitSVU4gY3VybCBodHRwczovL3NoLnJ1c3R1cC5ycyAtc1NmIHwgc2ggLXMgLS0gLXkgLS1kZWZhdWx0LXRvb2xjaGFpbiAxLjE3LjAKK0VOViBQQVRIIC9yb290Ly5jYXJnby9iaW46JFBBVEgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHl1bSBjbGVhbiBhbGwKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzc0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIwNCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4KKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXRjb3JlCisjICAtIHJ1c3QKKworRlJPTSBidWlsZHBhY2stZGVwczpqZXNzaWUtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIEFkZCBhcHQgc291cmNlcworIyBqZXNzaWUtYmFja3BvcnRzIGZvciBjbWFrZSBhbmQgc29tZSBydWJ5IGJpdHMKK1JVTiBlY2hvICJkZWIgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbiBqZXNzaWUtYmFja3BvcnRzIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvamVzc2llLWJhY2twb3J0cy5saXN0CisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0ICYmIFwKKyAgICBzZWQgLWkgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAtZSAncy9odHRwczovaHR0cDovZycKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIHBrZy1jb25maWcgJiYgXAorICAgIGFwdC1nZXQgLXQgamVzc2llLWJhY2twb3J0cyBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGNtYWtlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1waXAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgcnVieS1idW5kbGVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0IFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5vZGVqcy1kZXYgXAorICAgICAgbm9kZWpzLWxlZ2FjeSBcCisgICAgICBucG0KKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDU2hhcnAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgeGRnLXV0aWxzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0IFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2IFwKK2AjIE1pbkdXIGRlcGVuZGVuY2llc2AgXAorICAgICAgbWluZ3czMiBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKK2AjICAgICAgbWluZ3czMi1ydW50aW1lYCBcCisgICAgICBuc2lzIFwKK2AjIENsZWFuIHVwYCBcCisgICAgJiYgcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworIyBSdWJ5CitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCisjIFB5dGhvbiBvcHRpb25hbCBkZXBlbmRlbmNpZXMKK1JVTiBwaXAyIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworUlVOIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKworIyBHbworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjMubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXhlCitSVU4gbWtkaXIgLXAgL3Vzci9saWIvaGF4ZSAmJiBcCisgICAgd2dldCAtTyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL3JlbGVhc2VzL2Rvd25sb2FkLzMuMi4xL2hheGUtMy4yLjEtbGludXg2NC50YXIuZ3ogfCBcCisgICAgdGFyIC1DIC91c3IvbGliL2hheGUgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6ICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAorICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCisgICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKworIyBECitSVU4gY3VybCAtc1NMIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3MC4wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViIC1vIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGRwa2cgLWkgL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyICYmIFwKKyAgICBlY2hvICdnY2MgLVdsLC0tbm8tYXMtbmVlZGVkICQqJyA+IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGNobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBlY2hvICdDQz0vdXNyL2xvY2FsL2Jpbi9nY2MtZG1kJyA+PiAvZXRjL2RtZC5jb25mCisKKyMgRGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBPQ2FtbAorUlVOIGVjaG8gJ2RlYiBodHRwOi8vcHBhLmxhdW5jaHBhZC5uZXQvYXZzbS9wcGEvdWJ1bnR1IHRydXN0eSBtYWluJyA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2F2c20tb2ZmaWNpYWwtb2NhbWwubGlzdCAmJiBcCisgICAgZ3BnIC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdiA2MTcwN0IwOSAmJiBcCisgICAgZ3BnIC0tZXhwb3J0IC0tYXJtb3IgNjE3MDdCMDkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IG9jYW1sIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAmJiBcCisgICAgb3BhbSBpbnN0YWxsIG9hc2lzCisKKyMgRm9yY2UgdXRmOCBsb2NhbGUgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIEhhc2tlbGwgdGYtcmFuZG9tCitFTlYgTENfQUxMIEMuVVRGLTgKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIzMSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4gU3RyZXRjaAorIworIyBLbm93biBpc3N1ZXM6CisjIC0gZDogZGVpbW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyAtIGRvdG5ldGNvcmUsIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gcnVzdDogY2FyZ28gbm90IGluIGRlYmlhbiByZXBvIC0gcGVyaGFwcyBub3QgbmVlZGVkPworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnN0cmV0Y2gtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdCBhcHQtdHJhbnNwb3J0LWh0dHBzIGN1cmwgd2dldCBhcHQtdXRpbHMKKworIyBECitSVU4gd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCBpbnN0YWxsIC0tcmVpbnN0YWxsIGQtYXB0LWtleXJpbmcKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCisjIGRvdG5ldCAoY29yZSkgMi4wLjAgLSBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHlldDoKKyMgUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorIyAgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMgKHRoaXMgc3RlcCBydW5zIGFwdC1nZXQgdXBkYXRlIGludGVybmFsbHkpCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vc2V0dXBfOC54IHwgYmFzaAorCisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorCisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworIyBsaWJldmVudCBkZWltb3MgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyMgICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCisjIG9wZW5zc2wgZGVpbW9zIGRvZXNuJ3Qgd29yayB3aXRoIG9wZW5zc2wtMS4xLjAgLSBkaXNhYmxpbmcgaXQgZm9yIG5vdzoKKyMgUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHF1aXRlIHlldDoKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBkb3RuZXQtc2RrLTIuMC4wCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGdvbGFuZyAoZ28pIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ29sYW5nLWdvCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldgorUlVOIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgc2FtZSBmb3IgZGViaWFuIHN0cmV0Y2gKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydXN0YworCisjIFVwZGF0ZSBhbnl0aGluZyBlbHNlIGxlZnQgaGFuZ2luZworUlVOIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjQ0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBUcnVzdHkKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBUcnVzdHkgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDcwLjAKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMS4yMC4xCisjIC0gZG90bmV0Y29yZSwgZGlzYWJsZWQgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBoYXhlLCBkaXNhYmxlZCBiZWNhdXNlIHRoZSBkaXN0cm8gY29tZXMgd2l0aCAzLjAuMCBhbmQgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyAtIG5vZGUuanMsIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgYXQgMC4xMC4wIGluIHRoZSBkaXN0cm8gd2hpY2ggaXMgdG9vIG9sZCAobmVlZCA0KykKKyMgLSBvY2FtbCwgZGlzYWJsZWQgYmVjYXVzZSBpdCBmYWlscyB0byBpbnN0YWxsIHByb3Blcmx5CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6dHJ1c3R5LXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgICAgICB3Z2V0IC1xTyAtIGh0dHBzOi8vZGxhbmcub3JnL2Qta2V5cmluZy5ncGcgfCBhcHQta2V5IGFkZCAtCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICAgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49Mi4wNzAuMi0wIFwKKyAgICAgIGxpYnBob2JvczItZGV2PTIuMDcwLjItMCBcCisgICAgICBkdWIgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9MS4yMC4xLTEKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNvcmVzIHdoaWxlIGluc3RhbGxpbmcKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGhheGUgXAorIyAgICAgICBuZWtvIFwKKyMgICAgICAgbmVrby1kZXYgJiYgXAorIyAgICAgaGF4ZWxpYiBzZXR1cCAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyMgICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcCAzLjIuMTAyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMSBcCisgICAgICBsdWE1LjEtZGV2CisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyB0b28gb2xkCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBub2RlanMgXAorIyAgICAgICBucG0KKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjICYmIFwKKyAgICAgIHdnZXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvaW5zdGFsbGVyIC1PIC0gLXEgfCBwaHAgLS0gLS1xdWlldCAtLWluc3RhbGwtZGlyPS91c3IvbG9jYWwvYmluLyAtLWZpbGVuYW1lPWNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8gJiYgXAorICAgIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKyMgaW5zdGFsbGluZyB0b3JuYWRvIGJ5IHBpcC9waXAzIGluc3RlYWQgb2YgZGViaWFuIHBhY2thZ2UKKyMgaWYgd2UgaW5zdGFsbCB0aGUgZGViaWFuIHBhY2thZ2UsIHRoZSBidWlsZCBmYWlscyBpbiBweTIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIEluc3RhbGwgQm91bmN5Q2FzdGxlIHByb3ZpZGVyIHRvIGZpeCBKYXZhIGJ1aWxkcyBpc3N1ZXMgd2l0aCBKREsgNworIyBCdWlsZHMgYWNjZXNzaW5nIHJlcG90ZSByZXBvc2l0b3JpZXMgZmFpbCBhcyBzZWVuIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS90cmF2aXMtY2kvdHJhdmlzLWNpL2lzc3Vlcy84NTAzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEJvdW5jeUNhc3RsZSBKQ0UgUHJvdmlkZXIgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiY3Byb3YtamF2YSAmJiBcCisgICAgbG4gLXMgL3Vzci9zaGFyZS9qYXZhL2JjcHJvdi5qYXIgL3Vzci9saWIvanZtL2phdmEtNy1vcGVuamRrLWFtZDY0L2pyZS9saWIvZXh0L2JjcHJvdi5qYXIgJiYgXAorICAgIGF3ayAtRiAuIC12IE9GUz0uICdCRUdJTntuPTJ9L15zZWN1cml0eVwucHJvdmlkZXIvIHtzcGxpdCgkMywgcG9zQW5kRXF1YWxzLCAiPSIpOyQzPW4rKyI9InBvc0FuZEVxdWFsc1syXTtwcmludDtuZXh0fSAxJyAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkgPiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBlY2hvICJzZWN1cml0eS5wcm92aWRlci4xPW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJvdW5jeUNhc3RsZVByb3ZpZGVyIiA+PiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBtdiAvdG1wL2phdmEuc2VjdXJpdHkgL2V0Yy9qYXZhLTctb3Blbmpkay9zZWN1cml0eS9qYXZhLnNlY3VyaXR5CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDhjYmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgYnVpbGQgaGFzIHR3byBzdGFnZXM6ICJkb2NrZXIiIGFuZCAidGVzdCIKKyMgVGhlICJkb2NrZXIiIHN0YWdlIGlzIG1lYW50IHRvIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZXMKKyMgICBpZiBuZWVkZWQuICBJZiB3ZSBjYW5ub3QgcHVzaCB0aGF0IHJlc3VsdCBob3dldmVyIHRoZW4KKyMgICB0aGVyZSBpcyBubyByZWFzb24gdG8gZG8gYW55dGhpbmcuCisjIFRoZSAidGVzdCIgc3RhZ2UgaXMgYW4gYWN0dWFsIHRlc3Qgam9iLiAgRXZlbiBpZiB0aGUgZG9ja2VyCisjICAgaW1hZ2UgZG9lc24ndCBtYXRjaCB3aGF0J3MgaW4gdGhlIHJlcG8sIHdlIHN0aWxsIGJ1aWxkCisjICAgdGhlIGltYWdlIHNvIHRoZSBidWlsZCBqb2IgY2FuIHJ1biBwcm9wZXJseS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworZnVuY3Rpb24gZG9ja2VyZmlsZV9jaGFuZ2VkIHsKKyAgIyBpbWFnZSBtYXkgbm90IGV4aXN0IHlldCwgc28gd2UgaGF2ZSB0byBsZXQgaXQgZmFpbCBzaWxlbnRseToKKyAgZG9ja2VyIHB1bGwgJERPQ0tFUl9UQUcgfHwgdHJ1ZQorICBkb2NrZXIgcnVuICRET0NLRVJfVEFHIGJhc2ggLWMgJ2NkIC4uICYmIHNoYTUxMnN1bSBEb2NrZXJmaWxlJyA+IC5Eb2NrZXJmaWxlLnNoYTUxMgorICBzaGE1MTJzdW0gLWMgLkRvY2tlcmZpbGUuc2hhNTEyCit9CisKKyMKKyMgSWYgdGhpcyBidWlsZCBoYXMgbm8gRE9DS0VSX1BBU1MgYW5kIGl0IGlzIGluIHRoZSBkb2NrZXIgc3RhZ2UKKyMgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbyBhbnkgcHJvY2Vzc2luZyBiZWNhdXNlIHdlIGNhbm5vdAorIyBwdXNoIHRoZSByZXN1bHQgaWYgdGhlIERvY2tlcmZpbGUgY2hhbmdlZC4gIAorIworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4KKyAgZWNobyBEZXRlY3RlZCBkb2NrZXIgc3RhZ2UgYnVpbGQgYW5kIG5vIGRlZmluZWQgRE9DS0VSX1BBU1MsIHRoaXMgYnVpbGQgam9iIHdpbGwgYmUgc2tpcHBlZC4KKyAgZWNobyBTdWJzZXF1ZW50IGpvYnMgaW4gdGhlIHRlc3Qgc3RhZ2UgbWF5IGVhY2ggcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlLgorICBleGl0IDAKK2ZpCisKKworcHVzaGQgJHtTQ1JJUFRfRElSfS8kRElTVFJPCitpZiBkb2NrZXJmaWxlX2NoYW5nZWQ7IHRoZW4KKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBub3QgY2hhbmdlZC4gIE5vIG5lZWQgdG8gcmVidWlsZC4KKyAgZXhpdCAwCitlbHNlCisgIGVjaG8gRG9ja2VyZmlsZSBoYXMgY2hhbmdlZC4KK2ZpCitwb3BkCisKKyMKKyMgRG9ja2VyZmlsZSBoYXMgY2hhbmdlZCAtIHJlYnVpbGQgaXQgZm9yIHRoZSBjdXJyZW50IGJ1aWxkIGpvYi4KKyMgSWYgaXQgaXMgYSAiZG9ja2VyIiBzdGFnZSBidWlsZCB0aGVuIHdlIHdhbnQgdG8gcHVzaCBpdCBiYWNrCisjIHRvIHRoZSBET0NLRVJfUkVQTy4gIElmIGl0IGlzIGEgInRlc3QiIHN0YWdlIGJ1aWxkIHRoZW4gd2UgZG8KKyMgbm90LiAgSWYgbm9ib2R5IGRlZmluZWQgYSBET0NLRVJfUEFTUyB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLgorIworCitlY2hvIFJlYnVpbGRpbmcgZG9ja2VyIGltYWdlICRESVNUUk8KK2RvY2tlciBidWlsZCAtLXRhZyAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvJERJU1RSTworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgISAteiAiJERPQ0tFUl9VU0VSIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1BBU1MiIF1dOyB0aGVuIAorICBlY2hvIFB1c2hpbmcgZG9ja2VyIGltYWdlICRET0NLRVJfVEFHCisgIGRvY2tlciBsb2dpbiAtdSAkRE9DS0VSX1VTRVIgLXAgJERPQ0tFUl9QQVNTCisgIGRvY2tlciBwdXNoICRET0NLRVJfVEFHCitlbHNlCisgIGVjaG8gTm90IHB1c2hpbmcgZG9ja2VyIGltYWdlOiBlaXRoZXIgbm90IGEgZG9ja2VyIHN0YWdlIGJ1aWxkIGpvYiwgb3Igb25lIG9mIERPQ0tFUl9VU0VSIG9yIERPQ0tFUl9QQVNTIGlzIHVuZGVmaW5lZC4KK2ZpCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9ydW4uc2ggYi9idWlsZC9kb2NrZXIvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZTE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvcnVuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworcHJpbnRlbnYgfCBzb3J0CisKK2RvY2tlciBydW4gLS1uZXQ9aG9zdCAtZSBCVUlMRF9MSUJTPSIkQlVJTERfTElCUyIgJEJVSUxEX0VOViAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgXAorCS1pdCAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvc2NyaXB0cy8kU0NSSVBUICRCVUlMRF9BUkcKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzODhmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGNoZWNrIC1qMwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2MzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKK0NNQUtFX0ZMQUdTPSQqCitNQUtFUFJPRz1tYWtlCisKK2lmIG5pbmphIC0tdmVyc2lvbiAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIE1BS0VQUk9HPW5pbmphCisgIENNQUtFX0ZMQUdTPSItR05pbmphICRDTUFLRV9GTEFHUyIKK2ZpCisKK21rZGlyIC1wIGNtYWtlX2J1aWxkICYmIGNkIGNtYWtlX2J1aWxkCitjbWFrZSAkQ01BS0VfRkxBR1MgLi4KK2ZvciBMSUIgaW4gJEJVSUxEX0xJQlM7IGRvCisgIGlmICEgZ3JlcCAiXkJVSUxEXyR7TElCfTpCT09MPU9OJCIgQ01ha2VDYWNoZS50eHQgOyB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGNvbmZpZ3VyZSAkTElCIgorICAgIGV4aXQgMQorICBmaQorZG9uZQorJE1BS0VQUk9HIC1qMworY3BhY2sKK2N0ZXN0IC1WViAtRSAiKHB5dGhvbl90ZXN0KSIKKyMgZGlzYWJsZWQgY21ha2UgcHl0aG9uX3Rlc3QgZm9yIG5vdyBzaW5jZSBpdCBmYWlscyBpbiB0cmF2aXMgdW5kZXIgY2VudG9zCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNmMjgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApAQCAtMCwwICsxLDUwIEBACisjCisjIENvdmVyaXR5IFNjYW4gVHJhdmlzIGJ1aWxkIHNjcmlwdAorIyBUbyBydW4gdGhpcyBpbnRlcmFjdGl2ZWx5LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB5b3Vyc2VsZiwKKyMgYW5kIHJ1biB0aGlzIGluc2lkZSBhIGRvY2tlciBjb250YWluZXIuCisjCisjIENvbW1hbmQtTGluZSBBcmd1bWVudHMKKyMKKyMgLS1za2lwZG93bmxvYWQgICB0byBza2lwIHJlLWRvd25sb2FkaW5nIHRoZSBDb3Zlcml0eSBTY2FuIGJ1aWxkIHBhY2thZ2UgKGxhcmdlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKHJlcXVpcmVkKQorIworIyBDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCAgLSBlbWFpbCBhZGRyZXNzIHRvIG5vdGlmeQorIyBDT1ZFUklUWV9TQ0FOX1RPS0VOICAgICAgICAgICAgICAgLSB0aGUgQ292ZXJpdHkgU2NhbiB0b2tlbiAoc2hvdWxkIGJlIHNlY3VyZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChkZWZhdWx0ZWQpCisjCisjIENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORCAgICAgICAtIGRlZmF1bHRzIHRvICJidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2giCisjIENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04gICAgICAgICAtIGRlZmF1bHRzIHRvIFRSQVZJU19CUkFOQ0ggb3IgIm1hc3RlciIgaWYgZW1wdHkKKyMgQ09WRVJJVFlfU0NBTl9QUk9KRUNUICAgICAgICAgICAgIC0gZGVmYXVsdHMgdG8gInRocmlmdCIKKworc2V0IC1leAorCitDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ9JHtDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ6LWJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaH0KK0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT049JHtDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OOi0ke1RSQVZJU19CUkFOQ0g6LW1hc3Rlcn19CitDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q9JHtDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q6LXRocmlmdH0KKworIyBkb3dubG9hZCB0aGUgY292ZXJpdHkgc2NhbiBwYWNrYWdlCisKK3B1c2hkIC90bXAKK2lmIFtbICIkMSIgIT0gIi0tc2tpcGRvd25sb2FkIiBdXTsgdGhlbgorICBybSAtcmYgY292ZXJpdHlfdG9vbC50Z3ogY292LWFuYWx5c2lzKgorICB3Z2V0IGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vZG93bmxvYWQvbGludXg2NCAtLXBvc3QtZGF0YSAidG9rZW49JENPVkVSSVRZX1NDQU5fVE9LRU4mcHJvamVjdD0kQ09WRVJJVFlfU0NBTl9QUk9KRUNUIiAtTyBjb3Zlcml0eV90b29sLnRnegorICB0YXIgeHpmIGNvdmVyaXR5X3Rvb2wudGd6CitmaQorQ09WQklOPSQoZWNobyAkKHB3ZCkvY292LWFuYWx5c2lzKi9iaW4pCitleHBvcnQgUEFUSD0kQ09WQklOOiRQQVRICitwb3BkCisKKyMgYnVpbGQgdGhlIHByb2plY3Qgd2l0aCBjb3Zlcml0eSBzY2FuCisKK3JtIC1yZiBjb3YtaW50LworY292LWJ1aWxkIC0tZGlyIGNvdi1pbnQgJENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORAordGFyIGNKZiBjb3YtaW50LnRhci54eiBjb3YtaW50LworY3VybCAtLWZvcm0gdG9rZW49IiRDT1ZFUklUWV9TQ0FOX1RPS0VOIiBcCisgICAgIC0tZm9ybSBlbWFpbD0iJENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMIiBcCisgICAgIC0tZm9ybSBmaWxlPUBjb3YtaW50LnRhci54eiBcCisgICAgIC0tZm9ybSB2ZXJzaW9uPSIkKGdpdCBkZXNjcmliZSAtLXRhZ3MpIiBcCisgICAgIC0tZm9ybSBkZXNjcmlwdGlvbj0iJENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04iIFwKKyAgICAgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9idWlsZHM/cHJvamVjdD0iJENPVkVSSVRZX1NDQU5fUFJPSkVDVCIKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM1ODFhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworbWFrZSAtajMgcHJlY3Jvc3MKKworc2V0ICtlCittYWtlIGNyb3NzJDEKKworUkVUPSQ/CitpZiBbICRSRVQgLW5lIDAgXTsgdGhlbgorICBjYXQgdGVzdC9sb2cvdW5leHBlY3RlZF9mYWlsdXJlcy5sb2cKK2ZpCisKK2V4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JhMGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworZHBrZy1idWlsZHBhY2thZ2UgLXRjIC11cyAtdWMKK2xzIC1hbCAuLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhMzY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGRpc3QKK3RhciB4dmYgdGhyaWZ0LSoudGFyLmd6CitjZCB0aHJpZnQtKgorLi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2ZDU4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKQEAgLTAsMCArMSw2NiBAQAorIyEvYmluL2Jhc2gKK3NldCAtZXYKKworIworIyBHZW5lcmF0ZSB0aHJpZnQgZmlsZXMgc28gdGhlIHN0YXRpYyBjb2RlIGFuYWx5c2lzIGluY2x1ZGVzIGFuIGFuYWx5c2lzCisjIG9mIHRoZSBmaWxlcyB0aGUgdGhyaWZ0IGNvbXBpbGVyIHNwaXRzIG91dC4gIElmIHJ1bm5pbmcgaW50ZXJhY3RpdmVseQorIyBzZXQgdGhlIE5PQlVJTEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2tpcCB0aGUgYm9vdC9jb25maWcvbWFrZSBwaGFzZS4KKyMKKworaWYgW1sgLXogIiROT0JVSUxEIiBdXTsgdGhlbgorICAuL2Jvb3RzdHJhcC5zaAorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworICBtYWtlIC1qMyBwcmVjcm9zcworZmkKKworIworIyBDL0MrKyBzdGF0aWMgY29kZSBhbmFseXNpcyB3aXRoIGNwcGNoZWNrCisjIGFkZCAtLWVycm9yLWV4aXRjb2RlPTEgdG8gLS1lbmFibGU9YWxsIGFzIHNvb24gYXMgZXZlcnl0aGluZyBpcyBmaXhlZAorIworIyBQeXRob24gY29kZSBzdHlsZSBjaGVjayB3aXRoIGZsYWtlOAorIworIyBzZWFyY2ggZm9yIFRPRE8gZXRjIHdpdGhpbiBzb3VyY2UgdHJlZQorIyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvZGUgYmFzZQorIyBzb21lIGluZm8gYWJvdXQgdGhlIGJ1aWxkIG1hY2hpbmUKKworIyBDb21waWxlciBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgY29tcGlsZXIvY3BwL3NyYworCisjIEMrKyBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorCisjIEMgR2xpYiBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBTaWxlbnQgZXJyb3IgY2hlY2tzCisjIFNlZSBUSFJJRlQtNDM3MSA6IGZsZXggZ2VuZXJhdGVkIGNvZGUgdHJpZ2dlcnMgInBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSIgaW4geXlfaW5pdF9idWZmZXIKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLXN1cHByZXNzPSIqOnRocmlmdC90aHJpZnRsLmNjIiAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgUHl0aG9uIGNvZGUgc3R5bGUKK2ZsYWtlOCAtLWlnbm9yZT1XNTA0LEU1MDEgbGliL3B5CitmbGFrZTggLS1leGNsdWRlPXR1dG9yaWFsL3B5L2J1aWxkIHR1dG9yaWFsL3B5CisjIFRIUklGVC00MzcxIDogZ2VuZXJhdGVkIGZpbGVzIGFyZSBleGNsdWRlZCBiZWNhdXNlIHRoZXkgaGF2ZW4ndCBiZWVuIHNjcnViYmVkIHlldAorZmxha2U4IC0taWdub3JlPUU1MDEgLS1leGNsdWRlPSIqL2dlbi1weSovKiIsdGVzdC9weS9idWlsZCB0ZXN0L3B5CitmbGFrZTggdGVzdC9weS50d2lzdGVkCitmbGFrZTggdGVzdC9weS50b3JuYWRvCitmbGFrZTggLS1pZ25vcmU9RTUwMSB0ZXN0L3Rlc3QucHkKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxLEU3MjIgdGVzdC9jcm9zc3J1bm5lcgorZmxha2U4IHRlc3QvZmVhdHVyZXMKKworIyBQSFAgY29kZSBzdHlsZQorY29tcG9zZXIgaW5zdGFsbCAtLXF1aWV0CisuL3ZlbmRvci9iaW4vcGhwY3MKKworIyBUT0RPIGV0YworZWNobyBGSVhNRXM6IGBncmVwIC1yIEZJWE1FICogfCB3YyAtbGAKK2VjaG8gIEhBQ0tzOiBgZ3JlcCAtciBIQUNLICogfCB3YyAtbGAKK2VjaG8gIFRPRE9zOiBgZ3JlcCAtciBUT0RPICogfCB3YyAtbGAKKworIyBMb0MKK3Nsb2Njb3VudCAuCisKKyMgU3lzdGVtIEluZm8KK2Rwa2cgLWwKK3VuYW1lIC1hCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MGRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKKyMgV3JhcHMgYXV0b3Rvb2xzLnNoLCBidXQgZWFjaCBiaW5hcnkgY3Jhc2hlcyBpZiBpdCBleGhpYml0cyB1bmRlZmluZWQgYmVoYXZpb3IuIAorIyBTZXQgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBmbGFncy4gVGhpcyBjcmFzaGVzIG9uIGFsbCB1bmRlZmluZWQgYmVoYXZpb3IgZXhjZXB0IGZvcgorIyB1bmRlZmluZWQgY2FzdGluZywgYWthICJ2cHRyIi4KKyMgVE9ETzogZml4IHVuZGVmaW5lZCB2cHRyIGJlaGF2aW9yIGFuZCB0dXJuIHRoaXMgb3B0aW9uIGJhY2sgb24uCisKK2V4cG9ydCBDRkxBR1M9Ii1mc2FuaXRpemU9dW5kZWZpbmVkIC1mbm8tc2FuaXRpemUtcmVjb3Zlcj11bmRlZmluZWQgLU8wIC1nZ2RiMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciIKK2V4cG9ydCBDWFhGTEFHUz0iJHtDRkxBR1N9IgorZXhwb3J0IExERkxBR1M9Ii1sdWJzYW4iCitleHBvcnQgVUJTQU5fT1BUSU9OUz1wcmludF9zdGFja3RyYWNlPTEKKworIworIyB3b3JrIGFyb3VuZCBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMTYzMiBpZiBwcmVzZW50CisjCisKK3NlZCAtaSAncy8sIHN0cmVhbV90KHJkYnVmKCkpIC8sIHN0cmVhbV90KHBiYXNlX3R5cGU6Om1lbWJlci5nZXQoKSkvZycgL3Vzci9pbmNsdWRlL2Jvb3N0L2Zvcm1hdC9hbHRfc3N0cmVhbS5ocHAKKworIyBsbHZtLXN5bWJvbGl6ZXIgbXVzdCBiZSBvbiBQQVRIIHRvIGdldCBhIHN0YWNrIHRyYWNlIG9uIGVycm9yCisKK0NMQU5HX1BBVEg9IiQobWt0ZW1wIC1kKSIKK3RyYXAgInJtIC1yZiAke0NMQU5HX1BBVEh9IiBFWElUCitsbiAtcyAiJCh3aGVyZWlzIGxsdm0tc3ltYm9saXplci00LjAgIHwgcmV2IHwgY3V0IC1kICcgJyAtZiAxIHwgcmV2KSIgXAorICAiJHtDTEFOR19QQVRIfS9sbHZtLXN5bWJvbGl6ZXIiCitleHBvcnQgUEFUSD0iJHtDTEFOR19QQVRIfToke1BBVEh9IgorbGx2bS1zeW1ib2xpemVyIC12ZXJzaW9uCisKK2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCAkKgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODRkMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzAgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEFydGZ1bAorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEFydGZ1bCBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjcHA6IHN0b2NrIGJvb3N0IDEuNjIgaW4gYXJ0ZnVsIGhhcyBhIG5hc3R5IGJ1ZyBzbyB3ZSB1c2Ugc3RvY2sgYm9vc3QgMS42MworIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBoYXhlOiB2ZXJzaW9uIDMuNC4yIHRoYXQgY29tZXMgd2l0aCBVYnVudHUgY29yZXMgaW4gb3VyIENJIGJ1aWxkCisjIC0gZ286IGFydGZ1bCBjb21lcyB3aXRoIDEuOSwgd2Ugd2FudCB0aGUgbGF0ZXN0IChzdXBwb3J0ZWQpCisjIC0gbm9kZWpzOiB3YW50IHY4LCBhcnRmdWwgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmFydGZ1bC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS1hcnRmdWwtcHJvZCBhcnRmdWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIGhheGUgKGh0dHBzOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgvKQorUlVOIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6aGF4ZS9yZWxlYXNlcyAteQorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGFydGZ1bCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIGJvb3N0LTEuNjIgaGFzIGEgdGVycmlibGUgYnVnIGluIGJvb3N0Ojp0ZXN0LCBzZWUgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTI1MDcKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QxLjYzLWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC41CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1PIC1KIC1MIGh0dHBzOi8va2VudC5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zYmNsL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgwLjAKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4MC4wLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYjVhNjQzMzVmMTQ5MDI3N2I1ODU4MzJkMWY2YzdmOGM2YzExMjA2Y2JhNWNkM2Y3NzFkY2I4N2I5OGFkMWEzMworUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M5OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQmlvbmljCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQmlvbmljIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNsOiB3YW50IGxhdGVzdAorIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogd2FudCBsYXRlc3QKKyMgLSBub2RlanM6IHdhbnQgdjgsIGJpb25pYyBjb21lcyB3aXRoIHY2CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6YmlvbmljLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pIC0gaWYgd2UgZXZlciB3YW50IGEgbGF0ZXIgdmVyc2lvbgorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjI0LjMtMQorCisjIGRvdG5ldCAobmV0Y29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICB3Z2V0IC1xIC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2NvbmZpZy91YnVudHUvMTguMDQvcHJvZC5saXN0ICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGJpb25pYyBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tNi4wL2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC4xNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtbyBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgLUogLUwgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvc2JjbC9maWxlcy9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIvZG93bmxvYWQ/dXNlX21pcnJvcj1tYW5hZ2Vkd2F5IyAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4My4xCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODMuMS0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMisyLjAuMTYnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC5naXQgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4wKzEuMS4waCcgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wuZ2l0IGRlaW1vcy1vcGVuc3NsLTEuMS4waCAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMS40CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBmYjI2YzMwZTZhMDRhZDkzN2JiYzY1N2ExYjViYmE5MmY4MDA5NmFmMWU4ZWU2ZGE2NDMwYzA0NWE4ZGIzYTViCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgICAgICAgICAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2ICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAyPiYxID4gL2Rldi9udWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbiAmJiBcCisgICAgdXBkYXRlLWFsdGVybmF0aXZlcyAtLXNldCBqYXZhIC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9qcmUvYmluL2phdmEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgU3dpZnQgb24gTGludXggZm9yIGNyb3NzIHRlc3RzCitSVU4gY2QgLyAmJiBcCisgICAgd2dldCAtLXF1aWV0IGh0dHBzOi8vc3dpZnQub3JnL2J1aWxkcy9zd2lmdC00LjIuMS1yZWxlYXNlL3VidW50dTE4MDQvc3dpZnQtNC4yLjEtUkVMRUFTRS9zd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgdGFyIHhmIHN3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6IC0tc3RyaXAtY29tcG9uZW50cz0xICYmIFwKKyAgICBybSBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgc3dpZnQgLS12ZXJzaW9uCisKKyMgY3BwY2hlY2stMS44MiBoYXMgYSBuYXN0eSBjcHAgcGFyc2VyIGJ1Zywgc28gd2UncmUgdXNpbmcgc29tZXRoaW5nIG5ld2VyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTggJiYgXAorICAgIHdnZXQgLXEgImh0dHBzOi8vbGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9jcHBjaGVjay8xLjgzLTIvK2J1aWxkLzE0ODc0NzAzLytmaWxlcy9jcHBjaGVja18xLjgzLTJfYW1kNjQuZGViIiAmJiBcCisgICAgZHBrZyAtaSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViICYmIFwKKyAgICBybSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzJiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBYZW5pYWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBYZW5pYWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDc1LjEgZm9yIGNvdmVyYWdlCisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDEuMjIuMSBmb3IgY292ZXJhZ2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogWGVuaWFsIGNvbWVzIHdpdGggMS42LCBidXQgd2UgbmVlZCAxLjcgb3IgbGF0ZXIKKyMgLSBub2RlanM6IFhlbmlhbCBjb21lcyB3aXRoIDQuMi42IHdoaWNoIGV4aXRzIExUUyBBcHJpbCAyMDE4LCBzbyB3ZSdyZSBpbnN0YWxsaW5nIDYueAorIyAtIG9jYW1sOiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3cgZXJyb3IsIGp1c3Qgc3RhcnRlZCBNYXJjaCAyMDE4IG5vdCBzdXJlIHdoeQorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnhlbmlhbC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykKKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgd2dldCAtcU8gLSBodHRwczovL2RsYW5nLm9yZy9kLWtleXJpbmcuZ3BnIHwgYXB0LWtleSBhZGQgLQorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjIyLjEtMQorCisjIGRvdG5ldCAoY29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV82LnggeGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgRF9WRVJTSU9OIDIuMDc1LjEtMAorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0kRF9WRVJTSU9OIFwKKyAgICAgIGxpYnBob2JvczItZGV2PSREX1ZFUlNJT04gXAorICAgICAgZHViPTEuNi4wLTAgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS92MS4xLjYrMS4wLjFnLnRhci5neiB8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC0xLjEuNi0xLjAuMWcKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjEuNAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjcuNgorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYWQ1ODA4YmY0MmIwMTRjMjJkZDc2NDY0NThmNjMxMzg1MDAzMDQ5ZGVkMGJiNmFmMmVmYzdmMWY3OWZhMjllYQorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICBybSBnb2xhbmcudGFyLmd6CisKKyMgZHVlIHRvIGEgYnVnIGluIGNhYmFsIGluIHhlbmlhbCAoY2FiYWwtaW5zdGFsbCBwYWNrYWdlKSB3ZSBwdWxsIGluIGFub3RoZXI6CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgJiYgXAorICAgIGNkIC90bXAgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly93d3cuaGFza2VsbC5vcmcvY2FiYWwvcmVsZWFzZS9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGNhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICBmaW5kIGRpc3QtbmV3c3R5bGUvIC10eXBlIGYgLW5hbWUgY2FiYWwgLWV4ZWMgbXYge30gL3Vzci9iaW4gXDsgJiYgXAorICAgIHJtIC1yZiAvdG1wL2NhYmFsKiAmJiBcCisgICAgY2FiYWwgLS12ZXJzaW9uCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMCAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMy40LjY0IDI+JjEgPiAvZGV2L251bGwKKyMgbm90ZTogaHhjcHAgMy40LjE4NSAobGF0ZXN0KSBubyBsb25nZXIgc2hpcHMgc3RhdGljIGxpYnJhcmllcywgYW5kIGNhdXNlZCBhIGJ1aWxkIGZhaWx1cmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxIFwKKyAgICAgIGxpYmF0ay1icmlkZ2UyLjAtMCBcCisgICAgICBsaWJndGstMy0wCisKKyMgVEhSSUZULTQ1MTc6IGNhdXNlcyBzdGFjayBvdmVyZmxvd3M7IHZlcnNpb24gdG9vIG9sZDsgc2tpcCBvY2FtbCBpbiB4ZW5pYWwKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIERPVE5FVF9DTElfVEVMRU1FVFJZX09QVE9VVCAxCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2ZpeGNoYW5nZXMuc2ggYi9idWlsZC9maXhjaGFuZ2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjNTdiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9maXhjaGFuZ2VzLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBmaXhjaGFuZ2VzIHdpbGwgdGFrZSBhIGZpbGUgYXMgaW5wdXQgYW5kIGxvb2sgZm9yIHRleHQgbWF0Y2hpbmcKKyMgdGhlIHBhdHRlcm4gW1RIUklGVC1ubm5uXSAodGhlIG51bWJlciBvZiBkaWdpdHMgaXMgbm90IGltcG9ydGFudCkKKyMgd2hpY2ggaXMgbm90IGEgbWFya2Rvd24gbGluaywgYW5kIGNoYW5nZSBpdCB0byBiZSBhIG1hcmtkb3duIGxpbmsuCisjIFRoZSB0b29sIHdyaXRlcyB0byBzdGRvdXQgc28geW91IGNhbiByZWRpcmVjdCBpdCB0byBhIHRlbXBvcmFyeQorIyBmaWxlIGFuZCB0aGVuIGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgcmVwbGFjaW5nCisjIGl0LgorIworIyBUaGlzIHRvb2wgd2FzIGRldmVsb3BlZCBhZnRlciB0aGUgMC4xMi4wIHJlbGVhc2UgdG8gYXNzaXN0IHdpdGgKKyMgZ2VuZXJhdGlvbiBvZiBDSEFOR0VTLm1kIGNvbnRlbnQuCisjCisKK3doaWxlIElGUz0nJyByZWFkIC1yIGxpbmUgfHwgW1sgLW4gIiRsaW5lIiBdXTsgZG8KKyAgICBpZiBbWyAiJGxpbmUiID1+IF4oLiopXFsoVEhSSUZULVtbOmRpZ2l0Ol1dKylcXVteXChdKC4qKSQgXV07IHRoZW4KKyAgICAgICAgZWNobyAiJHtCQVNIX1JFTUFUQ0hbMV19WyR7QkFTSF9SRU1BVENIWzJdfV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS8ke0JBU0hfUkVNQVRDSFsyXX0pICR7QkFTSF9SRU1BVENIWzNdfSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiRsaW5lIgorICAgIGZpCitkb25lIDwgIiQxIgpkaWZmIC0tZ2l0IGEvYnVpbGQvdmVyYWxpZ24uc2ggYi9idWlsZC92ZXJhbGlnbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTc0NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdmVyYWxpZ24uc2gKQEAgLTAsMCArMSwzMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSB2ZXJhbGlnbiBzY3JpcHQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgaW4gYWxsIG9mCisjIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFsbCBvZiB0aGUgc3VwcG9ydGVkCisjIGxhbmd1YWdlcy4gIEl0IGlzIHVzZWQgdG8gcHJlcGFyZSBhIHJlbGVhc2Ugb3IgbW92ZSBtYXN0ZXIKKyMgZm9yd2FyZCB0byB0aGUgbmV4dCBhbnRpY2lwYXRlZCB2ZXJzaW9uLgorIworIyBVU0FHRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPgorIworIyBFWEFNUExFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICQgLi92ZXJhbGlnbi5zaCAwLjEyLjAgMS4wLjAKKyMgJCAuL3ZlcmFsaWduLnNoIDEuMC4wIDEuMS4wCisjCisjIElNUE9SVEFOVCBVU0FHRSBOT1RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRFJZUlVOIHRvIGhhdmUgdGhlIHNjcmlwdAorIyBwcmludCBvdXQgYWxsIG1hdGNoZXMgdG8gdGhlIG9sZFZlcnNpb24gaGlsaWdodGVkIHNvIHRoYXQKKyMgeW91IGNhbiB2ZXJpZnkgaXQgd2lsbCBjaGFuZ2UgdGhlIHJpZ2h0IHRoaW5ncy4KKyMKKworZGVjbGFyZSAtQSBGSUxFUworCisjIFRoZXNlIGZpbGVzIHJlcXVpcmUgYSBtYW51YWwgdG91Y2g6CitGSUxFU1tDSEFOR0VTLm1kXT1tYW51YWwKK0ZJTEVTW2RlYmlhbi9jaGFuZ2Vsb2ddPW1hbnVhbAorRklMRVNbZG9hcC5yZGZdPW1hbnVhbAorCisjIFRoZXNlIGZpbGVzIGNhbiBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHk6CitGSUxFU1tBcGFjaGVUaHJpZnQubnVzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQtc3dpZnQzLnBvZHNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1thcHB2ZXlvci55bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2Jvd2VyLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tidWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tjb25maWd1cmUuYWNdPWNvbmZpZ3VyZVJlcGxhY2UKK0ZJTEVTW2NvbnRyaWIvdGhyaWZ0LnNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmhdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2Qvc3JjL3RocmlmdC9iYXNlLmRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kYXJ0L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaGF4ZS9oYXhlbGliLmpzb25dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ocy90aHJpZnQuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvanMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbbGliL2pzL3NyYy90aHJpZnQuanNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9sdWEvVGhyaWZ0Lmx1YV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9wZXJsL2xpYi9UaHJpZnQucG1dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9weS9zZXR1cC5weV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JiL3RocmlmdC5nZW1zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcnMvQ2FyZ28udG9tbF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3N0L3BhY2thZ2UueG1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1twYWNrYWdlLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tzb25hci1wcm9qZWN0LnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorCitpZiBbICEgLWYgIkNIQU5HRVMiIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHJ1biB2ZXJhbGlnbi5zaCB3aGlsZSBpbiB0aGUgdGhyaWZ0IHJvb3QgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorZmkKKworaWYgWyAkIyAtbmUgMiBdOyB0aGVuCisgICAgPiYyIGVjaG8gInVzYWdlOiB2ZXJhbGlnbi5zaCA8b2xkVmVyc2lvbj4gPG5ld1ZlcnNpb24+IgorICAgIGV4aXQgMQorZmkKKworanEgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHRoZSAnanEnIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIKKyAgICBleGl0IDEKK2ZpCisKKyMKKyMgdmFsaWRhdGVWZXJzaW9uOiBjaGVjayB0aGF0IGEgdmVyc2lvbiBtYXRjaGVzIHRoZSBtYWpvci5taW5vci5wYXRjaAorIyAgIGZvcm1hdCB3aGljaCBpcyB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBzdXBwb3J0ZWQgYnkgYWxsCisjICAgcHJvamVjdCBzeXN0ZW1zLgorIyBccGFyYW0gJDEgdGhlIHZlcnNpb24KKyMgXHJldHVybnMgMCBpZiB0aGUgdmVyc2lvbiBpcyBjb21wbGlhbnQKKyMKK2Z1bmN0aW9uIHZhbGlkYXRlVmVyc2lvbgoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIHZhbGlkCisgICAgdmFsaWQ9JChlY2hvICIkMSIgfCBzZWQgJy9eW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cKyQvIXtxMjJ9JykKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLWVxIDIyIF07IHRoZW4KKyAgICAgICAgPiYyIGVjaG8gImVycm9yOiB2ZXJzaW9uICckMScgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgcmVxdWlyZWQgbWFqb3IubWlub3IucGF0Y2ggZm9ybWF0IgorICAgICAgICByZXR1cm4gJHtyZXN1bHR9CisgICAgZmkKK30KKworT0xEVkVSU0lPTj0kMQorTkVXVkVSU0lPTj0kMgordmFsaWRhdGVWZXJzaW9uICIke09MRFZFUlNJT059IiB8fCBleGl0ICQ/Cit2YWxpZGF0ZVZlcnNpb24gIiR7TkVXVkVSU0lPTn0iIHx8IGV4aXQgJD8KKworIworIyBlc2NhcGVWZXJzaW9uOiBlc2NhcGUgdGhlIHZlcnNpb24gZm9yIHVzZSBhcyBhIHNlZCBzZWFyY2gKKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uIHRvIGVzY2FwZQorIyBcb3V0cHV0IHRoZSBlc2NhcGVkIHN0cmluZworIyBccmV0dXJucyAwCisjIFxleGFtcGxlIFZFUlNFQVJDSD0kKGVzY2FwZVZlcnNpb24gIlsxLjAuMF0iKTsgZWNobyAkVkVSU0VBUkNIOyA9PiAiXFsxXC4wXC4wXF0iCisjCitmdW5jdGlvbiBlc2NhcGVWZXJzaW9uCit7CisgICAgZWNobyAiJChlY2hvICQxIHwgc2VkICdzL1wuL1xcLi9nJyB8IHNlZCAncy9cWy9cXFxbL2cnIHwgc2VkICdzL1xdL1xcXF0vZycpIgorfQorCisjIFNldCB1cCB2ZXJib3NlIGhpbGlnaHRpbmcgaWYgcnVubmluZyBpbnRlcmFjdGl2ZQoraWYgWyAiJCh0cHV0IGNvbG9ycykiIC1uZSAwIF07IHRoZW4KKyAgICByZXZlcnNlPSQodHB1dCByZXYpCisgICAgcmVkPSQodHB1dCBzZXRhZiAxKQorICAgIGdyZWVuPSQodHB1dCBzZXRhZiAyKQorICAgIHllbGxvdz0kKHRwdXQgc2V0YWYgMykKKyAgICBub3JtYWw9JCh0cHV0IHNncjApCitmaQorCitkZWNsYXJlIC1BIE1BTlVBTAorCisjCisjIG1hbnVhbDogbm90ZSB0aGF0IHVwZGF0ZSBvZiBzYWlkIGZpbGUgaXMgbWFudWFsCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMAorIworZnVuY3Rpb24gbWFudWFsCit7CisgICAgTUFOVUFMWyIkMSJdPSIiCisgICAgcmV0dXJuIDAKK30KKworIworIyBjb25maWd1cmVSZXBsYWNlOiByZXBsYWNlIHRoZSBBQ19JTklUIGZpZWxkIGluIGNvbmZpZ3VyZS5hYworIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBjb25maWd1cmVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJbdGhyaWZ0XSwgWyR7T0xEVkVSU0lPTn1dIiAiW3RocmlmdF0sIFske05FV1ZFUlNJT059XSIKK30KKworIworIyBqc29uUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBKU09OIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUganNvbiBzdHJ1Y3R1cmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24ganNvblJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uIiAiJDEiKQorICAgIGVsc2UKKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uID0gXCIke05FV1ZFUlNJT059XCIiICIkMSIgPiB0bXAuJCQuanNvbiAmJiBtdiB0bXAuJCQuanNvbiAiJDEiKQorICAgIGZpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogdmVyc2lvbiB0YWcgbm90IGZvdW5kIiAiJDEiICIkY291bnQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQlXCJ9CisgICAgICAgIG91dHB1dD0ke291dHB1dCNcIn0KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8IE1BVENIRVM6ICAgdmVyc2lvbjogXCIke3JldmVyc2V9JHtncmVlbn0ke291dHB1dH0ke25vcm1hbH1cIiIgIiQxIiAxCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiIDEKKyAgICBlY2hvCisgICAgcmV0dXJuIDAKK30KKworIworIyBwdWJzcGVjUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBZQU1MIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUgeWFtbCBzdHJ1Y3R1cmUKKyMgICBkaWQgbm90IGZpbmQgYSBwYWNrYWdlIHRoYXQgcHJlc2VydmVzIGNvbW1lbnRzIHNvIHRoaXMgaXMKKyMgICBzb21ld2hhdCBicmFpbi1kZWFkLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRvbmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gcHVic3BlY1JlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgInZlcnNpb246ICR7T0xEVkVSU0lPTn0iICJ2ZXJzaW9uOiAke05FV1ZFUlNJT059IgorfQorCisjCisjIHJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2Ygb25lIHN0cmluZyB3aXRoIGFub3RoZXIKKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gdGhlIG9sZCBzdHJpbmcgYXQgbGVhc3Qgb25jZQorIyAgICAgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bC4KKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccGFyYW0gJDIgdGhlICJvbGQiIHN0cmluZyB0byBiZSByZXBsYWNlZAorIyBccGFyYW0gJDMgdGhlICJuZXciIHN0cmlpbmcgdG8gcmVwbGFjZSBpdCB3aXRoCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworZnVuY3Rpb24gcmVwbGFjZQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIG91dHB1dAorICAgIGxvY2FsIG9sZFN0cmluZz0iJDIiCisgICAgbG9jYWwgbmV3U3RyaW5nPSIkMyIKKyAgICBsb2NhbCBvbGRSZWdleD0kKGVzY2FwZVZlcnNpb24gIiR7b2xkU3RyaW5nfSIpCisgICAgbG9jYWwgY291bnQ9JChncmVwIC1FYyAiJHtvbGRSZWdleH0iICIkMSIpCisgICAgbG9jYWwgdmVyYm9zZQorICAgIGlmIFsgJGNvdW50IC1lcSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfU5PVCBGT1VORCR7bm9ybWFsfTogJHtvbGRTdHJpbmd9IiAiJDEiIDAKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KKyAgICAgICAgICAgIGVjaG8gIiA+ICQoZWNobyAiJGxpbmUiIHwgc2VkICJzLyR7b2xkUmVnZXh9LyR7cmV2ZXJzZX0ke2dyZWVufSR7b2xkU3RyaW5nfSR7bm9ybWFsfS9nIikiCisgICAgICAgIGRvbmUgPCA8KGdyZXAgLUUgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgb3V0cHV0PSQoc2VkIC1pICJzLyR7b2xkUmVnZXh9LyR7bmV3U3RyaW5nfS9nIiAiJDEiKQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJHJlc3VsdCAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogJXMiICIkMSIgIiRjb3VudCIgIiRvdXRwdXQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiICIkY291bnQiCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgc2ltcGxlUmVwbGFjZTogcmVwbGFjZSBvY2N1cnJlbmNlcyBvZiAke09MRFZFUlNJT059IHdpdGggJHtORVdWRVJTSU9OfQorIyAgICAgdGhlIGZpbGUgc3BlY2lmaWVkIG11c3QgY29udGFpbiBPTERWRVJTSU9OIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHNpbXBsZVJlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgIiR7T0xEVkVSU0lPTn0iICIke05FV1ZFUlNJT059IgorfQorCitlY2hvICIiCitlY2hvICJBcGFjaGUgVGhyaWZ0IFZlcnNpb24gQWxpZ25tZW50IFRvb2wiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICIiCitlY2hvICJQcmV2aW91cyBWZXJzaW9uOiAke09MRFZFUlNJT059IgorZWNobyAiICAgICBOZXcgVmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK2VjaG8gIiIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ291bnQgfCBTdGF0dXMgICAgICAgICAgICAgICAiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworZm9yIGZpbGUgaW4gJChlY2hvICIkeyFGSUxFU1tAXX0iIHwgc29ydCk7IGRvCisgICAgJHtGSUxFU1skZmlsZV19ICRmaWxlIHx8IGV4aXQgJD8KK2RvbmUKKworZWNobworZWNobyAiRmlsZXMgdGhhdCBtdXN0IGJlIG1vZGlmaWVkIG1hbnVhbGx5OiIKK2VjaG8KK2ZvciBtYW51IGluICQoZWNobyAiJHshTUFOVUFMW0BdfSIgfCBzb3J0KTsgZG8KKyAgICBlY2hvICIgPiAke3llbGxvd30ke21hbnV9JHtub3JtYWx9IgorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9SRUFETUUubWQgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE5IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChOYXRpdmUpCisKK1RocmlmdCB1c2VzIGNtYWtlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IG9uIG11bHRpcGxlIHBsYXRmb3JtcywgaG93ZXZlciB0byBidWlsZCBhIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHByb2R1Y3Rpb24gcmVhZHkgdGhyaWZ0IG9uIFdpbmRvd3MgcmVxdWlyZXMgYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJlIG9idGFpbmVkIG9yIGJ1aWx0LiAgT25jZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYXJlIHJlYWR5LCB0aGUgcmlnaHQgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCB0byBjbWFrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBlbnZpcm9ubWVudC4KKworIyMgU3VtbWFyeQorCitUaGVzZSBpbnN0cnVjdGlvbnMgd2lsbCBoZWxwIHlvdSBidWlsZCB0aHJpZnQgZm9yIHdpbmRvd3MgdXNpbmcgVmlzdWFsCitTdHVkaW8gMjAxMCBvciBsYXRlci4gIFRoZSBjb250cmlidXRlZCBiYXRjaCBmaWxlcyB3aWxsIGhlbHAgeW91IGJ1aWxkCit0aGUgdGhpcmQgcGFydHkgbGlicmFyaWVzIG5lZWRlZCBmb3IgY29tcGxldGUgdGhyaWZ0IGZ1bmN0aW9uYWxpdHkgYXMKK3dlbGwgYXMgdGhyaWZ0IGl0c2VsZi4KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGZvbGxvdyBhIGRpcmVjdG9yeSBsYXlvdXQgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICB3b3Jrc3BhY2VcCisgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSBvdXQtb2YtdHJlZSB0aHJpZnQgY21ha2UgYnVpbGRzIGFyZSBnZW5lcmF0ZWQKKyAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBidWlsZCByZXN1bHRzIGVuZCB1cAorICAgICAgdGhpcmRwYXJ0eVwgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBsaXZlCisgICAgICAgIGJ1aWxkXCAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IG91dC1vZi10cmVlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgZm9yIG9wZW5zc2wsIHdoaWNoIG9ubHkgYnVpbGRzIGluLXRyZWUpCisgICAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGRpc3RyaWJ1dGlvbnMgZW5kIHVwCisgICAgICAgIHNyY1wgICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IHNvdXJjZSBwcm9qZWN0cyBsaXZlCisgICAgICBzY3JpcHRzXCAgICAgLSBiYXRjaCBmaWxlcyB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkcworICAgICAgdGhyaWZ0XCAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgdGhyaWZ0IHNvdXJjZSBwcm9qZWN0IGxpdmVzCisKK0NyZWF0ZSBhICJ3b3Jrc3BhY2UiIGRpcmVjdG9yeSBzb21ld2hlcmUgb24geW91ciBzeXN0ZW0gYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgdGhpcworZGlyZWN0b3J5IHRvIHRoZXJlLCB0aGVuIGNsb25lIG9yIHVucGFjayB0aHJpZnQgaW50byBgd29ya3NwYWNlXHRocmlmdGAuCisKKyMjIFRoaXJkIFBhcnR5IExpYnJhcmllcworCitCYXRjaCBzY3JpcHRzIGFyZSBwcm92aWRlZCB0byBidWlsZCBzb21lIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4gIFlvdSBtdXN0IGRvd25sb2FkIHRoZW0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgZGlyZWN0b3J5IG5vdGVkIGZvciBlYWNoLiAgWW91IGNhbiB1c2UgZGlmZmVyZW50IHZlcnNpb25zIGlmIHlvdSBwcmVmZXI7IHRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIG1hZGUgd2l0aCB0aGUgdmVyc2lvbnMgbGlzdGVkLiAgCisKKz4gVElQOiBUbyBtb2RpZnkgdGhlIHZlcnNpb25zIHVzZWQgaW4gdGhlIGJhdGNoIHNjcmlwdHMsIGxvb2sgaW4gc2NyaXB0c1x0cHZlcnNpb25zLmJhdC4KKworQnVpbGQgdGhlbSBpbiB0aGUgb3JkZXIgbGlzdGVkIHRvIHNhdGlzZnkgdGhlaXIgZGVwZW5kZW5jaWVzLgorCisjIyMgd2luZmxleGJpc29uCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi9maWxlcy93aW5fZmxleF9iaXNvbi1sYXRlc3QuemlwL2Rvd25sb2FkCisgICAgICAgdmVyc2lvbjogImxhdGVzdCIKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvbgorCitUaGlzIHBhY2thZ2UgaXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGNvbXBpbGVyLiAgVGhpcyB0aGlyZCBwYXJ0eSBwYWNrYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgYnVpbHQgYXMgaXQgaXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSAiYmlzb24iIGFuZCAiZmxleCIgdG9vbHMgbm9ybWFsbHkgZm91bmQgb24gVW5peCBib3hlcy4KKworPiBUSVA6IElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGJ1aWxkaW5nIHRoZSBjb21waWxlciwgeW91IGNhbiBza2lwIHRoZSByZW1haW5pbmcgdGhpcmQgcGFydHkgbGlicmFyaWVzLgorCisjIyMgemxpYgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vemxpYi5uZXQvCisgICAgICAgdmVyc2lvbjogMS4yLjkKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcemxpYi0xLjIuOQorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtemxpYi5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorIAorIyMjIG9wZW5zc2wKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvCisgICAgICAgdmVyc2lvbjogMS4xLjBjCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXG9wZW5zc2wtMS4xLjBjCisgICAgZGVwZW5kcy1vbjogemxpYgorCitJZiB5b3UgYXJlIHVzaW5nIG9wZW5zc2wtMS4xLjAgb3IgbGF0ZXIsIHRoZXkgY2hhbmdlZCBzdGF0aWMgYnVpbGRzIHRvIHVzZSBNaWNyb3NvZnQgU3RhdGljIFJUTCBmb3IgcmVsZWFzZSBidWlsZHMuICB6bGliIGJ5IGRlZmF1bHQgdXNlcyBhIGR5bmFtaWMgcnVudGltZSwgYXMgZG9lcyBsaWJldmVudC4gIEVkaXQgdGhlIGZpbGUgQ29uZmlndXJhdGlvbnMvMTAtbWFpbi5jb25mIGFuZCByZXBsYWNlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciAiVkMtbm9DRS1jb21tb24iIHdpdGggd2hhdCBhcHBlYXJzIGJlbG93IHRvIG1ha2Ugb3BlbnNzbCBidWlsZCB3aXRoIGR5bmFtaWMgcnVudGltZSBpbnN0ZWFkOgorCisgICAgIlZDLW5vQ0UtY29tbW9uIiA9PiB7CisgICAgICAgIGluaGVyaXRfZnJvbSAgICAgPT4gWyAiVkMtY29tbW9uIiBdLAorICAgICAgICB0ZW1wbGF0ZSAgICAgICAgID0+IDEsCisgICAgICAgIGNmbGFncyAgICAgICAgICAgPT4gYWRkKHBpY2tlcihkZWZhdWx0ID0+ICItRFVOSUNPREUgLURfVU5JQ09ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyAgID0+ICIvTURkIC9PZCAtRERFQlVHIC1EX0RFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPT4gIi9NRCAvTzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICBiaW5fY2ZsYWdzICAgICAgID0+IGFkZChwaWNrZXIoZGVidWcgICA9PiAiL01EZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2xmbGFncyAgICAgICA9PiBhZGQoIi9zdWJzeXN0ZW06Y29uc29sZSAvb3B0OnJlZiIpLAorICAgICAgICBleF9saWJzICAgICAgICAgID0+IGFkZChzdWIgeworICAgICAgICAgICAgbXkgQGV4X2xpYnMgPSAoKTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICd3czJfMzIubGliJyB1bmxlc3MgJGRpc2FibGVke3NvY2t9OworICAgICAgICAgICAgcHVzaCBAZXhfbGlicywgJ2dkaTMyLmxpYiBhZHZhcGkzMi5saWIgY3J5cHQzMi5saWIgdXNlcjMyLmxpYic7CisgICAgICAgICAgICByZXR1cm4gam9pbigiICIsIEBleF9saWJzKTsKKyAgICAgICAgfSksCisgICAgfSwKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLW9wZW5zc2wuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIGxpYmV2ZW50CisKKyAgICAgICAgc291cmNlOiBnaXQKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vbm1hdGhld3Nvbi9MaWJldmVudC5naXQKKyAgICAgICAgICAgdXNlOiBjb21taXQgMzgyMWNjYTFhNjM3ZjRkYTQwOTljOTM0M2U3MzI2ZGEwMGY2OTgxYyBvciBsYXRlcgorICAgICAgICAgIGRhdGU6IEZyaSBEZWMgMjMgMTY6MTk6MzUgMjAxNiArMDgwMCBvciBsYXRlcgorICAgICAgIHZlcnNpb246IGNvcnJlc3BvbmRzIHRvIDIuMS43cmMgKyBwYXRjaGVzCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXGxpYmV2ZW50LTIuMS43cmMyCisgICAgZGVwZW5kcy1vbjogb3BlbnNzbCwgemxpYgorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtbGliZXZlbnQuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIG1zaW50dHlwZXMKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vYXJjaGl2ZS9wL21zaW50dHlwZXMvZG93bmxvYWRzCisgICAgICAgdmVyc2lvbjogMjYKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XG1zaW50dHlwZXMKKworPiBUSVA6IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIFZpc3VhbCBTdHVkaW8gMjAxMCwgd2hpY2ggZGlkIG5vdCBpbmNsdWRlIGFuIDxpbnR0eXBlcy5oPiBoZWFkZXIuCisKK1RoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgZGlzdHJpYnV0aW9uIG9mIGhlYWRlciBmaWxlcy4KKworIyMjIGJvb3N0CisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHA6Ly9ib29zdC50ZWVrczk5LmNvbS8KKyAgICAgICB2ZXJzaW9uOiAxXzYyXzAKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XGJvb3N0XzFfNjJfMAorCitUaGUgcHJlLWJ1aWx0IGJpbmFyeSB2ZXJzaW9ucyBvZiBib29zdCBjb21lIGluIHNlbGYtdW5wYWNraW5nIGV4ZWN1dGFibGVzLiAgUnVuIGVhY2ggb2YgdGhlIG9uZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFuZCBwb2ludCB0aGVtIGF0IHRoZSBzYW1lIHRoaXJkcGFydHkgZGlzdCBkaXJlY3RvcnkuCisKKyMjIEJ1aWxkaW5nIGEgUHJvZHVjdGlvbiB0aHJpZnQgQ29tcGlsZXIKKworIyMjIFByZXJlcXVpc2l0ZXMKKworKiBDTWFrZS0yLjguMTIuMiBvciBsYXRlcgorKiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIKKyogdGhyaWZ0IHNvdXJjZSBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhyaWZ0CisqIHdpbmZsZXhiaXNvbiBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0CisKKyMjIyBJbnN0cnVjdGlvbnMKKworQnkgZm9sbG93aW5nIHRoZXNlIGluc3RydWN0aW9ucyB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHJlbGVhc2UgbW9kZSB0aHJpZnQgY29tcGlsZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIGFzIGl0IGhhcyBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuICAKKworMS4gT3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdGAKKworVGhlIGJhdGNoIGZpbGUgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW4gYHdvcmtzcGFjZVxidWlsZGAgYW5kIHRoZW4gYnVpbGRzIHRoZSBjb21waWxlci4gIFRoZSByZXN1bHRpbmcgYHRocmlmdC5leGVgIHByb2dyYW0gaXMgcGxhY2VkIGludG8gYHdvcmtzcGFjZVxkaXN0YCBpbiBhIHBhdGggdGhhdCBkZXBlbmRzIG9uIHlvdXIgY29tcGlsZXIgdmVyc2lvbiBhbmQgcGxhdGZvcm0uICBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBhIFZpc3VhbCBTdHVkaW8gMjAxMCB4NjQgQ29tbWFuZCBQcm9tcHQsIHRoZSBjb21waWxlciB3aWxsIGJlIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdFx0aHJpZnQtY29tcGlsZXItZGV2XHZjMTAwXHg2NFxSZWxlYXNlXHRocmlmdC5leGVgCisKKyMjIyMgRGV0YWlscworCitUaGlzIHNlY3Rpb24gaXMgZm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91dCB0aGUgQ01ha2Ugb3B0aW9ucyB1c2VkIGluIHRoZSBidWlsZCBwcm9jZXNzLgorCitDTWFrZSB0YWtlcyB0aGUgc291cmNlIHRyZWUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB1c2VzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGZvciBjb25maWd1cmF0aW9uLiAgVGhlIGJhdGNoIGZpbGUgYGJ1aWxkLXRocmlmdC1jb21waWxlcmAgZXNzZW50aWFsbHkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBOTUFLRSAvRk1ha2VmaWxlIHRocmlmdC1jb21waWxlcgorCitXSVRIX01UIGNvbnRyb2xzIHRoZSBkeW5hbWljIG9yIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgc2VsZWN0aW9uLiAgVG8gYnVpbGQgYSBwcm9kdWN0aW9uIGNvbXBpbGVyLCB0aGUgdGhyaWZ0IHByb2plY3QgcmVjb21tZW5kcyB1c2luZyB0aGUgc3RhdGljIHJ1bnRpbWUgbGlicmFyeSB0byBtYWtlIHRoZSBleGVjdXRhYmxlIHBvcnRhYmxlLiAgVGhlIGJhdGNoIGZpbGUgc2V0cyB0aGlzLgorCitZb3UgY2FuIGJ1aWxkIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgYnkgZm9sbG93aW5nIHRoZSBleGFtcGxlIGJ1dCBzdWJzdGl0dXRpbmcgYSBkaWZmZXJlbnQgZ2VuZXJhdG9yIGZvciB0aGUgIi1HIiBvcHRpb24uICBSdW4gYGNtYWtlLmV4ZSAtLWhlbHBgIGZvciBhIGxpc3Qgb2YgZ2VuZXJhdG9ycy4gIFR5cGljYWxseSwgdGhpcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvbiBXaW5kb3dzIChvbWl0ICJXaW42NCIgdG8gYnVpbGQgMzItYml0IGluc3RlYWQpOgorCisqICJWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDExIDIwMTIgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiCisKK0ZvciBleGFtcGxlIHlvdSBjYW4gYnVpbGQgdXNpbmcgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSBieSBkb2luZzoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBNU0JVSUxEICJBcGFjaGUgVGhyaWZ0LnNsbiIgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NCAvdDp0aHJpZnQtY29tcGlsZXIKKworWW91IGNhbiBhbHNvIGRvdWJsZS1jbGljayBvbiB0aGUgc29sdXRpb24gZmlsZSB0byBicmluZyBpdCB1cCBpbiBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZCBvciBkZWJ1ZyBpbnRlcmFjdGl2ZWx5IGZyb20gdGhlcmUuCisKKyMjIEJ1aWxkaW5nIHRoZSB0aHJpZnQgQysrIFJ1bi1UaW1lIExpYnJhcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBjb21waWxlciBidWlsZCBob3dldmVyIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvbiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYnVpbGQgYSBmZWF0dXJlLWNvbXBsZXRlIHJ1bnRpbWUuICBUaGUgcmVzdWx0aW5nIHN0YXRpYyBsaW5rIGxpYnJhcnkgZm9yIHRocmlmdCB1c2VzIGEgZHluYW1pYyBNaWNyb3NvZnQgcnVudGltZS4KKworMS4gT3BlbiB0aGUgZGVzaXJlZCBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0LgorMi4gYGNkIHdvcmtzcGFjZWAKKzMuIGBidWlsZC10aHJpZnQuYmF0YAorCitUaHJpZnQgZGVwZW5kcyBvbiBib29zdCwgbGliZXZlbnQsIG9wZW5zc2wsIGFuZCB6bGliIGluIG9yZGVyIHRvIGJ1aWxkIHdpdGggYWxsIHNlcnZlciBhbmQgdHJhbnNwb3J0IHR5cGVzLiAgVG8gdXNlIGxhdGVyIHZlcnNpb25zIG9mIGJvb3N0IGxpa2UgMS42MiB5b3Ugd2lsbCBuZWVkIGEgcmVjZW50IHZlcnNpb24gb2YgY21ha2UgKGF0IGxlYXN0IDMuNykuCisKK1RoZSBidWlsZC10aHJpZnQgc2NyaXB0IGhhcyBvcHRpb25zIHRvIGJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgYW5kIHRvIG9wdGlvbmFsbHkgZGlzYWJsZSBhbnkgb2YgdGhlIGdlbmVyYXRpb24gKGNtYWtlKSwgYnVpbGQsIG9yIHRlc3QgcGhhc2VzLiAgQnkgZGVmYXVsdCwgdGhlIGJhdGNoIGZpbGUgd2lsbCBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW5zaWRlIGB3b3Jrc3BhY2VcYnVpbGRgLCB0aGVuIHBlcmZvcm0gYSByZWxlYXNlIGJ1aWxkLCB0aGVuIHJ1biB0aGUgdW5pdCB0ZXN0cy4gIFRoZSBiYXRjaCBmaWxlIGFjY2VwdHMgc29tZSBvcHRpb24gZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6CisKKyAgICA6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKyAgICA6OgorICAgIDo6ICAgL0RFQlVHICAgICAgICAgICAgLSBpZiBidWlsZGluZywgcGVyZm9ybSBhIGRlYnVnIGJ1aWxkIGluc3RlYWQKKyAgICA6OiAgIC9OT0dFTkVSQVRFICAgICAgIC0gc2tpcCBjbWFrZSBnZW5lcmF0aW9uIC0gdXNlZnVsIGlmIHlvdQorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorICAgIDo6ICAgL05PQlVJTEQgICAgICAgICAgLSBza2lwIGNtYWtlIGJ1aWxkIC0gdXNlZnVsIGlmIHlvdSBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorICAgIDo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorCitGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB0aGUgY21ha2UgZW52aXJvbm1lbnQgd2l0aG91dCBidWlsZGluZyBvciBydW5uaW5nIHRlc3RzOgorCisgICAgQzpcd29ya3NwYWNlPiBidWlsZC10aHJpZnQuYmF0IC9OT0JVSUxEIC9OT1RFU1QKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNzkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBQcm9kdWNlcyBhIHByb2R1Y3Rpb24gdGhyaWZ0IGNvbXBpbGVyIHN1aXRhYmxlIGZvciByZWRpc3RyaWJ1dGlvbi4KKzo6IFRoZSBjb21waWxlciBpcyBsaW5rZWQgdG8gcnVudGltZSBzdGF0aWNhbGx5IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LgorOjogQXNzdW1lcyB0aGUgdGhpcmRwYXJ0eSBmaWxlcyBmb3IgIndpbmZsZXhiaXNvbiIgaGF2ZSBiZWVuIHBsYWNlZAorOjogYWNjb3JkaW5nIHRvIHRoZSBSRUFETUUubWQgaW5zdHJ1Y3Rpb25zLgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9dGhyaWZ0CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj1kZXYKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMHRoaXJkcGFydHkKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEdFTkVSQVRPUiBmb3IgQ01ha2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Z2VuZXJhdG9yLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEJVSUxEVFlQRSAoCisgIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorKQorCisgIFNFVCBCVUlMRERJUj0lfmRwMGJ1aWxkXCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFICV+ZHAwdGhyaWZ0IF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorICAgIC1EQklTT05fRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZSBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSVCVUlMRFRZUEUlIF4KKyAgICAtREZMRVhfRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlIF4KKyAgICAtRFdJVEhfTVQ9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiB8fCBFWElUIC9CCisKKyAgQ0QgJUJVSUxERElSJQorCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgdGhyaWZ0LWNvbXBpbGVyIHx8IEVYSVQgL0IKKyAgWENPUFkgL0YgL1kgJUJVSUxERElSJVxiaW5cJUJVSUxEVFlQRSVcdGhyaWZ0LmV4ZSAlT1VURElSJQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY3YWNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKQEAgLTAsMCArMSwxNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBHZW5lcmF0ZXMgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZvciB0aHJpZnQgYW5kIHRoZW4gYnVpbGRzIGl0LgorOjogQXNzdW1lcyB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgaGF2ZSBiZWVuIGJ1aWx0IG9yIHBsYWNlZCBhbHJlYWR5LgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorOjoKKzo6IE5vcm1hbGx5IHRoZSBzY3JpcHQgd2lsbCBydW4gY21ha2UgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbiwgdGhlbgorOjogcGVyZm9ybSBhIGJ1aWxkLCB0aGVuIHJ1biB0ZXN0cyBvbiB0aGUgY29tcGxldGUgdGhyaWZ0IGxpYnJhcnkKKzo6IGluIHJlbGVhc2UgbW9kZS4KKzo6Cis6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKzo6Cis6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gZGVidWcgaW5zdGVhZCBvZiByZWxlYXNlCis6OiAgIC9JREUgICAgICAgICAgICAgIC0gbGF1bmNoIFZpc3VhbCBTdHVkaW8gd2l0aCBhIHBhdGggc2V0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgdXAgY29ycmVjdGx5IHRvIHJ1biB0ZXN0cyBpbnN0ZWFkIG9mCis6OiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbnkgb3RoZXIgYWN0aW9ucywgaS5lLgorOjogICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc2V0dGluZyB0aGUgbmV4dCB0aHJlZSBmbGFncworOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKzo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJ1aWxkCis6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorOjogICAvTk9URVNUICAgICAgICAgICAtIHNraXAgY3Rlc3QgZXhlY3V0aW9uCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCis6OiBEZWZhdWx0cworCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgU0VUIEJVSUxEVFlQRT1SZWxlYXNlCitTRVQgT1BUX0lERT0wCitTRVQgT1BUX0JVSUxEPTEKK1NFVCBPUFRfR0VORVJBVEU9MQorU0VUIE9QVF9URVNUPTEKKworOjogQXBwbHkgRmxhZ3MKKworSUYgL0kgIiUxIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUyIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUzIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUxIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUyIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUzIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUxIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTIiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMyIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUxIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTIiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMyIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUxIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKK0lGIC9JICIlMiIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTMiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorCitJRiAlT1BUX0lERSUgPT0gMSAoCisgIFNFVCBPUFRfR0VORVJBVEU9MAorICBTRVQgT1BUX0JVSUxEPTAKKyAgU0VUIE9QVF9URVNUPTAKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwKKyAgU0VUIE9VVERJUj0lfmRwMGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcCisgIFNFVCBCT09TVF9MSUJESVI9bGliJUFSQ0g6fi0yLDIlLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4wCisgIElGICIlQlVJTERUWVBFJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfU1RBVElDX1NVRkZJWD1kKQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICBDb25maWd1cmF0aW9uOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTolQlVJTERUWVBFJSAiJUdFTkVSQVRPUiUiCitJRiBERUZJTkVEIENPTVBJTEVST05MWSAoCisgIEVDSE8gICAgICAgICAgICAgICAgICAgIENPTVBJTEVSIE9OTFkKKykKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogJUJVSUxERElSJQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAlT1VURElSJQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworSUYgJU9QVF9JREUlID09IDEgKAorCisgIENBTEwgOlNFVFJVTlBBVEggfHwgRVhJVCAvQgorICBDQUxMIERFVkVOViAiIUJVSUxERElSIUFwYWNoZSBUaHJpZnQuc2xuIiB8fCBFWElUIC9CCisgIEVYSVQgL0IKKyAgCispCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKK0lGICVPUFRfR0VORVJBVEUlID09IDEgKAorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiUgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JU9VVERJUiUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSVXSU4zUF9ST09UJVxkaXN0XG1zaW50dHlwZXMgXgorICAgIC1ETElCRVZFTlRfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxsaWJldmVudC0lVFBfTElCRVZFTlRfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSUgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0lV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXGR5bmFtaWMgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIF4KKyAgICAtRFpMSUJfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAgIC1EV0lUSF9TVEFUSUNfTElCPU9OIHx8IEVYSVQgL0IKKworKQorCitJRiAlT1BUX0JVSUxEJSA9PSAxICgKKworICBDRCAlQlVJTERESVIlCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgSU5TVEFMTCB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9URVNUJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCBSVU5fVEVTVFMgfHwgRVhJVCAvQgorICAKKykKKworOlNFVFJVTlBBVEgKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJVwlQk9PU1RfTElCRElSJQorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljXGJpbgorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxiaW4KKyAgRVhJVCAvQgorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKQEAgLTAsMCArMSw0NyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgYXJjaGl0ZWN0dXJlIHdlJ3JlIGJ1aWxkaW5nIGZvci4KKzo6IFNldCB0aGUgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHdpbjMyCis6OiAgIHg2NAorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQVJDSCBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQVJDSCAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBUkNICisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyB4NjQKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChTRVQgQVJDSD14NjQpIEVMU0UgKFNFVCBBUkNIPXdpbjMyKQorCitJRiBOT1QgREVGSU5FRCBBUkNIICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlICVBUkNIJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IiBmb3IgJTElIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA1ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNTggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4uCis6OiBTZXQgdGhlIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTAwKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMTApCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEyMCkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTQwKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxNTApCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJS4iID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw2OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbiAKKzo6IHNldCB0aGUgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6Cis6OiAgVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTcgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTQgMjAxNSBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE1IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTIgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTAgMjAxMCBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEwIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiSUE2NCIuCis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEdFTkVSQVRPUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6Cis6OiBSZXF1aXJlcyBjbF9zZXRhcmNoLmJhdCB0byBoYXZlIGJlZW4gZXhlY3V0ZWQgb3IgdGhlIEFSQ0ggZW52aXJvbm1lbnQKKzo6IHZhcmlhYmxlIHRvIGJlIHNldC4KKzo6CisKK0lGICIlQVJDSCUiID09ICJ4NjQiIChTRVQgR0VOQVJDSD0gV2luNjQpCisKK0lGIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEdFTkVSQVRPUgorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgMTYKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxNworSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTEgMjAxMiVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE4CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMDAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOS4xMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyVHRU5BUkNIJSkKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIENNYWtlIGdlbmVyYXRvciB0byB1c2UKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSB1c2luZyBDTWFrZSBnZW5lcmF0b3IgICAgICAgICVHRU5FUkFUT1IlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYzg2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0CkBAIC0wLDAgKzEsMjQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBTZXQgdGhlIHZlcnNpb25zIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byB1c2UuCis6OgorCitJRiBOT1QgREVGSU5FRCBUUF9CT09TVF9WRVJTSU9OICAgIFNFVCBUUF9CT09TVF9WRVJTSU9OPTFfNjJfMAorSUYgTk9UIERFRklORUQgVFBfTElCRVZFTlRfVkVSU0lPTiBTRVQgVFBfTElCRVZFTlRfVkVSU0lPTj0yLjEuN3JjMgorSUYgTk9UIERFRklORUQgVFBfT1BFTlNTTF9WRVJTSU9OICBTRVQgVFBfT1BFTlNTTF9WRVJTSU9OPTEuMS4wYworSUYgTk9UIERFRklORUQgVFBfWkxJQl9WRVJTSU9OICAgICBTRVQgVFBfWkxJQl9WRVJTSU9OPTEuMi45CisKK0VYSVQgL0IgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNTA1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKQEAgLTAsMCArMSw4NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgbGliZXZlbnQgb24gd2luZG93cworOjogVXNlIGxpYmV2ZW50IG1hc3RlciBmcm9tIGdpdGh1YiB3aGljaCBoYXMgY21ha2UgaW50ZWdyYXRpb24KKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIKKzo6Cis6OiBDcmVhdGVzIGEgc3RhdGljIGxpbmsgbGlicmFyeS4KKzo6IExpbmtzIGFnYWluc3QgT3BlblNTTCBhbmQgemxpYiBzdGF0aWNhbGx5LgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLWxpYmV2ZW50LmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1saWJldmVudAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX0xJQkVWRU5UX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VESVIgICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKFNFVCBaTElCX0xJQl9TVUZGSVg9ZCkKKworICBTRVQgQ01BS0VfREVGUz1eCisgICAtREVWRU5UX19ESVNBQkxFX1NBTVBMRVM9T04gXgorICAgLURFVkVOVF9fRElTQUJMRV9URVNUUz1PTiBeCisgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIVxkeW5hbWljIF4KKyAgIC1EWkxJQl9MSUJSQVJZPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcbGliXHpsaWIhWkxJQl9MSUJfU1VGRklYIS5saWIgXgorICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSB2JVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IUJVSUxEVFlQRSEgIiVHRU5FUkFUT1IlIgorICBFQ0hPIENNYWtlIERlZmluaXRpb25zOiAhQ01BS0VfREVGUyEKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisgIAorICBNS0RJUiAiIUJVSUxERElSISIKKyAgQ0QgIiFCVUlMRERJUiEiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgLUciJUdFTkVSQVRPUiUiIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IU9VVERJUiEgLURDTUFLRV9CVUlMRF9UWVBFPSFCVUlMRFRZUEUhICFDTUFLRV9ERUZTISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0CkBAIC0wLDAgKzEsMTA2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciBvcGVuc3NsIG9uIHdpbmRvd3MKKzo6IG9wZW5zc2wgdXNlcyBhbiBpbi10cmVlIGJ1aWxkIHNvIHlvdSBoYXZlIHRvIGNsZWFuIGJldHdlZW4gZWFjaCBvbmUKKzo6Cis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogSWYgeW91IHVzZSBMYXZhc29mdCBBZC1Bd2FyZSwgZGlzYWJsZSBpdCBmb3IgdGhpcyBidWlsZC4gIEl0IGJsb2NrcyB0aGUgY3JlYXRpb24KKzo6IG9mIGFueSBmaWxlIG5hbWVkICJjbGllbnRoZWxsb3Rlc3QuZXhlIiBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLW9wZW5zc2wuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1vcGVuc3NsCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfT1BFTlNTTF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgIiVBUkNIJSIgPT0gIng2NCIgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU42NEEgVkMtV0lONjRBCispIEVMU0UgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU4zMiBWQy1XSU4zMgorKQorCitGT1IgJSVYIElOICggIVRPRE8hICkgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBGT1IgJSVZIElOICgKKyAgICBudAorICAgIG50ZGxsCisgICkgRE8gKAorICAgIFNFVCBMSUJUWVBFPSUlWQorCisgICAgSUYgIiFCVUlMRFRZUEU6fjAsNiEiID09ICJkZWJ1Zy0iICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9ZGVidWcKKyAgICAgIFNFVCBaTElCTElCU1VGRklYPWQKKyAgICApIEVMU0UgKAorICAgICAgU0VUIE9VVEJVSUxEVFlQRT1yZWxlYXNlCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD0KKyAgICApCisKKyAgICBJRiAiIUxJQlRZUEUhIiA9PSAibnRkbGwiICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9ZHluYW1pYworICAgICAgU0VUIFpMSUJMSUI9emxpYiFaTElCTElCU1VGRklYIQorICAgICAgU0VUIFpMSUJPUFQ9emxpYi1keW5hbWljCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPW5vLXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9c3RhdGljCisgICAgICBTRVQgWkxJQkxJQj16bGlic3RhdGljIVpMSUJMSUJTVUZGSVghLmxpYgorICAgICAgU0VUIFpMSUJPUFQ9emxpYgorICAgICkKKworICAgIFNFVCBMSUI9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcbGliOyFMSUIhCisgICAgU0VUIEJVSUxEX09QVElPTlM9IUJVSUxEX09QVElPTlMhIG5vLWFzbSBuby11bml0LXRlc3QgIVpMSUJPUFQhIC0tb3BlbnNzbGRpcj1zc2wgLS13aXRoLXpsaWItaW5jbHVkZT0lfmRwMC4uXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwhQ09NUElMRVIhXCFBUkNIIVxpbmNsdWRlIC0td2l0aC16bGliLWxpYj0hWkxJQkxJQiEKKyAgICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFPVVRCVUlMRFRZUEUhXCFPVVRMSUJUWVBFIQorCisgICAgRUNITy8KKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohT1VUQlVJTERUWVBFITohT1VUTElCVFlQRSEgWyFCVUlMRFRZUEUhXQorICAgIEVDSE8gQ29uZmlndXJlIE9wdGlvbnM6ICFCVUlMRF9PUFRJT05TIQorICAgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgICAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPLworCisgICAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICAgKQorCisgICAgQ0QgJVNPVVJDRURJUiUgfHwgRVhJVCAvQgorICAgIHBlcmwgQ29uZmlndXJlICFCVUlMRFRZUEUhIC0tcHJlZml4PSIhT1VURElSISIgIUJVSUxEX09QVElPTlMhIHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGluc3RhbGxfc3cgfHwgRVhJVCAvQgorICAgIE5NQUtFIC9GTWFrZWZpbGUgY2xlYW4gfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDc1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciB6bGliIG9uIHdpbmRvd3MuCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLXpsaWIuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgICAgICAgU0VUIEdFTkVSQVRPUj1OTWFrZSBNYWtlZmlsZXMKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXpsaWIKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9aTElCX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiFCVUlMRERJUiFcemxpYmQucGRiIiAiIU9VVERJUiFcYmluXCIgfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9jbGVhbnVwLnNoIGIvY2xlYW51cC5zaAppbmRleCAwZWE1NWJiLi5mMTEwNzIxIDEwMDc1NQotLS0gYS9jbGVhbnVwLnNoCisrKyBiL2NsZWFudXAuc2gKQEAgLTMyLDYgKzMyLDExIEBACiBNYWtlZmlsZSBcCiBNYWtlZmlsZS5pbiBcCiBNYWtlZmlsZS5vcmlnIFwKK2FjbG9jYWwvbGlidG9vbC5tNCBcCithY2xvY2FsL2x0b3B0aW9ucy5tNCBcCithY2xvY2FsL2x0c3VnYXIubTQgXAorYWNsb2NhbC9sdHZlcnNpb24ubTQgXAorYWNsb2NhbC9sdH5vYnNvbGV0ZS5tNCBcCiBhY2xvY2FsLm00IFwKIGF1dG9tNHRlLmNhY2hlIFwKIGF1dG9zY2FuLmxvZyBcCkBAIC01NSw0ICs2MCwzMCBAQAogbWlzc2luZyBcCiB5bHdyYXAgXAogaWYvZ2VuLSogXAotdGVzdC9nZW4tKgordGVzdC9nZW4tKiBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sLy5kZXBzIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZS5mcmFnbWVudHMgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZS5nbG9iYWwgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZS5vYmplY3RzIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYWNpbmNsdWRlLm00IFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYWNsb2NhbC5tNCBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2F1dG9tNHRlLmNhY2hlIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYnVpbGQgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuZ3Vlc3MgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuaCBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5oLmluIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLmxvZyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5uaWNlIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnN0YXR1cyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5zdWIgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4gXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9pbmNsdWRlIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvaW5zdGFsbC1zaCBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9sdG1haW4uc2ggXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9taXNzaW5nIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWtpbnN0YWxsZGlycyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmNzkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIyMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfRk9STUFUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBDcmVhdGUgdGhlIHRocmlmdCBjb21waWxlcgorc2V0KGNvbXBpbGVyX2NvcmUKKyAgICBzcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCitzZXQodGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfTEFOR1MKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9MQU5HUyAke25hbWV9KQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGNfZ2xpYiAgIkVuYWJsZSBjb21waWxlciBmb3IgQyB3aXRoIEdsaWIiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoYXMzICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBBY3Rpb25TY3JpcHQgMyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjb2NvYSAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIE9iamVjdGl2ZS1DIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIob2NhbWwgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBPQ2FtbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBzcmMpCisKK2lmKE5PVCBERUZJTkVEIFdJVEhfUExVR0lOIE9SIE5PVCAke1dJVEhfUExVR0lOfSkKKyAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke2NvbXBpbGVyX2NvcmV9KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgJHt0aHJpZnQtY29tcGlsZXJfU09VUkNFU30pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1ib290c3RyYXAgJHtjb21waWxlcl9jb3JlfQorICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWJvb3RzdHJhcCBwYXJzZSkKKworICAgIHNldChQTFVHSU5fR0VOX1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKyAgICApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIERFUEVORFMgdGhyaWZ0LWJvb3RzdHJhcCBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgICAgIENPTU1BTkQgdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcAorICAgICAgICAtb3V0ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9saWIvY3BwL3NyYykKKworICAgIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQorICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRjCisgICAgICAgICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCisgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYworICAgICkKKyAgICBUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQodGhyaWZ0YyBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRjIHRocmlmdCBQVUJMSUMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModGhyaWZ0LWNvbXBpbGVyIFBVQkxJQyBUSFJJRlRfRU5BQkxFX1BMVUdJTikKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0LWNvbXBpbGVyIHRocmlmdGMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnQpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtY29tcGlsZXIgcGFyc2UpCisKK2luc3RhbGwoVEFSR0VUUyB0aHJpZnQtY29tcGlsZXIgREVTVElOQVRJT04gYmluKQorCitpZigke1dJVEhfUExVR0lOfSkKKyAgIyBJbnN0YWxsIHRoZSBoZWFkZXJzCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L2NvbW1vbi5oIgorICAgICAgInNyYy90aHJpZnQvZ2xvYmFscy5oIgorICAgICAgInNyYy90aHJpZnQvbG9nZ2luZy5oIgorICAgICAgInNyYy90aHJpZnQvbWFpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGxhdGZvcm0uaCIKKyAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbXBpbGVyL2NwcC90aHJpZnQvdmVyc2lvbi5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2F1ZGl0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9nZW5lcmF0ZSIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BhcnNlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9wbHVnaW4iKQoraWYoTVNWQykKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC93aW5kb3dzIikKK2VuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KaW5kZXggNGU3YjljMC4uMGI4ZWYyZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisrKyBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQpAQCAtMjEsMTAxICsyMSwxODcgQEAKICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KIAotQU1fWUZMQUdTID0gLWQKLUJVSUxUX1NPVVJDRVMgPQorQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKKyMgTm90ZSBvbiB3aHkgd2UgaGF2ZSBzcmMvdGhyaWZ0IGFuZCBzcmMvdGhyaWZ0L3BsdWdpbiBkaXJlY3RvcmllczoKKyMgU2luY2UgQXV0b21ha2Ugc3VwcG9ydHMgb25seSBvbmUgc2V0IG9mIEJVSUxUX1NPVVJDRVMgcGVyIGZpbGUgYW5kIGRvZXMgbm90IGFsbG93CisjIFNVQkRJUlMgYnVpbHQgYmVmb3JlIEJVSUxUX1NPVVJDRVMsIHdlIGVuZCB1cCBzZXBhcmF0ZSBNYWtlZmlsZS5hbSBmb3IgZWFjaCBzb3VyY2UKKyMgY29kZSBnZW5lcmF0aW9uLCBpLmUuIGxleC15YWNjIGFuZCBUaHJpZnQsIHRvIGFjaGlldmUgc3RhYmxlIHBhcmFsbGVsIG1ha2UuCisKK1NVQkRJUlMgPSBzcmMgc3JjL3RocmlmdC9wbHVnaW4gLgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgogCiBiaW5fUFJPR1JBTVMgPSB0aHJpZnQKIAogdGhyaWZ0X09CSkRJUiA9IG9iagogCi10aHJpZnRfU09VUkNFUyA9IHNyYy90aHJpZnR5Lnl5IFwKLSAgICAgICAgICAgICAgICAgc3JjL3RocmlmdGwubGwgXAotICAgICAgICAgICAgICAgICBzcmMvbWFpbi5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dsb2JhbHMuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tYWluLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGxhdGZvcm0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2RvYy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb250YWluZXIuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2xpc3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3NldC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfbWFwLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zdHJ1Y3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2ZpZWxkLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zZXJ2aWNlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9mdW5jdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfcHJvZ3JhbS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2NvcGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKK3BsdWdpbl9nZW4gPSBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmNwcAogCi1pZiBUSFJJRlRfR0VOX2NwcAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5famF2YQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2FzMwotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fY3NoYXJwCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9weQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9yYgotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9wZXJsCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fcGhwCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9lcmwKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2NvY29hCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3N0Ci10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX29jYW1sCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2hzCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3hzZAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5faHRtbAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2pzCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKK2NvbXBpbGVyX2NvcmUgPSAgc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKKwordGhyaWZ0X1NPVVJDRVMgPSBzcmMvdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbWFpbi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaAorCisjIFNwZWNpZmljIGNsaWVudCBnZW5lcmF0b3Igc291cmNlCit0aHJpZnRfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCisKK3RocmlmdF9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwordGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLVdlcnJvcgordGhyaWZ0X0xEQUREID0gQExFWExJQkAgc3JjL3RocmlmdC9saWJwYXJzZS5hCisKK2lmICFXSVRIX1BMVUdJTgordGhyaWZ0X1NPVVJDRVMgKz0gJChjb21waWxlcl9jb3JlKQorZWxzZQorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnRjLmxhCisKK3RocmlmdF9DUFBGTEFHUyArPSAtRFRIUklGVF9FTkFCTEVfUExVR0lOPTEKK3RocmlmdF9MREFERCArPSBsaWJ0aHJpZnRjLmxhCisKK25vZGlzdF9saWJ0aHJpZnRjX2xhX1NPVVJDRVMgPSAkKHBsdWdpbl9nZW4pCitsaWJ0aHJpZnRjX2xhX1NPVVJDRVMgPSAkKGNvbXBpbGVyX2NvcmUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworCisKK2xpYnRocmlmdGNfbGFfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMgLUlzcmMgLUkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9zcmMgLURUSFJJRlRfRU5BQkxFX1BMVUdJTj0xCitsaWJ0aHJpZnRjX2xhX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK2xpYnRocmlmdGNfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK2luY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQKK2luY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsYXRmb3JtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdmVyc2lvbi5oCisKK2luY2x1ZGVfYXVkaXRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS93aW5kb3dzCitpbmNsdWRlX2F1ZGl0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaAorCitpbmNsdWRlX2dlbmVyYXRlZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvZ2VuZXJhdGUKK2luY2x1ZGVfZ2VuZXJhdGVfSEVBREVSUyA9IHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKKworaW5jbHVkZV9wYXJzZWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3BhcnNlCitpbmNsdWRlX3BhcnNlX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCisKK2luY2x1ZGVfcGx1Z2luZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcGx1Z2luCitpbmNsdWRlX3BsdWdpbl9IRUFERVJTID0gc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKKworaW5jbHVkZV93aW5kb3dzZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvd2luZG93cworaW5jbHVkZV93aW5kb3dzX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKIGVuZGlmCiAKLXRocmlmdF9DWFhGTEFHUyA9IC1XYWxsIC1JJChzcmNkaXIpL3NyYyAkKEJPT1NUX0NQUEZMQUdTKQotdGhyaWZ0X0xERkxBR1MgPSAtV2FsbCAkKEJPT1NUX0xERkxBR1MpCitXSU5ET1dTX0RJU1QgPSBcCisgICAgICAgICAgICAgY29tcGlsZXIuc2xuIFwKKyAgICAgICAgICAgICBjb21waWxlci52Y3hwcm9qIFwKKyAgICAgICAgICAgICBjb21waWxlci52Y3hwcm9qLmZpbHRlcnMKIAotdGhyaWZ0X0xEQUREID0gQExFWExJQkAKLQotRVhUUkFfRElTVCA9IFJFQURNRQorRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKyAgICAgICAgICAgICBSRUFETUUubWQgXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICB0ZXN0IFwKKyAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgdGhyaWZ0bC5jYyB0aHJpZnR5LmNjIHRocmlmdHkuaCB2ZXJzaW9uLmgKKwkkKFJNKSB2ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQogCi1zcmMvbWFpbi5jYzogdmVyc2lvbi5oCitzcmMvdGhyaWZ0L21haW4uY2M6IHNyYy90aHJpZnQvdmVyc2lvbi5oCisKK3N0eWxlLWxvY2FsOgorICAkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUgYi9jb21waWxlci9jcHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjEwMGE4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1UaHJpZnQgQ29kZSBDb21waWxlcgotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaHJpZnQgQ29kZSBDb21waWxlcgotPT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBjb21waWxlciB0YWtlcyB0aHJpZnQgZmlsZXMgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBvdXRwdXQgY29kZSBhY3Jvc3MKLXZhcmlvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBUbyBidWlsZCBhbmQgaW5zdGFsbCBpdCwgZG8gdGhpczoKLQotICAuL2Jvb3RzdHJhcC5zaAotICAuL2NvbmZpZ3VyZQotICBtYWtlCi0gIHN1ZG8gbWFrZSBpbnN0YWxsCi0KLUl0IHJlcXVpcmVzIHNvbWUgZm9ybSBvZiBMRVggYW5kIFlBQ0MgdG8gYmUgaW5zdGFsbGVkLCB3aGljaCBzaG91bGQgYmUKLXBpY2tlZCB1cCBieSBhdXRvY29uZi4KLQotTm90IG11Y2ggZWxzZSB0byByZXBvcnQgaGVyZS4gWW91J2xsIGhhdmUgdG8gbG9vayBhdCB0aGUgY29kZSB0byBnZXQgeW91cgotcXVlc3Rpb25zIGFuc3dlcmVkLiBPciBqdXN0IHJ1biB0aGUgZXhlY3V0YWJsZSBhZnRlciB5b3UgYnVpbGQgYW5kIHRha2UKLWEgbG9vayBhdCB0aGUgdXNhZ2UgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWFjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTc1IEBACisjIEJ1aWxkIFRocmlmdCBJREwgY29tcGlsZXIgdXNpbmcgQ01ha2UKKworPCEtLSBUT0MgLS0+CisKKy0gW0J1aWxkIFRocmlmdCBJREwgY29tcGlsZXIgdXNpbmcgQ01ha2VdKCNidWlsZC10aHJpZnQtaWRsLWNvbXBpbGVyLXVzaW5nLWNtYWtlKQorICAgIC0gW0J1aWxkIG9uIFVuaXgtbGlrZSBTeXN0ZW1dKCNidWlsZC1vbi11bml4LWxpa2Utc3lzdGVtKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgQ01ha2VdKCNidWlsZC11c2luZy1jbWFrZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggRWNsaXBzZSBJREVdKCNidWlsZC13aXRoLWVjbGlwc2UtaWRlKQorICAgICAgICAgICAgLSBbQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1NdKCNidWlsZC13aXRoLXhjb2RlLWlkZS1pbi1tYWNvcykKKyAgICAgICAgICAgIC0gW1VzYWdlIG9mIG90aGVyIElERXNdKCN1c2FnZS1vZi1vdGhlci1pZGVzKQorICAgIC0gW0J1aWxkIG9uIFdpbmRvd3NdKCNidWlsZC1vbi13aW5kb3dzKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtCdWlsZCB1c2luZyBHaXQgQmFzaF0oI2J1aWxkLXVzaW5nLWdpdC1iYXNoKQorICAgICAgICAtIFtVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbl0oI3VzaW5nLXZpc3VhbC1zdHVkaW8tYW5kLXdpbi1mbGV4LWJpc29uKQorICAgICAgICAtIFtDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFja10oI2Nyb3NzLWNvbXBpbGUtdXNpbmctbWluZ3czMi1hbmQtZ2VuZXJhdGUtYS13aW5kb3dzLWluc3RhbGxlci13aXRoLWNwYWNrKQorLSBbT3RoZXIgY2FzZXNdKCNvdGhlci1jYXNlcykKKyAgICAtIFtCdWlsZGluZyB0aGUgVGhyaWZ0IElETCBjb21waWxlciBpbiBXaW5kb3dzIHdpdGhvdXQgQ01ha2VdKCNidWlsZGluZy10aGUtdGhyaWZ0LWlkbC1jb21waWxlci1pbi13aW5kb3dzLXdpdGhvdXQtY21ha2UpCistIFtVbml0IHRlc3RzIGZvciBjb21waWxlcl0oI3VuaXQtdGVzdHMtZm9yLWNvbXBpbGVyKQorICAgIC0gW1VzaW5nIGJvb3N0IHRlc3RdKCN1c2luZy1ib29zdC10ZXN0KQorICAgIC0gW1VzaW5nIENhdGNoIEMrKyB0ZXN0IGxpYnJhcnldKCN1c2luZy1jYXRjaC1jLXRlc3QtbGlicmFyeSkKKy0gW0hhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzXSgjaGF2ZS1hLWhhcHB5LWZyZWUtdGltZS1hbmQtaG9saWRheXMpCisKKzwhLS0gL1RPQyAtLT4KKworIyMgQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbQorCisjIyMgUHJlcmVxdWlzaXRlcworLSBJbnN0YWxsIENNYWtlCistIEluc3RhbGwgZmxleCBhbmQgYmlzb24KKworIyMjIEJ1aWxkIHVzaW5nIENNYWtlCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC4uCittYWtlCitgYGAKKworIyMjIyBCdWlsZCB3aXRoIEVjbGlwc2UgSURFCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKK2NtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KK21ha2UKK2BgYAorCitOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLWVjIHVzaW5nIGVjbGlwc2UuCisKKyMjIyMgQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1MKKworLSBJbnN0YWxsL3VwZGF0ZSBmbGV4LCBiaXNvbiBhbmQgY21ha2Ugd2l0aCBicmV3CisKK2BgYAorYnJldyBpbnN0YWxsIGNtYWtlCiticmV3IGluc3RhbGwgYmlzb24KK2BgYAorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC1HICJYY29kZSIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyMgVXNhZ2Ugb2Ygb3RoZXIgSURFcworCitQbGVhc2UgY2hlY2sgbGlzdCBvZiBzdXBwb3J0ZWQgSURFIAorCitgYGAKK2NtYWtlIC0taGVscAorYGBgCisKKyMjIEJ1aWxkIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZSAtIGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLworLSBJbiBjYXNlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGhvdXQgR2l0IEJhc2ggLSBpbnN0YWxsIHdpbmZsZXhiaXNvbiAtIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIFZpc3VhbCBTdHVkaW8gLSBpbnN0YWxsIFZpc3VhbCBTdHVkaW8gCisgIC0gQmV0dGVyIHRvIHVzZSB0aGUgbGF0ZXN0IHN0YWJsZSBWaXN1YWwgU3R1ZGlvIENvbW11bml0eSBFZGl0aW9uIC0gaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpIC0gTWljcm9zb2Z0IGFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgQ01ha2UgYW5kIGltcHJvdmluZyBpdCBpbiBWaXN1YWwgU3R1ZGlvCisKKyMjIyBCdWlsZCB1c2luZyBHaXQgQmFzaAorCitHaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbgorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyBVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbgorCistIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZvciB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gd2hpY2ggeW91IGhhdmUgKCoqY21ha2UgLS1oZWxwKiogY2FuIHNob3cgbGlzdCBvZiBzdXBwb3J0YWJsZSBWUyB2ZXJzaW9ucyk6CistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2BgYAorLSBOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLXZzIHVzaW5nIFZpc3VhbCBTdHVkaW8uCisKKyMjIyBDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFjaworCitgYGAKK21rZGlyIGNtYWtlLW1pbmd3MzIgJiYgY2QgY21ha2UtbWluZ3czMgorY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAtREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIC4uCitjcGFjaworYGBgCisKKyMgT3RoZXIgY2FzZXMKKworIyMgQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBDTWFrZSB5b3UgY2FuIHVzZSB0aGUgYWxyZWFkeSBhdmFpbGFibGUgVmlzdWFsIFN0dWRpbyAyMDEwIHNvbHV0aW9uLgorCitUaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUgdGhyaWZ0bC5jYywgdGhyaWZ0eS5jYyBhbmQgdGhyaWZ0eS5oaCBmaWxlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBjb21waWxlci4gCisKK1RoZXNlIGRlcGVuZCBvbiBiaXNvbiwgZmxleCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIHRvIHdvcmsgcHJvcGVybHkuCisKK0Rvd25sb2FkIGZsZXggJiBiaXNvbiBhcyBkZXNjcmliZWQgYWJvdmUuIAorCitQbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGggYW5kIHJlbmFtZSB3aW5fZmxleC5leGUgYW5kIHdpbl9iaXNvbi5leGUgdG8gZmxleC5leGUgYW5kIGJpc29uLmV4ZSByZXNwZWN0aXZlbHkuCisKK0lmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsIHByZS1idWlsZCBzdGVwcy4KKworT3BlbiBjb21waWxlci5zbG4gYW5kIHJlbW92ZSB0aGUgUHJlLWJ1aWxkIGNvbW1hbmRzIHVuZGVyIHRoZSBwcm9qZWN0J3M6IFByb3BlcnRpZXMgLT4gQnVpbGQgRXZlbnRzIC0+IFByZS1CdWlsZCBFdmVudHMuCisKK0Zyb20gYSBjb21tYW5kIHByb21wdDoKK2BgYAorY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAorZmxleCAtbyBzcmNcdGhyaWZ0XHRocmlmdGwuY2Mgc3JjXHRocmlmdFx0aHJpZnRsLmxsCitgYGAKK0luIHRoZSBnZW5lcmF0ZWQgdGhyaWZ0bC5jYywgY29tbWVudCBvdXQgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitQbGFjZSBhIGNvcHkgb2YgYmlzb24uc2ltcGxlIGluIHRocmlmdC9jb21waWxlci9jcHAKK2BgYAorYmlzb24gLXkgLW8gInNyYy90aHJpZnQvdGhyaWZ0eS5jYyIgLS1kZWZpbmVzIHNyYy90aHJpZnQvdGhyaWZ0eS55eQorbW92ZSBzcmNcdGhyaWZ0XHRocmlmdHkuY2MuaGggIHNyY1x0aHJpZnRcdGhyaWZ0eS5oaAorYGBgCisKK0Jpc29uIG1pZ2h0IGdlbmVyYXRlIHRoZSB5YWNjIGhlYWRlciBmaWxlICJ0aHJpZnR5LmNjLmgiIHdpdGgganVzdCBvbmUgaCAiLmgiIGV4dGVuc2lvbjsgaW4gdGhpcyBjYXNlIHlvdSdsbCBoYXZlIHRvIHJlbmFtZSB0byAidGhyaWZ0eS5oIi4KKworYGBgCittb3ZlIHNyY1x0aHJpZnRcdmVyc2lvbi5oLmluIHNyY1x0aHJpZnRcdmVyc2lvbi5oCitgYGAKKworRG93bmxvYWQgaW50dHlwZXMuaCBmcm9tIHRoZSBpbnRlcndlYnMgYW5kIHBsYWNlIGl0IGluIGFuIGluY2x1ZGUgcGF0aAorbG9jYXRpb24gKGUuZy4gdGhyaWZ0L2NvbXBpbGVyL2NwcC9zcmMpLgorCitCdWlsZCB0aGUgY29tcGlsZXIgaW4gVmlzdWFsIFN0dWRpby4KKworIyBVbml0IHRlc3RzIGZvciBjb21waWxlcgorCisjIyBVc2luZyBib29zdCB0ZXN0CistIHBscyBjaGVjayAqKnRlc3QqKiBmb2xkZXIKKworIyMgVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeQorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworLSBwbHMgY2hlY2sgKip0ZXN0cyoqIGZvbGRlcgorCisjIEhhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwODk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNCBAQAorIyMgQ29tcGlsZXIgQ29kaW5nIFN0YW5kYXJkcworCisgKiBXaGVuIG1ha2luZyBzbWFsbCBjaGFuZ2UgLyBidWdmaXggLSBmb2xsb3cgc3R5bGUgYXMgc2VlbiBpbiBuZWFyYnkgY29kZS4KKyAqIFdoZW4gbWFraW5nIG1ham9yIHJlZmFjdG9yIGFuZCAvIG9yIGFkZGluZyBuZXcgZmVhdHVyZSAtIGZvbGxvdyBzdHlsZSBmb3IgQysrIGxpYnJhcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIuc2xuIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2MWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnNsbgpAQCAtMCwwICsxLDIwIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJjb21waWxlciIsICJjb21waWxlci52Y3hwcm9qIiwgIns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvaiBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjhiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagpAQCAtMCwwICsxLDI1MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29tbW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb29wX2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdsb2JhbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcbWFpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2Jhc2VfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3RfdmFsdWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb250YWluZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9kb2MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZW51bV92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2ZpZWxkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZnVuY3Rpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9saXN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfbWFwLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfcHJvZ3JhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3Njb3BlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2VydmljZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3NldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3N0cnVjdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlZGVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuaGgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHZlcnNpb24uaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfYXMzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jb2NvYV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY3BwX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X25ldGNvcmVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NfZ2xpYl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9lcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X29jYW1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3B5X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcnNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9zd2lmdF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfeG1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxtYWluLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVxwYXJzZS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlZGVmLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnRsLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5LmNjIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwubGwiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5Lnl5IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmNvbXBpbGVyPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Njg2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTk5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnbG9iYWxzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWFpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfYmFzZV90eXBlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29uc3QuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb25zdF92YWx1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnRhaW5lci5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2RvYy5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW0uaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9lbnVtX3ZhbHVlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZmllbGQuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9mdW5jdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2xpc3QuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9tYXAuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9wcm9ncmFtLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2NvcGUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2V0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc3RydWN0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGVkZWYuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnR5LmhoIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcY29uZmlnLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1x2ZXJzaW9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YWU5ZDBhMTUtNTdhZS00ZjAxLTg3YTQtODFmNzkwMjQ5YjgzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InBhcnNlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns1ZGYwMTZiYi01OTFiLTQyMGEtYTUzNS00MzMwZDkxODdmYmZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iZ2VuZXJhdGUiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2I1YzYyNmFmLWFmYTUtNDMzYy04ZTEwLWVlNzM0NTMzY2I2OH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29jYW1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3B5X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcnNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zd2lmdF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeHNkX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtYWluLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHBhcnNlLmNjIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRsLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlZGVmLmNjIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS55eSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJjNWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK0FNX1lGTEFHUyA9IC1kCisKK0JVSUxUX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS5jYworCitub2luc3RfTElCUkFSSUVTID0gdGhyaWZ0L2xpYnBhcnNlLmEKKwordGhyaWZ0X2xpYnBhcnNlX2FfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKQordGhyaWZ0X2xpYnBhcnNlX2FfQ1hYRkxBR1MgPSAtV2FsbCAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZAorCit0aHJpZnRfbGlicGFyc2VfYV9TT1VSQ0VTID0gdGhyaWZ0L3RocmlmdHkueXkgXAorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0L3RocmlmdGwubGwKKworY2xlYW4tbG9jYWw6CisJJChSTSkgdGhyaWZ0L3RocmlmdGwuY2MgdGhyaWZ0L3RocmlmdHkuY2MgdGhyaWZ0L3RocmlmdHkuaCB0aHJpZnQvdGhyaWZ0eS5oaAorCitpZiBXSVRIX1BMVUdJTgorbm9pbnN0X1BST0dSQU1TID0gdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKwordGhyaWZ0X3RocmlmdF9ib290c3RyYXBfU09VUkNFUyA9IFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2NvbW1vbi5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvcGFyc2UuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvd2luZG93cy9jb25maWcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC92ZXJzaW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9tYWluLmNjCisKK21haW4uY2M6IHZlcnNpb24uaAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9MREFERCA9IEBMRVhMSUJAIHRocmlmdC9saWJwYXJzZS5hCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmYmI1MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2MDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEFTMyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfYXMzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9hczNfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYmluZGFibGUiKTsKLSAgICBiaW5kYWJsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tYXMzIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIC8vcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0gIC8vcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0gIAotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBhczNfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgYm9vbCBiaW5kYWJsZV87CQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEFzMyB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArCi0gICAgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBBczMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikge30KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuYXMiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBhczNfcGFja2FnZSgpIDw8IGVuZGw7Ci0gIAotICBzY29wZV91cChmX2VudW0pOwotICAvLyBBZGQgYXMzIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsKLSAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8Ci0gICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGluZGVudChmX2VudW0pIDw8Ci0gICAgICAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gcG9wdWxhdGUgc2V0Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2VudW0gPDwgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTFVFU19UT19OQU1FUzpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiVkFMVUVTX1RPX05BTUVTWyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdID0gXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICB9Ci0gIGZfZW51bSA8PCBlbmRsOwotICAKLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCi0gIAotICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBwYWNrYWdlCi0gIAotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9Db25zdGFudHMuYXMiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX2NvbnN0cyk7Ci0gIGZfY29uc3RzIDw8IGVuZGw7Ci0gIAotICBmX2NvbnN0cyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7Ci0KLSAKLSAgCi0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAicHVibGljIGNsYXNzIENvbnN0YW50cyB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIAotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgY29uc3QgIik7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotICAKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotICAKLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuYXMiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLSAgCi0gIGZfc3RydWN0IDw8Ci0gICAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIAotICBpZiAoYmluZGFibGVfICYmICEgaXNfZXhjZXB0aW9uKSB7Ci0gICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOwotICB9Ci0gIAotICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICAKLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7IC8vIGVuZCBvZiBwYWNrYWdlCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgYm9vbCBiaW5kYWJsZSA9ICEgaXNfZXhjZXB0aW9uICYmICEgaW5fY2xhc3MgJiYgYmluZGFibGVfOwotCi0gIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgICAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7Ci0gIH0KLSAgZWxzZSBpZiAoYmluZGFibGUpIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBjb25zdCBTVFJVQ1RfREVTQzpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtYXMzLCBwcml2YXRlIGZvciAtYXMzYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0M6VEZpZWxkID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOmludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpewotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiIDw8ICBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLSAgCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PAotICAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gICAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCi0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOyAgCi0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIAotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IAotICB9ICAKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCi0gIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQ6aW50KTpCb29sZWFuIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBBczMgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLSAgICAgICAgCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoKToiIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBzdGQ6OnN0cmluZyBwcm9wTmFtZSA9IHRtcCgidGhyaWZ0UHJvcGVydHlDaGFuZ2UiKTsKLSAgICBpZiAoYmluZGFibGUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbQmluZGFibGUoZXZlbnQ9XCIiIDw8IHByb3BOYW1lIDw8ICJcIildIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUKLSAgICAgIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIik6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLSAgICAKLSAgICBpZiAoYmluZGFibGUpIHsKLSAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgY3VzdG9tIGV2ZW50IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBiZWNhdXNlIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQsCi0gICAgICAvLyB0aGUgc2V0dGVyIG9ubHkgZ2V0cyBjYWxsZWQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIC0gdGhpcyBtZWFucyBjYWxsaW5nIGZvby5zZXRJbnRWYWx1ZSgwKQotICAgICAgLy8gd2lsbCBub3QgY2F1c2UgZm9vLmlzSW50VmFsdWVTZXQoKSB0byByZXR1cm4gdHJ1ZSBzaW5jZSB0aGUgdmFsdWUgb2YgZm9vLl9pbnRWYWx1ZSB3YXNuJ3QgY2hhbmdlZAotICAgICAgLy8gc28gdGhlIHNldHRlciB3YXMgbmV2ZXIgY2FsbGVkLgotICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpKTsiIDw8IGVuZGw7Ci0gICAgICAKLSAgICAgIC8vIEhvd2V2ZXIsIGlmIHlvdSBqdXN0IHVzZSBhIGN1c3RvbSBldmVudCwgdGhlbiBjb2xsZWN0aW9ucyB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGVsZW1lbnRzCi0gICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXkgbGlzdGVkIGZvciBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4gIFNvLCB3ZSBkaXNwYXRjaCBib3RoLgotICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudC5QUk9QRVJUWV9DSEFOR0UpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpOkJvb2xlYW4geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKSB7Ci0gIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChiaW5kYWJsZSA/ICJvdmVycmlkZSAiIDogIiIpIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOlN0cmluZyA9ICIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IG1ldGFEYXRhTWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICAvLyBQb3B1bGF0ZSBtYXAKLSAgICBzY29wZV91cChvdXQpOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICAgIH0KLQotICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YSAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotLyoqIAotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBhczMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2FzM190eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAiVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKXsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgICAKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAKLSAgICB9IGVsc2V7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9hczNfdHlwZV9zdHJpbmcodHlwZSk7Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAKLSAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyJJbXBsLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICAKLSAgZl9zZXJ2aWNlXyA8PAotICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gIGFzM190aHJpZnRfaW1wb3J0cygpOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIAotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIAotICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyJQcm9jZXNzb3IuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgICAKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHM7Ci0gIH0KLQotICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PAotICAgICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9wcm90ID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBvcHJvdF86VFByb3RvY29sOyIgIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAKLSAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZTpURXJyb3IpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAKLSAgICAgIAotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIn0pOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaWZhY2VfOiIgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgc3RyaW5nIG92ZXJyaWRlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZSA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOkJvb2xlYW4iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgaW5kZW50KCkgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotICAvLyBBUy0gSWYgYWxsIG1ldGhvZCBpcyBvbmV3YXk6Ci0gIC8vIGRvIHlvdSBoYXZlIGFuIG9wcm90PwotICAvLyBkbyB5b3UgeW91IG5lZWQgbnVsbGNoZWNrPwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBmbjpGdW5jdGlvbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgInByaXZhdGUgZnVuY3Rpb24gIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpOkZ1bmN0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIgotICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6Ijw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQ6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiTE9HR0VSLmVycm9yKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VE1hcCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VFNldCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRMaXN0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgotICoKLSAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCi0gKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOwotICAgIHN0cmluZyBjb3VudGVyID0gdG1wKCJfc2l6ZUNvdW50ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgY291bnRlciA8PCAiOmludCA9IDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIAotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIGNvdW50ZXIgPDwgIikpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5sZW5ndGgpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiLnRvQXJyYXkoKSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEFzMyB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBBczMgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgewotICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlNldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiQXJyYXkiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJieXRlW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCb29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiTnVtYmVyIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgaWYgKCEgdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKLSAgICAgIGFyZ3VtZW50cyArPSAiLCAiOwotICAgIH0KLSAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIAotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoYXMzLCAiQVMzIiwKLSIgICAgYmluZGFibGU6ICAgICAgICAgIEFkZCBbYmluZGFibGVdIG1ldGFkYXRhIHRvIGFsbCB0aGUgc3RydWN0IGNsYXNzZXMuXG4iCi0pOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjRiNTIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogT2JqZWN0aXZlLUMgY29kZSBnZW5lcmF0b3IuCi0gKgotICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCi0gKi8KLWNsYXNzIHRfY29jb2FfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2NvY29hX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImxvZ191bmV4cGVjdGVkIik7Ci0gICAgbG9nX3VuZXhwZWN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOyAgICAKLSAgICAKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jb2NvYSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRhaW5lcml6ZV9pdD1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24gKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGROYW1lPSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpc3ROYW1lKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4KCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGR5bmFtaWNfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgY2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotICBzdGQ6OnN0cmluZyBjb250YWluZXJpemUodF90eXBlICogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY29udGFpbmVyaXplKHRfZmllbGQgKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXhfOwotICBzdGQ6OnN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfaW1wbF87Ci0KLSAgYm9vbCBsb2dfdW5leHBlY3RlZF87Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgY29jb2FfcHJlZml4XyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpOwotCi0gIC8vIHdlIGhhdmUgYSAuaCBoZWFkZXIgZmlsZS4uLgotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IHByb2dyYW1fbmFtZV8rIi5oIjsKLSAgc3RyaW5nIGZfaGVhZGVyX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKStmX2hlYWRlcl9uYW1lOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9mdWxsbmFtZS5jX3N0cigpKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgY29jb2FfaW1wb3J0cygpIDw8Ci0gICAgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICAvLyAuLi5hbmQgYSAubSBpbXBsZW1lbnRhdGlvbiBmaWxlCi0gIHN0cmluZyBmX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiLm0iOwotICBmX2ltcGxfLm9wZW4oZl9pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pbXBsXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2ltcGxfIDw8Ci0gICAgY29jb2FfaW1wb3J0cygpIDw8Ci0gICAgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICAgICIjaW1wb3J0IFwiIiA8PCBmX2hlYWRlcl9uYW1lIDw8ICJcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgIiNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPlxuIiArCi0gICAgIlxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8VFByb3RvY29sLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VFByb3RvY29sVXRpbC5oPlxuIiArCi0gICAgIiNpbXBvcnQgPFRQcm9jZXNzb3IuaD5cbiIgKwotICAgICJcbiI7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiI2ltcG9ydCBcIiIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICIuaFwiIiArICJcbiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQotewotICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQotICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCi0gIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCi0gKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUKLSAqIGVudW0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCi0gKiB0aGUgZW51bSBwbHVzIGFuIHVuZGVyc2NvcmUgaXMgcHJlZml4ZWQgb250byBlYWNoIGVsZW1lbnQuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLiAgUHJpbWl0aXZlIHZhbHVlcwotICogY291bGQgaGF2ZSBiZWVuIHBsYWNlZCBvdXRzaWRlIHRoaXMgY2xhc3MsIGJ1dCBJIGp1c3QgcHV0Ci0gKiBldmVyeXRoaW5nIGluIGZvciBjb25zaXN0ZW5jeS4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKLSAgc3RyaW5nIGNvbnN0YW50c19jbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzIjsKLQotICBjb25zdF9pbnRlcmZhY2UgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCAiIDogTlNPYmplY3QgIjsKLSAgc2NvcGVfdXAoY29uc3RfaW50ZXJmYWNlKTsKLSAgc2NvcGVfZG93bihjb25zdF9pbnRlcmZhY2UpOwotCi0gIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgZGVmaW5lZC4KLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBjb25zdF9pbnRlcmZhY2UgPDwKLSAgICAgICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBjb25zdF9pbnRlcmZhY2UgPDwgIkBlbmQiOwotCi0gIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCi0gIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOwotCi0gIC8vIHN0YXRpYyB2YXJpYWJsZXMgaW4gdGhlIC5tIGhvbGQgYWxsIGNvbnN0YW50IHZhbHVlcwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBmX2ltcGxfIDw8Ci0gICAgICAic3RhdGljICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWU7Ci0gICAgaWYgKCF0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGZfaW1wbF8gPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfaW1wbF8gPDwgZW5kbDsKLQotICBmX2ltcGxfIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemUgY29tcGxleCBjb25zdGFudHMgd2hlbiB0aGUgY2xhc3MgaXMgbG9hZGVkCi0gIGZfaW1wbF8gPDwgIisgKHZvaWQpIGluaXRpYWxpemUgIjsKLSAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19jb250YWluZXIoKSB8fAotICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCktPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGZfaW1wbF8gPDwgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX2ltcGxfKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWU7Ci0gICAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0gICAgaW5kZW50KGZfaW1wbF8pIDw8ICJyZXR1cm4gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX2ltcGxfKTsKLSAgfQotCi0gIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJOU0V4Y2VwdGlvbiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiTlNPYmplY3QgIjsKLSAgfQotICBvdXQgPDwgIjxOU0NvZGluZz4gIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIG1lbWJlcnMgYXJlIHByb3RlY3RlZC4gIHRoaXMgaXMgcmVkdW5kYW50LCBidXQgZXhwbGljaXQuCi0gIC8vICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiQHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gbWVtYmVyIHZhcmlhbGJlcwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyKSA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIC8vIGlzc2V0IGZpZWxkcwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJCT09MIF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldDsiIDw8ICBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcHJvcGVydGllcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8ICIjaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUpIiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpbml0aWFsaXplciBmb3IgYWxsIGZpZWxkcwotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCBhbmQgd3JpdGUKLSAgb3V0IDw8ICItICh2b2lkKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZ2V0dGVycyBhbmQgc2V0dGVycwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHNpZ25hdHVyZSBmb3IgaW5pdGlhbGl6ZXIgb2Ygc3RydWN0IHdpdGggYSBwYXJhbWV0ZXIgZm9yCi0gKiBlYWNoIGZpZWxkLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBpbmRlbnQob3V0KSA8PCAiLSAoaWQpIGluaXRXaXRoIjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyApIHsKLSAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwKLSAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICArK21faXRlcjsKLSAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiICI7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBnZXR0ZXIgYW5kIHNldHRlciBkZWNsYXJhdGlvbnMgZm9yIGFsbCBmaWVsZHMsIHBsdXMgYW4KLSAqIElzU2V0IGdldHRlci4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAodm9pZCkgc2V0IiA8PCBjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgaW5pdFdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCi0gKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIAotewotICBpbmRlbnQob3V0KSA8PCAiLSAoaWQpIGluaXRXaXRoQ29kZXI6IChOU0NvZGVyICopIGRlY29kZXIiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDb2RlcjogZGVjb2Rlcl07IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoW2RlY29kZXIgY29udGFpbnNWYWx1ZUZvcktleTogQFwiIjw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCJcIl0pIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgIltbZGVjb2RlciBkZWNvZGVPYmplY3RGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gcmV0YWluXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgCi0gICAgewotICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHQpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlQm9vbEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICAgIAotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZGVjb2RlIHRocmlmdCB0eXBlOiAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgZW5jb2RlV2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKLSAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgCi17Ci0gIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBlbmNvZGVXaXRoQ29kZXI6IGVuY29kZXJdOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX18iPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Il9pc3NldCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICAvL291dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgCi0gICAgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVPYmplY3Q6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIGlmICh0LT5pc19lbnVtKCkpIAotICAgIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUJvb2w6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50MzI6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDY0OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVEb3VibGU6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgICAKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGVuY29kZSB0aHJpZnQgdHlwZTogIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBleGNlcHRpb25zIG5lZWQgdG8gY2FsbCB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplciBvbiBOU0V4Y2VwdGlvbgotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZCkgaW5pdCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzdXBlciBpbml0V2l0aE5hbWU6IEBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiXCIgcmVhc29uOiBAXCJ1bmtub3duXCIgdXNlckluZm86IG5pbF07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy8gQGR5bmFtaWMgcHJvcGVydHkgZGVjbGFyYXRpb25zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICIjaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUpIiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkeW5hbWljX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmV0YWluXTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOyAgCi0KLSAgLy8gZGVhbGxvYwotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGluZGVudChvdXQpIDw8ICJOU1N0cmluZyAqIGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgZmllbGRUeXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZElEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FsbF9maWVsZF9zZXR0ZXIoKmZfaXRlciwgImZpZWxkVmFsdWUiKSA8PCBlbmRsOwotICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFsbG9jYXRlZCBmaWVsZCwgcmVsZWFzZSBpdCBzaW5jZSB0aGUgc3RydWN0Ci0gICAgICAgIC8vIGlzIG5vdyByZXRhaW5pbmcgaXQKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIC8vIGRlc2VyaWFsaXplZCBzdHJpbmdzIGFyZSBhdXRvcmVsZWFzZSwgc28gZG9uJ3QgcmVsZWFzZSB0aGVtCi0gICAgICAgICAgaWYgKCEoZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbZmllbGRWYWx1ZSByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IGZpZWxkIElEICVpIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZpZWxkSUQsIGZpZWxkVHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbaW5Qcm90b2NvbCByZWFkRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX18iKygqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsIHdoaWNoCi0gKiBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gaWYgdGhleSBhcmUKLSAqIHNldCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgIihfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX18iKygqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgotICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBmaWVsZF9uYW1lOwotICAgIGNhcF9uYW1lWzBdID0gdG91cHBlcihjYXBfbmFtZVswXSk7Ci0KLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICI7Ci0gICAgb3V0IDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBbW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluXSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8Ci0gICAgICAiKSAiIDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0ID0gWUVTOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBJc1NldAotICAgIGluZGVudChvdXQpIDw8ICItIChCT09MKSAiIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KLSAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgZmllbGRfbmFtZSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBOTzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIgPDwKLSAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCJdOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kRm9ybWF0OiBAXCIiIDw8IGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodHR5cGUpIDw8ICJcIiwgX18iIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIpXCJdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBPYmplY3RpdmUtQyB0aGlzIGNvbnNpc3RzIG9mIGEKLSAqIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IGludGVyZmFjZSBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzLCBmYWxzZSwgZmFsc2UpOyAgCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHJldHVybiBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci19Ci0KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjcmVhdGUgYSByZXN1bHQgc3RydWN0IHdpdGggYSBzdWNjZXNzIGZpZWxkIG9mIHRoZSByZXR1cm4gdHlwZSwKLSAgLy8gYW5kIGEgZmllbGQgZm9yIGVhY2ggdHlwZSBvZiBleGNlcHRpb24gdGhyb3duCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0ZnVuY3Rpb24pKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOyAgCi19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PAotICAgICAgIiAgLy8gdGhyb3dzICI7Ci0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7Ci0gICAgfQotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgOiBOU09iamVjdCA8IiA8PAotICAgIGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIjsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yIHRoZQotICogc2VydmljZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIjsKLSAgCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCI+IG1TZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtTWV0aG9kTWFwOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZDwiPDxjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZXJzCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBhbk91dFByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IFthbkluUHJvdG9jb2wgcmV0YWluXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBbYW5PdXRQcm90b2NvbCByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZGVhbGxvYwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PAotICAgICAgIiB0eXBlOiBUTWVzc2FnZVR5cGVfQ0FMTCIgPDwKLSAgICAgICIgc2VxdWVuY2VJRDogMF07IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgZmllbGROYW1lIDw8ICIgIT0gbmlsKSI7Ci0gICAgICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmaWVsZE5hbWUgPDwgIlwiIgotICAgICAgICAiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmbGRfaXRlciwgZmllbGROYW1lKTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBNZXNzYWdlIHZhbGlkYXRpb24gaGVyZSwgd2FzIHRoZSBzZXFpZCBldGMgb2s/Ci0KLSAgICAgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50IG1zZ1R5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IG5pbCB0eXBlOiAmbXNnVHlwZSBzZXF1ZW5jZUlEOiBOVUxMXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2dUeXBlID09IFRNZXNzYWdlVHlwZV9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgQHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiICogcmVzdWx0ID0gW1tbIiA8PCBjb2NvYV9wcmVmaXhfIDw8Ci0gICAgICAgIHJlc3VsdG5hbWUgPDwgIiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbcmVzdWx0IHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChbcmVzdWx0IHN1Y2Nlc3NJc1NldF0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gW3Jlc3VsdCBzdWNjZXNzXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChbcmVzdWx0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldF0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJAdGhyb3cgW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIl07IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbc2VsZiBzZW5kXyIgPDwgZnVubmFtZTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIjogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgb3V0IDw8Ci0gICAgICAgICJbc2VsZiByZWN2XyIgPDwgZnVubmFtZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBhY3R1YWwgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgotICogZm9yIHRoZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgLy8gaW5pdGlhbGl6ZXIKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlbGYpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1TZXJ2aWNlID0gW3NlcnZpY2UgcmV0YWluXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibU1ldGhvZE1hcCA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlNFTCBzID0gQHNlbGVjdG9yKHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6aW5Qcm90b2NvbDpvdXRQcm90b2NvbDopOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTWV0aG9kU2lnbmF0dXJlICogc2lnID0gW3NlbGYgbWV0aG9kU2lnbmF0dXJlRm9yU2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBzaWddOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHNldFNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiByZXRhaW5Bcmd1bWVudHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAvLyBwcm9jZXNzb3IKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8Ijw8Y29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtbbVNlcnZpY2UgcmV0YWluXSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFByb2Nlc3MgbWV0aG9kLCB3aGljaCBkaXNwYXRjaGVzIHRoZSBpbmNvbWluZyBjYWxsIHVzaW5nIHRoZSBtZXRob2QgbWFwCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TU3RyaW5nICogbWVzc2FnZU5hbWU7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaW50IG1lc3NhZ2VUeXBlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGludCBzZXFJRDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogJm1lc3NhZ2VOYW1lIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICZtZXNzYWdlVHlwZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAmc2VxSURdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbbU1ldGhvZE1hcCB2YWx1ZUZvcktleTogbWVzc2FnZU5hbWVdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIChpbnZvY2F0aW9uID09IG5pbCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IFRUeXBlX1NUUlVDVCBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqIHggPSBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQFwiSW52YWxpZCBtZXRob2QgbmFtZTogJyVAJ1wiLCBtZXNzYWdlTmFtZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFt4IHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAvLyBOU0ludm9jYXRpb24gZG9lcyBub3QgY29uZm9ybSB0byBOU0NvcHlpbmcgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogW2ludm9jYXRpb24gbWV0aG9kU2lnbmF0dXJlXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0U2VsZWN0b3I6IFtpbnZvY2F0aW9uIHNlbGVjdG9yXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZzZXFJRCBhdEluZGV4OiAyXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJmluUHJvdG9jb2wgYXRJbmRleDogM107IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZvdXRQcm90b2NvbCBhdEluZGV4OiA0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRUYXJnZXQ6IHNlbGZdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIGludm9rZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIGEgcHJvY2Vzc19YWFhYIG1ldGhvZCBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uLCB3aGljaCByZWFkcyBhcmdzLCBjYWxscyB0aGUgc2VydmljZSwgYW5kIHdyaXRlcyByZXN1bHRzCi0gIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiX3dpdGhTZXF1ZW5jZUlEOiAoaW50MzJfdCkgc2VxSUQgaW5Qcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIHN0cmluZyBhcmdzdHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSgqZl9pdGVyKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgYXJnc3R5cGUgPDwgIiAqIGFyZ3MgPSBbWyIgPDwgYXJnc3R5cGUgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICAKLSAgICBzdHJpbmcgcmVzdWx0dHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHR0eXBlIDw8ICIgKiByZXN1bHQgPSBbWyIgPDwgcmVzdWx0dHlwZSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBtYWtlIHRoZSBjYWxsIHRvIHRoZSBhY3R1YWwgc2VydmljZSBvYmplY3QKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICI7Ci0gICAgfQotICAgIG91dCA8PCAiW21TZXJ2aWNlICIgPDwgZnVubmFtZTsKLSAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIl0iOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gd3JpdGUgb3V0IHRoZSByZXN1bHQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9SRVBMWSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICAvLyBkZWFsbG9jCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21TZXJ2aWNlIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbbU1ldGhvZE1hcCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGROYW1lIDw8ICIgPSBbaW5Qcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnldOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2XTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBhbGxvY2F0ZXMgdGhlIHN0cnVjdCBhbmQgaW52b2tlcyByZWFkOgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PAotICAgIHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8Ci0gICAgICBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfQotICAvLyBGSVhNRSAtIHRoZSBjb2RlIGFib3ZlIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gIC8vIHRoZSBjb250YWluZXJzIGJlaW5nIHJlYWQgbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlCi0gIC8vIGNvbnRhaW5lcnMgd2UgYXJlIHJlYWRpbmcgaW50by4gIERvZXMgdGhhdCBtYXR0ZXI/Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwRW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTZXRFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gIH0KLQotfQotCi0KLS8qKgotICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKLSAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKLSAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb250YWluZXJpemUodF90eXBlICogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQotewotICAvLyBGSVhNRSAtIG9wdGltaXplIGhlcmUgdG8gYXZvaWQgYXV0b3JlbGVhc2UgcG9vbD8KLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoSW50OiAiICsgZmllbGROYW1lICsgIl0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFVuc2lnbmVkQ2hhcjogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmdMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLSAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7Ci0gIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHNldE9iamVjdDogIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PAotICAgICIgZm9yS2V5OiAiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbChrZXlUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUoa2V5VHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHZhbFR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh2YWxUeXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF90eXBlKiB0eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgIC8vIGRlc2VyaWFsaXplZCBzdHJpbmdzIGFyZSBhdXRvcmVsZWFzZSwgc28gZG9uJ3QgcmVsZWFzZSB0aGVtCi0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh0eXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh0eXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBmaWVsZE5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTY6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgotICoKLSAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBjb250YWluZXIKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgdmFsdWVUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIHN0cmluZyBrZXk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBrZXkgPSB0bXAoImtleSIpOwotICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGtleUVudW1lcmF0b3JdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGtleSA9IHRtcCgib2JqIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIgb2JqZWN0RW51bWVyYXRvcl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGtleSA9IHRtcCgiaSIpOwotICAgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleSA8PCAiKyspIiA8PCBlbmRsOwotICB9Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBrZXkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZU1hcEVuZF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlU2V0RW5kXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlTGlzdEVuZF07IiA8PCBlbmRsOwotICAgIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2l2ZW4gYSBmaWVsZCB2YXJpYWJsZSBuYW1lLCB3cmFwIGl0IGluIGNvZGUgdGhhdCBjb252ZXJ0cyBpdCB0byBhCi0gKiBwcmltaXRpdmUgdHlwZSwgaWYgbmVjZXNzYXJ5LgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY29udGFpbmVyaXplKHRfZmllbGQgKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpCi17Ci0gIHRfdHlwZSAqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGludFZhbHVlXSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNhbid0IGRlY29udGFpbmVyaXplIHZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGJvb2xWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHVuc2lnbmVkQ2hhclZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBzaG9ydFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBsb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdMb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGRvdWJsZVZhbHVlXSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIGZpZWxkTmFtZTsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcE5hbWUpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGRlY29udGFpbmVyaXplKCZrZmllbGQsIGtleSkpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIlsiICsgbWFwTmFtZSArICIgb2JqZWN0Rm9yS2V5OiAiICsga2V5ICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgZGVjb250YWluZXJpemUoJnZmaWVsZCwgdmZpZWxkLmdldF9uYW1lKCkpKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50TmFtZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVsZW1lbnROYW1lKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIlsiICsgbGlzdE5hbWUgKyAiIG9iamVjdEF0SW5kZXg6ICIgKyBpbmRleCArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyByZXN1bHQ7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXN1bHQgPSAiTlNEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXN1bHQgPSAiTlNTZXQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXN1bHQgPSAiTlNBcnJheSI7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQ2hlY2sgZm9yIHByZWZpeAotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKLSAgICAgIHJlc3VsdCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjbGFzc19yZWYpIHsKLSAgICByZXN1bHQgKz0gIiAqIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiTlNEYXRhICoiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIk5TU3RyaW5nICoiOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiQk9PTCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gInVpbnQ4X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4iaW50MTZfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50MzJfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiJpbnQ2NF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2JqZWN0aXZlLWMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBTcGl0IG91dCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgdmFsdWUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRhaW5lcml6ZV9pdCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0V2l0aCI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICByZW5kZXIgPDwgY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgIjogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICByZW5kZXIgPDwgIl0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzQW5kS2V5czogIjsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHZhbCA8PCAiLCAiIDw8IGtleTsKLSAgICB9Ci0gICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7Ci0gICAgdF90eXBlICogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICB9Ci0gICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TU2V0IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7Ci0gICAgdF90eXBlICogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImRvbid0IGtub3cgaG93IHRvIHJlbmRlciBjb25zdGFudCBmb3IgdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoY29udGFpbmVyaXplX2l0KSB7Ci0gICAgcmV0dXJuIGNvbnRhaW5lcml6ZSh0eXBlLCByZW5kZXIuc3RyKCkpOwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiBfXyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOyI7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotICByZW5kZXIgPDwgIkBwcm9wZXJ0eSAobm9uYXRvbWljLCAiOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpCi0gICAgcmVuZGVyIDw8ICJyZXRhaW4sICI7Ci0gIAotICByZW5kZXIgPDwgImdldHRlcj0iIDw8IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8Ci0gICAgIiwgc2V0dGVyPXNldCIgPDwgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjopICIgPDwKLSAgICB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IjsKLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEFkZCBAZHluYW1pYyBkZWNsYXJhdGlvbiBmb3IgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIGZvciB3aGljaCB0byBkZWNsYXJlIGEgZHluYW1pYyBwcm9wZXJ0eQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmR5bmFtaWNfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7Ci0gIHJldHVybiAiQGR5bmFtaWMgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCi0gKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIjogKCIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIpICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIE9iamVjdGl2ZS1DIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZV9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGVfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGVfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGVfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGVfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICIlaGkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIiVxaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIiVmIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIlaSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X3N0cmluZ19mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjYWxsIHRvIGEgZmllbGQncyBzZXR0ZXIuCi0gKgotICogQHBhcmFtIHRmaWVsZCBGaWVsZCB0aGUgc2V0dGVyIGlzIGJlaW5nIGNhbGxlZCBvbgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIHRvIHBhc3MgdG8gc2V0dGVyCi0gKi8KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgcmV0dXJuICJbc2VsZiBzZXQiICsgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjogIiArIGZpZWxkTmFtZSArICJdOyI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjb2NvYSwgIkNvY29hIiwKLSIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCi0pOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0ZTQ4YS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEMrKyBjb2RlIGdlbmVyYXRvci4gVGhpcyBpcyBsZWdpdGltYWN5IGluY2FybmF0ZS4KLSAqCi0gKi8KLWNsYXNzIHRfY3BwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9jcHBfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkZW5zZSIpOwotICAgIGdlbl9kZW5zZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5jbHVkZV9wcmVmaXgiKTsKLSAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3BwIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgICBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9jcHBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIH0KLSAgdm9pZCBnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbiAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb249ZmFsc2UsIGJvb2wgcG9pbnRlcnM9ZmFsc2UsIGJvb2wgcmVhZD10cnVlLCBib29sIHdyaXRlPXRydWUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbiAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWY9ZmFsc2UsIGJvb2wgYXJnPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgcG9pbnRlcj1mYWxzZSwgYm9vbCBjb25zdGFudD1mYWxzZSwgYm9vbCByZWZlcmVuY2U9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsIGJvb2wgbmFtZV9wYXJhbXM9dHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXM9dHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqLCB0X3R5cGUqIHR0eXBlLCBib29sIGV4dGVybmFsPWZhbHNlKTsKLQotICAvLyBUaGVzZSBoYW5kbGVzIGNoZWNraW5nIGdlbl9kZW5zZV8gYW5kIGNoZWNraW5nIGZvciBkdXBsaWNhdGVzLgotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOwotCi0gIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLSAgfQotCi0gIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgewotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCi0gICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSBmb3IgVERlbnNlUHJvdG9jb2wuCi0gICAqLwotICBib29sIGdlbl9kZW5zZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKLSAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCi0gICAqLwotICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87Ci0KLSAgLyoqCi0gICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbnNfb3Blbl87Ci0gIHN0ZDo6c3RyaW5nIG5zX2Nsb3NlXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQotICAgKiBmdW5jdGlvbi4KLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIC8qKgotICAgKiBXaGVuIGdlbmVyYXRpbmcgbG9jYWwgcmVmbGVjdGlvbnMsIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZW5lcmF0ZSBkdXBsaWNhdGVzLgotICAgKi8KLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHJlZmxlY3RlZF9maW5nZXJwcmludHNfOwotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5jcHAiOwotICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl90eXBlc18gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBiYXNlIHR5cGVzCi0gIGZfdHlwZXNfIDw8Ci0gICAgIiNpbmNsdWRlIDxUaHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGluY2x1ZGVzW2ldKSkgPDwKLSAgICAgIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycwotICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwKLSAgICBlbmRsOwotCi0gIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIGxvY2FsIHJlZmxlY3Rpb24gbWV0YWRhdGEsIHdlIG5lZWQgdG8gaW5jbHVkZQotICAvLyB0aGUgZGVmaW5pdGlvbiBvZiBUeXBlU3BlYy4KLSAgaWYgKGdlbl9kZW5zZV8pIHsKLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAiI2luY2x1ZGUgPFRSZWZsZWN0aW9uTG9jYWwuaD4iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBPcGVuIG5hbWVzcGFjZQotICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0gIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSBuYW1lc3BhY2UKLSAgZl90eXBlc18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBpZm5kZWYKLSAgZl90eXBlc18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIiA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIEMrKywgdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZQotICogYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcgdGhlIGVudW0ga2V5d29yZCBpbiBDKysuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PAotICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc18sIHRlbnVtLCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdGVudW0sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX2NvbnN0YW50cy5oIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmNwcCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzX2ltcGw7Ci0gIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl9jb25zdHMgPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgImNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfY29uc3RzIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9jb25zdHMgPDwKLSAgICAifTsiIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwKLSAgICAifSIgPDwgZW5kbDsKLQotICBmX2NvbnN0cyA8PAotICAgIGVuZGwgPDwKLSAgICAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotCi0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotLyoqCi0gKgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKLSAqIGlubmVyIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCB0cnVlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uX3BvaW50ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZQotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKLSAgfQotCi0gIC8vIEdldCBtZW1iZXJzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGlzc2V0IHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBvdXRzaWRlIHRoZSBjbGFzcy4gVGhpcyBtYWtlcwotICAvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgYW1lbmFibGUgdG8gcHJvY2Vzc2luZyBieSBTV0lHLgotICAvLyBXZSBvbmx5IGRlY2xhcmUgdGhlIHN0cnVjdCBpZiBpdCBnZXRzIHVzZWQgaW4gdGhlIGNsYXNzLgotCi0gIC8vIElzc2V0IHN0cnVjdCBoYXMgYm9vbGVhbiBmaWVsZHMsIGJ1dCBvbmx5IGZvciBub24tcmVxdWlyZWQgZmllbGRzLgotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQoKSAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoZmFsc2UpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoZmFsc2UpIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIge30iIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAifSBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0OyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gT3BlbiBzdHJ1Y3QgZGVmCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBQdXQgdGhlIGZpbmdlcnByaW50IHVwIHRvcCBmb3IgYWxsIHRvIHNlZS4KLSAgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50KG91dCwgdHN0cnVjdCwgZmFsc2UpOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIjsKLQotICAgIGJvb2wgaW5pdF9jdG9yID0gZmFsc2U7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgc3RyaW5nIGR2YWw7Ci0gICAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKLSAgICAgICAgfQotICAgICAgICBkdmFsICs9IHQtPmlzX3N0cmluZygpID8gIlwiXCIiIDogIjAiOwotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaW5pdF9jdG9yKSB7Ci0gICAgICAgICAgaW5pdF9jdG9yID0gdHJ1ZTsKLSAgICAgICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8vIFRPRE8oZHJlaXNzKTogV2hlbiBldmVyeXRoaW5nIGVsc2UgaW4gVGhyaWZ0IGlzIHBlcmZlY3QsCi0gICAgLy8gZG8gbW9yZSBvZiB0aGVzZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0KLSAgICAgIGlmICghdC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgIG91dCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgdGhyb3coKSB7fSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gUG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSdzIHJlZmxlY3Rpb24gbG9jYWwgdHlwZXNwZWMuCi0gIGlmIChnZW5fZGVuc2VfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzdGF0aWMgOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiBsb2NhbF9yZWZsZWN0aW9uOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIERlY2xhcmUgYWxsIGZpZWxkcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHBvaW50ZXJzICYmICEoKm1faXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCksICFyZWFkKSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBfX2lzc2V0IGRhdGEgbWVtYmVyIGlmIHdlIG5lZWQgaXQsIHVzaW5nIHRoZSBkZWZpbml0aW9uIGZyb20gYWJvdmUKLSAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgewotICAgIG91dCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgX19pc3NldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoIXBvaW50ZXJzKSB7Ci0gICAgLy8gR2VuZXJhdGUgYW4gZXF1YWxpdHkgdGVzdGluZyBvcGVyYXRvci4gIE1ha2UgaXQgaW5saW5lIHNpbmNlIHRoZSBjb21waWxlcgotICAgIC8vIHdpbGwgZG8gYSBiZXR0ZXIgam9iIHRoYW4gd2Ugd291bGQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlubGluZSBpdC4KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yID09IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICIgPDwKLSAgICAgIChtZW1iZXJzLnNpemUoKSA+IDAgPyAicmhzIiA6ICIvKiByaHMgKi8iKSA8PCAiKSBjb25zdCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAotICAgICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgPT0gcmhzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiICE9IHJocy5fX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJlbHNlIGlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgJiYgISgiCi0gICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJnJocykgY29uc3QgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBsZXNzLXRoYW4gb3BlcmF0b3IuICBUaGlzIG11c3QgYmUKLSAgICAvLyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGlmIHRoZXkgd2lzaCB0byB1c2UgaXQuICAoVGhleQotICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA8IChjb25zdCAiCi0gICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGlmIChyZWFkKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIGlmICh3cml0ZSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgZmluZ2VycHJpbnQgb2YgYSBzdHJ1Y3QgdG8gZWl0aGVyIHRoZSBoZWFkZXIgb3IgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZmluZ2VycHJpbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGVmaW5pdGlvbikgewotICBzdHJpbmcgc3RhdCwgbnNwYWNlLCBjb21tZW50OwotICBpZiAoaXNfZGVmaW5pdGlvbikgewotICAgIHN0YXQgPSAiIjsKLSAgICBuc3BhY2UgPSB0c3RydWN0LT5nZXRfbmFtZSgpICsgIjo6IjsKLSAgICBjb21tZW50ID0gIiAiOwotICB9IGVsc2UgewotICAgIHN0YXQgPSAic3RhdGljICI7Ci0gICAgbnNwYWNlID0gIiI7Ci0gICAgY29tbWVudCA9ICI7IC8vICI7Ci0gIH0KLQotICBpZiAodHN0cnVjdC0+aGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHN0YXQgPDwgImNvbnN0IGNoYXIqICIgPDwgbnNwYWNlCi0gICAgICAgIDw8ICJhc2NpaV9maW5nZXJwcmludCIgPDwgY29tbWVudCA8PCAiPSBcIiIgPDwKLSAgICAgICAgdHN0cnVjdC0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCkgPDwgIlwiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgdWludDhfdCAiIDw8IG5zcGFjZSA8PAotICAgICAgICAiYmluYXJ5X2ZpbmdlcnByaW50WyIgPDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW4gPDwgIl0iIDw8IGNvbW1lbnQgPDwgIj0geyI7Ci0gICAgY29uc3QgY2hhciogY29tbWEgPSAiIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRfdHlwZTo6ZmluZ2VycHJpbnRfbGVuOyBpKyspIHsKLSAgICAgIG91dCA8PCBjb21tYSA8PCAiMHgiIDw8IHRfc3RydWN0OjpieXRlX3RvX2hleCh0c3RydWN0LT5nZXRfYmluYXJ5X2ZpbmdlcnByaW50KClbaV0pOwotICAgICAgY29tbWEgPSAiLCI7Ci0gICAgfQotICAgIG91dCA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgbG9jYWwgcmVmbGVjdGlvbiBvZiBhIHR5cGUgKGVpdGhlciBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uKS4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGVmaW5pdGlvbikgewotICBpZiAoIWdlbl9kZW5zZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgYXNzZXJ0KHR0eXBlLT5oYXNfZmluZ2VycHJpbnQoKSk7Ci0gIHN0cmluZyBrZXkgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCkgKyAoaXNfZGVmaW5pdGlvbiA/ICItZGVmbiIgOiAiLWRlY2wiKTsKLSAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgZ2VuZXJhdGVkIHRoaXMgZmluZ2VycHJpbnQuICBJZiB3ZSBhbHJlYWR5IGRpZCwgYmFpbCBvdXQuCi0gIGlmICghcmVmbGVjdGVkX2ZpbmdlcnByaW50c18uaW5zZXJ0KGtleSkuc2Vjb25kKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIExldCBlYWNoIHByb2dyYW0gaGFuZGxlIGl0cyBvd24gc3RydWN0dXJlcy4KLSAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwgJiYgdHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBEbyBkZXBlbmRlbmNpZXMuCi0gIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIC8vIEhhY2t5IGhhY2t5LiAgRm9yIGVmZmljaWVuY3kgYW5kIGNvbnZlbmllbmNlLCB3ZSBuZWVkIGEgZHVtbXkgIlRfU1RPUCIKLSAgICAvLyB0eXBlIGF0IHRoZSBlbmQgb2Ygb3VyIHR5cGVzcGVjIGFycmF5LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8KLSAgICAvLyBUX1NUT1AgdHlwZSwgc28gd2UgdXNlIHRoZSBnbG9iYWwgdm9pZCB0eXBlLCBhbmQgc3BlY2lhbCBjYXNlIGl0IHdoZW4KLSAgICAvLyBnZW5lcmF0aW5nIGl0cyB0eXBlc3BlYy4KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSAoKHRfc3RydWN0Kil0dHlwZSktPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCoqbV9pdGVyKS5nZXRfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsIGdfdHlwZV92b2lkLCBpc19kZWZpbml0aW9uKTsKLQotICAgIC8vIEZvciBkZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzLCBkbyB0aGUgYXJyYXlzIG9mIG1ldGFzIGFuZCBmaWVsZCBzcGVjcyBhbHNvLgotICAgIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpGaWVsZE1ldGEiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJtZXRhcyIsIHR0eXBlKSA8PCJbXSA9IHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInsgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8Ci0gICAgICAgICAgKCgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8Ci0gICAgICAgICAgIiB9LCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIFplcm8gZm9yIHRoZSBUX1NUT1AgbWFya2VyLgotICAgICAgaW5kZW50KG91dCkgPDwgInsgMCwgZmFsc2UgfSIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJzcGVjcyIsIHR0eXBlKSA8PCJbXSA9IHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiYiIDw8Ci0gICAgICAgICAgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJiIgPDwKLSAgICAgICAgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIGdfdHlwZV92b2lkKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8vICIgPDwgdHR5cGUtPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAoaXNfZGVmaW5pdGlvbiA/ICIiIDogImV4dGVybiAiKSA8PAotICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyIgPDwgZW5kbCA8PAotICAgICAgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIHR0eXBlKSA8PAotICAgICAgKGlzX2RlZmluaXRpb24gPyAiKCIgOiAiOyIpIDw8IGVuZGw7Ci0KLSAgaWYgKCFpc19kZWZpbml0aW9uKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV90b19lbnVtKHR0eXBlKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6YmluYXJ5X2ZpbmdlcnByaW50LCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJtZXRhcyIsIHR0eXBlKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJzcGVjcyIsIHR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiTlVMTCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICB9Ci0KLSAgb3V0IDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBzdHJ1Y3R1cmUncyBzdGF0aWMgcG9pbnRlciB0byBpdHMgbG9jYWwgcmVmbGVjdGlvbiB0eXBlc3BlYwotICogaW50byB0aGUgaW1wbGVtZW50YXRpb24gZmlsZS4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKCFnZW5fZGVuc2VfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyogIiA8PAotICAgICAgdHR5cGUtPmdldF9uYW1lKCkgPDwgIjo6bG9jYWxfcmVmbGVjdGlvbiA9ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCB0dHlwZSkgPDwgIjsiIDw8Ci0gICAgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIE1ha2VzIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGdlbiBhIHN0cnVjdCByZWFkZXIuCi0gKgotICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBpbmRlbnQob3V0KSA8PAotICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6cmVhZCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKmlzc2V0X3ByZWZpeCA9Ci0gICAgICAgICAgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIiA6ICJpc3NldF8iOwotCi0jaWYgMAotICAgICAgICAvLyBUaGlzIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBmaWVsZCBpcyBlbmNvdW50ZXJlZCB0d2ljZS4KLSAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgotICAgICAgICAvLyBmb3IgcGVvcGxlIHJlY29tcGlsaW5nIHRocmlmdCB0byBpbmNsdWRlIGl0LgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgYW4gb3B0aW9uIHdoZW4gdGhyaWZ0IHN0cnVjdHMKLSAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCi0gICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCi0gIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0Ci0gIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCi0gIG91dCA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgaWYgKHBvaW50ZXJzKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICB9Ci0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgJ30nIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBTdHJ1Y3Qgd3JpdGVyIGZvciByZXN1bHQgb2YgYSBmdW5jdGlvbiwgd2hpY2ggY2FuIGhhdmUgb25seSBvbmUgb2YgaXRzCi0gKiBmaWVsZHMgc2V0IGFuZCBkb2VzIGEgY29uZGl0aW9uYWwgaWYgZWxzZSBsb29rIHVwIGludG8gdGhlIF9faXNzZXQgZmllbGQKLSAqIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgcmVzdWx0IHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLQotICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkgPDwKLSAgICAgIGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSA8PCAiLmhcIiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzdmNuYW1lKyIuY3BwIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwKLSAgICBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29tcG9uZW50cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKLSAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWVfb3JpZyA9IHRzLT5nZXRfbmFtZSgpOwotCi0gICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgdHMpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgdHMpOwotICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgdHMsIHRydWUpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lX29yaWcpOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWYiOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKCkge30iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJOdWxsIjsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJOdWxsIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJOdWxsKCkge30iIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOwotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gX3JldHVybjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAotICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKLSAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOwotICB9Ci0KLSAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PAotICAgIGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZSA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLQotICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYWxsICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgY2FsbCArPSAiKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3Qgc3ogPSBpZmFjZXNfLnNpemUoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3o7ICsraSkgeyIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGkgPT0gc3ogLSAxKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJDbGllbnQiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA6ICIgPDwKLSAgICAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwKLSAgICBleHRlbmRzX2NsaWVudCA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudChib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdCkgOiIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhwcm90KSwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBvcHJvdF8ocHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90XyA9IHByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiQ2xpZW50KHByb3QsIHByb3QpIHt9IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpcHJvdCwgYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90KSA6IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKGlwcm90KSwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBvcHJvdF8ob3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90XyA9IGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiQ2xpZW50KGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBnZXR0ZXJzIGZvciB0aGUgcHJvdG9jb2xzLgotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHBpcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRPdXRwdXRQcm90b2NvbCgpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcG9wcm90XzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdF87IiAgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBzdHJpbmcgc2NvcGUgPSBzZXJ2aWNlX25hbWVfICsgIkNsaWVudDo6IjsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHNjb3BlKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4pOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gcmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIHNjb3BlKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0IjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCwgY3NlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAmIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBvbmV3YXkgZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIHNjb3BlKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lLmNvbXBhcmUoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpICE9IDApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpXUk9OR19NRVRIT0RfTkFNRSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmCi0gICAgICAgICAgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiX3JldHVybiIpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQpIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICZfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gX3JldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBhcmUgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbig6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgOiAiIDw8Ci0gICAgInZpcnR1YWwgcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IiIDw8Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY+IGlmYWNlXzsiIDw8IGVuZGw7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIGJvb2wgcHJvY2Vzc19mbig6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb2Nlc3MgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHJpdmF0ZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAic3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQgKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOjoqKShpbnQzMl90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPiBwcm9jZXNzTWFwXzsiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwKLSAgICAgICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF91cCgpOwotICBzdHJpbmcgZGVjbGFyZV9tYXAgPSAiIjsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBkZWNsYXJlX21hcCArPSBpbmRlbnQoKTsKLSAgICBkZWNsYXJlX21hcCArPSAicHJvY2Vzc01hcF9bXCIiOwotICAgIGRlY2xhcmVfbWFwICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBkZWNsYXJlX21hcCArPSAiXCJdID0gJiI7Ci0gICAgZGVjbGFyZV9tYXAgKz0gc2VydmljZV9uYW1lXzsKLSAgICBkZWNsYXJlX21hcCArPSAiUHJvY2Vzc29yOjpwcm9jZXNzXyI7Ci0gICAgZGVjbGFyZV9tYXAgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGRlY2xhcmVfbWFwICs9ICI7XG4iOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY+IGlmYWNlKSA6IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIlByb2Nlc3NvcihpZmFjZSksIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgZGVjbGFyZV9tYXAgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwgYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yKCkge30iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJib29sICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOjpwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsIGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90ID0gcGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCA9IHBvcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImludDMyX3Qgc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX09ORVdBWSkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHByb2Nlc3NfZm4oaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQpOyIgPDwKLSAgICBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJib29sICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOjpwcm9jZXNzX2ZuKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBIT1Q6IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIG1hcAotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB2b2lkICgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3Nvcjo6KikoaW50MzJfdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqKT46Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK2ZuYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBleHRlbmRzIDw8ICJQcm9jZXNzb3I6OnByb2Nlc3NfZm4oaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKShzZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKGZfc2VydmljZV8sICZyZXN1bHQpOwotCi0gIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCwgdHJ1ZSk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3Nvcjo6IiA8PAotICAgICJwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgIihpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgZnVuY3Rpb25zIHdpdGggZXhjZXB0aW9ucwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIocmVzdWx0LnN1Y2Nlc3MiOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsIDw8Ci0gICAgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHJpbnRmKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlxcblwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjwiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXI+IGhhbmRsZXIobmV3ICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NrZWxldG9uLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBpcHJvdC0+IjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICJyZWFkQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90ICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0IDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICghdXNlX3B1c2gpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgewotICBpZiAodXNlX3B1c2gpIHsKLSAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigoaW50MzJfdCkiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmNvbnN0X2l0ZXJhdG9yICIgPDwgaXRlciA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggIDw8ICIuYmVnaW4oKTsgIiA8PCBpdGVyIDw8ICIgIT0gIiA8PCBwcmVmaXggPDwgIi5lbmQoKTsgKysiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlcik7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLT5zZWNvbmQiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogTWFrZXMgYSA6OiBwcmVmaXggZm9yIGEgbmFtZXNwYWNlCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lcHNhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfcHJlZml4KHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIE9wZW5zIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVwc2FjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7Ci0gICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICIgeyI7Ci0gICAgc2VwYXJhdG9yID0gIiAiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgbmFtZXNwYWNlLgotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXBzYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9ICJ9IjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKLSAgICBpZiAoIWFyZykgewotICAgICAgcmV0dXJuIGJuYW1lOwotICAgIH0KLQotICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIG92ZXJsb2FkZWQgQysrIG5hbWUKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIHN0cmluZyBjbmFtZTsKLQotICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKikgdHR5cGU7Ci0gICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjptYXA8IiArCi0gICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiLCAiICsKLSAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0KikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6OnNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6dmVjdG9yPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0KLQotICAgIGlmIChhcmcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY25hbWU7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIGNsYXNzX3ByZWZpeDsKLSAgaWYgKGluX3R5cGVkZWYgJiYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICBjbGFzc19wcmVmaXggPSAiY2xhc3MgIjsKLSAgfQotCi0gIC8vIENoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIG5hbWVzcGFjZWQKLSAgc3RyaW5nIHBuYW1lOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcG5hbWUgPQotICAgICAgY2xhc3NfcHJlZml4ICsKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXgocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpICsKLSAgICAgIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9IGVsc2UgewotICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoYXJnKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEByZXR1cm4gRXhwbGljaXQgQysrIHR5cGUsIGkuZS4gImludDMyX3QiCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJpbnQ4X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIHBvaW50ZXIsIGJvb2wgY29uc3RhbnQsIGJvb2wgcmVmZXJlbmNlKSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICImIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IFwiXCIiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7Ci0gICAgfQotICB9Ci0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0KLSAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICBib29sIGVtcHR5ID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICByZXR1cm4KLSAgICAgICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgIigiICsgdHlwZV9uYW1lKHR0eXBlKSArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpICsKLSAgICAgIChlbXB0eSA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSkpICsgIikiOwotICB9IGVsc2UgewotICAgIHJldHVybgotICAgICAgdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgICAiKCIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiICsKLSAgICAgIChuYW1lX3BhcmFtcyA/ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA6ICIvKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiAqLyIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICoKLSAqIEBwYXJhbSB0eXBlIFRocmlmdCBUeXBlCi0gKiBAcmV0dXJuIFN0cmluZyBvZiBDKysgY29kZSB0byBkZWZpbml0aW9uIG9mIHRoYXQgdHlwZSBjb25zdGFudAotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzeW1ib2wgbmFtZSBvZiB0aGUgbG9jYWwgcmVmbGVjdGlvbiBvZiBhIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmxvY2FsX3JlZmxlY3Rpb25fbmFtZShjb25zdCBjaGFyKiBwcmVmaXgsIHRfdHlwZSogdHR5cGUsIGJvb2wgZXh0ZXJuYWwpIHsKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAvLyBXZSBoYXZlIHRvIHVzZSB0aGUgcHJvZ3JhbSBuYW1lIGFzIHBhcnQgb2YgdGhlIGlkZW50aWZpZXIgYmVjYXVzZQotICAvLyBpZiB0d28gdGhyaWZ0ICJwcm9ncmFtcyIgYXJlIGNvbXBpbGVkIGludG8gb25lIGFjdHVhbCBwcm9ncmFtCi0gIC8vIHlvdSB3b3VsZCBnZXQgYSBzeW1ib2wgY29sbGlzb24gaWYgdGhleSBib3RoIGRlZmluZWQgbGlzdDxpMzI+LgotICAvLyB0cmxvID0gVGhyaWZ0IFJlZmxlY3Rpb24gTE9jYWwuCi0gIHN0cmluZyBwcm9nOwotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIG5zcGFjZTsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFdvdWxkIGl0IGJlIGJldHRlciB0byBwcmVnZW5lcmF0ZSB0aGUgYmFzZSB0eXBlcwotICAvLyAgICAgICAgICAgICAgIGFuZCBwdXQgdGhlbSBpbiBUaHJpZnQue2gsY3BwfSA/Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHByb2cgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSk7Ci0gICAgYXNzZXJ0KHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwpOwotICAgIHByb2cgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgaWYgKGV4dGVybmFsICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIG5zcGFjZSA9IG5hbWVzcGFjZV9wcmVmaXgodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgfQotCi0gIHJldHVybiBuc3BhY2UgKyAidHJsb18iICsgcHJlZml4ICsgIl8iICsgcHJvZyArICJfIiArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKLSAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8Ci0gICAgICAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7Ci0gICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkgKyAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3BwLCAiQysrIiwKLSIgICAgZGVuc2U6ICAgICAgICAgICBHZW5lcmF0ZSB0eXBlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wuXG4iCi0iICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCi0pOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkYmYxOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLWNsYXNzIHRfY3NoYXJwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IKLXsKLSAgcHVibGljOgotICAgIHRfY3NoYXJwX2dlbmVyYXRvcigKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICAgIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNzaGFycCI7Ci0gICAgfQotICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICAgIHZvaWQgZ2VuZXJhdGVfZW51bSAodF9lbnVtKiB0ZW51bSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljKTsKLSAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSwgYm9vbCBuZWVkdHlwZT1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICAgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6OnN0cmluZyBtYXApOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0gICAgdm9pZCBlbmRfY3NoYXJwX25hbWVzcGFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLQotICAgIHN0ZDo6c3RyaW5nIGNzaGFycF90eXBlX3VzaW5ncygpOwotICAgIHN0ZDo6c3RyaW5nIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb3VudGFpbmVyPWZhbHNlLCBib29sIGluX2luaXQ9ZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICAgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpOwotCi0gICAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87Ci19OwotCi0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotCi0gIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIG91dCA8PAotICAgICAgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdHlwZV91c2luZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArCi0gICAgInVzaW5nIFN5c3RlbTtcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLklPO1xuIiArCi0gICAgInVzaW5nIFRocmlmdDtcbiIgKwotICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsKLSAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArCi0gICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeyB9Ci12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfKyIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkrIi5jcyI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgaW50IHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKQotICB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKXsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvQ29uc3RhbnRzLmNzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLQotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLQotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCBmYWxzZSkpIHsKLSAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKLSAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9jb25zdHMpOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKLXsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIENvbnN0YW50cygpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLy9pdCBzZWVtcyBsaWtlIGFsbCB0aGF0IG1ldGhvZHMgdGhhdCBjYWxsIHRoaXMgYXJlIHVzaW5nIGluX3N0YXRpYyB0byBiZSB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBpdCB3b3VsZCBpbXBseQotYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCwgYm9vbCBuZWVkdHlwZSkgewotICBpbmRlbnQob3V0KTsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOwotICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkgewotICAgIG91dCA8PAotICAgICAgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgIikgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLQotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KSB7Ci0KLSAgaWYgKCFpbl9jbGFzcykgewotICAgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiRXhjZXB0aW9uLCAiOwotICB9Ci0gIG91dCA8PCAiVEJhc2UiOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvL21ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSk7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInB1YmxpYyBib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYgKCFpbl9jbGFzcykKLSAgewotICAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ0aGlzLl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZmF1bHQ6ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmIChfX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiIGVsc2UgaWYgIjsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8Ci0gICAgICAgICIodGhpcy5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iOwotICAgIH0KLSAgfQotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiBcIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2IuQXBwZW5kKFwiLCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICI8PCAidGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJzYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicmV0dXJuIHNiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PAotICAgIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DYWxsLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QgKnhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0KLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCAqeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgdm9pZCAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKLSAgICB7Ci0gICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOwotICAgIH0KLQotICAgIG91dCA8PCAiaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8ZW5kbDsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciggaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50IiA8PCAiOyAiIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLQotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgc3dpdGNoKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5LZXlzKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImdldCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgICBzdHJpbmcgbmFtZSAodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKLSAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKwotICAgICAgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKLSAgICBpZiAoIW5zLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBucyArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcikgewotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuICJieXRlW10iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgICAgfQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAic2hvcnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJsb25nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRiYXNlLT5nZXRfYmFzZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNzaGFycCwgIkMjIiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwMDNhYi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgcHJvZ3JhbV9uYW1lX1swXSA9IHRvbG93ZXIocHJvZ3JhbV9uYW1lX1swXSk7Ci0gICAgc2VydmljZV9uYW1lX1swXSA9IHRvbG93ZXIoc2VydmljZV9uYW1lX1swXSk7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6Om9zdHJlYW0mIGhybF9vdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8gICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0KLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfdHlwZV90ZXJtKHRfdHlwZSogdHR5cGUsIGJvb2wgZXhwYW5kX3N0cnVjdHMpOwotICBzdGQ6OnN0cmluZyB0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b3VwcGVyKGluWzBdKTsKLSAgICByZXR1cm4gaW47Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1bmNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogYWRkIGZ1bmN0aW9uIHRvIGV4cG9ydCBsaXN0Ci0gICAqLwotCi0gIHZvaWQgZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgdm9pZCBleHBvcnRfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOwotCi0gIHZvaWQgZXhwb3J0X3R5cGVzX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgdm9pZCBleHBvcnRfdHlwZXNfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOwotCi0gIC8qKgotICAgKiB3cml0ZSBvdXQgaGVhZGVycyBhbmQgZm9vdGVycyBmb3IgaHJsIGZpbGVzCi0gICAqLwotCi0gIHZvaWQgaHJsX2hlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgaHJsX2Zvb3RlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIHN0dWZmIHRvIHNwaXQgb3V0IGF0IHRoZSB0b3Agb2YgZ2VuZXJhdGVkIGZpbGVzCi0gICAqLwotCi0gIGJvb2wgZXhwb3J0X2xpbmVzX2ZpcnN0XzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF9saW5lc187Ci0KLSAgYm9vbCBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X3R5cGVzX2xpbmVzXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaHJsX2ZpbGVfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfZmlsZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2hybF87Ci0KLX07Ci0KLQotLyoqCi0gKiBVSSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBzZXR1cCBleHBvcnQgbGluZXMKLSAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7Ci0gIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIC8vIHR5cGVzIGZpbGVzCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5lcmwiOwotICBzdHJpbmcgZl90eXBlc19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmhybCI7Ci0KLSAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOwotCi0gIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzIik7Ci0KLSAgZl90eXBlc19maWxlXyA8PAotICAgIGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMpLiIgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8Ci0gICAgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19ocmxfZmlsZV8gPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICAvLyBjb25zdHMgZmlsZQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX2NvbnN0YW50cy5ocmwiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIGZfY29uc3RzXyA8PAotICAgIGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgZXJsX2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogQm9pbGVycGxhdGUgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGVhZGVyIGZpbGVzCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfaGVhZGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICItaWZuZGVmKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCkuIiA8PCBlbmRsIDw8Ci0gICAgIi1kZWZpbmUoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkLCB5ZWFoKS4iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfZm9vdGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICItZW5kaWYuIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gIi1pbmNsdWRlKFwiIiArIHVuY2FwaXRhbGl6ZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLmhybFwiKS5cbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIlJVxuIikgKwotICAgICIlJSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgIiUlXG4iICsKLSAgICAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIiUlXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZl90eXBlc19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfdHlwZXNfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgZl90eXBlc18uc3RyKCk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvKCdpIGFtIGEgZHVtbXkgc3RydWN0JykgLT4gdW5kZWZpbmVkLiIgPDwgZW5kbDsKLQotICBocmxfZm9vdGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBzdHJpbmcoIkJPR1VTIikpOwotCi0gIGZfdHlwZXNfZmlsZV8uY2xvc2UoKTsKLSAgZl90eXBlc19ocmxfZmlsZV8uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gbm8gb3AKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgaW50IHZhbHVlID0gLTE7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl90eXBlc19ocmxfZmlsZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICItZGVmaW5lKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiXyIgPDwgbmFtZSA8PCAiLCAiIDw8IHZhbHVlIDw8ICIpLiI8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc19ocmxfZmlsZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiLWRlZmluZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl8iIDw8IG5hbWUgPDwgIiwgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpLiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAiIyIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAieyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8ICIgPSAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIG91dCA8PCAiZGljdDpmcm9tX2xpc3QoWyI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdD1mYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIigiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSAgPDwgIiwiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8ICJzZXRzOmZyb21fbGlzdChbIjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiLHRydWUpIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgb3V0IDw8ICJbIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIGZfdHlwZXNfaHJsX2ZpbGVfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBocmxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KQotewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICIlJSBzdHJ1Y3QgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgICAgIDw8ICIlIC1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7Ci0gICAgaW5kZW50KGhybF9vdXQpIDw8ICAgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCAgICAgPDwgIiwgIjsKLSAgICAgICAgaHJsX291dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHVuY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgb3V0ICAgICA8PCBuYW1lOwotICAgICAgaHJsX291dCA8PCBuYW1lOwotICAgIH0KLSAgICBvdXQgICAgIDw8ICJ9KS4iIDw8IGVuZGw7Ci0gICAgaHJsX291dCA8PCAifSkuIiA8PCBlbmRsOwotICB9IGVsc2UgeyAvLyBubyBtZW1iZXJzOyBleHBsaWNpdCBjb21tZW50Ci0gICAgaW5kZW50KG91dCkgICAgIDw8ICIlIC1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwge30pLiIgPDwgZW5kbDsKLSAgICBpbmRlbnQoaHJsX291dCkgPDwgICAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7fSkuIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGhybF9vdXQgPDwgZW5kbDsKLQotCi0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvdXQsIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm8oJyIgPDwgbmFtZSA8PCAiJykgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBnZW5lcmF0ZV90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIHNvbWVob3cgdGhpcyBwb2ludCBpcyByZWFjaGVkIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgYW5kIGl0J3Mgbm90IGRvd25jYXNlZCB5ZXQKLSAgLy8gLi4uYXdlc29tZQotICBzZXJ2aWNlX25hbWVfWzBdID0gdG9sb3dlcihzZXJ2aWNlX25hbWVfWzBdKTsKLQotICBzdHJpbmcgZl9zZXJ2aWNlX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyJfdGhyaWZ0LmhybCI7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrc2VydmljZV9uYW1lXysiX3RocmlmdC5lcmwiOwotICBmX3NlcnZpY2VfZmlsZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgZl9zZXJ2aWNlX2hybF8ub3BlbihmX3NlcnZpY2VfaHJsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUmVzZXQgc2VydmljZSB0ZXh0IGFnZ3JlZ2F0aW5nIHN0cmVhbSBzdHJlYW1zCi0gIGZfc2VydmljZV8uc3RyKCIiKTsKLSAgZXhwb3J0X2xpbmVzXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICBocmxfaGVhZGVyKGZfc2VydmljZV9ocmxfLCBzZXJ2aWNlX25hbWVfKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIgPDwKLSAgICAgIHVuY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIl90aHJpZnQuaHJsXCIpLiAlIGluaGVyaXQgIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlX2hybF8gPDwKLSAgICAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOyAvLyBjcGlybzogTmV3IEVybGFuZyBPcmRlcgotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICAvLyBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV9maWxlXyA8PAotICAgIGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIi1tb2R1bGUoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfdGhyaWZ0KS4iIDw8IGVuZGwgPDwKLSAgICAiLWJlaGF2aW91cih0aHJpZnRfc2VydmljZSkuIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICBlcmxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCAiX3RocmlmdC5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF9saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfc2VydmljZV9maWxlXyA8PCBmX3NlcnZpY2VfLnN0cigpOwotCi0gIGhybF9mb290ZXIoZl9zZXJ2aWNlX2hybF8sIGZfc2VydmljZV9uYW1lKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlX2ZpbGVfLmNsb3NlKCk7Ci0gIGZfc2VydmljZV9ocmxfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgLy8gICIlIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBleHBvcnRfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLSAgZl9zZXJ2aWNlXyAgICA8PCAic3RydWN0X2luZm8oJ2kgYW0gYSBkdW1teSBzdHJ1Y3QnKSAtPiB1bmRlZmluZWQuIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLQotICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9pbmZvIiwgMik7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgIiUlJSBpbnRlcmZhY2UiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gSW5oZXJpdGFuY2UgLSBwYXNzIHVua25vd24gZnVuY3Rpb25zIHRvIGJhc2UgY2xhc3MKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpIC0+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKS4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgICAgLy8gRHVtbXkgZnVuY3Rpb25faW5mbyBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGUgO3MKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyh4eHgsIGR1bW15KSAtPiBkdW1teS4iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCBwYXJhbXNfdHlwZSkgYW5kCi0gKiBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcmVwbHlfdHlwZSkKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotCi0gIHN0cmluZyBuYW1lX2F0b20gPSAiJyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiJyI7Ci0KLQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHBhcmFtc190eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGdlbmVyYXRlX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCByZXBseV90eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgZ2VuZXJhdGVfdHlwZV90ZXJtKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotICBlbHNlIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib25ld2F5X3ZvaWQ7IiA8PCBlbmRsOwotICBlbHNlCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ7c3RydWN0LCBbXX0iIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIGV4Y2VwdGlvbnMpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBleGNlcHRpb25zKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBnZW5lcmF0ZV90eXBlX3Rlcm0oeHMsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCkgeyAgLy8gVE9ETwotICBzdHJpbmcgcmVzdWx0ID0gIkAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ICs9ICIgPSBuaWwiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKFRoaXMiICsgIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKSArICIpIjsKLX0KLQotLyoqCi0gKiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgZXhwb3J0cyBsaXN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7Ci0gIGlmIChleHBvcnRfbGluZXNfZmlyc3RfKSB7Ci0gICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGV4cG9ydF9saW5lc18gPDwgIiwgIjsKLSAgfQotICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgKTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF90eXBlc19saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkKLSAgICAgICAgICAgICAgICApOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsgLy8gaW5pdGlhbCBjb21tYSB0byBjb21wZW5zYXRlIGZvciBpbml0aWFsIFRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIG5hbWUgPSB1bmNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI/dFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiP3RUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKLSAqLwotc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlX3Rlcm0odF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBhbmRfc3RydWN0cykgewotICAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmIChleHBhbmRfc3RydWN0cykgewotICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBUeXBlVGVybX0sIHtGaWQsIFR5cGVUZXJtfS4uLl19Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXQ7Ci0KLQotICAgICAgcmV0IDw8ICJ7c3RydWN0LCBbIjsKLQotICAgICAgaW50IGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAvLyBDb21tYSBzZXBhcmF0ZSB0aGUgdHVwbGVzCi0gICAgICAgIGlmICghZmlyc3QpIHJldCA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKTsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLQotICAgICAgICByZXQgPDwgInsiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwKLSAgICAgICAgICBnZW5lcmF0ZV90eXBlX3Rlcm0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIn0iOwotICAgICAgfQotCi0gICAgICByZXQgPDwgIl19IiA8PCBlbmRsOwotCi0gICAgICByZXR1cm4gcmV0LnN0cigpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIntzdHJ1Y3QsIHsnIiArIHR5cGVfbW9kdWxlKHR5cGUpICsgIicsICciICsgdHlwZV9uYW1lKHR5cGUpICsgIid9fSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgLy8ge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0KLSAgICB0X3R5cGUgKmtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSAqdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICByZXR1cm4gInttYXAsICIgKyBnZW5lcmF0ZV90eXBlX3Rlcm0oa2V5X3R5cGUsIGZhbHNlKSArICIsICIgKwotICAgICAgZ2VuZXJhdGVfdHlwZV90ZXJtKHZhbF90eXBlLCBmYWxzZSkgKyAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie3NldCwgIiArIGdlbmVyYXRlX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICByZXR1cm4gIntsaXN0LCAiICsgZ2VuZXJhdGVfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpIHsKLSAgcmV0dXJuIHVuY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzIjsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihlcmwsICJFcmxhbmciLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyYzAwMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcwotICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKLSAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgotICoKLSAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQotICovCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKLSAgY2xvc2VfZ2VuZXJhdG9yKCk7Ci19Ci0KLXN0cmluZyB0X2dlbmVyYXRvcjo6ZXNjYXBlX3N0cmluZyhjb25zdCBzdHJpbmcgJmluKSBjb25zdCB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW4uYmVnaW4oKTsgaXQgPCBpbi5lbmQoKTsgaXQrKykgewotICAgIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgcmVzID0gZXNjYXBlXy5maW5kKCppdCk7Ci0gICAgaWYgKHJlcyAhPSBlc2NhcGVfLmVuZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKHJlcy0+c2Vjb25kKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0LnB1c2hfYmFjaygqaXQpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGdlbmVyYXRlX2NvbnN0KCpjX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpIHsKLSAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7Ci0gIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOwotICB3aGlsZSAoIWRvY3MuZW9mKCkpIHsKLSAgICBjaGFyIGxpbmVbMTAyNF07Ci0gICAgZG9jcy5nZXRsaW5lKGxpbmUsIDEwMjQpOwotICAgIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKSB7ICAvLyBza2lwIHRoZSBlbXB0eSBsYXN0IGxpbmUKLSAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgfQotICBpZiAoY29tbWVudF9lbmQgIT0gIiIpIGluZGVudChvdXQpIDw8IGNvbW1lbnRfZW5kOwotfQotCi0KLXZvaWQgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KSB7Ci0gIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIGlmICh0aGVfbWFwLmZpbmQoZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKSkgIT0gdGhlX21hcC5lbmQoKSkgewotICAgIGZhaWx1cmUoIkR1cGxpY2F0ZSBnZW5lcmF0b3JzIGZvciBsYW5ndWFnZSBcIiVzXCIhXG4iLCBmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIHRoZV9tYXBbZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKV0gPSBmYWN0b3J5OwotfQotCi10X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9ucykgewotICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IG9wdGlvbnMuZmluZCgnOicpOwotICBzdHJpbmcgbGFuZ3VhZ2UgPSBvcHRpb25zLnN1YnN0cigwLCBjb2xvbik7Ci0KLSAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9uczsKLSAgaWYgKGNvbG9uICE9IHN0cmluZzo6bnBvcykgewotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGNvbG9uKzE7Ci0gICAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zIDwgb3B0aW9ucy5zaXplKCkpIHsKLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5leHRfcG9zID0gb3B0aW9ucy5maW5kKCcsJywgcG9zKTsKLSAgICAgIHN0cmluZyBvcHRpb24gPSBvcHRpb25zLnN1YnN0cihwb3MsIG5leHRfcG9zLXBvcyk7Ci0gICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zKzEpOwotCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBzZXBhcmF0b3IgPSBvcHRpb24uZmluZCgnPScpOwotICAgICAgc3RyaW5nIGtleSwgdmFsdWU7Ci0gICAgICBpZiAoc2VwYXJhdG9yID09IHN0cmluZzo6bnBvcykgewotICAgICAgICBrZXkgPSBvcHRpb247Ci0gICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBrZXkgPSBvcHRpb24uc3Vic3RyKDAsIHNlcGFyYXRvcik7Ci0gICAgICAgIHZhbHVlID0gb3B0aW9uLnN1YnN0cihzZXBhcmF0b3IrMSk7Ci0gICAgICB9Ci0KLSAgICAgIHBhcnNlZF9vcHRpb25zW2tleV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOwotCi0gIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOwotfQotCi10X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7Ci0gIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKLSAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKLSAgcmV0dXJuICp0aGVfbWFwOwotfQotCi10X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCi0gIDogc2hvcnRfbmFtZV8oc2hvcnRfbmFtZSkKLSAgLCBsb25nX25hbWVfKGxvbmdfbmFtZSkKLSAgLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKQotewotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRoaXMpOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM1YmY1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJ0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCi0gKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0Ci0gKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgotICoKLSAqLwotY2xhc3MgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gICAgdG1wXyA9IDA7Ci0gICAgaW5kZW50XyA9IDA7Ci0gICAgcHJvZ3JhbV8gPSBwcm9ncmFtOwotICAgIHByb2dyYW1fbmFtZV8gPSBnZXRfcHJvZ3JhbV9uYW1lKHByb2dyYW0pOwotICAgIGVzY2FwZV9bJ1xuJ10gPSAiXFxuIjsKLSAgICBlc2NhcGVfWydcciddID0gIlxcciI7Ci0gICAgZXNjYXBlX1snXHQnXSA9ICJcXHQiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiXFxcIiI7Ci0gICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCi0gICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCi0gICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOwotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKLQotICAvKioKLSAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZpbikgY29uc3Q7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLQotICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbWxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKLSAgICogc3RlcHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgY29kZSBnZW5lcmF0aW9uLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQdXJlIHZpcnR1YWwgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzZXMuCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pICAgICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KSB7fQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpICAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKSAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbikgewotICAgIC8vIEJ5IGRlZmF1bHQgZXhjZXB0aW9ucyBhcmUgdGhlIHNhbWUgYXMgc3RydWN0cwotICAgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHByb2dyYW0gbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3Byb2dyYW1fbmFtZSh0X3Byb2dyYW0qIHRwcm9ncmFtKSB7Ci0gICAgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9vdXRfZGlyKCkgY29uc3QgewotICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQotICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycwotICAgKi8KLQotICB2b2lkIGluZGVudF91cCgpewotICAgICsraW5kZW50XzsKLSAgfQotCi0gIHZvaWQgaW5kZW50X2Rvd24oKSB7Ci0gICAgLS1pbmRlbnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCi0gICAqLwotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgewotICAgICAgaW5kICs9ICIgICI7Ci0gICAgfQotICAgIHJldHVybiBpbmQ7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCi0gICAqLwotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0gJm9zKSB7Ci0gICAgcmV0dXJuIG9zIDw8IGluZGVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKLSAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAotICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCi0gICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCi0gICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCi0gICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCi0gICAqLwotICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKLSAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKLSAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKLSAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQotICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKLSAgICAqLwotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGluW2ldID09ICdfJykgewotICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAodW5kZXJzY29yZSkgewotICAgICAgICBvdXQgPDwgKGNoYXIpIHRvdXBwZXIoaW5baV0pOwotICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgb3V0IDw8IGluW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogVGhlIHByb2dyYW0gYmVpbmcgZ2VuZXJhdGVkCi0gICAqLwotICB0X3Byb2dyYW0qIHByb2dyYW1fOwotCi0gIC8qKgotICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHByb2dyYW0gbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZwotICAgKiBnZW5lcmF0ZWQuCi0gICAqLwotICBzdGQ6OnN0cmluZyBwcm9ncmFtX25hbWVfOwotCi0gIC8qKgotICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHNlcnZpY2UgbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZwotICAgKiBnZW5lcmF0ZWQuCi0gICAqLwotICBzdGQ6OnN0cmluZyBzZXJ2aWNlX25hbWVfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgdHlwZS1zcGVjaWZjIGRpcmVjdG9yeSBuYW1lICgiZ2VuLSoiKQotICAgKi8KLSAgc3RkOjpzdHJpbmcgb3V0X2Rpcl9iYXNlXzsKLQotICAvKioKLSAgICogTWFwIG9mIGNoYXJhY3RlcnMgdG8gZXNjYXBlIGluIHN0cmluZyBsaXRlcmFscy4KLSAgICovCi0gIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPiBlc2NhcGVfOwotCi0gcHJpdmF0ZToKLSAgLyoqCi0gICAqIEN1cnJlbnQgY29kZSBpbmRlbnRhdGlvbiBsZXZlbAotICAgKi8KLSAgaW50IGluZGVudF87Ci0KLSAgLyoqCi0gICAqIFRlbXBvcmFyeSB2YXJpYWJsZSBjb3VudGVyLCBmb3IgbWFraW5nIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcwotICAgKi8KLSAgaW50IHRtcF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxYzIyYS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKLSNkZWZpbmUgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotCi1jbGFzcyB0X2dlbmVyYXRvcjsKLQotLyoqCi0gKiBBIGZhY3RvcnkgZm9yIHByb2R1Y2luZyBnZW5lcmF0b3IgY2xhc3NlcyBvZiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuCi0gKgotICogVGhpcyBjbGFzcyBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvcjoKLSAqICAtIFJlZ2lzdGVyaW5nIGl0c2VsZiB3aXRoIHRoZSBnZW5lcmF0b3IgcmVnaXN0cnkuCi0gKiAgLSBQcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGdlbmVyYXRvcnMgaXQgcHJvZHVjZXMuCi0gKi8KLWNsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKLQotICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKAotICAgICAgLy8gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUuCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAvLyBOb3RlOiBwYXJzZWRfb3B0aW9ucyB3aWxsIG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgLy8gTm90ZTogb3B0aW9uX3N0cmluZyBtaWdodCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pCi0gIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLX07Ci0KLWNsYXNzIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KTsKLQotICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOwotCi0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZ2VuZXJhdG9yX2ZhY3RvcnkqPiBnZW5fbWFwX3Q7Ci0gIHN0YXRpYyBnZW5fbWFwX3QmIGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0KLSBwcml2YXRlOgotICB0X2dlbmVyYXRvcl9yZWdpc3RyeSgpOwotICB0X2dlbmVyYXRvcl9yZWdpc3RyeShjb25zdCB0X2dlbmVyYXRvcl9yZWdpc3RyeSYpOwotfTsKLQotI2RlZmluZSBUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGxhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgIFwKLSAgY2xhc3MgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4gICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCgpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPiggICAgICAgIFwKLSAgICAgICAgICAjbGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgX3JlZ2lzdGVyZXI7Ci0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFhMTc0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEhhc2tlbGwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2hzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9oc19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0gJm91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSxib29sIGhlbHBlcj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7Ci0gIHN0ZDo6c3RyaW5nIGhzX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucyA9IGZhbHNlLCBib29sIGlvID0gZmFsc2UsIGJvb2wgbWV0aG9kID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMgPSB0cnVlKTsKLQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pZmFjZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jbGllbnRfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0KLSAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcG5hbWUrIl9UeXBlcy5ocyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwbmFtZSsiX0NvbnN0cy5ocyI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IHBuYW1lIDw8Il9UeXBlcyB3aGVyZSIgPDwgZW5kbCA8PAotICAgIGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IHBuYW1lIDw8Il9Db25zdHMgd2hlcmUiIDw8IGVuZGwgPDwKLSAgICBoc19pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgIiA8PCBwbmFtZTw8Il9UeXBlcyI8PCBlbmRsOwotCi19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgewotICByZXR1cm4gc3RkOjpzdHJpbmcoInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Iik7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikgKwotICAgICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIiArCi0gICAgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iICsKLSAgICAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIgKwotICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19pbXBvcnRzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0KLSAgcmVzdWx0ICs9ICJpbXBvcnQgVGhyaWZ0XG5pbXBvcnQgRGF0YS5UeXBlYWJsZSAoIFR5cGVhYmxlIClcbmltcG9ydCBDb250cm9sLkV4Y2VwdGlvblxuaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXBcbmltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0XG5pbXBvcnQgRGF0YS5JbnQ7XG5pbXBvcnQgUHJlbHVkZSAoKD09KSwgU3RyaW5nLCBFcSwgU2hvdywgT3JkLCBNYXliZSguLiksICgmJiksICh8fCksIHJldHVybiwgSU8sIEVudW0sIGZyb21FbnVtLCB0b0VudW0sIEJvb2woLi4pLCAoKyspLCAoJCksIERvdWJsZSwgKC0pKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiPDwgY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9oc190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIjw8Y2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk8PCIgPSAiOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpZihmaXJzdCkKLSAgICAgIGZpcnN0PWZhbHNlOwotICAgIGVsc2UKLSAgICAgIGZfdHlwZXNfIDw8ICJ8IjsKLSAgICBmX3R5cGVzXyA8PCBuYW1lOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChTaG93LEVxLCBUeXBlYWJsZSwgT3JkKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbnQgdmFsdWUgPSAtMTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgRW51bSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgdmFsID0gLTE7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICAgIHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK3ZhbDsKLSAgICAgIH0KLSAgICAgIGlmKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgY25hbWUgPDwgInsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgImZfIiA8PCBjbmFtZSA8PCAiXyIgPDwgZm5hbWUgPDwgIiA9IEp1c3QgKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7Ci0KLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotICAgIGJvb2wgZmlyc3Q9dHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCI8PCB2YWwgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotCi0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBldHlwZSA9ICgodF9saXN0KikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgIHsKLSAgICAgICAgZXR5cGUgPSAoKHRfc2V0KikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAiOwotCi0gICAgb3V0IDw8ICJbIjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIl0iOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkKLSAgICAgICAgb3V0IDw8ICIpIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBIYXNrZWxsIHN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sdHN0cnVjdCwgaXNfZXhjZXB0aW9uLGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICI8PHRuYW1lPDwiID0gIjw8dG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgInsiOwotICAgIGJvb2wgZmlyc3Q9dHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBvdXQgPDwgImZfIiA8PCB0bmFtZSA8PCAiXyIgPDwgbW5hbWUgPDwgIiA6OiBNYXliZSAiIDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgfQotICAgIG91dCA8PCAifSI7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoU2hvdyxFcSxPcmQsVHlwZWFibGUpIiA8PCBlbmRsOwotICBpZiAoaXNfZXhjZXB0aW9uKSBvdXQgPDwgImluc3RhbmNlIEV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIC8vZl9zdHJ1Y3RfLmNsb3NlKCk7Ci19Ci0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIHQgPSB0bXAoIl90Iik7Ci0gIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWMgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7IC8vIGRvCi0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICIoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA8LSByZWFkRmllbGRCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiAiIDw8IHQgPDwiID09IFRfU1RPUCB0aGVuIHJldHVybiByZWMgZWxzZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7IC8vIGlmCi0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgaWQ8PCIgb2YgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsgLy8gY2FzZQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICI7Ci0gICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOyAvLyBpZgotICAgIGluZGVudChvdXQpIDw8ICJzIDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIjw8c25hbWU8PCJfZmllbGRzIGlwcm90IHJlY3tmXyI8PHNuYW1lPDwiXyI8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCI9SnVzdCBzfSIgPDwgZW5kbDsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlbHNlIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICI8PCB0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIjw8c25hbWU8PCJfZmllbGRzIGlwcm90IHJlYyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOyAvLyAtZG8KLSAgICBpbmRlbnRfZG93bigpOyAvLyAtaWYKLSAgfQotCi0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiXyAtPiBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICI8PHQ8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZEZpZWxkRW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iPDxzbmFtZTw8Il9maWVsZHMgaXByb3QgcmVjIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOyAvLyAtY2FzZQotICBpbmRlbnRfZG93bigpOyAvLyAtaWYKLSAgaW5kZW50X2Rvd24oKTsgLy8gLWRvCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gcmVhZAotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iPDxzbmFtZTw8IiBpcHJvdCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJlYWRTdHJ1Y3RCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJlYyA8LSByZWFkXyI8PHNuYW1lPDwiX2ZpZWxkcyBpcHJvdCAoIjw8c25hbWU8PCJ7IjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYoZmlyc3QpCi0gICAgICBmaXJzdD1mYWxzZTsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgIiwiOwotICAgIG91dCA8PCAiZl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiPU5vdGhpbmciOwotICB9Ci0gIG91dCA8PCAifSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkU3RydWN0RW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJlYyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ3cml0ZV8iPDxuYW1lPDwiIG9wcm90IHJlYyA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid3JpdGVTdHJ1Y3RCZWdpbiBvcHJvdCBcIiI8PG5hbWU8PCJcIiIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJjYXNlIGZfIiA8PCBuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIHJlYyBvZiB7Tm90aGluZyAtPiByZXR1cm4gKCk7IEp1c3QgX3YgLT4gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRCZWdpbiBvcHJvdCAoXCIiPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8dHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk8PCIsIgotICAgICAgICAgICAgICAgIDw8KCpmX2l0ZXIpLT5nZXRfa2V5KCk8PCIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl92Iik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRFbmQgb3Byb3R9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVGaWVsZFN0b3Agb3Byb3QiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVTdHJ1Y3RFbmQgb3Byb3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIuaHMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbCA8PAotICAgIGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0KLSAgaWYodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYXMgSWZhY2UiIDw8IGVuZGw7Ci0KLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAtLSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSsiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0gIGluZGVudChmX2lmYWNlXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9pZmFjZV8pIDw8Ci0gICAgaHNfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8Il9JZmFjZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2lmYWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlLHRydWUpOwotICAgIGZfaWZhY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCAgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2lmYWNlXy5jbG9zZSgpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpK2NhcGl0YWxpemUoc2VydmljZV9uYW1lXykrIl9DbGllbnQuaHMiOwotICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHBvcnRzPSIiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZihmaXJzdCkKLSAgICAgIGZpcnN0PWZhbHNlOwotICAgIGVsc2UKLSAgICAgIGV4cG9ydHMrPSIsIjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBleHBvcnRzKz1mdW5uYW1lOwotICB9Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfQ2xpZW50KCI8PGV4cG9ydHM8PCIpIHdoZXJlIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9DbGllbnQiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBEYXRhLklPUmVmIiA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKLSAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBuZXdJT1JlZiAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZmFyZ3MrPSAiIGFyZ18iICsgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIChpcCxvcCkiIDw8ICBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKLQotICAgIGZfY2xpZW50XyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX2NsaWVudF8gPDwgaW5kZW50KCk7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxIDwtIHNlcWlkIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFuIDwtIHJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7Ci0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfY2xpZW50XyA8PAotICAgICAgaW5kZW50KCkgPDwgIndyaXRlTWVzc2FnZUJlZ2luIG9wIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgTV9DQUxMLCBzZXFuKSIgPDwgZW5kbDsKLSAgICBmX2NsaWVudF8gPDwgaW5kZW50KCkgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIjw8YXJnc25hbWU8PCJ7IjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYoZmlyc3QpCi0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgZWxzZQotICAgICAgICBmX2NsaWVudF8gPDwgIiwiOwotICAgICAgZl9jbGllbnRfIDw8ICJmXyIgPDwgYXJnc25hbWUgPDwiXyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIj1KdXN0IGFyZ18iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX2NsaWVudF8gPDwgIn0pIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfY2xpZW50XyA8PAotICAgICAgaW5kZW50KCkgPDwgIndyaXRlTWVzc2FnZUVuZCBvcCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICBzdGQ6OnN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsgLy8gZnVuCi0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpIDwtIHJlYWRNZXNzYWdlQmVnaW4gaXAiIDw8IGVuZGw7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIG10eXBlID09IE1fRVhDRVBUSU9OIHRoZW4gZG8iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA8LSByZWFkQXBwRXhuIGlwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJlYWRNZXNzYWdlRW5kIGlwIiA8PCBlbmRsOwotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHgiIDw8IGVuZGw7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZWxzZSByZXR1cm4gKCkiIDw8IGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLSAgICAgIGZfY2xpZW50XyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXAiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBmXyIgPDwgcmVzdWx0bmFtZSA8PCAiX3N1Y2Nlc3MgcmVzIG9mIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsgLy8gY2FzZQotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCB2IC0+IHJldHVybiB2IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTm90aGluZyAtPiBkbyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7IC8vIG5vbmUKLSAgICAgIH0KLQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBmXyI8PCByZXN1bHRuYW1lIDw8ICJfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiByZXMgb2YiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOyAvL2Nhc2UKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gcmV0dXJuICgpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCBfdiAtPiB0aHJvdyBfdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsgLy8tY2FzZQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PAotICAgICAgICAgICJyZXR1cm4gKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgKEFwcEV4biBBRV9NSVNTSU5HX1JFU1VMVCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsgLy8tbm9uZQotICAgICAgICBpbmRlbnRfZG93bigpOyAvLy1jYXNlCi0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOyAvLy1mdW4KLSAgICB9Ci0gIH0KLSAgZl9jbGllbnRfLmNsb3NlKCk7Ci0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJcIiI8PGZuYW1lPDwiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIC0+ICI7Ci0gIGlmKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpewotICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSA8PCAiLnByb2MgaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJza2lwIGlwcm90IFRfU1RSVUNUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAobmFtZSxNX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZUFwcEV4biBvcHJvdCAoQXBwRXhuIEFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gXCIgKysgbmFtZSkpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidEZsdXNoIChnZXRUcmFuc3BvcnQgb3Byb3QpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwLCBzZXFpZCkgPC0gcmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvYyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGludCBuID0geGNlcHRpb25zLnNpemUoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICBpZighdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpewotICAgICAgbisrOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJzIDwtIHJldHVybiAoIiA8PCByZXN1bHRuYW1lOwotCi0gICAgZm9yKGludCBpPTA7IGk8bjtpKyspewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIE5vdGhpbmciOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXMgPC0gIjsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHhjZXB0aW9ucy5zaXplKCk7aSsrKXsKLSAgICAgIGZfc2VydmljZV8gPDwgIihDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIoZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKXsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXMgPC0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGhhbmRsZXIiOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgICIgKGZfIiA8PCBhcmdzbmFtZSA8PCAgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGFyZ3MpIjsKLSAgfQotCi0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSl7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJze2ZfIjw8cmVzdWx0bmFtZTw8Il9zdWNjZXNzPSBKdXN0IHJlc30iOwotICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcnMiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwICYmICF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gIiA8PGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcnN7Zl8iPDxyZXN1bHRuYW1lPDwiXyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPUp1c3QgZX0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gKCkiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotCi0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIE1fUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVfIjw8cmVzdWx0bmFtZTw8IiBvcHJvdCByZXMiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCl7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsdHlwZSk7Ci19Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKXsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLSAgfQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgIiBpcHJvdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBvdXQgPDwgIihkbyB7aSA8LSByZWFkSTMyIGlwcm90OyByZXR1cm4gKHRvRW51bSBpIDo6ICIgPDwgZW5hbWUgPDwgIil9KSI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIocmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotCi19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHtrIDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICI7IHYgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIChrLHYpOnJ9fSBpbiBkbyB7KCI8PGt0eXBlPDwiLCI8PHZ0eXBlPDwiLCI8PHNpemU8PCIpIDwtIHJlYWRNYXBCZWdpbiBpcHJvdDsgbCA8LSBmICIgPDwgc2l6ZSA8PCAiOyByZXR1cm4gJCBNYXAuZnJvbUxpc3QgbH0pIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIihsZXQge2YgMCA9IHJldHVybiBbXTsgZiBuID0gZG8ge3YgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIHY6cn19IGluIGRvIHsoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPC0gcmVhZFNldEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIFNldC5mcm9tTGlzdCBsfSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIihsZXQge2YgMCA9IHJldHVybiBbXTsgZiBuID0gZG8ge3YgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIHY6cn19IGluIGRvIHsoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPC0gcmVhZExpc3RCZWdpbiBpcHJvdDsgZiAiIDw8IHNpemUgPDwgIn0pIjsKLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZihuYW1lLmxlbmd0aCgpID09IDApewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZyBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNiBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIgb3Byb3QgIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBocyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIgb3Byb3QgKGZyb21FbnVtICI8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ3cml0ZV8iKSA8PCAiIG9wcm90ICIgPDwgcHJlZml4OwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrID0gdG1wKCJfa2l0ZXIiKTsKLSAgICBzdHJpbmcgdiA9IHRtcCgiX3ZpdGVyIik7Ci0gICAgb3V0IDw8ICIobGV0IHtmIFtdID0gcmV0dXJuICgpOyBmICgoIjw8azw8IiwiPDx2PDwiKTp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGssIHYpOwotICAgIG91dCA8PCAiO2YgdH19IGluIGRvIHt3cml0ZU1hcEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpPDwiLCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk8PCIsTWFwLnNpemUgIiA8PCBwcmVmaXggPDwgIik7IGYgKE1hcC50b0xpc3QgIiA8PCBwcmVmaXggPDwgIik7d3JpdGVNYXBFbmQgb3Byb3R9KSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIjw8djw8Ijp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHYpOwotICAgIG91dCA8PCAiO2YgdH19IGluIGRvIHt3cml0ZVNldEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTw8IixTZXQuc2l6ZSAiIDw8IHByZWZpeCA8PCAiKTsgZiAoU2V0LnRvTGlzdCAiIDw8IHByZWZpeCA8PCAiKTt3cml0ZVNldEVuZCBvcHJvdH0pIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIjw8djw8Ijp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgdik7Ci0gICAgb3V0IDw8ICI7ZiB0fX0gaW4gZG8ge3dyaXRlTGlzdEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk8PCIsbGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyBmICIgPDwgcHJlZml4IDw8ICI7d3JpdGVMaXN0RW5kIG9wcm90fSkiOwotICB9Ci0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBvdXQgPDwgImRvIHsiOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLSAgb3V0IDw8ICI7IjsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci0gIG91dCA8PCAifSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYob3B0aW9ucykgcmVzdWx0ICs9ICJNYXliZSAiOwotICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbnMpOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLSAgaWYoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCl7Ci0gICAgcmVzdWx0ICs9ICIoKSAtPiAiOwotICB9Ci0gIGlmKGlvKSByZXN1bHQgKz0gIklPICI7Ci0gIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgaW8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmKHR0eXBlLT5pc19zZXJ2aWNlKCkpewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBuYW1lOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJUX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdHlwZV9yZXByOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJCb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUoKCh0X2VudW0qKXR5cGUpLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgdHlwZV9yZXByID0gIk1hcC5NYXAgIiArIHJlbmRlcl9oc190eXBlKGt0eXBlLCB0cnVlKSArICIgIiArIHJlbmRlcl9oc190eXBlKHZ0eXBlLCB0cnVlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgdHlwZV9yZXByID0gIlNldC5TZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKSA7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiWyIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgZmFsc2UpICsgIl0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWE5NTMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEhUTUwgY29kZSBnZW5lcmF0b3IKLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9odG1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2h0bWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKLSAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgZXNjYXBlX1snJiddICA9ICImYW1wOyI7Ci0gICAgZXNjYXBlX1snPCddICA9ICImbHQ7IjsKLSAgICBlc2NhcGVfWyc+J10gID0gIiZndDsiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiJnF1b3Q7IjsKLSAgICBlc2NhcGVfWydcJyddID0gIiZhcG9zOyI7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLQotICB2b2lkIHByaW50X2RvYyAgICAgICAgKHRfZG9jKiB0ZG9jKTsKLSAgaW50ICBwcmludF90eXBlICAgICAgICh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOwotfTsKLQotLyoqCi0gKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgewotICBmX291dF8gPDwgIjx0YWJsZT48dHI+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCi0JIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgewotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgewotICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLQkgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0Jc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotCXN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIGZuYW1lICsgIiNGbl8iICsgbmFtZSArICJfIiArCi0JICBmbl9uYW1lICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7Ci0JZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG1hcDxzdHJpbmcsc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOwotCSAgIGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOyBodG1sX2l0ZXIrKykgewotCWZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhX3R5cGVzOwotICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy8gPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gdHByb2ctPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqb19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBmbmFtZSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBmbmFtZSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLQkiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7Ci0gICAgICAgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOyBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+PGNvZGU+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3RfaHRtbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7Ci0gICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaHRtbCA9IjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0NvbnN0XyIgKyBuYW1lICsKLQkiXCI+IiArIG5hbWUgKyAiPC9hPiI7Ci0gICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gICAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOwotCSBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOyBjb25faXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIKLQkgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKQotCSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIgotCSA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7Ci0KLSAgcHJpbnRfZG9jKHByb2dyYW1fKTsKLQotICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgICBmX291dF8gPDwgIjx0YWJsZT4iOwotICAgIGZfb3V0XyA8PCAiPHRyPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0gICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLQlnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0JZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotCi0gIGdlbmVyYXRlX2luZGV4KCk7Ci0gIGdlbmVyYXRlX2NzcygpOwotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgewotICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgImluZGV4Lmh0bWwiOwotICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICI8aHRtbD48aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGxpbmsgaHJlZj1cInN0eWxlLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIi8+IgotCSA8PCBlbmRsOwotICBmX291dF8gPDwgIjx0aXRsZT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PiIKLQkgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCi0JIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RyPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKLSAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAic3R5bGUuY3NzIjsKLSAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgIi8qIEF1dG8tZ2VuZXJhdGVkIENTUyBmb3IgZ2VuZXJhdGVkIFRocmlmdCBkb2NzICovIiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiYm9keSB7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIHNhbnMtc2VyaWY7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOyBwYWRkaW5nOiA2cHg7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJoMyxoNCB7IHBhZGRpbmctdG9wOiAwcHg7IG1hcmdpbi10b3A6IDBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgbWFyZ2luOiAxMHB4OyBwYWRkaW5nOiAxMHB4OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiZGl2LmV4dGVuZHMgeyBtYXJnaW46IC0wLjVlbSAwIDFlbSA1ZW0gfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRhYmxlIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRkIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgcGFkZGluZzogMXB4IDZweDsgdmVydGljYWwtYWxpZ246IHRvcDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRoIHsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNiYmJiYmI7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMXB4IDZweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKLSAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIHN0cmluZyBkb2MgPSB0ZG9jLT5nZXRfZG9jKCk7Ci0gICAgc2l6ZV90IGluZGV4OwotICAgIHdoaWxlICgoaW5kZXggPSBkb2MuZmluZF9maXJzdF9vZigiXHJcbiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGlmIChpbmRleCA9PSAwKSB7Ci0JZl9vdXRfIDw8ICI8cC8+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlmX291dF8gPDwgZG9jLnN1YnN0cigwLCBpbmRleCkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChpbmRleCArIDEgPCBkb2Muc2l6ZSgpICYmIGRvYy5hdChpbmRleCkgIT0gZG9jLmF0KGluZGV4ICsgMSkgJiYKLQkgIChkb2MuYXQoaW5kZXggKyAxKSA9PSAnXHInIHx8IGRvYy5hdChpbmRleCArIDEpID09ICdcbicpKSB7Ci0JaW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGRvYyA9IGRvYy5zdWJzdHIoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IGRvYyA8PCAiPGJyLz4iOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCi0gKi8KLWludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaW50IGxlbiA9IDA7Ci0gIGZfb3V0XyA8PCAiPGNvZGU+IjsKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKLSAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBmX291dF8gPDwgInNldCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IHByb2dfbmFtZSA8PCAiLmh0bWwjIjsKLSAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgZl9vdXRfIDw8ICJUeXBlZGVmXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBmX291dF8gPDwgIkVudW1fIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3ZjXyI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIlwiPiI7Ci0gICAgbGVuID0gdHlwZV9uYW1lLnNpemUoKTsKLSAgICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKLSAgICAgIGZfb3V0XyA8PCBwcm9nX25hbWUgPDwgIi4iOwotICAgICAgbGVuICs9IHByb2dfbmFtZS5zaXplKCkgKyAxOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICI8L2E+IjsKLSAgfQotICBmX291dF8gPDwgIjwvY29kZT4iOwotICByZXR1cm4gbGVuOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgotICAgIGZfb3V0XyA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgJyInOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKLSAgICB7Ci0gICAgICBmX291dF8gPDwgInsgIjsKLSAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7Ci0JICAgbWFwX2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCAiOwotCX0KLQlmaXJzdCA9IGZhbHNlOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5maXJzdCk7Ci0JZl9vdXRfIDw8ICIgPSAiOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5zZWNvbmQpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgfSI7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgewotICAgICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7OwotICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOwotCSAgIGxpc3RfaXRlcisrKSB7Ci0JaWYgKCFmaXJzdCkgewotCSAgZl9vdXRfIDw8ICIsICI7Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfY29uc3RfdmFsdWUoKmxpc3RfaXRlcik7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIiB9IjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZQotCSA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKLSAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lCi0JIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHRlbnVtKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7Ci0gIGZfb3V0XyA8PCAiPGJyLz48dGFibGU+IiA8PCBlbmRsOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZQotCSA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPiI7Ci0gIGZfb3V0XyA8PCAiPHRyPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvdGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdHI+IgotCSA8PCBlbmRsOwotICBmb3IgKCA7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPC90ZD48dGQ+IjsKLSAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfZG9jKCk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGZfb3V0XyA8PCAib3B0aW9uYWwiOwotICAgIH0gZWxzZSBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBmX291dF8gPDwgInJlcXVpcmVkIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8ICJkZWZhdWx0IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShkZWZhdWx0X3ZhbCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOwotICBwcmludF9kb2ModHN0cnVjdCk7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IjsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIKLQkgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKLSAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKLSAgfQotICBwcmludF9kb2ModHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZm9yICggOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7Ci0gICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lCi0JICAgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iIDw8IGZuX25hbWUKLQkgICA8PCAiPC9oND4iIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8ICI8cHJlPiI7Ci0gICAgaW50IG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKLSAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoIDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCIgPDwgZW5kbDsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKLQkgICAgZl9vdXRfIDw8ICIgIjsKLQkgIH0KLQl9Ci0JZmlyc3QgPSBmYWxzZTsKLQlwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQlmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotCWlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotCSAgZl9vdXRfIDw8ICIgPSAiOwotCSAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiKSIgPDwgZW5kbDsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7Ci0gICAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgewotICAgICAgZl9vdXRfIDw8ICIgICAgdGhyb3dzICI7Ci0gICAgICBmb3IgKCA7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0JaWYgKCFmaXJzdCkgewotCSAgZl9vdXRfIDw8ICIsICI7Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCBlbmRsOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvcHJlPiI7Ci0gICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PiI7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihodG1sLCAiSFRNTCIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0OGNmNy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9qYXZhX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYmVhbnMiKTsKLSAgICBiZWFuX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwcml2YXRlLW1lbWJlcnMiKTsKLSAgICBwcml2YXRlX21lbWJlcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vY2FtZWwiKTsKLSAgICBub2NhbWVsX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJoYXNoY29kZSIpOwotICAgIGdlbl9oYXNoX2NvZGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLCBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCBoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlLCBib29sIHNraXBfZ2VuZXJpYz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpIHx8Ci0gICAgICB0dHlwZS0+aXNfZW51bSgpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLQotICBib29sIGJlYW5fc3R5bGVfOwotICBib29sIHByaXZhdGVfbWVtYmVyc187Ci0gIGJvb2wgbm9jYW1lbF9zdHlsZV87Ci0gIGJvb2wgZ2VuX2hhc2hfY29kZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHN0cmluZyBoYXNoX2J1aWxkZXI7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGhhc2hfYnVpbGRlciA9ICJpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7XG4iOwotICB9Ci0KLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgIGhhc2hfYnVpbGRlciArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9ucztcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkJpdFNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjtcbiIKLSAgICAiaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCi0gKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKLSAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgLy8gQWRkIGphdmEgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9lbnVtIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSI7Ci0gIH0KLSAgZl9lbnVtIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBGaW5kIGEgdGhlIGVudW0gdHlwZSBieSBpdHMgaW50ZWdlciB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljICIrIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2YWx1ZSA9IC0xOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7ICAKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX2NvbnN0cyA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZSAKLSAqIGltcGxlbWVudG9yLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7Ci0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotCi0gIGluZGVudChmX3N0cnVjdCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgIDw8ICIgZXh0ZW5kcyBUVW5pb248IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLl9GaWVsZHM+ICI7Ci0KLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICAKLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc3RydWN0KTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIgCi0gICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKLSAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCi0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB3cml0ZVZhbHVlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIiA9ICgiIDw8ICB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgc2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotCi0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBURmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAoZ2VuX2hhc2hfY29kZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBIYXNoQ29kZUJ1aWxkZXIgaGNiID0gbmV3IEhhc2hDb2RlQnVpbGRlcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBoY2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBURmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIGhjYi5hcHBlbmQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVEVudW0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgIGhjYi5hcHBlbmQoKChURW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgICBoY2IuYXBwZW5kKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGhjYi50b0hhc2hDb2RlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSI7Ci0KLSAgb3V0IDw8ICIgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgfQotICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLQotICAvLyBpc3NldCBkYXRhCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikKLSAgICAgICAgICA8PCAiID0gIiA8PCBpIDw8ICI7IiA8PCAgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID4gMCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNvcHkgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5vcihvdGhlci5fX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsgICAgCi0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGNsb25lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGluZGVudChvdXQpIDw8ICJIYXNoQ29kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBIYXNoQ29kZUJ1aWxkZXIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBzdHJpbmcgcHJlc2VudCA9ICJ0cnVlIjsKLQotICAgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICAgIHByZXNlbnQgKz0gIiAmJiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbGVhbiBwcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCBwcmVzZW50IDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImJ1aWxkZXIuYXBwZW5kKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAocHJlc2VudF8iIDw8IG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBidWlsZGVyLnRvSGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHR5cGVkT3RoZXIgPSAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIilvdGhlcjsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpLmNvbXBhcmVUbyh0eXBlZE90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyI7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHR5cGVkT3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgICBpZiAoIWJlYW5fc3R5bGVfKXsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSBjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLSAgCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRWYWx1ZShfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhmaWVsZElEKSwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGdldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0RmllbGRWYWx1ZShfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhmaWVsZElkKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpc1NldChpbnQgZmllbGRJRCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGlzU2V0KF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGZpZWxkSUQpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwKLSAgICAgICAgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICAiPiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIKLSAgICAgICAgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PAotICAgICAgICB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJgotICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgfQotICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgInZvaWQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgIH0KLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJNYXA8X0ZpZWxkcywgRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7IiA8PCBlbmRsOwotCi0gIC8vIFBvcHVsYXRlIG1hcAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRtcE1hcC5wdXQoX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIiwgbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgIDw8ICIpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqIAotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuRU5VTSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJUVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAiVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJUVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJUVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSl7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKXsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7ICAgCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgCi0gICAgfSBlbHNleyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBFbnVtTWV0YURhdGEoVFR5cGUuRU5VTSwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKLSAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmphdmEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwKLSAgICAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIiAuQXN5bmNJZmFjZSI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCB0cnVlKSA8PCAiIHRocm93cyBURXhjZXB0aW9uOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnRGYWN0b3J5PENsaWVudD4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEZhY3RvcnkoKSB7fSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChUUHJvdG9jb2wgcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQocHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ0aGlzKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBpbnQgc2VxaWRfOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgKytzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiVEFzeW5jQ2xpZW50IjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKLSAgICAvLyBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQXN5bmNDbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHMgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gRmFjdG9yeSBtZXRob2QKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUQXN5bmNDbGllbnRGYWN0b3J5PEFzeW5jQ2xpZW50PiB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBUQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShUQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXIsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLmNsaWVudE1hbmFnZXIgPSBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsgCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMucHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgQXN5bmNDbGllbnQgZ2V0QXN5bmNDbGllbnQoVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgcmV0dXJuIG5ldyBBc3luY0NsaWVudChwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNDbGllbnQoVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlciwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogcmV0X3R5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIGZ1bmNsYXNzbmFtZSA9IGZ1bm5hbWUgKyAiX2NhbGwiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgYXJnc19uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0X25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAvLyBNYWluIG1ldGhvZCBib2R5ICAgCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgZmFsc2UpIDw8ICIgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgY2hlY2tSZWFkeSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgIiA8PCBmdW5jbGFzc25hbWUgPDwgIiBtZXRob2RfY2FsbCA9IG5ldyAiICsgZnVuY2xhc3NuYW1lICsgIigiIDw8IGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUpIDw8ICIsIHRoaXMsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7ICAgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBtYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZSArICIgZXh0ZW5kcyBUQXN5bmNNZXRob2RDYWxsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBNZW1iZXIgdmFyaWFibGVzCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gTk9URSBzaW5jZSB3ZSB1c2UgYSBuZXcgQ2xpZW50IGluc3RhbmNlIHRvIGRlc2VyaWFsaXplLCBsZXQncyBrZWVwIHNlcWlkIHRvIDAgZm9yIG5vdwotICAgIC8vIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBpbnQgc2VxaWQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyBmdW5jbGFzc25hbWUgKyAiKCIgKyBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlLCB0cnVlKSA8PCAiLCBUQXN5bmNDbGllbnQgY2xpZW50LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIEFzc2lnbiBtZW1iZXIgdmFyaWFibGVzCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLiIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSByZXF1ZXN0Ci0gICAgLy8gTk9URSB3ZSBhcmUgbGVhdmluZyBzZXFpZCBhcyAwLCBmb3Igbm93IChzZWUgYWJvdmUpCi0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzX25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc19uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUocHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gUmV0dXJuIG1ldGhvZCAgCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChnZXRTdGF0ZSgpICE9IFN0YXRlLlJFU1BPTlNFX1JFQUQpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJNZXRob2QgY2FsbCBub3QgZmluaXNoZWQhXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChnZXRGcmFtZUJ1ZmZlcigpLmFycmF5KCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRQcm90b2NvbCBwcm90ID0gY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgICAgaWYgKCFyZXRfdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOyAKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIihuZXcgQ2xpZW50KHByb3QpKS5yZWN2XyIgKyBmdW5uYW1lICsgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ2xvc2UgQXN5bmNDbGllbnQKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIFByb2Nlc3NGdW5jdGlvbiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZyxQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IEhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbi5wcm9jZXNzKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgCi0gICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJMT0dHRVIuZXJyb3IoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIgKQotICAgIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5wdXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKE1hcC5FbnRyeTwiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyIDw8Ci0gICAgICAiIDogIiA8PAotICAgICAgcHJlZml4IDw8ICIuZW50cnlTZXQoKSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIDogIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIDogIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi5nZXRLZXkoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi5nZXRWYWx1ZSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgSmF2YSB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIHNraXBfZ2VuZXJpYykgewotICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiSGFzaE1hcCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJNYXAiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsKLSAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIgKwotICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkhhc2hTZXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiU2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkFycmF5TGlzdCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJMaXN0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVCdWZmZXIiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7OwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0KLSAgICB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7Ci0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICB9Ci0gIHJlc3VsdCArPSAiVEV4Y2VwdGlvbiI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3ZvaWQgbmFtZShhcmdzLCByZXN1bHRIYW5kbGVyKScKLSAgKgotICAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKLSAgaWYgKHVzZV9iYXNlX21ldGhvZCkgewotICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOwotICB9Ci0gIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ2xpc3QgKyAiKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOwotICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgewotICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXRfdHlwZSA9ICIiOwotICBpZiAodXNlX2Jhc2VfbWV0aG9kKSB7Ci0gICAgcmV0X3R5cGUgKz0gIkFzeW5jQ2xpZW50LiI7Ci0gIH0KLSAgcmV0X3R5cGUgKz0gdGZ1bmMtPmdldF9uYW1lKCkgKyAiX2NhbGwiOwotCi0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgYXJnbGlzdCArPSAiQXN5bmNNZXRob2RDYWxsYmFjazwiICsgcmV0X3R5cGUgKyAiPiAiOwotICB9Ci0gIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOwotCi0gIHJldHVybiBhcmdsaXN0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKCFmaXJzdCkgewotICAgIHJlc3VsdCArPSAiLCAiOwotICB9Ci0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgcmVzdWx0ICs9ICJBc3luY01ldGhvZENhbGxiYWNrPCIgKyB0ZnVuY3QtPmdldF9uYW1lKCkgKyAiX2NhbGwiICsgIj4gIjsKLSAgfQotICByZXN1bHQgKz0gInJlc3VsdEhhbmRsZXIiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLCB0X3R5cGUqIHR5cGUpIHsKLQotICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOwotICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKLSAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIiA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmVudHJ5U2V0KCkpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZigoKHRfYmFzZV90eXBlKillbGVtX3R5cGUpLT5pc19iaW5hcnkoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJCeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgInRlbXBfYmluYXJ5X2VsZW1lbnQiLCBlbGVtX3R5cGUpOwotICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIC8vIGJpbmFyeSBmaWVsZHMgbmVlZCB0byBiZSBjb3BpZWQgd2l0aCBTeXN0ZW0uYXJyYXljb3B5Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSl7Ci0gICAgICBvdXQgPDwgIkJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGltaXQoKSAtICIgPDwgc291cmNlX25hbWUgPDwgIi5hcnJheU9mZnNldCgpXSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmFycmF5KCksICIgPDwgc291cmNlX25hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiIDw8IGRlc3RfbmFtZSA8PCAiLmFycmF5KCksIDAsICIgPDwgc291cmNlX25hbWUgPDwgIi5saW1pdCgpIC0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmFycmF5T2Zmc2V0KCkpIjsKLSAgICB9Ci0gICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgc291cmNlX25hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIFRGaWVsZElkRW51bSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSI7Ci0gIH0KLQotICBvdXQgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoKGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogaWYgaXQgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLWJvb2wgdF9qYXZhX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQotICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmEsICJKYXZhIiwKLSIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCi0iICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSB1c3VhbC5cbiIKLSIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKLSIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBxdWFsaXR5IGhhc2hDb2RlIG1ldGhvZHMuXG4iCi0pOwotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZTEyNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLS8qKgotICogSlMgY29kZSBnZW5lcmF0b3IuCi0gKi8KLWNsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIDoKLSAgICAgdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLQotICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcganNfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIvL1xuIikgKwotICAgICAgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICIvL1xuIiArCi0gICAgICAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiLy9cbiI7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKLQotICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSAgIGxvYzsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcGllY2VzOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBucyArPSAiLiI7Ci0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIG5zOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcitwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqc19pbmNsdWRlcygpOwotCi0KLSAgc3RyaW5nIHBuczsKLQotICAvL3NldHVwIHRoZSBuYW1lc3BhY2UKLSAgdmVjdG9yPHN0cmluZz4gbnNfcGllY2VzID0ganNfbmFtZXNwYWNlX3BpZWNlcyggcHJvZ3JhbV8gKTsKLSAgaWYoIG5zX3BpZWNlcy5zaXplKCkgPiAwKXsKLSAgICAgIGZfdHlwZXNfIDw8ICJ2YXIgIiA8PCBuc19waWVjZXNbMF0gPDwgIiA9IHt9Ijw8ZW5kbDsKLQotICAgICAgcG5zID0gbnNfcGllY2VzWzBdOwotCi0gICAgICBmb3Ioc2l6ZV90IGk9MTsgaTxuc19waWVjZXMuc2l6ZSgpOyBpKyspewotICAgICAgICAgIHBucyArPSAiLiIgKyBuc19waWVjZXNbaV07Ci0KLSAgICAgICAgICBmX3R5cGVzXyA8PCBwbnMgPDwgIiA9IHt9Ijw8ZW5kbDsKLSAgICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluYzsKLQotICByZXR1cm4gaW5jOwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0KLSAgZl90eXBlc18gPDwganNfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKTw8dGVudW0tPmdldF9uYW1lKCk8PCIgPSB7ICI8PGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKLSAgICAgICAgZl90eXBlc18gPDwgIiwiOwotCi0gICAgZl90eXBlc18gPDwgIiciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA6ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8ICJ9Ijw8ZW5kbDsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICA8PCBuYW1lIDw8ICIgPSAiOwotICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIGJvb2wgICAga2V5X2lzX3N0cmluZyA9IGZhbHNlOwotICAgIGlmIChrdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopa3R5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyl7Ci0gICAgICAgIGtleV9pc19zdHJpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IjsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLQotICAgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLQotICAgICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIEpTCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiID0gZnVuY3Rpb24oYXJncyl7XG4iOwotCi0KLSAgLy9tZW1iZXJzIHdpdGggYXJndW1lbnRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlcix0cnVlLHRydWUpOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAgZHZhbCA8PCBlbmRsOwotICAgIH0KLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpZiggYXJncyAhPSBudWxsICl7IjsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICA8PCBlbmRsIDsKLQotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifVxuIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgImZvciAodmFyIHByb3BlcnR5IGluIFRocmlmdC5FeGNlcHRpb24pIjw8ZW5kbDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpPDwiW3Byb3BlcnR5XSA9IFRocmlmdC5FeGNlcHRpb25bcHJvcGVydHldIjw8ZW5kbDsKLSAgfQotCi0gIC8vaW5pdCBwcm90b3R5cGUKLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCIucHJvdG90eXBlID0ge31cbiI7Ci0KLQotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCl7ICI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKDEpICIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZSIgPDxlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZ0eXBlID0gcmV0LmZ0eXBlIiA8PGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZmlkICAgPSByZXQuZmlkIiAgIDw8ZW5kbDsKLQotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaChmaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IjsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKLQotICB9Ci0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgICIgIGlucHV0LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCl7ICI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7Ci0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3V0cHV0LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICBvdXQgPDxpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIi5qcyI7Ci0gICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gICAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotCi0gICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCAgPSBpbnB1dCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQgPSBudWxsID09IG91dHB1dCA/IGlucHV0IDogb3V0cHV0IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkICA9IDAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgImZvciAodmFyIHByb3BlcnR5IGluICI8PGV4dGVuZHM8PCJDbGllbnQpIjw8ZW5kbDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfPDwiQ2xpZW50W3Byb3BlcnR5XSA9ICI8PGV4dGVuZHM8PCJDbGllbnRbcHJvcGVydHldIjw8ZW5kbDsKLQotICB9Ci0KLSAgLy9pbml0IHByb3RvdHlwZQotICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlID0ge30iPDxlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfPDwiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAieyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8Ci0gICAgICAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICJDbGllbnQucHJvdG90eXBlLnNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgInsiIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAganNfbmFtZXNwYWNlKHByb2dyYW1fKSsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwsIHRoaXMuc2VxaWQpIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSh0aGlzLm91dHB1dCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpIiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBlbmRsIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICAgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGZuYW1lID0gcmV0LmZuYW1lIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBtdHlwZSA9IHJldC5tdHlwZSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcnNlcWlkPSByZXQucnNlcWlkIiA8PGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeCA9IG5ldyBUaHJpZnQuQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCh0aGlzLmlucHV0KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHgiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKHRoaXMuaW5wdXQpIiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuaW5wdXQucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gcmVzdWx0LnN1Y2Nlc3MgKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn0iPDxlbmRsOwotCi0gICAgfQotICB9Ci0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCt0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcnRtcCA9IGlucHV0LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBvdXQgPDxuYW1lIDw8ICIgPSBydG1wLnZhbHVlIjw8ZW5kbDsKLQotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCkiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBzaXplIDw8ICIgPSAwIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBydG1wMyIgPDwgZW5kbDsKLQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IHZ0eXBlIDw8ICIgPSAwIiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwga3R5cGUgPDwgIj0gcnRtcDMua3R5cGUiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdnR5cGUgPDwgIj0gcnRtcDMudnR5cGUiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgc2l6ZSAgPDwgIj0gcnRtcDMuc2l6ZSIgPDwgZW5kbDsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZFNldEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXR5cGUgPDwgIj0gcnRtcDMuZXR5cGUiPDxlbmRsPDwKLSAgICAgICAgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gcnRtcDMuc2l6ZSI8PGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICIgPSBydG1wMy5ldHlwZSI8PGVuZGw8PAotICAgICAgICBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSBydG1wMy5zaXplIjw8ZW5kbDsKLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwKLSAgICBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggK3RmaWVsZC0+Z2V0X25hbWUoKSApOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZighcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5sZW5ndGgpIiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSIgPDwgZW5kbDsKLQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yKHZhciAiPDxraXRlcjw8IiBpbiAiPDxwcmVmaXg8PCIpIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIjw8dml0ZXI8PCIgPSAiPDxwcmVmaXg8PCJbIjw8a2l0ZXI8PCJdIjw8ZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcih2YXIgIjw8aXRlcjw8IiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIj0iIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXSI8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZvcih2YXIgIjw8aXRlcjw8IiBpbiAiPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiPSIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdIjw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmKCFvYmopewotICAgICAgcmVzdWx0ID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpewotICAgICAgcmVzdWx0ICs9ICIgPSB7fSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiAranNfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7Ci0KLQotICAvL05lZWQgdG8gY3JlYXRlIGpzIGZ1bmN0aW9uIGFyZyBpbnB1dHMKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiAmZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaWYoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKQotICAgICAgICAgIHN0ciArPSAiLCI7Ci0KLSAgICAgIHN0ciArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLQotCi0gIHN0ciArPSAiKSI7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvciA6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsICJKYXZhc2NyaXB0IiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGEwMjAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vY2FtbF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1vY2FtbCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSAgKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCAqdG1lbWJlcik7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkICp0bWVtYmVyKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQgKnRtZW1iZXIpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kPWZhbHNlLCBib29sIG9wdGlvbnMgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSk7Ci0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19pXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfaV87Ci0KLX07Ci0KLQotLyoKLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2Ugd2FudCB0eXBlZGVmcyB0byBhcHBlYXIgbGF0ZXIsCi0gKiBhZnRlciBhbGwgdGhlIHR5cGVzIGhhdmUgYmVlbiBkZWNsYXJlZC4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCi0gIGluaXRfZ2VuZXJhdG9yKCk7Ci0KLSAgLy8gR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc3RydWN0cwotICB2ZWN0b3I8dF9zdHJ1Y3QqPiBzdHJ1Y3RzID0gcHJvZ3JhbV8tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBzdF9pdGVyOwotICBmb3IgKHN0X2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHN0X2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzdF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfc3RydWN0KCpzdF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHhjZXB0aW9ucwotICB2ZWN0b3I8dF9zdHJ1Y3QqPiB4Y2VwdGlvbnMgPSBwcm9ncmFtXy0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIGdlbmVyYXRlX3hjZXB0aW9uKCp4X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKLSAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKLSAgY2xvc2VfZ2VuZXJhdG9yKCk7Ci19Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLm1sIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLm1saSI7Ci0gIGZfdHlwZXNfaV8ub3BlbihmX3R5cGVzX2lfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX2NvbnN0cy5tbCI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3R5cGVzX2lfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk8PCJfdHlwZXMiPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiKCpcbiIpICsKLSAgICAiIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAiXG4iICsKLSAgICAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiKilcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICJvcGVuIFRocmlmdCI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICI8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzX2lfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIjw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IHRvX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgdG9faSA6IHQgLT4gaW50IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifCAiIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgb2ZfaSA9IGZ1bmN0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCBvZl9pIDogaW50IC0+IHQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgInwgIiA8PCB2YWx1ZSA8PCAiIC0+ICIgPDwgbmFtZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgaWYodmFsdWUtPmdldF9kb3VibGUoKSA9PSAwLjApIHsKLSAgICAgICAgb3V0IDw8ICIwLjAiOyAgIC8vIE9DYW1sIGNhbid0IGJlYXIgJzAnIGluIHBsYWNlIG9mIGRvdWJsZS4KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgdmFsID0gLTE7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICAgIHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK3ZhbDsKLSAgICAgIH0KLSAgICAgIGlmKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOwotICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgY3QgPDwiI3NldF8iIDw8IGZuYW1lIDw8ICIgIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBjdCA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwga2V5IDw8ICIgIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCB2YWwgPDwgIiB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gT0NhbWwgc3RydWN0Ci0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLHRzdHJ1Y3QsaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKLSAgICB9Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0dXJlIG1lbWJlciBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0bmFtZSBOYW1lIG9mIHRoZSBwYXJlbnQgc3RydWN0dXJlIGZvciB0aGUgbWVtYmVyCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgewotICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKLSAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmKHZhbCkgewotICAgIGlmKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiIG9wdGlvbiA9IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICIgPDwgeCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gbWF0Y2ggXyI8PG1uYW1lPDwiIHdpdGggTm9uZS0+cmFpc2UgKEZpZWxkX2VtcHR5IFwiIjw8dG5hbWU8PCIuIjw8bW5hbWU8PCJcIikgfCBTb21lICIgPDwgeCA8PCIgLT4gIiA8PCB4IDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHggPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkICp0bWVtYmVyKSB7Ci0gIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotfQotCi0vKioKLSAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcwotICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmKCF2YWwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIEJhc2UgdHlwZXMgYXJlIGdlbmVyYWxseSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgotICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZih2YWwtPmdldF9kb3VibGUoKSA9PSAwLjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgLy8gSXMgZW1wdHkgbGlzdD8KLSAgICBpZih2YWwtPmdldF9saXN0KCkuc2l6ZSgpID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyB4ID0gdG1wKCJfeCIpOwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICBzdHJpbmcgdHlwZSA9IHJlbmRlcl9vY2FtbF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgIiBvcHRpb24iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgIiAtPiB1bml0IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImlnbm9yZShpcHJvdCNyZWFkU3RydWN0QmVnaW4pOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImxldCAoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgIiA8PCB0IDw8IiA9IFByb3RvY29sLlRfU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZDw8IiB3aXRoICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOwotICAgICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIjw8IHQgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ8IF8gLT4gIiA8PCAiaXByb3Qjc2tpcCAiPDx0PDwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgc3RyIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qjd3JpdGVTdHJ1Y3RCZWdpbiBcIiI8PG5hbWU8PCJcIjsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0bWVtYmVyID0gKCpmX2l0ZXIpOwotICAgIHN0cmluZyBtbmFtZSA9ICJfIitkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIF92OwotCi0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0KLSAgICAgIGlmKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikKLSAgICAgICAgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICBfdiA9ICJfdiI7Ci0gICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCi0gICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICA8PCAiIC0+ICgpIHwgIiA8PCBfdiA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF92ID0gbW5hbWU7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiOwotCi0gICAgICBpZihzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7Ci0KLSAgICAgICAgaWYoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIgotICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICAgIDw8ICIgLT4gKCkiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiCi0gICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIF92ID0gIl92IjsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiI8PCB0bWVtYmVyLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIKLSAgICAgICAgICAgICAgICA8PCB0bWVtYmVyLT5nZXRfa2V5KCk8PCIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZUZpZWxkU3RvcDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWwiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWxpIjsKLSAgZl9zZXJ2aWNlX2lfLm9wZW4oZl9zZXJ2aWNlX2lfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLSAgKi8KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdCAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ0IDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4gVGhpcyBpcyBiZWNhdXNlCi0gKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICAgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ1bmN0aW9uX3R5cGUoKmZfaXRlcix0cnVlLGZhbHNlKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgUHJvdG9jb2wuQ0FMTCwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgcmVzID0gIl8iOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzID0gInJlc3VsdCI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgIjw8cmVzPDwiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCkgPSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgYXJncyA9ICJhcmdzIjsKLSAgaWYoZmllbGRzLnNpemUoKSA9PSAwKXsKLSAgICBhcmdzPSJfIjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibGV0ICI8PGFyZ3M8PCIgPSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIodHJ5IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLQotCi0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdCNzZXRfc3VjY2VzcyAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiKGhhbmRsZXIjIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAgIiBhcmdzI2dldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aXRoIiA8PGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCkiOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotCi0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KXsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotCi0KLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyI8PG5hbWUgPDwgIiAiOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCx0eXBlKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKXsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLSAgfQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBvdXQgPDwgImlwcm90IyI7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAicmVhZFN0cmluZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBvdXQgPDwgIigiIDw8ZW5hbWUgPDwgIi5vZl9pIGlwcm90I3JlYWRJMzIpIjsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7Ci0gIG91dCA8PCAiKHJlYWRfIiA8PCBuYW1lIDw8ICIgaXByb3QpIjsKLQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCI8PGt0eXBlPDwiLCI8PHZ0eXBlPDwiLCI8PHNpemU8PCIpID0gaXByb3QjcmVhZE1hcEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIjw8Y29uPDwiID0gSGFzaHRibC5jcmVhdGUgIjw8c2l6ZTw8IiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICI8PHNpemU8PCIgZG8iIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9rID0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIjw8Y29uPDwgIiBfayBfdiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRNYXBFbmQ7ICI8PGNvbjw8IikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCI8PGV0eXBlPDwiLCI8PHNpemU8PCIpID0gaXByb3QjcmVhZFNldEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIjw8Y29uPDwiID0gSGFzaHRibC5jcmVhdGUgIjw8c2l6ZTw8IiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICI8PHNpemU8PCIgZG8iIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIjw8Y29uPDwiICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiIHRydWUiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZFNldEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCI8PGV0eXBlPDwiLCI8PHNpemU8PCIpID0gaXByb3QjcmVhZExpc3RCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICI8PGNvbjw8IiA9IChBcnJheS50b19saXN0IChBcnJheS5pbml0ICI8PHNpemU8PCIgKGZ1biBfIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIikpKSBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZExpc3RFbmQ7ICI8PGNvbjw8IikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotfQotCi0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmKG5hbWUubGVuZ3RoKCkgPT0gMCl7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QjIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiPDxlbmFtZTw8Ii50b19pICIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEJlZ2luKCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIjw8a2l0ZXI8PCIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiPDxpdGVyPDwiIC0+IGZ1biBfIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkxpc3QuaXRlciAoZnVuICI8PGl0ZXI8PCIgLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8ICBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVNYXBFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEVuZCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lIGFyZ3MnCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKLSAgICAiICIgKyAgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kLCBib29sIG9wdGlvbnMpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYob3B0aW9ucykKLSAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotICBpZihmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKXsKLSAgICByZXN1bHQgKz0gInVuaXQgLT4gIjsKLSAgfQotICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYodHR5cGUtPmlzX3NlcnZpY2UoKSl7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gb2NhbWwgdHlwZQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidW5pdCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0LnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkrIi50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoa3R5cGUpKyIsIityZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkrIikgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpKyIsYm9vbCkgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiIGxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc1Nzg2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9PT1BfR0VORVJBVE9SX0gKLSNkZWZpbmUgVF9PT1BfR0VORVJBVE9SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vKioKLSAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCi0gKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCi0gKgotICovCi1jbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vb3BfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9Ci0KLSAgLyoqCi0gICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKLSAgICovCi0KLSAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQoKikoaW50KSkgdG91cHBlcik7Ci0gICAgcmV0dXJuIG9yaWdpbmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQotICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKLSAgICoKLSAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiLyoqXG4iKSArCi0gICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICAgIiAqXG4iICsKLSAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICIgKi9cbiI7Ci0gIH0KLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZmM3ODYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgxMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFBFUkwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BlcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3BlcmxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7Ci0gICAgZXNjYXBlX1snJCddID0gIlxcJCI7Ci0gICAgZXNjYXBlX1snQCddID0gIlxcQCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgICAiI1xuIiArCi0gICAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICIjXG4iOwotICB9Ci0KLSAgdm9pZCBwZXJsX25hbWVzcGFjZV9kaXJzKHRfcHJvZ3JhbSogcCwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgZGlycykgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBkaXJzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgZGlycy5wdXNoX2JhY2sobnMpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgICAgIHJlc3VsdCArPSAiOjoiOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCArPSBucyArICI6OiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpIHsKLSAgICBzdGQ6OnN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKLSAgICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgIH0KLSAgICByZXR1cm4gb3V0ZGlyOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVscGVyc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOwotICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKLSAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7Ci0gICAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIrIlR5cGVzLnBtIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyKyJDb25zdGFudHMucG0iOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGVybF9pbmNsdWRlcygpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0c18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgICJwYWNrYWdlICI8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwiQ29uc3RhbnRzOyI8PGVuZGw8PAotICAgIHBlcmxfaW5jbHVkZXMoKSA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluYzsKLQotICBpbmMgID0gInJlcXVpcmUgNS42LjA7XG4iOwotICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOwotICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7Ci0gIGluYyArPSAidXNlIFRocmlmdDtcblxuIjsKLQotICByZXR1cm4gaW5jOwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PHRlbnVtLT5nZXRfbmFtZSgpPDwiOyI8PGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGZfdHlwZXNfIDw8ICJ1c2UgY29uc3RhbnQgIjw8KCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotCi0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiAxIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gUEVSTAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8Ci0gICAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiO1xuIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7Ci0gIH0KLQotICAvL0NyZWF0ZSBzaW1wbGUgYWNlc3NvciBtZXRob2RzCi0gIG91dCA8PCAidXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTtcbiI7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgICAgICBpZiAoIXQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBvdXQgPDwgIikgKTtcbiI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBuZXcoKQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgInN1YiBuZXcgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkY2xhc3NuYW1lID0gc2hpZnQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHZhbHMgICAgICA9IHNoaWZ0IHx8IHt9OyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSAidW5kZWYiOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChVTklWRVJTQUw6OmlzYSgkdmFscywnSEFTSCcpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHZhbHMtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifVxuXG4iOwotCi0gIG91dCA8PAotICAgICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiByZWFkIHsiIDw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiICAgICA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmaWQgICA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcXCRmbmFtZSk7IiA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkgIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXFwkZm5hbWUsIFxcJGZ0eXBlLCBcXCRmaWQpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7Ci0KLSAgfQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0KLSAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJzdWIgd3JpdGUgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIm15ICgkc2VsZiwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJteSAkeGZlciAgID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkc2VsZi0+eyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIG91dCA8PGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfbmFtZXNwYWNlX291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyIucG0iOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIC8vLyAgICAgICJwYWNrYWdlICI8PHNlcnZpY2VfbmFtZV88PCI7Ijw8ZW5kbDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwZXJsX2luY2x1ZGVzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKLQotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEVSTCkKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yKTsiOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyI8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgICA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aGFuZGxlcn0gPSAkaGFuZGxlcjsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7Ijw8ZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgcHJvY2VzcyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWUgID0gdW5kZWY7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRtdHlwZSAgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnNraXAoVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCBUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8ZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJldmFsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPntzdWNjZXNzfSA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIkc2VsZi0+e2hhbmRsZXJ9LT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifTsgaWYoIFVOSVZFUlNBTDo6aXNhKCRALCciIDw8Ci0gICAgICAgICAgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKSA8PAotICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICInKSApeyAiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgICB0cy0+c2V0X25hbWUobmFtZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKSArICJJZik7IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDxlbmRsPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzICAgID0gIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpICsgIlJlc3QpOyI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3Q7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfICA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICJ7IiAgICA8PGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGF0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgc3RyaW5nIHJlcSA9ICIkcmVxdWVzdC0+eyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIid9IjsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gKCIgPDwgcmVxIDw8ICIpID8gIiA8PCByZXEgPDwgIiA6IHVuZGVmOyIgPDwgZW5kbDsKLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpICAgICA8PCAiJCI8PCgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCIgPSBcXEAiPDwoKmFfaXRlciktPmdldF9uYW1lKCk8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHNlbGYtPntpbXBsfS0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDxlbmRsOwotICB9Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiQ2xpZW50KTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBleHRlbmRzX2NsaWVudCA8PCBlbmRsIDw8Ci0gICAgICAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpOyIgPDwgZW5kbDsKLQotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgICA8PGVuZGw7Ci0KLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fSAgPSAkaW5wdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9ID0gZGVmaW5lZCAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e3NlcWlkfSAgPSAwOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyI8PGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwKLSAgICAgICIkc2VsZi0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgIiRzZWxmLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6Q0FMTCwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHNlbGYtPntvdXRwdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCRzZWxmLT57aW5wdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGRpZSAkeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRpZSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9Ijw8ZW5kbDsKLQotICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAvL0hhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7Ci0gICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKG15ICQiIDw8Ci0gICAgaSA8PCAiID0gMDsgJCIgPDwgaSA8PCAiIDwgJCIgPDwgc2l6ZSA8PCAiOyArKyQiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwsIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwga2V5IDw8ICJ9ID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1c2goQHskIiA8PCBwcmVmaXggPDwgIn0sJCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAieyIrdGZpZWxkLT5nZXRfbmFtZSgpKyJ9IiApOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpKyJ9Iik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gICAgaWYoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAid2hpbGUoIG15ICgkIjw8a2l0ZXI8PCIsJCI8PHZpdGVyPDwiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCBteSAkIjw8aXRlcjw8IiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggbXkgJCI8PGl0ZXI8PCIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgewotICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gW10iOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKLSAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOwotCi0gIC8vTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gJmZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MzJlYjAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFBIUCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcGhwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9waHBfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmxpbmVkIik7Ci0gICAgYmluYXJ5X2lubGluZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmVzdCIpOwotICAgIHJlc3RfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNlcnZlciIpOwotICAgIHBocHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImF1dG9sb2FkIik7Ci0gICAgYXV0b2xvYWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm9vcCIpOwotICAgIG9vcF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpZiAob29wXyAmJiBiaW5hcnlfaW5saW5lXykgewotICAgICAgdGhyb3cgIm9vcCBhbmQgaW5saW5lZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7Ci0gICAgfQotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiaW5hcnlfaW5saW5lXyA/ICJnZW4tcGhwaSIgOiAiZ2VuLXBocCIpOwotICAgIGVzY2FwZV9bJyQnXSA9ICJcXCQiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIF9nZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3R5cGUqIHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhzdGQ6Om9mc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBfZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwaHBfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19jYXN0KHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOwotICAgIHJldHVybiBucy5zaXplKCkgPyAobnMgKyAiXyIpIDogIiI7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWxwZXJzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgLyoqCi0gICAqIEdlbmVyYXRlIHByb3RvY29sLWluZGVwZW5kZW50IHRlbXBsYXRlPyBPciBCaW5hcnkgaW5saW5lIGNvZGU/Ci0gICAqLwotICBib29sIGJpbmFyeV9pbmxpbmVfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFJFU1QgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgYm9vbCByZXN0XzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgc3R1YnMgZm9yIGEgUEhQIHNlcnZlcgotICAgKi8KLSAgYm9vbCBwaHBzXzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgUEhQIGNvZGUgdGhhdCB1c2VzIGF1dG9sb2FkCi0gICAqLwotICBib29sIGF1dG9sb2FkXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byB1c2UgT09QIGJhc2UgY2xhc3MgVEJhc2UKLSAgICovCi0gIGJvb2wgb29wXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpKyIvIitwcm9ncmFtX25hbWVfKyIvIjsKLSAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8rcHJvZ3JhbV9uYW1lXysiX3R5cGVzLnBocCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgICI8P3BocCIgPDwgZW5kbCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGhwX2luY2x1ZGVzKCk7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHN0cmluZyBwYWNrYWdlID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICJpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy8iIDw8IHBhY2thZ2UgPDwgIi8iIDw8IHBhY2thZ2UgPDwgIl90eXBlcy5waHAnOyIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgewotICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMucGhwIjsKLSAgICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotICAgIGZfY29uc3RzXyA8PAotICAgICAgIjw/cGhwIiA8PCBlbmRsIDw8Ci0gICAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgKyBwcm9ncmFtX25hbWVfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMucGhwJzsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTJ10gPSBhcnJheSgpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnO1xuXG4iKTsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBmX2NvbnN0c18gPDwgIj8+IiA8PCBlbmRsOwotICAgIGZfY29uc3RzXy5jbG9zZSgpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQSFAsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAotICogaW4gUEhQLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgIiRHTE9CQUxTWyciIDw8IHBocF9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpIDw8ICJFXyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiddID0gYXJyYXkoIiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgaW50IHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiAgJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInID0+ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzXyA8PAotICAgICIpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgLy8gV2UncmUgYWxzbyBkb2luZyBpdCB0aGlzIHdheSB0byBzZWUgaG93IGl0IHBlcmZvcm1zLiBJdCdzIG1vcmUgbGVnaWJsZQotICAvLyBjb2RlIGJ1dCB5b3UgY2FuJ3QgZG8gdGhpbmdzIGxpa2UgYW4gJ2V4dHJhY3QnIG9uIGl0LCB3aGljaCBpcyBhIGJpdCBvZgotICAvLyBhIGRvd25lci4KLSAgZl90eXBlc18gPDwKLSAgICAiZmluYWwgY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiICAiIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFMnXVsnIiA8PCBuYW1lIDw8ICInXSA9ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0+IHRydWUiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9waHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdCkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLSAgaW5kZW50KG91dCkgPDwgIid0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpKSB7Ci0gICAgLy8gTm9vcCwgdHlwZSBpcyBhbGwgd2UgbmVlZAotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2NsYXNzJyA9PiAnIiA8PCBwaHBfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwiJywiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCkpOwotICAgIHRfdHlwZSogdnR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrdHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIsIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndnR5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2tleScgPT4gYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBrdHlwZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIid2YWwnID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdnR5cGUpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSB8fCB0LT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiJ2V0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2VsZW0nID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgZXR5cGUpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gdHlwZSBmb3IgcGhwIHN0cnVjdCBzcGVjIGZpZWxkIjsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKLSAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0KHNlbGY6OiRfVFNQRUMpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic2VsZjo6JF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIndmFyJyA9PiAnIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgICk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBpZiAoYXV0b2xvYWRfKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICAgIG9mc3RyZWFtIGF1dG9sb2FkX291dDsKLSAgICBzdHJpbmcgZl9zdHJ1Y3QgPSBwcm9ncmFtX25hbWVfKyIuIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5waHAiOwotICAgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfK2Zfc3RydWN0OwotICAgIGF1dG9sb2FkX291dC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0gICAgYXV0b2xvYWRfb3V0IDw8ICI8P3BocCIgPDwgZW5kbDsKLSAgICBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGF1dG9sb2FkX291dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgZW5kbCA8PCAiPz4iIDw8IGVuZGw7Ci0gICAgYXV0b2xvYWRfb3V0LmNsb3NlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiRHTE9CQUxTWydUSFJJRlRfQVVUT0xPQUQnXVsnIiA8PCBsb3dlcmNhc2UocGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSArIHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICInXSA9ICciIDw8IHByb2dyYW1fbmFtZV8gPDwgIi8iIDw8IGZfc3RydWN0IDw8ICInOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIF9nZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiIGV4dGVuZHMgVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSBpZiAob29wXykgewotICAgIG91dCA8PCAiIGV4dGVuZHMgVEJhc2UiOwotICB9Ci0gIG91dCA8PAotICAgICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAkX1RTUEVDOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJudWxsIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICQiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBzdHJpbmcgcGFyYW0gPSAobWVtYmVycy5zaXplKCkgPiAwKSA/ICIkdmFscz1udWxsIiA6ICIiOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCIgPDwgcGFyYW0gPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG91dCwgdHN0cnVjdCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoaXNfYXJyYXkoJHZhbHMpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChvb3BfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3Qoc2VsZjo6JF9UU1BFQywgJHZhbHMpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKG9vcF8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZpZCA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfYnl0ZSwgImZ0eXBlIik7Ci0gICAgICB0X2ZpZWxkIGZmaWQoZ190eXBlX2kxNiwgImZpZCIpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZmlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKLSAgICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKCRmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSBUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBleHBlY3Q7Ci0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBleHBlY3QgPSAiYXJyYXkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGV4cGVjdCA9ICJvYmplY3QiOwotICAgIH0KLSAgICBpZiAoIWV4cGVjdC5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNfIiA8PCBleHBlY3QgPDwgIigkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsIFRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXytzZXJ2aWNlX25hbWVfKyIucGhwIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiPD9waHAiIDw8IGVuZGwgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBocF9pbmNsdWRlcygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCBwcm9ncmFtX25hbWVfIDw8ICIvIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMucGhwJzsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSA8PCAiLyIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5waHAnOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgaWYgKHJlc3RfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKLSAgfQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGlmIChwaHBzXykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLSAgfQotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8ICI/PiIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRoYW5kbGVyKSB7IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmhhbmRsZXJfID0gJGhhbmRsZXI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOwotICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9ieXRlLCAibXR5cGUiKTsKLSAgICB0X2ZpZWxkIGZzZXFpZChnX3R5cGVfaTMyLCAicnNlcWlkIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmbXR5cGUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCFtZXRob2RfZXhpc3RzKCR0aGlzLCAkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIiA8PCBwaHBfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJG91dHB1dCBpbnN0YW5jZW9mIFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkb3V0cHV0LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6UkVQTFksICRyZXN1bHQsICRzZXFpZCwgJG91dHB1dC0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8IFRNZXNzYWdlVHlwZTo6UkVQTFkpKTsgIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsICRzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2lmID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGltcGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW1wbF8gPSAkaW1wbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOwotICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcSA8PCAiKSAmJiAoIiA8PCByZXEgPDwgIiAhPT0gJ2ZhbHNlJykpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHRoaXMtPmltcGxfLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGlmIChhdXRvbG9hZF8pIHsKLSAgICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gICAgb2ZzdHJlYW0gYXV0b2xvYWRfb3V0OwotICAgIHN0cmluZyBmX3N0cnVjdCA9IHByb2dyYW1fbmFtZV8rIi4iKyh0c2VydmljZS0+Z2V0X25hbWUoKSkrIi5jbGllbnQucGhwIjsKLSAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXytmX3N0cnVjdDsKLSAgICBhdXRvbG9hZF9vdXQub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotICAgIGF1dG9sb2FkX291dCA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gICAgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGF1dG9sb2FkX291dCwgdHNlcnZpY2UpOwotICAgIGF1dG9sb2FkX291dCA8PCBlbmRsIDw8ICI/PiIgPDwgZW5kbDsKLSAgICBhdXRvbG9hZF9vdXQuY2xvc2UoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIkR0xPQkFMU1snVEhSSUZUX0FVVE9MT0FEJ11bJyIgPDwgbG93ZXJjYXNlKHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50IikgPDwgIiddID0gJyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLyIgPDwgZl9zdHJ1Y3QgPDwgIic7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6Ol9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJDbGllbnQiOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBQcml2YXRlIG1lbWJlcnMKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW5wdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJG91dHB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQ9bnVsbCkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkdGhpcy0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIkdGhpcy0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5vdXRwdXRfIGluc3RhbmNlb2YgVFByb3RvY29sOjokVEJJTkFSWVBST1RPQ09MQUNDRUxFUkFURUQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJHRoaXMtPm91dHB1dF8sICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpDQUxMLCAkYXJncywgJHRoaXMtPnNlcWlkXywgJHRoaXMtPm91dHB1dF8tPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgVE1lc3NhZ2VUeXBlOjpDQUxMKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIiA8PCBmdW5uYW1lIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6Q0FMTCwgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgVFByb3RvY29sOjokVEJJTkFSWVBST1RPQ09MQUNDRUxFUkFURUQpIgotICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSAkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCR0aGlzLT5pbnB1dF8sICciIDw8IHJlc3VsdG5hbWUgPDwgIicsICR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpKTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9IHVucGFjaygnTicsICR0aGlzLT5pbnB1dF8tPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gJHZlclsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJG10eXBlID0gJHZlciAmIDB4ZmY7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyICYgMHhmZmZmMDAwMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCR2ZXIgIT0gMHg4MDAxMDAwMCkgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2VxaWQsICIiLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBFeGNlcHRpb24oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgewotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgaXRyYW5zID0gKGluY2xhc3MgPyAiJHRoaXMtPmlucHV0XyIgOiAiJGlucHV0Iik7Ci0KLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgICAgIG5hbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGxlbiA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGxlbiA9ICRsZW5bMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGxlbiA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgkbGVuKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gKGJvb2wpJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ24nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDIpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdOMicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRhcnJbMV0gPSAkYXJyWzFdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJGFyclsyXSA9ICRhcnJbMl0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lIDw8ICIgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdKjQyOTQ5NjcyOTYgKyAkYXJyWzJdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdkJywgc3RycmV2KCIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV07IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotCi0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+IjsKLQotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICAgICAgbmFtZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJCIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBrdHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma3R5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZ0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiIDw8Ci0gICAgICAgICIkIiA8PCBrdHlwZSA8PCAiLCAkIiA8PCB2dHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oIiA8PAotICAgICAgICAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIiA8PAotICAgICAgICAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICgkIiA8PAotICAgIGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwsIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGVsZW0gPDwgIl0gPSB0cnVlOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiIFtdPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTjInLCAkIiA8PCBuYW1lIDw8ICIgPj4gMzIsICQiIDw8IG5hbWUgPDwgIiAmIDB4RkZGRkZGRkYpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+IjsKLQotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIgPDwgZW5kbDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIgPDwKLSAgICAgICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkdHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgewotICBzdHJpbmcgcmVzdWx0ID0gIiQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gYXJyYXkoKSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKLSAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIoYm9vbCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiKGludCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIoZG91YmxlKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIihzdHJpbmcpIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIihpbnQpIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yIDo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwaHAsICJQSFAiLAotIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCi0iICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgotIiAgICBhdXRvbG9hZDogICAgICAgIEdlbmVyYXRlIFBIUCB3aXRoIGF1dG9sb2FkXG4iCi0iICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKLSIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCi0pOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Zjg0YjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9weV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibmV3X3N0eWxlIik7Ci0gICAgZ2VuX25ld3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0d2lzdGVkIik7Ci0gICAgZ2VuX3R3aXN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInV0ZjhzdHJpbmdzIik7Ci0gICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudHdpc3RlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcHlfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHB5X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKLSAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiByZWFsX21vZHVsZTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLgotICAgKi8KLSAgYm9vbCBnZW5fbmV3c3R5bGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl90d2lzdGVkXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgc3RyaW5ncyBzaG91bGQgYmUgZW5jb2RlZCB1c2luZyB1dGYtOC4KLSAgICovCi0gIGJvb2wgZ2VuX3V0ZjhzdHJpbmdzXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtXyk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiKS5jX3N0cigpKTsKLSAgICBpbml0X3B5LmNsb3NlKCk7Ci0gICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKLSAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7Ci0gICAgICBtb2R1bGUuY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7Ci0gICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zKzEpOwotICAgIH0KLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrInR0eXBlcy5weSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyIvIisiY29uc3RhbnRzLnB5IjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9fX2luaXRfXy5weSI7Ci0gIG9mc3RyZWFtIGZfaW5pdDsKLSAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gIGZfaW5pdCAgPDwKLSAgICAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOwotICB9Ci0gIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKLSAgZl9pbml0LmNsb3NlKCk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gImltcG9ydCAiICsgZ2V0X3JlYWxfcHlfbW9kdWxlKGluY2x1ZGVzW2ldKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydFxuIgotICAgICJmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sXG4iCi0gICAgInRyeTpcbiIKLSAgICAiICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeVxuIgotICAgICJleGNlcHQ6XG4iCi0gICAgIiAgZmFzdGJpbmFyeSA9IE5vbmVcbiI7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKiIpOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgIChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKSA8PAotICAgICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLQotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCB2YWx1ZSA8PCAiOiBcIiIgPDwKLSAgICAgIGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgIGluZGVudCgpIDw8IGluZGVudCgpIDw8ICciJyA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJcIjogIiA8PCB2YWx1ZSA8PCAnLCcgPDwgZW5kbDsKLSAgfQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoKip7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAic2V0KCI7Ci0gICAgfQotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIihFeGNlcHRpb24pIjsKLSAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7Ci0gICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLQotICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgotICAgICAgICAgICAgPDwgIiksIgotICAgICAgICAgICAgPDwgIiAjICIgPDwgc29ydGVkX2tleXNfcG9zCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICBzb3J0ZWRfa2V5c19wb3MgKys7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9IE5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwiOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscwotICAgICAgb3V0IDw8ICIgIiA8PCBkZWNsYXJlX2FyZ3VtZW50KCptX2l0ZXIpIDw8ICIsIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBJbml0aWFsaXplIGZpZWxkcwotICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PAotICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCi0gIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KLSAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAotICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCi0gICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKLSAgICAiYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgIgotICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxpZiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5vbmU6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIucHkiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgIiA8PCBnZXRfcmVhbF9weV9tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAiLiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsIDw8Ci0gICAgICAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX25ld3N0eWxlXykgewotICAgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOwotICB9Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIG9wcm90ICE9IE5vbmU6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgc2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiZCA9IHNlbGYuX3JlcXNbc2VsZi5fc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAic2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICAgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICAgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IHNlbGYuX2lwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2soeCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoc2VsZi5faXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJhaXNlIHgiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChzZWxmLl9pcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgIT0gTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2socmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyItcmVtb3RlIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLQotICBmX3JlbW90ZSA8PAotICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQgJyciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXSciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICdGdW5jdGlvbnM6JyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQgJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSciIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudCA9IDIpIiA8PCBlbmRsIDw8Ci0gICAgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbCA8PAotICAgICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PAotICAgICJ1cmkgPSAnJyIgPDwgZW5kbCA8PAotICAgICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJodHRwID0gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAiYXJnaSA9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykgIiA8PCBlbmRsIDw8Ci0gICAgIiAgaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsIDw8Ci0gICAgIiAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSsxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpICIgPDwgZW5kbCA8PAotICAgICIgIGhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IDgwIiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJpID0gdXJsWzJdIiA8PCBlbmRsIDw8Ci0gICAgIiAgaHR0cCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbCA8PAotICAgICIgIGZyYW1lZCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsIDw8Ci0gICAgImFyZ3MgPSBzeXMuYXJndlthcmdpKzE6XSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgaHR0cDoiIDw8IGVuZGwgPDwKLSAgICAiICB0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsIDw8Ci0gICAgImVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgIiAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KGhvc3QsIHBvcnQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgZnJhbWVkOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbCA8PAotICAgICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsIDw8Ci0gICAgInRyYW5zcG9ydC5vcGVuKCkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3JlbW90ZSA8PCAiZWwiOwotICAgIH0KLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGludCBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotCi0gICAgZl9yZW1vdGUgPDwKLSAgICAgICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgcHJpbnQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncyA8PCAiIGFyZ3MnIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHN5cy5leGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgICAiICBwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7Ci0KLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICAgIFNfSVJVU1IKLSAgICAgICAgfCBTX0lXVVNSCi0gICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBNSU5HVwotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwgPDwKLSAgICAgICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PAotICAgICAgICB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiwgIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICJkLmFkZENhbGxiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19zdWNjZXNzXyIgPDwKLSAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICAgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwKLSAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzZWxmLCBzdWNjZXNzLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzZWxmLCBlcnJvciwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLQotICAgICAgLy8gS2luZGEgYWJzdXJkCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkgIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBzZXQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgIiA8PCBpIDw8ICIgaW4geHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hcHBlbmQoIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIi5lbmNvZGUoJ3V0Zi04JykpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGtpdGVyIDw8ICIsIiA8PCB2aXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuaXRlbXMoKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgewotICBib29sIGhhc19kb2MgPSBmYWxzZTsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaWYgKGhhc19kb2MpIHsKLSAgICAgIHNzIDw8IGVuZGw7Ci0gICAgfQotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZG9jKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIlwiXCJcIlxuIiwKLSAgICAgICIiLCBzcy5zdHIoKSwKLSAgICAgICJcIlwiXCJcbiIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICJcIlwiXCJcbiIsCi0gICAgICAiIiwgdGRvYy0+Z2V0X2RvYygpLAotICAgICAgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwKLSAgICAgIHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPDwgIk5vbmUiOwotICB9Ci0gIHJldHVybiByZXN1bHQuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGRlZmF1bHQgdmFsdWUsIHJldHVybnMgTm9uZSBvdGhlcndpc2UuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIk5vbmUiOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoc2VsZiwgIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFuIGludGVyZmFjZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgc3RyaW5nIHNpZ25hdHVyZSA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKLSAgaWYgKCFnZW5fdHdpc3RlZF8pIHsKLSAgICBzaWduYXR1cmUgKz0gInNlbGYsICI7Ci0gIH0KLSAgc2lnbmF0dXJlICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSkgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKwotICAgICAgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHB5LCAiUHl0aG9uIiwKLSIgICAgbmV3X3N0eWxlOiAgICAgICBHZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy5cbiIgXAotIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgotKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTgwZWIzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxib29zdC90b2tlbml6ZXIuaHBwPgotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcmJfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgICAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbiAgICAgICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gICAgKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RlZm5zIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIGZpZWxkX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSwgYm9vbCBvcHRpb25hbCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3Jkb2MgICAgICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXModF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOwotICAgIGJvb3N0Ojp0b2tlbml6ZXI8PiB0b2sobnMpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOwotCi0gICAgZm9yKGJvb3N0Ojp0b2tlbml6ZXI8Pjo6aXRlcmF0b3IgYmVnPXRvay5iZWdpbigpOyBiZWcgIT0gdG9rLmVuZCgpOyArK2JlZykgewotICAgICAgbW9kdWxlcy5wdXNoX2JhY2soY2FwaXRhbGl6ZSgqYmVnKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZXM7Ci0gIH0KLQotICB2b2lkIGJlZ2luX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKLSAgdm9pZCBlbmRfbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSsiX3R5cGVzLnJiIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykrIl9jb25zdGFudHMucmIiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJyZXF1aXJlICciIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotCi19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwKLSAgICAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCi0gICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKLSAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICAKLSAgLy9DcmVhdGUgYSBoYXNoIG1hcHBpbmcgdmFsdWVzIGJhY2sgdG8gdGhlaXIgbmFtZXMgKGFzIHN0cmluZ3MpIHNpbmNlIHJ1YnkgaGFzIG5vIG5hdGl2ZSBlbnVtIHR5cGUKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiVkFMVUVfTUFQID0geyI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICB2YWx1ZSA9IC0xOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy9Qb3B1bGF0ZSB0aGUgaGFzaAotICAgIC8vSWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIHVzZSB0aGUgbmV4dCBhdmFpbGFibGUgb25lCi0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpCi0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZWxzZSArK3ZhbHVlOwotICAgIAotICAgIGZpcnN0ID8gZmlyc3QgPSBmYWxzZSA6IGZfdHlwZXNfIDw8ICIsICI7Ci0gICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7Ci0gICAgCi0gIH0KLSAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBDcmVhdGUgYSBzZXQgd2l0aCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJWQUxJRF9WQUxVRVMgPSBTZXQubmV3KFsiOwotICBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gUG9wdWxhdGUgdGhlIHNldAotICAgIGZpcnN0ID8gZmlyc3QgPSBmYWxzZTogZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgZl90eXBlc18gPDwgIl0pLmZyZWV6ZSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJdKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6RXhjZXB0aW9uIjsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiOjpUaHJpZnQ6OlN0cnVjdC5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHVuaW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgaW5kZW50KG91dCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZiAiIDw8IGZpZWxkX25hbWUgPDwgIih2YWwpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOwotCi0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGVmIGluaXRpYWxpemUobWVzc2FnZT1uaWwpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLiIgPDwgbmFtZSA8PCAiID0gbWVzc2FnZSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChuYW1lICE9ICJtZXNzYWdlIikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmIG1lc3NhZ2U7ICIgPDwgbmFtZSA8PCAiIGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9maWVsZF9uYW1lID0gdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCBjYXBfZmllbGRfbmFtZSA8PCAiID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZWZucyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgotICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOwotCi0gICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmZfaXRlciktPmdldF92YWx1ZSgpLCAKLSAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogZmllbGRfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgewotICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKLQotICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKLQotICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKLSAgfQotCi0gIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKLSAgfQotCi0gIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7Ci0gICAgfQotICB9Ci0gIAotICBpZihvcHRpb25hbCkgewotICAgIG91dCA8PCAiLCA6b3B0aW9uYWwgPT4gdHJ1ZSI7Ci0gIH0KLQotICBpZiAoZmllbGRfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8ICIsIDplbnVtX2NsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGRfdHlwZSk7Ci0gIH0KLQotICAvLyBFbmQgb2YgdGhpcyBmaWVsZCdzIGRlZm4KLSAgb3V0IDw8ICJ9IjsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6YmVnaW5fbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5iZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUoc2VydmljZV9uYW1lXykrIi5yYiI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJyZXF1aXJlICd0aHJpZnQnIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGVuZF9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKLSAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF9tZXNzYWdlKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgOiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgdW5sZXNzIHJlc3VsdC5zdWNjZXNzLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICIgdW5sZXNzIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgPCAiICsgZXh0ZW5kcyArICI6OlByb2Nlc3NvciAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIubmV3KCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVfcmVzdWx0KHJlc3VsdCwgb3Byb3QsICciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgc2VxaWQpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoIiArICBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcyA9IHJ1YnlfbW9kdWxlcyh0dHlwZS0+Z2V0X3Byb2dyYW0oKSk7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5iZWdpbigpOwotICAgICAgIG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIHByZWZpeCArPSAqbV9pdGVyICsgIjo6IjsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgdHlwZV9uYW1lKHR0eXBlKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFJ1YnkgdHlvZQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Jkb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIiIsICIjICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOwotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAnUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIjsKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgIG91dCA8PCAiIGlmIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiB1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpeyAgICAgIAotICAgICAgaW5kZW50KG91dCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSIgPDwgZW5kbDsgIAotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJhaXNlKFN0YW5kYXJkRXJyb3IsICdVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuJykgaWYgZ2V0X3NldF9maWVsZC5uaWw/IHx8IGdldF92YWx1ZS5uaWw/IiA8PCBlbmRsOwotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgY29uc3QgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSl7ICAgICAgCi0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgZ2V0X3NldF9maWVsZCA9PSA6IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSB1bmxlc3MgIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KGdldF92YWx1ZSkiIDw8IGVuZGw7ICAKLSAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHJiLCAiUnVieSIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ3NmE0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxib29zdC90b2tlbml6ZXIuaHBwPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogU21hbGx0YWxrIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9zdF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfc3RfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tc3QiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgICAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAgICAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbiAoKTsKLSAgdm9pZCBnZW5lcmF0ZV9mb3JjZV9jb25zdHMgKCk7Ci0KLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zdF9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9hY2Nlc3NvcnMgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCAodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWN2X21ldGhvZCAodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyICh0X21hcCAqdG1hcCk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyICh0X2xpc3QgKnRsaXN0KTsKLSAgc3RkOjpzdHJpbmcgc2V0X3JlYWRlciAodF9zZXQgKnRzZXQpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlciAodF9tYXAgKnRtYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBsaXN0X3dyaXRlciAodF9saXN0ICp0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIgKHRfc2V0ICp0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlciAodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKLQotICBzdGQ6OnN0cmluZyB3cml0ZV92YWwgKHRfdHlwZSAqdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotICBzdGQ6OnN0cmluZyByZWFkX3ZhbCAodF90eXBlICp0KTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOwotICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQpOwotICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLSAgdm9pZCBzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKLSAgYm9vbCBpc192b3dlbChjaGFyIGMpOwotICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIGludCB0ZW1wb3JhcnlfdmFyOwotICBzdGQ6Om9mc3RyZWFtIGZfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICB0ZW1wb3JhcnlfdmFyID0gMDsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpKyIvIitwcm9ncmFtX25hbWVfKyIuc3QiOwotICBmXy5vcGVuKGZfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl8gPDwgc3RfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBzdF9jbGFzc19kZWYoZl8sIHByb2dyYW1fbmFtZV8pOwotICBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKLQotICAvL0dlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7Ci0gIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgewotICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKLSAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOwotICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiciKSArCi0gICAgIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAiXG4iICsKLSAgICAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIichXG4iOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7Ci0gIGZfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgewotICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOwotICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKLSAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyID09ICcuJykgewotICAgICAgKml0ZXIgPSAnLSc7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikge30KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCBjYXRlZ29yeSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgY2hhciB0aW1lc3RyWzUwXTsKLSAgdGltZV90IHJhd3RpbWU7Ci0gIHN0cnVjdCB0bSAqdGluZm87Ci0KLSAgdGltZSgmcmF3dGltZSk7Ci0gIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKLSAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKLQotICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8Ci0gICAgIiBtZXRob2RzRm9yOiAnIitjYXRlZ29yeSsiJyBzdGFtcDogJ3RocmlmdCAiIDw8IHRpbWVzdHIgPDwgIichXG4iIDw8Ci0gICAgbmFtZSA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQpIHsKLSAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7Ci0gIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiIik7Ci0gIG91dCA8PCAiXiAiIDw8IG5hbWU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9hY2Nlc3NvcnMoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7Ci0gIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7Ci0gIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PAotICAgICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJ2NvbnN0YW50cyBlbnVtcychIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImVudW1zIik7Ci0gIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJjb25zdGFudHMiKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zOiBEaWN0aW9uYXJ5IG5ldyEiIDw8IGVuZGw7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzOiBEaWN0aW9uYXJ5IG5ldyEiIDw8IGVuZGw7Ci0KLSAgZl8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGNsc19uYW1lID0gcHJvZ3JhbV9uYW1lXyArIGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMgYXQ6ICciIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogWyIgPDwKLSAgICAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgZl8gPDwgIlx0YXQ6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBmXyA8PCAiXHR5b3Vyc2VsZildISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBhdDogJyIgPDwgbmFtZSA8PCAiJyBwdXQ6IFsiIDw8Ci0gICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiIDw8Ci0gICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgcHV0OiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiRXJyb3IiOwotICBlbHNlCi0gICAgb3V0IDw8ICJPYmplY3QiOwotCi0gIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIG91dCA8PCAiICI7Ci0gICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICInXG4iIDw8Ci0gICAgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdHBvb2xEaWN0aW9uYXJpZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKLSAgc3dpdGNoKHRvbG93ZXIoYykpIHsKLSAgICBjYXNlICdhJzogY2FzZSAnZSc6IGNhc2UgJ2knOiBjYXNlICdvJzogY2FzZSAndSc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKLSAgICBwcmVmaXggPSAiYW4iOwotICBlbHNlCi0gICAgcHJlZml4ID0gImEiOwotCi0gIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdF9hY2Nlc3NvcnMob3V0LAotICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUodHlwZV9uYW1lKHRzdHJ1Y3QpKSwKLSAgICAgICAgICAgICAgICAgICBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICBhX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgLy8gZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnRlbXBfbmFtZSgpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgb3V0IDw8ICJ0ZW1wIiA8PCB0ZW1wb3JhcnlfdmFyKys7Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3dyaXRlcih0X21hcCAqdG1hcCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBrZXkgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlTWFwQmVnaW46IChUTWFwIG5ldyBrZXlUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgPDwKLSAgICAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBrZXlzQW5kVmFsdWVzRG86IFs6IiA8PCBrZXkgPDwgIiA6IiA8PCB2YWwgPDwgIiB8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVNYXBFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF9yZWFkZXIodF9tYXAgKnRtYXApIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZE1hcEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X2tleV90eXBlKCkpIDw8Ci0gICAgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZE1hcEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3Rfd3JpdGVyKHRfbGlzdCAqdGxpc3QsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVMaXN0QmVnaW46IChUTGlzdCBuZXcgZWxlbVR5cGU6ICIgPDwKLSAgICB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVMaXN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3JlYWRlcih0X2xpc3QgKnRsaXN0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZExpc3RCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBPcmRlcmVkQ29sbGVjdGlvbiBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkTGlzdEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF93cml0ZXIodF9zZXQgKnRzZXQsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTZXRCZWdpbjogKFRTZXQgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpIDw8Ci0gICAgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVNldEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3JlYWRlcih0X3NldCAqdHNldCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRTZXRCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBTZXQgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkU2V0RW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3dyaXRlcih0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHNuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiIDw8Ci0gICAgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyInKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBhY2Nlc3NvciA9IHNuYW1lICsgIiAiICsgY2FtZWxjYXNlKGZuYW1lKTsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2Vzc29yIDw8ICIgaWZOb3ROaWw6IFsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEVuZCI7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIG91dCA8PCAiXSI7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIG91dCA8PCAiLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZFN0b3A7IHdyaXRlU3RydWN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgY2xzTmFtZSA9ICIiKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBmb3VuZCA9IHRlbXBfbmFtZSgpOwotCi0gIGlmIChjbHNOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgY2xzTmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgotICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZEZpZWxkQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PAotICAgICAgIiBpZlRydWU6IFsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdmFsIDw8ICIgIiA8PCBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwKLSAgICAgIHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OndyaXRlX3ZhbCh0X3R5cGUgKnQsIHN0cmluZyBmbmFtZSkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopIHQpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZURvdWJsZTogIiArIGZuYW1lICsgIiBhc0Zsb2F0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJ1Y3Rfd3JpdGVyKCh0X3N0cnVjdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHdyaXRlSTMyOiAiICsgZm5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHdyaXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpyZWFkX3ZhbCh0X3R5cGUgKnQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKTsKLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfcmVhZGVyKCh0X21hcCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF9yZWFkZXIoKHRfc2V0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7Ci0gIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZXFpZDogc2VsZiBuZXh0U2VxaWQpLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIiA8PAotICAgICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBmbmFtZSkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7Ci0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOwotCi0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLS8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCi0gICAgdF9maWVsZCAqZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKLSAgfQotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7Ci0gIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VsZiB2YWxpZGF0ZVJlbW90ZU1lc3NhZ2U6IG1zZy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QgdHJhbnNwb3J0IGZsdXNoLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJeIHJlcyI7Ci0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAiXCIiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiXCIiOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIgPDwKLSAgICAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIiA8PAotICAgICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKLQotICAgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgc2lnbmF0dXJlKTsKLSAgICBmXyA8PCBmdW5jdGlvbl90eXBlc19jb21tZW50KCpmX2l0ZXIpIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJzZWxmIHNlbmQiIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLQotICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlIGk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBtYXAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzZXQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUgbGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihzdCwgIlNtYWxsdGFsayIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWE5MWEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfeHNkX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHt9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9zdHJ1Y3QqIGF0dHJzPU5VTEwsIGJvb2wgb3B0aW9uYWw9ZmFsc2UsIGJvb2wgbmlsbGFibGU9ZmFsc2UsIGJvb2wgbGlzdF9lbGVtZW50PWZhbHNlKTsKLQotICBzdGQ6OnN0cmluZyBucyhzdGQ6OnN0cmluZyBpbiwgc3RkOjpzdHJpbmcgbnMpIHsKLSAgICByZXR1cm4gbnMgKyAiOiIgKyBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgewotICAgIHJldHVybiBucyhpbiwgInhzZCIpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLQotICAvKioKLSAgICogT3V0cHV0IHhzZC9waHAgZmlsZQotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3hzZF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9waHBfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgc3RyaW5nIHN0cmVhbQotICAgKi8KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfeHNkX3R5cGVzXzsKLQotfTsKLQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fLT5nZXRfbmFtZSgpKyJfeHNkLnBocCI7Ci0gIGZfcGhwXy5vcGVuKGZfcGhwX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9waHBfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfcGhwXy5jbG9zZSgpOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPVwiIiA8PCB0dHlwZWRlZi0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZ19lbnVtKCkpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7Ci0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICAgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8L3hzZDpyZXN0cmljdGlvbj4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKLQotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLCAoKm1faXRlciktPmdldF94c2Rfb3B0aW9uYWwoKSB8fCB4c2RfYWxsLCAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCkgewotICBzdHJpbmcgc21pbk9jY3VycyA9IChvcHRpb25hbCB8fCBsaXN0X2VsZW1lbnQpID8gIiBtaW5PY2N1cnM9XCIwXCIiIDogIiI7Ci0gIHN0cmluZyBzbWF4T2NjdXJzID0gbGlzdF9lbGVtZW50ID8gIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiIgOiAiIjsKLSAgc3RyaW5nIHNvcHRpb25hbCA9IHNtaW5PY2N1cnMgKyBzbWF4T2NjdXJzOwotICBzdHJpbmcgc25pbGxhYmxlID0gbmlsbGFibGUgPyAiIG5pbGxhYmxlPVwidHJ1ZVwiIiA6ICIiOwotCi0gIGlmICh0dHlwZS0+aXNfdm9pZCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgc3RyaW5nIHN1Ym5hbWU7Ci0gICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2VsZW1lbnQob3V0LCBzdWJuYW1lLCBzdWJ0eXBlLCBOVUxMLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cImxpc3RcIiB0eXBlPVwieHNkOmJvb2xlYW5cIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRycyAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChhdHRycyA9PSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdvdywgYWxsIHRoaXMgd29yayBmb3IgYSBTSU1QTEUgVFlQRSB3aXRoIGF0dHJpYnV0ZXM/IT8hPyEKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfeHNkX25hbWUgPSBnZXRfb3V0X2RpcigpK3RzZXJ2aWNlLT5nZXRfbmFtZSgpKyIueHNkIjsKLSAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiICsKLSAgICAgICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7Ci0gIH0KLQotICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgotICBmX3hzZF8gPDwKLSAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIgPDwgZW5kbCA8PAotICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiPCEtLSBZbyB5byB5bywgdGhpcyBYU0Qgd296IGJlIGdlbmVyYXRlZCBieSBUaHJpZnQuIC0tPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUHJpbnQgb3V0IHRoZSB0eXBlIGRlZmluaXRpb25zCi0gIGluZGVudChmX3hzZF8pIDw8IHNfeHNkX3R5cGVzXy5zdHIoKTsKLQotICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBtaWdodCBnZXQgdGhyb3duCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj4gYWxsX3hjZXB0aW9uczsKLQotICAvLyBMaXN0IHRoZSBlbGVtZW50cyB0aGF0IHlvdSBtaWdodCBhY3R1YWxseSBnZXQKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGVsZW1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXNwb25zZSI7Ci0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBlbGVtbmFtZSwgcmV0dXJudHlwZSk7Ci0gICAgZl94c2RfIDw8IGVuZGw7Ci0KLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgYWxsX3hjZXB0aW9uc1soKnhfaXRlciktPmdldF9uYW1lKCldID0gKHRfc3RydWN0KikoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBheF9pdGVyOwotICBmb3IgKGF4X2l0ZXIgPSBhbGxfeGNlcHRpb25zLmJlZ2luKCk7IGF4X2l0ZXIgIT0gYWxsX3hjZXB0aW9ucy5lbmQoKTsgKytheF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGF4X2l0ZXItPmZpcnN0LCBheF9pdGVyLT5zZWNvbmQpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIFhTRCBkb2N1bWVudAotICBmX3hzZF8gPDwgZW5kbCA8PCAiPC94c2Q6c2NoZW1hPiIgPDwgZW5kbDsKLSAgZl94c2RfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiB4c2QoYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB4c2QoImludCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiAiY29udGFpbmVyIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBYU0QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBYU0QgdHlwZSwgaS5lLiB4c2Q6c3RyaW5nCi0gKi8KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiYnl0ZSI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAic2hvcnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAibG9uZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZGVjaW1hbCI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oIGIvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDQxNDMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0xPQkFMU19ICi0jZGVmaW5lIFRfR0xPQkFMU19ICi0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqCi0gKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQotICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKLSAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCi0gKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQotICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCi0gKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCi0gKgotICovCi0KLS8qKgotICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQotICovCi0KLWNsYXNzIHRfcHJvZ3JhbTsKLWNsYXNzIHRfc2NvcGU7Ci1jbGFzcyB0X3R5cGU7Ci0KLS8qKgotICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQotICovCi0KLWVudW0gUEFSU0VfTU9ERSB7Ci0gIElOQ0xVREVTID0gMSwKLSAgUFJPR1JBTSA9IDIKLX07Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1leHRlcm4gaW50IGdfc3RyaWN0OwotCi0vKioKLSAqIFRoZSBtYXN0ZXIgcHJvZ3JhbSBwYXJzZSB0cmVlLiBUaGlzIGlzIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBwYXJzZXIgY29kZQotICogdG8gYnVpbGQgdXAgdGhlIHByb2dyYW0gZWxlbWVudHMuCi0gKi8KLWV4dGVybiB0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKLSAqLwotCi1leHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYnl0ZTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pMTY7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTMyOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k2NDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9kb3VibGU7Ci0KLS8qKgotICogVGhlIHNjb3BlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGludG8KLSAqLwotZXh0ZXJuIHRfc2NvcGUqIGdfc2NvcGU7Ci0KLS8qKgotICogVGhlIHBhcmVudCBzY29wZSB0byBhbHNvIGxvYWQgc3ltYm9scyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBUaGUgcHJlZml4IGZvciB0aGUgcGFyZW50IHNjb3BlIGVudHJpZXMKLSAqLwotZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBUaGUgcGFyc2luZyBwYXNzIHRoYXQgd2UgYXJlIG9uLiBXZSBkbyBkaWZmZXJlbnQgdGhpbmdzIG9uIGVhY2ggcGFzcy4KLSAqLwotZXh0ZXJuIFBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZywgdXNlZCBpbiBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIGV0Yy4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfdGltZV9zdHI7Ci0KLS8qKgotICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGludCBnX2RvY3RleHRfbGluZW5vOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMjQ1Yi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCi0gKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KLSAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQotICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCi0gKgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpZmRlZiBNSU5HVwotIyBpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBHZXRGdWxsUGF0aE5hbWUgKi8KLSNlbmRpZgotCi0vLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgInBhcnNlL3Rfc2NvcGUuaCIKLSNpbmNsdWRlICJnZW5lcmF0ZS90X2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIEdsb2JhbCBwcm9ncmFtIHRyZWUKLSAqLwotdF9wcm9ncmFtKiBnX3Byb2dyYW07Ci0KLS8qKgotICogR2xvYmFsIHR5cGVzCi0gKi8KLQotdF90eXBlKiBnX3R5cGVfdm9pZDsKLXRfdHlwZSogZ190eXBlX3N0cmluZzsKLXRfdHlwZSogZ190eXBlX2JpbmFyeTsKLXRfdHlwZSogZ190eXBlX3NsaXN0OwotdF90eXBlKiBnX3R5cGVfYm9vbDsKLXRfdHlwZSogZ190eXBlX2J5dGU7Ci10X3R5cGUqIGdfdHlwZV9pMTY7Ci10X3R5cGUqIGdfdHlwZV9pMzI7Ci10X3R5cGUqIGdfdHlwZV9pNjQ7Ci10X3R5cGUqIGdfdHlwZV9kb3VibGU7Ci0KLS8qKgotICogR2xvYmFsIHNjb3BlCi0gKi8KLXRfc2NvcGUqIGdfc2NvcGU7Ci0KLS8qKgotICogUGFyZW50IHNjb3BlIHRvIGFsc28gcGFyc2UgdHlwZXMKLSAqLwotdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7Ci0KLS8qKgotICogUHJlZml4IGZvciBwdXR0aW5nIHR5cGVzIGluIHBhcmVudCBzY29wZQotICovCi1zdHJpbmcgZ19wYXJlbnRfcHJlZml4OwotCi0vKioKLSAqIFBhcnNpbmcgcGFzcwotICovCi1QQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKLQotLyoqCi0gKiBDdXJyZW50IGRpcmVjdG9yeSBvZiBmaWxlIGJlaW5nIHBhcnNlZAotICovCi1zdHJpbmcgZ19jdXJkaXI7Ci0KLS8qKgotICogQ3VycmVudCBmaWxlIGJlaW5nIHBhcnNlZAotICovCi1zdHJpbmcgZ19jdXJwYXRoOwotCi0vKioKLSAqIFNlYXJjaCBwYXRoIGZvciBpbmNsdXNpb25zCi0gKi8KLXZlY3RvcjxzdHJpbmc+IGdfaW5jbF9zZWFyY2hwYXRoOwotCi0vKioKLSAqIFNob3VsZCBDKysgaW5jbHVkZSBzdGF0ZW1lbnRzIHVzZSBwYXRoIHByZWZpeGVzIGZvciBvdGhlciB0aHJpZnQtZ2VuZXJhdGVkCi0gKiBoZWFkZXIgZmlsZXMKLSAqLwotYm9vbCBnX2NwcF91c2VfaW5jbHVkZV9wcmVmaXggPSBmYWxzZTsKLQotLyoqCi0gKiBHbG9iYWwgZGVidWcgc3RhdGUKLSAqLwotaW50IGdfZGVidWcgPSAwOwotCi0vKioKLSAqIFN0cmljdG5lc3MgbGV2ZWwKLSAqLwotaW50IGdfc3RyaWN0ID0gMTI3OwotCi0vKioKLSAqIFdhcm5pbmcgbGV2ZWwKLSAqLwotaW50IGdfd2FybiA9IDE7Ci0KLS8qKgotICogVmVyYm9zZSBvdXRwdXQKLSAqLwotaW50IGdfdmVyYm9zZSA9IDA7Ci0KLS8qKgotICogR2xvYmFsIHRpbWUgc3RyaW5nCi0gKi8KLWNoYXIqIGdfdGltZV9zdHI7Ci0KLS8qKgotICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotY2hhciogZ19kb2N0ZXh0OwotCi0vKioKLSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1pbnQgZ19kb2N0ZXh0X2xpbmVubzsKLQotLyoqCi0gKiBGbGFncyB0byBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbgotICovCi1ib29sIGdlbl9jcHAgPSBmYWxzZTsKLWJvb2wgZ2VuX2RlbnNlID0gZmFsc2U7Ci1ib29sIGdlbl9qYXZhID0gZmFsc2U7Ci1ib29sIGdlbl9qYXZhYmVhbiA9IGZhbHNlOwotYm9vbCBnZW5fcmIgPSBmYWxzZTsKLWJvb2wgZ2VuX3B5ID0gZmFsc2U7Ci1ib29sIGdlbl9weV9uZXdzdHlsZSA9IGZhbHNlOwotYm9vbCBnZW5feHNkID0gZmFsc2U7Ci1ib29sIGdlbl9waHAgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocGkgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocHMgPSB0cnVlOwotYm9vbCBnZW5fcGhwYSA9IGZhbHNlOwotYm9vbCBnZW5fcGhwbyA9IGZhbHNlOwotYm9vbCBnZW5fcmVzdCA9IGZhbHNlOwotYm9vbCBnZW5fcGVybCA9IGZhbHNlOwotYm9vbCBnZW5fZXJsID0gZmFsc2U7Ci1ib29sIGdlbl9vY2FtbCA9IGZhbHNlOwotYm9vbCBnZW5faHMgPSBmYWxzZTsKLWJvb2wgZ2VuX2NvY29hID0gZmFsc2U7Ci1ib29sIGdlbl9jc2hhcnAgPSBmYWxzZTsKLWJvb2wgZ2VuX3N0ID0gZmFsc2U7Ci1ib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7Ci0KLS8qKgotICogTWluR1cgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAotICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCi0gKi8KLWNoYXIgKnNhZmVyZWFscGF0aChjb25zdCBjaGFyICpwYXRoLCBjaGFyICpyZXNvbHZlZF9wYXRoKSB7Ci0jaWZkZWYgTUlOR1cKLSAgY2hhciBidWZbTUFYX1BBVEhdOwotICBjaGFyKiBiYXNlbmFtZTsKLSAgRFdPUkQgbGVuID0gR2V0RnVsbFBhdGhOYW1lKHBhdGgsIE1BWF9QQVRILCBidWYsICZiYXNlbmFtZSk7Ci0gIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBNQVhfUEFUSCAtIDEpewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKLSAgfSBlbHNlIHsKLSAgICBDaGFyTG93ZXJCdWZmKGJ1ZiwgbGVuKTsKLSAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKLSAgfQotCi0gIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCi0gIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCi0gIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKLSAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7Ci0gICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKLSNlbHNlCi0gIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKLSNlbmRpZgotfQotCi0KLS8qKgotICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCi0gKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKLSAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCi0gKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLAotICAgICAgICAgIGdfY3VycGF0aC5jX3N0cigpLAotICAgICAgICAgIHl5bGluZW5vLAotICAgICAgICAgIHl5dGV4dCk7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX2RlYnVnID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX3dhcm4gPCBsZXZlbCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cwotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2grMSk7Ci0gIH0KLSAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKLSAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci0gIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXR1cm4gIi4iOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQotICovCi1zdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgewotICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0Ci0gIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKLSAgICAvLyBSZWFscGF0aCEKLSAgICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgIH0KLQotICAgIC8vIFN0YXQgdGhpcyBmaWxlCi0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgcmV0dXJuIHJwOwotICAgIH0KLSAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCi0gICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCi0gICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKLSAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOwotCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCi0gICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgewotICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7Ci0KLSAgICAgIC8vIFJlYWxwYXRoIQotICAgICAgY2hhciBycFtQQVRIX01BWF07Ci0gICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCi0gICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJwOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFVoIG9oCi0gIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgotICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgotICovCi12b2lkIGNsZWFyX2RvY3RleHQoKSB7Ci0gIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgewotICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKLSAgfQotICBmcmVlKGdfZG9jdGV4dCk7Ci0gIGdfZG9jdGV4dCA9IE5VTEw7Ci19Ci0KLS8qKgotICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCi0gKgotICogV2FybmluZzogaWYgeW91IG1peCB0YWJzIGFuZCBzcGFjZXMgaW4gYSBub24tdW5pZm9ybSB3YXksCi0gKiB5b3Ugd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KLSAqLwotY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KSB7Ci0gIC8vIENvbnZlcnQgdG8gQysrIHN0cmluZywgYW5kIHJlbW92ZSBXaW5kb3dzJ3MgY2FycmlhZ2UgcmV0dXJucy4KLSAgc3RyaW5nIGRvY3N0cmluZyA9IGRvY3RleHQ7Ci0gIGRvY3N0cmluZy5lcmFzZSgKLSAgICAgIHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwKLSAgICAgIGRvY3N0cmluZy5lbmQoKSk7Ci0KLSAgLy8gU2VwYXJhdGUgaW50byBsaW5lcy4KLSAgdmVjdG9yPHN0cmluZz4gbGluZXM7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHN0cmluZzo6bnBvczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdDsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBsYXN0ID0gKHBvcyA9PSBzdHJpbmc6Om5wb3MpID8gMCA6IHBvcysxOwotICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOwotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKLSAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcy1sYXN0KSk7Ci0gIH0KLQotICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgotICBpZiAobGluZXMuZW1wdHkoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCi0gIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7Ci0KLSAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKLSAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgotICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKLSAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7Ci0gIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKCFmb3VuZF9wcmVmaXgpIHsKLSAgICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGlmIChsX2l0ZXItPmF0KHBvcykgPT0gJyonKSB7Ci0gICAgICAgICAgZm91bmRfcHJlZml4ID0gdHJ1ZTsKLSAgICAgICAgICBwcmVmaXhfbGVuID0gcG9zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgVHJ1bmNhdGUgaXQuCi0gICAgICAgIGxfaXRlci0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGxfaXRlci0+c2l6ZSgpID4gcG9zCi0gICAgICAgICYmIGxfaXRlci0+YXQocG9zKSA9PSAnKicKLSAgICAgICAgJiYgcG9zID09IHByZWZpeF9sZW4pIHsKLSAgICAgIC8vIEJ1c2luZXNzIGFzIHVzdWFsLgotICAgIH0gZWxzZSBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBMZXQncyB0cnVuY2F0ZSBpdCBmb3IgdGhlbS4KLSAgICAgIGxfaXRlci0+Y2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhlIHBhdHRlcm4gaGFzIGJlZW4gYnJva2VuLgotICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGlmIChoYXZlX3ByZWZpeCkgewotICAgIC8vIEdldCB0aGUgc3RhciB0b28uCi0gICAgcHJlZml4X2xlbisrOwotICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOwotICAgIH0KLSAgfQotCi0gIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KLSAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MKLSAgICAgICAgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7Ci0gICAgICBwcmVmaXhfbGVuID0gcG9zOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgewotICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOwotICAgIH0KLSAgfQotCi0gIC8vIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZS4KLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgcG9zID0gbF9pdGVyLT5maW5kX2xhc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgIT0gbF9pdGVyLT5sZW5ndGgoKS0xKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKHBvcysxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgotICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgotICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7Ci0gICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7Ci0gIH0KLQotICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgotICBkb2NzdHJpbmcuY2xlYXIoKTsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7Ci0gICAgZG9jc3RyaW5nICs9ICdcbic7Ci0gIH0KLQotICBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7Ci0gIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7Ci0gIHJldHVybiBkb2N0ZXh0OwotfQotCi0vKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KLXN0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOwotCi0vKioKLSAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0Ci0gKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYwotICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgotICovCi12b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7Ci0gIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7Ci0gICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOwotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7Ci0gIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgewotICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOwotICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7Ci0gICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7Ci0gICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7Ci0gICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKLSAgICBpZiAoc3QtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOwotICAgIGlmICh4bi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgewotICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOwotICAgIGlmIChzdi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDYWxsIGdlbmVyYXRlX2ZpbmdlcnByaW50IGZvciBldmVyeSBzdHJ1Y3R1cmUgYW5kIGVudW0uCi0gKi8KLXZvaWQgZ2VuZXJhdGVfYWxsX2ZpbmdlcnByaW50cyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKLSAgICBzdC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnhfaXRlcjsKLSAgICBzdC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgewotICAgIHRfZW51bSogZSA9ICplX2l0ZXI7Ci0gICAgZS0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGdfdHlwZV92b2lkLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotCi0gIC8vIElmIHlvdSB3YW50IHRvIGdlbmVyYXRlIGZpbmdlcnByaW50cyBmb3IgaW1wbGljaXQgc3RydWN0dXJlcywgc3RhcnQgaGVyZS4KLSAgLyoKLSAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7Ci0gIH0KLSAgKi8KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCi0gKi8KLXZvaWQgdmVyc2lvbigpIHsKLSAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOwotfQotCi0vKioKLSAqIERpcGxheXMgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgotICovCi12b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1nZW4gU1RSICAgR2VuZXJhdGUgY29kZSB3aXRoIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgU1RSIGhhcyB0aGUgZm9ybSBsYW5ndWFnZVs6a2V5MT12YWwxWyxrZXkyLFtrZXkzPXZhbDNdXV0uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgZ2VuZXJhdG9yLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIE1hbnkgb3B0aW9ucyB3aWxsIG5vdCByZXF1aXJlIHZhbHVlcy5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGdlbmVyYXRvcnMgKGFuZCBvcHRpb25zKTpcbiIpOwotCi0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgZ2VuX21hcCA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOwotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBnZW5fbWFwLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuX21hcC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICVzICglcyk6XG4iLAotICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbG9uZ19uYW1lKCkuY19zdHIoKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZXItPnNlY29uZC0+Z2V0X2RvY3VtZW50YXRpb24oKS5jX3N0cigpKTsKLSAgfQotICBleGl0KDEpOwotfQotCi0vKioKLSAqIFlvdSBrbm93LCB3aGVuIEkgc3RhcnRlZCB3b3JraW5nIG9uIFRocmlmdCBJIHJlYWxseSB0aG91Z2h0IGl0IHdhc24ndCBnb2luZwotICogdG8gYmVjb21lIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYmVjYXVzZSBpdCB3YXMganVzdCBhIGdlbmVyYXRvciBhbmQgaXQKLSAqIHdvdWxkbid0IG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFuZCBhbGwgdGhhdCBqYXp6LiBCdXQgdGhlbiB3ZQotICogZGVjaWRlZCB0byBhZGQgY29uc3RhbnRzLCBhbmQgYWxsIG9mIGEgc3VkZGVuIHRoYXQgbWVhbnMgcnVudGltZSB0eXBlCi0gKiB2YWxpZGF0aW9uIGFuZCBpbmZlcmVuY2UsIGV4Y2VwdCB0aGUgInJ1bnRpbWUiIGlzIHRoZSBjb2RlIGdlbmVyYXRvcgotICogcnVudGltZS4KLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF9yZWMoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgInR5cGUgZXJyb3I6IGNhbm5vdCBkZWNsYXJlIGEgdm9pZCBjb25zdDogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBib29sIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBieXRlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkxNiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMzIiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTY0IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIgJiYKLSAgICAgICAgICB2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEUpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGRvdWJsZSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGVudW0iOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAoKHRfZW51bSopdHlwZSktPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKSB7Ci0gICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCAiICsgbmFtZSArICIgd2FzIGRlY2xhcmVkIGFzIHR5cGUgIiAKLSAgICAgICAgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiB3aGljaCBpcyBhbiBlbnVtLCBidXQgIiAKLSAgICAgICAgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7Ci0gICAgICB9Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBlX3R5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayB0aGUgdHlwZSBvZiB0aGUgcGFyc2VkIGNvbnN0IGluZm9ybWF0aW9uIGFnYWluc3QgaXRzIGRlY2xhcmVkIHR5cGUKLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpIHsKLSAgdmFsaWRhdGVfY29uc3RfcmVjKGMtPmdldF9uYW1lKCksIGMtPmdldF90eXBlKCksIGMtPmdldF92YWx1ZSgpKTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGUgdHlwZSBvZiBhIGRlZmF1bHQgdmFsdWUgYXNzaWduZWQgdG8gYSBmaWVsZC4KLSAqLwotdm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpIHsKLSAgdmFsaWRhdGVfY29uc3RfcmVjKGZpZWxkLT5nZXRfbmFtZSgpLCBmaWVsZC0+Z2V0X3R5cGUoKSwgY3YpOwotfQotCi0vKioKLSAqIENoZWNrIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBvZiBhIHRocm93cyBibG9jayBhcmUgYWN0dWFsbHkgZXhjZXB0aW9ucy4KLSAqLwotYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cykgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdGhyb3dzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBQYXJzZXMgYSBwcm9ncmFtCi0gKi8KLXZvaWQgcGFyc2UodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3Byb2dyYW0qIHBhcmVudF9wcm9ncmFtKSB7Ci0gIC8vIEdldCBzY29wZSBmaWxlIHBhdGgKLSAgc3RyaW5nIHBhdGggPSBwcm9ncmFtLT5nZXRfcGF0aCgpOwotCi0gIC8vIFNldCBjdXJyZW50IGRpciBnbG9iYWwsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGluY2x1ZGVfZmlsZSBmdW5jdGlvbgotICBnX2N1cmRpciA9IGRpcmVjdG9yeV9uYW1lKHBhdGgpOwotICBnX2N1cnBhdGggPSBwYXRoOwotCi0gIC8vIE9wZW4gdGhlIGZpbGUKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLQotICAvLyBDcmVhdGUgbmV3IHNjb3BlIGFuZCBzY2FuIGZvciBpbmNsdWRlcwotICBwdmVyYm9zZSgiU2Nhbm5pbmcgJXMgZm9yIGluY2x1ZGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICBnX3BhcnNlX21vZGUgPSBJTkNMVURFUzsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIHRyeSB7Ci0gICAgeXlsaW5lbm8gPSAxOwotICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgewotICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyBpbmNsdWRlIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci0KLSAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgYWxsIHRoZSBpbmNsdWRlIHByb2dyYW1zCi0gIHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBwYXJzZSgqaXRlciwgcHJvZ3JhbSk7Ci0gIH0KLQotICAvLyBQYXJzZSB0aGUgcHJvZ3JhbSBmaWxlCi0gIGdfcGFyc2VfbW9kZSA9IFBST0dSQU07Ci0gIGdfcHJvZ3JhbSA9IHByb2dyYW07Ci0gIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOwotICBnX3BhcmVudF9zY29wZSA9IChwYXJlbnRfcHJvZ3JhbSAhPSBOVUxMKSA/IHBhcmVudF9wcm9ncmFtLT5zY29wZSgpIDogTlVMTDsKLSAgZ19wYXJlbnRfcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICIuIjsKLSAgZ19jdXJwYXRoID0gcGF0aDsKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLSAgcHZlcmJvc2UoIlBhcnNpbmcgJXMgZm9yIHR5cGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICB5eWxpbmVubyA9IDE7Ci0gIHRyeSB7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIHR5cGVzIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgY29kZQotICovCi12b2lkIGdlbmVyYXRlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGdlbmVyYXRvcl9zdHJpbmdzKSB7Ci0gIC8vIE9vb29oaCwgcmVjdXJzaXZlIGNvZGUgZ2VuZXJhdGlvbiwgaG90ISEKLSAgaWYgKGdlbl9yZWN1cnNlKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIC8vIFByb3BvZ2F0ZSBvdXRwdXQgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBwcm9ncmFtcwotICAgICAgaW5jbHVkZXNbaV0tPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSk7Ci0KLSAgICAgIGdlbmVyYXRlKGluY2x1ZGVzW2ldLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29kZSEKLSAgdHJ5IHsKLSAgICBwdmVyYm9zZSgiUHJvZ3JhbTogJXNcbiIsIHByb2dyYW0tPmdldF9wYXRoKCkuY19zdHIoKSk7Ci0KLSAgICAvLyBDb21wdXRlIGZpbmdlcnByaW50cy4KLSAgICBnZW5lcmF0ZV9hbGxfZmluZ2VycHJpbnRzKHByb2dyYW0pOwotCi0gICAgaWYgKGR1bXBfZG9jcykgewotICAgICAgZHVtcF9kb2NzdHJpbmdzKHByb2dyYW0pOwotICAgIH0KLQotICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IGdlbmVyYXRvcl9zdHJpbmdzLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuZXJhdG9yX3N0cmluZ3MuZW5kKCk7ICsraXRlcikgewotICAgICAgdF9nZW5lcmF0b3IqIGdlbmVyYXRvciA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICppdGVyKTsKLQotICAgICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHB2ZXJib3NlKCJHZW5lcmF0aW5nIFwiJXNcIlxuIiwgaXRlci0+Y19zdHIoKSk7Ci0gICAgICAgIGdlbmVyYXRvci0+Z2VuZXJhdGVfcHJvZ3JhbSgpOwotICAgICAgICBkZWxldGUgZ2VuZXJhdG9yOwotICAgICAgfQotICAgIH0KLQotICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOwotICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKLSAgICBwcmludGYoIkVycm9yOiAlc1xuIiwgZXhjKTsKLSAgfQotCi19Ci0KLS8qKgotICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0Ci0gKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgotICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaW50IGk7Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoOwotCi0gIC8vIFNldHVwIHRpbWUgc3RyaW5nCi0gIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotICBnX3RpbWVfc3RyID0gY3RpbWUoJm5vdyk7Ci0KLSAgLy8gQ2hlY2sgZm9yIG5lY2Vzc2FyeSBhcmd1bWVudHMsIHlvdSBnb3R0YSBoYXZlIGF0IGxlYXN0IGEgZmlsZW5hbWUgYW5kCi0gIC8vIGFuIG91dHB1dCBsYW5ndWFnZSBmbGFnCi0gIGlmIChhcmdjIDwgMikgewotICAgIHVzYWdlKCk7Ci0gIH0KLQotICB2ZWN0b3I8c3RyaW5nPiBnZW5lcmF0b3Jfc3RyaW5nczsKLQotICAvLyBTZXQgdGhlIGN1cnJlbnQgcGF0aCB0byBhIGR1bW15IHZhbHVlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgotICBnX2N1cnBhdGggPSAiYXJndW1lbnRzIjsKLQotICAvLyBIYWNreSBwYXJhbWV0ZXIgaGFuZGxpbmcuLi4gSSBkaWRuJ3QgZmVlbCBsaWtlIHVzaW5nIGEgbGlicmFyeSBzb3JyeSEKLSAgZm9yIChpID0gMTsgaSA8IGFyZ2MtMTsgaSsrKSB7Ci0gICAgY2hhciogYXJnOwotCi0gICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7Ci0gICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7Ci0gICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKLSAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKLSAgICAgICAgKythcmc7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJjbXAoYXJnLCAiLXZlcnNpb24iKSA9PSAwKSB7Ci0gICAgICAgIHZlcnNpb24oKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZWJ1ZyIpID09IDApIHsKLSAgICAgICAgZ19kZWJ1ZyA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbm93YXJuIikgPT0gMCkgewotICAgICAgICBnX3dhcm4gPSAwOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0cmljdCIpID09IDApIHsKLSAgICAgICAgZ19zdHJpY3QgPSAyNTU7Ci0gICAgICAgIGdfd2FybiA9IDI7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdiIpID09IDAgfHwgc3RyY21wKGFyZywgIi12ZXJib3NlIikgPT0gMCApIHsKLSAgICAgICAgZ192ZXJib3NlID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwICkgewotICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgewotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVuc2UiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9kZW5zZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwIikgPT0gMCkgewotICAgICAgICBnZW5fY3BwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhYmVhbiIpID09IDApIHsKLSAgICAgICAgZ2VuX2phdmFiZWFuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhIikgPT0gMCkgewotICAgICAgICBnZW5famF2YSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBpIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwaSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwcyIpID09IDApIHsKLSAgICAgICAgZ2VuX3BocCA9IHRydWU7Ci0gICAgICAgIGdlbl9waHBzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBsIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBhIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgICAgZ2VuX3BocGEgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocG8iKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwbyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmVzdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3Jlc3QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5IikgPT0gMCkgewotICAgICAgICBnZW5fcHkgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5bnMiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9weSA9IHRydWU7Ci0gICAgICAgIGdlbl9weV9uZXdzdHlsZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmIiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9yYiA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICIteHNkIikgPT0gMCkgewotICAgICAgICBnZW5feHNkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1wZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fcGVybCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fZXJsID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1vY2FtbCIpID09IDApIHsKLSAgICAgICAgZ2VuX29jYW1sID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ocyIpID09IDApIHsKLSAgICAgICAgZ2VuX2hzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jb2NvYSIpID09IDApIHsKLSAgICAgICAgZ2VuX2NvY29hID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3N0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jc2hhcnAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9jc2hhcnAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNwcF91c2VfaW5jbHVkZV9wcmVmaXgiKSA9PSAwKSB7Ci0gICAgICAgIGdfY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKLSAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCi0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLQotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiEhISBNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhhcmcpOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW8iKSA9PSAwKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIG91dF9wYXRoID0gYXJnOwotCi0jaWZkZWYgTUlOR1cKLSAgICAgICAgLy9zdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCi0gICAgICAgIGludCBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCktMTsKLSAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgICAgIGlmIChzdGF0KG91dF9wYXRoLmNfc3RyKCksICZzYikgPCAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiAlc1xuIiwgb3V0X3BhdGguY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEgU19JU0RJUihzYi5zdF9tb2RlKSkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgb3V0X3BhdGguY19zdHIoKSk7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiEhISBVbnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuIiwgYXJnKTsKLSAgICAgICAgdXNhZ2UoKTsKLSAgICAgIH0KLQotICAgICAgLy8gVG9rZW5pemUgbW9yZQotICAgICAgYXJnID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gaWYgeW91J3JlIGFza2luZyBmb3IgdmVyc2lvbiwgeW91IGhhdmUgYSByaWdodCBub3QgdG8gcGFzcyBhIGZpbGUKLSAgaWYgKHN0cmNtcChhcmd2W2FyZ2MtMV0sICItdmVyc2lvbiIpID09IDApIHsKLSAgICB2ZXJzaW9uKCk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogRGVsZXRlIHRoZXNlIHdoZW4gZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLgotICBpZiAoZ2VuX2NwcCkgewotICAgIHB3YXJuaW5nKDEsICItY3BwIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY3BwIik7Ci0gICAgc3RyaW5nIGdlbl9zdHJpbmcgPSAiY3BwOiI7Ci0gICAgaWYgKGdlbl9kZW5zZSkgewotICAgICAgZ2VuX3N0cmluZy5hcHBlbmQoImRlbnNlLCIpOwotICAgIH0KLSAgICBpZiAoZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4KSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiaW5jbHVkZV9wcmVmaXgsIik7Ci0gICAgfQotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjayhnZW5fc3RyaW5nKTsKLSAgfQotICBpZiAoZ2VuX2phdmEpIHsKLSAgICBwd2FybmluZygxLCAiLWphdmEgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBqYXZhIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJqYXZhIik7Ci0gIH0KLSAgaWYgKGdlbl9qYXZhYmVhbikgewotICAgIHB3YXJuaW5nKDEsICItamF2YWJlYW4gaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBqYXZhOmJlYW5zIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJqYXZhOmJlYW5zIik7Ci0gIH0KLSAgaWYgKGdlbl9jc2hhcnApIHsKLSAgICBwd2FybmluZygxLCAiLWNzaGFycCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGNzaGFycCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygiY3NoYXJwIik7Ci0gIH0KLSAgaWYgKGdlbl9weSkgewotICAgIHB3YXJuaW5nKDEsICItcHkgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBweSIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygicHkiKTsKLSAgfQotICBpZiAoZ2VuX3JiKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1yYiBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHJiIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJyYiIpOwotICB9Ci0gIGlmIChnZW5fcGVybCkgewotICAgIHB3YXJuaW5nKDEsICItcGVybCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHBlcmwiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInBlcmwiKTsKLSAgfQotICBpZiAoZ2VuX3BocCB8fCBnZW5fcGhwaSkgewotICAgIHB3YXJuaW5nKDEsICItcGhwIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcGhwIik7Ci0gICAgc3RyaW5nIGdlbl9zdHJpbmcgPSAicGhwOiI7Ci0gICAgaWYgKGdlbl9waHBpKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiaW5saW5lZCwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocHMpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJzZXJ2ZXIsIik7Ci0gICAgfSBlbHNlIGlmKGdlbl9waHBhKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiYXV0b2xvYWQsIik7Ci0gICAgfSBlbHNlIGlmKGdlbl9waHBvKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgib29wLCIpOwotICAgIH0gZWxzZSBpZihnZW5fcmVzdCkgewotICAgICAgZ2VuX3N0cmluZy5hcHBlbmQoInJlc3QsIik7Ci0gICAgfQotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjayhnZW5fc3RyaW5nKTsKLSAgfQotICBpZiAoZ2VuX2NvY29hKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1jb2NvYSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGNvY29hIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJjb2NvYSIpOwotICB9Ci0gIGlmIChnZW5fZXJsKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1lcmwgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBlcmwiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImVybCIpOwotICB9Ci0gIGlmIChnZW5fc3QpIHsKLSAgICBwd2FybmluZygxLCAiLXN0IGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gc3QiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInN0Iik7Ci0gIH0KLSAgaWYgKGdlbl9vY2FtbCkgewotICAgIHB3YXJuaW5nKDEsICItb2NhbWwgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBvY2FtbCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygib2NhbWwiKTsKLSAgfQotICBpZiAoZ2VuX2hzKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1ocyBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGhzIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJocyIpOwotICB9Ci0gIGlmIChnZW5feHNkKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi14c2QgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiB4c2QiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInhzZCIpOwotICB9Ci0KLSAgLy8gWW91IGdvdHRhIGdlbmVyYXRlIHNvbWV0aGluZyEKLSAgaWYgKGdlbmVyYXRvcl9zdHJpbmdzLmVtcHR5KCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiEhISBObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG5cbiIpOwotICAgIHVzYWdlKCk7Ci0gIH0KLQotICAvLyBSZWFsLXBhdGhpZnkgaXQKLSAgY2hhciBycFtQQVRIX01BWF07Ci0gIGlmIChhcmd2W2ldID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiEhISBNaXNzaW5nIGZpbGUgbmFtZVxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOwotICB9Ci0gIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKLQotICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShpbnB1dF9maWxlKTsKLSAgaWYgKG91dF9wYXRoLnNpemUoKSkgewotICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCk7Ci0gIH0KLQotICAvLyBDb21wdXRlIHRoZSBjcHAgaW5jbHVkZSBwcmVmaXguCi0gIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCi0gIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07Ci0gIHN0cmluZyBpbmNsdWRlX3ByZWZpeDsKLQotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOwotICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBpbmNsdWRlX3ByZWZpeCA9IGlucHV0X2ZpbGVuYW1lLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKLSAgfQotCi0gIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKLSAgZ190eXBlX3ZvaWQgICA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsICAgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7Ci0gIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOwotICBnX3R5cGVfc2xpc3QgID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7Ci0gIGdfdHlwZV9ib29sICAgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCAgIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOwotICBnX3R5cGVfYnl0ZSAgID0gbmV3IHRfYmFzZV90eXBlKCJieXRlIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKTsKLSAgZ190eXBlX2kxNiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKLSAgZ190eXBlX2kzMiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKLSAgZ190eXBlX2k2NCAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKLSAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKLQotICAvLyBQYXJzZSBpdCEKLSAgcGFyc2UocHJvZ3JhbSwgTlVMTCk7Ci0KLSAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCi0gIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgZ19jdXJwYXRoID0gImdlbmVyYXRpb24iOwotICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQotICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCi0gIHl5bGluZW5vID0gMTsKLQotICAvLyBHZW5lcmF0ZSBpdCEKLSAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotCi0gIC8vIENsZWFuIHVwLiBXaG8gYW0gSSBraWRkaW5nLi4uIHRoaXMgcHJvZ3JhbSBwcm9iYWJseSBvcnBoYW5zIGhlYXAgbWVtb3J5Ci0gIC8vIGFsbCBvdmVyIHRoZSBwbGFjZSwgYnV0IHdobyBjYXJlcyBiZWNhdXNlIGl0IGlzIGFib3V0IHRvIGV4aXQgYW5kIGl0IGlzCi0gIC8vIGFsbCByZWZlcmVuY2VkIGFuZCB1c2VkIGJ5IHRoaXMgd2Fja3kgcGFyc2UgdHJlZSB1cCB1bnRpbCBub3cgYW55d2F5cy4KLQotICBkZWxldGUgcHJvZ3JhbTsKLSAgZGVsZXRlIGdfdHlwZV92b2lkOwotICBkZWxldGUgZ190eXBlX3N0cmluZzsKLSAgZGVsZXRlIGdfdHlwZV9ib29sOwotICBkZWxldGUgZ190eXBlX2J5dGU7Ci0gIGRlbGV0ZSBnX3R5cGVfaTE2OwotICBkZWxldGUgZ190eXBlX2kzMjsKLSAgZGVsZXRlIGdfdHlwZV9pNjQ7Ci0gIGRlbGV0ZSBnX3R5cGVfZG91YmxlOwotCi0gIC8vIEZpbmlzaGVkCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZDgyZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQUlOX0gKLSNkZWZpbmUgVF9NQUlOX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJwYXJzZS90X2NvbnN0LmgiCi0jaW5jbHVkZSAicGFyc2UvdF9maWVsZC5oIgotCi0vKioKLSAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQotICovCi0KLWludCB5eWxleCh2b2lkKTsKLQotaW50IHl5cGFyc2Uodm9pZCk7Ci0KLS8qKgotICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCi0gKi8KLXZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogUGFyc2UgZGVidWdnaW5nIG91dHB1dCwgdXNlZCB0byBwcmludCBoZWxwZnVsIGluZm8KLSAqLwotdm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIFBhcnNlciB3YXJuaW5nCi0gKi8KLXZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogRmFpbHVyZSEKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7Ci0KLS8qKgotICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOwotCi0vKioKLSAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKLSAqLwotYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQotICovCi1zdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpOwotCi0vKioKLSAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cwotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOwotCi0vKioKLSAqIEZsZXggdXRpbGl0aWVzCi0gKi8KLQotZXh0ZXJuIGludCAgIHl5bGluZW5vOwotZXh0ZXJuIGNoYXIgIHl5dGV4dFtdOwotZXh0ZXJuIEZJTEUqIHl5aW47Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWQ5NmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgotCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbiBsaWJyYXJ5LgotICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgotICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCi0gIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcwotCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KLQlzZWxmLWNoZWNraW5nLgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCi0jaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCi0jICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQotI2Vsc2UKLSMgIGRlZmluZSBCWVRFX09SREVSIDAKLSNlbmRpZgotCi0jZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCi0jZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCi0jZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCi0jZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKLSNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKLSNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKLSNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQotI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQotI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQotI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4Ci0jZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQotI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKLSNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCi0jZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCi0jZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQotI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKLSNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKLSNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCi0jZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQotI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQotI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKLSNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCi0jZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCi0jZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQotI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKLSNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKLSNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCi0jZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQotI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAotI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKLSNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCi0jZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5Ci0jZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQotI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKLSNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCi0jZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCi0jZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQotI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKLSNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKLSNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCi0jZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQotI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgotI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKLSNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCi0jZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1Ci0jZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQotI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKLSNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKLSNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCi0jZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQotI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NwotI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKLSNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCi0jZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCi0jZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQotI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKLSNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCi0jZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCi0jZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQotI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKLSNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKLSNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCi0jZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQotI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgotI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKLQotCi1zdGF0aWMgdm9pZAotbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKLXsKLSAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwotICAgIG1kNV93b3JkX3QgdDsKLSNpZiBCWVRFX09SREVSID4gMAotICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IFhbMTZdOwotI2Vsc2UKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKLSAgICBjb25zdCBtZDVfd29yZF90ICpYOwotI2VuZGlmCi0KLSAgICB7Ci0jaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKLQotCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAotCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KLQkgICAgICovCi0JICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7Ci0JCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KLQkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKLQkgICAgfSBlbHNlIHsKLQkJLyogbm90IGFsaWduZWQgKi8KLQkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKLQkJWCA9IHhidWY7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCi0JICAgICAqIHJpZ2h0IG9yZGVyLgotCSAgICAgKi8KLQkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOwotCSAgICBpbnQgaTsKLQotIyAgaWYgQllURV9PUkRFUiA9PSAwCi0JICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KLSMgIGVsc2UKLSMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLwotIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKLQotICAgIC8qIFJvdW5kIDEuICovCi0gICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAyLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAzLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgNC4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKLSAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKLSAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLwotICAgIHBtcy0+YWJjZFswXSArPSBhOwotICAgIHBtcy0+YWJjZFsxXSArPSBiOwotICAgIHBtcy0+YWJjZFsyXSArPSBjOwotICAgIHBtcy0+YWJjZFszXSArPSBkOwotfQotCi12b2lkCi1tZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQotewotICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKLSAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7Ci0gICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OwotfQotCi12b2lkCi1tZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCi17Ci0gICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7Ci0gICAgaW50IGxlZnQgPSBuYnl0ZXM7Ci0gICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7Ci0gICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7Ci0KLSAgICBpZiAobmJ5dGVzIDw9IDApCi0JcmV0dXJuOwotCi0gICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KLSAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKLSAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOwotICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCi0JcG1zLT5jb3VudFsxXSsrOwotCi0gICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKG9mZnNldCkgewotCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOwotCi0JbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKLQlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQotCSAgICByZXR1cm47Ci0JcCArPSBjb3B5OwotCWxlZnQgLT0gY29weTsKLQltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKLSAgICB9Ci0KLSAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwotICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7Ci0KLSAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwotfQotCi12b2lkCi1tZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKLXsKLSAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9OwotICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLSAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmggYi9jb21waWxlci9jcHAvc3JjL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjOTk1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5oLHYgMS40IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5oIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgUmVtb3ZlZCBzdXBwb3J0IGZvciBub24tQU5TSSBjb21waWxlcnM7IHJlbW92ZWQKLQlyZWZlcmVuY2VzIHRvIEdob3N0c2NyaXB0OyBjbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOwotCW5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpOwotCWFkZGVkIGNvbmRpdGlvbmFsaXphdGlvbiBmb3IgQysrIGNvbXBpbGF0aW9uIGZyb20gTWFydGluCi0JUHVyc2Noa2UgPHB1cnNjaGtlQGJubC5nb3Y+LgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgbWQ1X0lOQ0xVREVECi0jICBkZWZpbmUgbWQ1X0lOQ0xVREVECi0KLS8qCi0gKiBUaGlzIHBhY2thZ2Ugc3VwcG9ydHMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGRldGVybWluYXRpb24gb2YgQ1BVCi0gKiBieXRlIG9yZGVyLiAgSWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQgYXMgMCwgdGhlIGNvZGUgd2lsbCBiZQotICogY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gbGl0dGxlLWVuZGlhbiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMKLSAqIGRlZmluZWQgYXMgbm9uLXplcm8sIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gYmlnLWVuZGlhbgotICogQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvCi0gKiBydW4gb24gZWl0aGVyIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiBDUFVzLCBidXQgd2lsbCBydW4gc2xpZ2h0bHkgbGVzcwotICogZWZmaWNpZW50bHkgb24gZWl0aGVyIG9uZSB0aGFuIGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBtZDVfYnl0ZV90OyAvKiA4LWJpdCBieXRlICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBtZDVfd29yZF90OyAvKiAzMi1iaXQgd29yZCAqLwotCi0vKiBEZWZpbmUgdGhlIHN0YXRlIG9mIHRoZSBNRDUgQWxnb3JpdGhtLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3MgewotICAgIG1kNV93b3JkX3QgY291bnRbMl07CS8qIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMsIGxzdyBmaXJzdCAqLwotICAgIG1kNV93b3JkX3QgYWJjZFs0XTsJCS8qIGRpZ2VzdCBidWZmZXIgKi8KLSAgICBtZDVfYnl0ZV90IGJ1Zls2NF07CQkvKiBhY2N1bXVsYXRlIGJsb2NrICovCi19IG1kNV9zdGF0ZV90OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgCi17Ci0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtLiAqLwotdm9pZCBtZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKTsKLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwotdm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpOwotCi0vKiBGaW5pc2ggdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgZGlnZXN0LiAqLwotdm9pZCBtZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZW5kIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogbWQ1X0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTFkZjkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0JBU0VfVFlQRV9ICi0jZGVmaW5lIFRfQkFTRV9UWVBFX0gKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0KLS8qKgotICogQSB0aHJpZnQgYmFzZSB0eXBlLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUgZGVmaW5lZCBlbnVtZXJhdGVkIHR5cGVzIGluc2lkZQotICogdGhpcyBkZWZpbml0aW9uLgotICoKLSAqLwotY2xhc3MgdF9iYXNlX3R5cGUgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBFbnVtZXJhdGlvbiBvZiB0aHJpZnQgYmFzZSB0eXBlcwotICAgKi8KLSAgZW51bSB0X2Jhc2UgewotICAgIFRZUEVfVk9JRCwKLSAgICBUWVBFX1NUUklORywKLSAgICBUWVBFX0JPT0wsCi0gICAgVFlQRV9CWVRFLAotICAgIFRZUEVfSTE2LAotICAgIFRZUEVfSTMyLAotICAgIFRZUEVfSTY0LAotICAgIFRZUEVfRE9VQkxFCi0gIH07Ci0KLSAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpIDoKLSAgICB0X3R5cGUobmFtZSksCi0gICAgYmFzZV8oYmFzZSksCi0gICAgc3RyaW5nX2xpc3RfKGZhbHNlKSwKLSAgICBiaW5hcnlfKGZhbHNlKSwKLSAgICBzdHJpbmdfZW51bV8oZmFsc2Upe30KLQotICB0X2Jhc2UgZ2V0X2Jhc2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfOwotICB9Ci0KLSAgYm9vbCBpc192b2lkKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX1ZPSUQ7Ci0gIH0KLQotICBib29sIGlzX3N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkc7Ci0gIH0KLQotICBib29sIGlzX2Jvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7Ci0gICAgc3RyaW5nX2xpc3RfID0gdmFsOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBzdHJpbmdfbGlzdF87Ci0gIH0KLQotICB2b2lkIHNldF9iaW5hcnkoYm9vbCB2YWwpIHsKLSAgICBiaW5hcnlfID0gdmFsOwotICB9Ci0KLSAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlXyA9PSBUWVBFX1NUUklORykgJiYgYmluYXJ5XzsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7Ci0gICAgc3RyaW5nX2VudW1fID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HICYmIHN0cmluZ19lbnVtXzsKLSAgfQotCi0gIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOwotICB9Ci0KLSAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydiA9IHRfYmFzZV9uYW1lKGJhc2VfKTsKLSAgICBpZiAocnYgPT0gIih1bmtub3duKSIpIHsKLSAgICAgIHRocm93ICJCVUc6IENhbid0IGdldCBmaW5nZXJwcmludCBtYXRlcmlhbCBmb3IgdGhpcyBiYXNlIHR5cGUuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgewotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgVFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAidm9pZCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX1NUUklORyA6IHJldHVybiAgICAic3RyaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgImJvb2wiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiYnl0ZSI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiaTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJpMzIiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgImk2NCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiZG91YmxlIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0ICAgICAgICAgIDogcmV0dXJuICIodW5rbm93bikiOyBicmVhazsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfYmFzZSBiYXNlXzsKLQotICBib29sIHN0cmluZ19saXN0XzsKLSAgYm9vbCBiaW5hcnlfOwotICBib29sIHN0cmluZ19lbnVtXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4MWJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfSAotI2RlZmluZSBUX0NPTlNUX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLQotLyoqCi0gKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKLSAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCi0gKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBvdXQuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIHZhbHVlXyh2YWx1ZSkge30KLQotICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmFlYjIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAotI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKLQotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qKgotICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0Ci0gKiBvciB3aGF0ZXZlci4KLSAqCi0gKi8KLWNsYXNzIHRfY29uc3RfdmFsdWUgewotIHB1YmxpYzoKLQotICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7Ci0gICAgQ1ZfSU5URUdFUiwKLSAgICBDVl9ET1VCTEUsCi0gICAgQ1ZfU1RSSU5HLAotICAgIENWX01BUCwKLSAgICBDVl9MSVNULAotICAgIENWX0lERU5USUZJRVIKLSAgfTsKLQotICB0X2NvbnN0X3ZhbHVlKCkge30KLQotICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSB7Ci0gICAgc2V0X2ludGVnZXIodmFsKTsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgc2V0X3N0cmluZyh2YWwpOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfU1RSSU5HOwotICAgIHN0cmluZ1ZhbF8gPSB2YWw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBzdHJpbmdWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKLSAgICBpbnRWYWxfID0gdmFsOwotICB9Ci0KLSAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKLSAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7Ci0gICAgICB9Ci0gICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShnZXRfaWRlbnRpZmllcigpKTsKLSAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gaW50VmFsXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOwotICAgIGRvdWJsZVZhbF8gPSB2YWw7Ci0gIH0KLQotICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZG91YmxlVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X21hcCgpIHsKLSAgICB2YWxUeXBlXyA9IENWX01BUDsKLSAgfQotCi0gIHZvaWQgYWRkX21hcCh0X2NvbnN0X3ZhbHVlKiBrZXksIHRfY29uc3RfdmFsdWUqIHZhbCkgewotICAgIG1hcFZhbF9ba2V5XSA9IHZhbDsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIGdldF9tYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hcFZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9saXN0KCkgewotICAgIHZhbFR5cGVfID0gQ1ZfTElTVDsKLSAgfQotCi0gIHZvaWQgYWRkX2xpc3QodF9jb25zdF92YWx1ZSogdmFsKSB7Ci0gICAgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgewotICAgIHJldHVybiBsaXN0VmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOwotICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkZW50aWZpZXJWYWxfOwotICB9Ci0gIAotICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgICBlbnVtXyA9IHRlbnVtOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB2YWxUeXBlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBWYWxfOwotICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87Ci0gIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87Ci0gIGludDY0X3QgaW50VmFsXzsKLSAgZG91YmxlIGRvdWJsZVZhbF87Ci0gIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXJWYWxfOwotICB0X2VudW0qIGVudW1fOwotCi0gIHRfY29uc3RfdmFsdWVfdHlwZSB2YWxUeXBlXzsKLQotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MzQ5My4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05UQUlORVJfSAotI2RlZmluZSBUX0NPTlRBSU5FUl9ICi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfY29udGFpbmVyKCkgOgotICAgIGNwcF9uYW1lXygpLAotICAgIGhhc19jcHBfbmFtZV8oZmFsc2UpIHt9Ci0KLSAgdmlydHVhbCB+dF9jb250YWluZXIoKSB7fQotCi0gIHZvaWQgc2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nIGNwcF9uYW1lKSB7Ci0gICAgY3BwX25hbWVfID0gY3BwX25hbWU7Ci0gICAgaGFzX2NwcF9uYW1lXyA9IHRydWU7Ci0gIH0KLQotICBib29sIGhhc19jcHBfbmFtZSgpIHsKLSAgICByZXR1cm4gaGFzX2NwcF9uYW1lXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9jcHBfbmFtZSgpIHsKLSAgICByZXR1cm4gY3BwX25hbWVfOwotICB9Ci0KLSAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKLSAgYm9vbCBoYXNfY3BwX25hbWVfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMDY4Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9ET0NfSAotI2RlZmluZSBUX0RPQ19ICi0KLS8qKgotICogRG9jdW1lbnRhdGlvbiBzdHVicwotICoKLSAqLwotY2xhc3MgdF9kb2MgewotCi0gcHVibGljOgotICB0X2RvYygpIDogaGFzX2RvY18oZmFsc2UpIHt9Ci0KLSAgdm9pZCBzZXRfZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2MpIHsKLSAgICBkb2NfID0gZG9jOwotICAgIGhhc19kb2NfID0gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgewotICAgIHJldHVybiBkb2NfOwotICB9Ci0KLSAgYm9vbCBoYXNfZG9jKCkgewotICAgIHJldHVybiBoYXNfZG9jXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgZG9jXzsKLSAgYm9vbCBoYXNfZG9jXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMTYwNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9ICi0jZGVmaW5lIFRfRU5VTV9ICi0KLSNpbmNsdWRlICJ0X2VudW1fdmFsdWUuaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qKgotICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdm9pZCBhcHBlbmQodF9lbnVtX3ZhbHVlKiBjb25zdGFudCkgewotICAgIGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgewotICAgIHJldHVybiBjb25zdGFudHNfOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfdmFsdWUoaW50NjRfdCB2YWx1ZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYm9vbCBpc19lbnVtKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJlbnVtIjsKLSAgfQotCi0gIHZvaWQgcmVzb2x2ZV92YWx1ZXMoKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgaW50IGxhc3RWYWx1ZSA9IC0xOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCEgKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgICAoKmNfaXRlciktPnNldF92YWx1ZSgrK2xhc3RWYWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsYXN0VmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2E4N2UuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAotI2RlZmluZSBUX0VOVU1fVkFMVUVfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAotICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZW0uCi0gKgotICovCi1jbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBoYXNfdmFsdWVfKGZhbHNlKSwKLSAgICB2YWx1ZV8oMCkge30KLQotICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6Ci0gICAgbmFtZV8obmFtZSksCi0gICAgaGFzX3ZhbHVlXyh0cnVlKSwKLSAgICB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgfnRfZW51bV92YWx1ZSgpIHt9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIGJvb2wgaGFzX3ZhbHVlKCkgewotICAgIHJldHVybiBoYXNfdmFsdWVfOwotICB9Ci0KLSAgaW50IGdldF92YWx1ZSgpIHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSAgdm9pZCBzZXRfdmFsdWUoaW50IHZhbCkgewotICAgIGhhc192YWx1ZV8gPSB0cnVlOwotICAgIHZhbHVlXyA9IHZhbDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGJvb2wgaGFzX3ZhbHVlXzsKLSAgaW50IHZhbHVlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxN2E1MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9GSUVMRF9ICi0jZGVmaW5lIFRfRklFTERfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycwotY2xhc3MgdF9zdHJ1Y3Q7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKLSAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgotICoKLSAqLwotY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGtleV8oMCksCi0gICAgdmFsdWVfKE5VTEwpLAotICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgIHhzZF9hdHRyc18oTlVMTCkge30KLQotICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgaW50MzJfdCBrZXkpIDoKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBrZXlfKGtleSksCi0gICAgcmVxXyhUX09QVF9JTl9SRVFfT1VUKSwKLSAgICB2YWx1ZV8oTlVMTCksCi0gICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCi0gICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgeHNkX2F0dHJzXyhOVUxMKSB7fQotCi0gIH50X2ZpZWxkKCkge30KLQotICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV87Ci0gIH0KLQotICBlbnVtIGVfcmVxIHsKLSAgICBUX1JFUVVJUkVELAotICAgIFRfT1BUSU9OQUwsCi0gICAgVF9PUFRfSU5fUkVRX09VVCwKLSAgfTsKLQotICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7Ci0gICAgcmVxXyA9IHJlcTsKLSAgfQotCi0gIGVfcmVxIGdldF9yZXEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlcV87Ci0gIH0KLQotICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAgIHZhbHVlXyA9IHZhbHVlOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIHNldF94c2Rfb3B0aW9uYWwoYm9vbCB4c2Rfb3B0aW9uYWwpIHsKLSAgICB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgewotICAgIHJldHVybiB4c2Rfb3B0aW9uYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7Ci0gICAgeHNkX25pbGxhYmxlXyA9IHhzZF9uaWxsYWJsZTsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9uaWxsYWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX25pbGxhYmxlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7Ci0gICAgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgewotICAgIHJldHVybiB4c2RfYXR0cnNfOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdF90eXBlOjpnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwsCi0gIC8vIGJ1dCBpdCBkb2VzIHRoZSBzYW1lIHRoaW5nLgotICBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGtleV8pICsgIjoiICsKLSAgICAgICgocmVxXyA9PSBUX09QVElPTkFMKSA/ICJvcHQtIiA6ICIiKSArCi0gICAgICB0eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgotICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCi0gICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KLSAgICovCi0gIHN0cnVjdCBrZXlfY29tcGFyZSB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGEsIHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGIpIHsKLSAgICAgIHJldHVybiBhLT5nZXRfa2V5KCkgPCBiLT5nZXRfa2V5KCk7Ci0gICAgfQotICB9OwotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGludDMyX3Qga2V5XzsKLSAgZV9yZXEgcmVxXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotCi0gIGJvb2wgeHNkX29wdGlvbmFsXzsKLSAgYm9vbCB4c2RfbmlsbGFibGVfOwotICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJhYTZjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRlVOQ1RJT05fSAotI2RlZmluZSBUX0ZVTkNUSU9OX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogUmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbi4gS2V5IHBhcnRzIGFyZSByZXR1cm4gdHlwZSwgZnVuY3Rpb24gbmFtZSwKLSAqIG9wdGlvbmFsIG1vZGlmaWVycywgYW5kIGFuIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGEgdGhyaWZ0Ci0gKiBzdHJ1Y3QuCi0gKgotICovCi1jbGFzcyB0X2Z1bmN0aW9uIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAotICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCi0gICAgICAgICAgICAgYm9vbCBvbmV3YXk9ZmFsc2UpIDoKLSAgICByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBhcmdsaXN0XyhhcmdsaXN0KSwKLSAgICBvbmV3YXlfKG9uZXdheSkgewotICAgIHhjZXB0aW9uc18gPSBuZXcgdF9zdHJ1Y3QoTlVMTCk7Ci0gIH0KLQotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIHRfc3RydWN0KiB4Y2VwdGlvbnMsCi0gICAgICAgICAgICAgYm9vbCBvbmV3YXk9ZmFsc2UpIDoKLSAgICByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBhcmdsaXN0XyhhcmdsaXN0KSwKLSAgICB4Y2VwdGlvbnNfKHhjZXB0aW9ucyksCi0gICAgb25ld2F5XyhvbmV3YXkpCi0gIHsKLSAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7Ci0gICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKLSAgICB9Ci0gIH0KLQotICB+dF9mdW5jdGlvbigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmV0dXJudHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF9hcmdsaXN0KCkgY29uc3QgewotICAgIHJldHVybiBhcmdsaXN0XzsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgewotICAgIHJldHVybiB4Y2VwdGlvbnNfOwotICB9Ci0KLSAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9uZXdheV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogcmV0dXJudHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICB0X3N0cnVjdCogYXJnbGlzdF87Ci0gIHRfc3RydWN0KiB4Y2VwdGlvbnNfOwotICBib29sIG9uZXdheV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWE5NjI1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9MSVNUX0gKLSNkZWZpbmUgVF9MSVNUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOgotICAgIGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZWxlbV90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAibGlzdDwiICsgZWxlbV90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGVsZW1fdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogZWxlbV90eXBlXzsKLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTM1OGYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTUFQX0gKLSNkZWZpbmUgVF9NQVBfSAotCi0jaW5jbHVkZSAidF9jb250YWluZXIuaCIKLQotLyoqCi0gKiBBIG1hcCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIHR3byBkYXRhCi0gKiB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfbWFwIDogcHVibGljIHRfY29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoKLSAgICBrZXlfdHlwZV8oa2V5X3R5cGUpLAotICAgIHZhbF90eXBlXyh2YWxfdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5X3R5cGVfOwotICB9Ci0KLSAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbF90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfbWFwKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJtYXA8IiArIGtleV90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKwotICAgICAgIiwiICsgdmFsX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAga2V5X3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIHZhbF90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBrZXlfdHlwZV87Ci0gIHRfdHlwZSogdmFsX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2OTdjNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1BST0dSQU1fSAotI2RlZmluZSBUX1BST0dSQU1fSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8vIEZvciBwcm9ncmFtX25hbWUoKQotI2luY2x1ZGUgIm1haW4uaCIKLQotI2luY2x1ZGUgInRfZG9jLmgiCi0jaW5jbHVkZSAidF9zY29wZS5oIgotI2luY2x1ZGUgInRfYmFzZV90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSAidF9jb25zdC5oIgotI2luY2x1ZGUgInRfc3RydWN0LmgiCi0jaW5jbHVkZSAidF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAidF9saXN0LmgiCi0jaW5jbHVkZSAidF9tYXAuaCIKLSNpbmNsdWRlICJ0X3NldC5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCi0vLyNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKLSAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIFR5cGVkZWZzCi0gKiAgIEVudW1lcmF0aW9ucwotICogICBDb25zdGFudHMKLSAqICAgU3RydWN0cwotICogICBFeGNlcHRpb25zCi0gKiAgIFNlcnZpY2VzCi0gKgotICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcGF0aF8ocGF0aCksCi0gICAgbmFtZV8obmFtZSksCi0gICAgb3V0X3BhdGhfKCIuLyIpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIikgewotICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOwotICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7Ci0gIH0KLQotICAvLyBQYXRoIGFjY2Vzc29yCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0KLSAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQotCi0gIC8vIE5hbWUgYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBOYW1lc3BhY2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQotCi0gIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mICAgIGdldF9lbnVtcygpICAgICBjb25zdCB7IHJldHVybiBlbnVtc187ICAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgICBnZXRfY29uc3RzKCkgICAgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3N0cnVjdHMoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfb2JqZWN0cygpICAgY29uc3QgeyByZXR1cm4gb2JqZWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgIH0KLQotICAvLyBQcm9ncmFtIGVsZW1lbnRzCi0gIHZvaWQgYWRkX3R5cGVkZWYgICh0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyAgfQotICB2b2lkIGFkZF9lbnVtICAgICAodF9lbnVtKiAgICB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgICAgIH0KLSAgdm9pZCBhZGRfY29uc3QgICAgKHRfY29uc3QqICAgdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyAgICB9Ci0gIHZvaWQgYWRkX3N0cnVjdCAgICh0X3N0cnVjdCogIHRzKSB7IG9iamVjdHNfLnB1c2hfYmFjayh0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7ICAgfQotICB2b2lkIGFkZF94Y2VwdGlvbiAodF9zdHJ1Y3QqICB0eCkgeyBvYmplY3RzXy5wdXNoX2JhY2sodHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7IH0KLSAgdm9pZCBhZGRfc2VydmljZSAgKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7ICB9Ci0KLSAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgpIHsKLSAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKLSAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKLSAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOwotICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKLSAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIG5hbWVzcGFjZV8gPSBuYW1lOwotICB9Ci0KLSAgLy8gU2NvcGUgYWNjZXNzb3IKLSAgdF9zY29wZSogc2NvcGUoKSB7Ci0gICAgcmV0dXJuIHNjb3BlXzsKLSAgfQotCi0gIC8vIEluY2x1ZGVzCi0KLSAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOwotCi0gICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKLSAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQotICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOwotICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICAgIH0KLQotICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0gICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVzXzsKLSAgfQotCi0gIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7Ci0gICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7Ci0KLSAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKLSAgICBpbnQgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKLSAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOwotICAgIH0KLSAgfQotCi0gIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgewotICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgbXlfY29weSA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7Ci0gICAgaXQ9bXlfY29weS5maW5kKGxhbmd1YWdlKTsKLQotICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7Ci0gICAgICBpZiAobGFuZ3VhZ2UgIT0gInNtYWxsdGFsay5wcmVmaXgiICYmIGxhbmd1YWdlICE9ICJzbWFsbHRhbGsucGFja2FnZSIpIHsKLSAgICAgICAgdGhyb3cgIk5vIGdlbmVyYXRvciBuYW1lZCAnIiArIGxhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbmFtZXNwYWNlc18uZmluZChsYW5ndWFnZSk7Ci0gICAgaWYgKGl0ZXIgPT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gaXRlci0+c2Vjb25kOwotICB9Ci0KLSAgLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0KLSAgdm9pZCBhZGRfY3BwX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgewotICAgIHJldHVybiBjcHBfaW5jbHVkZXNfOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8vIEZpbGUgcGF0aAotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICAvLyBOYW1lCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOwotCi0gIC8vIE5hbWVzcGFjZQotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfOwotCi0gIC8vIEluY2x1ZGVkIHByb2dyYW1zCi0gIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzXzsKLQotICAvLyBJbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtLCBpZiBhbnkKLSAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXhfOwotCi0gIC8vIElkZW50aWZpZXIgbG9va3VwIHNjb3BlCi0gIHRfc2NvcGUqIHNjb3BlXzsKLQotICAvLyBDb21wb25lbnRzIHRvIGdlbmVyYXRlIGNvZGUgZm9yCi0gIHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzXzsKLSAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gICAgZW51bXNfOwotICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gICBjb25zdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICBvYmplY3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgc3RydWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIHhjZXB0aW9uc187Ci0gIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLQotICAvLyBEeW5hbWljIG5hbWVzcGFjZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VzXzsKLQotICAvLyBDKysgZXh0cmEgaW5jbHVkZXMKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNwcF9pbmNsdWRlc187Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2NvcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzMxMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2NvcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TQ09QRV9ICi0jZGVmaW5lIFRfU0NPUEVfSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAidF9jb25zdC5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9saXN0LmgiCi0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGEgdmFyaWFibGUgc2NvcGUgdXNlZCBmb3IgbG9va2luZyB1cCBwcmVkZWZpbmVkIHR5cGVzIGFuZAotICogc2VydmljZXMuIFR5cGljYWxseSwgYSBzY29wZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB0X3Byb2dyYW0uIFNjb3BlcyBhcmUgbm90Ci0gKiB1c2VkIHRvIGRldGVybWluZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByYXRoZXIgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyBhdAotICogcGFyc2UgdGltZS4KLSAqCi0gKi8KLWNsYXNzIHRfc2NvcGUgewotIHB1YmxpYzoKLSAgdF9zY29wZSgpIHt9Ci0KLSAgdm9pZCBhZGRfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUpIHsKLSAgICB0eXBlc19bbmFtZV0gPSB0eXBlOwotICB9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIHR5cGVzX1tuYW1lXTsKLSAgfQotCi0gIHZvaWQgYWRkX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSwgdF9zZXJ2aWNlKiBzZXJ2aWNlKSB7Ci0gICAgc2VydmljZXNfW25hbWVdID0gc2VydmljZTsKLSAgfQotCi0gIHRfc2VydmljZSogZ2V0X3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBzZXJ2aWNlc19bbmFtZV07Ci0gIH0KLQotICB2b2lkIGFkZF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0KiBjb25zdGFudCkgewotICAgIGlmIChjb25zdGFudHNfLmZpbmQobmFtZSkgIT0gY29uc3RhbnRzXy5lbmQoKSkgewotICAgICAgdGhyb3cgIkVudW0gIiArIG5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCEiOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdGFudHNfW25hbWVdID0gY29uc3RhbnQ7Ci0gICAgfQotCQkgICAKLSAgfQotCi0gIHRfY29uc3QqIGdldF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50c19bbmFtZV07Ci0gIH0KLQotICB2b2lkIHByaW50KCkgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSB0eXBlc18uYmVnaW4oKTsgaXRlciAhPSB0eXBlc18uZW5kKCk7ICsraXRlcikgewotICAgICAgcHJpbnRmKCIlcyA9PiAlc1xuIiwKLSAgICAgICAgICAgICBpdGVyLT5maXJzdC5jX3N0cigpLAotICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlc29sdmVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogY29uc3RfdmFsLCB0X3R5cGUqIHR0eXBlKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7Ci0gICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+Zmlyc3QsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHRfc3RydWN0KiB0c3RydWN0ID0gKHRfc3RydWN0Kil0dHlwZTsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgdF9maWVsZCogZmllbGQgPSB0c3RydWN0LT5nZXRfZmllbGRfYnlfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICAgIHRocm93ICJObyBmaWVsZCBuYW1lZCBcIiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgKyAiXCIgd2FzIGZvdW5kIGluIHN0cnVjdCBvZiB0eXBlIFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIiOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbnN0X3ZhbC0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCh0X2VudW0qKXR0eXBlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfY29uc3QqIGNvbnN0YW50ID0gZ2V0X2NvbnN0YW50KGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSk7Ci0gICAgICAgIGlmIChjb25zdGFudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgdGhyb3cgIk5vIGVudW0gdmFsdWUgb3IgY29uc3RhbnQgZm91bmQgbmFtZWQgXCIiICsgY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpICsgIlwiISI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uc3RhbnQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdGFudC0+Z2V0X3R5cGUoKSktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RhbnQtPmdldF90eXBlKCktPmlzX21hcCgpKSB7Ci0gICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbWFwKCk7Ci0gICAgICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgICAgY29uc3RfdmFsLT5zZXRfbWFwKCk7Ci0gICAgICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX21hcCh2X2l0ZXItPmZpcnN0LCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnN0YW50LT5nZXRfdHlwZSgpLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQotICAgICAgLy8gdmFsdWUncyBuYW1lLgotICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOwotICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOwotICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICB9Ci0gICAgICBjb25zdF92YWwtPnNldF9pZGVudGlmaWVyKGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOwotICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOwotCi0gIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOwotCi0gIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXJ2aWNlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWU2OTI0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TRVJWSUNFX0gKLSNkZWZpbmUgVF9TRVJWSUNFX0gKLQotI2luY2x1ZGUgInRfZnVuY3Rpb24uaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBBIHNlcnZpY2UgY29uc2lzdHMgb2YgYSBzZXQgb2YgZnVuY3Rpb25zLgotICoKLSAqLwotY2xhc3MgdF9zZXJ2aWNlIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0X3NlcnZpY2UodF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgdF90eXBlKHByb2dyYW0pLAotICAgIGV4dGVuZHNfKE5VTEwpIHt9Ci0KLSAgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBzZXRfZXh0ZW5kcyh0X3NlcnZpY2UqIGV4dGVuZHMpIHsKLSAgICBleHRlbmRzXyA9IGV4dGVuZHM7Ci0gIH0KLQotICB2b2lkIGFkZF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBmdW5jKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IGZ1bmN0aW9uc18uYmVnaW4oKTsgaXRlciAhPSBmdW5jdGlvbnNfLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgIGlmIChmdW5jLT5nZXRfbmFtZSgpID09ICgqaXRlciktPmdldF9uYW1lKCkpIHsKLSAgICAgICAgdGhyb3cgIkZ1bmN0aW9uICIgKyBmdW5jLT5nZXRfbmFtZSgpICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiOwotICAgICAgfQotICAgIH0KLSAgICBmdW5jdGlvbnNfLnB1c2hfYmFjayhmdW5jKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgZ2V0X2Z1bmN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gZnVuY3Rpb25zXzsKLSAgfQotCi0gIHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSB7Ci0gICAgcmV0dXJuIGV4dGVuZHNfOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgLy8gU2VydmljZXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gZmluZ2VycHJpbnRzLgotICAgIHRocm93ICJCVUc6IENhbid0IGdldCBmaW5nZXJwcmludCBtYXRlcmlhbCBmb3Igc2VydmljZS4iOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zXzsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk4MzU3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFVF9ICi0jZGVmaW5lIFRfU0VUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBzZXQgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X3NldCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X3NldCh0X3R5cGUqIGVsZW1fdHlwZSkgOgotICAgIGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZWxlbV90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfc2V0KCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJzZXQ8IiArIGVsZW1fdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBlbGVtX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlZTExMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU1RSVUNUX0gKLSNkZWZpbmUgVF9TVFJVQ1RfSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfZmllbGQuaCIKLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKLSAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzX3R5cGU7Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgdF90eXBlKHByb2dyYW0pLAotICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCi0gICAgeHNkX2FsbF8oZmFsc2UpIHt9Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgotICAgIHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2b2lkIHNldF94Y2VwdGlvbihib29sIGlzX3hjZXB0aW9uKSB7Ci0gICAgaXNfeGNlcHRpb25fID0gaXNfeGNlcHRpb247Ci0gIH0KLQotICB2b2lkIHNldF91bmlvbihib29sIGlzX3VuaW9uKSB7Ci0gICAgaXNfdW5pb25fID0gaXNfdW5pb247Ci0gIH0KLQotICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgewotICAgIHhzZF9hbGxfID0geHNkX2FsbDsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhzZF9hbGxfOwotICB9Ci0KLSAgYm9vbCBhcHBlbmQodF9maWVsZCogZWxlbSkgewotICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKLQotICAgIHR5cGVkZWYgbWVtYmVyc190eXBlOjppdGVyYXRvciBpdGVyX3R5cGU7Ci0gICAgc3RkOjpwYWlyPGl0ZXJfdHlwZSwgaXRlcl90eXBlPiBib3VuZHMgPSBzdGQ6OmVxdWFsX3JhbmdlKAotICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksIGVsZW0sIHRfZmllbGQ6OmtleV9jb21wYXJlKCkKLSAgICAgICAgKTsKLSAgICBpZiAoYm91bmRzLmZpcnN0ICE9IGJvdW5kcy5zZWNvbmQpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uaW5zZXJ0KGJvdW5kcy5zZWNvbmQsIGVsZW0pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIHsKLSAgICByZXR1cm4gbWVtYmVyc187Ci0gIH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIHsKLSAgICByZXR1cm4gbWVtYmVyc19pbl9pZF9vcmRlcl87Ci0gIH0KLQotICBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gIWlzX3hjZXB0aW9uXzsKLSAgfQotCi0gIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzX3hjZXB0aW9uXzsKLSAgfQotICAKLSAgYm9vbCBpc191bmlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfdW5pb25fOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSAieyI7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBydiArPSAoKm1faXRlciktPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICAgICAgcnYgKz0gIjsiOwotICAgIH0KLSAgICBydiArPSAifSI7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB9Ci0gIH0KLQotICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKLSAgICAgICAgcmV0dXJuICptX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKLSAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICBib29sIGlzX3hjZXB0aW9uXzsKLSAgYm9vbCBpc191bmlvbl87Ci0KLSAgYm9vbCB4c2RfYWxsXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTJlZGEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9UWVBFX0gKLSNkZWZpbmUgVF9UWVBFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vLyBXaGF0J3Mgd29yc2U/ICBUaGlzLCBvciBtYWtpbmcgYSBzcmMvcGFyc2Uvbm9uX2lubGluZWQuY2M/Ci0jaW5jbHVkZSAibWQ1LmgiCi0KLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCi0gKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCi0gKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKLSAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCi0gKiB2YXJpb3VzIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfnRfdHlwZSgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jvb2woKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2xpc3QoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zZXQoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsKLSAgICByZXR1cm4gcHJvZ3JhbV87Ci0gIH0KLQotCi0gIC8vIFJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlCi0gIC8vIGZyb20gYW55IG90aGVyIHRocmlmdCB0eXBlIGluIHRoZSB3b3JsZCwgYXMgZmFyIGFzCi0gIC8vIFREZW5zZVByb3RvY29sIGlzIGNvbmNlcm5lZC4KLSAgLy8gV2UgZG9uJ3QgY2FjaGUgdGhpcywgd2hpY2ggaXMgYSBsaXR0bGUgc2xvcHB5LAotICAvLyBidXQgdGhlIGNvbXBpbGVyIGlzIHNvIGZhc3QgdGhhdCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgPSAwOwotCi0gIC8vIEZpbmdlcnByaW50IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIgKGFuZCBvbmx5IHdoZW4pCi0gIC8vIHRoZSBlbmNvZGluZyB2aWEgVERlbnNlUHJvdG9jb2wgY2hhbmdlcy4KLSAgc3RhdGljIGNvbnN0IGludCBmaW5nZXJwcmludF9sZW4gPSAxNjsKLQotICAvLyBDYWxsIHRoaXMgYmVmb3JlIHRyeWluZyBnZXRfKl9maW5nZXJwcmludCgpLgotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgbWF0ZXJpYWwgPSBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgICBtZDVfc3RhdGVfdCBjdHg7Ci0gICAgbWQ1X2luaXQoJmN0eCk7Ci0gICAgbWQ1X2FwcGVuZCgmY3R4LCAobWQ1X2J5dGVfdCopKG1hdGVyaWFsLmRhdGEoKSksIChpbnQpbWF0ZXJpYWwuc2l6ZSgpKTsKLSAgICBtZDVfZmluaXNoKCZjdHgsIChtZDVfYnl0ZV90KilmaW5nZXJwcmludF8pOwotICB9Ci0KLSAgYm9vbCBoYXNfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgaWYgKGZpbmdlcnByaW50X1tpXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCkgY29uc3QgewotICAgIHJldHVybiBmaW5nZXJwcmludF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfYXNjaWlfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnY7Ci0gICAgY29uc3QgdWludDhfdCogZnAgPSBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgcnYgKz0gYnl0ZV90b19oZXgoZnBbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCi0gIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgewotICAgIGlmIChudW0gPCAxMCkgewotICAgICAgcmV0dXJuICcwJyArIG51bTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7Ci0gICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRfdHlwZSgpIDoKLSAgICBwcm9ncmFtXyhOVUxMKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHByb2dyYW1fKHByb2dyYW0pCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8oTlVMTCksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIHVpbnQ4X3QgZmluZ2VycHJpbnRfW2ZpbmdlcnByaW50X2xlbl07Ci19OwotCi0KLS8qKgotICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgotICogZHVyaW5nIHBhcnNpbmcuCi0gKi8KLXN0cnVjdCB0X2Fubm90YXRpb24gewotICBzdGQ6OnN0cmluZyBrZXk7Ci0gIHN0ZDo6c3RyaW5nIHZhbDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzdkOTcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1RZUEVERUZfSAotI2RlZmluZSBUX1RZUEVERUZfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQotICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQotICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCi0gKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KLSAqCi0gKi8KLWNsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBzeW1ib2xpYykgOgotICAgIHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCi0gICAgdHlwZV8odHlwZSksCi0gICAgc3ltYm9saWNfKHN5bWJvbGljKSB7fQotCi0gIH50X3R5cGVkZWYoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3ltYm9saWNfOwotICB9Ci0KLSAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgaWYgKCF0eXBlXy0+aGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICAgIHR5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTdmNjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVwotICovCi0KLSNpZmRlZiBNSU5HVwotI2luY2x1ZGUgPGlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgTUlOR1cKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCkKLSNlbHNlCi0jZGVmaW5lIE1LRElSKHgpIG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM5ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKQEAgLTAsMCArMSw0NjQgQEAKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfY3VycGF0aDsKK2V4dGVybiBib29sIGdfcmV0dXJuX2ZhaWx1cmU7CisKK3ZvaWQgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgICByZXR1cm47CisgICB9CisgICB2YV9saXN0IGFyZ3M7CisgICBwcmludGYoIltUaHJpZnQgQXVkaXQgV2FybmluZzolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgIHZhX2VuZChhcmdzKTsKKyAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCB0aHJpZnRfYXVkaXRfZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW1RocmlmdCBBdWRpdCBGYWlsdXJlOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGdfcmV0dXJuX2ZhaWx1cmUgPSB0cnVlOworfQorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKQoreworICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbmV3TmFtZXNwYWNlTWFwID0gbmV3UHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvbGROYW1lc3BhY2VNYXAgPSBvbGRQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKworICAgZm9yKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG9sZE5hbWVzcGFjZU1hcEl0ID0gb2xkTmFtZXNwYWNlTWFwLmJlZ2luKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCAhPSBvbGROYW1lc3BhY2VNYXAuZW5kKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmV3TmFtZXNwYWNlTWFwSXQgPSBuZXdOYW1lc3BhY2VNYXAuZmluZChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpOworICAgICAgaWYobmV3TmFtZXNwYWNlTWFwSXQgPT0gbmV3TmFtZXNwYWNlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkxhbmd1YWdlICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZigobmV3TmFtZXNwYWNlTWFwSXQtPnNlY29uZCkgIT0gb2xkTmFtZXNwYWNlTWFwSXQtPnNlY29uZCkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lc3BhY2UgJXMgY2hhbmdlZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1fdmFsdWVzKHRfZW51bSogbmV3RW51bSx0X2VudW0qIG9sZEVudW0pCit7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgb2xkRW51bVZhbHVlcyA9IG9sZEVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bVZhbHVlc0l0ID0gb2xkRW51bVZhbHVlcy5iZWdpbigpOworICAgICAgICAgb2xkRW51bVZhbHVlc0l0ICE9IG9sZEVudW1WYWx1ZXMuZW5kKCk7CisgICAgICAgICBvbGRFbnVtVmFsdWVzSXQrKykKKyAgIHsKKyAgICAgIGludCBlbnVtVmFsdWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF92YWx1ZSgpOworICAgICAgdF9lbnVtX3ZhbHVlKiBuZXdFbnVtVmFsdWUgPSBuZXdFbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoZW51bVZhbHVlKTsKKyAgICAgIGlmKG5ld0VudW1WYWx1ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgc3RkOjpzdHJpbmcgZW51bU5hbWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF9uYW1lKCk7CisgICAgICAgICBpZihlbnVtTmFtZSAhPSBuZXdFbnVtVmFsdWUtPmdldF9uYW1lKCkpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZSBvZiB0aGUgdmFsdWUgJWQgY2hhbmdlZCBpbiBlbnVtICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiRW51bSB2YWx1ZSAlZCBtaXNzaW5nIGluICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj4gbmV3RW51bU1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBuZXdFbnVtSXQ7CisgICBmb3IobmV3RW51bUl0ID0gbmV3RW51bUxpc3QuYmVnaW4oKTsgbmV3RW51bUl0ICE9IG5ld0VudW1MaXN0LmVuZCgpOyBuZXdFbnVtSXQrKykKKyAgIHsKKyAgICAgIG5ld0VudW1NYXBbKCpuZXdFbnVtSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdFbnVtSXQ7CisgICB9CisgICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bUl0OworICAgZm9yKG9sZEVudW1JdCA9IG9sZEVudW1MaXN0LmJlZ2luKCk7IG9sZEVudW1JdCAhPSBvbGRFbnVtTGlzdC5lbmQoKTsgb2xkRW51bUl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPjo6aXRlcmF0b3IgbmV3RW51bU1hcEl0OworICAgICAgbmV3RW51bU1hcEl0ID0gbmV3RW51bU1hcC5maW5kKCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKG5ld0VudW1NYXBJdCA9PSBuZXdFbnVtTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkVudW0gJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwoKm9sZEVudW1JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX2VudW1fdmFsdWVzKG5ld0VudW1NYXBJdC0+c2Vjb25kLCAqb2xkRW51bUl0KTsKKyAgICAgIH0KKyAgIH0KK30KKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSB0d28gYXJndWVtZW50cyBhcmUgb2Ygc2FtZSB0eXBlcy4KKy8vUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgdHlwZQorYm9vbCBjb21wYXJlX3R5cGUodF90eXBlKiBuZXdUeXBlLCB0X3R5cGUqIG9sZFR5cGUpCit7CisgICAvL0NvbXBhcmluZyBuYW1lcyBvZiB0d28gdHlwZXMgd2lsbCB3b3JrIHdoZW4gdGhlIG5ld1R5cGUgYW5kIG9sZFR5cGUgYXJlIGJhc2ljIHR5cGVzIG9yIHN0cnVjdHMgb3IgZW51bXMuCisgICAvL0hvd2V2ZXIsIHdoZW4gdGhleSBhcmUgY29udGFpbmVycywgZ2V0X25hbWUoKSByZXR1cm5zIGVtcHR5IGZvciB3aGljaCB3ZSBoYXZlIHRvIGNvbXBhcmUgdGhlIHR5cGUgb2YKKyAgIC8vdGhlaXIgZWxlbWVudHMgYXMgd2VsbC4KKyAgIGlmKChuZXdUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpICYmIChvbGRUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpKQorICAgeworCisgICAgICBpZihuZXdUeXBlLT5pc19saXN0KCkgJiYgb2xkVHlwZS0+aXNfbGlzdCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9saXN0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9saXN0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19tYXAoKSAmJiBvbGRUeXBlLT5pc19tYXAoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3S2V5VHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkS2V5VHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICAgdF90eXBlKiBuZXdWYWxUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRWYWxUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICAgICByZXR1cm4gKGNvbXBhcmVfdHlwZShuZXdLZXlUeXBlLCBvbGRLZXlUeXBlKSAmJiBjb21wYXJlX3R5cGUobmV3VmFsVHlwZSwgb2xkVmFsVHlwZSkpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19zZXQoKSAmJiBvbGRUeXBlLT5pc19zZXQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfc2V0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9zZXQqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmKG5ld1R5cGUtPmdldF9uYW1lKCkgPT0gb2xkVHlwZS0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sIGNvbXBhcmVfcGFpcihzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXBQYWlyLCBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXBQYWlyKQoreworICAgcmV0dXJuIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5maXJzdCwgb2xkTWFwUGFpci5maXJzdCkgJiYgY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLnNlY29uZCwgb2xkTWFwUGFpci5zZWNvbmQpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgc2FtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCitib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCkKK3sKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiB0cnVlOworICAgZWxzZSBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCAhPSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICBlbHNlIGlmIChuZXdTdHJ1Y3REZWZhdWx0ICE9IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkgIT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgc3dpdGNoKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCisgICB7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG9sZERlZmF1bHRMaXN0ID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbmV3RGVmYXVsdExpc3QgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGREZWZhdWx0TGlzdC5zaXplKCkgPT0gbmV3RGVmYXVsdExpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3RGVmYXVsdExpc3QuYmVnaW4oKSwgbmV3RGVmYXVsdExpc3QuZW5kKCksIG9sZERlZmF1bHRMaXN0LmJlZ2luKCksIGNvbXBhcmVfZGVmYXVsdHMpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworCisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld01hcC5iZWdpbigpLCBuZXdNYXAuZW5kKCksIG9sZE1hcC5iZWdpbigpLCBjb21wYXJlX3BhaXIpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc3RydWN0X2ZpZWxkKHRfZmllbGQqIG5ld0ZpZWxkLCB0X2ZpZWxkKiBvbGRGaWVsZCwgc3RkOjpzdHJpbmcgb2xkU3RydWN0TmFtZSkKK3sKKyAgIHRfdHlwZSogbmV3RmllbGRUeXBlID0gbmV3RmllbGQtPmdldF90eXBlKCk7CisgICB0X3R5cGUqIG9sZEZpZWxkVHlwZSA9IG9sZEZpZWxkLT5nZXRfdHlwZSgpOworICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGaWVsZFR5cGUsIG9sZEZpZWxkVHlwZSkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFR5cGUgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKKyAgIC8vIEEgU3RydWN0IG1lbWJlciBjYW4gYmUgb3B0aW9uYWwgaWYgaXQgaXMgbWVudGlvbmVkIGV4cGxpY2l0bHksIG9yIGlmIGl0IGlzIGFzc2lnbmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICBib29sIG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgPSAobmV3RmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgIGJvb2wgb2xkU3RydWN0RmllbGRPcHRpb25hbCA9IChvbGRGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworCisgICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsICE9IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFJlcXVpcmVkbmVzcyBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgfHwgb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIGlmKCFjb21wYXJlX2RlZmF1bHRzKG5ld0ZpZWxkLT5nZXRfdmFsdWUoKSwgb2xkRmllbGQtPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJEZWZhdWx0IHZhbHVlIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgfQorCisgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBuZXdGaWVsZC0+Z2V0X25hbWUoKTsKKyAgIGlmKGZpZWxkTmFtZSAhPSBvbGRGaWVsZC0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfc3RydWN0KHRfc3RydWN0KiBuZXdTdHJ1Y3QsIHRfc3RydWN0KiBvbGRTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRTdHJ1Y3ROYW1lID0gc3RkOjpzdHJpbmcoKSkKK3sKKyAgIHN0ZDo6c3RyaW5nIHN0cnVjdE5hbWUgPSBvbGRTdHJ1Y3ROYW1lLmVtcHR5KCkgPyBvbGRTdHJ1Y3QtPmdldF9uYW1lKCkgOiBvbGRTdHJ1Y3ROYW1lOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gb2xkU3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG5ld1N0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdE1lbWJlckl0ID0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RNZW1iZXJJdCA9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKKworICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgc3RydWN0IG1lbWJlcnMgaW4gdGhlaXIgSUQgb3JkZXIsIGNvbXBhcmluZyB0aGVpciBJRHMgY2FuIGJlIGRvbmUgYnkgdHJhdmVyc2luZyB0aGUgdHdvIG1lbWJlcgorICAgLy8gbGlzdHMgdG9nZXRoZXIuCisgICB3aGlsZSghKG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgbmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkpCisgICB7CisgICAgICBpZihuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ICE9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCisgICAgICB7CisgICAgICAgICAvLyBBIGZpZWxkIElEIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1N0cnVjdE1lbWJlckl0ICE9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vTmV3IGZpZWxkIElEIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbmQuCisgICAgICAgICBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmVxdWlyZWQgU3RydWN0IEZpZWxkIEFkZGVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPT0gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vRmllbGQgSUQgZm91bmQgaW4gYm90aCBzdHJ1Y3RzLiBDb21wYXJlIGZpZWxkIHR5cGVzLCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIGNvbXBhcmVfc3RydWN0X2ZpZWxkKCpuZXdTdHJ1Y3RNZW1iZXJJdCwgKm9sZFN0cnVjdE1lbWJlckl0LCBzdHJ1Y3ROYW1lKTsKKworICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgRmllbGQgSWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbgorICAgICAgICAgLy9BZGRpbmcgZmllbGRzIHRvIHN0cnVjdCBpcyBmaW5lLCBidXQgYWRkaW5nIHRoZW0gaW4gdGhlIG1pZGRsZSBpcyBzdXNwaWNpb3VzLiBFcnJvciEhCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IGZpZWxkIGlzIGFkZGVkIGluIHRoZSBtaWRkbGUgd2l0aCBJZCA9ICVkIGluICVzXG4iLCAgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID4gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vQSBmaWVsZCBpcyBkZWxldGVkIGluIG5ld1N0cnVjdC4KKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9zdHJ1Y3QqPiBuZXdTdHJ1Y3RNYXA7CisgICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RMaXN0SXQ7CisgICBmb3IobmV3U3RydWN0TGlzdEl0ID0gbmV3U3RydWN0TGlzdC5iZWdpbigpOyBuZXdTdHJ1Y3RMaXN0SXQgIT0gbmV3U3RydWN0TGlzdC5lbmQoKTsgbmV3U3RydWN0TGlzdEl0KyspCisgICB7CisgICAgICBuZXdTdHJ1Y3RNYXBbKCpuZXdTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTdHJ1Y3RMaXN0SXQ7CisgICB9CisKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdExpc3RJdDsKKyAgIGZvcihvbGRTdHJ1Y3RMaXN0SXQgPSBvbGRTdHJ1Y3RMaXN0LmJlZ2luKCk7IG9sZFN0cnVjdExpc3RJdCAhPSBvbGRTdHJ1Y3RMaXN0LmVuZCgpOyBvbGRTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBuZXdTdHJ1Y3RNYXBJdDsKKyAgICAgIG5ld1N0cnVjdE1hcEl0ID0gbmV3U3RydWN0TWFwLmZpbmQoKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld1N0cnVjdE1hcEl0ID09IG5ld1N0cnVjdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld1N0cnVjdE1hcEl0LT5zZWNvbmQsICpvbGRTdHJ1Y3RMaXN0SXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24odF9mdW5jdGlvbiogbmV3RnVuY3Rpb24sIHRfZnVuY3Rpb24qIG9sZEZ1bmN0aW9uKQoreworICAgdF90eXBlKiBuZXdGdW5jdGlvblJldHVyblR5cGUgPSBuZXdGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKworICAgaWYobmV3RnVuY3Rpb24tPmlzX29uZXdheSgpICE9IG9sZEZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJPbmV3YXkgYXR0cmlidXRlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGdW5jdGlvblJldHVyblR5cGUsIG9sZEZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXR1cm4gdHlwZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgIH0KKworICAgLy9Db21wYXJlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgb2xkRnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uTmFtZSA9IG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgZXhjZXB0aW9uTmFtZSArPSAiX2V4Y2VwdGlvbiI7CisgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgb2xkRnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgZXhjZXB0aW9uTmFtZSk7Cit9CisKK3ZvaWQgY29tcGFyZV9mdW5jdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBuZXdGdW5jdGlvbkxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgb2xkRnVuY3Rpb25MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPiBuZXdGdW5jdGlvbk1hcDsKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIG5ld0Z1bmN0aW9uTWFwSXQ7CisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBuZXdGdW5jdGlvbkl0ID0gbmV3RnVuY3Rpb25MaXN0LmJlZ2luKCk7CisgICAgICAgICBuZXdGdW5jdGlvbkl0ICE9IG5ld0Z1bmN0aW9uTGlzdC5lbmQoKTsKKyAgICAgICAgIG5ld0Z1bmN0aW9uSXQrKykKKyAgIHsKKyAgICAgIG5ld0Z1bmN0aW9uTWFwWygqbmV3RnVuY3Rpb25JdCktPmdldF9uYW1lKCldID0gKm5ld0Z1bmN0aW9uSXQ7CisgICB9CisKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEZ1bmN0aW9uSXQgPSBvbGRGdW5jdGlvbkxpc3QuYmVnaW4oKTsKKyAgICAgICAgIG9sZEZ1bmN0aW9uSXQgIT0gb2xkRnVuY3Rpb25MaXN0LmVuZCgpOworICAgICAgICAgb2xkRnVuY3Rpb25JdCsrKQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBJdCA9IG5ld0Z1bmN0aW9uTWFwLmZpbmQoKCpvbGRGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdGdW5jdGlvbk1hcEl0ID09IG5ld0Z1bmN0aW9uTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiAlc1xuIiwoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL0Z1bmN0aW9uIGlzIGZvdW5kIGluIGJvdGggdGhyaWZ0IGZpbGVzLiBDb21wYXJlIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCBsaXN0CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbihuZXdGdW5jdGlvbk1hcEl0LT5zZWNvbmQsICpvbGRGdW5jdGlvbkl0KTsKKyAgICAgIH0KKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpCit7CisgICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU2VydmljZUl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gbmV3U2VydmljZU1hcDsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U2VydmljZUl0ID0gbmV3U2VydmljZXMuYmVnaW4oKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCAhPSBuZXdTZXJ2aWNlcy5lbmQoKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCsrKQorICAgeworICAgICAgbmV3U2VydmljZU1hcFsoKm5ld1NlcnZpY2VJdCktPmdldF9uYW1lKCldID0gKm5ld1NlcnZpY2VJdDsKKyAgIH0KKworCisgICBmb3Iob2xkU2VydmljZUl0ID0gb2xkU2VydmljZXMuYmVnaW4oKTsgb2xkU2VydmljZUl0ICE9IG9sZFNlcnZpY2VzLmVuZCgpOyBvbGRTZXJ2aWNlSXQrKykKKyAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfbmFtZSgpOworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+OjppdGVyYXRvciBuZXdTZXJ2aWNlTWFwSXQgPSBuZXdTZXJ2aWNlTWFwLmZpbmQob2xkU2VydmljZU5hbWUpOworCisgICAgICBpZihuZXdTZXJ2aWNlTWFwSXQgPT0gbmV3U2VydmljZU1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJOZXcgVGhyaWZ0IGZpbGUgaXMgbWlzc2luZyBhIHNlcnZpY2UgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdF9zZXJ2aWNlKiBvbGRTZXJ2aWNlRXh0ZW5kcyA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X2V4dGVuZHMoKTsKKyAgICAgICAgIHRfc2VydmljZSogbmV3U2VydmljZUV4dGVuZHMgPSAobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZXh0ZW5kcygpOworCisgICAgICAgICBpZihvbGRTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gSXQgaXMgZmluZSB0byBhZGQgZXh0ZW5kcy4gU28gaWYgc2VydmljZSBpbiBvbGRlciB0aHJpZnQgZGlkIG5vdCBoYXZlIGFueSBleHRlbmRzLCB3ZSBhcmUgZmluZS4KKyAgICAgICAgICAgIC8vIERPIE5vdGhpbmcKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYob2xkU2VydmljZUV4dGVuZHMgIT0gTlVMTCAmJiBuZXdTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRFeHRlbmRzTmFtZSA9IG9sZFNlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RXh0ZW5kc05hbWUgPSBuZXdTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKKworICAgICAgICAgICAgaWYoIG5ld0V4dGVuZHNOYW1lICE9IG9sZEV4dGVuZHNOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbXBhcmVfZnVuY3Rpb25zKChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9mdW5jdGlvbnMoKSwgKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZnVuY3Rpb25zKCkpOworICAgICAgfQorCisgICB9CisKK30KKwordm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KQoreworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdEl0OworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBvbGRDb25zdEl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IG5ld0NvbnN0TWFwOworCisgICBmb3IobmV3Q29uc3RJdCA9IG5ld0NvbnN0LmJlZ2luKCk7IG5ld0NvbnN0SXQgIT0gbmV3Q29uc3QuZW5kKCk7IG5ld0NvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwWygqbmV3Q29uc3RJdCktPmdldF9uYW1lKCldID0gKm5ld0NvbnN0SXQ7CisgICB9CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0TWFwSXQ7CisgICBmb3Iob2xkQ29uc3RJdCA9IG9sZENvbnN0LmJlZ2luKCk7IG9sZENvbnN0SXQgIT0gb2xkQ29uc3QuZW5kKCk7IG9sZENvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwSXQgPSBuZXdDb25zdE1hcC5maW5kKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3Q29uc3RNYXBJdCA9PSBuZXdDb25zdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudHMgTWlzc2luZyAlcyBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNvbXBhcmVfdHlwZSgobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3R5cGUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3R5cGUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaXMgb2YgZGlmZmVyZW50IHR5cGUgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjb21wYXJlX2RlZmF1bHRzKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdmFsdWUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3ZhbHVlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGhhcyBkaWZmZXJlbnQgdmFsdWVcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTc5ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgVF9BVURJVF9ICisjZGVmaW5lIFRfQVVESVRfSAorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKTsKK3ZvaWQgY29tcGFyZV9lbnVtcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgbmV3RW51bUxpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KTsKK2Jvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KTsKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KTsKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG9sZFNlcnZpY2VzKTsKK3ZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmI5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorCit0X3R5cGUqIGdfdHlwZV92b2lkOwordF90eXBlKiBnX3R5cGVfc3RyaW5nOwordF90eXBlKiBnX3R5cGVfYmluYXJ5OwordF90eXBlKiBnX3R5cGVfc2xpc3Q7Cit0X3R5cGUqIGdfdHlwZV9ib29sOwordF90eXBlKiBnX3R5cGVfaTg7Cit0X3R5cGUqIGdfdHlwZV9pMTY7Cit0X3R5cGUqIGdfdHlwZV9pMzI7Cit0X3R5cGUqIGdfdHlwZV9pNjQ7Cit0X3R5cGUqIGdfdHlwZV9kb3VibGU7CisKK3ZvaWQgaW5pdEdsb2JhbHMoKSB7CisgIGdfdHlwZV92b2lkID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOworICBnX3R5cGVfc2xpc3QgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKKyAgZ190eXBlX2Jvb2wgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKKyAgZ190eXBlX2k4ID0gbmV3IHRfYmFzZV90eXBlKCJpOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgZ190eXBlX2kxNiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKKyAgZ190eXBlX2kzMiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgZ190eXBlX2k2NCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKK30KKwordm9pZCBjbGVhckdsb2JhbHMoKSB7CisgIGRlbGV0ZSBnX3R5cGVfdm9pZDsKKyAgZGVsZXRlIGdfdHlwZV9zdHJpbmc7CisgIGRlbGV0ZSBnX3R5cGVfYm9vbDsKKyAgZGVsZXRlIGdfdHlwZV9pODsKKyAgZGVsZXRlIGdfdHlwZV9pMTY7CisgIGRlbGV0ZSBnX3R5cGVfaTMyOworICBkZWxldGUgZ190eXBlX2k2NDsKKyAgZGVsZXRlIGdfdHlwZV9kb3VibGU7Cit9CisKKy8qKgorICogVGhvc2UgYXJlIG5vdCByZWFsbHkgbmVlZGVkIGZvciBwbHVnaW5zIGJ1dCBjYXVzZXMgbGluayBlcnJvcnMgd2l0aG91dAorICovCisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2ludCBnX2RvY3RleHRfbGluZW5vOworaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CitQUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ODg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTU1PTl9ICisjZGVmaW5lIFRfQ09NTU9OX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKKyAqLworCitleHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTg7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOworCit2b2lkIGluaXRHbG9iYWxzKCk7Cit2b2lkIGNsZWFyR2xvYmFscygpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcyNGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjU5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQVMzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9hczNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfYXMzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5kYWJsZV8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJiaW5kYWJsZSIpID09IDApIHsKKyAgICAgICAgYmluZGFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBhczM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIC8vIHJlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiaW5kYWJsZV87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM19wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIiAiOworICB9CisgIHJldHVybiAicGFja2FnZSAiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBBczMgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArICJpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5O1xuIgorICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBpbXBvcnRzOworICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gQXMzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKKyAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQorICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCkgPDwgZW5kbDsKKworICBzY29wZV91cChmX2VudW0pOworICAvLyBBZGQgYXMzIGltcG9ydHMKKyAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiCisgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCisgIGZfZW51bSA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTElEX1ZBTFVFUzpTZXQgPSBuZXcgU2V0KCI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTFVFU19UT19OQU1FUzpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiVkFMVUVTX1RPX05BTUVTWyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdID0gXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgcGFja2FnZQorCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX2NvbnN0cyk7CisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOworCisgIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIpOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKGJpbmRhYmxlXyAmJiAhaXNfZXhjZXB0aW9uKSB7CisgICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IG14LmV2ZW50cy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGJpbmRhYmxlID0gIWlzX2V4Y2VwdGlvbiAmJiAhaW5fY2xhc3MgJiYgYmluZGFibGVfOworCisgIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7CisgIH0gZWxzZSBpZiAoYmluZGFibGUpIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgU1RSVUNUX0RFU0M6VFN0cnVjdCA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWFzMywgcHJpdmF0ZSBmb3IgLWFzM2JlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDOlRGaWVsZCA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIjppbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKKyAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkOlRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGFzMyBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50LCB2YWx1ZToqKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEOmludCk6KiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgorICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmluZGFibGUpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIigpOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBzdGQ6OnN0cmluZyBwcm9wTmFtZSA9IHRtcCgidGhyaWZ0UHJvcGVydHlDaGFuZ2UiKTsKKyAgICBpZiAoYmluZGFibGUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbQmluZGFibGUoZXZlbnQ9XCIiIDw8IHByb3BOYW1lIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworCisgICAgaWYgKGJpbmRhYmxlKSB7CisgICAgICAvLyBXZSBoYXZlIHRvIHVzZSBhIGN1c3RvbSBldmVudCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCwgYmVjYXVzZSBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0LAorICAgICAgLy8gdGhlIHNldHRlciBvbmx5IGdldHMgY2FsbGVkIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCAtIHRoaXMgbWVhbnMgY2FsbGluZworICAgICAgLy8gZm9vLnNldEludFZhbHVlKDApCisgICAgICAvLyB3aWxsIG5vdCBjYXVzZSBmb28uaXNJbnRWYWx1ZVNldCgpIHRvIHJldHVybiB0cnVlIHNpbmNlIHRoZSB2YWx1ZSBvZiBmb28uX2ludFZhbHVlIHdhc24ndAorICAgICAgLy8gY2hhbmdlZAorICAgICAgLy8gc28gdGhlIHNldHRlciB3YXMgbmV2ZXIgY2FsbGVkLgorICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIEhvd2V2ZXIsIGlmIHlvdSBqdXN0IHVzZSBhIGN1c3RvbSBldmVudCwgdGhlbiBjb2xsZWN0aW9ucyB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCB3aGVuCisgICAgICAvLyBlbGVtZW50cworICAgICAgLy8gaW4gdGhlIGNvbGxlY3Rpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGV5IGxpc3RlZCBmb3IgUHJvcGVydHlDaGFuZ2VFdmVudHMuICBTbywgd2UKKyAgICAgIC8vIGRpc3BhdGNoIGJvdGguCisgICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50LlBST1BFUlRZX0NIQU5HRSkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTpCb29sZWFuIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgeworICAvLyBJZiBpdCdzIGJpbmRhYmxlLCBpdCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciBzbyB0b1N0cmluZyBpcyBhbiBvdmVycmlkZS4KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoYmluZGFibGUgPyAib3ZlcnJpZGUgIiA6ICIiKSA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZTpTdHJpbmcgPSAiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBtZXRhRGF0YU1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiXSA9IG5ldyBGaWVsZE1ldGFEYXRhKFwiIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2FzM190eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSW1wbC5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiCisgICAgICAgICAgICAgICAgICAgICA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IobmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIG92ZXJyaWRlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm46RnVuY3Rpb24gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIvLyBzb3JyeSB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGg6RXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIjppbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEFzMyB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPworICogQHJldHVybiBBczMgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiQXJyYXkiOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBBUzMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJCeXRlQXJyYXkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgdGhyb3cgImk2NCBpcyBub3QgeWV0IHN1cHBvcnRlZCBpbiBhczMiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIk51bWJlciI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoYXJndW1lbnRzICE9ICIiKSB7CisgICAgICBhcmd1bWVudHMgKz0gIiwgIjsKKyAgICB9CisgICAgYXJndW1lbnRzICs9ICJvbkVycm9yOkZ1bmN0aW9uLCBvblN1Y2Nlc3M6RnVuY3Rpb24iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKTp2b2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgYXMzLAorICAgICJBUzMiLAorICAgICIgICAgYmluZGFibGU6ICAgICAgICBBZGQgW2JpbmRhYmxlXSBtZXRhZGF0YSB0byBhbGwgdGhlIHN0cnVjdCBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNiYWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDU4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7CitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b19sb3dlcl9jYXNlKHN0cmluZyBuYW1lKTsKKworLyoqCisgKiBDIGNvZGUgZ2VuZXJhdG9yLCB1c2luZyBnbGliIGZvciBDIHR5cGluZy4KKyAqLworY2xhc3MgdF9jX2dsaWJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIC8qIGNvbnN0cnVjdG9yICovCisgIHRfY19nbGliX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5ICovCisgICAgdGhpcy0+b3V0X2Rpcl9iYXNlXyA9ICJnZW4tY19nbGliIjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY19nbGliOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLworICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKworICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgeworICAgICAgdGhpcy0+bnNwYWNlID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KKyAgICAgIGNoYXIqIHRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKKyAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKKyAgICAgICAgICB0bXBbaV0gPSAnXyc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKKyAgICAgIGZyZWUodG1wKTsKKworICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KKyAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgorICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcworICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKKyAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcworICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKKyAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKKyAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgorICAgICAgICovCisgICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKKyAgICB9CisgIH0KKworICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgLyogZmlsZSBzdHJlYW1zICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICAvKiBuYW1lc3BhY2UgdmFyaWFibGVzICovCisgIHN0cmluZyBuc3BhY2U7CisgIHN0cmluZyBuc3BhY2VfdTsKKyAgc3RyaW5nIG5zcGFjZV91YzsKKyAgc3RyaW5nIG5zcGFjZV9sYzsKKworICAvKiBoZWxwZXIgZnVuY3Rpb25zICovCisgIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpOworICBib29sIGlzX251bWVyaWModF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBjb25zdGFudF9saXRlcmFsKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyB4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7CisgIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKTsKKyAgdm9pZCBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lKTsKKworICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgc3RyaW5nIGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUqIGtleSwgdF90eXBlKiB2YWx1ZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKK307CisKKy8qKgorICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCisgKiBvdXRwdXQgc3RyZWFtcy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuaCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5jIjsKKyAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOworCisgIC8qIGFkZCB0aHJpZnQgYm9pbGVycGxhdGUgaGVhZGVycyAqLworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvKiBpbmNsdWRlIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIGJhc2UgdHlwZXMgKi8KKyAgZl90eXBlc18gPDwgIi8qIGJhc2UgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisKKyAgICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5jbHVkZV9uc3BhY2UgPSAoKml0ZXIpLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgIGluY2x1ZGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgaW5jbHVkZV9uc3BhY2VfcHJlZml4CisgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCppdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7CisgIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIG1hdGguaCAoZm9yICJJTkZJTklUWSIpIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLCBpbiBjYXNlIHdlCisgICAgIGVuY291bnRlciBhIHN0cnVjdCB3aXRoIGEgbWVtYmVyIG9mIHR5cGUgZG91YmxlICovCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgPG1hdGguaD4iIDw8IGVuZGw7CisKKyAgLy8gaW5jbHVkZSB0aGUgdHlwZXMgZmlsZQorICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX3UgPDwgIl90eXBlcy5oXCIiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXykpOworCisgIC8qIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7CisKKyAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHR5cGVkZWYgbWFwPGkzMixpMzI+IFNvbWVNYXAKKyAqCisgKiBDOgorICogdHlwZWRlZiBHSGFzaFRhYmxlICogVGhyaWZ0U29tZU1hcDsKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogZW51bSBNeUVudW0geworICogICBPTkUgPSAxLAorICogICBUV08KKyAqIH0KKyAqCisgKiBDOgorICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKKyAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKKyAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCisgKiB9OworICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8qIG91dHB1dCBlYWNoIG9mIHRoZSBlbnVtZXJhdGlvbiBlbGVtZW50cyAqLworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInRvU3RyaW5nXyIgPDwgbmFtZSA8PCAiKGludCB2YWx1ZSk7ICIgPDwgZW5kbCA8PCBlbmRsOworICA7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKSAiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgInsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3RhdGljIF9fdGhyZWFkIGNoYXIgYnVmWzE2XSA9IHswfTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3dpdGNoKHZhbHVlKSB7IiA8PCBlbmRsOworICBzdGQ6OnNldDxpbnQ+IGRvbmU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAvLyBTa2lwcGluZyBkdXBsaWNhdGUgdmFsdWUKKyAgICBpZiAoZG9uZS5maW5kKHZhbHVlKSA9PSBkb25lLmVuZCgpKSB7CisgICAgICBkb25lLmluc2VydCh2YWx1ZSk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIgIGNhc2UgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICI6IgorICAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIFwiIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgZGVmYXVsdDogZ19zbnByaW50ZihidWYsIDE2LCBcIiVkXCIsIHZhbHVlKTsgcmV0dXJuIGJ1ZjsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBUaHJpZnQgY29uc3RhbnRzIGluIEMgY29kZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lKTsKKyAgICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZSk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICAgIGZfdHlwZXNfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIgIgorICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKG5hbWVfbGMsIHR5cGUsIHZhbHVlKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZV9sYywgdHlwZSwgdmFsdWUsIHRydWUpOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIFRocmlmdCBzdHJ1Y3RzIGluIEMgY29kZSwgYXMgR09iamVjdHMuICBFeGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHN0cnVjdCBCb25rCisgKiB7CisgKiAgIDE6IHN0cmluZyBtZXNzYWdlLAorICogICAyOiBpMzIgdHlwZQorICogfQorICoKKyAqIEMgR09iamVjdCBpbnN0YW5jZSBoZWFkZXI6CisgKiBzdHJ1Y3QgX1RocmlmdEJvbmsKKyAqIHsKKyAqICAgR09iamVjdCBwYXJlbnQ7CisgKgorICogICBnY2hhciAqIG1lc3NhZ2U7CisgKiAgIGdpbnQzMiB0eXBlOworICogfTsKKyAqIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRCb25rIFRocmlmdEJvbmsKKyAqIC8vIC4uLiBhZGRpdGlvbmFsIEdPYmplY3QgYm9pbGVycGxhdGUgLi4uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl90eXBlc18gPDwgIi8qIHN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIEMgY29kZSB0byByZXByZXNlbnQgVGhyaWZ0IHNlcnZpY2VzLiAgQ3JlYXRlcyBhIG5ldyBHT2JqZWN0CisgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c2VydmljZS0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzdmNuYW1lX3VjID0gdGhpcy0+bnNwYWNlX3VjICsgdG9fdXBwZXJfY2FzZShzdmNuYW1lX3UpOworICBzdHJpbmcgZmlsZW5hbWUgPSB0aGlzLT5uc3BhY2VfbGMgKyB0b19sb3dlcl9jYXNlKHN2Y25hbWVfdSk7CisKKyAgLy8gbWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworCisgIC8vIGFkZCBoZWFkZXIgZmlsZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gYWRkIGFuIGluY2x1c2lvbiBndWFyZAorICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcworICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfbGMgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisKKyAgLy8gaWYgd2UgYXJlIGluaGVyaXRpbmcgZnJvbSBhbm90aGVyIHNlcnZpY2UsIGluY2x1ZGUgaXRzIGhlYWRlcgorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICAgPDwgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpKSkgPDwgIi5oXCIiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuYyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBhZGQgdGhlIGJvaWxlcnBsYWNlIGhlYWRlcgorICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIGluY2x1ZGUgdGhlIGhlYWRlcnMKKyAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgPHN0cmluZy5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIgorICAgICAgICAgICAgIDw8IGZpbGVuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UtaGVscGVyIGNsYXNzZXMKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdHMKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7CisKKyAgLy8gY2xvc2UgdGhlIGZpbGVzCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9oZWFkZXJfLmNsb3NlKCk7Cit9CisKKy8qKgorICoKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKKworICBmX3R5cGVzXyA8PCAiLyogZXhjZXB0aW9uICovIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0NPREUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8ICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJHUXVhcmsgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfZXJyb3JfcXVhcmsoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgZXhjZXB0aW9ucyAqLyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9ET01BSU4gXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFya1wiIiA8PCBlbmRsIDw8ICJHUXVhcmsiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICJfRVJST1JfRE9NQUlOKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqCisgKiBIRUxQRVIgRlVOQ1RJT05TICoKKyAqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlLgorICovCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKK30KKworYm9vbCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmlzX251bWVyaWModF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2VudW0oKSB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpOworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSh0dHlwZSk7CisKKyAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYm5hbWU7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAvLyBzaW5jZSBhIHNldCByZXF1aXJlcyB1bmlxdWUgZWxlbWVudHMsIHVzZSBhIEdIYXNoVGFibGUsIGFuZAorICAgICAgLy8gcG9wdWxhdGUgdGhlIGtleXMgYW5kIHZhbHVlcyB3aXRoIHRoZSBzYW1lIGRhdGEsIHVzaW5nIGtleXMgZm9yCisgICAgICAvLyB0aGUgYWN0dWFsIHdyaXRlcyBhbmQgcmVhZHMuCisgICAgICAvLyBUT0RPOiBkaXNjdXNzIHdoZXRoZXIgb3Igbm90IHRvIGltcGxlbWVudCBUU2V0LCBUSGFzaFNldCBvciBHSGFzaFNldAorICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgaWYgKGV0eXBlLT5pc192b2lkKCkpIHsKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICAgIH0KKyAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG90aGVyIGltcGxlbWVudGF0aW9ucyBiZXNpZGVzIEdQdHJBcnJheQorICAgICAgY25hbWUgPSBpc19udW1lcmljKGV0eXBlKSA/ICJHQXJyYXkiIDogIkdQdHJBcnJheSI7CisgICAgfQorCisgICAgLyogT21pdCB0aGUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IgaWYgd2UgYXJlIGFsaWFzaW5nIHRoaXMgdHlwZSB3aXRoaW4gYQorICAgICAgIHR5cGVkZWYsIHRvIGFsbG93IHRoZSB0eXBlIHRvIGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgaW4gY2xpZW50IGNvZGU7CisgICAgICAgb3RoZXJ3aXNlLCBpbmNsdWRlIGl0ICovCisgICAgaWYgKCFpbl90eXBlZGVmKSB7CisgICAgICBjbmFtZSArPSAiICoiOworICAgIH0KKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICAvLyBjaGVjayBmb3IgYSBuYW1lc3BhY2UKKyAgdF9wcm9ncmFtKiB0cHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG5hbWUgPSAodHByb2dyYW0gPyB0cHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgIHBuYW1lICs9ICIgKiI7CisgIH0KKworICBpZiAoaXNfY29uc3QpIHsKKyAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byB0aGUgdHlwZSBuZWVkZWQgdG8gaG9sZCBpdHMgdmFsdWUgd2hlbiB1c2VkIGFzIGFuCisgKiBvYmplY3QgcHJvcGVydHkuCisgKgorICogVGhpcyBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgYWxsIGludGVnZXIgcHJvcGVydGllcyBvZiB3aWR0aCBsZXNzIHRoYW4gNjQKKyAqIGJpdHMgbWFwIHRvIHRoZSBzYW1lIHR5cGUsIGdpbnQsIGFzIG9wcG9zZWQgdG8gdGhlaXIgd2lkdGgtc3BlY2lmaWMgdHlwZQorICogKGdpbnQ4LCBnaW50MTYgb3IgZ2ludDMyKS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6cHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgeworICBzdHJpbmcgcmVzdWx0OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgICAgcmVzdWx0ID0gImNvbnN0IGdpbnQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gImdpbnQiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byBhIEMgcHJpbWl0aXZlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHlwZSk7CisgIH0KKyAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiT25seSBiYXNlIHR5cGVzIGFyZSBzdXBwcG9ydGVkLiIpOworICB9CisgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHlwZSk7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBiYXNlX3R5cGUtPmdldF9iYXNlKCk7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIkdCeXRlQXJyYXkgKiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZ2NoYXIgKiI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJnYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJnaW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiZ2ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJnaW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImdpbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZ2RvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgVGhyaWZ0VHlwZSBDIGVudW1lcmF0aW9uIGluIHRocmlmdF9wcm90b2NvbC5oCisgKiBmb3IgYSBUaHJpZnQgdHlwZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgVGhyaWZ0IGNvbnN0YW50IGZvcm1hdHRlZCBhcyBhIGxpdGVyYWwgZm9yIGluY2x1c2lvbiBpbiBDIGNvZGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHZhbHVlX3R5cGUgPSB2YWx1ZS0+Z2V0X3R5cGUoKTsKKworICAgIHN3aXRjaCAodmFsdWVfdHlwZSkgeworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgIHJlbmRlciA8PCAieyAiOworICAgICAgeworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGxpc3RfaXRlcjsKKworICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgbGlzdF9pdGVyID0gbGlzdC5iZWdpbigpOworICAgICAgICAgIHJlbmRlciA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisKKyAgICAgICAgICB3aGlsZSAoKytsaXN0X2l0ZXIgIT0gbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgcmVuZGVyIDw8ICIsICIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVuZGVyIDw8ICIgfSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBkZWZhdWx0OgorICAgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJHX0dJTlQ2NF9DT05TVEFOVCAoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAoaXNfY29tcGxleF90eXBlKHR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgdG9fbG93ZXJfY2FzZShuYW1lKSA8PCAiX2NvbnN0YW50KCkpIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgdF9zdHJ1Y3QqIHhsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIHN0cmluZyBmbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgIHJldHVybiAiZ2Jvb2xlYW4gIiArIHRoaXMtPm5zcGFjZV9sYyArIGZuYW1lICsgIiAoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKiBpZmFjZSIKKyAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKiBlcnJvcikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBtdXRhYmxlIGV4Y2VwdGlvbiBsaXN0cworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgaW5jbHVkaW5nIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBpZiAoY29uc3RhbnQpIHsKKyAgICByZXN1bHQgKz0gImNvbnN0ICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAocG9pbnRlcikgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgaWYgKHJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChnZG91YmxlKSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgaW50aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikgMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICB9CisgIH0KKworICBpZiAoIXJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiOyI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoc3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisgIGlmIChpc19udW1lcmljKGV0eXBlKSkgeworICAgIHJlbmRlciA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICoiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8ICJnX25ldyAoIiA8PCBiYXNlX3R5cGVfbmFtZShldHlwZSkgPDwgIiwgMSk7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgICAgKiIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCB2YWx1ZSkgPDwgIjsiCisgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCBpbml0aWFsaXplcyBjb21wbGV4IGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCkgeworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIHR5cGVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHR5cGVfdWMgPSB0b191cHBlcl9jYXNlKHR5cGVfdSk7CisgIHN0cmluZyBtYXliZV9zdGF0aWMgPSB0b3BfbGV2ZWwgPyAiIiA6ICJzdGF0aWMgIjsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbnkgY29uc3RhbnRzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdGhpcyBpbml0aWFsaXplcgorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAiIjsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgZmllbGRfbmFtZSA9IHRtcChmaWVsZF9uYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgY29uc3RhbnQtPiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCAiICAgIGNvbnN0YW50LT5fX2lzc2V0XyIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGltcGxlbWVudCB0aGUgaW5pdGlhbGl6ZXIKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgdHlwZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxpemVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxpc3RfdHlwZSA9ICJHUHRyQXJyYXkgKiI7CisgICAgc3RyaW5nIGZyZWVfZnVuYworICAgICAgICA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUocmVpbnRlcnByZXRfY2FzdDx0X2xpc3QqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7CisgICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKKyAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgIH0KKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7CisgICAgICAgIGluaXRpYWxpemVycyA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRlcnMgPDwgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIgorICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgbGlzdF90eXBlIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCAiIGNvbnN0YW50ID0gTlVMTDsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGlmICghaW5pdGlhbGl6ZXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOworICAgICAgc3RyaW5nIHB0ciA9IGlzX251bWVyaWMoZXR5cGUpID8gIioiIDogIiI7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKnZfaXRlcik7CisgICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiLCAwKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcga25hbWUgPSBmbmFtZSArICJrZXkiOworICAgICAgc3RyaW5nIHZuYW1lID0gZm5hbWUgKyAidmFsIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGtuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcih2bmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShrbmFtZSwgKHRfdHlwZSopa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZSh2bmFtZSwgKHRfdHlwZSopdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGtuYW1lIDw8ICIsICIgPDwgdm5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8ICJHSGFzaFRhYmxlICoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9ICIgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGt0eXBlLCB2dHlwZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgY2xhc3NlcyBmb3IgYSBzZXJ2aWNlLCBjb25zaXN0aW5nIG9mIGEgVGhyaWZ0U3RydWN0IHN1YmNsYXNzCisgKiBmb3IgdGhlIGFyZ3VtZW50cyB0byBhbmQgdGhlIHJlc3VsdCBmcm9tIGVhY2ggbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgaGVscGVyIGNsYXNzZXMKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcnZpY2UncyBtZXRob2RzCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIGFyZ19saXN0X25hbWVfb3JpZyA9IGFyZ19saXN0LT5nZXRfbmFtZSgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBjbGFzcworICAgIGFyZ19saXN0LT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJBcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0KGFyZ19saXN0KTsKKworICAgIGFyZ19saXN0LT5zZXRfbmFtZShhcmdfbGlzdF9uYW1lX29yaWcpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBjbGFzcworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywKKyAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJSZXN1bHQiKTsKKyAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgICAgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICAgICgqZmllbGRfaXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZpZWxkX2l0ZXIpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoJnJlc3VsdCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYzsKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWM7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vCisgIC8vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgc2VydmljZQorICAgIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIC8vIFRoZSBuYW1lcyBvZiB0aGUgY2xpZW50IGNsYXNzJyBwYXJlbnQgY2xhc3MgYW5kIHR5cGUKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiQ2xpZW50IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0NMSUVOVCI7CisgIH0KKworICAvLyBUaGUgYmFzZSBzZXJ2aWNlICh0aGUgdG9wbW9zdCBpbiB0aGUgImV4dGVuZHMiIGhpZXJhcmNoeSksIG9uCisgIC8vIHdob3NlIGNsaWVudCBjbGFzcyB0aGUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIKKyAgLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZAorICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOworICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlLT5nZXRfbmFtZSgpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhiYXNlX3NlcnZpY2VfbmFtZSkpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGJhc2Vfc2VydmljZV9uYW1lX2xjKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBkdW1teSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBzZXJ2aWNlIGludGVyZmFjZSAqLyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsgIgorICAgICAgICAgICAgPDwgIiAvKiBkdW1teSBvYmplY3QgKi8iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICBHVHlwZUludGVyZmFjZSBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBmdW5uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIgorICAgICAgICAgICAgICA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIERlZmluZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIiBwcm9wZXJ0aWVzIG9ubHkKKyAgICAvLyBmb3IgYmFzZSBzZXJ2aWNlczsgY2hpbGQgc2VydmljZS1jbGllbnQgY2xhc3NlcyB3aWxsIGluaGVyaXQKKyAgICAvLyB0aGVzZQorICAgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBhbGwgdGhlIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKworICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOworCisgICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLyogd3JpdGUgb3V0IHRoZSBnZXQvc2V0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAidm9pZCAiICsgc2VydmljZV9uYW1lX2xjICsgIl9jbGllbnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsOworICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKKworICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpICsgKGhhc19yZXR1cm4gPyAiX3JldHVybiwgIiA6ICIiKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOworICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgImdib29sZWFuIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCBwYXJhbXMgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UgKGlmYWNlKS0+IiA8PCBmdW5uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IHBhcmFtc193aXRob3V0X3R5cGUgPDwgImVycm9yKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IiA8PCBlbmRsIDw8ICIgICAgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAwLCAgICAgLyogaW5zdGFuY2Vfc2l6ZSAqLyIgPDwgZW5kbCA8PCAiICAgICAgMCwgICAgIC8qIG5fcHJlYWxsb2NzICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBpbnN0YW5jZV9pbml0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwgICAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmXCIsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgPDwgIkNsaWVudCwgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb3BlcnR5LXJlbGF0ZWQgY29kZSBvbmx5IGZvciBiYXNlIHNlcnZpY2VzLS0tY2hpbGQKKyAgLy8gc2VydmljZS1jbGllbnQgY2xhc3NlcyBoYXZlIG9ubHkgcHJvcGVydGllcyBpbmhlcml0ZWQgZnJvbSB0aGVpcgorICAvLyBwYXJlbnQgY2xhc3MKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBHZW5lcmF0ZSBjbGllbnQgcHJvcGVydGllcworICAgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudFByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIFBST1BfMCwiIDw8IGVuZGwgPDwgIiAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MIiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZl9zZXJ2aWNlXyA8PCAidm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIgorICAgICAgICAgICAgICAgPDwgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsICIKKyAgICAgICAgICAgICAgIDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIKKyAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMgYW5kIGV4Y2VwdGlvbnMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfc2VuZF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIHN0cmluZyByZXFUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdpbnQzMiBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCByZXFUeXBlIDw8ICIsIGNzZXFpZCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBUUlVFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWUgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIgorICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgYmFzZV9zZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIKKyAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSBnX29iamVjdF9uZXcgIgorICAgICAgICAgICAgICAgICAgICAiKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwgIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLHhjZXB0aW9uLT50eXBlLCAiCisgICAgICAgICAgICAgICAgICAgICJcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKG10eXBlICE9IFRfUkVQTFkpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICgiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCIKKyAgICAgICAgICAgICAgICAgICAgImVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgICB7CisgICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgICAgdF9maWVsZCogeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4Y2VwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfc2VydmljZV8sICZyZXN1bHQsICIiLCAiIiwgZmFsc2UpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIGNvcHkgb3ZlciBhbnkgdGhyb3cgZXhjZXB0aW9ucyBhbmQgcmV0dXJuIGZhaWx1cmUKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgqIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHdyYXAgZWFjaCBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NlbmRfIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiIChpZmFjZSI7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworCisgICAgLy8gaWYgbm90IG9uZXdheSwgaW1wbGVtZW50IHJlY3YKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICIiIDogIl9yZXR1cm4sICI7CisKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgcmV0ICs9ICIsICI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3JlY3ZfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBmdW5uYW1lIDw8ICIgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfIiA8PCBmdW5uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPmlucHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbGllbnQpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfY2xpZW50X2NsYXNzX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImlucHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvdXRwdXQgcHJvdG9jb2wgKGNvbnN0cnVjdClcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IG91dHB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgaGFuZGxlci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGFuZGxlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX2hhbmRsZXJfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX2hhbmRsZXJfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9oYW5kbGVyX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlIGhhbmRsZXIgY2xhc3MnCisgIC8vIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiSGFuZGxlciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIGhhbmRsZXIgKGFic3RyYWN0IGJhc2UgY2xhc3MpICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgZGVmaW5pdGlvbiwgaW5jbHVkaW5nIGl0cyBjbGFzcyBtZW1iZXJzCisgIC8vIChtZXRob2RzKQorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ19saXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4X2xpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBtZXRob2RfbmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzJyBtZXRob2QgZGVmaW5pdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgbWV0aG9kX25hbWUgPDwgIiAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBhcmdzX2luZGVudCA9IHN0cmluZygyNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCAiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXI7CisKKyAgICB0X2Z1bmN0aW9uIGltcGxlbWVudGluZ19mdW5jdGlvbihyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyAiX2hhbmRsZXJfIiArIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZpbXBsZW1lbnRpbmdfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSIChpZmFjZSksIEZBTFNFKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKGlmYWNlKSIKKyAgICAgICAgICAgICAgIDw8ICItPiIgPDwgbWV0aG9kX25hbWUgPDwgIiAoaWZhY2UsICI7CisKKyAgICBpZiAoIXJldHVybl90eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIl9yZXR1cm4sICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBhcmdzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKyAgICBmb3IgKGZpZWxkX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImVycm9yKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2UtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIKKyAgICAgICAgICAgICAgICAgPDwgbWV0aG9kX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAqY2xzKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOworCisgICAgICAvLyBBbGwgbWV0aG9kcyBhcmUgcHVyZSB2aXJ0dWFsIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNscy0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvcgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7CisKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKKworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfcHJvY2Vzc29yX25hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfcHJvY2Vzc29yX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKyAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhoYW5kbGVyX2NsYXNzX25hbWUpOworCisgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA9IGNsYXNzX25hbWUgKyAiUHJvY2Vzc0Z1bmN0aW9uIjsKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA9CisgICAgY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYiOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlCisgIC8vIHByb2Nlc3NvciBjbGFzcycgcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJQcm9jZXNzb3IiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfUFJPQ0VTU09SIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9ICJUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBwcm9jZXNzb3IgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIgKmhhbmRsZXI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiR0hhc2hUYWJsZSAqcHJvY2Vzc19tYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnByb2Nlc3NvciwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjcsICcgJyk7CisgIGZfaGVhZGVyXyA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKmluLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqZm5hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxaWQsIgorICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1JfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb3BlcnRpZXMgZW51bQorICBmX3NlcnZpY2VfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMTUsICcgJyk7CisgIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjCisgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIHR5cGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcocHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUubGVuZ3RoKCkgKyAyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBnYm9vbGVhbiAoKiAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIpICgiCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHR5cGUKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBzdHJ1Y3QiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdjaGFyICpuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIgZnVuY3Rpb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9ICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMgc28gd2UKKyAgLy8gY2FuIHJlZmVyIHRvIHRoZW0gaW4gdGhlIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiBzdHJ1Y3QgYmVsb3cgYW5kCisgIC8vIGtlZXAgYWxsIG9mIHRoZSBwcm9jZXNzb3IncyBkZWNsYXJhdGlvbnMgaW4gb25lIHBsYWNlCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIGRlZmluaXRpb25zLCBpZiB0aGUgc2VydmljZQorICAvLyBkZWZpbmVzIGFueSBtZXRob2RzCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZQorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1siCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICJdID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgICAgIDw8IChmdW5jdGlvbl9pdGVyID09IC0tZnVuY3Rpb25zLmVuZCgpID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljID0gdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyk7CisKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBib29sIGhhc19yZXR1cm5fdmFsdWUgPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ19pdGVyOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc19jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJBcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfQVJHUyI7CisKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIlJlc3VsdCI7CisgICAgc3RyaW5nIHJlc3VsdF9jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9SRVNVTFQiOworCisgICAgc3RyaW5nIGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA9IGhhbmRsZXJfY2xhc3NfbmFtZV9sYyArICJfIiArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYzsKKworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgICAgICAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19jbGFzc19uYW1lICsgIiAqIGFyZ3MgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKCIgPDwgYXJnc19jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VxdWVuY2VfaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoaW5wdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoKHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoYXJncyksICIKKyAgICAgICAgICAgICAgIDw8ICJpbnB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGlucHV0X3Byb3RvY29sLCAiCisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIT0gRkFMU0UpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiIHJldHVybl92YWx1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0X2NsYXNzX25hbWUgPDwgIiAqIHJlc3VsdF9zdHJ1Y3Q7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGFyZ3MsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IGFyZ19uYW1lIDw8ICJcIiwgJiIgPDwgYXJnX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X2dldCAob3V0cHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCisgICAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0X3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoIiA8PCByZXN1bHRfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKHJlc3VsdF9zdHJ1Y3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJzdWNjZXNzXCIsICZyZXR1cm5fdmFsdWUsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBQYXNzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIHRoZSBoYW5kbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaGFuZGxlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAoc2VsZi0+aGFuZGxlciksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoaGFuZGxlcl9mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgNiwgJyAnKTsKKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgc3RyaW5nIHJldHVybl90eXBlX25hbWUgPSB0eXBlX25hbWUocmV0dXJuX3R5cGUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50OworCisgICAgICAvLyBDYXN0IHJldHVybl92YWx1ZSBpZiBpdCB3YXMgZGVjbGFyZWQgYXMgYSB0eXBlIG90aGVyIHRoYW4gdGhlIHJldHVybgorICAgICAgLy8gdmFsdWUncyBhY3R1YWwgdHlwZS0tLXRoaXMgaXMgdHJ1ZSBmb3IgaW50ZWdlciB2YWx1ZXMgMzIgYml0cyBvciBmZXdlcgorICAgICAgLy8gaW4gd2lkdGgsIGZvciB3aGljaCBHTGliIHJlcXVpcmVzIGEgcGxhaW4gZ2ludCB0eXBlIGJlIHVzZWQgd2hlbgorICAgICAgLy8gc3RvcmluZyBvciByZXRyaWV2aW5nIGFzIGFuIG9iamVjdCBwcm9wZXJ0eQorICAgICAgaWYgKHJldHVybl90eXBlX25hbWUgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZVtyZXR1cm5fdHlwZV9uYW1lLmxlbmd0aCgpIC0gMV0gIT0gJyonKSB7CisgICAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnKic7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcmV0dXJuX3R5cGVfbmFtZSA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgIiZyZXR1cm5fdmFsdWUsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiJiIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBzdWNjZXNzOyByZXR1cm4gdGhlIHJlc3VsdCwgaWYgYW55LCB0byB0aGUgY2FsbGVyCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCBcInN1Y2Nlc3NcIiwgIjsKKyAgICAgICAgaWYgKHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICAgIC8vIFJvdW5kdHJpcCBjYXN0IHRvIGZpeCB0aGUgcG9zaXRpb24gb2Ygc2lnbiBiaXQuCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCB0eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm5fdmFsdWUsICIKKyAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCk7IiA8PCBlbmRsOworCisgICAgICAgIC8vIERlYWxsb2NhdGUgKG9yIHVucmVmKSByZXR1cm5fdmFsdWUKKyAgICAgICAgcmV0dXJuX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHJldHVybl90eXBlKTsKKyAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilyZXR1cm5fdHlwZSk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXJldHVybl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFwKCkgfHwgcmV0dXJuX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZTsgY2hlY2sgdG8gc2VlIGlmIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24gd2FzIHJhaXNlZCBhbmQgaWYgc28sIHJldHVybiBpdCB0byB0aGUgY2FsbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgImlmICgiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIiA8PCBlbmRsOworICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZSBidXQgcmFpc2VkIG5vIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24sIHJldHVybiBhIFRocmlmdCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24KKyAgICAvLyByZXR1cm5lZCB2aWEgR0xpYidzIG93biBlcnJvci1yZXBvcnRpbmcgbWVjaGFuaXNtCisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCplcnJvciA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3dhcm5pbmcgKFwiIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlwiYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yXCIpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcInR5cGVcIiwgICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+Y29kZSA6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJcIm1lc3NhZ2VcIiwgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6IE5VTEwsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9lcnJvciAoZXJyb3IpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRfRVhDRVBUSU9OLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIERlbGxvY2F0ZSBvciB1bnJlZiByZXRyaWV2ZWQgYXJndW1lbnQgdmFsdWVzIGFzIG5lY2Vzc2FyeQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiBhcmdfdHlwZSA9IGdldF90cnVlX3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoYXJnX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilhcmdfdHlwZSk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAoYXJnX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKWFyZ190eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19tYXAoKSB8fCBhcmdfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJlc3VsdF9zdHJ1Y3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAocmVzdWx0ID09IFRSVUUpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICA8PCAiKG91dHB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpICIKKyAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfdW5yZWYgKGFyZ3MpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGRpc3BhdGNoX2NhbGwgaW1wbGVtZW50YXRpb24KKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2Rpc3BhdGNoX2NhbGwiOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgIDw8ICIgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICptZXRob2RfbmFtZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiAqIgorICAgICAgICAgICAgIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZjsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGRpc3BhdGNoX3Byb2Nlc3Nvcik7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipwYXJlbnRfY2xhc3MgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChzZWxmKSk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZiA9ICIKKyAgICAgICAgICAgICA8PCAiZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+cHJvY2Vzc19tYXAsIG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHByb2Nlc3NfZnVuY3Rpb25fZGVmICE9IE5VTEwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg1MywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChtZXRob2RfbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9ICIKKyAgICAgICAgICAgICA8PCAiKCpwcm9jZXNzX2Z1bmN0aW9uX2RlZi0+ZnVuY3Rpb24pIChzZWxmLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgLy8gTWV0aG9kIG5hbWUgbm90IHJlY29nbml6ZWQ7IGNoYWluIHVwIHRvIG91ciBwYXJlbnQgcHJvY2Vzc29yLS0tbm90ZSB0aGUKKyAgLy8gdG9wLW1vc3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIGluIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGl0c2VsZiwKKyAgLy8gd2lsbCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIgaWYgbm8gY2xhc3MgaW4gdGhlCisgIC8vIGhpZXJhcmNoeSByZWNvZ25pemVzIHRoZSBtZXRob2QgbmFtZQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaXNwYXRjaF9yZXN1bHQgPSBwYXJlbnRfY2xhc3MtPmRpc3BhdGNoX2NhbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg0NywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm1ldGhvZF9uYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgc2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT5oYW5kbGVyICE9IE5VTEwpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnX29iamVjdF9yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIENoYWluIHVwIHRvIHNldCB0aGUgaGFuZGxlciBpbiBldmVyeSBzdXBlcmNsYXNzIGFzIHdlbGwKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpLT4iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNldF9wcm9wZXJ0eSAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvcidzIHByb3BlcnR5IGdldHRlcgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXNlIFBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0b3IgdGhlIHByb2Nlc3NvcidzIGRpc3Bvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZ29iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmRpc3Bvc2UgKGdvYmplY3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGZpbmFsaXplIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgKnNlbGYgPSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAoZ29iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IChzZWxmLT5wcm9jZXNzX21hcCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZmluYWxpemUgKGdvYmplY3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJndWludCBpbmRleDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPnByb2Nlc3NfbWFwID0gIgorICAgICAgICAgICAgICAgICJnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7IiA8PCBlbmRsOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZygyMSwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAiCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICI7IGluZGV4ICs9IDEpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKHNlbGYtPnByb2Nlc3NfbWFwLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdLm5hbWUsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIiYiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdIiA8PCAiKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgPDwgIkNsYXNzICpjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgKmRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9DTEFTUyAoY2xzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2U7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3Byb3BlcnR5OyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2xzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJoYW5kbGVyXCIsIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzQsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiU2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwiVGhlIHNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBcIiIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJcInRvIHdoaWNoIG1ldGhvZCBjYWxscyBhcmUgZGlzcGF0Y2hlZC5cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBzZXJ2ZXIuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIGhhbmRsZXIgY2xhc3MKKyAgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRzZXJ2aWNlKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIHByb2Nlc3NvciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0byByZXByZXNlbnQgYSBUSHJpZnQgc3RydWN0dXJlIGFzIGEgR09iamVjdC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKKyAgc3RyaW5nIGFyZ3NfaW5kZW50OworCisgIC8vIHdyaXRlIHRoZSBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgZW5kbCA8PCAieyAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0IHBhcmVudDsgIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgLyogcHVibGljICovIiA8PCBlbmRsOworCisgIC8vIGZvciBlYWNoIGZpZWxkLCBhZGQgYSBtZW1iZXIgdmFyaWFibGUKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBmX3R5cGVzXyA8PCAiICBnYm9vbGVhbiBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGEgdHlwZWRlZgorICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIHN0YW5kYXJkIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl90eXBlc18gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJfVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlCisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydGllcyBlbnVtCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXyIgPDwgbWVtYmVyX25hbWVfdWM7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBzdHJ1Y3QgSS9PIG1ldGhvZHMKKyAgc3RyaW5nIHRoaXNfZ2V0ID0gdGhpcy0+bnNwYWNlICsgbmFtZSArICIgKiB0aGlzX29iamVjdCA9ICIgKyB0aGlzLT5uc3BhY2VfdWMgKyBuYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICsgIihvYmplY3QpOyI7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyIGFuZCBnZXR0ZXIKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgPDwgImNvbnN0IEdWYWx1ZSAqdmFsdWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2J5dGVfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19mcmVlIjsKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX3N0cmluZyI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9ib29sZWFuIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50NjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2RvdWJsZSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgLy8gTGlzdHMgb2YgYmFzZSB0eXBlcyBvdGhlciB0aGFuIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIEdBcnJheXM7CisgICAgICAgICAgLy8gYWxsIG90aGVycyBhcyBHUHRyQXJyYXlzCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKKyAgICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfaGFzaF90YWJsZV91bnJlZiI7CisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8ICIgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmIChtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPl9faXNzZXRfIiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgc3RyaW5nIHNldHRlcl9mdW5jdGlvbl9uYW1lOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisKKyAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2Jvb2xlYW4iOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludDY0IjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9kb3VibGUiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X3N0cmluZyI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X29iamVjdCI7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIGZvciBzdHJ1Y3QgbWVtYmVyIFwiIiArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA8PCAiICh2YWx1ZSwgc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSBpbnN0YW5jZSBpbml0IGZ1bmN0aW9uCisKKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqIG9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGdlbmVyYXRlIGRlZmF1bHQtdmFsdWUgc3RydWN0dXJlcyBmb3IgY29udGFpbmVyLXR5cGUgbWVtYmVycworICBib29sIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IGZhbHNlOworICBib29sIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKm1faXRlcjsKKyAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOworCisgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSB3aXRoIHRoZSBsaXN0IGxpdGVyYWwKKyAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJzdGF0aWMgIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX2RlZmF1bHRfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbWVtYmVyX25hbWUgPDwgIlsiIDw8IGxpc3Quc2l6ZSgpIDw8ICJdID0gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb25zdGFudF9saXRlcmFsKG1lbWJlcl90eXBlLCBtZW1iZXJfdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IHRydWU7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdmFsdWVzIGZvciBhIHBvaW50ZXIgYXJyYXkgKGkuZS4gYSBsaXN0IG9mCisgICAgICAgIC8vIHN0cmluZ3MpLCBzZXQgYSBmbGFnIHNvIHdlIGtub3cgdG8gYWxzbyBkZWNsYXJlIGFuIGluZGV4IHZhcmlhYmxlIHRvCisgICAgICAgIC8vIHVzZSBpbiBwcmUtcG9wdWxhdGluZyB0aGUgYXJyYXkKKyAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgICBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0CisgICAgfQorICB9CisgIGlmIChjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQpIHsKKyAgICBpZiAoc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0KSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInVuc2lnbmVkIGludCBsaXN0X2luZGV4OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0KKworICAvLyBzYXRpc2Z5IGNvbXBpbGVycyB3aXRoIC1XYWxsIHR1cm5lZCBvbgorICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIi8qIHNhdGlzZnkgLVdhbGwgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShtZW1iZXJfdHlwZSk7CisgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzdHJpbmcgZHZhbCA9ICIgPSAiOworICAgICAgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgIH0KKyAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUoIiIsIHQsIGN2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiTlVMTCIgOiAiMCI7CisgICAgICB9CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfcHJvZ3JhbSogdHlwZV9wcm9ncmFtID0gbWVtYmVyX3R5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgdHlwZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGVfbnNwYWNlKSArICJfIjsKKyAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBpbml0X2Z1bmN0aW9uOworICAgICAgdF90eXBlKiBldHlwZSA9IE5VTEw7CisKKyAgICAgIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleSA9ICgodF9tYXAqKXQpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2YWx1ZSA9ICgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShrZXksIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGV0eXBlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PCBpbml0X2Z1bmN0aW9uIDw8IGVuZGw7CisKKyAgICAgIC8vIFByZS1wb3B1bGF0ZSB0aGUgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcywgaWYgYW55CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworCisgICAgICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsICZfX2RlZmF1bHRfIiA8PAorICAgICAgICAgICAgICBuYW1lIDw8ICIsICIgPDwgbGlzdC5zaXplKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZm9yIChsaXN0X2luZGV4ID0gMDsgbGlzdF9pbmRleCA8ICIgPDwgbGlzdC5zaXplKCkgPDwgIjsgIiA8PAorICAgICAgICAgICAgICAibGlzdF9pbmRleCArPSAxKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJnX3B0cl9hcnJheV9hZGQgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsIiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8IHN0cmluZygxNywgJyAnKSA8PCAiZ19zdHJkdXAgKF9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIltsaXN0X2luZGV4XSkpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBub3QgcmVxdWlyZWQsIGluaXRpYWxpemUgdGhlIF9faXNzZXQgdmFyaWFibGUgKi8KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPl9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogY3JlYXRlIHRoZSBkZXN0cnVjdG9yICovCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICp0b2JqZWN0ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSB0b2JqZWN0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0b2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHQtPmlzX21hcCgpIHx8IHQtPmlzX3NldCgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9kZXN0cm95ICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisKKyAgICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA8PCAiICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBUT0RPOiBnX2NsZWFyX29iamVjdCBuZWVkcyBnbGliID49IDIuMjgKKyAgICAgIC8vIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfb2JqZWN0ICgmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgLy8gZG9lcyBnX29iamVjdF91bnJlZiB0aGUgdHJpY2s/CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHQpIDw8ICIodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGNsYXNzIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgICAgPDwgIkNsYXNzICogY2xzKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFN0cnVjdENsYXNzICpzdHJ1Y3RfY2xhc3MgPSAiCisgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9TVFJVQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT5yZWFkID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT53cml0ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3dyaXRlOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICAgICAgIDw8ICJfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGw7CisKKyAgICAvLyBpbnN0YWxsIGEgcHJvcGVydHkgZm9yIGVhY2ggbWVtYmVyCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgJyAnOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHByb3BlcnR5X2lkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfQllURV9BUlJBWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjEsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfc3RyaW5nIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgobWVtYmVyX3ZhbHVlICE9IE5VTEwpID8gIlwiIiArIG1lbWJlcl92YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJOVUxMIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm9vbGVhbiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSAmJiAobWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJGQUxTRSIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTY0KQorICAgICAgICAgICAgICAgICAgIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSkgeworICAgICAgICAgIHN0cmluZyBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludCI7CisgICAgICAgICAgc3RyaW5nIG1pbl92YWx1ZTsKKyAgICAgICAgICBzdHJpbmcgbWF4X3ZhbHVlOworICAgICAgICAgIG9zdHJpbmdzdHJlYW0gZGVmYXVsdF92YWx1ZTsKKworICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDgiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UOCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMTYiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMTYiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDMyIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDMyIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludDY0IjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDY0IjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDY0IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2RvdWJsZSI7CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiLUlORklOSVRZIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJJTkZJTklUWSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgorICAgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFID8gbWVtYmVyX3ZhbHVlLT5nZXRfZG91YmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8ICIwIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcocGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA8PCAiIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgZGVmYXVsdF92YWx1ZS5zdHIoKSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWluX3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21pbl92YWx1ZSgpOworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWF4X3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21heF92YWx1ZSgpOworICAgICAgICBpbnQgbWluX3ZhbHVlID0gKGVudW1fbWluX3ZhbHVlICE9IE5VTEwpID8gZW51bV9taW5fdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKyAgICAgICAgaW50IG1heF92YWx1ZSA9IChlbnVtX21heF92YWx1ZSAhPSBOVUxMKSA/IGVudW1fbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKSA6IDA7CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDE4LCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfaW50IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlID0gdHlwZV9wcm9ncmFtID8gdHlwZV9wcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworCisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0gdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpICsgIlRZUEVfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX3R5cGUtPmdldF9uYW1lKCkpKTsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19vYmplY3QgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZTsKKworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX0FSUkFZIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9QVFJfQVJSQVkiOworICAgICAgICB9CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0hBU0hfVEFCTEUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiR1R5cGUiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfZmluYWxpemUgKi8iCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgKEdDbGFzc0luaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9jbGFzc19pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiKSwiIDw8IGVuZGwgPDwgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoVEhSSUZUX1RZUEVfU1RSVUNULCAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIlR5cGVcIiwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW50IGVycm9yX3JldCA9IDA7CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgZXJyb3JfcmV0ID0gLTE7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBnaW50MzIiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnaW50MzIgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBzdHJ1Y3QKKyAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZQorICAgICAgPDwgIlwiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpc19vYmplY3QtPl9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBUUlVFKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldAorICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKyAgaW50IGVycm9yX3JldCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBkZWNsYXJlIHN0YWNrIHRlbXAgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJnY2hhciAqbmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdpbnQxNiBmaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ3BvaW50ZXIgZGF0YSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB0aGVzZSBhcmVuJ3QgdXNlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGRhdGEpOyIgPDwgZW5kbDsKKworICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGZpZWxkcyAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3dpdGNoIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZQorICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHN3aXRjaAorICBzY29wZV91cChvdXQpOworCisgIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCwgZmFsc2UpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIGRlZmF1bHQgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHN3aXRjaAorICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gcmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZSBsb29wCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3IKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFwibWlzc2luZyBmaWVsZFwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIC0xOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV8iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICIgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+ZGF0YSA6IE5VTEwsICIKKyAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+bGVuIDogMCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyBuYW1lICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4CisgICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB0dmFsID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lKHRrZXkpOworICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUodHZhbCk7CisgICAgc3RyaW5nIHRrZXlfcHRyOworICAgIHN0cmluZyB0dmFsX3B0cjsKKyAgICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgICAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOworCisgICAgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3V0LCB0a2V5LCBrZXluYW1lKTsKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHR2YWwsIHZhbG5hbWUpOworCisgICAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbworICAgICAgIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKKyAgICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICAgIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAgIC8qCisgICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCisgICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCisgICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgorICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCisgICAgICogR0xpc3QuCisgICAgICovCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKHRrZXkpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHR2YWwpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIsIGtleV9jb3VudCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgIgorICAgICAgICAgICAiaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAia2V5c1tpKytdID0gKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGtleW5hbWUgPDwgIiA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHZhbG5hbWUgPDwgIiA9ICgiIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0cgorICAgICAgICA8PCAiKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKKyAgICAgICAgPDwgIiksIChncG9pbnRlcikgIiA8PCBrZXluYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X21hcCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrZXlfcHRyICsgIiAiICsga2V5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZhbF9wdHIgKyAiICIgKyB2YWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRlbGVtID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUodGVsZW0pOworICAgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImdwb2ludGVyIHZhbHVlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGVsZW0pIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxlbSA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSA9IChncG9pbnRlcikgZ19oYXNoX3RhYmxlX2xvb2t1cCAiCisgICAgICAgICAgICIoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIpLCAoZ3BvaW50ZXIpIGVsZW0pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3NldCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGVtX3B0ciArICJlbGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBsZW5ndGggPSAiKCIgKyBwcmVmaXggKyAiID8gIiArIHByZWZpeCArICItPmxlbiA6IDApIjsKKyAgICBzdHJpbmcgaSA9IHRtcCgiaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIChnaW50MzIpICIKKyAgICAgICAgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IGxlbmd0aCA8PCAiOyAiCisgICAgICAgIDw8IGkgPDwgIisrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbHVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKworICAvLyBjYXN0IHRvIG5vbi1jb25zdAorICBzdHJpbmcgY2FzdCA9ICIiOworICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIgKyBpbmRleCArICIpIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgIiArIGJhc2VfdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyBpbmRleCArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICBjYXN0ID0gIihnY2hhciopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgY2FzdCA9ICIoR0hhc2hUYWJsZSopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICB9CisgICAgY2FzdCA9IGlzX251bWVyaWMoZXR5cGUpID8gIihHQXJyYXkqKSIgOiAiKEdQdHJBcnJheSopIjsKKyAgfQorCisgIHRfZmllbGQgZWZpZWxkKHR0eXBlLCAiKCIgKyBjYXN0ICsgbmFtZSArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKworLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQsIGFsbG9jYXRlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkXyI7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGxvYWQgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgZGF0YQorICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGdfYnl0ZV9hcnJheV9uZXcoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19ieXRlX2FycmF5X2FwcGVuZCAoIiA8PCBuYW1lIDw8ICIsIChndWludDggKikgZGF0YSwgKGd1aW50KSBsZW4pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUgKGRhdGEpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICYiIDw8IHQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICciICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKKyAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKKyAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KKyAgaWYgKHByZWZpeCAhPSAiIiAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgeworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIFRoaXMgc3RydWN0IGlzIGFuIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbDsKKyAgICBhbGxvY2F0ZSA9IHRydWU7CisgIH0KKworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICggIiA8PCBwcmVmaXggPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGFsbG9jYXRlKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGtleV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIG1hcCBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCdzIGZpZWxkcyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyByZWFkIG1hcCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBlbmQgbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXQgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBzZXQgZW5kCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgICAgICImZWxlbWVudF90eXBlLCZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGxpc3QgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbGlzdCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIHJlYWQgbGlzdCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIG5hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKworICAvKiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbyB3ZQorICAgICBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKGZvcl9oYXNoX3RhYmxlICYmIHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZQorICAgICAgICA8PCAocHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdG5hbWUgKyAiLCAxKSIgOiAiID0gTlVMTCIpIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiAiIDogIiogIjsKKyAgc3RyaW5nIGluaXRfdmFsID0gdHR5cGUtPmlzX2VudW0oKSA/ICIiIDogIiA9IE5VTEwiOworICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8IG5hbWUgPDwgaW5pdF92YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKyAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUsIHRydWUpOworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSwgdHJ1ZSk7CisKKyAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcKKyAgICAgdHlwZSBzbyB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvCisgICAgIGl0ICovCisgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKKyAgdF9maWVsZCBma2V5KHRrZXksIHRrZXlfcHRyICsga2V5bmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKKyAgdF9maWVsZCBmdmFsKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBrZXluYW1lIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUKKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHRlbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRlbGVtLCBlbGVtLCB0cnVlKTsKKworICB0X2ZpZWxkIGZlbGVtKHRlbGVtLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtCisgICAgICAgICAgICAgIDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZClpbmRleDsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gIWlzX251bWVyaWModHR5cGUpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR0eXBlLCBlbGVtLCBmYWxzZSk7CisKKyAgdF9maWVsZCBmZWxlbSh0dHlwZSwgdGVsZW1fcHRyICsgZWxlbSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiLCAxKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAidGhyaWZ0X3N0cmluZ19mcmVlIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJOVUxMIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX29iamVjdF91bnJlZiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IGV0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIDsKKyAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKKyAgICB9CisgICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDE2X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19kb3VibGVfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2hhc2giOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfQorICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDhfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImdfaW50NjRfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKSB7CisgIHN0cmluZyBoYXNoX2Z1bmMgPSBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBjbXBfZnVuYyA9IGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcga2V5X2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIHZhbHVlX2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodmFsdWUpOworCisgIHJldHVybiAiZ19oYXNoX3RhYmxlX25ld19mdWxsICgiICsgaGFzaF9mdW5jICsgIiwgIiArIGNtcF9mdW5jICsgIiwgIiArIGtleV9mcmVlX2Z1bmMgKyAiLCAiCisgICAgICAgICArIHZhbHVlX2ZyZWVfZnVuYyArICIpOyI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mICgiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIikpOyI7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodHR5cGUpOworICAgIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgiICsgZnJlZV9mdW5jICsgIik7IjsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgorICovCitzdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG91cHBlcik7CisgIHJldHVybiBzOworICAvLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKK30KKworLyoqCisgKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KKyAqLworc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHMobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvbG93ZXIpOworICByZXR1cm4gczsKKyAgLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Cit9CisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCisgKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKKyAqCisgKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCisgKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBpbnQgcG9zID0gMDsKKworICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCisgIHJldCArPSB0b2xvd2VyKHRtcFtwb3NdKTsKKyAgcG9zKys7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKKyAgICAgIHJldCArPSAnXyc7CisgICAgfQorICAgIHJldCArPSBsYzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGVyZm9ybXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlczogVGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyBtYWRlIHVwcGVyY2FzZSwgYWxvbmcgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0CisgKiBmb2xsb3dzIGFuIHVuZGVyc2NvcmUgKHdoaWNoIGlzIHJlbW92ZWQpLiBVc2VmdWwgZm9yIGNvbnZlcnRpbmcgVGhyaWZ0CisgKiBzZXJ2aWNlLW1ldGhvZCBuYW1lcyBpbnRvIEdPYmplY3Qtc3R5bGUgY2xhc3MgbmFtZXMuCisgKgorICogSW5wdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKiBPdXRwdXQ6ICJab21nQ2FtZWxDYXNlIgorICovCitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGMgPSB0bXBbaV07CisgICAgaWYgKGMgPT0gJ18nKSB7CisgICAgICB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh1cHBlcmNhc2VfbmV4dCkgeworICAgICAgICByZXQgKz0gdG91cHBlcihjKTsKKyAgICAgICAgdXBwZXJjYXNlX25leHQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCArPSBjOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIHJlZ2lzdGVyIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIG1haW4gcHJvZ3JhbSAqLworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjX2dsaWIsICJDLCB1c2luZyBHTGliIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0gUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2sKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworLyoqCisgKiBDb21tb24gTGlzcCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKi8KK2NsYXNzIHRfY2xfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CisgcHVibGljOgorICB0X2NsX2dlbmVyYXRvcigKKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKKyAgeworICAgIG5vX2FzZCA9IGZhbHNlOworICAgIHN5c3RlbV9wcmVmaXggPSAidGhyaWZ0LWdlbi0iOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvcihpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZihpdGVyLT5maXJzdC5jb21wYXJlKCJub19hc2QiKSA9PSAwKSB7CisgICAgICAgIG5vX2FzZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInN5c19wcmVmIikgPT0gMCkgeworCXN5c3RlbV9wcmVmaXggPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY2w6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNsIjsKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gICAgKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBjbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgdm9pZCBhc2RmX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfaW4oc3RkOjpvc3RyZWFtICZvdXQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVzcGVjICh0X3R5cGUgKnQpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgY2xfZG9jc3RyaW5nKHN0ZDo6c3RyaW5nIHJhdyk7CisKKyBwcml2YXRlOgorCisgIGludCB0ZW1wb3JhcnlfdmFyOworICAvKioKKyAgICogSXNvbGF0ZSB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgY2FuIHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYXNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3ZhcnNfOworCisgIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187CisKKyAgYm9vbCBub19hc2Q7CisgIHN0ZDo6c3RyaW5nIHN5c3RlbV9wcmVmaXg7Cit9OworCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgcHJvZ3JhbV9kaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgcHJvZ3JhbV9uYW1lXzsKKyAgTUtESVIocHJvZ3JhbV9kaXIuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdHlwZXMubGlzcCI7CisgIHN0cmluZyBmX3ZhcnNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdmFycy5saXNwIjsKKworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl92YXJzXy5vcGVuKGZfdmFyc19uYW1lLmNfc3RyKCkpOworICBmX3ZhcnNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgcGFja2FnZV9kZWYoZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3ZhcnNfKTsKKworICBpZiAoIW5vX2FzZCkgeworICAgIHN0cmluZyBmX2FzZF9uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBzeXN0ZW1fcHJlZml4ICsgcHJvZ3JhbV9uYW1lXyArICIuYXNkIjsKKyAgICBmX2FzZF8ub3BlbihmX2FzZF9uYW1lLmNfc3RyKCkpOworICAgIGZfYXNkXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGFzZGZfZGVmKGZfYXNkXyk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHJlc3VsdCArPSAiOmRlcGVuZHMtb24gKDp0aHJpZnQiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICIgOiIgKyBzeXN0ZW1fcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmVzdWx0ICs9ICIpXG4iOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjbCIpOworICByZXR1cm4gcHJlZml4LmVtcHR5KCkgPyAidGhyaWZ0LWdlbmVyYXRlZCIgOiBwcmVmaXg7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZSgpIHsKKyAgcmV0dXJuIHBhY2thZ2Vfb2YocHJvZ3JhbV8pOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgc3ltYm9sKSB7CisgIHJldHVybiAiXCIiICsgc3ltYm9sICsgIlwiIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgIHN0ZDo6c3RyaW5nKCI7OzsgIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKworICAgICI7OzsgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCisgICAgIjs7OyBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2RvY3N0cmluZyhzdHJpbmcgcmF3KSB7CisgIHJlcGxhY2UocmF3LmJlZ2luKCksIHJhdy5lbmQoKSwgJyInLCAnXCcnKTsKKyAgcmV0dXJuIHJhdzsKK30KKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfYXNkXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3ZhcnNfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVkX3BhY2thZ2UoKSB7CisgIHJldHVybiBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIik7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGFzZGY6ZGVmc3lzdGVtICM6IiA8PCBzeXN0ZW1fcHJlZml4IDw8IHByb2dyYW1fbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQorICAgICAgPDwgaW5kZW50KCkgPDwgIjpzZXJpYWwgdCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjpjb21wb25lbnRzICgiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdHlwZXNcIikgIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXZhcnNcIikpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqKgorICogR2VuZXJhdGUgYSBwYWNrYWdlIGRlZmluaXRpb24uIEFkZCB1c2UgcmVmZXJlbmNlcyBlcXVpdmFsZW50IHRvIHRoZSBpZGwgZmlsZSdzIGluY2x1ZGUgc3RhdGVtZW50cy4KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKworICBvdXQgPDwgIih0aHJpZnQ6ZGVmLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpOworICBpZiAoIGluY2x1ZGVzLnNpemUoKSA+IDAgKSB7CisgICAgb3V0IDw8ICIgOnVzZSAoIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBvdXQgPDwgIiA6IiA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpIjsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBvdXQgPDwgIihjbDppbi1wYWNrYWdlIDoiIDw8IHBhY2thZ2UoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQ29tbW9uIExpc3AsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLWVudW0gIiA8PCBwcmVmaXgodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIigiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisKKyAgICBmX3R5cGVzXyA8PCAiKFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIC4gIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIikpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfdmFyc18gPDwgIih0aHJpZnQ6ZGVmLWNvbnN0YW50ICIgPDwgcHJlZml4KG5hbWUpIDw8ICIgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidCIgOiAibmlsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAodHlwZS0+aXNfc3RydWN0KCkgPyAiKG1ha2UtaW5zdGFuY2UgJyIgOiAiKG1ha2UtZXhjZXB0aW9uICciKSA8PAorICAgICAgICAgICBsb3dlcmNhc2UodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgIiA8PAorICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8gZW1pdCBhbiBoYXNoIGZvcm0gd2l0aCBib3RoIGtleXMgYW5kIHZhbHVlcyB0byBiZSBldmFsdWF0ZWQKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIodGhyaWZ0Om1hcCAiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIihjbDpjb25zICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6c2V0IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6bGlzdCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICIoIjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwgcHJlZml4KCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICAgICggKE5VTEwgIT0gdmFsdWUpID8gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA6ICJuaWwiICkgPDwKKyAgICAgICAgIiA6aWQgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKyAgICBpZiAoIHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICJzdHJpbmciID09IHR5cGVzcGVjKHR5cGUpICkKKyAgICAgIGlmICggKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICkKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgYmluYXJ5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgc3RyaW5nIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiA6dHlwZSAiIDw8IHR5cGVzcGVjKHR5cGUpOworICAgIGlmICggKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCApIHsKKyAgICAgIG91dCA8PCAiIDpvcHRpb25hbCB0IjsKKyAgICB9CisgICAgaWYgKCAoKm1faXRlciktPmhhc19kb2MoKSkgeworICAgICAgb3V0IDw8ICIgOmRvY3VtZW50YXRpb24gXCIiIDw8IGNsX2RvY3N0cmluZygoKm1faXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgICB9CisgICAgb3V0IDw8IikiOworICB9CisKKyAgb3V0IDw8ICIpIjsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBzdGQ6OnN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgKGlzX2V4Y2VwdGlvbiA/ICIodGhyaWZ0OmRlZi1leGNlcHRpb24gIiA6ICIodGhyaWZ0OmRlZi1zdHJ1Y3QgIikgPDwKKyAgICAgIHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCB0c3RydWN0LT5oYXNfZG9jKCkgKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDsKKyAgICBvdXQgPDwgIlwiIiA8PCBjbF9kb2NzdHJpbmcodHN0cnVjdC0+Z2V0X2RvYygpKSA8PCAiXCIiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgZi0+Z2V0X3hjZXB0aW9ucygpLCB0cnVlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2NsaWVudCA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHNfY2xpZW50LmVtcHR5KCkgPyAibmlsIiA6IHByZWZpeChleHRlbmRzX2NsaWVudCk7CisKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLXNlcnZpY2UgIiA8PCBwcmVmaXgoc2VydmljZV9uYW1lXykgPDwgIiAiCisgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50OworCisgIGluZGVudF91cCgpOworCisgIGlmICggdHNlcnZpY2UtPmhhc19kb2MoKSkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIig6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKHRzZXJ2aWNlLT5nZXRfZG9jKCkpIDw8ICJcIikiOworICAgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmN0aW9uID0gKmZfaXRlcjsKKyAgICBzdHJpbmcgZm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworCisgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKDptZXRob2QgIiA8PCBwcmVmaXgoZm5hbWUpOworICAgIGZfdHlwZXNfIDw8ICIgKCIgPDwgc2lnbmF0dXJlIDw8ICIgIiAgPDwgdHlwZXNwZWMoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKSI7CisgICAgaWYgKHhtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZXhjZXB0aW9ucyAiIDsKKyAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoZl90eXBlc18sIGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmlzX29uZXdheSgpICkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpvbmV3YXkgdCI7CisgICAgfQorICAgIGlmICggKCpmX2l0ZXIpLT5oYXNfZG9jKCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOmRvY3VtZW50YXRpb24gXCIiCisgICAgICAgICAgICAgICA8PCBjbF9kb2NzdHJpbmcoKCpmX2l0ZXIpLT5nZXRfZG9jKCkpIDw8ICJcIiI7CisgIH0KKyAgICBmX3R5cGVzXyA8PCAiKSI7CisgIH0KKworICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6dHlwZXNwZWModF90eXBlICp0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0IC0+IGlzX2JpbmFyeSgpKXsKKyAgICByZXR1cm4gImJpbmFyeSI7CisgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHQpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm0gPSAodF9tYXAqKSB0OworICAgIHJldHVybiAiKHRocmlmdDptYXAgIiArIHR5cGVzcGVjKG0tPmdldF9rZXlfdHlwZSgpKSArICIgIiArCisgICAgICB0eXBlc3BlYyhtLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKHN0cnVjdCAiICsgcHJlZml4KHR5cGVfbmFtZSh0KSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIodGhyaWZ0Omxpc3QgIiArIHR5cGVzcGVjKCgodF9saXN0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6c2V0ICIgKyB0eXBlc3BlYygoKHRfc2V0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoZW51bSBcIiIgKyAoKHRfZW51bSopIHQpLT5nZXRfbmFtZSgpICsgIlwiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7CisgIH0KK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmdzdHJlYW0gcmVzOworICByZXMgPDwgIigiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPDwgIiAiOworICAgIH0KKyAgICByZXMgPDwgIigiICsgcHJlZml4KCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICB0eXBlc3BlYygoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAorICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgICIpIjsKKworCisgIH0KKyAgcmVzIDw8ICIpIjsKKyAgcmV0dXJuIHJlcy5zdHIoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBwcmVmaXggPSBwYWNrYWdlX29mKHByb2dyYW0pID09IHBhY2thZ2UoKSA/ICIiIDogcGFja2FnZV9vZihwcm9ncmFtKSArICI6IjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgbmFtZSA9IGxvd2VyY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY2wsCisgICAgIkNvbW1vbiBMaXNwIiwKKyAgICAiICAgIG5vX2FzZDogICAgICAgICAgRG8gbm90IGRlZmluZSBBU0RGIHN5c3RlbXMgZm9yIGVhY2ggZ2VuZXJhdGVkIFRocmlmdCBwcm9ncmFtLlxuIgorICAgICIgICAgc3lzX3ByZWY9ICAgICAgICBUaGUgcHJlZml4IHRvIGdpdmUgQVNERiBzeXN0ZW0gbmFtZXMuIERlZmF1bHQ6IHRocmlmdC1nZW4tXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY0NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KKyAqLworY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jb2NvYV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgcHJvbWlzZV9raXRfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIHBvZHNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInZhbGlkYXRlX3JlcXVpcmVkIikgPT0gMCkgeworICAgICAgICB2YWxpZGF0ZV9yZXF1aXJlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luY19jbGllbnRzIikgPT0gMCkgeworICAgICAgICBhc3luY19jbGllbnRzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInByb21pc2Vfa2l0IikgPT0gMCkgeworICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwb2RzIikgPT0gMCkgeworICAgICAgICBwb2RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY29jb2E6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNvY29hIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmYWlsdXJlQmxvY2tOYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGlzdE5hbWUpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXgoKTsKKyAgc3RkOjpzdHJpbmcgY29jb2FfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBjb2NvYV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYgPSBmYWxzZSwgYm9vbCBuZWVkc19tdXRhYmxlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBlbGVtZW50X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHlfdW5zZXQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGluY2x1ZGVfZXJyb3IpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgY2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOworICBzdGQ6OnN0cmluZyBib3godF90eXBlICp0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHVuYm94KHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpOworICBzdGQ6OnN0cmluZyBnZXR0ZXJfbmFtZShzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKKworICBib29sIHR5cGVfY2FuX2JlX2NvcHkodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgCisgICAgcmV0dXJuIHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorICAKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOworICBpbnQgZXJyb3JfY29uc3RhbnRfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF87CisgIGJvb2wgYXN5bmNfY2xpZW50c187CisgIGJvb2wgcHJvbWlzZV9raXRfOworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgcG9kc187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGNvY29hX3ByZWZpeF8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKTsKKworICAvLyB3ZSBoYXZlIGEgLmggaGVhZGVyIGZpbGUuLi4KKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIuaCI7CisgIHN0cmluZyBmX2hlYWRlcl9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2hlYWRlcl9uYW1lOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgLy8gLi4uYW5kIGEgLm0gaW1wbGVtZW50YXRpb24gZmlsZQorICBzdHJpbmcgZl9pbXBsX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIubSI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpICsgZl9pbXBsX25hbWU7CisgIGZfaW1wbF8ub3BlbihmX2ltcGxfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaW1wbF8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCkgPDwgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBlcnJvcl9jb25zdGFudF8gPSA2MDAwMDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsgIlxuIjsKK30KKworLyoqCisgKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbEZhY3RvcnkuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEFwcGxpY2F0aW9uRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sVXRpbC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvY2Vzc29yLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRCYXNlLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRBc3luY1RyYW5zcG9ydC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQmFzZUNsaWVudC5oIik7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFRocmlmdC8iIDw8ICppX2l0ZXIgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBpbmNsdWRlcyA8PCAiXCIiIDw8ICppX2l0ZXIgPDwgIlwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgaWYgKHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFByb21pc2VLaXQvUHJvbWlzZUtpdC5oPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluY2x1ZGVzIDw8ICJcIlByb21pc2VLaXQuaFwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgb3RoZXJfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3RoZXJfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpbmNsdWRlcyA8PCAiI2ltcG9ydCBcIiIKKyAgICAgICAgICAgICA8PCBvdGhlcl9pbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKQorICAgICAgICAgICAgIDw8IGNhcGl0YWxpemUob3RoZXJfaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgPDwgIi5oXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChzZXQtPmdldF9lbGVtX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgICA8PCAiTXV0YWJsZSIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBPYmplY3RpdmUtQywgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgaW5zdGVhZCB1c2luZworICogTlNfRU5VTSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DLiAgRm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgdGhlIG5hbWUgb2YKKyAqIHRoZSBlbnVtIGlzIHByZWZpeGVkIHRvIGVhY2ggZWxlbWVudCBpbiBrZWVwaW5nIHdpdGggQ29jb2EgJiBTd2lmdAorICogc3RhbmRhcmRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBOU19FTlVNKFNJbnQzMiwgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX2hlYWRlcl8gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgY29uc3RfaW50ZXJmYWNlIDw8ICJGT1VOREFUSU9OX0VYUE9SVCBOU1N0cmluZyAqIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworCisgIGJvb2wgbmVlZHNfY2xhc3MgPSBmYWxzZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGNvbnN0X2ludGVyZmFjZSA8PCAiRk9VTkRBVElPTl9FWFBPUlQgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmVlZHNfY2xhc3MgPSB0cnVlOworICAgIH0KKyAgfQorCisKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzIjsKKworICBpZiAobmVlZHNfY2xhc3MpIHsKKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsOworCisgICAgY29uc3RfaW50ZXJmYWNlIDw8ICJAaW50ZXJmYWNlICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgIiA6IE5TT2JqZWN0ICI7CisgICAgc2NvcGVfdXAoY29uc3RfaW50ZXJmYWNlKTsKKyAgICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7CisKKyAgICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGRlZmluZWQuCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBjb25zdF9pbnRlcmZhY2UgPDwgZW5kbCA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8ICJAZW5kIjsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCisgIGZfaW1wbF8gPDwgIk5TU3RyaW5nICoiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW4gPSAiCisgICAgICAgICAgPDwgIkBcIiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpblwiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgc2ltcGxlIGNvbnN0YW50IHZhbHVlcworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2ltcGxfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lOworICAgIHRfdHlwZSogdHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfY29udGFpbmVyKCkgJiYgIXR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGlmIChuZWVkc19jbGFzcykgeworCisgICAgZl9pbXBsXyA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKKyAgICBmX2ltcGxfIDw8ICIrICh2b2lkKSBpbml0aWFsaXplICI7CisgICAgc2NvcGVfdXAoZl9pbXBsXyk7CisKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9pbXBsXyA8PCBlbmRsOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShmX2ltcGxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2NvYV9wcmVmaXhfICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKworICAgIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX2ltcGxfIDw8IGVuZGwgPDwgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiICI7CisgICAgICAgIHNjb3BlX3VwKGZfaW1wbF8pOworICAgICAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX2ltcGxfIDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggcHJvdGVjdGVkIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgZ2V0dGVycyBhbmQgc2V0dGVycy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIE5TRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJlbnVtIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICAiID0gLSIgPDwgZXJyb3JfY29uc3RhbnRfKysgPDwgZW5kbAorICAgICAgICA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJOU0Vycm9yICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOU09iamVjdCAiOworICB9CisgIG91dCA8PCAiPFRCYXNlLCBOU0NvZGluZywgTlNDb3B5aW5nPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHlfaXNzZXQoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplciBmb3IgYWxsIGZpZWxkcworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKKyAqIGVhY2ggZmllbGQuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aCI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICsrbV9pdGVyOworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgeworICAgICAgb3V0IDw8ICIgIjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW5pdFdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoQ29kZXI6IChOU0NvZGVyICopIGRlY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0pIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQzMjogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBlbmNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgY29weSBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZXJyb3JXaXRoRG9tYWluOiBzZWxmLmRvbWFpbiBjb2RlOiBzZWxmLmNvZGUgdXNlckluZm86IHNlbGYudXNlckluZm9dOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFtzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgY29weV07IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB2YWw7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2ggbWV0aG9kIGZvciB0aGlzIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiLSAoTlNVSW50ZWdlcikgaGFzaCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU1VJbnRlZ2VyIGhhc2ggPSAxNzsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJJc1NldCA/IDI2NTQ0MzU3NjEgOiAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBoYXNoXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW0AoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIGhhc2hdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaXNFcXVhbCBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIGlzRXF1YWw6IChpZCkgYW5PYmplY3QiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmID09IGFuT2JqZWN0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbc3VwZXIgaXNFcXVhbDphbk9iamVjdF0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVthbk9iamVjdCBpc0tpbmRPZkNsYXNzOlsiIDw8IGNsYXNzX25hbWUgPDwgIiBjbGFzc11dKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgY2xhc3NfbmFtZSA8PCAiICpvdGhlciA9ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqKWFuT2JqZWN0OyIgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF8iIDw8IG5hbWUgPDwgIklzU2V0ICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICJJc1NldCkgfHwiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICJJc1NldCAmJiAiCisgICAgICAgICAgICA8PCAiKChfIiA8PCBuYW1lIDw8ICIgfHwgb3RoZXItPl8iIDw8IG5hbWUgPDwgIikgJiYgIgorICAgICAgICAgICAgPDwgIiFbXyIgPDwgbmFtZSA8PCAiIGlzRXF1YWw6b3RoZXItPl8iIDw8IG5hbWUgPDwgIl0pKSkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChfIiA8PCBuYW1lIDw8ICJJc1NldCAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiSXNTZXQpIHx8IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICIKKyAgICAgICAgICAgIDw8ICIoXyIgPDwgbmFtZSA8PCAiSXNTZXQgJiYgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICIgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIikpKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzdXBlciBpbml0V2l0aERvbWFpbjogIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3IiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIHN0cnVjdAorCisgICAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgorICAgIC8vIHNldHVwIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgICAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOworICAgIG91dCA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICBpZiAoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBvdXQgPDwgIlsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIG11dGFibGVDb3B5XTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBoYXNoIGFuZCBpc0VxdWFsIGZvciBOU09iamVjdAorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGNvcHkgZm9yIE5TT2JqZWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICItIChCT09MKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlNJbnQzMiBmaWVsZFR5cGU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyIGZpZWxkSUQ7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKKyAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsOworICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaWYgKHZhbGlkYXRlX3JlcXVpcmVkXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiB2YWxpZGF0ZTogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKKyAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQorICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIihfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisgKiAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgdmFsaWRhdGU6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX3RocmlmdEVycm9yKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUUHJvdG9jb2xFcnJvclVua25vd24iIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBAKFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNzaW5nUmVxdWlyZWRGaWVsZCksIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgorICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICBjYXBfbmFtZVswXSA9IHRvdXBwZXIoY2FwX25hbWVbMF0pOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5pbDsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCA9IE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorICBpZiAoZGVidWdfZGVzY3JpcHRpb25zXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVidWdEZXNjcmlwdGlvbiB7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTXV0YWJsZVN0cmluZyAqIG1zID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBAXCIiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodHR5cGUpIDw8ICJfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiKVwiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnFuYW1lX3RzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOyIKKyAgICAgICAgPDwgIiAgLy8gdGhyb3dzICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgfQorICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gYXN5bmNocm9ub3VzIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIgorICAgICAgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKHByb21pc2Vfa2l0XykgeworICAgICAgb3V0IDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IFRCYXNlQ2xpZW50IDwiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgorICAgICAgICAgIm91dFByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50QXN5bmMgOiBUQmFzZUNsaWVudCA8IgorICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmM+ICIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgIDw8ICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yCisgKnRoZQorICogc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIiA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XworICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCisgICAgb3N0cmVhbSYgb3V0LAorICAgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBuZWVkc19wcm90b2NvbCA/ICJvdXRQcm90b2NvbCIgOiAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIgorICAgICAgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiIHR5cGU6IFRNZXNzYWdlVHlwZU9ORVdBWSIgOiAiIHR5cGU6IFRNZXNzYWdlVHlwZUNBTEwiKQorICAgICAgPDwgIiBzZXF1ZW5jZUlEOiAwIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZmllbGROYW1lCisgICAgICAgIDw8ICJcIiIKKyAgICAgICAgICAgIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZmxkX2l0ZXIsIGZpZWxkTmFtZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKAorICAgIG9zdHJlYW0mIG91dCwKKyAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICopIHJlc3VsdCAiOworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJwcm90b2NvbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiZXJyb3IiOworICAgIH0KKyAgfQorICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICBvdXQgPDwgIjogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KKworICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqaW5jb21pbmdFeGNlcHRpb24gPSBbc2VsZiBjaGVja0luY29taW5nTWVzc2FnZUV4Y2VwdGlvbjogaW5Qcm90b2NvbF07IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGluY29taW5nRXhjZXB0aW9uKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IGluY29taW5nRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgorICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUgPDwgIiAqIHJlc3VsdGVyID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtyZXN1bHRlciByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuc3VjY2Vzc0lzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipyZXN1bHQgPSByZXN1bHRlci5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW3Jlc3VsdGVyICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBAXCIiCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCAiICI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0KKyAgfQorICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodGZ1bmN0aW9uKSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gJ3NlbmRfJyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmFpbHVyZUJsb2NrTmFtZSkgeworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgIiAiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9CisgIH0KKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCAiIHByb3RvY29sIjsKKyAgfQorICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBmYWlsdXJlQmxvY2tOYW1lIDw8ICIodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnQiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXJzCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSAiCisgICAgICAgICAiYW5PdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpblByb3RvY29sID0gYW5JblByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IGFuT3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX3Jlc3VsdDsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogJl9fcmVzdWx0IGVycm9yOiBfX3RocmlmdEVycm9yXSkgIgorICAgICAgICAgICAgPDwgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX3Jlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gQChfX3Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIGl0cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudEFzeW5jIjsKKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBuYW1lIDw8ICIgKCkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgYVByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSBhVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IGFQcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnNwb3J0RmFjdG9yeSA9IGFUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBbdHJhbnNwb3J0RmFjdG9yeSBuZXdUcmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlciwgImZhaWx1cmVCbG9jayIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbdHJhbnNwb3J0IGZsdXNoV2l0aENvbXBsZXRpb246XnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICI6ICZyZXN1bHQgcHJvdG9jb2wiOworICAgICAgfQorICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmFpbHVyZUJsb2NrKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3BvbnNlQmxvY2soIjsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkgJiYgISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGZhaWx1cmU6ZmFpbHVyZUJsb2NrXTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFByb21pc2UgZnVuY3Rpb24KKyAgICBpZiAocHJvbWlzZV9raXRfKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtBbnlQcm9taXNlIHByb21pc2VXaXRoUmVzb2x2ZXJCbG9jazpeKFBNS1Jlc29sdmVyIHJlc29sdmVyKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydD4gdHJhbnNwb3J0ID0gW3RyYW5zcG9ydEZhY3RvcnkgbmV3VHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIsICJyZXNvbHZlciIpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlt0cmFuc3BvcnQgZmx1c2hXaXRoQ29tcGxldGlvbjpeeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIjogJnJlc3VsdCBwcm90b2NvbCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgICBzY29wZV91cChvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIoIjsKKyAgICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAiQFlFUyI7CisgICAgICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIkAocmVzdWx0KSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9XTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn1dOyIgPDwgZW5kbDsKKworICAgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgYWN0dWFsIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KKyAqIGZvciB0aGUgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworCisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiBzZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtZXRob2RNYXA7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXIKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgYVNlcnZpY2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VydmljZSA9IGFTZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJtZXRob2RNYXAgPSBbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsiIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOmVycm9yOik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21ldGhvZE1hcCBzZXRWYWx1ZTogaW52b2NhdGlvbiBmb3JLZXk6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnc2VydmljZScgbWV0aG9kIHdoaWNoIHJldHVybnMgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8gcHJvY2Vzc29yCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBTSW50MzIgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgU0ludDMyIHNlcUlEOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IFRUeXBlU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgTlNFcnJvciAqIHggPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWV9XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVFWENFUFRJT04iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbeCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIC8vIE5TSW52b2NhdGlvbiBkb2VzIG5vdCBjb25mb3JtIHRvIE5TQ29weWluZyBwcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGkgPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiAiCisgICAgICAgICAgICAgICAgICAgICAiW2ludm9jYXRpb24gbWV0aG9kU2lnbmF0dXJlXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0U2VsZWN0b3I6IFtpbnZvY2F0aW9uIHNlbGVjdG9yXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZzZXFJRCBhdEluZGV4OiAyXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJmluUHJvdG9jb2wgYXRJbmRleDogM107IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZvdXRQcm90b2NvbCBhdEluZGV4OiA0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJl9fdGhyaWZ0RXJyb3IgYXRJbmRleDogNV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLAorICAvLyBhbmQgd3JpdGVzIHJlc3VsdHMKKyAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NfIiA8PCBmdW5uYW1lCisgICAgICAgIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChTSW50MzIpIHNlcUlEIGluUHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAiCisgICAgICAgICAgICIoaWQ8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgYXJnc3R5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFsiIDw8IGFyZ3N0eXBlIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVthcmdzIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBwcmVwYXJlIHRoZSByZXN1bHQgaWYgbm90IG9uZXdheQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdHR5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0dHlwZSA8PCAiICogcmVzdWx0ID0gWyIgPDwgcmVzdWx0dHlwZSA8PCAiIG5ld107IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAorICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiQk9PTCI7CisgICAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiTlNOdW1iZXIgKiI7CisgICAgfQorICAgIG91dCA8PCAiIHNlcnZpY2VSZXN1bHQgPSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8ICJbc2VydmljZSAiIDw8IGZ1bm5hbWU7CisgICAgLy8gc3VwcGx5aW5nIGFyZ3VtZW50cworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgIiBlcnJvciI7CisgICAgfQorICAgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlcnZpY2VSZXN1bHQpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICIgPDwgdW5ib3goKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic2VydmljZVJlc3VsdCIpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBvdXQgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZVJFUExZIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRCIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2w6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlOihVSW50OCAqKSYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzI6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZTomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgfQorICAgIG91dCA8PCAiKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGFsbG9jYXRlcyB0aGUgc3RydWN0IGFuZCBpbnZva2VzIHJlYWQ6CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpCisgICAgICAgICAgICAgIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlQXJyYXkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9CisgIC8vIEZJWE1FIC0gdGhlIGNvZGUgYWJvdmUgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgb2YKKyAgLy8gdGhlIGNvbnRhaW5lcnMgYmVpbmcgcmVhZCBtYXRjaCB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUKKyAgLy8gY29udGFpbmVycyB3ZSBhcmUgcmVhZGluZyBpbnRvLiAgRG9lcyB0aGF0IG1hdHRlcj8KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIgorICAgICAgICAgICAgICA8PCBzaXplIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRMaXN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFRha2UgYSB2YXJpYWJsZSBvZiBhIGdpdmVuIHR5cGUgYW5kIHdyYXAgaXQgaW4gY29kZSB0byBtYWtlIGl0CisgKiBzdWl0YWJsZSBmb3IgcHV0dGluZyBpbnRvIGEgY29udGFpbmVyLCBpZiBuZWNlc3NhcnkuICBCYXNpY2FsbHksCisgKiB3cmFwIHNjYWxlciBwcmltaXRpdmVzIGluIE5TTnVtYmVyIG9iamVjdHMuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Ym94KHRfdHlwZSogdHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lKSB7CisKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIkAoIiArIGZpZWxkX25hbWUgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjYW4ndCBib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiQCgiICsgZmllbGRfbmFtZSArICIpIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIGRvIG5vdGhpbmcKKyAgcmV0dXJuIGZpZWxkX25hbWU7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIGFjdHVhbCB2YWx1ZSBmcm9tIGEgYm94ZWQgdmFsdWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp1bmJveCh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBpbnRWYWx1ZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY2FuJ3QgdW5ib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBib29sVmFsdWVdIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAiKChTSW50OClbIiArIGZpZWxkX25hbWUgKyAiIGNoYXJWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gIigoU0ludDE2KVsiICsgZmllbGRfbmFtZSArICIgc2hvcnRWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIigoU0ludDMyKVsiICsgZmllbGRfbmFtZSArICIgbG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiKChTSW50NjQpWyIgKyBmaWVsZF9uYW1lICsgIiBsb25nTG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBkb3VibGVWYWx1ZV0iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gZG8gbm90aGluZworICByZXR1cm4gZmllbGRfbmFtZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgc2V0T2JqZWN0OiAiIDw8IGJveCh2YWxUeXBlLCB2YWwpCisgICAgICAgICAgICAgIDw8ICIgZm9yS2V5OiAiIDw8IGJveChrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF90eXBlKiB0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSB0byBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgZmllbGQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogKFVJbnQ4KSIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgIH0KKyAgICBvdXQgPDwgIikgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBjb250YWluZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIKKyAgICAgICAgICAgICAgICA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIHN0cmluZyBrZXk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBrZXkgPSB0bXAoImtleSIpOworICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGtleUVudW1lcmF0b3JdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGtleSA9IHRtcCgib2JqIik7CisgICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIgb2JqZWN0RW51bWVyYXRvcl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAga2V5ID0gdG1wKCJpZHgiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleQorICAgICAgICAgICAgICAgIDw8ICIrKykiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU2V0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTGlzdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCB1bmJveChrZmllbGQuZ2V0X3R5cGUoKSwga2V5KSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiWyIgKyBtYXBOYW1lICsgIiBvYmplY3RGb3JLZXk6ICIgKyBrZXkgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB1bmJveCh2ZmllbGQuZ2V0X3R5cGUoKSwgdmZpZWxkLmdldF9uYW1lKCkpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVsZW1lbnROYW1lKSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiWyIgKyBsaXN0TmFtZSArICIgb2JqZWN0QXRJbmRleDogIiArIGluZGV4ICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVmaWVsZC5nZXRfbmFtZSgpKSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSwgaS5lLiBOU0RpY3Rpb25hcnk8S2V5LFZhbHVlPiAqCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmLCBib29sIG5lZWRzX211dGFibGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBzdHJpbmcgbmFtZSA9IChuZWVkc19tdXRhYmxlICYmIHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCktPmlzX2NvbnRhaW5lcigpKSA/ICJNdXRhYmxlIiArIHR0eXBlLT5nZXRfbmFtZSgpIDogdHR5cGUtPmdldF9uYW1lKCk7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgcmV0dXJuIHByb2dyYW0gPyAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIG5hbWUpIDogbmFtZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlRGljdGlvbmFyeSIgOiAiTlNEaWN0aW9uYXJ5IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlU2V0IiA6ICJOU1NldCI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlQXJyYXkiIDogIk5TQXJyYXkiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgeworICAgIC8vIENoZWNrIGZvciBwcmVmaXgKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7CisgICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIGlmICghY2xhc3NfcmVmKSB7CisgICAgcmVzdWx0ICs9ICIgKiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSBmb3IgY29udGFpbmVyIHR5cGVzCisgKgorICogQHBhcmFtIHR0eXBlIHRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZWxlbWVudF90eXBlX25hbWUodF90eXBlKiBldHlwZSkgeworCisgIHRfdHlwZSogdHR5cGUgPSBldHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIGlmIChldHlwZS0+aXNfdHlwZWRlZigpICYmIHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZShldHlwZSk7CisgIH0KKworICBzdHJpbmcgcmVzdWx0OworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJlc3VsdCA9ICJOU0RhdGEgKiI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gIk5TU3RyaW5nICoiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9ICJOU051bWJlciAqIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgPSAiTlNOdW1iZXIgKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU0RpY3Rpb25hcnk8IiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU1NldDwiICsgZWxlbWVudF90eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgPSAiTlNBcnJheTwiICsgZWxlbWVudF90eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+ICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlc3VsdCA9IGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKSArICIgKiI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiTlNEYXRhICoiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIk5TU3RyaW5nICoiOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQk9PTCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJTSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU0ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gIlNJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFsiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIG5ld107IgorICAgICAgICA8PCBlbmRsOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIjoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBtYXBvdXQ7CisgICAgaW5kZW50KG1hcG91dCk7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG1hcG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG1hcG91dCA8PCBuYW1lIDw8ICIgPSBAeyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIG1hcG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG1hcG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBtYXBvdXQgPDwgIn0iOworICAgIG91dCA8PCBtYXBvdXQuc3RyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBsaXN0b3V0OworICAgIGluZGVudChsaXN0b3V0KTsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBsaXN0b3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgbGlzdG91dCA8PCBuYW1lIDw8ICIgPSBAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGxpc3RvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBsaXN0b3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIGxpc3RvdXQgPDwgIl0iOworICAgIG91dCA8PCBsaXN0b3V0LnN0cigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBzZXRvdXQ7CisgICAgaW5kZW50KHNldG91dCk7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBzZXRvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBzZXRvdXQgPDwgbmFtZSA8PCAiID0gW05TU2V0IHNldFdpdGhBcnJheTpAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHNldG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIHNldG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBzZXRvdXQgPDwgIl1dIjsKKyAgICBvdXQgPDwgc2V0b3V0LnN0cigpOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0KSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvLyBXZSBtdXN0IGhhbmRsZSBiaW5hcnkgY29uc3RhbnQgYnV0IHRoZSBzeW50YXggb2YgSURMIGRlZmluZXMKKyAgICAgIC8vIG5vdGhpbmcgYWJvdXQgYmluYXJ5IGNvbnN0YW50LgorICAgICAgLy8gICBpZiB0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgIC8vICAgICAgLy8gYmluYXJ5IGNvZGUKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgaWYgKGJveF9pdCkgeworICAgIHJldHVybiBib3godHlwZSwgcmVuZGVyLnN0cigpKTsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisjaWYgMAorLyoqCitPUklHSU5BTAorICogU3BpdCBvdXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKHZhbC5zaXplKCkgPiAwKQorICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIC8vIEZJWE1FIFRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGluaXRXaXRoWFhYCisgICAgICAvLyAgICAgICBpbml0aWFsaXplciBhbmQgY2F1c2VzIGNvbXBpbGUgZXJyb3IuCisgICAgICAvLyAgICAgICBUcnk6IHRlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGFuZCB0ZXN0L1NtYWxsVGVzdC50aHJpZnQKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICByZW5kZXIgPDwgY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIjogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICByZW5kZXIgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzQW5kS2V5czogIjsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHZhbCA8PCAiLCAiIDw8IGtleTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlciA8PCAiW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TU2V0IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImRvbid0IGtub3cgaG93IHRvIHJlbmRlciBjb25zdGFudCBmb3IgdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoYm94X2l0KSB7CisgICAgcmV0dXJuIGJveCh0eXBlLCByZW5kZXIuc3RyKCkpOworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKyNlbmRpZgorCisvKioKKyAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgcmVuZGVyIDw8ICJAcHJvcGVydHkgKCI7CisKKyAgaWYgKHR5cGVfY2FuX2JlX2NvcHkodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHJlbmRlciA8PCAiY29weSwgIjsKKyAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICByZW5kZXIgPDwgInN0cm9uZywgIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgImFzc2lnbiwgIjsKKyAgfQorCisgIHJlbmRlciA8PCAibm9uYXRvbWljKSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIKKyAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IjsKKworICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgbmFtZSBpcyBhbiBPYmplY3RpdmUtQyByZXR1cm4gKzEgY291bnQgc2lnbmFsCisgIGlmICgodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDMgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDMpID09ICJuZXciKSB8fAorICAgICAgKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSA2ICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCw2KSA9PSAiY3JlYXRlIikgfHwKKyAgICAgICh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gNSAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsNSkgPT0gImFsbG9jIikpIHsKKyAgICAvLyBMZXQgT2JqZWN0aXZlLUMga25vdyBub3QgdG8gcmV0dXJuICsxIGZvciBvYmplY3QgcG9pbnRlcnMKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICByZW5kZXIgPDwgZW5kbDsKKyAgICAgIHJlbmRlciA8PCAiLSAoIiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX21ldGhvZF9mYW1pbHkobm9uZSkpKTsiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIkBwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIEJPT0wgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIklzU2V0OyI7Cit9CisKKy8qKgorICogRGVjbGFyZXMgcHJvcGVydHkgdW5zZXQgbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIi0gKHZvaWQpIHVuc2V0IiArIGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSBlYXJseSBvdXQgcmV0dXJuIHN0YXRlbWVudAorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgaW52YWxpZCByZXR1cm4gc3RhdG1lbnQKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjppbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodF9mdW5jdGlvbiAqdGZ1bmN0aW9uKSB7CisgIGlmICgodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgcmV0dXJuICJyZXR1cm4gTk87IjsKKyAgfQorICByZXR1cm4gInJldHVybiBuaWw7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0ID0gIihCT09MKSI7CisgIH0KKyAgZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgPSAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikiOworICB9CisgIGVsc2UgeworICAgIHJlc3VsdCA9ICIoTlNOdW1iZXIgKikiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGluY2x1ZGVfZXJyb3IpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3BvbnNlX3BhcmFtID0gInZvaWQgKF4pKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIih2b2lkKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBpbmNsdWRlX2Vycm9yKQorICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiIHJlc3BvbnNlIiA6ICIiKSArICI6ICgiCisgICsgcmVzcG9uc2VfcGFyYW0gKyAiKSByZXNwb25zZUJsb2NrICIKKyAgKyAiZmFpbHVyZSA6IChUQXN5bmNGYWlsdXJlQmxvY2spIGZhaWx1cmVCbG9jayI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYSBwcm9taXNlIGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiAiKEFueVByb21pc2UgKikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiB0eXBlcyBhbmQgbmFtZXMsIHN1aXRhYmxlIGZvciBhbgorICogb2JqZWN0aXZlLWMgcGFyYW1ldGVyIGxpc3QKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBhcmdQcmVmaXggPSAiIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ1ByZWZpeCA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSBhcmdQcmVmaXggKyAiOiAoIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIikgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIHJlc3VsdCArPSAiIHByb3RvY29sIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICI6IChpZDxUUHJvdG9jb2w+KSAiICsgcHJvdG9jb2xfbmFtZTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIGlmIChpbmNsdWRlX2Vycm9yKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgcmVzdWx0ICs9ICIgZXJyb3IiOworICAgIH0KKyAgICByZXN1bHQgKz0gIjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGVTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGVCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZUJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZUkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGVJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZURPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGVJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGVNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZVNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZUxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiJWhpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIlZiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiJWkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgY2FzdCBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIiOyAvLyAiXFxcIiVAXFxcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIiI7IC8vICIlaGkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIoaW50KSI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIiI7IC8vICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWYiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsgLy8gIiVpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X2Nhc3RfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY2FsbCB0byBhIGZpZWxkJ3Mgc2V0dGVyLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgRmllbGQgdGhlIHNldHRlciBpcyBiZWluZyBjYWxsZWQgb24KKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSB0byBwYXNzIHRvIHNldHRlcgorICovCisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHJldHVybiAic2VsZi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA9ICIgKyBmaWVsZE5hbWUgKyAiOyI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY29jb2EsCisgICAgIkNvY29hIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgdmFsaWRhdGVfcmVxdWlyZWQ6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFRocm93cyBleGNlcHRpb24gaWYgYW55IHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBzZXQuXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBwb2RzOiAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydHMgaW4gQ29jb3BvZHMgZnJhbWV3b3JrIGZvcm1hdC5cbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMwMzYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDQ5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBDKysgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMgbGVnaXRpbWFjeSBpbmNhcm5hdGUuCisgKgorICovCitjbGFzcyB0X2NwcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jcHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworCisgICAgZ2VuX3B1cmVfZW51bXNfID0gZmFsc2U7CisgICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IGZhbHNlOworICAgIGdlbl9jb2Jfc3R5bGVfID0gZmFsc2U7CisgICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IGZhbHNlOworICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSBmYWxzZTsKKyAgICBnZW5fdGVtcGxhdGVzXyA9IGZhbHNlOworICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSBmYWxzZTsKKyAgICBnZW5fbW92ZWFibGVfID0gZmFsc2U7CisgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl9ub19za2VsZXRvbl8gPSBmYWxzZTsKKworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1cmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9wdXJlX2VudW1zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImluY2x1ZGVfcHJlZml4IikgPT0gMCkgeworICAgICAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29iX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fY29iX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2NsaWVudF9jb21wbGV0aW9uIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0ZW1wbGF0ZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl90ZW1wbGF0ZXNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IChpdGVyLT5zZWNvbmQgPT0gIm9ubHkiKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibW92ZWFibGVfdHlwZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9tb3ZlYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fb3N0cmVhbV9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc2tlbGV0b24iKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19za2VsZXRvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNwcDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3BwIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7IH0KKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsgfQorICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y3BldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KTsKKyAgLyoKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGNvYl9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUsIGJvb2wgc3RhcnRfY29tbWEgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCA9IGZhbHNlKTsKKworICBib29sIGlzX3JlZmVyZW5jZSh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlZmVyZW5jZSgpOyB9CisKKyAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICB9CisKKyAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7IHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7IH0KKworICAvKioKKyAgICogVGhlIGNvbXBpbGVyIG9wdGlvbiAibm9fdGhyaWZ0X29zdHJlYW1faW1wbCIgY2FuIGJlIHVzZWQgdG8gcHJldmVudAorICAgKiB0aGUgY29tcGlsZXIgZnJvbSBlbWl0dGluZyBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wZXJhdG9yIDw8LiAgSW4gdGhpcworICAgKiBjYXNlIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGFueSBuZWVkZWQgdG8gYnVpbGQuCisgICAqCisgICAqIFRvIGRpc2FibGUgdGhpcyBvbiBhIHBlciBzdHJ1Y3R1cmUgYmFzZXMsIG9uZSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQKKyAgICogdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiB0byBwcmV2ZW50IHRocmlmdCBmcm9tIGVtaXR0aW5nIGFuCisgICAqIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mKS4KKyAgICoKKyAgICogU2VlIEFubm90YXRpb25UZXN0IGZvciB2YWxpZGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbiBmZWF0dXJlLgorICAgKi8KKyAgYm9vbCBoYXNfY3VzdG9tX29zdHJlYW0odF90eXBlKiB0dHlwZSkgY29uc3QgeworICAgIHJldHVybiAoZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXykgfHwKKyAgICAgICAgICAgKHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLmN1c3RvbW9zdHJlYW0iKSAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5jbHVkZSBwcmVmaXggdG8gdXNlIGZvciBhIGZpbGUgZ2VuZXJhdGVkIGJ5IHByb2dyYW0sIG9yIHRoZQorICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gaW5jbHVkZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdDsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHVyZSBlbnVtcyBmb3IgVGhyaWZ0IGVudW1zLCBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX3B1cmVfZW51bXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAorICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzICYgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAqLworICBib29sIGdlbl9tb3ZlYWJsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG9zdHJlYW0gZGVmaW5pdGlvbnMKKyAgICovCisgIGJvb2wgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIHVzZSBhIHBhdGggcHJlZml4IGluIG91ciAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZvciBvdGhlcgorICAgKiB0aHJpZnQtZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KKyAgICovCisgIGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4XzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgIkNvbnRpbnVhdGlvbiBPQmplY3QiLXN0eWxlIGNsYXNzZXMgYXMgd2VsbC4KKyAgICovCisgIGJvb2wgZ2VuX2NvYl9zdHlsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGdlbmVyYXRpbmcgdGhlIGRlZmF1bHQgb3BlYXJ0b3JzID09LCAhPSBhbmQgPC4KKyAgICovCisgIGJvb2wgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXzsKKworICAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNrZWxldG9uLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fc2tlbGV0b25fOworCisgIC8qKgorICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5CisgICAqLworCisgIHN0ZDo6c3RyaW5nIG5zX29wZW5fOworICBzdGQ6OnN0cmluZyBuc19jbG9zZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKKyAgICogZnVuY3Rpb24uCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX3RjY187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RjY187CisKKyAgLy8gVGhlIFByb2Nlc3NvckdlbmVyYXRvciBpcyB1c2VkIHRvIGdlbmVyYXRlIHBhcnRzIG9mIHRoZSBjb2RlLAorICAvLyBzbyBpdCBuZWVkcyBhY2Nlc3MgdG8gbWFueSBvZiBvdXIgcHJvdGVjdGVkIG1lbWJlcnMgYW5kIG1ldGhvZHMuCisgIC8vCisgIC8vIFRPRE86IFRoZSBjb2RlIHJlYWxseSBzaG91bGQgYmUgY2xlYW5lZCB1cCBzbyB0aGF0IGhlbHBlciBtZXRob2RzIGZvcgorICAvLyB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIGdlbmVyYXRvciBjbGFzc2VzCisgIC8vIHRoZW1zZWx2ZXMuCisgIGZyaWVuZCBjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3I7Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5oIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUpOworCisgIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5jcHAiOworICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gSWYgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBpdCBhcHBlYXJzIHRvIGp1c3QgZGlzY2FyZCBkYXRhLAorICAgIC8vIHdoaWNoIGlzIGZpbmUuCisgICAgc3RyaW5nIGZfdHlwZXNfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMudGNjIjsKKyAgICBmX3R5cGVzX3RjY18ub3BlbihmX3R5cGVzX3RjY19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfdHlwZXNfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxpb3Nmd2Q+IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQmFzZS5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgLy8gSW5jbHVkZSBDKyt4eCBjb21wYXRpYmlsaXR5IGhlYWRlcgorICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworCisgICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycworICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gVGhlIHN3YXAoKSBjb2RlIG5lZWRzIDxhbGdvcml0aG0+IGZvciBzdGQ6OnN3YXAoKQorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8YWxnb3JpdGhtPiIgPDwgZW5kbDsKKyAgLy8gZm9yIG9wZXJhdG9yPDwKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPG9zdHJlYW0+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gT3BlbiBuYW1lc3BhY2UKKyAgbnNfb3Blbl8gPSBuYW1lc3BhY2Vfb3Blbihwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworICBuc19jbG9zZV8gPSBuYW1lc3BhY2VfY2xvc2UocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBmX3R5cGVzXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc190Y2NfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIG91dHB1dCBmaWxlcy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgbmFtZXNwYWNlCisgIGZfdHlwZXNfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgbnNfY2xvc2VfIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzLnRjYyBmaWxlIGZyb20gdGhlIHR5cGVzIGhlYWRlciBmaWxlLAorICAvLyBzbyBjbGllbnRzIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBpbmNsdWRlIHRoZSB0Y2MgZmlsZS4KKyAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbi4KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBpZm5kZWYKKyAgZl90eXBlc18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworICBmX3R5cGVzX3RjY18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpIHsKKyAgZiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGYgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmKSA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKKyAgICBpZiAoaW5jbHVkZV92YWx1ZXMpIHsKKyAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICB9CisgIH0KKworICBmIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCisgKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisKKyAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgZW51bV9uYW1lID0gInR5cGUiOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzdHJ1Y3QgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7CisKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7CisKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLyoqCisgICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgKi8KKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOworICB9CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7CisgIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IGNoYXIqIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgIlwiIiwgIlwiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUyg6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKCIgPDwgY29uc3RhbnRzLnNpemUoKSA8PCAiLCBfayIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzIgorICAgICAgICAgICAgICAgIDw8ICIsIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXMpLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoLTEsIE5VTEwsIE5VTEwpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChmX3R5cGVzXywgdGVudW0pOworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdGVudW0pOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pIHsKKworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgaWYgKGdlbl9wdXJlX2VudW1zXykgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjo6dHlwZSYiOworICB9CisgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIC8vIElmIHdlJ3ZlIGJlZW4gdG9sZCB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIHdpbGwgcHJvdmlkZSBhbiBvc3RyZWFtCisgIC8vIG9wZXJhdG9yIGRlZmluaXRpb24gdGhlbiB3ZSBvbmx5IG1ha2UgYSBkZWNsYXJhdGlvbjoKKworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0ZW51bSkpIHsKKyAgICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgICAgfQorICAgIG91dCA8PCAiIHZhbCkgIjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfIgorICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfVkFMVUVTX1RPX05BTUVTLmZpbmQodmFsKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXQgIT0gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZW5kKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgaXQtPnNlY29uZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IHN0YXRpY19jYXN0PGludD4odmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuaCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuY3BwIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19pbXBsOworICBmX2NvbnN0c19pbXBsLm9wZW4oZl9jb25zdHNfaW1wbF9uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfY29uc3RzX2ltcGwgPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfY29uc3RzIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaW1wbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgIiAgIgorICAgICAgICAgICA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfY29uc3RzIDw8ICJ9OyIgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50czo6IiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbCA8PCAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGwgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl9jb25zdHMuY2xvc2UoKTsKKworICBmX2NvbnN0c19pbXBsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9jb25zdHNfaW1wbC5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZiAoaXNfbm9ucmVxdWlyZWRfZmllbGQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAic3RhdGljX2Nhc3Q8ZG91YmxlPigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMgYW5kIGEgcmVhZC93cml0ZSgpIGZ1bmN0aW9uLCBwbHVzIGEgbWlycm9yaW5nIGlzc2V0CisgKiBpbm5lciBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaW1wbF8sIGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUsIHRydWUpOworCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl90eXBlc190Y2NfIDogZl90eXBlc19pbXBsXyk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgfQorICBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL3RydWUpOworfQorCituYW1lc3BhY2UgeworLy8gSGVscGVyIHRvIGNvbnZlcnQgYSB2YXJpYWJsZSB0byBydmFsdWUsIGlmIG1vdmUgaXMgZW5hYmxlZAorc3RkOjpzdHJpbmcgbWF5YmVNb3ZlKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdGhlciwgYm9vbCBtb3ZlKSB7CisgIGlmIChtb3ZlKSB7CisgICAgcmV0dXJuICJzdGQ6Om1vdmUoIiArIG90aGVyICsgIikiOworICB9CisgIHJldHVybiBvdGhlcjsKK30KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKSB7CisKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgIiggIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSAiOworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiOiBURXhjZXB0aW9uKCkgIjsKKyAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3V0LCB0c3RydWN0LCAvKmlzX21vdmU9Ki9mYWxzZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL3RydWUpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKSB7CisgIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOworCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Om9wZXJhdG9yPSgiOworCisgIGlmIChpc19tb3ZlKSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKKyAgfQorICBvdXQgPDwgdG1wX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKnRoaXM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZQorICoKKyAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3VzZXJfc3RydWN0ICYmICFnZW5fdGVtcGxhdGVzXykgeworICAgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgdmlydHVhbCA6OmFwYWNoZTo6dGhyaWZ0OjpUQmFzZSI7CisgICAgfQorICB9CisKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBXcml0ZSB0aGUgaXNzZXQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIG91dHNpZGUgdGhlIGNsYXNzLiBUaGlzIG1ha2VzCisgIC8vIHRoZSBnZW5lcmF0ZWQgY29kZSBhbWVuYWJsZSB0byBwcm9jZXNzaW5nIGJ5IFNXSUcuCisgIC8vIFdlIG9ubHkgZGVjbGFyZSB0aGUgc3RydWN0IGlmIGl0IGdldHMgdXNlZCBpbiB0aGUgY2xhc3MuCisKKyAgLy8gSXNzZXQgc3RydWN0IGhhcyBib29sZWFuIGZpZWxkcywgYnV0IG9ubHkgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQoKSAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3RyaW5nIGlzU2V0ID0gKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiOiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6MTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIE9wZW4gc3RydWN0IGRlZgorICBvdXQgPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghcG9pbnRlcnMpIHsKKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IiA8PCBlbmRsOworCisgICAgLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEFzc2lnbm1lbnQgT3BlcmF0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImIG9wZXJhdG9yPShjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOworCisgICAgYm9vbCBpbml0X2N0b3IgPSBmYWxzZTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSB8fCB0LT5pc19lbnVtKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSB7CisgICAgICAgIHN0cmluZyBkdmFsOworICAgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUodCkgKyAiKSI7CisgICAgICAgIH0KKyAgICAgICAgZHZhbCArPSAodC0+aXNfc3RyaW5nKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSA/ICIiIDogIjAiOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOworICAgICAgICB9CisgICAgICAgIGlmICghaW5pdF9jdG9yKSB7CisgICAgICAgICAgaW5pdF9jdG9yID0gdHJ1ZTsKKyAgICAgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIFRPRE8oZHJlaXNzKTogV2hlbiBldmVyeXRoaW5nIGVsc2UgaW4gVGhyaWZ0IGlzIHBlcmZlY3QsCisgICAgLy8gZG8gbW9yZSBvZiB0aGVzZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmICghdC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIG5vZXhjZXB0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlY2xhcmUgYWxsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVhZCkgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKHBvaW50ZXJzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBkZWZhdWx0IG9wZXJhdG9ycz8KKyAgICBpZiAoIWdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18pIHsKKyAgICAgIC8vIEdlbmVyYXRlIGFuIGVxdWFsaXR5IHRlc3Rpbmcgb3BlcmF0b3IuICBNYWtlIGl0IGlubGluZSBzaW5jZSB0aGUgY29tcGlsZXIKKyAgICAgIC8vIHdpbGwgZG8gYSBiZXR0ZXIgam9iIHRoYW4gd2Ugd291bGQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlubGluZSBpdC4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiAiCisgICAgICAgICAgPDwgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCisgICAgICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gcmhzLl9faXNzZXQuIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICYmICEoIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZyaHMpIGNvbnN0IHsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQorICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBpZiB0aGV5IHdpc2ggdG8gdXNlIGl0LiAgKFRoZXkKKyAgICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPCAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJlYWQpIHsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmICh3cml0ZSkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCB3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiOworICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIE5VTEwpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibXV0YWJsZSBzdGQ6OnN0cmluZyB0aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoc3dhcCkgeworICAgIC8vIEdlbmVyYXRlIGEgbmFtZXNwYWNlLXNjb3BlIHN3YXAoKSBmdW5jdGlvbgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiAmYik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIC8vIEdldCBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gRGVzdHJ1Y3RvcgorICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgZm9yY2VfY3BwX291dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6fiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIigpIG5vZXhjZXB0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvcmNlX2NwcF9vdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBpZiAoc2V0dGVycykgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiCisgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOworICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KKyAgICAgIC8vIGZvciBvcHRpb25hbCBmaWVsZHMgY2hhbmdlIF9faXNzZXQubmFtZSB0byB0cnVlCisgICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIE1ha2VzIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGdlbiBhIHN0cnVjdCByZWFkZXIuCisgKgorICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgeworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6cmVhZChQcm90b2NvbF8qIGlwcm90KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjpyZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCppcHJvdCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgY29uc3QgY2hhciogaXNzZXRfcHJlZml4ID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImlzc2V0XyI7CisKKyNpZiAwCisgICAgICAgICAgLy8gVGhpcyBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgZmllbGQgaXMgZW5jb3VudGVyZWQgdHdpY2UuCisgICAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCisgICAgICAgICAgLy8gZm9yIHBlb3BsZSByZWNvbXBpbGluZyB0aHJpZnQgdG8gaW5jbHVkZSBpdC4KKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyNlbmRpZgorCisgICAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCisgICAgICAgICAgPDwKKyAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cworICAgICAgICAgIC8vIGhhdmUgYSBjb21tb24gYmFzZSBjbGFzcy4KKyAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gLy8hZmllbGRzLmVtcHR5KCkKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0CisgIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCisgIG91dCA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUT3V0cHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCpvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY2hlY2tfaWZfc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpOworICAgIGlmIChjaGVja19pZl9zZXQpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpZiAoY2hlY2tfaWZfc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgJ30nOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFN0cnVjdCB3cml0ZXIgZm9yIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCB3aGljaCBjYW4gaGF2ZSBvbmx5IG9uZSBvZiBpdHMKKyAqIGZpZWxkcyBzZXQgYW5kIGRvZXMgYSBjb25kaXRpb25hbCBpZiBlbHNlIGxvb2sgdXAgaW50byB0aGUgX19pc3NldCBmaWVsZAorICogb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgc3dhcCBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3N3YXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgc3dhcCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYSwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiICZiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBMZXQgYXJndW1lbnQtZGVwZW5kZW50IG5hbWUgbG9va3VwIGZpbmQgdGhlIGNvcnJlY3Qgc3dhcCgpIGZ1bmN0aW9uIHRvCisgIC8vIHVzZSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZXMuICBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBhcmd1bWVudHMnCisgIC8vIG5hbWVzcGFjZXMsIGZhbGwgYmFjayB0byA6OnN0ZDo6c3dhcCgpLgorICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6c3RkOjpzd2FwOyIgPDwgZW5kbDsKKworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIGIuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IgorICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS5fX2lzc2V0LCBiLl9faXNzZXQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGhhbmRsZSBlbXB0eSBzdHJ1Y3RzCisgIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBhOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBiOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIiYgb2JqKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgLy8gdGhyaWZ0IGRlZmluZXMgdGhpcyBiZWhhdmlvcgorICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiYgb2JqKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib2JqLnByaW50VG8ob3V0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInZvaWQgIjsKKyAgaWYgKHRzdHJ1Y3QpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOworICB9CisgIG91dCA8PCAicHJpbnRUbyhzdGQ6Om9zdHJlYW0mIG91dCkgY29uc3QiOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCkgeworICBvdXQgPDwgImNvbnN0IGNoYXIqICI7CisgIGlmIChleHRlcm5hbCkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CisgIH0KKyAgb3V0IDw8ICJ3aGF0KCkgY29uc3Qgbm9leGNlcHQiOworfQorCituYW1lc3BhY2Ugc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yIHsKK3ZvaWQgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiIDw8IHRvX3N0cmluZygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIjsKK30KKwordm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICI7IChfX2lzc2V0LiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA/IChvdXQiOworICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKKyAgb3V0IDw8ICIpIDogKG91dCA8PCBcIjxudWxsPlwiKSkiOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKQorICAgIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworICBlbHNlCisgICAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICJcIiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIj1cIiI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIGdlbmVyYXRlX2ZpZWxkX25hbWUob3V0LCBmaWVsZCk7CisgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmRlbnQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYmVnID0gZmllbGRzLmJlZ2luKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGZpZWxkcy5lbmQoKTsKKworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJvdXQgPDwgIjsKKworICAgIGlmIChpdCAhPSBiZWcpIHsKKyAgICAgIG91dCA8PCAiXCIsIFwiIDw8ICI7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZmllbGQob3V0LCAqaXQpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCk7CisgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6dG9fc3RyaW5nOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRzKG91dCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgaW5kZW50KCkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIilcIjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHdoYXQoKSBtZXRob2QgZm9yIGV4Y2VwdGlvbnMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpOworICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIHRydWUpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nc3RyZWFtIHNzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzcyA8PCBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IFwiIDw8ICp0aGlzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8gPSBzcy5zdHIoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXy5jX3N0cigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9oZWFkZXJfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCAvLyBUTWVtb3J5QnVmZmVyCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD4iIDw8IGVuZGwgCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8bWVtb3J5PiIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwgIn19fSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4iIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgPDwgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOworICB9CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9NU0NfVkVSXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKVxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UgXG4iCisgICAgICAgICAgICAgICAiI2VuZGlmXG5cbiI7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5jcHAiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLnRjYyI7CisgICAgZl9zZXJ2aWNlX3RjY18ub3BlbihmX3NlcnZpY2VfdGNjX25hbWUuY19zdHIoKSk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3RjY18gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb25jdXJyZW50Iik7CisKKyAgLy8gR2VuZXJhdGUgc2tlbGV0b24KKyAgaWYgKCFnZW5fbm9fc2tlbGV0b25fKSB7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRzZXJ2aWNlKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKKworICAgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0c2VydmljZSk7CisgICAgfQorCisgIH0KKworICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfTVNDX1ZFUlxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKVxuIgorICAgICAgICAgICAgICAgIiNlbmRpZlxuXG4iOworCisgIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKKyAgZl9zZXJ2aWNlXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGZfaGVhZGVyXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKKyAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lX29yaWcgPSB0cy0+Z2V0X25hbWUoKTsKKworICAgIC8vIFRPRE8oZHJlaXNzKTogV2h5IGlzIHRoaXMgc3R1ZmYgbm90IGluIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnM/CisgICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMpOworICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzLCB0cnVlKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZV9vcmlnKTsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworCisgIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOworICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgeworICAgIC8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY2xpZW50LgorICAgIHN0cmluZyBjbGllbnRfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGNsaWVudF9uYW1lICs9ICJUIjsKKyAgICAgIHNlcnZpY2VfaWZfbmFtZSArPSAiVCI7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJjbGFzcyAiIDw8IGNsaWVudF9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZiI7CisgICAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKCkge30iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+aGFzX2RvYygpKQorICAgICAgZl9oZWFkZXJfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9oZWFkZXJfLCAqZl9pdGVyKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBnZW5lcmF0ZSBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHR5cGVkZWYgZm9yIGNsaWVudHMgdGhhdCBkbyBub3QKKyAgICAvLyBrbm93IGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZQorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZmFjdG9yeS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZhY3RvcnkgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7CisKKyAgLy8gRmlndXJlIG91dCB0aGUgbmFtZSBvZiB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MuCisgIC8vIEdldHRpbmcgZXZlcnl0aGluZyB0byB3b3JrIG91dCBwcm9wZXJseSB3aXRoIGluaGVyaXRhbmNlIGlzIGFubm95aW5nLgorICAvLyBIZXJlJ3Mgd2hhdCB3ZSdyZSBkb2luZyBmb3Igbm93OgorICAvLworICAvLyAtIEFsbCBoYW5kbGVycyBpbXBsZW1lbnQgZ2V0SGFuZGxlcigpLCBidXQgc3ViY2xhc3NlcyB1c2UgY292YXJpYW50IHJldHVybgorICAvLyAgIHR5cGVzIHRvIHJldHVybiB0aGVpciBzcGVjaWZpYyBzZXJ2aWNlIGludGVyZmFjZSBjbGFzcyB0eXBlLiAgV2UgaGF2ZSB0bworICAvLyAgIHVzZSByYXcgcG9pbnRlcnMgYmVjYXVzZSBvZiB0aGlzOyBzaGFyZWRfcHRyPD4gY2FuJ3QgYmUgdXNlZCBmb3IKKyAgLy8gICBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzLgorICAvLworICAvLyAtIFNpbmNlIHdlJ3JlIG5vdCB1c2luZyBzaGFyZWRfcHRyPD4sIHdlIGFsc28gcHJvdmlkZSBhIHJlbGVhc2VIYW5kbGVyKCkKKyAgLy8gICBmdW5jdGlvbiB0aGF0IG11c3QgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSBwb2ludGVyIHRvIGEgaGFuZGxlciBvYnRhaW5lZAorICAvLyAgIHZpYSBnZXRIYW5kbGVyKCkuCisgIC8vCisgIC8vICAgcmVsZWFzZUhhbmRsZXIoKSBhbHdheXMgYWNjZXB0cyBhIHBvaW50ZXIgdG8gdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzCisgIC8vICAgdHlwZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJlbnQgdmVyc2lvbnMgb2YgcmVsZWFzZUhhbmRsZXIoKQorICAvLyAgIG1heSBhY2NlcHQgYW55IG9mIHRoZSBwYXJlbnQgdHlwZXMsIG5vdCBqdXN0IHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzCisgIC8vICAgdHlwZS4gIEltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGR5bmFtaWNfY2FzdCB0byBjYXN0IHRoZSBwb2ludGVyIHRvIHRoZQorICAvLyAgIHN1YmNsYXNzIHR5cGUgaWYgZGVzaXJlZC4KKyAgdF9zZXJ2aWNlKiBiYXNlX3NlcnZpY2UgPSB0c2VydmljZTsKKyAgd2hpbGUgKGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisgIHN0cmluZyBiYXNlX2lmX25hbWUgPSB0eXBlX25hbWUoYmFzZV9zZXJ2aWNlKSArIHN0eWxlICsgIklmIjsKKworICAvLyBHZW5lcmF0ZSB0aGUgYWJzdHJhY3QgZmFjdG9yeSBjbGFzcworICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIkZhY3RvcnkiOworICBzdHJpbmcgZXh0ZW5kczsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiSWZGYWN0b3J5IjsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIgSGFuZGxlcjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgInZpcnR1YWwgfiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKiBnZXRIYW5kbGVyKCIKKyAgICAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzaW5nbGV0b24gZmFjdG9yeSBjbGFzcworICBzdHJpbmcgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJTaW5nbGV0b25GYWN0b3J5IjsKKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIiA6IHZpcnR1YWwgcHVibGljICIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICAgICAgICAgICAgPDwgIj4mIGlmYWNlKSA6IGlmYWNlXyhpZmFjZSkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIKKyAgICAgICAgICAgIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgorICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgorICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgIHJldHVybiBpZmFjZV8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pIHt9IiA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUKKyAgICAgICAgICAgIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIk51bGwiOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCBzdHlsZSA8PCAiSWYiIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsKCkge30iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKworICAgIGlmIChzdHlsZSA9PSAiIikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSB8fCBpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBjb2IoX3JldHVybik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCkgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiByZXRfdHlwZSA9IGdldF90cnVlX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXJldF90eXBlLT5pc192b2lkKCkpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHJldF90eXBlKSkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdGFyZ2V0OworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdGFyZ2V0IDw8ICIgPSAiIDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCBhcmdfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfYXN5bmNfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgb25lIHdheSB0byBhZGFwdCBhIHN5bmNocm9ub3VzIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi8vIGludGVyZmFjZSBpbnRvIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiLy8gZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgYW5kIHJld3JpdGUgYXMgYXN5bmNocm9ub3VzIGFueSBmdW5jdGlvbnMiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gdGhhdCB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIHVud2FudGVkIGxhdGVuY3kuIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA7CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKKyAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7CisgICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIgOiAiCisgICAgICAgICAgICAgPDwgInB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIkNvYlN2SWYgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4obmV3ICIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJBc3luY0hhbmRsZXIoKTsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9za2VsZXRvbiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisKKyAgICBzdHJpbmcgdGFyZ2V0ID0gcmV0dXJudHlwZS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiI7CisgICAgaWYgKCFyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwoZl9za2VsZXRvbiwgKmZfaXRlciwgdGFyZ2V0LCAic3luY0hhbmRsZXJfIiwgIiIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoIiA8PCB0YXJnZXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NrZWxldG9uKTsKKyAgfQorICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyPiBzeW5jSGFuZGxlcl87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAorICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKKyAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOworICB9CisKKyAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPCIpICsgc2VydmljZV9uYW1lXyArICJJZj4gPiI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZXh0ZW5kc19tdWx0aWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCIgPDwgbGlzdF90eXBlCisgICAgICAgICAgICA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZm9yIChpdGVyID0gaWZhY2VzLmJlZ2luKCk7IGl0ZXIgIT0gaWZhY2VzLmVuZCgpOyArK2l0ZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKCppdGVyKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3R5cGUgPDwgIiBpZmFjZXNfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgYWRkKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworCisgICAgc3RyaW5nIGNhbGwgPSBzdHJpbmcoImlmYWNlc19baV0tPiIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgY2FsbCArPSAiX3JldHVybiI7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGwgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIGNhbGwgKz0gKCphX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBjYWxsICs9ICIpIjsKKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IGkgPSAwOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICg7IGkgPCAoc3ogLSAxKTsgKytpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgaWZzdHlsZTsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZzdHlsZSA9ICJDb2JDbCI7CisgIH0KKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXIsIHRlbXBsYXRlX3N1ZmZpeCwgc2hvcnRfc3VmZml4LCBwcm90b2NvbF90eXBlLCBfdGhpczsKKyAgc3RyaW5nIGNvbnN0IHByb3RfZmFjdG9yeV90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgdGVtcGxhdGVfaGVhZGVyID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHNob3J0X3N1ZmZpeCA9ICJUIjsKKyAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKKyAgICBwcm90b2NvbF90eXBlID0gIlByb3RvY29sXyI7CisgICAgX3RoaXMgPSAidGhpcy0+IjsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICB9CisgIHN0cmluZyBwcm90X3B0ciA9ICJzdGQ6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOworICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OworICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgIGZfaGVhZGVyXyA8PCAiLy8gVGhlIFwnY29uY3VycmVudFwnIGNsaWVudCBpcyBhIHRocmVhZCBzYWZlIGNsaWVudCB0aGF0IGNvcnJlY3RseSBoYW5kbGVzXG4iCisgICAgICAgICAgICAgICAgICIvLyBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiAgSXQgaXMgc2xvd2VyIHRoYW4gdGhlIHJlZ3VsYXIgY2xpZW50LCBzbyBzaG91bGRcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzXG4iOworICB9CisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXIgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXgKKyAgICAgICAgICAgIDw8ICIgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisgICAgICAgICAgICAgIDw8ICIgcHJvdCkgIjsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PCAiKHByb3QsIHByb3QpIHt9IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgorICAgICAgICAgICAgICA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpICI7CisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihpcHJvdCxvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKKyAgICAgICAgICAgICAgICA8PCAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBzZXRQcm90b2NvbCBtZXRob2RzCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgICAgICAvLyAxOiBvbmUgcGFyYW1ldGVyCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIC8vIDI6IHR3byBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiCisgICAgICAgICAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgeyIgPDwgZW5kbDsKKworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF89aXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KKyAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0T3V0cHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIgorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCwgIgorICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwgZW5kbDsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgaXRyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgorICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOworICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIXBpcHJvdF8gfHwgIXBvcHJvdF8pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIKKyAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUpIDw8ICI7IiA8PCBlbmRsOworICAgIC8vIFRPRE8oZHJlaXNzKTogVXNlIHByaXZhdGUgaW5oZXJpdGFuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGlzZSBpbiBjb2Itc3R5bGUuCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gY29uY3VycmVudCBjbGllbnRzIG5lZWQgdG8gbW92ZSB0aGUgc2VxaWQgZnJvbSB0aGUgc2VuZCBmdW5jdGlvbiB0byB0aGUKKyAgICAgIC8vIHJlY3YgZnVuY3Rpb24uICBPbmV3YXkgbWV0aG9kcyBkb24ndCBoYXZlIGEgcmVjdiBmdW5jdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgLy8gbW92ZSB0aGUgc2VxaWQgZm9yIHRoZW0uICBBdHRlbXB0aW5nIHRvIGRvIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlcWlkIGxlYWsuCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2kzMiwgLypyZXR1cm5pbmcgc2VxaWQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZEFyZ1N0cnVjdCk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RvY29sX3R5cGUgPDwgIiogaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgZl9oZWFkZXJfIDw8CisgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBzeW5jXzsiPDxlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIE91dHB1dCBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR5cGVkZWYgdXNpbmcKKyAgICAvLyBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlCisgICAgICAgICAgICAgIDw8ICJDbGllbnRUPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNlcUlkQ2FwdHVyZTsKKyAgICBzdHJpbmcgc2VxSWRVc2U7CisgICAgc3RyaW5nIHNlcUlkQ29tbWFVc2U7CisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc2VxSWRDYXB0dXJlID0gImludDMyX3Qgc2VxaWQgPSAiOworICAgICAgc2VxSWRVc2UgPSAic2VxaWQiOworICAgICAgc2VxSWRDb21tYVVzZSA9ICIsIHNlcWlkIjsKKyAgICB9CisKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUsIHNjb3BlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgc2VxSWRDYXB0dXJlIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4iIDw8IHNlcUlkQ29tbWFVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgc2VxSWRVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiCisgICAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSwgIiA8PCBfdGhpcyA8PCAiaXRyYW5zXy5nZXQoKSk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIGlmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCisgICAgaWYgKHRydWUpIHsKKyAgICAgIHRfdHlwZSogc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX3ZvaWQ7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV9pMzI7CisgICAgICB9CisgICAgICAvLyBGdW5jdGlvbiBmb3Igc2VuZGluZworICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKHNlbmRfZnVuY19yZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgorICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCisgICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7CisKKyAgICAgIHN0cmluZyBjc2VxaWRWYWwgPSAiMCI7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGNzZXFpZFZhbCA9ICJ0aGlzLT5zeW5jXy5nZW5lcmF0ZVNlcUlkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICAgIG91dCA8PAorICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAiIDw8IGNzZXFpZFZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50U2VuZFNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm90cmFuc18tPnJlc2V0QnVmZmVyKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8CisgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PAorICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKKyAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6IiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIikgPDwKKyAgICAgICAgIiwgY3NlcWlkKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAorICAgICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsOworCisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjc2VxaWQ7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBvbmV3YXkgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgIHRfZmllbGQgc2VxSWRBcmcoZ190eXBlX2kzMiwgInNlcWlkIik7CisgICAgICAgIHRfc3RydWN0IHNlcUlkQXJnU3RydWN0KHByb2dyYW1fKTsKKyAgICAgICAgc2VxSWRBcmdTdHJ1Y3QuYXBwZW5kKCZzZXFJZEFyZyk7CisKKyAgICAgICAgdF9zdHJ1Y3QqIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZub2FyZ3M7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmc2VxSWRBcmdTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzKTsKKyAgICAgICAgLy8gT3BlbiB0aGUgcmVjdiBmdW5jdGlvbgorICAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7CisgICAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIHRoZSByZWFkIG11dGV4IGdldHMgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZCBhcyBwYXJ0IG9mIHdhaXRGb3JXb3JrKCkiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyBUaGUgZGVzdHJ1Y3RvciBvZiB0aGlzIHNlbnRyeSB3YWtlcyB1cCBvdGhlciBjbGllbnRzIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50UmVjdlNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfLCBzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBjb21wbGV0ZWQgPSBmYWxzZTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAid2hpbGUodHJ1ZSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYoIXRoaXMtPnN5bmNfLmdldFBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKHNlcWlkID09IHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgICAgICAgJiYgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICAgIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gc2VxaWQgIT0gcnNlcWlkIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5zeW5jXy51cGRhdGVQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHRoaXMgd2lsbCB0ZW1wb3JhcmlseSB1bmxvY2sgdGhlIHJlYWRNdXRleCwgYW5kIGxldCBvdGhlciBjbGllbnRzIGdldCB3b3JrIGRvbmUiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLndhaXRGb3JXb3JrKHNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IC8vIGVuZCB3aGlsZSh0cnVlKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmICghY29tcGxldGVkKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3IgeworcHVibGljOgorICBQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsIHRfc2VydmljZSogc2VydmljZSwgY29uc3Qgc3RyaW5nJiBzdHlsZSk7CisKKyAgdm9pZCBydW4oKSB7CisgICAgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoQ2FsbCgpIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChmYWxzZSk7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKHRydWUpOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGFsbCBvZiB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworCisgICAgZ2VuZXJhdGVfZmFjdG9yeSgpOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworICB2b2lkIGdlbmVyYXRlX2ZhY3RvcnkoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2VuZXJhdG9yXy0+dHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBhcmcpOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KCk7IH0KKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnQoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KG9zKTsgfQorCisgIHZvaWQgaW5kZW50X3VwKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfdXAoKTsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfZG93bigpOyB9CisKKyAgdF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3JfOworICB0X3NlcnZpY2UqIHNlcnZpY2VfOworICBzdGQ6Om9zdHJlYW0mIGZfaGVhZGVyXzsKKyAgc3RkOjpvc3RyZWFtJiBmX291dF87CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfOworICBzdHJpbmcgc3R5bGVfOworICBzdHJpbmcgcHN0eWxlXzsKKyAgc3RyaW5nIGNsYXNzX25hbWVfOworICBzdHJpbmcgaWZfbmFtZV87CisgIHN0cmluZyBmYWN0b3J5X2NsYXNzX25hbWVfOworICBzdHJpbmcgZmluaXNoX2NvYl87CisgIHN0cmluZyBmaW5pc2hfY29iX2RlY2xfOworICBzdHJpbmcgcmV0X3R5cGVfOworICBzdHJpbmcgY2FsbF9jb250ZXh0XzsKKyAgc3RyaW5nIGNvYl9hcmdfOworICBzdHJpbmcgY2FsbF9jb250ZXh0X2FyZ187CisgIHN0cmluZyBjYWxsX2NvbnRleHRfZGVjbF87CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXJfOworICBzdHJpbmcgdGVtcGxhdGVfc3VmZml4XzsKKyAgc3RyaW5nIHR5cGVuYW1lX3N0cl87CisgIHN0cmluZyBjbGFzc19zdWZmaXhfOworICBzdHJpbmcgZXh0ZW5kc187Cit9OworCitQcm9jZXNzb3JHZW5lcmF0b3I6OlByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3R5bGUpCisgIDogZ2VuZXJhdG9yXyhnZW5lcmF0b3IpLAorICAgIHNlcnZpY2VfKHNlcnZpY2UpLAorICAgIGZfaGVhZGVyXyhnZW5lcmF0b3ItPmZfaGVhZGVyXyksCisgICAgZl9vdXRfKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18gPyBnZW5lcmF0b3ItPmZfc2VydmljZV90Y2NfIDogZ2VuZXJhdG9yLT5mX3NlcnZpY2VfKSwKKyAgICBzZXJ2aWNlX25hbWVfKGdlbmVyYXRvci0+c2VydmljZV9uYW1lXyksCisgICAgc3R5bGVfKHN0eWxlKSB7CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBwc3R5bGVfID0gIkFzeW5jIjsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7CisgICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIkNvYlN2SWYiOworCisgICAgZmluaXNoX2NvYl8gPSAiOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKKyAgICBmaW5pc2hfY29iX2RlY2xfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiwgIjsKKyAgICBjb2JfYXJnXyA9ICJjb2IsICI7CisgICAgcmV0X3R5cGVfID0gInZvaWQgIjsKKyAgfSBlbHNlIHsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiSWYiOworCisgICAgcmV0X3R5cGVfID0gImJvb2wgIjsKKyAgICAvLyBUT0RPKGVkaGFsbCkgY2FsbENvbnRleHQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gVEFzeW5jUHJvY2Vzc29yCisgICAgY2FsbF9jb250ZXh0XyA9ICIsIHZvaWQqIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfYXJnXyA9ICIsIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfZGVjbF8gPSAiLCB2b2lkKiI7CisgIH0KKworICBmYWN0b3J5X2NsYXNzX25hbWVfID0gY2xhc3NfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgaWYgKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICB0ZW1wbGF0ZV9oZWFkZXJfID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHRlbXBsYXRlX3N1ZmZpeF8gPSAiPFByb3RvY29sXz4iOworICAgIHR5cGVuYW1lX3N0cl8gPSAidHlwZW5hbWUgIjsKKyAgICBjbGFzc19uYW1lXyArPSAiVCI7CisgICAgZmFjdG9yeV9jbGFzc19uYW1lXyArPSAiVCI7CisgIH0KKworICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfID0gdHlwZV9uYW1lKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpKSArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHNfICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzczsKKyAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBwYXJlbnRfY2xhc3MgPSBleHRlbmRzXzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICB9IGVsc2UgeworICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OlREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBwYXJlbnRfY2xhc3MgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgIiA8PCBwYXJlbnRfY2xhc3MgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCisgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGwoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90LCAiCisgICAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIERlY2xhcmUgcHJvY2Vzc01hcF8KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCisgICAgICAgICAgICA8PCAiUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgorICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgorICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiwgUHJvdG9jb2xfKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RydWN0IFByb2Nlc3NGdW5jdGlvbnMgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBQcm9jZXNzRnVuY3Rpb24gZ2VuZXJpYzsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gc3BlY2lhbGl6ZWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoUHJvY2Vzc0Z1bmN0aW9uIGcsICIKKyAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHMpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnZW5lcmljKGcpLCIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHNwZWNpYWxpemVkKHMpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoKSA6IGdlbmVyaWMoTlVMTCksIHNwZWNpYWxpemVkKE5VTEwpICIKKyAgICAgICAgICAgICAgPDwgInt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9ucz4gIgorICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+ICIKKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc01hcCBwcm9jZXNzTWFwXzsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICAvLyBYWFggRmFjdG9yIHRoaXMgb3V0LCBldmVuIGlmIGl0IGlzIGEgcGFpbi4KKyAgICAgIHN0cmluZyByZXRfYXJnID0gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgorICAgICAgICAgICAgICAgIDw8ICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8KKyAgICAgICAgICAgIDw8ICI+IGlmYWNlKSA6IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzXyA8PCAiKGlmYWNlKSwiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmYWNlXyhpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICI7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBmX2hlYWRlcl8gPDwgIlByb2Nlc3NGdW5jdGlvbnMoIiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgTlVMTCwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgY2xhc3NfbmFtZV8gPDwgIigpIHt9IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIC8vIEdlbmVyYXRlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgdHlwZWRlZiwgZm9yIGNhbGxlcnMgd2hvIGRvbid0IGtub3cKKyAgICAvLyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUuCisgICAgLy8KKyAgICAvLyBXZSBjYW4ndCB1c2UgVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHNpbmNlIFByb2Nlc3NvclQKKyAgICAvLyBwcm92aWRlcyBvdmVybG9hZGVkIHZlcnNpb25zIG9mIG1vc3QgbWV0aG9kcywgb25lIG9mIHdoaWNoIGFjY2VwdHMKKyAgICAvLyBUUHJvdG9jb2wgcG9pbnRlcnMsIGFuZCBvbmUgd2hpY2ggYWNjZXB0cyBQcm90b2NvbF8gcG9pbnRlcnMuICBUaGlzCisgICAgLy8gcmVzdWx0cyBpbiBhIGNvbXBpbGUgZXJyb3IgaWYgaW5zdGFudGlhdGVkIHdpdGggUHJvdG9jb2xfID09IFRQcm90b2NvbC4KKyAgICAvLyBUaGVyZWZvcmUsIHdlIGRlZmluZSBURHVtbXlQcm90b2NvbCBzb2xlbHkgc28gd2UgY2FuIHVzZSBpdCBhcyB0aGUKKyAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBjbGFzc19uYW1lXyA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIHByb3RvY29sID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICBzdHJpbmcgZnVuY3Rpb25fc3VmZml4OworICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgICBwcm90b2NvbCA9ICJQcm90b2NvbF8iOworICAgIC8vIFdlIGNhbGwgdGhlIGdlbmVyaWMgdmVyc2lvbiBkaXNwYXRjaENhbGwoKSwgYW5kIHRoZSBzcGVjaWFsaXplZAorICAgIC8vIHZlcnNpb24gZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCkuICBXZSBjYW4ndCBjYWxsIHRoZW0gYm90aAorICAgIC8vIGRpc3BhdGNoQ2FsbCgpLCBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGlzc3VlIGEgd2FybmluZyBpZgorICAgIC8vIGEgc2VydmljZSB0aGF0IGRvZXNuJ3QgdXNlIHRlbXBsYXRlcyBpbmhlcml0cyBmcm9tIGEgc2VydmljZSB0aGF0IGRvZXMKKyAgICAvLyB1c2UgdGVtcGxhdGVzOiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgdGhlIHN1YmNsYXNzIG9ubHkgaW1wbGVtZW50cworICAgIC8vIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgZGlzcGF0Y2hDYWxsKCksIGFuZCBoaWRlcyB0aGUgdGVtcGxhdGVkIHZlcnNpb24uCisgICAgLy8gVXNpbmcgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgorICAgIGZ1bmN0aW9uX3N1ZmZpeCA9ICJUZW1wbGF0ZWQiOworICB9CisKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgcmV0X3R5cGVfIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6ZGlzcGF0Y2hDYWxsIgorICAgICAgICAgPDwgZnVuY3Rpb25fc3VmZml4IDw8ICIoIiA8PCBmaW5pc2hfY29iXyA8PCBwcm90b2NvbCA8PCAiKiBpcHJvdCwgIiA8PCBwcm90b2NvbAorICAgICAgICAgPDwgIiogb3Byb3QsICIKKyAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gSE9UOiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBtYXAKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8IHR5cGVuYW1lX3N0cl8gPDwgIlByb2Nlc3NNYXA6Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJpZiAocGZuID09IHByb2Nlc3NNYXBfLmVuZCgpKSB7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc18uZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICJ4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgICAgICAiJ1wiK2ZuYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiCisgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiICByZXR1cm4gY29iKHRydWUpOyIgOiAiICByZXR1cm4gdHJ1ZTsiKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBleHRlbmRzXyA8PCAiOjpkaXNwYXRjaENhbGwoIgorICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImNvYiwgIiA6ICIiKSA8PCAiaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQiIDw8IGNhbGxfY29udGV4dF9hcmdfCisgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuc3BlY2lhbGl6ZWQpKSI7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgIC8vIFRPRE86IFRoaXMgaXMgYSBudWxsIHBvaW50ZXIsIHNvIG5vdGhpbmcgZ29vZCB3aWxsIGNvbWUgZnJvbSBjYWxsaW5nCisgICAgICAvLyBpdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkLgorICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOworICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpIjsKKyAgICB9CisgIH0KKyAgZl9vdXRfIDw8ICIoIiA8PCBjb2JfYXJnXyA8PCAic2VxaWQsIGlwcm90LCBvcHJvdCIgPDwgY2FsbF9jb250ZXh0X2FyZ18gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFRPRE8oZHJlaXNzKTogcmV0dXJuIHBmbiByZXQ/CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX291dF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9mYWN0b3J5KCkgeworICBzdHJpbmcgaWZfZmFjdG9yeV9uYW1lID0gaWZfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZhY3RvcnkgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSIgOiAiVFByb2Nlc3NvckZhY3RvcnkiKSA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgIDw8ICIgPiYgaGFuZGxlckZhY3RvcnkpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgICAgaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICAgICA8PCAiZ2V0UHJvY2Vzc29yKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pOyIgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCisgICAgICAgICAgICA8PCBpZl9mYWN0b3J5X25hbWUgPDwgIiA+IGhhbmRsZXJGYWN0b3J5XzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHRlbXBsYXRlcywgb3V0cHV0IGEgdHlwZWRlZiBmb3IgdGhlIHBsYWluCisgIC8vIGZhY3RvcnkgbmFtZS4KKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXworICAgICAgICAgICAgICA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXworICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yRmFjdG9yeTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBnZXRQcm9jZXNzb3IoKSBtZXRob2QKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmdldFByb2Nlc3NvcigiCisgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpSZWxlYXNlSGFuZGxlcjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgIDw8ICIgPiBjbGVhbnVwKGhhbmRsZXJGYWN0b3J5Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgPDwgaWZfbmFtZV8gPDwgIiA+IGhhbmRsZXIoIgorICAgICAgICAgPDwgImhhbmRsZXJGYWN0b3J5Xy0+Z2V0SGFuZGxlcihjb25uSW5mbyksIGNsZWFudXApOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgInByb2Nlc3NvcihuZXcgIiA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICIoaGFuZGxlcikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgInJldHVybiBwcm9jZXNzb3I7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvY2Vzc29yIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBQcm9jZXNzb3JHZW5lcmF0b3IgZ2VuZXJhdG9yKHRoaXMsIHRzZXJ2aWNlLCBzdHlsZSk7CisgIGdlbmVyYXRvci5ydW4oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsICZyZXN1bHQpOworCisgIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZ2VuX2NvYl9zdHlsZV8pOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQsIHRydWUpOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCkgeworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgc3RyaW5nIHNlcnZpY2VfZnVuY19uYW1lID0gIlwiIiArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlwiIjsKKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIHByb3RfdHlwZSA9IChzcGVjaWFsaXplZCA/ICJQcm90b2NvbF8iIDogIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiKTsKKyAgc3RyaW5nIGNsYXNzX3N1ZmZpeDsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgY2xhc3Nfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7CisgIH0KKworICAvLyBJIHRyaWVkIHRvIGRvIHRoaXMgYXMgb25lIGZ1bmN0aW9uLiAgSSByZWFsbHkgZGlkLiAgQnV0IGl0IHdhcyB0b28gaGFyZC4KKyAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgY29uc3QgYm9vbCB1bm5hbWVkX29wcm90X3NlcWlkID0gdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCk7CisgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiIKKyAgICAgICAgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgIDw8ICJpbnQzMl90IiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIHNlcWlkLCAiKSA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIKKyAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIG9wcm90LCAiKSA8PCAidm9pZCogY2FsbENvbnRleHQpIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF1bm5hbWVkX29wcm90X3NlcWlkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgY2FsbENvbnRleHQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gRGVjbGFyZSByZXN1bHQKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBUcnkgYmxvY2sgZm9yIGZ1bmN0aW9ucyB3aXRoIGV4Y2VwdGlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIn0iOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29iIHN0eWxlLgorICBlbHNlIHsKKyAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCisgICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnByb2Nlc3NfIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBUT0RPKHNpbXBraW5zKTogd2UgY291bGQgdHJ5IHRvIGNvbnNvbGRhdGUgdGhpcworICAgIC8vIHdpdGggdGhlIG5vbi1jb2IgY29kZSBhYm92ZQorICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgIC8vIElmIHRoZXNlIGFyZSBpbnN0YW5jZXMgb2YgUHJvdG9jb2xfLCBpbnN0ZWFkIG9mIGFueSBvbGQgVFByb3RvY29sLAorICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCBwcm9jZXNzIGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX2lwcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX2lwcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX2FyZ3MgYXJnczsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSBURXhjZXB0aW9ucz8gIEV4cG9zZSB0byBzZXJ2ZXI/CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCisgICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0cnVlKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyByZXRfYXJnLCByZXRfcGxhY2Vob2xkZXI7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJldF9hcmcgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X3BsYWNlaG9sZGVyID0gIiwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEiOworICAgICAgfQorCisgICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQorICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCisgICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICA8PCAiOjoqcmV0dXJuX2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcKKyAgICAgICAgICA8PCAiKSA9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6Oip0aHJvd19mbikoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSA9IiA8PCBlbmRsOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6OnRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgorICAgICAgICAgIDw8ICIpIjsKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjdHgsIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gWFhYIFdoaXRlc3BhY2UgY2xlYW51cC4KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBOb3JtYWwgcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldF9hcmdfZGVjbCwgcmV0X2FyZ19uYW1lOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXRfYXJnX2RlY2wgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X2FyZ19uYW1lID0gIiwgX3JldHVybiI7CisgICAgICB9CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnJldHVybl8iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAorICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXR1cm5fIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgiIDw8IHJldF9hcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3ByZXN1bHQgcmVzdWx0OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAorICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBjb25zdF9jYXN0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgIDw8ICIqPigmX3JldHVybik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6dGhyb3dfIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgdGhyb3cgZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgsIF90aHJvdyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gR2V0IHRoZSBldmVudCBoYW5kbGVyIGNvbnRleHQKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIFRocm93IHRoZSBURGVsYXllZEV4Y2VwdGlvbiwgYW5kIGNhdGNoIHRoZSByZXN1bHQKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcmVzdWx0IHJlc3VsdDsiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfdGhyb3ctPnRocm93X2l0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKGZhbHNlKTsiCisgICAgICAgICAgPDwgZW5kbDsgLy8gSXMgdGhpcyBwb3NzaWJsZT8gIFRCRC4KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgJ30nOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICBvdXQgPDwgIiBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIC8vIFdlIHBhc3MgdHJ1ZSB0byB0aGUgY29iIGhlcmUsIHNpbmNlIHdlIGRpZCBzdWNjZXNzZnVsbHkgd3JpdGUgYQorICAgICAgICAgIC8vIHJlc3BvbnNlLCBldmVuIHRob3VnaCBpdCBpcyBhbiBleGNlcHRpb24gcmVzcG9uc2UuCisgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB0aGUgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQsIGFueXdheS4KKyAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KKyAgfSAgIC8vIGNvYiBzdHlsZQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIG5vdCBjb21waWxlOgorICAvLyB1c2luZyBuYW1lc3BhY2UgOworICAvLyB1c2luZyBuYW1lc3BhY2UgOjo7CisgIGlmICgoIW5zLmVtcHR5KCkpICYmIChucy5jb21wYXJlKCIgOjoiKSAhPSAwKSkgeworICAgIGZfc2tlbGV0b24gPDwgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpIC0gMikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2tlbGV0b24gPDwgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2tlbGV0b24sICpmX2l0ZXIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCisgICAgICA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlcikpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsiCisgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NrZWxldG9uLmNsb3NlKCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPiI7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50MzJfdCAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0CisgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCEiIDw8IHByZWZpeCA8PCAiKSB7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHByZWZpeCA8PCAiID0gOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIj4obmV3ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCB3YXNTZXQgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKSB7IHdhc1NldCA9IHRydWU7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXdhc1NldCkgeyAiIDw8IHByZWZpeCA8PCAiLnJlc2V0KCk7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgIGJvb2wgdXNlX3B1c2ggPSB0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgdnR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIXVzZV9wdXNoKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZXNpemUoIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaQorICAgICAgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkKKyAgICAgICAgICAgICAgPDwgIl07IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5pbnNlcnQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgeworICBpZiAodXNlX3B1c2gpIHsKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CisgIGlmIChwb2ludGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUob3Byb3QpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6Y29uc3RfaXRlcmF0b3IgIiA8PCBpdGVyIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm9yICgiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuYmVnaW4oKTsgIiA8PCBpdGVyIDw8ICIgIT0gIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIuZW5kKCk7ICsrIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogTWFrZXMgYSA6OiBwcmVmaXggZm9yIGEgbmFtZXNwYWNlCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfcHJlZml4KHN0cmluZyBucykgeworICAvLyBBbHdheXMgc3RhcnQgd2l0aCAiOjoiLCB0byBhdm9pZCBwb3NzaWJsZSBuYW1lIGNvbGxpc2lvbnMgd2l0aAorICAvLyBvdGhlciBuYW1lcyBpbiBvbmUgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlcy4KKyAgLy8KKyAgLy8gV2UgYWxzbyBuZWVkIGEgbGVhZGluZyBzcGFjZSwgaW4gY2FzZSB0aGUgbmFtZSBpcyB1c2VkIGluc2lkZSBvZiBhCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlci4gICJNeVRlbXBsYXRlPDo6Zm9vOjpCYXI+IiBpcyBub3QgdmFsaWQgQysrLAorICAvLyBzaW5jZSAiPDoiIGlzIGFuIGFsdGVybmF0aXZlIHRva2VuIGZvciAiWyIuCisgIHN0cmluZyByZXN1bHQgPSAiIDo6IjsKKworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKKyAgICByZXN1bHQgKz0gIjo6IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBPcGVucyBuYW1lc3BhY2UuCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2Vfb3BlbihzdHJpbmcgbnMpIHsKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RyaW5nIHNlcGFyYXRvciA9ICIiOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gc2VwYXJhdG9yOworICAgIHJlc3VsdCArPSAibmFtZXNwYWNlICI7CisgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgIHJlc3VsdCArPSAiIHsiOworICAgIHNlcGFyYXRvciA9ICIgIjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgbmFtZXNwYWNlLgorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgeworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9ICJ9IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICByZXN1bHQgKz0gIiAvLyBuYW1lc3BhY2UiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYSBDKysgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgdHlwZSBuYW1lLCBpLmUuIHN0ZDo6c2V0PHR5cGU+CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgYXJnKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOworICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC50eXBlIik7CisgICAgaWYgKGl0ICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgIGJuYW1lID0gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBpZiAoIWFyZykgeworICAgICAgcmV0dXJuIGJuYW1lOworICAgIH0KKworICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIG92ZXJsb2FkZWQgQysrIG5hbWUKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6bWFwPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIGluX3R5cGVkZWYpICsgIiwgIgorICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6OnNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfQorCisgICAgaWYgKGFyZykgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgY2xhc3NfcHJlZml4OworICBpZiAoaW5fdHlwZWRlZiAmJiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSkgeworICAgIGNsYXNzX3ByZWZpeCA9ICJjbGFzcyAiOworICB9CisKKyAgLy8gQ2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgbmFtZXNwYWNlZAorICBzdHJpbmcgcG5hbWU7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIG5hbWVzcGFjZV9wcmVmaXgocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpICYmICFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwbmFtZSArPSAiOjp0eXBlIjsKKyAgfQorCisgIGlmIChhcmcpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHJldHVybiBFeHBsaWNpdCBDKysgdHlwZSwgaS5lLiAiaW50MzJfdCIKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0ZDo6c3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJpbnQ4X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gImludDE2X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludDMyX3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImludDY0X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpc19yZWZlcmVuY2UodGZpZWxkKSkgeworICAgIHJlc3VsdCA9ICI6OnN0ZDo6c2hhcmVkX3B0cjwiICsgcmVzdWx0ICsgIj4iOworICB9CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICImIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7CisgICAgfQorICB9CisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKKworICBpZiAoc3R5bGUgPT0gIiIpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyB0eXBlX25hbWUodHR5cGUpCisgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAiJiBfcmV0dXJuIiA6ICImIC8qIF9yZXR1cm4gKi8iKQorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsIDMpID09ICJDb2IiKSB7CisgICAgc3RyaW5nIGNvYl90eXBlOworICAgIHN0cmluZyBleG5fY29iOworICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7CisgICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKKyAgICAgIH0KKyAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOworICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgY29iX3R5cGUgPSAodHR5cGUtPmlzX3ZvaWQoKSA/ICIoKSIgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOworICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKKyAgICAgICAgZXhuX2NvYgorICAgICAgICAgICAgPSAiLCA6OnN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQiICsgY29iX3R5cGUgKyAiPiBjb2IiCisgICAgICAgICAgICsgZXhuX2NvYiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOworICB9IGVsc2UgeworICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIKKyAgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAoKmZfaXRlciktPmdldF9uYW1lKCkgOiAiLyogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgKi8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqCisgKiBAcGFyYW0gdHlwZSBUaHJpZnQgVHlwZQorICogQHJldHVybiBTdHJpbmcgb2YgQysrIGNvZGUgdG8gZGVmaW5pdGlvbiBvZiB0aGF0IHR5cGUgY29uc3RhbnQKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7CisgIHN0cmluZyBpbmNsdWRlX3ByZWZpeCA9IHByb2dyYW0uZ2V0X2luY2x1ZGVfcHJlZml4KCk7CisgIGlmICghdXNlX2luY2x1ZGVfcHJlZml4XyB8fCAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7CisgICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7CisgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkKKyAgICAgICAgICAgKyAoZ2V0X3Byb2dyYW0oKS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSA/ICIvIiA6ICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNwcCwKKyAgICAiQysrIiwKKyAgICAiICAgIGNvYl9zdHlsZTogICAgICAgR2VuZXJhdGUgXCJDb250aW51YXRpb24gT0JqZWN0XCItc3R5bGUgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG5vX2NsaWVudF9jb21wbGV0aW9uOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKKyAgICAiICAgIG5vX2RlZmF1bHRfb3BlcmF0b3JzOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzID09LCAhPSBhbmQgPFxuIgorICAgICIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCisgICAgIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCisgICAgIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iCisgICAgIiAgICBub19vc3RyZWFtX29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBnZW5lcmF0aW9uIG9mIG9zdHJlYW0gZGVmaW5pdGlvbnMuXG4iCisgICAgIiAgICBub19za2VsZXRvbjogICAgIE9taXRzIGdlbmVyYXRpb24gb2Ygc2tlbGV0b24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK3N0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZSB7CisgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXBwaW5nX3RhYmxlOworfTsKKworY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY3NoYXJwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFzeW5jXyA9IGZhbHNlOworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luYyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKSB7CisgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkgeworICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApIHsKKyAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkgeworICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7IC8vIHNpbmNlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBuYW1lc3BhY2UKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkgeworICAgICAgICB3Y2ZfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3NoYXJwOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOworICB9CisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICBib29sIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKKyAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworICBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBib29sIGFzeW5jXzsKKyAgYm9vbCBudWxsYWJsZV87CisgIGJvb2wgdW5pb25fOworICBib29sIGhhc2hjb2RlXzsKKyAgYm9vbCBzZXJpYWxpemVfOworICBib29sIHdjZl87CisgIHN0ZDo6c3RyaW5nIHdjZl9uYW1lc3BhY2VfOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNzaGFycF9rZXl3b3JkczsKKyAgc3RkOjp2ZWN0b3I8bWVtYmVyX21hcHBpbmdfc2NvcGU+ICBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKKyAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisKKyAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgaW5pdF9rZXl3b3JkcygpOworCisgIHdoaWxlKCAhIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgIH0KKworICBwdmVyYm9zZSgiQyMgb3B0aW9uczpcbiIpOworICBwdmVyYm9zZSgiLSBhc3luYyAuLi4uLi4gJXNcbiIsIChhc3luY18gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKHVuaW9uXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsICh3Y2ZfID8gIk9OIiA6ICJvZmYiKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgdG1wKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKKworICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgaWYgKGNzaGFycF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gY3NoYXJwX2tleXdvcmRzLmVuZCgpKSB7CisgICAgcmV0dXJuICJAIiArIG5hbWU7CisgIH0KKworICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKSB7CisgIGNzaGFycF9rZXl3b3Jkcy5jbGVhcigpOworCisgIC8vIEMjIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJib29sIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImVudW0iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxvY2siXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibmV3Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRocm93Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRydWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVsb25nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAvLyBDIyBjb250ZXh0dWFsIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWRkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFsaWFzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzY2VuZGluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhc3luYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZXNjZW5kaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImR5bmFtaWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZnJvbSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ2xvYmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdyb3VwIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siam9pbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3JkZXJieSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJ0aWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZWxlY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhbHVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGVyZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CisgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkgeworICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFN5c3RlbTtcbiIgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICArICgoYXN5bmNfKSA/ICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIiA6ICIiKSArICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICArICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNpZiAhU0lMVkVSTElHSFRcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gInVzaW5nIFN5c3RlbS5YbWwuU2VyaWFsaXphdGlvbjtcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNlbmRpZlxuIiA6ICIiKQorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsKKworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgIDw8ICJDb25zdGFudHMiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfY29uc3RzLCAoKmNfaXRlcikpOworICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgeworICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOworICB9CisKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iCisgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLy8gaXQgc2VlbXMgbGlrZSBhbGwgdGhhdCBtZXRob2RzIHRoYXQgY2FsbCB0aGlzIGFyZSB1c2luZyBpbl9zdGF0aWMgdG8gYmUgdGhlIG9wcG9zaXRlIG9mIHdoYXQgaXQKKy8vIHdvdWxkIGltcGx5Citib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHR5cGUpIHsKKyAgaW5kZW50KG91dCk7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKSB7CisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisKKyAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworCisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgdHN0cnVjdCk7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgImZhdWx0IiBmb3IgdGhhdAorICB9CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIiA6ICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgfQorICBvdXQgPDwgIlRCYXNlIjsKKworICBvdXQgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgaWYgKGlzX3JlcXVpcmVkKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19kZWZhdWx0KSB7CisgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgfQorICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2VuZXJhdGVfaXNzZXQgPSAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgIGlmIChnZW5lcmF0ZV9pc3NldCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1htbElnbm9yZV0gLy8gWG1sU2VyaWFsaXplciIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSAgLy8gWG1sT2JqZWN0U2VyaWFsaXplciwgRGF0YUNvbnRyYWN0SnNvblNlcmlhbGl6ZXIsIGV0Yy4iCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0cnVjdCBJc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiNyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiI2VuZHJlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBwcm9wX25hbWUoKm1faXRlciksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIC8vIE9wdGlvbmFscyB3aXRoIGRlZmF1bHRzIGFyZSBtYXJrZWQgc2V0CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIDogdGhpcygpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGhhc2hjb2RlXykgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgIH0KKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIkZhdWx0IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgorICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgICB9CisKKyAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiKHRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1aWxkZXIgX19zYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCisgICAgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIV9fZmlyc3QpIHsgX19zYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKKyAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkKKyAgICAgICAgICAgICAgICAgIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKSB7CisgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bmlvbjsKKworICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKGZfdW5pb24sIHR1bmlvbik7CisKKyAgZl91bmlvbi5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKKyAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAorICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgOiBUQWJzdHJhY3RCYXNlIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihib29sIGlzc2V0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIklzc2V0ID0gaXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgIgorICAgICAgICAgICAgICAgICAiYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHR1bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkKSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJ2YXIgb3RoZXIgPSB0aGF0IGFzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIjsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICImJiAiOworICAgIH0KKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlN5c3RlbS5PYmplY3QuRXF1YWxzKCI7CisgICAgfQorICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIikpKSI7CisgICAgfQorICB9CisgIGlmIChmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCAiKCI7CisgICAgfSBlbHNlIGlmIChudWxsYWJsZV8pIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgfQorICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIH0KKworICBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JU3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElTeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSUFzeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiA6IElTeW5jIjsKKworICBpZiAoYXN5bmNfKSB7CisgICAgZXh0ZW5kc19pZmFjZSArPSAiLCBJQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIGV4dHJhIG9sZCBzdHlsZSBhc3luYyBtZXRob2RzIGZvciBzaWx2ZXJsaWdodC4gU2luY2UKKyAgLy8gdGhpcyBpc24ndCBzb21ldGhpbmcgeW91J2Qgd2FudCB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUsIGp1c3QgcHV0IHRoZW0gaW50bworICAvLyB0aGUgbWFpbiBJZmFjZSBpbnRlcmZhY2UuCisgIGdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisKKyAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGluY2x1ZGUgdGhlIEJlZ2luXywgRW5kXyBtZXRob2RzIGlmIHdlJ3JlIGdlbmVyYXRpbmcKKyAgICAvLyB3aXRoIHRoZSBhc3luYyBmbGFnLiBJJ20gbm90IHN1cmUgdGhpcyBpcyBuZWNlc3NhcnksIHNvIHNvbWVvbmUgd2l0aCBtb3JlIGtub3dsZWRnZQorICAgIC8vIGNhbiBtYXliZSByZW1vdmUgdGhlc2UgY2hlY2tzIGlmIHRoZXkga25vdyBpdCdzIHNhZmUuCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICB9IGVsc2UgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIklEaXNwb3NhYmxlLCAiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaXByb3QsIG9wcm90KSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBJbnB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIGlwcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBvcHJvdF87IH0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI3JlZ2lvbiBcIiBJRGlzcG9zYWJsZSBTdXBwb3J0IFwiIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSURpc3Bvc2FibGUiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBEaXNwb3NlKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJEaXNwb3NlKHRydWUpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKCFfSXNEaXNwb3NlZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZGlzcG9zaW5nKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChpcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKWlwcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9wcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpb3Byb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX0lzRGlzcG9zZWQgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZHJlZ2lvbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gQmVnaW5fCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihjYWxsYmFjaywgc3RhdGUiOworCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRW5kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRW5kRmx1c2goYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBhc3luYworICAgIGJvb2wgZmlyc3Q7CisgICAgaWYgKGFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgIiIpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHZhbCA9ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBUYXNrLlJ1bigoKSA9PiIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZnVubmFtZSA8PCAiKCI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHNpbHZlcmxpZ2h0IGludm9rZQorICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsIjsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIAorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJFbmRfIiA8PCBmdW5uYW1lIDw8ICIoYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBzeW5jaHJvbm91cyBpbnZva2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgCisgICAgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlbmQKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gb3Byb3RfLlRyYW5zcG9ydC5CZWdpbkZsdXNoKGNhbGxiYWNrLCBzdGF0ZSk7IiA8PCBlbmRsOworICAgICAgCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuUmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MuSGFzVmFsdWUpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzLlZhbHVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KKyAgZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKElTeW5jIGlmYWNlKSI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlmYWNlKSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzczsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElTeW5jIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyAiCisgICAgICAiRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVEFzeW5jUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpZmFjZSkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgeworICAvLyBUaGFua3MgdG8gVEhSSUZULTE3NjgsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgdW5pb24KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiBSZWFkKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoaXByb3QuUmVhZEZpZWxkQmVnaW4oKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIjsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yKCBpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmFtZTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0KSB7CisgIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7CisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgKGlzX3JlcXVpcmVkKSkgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImdldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdXNlX251bGxhYmxlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodXNlX251bGxhYmxlKSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKSB7CisgIGlmKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgfQorCisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnBvcF9iYWNrKCk7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgaWYoICEgbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikgeworICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICB9CisgIH0KKworICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkgeworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkgeworICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUgZHVtbXk7CisgIGR1bW15LnNjb3BlX21lbWJlciA9IDA7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wdXNoX2JhY2soZHVtbXkpOworICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgYWN0aXZlLnNjb3BlX21lbWJlciA9IHNjb3BlOworCisgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7CisKKyAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7CisgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKSB7CisgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwKKyAgICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQorICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0CisgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cnVjdG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG9sZG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICBhY3RpdmUubWFwcGluZ190YWJsZVtvbGRuYW1lXSA9IG5ld25hbWU7CisgICAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQobmV3bmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpIHsKKyAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHN1cHByZXNzX21hcHBpbmcpIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9pbml0OworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOworICAgIGlmICghbnMuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICB9CisgIH0KKworICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiICsgcG9zdGZpeDsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgfQorfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdGQ6OnN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBjb21tYSA9ICh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCA/ICIsICIgOiAiIik7CisgIHJldHVybiAiSUFzeW5jUmVzdWx0ICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlIiArIGNvbW1hICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0YXNrICs9ICI8IiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiPiI7CisgIHJldHVybiB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNldCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+XG4iLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT5cbiIpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHBzOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAorICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKKyAgICAgICAgcHMgPDwgc3RyOworICAgICAgfQorICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+XG4iICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY3NoYXJwLAorICAgICJDIyIsCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEFkZHMgQXN5bmMgc3VwcG9ydCB1c2luZyBUYXNrLlJ1bi5cbiIKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uICIKKyAgICAidHlwZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBnZW5lcmF0ZV8qKCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGJhc2UgY2xhc3MgdG8gZW1pdCBjb2RlIGZvciB0aGUKKyAqIGdpdmVuIGVudGl0eSwgcHJpbnRfKigpIGZ1bmN0aW9ucyB3cml0ZSBhIHBpZWNlIG9mIGNvZGUgdG8gdGhlIHBhc3NlZAorICogc3RyZWFtLCBhbmQgcmVuZGVyXyooKSByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZgorICogdGhlIHBhc3NlZCBlbnRpdHkuCisgKi8KK2NsYXNzIHRfZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZCI7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7CisgICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKCFkaXIuZW1wdHkoKSkgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIH0KKworICAgIHBhY2thZ2VfZGlyXyA9IHN1YmRpciArICIvIjsKKworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuZCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgICAvLyBQcmludCBoZWFkZXIKKyAgICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3R5cGVzXyk7CisKKyAgICAvLyBJbmNsdWRlIHR5cGUgbW9kdWxlcyBmcm9tIG90aGVyIGltcG9ydGVkIHByb2dyYW1zLgorICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgZl90eXBlc18gPDwgInB1YmxpYyBpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpCisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHsKKyAgICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgICBpZiAoIWNvbnN0cy5lbXB0eSgpKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5kIjsKKyAgICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICAgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl9jb25zdHMpOworCisgICAgICBmX2NvbnN0cyA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfY29uc3RzKTsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAiaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfY29uc3RzIDw8IGVuZGwgPDwgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKKyAgICAgICAgfQorICAgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICAgdGhpcy0+ZW1pdF9kb2ModHR5cGVkZWYsIGZfdHlwZXNfKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICAgIHRoaXMtPmVtaXRfZG9jKHRlbnVtLCBmX3R5cGVzXyk7CisgICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfdHlwZXNfKTsKKyAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8PCAiLCI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgICAgc3RyaW5nIGZfc2VydmljZW5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICIuZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgc3ZjX25hbWUgPDwgIjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKKworICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBleHRlbmRzID0gIiA6ICIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICB9CisKKyAgICB0aGlzLT5lbWl0X2RvYyh0c2VydmljZSwgZl9zZXJ2aWNlKTsKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IHN2Y19uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ29sbGVjdCBhbGwgdGhlIGV4Y2VwdGlvbiB0eXBlcyBzZXJ2aWNlIG1ldGhvZHMgY2FuIHRocm93IHNvIHdlIGNhbgorICAgIC8vIGVtaXQgdGhlIG5lY2Vzc2FyeSBhbGlhc2VzIGxhdGVyLgorICAgIHNldDx0X3R5cGUqPiBleGNlcHRpb25fdHlwZXM7CisKKyAgICAvLyBQcmludCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMuCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpmbl9pdGVyLCBmX3NlcnZpY2UpOworICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOworICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOworICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKKyAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkKKyAgICAgIGZfc2VydmljZSA8PCBlbmRsOworICAgIHNldDx0X3R5cGUqPjo6Y29uc3RfaXRlcmF0b3IgZXRfaXRlcjsKKyAgICBmb3IgKGV0X2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXRfaXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZSkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3BhY2thZ2UoKigqZXRfaXRlciktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIG1ldGhvZCBtZXRhZGF0YS4KKyAgICBvc3RyaW5nc3RyZWFtIG1ldGE7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkKKyAgICAgICAgICAmJiAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJiAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YSA8PCAiLCI7CisgICAgICB9CisKKyAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1ldGEgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG1ldGEgPDwgIikiOworICAgICAgfQorCisgICAgICBtZXRhIDw8ICJdIjsKKworICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fCAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIjsKKworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgeworICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0YSA8PCAiLCAiOworICAgICAgICAgIH0KKworICAgICAgICAgIG1ldGEgPDwgIlRFeGNlcHRpb25NZXRhKGAiIDw8ICgqZXhfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpleF9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICA8PCAiLCBgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJgKSI7CisgICAgICAgIH0KKworICAgICAgICBtZXRhIDw8ICJdIjsKKyAgICAgIH0KKworICAgICAgaWYgKCgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RUeXBlLk9ORVdBWSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIikiOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc3RyaW5nIG1ldGFfc3RyKG1ldGEuc3RyKCkpOworICAgIGlmICghbWV0YV9zdHIuZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVudW0gbWV0aG9kTWV0YSA9IFsiIDw8IG1ldGFfc3RyIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFNlcnZlciBza2VsZXRvbiBnZW5lcmF0aW9uLgorICAgIHN0cmluZyBmX3NrZWxldG9ubmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9ubmFtZS5jX3N0cigpKTsKKyAgICBwcmludF9zZXJ2ZXJfc2tlbGV0b24oZl9za2VsZXRvbiwgdHNlcnZpY2UpOworICAgIGZfc2tlbGV0b24uY2xvc2UoKTsKKyAgfQorCisgIHZvaWQgZW1pdF9kb2ModF9kb2MgKmRvYywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpZiAoIWRvYy0+aGFzX2RvYygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBObyBlbmRsIC0tIGNvbW1lbnRzIHJlbGlhYmx5IGhhdmUgYSBuZXdsaW5lIGF0IHRoZSBlbmQuCisgICAgLy8gVGhpcyBpcyB0cnVlIGV2ZW4gZm9yIHN0dWZmIGxpa2U6CisgICAgLy8gICAgIC8qKiBtZXRob2QgaW5mb3MgKi8gdm9pZCBmb28oLyoqIGh1aD8qLyAxOiBpNjQgc3R1ZmYpCisgICAgaW5kZW50KG91dCkgPDwgZG9jLT5nZXRfZG9jKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKi8iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgorICAgKi8KKyAgdm9pZCBwcmludF9zZXJ2ZXJfc2tlbGV0b24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgICBvdXQgPDwgIi8qIiA8PCBlbmRsCisgICAgICAgIDw8ICIgKiBUaGlzIGF1dG8tZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiBJZiB5b3UiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGludGVuZCB0byBjdXN0b21pemUgaXQsIHlvdSBzaG91bGQgZWRpdCBhIGNvcHkgd2l0aCBhbm90aGVyIGZpbGUgbmFtZSB0byAiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGF2b2lkIG92ZXJ3cml0aW5nIGl0IHdoZW4gcnVubmluZyB0aGUgZ2VuZXJhdG9yIGFnYWluLiIgPDwgZW5kbCA8PCAiICovIiA8PCBlbmRsCisgICAgICAgIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICJfc2VydmVyOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgc3RkLnN0ZGlvOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgPDwgImltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOyIgPDwgZW5kbAorICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOyIKKyAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCAiY2xhc3MgIiA8PCBzdmNfbmFtZSA8PCAiSGFuZGxlciA6ICIgPDwgc3ZjX25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3cml0ZWxuKFwiIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7CisKKwkgIHRfdHlwZSogcnQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisJICBpZiAoIXJ0LT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEiIDw8IHN2Y19uYW1lIDw8ICIobmV3ICIgPDwgc3ZjX25hbWUKKyAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KKyAgICovCisgIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghbWVtYmVycy5lbXB0eSgpKQorICAgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCI7CisKKyAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBmaWVsZHMsIGNvbnN0cnVjdCB0aGUgVEZpZWxkTWV0YSBhcnJheSB0byBwYXNzIHRvCisgICAgICAvLyBUU3RydWN0SGVscGVycy4gV2UgY2FuJ3QganVzdCBwYXNzIGFuIGVtcHR5IGFycmF5IGlmIG5vdCBiZWNhdXNlIFtdCisgICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIFRGaWVsZE1ldGFbXSBjb25zdHJhaW50LgorICAgICAgb3V0IDw8ICJbIjsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJURmllbGRNZXRhKGAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOworICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7CisgICAgfQorCisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBQcmludHMgdGhlIEQgZnVuY3Rpb24gc2lnbmF0dXJlIChpbmNsdWRpbmcgcmV0dXJuIHR5cGUpIGZvciB0aGUgZ2l2ZW4KKyAgICogbWV0aG9kLgorICAgKi8KKyAgdm9pZCBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmbikgeworICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKGZuLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIG91dCA8PCAiKSI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKKyAgICogc2luZ2xlIGV4cHJlc3Npb247IGZvciBjb21wbGV4IHR5cGVzLCBpbW1lZGlhdGVseSBjYWxsZWQgZGVsZWdhdGUKKyAgICogbGl0ZXJhbHMgYXJlIHVzZWQgdG8gYWNoaWV2ZSB0aGlzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICAgLy8gUmVzb2x2ZSBhbnkgdHlwZWRlZnMuCisgICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgICBvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRocm93ICJUeXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiYCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2WyI7CisgICAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKSA8PCAiKSkiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gcmVuZGVyX2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKKyAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7CisgICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApCisgICAgICByZXR1cm4gIiI7CisgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRCByZXBlc2VudGF0aW9uIG9mIHR0eXBlLgorICAgKgorICAgKiBJZiBpc0FyZyBpcyB0cnVlLCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdHlwZSB3aWxsIGJlIHJldHVybmVkIGZvcgorICAgKiBzdHJ1Y3RzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSwgYm9vbCBpc0FyZyA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiYm9vbCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gImJ5dGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gImxvbmciOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gRCB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgICAgcmV0dXJuIHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgICB0X3R5cGUqIGt0eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisKKyAgICAgICAgc3RyaW5nIG5hbWUgPSByZW5kZXJfdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICJbIjsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICBuYW1lICs9ICJpbW11dGFibGUoIjsKKyAgICAgICAgfQorICAgICAgICBuYW1lICs9IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgIG5hbWUgKz0gIikiOworICAgICAgICB9CisgICAgICAgIG5hbWUgKz0gIl0iOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuICJIYXNoU2V0ISgiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuIHJlbmRlcl90eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiW10iOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgJiYgaXNBcmcpIHsKKyAgICAgIHJldHVybiAicmVmIGNvbnN0KCIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIFRSZXEgZW51bSBtZW1iZXIgY29ycmVzcG9uZGluZyB0byByZXEuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3JlcSh0X2ZpZWxkOjplX3JlcSByZXEpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKHJlcSkgeworICAgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICAgIHJldHVybiAiVFJlcS5PUFRfSU5fUkVRX09VVCI7CisgICAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgICAgcmV0dXJuICJUUmVxLk9QVElPTkFMIjsKKyAgICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6CisgICAgICByZXR1cm4gIlRSZXEuUkVRVUlSRUQiOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHJlcXVpcmVtZW50IGxldmVsICIgPDwgcmVxOworICAgICAgdGhyb3cgc3Muc3RyKCk7CisgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiBpbXBvcnRzICh3aGljaCBhcmUgd3JpdHRlbiB0byBldmVyeSBnZW5lcmF0ZWQKKyAgICogbW9kdWxlKSB0byBmLgorICAgKi8KKyAgdm9pZCBwcmludF9kZWZhdWx0X2ltcG9ydHMob3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgImltcG9ydCB0aHJpZnQuYmFzZTsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdHlwZSBpcyDCu2ludHJpbnNpY2FsbHkgaW1tdXRhYmxlwqssIGluIHRoZSBzZW5zZSB0aGF0CisgICAqIGEgdmFsdWUgb2YgdGhhdCB0eXBlIGlzIGltcGxpY2l0bHkgY2FzdGFibGUgdG8gaW1tdXRhYmxlKHR5cGUpLCBhbmQgaXQgaXMKKyAgICogYWxsb3dlZCBmb3IgQUEga2V5cyB3aXRob3V0IGFuIGltbXV0YWJsZSgpIHF1YWxpZmllci4KKyAgICovCisgIGJvb2wgaXNfaW1tdXRhYmxlX3R5cGUodF90eXBlKiB0eXBlKSBjb25zdCB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgICAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgLyoKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworCisgIHN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGQsICJEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRjMzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsMiA9ICJcblxuIjsKKworLyoqCisgKiBVc2UgdGhlIGN1cnJlbnQgVGhyaWZ0IHZlcnNpb24gZm9yIHN0YXRpYyBsaWJyYXJpZXMuICBXaGVuIHJlbGVhc2luZywgdXBkYXRlCisgKiB0aGUgdmVyc2lvbiBpbiB0aGVzZSBmaWxlcy4KKyAqIC0gbGliL2RhcnQvcHVic3BlYy55YW1sCisgKiAtIHRlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbAorICogU2VlIGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9jb21taXR0ZXJzL0hvd1RvVmVyc2lvbgorICovCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRhcnRfdGhyaWZ0X3ZlcnNpb24gPSBUSFJJRlRfVkVSU0lPTjsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIERhcnQgY29kZSBnZW5lcmF0b3IKKyAqCisgKi8KK2NsYXNzIHRfZGFydF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kYXJ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsaWJyYXJ5X25hbWVfID0gIiI7CisgICAgbGlicmFyeV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcHVic3BlY19saWJfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9uYW1lIikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X25hbWVfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxpYnJhcnlfcHJlZml4IikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKSArICIuIjsKKyAgICAgICAgcGFja2FnZV9wcmVmaXhfID0gcmVwbGFjZV9hbGwobGlicmFyeV9wcmVmaXhfLCAiLiIsICIvIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1YnNwZWNfbGliIikgPT0gMCkgeworICAgICAgICBwdWJzcGVjX2xpYl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkYXJ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kYXJ0IjsKKyAgfQorCisgIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iICIpIHsKKyAgICBvdXQgPDwgcHJlZml4IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBwb3N0Zml4PWVuZGwpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBwb3N0Zml4OworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICAgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICAgIGlmIChzbGVuID4gMCkgeworICAgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGluaXRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2ZpbGVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBmaW5kX2xpYnJhcnlfbmFtZSh0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBkYXJ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltKSB7CisgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtczsKKyAgICBzdHJpbmdzdHJlYW0gc3Mocyk7CisgICAgc3RyaW5nIGl0ZW07CisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHB1YnNwZWNfbGliXzsKKworICBzdGQ6OnN0cmluZyBiYXNlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHNyY19kaXJfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X2V4cG9ydHNfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBpZiAobGlicmFyeV9uYW1lXy5lbXB0eSgpKSB7CisgICAgbGlicmFyeV9uYW1lXyA9IGZpbmRfbGlicmFyeV9uYW1lKHByb2dyYW1fKTsKKyAgfQorCisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXzsKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICBiYXNlX2Rpcl8gPSBzdWJkaXI7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyICs9ICIvbGliIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3ViZGlyICs9ICIvc3JjIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3JjX2Rpcl8gPSBzdWJkaXI7CisgIH0gZWxzZSB7CisgICAgc3JjX2Rpcl8gPSBiYXNlX2Rpcl87CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImRhcnQiKTsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcm9ncmFtLT5nZXRfbmFtZSgpOworICB9CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLiIsICJfIik7CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLSIsICJfIik7CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFRoZSBEYXJ0IGxpYnJhcnkKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgbGlicmFyeSwgZS5nLiAibGlicmFyeSBteXNlcnZpY2U7IgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGFydF9saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUpIHsKKyAgc3RyaW5nIG91dCA9ICJsaWJyYXJ5ICIgKyBsaWJyYXJ5X3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfOworICBpZiAoIWZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBvdXQgKz0gIi5zcmMuIiArIGZpbGVfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ICs9ICIuIiArIGZpbGVfbmFtZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG91dCArICI7XG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIGZvciBzZXJ2aWNlcworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBzZXJ2aWNlcworICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6c2VydmljZV9pbXBvcnRzKCkgeworICByZXR1cm4gImltcG9ydCAnZGFydDphc3luYyc7IiArIGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGRhcnQgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X3RocmlmdF9pbXBvcnRzKCkgeworICBzdHJpbmcgaW1wb3J0cyA9ICJpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7IiArIGVuZGwgKworICAgICAgICAgICAgICAgICAgICJpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsiICsgZW5kbDsKKworICAvLyBhZGQgaW1wb3J0IGZvciB0aGlzIGxpYnJhcnkKKyAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBsaWJyYXJ5X25hbWVfICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCc7IiArIGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfQorCisgIC8vIGFkZCBpbXBvcnRzIGZvciBpbmNsdWRlZCB0aHJpZnQgZmlsZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlc1tpXSk7CisgICAgc3RyaW5nIG5hbWVkX2ltcG9ydCA9ICJ0XyIgKyBpbmNsdWRlX25hbWU7CisgICAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIGluY2x1ZGVfbmFtZSArICIvIiArIGluY2x1ZGVfbmFtZSArICIuZGFydCcgYXMgIiArIG5hbWVkX2ltcG9ydCArICI7IiArIGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgcGFja2FnZV9wcmVmaXhfICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3QgdXNlZAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisgIH0KK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKSB7CisgIHN0cmluZyBmX2xpYnJhcnlfbmFtZTsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBiYXNlX2Rpcl8gKyAiL2xpYi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0gZWxzZSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfbGlicmFyeTsKKyAgZl9saWJyYXJ5Lm9wZW4oZl9saWJyYXJ5X25hbWUuY19zdHIoKSk7CisKKyAgZl9saWJyYXJ5IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfbGlicmFyeSA8PCAibGlicmFyeSAiIDw8IGxpYnJhcnlfcHJlZml4XyA8PCBsaWJyYXJ5X25hbWVfIDw8ICI7IiA8PCBlbmRsMjsKKyAgZl9saWJyYXJ5IDw8IGxpYnJhcnlfZXhwb3J0c187CisKKyAgZl9saWJyYXJ5LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6ZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgc3RyaW5nIHN1YmRpcjsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyID0gInNyYyI7CisgIH0gZWxzZSB7CisgICAgc3ViZGlyID0gbGlicmFyeV9uYW1lXzsKKyAgfQorICBsaWJyYXJ5X2V4cG9ydHNfICs9ICJleHBvcnQgJyIgKyBzdWJkaXIgKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQnIHNob3cgIiArIGNsYXNzX25hbWUgKyAiOyIgKyBlbmRsOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfcHVic3BlYygpIHsKKyAgc3RyaW5nIGZfcHVic3BlY19uYW1lID0gYmFzZV9kaXJfICsgIi9wdWJzcGVjLnlhbWwiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcHVic3BlYzsKKyAgZl9wdWJzcGVjLm9wZW4oZl9wdWJzcGVjX25hbWUuY19zdHIoKSk7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgIm5hbWU6ICIgPDwgbGlicmFyeV9uYW1lXyA8PCBlbmRsOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAidmVyc2lvbjogMC4wLjEiIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJkZXNjcmlwdGlvbjogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIiIDw8IGVuZGw7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJlbnZpcm9ubWVudDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAic2RrOiBeMS4xMi4wIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZGVwZW5kZW5jaWVzOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHB1YnNwZWNfbGliXy5lbXB0eSgpKSB7CisgICAgLy8gZGVmYXVsdCB0byByZWxhdGl2ZSBwYXRoIHdpdGhpbiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggd29ya3MgZm9yIHRlc3RzCisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInRocmlmdDogICMgXiIgPDwgZGFydF90aHJpZnRfdmVyc2lvbiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJwYXRoOiAuLi8uLi8uLi8uLi9saWIvZGFydCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBzcGxpdChwdWJzcGVjX2xpYl8sICd8Jyk7CisgICAgZm9yIChzaXplX3QgbGluZV9pbmRleCA9IDA7IGxpbmVfaW5kZXggPCBsaW5lcy5zaXplKCk7IGxpbmVfaW5kZXgrKykgeworICAgICAgaW5kZW50KGZfcHVic3BlYykgPDwgbGluZXNbbGluZV9pbmRleF0gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBhZGQgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGFzIGRlcGVuZGVuY2llcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgc3RyaW5nIGluY2x1ZGVfbmFtZSA9IGZpbmRfbGlicmFyeV9uYW1lKGluY2x1ZGVzW2ldKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBpbmNsdWRlX25hbWUgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLyIgPDwgaW5jbHVkZV9uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGZfcHVic3BlYy5jbG9zZSgpOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgYWRkIGxpYnJhcnkKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgZl9lbnVtIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWU7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBjb25zdCBpbnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBmaW5hbCBTZXQ8aW50PiBWQUxJRF9WQUxVRVMgPSBuZXcgU2V0LmZyb20oWyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgaW5kZW50KGZfZW51bSkgPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpOworICAgIGZfZW51bSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl0pOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGZpbmFsIE1hcDxpbnQsIFN0cmluZz4gVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluZGVudChmX2VudW0pIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKTsKKyAgICBmX2VudW0gIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8IGVuZGw7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJ9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKGNsYXNzX25hbWUpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfY29uc3RzIDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGZpbGVfbmFtZSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX2NvbnN0cykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZTsKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGZfY29uc3RzIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJzdGF0aWMgZmluYWwgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKSI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIuLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGtleSA8PCAiOiAiIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQsICI7IiArIGVuZGwpOworCisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIjsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuZnJvbShbIiA8PCBlbmRsOworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UsIGZpbGVfbmFtZSk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSkgeworICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgaWYgKCFleHBvcnRfZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShleHBvcnRfZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8ICIgIjsKKworICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIsIEV4Y2VwdGlvbiAiOworICB9CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWRhcnQsIHByaXZhdGUgZm9yIC1kYXJ0YmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRGaWVsZCBfIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpICsgIiBfIgorICAgICAgICAgICAgICAgIDw8IGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGluaXRfdmFsdWUoKm1faXRlcikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGNvbnN0IGludCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArIGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicmVhZChUUHJvdG9jb2wgaXByb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwyOworCisgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvLyBnZW5lcmF0ZXMgZGFydCBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGRfbmFtZSA8PCAiKSkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBmaWVsZF9uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbihfIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKF8iIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIiKTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsgIC8vIHN3aXRjaAorICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAic2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgRGFydCBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyAiIDw8IGZpZWxkX25hbWUgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiID0+IHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGwyOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9PiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKyAgICB9CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJ1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nIHRvU3RyaW5nKCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGwyOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiIgPDwgZmllbGRfbmFtZSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCJCSU5BUllcIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlN0cmluZyAiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lID0gIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiAoXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiKVwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIilcIik7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldC50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgZGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfZGFydF90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgc2VydmljZV9pbXBvcnRzKCkgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBnZW5lcmF0ZV9kYXJ0X2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBzZXJ2aWNlX25hbWVfOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhYnN0cmFjdCBjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19pZmFjZTsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGdlbmVyYXRlX2RhcnRfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50IjsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoVFByb3RvY29sIGlwcm90LCBbVFByb3RvY29sIG9wcm90ID0gbnVsbF0pIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIjogc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9pcHJvdCA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9vcHJvdCA9IChvcHJvdCA9PSBudWxsKSA/IGlwcm90IDogb3Byb3Q7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBfaXByb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBnZXQgaXByb3QgPT4gX2lwcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgX29wcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgZ2V0IG9wcm90ID0+IF9vcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IF9zZXFpZCA9IDA7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBnZXQgc2VxaWQgPT4gX3NlcWlkOyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgbmV4dFNlcWlkKCkgPT4gKytfc2VxaWQ7IiA8PCBlbmRsMjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgYXN5bmMiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsIG5leHRTZXFpZCgpKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCBhcmdfZmllbGRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBhcmdfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3Mud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDI7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImF3YWl0IG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDI7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciBlcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworCisgICAgICBzdHJpbmcgcmVzdWx0X2NsYXNzID0gZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0X2NsYXNzIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0X2NsYXNzIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiAhPSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gdHlwZWRlZgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInR5cGVkZWYgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IiA8PCBlbmRsMjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgY2xhc3NfbmFtZSA9ICBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaWZhY2UpIjsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICI6IHN1cGVyKGlmYWNlKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9ICIgPDwgZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIE1hcDxTdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gUFJPQ0VTU19NQVAgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGZuID09IG51bGwpIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgIlwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZuKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsgLy8gcHJvY2VzcyBmdW5jdGlvbgorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7IC8vIGNsYXNzCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGdldF9yZXN1bHRfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisKKyAgYm9vbCBhd2FpdF9yZXN1bHQgPSAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXN5bmMiOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfcmVzdWx0X2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGF3YWl0ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgIiIpOworICAgICAgZl9zZXJ2aWNlXyA8PCAiIG9uICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBjYXRjaCgiIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCAiICIpOworICAgIGZfc2VydmljZV8gPDwgImNhdGNoICh0aCkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSW50ZXJuYWwgZXJyb3IiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIGZpZWxkX25hbWU7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgZmllbGRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KTsKKyAgc2NvcGVfdXAob3V0LCAiIik7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIubGVuZ3RoIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBmaWVsZF9uYW1lOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIGZpZWxkX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCk7CisgIHNjb3BlX3VwKG91dCwgIiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBEYXJ0IHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBEYXJ0IHR5cGUgbmFtZSwgaS5lLiBNYXA8S2V5LCBWYWx1ZT4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIk1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICByZXR1cm4gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIERhcnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlVpbnQ4TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIGZpZWxkX25hbWU7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjogb2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIGZpZWxkX25hbWUsIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdGQ6OnN0cmluZyByZXR1cm50eXBlOworICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm50eXBlID0gIkZ1dHVyZSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJudHlwZSA9ICJGdXR1cmU8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcmV0dXJudHlwZSArICIgIiArIGdldF9tZW1iZXJfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIigiICsgYXJndW1lbnRzICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgZmllbGRfbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6aW5pdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICAvLyBEbyBub3QgaW5pdGlhbGl6ZSBvcHRpb25hbCBmaWVsZHMKKyAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHRfdHlwZSogdHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKworICAvLyBHZXQgdGhlIGFjdHVhbCB0eXBlIGZvciBhIHR5cGVkZWYKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICAvLyBPbmx5IGNvbnNpZGVyIGJhc2UgdHlwZXMgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KKyAgaWYgKCF0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAvLyBJbml0aWFsaXplIGJvb2xzLCBpbnRzLCBhbmQgZG91YmxlcyB3aXRoIHNhbmUgZGVmYXVsdHMKKyAgc3RyaW5nIHJlc3VsdDsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmVzdWx0ID0gIiA9IGZhbHNlIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXN1bHQgPSAiID0gMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJlc3VsdCA9ICIgPSAwLjAiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJlc3VsdCA9ICIiOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG9sb3dlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICByZXR1cm4gbmFtZSArICJfYXJncyI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9yZXN1bHQiOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgLy8gZS5nLiBjaGFuZ2UgQVBJRm9yRmlsZUlPIHRvIGFwaV9mb3JfZmlsZV9pbworCisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCBpc19wcmV2X2xjID0gdHJ1ZTsKKyAgYm9vbCBpc19jdXJyZW50X2xjID0gdG1wWzBdID09IHRvbG93ZXIodG1wWzBdKTsKKyAgYm9vbCBpc19uZXh0X2xjID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworCisgICAgaWYgKGkgPT0gbmFtZS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGlzX25leHRfbGMgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaXNfbmV4dF9sYyA9ICh0bXBbaSsxXSA9PSB0b2xvd2VyKHRtcFtpKzFdKSk7CisgICAgfQorCisgICAgaWYgKGkgIT0gMCAmJiAhaXNfY3VycmVudF9sYyAmJiAoaXNfcHJldl9sYyB8fCBpc19uZXh0X2xjKSkgeworICAgICAgcmV0ICs9ICJfIjsKKyAgICB9CisgICAgcmV0ICs9IGxjOworCisgICAgaXNfcHJldl9sYyA9IGlzX2N1cnJlbnRfbGM7CisgICAgaXNfY3VycmVudF9sYyA9IGlzX25leHRfbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBteV9ncmVhdF9tb2RlbCB0byBNeUdyZWF0TW9kZWxDb25zdGFudHMKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfdW5kZXJzY29yZSA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAodG1wW2ldID09ICdfJykgeworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX3ByZXZfdW5kZXJzY29yZSkgeworICAgICAgICByZXQgKz0gdG91cHBlcih0bXBbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IHRtcFtpXTsKKyAgICAgIH0KKworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldCArICJDb25zdGFudHMiOworfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShwLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZF9uYW1lKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHByb2dyYW1fID09IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyBuYW1lZF9pbXBvcnQgPSAidF8iICsgZmluZF9saWJyYXJ5X25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCkpOworICAgIHJldHVybiBuYW1lZF9pbXBvcnQgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRhcnQsCisgICAgIkRhcnQiLAorICAgICIgICAgbGlicmFyeV9uYW1lOiAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgbGlicmFyeSBuYW1lLlxuIgorICAgICIgICAgbGlicmFyeV9wcmVmaXg6ICBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGFuIGV4aXN0aW5nIGxpYnJhcnkuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nLCBlLmcuIFwibXlfcGFyZW50X2xpYi5zcmMuZ2VuXCJcbiIKKyAgICAiICAgIHB1YnNwZWNfbGliOiAgICAgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRocmlmdCBsaWIgZGVwZW5kZW5jeSBpbiBwdWJzcGVjLnlhbWwsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJ0aHJpZnQ6IDAueC54XCIuICBVc2UgYSBwaXBlIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lcyxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDp8ICBnaXQ6fCAgICB1cmw6IGdpdEBmb28uY29tXCJcbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDAxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitjbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kZWxwaGlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgaW5kZW50X2ltcGxfID0gMDsKKyAgICBoYXNfZm9yd2FyZCA9IGZhbHNlOworICAgIGhhc19lbnVtID0gZmFsc2U7CisgICAgaGFzX2NvbnN0ID0gZmFsc2U7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFuc2lzdHJfYmluYXJ5XyA9IGZhbHNlOworICAgIHJlZ2lzdGVyX3R5cGVzXyA9IGZhbHNlOworICAgIGNvbnN0cHJlZml4XyA9IGZhbHNlOworICAgIGV2ZW50c18gPSBmYWxzZTsKKyAgICB4bWxkb2NfID0gZmFsc2U7CisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5zaXN0cl9iaW5hcnkiKSA9PSAwKSB7CisgICAgICAgIGFuc2lzdHJfYmluYXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlZ2lzdGVyX3R5cGVzIikgPT0gMCkgeworICAgICAgICByZWdpc3Rlcl90eXBlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb25zdHByZWZpeCIpID09IDApIHsKKyAgICAgICAgY29uc3RwcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXZlbnRzIikgPT0gMCkgeworICAgICAgICBldmVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgieG1sZG9jIikgPT0gMCkgeworICAgICAgICB4bWxkb2NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGVscGhpOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kZWxwaGkiOworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWydcJyddID0gIicnIjsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KTsKKworICB2b2lkIGFkZF9kZWxwaGlfdXNlc19saXN0KHN0cmluZyB1bml0bmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgYm9vbCBjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgaW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZGVscGhpX3R5cGVfdXNpbmdzKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgc3RkOjpzdHJpbmcgZGVscGhpX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfY2xzbm0oc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjdXJyZW50X2luZGVudCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpOworCisgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9mb3J3YXJkX2RlY3Ioc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfY29uc3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbGluZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIoKipcbiIpICsgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIgKlxuIiArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqKVxuIjsKKyAgfQorCisgIHN0cmluZyByZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsYWNlKTsKKyAgc3RyaW5nIHhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGRvY19lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19mb3J3YXJkX2RlY3I7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2VudW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0OworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3Q7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2U7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0X2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdF9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlX2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb247CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9mdW5jczsKKyAgYm9vbCBoYXNfZm9yd2FyZDsKKyAgYm9vbCBoYXNfZW51bTsKKyAgYm9vbCBoYXNfY29uc3Q7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfa2V5d29yZHM7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2Q7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiB0eXBlc19rbm93bjsKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+IHR5cGVkZWZzX3BlbmRpbmc7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1c2VzX2xpc3Q7CisgIHZvaWQgY3JlYXRlX2tleXdvcmRzKCk7CisgIGJvb2wgZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSk7CisgIGJvb2wgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisgIGJvb2wgaXNfdm9pZCh0X3R5cGUqIHR5cGUpOworICBpbnQgaW5kZW50X2ltcGxfOworICBib29sIGFuc2lzdHJfYmluYXJ5XzsKKyAgYm9vbCByZWdpc3Rlcl90eXBlc187CisgIGJvb2wgY29uc3RwcmVmaXhfOworICBib29sIGV2ZW50c187CisgIGJvb2wgeG1sZG9jXzsKKyAgYm9vbCBhc3luY187CisgIHZvaWQgaW5kZW50X3VwX2ltcGwoKSB7ICsraW5kZW50X2ltcGxfOyB9OworICB2b2lkIGluZGVudF9kb3duX2ltcGwoKSB7IC0taW5kZW50X2ltcGxfOyB9OworICBzdGQ6OnN0cmluZyBpbmRlbnRfaW1wbCgpIHsKKyAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50X2ltcGxfOyArK2kpIHsKKyAgICAgIGluZCArPSAiICAiOworICAgIH0KKyAgICByZXR1cm4gaW5kOworICB9OworICBzdGQ6Om9zdHJlYW0mIGluZGVudF9pbXBsKHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudF9pbXBsKCk7IH07Cit9OworCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsKSB7CisgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICBzaXplX3QgcmxlbiA9IHJlcGwubGVuZ3RoKCk7CisgIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOworCisgIGlmIChzbGVuID4gMCkgeworICAgIHNpemVfdCBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCk7CisgICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgIGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoLCBmb3VuZCArIGluY3IpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgLy8gZXNjYXBlIHRoZSBlc2NhcGUKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiJiIsICImYW1wOyIpOworCisgIC8vIG90aGVyIHN0YW5kYXJkIFhNTCBlbnRpdGllcworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI8IiwgIiZsdDsiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPiIsICImZ3Q7Iik7CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGF0dHJpYnV0ZSBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7CisKKyAgLy8gb3VyIGF0dHJpYnMgYXJlIGVuY2xvc2VkIGluICIKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXCIiLCAiXFxcIiIpOworCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZyBmb3IgZG9jIGNvbW1lbnRzCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKKworICAvLyBYTUxEb2Mgc3BlY2lmaWM6IGNvbnZlcnQgbGluZWJyZWFrcyBpbnRvIDxwYXJhPmdyYXBoczwvcGFyYT4KKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcciIsICI8L3BhcmE+XG48cGFyYT4iKTsKKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30vLy8gPHN1bW1hcnk+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBhcmE+IiArIGNvbnRlbnRzICsgIjwvcGFyYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxueyRFTkRSRUdJT059XG4iKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0geG1sZG9jX2VuY29kZShmaWVsZC0+Z2V0X2RvYygpKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeG1sZG9jX2VuY29kZSh0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpKSArICJcIi8+IjsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgeG1sZG9jX2VuY29kZSh0ZG9jLT5nZXRfZG9jKCkpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgeworICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCB4bWxhdHRyaWJfZW5jb2RlKHAtPmdldF9uYW1lKCkpIDw8ICJcIj4iOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCisgICAgICAgIHBzIDw8IHhtbGRvY19lbmNvZGUoc3RyKTsKKyAgICAgIH0KKyAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PjxwYXJhPiIgKyB4bWxkb2NfZW5jb2RlKHRmdW5jdGlvbi0+Z2V0X2RvYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvcGFyYT48L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JEVORFJFR0lPTn1cbiIpOworICB9Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gbmFtZS5sZW5ndGgoKTsKKworICBpZiAobGVuIDw9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG5sYXN0ID0gbmFtZS5maW5kX2xhc3Rfb2YoJ18nKTsKKworICBpZiAobmxhc3QgPj0gMSkgeworICAgIGlmIChubGFzdCA9PSAobGVuIC0gMSkpIHsKKyAgICAgIHN0cmluZyBuZXdfbmFtZShuYW1lLCAwLCBubGFzdCk7CisgICAgICByZXR1cm4gZmluZF9rZXl3b3JkKGtleXdvcmRfbWFwLCBuZXdfbmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiAoa2V5d29yZF9tYXBbbmFtZV0gPT0gMSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QpIHsKKyAgc3RyaW5nIHRtcChuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7CisKKyAgYm9vbCBiX2ZvdW5kID0gZmFsc2U7CisKKyAgaWYgKGZpbmRfa2V5d29yZChkZWxwaGlfa2V5d29yZHMsIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChiX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZCwgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9IGVsc2UgaWYgKGJfZXhjZXB0aW9uX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb24sIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfQorCisgIGlmIChiX2ZvdW5kKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNyZWF0ZV9rZXl3b3JkcygpIHsKKyAgZGVscGhpX2tleXdvcmRzWyJhbmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZW5kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyYWlzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1c2VzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFycmF5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4Y2VwdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZWNvcmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4cG9ydHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibGFiZWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVwZWF0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIndoaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImxpYnJhcnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVzb3VyY2VzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sid2l0aCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJiZWdpbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGl6YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibW9kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNldCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ4b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5pbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaGwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5vdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaHIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZnVuY3Rpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjb25zdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9mIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRoZW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGVzdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJlYWR2YXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGlzcGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbXBsZW1lbnRhdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGl2Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInBhY2tlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5oZXJpdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb2NlZHVyZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0eXBlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvd250byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbml0aWFsaXphdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9ncmFtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVuaXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbmxpbmUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvcGVydHkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidW50aWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInB1Ymxpc2hlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhdXRvbWF0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib24iXSA9IDE7CisKKyAgLy8gcmVzZXJ2ZWQvcHJlZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHR5cGVzIChsb3dlcmNhc2UhKQorICBkZWxwaGlfa2V5d29yZHNbInJlc3VsdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN0ZW0iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3lzdXRpbHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhyaWZ0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRieXRlcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0b2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRjbGFzcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aW50ZXJmYWNlZG9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhbnNpc3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJib29sZWFuIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNob3J0aW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNtYWxsaW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVnZXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50NjQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNyZWF0ZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5pdGluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGVhbnVwaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzdHlwZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWVpcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NwYXJlbnQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzaW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5zdGFuY2VzaXplIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbmhlcml0c2Zyb20iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZWVudHJ5Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2V0YWJsZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidW5pdG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImVxdWFscyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aGFzaGNvZGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInRvc3RyaW5nIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJzYWZlY2FsbGV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYWZ0ZXJjb25zdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImJlZm9yZWRlc3RydWN0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkaXNwYXRjaCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVmYXVsdGhhbmRsZXIiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm5ld2luc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlc3Ryb3kiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInJlYWQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIndyaXRlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldHN0YWNraW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzaW5nZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlaGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdGhlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJiYXNlZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaGVscGNvbnRleHQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bIm1lc3NhZ2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja3RyYWNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0ZXhjZXB0aW9uc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNraW5mb3N0cmluZ3Byb2MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjbGVhbnVwc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNlb3V0ZXJleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJ0aHJvd291dGVyZXhjZXB0aW9uIl0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKSB7CisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmb3VuZCA9IGZhbHNlOworICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgeworICAgIGlmICgoKnNfaXRlcikgPT0gdW5pdG5hbWUpIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdXNlc19saXN0LnB1c2hfYmFjayh1bml0bmFtZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBpbmRlbnRfaW1wbF8gPSAwOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7CisgIGhhc19mb3J3YXJkID0gZmFsc2U7CisgIGhhc19lbnVtID0gZmFsc2U7CisgIGhhc19jb25zdCA9IGZhbHNlOworICBjcmVhdGVfa2V5d29yZHMoKTsKKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7CisgIGlmKGFzeW5jXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXN0ZW0uVGhyZWFkaW5nIik7CisgIH0KKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0Iik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5Db2xsZWN0aW9ucyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlByb3RvY29sIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHJhbnNwb3J0Iik7CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlR5cGVSZWdpc3RyeSIpOworICB9CisKKyAgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisKKyAgc3RyaW5nIHVuaXRuYW1lLCBuc25hbWU7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICB1bml0bmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOworICAgIG5zbmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgICBpZiAoIiIgIT0gbnNuYW1lKSB7CisgICAgICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKG5zbmFtZSk7CisgICAgfQorICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKKyAgfQorCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKCIiICE9IG5hbWVzcGFjZV9uYW1lXykgeworICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXVuaXRuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHVuaXRuYW1lW2ldID09ICcgJykgeworICAgICAgdW5pdG5hbWUucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUodW5pdG5hbWUpOworICAKKyAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYWxsOworCisgIGZfYWxsLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIGZfYWxsIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2MoZl9hbGwsIHByb2dyYW1fKTsKKyAgZl9hbGwgPDwgInVuaXQgIiA8PCB1bml0bmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCAiaW50ZXJmYWNlIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ1c2VzIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICBpZiAoc19pdGVyICE9IHVzZXNfbGlzdC5iZWdpbigpKSB7CisgICAgICBmX2FsbCA8PCAiLCI7CisgICAgICBmX2FsbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9hbGwpIDw8ICpzX2l0ZXI7CisgIH0KKworICBmX2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgc3RyaW5nIHRtcF91bml0KHVuaXRuYW1lKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXRtcF91bml0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHRtcF91bml0W2ldID09ICcuJykgeworICAgICAgdG1wX3VuaXQucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIGZfYWxsIDw8ICJjb25zdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQW5zaVN0cl9CaW5hcnkgPSAiIDw8IChhbnNpc3RyX2JpbmFyeV8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX1JlZ2lzdGVyX1R5cGVzID0gIiA8PCAocmVnaXN0ZXJfdHlwZXNfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9Db25zdFByZWZpeCAgICA9ICIgPDwgKGNvbnN0cHJlZml4XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9FdmVudHMgICAgICAgICA9ICIgPDwgKGV2ZW50c18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9YbWxEb2MgICAgICAgICA9ICIgPDwgKHhtbGRvY18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfYWxsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ0eXBlIiA8PCBlbmRsOworICBpZiAoaGFzX2ZvcndhcmQpIHsKKyAgICBmX2FsbCA8PCBzX2ZvcndhcmRfZGVjci5zdHIoKSA8PCBlbmRsOworICB9CisgIGlmIChoYXNfZW51bSkgeworICAgIGluZGVudChmX2FsbCkgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9OfSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfZW51bS5zdHIoKTsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9GRn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBzX3N0cnVjdC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlLnN0cigpOworICBmX2FsbCA8PCBzX2NvbnN0LnN0cigpOworICBmX2FsbCA8PCAiaW1wbGVtZW50YXRpb24iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgc19zdHJ1Y3RfaW1wbC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlX2ltcGwuc3RyKCk7CisgIGZfYWxsIDw8IHNfY29uc3RfaW1wbC5zdHIoKTsKKworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiLy8gVHlwZSBmYWN0b3J5IG1ldGhvZHMgYW5kIHJlZ2lzdHJhdGlvbiIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9mdW5jcy5zdHIoKTsKKyAgICBmX2FsbCA8PCAicHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbi5zdHIoKTsKKyAgICBmX2FsbCA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICBmX2FsbCA8PCAiaW5pdGlhbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgfQorICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgIiAgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJmaW5hbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJlbmQuIiA8PCBlbmRsOworICBmX2FsbC5jbG9zZSgpOworCisgIGlmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSB7CisgICAgcHdhcm5pbmcoMCwgIiVkIHR5cGVkZWZzIHdpdGggdW5yZXNvbHZlZCB0eXBlIHJlZmVyZW5jZXMgbGVmdDpcbiIsIHR5cGVkZWZzX3BlbmRpbmcuc2l6ZSgpKTsKKyAgICBmb3IgKHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsKKyAgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsKKyAgICAgICAgICsraXRlcikgeworICAgICAgcHdhcm5pbmcoMCwgIi0gJXNcbiIsICgqaXRlciktPmdldF9zeW1ib2xpYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVscGhpX3R5cGVfdXNpbmdzKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIkNsYXNzZXMsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVGhyaWZ0LkNvbGxlY3Rpb25zLCBUaHJpZnQuUHJvdG9jb2wsIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRyYW5zcG9ydDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgaGFzX2ZvcndhcmQgPSB0cnVlOworICBwdmVyYm9zZSgiZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiAlc1xuIiwgdHlwZV9uYW1lKHRzdHJ1Y3QpLmNfc3RyKCkpOworCisgIHN0cmluZyB3aGF0ID0gdHN0cnVjdC0+aXNfeGNlcHRpb24oKSA/ICJjbGFzcyIgOiAiaW50ZXJmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfZm9yd2FyZF9kZWNyKSA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSkgPDwgIiA9ICIgPDwgd2hhdCA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgdF90eXBlKiB0eXBlID0gdHR5cGVkZWYtPmdldF90eXBlKCk7CisKKyAgLy8gd3JpdGUgbm93IG9yIHNhdmUgZm9yIGxhdGVyPworICBpZiAoIWlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0eXBlKSkgeworICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiB1bnJlc29sdmVkIGRlcGVuZGVuY2llcyBmb3VuZFxuIiwgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKKyAgICB0eXBlZGVmc19wZW5kaW5nLnB1c2hfYmFjayh0dHlwZWRlZik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zdHJ1Y3QsIHR0eXBlZGVmKTsKKyAgaW5kZW50KHNfc3RydWN0KSA8PCB0eXBlX25hbWUodHR5cGVkZWYpIDw8ICIgPSAiOworCisgIC8vIGNvbW1lbnRlZCBvdXQ6IHRoZSBiZW5lZml0IGlzIG5vdCBiaWcgZW5vdWdoIHRvIHJpc2sgYnJlYWtpbmcgZXhpc3RpbmcgY29kZQorICAvLyBib29sIGNvbnRhaW5lciA9IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKTsKKyAgLy8gaWYoICEgY29udGFpbmVyKQorICAvLyAgc19zdHJ1Y3QgPDwgInR5cGUgIjsgIC8vdGhlICJ0eXBlIEEgPSB0eXBlIEIiIHN5bnRheCBsZWFkcyB0byBFMjU3NCB3aXRoIGdlbmVyaWNzCisKKyAgc19zdHJ1Y3QgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHR5cGVkZWYpOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKChOVUxMICE9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSAmJiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pKSB7CisgICAgdF9zY29wZSogc2NvcGUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+c2NvcGUoKTsKKyAgICBpZiAoTlVMTCAhPSBzY29wZS0+Z2V0X3R5cGUodHR5cGUtPmdldF9uYW1lKCkpKSB7CisgICAgICAvLyBwcmludGYoInR5cGUgJXMgZm91bmQgaW4gaW5jbHVkZWQgc2NvcGUgJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAvLyB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSldKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHRydWU7IC8vIGVudW1zIGFyZSB3cml0dGVuIGZpcnN0LCBiZWZvcmUgYWxsIG90aGVyIHR5cGVzCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICYmIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIC8vIG1hcmsgYXMga25vd24gdHlwZQorICB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSA9IDE7CisKKyAgLy8gY2hlY2sgYWxsIHBlbmRpbmcgdHlwZWRlZnMKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyOworICBib29sIG1vcmUgPSB0cnVlOworICB3aGlsZSAobW9yZSAmJiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkpIHsKKyAgICBtb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7IHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgKytpdGVyKSB7CisgICAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKCppdGVyKTsKKyAgICAgIGlmIChpc19mdWxseV9kZWZpbmVkX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKSB7CisgICAgICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiBhbGwgcGVuZGluZyByZWZlcmVuY2VzIGFyZSBub3cgcmVzb2x2ZWRcbiIsCisgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7CisgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZXJhc2UoaXRlcik7CisgICAgICAgIGdlbmVyYXRlX3R5cGVkZWYodHR5cGVkZWYpOworICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2tub3duX3R5cGVzX2xpc3QoKSB7CisgIC8vIGtub3duIGJhc2UgdHlwZXMKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9zdHJpbmcpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYmluYXJ5KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2Jvb2wpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTgpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTE2KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kzMildID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pNjQpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfZG91YmxlKV0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGhhc19lbnVtID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCB0ZW51bSk7CisgIGluZGVudChzX2VudW0pIDw8IHR5cGVfbmFtZSh0ZW51bSwgdHJ1ZSwgdHJ1ZSkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgaWYgKGNvbnN0YW50cy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfZW51bSkgPDwgImR1bW15ID0gMCAgLy8gZW1wdHkgZW51bXMgYXJlIG5vdCBhbGxvd2VkIjsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKKyAgICAgICAgc19lbnVtIDw8ICIsIjsKKyAgICAgICAgc19lbnVtIDw8IGVuZGw7CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgKmNfaXRlcik7CisgICAgICBpbmRlbnQoc19lbnVtKSA8PCBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgIH0KKyAgfQorICBzX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKSB7CisgIGlmIChjb25zdHByZWZpeF8pIHsKKyAgICByZXR1cm4gbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcigiVCIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyIpOworICB9IGVsc2UgeworICAgIHJldHVybiAiVENvbnN0YW50cyI7IC8vIGNvbXBhdGliaWxpdHkKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaGFzX2NvbnN0ID0gdHJ1ZTsKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19jb25zdCkgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfY29uc3QsICpjX2l0ZXIpOworICAgIHByaW50X2NvbnN0X3Byb3Aoc19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnQoc19jb25zdCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5DcmVhdGU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBkZXN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5EZXN0cm95OyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JEVMU0V9IiA8PCBlbmRsOworCisgIHZhcnMuc3RyKCIiKTsKKyAgY29kZS5zdHIoIiIpOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyArICIuRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7CisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAorICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKworICBzdHJpbmcgY2xzX3ByZWZpeDsKKworICBpZiAoY2xzX25tID09ICIiKSB7CisgICAgY2xzX3ByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIGNsc19wcmVmaXggPSBjbHNfbm0gKyAiLiI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIlsiIDw8IGtleSA8PCAiXSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKXZhbHVlOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgdmFyIEYiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKSB7CisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gKCF0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpdmFsdWU7CisgIGlmIChjb25zdF9uZWVkc192YXIodHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgcHJvcGVydHkgIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgcmVhZCBGIiA8PCBuYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnM7IC8vIGR1bW15CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8vIGFscmVhZHkgZG9uZQorICAgIC8vIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgLy8gaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyB0eXBuYW1lOworICAgIHR5cG5hbWUgPSB0eXBlX25hbWUodHJ1ZXR5cGUsIHRydWUsIGZhbHNlLCB0eXBlLT5pc194Y2VwdGlvbigpLCB0eXBlLT5pc194Y2VwdGlvbigpKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cG5hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHRydWV0eXBlLCB2YWx1ZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKyAgKHZvaWQpb3V0OworICAodm9pZCluYW1lOworICAodm9pZCl0eXBlOworICAodm9pZCl2YWx1ZTsKKyAgKHZvaWQpY2xzX25tOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiU2hvcnRJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIlNtYWxsSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8ICJMb25nSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJJbnQ2NCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiLjAiOyAvLyBtYWtlIGl0IGEgZG91YmxlIGNvbnN0YW50IGJ5IGFkZGluZyAiLjAiCisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICB2YXJzIDw8ICIgICIgPDwgdCA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc3RydWN0X2ltcGwsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkoc190eXBlX2ZhY3RvcnlfZnVuY3MsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKKyAgfQorCisgIHN0cmluZyBjbHNfbm07CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoY29kZSkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRydWU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKKworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOworICAgIG91dCA8PCB2YXJzLnN0cigpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkIENyZWF0ZSgnJyk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCBjb2RlLnN0cigpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RyaW5nIHByb3BuYW1lID0gcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIHN0cmluZyBwYXJhbV9uYW1lID0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBmaW5hbGl6ZV9maWVsZChvdXQsIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIjogSSIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA9IG5pbCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0aGVuIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6PSBUIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInJlc3VsdCA6PSBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfeF9mYWN0b3J5KTsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAiQ3JlYXRlXyI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIl9JbXBsIjsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICAodm9pZCljbHNfcHJlZml4OworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHJldHVybjsKKyAgaWYgKGlzX3Jlc3VsdCkKKyAgICByZXR1cm47CisgIGlmIChpc194X2ZhY3RvcnkpCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKworICBvdXQgPDwgImZ1bmN0aW9uICI7CisgIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICI6ICI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIG91dCA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICByZXR1cm47CisgIGlmIChpc19yZXN1bHQpCisgICAgcmV0dXJuOworICBpZiAoaXNfeF9mYWN0b3J5KQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiICBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTwiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIj4oIjsKKyAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIik7IjsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lOworICBzdHJpbmcgc3RydWN0X25hbWU7CisgIHN0cmluZyBpc3NldF9uYW1lOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCBmYWxzZSwgZmFsc2UsIHRydWUpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnkpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpOworICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICIgPSBpbnRlcmZhY2UoSUJhc2UpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorCisgICAgaWYgKGlzX3hfZmFjdG9yeSkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7CisgIGlmIChpc19maW5hbCkgeworICAgIG91dCA8PCAic2VhbGVkICI7CisgIH0KKyAgb3V0IDw8ICJjbGFzcygiOworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJUSW50ZXJmYWNlZE9iamVjdCwgSUJhc2UsICIgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaW5fY2xhc3MsIGlzX3Jlc3VsdCwgdHJ1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIkYiLCBpc19leGNlcHRpb24pIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIkZfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ2xlYXIgdmFsdWVzKGZvciB1bmlvbidzIHByb3BlcnR5IHNldHRlcikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICgobWVtYmVycy5zaXplKCkgPiAwKSAmJiBpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRzdHJ1Y3QsIGluZGVudCgpKQorICAgICAgICAgICAgICAgIDw8ICIpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gRXhjZXB0aW9uIEZhY3RvcnkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uICIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOiAiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBJQmFzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFdyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUHJvcGVydGllcyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsZmFsc2UpOworICBpZihhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSx0cnVlKTsKKyAgfQorfQorCisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBib29sIGZvcl9hc3luYykgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBzdHJpbmcgaWZhY2VfbmFtZSA9IGZvcl9hc3luYyA/ICJJQXN5bmMiIDogIklmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi4iICsgaWZhY2VfbmFtZTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGlmYWNlX25hbWUgPDwgIiA9IGludGVyZmFjZSgiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVEludGVyZmFjZWRPYmplY3QiOworICBzdHJpbmcgaW1wbGVtZW50cyA9IGFzeW5jXyA/ICJJZmFjZSwgSUFzeW5jIiA6ICJJZmFjZSI7CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOworICB9CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiwgIiA8PCBpbXBsZW1lbnRzIDw8ICIpIiA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkNyZWF0ZSggcHJvdCwgcHJvdCApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKQorICAgICAgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfIDo9IGlwcm90OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8gOj0gb3Byb3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IFN5c3RlbS5JbnRlZ2VyOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgSW5wdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgaXByb3RfOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgT3V0cHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIG9wcm90XzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJZmFjZSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICB9CisKKyAgaWYoIGFzeW5jXykgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElBc3luYyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UQ2xpZW50IjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIG9uZSBmb3Igc3luYyBvbmx5LCB0d28gZm9yIGFzeW5jK3N5bmMKKyAgICBpbnQgbW9kZSA9IGFzeW5jXyA/IDEgOiAwOworICAgIHdoaWxlKCBtb2RlID49IDApIHsKKyAgICAgIGJvb2wgZm9yX2FzeW5jID0gKG1vZGUgIT0gMCk7CisgICAgICBtb2RlLS07CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgICAgaWYoIGZvcl9hc3luYykgeworICAgICAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgICAgICAgLy8gRGVscGhpIGZvcmNlcyB1cyB0byBzcGVjaWZ5IGEgdHlwZSB3aXRoIElGdXR1cmU8VD4sIHNvIHdlIHVzZSBJbnRlZ2VyPTAgZm9yIHZvaWQgbWV0aG9kcworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTxTeXN0ZW0uSW50ZWdlcj4oZnVuY3Rpb246IFN5c3RlbS5JbnRlZ2VyIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmluZyByZXR0eXBlID0gdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTwiIDw8IHJldHR5cGUgPDwgIj4oZnVuY3Rpb246ICIgPDwgcmV0dHlwZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIlJlc3VsdCA6PSAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IDA7IiA8PCBlbmRsOyAgLy8gbm8gSUZ1dHVyZTx2b2lkPiBpbiBEZWxwaGkKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIlQiKTsKKyAgICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJJIik7CisKKyAgICBzdHJpbmcgYXJnc3ZhciA9IHRtcCgiX2FyZ3MiKTsKKyAgICBzdHJpbmcgbXNndmFyID0gdG1wKCJfbXNnIik7CisKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VxaWRfIDo9IHNlcWlkXyArIDE7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgbXNndmFyIDw8ICIsICciIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKCAiIDw8IG1zZ3ZhciA8PCAiICk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGw7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKKyAgICAgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgc3RyaW5nIGV4Y2VwdHZhciA9IHRtcCgiX2V4Iik7CisgICAgICBzdHJpbmcgYXBwZXh2YXIgPSB0bXAoIl9heCIpOworICAgICAgc3RyaW5nIHJldHZhciA9IHRtcCgiX3JldCIpOworCisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOiBFeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgbXNndmFyIDw8ICIuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgYXBwZXh2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF9zdWNjZXNzKSB0aGVuIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAiIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX2xpc3QoKQorICAgICAgICAgICAgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6PSAiIDw8IHJldHZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBleGNlcHR2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQuQ3JlYXRlKCciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0Jyk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiLCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm9jZXNzb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5DcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCBpZmFjZV8pOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiU2VsZi5pZmFjZV8gOj0gaWZhY2VfOyIgPDwgZW5kbDsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkFTU0VSVCggcHJvY2Vzc01hcF8gPD4gbmlsKTsgIC8vIGluaGVyaXRlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgICAgPDwgInByb2Nlc3NNYXBfIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+LkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8uQWRkT3JTZXRWYWx1ZSggJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3MpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpZmFjZV86IElmYWNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzRnVuY3Rpb24gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2Nlc3NNYXBfOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsgcmVpbnRyb2R1Y2U7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmdW5jdGlvbiAiIDw8IGZ1bGxfY2xzIDw8ICIuUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICA7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOiBJUmVxdWVzdEV2ZW50czsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6PSBuaWw7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIG5vdCBwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgZm4pIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9yIG5vdCBBc3NpZ25lZChmbikgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCBtZXRob2QgbmFtZTogJycnICsgbXNnLk5hbWUgKyAnJycnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidGhlbiBjb250ZXh0IDo9IGV2ZW50cy5DcmVhdGVSZXF1ZXN0Q29udGV4dChtc2cuTmFtZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbHNlIGNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNvbnRleHQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBjb250ZXh0IDw+IG5pbCB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0LkNsZWFudXBDb250ZXh0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IGRvIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gRmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJTdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBzdHJpbmcgZnVuY25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7CisKKyAgc3RyaW5nIG9yZ19hcmdzbmFtZSA9IGZ1bmNuYW1lICsgIl9hcmdzIjsKKyAgc3RyaW5nIGFyZ3NfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiVCIpOworICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiSSIpOworCisgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9IGZ1bmNuYW1lICsgIl9yZXN1bHQiOworICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOworICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gb25lIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBib3RoIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgIDw8ICJwcm9jZWR1cmUgIiA8PCBmdWxsX2NscyA8PCAiLiIgPDwgZnVuY25hbWUKKyAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlUmVhZDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0UmVhZDsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZXQuU3VjY2VzcyA6PSAiOworICB9CisgIHNfc2VydmljZV9pbXBsIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgIH0KKyAgICBzX3NlcnZpY2VfaW1wbCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgfQorICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG8gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJGYWN0b3J5IjsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgOj0gRS4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuVW5oYW5kbGVkRXJyb3IoRSk7IiA8PCBlbmRsOworICB9CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZShFLk1lc3NhZ2UpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguRnJlZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsgIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgaWYgKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLk9uZXdheUNvbXBsZXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgIiIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICI7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiKCI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgb3V0IDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHR5cF9uYW1lOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUpOworICB9IGVsc2UgeworICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cF9uYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcgb2JqOworICBzdHJpbmcgY291bnRlcjsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TWFwOyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdFNldDsiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TGlzdDsiOworICB9CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKyAgY291bnRlciA9IHRtcCgiX2kiKTsKKyAgbG9jYWxfdmFyID0gY291bnRlciArICI6IFN5c3RlbS5JbnRlZ2VyOyI7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSkgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgY291bnRlciA8PCAiIDo9IDAgdG8gIiA8PCBvYmogPDwgIi5Db3VudCAtIDEgZG8iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZrZXksICIiLCBsb2NhbF92YXJzKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZ2YWwsICIiLCBsb2NhbF92YXJzKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZE9yU2V0VmFsdWUoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICAodm9pZClsb2NhbF92YXJzOworCisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUFuc2lTdHJpbmcoIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihTeXN0ZW0uSW50ZWdlcigiIDw8IG5hbWUgPDwgIikpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgICh2b2lkKWxvY2FsX3ZhcnM7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnRfaW1wbCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIG9iajsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgibWFwIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdE1hcDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJzZXRfIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdFNldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0TGlzdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmtmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmdmZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgKHZvaWQpaXNQdWJsaWM7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdGZpZWxkKTsKKyAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIgorICAgICAgICAgICAgICA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIiB3cml0ZSBTZXQiCisgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbikgeworICByZXR1cm4gcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCB0cnVlLCBpc194Y2VwdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXQgPSAiQSIgKyByZXQ7CisgIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIGZhbHNlLCBmYWxzZSk7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9jbHNubShzdHJpbmcgY2xzbm0sIHN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkKSB7CisgIGlmIChjbHNubS5zaXplKCkgPiAwKSB7CisgICAgY2xzbm1bMF0gPSB0b3VwcGVyKGNsc25tWzBdKTsKKyAgfQorICBpZiAoYl9ub19jaGVja19rZXl3b3JkKSB7CisgICAgcmV0dXJuIHByZWZpeCArIGNsc25tOworICB9IGVsc2UgeworICAgIHJldHVybiBub3JtYWxpemVfbmFtZShwcmVmaXggKyBjbHNubSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdGRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIGlmICh0ZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeyAvLyBmb3J3YXJkIHR5cGVzIGFjY29yZGluZyB0byBUSFJJRlQtMjQyMQorICAgICAgaWYgKHRkZWYtPmdldF90eXBlKCkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHlwZV9uYW1lKHRkZWYtPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9ub19wb3N0Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bnJlc29sdmVkIGZvcndhcmQgZGVjbGFyYXRpb246ICIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCJUIiArIHRkZWYtPmdldF9zeW1ib2xpYygpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwX25tOworCisgIHN0cmluZyBzX2ZhY3Rvcnk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgYl9jbHMgPSB0cnVlOworICAgIGJfbm9fcG9zdGZpeCA9IHRydWU7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnREaWN0aW9uYXJ5SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0RGljdGlvbmFyeSI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkKKyAgICAgICAgICAgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRIYXNoU2V0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJSGFzaFNldCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnRMaXN0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0TGlzdCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICBzdHJpbmcgdHlwZV9wcmVmaXg7CisKKyAgaWYgKGJfY2xzKSB7CisgICAgdHlwZV9wcmVmaXggPSAiVCI7CisgIH0gZWxzZSB7CisgICAgdHlwZV9wcmVmaXggPSAiSSI7CisgIH0KKworICBzdHJpbmcgbm0gPSBub3JtYWxpemVfY2xzbm0odHR5cGUtPmdldF9uYW1lKCksIHR5cGVfcHJlZml4KTsKKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSkgeworICAgIG5tID0gbm0gKyAiRmFjdG9yeSI7CisgIH0KKworICBpZiAoYl9jbHMpIHsKKyAgICBpZiAoIWJfbm9fcG9zdGZpeCkgeworICAgICAgbm0gPSBubSArICJJbXBsIjsKKyAgICB9CisgIH0KKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSAmJiBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpICsgIi4iICsgbm07CisgIH0KKworICByZXR1cm4gbm07Cit9CisKKy8vIHJldHVybnMgImNvbnN0ICIgZm9yIHNvbWUgYXJndW1lbnQgdHlwZXMKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSkgeworCisgIC8vIGJhc2UgdHlwZXMKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisKKyAgICAvLyB0aGVzZSBzaG91bGQgYmUgY29uc3QnZWQgZm9yIG9wdGltYWwgcGVyZm9ybWFtY2UKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gcmVmY291bnRlZCBwb2ludGVyCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIC8vIGxhcmdlciB0aGFuIDMyIGJpdAorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKKyAgICAgIHJldHVybiAiY29uc3QgIjsKKworICAgIC8vIGFsbCBvdGhlcnMgZG9uJ3QgbmVlZCB0byBiZQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiIjsKKworICAgIC8vIHdlIGJldHRlciBhbHdheXMgcmVwb3J0IGFueSB1bmtub3duIHR5cGVzCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaW5wdXRfYXJnX3ByZWZpeCgpIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorCisgICAgLy8gZW51bXMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIiOyAvLyB1c3VhbGx5IDw9IDMyIGJpdAorCisgICAgLy8gY29udGFpbmVycworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisgIH0KKworICAvLyBhbnkgb3RoZXIgdHlwZSwgZWl0aGVyIFRTb21ldGhpbmcgb3IgSVNvbWV0aGluZworICByZXR1cm4gImNvbnN0ICI7IC8vIHBvc3NpYmx5IHJlZmNvdW50ZWQgcG9pbnRlcgorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgLy8gbm8gInZvaWQiIGluIERlbHBoaSBsYW5ndWFnZQorICAgIHJldHVybiAiIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICByZXR1cm4gIlN5c3RlbS5BbnNpU3RyaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3lzVXRpbHMuVEJ5dGVzIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTeXN0ZW0uc3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIlN5c3RlbS5Cb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIlN5c3RlbS5TaG9ydEludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU3lzdGVtLlNtYWxsSW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTeXN0ZW0uSW50ZWdlciI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiU3lzdGVtLkludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJTeXN0ZW0uRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKWluaXQ7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIHN0cmluZyByZXN1bHQgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgKyAiOiAiCisgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9hc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyBwcmVmaXg7CisgIGlmIChmdWxsX2NscyA9PSAiIikgeworICAgIHByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIHByZWZpeCA9IGZ1bGxfY2xzICsgIi4iOworICB9CisKKyAgaWYoIGZvcl9hc3luYykgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8SW50ZWdlcj47IjsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPCIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI+OyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgICB9CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogdHQ7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiOyAiOworICAgIH0KKworICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHJlc3VsdCArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjdXJyZW50X2luZGVudCkgeworICBvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiB0dDsKKyAgc3RyaW5nIGxpbmUgPSAiIjsKKyAgc3RyaW5nIG5ld2xpbmVfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyAiICAiOworCisgIGJvb2wgZmlyc3RsaW5lID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZSArPSAiOyI7CisgICAgfQorCisgICAgaWYgKGxpbmUuc2l6ZSgpID4gODApIHsKKyAgICAgIGlmIChmaXJzdGxpbmUpIHsKKyAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7CisgICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKKyAgICB9IGVsc2UgaWYgKGxpbmUuc2l6ZSgpID4gMCkgeworICAgICAgbGluZSArPSAiICI7CisgICAgfQorCisgICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgbGluZSArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgbGluZSArPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKKyAgfQorCisgIGlmIChsaW5lLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgPDwgbGluZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHRfc3RyOworCisgIGlmIChmaXJzdGxpbmUpIHsKKyAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOworICB9IGVsc2UgeworICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0X3N0cjsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmdfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZV8iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0XyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICByZXR1cm4gIicnIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJyciOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiRmFsc2UiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIwLjAiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQiICsgdHlwZS0+Z2V0X25hbWUoKSArICIoMCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0X19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWlzX3VuaW9uOworICAodm9pZClpc194Y2VwdGlvbl9mYWN0b3J5OworICAodm9pZCl4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IEZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSAiCisgICAgICAgICAgICAgICAgICAgPDwgIkRlZmF1bHQoICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgICAgICA8PCAiKCBjb25zdCBWYWx1ZTogIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAoaXNfdW5pb24pIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX3hjZXB0aW9uX2NsYXNzICYmICghaXNfeGNlcHRpb25fZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgICh2b2lkKXR5cGU7CisKKyAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IGlzc2V0X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKworICBzdHJpbmcgZXhjZXB0aW9uX2Nsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKTsKKyAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5GIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHByb3BuYW1lOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBpcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDogU3lzdGVtLkJvb2xlYW47IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBGQUxTRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJzdHJ1YyA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW47IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIndoaWxlICh0cnVlKSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJCcmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImNhc2UgZmllbGRfLklEIG9mIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9CisKKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIGNvZGVfYmxvY2sgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKworICAgIC8vIHJlcXVpcmVkIGZpZWxkPworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVFJVRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQgZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCI7CisgIH0KKworICBpZiAoIWZpcnN0KSB7CisgICAgY29kZV9ibG9jayA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKKworICBpZiAoIWZpcnN0KSB7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgLy8gYWxsIHJlcXVpcmVkIGZpZWxkcyBoYXZlIGJlZW4gcmVhZD8KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIG5vdCBfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spCisgICAgICAgICAgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIHN0cnVjLCAnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBmaWVsZF8pOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkbmFtZSA9IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbik7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBib29sIGhhc19pc3NldCA9ICghaXNfcmVxdWlyZWQpOworICAgIGlmIChpc19yZXF1aXJlZCAmJiBudWxsX2FsbG93ZWQpIHsKKyAgICAgIG51bGxfYWxsb3dlZCA9IGZhbHNlOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPSBuaWwpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIncmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZG5hbWUgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPD4gbmlsKSI7CisgICAgICBpZiAoaGFzX2lzc2V0KSB7CisgICAgICAgIGNvZGVfYmxvY2sgPDwgIiBhbmQgX19pc3NldF8iIDw8IGZpZWxkbmFtZTsKKyAgICAgIH0KKyAgICAgIGNvZGVfYmxvY2sgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19pc3NldCkgeworICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBmaWVsZG5hbWUgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaGFzX2lzc2V0KSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc3RyaW5nIHRtcF9zYiA9IHRtcCgiX3NiIik7CisgIHN0cmluZyB0bXBfZmlyc3QgPSB0bXAoIl9maXJzdCIpOworICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Ub1N0cmluZzogc3RyaW5nOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDogVFRocmlmdFN0cmluZ0J1aWxkZXI7IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDo9IFRUaHJpZnRTdHJpbmdCdWlsZGVyLkNyZWF0ZSgnKCcpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGlmICh1c2VGaXJzdEZsYWcpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IFRSVUU7IiA8PCBlbmRsOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIG91dCA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICB9CisgICAgICBvdXQgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBub3QgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsJyk7IiA8PCBlbmRsOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gRkFMU0U7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiID0gbmlsKSB0aGVuICIgPDwgdG1wX3NiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQXBwZW5kKCc8bnVsbD4nKSBlbHNlICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCBTZWxmLiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKFN5c3RlbS5JbnRlZ2VyKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCggU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaXNfb3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFpc19vcHRpb25hbCkgeworICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyknKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IHRtcF9zYiA8PCAiLlRvU3RyaW5nOyIgPDwgZW5kbDsKKyAgaWYgKHVzZUZpcnN0RmxhZykgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiB7cHJldmVudCB3YXJuaW5nfTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuRnJlZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRlbHBoaSwKKyAgICAiZGVscGhpIiwKKyAgICAiICAgIGFuc2lzdHJfYmluYXJ5OiAgVXNlIEFuc2lTdHJpbmcgZm9yIGJpbmFyeSBkYXRhdHlwZSAoZGVmYXVsdCBpcyBUQnl0ZXMpLlxuIgorICAgICIgICAgcmVnaXN0ZXJfdHlwZXM6ICBFbmFibGUgVHlwZVJlZ2lzdHJ5LCBhbGxvd3MgZm9yIGNyZWF0aW9uIG9mIHN0cnVjdCwgdW5pb25cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnRhaW5lciBpbnN0YW5jZXMgYnkgaW50ZXJmYWNlIG9yIFR5cGVJbmZvKClcbiIKKyAgICAiICAgIGNvbnN0cHJlZml4OiAgICAgTmFtZSBUQ29uc3RhbnRzIGNsYXNzZXMgYWZ0ZXIgSURMIHRvIHJlZHVjZSBhbWJpZ3VpdGllc1xuIgorICAgICIgICAgZXZlbnRzOiAgICAgICAgICBFbmFibGUgYW5kIHVzZSBwcm9jZXNzaW5nIGV2ZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCisgICAgIiAgICB4bWxkb2M6ICAgICAgICAgIEVuYWJsZSBYTUxEb2MgY29tbWVudHMgZm9yIEhlbHAgSW5zaWdodCBldGMuXG4iCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEdlbmVyYXRlIElBc3luYyBpbnRlcmZhY2UgdG8gdXNlIFBhcmFsbGVsIFByb2dyYW1taW5nIExpYnJhcnkgKFhFNysgb25seSkuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDkxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMjgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9lcmxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbGVnYWN5X25hbWVzXyA9IGZhbHNlOworICAgIG1hcHNfID0gZmFsc2U7CisgICAgb3RwMTZfID0gZmFsc2U7CisgICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsZWdhY3luYW1lcyIpID09IDApIHsKKyAgICAgICAgbGVnYWN5X25hbWVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1hcHMiKSA9PSAwKSB7CisgICAgICAgIG1hcHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3RwMTYiKSA9PSAwKSB7CisgICAgICAgIG90cDE2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFwc18gJiYgb3RwMTZfKSB7CisgICAgICB0aHJvdyAiYXJndW1lbnQgZXJyb3I6IENhbm5vdCBzcGVjaWZ5IGJvdGggbWFwcyBhbmQgb3RwMTY7IG1hcHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIEVybGFuZy9PVFAgUjE2IG9yIG9sZGVyIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1lcmwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl90eXBlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQqIGZpZWxkKTsKKworICAvLyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpOworICB2b2lkIGdlbmVyYXRlX2VudW1faW5mbyh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gZGVjYXBpdGFsaXplKGluKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoaW4pOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGF0b21pZnkoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuICInIiArIGRlY2FwaXRhbGl6ZShpbikgKyAiJyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiJyIgKyBpbiArICInIjsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGlmeShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gY2FwaXRhbGl6ZShpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1cHBlcmNhc2UoaW4pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb21tZW50KHN0cmluZyBpbik7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCopOworCisgIC8qIGlmIHRydWUgcmV0YWluIHByZSAwLjkuMiBuYW1pbmcgc2NoZW1lIGZvciBmdW5jdGlvbnMsIGF0b21zIGFuZCBjb25zdHMgKi8KKyAgYm9vbCBsZWdhY3lfbmFtZXNfOworCisgIC8qIGlmIHRydWUgdXNlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cyBpbiBnZW5lcmF0ZWQgY29kZSAqLworICBib29sIG1hcHNfOworCisgIC8qIGlmIHRydWUgdXNlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQgKi8KKyAgYm9vbCBvdHAxNl87CisKKyAgLyoqCisgICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAorICAgKi8KKworICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBleHBvcnRfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOworCisgIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKKworICAvKioKKyAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcworICAgKi8KKworICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworCisgIC8qKgorICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcworICAgKi8KKworICBib29sIGV4cG9ydF9saW5lc19maXJzdF87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOworCisgIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2hybF9maWxlXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2hybF9maWxlXzsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2hybF87CisKKyAgLyoqCisgICAqIE1ldGFkYXRhIGNvbnRhaW5lcnMKKyAgICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X3N0cnVjdF9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X2VudW1fbmFtZXNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9leGNlcHRpb25fbmFtZXNfOworICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiB2X2VudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IHZfY29uc3RzXzsKK307CisKKy8qKgorICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCisgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICBzdHJpbmcgcHJvZ3JhbV9tb2R1bGVfbmFtZSA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXyk7CisKKyAgLy8gdHlwZXMgZmlsZXMKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5lcmwiOworICBzdHJpbmcgZl90eXBlc19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5ocmwiOworCisgIGZfdHlwZXNfZmlsZV8ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIGZfdHlwZXNfaHJsX2ZpbGVfLm9wZW4oZl90eXBlc19ocmxfbmFtZS5jX3N0cigpKTsKKworICBocmxfaGVhZGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcyIpOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIC8vIGNvbnN0cyBmaWxlcworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuZXJsIjsKKyAgc3RyaW5nIGZfY29uc3RzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5ocmwiOworCisgIGZfY29uc3RzX2ZpbGVfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgZl9jb25zdHNfaHJsX2ZpbGVfLm9wZW4oZl9jb25zdHNfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfY29uc3RhbnRzKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX2NvbnN0c19ocmxfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogQm9pbGVycGxhdGUgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGVhZGVyIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfaGVhZGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICItaWZuZGVmKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCkuIiA8PCBlbmRsIDw8ICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIgorICAgICAgPDwgZW5kbDsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICAodm9pZCluYW1lOworICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgKyAiX3R5cGVzLmhybFwiKS5cbiI7CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiJSVcbiIpICsgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiJSVcbiIgKyAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgKyAiJSVcbiI7Cit9CisKKy8qKgorICogQ29tbWVudCBvdXQgdGV4dAorICovCisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmNvbW1lbnQoc3RyaW5nIGluKSB7CisgIHNpemVfdCBwb3MgPSAwOworICBpbi5pbnNlcnQocG9zLCAiJSUgIik7CisgIHdoaWxlICgocG9zID0gaW4uZmluZF9maXJzdF9vZignXG4nLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBpbi5pbnNlcnQoKytwb3MsICIlJSAiKTsKKyAgfQorICByZXR1cm4gaW47Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgeworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm9fZXh0IiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImVudW1faW5mbyIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJlbnVtX25hbWVzIiwgMCk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9uYW1lcyIsIDApOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJleGNlcHRpb25fbmFtZXMiLCAwKTsKKworICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvXy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoInN0cnVjdF9uYW1lcyIsIHZfc3RydWN0X25hbWVzXyk7CisgIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgiZW51bV9uYW1lcyIsIHZfZW51bV9uYW1lc18pOworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJleGNlcHRpb25fbmFtZXMiLCB2X2V4Y2VwdGlvbl9uYW1lc18pOworCisgIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7CisKKyAgZl90eXBlc19maWxlXy5jbG9zZSgpOworICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19ocmxfZmlsZV8uY2xvc2UoKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAjaWZkZWYgX01TQ19WRVIKKyAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbHNlCisgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGVybGFuZyBnZW5lcmF0b3IgYW5kIHRoZSBNU1ZDIGNvbXBpbGVyIGlzIG9sZGVyIHRoYW4gMjAxNSwKKyAgICAgICAgICAvLyB0aGUgZG91YmxlIGxpdGVyYWwgbXVzdCBiZSBvdXRwdXQgaW4gdGhlIHNjaWVudGlmaWMgZm9ybWF0LiBUaGVyZSBjYW4gYmUgc29tZSBjYXNlcyB3aGVyZSB0aGUKKyAgICAgICAgICAvLyBtYW50aXNzYSBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IGhhdmUgZnJhY3Rpb25hbHMsIHdoaWNoIGlzIGlsbGVnYWwgaW4gRXJsYW5nLgorICAgICAgICAgIC8vIGV4YW1wbGUgPT4gMTAwMDAwMDAwMDAwMDAwMDAuMCBiZWluZyBvdXRwdXQgYXMgMWUrMTYKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNjaWVudGlmaWM7CisgICAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICNlbmRpZgorCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpIHsKKyAgc2l6ZV90IG51bV9zdHJ1Y3RzID0gbmFtZXMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCBmdW5jdGlvbl9uYW1lIDw8ICIoKSAtPlxuIjsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiWyI7CisKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IG51bV9zdHJ1Y3RzOyBpKyspIHsKKyAgICBmX3R5cGVzX2ZpbGVfIDw8IG5hbWVzLmF0KGkpOworCisgICAgaWYgKGkgPCBudW1fc3RydWN0cyAtIDEpIHsKKyAgICAgIGZfdHlwZXNfZmlsZV8gPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzX2ZpbGVfIDw8ICJdLlxuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIG5vIG9wCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgY29uc3RfZnVuX25hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisKKyAgICAvLyBFbWl0IGNvbnN0IGZ1bmN0aW9uIGV4cG9ydC4KKyAgICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeyBleHBvcnRzIDw8ICIsICI7IH0KKyAgICBleHBvcnRzIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMSwgIiA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzIiOworCisgICAgLy8gRW1pdCBjb25zdCBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X21hcCgpLmVuZCgpOworICAgIC8vIFRoZSBvbmUtYXJndW1lbnQgZm9ybSB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIigiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIpIC0+ICIKKyAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCk7CisgICAgICArK2k7CisgICAgICBmdW5jdGlvbnMgPDwgKGkgIT0gZW5kID8gIjtcbiIgOiAiLlxuXG4iKTsKKyAgICB9CisKKyAgICAvLyBUaGUgdHdvLWFyZ3VtZW50IGZvcm0gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCBfKSAtPiAiCisgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICI7XG4iOworICAgIH0KKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihfLCBEZWZhdWx0KSAtPiBEZWZhdWx0LlxuXG4iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb25zdF9mdW5fbmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKKworICAgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7IGV4cG9ydHMgPDwgIiwgIjsgfQorICAgIGV4cG9ydHMgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8xLCAiIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMiI7CisKKyAgICBzaXplX3QgbGlzdF9zaXplID0gdmFsdWUtPmdldF9saXN0KCkuc2l6ZSgpOworICAgIHN0cmluZyByZW5kZXJlZF9saXN0ID0gcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKTsKKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihOKSB3aGVuIE4gPj0gMSwgTiA9PCAiIDw8IGxpc3Rfc2l6ZSA8PCAiIC0+XG4iCisgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxlbWVudChOLCB7IiA8PCByZW5kZXJlZF9saXN0IDw8ICJ9KS5cbiI7CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoTiwgXykgd2hlbiBOID49IDEsIE4gPTwgIiA8PCBsaXN0X3NpemUgPDwgIiAtPlxuIgorICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsZW1lbnQoTiwgeyIgPDwgcmVuZGVyZWRfbGlzdCA8PCAifSk7XG4iCisgICAgICAgICAgICAgIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoXywgRGVmYXVsdCkgLT4gRGVmYXVsdC5cblxuIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKSB7CisgIG9zdHJpbmdzdHJlYW0gZXhwb3J0czsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jdGlvbnM7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSB2X2NvbnN0c18uYmVnaW4oKTsgY19pdGVyICE9IHZfY29uc3RzXy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbigqY19pdGVyLCBleHBvcnRzLCBmdW5jdGlvbnMpOworICB9CisgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7CisgICAgZl9jb25zdHNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0cy5zdHIoKSA8PCAiXSkuXG5cbiIKKyAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc3RyKCk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIHZfZW51bXNfLnB1c2hfYmFjayh0ZW51bSk7CisgIHZfZW51bV9uYW1lc18ucHVzaF9iYWNrKGF0b21pZnkodGVudW0tPmdldF9uYW1lKCkpKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgY29uc3RpZnkodGVudW0tPmdldF9uYW1lKCkpIDw8ICJfIiA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiKS4iIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9pbmZvKHRfZW51bSogdGVudW0peworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgc2l6ZV90IG51bV9jb25zdGFudHMgPSBjb25zdGFudHMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiZW51bV9pbmZvKCIgPDwgYXRvbWlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIikgLT5cbiI7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgIltcbiI7CisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBudW1fY29uc3RhbnRzOyBpKyspIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbHVlID0gY29uc3RhbnRzLmF0KGkpOworICAgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAieyIgPDwgYXRvbWlmeSh2YWx1ZS0+Z2V0X25hbWUoKSkgPDwgIiwgIiA8PCB2YWx1ZS0+Z2V0X3ZhbHVlKCkgPDwgIn0iOworCisgICAgaWYgKGkgPCBudW1fY29uc3RhbnRzIC0gMSkgeworICAgICAgZl90eXBlc19maWxlXyA8PCAiLFxuIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3R5cGVzX2ZpbGVfIDw8ICJcbiI7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiXTtcblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKSB7CisgIHNpemVfdCBlbnVtX2NvdW50ID0gdl9lbnVtc18uc2l6ZSgpOworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgZW51bV9jb3VudDsgaSsrKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9IHZfZW51bXNfLmF0KGkpOworICAgIGdlbmVyYXRlX2VudW1faW5mbyh0ZW51bSk7CisgIH0KKworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgImVudW1faW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS5cblxuIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIC8vIFNhdmUgdGhlIHRjb25zdCBzbyB0aGF0IGZ1bmN0aW9uIGNhbiBiZSBlbWl0dGVkIGluIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpLgorICB2X2NvbnN0c18ucHVzaF9iYWNrKHRjb25zdCk7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiIyIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICJ7IjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgIiA9ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGlmIChtYXBzXykgeworICAgICAgb3V0IDw8ICJtYXBzOmZyb21fbGlzdChbIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKKyAgICB9CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCAieyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJzZXRzOmZyb21fbGlzdChbIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5lbmQoKTsKKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKTsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKSA8PCAiXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiMiICsgdHlwZV9uYW1lKHR5cGUpICsgInt9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICIje30iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImRpY3Q6bmV3KCkiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0czpuZXcoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJbXSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJ1bmRlZmluZWQiOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nKCkgfCBiaW5hcnkoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sZWFuKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludGVnZXIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImZsb2F0KCkiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnRlZ2VyKCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR5cGUpICsgIigpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICJtYXAoKSI7CisgICAgfSBlbHNlIGlmIChvdHAxNl8pIHsKKyAgICAgIHJldHVybiAiZGljdCgpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJkaWN0OmRpY3QoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKG90cDE2XykgeworICAgICAgcmV0dXJuICJzZXQoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAic2V0czpzZXQoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCgpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXR1cm4gInJlcXVpcmVkIjsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgIHJldHVybiAib3B0aW9uYWwiOworICBkZWZhdWx0OgorICAgIHJldHVybiAidW5kZWZpbmVkIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZfc3RydWN0X25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHRzdHJ1Y3QpKTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIHZfZXhjZXB0aW9uX25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHR4Y2VwdGlvbikpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICBidWYgPDwgaW5kZW50KCkgPDwgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7CisgIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKGJ1ZiwgKm1faXRlcik7CisgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgfQorICB9CisgIGJ1ZiA8PCAifSkuIjsKKworICBvdXQgPDwgYnVmLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCAiLXR5cGUgIiArIHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgOjogIyIgKyB0eXBlX25hbWUodHN0cnVjdCkgKyAie30uIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWNvcmQgZmllbGQgZGVmaW5pdGlvbgorICovCisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgb3V0IDw8IGF0b21pZnkodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSh0bWVtYmVyKSkKKyAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX21lbWJlcl92YWx1ZSh0bWVtYmVyKTsKKyAgb3V0IDw8ICIgOjogIiA8PCByZW5kZXJfbWVtYmVyX3R5cGUodG1lbWJlcik7CisgIGlmICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICBvdXQgPDwgIiB8ICd1bmRlZmluZWQnIjsKK30KKworYm9vbCB0X2VybF9nZW5lcmF0b3I6Omhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpCisgICAgICAgICAgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQpOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHNlcnZpY2VfbmFtZV8gPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworCisgIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmhybCI7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuZXJsIjsKKyAgZl9zZXJ2aWNlX2ZpbGVfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV9ocmxfLm9wZW4oZl9zZXJ2aWNlX2hybF9uYW1lLmNfc3RyKCkpOworCisgIC8vIFJlc2V0IHNlcnZpY2UgdGV4dCBhZ2dyZWdhdGluZyBzdHJlYW0gc3RyZWFtcworICBmX3NlcnZpY2VfLnN0cigiIik7CisgIGV4cG9ydF9saW5lc18uc3RyKCIiKTsKKyAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgaHJsX2hlYWRlcihmX3NlcnZpY2VfaHJsXywgc2VydmljZV9uYW1lXyk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiCisgICAgICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsgLy8gY3Bpcm86IE5ldyBFcmxhbmcgT3JkZXIKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0c2VydmljZSk7CisKKyAgLy8gaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgIi1tb2R1bGUoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfdGhyaWZ0KS4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7CisKKyAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9uYW1lcyIsIDApOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHNpemVfdCBudW1fZnVuY3Rpb25zID0gZnVuY3Rpb25zLnNpemUoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX25hbWVzKCkgLT4gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbIjsKKworICBmb3IgKHNpemVfdCBpPTA7IGkgPCBudW1fZnVuY3Rpb25zOyBpKyspIHsKKyAgICB0X2Z1bmN0aW9uKiBjdXJyZW50ID0gZnVuY3Rpb25zLmF0KGkpOworICAgIGZfc2VydmljZV8gPDwgYXRvbWlmeShjdXJyZW50LT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoaSA8IG51bV9mdW5jdGlvbnMgLSAxKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiXS5cblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAorICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdGZ1bmN0aW9uOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZXhwb3J0X3N0cmluZygiZnVuY3Rpb25faW5mbyIsIDIpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8ICIlJSUgaW50ZXJmYWNlIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gSW5oZXJpdGFuY2UgLSBwYXNzIHVua25vd24gZnVuY3Rpb25zIHRvIGJhc2UgY2xhc3MKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKSAtPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIC8vIHJldHVybiBmdW5jdGlvbl9jbGF1c2UgZXJyb3IgZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbnMKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oX0Z1bmMsIF9JbmZvKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcGFyYW1zX3R5cGUpIGFuZAorICogZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHJlcGx5X3R5cGUpCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgc3RyaW5nIG5hbWVfYXRvbSA9IGF0b21pZnkodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcmVwbHlfdHlwZSkgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7CisgIGVsc2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBleGNlcHRpb25zKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHhzLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoVGhpcyIKKyAgICAgICAgICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOworfQorCisvKioKKyAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKKyAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOworICB9CisgIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgeworICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgeworICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7CisgIH0KKyAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnNpemVfdHlwZSBudW0gPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpOworICBpZiAobnVtID4gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbiwgbmFtZSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9CisgIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgIDEgLy8gVGhpcworICAgICAgICAgICAgICAgICsgc3RhdGljX2Nhc3Q8aW50PihudW0pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHJlc3VsdCArPSAiLCAiOyAvLyBpbml0aWFsIGNvbW1hIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgVGhpcworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImVybCIpOworICBzaXplX3QgcHJlZml4X2xlbmd0aCA9IHByZWZpeC5sZW5ndGgoKTsKKyAgaWYgKHByZWZpeF9sZW5ndGggPiAwICYmIHByZWZpeFtwcmVmaXhfbGVuZ3RoIC0gMV0gIT0gJ18nKSB7CisgICAgcHJlZml4ICs9ICcuJzsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgcmV0dXJuIGF0b21pZnkocHJlZml4ICsgbmFtZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiP3RUeXBlX0k4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIj90VHlwZV9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiP3RUeXBlX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKKyAqLworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW5kZWRfaW5mbykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmIChleHBhbmRfc3RydWN0cykgeworCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgICAgICBidWYgPDwgIntzdHJ1Y3QsIFsiOworICAgICAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOworCisgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlIGNvbnN0JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gZmllbGRzLmVuZCgpOworICAgICAgZm9yIChpID0gZmllbGRzLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjp2YWx1ZV90eXBlIG1lbWJlciA9ICppOworICAgICAgICBpbnQzMl90IGtleSA9IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHJlbmRlcl90eXBlX3Rlcm0obWVtYmVyLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOyAvLyByZWN1cnNpdmUgY2FsbAorCisgICAgICAgIGlmICghZXh0ZW5kZWRfaW5mbykgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgVHlwZX18Li4uXX0KKyAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiIDw8IHR5cGUgPDwgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgUmVxLCBUeXBlLCBOYW1lLCBEZWZ9fC4uLl19CisgICAgICAgICAgc3RyaW5nIG5hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICAgICAgc3RyaW5nIHZhbHVlID0gcmVuZGVyX21lbWJlcl92YWx1ZShtZW1iZXIpOworICAgICAgICAgIHN0cmluZyByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOworICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgcmVxdWlyZWRuZXNzIDw8ICIsICIgPDwgdHlwZSA8PCAiLCAiIDw8IGF0b21pZnkobmFtZSkgPDwgIiwgIgorICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAifSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKytpICE9IGVuZCkgeworICAgICAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnVmIDw8ICJdfSIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBidWYuc3RyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAie3N0cnVjdCwgeyIgKyBhdG9taWZ5KHR5cGVfbW9kdWxlKHR5cGUpKSArICIsICIgKyB0eXBlX25hbWUodHlwZSkgKyAifX0iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIC8vIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgcmV0dXJuICJ7bWFwLCAiICsgcmVuZGVyX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArIHJlbmRlcl90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKQorICAgICAgICAgICArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgcmV0dXJuICJ7c2V0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICByZXR1cm4gIntsaXN0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGVybCwKKyAgICAiRXJsYW5nIiwKKyAgICAiICAgIGxlZ2FjeW5hbWVzOiBPdXRwdXQgZmlsZXMgcmV0YWluIG5hbWluZyBjb252ZW50aW9ucyBvZiBUaHJpZnQgMC45LjEgYW5kIGVhcmxpZXIuXG4iCisgICAgIiAgICBtYXBzOiAgICAgICAgR2VuZXJhdGUgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzLlxuIgorICAgICIgICAgb3RwMTY6ICAgICAgIEdlbmVyYXRlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmNWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBUb3AgbGV2ZWwgcHJvZ3JhbSBnZW5lcmF0aW9uIGZ1bmN0aW9uLiBDYWxscyB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzIG1ldGhvZHMKKyAqIGZvciBwcmVwYXJpbmcgZmlsZSBzdHJlYW1zIGV0Yy4gdGhlbiBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgdGhlCisgKiBwcm9ncmFtIHRvIHBlcmZvcm0gdGhlIGNvcnJlY3QgYWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgdGhyaWZ0IHByb2dyYW0gdG8gY29tcGlsZSBpbnRvIEMrKyBzb3VyY2UKKyAqLwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24oKm9faXRlcik7CisgIH0KKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0X2dlbmVyYXRvcjo6bGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcga2V5d29yZHNbXSA9IHsgIkJFR0lOIiwgIkVORCIsICJfX0NMQVNTX18iLCAiX19ESVJfXyIsICJfX0ZJTEVfXyIsICJfX0ZVTkNUSU9OX18iLAorICAgICAgIl9fTElORV9fIiwgIl9fTUVUSE9EX18iLCAiX19OQU1FU1BBQ0VfXyIsICJhYnN0cmFjdCIsICJhbGlhcyIsICJhbmQiLCAiYXJncyIsICJhcyIsCisgICAgICAiYXNzZXJ0IiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY2xvbmUiLCAiY29udGludWUiLCAiZGVjbGFyZSIsCisgICAgICAiZGVmIiwgImRlZmF1bHQiLCAiZGVsIiwgImRlbGV0ZSIsICJkbyIsICJkeW5hbWljIiwgImVsaWYiLCAiZWxzZSIsICJlbHNlaWYiLCAiZWxzaWYiLAorICAgICAgImVuZCIsICJlbmRkZWNsYXJlIiwgImVuZGZvciIsICJlbmRmb3JlYWNoIiwgImVuZGlmIiwgImVuZHN3aXRjaCIsICJlbmR3aGlsZSIsICJlbnN1cmUiLAorICAgICAgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImZvcmVhY2giLCAiZnJvbSIsICJmdW5jdGlvbiIsICJnbG9iYWwiLAorICAgICAgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5saW5lIiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgImlzIiwKKyAgICAgICJsYW1iZGEiLCAibW9kdWxlIiwgIm5hdGl2ZSIsICJuZXciLCAibmV4dCIsICJuaWwiLCAibm90IiwgIm9yIiwgInBhY2thZ2UiLCAicGFzcyIsCisgICAgICAicHVibGljIiwgInByaW50IiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInJhaXNlIiwgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJlZ2lzdGVyIiwKKyAgICAgICJyZXR1cm4iLCAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhlbiIsICJ0aGlzIiwKKyAgICAgICJ0aHJvdyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgInVuZGVmIiwgInVubGVzcyIsICJ1bnNpZ25lZCIsICJ1bnRpbCIsICJ1c2UiLCAidmFyIiwKKyAgICAgICJ2aXJ0dWFsIiwgInZvbGF0aWxlIiwgIndoZW4iLCAid2hpbGUiLCAid2l0aCIsICJ4b3IiLCAieWllbGQiIH07CisgIHJldHVybiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4oa2V5d29yZHMsIGtleXdvcmRzICsgc2l6ZW9mKGtleXdvcmRzKS9zaXplb2Yoa2V5d29yZHNbMF0pICk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlX2lucHV0KCkgY29uc3QgeworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X2VudW1zKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X29iamVjdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfY29uc3RzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKGNvbnN0IHZlY3RvcjxUPiYgbGlzdCkgY29uc3R7CisgIHR5cGVuYW1lIHZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvcihpdD1saXN0LmJlZ2luKCk7IGl0ICE9IGxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgIHZhbGlkYXRlKCppdCk7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9mdW5jdGlvbiBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X2FyZ2xpc3QoKSk7CisgIHZhbGlkYXRlKGYtPmdldF94Y2VwdGlvbnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X2Z1bmN0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9lbnVtIGNvbnN0KiBlbikgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbi0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKGVuLT5nZXRfY29uc3RhbnRzKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIHMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQocy0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKHMtPmdldF9tZW1iZXJzKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW1fdmFsdWUgY29uc3QqIGVuX3ZhbCkgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbl92YWwtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3QgeworICB2YWxpZGF0ZV9pZCh0ZC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGMtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaWQoY29uc3Qgc3RyaW5nJiBpZCkgY29uc3QgeworICBpZiAoa2V5d29yZHNfLmZpbmQoaWQpICE9IGtleXdvcmRzXy5lbmQoKSkgeworICAgIGZhaWx1cmUoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiIiwgaWQuY19zdHIoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgaW4pIGNvbnN0IHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7CisgICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKKyAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7CisgIGlmICghY29tbWVudF9zdGFydC5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7CisgIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOworICB3aGlsZSAoIShkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkgeworICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICBpZiAoc3RybGVuKGxpbmUpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmIChsaW5lX3ByZWZpeC5lbXB0eSgpKXsKKyAgICAgIG91dCA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmKCFkb2NzLmVvZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisgIGlmICghY29tbWVudF9lbmQuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCBjb21tZW50X2VuZDsKK30KKwordm9pZCB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgaWYgKHRoZV9tYXAuZmluZChmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpKSAhPSB0aGVfbWFwLmVuZCgpKSB7CisgICAgZmFpbHVyZSgiRHVwbGljYXRlIGdlbmVyYXRvcnMgZm9yIGxhbmd1YWdlIFwiJXNcIiFcbiIsIGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgdGhlX21hcFtmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpXSA9IGZhY3Rvcnk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMoY29uc3Qgc3RyaW5nJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucykgeworICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IG9wdGlvbnMuZmluZCgnOicpOworICBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKKworICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24gKyAxOworICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7CisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7CisgICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3BvcyAtIHBvcyk7CisgICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zICsgMSk7CisKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7CisgICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGtleSA9IG9wdGlvbjsKKyAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKKyAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvciArIDEpOworICAgICAgfQorCisgICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7CisgICAgfQorICB9Cit9CisKK3RfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgeworICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOworICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOworCisgIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKKyAgc3RyaW5nIGxhbmd1YWdlOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICByZXR1cm4gZ2V0X2dlbmVyYXRvcihwcm9ncmFtLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7CisgIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKKyAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKKyAgcmV0dXJuICp0aGVfbWFwOworfQorCit0X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKKyAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKSwgbG9uZ19uYW1lXyhsb25nX25hbWUpLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKSB7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjlkMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0VORVJBVE9SX0gKKyNkZWZpbmUgVF9HRU5FUkFUT1JfSAorI2RlZmluZSBNU0NfMjAxNV9WRVIgMTkwMAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCisgKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0CisgKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgorICoKKyAqLworY2xhc3MgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiBrZXl3b3Jkc18obGFuZ19rZXl3b3JkcygpKXsKKyAgICB0bXBfID0gMDsKKyAgICBpbmRlbnRfID0gMDsKKyAgICBwcm9ncmFtXyA9IHByb2dyYW07CisgICAgcHJvZ3JhbV9uYW1lXyA9IGdldF9wcm9ncmFtX25hbWUocHJvZ3JhbSk7CisgICAgZXNjYXBlX1snXG4nXSA9ICJcXG4iOworICAgIGVzY2FwZV9bJ1xyJ10gPSAiXFxyIjsKKyAgICBlc2NhcGVfWydcdCddID0gIlxcdCI7CisgICAgZXNjYXBlX1snIiddID0gIlxcXCIiOworICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7CisgIH0KKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQorICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAorICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKworICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKKworICBzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zLCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIGNoZWNrIHdoZXRoZXIgc3ViLW5hbWVzcGFjZSBkZWNsYXJhY3Rpb24gaXMgdXNlZCBieSBnZW5lcmF0b3IuCisgICAqIGUuZy4gYWxsb3cKKyAgICogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgYmFyCisgICAqIHRvIHNwZWNpZnkgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIC1nZW4gcHk6dHdpc3RlZCBpcyBzcGVjaWZpZWQuCisgICAqIFdpbGwgYmUgY2FsbGVkIHdpdGggc3VibmFtZXNwYWNlLCBpLmUuIGlzX3ZhbGlkX25hbWVzcGFjZSgidHdpc3RlZCIpCisgICAqIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgYWJvdmUgZXhhbXBsZS4KKyAgICovCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgICh2b2lkKXN1Yl9uYW1lc3BhY2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEVzY2FwZSBzdHJpbmcgdG8gdXNlIG9uZSBpbiBnZW5lcmF0ZWQgc291cmNlcy4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXNjYXBlX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW4pIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIGdldF9lc2NhcGVkX3N0cmluZyh0X2NvbnN0X3ZhbHVlKiBjb25zdHZhbCkgeworICAgIHJldHVybiBlc2NhcGVfc3RyaW5nKGNvbnN0dmFsLT5nZXRfc3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrIGlmIGFsbCBpZGVudGlmaWVycyBhcmUgdmFsaWQgZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pbnB1dCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxhbmdfa2V5d29yZHMoKSBjb25zdDsKKworICAvKioKKyAgICogQSBsaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMuCisgICAqLworICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5d29yZHNfOworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2VudW0gY29uc3QqIGVuKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bV92YWx1ZSBjb25zdCogZW5fdmFsKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfdHlwZWRlZiBjb25zdCogdGQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9jb25zdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3NlcnZpY2UgY29uc3QqIHMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2Z1bmN0aW9uIGNvbnN0KiBmKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB2YWxpZGF0ZShjb25zdCBzdGQ6OnZlY3RvcjxUPiYgbGlzdCkgY29uc3Q7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsIG1ldGhvZHMgdGhhdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB0YWtlIG5lY2Vzc2FyeQorICAgKiBzdGVwcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBjb2RlIGdlbmVyYXRpb24uCisgICAqLworCisgIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFB1cmUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoZSBnZW5lcmF0b3Igc3ViY2xhc3Nlcy4KKyAgICovCisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsgKHZvaWQpdGNvbnN0OyB9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCopIHt9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgICAgLy8gQnkgZGVmYXVsdCBleGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3RzCisgICAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGdldCB0aGUgcHJvZ3JhbSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfcHJvZ3JhbV9uYW1lKHRfcHJvZ3JhbSogdHByb2dyYW0pIHsgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOyB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7IHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKKyAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7CisgICAgfQorCisgICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCisgICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCisgICAqLworICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVzIGEgY29tbWVudCBhYm91dCB0aGlzIGNvZGUgYmVpbmcgYXV0b2dlbmVyYXRlZCwgdXNpbmcgQysrIHN0eWxlCisgICAqIGNvbW1lbnRzLCB3aGljaCBhcmUgYWxzbyBmYWlyIGdhbWUgaW4gSmF2YSAvIFBIUCwgeWF5IQorICAgKgorICAgKiBAcmV0dXJuIEMtc3R5bGUgY29tbWVudCBtZW50aW9uaW5nIHRoYXQgdGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8qKlxuIikgKyAiICogIiArIGF1dG9nZW5fc3VtbWFyeSgpICsgIlxuIiArICIgKlxuIgorICAgICAgICAgICArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqICBAZ2VuZXJhdGVkXG4iICsgIiAqL1xuIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9zdW1tYXJ5KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIpICsgVEhSSUZUX1ZFUlNJT04gKyAiKSI7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCisgICAqLworCisgIHZvaWQgaW5kZW50X3VwKCkgeyArK2luZGVudF87IH0KKworICB2b2lkIGluZGVudF9kb3duKCkgeyAtLWluZGVudF87IH0KKworICAvKioKKyAgKiBJbmRlbnRhdGlvbiB2YWxpZGF0aW9uIGhlbHBlcgorICAqLworICBpbnQgaW5kZW50X2NvdW50KCkgeyByZXR1cm4gaW5kZW50XzsgfQorCisgIHZvaWQgaW5kZW50X3ZhbGlkYXRlKCBpbnQgZXhwZWN0ZWQsIGNvbnN0IGNoYXIgKiBmdW5jX25hbWUpIHsKKyAgICBpZiAoaW5kZW50XyAhPSBleHBlY3RlZCkgeyAKKyAgICAgIHB2ZXJib3NlKCJXcm9uZyBpbmRlbnQgY291bnQgaW4gJXM6IGRpZmZlcmVuY2UgPSAlaSBcbiIsIGZ1bmNfbmFtZSwgKGV4cGVjdGVkIC0gaW5kZW50XykpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiBwcmludCBmdW5jdGlvbgorICAgKi8KKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeworICAgIHN0ZDo6c3RyaW5nIGluZCA9ICIiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfOyArK2kpIHsKKyAgICAgIGluZCArPSBpbmRlbnRfc3RyKCk7CisgICAgfQorICAgIHJldHVybiBpbmQ7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCisgICAqLworICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnQoKTsgfQorCisgIC8qKgorICAgKiBDYXBpdGFsaXphdGlvbiBoZWxwZXJzCisgICAqLworICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b3VwcGVyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RkOjpzdHJpbmcgZGVjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgdXBwZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaW5baV0gPSB0b3VwcGVyKGluW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKKyAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAorICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCisgICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCisgICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCisgICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCisgICAqLworICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKKyAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKKyAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorCisgIC8qKgorICAgICogVHJhbnNmb3JtcyBhIHN0cmluZyB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyB0byBhIGNhbWVsIGNhc2UgZXF1aXZhbGVudAorICAgICogZS5nLiBhX211bHRpX3dvcmQgLT4gYU11bHRpV29yZAorICAgICogICAgICBzb21lX25hbWUgICAgLT4gIHNvbWVOYW1lCisgICAgKiAgICAgIG5hbWUgICAgICAgICAtPiAgbmFtZQorICAgICovCisgIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgYm9vbCB1bmRlcnNjb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoaW5baV0gPT0gJ18nKSB7CisgICAgICAgIHVuZGVyc2NvcmUgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmRlcnNjb3JlKSB7CisgICAgICAgIG91dCA8PCAoY2hhcil0b3VwcGVyKGluW2ldKTsKKyAgICAgICAgdW5kZXJzY29yZSA9IGZhbHNlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZG91YmxlX291dHB1dF9zdHJlYW07CisgICAgICAvLyBzZXRzIHRoZSBtYXhpbXVtIHByZWNpc2lvbjogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvc2V0cHJlY2lzaW9uCisgICAgICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMSk7CisKKyAgICAgICNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgICAgIC8vIG1vcmUgZGV0YWlsczogaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdmNibG9nLzIwMTQvMDYvMTgvCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBjLXJ1bnRpbWUtY3J0LWZlYXR1cmVzLWZpeGVzLWFuZC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMTQtY3RwMS8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL3Zpc3VhbC1jLXBsdXMtcGx1cy1zdHJ0b2Qtc3RpbGwtYnJva2VuLworICAgICAgICAgICNpZiBfTVNDX1ZFUiA+PSBNU0NfMjAxNV9WRVIKKyAgICAgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICAgICAjZW5kaWYKKyAgICAgICNlbHNlCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbmRpZgorCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCB2YWx1ZTsKKworICAgICAgcmV0dXJuIGRvdWJsZV9vdXRwdXRfc3RyZWFtLnN0cigpOworICB9CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIEdldCB0aGUgdHJ1ZSB0eXBlIGJlaGluZCBhIHNlcmllcyBvZiB0eXBlZGVmcy4KKyAgICovCisgIHN0YXRpYyBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoY29uc3QgdF90eXBlKiB0eXBlKSB7IHJldHVybiB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7IH0KKyAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKKyAgICovCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87CisKKyAgLyoqCisgICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCisgICAqLworICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOworCisgIC8qKgorICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgorICAgKi8KKyAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyKCkgY29uc3QgeworICAgIHJldHVybiAiICAiOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDdXJyZW50IGNvZGUgaW5kZW50YXRpb24gbGV2ZWwKKyAgICovCisgIGludCBpbmRlbnRfOworCisgIC8qKgorICAgKiBUZW1wb3JhcnkgdmFyaWFibGUgY291bnRlciwgZm9yIG1ha2luZyB1bmlxdWUgdmFyaWFibGUgbmFtZXMKKyAgICovCisgIGludCB0bXBfOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KK2NsYXNzIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgOiBwdWJsaWMgc3RkOjpvc3RyaW5nc3RyZWFtIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSgpOiBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKQorICA6IG91dHB1dF9maWxlX3BhdGgob3V0cHV0X2ZpbGVfcGF0aF8pLCBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIH50ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCkgeworICAgIGlmICghY29udGVudHNfd3JpdHRlbikgeworICAgICAgY2xvc2UoKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZW4oc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKSB7CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9IG91dHB1dF9maWxlX3BhdGhfOworICAgIGNsZWFyX2J1ZigpOworICAgIGNvbnRlbnRzX3dyaXR0ZW4gPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGNvbnRlbnRzX3dyaXR0ZW4gfHwgb3V0cHV0X2ZpbGVfcGF0aCA9PSAiIikKKyAgICAgIHJldHVybjsKKworICAgIGlmICghaXNfcmVhZGFibGUob3V0cHV0X2ZpbGVfcGF0aCkpIHsKKyAgICAgIGR1bXAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omlmc3RyZWFtIG9sZF9maWxlOworICAgIG9sZF9maWxlLmV4Y2VwdGlvbnMob2xkX2ZpbGUuZXhjZXB0aW9ucygpIHwgc3RkOjppZnN0cmVhbTo6YmFkYml0IHwgc3RkOjppZnN0cmVhbTo6ZmFpbGJpdCk7CisgICAgb2xkX2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisKKyAgICBpZiAob2xkX2ZpbGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG9sZF9maWxlX2NvbnRlbnRzKHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdCY+KHN0ZDo6b3N0cmluZ3N0cmVhbSgpIDw8IG9sZF9maWxlLnJkYnVmKCkpLnN0cigpKTsKKyAgICAgIG9sZF9maWxlLmNsb3NlKCk7CisKKyAgICAgIGlmIChvbGRfZmlsZV9jb250ZW50cyAhPSBzdHIoKSkgeworICAgICAgICBkdW1wKCk7CisgICAgICB9CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkdW1wKCkgeworICAgIHN0ZDo6b2ZzdHJlYW0gb3V0X2ZpbGU7CisgICAgb3V0X2ZpbGUuZXhjZXB0aW9ucyhvdXRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Om9mc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Om9mc3RyZWFtOjpmYWlsYml0KTsKKyAgICB0cnkgeworICAgICAgb3V0X2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpOworICAgIH0KKyAgICBjYXRjaCAoY29uc3Qgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSYgZSkgeworICAgICAgOjpmYWlsdXJlKCJmYWlsZWQgdG8gd3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZmlsZSAnJXMnLCBkZXRhaWxzOiAnJXMnIiwgb3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBlLndoYXQoKSk7CisgICAgfQorICAgIG91dF9maWxlIDw8IHN0cigpOworICAgIG91dF9maWxlLmNsb3NlKCk7CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IHRydWU7CisgIH0KKworICB2b2lkIGNsZWFyX2J1ZigpIHsKKyAgICBzdHIoc3RkOjpzdHJpbmcoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc19yZWFkYWJsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZV9uYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHN0ZDo6aWZzdHJlYW0oZmlsZV9uYW1lLmNfc3RyKCkpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV9wYXRoOworICBib29sIGNvbnRlbnRzX3dyaXR0ZW47Cit9OwordHlwZWRlZiB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlPGNoYXI+IG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMjE2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICisjZGVmaW5lIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKworY2xhc3MgdF9nZW5lcmF0b3I7CisKKy8qKgorICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6CisgKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgorICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgorICovCitjbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkge30KKworICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKAorICAgICAgLy8gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUuCisgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAvLyBOb3RlOiBwYXJzZWRfb3B0aW9ucyB3aWxsIG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgLy8gTm90ZTogb3B0aW9uX3N0cmluZyBtaWdodCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgPSAwOworCisgIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpID0gMDsKKworICBzdGQ6OnN0cmluZyBnZXRfc2hvcnRfbmFtZSgpIHsgcmV0dXJuIHNob3J0X25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9sb25nX25hbWUoKSB7IHJldHVybiBsb25nX25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9kb2N1bWVudGF0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnRhdGlvbl87IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgc2hvcnRfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGRvY3VtZW50YXRpb25fOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIGdlbmVyYXRvcj4KK2NsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQorICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pIHt9CisKKyAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKKyAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOworICB9Cit9OworCitjbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KTsKKworICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7CisgIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGF1Z25hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OworICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOworCitwcml2YXRlOgorICB0X2dlbmVyYXRvcl9yZWdpc3RyeSgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeShjb25zdCB0X2dlbmVyYXRvcl9yZWdpc3RyeSYpOworfTsKKworI2RlZmluZSBUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGxhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPigjbGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSB7fSAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCBfcmVnaXN0ZXJlcjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTZiODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9ncmFtbWF0aWNhbGx5IHNhbml0aXplZCBmb3Igc3R5bGU6CisgKiBhc3R5bGUgLS1zdHlsZT0xdGJzIC1mIC1wIC1IIC1qIC1VIHRfZ29fZ2VuZXJhdG9yLmNjCisgKgorICogVGhlIG91dHB1dCBvZiBhc3R5bGUgc2hvdWxkIG5vdCBiZSB0YWtlbiB1bnF1ZXN0aW9uaW5nbHksIGJ1dCBpdCBpcyBhIGdvb2QKKyAqIGd1aWRlIGZvciBlbnN1cmluZyB1bmlmb3JtaXR5IGFuZCByZWFkYWJpbGl0eS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgaGVscGVyIGZvciBhdXRvbWF0aWNhbGx5IGZvcm1hdHRpbmcgdGhlIGVtaXR0ZWQgR28gY29kZSBmcm9tIHRoZSBUaHJpZnQKKyAqIElETCBwZXIgdGhlIEdvIHN0eWxlIGd1aWRlLgorICoKKyAqIFJldHVybnM6CisgKiAgLSB0cnVlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIHN1Y2NlZWRlZC4KKyAqICAtIGZhbHNlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIGZhaWxlZCwgd2hpY2ggbWVhbnMgdGhlIGJhc2ljIG91dHB1dCB3YXMKKyAqICAgICAgICAgICBzdGlsbCBnZW5lcmF0ZWQuCisgKi8KK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCk7CisKK2NvbnN0IHN0cmluZyBERUZBVUxUX1RIUklGVF9JTVBPUlQgPSAiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiOworc3RhdGljIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZmxhZzsKKworLyoqCisgKiBHbyBjb2RlIGdlbmVyYXRvci4KKyAqLworY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dvX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKworICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IERFRkFVTFRfVEhSSUZUX0lNUE9SVDsKKyAgICBnZW5fcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9mbGFnID0gIiI7CisgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IGZhbHNlOworICAgIGlnbm9yZV9pbml0aWFsaXNtc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwYWNrYWdlX3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0aHJpZnRfaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZSIpID09IDApIHsKKyAgICAgICAgcGFja2FnZV9mbGFnID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlYWRfd3JpdGVfcHJpdmF0ZSIpID09IDApIHsKKyAgICAgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImlnbm9yZV9pbml0aWFsaXNtcyIpID09IDApIHsKKyAgICAgICAgaWdub3JlX2luaXRpYWxpc21zXyA9ICB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGdvOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1nbyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQgPSBmYWxzZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc19jb3VudHNldGZpZWxkcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdDsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgZ29fcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2JlZ2luKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19lbmQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHN0cmluZyYgdW51c2VkX3Byb3RlY3Rpb24pOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHRpb25hbF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRFcnJvciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgICAgaWYgKCFwYWNrYWdlX2ZsYWcuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2VfZmxhZzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICAgIGlmICghcmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICAgIH0KKworICAgIHJldHVybiBsb3dlcmNhc2UocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZ2VuX3BhY2thZ2VfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgZ2VuX3RocmlmdF9pbXBvcnRfOworICBib29sIHJlYWRfd3JpdGVfcHJpdmF0ZV87CisgIGJvb2wgaWdub3JlX2luaXRpYWxpc21zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIHN0ZDo6c3RyaW5nIGZfdHlwZXNfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBzdGQ6OnN0cmluZyBmX2NvbnN0c19uYW1lXzsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdF92YWx1ZXNfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVhZF9tZXRob2RfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHdyaXRlX21ldGhvZF9uYW1lXzsKKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29tbW9uSW5pdGlhbGlzbXM7CisKKyAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgZml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgbmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICBzdGF0aWMgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0YXRpYyBib29sIGlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RhdGljIGJvb2wgb21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpOworfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGZpZWxkIGluaXRpYWxpemF0aW9uIGNhbiBiZSBvbWl0dGVkIHNpbmNlIGl0IGhhcyBjb3JyZXNwb25kaW5nIGdvIHR5cGUgemVybyB2YWx1ZQorLy8gb3IgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0Citib29sIHRfZ29fZ2VuZXJhdG9yOjpvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCkgeworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsdWUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X3N0cmluZygpLmVtcHR5KCk7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9kb3VibGUoKSA9PSAwLjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgbmVlZCBhIHJlZmVyZW5jZSBpZiB1c2VkIGFzIG9wdGlvbmFsIHdpdGhvdXQgZGVmYXVsdAorc3RhdGljIGJvb2wgdHlwZV9uZWVkX3JlZmVyZW5jZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKQorICAgICAgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gcmV0dXJucyBmYWxzZSBpZiBmaWVsZCBjb3VsZCBub3QgdXNlIGNvbXBhcmlzb24gdG8gZGVmYXVsdCB2YWx1ZSBhcyAhSXNTZXQqCitib29sIHRfZ29fZ2VuZXJhdG9yOjppc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyX3ZhbHVlOworICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uY291bnQoImNwcC5yZWYiKSAhPSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIC8vIFN0cnVjdHMgaW4gY29udGFpbmVycyBhcmUgcG9pbnRlcnMKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoISh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6c2V0bG9jYWxlKExDX0FMTCwgIkMiKTsgLy8gc2V0IGxvY2FsZSB0byBjbGFzc2ljCisKKyAgLy8gRml4IGNvbW1vbiBpbml0aWFsaXNtIGluIGZpcnN0IHdvcmQKKyAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgMCk7CisKKyAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8KKyAgLy8gY2FwaXRhbCBhbmQgZml4IGNvbW1vbiBpbml0aWFsaXNtcworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDE7IGkgPCB2YWx1ZTIuc2l6ZSgpIC0gMTsgKytpKSB7CisgICAgaWYgKHZhbHVlMltpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpc2xvd2VyKHZhbHVlMltpICsgMV0pKSB7CisgICAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2kgKyAxXSkpOworICAgICAgfQorCisgICAgICBpZiAoaSA+IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50PigpLm1heCgpKSkgeworICAgICAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlLCB2YWx1ZSA9ICIgKyB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIHN0YXRpY19jYXN0PGludD4oaSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiB2YWx1ZTI7Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIHdvcmQgc3RhcnRpbmcgYXQgaSBpbiB2YWx1ZSBjb250YWlucyBhIGNvbW1vbiBpbml0aWFsaXNtCisvLyBhbmQgaWYgc28gcmVwbGFjZXMgaXQgd2l0aCB0aGUgdXBwZXIgY2FzZSB2ZXJzaW9uIG9mIHRoZSB3b3JkLgordm9pZCB0X2dvX2dlbmVyYXRvcjo6Zml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0IHsKKyAgaWYgKCFpZ25vcmVfaW5pdGlhbGlzbXNfKSB7CisgICAgc2l6ZV90IHdvcmRMZW4gPSB2YWx1ZS5maW5kKCdfJywgaSk7CisgICAgaWYgKHdvcmRMZW4gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHdvcmRMZW4gLT0gaTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgd29yZCA9IHZhbHVlLnN1YnN0cihpLCB3b3JkTGVuKTsKKyAgICBzdGQ6OnRyYW5zZm9ybSh3b3JkLmJlZ2luKCksIHdvcmQuZW5kKCksIHdvcmQuYmVnaW4oKSwgOjp0b3VwcGVyKTsKKyAgICBpZiAoY29tbW9uSW5pdGlhbGlzbXMuZmluZCh3b3JkKSAhPSBjb21tb25Jbml0aWFsaXNtcy5lbmQoKSkgeworICAgICAgdmFsdWUucmVwbGFjZShpLCB3b3JkLmxlbmd0aCgpLCB3b3JkKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKSwgcHJlZml4OworCisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOworICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgcHJlZml4OworICAgIHZhbHVlMiA9IHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSk7CisgIH0KKworICBpZiAoIWlzdXBwZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIC8vIGZpbmFsIGxlbmd0aCBiZWZvcmUgZnVydGhlciBjaGVja3MsIHRoZSBzdHJpbmcgbWF5IGJlY29tZSBsb25nZXIKKyAgc2l6ZV90IGxlbl9iZWZvcmUgPSB2YWx1ZTIubGVuZ3RoKCk7CisKKyAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBzdGFydCB3aXRoICJOZXciIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgQ1RPUiBwYXR0ZXJuCisgIC8vIEFkZGluZyBhbiBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcworICBpZiAoKGxlbl9iZWZvcmUgPj0gMykgJiYgKHZhbHVlMi5zdWJzdHIoMCwgMykgPT0gIk5ldyIpKSB7CisgICAgdmFsdWUyICs9ICdfJzsKKyAgfQorCisgIC8vIElETCBpZGVudGlmaWVycyBtYXkgZW5kIHdpdGggIkFyZ3MiLyJSZXN1bHQiIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgaW1wbGljaXQgc2VydmljZQorICAvLyBmdW5jdGlvbiBzdHJ1Y3RzCisgIC8vIEFkZGluZyBhbm90aGVyIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCisgIC8vIFN1cHByZXNzIHRoaXMgY2hlY2sgZm9yIHRoZSBhY3R1YWwgaGVscGVyIHN0cnVjdCBuYW1lcworICBpZiAoIWlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgICAgYm9vbCBlbmRzX3dpdGhfYXJncyA9IChsZW5fYmVmb3JlID49IDQpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA0LCA0KSA9PSAiQXJncyIpOworICAgIGJvb2wgZW5kc193aXRoX3JzbHQgPSAobGVuX2JlZm9yZSA+PSA2KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNiwgNikgPT0gIlJlc3VsdCIpOworICAgIGlmIChlbmRzX3dpdGhfYXJncyB8fCBlbmRzX3dpdGhfcnNsdCkgeworICAgICAgdmFsdWUyICs9ICdfJzsKKyAgICB9CisgIH0KKworICAvLyBBdm9pZCBuYW1pbmcgY29sbGlzaW9ucyB3aXRoIG90aGVyIHNlcnZpY2VzCisgIGlmIChpc19hcmdzX29yX3Jlc3VsdCkgeworICAgIHByZWZpeCArPSBwdWJsaWNpemUoc2VydmljZV9uYW1lXyk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgdmFsdWUyOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6bmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7CisgIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUodmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKSk7CisgIH0KKyAgcmV0dXJuICJOZXciICsgcHVibGljaXplKHZhbHVlKTsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKworICBpZiAoIWlzbG93ZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvbG93ZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIHJldHVybiB2YWx1ZTI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHZhbHVlMi5iZWdpbigpLCB2YWx1ZTIuZW5kKCksIHZhbHVlMi5iZWdpbigpLCA6OnRvbG93ZXIpOworCisgIHN3aXRjaCAodmFsdWVbMF0pIHsKKyAgY2FzZSAnYic6CisgIGNhc2UgJ0InOgorICAgIGlmICh2YWx1ZTIgIT0gImJyZWFrIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2MnOgorICBjYXNlICdDJzoKKyAgICBpZiAodmFsdWUyICE9ICJjYXNlIiAmJiB2YWx1ZTIgIT0gImNoYW4iICYmIHZhbHVlMiAhPSAiY29uc3QiICYmIHZhbHVlMiAhPSAiY29udGludWUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZCc6CisgIGNhc2UgJ0QnOgorICAgIGlmICh2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ0UnOgorICAgIGlmICh2YWx1ZTIgIT0gImVsc2UiICYmIHZhbHVlMiAhPSAiZXJyb3IiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZic6CisgIGNhc2UgJ0YnOgorICAgIGlmICh2YWx1ZTIgIT0gImZhbGx0aHJvdWdoIiAmJiB2YWx1ZTIgIT0gImZvciIgJiYgdmFsdWUyICE9ICJmdW5jIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2cnOgorICBjYXNlICdHJzoKKyAgICBpZiAodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2knOgorICBjYXNlICdJJzoKKyAgICBpZiAodmFsdWUyICE9ICJpZiIgJiYgdmFsdWUyICE9ICJpbXBvcnQiICYmIHZhbHVlMiAhPSAiaW50ZXJmYWNlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ20nOgorICBjYXNlICdNJzoKKyAgICBpZiAodmFsdWUyICE9ICJtYXAiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncCc6CisgIGNhc2UgJ1AnOgorICAgIGlmICh2YWx1ZTIgIT0gInBhY2thZ2UiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncic6CisgIGNhc2UgJ1InOgorICAgIGlmICh2YWx1ZTIgIT0gInJhbmdlIiAmJiB2YWx1ZTIgIT0gInJldHVybiIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdzJzoKKyAgY2FzZSAnUyc6CisgICAgaWYgKHZhbHVlMiAhPSAic2VsZWN0IiAmJiB2YWx1ZTIgIT0gInN0cnVjdCIgJiYgdmFsdWUyICE9ICJzd2l0Y2giKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndCc6CisgIGNhc2UgJ1QnOgorICAgIGlmICh2YWx1ZTIgIT0gInR5cGUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndic6CisgIGNhc2UgJ1YnOgorICAgIGlmICh2YWx1ZTIgIT0gInZhciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTIgKyAiX2ExIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIHRhcmdldCA9IG1vZHVsZTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBUaGlzIHNldCBpcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvbGludC9ibG9iL21hc3Rlci9saW50LmdvI0w2OTIKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBUEkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBU0NJSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNQVSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNTUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkROUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkVPRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkdVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFBTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkpTT04iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJMSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJRUFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSQU0iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSUEMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTEEiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTVRQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU1NIIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVENQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVExTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVFRMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVURQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVRGOCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlZNIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNSRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUyIpOworCisgIC8vIG5hbWVzIG9mIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMKKyAgaWYgKHJlYWRfd3JpdGVfcHJpdmF0ZV8pIHsKKyAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJyZWFkIjsKKyAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAid3JpdGUiOworICB9IGVsc2UgeworICAgIHJlYWRfbWV0aG9kX25hbWVfID0gIlJlYWQiOworICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJXcml0ZSI7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKKworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIHBhY2thZ2VfbmFtZV8gPSBtb2R1bGU7CisgICAgICBtb2R1bGUuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7CisgICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zICsgMSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gdGFyZ2V0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgdGFyZ2V0LnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgZl90eXBlc19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLmdvIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWVfLmNfc3RyKCkpOworCisgIGZfY29uc3RzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItY29uc3RzLmdvIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZV8uY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoZmFsc2UpOworCisgIGZfY29uc3RzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKHRydWUpOworCisgIGZfY29uc3RfdmFsdWVzXyA8PCBlbmRsIDw8ICJmdW5jIGluaXQoKSB7IiA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBmaWxlIGZvciB0aGUgR29VbnVzZWRQcm90ZWN0aW9uX18gdmFyaWFibGUKKyAgc3RyaW5nIGZfdW51c2VkX3Byb3RfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiR29VbnVzZWRQcm90ZWN0aW9uX18uZ28iOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW51c2VkX3Byb3RfOworICBmX3VudXNlZF9wcm90Xy5vcGVuKGZfdW51c2VkX3Byb3RfbmFtZV8uY19zdHIoKSk7CisgIGZfdW51c2VkX3Byb3RfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgZl91bnVzZWRfcHJvdF8uY2xvc2UoKTsKK30KKworCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICB1bnVzZWRfcHJvdGVjdGlvbiA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdGVjdGlvbiArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtLgorICogSWYgY29uc3RzIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgaW1wb3J0cy4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoYm9vbCBjb25zdHMpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBzdHJpbmcgdW51c2VkX3Byb3QgPSAiIjsKKworICBzdHJpbmcgbG9jYWxfbmFtZXNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIWxvY2FsX25hbWVzcGFjZS5lbXB0eSgpICYmIGxvY2FsX25hbWVzcGFjZSA9PSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIGdvX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShpbmNsdWRlc1tpXSk7CisgICAgc2l6ZV90IGZvdW5kID0gMDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdvX21vZHVsZS5zaXplKCk7IGorKykgeworICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudCB1c2VzIHNsYXNoZXMgKCcvJykgaW4gbmFtZXNwYWNlCisgICAgICBpZiAoZ29fbW9kdWxlW2pdID09ICcuJykgeworICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7CisgICAgICAgIGZvdW5kID0gaiArIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICJcdFwiIiArIGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBnb19tb2R1bGUgKyAiXCJcbiI7CisgICAgdW51c2VkX3Byb3QgKz0gInZhciBfID0gIiArIGdvX21vZHVsZS5zdWJzdHIoZm91bmQpICsgIi5Hb1VudXNlZFByb3RlY3Rpb25fX1xuIjsKKyAgfQorCisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKworICByZXR1cm4gZ29faW1wb3J0c19iZWdpbihjb25zdHMpICsgcmVzdWx0ICsgZ29faW1wb3J0c19lbmQoKSArIHVudXNlZF9wcm90OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpIHsKKyAgcmV0dXJuIHN0cmluZygidmFyIEdvVW51c2VkUHJvdGVjdGlvbl9fIGludDtcblxuIik7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYWNjZWxlcmF0ZWQgVEJpbmFyeVByb3RvY29sCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSB7CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuCisgICAgICAgIHN0ZDo6c3RyaW5nKCkgKworICAgICAgICAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBwYWNrYWdlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fcGFja2FnZSgpIHsKKyAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiXG5cbiI7Cit9CisKKy8qKgorICogUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnQuCisgKiBJZiBjb25zdHMgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBpbXBvcnRzLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpIHsKKyAgc3RyaW5nIGV4dHJhOworCisgIC8vIElmIG5vdCB3cml0aW5nIGNvbnN0YW50cywgYW5kIHRoZXJlIGFyZSBlbnVtcywgbmVlZCBleHRyYSBpbXBvcnRzLgorICBpZiAoIWNvbnN0cyAmJiBnZXRfcHJvZ3JhbSgpLT5nZXRfZW51bXMoKS5zaXplKCkgPiAwKSB7CisgICAgZXh0cmEgKz0KKyAgICAgICJcdFwiZGF0YWJhc2Uvc3FsL2RyaXZlclwiXG4iCisgICAgICAiXHRcImVycm9yc1wiXG4iOworICB9CisgIHJldHVybiBzdHJpbmcoCisgICAgICAiaW1wb3J0IChcbiIKKyAgICAgICJcdFwiYnl0ZXNcIlxuIgorICAgICAgIlx0XCJjb250ZXh0XCJcbiIKKyAgICAgICJcdFwicmVmbGVjdFwiXG4iCisgICAgICArIGV4dHJhICsKKyAgICAgICJcdFwiZm10XCJcbiIKKyAgICAgICJcdFwiIiArIGdlbl90aHJpZnRfaW1wb3J0XyArICJcIlxuIik7Cit9CisKKy8qKgorICogRW5kIHRoZSBpbXBvcnQgc3RhdGVtZW50LCBpbmNsdWRlIHVuZHNjb3JlLWFzc2lnbm1lbnRzCisgKgorICogVGhlc2UgIl8gPSIgcHJldmVudCB0aGUgZ28gY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgdW51c2VkIGltcG9ydHMuCisgKiBUaGlzIHdpbGwgaGF2ZSB0byBkbyBpbiBsaWV1IG9mIG1vcmUgaW50ZWxsaWdlbnQgaW1wb3J0IHN0YXRlbWVudCBjb25zdHJ1Y3Rpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2VuZCgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICIpXG5cbiIKKyAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgorICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKKyAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKKyAgICAgICJ2YXIgXyA9IGNvbnRleHQuQmFja2dyb3VuZFxuIgorICAgICAgInZhciBfID0gcmVmbGVjdC5EZWVwRXF1YWxcbiIKKyAgICAgICJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfY29uc3RfdmFsdWVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZl9jb25zdF92YWx1ZXNfLnN0cigpOworCisgIC8vIENsb3NlIHR5cGVzIGFuZCBjb25zdGFudHMgZmlsZXMKKyAgZl9jb25zdHNfLmNsb3NlKCk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl90eXBlc19uYW1lXyk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9jb25zdHNfbmFtZV8pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHR5cGVkZWYpOworICBzdHJpbmcgbmV3X3R5cGVfbmFtZShwdWJsaWNpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSk7CisgIHN0cmluZyBiYXNlX3R5cGUodHlwZV90b19nb190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSk7CisKKyAgaWYgKGJhc2VfdHlwZSA9PSBuZXdfdHlwZV9uYW1lKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl90eXBlc18gPDwgInR5cGUgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIgIiA8PCBiYXNlX3R5cGUgPDwgZW5kbCA8PCBlbmRsOworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYSB0eXBlCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYSB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IG5ld190eXBlX25hbWUgPDwgIlB0cih2ICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiKSAqIiA8PCBuZXdfdHlwZV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisgIHN0ZDo6c3RyaW5nIHRlbnVtX25hbWUocHVibGljaXplKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IHRlbnVtX25hbWUgPDwgIiBpbnQ2NCIgPDwgZW5kbCA8PCAiY29uc3QgKCIgPDwgZW5kbDsKKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBwIHsiIDw8IGVuZGw7CisKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIkZyb21TdHJpbmcocyBzdHJpbmcpICgiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvcikgeyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcyB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgaW50IHZhbHVlID0gLTE7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBzdHJpbmcgaXRlcl9zdGRfbmFtZShlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBpdGVyX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHZhbHVlIDw8IGVuZGw7CisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiOiByZXR1cm4gXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7CisKKyAgICBpZiAoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKKyAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lIDw8ICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiPFVOU0VUPlwiIiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIigwKSwiCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmbXQuRXJyb3JmKFwibm90IGEgdmFsaWQgIiA8PCB0ZW51bV9uYW1lIDw8ICIgc3RyaW5nXCIpIiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGwgPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpCisgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYW4gZW51bQorICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoYXQgZW51bQorICAvLyB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIlB0cih2ICIgPDwgdGVudW1fbmFtZSA8PCAiKSAqIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIE1hcnNoYWxUZXh0CisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBNYXJzaGFsVGV4dCgpIChbXWJ5dGUsIGVycm9yKSB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIFtdYnl0ZShwLlN0cmluZygpKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFVubWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiIgPDwgdGVudW1fbmFtZSA8PCAiKSBVbm1hcnNoYWxUZXh0KHRleHQgW11ieXRlKSBlcnJvciB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicSwgZXJyIDo9ICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzdHJpbmcodGV4dCkpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgKGVyciAhPSBuaWwpIHsiIDw8IGVuZGwgPDwgInJldHVybiBlcnIiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9IHEiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFNjYW4gZm9yIHNxbC5TY2FubmVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFNjYW4odmFsdWUgaW50ZXJmYWNle30pIGVycm9yIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInYsIG9rIDo9IHZhbHVlLihpbnQ2NCkiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgImlmICFvayB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gZXJyb3JzLk5ldyhcIlNjYW4gdmFsdWUgaXMgbm90IGludDY0XCIpIiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9ICIgPDwgdGVudW1fbmFtZSA8PCAiKHYpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBWYWx1ZSBmb3IgZHJpdmVyLlZhbHVlciBpbnRlcmZhY2UKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiAiIDw8IHRlbnVtX25hbWUgPDwgIikgVmFsdWUoKSAoZHJpdmVyLlZhbHVlLCBlcnJvcikgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICAgIHJldHVybiBuaWwsIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBpbnQ2NCgqcCksIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChmX2NvbnN0c18pIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfY29uc3RfdmFsdWVzXyA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9jb25zdHNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICIgIiA8PCB0eXBlX3RvX2dvX3R5cGUodHlwZSkgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgaWYgKG9wdCkgeworICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCAiOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJib29sfXsiOworICAgICAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBvdXQgPDwgImludDh9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgImludDE2fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJpbnQzMn17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAiaW50NjR9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCAiZmxvYXQ2NH17IjsKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmd9eyI7CisgICAgICAgICAgb3V0IDw8ICciJyArIGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgKyAnIic7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAifSkueCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBvdXQgPDwgIltdYnl0ZShcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIpIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGlmIChvcHQpIHsKKyAgICAgICAgICAgIG91dCA8PCAiJigmc3RydWN0e3ggaW50fXsiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiJiIgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSkgPDwgInsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBib29sIGlzX29wdGlvbmFsID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfb3B0aW9uYWwgPSBpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUsIGlzX29wdGlvbmFsKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBvdXQgPDwgIm1hcFsiIDw8IHR5cGVfdG9fZ29fdHlwZShrdHlwZSkgPDwgIl0iIDw8IHR5cGVfdG9fZ29fdHlwZSh2dHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBuYW1lKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fa2V5X3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdCB7CisgIGNvbnN0IHN0cmluZyBiYXNlX2ZpZWxkX25hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGNvbnN0IHN0cmluZyBlc2NhcGVkX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGJhc2VfZmllbGRfbmFtZSk7CisgICpPVVRfcHViX25hbWUgPSBwdWJsaWNpemUoZXNjYXBlZF9maWVsZF9uYW1lKTsKKyAgKk9VVF9kZWZfdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgb3V0IDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHN0cnVjdCksIGlzX2FyZ3Nfb3JfcmVzdWx0KSA8PCAieyI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBib29sIHBvaW50ZXJfZmllbGQgPSBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpOworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICBpZiAoIXBvaW50ZXJfZmllbGQgJiYgZGVmX3ZhbHVlICE9IE5VTEwgJiYgIW9taXRfaW5pdGlhbGl6YXRpb24oKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUoKm1faXRlciwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3MgfHwgaXNfcmVzdWx0KSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQorICAgICB0YWcgLT4gaW50ZWdlcgorICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCisgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKKyAgICAgZGVmYXVsdCAtPiBuaWwgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gbmlsICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKyAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorICBpbmRlbnRfdXAoKTsKKworICBpbnQgbnVtX3NldGFibGUgPSAwOworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOworCisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBTZXQgZmllbGQgdG8gb3B0aW9uYWwgaWYgZmllbGQgaXMgdW5pb24sIHRoaXMgaXMgc28gd2UgY2FuIGdldCBhCisgICAgICAvLyBwb2ludGVyIHRvIHRoZSBmaWVsZC4KKyAgICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKQorICAgICAgICAoKm1faXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgIGludCBmaXJzdF91bnVzZWQgPSAoc3RkOjptYXgpKDEsIHNvcnRlZF9rZXlzX3BvcysrKTsKKyAgICAgICAgd2hpbGUgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgeworICAgICAgICAgICsrc29ydGVkX2tleXNfcG9zOworICAgICAgICB9CisgICAgICAgIGludCBsYXN0X3VudXNlZCA9IHNvcnRlZF9rZXlzX3BvcyAtIDE7CisgICAgICAgIGlmIChmaXJzdF91bnVzZWQgPCBsYXN0X3VudXNlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGRzICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgIiB0byAiIDw8IGxhc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfdW51c2VkID09IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZCAjICIgPDwgZmlyc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSk7CisgICAgICBzdHJpbmcgZ290YWcgPSAiZGI6XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICArICJcIiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgZ290YWcgKz0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIixvbWl0ZW1wdHlcIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiXCIiOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgdXNlciBvdmVycmlkZSBvZiBkYiBhbmQganNvbiB0YWdzIHVzaW5nICJnby50YWciCisgICAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZmluZCgiZ28udGFnIik7CisgICAgICBpZiAoaXQgIT0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgICAgZ290YWcgPSBpdC0+c2Vjb25kOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGdvVHlwZSA8PCAiIGB0aHJpZnQ6XCIiCisgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IHNvcnRlZF9rZXlzX3BvczsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiLHJlcXVpcmVkIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8ICJcIiAiIDw8IGdvdGFnIDw8ICJgIiA8PCBlbmRsOworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2dvX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCB0c3RydWN0X25hbWUgPDwgIigpICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJiI7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCB8fCBpc19hcmdzKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgZmFsc2UpOworICAgIHN0cmluZyBkZWZfdmFyX25hbWUgPSB0c3RydWN0X25hbWUgKyAiXyIgKyBwdWJsaWNpemVkX25hbWUgKyAiX0RFRkFVTFQiOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIgIiA8PCBnb1R5cGU7CisgICAgICBpZiAoZGVmX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZFR5cGUsIGRlZl92YWx1ZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG51bV9zZXRhYmxlIGlzIHVzZWQgZm9yIGRlY2lkaW5nIGlmIENvdW50KiBtZXRob2RzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB1bmlvbiBmaWVsZHMuCisgICAgLy8gVGhpcyBhcHBsaWVzIHRvIGFsbCBudWxsYWJsZSBmaWVsZHMgaW5jbHVkaW5nIHNsaWNlcyAodXNlZCBmb3Igc2V0LCBsaXN0IGFuZCBiaW5hcnkpIGFuZCBtYXBzLCBub3QganVzdCBwb2ludGVycy4KKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZFR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKXx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgbnVtX3NldGFibGUgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgc3RyaW5nIGdvT3B0VHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIHRydWUpOworICAgICAgc3RyaW5nIG1heWJlcG9pbnRlciA9IGdvT3B0VHlwZSAhPSBnb1R5cGUgPyAiKiIgOiAiIjsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICFwLklzU2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBtYXliZXBvaW50ZXIgPDwgInAuIiA8PCBwdWJsaWNpemVkX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCisgICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIG51bV9zZXRhYmxlID4gMCkgeworICAgIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgfQorCisgIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCwgbnVtX3NldGFibGUgPiAwKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgcCA9PSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFwiPG5pbD5cIiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LlNwcmludGYoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdF9uYW1lKSA8PCAiKCUrdilcIiwgKnApIgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgRXJyb3IoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuU3RyaW5nKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIElzU2V0IGhlbHBlciBtZXRob2RzIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpIGJvb2wgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iaW5hcnkoKTsKKyAgICAgIGJvb2wgY29tcGFyZV90b19uaWxfb25seSA9IHR0eXBlLT5pc19zZXQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19tYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2J5dGVzbGljZSAmJiAhKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCBjb21wYXJlX3RvX25pbF9vbmx5KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIGZpZWxkX25hbWUgKyAiX0RFRkFVTFQiOworICAgICAgICBpZiAoaXNfYnl0ZXNsaWNlKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIWJ5dGVzLkVxdWFsKHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIsICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgQ291bnRTZXRGaWVsZHMgaGVscGVyIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgaW50IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCA6PSAwIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgY29udGludWU7CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgIGlmICghKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocC5Jc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCsrIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY291bnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCByZWFkIGVycm9yOiBcIiwgcCksIGVycikiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgZG9lcyBub3QgaGF2ZSBJc1NldCBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgaW5kZW50KG91dCkgPDwgInZhciBpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiIGJvb2wgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiZm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogXCIsIHAsIGZpZWxkSWQpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuU1RPUCB7IGJyZWFrOyB9IiA8PCBlbmRsOworCisgIHN0cmluZyB0aHJpZnRGaWVsZFR5cGVJZDsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZywgZmFsc2UgaWYgbm8gZmllbGRzIHByZXNlbnQKKyAgYm9vbCBoYXZlX3N3aXRjaCA9ICFmaWVsZHMuZW1wdHkoKTsKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBmaWVsZElkIHsiIDw8IGVuZGw7CisgIH0KKworICAvLyBBbGwgdGhlIGZpZWxkcyB3ZSBrbm93CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKworICAgIC8vIGlmIG5lZ2F0aXZlIGlkLCBlbnN1cmUgd2UgZ2VuZXJhdGUgYSB2YWxpZCBtZXRob2QgbmFtZQorICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHRocmlmdEZpZWxkVHlwZUlkID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodGhyaWZ0RmllbGRUeXBlSWQgPT0gInRocmlmdC5CSU5BUlkiKSB7CisgICAgICB0aHJpZnRGaWVsZFR5cGVJZCA9ICJ0aHJpZnQuU1RSSU5HIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09ICIgPDwgdGhyaWZ0RmllbGRUeXBlSWQgPDwgIiB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeCA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IgorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisKKyAgICAvLyBNYXJrIHJlcXVpcmVkIGZpZWxkIGFzIHJlYWQKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB0cnVlIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gQmVnaW4gc3dpdGNoIGRlZmF1bHQgY2FzZQorICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gU2tpcCB1bmtub3duIGZpZWxkcyBpbiBlaXRoZXIgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIEVuZCBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6IFwiLCBwKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJldHVybiBlcnJvciBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICFpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm10LkVycm9yZihcIlJlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIG5vdCBzZXRcIikpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBmYWxzZSwgInAuIik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgc3RyaW5nIG5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSAmJiB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBjIDo9IHAuQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCk7IGMgIT0gMSB7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiJVQgd3JpdGUgdW5pb246IGV4YWN0bHkgb25lIGZpZWxkIG11c3QgYmUgc2V0ICglZCBzZXQpLlwiLCBwLCBjKSIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZpZWxkX25hbWU7CisgIHN0cmluZyBlc2NhcGVfZmllbGRfbmFtZTsKKyAgLy8gdF9jb25zdF92YWx1ZSogZmllbGRfZGVmYXVsdF92YWx1ZTsKKyAgdF9maWVsZDo6ZV9yZXEgZmllbGRfcmVxdWlyZWQ7CisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHAgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIndyaXRlIGZpZWxkIHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7CisgICAgLy8gZmllbGRfZGVmYXVsdF92YWx1ZSA9ICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZmllbGRfcmVxdWlyZWQgPSAoKmZfaXRlciktPmdldF9yZXEoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXgKKyAgICAgICAgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIGVycm9yKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcC5Jc1NldCIgPDwgcHVibGljaXplKGZpZWxkX25hbWUpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKFwiIiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiXCIsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCBmaWVsZF9pZCA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAicC4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAiCisgICAgICAgIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHRlc3Rfc3VmZml4KCJfdGVzdCIpOworICBzdHJpbmcgZmlsZW5hbWUgPSBsb3dlcmNhc2Uoc2VydmljZV9uYW1lXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZfdHlwZXNfIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGYgPSAqZl9pdGVyOworICAgICAgZi0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19pZiA9ICJcbiIgKyBpbmRlbnQoKSArICIgICIgKyBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpCisgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiXG4iOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgcHVibGljaXplKGV4dGVuZHMpICsgIlxuIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGludGVyZmFjZU5hbWUgPDwgIiBpbnRlcmZhY2UgeyIgPDwgZXh0ZW5kc19pZjsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisKKyAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgKCpmX2l0ZXIpKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19maWVsZCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50X25ldyA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9ICJOZXciICsgZXh0ZW5kc19jbGllbnQ7CisgICAgfQorICB9CisKKyAgZXh0ZW5kc19maWVsZCA9IGV4dGVuZHNfY2xpZW50LnN1YnN0cihleHRlbmRzX2NsaWVudC5maW5kKCIuIikgKyAxKTsKKworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKiIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYyB0aHJpZnQuVENsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICA8PCAiQ2xpZW50RmFjdG9yeSh0IHRocmlmdC5UVHJhbnNwb3J0LCBmIHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiRmFjdG9yeSh0LCBmKX0iOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGYuR2V0UHJvdG9jb2wodCksIGYuR2V0UHJvdG9jb2wodCkpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggY3VzdG9tIGlucHV0ICYgb3V0cHV0IHByb3RvY29scworICBmX3R5cGVzXworICAgICAgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgPDwgIkNsaWVudFByb3RvY29sKHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGlwcm90IHRocmlmdC5UUHJvdG9jb2wsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICoiCisgICAgICA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIlByb3RvY29sKHQsIGlwcm90LCBvcHJvdCl9IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogdGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgPDwgIkNsaWVudChjIHRocmlmdC5UQ2xpZW50KSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnR7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIihjKSwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IGMsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIENsaWVudF8oKSB0aHJpZnQuVENsaWVudCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC5jIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgbWV0aG9kID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfYXJncyIsIHRydWUpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NOYW1lID0gdG1wKCJfYXJncyIpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBhcmdzTmFtZSA8PCAiICIgPDwgYXJnc1R5cGUgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBhcmdzTmFtZSA8PCAiLiIgPDwgcHVibGljaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0TmFtZSA9IHRtcCgiX3Jlc3VsdCIpOworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0VHlwZSA9IHB1YmxpY2l6ZShtZXRob2QgKyAiX3Jlc3VsdCIsIHRydWUpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHJlc3VsdE5hbWUgPDwgIiAiIDw8IHJlc3VsdFR5cGUgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiIDw8IGFyZ3NOYW1lIDw8ICIsICYiIDw8IHJlc3VsdE5hbWUgPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB7IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHVibmFtZSA9IHB1YmxpY2l6ZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkID0gcmVzdWx0TmFtZSArICIuIiArIHB1Ym5hbWU7CisKKyAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkIDw8ICIhPSBuaWw6IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiByLCAiIDw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHJlc3VsdE5hbWUgPDwgIi5HZXRTdWNjZXNzKCksIG5pbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIG5vdCB0byBkdXBsaWNhdGUgdGhlIGNhbGwgZ2VuZXJhdGlvbgorICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICA8PCBtZXRob2QgPDwgIlwiLCAmIjw8IGFyZ3NOYW1lIDw8ICIsIG5pbCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gY29sbGVjdCBpbmhlcml0ZWQgZnVuY3Rpb25zCisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorCisgIC8vIFRoaXMgZmlsZSBpcyBub3QgdXNlZnVsIGlmIHRoZXJlIGFyZSBubyBmdW5jdGlvbnM7IGRvbid0IGdlbmVyYXRlIGl0CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9yZW1vdGVfZGlyID0gcGFja2FnZV9kaXJfICsgIi8iICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlIjsKKyAgTUtESVIoZl9yZW1vdGVfZGlyLmNfc3RyKCkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBmX3JlbW90ZV9kaXIgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZS5nbyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9yZW1vdGU7CisgIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gc2VydmljZV9tb2R1bGUuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzZXJ2aWNlX21vZHVsZS5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKKyAgfQorICBpZiAoIWdlbl9wYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHNlcnZpY2VfbW9kdWxlID0gZ2VuX3BhY2thZ2VfcHJlZml4XyArIHNlcnZpY2VfbW9kdWxlOworICB9CisKKyAgc3RyaW5nIHVudXNlZF9wcm90ZWN0aW9uOworCisgIHN0cmluZyBjdHhQYWNrYWdlID0gImNvbnRleHQiOworCisgIGZfcmVtb3RlIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAicGFja2FnZSBtYWluIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpbXBvcnQgKCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiIDw8IGN0eFBhY2thZ2UgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJtYXRoXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0L3VybFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyY29udlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcInN0cmluZ3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXModW51c2VkX3Byb3RlY3Rpb24pOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgc2VydmljZV9tb2R1bGUgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgdW51c2VkX3Byb3RlY3Rpb247IC8vIGZpbGxlZCBpbiByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoKQorICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiVXNhZ2Ugb2YgXCIsIG9zLkFyZ3NbMF0sIFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlstaCBob3N0OnBvcnRdIFstdSB1cmxdIFstZltyYW1lZF1dIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV06XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJcXG5GdW5jdGlvbnM6XCIpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9yZW1vdGUgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9yZW1vdGUgPDwgYXJnc1tpXS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgYXJnc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKVwiKSIgPDwgZW5kbDsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDApIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidHlwZSBodHRwSGVhZGVycyBtYXBbc3RyaW5nXXN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgbSBtYXBbc3RyaW5nXXN0cmluZyA9IGgiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiVzXCIsIG0pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFNldCh2YWx1ZSBzdHJpbmcpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBhcnRzIDo9IHN0cmluZ3MuU3BsaXQodmFsdWUsIFwiOiBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihwYXJ0cykgIT0gMiB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBmbXQuRXJyb3JmKFwiaGVhZGVyIHNob3VsZCBiZSBvZiBmb3JtYXQgJ0tleTogVmFsdWUnXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBoW3BhcnRzWzBdXSA9IHBhcnRzWzFdIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9ydCBpbnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2wgc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZnJhbWVkIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXNlSHR0cCBib29sIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaGVhZGVycyA6PSBtYWtlKGh0dHBIZWFkZXJzKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwYXJzZWRVcmwgKnVybC5VUkwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gc3RyY29udi5BdG9pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IG1hdGguQWJzIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Vc2FnZSA9IFVzYWdlIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuSW50VmFyKCZwb3J0LCBcInBcIiwgOTA5MCwgXCJTcGVjaWZ5IHBvcnRcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmcHJvdG9jb2wsIFwiUFwiLCBcImJpbmFyeVwiLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIHNpbXBsZWpzb24sIGpzb24pXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZmcmFtZWQsIFwiZnJhbWVkXCIsIGZhbHNlLCBcIlVzZSBmcmFtZWQgdHJhbnNwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZ1c2VIdHRwLCBcImh0dHBcIiwgZmFsc2UsIFwiVXNlIGh0dHBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlZhcihoZWFkZXJzLCBcIkhcIiwgXCJIZWFkZXJzIHRvIHNldCBvbiB0aGUgaHR0cChzKSByZXF1ZXN0IChlLmcuIC1IIFxcXCJLZXk6IFZhbHVlXFxcIilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlBhcnNlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdmFyIGVyciBlcnJvciIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgPSB1cmwuUGFyc2UodXJsU3RyaW5nKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHBhcnNlZFVybC5Ib3N0IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHBhcnNlZFVybC5TY2hlbWUpIDw9IDAgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBcIiB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cHNcIiIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIF8sIGVyciA6PSB1cmwuUGFyc2UoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbWQgOj0gZmxhZy5BcmcoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgdXNlSHR0cCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RIdHRwQ2xpZW50KHBhcnNlZFVybC5TdHJpbmcoKSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihoZWFkZXJzKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBodHRwdHJhbnMgOj0gdHJhbnMuKCp0aHJpZnQuVEh0dHBDbGllbnQpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZvciBrZXksIHZhbHVlIDo9IHJhbmdlIGhlYWRlcnMgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgIGh0dHB0cmFucy5TZXRIZWFkZXIoa2V5LCB2YWx1ZSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwb3J0U3RyIDo9IGZtdC5TcHJpbnQocG9ydCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIHN0cmluZ3MuQ29udGFpbnMoaG9zdCwgXCI6XCIpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICBob3N0LCBwb3J0U3RyLCBlcnIgPSBuZXQuU3BsaXRIb3N0UG9ydChob3N0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJlcnJvciB3aXRoIGhvc3Q6XCIsIGVycikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQobmV0LkpvaW5Ib3N0UG9ydChob3N0LCBwb3J0U3RyKSkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHJlc29sdmluZyBhZGRyZXNzOlwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGZyYW1lZCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBjcmVhdGluZyB0cmFuc3BvcnRcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciB0cmFucy5DbG9zZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImNvbXBhY3RcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJzaW1wbGVqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwianNvblwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImJpbmFyeVwiLCBcIlwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIm9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbGllbnQgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IiA8PCBwdWJsaWNpemUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgPDwgIkNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHRyYW5zLk9wZW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIGNtZCB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOworICAgIHN0cmluZyBhcmd1bWVudHNOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSArICJfYXJncyIsIHRydWUpKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZmxhZy5OQXJnKCkgLSAxICE9ICIgPDwgbnVtX2FyZ3MgPDwgIiB7IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIgorICAgICAgICAgICAgIDw8IG51bV9hcmdzIDw8ICIgYXJnc1wiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgZmxhZ0FyZyA9IGkgKyAxOworICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKKworICAgICAgaWYgKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgZXJyIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgZSA9ICgodF9iYXNlX3R5cGUqKXRoZV90eXBlMiktPmdldF9iYXNlKCk7CisgICAgICAgIHN0cmluZyBlcnIodG1wKCJlcnIiKSk7CisKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodGhlX3R5cGUyLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gW11ieXRlKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikgPT0gXCJ0cnVlXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKKyAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50OCh0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQxNih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQzMih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUludChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDEwLCA2NCkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgorICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VGbG9hdChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwKKyAgICAgICAgLy8gIikpKSI7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHN0cnVjdF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHRzdHJ1Y3RfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorCisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgdHN0cnVjdF9tb2R1bGUgPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZQorICAgICAgICAgICAgICAgICA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoIiA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19jb250YWluZXIoKSB8fCB0aGVfdHlwZTItPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnTmFtZShwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkpOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsgIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIKKyAgICAgICAgICAgICAgICAgPDwgYXJndW1lbnRzTmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiCisgICAgICAgICAgICAgICAgIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi4iIDw8IGFyZ05hbWUKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93KCJJbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoZV90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZWRlZl9tb2R1bGUoIG1vZHVsZV9uYW1lKHRoZV90eXBlKSk7CisgICAgICAgIGlmKHR5cGVkZWZfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgICB0eXBlZGVmX21vZHVsZSA9IHBhY2thZ2VfbmFtZV87CisgICAgICAgIH0KKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0eXBlZGVmX21vZHVsZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KGNsaWVudC4iIDw8IHB1Yk5hbWUgPDwgIigiOworICAgIGJvb2wgYXJnRmlyc3QgPSB0cnVlOworCisgICAgZl9yZW1vdGUgPDwgImNvbnRleHQuQmFja2dyb3VuZCgpIjsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGFyZ0ZpcnN0KSB7CisgICAgICAgIGFyZ0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChcIlxcblwiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgZnVuY3Rpb24gXCIsIGNtZCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9yZW1vdGVfbmFtZSk7CisjaWZuZGVmIF9NU0NfVkVSCisgIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KKyAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAorICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVhVU1IKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USAorI2VuZGlmCisgICAgICAgICk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIk5ldyIgKyBleHRlbmRzX3Byb2Nlc3NvcjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgcFNlcnZpY2VOYW1lKHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgc3RyaW5nIHNlbGYodG1wKCJzZWxmIikpOworCisgIGlmIChleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHAucHJvY2Vzc29yTWFwW2tleV0gPSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgIgorICAgICAgICAgICAgICAgICAgIihwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiwgb2sgYm9vbCkgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3IsIG9rID0gcC5wcm9jZXNzb3JNYXBba2V5XSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc29yLCBvayIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzb3JNYXAoKSBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5wcm9jZXNzb3JNYXAiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICA8PCAiUHJvY2Vzc29ye2hhbmRsZXI6aGFuZGxlciwgcHJvY2Vzc29yTWFwOm1ha2UobWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKX0iCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIucHJvY2Vzc29yTWFwW1wiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiXSA9ICYiCisgICAgICAgICAgICAgICAgIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIHgodG1wKCJ4IikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAgICJ0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBuYW1lLCBfLCBzZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGZhbHNlLCBlcnIgfSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBwcm9jZXNzb3IsIG9rIDo9IHAuR2V0UHJvY2Vzc29yRnVuY3Rpb24obmFtZSk7IG9rIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gcHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlNraXAodGhyaWZ0LlNUUlVDVCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHgKKyAgICAgICAgICAgICAgIDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAiXCIgKyBuYW1lKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICoiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcnsiCisgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPDwgIihoYW5kbGVyKX0iIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIuQWRkVG9Qcm9jZXNzb3JNYXAoXCIiIDw8IGVzY2FwZWRGdW5jTmFtZQorICAgICAgICAgICAgICAgICA8PCAiXCIsICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0pIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIHByb2Nlc3Nvck5hbWUgPSBwcml2YXRpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiwgdHJ1ZSk7CisKKyAgLy8gdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIC8vIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgcHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBwcm9jZXNzb3JOYW1lCisgICAgICAgICAgICAgPDwgIikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCisgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlBST1RPQ09MX0VSUk9SLCBlcnIuRXJyb3IoKSkiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCBlcnIiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfQorICBib29sIG5lZWRfcmVmZXJlbmNlID0gdHlwZV9uZWVkX3JlZmVyZW5jZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl90eXBlc18gPDwgInZhciByZXR2YWwgIiA8PCB0eXBlX3RvX2dvX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciBlcnIyIGVycm9yIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsLCAiOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgImVycjIgPSBwLmhhbmRsZXIuIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZfdHlwZXNfIDw8ICJjdHgiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgImFyZ3MuIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpOyBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhfZmllbGRzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB2IDo9IGVycjIuKHR5cGUpIHsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Zl9pdGVyOworCisgICAgZm9yICh4Zl9pdGVyID0geF9maWVsZHMuYmVnaW4oKTsgeGZfaXRlciAhPSB4X2ZpZWxkcy5lbmQoKTsgKyt4Zl9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdHlwZV90b19nb190eXBlKCgoKnhmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHVibGljaXplKCgqeGZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB2IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIjogXCIgKyBlcnIyLkVycm9yKCkpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZSwgZXJyMiIgPDwgZW5kbDsKKworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IjsgLy8gY2xvc2VzIGVycjIgIT0gbmlsCisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiBlbHNlIHsiIDw8IGVuZGw7IC8vIG1ha2Ugc3VyZSB3ZSBzZXQgU3VjY2VzcyByZXR2YWwgb25seSBvbiBzdWNjZXNzCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgICBpZiAobmVlZF9yZWZlcmVuY2UpIHsKKyAgICAgICAgZl90eXBlc18gPDwgIiYiOworICAgICAgfQorICAgICAgZl90eXBlc18gPDwgInJldHZhbCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxSWQpOyBlcnIyICE9IG5pbCB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gcmVzdWx0LiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5GbHVzaChjdHgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWUsIGVyciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgbmlsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgKHZvaWQpY29lcmNlRGF0YTsKKyAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQsIGluX2NvbnRhaW5lcl92YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgb3JpZ190eXBlLCBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCksIGRlY2xhcmUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaWYgKGRlY2xhcmUpIHsKKyAgICAgIHN0cmluZyB0eXBlX25hbWUgPSBpbmtleSA/IHR5cGVfdG9fZ29fa2V5X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIG91dCA8PCAidmFyICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgdiwgZXJyIDo9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgZmllbGQgIiA8PCB0ZmllbGQtPmdldF9rZXkoKQorICAgICAgICA8PCAiOiBcIiwgZXJyKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgc3RyaW5nIHdyYXA7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB3cmFwID0gcHVibGljaXplKHR5cGVfbmFtZShvcmlnX3R5cGUpKTsKKyAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICB3cmFwID0gImludDgiOworICAgIH0KKworICAgIHN0cmluZyBtYXliZV9hZGRyZXNzID0gKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSA/ICImIiA6ICIiKTsKKyAgICBpZiAod3JhcCA9PSAiIikgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ2IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGVtcCA6PSAiIDw8IHdyYXAgPDwgIih2KSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidGVtcCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIKKyAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVxKGRlY2xhcmUgPyAiIDo9ICIgOiAiID0gIik7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3IgcmVhZGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIG9yaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIGVxKCIgPSAiKTsKKworICBpZiAoZGVjbGFyZSkgeworICAgIGVxID0gIiA6PSAiOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidE1hcCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRNYXAiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTZXQgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2V0IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2xpY2UgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2xpY2UiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIKKyAgICAgICAgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkgKysgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKCoiICsgcHJlZml4ICsgIikiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgZmtleS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBmdmFsLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClkZWNsYXJlOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKCgodF9saXN0Kil0bGlzdCktPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBnZW5lcmF0ZSBzZXJpYWxpemUgZm9yIHZvaWQgdHlwZTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGVyciA6PSBvcHJvdC4iOworCisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSkgeworICAgICAgbmFtZSA9ICIqIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoaW50OCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KGludDE2KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoaW50MzIoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKGZsb2F0NjQoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVC4iCisgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICIpIGZpZWxkIHdyaXRlIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIGZpZWxkICciICsgbmFtZSArICInIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiBcIiwgIgorICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKiIgKyBwcmVmaXg7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICInIGZvciBwcmVmaXggJyIgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGssIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHRtYXAsICJrIiwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBpIDo9IDA7IGk8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBpKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgZm9yIGogOj0gaSsxOyBqPGxlbigiIDw8IHByZWZpeCA8PCAiKTsgaisrIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwoIiA8PCBwcmVmaXggPDwgIltpXSwiIDw8IHByZWZpeCA8PCAiW2pdKSB7ICIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiXCIsIGZtdC5FcnJvcmYoXCIlVCBlcnJvciB3cml0aW5nIHNldCBmaWVsZDogc2xpY2UgaXMgbm90IHVuaXF1ZVwiLCAiIDw8IHByZWZpeCA8PCAiW2ldKSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgdHNldCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgdGxpc3QsICJ2Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIiKTsKKyAga2ZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIHZmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBraXRlciwgdHJ1ZSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIHZpdGVyKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiIC0gIiA8PCBwdWJsaWNpemUocC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vICIsIHNzLnN0cigpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLyIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIHJlc3VsdCA8PCBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiPSI7CisKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0IDw8ICJuaWwiOworICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgc3RydWN0IGZpZWxkIGluaXRpYWwgdmFsdWUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQsIHdoaWNoIG11c3QgaGF2ZSBgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMYAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAob3B0aW9uYWxfZmllbGQpIHsKKyAgICAvLyBUaGUgY2FsbGVyIHdpbGwgbWFrZSBhIHNlY29uZCBwYXNzIGZvciBvcHRpb25hbCBmaWVsZHMsCisgICAgLy8gYXNzaWduaW5nIHRoZSByZXN1bHQgb2YgcmVuZGVyX2NvbnN0X3ZhbHVlIHRvICIqZmllbGRfbmFtZSIuIEl0CisgICAgLy8gaXMgbWFkZGVuaW5nIHRoYXQgR28gc3ludGF4IGRvZXMgbm90IGFsbG93IGZvciBhIHR5cGUtYWdub3N0aWMKKyAgICAvLyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYSBjb25zdCB2YWx1ZSwgYnV0IHNvIGl0IGdvZXMuCisgICAgLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHdyaXRlIHR5cGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQKKyAgICAvLyBjb252ZXJ0IGZyb20gY29uc3QgdmFsdWVzIHRvIHBvaW50ZXIgdHlwZXMsIGJ1dCBnaXZlbiB0aGUgbGFjaworICAgIC8vIG9mIG92ZXJsb2FkaW5nIGl0IHdvdWxkIGJlIG1lc3N5LgorICAgIHJldHVybiAibmV3KCIgKyB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCksIG5hbWUpOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGFuIGludGVyZmFjZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4LCBib29sIGFkZEVycm9yKSB7CisgIHN0cmluZyBzaWduYXR1cmUgPSBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIjsKKyAgc2lnbmF0dXJlICs9ICJjdHggY29udGV4dC5Db250ZXh0IjsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHNpZ25hdHVyZSArPSAiLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICB9CisgIHNpZ25hdHVyZSArPSAiKSAoIjsKKworICB0X3R5cGUqIHJldCA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGVycnMgPSBhcmd1bWVudF9saXN0KGV4Y2VwdGlvbnMpOworCisgIGlmICghcmV0LT5pc192b2lkKCkpIHsKKyAgICBzaWduYXR1cmUgKz0gInIgIiArIHR5cGVfdG9fZ29fdHlwZShyZXQpOworCisgICAgaWYgKGFkZEVycm9yIHx8IGVycnMuc2l6ZSgpID09IDApIHsKKyAgICAgIHNpZ25hdHVyZSArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChhZGRFcnJvcikgeworICAgIHNpZ25hdHVyZSArPSAiZXJyIGVycm9yIjsKKyAgfQorCisgIHNpZ25hdHVyZSArPSAiKSI7CisgIHJldHVybiBzaWduYXR1cmU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgcmVzdWx0ICs9IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICAgICAgICsgdHlwZV90b19nb190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBtb2R1bGUoIG1vZHVsZV9uYW1lKHR0eXBlKSk7CisgIGlmKCAhIG1vZHVsZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIG1vZHVsZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6Om1vZHVsZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikuZW1wdHkoKSB8fAorICAgICAgICBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikgIT0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIHN0cmluZyBtb2R1bGUoZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW0pKTsKKyAgICAgIC8vIGZvciBuYW1lc3BhY2VkIGluY2x1ZGVzLCBvbmx5IGtlZXAgcGFydCBhZnRlciBkb3QuCisgICAgICBzaXplX3QgZG90ID0gbW9kdWxlLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyKGRvdCArIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvKiB0aGlzIGlzIHdyb25nLCBiaW5hcnkgaXMgc3RpbGwgYSBzdHJpbmcgdHlwZSBpbnRlcm5hbGx5CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICByZXR1cm4gInRocmlmdC5CSU5BUlkiOworICAgICAgfQorICAgICAgKi8KKyAgICAgIHJldHVybiAidGhyaWZ0LlNUUklORyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdC5CT09MIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdC5CWVRFIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJ0aHJpZnQuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAidGhyaWZ0Lk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAidGhyaWZ0LkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gbWFwIHR5cGUsIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IHdpbGwKKyAqIG5vdCBwcm9kdWNlIGEgdmFsaWQgZ28gbWFwIHR5cGUuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdF90eXBlKiByZXNvbHZlZF90eXBlID0gdHlwZTsKKworICB3aGlsZSAocmVzb2x2ZWRfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVzb2x2ZWRfdHlwZSA9ICgodF90eXBlZGVmKilyZXNvbHZlZF90eXBlKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX21hcCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX2xpc3QoKSB8fCByZXNvbHZlZF90eXBlLT5pc19zZXQoKSkgeworICAgIHRocm93ICJDYW5ub3QgcHJvZHVjZSBhIHZhbGlkIHR5cGUgZm9yIGEgR28gbWFwIGtleTogIiArIHR5cGVfdG9fZ29fdHlwZSh0eXBlKSArICIgLSBhYm9ydGluZy4iOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX2JpbmFyeSgpKQorICAgIHJldHVybiAic3RyaW5nIjsKKworICByZXR1cm4gdHlwZV90b19nb190eXBlKHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZQorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgcmV0dXJuIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0eXBlLCBmYWxzZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlLCB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlIGZpZWxkCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgaXMgVF9PUFRJT05BTC4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCkgeworICBzdHJpbmcgbWF5YmVfcG9pbnRlcihvcHRpb25hbF9maWVsZCA/ICIqIiA6ICIiKTsKKworICBpZiAodHlwZS0+aXNfdHlwZWRlZigpICYmICgodF90eXBlZGVmKil0eXBlKS0+aXNfZm9yd2FyZF90eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJbXWJ5dGUiOworICAgICAgfQorCisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJzdHJpbmciOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiYm9vbCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50OCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ2NCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImZsb2F0NjQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIioiICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdCA9ICh0X21hcCopdHlwZTsKKyAgICBzdHJpbmcga2V5VHlwZSA9IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2YWx1ZVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X3ZhbF90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJtYXBbIikgKyBrZXlUeXBlICsgIl0iICsgdmFsdWVUeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHQgPSAodF9zZXQqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHQgPSAodF9saXN0Kil0eXBlOworICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIHsKKworICAvLyBmb3JtYXR0aW5nIHZpYSBnb2ZtdCBkZWFjdGl2YXRlZCBkdWUgdG8gVEhSSUZULTM4OTMKKyAgLy8gUGxlYXNlIGxvb2sgYXQgdGhlIHRpY2tldCBhbmQgbWFrZSBzdXJlIHlvdSBmdWxseSB1bmRlcnN0YW5kIGFsbCB0aGUgaW1wbGljYXRpb25zCisgIC8vIGJlZm9yZSBzdWJtaXR0aW5nIGEgcGF0Y2ggdGhhdCBlbmFibGVzIHRoaXMgZmVhdHVyZSBhZ2Fpbi4gVGhhbmsgeW91LgorICAodm9pZCkgZmlsZV9wYXRoOworICByZXR1cm4gZmFsc2U7CisKKyAgLyoKKyAgY29uc3Qgc3RyaW5nIGNvbW1hbmQgPSAiZ29mbXQgLXcgIiArIGZpbGVfcGF0aDsKKworICBpZiAoc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkgPT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HIC0gUnVubmluZyAnJXMnIGZhaWxlZC5cbiIsIGNvbW1hbmQuY19zdHIoKSk7CisgIHJldHVybiBmYWxzZTsKKyAgKi8KKyB9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZ28sICJHbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZV9wcmVmaXg9ICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdGhyaWZ0X2ltcG9ydD0gICBPdmVycmlkZSB0aHJpZnQgcGFja2FnZSBpbXBvcnQgcGF0aCAoZGVmYXVsdDoiICsgREVGQVVMVF9USFJJRlRfSU1QT1JUICsgIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2U9ICAgICAgICAgUGFja2FnZSBuYW1lIChkZWZhdWx0OiBpbmZlcnJlZCBmcm9tIHRocmlmdCBmaWxlIG5hbWUpXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZ25vcmVfaW5pdGlhbGlzbXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgYXV0b21hdGljIHNwZWxsaW5nIGNvcnJlY3Rpb24gb2YgaW5pdGlhbGlzbXMgKGUuZy4gXCJVUkxcIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlYWRfd3JpdGVfcHJpdmF0ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgTWFrZSByZWFkL3dyaXRlIG1ldGhvZHMgcHJpdmF0ZSwgZGVmYXVsdCBpcyBwdWJsaWMgUmVhZC9Xcml0ZVxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MzAxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEdyYXBodml6IGNvZGUgZ2VuZXJhdG9yCisgKi8KK2NsYXNzIHRfZ3ZfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9ndl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZXhjZXB0aW9uX2Fycm93cyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImV4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGV4Y2VwdGlvbl9hcnJvd3MgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGd2OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ndiI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgZW5kIG9mIGdlbmVyYXRvcgorICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogSGVscGVycworICAgKi8KKyAgdm9pZCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6Omxpc3Q8c3RyaW5nPiBlZGdlczsKKyAgYm9vbCBleGNlcHRpb25fYXJyb3dzOworfTsKKworLyoqCisgKiBJbml0IGdlbmVyYXRvcjoKKyAqIC0gQWRkcyBzb21lIGVzY2FwaW5nIGZvciB0aGUgR3JhcGh2aXogZG9tYWluLgorICogLSBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgb3BlbiBmaWxlIGZvciB3cml0dGluZy4KKyAqIC0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgZXNjYXBlX1sneyddID0gIlxceyI7CisgIGVzY2FwZV9bJ30nXSA9ICJcXH0iOworCisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmd2IjsKKyAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiZGlncmFwaCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwcm9ncmFtX25hbWVfKSA8PCAiXCIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtzdHlsZT1maWxsZWQsIHNoYXBlPXJlY29yZF07IiA8PCBlbmRsOworICBmX291dF8gPDwgImVkZ2UgW2Fycm93c2l6ZT0wLjVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJyYW5rZGlyPUxSIiA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyBnZW5lcmF0b3I6CisgKiAtIFByaW50IGFjY3VtdWxhdGVkIG5vZGVzIGNvbm5lY3Rpb25zLgorICogLSBQcmludCBmb290bm90ZS4KKyAqIC0gQ2xvc2VzIGZpbGUuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gUHJpbnQgZWRnZXMKKyAgc3RkOjpsaXN0PHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5iZWdpbigpOworICBmb3IgKDsgaXRlciAhPSBlZGdlcy5lbmQoKTsgaXRlcisrKSB7CisgICAgZl9vdXRfIDw8ICgqaXRlcikgPDwgZW5kbDsKKyAgfQorCisgIC8vIFByaW50IGdyYXBoIGVuZCB9IGFuZCBjbG9zZSBmaWxlCisgIGZfb3V0XyA8PCAifSIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1henVyZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiIDo6ICI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIG5hbWUpOworCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPXdoaXRlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiZW51bSAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICd8JyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIiA9ICI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworCisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWFsaWNlYmx1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgImNvbnN0XyIgPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiID0gIjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCksICJjb25zdF8iICsgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRwaW5rXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAiZXhjZXB0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRjeWFuXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAidW5pb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJlaWdlXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAic3RydWN0ICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gKCptZW1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBwcmludCBwb3J0IChhbmNob3IgcmVmZXJlbmNlKQorICAgIGZfb3V0XyA8PCAifDxmaWVsZF8iIDw8IGZpZWxkX25hbWUgPDwgJz4nOworCisgICAgLy8gZmllbGQgbmFtZSA6OiBmaWVsZCB0eXBlCisgICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgbmFtZSArICI6ZmllbGRfIiArIGZpZWxkX25hbWUpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKSB7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0XFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXRcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwXFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfb3V0XyA8PCAodHR5cGUtPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGVkZ2VzLnB1c2hfYmFjayhzdHJ1Y3RfZmllbGRfcmVmICsgIiAtPiAiICsgdHR5cGUtPmdldF9uYW1lKCkpOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBhbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBzd2l0Y2ggKHR2YWx1ZS0+Z2V0X3R5cGUoKSkgeworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICBmX291dF8gPDwgIlxcXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpIDw8ICJcXFwiIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7CisgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIgXFx9IjsKKyAgfSBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBmX291dF8gPDwgIlVOS05PV04iOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc2VydmljZV9uYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSh0c2VydmljZSk7CisgIGZfb3V0XyA8PCAic3ViZ3JhcGggY2x1c3Rlcl8iIDw8IHNlcnZpY2VfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJpc3F1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInN0eWxlPWRhc2hlZDsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibGFiZWwgPSBcIiIgPDwgZXNjYXBlX3N0cmluZyhzZXJ2aWNlX25hbWUpIDw8ICIgc2VydmljZVwiOyIgPDwgZW5kbDsKKworICAvLyBUT0RPOiBzZXJ2aWNlIGV4dGVuZHMKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX291dF8gPDwgImZ1bmN0aW9uXyIgPDwgc2VydmljZV9uYW1lIDw8IGZuX25hbWU7CisgICAgZl9vdXRfIDw8ICJbbGFiZWw9XCI8cmV0dXJuX3R5cGU+ZnVuY3Rpb24gIiA8PCBlc2NhcGVfc3RyaW5nKGZuX25hbWUpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnJldHVybl90eXBlIik7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBmX291dF8gPDwgInw8cGFyYW1fIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPiI7CisgICAgICBmX291dF8gPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnBhcmFtXyIgKyAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIC8vIGVuZCBvZiBub2RlCisgICAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworCisgICAgLy8gRXhjZXB0aW9uIGVkZ2VzCisgICAgaWYgKGV4Y2VwdGlvbl9hcnJvd3MpIHsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgICAgZWRnZXMucHVzaF9iYWNrKCJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICIgLT4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIiBbY29sb3I9cmVkXSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZfb3V0XyA8PCAiIH0iIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZ3YsCisgICAgIkdyYXBodml6IiwKKyAgICAiICAgIGV4Y2VwdGlvbnM6ICAgICAgV2hldGhlciB0byBkcmF3IGFycm93cyBmcm9tIGZ1bmN0aW9ucyB0byBleGNlcHRpb24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4OGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyOTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXhlIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oYXhlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2hheGVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgY2FsbGJhY2tzXyA9IGZhbHNlOworICAgIHJ0dGlfID0gZmFsc2U7CisgICAgYnVpbGRtYWNyb18gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjYWxsYmFja3MiKSA9PSAwKSB7CisgICAgICAgIGNhbGxiYWNrc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydHRpIikgPT0gMCkgeworICAgICAgICBydHRpXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJ1aWxkbWFjcm8iKSA9PSAwKSB7CisgICAgICAgIGJ1aWxkbWFjcm9fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaGF4ZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taGF4ZSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2hheGVfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgaGF4ZV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGFzX3R5cGUsIGJvb2wgb21pdF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgLy8gY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAtIEludDY0IGlzIG5vdCByZWFsbHkgbnVsbGFibGUsIGV2ZW4gdGhvdWdoIGl0IGJlaGF2ZWQgdGhhdAorICAgICAgICAvLyB3YXkgYmVmb3JlIEhheGUgMy4yLjAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgYm9vbCBjYWxsYmFja3NfOworICBib29sIHJ0dGlfOworICBzdHJpbmcgYnVpbGRtYWNyb187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKworICAvLyBIYXhlIHBhY2thZ2UgbmFtZXMgYXJlIGxvd2VyY2FzZQorICBpZiAocGFja2FnZV9uYW1lXy5sZW5ndGgoKSA+IDApIHsKKyAgICBwYWNrYWdlX25hbWVfWzBdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfWzBdKTsKKyAgICBzaXplX3QgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nKTsKKyAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGlmICgrK2luZGV4IDwgcGFja2FnZV9uYW1lXy5sZW5ndGgoKSkgeworICAgICAgICBwYWNrYWdlX25hbWVfW2luZGV4XSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1tpbmRleF0pOworICAgICAgfQorICAgICAgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nLCBpbmRleCk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXzsKKyAgfQorICByZXR1cm4gInBhY2thZ2UiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgaGF4ZSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qO1xuIiArICJpbXBvcnQgaGF4ZS5pby5CeXRlcztcbiIKKyAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLkludE1hcDtcbiIgKyAiaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwO1xuIiArICJcbiIgKyAiI2lmIGZsYXNoXG4iCisgICAgICAgICArICJpbXBvcnQgZmxhc2guZXJyb3JzLkFyZ3VtZW50RXJyb3I7XG4iICsgIiNlbmRcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGltcG9ydHM7CisgIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOworICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBoYXhlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gaGF4ZSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQWRkIGhheGUgaW1wb3J0cworICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2VudW0pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiAiOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEludCA9ICIgPDwgdmFsdWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgdmFyIFZBTElEX1ZBTFVFUyA9IHsgbmV3IEludFNldCggWyI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIl0pOyB9OyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMVUVTX1RPX05BTUVTID0geyBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwiKSA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+IFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIjsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJdOyB9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9jb25zdHMpOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfY29uc3RzKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBIYXhlIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIGhheGUgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgc3RyaW5nIGNsc25hbWUgPSBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG91dCk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xzbmFtZSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciBTVFJVQ1RfREVTQyA9IHsgbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgfTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB2YXIgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSB7IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyB9OyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsICptX2l0ZXIpOworICAgIC8vIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArCisgICAgLy8gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIkA6aXNWYXIiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2YXIgIgorICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIoZ2V0LHNldCkgOiAiCisgICAgICAgICAgICAgICAgICAgKyBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSUQgOiBJbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBCb29sID0gZmFsc2U7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpZiAoZmFsc2UpIHsKKyAgICAvLyBUT0RPOiByZWFjdGl2YXRlIHdoZW4gbmVlZGVkCisgICAgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoIGlwcm90IDogVFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA6IFRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgaGF4ZSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkpIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCwgdmFsdWUgOiBEeW5hbWljKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCkgOiBEeW5hbWljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEIDogSW50KSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIHByb3BlcnR5IHNldHRlcnMvZ2V0dGVycyBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldF8iIDw8IGZpZWxkX25hbWUgPDwgIigpIDogIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKQorICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldF8iIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIikgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpIDw8ICIgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgOiBCb29sIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIgorICAgICAgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0IDogU3RyaW5nID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0IDogQm9vbCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZSA6IFN0cmluZyA9ICIgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bworICogZmllbGROYW1lIG1hcHBpbmcKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAiaW5saW5lIHN0YXRpYyB2YXIgbWV0YURhdGFNYXAgOiBJbnRNYXAgPSBuZXcgSW50TWFwKCk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIC8vIFBvcHVsYXRlIG1hcAorICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSURdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOworCisgICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQorICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBoYXhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9oYXhlX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgeyAvLyBtYXAKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfaGF4ZV90eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIkltcGwuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGhlbHBlciBjbGFzcyBmaWxlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiUHJvY2Vzc29yLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKS5jX3N0cigpCisgICAgICAgICAgICAgICA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBmb3IgdGhlIG9uU3VjY2VzcyBjYWxsYmFja3MKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9taXRfbmFtZSkgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gIiI7CisgIGlmICghb21pdF9uYW1lKSB7CisgICAgbmFtZSA9ICJvblN1Y2Nlc3MiOworICAgIGlmIChhc190eXBlKSB7CisgICAgICBuYW1lICs9ICIgOiAiOworICAgIH0KKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGlmIChhc190eXBlKSB7CisgICAgICByZXR1cm4gbmFtZSArICJWb2lkLT5Wb2lkID0gbnVsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuYW1lICsgIigpIDogVm9pZCI7CisgICAgfQorICB9CisKKyAgaWYgKGFzX3R5cGUpIHsKKyAgICByZXR1cm4gbmFtZSArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIi0+Vm9pZCA9IG51bGwiOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lICsgIiggcmV0dmFsIDogIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIikiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoY2FsbGJhY2tzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gIm5vcm1hbCIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyIGluICJjYWxsYmFjayIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBzdGQ6OnN0cmluZyBvbl9zdWNjZXNzX2ltcGwgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgZmFsc2UpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gb25FcnJvcihEeW5hbWljKSA6IFZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gIiA8PCBvbl9zdWNjZXNzX2ltcGwuY19zdHIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7IC0gbm90IHlldCwgYmVjYXVzZSBvZgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzYyNgorICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpbnRlcmZhY2UgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF9jYXBfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7CisgIH0KKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIC8vIGJ1aWxkIG1hY3JvIGlzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCA9IG51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaXByb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIG9wcm90XyA6IFRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBzZXFpZF8gOiBJbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCkgOiBUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBzdHJpbmcgY2FsbHR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIk9ORVdBWSIgOiAiQ0FMTCI7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuIiA8PCBjYWxsdHlwZSA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXR2YWwgOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkR5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBlcnJvcjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgbXNnIDogVE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciByZXN1bHQgOiAiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJvbkVycm9yKCBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2goIGUgOiBURXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pCisgICAgICAgICAgICAgPDwgIl9pZmFjZV8gOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIFBST0NFU1NfTUFQID0gbmV3IFN0cmluZ01hcDwgSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCA+KCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlmYWNlIDogIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVAuc2V0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm4gID0gUFJPQ0VTU19NQVAuZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgdmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkICIKKyAgICAgICAgICJtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4oIG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRuYW1lKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2hheGVfc3RydWN0KCZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIigpIDogSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKCBzZXFpZCA6IEludCwgaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sKSA6IFZvaWQiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgOiAiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYW55ICBmdW5jdGlvbiB0byBjYXRjaCAoZGVmaW5lZCBvciB1bmRlZmluZWQpIGV4Y2VwdGlvbnMKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gc3R5bGUgb25FcnJvci9vblN1Y2Nlc3MKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBvbl9zdWNjZXNzID0gZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgZmFsc2UsIHRydWUpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwsICAvLyBlcnJvcnMgYXJlIHRocm93biBieSB0aGUgaGFuZGxlciIgPDwgZW5kbDsKKyAgICAgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwpOyAvLyBubyByZXR2YWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uIiA8PCBvbl9zdWNjZXNzLmNfc3RyKCkgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy8gbm9ybWFsIGZ1bmN0aW9uKCk6cmVzdWx0IHN0eWxlCisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAvLyBjYXRjaCBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIElETAorICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGFsd2F5cyBjYXRjaCBhbGwgZXhjZXB0aW9ucyB0byBwcmV2ZW50IGZyb20gc2VydmljZSBkZW5pYWwKKyAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aCA6IER5bmFtaWMpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c3RydWN0KSkgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQorICAgICAgICAgICAgICA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaSA8PCAiIGluIDAgLi4uICIgPDwgb2JqIDw8ICIuc2l6ZSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuc2V0KCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICIgOiBJbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBoYXhlIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIGhheGUgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKworICAvLyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiSW50IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdHZhbCA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKCEodGtleS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgICAgcmV0dXJuICJTdHJpbmdNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gIkludDY0TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgfQorICAgIHJldHVybiAiT2JqZWN0TWFwPCAiICsgdHlwZV9uYW1lKHRrZXkpICsgIiwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ1NldCI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRTZXQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICB9CisgICAgfQorICAgIGlmICh0a2V5LT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiSW50U2V0IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RTZXQ8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiPiI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogdGVsbSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIkxpc3Q8ICIgKyB0eXBlX25hbWUodGVsbSkgKyAiPiI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBoYXhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBoYXhlIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJoYXhlLmlvLkJ5dGVzIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImhheGUuSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImhheGUuSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkZsb2F0IjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIG9uX2Vycm9yX3N1Y2Nlc3MgPSAib25FcnJvciA6IER5bmFtaWMtPlZvaWQgPSBudWxsLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIHRydWUsIGZhbHNlKTsKKworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKKyAgICAgIGFyZ3VtZW50cyArPSAiLCAiOworICAgIH0KKyAgICBhcmd1bWVudHMgKz0gb25fZXJyb3Jfc3VjY2VzczsgLy8ib25FcnJvciA6IEZ1bmN0aW9uLCBvblN1Y2Nlc3MgOiBGdW5jdGlvbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogVm9pZCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdHR5cGU7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpIHx8IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0dHlwZSA9ICJWb2lkIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogIiArIHJlc3VsdHR5cGU7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogSGF4ZSBjbGFzcyBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggdXBwZXJjYXNlIGxldHRlciwgYnV0IEhheGUgbmFtZXNwYWNlcyBtdXN0IG5vdC4KKyAqLworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLy8gdGVzdC5mb3IuR2VuZXJpYzwgZGF0YS5UeXBlLCBvci50aGUuTGlrZT4gYW5kIGhhbmRsZSBpdCByZWN1cnNpdmVseQorICBzaXplX3QgZ2VuZXJpY19maXJzdCA9IG5hbWUuZmluZCgnPCcpOworICBzaXplX3QgZ2VuZXJpY19sYXN0ID0gbmFtZS5yZmluZCgnPicpOworICBpZiAoKGdlbmVyaWNfZmlyc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpICYmIChnZW5lcmljX2xhc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgc3RyaW5nIG91dGVyX3R5cGUgPSBuYW1lLnN1YnN0cigwLCBnZW5lcmljX2ZpcnN0KTsKKyAgICBzdHJpbmcgaW5uZXJfdHlwZXMgPSBuYW1lLnN1YnN0cihnZW5lcmljX2ZpcnN0ICsgMSwgZ2VuZXJpY19sYXN0IC0gZ2VuZXJpY19maXJzdCAtIDEpOworCisgICAgc3RyaW5nIG5ld19pbm5lciA9ICIiOworICAgIHNpemVfdCBjb21tYV9zdGFydCA9IDA7CisgICAgd2hpbGUgKGNvbW1hX3N0YXJ0IDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgIHNpemVfdCBjb21tYV9wb3MgPSBjb21tYV9zdGFydDsKKyAgICAgIGludCBuZXN0ZWQgPSAwOworCisgICAgICB3aGlsZSAoY29tbWFfcG9zIDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKGlubmVyX3R5cGVzW2NvbW1hX3Bvc10pIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgKytuZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIC0tbmVzdGVkOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICBmb3VuZCA9IChuZXN0ZWQgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytjb21tYV9wb3M7CisgICAgICB9CisKKyAgICAgIGlmIChuZXdfaW5uZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5ld19pbm5lciArPSAiLCI7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBpbm5lciA9IGlubmVyX3R5cGVzLnN1YnN0cihjb21tYV9zdGFydCwgY29tbWFfcG9zIC0gY29tbWFfc3RhcnQpOworICAgICAgbmV3X2lubmVyICs9IGdldF9jYXBfbmFtZShpbm5lcik7CisgICAgICBjb21tYV9zdGFydCA9ICsrY29tbWFfcG9zOworICAgIH0KKworICAgIHJldHVybiBnZXRfY2FwX25hbWUob3V0ZXJfdHlwZSkgKyAiPCIgKyBuZXdfaW5uZXIgKyAiPiI7CisgIH0KKworICAvLyBwYWNrYWdlIG5hbWUKKyAgc2l6ZV90IGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICBpbmRleCA9IG5hbWUuZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IG5hbWUuZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICAvLyBjbGFzcyBuYW1lCisgIGluZGV4ID0gbmFtZS5yZmluZCgnLicpOworICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICArK2luZGV4OworICB9IGVsc2UgeworICAgIGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICB9CisKKyAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgeworICAgIG5hbWVbaW5kZXhdID0gdG91cHBlcihuYW1lW2luZGV4XSk7CisgIH0KKworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVuYWJsZXMgUlRUSSBmb3IgYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmIChydHRpXykgeworICAgIG91dCA8PCAiQDpydHRpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQWRkcyBidWlsZCBtYWNyb3MgdG8gYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKG9zdHJlYW0mIG91dCkgeworICBpZiAoIWJ1aWxkbWFjcm9fLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiNpZiAhIG1hY3JvIiA8PCBlbmRsOworICAgIG91dCA8PCAiQDpidWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgICAgIC8vIGN1cnJlbnQgY2xhc3MvaW50ZXJmYWNlCisgICAgb3V0IDw8ICJAOmF1dG9CdWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgLy8gaW5oZXJpdGVkIGNsYXNzZXMvaW50ZXJmYWNlcworICAgIG91dCA8PCAiI2VuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGhheGVEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgLyomJiBwcm9ncmFtICE9IHByb2dyYW1fKi8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBoYXhlLAorICAgICJIYXhlIiwKKyAgICAiICAgIGNhbGxiYWNrcyAgICAgICAgVXNlIG9uRXJyb3IoKS9vblN1Y2Nlc3MoKSBjYWxsYmFja3MgZm9yIHNlcnZpY2UgbWV0aG9kcyAobGlrZSBBUzMpXG4iCisgICAgIiAgICBydHRpICAgICAgICAgICAgIEVuYWJsZSBAOnJ0dGkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzXG4iCisgICAgIiAgICBidWlsZG1hY3JvPW15Lm1hY3Jvcy5DbGFzcy5tZXRob2QoYXJncylcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIEA6YnVpbGQgbWFjcm8gY2FsbHMgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3MjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaHNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoczoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHMiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX2RlZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIG5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBraXRlciwgc3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgaHNfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0cmluZyBoc19sYW5ndWFnZV9wcmFnbWEoKTsKKyAgc3RyaW5nIGhzX2ltcG9ydHMoKTsKKworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7CisKKyAgc3RyaW5nIGZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpOworCisgIHN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG1ldGhvZCA9IGZhbHNlKTsKKworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyB0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpOworCisgIHN0cmluZyB0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyByZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY2xpZW50XzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBwbmFtZSA9IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX1R5cGVzLmhzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX0NvbnN0cy5ocyI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIHdoZXJlIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9Db25zdHMgd2hlcmUiIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJpbXBvcnQgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2xhbmd1YWdlX3ByYWdtYSgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVHZW5lcmljICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1zaWduYXR1cmVzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbmFtZS1zaGFkb3dpbmcgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1tYXRjaGVzICMtfVxuIik7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdHJpbmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQorICAgICAgICAgKyAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIgorICAgICAgICAgKyAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIKKyAgICAgICAgICsgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2ltcG9ydHMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoCisgICAgICAiaW1wb3J0IFByZWx1ZGUgKCgkKSwgKC4pLCAoPj49KSwgKD09KSwgKCsrKSlcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFByZWx1ZGUgYXMgUFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24gYXMgWFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Nb25hZCBhcyBNICggbGlmdE0sIGFwLCB3aGVuIClcbiIKKyAgICAgICJpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hhYmxlIGFzIEhcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSW50IGFzIElcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWF5YmUgYXMgTSAoY2F0TWF5YmVzKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcgYXMgRSAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIEdIQy5HZW5lcmljcyBhcyBHIChHZW5lcmljKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UeXBlYWJsZSBhcyBUWSAoIFR5cGVhYmxlIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0XG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3JcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkgYXMgUUMgKCBBcmJpdHJhcnkoLi4pIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjayBhcyBRQyAoIGVsZW1lbnRzIClcbiIKKyAgICAgICJcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdCBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuVHlwZXMgYXMgVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0LkFyYml0cmFyaWVzIGFzIFRcbiIKKyAgICAgICJcbiIpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCisgICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCisgICAgcmVzdWx0ICs9ICJcbiI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7CisgIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOworICAgIGZfdHlwZXNfIDw8IG5hbWU7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoUC5TaG93LCBQLkVxLCBHLkdlbmVyaWMsIFRZLlR5cGVhYmxlLCBQLk9yZCwgUC5Cb3VuZGVkKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBQLkVudW0gIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZnJvbUVudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCB2YWx1ZSA8PCAiIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgIl8gLT4gWC50aHJvdyBULlRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImhhc2hXaXRoU2FsdCBzYWx0ID0gSC5oYXNoV2l0aFNhbHQgc2FsdCBQLi4gUC5mcm9tRW51bSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgKFAuZW51bUZyb21UbyBQLm1pbkJvdW5kIFAubWF4Qm91bmQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiIDo6ICIgPDwgcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpIDw8IGVuZGw7CisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHJldHVybiB0eXBlX3RvX2RlZmF1bHQodHlwZSk7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIG9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlAuVHJ1ZSIgOiAiUC5GYWxzZSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIikiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOworICAgICAgICAgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICB0X3Byb2dyYW0qIHByb2cgPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBpZiAocHJvZyAhPSBOVUxMICYmIHByb2cgIT0gcHJvZ3JhbV8pCisgICAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUocHJvZy0+Z2V0X25hbWUoKSkgPDwgIl9UeXBlcy4iOworICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIG91dCA8PCAiZGVmYXVsdF8iIDw8IGNuYW1lIDw8ICJ7IjsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyID0gdmFsLmJlZ2luKCk7CisgICAgICAgICB2X2l0ZXIgIT0gdmFsLmVuZCgpOworICAgICAgICAgKyt2X2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKworICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICAgKytmX2l0ZXIpCisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBjbmFtZSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisKKyAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIHN0cmluZyBjb25zdF92YWx1ZSA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCAiKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKGNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBjb25zdF92YWx1ZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIG91dCA8PCAiKE1hcC5mcm9tTGlzdCBbIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCIgPDwgdmFsIDw8ICIpIjsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIG91dCA8PCAiXSkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9IHR5cGUtPmlzX2xpc3QoKSA/ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpCisgICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgWyI7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEhhc2tlbGwgc3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgeworICAodm9pZCloZWxwZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGF0YSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRuYW1lOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiA6OiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuTWF5YmUgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCByZW5kZXJfaHNfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCksIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgb3V0IDw8ICIgZGVyaXZpbmcgKFAuU2hvdyxQLkVxLEcuR2VuZXJpYyxUWS5UeXBlYWJsZSkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICBvdXQgPDwgImluc3RhbmNlIFguRXhjZXB0aW9uICIgPDwgdG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgcmVjb3JkID0gc2FsdCI7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiIGBILmhhc2hXaXRoU2FsdGAgIiA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICB9CisgIGluZGVudChvdXQpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfdHlwZW1hcChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19kZWZhdWx0KG91dCwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBNLmxpZnRNICIgPDwgdG5hbWU7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIiAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImBNLmFwYCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIigiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIk0ubGlmdE0gUC5KdXN0ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgIlFDLmFyYml0cmFyeSkiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBTaHJpbmsKKyAgICBpbmRlbnQob3V0KSA8PCAic2hyaW5rIG9iaiB8IG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWUgPDwgIiA9IFtdIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgICAgICAgIHwgUC5vdGhlcndpc2UgPSBNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBmbmFtZSA9IGZpZWxkX25hbWUodG5hbWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgImlmIG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWU7CisgICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSAiOworICAgICAgb3V0IDw8ICJ0aGVuIFAuTm90aGluZyAiOworICAgICAgb3V0IDw8ICJlbHNlIFAuSnVzdCAkIGRlZmF1bHRfIiA8PCB0bmFtZTsKKyAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeyAvKiAwID09IG1lbWJlcnMuc2l6ZSgpICovCisgICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIFsiIDw8IHRuYW1lIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiA6OiBULlRocmlmdFZhbCAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgKFQuVFN0cnVjdCBmaWVsZHMpID0gIiA8PCBzbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBzdHJpbmcgZXR5cGUgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIEZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgPSAiOworCisgICAgb3V0IDw8ICJQLm1heWJlICgiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgIlAuZXJyb3IgXCJNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAiIDw8IGZuYW1lIDw8ICJcIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgJiYgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSBOVUxMKSB7CisgICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiBkZWZhdWx0XyIgPDwgc25hbWU7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSAiOworCisgICAgb3V0IDw8ICIoXFwoXywiIDw8IHZhbCA8PCAiKSAtPiAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHZhbCk7CisgICAgb3V0IDw8ICIpIjsKKyAgICBvdXQgPDwgIiAoTWFwLmxvb2t1cCAoIiA8PCBrZXkgPDwgIikgZmllbGRzKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gcmVhZAorICBzdHJpbmcgdG1hcCA9IHR5cGVfbmFtZSh0c3RydWN0LCAidHlwZW1hcF8iKTsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiBfID0gUC5lcnJvciBcIm5vdCBhIHN0cnVjdFwiIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiBQLklPICIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gdG9fIiA8PCBzbmFtZTsKKyAgb3V0IDw8ICIgPCQ+IFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lCisgICAgICAgICAgICAgIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUgPDwgIiBpcHJvdCBicyA9IHRvXyIgPDwgc25hbWUgPDwgIiAkICI7CisgIG91dCA8PCAiVC5kZXNlcmlhbGl6ZVZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikgYnMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCAiIC0+IFQuVGhyaWZ0VmFsIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQgPSBULlRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QgIjsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2V0IEV4Y2VwdGlvbnMKKyAgYm9vbCBoYXNFeG4gPSBmYWxzZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGhhc0V4biA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBib29sIGlzZmlyc3QgPSB0cnVlOworICBpZiAoaGFzRXhuKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgZXhucyA9IE0uY2F0TWF5YmVzICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgaWYgKGlzZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIlsgIjsKKyAgICAgICAgICBpc2ZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgICAgICBvdXQgPDwgIihcXCIgPDwgdiA8PCAiIC0+ICgiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7CisgICAgICAgIG91dCA8PCAiKSkpIDwkPiAiIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc2ZpcnN0KSB7CisgICAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImluIGlmIFAubm90IChQLm51bGwgZXhucykgdGhlbiBleG5zIGVsc2UgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiQgIjsKKyAgfQorCisgIG91dCA8PCAiTS5jYXRNYXliZXMiIDw8IGVuZGw7CisgIC8vIEdldCB0aGUgUmVzdAorICBpc2ZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoaXNmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoXFwiOworICAgIG91dCA8PCB2IDw8ICIgLT4gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiUC5KdXN0ICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSkpICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgJiYgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIjwkPiI7CisgICAgfQorICAgIG91dCA8PCAiICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpZiAoaXNmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJbXSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzRXhuKSB7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIC8vIHdyaXRlCisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBQLklPICgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC53cml0ZVZhbCBvcHJvdCAkIGZyb21fIjsKKyAgb3V0IDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisKKyAgLy8gZW5jb2RlCisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgLT4gTEJTLkJ5dGVTdHJpbmciIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC5zZXJpYWxpemVWYWwgb3Byb3QgJCAiOworICBvdXQgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmaWVsZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgInJlc3VsdCIpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBtYXAgZnJvbSBmaWVsZCBuYW1lcyB0byAodHlwZSwgaWQpCisgKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3R5cGVtYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwoXCIiIDw8IG1uYW1lIDw8ICJcIiwiIDw8IHR5cGVfdG9fZW51bSh0eXBlKSA8PCAiKSkiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8ICJdIiA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlIHRoZSBzdHJ1Y3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmaWxsZWQgaW4KKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgZm5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgImRlZmF1bHRfIik7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgPSAiIDw8IG5hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiID0gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9JZmFjZS5ocyI7CisgIGZfaWZhY2VfLm9wZW4oZl9pZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIGZfaWZhY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfaWZhY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pZmFjZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgZW5kbDsKKworICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKworICAgIGluZGVudChmX2lmYWNlXykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSBhID0+ICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUsIHRydWUpOworICAgIGluZGVudChmX2lmYWNlXykgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6OiBhIC0+ICIgPDwgZnQgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaWZhY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuCisgKlRoaXMgaXMgYmVjYXVzZQorICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKKyAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHBvcnRzID0gIiI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSU9SZWYgYXMgUiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7CisKKyAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgorICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBSLm5ld0lPUmVmIDAiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIGZhcmdzID0gIiI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCisgICAgICBmYXJncyArPSAiIGFyZ18iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKKworICAgIGZfY2xpZW50XyA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKQorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXEgPC0gc2VxaWQiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcW4gPC0gUi5yZWFkSU9SZWYgc2VxIiA8PCBlbmRsOworICAgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtc2dUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJULk1fT05FV0FZIiA6ICJULk1fQ0FMTCI7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQud3JpdGVNZXNzYWdlIG9wIChcIiIgPDwgZm5hbWUgPDwgIlwiLCAiIDw8IG1zZ1R5cGUgPDwgIiwgc2VxbikgJCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ3cml0ZV8iIDw8IGFyZ3NuYW1lIDw8ICIgb3AgKCIgPDwgYXJnc25hbWUgPDwgInsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7CisgICAgICAgICArK2ZsZF9pdGVyKSB7CisgICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgZl9jbGllbnRfIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsIGZpZWxkbmFtZSkgPDwgIj0iOworICAgICAgaWYgKCgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICAgIGZfY2xpZW50XyA8PCAiUC5KdXN0ICI7CisgICAgICBmX2NsaWVudF8gPDwgImFyZ18iIDw8IGZpZWxkbmFtZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZfY2xpZW50XyA8PCAifSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZnVubmFtZSwgJm5vYXJncyk7CisKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8IGZ1bm5hbWUgPDwgIiBpcCA9IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULnJlYWRNZXNzYWdlIGlwICQgXFwoZm5hbWUsIG10eXBlLCByc2VxaWQpIC0+IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLnRocm93IGV4biB9IiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7CisgICAgICAgICAgICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLm1heWJlIChQLnJldHVybiAoKSkgWC50aHJvdyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiByZXMpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gJCAiIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiIHJlcyIgPDwgZW5kbDsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICgpIiA8PCBlbmRsOworCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgZl9jbGllbnRfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlwiIiA8PCBmbmFtZSA8PCAiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gLT4gIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkKKyAgICAgICAgICAgICAgIDw8ICIucHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gPC0gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUIE1hcC5lbXB0eSkiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAobmFtZSxULk1fRVhDRVBUSU9OLHNlcWlkKSAkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiICsrIExULnVucGFjayBuYW1lKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC5yZWFkTWVzc2FnZSBpcHJvdCAoIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiBQLlRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK2Jvb2wgaGFzTm9Bcmd1bWVudHModF9mdW5jdGlvbiogZnVuYykgeworICByZXR1cm4gKGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyB0eXBlX3N0ciA9IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBmb3VuZCA9IC0xOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgZm91bmQgPSB0eXBlX3N0ci5maW5kX2ZpcnN0X29mKCJbXS4gIiwgZm91bmQgKyAxKTsKKyAgICBpZiAoc3RyaW5nOjpucG9zID09IHNpemVfdChmb3VuZCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0eXBlX3N0cltmb3VuZF0gPT0gJy4nKQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ18nOworICAgIGVsc2UKKyAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdaJzsKKyAgfQorICByZXR1cm4gdHlwZV9zdHI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIGZ1bm5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90LCBoYW5kbGVyKSA9IGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncyA8LSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBzaXplX3QgbiA9IHhjZXB0aW9ucy5zaXplKCkgKyAxOworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmIChuID4gMCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihYLmNhdGNoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICB9CisKKyAgaWYgKG4gPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgZl9zZXJ2aWNlXyA8PCAidmFsIDwtICI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiSWZhY2UuIiA8PCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiIGhhbmRsZXIiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIGFyZ3MpIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICJzdWNjZXNzIikgPDwgIiA9IHZhbH0iOworCisgIH0gZWxzZSBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWU7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaWYgKG4gPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBQLkp1c3QgZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKFxcXyAtPiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX0VYQ0VQVElPTiwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOIFwiXCIpIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikgOjogWC5Tb21lRXhjZXB0aW9uIC0+IFAuSU8gKCkpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlLCBwcmVmaXgpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIG91dCA8PCAiKGNhc2UgIiA8PCBhcmcgPDwgIiBvZiB7IiA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIiA8PCB2YWwgPDwgIiAtPiAiOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiRS5kZWNvZGVVdGY4ICI7CisgICAgfQorICAgIG91dCA8PCB2YWw7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAvLyBTaW5jZSB3aXJlIHR5cGUgb2YgYmluYXJ5IGlzIHRoZSBzYW1lIGFzIHN0cmluZywgd2UgYWN0dWFsbHkgcmVjZWl2ZSBULlRTdHJpbmcgbm90CisgICAgICAvLyBULlRCaW5hcnkKKyAgICAgIG91dCA8PCAiOyBULlRTdHJpbmcgIiA8PCB2YWwgPDwgIiAtPiAiIDw8IHZhbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8ICJQLnRvRW51bSAkIFAuZnJvbUludGVncmFsICIgPDwgdmFsOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiOyBfIC0+IFAuZXJyb3IgXCJ3cm9uZyB0eXBlXCJ9KSI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSkgeworCisgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0b18iKSA8PCAiIChULlRTdHJ1Y3QgIiA8PCBuYW1lIDw8ICIpKSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKKworICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rIik7CisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0ICQgUC5tYXAgKFxcKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIGtleSk7CisKKyAgICBvdXQgPDwgIiwiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgICAgb3V0IDw8ICIpKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpOworICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lKSB7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgb3V0IDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiOworICAgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICIkIEUuZW5jb2RlVXRmOCAiOworICAgICAgfQorICAgICAgb3V0IDw8IG5hbWU7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICAgIG91dCA8PCAiVC5USTMyICQgUC5mcm9tSW50ZWdyYWwgJCBQLmZyb21FbnVtICIgPDwgbmFtZTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCBPRiBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgImZyb21fIikgPDwgIiAiIDw8IHByZWZpeDsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGsgPSB0bXAoIl9rIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIlQuVE1hcCAiIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwoIiA8PCBrIDw8ICIsIiA8PCB2IDw8ICIpIC0+ICgiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwga3R5cGUsIGspOworICAgIG91dCA8PCAiLCAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgdnR5cGUsIHYpOworICAgIG91dCA8PCAiKSkgJCBNYXAudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8ICJULlRTZXQgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBTZXQudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiVC5UTGlzdCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpICQgVmVjdG9yLnRvTGlzdCAiIDw8IHByZWZpeDsKKyAgfQorfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgcmVzdWx0ICs9ICJQLk1heWJlICI7CisgICAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9ucyk7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorCisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKQorICAgIHJlc3VsdCArPSAiKCkgLT4gIjsKKworICBpZiAoaW8pCisgICAgcmVzdWx0ICs9ICJQLklPICI7CisKKyAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKQorICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfVHlwZXMuIjsKKworICByZXR1cm4gcHJlZml4ICsgZnVuY3Rpb25fcHJlZml4ICsgY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSkgeworICByZXR1cm4gZGVjYXBpdGFsaXplKHRuYW1lKSArICJfIiArIGZuYW1lOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJULlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlQuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlRfRE9VQkxFIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVF9JMzIiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKFQuVF9TVFJVQ1QgIiArIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJ0eXBlbWFwXyIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICByZXR1cm4gIihULlRfTUFQICIgKyBrdHlwZSArICIgIiArIHZ0eXBlICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGRlZmF1bHQgdmFsdWUKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJQLmVycm9yIFwiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUX1ZPSURcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlwiXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5GYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiTWFwLmVtcHR5IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB0eXBlX3JlcHI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAodHlwZS0+aXNfYmluYXJ5KCkgPyAiTEJTLkJ5dGVTdHJpbmciIDogIkxULlRleHQiKTsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlAuQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiSS5JbnQ4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiSS5JbnQxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkkuSW50MzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJLkludDY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUC5Eb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJWZWN0b3IuVmVjdG9yICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgaGFza2VsbCBjb25zdHJ1Y3RvcgorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImludmFsaWQgdHlwZTogVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRCaW5hcnkiIDogIlQuVFN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRCeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVC5USTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5USTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5USTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVC5URG91YmxlIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVEkzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJULlRTdHJ1Y3QiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlQuVE1hcCBfIF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlQuVFNldCBfIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVC5UTGlzdCBfIjsKKyAgfQorICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZhMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2VudW0gaW5wdXRfdHlwZSB7IElOUFVUX1VOS05PV04sIElOUFVUX1VURjgsIElOUFVUX1BMQUlOIH07CisKKy8qKgorICogSFRNTCBjb2RlIGdlbmVyYXRvcgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2h0bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9odG1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc3RhbmRhbG9uZV8gPSBmYWxzZTsKKyAgICB1bnNhZmVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic3RhbmRhbG9uZSIpID09IDApIHsKKyAgICAgICAgc3RhbmRhbG9uZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2VzY2FwZSIpID09IDApIHsKKyAgICAgICAgdW5zYWZlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaHRtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047CisKKyAgICBlc2NhcGVfLmNsZWFyKCk7CisgICAgZXNjYXBlX1snJiddID0gIiZhbXA7IjsKKyAgICBlc2NhcGVfWyc8J10gPSAiJmx0OyI7CisgICAgZXNjYXBlX1snPiddID0gIiZndDsiOworICAgIGVzY2FwZV9bJyInXSA9ICImcXVvdDsiOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKKworICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7CisgIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHZvaWQgZ2VuZXJhdGVfY3NzKCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCk7CisgIHZvaWQgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIG5hbWUpOworICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBpbml0X2FsbG93ZWRfX21hcmt1cCgpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworCisgIHZvaWQgcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKTsKKyAgaW50IHByaW50X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworICB2b2lkIHByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6OnN0cmluZyBjdXJyZW50X2ZpbGVfOworICBpbnB1dF90eXBlIGlucHV0X3R5cGVfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBhbGxvd2VkX21hcmt1cDsKKyAgYm9vbCBzdGFuZGFsb25lXzsKKyAgYm9vbCB1bnNhZmVfOworfTsKKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgeworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgorICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVjdXJzZXMgdGhyb3VnaCBmcm9tIHRoZSBwcm92aWRlZCBwcm9ncmFtIGFuZCBnZW5lcmF0ZXMgYSBUb0Mgcm93CisgKiBmb3IgZWFjaCBkaXNjb3ZlcmVkIHByb2dyYW0gZXhhY3RseSBvbmNlIGJ5IG1haW50YWluaW5nIHRoZSBsaXN0IG9mCisgKiBjb21wbGV0ZWQgcm93cyBpbiAnZmluaXNoZWQnCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgeworICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7IGl0ZXIgIT0gZmluaXNoZWQuZW5kKCk7IGl0ZXIrKykgeworICAgIGlmICh0cHJvZy0+Z2V0X3BhdGgoKSA9PSAoKml0ZXIpLT5nZXRfcGF0aCgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZpbmlzaGVkLnB1c2hfYmFjayh0cHJvZyk7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0cHJvZyk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHRwcm9nLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKCppdGVyLCBmaW5pc2hlZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKSB7CisgIHN0cmluZyBmbmFtZSA9IHRwcm9nLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgZl9vdXRfIDw8ICI8dHI+IiA8PCBlbmRsIDw8ICI8dGQ+IiA8PCB0cHJvZy0+Z2V0X25hbWUoKSA8PCAiPC90ZD48dGQ+IjsKKyAgaWYgKCF0cHJvZy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHRwcm9nLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgICAgICAgICA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dWw+IiA8PCBlbmRsOworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBmbl9odG1sOworICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSAoKnN2X2l0ZXIpLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyOworICAgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBzdHJpbmcgaHRtbCA9ICI8bGk+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0ZuXyIgKyBuYW1lICsgIl8iICsgZm5fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7CisgICAgICAgIGZuX2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KGZuX25hbWUsIGh0bWwpKTsKKyAgICAgIH0KKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOyBodG1sX2l0ZXIgIT0gZm5faHRtbC5lbmQoKTsKKyAgICAgICAgICAgaHRtbF9pdGVyKyspIHsKKyAgICAgICAgZl9vdXRfIDw8IGh0bWxfaXRlci0+c2Vjb25kIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdWw+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBkYXRhX3R5cGVzOworICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjRW51bV8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy8gPDwgICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRW51bV8iICsgbmFtZSArICJcIj4iICsgbmFtZSArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgZHRfaXRlciA9IGRhdGFfdHlwZXMuYmVnaW4oKTsgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOworICAgICAgIGR0X2l0ZXIrKykgeworICAgIGZfb3V0XyA8PCBkdF9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOworICBpZiAoIXRwcm9nLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gY29uc3RfaHRtbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7CisgICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPjwvY29kZT4iOworICAgICAgY29uc3RfaHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOworICAgICAgICAgY29uX2l0ZXIrKykgeworICAgICAgZl9vdXRfIDw8IGNvbl9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvY29kZT48L3RkPiIgPDwgZW5kbCA8PCAiPC90cj4iOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW0uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGN1cnJlbnRfZmlsZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIiA8PCBlbmRsOworICBmX291dF8gPDwgIiAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxoZWFkPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0eWxlX3RhZygpOworICBmX291dF8gPDwgIjx0aXRsZT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGgxPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvaDE+IiA8PCBlbmRsOworCisgIHByaW50X2RvYyhwcm9ncmFtXyk7CisKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKKworICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJDb25zdGFudHNcIj5Db25zdGFudHM8L2gyPiIgPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPkNvbnN0YW50PC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKyAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiRW51bWVyYXRpb25zXCI+RW51bWVyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJUeXBlZGVmc1wiPlR5cGUgZGVjbGFyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlN0cnVjdHNcIj5EYXRhIHN0cnVjdHVyZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzIGFuZCBleGNlcHRpb25zIGluIGRlY2xhcmVkIG9yZGVyCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlNlcnZpY2VzXCI+U2VydmljZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KKworICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKKworICBnZW5lcmF0ZV9pbmRleCgpOworICBnZW5lcmF0ZV9jc3MoKTsKK30KKworLyoqCisgKiBFbWl0cyB0aGUgaW5kZXguaHRtbCBmaWxlIGZvciB0aGUgcmVjdXJzaXZlIHNldCBvZiBUaHJpZnQgcHJvZ3JhbXMKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pbmRleCgpIHsKKyAgY3VycmVudF9maWxlXyA9ICJpbmRleC5odG1sIjsKKyAgc3RyaW5nIGluZGV4X2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgIGZfb3V0Xy5vcGVuKGluZGV4X2ZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgIjxodG1sPjxoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+PHRoPkRhdGEgdHlwZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKKyAgaWYgKCFzdGFuZGFsb25lXykgeworICAgIGN1cnJlbnRfZmlsZV8gPSAic3R5bGUuY3NzIjsKKyAgICBzdHJpbmcgY3NzX2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgICAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KGZfb3V0Xyk7CisgICAgZl9vdXRfLmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KSB7CisgIGZfdGFyZ2V0IDw8IEJPT1RTVFJBUF9DU1MoKSA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJoMywgaDQgeyBtYXJnaW4tYm90dG9tOiA2cHg7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7IG1hcmdpbi1ib3R0b206IDEwcHg7IHBhZGRpbmc6IDEwcHg7IH0iCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGQgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGFibGUgeyBlbXB0eS1jZWxsczogc2hvdzsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgIi50YWJsZS1ib3JkZXJlZCB0aCwgLnRhYmxlLWJvcmRlcmVkIHRkIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEREREREQ7IH0iCisgICAgICAgICAgIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDU1MgdGFnLgorICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkCisgKiBpbmxpbmUuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3R5bGVfdGFnKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8gPDwgIi0tPjwvc3R5bGU+IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdGFyZ2V0IGZpbGUgZm9yIGEgPGEgaHJlZj4gbGluaworICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCisgKi8KK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKSB7CisgIHJldHVybiAoY3VycmVudF9maWxlXy5jb21wYXJlKGZpbGVuYW1lKSAhPSAwKSA/IGZpbGVuYW1lIDogIiI7Cit9CisKKy8qKgorICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKKyAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGlmICh1bnNhZmVfKSB7CisgICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiPHByZT4iIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjwvcHJlPjxici8+IjsKKyAgICB9CisgIH0KK30KKworYm9vbCB0X2h0bWxfZ2VuZXJhdG9yOjppc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICBpbnQgY291bnQgPSAwOworICBpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7CisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgeworICAgIGNvdW50ID0gMjsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKKyAgICBjb3VudCA9IDM7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZDKSA9PSAweEY4KSB7CisgICAgY291bnQgPSA0OworICB9IGVsc2UgaWYgKChjICYgMHhGRSkgPT0gMHhGQykgeworICAgIGNvdW50ID0gNTsKKyAgfSBlbHNlIHsKKyAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7CisgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzCisgIHNpemVfdCBwb3MgPSBmaXJzdHBvcyArIDE7CisgIHdoaWxlICgocG9zIDwgc3RyLmxlbmd0aCgpKSAmJiAoMCA8IGNvdW50KSkgeworICAgIGMgPSBzdHIuYXQocG9zKTsKKyAgICBpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGZvbGxvd2luZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKKyAgICB9CisgICAgLS1jb3VudDsKKyAgICArK3BvczsKKyAgfQorCisgIC8vIHRydWUgaWYgdGhlIHNlcXVlbmNlIGlzIGNvbXBsZXRlCisgIHJldHVybiAoMCA9PSBjb3VudCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6ZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICBpZiAoaXNfdXRmOF9zZXF1ZW5jZShzdHIsIGZpcnN0cG9zKSkgeworICAgIHBkZWJ1ZygiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7CisgICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZhbGxiYWNrCisgIHB3YXJuaW5nKDEsICJJbnB1dCBpcyBub3QgVVRGLTgsIHRyZWF0aW5nIGFzIHBsYWluIEFOU0kiKTsKKyAgaW5wdXRfdHlwZV8gPSBJTlBVVF9QTEFJTjsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjppbml0X2FsbG93ZWRfX21hcmt1cCgpIHsKKyAgYWxsb3dlZF9tYXJrdXAuY2xlYXIoKTsKKyAgLy8gc3RhbmRhbG9uZSB0YWdzCisgIGFsbG93ZWRfbWFya3VwWyJiciJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJyLyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImltZyJdID0gMTsKKyAgLy8gcGFpcmVkIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iaWciXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdXAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc3ViIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3ByZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJvbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9vbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImxpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2xpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9hIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9wIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiY29kZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9jb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImRkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2RkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg2Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g2Il0gPSAxOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWYgKCgnPCcgPT0gYykgfHwgKCc+JyA9PSBjKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0YWcgZW5kIHdpdGhvdXQgY29ycmVzcG9uZGluZyBiZWdpbgorICAgICsrZmlyc3Rwb3M7CisgICAgaWYgKCc+JyA9PSBjKSB7CisgICAgICByZXN1bHQgPDwgIiZndDsiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gZXh0cmFjdCB0aGUgdGFnCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRhZ3N0cmVhbTsKKyAgICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGlmICgnPCcgPT0gYykgeworICAgICAgICB0YWdzdHJlYW0gPDwgIiZsdDsiOyAvLyBuZXN0ZWQgYmVnaW4/CisgICAgICB9IGVsc2UgaWYgKCc+JyA9PSBjKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnc3RyZWFtIDw8IGM7IC8vIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHRhZ3Mgc2hvdWxkIGJlIHF1aXRlIHNob3J0CisgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgYWxsb3cgZm9yIHNldmVyYWwgbWFya3VwIGluIGRvY3N0cmluZ3MsIGFsbCBlbHNlIHdpbGwgYmVjb21lIGVzY2FwZWQKKyAgICBzdHJpbmcgdGFnX2NvbnRlbnQgPSB0YWdzdHJlYW0uc3RyKCk7CisgICAgc3RyaW5nIHRhZ19rZXkgPSB0YWdfY29udGVudDsKKyAgICBzaXplX3QgZmlyc3Rfd2hpdGUgPSB0YWdfa2V5LmZpbmRfZmlyc3Rfb2YoIiBcdFxmXHZcblxyIik7CisgICAgaWYgKGZpcnN0X3doaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgdGFnX2tleS5lcmFzZShmaXJzdF93aGl0ZSk7CisgICAgfQorICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHRhZ19rZXkubGVuZ3RoKCk7ICsraSkgeworICAgICAgdGFnX2tleVtpXSA9IHRvbG93ZXIodGFnX2tleVtpXSk7CisgICAgfQorICAgIGlmIChhbGxvd2VkX21hcmt1cC5maW5kKHRhZ19rZXkpICE9IGFsbG93ZWRfbWFya3VwLmVuZCgpKSB7CisgICAgICByZXN1bHQgPDwgIjwiIDw8IHRhZ19jb250ZW50IDw8ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0IDw8ICImbHQ7IiA8PCB0YWdzdHJlYW0uc3RyKCkgPDwgIiZndDsiOworICAgICAgcHZlcmJvc2UoImlsbGVnYWwgbWFya3VwIDwlcz4gaW4gZG9jLWNvbW1lbnRcbiIsIHRhZ19rZXkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgeworICAvLyB0aGUgZ2VuZXJhdGVkIEhUTUwgaGVhZGVyIHNheXMgaXQgaXMgVVRGLTggZW5jb2RlZAorICAvLyBpZiBVVEYtOCBpbnB1dCBoYXMgYmVlbiBkZXRlY3RlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nCisgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3Moc3RyKTsKKyAgfQorCisgIC8vIGNvbnZlcnQgdW5zYWZlIGNoYXJzIHRvIHRoZWlyICYjPG51bT47IGVxdWl2YWxlbnQKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgdW5zaWduZWQgY2hhciBjID0gJz8nOworICB1bnNpZ25lZCBpbnQgaWMgPSAwOworICBzaXplX3QgbGFzdHBvczsKKyAgc2l6ZV90IGZpcnN0cG9zID0gMDsKKyAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisKKyAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgorICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKKyAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKKyAgICAgIGljID0gYzsKKyAgICAgIGlmICgoMzIgPiBpYykgfHwgKDEyNyA8IGljKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBzb21lIGNvbnRyb2wgY29kZT8KKyAgICBpZiAoaWMgPD0gMzEpIHsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnXHInOgorICAgICAgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXHQnOgorICAgICAgICByZXN1bHQgPDwgYzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvLyBzaWxlbnRseSBjb25zdW1lIGFsbCBvdGhlciBjdHJsIGNoYXJzCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytmaXJzdHBvczsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZGV0ZWN0IGlucHV0IGVuY29kaW5nCisgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VOS05PV04pIHsKKyAgICAgIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdHIsIGZpcnN0cG9zKTsKKyAgICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgICAgIGxhc3Rwb3MgPSBzdHIubGVuZ3RoKCk7CisgICAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gc29tZXRoaW5nIHVzZWZ1bCBiYXNlZCBvbiB0aGUgZGV0ZWN0ZWQgZW5jb2RpbmcKKyAgICBzd2l0Y2ggKGlucHV0X3R5cGVfKSB7CisgICAgY2FzZSBJTlBVVF9QTEFJTjoKKyAgICAgIHJlc3VsdCA8PCAiJiMiIDw8IGljIDw8ICI7IjsKKyAgICAgICsrZmlyc3Rwb3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgb3IgdW5yZWNvZ25pemVkIGlucHV0IGVuY29kaW5nIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhyZXN1bHQuc3RyKCkpOworfQorCisvKioKKyAqIFByaW50cyBvdXQgdGhlIHByb3ZpZGVkIHR5cGUgaW4gSFRNTAorICovCitpbnQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gMDsKKyAgZl9vdXRfIDw8ICI8Y29kZT4iOworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibGlzdCZsdDsiOworICAgICAgbGVuID0gNiArIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAic2V0Jmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBmX291dF8gPDwgIm1hcCZsdDsiOworICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIGxlbiArPSBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKHByb2dfbmFtZSArICIuaHRtbCIpIDw8ICIjIjsKKyAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiRW51bV8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdmNfIjsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiXCI+IjsKKyAgICBsZW4gPSB0eXBlX25hbWUuc2l6ZSgpOworICAgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgeworICAgICAgZl9vdXRfIDw8IHByb2dfbmFtZSA8PCAiLiI7CisgICAgICBsZW4gKz0gcHJvZ19uYW1lLnNpemUoKSArIDE7CisgICAgfQorICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIjwvYT4iOworICB9CisgIGZfb3V0XyA8PCAiPC9jb2RlPiI7CisgIHJldHVybiAoaW50KWxlbjsKK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKworICAvLyBpZiB0dmFsdWUgaXMgYW4gaWRlbnRpZmllciwgdGhlIGNvbnN0YW50IGNvbnRlbnQgaXMgYWxyZWFkeSBzaG93biBlbHNld2hlcmUKKyAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgc3RyaW5nIGZuYW1lID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICAgIHN0cmluZyBuYW1lID0gZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICBmX291dF8gPDwgIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgcmV0dXJuOworICB9CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGZfb3V0XyA8PCAnIicgPDwgZXNjYXBlX2h0bWwoZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfb3V0XyA8PCAoKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh0dmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBCQVNFIFRZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwodHJ1ZXR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX3N0cnVjdCgpIHx8IHRydWV0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHJ1ZXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHRydWV0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbWFwKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CisgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXRydWV0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc2V0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJVTktOT1dOIFRZUEUiOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBkb2N1bWVudGF0aW9uIGZvciBhcmd1bWVudHMvZXhjZXB0aW9ucyBvZiBhIGZ1bmN0aW9uLCBpZiBhbnkgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbgorICogc3VwcGxpZWQuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGJvb2wgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIlBhcmFtZXRlcnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCI+UGFyYW1ldGVyczwvaDQ+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+TmFtZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7CisgICAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCphcmdfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICAgIH0KKyAgfQorCisgIGhhc19kb2NzID0gZmFsc2U7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICBpZiAoKCpleF9pdGVyKS0+aGFzX2RvYygpICYmICEoKmV4X2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiRXhjZXB0aW9uc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5FeGNlcHRpb25zPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmV4X2l0ZXIpLT5nZXRfZG9jKCkpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlR5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj5UeXBlZGVmOiAiIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxwPjxzdHJvbmc+QmFzZSB0eXBlOjwvc3Ryb25nPiZuYnNwOyI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX291dF8gPDwgIjwvcD4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0dHlwZWRlZik7CisgIGZfb3V0XyA8PCAiPC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJFbnVtXyIgPDwgbmFtZSA8PCAiXCI+RW51bWVyYXRpb246ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0ZW51bSk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmX291dF8gPDwgIjxici8+PHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iIDw8IGVuZGw7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD4iIDw8IGVuZGw7CisgICAgcHJpbnRfZG9jKCgqdmFsX2l0ZXIpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjwvZGl2PiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8dHIgaWQ9XCJDb25zdF8iIDw8IG5hbWUgPDwgIlwiPjx0ZD48Y29kZT4iIDw8IG5hbWUgPDwgIjwvY29kZT48L3RkPjx0ZD4iOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC90ZD48dGQ+PGNvZGU+IjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiI7CisgIGlmICh0Y29uc3QtPmhhc19kb2MoKSkgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZCBjb2xzcGFuPVwiM1wiPjxibG9ja3F1b3RlPiI7CisgICAgcHJpbnRfZG9jKHRjb25zdCk7CisgICAgZl9vdXRfIDw8ICI8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPiI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlN0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiI7CisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJFeGNlcHRpb246ICI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGZfb3V0XyA8PCAiVW5pb246ICI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJTdHJ1Y3Q6ICI7CisgIH0KKyAgZl9vdXRfIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvIgorICAgICAgICAgICAgInRoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKm1lbV9pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgZl9vdXRfIDw8ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfb3V0XyA8PCAicmVxdWlyZWQiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgImRlZmF1bHQiOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgdF9jb25zdF92YWx1ZSogZGVmYXVsdF92YWwgPSAoKm1lbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGRlZmF1bHRfdmFsICE9IE5VTEwpIHsKKyAgICAgIGZfb3V0XyA8PCAiPGNvZGU+IjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBkZWZhdWx0X3ZhbCk7CisgICAgICBmX291dF8gPDwgIjwvY29kZT4iOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjxici8+IjsKKyAgcHJpbnRfZG9jKHRzdHJ1Y3QpOworICBmX291dF8gPDwgIjwvZGl2PiI7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBzdHJ1Y3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgYmxvY2sgZm9yIGEgVGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdmNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJcIj5TZXJ2aWNlOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjwvaDM+IiA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImV4dGVuZHNcIj48ZW0+ZXh0ZW5kczwvZW0+ICI7CisgICAgcHJpbnRfdHlwZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj5cbiI7CisgIH0KKyAgcHJpbnRfZG9jKHRzZXJ2aWNlKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lIDw8ICJcIj5GdW5jdGlvbjogIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgIDw8ICIuIiA8PCBmbl9uYW1lIDw8ICI8L2g0PiIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgIjxwcmU+IjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKKyAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBvZmZzZXQ7ICsraSkgeworICAgICAgICAgIGZfb3V0XyA8PCAiICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiICIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIpIiA8PCBlbmRsOworICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgICBmX291dF8gPDwgIiAgICB0aHJvd3MgIjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCBlbmRsOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvcHJlPiI7CisgICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKKyAgICBwcmludF9mbl9hcmdzX2RvYygqZm5faXRlcik7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj4iOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgaHRtbCwKKyAgICAiSFRNTCIsCisgICAgIiAgICBzdGFuZGFsb25lOiAgICAgIFNlbGYtY29udGFpbmVkIG1vZGUsIGluY2x1ZGVzIGFsbCBDU1MgaW4gdGhlIEhUTUwgZmlsZXMuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlcyBubyBzdHlsZS5jc3MgZmlsZSwgYnV0IEhUTUwgZmlsZXMgd2lsbCBiZSBsYXJnZXIuXG4iCisgICAgIiAgICBub2VzY2FwZTogICAgICAgIERvIG5vdCBlc2NhcGUgaHRtbCBpbiBkb2MgdGV4dC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDI0MCBAQAorI2RlZmluZSBCT09UU1RSQVBfQ1NTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLyohXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQm9vdHN0cmFwIHYyLjAuM1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIHYyLjBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LlxuIiAgICAgICAgICAgICAgXAorICAiICovXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4eyp6b29tOjE7fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmhpZGUtdGV4dHtmb250OjAvMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTtjb2xvcjp0cmFuc3BhcmVudDt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiLmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjI4cHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LSIgICAgXAorICAibW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbXMtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDt9XG4iICAgICAgICAgICAgICAgICAgXAorICAiYXJ0aWNsZSxhc2lkZSxkZXRhaWxzLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2s7fVxuIiAgICAgXAorICAiYXVkaW8sY2FudmFzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTsqem9vbToxO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXVkaW86bm90KFtjb250cm9sc10pe2Rpc3BsYXk6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHRtbHtmb250LXNpemU6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlO31cbiIgICAgICAgICAgICAgICAgXAorICAiYTpmb2N1c3tvdXRsaW5lOnRoaW4gZG90dGVkICMzMzM7b3V0bGluZTo1cHggYXV0byAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3ViLHN1cHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7fVxuIiAgICAgICAgICAgICAgXAorICAic3Vwe3RvcDotMC41ZW07fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3Vie2JvdHRvbTotMC4yNWVtO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW1ne21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWM7fVxuIiAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYXttYXJnaW46MDtmb250LXNpemU6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0eypvdmVyZmxvdzp2aXNpYmxlO2xpbmUtaGVpZ2h0Om5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLGlucHV0OjotbW96LWZvY3VzLWlubmVye3BhZGRpbmc6MDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0W3R5cGU9XCJidXR0b25cIl0saW5wdXRbdHlwZT1cInJlc2V0XCJdLGlucHV0W3R5cGU9XCJzdWJtaXRcIl17Y3Vyc29yOnBvaW50ZXI7LSIgICAgXAorICAid2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXXstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6IiAgXAorICAiY29udGVudC1ib3g7LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbixpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC0iICAgICAgXAorICAiY2FuY2VsLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGV4dGFyZWF7b3ZlcmZsb3c6YXV0bzt2ZXJ0aWNhbC1hbGlnbjp0b3A7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYm9keXttYXJnaW46MDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzMzMzMzMztiYWNrZ3JvdW5kLSIgICAgXAorICAiY29sb3I6I2ZmZmZmZjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXtjb2xvcjojMDA4OGNjO3RleHQtZGVjb3JhdGlvbjpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3Zlcntjb2xvcjojMDA1NTgwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvd3ttYXJnaW4tbGVmdDotMjBweDsqem9vbToxO30ucm93OmJlZm9yZSwucm93OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgXAorICAiLnJvdzphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6OTQwcHg7fVxuIiAgICAgICAgXAorICAiLnNwYW4xMnt3aWR0aDo5NDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMXt3aWR0aDo4NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMHt3aWR0aDo3ODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW45e3dpZHRoOjcwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW44e3dpZHRoOjYyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW43e3dpZHRoOjU0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW42e3dpZHRoOjQ2MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW41e3dpZHRoOjM4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW40e3dpZHRoOjMwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ze3dpZHRoOjIyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ye3dpZHRoOjE0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xe3dpZHRoOjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEye21hcmdpbi1sZWZ0Ojk4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDExe21hcmdpbi1sZWZ0OjkwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEwe21hcmdpbi1sZWZ0OjgyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDl7bWFyZ2luLWxlZnQ6NzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDh7bWFyZ2luLWxlZnQ6NjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDd7bWFyZ2luLWxlZnQ6NTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDZ7bWFyZ2luLWxlZnQ6NTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDV7bWFyZ2luLWxlZnQ6NDIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDR7bWFyZ2luLWxlZnQ6MzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDN7bWFyZ2luLWxlZnQ6MjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDJ7bWFyZ2luLWxlZnQ6MTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZHt3aWR0aDoxMDAlOyp6b29tOjE7fS5yb3ctZmx1aWQ6YmVmb3JlLC5yb3ctZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fSIgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LSIgXAorICAiYm94LXNpemluZzpib3JkZXItYm94Oy1tcy1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6IiAgXAorICAiMi4xMjc2NTk1NzQlOyptYXJnaW4tbGVmdDoyLjA3NDQ2ODA4NDYzODI5NzclO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCBbY2xhc3MqPVwic3BhblwiXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEye3dpZHRoOjk5Ljk5OTk5OTk4OTk5OTk5JTsqd2lkdGg6OTkuOTQ2ODA4NTAwNjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjExe3dpZHRoOjkxLjQ4OTM2MTY5MyU7KndpZHRoOjkxLjQzNjE3MDIwMzYzODMlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEwe3dpZHRoOjgyLjk3ODcyMzM5NTk5OTk5JTsqd2lkdGg6ODIuOTI1NTMxOTA2NjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjl7d2lkdGg6NzQuNDY4MDg1MDk5JTsqd2lkdGg6NzQuNDE0ODkzNjA5NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuOTU3NDQ2ODAxOTk5OTklOyp3aWR0aDo2NS45MDQyNTUzMTI2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjd7d2lkdGg6NTcuNDQ2ODA4NTA1JTsqd2lkdGg6NTcuMzkzNjE3MDE1NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjZ7d2lkdGg6NDguOTM2MTcwMjA3OTk5OTklOyp3aWR0aDo0OC44ODI5Nzg3MTg2MzgyOSU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuNDI1NTMxOTExJTsqd2lkdGg6NDAuMzcyMzQwNDIxNjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjR7d2lkdGg6MzEuOTE0ODkzNjE0JTsqd2lkdGg6MzEuODYxNzAyMTI0NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjN7d2lkdGg6MjMuNDA0MjU1MzE3JTsqd2lkdGg6MjMuMzUxMDYzODI3NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIlOyp3aWR0aDoxNC44NDA0MjU1MzA2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjF7d2lkdGg6Ni4zODI5Nzg3MjMlOyp3aWR0aDo2LjMyOTc4NzIzMzYzODI5OCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvOyp6b29tOjE7fS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7IiAgICAgXAorICAiZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcjphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZHtwYWRkaW5nLXJpZ2h0OjIwcHg7cGFkZGluZy1sZWZ0OjIwcHg7Knpvb206MTt9LmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLiIgICAgICAgXAorICAiY29udGFpbmVyLWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHttYXJnaW46MCAwIDlweDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7fXAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxlYWR7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoyN3B4O31cbiIgICAgICAgICAgICAgICAgICAgXAorICAiaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpib2xkO2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6IiAgXAorICAib3B0aW1pemVsZWdpYmlsaXR5O31oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDF7Zm9udC1zaXplOjMwcHg7bGluZS1oZWlnaHQ6MzZweDt9aDEgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDJ7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzZweDt9aDIgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDN7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjdweDt9aDMgc21hbGx7Zm9udC1zaXplOjE0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDQsaDUsaDZ7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDR7Zm9udC1zaXplOjE0cHg7fWg0IHNtYWxse2ZvbnQtc2l6ZToxMnB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDV7Zm9udC1zaXplOjEycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDZ7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVye3BhZGRpbmctYm90dG9tOjE3cHg7bWFyZ2luOjE4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlZWVlO31cbiIgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVyIGgxe2xpbmUtaGVpZ2h0OjE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwsb2x7cGFkZGluZzowO21hcmdpbjowIDAgOXB4IDI1cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwgdWwsdWwgb2wsb2wgb2wsb2wgdWx7bWFyZ2luLWJvdHRvbTowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx7bGlzdC1zdHlsZTpkaXNjO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAib2x7bGlzdC1zdHlsZTpkZWNpbWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGl7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwudW5zdHlsZWQsb2wudW5zdHlsZWR7bWFyZ2luLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGx7bWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHQsZGR7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxN3B4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGR7bWFyZ2luLWxlZnQ6OXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7ZmxvYXQ6bGVmdDt3aWR0aDoxMjBweDtjbGVhcjpsZWZ0O3RleHQtYWxpZ246cmlnaHQ7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IiAgXAorICAid2hpdGUtc3BhY2U6bm93cmFwO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgZGR7bWFyZ2luLWxlZnQ6MTMwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHJ7bWFyZ2luOjE4cHggMDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlZWVlO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmZmZmZmY7fVxuIiAgICAgXAorICAic3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZW17Zm9udC1zdHlsZTppdGFsaWM7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm11dGVke2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJici5pbml0aWFsaXNte2ZvbnQtc2l6ZTo5MCU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZXtwYWRkaW5nOjAgMCAwIDE1cHg7bWFyZ2luOjAgMCAxOHB4O2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjZWVlZWVlO31ibG9ja3F1b3RlICIgICAgICAgXAorICAicHttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjIyLjVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZSBzbWFsbHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6Izk5OTk5OTt9YmxvY2txdW90ZSAiICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGw6YmVmb3Jle2NvbnRlbnQ6J1xcMjAxNCBcXDAwQTAnO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICIgICAgXAorICAiI2VlZWVlZTtib3JkZXItbGVmdDowO31ibG9ja3F1b3RlLnB1bGwtcmlnaHQgcCxibG9ja3F1b3RlLnB1bGwtcmlnaHQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7dGV4dC1hbGlnbjpyaWdodDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicTpiZWZvcmUscTphZnRlcixibG9ja3F1b3RlOmJlZm9yZSxibG9ja3F1b3RlOmFmdGVye2NvbnRlbnQ6XCJcIjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MThweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjEwMCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY2l0ZXtmb250LXN0eWxlOm5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZSxwcmV7cGFkZGluZzowIDNweCAycHg7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLFwiQ291cmllciAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV3XCIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMzMzMzMzM7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4OyIgXAorICAiYm9yZGVyLXJhZGl1czozcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZXtwYWRkaW5nOjJweCA0cHg7Y29sb3I6I2QxNDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjk7Ym9yZGVyOjFweCBzb2xpZCAjZTFlMWU4O31cbiIgICAgICAgICAgXAorICAicHJle2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo4LjVweDttYXJnaW46MCAwICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiOXB4O2ZvbnQtc2l6ZToxMi4wMjVweDtsaW5lLWhlaWdodDoxOHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO3doaXRlLXNwYWNlOiIgXAorICAicHJlO3doaXRlLXNwYWNlOnByZS13cmFwO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCAiICAgICAgXAorICAicmdiYSgwLCAwLCAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4xNSk7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O31wcmUucHJldHR5cHJpbnR7IiAgICAgXAorICAibWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlIGNvZGV7cGFkZGluZzowO2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLC5iYWRnZXtmb250LXNpemU6MTAuOTk4cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxNHB4O2NvbG9yOiNmZmZmZmY7dmVydGljYWwtIiAgICAgXAorICAiYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwgMCwgMCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojOTk5OTk5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVse3BhZGRpbmc6MXB4IDRweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmJhZGdle3BhZGRpbmc6MXB4IDlweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo5cHg7LW1vei1ib3JkZXItcmFkaXVzOjlweDtib3JkZXItcmFkaXVzOjlweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiYS5sYWJlbDpob3ZlcixhLmJhZGdlOmhvdmVye2NvbG9yOiNmZmZmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7fVxuIiAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudCwuYmFkZ2UtaW1wb3J0YW50e2JhY2tncm91bmQtY29sb3I6I2I5NGE0ODt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudFtocmVmXSwuYmFkZ2UtaW1wb3J0YW50W2hyZWZde2JhY2tncm91bmQtY29sb3I6Izk1M2IzOTt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmcsLmJhZGdlLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmdbaHJlZl0sLmJhZGdlLXdhcm5pbmdbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3NbaHJlZl0sLmJhZGdlLXN1Y2Nlc3NbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMzU2NjM1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm8sLmJhZGdlLWluZm97YmFja2dyb3VuZC1jb2xvcjojM2E4N2FkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2UsLmJhZGdlLWludmVyc2V7YmFja2dyb3VuZC1jb2xvcjojMzMzMzMzO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2VbaHJlZl0sLmJhZGdlLWludmVyc2VbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMWExYTFhO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9IiAgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxle3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToxOHB4O30udGFibGUgdGgsLnRhYmxlICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGR7cGFkZGluZzo4cHg7bGluZS1oZWlnaHQ6MThweDt0ZXh0LWFsaWduOmxlZnQ7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICIgICAgICAgXAorICAiI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoe2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlICIgICAgICAgICAgXAorICAiY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNvbGdyb3VwK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSAiICAgICAgICAgICAgICAgXAorICAidGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgICAgICAgXAorICAidGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5K3Rib2R5e2JvcmRlci10b3A6MnB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWNvbmRlbnNlZCB0aCwudGFibGUtY29uZGVuc2VkIHRke3BhZGRpbmc6NHB4IDVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVke2JvcmRlcjoxcHggc29saWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiI2RkZGRkZDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7KmJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZWQ7Ym9yZGVyLWxlZnQ6MDstd2Via2l0LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O30udGFibGUtYm9yZGVyZWQgdGgsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgXAorICAidGR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgIiAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3RoZWFkICIgICAgICAgICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgXAorICAiY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCAiICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzLXRvcGxlZnQ6NHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItIiAgICAgXAorICAicmFkaXVzLXRvcHJpZ2h0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgIiAgICAgICAgICAgICAgICAgXAorICAidGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgMCA0cHg7Ym9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLSIgICAgXAorICAiYm90dG9tbGVmdDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpsYXN0LWNoaWxkICIgXAorICAidHI6bGFzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7LW1vei0iICAgICAgXAorICAiYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGQsLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgIiAgICAgICAgICAgICAgXAorICAidGh7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRkLC50YWJsZSB0Ym9keSB0cjpob3ZlciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xe2Zsb2F0Om5vbmU7d2lkdGg6NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ye2Zsb2F0Om5vbmU7d2lkdGg6MTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ze2Zsb2F0Om5vbmU7d2lkdGg6MjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW40e2Zsb2F0Om5vbmU7d2lkdGg6Mjg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW41e2Zsb2F0Om5vbmU7d2lkdGg6MzY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW42e2Zsb2F0Om5vbmU7d2lkdGg6NDQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW43e2Zsb2F0Om5vbmU7d2lkdGg6NTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW44e2Zsb2F0Om5vbmU7d2lkdGg6NjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW45e2Zsb2F0Om5vbmU7d2lkdGg6Njg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMHtmbG9hdDpub25lO3dpZHRoOjc2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMXtmbG9hdDpub25lO3dpZHRoOjg0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMntmbG9hdDpub25lO3dpZHRoOjkyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xM3tmbG9hdDpub25lO3dpZHRoOjEwMDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNHtmbG9hdDpub25lO3dpZHRoOjEwODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNXtmbG9hdDpub25lO3dpZHRoOjExNjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNntmbG9hdDpub25lO3dpZHRoOjEyNDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xN3tmbG9hdDpub25lO3dpZHRoOjEzMjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOHtmbG9hdDpub25lO3dpZHRoOjE0MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOXtmbG9hdDpub25lO3dpZHRoOjE0ODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMHtmbG9hdDpub25lO3dpZHRoOjE1NjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMXtmbG9hdDpub25lO3dpZHRoOjE2NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMntmbG9hdDpub25lO3dpZHRoOjE3MjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yM3tmbG9hdDpub25lO3dpZHRoOjE4MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yNHtmbG9hdDpub25lO3dpZHRoOjE4ODRweDttYXJnaW4tbGVmdDowO30iCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg0NTUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldGZpbGw7Cit1c2luZyBzdGQ6OnNldHc7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2phdmFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmVhbl9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX3N0eWxlXyA9IGZhbHNlOworICAgIHByaXZhdGVfbWVtYmVyc18gPSBmYWxzZTsKKyAgICBub2NhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX2xlZ2FjeV8gPSBmYWxzZTsKKyAgICBzb3J0ZWRfY29udGFpbmVyc18gPSBmYWxzZTsKKyAgICBqYXZhNV8gPSBmYWxzZTsKKyAgICByZXVzZV9vYmplY3RzXyA9IGZhbHNlOworICAgIHVzZV9vcHRpb25fdHlwZV8gPSBmYWxzZTsKKyAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gZmFsc2U7CisgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IGZhbHNlOworICAgIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfID0gZmFsc2U7CisgICAgdW5zYWZlX2JpbmFyaWVzXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJlYW5zIikgPT0gMCkgeworICAgICAgICBiZWFuX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWQiKSA9PSAwKSB7CisgICAgICAgIGFuZHJvaWRfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJpdmF0ZS1tZW1iZXJzIikgPT0gMCkgeworICAgICAgICBwcml2YXRlX21lbWJlcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9jYW1lbCIpID09IDApIHsKKyAgICAgICAgbm9jYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJmdWxsY2FtZWwiKSA9PSAwKSB7CisgICAgICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbmRyb2lkX2xlZ2FjeSIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic29ydGVkX2NvbnRhaW5lcnMiKSA9PSAwKSB7CisgICAgICAgIHNvcnRlZF9jb250YWluZXJzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImphdmE1IikgPT0gMCkgeworICAgICAgICBqYXZhNV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXVzZS1vYmplY3RzIikgPT0gMCkgeworICAgICAgICByZXVzZV9vYmplY3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9wdGlvbl90eXBlIikgPT0gMCkgeworICAgICAgICB1c2Vfb3B0aW9uX3R5cGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJnZW5lcmF0ZWRfYW5ub3RhdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGlmKCBpdGVyLT5zZWNvbmQuY29tcGFyZSgidW5kYXRlZCIpID09IDApIHsKKyAgICAgICAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmKGl0ZXItPnNlY29uZC5jb21wYXJlKCJzdXBwcmVzcyIpID09IDApIHsKKyAgICAgICAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YToiICsgaXRlci0+Zmlyc3QgKyAiPSIgKyBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5zYWZlX2JpbmFyaWVzIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfYmluYXJpZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoamF2YTVfKSB7CisgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCk7CisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBlbnVtIGlzc2V0X3R5cGUgeyBJU1NFVF9OT05FLCBJU1NFVF9QUklNSVRJVkUsIElTU0VUX0JJVFNFVCB9OworICBpc3NldF90eXBlIG5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSA9IE5VTEwpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9zdXBwcmVzc2lvbnMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgY29tbWVudCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgYm9vbCBpc19kZXByZWNhdGVkKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGFubm90YXRpb25zKSB7CisgICAgcmV0dXJuIGFubm90YXRpb25zLmZpbmQoImRlcHJlY2F0ZWQiKSAhPSBhbm5vdGF0aW9ucy5lbmQoKTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9zZXQodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgICByZXR1cm4gZWxlbV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9tYXAodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIGtleV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGlubmVyX2VudW1fdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIHJldHVybiB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiZWFuX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX3N0eWxlXzsKKyAgYm9vbCBwcml2YXRlX21lbWJlcnNfOworICBib29sIG5vY2FtZWxfc3R5bGVfOworICBib29sIGZ1bGxjYW1lbF9zdHlsZV87CisgIGJvb2wgYW5kcm9pZF9sZWdhY3lfOworICBib29sIGphdmE1XzsKKyAgYm9vbCBzb3J0ZWRfY29udGFpbmVyc187CisgIGJvb2wgcmV1c2Vfb2JqZWN0c187CisgIGJvb2wgdXNlX29wdGlvbl90eXBlXzsKKyAgYm9vbCB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc187CisgIGJvb2wgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXzsKKyAgYm9vbCB1bnNhZmVfYmluYXJpZXNfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9zdXBwcmVzc2lvbnMoKSB7CisgIHJldHVybiAiQFN1cHByZXNzV2FybmluZ3Moe1wiY2FzdFwiLCBcInJhd3R5cGVzXCIsIFwic2VyaWFsXCIsIFwidW5jaGVja2VkXCIsIFwidW51c2VkXCJ9KVxuIjsKK30KKworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIHsKKyAgcmV0dXJuICJAb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbi5OdWxsYWJsZSI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRlbnVtLT5hbm5vdGF0aW9uc18pOworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpZiAoIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKKyAgICBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihmX2VudW0pOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpZiAodGhpcy0+aXNfZGVwcmVjYXRlZCgoKmNfaXRlciktPmFubm90YXRpb25zXykpIHsKKyAgICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgZl9lbnVtIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAnLycgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUocHJvZ3JhbV9uYW1lXykKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgdW5zb3J0ZWRfZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB1bnNvcnRlZF9maWVsZHM7CisgICAgc3RkOjpzb3J0KGZpZWxkcy5iZWdpbigpLCBmaWVsZHMuZW5kKCksIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgY29uc3RydWN0b3JfYXJncyA9IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXggPSB0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKG5hbWVzcGFjZV9wcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICBuYW1lc3BhY2VfcHJlZml4ICs9ICIuIjsKKyAgICB9CisgICAgcmVuZGVyIDw8IG5hbWVzcGFjZV9wcmVmaXggPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZCh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc3RydWN0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KGZfc3RydWN0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc3RydWN0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UVW5pb248IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKKworICBzY29wZV91cChmX3N0cnVjdCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3N0cnVjdCk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZGVmYXVsdF92YWx1ZSA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChkZWZhdWx0X3ZhbHVlID09IGZhbHNlKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIChqYXZhLm5pby5CeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUuY2xvbmUoKSkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHRocm93cyBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24oXCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgZm9yIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIicsIGJ1dCBnb3QgXCIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7IiA8PCBlbmRsOworICAgIC8vIGRvIHRoZSByZWFsIGNoZWNrIGhlcmUKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAiaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGQuaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBzdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgIm9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJRCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiQ291bGRuJ3QgZmluZCBhIGZpZWxkIHdpdGggZmllbGQgaWQgXCIgKyBmaWVsZElEKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgdHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgIgorICAgICAgICAgICAgICAgICAidGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiAiCisgICAgICAgICAgICAgICAgICJnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0PiBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLk9iamVjdD4oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGxpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHNldEZpZWxkID0gZ2V0U2V0RmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGxpc3QuYWRkKHNldEZpZWxkLmdldFRocmlmdEZpZWxkSWQoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGphdmEubGFuZy5PYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICAgIGxpc3QuYWRkKHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IjsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFpbl9jbGFzcyAmJiAhc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG91dCk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiI7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgb3V0IDw8ICIsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSI7CisgIH0KKworICBvdXQgPDwgIiAiOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NjaGVtZV9tYXAob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgfQorICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBpbnQgb3B0aW9uYWxzID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvcHRpb25hbHMrKzsKKyAgICAgIH0KKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcHJpbWl0aXZlVHlwZTsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZwcmltaXRpdmVUeXBlKSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBwcmltaXRpdmVUeXBlIDw8ICIgX19pc3NldF9iaXRmaWVsZCA9IDA7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBqYXZhLnV0aWwuQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCIgPDwgaSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWxzID4gMCkgeworICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0X3N0cmluZyA9ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0geyI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0cHV0X3N0cmluZyA9IG91dHB1dF9zdHJpbmcgKyAiX0ZpZWxkcy4iICsgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpICsgIiwiOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBvdXRwdXRfc3RyaW5nLnN1YnN0cigwLCBvdXRwdXRfc3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSwgIiIpOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3V0KTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlcyBwYXJjZWxhYmxlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgc3RyaW5nIGJpdHNldFByaW1pdGl2ZVR5cGUgPSAiIjsKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0LCAmYml0c2V0UHJpbWl0aXZlVHlwZSkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9wcmltaXRpdmUgYml0ZmllbGQgb2YgdHlwZTogIiA8PCBiaXRzZXRQcmltaXRpdmVUeXBlIDw8IGVuZGw7CisgICAgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImJ5dGUiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZShfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQobmV3IFNob3J0KF9faXNzZXRfYml0ZmllbGQpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImludCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU2VyaWFsaXphYmxlKF9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVQYXJjZWxhYmxlKCIgPDwgbmFtZSA8PCAiLCBmbGFncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVGbG9hdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiICE9IG51bGwgPyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpIDogLTEpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgaWYgKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVUeXBlZExpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMaXN0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZU1hcCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiIT1udWxsID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKCIgPDwgbmFtZSA8PCAiICE9IG51bGwpIHsgIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGVBcnJheSgiIDw8IG5hbWUgPDwgIi5hcnJheSgpLCAiIDw8IG5hbWUgPDwgIi5wb3NpdGlvbigpICsgIgorICAgICAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIuYXJyYXlPZmZzZXQoKSwgIiA8PCBuYW1lIDw8ICIubGltaXQoKSAtICIgPDwgbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiLnBvc2l0aW9uKCkgKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoIiA8PCBuYW1lIDw8ICIpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZygiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lIDw8ICIoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyByZWFkIGluIHRoZSByZXF1aXJlZCBiaXRmaWVsZAorICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9CaXRTZXQiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3RvciA9IChqYXZhLnV0aWwuQml0U2V0KSBpbi5yZWFkU2VyaWFsaXphYmxlKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIC8vIHJlYWQgYWxsIHRoZSBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcHJlZml4ID0gInRoaXMuIiArIG5hbWU7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkUGFyY2VsYWJsZSgiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiLmZpbmRCeVZhbHVlKGluLnJlYWRJbnQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICB0X2xpc3QqIGxpc3QgPSAodF9saXN0Kil0OworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkVHlwZWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaW4ucmVhZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgaW4ucmVhZE1hcCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSh0KSA9PSAiZmxvYXQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRGbG9hdCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZSogYnQgPSAodF9iYXNlX3R5cGUqKXQ7CisgICAgICBpZiAoYnQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZihpbi5yZWFkSW50KCk9PTEpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChpbi5jcmVhdGVCeXRlQXJyYXkoKSk7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGJ0LT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChpbi5yZWFkSW50KCk9PTEpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWREb3VibGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkU3RyaW5nKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUKKyAgICAgICAgICAgICAgPDwgIj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjwiIDw8IHRuYW1lIDw8ICI+KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIltdIG5ld0FycmF5KGludCBzaXplKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0bmFtZSA8PCAiW3NpemVdOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICIoaW4pOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3QgdGhhdCkgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCBpbnQgTVVMID0gODE5MTsgLy8gSGFzaENvZGUgbXVsdGlwbGllcgorICBjb25zdCBpbnQgQl9ZRVMgPSAxMzEwNzE7CisgIGNvbnN0IGludCBCX05PID0gNTI0Mjg3OworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hDb2RlID0gMTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikKKyAgICAgICAgICAgICAgICAgIDw8ICIpID8gIiA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzd2l0Y2goKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBuYW1lIDw8ICIpID8gIgorICAgICAgICAgICAgICAgICAgICA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoaW50KSAoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuaGFzaENvZGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBhIHN0cnVjdCBmaWVsZCBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IHRoZSBmb2xsb3dpbmcgYmFzZSB0eXBlIGhhcyBubyBoYXNoY29kZSBnZW5lcmF0b3I6ICIgKworICAgICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoQ29kZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IGphdmEubGFuZy5Cb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCAiKS5jb21wYXJlVG8ob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIgorICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKGlwcm90KS5yZWFkKGlwcm90LCB0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpICYmICEoKHRfc3RydWN0Kil0eXBlKS0+aXNfdW5pb24oKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIudmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKG9wcm90KS53cml0ZShvcHJvdCwgdGhpcyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCAodHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGNvbnN0IGJvb2wgaXNfYmluYXJ5ID0gdHlwZS0+aXNfYmluYXJ5KCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGlmIChpc19iaW5hcnkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoYnl0ZVtdKXZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsICIgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkKKyAgICAgICAgICAgICAgPDwgIiBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlzc2V0X3R5cGUgaXNzZXRUeXBlID0gbmVlZHNfaXNzZXQodHN0cnVjdCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworICAgIGJvb2wgb3B0aW9uYWwgPSB1c2Vfb3B0aW9uX3R5cGVfICYmIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKGZpZWxkLT5hbm5vdGF0aW9uc18pOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248SW50ZWdlcj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPGphdmEudXRpbC5JdGVyYXRvcjwiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICA8PCAiPj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkgPDwgIi5ub25lT2YoIiA8PCBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHB1dCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUpIDw8ICIga2V5LCAiIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSkgPDwgIiB2YWwpIHsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyBudWxsIDogIiA8PCBmaWVsZF9uYW1lIDw8ICIuYXJyYXkoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjwiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiPiI7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuaXNTZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIG91dCA8PCAiIGlzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiBnZXQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOworICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICAgIG91dCA8PCAidm9pZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgICAgfQorICAgICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKGJ5dGVbXSAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gKGphdmEubmlvLkJ5dGVCdWZmZXIpbnVsbCI7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiA6IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIi5jbG9uZSgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKCFiZWFuX3N0eWxlXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICBvdXQgPDwgInZvaWQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgIH0KKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSA/IChqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSArICIgIikgOiAiIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhdW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQsICIiKTsKKyAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCAiCisgICAgICAgICAgICAgICAgICA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKQorICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXRfYml0X3ZlY3Rvci5nZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLnNldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19zZXQoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19saXN0KCkpCisgICAgICAgICAgICAgICAmJiAoZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgImphdmEudXRpbC5FbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUG9wdWxhdGUgbWFwCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgIDw8ICIsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgIG91dCA8PCAiKSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgICByZXR1cm4gIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyAiCisgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS4iCisgICAgICAgICAgICAgICAgICAgIlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KQorICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgIgorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKKyAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIHRydWUiOworICAgIH0KKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc2VydmljZV9uYW1lXykgKyAiLmphdmEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc2VydmljZV8pOworICB9CisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIiAuQXN5bmNJZmFjZSI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgRmFjdG9yeSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQocHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzdXBlcihwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoZnVubmFtZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kIiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigiOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdiIgPDwgc2VwIDw8IGphdmFuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmQiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGNvbnN0IHN0cmluZyBzZW5kQmFzZU5hbWUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRCYXNlT25ld2F5IiA6ICJzZW5kQmFzZSI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlbmRCYXNlTmFtZSA8PCAiKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3YiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlQmFzZShyZXN1bHQsIFwiIiA8PCBmdW5uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIi5Bc3luY0NsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZhY3RvcnkgbWV0aG9kCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudEZhY3Rvcnk8QXN5bmNDbGllbnQ+IHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcjsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEZhY3Rvcnkob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLmNsaWVudE1hbmFnZXIgPSBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBBc3luY0NsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0QXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICByZXR1cm4gbmV3IEFzeW5jQ2xpZW50KHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VwID0gIl8iOworICAgIHN0cmluZyBqYXZhbmFtZSA9IGZ1bm5hbWU7CisgICAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICAgIHNlcCA9ICIiOworICAgICAgamF2YW5hbWUgPSBhc19jYW1lbF9jYXNlKGphdmFuYW1lKTsKKyAgICB9CisgICAgdF90eXBlKiByZXRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgZnVuY2xhc3NuYW1lID0gZnVubmFtZSArICJfY2FsbCI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBhcmdzX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyByZXN1bHRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIC8vIE1haW4gbWV0aG9kIGJvZHkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBjaGVja1JlYWR5KCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAiIDw8IGZ1bmNsYXNzbmFtZSA8PCAiIG1ldGhvZF9jYWxsID0gbmV3ICIgKyBmdW5jbGFzc25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsPCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBNZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBOT1RFIHNpbmNlIHdlIHVzZSBhIG5ldyBDbGllbnQgaW5zdGFuY2UgdG8gZGVzZXJpYWxpemUsIGxldCdzIGtlZXAgc2VxaWQgdG8gMCBmb3Igbm93CisgICAgLy8gaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGludCBzZXFpZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENvbnN0cnVjdG9yCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIEFzc2lnbiBtZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLiIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHJlcXVlc3QKKyAgICAvLyBOT1RFIHdlIGFyZSBsZWF2aW5nIHNlcWlkIGFzIDAsIGZvciBub3cgKHNlZSBhYm92ZSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIlwiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4iCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpIDw8ICIsIDApKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NfbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmV0dXJuIG1ldGhvZAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyB0eXBlX25hbWUocmV0X3R5cGUsIHRydWUpICsgIiBnZXRSZXN1bHQoKSB0aHJvd3MgIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCFcIik7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyAiCisgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgaWYgKHJldF90eXBlLT5pc192b2lkKCkpIHsgLy8gTkI6IEluY2x1ZGVzIG9uZXdheXMgd2hpY2ggYWx3YXlzIHJldHVybiB2b2lkLgorICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gKG5ldyBDbGllbnQocHJvdCkpLnJlY3YiICsgc2VwICsgamF2YW5hbWUgKyAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBBc3luY0NsaWVudAorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZVByb2Nlc3NvcjxJPiI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3I8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIFByb2Nlc3NvcihJIGlmYWNlLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgSWZhY2U+IGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNQcm9jZXNzb3I8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXN5bmNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIEFzeW5jUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLD8+PiBnZXRQcm9jZXNzTWFwKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXN1bHRuYW1lID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIjsKKyAgfQorCisgIHN0cmluZyByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSk7CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIsICIgPDwgcmVzdWx0dHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+KCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uQ29tcGxldGUoIiA8PCByZXN1bHR0eXBlIDw8ICIgbykgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gbzsiIDw8IGVuZGw7CisgICAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYiwgcmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGUpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uRXJyb3IoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgb25ld2F5IGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6YWJsZSBtc2c7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmICh4X2l0ZXIgPT0geGNlcHRpb25zLmJlZ2luKCkpCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgc3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiAiIDw8IHR5cGUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGUgPDwgIikgZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKG5hbWUpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlICI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuRVhDRVBUSU9OOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IChvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYixtc2csbXNnVHlwZSxzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBleCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBleCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmIuY2xvc2UoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworCisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkKKyAgICBmX3NlcnZpY2VfIDw8ICIsIjsKKyAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0SGFuZGxlciI7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSI7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKCh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiByZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBnZXRSZXN1bHQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCBpcHJvdC5yZWFkSTMyKCkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQodHR5cGUpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5IGkuZS4gd2l0aCBhcHByb3ByaWF0ZSBzaXplL3R5cGUKKyAgaWYgKGlzX2VudW1fc2V0KHR0eXBlKSB8fCBpc19lbnVtX21hcCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgIigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfICYmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSkgeworICAgIC8vIFRyZWVTZXQgYW5kIFRyZWVNYXAgZG9uJ3QgaGF2ZSBhbnkgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBjYXBhY2l0eSBhcyBhbiBhcmd1bWVudAorICAgIG91dCA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKCIgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIpIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwga2V5IDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmdmFsLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGVsZW0gPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKHN0cnVjdC4iIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzY29wZV91cChvdXQpOworCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKGphdmEudXRpbC5NYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICAodm9pZCltYXA7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi5nZXRLZXkoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIGphdmEudXRpbC5IYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UpIHsKKyAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9tYXAodG1hcCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtTWFwIjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZU1hcCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hNYXAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLk1hcCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHNldCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtU2V0IjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZVNldCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hTZXQiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLlNldCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBpZiAoaW5faW5pdCkgeworICAgICAgcHJlZml4ID0gImphdmEudXRpbC5BcnJheUxpc3QiOworICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkxpc3QiOworICAgIH0KKyAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKChwcm9ncmFtICE9IE5VTEwpICYmICgocHJvZ3JhbSAhPSBwcm9ncmFtXykgfHwgZm9yY2VfbmFtZXNwYWNlKSkgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJWb2lkIiA6ICJ2b2lkIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJqYXZhLm5pby5CeXRlQnVmZmVyIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5CeXRlIiA6ICJieXRlIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5TaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuTG9uZyIgOiAibG9uZyIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIGNvbW1lbnQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmVzdWx0ICs9IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXN1bHQgKz0gIjsiOworICBpZiAoY29tbWVudCkgeworICAgIHJlc3VsdCArPSAiIC8vICI7CisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIHJlc3VsdCArPSAib3B0aW9uYWwiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmVkIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyBmbl9uYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7CisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOworICB9CisgIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndm9pZCBuYW1lKGFyZ3MsIHJlc3VsdEhhbmRsZXIpJworICoKKyAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodGZ1bmN0aW9uLCB1c2VfYmFzZV9tZXRob2QsIHRydWUpOworCisgIHN0ZDo6c3RyaW5nIHJldF90eXBlID0gIiI7CisgIGlmICh1c2VfYmFzZV9tZXRob2QpIHsKKyAgICByZXRfdHlwZSArPSAiQXN5bmNDbGllbnQuIjsKKyAgfQorICByZXRfdHlwZSArPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2NhbGwiOworCisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIGZuX25hbWUgKyAiKCIgKyBhcmdsaXN0ICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzKSB7CisgICh2b2lkKXVzZV9iYXNlX21ldGhvZDsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOworICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7CisgIH0KKworICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgIGFyZ2xpc3QgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICBhcmdsaXN0ICs9IHR5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOworCisgIHJldHVybiBhcmdsaXN0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdGZ1bmN0OworICAodm9pZCl0dHlwZTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkgeworICAgIHJlc3VsdCArPSAiLCAiOworICB9CisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCI7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZnVuY3QtPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4gIjsKKyAgfQorICByZXN1bHQgKz0gInJlc3VsdEhhbmRsZXIiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgSmF2YSBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgLy8gaWYgYW55IGZ1cnRoZXIgcnVsZXMgYXBwbHkgdG8gc291cmNlIGZpbGUgbmFtZXMgaW4gSmF2YSwgbW9kaWZ5IGFzIG5lY2Vzc2FyeQorICByZXR1cm4gbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoZnJvbU5hbWUpOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVlcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIGZyb21OYW1lIFRoZSBuYW1lIHdoaWNoIHNoYWxsIGJlY29tZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgcHJvZHVjZWQgaWRlbnRpZmllcgorICovCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QpIHsKKyAgc3RkOjpzdHJpbmcgbmV3X25hbWU7CisgIHNpemVfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSAhPSAnXycpCisgICAgICBicmVhazsKKyAgfQorICBpZiAodWNmaXJzdCkgeworICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7CisgIH0KKyAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpIC0gMSkgeworICAgICAgICBpKys7CisgICAgICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07CisgICAgfQorICB9CisgIHJldHVybiBuZXdfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChub2NhbWVsX3N0eWxlXykgeworICAgIHJldHVybiAiXyIgKyBuYW1lOworICB9IGVsc2UgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGJvb2wgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyOworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKiljb250YWluZXI7CisgICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpOworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gY29udGFpbmVyLT5pc19saXN0KCkgPyAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSBlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpOworICB9CisKKyAgaWYgKGNvcHlfY29uc3RydWN0X2NvbnRhaW5lcikgeworICAgIC8vIGRlZXAgY29weSBvZiBiYXNlIHR5cGVzIGNhbiBiZSBkb25lIG11Y2ggbW9yZSBlZmZpY2llbnRseSB0aGFuIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUKKyAgICAvLyBlbGVtZW50cyBtYW51YWxseQorICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgIGlmIChpc19lbnVtX3NldChjb250YWluZXIpIHx8IGlzX2VudW1fbWFwKGNvbnRhaW5lcikpIHsKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUoY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICghKHNvcnRlZF9jb250YWluZXJzXyAmJiAoY29udGFpbmVyLT5pc19tYXAoKSB8fCBjb250YWluZXItPmlzX3NldCgpKSkpIHsKKyAgICAvLyB1bnNvcnRlZCBjb250YWluZXJzIGFjY2VwdCBhIGNhcGFjaXR5IHZhbHVlCisgICAgY29uc3RydWN0b3JfYXJncyA9IHNvdXJjZV9uYW1lICsgIi5zaXplKCkiOworICB9CisKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIuZW50cnlTZXQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfa2V5ID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRLZXkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiamF2YS5uaW8uQnl0ZUJ1ZmZlciB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgKHZvaWQpZGVzdF9uYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFRVUExFX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgIgorICAgICAgICAgICAgICAgICAiZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgfQorCisgIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgX0ZpZWxkcz4oKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IGphdmEudXRpbC5FbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoKGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyAiCisgICAgICAgICAgICAgICAgICJcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBqYXZhLmxhbmcuU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmllbGROYW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9maWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit0X2phdmFfZ2VuZXJhdG9yOjppc3NldF90eXBlIHRfamF2YV9nZW5lcmF0b3I6Om5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGludCBjb3VudCA9IDA7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgY291bnQrKzsKKyAgICB9CisgIH0KKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm4gSVNTRVRfTk9ORTsKKyAgfSBlbHNlIGlmIChjb3VudCA8PSA2NCkgeworICAgIGlmIChvdXRQcmltaXRpdmVUeXBlICE9IE5VTEwpIHsKKyAgICAgIGlmIChjb3VudCA8PSA4KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDE2KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJzaG9ydCI7CisgICAgICBlbHNlIGlmIChjb3VudCA8PSAzMikKKyAgICAgICAgKm91dFByaW1pdGl2ZVR5cGUgPSAiaW50IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDY0KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKKyAgICB9CisgICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSVNTRVRfQklUU0VUOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghamF2YTVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIGZpZWxkLT5nZXRfbmFtZSgpLCB0LCBmaWVsZC0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKworICAgICAgaWYgKHJldXNlX29iamVjdHNfICYmICh0LT5pc19jb250YWluZXIoKSB8fCB0LT5pc19zdHJ1Y3QoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKKyAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0OworCisgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVuc3VwcG9ydGVkIHR5cGU6ICIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiIGZvciBmaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBzZXJpYWxpemUgKGluIHRoZSBKYXZhIHNlbnNlKSB0aGUgb2JqZWN0Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoMSk7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICIgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUiIDw8IChhbmRyb2lkX2xlZ2FjeV8gPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QuIgorICAgICAgICAgICAgICAgIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QudmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc3RydWN0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHx8IChpc19yZXN1bHQgJiYgIW51bGxfYWxsb3dlZCk7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIKKyAgICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBpcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBvcHRpb25hbF9jb3VudCsrOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmIChvcHRpb25hbF9jb3VudCA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLkJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoIiA8PCBvcHRpb25hbF9jb3VudCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChpbmNvbWluZy5nZXQoIiA8PCBpIDw8ICIpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBvcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19vcHRpb25hbCA9IGZhbHNlOworICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgICBoYXNfb3B0aW9uYWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKKyAgICB9CisgIH0KKyAgaWYgKGhhc19vcHRpb25hbCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IG9wdGlvbmFscyA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCk7IiA8PCBlbmRsOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm9wdGlvbmFscy5zZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaiA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJUdXBsZVNjaGVtZSBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4geyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zY2hlbWVfbG9va3VwKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgPFMgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZT4gUyBzY2hlbWUoIgorICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90bykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZS5jbGFzcy5lcXVhbHMocHJvdG8uZ2V0U2NoZW1lKCkpICIKKyAgICAgIDw8ICI/IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZICIKKyAgICAgIDw8ICI6IFRVUExFX1NDSEVNRV9GQUNUT1JZIgorICAgICAgPDwgIikuZ2V0U2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOworICBzdHJ1Y3QgdG0qIG5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7CisgIGluZGVudChvdXQpIDw8ICJAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgIlwiIjsKKyAgaWYgKHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiLCBkYXRlID0gXCIiIDw8IChub3ctPnRtX3llYXIgKyAxOTAwKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikKKyAgICAgICAgICAgICAgICA8PCAobm93LT50bV9tb24gKyAxKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgbm93LT50bV9tZGF5CisgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGphdmEsCisgICAgIkphdmEiLAorICAgICIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCisgICAgIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgIgorICAgICJ1c3VhbC5cbiIKKyAgICAiICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCisgICAgIiAgICBmdWxsY2FtZWw6ICAgICAgIENvbnZlcnQgdW5kZXJzY29yZWRfYWNjZXNzb3Jfb3Jfc2VydmljZV9uYW1lcyB0byBjYW1lbENhc2UuXG4iCisgICAgIiAgICBhbmRyb2lkOiAgICAgICAgIEdlbmVyYXRlZCBzdHJ1Y3R1cmVzIGFyZSBQYXJjZWxhYmxlLlxuIgorICAgICIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgIgorICAgICJhYm92ZSkuXG4iCisgICAgIiAgICBvcHRpb25fdHlwZTogICAgIFdyYXAgb3B0aW9uYWwgZmllbGRzIGluIGFuIE9wdGlvbiB0eXBlLlxuIgorICAgICIgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYW5kIGxldCB0aGVtIHByb3BhZ2F0ZSBmdXRoZXIuIgorICAgICIgKERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2F0Y2ggYW5kIGxvZyBpdC4pXG4iCisgICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKKyAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgorICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgorICAgICIgICAgc29ydGVkX2NvbnRhaW5lcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBUcmVlU2V0L1RyZWVNYXAgaW5zdGVhZCBvZiBIYXNoU2V0L0hhc2hNYXAgYXMgYSBpbXBsZW1lbnRhdGlvbiBvZiAiCisgICAgInNldC9tYXAuXG4iCisgICAgIiAgICBnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9W3VuZGF0ZWR8c3VwcHJlc3NdOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICB1bmRhdGVkOiBzdXBwcmVzcyB0aGUgZGF0ZSBhdCBAR2VuZXJhdGVkIGFubm90YXRpb25zXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iCisgICAgIiAgICB1bnNhZmVfYmluYXJpZXM6IERvIG5vdCBjb3B5IEJ5dGVCdWZmZXJzIGluIGNvbnN0cnVjdG9ycywgZ2V0dGVycywgYW5kIHNldHRlcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzQzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YW1lX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmFtZToiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBib29sIGhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX2VudW0oKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOworICB9CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gSmF2YQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisgIGZfZW51bSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCk7CisKKyAgZl9jb25zdHMgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShrdHlwZSwga2V5KSA8PCAiLCAiIDw8IGJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiLCAiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJuZXcgQnl0ZSgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm5ldyBTaG9ydCgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm5ldyBJbnRlZ2VyKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAibmV3IExvbmcoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJuZXcgRG91YmxlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIFRVbmlvbiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIFRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7CisgIH0KKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikgPDwgIiA9ICIgPDwgaSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlcikpOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBjb3B5IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaGFzX2JpdF92ZWN0b3IodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weShvdGhlci5fX2lzc2V0X3ZlY3RvciwgMCwgX19pc3NldF92ZWN0b3IsIDAsICIKKyAgICAgICAgICAgICAgICAgICAib3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOworCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICJUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iICsgbmFtZSArICIsIHRoYXQuIiArIG5hbWUgKyAiKSAhPSAwIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7CisgIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyT2JqZWN0OyI7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbygiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIsIG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX3N0cnVjdCgpIHx8IGZpZWxkLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNvbXBhcmVUbyhvdGhlci4iCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX3N0cmluZygpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZClvdXQ7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBFbnVtZXJhdGlvbiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiRW51bWVyYXRpb24oKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmVsZW1lbnRzKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgLy8gUHV0IHRvIG1hcAorICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXRUbyIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgPDwgIiBrZXksICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICBvdXQgPDwgIiBpcyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGdldCI7CisgICAgfQorICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworCisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSB7IH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlOworICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOworICB9CisKKyAgZl9pZmFjZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgdHNlcnZpY2UpOworICBmX2lmYWNlIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgKmZfaXRlcik7CisgICAgZl9pZmFjZSA8PCAiICBwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2lmYWNlIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7CisgIH0KKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiCisgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBwcm9jZXNzTWFwXyA9IG5ldyBIYXNodGFibGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgIidcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInRyeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgc3RyaW5nIGtleV90eXBlID0gdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwga2V5X3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGtleV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuZWxlbWVudHMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgc3RyaW5nIHZhbF90eXBlID0gdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiKCgiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIFZlY3RvcgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgKHZvaWQpc2tpcF9nZW5lcmljOworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJIYXNodGFibGUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlZlY3RvciI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiU2hvcnQiIDogInNob3J0Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkRvdWJsZSIgOiAiZG91YmxlIik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJURXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworCisgIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7CisgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOworICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKKyAgZWxzZQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKKworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOworICBzdGQ6OnN0cmluZyBlbnVtZXJhdGlvbl9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VudW0iOworICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOworCisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiID0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmtleXMoKTsgIgorICAgICAgICAgICAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIgorICAgICAgICAgICAgICAgIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lCisgICAgICAgICAgICAgICAgPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIsICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiCisgICAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOworICAgIH0KKyAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgIGVsc2UKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBwcmV2ZW50IGdjYyBjb21waWxlciB3YXJuaW5nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3ODJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjcyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKworCisvKioKKyAqIEpTIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25vZGVfID0gZmFsc2U7CisgICAgZ2VuX2pxdWVyeV8gPSBmYWxzZTsKKyAgICBnZW5fdHNfID0gZmFsc2U7CisgICAgZ2VuX2VzNl8gPSBmYWxzZTsKKworICAgIGJvb2wgd2l0aF9uc18gPSBmYWxzZTsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZGUiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub2RlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImpxdWVyeSIpID09IDApIHsKKyAgICAgICAgZ2VuX2pxdWVyeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIndpdGhfbnMiKSA9PSAwKSB7CisgICAgICAgIHdpdGhfbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXM2IikgPT0gMCkgeworICAgICAgICBnZW5fZXM2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChnZW5fZXM2XyAmJiBnZW5fanF1ZXJ5XykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczplczYsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlLCB0cnk6IFstZ2VuIGpzOm5vZGUgLWdlbiAiCisgICAgICAgICAgICAianM6anF1ZXJ5XSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8gJiYgd2l0aF9uc18pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6d2l0aF9uc10gaXMgb25seSB2YWxpZCB3aGVuIHVzaW5nIG5vZGUuanMiOworICAgIH0KKworICAgIC8vIERlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc2luZyBmbGFncywgd2Ugd2lsbCB1cGRhdGUgdGhlc2UgdG8gYmUgRVM2IGNvbXBhdGlibGUKKyAgICBqc19jb25zdF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc19sZXRfdHlwZV8gPSAidmFyICI7CisgICAganNfdmFyX3R5cGVfID0gInZhciAiOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAganNfY29uc3RfdHlwZV8gPSAiY29uc3QgIjsKKyAgICAgIGpzX2xldF90eXBlXyA9ICJsZXQgIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOworICAgICAgbm9fbnNfID0gIXdpdGhfbnNfOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7CisgICAgICBub19uc18gPSBmYWxzZTsKKyAgICB9CisKKyAgICBlc2NhcGVfWydcJyddID0gIlxcJyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcik7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqc19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0c19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLy9cbiIpICsgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIvL1xuIiArICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIi8vXG4iOworICB9CisKKyAgdF90eXBlKiBnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzOworCisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuIHBpZWNlczsKKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgcGllY2VzLnB1c2hfYmFjayhucyk7CisgICAgfQorCisgICAgcmV0dXJuIHBpZWNlczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGpzX3R5cGVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmIChwICE9IE5VTEwgJiYgcCAhPSBwcm9ncmFtXykgeworICAgICAgICByZXR1cm4gbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihwLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzLiI7CisgICAgICB9CisgICAgICByZXR1cm4gInR0eXBlcy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfZXhwb3J0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICByZXR1cm4gImV4cG9ydHMuIjsKKyAgICB9CisgICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKKyAgfQorCisgIGJvb2wgaGFzX2pzX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKyAgICByZXR1cm4gKG5zLnNpemUoKSA+IDApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBucyArPSAiLiI7CisgICAgfQorCisgICAgcmV0dXJuIG5zOworICB9CisKKyAgLyoqCisgICAqIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGhlbHBlciBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjayk7CisgIHN0cmluZyB0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpOworCisgIC8qKgorICAgKiBTcGVjaWFsIGluZGVudGF0aW9uIGZvciBUeXBlU2NyaXB0IERlZmluaXRpb25zIGJlY2F1c2Ugb2YgdGhlIG1vZHVsZS4KKyAgICogUmV0dXJucyB0aGUgbm9ybWFsIGluZGVudGF0aW9uICsgIiAgIiBpZiBhIG1vZHVsZSB3YXMgZGVmaW5lZC4KKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19pbmRlbnQoKSB7IHJldHVybiBpbmRlbnQoKSArICghdHNfbW9kdWxlXy5lbXB0eSgpID8gIiAgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICJkZWNsYXJlICIgaWYgbm8gbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2RlY2xhcmUoKSB7IHJldHVybiAodHNfbW9kdWxlXy5lbXB0eSgpID8gImRlY2xhcmUgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwgb3IgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICogQHBhcmFtIHRfZmllbGQgVGhlIGZpZWxkIHRvIGNoZWNrCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZ2V0X3JlcSh0X2ZpZWxkKiBmaWVsZCkge3JldHVybiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMID8gIj8iIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24sIGlmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBvbmUuCisgICAqIEBwYXJhbSB0X2RvYyBUaGUgb2JqZWN0IHRvIGdldCB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tCisgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkb2N1bWVudGF0aW9uCisgICAqLworICBzdHJpbmcgdHNfcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGVuZGw7CisKKyAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb2ModGRvYy0+Z2V0X2RvYygpKTsKKyAgICAgIHN0cmluZyBpdGVtOworCisgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiLyoqIiArIGVuZGw7CisgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGRvYywgaXRlbSkpIHsKKyAgICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqICIgKyBpdGVtICsgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIgKi8iICsgZW5kbDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KKyAgICovCisgIGJvb2wgZ2VuX25vZGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBzZXJ2aWNlcyB0aGF0IHVzZSBqUXVlcnkgYWpheCAoYXN5bmMvc3luYykuCisgICAqLworICBib29sIGdlbl9qcXVlcnlfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGZvciBlYWNoIHNlcnZpY2UuCisgICAqLworICBib29sIGdlbl90c187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIEVTNiBjb2RlLCBpLmUuIHdpdGggUHJvbWlzZXMKKyAgICovCisgIGJvb2wgZ2VuX2VzNl87CisKKyAgLyoqCisgICAqIFRoZSBuYW1lIG9mIHRoZSBkZWZpbmVkIG1vZHVsZShzKSwgZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlcy4KKyAgICovCisgIHN0cmluZyB0c19tb2R1bGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBub3QgZ2VuZXJhdGUgbmFtZXNwYWNlIG9iamVjdHMgZm9yIG5vZGUuCisgICAqLworICBib29sIG5vX25zXzsKKworICAvKioKKyAgICogVGhlIHZhcmlhYmxlIGRlY29yYXRvciBmb3IgImNvbnN0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfY29uc3RfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAibGV0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfbGV0X3R5cGVfOworCisgICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFyaWFibGUgZGVjb3JhdG9yLiBTdXBwb3J0cyBhbGwgamF2YXNjcmlwdCBsYW5ndWFnZXMsIGJ1dCBpcyBub3Qgc2NvcGVkIHRvIGZ1bmN0aW9ucyBvciBjbG9zdXJlcy4KKyAgICovCisgIHN0cmluZyBqc192YXJfdHlwZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV90c187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZShzKQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmpzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBzdHJpbmcgZl90eXBlc190c19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmQudHMiOworICAgIGZfdHlwZXNfdHNfLm9wZW4oZl90eXBlc190c19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiXCJ1c2Ugc3RyaWN0XCI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBmX3R5cGVzXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgcG5zOworCisgIC8vIHNldHVwIHRoZSBuYW1lc3BhY2UKKyAgLy8gVE9ETyBzaG91bGQgdGhlIG5hbWVzcGFjZSBqdXN0IGJlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBub2RlPworICB2ZWN0b3I8c3RyaW5nPiBuc19waWVjZXMgPSBqc19uYW1lc3BhY2VfcGllY2VzKHByb2dyYW1fKTsKKyAgaWYgKG5zX3BpZWNlcy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuc19waWVjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHBucyArPSAoKGkgPT0gMCkgPyAiIiA6ICIuIikgKyBuc19waWVjZXNbaV07CisgICAgICBmX3R5cGVzXyA8PCAiaWYgKHR5cGVvZiAiIDw8IHBucyA8PCAiID09PSAndW5kZWZpbmVkJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgcG5zIDw8ICIgPSB7fTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIHRzX21vZHVsZV8gPSBwbnM7CisgICAgICBmX3R5cGVzX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyByZXN1bHQgPSBqc19jb25zdF90eXBlXyArICJ0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgKyBqc19jb25zdF90eXBlXyArICJUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIjsKKyAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyAiUSA9IHRocmlmdC5RO1xuIjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuIHN0cmluZygKKyAgICAgICAgImltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgImltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgorICAgICAgICAiaW1wb3J0IFEgPSB0aHJpZnQuUTtcbiIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICArICJfdHlwZXMnKTtcbiI7CisgICAgfQorICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQgKz0gIlxuIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUocykKKworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9IjsKKyAgICB9CisgICAgZl90eXBlc190c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0ZW51bSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJlbnVtICIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3QmIGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIC8vIGFkZCAndmFsdWU6IGtleScgaW4gYWRkaXRpb24gdG8gJ2tleTogdmFsdWUnIGZvciBUeXBlU2NyaXB0IGVudW1zCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgdmFsdWUgPDwgIicgOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIDogIiA8PCB2YWx1ZTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSAtIDEpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsIjsKKyAgICB9CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IG5hbWUgPDwgIiA9ICI7CisgIGZfdHlwZXNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModGNvbnN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwganNfY29uc3RfdHlwZV8gPDwgbmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworCisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgIlsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgICBvdXQgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfanNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworLyoqCisgKiBSZXR1cm4gdHlwZSBvZiBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgY29udGFpbmVyIHR5cGUuIEZvciBtYXBzCisgKiB0aGlzIGlzIHR5cGUgb2YgdmFsdWUgKGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzIGluIGpzKQorICovCit0X3R5cGUqIHRfanNfZ2VuZXJhdG9yOjpnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KSB7CisgIHRfdHlwZSogZXR5cGU7CisgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgeworICAgIGV0eXBlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICB9CisgIHJldHVybiBldHlwZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gSlMKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIG91dCA8PCBwcmVmaXggPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAorICAgICAgKGlzX2V4cG9ydGVkID8gIiA9IG1vZHVsZS5leHBvcnRzLiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpIDogIiIpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRzdHJ1Y3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAoaXNfZXhjZXB0aW9uID8gIiBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIiA6ICIiKQorICAgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IoYXJncykgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBDYWxsIHN1cGVyKCkgbWV0aG9kIG9uIGluaGVyaXRlZCBFcnJvciBjbGFzcworICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKGFyZ3MpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMubmFtZSA9IFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gbWVtYmVycyB3aXRoIGFyZ3VtZW50cworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGV4Y2VwdGlvbnMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChhcmdzIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInJldHVybjsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncykgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAiY29uc3RydWN0b3IoYXJncz86IHsgIjsKKyAgICB9CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkICYmIGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBvdXQgPDwgKCIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpICsgdC0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIihhcmdzLiIrKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsiKTsiKTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUodCk7CisgICAgICAgIHN0cmluZyBjb3B5RnVuYyA9IHQtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICBzdHJpbmcgdHlwZV9saXN0ID0gIiI7CisKKyAgICAgICAgd2hpbGUgKGV0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKKyAgICAgICAgICB9CisgICAgICAgICAgdHlwZV9saXN0ICs9IGV0eXBlLT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKKyAgICAgICAgICBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZShldHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0ganNfdHlwZV9uYW1lc3BhY2UoZXR5cGUtPmdldF9wcm9ncmFtKCkpICsgZXR5cGUtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gIm51bGwiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICgiID0gIiArIGNvcHlGdW5jICsgIihhcmdzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCkgKworICAgICAgICAgICAgICAgICIsIFsiICsgdHlwZV9saXN0ICsgIl0pOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmICghKCptX2l0ZXIpLT5nZXRfcmVxKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLlVOS05PV04sICIKKyAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCB0c19nZXRfcmVxKCptX2l0ZXIpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyAiOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZXM2XykgeworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiLCBUaHJpZnQuVEV4Y2VwdGlvbik7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLm5hbWUgPSAnIgorICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBpbml0IHByb3RvdHlwZSBtYW51YWxseSBpZiB3ZSBhcmVuJ3QgdXNpbmcgZXM2CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUgPSB7fTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworCisgIC8vIENsb3NlIG91dCB0aGUgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmVhZCAoaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJmaWQgPSByZXQuZmlkOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChmaWVsZHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIC8vIHBzZXVkbyBjYXNlIHRvIG1ha2UganNsaW50IGhhcHB5CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAwOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAid3JpdGUgKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwgJiYgdGhpcy4iCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5qcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5kLnRzIjsKKyAgICBmX3NlcnZpY2VfdHNfLm9wZW4oZl9zZXJ2aWNlX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwganNfaW5jbHVkZXMoKSA8PCBlbmRsIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5kLnRzXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV90c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMnKTsiIDw8IGVuZGw7CisgICAgICAvLyBHZW5lcmF0ZSB0eXBlIGFsaWFzZXMKKyAgICAgIC8vIGVudW0KKyAgICAgIHZlY3Rvcjx0X2VudW0qPiBjb25zdCYgZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgICAgIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmVfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gY29uc3QKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3QmIGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gZXhjZXB0aW9uCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgZXhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gc3RydWN0cworICAgICAgdmVjdG9yPHRfc3RydWN0Kj4gY29uc3QmIHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgICAgICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqc19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXF1aXJlKCcuLyIKKyAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIicpOyIgPDwgZW5kbCA8PCBqc19jb25zdF90eXBlXworICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwganNfY29uc3RfdHlwZV8gPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvciA9ICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5Qcm9jZXNzb3I7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgInR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgIn0iOworICAgIH0KKyAgICBmX3NlcnZpY2VfdHNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgZW5kbCA8PCAiZGVjbGFyZSBjbGFzcyBQcm9jZXNzb3IgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIF9oYW5kbGVyOiBPYmplY3Q7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyOiBPYmplY3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3MoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sKTogdm9pZDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIgorICAgICAgICAgICAgIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgIH0KKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIC8vIEVTNiBDb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBFUzUgc2VydmljZSBpbmhlcml0YW5jZQorICBpZiAoIWdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLCAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIChpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAiIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgICAgICAgICInVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gQ2xvc2Ugb2ZmIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiAoc2VxaWQsIGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3NfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX3RzXykgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZXFpZDogbnVtYmVyLCBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiX3Jlc3VsdCI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBQcm9taXNlIHN0eWxlIGludm9jYXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9taXNlLnJlc29sdmUodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLmJpbmQodGhpcy5faGFuZGxlcikoIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZpZWxkcy5zaXplKCkgPiAwID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZl9pdGVyICE9IGZpZWxkcy5lbmQoKSAtIDEgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IG1heWJlQ29tbWEgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKSkudGhlbihyZXN1bHQgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIikudGhlbihmdW5jdGlvbihyZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KS5jYXRjaChlcnIgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdDsiIDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfZXhjZXB0aW9uID0gZmFsc2U7CisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGlmIChleGNlcHRpb25zKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoIWhhc19leGNlcHRpb24pIHsKKyAgICAgICAgICBoYXNfZXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoZXJyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICAvLyBFbmQgcHJvbWlzZSBzdHlsZSBpbnZvY2F0aW9uCisKKyAgLy8gQ2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGZfc2VydmljZV8gPDwgIihlcnIsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdF9vYmo7IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKChlcnIgPT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpIjsKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiB8fCBlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIiA8PCByZXN1bHRuYW1lCisgICAgICAgICAgICAgPDwgIigoZXJyICE9PSBudWxsIHx8IHR5cGVvZiBlcnIgPT09ICd1bmRlZmluZWQnKSA/IGVyciA6IHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmoud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIC8vIEVuZCBjYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIERvIG5vdCBnZW5lcmF0ZSBUUyBkZWZpbml0aW9ucyBmb3IgaGVscGVyIGZ1bmN0aW9ucworICBib29sIGdlbl90c190bXAgPSBnZW5fdHNfOworICBnZW5fdHNfID0gZmFsc2U7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgICAgdHMtPnNldF9uYW1lKG5hbWUpOworICB9CisKKyAgZ2VuX3RzXyA9IGdlbl90c190bXA7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgYm9vbCBpc19zdWJjbGFzc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTDsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwgImV4cG9ydHMuQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJDbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiOworICAgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3Iob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3IoaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fc2VxaWQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3JlcXMgPSB7fTsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAic2VxaWQ6IG51bWJlcjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAiY29uc3RydWN0b3IoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ/OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCAoKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibmV3X3NlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnNlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9OyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9lczZfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRob3V0IGNhbGxiYWNrCisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UsIGZhbHNlKSA8PCBlbmRsOworICAgICAgaWYgKCFnZW5fZXM2XykgeworICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCisgICAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIHRydWUpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VsZi5zZXFpZCgpXSA9IChlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX25vZGVfKSB7IC8vIE5vZGUuanMgb3V0cHV0ICAgICAgLi9nZW4tbm9kZWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiX2RlZmVyID0gUS5kZWZlcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlamVjdChlcnJvcik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9kZWZlci5wcm9taXNlOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBjYWxsYmFjazsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICIoZXJyb3IsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmIChnZW5fanF1ZXJ5XykgeyAvLyBqUXVlcnkgb3V0cHV0ICAgICAgIC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIi5qcVJlcXVlc3QodGhpcywgcG9zdERhdGEsIGFyZ3VtZW50cywgdGhpcy5yZWN2XyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsgLy8gU3RhbmRhcmQgSmF2YVNjcmlwdCAuL2dlbi1qcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiY2FsbGJhY2spOyAiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCFjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAgcmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJnbGlzdCA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRVM2IGpzIHN0aWxsIHVzZXMgY2FsbGJhY2tzIGhlcmUuIFNob3VsZCByZWZhY3RvciB0aGlzIHRvIHByb21pc2Ugc3R5bGUgbGF0ZXIuLgorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJndW1lbnRfbGlzdChhcmdfc3RydWN0LCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLnNlbmRfIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9ub2RlXykgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIm91dHB1dCA9IG5ldyB0aGlzLnBDbGFzcyh0aGlzLm91dHB1dCk7IiA8PCBlbmRsOworICAgICAgb3V0cHV0VmFyID0gIm91dHB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dFZhciA9ICJ0aGlzLm91dHB1dCI7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2FyZ3MiOworCisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIjsKKyAgICAvLyBCdWlsZCBhcmdzCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKXsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBhcmFtcyA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpLTEpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKHBhcmFtcyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlciB3aXRoaW4gdHJ5L2NhdGNoCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IG91dHB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyCisgICAgICAgICAgICAgICA8PCAiLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgImNhbGxiYWNrID0gdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaygpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCAoKSA9PiB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfbGV0X3R5cGVfIDw8ICJlcnJvciA9IG51bGwsIHJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnJvciA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2spIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBmdW5jdGlvbigpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBlOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBSZXNldCB0aGUgdHJhbnNwb3J0IGFuZCBkZWxldGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpZiB0aGVyZSB3YXMgYSBzZXJpYWxpemF0aW9uIGVycm9yCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gQ2xvc2Ugc2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFJlY2VpdmUgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICAvLyBPcGVuIHJlY2VpdmUgZnVuY3Rpb24KKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKGlucHV0LCBtdHlwZSwgcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBzdGQ6OnN0cmluZyBpbnB1dFZhcjsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaW5wdXRWYXIgPSAiaW5wdXQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRWYXIgPSAidGhpcy5pbnB1dCI7CisgICAgICB9CisKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3JzZXFpZF0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbcnNlcWlkXTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSB0aGlzLmlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAibXR5cGUgPSByZXQubXR5cGU7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3IFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJ4IikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJyZXN1bHQuIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3JldHVybigicmVzdWx0LnN1Y2Nlc3MiKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIiciICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JyIpCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNhbGxiYWNrKG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmIChnZW5fZXM2XykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZpbmlzaCBjbGFzcyBkZWZpbml0aW9ucworICBpZiAoZ2VuX3RzXykgeworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICAodm9pZClpbmNsYXNzOworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaW5wdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAicmVhZEJpbmFyeSgpIiA6ICJyZWFkU3RyaW5nKCkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCAiLnZhbHVlIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcgcnRtcDMgPSB0bXAoIl9ydG1wMyIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBpZiAoaW5wdXQucnN0YWNrLmxlbmd0aCA+IGlucHV0LnJwb3NbaW5wdXQucnBvcy5sZW5ndGggLTFdICsgMSkgeyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgaW5wdXQucnN0YWNrLnBvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gIndyaXRlQmluYXJ5KCIgOiAid3JpdGVTdHJpbmcoIikgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiVGhyaWZ0Lm9iamVjdExlbmd0aCgiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGtpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBraXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgdml0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBraXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFvYmopIHsKKyAgICByZXN1bHQgPSBqc19sZXRfdHlwZV8gKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIgPSBmdW5jdGlvbigiOworCisgIHN0ciArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV9jYWxsYmFjayk7CisKKyAgc3RyICs9ICIpIjsKKyAgcmV0dXJuIHN0cjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICJjYWxsYmFjayI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSB0X3R5cGUgdG8gYSBUeXBlU2NyaXB0IHR5cGUgKHN0cmluZykuCisgKiBAcGFyYW0gdF90eXBlIFR5cGUgdG8gY29udmVydCB0byBUeXBlU2NyaXB0CisgKiBAcmV0dXJuIFN0cmluZyBUeXBlU2NyaXB0IHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RkOjpzdHJpbmcgdHNfdHlwZTsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgdHNfdHlwZSA9ICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgdHNfdHlwZSA9ICJib29sZWFuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHRzX3R5cGUgPSAibnVtYmVyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRzX3R5cGUgPSAidm9pZCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOworICAgIGlmICh0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICB0eXBlX25hbWUgPSBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgfQorICAgIHR5cGVfbmFtZS5hcHBlbmQodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgdHNfdHlwZSA9IHR5cGVfbmFtZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworCisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIHRzX3R5cGUgPSB0c19nZXRfdHlwZShldHlwZSkgKyAiW10iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGt0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworCisKKyAgICBpZiAoa3R5cGUgPT0gIm51bWJlciIgfHwga3R5cGUgPT0gInN0cmluZyIgKSB7CisgICAgICB0c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICB9IGVsc2UgaWYgKCgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIE5vdCB5ZXQgc3VwcG9ydGVkIChlbnVtIG1hcCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9wdWxsLzI2NTIKKyAgICAgIC8vdHNfdHlwZSA9ICJ7IFtrOiAiICsga3R5cGUgKyAiXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgICB0c190eXBlID0gInsgW2s6IG51bWJlciAvKiIgKyBrdHlwZSArICIqL106ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSB7CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRzX3R5cGU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFR5cGVTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lKGFyZ3M6IHR5cGVzKTogdHlwZTsnCisgKgorICogQHBhcmFtIHRfZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHBhcmFtIGJvb2wgaW4tL2V4Y2x1ZGUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50CisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2ssIGJvb2wgb3B0aW9uYWxfY2FsbGJhY2spIHsKKyAgc3RyaW5nIHN0cjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArIHRzX2dldF9yZXEoKmZfaXRlcikgKyAiOiAiICsgdHNfZ2V0X3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmX2l0ZXIgKyAxICE9IGZpZWxkcy5lbmQoKSB8fCAoaW5jbHVkZV9jYWxsYmFjayAmJiBmaWVsZHMuc2l6ZSgpID4gMCkpIHsKKyAgICAgIHN0ciArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7CisgICAgc3RyaW5nIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyA9IG9wdGlvbmFsX2NhbGxiYWNrID8gIj8iIDogIiI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHN0cmluZyBleGNlcHRpb25fdHlwZXM7CisgICAgICBpZiAoZXhjZXB0aW9ucykgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgICAgIGlmIChpdCA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyA9IHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyArPSAiIHwgIiArIHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZXhjZXB0aW9uX3R5cGVzID09ICIiKSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiB2b2lkLCByZXNwb25zZTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChlcnJvcjogIiArIGV4Y2VwdGlvbl90eXBlcyArICIsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZGF0YTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgfQorCisgICAgaWYgKGdlbl9qcXVlcnlfKSB7CisgICAgICBzdHIgKz0gIkpRdWVyeVByb21pc2U8IiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyI+OyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAidm9pZDsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIHN0ciArPSAiKTogUHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+OyI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVjZXMgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgTm9kZUpTIGlkZW50aWZpZXIKKyAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIG5hbWUgd2l0aCB0aGUgdXBkYXRlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IG5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykgJiYgKCckJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YXNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAganF1ZXJ5OiAgICAgICAgICBHZW5lcmF0ZSBqUXVlcnkgY29tcGF0aWJsZSBjb2RlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdHM6ICAgICAgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgd2l0aF9uczogICAgICAgICBDcmVhdGUgZ2xvYmFsIG5hbWVzcGFjZSBvYmplY3RzIHdoZW4gdXNpbmcgbm9kZS5qc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVzNjogICAgICAgICAgICAgQ3JlYXRlIEVTNiBjb2RlIHdpdGggUHJvbWlzZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUzNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsKK3N0YXRpYyBjb25zdCBzdHJpbmcgcXVvdCA9ICJcIiI7CitzdGF0aWMgY29uc3QgYm9vbCBOT19JTkRFTlQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBib29sIEZPUkNFX1NUUklORyA9IHRydWU7CisKK2NsYXNzIHRfanNvbl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzb25fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGpzb246IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOworICB9CisKKyAgdmlydHVhbCB+dF9qc29uX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9qc29uXzsKKyAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfanNvbl8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgc3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWUpOworICB2b2lkIHN0YXJ0X2FycmF5KCk7CisgIHZvaWQgZW5kX29iamVjdCgpOworICB2b2lkIGVuZF9hcnJheSgpOworICB2b2lkIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICB2b2lkIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICBzdHJpbmcgZXNjYXBlX2pzb25fc3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOworICBzdHJpbmcganNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpOworICB2b2lkIG1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSopOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGZvcmNlX3N0cmluZyA9IGZhbHNlKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpOworICB2b2lkIHdyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpOworfTsKKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9qc29uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmpzb24iOworICBmX2pzb25fLm9wZW4oZl9qc29uX25hbWUuY19zdHIoKSk7CisKKyAgLy8gTWVyZ2UgYWxsIGluY2x1ZGVkIHByb2dyYW1zIGludG8gdGhpcyBvbmUgc28gd2UgY2FuIG91dHB1dCBvbmUgYmlnIGZpbGUuCisgIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgbWVyZ2VfaW5jbHVkZXMocHJvZ3JhbV8pOworICB9Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnXFwnOgorICAgICAgc3MgPDwgIlxcXFwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiXFxcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgIHNzIDw8ICJcXC8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXGInOgorICAgICAgc3MgPDwgIlxcYiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcZic6CisgICAgICBzcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xuJzoKKyAgICAgIHNzIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHInOgorICAgICAgc3MgPDwgIlxcciI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgICBzcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCkgeworICBmX2pzb25fIDw8IChzaG91bGRfaW5kZW50ID8gaW5kZW50KCkgOiAiIikgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X2FycmF5KCkgeworICBmX2pzb25fIDw8ICJbIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKGZhbHNlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb21tYV9pZl9uZWVkZWQoKSB7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCAiLCIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluZGljYXRlX2NvbW1hX25lZWRlZCgpIHsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKHRydWUpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmQoc3RyaW5nIGtleSkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIjsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwgbnVtYmVyX3RvX3N0cmluZyh2YWwpOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX3N0cmluZyhzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8IGpzb25fc3RyKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCAodmFsID8gInRydWUiIDogImZhbHNlIik7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9vYmplY3QoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGZfanNvbl8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX2FycmF5KCkgeworICBpbmRlbnRfZG93bigpOworICBpZiAoY29tbWFfbmVlZGVkXy50b3AoKSkgeworICAgIGZfanNvbl8gPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9qc29uXykgPDwgIl0iOworICBjb21tYV9uZWVkZWRfLnBvcCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICB3cml0ZV9rZXlfYW5kKCJ0eXBlSWQiKTsKKyAgICB3cml0ZV90eXBlX3NwZWModHR5cGUpOworICAgIGVuZF9vYmplY3QoKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHdyaXRlX2tleV9hbmQobmFtZSk7CisgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIHdyaXRlX3N0cmluZyhnZXRfdHlwZV9uYW1lKHR0eXBlKSk7CisKKyAgaWYgKHR0eXBlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJjbGFzcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZSkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJrZXlUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGt0eXBlKSk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInZhbHVlVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh2dHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImtleVR5cGUiLCBrdHlwZSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidmFsdWVUeXBlIiwgdnR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9qc29uXyA8PCBlbmRsOworICBmX2pzb25fLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6bWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGluY19pdGVyOworICBmb3IgKGluY19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIGluY2x1ZGUgPSAqaW5jX2l0ZXI7CisgICAgLy8gcmVjdXJzZSBpbiBjYXNlIHdlIGdldCBjcmF6eQorICAgIG1lcmdlX2luY2x1ZGVzKGluY2x1ZGUpOworICAgIC8vIG1lcmdlIGVudW1zCisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gaW5jbHVkZS0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX2VudW0oKmVuX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSB0eXBlZGVmcworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IGluY2x1ZGUtPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2Ugc3RydWN0cworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBpbmNsdWRlLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2UgY29uc3RhbnRzCisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBpbmNsdWRlLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfY29uc3QoKmNfaXRlcik7CisgICAgfQorCisgICAgLy8gbWVyZ2Ugc2VydmljZXMKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBpbmNsdWRlLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc2VydmljZSgqc3ZfaXRlcik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHByb2dyYW1fLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHByb2dyYW1fLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgcHJvZ3JhbV8tPmdldF9kb2MoKSk7CisgIH0KKworICAvLyBXaGVuIG1lcmdpbmcgaW5jbHVkZXMsIHRoZSAibmFtZXNwYWNlcyIgYW5kICJpbmNsdWRlcyIgc2VjdGlvbnMKKyAgLy8gYmVjb21lIGFtYmlndW91cywgc28ganVzdCBza2lwIHRoZW0uCisgIGlmICghc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIC8vIEdlbmVyYXRlIG5hbWVzcGFjZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJuYW1lc3BhY2VzIik7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlcygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICAgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKG5zX2l0LT5maXJzdCwgbnNfaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworCisgICAgLy8gR2VuZXJhdGUgaW5jbHVkZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJpbmNsdWRlcyIpOworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICAgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICB3cml0ZV9zdHJpbmcoKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHdyaXRlX2tleV9hbmQoImVudW1zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB3cml0ZV9rZXlfYW5kKCJ0eXBlZGVmcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB3cml0ZV9rZXlfYW5kKCJzdHJ1Y3RzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIGNvbnN0YW50cworICB3cml0ZV9rZXlfYW5kKCJjb25zdGFudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgd3JpdGVfa2V5X2FuZCgic2VydmljZXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdGFydF9vYmplY3QoKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHR5cGVkZWYpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUodHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgdHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSk7CisgIGlmICh0dHlwZWRlZi0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHR0eXBlZGVmLT5nZXRfZG9jKCkpOworICB9CisgIGlmICh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgZl9qc29uXyA8PCBxdW90IDw8IGVzY2FwZV9qc29uX3N0cmluZyh2YWx1ZSkgPDwgcXVvdDsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2ludGVnZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBpZiAoc2hvdWxkX2ZvcmNlX3N0cmluZykgeworICAgICAgd3JpdGVfc3RyaW5nKG51bWJlcl90b19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX3N0cmluZyh2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBzdGFydF9hcnJheSgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXQ7CisgICAgZm9yIChsaXQgPSBsaXN0LmJlZ2luKCk7IGxpdCAhPSBsaXN0LmVuZCgpOyArK2xpdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX2FycmF5KCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgICAgZl9qc29uXyA8PCBpbmRlbnQoKTsKKyAgICAgIC8vIEpTT04gb2JqZWN0cyBvbmx5IGFsbG93IHN0cmluZyBrZXlzCisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0LCBGT1JDRV9TVFJJTkcpOworICAgICAgZl9qc29uXyA8PCAiOiAiOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgZl9qc29uXyA8PCAibnVsbCI7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6Ompzb25fc3RyKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHJldHVybiBxdW90ICsgZXNjYXBlX2pzb25fc3RyaW5nKHN0cikgKyBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGNvbi0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgY29uLT5nZXRfdHlwZSgpKTsKKworICBpZiAoY29uLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgY29uLT5nZXRfZG9jKCkpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgidmFsdWUiKTsKKyAgd3JpdGVfY29uc3RfdmFsdWUoY29uLT5nZXRfdmFsdWUoKSk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpZiAodGVudW0tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZW51bS0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZW51bS0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgICBzdGFydF9vYmplY3QoKTsKKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZW51bS0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRlbnVtLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoIm1lbWJlcnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKnZhbF9pdGVyKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIGlmICh2YWwtPmhhc19kb2MoKSkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHZhbC0+Z2V0X2RvYygpKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBpZiAodHN0cnVjdC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzdHJ1Y3QtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzRXhjZXB0aW9uIiwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9ib29sKCJpc1VuaW9uIiwgdHN0cnVjdC0+aXNfdW5pb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZmllbGRzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImV4dGVuZHMiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzZXJ2aWNlLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgiZnVuY3Rpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInJldHVyblR5cGVJZCIsIGdldF90eXBlX25hbWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpKTsKKyAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgicmV0dXJuVHlwZSIsIHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woIm9uZXdheSIsIHRmdW5jLT5pc19vbmV3YXkoKSk7CisKKyAgaWYgKHRmdW5jLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGZ1bmMtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodGZ1bmMtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdGZ1bmMtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJhcmd1bWVudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZXhjZXB0aW9ucyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfaW50ZWdlcigia2V5IiwgZmllbGQtPmdldF9rZXkoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGZpZWxkLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKGZpZWxkLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpZWxkLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gZmllbGQtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgicmVxdWlyZWQiKTsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcXVpcmVkIik7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcV9vdXQiKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB3cml0ZV9zdHJpbmcoIm9wdGlvbmFsIik7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiZGVmYXVsdCIpOworICAgIHdyaXRlX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJtYXAiOworICB9CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpMzIiOworICB9CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gKCh0X3N0cnVjdCopdHR5cGUpLT5pc191bmlvbigpID8gInVuaW9uIiA6ICJzdHJ1Y3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiZXhjZXB0aW9uIjsKKyAgfQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNldHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgcmV0dXJuIHRiYXNldHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisKKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6Z2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18gfHwgdHR5cGUtPmdldF9wcm9ncmFtKCkgPT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6bWFwOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogTFVBIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9sdWFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfbHVhX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fcmVxdWlyZXNfID0gdHJ1ZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvbWl0X3JlcXVpcmVzIikgPT0gMCkgeworICAgICAgICBnZW5fcmVxdWlyZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbHVhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1sdWEiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIGx1YSByZXF1aXJlIHN0YXRlbWVudHMuCisgICAqLworICBib29sIGdlbl9yZXF1aXJlc187CisKKyAgLyoqCisgICAqIFN0cnVjdC1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBEZXNlcmlhbGl6YXRpb24gKFJlYWQpCisgICAqLworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIChXcml0ZSkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisgIHN0ZDo6c3RyaW5nIGx1YV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi0tXG4iKSArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArICItLVxuIgorICAgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIi0tIEAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkXG4iCisgICAgICAgICAgICsgIi0tXG4iOworICB9CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKK307CisKKy8qKgorICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBjdXJfbmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJjb25zdGFudHMubHVhIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAidHR5cGVzLmx1YSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworCisgIC8vIEFkZCBoZWFkZXJzCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl90eXBlc18gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbmFtZXNwYWNlIDw8ICJjb25zdGFudHMnIjsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdHlwZWRlZiAoZXNzZW50aWFsbHkgYSBjb25zdGFudCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUgKHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7KSB7CisgICAgaW50MzJfdCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZTsKKyAgICArK2NfaXRlcjsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8ICJ9IjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IChub24tbG9jYWwpIHZhbHVlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGwgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAibHVhbG9uZ251bWJlci5uZXcoJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJykiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAifSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgIDw8ICJdID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICsrdl9pdGVyOworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiXSI7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSB0cnVlIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gZmFsc2UiOworICAgICAgfQorICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzdHJ1Y3QKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBleGNlcHRpb24KKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdCBvciBleGNlcHRpb24gKGx1YSB0YWJsZSkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPSBURXhjZXB0aW9uOm5ld3siIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgX190eXBlID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJyI7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIgPSBfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGluZGVudChvdXQpOworICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgKyttX2l0ZXI7CisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpOworICBvdXQgPDwgZW5kbCA8PCAifSI7CisKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOnJlYWQoaXByb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gd2hpbGU6IFJlYWQgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZjogQ2hlY2sgd2hhdCB0byByZWFkCisgIGluZGVudChvdXQpIDw8ICJsb2NhbCBmbmFtZSwgZnR5cGUsIGZpZCA9IGlwcm90OnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbHNlaWYgZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFJlYWQgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAic2VsZi4iKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCBpZgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgd2hpbGUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gd3JpdGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU3RydWN0QmVnaW4oJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gVG8gY2hlY2sgZWxlbWVudCBvZiBzZWxmIHdoZXRoZXIgbmlsIG9yIG5vdC4KKyAgICAvLyBhdm9pZCB0aGUgdmFsdWUoZmFsc2UpIG9mIEJPT0wgaXMgbG9zdC4KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIH49IG5pbCB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2V0IG91dHB1dCBkaXJlY3RvcnkKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZworICBzdHJpbmcgY3VyX25zID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG91dGRpciArIGN1cl9ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi5sdWEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgLy8gSGVhZGVycworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbnMgPDwgInR0eXBlcyciIDw8IGVuZGw7CisKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCBnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSB0aGUgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBJbnRlcmZhY2Ugb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gIjsKKyAgaWYgKGV4dGVuZHNfcykgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIklmYWNlOm5ld3siIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gQ2xpZW50IG9iamVjdCBkZWZpbml0aW9uCisgIG91dCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVENsaWVudCI7CisgIH0KKyAgb3V0IDw8ICIsIHsiIDw8IGVuZGwgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBTZW5kL1JlY3YgZnVuY3Rpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBzaWcgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gV3JhcHBlciBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6IiA8PCBzaWcgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJzZWxmOnNlbmRfIiA8PCBzaWcgPDwgZW5kbCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2VsZjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6c2VuZF8iIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZnVuY25hbWUgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICAgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBmdW5jbmFtZSA8PCAiX2FyZ3M6bmV3e30iIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgdGhlIGFyZ3MKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGFyZ25hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJhcmdzLiIgPDwgYXJnbmFtZSA8PCAiID0gIiA8PCBhcmduYW1lIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImFyZ3M6d3JpdGUoc2VsZi5vcHJvdCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIC8vIFJlY3YgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cmVjdl8iIDw8IHNpZyA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgZm5hbWUsIG10eXBlLCByc2VxaWQgPSBzZWxmLmlwcm90OiIKKyAgICAgICAgICA8PCAicmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBsb2NhbCB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgeDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAibG9jYWwgcmVzdWx0ID0gIiA8PCBmdW5jbmFtZSA8PCAiX3Jlc3VsdDpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJyZXN1bHQ6cmVhZChzZWxmLmlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpZiBpdCdzIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyB+PSBuaWwgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiCisgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICAgIC8vIFRocm93IGN1c3RvbSBleGNlcHRpb25zCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB0aGVuIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZXJyb3IoVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSAiCisgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxUfSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Iob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIERlZmluZSBwcm9jZXNzb3IgdGFibGUKKyAgb3V0IDw8IGVuZGwgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVFByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbCA8PCAifSkiIDw8IGVuZGw7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3MoaXByb3QsIG9wcm90LCBzZXJ2ZXJfY3R4KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIG5hbWUsIG10eXBlLCBzZXFpZCA9IGlwcm90OnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZ1bmNfbmFtZSA9ICdwcm9jZXNzXycgLi4gbmFtZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIG5vdCBzZWxmW2Z1bmNfbmFtZV0gb3IgdHR5cGUoc2VsZltmdW5jX25hbWVdKSB+PSAnZnVuY3Rpb24nIHRoZW4iOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90OnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3eyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3JDb2RlID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9EIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgc2VsZltmdW5jX25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgc3RyaW5nIGZuX25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzXyIgPDwgZm5fbmFtZQorICAgICAgICAgICAgICA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIHRoZSByZXF1ZXN0CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImxvY2FsIHJlcGx5X3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3M6cmVhZChpcHJvdCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUKKyAgICAgIDw8ICI6bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHN0YXR1cywgcmVzID0gcGNhbGwoc2VsZi5oYW5kbGVyLiIgPDwgZm5fbmFtZQorICAgICAgPDwgIiwgc2VsZi5oYW5kbGVyIjsKKworICAvLyBQcmludCBhcmd1bWVudHMKKyAgdF9zdHJ1Y3QqIGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGlmIChhcmdzLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgIiwgIiA8PCBhcmd1bWVudF9saXN0KGFyZ3MsICJhcmdzLiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9ycworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBzdGF0dXMgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9IHJlc30iIDw8IGVuZGw7CisKKyAgLy8gSGFuZGxlIGN1c3RvbSBleGNlcHRpb25zCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKHhmLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Zi5iZWdpbigpOyB4X2l0ZXIgIT0geGYuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiB0dHlwZShyZXMpID09ICciIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiJyB0aGVuIgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXMiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSByZXN1bHQgYW5kIHdyaXRlIHRoZSByZXBseQorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LnN1Y2Nlc3MgPSByZXMiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZuX25hbWUgPDwgIicsIHJlcGx5X3R5cGUsICIKKyAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvLyBTZXJ2aWNlIGhlbHBlcnMKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBlbmRsIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCAmcmVzdWx0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZSAoUmVhZCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IG5hbWUgPDwgIiA9IGlwcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6bmV3e30iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZE1hcEJlZ2luKCkgIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgIH0KKworICAvLyBEZXNlcmlhbGl6ZQorICBpbmRlbnQob3V0KSA8PCAiZm9yIF9pPTEsIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEEgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhhYmxlIGJ5IGFueSBsdWEgdHlwZQorICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBzZXQgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IHRoZSB2YWx1ZQorICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSAiIDw8IGVsZW0gPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBsaXN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhlZCBieSBpbnRlZ2VyIHZhbHVlcworICAvLyBMVUEgbmF0aXZlbHkgcHJvdmlkZXMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsaXN0CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCAidGFibGUuaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgKFdyaXRlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIjp3cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICAvLyBCZWdpbiB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInR0YWJsZV9zaXplKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIiMiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiLF8gaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgXywiIDw8IGl0ZXIgPDwgIiBpbiBpcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBGaW5pc2ggd3JpdGluZworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6Omx1YV9pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICByZXR1cm4gIlxuXG5yZXF1aXJlICdUaHJpZnQnIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6Z2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJsdWEiKTsKKyAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfIjsKKyAgfQorICByZXR1cm4gcmVhbF9tb2R1bGUgKyAiXyI7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICBzdGQ6OnN0cmluZyByZXQgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7CisgIHJldHVybiByZXQ7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0ZDo6c3RyaW5nIHJldCA9ICIiOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICByZXQgKz0gcHJlZml4ICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgKytmbGRfaXRlcjsKKyAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGx1YSwKKyAgICAiTHVhIiwKKyAgICAiICAgIG9taXRfcmVxdWlyZXM6ICAgU3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiByZXF1aXJlICdzb21lZmlsZScuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlN2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vVE9ETzogY2hlY2sgZm9yIGluZGVudGF0aW9uCisvL1RPRE86IERvIHdlIG5lZWQgc2VxSWRfIGluIGdlbmVyYXRpb24/CisKK3RfbmV0Y29yZV9nZW5lcmF0b3I6OnRfbmV0Y29yZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCit7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBmb3IgKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBudWxsYWJsZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzaGNvZGVfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbmV0Y29yZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1uZXRjb3JlIjsKK30KKworc3RhdGljIHN0cmluZyBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHN0cmluZyBjb25zdCYgZnVuY3Rpb25fbmFtZSkKK3sKKyAgICBzdHJpbmcgY29uc3QgYXN5bmNfZW5kID0gIkFzeW5jIjsKKyAgICBzaXplX3QgaSA9IGZ1bmN0aW9uX25hbWUuZmluZChhc3luY19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbl9uYW1lICsgYXN5bmNfZW5kOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbl9uYW1lOworfQorCisvKioKKyogXGJyaWVmIFNlYXJjaCBhbmQgcmVwbGFjZSAiX2FyZ3MiIHN1YnN0cmluZyBpbiBzdHJ1Y3QgbmFtZSBpZiBleGlzdCAoZm9yIEMjIGNsYXNzIG5hbWluZykKKyogXHBhcmFtIHN0cnVjdF9uYW1lCisqIFxyZXR1cm4gTW9kaWZpZWQgc3RydWN0IG5hbWUgKCJTdHJ1Y3RfYXJncyIgLT4gIlN0cnVjdEFyZ3MiKSBvciBvcmlnaW5hbCBuYW1lCisqLworc3RhdGljIHN0cmluZyBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKQoreworICAgIHN0cmluZyBhcmdzX2VuZCA9ICJfYXJncyI7CisgICAgc2l6ZV90IGkgPSBzdHJ1Y3RfbmFtZS5maW5kKGFyZ3NfZW5kKTsKKyAgICBpZiAoaSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGksIGFyZ3NfZW5kLmxlbmd0aCgpLCAiQXJncyIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHRfZW5kID0gIl9yZXN1bHQiOworICAgIHNpemVfdCBqID0gc3RydWN0X25hbWUuZmluZChyZXN1bHRfZW5kKTsKKyAgICBpZiAoaiAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGosIHJlc3VsdF9lbmQubGVuZ3RoKCksICJSZXN1bHQiKTsKKyAgICAgICAgcmV0dXJuIG5ld19zdHJ1Y3RfbmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RydWN0X25hbWU7Cit9CisKK3N0YXRpYyBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9CisKK3N0YXRpYyBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCitzdGF0aWMgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpCit7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfd2NmX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB3Y2ZfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX2hhc2hjb2RlX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBoYXNoY29kZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHNlcmlhbGl6ZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc191bmlvbl9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdW5pb25fOyB9CisKK21hcDxzdHJpbmcsIGludD4gdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdAoreworICAgIHJldHVybiBuZXRjb3JlX2tleXdvcmRzOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkKK3sKKyAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgICAgLy8gZm9yIHVzYWdlIG9mIGNzaGFycCBuYW1lc3BhY2VzIGluIHRocmlmdCBmaWxlcyAoZnJvbSBmaWxlcyBmb3IgY3NoYXJwKQorICAgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgaWYgKG5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICB9CisKKyAgICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKGRpci5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgICAgaW5pdF9rZXl3b3JkcygpOworCisgICAgd2hpbGUgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgICAgfQorCisgICAgcHZlcmJvc2UoIi5ORVQgQ29yZSBvcHRpb25zOlxuIik7CisgICAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIHN0cmluZyB0bXAobmFtZSk7CisgICAgdHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4odG9sb3dlcikpOworCisgICAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgICAgaWYgKG5ldGNvcmVfa2V5d29yZHMuZmluZCh0bXApICE9IG5ldGNvcmVfa2V5d29yZHMuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gIkAiICsgbmFtZTsKKyAgICB9CisKKyAgICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKQoreworICAgIG5ldGNvcmVfa2V5d29yZHMuY2xlYXIoKTsKKworICAgIC8vIEMjIGtleXdvcmRzCisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJib29sIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVudW0iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxvY2siXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibmV3Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRocm93Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRydWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhZGQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWxpYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFzeW5jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImF3YWl0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZHluYW1pYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmcm9tIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnbG9iYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ3JvdXAiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJqb2luIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcnRpYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVtb3ZlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFsdWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoZXJlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInlpZWxkIl0gPSAxOworCisJbmV0Y29yZV9rZXl3b3Jkc1sid2hlbiJdID0gMTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iOworCisgICAgaWYgKHdjZl8pCisgICAgeworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIjsKKyAgICAgICAgbmFtZXNwYWNlcyArPSAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7XG4iOworCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpCit7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKQoreworICAgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkKK3sKKwlpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworCWdlbmVyYXRlX2VudW0oZl9lbnVtLCB0ZW51bSk7CisKKyAgICBmX2VudW0uY2xvc2UoKTsKKwlpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9lbnVtIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pCit7CisJb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKwlzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdGVudW0pOworCisJb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisJc2NvcGVfdXAob3V0KTsKKworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisJZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpCisJeworCQlnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworCQlpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCQlvdXQgPDwgaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworCX0KKworCXNjb3BlX2Rvd24ob3V0KTsKKwllbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgaWYgKGNvbnN0cy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgICAgZ2VuZXJhdGVfY29uc3RzKGZfY29uc3RzLCBjb25zdHMpOworCisgICAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqY19pdGVyKTsKKyAgICAgICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3V0LCBjb25zdHMpOworICAgIH0KKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpKTsKKworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworCisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSBzdGF0aWNfY2FzdDx0X21hcCo+KHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3R5cGUqIGV0eXBlOworICAgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKQoreworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkKKyAgICB7CisgICAgICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgICAgICBvdXQgPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICAodm9pZCluYW1lOworICAgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcmVuZGVyIDw8IHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKQoreworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgICBmX3N0cnVjdC5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QiKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkKK3sKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHN0cnVjdCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworCisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgc3RyaW5nIHNoYXJwX3N0cnVjdF9uYW1lID0gY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUobm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiIDogIjsKKworICAgIGlmIChpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7CisgICAgfQorCisgICAgb3V0IDw8ICJUQmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc19kZWZhdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IChudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcykgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOworICAgIGlmIChnZW5lcmF0ZV9pc3NldCkKKyAgICB7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCptX2l0ZXIpOworICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgqbV9pdGVyKSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdCA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHQpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigiOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikgOiB0aGlzKCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICAgIGlmIChpc19yZXN1bHQpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBpZiAoaGFzaGNvZGVfKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOworICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgYm9vbCBpc19maW5hbCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiRmF1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKCFfX2ZpcnN0KSB7IHNiLkFwcGVuZChcIiwgXCIpOyB9IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgICAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICAgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICAgIGZfdW5pb24uY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX25ldGNvcmVfdW5pb24uIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIHRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoZmFsc2UpIHt9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCBcIkNhbm5vdCBwZXJzaXN0IGFuIHVuaW9uIHR5cGUgd2hpY2ggaXMgbm90IHNldC5cIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3V0LCB0dW5pb24sICgqZl9pdGVyKSk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIF9kYXRhOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiYmICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iCisgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSAmJiAoKCFfX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHx8ICgiOworICAgICAgICB9CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiwgb3RoZXIuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSI7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKSkpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQgaGFzaGNvZGUgPSAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVuY2hlY2tlZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobnVsbGFibGVfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICAgICAgfQorICAgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIihUQ29sbGVjdGlvbnMuR2V0SGFzaENvZGUoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSkiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworICAgIGZfc2VydmljZS5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfc2VydmljZS4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklBc3luYyI7CisgICAgfQorCisgICAgLy9vdXQgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpmX2l0ZXIpOworCisgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW09wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltGYXVsdENvbnRyYWN0KHR5cGVvZigiICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gIlRCYXNlQ2xpZW50LCBJRGlzcG9zYWJsZSwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHNlcnZpY2UpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSUFzeW5jIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90b2NvbCkgOiB0aGlzKHByb3RvY29sLCBwcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sKSA6IGJhc2UoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpIgorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbnNfaXRlcmF0b3I7CisKKyAgICBmb3IgKGZ1bmN0aW9uc19pdGVyYXRvciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbnNfaXRlcmF0b3IgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uc19pdGVyYXRvcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYygoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkpOworCisgICAgICAgIC8vIGFzeW5jCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmdW5jdGlvbnNfaXRlcmF0b3IsICIiKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpIDw8ICIsIFNlcUlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICAgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLldyaXRlQXN5bmMoT3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+aXNfb25ld2F5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisgICAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IGF3YWl0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuUmVhZEFzeW5jKElucHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSVRBc3luY1Byb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBfaUFzeW5jOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlBc3luYykiOworCisgICAgaWYgKCFleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIiA6IGJhc2UoaUFzeW5jKSI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpQXN5bmMgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaUFzeW5jKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIl9pQXN5bmMgPSBpQXN5bmM7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyhmdW5jdGlvbl9uYW1lKSA8PCAiXCJdID0gIiA8PCBmdW5jdGlvbl9uYW1lIDw8ICJfUHJvY2Vzc0FzeW5jOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIG91dCBmbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBUVHlwZS5TdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIChUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArIG1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgICh2b2lkKXRzZXJ2aWNlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIl9Qcm9jZXNzQXN5bmMoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworICAgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgYXJncy5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgfQorCisgICAgb3V0IDw8ICJhd2FpdCBfaUFzeW5jLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiQXN5bmMoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICAgICAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLlZhbHVlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKworICAgIGlmICghZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiCisgICAgICAgICAgICAgICAgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsgIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgcmVzdWx0LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazwiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiPiBSZWFkQXN5bmMoVFByb3RvY29sIGlwcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImF3YWl0IGlwcm90LiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gYXdhaXQgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG9iajsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcihpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQ7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19lbGVtZW50LCBib29sIGlzX3Byb3BlcnR5bGVzcykKK3sKKyAgICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsIHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSksIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC4iOworCisgICAgICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiIDogbmFtZTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5QXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZ0FzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTZBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwgcHJlZml4LmNfc3RyKCksIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICAodm9pZCl0c3RydWN0OworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWFwQmVnaW5Bc3luYyhuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVNldEJlZ2luQXN5bmMobmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RCZWdpbkFzeW5jKG5ldyBUTGlzdCgiCisgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cykiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIGl0ZXIsIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBpdGVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApCit7CisgICAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpCit7CisgICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0LCBzdHJpbmcgZmllbGRQcmVmaXgpCit7CisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgICB9CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgICAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCBpc19yZXF1aXJlZCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlX251bGxhYmxlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgaWYgKHVzZV9udWxsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKQoreworICAgIHN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgICBpZiAoc3RyLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICAgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgICAgY2hhciBjID0gc3RyLmF0KDApOworICAgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpCisgICAgeworICAgICAgICBzdHIgPSAiXyIgKyBzdHI7CisgICAgfQorCisgICAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBjID0gc3RyLmF0KGkpOworICAgICAgICBpZiAoKCdBJyA+IGMgfHwgYyA+ICdaJykgJiYgKCdhJyA+IGMgfHwgYyA+ICd6JykgJiYgKCcwJyA+IGMgfHwgYyA+ICc5JykgJiYgJ18nICE9IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSkKK3sKKyAgICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIG5vIHNjb3BlIGFjdGl2ZSI7CisgICAgfQorCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgaWYgKGFjdGl2ZS5zY29wZV9tZW1iZXIgIT0gc2NvcGUpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIGNhbGxlZCBmb3Igd3Jvbmcgc3RydWN0IjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgaWYgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmVuZCgpICE9IGl0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLCBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpCit7CisgICAgLy8gYmVnaW4gbmV3IHNjb3BlCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhtZW1iZXJfbWFwcGluZ19zY29wZSgpKTsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6CisgICAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgICAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgICBzdGQ6OnNldDxzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgICAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIGtub3duIG1ldGhvZHMgKFRIUklGVC0yOTQyKQorICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICAgIGZvciAoaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgb2xkbmFtZSA9ICgqaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5ldyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyCisgICAgICAgICAgICBpZiAodXNlZF9tZW1iZXJfbmFtZXMuZmluZChuZXduYW1lKSAhPSB1c2VkX21lbWJlcl9uYW1lcy5lbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgJXMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXJcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG9sZG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgICAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKQoreworICAgIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaWYgKHN1cHByZXNzX21hcHBpbmcpCisgICAgeworICAgICAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5faW5pdDsKKworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICB0X21hcCogdG1hcCA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgICAgICBpZiAoIW5zLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBucyArICIuIiArIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5fY29udGFpbmVyOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgICAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkKKyAgICB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGlmIChpbml0KQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHN0cmluZyB0YXNrID0gIlRhc2siOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0ID0gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIjsKKyAgICBzdHJpbmcgYXJncyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgICByZXN1bHQgKz0gYXJnczsKKyAgICBpZiAoIWFyZ3MuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gIkNhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkKK3sKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgICB9CisKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykKK3sKKyAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+IiArIGVuZGwsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PiIgKyBlbmRsKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKQoreworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgZW5kbCArICI8c2VlYWxzbyBjcmVmPVwiIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgc3RhdGljX2Nhc3Q8dF9kb2MqPihmaWVsZCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKQoreworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKQorICAgIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIHBzOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICAgICAgcHMgPDwgZW5kbCA8PCAiPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICAgICAgICBpZiAocC0+aGFzX2RvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgICAgICAgICAgc3RyLmVyYXNlKHJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwgc3RyLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBwcyA8PCBzdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgICAgICB9CisKKyAgICAgICAgZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+IiArIGVuZGwgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LCBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKQoreworICAgIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGNvbW1lbnRfc3RhcnQ7CisgICAgfQorCisgICAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKQorICAgIHsKKyAgICAgICAgY2hhciBsaW5lWzEwMjRdOworICAgICAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICAgICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KKyAgICAgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKQorICAgICAgICB7IC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29tbWVudF9lbmQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9lbmQ7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpCit7CisgICAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICB7CisgICAgICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIikgKyAiLiI7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBuZXRjb3JlLAorICAgICJDIyIsCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgorICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCisgICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiB0eXBlcy5cbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZjOTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTM3IEBACisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfbmV0Y29yZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCit7CisKKyAgICBzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSgpIDogc2NvcGVfbWVtYmVyKDApIHsgfQorICAgICAgICB2b2lkKiBzY29wZV9tZW1iZXI7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwcGluZ190YWJsZTsKKyAgICB9OworCitwdWJsaWM6CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpOworCisgICAgYm9vbCBpc193Y2ZfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfc2VyaWFsaXplX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdDsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdldF9rZXl3b3Jkc19saXN0KCkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZXMKKyAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLCBzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgICAgYm9vbCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwgPSBmYWxzZSwgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICAgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLCBib29sIGluX2NsYXNzID0gZmFsc2UsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworICAgIHZvaWQgZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpOworICAgIHZvaWQgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KTsKKyAgICB2b2lkIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworCisgICAgc3RyaW5nIG5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdDsKKyAgICBzdHJpbmcgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3Q7CisKKyAgICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICAgIHN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgICAgc3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgICBzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKworICAgIGJvb2wgbnVsbGFibGVfOworICAgIGJvb2wgdW5pb25fOworICAgIGJvb2wgaGFzaGNvZGVfOworICAgIGJvb2wgc2VyaWFsaXplXzsKKyAgICBib29sIHdjZl87CisKKyAgICBzdHJpbmcgd2NmX25hbWVzcGFjZV87CisgICAgbWFwPHN0cmluZywgaW50PiBuZXRjb3JlX2tleXdvcmRzOworICAgIHZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgICAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgICAgc3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKTsKKyAgICBzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgICAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICAgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzgxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjppb3M7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIE9DYW1sIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9vY2FtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9vY2FtbF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gb2NhbWw6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcik7CisgIGJvb2wgc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YodF90eXBlKiB0eXBlLCBzdHJpbmcgd2hhdCk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIG1lbWJlcik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kID0gZmFsc2UsIGJvb2wgb3B0aW9ucyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfaV87Cit9OworCisvKgorICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHR5cGVkZWZzIHRvIGFwcGVhciBsYXRlciwKKyAqIGFmdGVyIGFsbCB0aGUgdHlwZXMgaGF2ZSBiZWVuIGRlY2xhcmVkLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHN0X2l0ZXI7CisgIGZvciAoc3RfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc3RfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3N0X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoKnN0X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgeGNlcHRpb25zCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfeGNlcHRpb24oKnhfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMubWxpIjsKKyAgZl90eXBlc19pXy5vcGVuKGZfdHlwZXNfaV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0cy5tbCI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGwgPDwgIm9wZW4gIgorICAgICAgICAgICAgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIigqXG4iKSArICIgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiopXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2ltcG9ydHMoKSB7CisgIHJldHVybiAib3BlbiBUaHJpZnQiOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX2lfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGluZGVudChmX3R5cGVzXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IGVuZGwgPDwgInN0cnVjdCIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IHRvX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgdG9faSA6IHQgLT4gSW50MzIudCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgImwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgb2ZfaSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCBvZl9pIDogSW50MzIudCAtPiB0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCB2YWx1ZSA8PCAibCAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8ICJsZXQgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIC8vIE9DYW1sIHJlcXVpcmVzIGFsbCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50CisgIG91dC5zZXRmKGlvczo6c2hvd3BvaW50KTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKKyAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IGN0IDw8ICIjc2V0XyIgPDwgZm5hbWUgPDwgIiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGN0IDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCBrZXkgPDwgIiAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IHZhbCA8PCAiIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBPQ2FtbCBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJfbmV3IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KSB7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcoIiNjb3B5Iik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGNvcHlfb2ZfayA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksICJrIik7CisgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksICJ2Iik7CisKKyAgICBpZiAoY29weV9vZl9rID09ICJrIiAmJiBjb3B5X29mX3YgPT0gInYiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mX2sgKyBzdHJpbmcoIiAiKSArIGNvcHlfb2ZfdiArIHN0cmluZygiKSBvaDsgbmgpICIpCisgICAgICAgICAgICAgKyB3aGF0ICsgIikiOworICAgIH0KKyAgfQorICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAiayIpOworCisgICAgaWYgKGNvcHlfb2YgPT0gImsiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpICsgc3RyaW5nKCIpIG9oOyBuaCkgIikgKyB3aGF0CisgICAgICAgICAgICAgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKKyAgICBpZiAoY29weV9vZiAhPSAieCIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikgKyBjb3B5X29mICsgc3RyaW5nKCIpICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd2hhdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdoYXQ7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgc3RyaW5nIGdyYWJfZmllbGQgPSBzdHJpbmcoInNlbGYjZ3JhYl8iKSArIG1uYW1lOworICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKKyAgaWYgKGNvcHlfb2YgIT0gZ3JhYl9maWVsZCkgeworICAgIGluZGVudChvdXQpOworICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIjsKKyAgICB9CisgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJleGNlcHRpb24gIiA8PCBjYXBpdGFsaXplKHRuYW1lKSA8PCAiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQob3V0KSA8PCAidmFsIG11dGFibGUgXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKKyAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGFzc2VydCghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgIG91dCA8PCAiIG9wdGlvbiA9IE5vbmUiIDw8IGVuZGw7CisgIH0KKworICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gU29tZSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gbWF0Y2ggXyIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZS0+cmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0bmFtZSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSB8IFNvbWUgIgorICAgICAgICAgICAgICAgIDw8IHggPDwgIiAtPiAiIDw8IHggPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtIFNvbWUgIiA8PCB4CisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICJTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiTm9uZSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworfQorCisvKioKKyAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcworICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLy8gQmFzZSB0eXBlcyBhcmUgZ2VuZXJhbGx5IGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbC0+Z2V0X2RvdWJsZSgpID09IDAuMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIC8vIEVtcHR5IGxpc3RzIGFyZSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgorICAgIC8vIElzIGVtcHR5IGxpc3Q/CisgICAgaWYgKHZhbC0+Z2V0X2xpc3QoKS5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7CisgICAgICBpZiAoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCgqbV9pdGVyKSkKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB1bnNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgOiAnYSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSA6IFByb3RvY29sLnQgLT4gdW5pdCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInZhbCByZWFkXyIgPDwgdG5hbWUgPDwgIiA6IFByb3RvY29sLnQgLT4gIiA8PCB0bmFtZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOworICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKKyAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCByZWMgcmVhZF8iIDw8IHNuYW1lIDw8ICIgKGlwcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBzdHIgPDwgIiA9IG5ldyAiIDw8IHNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgdCA8PCAiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmFpc2UgQnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgaWQgPDwgIiB3aXRoICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJ8ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiAtPiAoIjsKKyAgICBvdXQgPDwgImlmICIgPDwgdCA8PCAiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBzdHIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIiA8PCB0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifCBfIC0+ICIKKyAgICAgIDw8ICJpcHJvdCNza2lwICIgPDwgdCA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAid2l0aCBCcmVhayAtPiAoKSk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyBmID0gdG1wKCJfZiIpOworCisgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgd3JpdGUgKG9wcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEJlZ2luIFwiIiA8PCBuYW1lIDw8ICJcIjsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0bWVtYmVyID0gKCpmX2l0ZXIpOworICAgIHN0cmluZyBtbmFtZSA9ICJfIiArIGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgX3Y7CisKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpICYmIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgX3YgPSAiX3YiOworICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8ICIgLT4gKCkgfCAiCisgICAgICAgICAgICAgICAgICAgIDw8IF92IDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3YgPSBtbmFtZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICI7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7CisgICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7CisKKyAgICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgICAgb3V0IDw8ICIgfCBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgICAgICA8PCAiIC0+ICgpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIiB8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IE5vbmUgLT4gcmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi4iIDw8IG1uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBfdiA9ICJfdiI7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkQmVnaW4oXCIiIDw8IHRtZW1iZXItPmdldF9uYW1lKCkgPDwgIlwiLCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0odG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IHRtZW1iZXItPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRtZW1iZXIsIF92KTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkRW5kIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlRmllbGRTdG9wOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1sIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9zZXJ2aWNlX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5tbGkiOworICBmX3NlcnZpY2VfaV8ub3BlbihmX3NlcnZpY2VfaV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIH0KKyAgKi8KKyAgZl9zZXJ2aWNlXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9pXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKiBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTICopIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgPSIgPDwgZW5kbCA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIGNsaWVudCAoaXByb3QgOiBQcm90b2NvbC50KSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IGlwcm90IG9wcm90IGFzIHN1cGVyIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBtdXRhYmxlIHNlcWlkID0gMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiICIgPDwgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgInNlbGYjcmVjdl8iIDw8IGZ1bm5hbWUgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJQcm90b2NvbC5PTkVXQVkiIDogIlByb3RvY29sLkNBTEwiKSA8PCAiLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3NldF8iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7CisgICAgICBzdHJpbmcgcmVzID0gIl8iOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzID0gInJlc3VsdCI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCByZXMgPDwgIiA9IHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIHJlc3VsdCNnZXRfc3VjY2VzcyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiAoIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG1hdGNoIHJlc3VsdCNnZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBfdikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAicmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIChBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5NSVNTSU5HX1JFU1VMVCBcIiIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIHByb2Nlc3NvciAoaGFuZGxlciA6IGlmYWNlKSA9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QgKHNlbGYpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIHByb2Nlc3NvciA6IGlmYWNlIC0+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJpbmhlcml0IFByb2Nlc3Nvci50IiA8PCBlbmRsIDw8IGVuZGw7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfaV8pCisgICAgICA8PCAidmFsIHByb2Nlc3NNYXAgOiAoc3RyaW5nLCBpbnQgKiBQcm90b2NvbC50ICogUHJvdG9jb2wudCAtPiB1bml0KSBIYXNodGJsLnQiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCBwcm9jZXNzIGlwcm90IG9wcm90ID0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgKG5hbWUsIHR5cCwgc2VxaWQpICA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIEhhc2h0YmwubWVtIHByb2Nlc3NNYXAgbmFtZSB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgKEhhc2h0YmwuZmluZCBwcm9jZXNzTWFwIG5hbWUpIChzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJlbHNlICgiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duICIKKyAgICAgICAgICAgICAgICAiZnVuY3Rpb24gXCJebmFtZSkgaW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFByb3RvY29sLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgeCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbml0aWFsaXplciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiSGFzaHRibC5hZGQgcHJvY2Vzc01hcCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIgc2VsZiNwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgYXJncyA9ICJhcmdzIjsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgeworICAgIGFyZ3MgPSAiXyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCBhcmdzIDw8ICIgPSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKGhhbmRsZXIjIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aXRoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ8ICIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIC0+ICIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3NldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCkiOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgUHJvdG9jb2wuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworCisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3NldF8iIDw8IG5hbWUgPDwgIiAiOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgdHlwZSk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIG91dCA8PCAiaXByb3QjIjsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgIG91dCA8PCAiKCIgPDwgZW5hbWUgPDwgIi5vZl9pIGlwcm90I3JlYWRJMzIpIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICclcydcbiIsIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0c3RydWN0LT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICB9CisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwga3R5cGUgPDwgIiwiIDw8IHZ0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpID0gaXByb3QjcmVhZE1hcEJlZ2luIGluIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9rID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfdiA9ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiIF9rIF92IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBjb24gPDwgIiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBjb24gPDwgIiA9IChBcnJheS50b19saXN0IChBcnJheS5pbml0ICIgPDwgc2l6ZSA8PCAiIChmdW4gXyAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgbmFtZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QjIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IGVuYW1lIDw8ICIudG9faSAiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgb3V0IDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwiOworICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBraXRlciA8PCAiIC0+IGZ1biAiIDw8IHZpdGVyIDw8ICIgLT4gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gZnVuIF8gLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTGlzdC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwRW5kIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTZXRFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVMaXN0RW5kIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUgYXJncycKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIgIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QsIGJvb2wgb3B0aW9ucykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAob3B0aW9ucykKKyAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkgeworICAgIHJlc3VsdCArPSAidW5pdCAtPiAiOworICB9CisgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUobmFtZSk7CisgIH0KKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBvY2FtbCB0eXBlCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ1bml0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkludDMyLnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJbnQ2NC50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpICsgIi50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHJldHVybiAiKCIgKyByZW5kZXJfb2NhbWxfdHlwZShrdHlwZSkgKyAiLCIgKyByZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkgKyAiKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIsYm9vbCkgSGFzaHRibC50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRhNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAorI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvKioKKyAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCisgKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCisgKgorICovCitjbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29vcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9CisKKyAgLyoqCisgICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKKyAgICovCisKKyAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQgKCopKGludCkpdG91cHBlcik7CisgICAgcmV0dXJuIG9yaWdpbmFsOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICAgIH0KKyAgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE2ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFBFUkwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BlcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGVybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXyhmYWxzZSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcGVybDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgICAgZXNjYXBlX1snQCddID0gIlxcQCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhzdGQ6Om9zdHJlYW0mIG9zLCBib29sJiBkb25lLCB0X3R5cGUgKnR5cGUsIGJvb2wgc2VsZmlzaCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiI7CisgIH0KKworICB2b2lkIHBlcmxfbmFtZXNwYWNlX2RpcnModF9wcm9ncmFtKiBwLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBkaXJzKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGRpcnMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgICAgICByZXN1bHQgKz0gIjo6IjsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIH0KKyAgICByZXR1cm4gb3V0ZGlyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVscGVyc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBib29sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgb3V0ZGlyICs9ICppdCArICIvIjsKKyAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyAiVHlwZXMucG0iOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyAiQ29uc3RhbnRzLnBtIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgIkNvbnN0YW50czsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IHBlcmxfaW5jbHVkZXMoKSA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmM7CisKKyAgaW5jICA9ICJ1c2UgNS4xMC4wO1xuIjsKKyAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKKyAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OkV4Y2VwdGlvbjtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OlR5cGU7XG5cbiI7CisKKyAgcmV0dXJuIGluYzsKK30KKworLyoqCisgKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAorICogaW4gUEVSTCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZl90eXBlc18gPDwgInVzZSBjb25zdGFudCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX2NvbnN0c18gPDwgInVzZSBjb25zdGFudCAiIDw8IG5hbWUgPDwgIiA9PiAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICIxIiA6ICIwIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IDEiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfdHlwZXNfLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXywgdHN0cnVjdCwgZmFsc2UpOworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCisgKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCisgKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjtcbiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgInVzZSBiYXNlIHF3KFRocmlmdDo6VEV4Y2VwdGlvbik7XG4iOworICB9CisKKyAgLy8gQ3JlYXRlIHNpbXBsZSBhY2Vzc29yIG1ldGhvZHMKKyAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpO1xuIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bWtfYWNjZXNzb3JzKCBxdyggIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoIXQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICIpICk7XG4iOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gbmV3KCkKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCAic3ViIG5ldyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkY2xhc3NuYW1lID0gc2hpZnQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJHZhbHMgICAgICA9IHNoaWZ0IHx8IHt9OyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAidW5kZWYiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAifSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFVOSVZFUlNBTDo6aXNhKCR2YWxzLCdIQVNIJykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICR2YWxzLT57IgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifVxuXG4iOworCisgIG91dCA8PCAic3ViIGdldE5hbWUgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsYXN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgIlNXSVRDSDogZm9yKCRmaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiL14iIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIkLyAmJiBkb3siOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxhc3Q7IH07IiA8PCBlbmRsOworICB9CisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKworICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHVzZSBjbGF1c2VzIGZvciBpbmNsdWRlZCBlbnRpdGllcworICoKKyAqIEBwYXJhbSAgb3MgICAgICAgVGhlIG91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSAgZG9uZSAgICAgQSBmbGFnIHJlZmVyZW5jZSB0byBkZWJvdW5jZSB0aGUgYWN0aW9uCisgKiBAcGFyYW0gIHR5cGUgICAgIFRoZSB0eXBlIGJlaW5nIHByb2Nlc3NlZAorICogQHBhcmFtICBzZWxmaXNoICBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IG5hbWVzcGFjZSB0eXBlcyBzaG91bGQgYmUgInVzZSJkIGFzIHdlbGwuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKSB7CisgIHRfcHJvZ3JhbSAqY3VycmVudCA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChjdXJyZW50ICYmICFkb25lKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGN1cnJJbmMgPSBjdXJyZW50LT5nZXRfaW5jbHVkZXMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIG51bUluYyA9IGN1cnJJbmMuc2l6ZSgpOworICAgIGlmIChzZWxmaXNoKSB7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoY3VycmVudCkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtSW5jOyArK2kpIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jUHJvZ3JhbSA9IGN1cnJJbmMuYXQoaSk7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoaW5jUHJvZ3JhbSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3MgPDwgZW5kbDsKKyAgICBkb25lID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIucG0iOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgYm9vbCBkb25lID0gZmFsc2U7CisgIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhmX3NlcnZpY2VfLCBkb25lLCB0c2VydmljZSwgdHJ1ZSk7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygnRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgorICAgICAgICAgICAgICAgICJUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAxOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV2YWwgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+e3N1Y2Nlc3N9ID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIkc2VsZi0+e2hhbmRsZXJ9LT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsgaWYoIFVOSVZFUlNBTDo6aXNhKCRALCciCisgICAgICAgICAgICAgICAgIDw8IHBlcmxfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInKSApeyAiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJEA7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPSB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIGNhdGNoLWFsbCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb25zIChUSFJJRlQtMzE5MSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJEApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPX4gcy9eXFxzK3xcXHMrJC8vZzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkZXJyID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldyhcIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiBcIiAuICRALCBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkZXJyLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTZXJpYWxpemUgdGhlIHJlcGx5CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJJZik7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8ICIgIGRpZSAnaW1wbGVtZW50IGludGVyZmFjZSc7XG59IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiUmVzdCk7IjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3Q7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbXBsKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICA9eyBpbXBsID0+ICRpbXBsIH07IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkcmVxdWVzdCkgPSBAXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0LT57JyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ30iOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIiA8PCByZXEgPDwgIikgPyAiIDw8IHJlcQorICAgICAgICAgICAgICAgICA8PCAiIDogdW5kZWY7IiA8PCBlbmRsOworICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzcGxpdCgvLC8sICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFxcQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAkc2VsZi0+e2ltcGx9LT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJDbGllbnQpOyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGwgPDwgInVzZSBiYXNlIHF3KCIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpOyIgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbDsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fSAgPSAkaW5wdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9ID0gZGVmaW5lZCAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e3NlcWlkfSAgPSAwOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIiRzZWxmLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkc2VsZi0+e291dHB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBteSAkeCA9IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgJHgtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICR4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGllIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgaWYgKCFwcmVmaXguZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChteSAkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwga2V5IDw8ICJ9ID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVzaChAeyQiIDw8IHByZWZpeCA8PCAifSwkIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9Iik7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSggbXkgKCQiIDw8IGtpdGVyIDw8ICIsJCIgPDwgdml0ZXIgPDwgIikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoIG15ICQiIDw8IGl0ZXIgPDwgIiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gW10iOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiLT5uZXcoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisKKyAgc3RyaW5nIHN0cjsKKworICBzdHIgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKKyAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOworCisgIC8vIE5lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6TElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE0NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjc4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2RlZmluZSBOU0dMT0JBTCAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQorI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwpCisjZGVmaW5lIE5TR0xPQkFMX0IgKE5TR0xPQkFMICsgIlxcIikKKyNkZWZpbmUgTlNHTE9CQUxfQUIgKCJcXCIgKyBOU0dMT0JBTCArICJcXCIpCisKKy8qKgorICogUEhQIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9waHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGhwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5hcnlfaW5saW5lXyA9IGZhbHNlOworICAgIHJlc3RfID0gZmFsc2U7CisgICAgcGhwc18gPSBmYWxzZTsKKyAgICBvb3BfID0gZmFsc2U7CisgICAgdmFsaWRhdGVfID0gZmFsc2U7CisgICAganNvbl9zZXJpYWxpemFibGVfID0gZmFsc2U7CisgICAgbnNnbG9iYWxfID0gIiI7IC8vIGJ5IGRlZmF1bHQgZ2xvYmFsIG5hbWVzcGFjZSBpcyBlbXB0eQorICAgIGNsYXNzbWFwXyA9IGZhbHNlOworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImlubGluZWQiKSA9PSAwKSB7CisgICAgICAgIGJpbmFyeV9pbmxpbmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgicmVzdCIpID09IDApIHsKKyAgICAgICAgcmVzdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJ2ZXIiKSA9PSAwKSB7CisgICAgICAgIHBocHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgib29wIikgPT0gMCkgeworICAgICAgICBvb3BfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgidmFsaWRhdGUiKSA9PSAwKSB7CisgICAgICAgIHZhbGlkYXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImpzb24iKSA9PSAwKSB7CisgICAgICAgIGpzb25fc2VyaWFsaXphYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5zZ2xvYmFsIikgPT0gMCkgeworICAgICAgICBuc2dsb2JhbF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImNsYXNzbWFwIikgPT0gMCkgeworICAgICAgICBjbGFzc21hcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJwc3I0IikgPT0gMCkgeworICAgICAgICBpZihjbGFzc21hcF8peworICAgICAgICAgIHRocm93ICJwc3I0IGFuZCBjbGFzc21hcCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHdhcm5pbmcoMCwgInBzcjQgaXMgZGVmYXVsdCBvcHRpb24hIG5lZWRuJ3QgYWRkIHBzcjQgb3B0aW9uIVxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwaHA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChvb3BfICYmIGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICB0aHJvdyAib29wIGFuZCBpbmxpbmVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gKGJpbmFyeV9pbmxpbmVfID8gImdlbi1waHBpIiA6ICJnZW4tcGhwIik7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0cyEKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBib29sIG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBpbnQgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBocF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKKworICBib29sIHBocF9pc19zY2FsYXIodF90eXBlICp0dHlwZSkgeworICAgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZih0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZih0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2VfYmFzZShjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOworICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlciA9ICJcXCI7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCgnLicpOworICAgIHdoaWxlIChwb3NpdGlvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIG5zLnJlcGxhY2UocG9zaXRpb24sIDEsIGRlbGltaXRlcik7CisgICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nLCBwb3NpdGlvbiArIDEpOworICAgIH0KKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvLyBnZW5lcmFsIHVzZSBuYW1lc3BhY2UgcHJlZml4aW5nOiBcbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKyAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9BQiA6IE5TR0xPQkFMX0IpICsgKG5zLnNpemUoKSA/IChucyArICJcXCIpIDogIiIpOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgYSBmaWxlOgorICAvLyBnbG9iYWxcbnNcc3ViXG5zIG9yIGdsb2JhbFxucyBvciBzdWJcbnMKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKworICAgIHJldHVybiBOU0dMT0JBTAorICAgICAgKyAobnMuc2l6ZSgpICYmIE5TR0xPQkFMLnNpemUoKSA/ICJcXCIgOiAiIikKKyAgICAgICsgbnM7CisgIH0KKworICAvLyBhZGQgYSBkaXJlY3RvcnkgdG8gYWxyZWFkeSBleGlzdGluZyBuYW1lc3BhY2UKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnksIGJvb2wgZW5kID0gdHJ1ZSkgeworICAgICh2b2lkKWRpcmVjdG9yeTsKKyAgICBpZiAoZW5kKSB7CisgICAgICByZXR1cm4gIjsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyBkZWNsYXJpbmcgYSB0eXBlOiB0eXBlbmFtZSBvciBteV9uYW1lc3BhY2VfdHlwZW5hbWUKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odF90eXBlKiB0KSB7IHJldHVybiB0LT5nZXRfbmFtZSgpOyB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX3BhdGgodF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAucGF0aCIpOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGphdmEtc3R5bGUgbmFtZXNwYWNlIGludG8gYSBwYXRoLgorICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gbnMuYmVnaW4oKTsgaXQgIT0gbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIGlmICgqaXQgPT0gJy4nKSB7CisgICAgICAgICppdCA9ICcvJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnMgKyAnLyc7CisgIH0KKworICAvKioKKyAgICogVHJhbnNmb3JtIGNsYXNzX21ldGhvZCBpbnRvIENsYXNzTWV0aG9kCisgICAqCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybiBzdGlybmcKKyAgICovCisgIHN0cmluZyBjbGFzc2lmeShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIGNsYXNzZSA9ICIiOworCisgICAgdmVjdG9yPHN0cmluZz4geCA9IHNwbGl0KHN0ciwgJ18nKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeC5zaXplKCk7ICsraSkgeworICAgICAgY2xhc3NlID0gY2xhc3NlICsgY2FwaXRhbGl6ZSh4W2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2xhc3NlOworICB9CisKKyAgLyoqCisgICAqIFNwbGl0IG1ldGhvZAorICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZGVsaW0KKyAgICogQHBhcmFtIGVsZW1zCisgICAqIEByZXR1cm4KKyAgICovCisgIHZlY3RvcjxzdHJpbmc+JiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0sIHZlY3RvcjxzdHJpbmc+JiBlbGVtcykgeworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKworICAgIHdoaWxlIChnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKKworICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOworICB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemUgbWV0aG9kCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybgorICAgKi8KKyAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOworCisgICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKKyAgICAgIHN0clswXSA9IHRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKworICAgIC8vICAgIHdoaWxlKCsraXQgIT0gc3RyLmVuZCgpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICppdCA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKml0KTsKKyAgICAvLyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICAvKioKKyAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KKyAgICovCisgIGJvb2wgYmluYXJ5X2lubGluZV87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCisgICAqLworICBib29sIHJlc3RfOworCisgIC8qKgorICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCisgICAqLworICBib29sIHBocHNfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQorICAgKi8KKyAgYm9vbCBvb3BfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZSB0byB1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcKKyAgICovCisgIGJvb2wgY2xhc3NtYXBfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCisgICAqLworICBib29sIHZhbGlkYXRlXzsKKworICAvKioKKyAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKKyAgICovCisgIGJvb2wganNvbl9zZXJpYWxpemFibGVfOworCisgIC8qKgorICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCisgICAqLworICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Cit9OworCitib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgUmVhbCBkaXJlY3RvcnkgTmFtZXNwYWNlcworICB2ZWN0b3I8c3RyaW5nPiBOU3ggPSBzcGxpdChwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSwgJ1xcJyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOU3guc2l6ZSgpOyArK2kpIHsKKyAgICBwYWNrYWdlX2Rpcl8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBOU3hbaV0gKyAiLyI7CisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJlcGFyZSBvdXRwdXQgZmlsZSBmb3IgYWxsIHRoZSB0eXBlcyBpbiBjbGFzc21hcCBtb2RlCisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBNYWtlIG91dHB1dCBmaWxlCisgICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJUeXBlcy5waHAiOworICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfdHlwZXNfKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgeworICBzdHJpbmcgaW5jbHVkZXMgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuIjsKKworICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgaW5jbHVkZXMgKz0gInVzZSBKc29uU2VyaWFsaXphYmxlO1xuIgorICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOworICB9CisKKyAgcmV0dXJuIGluY2x1ZGVzOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBIUCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzZXJ2aWNlIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRfc2VydmljZSogdHNlcnZpY2UsIHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmaWxlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBocF9pbmNsdWRlcygpOworCisgIGZpbGUgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHJvZ3JhbSBoZWFkZXIgY29udGFpbnMgbmFtZXNwYWNlIHN1ZmZpeCBhbmQgaW5jbHVkZXMgaW5zaWRlIGZpbGUgc3BlY2lmaWVkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpIHsKKyAgZmlsZSA8PCAiPD9waHAiIDw8IGVuZGw7CisgIGlmICghcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9lbnVtID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9lbnVtKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBXZSdyZSBhbHNvIGRvaW5nIGl0IHRoaXMgd2F5IHRvIHNlZSBob3cgaXQgcGVyZm9ybXMuIEl0J3MgbW9yZSBsZWdpYmxlCisgIC8vIGNvZGUgYnV0IHlvdSBjYW4ndCBkbyB0aGluZ3MgbGlrZSBhbiAnZXh0cmFjdCcgb24gaXQsIHdoaWNoIGlzIGEgYml0IG9mCisgIC8vIGEgZG93bmVyLgorICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgdGVudW0pOworICBmX2VudW0gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgdmFsdWUgPDwgIiA9PiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZW51bSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfZW51bS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgY29uc3RhbnQgY2xhc3MKKyAqCisgKiBPdmVycmlkZSB0aGUgb25lIGZyb20gdF9nZW5lcmF0b3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgLy8gQ3JlYXRlIGNsYXNzIG9ubHkgaWYgbmVlZGVkCisgIGlmIChjb25zdHMuc2l6ZSgpID4gMCkgeworCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9jb25zdHMgPSBmX3R5cGVzXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiQ29uc3RhbnQucGhwIjsKKyAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfY29uc3RzKTsKKyAgICB9CisgICAgZl9jb25zdHMgPDwgImZpbmFsIGNsYXNzIENvbnN0YW50IGV4dGVuZHMgXFxUaHJpZnRcXFR5cGVcXFRDb25zdGFudCI8PCBlbmRsCisgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIENyZWF0ZSBzdGF0aWMgcHJvcGVydHkKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInN0YXRpYyBwcm90ZWN0ZWQgJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgaW5pdCBmdW5jdGlvbgorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKworICAgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaW5pdF8iIDw8IG5hbWUgPDwgIigpIiA8PGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInJldHVybiAiOworICAgICAgZ2VuZXJhdGVfcGhwX2RvYyhmX2NvbnN0cywgKmNfaXRlcik7CisgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGZfY29uc3RzIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfY29uc3RzIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX2NvbnN0cy5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0ID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIi5waHAiOworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX3N0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc3RydWN0LmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisgIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgeworICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8ICInLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICInZWxlbScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBldHlwZSk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyB0eXBlIGZvciBwaHAgc3RydWN0IHNwZWMgZmllbGQiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKKyAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBwdWJsaWMgJF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIid2YXInID0+ICciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICInaXNSZXF1aXJlZCcgPT4gIiA8PCAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIsIiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGdlbmVyYXRlX3BocF9kb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHN0cnVjdCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRFeGNlcHRpb24iOworICB9IGVsc2UgaWYgKG9vcF8pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRCYXNlIjsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8ICIgaW1wbGVtZW50cyBKc29uU2VyaWFsaXphYmxlIjsKKyAgfQorICBvdXQgPDwgZW5kbAorICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RhdGljIHB1YmxpYyAkaXNWYWxpZGF0ZSA9ICIgPDwgKHZhbGlkYXRlXyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG91dCwgdHN0cnVjdCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBkdmFsID0gIm51bGwiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgJCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIHN0cmluZyBwYXJhbSA9IChtZW1iZXJzLnNpemUoKSA+IDApID8gIiR2YWxzID0gbnVsbCIgOiAiIjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSI8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpc19hcnJheSgkdmFscykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKG9vcF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdChzZWxmOjokX1RTUEVDLCAkdmFscyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAob29wXykgeworICAgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR0bXAgPSAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdG1wOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZmlkID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfaTgsICJmdHlwZSIpOworICAgIHRfZmllbGQgZmZpZChnX3R5cGVfaTE2LCAiZmlkIik7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmaWQpOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7CisgICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIKKyAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoJGZpZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSBUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICIKKyAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yV3JpdGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAob29wXykgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl93cml0ZSgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIGV4cGVjdDsKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGV4cGVjdCA9ICJhcnJheSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZXhwZWN0ID0gIm9iamVjdCI7CisgICAgfQorICAgIGlmICghZXhwZWN0LmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc18iIDw8IGV4cGVjdCA8PCAiKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JSZWFkIiwgZmFsc2UpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JXcml0ZSIsIHRydWUpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IG1ldGhvZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9PT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdSZXF1aXJlZCBmaWVsZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICIkanNvbiA9IG5ldyBzdGRDbGFzczsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgICBjb25zdCBzdHJpbmcmIG5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICBpZiAoIShrZXlfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwga2V5X3R5cGUtPmlzX2VudW0oKSkpIHsKKyAgICAgICAgICAvLyBKU09OIG9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5ncy4gUEhQJ3MganNvbl9lbmNvZGUoKQorICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhbnkgc2NhbGFyIGtleSB0byBzdHJpbmdzLCBidXQKKyAgICAgICAgICAvLyB3ZSBza2lwIHRocmlmdCBtYXBzIHdpdGggbm9uLXNjYWxhciBrZXlzLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IG5hbWUgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIiRqc29uLT4iIDw8IG5hbWUgPDwgIiA9ICI7CisgICAgICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV90b19jYXN0KHR5cGUpOworICAgICAgfQorICAgICAgb3V0IDw8ICIkdGhpcy0+IiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJGpzb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCitpbnQgdF9waHBfZ2VuZXJhdG9yOjpnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpIHsKKyAgaW50IG51bV9yZXEgPSAwOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCAmJiB3cml0ZV9tb2RlKSkgeworICAgICAgICArK251bV9yZXE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudW1fcmVxOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgcmV0dXJuICh2YWxpZGF0ZV8gJiYgIWlzX3Jlc3VsdCAmJiAhdHN0cnVjdC0+aXNfdW5pb24oKQorICAgICAgICAgICYmIGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0cnVlKSA+IDApOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0CisgICAgICAgICAgJiYgKGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCBmYWxzZSkgPiAwKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZihjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIi5waHAiOworICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGlmIChyZXN0XykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpZiAocGhwc18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBpZihjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcHJvY2Vzc29yID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IucGhwIjsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLm9wZW4oZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfcHJvY2Vzc29yKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhhbmRsZXIpIjw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfaTgsICJtdHlwZSIpOworICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZtdHlwZSwgIiIsIHRydWUpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKGZfc2VydmljZV9wcm9jZXNzb3IsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgIn0iIDw8IGVuZGw7CisKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRpbnB1dCBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4nKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJncyA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKCIgPDxlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dCwiPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgYXJnc25hbWUgPDwgIicsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5pc1N0cmljdFJlYWQoKSIgPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKKyAgfQorICBvdXQgPDwgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgICBvdXQgPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIgorICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGdldF90cnVlX3R5cGUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkb3V0cHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk8PCAiJywiIDw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRzZXFpZCwiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5pc1N0cmljdFdyaXRlKCkiPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIgorICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSkpOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHNlcWlkKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmZsdXNoKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2RlZmluaXRpb24gPSBmX3NlcnZpY2VfOworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA8PCAiLy8gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworCisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSArICIucGhwIjsKKyAgICAgIGZfc3RydWN0X2RlZmluaXRpb24ub3BlbihmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfZGVmaW5pdGlvbik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2RlZmluaXRpb24sIHRzKTsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5jbG9zZSgpOworICAgIH0KKworICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2hlbHBlciA9IGZfc2VydmljZV87CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9oZWxwZXJfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHJlc3VsdC5nZXRfbmFtZSgpICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfaGVscGVyLm9wZW4oZl9zdHJ1Y3RfaGVscGVyX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfaGVscGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2hlbHBlciwgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9oZWxwZXIuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfaW50ZXJmYWNlID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJJZi5waHAiOworICAgIGZfc2VydmljZV9pbnRlcmZhY2Uub3BlbihmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9pbnRlcmZhY2UpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOworICB9CisgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfaW50ZXJmYWNlIDw8ICJpbnRlcmZhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfc2VydmljZV9pbnRlcmZhY2UsICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfaW50ZXJmYWNlKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBpbnRlcmZhY2UgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9pbnRlcmZhY2UuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcmVzdCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9yZXN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlJlc3QucGhwIjsKKyAgICBmX3NlcnZpY2VfcmVzdC5vcGVuKGZfc2VydmljZV9yZXN0X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9yZXN0KTsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2lmID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIlJlc3QiOworICB9CisgIGZfc2VydmljZV9yZXN0IDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGltcGxfOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW1wbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICR0aGlzLT5pbXBsXyA9ICRpbXBsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKKyAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcQorICAgICAgICAgICAgICAgICAgIDw8ICIpICYmICgiIDw8IHJlcSA8PCAiICE9PSAnZmFsc2UnKSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcnJheV9maWxsX2tleXMoanNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInJldHVybiAkdGhpcy0+aW1wbF8tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGZhbHNlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX3Jlc3QpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIHJlc3QgZmlsZQorICBmX3NlcnZpY2VfcmVzdCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9yZXN0LmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9jbGllbnQgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfY2xpZW50X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIkNsaWVudC5waHAiOworICAgIGZfc2VydmljZV9jbGllbnQub3BlbihmX3NlcnZpY2VfY2xpZW50X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9jbGllbnQpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICsgIkNsaWVudCI7CisgIH0KKworICBmX3NlcnZpY2VfY2xpZW50IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCJ7Ijw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFByaXZhdGUgbWVtYmVycworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbnB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCAkb3V0cHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRzZXFpZF8gPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCA9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgIiR0aGlzLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgbWVzc2FnZVR5cGUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYXJncywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+c2VxaWRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCBtZXNzYWdlVHlwZSA8PCAiKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IGZ1bm5hbWUgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgcmVzdWx0bmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7CisgICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHZlciA9IHVucGFjaygnTicsICR0aGlzLT5pbnB1dF8tPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlclsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX2NsaWVudCwgJmZmbmFtZSwgIiIsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZnNlcWlkLCAiIiwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkeDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOworCisgICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRyZXN1bHQtPnN1Y2Nlc3M7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9jbGllbnQgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBjbGllbnQgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9jbGllbnQuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgeworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaXRyYW5zID0gKGluY2xhc3MgPyAiJHRoaXMtPmlucHV0XyIgOiAiJGlucHV0Iik7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGxlbiA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbGVuID0gJGxlblsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbGVuID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgkbGVuKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmYpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsxXSA9ICRhcnJbMV0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBzaXplIDw8ICIgPSAwOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBrdHlwZSA8PCAiLCAkIiA8PCB2dHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiW10gPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOMicsICQiIDw8IG5hbWUgPDwgIiA+PiAzMiwgJCIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiICYgMHhGRkZGRkZGRik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2QnLCAkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIKKyAgICAgICAgICAgICAgICA8PCAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZihwaHBfaXNfc2NhbGFyKGVsZW1fdHlwZSkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciBhIGZpZWxkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIC8vIHByZXBlbmQgZnJlZS1zdHlsZSBkb2MgaWYgYXZhaWxhYmxlCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZmllbGQtPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwZW5kIEB2YXIgdGFnCisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBzcyA8PCAiQHZhciAiIDw8IHR5cGVfdG9fcGhwZG9jKHR5cGUpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgc3Muc3RyKCkpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIGlmIChmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZnVuY3Rpb24tPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgcGFyYW1ldGVyIHR5cGVzIGRvYworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgIHRfZmllbGQqIGFyZyA9ICphX2l0ZXI7CisgICAgc3MgPDwgIkBwYXJhbSAiIDw8IHR5cGVfdG9fcGhwZG9jKGFyZy0+Z2V0X3R5cGUoKSkgPDwgIiAkIiA8PCBhcmctPmdldF9uYW1lKCk7CisgICAgaWYgKGFyZy0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgYXJnLT5nZXRfZG9jKCk7CisgICAgfQorICAgIHNzIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSByZXR1cm4gdHlwZSBkb2MKKyAgdF90eXBlKiByZXRfdHlwZSA9IGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkgfHwgcmV0X3R5cGUtPmhhc19kb2MoKSkgeworICAgIHNzIDw8ICJAcmV0dXJuICIgPDwgdHlwZV90b19waHBkb2MocmV0X3R5cGUpOworICAgIGlmIChyZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgcmV0X3R5cGUtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIGV4Y2VwdGlvbnMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y3MgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgIGZvciAoZV9pdGVyID0gZXhjcy5iZWdpbigpOyBlX2l0ZXIgIT0gZXhjcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGMgPSAqZV9pdGVyOworICAgIHNzIDw8ICJAdGhyb3dzICIgPDwgdHlwZV90b19waHBkb2MoZXhjLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoZXhjLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBleGMtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7CisgIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gYXJyYXkoKSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgLy8gU2V0IHR5cGUgbmFtZQorICAgIGlmIChhZGRUeXBlSGludHMpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgY2xhc3NOYW1lID0gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwaHBfbmFtZXNwYWNlX2RpcmVjdG9yeSgiRGVmaW5pdGlvbiIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc2lmeSh0eXBlLT5nZXRfbmFtZSgpKTsKKworICAgICAgICByZXN1bHQgKz0gY2xhc3NOYW1lICsgIiAiOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICByZXN1bHQgKz0gImFycmF5ICI7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKyAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIoYm9vbCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIihpbnQpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiKGRvdWJsZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIoc3RyaW5nKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoaW50KSI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6OkxTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQSFBEb2Mgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19waHBkb2ModF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJhcnJheSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKHRfZWxlbS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIilbXSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIltdIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpOworICAgIHRfdHlwZSogdF9lbGVtID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBwaHAsCisgICAgIlBIUCIsCisgICAgIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCisgICAgIiAgICBzZXJ2ZXI6ICAgICAgICAgIEdlbmVyYXRlIFBIUCBzZXJ2ZXIgc3R1YnNcbiIKKyAgICAiICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKKyAgICAiICAgIGNsYXNzbWFwOiAgICAgICAgR2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlcyAodXNlIGNsYXNzbWFwIGF1dG9sb2FkaW5nKVxuIgorICAgICIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCisgICAgIiAgICBuc2dsb2JhbD1OQU1FOiAgIFNldCBnbG9iYWwgbmFtZXNwYWNlXG4iCisgICAgIiAgICB2YWxpZGF0ZTogICAgICAgIEdlbmVyYXRlIFBIUCB2YWxpZGF0b3IgbWV0aG9kc1xuIgorICAgICIgICAganNvbjogICAgICAgICAgICBHZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMgKHJlcXVpcmVzIFBIUCA+PSA1LjQpXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYyMDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3B5X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yIChwcm9ncmFtKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9uZXdzdHlsZV8gPSB0cnVlOworICAgIGdlbl91dGY4c3RyaW5nc18gPSB0cnVlOworICAgIGdlbl9keW5iYXNlXyA9IGZhbHNlOworICAgIGdlbl9zbG90c18gPSBmYWxzZTsKKyAgICBnZW5fdG9ybmFkb18gPSBmYWxzZTsKKyAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gZmFsc2U7CisgICAgZ2VuX3R3aXN0ZWRfID0gZmFsc2U7CisgICAgZ2VuX2R5bmFtaWNfID0gZmFsc2U7CisgICAgY29kaW5nXyA9ICIiOworICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gIiI7CisgICAgaW1wb3J0X2R5bmJhc2VfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmV3X3N0eWxlIikgPT0gMCkgeworICAgICAgICBwd2FybmluZygwLCAibmV3X3N0eWxlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9sZF9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOworICAgICAgICBwd2FybmluZygwLCAib2xkX3N0eWxlIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidXRmOHN0cmluZ3MiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJ1dGY4c3RyaW5ncyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoZSBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub191dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzbG90cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Nsb3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmFtaWMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5hbWljXyA9IHRydWU7CisgICAgICAgIGdlbl9uZXdzdHlsZV8gPSBmYWxzZTsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fLmVtcHR5KCkpIHsKKyAgICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiVEZyb3plbkJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2V4Y18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGltcG9ydF9keW5iYXNlXy5lbXB0eSgpKSB7CisgICAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gImZyb20gdGhyaWZ0LnByb3RvY29sLlRCYXNlIGltcG9ydCBUQmFzZSwgVEZyb3plbkJhc2UsIFRFeGNlcHRpb25CYXNlLCBUVHJhbnNwb3J0XG4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmJhc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7CisgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmZyb3plbiIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmV4YyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInpvcGUuaW50ZXJmYWNlIikgPT0gMCkgeworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidHdpc3RlZCIpID09IDApIHsKKyAgICAgICAgZ2VuX3R3aXN0ZWRfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3pvcGVfaW50ZXJmYWNlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRvcm5hZG8iKSA9PSAwKSB7CisgICAgICAgIGdlbl90b3JuYWRvXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvZGluZyIpID09IDApIHsKKyAgICAgICAgY29kaW5nXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBweToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl90d2lzdGVkXyAmJiBnZW5fdG9ybmFkb18pIHsKKyAgICAgIHRocm93ICJhdCBtb3N0IG9uZSBvZiAndHdpc3RlZCcgYW5kICd0b3JuYWRvJyBhcmUgYWxsb3dlZCI7CisgICAgfQorCisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50d2lzdGVkIjsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudG9ybmFkbyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcHJlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBvc3QgPSBOVUxMKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAidHdpc3RlZCI7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSwgYm9vbCBnZW5fdHdpc3RlZCwgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXI9IiIpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWQpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOworICAgICAgaWYgKCF0d2lzdGVkX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0d2lzdGVkX21vZHVsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5Iik7CisgICAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZV9kaXIgKyByZWFsX21vZHVsZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX2ltbXV0YWJsZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgcmV0dXJuIHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgicHl0aG9uLmltbXV0YWJsZSIpICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCk7CisgIH0KKworcHJpdmF0ZToKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCisgICAqLworICBib29sIGdlbl9uZXdzdHlsZV87CisKKyAgLyoqCisgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgZHluYW1pYyBzdHlsZSBjbGFzc2VzLgorICAqLworICBib29sIGdlbl9keW5hbWljXzsKKworICBib29sIGdlbl9keW5iYXNlXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc187CisgIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19leGNfOworCisgIHN0ZDo6c3RyaW5nIGltcG9ydF9keW5iYXNlXzsKKworICBib29sIGdlbl9zbG90c187CisKKyAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuCisgICAqLworICBib29sIGdlbl96b3BlX2ludGVyZmFjZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fdHdpc3RlZF87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8KKyAgICovCisgIGJvb2wgZ2VuX3Rvcm5hZG9fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGVuY29kZWQgdXNpbmcgdXRmLTguCisgICAqLworICBib29sIGdlbl91dGY4c3RyaW5nc187CisKKyAgLyoqCisgICAqIHNwZWNpZnkgZ2VuZXJhdGVkIGZpbGUgZW5jb2RpbmcKKyAgICogZWcuICMgLSotIGNvZGluZzogdXRmLTggLSotCisgICAqLworICBzdHJpbmcgY29kaW5nXzsKKworICBzdHJpbmcgcGFja2FnZV9wcmVmaXhfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV87CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiRmFsc2UiLCAiTm9uZSIsICJUcnVlIiwgImFuZCIsICJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLAorICAgICAgICAgICJjb250aW51ZSIsICJkZWYiLCAiZGVsIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZXhlYyIsICJmaW5hbGx5IiwgImZvciIsICJmcm9tIiwKKyAgICAgICAgICAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsICJpbiIsICJpcyIsICJsYW1iZGEiLCAibm9ubG9jYWwiLCAibm90IiwgIm9yIiwgInBhc3MiLCAicHJpbnQiLAorICAgICAgICAgICJyYWlzZSIsICJyZXR1cm4iLCAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiIH07CisgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKKyAgfQorfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOworICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICBtb2R1bGVfID0gbW9kdWxlOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKyAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiKS5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjphcHApOworICAgIGluaXRfcHkuY2xvc2UoKTsKKyAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIG1vZHVsZS5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAidHR5cGVzLnB5IjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiY29uc3RhbnRzLnB5IjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiL19faW5pdF9fLnB5IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2luaXQ7CisgIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOworICBmX2luaXQgPDwgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgfQorICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7CisgIGZfaW5pdC5jbG9zZSgpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisKKyAgZl90eXBlc18gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8CisgICAgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gImltcG9ydCAiICsgZ2V0X3JlYWxfcHlfbW9kdWxlKGluY2x1ZGVzW2ldLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlc1xuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfYXV0b2dlbl9jb21tZW50KCkgeworICBzdHJpbmcgY29kaW5nOworICBpZiAoIWNvZGluZ18uZW1wdHkoKSkgeworICAgICAgY29kaW5nID0gIiMgLSotIGNvZGluZzogIiArIGNvZGluZ18gKyAiIC0qLVxuIjsKKyAgfQorICByZXR1cm4gY29kaW5nICsgc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iCisgICAgICAgICArICIjICBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iICsgIiNcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfaW1wb3J0cygpIHsKKyAgb3N0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUsIFRNZXNzYWdlVHlwZSwgVEZyb3plbkRpY3QsIFRFeGNlcHRpb24sICIKKyAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xFeGNlcHRpb24iCisgICAgIDw8IGVuZGwKKyAgICAgPDwgImZyb20gdGhyaWZ0LlRSZWN1cnNpdmUgaW1wb3J0IGZpeF9zcGVjIgorICAgICA8PCBlbmRsOworCisgIGlmIChnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgc3MgPDwgZW5kbCA8PCAiaW1wb3J0IHN5cyI7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgLy8gRml4IHRocmlmdF9zcGVjIGRlZmluaXRpb25zIGZvciByZWN1cnNpdmUgc3RydWN0cy4KKyAgZl90eXBlc18gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUHl0aG9uLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOworCisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAoZ2VuX25ld3N0eWxlXyA/ICIob2JqZWN0KSIgOiAiIikKKyAgICAgICAgICAgPDwgKGdlbl9keW5hbWljXyA/ICIoIiArIGdlbl9keW5iYXNlY2xhc3NfICsgIikiIDogIiIpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKKworICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcworICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IHZhbHVlIDw8ICI6IFwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOworICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgJyInIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiOiAiIDw8IHZhbHVlIDw8ICcsJyA8PCBlbmRsOworICB9CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IHRvX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwgZnJvbV9zdHJpbmdfbWFwcGluZy5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiZmxvYXQoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigqKnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiVEZyb3plbkRpY3QoIjsKKyAgICB9CisgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICAgIG91dCA8PCAiZnJvemVuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2V0KCI7CisgICAgfQorICAgIGlmIChpc19pbW11dGFibGUodHlwZSkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcikgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcHl0aG9uIHN0cnVjdHMuCisgKiBUaGVzZSBhcmUgYWN0dWFsbHkgZnVsbCBjbGFzcyBkZWZpbml0aW9ucyBzbyB0aGF0IGNhbGxzIHRvIGdlbmVyYXRlX3N0cnVjdAorICogY2FuIGFkZCB0aGUgdGhyaWZ0X3NwZWMgZmllbGQuICBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGFsbCB0aHJpZnRfc3BlYworICogZGVmaW5pdGlvbnMgYXJlIGdyb3VwZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBlbmFibGUgY28tcmVjdXJzaXZlIHN0cnVjdHMuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0CisgKiBGb3IgZXhhbXBsZSwKKyAqICAgYWxsX3N0cnVjdHMuYXBwZW5kKFJlY3Vyc2l2ZSkKKyAqICAgUmVjdXJzaXZlLnRocmlmdF9zcGVjID0gKAorICogICAgICAgTm9uZSwgICMgMAorICogICAgICAgKDEsIFRUeXBlLkxJU1QsICdDaGlsZHJlbicsIChUVHlwZS5TVFJVQ1QsIChSZWN1cnNpdmUsIE5vbmUpLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAqICAgKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyppc19leGNlcHRpb24qLykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gQWRkIHN0cnVjdCBkZWZpbml0aW9uIHRvIGxpc3Qgc28gdGhyaWZ0X3NwZWMgY2FuIGJlIGZpeGVkIGZvciByZWN1cnNpdmUgc3RydWN0dXJlcy4KKyAgaW5kZW50KG91dCkgPDwgImFsbF9zdHJ1Y3RzLmFwcGVuZCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisKKyAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19zcGVjX2FyZ3MoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiKSwiCisgICAgICAgICAgICAgICAgICA8PCAiICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisKKyAgICAgIHNvcnRlZF9rZXlzX3BvcysrOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnRocmlmdF9zcGVjID0gKCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9keW5hbWljXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIihURXhjZXB0aW9uKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9keW5hbWljXykgeworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fIDw8ICIpIjsKKyAgICB9IGVsc2UgIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc18gPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7CisgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgIH0KKyAgb3V0IDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIC8qCisgICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KKyAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCisgICAgIGl0ZW1fc3BlYyAtPiBOb25lIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCisgICAgIHRhZyAtPiBpbnRlZ2VyCisgICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KKyAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAorICAgICBkZWZhdWx0IC0+IE5vbmUgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gTm9uZSAgIyBGb3Igc2ltcGxlIHR5cGVzCisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0CisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQorICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKKyAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCisgICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcworICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncworCisgICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCisgICovCisKKyAgaWYgKGdlbl9zbG90c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19zbG90c19fID0gKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgIiAiIDw8IGRlY2xhcmVfYXJndW1lbnQoKm1faXRlcikgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgIik6IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBJbml0aWFsaXplIGZpZWxkcworICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJzZWxmLnRocmlmdF9zcGVjWyIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisKKyAgICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgICAgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCBzZWxmKS5fX3NldGF0dHJfXygnIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuX19kaWN0X19bJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiddID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3NldGF0dHJfXyhzZWxmLCAqYXJncyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVHlwZUVycm9yKFwiY2FuJ3QgbW9kaWZ5IGltbXV0YWJsZSBpbnN0YW5jZVwiKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZGVsYXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBIYXNoIGFsbCBvZiB0aGUgbWVtYmVycyBpbiBvcmRlciwgYW5kIGFsc28gaGFzaCBpbiB0aGUgY2xhc3MKKyAgICAvLyB0byBhdm9pZCBjb2xsaXNpb25zIGZvciBzdHVmZiBsaWtlIHNpbmdsZS1maWVsZCBzdHJ1Y3R1cmVzLgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faGFzaF9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goKCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgLy8gRm9yIGV4Y2VwdGlvbnMgb25seSwgZ2VuZXJhdGUgYSBfX3N0cl9fIG1ldGhvZC4gVGhpcyBpcworICAvLyBiZWNhdXNlIHdoZW4gcmFpc2VkIGV4Y2VwdGlvbnMgYXJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUsIF9fcmVwcl9fCisgIC8vIGlzbid0IHVzZWQuIFNlZSBweXRob24gYnVnICM1ODgyCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fc2xvdHNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gUHJpbnRpbmcgdXRpbGl0aWVzIHNvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJpZnQKKyAgICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCisgICAgaW5kZW50KG91dCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVtcygpXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICghZ2VuX2R5bmFtaWNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gbm8gYmFzZSBjbGFzcyBhdmFpbGFibGUgdG8gaW1wbGVtZW50IF9fZXFfXyBhbmQgX19yZXByX18gYW5kIF9fbmVfXyBmb3IgdXMKKyAgICAvLyBzbyB3ZSBtdXN0IHByb3ZpZGUgb25lIHRoYXQgdXNlcyBfX3Nsb3RzX18KKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBFcXVhbGl0eSBtZXRob2QgdGhhdCBjb21wYXJlcyBlYWNoIGF0dHJpYnV0ZSBieSB2YWx1ZSBhbmQgdHlwZSwgd2Fsa2luZyBfX3Nsb3RzX18KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIEZhbHNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAib3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBteV92YWwgIT0gb3RoZXJfdmFsOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkBjbGFzc21ldGhvZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHJlYWQoY2xzLCBpcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJkZWYgcmVhZChzZWxmLCBpcHJvdCk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IGNoYXIqIGlkID0gaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpID8gImNscyIgOiAic2VsZiI7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSAiCisgICAgICAgICAgICAgICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKKyAgICAgICAgICAgICAgICAgImFuZCAiCisgICAgICAgICAgICAgIDw8IGlkIDw8ICIudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBpcHJvdC5fZmFzdF9kZWNvZGUoTm9uZSwgaXByb3QsIFtjbHMsIGNscy50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisgIAorICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICAgICAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0IDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPDwgIk5vbmUiOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0LnN0cigpIDw8IGVuZGw7CisgICAgIH0KKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsaWYgIjsKKyAgICB9CisgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gY2xzKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI9IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmIHdyaXRlKHNlbGYsIG9wcm90KToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiBvcHJvdC5fZmFzdF9lbmNvZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KQorICAgICAgPDwgIm9wcm90LnRyYW5zLndyaXRlKG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUoc2VsZik6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIE5vbmU6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIucHkiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIKKyAgICAgICAgICAgICAgIDw8IGdldF9yZWFsX3B5X21vZHVsZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCBsb2dnaW5nIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW1wb3J0X2R5bmJhc2VfOworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50ZXIiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBjb25jdXJyZW50IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIoSW50ZXJmYWNlKSI7CisgICAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyBJZmFjZSIgPDwgZXh0ZW5kc19pZiA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIGlmIChmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIigiICsgZXh0ZW5kcyArICIuQ2xpZW50KSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXyAmJiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdD1Ob25lKToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpcHJvdF9mYWN0b3J5KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydC5pb19sb29wLnNwYXduX2NhbGxiYWNrKHNlbGYuX3N0YXJ0X3JlY2VpdmluZykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgb3Byb3QgaXMgbm90IE5vbmU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzCisgICAgICAgICAgICAgICAgIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fdG9ybmFkb18gJiYgZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCAiQGdlbi5lbmdpbmUiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJkZWYgX3N0YXJ0X3JlY2VpdmluZyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lID0geWllbGQgc2VsZi5fdHJhbnNwb3J0LnJlYWRGcmFtZSgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmb3IgZnV0dXJlIGluIHNlbGYuX3JlcXMudmFsdWVzKCk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdyZWN2XycgKyBmbmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQsIE5vbmUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGZ1dHVyZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiIyBmdXR1cmUgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiY29udGludWUiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IG1ldGhvZChpcHJvdCwgbXR5cGUsIHJzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9yZXN1bHQocmVzdWx0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VxaWQgPSBzZWxmLl9zZXFpZCA9IHNlbGYuX3NlcWlkICsgMSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZXFpZF0gPSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9zZXFpZCArPSAxIiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnV0dXJlID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBjb25jdXJyZW50LkZ1dHVyZSgpIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAgIH0KKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIHdlIG5lZWQgYSBsZWFkaW5nIGNvbW1hIGlmIHRoZXJlIGFyZSBhcmdzLCBzaW5jZSBpdCdzIGNhbGxlZCBhcyBtYXliZURlZmVycmVkKGZ1bmNuYW1lLAorICAgICAgLy8gYXJnKQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgbmV4dCBibG9jay4KKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1dHVyZSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIFRoaXMgYmxvY2sgaW5qZWN0cyB0aGUgYm9keSBvZiB0aGUgc2VuZF88PiBtZXRob2QgZm9yIHR3aXN0ZWQgKGFuZCBhIGNiL2ViIHBhaXIpCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZC5hZGRDYWxsYmFja3MoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrPXNlbGYuY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImNhbGxiYWNrQXJncz0oc2VxaWQsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2s9c2VsZi5lYl9zZW5kXyIKKyAgICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFja0FyZ3M9KHNlcWlkLCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgXywgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgLy8gaWYgb25lLXdheSwgZmlyZSB0aGUgZGVmZXJyZWQgJiByZW1vdmUgaXQgZnJvbSBfcmVxcworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgImQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGYuX3JlcXNbc2VxaWRdIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgLy8gYWRkIGFuIGVycmJhY2sgdG8gZmFpbCB0aGUgcmVxdWVzdCBpZiB0aGUgY2FsbCB0byBzZW5kXzw+IHJhaXNlZCBhbiBleGNlcHRpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGViX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgZiwgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZC5lcnJiYWNrKGYpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCI7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgaXByb3QsIG10eXBlLCByc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbDsKKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBkLmVycmJhY2soeCkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHgiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2socmVzdWx0LnN1Y2Nlc3MpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayhyZXN1bHQuIiA8PCB4bmFtZSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb21tYW5kIGxpbmUgdG9vbCBmb3IgbWFraW5nIHJlbW90ZSByZXF1ZXN0cworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHJlbW90ZSBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAvLyBHZXQgYWxsIGZ1bmN0aW9uIGZyb20gcGFyZW50cworICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IHBfZnVuY3Rpb25zID0gcGFyZW50LT5nZXRfZnVuY3Rpb25zKCk7CisgICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKKyAgICBwYXJlbnQgPSBwYXJlbnQtPmdldF9leHRlbmRzKCk7CisgIH0KKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICItcmVtb3RlIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworCisgIGZfcmVtb3RlIDw8CisgICAgIiMhL3Vzci9iaW4vZW52IHB5dGhvbiIgPDwgZW5kbCA8PAorICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKKyAgICAiaW1wb3J0IHN5cyIgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgcHByaW50IiA8PCBlbmRsIDw8CisgICAgImlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAiZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImVsc2U6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAorICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQsIFRTb2NrZXQsIFRTU0xTb2NrZXQsIFRIdHRwQ2xpZW50IiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiIGltcG9ydCAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZW5kbCA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAorICAgIGVuZGw7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiaWYgbGVuKHN5cy5hcmd2KSA8PSAxIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3RbOnBvcnRdXSBbLXUgdXJsXSBbLWZbcmFtZWRdXSBbLXNbc2xdXSBbLW5vdmFsaWRhdGVdIFstY2FfY2VydHMgY2VydHNdIFsta2V5ZmlsZSBrZXlmaWxlXSBbLWNlcnRmaWxlIGNlcnRmaWxlXSBmdW5jdGlvbiBbYXJnMSBbYXJnMi4uLl1dJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcnKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ0Z1bmN0aW9uczonKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKScpIiA8PCBlbmRsOworICB9CisgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCAicHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcihpbmRlbnQ9MikiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbAorICAgICAgICAgICA8PCAicG9ydCA9IDkwOTAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInVyaSA9ICcnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAic3NsID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInZhbGlkYXRlID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2FfY2VydHMgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJrZXlmaWxlID0gTm9uZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2VydGZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJodHRwID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImFyZ2kgPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAicGFydHMgPSBzeXMuYXJndlthcmdpICsgMV0uc3BsaXQoJzonKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInVybCA9IHVybHBhcnNlKHN5cy5hcmd2W2FyZ2kgKyAxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IDgwIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJpID0gdXJsWzJdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgdXJsWzRdOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgKz0gJz8lcycgJSB1cmxbNF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJodHRwID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJmcmFtZWQgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctcycgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zc2wnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInNzbCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1ub3ZhbGlkYXRlJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ2YWxpZGF0ZSA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2FfY2VydHMnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNhX2NlcnRzID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWtleWZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImtleWZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2VydGZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNlcnRmaWxlID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJncyA9IHN5cy5hcmd2W2FyZ2kgKyAxOl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgaHR0cDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIHNzbDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAic29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KGhvc3QsIHBvcnQsICIKKyAgICAgICAgICAgICAgInZhbGlkYXRlPXZhbGlkYXRlLCBjYV9jZXJ0cz1jYV9jZXJ0cywga2V5ZmlsZT1rZXlmaWxlLCBjZXJ0ZmlsZT1jZXJ0ZmlsZSkiCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQoaG9zdCwgcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBmcmFtZWQ6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidHJhbnNwb3J0Lm9wZW4oKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3JlbW90ZSA8PCAiZWwiOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKworICAgIGZfcmVtb3RlIDw8ICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MKKyAgICAgICAgICAgICA8PCAiIGFyZ3MnKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMSkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHAucHByaW50KGNsaWVudC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpCisgICAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgICAgZWxzZQorICAgICAgICBmX3JlbW90ZSA8PCAiICI7CisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKKyAgICAgIH0KKyAgICB9CisgICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOworCisgICAgZl9yZW1vdGUgPDwgZW5kbDsKKyAgfQorCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfcmVtb3RlIDw8ICJlbHNlOiIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3JlbW90ZS5jbG9zZSgpOworCisjaWZuZGVmIF9NU0NfVkVSCisKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKworI2VuZGlmIC8vIF9NU0NfVkVSCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiQGltcGxlbWVudGVyKElmYWNlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklmYWNlLCBUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBJZmFjZShoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgSWZhY2UoaGFuZGxlcikpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgaGFuZGxlcikiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gUHJvY2Vzc29yLnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG5hbWUgbm90IGluIHNlbGYuX3Byb2Nlc3NNYXA6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3Quc2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlcycgJSAobmFtZSkpIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGVuZCBvZiBhcmdzIGZpZWxkLCB0aGUgVF9TVE9QLCBhbmQgdGhlIHN0cnVjdCBjbG9zZQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJAZ2VuLmNvcm91dGluZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiLCAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRFcnJiYWNrKHNlbGYuaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iCisgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGhhbmRsZV9leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCBzZXFpZCk6IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworCisgICAgLy8gS2luZGEgYWJzdXJkCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInlpZWxkIGdlbi5tYXliZV9mdXR1cmUoc2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ0V4Y2VwdGlvbiBpbiBvbmV3YXkgaGFuZGxlcicpIiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgeyAvLyBweQorICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgICAvLyBJdCBhbHNvIGNhdGNoZXMgYXJiaXRyYXJ5IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IGhhbmRsZXIgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGVtIHRvIHRoZSBjbGllbnQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIGlmKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSBpcHJvdC5yZWFkU3RyaW5nKCkiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlCisgICAgICAgIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHNldCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUKKyAgICAgICAgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8CisgICAgImZvciAiIDw8IGkgPDwgIiBpbiByYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IFRGcm96ZW5EaWN0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGZyb3plbnNldCgiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IHR1cGxlKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFwcGVuZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIGlmICghZ2VuX3V0ZjhzdHJpbmdzXykgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiLmVuY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSAiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCAiIDw8IHZpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5pdGVtcygpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKKyAgYm9vbCBoYXNfZG9jID0gZmFsc2U7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2RvYykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHNzLnN0cigpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHRkb2MtPmdldF9kb2MoKSwgIlwiXCJcIlxuIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIk5vbmUiOworICB9CisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGRlZmF1bHQgdmFsdWUsIHJldHVybnMgTm9uZSBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlKSB7CisgIHZlY3RvcjxzdHJpbmc+IHByZTsKKyAgdmVjdG9yPHN0cmluZz4gcG9zdDsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKKworICBpZiAoIShnZW5fem9wZV9pbnRlcmZhY2VfICYmIGludGVyZmFjZSkpIHsKKyAgICBwcmUucHVzaF9iYWNrKCJzZWxmIik7CisgIH0KKworICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICZwcmUsICZwb3N0KSArICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHZlY3RvcjxzdHJpbmc+KiBwcmUsIHZlY3RvcjxzdHJpbmc+KiBwb3N0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBpZiAocHJlKSB7CisgICAgZm9yIChzX2l0ZXIgPSBwcmUtPmJlZ2luKCk7IHNfaXRlciAhPSBwcmUtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHBvc3QpIHsKKyAgICBmb3IgKHNfaXRlciA9IHBvc3QtPmJlZ2luKCk7IHNfaXRlciAhPSBwb3N0LT5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgKz0gKnNfaXRlcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpIHsKKyAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgcmV0dXJuICAiJ0JJTkFSWSciOworICB9IGVsc2UgaWYgKGdlbl91dGY4c3RyaW5nc18gJiYgdHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgJiYgcmVpbnRlcnByZXRfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+aXNfc3RyaW5nKCkpIHsKKyAgICByZXR1cm4gIidVVEY4JyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlsiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsIE5vbmVdIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBweSwKKyAgICAiUHl0aG9uIiwKKyAgICAiICAgIHpvcGUuaW50ZXJmYWNlOiAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuXG4iCisgICAgIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgorICAgICIgICAgdG9ybmFkbzogICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvLlxuIgorICAgICIgICAgbm9fdXRmOHN0cmluZ3M6ICBEbyBub3QgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBCYXNpY2FsbHkgbm8gZWZmZWN0IGZvciBQeXRob24gMy5cbiIKKyAgICAiICAgIGNvZGluZz1DT0RJTkc6ICAgQWRkIGZpbGUgZW5jb2RpbmcgZGVjbGFyZSBpbiBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIHNsb3RzOiAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyBzbG90cyBmb3IgaW5zdGFuY2UgbWVtYmVycy5cbiIKKyAgICAiICAgIGR5bmFtaWM6ICAgICAgICAgR2VuZXJhdGUgZHluYW1pYyBjb2RlLCBsZXNzIGNvZGUgZ2VuZXJhdGVkIGJ1dCBzbG93ZXIuXG4iCisgICAgIiAgICBkeW5iYXNlPUNMUyAgICAgIERlcml2ZSBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIGNsYXNzIENMUyBpbnN0ZWFkIG9mIFRCYXNlLlxuIgorICAgICIgICAgZHluZnJvemVuPUNMUyAgICBEZXJpdmUgZ2VuZXJhdGVkIGltbXV0YWJsZSBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEZyb3plbkJhc2UuXG4iCisgICAgIiAgICBkeW5leGM9Q0xTICAgICAgIERlcml2ZSBnZW5lcmF0ZWQgZXhjZXB0aW9ucyBmcm9tIENMUyBpbnN0ZWFkIG9mIFRFeGNlcHRpb25CYXNlLlxuIgorICAgICIgICAgZHluaW1wb3J0PSdmcm9tIGZvby5iYXIgaW1wb3J0IENMUydcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIGFuIGltcG9ydCBsaW5lIHRvIGdlbmVyYXRlZCBjb2RlIHRvIGZpbmQgdGhlIGR5bmJhc2UgY2xhc3MuXG4iCisgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0ndG9wLnBhY2thZ2UuJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgb2xkX3N0eWxlOiAgICAgICBEZXByZWNhdGVkLiBHZW5lcmF0ZSBvbGQtc3R5bGUgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgc3ViY2xhc3Mgb2Ygc3RkOjpvZnN0cmVhbSB0aGF0IGluY2x1ZGVzIGluZGVudGluZyBmdW5jdGlvbmFsaXR5LgorICovCitjbGFzcyB0X3JiX29mc3RyZWFtIDogcHVibGljIHN0ZDo6b2ZzdHJlYW0geworcHJpdmF0ZToKKyAgaW50IGluZGVudF87CisKK3B1YmxpYzoKKyAgdF9yYl9vZnN0cmVhbSgpIDogc3RkOjpvZnN0cmVhbSgpLCBpbmRlbnRfKDApIHt9CisgIGV4cGxpY2l0IHRfcmJfb2ZzdHJlYW0oY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAwKQorICAgIDogc3RkOjpvZnN0cmVhbShmaWxlbmFtZSwgbW9kZSksIGluZGVudF8oaW5kZW50KSB7fQorCisgIHRfcmJfb2ZzdHJlYW0mIGluZGVudCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudF87ICsraSkgeworICAgICAgKnRoaXMgPDwgIiAgIjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7IGluZGVudF8rKzsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBpbmRlbnRfLS07IH0KK307CisKKy8qKgorICogUnVieSBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcmJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcmJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICByZXF1aXJlX3J1YnlnZW1zXyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicnVieWdlbXMiKSA9PSAwKSB7CisgICAgICAgIHJlcXVpcmVfcnVieWdlbXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHJ1Ynk6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXJiIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB0X3JiX29mc3RyZWFtJiByZW5kZXJfY29uc3RfdmFsdWUodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9kZWNsYXJhdGlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKGNvbnN0IHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2UpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXMoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbW9kdWxlczsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgcG9zID0gbnMuYmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGRlbGltID0gc3RkOjpmaW5kKHBvcywgbnMuZW5kKCksICcuJyk7CisgICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKHN0ZDo6c3RyaW5nKHBvcywgZGVsaW0pKSk7CisgICAgICBwb3MgPSBkZWxpbTsKKyAgICAgIGlmIChwb3MgPT0gbnMuZW5kKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3BvczsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kdWxlczsKKyAgfQorCisgIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOworICB2b2lkIGVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgdF9yYl9vZnN0cmVhbSBmX3R5cGVzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX2NvbnN0c187CisgIHRfcmJfb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVxdWlyZV9wcmVmaXhfOworCisgIC8qKiBJZiB0cnVlLCBhZGQgYSAicmVxdWlyZSAncnVieWdlbXMnIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW4tcmIgZmlsZS4gKi8KKyAgYm9vbCByZXF1aXJlX3J1YnlnZW1zXzsKKworICAvKiogSWYgdHJ1ZSwgZ2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuICovCisgIGJvb2wgbmFtZXNwYWNlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKworICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICByZXF1aXJlX3ByZWZpeF8gPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInJiIikpOworCisgICAgc3RyaW5nIGRpciA9IHJlcXVpcmVfcHJlZml4XzsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgZGlyLnN1YnN0cigwLCBsb2MpICsgIi8iOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLnJiIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX2NvbnN0YW50cy5yYiI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKworICBmX2NvbnN0c18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCAicmVxdWlyZSAnIgorICAgICAgICAgICAgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Cit9CisKKy8qKgorICogUmVuZGVycyB0aGUgcmVxdWlyZSBvZiB0aHJpZnQgaXRzZWxmLCBhbmQgcG9zc2libHkgb2YgdGhlIHJ1YnlnZW1zIGRlcGVuZGVuY3kuCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgeworICBpZiAocmVxdWlyZV9ydWJ5Z2Vtc18pIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3J1YnlnZW1zJ1xucmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3RocmlmdCdcbiI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jbHVkZWQgPSBpbmNsdWRlc1tpXTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4CisgICAgICAgICAgPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoaW5jbHVkZWQtPmdldF9uYW1lc3BhY2UoInJiIikpOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfbmFtZSA9IGluY2x1ZGVkLT5nZXRfbmFtZSgpOworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVkX25hbWUpICsgIl90eXBlcydcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7CisgICAgfQorICB9CisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXy5pbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCisgICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKKyAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgorICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7CisgICAgZl90eXBlc18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgaGFzaCBtYXBwaW5nIHZhbHVlcyBiYWNrIHRvIHRoZWlyIG5hbWVzIChhcyBzdHJpbmdzKSBzaW5jZSBydWJ5IGhhcyBubyBuYXRpdmUgZW51bQorICAvLyB0eXBlCisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxVRV9NQVAgPSB7IjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAorICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gUG9wdWxhdGUgdGhlIHNldAorICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpCisgICAgICBmX3R5cGVzXyA8PCAiLCAiOworICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOworCisgIGZfdHlwZXNfLmluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisKKyAgZl9jb25zdHNfLmluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZShmX2NvbnN0c18sIHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordF9yYl9vZnN0cmVhbSYgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiVxXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQuaW5kZW50KCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiU2V0Lm5ldyhbIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0pIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJdIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlICJmb3J3YXJkIGRlY2xhcmF0aW9ucyIgZm9yIHJ1Ynkgc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBzaW1wbHkgYSBkZWNsYXJhdGlvbiBvZiBlYWNoIGNsYXNzIHdpdGggcHJvcGVyIGluaGVyaXRhbmNlLgorICogVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdCBpcyBzdGlsbCBnZW5lcmF0ZWQgaW4gZ2VuZXJhdGVfc3RydWN0IGFzIGhhcworICogYWx3YXlzIGJlZW4gdGhlIGNhc2UuIFRoZXNlIGRlY2xhcmF0aW9ucyBhbGxvdyB0aHJpZnQgdG8gZ2VuZXJhdGUgdmFsaWQKKyAqIHJ1YnkgaW4gY2FzZXMgd2hlcmUgdGhyaWZ0IHN0cnVjdHMgcmVseSBvbiByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6VW5pb24iOworICB9CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOworICB9CisgIG91dCA8PCAiOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF91cCgpOworICBvdXQuaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpTdHJ1Y3QuZ2VuZXJhdGVfYWNjZXNzb3JzIHNlbGYiIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPT0gMSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKworICAgIGlmICgoKm1faXRlciktPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInN1cGVyKCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAobmFtZSAhPSAibWVzc2FnZSIpIHsKKyAgICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOworCisgICAgb3V0LmluZGVudCgpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dC5pbmRlbnQoKSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZG9jc3RyaW5ncyB3aXRoaW4gdGhlIEZJRUxEUyBjb25zdGFudC4gbm8gcmVhbCBiZXR0ZXIgcGxhY2UuLi4KKyAgICBnZW5lcmF0ZV9yZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT4gIjsKKworICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICB9CisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgc3RydWN0X2ZpZWxkczsgRklFTERTOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UpIHsKKyAgZmllbGRfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgLy8gQmVnaW4gdGhpcyBmaWVsZCdzIGRlZm4KKyAgb3V0IDw8ICJ7OnR5cGUgPT4gIiA8PCB0eXBlX3RvX2VudW0oZmllbGRfdHlwZSk7CisKKyAgaWYgKCFmaWVsZF9uYW1lLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiwgOm5hbWUgPT4gJyIgPDwgZmllbGRfbmFtZSA8PCAiJyI7CisgIH0KKworICBpZiAoZmllbGRfdmFsdWUgIT0gTlVMTCkgeworICAgIG91dCA8PCAiLCA6ZGVmYXVsdCA9PiAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKKyAgfQorCisgIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7CisgICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7CisgICAgfQorICB9CisKKyAgaWYgKG9wdGlvbmFsKSB7CisgICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKKyAgfQorCisgIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKKyAgfQorCisgIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIn0iOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgfQorfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7CisgIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLnJiIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgicmIiKSkKKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfCisgICAgICAgICAgICAgICAgIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7CisgICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlU2VuZFByb2MgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRfb25ld2F5X21lc3NhZ2UiIDogInNlbmRfbWVzc2FnZSI7CisKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8IG1lc3NhZ2VTZW5kUHJvYyA8PCAiKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gcmVjZWl2ZV9tZXNzYWdlKCIgPDwgcmVzdWx0bmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdW5sZXNzIHJlc3VsdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlByb2Nlc3NvciIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfLmluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIjo6IjsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIHByZWZpeCArPSAqbV9pdGVyICsgIjo6IjsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgdHlwZV9uYW1lKHR0eXBlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFJ1YnkgdHlvZQorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RyaW5nIHJiX25hbWVzcGFjZSkgeworICBzdHJpbmcgbmFtZXNwYWNlc19sZWZ0ID0gcmJfbmFtZXNwYWNlOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgc3RyaW5nIHBhdGhfcHJlZml4ID0gIiI7CisKKyAgd2hpbGUgKChsb2MgPSBuYW1lc3BhY2VzX2xlZnQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKDAsIGxvYykpICsgIi8iOworICAgIG5hbWVzcGFjZXNfbGVmdCA9IG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5hbWVzcGFjZXNfbGVmdC5zaXplKCkgPiAwKSB7CisgICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0KSArICIvIjsKKyAgfQorICByZXR1cm4gcGF0aF9wcmVmaXg7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Jkb2ModF9yYl9vZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgb3V0LmluZGVudCgpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIjICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSI7CisgICAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jvb2woKSkgeworICAgICAgICBvdXQgPDwgIiBpZiBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgdW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIKKyAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpCisgICAgICA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3QgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIiAgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIKKyAgICAgICAgICAgICAgICAgICA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KGdldF92YWx1ZSkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHJiLAorICAgICJSdWJ5IiwKKyAgICAiICAgIHJ1YnlnZW1zOiAgICAgICAgQWRkIGEgXCJyZXF1aXJlICdydWJ5Z2VtcydcIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIG5hbWVzcGFjZWQ6ICAgICAgR2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQzZDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCgiXG4iKTsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSgicmVzdWx0X3ZhbHVlIik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFJFU1VMVF9TVFJVQ1RfU1VGRklYKCJSZXN1bHQiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUlVTVF9SRVNFUlZFRF9XT1JEU1tdID0geworICAiYWJzdHJhY3QiLCAiYWxpZ25vZiIsICJhcyIsICJiZWNvbWUiLAorICAiYm94IiwgImJyZWFrIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKKyAgImNyYXRlIiwgImRvIiwgImVsc2UiLCAiZW51bSIsCisgICJleHRlcm4iLCAiZmFsc2UiLCAiZmluYWwiLCAiZm4iLAorICAiZm9yIiwgImlmIiwgImltcGwiLCAiaW4iLAorICAibGV0IiwgImxvb3AiLCAibWFjcm8iLCAibWF0Y2giLAorICAibW9kIiwgIm1vdmUiLCAibXV0IiwgIm9mZnNldG9mIiwKKyAgIm92ZXJyaWRlIiwgInByaXYiLCAicHJvYyIsICJwdWIiLAorICAicHVyZSIsICJyZWYiLCAicmV0dXJuIiwgIlNlbGYiLAorICAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN0cnVjdCIsCisgICJzdXBlciIsICJ0cmFpdCIsICJ0cnVlIiwgInR5cGUiLAorICAidHlwZW9mIiwgInVuc2FmZSIsICJ1bnNpemVkIiwgInVzZSIsCisgICJ2aXJ0dWFsIiwgIndoZXJlIiwgIndoaWxlIiwgInlpZWxkIgorfTsKK2NvbnN0IHNldDxzdHJpbmc+IFJVU1RfUkVTRVJWRURfV09SRFNfU0VUKAorICBSVVNUX1JFU0VSVkVEX1dPUkRTLAorICBSVVNUX1JFU0VSVkVEX1dPUkRTICsgc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFMpL3NpemVvZihSVVNUX1JFU0VSVkVEX1dPUkRTWzBdKQorKTsKKworc3RhdGljIGNvbnN0IHN0cmluZyBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMoIjxJUCwgT1A+Iik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTKCJ3aGVyZSBJUDogVElucHV0UHJvdG9jb2wsIE9QOiBUT3V0cHV0UHJvdG9jb2wiKTsKKworLy8gRklYTUU6IGV4dHJhY3QgY29tbW9uIFRNZXNzYWdlSWRlbnRpZmllciBmdW5jdGlvbgorLy8gRklYTUU6IGhhdmUgdG9fcnVzdF90eXBlIGRlYWwgd2l0aCBPcHRpb24KKworY2xhc3MgdF9yc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3JzX2dlbmVyYXRvcigKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmCisgICkgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgZ2VuX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCitwcml2YXRlOgorICAvLyBzdHJ1Y3QgdHlwZQorICAvLyBUX1JFR1VMQVI6IHVzZXItZGVmaW5lZCBzdHJ1Y3QgaW4gdGhlIElETAorICAvLyBUX0FSR1M6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCBwYXJhbWV0ZXJzCisgIC8vIFRfUkVTVUxUOiBzdHJ1Y3QgdXNlZCB0byBob2xkIGFsbCBzZXJ2aWNlLWNhbGwgcmV0dXJucyBhbmQgZXhjZXB0aW9ucworICAvLyBUX0VYQ0VQVElPTjogdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiBpbiB0aGUgSURMCisgIGVudW0gZV9zdHJ1Y3RfdHlwZSB7IFRfUkVHVUxBUiwgVF9BUkdTLCBUX1JFU1VMVCwgVF9FWENFUFRJT04gfTsKKworICAvLyBEaXJlY3RvcnkgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgc3RyaW5nIGdlbl9kaXJfOworCisgIC8vIEZpbGUgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2dlbl87CisKKyAgLy8gV3JpdGUgdGhlIGNvbW1vbiBjb21waWxlciBhdHRyaWJ1dGVzIGFuZCBtb2R1bGUgaW5jbHVkZXMgdG8gdGhlIHRvcCBvZiB0aGUgYXV0by1nZW5lcmF0ZWQgZmlsZS4KKyAgdm9pZCByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKKworICAvLyBDcmVhdGUgdGhlIGNsb3N1cmUgb2YgUnVzdCBtb2R1bGVzIHJlZmVyZW5jZWQgYnkgdGhpcyBzZXJ2aWNlLgorICB2b2lkIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXModF9zZXJ2aWNlICp0c2VydmljZSwgc2V0PHN0cmluZz4gJnJlZmVyZW5jZWRfbW9kdWxlcyk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4KKyAgdm9pZCByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpdHMgbmVjZXNzYXJ5IHRvIGNvbnZlcnQgYW4gZW51bSB0by9mcm9tIGFuIGkzMi4KKyAgdm9pZCByZW5kZXJfZW51bV9jb252ZXJzaW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4gVGhpcyBpbmNsdWRlcyBtZXRob2RzCisgIC8vIHRvIHdyaXRlIHRoZSBlbnVtIHRvIGEgcHJvdG9jb2wsIHJlYWQgaXQgZnJvbSBhIHByb3RvY29sLCBldGMuCisgIHZvaWQgcmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgYSBzaW1wbGUgcnVzdCBjb25zdCB2YWx1ZSAoaWUuIGBwdWIgY29uc3QgRk9POiBmb28uLi5gKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3RhbnQgbGlzdCwgc2V0LCBtYXAgb3Igc3RydWN0LiBUaGVzZSBjb25zdGFudHMgcmVxdWlyZSBhbGxvY2F0aW9uIGFuZCBjYW5ub3QgYmUgZGVmaW5lZAorICAvLyB1c2luZyBhICdwdWIgY29uc3QnLiBBcyBhIHJlc3VsdCwgSSBjcmVhdGUgYSBob2xkZXIgc3RydWN0IHdpdGggYSBzaW5nbGUgYGNvbnN0X3ZhbHVlYCBtZXRob2QgdGhhdAorICAvLyByZXR1cm5zIHRoZSBpbml0aWFsaXplZCBpbnN0YW5jZS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGNvbnN0IHZhbHVlIC0gdGhlIHJpZ2h0IHNpZGUgb2YgYSBjb25zdCBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUsIGJvb2wgaXNfb3duZWQgPSB0cnVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHN0cnVjdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3N0cnVjdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbGlzdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHNldCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3NldCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbWFwIChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gaW5zZXJ0IGNvbnN0YW50IHZhbHVlcyBpbnRvIGEgcnVzdCB2ZWMgb3Igc2V0LiBUaGUKKyAgLy8gYGluc2VydF9mdW5jdGlvbmAgaXMgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCB3ZSdsbCB1c2UgdG8gaW5zZXJ0IHRoZSBlbGVtZW50cy4KKyAgdm9pZCByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKAorICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICAgIHRfdHlwZSogdHR5cGUsCisgICAgdF9jb25zdF92YWx1ZSogdHZhbHVlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgc3RydWN0IHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gU2V0IGBzdHJ1Y3RfdHlwZWAgdG8gYFRfQVJHU2AKKyAgLy8gaWYgcmVuZGVyaW5nIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIGFyZ3VtZW50cyBmb3IgYSBzZXJ2aWNlIGNhbGwuIFdoZW4gYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYCB0aGUKKyAgLy8gc3RydWN0IGFuZCBpdHMgbWVtYmVycyBoYXZlIG1vZHVsZSB2aXNpYmlsaXR5LCBhbmQgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQuIFdoZW4gYHN0cnVjdF90eXBlYCBpcworICAvLyBhbnl0aGluZyBlbHNlIHRoZSBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgcHVibGljIHZpc2liaWxpdHkgYW5kIGZpZWxkcyBoYXZlIHRoZSB2aXNpYmlsaXR5IHNldAorICAvLyBpbiB0aGVpciBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3QoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgY29tbWVudCBibG9jayBwcmVjZWRpbmcgYSB0eXBlIGRlZmluaXRpb24gKGFuZCBpbXBsZW1lbnRhdGlvbikuCisgIHZvaWQgcmVuZGVyX3R5cGVfY29tbWVudChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QuIFN1cHBvcnRzIGFyZ3VtZW50IHN0cnVjdHMsIHJlc3VsdCBzdHJ1Y3RzLAorICAvLyB1c2VyLWRlZmluZWQgc3RydWN0cyBhbmQgZXhjZXB0aW9uIHN0cnVjdHMuIFRoZSBleGFjdCBzdHJ1Y3QgdHlwZSB0byBiZSBnZW5lcmF0ZWQgaXMgY29udHJvbGxlZAorICAvLyBieSB0aGUgYHN0cnVjdF90eXBlYCBwYXJhbWV0ZXIsIHdoaWNoIChhbW9uZyBvdGhlciB0aGluZ3MpIG1vZGlmaWVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQorICAvLyB3cml0dGVuIHN0cnVjdCBhbmQgbWVtYmVycywgY29udHJvbHMgd2hpY2ggdHJhaXQgaW1wbGVtZW50YXRpb25zIGFyZSBnZW5lcmF0ZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBXcml0ZXMgdGhlIGltcGwgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc3RydWN0LiBBdCBtaW5pbXVtIHRoaXMKKyAgLy8gY29udGFpbnMgdGhlIG1ldGhvZHMgdG8gcmVhZCBmcm9tIGEgcHJvdG9jb2wgYW5kIHdyaXRlIHRvIGEgcHJvdG9jb2wuIEFkZGl0aW9uYWwgbWV0aG9kcyBtYXkKKyAgLy8gYmUgZ2VuZXJhdGVkIGRlcGVuZGluZyBvbiBgc3RydWN0X3R5cGVgLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfaW1wbCgKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gR2VuZXJhdGUgYSBgZm4gbmV3KC4uLilgIGZvciBhIHN0cnVjdCB3aXRoIG5hbWUgYHN0cnVjdF9uYW1lYCBhbmQgdHlwZSBgdF9zdHJ1Y3RgLiBUaGUgYXV0by1nZW5lcmF0ZWQKKyAgLy8gY29kZSBtYXkgaW5jbHVkZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB0byBtYWtlIHRoZSBjb25zdHJ1Y3RvciBtb3JlIGVyZ29ub21pYy4gYHN0cnVjdF90eXBlYCBjb250cm9scworICAvLyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlIHRoZSBgb2tfb3JgIG1ldGhvZCBhZGRlZCB0byBhbGwgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXN1bHQgc3RydWN0cy4gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QKKyAgLy8gdG8gY29udmVydCBhIHN0cnVjdCBpbnRvIGEgYFJlc3VsdGAgYW5kIHVzZSBpdCBpbiBhIGB0cnkhYCBvciBjb21iaW5hdG9yIGNoYWluLgorICB2b2lkIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRXJyb3JgIGFuZCBgRGVidWdgIHRyYWl0cy4gVGhlc2UgdHJhaXRzIGFyZSBuZWNlc3NhcnkgZm9yIGEKKyAgLy8gdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiB0byBiZSBwcm9wZXJseSBoYW5kbGVkIGFzIFJ1c3QgZXJyb3JzLgorICB2b2lkIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgYERlZmF1bHRgLiBUaGlzIHRyYWl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBvbmx5IHRoZSBmaWVsZHMgeW91IHdhbnQKKyAgLy8gYW5kIHVzZSBgLi5EZWZhdWx0OjpkZWZhdWx0KClgIHRvIGZpbGwgaW4gdGhlIHJlc3QuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzdHJ1Y3QgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AKKyAgLy8gdGhlbiBhbGwgZmllbGRzIGFyZSBjb25zaWRlcmVkICJyZXF1aXJlZCIsIGlmIG5vdCwgdGhlIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHN0cnVjdCBmaWVsZCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gVW5wYWNrcyB0aGUKKyAgLy8gdmFyaWFibGUgKHNpbmNlIGl0IG1heSBiZSBvcHRpb25hbCkgYW5kIHNlcmlhbGl6ZXMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25hbGl0eSBydWxlcyByZXF1aXJlZCBieSBgcmVxYC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBmaWVsZF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgKKyAgICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgICAgdF9maWVsZCAqdGZpZWxkLAorICAgIHRfZmllbGQ6OmVfcmVxIHJlcSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gYSBpMzIgZXRjLikgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgdHlwZV92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgYm9vbCB0eXBlX3Zhcl9pc19yZWYsIHRfdHlwZSAqdHR5cGUpOworCisgIC8vIFdyaXRlIGEgbGlzdCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbGlzdF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGxpc3QKKyAgLy8gdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBsaXN0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX2xpc3Rfc3luY193cml0ZShjb25zdCBzdHJpbmcgJmxpc3RfdmFyLCBib29sIGxpc3RfdmFyX2lzX3JlZiwgdF9saXN0ICp0bGlzdCk7CisKKyAgLy8gV3JpdGUgYSBzZXQgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYHNldF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHNldCB0aGF0IHdpbGwKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYHNldF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnNldF92YXIsIGJvb2wgc2V0X3Zhcl9pc19yZWYsIHRfc2V0ICp0c2V0KTsKKworICAvLyBXcml0ZSBhIG1hcCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbWFwX3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbWFwIHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgbWFwX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRzZXQpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aHMgdHlwZSB3aGVuIHdyaXRpbmcgYW4gZWxlbWVudCBmcm9tIGEgY29udGFpbmVyLgorICAvLyBJdGVyYXRpb25zIG9uIHJ1c3QgY29udGFpbmVycyBhcmUgcGVyZm9ybWVkIGFzIGZvbGxvd3M6IGBmb3IgdiBpbiAmdmFsdWVzIHsgLi4uIH1gCisgIC8vIHdoZXJlIGB2YCBoYXMgdHlwZSBgJlJVU1RfVFlQRWAgQWxsIGRlZmluZWQgZnVuY3Rpb25zIHRha2UgcHJpbWl0aXZlcyBieSB2YWx1ZSwgc28sIGlmIHRoZQorICAvLyByZW5kZXJlZCBjb2RlIGlzIGNhbGxpbmcgc3VjaCBhIGZ1bmN0aW9uIGl0IGhhcyB0byBkZXJlZmVyZW5jZSBgdmAuCisgIGJvb2wgbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFibGUgKGluY2x1ZGluZyBhbGwgZGVyZWZlcmVuY2VzKSByZXF1aXJlZCB0byB3cml0ZSB2YWx1ZXMgZnJvbSBhIHJ1c3QgY29udGFpbmVyCisgIC8vIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2VyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGNvbnRhaW5lciBhbmQgdXNpbmcgdGhlIHRlbXAKKyAgLy8gdmFyaWFibGUgYHZgIHRvIHJlcHJlc2VudCBlYWNoIGVsZW1lbnQsIHRoZW4gYHR0eXBlYCBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lciBhbmQKKyAgLy8gYGJhc2VfdmFyYCBpcyAidiIuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcgeW91IHdpbGwgaGF2ZSB0byB1c2UgdG8gcHJvcGVybHkgcmVmZXJlbmNlCisgIC8vIHRoZSB0ZW1wIHZhcmlhYmxlIGZvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIHN0cmluZyBzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgd2lyZSBpbnRvIHRoZSBnaXZlbiBgdF9zdHJ1Y3RgLiBgc3RydWN0X25hbWVgIGlzIHRoZQorICAvLyBhY3R1YWwgUnVzdCBuYW1lIG9mIHRoZSBgdF9zdHJ1Y3RgLiBJZiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZW4gYWxsIHN0cnVjdCBmaWVsZHMgYXJlCisgIC8vIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQncyBkZWZhdWx0IG9wdGlvbmFsaXR5IGlzIHVzZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHNpbmdsZSB0eXBlIChpLmUuIGkzMiBldGMuKSBmcm9tIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAvLyBTZXQgYGlzX2JveGVkYCB0byBgdHJ1ZWAgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIGBCb3g6Om5ldyguLi4pYC4KKyAgdm9pZCByZW5kZXJfdHlwZV9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgdF90eXBlICp0dHlwZSwgYm9vbCBpc19ib3hlZCA9IGZhbHNlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIGxpc3QgaXMgc3RvcmVkIGluIGBsaXN0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcmlhYmxlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgc2V0IGlzIHN0b3JlZCBpbiBgc2V0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBtYXAgaXMgc3RvcmVkIGluIGBtYXBfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXJpYWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdmFsdWVzIHdoZW4gZGVzZXJpYWxpemluZyBuZXN0ZWQgY29udGFpbmVycy4KKyAgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIHRocmlmdCB1bmlvbiAoaS5lLiBhbiBlbnVtKS4KKyAgdm9pZCByZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZW51bSBpbXBsICh3aXRoIHJlYWQvd3JpdGUgZnVuY3Rpb25zKSBmb3IgdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OndyaXRlX3RvX291dF9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGBFTlVNOjpyZWFkX2Zyb21faW5fcHJvdG9jb2xgIGZ1bmN0aW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHZhcmlvdXMgcmVuZGVyIGZ1bmN0aW9ucyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24KKyAgLy8gb2YgYSBUaHJpZnQgY2xpZW50LgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgdHJhaXQgd2l0aCB0aGUgc2VydmljZS1jYWxsIG1ldGhvZHMgZm9yIGB0c2VydmljZWAuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY2xpZW50IGltcGwgaWYgZW5kIHVzZXJzIGNhbiB1c2UgaXQgdG8gbWFrZSBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudCBzdHJ1Y3QgYW5kIGl0cyBtYXRjaGluZyAnaW1wbCcgYmxvY2suCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGBTeW5jQ2xpZW50OjpuZXdgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIGFueSBvdGhlciBmdW5jdGlvbnMKKyAgLy8gY2FsbGVycyB3b3VsZCBsaWtlIHRvIHVzZSBvbiB0aGUgVGhyaWZ0IHNlcnZpY2Ugc3luYyBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGltcGwgYmxvY2sgZm9yIHRoZSBgVFRocmlmdENsaWVudGAgdHJhaXQuIFNpbmNlIGdlbmVyYXRlZAorICAvLyBSdXN0IFRocmlmdCBjbGllbnRzIHBlcmZvcm0gYWxsIHRoZWlyIG9wZXJhdGlvbnMgdXNpbmcgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgdHJhaXQsIHdlCisgIC8vIGhhdmUgdG8gaW1wbGVtZW50IGl0IGZvciB0aGUgY2xpZW50IHN0cnVjdHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjb25zdCBzdHJpbmcgJmNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBtYXJrZXIgdHJhaXRzIGZvciBhbnkgc2VydmljZShzKSBiZWluZyBleHRlbmRlZCwgaW5jbHVkaW5nIHRoZSBvbmUgZm9yIHRoZSBjdXJyZW50CisgIC8vIHNlcnZpY2UgaXRzZWxmIChpLmUuIGB0c2VydmljZWApCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBjb25zdCBzdHJpbmcgJmltcGxfc3RydWN0X25hbWUpOworCisgIC8vIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgdGhlIHRyYWl0cyB0aGlzIFRocmlmdCBjbGllbnQgc3RydWN0IGV4dGVuZHMuCisgIHN0cmluZyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIHRoZSBjb2RlIHRvIG1ha2UgdGhlIFRocmlmdCBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0IGNhbGxzIG91dCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzcG9uc2UuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlIHRoZSBgc2VuZGAgZnVuY3Rpb25hbGl0eSBmb3IgYSBUaHJpZnQgc2VydmljZSBjYWxsIHJlcHJlc2VudGVkIGJ5IGEgYHRfc2VydmljZS0+dF9mdW5jdGlvbmAuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGByZWN2YCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgLy8gVGhpcyBtZXRob2QgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgZnVuY3Rpb24gaXMgKm5vdCogb25ld2F5LgorICB2b2lkIHJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKTsKKyAgdm9pZCByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3Zhcik7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgc3RyaW5nIGhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZXMgdGhlIHJlc3VsdCBvZiBgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3RgIHdyYXBwZWQgaW4gYW4gYEVycih0aHJpZnQ6OkVycm9yKC4uLikpYC4KKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFdyaXRlIGEgdGhyaWZ0OjpFcnJvciB2YXJpYW50IHN0cnVjdC4gRXJyb3Igc3RydWN0cyB0YWtlIHRoZSBmb3JtOgorICAvLyBgYGAKKyAgLy8gcHViIHN0cnVjdCBlcnJvcl9zdHJ1Y3QgeworICAvLyAgIGtpbmQ6IHN1Yl9lcnJvcl9raW5kLAorICAvLyAgIG1lc3NhZ2U6IGVycm9yX21lc3NhZ2UsCisgIC8vIH0KKyAgLy8gYGBgCisgIC8vIEEgY29uY3JldGUgZXhhbXBsZSBpczoKKyAgLy8gYGBgCisgIC8vICBwdWIgc3RydWN0IEFwcGxpY2F0aW9uRXJyb3IgeworICAvLyAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgLy8gICAgbWVzc2FnZTogIlRoaXMgaXMgc29tZSBlcnJvciBtZXNzYWdlIiwKKyAgLy8gIH0KKyAgLy8gYGBgCisgIHZvaWQgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKyAgKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIHVucGFja2VkIHNlcnZpY2UgY2FsbCBhcmdzIGdpdmVuIGEgc2VydmljZSBjYWxsIGZ1bmN0aW9uCisgIC8vIGB0X2Z1bmN0aW9uYC4gUHJlcGVuZHMgdGhlIGFyZ3Mgd2l0aCBlaXRoZXIgYCZtdXQgc2VsZmAgb3IgYCZzZWxmYCBhbmQgaW5jbHVkZXMgdGhlIGFyZyB0eXBlcworICAvLyBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLCBmb3IgZXhhbXBsZToKKyAgLy8gYGZuIGZvbygmbXV0IHNlbGYsIGZpZWxkXzA6IFN0cmluZylgLgorICBzdHJpbmcgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBzZWxmX2lzX211dGFibGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBPbmx5IGluY2x1ZGVzIHRoZSBhcmcgbmFtZXMsIGVhY2ggb2Ygd2hpY2ggaXMgcHJlZml4ZWQgd2l0aCB0aGUgb3B0aW9uYWwgcHJlZml4CisgIC8vIGBmaWVsZF9wcmVmaXhgLCBmb3IgZXhhbXBsZTogYHNlbGYuZmllbGRfMGAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4ID0gIiIpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAvLyBFYWNoIGZpZWxkIGlzIGZvbGxvd2VkIGJ5IGl0cyB0eXBlLCBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QgYHRzdHJ1Y3RgIGZvciB1c2UgaW4gYSBmdW5jdGlvbiBjYWxsLAorICAvLyBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gV3JpdGUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgc3RydWN0LCBzZXJ2aWNlLWNhbGwgb3Igb3RoZXIgZG9jdW1lbnRhdGlvbi1hbm5vdGF0ZWQgZWxlbWVudC4KKyAgdm9pZCByZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgdHJ1ZSB0eXBlIG9mIGB0dHlwZWAgaXMgYSB0aHJpZnQgZG91YmxlLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19kb3VibGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnVzdCB0eXBlIGdpdmVuIGEgYHRfdHlwZWAuCisgIHN0cmluZyB0b19ydXN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYGNvbnN0YCBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYAorICBzdHJpbmcgdG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCA9IHRydWUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJpZnQgYHByb3RvY29sOjpUVHlwZWAgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGEgc3RydWN0IGZpZWxkIHdoaWNoIGhhcyBgT1BUX0lOX1JFUV9PVVRgCisgIC8vIG9wdGlvbmFsaXR5LgorICBzdHJpbmcgb3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW4gd3JpdGUgYSBjb25zdCBvZiB0aGUgZm9ybSBgcHViIGNvbnN0IEZPTzogLi4uYC4KKyAgYm9vbCBjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgY2Fubm90IHdyaXRlIGEgc3RhbmRhcmQgUnVzdCBjb25zdGFudCAoYmVjYXVzZSB0aGUgdHlwZSBuZWVkcyBzb21lIGFsbG9jYXRpb24pLgorICBib29sIGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSB2b2lkLCBhbmQgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBydXN0IGAoKWAgdHlwZS4KKyAgYm9vbCBpc192b2lkKHRfdHlwZSogdHR5cGUpOworCisgIHRfZmllbGQ6OmVfcmVxIGFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIGB0X2ZpZWxkOjplX3JlcWAgaXMgZWl0aGVyIGB0X2ZpZWxkOjpUX09QVElPTkFMYCBvciBgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVGAKKyAgLy8gYW5kIG5lZWRzIHRvIGJlIHdyYXBwZWQgYnkgYW4gYE9wdGlvbjxUWVBFX05BTUU+YCwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBzZXJ2aWNlIGNhbGwgaGFzIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgYSBzZXJ2aWNlIGNhbGwgaGFzIG5vbi1gKClgIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgcHViIGAgKG5vdGljZSB0cmFpbGluZyB3aGl0ZXNwYWNlISkgaWYgdGhlIHN0cnVjdCBzaG91bGQgYmUgcHVibGljLCBgYCAoZW1wdHkgc3RyaW5nKSBvdGhlcndpc2UuCisgIHN0cmluZyB2aXNpYmlsaXR5X3F1YWxpZmllcih0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgc2VydmljZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIGEgZ2l2ZW4gVGhyaWZ0IHR5cGUuIElmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHByZXNlbnRseS1jb21wdXRlZAorICAvLyBUaHJpZnQgcHJvZ3JhbSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgIHN0cmluZyBydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3Qgc3RydWN0IHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3Rfc3RydWN0X25hbWUodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFJldHVybnMgdGhlIHNuYWtlLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZQorICAvLyBgdGZpZWxkLT5nZXRfbmFtZSgpYCBpcyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2FtZWwtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IHVuaW9uIHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBDb252ZXJ0cyBhbnkgdmFyaWFibGUgbmFtZSBpbnRvIGEgJ3NhZmUnIHZhcmlhbnQgdGhhdCBkb2VzIG5vdCBjbGFzaCB3aXRoIGFueSBSdXN0IHJlc2VydmVkIGtleXdvcmRzLgorICBzdHJpbmcgcnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBuYW1lIGlzIGEgcmVzZXJ2ZWQgUnVzdCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGludm9rZSB0byBtYWtlIG91dGdvaW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IHRvIGhhbmRsZSBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSBhcmd1bWVudHMgZm9yIHRoZSB0aHJpZnQgc2VydmljZSBjYWxsLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayB0aGUgcmV0dXJuIHZhbHVlCisgIC8vIGFuZCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHRyYWl0IG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IGdpdmVuIGEgYHRfc2VydmljZWAuCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgc3luYyBzZXJ2aWNlIGNsaWVudCBzdHJ1Y3QgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgZm9yIHRoZSBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgc2VydmljZS1jYWxsIGltcGxlbWVudGF0aW9ucyBmb3IKKyAgLy8gdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHZhcmlhbnQgbmFtZSBmb3IgYW4gZW51bSB2YXJpYW50CisgIHN0cmluZyBydXN0X2VudW1fdmFyaWFudF9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUHJvcGVybHkgdXBwZXJjYXNlIG5hbWVzIGZvciB1c2UgaW4gUnVzdC4KKyAgc3RyaW5nIHJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFNuYWtlLWNhc2UgZmllbGQsIHBhcmFtZXRlciBhbmQgZnVuY3Rpb24gbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gQ2FtZWwtY2FzZSB0eXBlL3ZhcmlhbnQgbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9jYW1lbF9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGBzZWFyY2hfc3RyaW5nYCB3aXRoIGByZXBsYWNlX3N0cmluZ2AgaW4gYHRhcmdldGAuCisgIHZvaWQgc3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZyk7Cit9OworCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gbWFrZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGlzIHRocmlmdCBwcm9ncmFtCisgIE1LRElSKGdlbl9kaXJfLmNfc3RyKCkpOworCisgIC8vIGNyZWF0ZSB0aGUgZmlsZSBpbnRvIHdoaWNoIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZQorICBzdHJpbmcgZl9nZW5fbmFtZSA9IGdlbl9kaXJfICsgIi8iICsgcnVzdF9zbmFrZV9jYXNlKGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIi5ycyI7CisgIGZfZ2VuXy5vcGVuKGZfZ2VuX25hbWUuY19zdHIoKSk7CisKKyAgLy8gaGVhZGVyIGNvbW1lbnQKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IGF1dG9nZW5fc3VtbWFyeSgpIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgcmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpIHsKKyAgLy8gdHVybiBvZmYgc29tZSBjb21waWxlci9jbGlwcHkgd2FybmluZ3MKKworICAvLyBjb2RlIGFsd2F5cyBpbmNsdWRlcyBCVHJlZU1hcC9CVHJlZVNldC9PcmRlcmVkRmxvYXQKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfaW1wb3J0cyldIiA8PCBlbmRsOworICAvLyBjb2RlIG1pZ2h0IG5vdCBpbmNsdWRlIGltcG9ydHMgZnJvbSBjcmF0ZXMKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfZXh0ZXJuX2NyYXRlcyldIiA8PCBlbmRsOworICAvLyBjb25zdHJ1Y3RvcnMgdGFrZSAqYWxsKiBzdHJ1Y3QgcGFyYW1ldGVycywgd2hpY2ggY2FuIHRyaWdnZXIgdGhlICJ0b28gbWFueSBhcmd1bWVudHMiIHdhcm5pbmcKKyAgLy8gc29tZSBhdXRvLWdlbidkIHR5cGVzIGNhbiBiZSBkZWVwbHkgbmVzdGVkLiBjbGlwcHkgcmVjb21tZW5kcyBmYWN0b3JpbmcgdGhlbSBvdXQgd2hpY2ggaXMgaGFyZCB0byBhdXRvZ2VuCisgIGZfZ2VuXyA8PCAiIyFbY2ZnX2F0dHIoZmVhdHVyZSA9IFwiY2FyZ28tY2xpcHB5XCIsIGFsbG93KHRvb19tYW55X2FyZ3VtZW50cywgdHlwZV9jb21wbGV4aXR5KSldIiA8PCBlbmRsOworICAvLyBwcmV2ZW50IHJ1c3RmbXQgZnJvbSBydW5uaW5nIGFnYWluc3QgdGhpcyBmaWxlCisgIC8vIGxpbmVzIGFyZSB0b28gbG9uZywgY29kZSBpcyAodGhhbmtmdWxseSEpIG5vdCB2aXN1YWwtaW5kZW50ZWQsIGV0Yy4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10X3NraXApXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0aHJpZnQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0cnlfZnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBvcmRlcmVkX2Zsb2F0OjpPcmRlcmVkRmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNlbGw6OlJlZkNlbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29udmVydDo6RnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZXJyb3I6OkVycm9yOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpmbXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OnJjOjpSYzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRyeV9mcm9tOjpUcnlGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZCwgVFRocmlmdENsaWVudH07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEZpZWxkSWRlbnRpZmllciwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6ZmllbGRfaWQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgYWxsIHRoZSBwcm9ncmFtIGluY2x1ZGVzCisgIC8vIE5PVEU6IHRoaXMgaXMgbW9yZSBpbnZvbHZlZCB0aGFuIHlvdSB3b3VsZCBleHBlY3QgYmVjYXVzZSBvZiBzZXJ2aWNlIGV4dGVuc2lvbgorICAvLyBCYXNpY2FsbHksIEkgaGF2ZSB0byBmaW5kIHRoZSBjbG9zdXJlIG9mIGFsbCB0aGUgc2VydmljZXMgYW5kIGluY2x1ZGUgdGhlaXIgbW9kdWxlcyBhdCB0aGUgdG9wLWxldmVsCisKKyAgc2V0PHN0cmluZz4gcmVmZXJlbmNlZF9tb2R1bGVzOworCisgIC8vIGZpcnN0LCBzdGFydCBieSBhZGRpbmcgZXhwbGljaXQgdGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IGdldF9wcm9ncmFtKCktPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGluY2x1ZGVzX2l0ZXI7CisgIGZvcihpbmNsdWRlc19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jbHVkZXNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNsdWRlc19pdGVyKSB7CisgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydCgoKmluY2x1ZGVzX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIC8vIG5leHQsIHJlY3Vyc2l2ZWx5IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHNlcnZpY2VzIGFuZCBhZGQgdGhlIG5hbWVzIG9mIGFueSBwcm9ncmFtcyB0aGV5IHJlZmVyZW5jZQorICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBnZXRfcHJvZ3JhbSgpLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBzZXJ2aWNlX2l0ZXI7CisgIGZvciAoc2VydmljZV9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc2VydmljZV9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2VfaXRlcikgeworICAgIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoKnNlcnZpY2VfaXRlciwgcmVmZXJlbmNlZF9tb2R1bGVzKTsKKyAgfQorCisgIC8vIGZpbmFsbHksIHdyaXRlIGFsbCB0aGUgInB1YiB1c2UuLi4iIGRlY2xhcmF0aW9ucworICBpZiAoIXJlZmVyZW5jZWRfbW9kdWxlcy5lbXB0eSgpKSB7CisgICAgc2V0PHN0cmluZz46Oml0ZXJhdG9yIG1vZHVsZV9pdGVyOworICAgIGZvciAobW9kdWxlX2l0ZXIgPSByZWZlcmVuY2VkX21vZHVsZXMuYmVnaW4oKTsgbW9kdWxlX2l0ZXIgIT0gcmVmZXJlbmNlZF9tb2R1bGVzLmVuZCgpOyArK21vZHVsZV9pdGVyKSB7CisgICAgICBmX2dlbl8gPDwgInVzZSAiIDw8IHJ1c3Rfc25ha2VfY2FzZSgqbW9kdWxlX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKAorICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzCispIHsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgaWYgKGV4dGVuZHMtPmdldF9wcm9ncmFtKCkgIT0gZ2V0X3Byb2dyYW0oKSkgeworICAgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydChleHRlbmRzLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyhleHRlbmRzLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9nZW5fLmNsb3NlKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb25zdHMKKy8vCisvLyBOT1RFOiBjb25zaWRlciB1c2luZyBtYWNyb3MgdG8gZ2VuZXJhdGUgY29uc3RhbnRzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIHdvcnNlIHRoYW4gaXQgc2hvdWxkIGJlIGJlY2F1c2UgY29uc3RhbnRzCisvLyBhcmVuJ3QgKHNlbnNpYmx5KSBsaW1pdGVkIHRvIHNjYWxhciB0eXBlcwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X3R5cGUqIHR0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmIChjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmIChjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIobmFtZSwgdHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCBmb3IgIiArIG5hbWU7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGlmICghY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0dHlwZSkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHNpbXBsZSBydXN0IGNvbnN0YW50IGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBmX2dlbl8gPDwgInB1YiBjb25zdCAiIDw8IHJ1c3RfdXBwZXJfY2FzZShuYW1lKSA8PCAiOiAiIDw8IHRvX3J1c3RfY29uc3RfdHlwZSh0dHlwZSkgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlLCBmYWxzZSk7CisgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3RhbnQgaG9sZGVyIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgaG9sZGVyX25hbWUoIkNvbnN0IiArIHJ1c3RfY2FtZWxfY2FzZShuYW1lKSk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgc3RydWN0ICIgPDwgaG9sZGVyX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IGhvbGRlcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gY29uc3RfdmFsdWUoKSAtPiAiIDw8IHRvX3J1c3RfdHlwZSh0dHlwZSkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI8PCAgIi50b19vd25lZCgpLmludG9fYnl0ZXMoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiLnRvX293bmVkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCAiT3JkZXJlZEZsb2F0Ojpmcm9tKCIgPDwgdHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIiBhcyBmNjQpIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IHZhbHVlIGZvciAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGdldF90cnVlX3R5cGUodHR5cGUpLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgdG9fcnVzdF90eXBlKHR0eXBlKQorICAgICAgPDwgIjo6dHJ5X2Zyb20oIgorICAgICAgPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpCisgICAgICA8PCAiKS5leHBlY3QoXCJleHBlY3RpbmcgdmFsaWQgY29uc3QgdmFsdWVcIikiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlbmRlcl9jb25zdF9zdHJ1Y3QodHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9saXN0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICByZW5kZXJfY29uc3Rfc2V0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZW5kZXJfY29uc3RfbWFwKHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGNvbnRhaW5lciB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqKSB7CisgIGlmICgoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ1bmltcGxlbWVudGVkISgpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgbDogVmVjPCIgPDwgdG9fcnVzdF90eXBlKGVsZW1fdHlwZSkgPDwgIj4gPSBWZWM6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoImwucHVzaCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgczogQlRyZWVTZXQ8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IEJUcmVlU2V0OjpuZXcoKTsiIDw8IGVuZGw7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvcihlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogZWxlbV92YWx1ZSA9ICgqZWxlbV9pdGVyKTsKKyAgICByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKCJzLmluc2VydCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgbTogQlRyZWVNYXA8IgorICAgIDw8IHRvX3J1c3RfdHlwZShrZXlfdHlwZSkgPDwgIiwgIiA8PCB0b19ydXN0X3R5cGUodmFsX3R5cGUpCisgICAgPDwgIj4gPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IgKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBrZXlfdmFsdWUgPSBlbGVtX2l0ZXItPmZpcnN0OworICAgIHRfY29uc3RfdmFsdWUqIHZhbF92YWx1ZSA9IGVsZW1faXRlci0+c2Vjb25kOworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGtleV90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBrID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZXRfdHJ1ZV90eXBlKHZhbF90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCB2ID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCAgaW5kZW50KCkgPDwgIm0uaW5zZXJ0KGssIHYpOyIgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICB0X3R5cGUqIHR0eXBlLAorICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKykgeworICBpZiAoZ2V0X3RydWVfdHlwZSh0dHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICAgIGZfZ2VuXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUeXBlZGVmcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbF90eXBlID0gdG9fcnVzdF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHlwZSAiIDw8IHJ1c3Rfc2FmZV9uYW1lKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgYWN0dWFsX3R5cGUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRW51bXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgZW51bV9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZW51bS0+Z2V0X25hbWUoKSkpOworICByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRlbnVtLCBlbnVtX25hbWUpOworICByZW5kZXJfZW51bV9pbXBsKGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odGVudW0sIGVudW1fbmFtZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGVudW0pOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHZhbCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpCisgICAgICA8PCAiID0gIgorICAgICAgPDwgdmFsLT5nZXRfdmFsdWUoKQorICAgICAgPDwgIiwiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCpzZWxmIGFzIGkzMikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBlbnVtX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBlbnVtX3ZhbHVlID0gaV9wcm90LnJlYWRfaTMyKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVudW1fbmFtZSA8PCAiOjp0cnlfZnJvbShlbnVtX3ZhbHVlKSI7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgZl9nZW5fIDw8ICJpbXBsIFRyeUZyb208aTMyPiBmb3IgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInR5cGUgRXJyID0gdGhyaWZ0OjpFcnJvcjsiOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gdHJ5X2Zyb20oaTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY29uc3RhbnRzX2l0ZXI7CisgIGZvciAoY29uc3RhbnRzX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY29uc3RhbnRzX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NvbnN0YW50c19pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKmNvbnN0YW50c19pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiID0+IE9rKCIgPDwgZW51bV9uYW1lIDw8ICI6OiIgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJmb3JtYXQhKFwiY2Fubm90IGNvbnZlcnQgZW51bSBjb25zdGFudCB7fSB0byAiICsgZW51bV9uYW1lICsgIlwiLCBpKSIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTdHJ1Y3RzLCBVbmlvbnMgYW5kIEV4Y2VwdGlvbnMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHR4Y2VwdGlvbiksIHR4Y2VwdGlvbiwgdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgcmVuZGVyX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3N0cnVjdCgpKSB7CisgICAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpLCB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHN0cnVjdCBmb3IgZXhjZXB0aW9uIjsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0KAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICByZW5kZXJfdHlwZV9jb21tZW50KHN0cnVjdF9uYW1lKTsKKyAgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3RfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUiB8fCBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzdHJ1Y3QpOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkgPDwgInN0cnVjdCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgcnVzdF90eXBlID0gaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIG1lbWJlcik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgICAgIDw8IHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpIDw8ICI6ICIgPDwgcnVzdF90eXBlIDw8ICIsIgorICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcnJvcjo6RXJyb3IgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEVycm9yIGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8ICJyZW1vdGUgc2VydmljZSB0aHJldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOyAvLyB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBjb252ZXJ0OjpGcm9tIHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBGcm9tPCIgPDwgc3RydWN0X25hbWUgPDwgIj4gZm9yIHRocmlmdDo6RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZnJvbShlOiAiIDw8IHN0cnVjdF9uYW1lIDw8ICIpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBmbXQ6OkRpc3BsYXkgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIERpc3BsYXkgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbWVtYmVyc19pdGVyOworICAgIGlmICghaXNfb3B0aW9uYWwobWVtYmVyLT5nZXRfcmVxKCkpKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGhhc19yZXF1aXJlZF9maWVsZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZfZ2VuXyA8PCAiaW1wbCBEZWZhdWx0IGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQgKm1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBvcHRfaW5fcmVxX291dF92YWx1ZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9pbXBsKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3Ioc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVCkgeworICAgIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodHN0cnVjdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBidWlsZCB0aGUgY29udmVuaWVuY2UgdHlwZSBwYXJhbWV0ZXJzIHRoYXQgYWxsb3dzIHVzIHRvIHBhc3MgdW53cmFwcGVkIHZhbHVlcyB0byBhIGNvbnN0cnVjdG9yIGFuZAorICAvLyBoYXZlIHRoZW0gYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byBPcHRpb248dmFsdWU+CisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzOworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiLCAiOworICAgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiLCAiOworICAgICAgfQorICAgICAgZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgZ2VuZXJpY190eXBlX3F1YWxpZmllcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICI6IEludG88T3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4+IjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMuc3RyKCk7CisgIGlmICh0eXBlX3BhcmFtZXRlcl9zdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworICAgIHR5cGVfcGFyYW1ldGVyX3N0cmluZyA9ICI8IiArIHR5cGVfcGFyYW1ldGVyX3N0cmluZyArICI+IjsKKyAgfQorCisgIHN0cmluZyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcXVhbGlmaWVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcXVhbGlmaWVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9xdWFsaWZpZXJfc3RyaW5nID0gIndoZXJlICIgKyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgKyAiICI7CisgIH0KKworICAvLyBub3cgYnVpbGQgdGhlIGFjdHVhbCBjb25zdHJ1Y3RvciBhcmcgbGlzdAorICAvLyB3aGVuIHdlJ3JlIGJ1aWxkaW5nIHRoaXMgbGlzdCB3ZSBoYXZlIHRvIHVzZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgdHlwZSBuYW1lcworICAvLyBpZiBuZWNlc3NhcnkKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworICBmaXJzdF9hcmcgPSB0cnVlOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGFyZ19zdHJpbmcgPSBhcmdzLnN0cigpOworCisgIHN0cmluZyB2aXNpYmlsaXR5KHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eQorICAgIDw8ICJmbiBuZXciCisgICAgPDwgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nCisgICAgPDwgIigiCisgICAgPDwgYXJnX3N0cmluZworICAgIDw8ICIpIC0+ICIKKyAgICA8PCBzdHJ1Y3RfbmFtZQorICAgIDw8ICIgIgorICAgIDw8IHR5cGVfcXVhbGlmaWVyX3N0cmluZworICAgIDw8ICJ7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIi5pbnRvKCksIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gd2UgZG9uJ3QgdXNlIHRoZSBydXN0IHN0cnVjdCBuYW1lIGluIHRoaXMgbWV0aG9kLCBqdXN0IHRoZSBzZXJ2aWNlIGNhbGwgbmFtZQorICBzdHJpbmcgc2VydmljZV9jYWxsX25hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIC8vIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIHJlc3VsdAorICBzaXplX3QgaW5kZXggPSBzZXJ2aWNlX2NhbGxfbmFtZS5maW5kKFJFU1VMVF9TVFJVQ1RfU1VGRklYLCAwKTsKKyAgaWYgKGluZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgdGhyb3cgInJlc3VsdCBzdHJ1Y3QgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIiBtaXNzaW5nIHJlc3VsdCBzdWZmaXgiOworICB9IGVsc2UgeworICAgICBzZXJ2aWNlX2NhbGxfbmFtZS5yZXBsYWNlKGluZGV4LCA2LCAiIik7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBmaW5kIG91dCB3aGF0IHRoZSBjYWxsJ3MgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgd2FzCisgIHN0cmluZyBydXN0X3JldHVybl90eXBlID0gIigpIjsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmIChtZW1iZXItPmdldF9uYW1lKCkgPT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgcnVzdF9yZXR1cm5fdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gTk9URTogaWRlYWxseSBJIHdvdWxkIGdlbmVyYXRlIHRoZSBicmFuY2hlcyBhbmQgcmVuZGVyIHRoZW0gc2VwYXJhdGVseQorICAvLyBJIHRyaWVkIHRoaXMgaG93ZXZlciwgYW5kIHRoZSByZXN1bHRpbmcgY29kZSB3YXMgaGFyZGVyIHRvIHVuZGVyc3RhbmQKKyAgLy8gbWFpbnRhaW5pbmcgYSByZW5kZXJlZCBicmFuY2ggY291bnQgKHdoaWxlIGEgbGl0dGxlIHVnbHkpIGdvdCBtZSB0aGUKKyAgLy8gcmVuZGVyaW5nIEkgd2FudGVkIHdpdGggY29kZSB0aGF0IHdhcyByZWFzb25hYmx5IHVuZGVyc3RhbmRhYmxlCisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBva19vcihzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHJ1c3RfcmV0dXJuX3R5cGUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW50IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9IDA7CisKKyAgLy8gcmVuZGVyIHRoZSBleGNlcHRpb24gYnJhbmNoZXMKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmICh0ZmllbGQtPmdldF9uYW1lKCkgIT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgc3RyaW5nIGZpZWxkX25hbWUoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBicmFuY2hfc3RhdGVtZW50IDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoIiA8PCBmaWVsZF9uYW1lIDw8ICIudW53cmFwKCkpKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICByZW5kZXJlZF9icmFuY2hfY291bnQrKzsKKyAgICB9CisgIH0KKworICAvLyByZW5kZXIgdGhlIHJldHVybiB2YWx1ZSBicmFuY2hlcworICBpZiAocnVzdF9yZXR1cm5fdHlwZSA9PSAiKCkiKSB7CisgICAgaWYgKHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwKSB7CisgICAgICAvLyB3ZSBoYXZlIHRoZSB1bml0IHJldHVybiBhbmQgdGhpcyBzZXJ2aWNlIGNhbGwgaGFzIG5vIHVzZXItZGVmaW5lZAorICAgICAgLy8gZXhjZXB0aW9ucy4gdGhpcyBtZWFucyB0aGF0IHdlJ3ZlIGEgdHJpdmlhbCByZXR1cm4gKGhhcHBlbnMgd2l0aCBvbmV3YXlzKQorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuLCBidXQgdGhlcmUgYXJlIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgICAgICAvLyBpZiB3ZSd2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIHRoZSBkZWZhdWx0IHJldHVybiAoaS5lLiBjYWxsIHN1Y2Nlc3NmdWwpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiBzZWxmLiIgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLnVud3JhcCgpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhIHZhbGlkIHJldHVybiB2YWx1ZSAqb3IqIGEgdXNlciBleGNlcHRpb24KKyAgICAvLyB0aGVuIHdlJ3JlIGluIHRyb3VibGU7IHJldHVybiBhIGRlZmF1bHQgZXJyb3IKKyAgICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCIsCisgICAgICAiXCJubyByZXN1bHQgcmVjZWl2ZWQgZm9yICIgKyBzZXJ2aWNlX2NhbGxfbmFtZSArICJcIiIKKyAgICApOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHVuaW9uX25hbWUocnVzdF9zdHJ1Y3RfbmFtZSh0c3RydWN0KSk7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodW5pb25fbmFtZSk7CisgIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25faW1wbCh1bmlvbl9uYW1lLCB0c3RydWN0KTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX2RlZmluaXRpb24oY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmIChtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHJ1c3QgZW51bSB3aXRoIDAgbWVtYmVycyI7IC8vIG1heSBiZSB2YWxpZCB0aHJpZnQsIGJ1dCBpdCdzIGludmFsaWQgcnVzdAorICB9CisKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgInB1YiBlbnVtICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcl9pdGVyOworICBmb3IobWVtYmVyX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcl9pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUodGZpZWxkKQorICAgICAgPDwgIigiIDw8IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHVuaW9uX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICByZW5kZXJfdW5pb25fc3luY19yZWFkKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25fc3luY193cml0ZSh1bmlvbl9uYW1lLCB0c3RydWN0KTsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgV3JpdGUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSgKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgPDwgImZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHN0cnVjdCBtZW1iZXJzIHRvIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfdmFyKCJzZWxmLiIgKyBydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUobWVtYmVyX3ZhciwgZmFsc2UsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgc3RydWN0IGZvb3RlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBlbnVtIGZpZWxkIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAqc2VsZiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgdF90eXBlKiB0dHlwZSA9IG1lbWJlci0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyBtYXRjaF92YXIoKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpKSA/ICJmIiA6ICJyZWYgZiIpOworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKQorICAgICAgICA8PCAiKCIgPDwgbWF0Y2hfdmFyIDw8ICIpID0+IHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgiZiIsIHRydWUsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgYm9vbCBmaWVsZF92YXJfaXNfcmVmLAorICB0X2ZpZWxkICp0ZmllbGQsCisgIHRfZmllbGQ6OmVfcmVxIHJlcQorKSB7CisgIHRfdHlwZSogZmllbGRfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgb3N0cmluZ3N0cmVhbSBmaWVsZF9zdHJlYW07CisgIGZpZWxkX3N0cmVhbQorICAgIDw8ICJURmllbGRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8ICJcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZmllbGRfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIjsKKyAgc3RyaW5nIGZpZWxkX2lkZW50X3N0cmluZyA9IGZpZWxkX3N0cmVhbS5zdHIoKTsKKworICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgIHN0cmluZyBsZXRfdmFyKChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWFjdHVhbF90eXBlLT5pc19zdHJpbmcoKSkgPyAiZmxkX3ZhciIgOiAicmVmIGZsZF92YXIiKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGxldCBTb21lKCIgPDwgbGV0X3ZhciA8PCAiKSA9ICIgPDwgZmllbGRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIik/OyIgPDwgZW5kbDsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKCJmbGRfdmFyIiwgdHJ1ZSwgZmllbGRfdHlwZSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgZXh0cmFuZW91cyAnKCknCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIGVsc2UgYnJhbmNoCisgICAgaW5kZW50X3VwKCk7CisgICAgLyogRklYTUU6IHJldGhpbmsgaG93IEkgZGVhbCB3aXRoIE9QVF9JTl9SRVFfT1VUCisgICAgaWYgKHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9ICIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICI7IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICB9Ki8KKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoZmllbGRfdmFyLCBmaWVsZF92YXJfaXNfcmVmLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3Qgd3JpdGUgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgdG8gb3V0cHV0IHByb3RvY29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogeworICAgICAgc3RyaW5nIHJlZih0eXBlX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfYnl0ZXMoIiArIHJlZiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cmluZygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ib29sKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2k4KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMTYoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kzMigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTY0KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9kb3VibGUoIiArIHR5cGVfdmFyICsgIi5pbnRvKCkpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopIHR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgdHR5cGVkZWYtPmdldF90eXBlKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0eXBlX3ZhciArICIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyX21hcF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X21hcCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlcl9zZXRfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9zZXQgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyX2xpc3Rfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9saXN0ICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aHJvdyAiY2Fubm90IHdyaXRlIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigiCisgICAgPDwgIiZUTGlzdElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZWxlbV90eXBlKSA8PCAiLCAiCisgICAgPDwgbGlzdF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKGxpc3RfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBsaXN0X3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoZWxlbV90eXBlLCAiZSIpLCB0cnVlLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9saXN0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX3NldF9iZWdpbigiCisgICAgPDwgIiZUU2V0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBzZXRfdmFyIDw8ICIubGVuKCkgYXMgaTMyIiA8PCAiKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihzZXRfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBzZXRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3NldF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY193cml0ZShjb25zdCBzdHJpbmcgJm1hcF92YXIsIGJvb2wgbWFwX3Zhcl9pc19yZWYsIHRfbWFwICp0bWFwKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9tYXBfYmVnaW4oIgorICAgIDw8ICImVE1hcElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oa2V5X3R5cGUpIDw8ICIsICIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh2YWxfdHlwZSkgPDwgIiwgIgorICAgIDw8IG1hcF92YXIgPDwgIi5sZW4oKSBhcyBpMzIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKG1hcF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciAoaywgdikgaW4gIiA8PCByZWYgPDwgbWFwX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoa2V5X3R5cGUsICJrIiksIHRydWUsIGtleV90eXBlKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHZhbF90eXBlLCAidiIpLCB0cnVlLCB2YWxfdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21hcF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh0X3R5cGUqIHR0eXBlLCBjb25zdCBzdHJpbmcmIGJhc2VfdmFyKSB7CisgIGJvb2wgdHlwZV9uZWVkc19kZXJlZiA9IG5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0dHlwZSk7CisgIGJvb2wgdHlwZV9pc19kb3VibGUgPSBpc19kb3VibGUodHR5cGUpOworCisgIHN0cmluZyB3cml0ZV92YXJpYWJsZTsKKworICBpZiAodHlwZV9pc19kb3VibGUgJiYgdHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIigqIiArIGJhc2VfdmFyICsgIikiOworICB9IGVsc2UgaWYgKHR5cGVfbmVlZHNfZGVyZWYpIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9ICIqIiArIGJhc2VfdmFyOworICB9IGVsc2UgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gYmFzZV92YXI7CisgIH0KKworICByZXR1cm4gd3JpdGVfdmFyaWFibGU7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Om5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgU3RydWN0IFJlYWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKAorICAgIGNvbnN0IHN0cmluZyAmc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzOiBvbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIHN0cnVjdAorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtdXQgIiA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKG1lbWJlcikKKyAgICAgIDw8ICI6IE9wdGlvbjwiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI+ID0gIjsKKyAgICAgIGlmIChtZW1iZXJfcmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgZl9nZW5fIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIjsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJOb25lOyI7CisgICAgICB9CisgICAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgdGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpIDw8ICIgPSBTb21lKHZhbCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGRlZmF1bHQgY2FzZSAoc2tpcCBmaWVsZHMpCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3Quc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7IC8vIGZpbmlzaCBtYXRjaAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZmluaXNoIGxvb3AKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCk/OyIgPDwgZW5kbDsgLy8gcmVhZCBtZXNzYWdlIGZvb3RlciBmcm9tIHRoZSB3aXJlCisKKyAgLy8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdAorICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgaWYgKCFpc19vcHRpb25hbChyZXEpKSB7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHMoIgorICAgICAgICA8PCAiXCIiIDw8IHN0cnVjdF9uYW1lIDw8ICIuIiA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSA8PCAiXCIiCisgICAgICAgIDw8ICIsICIKKyAgICAgICAgPDwgIiYiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKQorICAgICAgICA8PCAiKT87IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgc3RydWN0CisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHt9OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZShydXN0X2ZpZWxkX25hbWUodGZpZWxkKSk7CisgICAgICBzdHJpbmcgZmllbGRfa2V5ID0gc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpOworICAgICAgaWYgKGlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGZpZWxkX25hbWUgPDwgIjogIiA8PCBmaWVsZF9rZXkgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8KKyAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiOiAiCisgICAgICAgICAgPDwgZmllbGRfa2V5CisgICAgICAgICAgPDwgIi5leHBlY3QoXCJhdXRvLWdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGNoZWNrZWQgZm9yIHByZXNlbmNlIG9mIHJlcXVpcmVkIGZpZWxkc1wiKSIKKyAgICAgICAgICA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHJldHVybiB0aGUgY29uc3RydWN0ZWQgdmFsdWUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHVuaW9uX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBob2xkIHRoZQorICAvLyBjb21wbGV0ZWQgdW5pb24gYXMgd2VsbCBhcyBhIGNvdW50IG9mIGZpZWxkcyByZWFkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCByZXQ6IE9wdGlvbjwiIDw8IHVuaW9uX25hbWUgPDwgIj4gPSBOb25lOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJlY2VpdmVkX2ZpZWxkX2NvdW50ID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgc3RydWN0IHByZWFtYmxlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgd2UndmUgcmVjZWl2ZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsb29wIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IGxvb3AKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gYnJlYWsgb3V0IGlmIHlvdSd2ZSBmb3VuZCB0aGUgU3RvcCBmaWVsZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9IGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIG5vdyByZWFkIGFsbCB0aGUgZmllbGRzIGZvdW5kCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkID0gZmllbGRfaWQoJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGZpZWxkX2lkIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICIgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoInZhbCIsIG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZXQuaXNfbm9uZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldCA9IFNvbWUoIiA8PCB1bmlvbl9uYW1lIDw8ICI6OiIgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKG1lbWJlcikgPDwgIih2YWwpKTsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyBmaW5pc2ggcmVhZGluZyBtZXNzYWdlIGZyb20gd2lyZQorCisgIC8vIHJldHVybiB0aGUgdmFsdWUgb3IgYW4gZXJyb3IKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZWNlaXZlZF9maWVsZF9jb3VudCA9PSAwIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJcInJlY2VpdmVkIGVtcHR5IHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiByZWNlaXZlZF9maWVsZF9jb3VudCA+IDEgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgbXVsdGlwbGUgZmllbGRzIGZvciB1bmlvbiBmcm9tIHJlbW90ZSAiICsgdW5pb25fbmFtZSArICJcIiIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2socmV0LmV4cGVjdChcInJldHVybiB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkXCIpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCByZWFkIGZpZWxkIG9mIHR5cGUgVFlQRV9WT0lEIGZyb20gaW5wdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2J5dGVzKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX3N0cmluZygpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYm9vbCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2k4KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kxNigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTY0KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IE9yZGVyZWRGbG9hdDo6ZnJvbShpX3Byb3QucmVhZF9kb3VibGUoKT8pOyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIC8vIEZJWE1FOiBub3QgYSBmYW4gb2Ygc2VwYXJhdGUgYGlzX2JveGVkYCBwYXJhbWV0ZXIKKyAgICAvLyBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgaXQncyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIsIGFuZCBvbmx5IGNvbWVzCisgICAgLy8gaW50byBwbGF5IG9uY2UuIFRoZSBjb3JlIGlzc3VlIGlzIHRoYXQgSSBsb3NlIGFuIGltcG9ydGFudCBwaWVjZSBvZiB0eXBlCisgICAgLy8gaW5mb3JtYXRpb24gKHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBmd2QgcmVmKSBieSB1bndyYXBwaW5nIHRoZSB0eXBlZGVmJ2QKKyAgICAvLyB0eXBlIGFuZCBtYWtpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxsIHVzaW5nIGl0LiBJIGNhbid0IG1vZGlmeSBvciB3cmFwIHRoZQorICAgIC8vIGdlbmVyYXRlZCBzdHJpbmcgYWZ0ZXIgdGhlIGZhY3QgYmVjYXVzZSBpdCdzIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB0aGUgZmlsZSwKKyAgICAvLyBzbyBJIGhhdmUgdG8gcGFzcyB0aGlzIHBhcmFtZXRlciBhbG9uZy4gR29pbmcgd2l0aCB0aGlzIGFwcHJvYWNoIGJlY2F1c2UgaXQKKyAgICAvLyBzZWVtcyBsaWtlIHRoZSBsb3dlc3QtY29zdCBvcHRpb24gdG8gZWFzaWx5IHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzLgorICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQodHlwZV92YXIsIHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyByZWFkX2NhbGwodG9fcnVzdF90eXBlKHR0eXBlKSArICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPyIpOworICAgIHJlYWRfY2FsbCA9IGlzX2JveGVkID8gIkJveDo6bmV3KCIgKyByZWFkX2NhbGwgKyAiKSIgOiByZWFkX2NhbGw7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSAiIDw8ICByZWFkX2NhbGwgPDwgIjsiCisgICAgICA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfcmVhZCgodF9tYXAgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3JlYWQoKHRfc2V0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3JlYWQoKHRfbGlzdCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgcmVhZCB1bnN1cHBvcnRlZCB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2xpc3Rfc3luY19yZWFkKHRfbGlzdCAqdGxpc3QsIGNvbnN0IHN0cmluZyAmbGlzdF92YXIpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGxpc3RfaWRlbnQgPSBpX3Byb3QucmVhZF9saXN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IGxpc3RfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bGlzdCkKKyAgICA8PCAiID0gVmVjOjp3aXRoX2NhcGFjaXR5KGxpc3RfaWRlbnQuc2l6ZSBhcyB1c2l6ZSk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGxpc3RfZWxlbV92YXIgPSB0bXAoImxpc3RfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKGxpc3RfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3ZhciA8PCAiLnB1c2goIiA8PCBsaXN0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9saXN0X2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3JlYWQodF9zZXQgKnRzZXQsIGNvbnN0IHN0cmluZyAmc2V0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzZXRfaWRlbnQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgc2V0X3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdHNldCkKKyAgICA8PCAiID0gQlRyZWVTZXQ6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLnNldF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHNldF9lbGVtX3ZhciA9IHRtcCgic2V0X2VsZW1fIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChzZXRfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXRfdmFyIDw8ICIuaW5zZXJ0KCIgPDwgc2V0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zZXRfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbWFwX3N5bmNfcmVhZCh0X21hcCAqdG1hcCwgY29uc3Qgc3RyaW5nICZtYXBfdmFyKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1hcF9pZGVudCA9IGlfcHJvdC5yZWFkX21hcF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBtYXBfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bWFwKQorICAgIDw8ICIgPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcga2V5X2VsZW1fdmFyID0gdG1wKCJtYXBfa2V5XyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoa2V5X2VsZW1fdmFyLCBrZXlfdHlwZSk7CisgIHN0cmluZyB2YWxfZWxlbV92YXIgPSB0bXAoIm1hcF92YWxfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh2YWxfZWxlbV92YXIsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1hcF92YXIgPDwgIi5pbnNlcnQoIiA8PCBrZXlfZWxlbV92YXIgPDwgIiwgIiA8PCB2YWxfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX21hcF9lbmQoKT87IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmb3NzOworICBmb3NzIDw8ICJmXyIgPDwgdGZpZWxkLT5nZXRfa2V5KCk7CisgIHJldHVybiBmb3NzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBDbGllbnQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZW5kZXJfc3luY19jbGllbnQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3IodHNlcnZpY2UpOworICByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgLy8gdGhyaWZ0IGFyZ3MgZm9yIHNlcnZpY2UgY2FsbHMgYXJlIHBhY2tlZAorICAvLyBpbnRvIGEgc3RydWN0IHRoYXQncyB0cmFuc21pdHRlZCBvdmVyIHRoZSB3aXJlLCBzbworICAvLyBnZW5lcmF0ZSBzdHJ1Y3RzIGZvciB0aG9zZSB0b28KKyAgLy8KKyAgLy8gdGhyaWZ0IHJldHVybnMgYXJlICphbHNvKiBwYWNrZWQgaW50byBhIHN0cnVjdAorICAvLyB0aGF0J3MgcGFzc2VkIG92ZXIgdGhlIHdpcmUsIHNvLCBnZW5lcmF0ZSB0aGUgc3RydWN0CisgIC8vIGZvciB0aGF0IHRvby4gTm90ZSB0aGF0IHRoaXMgcmVzdWx0IHN0cnVjdCAqYWxzbyoKKyAgLy8gY29udGFpbnMgdGhlIGV4Y2VwdGlvbnMgYXMgd2VsbAorICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0ZnVuYyk7CisgICAgaWYgKCF0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0ZnVuYyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGllbnRfaW1wbF9uYW1lKHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh0c2VydmljZS0+Z2V0X25hbWUoKSArICIgc2VydmljZSBjbGllbnQiKTsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModHNlcnZpY2UsIGNsaWVudF9pbXBsX25hbWUpOyBmX2dlbl8gPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuIDw8ICI+OyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8ICIge30iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBydXN0X25hbWVzcGFjZSh0c2VydmljZSkgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkKKyAgICA8PCAiIGZvciAiCisgICAgPDwgaW1wbF9zdHJ1Y3RfbmFtZSA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIge30iCisgICAgPDwgZW5kbDsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKGV4dGVuZHMsIGltcGxfc3RydWN0X25hbWUpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNvbnN0IHN0cmluZyYgY2xpZW50X2ltcGxfbmFtZSkgeworCisgIC8vIHJlbmRlciB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGNsaWVudCBzdHJ1Y3QKKyAgZl9nZW5fCisgICAgPDwgInB1YiBzdHJ1Y3QgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfaV9wcm90OiBJUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX29fcHJvdDogT1AsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9zZXF1ZW5jZV9udW1iZXI6IGkzMiwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gcmVuZGVyIHRoZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24KKyAgLy8gdGhpcyBpbmNsdWRlcyB0aGUgbmV3KCkgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgaGVscGVyIHNlbmQvcmVjdiBtZXRob2RzIGZvciBlYWNoIHNlcnZpY2UgY2FsbAorICBmX2dlbl8KKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjbGllbnRfaW1wbF9uYW1lKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBuZXcoaW5wdXRfcHJvdG9jb2w6IElQLCBvdXRwdXRfcHJvdG9jb2w6IE9QKSAtPiAiCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IGNsaWVudF9zdHJ1Y3QKKyAgICA8PCAiIHsgX2lfcHJvdDogaW5wdXRfcHJvdG9jb2wsIF9vX3Byb3Q6IG91dHB1dF9wcm90b2NvbCwgX3NlcXVlbmNlX251bWJlcjogMCB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiIFRUaHJpZnRDbGllbnQgZm9yICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2wgeyAmbXV0IHNlbGYuX2lfcHJvdCB9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5fb19wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzIgeyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciArPSAxOyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbiA9ICIiICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRzZXJ2aWNlKTsKKworICBmX2dlbl8KKyAgICA8PCAiaW1wbCA8QzogVFRocmlmdENsaWVudCArICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgbWFya2VyX2V4dGVuc2lvbiA8PCAiPiAiCisgICAgPDwgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yIEMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcihmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIG1hcmtlcl9leHRlbnNpb247CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9ICIgKyAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKGV4dGVuZHMpOworICAgIG1hcmtlcl9leHRlbnNpb24gPSBtYXJrZXJfZXh0ZW5zaW9uICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKGV4dGVuZHMpOworICB9CisKKyAgcmV0dXJuIG1hcmtlcl9leHRlbnNpb247Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICBzdHJpbmcgZnVuY19kZWNsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgc3RyaW5nIGZ1bmNfY2FsbF9hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jKTsKKyAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiAiIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19kZWNsX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuCisgICAgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19zZW5kKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpPzsiIDw8IGVuZGw7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19yZWN2KHRmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBnZW5lcmF0ZSB0aGUgY2FsbCBoZWFkZXIKKyAgc3RyaW5nIG1lc3NhZ2VfdHlwZSA9IHRmdW5jLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9uZVdheSIgOiAiVE1lc3NhZ2VUeXBlOjpDYWxsIjsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoKTsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgIDw8ICJUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCBtZXNzYWdlX3R5cGUgPDwgIiwgIgorICAgIDw8ICJzZWxmLnNlcXVlbmNlX251bWJlcigpKTsiCisgICAgPDwgZW5kbDsKKyAgLy8gcGFjayB0aGUgYXJndW1lbnRzIGludG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0IHRoYXQgd2UnbGwgd3JpdGUgb3V0IG92ZXIgdGhlIHdpcmUKKyAgLy8gbm90ZSB0aGF0IHRoaXMgc3RydWN0IGlzIGdlbmVyYXRlZCBldmVuIGlmIHdlIGhhdmUgMCBhcmdzCisgIG9zdHJpbmdzdHJlYW0gc3RydWN0X2RlZmluaXRpb247CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgc3RydWN0X2RlZmluaXRpb24gPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCAiOworICB9CisgIHN0cmluZyBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2RlZmluaXRpb24uc3RyKCk7CisgIGlmIChzdHJ1Y3RfZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2ZpZWxkcy5zdWJzdHIoMCwgc3RydWN0X2ZpZWxkcy5zaXplKCkgLSAyKTsgLy8gc3RyaXAgdHJhaWxpbmcgY29tbWEKKyAgfQorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgY2FsbF9hcmdzID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICIgeyAiCisgICAgPDwgc3RydWN0X2ZpZWxkcworICAgIDw8ICIgfTsiCisgICAgPDwgZW5kbDsKKyAgLy8gd3JpdGUgZXZlcnl0aGluZyBvdmVyIHRoZSB3aXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJjYWxsX2FyZ3Mud3JpdGVfdG9fb3V0X3Byb3RvY29sKHNlbGYub19wcm90X211dCgpKT87IiA8PCBlbmRsOyAvLyB3cml0dGVuIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkuZmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gc2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKHNlbGYuc2VxdWVuY2VfbnVtYmVyKCksIG1lc3NhZ2VfaWRlbnQuc2VxdWVuY2VfbnVtYmVyKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8IlwiLCAmbWVzc2FnZV9pZGVudC5uYW1lKT87IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIC8vIEZJWE1FOiByZXBsYWNlIHdpdGggYSAidHJ5IiBibG9jaworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIG1lc3NhZ2VfaWRlbnQubWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZW1vdGVfZXJyb3IgPSB0aHJpZnQ6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZW1vdGVfZXJyb3IpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGUoVE1lc3NhZ2VUeXBlOjpSZXBseSwgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9ICIgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKHNlbGYuaV9wcm90X211dCgpKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5va19vcigpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSkgeworICBvc3RyaW5nc3RyZWFtIGZ1bmNfYXJnczsKKworICBpZiAoc2VsZl9pc19tdXRhYmxlKSB7CisgICAgZnVuY19hcmdzIDw8ICIoJm11dCBzZWxmIjsKKyAgfSBlbHNlIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmc2VsZiI7CisgIH0KKworICBpZiAoaGFzX2FyZ3ModGZ1bmMpKSB7CisgICAgZnVuY19hcmdzIDw8ICIsICI7IC8vIHB1dCBjb21tYSBhZnRlciAic2VsZiIKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2RlY2xhcmF0aW9uKHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBUX0FSR1MpOworICB9CisKKyAgZnVuY19hcmdzIDw8ICIpIjsKKyAgcmV0dXJuIGZ1bmNfYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworICBmdW5jX2FyZ3MgPDwgIigiOworCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2ludm9jYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIGZpZWxkX3ByZWZpeCk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgIHN0cmluZyBydXN0X3R5cGUgPSB0b19ydXN0X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChmaWVsZF9yZXEpID8gIk9wdGlvbjwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBhcmdzIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICI6ICIgPDwgcnVzdF90eXBlOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2ludm9jYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKworICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBmaWVsZF9pdGVyOworICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqZmllbGRfaXRlcik7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgZmllbGRfcHJlZml4IDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgICBzdHJpbmcgYXJnc19zdHJ1Y3RfbmFtZShzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykpOworICAgIHJlbmRlcl9zdHJ1Y3QoYXJnc19zdHJ1Y3RfbmFtZSwgdGZ1bmMtPmdldF9hcmdsaXN0KCksIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1MpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIHJlc3VsdF9zdHJ1Y3RfbmFtZSA9IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdF9zdHJ1Y3RfbmFtZSk7CisKKyAgdF9maWVsZCByZXR1cm5fdmFsdWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFLCAwKTsKKyAgcmV0dXJuX3ZhbHVlLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgIGlmICghdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnJldHVybl92YWx1ZSk7CisgIH0KKworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbl90eXBlcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4Y2VwdGlvbl9pdGVyOworICBmb3IoZXhjZXB0aW9uX2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXhjZXB0aW9uX2l0ZXIgIT0gZXhjZXB0aW9uX3R5cGVzLmVuZCgpOyArK2V4Y2VwdGlvbl9pdGVyKSB7CisgICAgdF9maWVsZCogZXhjZXB0aW9uX3R5cGUgPSAqZXhjZXB0aW9uX2l0ZXI7CisgICAgZXhjZXB0aW9uX3R5cGUtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb25fdHlwZSk7CisgIH0KKworICByZW5kZXJfc3RydWN0KHJlc3VsdF9zdHJ1Y3RfbmFtZSwgJnJlc3VsdCwgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgUHJvY2Vzc29yCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSkgeworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIHByb2Nlc3NvciIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5zaW9uID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCBmYWxzZSk7CisgICAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZnVuYyk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuICIKKyAgICAgIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19hcmdzCisgICAgICA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IgorICAgICAgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRzZXJ2aWNlKTsKKyAgc3RyaW5nIGhhbmRsZXJfdHJhaXRfbmFtZSA9IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpOworCisgIC8vIHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgc3RydWN0ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3RyYWl0X25hbWUKKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXI6IEgsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGRlbGVnYXRpbmcgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZSA8PCAiPiAiCisgICAgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SD4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gbmV3KGhhbmRsZXI6IEgpIC0+ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiPEg+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXIsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0c2VydmljZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWN0dWFsIGltcGwKKyAgc3RyaW5nIHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRmdW5jLCBoYW5kbGVyX3RyYWl0X25hbWUpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBwcm9jZXNzb3IgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiCisgICAgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+IFRQcm9jZXNzb3IgZm9yICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlcyA9IG1hdGNoICYqbWVzc2FnZV9pZGVudC5uYW1lIHsiIDw8IGVuZGw7IC8vIFtzaWdoXSBleHBsaWNpdCBkZXJlZiBjb2VyY2lvbgorICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJBcHBsaWNhdGlvbiIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCIsCisgICAgImZvcm1hdCEoXCJ1bmtub3duIG1ldGhvZCB7fVwiLCBtZXRob2QpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpzZXJ2ZXI6OmhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbWVzc2FnZV9pZGVudCwgcmVzLCBvX3Byb3QpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGFjdHVhbF9wcm9jZXNzb3IocnVzdF9uYW1lc3BhY2UodHNlcnZpY2UpICsgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lKCJwcm9jZXNzXyIgKyBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCZzZWxmLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyOiBpMzIsICIKKyAgICAgIDw8ICJpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsICIKKyAgICAgIDw8ICJvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgICA8PCAiLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgYWN0dWFsX3Byb2Nlc3NvcgorICAgICAgPDwgIjo6IiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCIKKyAgICAgIDw8ICImc2VsZi5oYW5kbGVyLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyLCAiCisgICAgICA8PCAiaV9wcm90LCAiCisgICAgICA8PCAib19wcm90IgorICAgICAgPDwgIikiCisgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiA9PiB7IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInNlbGYucHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIobWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIsIGlfcHJvdCwgb19wcm90KSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyhleHRlbmRzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmhhbmRsZXJfdHlwZSkgeworICBzdHJpbmcgc2VxdWVuY2VfbnVtYmVyX3BhcmFtKCJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIiKTsKKyAgc3RyaW5nIG91dHB1dF9wcm90b2NvbF9wYXJhbSgib19wcm90Iik7CisKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIHNlcXVlbmNlX251bWJlcl9wYXJhbSA9ICJfIjsKKyAgICBvdXRwdXRfcHJvdG9jb2xfcGFyYW0gPSAiXyI7CisgIH0KKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICA8PCAiPEg6ICIgPDwgaGFuZGxlcl90eXBlIDw8ICI+IgorICAgIDw8ICIoaGFuZGxlcjogJkgsICIKKyAgICA8PCBzZXF1ZW5jZV9udW1iZXJfcGFyYW0gPDwgIjogaTMyLCAiCisgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgIDw8IG91dHB1dF9wcm90b2NvbF9wYXJhbSA8PCAiOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgIgorICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vICphbHdheXMqIHJlYWQgYXJndW1lbnRzIGZyb20gdGhlIGlucHV0IHByb3RvY29sCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCAiCisgICAgPDwgKGhhc19ub25fdm9pZF9hcmdzKHRmdW5jKSA/ICJhcmdzIiA6ICJfIikKKyAgICA8PCAiID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPzsiCisgICAgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJtYXRjaCBoYW5kbGVyLiIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRmdW5jKQorICAgIDw8IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0ZnVuYywgImFyZ3MuIikKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaGFuZGxlciBzdWNjZWVkZWQKKyAgc3RyaW5nIGhhbmRsZXJfcmV0dXJuX3ZhcmlhYmxlID0gdGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiXyIgOiAiaGFuZGxlcl9yZXR1cm4iOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCIgPDwgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgLy8gaGFuZGxlciBmYWlsZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIoZSkgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGVuZCBtYXRjaAorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIGZ1bmN0aW9uCit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSZXBseSwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodGZ1bmMpIDw8IjsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXQud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBzdHJpbmcgZXJyX3ZhcigiZSIpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggIiA8PCBlcnJfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaWYgdGhlcmUgYXJlIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIGNhbGwgaGFuZGxlIHRoZW0gZmlyc3QKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCAmJiB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgc3RyaW5nIHVzZXJfZXJyX3ZhcigidXNyX2VyciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcigiIDw8IHVzZXJfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwbGljYXRpb24gZXJyb3IKKyAgc3RyaW5nIGFwcF9lcnJfdmFyKCJhcHBfZXJyIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYywgYXBwX2Vycl92YXIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIC8vIGRlZmF1bHQgY2FzZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgPT0gTlVMTCB8fCB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgdGhyb3cgImNhbm5vdCByZW5kZXIgdXNlciBleGNlcHRpb24gYnJhbmNoZXMgaWYgbm8gdXNlciBleGNlcHRpb25zIGRlZmluZWQiOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisgIGludCBicmFuY2hlc19yZW5kZXJlZCA9IDA7CisKKyAgLy8gcnVuIHRocm91Z2ggYWxsIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgIGZvciAoeGNlcHRpb25faXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqeGNlcHRpb25faXRlcik7CisKKyAgICBzdHJpbmcgaWZfc3RhdGVtZW50KGJyYW5jaGVzX3JlbmRlcmVkID09IDAgPyAiaWYgdXNyX2VyciIgOiAifSBlbHNlIGlmIHVzcl9lcnIiKTsKKyAgICBzdHJpbmcgZXhjZXB0aW9uX3R5cGUodG9fcnVzdF90eXBlKHhjZXB0aW9uX2ZpZWxkLT5nZXRfdHlwZSgpKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGlmX3N0YXRlbWVudCA8PCAiLmRvd25jYXN0X3JlZjo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgZXJyID0gdXNyX2Vyci5kb3duY2FzdDo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5leHBlY3QoXCJkb3duY2FzdCBhbHJlYWR5IGNoZWNrZWRcIik7IgorICAgICAgPDwgZW5kbDsKKworICAgIC8vIHJlbmRlciB0aGUgbWVtYmVycyBvZiB0aGUgcmV0dXJuIHN0cnVjdAorICAgIG9zdHJpbmdzdHJlYW0gbWVtYmVyczsKKworICAgIGJvb2wgaGFzX3Jlc3VsdF92YXJpYWJsZSA9ICEodGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpOworICAgIGlmIChoYXNfcmVzdWx0X3ZhcmlhYmxlKSB7CisgICAgICBtZW1iZXJzIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICI6IE5vbmUsICI7CisgICAgfQorCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25fbWVtYmVyc19pdGVyOworICAgIGZvcih4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIgPSB0eGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX21lbWJlcnNfaXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCp4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGlmIChtZW1iZXIgPT0geGNlcHRpb25fZmllbGQpIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBTb21lKCplcnIpLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBOb25lLCAiOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJfc3RyaW5nID0gbWVtYmVycy5zdHIoKTsKKyAgICBtZW1iZXJfc3RyaW5nLnJlcGxhY2UobWVtYmVyX3N0cmluZy5zaXplKCkgLSAyLCAyLCAiICIpOyAvLyB0cmltIHRyYWlsaW5nIGNvbW1hCisKKyAgICAvLyBub3cgd3JpdGUgb3V0IHRoZSByZXR1cm4gc3RydWN0CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCByZXRfZXJyID0gIgorICAgICAgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICAgIDw8ICJ7ICIgPDwgbWVtYmVyX3N0cmluZyA8PCAifTsiCisgICAgICA8PCBlbmRsOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXRfZXJyLndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgYnJhbmNoZXNfcmVuZGVyZWQrKzsKKyAgfQorCisgIC8vIHRoZSBjYXRjaCBhbGwsIGlmIHNvbWVob3cgaXQgd2FzIGEgdXNlciBleGNlcHRpb24gdGhhdCB3ZSBkb24ndCBzdXBwb3J0CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZJWE1FOiBzYW1lIGFzIGRlZmF1bHQgYmxvY2sgYmVsb3cKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgInVzcl9lcnIuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCgKKyAgICB0X2Z1bmN0aW9uICp0ZnVuYywKKyAgICBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyCispIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKCIgPDwgYXBwX2Vycl92YXIgPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsIGFwcF9lcnJfdmFyKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0X2VyciA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgiQXBwbGljYXRpb25FcnJvciIsICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biIsICJlLmRlc2NyaXB0aW9uKCkiKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJldF9lcnIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3ZhcikgeworICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6d3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKCYiIDw8IGVycl92YXIgPDwgIiwgb19wcm90KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6aGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgaW50IG1lbWJlcl9jb3VudCA9IDA7CisgIG9zdHJpbmdzdHJlYW0gcmV0dXJuX3N0cnVjdDsKKworICByZXR1cm5fc3RydWN0IDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpIDw8ICIgeyAiOworCisgIC8vIGFjdHVhbCByZXR1cm4KKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmV0dXJuX3N0cnVjdCA8PCAicmVzdWx0X3ZhbHVlOiBTb21lKGhhbmRsZXJfcmV0dXJuKSI7CisgICAgbWVtYmVyX2NvdW50Kys7CisgIH0KKworICAvLyBhbnkgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCkgeworICAgIHRfc3RydWN0KiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0eGNlcHRpb25zLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogeGNlcHRpb25fZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICBpZiAobWVtYmVyX2NvdW50ID4gMCkgeyByZXR1cm5fc3RydWN0IDw8ICIsICI7IH0KKyAgICAgIHJldHVybl9zdHJ1Y3QgPDwgcnVzdF9maWVsZF9uYW1lKHhjZXB0aW9uX2ZpZWxkKSA8PCAiOiBOb25lIjsKKyAgICAgIG1lbWJlcl9jb3VudCsrOworICAgIH0KKyAgfQorCisgIHJldHVybl9zdHJ1Y3QgPDwgIiB9IjsKKworICByZXR1cm4gIHJldHVybl9zdHJ1Y3Quc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXR5CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiLy8iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vIE5PVEU6IGRvICpub3QqIHB1dCBpbiBhbiBleHRyYSBuZXdsaW5lIGFmdGVyIGRvYyBpcyBnZW5lcmF0ZWQuCisvLyBUaGlzIGlzIGJlY2F1c2UgcnVzdCBkb2NzIGhhdmUgdG8gYWJ1dCB0aGUgbGluZSB0aGV5J3JlIGRvY3VtZW50aW5nLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3J1c3Rkb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKCF0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChmX2dlbl8sICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yKAorICBjb25zdCBzdHJpbmcmIGVycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OiIgPDwgZXJyb3Jfa2luZCA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KGVycm9yX3N0cnVjdCwgc3ViX2Vycm9yX2tpbmQsIGVycm9yX21lc3NhZ2UpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZXJyb3Jfc3RydWN0IDw8ICI6Om5ldygiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3ViX2Vycm9yX2tpbmQgPDwgIiwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9tZXNzYWdlIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfZG91YmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgLy8gdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsgPC0tIHJlY3Vyc2VzIHRocm91Z2ggYXMgbWFueSB0eXBlZGVmIGxheWVycyBhcyBuZWNlc3NhcnkKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiVmVjPHU4PiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAob3JkZXJlZF9mbG9hdCkgeworICAgICAgICByZXR1cm4gIk9yZGVyZWRGbG9hdDxmNjQ+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiZjY0IjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICBzdHJpbmcgcnVzdF90eXBlID0gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpOworICAgIHJ1c3RfdHlwZSA9ICB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkgPyAiQm94PCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisgICAgcmV0dXJuIHJ1c3RfdHlwZTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiQlRyZWVNYXA8IiArIHRvX3J1c3RfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZVNldDwiICsgdG9fcnVzdF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIlZlYzwiICsgdG9fcnVzdF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIHJ1c3QgdHlwZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfY29uc3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIGlmICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiJlt1OF0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICImc3RyIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdG9fcnVzdF90eXBlKHR0eXBlLCBvcmRlcmVkX2Zsb2F0KTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAid2lsbCBub3QgZ2VuZXJhdGUgcHJvdG9jb2w6OlRUeXBlIGZvciBUWVBFX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyBib3RoIHN0cmluZ3MgYW5kIGJpbmFyeSBhcmUgYWN0dWFsbHkgZW5jb2RlZCBhcyBUVHlwZTo6U3RyaW5nCisgICAgICByZXR1cm4gIlRUeXBlOjpTdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMDgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U3RydWN0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpNYXAiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6Okxpc3QiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIFRUeXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6b3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBPUFRfSU5fUkVRX09VVCB2YWx1ZSBmb3Igdm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU29tZShcIlwiLnRvX293bmVkKCkpIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlNvbWUoZmFsc2UpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJTb21lKDApIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiU29tZShPcmRlcmVkRmxvYXQ6OmZyb20oMC4wKSkiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVTZXQ6Om5ldygpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJTb21lKEJUcmVlTWFwOjpuZXcoKSkiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBvcHQtaW4tcmVxLW91dCB2YWx1ZSBmb3IgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmIChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopYWN0dWFsX3R5cGU7CisgICAgcmV0dXJuICEodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHRfdHlwZSogdHR5cGUpIHsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICByZXR1cm4gIWNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QoYWN0dWFsX3R5cGUpICYmICFhY3R1YWxfdHlwZS0+aXNfc2VydmljZSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKSB7CisgIHJldHVybiByZXEgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCByZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKK30KKwordF9maWVsZDo6ZV9yZXEgdF9yc19nZW5lcmF0b3I6OmFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICByZXR1cm4gc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfQVJHUyA/IHRfZmllbGQ6OlRfUkVRVUlSRUQgOiB0ZmllbGQtPmdldF9yZXEoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHRmdW5jLT5nZXRfYXJnbGlzdCgpICE9IE5VTEwgJiYgIXRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBib29sIGhhc19ub25fdm9pZF9hcmdzID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdzX2l0ZXI7CisgIGZvciAoYXJnc19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdzX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmFyZ3NfaXRlcik7CisgICAgaWYgKCF0ZmllbGQtPmdldF90eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaGFzX25vbl92b2lkX2FyZ3MgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGhhc19ub25fdm9pZF9hcmdzOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHN3aXRjaChzdHJ1Y3RfdHlwZSkgeworICBjYXNlIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1M6CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUOgorICAgIHJldHVybiAiIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInB1YiAiOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgIT0gZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgeworICAgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIjo6IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFJVU1RfUkVTRVJWRURfV09SRFNfU0VULmZpbmQobmFtZSkgIT0gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZW5kKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgYmFzZV9zdHJ1Y3RfbmFtZShydXN0X2NhbWVsX2Nhc2UodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9zdHJ1Y3RfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3Rfc25ha2VfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIGlmIChpc19yZXNlcnZlZChuYW1lKSkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuICJoYW5kbGVfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgLy8gVGhyaWZ0IGF1dG9tYXRpY2FsbHkgYXBwZW5kcyBgQXJnc2AgdG8gdGhlIGFyZ2xpc3QgbmFtZS4gTm8gbmVlZCB0byBkbyBpdCBoZXJlLgorICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHNlcnZpY2VfbmFtZV8pICsgcnVzdF9jYW1lbF9jYXNlKHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpICsgUkVTVUxUX1NUUlVDVF9TVUZGSVg7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnRNYXJrZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnQiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNIYW5kbGVyIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jUHJvY2Vzc29yIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NGdW5jdGlvbnMiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nICZuYW1lKSB7CisgIGJvb2wgYWxsX3VwcGVyY2FzZSA9IHRydWU7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGlzYWxudW0obmFtZVtpXSkgJiYgaXNsb3dlcihuYW1lW2ldKSkgeworICAgICAgYWxsX3VwcGVyY2FzZSA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGFsbF91cHBlcmNhc2UpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobG93ZXJjYXNlKG5hbWUpKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcGl0YWxpemUoY2FtZWxjYXNlKG5hbWUpKTsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cih1cHBlcmNhc2UodW5kZXJzY29yZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfXyIsICJfIik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKGRlY2FwaXRhbGl6ZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiXyIsICIiKTsKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZykgeworICBpZiAodGFyZ2V0LmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgbWF0Y2hfbGVuID0gc2VhcmNoX3N0cmluZy5sZW5ndGgoKTsKKyAgc2l6ZV90IHJlcGxhY2VfbGVuID0gcmVwbGFjZV9zdHJpbmcubGVuZ3RoKCk7CisKKyAgc2l6ZV90IHNlYXJjaF9pZHggPSAwOworICBzaXplX3QgbWF0Y2hfaWR4OworICB3aGlsZSAoKG1hdGNoX2lkeCA9IHRhcmdldC5maW5kKHNlYXJjaF9zdHJpbmcsIHNlYXJjaF9pZHgpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB0YXJnZXQucmVwbGFjZShtYXRjaF9pZHgsIG1hdGNoX2xlbiwgcmVwbGFjZV9zdHJpbmcpOworICAgIHNlYXJjaF9pZHggPSBtYXRjaF9pZHggKyByZXBsYWNlX2xlbjsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICBycywKKyAgIlJ1c3QiLAorICAiXG4iKSAvLyBubyBSdXN0LWdlbmVyYXRvci1zcGVjaWZpYyBvcHRpb25zCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWE5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHRlbXBvcmFyeV92YXIgPSAwOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN0OiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3JlYWRlcih0X21hcCogdG1hcCk7CisgIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpOworICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlcih0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyKHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworCisgIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCh0X3R5cGUqIHQsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcmVhZF92YWwodF90eXBlKiB0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7CisKKyAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOworICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOworICB2b2lkIHN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOworICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgYm9vbCBpc192b3dlbChjaGFyIGMpOworICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIGludCB0ZW1wb3JhcnlfdmFyOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHRlbXBvcmFyeV92YXIgPSAwOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5zdCI7CisgIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7CisgIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7CisgIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInByZWZpeCIgfHwgc3ViX25hbWVzcGFjZSA9PSAiY2F0ZWdvcnkiOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKKyAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOworICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCInIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICInIVxuIjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yY2VfY29uc3RzKCkgeworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwgcHJlZml4KGNsYXNzX25hbWUoKSkKKyAgICAgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOworICBmXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9jYXRlZ29yeSgpIHsKKyAgc3RyaW5nIGNhdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsKKyAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVGhyaWZ0IGdyYW1tYXIsIHRoZSBjYXRlZ29yeSBtdXN0CisgIC8vIGJlIHB1bmN0dWF0ZWQgYnkgZG90cy4gIFJlcGxhY2VzIHRoZW0gd2l0aCBkYXNoZXMgaGVyZS4KKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBjYXQuYmVnaW4oKTsgaXRlciAhPSBjYXQuZW5kKCk7ICsraXRlcikgeworICAgIGlmICgqaXRlciA9PSAnLicpIHsKKyAgICAgICppdGVyID0gJy0nOworICAgIH0KKyAgfQorICByZXR1cm4gY2F0LnNpemUoKSA/IGNhdCA6ICJHZW5lcmF0ZWQtIiArIGNsYXNzX25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFNtYWxsdGFsaywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIgorICAgICAgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIGNoYXIgdGltZXN0cls1MF07CisgIHRpbWVfdCByYXd0aW1lOworICBzdHJ1Y3QgdG0qIHRpbmZvOworCisgIHRpbWUoJnJhd3RpbWUpOworICB0aW5mbyA9IGxvY2FsdGltZSgmcmF3dGltZSk7CisgIHN0cmZ0aW1lKHRpbWVzdHIsIDUwLCAiJW0vJWQvJVkgJUg6JU0iLCB0aW5mbyk7CisKKyAgb3V0IDw8ICIhIiA8PCBwcmVmaXgoY2xzKSA8PCAiIG1ldGhvZHNGb3I6ICciICsgY2F0ZWdvcnkgKyAiJyBzdGFtcDogJ3RocmlmdCAiIDw8IHRpbWVzdHIKKyAgICAgIDw8ICInIVxuIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7CisgIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7CisgIHN0X2Nsb3NlX21ldGhvZChvdXQpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKKyAgb3V0IDw8ICJeICIgPDwgbmFtZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOworICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiCisgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKKyAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKworICBmXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIgorICAgICA8PCAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIKKyAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiKCIgPDwgY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiIG5ldyAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOworICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgcHV0OiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiRXJyb3IiOworICBlbHNlCisgICAgb3V0IDw8ICJPYmplY3QiOworCisgIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJyI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiAiOworICAgICAgb3V0IDw8IGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiJ1xuIgorICAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgIDw8ICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKKworICBnZW5lcmF0ZV9hY2Nlc3NvcnMob3V0LCB0c3RydWN0KTsKK30KKworYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdm93ZWwoY2hhciBjKSB7CisgIHN3aXRjaCAodG9sb3dlcihjKSkgeworICBjYXNlICdhJzoKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ2knOgorICBjYXNlICdvJzoKKyAgY2FzZSAndSc6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKKyAgICBwcmVmaXggPSAiYW4iOworICBlbHNlCisgICAgcHJlZml4ID0gImEiOworCisgIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHR5cGU7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCisgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAorICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIjsgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCogdG1hcCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbAorICAgICAgPDwgIiA6PSBEaWN0aW9uYXJ5IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgIDw8ICIgcHV0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCogdHNldCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIicpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgb3V0IDw8ICJdIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8ICIuIiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7CisKKyAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKKyAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgorICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyIgPDwgZGVzYworICAgICAgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiB0eXBlID0gVFR5cGUgc3RvcF0gd2hpbGVGYWxzZTogW3wiIDw8IGZvdW5kIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgaWQgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBpZlRydWU6IFsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiCisgICAgICAgIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCByZWFkX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCAiXS4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiBpZk5pbDogW2lwcm90IHNraXA6ICIgPDwgZGVzYyA8PCAiIHR5cGVdXS4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkU3RydWN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSogdCwgc3RyaW5nIGZuYW1lKSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuIGxpc3Rfd3JpdGVyKCh0X2xpc3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF9yZWFkZXIoKHRfc3RydWN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZEkzMiI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAic2VuZCIgKyBjYXBpdGFsaXplKHNpZ25hdHVyZSkpOworICBmXyA8PCAib3Byb3Qgd3JpdGVNZXNzYWdlQmVnaW46IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmXyA8PCBpbmRlbnQoKSA8PCAiKFRDYWxsTWVzc2FnZSBuZXciIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJuYW1lOiAnIiA8PCBmdW5uYW1lIDw8ICInOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIgorICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiCisgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUKKyAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7CisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOworCisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKKy8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCisgICAgdF9maWVsZCogZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOworICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKKyAgfQorCisgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7CisgIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXNnIDo9IG9wcm90IHJlYWRNZXNzYWdlQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZE1lc3NhZ2VFbmQuIgorICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXiByZXMiOworICBzdF9jbG9zZV9tZXRob2QoZl8pOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgIlwiIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoZl9pdGVyICsgMSkgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIlwiIjsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVENsaWVudCI7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBmXyA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgoY2xpZW50X2NsYXNzX25hbWUoKSkgPDwgZW5kbAorICAgICA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgIDw8ICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworCisgICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOworICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZiBzZW5kIgorICAgICAgIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKKworICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlIGJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZSBpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZSBpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZSBpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZSBkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUgc3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUgbWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUgc2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHN0LCAiU21hbGx0YWxrIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGIwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU3dpZnQgMyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBEZXNpZ25lZCBmcm9tIHRoZSBTd2lmdC9Db2NvYSBjb2RlIGdlbmVyYXRvcihzKQorICovCitjbGFzcyB0X3N3aWZ0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3N3aWZ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIG5vX3N0cmljdF8gPSBmYWxzZTsKKyAgICBuYW1lc3BhY2VkXyA9IGZhbHNlOworICAgIGdlbl9jb2NvYV8gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBzYWZlX2VudW1zXyA9IGZhbHNlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc3RyaWN0IikgPT0gMCkgeworICAgICAgICBub19zdHJpY3RfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZGVidWdfZGVzY3JpcHRpb25zIikgPT0gMCkgeworICAgICAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb2NvYSIpID09IDApIHsKKyAgICAgICAgZ2VuX2NvY29hXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNhZmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIHNhZmVfZW51bXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7CisgICAgICAgIGlmIChnZW5fY29jb2FfID09IGZhbHNlKSB7CisgICAgICAgICAgdGhyb3cgIlByb21pc2VLaXQgb25seSBhdmFpbGFibGUgd2l0aCBTd2lmdCAyLngsIHVzZSBgY29jb2FgIG9wdGlvbiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN3aWZ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zd2lmdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHN3aWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHN3aWZ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbD1mYWxzZSwgYm9vbCBpc19mb3JjZWQ9ZmFsc2UpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3ByaXZhdGUpOworICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworCisgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpc19pbnRlcm5hbCk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSwgYm9vbCBxdWFsaWZpZWQ9ZmFsc2UpOworICBzdHJpbmcgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBpZGVudGlmaWVyKTsKKyAgdm9pZCBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworICAvKiogU3dpZnQgMyBzcGVjaWZpYyAqLworICBzdHJpbmcgZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKTsKKyAgc3RyaW5nIGVudW1fY29uc3RfbmFtZShzdHJpbmcgZW51bV9pZGVudGlmaWVyKTsKKyAgdm9pZCBmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNhcnJ5b3ZlciAqLworICBzdHJpbmcgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki8KKyAgdm9pZCBnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgic3dpZnQiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiByZWFsX21vZHVsZTsKKyAgfQorcHJpdmF0ZToKKworICB2b2lkIGJsb2NrX29wZW4ob3N0cmVhbSYgb3V0KSB7CisgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgYmxvY2tfY2xvc2Uob3N0cmVhbSYgb3V0LCBib29sIGVuZF9saW5lPXRydWUpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoZW5kX2xpbmUpIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBmaWVsZF9pc19vcHRpb25hbCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgICBib29sIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmZpbmQoInN3aWZ0Lm51bGxhYmxlIikgIT0gdGZpZWxkLT5hbm5vdGF0aW9uc18uZW5kKCkgJiYgdGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3B0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGdlbl9jb2NvYV8pIHsgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHksIG9ubHkgaWYgaXRzIGFjdHVhbGx5ICJvcHRpb25hbCIKKyAgICAgIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgfQorICAgIHJldHVybiBvcHQ7CisgIH0KKworICBib29sIHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZGVjbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCBhc3luY19jbGllbnRzXzsKKworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgbm9fc3RyaWN0XzsKKyAgYm9vbCBuYW1lc3BhY2VkXzsKKyAgYm9vbCBzYWZlX2VudW1zXzsKKyAgc2V0PHN0cmluZz4gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNvbXBhdGliaWxpdHkgKi8KKyAgYm9vbCBnZW5fY29jb2FfOworICBib29sIHByb21pc2Vfa2l0XzsKKworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIG91dF9kaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmcgbW9kdWxlX3BhdGggPSBvdXRfZGlyOworICBzdHJpbmcgbmFtZSA9IHByb2dyYW1fbmFtZV87CisgIGlmIChuYW1lc3BhY2VkXyAmJiAhbW9kdWxlLmVtcHR5KCkpIHsKKyAgICBtb2R1bGVfcGF0aCA9IG1vZHVsZV9wYXRoICsgIi8iICsgbW9kdWxlOworICAgIG5hbWUgPSBtb2R1bGU7CisgIH0KKyAgTUtESVIobW9kdWxlX3BhdGguY19zdHIoKSk7CisKKyAgcG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKTsKKworICAvLyB3ZSBoYXZlIGEgLnN3aWZ0IGRlY2xhcmF0aW9ucyBmaWxlLi4uCisgIHN0cmluZyBmX2RlY2xfbmFtZSA9IG5hbWUgKyAiLnN3aWZ0IjsKKyAgc3RyaW5nIGZfZGVjbF9mdWxsbmFtZSA9IG1vZHVsZV9wYXRoICsgIi8iICsgZl9kZWNsX25hbWU7CisgIGZfZGVjbF8ub3BlbihmX2RlY2xfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9kZWNsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgc3dpZnRfaW1wb3J0cygpIDw8IHN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvLyAuLi5hbmQgYSAuc3dpZnQgaW1wbGVtZW50YXRpb24gZXh0ZW5zaW9ucyBmaWxlCisgIHN0cmluZyBmX2ltcGxfbmFtZSA9IG5hbWUgKyAiK0V4dHMuc3dpZnQiOworICBzdHJpbmcgZl9pbXBsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2ltcGxfbmFtZTsKKyAgZl9pbXBsXy5vcGVuKGZfaW1wbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIENvY29hIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQ29jb2EgbGlicmFyaWVzCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiRm91bmRhdGlvbiIpOworCisgIG9zdHJpbmdzdHJlYW0gaW5jbHVkZXM7CisKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgZm9yIChpX2l0ZXI9aW5jbHVkZXNfbGlzdC5iZWdpbigpOyBpX2l0ZXIhPWluY2x1ZGVzX2xpc3QuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgaW5jbHVkZXMgPDwgImltcG9ydCAiIDw8ICppX2l0ZXIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgcHJvZ3JhbV9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2dyYW1faW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluY2x1ZGVzIDw8ICgiaW1wb3J0ICIgKyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV9pbmNsdWRlc1tpXSkpIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIFByaW50cyBUaHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBUaHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUaHJpZnQiKTsKKworICBpZiAoZ2VuX2NvY29hXyAmJiBwcm9taXNlX2tpdF8pIHsKKyAgICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiUHJvbWlzZUtpdCIpOworICB9CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogRmluaXNoIHVwIGdlbmVyYXRpb24uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgorICBmX2RlY2xfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gU3dpZnQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHR5cGVhbGlhcyAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKQorICAgICAgICAgIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gU3dpZnQsIHRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nCisgKiBTd2lmdCBzeW50YXguICBDb25mb3JtcyB0byBURW51bSB3aGljaAorICogaW1wbGVtZW50ZXMgcmVhZC93cml0ZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9lbnVtKHRlbnVtKTsKKyAgICByZXR1cm47CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKworICAvLyB1bmtub3duIGFzc29jaWF0ZWQgdmFsdWUgY2FzZSBmb3Igc2FmZXR5IGFuZCBzaW1pbGFyIGJlaGF2aW9yIHRvIG90aGVyIGxhbmd1YWdlcworICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIHVua25vd24oSW50MzIpIiA8PCBlbmRsOworICB9CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBUU2VyaWFsaXphYmxlIHJlYWQoZnJvbTopCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJhdzogSW50MzIgPSB0cnkgcHJvdG8ucmVhZCgpIiA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgbmV3ID0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpIiA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImlmIGxldCB1bndyYXBwZWQgPSBuZXcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB1bndyYXBwZWQiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBlbnVtIHZhbHVlIChcXChyYXcpKSBmb3IgXFwoIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIuc2VsZilcIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworCisgIC8vIGVtcHR5IGluaXQgZm9yIFRTZXJpYWxpemFibGUKKyAgZl9kZWNsXyA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoY29uc3RhbnRzLmZyb250KCksIGZhbHNlKSA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIHJhd1ZhbHVlIGdldHRlcgorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdmFyIHJhd1ZhbHVlOiBJbnQzMiI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpCisgICAgICAgICAgICA8PCAiOiByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKyAgaWYgKHNhZmVfZW51bXNfKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAudW5rbm93bihsZXQgdmFsdWUpOiByZXR1cm4gdmFsdWUiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBjb252ZW5pZW5jZSByYXdWYWx1ZSBpbml0YWxpemVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0PyhyYXdWYWx1ZTogSW50MzIpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHJhd1ZhbHVlIHsiIDw8IGVuZGw7OworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpCisgICAgICAgICAgICA8PCAiOiBzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoKCpjX2l0ZXIpLCB0cnVlKSA8PCBlbmRsOworICB9CisgIGlmICghc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiByZXR1cm4gbmlsIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bihyYXdWYWx1ZSkiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKworCisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBUaGlzIGlzIGZvciBTd2lmdCAyLngvQ29jb2EKKyAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKworICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkgeyBzZWxmLmluaXQocmF3VmFsdWU6ICIgPDwgY29uc3RhbnRzLmZyb250KCktPmdldF92YWx1ZSgpIDw8ICIpISB9IiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZXh0ZW5zaW9uICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IFRFbnVtIjsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJhdyA9IEludDMyKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHByb3RvLnJlYWRJMzIoJnJhdykiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihyYXdWYWx1ZTogcmF3KSEiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MiOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUucmF3VmFsdWUpIiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW1fY2FzZS0+Z2V0X25hbWUoKTsKKyAgLy8gZm9yY2UgdG8gbG93ZXJjYXNlIGZvciBTd2lmdCBzdHlsZSwgbWF5YmUgZXNjYXBlIGlmIGl0cyBhIGtleXdvcmQKKyAgc3RkOjp0cmFuc2Zvcm0obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCBuYW1lLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIGlmIChkZWNsYXJhdGlvbikgeworICAgIG5hbWUgPSBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29uc3RhbnQgZW51bSB2YWx1ZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHZhbHVlIHBvcnRpb24gdG8gbG93ZXJjYXNlCisgKiBmb3IgU3dpZnQgc3R5bGUuCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpIHsKKyAgc3RyaW5nOjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IGVudW1faWRlbnRpZmllci5iZWdpbigpOyBpdCA8IGVudW1faWRlbnRpZmllci5lbmQoKTsgKytpdCkgeworICAgIGlmICgoKml0KSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdGQ6OnRyYW5zZm9ybShpdCwgZW51bV9pZGVudGlmaWVyLmVuZCgpLCBpdCwgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIGVudW1faWRlbnRpZmllcjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHVibGljIGNvbnN0YW50cyBmb3IgYWxsIFRocmlmdCBjb25zdGFudHMuCisgKgorICogQHBhcmFtIGNvbnN0cyBDb25zdGFudHMgdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgLy8gUHVibGljIGNvbnN0YW50cyBmb3IgYmFzZSB0eXBlcyAmIHN0cmluZ3MKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgInB1YmxpYyBsZXQgIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdF9pbnRlcmZhY2UsIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgorICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBzdHJ1Y3QKKyAqIHdpdGggcHVibGljIG1lbWJlcnMuIE9wdGlvbmFsIHR5cGVzIGFyZSB1c2VkIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvCisgKiBhbGxvdyB0aGVtIHRvIGJlIHRlc3RlZCBmb3IgYXZhaWxhYmlsaXR5LiBTZXBhcmF0ZSBpbml0cyBhcmUgaW5jbHVkZWQgZm9yCisgKiByZXF1aXJlZCBwcm9wZXJ0aWVzICYgYWxsIHByb3BlcnRpZXMuCisgKgorICogR2VuZXJhdGVzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBjb25mb3JtYW5jZSB0byBUU3RydWN0LCBUU2VyaWFsaXphYmxlLAorICogSGFzaGFibGUgJiBFcXVhdGFibGUKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGNvbmZvcm0gdG8gRXJyb3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9kZWNsXywgdHhjZXB0aW9uLCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIGZhbHNlLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHN0cmluZyYgZG9jKSB7CisgIGlmIChkb2MgIT0gIiIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHByZXYgPSAwOworICAgIHdoaWxlICgoKHBvcyA9IGRvYy5maW5kKCJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHIiLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHx8ICgocG9zID0gZG9jLmZpbmQoIlxyXG4iLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKQorICAgIHsKKyAgICAgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2LCBwb3MgLSBwcmV2KSk7CisgICAgICAgIHByZXYgPSBwb3MgKyAxOworICAgIH0KKworICAgIC8vIFRvIGdldCB0aGUgbGFzdCBzdWJzdHJpbmcgKG9yIG9ubHksIGlmIGRlbGltaXRlciBpcyBub3QgZm91bmQpCisgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2KSk7CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgZF9pdGVyOworICAgIGZvciAoZF9pdGVyID0gc3RyaW5ncy5iZWdpbigpOyBkX2l0ZXIgIT0gc3RyaW5ncy5lbmQoKTsgKytkX2l0ZXIpIHsKKyAgICAgIGlmICgoKmRfaXRlcikgIT0gIiIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLy8gIiA8PCAoKmRfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisKKy8qKgorICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QuIE9ubHkgcHJvcGVydGllcyBhbmQKKyAqIGluaXQgbWV0aG9kcyBhcmUgaW5jbHVkZWQuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgZG9jID0gdHN0cnVjdC0+Z2V0X2RvYygpOworICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAvLyBzcGVjaWFsLCB1bmlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBzdHJpbmcgZG9jID0gKCptX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsOiAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UpIDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3JtYWwgc3RydWN0cworCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIgOiBTd2lmdC5FcnJvciI7IC8vIEVycm9yIHNlZW1zIHRvIGJlIGEgY29tbW9uIGV4Y2VwdGlvbiBuYW1lIGluIHRocmlmdAorICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIC8vIFRPRE86IERlZmF1bHRzCisKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIsIGlzX3ByaXZhdGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoIXN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIHsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIGZhbHNlLCBpc19wcml2YXRlKTsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIHRydWUsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogTGVnYWN5IFN3aWZ0Mi9Db2NvYSBnZW5lcmF0b3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdAorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqLworCisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB2aXNpYmlsaXR5IDw8ICIgZmluYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIgOiBFcnJvclR5cGUiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIC8vIHByb3BlcnRpZXMKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIGluaXQKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworCisgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICB9CisgIGlmIChzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbml0IGZvciBwcm9wZXJ0aWVzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gYWxsICAgICBHZW5lcmF0ZSBpbml0IHdpdGggYWxsIG9yIGp1c3QgcmVxdWlyZWQgcHJvcGVydGllcworICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBpbml0aWFsaXplciBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0PXRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAoYWxsIHx8ICFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkpOworICAgIH0KKyAgICArK21faXRlcjsKKyAgfQorICBvdXQgPDwgIikiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBib29sIHNob3VsZF9zZXQgPSBhbGw7CisgICAgICBzaG91bGRfc2V0ID0gc2hvdWxkX3NldCB8fCAhZmllbGRfaXNfb3B0aW9uYWwoKCptX2l0ZXIpKTsKKyAgICAgIGlmIChzaG91bGRfc2V0KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyoqIGxlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKyAgICAgIGlmIChhbGwgfHwgKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBoYXNoYWJsZSBwcm90b2NvbCBpbXBsbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaGFzaGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IEhhc2hhYmxlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciBoYXNoVmFsdWUgOiBJbnQiOworICBibG9ja19vcGVuKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsZXQgcHJpbWUgPSAzMSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9IDEiIDw8IGVuZGw7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIHN0cmluZyBhY2Nlc3NvciA9IGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkgPyAiPy4iIDogIi4iOworICAgICAgICBzdHJpbmcgZGVmYXVsdG9yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICIgPz8gMCIgOiAiIjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyAoIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8IGFjY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIDw8ICAiaGFzaFZhbHVlIiA8PCBkZWZhdWx0b3IgPDwgIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggc2VsZiB7IiA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtX2l0ZXIrKykgeworICAgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAqbV9pdGVyOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgdmFsKTogcmVzdWx0ID0gcHJpbWUgJiogdmFsLmhhc2hWYWx1ZSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmVzdWx0IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMzEiIDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVxdWF0YWJsZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZ1bmMgPT0obGhzOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCByaHM6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IEJvb2wiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIobGhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAoZ2VuX2NvY29hXyA/ICIgPyIgOiAiICIpIDw8ICI9PSByaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIjsgLy8gc3dpZnQgMiA/PT0gb3BlcmF0b3Igbm90IGluIDM/CisgICAgICAgIGlmICgrK21faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIgJiYiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAobGhzLCByaHMpIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICguIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgbHZhbCksIC4iCisgICAgICAgICAgICAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBydmFsKSk6IHJldHVybiBsdmFsID09IHJ2YWwiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogcmV0dXJuIGZhbHNlIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4gUHJvZHVjZXMgZXh0ZW5zaW9ucyB0aGF0CisgKiBmdWxmaWxsIHRoZSByZXF1aXNpdGUgcHJvdG9jb2xzIHRvIGNvbXBsZXRlIHRoZSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisKKyAgaWYgKCFpc19wcml2YXRlICYmICFpc19yZXN1bHQgJiYgIWdlbl9jb2NvYV8pIHsgIC8vIG9sZCBjb21waWxlciBkaWRuJ3QgdXNlIGRlYnVnX2Rlc2NyaXB0aW9ucywgT1IgaXQgd2l0aCBnZW5fY29jb2FfIHNvIHRoZSBmbGFnIGRvZXNuJ3QgbWF0dGVyIHcvIGNvY29hCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19yZXN1bHQsIGlzX3ByaXZhdGUpOworCisgIG91dCA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIFRTdHJ1Y3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcmVzdWx0CisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IGEgcmVzdWx0IHZhbHVlCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRTdHJ1Y3QiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMsIG5vIHdyaXRlciB3ZSBqdXN0IHdyaXRlIGZpZWxkIElEJ3MgKi8KKyAgICBzdHJpbmcgYWNjZXNzID0gKGlzX3ByaXZhdGUpID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICAgIC8vIGdlbmVyYXRlIGZpZWxkSUQncyBkaWN0aW9uYXJ5CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgd3JvdGUgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgd3JvdGUgPSB0cnVlOworICAgICAgb3V0IDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiOworICAgIH0KKyAgICBpZiAoIXdyb3RlKSB7CisgICAgICAvLyBwYWQgYSBjb2xvbgorICAgICAgb3V0IDw8ICI6IjsKKyAgICB9CisgICAgb3V0IDw8ICJdIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgcmV0dXJuIFwiIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyoqIExlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciByZXQ6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPyI7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8IHBhZGRpbmcgPDwgInJldCA9ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6ICIgPDwgInRyeSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAgIDw8ICIucmVhZChmcm9tOiBwcm90bykpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHJldCA9IHJldCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXQiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiBcIk1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIHR5cGU6ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGEgc3RydWN0IGZyb20KKyAqIGZyb20gYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJmaWxlcHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiOworICAgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBwYWRkaW5nIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiLnJlYWQoZnJvbTogcHJvdG8pIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOiAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWYyL0NvY29hIGNhc2UgKi8KKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2woX19wcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9uYWwsICFvcHRpb25hbCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgX19wcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoXywgLlNUT1ApOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWsgZmllbGRzIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnkgX19wcm90by5yZWFkVmFsdWUoKSBhcyAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5za2lwVHlwZSh1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmIChmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYSBzdHJ1Y3QgdG8KKyAqIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpIE9OTFkgRk9SIFNXSUZUMi9DT0NPQQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0QmVnaW5XaXRoTmFtZShcIiIgPDwgbmFtZSA8PCAiXCIpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQgKnRmaWVsZCA9ICpmX2l0ZXI7CisKKyAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICA8PCAiID0gX192YWx1ZS4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZSgiCisgICAgICAgICAgICAgICAgPDwgKG9wdGlvbmFsID8gIiIgOiAiX192YWx1ZS4iKSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKSAgT05MWSBGT1IgU1dJRlQgMi9DT0NPQQorICoKKyAqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGEgZnVuY3Rpb24gcmVzdWx0LiBPbmx5CisgKiB0aGUgZmlyc3QgYXZhaWxhYmxlIGZpZWxkIGlzIHdyaXR0ZW4uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmVzdWx0ID0gX192YWx1ZS4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZUZpZWxkVmFsdWUocmVzdWx0LCAiCisgICAgICAgICAgICAgICAgPDwgIm5hbWU6IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJpZDogIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgLy8gQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgPDwgKGRlYnVnX2Rlc2NyaXB0aW9uc18gPyAiQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSIgOiAiQ3VzdG9tU3RyaW5nQ29udmVydGlibGUiKTsKKworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInZhciBkZXNjID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj1cXChTdHJpbmcoZGVzY3JpYmluZzogc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikpIjsKKyAgICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLlwiIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpO2ZfaXRlcisrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6IFxcKHZhbCkpXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoXCIiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI9XFwoc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiKVwiIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBkZXNjIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBTd2lmdCB0aGlzIGNvbnNpc3RzIG9mIGEKKyAqIHByb3RvY29sIGRlZmluaXRpb24gYW5kIGEgY2xpZW50ICh3aXRoIGl0J3MgaW1wbGVtZW50YXRpb24KKyAqIHNlcGFyYXRlZCBpbnRvIGV4dHMgZmlsZSkuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChmX2RlY2xfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMoZl9kZWNsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2ltcGxfLCAmcW5hbWVfdHMsIHRydWUpOworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHRfZmllbGQqIHN1Y2Nlc3MgPSBuZXcgdF9maWVsZCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKHN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqeCA9ICpmX2l0ZXI7CisgICAgdF9maWVsZCAqb3ggPSBuZXcgdF9maWVsZCh4LT5nZXRfdHlwZSgpLCB4LT5nZXRfbmFtZSgpLCB4LT5nZXRfa2V5KCkpOworICAgIG94LT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQob3gpOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZyZXN1bHQsIHRydWUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgZm9yIChmX2l0ZXIgPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5iZWdpbigpOyBmX2l0ZXIgIT0gcmVzdWx0LmdldF9tZW1iZXJzKCkuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZGVsZXRlICpmX2l0ZXI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcHJvdG9jb2wgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgb3V0IDw8ICIgOiAiIDw8IHBhcmVudC0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBmdW5jdGlvbl9kb2NzdHJpbmcob3V0LCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiAgLy8gZXhjZXB0aW9uczogIjsKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyBkb2MgPSB0c2VydmljZS0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYyI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsgIG91dCA8PCBlbmRsOyB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICB9IC8vCisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wZW4gY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIG91dCA8PCAiIDogIiA8PCAoKHBhcmVudCA9PSBOVUxMKSA/ICJUQ2xpZW50IiA6IHBhcmVudC0+Z2V0X25hbWUoKSArICJDbGllbnQiKTsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBhCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19pblByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX291dFByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gaW5vdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pblByb3RvY29sID0gaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19vdXRQcm90b2NvbCA9IG91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIkFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlQiIDogIHBhcmVudC0+Z2V0X25hbWUoKSkgKyAiQXN5bmNDbGllbnQ8UHJvdG9jb2wsIEZhY3Rvcnk+IjsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19wcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3RyYW5zcG9ydEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KHByb3RvY29sRmFjdG9yeTogVFByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX3Byb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnRGYWN0b3J5ID0gdHJhbnNwb3J0RmFjdG9yeSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGludGVyZmFjZSBkZWZpbml0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAqIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgLyogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiICovIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVhbGlhcyBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSA9ICIKKyAgICAgICAgPDwgIltTdHJpbmc6IChJbnQzMiwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyByZXF1aXJlZCBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgLyogIgorICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBzZXJ2aWNlIDogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAic2VsZi5zZXJ2aWNlID0gc2VydmljZSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHNlbmQgdGhlIGFyZ3VtZW50cworICogZm9yIGEgc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworCisgIHN0cmluZyBwcm90byA9IG5lZWRzX3Byb3RvY29sID8gKGdlbl9jb2NvYV8gPyAiX19vdXRQcm90b2NvbCIgOiAib24gb3V0UHJvdG9jb2wiKSA6ICIiOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmMgIiA8PCBzZW5kX2Z1bmN0aW9uLmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBwcm90bywgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgIikgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5vbmV3YXkiIDogIi5jYWxsIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBhcmdzLndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5PTkVXQVkiIDogIi5DQUxMIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2FyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoIjsKKworICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAoKmZfaXRlcik7CisgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgIiA8PCBhcmdzbmFtZSA8PCAiLndyaXRlVmFsdWUoX19hcmdzLCB0b1Byb3RvY29sOiBfX291dFByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWN2IHRoZSByZXN1bHQgZm9yIGEKKyAqIHNlcnZpY2UgZnVuY3Rpb24gdmlhIGEgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlICBUaGUgc2VydmljZSB0byBnZW5lcmF0ZQorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSBuZWVkc19wcm90b2NvbAorICogICAgICAgICAgICAgICAgICBXZXRoZXIgdGhlIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGEgcHJvdG9jb2wgb3IgaWYKKyAqICAgICAgICAgICAgICAgICAgdGhlIHByb3RvY29sIGlzIHRvIGJlIGFzc3VtZWQKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIm9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorICAgIG91dCA8PCAiKSB0aHJvd3MiOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJfID0gIjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIG91dCA8PCAidHJ5ICIgPDwgcmVzdWx0bmFtZSA8PCAiLnJlYWQoZnJvbTogaW5Qcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBzdWNjZXNzID0gcmVzdWx0LnN1Y2Nlc3MiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogXCIiCisgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKSkiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJfX2luUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorCisgICAgb3V0IDw8ICIpIHRocm93cyI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgIiAtPiAiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9faW5Qcm90b2NvbC5yZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworICAgIGluZGVudChvdXQpOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAibGV0IF9fcmVzdWx0ID0gIjsKKyAgICB9CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZFZhbHVlRnJvbVByb3RvY29sKF9faW5Qcm90b2NvbCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgX19zdWNjZXNzID0gX19yZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IF9fcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBOU0Vycm9yKCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4sICIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuTWlzc2luZ1Jlc3VsdC5yYXdWYWx1ZSksIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInVzZXJJbmZvOiBbVEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiXSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gdGhlIHNlbmQgZnVuY3Rpb24gZm9yIHRoZQorICogc2VydmljZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLiBUaGlzIGlzIGZvciBhc3luY2hyb25vdXMgcHJvdG9jb2xzLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8iOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wiOyAvLworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGlmIChnZW5fY29jb2FfKSB7IG91dCA8PCBlbmRsOyB9CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLnRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBhc3luY2hyb25vdXMgY2xpZW50IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHZpYSBleHRlbnNpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmNDbGllbnQiOworICBzdHJpbmcgcHJvdG9jb2xfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jIjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgbmFtZSA8PCAiIDogIiA8PCBwcm90b2NvbF9uYW1lOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCB0cmFuc3BvcnQgICA9IGZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBwcm90byA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIGxldCBlcnJvciB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGlvbiguZXJyb3IoZXJyb3IpKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBib29sIHJldF9pc192b2lkID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCk7CisgICAgYm9vbCBpc19vbmV3YXkgPSAoKmZfaXRlciktPmlzX29uZXdheSgpOworCisgICAgc3RyaW5nIGVycm9yX2NvbXBsZXRpb25fY2FsbCA9ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIjsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJhbnNwb3J0LmZsdXNoIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodHJhbnMsIGVycm9yKSBpbiIgPDwgZW5kbCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IGVycm9yID0gZXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZXJyb3JfY29tcGxldGlvbl9jYWxsIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgIGlmICghaXNfb25ld2F5KSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCFyZXRfaXNfdm9pZCkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIob246IHByb3RvKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChyZXRfaXNfdm9pZCA/ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA6ICJjb21wbGV0aW9uKC5zdWNjZXNzKHJlc3VsdCkpIikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA8PCBlbmRsOworICAgIH0KKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgInN1Y2Nlc3MsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3VjY2VzcygiOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmYWlsdXJlKGVycm9yIGFzIE5TRXJyb3IpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBmYWlsdXJlOiBmYWlsdXJlKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUHJvbWlzZSBmdW5jdGlvbgorICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCAoX19wcm9taXNlLCBfX2Z1bGZpbGwsIF9fcmVqZWN0KSA9IFByb21pc2U8IiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiPi5wZW5kaW5nUHJvbWlzZSgpIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fdHJhbnNwb3J0ID0gX190cmFuc3BvcnRGYWN0b3J5Lm5ld1RyYW5zcG9ydCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJ7IF9fZnVsZmlsbCgpIH0sIGZhaWx1cmU6IHsgX19yZWplY3QoJDApIH0pIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICAgIGluZGVudChvdXQpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZnVsZmlsbCgiOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZXN1bHQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IHsgZXJyb3IgaW4gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fcmVqZWN0KGVycm9yKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0pIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fcHJvbWlzZSIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgYSBibG9jayBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uIHRoYXQKKyAqIGhhbmRsZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhhdCBmdW5jdGlvbi4gVGhlIGJsb2NrcyBhcmUgc3RvcmVkIGluCisgKiBhIG1hcCBhbmQgbG9va2VkIHVwIHZpYSBmdW5jdGlvbi9tZXNzYWdlIG5hbWUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiBUUHJvY2Vzc29yIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBsZXQgcHJvY2Vzc29ySGFuZGxlcnMiIDw8IChnZW5fY29jb2FfID8gIiAiIDogIiIpIDw8ICI6IFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0iOworICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHByb2Nlc3NvckhhbmRsZXJzID0gUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24gPSAqZl9pdGVyOworCisgICAgc3RyaW5nIGFyZ3NfdHlwZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc29ySGFuZGxlcnNbXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdID0geyBzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgaGFuZGxlciBpbiIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gdHJ5ICIgPDwgYXJnc190eXBlIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woaW5Qcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSApIHsKKyAgICAgIHN0cmluZyByZXN1bHRfdHlwZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9ICIgPDwgcmVzdWx0X3R5cGUgPDwgIigpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBoYW5kbGVyLiIgPDwgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKworICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoIWdlbl9jb2NvYV8gfHwgZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgZmllbGROYW1lOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4ZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiOworCisgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICAgIGlmICgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPT0gIkVycm9yIiAmJiBuYW1lc3BhY2VkXyAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICAgICAgICBvdXQgPDwgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW0pIDw8ICIuIjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKworICAgICAgICAgIG91dCA8PCAiIHsgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBlcnJvciB9IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciB7IHRocm93IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0eXBlOiAucmVwbHksIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcmVzdWx0LndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4ZmllbGRzLmJlZ2luKCk7IHhfaXRlciAhPSB4ZmllbGRzLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIiA8PCBlbmRsOworICAgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IGVycm9yIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5SRVBMWSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSAiIDw8IHJlc3VsdF90eXBlIDw8ICIud3JpdGVWYWx1ZShyZXN1bHQsIHRvUHJvdG9jb2w6IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcHJvY2Vzc29ySGFuZGxlcnMiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0LGZhbHNlKTsKKyAgb3V0IDw8ICIoKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuYyBwcm9jZXNzT25JbnB1dFByb3RvY29sKGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgfQorICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChtZXNzYWdlTmFtZSwgXywgc2VxdWVuY2VJRCkgPSB0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBsZXQgcHJvY2Vzc29ySGFuZGxlciA9ICIgPDwgbmFtZSA8PCAiLnByb2Nlc3NvckhhbmRsZXJzW21lc3NhZ2VOYW1lXSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkbyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvY2Vzc29ySGFuZGxlcihzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgc2VydmljZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIFRBcHBsaWNhdGlvbkVycm9yIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXAodHlwZTogLnN0cnVjdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBleCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBtZXNzYWdlTmFtZSkpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCAiCisgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIE5TRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXBUeXBlKC5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShtZXNzYWdlTmFtZSwiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXg6IE5TRXJyb3IoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bk1ldGhvZC5yYXdWYWx1ZSksICIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWVdKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBTd2lmdCBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIFN3aWZ0IHR5cGUgbmFtZSwgaS5lLiBEaWN0aW9uYXJ5PEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbCwgYm9vbCBpc19mb3JjZWQpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXN1bHQgKz0gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCArPSAiVE1hcDwiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUU2V0PCIgKyB0eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTGlzdDwiICsgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKyAgZWxzZSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHJlc3VsdCArPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgKyAiLiI7CisgICAgfQorICAgIHJlc3VsdCArPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpc19vcHRpb25hbCkgeworICAgIHJlc3VsdCArPSAiPyI7CisgIH0KKyAgaWYgKGlzX2ZvcmNlZCkgeworICAgIHJlc3VsdCArPSAiISI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFN3aWZ0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gIlZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiBnZW5fY29jb2FfID8gIlRCaW5hcnkiIDogIkRhdGEiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIkludDgiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIkludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJJbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBTd2lmdCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGZ1bGwgY29uc3RhbnQgdmFsdWUgKGFzIHdvdWxkIGJlIHNlZW4gYWZ0ZXIgYW4gJz0nKQorICoKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgKGdlbl9jb2NvYV8gPyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSA6IGVudW1fY29uc3RfbmFtZSh2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSkpOyAvLyBTd2lmdDIvQ29jb2EgY29tcGF0aWJpbGl0eQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSBOVUxMOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICB2YWx1ZSA9IHZfaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHRmaWVsZC0+Z2V0X3R5cGUoKSwgdmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIWZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICAgICAgdGhyb3cgImNvbnN0YW50IGVycm9yOiByZXF1aXJlZCBmaWVsZCAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIuIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgaGFzIG5vIHZhbHVlIjsKKyAgICAgIH0KKworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICI6ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIl0iOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBTd2lmdCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICByZW5kZXIgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICByZW5kZXIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3dpZnQyL0NvY29hIGJhY2t3YXJkIGNvbXBhdCwgQmFkLCBkZWZhdWx0IGluaXQKKyAgICAgIHJlbmRlciA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIigpIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzIjsgLy8vIGFyZ3NyZXZpZXcKKworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXR0eXBlLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQgKz0gIiAtPiAiICsgdHlwZV9uYW1lKHR0eXBlKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gLSBSZXR1cm5zOiA8cmV0dXJuIHR5cGU+IChUaHJpZnQgaGFzIG5vIGRvY3N0cmluZyBvbiByZXR1cm4gdmFsKQorICAgIC8vIC8vLyAtIFRocm93czogPGV4Y2VwdGlvbiB0eXBlcz4KKworICAgIC8vIERlc2NyaXB0aW9uCisgICAgc3RyaW5nIGRvYyA9IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgaW5kZW50KG91dCkgPDwgIi8vLyIgPDwgZW5kbDsKKworICAgIC8vIFBhcmFtZXRlcnMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBQYXJhbWV0ZXJzOiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHN0cmluZyBkb2MgPSAoKmZfaXRlciktPmdldF9kb2MoKTsKKyAgICAgICAgaWYgKCFkb2MuZW1wdHkoKSAmJiBkb2NbZG9jLmxlbmd0aCgpLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGRvYy5lcmFzZShkb2MubGVuZ3RoKCktMSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGRvYyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybnMKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFJldHVybnM6ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRocm93cworICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBUaHJvd3M6ICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKnhfaXRlciAhPSB4Y2VwdGlvbnMuYmFjaygpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfSAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICAvLyBHZW5lcmF0ZSBkb2NzdHJpbmcgd2l0aCBmb2xsb3dpbmcgZm9ybWF0OgorICAgIC8vIC8vLyA8RGVzY3JpcHRpb24+CisgICAgLy8gLy8vIDxlbXB0eSBsaW5lPgorICAgIC8vIC8vLyAtIFBhcmFtZXRlcnM6CisgICAgLy8gLy8vICAgLSA8cGFyYW1ldGVyPjogPHBhcmFtZXRlciBkb2NzdHJpbmc+CisgICAgLy8gLy8vICAgLSBjYWxsYmFjazogPGNhbGxiYWNrIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcGxldGlvbgorICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtIGNvbXBsZXRpb246IFRBc3luY1Jlc3VsdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIj4gd3JhcHBpbmcgcmV0dXJuIGFuZCBmb2xsb3dpbmcgRXhjZXB0aW9uczogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBibG9ja3MuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogdGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIHN0cmluZyByZXN1bHQgPSAiZnVuYyAiICsgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyByZXNwb25zZV9zdHJpbmcgPSAiKFRBc3luY1Jlc3VsdDwiOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAodHR5cGUtPmlzX3ZvaWQoKSkgPyAiVm9pZCIgOiB0eXBlX25hbWUodHR5cGUpOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAiPikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJjb21wbGV0aW9uOiBAZXNjYXBpbmcgIiArIHJlc3BvbnNlX3N0cmluZyArICIpIjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAiKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIC0+IFZvaWQiOworICAgIHJlc3VsdCArPSAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKQorICAgICAgICAgICAgKyAodGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID8gIiwgIiA6ICIiKQorICAgICAgICAgICAgKyAic3VjY2VzczogIiArIHJlc3BvbnNlX3BhcmFtICsgIiwgIgorICAgICAgICAgICAgKyAiZmFpbHVyZTogKE5TRXJyb3IpIC0+IFZvaWQpIHRocm93cyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuCisgKiBPTkxZIEZPUiBTd2lmdDIvQ29jb2EgQkFDS1dBUkRTIENPTVBBVElCSUxJVFkKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuICJmdW5jICIgKyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKSArICIpIHRocm93cyAiCisgICAgICAgICArICItPiBQcm9taXNlPCIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgdmVyYm9zZSBmdW5jdGlvbiBuYW1lIHN1aXRhYmxlIGZvciBhIFN3aWZ0IG1ldGhvZC4gIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc3RyaW5nIGZpcnN0X2FyZyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5mcm9udCgpLT5nZXRfbmFtZSgpOworICAgIGlmIChuYW1lLnNpemUoKSA8IGZpcnN0X2FyZy5zaXplKCkgfHwKKyAgICAgICAgbG93ZXJjYXNlKG5hbWUuc3Vic3RyKG5hbWUuc2l6ZSgpLWZpcnN0X2FyZy5zaXplKCkpKSAhPSBsb3dlcmNhc2UoZmlyc3RfYXJnKSkgeworICAgICAgbmFtZSArPSAiV2l0aCIgKyBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKVswXS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBTd2lmdCBtZXRob2QgYXJndW1lbnQgbGlzdAorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGluY2x1ZGVfcHJvdG9jb2wpIHsKKyAgICByZXN1bHQgKz0gcHJvdG9jb2xfbmFtZSArICI6IFRQcm90b2NvbCI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9IGVsc2UgaWYgKCFmaWVsZHMuZW1wdHkoKSAmJiBpc19pbnRlcm5hbCAmJiBnZW5fY29jb2FfKSB7CisgICAgLy8gRm9yY2UgZmlyc3QgYXJndW1lbnQgdG8gYmUgbmFtZWQsIFN3aWZ0Mi9Db2NvYSBiYWNrd2FyZHMgY29tcGF0CisgICAgcmVzdWx0ICs9IGZpZWxkcy5mcm9udCgpLT5nZXRfbmFtZSgpICsgIiAiOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICB0X2ZpZWxkKiBhcmcgPSAqZl9pdGVyOworCisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAvLyBvcHRpb25hbCBhcmdzIG5vdCB1c3VhbGx5IHBlcm1pdHRlZCBmb3Igc29tZSByZWFzb24sIGV2ZW4gdGhvdWdoIGR5bmFtaWMgbGFuZ3MgaGFuZGxlIGl0CisgICAgICAvLyB1c2UgYW5ub3RhdGlvbiAic3dpZnQubnVsbGFibGUiIHRvIGFjaGlldmUKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSwgZmllbGRfaXNfb3B0aW9uYWwoYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSk7CisgICAgfQorCisgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvaW9zL2RvY3VtZW50YXRpb24vU3dpZnQvQ29uY2VwdHVhbC9Td2lmdF9Qcm9ncmFtbWluZ19MYW5ndWFnZS9MZXhpY2FsU3RydWN0dXJlLmh0bWwKKyAqCisgKi8KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fQ09MVU1OX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJfX0ZJTEVfXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRlVOQ1RJT05fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fTElORV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiQW55Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0aXZpdHkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJicmVhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjYXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNsYXNzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY29udGludWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb252ZW5pZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmF1bHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWZlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRpZFNldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRvIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImR5bmFtaWNUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmlsZXByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaW5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJnZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW1wb3J0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbmRpcmVjdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxhenkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZWZ0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJuaWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25lIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibm9ubXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVuIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcHRpb25hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm92ZXJyaWRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicG9zdGZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWNlZGVuY2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcmVmaXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcml2YXRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJvdG9jb2wiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJQcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInB1YmxpYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcXVpcmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXR1cm4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyaWdodCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJTZWxmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RhdGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3VwZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzd2l0Y2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvdyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRydWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidW5vd25lZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInZhciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndlYWsiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aGVyZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoaWxlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2lsbFNldCIpOworICB9IGVsc2UgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbnVtIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZXh0ZW5zaW9uIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsbHRocm91Z2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbm91dCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImludGVybmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInR5cGVhbGlhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgIH0KK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjptYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpIHsKKyAgaWYgKHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5maW5kKGlkZW50aWZpZXIpICE9IHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5lbmQoKSkgeworICAgIHJldHVybiAiYCIgKyBpZGVudGlmaWVyICsgImAiOworICB9CisgIHJldHVybiBpZGVudGlmaWVyOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgU3dpZnQgVFR5cGUgZW51bWVyYXRpb24uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSwgYm9vbCBxdWFsaWZpZWQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IHF1YWxpZmllZCA/ICJUVHlwZS4iIDogIi4iOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJzdHJpbmciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJib29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImk4IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJkb3VibGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cnVjdCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJtYXAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic2V0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJsaXN0IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSSU5HIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiQk9PTCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCWVRFIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJET1VCTEUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIlNUUlVDVCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJNQVAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU0VUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJMSVNUIjsKKyAgICB9CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBzd2lmdCwKKyAgICAiU3dpZnQgMy4wIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBzb3VyY2UgaW4gTW9kdWxlIHNjb3BlZCBvdXRwdXQgZGlyZWN0b3JpZXMgZm9yIFN3aWZ0IE5hbWVzcGFjaW5nLlxuIgorICAgICIgICAgY29jb2E6ICAgICAgICAgICBHZW5lcmF0ZSBTd2lmdCAyLnggY29kZSBjb21wYXRpYmxlIHdpdGggdGhlIFRocmlmdC9Db2NvYSBsaWJyYXJ5XG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcyAob25seSB1c2Ugd2l0aCBjb2NvYSBmbGFnKVxuIgorICAgICIgICAgc2FmZV9lbnVtczogICAgICBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmVkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBkZWZhdWx0X25zX3ByZWZpeCA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL25zLyI7CisKKy8qKgorICogVGhpcyBnZW5lcmF0b3IgY3JlYXRlcyBhbiBYTUwgbW9kZWwgb2YgdGhlIHBhcnNlZCBJREwgdHJlZSwgYW5kIGlzIGRlc2lnbmVkCisgKiB0byBtYWtlIGl0IGVhc3kgdG8gdXNlIHRoaXMgZmlsZSBhcyB0aGUgaW5wdXQgZm9yIG90aGVyIHRlbXBsYXRlIGVuZ2luZXMsCisgKiBzdWNoIGFzIFhTTFQuICBUbyB0aGlzIGVuZCwgdGhlIGdlbmVyYXRlZCBYTUwgaXMgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlIHRoYW4KKyAqIHlvdSBtaWdodCBleHBlY3QuLi4gZm9yIGV4YW1wbGUsIHJlZmVyZW5jZXMgdG8gImlkIiB0eXBlcyAoc3VjaCBhcyBzdHJ1Y3RzLAorICogdW5pb25zLCBldGMpIGFsd2F5cyBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBJREwgZG9jdW1lbnQsIGV2ZW4gaWYgdGhlIHR5cGUKKyAqIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIHJlZmVyZW5jZS4KKyAqLworY2xhc3MgdF94bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94bWxfZ2VuZXJhdG9yKCB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IGZhbHNlOworICAgIHNob3VsZF91c2VfZGVmYXVsdF9uc18gPSB0cnVlOworICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1lcmdlIikgPT0gMCkgeworICAgICAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9ucyIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19uYW1lc3BhY2VzIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX25hbWVzcGFjZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24geG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14bWwiOworICB9CisKKyAgdmlydHVhbCB+dF94bWxfZ2VuZXJhdG9yKCkge30KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworCisgIHZvaWQgaXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworICBib29sIHNob3VsZF91c2VfZGVmYXVsdF9uc187CisgIGJvb2wgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeG1sXzsKKworICBzdGQ6OnNldDxzdHJpbmc+IHByb2dyYW1zXzsKKyAgc3RkOjpzdGFjazxzdHJpbmc+IGVsZW1lbnRzXzsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19lbXB0eTsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19vcGVuOworCisgIHN0cmluZyB0YXJnZXRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdGFydChjb25zdCBzdHJpbmcgbmFtZSk7CisgIHZvaWQgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X2VuZCgpOworICB2b2lkIHdyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKTsKKyAgdm9pZCB3cml0ZV9pbnRfYXR0cmlidXRlKHN0cmluZyBrZXksIGludCB2YWwpOworICBzdHJpbmcgZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisKKyAgdm9pZCB3cml0ZV94bWxfY29tbWVudChzdHJpbmcgbXNnKTsKKworICB2b2lkIHdyaXRlX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfZG9jKHRfZG9jKiB0ZG9jKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RyaW5nIG51bWJlcl90b19zdHJpbmcoVCB0KSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgICAgb3V0LnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMxMCk7CisgICAgb3V0IDw8IHQ7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX251bWJlcihUIG4pIHsKKyAgICBmX3htbF8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX2VsZW1lbnRfbnVtYmVyKHN0cmluZyBuYW1lLCBUIG4pIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0cmluZyhuYW1lLCBudW1iZXJfdG9fc3RyaW5nKG4pKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX2VsZW1lbnRfc3RyaW5nKHN0cmluZyBuYW1lLCBzdHJpbmcgdmFsdWUpOworICB2b2lkIHdyaXRlX3ZhbHVlKHRfdHlwZSogdHZhbHVlKTsKKyAgdm9pZCB3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgeG1sX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiI7CisgIH0KK307CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl94bWxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIueG1sIjsKKyAgZl94bWxfLm9wZW4oZl94bWxfbmFtZS5jX3N0cigpKTsKKworICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7Cit9CisKK3N0cmluZyB0X3htbF9nZW5lcmF0b3I6OnRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4bWwiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCJ4bWwiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoIioiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbC50YXJnZXROYW1lc3BhY2UiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgfQorICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlcygpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgiKiIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgcHJvZ3JhbS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpIHsKKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgLy8gVE9ETzogaW5kZW50IGFueSBFT0xzIHRoYXQgbWF5IG9jY3VyIHdpdGggbXNnCisgIC8vIFRPRE86IHByb3BlciBtc2cgZXNjYXBpbmcgbmVlZGVkPworICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwhLS0gIiA8PCBtc2cgPDwgIiAtLT4iICA8PCBlbmRsOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Y2xvc2VfdG9wX2VsZW1lbnQoKSB7CisgIGlmKCB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IGZhbHNlOworICAgIGlmIChlbGVtZW50c18uc2l6ZSgpID4gMCAmJiB0b3BfZWxlbWVudF9pc19lbXB0eSkgeworICAgICAgZl94bWxfIDw8ICI+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdGFydChzdHJpbmcgbmFtZSkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCIgPDwgbmFtZTsKKyAgZWxlbWVudHNfLnB1c2gobmFtZSk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IHRydWU7CisgIGluZGVudF91cCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9lbmQoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmICh0b3BfZWxlbWVudF9pc19lbXB0eSAmJiB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgZl94bWxfIDw8ICIgLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8LyIgPDwgZWxlbWVudHNfLnRvcCgpIDw8ICI+IiA8PCBlbmRsOworICB9CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGVsZW1lbnRzXy5wb3AoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIGZfeG1sXyA8PCAiICIgPDwga2V5IDw8ICI9XCIiIDw8IGVzY2FwZV94bWxfc3RyaW5nKHZhbCkgPDwgIlwiIjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9hdHRyaWJ1dGUoa2V5LCBudW1iZXJfdG9fc3RyaW5nKHZhbCkpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWwpIHsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18gJiYgIXNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICBuYW1lID0gImlkbDoiICsgbmFtZTsKKyAgfQorICBjbG9zZV90b3BfZWxlbWVudCgpOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworICBmX3htbF8gPDwgaW5kZW50KCkKKyAgICA8PCAiPCIgPDwgbmFtZSA8PCAiPiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiPC8iIDw8IG5hbWUgPDwgIj4iCisgICAgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6ZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnJic6CisgICAgICBzcyA8PCAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiJnF1b3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIHNzIDw8ICImYXBvczsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBzcyA8PCAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIHNzIDw8ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfeG1sXy5jbG9zZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImlkbCIpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGlmIChzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6aWRsIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgIH0KKworICB3cml0ZV94bWxfY29tbWVudCggeG1sX2F1dG9nZW5fY29tbWVudCgpKTsKKworICBpdGVyYXRlX3Byb2dyYW0ocHJvZ3JhbV8pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6Oml0ZXJhdGVfcHJvZ3JhbSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkb2N1bWVudCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBjb25zdCBzdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0X25hbWVzcGFjZShwcm9ncmFtKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczoiICsgcHJvZ3JhbS0+Z2V0X25hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgfQorICB3cml0ZV9kb2MocHJvZ3JhbSk7CisKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICBmb3IgKGluY19pdCA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY19pdCAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJpbmNsdWRlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICBmb3IgKG5zX2l0ID0gbmFtZXNwYWNlcy5iZWdpbigpOyBuc19pdCAhPSBuYW1lc3BhY2VzLmVuZCgpOyArK25zX2l0KSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibmFtZXNwYWNlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgbnNfaXQtPmZpcnN0KTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInZhbHVlIiwgbnNfaXQtPnNlY29uZCk7CisgICAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhuc19pdC0+Zmlyc3QpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgLy8gVE9ETzogY2FuIGNvbnN0YW50cyBoYXZlIGFubm90YXRpb25zPworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0YW50KCpjX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBwcm9ncmFtc18uaW5zZXJ0KHByb2dyYW0tPmdldF9uYW1lKCkpOworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgcHJvZ19pdDsKKyAgICBmb3IgKHByb2dfaXQgPSBwcm9ncmFtcy5iZWdpbigpOyBwcm9nX2l0ICE9IHByb2dyYW1zLmVuZCgpOyArK3Byb2dfaXQpIHsKKyAgICAgIGlmICghcHJvZ3JhbXNfLmNvdW50KCgqcHJvZ19pdCktPmdldF9uYW1lKCkpKSB7CisgICAgICAgIGl0ZXJhdGVfcHJvZ3JhbSgqcHJvZ19pdCk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0eXBlZGVmIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHR0eXBlZGVmLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHR0eXBlZGVmKTsKKyAgd3JpdGVfdHlwZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHR5cGVkZWYtPmFubm90YXRpb25zXyk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHJldHVybjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBjb25zdCBzdHJpbmcgdHlwZSA9IGdldF90eXBlX25hbWUodHR5cGUpOworICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKKyAgaWYgKHR5cGUgPT0gImlkIikgeworICAgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZS1tb2R1bGUiLCB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLWlkIiwgdHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gImxpc3QiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAic2V0IikgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibWFwIikgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImtleVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKGt0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlVHlwZSIpOworICAgIHdyaXRlX3R5cGUodnR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2RvYyh0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nIGRvYyA9IHRkb2MtPmdldF9kb2MoKTsKKyAgICAvLyBmb3Igc29tZSByZWFzb24gdGhlcmUgYWx3YXlzIHNlZW1zIHRvIGJlIGEgdHJhaWxpbmcgbmV3bGluZSBvbiBkb2MKKyAgICAvLyBjb21tZW50czsgbG9vcCBiZWxvdyBuYWl2ZWx5IHRyaWVzIHRvIHN0cmlwIG9mZiB0cmFpbGluZyBjci9sZgorICAgIGludCBuID0gMDsKKyAgICBmb3IgKHN0cmluZzo6cmV2ZXJzZV9pdGVyYXRvciBpID0gZG9jLnJiZWdpbigpOyBpICE9IGRvYy5yZW5kKCk7IGkrKyxuKyspIHsKKyAgICAgIGlmICgqaSAhPSAnXG4nIHx8ICppID09ICdccicpIHsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKSAtIG4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZV9hdHRyaWJ1dGUoImRvYyIsIGRvYyk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fubm90YXRpb25zKAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gYW5ub3RhdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBhbm5vdGF0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiYW5ub3RhdGlvbiIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgia2V5IiwgaXRlci0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBpdGVyLT5zZWNvbmQpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJjb25zdCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBjb24tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2MoY29uKTsKKyAgd3JpdGVfdHlwZShjb24tPmdldF90eXBlKCkpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIHdyaXRlX2VsZW1lbnRfbnVtYmVyKCJpbnQiLCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImRvdWJsZSIsIHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKCJzdHJpbmciLCB2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJsaXN0Iik7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIH0KKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtYXAiKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWl0OworICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ2YWx1ZSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBkZWZhdWx0OgorICAgIGluZGVudF91cCgpOworICAgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPG51bGwgLz4iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBicmVhazsKKyAgfQorCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnVtIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHRlbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1lbWJlciIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfaW50X2F0dHJpYnV0ZSgidmFsdWUiLCB2YWwtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9kb2ModmFsKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh2YWwtPmFubm90YXRpb25zXyk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRlbnVtLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0cmluZyB0YWduYW1lID0gInN0cnVjdCI7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJ1bmlvbiI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHRhZ25hbWUgPSAiZXhjZXB0aW9uIjsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQodGFnbmFtZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHN0cnVjdCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZmllbGQiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfaW50X2F0dHJpYnV0ZSgiZmllbGQtaWQiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfZG9jKGZpZWxkKTsKKyAgc3RyaW5nIHJlcXVpcmVkbmVzczsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXF1aXJlZG5lc3MgPSAicmVxdWlyZWQiOworICAgIGJyZWFrOworICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgcmVxdWlyZWRuZXNzID0gIm9wdGlvbmFsIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXF1aXJlZG5lc3MgPSAiIjsKKyAgICBicmVhazsKKyAgfQorICBpZiAocmVxdWlyZWRuZXNzICE9ICIiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJyZXF1aXJlZCIsIHJlcXVpcmVkbmVzcyk7CisgIH0KKyAgd3JpdGVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisgIGdlbmVyYXRlX2Fubm90YXRpb25zKGZpZWxkLT5hbm5vdGF0aW9uc18pOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgic2VydmljZSIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0c2VydmljZS0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBzdHJpbmcgcHJvZ19ucyA9IHRhcmdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpOworICAgIGlmICgqcHJvZ19ucy5yYmVnaW4oKSAhPSAnLycpIHsKKyAgICAgIHByb2dfbnMucHVzaF9iYWNrKCcvJyk7CisgICAgfQorICAgIGNvbnN0IHN0cmluZyB0bnMgPSBwcm9nX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0bnMpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6dG5zIiwgdG5zKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGNvbnN0IHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LW1vZHVsZSIsIGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LWlkIiwgZXh0ZW5kcy0+Z2V0X25hbWUoKSk7CisgIH0KKworICB3cml0ZV9kb2ModHNlcnZpY2UpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgibWV0aG9kIik7CisKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGZ1bmMtPmdldF9uYW1lKCkpOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJvbmV3YXkiLCAidHJ1ZSIpOworICB9CisKKyAgd3JpdGVfZG9jKHRmdW5jKTsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJyZXR1cm5zIik7CisgIHdyaXRlX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhcmciKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0aHJvd3MiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRmdW5jLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6Z2V0X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKCh0dHlwZS0+aXNfZW51bSgpICAgICl8fAorICAgICAgKHR0eXBlLT5pc19zdHJ1Y3QoKSAgKXx8CisgICAgICAodHR5cGUtPmlzX3R5cGVkZWYoKSApfHwKKyAgICAgICh0dHlwZS0+aXNfeGNlcHRpb24oKSkpeworICAgIHJldHVybiAiaWQiOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBpZiAodGJhc2V0eXBlLT5pc19iaW5hcnkoKSApIHsKKyAgICAgIHJldHVybiAiYmluYXJ5IjsKKyAgICB9CisgICAgcmV0dXJuIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisgIHJldHVybiAiKHVua25vd24pIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgeG1sLAorICAiWE1MIiwKKyAgIiAgICBtZXJnZTogICAgICAgICAgIEdlbmVyYXRlIG91dHB1dCB3aXRoIGluY2x1ZGVkIGZpbGVzIG1lcmdlZFxuIgorICAiICAgIG5vX2RlZmF1bHRfbnM6ICAgT21pdCBkZWZhdWx0IHhtbG5zIGFuZCBhZGQgaWRsOiBwcmVmaXggdG8gYWxsIGVsZW1lbnRzXG4iCisgICIgICAgbm9fbmFtZXNwYWNlczogICBEbyBub3QgYWRkIG5hbWVzcGFjZSBkZWZpbml0aW9ucyB0byB0aGUgWE1MIG1vZGVsXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODdmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgorICoKKyAqLworY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94c2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4c2Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhzZCI7CisgIH0KKworICB2aXJ0dWFsIH50X3hzZF9nZW5lcmF0b3IoKSB7fQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7ICh2b2lkKXRlbnVtOyB9CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKK3ByaXZhdGU6CisgIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50ID0gZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIG5zKHN0ZDo6c3RyaW5nIGluLCBzdGQ6OnN0cmluZyBucykgeyByZXR1cm4gbnMgKyAiOiIgKyBpbjsgfQorCisgIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgeyByZXR1cm4gbnMoaW4sICJ4c2QiKTsgfQorCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiPCEtLVxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiIC0tPlxuIjsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeHNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3BocF87CisKKyAgLyoqCisgICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCisgICAqLworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOworfTsKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3BocF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl94c2QucGhwIjsKKyAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKKworICBmX3BocF8gPDwgIjw/cGhwIiA8PCBlbmRsCisgICAgICAgICA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX3BocF8gPDwgIj8+IiA8PCBlbmRsOworICBmX3BocF8uY2xvc2UoKTsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7CisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIiAvPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzaW1wbGVUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGJvb2wgeHNkX2FsbCA9IHRzdHJ1Y3QtPmdldF94c2RfYWxsKCk7CisKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT1cIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHhzZF9hbGwpIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZWxlbWVudChzX3hzZF90eXBlc18sCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfYXR0cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7CisgIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKKyAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOworICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7CisgIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGF0dHJzID09IE5VTEwgJiYgdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGUgLz4iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIHN0cmluZyBzdWJuYW1lOworICAgICAgICB0X3R5cGUqIHN1YnR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGlmIChzdWJ0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBzdWJ0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lICsgIl9lbHQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Ym5hbWUgPSB0eXBlX25hbWUoc3VidHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZl9waHBfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3hzZF9lbHRfIiA8PCBuYW1lIDw8ICInXSA9ICciIDw8IHN1Ym5hbWUKKyAgICAgICAgICAgICAgIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChhdHRycyA9PSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgPDwgIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiIC8+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQorICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl94c2RfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIueHNkIjsKKyAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3QgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHVyaSA9IGFubm90LmZpbmQoInVyaSIpOworICBpZiAodXJpICE9IGFubm90LmVuZCgpKSB7CisgICAgbnMgPSB1cmktPnNlY29uZDsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIG5zID0gIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgbnMgKyAiXCIgeG1sbnM9XCIiICsgbnMgKyAiXCIgIgorICAgICAgICAgKyAiZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIiOworICB9CisKKyAgLy8gUHJpbnQgdGhlIFhTRCBoZWFkZXIKKyAgZl94c2RfIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIgPDwgbnMgPDwgIj4iIDw8IGVuZGwKKyAgICAgICAgIDw8IHhtbF9hdXRvZ2VuX2NvbW1lbnQoKQorICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKKyAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOworCisgIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOworCisgIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAorICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKKyAgICBmX3hzZF8gPDwgZW5kbDsKKworICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgIH0KKyAgfQorCisgIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7CisgIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7CisgIH0KKworICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50CisgIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOworICBmX3hzZF8uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHhzZCgiaW50Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuICJjb250YWluZXIiOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKKyAqLworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAic2hvcnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZGVjaW1hbCI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1RvU3RyaW5nVGVzdC5qYXZhIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVG9TdHJpbmdUZXN0LmphdmEKcmVuYW1lIHRvIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWM2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dMT0JBTFNfSAorI2RlZmluZSBUX0dMT0JBTFNfSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKgorICogVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIChzbGFwIG9uIHRoZSB3cmlzdCkgdGhhdCBhcmUKKyAqIHNoYXJlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGZhY2lsaXRhdGUgc2ltcGxlCisgKiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiBCZWZvcmUgY2FsbGluZworICogeXlwYXJzZSgpLCB0aGUgbWFpbi5jYyBwcm9ncmFtIHdpbGwgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgdG8gdGhlc2UKKyAqIGdsb2JhbCB2YXJpYWJsZXMgc3VjaCB0aGF0IHRoZSBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYW5kIHB1dHMgZW50cmllcworICogaW50byB0aGUgcmlnaHQgY29udGFpbmVycywgZXRjLgorICoKKyAqLworCisvKioKKyAqIEhvb3JheSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0eXBlcyEKKyAqLworCitjbGFzcyB0X3Byb2dyYW07CitjbGFzcyB0X3Njb3BlOworY2xhc3MgdF90eXBlOworCisvKioKKyAqIFBhcnNpbmcgbW9kZSwgdHdvIHBhc3NlcyB1cCBpbiB0aGlzIGdpbiBydW1teSEKKyAqLworCitlbnVtIFBBUlNFX01PREUgeyBJTkNMVURFUyA9IDEsIFBST0dSQU0gPSAyIH07CisKKy8qKgorICogU3RyaWN0bmVzcyBsZXZlbAorICovCitleHRlcm4gaW50IGdfc3RyaWN0OworCisvKioKKyAqIFRoZSBtYXN0ZXIgcHJvZ3JhbSBwYXJzZSB0cmVlLiBUaGlzIGlzIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBwYXJzZXIgY29kZQorICogdG8gYnVpbGQgdXAgdGhlIHByb2dyYW0gZWxlbWVudHMuCisgKi8KK2V4dGVybiB0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKKworLyoqCisgKiBUaGUgc2NvcGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19zY29wZTsKKworLyoqCisgKiBUaGUgcGFyZW50IHNjb3BlIHRvIGFsc28gbG9hZCBzeW1ib2xzIGludG8KKyAqLworZXh0ZXJuIHRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOworCisvKioKKyAqIFRoZSBwcmVmaXggZm9yIHRoZSBwYXJlbnQgc2NvcGUgZW50cmllcworICovCitleHRlcm4gc3RkOjpzdHJpbmcgZ19wYXJlbnRfcHJlZml4OworCisvKioKKyAqIFRoZSBwYXJzaW5nIHBhc3MgdGhhdCB3ZSBhcmUgb24uIFdlIGRvIGRpZmZlcmVudCB0aGluZ3Mgb24gZWFjaCBwYXNzLgorICovCitleHRlcm4gUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7CisKKy8qKgorICogR2xvYmFsIHRpbWUgc3RyaW5nLCB1c2VkIGluIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjLgorICovCitleHRlcm4gY2hhciogZ190aW1lX3N0cjsKKworLyoqCisgKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitleHRlcm4gY2hhciogZ19kb2N0ZXh0OworCisvKioKKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitleHRlcm4gaW50IGdfZG9jdGV4dF9saW5lbm87CisKKy8qKgorICogU3RhdHVzIG9mIHByb2dyYW0gbGV2ZWwgZG9jdGV4dCBjYW5kaWRhdGUKKyAqLworZW51bSBQUk9HRE9DVEVYVF9TVEFUVVMgeworICBJTlZBTElEID0gMCwKKyAgU1RJTExfQ0FORElEQVRFID0gMSwgICAvLyB0aGUgdGV4dCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0CisgIEFMUkVBRFlfUFJPQ0VTU0VEID0gMiwgLy8gZG9jdGV4dCBoYXMgYmVlbiB1c2VkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgIEFCU09MVVRFTFlfU1VSRSA9IDMsICAgLy8gdGhpcyBpcyB0aGUgcHJvZ3JhbSBkb2N0ZXh0CisgIE5PX1BST0dSQU1fRE9DVEVYVCA9IDQgLy8gdGhlcmUgaXMgbm8gcHJvZ3JhbSBkb2N0ZXh0Cit9OworCisvKioKKyAqIFRoZSBwcm9ncmFtIGxldmVsIGRvY3RleHQuIFN0b3JlZCBzZXBhcmF0ZWx5IHRvIG1ha2UgcGFyc2luZyBlYXNpZXIuCisgKi8KK2V4dGVybiBjaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7CitleHRlcm4gaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubzsKK2V4dGVybiBQUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgorICoKKyAqIFdoZW4gYSBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgdXNlci1zcGVjaWZpZWQga2V5LCB0aHJpZnQgYXV0b21hdGljYWxseQorICogYXNzaWducyBhIG5lZ2F0aXZlIHZhbHVlLiAgSG93ZXZlciwgdGhpcyBpcyBmcmFnaWxlIHNpbmNlIGNoYW5nZXMgdG8gdGhlCisgKiBmaWxlIG1heSB1bmludGVudGlvbmFsbHkgY2hhbmdlIHRoZSBrZXkgbnVtYmVyaW5nLCByZXN1bHRpbmcgaW4gYSBuZXcKKyAqIHByb3RvY29sIHRoYXQgaXMgbm90IGJhY2t3YXJkcyBjb21wYXRpYmxlLgorICoKKyAqIFdoZW4gZ19hbGxvd19uZWdfZmllbGRfa2V5cyBpcyBlbmFibGVkLCB1c2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5CisgKiBuZWdhdGl2ZSBrZXlzLiAgVGhpcyB3YXkgdGhleSBjYW4gd3JpdGUgYSAudGhyaWZ0IGZpbGUgd2l0aCBleHBsaWNpdGx5CisgKiBzcGVjaWZpZWQga2V5cyB0aGF0IGlzIHN0aWxsIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgLnRocmlmdCBmaWxlcworICogdGhhdCBkaWQgbm90IHNwZWNpZnkga2V5IHZhbHVlcy4KKyAqLworZXh0ZXJuIGludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCisgKgorICogU29tZSBsYW5ndWFnZXMgZG9uJ3Qgc3VwcG9ydCA2NC1iaXQgY29uc3RhbnRzLCBidXQgbWFueSBkbywgc28gd2UgY2FuCisgKiBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgZm9yIHByb2plY3RzIHRoYXQgZG9uJ3QgdXNlIGFueSBub24tNjQtYml0LXNhZmUKKyAqIGxhbmd1YWdlcy4KKyAqLworZXh0ZXJuIGludCBnX2FsbG93XzY0Yml0X2NvbnN0czsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIxZjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogTG9nZ2luZyBmdW5jdGlvbnMgY29waWVkIGZyb20gbWFpbi5jYyB0byBhdm9pZCBsaW5rIGVycm9ycyBmb3IgcGx1Z2lucworICovCisKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworLy8gVE9ETzogbWFrZSBwbHVnaW5zIGFjY2VwdCBsb2cgb3B0aW9ucyBmcm9tIG1haW4gY29tcGlsZXIKK2ludCBnX2RlYnVnID0gMDsKK2ludCBnX3dhcm4gPSAxOworaW50IGdfdmVyYm9zZSA9IDA7CisKK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX2RlYnVnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICAvLyBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3ZlcmJvc2UgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKKyAgZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVmYmYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0xPR0dJTkdfSAorI2RlZmluZSBUX0xPR0dJTkdfSAorCitleHRlcm4gaW50IGdfZGVidWc7CitleHRlcm4gaW50IGdfd2FybjsKK2V4dGVybiBpbnQgZ192ZXJib3NlOworCisvKioKKyAqIFBhcnNlIGRlYnVnZ2luZyBvdXRwdXQsIHVzZWQgdG8gcHJpbnQgaGVscGZ1bCBpbmZvCisgKi8KK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBQYXJzZXIgd2FybmluZworICovCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIFByaW50IHZlcmJvc2Ugb3V0cHV0IG1lc3NhZ2UKKyAqLwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogRmFpbHVyZSEKKyAqLwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMxNzFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYwpAQCAtMCwwICsxLDEzMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCisgKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KKyAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQorICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCisgKgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPiAvKiBmb3IgR2V0RnVsbFBhdGhOYW1lICovCisjZW5kaWYKKworLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucworI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorI2lmZGVmIFRIUklGVF9FTkFCTEVfUExVR0lOCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8qKgorICogR2xvYmFsIHByb2dyYW0gdHJlZQorICovCit0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKKworLyoqCisgKiBHbG9iYWwgc2NvcGUKKyAqLwordF9zY29wZSogZ19zY29wZTsKKworLyoqCisgKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcworICovCit0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKKworLyoqCisgKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCisgKi8KK3N0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogUGFyc2luZyBwYXNzCisgKi8KK1BBUlNFX01PREUgZ19wYXJzZV9tb2RlOworCisvKioKKyAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cmRpcjsKKworLyoqCisgKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cnBhdGg7CisKKy8qKgorICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKKyAqLwordmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7CisKKy8qKgorICogR2xvYmFsIGRlYnVnIHN0YXRlCisgKi8KK2ludCBnX2RlYnVnID0gMDsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2ludCBnX3N0cmljdCA9IDEyNzsKKworLyoqCisgKiBXYXJuaW5nIGxldmVsCisgKi8KK2ludCBnX3dhcm4gPSAxOworCisvKioKKyAqIFZlcmJvc2Ugb3V0cHV0CisgKi8KK2ludCBnX3ZlcmJvc2UgPSAwOworCisvKioKKyAqIEdsb2JhbCB0aW1lIHN0cmluZworICovCitjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2NoYXIqIGdfZG9jdGV4dDsKKworLyoqCisgKiBUaGUgRmlyc3QgZG9jdGV4dCBjb21tZW50CisgKi8KK2NoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KKyAqLworaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqLworaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzID0gMDsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbgorICovCitib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7CisKKy8qKgorICogRmxhZ3MgdG8gY29udHJvbCB0aHJpZnQgYXVkaXQKKyAqLworYm9vbCBnX2F1ZGl0ID0gZmFsc2U7CisKKy8qKgorICogRmxhZyB0byBjb250cm9sIHJldHVybiBzdGF0dXMKKyAqLworYm9vbCBnX3JldHVybl9mYWlsdXJlID0gZmFsc2U7Citib29sIGdfYXVkaXRfZmF0YWwgPSB0cnVlOworYm9vbCBnX2dlbmVyYXRvcl9mYWlsdXJlID0gZmFsc2U7CisKKy8qKgorICogV2luMzIgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAorICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCisgKi8KK2NoYXIqIHNhZmVyZWFscGF0aChjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiByZXNvbHZlZF9wYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgIGNoYXIgYnVmW01BWF9QQVRIXTsKKyAgY2hhciogYmFzZW5hbWU7CisgIERXT1JEIGxlbiA9IEdldEZ1bGxQYXRoTmFtZShwYXRoLCBNQVhfUEFUSCwgYnVmLCAmYmFzZW5hbWUpOworICBpZiAobGVuID09IDAgfHwgbGVuID4gTUFYX1BBVEggLSAxKSB7CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOworICB9IGVsc2UgeworICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOworICB9CisKKyAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKKyAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KKyAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgeworICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKKyAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7CisgICAgfQorICB9CisgIHJldHVybiByZXNvbHZlZF9wYXRoOworI2Vsc2UKKyAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOworI2VuZGlmCit9CisKK2Jvb2wgY2hlY2tfaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIqIGRpcl9uYW1lKSB7CisjaWZkZWYgX1dJTjMyCisgIERXT1JEIGF0dHJpYnV0ZXMgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShkaXJfbmFtZSk7CisgIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogR2V0TGFzdEVycm9yKCkgPSAlbGRcbiIsCisgICAgICAgICAgICBkaXJfbmFtZSwKKyAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZWxzZQorICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgaWYgKHN0YXQoZGlyX25hbWUsICZzYikgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiAlc1xuIiwgZGlyX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgdXNlci4gVGhpcyBpcyBjYWxsZWQgeXllcnJvciBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucyAobGV4IGFuZCB5YWNjIGV4cGVjdCB0aGUgZXJyb3IgcmVwb3J0aW5nIHJvdXRpbmUgdG8gYmUgY2FsbGVkCisgKiB0aGlzKS4gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlcG9ydCBhbnkgZXJyb3JzIHRvIHRoZSB1c2VyLgorICogeXllcnJvciB0YWtlcyBwcmludGYgc3R5bGUgYXJndW1lbnRzLgorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW0VSUk9SOiVzOiVkXSAobGFzdCB0b2tlbiB3YXMgJyVzJylcbiIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubywgeXl0ZXh0KTsKKworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBmcm9tIHRoZSBwYXJzZXIuCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfZGVidWcgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgdmVyYm9zZSBvdXRwdXQgbW9kZSBtZXNzYWdlCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ192ZXJib3NlID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQorICovCitzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgeworICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7CisgIGlmIChzbGFzaCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cihzbGFzaCArIDEpOworICB9CisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGZpbGVuYW1lLnJmaW5kKCIuIik7CisgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoMCwgZG90KTsKKyAgfQorICByZXR1cm4gZmlsZW5hbWU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQorICovCitzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKKyAgLy8gTm8gc2xhc2gsIGp1c3QgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICBpZiAoc2xhc2ggPT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuICIuIjsKKyAgfQorICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyKDAsIHNsYXNoKTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUKKyAqLworc3RyaW5nIGluY2x1ZGVfZmlsZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgLy8gQWJzb2x1dGUgcGF0aD8gSnVzdCB0cnkgdGhhdAorICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKSB7CisgICAgLy8gUmVhbHBhdGghCisgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKKyAgICAgIHB3YXJuaW5nKDAsICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gU3RhdCB0aGlzIGZpbGUKKyAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKyAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7CisgICAgICByZXR1cm4gcnA7CisgICAgfQorICB9IGVsc2UgeyAvLyByZWxhdGl2ZSBwYXRoLCBzdGFydCBzZWFyY2hpbmcKKyAgICAvLyBuZXcgc2VhcmNoIHBhdGggd2l0aCBjdXJyZW50IGRpciBnbG9iYWwKKyAgICB2ZWN0b3I8c3RyaW5nPiBzcCA9IGdfaW5jbF9zZWFyY2hwYXRoOworICAgIHNwLmluc2VydChzcC5iZWdpbigpLCBnX2N1cmRpcik7CisKKyAgICAvLyBpdGVyYXRlIHRocm91Z2ggcGF0aHMKKyAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IHNwLmJlZ2luKCk7IGl0ICE9IHNwLmVuZCgpOyBpdCsrKSB7CisgICAgICBzdHJpbmcgc2ZpbGVuYW1lID0gKihpdCkgKyAiLyIgKyBmaWxlbmFtZTsKKworICAgICAgLy8gUmVhbHBhdGghCisgICAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICAgIGlmIChzYWZlcmVhbHBhdGgoc2ZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBTdGF0IHRoaXMgZmlsZXMKKyAgICAgIHN0cnVjdCBzdGF0IGZpbmZvOworICAgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgeworICAgICAgICByZXR1cm4gcnA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVWggb2gKKyAgcHdhcm5pbmcoMCwgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCisvKioKKyAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCisgKiBBbHNvIHByaW50cyBhIHdhcm5pbmcgaWYgd2UgYXJlIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24uCisgKi8KK3ZvaWQgY2xlYXJfZG9jdGV4dCgpIHsKKyAgaWYgKGdfZG9jdGV4dCAhPSBOVUxMKSB7CisgICAgcHdhcm5pbmcoMiwgIlVuY2FwdHVyZWQgZG9jdGV4dCBhdCBvbiBsaW5lICVkLiIsIGdfZG9jdGV4dF9saW5lbm8pOworICB9CisgIGZyZWUoZ19kb2N0ZXh0KTsKKyAgZ19kb2N0ZXh0ID0gTlVMTDsKK30KKworLyoqCisgKiBSZXNldCBwcm9ncmFtIGRvY3RleHQgaW5mb3JtYXRpb24gYWZ0ZXIgcHJvY2Vzc2luZyBhIGZpbGUKKyAqLwordm9pZCByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpIHsKKyAgaWYgKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSB7CisgICAgZnJlZShnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUpOworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IE5VTEw7CisgIH0KKyAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gMDsKKyAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKKyAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIElOVkFMSUQiKTsKK30KKworLyoqCisgKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KKyAqLwordm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpIHsKKyAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUJTT0xVVEVMWV9TVVJFOworICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBQlNPTFVURUxZX1NVUkUiKTsKKyAgfSBlbHNlIHsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBOT19QUk9HUkFNX0RPQ1RFWFQ7CisgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIE5PX1BST0dSQU1fRE9DVEVYVCIpOworICB9Cit9CisKKy8qKgorICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCisgKgorICogV2FybmluZzogaWYgeW91IG1peCB0YWJzIGFuZCBzcGFjZXMgaW4gYSBub24tdW5pZm9ybSB3YXksCisgKiB5b3Ugd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KKyAqLworY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KSB7CisgIC8vIENvbnZlcnQgdG8gQysrIHN0cmluZywgYW5kIHJlbW92ZSBXaW5kb3dzJ3MgY2FycmlhZ2UgcmV0dXJucy4KKyAgc3RyaW5nIGRvY3N0cmluZyA9IGRvY3RleHQ7CisgIGRvY3N0cmluZy5lcmFzZShyZW1vdmUoZG9jc3RyaW5nLmJlZ2luKCksIGRvY3N0cmluZy5lbmQoKSwgJ1xyJyksIGRvY3N0cmluZy5lbmQoKSk7CisKKyAgLy8gU2VwYXJhdGUgaW50byBsaW5lcy4KKyAgdmVjdG9yPHN0cmluZz4gbGluZXM7CisgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHN0cmluZzo6bnBvczsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBsYXN0ID0gKHBvcyA9PSBzdHJpbmc6Om5wb3MpID8gMCA6IHBvcyArIDE7CisgICAgcG9zID0gZG9jc3RyaW5nLmZpbmQoJ1xuJywgbGFzdCk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIEZpcnN0IGJpdCBvZiBjbGVhbmluZy4gIElmIHRoZSBsYXN0IGxpbmUgaXMgb25seSB3aGl0ZXNwYWNlLCBkcm9wIGl0LgorICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbm9ud2hpdGUgPSBkb2NzdHJpbmcuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGxhc3QpOworICAgICAgaWYgKG5vbndoaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0KSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCwgcG9zIC0gbGFzdCkpOworICB9CisKKyAgLy8gQSB2ZXJ5IHByb2ZvdW5kIGRvY3N0cmluZy4KKyAgaWYgKGxpbmVzLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIENsZWFyIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBmaXJzdCBsaW5lLgorICBwb3MgPSBsaW5lcy5mcm9udCgpLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgbGluZXMuZnJvbnQoKS5lcmFzZSgwLCBwb3MpOworCisgIC8vIElmIGV2ZXJ5IG5vbmJsYW5rIGxpbmUgYWZ0ZXIgdGhlIGZpcnN0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygc3BhY2VzL3RhYnMsCisgIC8vIHRoZW4gYSBzdGFyLCByZW1vdmUgdGhlbS4KKyAgYm9vbCBoYXZlX3ByZWZpeCA9IHRydWU7CisgIGJvb2wgZm91bmRfcHJlZml4ID0gZmFsc2U7CisgIHN0cmluZzo6c2l6ZV90eXBlIHByZWZpeF9sZW4gPSAwOworICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgbF9pdGVyOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKCFmb3VuZF9wcmVmaXgpIHsKKyAgICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChsX2l0ZXItPmF0KHBvcykgPT0gJyonKSB7CisgICAgICAgICAgZm91bmRfcHJlZml4ID0gdHJ1ZTsKKyAgICAgICAgICBwcmVmaXhfbGVuID0gcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgVHJ1bmNhdGUgaXQuCisgICAgICAgIGxfaXRlci0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxfaXRlci0+c2l6ZSgpID4gcG9zICYmIGxfaXRlci0+YXQocG9zKSA9PSAnKicgJiYgcG9zID09IHByZWZpeF9sZW4pIHsKKyAgICAgIC8vIEJ1c2luZXNzIGFzIHVzdWFsLgorICAgIH0gZWxzZSBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBMZXQncyB0cnVuY2F0ZSBpdCBmb3IgdGhlbS4KKyAgICAgIGxfaXRlci0+Y2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHBhdHRlcm4gaGFzIGJlZW4gYnJva2VuLgorICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCisgIGlmIChoYXZlX3ByZWZpeCkgeworICAgIC8vIEdldCB0aGUgc3RhciB0b28uCisgICAgcHJlZml4X2xlbisrOworICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7CisgICAgfQorICB9CisKKyAgLy8gTm93IGRlbGV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lLgorICBwcmVmaXhfbGVuID0gc3RyaW5nOjpucG9zOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIChwcmVmaXhfbGVuID09IHN0cmluZzo6bnBvcyB8fCBwb3MgPCBwcmVmaXhfbGVuKSkgeworICAgICAgcHJlZml4X2xlbiA9IHBvczsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgorICBpZiAocHJlZml4X2xlbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZS4KKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgcG9zID0gbF9pdGVyLT5maW5kX2xhc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgIT0gbF9pdGVyLT5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UocG9zICsgMSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGZpcnN0IGxpbmUgaXMgZW1wdHksIHJlbW92ZSBpdC4KKyAgLy8gRG9uJ3QgZG8gdGhpcyBlYXJsaWVyIGJlY2F1c2UgYSBsb3Qgb2Ygc3RlcHMgc2tpcCB0aGUgZmlyc3QgbGluZS4KKyAgaWYgKGxpbmVzLmZyb250KCkuZW1wdHkoKSkgeworICAgIGxpbmVzLmVyYXNlKGxpbmVzLmJlZ2luKCkpOworICB9CisKKyAgLy8gTm93IHJlam9pbiB0aGUgbGluZXMgYW5kIGNvcHkgdGhlbSBiYWNrIGludG8gZG9jdGV4dC4KKyAgZG9jc3RyaW5nLmNsZWFyKCk7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGRvY3N0cmluZyArPSAqbF9pdGVyOworICAgIGRvY3N0cmluZyArPSAnXG4nOworICB9CisKKyAgLy8gYXNzZXJ0KGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpOyAgbWF5IGhhcHBlbiwgc2VlIFRIUklGVC0xNzU1CisgIGlmIChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKSB7CisgICAgc3RyY3B5KGRvY3RleHQsIGRvY3N0cmluZy5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBmcmVlKGRvY3RleHQpOyAvLyB0b28gc2hvcnQKKyAgICBkb2N0ZXh0ID0gc3RyZHVwKGRvY3N0cmluZy5jX3N0cigpKTsKKyAgfQorICByZXR1cm4gZG9jdGV4dDsKK30KKworLyoqIFNldCB0byB0cnVlIHRvIGRlYnVnIGRvY3N0cmluZyBwYXJzaW5nICovCitzdGF0aWMgYm9vbCBkdW1wX2RvY3MgPSBmYWxzZTsKKworLyoqCisgKiBEdW1wcyBkb2NzdHJpbmdzIHRvIHN0ZG91dAorICogT25seSB3b3JrcyBmb3IgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCB0aGUgd2hvbGUgcHJvZ3JhbSBkb2MKKyAqIChpLmUuLCBub3QgZW51bSBjb25zdGFudHMsIHN0cnVjdCBmaWVsZHMsIG9yIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBkdW1wX2RvY3N0cmluZ3ModF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcm9nZG9jID0gcHJvZ3JhbS0+Z2V0X2RvYygpOworICBpZiAoIXByb2dkb2MuZW1wdHkoKSkgeworICAgIHByaW50ZigiV2hvbGUgcHJvZ3JhbSBkb2M6XG4lc1xuIiwgcHJvZ2RvYy5jX3N0cigpKTsKKyAgfQorICBjb25zdCB2ZWN0b3I8dF90eXBlZGVmKj4mIHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6Y29uc3RfaXRlcmF0b3IgdF9pdGVyOworICBmb3IgKHRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0X2l0ZXIpIHsKKyAgICB0X3R5cGVkZWYqIHRkID0gKnRfaXRlcjsKKyAgICBpZiAodGQtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJ0eXBlZGVmICVzOlxuJXNcbiIsIHRkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHRkLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgeworICAgIHRfZW51bSogZW4gPSAqZV9pdGVyOworICAgIGlmIChlbi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoImVudW0gJXM6XG4lc1xuIiwgZW4tPmdldF9uYW1lKCkuY19zdHIoKSwgZW4tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfY29uc3QqPiYgY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF9jb25zdCogY28gPSAqY19pdGVyOworICAgIGlmIChjby0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoImNvbnN0ICVzOlxuJXNcbiIsIGNvLT5nZXRfbmFtZSgpLmNfc3RyKCksIGNvLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgeworICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7CisgICAgaWYgKHN0LT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50Zigic3RydWN0ICVzOlxuJXNcbiIsIHN0LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN0LT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHhuID0gKnhfaXRlcjsKKyAgICBpZiAoeG4tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJ4Y2VwdGlvbiAlczpcbiVzXG4iLCB4bi0+Z2V0X25hbWUoKS5jX3N0cigpLCB4bi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKKyAgICBpZiAoc3YtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJzZXJ2aWNlICVzOlxuJXNcbiIsIHN2LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN2LT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KKyAqLwordm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKSB7CisgIGlmICgoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pICYmIChsaXN0X2VsZW1fdHlwZSAhPSBOVUxMKSAmJiBsaXN0X2VsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2UgPSAodF9iYXNlX3R5cGUqKWxpc3RfZWxlbV90eXBlOworICAgIGlmICh0YmFzZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgeworICAgICAgcHdhcm5pbmcoMSwgIkNvbnNpZGVyIHVzaW5nIHRoZSBtb3JlIGVmZmljaWVudCBcImJpbmFyeVwiIHR5cGUgaW5zdGVhZCBvZiBcImxpc3Q8Ynl0ZT5cIi4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGJvb2wgZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCA9IGZhbHNlOworCisvKioKKyAqIEVtaXRzIGEgb25lLXRpbWUgd2FybmluZyBvbiBieXRlIHR5cGUsIHByb21vdGluZyB0aGUgbmV3IGk4IHR5cGUgaW5zdGVhZAorICovCit2b2lkIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKSB7CisgIGlmICghZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCkgeworICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgIlRoZSBcImJ5dGVcIiB0eXBlIGlzIGEgY29tcGF0aWJpbGl0eSBhbGlhcyBmb3IgXCJpOFwiLiBVc2UgXCJpOFwiIHRvIGVtcGhhc2l6ZSB0aGUgIgorICAgICAgICAgICAgICJzaWduZWRuZXNzIG9mIHRoaXMgdHlwZS5cbiIpOworICAgIGdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIGRlcHJlY2F0aW9uIG5vdGljZSBmb3Igb2xkIE5TIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBJZiBuZXdfZm9ybSBpcyBOVUxMLCBvbGRfZm9ybSBpcyBhc3N1bWVkIHRvIGJlIGEgbGFuZ3VhZ2UgaWRlbnRpZmllciwgc3VjaCBhcyAiY3BwIgorICogSWYgbmV3X2Zvcm0gaXMgbm90IE5VTEwsIGJvdGggYXJndW1lbnRzIGFyZSB1c2VkIGV4YWN0bHkgYXMgZ2l2ZW4KKyAqLwordm9pZCBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbChjb25zdCBjaGFyKiBvbGRfZm9ybSwgY29uc3QgY2hhciogbmV3X2Zvcm0pIHsKKyAgY29uc3QgY2hhciogcmVtYWluZGVyID0gIiI7CisgIGlmKCBuZXdfZm9ybSA9PSBOVUxMKSB7CisgICAgbmV3X2Zvcm0gPSBvbGRfZm9ybTsKKyAgICByZW1haW5kZXIgPSAiX25hbWVzcGFjZSI7CisgIH0KKyAgZmFpbHVyZSgiVW5zdXBwb3J0ZWQgZGVjbGFyYXRpb24gJyVzJXMnLiBVc2UgJ25hbWVzcGFjZSAlcycgaW5zdGVhZC4iLCBvbGRfZm9ybSwgcmVtYWluZGVyLCBuZXdfZm9ybSk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlcgorICovCit2b2lkIHZlcnNpb24oKSB7CisgIHByaW50ZigiVGhyaWZ0IHZlcnNpb24gJXNcbiIsIFRIUklGVF9WRVJTSU9OKTsKK30KKworLyoqCisgKiBEaXNwbGF5IHRoZSB1c2FnZSBtZXNzYWdlIGFuZCB0aGVuIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkIHVzYWdlKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiVXNlIHRocmlmdCAtaGVscCBmb3IgYSBsaXN0IG9mIG9wdGlvbnNcbiIpOworICBleGl0KDEpOworfQorCisvKioKKyAqIERpcGxheXMgdGhlIGhlbHAgbWVzc2FnZSBhbmQgdGhlbiBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQgaGVscCgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyc2lvbiAgICBQcmludCB0aGUgY29tcGlsZXIgdmVyc2lvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbyBkaXIgICAgICBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGdlbi0qIHBhY2thZ2VzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXQgZGlyICAgIFNldCB0aGUgb3VwdXQgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChubyBnZW4tKiBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSSBkaXIgICAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ub3dhcm4gICAgIFN1cHByZXNzIGFsbCBjb21waWxlciB3YXJuaW5ncyAoQkFEISlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXN0cmljdCAgICAgU3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzIG9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12W2VyYm9zZV0gIFZlcmJvc2UgbW9kZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcltlY3Vyc2VdICBBbHNvIGdlbmVyYXRlIGluY2x1ZGVkIGZpbGVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kZWJ1ZyAgICAgIFBhcnNlIGRlYnVnIHRyYWNlIHRvIHN0ZG91dFxuIik7CisgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICIgIC0tYWxsb3ctbmVnLWtleXMgIEFsbG93IG5lZ2F0aXZlIGZpZWxkIGtleXMgKFVzZWQgdG8gIgorICAgICAgICAgICJwcmVzZXJ2ZSBwcm90b2NvbFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtLWFsbG93LTY0Yml0LWNvbnN0cyAgRG8gbm90IHByaW50IHdhcm5pbmdzIGFib3V0IHVzaW5nIDY0LWJpdCBjb25zdGFudHNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1nZW4gU1RSICAgR2VuZXJhdGUgY29kZSB3aXRoIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBnZW5lcmF0b3IuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgU1RSIGhhcyB0aGUgZm9ybSBsYW5ndWFnZVs6a2V5MT12YWwxWyxrZXkyWyxrZXkzPXZhbDNdXV0uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgZ2VuZXJhdG9yLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIE1hbnkgb3B0aW9ucyB3aWxsIG5vdCByZXF1aXJlIHZhbHVlcy5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9ucyByZWxhdGVkIHRvIGF1ZGl0IG9wZXJhdGlvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgLS1hdWRpdCBPbGRGaWxlICAgT2xkIFRocmlmdCBmaWxlIHRvIGJlIGF1ZGl0ZWQgd2l0aCAnZmlsZSdcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUlvbGQgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSW5ldyBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBnZW5lcmF0b3JzIChhbmQgb3B0aW9ucyk6XG4iKTsKKworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IGdlbl9tYXAgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gZ2VuX21hcC5iZWdpbigpOyBpdGVyICE9IGdlbl9tYXAuZW5kKCk7ICsraXRlcikgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIiAgJXMgKCVzKTpcbiIsCisgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X2xvbmdfbmFtZSgpLmNfc3RyKCkpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVyLT5zZWNvbmQtPmdldF9kb2N1bWVudGF0aW9uKCkuY19zdHIoKSk7CisgIH0KKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBZb3Uga25vdywgd2hlbiBJIHN0YXJ0ZWQgd29ya2luZyBvbiBUaHJpZnQgSSByZWFsbHkgdGhvdWdodCBpdCB3YXNuJ3QgZ29pbmcKKyAqIHRvIGJlY29tZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGJlY2F1c2UgaXQgd2FzIGp1c3QgYSBnZW5lcmF0b3IgYW5kIGl0CisgKiB3b3VsZG4ndCBuZWVkIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhbmQgYWxsIHRoYXQgamF6ei4gQnV0IHRoZW4gd2UKKyAqIGRlY2lkZWQgdG8gYWRkIGNvbnN0YW50cywgYW5kIGFsbCBvZiBhIHN1ZGRlbiB0aGF0IG1lYW5zIHJ1bnRpbWUgdHlwZQorICogdmFsaWRhdGlvbiBhbmQgaW5mZXJlbmNlLCBleGNlcHQgdGhlICJydW50aW1lIiBpcyB0aGUgY29kZSBnZW5lcmF0b3IKKyAqIHJ1bnRpbWUuCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfcmVjKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJ0eXBlIGVycm9yOiBjYW5ub3QgZGVjbGFyZSBhIHZvaWQgY29uc3Q6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cmluZyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYm9vbCI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUgorICAgICAgICAgICYmIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7CisgICAgfQorCisgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBkb3QgaW4gdGhlIGlkZW50aWZpZXIKKyAgICBzdGQ6OnN0cmluZyBuYW1lX3BvcnRpb24gPSB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lX3BvcnRpb24pIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICsgIiB3aGljaCBpcyBhbiBlbnVtLCBidXQgIiArIHZhbHVlLT5nZXRfaWRlbnRpZmllcigpCisgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX01BUCkgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cnVjdC94Y2VwdGlvbiI7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXItPmZpcnN0LT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIG5hbWUgKyAiIHN0cnVjdCBrZXkgbXVzdCBiZSBzdHJpbmciOworICAgICAgfQorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorCisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICIuIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga190eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdl90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxrZXk+Iiwga190eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjx2YWw+Iiwgdl90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZV90eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGVfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBlX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxlbGVtPiIsIGVfdHlwZSwgKnZfaXRlcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKKyAqIEl0J3MgZWFzaWVyIHRvIGRvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgcmV3cml0aW5nIHRoZSB3aG9sZSBncmFtbWFyIGV0Yy4KKyAqLwordm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKSB7CisgIHN0cmluZyBuYW1lKGlkZW50aWZpZXIpOworICBpZiAobmFtZS5maW5kKCIuIikgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgeXllcnJvcigiSWRlbnRpZmllciAlcyBjYW4ndCBoYXZlIGEgZG90LiIsIGlkZW50aWZpZXIpOworICAgIGV4aXQoMSk7CisgIH0KK30KKworLyoqCisgKiBDaGVjayB0aGUgdHlwZSBvZiB0aGUgcGFyc2VkIGNvbnN0IGluZm9ybWF0aW9uIGFnYWluc3QgaXRzIGRlY2xhcmVkIHR5cGUKKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpIHsKKyAgdmFsaWRhdGVfY29uc3RfcmVjKGMtPmdldF9uYW1lKCksIGMtPmdldF90eXBlKCksIGMtPmdldF92YWx1ZSgpKTsKK30KKworLyoqCisgKiBDaGVjayB0aGUgdHlwZSBvZiBhIGRlZmF1bHQgdmFsdWUgYXNzaWduZWQgdG8gYSBmaWVsZC4KKyAqLwordm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpIHsKKyAgdmFsaWRhdGVfY29uc3RfcmVjKGZpZWxkLT5nZXRfbmFtZSgpLCBmaWVsZC0+Z2V0X3R5cGUoKSwgY3YpOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBvZiBhIHRocm93cyBibG9jayBhcmUgYWN0dWFsbHkgZXhjZXB0aW9ucy4KKyAqLworYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdGhyb3dzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXRfZ2VuZXJhdG9yOjpnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU2tpcHMgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICovCitib29sIHNraXBfdXRmOF9ib20oRklMRSogZikgeworCisgIC8vIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB3b3JrcworICBpZiAoZmdldGMoZikgPT0gMHhFRikgeworICAgIGlmIChmZ2V0YyhmKSA9PSAweEJCKSB7CisgICAgICBpZiAoZmdldGMoZikgPT0gMHhCRikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXdpbmQoZik7CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBQYXJzZXMgYSBwcm9ncmFtCisgKi8KK3ZvaWQgcGFyc2UodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3Byb2dyYW0qIHBhcmVudF9wcm9ncmFtKSB7CisgIC8vIEdldCBzY29wZSBmaWxlIHBhdGgKKyAgc3RyaW5nIHBhdGggPSBwcm9ncmFtLT5nZXRfcGF0aCgpOworCisgIC8vIFNldCBjdXJyZW50IGRpciBnbG9iYWwsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGluY2x1ZGVfZmlsZSBmdW5jdGlvbgorICBnX2N1cmRpciA9IGRpcmVjdG9yeV9uYW1lKHBhdGgpOworICBnX2N1cnBhdGggPSBwYXRoOworCisgIC8vIE9wZW4gdGhlIGZpbGUKKyAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgIGlmICh5eWluID09IDApIHsKKyAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOworICB9CisgIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQorICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgbmV3IHNjb3BlIGFuZCBzY2FuIGZvciBpbmNsdWRlcworICBwdmVyYm9zZSgiU2Nhbm5pbmcgJXMgZm9yIGluY2x1ZGVzXG4iLCBwYXRoLmNfc3RyKCkpOworICBnX3BhcnNlX21vZGUgPSBJTkNMVURFUzsKKyAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKKyAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7CisgIHRyeSB7CisgICAgeXlsaW5lbm8gPSAxOworICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgeworICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyBpbmNsdWRlIHBhc3MuIik7CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgeCkgeworICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKKyAgfQorICBmY2xvc2UoeXlpbik7CisKKyAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgYWxsIHRoZSBpbmNsdWRlIHByb2dyYW1zCisgIHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBwYXJzZSgqaXRlciwgcHJvZ3JhbSk7CisgIH0KKworICAvLyByZXNldCBwcm9ncmFtIGRvY3RleHQgc3RhdHVzIGJlZm9yZSBwYXJzaW5nIGEgbmV3IGZpbGUKKyAgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKTsKKworICAvLyBQYXJzZSB0aGUgcHJvZ3JhbSBmaWxlCisgIGdfcGFyc2VfbW9kZSA9IFBST0dSQU07CisgIGdfcHJvZ3JhbSA9IHByb2dyYW07CisgIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOworICBnX3BhcmVudF9zY29wZSA9IChwYXJlbnRfcHJvZ3JhbSAhPSBOVUxMKSA/IHBhcmVudF9wcm9ncmFtLT5zY29wZSgpIDogTlVMTDsKKyAgZ19wYXJlbnRfcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICIuIjsKKyAgZ19jdXJwYXRoID0gcGF0aDsKKworICAvLyBPcGVuIHRoZSBmaWxlCisgIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoeXlpbiA9PSAwKSB7CisgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKKyAgfQorICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKKyAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7CisKKyAgcHZlcmJvc2UoIlBhcnNpbmcgJXMgZm9yIHR5cGVzXG4iLCBwYXRoLmNfc3RyKCkpOworICB5eWxpbmVubyA9IDE7CisgIHRyeSB7CisgICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7CisgICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIHR5cGVzIHBhc3MuIik7CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgeCkgeworICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKKyAgfQorICBmY2xvc2UoeXlpbik7Cit9CisKKy8qKgorICogR2VuZXJhdGUgY29kZQorICovCit2b2lkIGdlbmVyYXRlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGdlbmVyYXRvcl9zdHJpbmdzKSB7CisgIC8vIE9vb29oaCwgcmVjdXJzaXZlIGNvZGUgZ2VuZXJhdGlvbiwgaG90ISEKKyAgaWYgKGdlbl9yZWN1cnNlKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIC8vIFByb3BhZ2F0ZSBvdXRwdXQgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBwcm9ncmFtcworICAgICAgaW5jbHVkZXNbaV0tPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSwgcHJvZ3JhbS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSk7CisKKyAgICAgIGdlbmVyYXRlKGluY2x1ZGVzW2ldLCBnZW5lcmF0b3Jfc3RyaW5ncyk7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29kZSEKKyAgdHJ5IHsKKyAgICBwdmVyYm9zZSgiUHJvZ3JhbTogJXNcbiIsIHByb2dyYW0tPmdldF9wYXRoKCkuY19zdHIoKSk7CisKKyAgICBpZiAoZHVtcF9kb2NzKSB7CisgICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7CisgICAgfQorCisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOworCisgICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKKyNpZmRlZiBUSFJJRlRfRU5BQkxFX1BMVUdJTgorICAgICAgICBzd2l0Y2ggKHBsdWdpbl9vdXRwdXQ6OmRlbGVnYXRlVG9QbHVnaW4ocHJvZ3JhbSwgKml0ZXIpKSB7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fTk9UX0ZPVU5EOgorICAgICAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9GQUlMVVJFOgorICAgICAgICAgICAgcHdhcm5pbmcoMSwgIlBsdWdpbiBnZW5lcmF0b3IgZm9yIFwiJXNcIiBmYWlsZWQuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fU1VDQ0VFU1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZWxzZQorICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworI2VuZGlmCisgICAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcikgeworICAgICAgICBnZW5lcmF0b3ItPnZhbGlkYXRlX2lucHV0KCk7CisgICAgICAgIHB2ZXJib3NlKCJHZW5lcmF0aW5nIFwiJXNcIlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgIGdlbmVyYXRvci0+Z2VuZXJhdGVfcHJvZ3JhbSgpOworICAgICAgICBkZWxldGUgZ2VuZXJhdG9yOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKKyAgICBmYWlsdXJlKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgeworICAgIGZhaWx1cmUoIkVycm9yOiAlc1xuIiwgZXhjKTsKKyAgfQorfQorCit2b2lkIGF1ZGl0KHRfcHJvZ3JhbSogbmV3X3Byb2dyYW0sCisgICAgICAgICAgIHRfcHJvZ3JhbSogb2xkX3Byb2dyYW0sCisgICAgICAgICAgIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwKKyAgICAgICAgICAgc3RyaW5nIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKSB7CisgIHZlY3RvcjxzdHJpbmc+IHRlbXBfaW5jbF9zZWFyY2hwYXRoID0gZ19pbmNsX3NlYXJjaHBhdGg7CisgIGlmICghb2xkX3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgeworICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisgIH0KKworICBwYXJzZShvbGRfcHJvZ3JhbSwgTlVMTCk7CisKKyAgZ19pbmNsX3NlYXJjaHBhdGggPSB0ZW1wX2luY2xfc2VhcmNocGF0aDsKKyAgaWYgKCFuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7CisgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG5ld190aHJpZnRfaW5jbHVkZV9wYXRoKTsKKyAgfQorCisgIHBhcnNlKG5ld19wcm9ncmFtLCBOVUxMKTsKKworICBjb21wYXJlX25hbWVzcGFjZShuZXdfcHJvZ3JhbSwgb2xkX3Byb2dyYW0pOworICBjb21wYXJlX3NlcnZpY2VzKG5ld19wcm9ncmFtLT5nZXRfc2VydmljZXMoKSwgb2xkX3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpKTsKKyAgY29tcGFyZV9lbnVtcyhuZXdfcHJvZ3JhbS0+Z2V0X2VudW1zKCksIG9sZF9wcm9ncmFtLT5nZXRfZW51bXMoKSk7CisgIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCkpOworICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF94Y2VwdGlvbnMoKSwgb2xkX3Byb2dyYW0tPmdldF94Y2VwdGlvbnMoKSk7CisgIGNvbXBhcmVfY29uc3RzKG5ld19wcm9ncmFtLT5nZXRfY29uc3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfY29uc3RzKCkpOworfQorCisvKioKKyAqIFBhcnNlIGl0IHVwLi4gdGhlbiBzcGl0IGl0IGJhY2sgb3V0LCBpbiBwcmV0dHkgbXVjaCBldmVyeSBsYW5ndWFnZS4gQWxyaWdodAorICogbm90IHRoYXQgbWFueSBsYW5ndWFnZXMsIGJ1dCB0aGUgY29vbCBvbmVzIHRoYXQgd2UgY2FyZSBhYm91dC4KKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludCBpOworICBzdGQ6OnN0cmluZyBvdXRfcGF0aDsKKyAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IGZhbHNlOworCisgIC8vIFNldHVwIHRpbWUgc3RyaW5nCisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBnX3RpbWVfc3RyID0gY3RpbWUoJm5vdyk7CisKKyAgLy8gQ2hlY2sgZm9yIG5lY2Vzc2FyeSBhcmd1bWVudHMsIHlvdSBnb3R0YSBoYXZlIGF0IGxlYXN0IGEgZmlsZW5hbWUgYW5kCisgIC8vIGFuIG91dHB1dCBsYW5ndWFnZSBmbGFnCisgIGlmIChhcmdjIDwgMikgeworICAgIHVzYWdlKCk7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBnZW5lcmF0b3Jfc3RyaW5nczsKKyAgc3RyaW5nIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoOworICBzdHJpbmcgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGg7CisgIHN0cmluZyBvbGRfaW5wdXRfZmlsZTsKKworICAvLyBTZXQgdGhlIGN1cnJlbnQgcGF0aCB0byBhIGR1bW15IHZhbHVlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgorICBnX2N1cnBhdGggPSAiYXJndW1lbnRzIjsKKworICAvLyBIYWNreSBwYXJhbWV0ZXIgaGFuZGxpbmcuLi4gSSBkaWRuJ3QgZmVlbCBsaWtlIHVzaW5nIGEgbGlicmFyeSBzb3JyeSEKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2MgLSAxOyBpKyspIHsKKyAgICBjaGFyKiBhcmc7CisKKyAgICBhcmcgPSBzdHJ0b2soYXJndltpXSwgIiAiKTsKKyAgICB3aGlsZSAoYXJnICE9IE5VTEwpIHsKKyAgICAgIC8vIFRyZWF0IGRvdWJsZSBkYXNoZXMgYXMgc2luZ2xlIGRhc2hlcworICAgICAgaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJykgeworICAgICAgICArK2FyZzsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcChhcmcsICItaGVscCIpID09IDApIHsKKyAgICAgICAgaGVscCgpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXZlcnNpb24iKSA9PSAwKSB7CisgICAgICAgIHZlcnNpb24oKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZWJ1ZyIpID09IDApIHsKKyAgICAgICAgZ19kZWJ1ZyA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbm93YXJuIikgPT0gMCkgeworICAgICAgICBnX3dhcm4gPSAwOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0cmljdCIpID09IDApIHsKKyAgICAgICAgZ19zdHJpY3QgPSAyNTU7CisgICAgICAgIGdfd2FybiA9IDI7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdiIpID09IDAgfHwgc3RyY21wKGFyZywgIi12ZXJib3NlIikgPT0gMCkgeworICAgICAgICBnX3ZlcmJvc2UgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItcmVjdXJzZSIpID09IDApIHsKKyAgICAgICAgZ2VuX3JlY3Vyc2UgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LW5lZy1rZXlzIikgPT0gMCkgeworICAgICAgICBnX2FsbG93X25lZ19maWVsZF9rZXlzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy02NGJpdC1jb25zdHMiKSA9PSAwKSB7CisgICAgICAgIGdfYWxsb3dfNjRiaXRfY29uc3RzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1nZW4iKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGdlbmVyYXRvciBzcGVjaWZpY2F0aW9uXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjayhhcmcpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUkiKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIGFyZ3VtZW50IG9mICItSVwgYXNkZiIgaXMgaW52YWxpZCBhbmQgaGFzIHVua25vd24gcmVzdWx0cworICAgICAgICBhcmcgPSBhcmd2WysraV07CisKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhhcmcpOworICAgICAgfSBlbHNlIGlmICgoc3RyY21wKGFyZywgIi1vIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkpIHsKKyAgICAgICAgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1vOiBtaXNzaW5nIG91dHB1dCBkaXJlY3RvcnlcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X3BhdGggPSBhcmc7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgLy8gc3RyaXAgb3V0IHRyYWlsaW5nIFwgb24gV2luZG93cworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3QgPSBvdXRfcGF0aC5sZW5ndGgoKSAtIDE7CisgICAgICAgIGlmIChvdXRfcGF0aFtsYXN0XSA9PSAnXFwnKSB7CisgICAgICAgICAgb3V0X3BhdGguZXJhc2UobGFzdCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoIWNoZWNrX2lzX2RpcmVjdG9yeShvdXRfcGF0aC5jX3N0cigpKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYXVkaXQiKSA9PSAwKSB7CisgICAgICAgIGdfYXVkaXQgPSB0cnVlOworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBvbGQgdGhyaWZ0IGZpbGUgbmFtZSBmb3IgYXVkaXQgb3BlcmF0aW9uXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGNoYXIgb2xkX3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07CisKKyAgICAgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgICAgIGlmIChzYWZlcmVhbHBhdGgoYXJnLCBvbGRfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKKyAgICAgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBvbGRfaW5wdXRfZmlsZSA9IHN0cmluZyhvbGRfdGhyaWZ0X2ZpbGVfcnApOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0LW5vZmF0YWwiKSA9PSAwKSB7CisgICAgICAgIGdfYXVkaXRfZmF0YWwgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1Jb2xkIikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW5ldyIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG5ldyB0aHJpZnQgZmlsZVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuIiwgYXJnKTsKKyAgICAgICAgdXNhZ2UoKTsKKyAgICAgIH0KKworICAgICAgLy8gVG9rZW5pemUgbW9yZQorICAgICAgYXJnID0gc3RydG9rKE5VTEwsICIgIik7CisgICAgfQorICB9CisKKyAgLy8gZGlzcGxheSBoZWxwCisgIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLWhlbHAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS1oZWxwIikgPT0gMCkpIHsKKyAgICBoZWxwKCk7CisgIH0KKworICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQorICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi12ZXJzaW9uIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0tdmVyc2lvbiIpID09IDApKSB7CisgICAgdmVyc2lvbigpOworICAgIGV4aXQoMCk7CisgIH0KKworICAvLyBJbml0aWFsaXplIGdsb2JhbCB0eXBlcworICBpbml0R2xvYmFscygpOworCisgIGlmIChnX2F1ZGl0KSB7CisgICAgLy8gQXVkaXQgb3BlcmF0aW9uCisKKyAgICBpZiAob2xkX2lucHV0X2ZpbGUuZW1wdHkoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBvbGQgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgY2hhciBuZXdfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICBpZiAoYXJndltpXSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG5ldyB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBuZXdfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKKyAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmd2W2ldKTsKKyAgICB9CisgICAgc3RyaW5nIG5ld19pbnB1dF9maWxlKG5ld190aHJpZnRfZmlsZV9ycCk7CisKKyAgICB0X3Byb2dyYW0gbmV3X3Byb2dyYW0obmV3X2lucHV0X2ZpbGUpOworICAgIHRfcHJvZ3JhbSBvbGRfcHJvZ3JhbShvbGRfaW5wdXRfZmlsZSk7CisKKyAgICBhdWRpdCgmbmV3X3Byb2dyYW0sICZvbGRfcHJvZ3JhbSwgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKKworICB9IGVsc2UgeworICAgIC8vIEdlbmVyYXRlIG9wdGlvbnMKKworICAgIC8vIFlvdSBnb3R0YSBnZW5lcmF0ZSBzb21ldGhpbmchCisgICAgaWYgKGdlbmVyYXRvcl9zdHJpbmdzLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gb3V0cHV0IGxhbmd1YWdlKHMpIHNwZWNpZmllZFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIC8vIFJlYWwtcGF0aGlmeSBpdAorICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICBpZiAoYXJndltpXSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKKyAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmd2W2ldKTsKKyAgICB9CisgICAgc3RyaW5nIGlucHV0X2ZpbGUocnApOworCisgICAgLy8gSW5zdGFuY2Ugb2YgdGhlIGdsb2JhbCBwYXJzZSB0cmVlCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShpbnB1dF9maWxlKTsKKyAgICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7CisgICAgICBwcm9ncmFtLT5zZXRfb3V0X3BhdGgob3V0X3BhdGgsIG91dF9wYXRoX2lzX2Fic29sdXRlKTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSBjcHAgaW5jbHVkZSBwcmVmaXguCisgICAgLy8gaW5mZXIgdGhpcyBmcm9tIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4KKyAgICBzdHJpbmcgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W2ldOworICAgIHN0cmluZyBpbmNsdWRlX3ByZWZpeDsKKworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7CisgICAgaWYgKChsYXN0X3NsYXNoID0gaW5wdXRfZmlsZW5hbWUucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeCA9IGlucHV0X2ZpbGVuYW1lLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKKyAgICB9CisKKyAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOworCisgICAgLy8gUGFyc2UgaXQhCisgICAgcGFyc2UocHJvZ3JhbSwgTlVMTCk7CisKKyAgICAvLyBUaGUgY3VycmVudCBwYXRoIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgd2hlbiB3ZSBhcmUgZG9pbmcgZ2VuZXJhdGlvbi4KKyAgICAvLyBSZXNldCB0aGUgdmFyaWFibGUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCisgICAgZ19jdXJwYXRoID0gImdlbmVyYXRpb24iOworICAgIC8vIFJlc2V0IHl5bGluZW5vIGZvciB0aGUgaGVjayBvZiBpdC4gIFVzZSAxIGluc3RlYWQgb2YgMCBiZWNhdXNlCisgICAgLy8gVGhhdCBpcyB3aGF0IHNob3dzIHVwIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLgorICAgIHl5bGluZW5vID0gMTsKKworICAgIC8vIEdlbmVyYXRlIGl0IQorICAgIGdlbmVyYXRlKHByb2dyYW0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICBkZWxldGUgcHJvZ3JhbTsKKyAgfQorCisgIC8vIENsZWFuIHVwLiBXaG8gYW0gSSBraWRkaW5nLi4uIHRoaXMgcHJvZ3JhbSBwcm9iYWJseSBvcnBoYW5zIGhlYXAgbWVtb3J5CisgIC8vIGFsbCBvdmVyIHRoZSBwbGFjZSwgYnV0IHdobyBjYXJlcyBiZWNhdXNlIGl0IGlzIGFib3V0IHRvIGV4aXQgYW5kIGl0IGlzCisgIC8vIGFsbCByZWZlcmVuY2VkIGFuZCB1c2VkIGJ5IHRoaXMgd2Fja3kgcGFyc2UgdHJlZSB1cCB1bnRpbCBub3cgYW55d2F5cy4KKyAgY2xlYXJHbG9iYWxzKCk7CisKKyAgLy8gRmluaXNoZWQKKyAgaWYgKGdfcmV0dXJuX2ZhaWx1cmUgJiYgZ19hdWRpdF9mYXRhbCkgeworICAgIGV4aXQoMik7CisgIH0KKyAgaWYgKGdfZ2VuZXJhdG9yX2ZhaWx1cmUpIHsKKyAgICBleGl0KDMpOworICB9CisgIC8vIEZpbmlzaGVkCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWJiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX01BSU5fSAorI2RlZmluZSBUX01BSU5fSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKy8qKgorICogRGVmaW5lZCBpbiB0aGUgZmxleCBsaWJyYXJ5CisgKi8KKworZXh0ZXJuICJDIiB7IGludCB5eWxleCh2b2lkKTsgfQorCitpbnQgeXlwYXJzZSh2b2lkKTsKKworLyoqCisgKiBFeHBlY3RlZCB0byBiZSBkZWZpbmVkIGJ5IEZsZXgvQmlzb24KKyAqLwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcworICovCit2b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpOworCisvKioKKyAqIENoZWNrIGNvbnN0YW50IHR5cGVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKTsKKworLyoqCisgKiBDaGVjayBjb25zdGFudCB0eXBlcworICovCit2b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdik7CisKKy8qKgorICogQ2hlY2sgbWVtYmVycyBvZiBhIHRocm93cyBibG9jaworICovCitib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQorICovCitzdGQ6OnN0cmluZyBwcm9ncmFtX25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKKyAqLworc3RkOjpzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYW4gaW5jbHVkZSBmaWxlCisgKi8KK3N0ZDo6c3RyaW5nIGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KKyAqLwordm9pZCBjbGVhcl9kb2N0ZXh0KCk7CisKKy8qKgorICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCisgKi8KK2NoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCk7CisKKy8qKgorICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCisgKi8KK3ZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKworLyoqCisgKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgorICovCit2b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpOworCisvKioKKyAqIEVtaXRzIGEgb25lLXRpbWUgd2FybmluZyBvbiBieXRlIHR5cGUsIHByb21vdGluZyB0aGUgbmV3IGk4IHR5cGUgaW5zdGVhZAorICovCit2b2lkIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKTsKKworLyoqCisgKiBQcmludHMgZGVwcmVjYXRpb24gbm90aWNlIGZvciBvbGQgTlMgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIElmIG5ld19mb3JtIGlzIE5VTEwsIG9sZF9mb3JtIGlzIGFzc3VtZWQgdG8gYmUgYSBsYW5ndWFnZSBpZGVudGlmaWVyLCBzdWNoIGFzICJjcHAiCisgKiBJZiBuZXdfZm9ybSBpcyBub3QgTlVMTCwgYm90aCBhcmd1bWVudHMgYXJlIHVzZWQgZXhhY3RseSBhcyBnaXZlbgorICovCit2b2lkIGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKGNvbnN0IGNoYXIqIG9sZF9mb3JtLCBjb25zdCBjaGFyKiBuZXdfZm9ybSA9IE5VTEwpOworCisvKioKKyAqIEZsZXggdXRpbGl0aWVzCisgKi8KKworZXh0ZXJuIGludCB5eWxpbmVubzsKK2V4dGVybiBjaGFyIHl5dGV4dFtdOworZXh0ZXJuIHN0ZDo6RklMRSogeXlpbjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjc2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKwordF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSB7CisgIHRfdHlwZSogdHlwZSA9IHRoaXM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiB0eXBlOworfQorCitjb25zdCB0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIGNvbnN0IHsKKyAgY29uc3QgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM5OGJhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQkFTRV9UWVBFX0gKKyNkZWZpbmUgVF9CQVNFX1RZUEVfSAorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0aHJpZnQgYmFzZSB0eXBlLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUgZGVmaW5lZCBlbnVtZXJhdGVkIHR5cGVzIGluc2lkZQorICogdGhpcyBkZWZpbml0aW9uLgorICoKKyAqLworY2xhc3MgdF9iYXNlX3R5cGUgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVudW1lcmF0aW9uIG9mIHRocmlmdCBiYXNlIHR5cGVzCisgICAqLworICBlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lELAorICAgIFRZUEVfU1RSSU5HLAorICAgIFRZUEVfQk9PTCwKKyAgICBUWVBFX0k4LAorICAgIFRZUEVfSTE2LAorICAgIFRZUEVfSTMyLAorICAgIFRZUEVfSTY0LAorICAgIFRZUEVfRE9VQkxFCisgIH07CisKKyAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpCisgICAgOiB0X3R5cGUobmFtZSksIGJhc2VfKGJhc2UpLCBzdHJpbmdfbGlzdF8oZmFsc2UpLCBiaW5hcnlfKGZhbHNlKSwgc3RyaW5nX2VudW1fKGZhbHNlKSB7fQorCisgIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfOyB9CisKKyAgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOyB9CisKKyAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQorCisgIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7IHN0cmluZ19saXN0XyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfbGlzdF8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgeyBiaW5hcnlfID0gdmFsOyB9CisKKyAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBiaW5hcnlfICYmIChiYXNlXyA9PSBUWVBFX1NUUklORyk7IH0KKworICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgeyBzdHJpbmdfZW51bV8gPSB2YWw7IH0KKworICBib29sIGlzX3N0cmluZ19lbnVtKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fICYmIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgeyBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV92YWxzXzsgfQorCisgIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyB0X2Jhc2VfbmFtZSh0X2Jhc2UgdGJhc2UpIHsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSBUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JODoKKyAgICAgIHJldHVybiAiaTgiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIih1bmtub3duKSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdF9iYXNlIGJhc2VfOworCisgIGJvb2wgc3RyaW5nX2xpc3RfOworICBib29sIGJpbmFyeV87CisgIGJvb2wgc3RyaW5nX2VudW1fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nX2VudW1fdmFsc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlNUX0gKKyNkZWZpbmUgVF9DT05TVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKworLyoqCisgKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKKyAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCisgKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCisgKiB3aG9sZSB0aGluZyBvdXQuCisgKgorICovCitjbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQorICAgIDogdHlwZV8odHlwZSksIG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAorI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgewordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qLCBUbyYpOworfQorCisvKioKKyAqIEEgY29uc3QgdmFsdWUgaXMgc29tZXRoaW5nIHBhcnNlZCB0aGF0IGNvdWxkIGJlIGEgbWFwLCBzZXQsIGxpc3QsIHN0cnVjdAorICogb3Igd2hhdGV2ZXIuCisgKgorICovCitjbGFzcyB0X2NvbnN0X3ZhbHVlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleS4KKyAgICogTWFrZSB0aGlzIGEgZnVuY3RvciBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gaGVscCBHQ0MgaW5saW5lIGl0LgorICAgKi8KKyAgc3RydWN0IHZhbHVlX2NvbXBhcmUgeworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKHRfY29uc3RfdmFsdWUgY29uc3QqIGNvbnN0JiBsZWZ0LCB0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgcmlnaHQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqbGVmdCA8ICpyaWdodDsKKyAgICB9CisgIH07CisKKyAgZW51bSB0X2NvbnN0X3ZhbHVlX3R5cGUgeyBDVl9JTlRFR0VSLCBDVl9ET1VCTEUsIENWX1NUUklORywgQ1ZfTUFQLCBDVl9MSVNULCBDVl9JREVOVElGSUVSLCBDVl9VTktOT1dOIH07CisKKyAgdF9jb25zdF92YWx1ZSgpIDogaW50VmFsXygwKSwgZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHt9CisKKyAgdF9jb25zdF92YWx1ZShpbnQ2NF90IHZhbCkgOiBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikgeyBzZXRfaW50ZWdlcih2YWwpOyB9CisKKyAgdF9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyB2YWwpIDogaW50VmFsXygwKSwgZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X3N0cmluZyh2YWwpOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nKHN0ZDo6c3RyaW5nIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfU1RSSU5HOworICAgIHN0cmluZ1ZhbF8gPSB2YWw7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nVmFsXzsgfQorCisgIHZvaWQgc2V0X2ludGVnZXIoaW50NjRfdCB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0lOVEVHRVI7CisgICAgaW50VmFsXyA9IHZhbDsKKyAgfQorCisgIGludDY0X3QgZ2V0X2ludGVnZXIoKSBjb25zdCB7CisgICAgaWYgKHZhbFR5cGVfID09IENWX0lERU5USUZJRVIpIHsKKyAgICAgIGlmIChlbnVtXyA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJoYXZlIGlkZW50aWZpZXIgXCIiICsgZ2V0X2lkZW50aWZpZXIoKSArICJcIiwgYnV0IHVuc2V0IGVudW0gb24gbGluZSEiOworICAgICAgfQorICAgICAgc3RkOjpzdHJpbmcgaWRlbnRpZmllciA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGlkZW50aWZpZXIucmZpbmQoJy4nKTsKKyAgICAgIGlmIChkb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIuc3Vic3RyKGRvdCArIDEpOworICAgICAgfQorICAgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSBlbnVtXy0+Z2V0X2NvbnN0YW50X2J5X25hbWUoaWRlbnRpZmllcik7CisgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgIlVuYWJsZSB0byBmaW5kIGVudW0gdmFsdWUgXCIiICsgaWRlbnRpZmllciArICJcIiBpbiBlbnVtIFwiIiArIGVudW1fLT5nZXRfbmFtZSgpCisgICAgICAgICAgICArICJcIiI7CisgICAgICB9CisgICAgICByZXR1cm4gdmFsLT5nZXRfdmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGludFZhbF87CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0RPVUJMRTsKKyAgICBkb3VibGVWYWxfID0gdmFsOworICB9CisKKyAgZG91YmxlIGdldF9kb3VibGUoKSBjb25zdCB7IHJldHVybiBkb3VibGVWYWxfOyB9CisKKyAgdm9pZCBzZXRfbWFwKCkgeyB2YWxUeXBlXyA9IENWX01BUDsgfQorCisgIHZvaWQgYWRkX21hcCh0X2NvbnN0X3ZhbHVlKiBrZXksIHRfY29uc3RfdmFsdWUqIHZhbCkgeyBtYXBWYWxfW2tleV0gPSB2YWw7IH0KKworICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBnZXRfbWFwKCkgY29uc3QgeyByZXR1cm4gbWFwVmFsXzsgfQorCisgIHZvaWQgc2V0X2xpc3QoKSB7IHZhbFR5cGVfID0gQ1ZfTElTVDsgfQorCisgIHZvaWQgYWRkX2xpc3QodF9jb25zdF92YWx1ZSogdmFsKSB7IGxpc3RWYWxfLnB1c2hfYmFjayh2YWwpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBnZXRfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGxpc3RWYWxfOyB9CisKKyAgdm9pZCBzZXRfaWRlbnRpZmllcihzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0lERU5USUZJRVI7CisgICAgaWRlbnRpZmllclZhbF8gPSB2YWw7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIGlkZW50aWZpZXJWYWxfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfbmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOworICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7CisgICAgfQorICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKKyAgICB9CisgICAgc2l6ZV90IHMyID0gcmV0LmZpbmQoJy4nLCBzICsgMSk7CisgICAgaWYgKHMyICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHZvaWQgc2V0X2VudW0odF9lbnVtKiB0ZW51bSkgeyBlbnVtXyA9IHRlbnVtOyB9CisKKyAgdF9jb25zdF92YWx1ZV90eXBlIGdldF90eXBlKCkgY29uc3QgeyBpZiAodmFsVHlwZV8gPT0gQ1ZfVU5LTk9XTikgeyB0aHJvdyBzdGQ6OnN0cmluZygidW5rbm93biB0X2NvbnN0X3ZhbHVlIik7IH0gcmV0dXJuIHZhbFR5cGVfOyB9CisKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBtYXAgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkgYW5kIHRoZW4gdmFsdWUuCisgICAqIFRoaXMgaXMgdXNlZCBmb3IgbWFwIGNvbXBhcmlzb24gaW4gbGV4aWNvZ3JhcGhpYyBvcmRlci4KKyAgICovCisgIHN0cnVjdCBtYXBfZW50cnlfY29tcGFyZSB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBDb25zdFBhaXI7CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoQ29uc3RQYWlyIGxlZnQsIENvbnN0UGFpciByaWdodCkgY29uc3QgeworICAgICAgaWYgKCoobGVmdC5maXJzdCkgPCAqKHJpZ2h0LmZpcnN0KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqKHJpZ2h0LmZpcnN0KSA8ICoobGVmdC5maXJzdCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICoobGVmdC5zZWNvbmQpIDwgKihyaWdodC5zZWNvbmQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgdF9jb25zdF92YWx1ZSYgdGhhdCkgY29uc3QgeworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQxID0gZ2V0X3R5cGUoKTsKKyAgICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MiA9IHRoYXQuZ2V0X3R5cGUoKTsKKyAgICBpZiAodDEgIT0gdDIpCisgICAgICByZXR1cm4gdDEgPCB0MjsKKyAgICBzd2l0Y2ggKHQxKSB7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICByZXR1cm4gaW50VmFsXyA8IHRoYXQuaW50VmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgICAgcmV0dXJuIGRvdWJsZVZhbF8gPCB0aGF0LmRvdWJsZVZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgIHJldHVybiBzdHJpbmdWYWxfIDwgdGhhdC5zdHJpbmdWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgcmV0dXJuIGlkZW50aWZpZXJWYWxfIDwgdGhhdC5pZGVudGlmaWVyVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbWFwVmFsXy5iZWdpbigpLCBtYXBWYWxfLmVuZCgpLCB0aGF0Lm1hcFZhbF8uYmVnaW4oKSwgdGhhdC5tYXBWYWxfLmVuZCgpLCBtYXBfZW50cnlfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgIGxpc3RWYWxfLmJlZ2luKCksIGxpc3RWYWxfLmVuZCgpLCB0aGF0Lmxpc3RWYWxfLmJlZ2luKCksIHRoYXQubGlzdFZhbF8uZW5kKCksIHZhbHVlX2NvbXBhcmUoKSk7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJ1bmtub3duIHZhbHVlIHR5cGUiOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHZhbHVlX2NvbXBhcmU+IG1hcFZhbF87CisgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKKyAgaW50NjRfdCBpbnRWYWxfOworICBkb3VibGUgZG91YmxlVmFsXzsKKyAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87CisgIHRfZW51bSogZW51bV87CisKKyAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOworCisgIC8vIHRvIHJlYWQgZW51bV8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorICBmcmllbmQgdm9pZCBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KEZyb20qLCBUbyYpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRhYjcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05UQUlORVJfSAorI2RlZmluZSBUX0NPTlRBSU5FUl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKK2NsYXNzIHRfY29udGFpbmVyIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfY29udGFpbmVyKCkgOiBjcHBfbmFtZV8oKSwgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KKworICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9CisKKyAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKKyAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKKyAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaGFzX2NwcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gaGFzX2NwcF9uYW1lXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9jcHBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNwcF9uYW1lXzsgfQorCisgIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBjcHBfbmFtZV87CisgIGJvb2wgaGFzX2NwcF9uYW1lXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjYjhmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRE9DX0gKKyNkZWZpbmUgVF9ET0NfSAorCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorCisvKioKKyAqIERvY3VtZW50YXRpb24gc3R1YnMKKyAqCisgKi8KK2NsYXNzIHRfZG9jIHsKKworcHVibGljOgorICB0X2RvYygpIDogaGFzX2RvY18oZmFsc2UpIHt9CisgIHZpcnR1YWwgfnRfZG9jKCkge30KKworICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgeworICAgIGRvY18gPSBkb2M7CisgICAgaGFzX2RvY18gPSB0cnVlOworICAgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID09IGdfZG9jdGV4dF9saW5lbm8pCisgICAgICAgICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7CisgICAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUxSRUFEWV9QUk9DRVNTRUQiKTsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2RvYygpIGNvbnN0IHsgcmV0dXJuIGRvY187IH0KKworICBib29sIGhhc19kb2MoKSB7IHJldHVybiBoYXNfZG9jXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBkb2NfOworICBib29sIGhhc19kb2NfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjM3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRU5VTV9ICisjZGVmaW5lIFRfRU5VTV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEFuIGVudW1lcmF0ZWQgdHlwZS4gQSBsaXN0IG9mIGNvbnN0YW50IG9iamVjdHMgd2l0aCBhIG5hbWUgZm9yIHRoZSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9lbnVtIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7IGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgY29uc3QgeyByZXR1cm4gY29uc3RhbnRzXzsgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9taW5fdmFsdWUoKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtaW5fdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtaW5fdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWluX3ZhbHVlX3ZhbHVlOworICAgICAgbWluX3ZhbHVlID0gZW51bV92YWx1ZXMuZnJvbnQoKTsKKyAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPCBtaW5fdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtaW5fdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWluX3ZhbHVlOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfbWF4X3ZhbHVlKCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIHRfZW51bV92YWx1ZSogbWF4X3ZhbHVlOworICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgbWF4X3ZhbHVlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG1heF92YWx1ZV92YWx1ZTsKKyAgICAgIG1heF92YWx1ZSA9IGVudW1fdmFsdWVzLmJhY2soKTsKKyAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPiBtYXhfdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtYXhfdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4X3ZhbHVlOworICB9CisKKyAgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmYzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKKyNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAorICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZW0uCisgKgorICovCitjbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6IG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgfnRfZW51bV92YWx1ZSgpIHt9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICBpbnQgZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBpbnQgdmFsdWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRklFTERfSAorI2RlZmluZSBUX0ZJRUxEX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLy8gRm9yd2FyZCBkZWNsYXJlIGZvciB4c2RfYXR0cnMKK2NsYXNzIHRfc3RydWN0OworCisvKioKKyAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGZpZWxkIGluIGEgdGhyaWZ0IHN0cnVjdHVyZS4gQSBmaWVsZCBoYXMgYSBkYXRhIHR5cGUsCisgKiBhIHN5bWJvbGljIG5hbWUsIGFuZCBhIG51bWVyaWMgaWRlbnRpZmllci4KKyAqCisgKi8KK2NsYXNzIHRfZmllbGQgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSkKKyAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBrZXlfKDApLAorICAgICAgdmFsdWVfKE5VTEwpLAorICAgICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCisgICAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKKyAgICAgIHhzZF9hdHRyc18oTlVMTCksCisgICAgICByZWZlcmVuY2VfKGZhbHNlKSB7fQorCisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCBpbnQzMl90IGtleSkKKyAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBrZXlfKGtleSksCisgICAgICByZXFfKFRfT1BUX0lOX1JFUV9PVVQpLAorICAgICAgdmFsdWVfKE5VTEwpLAorICAgICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCisgICAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKKyAgICAgIHhzZF9hdHRyc18oTlVMTCksCisgICAgICByZWZlcmVuY2VfKGZhbHNlKSB7fQorCisgIH50X2ZpZWxkKCkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgeyByZXR1cm4gdHlwZV87IH0KKworICBjb25zdCB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludDMyX3QgZ2V0X2tleSgpIGNvbnN0IHsgcmV0dXJuIGtleV87IH0KKworICBlbnVtIGVfcmVxIHsgVF9SRVFVSVJFRCwgVF9PUFRJT05BTCwgVF9PUFRfSU5fUkVRX09VVCB9OworCisgIHZvaWQgc2V0X3JlcShlX3JlcSByZXEpIHsgcmVxXyA9IHJlcTsgfQorCisgIGVfcmVxIGdldF9yZXEoKSBjb25zdCB7IHJldHVybiByZXFfOyB9CisKKyAgdm9pZCBzZXRfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsgdmFsdWVfID0gdmFsdWU7IH0KKworICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSB7IHJldHVybiB2YWx1ZV87IH0KKworICBjb25zdCB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICB2b2lkIHNldF94c2Rfb3B0aW9uYWwoYm9vbCB4c2Rfb3B0aW9uYWwpIHsgeHNkX29wdGlvbmFsXyA9IHhzZF9vcHRpb25hbDsgfQorCisgIGJvb2wgZ2V0X3hzZF9vcHRpb25hbCgpIGNvbnN0IHsgcmV0dXJuIHhzZF9vcHRpb25hbF87IH0KKworICB2b2lkIHNldF94c2RfbmlsbGFibGUoYm9vbCB4c2RfbmlsbGFibGUpIHsgeHNkX25pbGxhYmxlXyA9IHhzZF9uaWxsYWJsZTsgfQorCisgIGJvb2wgZ2V0X3hzZF9uaWxsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIHhzZF9uaWxsYWJsZV87IH0KKworICB2b2lkIHNldF94c2RfYXR0cnModF9zdHJ1Y3QqIHhzZF9hdHRycykgeyB4c2RfYXR0cnNfID0geHNkX2F0dHJzOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF94c2RfYXR0cnMoKSB7IHJldHVybiB4c2RfYXR0cnNfOyB9CisKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleS4KKyAgICogTWFrZSB0aGlzIGEgZnVuY3RvciBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gaGVscCBHQ0MgaW5saW5lIGl0LgorICAgKiBUaGUgYXJndW1lbnRzIGFyZSAoY29uc3QpIHJlZmVyZW5jZXMgdG8gY29uc3QgcG9pbnRlcnMgdG8gY29uc3QgdF9maWVsZHMuCisgICAqLworICBzdHJ1Y3Qga2V5X2NvbXBhcmUgeworICAgIGJvb2wgb3BlcmF0b3IoKSh0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYSwgdF9maWVsZCBjb25zdCogY29uc3QmIGIpIHsKKyAgICAgIHJldHVybiBhLT5nZXRfa2V5KCkgPCBiLT5nZXRfa2V5KCk7CisgICAgfQorICB9OworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCisgIGJvb2wgZ2V0X3JlZmVyZW5jZSgpIHsgcmV0dXJuIHJlZmVyZW5jZV87IH0KKworICB2b2lkIHNldF9yZWZlcmVuY2UoYm9vbCByZWZlcmVuY2UpIHsgcmVmZXJlbmNlXyA9IHJlZmVyZW5jZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgaW50MzJfdCBrZXlfOworICBlX3JlcSByZXFfOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87CisKKyAgYm9vbCB4c2Rfb3B0aW9uYWxfOworICBib29sIHhzZF9uaWxsYWJsZV87CisgIHRfc3RydWN0KiB4c2RfYXR0cnNfOworICBib29sIHJlZmVyZW5jZV87Cit9OworCisvKioKKyAqIEEgc2ltcGxlIHN0cnVjdCBmb3IgdGhlIHBhcnNlciB0byB1c2UgdG8gc3RvcmUgYSBmaWVsZCBJRCwgYW5kIHdoZXRoZXIgb3IKKyAqIG5vdCBpdCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIG9yIGF1dG9tYXRpY2FsbHkgY2hvc2VuLgorICovCitzdHJ1Y3QgdF9maWVsZF9pZCB7CisgIGludDMyX3QgdmFsdWU7CisgIGJvb2wgYXV0b19hc3NpZ25lZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDI2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRlVOQ1RJT05fSAorI2RlZmluZSBUX0ZVTkNUSU9OX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbi4gS2V5IHBhcnRzIGFyZSByZXR1cm4gdHlwZSwgZnVuY3Rpb24gbmFtZSwKKyAqIG9wdGlvbmFsIG1vZGlmaWVycywgYW5kIGFuIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGEgdGhyaWZ0CisgKiBzdHJ1Y3QuCisgKgorICovCitjbGFzcyB0X2Z1bmN0aW9uIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfc3RydWN0KiBhcmdsaXN0LCBib29sIG9uZXdheSA9IGZhbHNlKQorICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAorICAgICAgeGNlcHRpb25zXyhuZXcgdF9zdHJ1Y3QoTlVMTCkpLAorICAgICAgb3duX3hjZXB0aW9uc18odHJ1ZSksCisgICAgICBvbmV3YXlfKG9uZXdheSkgeworICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKKyAgICB9CisgIH0KKworICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAorICAgICAgICAgICAgIHRfc3RydWN0KiB4Y2VwdGlvbnMsCisgICAgICAgICAgICAgYm9vbCBvbmV3YXkgPSBmYWxzZSkKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18oeGNlcHRpb25zKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKGZhbHNlKSwKKyAgICAgIG9uZXdheV8ob25ld2F5KSB7CisgICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7CisgICAgfQorICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKKyAgICB9CisgIH0KKworICB+dF9mdW5jdGlvbigpIHsKKyAgICBpZiAob3duX3hjZXB0aW9uc18pCisgICAgICBkZWxldGUgeGNlcHRpb25zXzsKKyAgfQorCisgIHRfdHlwZSogZ2V0X3JldHVybnR5cGUoKSBjb25zdCB7IHJldHVybiByZXR1cm50eXBlXzsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF9hcmdsaXN0KCkgY29uc3QgeyByZXR1cm4gYXJnbGlzdF87IH0KKworICB0X3N0cnVjdCogZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KKworICBib29sIGlzX29uZXdheSgpIGNvbnN0IHsgcmV0dXJuIG9uZXdheV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgdF90eXBlKiByZXR1cm50eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIHRfc3RydWN0KiBhcmdsaXN0XzsKKyAgdF9zdHJ1Y3QqIHhjZXB0aW9uc187CisgIGJvb2wgb3duX3hjZXB0aW9uc187CisgIGJvb2wgb25ld2F5XzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y2ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTElTVF9ICisjZGVmaW5lIFRfTElTVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIGxpc3QgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCisgKgorICovCitjbGFzcyB0X2xpc3QgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X2xpc3QodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQorCisgIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBlbGVtX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNmMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9NQVBfSAorI2RlZmluZSBUX01BUF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIG1hcCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIHR3byBkYXRhCisgKiB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfbWFwIDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9tYXAodF90eXBlKiBrZXlfdHlwZSwgdF90eXBlKiB2YWxfdHlwZSkgOiBrZXlfdHlwZV8oa2V5X3R5cGUpLCB2YWxfdHlwZV8odmFsX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfa2V5X3R5cGUoKSBjb25zdCB7IHJldHVybiBrZXlfdHlwZV87IH0KKworICB0X3R5cGUqIGdldF92YWxfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHZhbF90eXBlXzsgfQorCisgIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGtleV90eXBlXzsKKyAgdF90eXBlKiB2YWxfdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkZDQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QUk9HUkFNX0gKKyNkZWZpbmUgVF9QUk9HUkFNX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBGb3IgcHJvZ3JhbV9uYW1lKCkKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2xpc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKy8vI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKKyAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgIFR5cGVkZWZzCisgKiAgIEVudW1lcmF0aW9ucworICogICBDb25zdGFudHMKKyAqICAgU3RydWN0cworICogICBFeGNlcHRpb25zCisgKiAgIFNlcnZpY2VzCisgKgorICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIG5hbWUpCisgICAgOiBwYXRoXyhwYXRoKSwgbmFtZV8obmFtZSksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSwgc2NvcGVfKG5ldyB0X3Njb3BlKSB7fQorCisgIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoKSA6IHBhdGhfKHBhdGgpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSkgeworICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOworICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7CisgIH0KKworICB+dF9wcm9ncmFtKCkgeworICAgIGlmIChzY29wZV8pIHsKKyAgICAgIGRlbGV0ZSBzY29wZV87CisgICAgICBzY29wZV8gPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8vIFBhdGggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9wYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKworICAvLyBPdXRwdXQgcGF0aCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X291dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfOyB9CisKKyAgLy8gQ3JlYXRlIGdlbi0qIGRpciBhY2Nlc3NvcgorICBib29sIGlzX291dF9wYXRoX2Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfaXNfYWJzb2x1dGVfOyB9CisKKyAgLy8gTmFtZSBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIC8vIE5hbWVzcGFjZQorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZV87IH0KKworICAvLyBJbmNsdWRlIHByZWZpeCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2luY2x1ZGVfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZV9wcmVmaXhfOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBwcm9ncmFtIGVsZW1lbnRzCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+JiBnZXRfdHlwZWRlZnMoKSBjb25zdCB7IHJldHVybiB0eXBlZGVmc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIGdldF9lbnVtcygpIGNvbnN0IHsgcmV0dXJuIGVudW1zXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIGdldF9jb25zdHMoKSBjb25zdCB7IHJldHVybiBjb25zdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9zdHJ1Y3RzKCkgY29uc3QgeyByZXR1cm4gc3RydWN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X29iamVjdHMoKSBjb25zdCB7IHJldHVybiBvYmplY3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgY29uc3QgeyByZXR1cm4gc2VydmljZXNfOyB9CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VzKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlc187IH0KKworICAvLyBQcm9ncmFtIGVsZW1lbnRzCisgIHZvaWQgYWRkX3R5cGVkZWYodF90eXBlZGVmKiB0ZCkgeyB0eXBlZGVmc18ucHVzaF9iYWNrKHRkKTsgfQorICB2b2lkIGFkZF9lbnVtKHRfZW51bSogdGUpIHsgZW51bXNfLnB1c2hfYmFjayh0ZSk7IH0KKyAgdm9pZCBhZGRfY29uc3QodF9jb25zdCogdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyB9CisgIHZvaWQgYWRkX3N0cnVjdCh0X3N0cnVjdCogdHMpIHsKKyAgICBvYmplY3RzXy5wdXNoX2JhY2sodHMpOworICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7CisgIH0KKyAgdm9pZCBhZGRfeGNlcHRpb24odF9zdHJ1Y3QqIHR4KSB7CisgICAgb2JqZWN0c18ucHVzaF9iYWNrKHR4KTsKKyAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7CisgIH0KKyAgdm9pZCBhZGRfc2VydmljZSh0X3NlcnZpY2UqIHRzKSB7IHNlcnZpY2VzXy5wdXNoX2JhY2sodHMpOyB9CisKKyAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgsIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUpIHsKKyAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKKyAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8gPSBvdXRfcGF0aF9pc19hYnNvbHV0ZTsKKyAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKKyAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOworICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKKyAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKKyAgICB9CisgIH0KKworICAvLyBUeXBlbmFtZSBjb2xsaXNpb24gZGV0ZWN0aW9uCisgIC8qKgorICAgKiBTZWFyY2ggZm9yIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY2VydGFpbiBjb2xsaXNpb24gd2FzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIGJvb2wgaXNfdW5pcXVlX3R5cGVuYW1lKHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IHByb2dyYW1fdHlwZW5hbWVfY291bnQodGhpcywgdCk7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXQgPSBpbmNsdWRlc18uYmVnaW4oKTsgaXQgIT0gaW5jbHVkZXNfLmVuZCgpOyArK2l0KSB7CisgICAgICBvY2N1cnJlbmNlcyArPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KCppdCwgdCk7CisgICAgfQorICAgIHJldHVybiAwID09IG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhbGwgdHlwZSBjb2xsZWN0aW9ucyBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucworICAgKi8KKyAgaW50IHByb2dyYW1fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+dHlwZWRlZnNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPmVudW1zXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5vYmplY3RzXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5zZXJ2aWNlc18sIHQpOworICAgIHJldHVybiBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBTZWFyY2ggYSB0eXBlIGNvbGxlY3Rpb24gZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICogQHBhcmFtIHByb2cgICAgICAgICAgICB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKKyAgICogQHBhcmFtIHR5cGVfY29sbGVjdGlvbiB0aGUgdHlwZSBjb2xsZWN0aW9uIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICAgICAgICAgICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGludCBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgVCB0eXBlX2NvbGxlY3Rpb24sIHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpdCA9IHR5cGVfY29sbGVjdGlvbi5iZWdpbigpOyBpdCAhPSB0eXBlX2NvbGxlY3Rpb24uZW5kKCk7ICsraXQpCisgICAgICBpZiAodCAhPSAqaXQgJiYgMCA9PSB0LT5nZXRfbmFtZSgpLmNvbXBhcmUoKCppdCktPmdldF9uYW1lKCkpICYmIGlzX2NvbW1vbl9uYW1lc3BhY2UocHJvZywgdCkpCisgICAgICAgICsrb2NjdXJyZW5jZXM7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIGlkZW50aWNhbCB0eXBlbmFtZXMgd2lsbCBjb2xsaWRlIGJhc2VkIG9uIG5hbWVzcGFjZXMuCisgICAqCisgICAqIEJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hpY2ggbGFuZ3VhZ2VzIHRoZSB1c2VyIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IsCisgICAqIGNvbGxpc2lvbnMgd2l0aGluIHByb2dyYW1zIChJREwgZmlsZXMpIGhhdmluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGNhbiBiZQorICAgKiBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBPbmx5IGd1YXJhbnRlZWQgY29sbGlzaW9ucyByZXR1cm4gdHJ1ZSAoY2F1c2UgYW4gZXJyb3IpLgorICAgKiBQb3NzaWJsZSBjb2xsaXNpb25zIGludm9sdmluZyBleHBsaWNpdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHByb2R1Y2UgYSB3YXJuaW5nLgorICAgKiBPdGhlciBwb3NzaWJsZSBjb2xsaXNpb25zIGdvIHVucmVwb3J0ZWQuCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIGNvbnRhaW5pbmcgdGhlIHByZWV4aXN0aW5nIHR5cGVuYW1lCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIGNvbnRhaW5pbmcgdGhlIHR5cGVuYW1lIG1hdGNoCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjb2xsaXNpb24gd2l0aGluIG5hbWVzcGFjZXMgaXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc19jb21tb25fbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7CisgICAgLy8gQ2FzZSAxOiBUeXBlbmFtZXMgYXJlIGluIHRoZSBzYW1lIHByb2dyYW0gW2NvbGxpc2lvbl0KKyAgICBpZiAocHJvZyA9PSB0LT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyIsCisgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FzZSAyOiBCb3RoIHByb2dyYW1zIGhhdmUgaWRlbnRpY2FsIG5hbWVzcGFjZSBzY29wZS9uYW1lIGRlY2xhcmF0aW9ucyBbY29sbGlzaW9uXQorICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBwcm9nLT5uYW1lc3BhY2VzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gcHJvZy0+bmFtZXNwYWNlc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUodC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgeworICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAorICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUocHJvZy0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgeworICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAorICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGlmICgwID09IHByb2ctPm5hbWVzcGFjZXNfLnNpemUoKSAmJiAwID09IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLnNpemUoKSkgeworICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMgYW5kICVzIiwKKyAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtYXRjaDsKKyAgfQorCisgIC8vIFNjb3BpbmcgYW5kIG5hbWVzcGFjaW5nCisgIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBuYW1lKSB7IG5hbWVzcGFjZV8gPSBuYW1lOyB9CisKKyAgLy8gU2NvcGUgYWNjZXNzb3IKKyAgdF9zY29wZSogc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29wZV87IH0KKworICAvLyBJbmNsdWRlcworCisgIHZvaWQgYWRkX2luY2x1ZGUodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKKyAgfQorCisgIHZvaWQgYWRkX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgaW5jbHVkZV9zaXRlKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoKTsKKworICAgIC8vIGluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0gaXMgdGhlIHNpdGUgYXQgd2hpY2ggaXQgd2FzIGluY2x1ZGVkCisgICAgLy8gKG1pbnVzIHRoZSBmaWxlbmFtZSkKKyAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeDsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3NpdGUucmZpbmQoIi8iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5jbHVkZV9zaXRlLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKKyAgICB9CisKKyAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOworICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgeyByZXR1cm4gaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKKyAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKKworICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQorICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKKyAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOworICAgIH0KKyAgfQorCisgIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCisgIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgeworICAgIGlmIChsYW5ndWFnZSAhPSAiKiIpIHsKKyAgICAgIHNpemVfdCBzdWJfaW5kZXggPSBsYW5ndWFnZS5maW5kKCcuJyk7CisgICAgICBzdGQ6OnN0cmluZyBiYXNlX2xhbmd1YWdlID0gbGFuZ3VhZ2Uuc3Vic3RyKDAsIHN1Yl9pbmRleCk7CisgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlOworCisgICAgICBpZiAoYmFzZV9sYW5ndWFnZSA9PSAic21hbGx0YWxrIikgeworICAgICAgICBwd2FybmluZygxLCAiTmFtZXNwYWNlICdzbWFsbHRhbGsnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnc3QnIGluc3RlYWQiKTsKKyAgICAgICAgYmFzZV9sYW5ndWFnZSA9ICJzdCI7CisgICAgICB9CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgbXlfY29weSA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOworCisgICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdDsKKyAgICAgIGl0ID0gbXlfY29weS5maW5kKGJhc2VfbGFuZ3VhZ2UpOworCisgICAgICBpZiAoaXQgPT0gbXlfY29weS5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gIk5vIGdlbmVyYXRvciBuYW1lZCAnIiArIGJhc2VfbGFuZ3VhZ2UgKyAiJyBjb3VsZCBiZSBmb3VuZCEiOworICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN1Yl9pbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2UgPSBsYW5ndWFnZS5zdWJzdHIoc3ViX2luZGV4ICsgMSk7CisgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSBiYXNlX2xhbmd1YWdlICsgIiBnZW5lcmF0b3IgZG9lcyBub3QgYWNjZXB0ICciICsgc3ViX25hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYXMgc3ViLW5hbWVzcGFjZSEiOworICAgICAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBuYW1lc3BhY2VzX1tsYW5ndWFnZV0gPSBuYW1lX3NwYWNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSkgY29uc3QgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKChpdGVyID0gbmFtZXNwYWNlc18uZmluZChsYW5ndWFnZSkpICE9IG5hbWVzcGFjZXNfLmVuZCgpCisgICAgICAgIHx8IChpdGVyID0gbmFtZXNwYWNlc18uZmluZCgiKiIpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSkgeworICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfYWxsX25hbWVzcGFjZXMoKXsKKyAgICAgcmV0dXJuIG5hbWVzcGFjZXNfOworICB9CisKKyAgdm9pZCBzZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKSB7CisgICAgbmFtZXNwYWNlX2Fubm90YXRpb25zX1tsYW5ndWFnZV0gPSBhbm5vdGF0aW9uczsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICByZXR1cm4gbmFtZXNwYWNlX2Fubm90YXRpb25zX1tsYW5ndWFnZV07CisgIH0KKworICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKKworICB2b2lkIGFkZF9jcHBfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgeyByZXR1cm4gY3BwX2luY2x1ZGVzXzsgfQorCisgIHZvaWQgYWRkX2NfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NfaW5jbHVkZXMoKSB7IHJldHVybiBjX2luY2x1ZGVzXzsgfQorCitwcml2YXRlOgorICAvLyBGaWxlIHBhdGgKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgLy8gTmFtZQorICBzdGQ6OnN0cmluZyBuYW1lXzsKKworICAvLyBPdXRwdXQgZGlyZWN0b3J5CisgIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKKworICAvLyBPdXRwdXQgZGlyZWN0b3J5IGlzIGFic29sdXRlIGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgc291cmNlIChubyBnZW4tKikKKyAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZV87CisKKyAgLy8gTmFtZXNwYWNlCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV87CisKKyAgLy8gSW5jbHVkZWQgcHJvZ3JhbXMKKyAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXNfOworCisgIC8vIEluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0sIGlmIGFueQorICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeF87CisKKyAgLy8gSWRlbnRpZmllciBsb29rdXAgc2NvcGUKKyAgdF9zY29wZSogc2NvcGVfOworCisgIC8vIENvbXBvbmVudHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IKKyAgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnNfOworICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiBlbnVtc187CisgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9uc187CisgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzXzsKKworICAvLyBEeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VzXzsKKworICAvLyBBbm5vdGF0aW9ucyBmb3IgZHluYW1pYyBuYW1lc3BhY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gbmFtZXNwYWNlX2Fubm90YXRpb25zXzsKKworICAvLyBDKysgZXh0cmEgaW5jbHVkZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNwcF9pbmNsdWRlc187CisKKyAgLy8gQyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY19pbmNsdWRlc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE2MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TQ09QRV9ICisjZGVmaW5lIFRfU0NPUEVfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NldC5oIgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSosIFRvJik7Cit9CisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIGEgdmFyaWFibGUgc2NvcGUgdXNlZCBmb3IgbG9va2luZyB1cCBwcmVkZWZpbmVkIHR5cGVzIGFuZAorICogc2VydmljZXMuIFR5cGljYWxseSwgYSBzY29wZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB0X3Byb2dyYW0uIFNjb3BlcyBhcmUgbm90CisgKiB1c2VkIHRvIGRldGVybWluZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByYXRoZXIgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyBhdAorICogcGFyc2UgdGltZS4KKyAqCisgKi8KK2NsYXNzIHRfc2NvcGUgeworcHVibGljOgorICB0X3Njb3BlKCkge30KKworICB2b2lkIGFkZF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSkgeyB0eXBlc19bbmFtZV0gPSB0eXBlOyB9CisKKyAgdF90eXBlKiBnZXRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiB0eXBlc19bbmFtZV07IH0KKworICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgeyBzZXJ2aWNlc19bbmFtZV0gPSBzZXJ2aWNlOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBzZXJ2aWNlc19bbmFtZV07IH0KKworICB2b2lkIGFkZF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0KiBjb25zdGFudCkgeworICAgIGlmIChjb25zdGFudHNfLmZpbmQobmFtZSkgIT0gY29uc3RhbnRzXy5lbmQoKSkgeworICAgICAgdGhyb3cgIkVudW0gIiArIG5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCEiOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdGFudHNfW25hbWVdID0gY29uc3RhbnQ7CisgICAgfQorICB9CisKKyAgdF9jb25zdCogZ2V0X2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIGNvbnN0YW50c19bbmFtZV07IH0KKworICB2b2lkIHByaW50KCkgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPjo6aXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSB0eXBlc18uYmVnaW4oKTsgaXRlciAhPSB0eXBlc18uZW5kKCk7ICsraXRlcikgeworICAgICAgcHJpbnRmKCIlcyA9PiAlc1xuIiwgaXRlci0+Zmlyc3QuY19zdHIoKSwgaXRlci0+c2Vjb25kLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVzb2x2ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwsIHRfdHlwZSogdHR5cGUpIHsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5maXJzdCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QgPSAodF9zdHJ1Y3QqKXR0eXBlOworICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IHRzdHJ1Y3QtPmdldF9maWVsZF9ieV9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgICAgdGhyb3cgIk5vIGZpZWxkIG5hbWVkIFwiIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKQorICAgICAgICAgICAgICArICJcIiB3YXMgZm91bmQgaW4gc3RydWN0IG9mIHR5cGUgXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIiI7CisgICAgICAgIH0KKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uc3RfdmFsLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICAgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oKHRfZW51bSopdHR5cGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9jb25zdCogY29uc3RhbnQgPSBnZXRfY29uc3RhbnQoY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKKyAgICAgICAgICB0aHJvdyAiTm8gZW51bSB2YWx1ZSBvciBjb25zdGFudCBmb3VuZCBuYW1lZCBcIiIgKyBjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkgKyAiXCIhIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgdHlwZWRlZnMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZQorICAgICAgICB0X3R5cGUqIGNvbnN0X3R5cGUgPSBjb25zdGFudC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworCisgICAgICAgIGlmIChjb25zdF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopY29uc3RfdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2ludGVnZXIoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfc3RyaW5nKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfZG91YmxlKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJDb25zdGFudHMgY2Fubm90IGJlIG9mIHR5cGUgVk9JRCI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbWFwKCk7CisgICAgICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfbWFwKCk7CisgICAgICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX21hcCh2X2l0ZXItPmZpcnN0LCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbGlzdCgpOworICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfbGlzdCgpOworICAgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgICBjb25zdF92YWwtPmFkZF9saXN0KCp2X2l0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgLy8gZW51bSBjb25zdGFudCB3aXRoIG5vbi1pZGVudGlmaWVyIHZhbHVlLiBzZXQgdGhlIGVudW0gYW5kIGZpbmQgdGhlCisgICAgICAvLyB2YWx1ZSdzIG5hbWUuCisgICAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHR5cGU7CisgICAgICB0X2VudW1fdmFsdWUqIGVudW1fdmFsdWUgPSB0ZW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YWxzdG07CisgICAgICAgIHZhbHN0bSA8PCBjb25zdF92YWwtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIHRocm93ICJDb3VsZG4ndCBmaW5kIGEgbmFtZWQgdmFsdWUgaW4gZW51bSAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZvciB2YWx1ZSAiCisgICAgICAgICAgICArIHZhbHN0bS5zdHIoKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKKyAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKKworICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKKworICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKKworICAvLyB0byBsaXN0IG1hcCBlbnRyaWVzCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KKyAgICBmcmllbmQgdm9pZCBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KEZyb20qLCBUbyYpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjA0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVJWSUNFX0gKKyNkZWZpbmUgVF9TRVJWSUNFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KKyAqCisgKi8KK2NsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3NlcnZpY2UodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSwgZXh0ZW5kc18oTlVMTCkge30KKworICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBzZXRfZXh0ZW5kcyh0X3NlcnZpY2UqIGV4dGVuZHMpIHsgZXh0ZW5kc18gPSBleHRlbmRzOyB9CisKKyAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgeworICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7CisgICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKKyAgICAgIH0KKyAgICB9CisgICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbnNfOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKKyAgY29uc3QgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIGNvbnN0IHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnNfOworICB0X3NlcnZpY2UqIGV4dGVuZHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTEzYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVRfSAorI2RlZmluZSBUX1NFVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIHNldCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfc2V0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQorCisgIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGVsZW1fdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDJkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TVFJVQ1RfSAorI2RlZmluZSBUX1NUUlVDVF9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKy8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5CitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCisgKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCisgKgorICovCitjbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzX3R5cGU7CisKKyAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtKQorICAgIDogdF90eXBlKHByb2dyYW0pLAorICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKKyAgICAgIGlzX3VuaW9uXyhmYWxzZSksCisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCisgICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCisgICAgICB4c2RfYWxsXyhmYWxzZSkge30KKworICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgIDogdF90eXBlKHByb2dyYW0sIG5hbWUpLAorICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKKyAgICAgIGlzX3VuaW9uXyhmYWxzZSksCisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCisgICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCisgICAgICB4c2RfYWxsXyhmYWxzZSkge30KKworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgbmFtZV8gPSBuYW1lOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKKyAgfQorCisgIHZvaWQgc2V0X3hjZXB0aW9uKGJvb2wgaXNfeGNlcHRpb24pIHsgaXNfeGNlcHRpb25fID0gaXNfeGNlcHRpb247IH0KKworICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcih0X2ZpZWxkKiBmaWVsZCkgeworICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSkgeworCisgICAgICAvLyAxKSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIDIpIHVuaW9uIG1lbWJlcnMgYXJlIGltcGxpY2l0bHkgb3B0aW9uYWwsIG90aGVyd2lzZSBidWdzIGxpa2UgVEhSSUZULTM2NTAgd2FpdCB0byBoYXBwZW4KKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgLy8gbm8gd2FybmluZyBvbiBkZWZhdWx0IHJlcXVpcmVkbmVzcywgYnV0IGRvIHdhcm4gb24gYW55dGhpbmcgZWxzZSB0aGF0IGlzIGV4cGxpY2l0bHkgYXNrZWQgZm9yCisgICAgICAgIGlmKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICAgIlVuaW9uICVzIGZpZWxkICVzOiB1bmlvbiBtZW1iZXJzIG11c3QgYmUgb3B0aW9uYWwsIGlnbm9yaW5nIHNwZWNpZmllZCByZXF1aXJlZG5lc3MuXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmllbGQtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICB9CisKKyAgICAgIC8vIHVuaW9ucyBtYXkgaGF2ZSB1cCB0byBvbmUgbWVtYmVyIGRlZmF1bHRlZCwgYnV0IG5vdCBtb3JlCisgICAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKDEgPCArK21lbWJlcnNfd2l0aF92YWx1ZSkgeworICAgICAgICAgIHRocm93ICJFcnJvcjogRmllbGQgIiArIGZpZWxkLT5nZXRfbmFtZSgpICsgIiBwcm92aWRlcyBhbm90aGVyIGRlZmF1bHQgdmFsdWUgZm9yIHVuaW9uICIKKyAgICAgICAgICAgICAgKyBuYW1lXzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpIHsKKyAgICBpZiAoaXNfdW5pb25fICYmICghbmFtZV8uZW1wdHkoKSkgJiYgKCFtZW1iZXJzX3ZhbGlkYXRlZCkpIHsKKyAgICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcigqbV9pdGVyKTsKKyAgICAgIH0KKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldF91bmlvbihib29sIGlzX3VuaW9uKSB7CisgICAgaXNfdW5pb25fID0gaXNfdW5pb247CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOworICB9CisKKyAgdm9pZCBzZXRfeHNkX2FsbChib29sIHhzZF9hbGwpIHsgeHNkX2FsbF8gPSB4c2RfYWxsOyB9CisKKyAgYm9vbCBnZXRfeHNkX2FsbCgpIGNvbnN0IHsgcmV0dXJuIHhzZF9hbGxfOyB9CisKKyAgYm9vbCBhcHBlbmQodF9maWVsZCogZWxlbSkgeworICAgIHR5cGVkZWYgbWVtYmVyc190eXBlOjppdGVyYXRvciBpdGVyX3R5cGU7CisgICAgc3RkOjpwYWlyPGl0ZXJfdHlwZSwgaXRlcl90eXBlPiBib3VuZHMgPSBzdGQ6OmVxdWFsX3JhbmdlKG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkOjprZXlfY29tcGFyZSgpKTsKKyAgICBpZiAoYm91bmRzLmZpcnN0ICE9IGJvdW5kcy5zZWNvbmQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gcmV0dXJucyBmYWxzZSB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3Qgb2YgZmllbGQgbmFtZXMKKyAgICBpZiAoZ2V0X2ZpZWxkX2J5X25hbWUoZWxlbS0+Z2V0X25hbWUoKSkgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1iZXJzXy5wdXNoX2JhY2soZWxlbSk7CisgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uaW5zZXJ0KGJvdW5kcy5zZWNvbmQsIGVsZW0pOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcihlbGVtKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X21lbWJlcnMoKSBjb25zdCB7IHJldHVybiBtZW1iZXJzXzsgfQorCisgIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X3NvcnRlZF9tZW1iZXJzKCkgeyByZXR1cm4gbWVtYmVyc19pbl9pZF9vcmRlcl87IH0KKworICBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuICFpc194Y2VwdGlvbl87IH0KKworICBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgeyByZXR1cm4gaXNfeGNlcHRpb25fOyB9CisKKyAgYm9vbCBpc191bmlvbigpIGNvbnN0IHsgcmV0dXJuIGlzX3VuaW9uXzsgfQorCisgIHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgeworICAgICAgICByZXR1cm4gKm1faXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSBjb25zdCB7CisgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICptX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKK3ByaXZhdGU6CisgIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKKyAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOworICBib29sIGlzX3hjZXB0aW9uXzsKKyAgYm9vbCBpc191bmlvbl87CisgIGJvb2wgbWVtYmVyc192YWxpZGF0ZWQ7CisgIGludCBtZW1iZXJzX3dpdGhfdmFsdWU7CisKKyAgYm9vbCB4c2RfYWxsXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1RZUEVfSAorI2RlZmluZSBUX1RZUEVfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogR2VuZXJpYyByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCB0eXBlLiBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZQorICogcGFyc2VyIG1vZHVsZSB0byBidWlsZCB1cCBhIHRyZWUgb2Ygb2JqZWN0IHRoYXQgYXJlIGFsbCBleHBsaWNpdGx5IHR5cGVkLgorICogVGhlIGdlbmVyaWMgdF90eXBlIGNsYXNzIGV4cG9ydHMgYSB2YXJpZXR5IG9mIHVzZWZ1bCBtZXRob2RzIHRoYXQgYXJlCisgKiB1c2VkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciB0byBicmFuY2ggYmFzZWQgdXBvbiBkaWZmZXJlbnQgaGFuZGxpbmcgZm9yIHRoZQorICogdmFyaW91cyB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfdHlwZSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHZpcnR1YWwgfnRfdHlwZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICB0X3R5cGUqIGdldF90cnVlX3R5cGUoKTsKKyAgY29uc3QgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCkgY29uc3Q7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJyZWFrIChtYXliZSBiYWRseSkgdW5sZXNzIDAgPD0gbnVtIDw9IDE2LgorICBzdGF0aWMgY2hhciBueWJibGVfdG9feGRpZ2l0KGludCBudW0pIHsKKyAgICBpZiAobnVtIDwgMTApIHsKKyAgICAgIHJldHVybiAnMCcgKyBudW07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAnQScgKyBudW0gLSAxMDsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgYnl0ZV90b19oZXgodWludDhfdCBieXRlKSB7CisgICAgc3RkOjpzdHJpbmcgcnY7CisgICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlID4+IDQpOworICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSAmIDB4MGYpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcm90ZWN0ZWQ6CisgIHRfdHlwZSgpIDogcHJvZ3JhbV8oTlVMTCkgeyA7IH0KKworICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHByb2dyYW1fKHByb2dyYW0pIHsgOyB9CisKKyAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgc3RkOjpzdHJpbmcgbmFtZSkgOiBwcm9ncmFtXyhwcm9ncmFtKSwgbmFtZV8obmFtZSkgeyA7IH0KKworICB0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgOiBwcm9ncmFtXyhOVUxMKSwgbmFtZV8obmFtZSkgeyA7IH0KKworICB0X3Byb2dyYW0qIHByb2dyYW1fOworICBzdGQ6OnN0cmluZyBuYW1lXzsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgorICogZHVyaW5nIHBhcnNpbmcuCisgKi8KK3N0cnVjdCB0X2Fubm90YXRpb24geworICBzdGQ6OnN0cmluZyBrZXk7CisgIHN0ZDo6c3RyaW5nIHZhbDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmZkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKK3RfdHlwZSogdF90eXBlZGVmOjpnZXRfdHlwZSgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfID09IE5VTEwpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfcHJvZ3JhbSgpLT5zY29wZSgpLT5nZXRfdHlwZShzeW1ib2xpY18pOworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgIHByaW50ZigiVHlwZSBcIiVzXCIgbm90IGRlZmluZWRcbiIsIHN5bWJvbGljXy5jX3N0cigpKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHJldHVybiB0eXBlOworICB9CisgIHJldHVybiB0eXBlXzsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkM2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1RZUEVERUZfSAorI2RlZmluZSBUX1RZUEVERUZfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBIHR5cGVkZWYgaXMgYSBtYXBwaW5nIGZyb20gYSBzeW1ib2xpYyBuYW1lIHRvIGFub3RoZXIgdHlwZS4gSW4gZHltYW5pY2FsbHkKKyAqIHR5cGVkIGxhbmd1YWdlcyAoaS5lLiBwaHAvcHl0aG9uKSB0aGUgY29kZSBnZW5lcmF0b3IgY2FuIGFjdHVhbGx5IHVzdWFsbHkKKyAqIGlnbm9yZSB0eXBlZGVmcyBhbmQganVzdCB1c2UgdGhlIHVuZGVybHlpbmcgdHlwZSBkaXJlY3RseSwgdGhvdWdoIGluIEMrKworICogdGhlIHN5bWJvbGljIG5hbWluZyBjYW4gYmUgcXVpdGUgdXNlZnVsIGZvciBjb2RlIGNsYXJpdHkuCisgKgorICovCitjbGFzcyB0X3R5cGVkZWYgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLCB0eXBlXyh0eXBlKSwgc3ltYm9saWNfKHN5bWJvbGljKSwgZm9yd2FyZF8oZmFsc2UpIHt9CisKKyAgLyoqCisgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byByZWZlciB0byBhIHR5cGUgdGhhdCBpcyBsYXppbHkKKyAgICogcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLCBsaWtlIGZvciBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvcgorICAgKiByZWN1cnNpdmUgdHlwZXMuCisgICAqLworICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMsIGJvb2wgZm9yd2FyZCkKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCisgICAgICB0eXBlXyhOVUxMKSwKKyAgICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCisgICAgICBmb3J3YXJkXyhmb3J3YXJkKQorICB7fQorCisgIH50X3R5cGVkZWYoKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdDsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3N5bWJvbGljKCkgY29uc3QgeyByZXR1cm4gc3ltYm9saWNfOyB9CisKKyAgYm9vbCBpc19mb3J3YXJkX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkXzsgfQorCisgIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOworICBib29sIGZvcndhcmRfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogZGVmaW5lIGZvciBta2RpcixzaW5jZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogaXMgZGlmZmVyZW50IGZvciB0aGUgbm9uLVBPU0lYIE1pbkdXCisgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNlcnJubz4KKworLy8gaWdub3JlIEVFWElTVCwgdGhyb3cgb24gYW55IG90aGVyIGVycm9yCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIE1LRElSKHgpIHsgaW50IHIgPSBfbWtkaXIoeCk7IGlmIChyID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeyB0aHJvdyAoc3RkOjpzdHJpbmcoeCkgKyAiOiAiKSArIHN0cmVycm9yKGVycm5vKTsgfSB9CisjZWxzZQorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KKyNlbmRpZgorCisjaWZkZWYgUEFUSF9NQVgKKyNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIFBBVEhfTUFYCisjZWxzZQorI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggTUFYX1BBVEgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGNkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCitpZiBXSVRIX1BMVUdJTgorcGx1Z2luX2dlbiA9IHBsdWdpbl90eXBlcy5oIFwKKyAgICAgICAgICAgICBwbHVnaW5fdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICBwbHVnaW5fY29uc3RhbnRzLmggXAorICAgICAgICAgICAgIHBsdWdpbl9jb25zdGFudHMuY3BwCisKK0JVSUxUX1NPVVJDRVMgPSAkKHBsdWdpbl9nZW4pCitnZW4uc3RhbXA6IHBsdWdpbi50aHJpZnQgJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKwlAJChSTSkgLWYgZ2VuLnRtcAorCUB0b3VjaCBnZW4udG1wCisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAgLWdlbiBjcHAgLW91dCAuICQ8CisJQG12IC1mIGdlbi50bXAgJEAKKworJChwbHVnaW5fZ2VuKTogZ2VuLnN0YW1wCisJQGlmIHRlc3QgLWYgJEA7IHRoZW4gOjsgZWxzZSBcCisJJChSTSkgLWYgZ2VuLnN0YW1wOyBcCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZ2VuLnN0YW1wOyBcCisJZmkKKworY2xlYW4tbG9jYWw6CisJJChSTSkgdmVyc2lvbi5oIHdpbmRvd3MvdmVyc2lvbi5oICQocGx1Z2luX2dlbikKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRjNDMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FkYXB0b3IvbWFwLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vZm9yX2VhY2guaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIGNvbnZlcnRfZm9yd2FyZDxmcm9tX3R5cGU+KGNvbnN0IGZyb21fdHlwZSYgZnJvbSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGNvbnZlcnQoY29uc3QgZnJvbV90eXBlJiBmcm9tLCBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogdG8pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfVU5BUllfREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIGNvbnZlcnQ8ZnJvbV90eXBlPihjb25zdCBmcm9tX3R5cGUmIGZyb20pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT05fREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfVU5BUllfREVDTChmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUoZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlNJT05fREVDTChmcm9tX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogdG8gPSBjb252ZXJ0X2ZvcndhcmQoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb252ZXJ0KGZyb20sIHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT04oZnJvbV90eXBlLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodm9pZClmcm9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3IFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUoZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fRE9DKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20uX19pc3NldC5kb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+c2V0X2RvYyhmcm9tLmRvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5fX2lzc2V0LmFubm90YXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5hbm5vdGF0aW9uc18gPSBmcm9tLmFubm90YXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLT5zZXRfbmFtZShmcm9tLm1ldGFkYXRhLm5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLm1ldGFkYXRhLl9faXNzZXQuZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPnNldF9kb2MoZnJvbS5tZXRhZGF0YS5kb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLm1ldGFkYXRhLl9faXNzZXQuYW5ub3RhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPmFubm90YXRpb25zXyA9IGZyb20ubWV0YWRhdGEuYW5ub3RhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCis6OnRfcHJvZ3JhbSogZ19wcm9ncmFtID0gMDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFM+CitzdHJ1Y3QgVHlwZUNhY2hlIHsKKyAgQyogb3BlcmF0b3JbXShjb25zdCBpbnQ2NF90JiBrKSB7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgQyo+OjppdGVyYXRvciBpdCA9IGNhY2hlLmZpbmQoayk7CisgICAgaWYgKGl0ICE9IGNhY2hlLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgUz46OmNvbnN0X2l0ZXJhdG9yIGNpdCA9IHNvdXJjZS0+ZmluZChrKTsKKyAgICAgIGlmIChjaXQgPT0gc291cmNlLT5lbmQoKSkgeworICAgICAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSBub3QgZm91bmQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoY2FjaGUpW2tdID0gY29udmVydF9mb3J3YXJkKGNpdC0+c2Vjb25kKTsKKyAgICB9CisgIH0KKworICB2b2lkIGNvbXBpbGVBbGwoKSB7CisgICAgYm9vc3Q6OmZvcl9lYWNoKCpzb3VyY2UgfCBib29zdDo6YWRhcHRvcnM6Om1hcF9rZXlzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlR5cGVDYWNoZTo6Y29tcGlsZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIH0KKworICBzdGQ6Om1hcDxpbnQ2NF90LCBTPiBjb25zdCogc291cmNlOworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgc291cmNlID0gbnVsbHB0ciA7CisgICAgY2FjaGUuY2xlYXIoKSA7CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6Om1hcDxpbnQ2NF90LCBDKj4gY2FjaGU7CisKK3ByaXZhdGU6CisgIHZvaWQgY29tcGlsZShjb25zdCBpbnQ2NF90JiBrKSB7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgUz46OmNvbnN0X2l0ZXJhdG9yIGNpdCA9IHNvdXJjZS0+ZmluZChrKTsKKyAgICBpZiAoY2l0ID09IHNvdXJjZS0+ZW5kKCkpIHsKKyAgICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJUeXBlIG5vdCBmb3VuZCAiKTsKKyAgICB9CisgICAgY29udmVydChjaXQtPnNlY29uZCwgKCp0aGlzKVtrXSk7CisgIH0KK307CitzdGQ6Om1hcDxpbnQ2NF90LCA6OnRfcHJvZ3JhbSo+IGdfcHJvZ3JhbV9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X3R5cGUsIHRfdHlwZT4gZ190eXBlX2NhY2hlOworVHlwZUNhY2hlPCA6OnRfY29uc3QsIHRfY29uc3Q+IGdfY29uc3RfY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF9zZXJ2aWNlLCB0X3NlcnZpY2U+IGdfc2VydmljZV9jYWNoZTsKKwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKSB7CisgIGdfdHlwZV9jYWNoZS5jbGVhcigpOworICBnX2NvbnN0X2NhY2hlLmNsZWFyKCk7CisgIGdfc2VydmljZV9jYWNoZS5jbGVhcigpOworfQorCit2b2lkIHNldF9nbG9iYWxfY2FjaGUoY29uc3QgVHlwZVJlZ2lzdHJ5JiBmcm9tKSB7CisgIGdfdHlwZV9jYWNoZS5zb3VyY2UgPSAmZnJvbS50eXBlczsKKyAgZ19jb25zdF9jYWNoZS5zb3VyY2UgPSAmZnJvbS5jb25zdGFudHM7CisgIGdfc2VydmljZV9jYWNoZS5zb3VyY2UgPSAmZnJvbS5zZXJ2aWNlczsKKworICBnX3R5cGVfY2FjaGUuY29tcGlsZUFsbCgpOworICBnX2NvbnN0X2NhY2hlLmNvbXBpbGVBbGwoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNvbXBpbGVBbGwoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiByZXNvbHZlX3R5cGUoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnX3R5cGVfY2FjaGVbbmFtZV0pOworfQorCis6OnRfY29uc3QqIHJlc29sdmVfY29uc3QoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiBnX2NvbnN0X2NhY2hlW25hbWVdOworfQorCis6OnRfc2VydmljZSogcmVzb2x2ZV9zZXJ2aWNlKGludDY0X3QgbmFtZSkgeworICByZXR1cm4gZ19zZXJ2aWNlX2NhY2hlW25hbWVdOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfYmFzZV90eXBlKSB7CisjZGVmaW5lIFRfQkFTRVRZUEVfQ0FTRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9iYXNlOjpUWVBFXyMjdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfIyN0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKworICA6OnRfYmFzZV90eXBlOjp0X2Jhc2UgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfVk9JRDsKKyAgYm9vbCBpc19iaW5hcnkgPSBmYWxzZTsKKyAgc3dpdGNoIChmcm9tLnZhbHVlKSB7CisgICAgVF9CQVNFVFlQRV9DQVNFKFZPSUQpOworICAgIFRfQkFTRVRZUEVfQ0FTRShTVFJJTkcpOworICAgIFRfQkFTRVRZUEVfQ0FTRShCT09MKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTgpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJMTYpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJMzIpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJNjQpOworICAgIFRfQkFTRVRZUEVfQ0FTRShET1VCTEUpOworICBjYXNlIHRfYmFzZTo6VFlQRV9CSU5BUlk6CisgICAgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgIGlzX2JpbmFyeSA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgOjp0X2Jhc2VfdHlwZSogdG8gPSBuZXcgOjp0X2Jhc2VfdHlwZShmcm9tLm1ldGFkYXRhLm5hbWUsIHQpOworICB0by0+c2V0X2JpbmFyeShpc19iaW5hcnkpOworICByZXR1cm4gdG87CisjdW5kZWYgVF9CQVNFVFlQRV9DQVNFCit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X2Jhc2VfdHlwZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF90eXBlZGVmKSB7CisgIDo6dF90eXBlZGVmKiB0bzsKKyAgaWYgKGZyb20uZm9yd2FyZCkgeworICAgIHRvID0gbmV3IDo6dF90eXBlZGVmKGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdLCBmcm9tLnN5bWJvbGljLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICB0byA9IG5ldyA6OnRfdHlwZWRlZihnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLCBmcm9tLnN5bWJvbGljKTsKKyAgfQorICByZXR1cm4gdG87Cit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3R5cGVkZWYpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtX3ZhbHVlLCBmcm9tLm5hbWUsIGZyb20udmFsdWUpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtLCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmNvbnN0YW50cyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2VudW1fdmFsdWU+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X2VudW06OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9saXN0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3NldCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5lbGVtX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9tYXAsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmtleV90eXBlKSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udmFsX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdF92YWx1ZSwgKSB7CisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfQ0FTRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmcm9tLl9faXNzZXQudHlwZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRvLT5zZXRfIyN0eXBlKGZyb20udHlwZSMjX3ZhbCkKKworICBhc3NlcnQodG8pOworICBpZiAoZnJvbS5fX2lzc2V0Lm1hcF92YWwpIHsKKyAgICB0by0+c2V0X21hcCgpOworICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSwgdF9jb25zdF92YWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5tYXBfdmFsLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBmcm9tLm1hcF92YWwuZW5kKCk7IGl0KyspIHsKKyAgICAgIHRvLT5hZGRfbWFwKGNvbnZlcnQoaXQtPmZpcnN0KSwgY29udmVydChpdC0+c2Vjb25kKSk7CisgICAgfQorICB9IGVsc2UgaWYgKGZyb20uX19pc3NldC5saXN0X3ZhbCkgeworICAgIHRvLT5zZXRfbGlzdCgpOworICAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmxpc3RfdmFsIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmY29udmVydDx0X2NvbnN0X3ZhbHVlPiksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X2NvbnN0X3ZhbHVlOjphZGRfbGlzdCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICB9IGVsc2UKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0Uoc3RyaW5nKTsKKyAgZWxzZSBUX0NPTlNUX1ZBTFVFX0NBU0UoaW50ZWdlcik7CisgIGVsc2UgVF9DT05TVF9WQUxVRV9DQVNFKGRvdWJsZSk7CisgIGVsc2UgaWYgKGZyb20uX19pc3NldC5jb25zdF9pZGVudGlmaWVyX3ZhbCkgeworICAgIHRvLT5zZXRfaWRlbnRpZmllcihmcm9tLmNvbnN0X2lkZW50aWZpZXJfdmFsLmlkZW50aWZpZXJfdmFsKSA7CisgICAgdG8tPnNldF9lbnVtKHJlc29sdmVfdHlwZTwgOjp0X2VudW0+KGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuZW51bV92YWwpKSA7CisgIH0KKworI3VuZGVmIFRfQ09OU1RfVkFMVUVfQ0FTRQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9maWVsZCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwgZnJvbS5uYW1lLCBmcm9tLmtleSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCk7CisgIHRvLT5zZXRfcmVmZXJlbmNlKGZyb20ucmVmZXJlbmNlKTsKKyAgdG8tPnNldF9yZXEoc3RhdGljX2Nhc3Q8IDo6dF9maWVsZDo6ZV9yZXE+KGZyb20ucmVxKSk7CisgIGlmIChmcm9tLl9faXNzZXQudmFsdWUpIHsKKyAgICB0by0+c2V0X3ZhbHVlKGNvbnZlcnQoZnJvbS52YWx1ZSkpOworICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3N0cnVjdCwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICB0by0+c2V0X3VuaW9uKGZyb20uaXNfdW5pb24pOworICB0by0+c2V0X3hjZXB0aW9uKGZyb20uaXNfeGNlcHRpb24pOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5tZW1iZXJzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZmllbGQ+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3N0cnVjdDo6YXBwZW5kLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0LAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwKKyAgICAgICAgICAgICAgICAgIGZyb20ubmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnQ8dF9jb25zdF92YWx1ZT4oZnJvbS52YWx1ZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20ucmV0dXJudHlwZSksCisgICAgICAgICAgICAgICAgICBmcm9tLm5hbWUsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KGZyb20uYXJnbGlzdCksCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KGZyb20ueGNlcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgIGZyb20uaXNfb25ld2F5KSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2VydmljZSwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgYXNzZXJ0KGZyb20ubWV0YWRhdGEucHJvZ3JhbV9pZCk7CisgIGFzc2VydChnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKworICBib29zdDo6Zm9yX2VhY2goZnJvbS5mdW5jdGlvbnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9mdW5jdGlvbj4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfc2VydmljZTo6YWRkX2Z1bmN0aW9uLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgaWYgKGZyb20uX19pc3NldC5leHRlbmRzXykKKyAgICB0by0+c2V0X2V4dGVuZHMocmVzb2x2ZV9zZXJ2aWNlKGZyb20uZXh0ZW5kc18pKTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3R5cGUpIHsKKyNkZWZpbmUgVF9UWVBFX0NBU0VfRldfVChjYXNlLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZyb20uX19pc3NldC5jYXNlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGNvbnZlcnRfZm9yd2FyZDx0eXBlPihmcm9tLmNhc2UjI192YWwpCisjZGVmaW5lIFRfVFlQRV9DQVNFX0ZXKGNhc2UpIFRfVFlQRV9DQVNFX0ZXX1QoY2FzZSwgdF8jI2Nhc2UpCisKKyAgVF9UWVBFX0NBU0VfRlcoYmFzZV90eXBlKTsKKyAgVF9UWVBFX0NBU0VfRlcodHlwZWRlZik7CisgIFRfVFlQRV9DQVNFX0ZXKGVudW0pOworICBUX1RZUEVfQ0FTRV9GVyhzdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9GV19UKHhjZXB0aW9uLCB0X3N0cnVjdCk7CisgIFRfVFlQRV9DQVNFX0ZXKGxpc3QpOworICBUX1RZUEVfQ0FTRV9GVyhzZXQpOworICBUX1RZUEVfQ0FTRV9GVyhtYXApOworICBUX1RZUEVfQ0FTRV9GVyhzZXJ2aWNlKTsKKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIkludmFsaWQgZGF0YTogVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUuIik7CisjdW5kZWYgVF9UWVBFX0NBU0VfRldfVAorI3VuZGVmIFRfVFlQRV9DQVNFX0ZXCit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3R5cGUpIHsKKyNkZWZpbmUgVF9UWVBFX0NBU0VfVChjYXNlLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoZnJvbS5fX2lzc2V0LmNhc2UjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnZlcnQ8dHlwZSwgOjp0eXBlPihmcm9tLmNhc2UjI192YWwsIHJlaW50ZXJwcmV0X2Nhc3Q8IDo6dHlwZSo+KHRvKSkKKyNkZWZpbmUgVF9UWVBFX0NBU0UoY2FzZSkgVF9UWVBFX0NBU0VfVChjYXNlLCB0XyMjY2FzZSkKKworICBpZiAoZmFsc2UpIHsKKyAgfQorICBUX1RZUEVfQ0FTRShiYXNlX3R5cGUpOworICBUX1RZUEVfQ0FTRSh0eXBlZGVmKTsKKyAgVF9UWVBFX0NBU0UoZW51bSk7CisgIFRfVFlQRV9DQVNFKHN0cnVjdCk7CisgIFRfVFlQRV9DQVNFX1QoeGNlcHRpb24sIHRfc3RydWN0KTsKKyAgVF9UWVBFX0NBU0UobGlzdCk7CisgIFRfVFlQRV9DQVNFKHNldCk7CisgIFRfVFlQRV9DQVNFKG1hcCk7CisgIFRfVFlQRV9DQVNFKHNlcnZpY2UpOworICBlbHNlIHsKKyAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiSW52YWxpZCBkYXRhOiBUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZS4iKTsKKyAgfQorI3VuZGVmIFRfVFlQRV9DQVNFX1QKKyN1bmRlZiBUX1RZUEVfQ0FTRQorfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Njb3BlLCApIHsKKyAgYXNzZXJ0KHRvKTsKKyNkZWZpbmUgVF9TQ09QRV9SRVNPTFZFKHR5cGUsIG5hbWUsIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm5hbWUjI3MuYmVnaW4oKTsgaXQgIT0gZnJvbS5uYW1lIyNzLmVuZCgpOyAgIFwKKyAgICAgICBpdCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnRfIyN0eXBlKiB0ID0gcmVzb2x2ZV8jI3R5cGUgYSgqaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by0+YWRkXyMjbmFtZSh0LT5nZXRfbmFtZSgpLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorICBUX1NDT1BFX1JFU09MVkUodHlwZSwgdHlwZSwgPCA6OnRfdHlwZT4pOworICBUX1NDT1BFX1JFU09MVkUoY29uc3QsIGNvbnN0YW50LCApOworICBUX1NDT1BFX1JFU09MVkUoc2VydmljZSwgc2VydmljZSwgKTsKKyN1bmRlZiBUX1NDT1BFX1JFU09MVkUKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3Byb2dyYW0pIHsKKyAgOjp0X3Byb2dyYW0qIHRvID0gbmV3IDo6dF9wcm9ncmFtKGZyb20ucGF0aCwgZnJvbS5uYW1lKTsKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20uaW5jbHVkZXMuYmVnaW4oKTsgaXQgIT0gZnJvbS5pbmNsdWRlcy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgdG8tPmFkZF9pbmNsdWRlKGNvbnZlcnRfZm9yd2FyZCgqaXQpKTsKKyAgfQorICBnX3Byb2dyYW1fY2FjaGVbZnJvbS5wcm9ncmFtX2lkXSA9IHRvOworICByZXR1cm4gdG87Cit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3Byb2dyYW0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgZ19wcm9ncmFtID0gdG87CisgIGNvbnZlcnQ8dF9zY29wZSwgOjp0X3Njb3BlPihmcm9tLnNjb3BlLCB0by0+c2NvcGUoKSk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7CisKKyAgdG8tPnNldF9vdXRfcGF0aChmcm9tLm91dF9wYXRoLCBmcm9tLm91dF9wYXRoX2lzX2Fic29sdXRlKTsKKworICBib29zdDo6Zm9yX2VhY2goZnJvbS50eXBlZGVmcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfdHlwZTwgOjp0X3R5cGVkZWY+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF90eXBlZGVmLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmVudW1zIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfZW51bT4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2VudW0sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm9iamVjdHMuYmVnaW4oKTsgaXQgIT0gZnJvbS5vYmplY3RzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICA6OnRfc3RydWN0KiB0MiA9IHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oKml0KTsKKyAgICBpZiAodDItPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHRvLT5hZGRfeGNlcHRpb24odDIpOworICAgIH0gZWxzZSB7CisgICAgICB0by0+YWRkX3N0cnVjdCh0Mik7CisgICAgfQorICB9CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmNvbnN0cyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfY29uc3QpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NvbnN0LCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLnNlcnZpY2VzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9zZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9zZXJ2aWNlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20uaW5jbHVkZXMuYmVnaW4oKTsgaXQgIT0gZnJvbS5pbmNsdWRlcy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgY29udmVydCgqaXQsIGdfcHJvZ3JhbV9jYWNoZVtpdC0+cHJvZ3JhbV9pZF0pOworICB9CisgIHN0ZDo6Zm9yX2VhY2goZnJvbS5jX2luY2x1ZGVzLmJlZ2luKCksIGZyb20uY19pbmNsdWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY19pbmNsdWRlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIHN0ZDo6Zm9yX2VhY2goZnJvbS5jcHBfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jcHBfaW5jbHVkZXMuZW5kKCksCisgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NwcF9pbmNsdWRlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm5hbWVzcGFjZXMuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBmcm9tLm5hbWVzcGFjZXMuZW5kKCk7IGl0KyspIHsKKyAgICB0by0+c2V0X25hbWVzcGFjZShpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICB9CisKKyAgdG8tPnNldF9pbmNsdWRlX3ByZWZpeChmcm9tLmluY2x1ZGVfcHJlZml4KTsKKyAgdG8tPnNldF9uYW1lc3BhY2UoZnJvbS5uYW1lc3BhY2VfKTsKK30KKworaW50IEdlbmVyYXRvclBsdWdpbjo6ZXhlYyhpbnQsIGNoYXIqIFtdKSB7CisjaWZkZWYgX1dJTjMyCisgIF9zZXRtb2RlKGZpbGVubyhzdGRpbiksIF9PX0JJTkFSWSk7CisjZW5kaWYKKyAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydCgKKyAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6bWFrZV9zaGFyZWQ8VEZEVHJhbnNwb3J0PihmaWxlbm8oc3RkaW4pKSkpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG8odHJhbnNwb3J0KTsKKyAgR2VuZXJhdG9ySW5wdXQgaW5wdXQ7CisgIHRyeSB7CisgICAgaW5wdXQucmVhZCgmcHJvdG8pOworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXJyKSB7CisgICAgc3RkOjpjZXJyIDw8ICJFcnJvciB3aGlsZSByZWNlaXZpbmcgcGx1Z2luIGRhdGE6ICIgPDwgZXJyLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIC0xOworICB9CisgIGluaXRHbG9iYWxzKCk7CisgIDo6dF9wcm9ncmFtKiBwID0gZ19wcm9ncmFtID0gY29udmVydF9mb3J3YXJkKGlucHV0LnByb2dyYW0pOworICBzZXRfZ2xvYmFsX2NhY2hlKGlucHV0LnR5cGVfcmVnaXN0cnkpOworICBjb252ZXJ0KGlucHV0LnByb2dyYW0sIHApOworCisgIGludCByZXQgPSBnZW5lcmF0ZShwLCBpbnB1dC5wYXJzZWRfb3B0aW9ucyk7CisgIGNsZWFyR2xvYmFscygpOworCisgIHJldHVybiByZXQ7Cit9CisKKzo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIGNvbnN0X3ZhbHVlX2Nhc2UoY29uc3QgdF9jb25zdF92YWx1ZSYgdikgeworICBpZiAodi5fX2lzc2V0Lm1hcF92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOworICBpZiAodi5fX2lzc2V0Lmxpc3RfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q7CisgIGlmICh2Ll9faXNzZXQuc3RyaW5nX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc7CisgIGlmICh2Ll9faXNzZXQuaW50ZWdlcl92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjsKKyAgaWYgKHYuX19pc3NldC5kb3VibGVfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRTsKKyAgaWYgKHYuX19pc3NldC5jb25zdF9pZGVudGlmaWVyX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOworICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVW5rbm93biBjb25zdCB2YWx1ZSB0eXBlIik7Cit9CisKK2Jvb2wgdF9jb25zdF92YWx1ZTo6b3BlcmF0b3I8KGNvbnN0IHRfY29uc3RfdmFsdWUmIHRoYXQpIGNvbnN0IHsKKyAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBjb25zdF92YWx1ZV9jYXNlKCp0aGlzKTsKKyAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDIgPSBjb25zdF92YWx1ZV9jYXNlKHRoYXQpOworICBpZiAodDEgIT0gdDIpCisgICAgcmV0dXJuIHQxIDwgdDI7CisgIHN3aXRjaCAodDEpIHsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgcmV0dXJuIGludGVnZXJfdmFsIDwgdGhhdC5pbnRlZ2VyX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICByZXR1cm4gZG91YmxlX3ZhbCA8IHRoYXQuZG91YmxlX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICByZXR1cm4gc3RyaW5nX3ZhbCA8IHRoYXQuc3RyaW5nX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBpZiAodGhhdC5tYXBfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAobWFwX3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG1hcF92YWwuYmVnaW4oKS0+Zmlyc3QgPCB0aGF0Lm1hcF92YWwuYmVnaW4oKS0+Zmlyc3Q7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIGlmICh0aGF0Lmxpc3RfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAobGlzdF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsaXN0X3ZhbC5mcm9udCgpIDwgdGhhdC5saXN0X3ZhbC5mcm9udCgpOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICByZXR1cm4gaW50ZWdlcl92YWwgPCB0aGF0LmludGVnZXJfdmFsOworICB9CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9QTFVHSU5fSAorI2RlZmluZSBUX1BMVUdJTl9QTFVHSU5fSAorCisjaW5jbHVkZSAidGhyaWZ0L1RocmlmdC5oIgorCitjbGFzcyB0X3Byb2dyYW07CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKworc3RydWN0IFRocmlmdFBsdWdpbkVycm9yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKKyAgVGhyaWZ0UGx1Z2luRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtc2cpIHt9Cit9OworCitjbGFzcyBHZW5lcmF0b3JQbHVnaW4geworcHVibGljOgorICBpbnQgZXhlYyhpbnQgYXJnYywgY2hhciogYXJndltdKTsKKyAgdmlydHVhbCBpbnQgZ2VuZXJhdGUoOjp0X3Byb2dyYW0qLCBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JikgPSAwOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOThmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgYXMzIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGNwcCBhcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGNzaGFycCBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgZCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgZGVscGhpIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBlcmwgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGdvIHRocmlmdAorbmFtZXNwYWNlIGhheGUgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgaHMgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGphdmEgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2Ugb2NhbWwgVGhyaWZ0CituYW1lc3BhY2UgcGVybCBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgcGhwIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBweSB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgcmIgVGhyaWZ0CisKK3R5cGVkZWYgaTY0IHRfcHJvZ3JhbV9pZAordHlwZWRlZiBpNjQgdF90eXBlX2lkCit0eXBlZGVmIGk2NCB0X2NvbnN0X2lkCit0eXBlZGVmIGk2NCB0X3NlcnZpY2VfaWQKKworZW51bSB0X2Jhc2UgeworICAgIFRZUEVfVk9JRAorICAgIFRZUEVfU1RSSU5HCisgICAgVFlQRV9CT09MCisgICAgVFlQRV9JOAorICAgIFRZUEVfSTE2CisgICAgVFlQRV9JMzIKKyAgICBUWVBFX0k2NAorICAgIFRZUEVfRE9VQkxFCisgICAgVFlQRV9CSU5BUlkKK30KKworc3RydWN0IFR5cGVNZXRhZGF0YSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfcHJvZ3JhbV9pZCBwcm9ncmFtX2lkCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorCitzdHJ1Y3QgdF9iYXNlX3R5cGUgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgdF9iYXNlIHZhbHVlCit9CisKK3N0cnVjdCB0X2xpc3QgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbGVtX3R5cGUKK30KKworc3RydWN0IHRfc2V0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgZWxlbV90eXBlCit9CisKK3N0cnVjdCB0X21hcCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGtleV90eXBlCisgIDQ6IHJlcXVpcmVkIHRfdHlwZV9pZCB2YWxfdHlwZQorfQorCitzdHJ1Y3QgdF90eXBlZGVmIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIHN0cmluZyBzeW1ib2xpYworICA0OiByZXF1aXJlZCBib29sIGZvcndhcmQKK30KKworc3RydWN0IHRfZW51bV92YWx1ZSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIGkzMiB2YWx1ZQorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X2VudW0geworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2VudW1fdmFsdWU+IGNvbnN0YW50cworfQorCitlbnVtIFJlcXVpcmVkbmVzcyB7CisgIFRfUkVRVUlSRUQgPSAwCisgIFRfT1BUSU9OQUwgPSAxCisgIFRfT1BUX0lOX1JFUV9PVVQgPSAyCit9CisKK3N0cnVjdCB0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWRlbnRpZmllcl92YWwKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIGVudW1fdmFsCit9CisKK3VuaW9uIHRfY29uc3RfdmFsdWUgeworICAxOiBvcHRpb25hbCBtYXA8dF9jb25zdF92YWx1ZSwgdF9jb25zdF92YWx1ZT4gbWFwX3ZhbAorICAyOiBvcHRpb25hbCBsaXN0PHRfY29uc3RfdmFsdWU+IGxpc3RfdmFsCisgIDM6IG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfdmFsCisgIDQ6IG9wdGlvbmFsIGk2NCBpbnRlZ2VyX3ZhbAorICA1OiBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbAorICA4OiBvcHRpb25hbCB0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgY29uc3RfaWRlbnRpZmllcl92YWwKK30KKworc3RydWN0IHRfY29uc3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCB0X2NvbnN0X3ZhbHVlIHZhbHVlCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfZmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCBpMzIga2V5CisgIDQ6IHJlcXVpcmVkIFJlcXVpcmVkbmVzcyByZXEKKyAgNTogb3B0aW9uYWwgdF9jb25zdF92YWx1ZSB2YWx1ZQorICAxMDogcmVxdWlyZWQgYm9vbCByZWZlcmVuY2UKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9zdHJ1Y3QgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2ZpZWxkPiBtZW1iZXJzCisgIDM6IHJlcXVpcmVkIGJvb2wgaXNfdW5pb24KKyAgNDogcmVxdWlyZWQgYm9vbCBpc194Y2VwdGlvbgorfQorc3RydWN0IHRfZnVuY3Rpb24geworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgcmV0dXJudHlwZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgYXJnbGlzdAorICA0OiByZXF1aXJlZCB0X3R5cGVfaWQgeGNlcHRpb25zCisgIDU6IHJlcXVpcmVkIGJvb2wgaXNfb25ld2F5CisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfc2VydmljZSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZnVuY3Rpb24+IGZ1bmN0aW9ucworICAzOiBvcHRpb25hbCB0X3NlcnZpY2VfaWQgZXh0ZW5kc18KK30KK3VuaW9uIHRfdHlwZSB7CisgIDE6IG9wdGlvbmFsIHRfYmFzZV90eXBlIGJhc2VfdHlwZV92YWwKKyAgMjogb3B0aW9uYWwgdF90eXBlZGVmIHR5cGVkZWZfdmFsCisgIDM6IG9wdGlvbmFsIHRfZW51bSBlbnVtX3ZhbAorICA0OiBvcHRpb25hbCB0X3N0cnVjdCBzdHJ1Y3RfdmFsCisgIDU6IG9wdGlvbmFsIHRfc3RydWN0IHhjZXB0aW9uX3ZhbAorICA2OiBvcHRpb25hbCB0X2xpc3QgbGlzdF92YWwKKyAgNzogb3B0aW9uYWwgdF9zZXQgc2V0X3ZhbAorICA4OiBvcHRpb25hbCB0X21hcCBtYXBfdmFsCisgIDk6IG9wdGlvbmFsIHRfc2VydmljZSBzZXJ2aWNlX3ZhbAorfQorc3RydWN0IHRfc2NvcGUgeworICAxOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gdHlwZXMKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2NvbnN0X2lkPiBjb25zdGFudHMKKyAgMzogcmVxdWlyZWQgbGlzdDx0X3NlcnZpY2VfaWQ+IHNlcnZpY2VzCit9CisKK3N0cnVjdCBUeXBlUmVnaXN0cnkgeworICAxOiByZXF1aXJlZCBtYXA8dF90eXBlX2lkLCB0X3R5cGU+IHR5cGVzCisgIDI6IHJlcXVpcmVkIG1hcDx0X2NvbnN0X2lkLCB0X2NvbnN0PiBjb25zdGFudHMKKyAgMzogcmVxdWlyZWQgbWFwPHRfc2VydmljZV9pZCwgdF9zZXJ2aWNlPiBzZXJ2aWNlcworfQorCitzdHJ1Y3QgdF9wcm9ncmFtIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF9wcm9ncmFtX2lkIHByb2dyYW1faWQKKyAgMzogcmVxdWlyZWQgc3RyaW5nIHBhdGgKKyAgNDogcmVxdWlyZWQgc3RyaW5nIG5hbWVzcGFjZV8KKyAgNTogcmVxdWlyZWQgc3RyaW5nIG91dF9wYXRoCisgIDY6IHJlcXVpcmVkIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUKKyAgODogcmVxdWlyZWQgbGlzdDx0X3Byb2dyYW0+IGluY2x1ZGVzCisgIDk6IHJlcXVpcmVkIHN0cmluZyBpbmNsdWRlX3ByZWZpeAorICAxMDogcmVxdWlyZWQgdF9zY29wZSBzY29wZQorCisgIDExOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gdHlwZWRlZnMKKyAgMTI6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiBlbnVtcworICAxMzogcmVxdWlyZWQgbGlzdDx0X2NvbnN0X2lkPiBjb25zdHMKKyAgMTQ6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiBvYmplY3RzCisgIDE1OiByZXF1aXJlZCBsaXN0PHRfc2VydmljZV9pZD4gc2VydmljZXMKKworICAxNjogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBuYW1lc3BhY2VzCisgIDE3OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gY3BwX2luY2x1ZGVzCisgIDE4OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gY19pbmNsdWRlcworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KKworc3RydWN0IEdlbmVyYXRvcklucHV0IHsKKyAgMTogcmVxdWlyZWQgdF9wcm9ncmFtIHByb2dyYW0KKyAgMjogcmVxdWlyZWQgVHlwZVJlZ2lzdHJ5IHR5cGVfcmVnaXN0cnkKKyAgMzogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyM2RlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIFRIUklGVF9QT1BFTihjbWQpIF9wb3BlbihjbWQsICJ3YiIpCisjZGVmaW5lIFRIUklGVF9QQ0xPU0UgX3BjbG9zZQorI2Vsc2UKKyNkZWZpbmUgVEhSSUZUX1BPUEVOKGNtZCkgcG9wZW4oY21kLCAidyIpCisjZGVmaW5lIFRIUklGVF9QQ0xPU0UgcGNsb3NlCisjZW5kaWYKKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9jb3B5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vdHJhbnNmb3JtLmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIGNvbnZlcnQoRnJvbSogZnJvbSkgeworICB0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgdG87CisgIGNvbnZlcnQoZnJvbSwgdG8pOworICByZXR1cm4gdG87Cit9CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTl9OKGZyb21fdHlwZSwgdG9fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGNvbnZlcnQ8ZnJvbV90eXBlLCB0b190eXBlPihmcm9tX3R5cGUgKiBmcm9tLCB0b190eXBlICYgdG8pCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OKHR5cGUpIFRIUklGVF9DT05WRVJTSU9OX04oOjp0eXBlLCBwbHVnaW46OnR5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9OKGZyb21fbmFtZSwgdG9fbmFtZSwgcHJlZml4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShwcmVmaXgoZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOKG5hbWUpIFRIUklGVF9BU1NJR05fTihnZXRfIyNuYW1lKCksIG5hbWUsICkKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHR5cGUsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiBmcm9tLT5mcm9tX25hbWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShjb252ZXJ0KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX09QVChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLT5oYXNfIyNuYW1lKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0FTU0lHTihuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTElTVF9OKHR5cGUsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgIWZyb20tPmZyb21fbmFtZS5lbXB0eSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGQ6OnRyYW5zZm9ybShmcm9tLT5mcm9tX25hbWUuYmVnaW4oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBmcm9tLT5mcm9tX25hbWUuZW5kKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8udG9fbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PCA6OnR5cGU+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpIGNvbnZlcnQocmVpbnRlcnByZXRfY2FzdDx0X3R5cGUqPihmcm9tKSwgdG8ubWV0YWRhdGEpCisKKy8vIGEgZ2VuZXJhdG9yIG9mIHNlcXVlbnRpYWwgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBhZGRyZXNzZXMgLS0gc28KKy8vIHRoYXQgdGhlIFR5cGVDYWNoZSBiZWxvdyBjYW4gdXNlIHRob3NlIElEcyBpbnN0ZWFkIG9mCisvLyBhZGRyZXNzZXMuIFRoaXMgYWxsb3dzIEdlbmVyYXRvcklucHV0J3MgdmFyaW91cworLy8gdF97cHJvZ3JhbSx0eXBlLGV0Y31faWQgdHlwZXMgdG8gYmUgZGVuc2UgY29uc2VjdXRpdmVseS1udW1iZXJlZAorLy8gaW50ZWdlcnMsIGluc3RlYWQgb2YgbGFyZ2UgcmFuZG9tLXNlZW1pbmcgaW50ZWdlcnMuCisvLworLy8gRnVydGhlcm1vcmUsIHRoaXMgYWxsb3dzIEdlbmVyYXRvcklucHV0IHRvIGJlIGRldGVybWluaXN0aWMgKG5vCisvLyBhZGRyZXNzZXMsIHNvIG5vIHBzZXVkby1yYW5kb21uZXNzKSBhbmQgdGhhdCBtZWFucyByZXByb2R1Y2liaWxpdHkKKy8vIG9mIG91dHB1dC4KK2NvbnN0IGludDY0X3QgT05FX01JTExJT04gPSAxMDAwICogMTAwMDsKK2NsYXNzIGlkX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIGlkX2dlbmVyYXRvcigpIDogYWRkcjJpZF8oKSwgbmV4dF9pZF8oT05FX01JTExJT04pIHt9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBhZGRyMmlkXy5jbGVhcigpIDsKKyAgICBuZXh0X2lkXyA9IE9ORV9NSUxMSU9OIDsKKyAgfQorCisgIGludDY0X3QgZ2Vuc3ltKGNvbnN0IGludDY0X3QgYWRkcikgeworICAgIGlmICghYWRkcikgcmV0dXJuIDBMIDsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBhZGRyMmlkXy5maW5kKGFkZHIpOworICAgIGlmIChpdCAhPSBhZGRyMmlkXy5lbmQoKSkgcmV0dXJuIGl0LT5zZWNvbmQgOworICAgIGludDY0X3QgaWQgPSBuZXh0X2lkXysrIDsKKyAgICBhZGRyMmlkXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWRkciwgaWQpKSA7CisgICAgcmV0dXJuIGlkIDsKKyAgfQorCisgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+IGFkZHIyaWRfIDsKKyAgaW50NjRfdCBuZXh0X2lkXyA7Cit9IDsKKworLy8gVG8gYXZvaWQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHNhbWUgdHlwZSwgdF90eXBlLCB0X2NvbnN0IGFuZCB0X3NlcnZpY2UgYXJlIHN0b3JlZCBpbiBvbmUgcGxhY2UKKy8vIGFuZCByZWZlcmVuY2VkIGJ5IElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZUNhY2hlIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbHVnaW46OlRvVHlwZTxUPjo6dHlwZSB0b190eXBlOworICBpZF9nZW5lcmF0b3IgaWRnZW4gOworICBzdGQ6Om1hcDxpbnQ2NF90LCB0b190eXBlPiBjYWNoZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDI+CisgIGludDY0X3Qgc3RvcmUoVDIqIHQpIHsKKyAgICBpbnRwdHJfdCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4odCk7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworCisgICAgaW50NjRfdCBpZCA9IGlkZ2VuLmdlbnN5bShhZGRyKSA7CisgICAgaWYgKGNhY2hlLmVuZCgpICE9IGNhY2hlLmZpbmQoaWQpKSByZXR1cm4gaWQgOworCisgICAgLy8gSEFDSzogZmFrZSByZXNvbHZlIGZvciByZWN1cnNpdmUgdHlwZQorICAgIGNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihpZCwgdG9fdHlwZSgpKSk7CisgICAgLy8gb3ZlcndyaXRlIHdpdGggdHJ1ZSB2YWx1ZQorICAgIGNhY2hlW2lkXSA9IGNvbnZlcnQodCk7CisgICAgcmV0dXJuIGlkIDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGNhY2hlLmNsZWFyKCkgOyBpZGdlbi5jbGVhcigpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludDY0X3Qgc3RvcmVfdHlwZShUKiB0KTsKKworI2RlZmluZSBUX1NUT1JFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlQ2FjaGU8dF8jI3R5cGU+IHR5cGUjI19jYWNoZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwbHVnaW46OnRfIyN0eXBlIyNfaWQgc3RvcmVfdHlwZTx0XyMjdHlwZT4odF8jI3R5cGUgKiB0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0eXBlIyNfY2FjaGUuc3RvcmU8dF8jI3R5cGU+KHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitUX1NUT1JFKHR5cGUpCitUX1NUT1JFKGNvbnN0KQorVF9TVE9SRShzZXJ2aWNlKQorI3VuZGVmIFRfU1RPUkUKKy8vIHRoaXMgaWRfZ2VuZXJhdG9yIGlzIGZvciBnZW5zeW1tLWluZyB0X3Byb2dyYW1faWQKK2lkX2dlbmVyYXRvciBwcm9ncmFtX2NhY2hlIDsKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0lEX04odCwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmIGZyb20tPmZyb21fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKHN0b3JlX3R5cGU8dD4oZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fSUQobmFtZSkgVEhSSUZUX0FTU0lHTl9JRF9OKHRfdHlwZSwgZ2V0XyMjbmFtZSgpLCBuYW1lKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTElTVF9JRCh0LCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgIWZyb20tPmdldF8jI25hbWUjI3MoKS5lbXB0eSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGQ6OnRyYW5zZm9ybShmcm9tLT5nZXRfIyNuYW1lIyNzKCkuYmVnaW4oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBmcm9tLT5nZXRfIyNuYW1lIyNzKCkuZW5kKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8ubmFtZSMjcyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAmc3RvcmVfdHlwZTx0Pik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK1RIUklGVF9DT05WRVJTSU9OX04oOjp0X3R5cGUsIHBsdWdpbjo6VHlwZU1ldGFkYXRhKSB7CisgIHRvLnByb2dyYW1faWQgPSBwcm9ncmFtX2NhY2hlLmdlbnN5bShyZWludGVycHJldF9jYXN0PGludDY0X3Q+KGZyb20tPmdldF9wcm9ncmFtKCkpKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGFubm90YXRpb25zXywgYW5ub3RhdGlvbnMsICk7CisgIGlmIChmcm9tLT5oYXNfZG9jKCkpIHsKKyAgICB0by5fX3NldF9kb2MoZnJvbS0+Z2V0X2RvYygpKTsKKyAgfQorICBUSFJJRlRfQVNTSUdOKG5hbWUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3R5cGVkZWYpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOKHN5bWJvbGljKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX2ZvcndhcmRfdHlwZWRlZigpLCBmb3J3YXJkLCApOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW1fdmFsdWUpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTih2YWx1ZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZW51bV92YWx1ZSwgZ2V0X2NvbnN0YW50cygpLCBjb25zdGFudHMpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0X3ZhbHVlKSB7CisgIHN3aXRjaCAoZnJvbS0+Z2V0X3R5cGUoKSkgeworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9pbnRlZ2VyKCksIGludGVnZXJfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X2RvdWJsZSgpLCBkb3VibGVfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X3N0cmluZygpLCBzdHJpbmdfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgaWYgKGZyb20pIHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OnRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjaWR2YWwgOworICAgICAgaWYgKGZyb20tPmVudW1fKQorCWNpZHZhbC5fX3NldF9lbnVtX3ZhbChzdG9yZV90eXBlPHRfdHlwZT4oZnJvbS0+ZW51bV8pKTsKKyAgICAgIGNpZHZhbC5fX3NldF9pZGVudGlmaWVyX3ZhbChmcm9tLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICAgIHRvLl9fc2V0X2NvbnN0X2lkZW50aWZpZXJfdmFsKGNpZHZhbCkgOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgdG8uX19pc3NldC5tYXBfdmFsID0gdHJ1ZTsKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+Z2V0X21hcCgpLmVtcHR5KCkpIHsKKyAgICAgIGZvciAoc3RkOjptYXA8IDo6dF9jb25zdF92YWx1ZSosIDo6dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdAorICAgICAgICAgICA9IGZyb20tPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBmcm9tLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgICAgICAgIGl0KyspIHsKKyAgICAgICAgdG8ubWFwX3ZhbC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29udmVydChpdC0+Zmlyc3QpLCBjb252ZXJ0KGl0LT5zZWNvbmQpKSk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgdG8uX19pc3NldC5saXN0X3ZhbCA9IHRydWU7CisgICAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9jb25zdF92YWx1ZSwgZ2V0X2xpc3QoKSwgbGlzdF92YWwpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoImNvbnN0IHZhbHVlIGhhcyBubyB2YWx1ZSIpOworICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0KSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X2NvbnN0X3ZhbHVlLCBnZXRfdmFsdWUoKSwgdmFsdWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9maWVsZCkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKGtleSk7CisgIFRIUklGVF9BU1NJR05fTihnZXRfcmVxKCksIHJlcSwgKHBsdWdpbjo6UmVxdWlyZWRuZXNzOjp0eXBlKSk7CisgIFRIUklGVF9BU1NJR04ocmVmZXJlbmNlKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfY29uc3RfdmFsdWUsIGdldF92YWx1ZSgpLCB2YWx1ZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3N0cnVjdCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZmllbGQsIGdldF9tZW1iZXJzKCksIG1lbWJlcnMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfdW5pb24oKSwgaXNfdW5pb24sICk7CisgIFRIUklGVF9BU1NJR05fTihpc194Y2VwdGlvbigpLCBpc194Y2VwdGlvbiwgKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZnVuY3Rpb24pIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChyZXR1cm50eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX29uZXdheSgpLCBpc19vbmV3YXksICk7CisgIFRIUklGVF9BU1NJR05fSUQoYXJnbGlzdCk7CisgIFRIUklGVF9BU1NJR05fSUQoeGNlcHRpb25zKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9saXN0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGVsZW1fdHlwZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3NldCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChlbGVtX3R5cGUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9tYXApIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoa2V5X3R5cGUpOworICBUSFJJRlRfQVNTSUdOX0lEKHZhbF90eXBlKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zZXJ2aWNlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9mdW5jdGlvbiwgZ2V0X2Z1bmN0aW9ucygpLCBmdW5jdGlvbnMpOworICBUSFJJRlRfQVNTSUdOX0lEX04odF9zZXJ2aWNlLCBnZXRfZXh0ZW5kcygpLCBleHRlbmRzXyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfYmFzZV90eXBlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20tPmlzX2JpbmFyeSgpKSB7CisgICAgdG8udmFsdWUgPSBwbHVnaW46OnRfYmFzZTo6VFlQRV9CSU5BUlk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmcm9tLT5nZXRfYmFzZSgpKSB7CisjZGVmaW5lIFRfQkFTRVRZUEVfQ0FTRShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfIyNuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8udmFsdWUgPSBwbHVnaW46OnRfYmFzZTo6VFlQRV8jI25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShWT0lEKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShTVFJJTkcpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEJPT0wpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEk4KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJMTYpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEkzMik7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTY0KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShET1VCTEUpOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJCYXNlIHR5cGUgdW5pb24gaGFzIG5vIHZhbHVlIik7CisgICAgICBicmVhazsKKyN1bmRlZiBUX0JBU0VUWVBFX0NBU0UKKyAgICB9CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfdHlwZSkgeworI2RlZmluZSBUX0NPTlZFUlRfVU5JT05fTihuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmIChmcm9tLT5pc18jI25hbWUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLl9faXNzZXQubmFtZSMjX3ZhbCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnZlcnQocmVpbnRlcnByZXRfY2FzdDwgOjp0eXBlKj4oZnJvbSksIHRvLm5hbWUjI192YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFRfQ09OVkVSVF9VTklPTihuYW1lKSBUX0NPTlZFUlRfVU5JT05fTihuYW1lLCB0XyMjbmFtZSkKKyAgaWYgKGZhbHNlKSB7CisgIH0KKyAgVF9DT05WRVJUX1VOSU9OKGJhc2VfdHlwZSkKKyAgVF9DT05WRVJUX1VOSU9OKHR5cGVkZWYpCisgIFRfQ09OVkVSVF9VTklPTihlbnVtKQorICBUX0NPTlZFUlRfVU5JT04oc3RydWN0KQorICBUX0NPTlZFUlRfVU5JT05fTih4Y2VwdGlvbiwgdF9zdHJ1Y3QpCisgIFRfQ09OVkVSVF9VTklPTihsaXN0KQorICBUX0NPTlZFUlRfVU5JT04oc2V0KQorICBUX0NPTlZFUlRfVU5JT04obWFwKQorICBUX0NPTlZFUlRfVU5JT04oc2VydmljZSkKKyAgZWxzZSB7CisgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUiKTsKKyAgfQorI3VuZGVmIFRfQ09OVkVSVF9VTklPTl9OCisjdW5kZWYgVF9DT05WRVJUX1VOSU9OCit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2NvcGUpIHsKKyNkZWZpbmUgVF9TQ09QRV9BU1NJR04obmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vc3Q6OmNvcHkoZnJvbS0+bmFtZSMjc18gfCBib29zdDo6YWRhcHRvcnM6Om1hcF92YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZzdG9yZV90eXBlPHR5cGU+KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLm5hbWUjI3MpKQorICBUX1NDT1BFX0FTU0lHTih0eXBlLCB0X3R5cGUpOworICBUX1NDT1BFX0FTU0lHTihjb25zdGFudCwgdF9jb25zdCk7CisgIFRfU0NPUEVfQVNTSUdOKHNlcnZpY2UsIHRfc2VydmljZSk7CisjdW5kZWYgVF9TQ09QRV9BU1NJR04KK30KKwordm9pZCBnZXRfZ2xvYmFsX2NhY2hlKHBsdWdpbjo6VHlwZVJlZ2lzdHJ5JiByZWcpIHsKKyAgcmVnLnR5cGVzID0gdHlwZV9jYWNoZS5jYWNoZTsKKyAgcmVnLmNvbnN0YW50cyA9IGNvbnN0X2NhY2hlLmNhY2hlOworICByZWcuc2VydmljZXMgPSBzZXJ2aWNlX2NhY2hlLmNhY2hlOworfQorCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgdHlwZV9jYWNoZS5jbGVhcigpOworICBjb25zdF9jYWNoZS5jbGVhcigpOworICBzZXJ2aWNlX2NhY2hlLmNsZWFyKCk7CisgIHByb2dyYW1fY2FjaGUuY2xlYXIoKSA7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfcHJvZ3JhbSkgeworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9zY29wZSwgc2NvcGUoKSwgc2NvcGUpOworICBUSFJJRlRfQVNTSUdOKHBhdGgpOworICBUSFJJRlRfQVNTSUdOKG91dF9wYXRoKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTihpbmNsdWRlX3ByZWZpeCk7CisgIFRIUklGVF9BU1NJR04oY3BwX2luY2x1ZGVzKTsKKyAgVEhSSUZUX0FTU0lHTihjX2luY2x1ZGVzKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lc3BhY2VzKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX291dF9wYXRoX2Fic29sdXRlKCksIG91dF9wYXRoX2lzX2Fic29sdXRlLCApOworICBUSFJJRlRfQVNTSUdOX04oZ2V0X25hbWVzcGFjZSgpLCBuYW1lc3BhY2VfLCApOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCB0eXBlZGVmKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgZW51bSk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIG9iamVjdCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X2NvbnN0LCBjb25zdCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3NlcnZpY2UsIHNlcnZpY2UpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X3Byb2dyYW0sIGdldF9pbmNsdWRlcygpLCBpbmNsdWRlcyk7CisgIHRvLnByb2dyYW1faWQgPSBwcm9ncmFtX2NhY2hlLmdlbnN5bShyZWludGVycHJldF9jYXN0PHBsdWdpbjo6dF9wcm9ncmFtX2lkPihmcm9tKSk7Cit9CisKK1BsdWdpbkRlbGVnYXRlUmVzdWx0IGRlbGVnYXRlVG9QbHVnaW4odF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgeworICBzdGQ6OnN0cmluZyBsYW5ndWFnZTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJzZWRfb3B0aW9uczsKKyAgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMob3B0aW9ucywgbGFuZ3VhZ2UsIHBhcnNlZF9vcHRpb25zKTsKKyAgc3RkOjpzdHJpbmcgY21kID0gInRocmlmdC1nZW4tIjsKKyAgaWYgKGxhbmd1YWdlLmZpbmRfZmlyc3Rfbm90X29mKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXy0wMTIzNDU2Nzg5IikKKyAgICAgICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGxhbmd1YWdlIG5hbWUiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgIH0KKyAgY21kLmFwcGVuZChsYW5ndWFnZSk7CisgIEZJTEUqIGZkID0gVEhSSUZUX1BPUEVOKGNtZC5jX3N0cigpKTsKKyAgaWYgKGZkKSB7CisjaWZkZWYgX1dJTjMyCisgICAgX3NldG1vZGUoZmlsZW5vKGZkKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICAgIHNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChtYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhmZCkpKSk7CisgICAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CisKKyAgICBwbHVnaW46OkdlbmVyYXRvcklucHV0IGlucHV0OworICAgIGlucHV0Ll9fc2V0X3BhcnNlZF9vcHRpb25zKHBhcnNlZF9vcHRpb25zKTsKKyAgICBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgICBjb252ZXJ0KHByb2dyYW0sIGlucHV0LnByb2dyYW0pOworICAgIGdldF9nbG9iYWxfY2FjaGUoaW5wdXQudHlwZV9yZWdpc3RyeSk7CisgICAgdHJ5IHsKKyAgICAgIGlucHV0LndyaXRlKCZwcm90byk7CisgICAgICB0cmFuc3BvcnQtPmZsdXNoKCk7CisgICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGVycikgeworICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciB3aGlsZSBzZW5kaW5nIGRhdGEgdG8gcGx1Z2luOiAiIDw8IGVyci53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgVEhSSUZUX1BDTE9TRShmZCk7CisgICAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gVE9ETzogYmUgcHJlcGFyZWQgZm9yIGhhbmcgb3IgY3Jhc2ggb2YgY2hpbGQgcHJvY2VzcworICAgIGludCByZXQgPSBUSFJJRlRfUENMT1NFKGZkKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIFBMVUdJTl9TVUNDRUVTUzsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpjZXJyIDw8ICJwbHVnaW4gcHJvY2VzcyByZXR1cm5lZCBub24gemVybyBleGl0IGNvZGU6ICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHJldHVybiBQTFVHSU5fTk9UX0ZPVU5EOworfQorfQorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIyZDFiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fUExVR0lOX09VVFBVVF9ICisjZGVmaW5lIFRfUExVR0lOX1BMVUdJTl9PVVRQVVRfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyB0X3Byb2dyYW07CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKworZW51bSBQbHVnaW5EZWxlZ2F0ZVJlc3VsdCB7CisgIFBMVUdJTl9OT1RfRk9VTkQsCisgIFBMVUdJTl9GQUlMVVJFLAorICBQTFVHSU5fU1VDQ0VFU1MsCit9OworCitQbHVnaW5EZWxlZ2F0ZVJlc3VsdCBkZWxlZ2F0ZVRvUGx1Z2luKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTZiNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9UWVBFX1VUSUxfSAorI2RlZmluZSBUX1BMVUdJTl9UWVBFX1VUSUxfSAorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgorc3RydWN0IFRvVHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBUb1R5cGU8RnJvbT46OnR5cGUqIGNvbnZlcnRfZm9yd2FyZChjb25zdCBGcm9tJik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChjb25zdCBGcm9tJiwgVG8qKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBUb1R5cGU8RnJvbT46OnR5cGUqIGNvbnZlcnQoY29uc3QgRnJvbSYgZnJvbSk7CisKK2NsYXNzIFR5cGVSZWdpc3RyeTsKK3ZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmKTsKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9Cit9Cit9CisKKy8vIGNvbnZlcnNpb24gZnJvbSByYXcgY29tcGlsZXIgdHlwZXMgdG8gcGx1Z2luIHdpcmUgdHlwZQorbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSogZnJvbSwgVG8mIHRvKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgY29udmVydChGcm9tKiBmcm9tKTsKKwordm9pZCBnZXRfZ2xvYmFsX2NhY2hlKGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlR5cGVSZWdpc3RyeSYpOwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KKworI2RlZmluZSBUSFJJRlRfVFlQRV9NQVBQSU5HKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBUWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgYXBhY2hlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgdGhyaWZ0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgcGx1Z2luIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBUWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgVG9UeXBlPCA6OlRZUEU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgVFlQRSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgVG9UeXBlPFRZUEU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgOjpUWVBFIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfYmFzZV90eXBlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnN0X3ZhbHVlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnRhaW5lcikKK1RIUklGVF9UWVBFX01BUFBJTkcodF9kb2MpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZW51bSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9lbnVtX3ZhbHVlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2ZpZWxkKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2Z1bmN0aW9uKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2xpc3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfbWFwKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3Byb2dyYW0pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2NvcGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2VydmljZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zZXQpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc3RydWN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3R5cGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfdHlwZWRlZikKKyN1bmRlZiBUSFJJRlRfVFlQRV9NQVBQSU5HCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzgzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHNjYW5uZXIuCisgKgorICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqLworCisleworCisvKiBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHNvbWUgb2YgdGhlIGZsYWdzIGluIE1ha2VmaWxlLmFtLCBidXQgaXQgd29ya3MKKyAqIHdoZW4gcGVvcGxlIG92ZXJyaWRlIENYWEZMQUdTIHdpdGhvdXQgYmVpbmcgY2FyZWZ1bC4gVGhlIHByYWdtYXMgYXJlCisgKiB0aGUgJ3JpZ2h0JyB3YXkgdG8gZG8gaXQsIGJ1dCBkb24ndCB3b3JrIG9uIG9sZC1lbm91Z2ggR0NDIChpbiBwYXJ0aWN1bGFyCisgKiB0aGUgR0NDIHRoYXQgc2hpcCBvbiBNYWMgT1MgWCAxMC42LjUsICpjb3VudGVyKiB0byB3aGF0IHRoZSBHTlUgZG9jcyBzYXkpCisgKgorICogV2Ugc2hvdWxkIHJldmVydCB0aGUgTWFrZWZpbGUuYW0gY2hhbmdlcyBvbmNlIEFwcGxlIHNoaXBzIGEgcmVhc29uYWJsZQorICogR0NDLgorICovCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWxhYmVsIgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKworLy8gd2FybmluZyBDNDEwMjogJ2ZpbmRfcnVsZScgOiB1bnJlZmVyZW5jZWQgbGFiZWwKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDIgKQorCisvLyB3YXJuaW5nIEM0MjY3OiAnYXJndW1lbnQnIDogY29udmVyc2lvbiBmcm9tICdzaXplX3QnIHRvICdpbnQnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNjcgKQorCisvLyBhdm9pZCBpc2F0dHkgcmVkZWZpbml0aW9uCisjZGVmaW5lIFlZX05FVkVSX0lOVEVSQUNUSVZFIDEKKworI2RlZmluZSBZWV9OT19VTklTVERfSCAxCisjZW5kaWYKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKKy8qKgorICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKKyAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgorICovCisjaWYgZGVmaW5lZChCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OKQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmgiCisjZWxzZQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmhoIgorI2VuZGlmCisKK3ZvaWQgaW50ZWdlcl9vdmVyZmxvdyhjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlRoaXMgaW50ZWdlciBpcyB0b28gYmlnOiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCit2b2lkIHVuZXhwZWN0ZWRfdG9rZW4oY2hhciogdGV4dCkgeworICB5eWVycm9yKCJVbmV4cGVjdGVkIHRva2VuIGluIGlucHV0OiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCislfQorCisvKioKKyAqIFByb3ZpZGVzIHRoZSB5eWxpbmVubyBnbG9iYWwsIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG91dHB1dAorICovCislb3B0aW9uIGxleC1jb21wYXQKKworLyoqCisgKiBPdXIgaW5wdXRzIGFyZSBhbGwgc2luZ2xlIGZpbGVzLCBzbyBubyBuZWVkIGZvciB5eXdyYXAKKyAqLworJW9wdGlvbiBub3l5d3JhcAorCisvKioKKyAqIFdlIGRvbid0IHVzZSBpdCwgYW5kIGl0IGZpcmVzIHVwIHdhcm5pbmdzIGF0IC1XYWxsCisgKi8KKyVvcHRpb24gbm91bnB1dAorCisvKioKKyAqIEhlbHBlciBkZWZpbml0aW9ucywgY29tbWVudHMsIGNvbnN0YW50cywgYW5kIHdoYXRub3QKKyAqLworCitpbnRjb25zdGFudCAgIChbKy1dP1swLTldKykKK2hleGNvbnN0YW50ICAgKFsrLV0/IjB4IlswLTlBLUZhLWZdKykKK2R1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCitpZGVudGlmaWVyICAgIChbYS16QS1aX10oXC5bYS16QS1aXzAtOV18W2EtekEtWl8wLTldKSopCit3aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQorc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQorbXVsdGljbV9iZWdpbiAoIi8qIikKK2RvY3RleHRfYmVnaW4gKCIvKioiKQorY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKK3VuaXhjb21tZW50ICAgKCIjIlteXG5dKikKK3N5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCitsaXRlcmFsX2JlZ2luIChbJ1wiXSkKKworJSUKKwore3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Cit7c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KKwore2RvY3RleHRfYmVnaW59IHsKKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKioiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBkb2MtY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoImRvY3RleHQgPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworCisgLyogVGhpcyBkb2VzIG5vdCBzaG93IHVwIGluIHRoZSBwYXJzZSB0cmVlLiAqLworIC8qIFJhdGhlciwgdGhlIHBhcnNlciB3aWxsIGdyYWIgaXQgb3V0IG9mIHRoZSBnbG9iYWwuICovCisgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICBnX2RvY3RleHQgPSBzdHJkdXAocGFyc2VkLmNfc3RyKCkgKyAzKTsKKyAgICBhc3NlcnQoc3RybGVuKGdfZG9jdGV4dCkgPj0gMik7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMl0gPSAnICc7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMV0gPSAnXDAnOworICAgIGdfZG9jdGV4dCA9IGNsZWFuX3VwX2RvY3RleHQoZ19kb2N0ZXh0KTsKKyAgICBnX2RvY3RleHRfbGluZW5vID0geXlsaW5lbm87CisgICAgaWYoIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBJTlZBTElEKSl7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBzdHJkdXAoZ19kb2N0ZXh0KTsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IGdfZG9jdGV4dF9saW5lbm87CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBTVElMTF9DQU5ESURBVEU7CisgICAgICBwZGVidWcoIiVzIiwicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBTVElMTF9DQU5ESURBVEUiKTsKKyAgICB9CisgIH0KK30KKwore211bHRpY21fYmVnaW59ICB7IC8qIHBhcnNlZCwgYnV0IHRocm93biBhd2F5ICovCisgIHN0ZDo6c3RyaW5nIHBhcnNlZCgiLyoiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtdWx0aWxpbmUgY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoIm11bHRpX2NvbW0gPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworfQorCit7Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3t1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KKyIqIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorCisiZmFsc2UiICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MDsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KKyJ0cnVlIiAgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0xOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorCisibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KKyJjcHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNwcCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjcHBfaW5jbHVkZSIgICAgICAgIHsgcmV0dXJuIHRva19jcHBfaW5jbHVkZTsgICAgICAgICAgfQorImNwcF90eXBlIiAgICAgICAgICAgeyByZXR1cm4gdG9rX2NwcF90eXBlOyAgICAgICAgICAgICB9CisiamF2YV9wYWNrYWdlIiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJqYXZhX3BhY2thZ2UiLCAiamF2YSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjb2NvYV9wcmVmaXgiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNvY29hX3ByZWZpeCIsICJjb2NvYSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNzaGFycCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJkZWxwaGlfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImRlbHBoaSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwaHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBocCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJweV9tb2R1bGUiICAgICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInB5X21vZHVsZSIsICJweSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwZXJsX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBlcmxfcGFja2FnZSIsICJwZXJsIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInJ1YnlfbmFtZXNwYWNlIiAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicnVieSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfY2F0ZWdvcnkiIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsgLyogZG8gbm90aGluZyAqLyB9Cisic21hbGx0YWxrX3ByZWZpeCIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJzbWFsbHRhbGtfY2F0ZWdvcnkiLCAic21hbGx0YWxrLmNhdGVnb3J5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9CisieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KKyJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQorInhzZF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgieHNkIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInhzZF9hdHRycyIgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hdHRyczsgICAgICAgICAgICB9CisiaW5jbHVkZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfaW5jbHVkZTsgICAgICAgICAgICAgIH0KKyJ2b2lkIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva192b2lkOyAgICAgICAgICAgICAgICAgfQorImJvb2wiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2Jvb2w7ICAgICAgICAgICAgICAgICB9CisiYnl0ZSIgICAgICAgICAgICAgICB7CisgIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKTsKKyAgcmV0dXJuIHRva19pODsKK30KKyJpOCIgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pODsgICAgICAgICAgICAgICAgICAgfQorImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9CisiaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KKyJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQorImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Cisic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KKyJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQorInNsaXN0IiB7CisgIHB3YXJuaW5nKDAsICJcInNsaXN0XCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOworICByZXR1cm4gdG9rX3NsaXN0OworfQorInNlbnVtIiB7CisgIHB3YXJuaW5nKDAsICJcInNlbnVtXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOworICByZXR1cm4gdG9rX3NlbnVtOworfQorIm1hcCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX21hcDsgICAgICAgICAgICAgICAgICB9CisibGlzdCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbGlzdDsgICAgICAgICAgICAgICAgIH0KKyJzZXQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXQ7ICAgICAgICAgICAgICAgICAgfQorIm9uZXdheSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX29uZXdheTsgICAgICAgICAgICAgICB9CisidHlwZWRlZiIgICAgICAgICAgICB7IHJldHVybiB0b2tfdHlwZWRlZjsgICAgICAgICAgICAgIH0KKyJzdHJ1Y3QiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJ1Y3Q7ICAgICAgICAgICAgICAgfQorInVuaW9uIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3VuaW9uOyAgICAgICAgICAgICAgICB9CisiZXhjZXB0aW9uIiAgICAgICAgICB7IHJldHVybiB0b2tfeGNlcHRpb247ICAgICAgICAgICAgIH0KKyJleHRlbmRzIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19leHRlbmRzOyAgICAgICAgICAgICAgfQorInRocm93cyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3Rocm93czsgICAgICAgICAgICAgICB9Cisic2VydmljZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VydmljZTsgICAgICAgICAgICAgIH0KKyJlbnVtIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19lbnVtOyAgICAgICAgICAgICAgICAgfQorImNvbnN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2NvbnN0OyAgICAgICAgICAgICAgICB9CisicmVxdWlyZWQiICAgICAgICAgICB7IHJldHVybiB0b2tfcmVxdWlyZWQ7ICAgICAgICAgICAgIH0KKyJvcHRpb25hbCIgICAgICAgICAgIHsgcmV0dXJuIHRva19vcHRpb25hbDsgICAgICAgICAgICAgfQorImFzeW5jIiB7CisgIHB3YXJuaW5nKDAsICJcImFzeW5jXCIgaXMgZGVwcmVjYXRlZC4gIEl0IGlzIGNhbGxlZCBcIm9uZXdheVwiIG5vdy5cbiIpOworICByZXR1cm4gdG9rX29uZXdheTsKK30KKyImIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19yZWZlcmVuY2U7ICAgICAgICAgICAgfQorCit7aW50Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2hleGNvbnN0YW50fSB7CisgIGVycm5vID0gMDsKKyAgY2hhciBzaWduID0geXl0ZXh0WzBdOworICBpbnQgc2hpZnQgPSBzaWduID09ICcwJyA/IDIgOiAzOworICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQrc2hpZnQsIE5VTEwsIDE2KTsKKyAgaWYgKHNpZ24gPT0gJy0nKSB7CisgICAgeXlsdmFsLmljb25zdCA9IC15eWx2YWwuaWNvbnN0OworICB9CisgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7CisgIH0KKyAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Cit9CisKK3tpZGVudGlmaWVyfSB7CisgIHl5bHZhbC5pZCA9IHN0cmR1cCh5eXRleHQpOworICByZXR1cm4gdG9rX2lkZW50aWZpZXI7Cit9CisKK3tkdWJjb25zdGFudH0geworIC8qIERlbGliZXJhdGVseSBwbGFjZWQgYWZ0ZXIgaWRlbnRpZmllciwgc2luY2UgImUxMCIgaXMgTk9UIGEgZG91YmxlIGxpdGVyYWwgKFRIUklGVC0zNDc3KSAqLworICB5eWx2YWwuZGNvbnN0ID0gYXRvZih5eXRleHQpOworICByZXR1cm4gdG9rX2R1Yl9jb25zdGFudDsKK30KKwore2xpdGVyYWxfYmVnaW59IHsKKyAgY2hhciBtYXJrID0geXl0ZXh0WzBdOworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIGZvcig7OykKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiRW5kIG9mIGZpbGUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgeXllcnJvcigiRW5kIG9mIGxpbmUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vIC0gMSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICdcXCc6CisgICAgICAgIGNoID0geXlpbnB1dCgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdccicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcbicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcdCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCciJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcJycpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXFwnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB5eWVycm9yKCJCYWQgZXNjYXBlIGNoYXJhY3RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoY2ggPT0gbWFyaykgeworICAgICAgICAgIHl5bHZhbC5pZCA9IHN0cmR1cChyZXN1bHQuY19zdHIoKSk7CisgICAgICAgICAgcmV0dXJuIHRva19saXRlcmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOworICAgICAgICB9CisgICAgfQorICB9Cit9CisKKworLiB7CisgIHVuZXhwZWN0ZWRfdG9rZW4oeXl0ZXh0KTsKK30KKworJSUKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogdmltOiBmaWxldHlwZT1sZXgKKyovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjM0YWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQpAQCAtMCwwICsxLDEyMDEgQEAKKyVjb2RlIHJlcXVpcmVzIHsKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCit9CisleworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRocmlmdCBwYXJzZXIuCisgKgorICogVGhpcyBwYXJzZXIgaXMgdXNlZCBvbiBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKworI2lmZGVmIF9NU0NfVkVSCisvL3dhcm5pbmcgQzQwNjU6IHN3aXRjaCBzdGF0ZW1lbnQgY29udGFpbnMgJ2RlZmF1bHQnIGJ1dCBubyAnY2FzZScgbGFiZWxzCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDY1KQorI2VuZGlmCisKKy8qKgorICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KKyAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgorICovCitpbnQgeV9maWVsZF92YWwgPSAtMTsKKy8qKgorICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBlbnVtIHZhbHVlcy4KKyAqIHlfZW51bV92YWwgaXMgdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQ7IHRoZSBuZXh0IGF1dG8tYXNzaWduZWQgdmFsdWUgd2lsbCBiZQorICogeV9lbnVtX3ZhbCsxLCBhbmQgdGhlbiBpdCBjb250aW51ZXMgd29ya2luZyB1cHdhcmRzLiAgRXhwbGljaXRseSBzcGVjaWZpZWQKKyAqIGVudW0gdmFsdWVzIHJlc2V0IHlfZW51bV92YWwgdG8gdGhhdCB2YWx1ZS4KKyAqLworaW50MzJfdCB5X2VudW1fdmFsID0gLTE7CitpbnQgZ19hcmdsaXN0ID0gMDsKK2NvbnN0IGludCBzdHJ1Y3RfaXNfc3RydWN0ID0gMDsKK2NvbnN0IGludCBzdHJ1Y3RfaXNfdW5pb24gPSAxOworCislfQorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhcnNlciB0byBob2xkIHRoZSBkYXRhIHR5cGVzIGFzc29jaWF0ZWQgd2l0aAorICogdmFyaW91cyBwYXJzZSBub2Rlcy4KKyAqLworJXVuaW9uIHsKKyAgY2hhciogICAgICAgICAgaWQ7CisgIGludDY0X3QgICAgICAgIGljb25zdDsKKyAgZG91YmxlICAgICAgICAgZGNvbnN0OworICBib29sICAgICAgICAgICB0Ym9vbDsKKyAgdF9kb2MqICAgICAgICAgdGRvYzsKKyAgdF90eXBlKiAgICAgICAgdHR5cGU7CisgIHRfYmFzZV90eXBlKiAgIHRiYXNlOworICB0X3R5cGVkZWYqICAgICB0dHlwZWRlZjsKKyAgdF9lbnVtKiAgICAgICAgdGVudW07CisgIHRfZW51bV92YWx1ZSogIHRlbnVtdjsKKyAgdF9jb25zdCogICAgICAgdGNvbnN0OworICB0X2NvbnN0X3ZhbHVlKiB0Y29uc3R2OworICB0X3N0cnVjdCogICAgICB0c3RydWN0OworICB0X3NlcnZpY2UqICAgICB0c2VydmljZTsKKyAgdF9mdW5jdGlvbiogICAgdGZ1bmN0aW9uOworICB0X2ZpZWxkKiAgICAgICB0ZmllbGQ7CisgIGNoYXIqICAgICAgICAgIGR0ZXh0OworICB0X2ZpZWxkOjplX3JlcSBlcmVxOworICB0X2Fubm90YXRpb24qICB0YW5ub3Q7CisgIHRfZmllbGRfaWQgICAgIHRmaWVsZGlkOworfQorCisvKioKKyAqIFN0cmluZ3MgaWRlbnRpZmllcgorICovCisldG9rZW48aWQ+ICAgICB0b2tfaWRlbnRpZmllcgorJXRva2VuPGlkPiAgICAgdG9rX2xpdGVyYWwKKyV0b2tlbjxkdGV4dD4gIHRva19kb2N0ZXh0CisKKy8qKgorICogQ29uc3RhbnQgdmFsdWVzCisgKi8KKyV0b2tlbjxpY29uc3Q+IHRva19pbnRfY29uc3RhbnQKKyV0b2tlbjxkY29uc3Q+IHRva19kdWJfY29uc3RhbnQKKworLyoqCisgKiBIZWFkZXIga2V5d29yZHMKKyAqLworJXRva2VuIHRva19pbmNsdWRlCisldG9rZW4gdG9rX25hbWVzcGFjZQorJXRva2VuIHRva19jcHBfaW5jbHVkZQorJXRva2VuIHRva19jcHBfdHlwZQorJXRva2VuIHRva194c2RfYWxsCisldG9rZW4gdG9rX3hzZF9vcHRpb25hbAorJXRva2VuIHRva194c2RfbmlsbGFibGUKKyV0b2tlbiB0b2tfeHNkX2F0dHJzCisKKy8qKgorICogQmFzZSBkYXRhdHlwZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX3ZvaWQKKyV0b2tlbiB0b2tfYm9vbAorJXRva2VuIHRva19zdHJpbmcKKyV0b2tlbiB0b2tfYmluYXJ5CisldG9rZW4gdG9rX3NsaXN0CisldG9rZW4gdG9rX3NlbnVtCisldG9rZW4gdG9rX2k4CisldG9rZW4gdG9rX2kxNgorJXRva2VuIHRva19pMzIKKyV0b2tlbiB0b2tfaTY0CisldG9rZW4gdG9rX2RvdWJsZQorCisvKioKKyAqIENvbXBsZXggdHlwZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX21hcAorJXRva2VuIHRva19saXN0CisldG9rZW4gdG9rX3NldAorCisvKioKKyAqIEZ1bmN0aW9uIG1vZGlmaWVycworICovCisldG9rZW4gdG9rX29uZXdheQorCisvKioKKyAqIFRocmlmdCBsYW5ndWFnZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX3R5cGVkZWYKKyV0b2tlbiB0b2tfc3RydWN0CisldG9rZW4gdG9rX3hjZXB0aW9uCisldG9rZW4gdG9rX3Rocm93cworJXRva2VuIHRva19leHRlbmRzCisldG9rZW4gdG9rX3NlcnZpY2UKKyV0b2tlbiB0b2tfZW51bQorJXRva2VuIHRva19jb25zdAorJXRva2VuIHRva19yZXF1aXJlZAorJXRva2VuIHRva19vcHRpb25hbAorJXRva2VuIHRva191bmlvbgorJXRva2VuIHRva19yZWZlcmVuY2UKKworLyoqCisgKiBHcmFtbWFyIG5vZGVzCisgKi8KKworJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQorJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCisldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKKyV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCisldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCisKKyV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgorJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgorCisldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKKworJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKKyV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0CisldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCisldHlwZTxpZD4gICAgICAgIFR5cGVBbm5vdGF0aW9uVmFsdWUKKworJXR5cGU8dGZpZWxkPiAgICBGaWVsZAorJXR5cGU8dGZpZWxkaWQ+ICBGaWVsZElkZW50aWZpZXIKKyV0eXBlPGVyZXE+ICAgICAgRmllbGRSZXF1aXJlZG5lc3MKKyV0eXBlPHR0eXBlPiAgICAgRmllbGRUeXBlCisldHlwZTx0Y29uc3R2PiAgIEZpZWxkVmFsdWUKKyV0eXBlPHRzdHJ1Y3Q+ICAgRmllbGRMaXN0CisldHlwZTx0Ym9vbD4gICAgIEZpZWxkUmVmZXJlbmNlCisKKyV0eXBlPHRlbnVtPiAgICAgRW51bQorJXR5cGU8dGVudW0+ICAgICBFbnVtRGVmTGlzdAorJXR5cGU8dGVudW12PiAgICBFbnVtRGVmCisldHlwZTx0ZW51bXY+ICAgIEVudW1WYWx1ZQorCisldHlwZTx0dHlwZWRlZj4gIFNlbnVtCisldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAorJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgorCisldHlwZTx0Y29uc3Q+ICAgIENvbnN0CisldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0CisldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKKworJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCisldHlwZTx0c3RydWN0PiAgIFN0cnVjdAorJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgorJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCisKKyV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KKyV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCisldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAorCisldHlwZTx0c3RydWN0PiAgIFRocm93cworJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCisldHlwZTx0Ym9vbD4gICAgIE9uZXdheQorJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKKyV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKKyV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKKyV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcworJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCisKKyV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKKworJSUKKworLyoqCisgKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQorICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAorICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KKyAqLworCitQcm9ncmFtOgorICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0CisgICAgeworICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKKyAgICAgIGlmKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyAhPSBBTFJFQURZX1BST0NFU1NFRCkpCisgICAgICB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X2RvYyhnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUpOworICAgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKKyAgICAgIH0KKyAgICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICB9CisKK0NhcHR1cmVEb2NUZXh0OgorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9IGdfZG9jdGV4dDsKKyAgICAgICAgZ19kb2N0ZXh0ID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKy8qIFRPRE8oZHJlaXNzKTogVHJ5IHRvIERlc3Ryb3lEb2NUZXh0IGluIGFsbCBzb3J0cyBvciByYW5kb20gcGxhY2VzLiAqLworRGVzdHJveURvY1RleHQ6CisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICAgIH0KKyAgICB9CisKKy8qIFdlIGhhdmUgdG8gRGVzdHJveURvY1RleHQgaGVyZSwgb3RoZXJ3aXNlIGl0IGNhdGNoZXMgdGhlIGRvY3RleHQKKyAgIG9uIHRoZSBmaXJzdCByZWFsIGVsZW1lbnQuICovCitIZWFkZXJMaXN0OgorICBIZWFkZXJMaXN0IERlc3Ryb3lEb2NUZXh0IEhlYWRlcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiBIZWFkZXJMaXN0IEhlYWRlciIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gIik7CisgICAgfQorCitIZWFkZXI6CisgIEluY2x1ZGUKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiBJbmNsdWRlIik7CisgICAgfQorfCB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCQyLCAkMyk7CisgICAgICB9CisgICAgICBpZiAoJDQgIT0gTlVMTCkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoJDIsICQ0LT5hbm5vdGF0aW9uc18pOworICAgICAgICBkZWxldGUgJDQ7CisgICAgICB9CisgICAgfQorfCB0b2tfbmFtZXNwYWNlICcqJyB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgKiB0b2tfaWRlbnRpZmllciIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoIioiLCAkMyk7CisgICAgICB9CisgICAgfQorfCB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOworICAgICAgfQorICAgIH0KKworSW5jbHVkZToKKyAgdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkluY2x1ZGUgLT4gdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK0RlZmluaXRpb25MaXN0OgorICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7CisgICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7CisgICAgICAgICQzLT5zZXRfZG9jKCQyKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKKyAgICB9CisKK0RlZmluaXRpb246CisgIENvbnN0CisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOworICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFR5cGVEZWZpbml0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKKyAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFNlcnZpY2UKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIH0KKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7CisgICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgeworICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KKworVHlwZURlZmluaXRpb246CisgIFR5cGVkZWYKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IEVudW0KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFNlbnVtCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOworICAgICAgfQorICAgIH0KK3wgU3RydWN0CisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOworICAgICAgfQorICAgIH0KK3wgWGNlcHRpb24KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOworICAgICAgfQorICAgIH0KKworQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsOgorICAnLCcKKyAgICB7fQorfCAnOycKKyAgICB7fQorfAorICAgIHt9CisKK1R5cGVkZWY6CisgIHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKKyAgICAgIHRfdHlwZWRlZiAqdGQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDIsICQzKTsKKyAgICAgICQkID0gdGQ7CisgICAgICBpZiAoJDQgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDQtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ0OworICAgICAgfQorICAgIH0KKworRW51bToKKyAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkVudW0gLT4gdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgeyBFbnVtRGVmTGlzdCB9Iik7CisgICAgICAkJCA9ICQ0OworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorCisgICAgICAvLyBtYWtlIGNvbnN0YW50cyBmb3IgYWxsIHRoZSBlbnVtIHZhbHVlcworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICQkLT5nZXRfY29uc3RhbnRzKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0X25hbWUgPSAkJC0+Z2V0X25hbWUoKSArICIuIiArICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwgPSBuZXcgdF9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCQkKTsKKyAgICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKKyAgICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyBjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworRW51bURlZkxpc3Q6CisgIEVudW1EZWZMaXN0IEVudW1EZWYKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+IEVudW1EZWZMaXN0IEVudW1EZWYiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YXBwZW5kKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfZW51bShnX3Byb2dyYW0pOworICAgICAgeV9lbnVtX3ZhbCA9IC0xOworICAgIH0KKworRW51bURlZjoKKyAgQ2FwdHVyZURvY1RleHQgRW51bVZhbHVlIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWYgLT4gRW51bVZhbHVlIik7CisgICAgICAkJCA9ICQyOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorCSAgaWYgKCQzICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQzLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMzsKKyAgICAgIH0KKyAgICB9CisKK0VudW1WYWx1ZToKKyAgdG9rX2lkZW50aWZpZXIgJz0nIHRva19pbnRfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciA9IHRva19pbnRfY29uc3RhbnQiKTsKKyAgICAgIGlmICgkMyA8IElOVDMyX01JTiB8fCAkMyA+IElOVDMyX01BWCkgeworICAgICAgICAvLyBOb3RlOiB0aGlzIHVzZWQgdG8gYmUganVzdCBhIHdhcm5pbmcuICBIb3dldmVyLCBzaW5jZSB0aHJpZnQgYWx3YXlzCisgICAgICAgIC8vIHRyZWF0cyBlbnVtcyBhcyBpMzIgdmFsdWVzLCBJJ20gY2hhbmdpbmcgaXQgdG8gYSBmYXRhbCBlcnJvci4KKyAgICAgICAgLy8gSSBkb3VidCB0aGlzIHdpbGwgYWZmZWN0IG1hbnkgcGVvcGxlLCBidXQgdXNlcnMgd2hvIHJ1biBpbnRvIHRoaXMKKyAgICAgICAgLy8gd2lsbCBoYXZlIHRvIHVwZGF0ZSB0aGVpciB0aHJpZnQgZmlsZXMgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUKKyAgICAgICAgLy8gdHJ1bmNhdGVkIGkzMiB2YWx1ZSB0aGF0IHRocmlmdCBoYXMgYWx3YXlzIGJlZW4gdXNpbmcgYW55d2F5LgorICAgICAgICBmYWlsdXJlKCI2NC1iaXQgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMgd2lsbCBiZSB0cnVuY2F0ZWQuIiwgJDEpOworICAgICAgfQorICAgICAgeV9lbnVtX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQzKTsKKyAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7CisgICAgfQorIHwKKyAgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQxKTsKKyAgICAgIGlmICh5X2VudW1fdmFsID09IElOVDMyX01BWCkgeworICAgICAgICBmYWlsdXJlKCJlbnVtIHZhbHVlIG92ZXJmbG93IGF0IGVudW0gJXMiLCAkMSk7CisgICAgICB9CisgICAgICArK3lfZW51bV92YWw7CisgICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOworICAgIH0KKworU2VudW06CisgIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtIC0+IHRva19zZW51bSB0b2tfaWRlbnRpZmllciB7IFNlbnVtRGVmTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisgICAgfQorCitTZW51bURlZkxpc3Q6CisgIFNlbnVtRGVmTGlzdCBTZW51bURlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7CisgICAgfQorCitTZW51bURlZjoKKyAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0NvbnN0OgorICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOworICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7CisgICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7CisgICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOworCisgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KKworQ29uc3RWYWx1ZToKKyAgdG9rX2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOworICAgICAgaWYgKCFnX2FsbG93XzY0Yml0X2NvbnN0cyAmJiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIiBQUklpNjQiXCIgbWF5IG5vdCB3b3JrIGluIGFsbCBsYW5ndWFnZXMuXG4iLCAkMSk7CisgICAgICB9CisgICAgfQorfCB0b2tfZHViX2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19kdWJfY29uc3RhbnQiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfZG91YmxlKCQxKTsKKyAgICB9Cit8IHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19saXRlcmFsIik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCQxKTsKKyAgICB9Cit8IHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pZGVudGlmaWVyIik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2lkZW50aWZpZXIoJDEpOworICAgIH0KK3wgQ29uc3RMaXN0CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TGlzdCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IENvbnN0TWFwCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TWFwIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQ29uc3RMaXN0OgorICAnWycgQ29uc3RMaXN0Q29udGVudHMgJ10nCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3QgPT4gWyBDb25zdExpc3RDb250ZW50cyBdIik7CisgICAgICAkJCA9ICQyOworICAgIH0KKworQ29uc3RMaXN0Q29udGVudHM6CisgIENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfbGlzdCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4iKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfbGlzdCgpOworICAgIH0KKworQ29uc3RNYXA6CisgICd7JyBDb25zdE1hcENvbnRlbnRzICd9JworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXAgPT4geyBDb25zdE1hcENvbnRlbnRzIH0iKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorCitDb25zdE1hcENvbnRlbnRzOgorICBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+IENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX21hcCgkMiwgJDQpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4iKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfbWFwKCk7CisgICAgfQorCitTdHJ1Y3RIZWFkOgorICB0b2tfc3RydWN0CisgICAgeworICAgICAgJCQgPSBzdHJ1Y3RfaXNfc3RydWN0OworICAgIH0KK3wgdG9rX3VuaW9uCisgICAgeworICAgICAgJCQgPSBzdHJ1Y3RfaXNfdW5pb247CisgICAgfQorCitTdHJ1Y3Q6CisgIFN0cnVjdEhlYWQgdG9rX2lkZW50aWZpZXIgWHNkQWxsICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU3RydWN0IC0+IHRva19zdHJ1Y3QgdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQ1LT5zZXRfeHNkX2FsbCgkMyk7CisgICAgICAkNS0+c2V0X3VuaW9uKCQxID09IHN0cnVjdF9pc191bmlvbik7CisgICAgICAkJCA9ICQ1OworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgIGlmICgkNyAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNy0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDc7CisgICAgICB9CisgICAgfQorCitYc2RBbGw6CisgIHRva194c2RfYWxsCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkT3B0aW9uYWw6CisgIHRva194c2Rfb3B0aW9uYWwKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2ROaWxsYWJsZToKKyAgdG9rX3hzZF9uaWxsYWJsZQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZEF0dHJpYnV0ZXM6CisgIHRva194c2RfYXR0cnMgJ3snIEZpZWxkTGlzdCAnfScKKyAgICB7CisgICAgICAkJCA9ICQzOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitYY2VwdGlvbjoKKyAgdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiWGNlcHRpb24gLT4gdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkNC0+c2V0X25hbWUoJDIpOworICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKKyAgICAgICQkID0gJDQ7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorICAgIH0KKworU2VydmljZToKKyAgdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgRXh0ZW5kcyAneycgRmxhZ0FyZ3MgRnVuY3Rpb25MaXN0IFVuZmxhZ0FyZ3MgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VydmljZSAtPiB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciB7IEZ1bmN0aW9uTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQgPSAkNjsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOworICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkOTsKKyAgICAgIH0KKyAgICB9CisKK0ZsYWdBcmdzOgorICAgIHsKKyAgICAgICBnX2FyZ2xpc3QgPSAxOworICAgIH0KKworVW5mbGFnQXJnczoKKyAgICB7CisgICAgICAgZ19hcmdsaXN0ID0gMDsKKyAgICB9CisKK0V4dGVuZHM6CisgIHRva19leHRlbmRzIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJFeHRlbmRzIC0+IHRva19leHRlbmRzIHRva19pZGVudGlmaWVyIik7CisgICAgICAkJCA9IE5VTEw7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfc2VydmljZSgkMik7CisgICAgICAgIGlmICgkJCA9PSBOVUxMKSB7CisgICAgICAgICAgeXllcnJvcigiU2VydmljZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDIpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworRnVuY3Rpb25MaXN0OgorICBGdW5jdGlvbkxpc3QgRnVuY3Rpb24KKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiBGdW5jdGlvbkxpc3QgRnVuY3Rpb24iKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkMS0+YWRkX2Z1bmN0aW9uKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X3NlcnZpY2UoZ19wcm9ncmFtKTsKKyAgICB9CisKK0Z1bmN0aW9uOgorICBDYXB0dXJlRG9jVGV4dCBPbmV3YXkgRnVuY3Rpb25UeXBlIHRva19pZGVudGlmaWVyICcoJyBGaWVsZExpc3QgJyknIFRocm93cyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQ0KTsKKyAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKKyAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKyAgICAgIGlmICgkOSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDk7CisgICAgICB9CisgICAgfQorCitPbmV3YXk6CisgIHRva19vbmV3YXkKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitUaHJvd3M6CisgIHRva190aHJvd3MgJygnIEZpZWxkTGlzdCAnKScKKyAgICB7CisgICAgICBwZGVidWcoIlRocm93cyAtPiB0b2tfdGhyb3dzICggRmllbGRMaXN0ICkiKTsKKyAgICAgICQkID0gJDM7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0gJiYgIXZhbGlkYXRlX3Rocm93cygkJCkpIHsKKyAgICAgICAgeXllcnJvcigiVGhyb3dzIGNsYXVzZSBtYXkgbm90IGNvbnRhaW4gbm9uLWV4Y2VwdGlvbiB0eXBlcyIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworRmllbGRMaXN0OgorICBGaWVsZExpc3QgRmllbGQKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiBGaWVsZExpc3QgLCBGaWVsZCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgIGlmICghKCQkLT5hcHBlbmQoJDIpKSkgeworICAgICAgICB5eWVycm9yKCJcIiVkOiAlc1wiIC0gZmllbGQgaWRlbnRpZmllci9uYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCIsICQyLT5nZXRfa2V5KCksICQyLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiAiKTsKKyAgICAgIHlfZmllbGRfdmFsID0gLTE7CisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworRmllbGQ6CisgIENhcHR1cmVEb2NUZXh0IEZpZWxkSWRlbnRpZmllciBGaWVsZFJlcXVpcmVkbmVzcyBGaWVsZFR5cGUgRmllbGRSZWZlcmVuY2UgdG9rX2lkZW50aWZpZXIgRmllbGRWYWx1ZSBYc2RPcHRpb25hbCBYc2ROaWxsYWJsZSBYc2RBdHRyaWJ1dGVzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoInRva19pbnRfY29uc3RhbnQgOiBGaWVsZCAtPiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGlmICgkMi5hdXRvX2Fzc2lnbmVkKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNik7CisgICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKKyAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcigkNik7CisgICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNiwgJDIudmFsdWUpOworICAgICAgJCQtPnNldF9yZWZlcmVuY2UoJDUpOworICAgICAgJCQtPnNldF9yZXEoJDMpOworICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKKyAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNywgJDQpOworICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDcpOworICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ3KTsKKyAgICAgIH0KKyAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ4KTsKKyAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ5KTsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKyAgICAgIGlmICgkMTAgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X3hzZF9hdHRycygkMTApOworICAgICAgfQorICAgICAgaWYgKCQxMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMTEtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQxMTsKKyAgICAgIH0KKyAgICB9CisKK0ZpZWxkSWRlbnRpZmllcjoKKyAgdG9rX2ludF9jb25zdGFudCAnOicKKyAgICB7CisgICAgICBpZiAoJDEgPD0gMCkgeworICAgICAgICBpZiAoZ19hbGxvd19uZWdfZmllbGRfa2V5cykgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogZ19hbGxvd19uZWdfZmllbGRfa2V5cyBleGlzdHMgdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGV4cGxpY2l0bHkKKyAgICAgICAgICAgKiBzcGVjaWZpZWQga2V5IHZhbHVlcyB0byBvbGQgLnRocmlmdCBmaWxlcyB3aXRob3V0IGJyZWFraW5nCisgICAgICAgICAgICogcHJvdG9jb2wgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoJDEgIT0geV9maWVsZF92YWwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB3YXJuIGlmIHRoZSB1c2VyLXNwZWNpZmllZCBuZWdhdGl2ZSB2YWx1ZSBpc24ndCB3aGF0CisgICAgICAgICAgICAgKiB0aHJpZnQgd291bGQgaGF2ZSBhdXRvLWFzc2lnbmVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgZmllbGQga2V5ICglIiBQUklpNjQiKSBkaWZmZXJzIGZyb20gd2hhdCB3b3VsZCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAiYXV0by1hc3NpZ25lZCBieSB0aHJpZnQgKCVkKS5cbiIsICQxLCB5X2ZpZWxkX3ZhbCk7CisgICAgICAgICAgfQorICAgICAgICAgIC8qCisgICAgICAgICAgICogTGVhdmUgJDEgYXMtaXMsIGFuZCB1cGRhdGUgeV9maWVsZF92YWwgdG8gYmUgb25lIGxlc3MgdGhhbiAkMS4KKyAgICAgICAgICAgKiBUaGUgRmllbGRMaXN0IHBhcnNpbmcgd2lsbCBjYXRjaCBhbnkgZHVwbGljYXRlIGtleSB2YWx1ZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgeV9maWVsZF92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSAtIDEpOworICAgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOworICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgdmFsdWUgKCVkKSBub3QgYWxsb3dlZCBhcyBhIGZpZWxkIGtleS5cbiIsCisgICAgICAgICAgICAgICAgICAgJDEpOworICAgICAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKKyAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7CisgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmKCAoU0hSVF9NSU4gPiAkJC52YWx1ZSkgfHwgKCQkLnZhbHVlID4gU0hSVF9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJGaWVsZCBrZXkgKCVkKSBleGNlZWRzIGFsbG93ZWQgcmFuZ2UgKCVkLi4lZCkuXG4iLAorICAgICAgICAgICAgICAgICAkJC52YWx1ZSwgU0hSVF9NSU4sIFNIUlRfTUFYKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOworICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7CisgICAgICBpZiggKFNIUlRfTUlOID4gJCQudmFsdWUpIHx8ICgkJC52YWx1ZSA+IFNIUlRfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiRmllbGQga2V5ICglZCkgZXhjZWVkcyBhbGxvd2VkIHJhbmdlICglZC4uJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgJCQudmFsdWUsIFNIUlRfTUlOLCBTSFJUX01BWCk7CisgICAgICB9CisgICAgfQorCitGaWVsZFJlZmVyZW5jZToKKyAgdG9rX3JlZmVyZW5jZQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICB7CisgICAgICQkID0gZmFsc2U7CisgICB9CisKK0ZpZWxkUmVxdWlyZWRuZXNzOgorICB0b2tfcmVxdWlyZWQKKyAgICB7CisgICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgfQorfCB0b2tfb3B0aW9uYWwKKyAgICB7CisgICAgICBpZiAoZ19hcmdsaXN0KSB7CisgICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKKyAgICAgICAgfQorICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKKyAgICB9CisKK0ZpZWxkVmFsdWU6CisgICc9JyBDb25zdFZhbHVlCisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gJDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK0Z1bmN0aW9uVHlwZToKKyAgRmllbGRUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgdG9rX3ZvaWQKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOworICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKKyAgICB9CisKK0ZpZWxkVHlwZToKKyAgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgeworICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQorICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKKyAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIEVpdGhlciB0aGlzIHR5cGUgaXNuJ3QgeWV0IGRlY2xhcmVkLCBvciBpdCdzIG5ldmVyCisgICAgICAgICAgICAgZGVjbGFyZWQuICBFaXRoZXIgd2F5IGFsbG93IGl0IGFuZCB3ZSdsbCBmaWd1cmUgaXQgb3V0CisgICAgICAgICAgICAgZHVyaW5nIGdlbmVyYXRpb24uCisgICAgICAgICAgICovCisgICAgICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDEsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfCBCYXNlVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IEJhc2VUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgQ29udGFpbmVyVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IENvbnRhaW5lclR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitCYXNlVHlwZTogU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCpzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KCQxKSk7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9ICQxOworICAgICAgfQorICAgIH0KKworU2ltcGxlQmFzZVR5cGU6CisgIHRva19zdHJpbmcKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zdHJpbmciKTsKKyAgICAgICQkID0gZ190eXBlX3N0cmluZzsKKyAgICB9Cit8IHRva19iaW5hcnkKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19iaW5hcnkiKTsKKyAgICAgICQkID0gZ190eXBlX2JpbmFyeTsKKyAgICB9Cit8IHRva19zbGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3NsaXN0Iik7CisgICAgICAkJCA9IGdfdHlwZV9zbGlzdDsKKyAgICB9Cit8IHRva19ib29sCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYm9vbCIpOworICAgICAgJCQgPSBnX3R5cGVfYm9vbDsKKyAgICB9Cit8IHRva19pOAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k4Iik7CisgICAgICAkJCA9IGdfdHlwZV9pODsKKyAgICB9Cit8IHRva19pMTYKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMTYiKTsKKyAgICAgICQkID0gZ190eXBlX2kxNjsKKyAgICB9Cit8IHRva19pMzIKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMzIiKTsKKyAgICAgICQkID0gZ190eXBlX2kzMjsKKyAgICB9Cit8IHRva19pNjQKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pNjQiKTsKKyAgICAgICQkID0gZ190eXBlX2k2NDsKKyAgICB9Cit8IHRva19kb3VibGUKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19kb3VibGUiKTsKKyAgICAgICQkID0gZ190eXBlX2RvdWJsZTsKKyAgICB9CisKK0NvbnRhaW5lclR5cGU6IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJDb250YWluZXJUeXBlIC0+IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zIik7CisgICAgICAkJCA9ICQxOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMjsKKyAgICAgIH0KKyAgICB9CisKK1NpbXBsZUNvbnRhaW5lclR5cGU6CisgIE1hcFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTWFwVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFNldFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gU2V0VHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IExpc3RUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IExpc3RUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworTWFwVHlwZToKKyAgdG9rX21hcCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKKyAgICB7CisgICAgICBwZGVidWcoIk1hcFR5cGUgLT4gdG9rX21hcCA8RmllbGRUeXBlLCBGaWVsZFR5cGU+Iik7CisgICAgICAkJCA9IG5ldyB0X21hcCgkNCwgJDYpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgIH0KKyAgICB9CisKK1NldFR5cGU6CisgIHRva19zZXQgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICc+JworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2V0VHlwZSAtPiB0b2tfc2V0PEZpZWxkVHlwZT4iKTsKKyAgICAgICQkID0gbmV3IHRfc2V0KCQ0KTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICB9CisgICAgfQorCitMaXN0VHlwZToKKyAgdG9rX2xpc3QgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiTGlzdFR5cGUgLT4gdG9rX2xpc3Q8RmllbGRUeXBlPiIpOworICAgICAgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXMoJDMpOworICAgICAgJCQgPSBuZXcgdF9saXN0KCQzKTsKKyAgICAgIGlmICgkNSAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQ1KSk7CisgICAgICB9CisgICAgfQorCitDcHBUeXBlOgorICB0b2tfY3BwX3R5cGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbnM6CisgICcoJyBUeXBlQW5ub3RhdGlvbkxpc3QgJyknCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbnMgLT4gKCBUeXBlQW5ub3RhdGlvbkxpc3QgKSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworVHlwZUFubm90YXRpb25MaXN0OgorICBUeXBlQW5ub3RhdGlvbkxpc3QgVHlwZUFubm90YXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uTGlzdCAtPiBUeXBlQW5ub3RhdGlvbkxpc3QgLCBUeXBlQW5ub3RhdGlvbiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hbm5vdGF0aW9uc19bJDItPmtleV0gPSAkMi0+dmFsOworICAgICAgZGVsZXRlICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAvKiBKdXN0IHVzZSBhIGR1bW15IHN0cnVjdHVyZSB0byBob2xkIHRoZSBhbm5vdGF0aW9ucy4gKi8KKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbjoKKyAgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25WYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IFR5cGVBbm5vdGF0aW9uVmFsdWUiKTsKKyAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKKyAgICAgICQkLT5rZXkgPSAkMTsKKyAgICAgICQkLT52YWwgPSAkMjsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uVmFsdWU6CisgICc9JyB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiA9IHRva19saXRlcmFsIik7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4iKTsKKyAgICAgICQkID0gc3RyZHVwKCIxIik7CisgICAgfQorCislJQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjA3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVkVSU0lPTl9IXworI2RlZmluZSBfVEhSSUZUX1ZFUlNJT05fSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgorCisjZW5kaWYgLy8gX1RIUklGVF9WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI2OWNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKKyNlbmRpZgorCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKworI2RlZmluZSBzdHJ0b2xsKGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKSBfc3RydG9pNjQoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpCisKKyNpZm5kZWYgUFJJdTY0CisjZGVmaW5lIFBSSXU2NCAiSTY0dSIKKyNlbmRpZgorCisjaWZuZGVmIFBSSWk2NAorI2RlZmluZSBQUklpNjQgIkk2NGkiCisjZW5kaWYKKy8vIHNxdWVsY2ggZGVwcmVjYXRpb24gd2FybmluZ3MKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDk5NikKKy8vIHNxdWVsY2ggYm9vbCBjb252ZXJzaW9uIHBlcmZvcm1hbmNlIHdhcm5pbmcKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDgwMCkKKworLy8gTVNWQzEwICgyMDEwKSBvciBsYXRlciBoYXMgc3RkaW50LmgKKyNpZiBfTVNDX1ZFUiA+PSAxNjAwCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2VuZGlmCisKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgorCit0eXBlZGVmIGJvb3N0OjppbnQ2NF90IGludDY0X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50NjRfdCB1aW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDMyX3QgaW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQzMl90IHVpbnQzMl90OwordHlwZWRlZiBib29zdDo6aW50MTZfdCBpbnQxNl90OwordHlwZWRlZiBib29zdDo6dWludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQ4X3QgaW50OF90OwordHlwZWRlZiBib29zdDo6dWludDhfdCB1aW50OF90OworI2VuZGlmCisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTc1YWYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgc2Nhbm5lci4KLSAqCi0gKiBUb2tlbml6ZXMgYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICovCi0KLSV7Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0KLS8qKgotICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKLSAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgotICovCi0jaW5jbHVkZSAidGhyaWZ0eS5oIgotCi12b2lkIHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKGNoYXIqIGtleXdvcmQpIHsKLSAgeXllcnJvcigiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCJcbiIsIGtleXdvcmQpOwotICBleGl0KDEpOwotfQotCi12b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgewotICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKLSAgZXhpdCgxKTsKLX0KLQotJX0KLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKLSAqLwotJW9wdGlvbiBsZXgtY29tcGF0Ci0KLS8qKgotICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAotICovCi0KLWludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQotaGV4Y29uc3RhbnQgICAoIjB4IlswLTlBLUZhLWZdKykKLWR1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCi1pZGVudGlmaWVyICAgIChbYS16QS1aX11bXC5hLXpBLVpfMC05XSopCi13aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQotc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQotbXVsdGljb21tICAgICAoIi8qIlteKl0iLyIqKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1kb2N0ZXh0ICAgICAgICgiLyoqIihbXiovXXxbXipdIi8ifCIqIlteL10pKiIqIioiKi8iKQotY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKLXVuaXhjb21tZW50ICAgKCIjIlteXG5dKikKLXN5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCi1zdF9pZGVudGlmaWVyIChbYS16QS1aLV1bXC5hLXpBLVpfMC05LV0qKQotbGl0ZXJhbF9iZWdpbiAoWydcIl0pCi0KLSUlCi0KLXt3aGl0ZXNwYWNlfSAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote3NpbGx5Y29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17bXVsdGljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXtjb21tZW50fSAgICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote3VuaXhjb21tZW50fSAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci0KLXtzeW1ib2x9ICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQotCi0ibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KLSJjcHBfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva19jcHBfbmFtZXNwYWNlOyAgICAgICAgfQotImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9Ci0iY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KLSJqYXZhX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19qYXZhX3BhY2thZ2U7ICAgICAgICAgfQotImNvY29hX3ByZWZpeCIgICAgICAgeyByZXR1cm4gdG9rX2NvY29hX3ByZWZpeDsgICAgICAgICB9Ci0iY3NoYXJwX25hbWVzcGFjZSIgICB7IHJldHVybiB0b2tfY3NoYXJwX25hbWVzcGFjZTsgICAgIH0KLSJwaHBfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva19waHBfbmFtZXNwYWNlOyAgICAgICAgfQotInB5X21vZHVsZSIgICAgICAgICAgeyByZXR1cm4gdG9rX3B5X21vZHVsZTsgICAgICAgICAgICB9Ci0icGVybF9wYWNrYWdlIiAgICAgICB7IHJldHVybiB0b2tfcGVybF9wYWNrYWdlOyAgICAgICAgIH0KLSJydWJ5X25hbWVzcGFjZSIgICAgIHsgcmV0dXJuIHRva19ydWJ5X25hbWVzcGFjZTsgICAgICAgfQotInNtYWxsdGFsa19jYXRlZ29yeSIgeyByZXR1cm4gdG9rX3NtYWxsdGFsa19jYXRlZ29yeTsgICB9Ci0ic21hbGx0YWxrX3ByZWZpeCIgICB7IHJldHVybiB0b2tfc21hbGx0YWxrX3ByZWZpeDsgICAgIH0KLSJ4c2RfYWxsIiAgICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYWxsOyAgICAgICAgICAgICAgfQotInhzZF9vcHRpb25hbCIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9vcHRpb25hbDsgICAgICAgICB9Ci0ieHNkX25pbGxhYmxlIiAgICAgICB7IHJldHVybiB0b2tfeHNkX25pbGxhYmxlOyAgICAgICAgIH0KLSJ4c2RfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva194c2RfbmFtZXNwYWNlOyAgICAgICAgfQotInhzZF9hdHRycyIgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hdHRyczsgICAgICAgICAgICB9Ci0iaW5jbHVkZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfaW5jbHVkZTsgICAgICAgICAgICAgIH0KLSJ2b2lkIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva192b2lkOyAgICAgICAgICAgICAgICAgfQotImJvb2wiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2Jvb2w7ICAgICAgICAgICAgICAgICB9Ci0iYnl0ZSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYnl0ZTsgICAgICAgICAgICAgICAgIH0KLSJpMTYiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMTY7ICAgICAgICAgICAgICAgICAgfQotImkzMiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kzMjsgICAgICAgICAgICAgICAgICB9Ci0iaTY0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTY0OyAgICAgICAgICAgICAgICAgIH0KLSJkb3VibGUiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19kb3VibGU7ICAgICAgICAgICAgICAgfQotInN0cmluZyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cmluZzsgICAgICAgICAgICAgICB9Ci0iYmluYXJ5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfYmluYXJ5OyAgICAgICAgICAgICAgIH0KLSJzbGlzdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zbGlzdDsgICAgICAgICAgICAgICAgfQotInNlbnVtIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlbnVtOyAgICAgICAgICAgICAgICB9Ci0ibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KLSJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQotInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Ci0ib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KLSJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQotInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9Ci0idW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KLSJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQotImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9Ci0idGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KLSJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQotImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9Ci0iY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KLSJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQotIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9Ci0iYXN5bmMiIHsKLSAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7Ci0gIHJldHVybiB0b2tfb25ld2F5OwotfQotCi0KLSJCRUdJTiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIkVORCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19DTEFTU19fIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0RJUl9fIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRklMRV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GVU5DVElPTl9fIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0xJTkVfXyIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTUVUSE9EX18iICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19OQU1FU1BBQ0VfXyIgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhYnN0cmFjdCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFsaWFzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYW5kIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhcmdzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXNzZXJ0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJiZWdpbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXRjaCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNsYXNzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xvbmUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjb250aW51ZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlY2xhcmUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVmIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWZhdWx0IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsZXRlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkbyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImR5bmFtaWMiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGRlY2xhcmUiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZm9yIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3JlYWNoIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGlmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kc3dpdGNoIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmR3aGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuc3VyZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZhbHNlIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmluYWxseSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmbG9hdCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZm9yZWFjaCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmdW5jdGlvbiIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdsb2JhbCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ290byIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpZiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcGxlbWVudHMiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wb3J0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlubGluZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5zdGFuY2VvZiIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnRlcmZhY2UiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibGFtYmRhIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJtb2R1bGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5hdGl2ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmV3IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXh0IiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5pbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibm90IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJvciIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInBhc3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHVibGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcmludCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaXZhdGUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJvdGVjdGVkIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwdWJsaWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJhaXNlIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVkbyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXNjdWUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJldHJ5IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVnaXN0ZXIiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXR1cm4iICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInNlbGYiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic2l6ZW9mIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzdGF0aWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN1cGVyIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3dpdGNoIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzeW5jaHJvbml6ZWQiICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoZW4iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhpcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aHJvdyIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyYW5zaWVudCIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJ1ZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cnkiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVuZGVmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5pb24iICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmxlc3MiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVuc2lnbmVkIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW50aWwiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1c2UiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZhciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmlydHVhbCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2b2xhdGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndoZW4iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hpbGUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aXRoIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInhvciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieWllbGQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLQote2ludGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0LCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLSAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Ci19Ci0KLXtoZXhjb25zdGFudH0gewotICBlcnJubyA9IDA7Ci0gIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCsyLCBOVUxMLCAxNik7Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLSAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Ci19Ci0KLXtkdWJjb25zdGFudH0gewotICB5eWx2YWwuZGNvbnN0ID0gYXRvZih5eXRleHQpOwotICByZXR1cm4gdG9rX2R1Yl9jb25zdGFudDsKLX0KLQote2lkZW50aWZpZXJ9IHsKLSAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfaWRlbnRpZmllcjsKLX0KLQote3N0X2lkZW50aWZpZXJ9IHsKLSAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfc3RfaWRlbnRpZmllcjsKLX0KLQote2xpdGVyYWxfYmVnaW59IHsKLSAgY2hhciBtYXJrID0geXl0ZXh0WzBdOwotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGZvcig7OykKLSAgewotICAgIGludCBjaCA9IHl5aW5wdXQoKTsKLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICBjYXNlIEVPRjoKLSAgICAgICAgeXllcnJvcigiRW5kIG9mIGZpbGUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgeXllcnJvcigiRW5kIG9mIGxpbmUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vIC0gMSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBjYXNlICdcXCc6Ci0gICAgICAgIGNoID0geXlpbnB1dCgpOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdccicpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcbicpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcdCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCciJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcJycpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXFwnKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB5eWVycm9yKCJCYWQgZXNjYXBlIGNoYXJhY3RlclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoY2ggPT0gbWFyaykgewotICAgICAgICAgIHl5bHZhbC5pZCA9IHN0cmR1cChyZXN1bHQuY19zdHIoKSk7Ci0gICAgICAgICAgcmV0dXJuIHRva19saXRlcmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQote2RvY3RleHR9IHsKLSAvKiBUaGlzIGRvZXMgbm90IHNob3cgdXAgaW4gdGhlIHBhcnNlIHRyZWUuICovCi0gLyogUmF0aGVyLCB0aGUgcGFyc2VyIHdpbGwgZ3JhYiBpdCBvdXQgb2YgdGhlIGdsb2JhbC4gKi8KLSAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgY2xlYXJfZG9jdGV4dCgpOwotICAgIGdfZG9jdGV4dCA9IHN0cmR1cCh5eXRleHQgKyAzKTsKLSAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAyXSA9ICdcMCc7Ci0gICAgZ19kb2N0ZXh0ID0gY2xlYW5fdXBfZG9jdGV4dChnX2RvY3RleHQpOwotICAgIGdfZG9jdGV4dF9saW5lbm8gPSB5eWxpbmVubzsKLSAgfQotfQotCi0KLSUlCi0KLS8qIHZpbTogZmlsZXR5cGU9bGV4Ci0qLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJjY2EzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorKysgL2Rldi9udWxsCkBAIC0xLDExMzQgKzAsMCBAQAotJXsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgcGFyc2VyLgotICoKLSAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICoKLSAqLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0KLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KLSAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgotICovCi1pbnQgeV9maWVsZF92YWwgPSAtMTsKLWludCBnX2FyZ2xpc3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7Ci0KLSV9Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgotICovCi0ldW5pb24gewotICBjaGFyKiAgICAgICAgICBpZDsKLSAgaW50NjRfdCAgICAgICAgaWNvbnN0OwotICBkb3VibGUgICAgICAgICBkY29uc3Q7Ci0gIGJvb2wgICAgICAgICAgIHRib29sOwotICB0X2RvYyogICAgICAgICB0ZG9jOwotICB0X3R5cGUqICAgICAgICB0dHlwZTsKLSAgdF9iYXNlX3R5cGUqICAgdGJhc2U7Ci0gIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOwotICB0X2VudW0qICAgICAgICB0ZW51bTsKLSAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OwotICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7Ci0gIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7Ci0gIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7Ci0gIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOwotICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247Ci0gIHRfZmllbGQqICAgICAgIHRmaWVsZDsKLSAgY2hhciogICAgICAgICAgZHRleHQ7Ci0gIHRfZmllbGQ6OmVfcmVxIGVyZXE7Ci0gIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGlkZW50aWZpZXIKLSAqLwotJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKLSV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCi0ldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAotJXRva2VuPGlkPiAgICAgdG9rX3N0X2lkZW50aWZpZXIKLQotLyoqCi0gKiBDb25zdGFudCB2YWx1ZXMKLSAqLwotJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAotJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAotCi0vKioKLSAqIEhlYWRlciBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX2luY2x1ZGUKLSV0b2tlbiB0b2tfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKLSV0b2tlbiB0b2tfY3BwX3R5cGUKLSV0b2tlbiB0b2tfcGhwX25hbWVzcGFjZQotJXRva2VuIHRva19weV9tb2R1bGUKLSV0b2tlbiB0b2tfcGVybF9wYWNrYWdlCi0ldG9rZW4gdG9rX2phdmFfcGFja2FnZQotJXRva2VuIHRva194c2RfYWxsCi0ldG9rZW4gdG9rX3hzZF9vcHRpb25hbAotJXRva2VuIHRva194c2RfbmlsbGFibGUKLSV0b2tlbiB0b2tfeHNkX25hbWVzcGFjZQotJXRva2VuIHRva194c2RfYXR0cnMKLSV0b2tlbiB0b2tfcnVieV9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5Ci0ldG9rZW4gdG9rX3NtYWxsdGFsa19wcmVmaXgKLSV0b2tlbiB0b2tfY29jb2FfcHJlZml4Ci0ldG9rZW4gdG9rX2NzaGFycF9uYW1lc3BhY2UKLQotLyoqCi0gKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdm9pZAotJXRva2VuIHRva19ib29sCi0ldG9rZW4gdG9rX2J5dGUKLSV0b2tlbiB0b2tfc3RyaW5nCi0ldG9rZW4gdG9rX2JpbmFyeQotJXRva2VuIHRva19zbGlzdAotJXRva2VuIHRva19zZW51bQotJXRva2VuIHRva19pMTYKLSV0b2tlbiB0b2tfaTMyCi0ldG9rZW4gdG9rX2k2NAotJXRva2VuIHRva19kb3VibGUKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19tYXAKLSV0b2tlbiB0b2tfbGlzdAotJXRva2VuIHRva19zZXQKLQotLyoqCi0gKiBGdW5jdGlvbiBtb2RpZmllcnMKLSAqLwotJXRva2VuIHRva19vbmV3YXkKLQotLyoqCi0gKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKLSAqLwotJXRva2VuIHRva190eXBlZGVmCi0ldG9rZW4gdG9rX3N0cnVjdAotJXRva2VuIHRva194Y2VwdGlvbgotJXRva2VuIHRva190aHJvd3MKLSV0b2tlbiB0b2tfZXh0ZW5kcwotJXRva2VuIHRva19zZXJ2aWNlCi0ldG9rZW4gdG9rX2VudW0KLSV0b2tlbiB0b2tfY29uc3QKLSV0b2tlbiB0b2tfcmVxdWlyZWQKLSV0b2tlbiB0b2tfb3B0aW9uYWwKLSV0b2tlbiB0b2tfdW5pb24KLQotLyoqCi0gKiBHcmFtbWFyIG5vZGVzCi0gKi8KLQotJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCi0ldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCi0KLSV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgotJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgotCi0ldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKLQotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0Ci0ldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCi0KLSV0eXBlPHRmaWVsZD4gICAgRmllbGQKLSV0eXBlPGljb25zdD4gICAgRmllbGRJZGVudGlmaWVyCi0ldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCi0ldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQotJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCi0ldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAotCi0ldHlwZTx0ZW51bT4gICAgIEVudW0KLSV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKLSV0eXBlPHRlbnVtdj4gICAgRW51bURlZgotCi0ldHlwZTx0dHlwZWRlZj4gIFNlbnVtCi0ldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAotJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgotCi0ldHlwZTx0Y29uc3Q+ICAgIENvbnN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKLQotJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCi0ldHlwZTx0c3RydWN0PiAgIFN0cnVjdAotJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgotJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCi0KLSV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KLSV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCi0ldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAotCi0ldHlwZTx0c3RydWN0PiAgIFRocm93cwotJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCi0ldHlwZTx0Ym9vbD4gICAgIE9uZXdheQotJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKLSV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKLSV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKLSV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcwotJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCi0KLSV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKLQotJSUKLQotLyoqCi0gKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQotICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAotICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KLSAqLwotCi1Qcm9ncmFtOgotICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKLSAgICAgIC8qCi0gICAgICBUT0RPKGRyZWlzcyk6IERlY2lkZSB3aGV0aGVyIGZ1bGwtcHJvZ3JhbSBkb2N0ZXh0IGlzIHdvcnRoIHRoZSB0cm91YmxlLgotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgfQotCi1DYXB0dXJlRG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX2RvY3RleHQ7Ci0gICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KLURlc3Ryb3lEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0Ci0gICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLwotSGVhZGVyTGlzdDoKLSAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOwotICAgIH0KLQotSGVhZGVyOgotICBJbmNsdWRlCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOwotICAgIH0KLXwgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2NwcF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NwcF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGNwcCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNwcCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NwcF9pbmNsdWRlKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19waHBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidwaHBfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBwaHAnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19waHBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwaHAiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19weV9tb2R1bGUgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3B5X21vZHVsZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcHknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19weV9tb2R1bGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInB5IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcGVybF9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidwZXJsX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBlcmwnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19wZXJsX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicGVybCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidydWJ5X25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcmInIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19ydWJ5X25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicmIiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19jYXRlZ29yeScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2Ugc21hbGx0YWxrLmNhdGVnb3J5JyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5IHRva19zdF9pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidzbWFsbHRhbGtfcHJlZml4JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsucHJlZml4JyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfc21hbGx0YWxrX3ByZWZpeCB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2phdmFfcGFja2FnZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInamF2YV9wYWNrYWdlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBqYXZhJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJqYXZhIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY29jb2FfcHJlZml4IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidjb2NvYV9wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGNvY29hJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY29jb2FfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjb2NvYSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3hzZF9uYW1lc3BhY2UgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3hzZF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHhzZCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3hzZF9uYW1lc3BhY2UgdG9rX2xpdGVyYWwiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3NoYXJwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgewotICAgICBwd2FybmluZygxLCAiJ2NzaGFycF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGNzaGFycCcgaW5zdGVhZCIpOwotICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3NoYXJwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNzaGFycCIsICQyKTsKLSAgICAgfQotICAgfQotCi1JbmNsdWRlOgotICB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiSW5jbHVkZSAtPiB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIGlmICghcGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgICAgZ19wcm9ncmFtLT5hZGRfaW5jbHVkZShwYXRoLCBzdGQ6OnN0cmluZygkMikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1EZWZpbml0aW9uTGlzdDoKLSAgRGVmaW5pdGlvbkxpc3QgQ2FwdHVyZURvY1RleHQgRGVmaW5pdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gRGVmaW5pdGlvbkxpc3QgRGVmaW5pdGlvbiIpOwotICAgICAgaWYgKCQyICE9IE5VTEwgJiYgJDMgIT0gTlVMTCkgewotICAgICAgICAkMy0+c2V0X2RvYygkMik7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gIik7Ci0gICAgfQotCi1EZWZpbml0aW9uOgotICBDb25zdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBDb25zdCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NvbnN0KCQxKTsKLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBUeXBlRGVmaW5pdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBUeXBlRGVmaW5pdGlvbiIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF90eXBlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF90eXBlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBTZXJ2aWNlCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFNlcnZpY2UiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5hZGRfc2VydmljZSgkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfc2VydmljZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICB9Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3NlcnZpY2UoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLVR5cGVEZWZpbml0aW9uOgotICBUeXBlZGVmCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBUeXBlZGVmIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBFbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBFbnVtIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfZW51bSgkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBTZW51bQotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU2VudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFN0cnVjdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU3RydWN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc3RydWN0KCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFhjZXB0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBYY2VwdGlvbiIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3hjZXB0aW9uKCQxKTsKLSAgICAgIH0KLSAgICB9Ci0KLVR5cGVkZWY6Ci0gIHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZiAtPiB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIHRfdHlwZWRlZiAqdGQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDIsICQzKTsKLSAgICAgICQkID0gdGQ7Ci0gICAgfQotCi1Db21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6Ci0gICcsJwotICAgIHt9Ci18ICc7JwotICAgIHt9Ci18Ci0gICAge30KLQotRW51bToKLSAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bSAtPiB0b2tfZW51bSB0b2tfaWRlbnRpZmllciB7IEVudW1EZWZMaXN0IH0iKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgICAkJC0+c2V0X25hbWUoJDIpOwotICAgICAgJCQtPnJlc29sdmVfdmFsdWVzKCk7Ci0gICAgfQotCi1FbnVtRGVmTGlzdDoKLSAgRW51bURlZkxpc3QgRW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hcHBlbmQoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1FbnVtRGVmOgotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICBpZiAoJDQgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJOZWdhdGl2ZSB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgIGlmICgkNCA+IElOVF9NQVgpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMiwgJDQpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMiwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgJDIsIG5ldyB0X2NvbnN0X3ZhbHVlKCQ0KSkpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDIsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICQyLCBuZXcgdF9jb25zdF92YWx1ZSgkNCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwKLSAgQ2FwdHVyZURvY1RleHQgdG9rX2lkZW50aWZpZXIgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLQotU2VudW06Ci0gIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKLSAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQ0LCAkMik7Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCQxIDwgSU5UMzJfTUlOIHx8ICQxID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIlBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19kdWJfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9kb3VibGUoJDEpOwotICAgIH0KLXwgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOwotICAgIH0KLXwgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7Ci0gICAgfQotfCBDb25zdExpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29uc3RNYXAKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1Db25zdExpc3Q6Ci0gICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdExpc3RDb250ZW50czoKLSAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9saXN0KCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9saXN0KCk7Ci0gICAgfQotCi1Db25zdE1hcDoKLSAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TWFwQ29udGVudHM6Ci0gIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9tYXAoKTsKLSAgICB9Ci0KLVN0cnVjdEhlYWQ6Ci0gIHRva19zdHJ1Y3QKLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7Ci0gICAgfQotfCB0b2tfdW5pb24KLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKLSAgICB9Ci0KLVN0cnVjdDoKLSAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOwotICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOwotICAgICAgJCQgPSAkNTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDcgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ3OwotICAgICAgfQotICAgIH0KLSAgICAKLVhzZEFsbDoKLSAgdG9rX3hzZF9hbGwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RPcHRpb25hbDoKLSAgdG9rX3hzZF9vcHRpb25hbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE5pbGxhYmxlOgotICB0b2tfeHNkX25pbGxhYmxlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkQXR0cmlidXRlczoKLSAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgICQkID0gJDM7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVhjZXB0aW9uOgotICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlhjZXB0aW9uIC0+IHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNC0+c2V0X25hbWUoJDIpOwotICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgfQotCi1TZXJ2aWNlOgotICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgIH0KLQotRmxhZ0FyZ3M6Ci0gICAgewotICAgICAgIGdfYXJnbGlzdCA9IDE7Ci0gICAgfQotCi1VbmZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAwOwotICAgIH0KLQotRXh0ZW5kczoKLSAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gTlVMTDsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1GdW5jdGlvbkxpc3Q6Ci0gIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOwotICAgIH0KLQotRnVuY3Rpb246Ci0gIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKLSAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICB9Ci0KLU9uZXdheToKLSAgdG9rX29uZXdheQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVRocm93czoKLSAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOwotICAgICAgJCQgPSAkMzsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgewotICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZExpc3Q6Ci0gIEZpZWxkTGlzdCBGaWVsZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIkZpZWxkIGlkZW50aWZpZXIgJWQgZm9yIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7Ci0gICAgICB5X2ZpZWxkX3ZhbCA9IC0xOwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZpZWxkOgotICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoJDIgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNSk7Ci0gICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKLSAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNSwgJDIpOwotICAgICAgJCQtPnNldF9yZXEoJDMpOwotICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKLSAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNiwgJDQpOwotICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDYpOwotICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ2KTsKLSAgICAgIH0KLSAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ3KTsKLSAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ4KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkOSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQ5KTsKLSAgICAgIH0KLSAgICAgIGlmICgkMTAgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDEwLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMTA7Ci0gICAgICB9Ci0gICAgfQotCi1GaWVsZElkZW50aWZpZXI6Ci0gIHRva19pbnRfY29uc3RhbnQgJzonCi0gICAgewotICAgICAgaWYgKCQxIDw9IDApIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLCAkMSk7Ci0gICAgICAgICQxID0geV9maWVsZF92YWwtLTsKLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0geV9maWVsZF92YWwtLTsKLSAgICB9Ci0KLUZpZWxkUmVxdWlyZWRuZXNzOgotICB0b2tfcmVxdWlyZWQKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotfCB0b2tfb3B0aW9uYWwKLSAgICB7Ci0gICAgICBpZiAoZ19hcmdsaXN0KSB7Ci0gICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKLSAgICAgICAgfQotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICB9Ci0KLUZpZWxkVmFsdWU6Ci0gICc9JyBDb25zdFZhbHVlCi0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uVHlwZToKLSAgRmllbGRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgdG9rX3ZvaWQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOwotICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKLSAgICB9Ci0KLUZpZWxkVHlwZToKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCi0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMSk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwgQmFzZVR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBCYXNlVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IENvbnRhaW5lclR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBDb250YWluZXJUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQmFzZVR5cGU6IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgqc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPigkMSkpOwotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSAkMTsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUJhc2VUeXBlOgotICB0b2tfc3RyaW5nCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc3RyaW5nIik7Ci0gICAgICAkJCA9IGdfdHlwZV9zdHJpbmc7Ci0gICAgfQotfCB0b2tfYmluYXJ5Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYmluYXJ5Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9iaW5hcnk7Ci0gICAgfQotfCB0b2tfc2xpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zbGlzdCIpOwotICAgICAgJCQgPSBnX3R5cGVfc2xpc3Q7Ci0gICAgfQotfCB0b2tfYm9vbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2Jvb2wiKTsKLSAgICAgICQkID0gZ190eXBlX2Jvb2w7Ci0gICAgfQotfCB0b2tfYnl0ZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2J5dGUiKTsKLSAgICAgICQkID0gZ190eXBlX2J5dGU7Ci0gICAgfQotfCB0b2tfaTE2Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTE2Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMTY7Ci0gICAgfQotfCB0b2tfaTMyCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTMyIik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMzI7Ci0gICAgfQotfCB0b2tfaTY0Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTY0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pNjQ7Ci0gICAgfQotfCB0b2tfZG91YmxlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfZG91YmxlIik7Ci0gICAgICAkJCA9IGdfdHlwZV9kb3VibGU7Ci0gICAgfQotCi1Db250YWluZXJUeXBlOiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29udGFpbmVyVHlwZSAtPiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9Ci0gICAgfQotCi1TaW1wbGVDb250YWluZXJUeXBlOgotICBNYXBUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IE1hcFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBTZXRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IFNldFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBMaXN0VHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBMaXN0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLU1hcFR5cGU6Ci0gIHRva19tYXAgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCi0gICAgewotICAgICAgcGRlYnVnKCJNYXBUeXBlIC0+IHRva19tYXAgPEZpZWxkVHlwZSwgRmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9tYXAoJDQsICQ2KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1TZXRUeXBlOgotICB0b2tfc2V0IENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIlNldFR5cGUgLT4gdG9rX3NldDxGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X3NldCgkNCk7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgfQotICAgIH0KLQotTGlzdFR5cGU6Ci0gIHRva19saXN0ICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkxpc3RUeXBlIC0+IHRva19saXN0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfbGlzdCgkMyk7Ci0gICAgICBpZiAoJDUgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkNSkpOwotICAgICAgfQotICAgIH0KLQotQ3BwVHlwZToKLSAgdG9rX2NwcF90eXBlIHRva19saXRlcmFsCi0gICAgewotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25zOgotICAnKCcgVHlwZUFubm90YXRpb25MaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25zIC0+ICggVHlwZUFubm90YXRpb25MaXN0ICkiKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uTGlzdDoKLSAgVHlwZUFubm90YXRpb25MaXN0IFR5cGVBbm5vdGF0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbkxpc3QgLT4gVHlwZUFubm90YXRpb25MaXN0ICwgVHlwZUFubm90YXRpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YW5ub3RhdGlvbnNfWyQyLT5rZXldID0gJDItPnZhbDsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgLyogSnVzdCB1c2UgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYW5ub3RhdGlvbnMuICovCi0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotVHlwZUFubm90YXRpb246Ci0gIHRva19pZGVudGlmaWVyICc9JyB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKLSAgICAgICQkLT5rZXkgPSAkMTsKLSAgICAgICQkLT52YWwgPSAkMzsKLSAgICB9Ci0KLSUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWYyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitpZigke1dJVEhfUExVR0lOfSkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworICAgICMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworICAgIHNldChwbHVnaW50ZXN0X1NPVVJDRVMKKyAgICAgICAgcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworICAgICkKKyAgICBhZGRfZXhlY3V0YWJsZShwbHVnaW50ZXN0ICR7cGx1Z2ludGVzdF9TT1VSQ0VTfSkKKyAgICBpZihXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBNU1ZDKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMocGx1Z2ludGVzdAorICAgICAgICAgICAgdGhyaWZ0YworICAgICAgICAgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICAgICAgICkKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsdWdpbnRlc3QKKyAgICAgICAgICAgIHRocmlmdGNfc3RhdGljCisgICAgICAgICAgICB0aHJpZnRfc3RhdGljCisgICAgICAgICAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKKyAgICBhZGRfdGVzdChOQU1FIFBsdWdpblVuaXRUZXN0IENPTU1BTkQgcGx1Z2ludGVzdCkKKworICAgIHNldCh0aHJpZnQtZ2VuLW15Y3BwX1NPVVJDRVMKKyAgICAgICAgLi4vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgICAgICAgcGx1Z2luL2NwcF9wbHVnaW4uY2MKKyAgICApCisgICAgYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWdlbi1teWNwcCAke3RocmlmdC1nZW4tbXljcHBfU09VUkNFU30pCisgICAgaWYoV0lUSF9TSEFSRURfTElCIEFORCBOT1QgTVNWQykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0YykKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0Y19zdGF0aWMgdGhyaWZ0X3N0YXRpYykKKyAgICBlbmRpZigpCisKKyAgICBpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgICAgIHNldChCVUlMRFRZUEUgIkRlYnVnIikKKyAgICBlbHNlKCkKKyAgICAgICAgIyBSZWxXaXRoRGViSW5mbyBnZW5lcmF0ZXMgYmluYXJpZXMgaW4gIlJlbGVhc2UiIGRpcmVjdG9yeSB0b28KKyAgICAgICAgc2V0KEJVSUxEVFlQRSAiUmVsZWFzZSIpCisgICAgZW5kaWYoKQorCisgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1jcHAKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1teWNwcCkKKworICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHApCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLW15Y3BwKQorICAgIGFkZF90ZXN0KE5BTUUgUGx1Z2luSW50ZWdyYXRpb25UZXN0CisgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAgICAgIC1EVEhSSUZUX0NPTVBJTEVSPSR7VEhSSUZUX0NPTVBJTEVSfQorICAgICAgICAgICAgICAgICAtREJJTkRJUj0ke0NNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWX0KKyAgICAgICAgICAgICAgICAgLURCVUlMRFRZUEU9JHtCVUlMRFRZUEV9CisgICAgICAgICAgICAgICAgIC1EQ1VSRElSPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAtRFNSQ0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NwcF9wbHVnaW5fdGVzdC5jbWFrZSkKK2VuZGlmKCkKKworZmlsZShHTE9CIEtFWVdPUkRfU0FNUExFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2tleXdvcmQtc2FtcGxlcy8qLnRocmlmdCIpCitmb3JlYWNoKExBTkcgJHt0aHJpZnRfY29tcGlsZXJfTEFOR1N9KQorICAgIGZvcmVhY2goU0FNUExFICR7S0VZV09SRF9TQU1QTEVTfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChGSUxFTkFNRSAke1NBTVBMRX0gTkFNRV9XRSkKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSAiJHtMQU5HfV8ke0ZJTEVOQU1FfSIKKyAgICAgICAgICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuICR7TEFOR30gJHtTQU1QTEV9KQorICAgICAgICBzZXRfdGVzdHNfcHJvcGVydGllcygiJHtMQU5HfV8ke0ZJTEVOQU1FfSIgUFJPUEVSVElFUworICAgICAgICAgICAgUEFTU19SRUdVTEFSX0VYUFJFU1NJT04gIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZCIpCisgICAgZW5kZm9yZWFjaCgpCitlbmRmb3JlYWNoKCkKKworCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFJFUVVJUkVEKQorYWRkX3Rlc3QoTkFNRSBTdGFsZW5lc3NDaGVja1Rlc3QgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5ICR7VEhSSUZUX0NPTVBJTEVSfSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmYzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCisKK2lmIFdJVEhfUExVR0lOCitjaGVja19QUk9HUkFNUyA9IHBsdWdpbnRlc3QKKworbm9pbnN0X1BST0dSQU1TID0gdGhyaWZ0LWdlbi1teWNwcAorCithbGwtbG9jYWw6IHRocmlmdC1nZW4tYmluY2F0CisKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYworCitwbHVnaW50ZXN0X1NPVVJDRVMgPSBwbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCitwbHVnaW50ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK3RocmlmdF9nZW5fbXljcHBfU09VUkNFUyA9IHBsdWdpbi9jcHBfcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2MKK3RocmlmdF9nZW5fbXljcHBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlCit0aHJpZnRfZ2VuX215Y3BwX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK2NwcF9wbHVnaW5fdGVzdC5zaDogdGhyaWZ0LWdlbi1teWNwcAorCit0aHJpZnQtZ2VuLWJpbmNhdDoKKwljcCBiaW5jYXQuc2ggJEAKKwljaG1vZCA3NTUgJEAKKworcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitURVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpIGNwcF9wbHVnaW5fdGVzdC5zaCBwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jcHAgZ2VuLW15Y3BwIGdlbi1iaW5jYXQgdGhyaWZ0LWdlbi1iaW5jYXQKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2Y5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworZXhlYyAvYmluL2NhdApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCisKK3N0cnVjdCBhX3N0cnVjdCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogaTggYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgQVNlcnZpY2UgeworICBpMzIgYV9wcm9jZWR1cmUoMTogaTMyIGFyZykKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2FmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZSAiSW5jbHVkZWQudGhyaWZ0IgorCitjb25zdCBzdHJpbmcgcyA9ICJzdHJpbmciCisKK3N0cnVjdCBCU3RydWN0IHsKKyAgMTogSW5jbHVkZWQuYV9zdHJ1Y3Qgb25lX29mX2VhY2gKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzMwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMTFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdFN0YWxlbmVzc0NoZWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIENVUlJFTlRfRElSX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgICAgVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IE5vbmUKKyAgICBTSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiU2luZ2xlLnRocmlmdCIpCisgICAgSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGluZy50aHJpZnQiKQorICAgIElOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGVkLnRocmlmdCIpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhvdXRfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBmaXJzdF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHVzZWRfZmlsZS53cml0ZSgiXG4vKiBUaGlzIGlzIGEgY29tbWVudCAqL1xuIikKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIHNlY29uZF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9jb250ZW50cywgc2Vjb25kX2NvbnRlbnRzKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9pbmNsdWRlZF9maWxlKHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkZWQudGhyaWZ0IikKKyAgICAgICAgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkaW5nLnRocmlmdCIpCisKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURFRF9USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCkKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItcmVjdXJzZSIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFt0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGhdCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGVkX2NvbnN0YW50cy5jcHAiKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGluZ19jb25zdGFudHMuY3BwIikKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUgPSBvcGVuKHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS53cml0ZSgiXG5jb25zdCBpMzIgYW5faW50ZWdlciA9IDQyXG4iKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAorICAgICAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RTdGFsZW5lc3NDaGVjaykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjIFRoZSBwYXRoIG9mIFRocmlmdCBjb21waWxlciAgaXMgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgdGVzdCBzY3JpcHQuCisgICAgIyBSZW1vdmUgaXQgdG8gbm90IGNvbmZ1c2UgdGhlIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsKKyAgICBUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IHN5cy5hcmd2Wy0xXQorICAgIGRlbCBzeXMuYXJndlstMV0KKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTgyODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1jcHApCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLXIgLW91dCAke0NVUkRJUn0vZ2VuLWNwcCAtZ2VuIGNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCkKK2lmKEVYSVRDT0RFKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtBUkdWfVwiOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQoraWYoV0lOMzIpCisgICAgc2V0KEVOVntQQVRIfSAiJHtCSU5ESVJ9LyR7QlVJTERUWVBFfTske0JJTkRJUn07JEVOVntQQVRIfSIpCitlbHNlKCkKKyAgICBzZXQoRU5We1BBVEh9ICIke0JJTkRJUn06JEVOVntQQVRIfSIpCitlbmRpZigpCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1teWNwcCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtciAtb3V0ICR7Q1VSRElSfS9nZW4tbXljcHAgLWdlbiBteWNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCBSRVNVTFRfVkFSSUFCTEUgRVhJVENPREUpCitpZihFWElUQ09ERSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQorCitmaW5kX3Byb2dyYW0oRElGRiBkaWZmKQoraWYoRElGRikKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtESUZGfSAtdXJOIGdlbi1jcHAgZ2VuLW15Y3BwIFJFU1VMVF9WQVJJQUJMRSBFWElUQ09ERSkKKyAgaWYoRVhJVENPREUpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorICBlbmRpZigpCitlbHNlKCkKKyAgICBtZXNzYWdlKFdBUk5JTkcgImRpZmYgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlLiBOb3QgdmFsaWRhdGluZyBwbHVnaW4tZ2VuZXJhdGVkIGNvZGUuIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZGIyZTBhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorc2V0IC1lCitta2RpciAtcCBnZW4tY3BwIGdlbi1teWNwcAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1vdXQgZ2VuLWNwcCAtZ2VuIGNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLW91dCBnZW4tbXljcHAgLWdlbiBteWNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitkaWZmIC11ck4gZ2VuLWNwcCBnZW4tbXljcHAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IGJvb2wgcmV0dXJuID0gMApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgzNGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwyIEBACitlbnVtIHJldHVybiB7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2FhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2VudW0gZW51bV9uYW1lIHsKKyAgcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRiMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitleGNlcHRpb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7CisgIDE6IHJlcXVpcmVkIGk4IHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc2VydmljZSByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICBib29sIGZ1bmN0aW9uX25hbWUoMTogaTMyIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZDk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIHJldHVybigpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzg3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDUgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7fQorCitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgZnVuY3Rpb25fbmFtZSgpIHRocm93cyAoIDE6IGV4Y2VwdGlvbl9uYW1lIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3N0cnVjdCByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzAwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IHN0cnVjdF9uYW1lIHsKKyAgMTogcmVxdWlyZWQgYm9vbCByZXR1cm4gPSAxCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTliYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit0eXBlZGVmIGJvb2wgcmV0dXJuCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit1bmlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE5ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAordW5pb24gdW5pb25fbmFtZSB7CisgIDE6IG9wdGlvbmFsIGJvb2wgcmV0dXJuPTEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGQ4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9pbmNsdWRlZC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvcGFyYW1ldGVyaXplZF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q7CisKK25hbWVzcGFjZSB0ZXN0X2RhdGEgeworI2RlZmluZSBUX1RFU1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9ncmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF92YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKSkKKyNkZWZpbmUgVF9ERUxFVEVfVEVTVERBVEEociwgZCwgZWxlbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0XyMjZWxlbSo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gZWxlbSMjcy5yYmVnaW4oKTsgaXQgIT0gZWxlbSMjcy5yZW5kKCk7IGl0KyspIFwKKyAgICBkZWxldGUgKml0OworI2RlZmluZSBUX0RFQ0xfVEVTVERBVEEociwgZCwgZWxlbSkgc3RhdGljIHN0ZDo6dmVjdG9yPCA6OnRfIyNlbGVtKj4gZWxlbSMjczsKK0JPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9ERUNMX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisjdW5kZWYgVF9ERUNMX1RFU1REQVRBCisKK2Jvb2wgaGFzX2RhdGEgPSBmYWxzZTsKK3ZvaWQgY2xlYW51cCgpIHsKKyAgaWYgKGhhc19kYXRhKSB7CisgICAgaGFzX2RhdGEgPSBmYWxzZTsKKyAgICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfREVMRVRFX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgIH0KK30KKwordm9pZCBpbml0X3Byb2dyYW1zKCkgeworICBwcm9ncmFtcy5wdXNoX2JhY2sobmV3IHRfcHJvZ3JhbSgicHJvZyBwYXRoIiwgInByb2dfbmFtZSIpKTsKK30KKwordm9pZCBpbml0X2Jhc2VfdHlwZXMoKSB7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMCIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTEiLCA6OnRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTIiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0JPT0wpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUzIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JOCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTQiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kxNikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTUiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kzMikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTYiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0k2NCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTciLCA6OnRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkpOworfQorCit2b2lkIGluaXRfY29uc3RfdmFsdWVzKCkgeworICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2NvbnN0X3ZhbHVlKDQyKSk7CisgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfY29uc3RfdmFsdWUoImZvbyIpKTsKKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfZG91YmxlKDMuMTQxNSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9pZGVudGlmaWVyKCJiYXIiKTsKKyAgICB4LT5zZXRfZW51bShlbnVtc1swXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9tYXAoKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1swXSwgY29uc3RfdmFsdWVzWzFdKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1sxXSwgY29uc3RfdmFsdWVzWzBdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2xpc3QoKTsKKyAgICB4LT5hZGRfbGlzdChjb25zdF92YWx1ZXNbMF0pOworICAgIHgtPmFkZF9saXN0KGNvbnN0X3ZhbHVlc1sxXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorfQorCit2b2lkIGluaXRfY29uc3RzKCkgeworICAvLyBiYXNlX3R5cGUvZW51bSBpbmRleGVzIGZvciB0aGlzIGFuZCBvdGhlciB0ZXN0cyBhcmUgYXJiaXRyYXJ5CisgIGNvbnN0cy5wdXNoX2JhY2sobmV3IHRfY29uc3QoYmFzZV90eXBlc1syXSwgImFhYSIsIGNvbnN0X3ZhbHVlc1swXSkpOworICBjb25zdHMuYmFjaygpLT5zZXRfZG9jKCJzb2VtIGRvYyIpOworICBjb25zdHMucHVzaF9iYWNrKG5ldyB0X2NvbnN0KGJhc2VfdHlwZXNbM10sICJiYmIiLCBjb25zdF92YWx1ZXNbMV0pKTsKK30KKwordm9pZCBpbml0X2VudW1fdmFsdWVzKCkgeworICBlbnVtX3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfZW51bV92YWx1ZSgiVkFMMSIsIDExKSk7CisgIGVudW1fdmFsdWVzLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtX3ZhbHVlcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisKKyAgZW51bV92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2VudW1fdmFsdWUoIlZBTDIiLCAyMikpOworfQorCit2b2lkIGluaXRfZW51bXMoKSB7CisgIGVudW1zLnB1c2hfYmFjayhuZXcgdF9lbnVtKHByb2dyYW1zWzBdKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X25hbWUoImZvb28iKTsKKyAgZW51bXMuYmFjaygpLT5hcHBlbmQoZW51bV92YWx1ZXNbMF0pOworICBlbnVtcy5iYWNrKCktPmFwcGVuZChlbnVtX3ZhbHVlc1sxXSk7Cit9CisKK3ZvaWQgaW5pdF9saXN0cygpIHsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoZW51bXNbMF0pKTsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoYmFzZV90eXBlc1s1XSkpOworICBsaXN0cy5iYWNrKCktPnNldF9jcHBfbmFtZSgibGlzdF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfc2V0cygpIHsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGJhc2VfdHlwZXNbNF0pKTsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGVudW1zWzBdKSk7CisgIHNldHMuYmFjaygpLT5zZXRfY3BwX25hbWUoInNldF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfbWFwcygpIHsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNF0sIGJhc2VfdHlwZXNbMV0pKTsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNV0sIGVudW1zWzBdKSk7CisgIG1hcHMuYmFjaygpLT5zZXRfY3BwX25hbWUoIm1hcF9jcHBfbmFtZV8xIik7Cit9CisKK3ZvaWQgaW5pdF90eXBlZGVmcygpIHsKKyAgdHlwZWRlZnMucHVzaF9iYWNrKG5ldyB0X3R5cGVkZWYocHJvZ3JhbXNbMF0sIGJhc2VfdHlwZXNbM10sICJWQUwxIikpOworfQordm9pZCBpbml0X2ZpZWxkcygpIHsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzFdLCAiZjEiKSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZWZlcmVuY2UoZmFsc2UpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbMl0sICJmMiIsIDkpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlZmVyZW5jZSh0cnVlKTsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzNdLCAiZjMiLCAxMSkpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICBmaWVsZHMuYmFjaygpLT5zZXRfdmFsdWUoY29uc3RfdmFsdWVzWzBdKTsKK30KK3ZvaWQgaW5pdF9zdHJ1Y3RzKCkgeworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJzdHJ1Y3QxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAidW5pb24xIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5iYWNrKCktPnNldF91bmlvbih0cnVlKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAieGNlcHQxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+c2V0X3hjZXB0aW9uKHRydWUpOworfQordm9pZCBpbml0X2Z1bmN0aW9ucygpIHsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiZXJyczEiKSk7CisgIHRfc3RydWN0KiBlcnJvcnMgPSBzdHJ1Y3RzLmJhY2soKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiYXJnczEiKSk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gc3RydWN0cy5iYWNrKCk7CisgIGZ1bmN0aW9ucy5wdXNoX2JhY2sobmV3IHRfZnVuY3Rpb24oYmFzZV90eXBlc1swXSwgImZ1bmMxIiwgZXJyb3JzLCBhcmdsaXN0LCBmYWxzZSkpOworICBmdW5jdGlvbnMucHVzaF9iYWNrKG5ldyB0X2Z1bmN0aW9uKGJhc2VfdHlwZXNbMF0sICJmdW5jMiIsIGVycm9ycywgYXJnbGlzdCwgdHJ1ZSkpOworfQordm9pZCBpbml0X3NlcnZpY2VzKCkgeworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9kb2MoInNydjEgZG9jIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X25hbWUoInNydjEiKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzBdKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzFdKTsKKworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9uYW1lKCJzcnYyIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X2V4dGVuZHMoc2VydmljZXNbMF0pOworfQorCitzdGQ6OnZlY3Rvcjx0X3R5cGUqPiB0eXBlczsKK3ZvaWQgaW5pdF90eXBlcygpIHsKKyNkZWZpbmUgVF9DT1BZX1RZUEVTKHR5cGUpIHN0ZDo6Y29weSh0eXBlIyNzLmJlZ2luKCksIHR5cGUjI3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0eXBlcykpCisgIFRfQ09QWV9UWVBFUyhiYXNlX3R5cGUpOworICBUX0NPUFlfVFlQRVMoZW51bSk7CisgIFRfQ09QWV9UWVBFUyh0eXBlZGVmKTsKKyAgVF9DT1BZX1RZUEVTKHN0cnVjdCk7CisgIFRfQ09QWV9UWVBFUyhsaXN0KTsKKyAgVF9DT1BZX1RZUEVTKHNldCk7CisgIFRfQ09QWV9UWVBFUyhtYXApOworLy8gVF9DT1BZX1RZUEVTKHNlcnZpY2UpOworI3VuZGVmIFRfQ09QWV9UWVBFUworfQorCit2b2lkIGluaXQoKSB7CisgIGlmICghaGFzX2RhdGEpIHsKKyAgICBoYXNfZGF0YSA9IHRydWU7CisjZGVmaW5lIFRfSU5JVF9URVNUREFUQShyLCBkLCBlbGVtKSBpbml0XyMjZWxlbSMjcygpOworICAgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9JTklUX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgICAgaW5pdF90eXBlcygpOworI3VuZGVmIFRfSU5JVF9URVNUREFUQQorICB9Cit9Cit9CitzdHJ1Y3QgR2xvYmFsRml4dHVyZSB7CisgIH5HbG9iYWxGaXh0dXJlKCkgeyB0ZXN0X2RhdGE6OmNsZWFudXAoKTsgfQorfTsKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKQorI2VuZGlmCisKK3ZvaWQgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKSB7CisgIHBsdWdpbjo6VHlwZVJlZ2lzdHJ5IHJlZzsKKyAgcGx1Z2luX291dHB1dDo6Z2V0X2dsb2JhbF9jYWNoZShyZWcpOworICBwbHVnaW46OnNldF9nbG9iYWxfY2FjaGUocmVnKTsKKyAgcGx1Z2luX291dHB1dDo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJvdW5kX3RyaXAoVCogdCkgeworICB0eXBlbmFtZSBwbHVnaW46OlRvVHlwZTxUPjo6dHlwZSBwOworICBwbHVnaW46OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworICBwbHVnaW5fb3V0cHV0OjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcGx1Z2luX291dHB1dDo6Y29udmVydCh0LCBwKTsKKyAgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIHBsdWdpbjo6Y29udmVydChwKTsKK30KKwordm9pZCB0ZXN0X2Jhc2VfdHlwZSg6OnRfYmFzZV90eXBlKiBzdXQpIHsKKyAgcGx1Z2luOjp0X2Jhc2VfdHlwZSBwOworICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHN1dCwgcCk7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfYmFzZV90eXBlPiBzdXQyKHBsdWdpbjo6Y29udmVydChwKSk7CisKKyNkZWZpbmUgVEhSSUZUX0NIRUNLKHIsIGRhdGEsIGVsZW0pIEJPT1NUX1BQX0VYUEFORChCT09TVF9DSEVDS19FUVVBTChkYXRhIGVsZW0sIHN1dDItPmVsZW0pKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iaW5hcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmdfZW51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jhc2VfdHlwZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9jb25zdF92YWx1ZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X3R5cGUoKSwgc3V0Mi0+Z2V0X3R5cGUoKSk7CisgIHN3aXRjaCAoc3V0LT5nZXRfdHlwZSgpKSB7CisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfQ0FTRSh0eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6dHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfIyNuYW1lKCksIHN1dDItPmdldF8jI25hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfSU5URUdFUiwgaW50ZWdlcik7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0RPVUJMRSwgZG91YmxlKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfU1RSSU5HLCBzdHJpbmcpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9JREVOVElGSUVSLCBpZGVudGlmaWVyKTsKKyN1bmRlZiBUX0NPTlNUX1ZBTFVFX0NBU0UKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbWFwKCkuc2l6ZSgpLCBzdXQyLT5nZXRfbWFwKCkuc2l6ZSgpKTsKKyAgICB7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUsIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZT4gc3V0X3ZhbHVlczsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQtPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQtPmdldF9tYXAoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBzdXRfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlLCB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGU+IHN1dDJfdmFsdWVzOworICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dDItPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQyLT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgc3V0Ml92YWx1ZXNbaXQtPmZpcnN0LT5nZXRfdHlwZSgpXSA9IGl0LT5zZWNvbmQtPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPmZpcnN0LCBzdXQyX3ZhbHVlcy5iZWdpbigpLT5maXJzdCk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPnNlY29uZCwgc3V0Ml92YWx1ZXMuYmVnaW4oKS0+c2Vjb25kKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9saXN0KCkuc2l6ZSgpLCBzdXQyLT5nZXRfbGlzdCgpLnNpemUoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbGlzdCgpLmZyb250KCktPmdldF90eXBlKCksIHN1dDItPmdldF9saXN0KCkuZnJvbnQoKS0+Z2V0X3R5cGUoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHRlc3RfY29uc3QodF9jb25zdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfY29uc3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfZW51bV92YWx1ZSh0X2VudW1fdmFsdWUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2VudW1fdmFsdWU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDMsIChnZXRfbmFtZSgpLCBnZXRfdmFsdWUoKSwgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9lbnVtKHRfZW51bSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfZW51bT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9taW5fdmFsdWUoKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21heF92YWx1ZSgpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfdmFsdWUoMTEpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfbmFtZSgiVkFMMSIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2xpc3QodF9saXN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9saXN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9lbGVtX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9Cit2b2lkIHRlc3Rfc2V0KHRfc2V0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zZXQ+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2VsZW1fdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KK3ZvaWQgdGVzdF9tYXAodF9tYXAqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X21hcD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfa2V5X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFsX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9CisKK3ZvaWQgdGVzdF90eXBlZGVmKHRfdHlwZWRlZiogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfdHlwZWRlZj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3ltYm9saWMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mb3J3YXJkX3R5cGVkZWYoKSkpKQorfQorCit2b2lkIHRlc3RfdHlwZSh0X3R5cGUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3R5cGU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iYXNlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHlwZWRlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2VudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJ1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXJ2aWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKK30KKwordm9pZCB0ZXN0X2ZpZWxkKHRfZmllbGQqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2ZpZWxkPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9yZXEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2tleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmdldF92YWx1ZSgpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGlmIChzdXQtPmdldF90eXBlKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF90eXBlKCkpOworICB9Cit9Cit2b2lkIHRlc3Rfc3RydWN0KHRfc3RydWN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zdHJ1Y3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cnVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9mdW5jdGlvbj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goCisgICAgICBUSFJJRlRfQ0hFQ0ssCisgICAgICBzdXQtPiwKKyAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSwgaXNfb25ld2F5KCkpKSkKK30KK3ZvaWQgdGVzdF9zZXJ2aWNlKHRfc2VydmljZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc2VydmljZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMywgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X2Z1bmN0aW9ucygpLnNpemUoKSkpKQorICBpZiAoc3V0LT5nZXRfZXh0ZW5kcygpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcHJvZ3JhbSh0X3Byb2dyYW0qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3Byb2dyYW0+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywgc3V0LT4sIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMiwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSkpKQorfQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIHRlc3RfZGF0YTo6aW5pdCgpOworICB0ZXN0X3N1aXRlKiB0cyA9IEJPT1NUX1RFU1RfU1VJVEUoIlBsdWdpbkNvbnZlcnNpb25UZXN0Iik7CisKKyNkZWZpbmUgVF9URVNUX0NBU0UociwgZCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHMtPmFkZChCT09TVF9QQVJBTV9URVNUX0NBU0UodGVzdF8jI3R5cGUsIHRlc3RfZGF0YTo6dHlwZSMjcy5iZWdpbigpLCB0ZXN0X2RhdGE6OnR5cGUjI3MuZW5kKCkpKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX1RFU1RfQ0FTRSwgXywgVF9URVNUX1RZUEVTKQorICBUX1RFU1RfQ0FTRShfLCBfLCB0eXBlKQorI3VuZGVmIFRfVEVTVF9DQVNFCisgIHJldHVybiB0czsKK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hZGQoZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSk7CisgIHJldHVybiB0cnVlOworfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsIGFyZ2MsIGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKworY2xhc3MgTXlDcHBHZW5lcmF0b3IgOiBwdWJsaWMgR2VuZXJhdG9yUGx1Z2luIHsKKyAgdmlydHVhbCBpbnQgZ2VuZXJhdGUoOjp0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zKSB7CisgICAgdF9nZW5lcmF0b3IqIGdlbiA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICJjcHAiLCBwYXJzZWRfb3B0aW9ucywgIiIpOworICAgIGdlbi0+Z2VuZXJhdGVfcHJvZ3JhbSgpOworICAgIGRlbGV0ZSBnZW47CisgICAgcmV0dXJuIDA7CisgIH0KK307Cit9Cit9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6TXlDcHBHZW5lcmF0b3IgcDsKKyAgcmV0dXJuIHAuZXhlYyhhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjdjOTNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorIworIyBUaGlzIGZpbGUgcnVucyB0aGUgY29tcGlsZXIgdHdpY2UsIHVzaW5nIGEgcGx1Z2luIHRoYXQganVzdCBpbnZva2VzCisjIC9iaW4vY2F0LCBhbmQgY29tcGFyZXMgdGhlIG91dHB1dC4gIElmIEdlbmVyYXRvcklucHV0IGlzCisjIG5vbmRldGVybWluc2l0aWMsIHlvdSdkIGV4cGVjdCB0aGUgb3V0cHV0IHRvIGRpZmZlciBmcm9tIHJ1bi10by1ydW4uCisjIFNvIHRoaXMgdGVzdHMgdGhhdCBpbiBmYWN0LCB0aGUgb3V0cHV0IGlzIHN0YWJsZSBmcm9tIHJ1bi10by1ydW4uCitzZXQgLWUKK21rZGlyIC1wIGdlbi1iaW5jYXQKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtZ2VuIGJpbmNhdCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0ID4gZ2VuLWJpbmNhdC8xLnNlcgorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzIuc2VyCitkaWZmIC0tYmluYXJ5IGdlbi1iaW5jYXQvMS5zZXIgZ2VuLWJpbmNhdC8yLnNlcgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjEwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKKworcHJvamVjdCh0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3NldChUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUgorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLgorKQorCisjIGRvbid0IGdlbmVyYXRlIFpFUk9fQ0hFQ0sKK3NldChDTUFLRV9TVVBQUkVTU19SRUdFTkVSQVRJT04gdHJ1ZSkKKworY29uZmlndXJlX2ZpbGUoJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoL0ZJInN0ZGludC5oIikKKyAgICBlbmRpZihIQVZFX1NURElOVF9IKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoRkxFWCBSRVFVSVJFRCkKK2ZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKKworIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB0aHJpZnR5IGFuZCB0aHJpZnRsCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvKQorCisjIENyZWF0ZSBmbGV4IGFuZCBiaXNvbiBmaWxlcyBhbmQgYnVpbGQgdGhlIGxpYiBwYXJzZSBzdGF0aWMgbGlicmFyeQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnR5Lnl5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYykKK0ZMRVhfVEFSR0VUKHRocmlmdGwgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBUaHJpZnQgY29tcGlsZXIgdGVzdHMKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHMKKykKKworIyB5b3UgY2FuIGFkZCBzb21lIGZpbGVzIG1hbnVhbGx5IHRoZXJlIAorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUworICAgICMgdGVzdHMgZmlsZSB0byBhdm9pZCBtYWluIGluIGV2ZXJ5IHRlc3QgZmlsZQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0c19tYWluLmNjCispCisKKyMgc2V0IHZhcmlhYmxlIGZvciB0ZXN0cyBzb3VyY2VzIC0gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgIyB3ZSB1c2UgbG9nZ2luZyBpbnN0ZWFkIG9mIG1haW4gdG8gYXZvaWQgYnJlYWtpbmcgY29tcGlsbGF0aW9uICgyIG1haW4gdikKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgIiR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGZpbGUoR0xPQiB0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyouYyoiCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi50aHJpZnQiCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgVGhlIGZvbGxvd2luZyBjb21waWxlciB3aXRoIHVuaXQgdGVzdHMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKK1RIUklGVF9BRERfQ09NUElMRVIoY19nbGliICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIHdpdGggR2xpYiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihhczMgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEFjdGlvblNjcmlwdCAzIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNvY29hICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgT2JqZWN0aXZlLUMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihvY2FtbCAgICJFbmFibGUgY29tcGlsZXIgZm9yIE9DYW1sIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4c2QgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhTRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihodG1sICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhUTUwgRG9jdW1lbnRhdGlvbiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanNvbiAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKU09OIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGQgICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihndiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdyYXBoVml6IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVzdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT0ZGKQorCisjIFRocmlmdCBpcyBsb29raW5nIGZvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5CisjIHdlIGFsc28gYWRkIHRoZSBjdXJyZW50IGJpbmFyeSBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBmaWxlcworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jYXRjaCkKKworYWRkX2xpYnJhcnkodGhyaWZ0X2NvbXBpbGVyICR7dGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVN9KQorCisjbGluayBwYXJzZSBsaWIgdG8gdGhyaWZ0X2NvbXBpbGVyIGxpYgordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlciBwYXJzZSkKKworIyBhZGQgdGVzdHMgZXhlY3V0YWJsZQorYWRkX2V4ZWN1dGFibGUodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTfSAke3RocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTfSkKKworIyBpZiBnZW5lcmF0ZXMgZm9yIFZpc3VhbCBTdHVkaW8gc2V0IHRocmlmdF9jb21waWxlcl90ZXN0cyBhcyBkZWZhdWx0IHByb2plY3QKK2lmKE1TVkMpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVFkgVlNfU1RBUlRVUF9QUk9KRUNUIHRocmlmdF9jb21waWxlcl90ZXN0cykKK2VuZGlmKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSBiaW4vKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHRocmlmdF9jb21waWxlcl90ZXN0cykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyB0aHJpZnRfY29tcGlsZXIpCisKK2VuYWJsZV90ZXN0aW5nKCkKK2FkZF90ZXN0KE5BTUUgVGhyaWZ0VGVzdHMgQ09NTUFORCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSw4OCBAQAorIyBCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi1jb21waWxlci10ZXN0cy11c2luZy1jbWFrZSkKKyAgICAtIFtHZW5lcmFsIGluZm9ybWF0aW9uXSgjZ2VuZXJhbC1pbmZvcm1hdGlvbikKKyAgICAtIFtIb3cgdG8gYWRkIHlvdXIgdGVzdHNdKCNob3ctdG8tYWRkLXlvdXItdGVzdHMpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtc10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24tdW5peC1saWtlLXN5c3RlbXMpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2VdKCNidWlsZC1hbmQtcnVuLXRlc3Qtd2l0aC1jbWFrZSkKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3NdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzXSgjZ2VuZXJhdGlvbi1vZi12cy1wcm9qZWN0LXdpdGgtY21ha2UtYnVpbGQtYW5kLXJ1bi1vbi13aW5kb3dzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEdlbmVyYWwgaW5mb3JtYXRpb24gCisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCitBdCBjdXJyZW50IG1vbWVudCB0aGVzZSB0ZXN0cyB1c2UgZnJlZSBDYXRjaCBsaWJyYXJ5IChodHRwczovL2dpdGh1Yi5jb20vY2F0Y2hvcmcvQ2F0Y2gyL3RyZWUvQ2F0Y2gxLngpIGZvciBlYXN5IHRlc3QgY3JlYXRpb24gYW5kIHVzYWdlLgorRGVjaXNpb24gdG8gdXNlIGl0IHdhcyBiZWNhdXNlIG9mIHNpbXBsaWNpdHksIGVhc3kgdXNhZ2UsIG9uZSBoZWFkZXIgZmlsZSB0byB1c2UsIHN0YWJsZSBjb21tdW5pdHkgYW5kIGdyb3dpbmcgaW50ZXJlc3QgIChodHRwczovL2NwcC5saWJodW50LmNvbS9wcm9qZWN0L2dvb2dsZXRlc3QtZ29vZ2xlL3ZzL2NhdGNoP3JlbD1jbXAtY21wKQorCitBbHNvLCBtYXliZSwgbGF0ZXIgaXQgd2lsbCBiZSBtaWdyYXRlZCB0byBDYXRjaDIgKGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaCkgLSBkZXBlbmRzIG9uIG5lZWQgdG8gc3VwcG9ydCBsZWdhY3kgY29tcGlsZXJzIChjKys5OCkKKworIyMgSG93IHRvIGFkZCB5b3VyIHRlc3RzCisKKy0gT3BlbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gU2V0ICoqT24qKiB0byBjYWxsIG9mICoqVEhSSUZUX0FERF9DT01QSUxFUioqIGZvciB5b3VyIGxhbmd1YWdlCisKK2BgYCBjbWFrZSAKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorYGBgCisKKy0gQ3JlYXRlIGZvbGRlciB3aXRoIG5hbWUgc3BlY2lmaWVkIGluIGxpc3Qgb2YgbGFuZ3VhZ2VzIGluICoqQ01ha2VMaXN0cy50eHQqKgorLSBDcmVhdGUgdGVzdHMgaW4gZm9sZGVyIGZvciB5b3VyIGxhbmd1YWdlICh3aXRoIGV4dGVuc2lvbnMgbGlrZSAqLmMqIC0gY2MsIGNwcCwgZXRjKQorICAtIERvbid0IGZvcmdldCB0byBhZGQgaW5jbHVkZSBvZiBjYXRjaC5ocHAgaW4geW91ciB0ZXN0IGZpbGUKKyAgYGBgIEMKKyAgI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyAgYGBgCisKKy0gSWYgeW91IG5lZWQgLSBhZGQgZmlsZXMgbWFudWFsbHkgdG8gKip0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMqKiBpbiAqKkNNYWtlTGlzdHMudHh0Kiogc2ltaWxhciB0byAKKworYGBgIGNtYWtlCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKK2BgYAorCistIFJ1biAqKmNtYWtlKiogd2l0aCBhcmd1bWVudHMgZm9yIHlvdXIgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIAorLSBFbmpveQorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKworIyMjIEJ1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlCisKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorLSBJbnN0YWxsIFZTMjAxNyBDb21tdW5pdHkgRWRpdGlvbiAtIDxodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL3doYXRzbmV3Lz4gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpCisKKyMjIyBHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3RvcnkgKGVuc3VyZSB0aGF0IFZTIGluc3RhbGxlZCk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMKK2NkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKQEAgLTAsMCArMSwxMTUwOCBAQAorLyoKKyAqICBDYXRjaCB2MS45LjQKKyAqICBHZW5lcmF0ZWQ6IDIwMTctMDUtMTYgMTM6NTE6NTUuNTA2NTE5CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgZmlsZSBoYXMgYmVlbiBtZXJnZWQgZnJvbSBtdWx0aXBsZSBoZWFkZXJzLiBQbGVhc2UgZG9uJ3QgZWRpdCBpdCBkaXJlY3RseQorICogIENvcHlyaWdodCAoYykgMjAxMiBUd28gQmx1ZSBDdWJlcyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAqICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworI2lmbmRlZiBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3N1cHByZXNzX3dhcm5pbmdzLmgKKworI2lmZGVmIF9fY2xhbmdfXworIyAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICAgICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDE2MSAxNjgyKQorIyAgIGVsc2UgLy8gX19JQ0MKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdnbG9iYWwtY29uc3RydWN0b3JzIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjOTktZXh0ZW5zaW9ucyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0IgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdC1wZWRhbnRpYyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzd2l0Y2gtZW51bSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IgorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFyZW50aGVzZXMiCisKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfTUFJTikgfHwgZGVmaW5lZChDQVRDSF9DT05GSUdfUlVOTkVSKQorIyAgZGVmaW5lIENBVENIX0lNUEwKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorIyAgaWZuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU4KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21waWxlcl9jYXBhYmlsaXRpZXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NUElMRVJfQ0FQQUJJTElUSUVTX0hQUF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNIDogc3RkOjppc19lbnVtIGlzIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSA6IHN0ZDo6dHVwbGUgaXMgc3VwcG9ydGVkCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HIDogaXMgbG9uZyBsb25nIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSA6IGlzIHN0ZDo6c2h1ZmZsZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMgOiBhcmUgdHlwZV90cmFpdHMgYW5kIGVuYWJsZV9pZiBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ09VTlRFUiA6IGlzIHRoZSBfX0NPVU5URVJfXyBtYWNybyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggOiBpcyBXaW5kb3dzIFNFSCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyA6IGFyZSBQT1NJWCBzaWduYWxzIHN1cHBvcnRlZD8KKy8vICoqKioqKioqKioqKioqKioKKy8vIE5vdGUgdG8gbWFpbnRhaW5lcnM6IGlmIG5ldyB0b2dnbGVzIGFyZSBhZGRlZCBwbGVhc2UgZG9jdW1lbnQgdGhlbQorLy8gaW4gY29uZmlndXJhdGlvbi5tZCwgdG9vCisvLyAqKioqKioqKioqKioqKioqCisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENBVENIX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTRfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBfX2NsYW5nX18KKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2V4aXQtdGltZS1kZXN0cnVjdG9yc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKworIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdwYXJlbnRoZXNlc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorIyAgIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBvcnQgZnVsbCBQT1NJWCBzaWduYWxzCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fUU5YX18pCisKKyMgICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTCisjICAgZW5kaWYKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDeWd3aW4KKyNpZmRlZiBfX0NZR1dJTl9fCisKKy8vIFJlcXVpcmVkIGZvciBzb21lIHZlcnNpb25zIG9mIEN5Z3dpbiB0byBkZWNsYXJlIGdldHRpbWVvZmRheQorLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM2OTAxODAzL2dldHRpbWVvZmRheS1ub3QtZGVjbGFyZWQtaW4tdGhpcy1zY29wZS1jeWd3aW4KKyMgICBkZWZpbmUgX0JTRF9TT1VSQ0UKKworI2VuZGlmIC8vIF9fQ1lHV0lOX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJvcmxhbmQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKworI2VuZGlmIC8vIF9fQk9STEFORENfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRURHCisjaWZkZWYgX19FREdfVkVSU0lPTl9fCisKKyNlbmRpZiAvLyBfX0VER19WRVJTSU9OX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERpZ2l0YWwgTWFycworI2lmZGVmIF9fRE1DX18KKworI2VuZGlmIC8vIF9fRE1DX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyMgICBpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBVc2UgdmFyaWFkaWMgbWFjcm9zIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVtCisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID4gMTQwMCAmJiAhZGVmaW5lZCBfX0VER0VfXykgfHwgXAorICAgICggZGVmaW5lZCBfX1dBVkVfXyAmJiBfX1dBVkVfSEFTX1ZBUklBRElDUyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMyApIHx8IFwKKyAgICAoICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisKKyNlbmRpZgorCisvLyBVc2UgX19DT1VOVEVSX18gaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0CisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEzMDAgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICAmJiBfX0dOVUNfXyA+PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPj0gMyApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKy8vIFVzZSBvZiBfX0NPVU5URVJfXyBpcyBzdXBwcmVzc2VkIGlmIF9fSkVUQlJBSU5TX0lERV9fIGlzICNkZWZpbmVkIChtZWFuaW5nIHdlJ3JlIGJlaW5nIHBhcnNlZCBieSBhIEpldEJyYWlucyBJREUgZm9yCisvLyBhbmFseXRpY3MpIGJlY2F1c2UsIGF0IHRpbWUgb2Ygd3JpdGluZywgX19DT1VOVEVSX18gaXMgbm90IHByb3Blcmx5IGhhbmRsZWQgYnkgaXQuCisvLyBUaGlzIGRvZXMgbm90IGFmZmVjdCBjb21waWxhdGlvbgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoX19KRVRCUkFJTlNfSURFX18pCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DT1VOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNlbmRpZgorIyBpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorI2VuZGlmCisvLyBUaGlzIGlzIHNldCBieSBkZWZhdWx0LCBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHVuaXggY29tcGlsZXJzIGFyZSBwb3NpeC1zaWduYWwtY29tcGF0aWJsZSBieSBkZWZhdWx0LgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX05PRVhDRVBUKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBudWxscHRyCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkgbmFtZSMjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKQorI2lmZGVmIENBVENIX0NPTkZJR19DT1VOVEVSCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0NPVU5URVJfXyApCisjZWxzZQorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19MSU5FX18gKQorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApICNleHByCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWSggZXhwciApIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBDYXNlU2Vuc2l0aXZlIHsgZW51bSBDaG9pY2UgeworICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIE5vbkNvcHlhYmxlIHsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlICYmICkgICAgICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRlbGV0ZTsKKyNlbHNlCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgaW5mbyApOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApOworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE5vbkNvcHlhYmxlKCkge30KKyAgICAgICAgdmlydHVhbCB+Tm9uQ29weWFibGUoKTsKKyAgICB9OworCisgICAgY2xhc3MgU2FmZUJvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB2b2lkIChTYWZlQm9vbDo6KnR5cGUpKCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIHR5cGUgbWFrZVNhZmUoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAmU2FmZUJvb2w6OnRydWVWYWx1ZSA6IDA7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHRydWVWYWx1ZSgpIGNvbnN0IHt9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsKCBDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsVmFsdWVzKCBBc3NvY2lhdGl2ZUNvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICk7CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApOworICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKTsKKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICk7CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApOworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICk7CisKKyAgICBzdHJ1Y3QgcGx1cmFsaXNlIHsKKyAgICAgICAgcGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICk7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKTsKKworICAgICAgICBzdGQ6OnNpemVfdCBtX2NvdW50OworICAgICAgICBzdGQ6OnN0cmluZyBtX2xhYmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgU291cmNlTGluZUluZm8geworCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCk7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTb3VyY2VMaW5lSW5mbyhTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIpICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKworICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOworICAgICAgICBzdGQ6OnNpemVfdCBsaW5lOworICAgIH07CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsKKworICAgIC8vIFRoaXMgaXMganVzdCBoZXJlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggbWFjcm8gY29uc3RhbnRzIGFuZCBib29sZWFuIGxpdGVyYWxzCisgICAgaW5saW5lIGJvb2wgaXNUcnVlKCBib29sIHZhbHVlICl7IHJldHVybiB2YWx1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c1RydWUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzRmFsc2UoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICk7CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCk7CisKKyAgICAvLyBVc2UgdGhpcyBpbiB2YXJpYWRpYyBzdHJlYW1pbmcgbWFjcm9zIHRvIGFsbG93CisgICAgLy8gICAgPj4gK1N0cmVhbUVuZFN0b3AKKyAgICAvLyBhcyB3ZWxsIGFzCisgICAgLy8gICAgPj4gc3R1ZmYgK1N0cmVhbUVuZFN0b3AKKyAgICBzdHJ1Y3QgU3RyZWFtRW5kU3RvcCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgY29uc3QmIG9wZXJhdG9yICsgKCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyA6OkNhdGNoOjpTb3VyY2VMaW5lSW5mbyggX19GSUxFX18sIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggX19MSU5FX18gKSApCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0VSUk9SKCBtc2cgKSA6OkNhdGNoOjp0aHJvd0xvZ2ljRXJyb3IoIG1zZywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIH5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpIENBVENIX05PRVhDRVBUIHt9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3doYXQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIG1fbGluZUluZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgQ0FUQ0hfTk9UX0lNUExFTUVOVEVEIHRocm93IENhdGNoOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29udGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfZ2VuZXJhdG9ycy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0dFTkVSQVRPUlNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElHZW5lcmF0b3JJbmZvIHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvckluZm8oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdCB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JzRm9yVGVzdCgpOworCisgICAgICAgIHZpcnR1YWwgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcHRyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUFRSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBpbnRydXNpdmUgcmVmZXJlbmNlIGNvdW50aW5nIHNtYXJ0IHBvaW50ZXIuCisgICAgLy8gVCBtdXN0IGltcGxlbWVudCBhZGRSZWYoKSBhbmQgcmVsZWFzZSgpIG1ldGhvZHMKKyAgICAvLyB0eXBpY2FsbHkgaW1wbGVtZW50aW5nIHRoZSBJU2hhcmVkIGludGVyZmFjZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUHRyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFB0cigpIDogbV9wKCBDQVRDSF9OVUxMICl7fQorICAgICAgICBQdHIoIFQqIHAgKSA6IG1fcCggcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICBQdHIoIFB0ciBjb25zdCYgb3RoZXIgKSA6IG1fcCggb3RoZXIubV9wICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIH5QdHIoKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1fcCA9IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggVCogcCApeworICAgICAgICAgICAgUHRyIHRlbXAoIHAgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBQdHIgY29uc3QmIG90aGVyICl7CisgICAgICAgICAgICBQdHIgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN3YXAoIFB0ciYgb3RoZXIgKSB7IHN0ZDo6c3dhcCggbV9wLCBvdGhlci5tX3AgKTsgfQorICAgICAgICBUKiBnZXQoKSBjb25zdHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3A7IH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbV9wID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7IHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIG1fcCAhPSBDQVRDSF9OVUxMICk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQqIG1fcDsKKyAgICB9OworCisgICAgc3RydWN0IElTaGFyZWQgOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHZpcnR1YWwgfklTaGFyZWQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBJU2hhcmVkPgorICAgIHN0cnVjdCBTaGFyZWRJbXBsIDogVCB7CisKKyAgICAgICAgU2hhcmVkSW1wbCgpIDogbV9yYyggMCApe30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgeworICAgICAgICAgICAgKyttX3JjOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIC0tbV9yYyA9PSAwICkKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgdW5zaWduZWQgaW50IG1fcmM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgU3RyZWFtOworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKKyAgICBzdHJ1Y3QgSVJ1bm5lcjsKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0OworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JQ29udGV4dCgpOworCisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVDb250ZXh0IDogSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlQ29udGV4dCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSA9IDA7CisgICAgfTsKKworICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpOworICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpOworICAgIFN0cmVhbSBjcmVhdGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJlYW1OYW1lICk7CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RFU1RDQVNFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElUZXN0Q2FzZSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZSgpOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZVJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK2NsYXNzIE1ldGhvZFRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKK3B1YmxpYzoKKyAgICBNZXRob2RUZXN0Q2FzZSggdm9pZCAoQzo6Km1ldGhvZCkoKSApIDogbV9tZXRob2QoIG1ldGhvZCApIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICBDIG9iajsKKyAgICAgICAgKG9iai4qbV9tZXRob2QpKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZpcnR1YWwgfk1ldGhvZFRlc3RDYXNlKCkge30KKworICAgIHZvaWQgKEM6OiptX21ldGhvZCkoKTsKK307CisKK3R5cGVkZWYgdm9pZCgqVGVzdEZ1bmN0aW9uKSgpOworCitzdHJ1Y3QgTmFtZUFuZERlc2MgeworICAgIE5hbWVBbmREZXNjKCBjb25zdCBjaGFyKiBfbmFtZSA9ICIiLCBjb25zdCBjaGFyKiBfZGVzY3JpcHRpb249ICIiICkKKyAgICA6IG5hbWUoIF9uYW1lICksIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKQorICAgIHt9CisKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworc3RydWN0IEF1dG9SZWcgeworCisgICAgQXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIHZvaWQgKEM6OiptZXRob2QpKCksCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIG5ldyBNZXRob2RUZXN0Q2FzZTxDPiggbWV0aG9kICksCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgICAgIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgfkF1dG9SZWcoKTsKKworcHJpdmF0ZToKKyAgICBBdXRvUmVnKCBBdXRvUmVnIGNvbnN0JiApOworICAgIHZvaWQgb3BlcmF0b3I9ICggQXV0b1JlZyBjb25zdCYgKTsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgLi4uICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdE5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3ROYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2Vsc2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgfVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggTmFtZSwgRGVzYyApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBOYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3RDYXNlTmFtZSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0Q2FzZU5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0Q2FzZU5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggVGVzdE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3RDYXNlTmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NhcHR1cmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DQVBUVVJFX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X3R5cGUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX1RZUEVfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVzdWx0V2FzOjpPZlR5cGUgZW51bQorICAgIHN0cnVjdCBSZXN1bHRXYXMgeyBlbnVtIE9mVHlwZSB7CisgICAgICAgIFVua25vd24gPSAtMSwKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBJbmZvID0gMSwKKyAgICAgICAgV2FybmluZyA9IDIsCisKKyAgICAgICAgRmFpbHVyZUJpdCA9IDB4MTAsCisKKyAgICAgICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAxLAorICAgICAgICBFeHBsaWNpdEZhaWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKKworICAgICAgICBFeGNlcHRpb24gPSAweDEwMCB8IEZhaWx1cmVCaXQsCisKKyAgICAgICAgVGhyZXdFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAxLAorICAgICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMiwKKworICAgICAgICBGYXRhbEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0CisKKyAgICB9OyB9OworCisgICAgaW5saW5lIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6RmFpbHVyZUJpdCApID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIGlzSnVzdEluZm8oIGludCBmbGFncyApIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IFJlc3VsdFdhczo6SW5mbzsKKyAgICB9CisKKyAgICAvLyBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgZW51bQorICAgIHN0cnVjdCBSZXN1bHREaXNwb3NpdGlvbiB7IGVudW0gRmxhZ3MgeworICAgICAgICBOb3JtYWwgPSAweDAxLAorCisgICAgICAgIENvbnRpbnVlT25GYWlsdXJlID0gMHgwMiwgICAvLyBGYWlsdXJlcyBmYWlsIHRlc3QsIGJ1dCBleGVjdXRpb24gY29udGludWVzCisgICAgICAgIEZhbHNlVGVzdCA9IDB4MDQsICAgICAgICAgICAvLyBQcmVmaXggZXhwcmVzc2lvbiB3aXRoICEKKyAgICAgICAgU3VwcHJlc3NGYWlsID0gMHgwOCAgICAgICAgIC8vIEZhaWx1cmVzIGFyZSByZXBvcnRlZCBidXQgZG8gbm90IGZhaWwgdGhlIHRlc3QKKyAgICB9OyB9OworCisgICAgaW5saW5lIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGxocywgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0PGludD4oIGxocyApIHwgc3RhdGljX2Nhc3Q8aW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBzaG91bGRDb250aW51ZU9uRmFpbHVyZSggaW50IGZsYWdzICkgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0ZhbHNlVGVzdCggaW50IGZsYWdzICkgICAgICAgICAgICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbjsKKworICAgIHN0cnVjdCBEZWNvbXBvc2VkRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgdmlydHVhbCB+RGVjb21wb3NlZEV4cHJlc3Npb24oKSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgPSAwOworCisgICAgICAgIC8vIE9ubHkgc2ltcGxlIGJpbmFyeSBjb21wYXJpc29ucyBjYW4gYmUgZGVjb21wb3NlZC4KKyAgICAgICAgLy8gSWYgbW9yZSBjb21wbGV4IGNoZWNrIGlzIHJlcXVpcmVkIHRoZW4gd3JhcCBzdWItZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJiYgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIHx8ICggVCBjb25zdCYgKTsKKworCXByaXZhdGU6CisJCURlY29tcG9zZWRFeHByZXNzaW9uJiBvcGVyYXRvciA9IChEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbworICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbygpIHt9CisgICAgICAgIEFzc2VydGlvbkluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbjsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblJlc3VsdERhdGEKKyAgICB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEoKSA6IGRlY29tcG9zZWRFeHByZXNzaW9uKCBDQVRDSF9OVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVzdWx0VHlwZSggUmVzdWx0V2FzOjpVbmtub3duICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbmVnYXRlZCggZmFsc2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXJlbnRoZXNpemVkKCBmYWxzZSApIHt9CisKKyAgICAgICAgdm9pZCBuZWdhdGUoIGJvb2wgcGFyZW50aGVzaXplICkgeworICAgICAgICAgICAgbmVnYXRlZCA9ICFuZWdhdGVkOworICAgICAgICAgICAgcGFyZW50aGVzaXplZCA9IHBhcmVudGhlc2l6ZTsKKyAgICAgICAgICAgIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6T2sgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZCApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIGRlY29tcG9zZWRFeHByZXNzaW9uICE9IENBVENIX05VTEwgKSB7CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24tPnJlY29uc3RydWN0RXhwcmVzc2lvbiggcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50aGVzaXplZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnKCcgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uYXBwZW5kKCAxLCAnKScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG5lZ2F0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJyEnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QqIGRlY29tcG9zZWRFeHByZXNzaW9uOworICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlOworICAgICAgICBib29sIG5lZ2F0ZWQ7CisgICAgICAgIGJvb2wgcGFyZW50aGVzaXplZDsKKyAgICB9OworCisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFzc2VydGlvblJlc3VsdCgpOworICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKTsKKyAgICAgICAgfkFzc2VydGlvblJlc3VsdCgpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBib29sIGlzT2soKSBjb25zdDsKKyAgICAgICAgYm9vbCBzdWNjZWVkZWQoKSBjb25zdDsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgZ2V0UmVzdWx0VHlwZSgpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gZ2V0U291cmNlSW5mbygpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2luZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9yZXN1bHREYXRhOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgbmFtZXNwYWNlIEltcGwgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFsbE9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbnlPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoTm90T2Y7CisKKyAgICAgICAgY2xhc3MgTWF0Y2hlclVudHlwZWRCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIG1fY2FjaGVkVG9TdHJpbmcuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHZpcnR1YWwgfk1hdGNoZXJVbnR5cGVkQmFzZSgpOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIE1hdGNoZXJVbnR5cGVkQmFzZSYgb3BlcmF0b3IgPSAoIE1hdGNoZXJVbnR5cGVkQmFzZSBjb25zdCYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZCB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQgY29uc3QmIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHRyVD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2Q8UHRyVCo+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggUHRyVCogYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUID0gT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJCYXNlIDogTWF0Y2hlclVudHlwZWRCYXNlLCBNYXRjaGVyTWV0aG9kPE9iamVjdFQ+IHsKKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAhICgpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFsbE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8QXJnVD4mIG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQW55T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBvciAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbnlPZjxBcmdUPiYgb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICBNYXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSA6IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRjaGVyICkge30KKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtX3VuZGVybHlpbmdNYXRjaGVyLm1hdGNoKCBhcmcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCAiICsgbV91bmRlcmx5aW5nTWF0Y2hlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG1fdW5kZXJseWluZ01hdGNoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4oKSAmJiAqdGhpcyAmJiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFueU9mPENvbXBhcmF0b3JUPigpIHx8ICp0aGlzIHx8IG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICEgKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+KCAqdGhpcyApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisgICAgLy8gLSBkZXByZWNhdGVkOiBwcmVmZXIgfHwsICYmIGFuZCAhCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hOb3RPZjxUPiBOb3QoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoTm90T2Y8VD4oIHVuZGVybHlpbmdNYXRjaGVyICk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yICYmIG0zOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMiB8fCBtMzsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKK3VzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKK3VzaW5nIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUZXN0RmFpbHVyZUV4Y2VwdGlvbnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgRXhwcmVzc2lvbkxoczsKKworICAgIHN0cnVjdCBDb3B5YWJsZVN0cmVhbSB7CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCkge30KKyAgICAgICAgQ29weWFibGVTdHJlYW0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29weWFibGVTdHJlYW0mIG9wZXJhdG9yPSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzLnN0cihzdGQ6OnN0cmluZygpKTsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICB9OworCisgICAgY2xhc3MgUmVzdWx0QnVpbGRlciA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CisgICAgcHVibGljOgorICAgICAgICBSZXN1bHRCdWlsZGVyKCAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnID0gIiIgKTsKKyAgICAgICAgflJlc3VsdEJ1aWxkZXIoKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKTsKKyAgICAgICAgRXhwcmVzc2lvbkxoczxib29sPiBvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBSZXN1bHRCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICk7CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICk7CisKKyAgICAgICAgdm9pZCBlbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCkgY29uc3Q7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdDsKKworICAgICAgICB2b2lkIHVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uID0gUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICB2b2lkIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApOworICAgICAgICB2b2lkIGhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKTsKKyAgICAgICAgdm9pZCByZWFjdCgpOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdDsKKyAgICAgICAgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgICAgICB2b2lkIGNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApOworCisgICAgICAgIHZvaWQgc2V0RXhjZXB0aW9uR3VhcmQoKTsKKyAgICAgICAgdm9pZCB1bnNldEV4Y2VwdGlvbkd1YXJkKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1fYXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX2RhdGE7CisgICAgICAgIENvcHlhYmxlU3RyZWFtIG1fc3RyZWFtOworCisgICAgICAgIGJvb2wgbV9zaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG1fc2hvdWxkVGhyb3c7CisgICAgICAgIGJvb2wgbV9ndWFyZEV4Y2VwdGlvbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBJbmNsdWRlIGFmdGVyIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5OgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4cHJlc3Npb25fbGhzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhQUkVTU0lPTl9MSFNfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ldmFsdWF0ZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VWQUxVQVRFX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM4OSkgLy8gJz09JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMxMikgLy8gQ29udmVydGluZyBpbnQgdG8gVCogdXNpbmcgcmVpbnRlcnByZXRfY2FzdCAoaXNzdWUgb24geDY0IHBsYXRmb3JtKQorI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIEludGVybmFsIHsKKworICAgIGVudW0gT3BlcmF0b3IgeworICAgICAgICBJc0VxdWFsVG8sCisgICAgICAgIElzTm90RXF1YWxUbywKKyAgICAgICAgSXNMZXNzVGhhbiwKKyAgICAgICAgSXNHcmVhdGVyVGhhbiwKKyAgICAgICAgSXNMZXNzVGhhbk9yRXF1YWxUbywKKyAgICAgICAgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIqZXJyb3IqIjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzRXF1YWxUbz4gICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj09IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTm90RXF1YWxUbz4gICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiE9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW4+ICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjwiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbj4gICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuT3JFcXVhbFRvPiAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPnsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+PSI7IH0gfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIFQmIG9wQ2FzdChUIGNvbnN0JiB0KSB7IHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsgfQorCisvLyBudWxscHRyX3Qgc3VwcG9ydCBiYXNlZCBvbiBwdWxsIHJlcXVlc3QgIzE1NCBmcm9tIEtvbnN0YW50aW4gQmF1bWFubgorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgaW5saW5lIHN0ZDo6bnVsbHB0cl90IG9wQ2FzdChzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKKyAgICAvLyBTbyB0aGUgY29tcGFyZSBvdmVybG9hZHMgY2FuIGJlIG9wZXJhdG9yIGFnbm9zdGljIHdlIGNvbnZleSB0aGUgb3BlcmF0b3IgYXMgYSB0ZW1wbGF0ZQorICAgIC8vIGVudW0sIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lhbGlzZSBhbiBFdmFsdWF0b3IgZm9yIGRvaW5nIHRoZSBjb21wYXJpc29uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgT3BlcmF0b3IgT3A+CisgICAgY2xhc3MgRXZhbHVhdG9ye307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocykgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPT0gIG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc05vdEVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSAhPSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDwgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPj0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGFwcGx5RXZhbHVhdG9yKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cyB1cyB0byBzcGVjaWFsaXNlIGZvciBpbnRlZ2VyIHR5cGVzCisgICAgLy8gdG8gYXZvaWQgc2lnbmVkLyB1bnNpZ25lZCB3YXJuaW5ncworCisgICAgLy8gImJhc2UiIG92ZXJsb2FkCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGNvbXBhcmUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gaW50CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gbG9uZworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBpbnQgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gaW50ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggaW50IGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgLy8gbG9uZyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nIHRvIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIC8vIHBvaW50ZXIgdG8gbnVsbHB0cl90ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG51bGxwdHIpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggc3RkOjpudWxscHRyX3QsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIG51bGxwdHIsIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIHN0ZDo6bnVsbHB0cl90ICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCBudWxscHRyICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBJbnRlcm5hbAorfSAvLyBlbmQgb2YgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb2JqY19hcmMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0FSQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpZmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCisjZWxzZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCAwCisjZW5kaWYKKwordm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApOworaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApIHsKKyAgICBbb2JqIHJlbGVhc2VdOworfQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVECisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcKKyNlbHNlCitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqICl7fQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYXJjLXBlcmZvcm1TZWxlY3Rvci1sZWFrcyIKKyNlbmRpZgorICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIF9fdW5zYWZlX3VucmV0YWluZWQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORyBfX3N0cm9uZworI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworLy8gV2h5IHdlJ3JlIGhlcmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICk7CisKKy8vIEJ1aWx0IGluIG92ZXJsb2FkcworCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKTsKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKTsKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApOworI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKTsKKyNlbmRpZgorCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZzsKKworICNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU1RSRUFNX0lOU0VSVEFCTEVfQ0hFQ0spCisgICAgc3RydWN0IEJvcmdUeXBlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQm9yZ1R5cGUoIFQgY29uc3QmICk7CisgICAgfTsKKworICAgIHN0cnVjdCBUcnVlVHlwZSB7IGNoYXIgc2l6ZXJbMV07IH07CisgICAgc3RydWN0IEZhbHNlVHlwZSB7IGNoYXIgc2l6ZXJbMl07IH07CisKKyAgICBUcnVlVHlwZSYgdGVzdFN0cmVhbWFibGUoIHN0ZDo6b3N0cmVhbSYgKTsKKyAgICBGYWxzZVR5cGUgdGVzdFN0cmVhbWFibGUoIEZhbHNlVHlwZSApOworCisgICAgRmFsc2VUeXBlIG9wZXJhdG9yPDwoIHN0ZDo6b3N0cmVhbSBjb25zdCYsIEJvcmdUeXBlIGNvbnN0JiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSAmczsKKyAgICAgICAgc3RhdGljIFQgIGNvbnN0JnQ7CisgICAgICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZiggdGVzdFN0cmVhbWFibGUocyA8PCB0KSApID09IHNpemVvZiggVHJ1ZVR5cGUgKSB9OworICAgIH07CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU1MsIHR5cGVuYW1lIFRUPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KGludCkKKyAgICAgICAgLT4gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxTUyY+KCkgPDwgc3RkOjpkZWNsdmFsPFRUPigpLCBzdGQ6OnRydWVfdHlwZSgpICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KC4uLikgLT4gc3RkOjpmYWxzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKHRlc3Q8c3RkOjpvc3RyZWFtLGNvbnN0IFQmPigwKSk6OnZhbHVlOworICAgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBib29sIElzRW51bSA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgICAgICAgICAgICA+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyPFQsdHJ1ZT4KKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OnRvU3RyaW5nKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPih2KQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmCisgICAgdGVtcGxhdGU8Ym9vbCBDPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2UgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVudW1TdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdiApOworICAgICAgICB9CisjZWxzZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorI2VuZGlmCisgICAgfTsKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlPHRydWU+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgX3ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3QgVCYgb2JqZWN0ICkgeworICAgICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0LCBzaXplb2Yob2JqZWN0KSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyIDoKKyAgICBEZXRhaWw6OlN0cmluZ01ha2VyQmFzZTxEZXRhaWw6OklzU3RyZWFtSW5zZXJ0YWJsZTxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyPFQqPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVSogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggUiBDOjoqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICk7Cit9CisKKy8vdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorLy9zdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2ZWN0b3I8VCwgQWxsb2NhdG9yPiA+IHsKKy8vICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisvLyAgICAgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7CisvLyAgICB9CisvL307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworLy8gdG9TdHJpbmcgZm9yIHR1cGxlcworbmFtZXNwYWNlIFR1cGxlRGV0YWlsIHsKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4gPSAwLAorICAgICAgYm9vbCA9IChOIDwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlciB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgIHsKKyAgICAgICAgICBvcyA8PCAoIE4gPyAiLCAiIDogIiAiICkKKyAgICAgICAgICAgICA8PCBDYXRjaDo6dG9TdHJpbmcoc3RkOjpnZXQ8Tj4odHVwbGUpKTsKKyAgICAgICAgICBFbGVtZW50UHJpbnRlcjxUdXBsZSxOKzE+OjpwcmludCh0dXBsZSxvcyk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4KKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyPFR1cGxlLE4sZmFsc2U+IHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYsIHN0ZDo6b3N0cmVhbSYgKSB7fQorICB9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgorc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+PiB7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggY29uc3Qgc3RkOjp0dXBsZTxUeXBlcy4uLj4mIHR1cGxlICkKKyAgICB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgJ3snOworICAgICAgICBUdXBsZURldGFpbDo6RWxlbWVudFByaW50ZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCggdHVwbGUsIG9zICk7CisgICAgICAgIG9zIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9OworI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0ZDo6c3RyaW5nIG1ha2VTdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCisvLy8gXGJyaWVmIGNvbnZlcnRzIGFueSB0eXBlIHRvIGEgc3RyaW5nCisvLy8KKy8vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBmb3J3YXJkcyBvbiB0byBvc3RyaW5nc3RyZWFtIC0gZXhjZXB0IHdoZW4gYW4KKy8vLyBvc3RyaW5nc3RyZWFtIG92ZXJsb2FkIGRvZXMgbm90IGV4aXN0IC0gaW4gd2hpY2ggY2FzZSBpdCBhdHRlbXB0cyB0byBkZXRlY3QKKy8vLyB0aGF0IGFuZCB3cml0ZXMgez99LgorLy8vIE92ZXJsb2FkIChub3Qgc3BlY2lhbGlzZSkgdGhpcyB0ZW1wbGF0ZSBmb3IgY3VzdG9tIHR5cHMgdGhhdCB5b3UgZG9uJ3Qgd2FudAorLy8vIHRvIHByb3ZpZGUgYW4gb3N0cmVhbSBvdmVybG9hZCBmb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKK30KKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgInsgIjsKKyAgICAgICAgaWYoIGZpcnN0ICE9IGxhc3QgKSB7CisgICAgICAgICAgICBvc3MgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgICAgIGZvciggKytmaXJzdCA7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0ICkKKyAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIiA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICB9CisgICAgICAgIG9zcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb247CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uOworCisvLyBXcmFwcyB0aGUgTEhTIG9mIGFuIGV4cHJlc3Npb24gYW5kIG92ZXJsb2FkcyBjb21wYXJpc29uIG9wZXJhdG9ycworLy8gZm9yIGFsc28gY2FwdHVyaW5nIHRob3NlIGFuZCBSSFMgKGlmIGFueSkKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBFeHByZXNzaW9uTGhzIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBFeHByZXNzaW9uTGhzKCBSZXN1bHRCdWlsZGVyJiByYiwgVCBsaHMgKSA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV90cnV0aHkoZmFsc2UpIHt9CisKKyAgICBFeHByZXNzaW9uTGhzJiBvcGVyYXRvciA9ICggY29uc3QgRXhwcmVzc2lvbkxocyYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA9PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgIT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID4gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPD0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPj0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgPT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIGJvb2w+IG9wZXJhdG9yICE9ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgeworICAgICAgICBtX3RydXRoeSA9IG1fbGhzID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggbV90cnV0aHkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fdHJ1dGh5ICk7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4gY2FwdHVyZUV4cHJlc3Npb24oIFJoc1QmIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiBjYXB0dXJlRXhwcmVzc2lvbiggYm9vbCByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIFQgbV9saHM7CisgICAgYm9vbCBtX3RydXRoeTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEJpbmFyeUV4cHJlc3Npb24oIFJlc3VsdEJ1aWxkZXImIHJiLCBMaHNUIGxocywgUmhzVCByaHMgKQorICAgICAgICA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV9yaHMoIHJocyApIHt9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uJiBvcGVyYXRvciA9ICggQmluYXJ5RXhwcmVzc2lvbiYgKTsKKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIEludGVybmFsOjpjb21wYXJlPE9wPiggbV9saHMsIG1fcmhzICkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxocyA9IENhdGNoOjp0b1N0cmluZyggbV9saHMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3JocyApOworICAgICAgICBjaGFyIGRlbGltID0gbGhzLnNpemUoKSArIHJocy5zaXplKCkgPCA0MCAmJgorICAgICAgICAgICAgICAgICAgICAgbGhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgICAgICAgICAgIHJocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zID8gJyAnIDogJ1xuJzsKKyAgICAgICAgZGVzdC5yZXNlcnZlKCA3ICsgbGhzLnNpemUoKSArIHJocy5zaXplKCkgKTsKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBzcGFjZXMgYXJvdW5kIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBwYXJlbnRoZXNlcyAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgICAgICAgICAgICAvLyAxIGZvciBuZWdhdGlvbiAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgZGVzdCA9IGxoczsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSBJbnRlcm5hbDo6T3BlcmF0b3JUcmFpdHM8T3A+OjpnZXROYW1lKCk7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gcmhzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIExoc1QgbV9saHM7CisgICAgUmhzVCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBNYXRjaEV4cHJlc3Npb24oIEFyZ1QgYXJnLCBNYXRjaGVyVCBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkKKyAgICAgICAgOiBtX2FyZyggYXJnICksIG1fbWF0Y2hlciggbWF0Y2hlciApLCBtX21hdGNoZXJTdHJpbmcoIG1hdGNoZXJTdHJpbmcgKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1hdGNoZXJBc1N0cmluZyA9IG1fbWF0Y2hlci50b1N0cmluZygpOworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2FyZyApOworICAgICAgICBkZXN0ICs9ICcgJzsKKyAgICAgICAgaWYoIG1hdGNoZXJBc1N0cmluZyA9PSBEZXRhaWw6OnVucHJpbnRhYmxlU3RyaW5nICkKKyAgICAgICAgICAgIGRlc3QgKz0gbV9tYXRjaGVyU3RyaW5nOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZXN0ICs9IG1hdGNoZXJBc1N0cmluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXJnVCBtX2FyZzsKKyAgICBNYXRjaGVyVCBtX21hdGNoZXI7CisgICAgY2hhciBjb25zdCogbV9tYXRjaGVyU3RyaW5nOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+KCAqdGhpcywgb3BlcmFuZCApOworICAgIH0KKworICAgIGlubGluZSBFeHByZXNzaW9uTGhzPGJvb2w+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8Ym9vbD4oICp0aGlzLCB2YWx1ZSApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgIGlubGluZSB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKSB7CisgICAgICAgIE1hdGNoRXhwcmVzc2lvbjxBcmdUIGNvbnN0JiwgTWF0Y2hlclQgY29uc3QmPiBleHByKCBhcmcsIG1hdGNoZXIsIG1hdGNoZXJTdHJpbmcgKTsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggbWF0Y2hlci5tYXRjaCggYXJnICkgKTsKKyAgICAgICAgZW5kRXhwcmVzc2lvbiggZXhwciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm8geworICAgICAgICBNZXNzYWdlSW5mbyggICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA9PSBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPCBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsQ291bnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBNZXNzYWdlQnVpbGRlciB7CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZSApCisgICAgICAgIDogbV9pbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCB0eXBlICkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlQnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9zdHJlYW07CisgICAgfTsKKworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKTsKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgflNjb3BlZE1lc3NhZ2UoKTsKKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DQVBUVVJFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdDsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOworICAgIHN0cnVjdCBNZXNzYWdlSW5mbzsKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlQnVpbGRlcjsKKyAgICBzdHJ1Y3QgQ291bnRzOworCisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlIHsKKworICAgICAgICB2aXJ0dWFsIH5JUmVzdWx0Q2FwdHVyZSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCggICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcGxhdGZvcm0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUExBVEZPUk1fSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX01BQworI2VsaWYgIGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fSVBIT05FCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0xJTlVYCisjZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgaWYgIWRlZmluZWQoTk9NSU5NQVgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19OT01JTk1BWCkKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKTsKKyAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICk7Cit9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGJhc2VkIG9uOgorICAgIC8vIGh0dHA6Ly9jb2NvYXdpdGhsb3ZlLmNvbS8yMDA4LzAzL2JyZWFrLWludG8tZGVidWdnZXIuaHRtbAorICAgICNpZiBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3BwY19fKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBcCisgICAgICAgICAgICAgICAgX19hc21fXygibGkgcjAsIDIwXG5zY1xubm9wXG5saSByMCwgMzdcbmxpIHI0LCAyXG5zY1xubm9wXG4iIFwKKyAgICAgICAgICAgICAgICA6IDogOiAibWVtb3J5IiwicjAiLCJyMyIsInI0IiApCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19hc21fXygiaW50ICQzXG4iIDogOiApCisgICAgI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgLy8gSWYgd2UgY2FuIHVzZSBpbmxpbmUgYXNzZW1ibGVyLCBkbyBpdCBiZWNhdXNlIHRoaXMgYWxsb3dzIHVzIHRvIGJyZWFrCisgICAgLy8gZGlyZWN0bHkgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmYWlsaW5nIGNoZWNrIGluc3RlYWQgb2YgYnJlYWtpbmcgaW5zaWRlCisgICAgLy8gcmFpc2UoKSBjYWxsZWQgZnJvbSBpdCwgaS5lLiBvbmUgc3RhY2sgZnJhbWUgYmVsb3cuCisgICAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NCkpCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIGFzbSB2b2xhdGlsZSAoImludCAkMyIpCisgICAgI2Vsc2UgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIHdheS4KKyAgICAgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJR1RSQVApCisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fZGVidWdicmVhaygpCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVnQnJlYWsoKTsKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfVFJBUAorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIGlmKCBDYXRjaDo6aXNEZWJ1Z2dlckFjdGl2ZSgpICkgeyBDQVRDSF9UUkFQKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgQ2F0Y2g6OmFsd2F5c1RydWUoKTsKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SVU5ORVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRlc3RDYXNlOworCisgICAgc3RydWN0IElSdW5uZXIgeworICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhYm9ydGluZygpIGNvbnN0ID0gMDsKKyAgICB9OworfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2UgY2FuIHNwZWVkdXAgY29tcGlsYXRpb24gc2lnbmlmaWNhbnRseSBieSBicmVha2luZyBpbnRvIGRlYnVnZ2VyIGxvd2VyIGluCisvLyB0aGUgY2FsbHN0YWNrLCBiZWNhdXNlIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBleHBhbmQgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUgorLy8gbWFjcm8gaW4gZWFjaCBhc3NlcnRpb24KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlvbiBpcyB0byBvbWl0IGxvY2FsIHRyeS1jYXRjaCBmb3IgUkVRVUlSRSoKKy8vIG1hY3Jvcy4KKy8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGNhdXNlIGZhbHNlIG5lZ2F0aXZlLCBpZiB0aGUgdGVzdCBjb2RlIGNhdGNoZXMKKy8vIHRoZSBleGNlcHRpb24gYmVmb3JlIGl0IHByb3BhZ2F0ZXMgYmFjayB1cCB0byB0aGUgcnVubmVyLgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKy8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKyNlbHNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIHdvcmtzIG91dCBpZiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gYmUgaW52b2tlZAorLy8gYW5kL29yIGFuIGV4Y2VwdGlvbiB0aHJvd24gYW5kIHRha2VzIGFwcHJvcHJpYXRlIGFjdGlvbi4KKy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyBhIG1hY3JvIHNvIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaW4gdGhlIHVzZXIKKy8vIHNvdXJjZSBjb2RlIHJhdGhlciB0aGFuIGluIENhdGNoIGxpYnJhcnkgY29kZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICBpZiggcmVzdWx0QnVpbGRlci5zaG91bGREZWJ1Z0JyZWFrKCkgKSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7IFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworICAgIC8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0VMU0UoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoICFDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XUyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uLCAjbWF0Y2hlciApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIG1hdGNoZXIgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoIG1hY3JvTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByICIsICIgI2V4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCBleGNlcHRpb25UeXBlICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBfX1ZBX0FSR1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGxvZyApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBsb2cgKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8oIG1hY3JvTmFtZSwgbG9nICkgXAorICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBzY29wZWRNZXNzYWdlICkgPSBDYXRjaDo6TWVzc2FnZUJ1aWxkZXIoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpSZXN1bHRXYXM6OkluZm8gKSA8PCBsb2c7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVCggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICB9IGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc2VjdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb25faW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0lORk9fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG90YWxzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9UQUxTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb3VudHMgeworICAgICAgICBDb3VudHMoKSA6IHBhc3NlZCggMCApLCBmYWlsZWQoIDAgKSwgZmFpbGVkQnV0T2soIDAgKSB7fQorCisgICAgICAgIENvdW50cyBvcGVyYXRvciAtICggQ291bnRzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIENvdW50cyBkaWZmOworICAgICAgICAgICAgZGlmZi5wYXNzZWQgPSBwYXNzZWQgLSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZCA9IGZhaWxlZCAtIG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRCdXRPayAtIG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgQ291bnRzJiBvcGVyYXRvciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBwYXNzZWQgKz0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZmFpbGVkICs9IG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGZhaWxlZEJ1dE9rICs9IG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgdG90YWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcGFzc2VkICsgZmFpbGVkICsgZmFpbGVkQnV0T2s7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxQYXNzZWQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDAgJiYgZmFpbGVkQnV0T2sgPT0gMDsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbE9rKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rOworICAgIH07CisKKyAgICBzdHJ1Y3QgVG90YWxzIHsKKworICAgICAgICBUb3RhbHMgb3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnMgLSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgZGlmZi50ZXN0Q2FzZXMgPSB0ZXN0Q2FzZXMgLSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmYgPSAqdGhpcyAtIHByZXZUb3RhbHM7CisgICAgICAgICAgICBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZCA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLnBhc3NlZDsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzJiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBhc3NlcnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICB0ZXN0Q2FzZXMgKz0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIENvdW50cyB0ZXN0Q2FzZXM7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTZWN0aW9uSW5mbyB7CisgICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiA9IHN0ZDo6c3RyaW5nKCkgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbyB7CisgICAgICAgIFNlY3Rpb25FbmRJbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLCBDb3VudHMgY29uc3QmIF9wcmV2QXNzZXJ0aW9ucywgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIDogc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLCBwcmV2QXNzZXJ0aW9ucyggX3ByZXZBc3NlcnRpb25zICksIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICB7fQorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RJTUVSX0hfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDY0OworfQorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1aW50NjRfdCBVSW50NjQ7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICBUaW1lcigpIDogbV90aWNrcyggMCApIHt9CisgICAgICAgIHZvaWQgc3RhcnQoKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdDsKKyAgICAgICAgZG91YmxlIGdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBVSW50NjQgbV90aWNrczsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU2VjdGlvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIH5TZWN0aW9uKCk7CisKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNlY3Rpb25JbmZvIG1faW5mbzsKKworICAgICAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgICAgIENvdW50cyBtX2Fzc2VydGlvbnM7CisgICAgICAgIGJvb2wgbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgICAgIFRpbWVyIG1fdGltZXI7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCAuLi4gKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9fVkFfQVJHU19fICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2MgKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIG5hbWUsIGRlc2MgKSApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2dlbmVyYXRvcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBJR2VuZXJhdG9yIHsKKyAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yKCkge30KKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSAoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQmV0d2VlbkdlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBCZXR3ZWVuR2VuZXJhdG9yKCBUIGZyb20sIFQgdG8gKSA6IG1fZnJvbSggZnJvbSApLCBtX3RvKCB0byApe30KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Zyb20rc3RhdGljX2Nhc3Q8aW50PiggaW5kZXggKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIDErbV90by1tX2Zyb20gKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBUIG1fZnJvbTsKKyAgICBUIG1fdG87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIFZhbHVlc0dlbmVyYXRvcigpe30KKworICAgIHZvaWQgYWRkKCBUIHZhbHVlICkgeworICAgICAgICBtX3ZhbHVlcy5wdXNoX2JhY2soIHZhbHVlICk7CisgICAgfQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvbXBvc2l0ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCkgOiBtX3RvdGFsU2l6ZSggMCApIHt9CisKKyAgICAvLyAqKiogTW92ZSBzZW1hbnRpY3MsIHNpbWlsYXIgdG8gYXV0b19wdHIgKioqCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkKKyAgICA6ICAgbV9maWxlSW5mbyggb3RoZXIubV9maWxlSW5mbyApLAorICAgICAgICBtX3RvdGFsU2l6ZSggMCApCisgICAgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgc2V0RmlsZUluZm8oIGNvbnN0IGNoYXIqIGZpbGVJbmZvICkgeworICAgICAgICBtX2ZpbGVJbmZvID0gZmlsZUluZm87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+Q29tcG9zaXRlR2VuZXJhdG9yKCkgeworICAgICAgICBkZWxldGVBbGwoIG1fY29tcG9zZWQgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBUICgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IG92ZXJhbGxJbmRleCA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0R2VuZXJhdG9ySW5kZXgoIG1fZmlsZUluZm8sIG1fdG90YWxTaXplICk7CisKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zZWQuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fY29tcG9zZWQuZW5kKCk7CisgICAgICAgIGZvciggc2l6ZV90IGluZGV4ID0gMDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgPSAqaXQ7CisgICAgICAgICAgICBpZiggb3ZlcmFsbEluZGV4ID49IGluZGV4ICYmIG92ZXJhbGxJbmRleCA8IGluZGV4ICsgZ2VuZXJhdG9yLT5zaXplKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3ItPmdldFZhbHVlKCBvdmVyYWxsSW5kZXgtaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiSW5kZXhlZCBwYXN0IGVuZCBvZiBnZW5lcmF0ZWQgcmFuZ2UiICk7CisgICAgICAgIHJldHVybiBUKCk7IC8vIFN1cHByZXNzIHNwdXJpb3VzICJub3QgYWxsIGNvbnRyb2wgcGF0aHMgcmV0dXJuIGEgdmFsdWUiIHdhcm5pbmcgaW4gVmlzdWFsIFN0dWRpbyAtIGlmIHlvdSBrbm93IGhvdyB0byBmaXggdGhpcyBwbGVhc2UgZG8gc28KKyAgICB9CisKKyAgICB2b2lkIGFkZCggY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yICkgeworICAgICAgICBtX3RvdGFsU2l6ZSArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgbV9jb21wb3NlZC5wdXNoX2JhY2soIGdlbmVyYXRvciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggVCB2YWx1ZSApIHsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWx1ZSApOworICAgICAgICBhZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdm9pZCBtb3ZlKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtX2NvbXBvc2VkLmluc2VydCggbV9jb21wb3NlZC5lbmQoKSwgb3RoZXIubV9jb21wb3NlZC5iZWdpbigpLCBvdGhlci5tX2NvbXBvc2VkLmVuZCgpICk7CisgICAgICAgIG1fdG90YWxTaXplICs9IG90aGVyLm1fdG90YWxTaXplOworICAgICAgICBvdGhlci5tX2NvbXBvc2VkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+IG1fY29tcG9zZWQ7CisgICAgc3RkOjpzdHJpbmcgbV9maWxlSW5mbzsKKyAgICBzaXplX3QgbV90b3RhbFNpemU7Cit9OworCituYW1lc3BhY2UgR2VuZXJhdG9ycworeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGJldHdlZW4oIFQgZnJvbSwgVCB0byApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCBuZXcgQmV0d2VlbkdlbmVyYXRvcjxUPiggZnJvbSwgdG8gKSApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzICl7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMsIFQgdmFsNCApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsNCApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEdlbmVyYXRvcnMKKwordXNpbmcgbmFtZXNwYWNlIEdlbmVyYXRvcnM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkgI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggbGluZSApIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApIGV4cHIuc2V0RmlsZUluZm8oIF9fRklMRV9fICIoIiBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBfX0xJTkVfXyApICIpIiApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRUdJU1RSWV9IVUJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnk7CisgICAgc3RydWN0IElSZXBvcnRlckZhY3Rvcnk7CisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5OworCisgICAgc3RydWN0IElSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklSZWdpc3RyeUh1YigpOworCisgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdpc3RyeUh1YigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgPSAwOworICAgIH07CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCk7CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgdm9pZCBjbGVhblVwKCk7CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcoKmV4Y2VwdGlvblRyYW5zbGF0ZUZ1bmN0aW9uKSgpOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBFeGNlcHRpb25UcmFuc2xhdG9yczsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yKCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yIDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkKKyAgICAgICAgICAgIDogbV90cmFuc2xhdGVGdW5jdGlvbiggdHJhbnNsYXRlRnVuY3Rpb24gKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqaXQpLT50cmFuc2xhdGUoIGl0KzEsIGl0RW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKCBUJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRlRnVuY3Rpb24oIGV4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVHJhbnNsYXRvcgorICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5zbGF0b3I8VD4oIHRyYW5zbGF0ZUZ1bmN0aW9uICkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIHRyYW5zbGF0b3JOYW1lLCBzaWduYXR1cmUgKSBcCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKTsgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblJlZ2lzdHJhciApKCAmdHJhbnNsYXRvck5hbWUgKTsgfVwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25UcmFuc2xhdG9yICksIHNpZ25hdHVyZSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9hcHByb3guaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BUFBST1hfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjbGFzcyBBcHByb3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQXBwcm94ICggZG91YmxlIHZhbHVlICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKSoxMDAgKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIDEuMCApLAorICAgICAgICAgICAgbV92YWx1ZSggdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIEFwcHJveCggQXBwcm94IGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2Vwc2lsb24oIG90aGVyLm1fZXBzaWxvbiApLAorICAgICAgICAgICAgbV9tYXJnaW4oIG90aGVyLm1fbWFyZ2luICksCisgICAgICAgICAgICBtX3NjYWxlKCBvdGhlci5tX3NjYWxlICksCisgICAgICAgICAgICBtX3ZhbHVlKCBvdGhlci5tX3ZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcHByb3goIDAgKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIFQgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCB2YWx1ZSApOiBBcHByb3goc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBjb25zdCBUJiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGF1dG8gbGhzX3YgPSBkb3VibGUobGhzKTsKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKHN0ZDo6ZmFicyhsaHNfdiksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkpKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgY29uc3QgVCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBUIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBkb3VibGUobmV3RXBzaWxvbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIG1hcmdpbiggVCBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IGRvdWJsZShuZXdNYXJnaW4pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBzY2FsZSggVCBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBkb3VibGUobmV3U2NhbGUpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyNlbHNlCisKKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIGRvdWJsZSB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHZhbHVlICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMoIGxocyAtIHJocy5tX3ZhbHVlICkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KSggc3RkOjpmYWJzKGxocyksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkgKSApOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzIC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIGVwc2lsb24oIGRvdWJsZSBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gbmV3RXBzaWxvbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBkb3VibGUgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBuZXdNYXJnaW47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIHNjYWxlKCBkb3VibGUgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gbmV3U2NhbGU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiQXBwcm94KCAiIDw8IENhdGNoOjp0b1N0cmluZyggbV92YWx1ZSApIDw8ICIgKSI7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBkb3VibGUgbV9lcHNpbG9uOworICAgICAgICBkb3VibGUgbV9tYXJnaW47CisgICAgICAgIGRvdWJsZSBtX3NjYWxlOworICAgICAgICBkb3VibGUgbV92YWx1ZTsKKyAgICB9OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmc8RGV0YWlsOjpBcHByb3g+KCBEZXRhaWw6OkFwcHJveCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1NUUklOR19IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgc3RydWN0IENhc2VkU3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIENhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0OworCisgICAgICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgU3RyaW5nTWF0Y2hlckJhc2UgOiBNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4geworICAgICAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgICAgIENhc2VkU3RyaW5nIG1fY29tcGFyYXRvcjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fb3BlcmF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBFbmRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc192ZWN0b3IuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfVkVDVE9SX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgVmVjdG9yIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNFbGVtZW50TWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBUPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zRWxlbWVudE1hdGNoZXIoVCBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IpIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yKSAhPSB2LmVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUIGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBzZWUgbm90ZSBpbiBFcXVhbHNNYXRjaGVyCisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgPiB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb21wYXJhdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yW2ldKSA9PSB2LmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogVGhpcyBjdXJyZW50bHkgd29ya3MgaWYgYWxsIGVsZW1lbnRzIGNhbiBiZSBjb21wYXJlZCB1c2luZyAhPQorICAgICAgICAgICAgICAgIC8vIC0gYSBtb3JlIGdlbmVyYWwgYXBwcm9hY2ggd291bGQgYmUgdmlhIGEgY29tcGFyZSB0ZW1wbGF0ZSB0aGF0IGRlZmF1bHRzCisgICAgICAgICAgICAgICAgLy8gdG8gdXNpbmcgIT0uIGJ1dCBjb3VsZCBiZSBzcGVjaWFsaXNlZCBmb3IsIGUuZy4gc3RkOjp2ZWN0b3I8VD4gZXRjCisgICAgICAgICAgICAgICAgLy8gLSB0aGVuIGp1c3QgY2FsbCB0aGF0IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgIT0gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3JbaV0gIT0gdltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFcXVhbHM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFZlY3RvcgorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiBDb250YWlucyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+IFZlY3RvckNvbnRhaW5zKCBUIGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUYWdBbGlhcyB7CisgICAgICAgIFRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgX3RhZywgU291cmNlTGluZUluZm8gX2xpbmVJbmZvICkgOiB0YWcoIF90YWcgKSwgbGluZUluZm8oIF9saW5lSW5mbyApIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgeworICAgICAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9UQUdfQUxJQVMoIGFsaWFzLCBzcGVjICkgbmFtZXNwYWNleyBDYXRjaDo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQXV0b1JlZ2lzdGVyVGFnQWxpYXMgKSggYWxpYXMsIHNwZWMsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PUFRJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBvcHRpb25hbCB0eXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBPcHRpb24geworICAgIHB1YmxpYzoKKyAgICAgICAgT3B0aW9uKCkgOiBudWxsYWJsZVZhbHVlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgT3B0aW9uKCBUIGNvbnN0JiBfdmFsdWUgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApICkKKyAgICAgICAge30KKyAgICAgICAgT3B0aW9uKCBPcHRpb24gY29uc3QmIF9vdGhlciApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggX290aGVyID8gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApIDogQ0FUQ0hfTlVMTCApCisgICAgICAgIHt9CisKKyAgICAgICAgfk9wdGlvbigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBPcHRpb24mIG9wZXJhdG9yPSAoIE9wdGlvbiBjb25zdCYgX290aGVyICkgeworICAgICAgICAgICAgaWYoICZfb3RoZXIgIT0gdGhpcyApIHsKKyAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIGlmKCBfb3RoZXIgKQorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3IgPSAoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG51bGxhYmxlVmFsdWUgKQorICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUtPn5UKCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQgY29uc3QmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisKKyAgICAgICAgVCB2YWx1ZU9yKCBUIGNvbnN0JiBkZWZhdWx0VmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbnVsbGFibGVWYWx1ZSA/ICpudWxsYWJsZVZhbHVlIDogZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzb21lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSAhPSBDQVRDSF9OVUxMOyB9CisgICAgICAgIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIHNvbWUoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUICpudWxsYWJsZVZhbHVlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBjaGFyIHN0b3JhZ2Vbc2l6ZW9mKFQpXTsKKworICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGhlcmUgdG8gZm9yY2UgYWxpZ25tZW50IGZvciB0aGUgc3RvcmFnZQorICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkxOworICAgICAgICAgICAgdm9pZCAoKmR1bW15MikoKTsKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgICAgICAgICBsb25nIGxvbmcgZHVtbXk0OworI2VuZGlmCisgICAgICAgIH07CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7CisKKyAgICAgICAgc3RhdGljIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gVGhlc2UgZmlsZXMgYXJlIGluY2x1ZGVkIGhlcmUgc28gdGhlIHNpbmdsZV9pbmNsdWRlIHNjcmlwdCBkb2Vzbid0IHB1dCB0aGVtCisvLyBpbiB0aGUgY29uZGl0aW9uYWxseSBjb21waWxlZCBzZWN0aW9ucworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfY2FzZV9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VJbmZvIHsKKyAgICAgICAgZW51bSBTcGVjaWFsUHJvcGVydGllc3sKKyAgICAgICAgICAgIE5vbmUgPSAwLAorICAgICAgICAgICAgSXNIaWRkZW4gPSAxIDw8IDEsCisgICAgICAgICAgICBTaG91bGRGYWlsID0gMSA8PCAyLAorICAgICAgICAgICAgTWF5RmFpbCA9IDEgPDwgMywKKyAgICAgICAgICAgIFRocm93cyA9IDEgPDwgNCwKKyAgICAgICAgICAgIE5vblBvcnRhYmxlID0gMSA8PCA1CisgICAgICAgIH07CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICk7CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApOworCisgICAgICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKKyAgICAgICAgYm9vbCB0aHJvd3MoKSBjb25zdDsKKyAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OworICAgICAgICBib29sIGV4cGVjdGVkVG9GYWlsKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsY2FzZVRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3NBc1N0cmluZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFNwZWNpYWxQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlIDogcHVibGljIFRlc3RDYXNlSW5mbyB7CisgICAgcHVibGljOgorCisgICAgICAgIFRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgVGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdDsKKworICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OworCisgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKTsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgVGVzdENhc2UmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJVGVzdENhc2U+IHRlc3Q7CisgICAgfTsKKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX29iamMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTkIuIEFueSBnZW5lcmFsIGNhdGNoIGhlYWRlcnMgaW5jbHVkZWQgaGVyZSBtdXN0IGJlIGluY2x1ZGVkCisvLyBpbiBjYXRjaC5ocHAgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGluY2x1ZGVkIGJ5IHRoZSBzaW5nbGUKKy8vIGhlYWRlciBmb3Igbm9uIG9iai11c2FnZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIHByb3RvY29sIGlzIHJlYWxseSBvbmx5IGhlcmUgZm9yIChzZWxmKSBkb2N1bWVudGluZyBwdXJwb3Nlcywgc2luY2UKKy8vIGFsbCBpdHMgbWV0aG9kcyBhcmUgb3B0aW9uYWwuCitAcHJvdG9jb2wgT2NGaXh0dXJlCisKK0BvcHRpb25hbAorCistKHZvaWQpIHNldFVwOworLSh2b2lkKSB0ZWFyRG93bjsKKworQGVuZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgT2NNZXRob2QgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgT2NNZXRob2QoIENsYXNzIGNscywgU0VMIHNlbCApIDogbV9jbHMoIGNscyApLCBtX3NlbCggc2VsICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgaWQgb2JqID0gW1ttX2NscyBhbGxvY10gaW5pdF07CisKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3RvcihzZXRVcCkgICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBtX3NlbCApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHRlYXJEb3duKSAgKTsKKworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG9iaiApOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+T2NNZXRob2QoKSB7fQorCisgICAgICAgIENsYXNzIG1fY2xzOworICAgICAgICBTRUwgbV9zZWw7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSBEZXRhaWx7CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFubm90YXRpb24oICAgQ2xhc3MgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgYW5ub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0Q2FzZU5hbWUgKSB7CisgICAgICAgICAgICBOU1N0cmluZyogc2VsU3RyID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCJDYXRjaF8lc18lcyIsIGFubm90YXRpb25OYW1lLmNfc3RyKCksIHRlc3RDYXNlTmFtZS5jX3N0cigpXTsKKyAgICAgICAgICAgIFNFTCBzZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZyggc2VsU3RyICk7CisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggc2VsU3RyICk7CisgICAgICAgICAgICBpZCB2YWx1ZSA9IHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBjbHMsIHNlbCApOworICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICByZXR1cm4gWyhOU1N0cmluZyopdmFsdWUgVVRGOFN0cmluZ107CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHJlZ2lzdGVyVGVzdE1ldGhvZHMoKSB7CisgICAgICAgIHNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKKyAgICAgICAgaW50IG5vQ2xhc3NlcyA9IG9iamNfZ2V0Q2xhc3NMaXN0KCBDQVRDSF9OVUxMLCAwICk7CisKKyAgICAgICAgQ2xhc3MqIGNsYXNzZXMgPSAoQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxsb2MoIHNpemVvZihDbGFzcykgKiBub0NsYXNzZXMpOworICAgICAgICBvYmpjX2dldENsYXNzTGlzdCggY2xhc3Nlcywgbm9DbGFzc2VzICk7CisKKyAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBub0NsYXNzZXM7IGMrKyApIHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdV9pbnQgY291bnQ7CisgICAgICAgICAgICAgICAgTWV0aG9kKiBtZXRob2RzID0gY2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgZm9yKCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgeworICAgICAgICAgICAgICAgICAgICBTRUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2RzW21dKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9nZXROYW1lKHNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1ldGhvZE5hbWUsICJDYXRjaF9UZXN0Q2FzZV8iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0Q2FzZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIk5hbWUiLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2NyaXB0aW9uIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSBjbGFzc19nZXROYW1lKCBjbHMgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENhc2UoIG5ldyBPY01ldGhvZCggY2xzLCBzZWxlY3RvciApLCBjbGFzc05hbWUsIG5hbWUuY19zdHIoKSwgZGVzYy5jX3N0cigpLCBTb3VyY2VMaW5lSW5mbygpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVzdE1ldGhvZHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBub1Rlc3RNZXRob2RzOworICAgIH0KKworICAgIG5hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKKyAgICAgICAgbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMgeworCisgICAgICAgICAgICBzdHJ1Y3QgU3RyaW5nSG9sZGVyIDogTWF0Y2hlckJhc2U8TlNTdHJpbmcqPnsKKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBvdGhlciApIDogbV9zdWJzdHIoIFtvdGhlci5tX3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5TU3RyaW5nKiBtX3N1YnN0cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBFcXVhbHMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIGlzRXF1YWxUb1N0cmluZzptX3N1YnN0cl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlcXVhbHMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBDb250YWlucyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGFpbnMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gW3N0ciBsZW5ndGhdIC0gW21fc3Vic3RyIGxlbmd0aF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICB9IC8vIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzCisgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMKKyAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aAorICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aCggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgKKyAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aCggc3Vic3RyICk7IH0KKworICAgIH0gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKKyAgICB1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgT0NfVEVTVF9DQVNFKCBuYW1lLCBkZXNjIClcCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX05hbWVfdGVzdCApIFwKK3tcCityZXR1cm4gQCBuYW1lOyBcCit9XAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9EZXNjcmlwdGlvbl90ZXN0ICkgXAoreyBcCityZXR1cm4gQCBkZXNjOyBcCit9IFwKKy0odm9pZCkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX1Rlc3RDYXNlX3Rlc3QgKQorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKworLy8gIVRCRDogTW92ZSB0aGUgbGVhayBkZXRlY3RvciBjb2RlIGludG8gYSBzZXBhcmF0ZSBoZWFkZXIKKyNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcKKyNpbmNsdWRlIDxjcnRkYmcuaD4KK2NsYXNzIExlYWtEZXRlY3RvciB7CitwdWJsaWM6CisJTGVha0RldGVjdG9yKCkgeworCQlpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFnKF9DUlREQkdfUkVQT1JUX0ZMQUcpOworCQlmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVDS19ERjsKKwkJZmxhZyB8PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKKwkJX0NydFNldERiZ0ZsYWcoZmxhZyk7CisJCV9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOworCQlfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERFUlIpOworCQkvLyBDaGFuZ2UgdGhpcyB0byBsZWFraW5nIGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUKKwkJX0NydFNldEJyZWFrQWxsb2MoLTEpOworCX0KK307CisjZWxzZQorY2xhc3MgTGVha0RldGVjdG9yIHt9OworI2VuZGlmCisKK0xlYWtEZXRlY3RvciBsZWFrRGV0ZWN0b3I7CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gQ29sbGVjdCBhbGwgdGhlIGltcGxlbWVudGF0aW9uIGZpbGVzIHRvZ2V0aGVyIGhlcmUKKy8vIFRoZXNlIGFyZSB0aGUgZXF1aXZhbGVudCBvZiB3aGF0IHdvdWxkIHVzdWFsbHkgYmUgY3BwIGZpbGVzCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd3ZWFrLXZ0YWJsZXMiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2NhdGNoX3Nlc3Npb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb21tYW5kbGluZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1BTkRMSU5FX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uZmlnLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09ORklHX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjX3BhcnNlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19QQVJTRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2lsZGNhcmRfcGF0dGVybi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTERDQVJEX1BBVFRFUk5fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIGNsYXNzIFdpbGRjYXJkUGF0dGVybiB7CisgICAgICAgIGVudW0gV2lsZGNhcmRQb3NpdGlvbiB7CisgICAgICAgICAgICBOb1dpbGRjYXJkID0gMCwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRTdGFydCA9IDEsCisgICAgICAgICAgICBXaWxkY2FyZEF0RW5kID0gMiwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRCb3RoRW5kcyA9IFdpbGRjYXJkQXRTdGFydCB8IFdpbGRjYXJkQXRFbmQKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBXaWxkY2FyZFBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXR0ZXJuLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fd2lsZGNhcmQoIE5vV2lsZGNhcmQgKSwKKyAgICAgICAgICAgIG1fcGF0dGVybiggYWRqdXN0Q2FzZSggcGF0dGVybiApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBXaWxkY2FyZEF0U3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggZW5kc1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMCwgbV9wYXR0ZXJuLnNpemUoKS0xICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRpY19jYXN0PFdpbGRjYXJkUG9zaXRpb24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfldpbGRjYXJkUGF0dGVybigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCggbV93aWxkY2FyZCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vV2lsZGNhcmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BhdHRlcm4gPT0gYWRqdXN0Q2FzZSggc3RyICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0U3RhcnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEVuZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRCb3RoRW5kczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnJlYWNoYWJsZS1jb2RlIgorI2VuZGlmCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBlbnVtIiApOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vID8gdG9Mb3dlciggc3RyICkgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICBXaWxkY2FyZFBvc2l0aW9uIG1fd2lsZGNhcmQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fcGF0dGVybjsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjIHsKKyAgICAgICAgc3RydWN0IFBhdHRlcm4gOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgdmlydHVhbCB+UGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIE5hbWVQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKQorICAgICAgICAgICAgOiBtX3dpbGRjYXJkUGF0dGVybiggdG9Mb3dlciggbmFtZSApLCBDYXNlU2Vuc2l0aXZlOjpObyApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgdmlydHVhbCB+TmFtZVBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3dpbGRjYXJkUGF0dGVybi5tYXRjaGVzKCB0b0xvd2VyKCB0ZXN0Q2FzZS5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFdpbGRjYXJkUGF0dGVybiBtX3dpbGRjYXJkUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUYWdQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUYWdQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgOiBtX3RhZyggdG9Mb3dlciggdGFnICkgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+VGFnUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmxjYXNlVGFncy5maW5kKCBtX3RhZyApICE9IHRlc3RDYXNlLmxjYXNlVGFncy5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fdGFnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEV4Y2x1ZGVkUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRXhjbHVkZWRQYXR0ZXJuKCBQdHI8UGF0dGVybj4gY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJuICkgOiBtX3VuZGVybHlpbmdQYXR0ZXJuKCB1bmRlcmx5aW5nUGF0dGVybiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5FeGNsdWRlZFBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeyByZXR1cm4gIW1fdW5kZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFB0cjxQYXR0ZXJuPiBtX3VuZGVybHlpbmdQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBGaWx0ZXIgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID4gbV9wYXR0ZXJuczsKKworICAgICAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIC8vIEFsbCBwYXR0ZXJucyBpbiBhIGZpbHRlciBtdXN0IG1hdGNoIGZvciB0aGUgZmlsdGVyIHRvIGJlIGEgbWF0Y2gKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcGF0dGVybnMuYmVnaW4oKSwgaXRFbmQgPSBtX3BhdHRlcm5zLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEoKml0KS0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc0ZpbHRlcnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIW1fZmlsdGVycy5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIEEgVGVzdFNwZWMgbWF0Y2hlcyBpZiBhbnkgZmlsdGVyIG1hdGNoZXMKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8RmlsdGVyPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2ZpbHRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX2ZpbHRlcnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggaXQtPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyPiBtX2ZpbHRlcnM7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRlc3RTcGVjUGFyc2VyOworICAgIH07Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWNQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGV7IE5vbmUsIE5hbWUsIFF1b3RlZE5hbWUsIFRhZywgRXNjYXBlZE5hbWUgfTsKKyAgICAgICAgTW9kZSBtX21vZGU7CisgICAgICAgIGJvb2wgbV9leGNsdXNpb247CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc3RhcnQsIG1fcG9zOworICAgICAgICBzdGQ6OnN0cmluZyBtX2FyZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7CisgICAgICAgIFRlc3RTcGVjOjpGaWx0ZXIgbV9jdXJyZW50RmlsdGVyOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2VzOworCisgICAgcHVibGljOgorICAgICAgICBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIHRhZ0FsaWFzZXMgKSA6IG1fdGFnQWxpYXNlcyggJnRhZ0FsaWFzZXMgKSB7fQorCisgICAgICAgIFRlc3RTcGVjUGFyc2VyJiBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgbV9hcmcgPSBtX3RhZ0FsaWFzZXMtPmV4cGFuZEFsaWFzZXMoIGFyZyApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgZm9yKCBtX3BvcyA9IDA7IG1fcG9zIDwgbV9hcmcuc2l6ZSgpOyArK21fcG9zICkKKyAgICAgICAgICAgICAgICB2aXNpdENoYXIoIG1fYXJnW21fcG9zXSApOworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYygpIHsKKyAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgcmV0dXJuIG1fdGVzdFNwZWM7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHZpc2l0Q2hhciggY2hhciBjICkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkgeworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICcgJzogcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ34nOiBtX2V4Y2x1c2lvbiA9IHRydWU7IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6IHJldHVybiBzdGFydE5ld01vZGUoIFF1b3RlZE5hbWUsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHJldHVybiBlc2NhcGUoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzdGFydE5ld01vZGUoIE5hbWUsIG1fcG9zICk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnWycgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdWJTdHJpbmcoKSA9PSAiZXhjbHVkZToiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1xcJyApCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IEVzY2FwZWROYW1lICkKKyAgICAgICAgICAgICAgICBtX21vZGUgPSBOYW1lOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFF1b3RlZE5hbWUgJiYgYyA9PSAnIicgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFRhZyAmJiBjID09ICddJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6VGFnUGF0dGVybj4oKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0YXJ0TmV3TW9kZSggTW9kZSBtb2RlLCBzdGQ6OnNpemVfdCBzdGFydCApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlc2NhcGUoKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKQorICAgICAgICAgICAgICAgIG1fc3RhcnQgPSBtX3BvczsKKyAgICAgICAgICAgIG1fbW9kZSA9IEVzY2FwZWROYW1lOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5wdXNoX2JhY2soIG1fcG9zICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgc3ViU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9hcmcuc3Vic3RyKCBtX3N0YXJ0LCBtX3BvcyAtIG1fc3RhcnQgKTsgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZFBhdHRlcm4oKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IHN1YlN0cmluZygpOworICAgICAgICAgICAgZm9yKCBzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggMCwgbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkgKSArIHRva2VuLnN1YnN0ciggbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkrMSApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRva2VuLCAiZXhjbHVkZToiICkgKSB7CisgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXRva2VuLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgUHRyPFRlc3RTcGVjOjpQYXR0ZXJuPiBwYXR0ZXJuID0gbmV3IFQoIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIG1fZXhjbHVzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuKCBwYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMucHVzaF9iYWNrKCBwYXR0ZXJuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZEZpbHRlcigpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjLm1fZmlsdGVycy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlciA9IFRlc3RTcGVjOjpGaWx0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaW5saW5lIFRlc3RTcGVjIHBhcnNlVGVzdFNwZWMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgIHJldHVybiBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoIGFyZyApLnRlc3RTcGVjKCk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY29uZmlnLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ09ORklHX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFZlcmJvc2l0eSB7IGVudW0gTGV2ZWwgeworICAgICAgICBOb091dHB1dCA9IDAsCisgICAgICAgIFF1aWV0LAorICAgICAgICBOb3JtYWwKKyAgICB9OyB9OworCisgICAgc3RydWN0IFdhcm5BYm91dCB7IGVudW0gV2hhdCB7CisgICAgICAgIE5vdGhpbmcgPSAweDAwLAorICAgICAgICBOb0Fzc2VydGlvbnMgPSAweDAxCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBTaG93RHVyYXRpb25zIHsgZW51bSBPck5vdCB7CisgICAgICAgIERlZmF1bHRGb3JSZXBvcnRlciwKKyAgICAgICAgQWx3YXlzLAorICAgICAgICBOZXZlcgorICAgIH07IH07CisgICAgc3RydWN0IFJ1blRlc3RzIHsgZW51bSBJbldoYXRPcmRlciB7CisgICAgICAgIEluRGVjbGFyYXRpb25PcmRlciwKKyAgICAgICAgSW5MZXhpY29ncmFwaGljYWxPcmRlciwKKyAgICAgICAgSW5SYW5kb21PcmRlcgorICAgIH07IH07CisgICAgc3RydWN0IFVzZUNvbG91ciB7IGVudW0gWWVzT3JObyB7CisgICAgICAgIEF1dG8sCisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZyA6IElTaGFyZWQgeworCisgICAgICAgIHZpcnR1YWwgfklDb25maWcoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0ID0gMDsKKworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbWJ1Zi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1CVUZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtQnVmQmFzZSA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCk7CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCk7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbSB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRmlsZVN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBDb3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgQ291dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBEZWJ1Z091dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIFN0cmVhbUJ1ZkJhc2UgKSBtX3N0cmVhbUJ1ZjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggODAKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbmZpZ0RhdGEgeworCisgICAgICAgIENvbmZpZ0RhdGEoKQorICAgICAgICA6ICAgbGlzdFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0UmVwb3J0ZXJzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRlc3ROYW1lc09ubHkoIGZhbHNlICksCisgICAgICAgICAgICBzaG93U3VjY2Vzc2Z1bFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgICAgIG5vVGhyb3coIGZhbHNlICksCisgICAgICAgICAgICBzaG93SGVscCggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dJbnZpc2libGVzKCBmYWxzZSApLAorICAgICAgICAgICAgZmlsZW5hbWVzQXNUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgYWJvcnRBZnRlciggLTEgKSwKKyAgICAgICAgICAgIHJuZ1NlZWQoIDAgKSwKKyAgICAgICAgICAgIHZlcmJvc2l0eSggVmVyYm9zaXR5OjpOb3JtYWwgKSwKKyAgICAgICAgICAgIHdhcm5pbmdzKCBXYXJuQWJvdXQ6Ok5vdGhpbmcgKSwKKyAgICAgICAgICAgIHNob3dEdXJhdGlvbnMoIFNob3dEdXJhdGlvbnM6OkRlZmF1bHRGb3JSZXBvcnRlciApLAorICAgICAgICAgICAgcnVuT3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIHVzZUNvbG91ciggVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAge30KKworICAgICAgICBib29sIGxpc3RUZXN0czsKKyAgICAgICAgYm9vbCBsaXN0VGFnczsKKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzOworICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5OworCisgICAgICAgIGJvb2wgc2hvd1N1Y2Nlc3NmdWxUZXN0czsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG5vVGhyb3c7CisgICAgICAgIGJvb2wgc2hvd0hlbHA7CisgICAgICAgIGJvb2wgc2hvd0ludmlzaWJsZXM7CisgICAgICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzOworCisgICAgICAgIGludCBhYm9ydEFmdGVyOworICAgICAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZDsKKworICAgICAgICBWZXJib3NpdHk6OkxldmVsIHZlcmJvc2l0eTsKKyAgICAgICAgV2FybkFib3V0OjpXaGF0IHdhcm5pbmdzOworICAgICAgICBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zOworICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXI7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZW5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlck5hbWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdHNPclRhZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWN0aW9uc1RvUnVuOworICAgIH07CisKKyAgICBjbGFzcyBDb25maWcgOiBwdWJsaWMgU2hhcmVkSW1wbDxJQ29uZmlnPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ29uZmlnKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIENvbmZpZyYgb3BlcmF0b3IgPSAoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGR1bW15KCk7CisgICAgcHVibGljOgorCisgICAgICAgIENvbmZpZygpCisgICAgICAgIHt9CisKKyAgICAgICAgQ29uZmlnKCBDb25maWdEYXRhIGNvbnN0JiBkYXRhICkKKyAgICAgICAgOiAgIG1fZGF0YSggZGF0YSApLAorICAgICAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhZGF0YS50ZXN0c09yVGFncy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFRlc3RTcGVjUGFyc2VyIHBhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGRhdGEudGVzdHNPclRhZ3Muc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UoIGRhdGEudGVzdHNPclRhZ3NbaV0gKTsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjID0gcGFyc2VyLnRlc3RTcGVjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5Db25maWcoKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0RmlsZW5hbWUgOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3RzOyB9CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHkoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3ROYW1lc09ubHk7IH0KKyAgICAgICAgYm9vbCBsaXN0VGFncygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGFnczsgfQorICAgICAgICBib29sIGxpc3RSZXBvcnRlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFJlcG9ydGVyczsgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnByb2Nlc3NOYW1lOyB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRSZXBvcnRlck5hbWVzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnJlcG9ydGVyTmFtZXM7IH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNlY3Rpb25zVG9SdW47IH0KKworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fdGVzdFNwZWM7IH0KKworICAgICAgICBib29sIHNob3dIZWxwKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNob3dIZWxwOyB9CisKKyAgICAgICAgLy8gSUNvbmZpZyBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuICFtX2RhdGEubm9UaHJvdzsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9zdHJlYW0tPnN0cmVhbSgpOyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubmFtZS5lbXB0eSgpID8gbV9kYXRhLnByb2Nlc3NOYW1lIDogbV9kYXRhLm5hbWU7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgIHsgcmV0dXJuIG1fZGF0YS5zaG93U3VjY2Vzc2Z1bFRlc3RzOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFICB7IHJldHVybiBtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0R1cmF0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0IENBVENIX09WRVJSSURFICAgeyByZXR1cm4gbV9kYXRhLnJ1bk9yZGVyOyB9CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5nU2VlZDsgfQorICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgeyByZXR1cm4gbV9kYXRhLnVzZUNvbG91cjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuYWJvcnRBZnRlcjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0ludmlzaWJsZXM7IH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgSVN0cmVhbSBjb25zdCogb3BlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3V0U3RyZWFtKCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWVbMF0gPT0gJyUnICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgPT0gIiVkZWJ1ZyIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVucmVjb2duaXNlZCBzdHJlYW06ICIgKyBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTdHJlYW0oIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEgbV9kYXRhOworCisgICAgICAgIENBVENIX0FVVE9fUFRSKCBJU3RyZWFtIGNvbnN0ICkgbV9zdHJlYW07CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jbGFyYS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DTEFSQV9IX0lOQ0xVREVECisKKy8vIFVzZSBDYXRjaCdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoIChzdG9yZSBDbGFyYSdzIG9mZiB0byB0aGUgc2lkZSwgaWYgcHJlc2VudCkKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisvLyBEZWNsYXJlIENsYXJhIGluc2lkZSB0aGUgQ2F0Y2ggbmFtZXNwYWNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSBuYW1lc3BhY2UgQ2F0Y2ggeworLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL2NsYXJhLmgKKworLy8gVmVyc2lvbiAwLjAuMi40CisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSkKKworI2lmbmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyNlbHNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UgfQorI2VuZGlmCisKKyNkZWZpbmUgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UpCisjaWZuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKSwKKyAgICAgICAgICAgIHRhYkNoYXIoICdcdCcgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRUYWJDaGFyKCBjaGFyIF92YWx1ZSApICAgICAgICAgICAgICAgeyB0YWJDaGFyID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgICAgICBjaGFyIHRhYkNoYXI7ICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjaGFyIGlzIHNlZW4gdGhlIGluZGVudCBpcyBjaGFuZ2VkIHRvIGN1cnJlbnQgcG9zCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQ2hhcnMgPSAiIFsoey4sL3xcXC0iOworICAgICAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gX2F0dHIuaW5pdGlhbEluZGVudAorICAgICAgICAgICAgICAgIDogX2F0dHIuaW5kZW50OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtYWluZGVyID0gX3N0cjsKKworICAgICAgICAgICAgd2hpbGUoICFyZW1haW5kZXIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgdGFiUG9zID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCByZW1haW5kZXIuc2l6ZSgpLCBfYXR0ci53aWR0aCAtIGluZGVudCApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IHJlbWFpbmRlci5maW5kX2ZpcnN0X29mKCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyA8PSB3aWR0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIF9hdHRyLnRhYkNoYXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiUG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDAsIHRhYlBvcyApICsgcmVtYWluZGVyLnN1YnN0ciggdGFiUG9zKzEgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggd2lkdGggPT0gcmVtYWluZGVyLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA8PSAxIHx8IHJlbWFpbmRlci5zaXplKCkgIT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIHdyYXBwYWJsZUNoYXJzLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIHBvcyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgcG9zICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyWzBdID09ICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmJhY2soKSArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiUG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3BsaWNlTGluZSggc3RkOjpzaXplX3QgX2luZGVudCwgc3RkOjpzdHJpbmcmIF9yZW1haW5kZXIsIHN0ZDo6c2l6ZV90IF9wb3MgKSB7CisgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBfaW5kZW50LCAnICcgKSArIF9yZW1haW5kZXIuc3Vic3RyKCAwLCBfcG9zICkgKTsKKyAgICAgICAgICAgIF9yZW1haW5kZXIgPSBfcmVtYWluZGVyLnN1YnN0ciggX3BvcyApOworICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyN1bmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDTEFSQV9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENMQVJBX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jbGFuZ19fCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNkZWZpbmUgQ0xBUkFfQ1BQMTFfT1JfR1JFQVRFUgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfTk9FWENFUFQpCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX05VTEwgbnVsbHB0cgorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2RlZmluZSBDTEFSQV9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworI2VuZGlmCisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKK1NUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2VuZGlmCisKK25hbWVzcGFjZSBDbGFyYSB7CisKKyAgICBzdHJ1Y3QgVW5wb3NpdGlvbmFsVGFnIHt9OworCisgICAgZXh0ZXJuIFVucG9zaXRpb25hbFRhZyBfOworCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU4KKyAgICBVbnBvc2l0aW9uYWxUYWcgXzsKKyNlbmRpZgorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisKKyNpZmRlZiBDTEFSQV9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgVGJjOworCisgICAgICAgIGlubGluZSBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ci5zdWJzdHIoIDAsIHByZWZpeC5zaXplKCkgKSA9PSBwcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWZ7IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3QmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0PnsgdHlwZWRlZiBUIHR5cGU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgc3RydWN0IElzQm9vbCAgICAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7IH07CisgICAgICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBJc0Jvb2w8Ym9vbD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIFQmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBfc291cmNlOworICAgICAgICAgICAgc3MgPj4gX2Rlc3Q7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbmFibGUgdG8gY29udmVydCAiICsgX3NvdXJjZSArICIgdG8gZGVzdGluYXRpb24gdHlwZSIgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIHN0ZDo6c3RyaW5nJiBfZGVzdCApIHsKKyAgICAgICAgICAgIF9kZXN0ID0gX3NvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIGJvb2wmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTEMgPSBfc291cmNlOworICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNvdXJjZUxDLmJlZ2luKCksIHNvdXJjZUxDLmVuZCgpLCBzb3VyY2VMQy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICAgICAgICAgIGlmKCBzb3VyY2VMQyA9PSAieSIgfHwgc291cmNlTEMgPT0gIjEiIHx8IHNvdXJjZUxDID09ICJ0cnVlIiB8fCBzb3VyY2VMQyA9PSAieWVzIiB8fCBzb3VyY2VMQyA9PSAib24iICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmKCBzb3VyY2VMQyA9PSAibiIgfHwgc291cmNlTEMgPT0gIjAiIHx8IHNvdXJjZUxDID09ICJmYWxzZSIgfHwgc291cmNlTEMgPT0gIm5vIiB8fCBzb3VyY2VMQyA9PSAib2ZmIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJFeHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgYnV0IGRpZCBub3QgcmVjb2duaXNlOlxuICAnIiArIF9zb3VyY2UgKyAiJyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIHN0cnVjdCBJQXJnRnVuY3Rpb24geworICAgICAgICAgICAgdmlydHVhbCB+SUFyZ0Z1bmN0aW9uKCkge30KKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbigpICAgICAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uIGNvbnN0JiApID0gZGVmYXVsdDsKKyNlbmRpZgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbiogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgY2xhc3MgQm91bmRBcmdGdW5jdGlvbiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oKSA6IGZ1bmN0aW9uT2JqKCBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbjxDb25maWdUPiogX2Z1bmN0aW9uT2JqICkgOiBmdW5jdGlvbk9iaiggX2Z1bmN0aW9uT2JqICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgOiBmdW5jdGlvbk9iaiggb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiYgb3BlcmF0b3IgPSAoIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogbmV3RnVuY3Rpb25PYmogPSBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgICAgICBkZWxldGUgZnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmogPSBuZXdGdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+Qm91bmRBcmdGdW5jdGlvbigpIHsgZGVsZXRlIGZ1bmN0aW9uT2JqOyB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iai0+c2V0KCBjb25maWcsIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25PYmotPnRha2VzQXJnKCk7IH0KKworICAgICAgICAgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25PYmogIT0gQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogZnVuY3Rpb25PYmo7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IE51bGxCaW5kZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiwgc3RkOjpzdHJpbmcgY29uc3QmICkgY29uc3Qge30KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBOdWxsQmluZGVyKCAqdGhpcyApOyB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kRGF0YU1lbWJlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kRGF0YU1lbWJlciggTSBDOjoqIF9tZW1iZXIgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCBwLiptZW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmREYXRhTWVtYmVyKCAqdGhpcyApOyB9CisgICAgICAgICAgICBNIEM6OiogbWVtYmVyOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSggTSApICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPE0+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoIE0gKTsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kTnVsbGFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kTnVsbGFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmROdWxsYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSgpOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmogKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBCb3VuZEJpbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRCaW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmLCBUICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8VD46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmosIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPFQ+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kQmluYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmLCBUICk7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc1RvVmVjdG9yKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKSApOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICk7ICsraSApCisgICAgICAgICAgICBhcmdzW2ldID0gYXJndltpXTsKKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBjbGFzcyBQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGUgeyBOb25lLCBNYXliZVNob3J0T3B0LCBTbGFzaE9wdCwgU2hvcnRPcHQsIExvbmdPcHQsIFBvc2l0aW9uYWwgfTsKKyAgICAgICAgTW9kZSBtb2RlOworICAgICAgICBzdGQ6OnNpemVfdCBmcm9tOworICAgICAgICBib29sIGluUXVvdGVzOworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgVG9rZW4geworICAgICAgICAgICAgZW51bSBUeXBlIHsgUG9zaXRpb25hbCwgU2hvcnRPcHQsIExvbmdPcHQgfTsKKyAgICAgICAgICAgIFRva2VuKCBUeXBlIF90eXBlLCBzdGQ6OnN0cmluZyBjb25zdCYgX2RhdGEgKSA6IHR5cGUoIF90eXBlICksIGRhdGEoIF9kYXRhICkge30KKyAgICAgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgICAgIH07CisKKyAgICAgICAgUGFyc2VyKCkgOiBtb2RlKCBOb25lICksIGZyb20oIDAgKSwgaW5RdW90ZXMoIGZhbHNlICl7fQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZG91YmxlRGFzaCA9ICItLSI7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCkgJiYgYXJnc1tpXSAhPSBkb3VibGVEYXNoOyArK2kgKQorICAgICAgICAgICAgICAgIHBhcnNlSW50b1Rva2VucyggYXJnc1tpXSwgdG9rZW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBhcmcuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gYXJnW2ldOworICAgICAgICAgICAgICAgIGlmKCBjID09ICciJyApCisgICAgICAgICAgICAgICAgICAgIGluUXVvdGVzID0gIWluUXVvdGVzOworICAgICAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGFyZy5zaXplKCksICdcMCcsIGFyZywgdG9rZW5zICk7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNb2RlKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgc3dpdGNoKCBtb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9uZTogcmV0dXJuIGhhbmRsZU5vbmUoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIE1heWJlU2hvcnRPcHQ6IHJldHVybiBoYW5kbGVNYXliZVNob3J0T3B0KCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBTaG9ydE9wdDoKKyAgICAgICAgICAgICAgICBjYXNlIExvbmdPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBTbGFzaE9wdDogcmV0dXJuIGhhbmRsZU9wdCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFBvc2l0aW9uYWw6IHJldHVybiBoYW5kbGVQb3NpdGlvbmFsKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIG1vZGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU5vbmUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyApIHsKKyAgICAgICAgICAgICAgICBmcm9tID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogcmV0dXJuIE1heWJlU2hvcnRPcHQ7CisjaWZkZWYgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworICAgICAgICAgICAgICAgIGNhc2UgJy8nOiBmcm9tID0gaSsxOyByZXR1cm4gU2xhc2hPcHQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNYXliZVNob3J0T3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZyb20gPSBpKzE7IHJldHVybiBMb25nT3B0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gU2hvcnRPcHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnN0cmluZyggIjo9XDAiLCAzICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3B0TmFtZSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgaWYoIG1vZGUgPT0gU2hvcnRPcHQgKQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaiA9IDA7IGogPCBvcHROYW1lLnNpemUoKTsgKytqICkKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZS5zdWJzdHIoIGosIDEgKSApICk7CisgICAgICAgICAgICBlbHNlIGlmKCBtb2RlID09IFNsYXNoT3B0ICYmIG9wdE5hbWUuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6TG9uZ09wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZVBvc2l0aW9uYWwoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgfHwgc3RkOjpzdHJpbmcoICJcMCIsIDEgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlBvc2l0aW9uYWwsIGRhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBzdHJ1Y3QgQ29tbW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoKSB7fQorICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBib3VuZEZpZWxkKCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGJvdW5kRmllbGQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnN0cmluZyBkZXRhaWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYWNlaG9sZGVyOyAvLyBPbmx5IHZhbHVlIGlmIGJvdW5kRmllbGQgdGFrZXMgYW4gYXJnCisKKyAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhcGxhY2Vob2xkZXIuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoICFib3VuZEZpZWxkLmlzU2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbm90IGJvdW5kIiApOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgT3B0aW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzaG9ydE5hbWVzOworICAgICAgICBzdGQ6OnN0cmluZyBsb25nTmFtZTsKKworICAgICAgICBib29sIGhhc1Nob3J0TmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIHNob3J0TmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoIHNob3J0TmFtZXMuYmVnaW4oKSwgc2hvcnROYW1lcy5lbmQoKSwgc2hvcnROYW1lICkgIT0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIGhhc0xvbmdOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xvbmdOYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9sb25nTmFtZSA9PSBsb25nTmFtZTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMoKSA6IHBvc2l0aW9uKCAtMSApIHt9CisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gLTEgbWVhbnMgbm9uLXBvc2l0aW9uYWwgKGZsb2F0aW5nKQorCisgICAgICAgIGJvb2wgaXNGaXhlZFBvc2l0aW9uYWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gIT0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBjbGFzcyBDb21tYW5kTGluZSB7CisKKyAgICAgICAgc3RydWN0IEFyZyA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4sIE9wdGlvbkFyZ1Byb3BlcnRpZXMsIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgICAgIEFyZygpIHt9CisgICAgICAgICAgICBBcmcoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4oIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICAgICAgdXNpbmcgQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPjo6cGxhY2Vob2xkZXI7IC8vICFUQkQKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGJnTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0tIiArIGxvbmdOYW1lOworICAgICAgICAgICAgICAgIGlmKCAhc2hvcnROYW1lcy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHNob3J0TmFtZXNbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuICJwb3NpdGlvbmFsIGFyZ3MiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29tbWFuZHMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hvcnROYW1lcy5iZWdpbigpLCBpdEVuZCA9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItIiA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItLSIgPDwgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhcGxhY2Vob2xkZXIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IHBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgQ0xBUkFfQVVUT19QVFIoIEFyZyApIEFyZ0F1dG9QdHI7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgYWRkT3B0TmFtZSggQXJnJiBhcmcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG9wdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0tIiApICkgeworICAgICAgICAgICAgICAgIGlmKCAhYXJnLmxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgbG9uZyBvcHQgbWF5IGJlIHNwZWNpZmllZC4gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXJnLmxvbmdOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGFscmVhZHkgc3BlY2lmaWVkLCBub3cgYXR0ZW1wdGluZyB0byBhZGQgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0TmFtZSArICInIiApOworICAgICAgICAgICAgICAgIGFyZy5sb25nTmFtZSA9IG9wdE5hbWUuc3Vic3RyKCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItIiApICkKKyAgICAgICAgICAgICAgICBhcmcuc2hvcnROYW1lcy5wdXNoX2JhY2soIG9wdE5hbWUuc3Vic3RyKCAxICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG11c3QgYmVnaW4gd2l0aCAtIG9yIC0tLiBPcHRpb24gd2FzOiAnIiArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgfQorICAgICAgICBmcmllbmQgdm9pZCBzZXRQb3NpdGlvbmFsQXJnKCBBcmcmIGFyZywgaW50IHBvc2l0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJnLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXJnQnVpbGRlciggQXJnKiBhcmcgKSA6IG1fYXJnKCBhcmcgKSB7fQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbm9uLWJvb2xlYW4gZGF0YSBtZW1iZXIgKHJlcXVpcmVzIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIE0gQzo6KiBmaWVsZCwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCaW5kIGEgYm9vbGVhbiBkYXRhIG1lbWJlciAobm8gcGxhY2Vob2xkZXIgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBib29sIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8Qyxib29sPiggZmllbGQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIG5vbi1ib29sZWFuIGFyZ3VtZW50IChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBNICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIGJvb2xlYW4gYXJndW1lbnQgKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBib29sICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsYm9vbD4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgKHdpbGwgYmUgY2FsbGVkIGlmIG9wdCBpcyBwcmVzZW50KQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiBudWxsYXJ5TWV0aG9kKSgpICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmROdWxsYXJ5TWV0aG9kPEM+KCBudWxsYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiB1bmFyeUZ1bmN0aW9uKSggQyYgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlGdW5jdGlvbjxDPiggdW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiBiaW5hcnlGdW5jdGlvbikoIEMmLCBUICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kQmluYXJ5RnVuY3Rpb248QywgVD4oIGJpbmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRlc2NyaWJlKCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJnQnVpbGRlciYgZGV0YWlsKCBzdGQ6OnN0cmluZyBjb25zdCYgZGV0YWlsICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXRhaWwgPSBkZXRhaWw7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIEFyZyogbV9hcmc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgT3B0QnVpbGRlciA6IHB1YmxpYyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgT3B0QnVpbGRlciggQXJnKiBhcmcgKSA6IEFyZ0J1aWxkZXIoIGFyZyApIHt9CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBPcHRCdWlsZGVyJiBvdGhlciApIDogQXJnQnVpbGRlciggb3RoZXIgKSB7fQorCisgICAgICAgICAgICBPcHRCdWlsZGVyJiBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgICAgICBhZGRPcHROYW1lKCAqQXJnQnVpbGRlcjo6bV9hcmcsIG9wdE5hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29tbWFuZExpbmUoKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBuZXcgRGV0YWlsOjpOdWxsQmluZGVyPENvbmZpZ1Q+KCkgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCAwICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgQ29tbWFuZExpbmUoIENvbW1hbmRMaW5lIGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG90aGVyLm1fYm91bmRQcm9jZXNzTmFtZSApLAorICAgICAgICAgICAgbV9vcHRpb25zICggb3RoZXIubV9vcHRpb25zICksCisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzKCBvdGhlci5tX3Bvc2l0aW9uYWxBcmdzICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggb3RoZXIubV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2Vucyggb3RoZXIubV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG90aGVyLm1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoICpvdGhlci5tX2Zsb2F0aW5nQXJnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbW1hbmRMaW5lJiBzZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBib29sIHNob3VsZFRocm93ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyA9IHNob3VsZFRocm93OworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgT3B0QnVpbGRlciBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgIG1fb3B0aW9ucy5wdXNoX2JhY2soIEFyZygpICk7CisgICAgICAgICAgICBhZGRPcHROYW1lKCBtX29wdGlvbnMuYmFjaygpLCBvcHROYW1lICk7CisgICAgICAgICAgICBPcHRCdWlsZGVyIGJ1aWxkZXIoICZtX29wdGlvbnMuYmFjaygpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggaW50IHBvc2l0aW9uICkgeworICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBwb3NpdGlvbiwgQXJnKCkgKSApOworICAgICAgICAgICAgaWYoIHBvc2l0aW9uID4gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKQorICAgICAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICBzZXRQb3NpdGlvbmFsQXJnKCBtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSwgcG9zaXRpb24gKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggJm1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGlzIHdpdGggdGhlIF8gaW5zdGFuY2UKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBVbnBvc2l0aW9uYWxUYWcgKSB7CisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIHVucG9zaXRpb25hbCBhcmd1bWVudCBjYW4gYmUgYWRkZWQiICk7CisgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCkgKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggbV9mbG9hdGluZ0FyZy5nZXQoKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggTSBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIHZvaWQgKEM6OipfdW5hcnlNZXRob2QpKCBNICkgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIF91bmFyeU1ldGhvZCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvcHRVc2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCwgc3RkOjpzaXplX3Qgd2lkdGggPSBEZXRhaWw6OmNvbnNvbGVXaWR0aCApIGNvbnN0IHsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCksIGl0OworICAgICAgICAgICAgc3RkOjpzaXplX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IChzdGQ6Om1heCkoIG1heFdpZHRoLCBpdC0+Y29tbWFuZHMoKS5zaXplKCkgKTsKKworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCB1c2FnZSggaXQtPmNvbW1hbmRzKCksIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIG1heFdpZHRoK2luZGVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCApICk7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IGRlc2MoIGl0LT5kZXNjcmlwdGlvbiwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggd2lkdGggLSBtYXhXaWR0aCAtIDMgKSApOworCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IChzdGQ6Om1heCkoIHVzYWdlLnNpemUoKSwgZGVzYy5zaXplKCkgKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZUNvbCA9IGkgPCB1c2FnZS5zaXplKCkgPyB1c2FnZVtpXSA6ICIiOworICAgICAgICAgICAgICAgICAgICBvcyA8PCB1c2FnZUNvbDsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSA8IGRlc2Muc2l6ZSgpICYmICFkZXNjW2ldLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3MgIDw8IHN0ZDo6c3RyaW5nKCBpbmRlbnQgKyAyICsgbWF4V2lkdGggLSB1c2FnZUNvbC5zaXplKCksICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVzY1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgb3B0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3B0VXNhZ2UoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXJnU3lub3BzaXMoIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsgKytpICkgeworICAgICAgICAgICAgICAgIGlmKCBpID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBpICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgaXQtPnNlY29uZC5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm9uIGNvbnNlY3V0aXZlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggbm8gZmxvYXRpbmcgYXJncyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQgTm8gaW5kaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXJncworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICBvcyA8PCAiWzwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IC4uLl0iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ1N5bm9wc2lzKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgb3MgPDwgInVzYWdlOlxuICAiIDw8IHByb2NOYW1lIDw8ICIgIjsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvcyApOworICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBvcyA8PCAiIFtvcHRpb25zXVxuXG53aGVyZSBvcHRpb25zIGFyZTogXG4iOworICAgICAgICAgICAgICAgIG9wdFVzYWdlKCBvcywgMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZSggc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIHVzYWdlKCBvc3MsIHByb2NOYW1lICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlnVCBwYXJzZSggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzICkgY29uc3QgeworICAgICAgICAgICAgQ29uZmlnVCBjb25maWc7CisgICAgICAgICAgICBwYXJzZUludG8oIGFyZ3MsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBhcnNlSW50byggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZSA9IGFyZ3MuZW1wdHkoKSA/IHN0ZDo6c3RyaW5nKCkgOiBhcmdzWzBdOworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdFNsYXNoID0gcHJvY2Vzc05hbWUuZmluZF9sYXN0X29mKCAiL1xcIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUuc2V0KCBjb25maWcsIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB0b2tlbnM7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlSW50b1Rva2VucyggYXJncywgdG9rZW5zICk7CisgICAgICAgICAgICByZXR1cm4gcG9wdWxhdGUoIHRva2VucywgY29uZmlnICk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZSggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VucyA9IHBvcHVsYXRlT3B0aW9ucyggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRml4ZWRBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVPcHRpb25zKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgQXJnIGNvbnN0JiBhcmcgPSAqaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6U2hvcnRPcHQgJiYgYXJnLmhhc1Nob3J0TmFtZSggdG9rZW4uZGF0YSApICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6TG9uZ09wdCAmJiBhcmcuaGFzTG9uZ05hbWUoIHRva2VuLmRhdGEgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhcmcudGFrZXNBcmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gdG9rZW5zLnNpemUoKS0xIHx8IHRva2Vuc1tpKzFdLnR5cGUgIT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAiRXhwZWN0ZWQgYXJndW1lbnQgdG8gb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW5zWysraV0uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsICJ0cnVlIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIGV4LndoYXQoKSApICsgIlxuLSB3aGlsZSBwYXJzaW5nOiAoIiArIGFyZy5jb21tYW5kcygpICsgIikiICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsIHx8ICFtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyb3JzLmVtcHR5KCkgJiYgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJ1bnJlY29nbmlzZWQgb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhZXJyb3JzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlcnJvcnMuYmVnaW4oKSwgaXRFbmQgPSBlcnJvcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBlcnJvcnMuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGaXhlZEFyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IDE7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIHBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLT5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV9vcHRpb25zLmVtcHR5KCkgJiYgbV9wb3NpdGlvbmFsQXJncy5lbXB0eSgpICYmICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gb3B0aW9ucyBvciBhcmd1bWVudHMgc3BlY2lmaWVkIiApOworCisgICAgICAgICAgICBmb3IoIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yICBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpdC0+dmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IG1fYm91bmRQcm9jZXNzTmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXJnPiBtX29wdGlvbnM7CisgICAgICAgIHN0ZDo6bWFwPGludCwgQXJnPiBtX3Bvc2l0aW9uYWxBcmdzOworICAgICAgICBBcmdBdXRvUHRyIG1fZmxvYXRpbmdBcmc7CisgICAgICAgIGludCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsKKyAgICAgICAgYm9vbCBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENsYXJhCisKK1NUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyBSZXN0b3JlIENsYXJhJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKKyNpZmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyRmlyc3QoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsgY29uZmlnLmFib3J0QWZ0ZXIgPSAxOyB9CisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlclgoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IHggKSB7CisgICAgICAgIGlmKCB4IDwgMSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJWYWx1ZSBhZnRlciAteCBvciAtLWFib3J0QWZ0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIgKTsKKyAgICAgICAgY29uZmlnLmFib3J0QWZ0ZXIgPSB4OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRUZXN0T3JUYWdzKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGVzdFNwZWMgKSB7IGNvbmZpZy50ZXN0c09yVGFncy5wdXNoX2JhY2soIF90ZXN0U3BlYyApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkU2VjdGlvblRvUnVuKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApIHsgY29uZmlnLnNlY3Rpb25zVG9SdW4ucHVzaF9iYWNrKCBzZWN0aW9uTmFtZSApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkUmVwb3J0ZXJOYW1lKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmVwb3J0ZXJOYW1lICkgeyBjb25maWcucmVwb3J0ZXJOYW1lcy5wdXNoX2JhY2soIF9yZXBvcnRlck5hbWUgKTsgfQorCisgICAgaW5saW5lIHZvaWQgYWRkV2FybmluZyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3dhcm5pbmcgKSB7CisgICAgICAgIGlmKCBfd2FybmluZyA9PSAiTm9Bc3NlcnRpb25zIiApCisgICAgICAgICAgICBjb25maWcud2FybmluZ3MgPSBzdGF0aWNfY2FzdDxXYXJuQWJvdXQ6OldoYXQ+KCBjb25maWcud2FybmluZ3MgfCBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9ucyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgd2FybmluZzogJyIgKyBfd2FybmluZyArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0T3JkZXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIG9yZGVyICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAibGV4aWNhbCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJyYW5kb20iLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgb3JkZXJpbmc6ICciICsgb3JkZXIgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFJuZ1NlZWQoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlZWQgKSB7CisgICAgICAgIGlmKCBzZWVkID09ICJ0aW1lIiApIHsKKyAgICAgICAgICAgIGNvbmZpZy5ybmdTZWVkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Piggc3RkOjp0aW1lKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IHNlZWQ7CisgICAgICAgICAgICBzcyA+PiBjb25maWcucm5nU2VlZDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkFyZ3VtZW50IHRvIC0tcm5nLXNlZWQgc2hvdWxkIGJlIHRoZSB3b3JkICd0aW1lJyBvciBhIG51bWJlciIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRWZXJib3NpdHkoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IGxldmVsICkgeworICAgICAgICAvLyAhVEJEOiBhY2NlcHQgc3RyaW5ncz8KKyAgICAgICAgY29uZmlnLnZlcmJvc2l0eSA9IHN0YXRpY19jYXN0PFZlcmJvc2l0eTo6TGV2ZWw+KCBsZXZlbCApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRTaG93RHVyYXRpb25zKCBDb25maWdEYXRhJiBjb25maWcsIGJvb2wgX3Nob3dEdXJhdGlvbnMgKSB7CisgICAgICAgIGNvbmZpZy5zaG93RHVyYXRpb25zID0gX3Nob3dEdXJhdGlvbnMKKyAgICAgICAgICAgID8gU2hvd0R1cmF0aW9uczo6QWx3YXlzCisgICAgICAgICAgICA6IFNob3dEdXJhdGlvbnM6Ok5ldmVyOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRVc2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgICAgICBzdGQ6OnN0cmluZyBtb2RlID0gdG9Mb3dlciggdmFsdWUgKTsKKworICAgICAgICBpZiggbW9kZSA9PSAieWVzIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gIm5vIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpObzsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAiYXV0byIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiY29sb3VyIG1vZGUgbXVzdCBiZSBvbmUgb2Y6IGF1dG8sIHllcyBvciBubyIgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZm9yY2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsKKyAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBsb2FkVGVzdE5hbWVzRnJvbUZpbGUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9maWxlbmFtZSApIHsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBmKCBfZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggIWYuaXNfb3BlbigpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5hYmxlIHRvIGxvYWQgaW5wdXQgZmlsZTogIiArIF9maWxlbmFtZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxpbmUoIGYsIGxpbmUgKSApIHsKKyAgICAgICAgICAgIGxpbmUgPSB0cmltKGxpbmUpOworICAgICAgICAgICAgaWYoICFsaW5lLmVtcHR5KCkgJiYgIXN0YXJ0c1dpdGgoIGxpbmUsICcjJyApICkgeworICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggbGluZSwgJyInICkgKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyInICsgbGluZSArICciJzsKKyAgICAgICAgICAgICAgICBhZGRUZXN0T3JUYWdzKCBjb25maWcsIGxpbmUgKyAnLCcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgeworCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBDbGFyYTsKKyAgICAgICAgQ29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY2xpOworCisgICAgICAgIGNsaS5iaW5kUHJvY2Vzc05hbWUoICZDb25maWdEYXRhOjpwcm9jZXNzTmFtZSApOworCisgICAgICAgIGNsaVsiLT8iXVsiLWgiXVsiLS1oZWxwIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImRpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24iICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0hlbHAgKTsKKworICAgICAgICBjbGlbIi1sIl1bIi0tbGlzdC10ZXN0cyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0cyApOworCisgICAgICAgIGNsaVsiLXQiXVsiLS1saXN0LXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGFncyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGFncyApOworCisgICAgICAgIGNsaVsiLXMiXVsiLS1zdWNjZXNzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImluY2x1ZGUgc3VjY2Vzc2Z1bCB0ZXN0cyBpbiBvdXRwdXQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd1N1Y2Nlc3NmdWxUZXN0cyApOworCisgICAgICAgIGNsaVsiLWIiXVsiLS1icmVhayJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJicmVhayBpbnRvIGRlYnVnZ2VyIG9uIGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvdWxkRGVidWdCcmVhayApOworCisgICAgICAgIGNsaVsiLWUiXVsiLS1ub3Rocm93Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNraXAgZXhjZXB0aW9uIHRlc3RzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5vVGhyb3cgKTsKKworICAgICAgICBjbGlbIi1pIl1bIi0taW52aXNpYmxlcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IGludmlzaWJsZXMgKHRhYnMsIG5ld2xpbmVzKSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SW52aXNpYmxlcyApOworCisgICAgICAgIGNsaVsiLW8iXVsiLS1vdXQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAib3V0cHV0IGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om91dHB1dEZpbGVuYW1lLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItciJdWyItLXJlcG9ydGVyIl0KKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibmFtZVs6ZmlsZW5hbWVdIiApCisgICAgICAgICAgICAuZGVzY3JpYmUoICJyZXBvcnRlciB0byB1c2UgKGRlZmF1bHRzIHRvIGNvbnNvbGUpIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFJlcG9ydGVyTmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItbiJdWyItLW5hbWUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic3VpdGUgbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpuYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1hIl1bIi0tYWJvcnQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYXQgZmlyc3QgZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyRmlyc3QgKTsKKworICAgICAgICBjbGlbIi14Il1bIi0tYWJvcnR4Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGFmdGVyIHggZmFpbHVyZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlclgsICJuby4gZmFpbHVyZXMiICk7CisKKyAgICAgICAgY2xpWyItdyJdWyItLXdhcm4iXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZW5hYmxlIHdhcm5pbmdzIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICk7CisKKy8vIC0gbmVlZHMgdXBkYXRpbmcgaWYgcmVpbnN0YXRlZAorLy8gICAgICAgIGNsaS5pbnRvKCAmc2V0VmVyYm9zaXR5ICkKKy8vICAgICAgICAgICAgLmRlc2NyaWJlKCAibGV2ZWwgb2YgdmVyYm9zaXR5ICgwPW5vIG91dHB1dCkiICkKKy8vICAgICAgICAgICAgLnNob3J0T3B0KCAidiIpCisvLyAgICAgICAgICAgIC5sb25nT3B0KCAidmVyYm9zaXR5IiApCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggImxldmVsIiApOworCisgICAgICAgIGNsaVtfXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAid2hpY2ggdGVzdCBvciB0ZXN0cyB0byB1c2UiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkVGVzdE9yVGFncywgInRlc3QgbmFtZSwgcGF0dGVybiBvciB0YWdzIiApOworCisgICAgICAgIGNsaVsiLWQiXVsiLS1kdXJhdGlvbnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRTaG93RHVyYXRpb25zLCAieWVzfG5vIiApOworCisgICAgICAgIGNsaVsiLWYiXVsiLS1pbnB1dC1maWxlIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxvYWQgdGVzdCBuYW1lcyB0byBydW4gZnJvbSBhIGZpbGUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItIyJdWyItLWZpbGVuYW1lcy1hcy10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFkZHMgYSB0YWcgZm9yIHRoZSBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpmaWxlbmFtZXNBc1RhZ3MgKTsKKworICAgICAgICBjbGlbIi1jIl1bIi0tc2VjdGlvbiJdCisgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQorICAgICAgICAgICAgICAgIC5iaW5kKCAmYWRkU2VjdGlvblRvUnVuLCAic2VjdGlvbiBuYW1lIiApOworCisgICAgICAgIC8vIExlc3MgY29tbW9uIGNvbW1hbmRzIHdoaWNoIGRvbid0IGhhdmUgYSBzaG9ydCBmb3JtCisgICAgICAgIGNsaVsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIG5hbWVzIG9ubHkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3ROYW1lc09ubHkgKTsKKworICAgICAgICBjbGlbIi0tbGlzdC1yZXBvcnRlcnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwgcmVwb3J0ZXJzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RSZXBvcnRlcnMgKTsKKworICAgICAgICBjbGlbIi0tb3JkZXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAidGVzdCBjYXNlIG9yZGVyIChkZWZhdWx0cyB0byBkZWNsKSIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRPcmRlciwgImRlY2x8bGV4fHJhbmQiICk7CisKKyAgICAgICAgY2xpWyItLXJuZy1zZWVkIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNldCBhIHNwZWNpZmljIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIiApCisgICAgICAgICAgICAuYmluZCggJnNldFJuZ1NlZWQsICIndGltZSd8bnVtYmVyIiApOworCisgICAgICAgIGNsaVsiLS1mb3JjZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZm9yY2UgY29sb3VyaXNlZCBvdXRwdXQgKGRlcHJlY2F0ZWQpIiApCisgICAgICAgICAgICAuYmluZCggJmZvcmNlQ29sb3VyICk7CisKKyAgICAgICAgY2xpWyItLXVzZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdWxkIG91dHB1dCBiZSBjb2xvdXJpc2VkIiApCisgICAgICAgICAgICAuYmluZCggJnNldFVzZUNvbG91ciwgInllc3xubyIgKTsKKworICAgICAgICByZXR1cm4gY2xpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9saXN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTElTVF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVYVF9IX0lOQ0xVREVECisKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworI2RlZmluZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL3RiY190ZXh0X2Zvcm1hdC5oCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZm5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyMgaWZkZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgIGlmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUJlZm9yZUNoYXJzID0gIlsoezxcdCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVBZnRlckNoYXJzID0gIl0pfT4tLC4vfFxcIjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzID0gIiBcblxyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbml0aWFsSW5kZW50LCAnICcgKQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgaXQgPSBfc3RyLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBpdGVyYXRvciBzdHJFbmQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICB3aGlsZSggaXQgIT0gc3RyRW5kICkgeworCisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggc3RhdGljX2Nhc3Q8c2l6ZV90Piggc3RyRW5kLWl0ICksIF9hdHRyLndpZHRoLXN0YXRpY19jYXN0PHNpemVfdD4oIGluZGVudC5zaXplKCkgKSApOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0RW5kID0gaXQrd2lkdGg7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXh0ID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV3TGluZSA9IHN0ZDo6ZmluZCggaXQsIGl0RW5kLCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIGl0TmV3TGluZSAhPSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gaXROZXdMaW5lOworCisgICAgICAgICAgICAgICAgaWYoIGl0RW5kICE9IHN0ckVuZCAgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRXcmFwUG9pbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgZmluZEl0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3cmFwcGFibGVBZnRlckNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBmaW5kSXQgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaW5kSXQgPiBpdCAmJiB3cmFwcGFibGVCZWZvcmVDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmluZEl0ID09IGl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggIWZvdW5kV3JhcFBvaW50ICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmb3VuZFdyYXBQb2ludCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGdvb2Qgd3JhcCBjaGFyLCBzbyB3ZSdsbCBicmVhayBtaWQgd29yZCBhbmQgYWRkIGEgaHlwaGVuCisgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXRFbmQgPiBpdCAmJiB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqKGl0RW5kLTEpICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBpbmRlbnQgKyBzdGQ6OnN0cmluZyggaXQsIGl0RW5kICkgKyBzdWZmaXggKTsKKworICAgICAgICAgICAgICAgIGlmKCBpbmRlbnQuc2l6ZSgpICE9IF9hdHRyLmluZGVudCApCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworICAgICAgICAgICAgICAgIGl0ID0gaXROZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjdW5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB1c2luZyBUYmM6OlRleHQ7CisgICAgdXNpbmcgVGJjOjpUZXh0QXR0cmlidXRlczsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29sb3VyIHsKKyAgICAgICAgZW51bSBDb2RlIHsKKyAgICAgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgICAgICBXaGl0ZSwKKyAgICAgICAgICAgIFJlZCwKKyAgICAgICAgICAgIEdyZWVuLAorICAgICAgICAgICAgQmx1ZSwKKyAgICAgICAgICAgIEN5YW4sCisgICAgICAgICAgICBZZWxsb3csCisgICAgICAgICAgICBHcmV5LAorCisgICAgICAgICAgICBCcmlnaHQgPSAweDEwLAorCisgICAgICAgICAgICBCcmlnaHRSZWQgPSBCcmlnaHQgfCBSZWQsCisgICAgICAgICAgICBCcmlnaHRHcmVlbiA9IEJyaWdodCB8IEdyZWVuLAorICAgICAgICAgICAgTGlnaHRHcmV5ID0gQnJpZ2h0IHwgR3JleSwKKyAgICAgICAgICAgIEJyaWdodFdoaXRlID0gQnJpZ2h0IHwgV2hpdGUsCisKKyAgICAgICAgICAgIC8vIEJ5IGludGVudGlvbgorICAgICAgICAgICAgRmlsZU5hbWUgPSBMaWdodEdyZXksCisgICAgICAgICAgICBXYXJuaW5nID0gWWVsbG93LAorICAgICAgICAgICAgUmVzdWx0RXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBSZXN1bHRTdWNjZXNzID0gQnJpZ2h0R3JlZW4sCisgICAgICAgICAgICBSZXN1bHRFeHBlY3RlZEZhaWx1cmUgPSBXYXJuaW5nLAorCisgICAgICAgICAgICBFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFN1Y2Nlc3MgPSBHcmVlbiwKKworICAgICAgICAgICAgT3JpZ2luYWxFeHByZXNzaW9uID0gQ3lhbiwKKyAgICAgICAgICAgIFJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gWWVsbG93LAorCisgICAgICAgICAgICBTZWNvbmRhcnlUZXh0ID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgSGVhZGVycyA9IFdoaXRlCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVXNlIGNvbnN0cnVjdGVkIG9iamVjdCBmb3IgUkFJSSBndWFyZAorICAgICAgICBDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKTsKKyAgICAgICAgQ29sb3VyKCBDb2xvdXIgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5Db2xvdXIoKTsKKworICAgICAgICAvLyBVc2Ugc3RhdGljIG1ldGhvZCBmb3Igb25lLXNob3QgY2hhbmdlcworICAgICAgICBzdGF0aWMgdm9pZCB1c2UoIENvZGUgX2NvbG91ckNvZGUgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9tb3ZlZDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29uc3QmICkgeyByZXR1cm4gb3M7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVQT1JURVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJDb25maWcgeworICAgICAgICBleHBsaWNpdCBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZyApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9mdWxsQ29uZmlnLT5zdHJlYW0oKSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZywgc3RkOjpvc3RyZWFtJiBfc3RyZWFtICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX3N0cmVhbSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ICAgIHsgcmV0dXJuICptX3N0cmVhbTsgfQorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gZnVsbENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZpZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBtX3N0cmVhbTsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fZnVsbENvbmZpZzsKKyAgICB9OworCisgICAgc3RydWN0IFJlcG9ydGVyUHJlZmVyZW5jZXMgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzKCkKKyAgICAgICAgOiBzaG91bGRSZWRpcmVjdFN0ZE91dCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRPdXQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IExhenlTdGF0IDogT3B0aW9uPFQ+IHsKKyAgICAgICAgTGF6eVN0YXQoKSA6IHVzZWQoIGZhbHNlICkge30KKyAgICAgICAgTGF6eVN0YXQmIG9wZXJhdG9yPSggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpvcGVyYXRvcj0oIF92YWx1ZSApOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBPcHRpb248VD46OnJlc2V0KCk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB1c2VkOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1bkluZm8geworICAgICAgICBUZXN0UnVuSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgOiBuYW1lKCBfbmFtZSApIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgfTsKKyAgICBzdHJ1Y3QgR3JvdXBJbmZvIHsKKyAgICAgICAgR3JvdXBJbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3Vwc0NvdW50ICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBncm91cEluZGV4KCBfZ3JvdXBJbmRleCApLAorICAgICAgICAgICAgZ3JvdXBzQ291bnRzKCBfZ3JvdXBzQ291bnQgKQorICAgICAgICB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50czsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblN0YXRzIHsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBjb25zdCYgX2luZm9NZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscyApCisgICAgICAgIDogICBhc3NlcnRpb25SZXN1bHQoIF9hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgIGluZm9NZXNzYWdlcyggX2luZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblJlc3VsdC5oYXNNZXNzYWdlKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSBtZXNzYWdlIGludG8gbWVzc2FnZXMgbGlzdC4KKyAgICAgICAgICAgICAgICAvLyAhVEJEIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lIGVhcmxpZXIsIHNvbWV3aGVyZQorICAgICAgICAgICAgICAgIE1lc3NhZ2VCdWlsZGVyIGJ1aWxkZXIoIGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCksIGFzc2VydGlvblJlc3VsdC5nZXRTb3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyIDw8IGFzc2VydGlvblJlc3VsdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisKKyAgICAgICAgICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWlsZGVyLm1faW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkFzc2VydGlvblN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGluZm9NZXNzYWdlczsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25TdGF0cyB7CisgICAgICAgIFNlY3Rpb25TdGF0cyggICBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzIGNvbnN0JiBfYXNzZXJ0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIDogICBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksCisgICAgICAgICAgICBhc3NlcnRpb25zKCBfYXNzZXJ0aW9ucyApLAorICAgICAgICAgICAgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApLAorICAgICAgICAgICAgbWlzc2luZ0Fzc2VydGlvbnMoIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25TdGF0cygpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VTdGF0cyB7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogdGVzdEluZm8oIF90ZXN0SW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKKyAgICAgICAgICAgIHN0ZEVyciggX3N0ZEVyciApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RDYXNlU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RHcm91cFN0YXRzIHsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RHcm91cFN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgR3JvdXBJbmZvIGdyb3VwSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7CisgICAgICAgIFRlc3RSdW5TdGF0cyggICBUZXN0UnVuSW5mbyBjb25zdCYgX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBydW5JbmZvKCBfcnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJ1blN0YXRzKCk7CisKKyMgIGlmbmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmIF9vdGhlciApCisgICAgICAgIDogICBydW5JbmZvKCBfb3RoZXIucnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfb3RoZXIudG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX290aGVyLmFib3J0aW5nICkKKyAgICAgICAge30KKyMgIGVsc2UKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdFJ1bkluZm8gcnVuSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnM7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbWluZ1JlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW1pbmdSZXBvcnRlcigpOworCisgICAgICAgIC8vIEltcGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2Q6CisgICAgICAgIC8vIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgPSAwOworCisgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgeyByZXR1cm4gQ0FUQ0hfTlVMTDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJGYWN0b3J5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeSB7CisgICAgICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IEZhY3RvcnlNYXA7CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gTGlzdGVuZXJzOworCisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlclJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApOworCit9CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0cyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJNYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRlc3QgY2FzZXM6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBUZXh0QXR0cmlidXRlcyBuYW1lQXR0ciwgdGFnc0F0dHI7CisgICAgICAgIG5hbWVBdHRyLnNldEluaXRpYWxJbmRlbnQoIDIgKS5zZXRJbmRlbnQoIDQgKTsKKyAgICAgICAgdGFnc0F0dHIuc2V0SW5kZW50KCA2ICk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXIgPSB0ZXN0Q2FzZUluZm8uaXNIaWRkZW4oKQorICAgICAgICAgICAgICAgID8gQ29sb3VyOjpTZWNvbmRhcnlUZXh0CisgICAgICAgICAgICAgICAgOiBDb2xvdXI6Ok5vbmU7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby5uYW1lLCBuYW1lQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VJbmZvLnRhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nLCB0YWdzQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJ0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJtYXRjaGluZyB0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0c05hbWVzT25seSggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRlc3RDYXNlSW5mby5uYW1lLCAnIycgKSApCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICciJyA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCAnIicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGFnSW5mbyB7CisgICAgICAgIFRhZ0luZm8oKSA6IGNvdW50ICggMCApIHt9CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgc3BlbGxpbmdzLmluc2VydCggc3BlbGxpbmcgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhbGwoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvdXQ7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzcGVsbGluZ3MuYmVnaW4oKSwgaXRFbmQgPSBzcGVsbGluZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIG91dCArPSAiWyIgKyAqaXQgKyAiXSI7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7CisgICAgICAgIHN0ZDo6c2l6ZV90IGNvdW50OworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRhZ3MoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlRhZ3MgZm9yIG1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGFnczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPiB0YWdDb3VudHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yICB0YWdJdCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0l0RW5kID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0l0ICE9IHRhZ0l0RW5kOworICAgICAgICAgICAgICAgICAgICArK3RhZ0l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ05hbWUgPSAqdGFnSXQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlciggdGFnTmFtZSApOworICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6aXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5maW5kKCBsY2FzZVRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3VudHMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGxjYXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKKyAgICAgICAgICAgICAgICBjb3VudEl0LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6Y29uc3RfaXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRJdEVuZCA9IHRhZ0NvdW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb3VudEl0ICE9IGNvdW50SXRFbmQ7CisgICAgICAgICAgICAgICAgKytjb3VudEl0ICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiICAiIDw8IHN0ZDo6c2V0dygyKSA8PCBjb3VudEl0LT5zZWNvbmQuY291bnQgPDwgIiAgIjsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggY291bnRJdC0+c2Vjb25kLmFsbCgpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIG9zcy5zdHIoKS5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMTAgKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBvc3Muc3RyKCkgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCB0YWdDb3VudHMuc2l6ZSgpLCAidGFnIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gdGFnQ291bnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVycyggQ29uZmlnIGNvbnN0JiAvKmNvbmZpZyovICkgeworICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBdmFpbGFibGUgcmVwb3J0ZXJzOlxuIjsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXAgY29uc3QmIGZhY3RvcmllcyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IGZhY3Rvcmllcy5iZWdpbigpLCBpdEVuZCA9IGZhY3Rvcmllcy5lbmQoKSwgaXQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1heE5hbWVMZW4gPSAwOworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBtYXhOYW1lTGVuID0gKHN0ZDo6bWF4KSggbWF4TmFtZUxlbiwgaXQtPmZpcnN0LnNpemUoKSApOworCisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBpdC0+c2Vjb25kLT5nZXREZXNjcmlwdGlvbigpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggNyttYXhOYW1lTGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVMZW4tOCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0CisgICAgICAgICAgICAgICAgICAgIDw8ICc6JworICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyggbWF4TmFtZUxlbiAtIGl0LT5maXJzdC5zaXplKCkgKyAyLCAnICcgKQorICAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3QoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZENvdW50OworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0cygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0cyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3ROYW1lc09ubHkoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHNOYW1lc09ubHkoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUYWdzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRhZ3MoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RSZXBvcnRlcnMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0UmVwb3J0ZXJzKCBjb25maWcgKTsKKyAgICAgICAgcmV0dXJuIGxpc3RlZENvdW50OworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ydW5fY29udGV4dC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3RyYWNrZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfVFJBQ0tFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisKKyAgICBzdHJ1Y3QgTmFtZUFuZExvY2F0aW9uIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbG9jYXRpb247CisKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbG9jYXRpb24gKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGxvY2F0aW9uKCBfbG9jYXRpb24gKQorICAgICAgICB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVRyYWNrZXIgOiBTaGFyZWRJbXBsPD4geworICAgICAgICB2aXJ0dWFsIH5JVHJhY2tlcigpOworCisgICAgICAgIC8vIHN0YXRpYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gZHluYW1pYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIG9yIGZhaWxlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCA9IDA7IC8vIFN0YXJ0ZWQgYnV0IG5vdCBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgPSAwOworCisgICAgICAgIC8vIGFjdGlvbnMKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgPSAwOworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOworCisgICAgICAgIC8vIERlYnVnLyBjaGVja2luZworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyAgVHJhY2tlckNvbnRleHQgeworCisgICAgICAgIGVudW0gUnVuU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCisgICAgICAgIH07CisKKyAgICAgICAgUHRyPElUcmFja2VyPiBtX3Jvb3RUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgUnVuU3RhdGUgbV9ydW5TdGF0ZTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQmIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0IHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrZXJDb250ZXh0KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFRyYWNrZXIoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorCisgICAgICAgIElUcmFja2VyJiBzdGFydFJ1bigpOworCisgICAgICAgIHZvaWQgZW5kUnVuKCkgeworICAgICAgICAgICAgbV9yb290VHJhY2tlci5yZXNldCgpOworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBtX3Jvb3RUcmFja2VyLmdldCgpOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvbXBsZXRlQ3ljbGUoKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKyAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyKCkgeworICAgICAgICAgICAgcmV0dXJuICptX2N1cnJlbnRUcmFja2VyOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0Q3VycmVudFRyYWNrZXIoIElUcmFja2VyKiB0cmFja2VyICkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IHRyYWNrZXI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgVHJhY2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51bSBDeWNsZVN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJlbiwKKyAgICAgICAgICAgIE5lZWRzQW5vdGhlclJ1biwKKyAgICAgICAgICAgIENvbXBsZXRlZFN1Y2Nlc3NmdWxseSwKKyAgICAgICAgICAgIEZhaWxlZAorICAgICAgICB9OworICAgICAgICBjbGFzcyBUcmFja2VySGFzTmFtZSB7CisgICAgICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRyYWNrZXJIYXNOYW1lKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIDogbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yICgpKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiB0cmFja2VyICkgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5uYW1lID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubG9jYXRpb24gPT0gbV9uYW1lQW5kTG9jYXRpb24ubG9jYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElUcmFja2VyPiA+IENoaWxkcmVuOworICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIFRyYWNrZXJDb250ZXh0JiBtX2N0eDsKKyAgICAgICAgSVRyYWNrZXIqIG1fcGFyZW50OworICAgICAgICBDaGlsZHJlbiBtX2NoaWxkcmVuOworICAgICAgICBDeWNsZVN0YXRlIG1fcnVuU3RhdGU7CisgICAgcHVibGljOgorICAgICAgICBUcmFja2VyQmFzZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApLAorICAgICAgICAgICAgbV9jdHgoIGN0eCApLAorICAgICAgICAgICAgbV9wYXJlbnQoIHBhcmVudCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRyYWNrZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSB8fCBtX3J1blN0YXRlID09IEZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gIW1fY2hpbGRyZW4uZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLnB1c2hfYmFjayggY2hpbGQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDaGlsZHJlbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoIG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9jaGlsZHJlbi5lbmQoKSwgVHJhY2tlckhhc05hbWUoIG5hbWVBbmRMb2NhdGlvbiApICk7CisgICAgICAgICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkgKQorICAgICAgICAgICAgICAgID8gaXQtPmdldCgpCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsgLy8gU2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKKyAgICAgICAgICAgIHJldHVybiAqbV9wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gKSB7CisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICAgICAgbW92ZVRvVGhpcygpOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIC8vIENsb3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdlbmVyYXRvcnMpCisgICAgICAgICAgICB3aGlsZSggJm1fY3R4LmN1cnJlbnRUcmFja2VyKCkgIT0gdGhpcyApCisgICAgICAgICAgICAgICAgbV9jdHguY3VycmVudFRyYWNrZXIoKS5jbG9zZSgpOworCisgICAgICAgICAgICBzd2l0Y2goIG1fcnVuU3RhdGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3RTdGFydGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgorICAgICAgICAgICAgICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiSWxsb2dpY2FsIHN0YXRlIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBOZWVkc0Fub3RoZXJSdW46CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOzsKKworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nOgorICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZ0NoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICBpZiggbV9jaGlsZHJlbi5lbXB0eSgpIHx8IG1fY2hpbGRyZW4uYmFjaygpLT5pc0NvbXBsZXRlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5leHBlY3RlZCBzdGF0ZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCk7CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTmVlZHNBbm90aGVyUnVuOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBtb3ZlVG9QYXJlbnQoKSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggbV9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG1vdmVUb1RoaXMoKSB7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggdGhpcyApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFNlY3Rpb25UcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fZmlsdGVyczsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwYXJlbnQgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoICFwYXJlbnQtPmlzU2VjdGlvblRyYWNrZXIoKSApCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAgICAgICAgU2VjdGlvblRyYWNrZXImIHBhcmVudFNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCAqcGFyZW50ICk7CisgICAgICAgICAgICAgICAgYWRkTmV4dEZpbHRlcnMoIHBhcmVudFNlY3Rpb24ubV9maWx0ZXJzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgU2VjdGlvblRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAgICAgICAgICAgU2VjdGlvblRyYWNrZXIqIHNlY3Rpb24gPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gbmV3IFNlY3Rpb25UcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHNlY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgKQorICAgICAgICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKKyAgICAgICAgICAgIHJldHVybiAqc2VjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdHJ5T3BlbigpIHsKKyAgICAgICAgICAgIGlmKCAhaXNDb21wbGV0ZSgpICYmIChtX2ZpbHRlcnMuZW1wdHkoKSB8fCBtX2ZpbHRlcnNbMF0uZW1wdHkoKSB8fCAgbV9maWx0ZXJzWzBdID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgKSApCisgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRJbml0aWFsRmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoICFmaWx0ZXJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFJvb3QgLSBzaG91bGQgbmV2ZXIgYmUgY29uc3VsdGVkCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFRlc3QgQ2FzZSAtIG5vdCBhIHNlY3Rpb24gZmlsdGVyCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCBmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZE5leHRGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggZmlsdGVycy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksICsrZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgSW5kZXhUcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgaW50IG1fc2l6ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50LCBpbnQgc2l6ZSApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApLAorICAgICAgICAgICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2luZGV4KCAtMSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgfkluZGV4VHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgSW5kZXhUcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgaW50IHNpemUgKSB7CisgICAgICAgICAgICBJbmRleFRyYWNrZXIqIHRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc0luZGV4VHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0YXRpY19jYXN0PEluZGV4VHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBuZXcgSW5kZXhUcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyLCBzaXplICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSAmJiAhdHJhY2tlci0+aXNDb21wbGV0ZSgpICkgeworICAgICAgICAgICAgICAgIGlmKCB0cmFja2VyLT5tX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICYmIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gTmVlZHNBbm90aGVyUnVuICkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyLT5vcGVuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAqdHJhY2tlcjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgICAgICB2b2lkIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAgICAgICAgbV9jaGlsZHJlbi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgVHJhY2tlckJhc2U6OmNsb3NlKCk7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgJiYgbV9pbmRleCA8IG1fc2l6ZS0xICkKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBJVHJhY2tlciYgVHJhY2tlckNvbnRleHQ6OnN0YXJ0UnVuKCkgeworICAgICAgICBtX3Jvb3RUcmFja2VyID0gbmV3IFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24oICJ7cm9vdH0iLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApLCAqdGhpcywgQ0FUQ0hfTlVMTCApOworICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgcmV0dXJuICptX3Jvb3RUcmFja2VyOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZworCit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlRyYWNrZXJDb250ZXh0OwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6U2VjdGlvblRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJbmRleFRyYWNrZXI7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK0NBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9mYXRhbF9jb25kaXRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9GQVRBTF9DT05ESVRJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVwb3J0IHRoZSBlcnJvciBjb25kaXRpb24KKyAgICBpbmxpbmUgdm9pZCByZXBvcnRGYXRhbCggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgIElDb250ZXh0JiBjb250ZXh0ID0gQ2F0Y2g6OmdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlID0gY29udGV4dC5nZXRSZXN1bHRDYXB0dXJlKCk7CisgICAgICAgIHJlc3VsdENhcHR1cmUtPmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIG1lc3NhZ2UgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfUExBVEZPUk1fV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2luZG93c19oX3Byb3h5LmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lORE9XU19IX1BST1hZX0hfSU5DTFVERUQKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfX0FGWERMTAorI2luY2x1ZGUgPEFmeFdpbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisKKyMgIGlmICFkZWZpbmVkICggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggaXMgZGVmaW5lZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeyBEV09SRCBpZDsgY29uc3QgY2hhciogbmFtZTsgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgLy8gVGhlcmUgaXMgbm8gMS0xIG1hcHBpbmcgYmV0d2VlbiBzaWduYWxzIGFuZCB3aW5kb3dzIGV4Y2VwdGlvbnMuCisgICAgLy8gV2luZG93cyBjYW4gZWFzaWx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gU08gYW5kIFNpZ1NlZ1YsCisgICAgLy8gYnV0IFNpZ0ludCwgU2lnVGVybSwgZXRjIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICB7IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVywgIlNJR1NFR1YgLSBTdGFjayBvdmVyZmxvdyIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPLCAiRGl2aWRlIGJ5IHplcm8gZXJyb3IiIH0sCisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBMT05HIENBTExCQUNLIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChFeGNlcHRpb25JbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUgPT0gc2lnbmFsRGVmc1tpXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbChzaWduYWxEZWZzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGl0cyBub3QgYW4gZXhjZXB0aW9uIHdlIGNhcmUgYWJvdXQsIHBhc3MgaXQgYWxvbmcuCisgICAgICAgICAgICAvLyBUaGlzIHN0b3BzIHVzIGZyb20gZWF0aW5nIGRlYnVnZ2VyIGJyZWFrcyBldGMuCisgICAgICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIDMyayBzZWVtcyBlbm91Z2ggZm9yIENhdGNoIHRvIGhhbmRsZSBzdGFjayBvdmVyZmxvdywKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgdmFsdWUgd2FzIGZvdW5kIGV4cGVyaW1lbnRhbGx5LCBzbyB0aGVyZSBpcyBubyBzdHJvbmcgZ3VhcmFudGVlCisgICAgICAgICAgICBndWFyYW50ZWVTaXplID0gMzIgKiAxMDI0OworICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBhcyBmaXJzdCBoYW5kbGVyIGluIGN1cnJlbnQgY2hhaW4KKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24pOworICAgICAgICAgICAgLy8gUGFzcyBpbiBndWFyYW50ZWUgc2l6ZSB0byBiZSBmaWxsZWQKKyAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYgKGlzU2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBoYW5kbGVyIGFuZCByZXN0b3JlIHRoZSBvbGQgZ3VhcmFudGVlCisgICAgICAgICAgICAgICAgUmVtb3ZlVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpOworICAgICAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIFVMT05HIGd1YXJhbnRlZVNpemU7CisgICAgICAgIHN0YXRpYyBQVk9JRCBleGNlcHRpb25IYW5kbGVySGFuZGxlOworICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBVTE9ORyBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Omd1YXJhbnRlZVNpemUgPSAwOworICAgIFBWT0lEIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6ZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorCisjZWxzZSAvLyBOb3QgV2luZG93cyAtIGFzc3VtZWQgdG8gYmUgUE9TSVggY29tcGF0aWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyBpcyBkZWZpbmVkCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICAgICAgeyBTSUdJTlQsICAiU0lHSU5UIC0gVGVybWluYWwgaW50ZXJydXB0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHSUxMLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxvYXRpbmcgcG9pbnQgZXJyb3Igc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdTRUdWLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdURVJNLCAiU0lHVEVSTSAtIFRlcm1pbmF0aW9uIHJlcXVlc3Qgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdBQlJULCAiU0lHQUJSVCAtIEFib3J0IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9CisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zIFtzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXTsKKyAgICAgICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3RhY2s7CisgICAgICAgIHN0YXRpYyBjaGFyIGFsdFN0YWNrTWVtW1NJR1NUS1NaXTsKKworICAgICAgICBzdGF0aWMgdm9pZCBoYW5kbGVTaWduYWwoIGludCBzaWcgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gIjx1bmtub3duIHNpZ25hbD4iOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2lnbmFsRGVmcyAmZGVmID0gc2lnbmFsRGVmc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnID09IGRlZi5pZCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGVmLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICByZXBvcnRGYXRhbChuYW1lKTsKKyAgICAgICAgICAgIHJhaXNlKCBzaWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YWNrX3Qgc2lnU3RhY2s7CisgICAgICAgICAgICBzaWdTdGFjay5zc19zcCA9IGFsdFN0YWNrTWVtOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc2l6ZSA9IFNJR1NUS1NaOworICAgICAgICAgICAgc2lnU3RhY2suc3NfZmxhZ3MgPSAwOworICAgICAgICAgICAgc2lnYWx0c3RhY2soJnNpZ1N0YWNrLCAmb2xkU2lnU3RhY2spOworICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYSA9IHsgMCB9OworCisgICAgICAgICAgICBzYS5zYV9oYW5kbGVyID0gaGFuZGxlU2lnbmFsOworICAgICAgICAgICAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmc2EsICZvbGRTaWdBY3Rpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIGlzU2V0ICkgeworICAgICAgICAgICAgICAgIC8vIFNldCBzaWduYWxzIGJhY2sgdG8gcHJldmlvdXMgdmFsdWVzIC0tIGhvcGVmdWxseSBub2JvZHkgb3Zlcndyb3RlIHRoZW0gaW4gdGhlIG1lYW50aW1lCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZvbGRTaWdBY3Rpb25zW2ldLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBvbGQgc3RhY2sKKyAgICAgICAgICAgICAgICBzaWdhbHRzdGFjaygmb2xkU2lnU3RhY2ssIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ0FjdGlvbnNbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV0gPSB7fTsKKyAgICBzdGFja190IEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnU3RhY2sgPSB7fTsKKyAgICBjaGFyIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6YWx0U3RhY2tNZW1bU0lHU1RLU1pdID0ge307CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisKKyNlbmRpZiAvLyBub3QgV2luZG93cworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbVJlZGlyZWN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtUmVkaXJlY3QoIHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBzdGQ6OnN0cmluZyYgdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCBzdHJlYW0gKSwKKyAgICAgICAgICAgIG1fcHJldkJ1Ziggc3RyZWFtLnJkYnVmKCkgKSwKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nKCB0YXJnZXRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0ucmRidWYoIG1fb3NzLnJkYnVmKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1SZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nICs9IG1fb3NzLnN0cigpOworICAgICAgICAgICAgbV9zdHJlYW0ucmRidWYoIG1fcHJldkJ1ZiApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fc3RyZWFtOworICAgICAgICBzdGQ6OnN0cmVhbWJ1ZiogbV9wcmV2QnVmOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9vc3M7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3RhcmdldFN0cmluZzsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBSdW5Db250ZXh0IDogcHVibGljIElSZXN1bHRDYXB0dXJlLCBwdWJsaWMgSVJ1bm5lciB7CisKKyAgICAgICAgUnVuQ29udGV4dCggUnVuQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvciA9KCBSdW5Db250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorCisgICAgICAgIGV4cGxpY2l0IFJ1bkNvbnRleHQoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2NvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkKKyAgICAgICAgOiAgIG1fcnVuSW5mbyggX2NvbmZpZy0+bmFtZSgpICksCisgICAgICAgICAgICBtX2NvbnRleHQoIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpICksCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX2NvbmZpZyggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9yZXBvcnRlciggcmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCAoIHRydWUgKQorICAgICAgICB7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UnVubmVyKCB0aGlzICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0Q29uZmlnKCBtX2NvbmZpZyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJlc3VsdENhcHR1cmUoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5TdGFydGluZyggbV9ydW5JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5SdW5Db250ZXh0KCkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICksIHRvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgcnVuVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgVG90YWxzIHByZXZUb3RhbHMgPSBtX3RvdGFsczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENvdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ2VycjsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSAmdGVzdENhc2U7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBJVHJhY2tlciYgcm9vdFRyYWNrZXIgPSBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0UnVuKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCByb290VHJhY2tlci5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCByb290VHJhY2tlciApLmFkZEluaXRpYWxGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0U2VjdGlvbnNUb1J1bigpICk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0Q3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSAmU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggdGVzdEluZm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgICAgICAgICBydW5DdXJyZW50VGVzdCggcmVkaXJlY3RlZENvdXQsIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCAhbV90ZXN0Q2FzZVRyYWNrZXItPmlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgJiYgIWFib3J0aW5nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQ6IGRlcHJlY2F0ZWQgLSB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgaW5kZXhlZCB0cmFja2VycworICAgICAgICAgICAgd2hpbGUoIGdldEN1cnJlbnRDb250ZXh0KCkuYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpICYmICFhYm9ydGluZygpICk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFscyA9IG1fdG90YWxzLmRlbHRhKCBwcmV2VG90YWxzICk7CisgICAgICAgICAgICBpZiggdGVzdEluZm8uZXhwZWN0ZWRUb0ZhaWwoKSAmJiBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkID4gMCApIHsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQtLTsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMgKz0gZGVsdGFUb3RhbHMudGVzdENhc2VzOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRpbmcoKSApICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICByZXR1cm4gZGVsdGFUb3RhbHM7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwcml2YXRlOiAvLyBJUmVzdWx0Q2FwdHVyZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMucGFzc2VkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vIHVzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAod2hldGhlciBtZXNzYWdlcyBzaG91bGQgYmUgY2xlYXJlZCksIGJlY2F1c2UgbWVzc2FnZXMgd2VyZSBtYWRlIHNjb3BlZAorICAgICAgICAgICAgLy8gYW5kIHNob3VsZCBiZSBsZXQgdG8gY2xlYXIgdGhlbXNlbHZlcyBvdXQuCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyhyZXN1bHQsIG1fbWVzc2FnZXMsIG1fdG90YWxzKSkpOworCisgICAgICAgICAgICAvLyBSZXNldCB3b3JraW5nIHN0YXRlCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggc3RkOjpzdHJpbmcoKSwgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywgIntVbmtub3duIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlcG9ydGVkIGxpbmV9IiAsIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgICAgIG1fbGFzdFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCAoCisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJhY2tlciYgc2VjdGlvblRyYWNrZXIgPSBTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICBpZiggIXNlY3Rpb25UcmFja2VyLmlzT3BlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnB1c2hfYmFjayggJnNlY3Rpb25UcmFja2VyICk7CisKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8gPSBzZWN0aW9uSW5mby5saW5lSW5mbzsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworCisgICAgICAgICAgICBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25zLnRvdGFsKCkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoIG1fdHJhY2tlckNvbnRleHQuY3VycmVudFRyYWNrZXIoKS5oYXNDaGlsZHJlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggIW1fYWN0aXZlU2VjdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzKCBlbmRJbmZvLnNlY3Rpb25JbmZvLCBhc3NlcnRpb25zLCBlbmRJbmZvLmR1cmF0aW9uSW5TZWNvbmRzLCBtaXNzaW5nQXNzZXJ0aW9ucyApICk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgaWYoIG1fdW5maW5pc2hlZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLnB1c2hfYmFjayggZW5kSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKCBtZXNzYWdlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmVyYXNlKCBzdGQ6OnJlbW92ZSggbV9tZXNzYWdlcy5iZWdpbigpLCBtX21lc3NhZ2VzLmVuZCgpLCBtZXNzYWdlICksIG1fbWVzc2FnZXMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fYWN0aXZlVGVzdENhc2UKKyAgICAgICAgICAgICAgICA/IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpLm5hbWUKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAmbV9sYXN0UmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSB7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJlYnVpbGQgdGhlIHJlc3VsdCAtLSB0aGUgc3RyaW5naWZpY2F0aW9uIGl0c2VsZiBjYW4gY2F1c2UgbW9yZSBmYXRhbCBlcnJvcnMKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIGZha2UgYSByZXN1bHQgZGF0YS4KKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgdGVtcFJlc3VsdDsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KG1fbGFzdEFzc2VydGlvbkluZm8sIHRlbXBSZXN1bHQpOworCisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKKworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIC8vIFJlY3JlYXRlIHNlY3Rpb24gZm9yIHRlc3QgY2FzZSAoYXMgd2Ugd2lsbCBsb3NlIHRoZSBvbmUgdGhhdCB3YXMgaW4gc2NvcGUpCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFsczsKKyAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPSAxOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICkgKTsKKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZygpLCBtX3RvdGFscywgMSwgMSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGZhbHNlICkgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVyIHdheSEKKyAgICAgICAgYm9vbCBhYm9ydGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIG1fY29uZmlnLT5hYm9ydEFmdGVyKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICB2b2lkIHJ1bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VyciApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCB0ZXN0Q2FzZVNlY3Rpb24gKTsKKyAgICAgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oICJURVNUX0NBU0UiLCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHN0ZDo6c3RyaW5nKCksIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgVGltZXIgdGltZXI7CisgICAgICAgICAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiggbV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY291dFJlZGlyKCBDYXRjaDo6Y291dCgpLCByZWRpcmVjdGVkQ291dCApOworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjZXJyUmVkaXIoIENhdGNoOjpjZXJyKCksIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMganVzdCBtZWFucyB0aGUgdGVzdCB3YXMgYWJvcnRlZCBkdWUgdG8gZmFpbHVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgLy8gVW5kZXIgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNlcHRpb25zIHVuZGVyIFJFUVVJUkUgYXNzZXJ0aW9ucworICAgICAgICAgICAgICAgIC8vIGFyZSByZXBvcnRlZCB3aXRob3V0IHRyYW5zbGF0aW9uIGF0IHRoZSBwb2ludCBvZiBvcmlnaW4uCisgICAgICAgICAgICAgICAgaWYgKG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKS51c2VBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlci0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoIHRlc3RDYXNlSW5mby5va1RvRmFpbCgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3dhcCggYXNzZXJ0aW9ucy5mYWlsZWRCdXRPaywgYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCAtPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKz0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIGR1cmF0aW9uLCBtaXNzaW5nQXNzZXJ0aW9ucyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpIHsKKyAgICAgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlciBmYXRhbENvbmRpdGlvbkhhbmRsZXI7IC8vIEhhbmRsZSBzaWduYWxzCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlLT5pbnZva2UoKTsKKyAgICAgICAgICAgIGZhdGFsQ29uZGl0aW9uSGFuZGxlci5yZXNldCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIFJlc3VsdEJ1aWxkZXIgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdEJ1aWxkZXIoICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5tYWNyb05hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBJZiBzZWN0aW9ucyBlbmRlZCBwcmVtYXR1cmVseSBkdWUgdG8gYW4gZXhjZXB0aW9uIHdlIHN0b3JlZCB0aGVpcgorICAgICAgICAgICAgLy8gaW5mb3MgaGVyZSBzbyB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUgdW53aW5kIHByb2Nlc3MuCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uRW5kZWQoICppdCApOworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RSdW5JbmZvIG1fcnVuSW5mbzsKKyAgICAgICAgSU11dGFibGVDb250ZXh0JiBtX2NvbnRleHQ7CisgICAgICAgIFRlc3RDYXNlIGNvbnN0KiBtX2FjdGl2ZVRlc3RDYXNlOworICAgICAgICBJVHJhY2tlciogbV90ZXN0Q2FzZVRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRTZWN0aW9uVHJhY2tlcjsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IG1fbGFzdFJlc3VsdDsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIFRvdGFscyBtX3RvdGFsczsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbV9yZXBvcnRlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1fbWVzc2FnZXM7CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9sYXN0QXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+IG1fdW5maW5pc2hlZFNlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxJVHJhY2tlcio+IG1fYWN0aXZlU2VjdGlvbnM7CisgICAgICAgIFRyYWNrZXJDb250ZXh0IG1fdHJhY2tlckNvbnRleHQ7CisgICAgICAgIGJvb2wgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgaWYoIElSZXN1bHRDYXB0dXJlKiBjYXB0dXJlID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCkgKQorICAgICAgICAgICAgcmV0dXJuICpjYXB0dXJlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gcmVzdWx0IGNhcHR1cmUgaW5zdGFuY2UiICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3ZlcnNpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBWZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgICAgc3RydWN0IFZlcnNpb24geworICAgICAgICBWZXJzaW9uKCAgICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApOworCisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtYWpvclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtaW5vclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBwYXRjaE51bWJlcjsKKworICAgICAgICAvLyBidWlsZE51bWJlciBpcyBvbmx5IHVzZWQgaWYgYnJhbmNoTmFtZSBpcyBub3QgbnVsbAorICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgYnJhbmNoTmFtZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IGJ1aWxkTnVtYmVyOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFZlcnNpb24gY29uc3QmICk7CisgICAgfTsKKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCk7Cit9CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNyZWF0ZVJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXJOYW1lLCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmNyZWF0ZSggcmVwb3J0ZXJOYW1lLCBjb25maWcuZ2V0KCkgKTsKKyAgICAgICAgaWYoICFyZXBvcnRlciApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIk5vIHJlcG9ydGVyIHJlZ2lzdGVyZWQgd2l0aCBuYW1lOiAnIiA8PCByZXBvcnRlck5hbWUgPDwgIiciOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtYWtlUmVwb3J0ZXIoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlcnMgPSBjb25maWctPmdldFJlcG9ydGVyTmFtZXMoKTsKKyAgICAgICAgaWYoIHJlcG9ydGVycy5lbXB0eSgpICkKKyAgICAgICAgICAgIHJlcG9ydGVycy5wdXNoX2JhY2soICJjb25zb2xlIiApOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSByZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlciA9IGFkZFJlcG9ydGVyKCByZXBvcnRlciwgY3JlYXRlUmVwb3J0ZXIoICppdCwgY29uZmlnICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRMaXN0ZW5lcnMoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcnMgKSB7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnMgbGlzdGVuZXJzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgIGZvciggSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0ZW5lcnMuYmVnaW4oKSwgaXRFbmQgPSBsaXN0ZW5lcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlcnMgPSBhZGRSZXBvcnRlcihyZXBvcnRlcnMsICgqaXQpLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcnM7CisgICAgfQorCisgICAgVG90YWxzIHJ1blRlc3RzKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBpY29uZmlnID0gY29uZmlnLmdldCgpOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gbWFrZVJlcG9ydGVyKCBjb25maWcgKTsKKyAgICAgICAgcmVwb3J0ZXIgPSBhZGRMaXN0ZW5lcnMoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgUnVuQ29udGV4dCBjb250ZXh0KCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFRvdGFscyB0b3RhbHM7CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBTdGFydGluZyggY29uZmlnLT5uYW1lKCksIDEsIDEgKTsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy0+dGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICF0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICJ+Wy5dIiApLnRlc3RTcGVjKCk7IC8vIEFsbCBub3QgaGlkZGVuIHRlc3RzCisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBhbGxUZXN0Q2FzZXMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoICppY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFsbFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IGFsbFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgaWYoICFjb250ZXh0LmFib3J0aW5nKCkgJiYgbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCAqaWNvbmZpZyApICkKKyAgICAgICAgICAgICAgICB0b3RhbHMgKz0gY29udGV4dC5ydW5UZXN0KCAqaXQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXBvcnRlci0+c2tpcFRlc3QoICppdCApOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBFbmRlZCggaWNvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsczsKKyAgICB9CisKKyAgICB2b2lkIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdHMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApOworICAgICAgICBmb3Ioc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0ZXN0cy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlJiB0ZXN0ID0gY29uc3RfY2FzdDxUZXN0Q2FzZSY+KCB0ZXN0c1tpXSApOworICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3MgPSB0ZXN0LnRhZ3M7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gdGVzdC5saW5lSW5mby5maWxlOworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0U2xhc2ggPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICJcXC8iICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0RG90ID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiLiIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0RG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggMCwgbGFzdERvdCApOworCisgICAgICAgICAgICB0YWdzLmluc2VydCggIiMiICsgZmlsZW5hbWUgKTsKKyAgICAgICAgICAgIHNldFRhZ3MoIHRlc3QsIHRhZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNlc3Npb24gOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnN0YW50aWF0ZWQ7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IE9uVW51c2VkT3B0aW9ucyB7IGVudW0gRG9XaGF0IHsgSWdub3JlLCBGYWlsIH07IH07CisKKyAgICAgICAgU2Vzc2lvbigpCisgICAgICAgIDogbV9jbGkoIG1ha2VDb21tYW5kTGluZVBhcnNlcigpICkgeworICAgICAgICAgICAgaWYoIGFscmVhZHlJbnN0YW50aWF0ZWQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk9ubHkgb25lIGluc3RhbmNlIG9mIENhdGNoOjpTZXNzaW9uIGNhbiBldmVyIGJlIHVzZWQiOworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBtc2cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFscmVhZHlJbnN0YW50aWF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH5TZXNzaW9uKCkgeworICAgICAgICAgICAgQ2F0Y2g6OmNsZWFuVXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2hvd0hlbHAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jZXNzTmFtZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlxuQ2F0Y2ggdiIgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiXG4iOworCisgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkZvciBtb3JlIGRldGFpbCB1c2FnZSBwbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IGRvY3NcbiIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGFwcGx5Q29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiwgT25VbnVzZWRPcHRpb25zOjpEb1doYXQgdW51c2VkT3B0aW9uQmVoYXZpb3VyID0gT25VbnVzZWRPcHRpb25zOjpGYWlsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2NsaS5zZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPT0gT25VbnVzZWRPcHRpb25zOjpGYWlsICk7CisgICAgICAgICAgICAgICAgbV91bnVzZWRUb2tlbnMgPSBtX2NsaS5wYXJzZUludG8oIENsYXJhOjphcmdzVG9WZWN0b3IoIGFyZ2MsIGFyZ3YgKSwgbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgICAgIHNob3dIZWxwKCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuRXJyb3IocykgaW4gaW5wdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBUZXh0KCBleC53aGF0KCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNlQ29uZmlnRGF0YSggQ29uZmlnRGF0YSBjb25zdCYgX2NvbmZpZ0RhdGEgKSB7CisgICAgICAgICAgICBtX2NvbmZpZ0RhdGEgPSBfY29uZmlnRGF0YTsKKyAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgYXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKworICAgICNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKFVOSUNPREUpCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCB3Y2hhcl90IGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNoYXIgKlsgYXJnYyBdOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaW50IGJ1ZlNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCApOworCisgICAgICAgICAgICAgICAgdXRmOEFyZ3ZbIGkgXSA9IG5ldyBjaGFyWyBidWZTaXplIF07CisKKyAgICAgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgdXRmOEFyZ3ZbaV0sIGJ1ZlNpemUsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndlsgaSBdOworCisgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7CisKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAgICAgaW50IHJ1bigpIHsKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWcoKTsgLy8gRm9yY2UgY29uZmlnIHRvIGJlIGNvbnN0cnVjdGVkCisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVzQXNUYWdzICkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpc3QgcmVxdWVzdAorICAgICAgICAgICAgICAgIGlmKCBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZCA9IGxpc3QoIGNvbmZpZygpICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggKmxpc3RlZCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oIHJ1blRlc3RzKCBtX2NvbmZpZyApLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgZXgud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNvbnN0JiBjbGkoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jbGk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IGNvbnN0JiB1bnVzZWRUb2tlbnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSYgY29uZmlnRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZ0RhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnJiBjb25maWcoKSB7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnICkKKyAgICAgICAgICAgICAgICBtX2NvbmZpZyA9IG5ldyBDb25maWcoIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgcmV0dXJuICptX2NvbmZpZzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtX2NsaTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IG1fdW51c2VkVG9rZW5zOworICAgICAgICBDb25maWdEYXRhIG1fY29uZmlnRGF0YTsKKyAgICAgICAgUHRyPENvbmZpZz4gbV9jb25maWc7CisgICAgfTsKKworICAgIGJvb2wgU2Vzc2lvbjo6YWxyZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZ2lzdHJ5X2h1Yi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFR0lTVFJZX0hVQl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9yZWdpc3RyeV9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1JFR0lTVFJZX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFJhbmRvbU51bWJlckdlbmVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgcmVzdWx0X3R5cGU7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggcmVzdWx0X3R5cGUgbiApIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbjsgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiAwOyB9CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gMTAwMDAwMDsgfQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBtYXgoKTsgfQorI2VuZGlmCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+CisgICAgICAgIHN0YXRpYyB2b2lkIHNodWZmbGUoIFYmIHZlY3RvciApIHsKKyAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvciBybmc7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgICAgIHN0ZDo6c2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpyYW5kb21fc2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmlnLCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgeworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKKworICAgICAgICBzd2l0Y2goIGNvbmZpZy5ydW5PcmRlcigpICkgeworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQoIHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWVkUm5nKCBjb25maWcgKTsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpzaHVmZmxlKCBzb3J0ZWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI6CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBkZWNsYXJhdGlvbiBvcmRlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3J0ZWQ7CisgICAgfQorICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gdGVzdFNwZWMubWF0Y2hlcyggdGVzdENhc2UgKSAmJiAoIGNvbmZpZy5hbGxvd1Rocm93cygpIHx8ICF0ZXN0Q2FzZS50aHJvd3MoKSApOworICAgIH0KKworICAgIHZvaWQgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApIHsKKyAgICAgICAgc3RkOjpzZXQ8VGVzdENhc2U+IHNlZW5GdW5jdGlvbnM7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5iZWdpbigpLCBpdEVuZCA9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnNldDxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yLCBib29sPiBwcmV2ID0gc2VlbkZ1bmN0aW9ucy5pbnNlcnQoICppdCApOworICAgICAgICAgICAgaWYoICFwcmV2LnNlY29uZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisKKyAgICAgICAgICAgICAgICBzcyAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogVEVTVF9DQVNFKCBcIiIgPDwgaXQtPm5hbWUgPDwgIlwiICkgYWxyZWFkeSBkZWZpbmVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIgPDwgcHJldi5maXJzdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICA8PCAiXHRSZWRlZmluZWQgYXQgIiA8PCBpdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgc3RkOjplbmRsOworCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyZWQ7CisgICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5zaXplKCkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gdGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgaWYoIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgY29uZmlnICkgKQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2hfYmFjayggKml0ICk7CisgICAgICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgpLmdldEFsbFRlc3RzU29ydGVkKCBjb25maWcgKTsKKyAgICB9CisKKyAgICBjbGFzcyBUZXN0UmVnaXN0cnkgOiBwdWJsaWMgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFJlZ2lzdHJ5KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFNvcnRPcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgbV91bm5hbWVkQ291bnQoIDAgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCkubmFtZTsKKyAgICAgICAgICAgIGlmKCBuYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgIkFub255bW91cyB0ZXN0IGNhc2UgIiA8PCArK21fdW5uYW1lZENvdW50OworICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNlLndpdGhOYW1lKCBvc3Muc3RyKCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mdW5jdGlvbnMucHVzaF9iYWNrKCB0ZXN0Q2FzZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZnVuY3Rpb25zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICBtX2N1cnJlbnRTb3J0T3JkZXIgIT0gY29uZmlnLnJ1bk9yZGVyKCkgfHwgbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3NvcnRlZEZ1bmN0aW9ucyA9IHNvcnRUZXN0cyggY29uZmlnLCBtX2Z1bmN0aW9ucyApOworICAgICAgICAgICAgICAgIG1fY3VycmVudFNvcnRPcmRlciA9IGNvbmZpZy5ydW5PcmRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7CisgICAgICAgIG11dGFibGUgUnVuVGVzdHM6OkluV2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlcjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIHNpemVfdCBtX3VubmFtZWRDb3VudDsKKyAgICAgICAgc3RkOjppb3NfYmFzZTo6SW5pdCBtX29zdHJlYW1Jbml0OyAvLyBGb3JjZXMgY291dC8gY2VyciB0byBiZSBpbml0aWFsaXNlZAorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEZyZWVGdW5jdGlvblRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisgICAgcHVibGljOgorCisgICAgICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlKCBUZXN0RnVuY3Rpb24gZnVuICkgOiBtX2Z1biggZnVuICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgbV9mdW4oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKTsKKworICAgICAgICBUZXN0RnVuY3Rpb24gbV9mdW47CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lOworICAgICAgICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIgKTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKKyAgICAgICAgICAgIGlmKCBwZW51bHRpbWF0ZUNvbG9ucyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcGVudWx0aW1hdGVDb2xvbnMgPSAxOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0ciggcGVudWx0aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVDb2xvbnMgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdAorICAgICAgICAgICAgKCBtYWtlVGVzdENhc2UKKyAgICAgICAgICAgICAgICAoICAgdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFzc05hbWUoIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICksCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyApICk7CisgICAgfQorICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UoIG5ldyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggZnVuY3Rpb24gKSwgIiIsIG5hbWVBbmREZXNjLCBsaW5lSW5mbyApOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQXV0b1JlZzo6QXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24oIGZ1bmN0aW9uLCBsaW5lSW5mbywgbmFtZUFuZERlc2MgKTsKKyAgICB9CisKKyAgICBBdXRvUmVnOjp+QXV0b1JlZygpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cnkgOiBwdWJsaWMgSVJlcG9ydGVyUmVnaXN0cnkgeworCisgICAgcHVibGljOgorCisgICAgICAgIHZpcnR1YWwgflJlcG9ydGVyUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gIG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2ZhY3Rvcmllcy5lbmQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIENBVENIX05VTEw7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIG5hbWUsIGZhY3RvcnkgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucHVzaF9iYWNrKCBmYWN0b3J5ICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ZhY3RvcmllczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbGlzdGVuZXJzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBGYWN0b3J5TWFwIG1fZmFjdG9yaWVzOworICAgICAgICBMaXN0ZW5lcnMgbV9saXN0ZW5lcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4Y2VwdGlvbl90cmFuc2xhdG9yX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhDRVBUSU9OX1RSQU5TTEFUT1JfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX09CSkNfXworI2ltcG9ydCAiRm91bmRhdGlvbi9Gb3VuZGF0aW9uLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5FeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fdHJhbnNsYXRvcnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgeworICAgICAgICAgICAgbV90cmFuc2xhdG9ycy5wdXNoX2JhY2soIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgdHJ5IHsKKyNpZmRlZiBfX09CSkNfXworICAgICAgICAgICAgICAgIC8vIEluIE9iamVjdGl2ZS1DIHRyeSBvYmplY3RpdmUtYyBleGNlcHRpb25zIGZpcnN0CisgICAgICAgICAgICAgICAgQHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggW2V4Y2VwdGlvbiBkZXNjcmlwdGlvbl0gKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXgud2hhdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6c3RyaW5nJiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBjb25zdCBjaGFyKiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV90cmFuc2xhdG9ycy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdG9yc1swXS0+dHJhbnNsYXRlKCBtX3RyYW5zbGF0b3JzLmJlZ2luKCkrMSwgbV90cmFuc2xhdG9ycy5lbmQoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IG1fdHJhbnNsYXRvcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5UYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3Q7CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPiBtX3JlZ2lzdHJ5OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBjbGFzcyBSZWdpc3RyeUh1YiA6IHB1YmxpYyBJUmVnaXN0cnlIdWIsIHB1YmxpYyBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKworICAgICAgICAgICAgUmVnaXN0cnlIdWIoIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworCisgICAgICAgIHB1YmxpYzogLy8gSVJlZ2lzdHJ5SHViCisgICAgICAgICAgICBSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwdWJsaWM6IC8vIElNdXRhYmxlUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVJlZ2lzdHJ5LnJlZ2lzdGVyVGVzdCggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyVHJhbnNsYXRvciggdHJhbnNsYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICBSZXBvcnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICB9OworCisgICAgICAgIC8vIFNpbmdsZSwgZ2xvYmFsLCBpbnN0YW5jZQorICAgICAgICBpbmxpbmUgUmVnaXN0cnlIdWIqJiBnZXRUaGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIHN0YXRpYyBSZWdpc3RyeUh1YiogdGhlUmVnaXN0cnlIdWIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgaWYoICF0aGVSZWdpc3RyeUh1YiApCisgICAgICAgICAgICAgICAgdGhlUmVnaXN0cnlIdWIgPSBuZXcgUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGVSZWdpc3RyeUh1YjsKKyAgICAgICAgfQorICAgIH0KKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgZGVsZXRlIGdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIGdldFRoZVJlZ2lzdHJ5SHViKCkgPSBDQVRDSF9OVUxMOworICAgICAgICBjbGVhblVwQ29udGV4dCgpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpLnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb246Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKQorICAgIDogICBtX2xpbmVJbmZvKCBsaW5lSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxpbmVJbmZvIDw8ICI6IGZ1bmN0aW9uICI7CisgICAgICAgIG9zcyA8PCAibm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgbV93aGF0ID0gb3NzLnN0cigpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gbV93aGF0LmNfc3RyKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnRleHRfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBXcml0ZXJGLCBzaXplX3QgYnVmZmVyU2l6ZT0yNTY+CisgICAgY2xhc3MgU3RyZWFtQnVmSW1wbCA6IHB1YmxpYyBTdHJlYW1CdWZCYXNlIHsKKyAgICAgICAgY2hhciBkYXRhW2J1ZmZlclNpemVdOworICAgICAgICBXcml0ZXJGIG1fd3JpdGVyOworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1CdWZJbXBsKCkgeworICAgICAgICAgICAgc2V0cCggZGF0YSwgZGF0YSArIHNpemVvZihkYXRhKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbUJ1ZkltcGwoKSBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBzeW5jKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludCBvdmVyZmxvdyggaW50IGMgKSB7CisgICAgICAgICAgICBzeW5jKCk7CisKKyAgICAgICAgICAgIGlmKCBjICE9IEVPRiApIHsKKyAgICAgICAgICAgICAgICBpZiggcGJhc2UoKSA9PSBlcHB0cigpICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwdXRjKCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzeW5jKCkgeworICAgICAgICAgICAgaWYoIHBiYXNlKCkgIT0gcHB0cigpICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggcGJhc2UoKSwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oIHBwdHIoKSAtIHBiYXNlKCkgKSApICk7CisgICAgICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKSB7CisgICAgICAgIG1fb2ZzLm9wZW4oIGZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoIG1fb2ZzLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGU6ICciIDw8IGZpbGVuYW1lIDw8ICdcJyc7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIEZpbGVTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZzOworICAgIH0KKworICAgIHN0cnVjdCBPdXRwdXREZWJ1Z1dyaXRlciB7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBzdGQ6OnN0cmluZyBjb25zdCZzdHIgKSB7CisgICAgICAgICAgICB3cml0ZVRvRGVidWdDb25zb2xlKCBzdHIgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBEZWJ1Z091dFN0cmVhbTo6RGVidWdPdXRTdHJlYW0oKQorICAgIDogICBtX3N0cmVhbUJ1ZiggbmV3IFN0cmVhbUJ1ZkltcGw8T3V0cHV0RGVidWdXcml0ZXI+KCkgKSwKKyAgICAgICAgbV9vcyggbV9zdHJlYW1CdWYuZ2V0KCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIERlYnVnT3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworICAgIC8vIFN0b3JlIHRoZSBzdHJlYW1idWYgZnJvbSBjb3V0IHVwLWZyb250IGJlY2F1c2UKKyAgICAvLyBjb3V0IG1heSBnZXQgcmVkaXJlY3RlZCB3aGVuIHJ1bm5pbmcgdGVzdHMKKyAgICBDb3V0U3RyZWFtOjpDb3V0U3RyZWFtKCkKKyAgICA6ICAgbV9vcyggQ2F0Y2g6OmNvdXQoKS5yZGJ1ZigpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBDb3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfTk9TVERPVVQgLy8gSWYgeW91ICNkZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCkgeworICAgICAgICByZXR1cm4gc3RkOjpjb3V0OworICAgIH0KKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNlcnI7CisgICAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBDb250ZXh0IDogcHVibGljIElNdXRhYmxlQ29udGV4dCB7CisKKyAgICAgICAgQ29udGV4dCgpIDogbV9jb25maWcoIENBVENIX05VTEwgKSwgbV9ydW5uZXIoIENBVENIX05VTEwgKSwgbV9yZXN1bHRDYXB0dXJlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgQ29udGV4dCggQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIENvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7CisgICAgICAgICAgICBkZWxldGVBbGxWYWx1ZXMoIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJQ29udGV4dAorICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgeworICAgICAgICAgICAgcmV0dXJuIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpCisgICAgICAgICAgICAuZ2V0R2VuZXJhdG9ySW5mbyggZmlsZUluZm8sIHRvdGFsU2l6ZSApCisgICAgICAgICAgICAuZ2V0Q3VycmVudEluZGV4KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9ycyAmJiBnZW5lcmF0b3JzLT5tb3ZlTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElNdXRhYmxlQ29udGV4dAorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSB7CisgICAgICAgICAgICBtX3Jlc3VsdENhcHR1cmUgPSByZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApIHsKKyAgICAgICAgICAgIG1fcnVubmVyID0gcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgeworICAgICAgICAgICAgbV9jb25maWcgPSBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5maW5kKCB0ZXN0TmFtZSApOworICAgICAgICAgICAgcmV0dXJuIGl0ICE9IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZW5kKCkKKyAgICAgICAgICAgICAgICA/IGl0LT5zZWNvbmQKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QmIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIGlmKCAhZ2VuZXJhdG9ycyApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycyA9IGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCB0ZXN0TmFtZSwgZ2VuZXJhdG9ycyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKmdlbmVyYXRvcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgSVJ1bm5lciogbV9ydW5uZXI7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPiBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBDb250ZXh0KiBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgeworICAgICAgICBpZiggIWN1cnJlbnRDb250ZXh0ICkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IENvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuICpjdXJyZW50Q29udGV4dDsKKyAgICB9CisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpIHsKKyAgICAgICAgZGVsZXRlIGN1cnJlbnRDb250ZXh0OworICAgICAgICBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXJfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9lcnJub19ndWFyZC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VSUk5PX0dVQVJEX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXJybm9HdWFyZCB7CisgICAgcHVibGljOgorICAgICAgICBFcnJub0d1YXJkKCk6bV9vbGRFcnJubyhlcnJubyl7fQorICAgICAgICB+RXJybm9HdWFyZCgpIHsgZXJybm8gPSBtX29sZEVycm5vOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1fb2xkRXJybm87CisgICAgfTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgc3RydWN0IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklDb2xvdXJJbXBsKCkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTm9Db2xvdXJJbXBsIDogSUNvbG91ckltcGwgeworICAgICAgICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSApIHt9CisKKyAgICAgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIE5vQ29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIH0gLy8gYW5vbiBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9OT05FICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKQorIyAgIGlmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIGNsYXNzIFdpbjMyQ29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBXaW4zMkNvbG91ckltcGwoKSA6IHN0ZG91dEhhbmRsZSggR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmlJbmZvOworICAgICAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oIHN0ZG91dEhhbmRsZSwgJmNzYmlJbmZvICk7CisgICAgICAgICAgICBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBCQUNLR1JPVU5EX0dSRUVOIHwgQkFDS0dST1VORF9SRUQgfCBCQUNLR1JPVU5EX0JMVUUgfCBCQUNLR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIDAgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0VGV4dEF0dHJpYnV0ZSggV09SRCBfdGV4dEF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKCBzdGRvdXRIYW5kbGUsIF90ZXh0QXR0cmlidXRlIHwgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSBzdGRvdXRIYW5kbGU7CisgICAgICAgIFdPUkQgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlczsKKyAgICAgICAgV09SRCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIFdpbjMyQ29sb3VySW1wbCBzX2luc3RhbmNlOworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAhaXNEZWJ1Z2dlckFjdGl2ZSgpCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gJnNfaW5zdGFuY2UKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgLy8gdXNlIFBPU0lYLyBBTlNJIGNvbnNvbGUgdGVybWluYWwgY29kZXMKKyAgICAvLyBUaGFua3MgdG8gQWRhbSBTdHJ6ZWxlY2tpIGZvciBvcmlnaW5hbCBjb250cmlidXRpb24KKyAgICAvLyAoaHR0cDovL2dpdGh1Yi5jb20vbmFub2FudCkKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gvcHVsbC8xMzEKKyAgICBjbGFzcyBQb3NpeENvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZToKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzBtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzRtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldENvbG91ciggIlswOzMzbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszN20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszN20iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgUG9zaXhDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0Q29sb3VyKCBjb25zdCBjaGFyKiBfZXNjYXBlQ29kZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJ1wwMzMnIDw8IF9lc2NhcGVDb2RlOworICAgICAgICB9CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gKCFpc0RlYnVnZ2VyQWN0aXZlKCkgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pICkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyBQb3NpeENvbG91ckltcGw6Omluc3RhbmNlKCkKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxzZSAgLy8gbm90IFdpbmRvd3Mgb3IgQU5TSSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RhdGljIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeyByZXR1cm4gTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZW5kaWYgLy8gV2luZG93cy8gQU5TSS8gTm9uZQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQ29sb3VyOjpDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyB1c2UoIF9jb2xvdXJDb2RlICk7IH0KKyAgICBDb2xvdXI6OkNvbG91ciggQ29sb3VyIGNvbnN0JiBfb3RoZXIgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyBjb25zdF9jYXN0PENvbG91ciY+KCBfb3RoZXIgKS5tX21vdmVkID0gdHJ1ZTsgfQorICAgIENvbG91cjo6fkNvbG91cigpeyBpZiggIW1fbW92ZWQgKSB1c2UoIE5vbmUgKTsgfQorCisgICAgdm9pZCBDb2xvdXI6OnVzZSggQ29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbXBsID0gcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpOworICAgICAgICBpbXBsLT51c2UoIF9jb2xvdXJDb2RlICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2dlbmVyYXRvcnNfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IEdlbmVyYXRvckluZm8gOiBJR2VuZXJhdG9ySW5mbyB7CisKKyAgICAgICAgR2VuZXJhdG9ySW5mbyggc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgICAgIDogICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4KCAwICkKKyAgICAgICAge30KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgaWYoICsrbV9jdXJyZW50SW5kZXggPT0gbV9zaXplICkgeworICAgICAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc2l6ZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jdXJyZW50SW5kZXg7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgR2VuZXJhdG9yc0ZvclRlc3QgOiBwdWJsaWMgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgfkdlbmVyYXRvcnNGb3JUZXN0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX2dlbmVyYXRvcnNJbk9yZGVyICk7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgeworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzQnlOYW1lLmZpbmQoIGZpbGVJbmZvICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9nZW5lcmF0b3JzQnlOYW1lLmVuZCgpICkgeworICAgICAgICAgICAgICAgIElHZW5lcmF0b3JJbmZvKiBpbmZvID0gbmV3IEdlbmVyYXRvckluZm8oIHNpemUgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeU5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggZmlsZUluZm8sIGluZm8gKSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0luT3JkZXIucHVzaF9iYWNrKCBpbmZvICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICppbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICppdC0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzSW5PcmRlci5iZWdpbigpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmVuZCgpOworICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoICgqaXQpLT5tb3ZlTmV4dCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0J5TmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNJbk9yZGVyOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQXNzZXJ0aW9uSW5mbzo6QXNzZXJ0aW9uSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBjYXB0dXJlZEV4cHJlc3Npb24oIF9jYXB0dXJlZEV4cHJlc3Npb24gKSwKKyAgICAgICAgcmVzdWx0RGlzcG9zaXRpb24oIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fcmVzdWx0RGF0YSggZGF0YSApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6fkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2VzcworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpzdWNjZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2Vzcywgb3IgZmFpbHVyZSBpcyBzdXBwcmVzc2VkCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OmlzT2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKSB8fCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgIH0KKworICAgIFJlc3VsdFdhczo6T2ZUeXBlIEFzc2VydGlvblJlc3VsdDo6Z2V0UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24uZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzTWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX3Jlc3VsdERhdGEubWVzc2FnZS5lbXB0eSgpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApCisgICAgICAgICAgICByZXR1cm4gJyEnICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdCB7CisgICAgICAgIGlmKCBtX2luZm8ubWFjcm9OYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lICsgIiggIiArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24gKyAiICkiOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBoYXNFeHByZXNzaW9uKCkgJiYgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgIT0gZ2V0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5tZXNzYWdlOworICAgIH0KKyAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6OmdldFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfaW5mby5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFsVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggdGFnLCAnLicgKSB8fAorICAgICAgICAgICAgdGFnID09ICJoaWRlIiB8fAorICAgICAgICAgICAgdGFnID09ICIhaGlkZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW47CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXRocm93cyIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6VGhyb3dzOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpTaG91bGRGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFtYXlmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpNYXlGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFub25wb3J0YWJsZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uUG9ydGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vbmU7CisgICAgfQorICAgIGlubGluZSBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIHJldHVybiBwYXJzZVNwZWNpYWxUYWcoIHRhZyApID09IFRlc3RDYXNlSW5mbzo6Tm9uZSAmJiB0YWcuc2l6ZSgpID4gMCAmJiAhc3RkOjppc2FsbnVtKCB0YWdbMF0gKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkgeworICAgICAgICBpZiggaXNSZXNlcnZlZFRhZyggdGFnICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBDb2xvdXIoQ29sb3VyOjpSZWQpCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWUgWyIgPDwgdGFnIDw8ICJdIG5vdCBhbGxvd2VkLlxuIgorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lcyBzdGFydGluZyB3aXRoIG5vbiBhbHBoYS1udW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkXG4iCisgICAgICAgICAgICAgICA8PCBDb2xvdXIoQ29sb3VyOjpGaWxlTmFtZSkKKyAgICAgICAgICAgICAgIDw8IF9saW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogX3Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NPclRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgeworICAgICAgICBib29sIGlzSGlkZGVuKCBzdGFydHNXaXRoKCBfbmFtZSwgIi4vIiApICk7IC8vIExlZ2FjeSBzdXBwb3J0CisKKyAgICAgICAgLy8gUGFyc2Ugb3V0IHRhZ3MKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MsIHRhZzsKKyAgICAgICAgYm9vbCBpblRhZyA9IGZhbHNlOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgX2Rlc2NPclRhZ3Muc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBfZGVzY09yVGFnc1tpXTsKKyAgICAgICAgICAgIGlmKCAhaW5UYWcgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzYyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ10nICkgeworICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHByb3AgPSBwYXJzZVNwZWNpYWxUYWcoIHRhZyApOworICAgICAgICAgICAgICAgICAgICBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86OklzSGlkZGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOworCisgICAgICAgICAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFnICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlzSGlkZGVuICkgeworICAgICAgICAgICAgdGFncy5pbnNlcnQoICJoaWRlIiApOworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIuIiApOworICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGluZm8oIF9uYW1lLCBfY2xhc3NOYW1lLCBkZXNjLCB0YWdzLCBfbGluZUluZm8gKTsKKyAgICAgICAgcmV0dXJuIFRlc3RDYXNlKCBfdGVzdENhc2UsIGluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKQorICAgIHsKKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3MgPSB0YWdzOworICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmNsZWFyKCk7CisKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpLCBpdEVuZCA9IHRhZ3MuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgb3NzIDw8ICdbJyA8PCAqaXQgPDwgJ10nOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWcgPSB0b0xvd2VyKCAqaXQgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzID0gc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcz4oIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzIHwgcGFyc2VTcGVjaWFsVGFnKCBsY2FzZVRhZyApICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmluc2VydCggbGNhc2VUYWcgKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nID0gb3NzLnN0cigpOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBfY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBOb25lICkKKyAgICB7CisgICAgICAgIHNldFRhZ3MoICp0aGlzLCBfdGFncyApOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICkKKyAgICA6ICAgbmFtZSggb3RoZXIubmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIG90aGVyLmNsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggb3RoZXIuZGVzY3JpcHRpb24gKSwKKyAgICAgICAgdGFncyggb3RoZXIudGFncyApLAorICAgICAgICBsY2FzZVRhZ3MoIG90aGVyLmxjYXNlVGFncyApLAorICAgICAgICB0YWdzQXNTdHJpbmcoIG90aGVyLnRhZ3NBc1N0cmluZyApLAorICAgICAgICBsaW5lSW5mbyggb3RoZXIubGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggb3RoZXIucHJvcGVydGllcyApCisgICAge30KKworICAgIGJvb2wgVGVzdENhc2VJbmZvOjppc0hpZGRlbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIElzSGlkZGVuICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OnRocm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIFRocm93cyApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpva1RvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsIHwgTWF5RmFpbCApICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmV4cGVjdGVkVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgKSApICE9IDA7CisgICAgfQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKSA6IFRlc3RDYXNlSW5mbyggaW5mbyApLCB0ZXN0KCB0ZXN0Q2FzZSApIHt9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApCisgICAgOiAgIFRlc3RDYXNlSW5mbyggb3RoZXIgKSwKKyAgICAgICAgdGVzdCggb3RoZXIudGVzdCApCisgICAge30KKworICAgIFRlc3RDYXNlIFRlc3RDYXNlOjp3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3QgeworICAgICAgICBUZXN0Q2FzZSBvdGhlciggKnRoaXMgKTsKKyAgICAgICAgb3RoZXIubmFtZSA9IF9uZXdOYW1lOworICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6c3dhcCggVGVzdENhc2UmIG90aGVyICkgeworICAgICAgICB0ZXN0LnN3YXAoIG90aGVyLnRlc3QgKTsKKyAgICAgICAgbmFtZS5zd2FwKCBvdGhlci5uYW1lICk7CisgICAgICAgIGNsYXNzTmFtZS5zd2FwKCBvdGhlci5jbGFzc05hbWUgKTsKKyAgICAgICAgZGVzY3JpcHRpb24uc3dhcCggb3RoZXIuZGVzY3JpcHRpb24gKTsKKyAgICAgICAgdGFncy5zd2FwKCBvdGhlci50YWdzICk7CisgICAgICAgIGxjYXNlVGFncy5zd2FwKCBvdGhlci5sY2FzZVRhZ3MgKTsKKyAgICAgICAgdGFnc0FzU3RyaW5nLnN3YXAoIG90aGVyLnRhZ3NBc1N0cmluZyApOworICAgICAgICBzdGQ6OnN3YXAoIFRlc3RDYXNlSW5mbzo6cHJvcGVydGllcywgc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvJj4oIG90aGVyICkucHJvcGVydGllcyApOworICAgICAgICBzdGQ6OnN3YXAoIGxpbmVJbmZvLCBvdGhlci5saW5lSW5mbyApOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgdGVzdC0+aW52b2tlKCk7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiAgdGVzdC5nZXQoKSA9PSBvdGhlci50ZXN0LmdldCgpICYmCisgICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhlci5uYW1lICYmCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7CisgICAgfQorICAgIFRlc3RDYXNlJiBUZXN0Q2FzZTo6b3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgVGVzdENhc2UgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdmVyc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBWZXJzaW9uOjpWZXJzaW9uCisgICAgICAgICggICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKQorICAgIDogICBtYWpvclZlcnNpb24oIF9tYWpvclZlcnNpb24gKSwKKyAgICAgICAgbWlub3JWZXJzaW9uKCBfbWlub3JWZXJzaW9uICksCisgICAgICAgIHBhdGNoTnVtYmVyKCBfcGF0Y2hOdW1iZXIgKSwKKyAgICAgICAgYnJhbmNoTmFtZSggX2JyYW5jaE5hbWUgKSwKKyAgICAgICAgYnVpbGROdW1iZXIoIF9idWlsZE51bWJlciApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICkgeworICAgICAgICBvcyAgPDwgdmVyc2lvbi5tYWpvclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLm1pbm9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ucGF0Y2hOdW1iZXI7CisgICAgICAgIC8vIGJyYW5jaE5hbWUgaXMgbmV2ZXIgbnVsbCAtPiAwdGggY2hhciBpcyBcMCBpZiBpdCBpcyBlbXB0eQorICAgICAgICBpZiAodmVyc2lvbi5icmFuY2hOYW1lWzBdKSB7CisgICAgICAgICAgICBvcyA8PCAnLScgPDwgdmVyc2lvbi5icmFuY2hOYW1lCisgICAgICAgICAgICAgICA8PCAnLicgPDwgdmVyc2lvbi5idWlsZE51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKSB7CisgICAgICAgIHN0YXRpYyBWZXJzaW9uIHZlcnNpb24oIDEsIDksIDQsICIiLCAwICk7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgdHlwZSggX3R5cGUgKSwKKyAgICAgICAgc2VxdWVuY2UoICsrZ2xvYmFsQ291bnQgKQorICAgIHt9CisKKyAgICAvLyBUaGlzIG1heSBuZWVkIHByb3RlY3RpbmcgaWYgdGhyZWFkaW5nIHN1cHBvcnQgaXMgYWRkZWQKKyAgICB1bnNpZ25lZCBpbnQgTWVzc2FnZUluZm86Omdsb2JhbENvdW50ID0gMDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkKKyAgICA6IG1faW5mbyggYnVpbGRlci5tX2luZm8gKQorICAgIHsKKyAgICAgICAgbV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucHVzaFNjb3BlZE1lc3NhZ2UoIG1faW5mbyApOworICAgIH0KKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApCisgICAgOiBtX2luZm8oIG90aGVyLm1faW5mbyApCisgICAge30KKworICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdlKCkgeworICAgICAgICBpZiAoICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICl7CisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucG9wU2NvcGVkTWVzc2FnZShtX2luZm8pOworICAgICAgICB9CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIC8vIERlcHJlY2F0ZWQKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZG91dCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0aW5nKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdGluZyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kR3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUsIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZE91dCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZEVyciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0U2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIENvdW50cyBjb25zdCYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5UZXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3ROYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgQWJvcnRlZCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyQWRhcHRlciA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApOworICAgICAgICB2aXJ0dWFsIH5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJUmVwb3J0ZXI+IG1fbGVnYWN5UmVwb3J0ZXI7CisgICAgfTsKK30KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApCisgICAgOiAgIG1fbGVnYWN5UmVwb3J0ZXIoIGxlZ2FjeVJlcG9ydGVyICkKKyAgICB7fQorICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6fkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpIHt9CisKKyAgICBSZXBvcnRlclByZWZlcmVuY2VzIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6Z2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gbV9sZWdhY3lSZXBvcnRlci0+c2hvdWxkUmVkaXJlY3RTdGRvdXQoKTsKKyAgICAgICAgcmV0dXJuIHByZWZzOworICAgIH0KKworICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSB7fQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0aW5nKCk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0R3JvdXAoIGdyb3VwSW5mby5uYW1lICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RDYXNlKCB0ZXN0SW5mbyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0U2VjdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgLy8gTm90IG9uIGxlZ2FjeSBpbnRlcmZhY2UKKyAgICB9CisKKyAgICBib29sIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0QnVpbGRlciByYiggaXQtPm1hY3JvTmFtZS5jX3N0cigpLCBpdC0+bGluZUluZm8sICIiLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAgIHJiIDw8IGl0LT5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgICByYi5zZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6OkluZm8gKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IHJiLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIHNlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5Ob0Fzc2VydGlvbnNJblNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdENhc2UKKyAgICAgICAgICAgICggICB0ZXN0Q2FzZVN0YXRzLnRlc3RJbmZvLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMudG90YWxzLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkT3V0LAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkRXJyICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgeworICAgICAgICBpZiggdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+QWJvcnRlZCgpOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRHcm91cCggdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUsIHRlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdGluZyggdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSB7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaHBwCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxMS1sb25nLWxvbmciCisjZW5kaWYKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICBzdGF0aWMgVUludDY0IGh6PTAsIGh6bz0wOworICAgICAgICAgICAgaWYgKCFoeikgeworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHogKSApOworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6byApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVSW50NjQgdDsKKyAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJnQgKSApOworICAgICAgICAgICAgcmV0dXJuICgodC1oem8pKjEwMDAwMDApL2h6OworICAgICAgICB9CisjZWxzZQorICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgdGltZXZhbCB0OworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0LENBVENIX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfc2VjICkgKiAxMDAwMDAwdWxsICsgc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl91c2VjICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgVGltZXI6OnN0YXJ0KCkgeworICAgICAgICBtX3RpY2tzID0gZ2V0Q3VycmVudFRpY2tzKCk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0Q3VycmVudFRpY2tzKCkgLSBtX3RpY2tzKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMCk7CisgICAgfQorICAgIGRvdWJsZSBUaW1lcjo6Z2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMDAwMC4wOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHByZWZpeC5iZWdpbigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwoc3VmZml4LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09IHN1ZmZpeDsKKyAgICB9CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuZmluZCggaW5maXggKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICB9CisgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICB9CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYyA9IHM7CisgICAgICAgIHRvTG93ZXJJblBsYWNlKCBsYyApOworICAgICAgICByZXR1cm4gbGM7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKworICAgICAgICByZXR1cm4gc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwgMStlbmQtc3RhcnQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKSB7CisgICAgICAgIGJvb2wgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzaXplX3QgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcyApOworICAgICAgICB3aGlsZSggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoIDAsIGkgKSArIHdpdGhUaGlzICsgc3RyLnN1YnN0ciggaStyZXBsYWNlVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGlmKCBpIDwgc3RyLnNpemUoKS13aXRoVGhpcy5zaXplKCkgKQorICAgICAgICAgICAgICAgIGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMsIGkrd2l0aFRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBsYWNlZDsKKyAgICB9CisKKyAgICBwbHVyYWxpc2U6OnBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApCisgICAgOiAgIG1fY291bnQoIGNvdW50ICksCisgICAgICAgIG1fbGFiZWwoIGxhYmVsICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApIHsKKyAgICAgICAgb3MgPDwgcGx1cmFsaXNlci5tX2NvdW50IDw8ICcgJyA8PCBwbHVyYWxpc2VyLm1fbGFiZWw7CisgICAgICAgIGlmKCBwbHVyYWxpc2VyLm1fY291bnQgIT0gMSApCisgICAgICAgICAgICBvcyA8PCAncyc7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oKSA6IGZpbGUoIiIpLCBsaW5lKCAwICl7fQorICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkKKyAgICA6ICAgZmlsZSggX2ZpbGUgKSwKKyAgICAgICAgbGluZSggX2xpbmUgKQorICAgIHt9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6ZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBmaWxlWzBdID09ICdcMCc7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA9PSBvdGhlci5saW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPT0gMCk7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lIDwgb3RoZXIubGluZSB8fCAoIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPCAwKSk7CisgICAgfQorCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIGlmKCBjb25maWcucm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgc3RkOjpzcmFuZCggY29uZmlnLnJuZ1NlZWQoKSApOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnJuZ1NlZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7CisjaWZuZGVmIF9fR05VR19fCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8ICcpJzsKKyNlbHNlCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5lOworI2VuZGlmCisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsb2NhdGlvbkluZm8gPDwgIjogSW50ZXJuYWwgQ2F0Y2ggZXJyb3I6ICciIDw8IG1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgaWYoIGFsd2F5c1RydWUoKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFNlY3Rpb25JbmZvOjpTZWN0aW9uSW5mbworICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKQorICAgIHt9CisKKyAgICBTZWN0aW9uOjpTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3NlY3Rpb25JbmNsdWRlZCggZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25TdGFydGVkKCBtX2luZm8sIG1fYXNzZXJ0aW9ucyApICkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBTZWN0aW9uOjp+U2VjdGlvbigpIHsKKyAgICAgICAgaWYoIG1fc2VjdGlvbkluY2x1ZGVkICkgeworICAgICAgICAgICAgU2VjdGlvbkVuZEluZm8gZW5kSW5mbyggbV9pbmZvLCBtX2Fzc2VydGlvbnMsIG1fdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworICAgICAgICAgICAgaWYoIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWRFYXJseSggZW5kSW5mbyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWQoIGVuZEluZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgIFNlY3Rpb246Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgI2luY2x1ZGUgPGFzc2VydC5oPgorICAgICNpbmNsdWRlIDxzdGRib29sLmg+CisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgZm9sbG93aW5nIHRlY2huaWNhbCBub3RlOgorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jcWEvcWEyMDA0L3FhMTM2MS5odG1sCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYmVpbmcgZGVidWdnZWQgKGVpdGhlcgorICAgICAgICAvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZhY3RvKS4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbWliWzRdOworICAgICAgICAgICAgc3RydWN0IGtpbmZvX3Byb2MgICBpbmZvOworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmbGFncyBzbyB0aGF0LCBpZiBzeXNjdGwgZmFpbHMgZm9yIHNvbWUgYml6YXJyZQorICAgICAgICAgICAgLy8gcmVhc29uLCB3ZSBnZXQgYSBwcmVkaWN0YWJsZSByZXN1bHQuCisKKyAgICAgICAgICAgIGluZm8ua3BfcHJvYy5wX2ZsYWcgPSAwOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIG1pYiwgd2hpY2ggdGVsbHMgc3lzY3RsIHRoZSBpbmZvIHdlIHdhbnQsIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gd2UncmUgbG9va2luZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIElELgorCisgICAgICAgICAgICBtaWJbMF0gPSBDVExfS0VSTjsKKyAgICAgICAgICAgIG1pYlsxXSA9IEtFUk5fUFJPQzsKKyAgICAgICAgICAgIG1pYlsyXSA9IEtFUk5fUFJPQ19QSUQ7CisgICAgICAgICAgICBtaWJbM10gPSBnZXRwaWQoKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBzeXNjdGwuCisKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgICAgICBpZiggc3lzY3RsKG1pYiwgc2l6ZW9mKG1pYikgLyBzaXplb2YoKm1pYiksICZpbmZvLCAmc2l6ZSwgQ0FUQ0hfTlVMTCwgMCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8ICJcbioqIENhbGwgdG8gc3lzY3RsIGZhaWxlZCAtIHVuYWJsZSB0byBkZXRlcm1pbmUgaWYgZGVidWdnZXIgaXMgYWN0aXZlICoqXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIGJlaW5nIGRlYnVnZ2VkIGlmIHRoZSBQX1RSQUNFRCBmbGFnIGlzIHNldC4KKworICAgICAgICAgICAgcmV0dXJuICggKGluZm8ua3BfcHJvYy5wX2ZsYWcgJiBQX1RSQUNFRCkgIT0gMCApOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAjaW5jbHVkZSA8ZnN0cmVhbT4KKyAgICAjaW5jbHVkZSA8c3RyaW5nPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworICAgICAgICAvLyBUaGUgc3RhbmRhcmQgUE9TSVggd2F5IG9mIGRldGVjdGluZyBhIGRlYnVnZ2VyIGlzIHRvIGF0dGVtcHQgdG8KKyAgICAgICAgLy8gcHRyYWNlKCkgdGhlIHByb2Nlc3MsIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgZnJvbSBhIGNoaWxkIGFuZCBub3QKKyAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGl0c2VsZiB0byBzdGlsbCBhbGxvdyBhdHRhY2hpbmcgdG8gdGhpcyBwcm9jZXNzIGxhdGVyCisgICAgICAgIC8vIGlmIHdhbnRlZCwgc28gaXMgcmF0aGVyIGhlYXZ5LiBVbmRlciBMaW51eCB3ZSBoYXZlIHRoZSBQSUQgb2YgdGhlCisgICAgICAgIC8vICJkZWJ1Z2dlciIgKHdoaWNoIGRvZXNuJ3QgbmVlZCB0byBiZSBnZGIsIG9mIGNvdXJzZSwgaXQgY291bGQgYWxzbworICAgICAgICAvLyBiZSBzdHJhY2UsIGZvciBleGFtcGxlKSBpbiAvcHJvYy8kUElEL3N0YXR1cywgc28ganVzdCBnZXQgaXQgZnJvbQorICAgICAgICAvLyB0aGVyZSBpbnN0ZWFkLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKyAgICAgICAgICAgIC8vIExpYnN0ZGMrKyBoYXMgYSBidWcsIHdoZXJlIHN0ZDo6aWZzdHJlYW0gc2V0cyBlcnJubyB0byAwCisgICAgICAgICAgICAvLyBUaGlzIHdheSBvdXIgdXNlcnMgY2FuIHByb3Blcmx5IGFzc2VydCBvdmVyIGVycm5vIHZhbHVlcworICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gaW4oIi9wcm9jL3NlbGYvc3RhdHVzIik7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShpbiwgbGluZSk7ICkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFRklYX0xFTiA9IDExOworICAgICAgICAgICAgICAgIGlmKCBsaW5lLmNvbXBhcmUoMCwgUFJFRklYX0xFTiwgIlRyYWNlclBpZDpcdCIpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHRyYWNlZCBpZiB0aGUgUElEIGlzIG5vdCAwIGFuZCBubyBvdGhlciBQSUQgc3RhcnRzCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMCBkaWdpdCwgc28gaXQncyBlbm91Z2ggdG8gY2hlY2sgZm9yIGp1c3QgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKSA+IFBSRUZJWF9MRU4gJiYgbGluZVtQUkVGSVhfTEVOXSAhPSAnMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgaW5saW5lIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIHRleHQuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgLy8gIVRCRDogTmVlZCBhIHZlcnNpb24gZm9yIE1hYy8gWENvZGUgYW5kIG90aGVyIElERXMKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZyA9ICJ7P30iOworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgY29uc3QgaW50IGhleFRocmVzaG9sZCA9IDI1NTsKKworICAgICAgICBzdHJ1Y3QgRW5kaWFubmVzcyB7CisgICAgICAgICAgICBlbnVtIEFyY2ggeyBCaWcsIExpdHRsZSB9OworCisgICAgICAgICAgICBzdGF0aWMgQXJjaCB3aGljaCgpIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBfeworICAgICAgICAgICAgICAgICAgICBpbnQgYXNJbnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYXNDaGFyW3NpemVvZiAoaW50KV07CisgICAgICAgICAgICAgICAgfSB1OworCisgICAgICAgICAgICAgICAgdS5hc0ludCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuICggdS5hc0NoYXJbc2l6ZW9mKGludCktMV0gPT0gMSApID8gQmlnIDogTGl0dGxlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgIHsKKyAgICAgICAgLy8gUmV2ZXJzZSBvcmRlciBmb3IgbGl0dGxlIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisgICAgICAgIGludCBpID0gMCwgZW5kID0gc3RhdGljX2Nhc3Q8aW50Piggc2l6ZSApLCBpbmMgPSAxOworICAgICAgICBpZiggRW5kaWFubmVzczo6d2hpY2goKSA9PSBFbmRpYW5uZXNzOjpMaXR0bGUgKSB7CisgICAgICAgICAgICBpID0gZW5kLTE7CisgICAgICAgICAgICBlbmQgPSBpbmMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ5dGVzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciBjb25zdCAqPihvYmplY3QpOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXg7CisgICAgICAgIGZvciggOyBpICE9IGVuZDsgaSArPSBpbmMgKQorICAgICAgICAgICAgIG9zIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnl0ZXNbaV0pOworICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgc3RkOjpzdHJpbmcgcyA9IHZhbHVlOworICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG93SW52aXNpYmxlcygpICkgeworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnM7CisgICAgICAgICAgICBzd2l0Y2goIHNbaV0gKSB7CisgICAgICAgICAgICBjYXNlICdcbic6IHN1YnMgPSAiXFxuIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcdCc6IHN1YnMgPSAiXFx0IjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhc3Vicy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0ciggMCwgaSApICsgc3VicyArIHMuc3Vic3RyKCBpKzEgKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICciJyArIHMgKyAnIic7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgcy5yZXNlcnZlKCB2YWx1ZS5zaXplKCkgKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUuc2l6ZSgpOyArK2kgKQorICAgICAgICBzICs9IHZhbHVlW2ldIDw9IDB4ZmYgPyBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWVbaV0gKSA6ICc/JzsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6c3RyaW5nKCB2YWx1ZSApICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6d3N0cmluZyh2YWx1ZSkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggdmFsdWUgKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZnBUb1N0cmluZyggVCB2YWx1ZSwgaW50IHByZWNpc2lvbiApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkKKyAgICAgICAgPDwgc3RkOjpmaXhlZAorICAgICAgICA8PCB2YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBkID0gb3NzLnN0cigpOworICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9ub3Rfb2YoICcwJyApOworICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5zaXplKCktMSApIHsKKyAgICAgICAgaWYoIGRbaV0gPT0gJy4nICkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZCA9IGQuc3Vic3RyKCAwLCBpKzEgKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCAxMCApOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgNSApICsgJ2YnOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApIHsKKyAgICBpZiAoIHZhbHVlID09ICdccicgKQorICAgICAgICByZXR1cm4gIidcXHInIjsKKyAgICBpZiAoIHZhbHVlID09ICdcZicgKQorICAgICAgICByZXR1cm4gIidcXGYnIjsKKyAgICBpZiAoIHZhbHVlID09ICdcbicgKQorICAgICAgICByZXR1cm4gIidcXG4nIjsKKyAgICBpZiAoIHZhbHVlID09ICdcdCcgKQorICAgICAgICByZXR1cm4gIidcXHQnIjsKKyAgICBpZiAoICdcMCcgPD0gdmFsdWUgJiYgdmFsdWUgPCAnICcgKQorICAgICAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHZhbHVlICkgKTsKKyAgICBjaGFyIGNoc3RyW10gPSAiJyAnIjsKKyAgICBjaHN0clsxXSA9IHZhbHVlOworICAgIHJldHVybiBjaHN0cjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICByZXR1cm4gIm51bGxwdHIiOworfQorI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBbbnNPYmplY3QgZGVzY3JpcHRpb25dICk7CisgICAgfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggc3RkOjpzdHJpbmcgY29uc3QmIGNhcHR1cmVkRXhwcmVzc2lvbiwgc3RkOjpzdHJpbmcgY29uc3QmIHNlY29uZEFyZyApIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZEFyZy5lbXB0eSgpIHx8IHNlY29uZEFyZyA9PSAiXCJcIiIKKyAgICAgICAgICAgID8gY2FwdHVyZWRFeHByZXNzaW9uCisgICAgICAgICAgICA6IGNhcHR1cmVkRXhwcmVzc2lvbiArICIsICIgKyBzZWNvbmRBcmc7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXI6OlJlc3VsdEJ1aWxkZXIoICAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnICkKKyAgICA6ICAgbV9hc3NlcnRpb25JbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIGNhcHR1cmVkRXhwcmVzc2lvbiwgc2Vjb25kQXJnICksIHJlc3VsdERpc3Bvc2l0aW9uICksCisgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgbV9zaG91bGRUaHJvdyggZmFsc2UgKSwKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiggZmFsc2UgKQorICAgIHt9CisKKyAgICBSZXN1bHRCdWlsZGVyOjp+UmVzdWx0QnVpbGRlcigpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmICggbV9ndWFyZEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCAiRXhjZXB0aW9uIHRyYW5zbGF0aW9uIHdhcyBkaXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFIjsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpLT5leGNlcHRpb25FYXJseVJlcG9ydGVkKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0ID8gUmVzdWx0V2FzOjpPayA6IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6ZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCggZXhwciApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gKSB7CisgICAgICAgIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiA9IHJlc3VsdERpc3Bvc2l0aW9uOworICAgICAgICBtX3N0cmVhbS5vc3MgPDwgQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICBzZXRSZXN1bHRUeXBlKCByZXN1bHRUeXBlICk7CisgICAgICAgIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKSB7CisgICAgICAgIGlmKCBleHBlY3RlZE1lc3NhZ2UuZW1wdHkoKSApCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaEFsbE9mPHN0ZDo6c3RyaW5nPigpICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkVxdWFscyggZXhwZWN0ZWRNZXNzYWdlICkgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApIHsKKworICAgICAgICBhc3NlcnQoICFpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKworICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXNzYWdlID0gQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiggIW1hdGNoZXIubWF0Y2goIGFjdHVhbE1lc3NhZ2UgKSApIHsKKyAgICAgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBhY3R1YWxNZXNzYWdlOworICAgICAgICB9CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cHJlc3Npb24oKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCgpOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6aGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApCisgICAgeworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQoIHJlc3VsdCApOworCisgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG91bGREZWJ1Z0JyZWFrKCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayA9IHRydWU7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSdW5uZXIoKS0+YWJvcnRpbmcoKSB8fCAobV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkVGhyb3cgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWFjdCgpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmIChtX3Nob3VsZERlYnVnQnJlYWspIHsKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIFRvIGluc3BlY3QgdGhlIHN0YXRlIGR1cmluZyB0ZXN0LCB5b3UgbmVlZCB0byBnbyBvbmUgbGV2ZWwgdXAgdGhlIGNhbGxzdGFjaworICAgICAgICAgICAgLy8gVG8gZ28gYmFjayB0byB0aGUgdGVzdCBhbmQgY2hhbmdlIGV4ZWN1dGlvbiwganVtcCBvdmVyIHRoZSB0aHJvdyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKCBtX3Nob3VsZFRocm93ICkKKyAgICAgICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6c2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRGVidWdCcmVhazsgfQorICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6YWxsb3dUaHJvd3MoKSBjb25zdCB7IHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygpOyB9CisKKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKCAqdGhpcyApOworICAgIH0KKworICAgIC8vIENBVkVBVDogVGhlIHJldHVybmVkIEFzc2VydGlvblJlc3VsdCBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCBleHByLAorICAgIC8vICAgICAgICAgYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sIHdoaWNoIGluIHR1cm4gaG9sZHMgcmVmZXJlbmNlcyB0bworICAgIC8vICAgICAgICAgb3BlcmFuZHMsIHBvc3NpYmx5IHRlbXBvcmFyeSBhcyB3ZWxsLgorICAgIC8vICAgICAgICAgSXQgc2hvdWxkIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byBoYW5kbGVSZXN1bHQ7IGlmIHRoZSBleHByZXNzaW9uCisgICAgLy8gICAgICAgICBuZWVkcyB0byBiZSByZXBvcnRlZCwgaXRzIHN0cmluZyBleHBhbnNpb24gbXVzdCBiZSBjb21wb3NlZCBiZWZvcmUKKyAgICAvLyAgICAgICAgIHRoZSB0ZW1wb3JhcmllcyBhcmUgZGVzdHJveWVkLgorICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtX2RhdGEucmVzdWx0VHlwZSAhPSBSZXN1bHRXYXM6OlVua25vd24gKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworCisgICAgICAgIC8vIEZsaXAgYm9vbCByZXN1bHRzIGlmIEZhbHNlVGVzdCBmbGFnIGlzIHNldAorICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkgeworICAgICAgICAgICAgZGF0YS5uZWdhdGUoIGV4cHIuaXNCaW5hcnlFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEubWVzc2FnZSA9IG1fc3RyZWFtLm9zcy5zdHIoKTsKKyAgICAgICAgZGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9ICZleHByOyAvLyBmb3IgbGF6eSByZWNvbnN0cnVjdGlvbgorICAgICAgICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCB7CisgICAgICAgIGRlc3QgPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6c2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSB0cnVlOworICAgIH0KKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVuc2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVGFnQWxpYXNSZWdpc3RyeTo6flRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgT3B0aW9uPFRhZ0FsaWFzPiBUYWdBbGlhc1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5maW5kKCBhbGlhcyApOworICAgICAgICBpZiggaXQgIT0gbV9yZWdpc3RyeS5lbmQoKSApCisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9wdGlvbjxUYWdBbGlhcz4oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUYWdBbGlhc1JlZ2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZFRlc3RTcGVjID0gdW5leHBhbmRlZFRlc3RTcGVjOworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5iZWdpbigpLCBpdEVuZCA9IG1fcmVnaXN0cnkuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IGV4cGFuZGVkVGVzdFNwZWMuZmluZCggaXQtPmZpcnN0ICk7CisgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMgPSAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIDAsIHBvcyApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQudGFnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCBwb3MgKyBpdC0+Zmlyc3Quc2l6ZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7CisgICAgfQorCisgICAgdm9pZCBUYWdBbGlhc1JlZ2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggYWxpYXMsICJbQCIgKSB8fCAhZW5kc1dpdGgoIGFsaWFzLCAnXScgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0uXG4iCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lICkKKyAgICAgICAgICAgICAgICA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFtX3JlZ2lzdHJ5Lmluc2VydCggc3RkOjptYWtlX3BhaXIoIGFsaWFzLCBUYWdBbGlhcyggdGFnLCBsaW5lSW5mbyApICkgKS5zZWNvbmQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIKKyAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgZmluZChhbGlhcyktPmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgIlx0UmVkZWZpbmVkIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUpIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICB9CisKKyAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGFnQWxpYXMoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzX3N0cmluZy5ocHAKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBDYXNlZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV9zdHIoIGFkanVzdFN0cmluZyggc3RyICkgKQorICAgICAgICB7fQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6YWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyB0b0xvd2VyKCBzdHIgKQorICAgICAgICAgICAgICAgICAgIDogc3RyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjpjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/ICIgKGNhc2UgaW5zZW5zaXRpdmUpIgorICAgICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlOjpTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKQorICAgICAgICA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApLAorICAgICAgICAgIG1fb3BlcmF0aW9uKCBvcGVyYXRpb24gKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBTdHJpbmdNYXRjaGVyQmFzZTo6ZGVzY3JpYmUoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoNSArIG1fb3BlcmF0aW9uLnNpemUoKSArIG1fY29tcGFyYXRvci5tX3N0ci5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKS5zaXplKCkpOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9vcGVyYXRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiOiBcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgRXF1YWxzTWF0Y2hlcjo6RXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZXF1YWxzIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFcXVhbHNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSA9PSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgIH0KKworICAgICAgICBDb250YWluc01hdGNoZXI6OkNvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiY29udGFpbnMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIENvbnRhaW5zTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyOjpTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAic3RhcnRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIFN0YXJ0c1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBFbmRzV2l0aE1hdGNoZXI6OkVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZW5kcyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFbmRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfbXVsdGkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9NVUxUSV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnMgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+ID4gUmVwb3J0ZXJzOworICAgIFJlcG9ydGVycyBtX3JlcG9ydGVyczsKKworcHVibGljOgorICAgIHZvaWQgYWRkKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKSB7CisgICAgICAgIG1fcmVwb3J0ZXJzLnB1c2hfYmFjayggcmVwb3J0ZXIgKTsKKyAgICB9CisKK3B1YmxpYzogLy8gSVN0cmVhbWluZ1JlcG9ydGVyCisKKyAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiBtX3JlcG9ydGVyc1swXS0+Z2V0UHJlZmVyZW5jZXMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3BlYyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RSdW5JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5hc3NlcnRpb25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOworICAgIH0KKworICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGJvb2wgY2xlYXJCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGNsZWFyQnVmZmVyIHw9ICgqaXQpLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgcmV0dXJuIGNsZWFyQnVmZmVyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNraXBUZXN0KCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworfTsKKworUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICkgeworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlc3VsdGluZ1JlcG9ydGVyOworCisgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKSB7CisgICAgICAgIE11bHRpcGxlUmVwb3J0ZXJzKiBtdWx0aSA9IGV4aXN0aW5nUmVwb3J0ZXItPnRyeUFzTXVsdGkoKTsKKyAgICAgICAgaWYoICFtdWx0aSApIHsKKyAgICAgICAgICAgIG11bHRpID0gbmV3IE11bHRpcGxlUmVwb3J0ZXJzOworICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiggbXVsdGkgKTsKKyAgICAgICAgICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkKKyAgICAgICAgICAgICAgICBtdWx0aS0+YWRkKCBleGlzdGluZ1JlcG9ydGVyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBleGlzdGluZ1JlcG9ydGVyOworICAgICAgICBtdWx0aS0+YWRkKCBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGFkZGl0aW9uYWxSZXBvcnRlcjsKKworICAgIHJldHVybiByZXN1bHRpbmdSZXBvcnRlcjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfeG1sLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfWE1MX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfYmFzZXMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9CQVNFU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIC8vIEJlY2F1c2UgZm9ybWF0dGluZyB1c2luZyBjKysgc3RyZWFtcyBpcyBzdGF0ZWZ1bCwgZHJvcCBkb3duIHRvIEMgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8gQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCB1c2Ugc3RyaW5nc3RyZWFtLCBidXQgaXRzIHBlcmZvcm1hbmNlIGlzLi4uIG5vdCBnb29kLgorICAgICAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICAgICAgLy8gTWF4IGV4cG9uZW50ICsgMSBpcyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHdob2xlIHBhcnQKKyAgICAgICAgICAgIC8vICsgMSBmb3IgZGVjaW1hbCBwb2ludAorICAgICAgICAgICAgLy8gKyAzIGZvciB0aGUgMyBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAgLy8gKyAxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAgKyAxICsgMSArIDMgKyAxOworICAgICAgICAgICAgY2hhciBidWZmZXJbbWF4RG91YmxlU2l6ZV07CisKKyAgICAgICAgICAgIC8vIFNhdmUgcHJldmlvdXMgZXJybm8sIHRvIHByZXZlbnQgc3ByaW50ZiBmcm9tIG92ZXJ3cml0aW5nIGl0CisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzcHJpbnRmX3MoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbHNlCisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBfdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8gPSBfdGVzdFJ1bkluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvID0gX2dyb3VwSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8gPSBfdGVzdEluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIC8qIF9zZWN0aW9uU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiAvKiBfdGVzdENhc2VTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiAvKiBfdGVzdEdyb3VwU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiAvKiBfdGVzdFJ1blN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworCisgICAgICAgIExhenlTdGF0PFRlc3RSdW5JbmZvPiBjdXJyZW50VGVzdFJ1bkluZm87CisgICAgICAgIExhenlTdGF0PEdyb3VwSW5mbz4gY3VycmVudEdyb3VwSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8VGVzdENhc2VJbmZvPiBjdXJyZW50VGVzdENhc2VJbmZvOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisgICAgfTsKKworICAgIHN0cnVjdCBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hpbGROb2RlVD4KKyAgICAgICAgc3RydWN0IE5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgTm9kZSggVCBjb25zdCYgX3ZhbHVlICkgOiB2YWx1ZSggX3ZhbHVlICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5vZGUoKSB7fQorCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxDaGlsZE5vZGVUPiA+IENoaWxkTm9kZXM7CisgICAgICAgICAgICBUIHZhbHVlOworICAgICAgICAgICAgQ2hpbGROb2RlcyBjaGlsZHJlbjsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlY3Rpb25Ob2RlKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zdGF0cyApIDogc3RhdHMoIF9zdGF0cyApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uTm9kZSgpOworCisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggU2VjdGlvbk5vZGUgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBvdGhlci5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggKm90aGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBzdGF0czsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IENoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBBc3NlcnRpb25zOworICAgICAgICAgICAgQ2hpbGRTZWN0aW9ucyBjaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgQXNzZXJ0aW9ucyBhc3NlcnRpb25zOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCeVNlY3Rpb25JbmZvIHsKKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIgKSB7fQorICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggQnlTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyLm1fb3RoZXIgKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcigpICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgbm9kZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS0+c3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gbV9vdGhlci5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBCeVNlY3Rpb25JbmZvIGNvbnN0JiApOworICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIG1fb3RoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RDYXNlU3RhdHMsIFNlY3Rpb25Ob2RlPiBUZXN0Q2FzZU5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPiBUZXN0R3JvdXBOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdFJ1blN0YXRzLCBUZXN0R3JvdXBOb2RlPiBUZXN0UnVuTm9kZTsKKworICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIH5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBpbmNvbXBsZXRlU3RhdHMoIHNlY3Rpb25JbmZvLCBDb3VudHMoKSwgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbm9kZTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCAhbV9yb290U2VjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24gPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgIG5vZGUgPSBtX3Jvb3RTZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHBhcmVudE5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZiggICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIHNlY3Rpb25JbmZvICkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24gPSBub2RlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgc2VjdGlvbk5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5wdXNoX2JhY2soIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgICAgICAvLyBBc3NlcnRpb25SZXN1bHQgaG9sZHMgYSBwb2ludGVyIHRvIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgLy8gd2hpY2ggZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY2FsbHMgdG8gYnVpbGQgdGhlIGV4cHJlc3Npb24gc3RyaW5nLgorICAgICAgICAgICAgLy8gT3VyIHNlY3Rpb24gc3RhY2sgY29weSBvZiB0aGUgYXNzZXJ0aW9uUmVzdWx0IHdpbGwgbGlrZWx5IG91dGxpdmUgdGhlCisgICAgICAgICAgICAvLyB0ZW1wb3JhcnksIHNvIGl0IG11c3QgYmUgZXhwYW5kZWQgb3IgZGlzY2FyZGVkIG5vdyB0byBhdm9pZCBjYWxsaW5nCisgICAgICAgICAgICAvLyBhIGRlc3Ryb3llZCBvYmplY3QgbGF0ZXIuCisgICAgICAgICAgICBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJhY2soKS5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIG5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgbm9kZS5zdGF0cyA9IHNlY3Rpb25TdGF0czsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdENhc2VOb2RlPiBub2RlID0gbmV3IFRlc3RDYXNlTm9kZSggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgYXNzZXJ0KCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPT0gMCApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucHVzaF9iYWNrKCBtX3Jvb3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX3Rlc3RDYXNlcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24ucmVzZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBtX2RlZXBlc3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RHcm91cE5vZGU+IG5vZGUgPSBuZXcgVGVzdEdyb3VwTm9kZSggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdENhc2VzICk7CisgICAgICAgICAgICBtX3Rlc3RHcm91cHMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdFJ1bk5vZGU+IG5vZGUgPSBuZXcgVGVzdFJ1bk5vZGUoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0R3JvdXBzICk7CisgICAgICAgICAgICBtX3Rlc3RSdW5zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIEFzc2VydGlvblJlc3VsdCYgcmVzdWx0ICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBtX2Fzc2VydGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiA+IG1fc2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0Q2FzZU5vZGU+ID4gbV90ZXN0Q2FzZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0R3JvdXBOb2RlPiA+IG1fdGVzdEdyb3VwczsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdFJ1bk5vZGU+ID4gbV90ZXN0UnVuczsKKworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fcm9vdFNlY3Rpb247CisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9kZWVwZXN0U2VjdGlvbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxjaGFyIEM+CisgICAgY2hhciBjb25zdCogZ2V0TGluZU9mQ2hhcnMoKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEhdID0gezB9OworICAgICAgICBpZiggISpsaW5lICkgeworICAgICAgICAgICAgc3RkOjptZW1zZXQoIGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKTsKKyAgICAgICAgICAgIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHN0cnVjdCBUZXN0RXZlbnRMaXN0ZW5lckJhc2UgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF9yZXBvcnRlcl9yZWdpc3RyYXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUkFSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBJUmVwb3J0ZXJGYWN0b3J5IHsKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIG5ldyBUKCBjb25maWcgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgLy8gKioqIFBsZWFzZSBOb3RlICoqKjoKKyAgICAgICAgICAgIC8vIC0gSWYgeW91IGVuZCB1cCBoZXJlIGxvb2tpbmcgYXQgYSBjb21waWxlciBlcnJvciBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAvLyB5b3VyIGN1c3RvbSByZXBvcnRlciBjbGFzcyBiZSBhd2FyZSB0aGF0IHRoZSBuYXRpdmUgcmVwb3J0ZXIgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyB0byBJU3RyZWFtaW5nUmVwb3J0ZXIuIFRoZSAibGVnYWN5IiBpbnRlcmZhY2UsIElSZXBvcnRlciwgaXMgc3RpbGwgc3VwcG9ydGVkIHZpYQorICAgICAgICAgICAgLy8gYW4gYWRhcHRlci4gSnVzdCB1c2UgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBhZGFwdGVyLgorICAgICAgICAgICAgLy8gSG93ZXZlciBwbGVhc2UgY29uc2lkZXIgdXBkYXRpbmcgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYXMgdGhlIG9sZCBvbmUgaXMgbm93CisgICAgICAgICAgICAvLyBkZXByZWNhdGVkIGFuZCB3aWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgcXVpdGUgc29vbiEKKyAgICAgICAgICAgIC8vIFBsZWFzZSBjb250YWN0IG1lIHZpYSBnaXRodWIgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhdCBhbGwgYWJvdXQgdGhpcy4KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIGlkZWFsbHksIHBsZWFzZSBjb250YWN0IG1lIGFueXdheSB0byBsZXQgbWUga25vdyB5b3UndmUgaGl0IHRoaXMgLSBhcyBJIGhhdmUKKyAgICAgICAgICAgIC8vIG5vIGlkZWEgd2hvIGlzIGFjdHVhbGx5IHVzaW5nIGN1c3RvbSByZXBvcnRlcnMgYXQgYWxsIChwb3NzaWJseSBuby1vbmUhKS4KKyAgICAgICAgICAgIC8vIFRoZSBuZXcgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIG1pbmltaXNlIGV4cG9zdXJlIHRvIGludGVyZmFjZSBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgUmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgTGlzdGVuZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExpc3RlbmVyUmVnaXN0cmFyKCkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJMaXN0ZW5lciggbmV3IExpc3RlbmVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkxlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKy8vIERlcHJlY2F0ZWQgLSB1c2UgdGhlIGZvcm0gd2l0aG91dCBJTlRFUk5BTF8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF94bWx3cml0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9YTUxXUklURVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFhtbEVuY29kZSB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIEZvcldoYXQgeyBGb3JUZXh0Tm9kZXMsIEZvckF0dHJpYnV0ZXMgfTsKKworICAgICAgICBYbWxFbmNvZGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIEZvcldoYXQgZm9yV2hhdCA9IEZvclRleHROb2RlcyApCisgICAgICAgIDogICBtX3N0ciggc3RyICksCisgICAgICAgICAgICBtX2ZvcldoYXQoIGZvcldoYXQgKQorICAgICAgICB7fQorCisgICAgICAgIHZvaWQgZW5jb2RlVG8oIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisKKyAgICAgICAgICAgIC8vIEFwb3N0cm9waGUgZXNjYXBpbmcgbm90IG5lY2Vzc2FyeSBpZiB3ZSBhbHdheXMgdXNlICIgdG8gd3JpdGUgYXR0cmlidXRlcworICAgICAgICAgICAgLy8gKHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgpCisKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX3N0ci5zaXplKCk7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gbV9zdHJbaV07CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzogICBvcyA8PCAiJmFtcDsiOyBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID4gMiAmJiBtX3N0cltpLTFdID09ICddJyAmJiBtX3N0cltpLTJdID09ICddJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZndDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbV9mb3JXaGF0ID09IEZvckF0dHJpYnV0ZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImcXVvdDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGNvbnRyb2wgY2hhcnMgLSBiYXNlZCBvbiBjb250cmlidXRpb24gYnkgQGVzcGVuYWxiIGluIFBSICM0NjUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBAbXJwaSBQUiAjNTg4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggYyA+PSAwICYmIGMgPCAnXHgwOScgKSB8fCAoIGMgPiAnXHgwRCcgJiYgYyA8ICdceDIwJykgfHwgYz09J1x4N0YnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHktYXJlLWNvbnRyb2wtY2hhcmFjdGVycy1pbGxlZ2FsLWluLXhtbC0xLTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KCBjICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFhtbEVuY29kZSBjb25zdCYgeG1sRW5jb2RlICkgeworICAgICAgICAgICAgeG1sRW5jb2RlLmVuY29kZVRvKCBvcyApOworICAgICAgICAgICAgcmV0dXJuIG9zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgRm9yV2hhdCBtX2ZvcldoYXQ7CisgICAgfTsKKworICAgIGNsYXNzIFhtbFdyaXRlciB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIFNjb3BlZEVsZW1lbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBYbWxXcml0ZXIqIHdyaXRlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIHdyaXRlciApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBTY29wZWRFbGVtZW50IGNvbnN0JiBvdGhlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIG90aGVyLm1fd3JpdGVyICl7CisgICAgICAgICAgICAgICAgb3RoZXIubV93cml0ZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB+U2NvcGVkRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiggbV93cml0ZXIgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlci0+ZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlVGV4dCggdGV4dCwgaW5kZW50ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIG11dGFibGUgWG1sV3JpdGVyKiBtX3dyaXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBYbWxXcml0ZXIoKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIENhdGNoOjpjb3V0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIoIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIG9zICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgflhtbFdyaXRlcigpIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbV90YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgc3RhcnRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICc8JyA8PCBuYW1lOworICAgICAgICAgICAgbV90YWdzLnB1c2hfYmFjayggbmFtZSApOworICAgICAgICAgICAgbV9pbmRlbnQgKz0gIiAgIjsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZCggdGhpcyApOworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCBuYW1lICk7CisgICAgICAgICAgICByZXR1cm4gc2NvcGVkOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KCkgeworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX2luZGVudCA9IG1faW5kZW50LnN1YnN0ciggMCwgbV9pbmRlbnQuc2l6ZSgpLTIgKTsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICIvPiI7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwvIiA8PCBtX3RhZ3MuYmFjaygpIDw8ICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgbV90YWdzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIGlmKCAhbmFtZS5lbXB0eSgpICYmICFhdHRyaWJ1dGUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0ZSwgWG1sRW5jb2RlOjpGb3JBdHRyaWJ1dGVzICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgYXR0cmlidXRlICkgeworICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCAoIGF0dHJpYnV0ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBhdHRyaWJ1dGU7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGUoIG5hbWUsIG9zcy5zdHIoKSApOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICBpZiggIXRleHQuZW1wdHkoKSApeworICAgICAgICAgICAgICAgIGJvb2wgdGFnV2FzT3BlbiA9IG1fdGFnSXNPcGVuOworICAgICAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgICAgIGlmKCB0YWdXYXNPcGVuICYmIGluZGVudCApCisgICAgICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBYbWxFbmNvZGUoIHRleHQgKTsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQ29tbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwhLS0iIDw8IHRleHQgPDwgIi0tPiI7CisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU3R5bGVzaGVldFJlZiggc3RkOjpzdHJpbmcgY29uc3QmIHVybCApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiIgPDwgdXJsIDw8ICJcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUJsYW5rTGluZSgpIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCAnXG4nOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbnN1cmVUYWdDbG9zZWQoKSB7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiPiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFhtbFdyaXRlciggWG1sV3JpdGVyIGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggWG1sV3JpdGVyIGNvbnN0JiApOworCisgICAgICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5KCkgeworICAgICAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIG1fdGFnSXNPcGVuOworICAgICAgICBib29sIG1fbmVlZHNOZXdsaW5lOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV90YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBtX2luZGVudDsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX29zOworICAgIH07CisKK30KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWVuYWJsZV93YXJuaW5ncy5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFRU5BQkxFX1dBUk5JTkdTX0hfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgICBlbHNlCisjICAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBYbWxSZXBvcnRlciA6IHB1YmxpYyBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgWG1sUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0oKSksCisgICAgICAgICAgICBtX3NlY3Rpb25EZXB0aCggMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5YbWxSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgYW4gWE1MIGRvY3VtZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3R5bGVzaGVldFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNvdXJjZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvICkgeworICAgICAgICAgICAgbV94bWwKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmaWxlbmFtZSIsIHNvdXJjZUluZm8uZmlsZSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibGluZSIsIHNvdXJjZUluZm8ubGluZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIFN0cmVhbWluZ1JlcG9ydGVyQmFzZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZXNoZWV0UmVmID0gZ2V0U3R5bGVzaGVldFJlZigpOworICAgICAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlU3R5bGVzaGVldFJlZiggc3R5bGVzaGVldFJlZiApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiQ2F0Y2giICk7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5uYW1lKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbV9jb25maWctPm5hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiR3JvdXAiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZVN0YXJ0aW5nKHRlc3RJbmZvKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlRlc3RDYXNlIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHRlc3RJbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCB0ZXN0SW5mby5kZXNjcmlwdGlvbiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidGFncyIsIHRlc3RJbmZvLnRhZ3NBc1N0cmluZyApOworCisgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHRlc3RJbmZvLmxpbmVJbmZvICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUaW1lci5zdGFydCgpOworICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25EZXB0aCsrID4gMCApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJTZWN0aW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCBzZWN0aW9uSW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCBzZWN0aW9uSW5mby5saW5lSW5mbyApOworICAgICAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgaWYoIGluY2x1ZGVSZXN1bHRzICkgeworICAgICAgICAgICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGluIDxJbmZvPiB0YWdzLgorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGl0LT50eXBlID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJXYXJuaW5nIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhwcmVzc2lvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1Y2NlZWRlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk9yaWdpbmFsIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiRXhwYW5kZWQiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuZC4uLiBQcmludCBhIHJlc3VsdCBhcHBsaWNhYmxlIHRvIGVhY2ggcmVzdWx0IHR5cGUuCisgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeGNlcHRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmF0YWxFcnJvckNvbmRpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FybmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgICAgICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5wYXNzZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdCIgKTsKKyAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgdGVzdENhc2VTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5hbGxPaygpICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIG1fdGVzdENhc2VUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZE91dCIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApLCBmYWxzZSApOworCisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lciBtX3Rlc3RDYXNlVGltZXI7CisgICAgICAgIFhtbFdyaXRlciBtX3htbDsKKyAgICAgICAgaW50IG1fc2VjdGlvbkRlcHRoOworICAgIH07CisKKyAgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJ4bWwiLCBYbWxSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2p1bml0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfSlVOSVRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUaW1lc3RhbXAoKSB7CisgICAgICAgICAgICAvLyBCZXdhcmUsIHRoaXMgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWVzCisgICAgICAgICAgICAvLyBBbHNvLCBVVEMgb25seSwgYWdhaW4gYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICgleiBpcyBDKysxMSkKKyAgICAgICAgICAgIHRpbWVfdCByYXd0aW1lOworICAgICAgICAgICAgc3RkOjp0aW1lKCZyYXd0aW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2VDE3OjA2OjQ1WiIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6dG0qIHRpbWVJbmZvOworICAgICAgICAgICAgdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmcmF3dGltZSk7CisjZW5kaWYKKworICAgICAgICAgICAgY2hhciB0aW1lU3RhbXBbdGltZVN0YW1wU2l6ZV07CisgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgZm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTWiI7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZvKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCB0aW1lSW5mbyk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0aW1lU3RhbXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSnVuaXRSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgeG1sKCBfY29uZmlnLnN0cmVhbSgpICksCisgICAgICAgICAgICBtX29rVG9GYWlsKCBmYWxzZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5KdW5pdFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBpbiBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQncyBqdW5pdHJlcG9ydCB0YXJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiAvKnNwZWMqLyApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHJ1bkluZm8gKTsKKyAgICAgICAgICAgIHhtbC5zdGFydEVsZW1lbnQoICJ0ZXN0c3VpdGVzIiApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN1aXRlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMgPSAwOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9va1RvRmFpbCA9IHRlc3RDYXNlSW5mby5va1RvRmFpbCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiAmJiAhbV9va1RvRmFpbCApCisgICAgICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMrKzsKKyAgICAgICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjphc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgZG91YmxlIHN1aXRlVGltZSA9IHN1aXRlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgd3JpdGVHcm91cCggKm1fdGVzdEdyb3Vwcy5iYWNrKCksIHN1aXRlVGltZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICB4bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUdyb3VwKCBUZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJsZSBzdWl0ZVRpbWUgKSB7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdHN1aXRlIiApOworICAgICAgICAgICAgVGVzdEdyb3VwU3RhdHMgY29uc3QmIHN0YXRzID0gZ3JvdXBOb2RlLnZhbHVlOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHN0YXRzLmdyb3VwSW5mby5uYW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJlcnJvcnMiLCB1bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQtdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRlc3RzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiaG9zdG5hbWUiLCAidGJkIiApOyAvLyAhVEJECisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsICIiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIHN1aXRlVGltZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZXN0YW1wIiwgZ2V0Q3VycmVudFRpbWVzdGFtcCgpICk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRlc3QgY2FzZXMKKyAgICAgICAgICAgIGZvciggVGVzdEdyb3VwTm9kZTo6Q2hpbGROb2Rlczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBncm91cE5vZGUuY2hpbGRyZW4uYmVnaW4oKSwgaXRFbmQgPSBncm91cE5vZGUuY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZVRlc3RDYXNlKCAqKml0ICk7CisKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZE91dEZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzdGRFcnJGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKCBUZXN0Q2FzZU5vZGUgY29uc3QmIHRlc3RDYXNlTm9kZSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlU3RhdHMgY29uc3QmIHN0YXRzID0gdGVzdENhc2VOb2RlLnZhbHVlOworCisgICAgICAgICAgICAvLyBBbGwgdGVzdCBjYXNlcyBoYXZlIGV4YWN0bHkgb25lIHNlY3Rpb24gLSB3aGljaCByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgLy8gdGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBoYXZlIDAtbiBuZXN0ZWQgc2VjdGlvbnMKKyAgICAgICAgICAgIGFzc2VydCggdGVzdENhc2VOb2RlLmNoaWxkcmVuLnNpemUoKSA9PSAxICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgcm9vdFNlY3Rpb24gPSAqdGVzdENhc2VOb2RlLmNoaWxkcmVuLmZyb250KCk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IHN0YXRzLnRlc3RJbmZvLmNsYXNzTmFtZTsKKworICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCByb290U2VjdGlvbi5jaGlsZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCAiIiwgcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTZWN0aW9uKCAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIGlmKCAhcm9vdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbmFtZSA9IHJvb3ROYW1lICsgJy8nICsgbmFtZTsKKworICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RjYXNlIiApOworICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJvb3QiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIENhdGNoOjp0b1N0cmluZyggc2VjdGlvbk5vZGUuc3RhdHMuZHVyYXRpb25JblNlY29uZHMgKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb25zKCBzZWN0aW9uTm9kZSApOworCisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRFcnIgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIG5hbWUsICIiLCAqKml0ICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgbmFtZSwgKippdCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbnMoIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkFzc2VydGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iZWdpbigpLCBpdEVuZCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbiggKml0ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbiggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBzdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisgICAgICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIHRoZXNlIGhlcmU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJpbnRlcm5hbEVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoIGVsZW1lbnROYW1lICk7CisKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNzYWdlIiwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0TWVzc2FnZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgcmVzdWx0LmdldE1lc3NhZ2UoKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBpdC0+bWVzc2FnZSA8PCAnXG4nOworCisgICAgICAgICAgICAgICAgb3NzIDw8ICJhdCAiIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlVGV4dCggb3NzLnN0cigpLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyIHhtbDsKKyAgICAgICAgVGltZXIgc3VpdGVUaW1lcjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZE91dEZvclN1aXRlOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkRXJyRm9yU3VpdGU7CisgICAgICAgIHVuc2lnbmVkIGludCB1bmV4cGVjdGVkRXhjZXB0aW9uczsKKyAgICAgICAgYm9vbCBtX29rVG9GYWlsOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImp1bml0IiwgSnVuaXRSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbnNvbGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT05TT0xFX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25zb2xlUmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBDb25zb2xlUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkKCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29uc29sZVJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgcGxhaW4gbGluZXMgb2YgdGV4dCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgbGF6eVByaW50KCk7CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIGluY2x1ZGVSZXN1bHRzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIF9zZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKSB7CisgICAgICAgICAgICAgICAgbGF6eVByaW50KCk7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gc2VjdGlvbiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiB0ZXN0IGNhc2UiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBfc2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIF90ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggY3VycmVudEdyb3VwSW5mby51c2VkICkgeworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeURpdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlN1bW1hcnkgZm9yIGdyb3VwICciIDw8IF90ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSA8PCAiJzpcbiI7CisgICAgICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCBfdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBwcmludFRvdGFsc0RpdmlkZXIoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogICBzdHJlYW0oIF9zdHJlYW0gKSwKKyAgICAgICAgICAgICAgICBzdGF0cyggX3N0YXRzICksCisgICAgICAgICAgICAgICAgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBDb2xvdXI6Ok5vbmUgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlKCByZXN1bHQuZ2V0TWVzc2FnZSgpICksCisgICAgICAgICAgICAgICAgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiUEFTU0VEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoIHJlc3VsdC5oYXNNZXNzYWdlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0gYnV0IHdhcyBvayI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiYmVjYXVzZSBubyBleGNlcHRpb24gd2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJpbmZvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3YXJuaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIioqIGludGVybmFsIGVycm9yICoqIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYoIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBwYXNzT3JGYWlsIDw8ICI6XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpPcmlnaW5hbEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCAiICAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cHJlc3Npb25Jbk1hY3JvKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIW1lc3NhZ2VMYWJlbC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IG1lc3NhZ2VMYWJlbCA8PCAnOicgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdC0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIGl0LT5tZXNzYWdlLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjogIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZUxhYmVsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBsYXp5UHJpbnQoKSB7CisKKyAgICAgICAgICAgIGlmKCAhY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludFJ1bkluZm8oKTsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRHcm91cEluZm8oKTsKKworICAgICAgICAgICAgaWYoICFtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50UnVuSW5mbygpIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgJ1xuJyA8PCBnZXRMaW5lT2ZDaGFyczwnfic+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6U2Vjb25kYXJ5VGV4dCApOworICAgICAgICAgICAgc3RyZWFtICA8PCBjdXJyZW50VGVzdFJ1bkluZm8tPm5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBhIENhdGNoIHYiICA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICIgaG9zdCBhcHBsaWNhdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlJ1biB3aXRoIC0/IGZvciBvcHRpb25zXG5cbiI7CisKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiUmFuZG9tbmVzcyBzZWVkZWQgdG86ICIgPDwgbV9jb25maWctPnJuZ1NlZWQoKSA8PCAiXG5cbiI7CisKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludEdyb3VwSW5mbygpIHsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby0+bmFtZS5lbXB0eSgpICYmIGN1cnJlbnRHcm91cEluZm8tPmdyb3Vwc0NvdW50cyA+IDEgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRDbG9zZWRIZWFkZXIoICJHcm91cDogIiArIGN1cnJlbnRHcm91cEluZm8tPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnVzZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIGN1cnJlbnRUZXN0Q2FzZUluZm8tPm5hbWUgKTsKKworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtX3NlY3Rpb25TdGFjay5iZWdpbigpKzEsIC8vIFNraXAgZmlyc3Qgc2VjdGlvbiAodGVzdCBjYXNlKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fc2VjdGlvblN0YWNrLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciggOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBpdC0+bmFtZSwgMiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbyA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsKKworICAgICAgICAgICAgaWYoICFsaW5lSW5mby5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRDbG9zZWRIZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggX25hbWUgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50T3BlbkhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgc3RyZWFtICA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBfbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc3RyaW5nIGhhcyBhIDogaW4gZmlyc3QgbGluZSB3aWxsIHNldCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCisgICAgICAgIC8vIHN1YnNlcXVlbnQgbGluZXMKKyAgICAgICAgdm9pZCBwcmludEhlYWRlclN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpID0gX3N0cmluZy5maW5kKCAiOiAiICk7CisgICAgICAgICAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBfc3RyaW5nLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50K2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIGluZGVudCApICkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBTdW1tYXJ5Q29sdW1uIHsKKworICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiggc3RkOjpzdHJpbmcgY29uc3QmIF9sYWJlbCwgQ29sb3VyOjpDb2RlIF9jb2xvdXIgKQorICAgICAgICAgICAgOiAgIGxhYmVsKCBfbGFiZWwgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIF9jb2xvdXIgKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4gYWRkUm93KCBzdGQ6OnNpemVfdCBjb3VudCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCBjb3VudDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByb3cgPSBvc3Muc3RyKCk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcm93cy5iZWdpbigpOyBpdCAhPSByb3dzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA8IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKml0ID0gJyAnICsgKml0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA+IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gJyAnICsgcm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3dzLnB1c2hfYmFjayggcm93ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcm93czsKKworICAgICAgICB9OworCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICJObyB0ZXN0cyByYW5cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCAmJiB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8ICJBbGwgdGVzdHMgcGFzc2VkIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiApIDw8ICcpJworICAgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29sdW1uczsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggIiIsIENvbG91cjo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggInBhc3NlZCIsIENvbG91cjo6U3VjY2VzcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQiLCBDb2xvdXI6OlJlc3VsdEVycm9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCBhcyBleHBlY3RlZCIsIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApICk7CisKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJ0ZXN0IGNhc2VzIiwgY29sdW1ucywgMCApOworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggImFzc2VydGlvbnMiLCBjb2x1bW5zLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlSb3coIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3QmIGNvbHMsIHN0ZDo6c2l6ZV90IHJvdyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29scy5iZWdpbigpOyBpdCAhPSBjb2xzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gaXQtPnJvd3Nbcm93XTsKKyAgICAgICAgICAgICAgICBpZiggaXQtPmxhYmVsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsYWJlbCA8PCAiOiAiOworICAgICAgICAgICAgICAgICAgICBpZiggdmFsdWUgIT0gIjAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIi0gbm9uZSAtIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggdmFsdWUgIT0gIjAiICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggQ29sb3VyOjpMaWdodEdyZXkgKSA8PCAiIHwgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIGl0LT5jb2xvdXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICcgJyA8PCBpdC0+bGFiZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QgbWFrZVJhdGlvKCBzdGQ6OnNpemVfdCBudW1iZXIsIHN0ZDo6c2l6ZV90IHRvdGFsICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcmF0aW8gPSB0b3RhbCA+IDAgPyBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAqIG51bWJlci8gdG90YWwgOiAwOworICAgICAgICAgICAgcmV0dXJuICggcmF0aW8gPT0gMCAmJiBudW1iZXIgPiAwICkgPyAxIDogcmF0aW87CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90JiBmaW5kTWF4KCBzdGQ6OnNpemVfdCYgaSwgc3RkOjpzaXplX3QmIGosIHN0ZDo6c2l6ZV90JiBrICkgeworICAgICAgICAgICAgaWYoIGkgPiBqICYmIGkgPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGogPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gajsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2tSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPaywgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICktLTsKKworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6RXJyb3IgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZEJ1dE9rUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCBzdGQ6OnN0cmluZyggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSwgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeURpdmlkZXIoKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9oZWFkZXJQcmludGVkOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbnNvbGUiLCBDb25zb2xlUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb21wYWN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09NUEFDVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb21wYWN0UmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworCisgICAgICAgIENvbXBhY3RSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29tcGFjdFJlcG9ydGVyKCk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiBhIHNpbmdsZSBsaW5lLCBzdWl0YWJsZSBmb3IgSURFcyI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3JlIG5vdCBwcmludGluZyB0aG9zZQorICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgJiYgcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cykgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiBzdHJlYW0oIF9zdHJlYW0gKQorICAgICAgICAgICAgLCBzdGF0cyggX3N0YXRzICkKKyAgICAgICAgICAgICwgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkKKyAgICAgICAgICAgICwgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgLCBpdE1lc3NhZ2UoIF9zdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSApCisgICAgICAgICAgICAsIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKworICAgICAgICAgICAgICAgIGl0TWVzc2FnZSA9IG1lc3NhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBwYXNzZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIGZhaWxlZFN0cmluZygpICsgc3RkOjpzdHJpbmcoICIgLSBidXQgd2FzIG9rIiApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAidW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZmF0YWwgZXJyb3IgY29uZGl0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGVjdGVkIGV4Y2VwdGlvbiwgZ290IG5vbmUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAiaW5mbyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJ3YXJuaW5nIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBsaWNpdGx5IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsICIqKiBpbnRlcm5hbCBlcnJvciAqKiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gQ29sb3VyOjpMaWdodEdyZXkKKworICAgICAgICAgICAgc3RhdGljIENvbG91cjo6Q29kZSBkaW1Db2xvdXIoKSB7IHJldHVybiBDb2xvdXI6OkZpbGVOYW1lOyB9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiRkFJTEVEIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJQQVNTRUQiOyB9CisjZWxzZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJmYWlsZWQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gInBhc3NlZCI7IH0KKyNlbmRpZgorCisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAnOic7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkNvZGUgY29sb3VyLCBzdGQ6OnN0cmluZyBjb25zdCYgcGFzc09yRmFpbCApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcGFzc09yRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzonOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludElzc3VlKCBzdGQ6OnN0cmluZyBjb25zdCYgaXNzdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBpc3N1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludEV4cHJlc3Npb25XYXMoKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOyc7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGZvcjogIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgIT0gbWVzc2FnZXMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICArK2l0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpDb2RlIGNvbG91ciA9IGRpbUNvbG91cigpICkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlID09IG1lc3NhZ2VzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gdXNpbmcgbWVzc2FnZXMuZW5kKCkgZGlyZWN0bHkgeWllbGRzIGNvbXBpbGF0aW9uIGVycm9yOgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBOID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBzdGQ6OmRpc3RhbmNlKCBpdE1lc3NhZ2UsIGl0RW5kICkgKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgd2l0aCAiIDw8IHBsdXJhbGlzZSggTiwgIm1lc3NhZ2UiICkgPDwgJzonOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcig7IGl0TWVzc2FnZSAhPSBpdEVuZDsgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0TWVzc2FnZS0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKytpdE1lc3NhZ2UgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGFuZCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0TWVzc2FnZTsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ29sb3VyLCBtZXNzYWdlIHZhcmlhbnRzOgorICAgICAgICAvLyAtIHdoaXRlOiBObyB0ZXN0cyByYW4uCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcywgZmFpbGVkIFtib3RoL2FsbF0gTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIHdoaXRlOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMgKG5vIGFzc2VydGlvbnMpLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgTiB0ZXN0cyBjYXNlcywgZmFpbGVkIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSBncmVlbjogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0cyBjYXNlcyB3aXRoIE0gYXNzZXJ0aW9ucy4KKworICAgICAgICBzdGQ6OnN0cmluZyBib3RoT3JBbGwoIHN0ZDo6c2l6ZV90IGNvdW50ICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID09IDEgPyBzdGQ6OnN0cmluZygpIDogY291bnQgPT0gMiA/ICJib3RoICIgOiAiYWxsICIgOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggY29uc3QgVG90YWxzJiB0b3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0cyByYW4uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA9CisgICAgICAgICAgICAgICAgICAgIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhPckFsbCggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgOiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSwgInRlc3QgY2FzZSIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAobm8gYXNzZXJ0aW9ucykuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgICkgPDwKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbXBhY3QiLCBDb21wYWN0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICAvLyBUaGVzZSBhcmUgYWxsIGhlcmUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbm90IGhhdmluZyBhbnkgb3V0IG9mIGxpbmUKKyAgICAvLyB2aXJ0dWFsIG1ldGhvZHMKKyAgICBOb25Db3B5YWJsZTo6fk5vbkNvcHlhYmxlKCkge30KKyAgICBJU2hhcmVkOjp+SVNoYXJlZCgpIHt9CisgICAgSVN0cmVhbTo6fklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIEZpbGVTdHJlYW06On5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBDb3V0U3RyZWFtOjp+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRGVidWdPdXRTdHJlYW06On5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgU3RyZWFtQnVmQmFzZTo6flN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIElDb250ZXh0Ojp+SUNvbnRleHQoKSB7fQorICAgIElSZXN1bHRDYXB0dXJlOjp+SVJlc3VsdENhcHR1cmUoKSB7fQorICAgIElUZXN0Q2FzZTo6fklUZXN0Q2FzZSgpIHt9CisgICAgSVRlc3RDYXNlUmVnaXN0cnk6On5JVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgICAgSVJlZ2lzdHJ5SHViOjp+SVJlZ2lzdHJ5SHViKCkge30KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViOjp+SU11dGFibGVSZWdpc3RyeUh1YigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6On5JRXhjZXB0aW9uVHJhbnNsYXRvcigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6fklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7fQorICAgIElSZXBvcnRlcjo6fklSZXBvcnRlcigpIHt9CisgICAgSVJlcG9ydGVyRmFjdG9yeTo6fklSZXBvcnRlckZhY3RvcnkoKSB7fQorICAgIElSZXBvcnRlclJlZ2lzdHJ5Ojp+SVJlcG9ydGVyUmVnaXN0cnkoKSB7fQorICAgIElTdHJlYW1pbmdSZXBvcnRlcjo6fklTdHJlYW1pbmdSZXBvcnRlcigpIHt9CisgICAgQXNzZXJ0aW9uU3RhdHM6On5Bc3NlcnRpb25TdGF0cygpIHt9CisgICAgU2VjdGlvblN0YXRzOjp+U2VjdGlvblN0YXRzKCkge30KKyAgICBUZXN0Q2FzZVN0YXRzOjp+VGVzdENhc2VTdGF0cygpIHt9CisgICAgVGVzdEdyb3VwU3RhdHM6On5UZXN0R3JvdXBTdGF0cygpIHt9CisgICAgVGVzdFJ1blN0YXRzOjp+VGVzdFJ1blN0YXRzKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjpTZWN0aW9uTm9kZTo6flNlY3Rpb25Ob2RlKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpIHt9CisKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6On5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSB7fQorICAgIENvbnNvbGVSZXBvcnRlcjo6fkNvbnNvbGVSZXBvcnRlcigpIHt9CisgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29tcGFjdFJlcG9ydGVyKCkge30KKyAgICBJUnVubmVyOjp+SVJ1bm5lcigpIHt9CisgICAgSU11dGFibGVDb250ZXh0Ojp+SU11dGFibGVDb250ZXh0KCkge30KKyAgICBJQ29uZmlnOjp+SUNvbmZpZygpIHt9CisgICAgWG1sUmVwb3J0ZXI6On5YbWxSZXBvcnRlcigpIHt9CisgICAgSnVuaXRSZXBvcnRlcjo6fkp1bml0UmVwb3J0ZXIoKSB7fQorICAgIFRlc3RSZWdpc3RyeTo6flRlc3RSZWdpc3RyeSgpIHt9CisgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2U6On5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpIHt9CisgICAgSUdlbmVyYXRvckluZm86On5JR2VuZXJhdG9ySW5mbygpIHt9CisgICAgSUdlbmVyYXRvcnNGb3JUZXN0Ojp+SUdlbmVyYXRvcnNGb3JUZXN0KCkge30KKyAgICBXaWxkY2FyZFBhdHRlcm46On5XaWxkY2FyZFBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjp+UGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJuOjp+TmFtZVBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpUYWdQYXR0ZXJuOjp+VGFnUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybjo6fkV4Y2x1ZGVkUGF0dGVybigpIHt9CisgICAgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJVbnR5cGVkQmFzZTo6fk1hdGNoZXJVbnR5cGVkQmFzZSgpIHt9CisKKyAgICB2b2lkIENvbmZpZzo6ZHVtbXkoKSB7fQorCisgICAgbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworICAgICAgICBJVHJhY2tlcjo6fklUcmFja2VyKCkge30KKyAgICAgICAgVHJhY2tlckJhc2U6On5UcmFja2VyQmFzZSgpIHt9CisgICAgICAgIFNlY3Rpb25UcmFja2VyOjp+U2VjdGlvblRyYWNrZXIoKSB7fQorICAgICAgICBJbmRleFRyYWNrZXI6On5JbmRleFRyYWNrZXIoKSB7fQorICAgIH0KK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX01BSU4KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9kZWZhdWx0X21haW4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUZBVUxUX01BSU5fSFBQX0lOQ0xVREVECisKKyNpZm5kZWYgX19PQkpDX18KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCisvLyBTdGFuZGFyZCBDL0MrKyBXaW4zMiBVbmljb2RlIHdtYWluIGVudHJ5IHBvaW50CitleHRlcm4gIkMiIGludCB3bWFpbiAoaW50IGFyZ2MsIHdjaGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgeworI2Vsc2UKKy8vIFN0YW5kYXJkIEMvQysrIG1haW4gZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgeworI2VuZGlmCisKKwlpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIGFyZ3YgKTsKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZWxzZSAvLyBfX09CSkNfXworCisvLyBPYmplY3RpdmUtQyBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKSB7CisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisjZW5kaWYKKworICAgIENhdGNoOjpyZWdpc3RlclRlc3RNZXRob2RzKCk7CisgICAgaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIFtwb29sIGRyYWluXTsKKyNlbmRpZgorCisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2VuZGlmIC8vIF9fT0JKQ19fCisKKyNlbmRpZgorCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjZW5kaWYKKworLy8vLy8vCisKKy8vIElmIHRoaXMgY29uZmlnIGlkZW50aWZpZXIgaXMgZGVmaW5lZCB0aGVuIGFsbCBDQVRDSCBtYWNyb3MgYXJlIHByZWZpeGVkIHdpdGggQ0FUQ0hfCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0FUQ0hfQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0FUQ0hfQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX0NIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX0NIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9XQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIENBVENIX1NDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIENBVENIX0dFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggLi4uICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9HSVZFTiggZGVzYyApICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9XSEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfV0hFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9USEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfVEhFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCisvLyBJZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8gcHJlZml4IGlzIG5vdCByZXF1aXJlZAorI2Vsc2UKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorCisjZWxzZQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciAgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbmRpZgorCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJSRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBJTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIFdBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIldBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBTQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBDQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBURVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFNFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBGQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIEFOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBHRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgU0NFTkFSSU8oIC4uLiApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFNDRU5BUklPKCBuYW1lLCB0YWdzICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBXSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9XSEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIkFuZCB3aGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgVEhFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfVEhFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgIEFuZDogIikgKyBkZXNjLCAiIiApCisKK3VzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKQEAgLTAsMCArMSwzMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZW51bSIsICJbZnVuY3Rpb25hbF0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHByb2dyYW0pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfZW51bSogdGVzdF9lbnVtID0gcGFpci5zZWNvbmQ7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gdGVzdF9lbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2VudW0ob3V0LCB0ZXN0X2VudW0pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSB0ZXN0X2VudW07CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgdm9pZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzdHJpbmcgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGJvb2wgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzYnl0ZSAoaTgpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNob3J0IChpMTYpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBpbnRlZ2VyIChpMzIpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBsb25nIChpNjQpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBkb3VibGUgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMxNzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwyMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworY29uc3Qgc3RyaW5nIFRlc3REYXRhR2VuZXJhdG9yOjpERUZBVUxUX0ZJTEVfSEVBREVSID0gIi8qKiIgIlxuIgorICAgICAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgpIiAiXG4iCisgICAgICAgICAgICAiICoiICJcbiIKKyAgICAgICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiAiXG4iCisgICAgICAgICAgICAiICogIEBnZW5lcmF0ZWQiICJcbiIKKyAgICAgICAgICAgICIgKi8iOworCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICJwdWJsaWMgZW51bSBUZXN0TmFtZVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICBOb25lID0gMCxcbiIKKyAgICAgICAgIiAgRmlyc3QgPSAxLFxuIgorICAgICAgICAiICBTZWNvbmQgPSAyLFxuIgorICAgICAgICAifVxuIjsKKworICAgIHRfZW51bSogZW51bV8gPSBuZXcgdF9lbnVtKHByb2dyYW0pOworICAgIGVudW1fLT5zZXRfbmFtZSgiVGVzdE5hbWUiKTsKKyAgICBlbnVtXy0+c2V0X2RvYygiVGVzdERvYyIpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiTm9uZSIsIDApKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIkZpcnN0IiwgMSkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiU2Vjb25kIiwgMikpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+KGV4cGVjdGVkX3Jlc3VsdCwgZW51bV8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJWb2lkVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAidm9pZCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArIAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc3RyaW5nIEBzdHJpbmcgPSBcIlN0cmluZ1ZhbHVlXCI7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlN0cmluZ1ZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInN0cmluZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgYm9vbCBAYm9vbCA9IHRydWU7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImJvb2wiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzYnl0ZSBAc2J5dGUgPSAxMjc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiSTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxMjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzYnl0ZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzaG9ydCBAc2hvcnQgPSAzMjc2NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMzI3NjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzaG9ydCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBpbnQgQGludCA9IDIxNDc0ODM2NDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDIxNDc0ODM2NDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJpbnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgbG9uZyBAbG9uZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDkyMjMzNzIwMzY4NTQ3NzU4MDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJsb25nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGRvdWJsZSBAZG91YmxlID0gOS4yMjMzN2UrMTg7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9kb3VibGUoOTIyMzM3MjAzNjg1NDc3NTgwNy4xKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiZG91YmxlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKworY2xhc3MgVGVzdERhdGFHZW5lcmF0b3IKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gZ2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2JlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKQEAgLTAsMCArMSwyMDkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRob3V0IG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgInVuaW9uIiwgInVuaW9uIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGggb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY29udGFpbnMgbGF0ZXN0IEMjIGtleXdvcmRzIHRvIG5vcm1hbGl6ZSB3aXRoIEAiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisgICAgdmVjdG9yPHN0cmluZz4gY3VycmVudF9rZXl3b3JkcyA9IHsKKyAgICAgICAgeyAiYWJzdHJhY3QiIH0sCisgICAgICAgIHsgImFzIiB9LAorICAgICAgICB7ICJiYXNlIiB9LAorICAgICAgICB7ICJib29sIiB9LAorICAgICAgICB7ICJicmVhayIgfSwKKyAgICAgICAgeyAiYnl0ZSIgfSwKKyAgICAgICAgeyAiY2FzZSIgfSwKKyAgICAgICAgeyAiY2F0Y2giIH0sCisgICAgICAgIHsgImNoYXIiIH0sCisgICAgICAgIHsgImNoZWNrZWQiIH0sCisgICAgICAgIHsgImNsYXNzIiB9LAorICAgICAgICB7ICJjb25zdCIgfSwKKyAgICAgICAgeyAiY29udGludWUiIH0sCisgICAgICAgIHsgImRlY2ltYWwiIH0sCisgICAgICAgIHsgImRlZmF1bHQiIH0sCisgICAgICAgIHsgImRlbGVnYXRlIiB9LAorICAgICAgICB7ICJkbyIgfSwKKyAgICAgICAgeyAiZG91YmxlIiB9LAorICAgICAgICB7ICJlbHNlIiB9LAorICAgICAgICB7ICJlbnVtIiB9LAorICAgICAgICB7ICJldmVudCIgfSwKKyAgICAgICAgeyAiZXhwbGljaXQiIH0sCisgICAgICAgIHsgImV4dGVybiIgfSwKKyAgICAgICAgeyAiZmFsc2UiIH0sCisgICAgICAgIHsgImZpbmFsbHkiIH0sCisgICAgICAgIHsgImZpeGVkIiB9LAorICAgICAgICB7ICJmbG9hdCIgfSwKKyAgICAgICAgeyAiZm9yIiB9LAorICAgICAgICB7ICJmb3JlYWNoIiB9LAorICAgICAgICB7ICJnb3RvIiB9LAorICAgICAgICB7ICJpZiIgfSwKKyAgICAgICAgeyAiaW1wbGljaXQiIH0sCisgICAgICAgIHsgImluIiB9LAorICAgICAgICB7ICJpbnQiIH0sCisgICAgICAgIHsgImludGVyZmFjZSIgfSwKKyAgICAgICAgeyAiaW50ZXJuYWwiIH0sCisgICAgICAgIHsgImlzIiB9LAorICAgICAgICB7ICJsb2NrIiB9LAorICAgICAgICB7ICJsb25nIiB9LAorICAgICAgICB7ICJuYW1lc3BhY2UiIH0sCisgICAgICAgIHsgIm5ldyIgfSwKKyAgICAgICAgeyAibnVsbCIgfSwKKyAgICAgICAgeyAib2JqZWN0IiB9LAorICAgICAgICB7ICJvcGVyYXRvciIgfSwKKyAgICAgICAgeyAib3V0IiB9LAorICAgICAgICB7ICJvdmVycmlkZSIgfSwKKyAgICAgICAgeyAicGFyYW1zIiB9LAorICAgICAgICB7ICJwcml2YXRlIiB9LAorICAgICAgICB7ICJwcm90ZWN0ZWQiIH0sCisgICAgICAgIHsgInB1YmxpYyIgfSwKKyAgICAgICAgeyAicmVhZG9ubHkiIH0sCisgICAgICAgIHsgInJlZiIgfSwKKyAgICAgICAgeyAicmV0dXJuIiB9LAorICAgICAgICB7ICJzYnl0ZSIgfSwKKyAgICAgICAgeyAic2VhbGVkIiB9LAorICAgICAgICB7ICJzaG9ydCIgfSwKKyAgICAgICAgeyAic2l6ZW9mIiB9LAorICAgICAgICB7ICJzdGFja2FsbG9jIiB9LAorICAgICAgICB7ICJzdGF0aWMiIH0sCisgICAgICAgIHsgInN0cmluZyIgfSwKKyAgICAgICAgeyAic3RydWN0IiB9LAorICAgICAgICB7ICJzd2l0Y2giIH0sCisgICAgICAgIHsgInRoaXMiIH0sCisgICAgICAgIHsgInRocm93IiB9LAorICAgICAgICB7ICJ0cnVlIiB9LAorICAgICAgICB7ICJ0cnkiIH0sCisgICAgICAgIHsgInR5cGVvZiIgfSwKKyAgICAgICAgeyAidWludCIgfSwKKyAgICAgICAgeyAidWxvbmciIH0sCisgICAgICAgIHsgInVuY2hlY2tlZCIgfSwKKyAgICAgICAgeyAidW5zYWZlIiB9LAorICAgICAgICB7ICJ1c2hvcnQiIH0sCisgICAgICAgIHsgInVzaW5nIiB9LAorICAgICAgICB7ICJ2b2lkIiB9LAorICAgICAgICB7ICJ2b2xhdGlsZSIgfSwKKyAgICAgICAgeyAid2hpbGUiIH0sCisgICAgICAgIC8vIENvbnRleHR1YWwgS2V5d29yZHMKKyAgICAgICAgeyAiYWRkIiB9LAorICAgICAgICB7ICJhbGlhcyIgfSwKKyAgICAgICAgeyAiYXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJhc3luYyIgfSwKKyAgICAgICAgeyAiYXdhaXQiIH0sCisgICAgICAgIHsgImRlc2NlbmRpbmciIH0sCisgICAgICAgIHsgImR5bmFtaWMiIH0sCisgICAgICAgIHsgImZyb20iIH0sCisgICAgICAgIHsgImdldCIgfSwKKyAgICAgICAgeyAiZ2xvYmFsIiB9LAorICAgICAgICB7ICJncm91cCIgfSwKKyAgICAgICAgeyAiaW50byIgfSwKKyAgICAgICAgeyAiam9pbiIgfSwKKyAgICAgICAgeyAibGV0IiB9LAorICAgICAgICB7ICJvcmRlcmJ5IiB9LAorICAgICAgICB7ICJwYXJ0aWFsIiB9LAorICAgICAgICB7ICJyZW1vdmUiIH0sCisgICAgICAgIHsgInNlbGVjdCIgfSwKKyAgICAgICAgeyAic2V0IiB9LAorICAgICAgICB7ICJ2YWx1ZSIgfSwKKyAgICAgICAgeyAidmFyIiB9LAorICAgICAgICB7ICJ3aGVuIiB9LAorICAgICAgICB7ICJ3aGVyZSIgfSwKKyAgICAgICAgeyAieWllbGQiIH0KKyAgICB9OworCisgICAgc3RyaW5nIG1pc3NlZF9rZXl3b3JkcyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworICAgIG1hcDxzdHJpbmcsIGludD4gZ2VuZXJhdG9yc19rZXl3b3JkcyA9IGdlbi0+Z2V0X2tleXdvcmRzX2xpc3QoKTsKKworICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gY3VycmVudF9rZXl3b3Jkcy5iZWdpbigpOyBpdCAhPSBjdXJyZW50X2tleXdvcmRzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvcnNfa2V5d29yZHMuZmluZCgqaXQpID09IGdlbmVyYXRvcnNfa2V5d29yZHMuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pc3NlZF9rZXl3b3JkcyA9IG1pc3NlZF9rZXl3b3JkcyArICppdCArICIsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJFUVVJUkUobWlzc2VkX2tleXdvcmRzID09ICIiKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpAQCAtMCwwICsxLDc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCB0aHJvdyBlcnJvciB3aXRoIHVua25vd24gb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgImtleXMiLCAia2V5cyIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOwkKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNyZWF0ZSB2YWxpZCBpbnN0YW5jZSB3aXRoIHZhbGlkIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0sIHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIn0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CisgICAgUkVRVUlSRShnZW4gIT0gbnVsbHB0cik7CisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5pc19udWxsYWJsZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19oYXNoY29kZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19zZXJpYWxpemVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfdW5pb25fZW5hYmxlZCgpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgcGFzcyBpbml0IHN1Y2Nlc2Z1bGx5IiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+aW5pdF9nZW5lcmF0b3IoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQwOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKQEAgLTAsMCArMSwxOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2RlZmluZSBDQVRDSF9DT05GSUdfTUFJTgorI2luY2x1ZGUgImNhdGNoL2NhdGNoLmhwcCIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcwZWM5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKZGlmZiAtLWdpdCBhL2NvbXBvc2VyLmpzb24gYi9jb21wb3Nlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2E2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb3Nlci5qc29uCkBAIC0wLDAgKzEsMzkgQEAKK3sKKyAgICAibmFtZSI6ICJhcGFjaGUvdGhyaWZ0IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKKyAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidHlwZSI6ICJsaWJyYXJ5IiwKKyAgICAia2V5d29yZHMiOiBbIlJQQyJdLAorICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAgICJyZWFkbWUiOiAiUkVBRE1FLm1kIiwKKyAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgICAgICAgfQorICAgIF0sCisgICAgInN1cHBvcnQiOiB7CisgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgorICAgIH0sCisgICAgInJlcXVpcmUiOiB7CisgICAgICAgICJwaHAiOiAiXjUuNSB8fCBeNy4wIgorICAgIH0sCisgICAgInJlcXVpcmUtZGV2IjogeworICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIn40LjguMzYiLAorICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICIzLioiCisgICAgfSwKKyAgICAiYXV0b2xvYWQiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGhyaWZ0XFwiOiAibGliL3BocC9saWIvIn0KKyAgICB9LAorICAgICJhdXRvbG9hZC1kZXYiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGVzdFxcVGhyaWZ0XFwiOiAibGliL3BocC90ZXN0LyJ9CisgICAgfSwKKyAgICAibWluaW11bS1zdGFiaWxpdHkiOiAic3RhYmxlIiwKKyAgICAiZXh0cmEiOiB7CisgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CisgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjAueC1kZXYiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2ZmY0M2NhLi4yMTc0NjI5Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTE3LDEzICsxNywxNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotQUNfUFJFUkVRKDIuNTkpCitBQ19QUkVSRVEoMi42NSkKK0FDX0NPTkZJR19NQUNST19ESVIoWy4vYWNsb2NhbF0pCiAKLUFDX0lOSVQoW3RocmlmdF0sIFswLjQuMF0pCitBQ19JTklUKFt0aHJpZnRdLCBbMS4wLjBdKQogCiBBQ19DT05GSUdfQVVYX0RJUihbLl0pCiAKLUFNX0lOSVRfQVVUT01BS0UKK0FNX0lOSVRfQVVUT01BS0UoWzEuMTMgc3ViZGlyLW9iamVjdHMgdGFyLXVzdGFyXSkKK1BLR19QUk9HX1BLR19DT05GSUcKIAogQUNfQVJHX1ZBUihbUFlfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIFB5dGhvbiBiZWNhdXNlCkBAIC0zMiwxMCArMzQsMTAgQEAKIEFTX0lGKFt0ZXN0ICJ4JFBZX1BSRUZJWCIgPSB4XSwgW1BZX1BSRUZJWD0iL3VzciJdKQogCiBBQ19BUkdfVkFSKFtKQVZBX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgdGhlIEphdmEgbGliIGphci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgSmF2YSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhIGhhcyBkaWZmZXJlbnQgY29uZXZudGlvbnMuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICIvdXNyL2xvY2FsL2xpYiJdKQotQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiID0geF0sIFtKQVZBX1BSRUZJWD0iL3Vzci9sb2NhbC9saWIiXSkKK0FTX0lGKFt0ZXN0ICJ4JEpBVkFfUFJFRklYIiAhPSB4XSwgW0pBVkFfUFJFRklYPSIkSkFWQV9QUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW3Rlc3QgIngkUFJFRklYIiAhPSB4XSwgW0pBVkFfUFJFRklYPSIkUFJFRklYL3Vzci9sb2NhbC9saWIiXSwKKyAgICAgIFtKQVZBX1BSRUZJWD0iL3Vzci9sb2NhbC9saWIiXSkKIAogQUNfQVJHX1ZBUihbUlVCWV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFJ1YnkgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUnVieSBiZWNhdXNlCkBAIC00OCw5NCArNTAsNTk3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICIvdXNyL2xpYi9waHAiXSkKIEFTX0lGKFt0ZXN0ICJ4JFBIUF9QUkVGSVgiID0geF0sIFtQSFBfUFJFRklYPSIvdXNyL2xpYi9waHAiXSkKIAorQUNfQVJHX1ZBUihbUEhQX0NPTkZJR19QUkVGSVhdLAorICAgICAgICAgICBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFBIUCBleHRlbnNpb24gbW9kdWxlIC5pbmkgZmlsZS4KKyAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUEhQIGJlY2F1c2UgUEhQIGhhcworICAgICAgICAgICAgIGRpZmZlcmVudCBjb252ZW50aW9ucy4pCisgICAgICAgICAgIERlZmF1bHQgPSAiL2V0Yy9waHAuZCJdKQorQVNfSUYoW3Rlc3QgIngkUEhQX0NPTkZJR19QUkVGSVgiID0geF0sIFtQSFBfQ09ORklHX1BSRUZJWD0iL2V0Yy9waHAuZCJdKQorCitBQ19BUkdfVkFSKFtJTlNUQUxMRElSU10sIFtXaGVuIGluc3RhbGxpbmcgUGVybCBtb2R1bGVzLCBzcGVjaWZpZXMgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzZXRzIG9mIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY2hvb3NlOiBwZXJsLCBzaXRlIG9yIHZlbmRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAidmVuZG9yIl0pCitBU19JRihbdGVzdCAieCRJTlNUQUxMRElSUyIgPSB4XSwgW0lOU1RBTExESVJTPSJ2ZW5kb3IiXSkKKwogQUNfQVJHX1ZBUihbUEVSTF9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFBlcmwgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUGVybCBiZWNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJsIGhhcyBkaWZmZXJlbnQgY29udmVudGlvbnMuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCwgd2hlbiBJTlNUQUxMRElSUyBzZXQgdG8gc2l0ZSBvciB2ZW5kb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCiBBU19JRihbdGVzdCAieCRQRVJMX1BSRUZJWCIgPSB4XSwgW1BFUkxfUFJFRklYPSIvdXNyL2xvY2FsIl0pCiAKK0FDX0FSR19WQVIoW0NBQkFMX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICAgIFtFeHRyYSBmbGFncyB0byBwYXNzIHRvIGNhYmFsOiAiY2FiYWwgU2V0dXAubGhzIGNvbmZpZ3VyZSAkQ0FCQUxfQ09ORklHVVJFX0ZMQUdTIi4KKyAgICAgICAgICAgIChUeXBpY2FsbHkgdXNlZCB0byBzZXQgLS11c2VyIG9yIGZvcmNlIC0tZ2xvYmFsLildKQorCitBQ19TVUJTVChDQUJBTF9DT05GSUdVUkVfRkxBR1MpCisKK0FDX0FSR19WQVIoW0RfSU1QT1JUX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgRCBtb2R1bGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lOQ0xVREVESVIvZDJdXSkKK0FTX0lGKFt0ZXN0ICJ4JERfSU1QT1JUX1BSRUZJWCIgPSB4XSwgW0RfSU1QT1JUX1BSRUZJWD0iJHtpbmNsdWRlZGlyfS9kMiJdKQorCitBQ19BUkdfVkFSKFtETURfTElCRVZFTlRfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIGxpYmV2ZW50IChhdXRvLWRldGVjdGVkIGlmIG5vdCBzZXQpLl0pCitBQ19BUkdfVkFSKFtETURfT1BFTlNTTF9GTEFHU10sIFtETUQgZmxhZ3MgZm9yIGxpbmtpbmcgT3BlblNTTCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQorCitBQ19BUkdfVkFSKFtUSFJJRlRdLCBbUGF0aCB0byB0aGUgdGhyaWZ0IHRvb2wgKG5lZWRlZCBmb3IgY3Jvc3MtY29tcGlsYXRpb24pLl0pCitBU19JRihbdGVzdCAieCRUSFJJRlQiID0geF0sIFtUSFJJRlQ9YHB3ZGAvY29tcGlsZXIvY3BwL3RocmlmdF0pCisKIEFDX1BST0dfQ0MKIEFDX1BST0dfQ1BQCiBBQ19QUk9HX0NYWAogQUNfUFJPR19JTlNUQUxMCiBBQ19QUk9HX0xJQlRPT0wKIEFDX1BST0dfTUFLRV9TRVQKK0FDX1BST0dfQklTT04oMi41KQogQUNfUFJPR19ZQUNDCiBBQ19QUk9HX0xFWAogQU1fUFJPR19MRVgKIEFDX1BST0dfTE5fUwogQUNfUFJPR19NS0RJUl9QCitBQ19QUk9HX0FXSworQUNfUFJPR19SQU5MSUIKIAogQUNfTEFORyhbQysrXSkKLUFYX0JPT1NUX0JBU0UoWzEuMzMuMV0pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSwgW21hbmRhdG9yeV0pCiAKLUFYX0xJQl9FVkVOVChbMS4wXSkKLUFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9MSUJFVkVOVF0sIFt0ZXN0ICIkc3VjY2VzcyIgPSAieWVzIl0pCitBTV9FWFRSQV9SRUNVUlNJVkVfVEFSR0VUUyhbc3R5bGVdKQorQUNfU1VCU1QoQ1BQU1RZTEVfQ01ELCAnZmluZCAuIC10eXBlIGYgXCggLWluYW1lICIqLmgiIC1vciAtaW5hbWUgIiouY3BwIiAtb3IgLWluYW1lICIqLmNjIiAtb3IgLWluYW1lICIqLnRjYyIgXCkgLXByaW50ZiAiUmVmb3JtYXR0aW5nOiAlaC8lZlxuIiAtZXhlYyBjbGFuZy1mb3JtYXQgLWkge30gXDsnKQorIyAnCisjIFRoZSBhYm92ZSBjb21tZW50IGlzIHRvIGZpeCBlZGl0b3Igc3ludGF4IGhpZ2hsaWdodGluZwogCi1BWF9MSUJfWkxJQihbMS4yLjNdKQotQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1pMSUJdLCBbdGVzdCAiJHN1Y2Nlc3MiID0gInllcyJdKQorQUNfQVJHX0VOQUJMRShbbGlic10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJzXSwgW2J1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfbGlicz15ZXMKKykKK2hhdmVfbGlicz15ZXMKK2lmIHRlc3QgIiRlbmFibGVfbGlicyIgPSAibm8iOyB0aGVuCisgIGhhdmVfbGlicz0ibm8iCisgIHdpdGhfY3BwPSJubyIKKyAgd2l0aF9jX2dsaWI9Im5vIgorICB3aXRoX2NsPSJubyIKKyAgd2l0aF9qYXZhPSJubyIKKyAgd2l0aF9jc2hhcnA9Im5vIgorICB3aXRoX3B5dGhvbj0ibm8iCisgIHdpdGhfcHkzPSJubyIKKyAgd2l0aF9ydWJ5PSJubyIKKyAgd2l0aF9oYXNrZWxsPSJubyIKKyAgd2l0aF9oYXhlPSJubyIKKyAgd2l0aF9kb3RuZXRjb3JlPSJubyIKKyAgd2l0aF9wZXJsPSJubyIKKyAgd2l0aF9waHA9Im5vIgorICB3aXRoX3BocF9leHRlbnNpb249Im5vIgorICB3aXRoX2RhcnQ9Im5vIgorICB3aXRoX2VybGFuZz0ibm8iCisgIHdpdGhfZ289Im5vIgorICB3aXRoX2Q9Im5vIgorICB3aXRoX25vZGVqcz0ibm8iCisgIHdpdGhfbm9kZXRzPSJubyIKKyAgd2l0aF9sdWE9Im5vIgorICB3aXRoX3JzPSJubyIKKyAgd2l0aF9zd2lmdD0ibm8iCitmaQorCitBWF9USFJJRlRfTElCKGNwcCwgW0MrK10sIHllcykKK2hhdmVfY3BwPW5vCitpZiB0ZXN0ICIkd2l0aF9jcHAiID0gInllcyI7ICB0aGVuCisgIEFYX0JPT1NUX0JBU0UoWzEuNTMuMF0pCisgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBBQ19TVUJTVChbQk9PU1RfTElCX0RJUl0sIFskKGVjaG8gIiRCT09TVF9MREZMQUdTIiB8IHNlZCAtZSAncy9eXC1MLy8nKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX0NIUk9OT19MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X2Nocm9uby5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9GSUxFU1lTVEVNX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfZmlsZXN5c3RlbS5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9TWVNURU1fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9zeXN0ZW0uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEVTVF9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEhSRUFEX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfdGhyZWFkLmEiKV0pCisgICAgaGF2ZV9jcHA9InllcyIKKyAgZmkKKworICBBWF9MSUJfRVZFTlQoWzIuMF0pCisgIGhhdmVfbGliZXZlbnQ9JHN1Y2Nlc3MKKworICBBWF9MSUJfWkxJQihbMS4yLjNdKQorICBoYXZlX3psaWI9JHN1Y2Nlc3MKKworICBBWF9USFJJRlRfTElCKHF0NCwgW1F0XSwgeWVzKQorICBoYXZlX3F0PW5vCisgIGlmIHRlc3QgIiR3aXRoX3F0NCIgPSAieWVzIjsgIHRoZW4KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbUVRdLCBbUXRDb3JlID49IDQuMywgUXROZXR3b3JrID49IDQuM10sIGhhdmVfcXQ9eWVzLCBoYXZlX3F0PW5vKQorICBmaQorICBpZiB0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1FUX01PQ10sIFttb2MtcXQ0IG1vY10sICJmYWlsIikKKyAgICBpZiB0ZXN0ICIkUVRfTU9DIiA9ICJmYWlsIjsgdGhlbgorICAgICAgaGF2ZV9xdD1ubworICAgIGZpCisgIGZpCisKKyAgQVhfVEhSSUZUX0xJQihxdDUsIFtRdDVdLCB5ZXMpCisgIGhhdmVfcXQ1PW5vCisgIHF0X3JlZHVjZV9yZWxvYz0iIgorICBpZiB0ZXN0ICIkd2l0aF9xdDUiID0gInllcyI7ICB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1FUNV0sIFtRdDVDb3JlID49IDUuMCwgUXQ1TmV0d29yayA+PSA1LjBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT15ZXM7cXRfcmVkdWNlX3JlbG9jPWAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXF0X2NvbmZpZyBRdDVDb3JlIHwgZ3JlcCAicmVkdWNlX3JlbG9jYXRpb25zImBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT1ub10pCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3F0NSIgPSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1FUNV9NT0NdLCBbbW9jLXF0NSBtb2NdLCAiZmFpbCIpCisgICAgaWYgdGVzdCAiJFFUNV9NT0MiID0gImZhaWwiOyB0aGVuCisgICAgICBoYXZlX3F0NT1ubworICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfQ1BQXSwgW3Rlc3QgIiRoYXZlX2NwcCIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfTElCRVZFTlRdLCBbdGVzdCAiJGhhdmVfbGliZXZlbnQiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1pMSUJdLCBbdGVzdCAiJGhhdmVfemxpYiIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfUVRdLCBbdGVzdCAiJGhhdmVfcXQiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1FUNV0sIFt0ZXN0ICIkaGF2ZV9xdDUiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW1FUNV9SRURVQ0VfUkVMT0NBVElPTlNdLCBbdGVzdCAieCRxdF9yZWR1Y2VfcmVsb2MiICE9ICJ4Il0pCisKK0FYX1RIUklGVF9MSUIoY19nbGliLCBbQyAoR0xpYildLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9jX2dsaWIiID0gInllcyI7IHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoW0dMSUJdLCBbZ2xpYi0yLjAgPj0gMi4wXSwgaGF2ZV9nbGliMj15ZXMsIGhhdmVfZ2xpYjI9bm8pCisgIFBLR19DSEVDS19NT0RVTEVTKFtHT0JKRUNUXSwgW2dvYmplY3QtMi4wID49IDIuMF0sIGhhdmVfZ29iamVjdDI9eWVzLCBoYXZlX2dvYmplY3QyPW5vKQorICBpZiB0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyIgOyB0aGVuCisgICAgaGF2ZV9jX2dsaWI9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0NfR0xJQiwgW3Rlc3QgIiRoYXZlX2dsaWIyIiA9ICJ5ZXMiIC1hICIkaGF2ZV9nb2JqZWN0MiIgPSAieWVzIl0pCisKK2VjaG8gIk9wZW5TU0wgY2hlY2siCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgLW8gIiRoYXZlX2NfZ2xpYiIgPSAieWVzIjsgIHRoZW4KKyAgZWNobyAiSGF2ZSBjcHAgb3IgYyBzbyB3ZSBjaGVjayBmb3IgT3BlblNTTCIKKyAgQVhfQ0hFQ0tfT1BFTlNTTCgpCitmaQogCiBBWF9USFJJRlRfTElCKGNzaGFycCwgW0MjXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfY3NoYXJwIiA9ICJ5ZXMiOyAgdGhlbgorICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDIuMTEuMCwgbW9ub18yXzExPXllcywgbW9ub18yXzExPW5vKQorICBpZiB0ZXN0ICIkbW9ub18yXzExIiA9PSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPRyhbTUNTXSwgW21jc10pCisgICAgaWYgdGVzdCAieCRNQ1MiICE9ICJ4IjsgdGhlbgorICAgICAgbW9ub19tY3M9InllcyIKKyAgICBmaQorICBmaQogICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDIuMC4wLCBuZXRfM181PXllcywgbmV0XzNfNT1ubykKICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAxLjIuNCwgaGF2ZV9tb25vPXllcywgaGF2ZV9tb25vPW5vKQorICBpZiB0ZXN0ICIkaGF2ZV9tb25vIiA9ICJ5ZXMiIDsgdGhlbgorICAgIGhhdmVfY3NoYXJwPSJ5ZXMiCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoV0lUSF9NT05PLCBbdGVzdCAiJGhhdmVfbW9ubyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChXSVRIX01PTk8sIFt0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoTkVUXzJfMCwgW3Rlc3QgIiRuZXRfM181IiA9ICJubyJdKQorQU1fQ09ORElUSU9OQUwoTU9OT19NQ1MsIFt0ZXN0ICIkbW9ub19tY3MiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKGphdmEsIFtKYXZhXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfamF2YSIgPSAieWVzIjsgIHRoZW4KICAgQVhfSkFWQUNfQU5EX0pBVkEKICAgQUNfUEFUSF9QUk9HKFtBTlRdLCBbYW50XSkKLSAgQVhfQ0hFQ0tfSkFWQV9DTEFTUyhvcmcuc2xmNGouTG9nZ2VyKQotICBoYXZlX3NsZjRqPSIkc3VjY2VzcyIKLSAgQVhfQ0hFQ0tfSkFWQV9DTEFTUyhvcmcuc2xmNGouaW1wbC5TaW1wbGVMb2dnZXIpCi0gIGhhdmVfc2xmNGpfc2ltcGxlPSIkc3VjY2VzcyIKLSAgQVhfQ0hFQ0tfSkFWQV9DTEFTUyhvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLkhhc2hDb2RlQnVpbGRlcikKLSAgaGF2ZV9oYXNoY29kZT0iJHN1Y2Nlc3MiCi0gIGlmIHRlc3QgIngkaGF2ZV9zbGY0al9zaW1wbGUiID0gInh5ZXMiICYmIHRlc3QgIngkaGF2ZV9zbGY0aiIgPSAieHllcyIgJiYgdGVzdCAieCRoYXZlX2hhc2hjb2RlIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICBBTlRfRkxBR1M9IiRBTlRfRkxBR1MgLURub2l2eT0iCi0gIGZpCisgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKICAgQUNfU1VCU1QoQ0xBU1NQQVRIKQogICBBQ19TVUJTVChBTlRfRkxBR1MpCisgIEFDX1NVQlNUKEdSQURMRV9PUFRTKQorICBpZiB0ZXN0ICJ4JEpBVkEiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KKyAgICBoYXZlX2phdmE9InllcyIKKyAgZmkKIGZpCi1BTV9DT05ESVRJT05BTChbV0lUSF9KQVZBXSwKLSAgICAgICAgICAgICAgIFt0ZXN0IC1uICIkQU5UIiAtYSAtbiAiJEpBVkEiIC1hIC1uICIkSkFWQUMiXSkKK0FNX0NPTkRJVElPTkFMKFtXSVRIX0pBVkFdLCBbdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIoZXJsYW5nLCBbRXJsYW5nXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfZXJsYW5nIiA9ICJ5ZXMiOyAgdGhlbgogICBBQ19FUkxBTkdfUEFUSF9FUkwKICAgQUNfRVJMQU5HX1BBVEhfRVJMQwotICBBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKEFDX1BBQ0tBR0VfTkFNRSwgQUNfUEFDS0FHRV9WRVJTSU9OKQotZmkKLUFNX0NPTkRJVElPTkFMKFdJVEhfRVJMQU5HLCBbdGVzdCAtbiAiJEVSTCIgLWEgLW4gIiRFUkxDIl0pCisgIEFDX1BBVEhfUFJPRyhbUkVCQVJdLCBbcmViYXJdKQorICBpZiB0ZXN0IC1uICIkRVJMQyIgOyB0aGVuCisgICAgQUNfRVJMQU5HX1NVQlNUX0xJQl9ESVIKKyAgICAjIEluc3RhbGwgaW50byB0aGUgZGV0ZWN0ZWQgRXJsYW5nIGRpcmVjdG9yeSBpbnN0ZWFkIG9mICRsaWJkaXIvZXJsYW5nL2xpYgorICAgIEVSTEFOR19JTlNUQUxMX0xJQl9ESVI9IiRFUkxBTkdfTElCX0RJUiIKKyAgICBBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKEFDX1BBQ0tBR0VfTkFNRSwgQUNfUEFDS0FHRV9WRVJTSU9OKQorICBmaQorICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiICYmIHRlc3QgIngkUkVCQVIiICE9ICJ4IiA7IHRoZW4KKyAgICBoYXZlX2VybGFuZz0ieWVzIgogCi1BWF9USFJJRlRfTElCKHB5LCBbUHl0aG9uXSwgeWVzKQotaWYgdGVzdCAiJHdpdGhfcHkiID0gInllcyI7ICB0aGVuCi0gIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCisgICAgIyBvdHBfcmVsZWFzZSBpcyBzaW1wbHkgYSBudW1iZXIgKGxpa2UgIjE3IikgZm9yIE9UUDE3KyB3aGlsZSAiUjE2Li4uIiBmb3IgT1RQMTYgb3IgbGVzcy4KKyAgICAjIE9UUCB2ZXJzaW9uIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIHJ1bm5pbmcgdGVzdHMuCisgICAgaWYgJEVSTCAtZXZhbCAnZXJsYW5nOmRpc3BsYXkoZXJsYW5nOnN5c3RlbV9pbmZvKG90cF9yZWxlYXNlKSksaGFsdCgpLicgLW5vc2hlbGwgfCBncmVwICJeXCJSIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBlcmxhbmdfb3RwMTZfb3JfbGVzcz0ieWVzIgorICAgIGZpCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0IC1uICIkUFlUSE9OIiAtYSAiJFBZVEhPTiIgIT0gIjoiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfRVJMQU5HLCBbdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEVSTEFOR19PVFAxNiwgW3Rlc3QgIiRlcmxhbmdfb3RwMTZfb3JfbGVzcyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIobm9kZWpzLCBbTm9kZWpzXSwgeWVzKQoraGF2ZV9ub2RlanM9bm8KK2lmIHRlc3QgIiR3aXRoX25vZGVqcyIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0dTKFtOT0RFSlNdLCBbbm9kZWpzIG5vZGVdKQorICBBQ19QQVRIX1BST0coW05QTV0sIFtucG1dKQorICBpZiB0ZXN0ICJ4JE5PREVKUyIgIT0gIngiIC1hICJ4JE5QTSIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9ub2RlanM9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX05PREVKUywgW3Rlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChIQVZFX05QTSwgW3Rlc3QgIngkTlBNIiAhPSAieCJdKQorCitBWF9USFJJRlRfTElCKG5vZGV0cywgW05vZGV0c10sIHllcykKK2hhdmVfbm9kZXRzPW5vCitpZiB0ZXN0ICIkd2l0aF9ub2RldHMiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HUyhbTk9ERVRTXSwgW25vZGV0cyBub2RlXSkKKyAgQUNfUEFUSF9QUk9HKFtOUE1dLCBbbnBtXSkKKyAgaWYgdGVzdCAieCROT0RFVFMiICE9ICJ4IiAtYSAieCROUE0iICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfbm9kZXRzPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFVFMsIFt0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKKworQVhfVEhSSUZUX0xJQihsdWEsIFtMdWFdLCB5ZXMpCitoYXZlX2x1YT1ubworaWYgdGVzdCAiJHdpdGhfbHVhIiA9ICJ5ZXMiOyB0aGVuCisgIEFYX1BST0dfTFVBKDUuMiwsIGhhdmVfbHVhPSJ5ZXMiLCBoYXZlX2x1YT0ibm8iKQorICBpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyI7IHRoZW4KKyAgICBBWF9MVUFfSEVBREVSUygsIGhhdmVfbHVhPSJubyIpCisgICAgQVhfTFVBX0xJQlMoLCBoYXZlX2x1YT0ibm8iKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTFVBLCBbdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiXSkKKworIyBGaW5kIHB5dGhvbiByZWdhcmRsZXNzIG9mIHdpdGhfcHl0aG9uIHZhbHVlLCBiZWNhdXNlIGl0J3MgbmVlZGVkIGJ5IG1ha2UgY3Jvc3MKK0FNX1BBVEhfUFlUSE9OKDIuNiwsIDopCitBWF9USFJJRlRfTElCKHB5dGhvbiwgW1B5dGhvbl0sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5dGhvbiIgPSAieWVzIjsgIHRoZW4KKyAgaWYgdGVzdCAtbiAiJFBZVEhPTiI7IHRoZW4KKyAgICBoYXZlX3B5dGhvbj0ieWVzIgorICBmaQorICBBQ19QQVRIX1BST0coW1RSSUFMXSwgW3RyaWFsXSkKKyAgaWYgdGVzdCAtbiAiJFRSSUFMIjsgdGhlbgorICAgIGhhdmVfdHJpYWw9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1BZVEhPTiwgW3Rlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChXSVRIX1RXSVNURURfVEVTVCwgW3Rlc3QgIiRoYXZlX3RyaWFsIiA9ICJ5ZXMiXSkKKworIyBGaW5kICJweXRob24zIiBleGVjdXRhYmxlLgorIyBJdCdzIGRpc3RybyBzcGVjaWZpYyBhbmQgZmFyIGZyb20gaWRlYWwgYnV0IG5lZWRlZCB0byBjcm9zcyB0ZXN0IHB5Mi0zIGF0IG9uY2UuCisjIFRPRE86IGZpbmQgInB5dGhvbjIiIGlmIGl0J3MgMy54CitoYXZlX3B5Mz0ibm8iCitBWF9USFJJRlRfTElCKHB5MywgW1B5M10sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5MyIgPSAieWVzIjsgdGhlbgorICBpZiAkUFlUSE9OIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OM10sIFtweXRob24zIHB5dGhvbjMuNyBweXRob24zNyBweXRob24zLjYgcHl0aG9uMzYgcHl0aG9uMy41IHB5dGhvbjM1IHB5dGhvbjMuNCBweXRob24zNF0pCisgICAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCisgICAgICBoYXZlX3B5Mz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWTMsIFt0ZXN0ICIkaGF2ZV9weTMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBlcmwsIFtQZXJsXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGVybCIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW1BFUkxdLCBbcGVybF0pCisgIGlmIHRlc3QgLW4gIiRQRVJMIiA7IHRoZW4KKyAgICBBQ19QUk9HX1BFUkxfTU9EVUxFUyhbQml0OjpWZWN0b3JdLCBzdWNjZXNzPSJ5ZXMiLCBzdWNjZXNzPSJubyIpCisgICAgaGF2ZV9wZXJsX2JpdF92ZWN0b3I9IiRzdWNjZXNzIgorICAgIEFDX1BST0dfUEVSTF9NT0RVTEVTKFtDbGFzczo6QWNjZXNzb3JdLCBzdWNjZXNzPSJ5ZXMiLCBzdWNjZXNzPSJubyIpCisgICAgaGF2ZV9wZXJsX2NsYXNzX2FjY2Vzc29yPSIkc3VjY2VzcyIKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJFBFUkwiIC1hICIkaGF2ZV9wZXJsX2JpdF92ZWN0b3IiID0gInllcyIgOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBFUkwiIC1hICIkaGF2ZV9wZXJsX2NsYXNzX2FjY2Vzc29yIiA9ICJ5ZXMiIDsgdGhlbgorICAgICAgaGF2ZV9wZXJsPSJ5ZXMiCisgICAgZmkKKyAgZmkKIGZpCi1BTV9DT05ESVRJT05BTChXSVRIX1BFUkwsIFt0ZXN0IC1uICIkUEVSTCJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9QRVJMLCBbdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIocGhwLCBbUEhQXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGhwIiA9ICJ5ZXMiOyB0aGVuCiAgIEFDX1BBVEhfUFJPRyhbUEhQXSwgW3BocF0pCisgIGlmIHRlc3QgLW4gIiRQSFAiIDsgdGhlbgorICAgIGhhdmVfcGhwPSJ5ZXMiCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoV0lUSF9QSFAsIFt0ZXN0IC1uICIkUEhQIl0pCitBTV9DT05ESVRJT05BTChXSVRIX1BIUCwgW3Rlc3QgIiRoYXZlX3BocCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocGhwX2V4dGVuc2lvbiwgW1BIUF9FWFRFTlNJT05dLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9waHBfZXh0ZW5zaW9uIiA9ICJ5ZXMiOyB0aGVuCisgIGlmIHRlc3QgLWYgImxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPRyhbUEhQX0NPTkZJR10sIFtwaHAtY29uZmlnXSkKKyAgICBpZiB0ZXN0IC1uICIkUEhQX0NPTkZJRyIgOyB0aGVuCisgICAgICBBQ19DT05GSUdfU1VCRElSUyhbbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbF0pCisgICAgICBoYXZlX3BocF9leHRlbnNpb249InllcyIKKyAgICBmaQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUEhQX0VYVEVOU0lPTiwgW3Rlc3QgIiRoYXZlX3BocF9leHRlbnNpb24iID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCisgIEFDX1BBVEhfUFJPRyhbREFSVFBVQl0sIFtwdWJdKQorICBpZiB0ZXN0ICJ4JERBUlQiICE9ICJ4IiAtYSAieCREQVJUUFVCIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2RhcnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RBUlQsIFt0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihydWJ5LCBbUnVieV0sIHllcykKK2hhdmVfcnVieT1ubwogaWYgdGVzdCAiJHdpdGhfcnVieSIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW1JVQlldLCBbcnVieV0pCi0gIEFDX1BBVEhfUFJPRyhbUlNQRUNdLCBbc3BlY10pCisgIEFDX1BBVEhfUFJPRyhbQlVORExFUl0sIFtidW5kbGVdKQorICBpZiB0ZXN0ICJ4JFJVQlkiICE9ICJ4IiAtYSAieCRCVU5ETEVSIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX3J1Ynk9InllcyIKKyAgZmkKIGZpCi1BTV9DT05ESVRJT05BTChXSVRIX1JVQlksIFt0ZXN0IC1uICIkUlVCWSJdKQotQU1fQ09ORElUSU9OQUwoSEFWRV9SU1BFQywgW3Rlc3QgLW4gIiRSU1BFQyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9SVUJZLCBbdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChIQVZFX0JVTkRMRVIsIFt0ZXN0ICJ4JEJVTkRMRVIiICE9ICJ4Il0pCiAKK0FYX1RIUklGVF9MSUIoaGFza2VsbCwgW0hhc2tlbGxdLCB5ZXMpCitoYXZlX2hhc2tlbGw9bm8KK1JVTkhBU0tFTEw9dHJ1ZQorQ0FCQUw9dHJ1ZQoraWYgdGVzdCAiJHdpdGhfaGFza2VsbCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0NBQkFMXSwgW2NhYmFsXSkKKyAgQUNfUEFUSF9QUk9HKFtSVU5IQVNLRUxMXSwgW3J1bmhhc2tlbGxdKQorICBpZiB0ZXN0ICJ4JENBQkFMIiAhPSAieCIgLWEgIngkUlVOSEFTS0VMTCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9oYXNrZWxsPSJ5ZXMiCisgIGVsc2UKKyAgICBSVU5IQVNLRUxMPXRydWUKKyAgICBDQUJBTD10cnVlCisgIGZpCitmaQorQUNfU1VCU1QoQ0FCQUwpCitBQ19TVUJTVChSVU5IQVNLRUxMKQorQU1fQ09ORElUSU9OQUwoV0lUSF9IQVNLRUxMLCBbdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoZ28sIFtHb10sIHllcykKK2lmIHRlc3QgIiR3aXRoX2dvIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0dPXSwgW2dvXSkKKyAgaWYgW1sgLXggIiRHTyIgXV0gOyB0aGVuCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRHTyJdLFsKKyAgICAgIGF4X2dvX3ZlcnNpb249IjEuNCIKKyAgICAgIGF4X2dvMTdfdmVyc2lvbj0iMS43IgorCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHbyB2ZXJzaW9uXSkKKyAgICAgIGdvbGFuZ192ZXJzaW9uPWAkR08gdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKGdvIFwpXCh2ZXJzaW9uIFwpXChnb1wpXChAPDpAMC05QDo+QC5APDpAMC05QDo+QC5APDpAMC05QDo+QFwpXChAPDpAXCpAOj5AKlwpLiovXDQvJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoJGdvbGFuZ192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW2dvbGFuZ192ZXJzaW9uXSxbJGdvbGFuZ192ZXJzaW9uXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2dvX3ZlcnNpb25dLFtsZV0sWyRnb2xhbmdfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX2dvPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9nbz0ibm8iCisgICAgICBdKQorICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskZ29sYW5nX3ZlcnNpb25dLFtsdF0sWyRheF9nbzE3X3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgZ29fdmVyc2lvbl9sdF8xNz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9Im5vIgorICAgICAgXSkKKyAgICBdLFsKKyAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBHbyBdKQorICAgICAgaGF2ZV9nbz0ibm8iCisgICAgXSkKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0dPLCBbdGVzdCAiJGhhdmVfZ28iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0dPVkVSU0lPTl9MVF8xN10sIFt0ZXN0ICIkZ29fdmVyc2lvbl9sdF8xNyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoc3dpZnQsIFtTd2lmdF0sIHllcykKK2hhdmVfc3dpZnQ9Im5vIgoraWYgdGVzdCAiJHdpdGhfc3dpZnQiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtTV0lGVF0sIFtzd2lmdF0pCisgIGlmIHRlc3QgIngkU1dJRlQiICE9ICJ4IiAtYSAieCRTV0lGVCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9zd2lmdD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFtXSVRIX1NXSUZUXSwgW3Rlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihycywgW1J1c3RdLCB5ZXMpCitoYXZlX3JzPSJubyIKK2lmIHRlc3QgIiR3aXRoX3JzIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0NBUkdPXSwgW2NhcmdvXSkKKyAgQUNfUEFUSF9QUk9HKFtSVVNUQ10sIFtydXN0Y10pCisgIGlmIFtbIC14ICIkQ0FSR08iIF1dICYmIFtbIC14ICIkUlVTVEMiIF1dOyB0aGVuCisgICAgICBtaW5fcnVzdGNfdmVyc2lvbj0iMS4xMyIKKworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcnVzdGMgdmVyc2lvbl0pCisgICAgICBydXN0Y192ZXJzaW9uPWAkUlVTVEMgLS12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL1wocnVzdGMgXClcKFswLTldXClcLlwoWzAtOV1bMC05XSpcKVwuXChbMC05XVswLTldKlwpLiovXDIuXDMvJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoJHJ1c3RjX3ZlcnNpb24pCisgICAgICBBQ19TVUJTVChbcnVzdGNfdmVyc2lvbl0sWyRydXN0Y192ZXJzaW9uXSkKKworICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskbWluX3J1c3RjX3ZlcnNpb25dLFtsZV0sWyRydXN0Y192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfcnM9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJubyIKKyAgICAgIF0pCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9SUywgW3Rlc3QgIiRoYXZlX3JzIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihjbCwgW0NvbW1vbiBMaXNwXSwgeWVzKQoraGF2ZV9jbD0ibm8iCitpZiB0ZXN0ICIkd2l0aF9jbCIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtTQkNMXSwgW3NiY2xdKQorICBpZiB0ZXN0ICJ4JFNCQ0wiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfY2w9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0NMLCBbdGVzdCAiJGhhdmVfY2wiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGhheGUsIFtIYXhlXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfaGF4ZSIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtIQVhFXSwgW2hheGVdKQorICBpZiBbWyAteCAiJEhBWEUiIF1dIDsgdGhlbgorICAgIEFYX1BST0dfSEFYRV9WRVJTSU9OKCBbMy4xLjNdLCBoYXZlX2hheGU9InllcyIsIGhhdmVfaGF4ZT0ibm8iKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfSEFYRSwgW3Rlc3QgIiRoYXZlX2hheGUiID0gInllcyJdKQorCisKK0FYX1RIUklGVF9MSUIoZG90bmV0Y29yZSwgWy5ORVQgQ29yZV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2RvdG5ldGNvcmUiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbRE9UTkVUQ09SRV0sIFtkb3RuZXRdKQorICBpZiBbWyAteCAiJERPVE5FVENPUkUiIF1dIDsgdGhlbgorICAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKCBbMi4wLjBdLCBoYXZlX2RvdG5ldGNvcmU9InllcyIsIGhhdmVfZG90bmV0Y29yZT0ibm8iKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfRE9UTkVUQ09SRSwgW3Rlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyJdKQorCisKK0FYX1RIUklGVF9MSUIoZCwgW0RdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kIiA9ICJ5ZXMiOyAgdGhlbgorICBBWF9ETUQKKyAgQUNfU1VCU1QoRE1EKQorICBpZiB0ZXN0ICJ4JERNRCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9kPSJ5ZXMiCisgIGZpCitmaQorCisjIERldGVybWluZSBhY3R1YWwgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIEQgbGlicmFyeSBmb3IgdXNlIGluIHRoZSBjb21tYW5kIGxpbmUKKyMgd2hlbiBjb21waWxpbmcgdGVzdHMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIC1sPGxpYj4gc3ludGF4IGRvZXNuJ3Qgd29yaworIyB3aXRoIE9QVExJTksgKFdpbmRvd3MpLgorbGliX3ByZWZpeD1saWIKK2xpYl9zdWZmaXg9YQorY2FzZSAiJGhvc3Rfb3MiIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsaWJfcHJlZml4PSIiCisgICAgbGliX3N1ZmZpeD1saWIKKyAgICA7OworZXNhYworRF9MSUJfTkFNRT0iJHtsaWJfcHJlZml4fXRocmlmdGQuJHtsaWJfc3VmZml4fSIKK0FDX1NVQlNUKERfTElCX05BTUUpCitEX0VWRU5UX0xJQl9OQU1FPSIke2xpYl9wcmVmaXh9dGhyaWZ0ZC1ldmVudC4ke2xpYl9zdWZmaXh9IgorQUNfU1VCU1QoRF9FVkVOVF9MSUJfTkFNRSkKK0RfU1NMX0xJQl9OQU1FPSIke2xpYl9wcmVmaXh9dGhyaWZ0ZC1zc2wuJHtsaWJfc3VmZml4fSIKK0FDX1NVQlNUKERfU1NMX0xJQl9OQU1FKQorCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiOyB0aGVuCisgIEFYX0NIRUNLX0RfTU9EVUxFKGRlaW1vcy5ldmVudDIuZXZlbnQpCisgIGhhdmVfZGVpbW9zX2V2ZW50Mj0kc3VjY2VzcworCisgIHdpdGhfZF9ldmVudF90ZXN0cz0ibm8iCisgIGlmIHRlc3QgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JERNRF9MSUJFVkVOVF9GTEFHUyIgPSAieCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRkbWRfb3B0bGluayIgPSAieWVzIjsgdGhlbgorICAgICAgICBBQ19NU0dfV0FSTihbRCBsaWJldmVudCBpbnRlcmZhY2UgZm91bmQsIGJ1dCBjYW5ub3QgYXV0by1kZXRlY3QgXAorbGlua2VyIGZsYWdzIGZvciBPUFRMSU5LLiBQbGVhc2Ugc2V0IERNRF9MSUJFVkVOVF9GTEFHUyBtYW51YWxseS5dKQorICAgICAgZWxzZQorICAgICAgICBBWF9MSUJfRVZFTlQoWzIuMF0pCisgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCisgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCisgICAgICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBQ19NU0dfV0FSTihbRCBsaWJldmVudCBpbnRlcmZhY2UgcHJlc2VudCwgYnV0IGxpYmV2ZW50IGxpYnJhcnkgbm90IGZvdW5kLl0pCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIHdpdGhfZF9ldmVudF90ZXN0cz0ieWVzIgorICAgIGZpCisgIGZpCisKKyAgQVhfQ0hFQ0tfRF9NT0RVTEUoZGVpbW9zLm9wZW5zc2wuc3NsKQorICBoYXZlX2RlaW1vc19vcGVuc3NsPSRzdWNjZXNzCisKKyAgd2l0aF9kX3NzbF90ZXN0cz0ibm8iCisgIGlmIHRlc3QgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiOyB0aGVuCisgICAgaWYgdGVzdCAieCRETURfT1BFTlNTTF9GTEFHUyIgPSAieCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRkbWRfb3B0bGluayIgPSAieWVzIjsgdGhlbgorICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBmb3VuZCwgYnV0IGNhbm5vdCBhdXRvLWRldGVjdCBcCitsaW5rZXIgZmxhZ3MgZm9yIE9QVExJTksuIFBsZWFzZSBzZXQgRE1EX09QRU5TU0xfRkxBR1MgbWFudWFsbHkuXSkKKyAgICAgIGVsc2UKKyAgICAgICAgQVhfQ0hFQ0tfT1BFTlNTTChbd2l0aF9kX3NzbF90ZXN0cz0ieWVzIl0pCisgICAgICAgIGlmIHRlc3QgIiR3aXRoX2Rfc3NsX3Rlc3RzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCisgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBwcmVzZW50LCBidXQgT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICB3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiCisgICAgZmkKKyAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKFdJVEhfRCwgW3Rlc3QgIiRoYXZlX2QiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoRE1EX09QVExJTkssIFt0ZXN0ICIkZG1kX29wdGxpbmsiID0gInllcyJdKQorQUNfU1VCU1QoRE1EX09GX0RJUlNFUCwgIiRkbWRfb2ZfZGlyc2VwIikKK0FNX0NPTkRJVElPTkFMKEhBVkVfREVJTU9TX0VWRU5UMiwgW3Rlc3QgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9EX0VWRU5UX1RFU1RTLCBbdGVzdCAiJHdpdGhfZF9ldmVudF90ZXN0cyIgPSAieWVzIl0pCitBQ19TVUJTVChETURfTElCRVZFTlRfRkxBR1MpCitBTV9DT05ESVRJT05BTChIQVZFX0RFSU1PU19PUEVOU1NMLCBbdGVzdCAiJGhhdmVfZGVpbW9zX29wZW5zc2wiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9EX1NTTF9URVNUUywgW3Rlc3QgIiR3aXRoX2Rfc3NsX3Rlc3RzIiA9ICJ5ZXMiXSkKK0FDX1NVQlNUKERNRF9PUEVOU1NMX0ZMQUdTKQorCitBQ19BUkdfRU5BQkxFKFt0ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10ZXN0c10sIFtidWlsZCB0ZXN0cyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfdGVzdHM9eWVzCispCitoYXZlX3Rlc3RzPXllcworaWYgdGVzdCAiJGVuYWJsZV90ZXN0cyIgPSAibm8iOyB0aGVuCisgIGhhdmVfdGVzdHM9Im5vIgorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUoW3BsdWdpbl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9bm9dXSksCisgIFtdLCBlbmFibGVfcGx1Z2luPW5vCispCitoYXZlX3BsdWdpbj15ZXMKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAibm8iIDsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQoraWYgdGVzdCAiJGVuYWJsZV9wbHVnaW4iID0gIm5vIjsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCitBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXR1dG9yaWFsXSwgW2J1aWxkIHR1dG9yaWFsIFtkZWZhdWx0PXllc11dKSwKKyAgW10sIGVuYWJsZV90dXRvcmlhbD15ZXMKKykKK2hhdmVfdHV0b3JpYWw9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX3R1dG9yaWFsIiA9ICJubyI7IHRoZW4KKyAgaGF2ZV90dXRvcmlhbD0ibm8iCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9UVVRPUklBTCwgW3Rlc3QgIiRoYXZlX3R1dG9yaWFsIiA9ICJ5ZXMiXSkKKworQU1fQ09ORElUSU9OQUwoTUlOR1csIGZhbHNlKQorY2FzZSAiJHtob3N0X29zfSIgaW4KKyptaW5ndyopCisgIG1pbmd3MzJfc3VwcG9ydD0ieWVzIgorICBBQ19DSEVDS19IRUFERVIod2luZG93cy5oKQorICBBTV9DT05ESVRJT05BTChNSU5HVywgdHJ1ZSkKKyAgOzsKKyopCisgIEFDX0lTQ19QT1NJWAorICA7OworZXNhYwogCiBBQ19DX0NPTlNUCiBBQ19DX0lOTElORQpAQCAtMTQ0LDIxICs2NDksMzQgQEAKIEFDX0hFQURFUl9TVERCT09MCiBBQ19IRUFERVJfU1REQwogQUNfSEVBREVSX1RJTUUKK0FDX0hFQURFUl9TWVNfV0FJVAorQUNfVFlQRV9TSUdOQUwKIEFDX0NIRUNLX0hFQURFUlMoW2FycGEvaW5ldC5oXSkKLUFDX0NIRUNLX0hFQURFUlMoW2VuZGlhbi5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9wYXJhbS5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW2ZjbnRsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbaW50dHlwZXMuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtsaW1pdHMuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtuZXRkYi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2lnbmFsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkbGliLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2lvY3RsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy90aW1lLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3VuLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbcG9sbC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9wb2xsLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3Jlc291cmNlLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbGliaW50bC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW21hbGxvYy5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW29wZW5zc2wvc3NsLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC9yYW5kLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC94NTA5djMuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzY2hlZC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3djaGFyLmhdKQogCiBBQ19DSEVDS19MSUIocHRocmVhZCwgcHRocmVhZF9jcmVhdGUpCiBkbmwgTk9URShkcmVpc3MpOiBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZpbmQgYW55IHJlYWxseSBzb2xpZCBkb2NzCkBAIC0xODEsNyArNjk5LDcgQEAKIEFDX1RZUEVfVUlOVDMyX1QKIEFDX1RZUEVfVUlOVDY0X1QKIEFDX1RZUEVfVUlOVDhfVAotQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0sIFtdLCBbZXhpdCAxXSkKK0FDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2VjaG8gInB0cmRpZmZfdCBub3QgZm91bmQgb3IgZysrIG5vdCBpbnN0YWxsZWQgLSBjYW5ub3QgY29udGludWUiICYmIGV4aXQgMV0pCiAKIEFDX1NUUlVDVF9UTQogCkBAIC0xOTYsNiArNzE0LDcgQEAKIF0pCiAKIEFDX0ZVTkNfQUxMT0NBCitBQ19GVU5DX0ZPUksKIEFDX0ZVTkNfTUFMTE9DCiBBQ19GVU5DX01FTUNNUAogQUNfRlVOQ19SRUFMTE9DCkBAIC0yMDgsMTIgKzcyNywxNCBAQAogQUNfQ0hFQ0tfRlVOQ1MoW2J6ZXJvXSkKIEFDX0NIRUNLX0ZVTkNTKFtmdHJ1bmNhdGVdKQogQUNfQ0hFQ0tfRlVOQ1MoW2dldGhvc3RieW5hbWVdKQorQUNfQ0hFQ0tfRlVOQ1MoW2dldGhvc3RieW5hbWVfcl0pCiBBQ19DSEVDS19GVU5DUyhbZ2V0dGltZW9mZGF5XSkKIEFDX0NIRUNLX0ZVTkNTKFttZW1tb3ZlXSkKIEFDX0NIRUNLX0ZVTkNTKFttZW1zZXRdKQogQUNfQ0hFQ0tfRlVOQ1MoW21rZGlyXSkKIEFDX0NIRUNLX0ZVTkNTKFtyZWFscGF0aF0pCiBBQ19DSEVDS19GVU5DUyhbc2VsZWN0XSkKK0FDX0NIRUNLX0ZVTkNTKFtzZXRsb2NhbGVdKQogQUNfQ0hFQ0tfRlVOQ1MoW3NvY2tldF0pCiBBQ19DSEVDS19GVU5DUyhbc3RyY2hyXSkKIEFDX0NIRUNLX0ZVTkNTKFtzdHJkdXBdKQpAQCAtMjIyLDY3ICs3NDMsMzU4IEBACiBBQ19DSEVDS19GVU5DUyhbc3RydG9sXSkKIEFDX0NIRUNLX0ZVTkNTKFtzcXJ0XSkKIGRubCBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgb3B0aW9uYWwuCitBQ19DSEVDS19GVU5DUyhbYWxhcm1dKQogQUNfQ0hFQ0tfRlVOQ1MoW2Nsb2NrX2dldHRpbWVdKQogQUNfQ0hFQ0tfRlVOQ1MoW3NjaGVkX2dldF9wcmlvcml0eV9taW5dKQogQUNfQ0hFQ0tfRlVOQ1MoW3NjaGVkX2dldF9wcmlvcml0eV9tYXhdKQorQUNfQ0hFQ0tfRlVOQ1MoW2luZXRfbnRvYV0pCitBQ19DSEVDS19GVU5DUyhbcG93XSkKIAotQVhfU0lHTkVEX1JJR0hUX1NISUZUCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9ICJubyIgOyB0aGVuCisgIEFYX1NJR05FRF9SSUdIVF9TSElGVAorZmkKIAotQVhfVEhSSUZUX0dFTihjcHAsIFtDKytdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jcHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3BwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oamF2YSwgW0phdmFdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9qYXZhXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2phdmEiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihhczMsIFtBUzNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9hczNdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fYXMzIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oY3NoYXJwLCBbQyNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jc2hhcnBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3NoYXJwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocHksIFtQeXRob25dLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9weV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9weSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHJiLCBbUnVieV0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3JiXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3JiIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocGVybCwgW1BlcmxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9wZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3BlcmwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihwaHAsIFtQSFBdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9waHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fcGhwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oZXJsLCBbRXJsYW5nXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2VybCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGNvY29hLCBbQ29jb2FdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jb2NvYV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9jb2NvYSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHN0LCBbU21hbGx0YWxrXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fc3RdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fc3QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihvY2FtbCwgW09DYW1sXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fb2NhbWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fb2NhbWwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihocywgW0hhc2tlbGxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9oc10sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9ocyIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHhzZCwgW1hTRF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3hzZF0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl94c2QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihodG1sLCBbSFRNTF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2h0bWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5faHRtbCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGpzLCBbSmF2YVNjcmlwdF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2pzXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2pzIiA9ICJ5ZXMiXSkKK2RubCBhdXRvc2NhbiB0aGlua3Mgd2UgbmVlZCB0aGlzIG1hY3JvIGJlY2F1c2Ugd2UgaGF2ZSBhIG1lbWJlciBmdW5jdGlvbgorZG5sIGNhbGxlZCAiZXJyb3IiLiAgSW52b2tlIHRoZSBtYWNybyBidXQgZG9uJ3QgcnVuIHRoZSBjaGVjayBzbyBhdXRvc2NhbgorZG5sIHRoaW5rcyB3ZSBhcmUgaW4gdGhlIGNsZWFyLiAgSXQncyBoaWdobHkgdW5saWtlbHkgdGhhdCB3ZSB3aWxsIGV2ZXIKK2RubCBhY3R1YWxseSB1c2UgdGhlIGZ1bmN0aW9uIHRoYXQgdGhpcyBjaGVja3MgZm9yLgoraWYgZmFsc2UgOyB0aGVuCisgIEFDX0ZVTkNfRVJST1JfQVRfTElORQorZmkKKworIyAtLS0gQ292ZXJhZ2UgaG9va3MgLS0tCisKK0FDX0FSR19FTkFCTEUoY292ZXJhZ2UsCisgICAgICAgICAgICAgIFsgIC0tZW5hYmxlLWNvdmVyYWdlICAgICAgdHVybiBvbiAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2VdLAorICAgICAgICAgICAgICBbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAgICAgICAgICAgICAgIHllcykgRU5BQkxFX0NPVkVSQUdFPTEgOzsKKyAgICAgICAgICAgICAgICBubykgRU5BQkxFX0NPVkVSQUdFPTAgOzsKKyAgICAgICAgICAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtY292KSA7OworICAgICAgICAgICAgICBlc2FjXSwKKyAgICAgICAgICAgICAgW0VOQUJMRV9DT1ZFUkFHRT0yXSkKKworaWYgdGVzdCAieFskXUVOQUJMRV9DT1ZFUkFHRSIgPSAieDEiOyB0aGVuCisgIEFDX01TR19XQVJOKGVuYWJsZSBjb3ZlcmFnZSkKKyAgR0NPVl9DRkxBR1M9ImBlY2hvIFwiWyRdQ0ZMQUdTXCIgfCBwZXJsIC1wZSAncy8tT1xkKy8vZzsnYCAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCisgIEdDT1ZfQ1hYRkxBR1M9ImBlY2hvIFwiWyRdQ1hYRkxBR1NcIiB8IHBlcmwgLXBlICdzLy1PXGQrLy9nOydgIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKyAgR0NPVl9MREZMQUdTPSItWENDbGlua2VyIC1mcHJvZmlsZS1hcmNzIC1YQ0NsaW5rZXIgLWZ0ZXN0LWNvdmVyYWdlIgorZmkKKworQUNfU1VCU1QoRU5BQkxFX0NPVkVSQUdFKQorQUNfU1VCU1QoR0NPVl9DRkxBR1MpCitBQ19TVUJTVChHQ09WX0NYWEZMQUdTKQorQUNfU1VCU1QoR0NPVl9MREZMQUdTKQogCiBBQ19DT05GSUdfSEVBREVSUyhjb25maWcuaDpjb25maWcuaGluKQorQUNfQ09ORklHX0hFQURFUlMobGliL2NwcC9zcmMvdGhyaWZ0L2NvbmZpZy5oOmNvbmZpZy5oaW4pCitBQ19DT05GSUdfSEVBREVSUyhsaWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKKyMgZ3J1YXJkIGFnYWluc3QgcHJlIGRlZmluZWQgY29uZmlnLmgKK0FIX1RPUChbCisjaWZuZGVmIENPTkZJR19ICisjZGVmaW5lIENPTkZJR19ICitdKQorQUhfQk9UVE9NKFsKKyNlbmRpZgorXSkKKwogCiBBQ19DT05GSUdfRklMRVMoWwogICBNYWtlZmlsZQogICBjb21waWxlci9jcHAvTWFrZWZpbGUKLSAgY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorICBjb21waWxlci9jcHAvc3JjL01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZQorICBjb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmgKICAgbGliL01ha2VmaWxlCisgIGxpYi9jbC9NYWtlZmlsZQogICBsaWIvY3BwL01ha2VmaWxlCi0gIGxpYi9jcHAvdGhyaWZ0LnBjCisgIGxpYi9jcHAvdGVzdC9NYWtlZmlsZQogICBsaWIvY3BwL3RocmlmdC1uYi5wYwogICBsaWIvY3BwL3RocmlmdC16LnBjCisgIGxpYi9jcHAvdGhyaWZ0LXF0LnBjCisgIGxpYi9jcHAvdGhyaWZ0LXF0NS5wYworICBsaWIvY3BwL3RocmlmdC5wYworICBsaWIvY19nbGliL01ha2VmaWxlCisgIGxpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYworICBsaWIvY19nbGliL3Rlc3QvTWFrZWZpbGUKICAgbGliL2NzaGFycC9NYWtlZmlsZQorICBsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlCisgIGxpYi9kL01ha2VmaWxlCisgIGxpYi9kL3Rlc3QvTWFrZWZpbGUKICAgbGliL2VybC9NYWtlZmlsZQorICBsaWIvZ28vTWFrZWZpbGUKKyAgbGliL2dvL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2hheGUvdGVzdC9NYWtlZmlsZQorICBsaWIvaHMvTWFrZWZpbGUKICAgbGliL2phdmEvTWFrZWZpbGUKKyAgbGliL2pzL01ha2VmaWxlCisgIGxpYi9qcy90ZXN0L01ha2VmaWxlCisgIGxpYi9qc29uL01ha2VmaWxlCisgIGxpYi9qc29uL3Rlc3QvTWFrZWZpbGUKKyAgbGliL25ldGNvcmUvTWFrZWZpbGUKKyAgbGliL25vZGVqcy9NYWtlZmlsZQorICBsaWIvbm9kZXRzL01ha2VmaWxlCiAgIGxpYi9wZXJsL01ha2VmaWxlCiAgIGxpYi9wZXJsL3Rlc3QvTWFrZWZpbGUKICAgbGliL3BocC9NYWtlZmlsZQorICBsaWIvcGhwL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2RhcnQvTWFrZWZpbGUKICAgbGliL3B5L01ha2VmaWxlCiAgIGxpYi9yYi9NYWtlZmlsZQorICBsaWIvcnMvTWFrZWZpbGUKKyAgbGliL3JzL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2x1YS9NYWtlZmlsZQorICBsaWIvc3dpZnQvTWFrZWZpbGUKKyAgbGliL3htbC9NYWtlZmlsZQorICBsaWIveG1sL3Rlc3QvTWFrZWZpbGUKICAgdGVzdC9NYWtlZmlsZQorICB0ZXN0L2ZlYXR1cmVzL01ha2VmaWxlCisgIHRlc3QvY19nbGliL01ha2VmaWxlCisgIHRlc3QvY2wvTWFrZWZpbGUKKyAgdGVzdC9jcHAvTWFrZWZpbGUKKyAgdGVzdC9jc2hhcnAvTWFrZWZpbGUKKyAgdGVzdC9lcmwvTWFrZWZpbGUKKyAgdGVzdC9nby9NYWtlZmlsZQorICB0ZXN0L2hheGUvTWFrZWZpbGUKKyAgdGVzdC9ocy9NYWtlZmlsZQorICB0ZXN0L2x1YS9NYWtlZmlsZQorICB0ZXN0L25ldGNvcmUvTWFrZWZpbGUKKyAgdGVzdC9waHAvTWFrZWZpbGUKKyAgdGVzdC9kYXJ0L01ha2VmaWxlCisgIHRlc3QvcGVybC9NYWtlZmlsZQogICB0ZXN0L3B5L01ha2VmaWxlCisgIHRlc3QvcHkudHdpc3RlZC9NYWtlZmlsZQorICB0ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUKICAgdGVzdC9yYi9NYWtlZmlsZQorICB0ZXN0L3JzL01ha2VmaWxlCisgIHR1dG9yaWFsL01ha2VmaWxlCisgIHR1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZQorICB0dXRvcmlhbC9jbC9NYWtlZmlsZQorICB0dXRvcmlhbC9jcHAvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZC9NYWtlZmlsZQorICB0dXRvcmlhbC9nby9NYWtlZmlsZQorICB0dXRvcmlhbC9oYXhlL01ha2VmaWxlCisgIHR1dG9yaWFsL2hzL01ha2VmaWxlCisgIHR1dG9yaWFsL2phdmEvTWFrZWZpbGUKKyAgdHV0b3JpYWwvanMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZQorICB0dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZGFydC9NYWtlZmlsZQorICB0dXRvcmlhbC9weS9NYWtlZmlsZQorICB0dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlCisgIHR1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUKKyAgdHV0b3JpYWwvcmIvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcnMvTWFrZWZpbGUKIF0pCiAKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ1BQPSJjcHAiIDsgZWxzZSBNQVlCRV9DUFA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NQUF0pCitpZiB0ZXN0ICIkaGF2ZV9jX2dsaWIiID0gInllcyIgOyB0aGVuIE1BWUJFX0NfR0xJQj0iY19nbGliIiA7IGVsc2UgTUFZQkVfQ19HTElCPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DX0dMSUJdKQoraWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIiAtYSAiJGhhdmVfZGVpbW9zX2V2ZW50MiIgPSAieWVzIiAtYSAiJGhhdmVfZGVpbW9zX29wZW5zc2wiID0gInllcyI7IHRoZW4gTUFZQkVfRD0iZCIgOyBlbHNlIE1BWUJFX0Q9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RdKQoraWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSkFWQT0iamF2YSIgOyBlbHNlIE1BWUJFX0pBVkE9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0pBVkFdKQoraWYgdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DU0hBUlA9ImNzaGFycCIgOyBlbHNlIE1BWUJFX0NTSEFSUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ1NIQVJQXSkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFlUSE9OPSJweSIgOyBlbHNlIE1BWUJFX1BZVEhPTj0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUFlUSE9OXSkKK2lmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFkzPSJweTMiIDsgZWxzZSBNQVlCRV9QWTM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BZM10pCitpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9SVUJZPSJyYiIgOyBlbHNlIE1BWUJFX1JVQlk9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JVQlldKQoraWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSEFTS0VMTD0iaHMiIDsgZWxzZSBNQVlCRV9IQVNLRUxMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9IQVNLRUxMXSkKK2lmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuIE1BWUJFX1BFUkw9InBlcmwiIDsgZWxzZSBNQVlCRV9QRVJMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QRVJMXSkKK2lmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUEhQPSJwaHAiIDsgZWxzZSBNQVlCRV9QSFA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BIUF0pCitpZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9EQVJUPSJkYXJ0IiA7IGVsc2UgTUFZQkVfREFSVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfREFSVF0pCitpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfR089ImdvIiA7IGVsc2UgTUFZQkVfR089IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0dPXSkKK2lmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERUpTPSJub2RlanMiIDsgZWxzZSBNQVlCRV9OT0RFSlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX05PREVKU10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVUUz0ibm9kZXRzIiA7IGVsc2UgTUFZQkVfTk9ERVRTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFVFNdKQoraWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9FUkxBTkc9ImVybCIgOyBlbHNlIE1BWUJFX0VSTEFORz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRVJMQU5HXSkKK2lmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTFVBPSJsdWEiIDsgZWxzZSBNQVlCRV9MVUE9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0xVQV0pCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlM9InJzIiA7IGVsc2UgTUFZQkVfUlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JTXSkKK2lmIHRlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9TV0lGVD0ic3dpZnQiIDsgZWxzZSBNQVlCRV9TV0lGVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfU1dJRlRdKQoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRE9UTkVUQ09SRT0ibmV0Y29yZSIgOyBlbHNlIE1BWUJFX0RPVE5FVENPUkU9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RPVE5FVENPUkVdKQoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuIE1BWUJFX0NMPSJjbCIgOyBlbHNlIE1BWUJFX0NMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DTF0pCisKIEFDX09VVFBVVAorCisKK2VjaG8KK2VjaG8gIiRQQUNLQUdFICRWRVJTSU9OIgorZWNobworZWNobyAiQnVpbGRpbmcgQyAoR0xpYikgTGlicmFyeSAuLi4uIDogJGhhdmVfY19nbGliIgorZWNobyAiQnVpbGRpbmcgQyMgKE1vbm8pIExpYnJhcnkgLi4uIDogJGhhdmVfY3NoYXJwIgorZWNobyAiQnVpbGRpbmcgQysrIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfY3BwIgorZWNobyAiQnVpbGRpbmcgQ29tbW9uIExpc3AgTGlicmFyeS4uIDogJGhhdmVfY2wiCitlY2hvICJCdWlsZGluZyBEIExpYnJhcnkgLi4uLi4uLi4uLi4gOiAkaGF2ZV9kIgorZWNobyAiQnVpbGRpbmcgRGFydCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfZGFydCIKK2VjaG8gIkJ1aWxkaW5nIGRvdG5ldGNvcmUgTGlicmFyeSAuLiA6ICRoYXZlX2RvdG5ldGNvcmUiCitlY2hvICJCdWlsZGluZyBFcmxhbmcgTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9lcmxhbmciCitlY2hvICJCdWlsZGluZyBHbyBMaWJyYXJ5IC4uLi4uLi4uLi4gOiAkaGF2ZV9nbyIKK2VjaG8gIkJ1aWxkaW5nIEhhc2tlbGwgTGlicmFyeSAuLi4uLiA6ICRoYXZlX2hhc2tlbGwiCitlY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKK2VjaG8gIkJ1aWxkaW5nIEx1YSBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2x1YSIKK2VjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBQbHVnaW4gU3VwcG9ydCAuLi4uLi4gOiAkaGF2ZV9wbHVnaW4iCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQeTMgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9weTMiCitlY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgorZWNobyAiQnVpbGRpbmcgUnVzdCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnMiCitlY2hvICJCdWlsZGluZyBTd2lmdCBMaWJyYXJ5IC4uLi4uLi4gOiAkaGF2ZV9zd2lmdCIKKworaWYgdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkMjIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIDMuNSAuLi4uLi4uLi4uLi4gOiAkbmV0XzNfNSIKKyAgZWNobyAiICAgVXNpbmcgbW9ubyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkTUNTIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJDKysgTGlicmFyeToiCisgIGVjaG8gIiAgIEMrKyBjb21waWxlciAuLi4uLi4uLi4uLi4uLiA6ICRDWFgiCisgIGVjaG8gIiAgIEJ1aWxkIFRabGliVHJhbnNwb3J0IC4uLi4uLiA6ICRoYXZlX3psaWIiCisgIGVjaG8gIiAgIEJ1aWxkIFROb25ibG9ja2luZ1NlcnZlciAuLiA6ICRoYXZlX2xpYmV2ZW50IgorICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ0KSAuLi4gOiAkaGF2ZV9xdCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uIDogJGhhdmVfcXQ1IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgdmVyc2lvbiAuLi4uLi4gOiAkKCRDWFggLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiQ29tbW9uIExpc3AgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIC4uLi4uLi4uLiA6ICRTQkNMIgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCB2ZXJzaW9uIC4gOiAkKCRTQkNMIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJEIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEIENvbXBpbGVyIC4uLi4uLi4uLi4gOiAkRE1EIgorICBlY2hvICIgICBCdWlsZGluZyBEIGxpYmV2ZW50IHRlc3RzIC4gOiAkd2l0aF9kX2V2ZW50X3Rlc3RzIgorICBlY2hvICIgICBCdWlsZGluZyBEIFNTTCB0ZXN0cyAuLi4uLi4gOiAkd2l0aF9kX3NzbF90ZXN0cyIKKyAgZWNobyAiICAgVXNpbmcgRCB2ZXJzaW9uIC4uLi4uLi4uLi4uIDogJCgkRE1EIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2RhcnQiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiRGFydCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgRGFydCAuLi4uLi4uLi4uLi4uLi4uIDogJERBUlQiCisgIGVjaG8gIiAgIFVzaW5nIFB1YiAuLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUUFVCIgorICBlY2hvICIgICBVc2luZyBEYXJ0IHZlcnNpb24gLi4uLi4uLi4gOiAkKCREQVJUIC0tdmVyc2lvbiAyPiYxKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIi5ORVQgQ29yZSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIC4uLi4uLi4uLi4uIDogJERPVE5FVENPUkUiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgQ29yZSB2ZXJzaW9uIC4uLiA6ICRET1RORVRDT1JFX1ZFUlNJT04iCitmaQoraWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkVybGFuZyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCisgIGVjaG8gIiAgIFVzaW5nIHJlYmFyIC4uLi4uLi4uLi4uLi4uLiA6ICRSRUJBUiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSwgaGFsdCgpLicgLW5vc2hlbGwgfCB0ciAtZCAnXCInKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJHbyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgR28uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPIgorICBlY2hvICIgICBVc2luZyBHbyB2ZXJzaW9uLi4uLi4uLi4uLi4gOiAkKCRHTyB2ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgdmVyc2lvbiAuLi4uLiA6ICQoJFJVTkhBU0tFTEwgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhheGUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgorICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZ3JhZGxldyAuLi4uLi4uLi4uLi4uIDogbGliL2phdmEvZ3JhZGxldyIKKyAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCisgIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKKyAgZWNobyAiICAgVXNpbmcgR3JhZGxlIHZlcnNpb24gLi4uLi4uIDogJChsaWIvamF2YS9ncmFkbGV3IC0tdmVyc2lvbiAtLXF1aWV0IHwgZ3JlcCBHcmFkbGUgMj4mMSkiCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEpBVkEgLXZlcnNpb24gMj4mMSB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkx1YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiICAgVXNpbmcgTHVhIHZlcnNpb24uLi4uLi4uLi4uIDogJCgkTFVBIC12KSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTm9kZUpTIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgLi4uLi4uLi4uLi4uLi4gOiAkTk9ERUpTIgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgdmVyc2lvbi4uLi4uLi4gOiAkKCROT0RFSlMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBlcmwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIgICBVc2luZyBQZXJsIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRQRVJMIC12IHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUEhQIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiICAgVXNpbmcgcGhwIHZlcnNpb24gLi4uLi4uLi4uIDogJCgkUEhQIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQeXRob24gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiB2ZXJzaW9uIC4uLi4uLiA6ICQoJFBZVEhPTiAtLXZlcnNpb24gMj4mMSkiCisgIGlmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyAuLi4uLi4uLi4uLi4uIDogJFBZVEhPTjMiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgdmVyc2lvbiAuLi4uLiA6ICQoJFBZVEhPTjMgLS12ZXJzaW9uKSIKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgorICBmaQorZmkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVieSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFJVQlkgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdXN0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYXJnby4uLi4uLi4uLi4uLi4uLi4gOiAkQ0FSR08iCisgIGVjaG8gIiAgIFVzaW5nIHJ1c3RjLi4uLi4uLi4uLi4uLi4uLiA6ICRSVVNUQyIKKyAgZWNobyAiICAgVXNpbmcgUnVzdCB2ZXJzaW9uLi4uLi4uLi4uIDogJCgkUlVTVEMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJTd2lmdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgLi4uLi4uLi4uLi4uLi4uIDogJFNXSUZUIgorICBlY2hvICIgICBVc2luZyBTd2lmdCB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRTV0lGVCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitlY2hvCitlY2hvICJJZiBzb21ldGhpbmcgaXMgbWlzc2luZyB0aGF0IHlvdSB0aGluayBzaG91bGQgYmUgcHJlc2VudCwiCitlY2hvICJwbGVhc2Ugc2tpbSB0aGUgb3V0cHV0IG9mIGNvbmZpZ3VyZSB0byBmaW5kIHRoZSBtaXNzaW5nIgorZWNobyAiY29tcG9uZW50LiAgRGV0YWlscyBhcmUgcHJlc2VudCBpbiBjb25maWcubG9nLiIKK2VjaG8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZyBiL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA4YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9BcHAuY29uZmlnCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgCisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbiBuYW1lPSJyZWJ1cyIgdHlwZT0iUmVidXMuQ29uZmlndXJhdGlvbi5SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uLCBSZWJ1cyIvPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxyZWJ1cyBpbnB1dFF1ZXVlPSJNeVJlc3BvbnNlcyIgZXJyb3JRdWV1ZT0iTXlFcnJvcnMiIHdvcmtlcnM9IjEiPgorICAgIDxlbmRwb2ludHM+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVxdWVzdENhbGwsIFJlYnVzU2FtcGxlIiBlbmRwb2ludD0iTWF0aFJlcXVlc3RzIi8+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVzcG9uc2VDYWxsLCBSZWJ1c1NhbXBsZSIgZW5kcG9pbnQ9Ik1hdGhSZXNwb25zZXMiLz4KKyAgICA8L2VuZHBvaW50cz4KKyAgPC9yZWJ1cz4KKworICA8c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wIi8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcyBiL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNjNjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsODEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBSZWJ1c1NhbXBsZS5DbGllbnQ7Cit1c2luZyBSZWJ1c1NhbXBsZS5TZXJ2ZXI7CisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBTdGFydFJlcXVlc3RTZXJ2ZXIoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2xpZW50IFJlYnVzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHZhciBhZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChhZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xKCJhbXFwOi8vIiArIHNlcnZlciwgIk1hdGhSZXF1ZXN0cyIsICJNYXRoUmVxdWVzdEVycm9ycyIpKQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBhbGwgcmVsZXZhbnQgbWVzc2FnZSBoYW5kbGVycyAKKyAgICAgICAgICAgIGFkYXB0ZXIuUmVnaXN0ZXIodHlwZW9mKE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgU3RhcnRSZXNwb25zZVNlcnZlcihzdHJpbmcgc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGllbnQgUmVidXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgdmFyIGFkYXB0ZXIgPSBuZXcgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyZS5XaXRoKGFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXEoImFtcXA6Ly8iICsgc2VydmVyLCAiTWF0aFJlc3BvbnNlcyIsICJNYXRoUmVzcG9uc2VFcnJvcnMiKSkKKyAgICAgICAgICAgICAgICAuTWVzc2FnZU93bmVyc2hpcChvID0+IG8uRnJvbVJlYnVzQ29uZmlndXJhdGlvblNlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAuQ3JlYXRlQnVzKCkuU3RhcnQoKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHJlbGV2YW50IG1lc3NhZ2UgaGFuZGxlcnMgCisgICAgICAgICAgICBhZGFwdGVyLlJlZ2lzdGVyKHR5cGVvZihNYXRoUmVzcG9uc2VDYWxsSGFuZGxlcikpOworICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzZXJ2ZXIgPSAibG9jYWxob3N0IjsKKworICAgICAgICAgICAgLy8gc3RhcnQgYWxsIHNlcnZlcnMKKyAgICAgICAgICAgIHZhciByZXEgPSBTdGFydFJlcXVlc3RTZXJ2ZXIoc2VydmVyKTsKKyAgICAgICAgICAgIHZhciByc3AgPSBTdGFydFJlc3BvbnNlU2VydmVyKHNlcnZlcik7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXF1ZXN0Q2xpZW50KHNlcnZlcik7CisgICAgICAgICAgICBjbGllbnQuRG9UaGVNYXRoKHJhbmRvbS5OZXh0KCksIHJhbmRvbS5OZXh0KCkpOworCisgICAgICAgICAgICAvLyBub3cgd2hhdD8KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIkhpdCA8RU5URVI+IHRvIHN0b3AgLi4uICIpOworICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3NmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzOCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCitbYXNzZW1ibHk6IEd1aWQoIjBhZjEwOTg0LTQwZDMtNDUzZC1iMWU1LTQyMTUyOWU4YzdlMiIpXQorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1JFQURNRS5tZCBiL2NvbnRyaWIvUmVidXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjljNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1JFQURNRS5tZApAQCAtMCwwICsxLDIxIEBACitTYW1wbGUgY29kZSBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIFRocmlmdCB3aXRoIFJlYnVzLgorCitSZWJ1cyBpcyBhIC5ORVQgc2VydmljZSBidXMsIHNpbWlsYXIgdG8gTlNlcnZpY2VCdXMsIGJ1dCBtb3JlIGxpZ2h0d2VpZ2h0LiAKK0l0IGloYXMgYmVlbiBtYWlubHkgd3JpdHRlbiBieSBNb2dlbnMgSGVsbGVyIEdyYWJlIGFuZCBpcyBjdXJyZW50bHkgaG9zdGVkIAorb24gR2l0SHViIChodHRwczovL2dpdGh1Yi5jb20vcmVidXMtb3JnL1JlYnVzKQorCitBcyB3aXRoIGFsbCBTZXJ2aWNlQnVzIG9yIE1RIHNjZW5hcmlvcywgZHVlIHRvIHRoZSBoaWdobHkgYXN5bmNocm9ub3VzIAorb3BlcmF0aW9ucyBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyBhbGwgY2FsbHMgYXMgIm9uZXdheSB2b2lkIiBjYWxscy4KKworVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRvbmUgdmlhIEFwcC5Db25maWcsIHZpYSBjb2RlIG9yIGV2ZW4gbWl4ZWQgZnJvbSAKK2JvdGggbG9jYXRpb25zLiBSZWZlciB0byB0aGUgUmVidXMgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBGb3IgCit0aGlzIGV4YW1wbGUsIHNpbmNlIHdlIGFyZSBlZmZlY3RpdmVseSBpbXBsZW1lbnRpbmcgdHdvIHF1ZXVlIGxpc3RlbmVycyBpbiAKK29ubHkgb25lIHNpbmdsZSBwcm9jZXNzLCB3ZSBkbyBjb25maWd1cmF0aW9uIG9mIGluY29taW5nIGFuZCBlcnJvciBxdWV1ZXMgCitpbiB0aGUgY29kZS4KKworSWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBub24tTkVUIGxhbmd1YWdlcywgeW91IG1heSBuZWVkIGEgY3VzdG9taXplZCAKK3NlcmlhbGl6ZXIgYXMgd2VsbCwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgUmVidXMnIGRlZmF1bHQgd2lyZSBmb3JtYXQuIFBsZWFzZSAKK3JlZmVyIHRvIHRoZSBSZWJ1cyBkb2NzIG9uIGhvdyB0byBkbyB0aGF0IChpdCdzIG5vdCB0aGF0IGhhcmQsIHJlYWxseSkuCisKK0FkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOgorLSBSYWJiaXRNUSAuTkVUIGNsaWVudCAoc2VlIG51Z2V0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2ogYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU4YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2oKQEAgLTAsMCArMSwxMDIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPnsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlJlYnVzU2FtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+UmVidXNTYW1wbGU8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJhYmJpdE1RLkNsaWVudCI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XHJhYmJpdG1xLWRvdG5ldC1jbGllbnQtMy4yLjEtZG90bmV0LTMuMFxiaW5cUmFiYml0TVEuQ2xpZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSZWJ1cyI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XFJlYnVzLW1hc3RlclxkZXBsb3lcTkVUNDBcUmVidXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJlYnVzLlJhYmJpdE1RIj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlwuLlwuLlxUb29sYm94XFNlcnZpY2VCdXNcM3JkcGFydHlcUmVidXMtbWFzdGVyXGRlcGxveVxORVQ0MFxSZWJ1cy5SYWJiaXRNUS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXEJvdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcU2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJBcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cCAvPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+Y2QgJChQcm9qZWN0RGlyKQoraWYgbm90IGV4aXN0IGdlbi1jc2hhcnBcKi5jcyAgIHRocmlmdCAgLWdlbiBjc2hhcnAgc2FtcGxlLnRocmlmdAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4gYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRlZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4KQEAgLTAsMCArMSwyOCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTMKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMi4wLjMwMTEwLjAKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlJlYnVzU2FtcGxlIiwgIlJlYnVzU2FtcGxlLmNzcHJvaiIsICJ7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTY3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0JvdGguY3MKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIC8vIGdlbmVyaWMgZGF0YSBjb250YWluZXIgZm9yIHNlcmlhbGl6ZWQgVGhyaWZ0IGNhbGxzCisgICAgcHVibGljIGNsYXNzIEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbAorICAgIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSByYXdCeXRlczsKKyAgICB9CisKKyAgICAvLyBzcGVjaWZpYyBjb250YWluZXJzIChvbmUgcGVyIFRocmlmdCBzZXJ2aWNlKSB0byBsZXZlcmFnZSBSZWJ1cycgaGFuZGxlciByb3V0aW5nCisgICAgcHVibGljIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKyAgICBwdWJsaWMgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwODA0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTU3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBSZWJ1czsKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5NZXNzYWdlczsKK3VzaW5nIFJlYnVzLlJhYmJpdE1ROwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCisvKgorICogVGhlIGNsaWVudCBlbWl0cyBjYWxscyB0byBCYXNpY01hdGhTZXJ2ZXJzCisgKiAKKyAqIFRoZSBjbGllbnQgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UuIAorICogSWYgdGhlIHNlcnZlciBoYXMgcHJvY2Vzc2VkIG91ciByZXF1ZXN0LCB3ZSBnZXQgdGhlIHJlc3VsdHMgYmFjayB0aHJvdWdoIHRoaXMgc2VydmljZQorICovCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5DbGllbnQKK3sKKworICAgIC8vIGhhbmRsZXIgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFJlYnVzCisgICAgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlc3BvbnNlQ2FsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZShNYXRoUmVzcG9uc2VDYWxsIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRocmlmdCBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKG1lc3NhZ2UucmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwcm9jZXNzb3IgYW5kIGxldCBoaW0gaGFuZGxlIHRoZSBjYWxsCisgICAgICAgICAgICB2YXIgaG5kbCA9IG5ldyBNYXRoUmVzcG9uc2VzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoQ2xpZW50LlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0gICAgICAKKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyByZXNwb25zZXMgd2l0aCBjYWxjdWxhdGlvbiByZXN1bHRzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlc0hhbmRsZXIgOiBCYXNpY01hdGhDbGllbnQuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEZvdXJSZXN1bHRzKGludCBhZGRlZCwgaW50IG11bHRpcGxpZWQsIGludCBzdWJ0cmFjdGVkLCBpbnQgZGl2aWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZGVkID0gezB9IiwgYWRkZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11bHRpcGxpZWQ9IHswfSIsIG11bHRpcGxpZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN1YnRyYWN0ZWQgPSB7MH0iLCBzdWJ0cmFjdGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkaXZpZGVkID0gezB9IiwgZGl2aWRlZCk7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZVJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1YnRyYWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGRlZCA9IHswfSIsIGFkZGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdWx0aXBsaWVkPSB7MH0iLCBtdWx0aXBsaWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdWJ0cmFjdGVkID0gezB9Iiwgc3VidHJhY3RlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRElWLzAgZXJyb3IgZHVyaW5nIGRpdmlzaW9uIik7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsYXRlbmN5ID0gRGF0ZVRpbWUuTm93LlRpY2tzIC0gdmFsdWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUGluZyB0b29rIHswfSBtcyIsIG5ldyBEYXRlVGltZShsYXRlbmN5KS5NaWxsaXNlY29uZCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVxdWVzdENsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBjbGllbnQuUGluZyhEYXRlVGltZS5Ob3cuVGlja3MpOworICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChyYW5kb20uTmV4dCgpLCByYW5kb20uTmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVxdWVzdHMKKyAgICBpbnRlcm5hbCBjbGFzcyBNYXRoUmVxdWVzdENsaWVudCA6IEJhc2ljTWF0aFNlcnZlci5JZmFjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBNUUFkYXB0ZXI7CisKKworICAgICAgICBwdWJsaWMgTWF0aFJlcXVlc3RDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aFNlcnZlci5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aFNlcnZlci5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiggYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVxdWVzdENhbGwoKSB7IHJhd0J5dGVzID0gc3RtLlRvQXJyYXkoKSB9OworICAgICAgICAgICAgTVFBZGFwdGVyLkJ1cy5TZW5kKG1zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUGluZyh2YWx1ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRG9UaGVNYXRoKCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChhcmcxLCBhcmcyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcwpAQCAtMCwwICsxLDE0MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgUmVidXM7Cit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuTWVzc2FnZXM7Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworLyoKKyAqIFRoZSBzZXJ2ZXIgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoU2VydmVyIHNlcnZpY2UgLgorICogQWxsIHJlc3VsdHMgYXJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50IHZpYSB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UKKyAqLworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5TZXJ2ZXIKK3sKKyAgICAvLyBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBSZWJ1cworICAgIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlcXVlc3RDYWxsPgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgSGFuZGxlKE1hdGhSZXF1ZXN0Q2FsbCBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShtZXNzYWdlLnJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvY2Vzc29yIGFuZCBsZXQgaGltIGhhbmRsZSB0aGUgY2FsbAorICAgICAgICAgICAgdmFyIGhuZGwgPSBuZXcgTWF0aFJlcXVlc3RzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoU2VydmVyLlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyBjYWxjdWxhdGlvbiByZXF1ZXN0cworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXF1ZXN0c0hhbmRsZXIgOiBCYXNpY01hdGhTZXJ2ZXIuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVzcG9uc2VDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEb1RoZU1hdGgoaW50IGFyZzEsIGludCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXNwb25zZUNsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBpZiggYXJnMiAhPSAwKQorICAgICAgICAgICAgICAgIGNsaWVudC5Gb3VyUmVzdWx0cyggYXJnMSthcmcyLCBhcmcxKmFyZzIsIGFyZzEtYXJnMiwgYXJnMS9hcmcyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKCBhcmcxK2FyZzIsIGFyZzEqYXJnMiwgYXJnMS1hcmcyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVzcG9uc2VzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlQ2xpZW50IDogQmFzaWNNYXRoQ2xpZW50LklmYWNlCisgICAgeworICAgICAgICBwcml2YXRlIEJ1aWx0aW5Db250YWluZXJBZGFwdGVyIE1RQWRhcHRlcjsKKworCisgICAgICAgIHB1YmxpYyBNYXRoUmVzcG9uc2VDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aENsaWVudC5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aENsaWVudC5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVzcG9uc2VDYWxsKCkgeyByYXdCeXRlcyA9IHN0bS5Ub0FycmF5KCkgfTsKKyAgICAgICAgICAgIE1RQWRhcHRlci5CdXMuU2VuZChtc2cpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBGb3VyUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCwgaW50IGRpdmlkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkZvdXJSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkLCBkaXZpZGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQgYi9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvc2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3NlcnZpY2UgQmFzaWNNYXRoU2VydmVyIHsKKyAgICBvbmV3YXkgdm9pZCBEb1RoZU1hdGgoIDE6IGkzMiBhcmcxLCAgMjogaTMyIGFyZzIpCisgICAgb25ld2F5IHZvaWQgUGluZygxOiBpNjQgdmFsdWUpCit9CisKK3NlcnZpY2UgQmFzaWNNYXRoQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBUaHJlZVJlc3VsdHMoIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkKTsKKyAgICBvbmV3YXkgdm9pZCBGb3VyUmVzdWx0cyggIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkLCA0IDogaTMyIGRpdmlkZWQpOworICAgIG9uZXdheSB2b2lkIFBvbmcoMTogaTY0IHZhbHVlKQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9TdG9tcC9SRUFETUUubWQgYi9jb250cmliL1N0b21wL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVmMjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9TdG9tcC9SRUFETUUubWQKQEAgLTAsMCArMSwxOCBAQAorU2FtcGxlIGNvZGUgZm9yIFNUT01QLWJhc2VkIFRocmlmdCBjbGllbnRzIGFuZC9vciBzZXJ2ZXJzLgorCitBbHRob3VnaCB0aGUgc2FtcGxlIFRocmlmdCBTVE9NUCBUcmFuc3BvcnQgaXMgd3JpdHRlbiBpbiAKK0RlbHBoaS9QYXNjYWwsIGl0IGNhbiBlYXNpbHkgc2VydmUgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgCitzaW1pbGFyIGltcGxlbWVudGF0aW9ucyBpbiBvdGhlciBsYW5ndWFnZXMuCisKK1NUT01QIGlzIGEgcHJvdG9jb2wgd2lkZWx5IHN1cHBvcnRlZCBieSBtYW55IG1lc3NhZ2luZyBzeXN0ZW1zLAorc3VjaCBhcyBBcGFjaGUgQWN0aXZlTVEsIFJhYmJpdE1RIGFuZCBtYW55IG90aGVycy4gSW4gcGFydGljdWxhciwKK2l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggU2VydmljZS1CdXMgcHJvZHVjdHMgbGlrZSBSZWJ1cworb3IgTlNlcnZpY2VCdXMsIHdoZW4gcnVubmluZyBhZ2FpbnN0IGEgU1RPTVAtY2FwYWJsZSBNUSBzeXN0ZW0uCisKK0EgcHJlcmVxdWlzaXRlIGZvciB0aGlzIHNhbXBsZSBpcyB0aGUgRGVscGhpIFNUT01QIEFkYXB0ZXIgd3JpdHRlbgorYnkgRGFuaWVsZSBUZXRpIChodHRwOi8vd3d3LmRhbmllbGV0ZXRpLml0L3N0b21wLWNsaWVudCksIGN1cnJlbnRseQoraG9zdGVkIGF0IEdvb2dsZSBDb2RlIChodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGVscGhpc3RvbXBjbGllbnQpLgorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgU1RPTVAgYWRhcHRlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IAorYmluYXJ5IGRhdGEuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHRoaXMgaGFzIGJlZW4gZml4ZWQsIG90aGVyd2lzZSAKK3lvdSBoYXZlIHRvIHVzZSB0aGUgSlNPTiBwcm90b2NvbCAob3IgdG8gZml4IGl0IG9uIHlvdXIgb3duKS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvU3RvbXAvVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUC5wYXMgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCkBAIC0wLDAgKzEsMjAwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcyxXaW5kb3dzLCBTeXNVdGlscywKKyAgVGhyaWZ0LAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5TdHJlYW0sCisgIFN0b21wQ2xpZW50LAorICBTdG9tcFR5cGVzOworCit0eXBlCisgIFRTdG9tcFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkRhdGEgICAgIDogVFN0cmluZ1N0cmVhbTsKKyAgICBGU2VydmVyICAgOiBzdHJpbmc7CisgICAgRk91dFF1ZXVlIDogc3RyaW5nOworICAgIEZTdG9tcENsaSA6IElTdG9tcENsaWVudDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTZXJ2ZXIgIDogc3RyaW5nOworICAgIEZJblF1ZXVlIDogc3RyaW5nOworICAgIEZDbGllbnQgIDogSVN0b21wQ2xpZW50OworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFJblF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKK2NvbnN0CisgIFFVRVVFX1BSRUZJWCAgICA9ICcvcXVldWUvJzsKKyAgVE9QSUNfUFJFRklYICAgID0gJy90b3BpYy8nOworICBFWENIQU5HRV9QUkVGSVggPSAnL2V4Y2hhbmdlLyc7CisKKworaW1wbGVtZW50YXRpb24KKworCisKK2NvbnN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZEYXRhICAgICA6PSBUU3RyaW5nU3RyZWFtLkNyZWF0ZTsKKyAgRlNlcnZlciAgIDo9IGFTZXJ2ZXJBbmRQb3J0OworICBGT3V0UXVldWUgOj0gYU91dFF1ZXVlOworCisgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGRGF0YSwgRkFMU0UpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIGFkYXB0ZXIpOyAgLy8gb3V0cHV0IG9ubHkKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGluaGVyaXRlZCBEZXN0cm95OworICBGcmVlQW5kTmlsKCBGRGF0YSk7CisgIEZTdG9tcENsaSA6PSBuaWw7CitlbmQ7CisKKworZnVuY3Rpb24gVFN0b21wVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9tcENsaSA8PiBuaWwpOworZW5kOworCisKK2Z1bmN0aW9uIFRTdG9tcFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsgIC8vIG91dHB1dCBvbmx5CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIEZTdG9tcENsaSA8PiBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgJ2FscmVhZHkgb3BlbicpCisgIGVsc2UgRlN0b21wQ2xpIDo9IFN0b21wVXRpbHMuTmV3U3RvbXAoIEZTZXJ2ZXIpOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlN0b21wQ2xpIDo9IG5pbDsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGU3RvbXBDbGkgPSBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnbm90IG9wZW4nKTsKKworICBGU3RvbXBDbGkuU2VuZCggRk91dFF1ZXVlLCBGRGF0YS5EYXRhU3RyaW5nKTsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworLy8tLS0gVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYUluUXVldWUgOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciAgOj0gYVNlcnZlckFuZFBvcnQ7CisgIEZJblF1ZXVlIDo9IGFJblF1ZXVlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkxpc3RlbjsKK2JlZ2luCisgIEZDbGllbnQgOj0gU3RvbXBVdGlscy5OZXdTdG9tcChGU2VydmVyKTsKKyAgRkNsaWVudC5TdWJzY3JpYmUoIEZJblF1ZXVlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGlmIEZDbGllbnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGQ2xpZW50LlVuc3Vic2NyaWJlKCBGSW5RdWV1ZSk7CisgICAgRkNsaWVudCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBmcmFtZSAgIDogSVN0b21wRnJhbWU7CisgICAgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CisgICAgc3RyZWFtICA6IFRTdHJpbmdTdHJlYW07CitiZWdpbgorICBpZiBGQ2xpZW50ID0gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vdCBjb25uZWN0ZWQuJyk7CisKKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICB0cnkKKyAgICBmcmFtZSA6PSBGQ2xpZW50LlJlY2VpdmUoTUFYSU5UKTsKKyAgICBpZiBmcmFtZSA9IG5pbCB0aGVuIEV4aXQobmlsKTsKKworICAgIHN0cmVhbSAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGUoIGZyYW1lLkdldEJvZHkpOworICAgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdHJlYW0sIFRSVUUpOworICAgIHJlc3VsdCAgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdGVyLCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvVmFncmFudGZpbGUgYi9jb250cmliL1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMTMzIEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKKworIyBDcmVhdGUgc3dhcCBzcGFjZQorc3VkbyBmYWxsb2NhdGUgLWwgMkcgL3N3YXBmaWxlCitzdWRvIGNobW9kIDYwMCAvc3dhcGZpbGUKK3N1ZG8gbWtzd2FwIC9zd2FwZmlsZQorc3VkbyBzd2Fwb24gL3N3YXBmaWxlCitzdWRvIHN3YXBvbiAtcworCisjIFVwZGF0ZSB0aGUgc3lzdGVtCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZGF0ZSAtcXEgLXkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgdXBncmFkZSAtcXEgLXkKKworIyBJbnN0YWxsIERlcGVuZGVuY2llcworIyAtLS0KKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGxpYnF0NC1kZXYgZ2l0IGRlYmhlbHBlcgorCisjIEMrKyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiAKKworIyBKYXZhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCisKKyMgUHl0aG9uIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeAorCisjIFJ1YnkgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgorc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBQZXJsIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisKKyMgUGhwIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHBocDUgcGhwNS1kZXYgcGhwNS1jbGkgcGhwLXBlYXIgcmUyYworCisjIEdsaWJDIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmdsaWIyLjAtZGV2CisKKyMgRXJsYW5nIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scworCisjIEdPIGRlcGVuZGVuY2llcworZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCitzdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbworCisjIEhhc2tlbGwgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldiBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYKK3N1ZG8gY2FiYWwgdXBkYXRlCisKKyMgTHVhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2CisKKyMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBub2RlanMtbGVnYWN5IG5wbQorCisjIENTaGFycAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIG1vbm8teGJ1aWxkIG1vbm8tY29tcGxldGUgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcworCisjIEQgZGVwZW5kZW5jaWVzCitzdWRvIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QKK3N1ZG8gYXB0LWdldCB1cGRhdGUgJiYgc3VkbyBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZyAmJiBzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgeGRnLXV0aWxzIGRtZC1iaW4KKworIyBDdXN0b21pemUgdGhlIHN5c3RlbQorIyAtLS0KKyMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjggdmVyc2lvbgordXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS44LjAtb3Blbmpkay1hbWQ2NCAKKworIyBQSFBVbml0IHBhY2thZ2UgYnJva2VuIGluIHVidW50dS4gc2VlIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3BocHVuaXQvK2J1Zy83MDE1NDQKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIHBlYXIKK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIHBlYXIucGhwdW5pdC5kZQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgcGVhci5zeW1mb255LmNvbQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgY29tcG9uZW50cy5lei5ubworc3VkbyBwZWFyIHVwZGF0ZS1jaGFubmVscworc3VkbyBwZWFyIHVwZ3JhZGUtYWxsCitzdWRvIHBlYXIgaW5zdGFsbCAtLWFsbGRlcHMgcGhwdW5pdC9QSFBVbml0CisKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uZWQKKworIyBTdGFydCB0aGUgc291cmNlIGJ1aWxkCisjIC0tLQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCBidWlsZC4uLiIKK2NkIC90aHJpZnQKK3NoIGJvb3RzdHJhcC5zaAorc2ggY29uZmlndXJlCittYWtlCittYWtlIGNoZWNrCitlY2hvICJGaW5pc2hlZCBidWlsZGluZyBBcGFjaGUgVGhyaWZ0LiIKKworU0NSSVBUCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgIyBVYnVudHUgMTQuMDQgTFRTIChUcnVzdHkgVGFocikKKyAgY29uZmlnLnZtLmJveCA9ICJ0cnVzdHk2NCIKKyAgY29uZmlnLnZtLmJveF91cmwgPSAiaHR0cHM6Ly9jbG91ZC1pbWFnZXMudWJ1bnR1LmNvbS92YWdyYW50L3RydXN0eS9jdXJyZW50L3RydXN0eS1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtdmFncmFudC1kaXNrMS5ib3giCisKKyAgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uLyIsICIvdGhyaWZ0IgorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1ydGN1c2V1dGMiLCAib24iXQorICBlbmQKKworICAjIFJ1biB0aGUgYnVpbGQgc2NyaXB0IHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvTWFrZWZpbGUgYi9jb250cmliL2FzeW5jLXRlc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlN2Y4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACitUSFJJRlQgPSB0aHJpZnQKK0NYWEZMQUdTID0gYHBrZy1jb25maWcgLS1jZmxhZ3MgdGhyaWZ0IHRocmlmdC1uYmAgLWxldmVudAorTERMSUJTID0gYHBrZy1jb25maWcgLS1saWJzIHRocmlmdCB0aHJpZnQtbmJgIC1sZXZlbnQKK0NYWEZMQUdTICs9IC1nIC1PMAorCitHRU5OQU1FUyA9IEFnZ3IgYWdncl90eXBlcworR0VOSEVBREVSUyA9ICQoYWRkc3VmZml4IC5oLCAkKEdFTk5BTUVTKSkKK0dFTlNSQ1MgPSAkKGFkZHN1ZmZpeCAuY3BwLCAkKEdFTk5BTUVTKSkKK0dFTk9CSlMgPSAkKGFkZHN1ZmZpeCAubywgJChHRU5OQU1FUykpCisKK1BZTElCUyA9IGFnZ3IvX19pbml0X18ucHkKKworUFJPR1MgPSAgdGVzdC1zZXJ2ZXIKKworYWxsOiAkKFBZTElCUykgJChQUk9HUykKKwordGVzdC1zZXJ2ZXI6IHRlc3Qtc2VydmVyLm8gJChHRU5PQkpTKQorCit0ZXN0LXNlcnZlci5vOiAkKEdFTlNSQ1MpCisKK2FnZ3IvX19pbml0X18ucHk6IGFnZ3IudGhyaWZ0CisJJChSTSkgJChkaXIgJEApCisJJChUSFJJRlQpIC0tZ2VuIHB5Om5ld3N0eWxlICQ8CisJbXYgZ2VuLXB5LyQoZGlyICRAKSAuCisKKyQoR0VOU1JDUyk6IGFnZ3IudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcDpjb2Jfc3R5bGUgJDwKKwltdiAkKGFkZHByZWZpeCBnZW4tY3BwLywgJChHRU5TUkNTKSAkKEdFTkhFQURFUlMpKSAuCisKK2NsZWFuOgorCSQoUk0pIC1yICoubyAkKFBST0dTKSAkKEdFTlNSQ1MpICQoR0VOSEVBREVSUykgZ2VuLSogYWdncgorCisuUEhPTlk6IGNsZWFuCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQgYi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxNmE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdApAQCAtMCwwICsxLDggQEAKK2V4Y2VwdGlvbiBFcnJvciB7CisgIDE6IHN0cmluZyBkZXNjOworfQorCitzZXJ2aWNlIEFnZ3IgeworICB2b2lkIGFkZFZhbHVlKDE6IGkzMiB2YWx1ZSk7CisgIGxpc3Q8aTMyPiBnZXRWYWx1ZXMoKSB0aHJvd3MgKDE6IEVycm9yIGVycik7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWE0YTliCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQpAQCAtMCwwICsxLDI0IEBACisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUSHR0cFNlcnZlcgorZnJvbSBhZ2dyIGltcG9ydCBBZ2dyCisKKworY2xhc3MgQWdnckhhbmRsZXIoQWdnci5JZmFjZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCisKKyAgICBkZWYgYWRkVmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLnZhbHVlcy5hcHBlbmQodmFsdWUpCisKKyAgICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6CisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWVzCisKK3Byb2Nlc3NvciA9IEFnZ3IuUHJvY2Vzc29yKEFnZ3JIYW5kbGVyKCkpCitwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKK1RIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBpbnQoc3lzLmFyZ3ZbMV0pKSwgcGZhY3RvcnkpLnNlcnZlKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LXNlcnZlci5jcHAgYi9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDRlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KKyNpbmNsdWRlICJBZ2dyLmgiCisKK3VzaW5nIHN0ZDo6dHIxOjpiaW5kOwordXNpbmcgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzE7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpURXZodHRwU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0J1ZmZlclByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRFdmh0dHBDbGllbnRDaGFubmVsOworCitjbGFzcyBBZ2dyQXN5bmNIYW5kbGVyIDogcHVibGljIEFnZ3JDb2JTdklmIHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBSZXF1ZXN0Q29udGV4dCB7CisgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2I7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmV0OworICAgIGludCBwZW5kaW5nX2NhbGxzOworICB9OworCisgcHVibGljOgorICBBZ2dyQXN5bmNIYW5kbGVyKCkKKyAgICA6IGViXyhOVUxMKQorICAgICwgcGZhY3RfKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgIHsKKyAgICBsZWFmX3BvcnRzXy5wdXNoX2JhY2soODA4MSk7CisgICAgbGVhZl9wb3J0c18ucHVzaF9iYWNrKDgwODIpOworICB9CisKKyAgdm9pZCBhZGRWYWx1ZShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3QgdmFsdWUpIHsKKyAgICAvLyBTaWxlbnRseSBkcm9wIHdyaXRlcyB0byB0aGUgYWdncmdhdG9yLgorICAgIHJldHVybiBjb2IoKTsKKyAgfQorCisgIHZvaWQgZ2V0VmFsdWVzKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iKSB7CisgICAgUmVxdWVzdENvbnRleHQqIGN0eCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpOworICAgIGN0eC0+Y29iID0gY29iOworICAgIGN0eC0+cGVuZGluZ19jYWxscyA9IGxlYWZfcG9ydHNfLnNpemUoKTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gbGVhZl9wb3J0c18uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbGVhZl9wb3J0c18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwoCisgICAgICAgICAgbmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKAorICAgICAgICAgICAgImxvY2FsaG9zdCIsICIvIiwgIjEyNy4wLjAuMSIsICppdCwgZWJfKSk7CisgICAgICBBZ2dyQ29iQ2xpZW50KiBjbGllbnQgPSBuZXcgQWdnckNvYkNsaWVudChjaGFubmVsLCBwZmFjdF8uZ2V0KCkpOworICAgICAgY2xpZW50LT5nZXRWYWx1ZXMoc3RkOjp0cjE6OmJpbmQoJkFnZ3JBc3luY0hhbmRsZXI6OmNsaWVudFJldHVybiwgdGhpcywgY3R4LCBfMSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKHN0cnVjdCBldmVudF9iYXNlKiBlYikgeworICAgIGViXyA9IGViOworICB9CisKKyAgdm9pZCBjbGllbnRSZXR1cm4oUmVxdWVzdENvbnRleHQqIGN0eCwgQWdnckNvYkNsaWVudCogY2xpZW50KSB7CisgICAgY3R4LT5wZW5kaW5nX2NhbGxzIC09IDE7CisKKyAgICB0cnkgeworICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3VicmV0OworICAgICAgY2xpZW50LT5yZWN2X2dldFZhbHVlcyhzdWJyZXQpOworICAgICAgY3R4LT5yZXQuaW5zZXJ0KGN0eC0+cmV0LmVuZCgpLCBzdWJyZXQuYmVnaW4oKSwgc3VicmV0LmVuZCgpKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBleG4pIHsKKyAgICAgIC8vIFRPRE86IExvZyBlcnJvcgorICAgIH0KKworICAgIGRlbGV0ZSBjbGllbnQ7CisKKyAgICBpZiAoY3R4LT5wZW5kaW5nX2NhbGxzID09IDApIHsKKyAgICAgIGN0eC0+Y29iKGN0eC0+cmV0KTsKKyAgICAgIGRlbGV0ZSBjdHg7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBldmVudF9iYXNlKiBlYl87CisgIHN0ZDo6dmVjdG9yPGludD4gbGVhZl9wb3J0c187CisgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKK307CisKKworaW50IG1haW4oKSB7CisgIGJvb3N0OjpzaGFyZWRfcHRyPEFnZ3JBc3luY0hhbmRsZXI+IGhhbmRsZXIobmV3IEFnZ3JBc3luY0hhbmRsZXIoKSk7CisgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvYyhuZXcgQWdnckFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpKTsKKyAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3QobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gYnVmcHJvYyhuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IocHJvYywgcGZhY3QpKTsKKyAgYm9vc3Q6OnNoYXJlZF9wdHI8VEV2aHR0cFNlcnZlcj4gc2VydmVyKG5ldyBURXZodHRwU2VydmVyKGJ1ZnByb2MsIDgwODApKTsKKyAgaGFuZGxlci0+c2V0RXZlbnRCYXNlKHNlcnZlci0+Z2V0RXZlbnRCYXNlKCkpOworICBzZXJ2ZXItPnNlcnZlKCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtIGIvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbQppbmRleCBkZTdmYmI2Li5lNzczZTUyIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtCisrKyBiL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0KQEAgLTIxLDExICsyMSwyNiBAQAogCiBAUFJPRFVDVF9NS0AKIAotU1VCRElSUyA9IC4gY3BwIHB5CitTVUJESVJTID0gLgorCitpZiBXSVRIX0NQUAorU1VCRElSUyArPSBjcHAKK2VuZGlmCisKK2lmIFdJVEhfSkFWQQorU1VCRElSUyArPSBqYXZhCitlbmRpZgorCitpZiBXSVRIX1BIUAorU1VCRElSUyArPSBwaHAKK2VuZGlmCisKK2lmIFdJVEhfUFlUSE9OCitTVUJESVJTICs9IHB5CitlbmRpZgogCiBCVUlMVF9TT1VSQ0VTID0KIAotCiBjbGVhbi1sb2NhbDogY2xlYW4tY29tbW9uCiAKIEBHTE9CQUxfRk9PVEVSX01LQApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9SRUFETUUgYi9jb250cmliL2ZiMzAzL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9mYjMwMy9SRUFETUUKcmVuYW1lIHRvIGNvbnRyaWIvZmIzMDMvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmNwcCBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzY2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UQ2xpZW50SW5mby5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKworVENsaWVudEluZm9Db25uZWN0aW9uOjpUQ2xpZW50SW5mb0Nvbm5lY3Rpb24oKSB7CisgIGNhbGxfW2tOYW1lTGVuIC0gMV0gPSAnXDAnOyAgICAvLyBpbnN1cmUgTlVMIHRlcm1pbmF0b3IgaXMgdGhlcmUKKyAgZXJhc2VBZGRyKCk7CisgIGVyYXNlQ2FsbCgpOworfQorCit2b2lkIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6cmVjb3JkQWRkcihjb25zdCBzb2NrYWRkciogYWRkcikgeworICBlcmFzZUFkZHIoKTsKKyAgaW5pdFRpbWUoKTsKKyAgbmNhbGxzXyA9IDA7CisgIGlmIChhZGRyICE9IE5VTEwpIHsKKyAgICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgIG1lbWNweSgodm9pZCopJmFkZHJfLmlwdjQsIChjb25zdCB2b2lkICopYWRkciwgc2l6ZW9mKHNvY2thZGRyX2luKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgbWVtY3B5KCh2b2lkKikmYWRkcl8uaXB2NiwgKGNvbnN0IHZvaWQgKilhZGRyLCBzaXplb2Yoc29ja2FkZHJfaW42KSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVENsaWVudEluZm9Db25uZWN0aW9uOjplcmFzZUFkZHIoKSB7CisgIGFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKK30KKworY29uc3QgY2hhciogVENsaWVudEluZm9Db25uZWN0aW9uOjpnZXRBZGRyKGNoYXIqIGJ1ZiwgaW50IGxlbikgY29uc3QgeworICBzd2l0Y2ggKGFkZHJfLmlwdjQuc2luX2ZhbWlseSkgeworICBjYXNlIEFGX0lORVQ6CisgICAgcmV0dXJuIGluZXRfbnRvcChBRl9JTkVULCAmYWRkcl8uaXB2NC5zaW5fYWRkciwgYnVmLCBsZW4pOworICBjYXNlIEFGX0lORVQ2OgorICAgIHJldHVybiBpbmV0X250b3AoQUZfSU5FVDYsICZhZGRyXy5pcHY2LnNpbjZfYWRkciwgYnVmLCBsZW4pOworICBkZWZhdWx0OgorICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgVENsaWVudEluZm9Db25uZWN0aW9uOjpyZWNvcmRDYWxsKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgc3RybmNweShjYWxsXywgbmFtZSwga05hbWVMZW4gLSAxKTsgICAvLyBOVUwgdGVybWluYXRvciBzZXQgaW4gY29uc3RydWN0b3IKKyAgbmNhbGxzXysrOworfQorCit2b2lkIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6ZXJhc2VDYWxsKCkgeworICBjYWxsX1swXSA9ICdcMCc7Cit9CisKK2NvbnN0IGNoYXIqIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6Z2V0Q2FsbCgpIGNvbnN0IHsKKyAgaWYgKGNhbGxfWzBdID09ICdcMCcpIHsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBjYWxsXzsKK30KKwordm9pZCBUQ2xpZW50SW5mb0Nvbm5lY3Rpb246OmdldFRpbWUodGltZXNwZWMqIHRpbWUpIGNvbnN0IHsKKyAgKnRpbWUgPSB0aW1lXzsKK30KKwordWludDY0X3QgVENsaWVudEluZm9Db25uZWN0aW9uOjpnZXROQ2FsbHMoKSBjb25zdCB7CisgIHJldHVybiBuY2FsbHNfOworfQorCit2b2lkIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6aW5pdFRpbWUoKSB7CisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0aW1lXyk7Cit9CisKKworVENsaWVudEluZm9Db25uZWN0aW9uKiBUQ2xpZW50SW5mbzo6Z2V0Q29ubmVjdGlvbihpbnQgZmQsIGJvb2wgZ3JvdykgeworICBpZiAoZmQgPCAwIHx8ICghZ3JvdyAmJiBmZCA+PSBpbmZvXy5zaXplKCkpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuICZpbmZvX1tmZF07Cit9CisKK3NpemVfdCBUQ2xpZW50SW5mbzo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5mb18uc2l6ZSgpOworfQorCit2b2lkKiBUQ2xpZW50SW5mb1NlcnZlckhhbmRsZXI6OmNyZWF0ZUNvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAodm9pZClpbnB1dDsKKyAgKHZvaWQpb3V0cHV0OworICByZXR1cm4gKHZvaWQqKSBuZXcgQ29ubmVjdCgmY2xpZW50SW5mb18pOworfQorCit2b2lkIFRDbGllbnRJbmZvU2VydmVySGFuZGxlcjo6ZGVsZXRlQ29udGV4dCh2b2lkKiBjb25uZWN0aW9uQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICBDb25uZWN0KiBjYWxsID0gc3RhdGljX2Nhc3Q8Q29ubmVjdCo+KGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgaWYgKGNhbGwtPmNhbGxJbmZvXykgeworICAgIGNhbGwtPmNhbGxJbmZvXy0+ZXJhc2VDYWxsKCk7CisgIH0KKyAgZGVsZXRlIGNhbGw7Cit9CisKK3ZvaWQgVENsaWVudEluZm9TZXJ2ZXJIYW5kbGVyOjpwcm9jZXNzQ29udGV4dCh2b2lkKiBjb25uZWN0aW9uQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICBDb25uZWN0KiBjYWxsID0gc3RhdGljX2Nhc3Q8Q29ubmVjdCo+KGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgaWYgKGNhbGwtPmNhbGxJbmZvXyA9PSBOVUxMKSB7CisgICAgaWYgKHR5cGVpZCgqKHRyYW5zcG9ydC5nZXQoKSkpID09IHR5cGVpZChUU29ja2V0KSkgeworICAgICAgVFNvY2tldCogdHNvY2tldCA9IHN0YXRpY19jYXN0PFRTb2NrZXQqPih0cmFuc3BvcnQuZ2V0KCkpOworICAgICAgaW50IGZkID0gdHNvY2tldC0+Z2V0U29ja2V0RkQoKTsKKyAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY2FsbC0+Y2FsbEluZm9fID0gY2FsbC0+Y2xpZW50SW5mb18tPmdldENvbm5lY3Rpb24oZmQsIHRydWUpOworICAgICAgYXNzZXJ0KGNhbGwtPmNhbGxJbmZvXyAhPSBOVUxMKTsKKyAgICAgIHNvY2tsZW5fdCBsZW47CisgICAgICAgIGNhbGwtPmNhbGxJbmZvXy0+cmVjb3JkQWRkcih0c29ja2V0LT5nZXRDYWNoZWRBZGRyZXNzKCZsZW4pKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUQ2xpZW50SW5mb1NlcnZlckhhbmRsZXI6OmdldFN0YXRzU3RyaW5ncyh2ZWN0b3I8c3RyaW5nPiYgcmVzdWx0KSB7CisgIHJlc3VsdC5jbGVhcigpOworICB0aW1lc3BlYyBub3c7CisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpZW50SW5mb18uc2l6ZSgpOyArK2kpIHsKKyAgICBUQ2xpZW50SW5mb0Nvbm5lY3Rpb24qIGluZm8gPSBjbGllbnRJbmZvXy5nZXRDb25uZWN0aW9uKGksIGZhbHNlKTsKKyAgICBjb25zdCBjaGFyKiBjYWxsU3RyID0gaW5mby0+Z2V0Q2FsbCgpOworICAgIGlmIChjYWxsU3RyID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNoYXIgYWRkckJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKyAgICBjb25zdCBjaGFyKiBhZGRyU3RyID0gaW5mby0+Z2V0QWRkcihhZGRyQnVmLCBzaXplb2YgYWRkckJ1Zik7CisgICAgaWYgKGFkZHJTdHIgPT0gTlVMTCkgeworICAgICAgLy8gY2VyciA8PCAibm8gYWRkciEiIDw8IGVuZGw7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB0aW1lc3BlYyBzdGFydDsKKyAgICBpbmZvLT5nZXRUaW1lKCZzdGFydCk7CisgICAgZG91YmxlIHNlY3MgPSAoZG91YmxlKShub3cudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArIChub3cudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpKjAuMDAwMDAwMDAxOworCisgICAgY2hhciBidWZbMjU2XTsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCAlcyAlcyAlLjNmICVsbHUiLCBpLCBhZGRyU3RyLCBjYWxsU3RyLCBzZWNzLAorICAgICAgICAgICAgICh1aW50NjRfdClpbmZvLT5nZXROQ2FsbHMoKSk7CisgICAgICAgICAgICAgICAKKyAgICByZXN1bHQucHVzaF9iYWNrKGJ1Zik7CisgIH0KK30KKwordm9pZCogVENsaWVudEluZm9DYWxsSGFuZGxlcjo6Z2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisgIGlmIChzZXJ2ZXJDb250ZXh0KSB7CisgICAgVENsaWVudEluZm9Db25uZWN0aW9uKiBjYWxsSW5mbyA9ICBzdGF0aWNfY2FzdDxUQ2xpZW50SW5mb1NlcnZlckhhbmRsZXI6OkNvbm5lY3QqPihzZXJ2ZXJDb250ZXh0KS0+Y2FsbEluZm9fOworICAgIGlmIChjYWxsSW5mbyAhPSBOVUxMKSB7CisgICAgICBjYWxsSW5mby0+cmVjb3JkQ2FsbChmbl9uYW1lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmggYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2OGMxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uaApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GQUNFQk9PS19USFJJRlRfU0VSVkVSX1RDTElFTlRJTkZPX0hfCisjZGVmaW5lIF9GQUNFQk9PS19USFJJRlRfU0VSVkVSX1RDTElFTlRJTkZPX0hfIDEKKworLy8gZm9yIGluZXRfbnRvcCAtLQorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Cit1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8qKgorICogU3RhYmxlVmVjdG9yIC0tIGEgbWluaW1hbCB2ZWN0b3IgY2xhc3Mgd2hlcmUgZ3Jvd3RoIGlzIGF1dG9tYXRpYyBhbmQKKyAqIHZlY3RvciBlbGVtZW50cyBuZXZlciBtb3ZlIGFzIHRoZSB2ZWN0b3IgZ3Jvd3MuICBBbGxvY2F0ZXMgbmV3IHNwYWNlCisgKiBhcyBuZWVkZWQsIGJ1dCBkb2VzIG5vdCBjb3B5IG9sZCB2YWx1ZXMuCisgKgorICogQSBsZXZlbCB2ZWN0b3Igc3RvcmVzIGEgbGlzdCBvZiBzdG9yYWdlIHZlY3RvcnMgY29udGFpbmluZyB0aGUgYWN0dWFsCisgKiBlbGVtZW50cy4gIExldmVscyBhcmUgYWRkZWQgYXMgbmVlZGVkLCBkb3VibGluZyBpbiBzaXplIGVhY2ggdGltZS4KKyAqIExvY2tpbmcgaXMgb25seSBkb25lIHdoZW4gYSBsZXZlbCBpcyBhZGRlZC4gIEFjY2VzcyBpcyBhbW9ydGl6ZWQKKyAqIGNvbnN0YW50IHRpbWUuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3RhYmxlVmVjdG9yIHsKKyAgLy8vIFRoZSBpbml0aWFsIGFsbG9jYXRpb24gYXMgYW4gZXhwb25lbnQgb2YgMgorICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0luaXRpYWxTaXplUG93T2YyID0gMTA7CisgIC8vLyBUaGUgaW5pdGlhbCBhbGxvY2F0aW9uIHNpemUKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJbml0aWFsVmVjdG9yU2l6ZSA9IDEgPDwga0luaXRpYWxTaXplUG93T2YyOworICAvLy8gVGhpcyBib3VuZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBleGNlZWRlZCBvbiA2NC1iaXQgYXJjaHMKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4TGV2ZWxzID0gNjQ7CisKKyAgLy8vIFZhbHVlcyBhcmUga2VwdCBpbiBvbmUgb3IgbW9yZSBvZiB0aGVzZQorICB0eXBlZGVmIHZlY3RvcjxUPiBWZWN0OworICAvLy8gT25lIG9yIG1vcmUgdmFsdWUgdmVjdG9ycyBhcmUga2VwdCBpbiBvbmUgb2YgdGhlc2UKKyAgdHlwZWRlZiB2ZWN0b3I8VmVjdCo+IExldmVsVmVjdG9yOworCisgIE11dGV4IG11dGV4XzsKKyAgLy8vIGN1cnJlbnQgc2l6ZQorICBzaXplX3Qgc2l6ZV87CisgIF9BdG9taWNfd29yZCB2ZWN0THZsXzsKKyAgTGV2ZWxWZWN0b3IgdmVjdHNfOworCisgcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IgLS0gaW5pdGlhbGl6ZSB0aGUgbGV2ZWwgdmVjdG9yIGFuZCBhbGxvY2F0ZSB0aGUKKyAgICogaW5pdGlhbCBzdG9yYWdlIHZlY3RvcgorICAgKi8KKyAgU3RhYmxlVmVjdG9yKCkKKyAgICA6IHNpemVfKDApIAorICAgICwgdmVjdEx2bF8oMCkgeworICAgIHZlY3RzXy5yZXNlcnZlKGtNYXhMZXZlbHMpOworICAgIFZlY3QqIHN0b3JhZ2VWZWN0b3IobmV3IFZlY3QoMSA8PCBrSW5pdGlhbFNpemVQb3dPZjIpKTsKKyAgICB2ZWN0c18ucHVzaF9iYWNrKHN0b3JhZ2VWZWN0b3IpOworICB9CisKKyBwcml2YXRlOgorICAvKioKKyAgICogbWFrZSBzdXJlIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHN0b3JhZ2UgbGV2ZWxzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuCisgICAqLworICB2b2lkIGV4cGFuZCh1aW50MzJfdCBsZXZlbCkgeworICAgIC8vIHdlIG5lZWQgdGhlIGd1YXJkIHRvIGluc3VyZSB0aGF0IHdlIG9ubHkgYWxsb2NhdGUgb25jZS4KKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgd2hpbGUgKGxldmVsID4gdmVjdEx2bF8pIHsKKyAgICAgIFZlY3QqIGxldmVsVmVjdChuZXcgVmVjdCgxIDw8ICh2ZWN0THZsXyArIGtJbml0aWFsU2l6ZVBvd09mMikpKTsKKyAgICAgIHZlY3RzXy5wdXNoX2JhY2sobGV2ZWxWZWN0KTsKKyAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSBhZnRlciBsZXZlbFZlY3QgaXMgaW5zZXJ0ZWQKKyAgICAgIC8vICh3aGF0IHdlIHdhbnQgaXMgZWZmZWN0aXZlbHkgYSBtZW1vcnkgYmFycmllciBoZXJlKS4KKyAgICAgIF9fZ251X2N4eDo6X19hdG9taWNfYWRkKCZ2ZWN0THZsXywgMSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGFuIGluZGV4LCBkZXRlcm1pbmUgd2hpY2ggbGV2ZWwgYW5kIGVsZW1lbnQgb2YgdGhhdCBsZXZlbCBpcworICAgKiByZXF1aXJlZC4gIEdyb3dzIGlmIG5lZWRlZC4KKyAgICovCisgIHZvaWQgd2hpY2godWludDMyX3QgbiwgdWludDMyX3QqIHZubywgdWludDMyX3QqIGlkeCkgeworICAgIGlmIChuID49IHNpemVfKSB7CisgICAgICBzaXplXyA9IG4gKyAxOworICAgIH0KKyAgICBpZiAobiA8IGtJbml0aWFsVmVjdG9yU2l6ZSkgeworICAgICAgKmlkeCA9IG47CisgICAgICAqdm5vID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgdXBwZXIgPSBuID4+IGtJbml0aWFsU2l6ZVBvd09mMjsKKyAgICAgICp2bm8gPSBDSEFSX0JJVCpzaXplb2YodXBwZXIpIC0gX19idWlsdGluX2Nseih1cHBlcik7CisgICAgICAqaWR4ID0gbiAtICgxIDw8ICgqdm5vICsga0luaXRpYWxTaXplUG93T2YyIC0gMSkpOworICAgICAgaWYgKCp2bm8gPiB2ZWN0THZsXykgeworICAgICAgICBleHBhbmQoKnZubyk7CisgICAgICB9CisgICAgfQorICB9CisKKyBwdWJsaWM6CisgIC8qKgorICAgKiBHaXZlbiBhbiBpbmRleCwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoYXQgZWxlbWVudCwgcGVyaGFwcyBhZnRlcgorICAgKiBhbGxvY2F0aW5nIGFkZGl0aW9uYWwgc3BhY2UuCisgICAqCisgICAqIEBwYXJhbSBuIGEgcG9zaXRpdmUgaW50ZWdlcgorICAgKi8KKyAgVCYgb3BlcmF0b3JbXSh1aW50MzJfdCBuKSB7CisgICAgdWludDMyX3Qgdm5vOworICAgIHVpbnQzMl90IGlkeDsKKyAgICB3aGljaChuLCAmdm5vLCAmaWR4KTsKKyAgICByZXR1cm4gKCp2ZWN0c19bdm5vXSlbaWR4XTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHByZXNlbnQgc2l6ZSBvZiB0aGUgdmVjdG9yLgorICAgKi8KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorfTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgZW1ib2RpZXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGNvbm5lY3Rpb24gZHVyaW5nCisgKiBwcm9jZXNzaW5nLiAgV2UnbGwga2VlcCBvbmUgb2YgdGhlc2UgcGVyIGZpbGUgZGVzY3JpcHRvciBpbiBUQ2xpZW50SW5mby4KKyAqLworY2xhc3MgVENsaWVudEluZm9Db25uZWN0aW9uIHsKKyBwdWJsaWM6CisgIGNvbnN0IHN0YXRpYyBpbnQga05hbWVMZW4gPSAzMjsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgdW5pb24gSVBBZGRyVW5pb24geworICAgIHNvY2thZGRyX2luIGlwdjQ7CisgICAgc29ja2FkZHJfaW42IGlwdjY7CisgIH07CisKKyAgY2hhciBjYWxsX1trTmFtZUxlbl07ICAgICAgICAgICAgLy8vPCBUaGUgbmFtZSBvZiB0aGUgdGhyaWZ0IGNhbGwKKyAgSVBBZGRyVW5pb24gYWRkcl87ICAgICAgICAgICAgICAgLy8vPCBUaGUgY2xpZW50J3MgSVAgYWRkcmVzcworICB0aW1lc3BlYyB0aW1lXzsgICAgICAgICAgICAgICAgICAvLy88IFRpbWUgcHJvY2Vzc2luZyBzdGFydGVkCisgIHVpbnQ2NF90IG5jYWxsc187ICAgICAgICAgICAgICAgIC8vLzwgIyBvZiBjYWxscyBwcm9jZXNzZWQKKworIHB1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yOyBpbnN1cmUgdGhhdCBubyBjbGllbnQgYWRkcmVzcyBvciB0aHJpZnQgY2FsbCBuYW1lIGlzCisgICAqIHJlcHJlc2VudGVkLgorICAgKi8KKyAgVENsaWVudEluZm9Db25uZWN0aW9uKCk7CisKKyAgLyoqCisgICAqIEEgY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlOyByZWNvcmQgaXRzIGFkZHJlc3MuICBTaW5jZSB0aGlzIGlzIHRoZQorICAgKiBmaXJzdCB3ZSdsbCBrbm93IG9mIGEgY29ubmVjdGlvbiB3ZSBzdGFydCB0aGUgdGltZXIgaGVyZSBhcyB3ZWxsLgorICAgKi8KKyAgdm9pZCByZWNvcmRBZGRyKGNvbnN0IHNvY2thZGRyKiBhZGRyKTsKKworICAvKioKKyAgICogTWFyayB0aGUgYWRkcmVzcyBhcyBlbXB0eS91bmtub3duLgorICAgKi8KKyAgdm9pZCBlcmFzZUFkZHIoKTsKKworICAvKioKKyAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlc2VudCBhZGRyZXNzLCBvciBOVUxMIGlmIG5vbmUuCisgICAqIENvcGllcyB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZC4KKyAgICovCisgIGNvbnN0IGNoYXIqIGdldEFkZHIoY2hhciogYnVmLCBpbnQgbGVuKSBjb25zdDsKKworICAvKioKKyAgICogQSBjYWxsIGhhcyBiZWVuIG1hZGUgb24gdGhpcyBjb25uZWN0aW9uOyByZWNvcmQgaXRzIG5hbWUuICBTaW5jZSB0aGlzIGlzCisgICAqIGNhbGxlZCBmb3IgZXZlcnkgdGhyaWZ0IGNhbGwgcHJvY2Vzc2VkLCB3ZSBhbHNvIGRvIG91ciBjYWxsIGNvdW50IGhlcmUuCisgICAqLyAKKyAgdm9pZCByZWNvcmRDYWxsKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gcHJvY2Vzc2luZyBoYXMgZW5kZWQgdG8gY2xlYXIgdGhlIGNhbGwgbmFtZS4KKyAgICovCisgIHZvaWQgZXJhc2VDYWxsKCk7CisKKyAgLyoqCisgICAqIFJldHVybiBhcyBzdHJpbmcgdGhlIHRocmlmdCBjYWxsIGVpdGhlciBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9yCisgICAqIG1vc3QgcmVjZW50bHkgcHJvY2Vzc2VkIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4gZm9yIGFkZGl0aW9uYWwKKyAgICogY2FsbHMuICBSZXR1cm5zIE5VTEwgaWYgYSBjYWxsIGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHByb2Nlc3NpbmcKKyAgICogaGFzIGVuZGVkLgorICAgKi8KKyAgY29uc3QgY2hhciogZ2V0Q2FsbCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXQgdGhlIHRpbWVzcGVjIGZvciB0aGUgc3RhcnQgb2YgdGhpcyBjb25uZWN0aW9uIChzcGVjaWZpY2FsbHksIHdoZW4KKyAgICogcmVjb3JkQWRkcigpIHdhcyBmaXJzdCBjYWxsZWQpLgorICAgKi8KKyAgdm9pZCBnZXRUaW1lKHRpbWVzcGVjKiB0aW1lKSBjb25zdDsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2FsbHMgbWFkZSBvbiB0aGlzIGNvbm5lY3Rpb24uCisgICAqLworICB1aW50NjRfdCBnZXROQ2FsbHMoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgaW5pdFRpbWUoKTsKK307CisKKworLyoqCisgKiBTdG9yZSBmb3IgaW5mbyBhYm91dCBhIHNlcnZlcidzIGNsaWVudHMgLS0gc3BlY2lmaWNhbGx5LCB0aGUgY2xpZW50J3MgSVAKKyAqIGFkZHJlc3MgYW5kIHRoZSBjYWxsIGl0IGlzIGV4ZWN1dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW5kZXhlZCBieQorICogc29ja2V0IGZpbGUgZGVzY3JpcHRvciBhbmQgaW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24gaXMgdXBkYXRlZAorICogYXN5bmNocm9ub3VzbHksIHNvIGl0IG1heSBvbmx5IGFwcHJveGltYXRlIHJlYWxpdHkuCisgKi8KK2NsYXNzIFRDbGllbnRJbmZvIHsKKyBwcml2YXRlOgorICBTdGFibGVWZWN0b3I8VENsaWVudEluZm9Db25uZWN0aW9uPiBpbmZvXzsKKworIHB1YmxpYzoKKyAgLyoqCisgICAqIFJldHVybiB0aGUgaW5mbyBvYmplY3QgZm9yIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAgSWYgImdyb3ciIGlzIHRydWUKKyAgICogZXh0ZW5kIHRoZSBpbmZvIHZlY3RvciBpZiByZXF1aXJlZCAoc3VjaCBhcyBmb3IgYSBmaWxlIGRlc2NyaXB0b3Igbm90IHNlZW4KKyAgICogYmVmb3JlKS4gIElmICJncm93IiBpcyBmYWxzZSBhbmQgdGhlIGluZm8gdmVjdG9yIGlzbid0IGxhcmdlIGVub3VnaCwKKyAgICogb3IgaWYgImZkIiBpcyBuZWdhdGl2ZSwgcmV0dXJuIE5VTEwuCisgICAqLworICBUQ2xpZW50SW5mb0Nvbm5lY3Rpb24qIGdldENvbm5lY3Rpb24oaW50IGZkLCBib29sIGdyb3cpOworCisgIHNpemVfdCBzaXplKCkgY29uc3Q7Cit9OworCisvKioKKyAqIFRoaXMgZGVyaXZhdGlvbiBvZiBUU2VydmVyRXZlbnRIYW5kbGVyIGVuY2Fwc3VsYXRlcyB0aGUgbWFpbiBzdGF0dXMgdmVjdG9yCisgKiBhbmQgcHJvdmlkZXMgY29udGV4dCB0byB0aGUgc2VydmVyJ3MgcHJvY2Vzc2luZyBsb29wIHZpYSBvdmVycmlkZXMuCisgKiBUb2dldGhlciB3aXRoIFRDbGllbnRJbmZvQ2FsbEhhbmRsZXIgKGRlcml2ZWQgZnJvbSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKSAKKyAqIGl0IGludGVncmF0ZXMgY2xpZW50IGluZm8gY29sbGVjdGlvbiBpbnRvIHRoZSBzZXJ2ZXIuCisgKi8KK2NsYXNzIFRDbGllbnRJbmZvU2VydmVySGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyBwcml2YXRlOgorICBUQ2xpZW50SW5mbyBjbGllbnRJbmZvXzsKKworIHB1YmxpYzoKKyAgLyoqCisgICAqIE9uZSBvZiB0aGVzZSBpcyBjb25zdHJ1Y3RlZCBmb3IgZWFjaCBvcGVuIGNvbm5lY3Rpb24vZGVzY3JpcHRvciBhbmQgbGlua3MKKyAgICogdG8gYm90aCB0aGUgc3RhdHVzIHZlY3RvciAoY2xpZW50SW5mb18pIGFuZCB0aGF0IGRlc2NyaXB0b3IncyBlbnRyeQorICAgKiB3aXRoaW4gaXQuCisgICAqLworICBzdHJ1Y3QgQ29ubmVjdCB7CisgICAgVENsaWVudEluZm8qIGNsaWVudEluZm9fOworICAgIFRDbGllbnRJbmZvQ29ubmVjdGlvbiogY2FsbEluZm9fOworCisgICAgZXhwbGljaXQgQ29ubmVjdChUQ2xpZW50SW5mbyogY2xpZW50SW5mbykKKyAgICAgIDogY2xpZW50SW5mb18oY2xpZW50SW5mbykKKyAgICAgICwgY2FsbEluZm9fKE5VTEwpIHsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHByb2Nlc3NvciBjb250ZXh0OyB3ZSBkb24ndCBrbm93IHdoYXQgZGVzY3JpcHRvciB3ZSBiZWxvbmcgdG8KKyAgICogeWV0IC0tIHdlJ2xsIGdldCBob29rZWQgdXAgaW4gY29udGV4dFByb2Nlc3MoKS4gCisgICAqLworICB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpOworCisgIC8qKgorICAgKiBNYXJrIG91ciBzbG90IGFzIHVudXNlZCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGNyZWF0ZWQgaW4gY3JlYXRlQ29udGV4dCgpLgorICAgKi8KKyAgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHByb2Nlc3NvckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpOworICAKKyAgLyoqCisgICAqIENhbGxlZCBpbiB0aGUgcHJvY2Vzc2luZyBsb29wIGp1c3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaW52b2tlcyB0aGUKKyAgICogcHJvY2Vzc29yIGl0c2VsZiwgb24gdGhlIGZpcnN0IGNhbGwgd2UgZXN0YWJsaXNoIHdoaWNoIGRlc2NyaXB0b3IKKyAgICogd2UgY29ycmVzcG9uZCB0byBhbmQgc2V0IGl0IHRvIHRoYXQgc29ja2V0J3MgcGVlciBJUCBhZGRyZXNzLiAgVGhpcworICAgKiBhbHNvIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgaW5pdGlhbGl6aW5nIGNhbGwgY291bnRpbmcgYW5kIGNvbm5lY3Rpb24KKyAgICogdGltaW5nLiAgV2Ugd29uJ3Qga25vdyB3aGljaCBjYWxsIHdlJ3JlIGhhbmRsaW5nIHVudGlsIHRoZSBoYW5kbGVyCisgICAqIGZpcnN0IGdldHMgY2FsbGVkIGluIFRDbGllbnRJbmZvQ2FsbEhhbmRsZXI6OmdldENvbnRleHQoKS4KKyAgICovCisgIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogcHJvY2Vzc29yQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CisKKyAgLyoqCisgICAqIEdldCBzdGF0dXMgcmVwb3J0IGZvciBzZXJ2ZXIgaW4gdGhlIGZvcm0gb2YgYSB2ZWN0b3Igb2Ygc3RyaW5ncy4KKyAgICogRWFjaCBhY3RpdmUgY2xpZW50IGFwcGVhcnMgYXMgb25lIHN0cmluZyBpbiB0aGUgZm9ybWF0OgorICAgKgorICAgKiAgICAgRkQgSVBBRERSIENBTExOQU1FIERVUkFUSU9OIE5DQUxMUworICAgKgorICAgKiB3aGVyZSAiRkQiIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjbGllbnQncyBzb2NrZXQsICJJUEFERFIiCisgICAqIGlzIHRoZSBJUCBhZGRyZXNzIChhcyByZXBvcnRlZCBieSBhY2NlcHQoKSksICJDQUxMTkFNRSIgaXMgdGhlCisgICAqIGN1cnJlbnQgb3IgbW9zdCByZWNlbnQgVGhyaWZ0IGZ1bmN0aW9uIG5hbWUsICJEVVJBVElPTiIgaXMgdGhlCisgICAqIGR1cmF0aW9uIG9mIHRoZSBjb25uZWN0aW9uLCB3aGlsZSBOQ0FMTFMgaXMgdGhlIG51bWJlciBvZiBUaHJpZnQKKyAgICogY2FsbHMgbWFkZSBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgbWFkZS4gIEEgc2luZ2xlIHNwYWNlIHNlcGFyYXRlcworICAgKiBmaWVsZHMuCisgICAqLworICB2b2lkIGdldFN0YXRzU3RyaW5ncyh2ZWN0b3I8c3RyaW5nPiYgcmVzdWx0KTsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gVFByb2Nlc3NvckV2ZW50SGFuZGxlciB0byBnYWluIGFjY2VzcyB0byB0aGUKKyAqIGZ1bmN0aW9uIG5hbWUgZm9yIHRoZSBjdXJyZW50IFRocmlmdCBjYWxsLiAgV2UgbmVlZCB0d28gdmVyc2lvbnMgb2YKKyAqIHRoaXMgLS0gVENsaWVudEluZm9DYWxsU3RhdHNIYW5kbGVyIGlzIHRoZSBvdGhlciAtLSBzaW5jZSBpbiB0aGUgbGF0dGVyCisgKiBjYXNlIHdlIHBhc3MgdGhyb3VnaCB0byBURnVuY3Rpb25TdGF0SGFuZGxlciB0byBwZXJmb3JtIFRocmlmdCBjYWxsCisgKiBzdGF0cy4KKyAqLworY2xhc3MgVENsaWVudEluZm9DYWxsSGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KTsKK307CisKK30gfSB9IC8vIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAhX0ZBQ0VCT09LX1RIUklGVF9TRVJWRVJfVENMSUVOVElORk9fSF8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzkxODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00CkBAIC0wLDAgKzEsMTM0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW2V4dHxub2V4dF0sW21hbmRhdG9yeXxvcHRpb25hbF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIEMrKzExCisjICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWEZMQUdTIHRvIGVuYWJsZSBzdXBwb3J0LgorIworIyAgIFRoZSBmaXJzdCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCisjICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KKyMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCisjICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KKyMKKyMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKKyMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBDKysxMSBzdXBwb3J0IGlzIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybworIyAgIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZAorIyAgICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcyByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZworIyAgIEhBVkVfQ1hYMTEgaWYgYW5kIG9ubHkgaWYgYSBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMworCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldLCBbCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjaGVjaworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKFQpLCAibm90IGJpZyBlbm91Z2giKTsKKyAgICB9OworCisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxib29sPj4gcmlnaHRfYW5nbGVfYnJhY2tldHM7CisKKyAgICBpbnQgYTsKKyAgICBkZWNsdHlwZShhKSBiOworCisgICAgdHlwZWRlZiBjaGVjazxpbnQ+IGNoZWNrX3R5cGU7CisgICAgY2hlY2tfdHlwZSBjOworICAgIGNoZWNrX3R5cGUmJiBjciA9IHN0YXRpY19jYXN0PGNoZWNrX3R5cGUmJj4oYyk7CisKKyAgICBhdXRvIGQgPSBhOworXSkKKworQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV0sIFtkbmwKKyAgbTRfaWYoWyQxXSwgW10sIFtdLAorICAgICAgICBbJDFdLCBbZXh0XSwgW10sCisgICAgICAgIFskMV0sIFtub2V4dF0sIFtdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgYXJndW1lbnQgYCQxJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdKV0pZG5sCisgIG00X2lmKFskMl0sIFtdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskMl0sIFttYW5kYXRvcnldLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskMl0sIFtvcHRpb25hbF0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD1mYWxzZV0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgYCQyJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdKV0pZG5sCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgYWNfc3VjY2Vzcz1ubworICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgYnkgZGVmYXVsdCwKKyAgYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTEsCisgIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgW2F4X2N2X2N4eF9jb21waWxlX2N4eDExPXllc10sCisgICAgW2F4X2N2X2N4eF9jb21waWxlX2N4eDExPW5vXSldKQorICBpZiB0ZXN0IHgkYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTEgPSB4eWVzOyB0aGVuCisgICAgYWNfc3VjY2Vzcz15ZXMKKyAgZmkKKworICBtNF9pZihbJDFdLCBbbm9leHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1nbnUrKzExOyBkbworICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCisgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorCisgIG00X2lmKFskMV0sIFtleHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKysxMTsgZG8KKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKyAgQUNfTEFOR19QT1AoW0MrK10pCisgIGlmIHRlc3QgeCRheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZCA9IHh0cnVlOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIEEgY29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBDKysxMSBsYW5ndWFnZSBmZWF0dXJlcyBpcyByZXF1aXJlZC5dKQorICAgIGZpCisgIGVsc2UKKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgSEFWRV9DWFgxMT0wCisgICAgICBBQ19NU0dfTk9USUNFKFtObyBjb21waWxlciB3aXRoIEMrKzExIHN1cHBvcnQgd2FzIGZvdW5kXSkKKyAgICBlbHNlCisgICAgICBIQVZFX0NYWDExPTEKKyAgICAgIEFDX0RFRklORShIQVZFX0NYWDExLDEsCisgICAgICAgICAgICAgICAgW2RlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgYmFzaWMgQysrMTEgc3ludGF4XSkKKyAgICBmaQorCisgICAgQUNfU1VCU1QoSEFWRV9DWFgxMSkKKyAgZmkKK10pCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNCBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFiNDUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CkBAIC0wLDAgKzEsMTIxIEBACitkbmwgQHN5bm9wc2lzIEFYX0pBVkFDX0FORF9KQVZBCitkbmwgQHN5bm9wc2lzIEFYX0NIRUNLX0pBVkFfQ0xBU1MoQ0xBU1NOQU1FKQorZG5sCitkbmwgVGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgSkRLLCBhbmQgKG9wdGlvbmFsbHkpIHNwZWNpZmljIGNsYXNzZXMuCitkbmwKK2RubCBJZiAiSkFWQSIgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoYXQgd2lsbCBiZSB0aGUgb25seQorZG5sIGphdmEgY29tbWFuZCB0ZXN0ZWQuICBPdGhlcndpc2UsIGEgaGFyZC1jb2RlZCBsaXN0IHdpbGwgYmUgdXNlZC4KK2RubCBTaW1pbGFybHkgZm9yICJKQVZBQyIuCitkbmwKK2RubCBBWF9KQVZBQ19BTkRfSkFWQSBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0ZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKK2RubCBKYXZhIHZlcnNpb24sIHRlc3RpbmcgZm9yIG9ubHkgb25lIG9mICJqYXZhIiBhbmQgImphdmFjIiwgb3IKK2RubCBjb21waWxpbmcgb3IgcnVubmluZyB1c2VyLXByb3ZpZGVkIEphdmEgY29kZS4KK2RubAorZG5sIEFmdGVyIEFYX0pBVkFDX0FORF9KQVZBIHJ1bnMsIHRoZSBzaGVsbCB2YXJpYWJsZXMgInN1Y2Nlc3MiIGFuZAorZG5sICJheF9qYXZhY19hbmRfamF2YSIgYXJlIHNldCB0byAieWVzIiBvciAibm8iLCBhbmQgIkpBVkFDIiBhbmQKK2RubCAiSkFWQSIgYXJlIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZHMuCitkbmwKK2RubCBBWF9DSEVDS19KQVZBX0NMQVNTIG11c3QgYmUgcnVuIGFmdGVyIEFYX0pBVkFDX0FORF9KQVZBLgorZG5sIEl0IHRlc3RzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBjbGFzcyBiYXNlZCBvbiBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorZG5sIEl0IHNldHMgdGhlIHNoZWxsIHZhcmlhYmxlICJzdWNjZXNzIiB0byAieWVzIiBvciAibm8iLgorZG5sCitkbmwgQGNhdGVnb3J5IEphdmEKK2RubCBAdmVyc2lvbiAyMDA5LTAyLTA5CitkbmwgQGxpY2Vuc2UgQWxsUGVybWlzc2l2ZQorZG5sCitkbmwgQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIFJlaXNzCitkbmwgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2RubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKK2RubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKworQUNfREVGVU4oW0FYX0pBVkFDX0FORF9KQVZBXSwKKyAgICAgICAgIFsKKworICAgICAgICAgIGRubCBIYXJkLWNvZGVkIGRlZmF1bHQgY29tbWFuZHMgdG8gdGVzdC4KKyAgICAgICAgICBKQVZBQ19QUk9HUz0iamF2YWMsamlrZXMsZ2NqIC1DIgorICAgICAgICAgIEpBVkFfUFJPR1M9ImphdmEsa2FmZmUiCisKKyAgICAgICAgICBkbmwgQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZS4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkSkFWQUMiIDsgdGhlbgorICAgICAgICAgICAgSkFWQUNfUFJPR1M9IiRKQVZBQyIKKyAgICAgICAgICBmaQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRKQVZBIiA7IHRoZW4KKyAgICAgICAgICAgIEpBVkFfUFJPR1M9IiRKQVZBIgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGphdmFjIGFuZCBqYXZhKQorCisgICAgICAgICAgZWNobyAicHVibGljIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc0A8OkBAOj5AKSB7IH0gfSIgPiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEKKyAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgb0lGUz0iJElGUyIKKworICAgICAgICAgIElGUz0iLCIKKyAgICAgICAgICBmb3IgSkFWQUMgaW4gJEpBVkFDX1BST0dTIDsgZG8KKyAgICAgICAgICAgIElGUz0iJG9JRlMiCisKKyAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgIGlmICRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorCisgICAgICAgICAgICAgIElGUz0iLCIKKyAgICAgICAgICAgICAgZm9yIEpBVkEgaW4gJEpBVkFfUFJPR1MgOyBkbworICAgICAgICAgICAgICAgIElGUz0iJG9JRlMiCisKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgICAgICAgaWYgJEpBVkEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgICAgICAgICAgYnJlYWsgMgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgZG9uZQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuY2xhc3MKKworICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiAhPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBKQVZBQz0iIgorICAgICAgICAgICAgSkFWQT0iIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBheF9qYXZhY19hbmRfamF2YT0iJHN1Y2Nlc3MiCisKKyAgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19KQVZBX0NMQVNTXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEphdmEgY2xhc3MgWyQxXSkKKworICAgICAgICAgIGVjaG8gImltcG9ydCAkMTsgcHVibGljIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc0A8OkBAOj5AKSB7IH0gfSIgPiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEKKworICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICBpZiAkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgICAgc3VjY2Vzcz15ZXMKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgc3VjY2Vzcz1ubworICAgICAgICAgIGZpCisKKyAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5jbGFzcworICAgICAgICAgIF0pCisKKworQUNfREVGVU4oW0FYX0NIRUNLX0FOVF9WRVJTSU9OXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGFudCB2ZXJzaW9uID4gJDIpCisgICAgICAgICAgQU5UX1ZBTElEPWBleHByICQoJDEgLXZlcnNpb24gMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvLip2ZXJzaW9uIFwoQDw6QDAtOVwuQDo+QCpcKS4qL1wxL3AnKSBcPj0gJDJgCisgICAgICAgICAgaWYgdGVzdCAieCRBTlRfVkFMSUQiID0gIngxIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBBTlQ9IiIKKyAgICAgICAgICBmaQorICAgICAgICAgIF0pCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGUzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00CkBAIC0wLDAgKzEsMjggQEAKK2RubCBAc3lub3BzaXMgQVhfVEhSSUZUX0dFTihTSE9SVF9MQU5HVUFHRSwgTE9OR19MQU5HVUFHRSwgREVGQVVMVCkKK2RubCBAc3lub3BzaXMgQVhfVEhSSUZUX0xJQihTSE9SVF9MQU5HVUFHRSwgTE9OR19MQU5HVUFHRSwgREVGQVVMVCkKK2RubAorZG5sIEFsbG93IGEgcGFydGljdWxhciBsYW5ndWFnZSBnZW5lcmF0b3IgdG8gYmUgZGlzYWJsZWQuCitkbmwgQWxsb3cgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGxpYnJhcnkgdG8gYmUgZGlzYWJsZWQuCitkbmwKK2RubCBUaGVzZSBtYWNyb3MgaGF2ZSBwb29yIGVycm9yIGhhbmRsaW5nIGFuZCBhcmUgcG9vcmx5IGRvY3VtZW50ZWQuCitkbmwgVGhleSBhcmUgaW50ZW5kZWQgb25seSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIuCitkbmwKK2RubCBAdmVyc2lvbiAyMDA4LTAyLTIwCitkbmwgQGxpY2Vuc2UgQWxsUGVybWlzc2l2ZQorZG5sCitkbmwgQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIFJlaXNzCitkbmwgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2RubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKK2RubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKK0FDX0RFRlVOKFtBWF9USFJJRlRfTElCXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBBQ19BUkdfV0lUSCgkMSwKKyAgICAgICAgICAgICAgICAgICAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLSQxXSwgW2J1aWxkIHRoZSAkMiBsaWJyYXJ5IEA8OkBkZWZhdWx0PSQzQDo+QF0pLAorICAgICAgICAgICAgICAgICAgICAgIFt3aXRoXyQxPSIkd2l0aHZhbCJdLAorICAgICAgICAgICAgICAgICAgICAgIFt3aXRoXyQxPSQzXQorICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICBoYXZlXyQxPW5vCisgICAgICAgICAgZG5sIFdoYXQgd2UgZG8gaGVyZSBpcyBnb2luZyB0byB2YXJ5IGZyb20gbGlicmFyeSB0byBsaWJyYXJ5LAorICAgICAgICAgIGRubCBzbyB3ZSBjYW4ndCByZWFsbHkgZ2VuZXJhbGl6ZSAoeWV0ISkuCisgICAgICAgICBdKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMgYi9jb250cmliL2ZiMzAzL2NvbmZpZ3VyZS5hYwppbmRleCA2N2NjMTEwLi43M2IzNWJhIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NvbmZpZ3VyZS5hYworKysgYi9jb250cmliL2ZiMzAzL2NvbmZpZ3VyZS5hYwpAQCAtNzEsMTMgKzcxLDU3IEBACiAjIEV4YW1wbGU6IHNldHMgJCh0aHJpZnRfaG9tZSkgdmFyaWFibGUgd2l0aCBkZWZhdWx0IHBhdGggc2V0IHRvIC91c3IvbG9jYWwuCiBGQl9XSVRIX1BBVEgoW3RocmlmdF9ob21lXSwgW3RocmlmdHBhdGhdLCBbL3Vzci9sb2NhbF0pCiAKLSMgUmVxdWlyZSBib29zdCAxLjMzLjEgb3IgbGF0ZXIKLUFYX0JPT1NUX0JBU0UoWzEuMzMuMV0pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSkKK0FYX1RIUklGVF9MSUIoY3BwLCBbQysrXSwgeWVzKQoraGF2ZV9jcHA9bm8KK2lmIHRlc3QgIiR3aXRoX2NwcCIgPSAieWVzIjsgdGhlbgorICAjIFJlcXVpcmUgYm9vc3QgMS40MC4wIG9yIGxhdGVyCisgIEFYX0JPT1NUX0JBU0UoWzEuNDAuMF0pCisgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiA9ICJ4eWVzIjsgdGhlbgorICAgIGhhdmVfY3BwPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfQ1BQXSwgW3Rlc3QgIiRoYXZlX2NwcCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoamF2YSwgW0phdmFdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9qYXZhIiA9ICJ5ZXMiOyB0aGVuCisgIEFYX0pBVkFDX0FORF9KQVZBCisgIEFDX1BBVEhfUFJPRyhbQU5UXSwgW2FudF0pCisgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKKyAgQUNfU1VCU1QoQ0xBU1NQQVRIKQorICBBQ19TVUJTVChBTlRfRkxBR1MpCisgIGlmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KKyAgICBoYXZlX2phdmE9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0pBVkEsIFt0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihwaHAsIFtQSFBdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9waHAiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtQSFBdLCBbcGhwXSkKKyAgaWYgdGVzdCAieCRQSFAiICE9ICJ4IiAmJiB0ZXN0ICJ4JFBIUCIgIT0gIng6IiA7IHRoZW4KKyAgICBoYXZlX3BocD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUEhQLCBbdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7IHRoZW4KKyAgQU1fUEFUSF9QWVRIT04oMi40LCwgOikKKyAgaWYgdGVzdCAieCRQWVRIT04iICE9ICJ4IiAmJiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIng6IiA7IHRoZW4KKyAgICBoYXZlX3B5dGhvbj0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUFlUSE9OLCBbdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiXSkKIAogIyBHZW5lcmF0ZXMgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5hbS4gTW9kaWZ5IHdoZW4gbmV3IHN1YmRpcnMgYXJlIGFkZGVkLgogIyBDaGFuZ2UgTWFrZWZpbGUuYW0gYWxzbyB0byBhZGQgc3ViZGlyZWN0bHkuCiBBQ19DT05GSUdfRklMRVMoTWFrZWZpbGUgY3BwL01ha2VmaWxlIHB5L01ha2VmaWxlKQogCisjIENoZWNrIGZvciBoZWFkZXJzCitBQ19DSEVDS19IRUFERVJTKFtpbnR0eXBlcy5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRE8gTk9UIFRPVUNILgogCkBAIC04OCw2ICsxMzIsMTEgQEAKICMjIyMjIyMjIyBGSU5JU0ggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGVjaG8gIkVYVEVSTkFMX1BBVEggJEVYVEVSTkFMX1BBVEgiCitlY2hvCitlY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgorZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgorZWNobyAiQnVpbGRpbmcgUEhQIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcGhwIgogCiAKICMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCmluZGV4IDgwMDMzNDAuLjNjNTY5NzUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcApAQCAtOTgsNyArOTgsNyBAQAogICAvLyB3YW50IG91ciByZWFkL3dyaXRlIHN0cnVjdHVyZSB0byBnbyBvdmVyIHRoZSB3aXJlCiAgIGNvdW50ZXJzXy5hY3F1aXJlUmVhZCgpOwogICBmb3IoUmVhZFdyaXRlQ291bnRlck1hcDo6aXRlcmF0b3IgaXQgPSBjb3VudGVyc18uYmVnaW4oKTsKLSAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgaXQrKykKKyAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgKytpdCkKICAgewogICAgIF9yZXR1cm5baXQtPmZpcnN0XSA9IGl0LT5zZWNvbmQudmFsdWU7CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKaW5kZXggZmQxNjllNi4uZGFhNTI0NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKQEAgLTIyLDggKzIyLDkgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rU2VydmljZS5oIgogCi0jaW5jbHVkZSAic2VydmVyL1RTZXJ2ZXIuaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogCiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN0cmluZz4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL01ha2VmaWxlLmFtIGIvY29udHJpYi9mYjMwMy9jcHAvTWFrZWZpbGUuYW0KaW5kZXggMTc1NzljMS4uNzQ4ZDMyOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvTWFrZWZpbGUuYW0KKysrIGIvY29udHJpYi9mYjMwMy9jcHAvTWFrZWZpbGUuYW0KQEAgLTY4LDcgKzY4LDcgQEAKIAogIyBTZXQgdXAgVGhyaWZ0IHNwZWNpZmljIGFjdGl2aXR5IGhlcmUuCiAjIFdlIGFzc3VtZSB0aGF0IGEgPG5hbWU+K3R5cGVzLmNwcCB3aWxsIGFsd2F5cyBiZSBidWlsdCBmcm9tIDxuYW1lPi50aHJpZnQuCi0kKGV2YWwgJChjYWxsIHRocmlmdF90ZW1wbGF0ZSwuLC4uL2lmL2ZiMzAzLnRocmlmdCwtSSAkKHRocmlmdF9ob21lKS9zaGFyZSAgLS1nZW4gY3BwICkpCiskKGV2YWwgJChjYWxsIHRocmlmdF90ZW1wbGF0ZSwuLC4uL2lmL2ZiMzAzLnRocmlmdCwtSSAkKHRocmlmdF9ob21lKS9zaGFyZSAgLS1nZW4gY3BwOnB1cmVfZW51bXMgKSkKIAogaW5jbHVkZV9mYjMwM2RpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0L2ZiMzAzCiBpbmNsdWRlX2ZiMzAzX0hFQURFUlMgPSBGYWNlYm9va0Jhc2UuaCBTZXJ2aWNlVHJhY2tlci5oIGdlbi1jcHAvRmFjZWJvb2tTZXJ2aWNlLmggZ2VuLWNwcC9mYjMwM19jb25zdGFudHMuaCBnZW4tY3BwL2ZiMzAzX3R5cGVzLmgKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAppbmRleCBjMjBhMDY4Li43YTYxYjIxIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlICJGYWNlYm9va0Jhc2UuaCIKICNpbmNsdWRlICJTZXJ2aWNlVHJhY2tlci5oIgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGZhY2Vib29rOjpmYjMwMzsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICB1aW50NjRfdCBjb3VudDsKICAgZm9yIChpdGVyID0gY2hlY2twb2ludFNlcnZpY2VEdXJhdGlvbl8uYmVnaW4oKTsKICAgICAgICBpdGVyICE9IGNoZWNrcG9pbnRTZXJ2aWNlRHVyYXRpb25fLmVuZCgpOwotICAgICAgIGl0ZXIrKykgeworICAgICAgICsraXRlcikgewogICAgIGNvdW50ID0gaXRlci0+c2Vjb25kLmZpcnN0OwogICAgIGhhbmRsZXJfLT5zZXRDb3VudGVyKHN0cmluZygiY2hlY2twb2ludF9jb3VudF8iKSArIGl0ZXItPmZpcnN0LCBjb3VudCk7CiAgICAgaWYgKGNvdW50ID09IDApIHsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmggYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5oCmluZGV4IDkzMDQzODYuLjlhM2VkZDggMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmgKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaApAQCAtMTAwLDcgKzEwMCw3IEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvTXV0ZXguaCIKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIAogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CmluZGV4IDY2YzgzMTUuLjg5YmQ2ZWIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisrKyBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgamF2YSBjb20uZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBjcHAgZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBwZXJsIEZhY2Vib29rLkZCMzAzCituYW1lc3BhY2UgbmV0Y29yZSBGYWNlYm9vay5GQjMwMy5UZXN0CiAKIC8qKgogICogQ29tbW9uIHN0YXR1cyByZXBvcnRpbmcgbWVjaGFuaXNtIGFjcm9zcyBhbGwgc2VydmljZXMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9GYWNlYm9va0Jhc2UuamF2YSBiL2NvbnRyaWIvZmIzMDMvamF2YS9GYWNlYm9va0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3OGNjOC4uMDAwMDAwMAotLS0gYS9jb250cmliL2ZiMzAzL2phdmEvRmFjZWJvb2tCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5mYWNlYm9vay5mYjMwMzsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZhY2Vib29rQmFzZSBpbXBsZW1lbnRzIEZhY2Vib29rU2VydmljZS5JZmFjZSB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZV87Ci0KLSAgcHJpdmF0ZSBsb25nIGFsaXZlXzsKLQotICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZyxMb25nPiBjb3VudGVyc18gPQotICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIExvbmc+KCk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBvcHRpb25zXyA9Ci0gICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gIHByb3RlY3RlZCBGYWNlYm9va0Jhc2UoU3RyaW5nIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gICAgYWxpdmVfID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3RhdHVzKCk7Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNEZXRhaWxzKCkgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRlbGV0ZUNvdW50ZXIoU3RyaW5nIGtleSkgewotICAgIGNvdW50ZXJzXy5yZW1vdmUoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0Q291bnRlcihTdHJpbmcga2V5KSB7Ci0gICAgY291bnRlcnNfLnB1dChrZXksIDBMKTsKLSAgfQotCi0gIHB1YmxpYyBsb25nIGluY3JlbWVudENvdW50ZXIoU3RyaW5nIGtleSkgewotICAgIGxvbmcgdmFsID0gZ2V0Q291bnRlcihrZXkpICsgMTsKLSAgICBjb3VudGVyc18ucHV0KGtleSwgdmFsKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLSAgcHVibGljIEFic3RyYWN0TWFwPFN0cmluZyxMb25nPiBnZXRDb3VudGVycygpIHsKLSAgICByZXR1cm4gY291bnRlcnNfOwotICB9Ci0KLSAgcHVibGljIGxvbmcgZ2V0Q291bnRlcihTdHJpbmcga2V5KSB7Ci0gICAgTG9uZyB2YWwgPSBjb3VudGVyc18uZ2V0KGtleSk7Ci0gICAgaWYgKHZhbCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbC5sb25nVmFsdWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICBvcHRpb25zXy5wdXQoa2V5LCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbihTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIG9wdGlvbnNfLmdldChrZXkpOwotICB9Ci0KLSAgcHVibGljIEFic3RyYWN0TWFwPFN0cmluZyxTdHJpbmc+IGdldE9wdGlvbnMoKSB7Ci0gICAgcmV0dXJuIG9wdGlvbnNfOwotICB9Ci0KLSAgcHVibGljIGxvbmcgYWxpdmVTaW5jZSgpIHsKLSAgICByZXR1cm4gYWxpdmVfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDcHVQcm9maWxlKCkgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZSgpIHt9Ci0KLSAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7fQotCi19CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbCBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKaW5kZXggNGFkMzBlNS4uN2ExYjhmMSAxMDA3NTUKLS0tIGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCkBAIC0xLDMgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CiA8IS0tCiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC03LDcgKzgsNyBAQAogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTE1LDcwICsxNiwxODQgQEAKICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0ibGliZmIzMDMiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4uIj4KKyAtLT4KKzxwcm9qZWN0IG5hbWU9ImxpYmZiMzAzIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KIAogICA8IS0tIHByb2plY3Qgd2lkZSBzZXR0aW5ncy4gQWxsIGRpcmVjdG9yaWVzIHJlbGF0aXZlIHRvIGJhc2VkaXIgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iamF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0iaWYuZGlyIiB2YWx1ZT0iaWYiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9ob21lIiB2YWx1ZT0iL3Vzci9sb2NhbCIvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLy4uLyIvPgorICA8cHJvcGVydHkgbmFtZT0iZmIzMDMuYXJ0aWZhY3RpZCIgdmFsdWU9ImxpYmZiMzAzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcmZhY2UuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9pZiIvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCi0gIDwhLS0gdGVtcCBidWlsZCBkaXJlY3RvcmllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7c3JjLmRpcn0vYnVpbGQiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KKworICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgorCisgIDxjb25kaXRpb24gcHJvcGVydHk9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufSI+CisgICAgPGlzc2V0IHByb3BlcnR5PSJyZWxlYXNlIi8+CisgIDwvY29uZGl0aW9uPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2ZiMzAzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KKworICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgdmFsdWU9IiR7YmFzZWRpcn0vZ2VuLWphdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vbGliIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CiAKLSAgPCEtLSBmaW5hbCBkaXN0cmlidXRpb24gZGlyZWN0b3JpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9Ii91c3IvbG9jYWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QubGliLmRpciIgdmFsdWU9IiR7ZGlzdC5kaXJ9L2xpYiIvPgorICA8cHJvcGVydHkgbmFtZT0iZmIzMDMuamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLnBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmYjMwMy5maW5hbC5uYW1lfS5wb20iLz4KIAotICA8IS0tIG1ha2UgdGVtcG9yYXJ5IGFuZCBkaXN0cmlidXRpb24gZGlyZWN0b3JpZXMgLS0+Ci0gIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KKyAgICA8dHN0YW1wLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGliLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5saWIuZGlyfSIvPgogICA8L3RhcmdldD4KIAogICA8IS0tIGdlbmVyYXRlIGZiMzAzIHRocmlmdCBjb2RlIC0tPgotICA8dGFyZ2V0IG5hbWU9InRocmlmdGJ1aWxkIj4KLSAgICA8ZWNobz5nZW5lcmF0aW5nIHRocmlmdCBmYjMwMyBmaWxlczwvZWNobz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdF9ob21lfS9iaW4vdGhyaWZ0IiAgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhIC1vICR7c3JjLmRpcn0gJHtzcmMuZGlyfS8uLi9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDxlY2hvIG1lc3NhZ2U9ImdlbmVyYXRpbmcgdGhyaWZ0IGZiMzAzIGZpbGVzIi8+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnRfY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgLW8gJHtiYXNlZGlyfSAke2ludGVyZmFjZS5kaXJ9L2ZiMzAzLnRocmlmdCIvPgogICAgIDwvZXhlYz4KLSAgICA8bW92ZSB0b2Rpcj0iJHtzcmMuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0vZ2VuLWphdmEvY29tL2ZhY2Vib29rL2ZiMzAzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9tb3ZlPgogICA8L3RhcmdldD4KIAogICA8IS0tIGNvbXBpbGUgdGhlIGJhc2UgYW5kIHRocmlmdCBnZW5lcmF0ZWQgY29kZSBhbmQgamFyIHRoZW0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0icHJlcGFyZSx0aHJpZnRidWlsZCI+Ci0gICAgPGVjaG8+QnVpbGRpbmcgbGliZmIzMDMuamFyIC4uLi4gPC9lY2hvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ib24iPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImluaXQsZ2VuZXJhdGUiPgorICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7ZmIzMDMuZmluYWwubmFtZX0uamFyIi8+CisgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RocmlmdF9ob21lfS9saWIvbGlidGhyaWZ0LmphciIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgICAgIDwvZmlsZXNldD4KICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXZhIi8+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIke2J1aWxkLmRpcn0vZ2VuLWphdmEvY29tL2ZhY2Vib29rL2ZiMzAzIi8+CisgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgorICAgICAgPHNyYyBwYXRoPSIke2dlbn0iLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgogICAgIDwvamF2YWM+Ci0gICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmxpYi5kaXJ9L2xpYmZiMzAzLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iPgorICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZmIzMDMuZmluYWwubmFtZX0uamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSI+CiAgICAgPC9qYXI+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gY29weSB0aGUgYnVpbGQgamFyIHRvIHRoZSBkaXN0cmlidXRpb24gbGlicmFyeSBkaXJlY3RvcnkgLS0+CiAgIDx0YXJnZXQgbmFtZT0iaW5zdGFsbCIgZGVwZW5kcz0iZGlzdCI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5saWIuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSJsaWJmYjMwMy5qYXIiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLnBhdGh9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSIke2ZiMzAzLmZpbmFsLm5hbWV9LmphciIvPgogICAgIDwvY29weT4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgPGVjaG8+Q2xlYW5pbmcgb2xkIHN0dWZmIC4uLi4gPC9lY2hvPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3Nlcy9jb20iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9L2xpYiIvPgogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgICA8ZWNobyBtZXNzYWdlPSIke212bi5hbnQudGFzay5qYXJ9Ii8+CisgICAgPCEtLSBEb3dubG9hZCBtdm4gYW50IHRhc2tzLCBkb3dubG9hZCBkZXBlbmRlbmNpZXMsIGFuZCBzZXR1cCBwb20gZmlsZSAtLT4KKyAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgorCisgICAgPCEtLSByZW1vdGUgcmVwb3NpdG9yaWVzIHVzZWQgdG8gZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gLS0+CisgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImNlbnRyYWwiIHVybD0iJHttdm4ucmVwb30iLz4KKyAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+CisKKyAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgorICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKKyAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgorICAgICAgYXJ0aWZhY3RJZD0iJHtmYjMwMy5hcnRpZmFjdGlkfSIKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCisgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCisgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCisgICAgICBwYWNrYWdpbmc9ImphciIKKyAgICA+CisgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgorICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgorICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+CisgICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICB1cmw9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0IgorICAgIC8+CisgICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgorICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImRyZWlzcyIgbmFtZT0iRGF2aWQgUmVpc3MiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkaXR5YSIgbmFtZT0iQWRpdHlhIEFnYXJ3YWwiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Im1hcmNrIiBuYW1lPSJNYXJjIEt3aWF0a293c2tpIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqd2FuZyIgbmFtZT0iSmFtZXMgV2FuZyIvPgorICAgICAgPGRldmVsb3BlciBpZD0iY3Bpcm8iIG5hbWU9IkNocmlzIFBpcm8iLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImJtYXVyZXIiIG5hbWU9IkJlbiBNYXVyZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImtjbGFyayIgbmFtZT0iS2V2aW4gQ2xhcmsiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Impha2UiIG5hbWU9Ikpha2UgTHVjaWFuaSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iYnJ5YW5kdXhidXJ5IiBuYW1lPSJCcnlhbiBEdXhidXJ5Ii8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJlc3RldmUiIG5hbWU9IkVzdGV2ZSBGZXJuYW5kZXoiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9InRvZGQiIG5hbWU9IlRvZGQgTGlwY29uIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJnZWVjaG9yYW1hIiBuYW1lPSJBbmRyZXcgTWNHZWFjaGllIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgorICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZW5zZyIgbmFtZT0iSmVucyBHZXllciIvPgorICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KKworICAgICAgPCEtLSBUaHJpZnQgZGVwZW5kZW5jaWVzIGxpc3QgLS0+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLnRocmlmdCIgYXJ0aWZhY3RJZD0ibGlidGhyaWZ0IiB2ZXJzaW9uPSIke3ZlcnNpb259Ii8+CisgICAgPC9hcnRpZmFjdDpwb20+CisKKyAgICA8IS0tIEdlbmVyYXRlIHRoZSBwb20gZmlsZSAtLT4KKyAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBvbSIgZmlsZT0iJHtmYjMwMy5wb20ueG1sfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9InNpZ25BbmREZXBsb3kiPgorICAgIDwhLS0gU2lnbiBhbmQgZGVwbG95IGphcnMgdG8gYXBhY2hlIHJlcG8gLS0+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc2lmaWVyIiBkZWZhdWx0PSIiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2luZyIgZGVmYXVsdD0iamFyIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb20iIGRlZmF1bHQ9IiIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGFydGlmYWN0Om12biBmb3JrPSJ0cnVlIj4KKyAgICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWdwZy1wbHVnaW46MS4xOnNpZ24tYW5kLWRlcGxveS1maWxlIi8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcmVwb3NpdG9yeUlkPSR7bWF2ZW4tcmVwb3NpdG9yeS1pZH0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLUR1cmw9JHttYXZlbi1yZXBvc2l0b3J5LXVybH0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURwb21GaWxlPUB7cG9tfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9QHtmaWxlfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRGNsYXNzaWZpZXI9QHtjbGFzc2lmaWVyfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHBhY2thZ2luZz1Ae3BhY2thZ2luZ30iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLVBncGciLz4KKyAgICAgIDwvYXJ0aWZhY3Q6bXZuPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2giIGRlcGVuZHM9ImNsZWFuLGRpc3QiPgorICAgIDwhLS0gQ29tcGlsZSwgcGFja2FnZXMgYW5kIHRoZW4gc2VuZCByZWxlYXNlIHRvIGFwYWNoZSBtYXZlbiByZXBvIC0tPgorICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoLS0+CisgICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtmYjMwMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2ZiMzAzLnBvbS54bWx9Ii8+CisgICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtmYjMwMy5qYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtmYjMwMy5wb20ueG1sfSIvPgogICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9zcmMvRmFjZWJvb2tCYXNlLmphdmEgYi9jb250cmliL2ZiMzAzL2phdmEvc3JjL0ZhY2Vib29rQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjI2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvc3JjL0ZhY2Vib29rQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmZhY2Vib29rLmZiMzAzOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmFjZWJvb2tCYXNlIGltcGxlbWVudHMgRmFjZWJvb2tTZXJ2aWNlLklmYWNlIHsKKworICBwcml2YXRlIFN0cmluZyBuYW1lXzsKKworICBwcml2YXRlIGxvbmcgYWxpdmVfOworCisgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLExvbmc+IGNvdW50ZXJzXyA9CisgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKKworICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZyxTdHJpbmc+IG9wdGlvbnNfID0KKyAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgcHJvdGVjdGVkIEZhY2Vib29rQmFzZShTdHJpbmcgbmFtZSkgeworICAgIG5hbWVfID0gbmFtZTsKKyAgICBhbGl2ZV8gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDA7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWVfOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IGZiX3N0YXR1cyBnZXRTdGF0dXMoKTsKKworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0RldGFpbHMoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgcHVibGljIHZvaWQgZGVsZXRlQ291bnRlcihTdHJpbmcga2V5KSB7CisgICAgY291bnRlcnNfLnJlbW92ZShrZXkpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXRDb3VudGVyKFN0cmluZyBrZXkpIHsKKyAgICBjb3VudGVyc18ucHV0KGtleSwgMEwpOworICB9CisKKyAgcHVibGljIGxvbmcgaW5jcmVtZW50Q291bnRlcihTdHJpbmcga2V5KSB7CisgICAgbG9uZyB2YWwgPSBnZXRDb3VudGVyKGtleSkgKyAxOworICAgIGNvdW50ZXJzXy5wdXQoa2V5LCB2YWwpOworICAgIHJldHVybiB2YWw7CisgIH0KKworICBwdWJsaWMgbG9uZyBpbmNyZW1lbnRDb3VudGVyKFN0cmluZyBrZXksIGxvbmcgaW5jcmVtZW50KSB7CisgICAgbG9uZyB2YWwgPSBnZXRDb3VudGVyKGtleSkgKyBpbmNyZW1lbnQ7CisgICAgY291bnRlcnNfLnB1dChrZXksIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIHB1YmxpYyBsb25nIHNldENvdW50ZXIoU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgeworICAgIGNvdW50ZXJzXy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIEFic3RyYWN0TWFwPFN0cmluZyxMb25nPiBnZXRDb3VudGVycygpIHsKKyAgICByZXR1cm4gY291bnRlcnNfOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0Q291bnRlcihTdHJpbmcga2V5KSB7CisgICAgTG9uZyB2YWwgPSBjb3VudGVyc18uZ2V0KGtleSk7CisgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHZhbC5sb25nVmFsdWUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE9wdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICBvcHRpb25zXy5wdXQoa2V5LCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbihTdHJpbmcga2V5KSB7CisgICAgcmV0dXJuIG9wdGlvbnNfLmdldChrZXkpOworICB9CisKKyAgcHVibGljIEFic3RyYWN0TWFwPFN0cmluZyxTdHJpbmc+IGdldE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIG9wdGlvbnNfOworICB9CisKKyAgcHVibGljIGxvbmcgYWxpdmVTaW5jZSgpIHsKKyAgICByZXR1cm4gYWxpdmVfOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRDcHVQcm9maWxlKCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZSgpIHt9CisKKyAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7fQorCit9CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CmluZGV4IDY4NWZmMjAuLjA3ZGIxMGMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CkBAIC0yNCw1OSArMjQsNjAgQEAKIGltcG9ydCB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkCiBmcm9tIHR0eXBlcyBpbXBvcnQgZmJfc3RhdHVzCiAKKwogY2xhc3MgRmFjZWJvb2tCYXNlKEZhY2Vib29rU2VydmljZS5JZmFjZSk6CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQotICAgIHNlbGYuY291bnRlcnMgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICBzZWxmLmNvdW50ZXJzID0ge30KIAotICBkZWYgZ2V0TmFtZShzZWxmLCApOgotICAgIHJldHVybiBzZWxmLm5hbWUKKyAgICBkZWYgZ2V0TmFtZShzZWxmLCApOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAKLSAgZGVmIGdldFZlcnNpb24oc2VsZiwgKToKLSAgICByZXR1cm4gJycKKyAgICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgorICAgICAgICByZXR1cm4gJycKIAotICBkZWYgZ2V0U3RhdHVzKHNlbGYsICk6Ci0gICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQorICAgIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKKyAgICAgICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQogCi0gIGRlZiBnZXRDb3VudGVycyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5jb3VudGVycworICAgIGRlZiBnZXRDb3VudGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnMKIAotICBkZWYgcmVzZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gMAorICAgIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gMAogCi0gIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgaWYgc2VsZi5jb3VudGVycy5oYXNfa2V5KGtleSk6Ci0gICAgICByZXR1cm4gc2VsZi5jb3VudGVyc1trZXldCi0gICAgcmV0dXJuIDAKKyAgICBkZWYgZ2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KKyAgICAgICAgcmV0dXJuIDAKIAotICBkZWYgaW5jcmVtZW50Q291bnRlcihzZWxmLCBrZXkpOgotICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQorICAgIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQogCi0gIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgcGFzcworICAgIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldE9wdGlvbihzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGdldE9wdGlvbnMoc2VsZik6Ci0gICAgcmV0dXJuIHt9CisgICAgZGVmIGdldE9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiB7fQogCi0gIGRlZiBhbGl2ZVNpbmNlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmFsaXZlCisgICAgZGVmIGFsaXZlU2luY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFsaXZlCiAKLSAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgotICAgIHJldHVybiAiIgorICAgIGRlZiBnZXRDcHVQcm9maWxlKHNlbGYsIGR1cmF0aW9uKToKKyAgICAgICAgcmV0dXJuICIiCiAKLSAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgotICAgIHJldHVybiB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkLlNlcnZpY2UoKQorICAgIGRlZiBnZXRMaW1pdGVkUmVmbGVjdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCiAKLSAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBzaHV0ZG93bihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKaW5kZXggNGY4Y2U5OS4uNWM4ZjQwOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDcgKzE5LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIG9zCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKQEAgLTMxLDExICszMywxMiBAQAogZnJvbSBmYjMwMyBpbXBvcnQgKgogZnJvbSBmYjMwMy50dHlwZXMgaW1wb3J0ICoKIAorCiBkZWYgc2VydmljZV9jdHJsKAotICAgICAgICAgICAgICAgICBjb21tYW5kLAotICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICB0cmFuc19mYWN0b3J5ID0gTm9uZSwKLSAgICAgICAgICAgICAgICAgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CisgICAgICAgIGNvbW1hbmQsCisgICAgICAgIHBvcnQsCisgICAgICAgIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgICIiIgogICAgIHNlcnZpY2VfY3RybCBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBzdGFuZGFyZCBmYjMwMyBmdW5jdGlvbnMKIApAQCAtNTUsNjYgKzU4LDU5IEBACiAgICAgICAgICAgICBtc2cgPSBmYl9zdGF0dXNfc3RyaW5nKHN0YXR1cykKICAgICAgICAgICAgIGlmIChsZW4oc3RhdHVzX2RldGFpbHMpKToKICAgICAgICAgICAgICAgICBtc2cgKz0gIiAtICVzIiAlIHN0YXR1c19kZXRhaWxzCi0gICAgICAgICAgICBwcmludCBtc2cKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUpOgotICAgICAgICAgICAgICAgIHJldHVybiAyCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICBwcmludChtc2cpCisgICAgICAgICAgICByZXR1cm4gMiBpZiBzdGF0dXMgPT0gZmJfc3RhdHVzLkFMSVZFIGVsc2UgMwogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiRmFpbGVkIHRvIGdldCBzdGF0dXMiCisgICAgICAgICAgICBwcmludCgiRmFpbGVkIHRvIGdldCBzdGF0dXMiKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgc2NhbGFyIGNvbW1hbmRzCi0gICAgaWYgY29tbWFuZCBpbiBbInZlcnNpb24iLCJhbGl2ZSIsIm5hbWUiXToKKyAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsICJhbGl2ZSIsICJuYW1lIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKLSAgICAgICAgICAgIHByaW50IHJlc3VsdAorICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCisgICAgICAgICAgICBwcmludChyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCAiLGNvbW1hbmQKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0ICIsIGNvbW1hbmQpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBjb3VudGVycwogICAgIGlmIGNvbW1hbmQgaW4gWyJjb3VudGVycyJdOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb3VudGVycyA9IGZiMzAzX3dyYXBwZXIoJ2NvdW50ZXJzJywgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICBmb3IgY291bnRlciBpbiBjb3VudGVyczoKLSAgICAgICAgICAgICAgICBwcmludCAiJXM6ICVkIiAlIChjb3VudGVyLCBjb3VudGVyc1tjb3VudGVyXSkKKyAgICAgICAgICAgICAgICBwcmludCgiJXM6ICVkIiAlIChjb3VudGVyLmVuY29kZSgndXRmLTgnKSwgY291bnRlcnNbY291bnRlcl0pKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byBnZXQgY291bnRlcnMiCisgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIGdldCBjb3VudGVycyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCi0KICAgICAjIE9ubHkgcm9vdCBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcwogICAgIGlmIG9zLmdldHVpZCgpID09IDA6CiAgICAgICAgICMgYXN5bmMgY29tbWFuZHMKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXSA6CisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byB0ZWxsIHRoZSBzZXJ2aWNlIHRvICIsIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZCkKICAgICAgICAgICAgICAgICByZXR1cm4gMwogICAgIGVsc2U6Ci0gICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgICAgICBwcmludCAicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iCisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICAgICAgcHJpbnQoInJvb3QgcHJpdmlsZWdlcyBhcmUgcmVxdWlyZWQgdG8gc3RvcCBvciByZWxvYWQgdGhlIHNlcnZpY2UuIikKICAgICAgICAgICAgIHJldHVybiA0CiAKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIKLSAgICBmb3IgY29tbWFuZCBpbiBbImNvdW50ZXJzIiwibmFtZSIsInZlcnNpb24iLCJhbGl2ZSIsInN0YXR1cyJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IgotICAgIGZvciBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiKQorICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCAibmFtZSIsICJ2ZXJzaW9uIiwgImFsaXZlIiwgInN0YXR1cyJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorICAgIHByaW50KCJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZXJzIHdpdGggcm9vdCBwcml2aWxlZ2VzOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorCisgICAgcmV0dXJuIDAKIAogCi0KLSAgICByZXR1cm4gMDsKLQotCi1kZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5ID0gTm9uZSwgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CitkZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5PU5vbmUsIHByb3RfZmFjdG9yeT1Ob25lKToKICAgICBzb2NrID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCBwb3J0KQogCiAgICAgIyB1c2UgaW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkgaWYgcHJvdmlkZWQKQEAgLTE3OSwxMSArMTc1LDExIEBACiAKICAgICAjIHBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLSAgICBjb21tYW5kcz1bInN0b3AiLCJjb3VudGVycyIsInN0YXR1cyIsInJlbG9hZCIsInZlcnNpb24iLCJuYW1lIiwiYWxpdmUiXQorICAgIGNvbW1hbmRzID0gWyJzdG9wIiwgImNvdW50ZXJzIiwgInN0YXR1cyIsICJyZWxvYWQiLCAidmVyc2lvbiIsICJuYW1lIiwgImFsaXZlIl0KIAogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYyIsICItLWNvbW1hbmQiLCBkZXN0PSJjb21tYW5kIiwgaGVscD0iZXhlY3V0ZSB0aGlzIEFQSSIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1jb21tYW5kcywgZGVmYXVsdD0ic3RhdHVzIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCItLXBvcnQiLGRlc3Q9InBvcnQiLGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcG9ydCIsIGRlc3Q9InBvcnQiLCBoZWxwPSJ0aGUgc2VydmljZSdzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9OTA4MikKIAogICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CmluZGV4IGEyOWY5NjQuLmQyN2MyOTYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQpAQCAtMSwzICsxLDUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTcsNyArOSw3IEBACiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0xNywxMSArMTksMzAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitpbXBvcnQgc3lzCit0cnk6CisgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCitleGNlcHQ6CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbiwgQ29tbWFuZAogCi1zZXR1cChuYW1lPSdmYjMwMycsCi0gICAgICB2ZXJzaW9uPScxLjAnLAotICAgICAgcGFja2FnZXM9WydmYjMwMycsICdmYjMwM19zY3JpcHRzJ10sCitzZXR1cChuYW1lPSd0aHJpZnRfZmIzMDMnLAorICAgICAgdmVyc2lvbj0nMS4wLjAnLAorICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgRkIzMDMnLAorICAgICAgYXV0aG9yPVsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10sCisgICAgICBhdXRob3JfZW1haWw9WydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKKyAgICAgIHVybD0naHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKKyAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCisgICAgICBwYWNrYWdlcz1bCisgICAgICAgICAgJ2ZiMzAzJywKKyAgICAgICAgICAnZmIzMDNfc2NyaXB0cycsCisgICAgICBdLAorICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJywKKyAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCisgICAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJworICAgICAgXSwKICAgICAgICkKLQotCmRpZmYgLS1naXQgYS9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2ggYi9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2VkNWQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaApAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vc2gKK3NldCAtZQorCisuL2NvbmZpZ3VyZSBcCisgIC0tZGlzYWJsZS1saWJzIFwKKyAgLS1idWlsZD1pNjg2LXBjLWxpbnV4LWdudSBcCisgIC0taG9zdD1pNTg2LW1pbmd3MzJtc3ZjIFwKKyAgQ0M9aTU4Ni1taW5ndzMybXN2Yy1nY2MgQ1hYPWk1ODYtbWluZ3czMm1zdmMtZysrCisKK21ha2UKKworIyBDaGVjayB0d28gbG9jYXRpb25zIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBsaWJ0b29sIDEuNS4yNiBvciAyLjIuNmIuCitpZiB0ZXN0IC1mIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlIDsgdGhlbgorICBpNTg2LW1pbmd3MzJtc3ZjLXN0cmlwIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlIC1vIC4vdGhyaWZ0LmV4ZQorZWxzZSAKKyAgaTU4Ni1taW5ndzMybXN2Yy1zdHJpcCBjb21waWxlci9jcHAvdGhyaWZ0LmV4ZSAtbyAuL3RocmlmdC5leGUKK2ZpCitlY2hvICJGaW5pc2hlZCBjb21waWxpbmcgd2l0aCByZXN1bHRpbmcgZXhlIgorbHMgLWwgLi90aHJpZnQuZXhlCmRpZmYgLS1naXQgYS9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weSBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiZTVmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weQpAQCAtMCwwICsxLDMxMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIgorVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGUgb3V0cHV0IGZyb20KK2FwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ByaW50X2luZm8oKSBtb3JlIGh1bWFuLXJlYWRhYmxlLgorCitJdCB0cmFuc2xhdGVzIGVhY2ggZXhlY3V0YWJsZSBmaWxlIG5hbWUgYW5kIGFkZHJlc3MgaW50byB0aGUgY29ycmVzcG9uZGluZworc291cmNlIGZpbGUgbmFtZSwgbGluZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBuYW1lLiAgQnkgZGVmYXVsdCwgaXQgYWxzbworZGVtYW5nbGVzIEMrKyBzeW1ib2wgbmFtZXMuCisiIiIKKworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworCitjbGFzcyBBZGRyZXNzSW5mbyhvYmplY3QpOgorICAgICIiIgorICAgIEEgY2xhc3MgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgaW4gYW4gb2JqZWN0IGZpbGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9ial9maWxlLCBhZGRyZXNzKToKKyAgICAgICAgc2VsZi5vYmplY3RGaWxlID0gb2JqX2ZpbGUKKyAgICAgICAgc2VsZi5hZGRyZXNzID0gYWRkcmVzcworICAgICAgICBzZWxmLnNvdXJjZUZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuc291cmNlTGluZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mdW5jdGlvbiA9IE5vbmUKKworCitnX2FkZHJzX2J5X2ZpbGVuYW1lID0ge30KKworCitkZWYgZ2V0X2FkZHJlc3MoZmlsZW5hbWUsIGFkZHJlc3MpOgorICAgICIiIgorICAgIFJldHJpZXZlIGFuIEFkZHJlc3NJbmZvIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgZmlsZSBhbmQgYWRkcmVzcy4KKworICAgIEtlZXBzIGEgZ2xvYmFsIGxpc3Qgb2YgQWRkcmVzc0luZm8gb2JqZWN0cy4gIFR3byBjYWxscyB0byBnZXRfYWRkcmVzcygpCisgICAgd2l0aCB0aGUgc2FtZSBmaWxlbmFtZSBhbmQgYWRkcmVzcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgQWRkcmVzc0luZm8KKyAgICBvYmplY3QuCisgICAgIiIiCisgICAgZ2xvYmFsIGdfYWRkcnNfYnlfZmlsZW5hbWUKKyAgICB0cnk6CisgICAgICAgIGJ5X2FkZHJlc3MgPSBnX2FkZHJzX2J5X2ZpbGVuYW1lW2ZpbGVuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgYnlfYWRkcmVzcyA9IHt9CisgICAgICAgIGdfYWRkcnNfYnlfZmlsZW5hbWVbZmlsZW5hbWVdID0gYnlfYWRkcmVzcworCisgICAgdHJ5OgorICAgICAgICBhZGRyX2luZm8gPSBieV9hZGRyZXNzW2FkZHJlc3NdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBhZGRyX2luZm8gPSBBZGRyZXNzSW5mbyhmaWxlbmFtZSwgYWRkcmVzcykKKyAgICAgICAgYnlfYWRkcmVzc1thZGRyZXNzXSA9IGFkZHJfaW5mbworICAgIHJldHVybiBhZGRyX2luZm8KKworCitkZWYgdHJhbnNsYXRlX2ZpbGVfYWRkcmVzc2VzKGZpbGVuYW1lLCBhZGRyZXNzZXMsIG9wdGlvbnMpOgorICAgICIiIgorICAgIFVzZSBhZGRyMmxpbmUgdG8gbG9vayB1cCBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzZXMuCisgICAgQWxsIG9mIHRoZSBhZGRyZXNzZXMgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCisgICAgIiIiCisgICAgIyBEbyBub3RoaW5nIGlmIHdlIGNhbid0IGZpbmQgdGhlIGZpbGUKKyAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4KKworICAgIGFyZ3MgPSBbJ2FkZHIybGluZSddCisgICAgaWYgb3B0aW9ucy5wcmludEZ1bmN0aW9uczoKKyAgICAgICAgYXJncy5hcHBlbmQoJy1mJykKKyAgICBhcmdzLmV4dGVuZChbJy1lJywgZmlsZW5hbWVdKQorCisgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgZm9yIGFkZHJlc3MgaW4gYWRkcmVzc2VzOgorICAgICAgICBhc3NlcnQgYWRkcmVzcy5vYmplY3RGaWxlID09IGZpbGVuYW1lCisgICAgICAgIHByb2Muc3RkaW4ud3JpdGUoYWRkcmVzcy5hZGRyZXNzICsgJ1xuJykKKworICAgICAgICBpZiBvcHRpb25zLnByaW50RnVuY3Rpb25zOgorICAgICAgICAgICAgZnVuY3Rpb24gPSBwcm9jLnN0ZG91dC5yZWFkbGluZSgpCisgICAgICAgICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBmdW5jdGlvbjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3VuZXhwZWN0ZWQgRU9GIGZyb20gYWRkcjJsaW5lJykKKyAgICAgICAgICAgIGFkZHJlc3MuZnVuY3Rpb24gPSBmdW5jdGlvbgorCisgICAgICAgIGZpbGVfYW5kX2xpbmUgPSBwcm9jLnN0ZG91dC5yZWFkbGluZSgpCisgICAgICAgIGZpbGVfYW5kX2xpbmUgPSBmaWxlX2FuZF9saW5lLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IGZpbGVfYW5kX2xpbmU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3VuZXhwZWN0ZWQgRU9GIGZyb20gYWRkcjJsaW5lJykKKyAgICAgICAgaWR4ID0gZmlsZV9hbmRfbGluZS5yZmluZCgnOicpCisgICAgICAgIGlmIGlkeCA8IDA6CisgICAgICAgICAgICBtc2cgPSAnZXhwZWN0ZWQgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSBhZGRyMmxpbmU7IGdvdCAlcicgJSBcCisgICAgICAgICAgICAgICAgKGZpbGVfYW5kX2xpbmUsKQorICAgICAgICAgICAgbXNnICs9ICdcbmZpbGU9JXIsIGFkZHJlc3M9JXInICUgKGZpbGVuYW1lLCBhZGRyZXNzLmFkZHJlc3MpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQorCisgICAgICAgIGFkZHJlc3Muc291cmNlRmlsZSA9IGZpbGVfYW5kX2xpbmVbOmlkeF0KKyAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHggKyAxOl0KKworICAgIChyZW1haW5pbmdfb3V0LCBjbWRfZXJyKSA9IHByb2MuY29tbXVuaWNhdGUoKQorICAgIHJldGNvZGUgPSBwcm9jLndhaXQoKQorICAgIGlmIHJldGNvZGUgIT0gMDoKKyAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IocmV0Y29kZSwgYXJncykKKworCitkZWYgbG9va3VwX2FkZHJlc3NlcyhvcHRpb25zKToKKyAgICAiIiIKKyAgICBMb29rIHVwIHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIGZvciBhbGwgb2YgdGhlIGFkZHJlc3NlcyBjdXJyZW50bHkgc3RvcmVkCisgICAgaW4gdGhlIGdsb2JhbCBsaXN0IG9mIEFkZHJlc3NJbmZvIG9iamVjdHMuCisgICAgIiIiCisgICAgZ2xvYmFsIGdfYWRkcnNfYnlfZmlsZW5hbWUKKyAgICBmb3IgKGZpbGUsIGFkZHJlc3NlcykgaW4gZ19hZGRyc19ieV9maWxlbmFtZS5pdGVtcygpOgorICAgICAgICB0cmFuc2xhdGVfZmlsZV9hZGRyZXNzZXMoZmlsZSwgYWRkcmVzc2VzLnZhbHVlcygpLCBvcHRpb25zKQorCisKK2NsYXNzIEVudHJ5KG9iamVjdCk6CisgICAgIiIiCisgICAgQW4gZW50cnkgaW4gdGhlIHRocmlmdCBwcm9maWxlIG91dHB1dC4KKyAgICBDb250YWlucyBhIGhlYWRlciBsaW5lLCBhbmQgYSBiYWNrdHJhY2UuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcik6CisgICAgICAgIHNlbGYuaGVhZGVyID0gaGVhZGVyCisgICAgICAgIHNlbGYuYnQgPSBbXQorCisgICAgZGVmIGFkZEZyYW1lKHNlbGYsIGZpbGVuYW1lLCBhZGRyZXNzKToKKyAgICAgICAgIyBJZiBsaWJjIHdhcyBhYmxlIHRvIGRldGVybWluZSB0aGUgc3ltYm9scyBuYW1lcywgdGhlIGZpbGVuYW1lCisgICAgICAgICMgYXJndW1lbnQgd2lsbCBiZSBvZiB0aGUgZm9ybSA8ZmlsZW5hbWU+KDxmdW5jdGlvbj4rPG9mZnNldD4pCisgICAgICAgICMgU28sIHN0cmlwIG9mZiBhbnl0aGluZyBhZnRlciB0aGUgbGFzdCAnKCcKKyAgICAgICAgaWR4ID0gZmlsZW5hbWUucmZpbmQoJygnKQorICAgICAgICBpZiBpZHggPj0gMDoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOmlkeF0KKworICAgICAgICBhZGRyID0gZ2V0X2FkZHJlc3MoZmlsZW5hbWUsIGFkZHJlc3MpCisgICAgICAgIHNlbGYuYnQuYXBwZW5kKGFkZHIpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZiwgb3B0aW9ucyk6CisgICAgICAgIGYud3JpdGUoc2VsZi5oZWFkZXIpCisgICAgICAgIGYud3JpdGUoJ1xuJykKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIGFkZHJlc3MgaW4gc2VsZi5idDoKKyAgICAgICAgICAgIGYud3JpdGUoJyAgIyUtMmQgJXM6JXNcbicgJSAobiwgYWRkcmVzcy5zb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnNvdXJjZUxpbmUpKQorICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICBpZiBvcHRpb25zLnByaW50RnVuY3Rpb25zOgorICAgICAgICAgICAgICAgIGlmIGFkZHJlc3MuZnVuY3Rpb246CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyAgICAgICVzXG4nICUgKGFkZHJlc3MuZnVuY3Rpb24sKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCcgICAgICA/P1xuJykKKworCitkZWYgcHJvY2Vzc19maWxlKGluX2ZpbGUsIG91dF9maWxlLCBvcHRpb25zKToKKyAgICAiIiIKKyAgICBSZWFkIHRocmlmdCBwcm9maWxlIG91dHB1dCBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgZmlsZSwgYW5kIHByaW50CisgICAgcHJldHRpZXIgaW5mb3JtYXRpb24gb24gdGhlIG91dHB1dCBmaWxlLgorICAgICIiIgorICAgICMKKyAgICAjIEEgbmFpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVhZCB0aGUgaW5wdXQgbGluZSBieSBsaW5lLAorICAgICMgYW5kIGVhY2ggdGltZSB3ZSBjb21lIHRvIGEgZmlsZW5hbWUgYW5kIGFkZHJlc3MsIHBhc3MgaXQgdG8gYWRkcjJsaW5lCisgICAgIyBhbmQgcHJpbnQgdGhlIHJlc3VsdGluZyBpbmZvcm1hdGlvbi4gIFVuZm9ydHVuYXRlbHksIGFkZHIybGluZSBjYW4gYmUKKyAgICAjIHF1aXRlIHNsb3csIGVzcGVjaWFsbHkgd2l0aCBsYXJnZSBleGVjdXRhYmxlcy4KKyAgICAjCisgICAgIyBUaGlzIGFwcHJvYWNoIGlzIG11Y2ggZmFzdGVyLiAgV2UgcmVhZCBpbiBhbGwgb2YgdGhlIGlucHV0LCBzdG9yaW5nCisgICAgIyB0aGUgYWRkcmVzc2VzIGluIGVhY2ggZmlsZSB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQuICBXZSB0aGVuIGNhbGwKKyAgICAjIGFkZHIybGluZSBqdXN0IG9uY2UgZm9yIGVhY2ggZmlsZS4gIFRoaXMgaXMgbXVjaCBmYXN0ZXIgdGhhbiBjYWxsaW5nCisgICAgIyBhZGRyMmxpbmUgb25jZSBwZXIgYWRkcmVzcy4KKyAgICAjCisKKyAgICB2aXJ0X2NhbGxfcmVnZXggPSByZS5jb21waWxlKHInXlxzKlRfVklSVFVBTF9DQUxMOiAoXGQrKSBjYWxscyBvbiAoLiopOiQnKQorICAgIGdlbl9wcm90X3JlZ2V4ID0gcmUuY29tcGlsZSgKKyAgICAgICAgcideXHMqVF9HRU5FUklDX1BST1RPQ09MOiAoXGQrKSBjYWxscyB0byAoLiopIHdpdGggYSAoLiopOiQnKQorICAgIGJ0X3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccyojKFxkKylccyooLiopIFxbKDB4WzAtOUEtWmEtel0rKVxdJCcpCisKKyAgICAjIFBhcnNlIGFsbCBvZiB0aGUgaW5wdXQsIGFuZCBzdG9yZSBpdCBhcyBFbnRyeSBvYmplY3RzCisgICAgZW50cmllcyA9IFtdCisgICAgY3VycmVudF9lbnRyeSA9IE5vbmUKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBsaW5lID0gaW5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZS5zdGFydHN3aXRoKCdUaHJpZnQgdmlydHVhbCBjYWxsIGluZm86Jyk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHZpcnRfY2FsbF9tYXRjaCA9IHZpcnRfY2FsbF9yZWdleC5tYXRjaChsaW5lKQorICAgICAgICBpZiB2aXJ0X2NhbGxfbWF0Y2g6CisgICAgICAgICAgICBudW1fY2FsbHMgPSBpbnQodmlydF9jYWxsX21hdGNoLmdyb3VwKDEpKQorICAgICAgICAgICAgdHlwZV9uYW1lID0gdmlydF9jYWxsX21hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBpZiBvcHRpb25zLmN4eGZpbHQ6CisgICAgICAgICAgICAgICAgIyBUeXBlIG5hbWVzIHJlcG9ydGVkIGJ5IHR5cGVpZCgpIGFyZSBpbnRlcm5hbCBuYW1lcy4KKyAgICAgICAgICAgICAgICAjIEJ5IGRlZmF1bHQsIGMrK2ZpbHQgZG9lc24ndCBkZW1hbmdsZSBpbnRlcm5hbCB0eXBlIG5hbWVzLgorICAgICAgICAgICAgICAgICMgKFNvbWUgdmVyc2lvbnMgb2YgYysrZmlsdCBoYXZlIGEgIi10IiBvcHRpb24gdG8gZW5hYmxlIHRoaXMuCisgICAgICAgICAgICAgICAgIyBPdGhlciB2ZXJzaW9ucyBkb24ndCBoYXZlIHRoaXMgYXJndW1lbnQsIGJ1dCBkZW1hbmdsZSB0eXBlCisgICAgICAgICAgICAgICAgIyBuYW1lcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQsIGJ1dCBub3Qgb24gc3RkaW4uKQorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBvdXRwdXQgaXMgYmVpbmcgZmlsdGVyZWQgdGhyb3VnaCBjKytmaWx0LCBwcmVwZW5kCisgICAgICAgICAgICAgICAgIyAiX1oiIHRvIHRoZSB0eXBlIG5hbWUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYW4gZXh0ZXJuYWwgbmFtZS4KKyAgICAgICAgICAgICAgICB0eXBlX25hbWUgPSAnX1onICsgdHlwZV9uYW1lCisgICAgICAgICAgICBoZWFkZXIgPSAnVF9WSVJUVUFMX0NBTEw6ICVkIGNhbGxzIG9uICIlcyInICUgXAorICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZSkKKyAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGdlbl9wcm90X21hdGNoID0gZ2VuX3Byb3RfcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgaWYgZ2VuX3Byb3RfbWF0Y2g6CisgICAgICAgICAgICBudW1fY2FsbHMgPSBpbnQoZ2VuX3Byb3RfbWF0Y2guZ3JvdXAoMSkpCisgICAgICAgICAgICB0eXBlX25hbWUxID0gZ2VuX3Byb3RfbWF0Y2guZ3JvdXAoMikKKyAgICAgICAgICAgIHR5cGVfbmFtZTIgPSBnZW5fcHJvdF9tYXRjaC5ncm91cCgzKQorICAgICAgICAgICAgaWYgb3B0aW9ucy5jeHhmaWx0OgorICAgICAgICAgICAgICAgIHR5cGVfbmFtZTEgPSAnX1onICsgdHlwZV9uYW1lMQorICAgICAgICAgICAgICAgIHR5cGVfbmFtZTIgPSAnX1onICsgdHlwZV9uYW1lMgorICAgICAgICAgICAgaGVhZGVyID0gJ1RfR0VORVJJQ19QUk9UT0NPTDogJWQgY2FsbHMgdG8gIiVzIiB3aXRoIGEgIiVzIicgJSBcCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKKyAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGJ0X21hdGNoID0gYnRfcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgaWYgYnRfbWF0Y2g6CisgICAgICAgICAgICBpZiBjdXJyZW50X2VudHJ5IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdmb3VuZCBiYWNrdHJhY2UgZnJhbWUgYmVmb3JlIGVudHJ5IGhlYWRlcicpCisgICAgICAgICAgICBmcmFtZV9udW0gPSBpbnQoYnRfbWF0Y2guZ3JvdXAoMSkpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGJ0X21hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBhZGRyZXNzID0gYnRfbWF0Y2guZ3JvdXAoMykKKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnkuYWRkRnJhbWUoZmlsZW5hbWUsIGFkZHJlc3MpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndW5leHBlY3RlZCBsaW5lIGluIGlucHV0OiAlcicgJSAobGluZSwpKQorCisgICAgIyBBZGQgdGhlIGxhc3QgZW50cnkgd2Ugd2VyZSBwcm9jZXNzaW5nIHRvIHRoZSBsaXN0CisgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKKyAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKKyAgICAgICAgY3VycmVudF9lbnRyeSA9IE5vbmUKKworICAgICMgTG9vayB1cCBhbGwgb2YgdGhlIGFkZHJlc3NlcworICAgIGxvb2t1cF9hZGRyZXNzZXMob3B0aW9ucykKKworICAgICMgUHJpbnQgb3V0IHRoZSBlbnRyaWVzLCBub3cgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzIGJlZW4gdHJhbnNsYXRlZAorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBlbnRyeS53cml0ZShvdXRfZmlsZSwgb3B0aW9ucykKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoJ1xuJykKKworCitkZWYgc3RhcnRfY3BwZmlsdCgpOgorICAgIChyZWFkX3BpcGUsIHdyaXRlX3BpcGUpID0gb3MucGlwZSgpCisKKyAgICAjIEZvcmsuICBSdW4gYysrZmlsdCBpbiB0aGUgcGFyZW50IHByb2Nlc3MsCisgICAgIyBhbmQgdGhlbiBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZyBpbiB0aGUgY2hpbGQuCisgICAgcGlkID0gb3MuZm9yaygpCisgICAgaWYgcGlkID09IDA6CisgICAgICAgICMgY2hpbGQKKyAgICAgICAgb3MuZHVwMih3cml0ZV9waXBlLCBzeXMuc3Rkb3V0LmZpbGVubygpKQorICAgICAgICBvcy5jbG9zZShyZWFkX3BpcGUpCisgICAgICAgIG9zLmNsb3NlKHdyaXRlX3BpcGUpCisgICAgICAgIHJldHVybgorICAgIGVsc2U6CisgICAgICAgICMgcGFyZW50CisgICAgICAgIG9zLmR1cDIocmVhZF9waXBlLCBzeXMuc3RkaW4uZmlsZW5vKCkpCisgICAgICAgIG9zLmNsb3NlKHJlYWRfcGlwZSkKKyAgICAgICAgb3MuY2xvc2Uod3JpdGVfcGlwZSkKKworICAgICAgICBjbWQgPSBbJ2MrK2ZpbHQnXQorICAgICAgICBvcy5leGVjdnAoY21kWzBdLCBjbWQpCisKKworZGVmIG1haW4oYXJndik6CisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSclcHJvZyBbb3B0aW9uc10gWzxmaWxlPl0nKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLW5vLWZ1bmN0aW9ucycsIGhlbHA9J0RvblwndCBwcmludCBmdW5jdGlvbiBuYW1lcycsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ncHJpbnRGdW5jdGlvbnMnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVRydWUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbm8tZGVtYW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0RvblwndCBkZW1hbmdsZSBDKysgc3ltYm9sIG5hbWVzJywKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdjeHhmaWx0JywgYWN0aW9uPSdzdG9yZV9mYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgICAgbnVtX2FyZ3MgPSBsZW4oYXJncykKKyAgICBpZiBudW1fYXJncyA9PSAwOgorICAgICAgICBpbl9maWxlID0gc3lzLnN0ZGluCisgICAgZWxpZiBudW1fYXJncyA9PSAxOgorICAgICAgICBpbl9maWxlID0gb3Blbihhcmd2WzFdLCAncicpCisgICAgZWxzZToKKyAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKHN5cy5zdGRlcnIpCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICd0cmFpbGluZyBhcmd1bWVudHM6ICVzJyAlICgnICcuam9pbihhcmdzWzE6XSwpKQorICAgICAgICByZXR1cm4gMQorCisgICAgaWYgb3B0aW9ucy5jeHhmaWx0OgorICAgICAgICBzdGFydF9jcHBmaWx0KCkKKworICAgIHByb2Nlc3NfZmlsZShpbl9maWxlLCBzeXMuc3Rkb3V0LCBvcHRpb25zKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcmMgPSBtYWluKHN5cy5hcmd2KQorICAgIHN5cy5leGl0KHJjKQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxwcm9qZWN0IAorICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiAKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRocmlmdDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KKyAgPG5hbWU+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvbmFtZT4KKyAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTQuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgPHRocmlmdEV4ZWN1dGFibGU+JHt0aHJpZnQuY29tcGlsZXJ9PC90aHJpZnRFeGVjdXRhYmxlPgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMTE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjE0LjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4wLjE0PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEwLjE5PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRocmlmdC5yb290PiR7YmFzZWRpcn0vLi4vLi48L3RocmlmdC5yb290PgorICAgIDx0aHJpZnQuY29tcGlsZXI+JHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdDwvdGhyaWZ0LmNvbXBpbGVyPgorICAgIDx0aHJpZnQudGVzdC5ob21lPiR7dGhyaWZ0LnJvb3R9L3Rlc3Q8L3RocmlmdC50ZXN0LmhvbWU+CisgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5YmU5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmlvLlJhd0lucHV0U3RyZWFtRmFjYWRlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzLm5ld0hhc2hTZXQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmxpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHMuY2xlYW5EaXJlY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHMuY29weVN0cmVhbVRvRmlsZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5nZXRGaWxlczsKKworLyoqCisgKiBBYnN0cmFjdCBNb2pvIGltcGxlbWVudGF0aW9uLgorICogPHAvPgorICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQubWF2ZW4uVGhyaWZ0Q29tcGlsZU1vam99IGFuZAorICoge0BsaW5rIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuLlRocmlmdFRlc3RDb21waWxlTW9qb30gaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yCisgKiBjb21waWxpbmcgdGhlIG1haW4gb3IgdGVzdCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUaHJpZnRNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJJRlRfRklMRV9TVUZGSVggPSAiLnRocmlmdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTkNMVURFUyA9ICIqKi8qIiArIFRIUklGVF9GSUxFX1NVRkZJWDsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IE1hdmVuIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdH0iCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgdXNlZCB0byBhZGQgcmVzb3VyY2VzIHRvIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQGNvbXBvbmVudAorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlcjsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIHtAY29kZSB0aHJpZnR9IGV4ZWN1dGFibGUuIEJ5IGRlZmF1bHQgaXQgd2lsbCBzZWFyY2ggdGhlIHtAY29kZSAkUEFUSH0uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aHJpZnRFeGVjdXRhYmxlOworCisgICAgLyoqCisgICAgICogVGhpcyBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoZSB7QGNvZGUgLS1nZW59IG9wdGlvbiBvZiB0aGUge0Bjb2RlIHRocmlmdH0gcGFyYW1ldGVyLiBCeSBkZWZhdWx0CisgICAgICogaXQgd2lsbCBnZW5lcmF0ZSBKYXZhIG91dHB1dC4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIG9wdGlvbiBpcyB0byBiZSBhYmxlIHRvIGFkZCBvcHRpb25zCisgICAgICogdG8gdGhlIEphdmEgZ2VuZXJhdG9yIC0gaWYgeW91IGdlbmVyYXRlIHNvbWV0aGluZyBlbHNlLCB5b3UncmUgb24geW91ciBvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImphdmEiCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgRmlsZVtdIGFkZGl0aW9uYWxUaHJpZnRQYXRoRWxlbWVudHMgPSBuZXcgRmlsZVtde307CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB7QGNvZGUgdGhyaWZ0fSBjYW5ub3QgYWNjZXNzIGphcnMsIHRocmlmdCBmaWxlcyBpbiBkZXBlbmRlbmNpZXMgYXJlIGV4dHJhY3RlZCB0byB0aGlzIGxvY2F0aW9uCisgICAgICogYW5kIGRlbGV0ZWQgb24gZXhpdC4gVGhpcyBkaXJlY3RvcnkgaXMgYWx3YXlzIGNsZWFuZWQgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGhyaWZ0LWRlcGVuZGVuY2llcyIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGxvY2FsIG1hdmVuIHtAY29kZSByZXBvc2l0b3J5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtsb2NhbFJlcG9zaXRvcnl9IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgdG8ge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlIGhhc2hpbmcgb2YgZGVwZW5kZW50IGphciBwYXRocy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBwbHVnaW4gZXhwYW5kcyBqYXJzIG9uIHRoZSBjbGFzc3BhdGggbG9va2luZyBmb3IgZW1iZWRkZWQgLnRocmlmdCBmaWxlcy4KKyAgICAgKiBOb3JtYWxseSB0aGVzZSBwYXRocyBhcmUgaGFzaGVkIChNRDUpIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGxvbmcgZmlsZSBuYW1lcyBvbiB3aW5kb3dzLgorICAgICAqIEhvd2V2ZXIgaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8ge0Bjb2RlIGZhbHNlfSBsb25nZXIgcGF0aHMgd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRoczsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGluY2x1ZGVzID0gSW1tdXRhYmxlU2V0Lm9mKERFRkFVTFRfSU5DTFVERVMpOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gZXhjbHVkZXMgPSBJbW11dGFibGVTZXQub2YoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc3RhbGVNaWxsaXMgPSAwOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1N0YWxlbmVzcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIG1vam8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUGFyYW1ldGVycygpOworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFNvdXJjZVJvb3QgPSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisgICAgICAgIGlmICh0aHJpZnRTb3VyY2VSb290LmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRGaWxlcyA9IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3J5KHRocmlmdFNvdXJjZVJvb3QpOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IG91dHB1dEZpbGVzID0gZmluZEdlbmVyYXRlZEZpbGVzSW5EaXJlY3RvcnkoZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOworCisgICAgICAgICAgICAgICAgaWYgKHRocmlmdEZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJObyB0aHJpZnQgZmlsZXMgdG8gY29tcGlsZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrU3RhbGVuZXNzICYmICgobGFzdE1vZGlmaWVkKHRocmlmdEZpbGVzKSArIHN0YWxlTWlsbGlzKSA8IGxhc3RNb2RpZmllZChvdXRwdXRGaWxlcykpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlNraXBwaW5nIGNvbXBpbGF0aW9uIGJlY2F1c2UgdGFyZ2V0IGRpcmVjdG9yeSBuZXdlciB0aGFuIHNvdXJjZXMuIik7CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaEZpbGVzKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IGRlcml2ZWRUaHJpZnRQYXRoRWxlbWVudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VUaHJpZnRQYXRoRnJvbUphcnModGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgZ2V0RGVwZW5kZW5jeUFydGlmYWN0RmlsZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeS5ta2RpcnMoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBRdWljayBmaXggdG8gZml4IGlzc3VlcyB3aXRoIHR3byBtdm4gaW5zdGFsbHMgaW4gYSByb3cgKGllIG5vIGNsZWFuKQorICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbkRpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkpOworCisgICAgICAgICAgICAgICAgICAgIFRocmlmdCB0aHJpZnQgPSBuZXcgVGhyaWZ0LkJ1aWxkZXIodGhyaWZ0RXhlY3V0YWJsZSwgb3V0cHV0RGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudCh0aHJpZnRTb3VyY2VSb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudHMoZGVyaXZlZFRocmlmdFBhdGhFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnRzKGFzTGlzdChhZGRpdGlvbmFsVGhyaWZ0UGF0aEVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0RmlsZXModGhyaWZ0RmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleGl0U3RhdHVzID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXRTdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoInRocmlmdCBmYWlsZWQgb3V0cHV0OiAiICsgdGhyaWZ0LmdldE91dHB1dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKCJ0aHJpZnQgZmFpbGVkIGVycm9yOiAiICsgdGhyaWZ0LmdldEVycm9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0IGRpZCBub3QgZXhpdCBjbGVhbmx5LiBSZXZpZXcgb3V0cHV0IGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaEZpbGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBJTyBlcnJvciBvY2N1cnJlZCIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oInRocmlmdCBmYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29tbWFuZExpbmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aHJpZnQuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKGZvcm1hdCgiJXMgZG9lcyBub3QgZXhpc3QuIFJldmlldyB0aGUgY29uZmlndXJhdGlvbiBvciBjb25zaWRlciBkaXNhYmxpbmcgdGhlIHBsdWdpbi4iLAorICAgICAgICAgICAgICAgICAgICB0aHJpZnRTb3VyY2VSb290KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZEdlbmVyYXRlZEZpbGVzSW5EaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaXJlY3RvcnkgPT0gbnVsbCB8fCAhZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKCk7CisKKyAgICAgICAgTGlzdDxGaWxlPiBqYXZhRmlsZXNJbkRpcmVjdG9yeSA9IGdldEZpbGVzKGRpcmVjdG9yeSwgIioqLyouamF2YSIsIG51bGwpOworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihqYXZhRmlsZXNJbkRpcmVjdG9yeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZChJbW11dGFibGVTZXQ8RmlsZT4gZmlsZXMpIHsKKyAgICAgICAgbG9uZyByZXN1bHQgPSAwOworICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5sYXN0TW9kaWZpZWQoKSA+IHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycygpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByb2plY3QsICJwcm9qZWN0Iik7CisgICAgICAgIGNoZWNrTm90TnVsbChwcm9qZWN0SGVscGVyLCAicHJvamVjdEhlbHBlciIpOworICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0RXhlY3V0YWJsZSwgInRocmlmdEV4ZWN1dGFibGUiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGdlbmVyYXRvciwgImdlbmVyYXRvciIpOworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFNvdXJjZVJvb3QgPSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRTb3VyY2VSb290KTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCghdGhyaWZ0U291cmNlUm9vdC5pc0ZpbGUoKSwgInRocmlmdFNvdXJjZVJvb3QgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5Iik7CisgICAgICAgIGNoZWNrU3RhdGUoIXRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuaXNGaWxlKCksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisgICAgICAgIGNoZWNrTm90TnVsbChvdXRwdXREaXJlY3RvcnkpOworICAgICAgICBjaGVja1N0YXRlKCFvdXRwdXREaXJlY3RvcnkuaXNGaWxlKCksICJ0aGUgb3V0cHV0RGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXR0YWNoRmlsZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBGaWxlfSBmb3IgZWFjaCBkZXBlbmRlbmN5IGFydGlmYWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBIHNldCBvZiBhbGwgZGVwZW5kZW5jeSBhcnRpZmFjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbW11dGFibGVTZXQ8RmlsZT4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0RmlsZXMoKSB7CisgICAgICAgIFNldDxGaWxlPiBkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcyA9IG5ld0hhc2hTZXQoKTsKKyAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKSkgeworICAgICAgICAgICAgZGVwZW5kZW5jeUFydGlmYWN0RmlsZXMuYWRkKGFydGlmYWN0LmdldEZpbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoZGVwZW5kZW5jeUFydGlmYWN0RmlsZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gbWFrZVRocmlmdFBhdGhGcm9tSmFycyhGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90TnVsbChjbGFzc3BhdGhFbGVtZW50RmlsZXMsICJjbGFzc3BhdGhFbGVtZW50RmlsZXMiKTsKKyAgICAgICAgLy8gY2xlYW4gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gZW5zdXJlIHRoYXQgc3RhbGUgZmlsZXMgYXJlbid0IHVzZWQKKyAgICAgICAgaWYgKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGNsZWFuRGlyZWN0b3J5KHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbmV3SGFzaFNldCgpOworCisgICAgICAgIGZvciAoRmlsZSBjbGFzc3BhdGhFbGVtZW50RmlsZSA6IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykgeworICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIHVuZGVyIElBTSwgd2UgcmVjZWl2ZSBwb21zIGFzIGRlcGVuZGVudCBmaWxlcworICAgICAgICAgICAgLy8gSSBhbSBleGNsdWRpbmcgLnhtbCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgLmphciBhcyB0aGVyZSBtYXkgYmUgb3RoZXIgZXh0ZW5zaW9ucyBpbiB1c2UgKHNhciwgaGFyLCB6aXApCisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoRWxlbWVudEZpbGUuaXNGaWxlKCkgJiYgY2xhc3NwYXRoRWxlbWVudEZpbGUuY2FuUmVhZCgpICYmCisgICAgICAgICAgICAgICAgICAgICFjbGFzc3BhdGhFbGVtZW50RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkgeworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBqYXIgZmlsZS4gdGhlIGNvbnN0cnVjdG9yIHZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBKYXJGaWxlIGNsYXNzcGF0aEphcjsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhKYXIgPSBuZXcgSmFyRmlsZShjbGFzc3BhdGhFbGVtZW50RmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FzIG5vdCBhIHJlYWRhYmxlIGFydGlmYWN0IiwgY2xhc3NwYXRoRWxlbWVudEZpbGUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3B5IGVhY2ggLnRocmlmdCBmaWxlIGZvdW5kIGluIHRoZSBKQVIgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHByZXNlcnZpbmcgdGhlCisgICAgICAgICAgICAgICAgICogZGlyZWN0b3J5IHBhdGggaXQgaGFkIHJlbGF0aXZlIHRvIGl0cyBjb250YWluaW5nIEpBUi4gQWRkIHRoZSByZXN1bHRpbmcgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgKiAodW5pcXVlIGZvciBlYWNoIEpBUiBwcm9jZXNzZWQpIHRvIHRoZSBzZXQgb2YgdGhyaWZ0IGluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gdXNlIHdoZW4KKyAgICAgICAgICAgICAgICAgKiBjb21waWxpbmcuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9yIChKYXJFbnRyeSBqYXJFbnRyeSA6IGxpc3QoY2xhc3NwYXRoSmFyLmVudHJpZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphckVudHJ5TmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGphckVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJ1bmNhdGVkSmFyUGF0aCA9IHRydW5jYXRlUGF0aChjbGFzc3BhdGhKYXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0Um9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIHRydW5jYXRlZEphclBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB1bmNvbXByZXNzZWRDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodGhyaWZ0Um9vdERpcmVjdG9yeSwgamFyRW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weVN0cmVhbVRvRmlsZShuZXcgUmF3SW5wdXRTdHJlYW1GYWNhZGUoY2xhc3NwYXRoSmFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSkpLCB1bmNvbXByZXNzZWRDb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh0aHJpZnRSb290RGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZVtdIHRocmlmdEZpbGVzID0gY2xhc3NwYXRoRWxlbWVudEZpbGUubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoVEhSSUZUX0ZJTEVfU1VGRklYKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgaWYgKHRocmlmdEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKGNsYXNzcGF0aEVsZW1lbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnREaXJlY3Rvcmllcyk7CisgICAgfQorCisgICAgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja05vdE51bGwoZGlyZWN0b3J5KTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSwgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGRpcmVjdG9yeSk7CisgICAgICAgIExpc3Q8RmlsZT4gdGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSA9IGdldEZpbGVzKGRpcmVjdG9yeSwgCisgICAgICAgIAkJSm9pbmVyLm9uKCIsIikuam9pbihpbmNsdWRlcyksCisgICAgICAgIAkJSm9pbmVyLm9uKCIsIikuam9pbihleGNsdWRlcykpOworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlc0luRGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVuY2F0ZXMgdGhlIHBhdGggb2YgamFyIGZpbGVzIHNvIHRoYXQgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyUGF0aCB0aGUgZnVsbCBwYXRoIG9mIGEgamFyIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgdHJ1bmNhdGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkgb3Igcm9vdCBvZiB0aGUgZHJpdmUuCisgICAgICovCisgICAgU3RyaW5nIHRydW5jYXRlUGF0aChmaW5hbCBTdHJpbmcgamFyUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCisgICAgICAgIGlmIChoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvSGV4U3RyaW5nKE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpLmRpZ2VzdChqYXJQYXRoLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBleHBhbmQgZGVwZW5kZW50IGphciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnkuZ2V0QmFzZWRpcigpLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgaWYgKCFyZXBvc2l0b3J5LmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlcG9zaXRvcnkgKz0gIi8iOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBqYXJQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgaW50IHJlcG9zaXRvcnlJbmRleCA9IHBhdGguaW5kZXhPZihyZXBvc2l0b3J5KTsKKyAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHJlcG9zaXRvcnlJbmRleCArIHJlcG9zaXRvcnkubGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnkgbm93IHRoZSBwYXRoIHNob3VsZCBiZSBnb29kLCBidXQgZG8gYSBmaW5hbCBjaGVjayB0byBmaXggd2luZG93cyBtYWNoaW5lcy4KKyAgICAgICAgaW50IGNvbG9uSW5kZXggPSBwYXRoLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGNvbG9uSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIC8vIDIgPSA6XCBpbiBDOlwKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0NIQVJTID0gIjAxMjM0NTY3ODlhYmNkZWYiLnRvQ2hhckFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hleFN0cmluZyhieXRlW10gYnl0ZUFycmF5KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgaGV4U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoMiAqIGJ5dGVBcnJheS5sZW5ndGgpOworICAgICAgICBmb3IgKGZpbmFsIGJ5dGUgYiA6IGJ5dGVBcnJheSkgeworICAgICAgICAgICAgaGV4U3RyaW5nLmFwcGVuZChIRVhfQ0hBUlNbKGIgJiAweEYwKSA+PiA0XSkuYXBwZW5kKEhFWF9DSEFSU1tiICYgMHgwRl0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZXhTdHJpbmcudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnQuamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWE5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnQuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZGxpbmU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cy5uZXdMaW5rZWRMaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMubmV3SGFzaFNldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW52b2thYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHtAY29kZSB0aHJpZnR9CisgKiBjb21waWxlci4gVGhlIGFjdHVhbCBleGVjdXRhYmxlIGlzIGludm9rZWQgdXNpbmcgdGhlIHBsZXh1cworICoge0BsaW5rIENvbW1hbmRsaW5lfS4KKyAqIDxwLz4KKyAqIFRoaXMgY2xhc3MgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgZ2VuZXJhdGluZyBqYXZhIHNvdXJjZSBmaWxlcy4KKyAqLworZmluYWwgY2xhc3MgVGhyaWZ0IHsKKworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgR0VORVJBVEVEX0pBVkEgPSAiZ2VuLWphdmEiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhlY3V0YWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBnZW5lcmF0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0UGF0aEVsZW1lbnRzOworICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdEZpbGVzOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lciBvdXRwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyIGVycm9yOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4KKyAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yICAgICAgICAgICBUaGUgdmFsdWUgZm9yIHRoZSB7QGNvZGUgLS1nZW59IG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gdGhyaWZ0UGF0aCAgICAgICAgICBUaGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBpbXBvcnRzLgorICAgICAqIEBwYXJhbSB0aHJpZnRGaWxlcyAgICAgICAgIFRoZSB0aHJpZnQgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCisgICAgICogQHBhcmFtIGphdmFPdXRwdXREaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBqYXZhIHNvdXJjZSBmaWxlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVGhyaWZ0KFN0cmluZyBleGVjdXRhYmxlLCBTdHJpbmcgZ2VuZXJhdG9yLCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0UGF0aCwKKyAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0RmlsZXMsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeSkgeworICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBjaGVja05vdE51bGwoZXhlY3V0YWJsZSwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CisgICAgICAgIHRoaXMudGhyaWZ0UGF0aEVsZW1lbnRzID0gY2hlY2tOb3ROdWxsKHRocmlmdFBhdGgsICJ0aHJpZnRQYXRoIik7CisgICAgICAgIHRoaXMudGhyaWZ0RmlsZXMgPSBjaGVja05vdE51bGwodGhyaWZ0RmlsZXMsICJ0aHJpZnRGaWxlcyIpOworICAgICAgICB0aGlzLmphdmFPdXRwdXREaXJlY3RvcnkgPSBjaGVja05vdE51bGwoamF2YU91dHB1dERpcmVjdG9yeSwgImphdmFPdXRwdXREaXJlY3RvcnkiKTsKKyAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyKCk7CisgICAgICAgIHRoaXMub3V0cHV0ID0gbmV3IENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHRoZSB7QGNvZGUgdGhyaWZ0fSBjb21waWxlciB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQgYXQKKyAgICAgKiBjb25zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBleGl0IHN0YXR1cyBvZiB7QGNvZGUgdGhyaWZ0fS4KKyAgICAgKiBAdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBjb21waWxlKCkgdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0RmlsZSA6IHRocmlmdEZpbGVzKSB7CisgICAgICAgICAgICBDb21tYW5kbGluZSBjbCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICAgICAgY2wuc2V0RXhlY3V0YWJsZShleGVjdXRhYmxlKTsKKyAgICAgICAgICAgIGNsLmFkZEFyZ3VtZW50cyhidWlsZFRocmlmdENvbW1hbmQodGhyaWZ0RmlsZSkudG9BcnJheShuZXcgU3RyaW5nW117fSkpOworICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IENvbW1hbmRMaW5lVXRpbHMuZXhlY3V0ZUNvbW1hbmRMaW5lKGNsLCBudWxsLCBvdXRwdXQsIGVycm9yKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSAwIGhlcmUuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBiZWVuIG1hZGUgdmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgorICAgICAqCisgICAgICogQHBhcmFtIHRocmlmdEZpbGUKKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBleGVjdXRhYmxlIGZvbGxvd2VkIGJ5IGFueSBhcmd1bWVudHMuCisgICAgICovCisgICAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGJ1aWxkVGhyaWZ0Q29tbWFuZChmaW5hbCBGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNvbW1hbmQgPSBuZXdMaW5rZWRMaXN0KCk7CisgICAgICAgIC8vIGFkZCB0aGUgZXhlY3V0YWJsZQorICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0UGF0aEVsZW1lbnQgOiB0aHJpZnRQYXRoRWxlbWVudHMpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItSSIpOworICAgICAgICAgICAgY29tbWFuZC5hZGQodGhyaWZ0UGF0aEVsZW1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZC5hZGQoIi1vdXQiKTsKKyAgICAgICAgY29tbWFuZC5hZGQoamF2YU91dHB1dERpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgY29tbWFuZC5hZGQoIi0tZ2VuIik7CisgICAgICAgIGNvbW1hbmQuYWRkKGdlbmVyYXRvcik7CisgICAgICAgIGNvbW1hbmQuYWRkKHRocmlmdEZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihjb21tYW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dC5nZXRPdXRwdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvci5nZXRPdXRwdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGJ1aWxkcyB7QGxpbmsgVGhyaWZ0fSBpbnN0YW5jZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleGVjdXRhYmxlOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBTZXQ8RmlsZT4gdGhyaWZ0UGF0aEVsZW1lbnRzOworICAgICAgICBwcml2YXRlIFNldDxGaWxlPiB0aHJpZnRGaWxlczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWxkZXIuIFRoZSB0d28gcGFyYW1ldGVycyBhcmUgcHJlc2VudCBhcyB0aGV5IGFyZQorICAgICAgICAgKiByZXF1aXJlZCBmb3IgYWxsIHtAbGluayBUaHJpZnR9IGluc3RhbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4ZWN1dGFibGUgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIHtAY29kZSB0aHJpZnR9IGV4ZWN1dGFibGUuCisgICAgICAgICAqIEBwYXJhbSBqYXZhT3V0cHV0RGlyZWN0b3J5IFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIElmIGVpdGhlciBvZiB0aGUgYXJndW1lbnRzIGFyZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSB7QGNvZGUgamF2YU91dHB1dERpcmVjdG9yeX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgZGlyZWN0b3J5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGV4ZWN1dGFibGUsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeSkgeworICAgICAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gY2hlY2tOb3ROdWxsKGV4ZWN1dGFibGUsICJleGVjdXRhYmxlIik7CisgICAgICAgICAgICB0aGlzLmphdmFPdXRwdXREaXJlY3RvcnkgPSBjaGVja05vdE51bGwoamF2YU91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KGphdmFPdXRwdXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICB0aGlzLnRocmlmdEZpbGVzID0gbmV3SGFzaFNldCgpOworICAgICAgICAgICAgdGhpcy50aHJpZnRQYXRoRWxlbWVudHMgPSBuZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIHRocmlmdCBmaWxlIHRvIGJlIGNvbXBpbGVkLiBUaHJpZnQgZmlsZXMgbXVzdCBiZSBvbiB0aGUgdGhyaWZ0cGF0aAorICAgICAgICAgKiBhbmQgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIGEgdGhyaWZ0IGZpbGUgaXMgYWRkZWQgd2l0aG91dCBmaXJzdCBhZGRpbmcgYQorICAgICAgICAgKiBwYXJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0aHJpZnRwYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGhyaWZ0RmlsZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBhIHRocmlmdCBmaWxlIGlzIGFkZGVkIHdpdGhvdXQgZmlyc3QKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaW5nIGEgcGFyZW50IGRpcmVjdG9yeSB0byB0aGUgdGhyaWZ0cGF0aC4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgSWYge0Bjb2RlIHRocmlmdEZpbGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdEZpbGUoRmlsZSB0aHJpZnRGaWxlKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdEZpbGUuaXNGaWxlKCkpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aHJpZnRGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnRocmlmdCIpKTsKKyAgICAgICAgICAgIGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoKHRocmlmdEZpbGUpOworICAgICAgICAgICAgdGhyaWZ0RmlsZXMuYWRkKHRocmlmdEZpbGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUgb3B0aW9uIHN0cmluZyBmb3IgdGhlIFRocmlmdCBleGVjdXRhYmxlJ3Mge0Bjb2RlIC0tZ2VufSBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBnZW5lcmF0b3IKKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlcgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIHtAY29kZSBnZW5lcmF0b3J9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEdlbmVyYXRvcihTdHJpbmcgZ2VuZXJhdG9yKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGgoRmlsZSB0aHJpZnRGaWxlKSB7CisgICAgICAgICAgICBhc3NlcnQgdGhyaWZ0RmlsZS5pc0ZpbGUoKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGhIZWxwZXIodGhyaWZ0RmlsZS5nZXRQYXJlbnRGaWxlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aEhlbHBlcihGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICAgICAgYXNzZXJ0IGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpOworICAgICAgICAgICAgaWYgKHRocmlmdFBhdGhFbGVtZW50cy5jb250YWlucyhkaXJlY3RvcnkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgcGFyZW50RGlyZWN0b3J5ID0gZGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHBhcmVudERpcmVjdG9yeSA9PSBudWxsKSA/IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoSGVscGVyKHBhcmVudERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSAjYWRkVGhyaWZ0RmlsZShGaWxlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0RmlsZXMoSXRlcmFibGU8RmlsZT4gdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSB0aHJpZnRGaWxlIDogdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgICAgICBhZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUge0Bjb2RlIHRocmlmdFBhdGhFbGVtZW50fSB0byB0aGUgdGhyaWZ0UGF0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocmlmdFBhdGhFbGVtZW50IEEgZGlyZWN0b3J5IHRvIGJlIHNlYXJjaGVkIGZvciBpbXBvcnRlZCB0aHJpZnQgbWVzc2FnZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGRlZmluaXRpb25zLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBJZiB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYge0Bjb2RlIHRocmlmdFBhdGhFbGVtZW50fSBpcyBub3QgYQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRQYXRoRWxlbWVudChGaWxlIHRocmlmdFBhdGhFbGVtZW50KSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aHJpZnRQYXRoRWxlbWVudC5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIHRocmlmdFBhdGhFbGVtZW50cy5hZGQodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSAjYWRkVGhyaWZ0UGF0aEVsZW1lbnQoRmlsZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdFBhdGhFbGVtZW50cyhJdGVyYWJsZTxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHMpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSB0aHJpZnRQYXRoRWxlbWVudCA6IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgICAgIGFkZFRocmlmdFBhdGhFbGVtZW50KHRocmlmdFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gQSBjb25maWd1cmVkIHtAbGluayBUaHJpZnR9IGluc3RhbmNlLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBubyB0aHJpZnQgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRocmlmdCBidWlsZCgpIHsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoIXRocmlmdEZpbGVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRocmlmdChleGVjdXRhYmxlLCBnZW5lcmF0b3IsIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0UGF0aEVsZW1lbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlcyksIGphdmFPdXRwdXREaXJlY3RvcnkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdENvbXBpbGVNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNzU3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdENvbXBpbGVNb2pvLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCisvKioKKyAqIFRoaXMgbW9qbyBleGVjdXRlcyB0aGUge0Bjb2RlIHRocmlmdH0gY29tcGlsZXIgZm9yIGdlbmVyYXRpbmcgamF2YSBzb3VyY2VzCisgKiBmcm9tIHRocmlmdCBkZWZpbml0aW9ucy4gSXQgYWxzbyBzZWFyY2hlcyBkZXBlbmRlbmN5IGFydGlmYWN0cyBmb3IKKyAqIHRocmlmdCBmaWxlcyBhbmQgaW5jbHVkZXMgdGhlbSBpbiB0aGUgdGhyaWZ0UGF0aCBzbyB0aGF0IHRoZXkgY2FuIGJlCisgKiByZWZlcmVuY2VkLiBGaW5hbGx5LCBpdCBhZGRzIHRoZSB0aHJpZnQgZmlsZXMgdG8gdGhlIHByb2plY3QgYXMgcmVzb3VyY2VzIHNvCisgKiB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBhcnRpZmFjdC4KKyAqCisgKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcworICogQGdvYWwgY29tcGlsZQorICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyaWZ0Q29tcGlsZU1vam8gZXh0ZW5kcyBBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBzb3VyY2VzIHRvIGJlIGNvbXBpbGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2Jhc2VkaXJ9L3NyYy9tYWluL3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGhyaWZ0U291cmNlUm9vdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB7QGNvZGUgLmphdmF9IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpIHsKKyAgICAgICAgTGlzdDxBcnRpZmFjdD4gY29tcGlsZUFydGlmYWN0cyA9IHByb2plY3QuZ2V0Q29tcGlsZUFydGlmYWN0cygpOworICAgICAgICByZXR1cm4gY29tcGlsZUFydGlmYWN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdFNvdXJjZVJvb3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoRmlsZXMoKSB7CisgICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3Qob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcHJvamVjdEhlbHBlci5hZGRSZXNvdXJjZShwcm9qZWN0LCB0aHJpZnRTb3VyY2VSb290LmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAJCUltbXV0YWJsZUxpc3Qub2YoIioqLyoudGhyaWZ0IiksIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxZDk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworCisvKioKKyAqIEBwaGFzZSBnZW5lcmF0ZS10ZXN0LXNvdXJjZXMKKyAqIEBnb2FsIHRlc3RDb21waWxlCisgKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiB0ZXN0CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUaHJpZnRUZXN0Q29tcGlsZU1vam8gZXh0ZW5kcyBBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBzb3VyY2VzIHRvIGJlIGNvbXBpbGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2Jhc2VkaXJ9L3NyYy90ZXN0L3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUge0Bjb2RlIC5qYXZhfSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hGaWxlcygpIHsKKyAgICAgICAgcHJvamVjdC5hZGRUZXN0Q29tcGlsZVNvdXJjZVJvb3Qob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcHJvamVjdEhlbHBlci5hZGRUZXN0UmVzb3VyY2UocHJvamVjdCwgdGhyaWZ0VGVzdFNvdXJjZVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgIAkJSW1tdXRhYmxlTGlzdC5vZigiKiovKi50aHJpZnQiKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKSB7CisgICAgICAgIC8vIFRPRE8oZ2FrKTogbWF2ZW4tcHJvamVjdCBuZWVkcyBnZW5lcmljcworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgTGlzdDxBcnRpZmFjdD4gdGVzdEFydGlmYWN0cyA9IHByb2plY3QuZ2V0VGVzdEFydGlmYWN0cygpOworICAgICAgICByZXR1cm4gdGVzdEFydGlmYWN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdFRlc3RTb3VyY2VSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWwgbWF2ZW4gQXJ0aWZhY3RSZXBvc2l0b3J5LiBFeHBvc2VkIG9ubHkgdG8gYWxsb3cgdGVzdGluZyBvdXRzaWRlIG9mIE1hdmVuIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbFJlcG9zaXRvcnkgbG9jYWwgQXJ0aWZhY3RSZXBvc2l0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkoZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSkgeworICAgICAgICB0aGlzLmxvY2FsUmVwb3NpdG9yeSA9IGxvY2FsUmVwb3NpdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbiB0byBoYXNoIGRlcGVuZGVudCBKQVIgcGF0aHMuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGhhc2hEZXBlbmRlbnRQYXRocyB3aGV0aGVyIG9yIG5vdCB0byBoYXNoIHBhdGhzIHRvIGRlcGVuZGVudCBKQVJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzaERlcGVuZGVudFBhdGhzKGZpbmFsIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzKSB7CisgICAgICAgIHRoaXMuaGFzaERlcGVuZGVudFBhdGhzID0gaGFzaERlcGVuZGVudFBhdGhzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE3NjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworCisKK3B1YmxpYyBjbGFzcyBUZXN0QWJzdHJhY3RUaHJpZnRNb2pvIHsKKworICAgIHByaXZhdGUgVGhyaWZ0VGVzdENvbXBpbGVNb2pvIG1vam87CisgICAgcHJpdmF0ZSBGaWxlIHRlc3RSb290RGlyOworICAgIHByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5IG1hdmVuUmVwb3NpdG9yeTsKKworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgdGVzdFJvb3REaXIgPSBuZXcgRmlsZSh0bXBEaXIsICJ0aHJpZnQtdGVzdCIpOworCisgICAgICAgIC8vIHRoZSB0cnVuY2F0ZVBhdGggbWV0aG9kIGFzc3VtZXMgYSBtYXZlbiByZXBvc2l0b3J5LCBidXQgaXQgb25seSBjYXJlcyBhYm91dCB0aGUgYmFzZSBkaXIKKyAgICAgICAgbWF2ZW5SZXBvc2l0b3J5ID0gTW9ja2l0by5tb2NrKEFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcyk7CisgICAgICAgIE1vY2tpdG8ud2hlbihtYXZlblJlcG9zaXRvcnkuZ2V0QmFzZWRpcigpKS50aGVuUmV0dXJuKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIiKTsKKworICAgICAgICBtb2pvID0gbmV3IFRocmlmdFRlc3RDb21waWxlTW9qbygpOworICAgICAgICBtb2pvLnNldExvY2FsTWF2ZW5SZXBvc2l0b3J5KG1hdmVuUmVwb3NpdG9yeSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZVRocmlmdFBhdGhGcm9tSmFycygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkgPSB0ZXN0Um9vdERpcjsKKworICAgICAgICAvLyBUaGUgU2hhcmVkSWRsLmphciBmaWxlIGNvbnRhaW5zIHRoZSBzYW1lIGlkbC9zaGFyZWQudGhyaWZ0IGFuZCBpZGwvdHV0b3JpYWwudGhyaWZ0IGhpZXJhcmNoeQorICAgICAgICAvLyB1c2VkIGJ5IG90aGVyIHRlc3RzLiBJdCdzIHVzZWQgaGVyZSB0byByZXByZXNlbnQgYSBkZXBlbmRlbmN5IG9mIHRoZSBwcm9qZWN0IG1hdmVuIGlzIGJ1aWxkaW5nLAorICAgICAgICAvLyBvbmUgdGhhdCBpcyBjb250cmlidXRpbmcgLnRocmlmdCBJREwgZmlsZXMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgYXJ0aWZhY3RzLgorICAgICAgICBmaW5hbCBJdGVyYWJsZTxGaWxlPiBjbGFzc3BhdGhFbGVtZW50RmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9kZXBlbmRlbmN5LWphci10ZXN0L1NoYXJlZElkbC5qYXIiKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIFNldDxGaWxlPiB0aHJpZnREaXJlY3RvcmllcyA9IG1vam8ubWFrZVRocmlmdFBhdGhGcm9tSmFycyh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCBjbGFzc3BhdGhFbGVtZW50RmlsZXMpOworCisgICAgICAgIC8vIFRoZSByZXN1bHRzIHNob3VsZCBiZSBhIHBhdGggdG8gYSBkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIEpBUiBpdHNlbGYgKGFzc3VtaW5nIG5vIHBhdGggaGFzaGluZywKKyAgICAgICAgLy8gYnV0IHNlZSBiZWxvdyBmb3IgYSBzZXBhcmF0ZSB0ZXN0IG9mIHRoYXQpIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiBhIGhpZXJhcmNoeSBjb250YWluaW5nIHRocmlmdAorICAgICAgICAvLyBmaWxlcywgc3VpdGFibGUgZm9yIHByb3ZpZGluZyB0byB0aGUgdGhyaWZ0IGNvbXBpbGVyIGFzIGFuIGluY2x1ZGUgZGlyZWN0b3J5LiBJbiB0aGlzIGNhc2UsIHRoYXQKKyAgICAgICAgLy8gbWVhbnMgaXQgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgImlkbCIgaGllcmFyY2h5IHJhdGhlciB0aGFuIHRvIHRoZSBpZGwgZGlyZWN0b3J5CisgICAgICAgIC8vIGl0c2VsZi4KKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IGV4cGVjdGVkID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYWtlVGhyaWZ0UGF0aEZyb21KYXJzIHNob3VsZCByZXR1cm4gdGhyaWZ0IElETCBiYXNlIHBhdGggZnJvbSB3aXRoaW4gSkFSIiwgZXhwZWN0ZWQsIHRocmlmdERpcmVjdG9yaWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZVBhdGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gSkFSIHBhdGggaXMgdW5yZWxhdGVkIHRvIG1hdmVuIHJlcG8sIGFuZCBzaG91bGQgYmUgdW5jaGFuZ2VkCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisKKyAgICAgICAgLy8gSkFSIHBhdGggaXMgd2l0aGluIG1hdmVuIHJlcG8sIGFuZCBzaG91bGQgYmUgbWFkZSByZWxhdGl2ZSB0byB0aGUgcmVwbworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisKKyAgICAgICAgLy8gSkFSIHBhdGggY29udGFpbnMgZm9yd2FyZCBzbGFzaGVzIHRoYXQgc2hvdWxkIGJlIG5vcm1hbGl6ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCJcXHBhdGhcXHRvXFxzb21lamFyLmphciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZVBhdGhXaXRoRGVwZW5kZW50UGF0aEhhc2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbW9qby5zZXRIYXNoRGVwZW5kZW50UGF0aHModHJ1ZSk7CisKKyAgICAgICAgLy8gaGFzaERlcGVuZGVudFBhdGhzIHNldCB0byB0cnVlLCB0aGUgSkFSIHBhdGggaXMgaW1tZWRpYXRlbHkgaGFzaGVkIChNRDUpIGFuZCBjb252ZXJ0ZWQgdG8gYSBoZXggc3RyaW5nCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxYzg1OTUwOTg3YjIzNDkzNDYyY2YzYzI2MWQ5NTEwYSIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzOWZjMmI0YzM0Y2I2Y2IwZGEzOGJlZDVkOGI1ZmM2NyIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyNWI2OTI0ZjViMGUxOTQ4NmQwZmY4ODQ0OGU5OTlkNSIsIG1vam8udHJ1bmNhdGVQYXRoKCJcXHBhdGhcXHRvXFxzb21lamFyLmphciIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc4OTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIFRlc3RUaHJpZnQgeworCisgICAgcHJpdmF0ZSBGaWxlIHRlc3RSb290RGlyOworICAgIHByaXZhdGUgRmlsZSBpZGxEaXI7CisgICAgcHJpdmF0ZSBGaWxlIGdlbkphdmFEaXI7CisgICAgcHJpdmF0ZSBUaHJpZnQuQnVpbGRlciBidWlsZGVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgdGVzdFJvb3REaXIgPSBuZXcgRmlsZSh0bXBEaXIsICJ0aHJpZnQtdGVzdCIpOworCisgICAgICAgIGlmICh0ZXN0Um9vdERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuRGlyZWN0b3J5KHRlc3RSb290RGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGVzdDogIiArIHRlc3RSb290RGlyLmdldFBhdGgoKSwgdGVzdFJvb3REaXIubWtkaXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZURpciA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGZpbmQgdGVzdCByZXNvdXJjZXMiLCB0ZXN0Um9vdERpci5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIHRocmlmdEV4ZWN1dGFibGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRocmlmdEV4ZWN1dGFibGUiLCAidGhyaWZ0Iik7CisgICAgICAgIGlmICghKG5ldyBGaWxlKHRocmlmdEV4ZWN1dGFibGUpLmV4aXN0cygpKSkgeworICAgICAgICAgICAgdGhyaWZ0RXhlY3V0YWJsZSA9ICJ0aHJpZnQiOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyaWZ0IGNvbXBpbGVyOiAiICsgdGhyaWZ0RXhlY3V0YWJsZSk7CisKKyAgICAgICAgaWRsRGlyID0gbmV3IEZpbGUodGVzdFJlc291cmNlRGlyLCAiaWRsIik7CisgICAgICAgIGdlbkphdmFEaXIgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgVGhyaWZ0LkdFTkVSQVRFRF9KQVZBKTsKKyAgICAgICAgYnVpbGRlciA9IG5ldyBUaHJpZnQuQnVpbGRlcih0aHJpZnRFeGVjdXRhYmxlLCB0ZXN0Um9vdERpcik7CisgICAgICAgIGJ1aWxkZXIKKyAgICAgICAgICAgIC5zZXRHZW5lcmF0b3IoImphdmEiKQorICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50KGlkbERpcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdENvbXBpbGVXaXRoR2VuZXJhdG9yT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkZXIuc2V0R2VuZXJhdG9yKCJqYXZhOnByaXZhdGUtbWVtYmVycyIpOworICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpIHRocm93cyBDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSA9IG5ldyBGaWxlKGlkbERpciwgInNoYXJlZC50aHJpZnQiKTsKKworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisKKyAgICAgICAgZmluYWwgVGhyaWZ0IHRocmlmdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIG5vdCBmb3VuZDogc2hhcmVkLnRocmlmdCIsIHRocmlmdEZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHdhcyBub3QgcmVtb3ZlZCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzaGFyZWQvU2hhcmVkU2VydmljZS5qYXZhIikuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdE11bHRpcGxlRmlsZUNvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBzaGFyZWRUaHJpZnQgPSBuZXcgRmlsZShpZGxEaXIsICJzaGFyZWQudGhyaWZ0Iik7CisgICAgICAgIGZpbmFsIEZpbGUgdHV0b3JpYWxUaHJpZnQgPSBuZXcgRmlsZShpZGxEaXIsICJ0dXRvcmlhbC50aHJpZnQiKTsKKworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUoc2hhcmVkVGhyaWZ0KTsKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHR1dG9yaWFsVGhyaWZ0KTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgbm90IGZvdW5kOiBzaGFyZWQudGhyaWZ0Iiwgc2hhcmVkVGhyaWZ0LmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSBzaG91bGQgbm90IGV4aXN0IiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tcGlsZQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSB3YXMgbm90IHJlbW92ZWQiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2VuZXJhdGVkIGphdmEgY29kZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAic2hhcmVkL1NoYXJlZFNlcnZpY2UuamF2YSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2VuZXJhdGVkIGphdmEgY29kZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAidHV0b3JpYWwvSW52YWxpZE9wZXJhdGlvbi5qYXZhIikuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZENvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRGaWxlID0gbmV3IEZpbGUodGVzdFJvb3REaXIsICJtaXNzaW5nLnRocmlmdCIpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdFBhdGhFbGVtZW50KHRlc3RSb290RGlyKTsKKworICAgICAgICAvLyBIYWNraW5nIGFyb3VuZCBjaGVja3MgaW4gYWRkVGhyaWZ0IGZpbGUuCisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5kZWxldGUoKSk7CisKKyAgICAgICAgZmluYWwgVGhyaWZ0IHRocmlmdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCF0aHJpZnRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSBzaG91bGQgbm90IGV4aXN0IiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tcGlsZQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUluUGF0aFByZUNvbmRpdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdEZpbGUgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgIm1pc3NpbmcudGhyaWZ0Iik7CisKKyAgICAgICAgLy8gSGFja2luZyBhcm91bmQgY2hlY2tzIGluIGFkZFRocmlmdCBmaWxlLgorICAgICAgICBhc3NlcnRUcnVlKHRocmlmdEZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodGVzdFJvb3REaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSh0ZXN0Um9vdERpcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZGVsZXRlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRlc3Q6ICIgKyB0ZXN0Um9vdERpci5nZXRQYXRoKCksIHRlc3RSb290RGlyLmRlbGV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC9zaGFyZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NWU3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC9zaGFyZWQudGhyaWZ0CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaGlzIFRocmlmdCBmaWxlIGNhbiBiZSBpbmNsdWRlZCBieSBvdGhlciBUaHJpZnQgZmlsZXMgdGhhdCB3YW50IHRvIHNoYXJlCisgKiB0aGVzZSBkZWZpbml0aW9ucy4KKyAqLworCituYW1lc3BhY2UgY3BwIHNoYXJlZAorbmFtZXNwYWNlIGphdmEgc2hhcmVkCituYW1lc3BhY2UgcGVybCBzaGFyZWQKKworc3RydWN0IFNoYXJlZFN0cnVjdCB7CisgIDE6IGkzMiBrZXkKKyAgMjogc3RyaW5nIHZhbHVlCit9CisKK3NlcnZpY2UgU2hhcmVkU2VydmljZSB7CisgIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoMTogaTMyIGtleSkKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3R1dG9yaWFsLnRocmlmdCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3R1dG9yaWFsLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU0MzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0CkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyMgVGhyaWZ0IFR1dG9yaWFsCisjIE1hcmsgU2xlZSAobWNzbGVlQGZhY2Vib29rLmNvbSkKKyMKKyMgVGhpcyBmaWxlIGFpbXMgdG8gdGVhY2ggeW91IGhvdyB0byB1c2UgVGhyaWZ0LCBpbiBhIC50aHJpZnQgZmlsZS4gTmVhdG8uIFRoZQorIyBmaXJzdCB0aGluZyB0byBub3RpY2UgaXMgdGhhdCAudGhyaWZ0IGZpbGVzIHN1cHBvcnQgc3RhbmRhcmQgc2hlbGwgY29tbWVudHMuCisjIFRoaXMgbGV0cyB5b3UgbWFrZSB5b3VyIHRocmlmdCBmaWxlIGV4ZWN1dGFibGUgYW5kIGluY2x1ZGUgeW91ciBUaHJpZnQgYnVpbGQKKyMgc3RlcCBvbiB0aGUgdG9wIGxpbmUuIEFuZCB5b3UgY2FuIHBsYWNlIGNvbW1lbnRzIGxpa2UgdGhpcyBhbnl3aGVyZSB5b3UgbGlrZS4KKyMKKyMgQmVmb3JlIHJ1bm5pbmcgdGhpcyBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgaW5zdGFsbGVkIHRoZSB0aHJpZnQgY29tcGlsZXIKKyMgaW50byAvdXNyL2xvY2FsL2Jpbi4KKworLyoqCisgKiBUaGUgZmlyc3QgdGhpbmcgdG8ga25vdyBhYm91dCBhcmUgdHlwZXMuIFRoZSBhdmFpbGFibGUgdHlwZXMgaW4gVGhyaWZ0IGFyZToKKyAqCisgKiAgYm9vbCAgICAgICAgQm9vbGVhbiwgb25lIGJ5dGUKKyAqICBieXRlICAgICAgICBTaWduZWQgYnl0ZQorICogIGkxNiAgICAgICAgIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorICogIGkzMiAgICAgICAgIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogIGk2NCAgICAgICAgIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgorICogIGRvdWJsZSAgICAgIDY0LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorICogIHN0cmluZyAgICAgIFN0cmluZworICogIGJpbmFyeSAgICAgIEJsb2IgKGJ5dGUgYXJyYXkpCisgKiAgbWFwPHQxLHQyPiAgTWFwIGZyb20gb25lIHR5cGUgdG8gYW5vdGhlcgorICogIGxpc3Q8dDE+ICAgIE9yZGVyZWQgbGlzdCBvZiBvbmUgdHlwZQorICogIHNldDx0MT4gICAgIFNldCBvZiB1bmlxdWUgZWxlbWVudHMgb2Ygb25lIHR5cGUKKyAqCisgKiBEaWQgeW91IGFsc28gbm90aWNlIHRoYXQgVGhyaWZ0IHN1cHBvcnRzIEMgc3R5bGUgY29tbWVudHM/CisgKi8KKworLy8gSnVzdCBpbiBjYXNlIHlvdSB3ZXJlIHdvbmRlcmluZy4uLiB5ZXMuIFdlIHN1cHBvcnQgc2ltcGxlIEMgY29tbWVudHMgdG9vLgorCisvKioKKyAqIFRocmlmdCBmaWxlcyBjYW4gcmVmZXJlbmNlIG90aGVyIFRocmlmdCBmaWxlcyB0byBpbmNsdWRlIGNvbW1vbiBzdHJ1Y3QKKyAqIGFuZCBzZXJ2aWNlIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgZm91bmQgdXNpbmcgdGhlIGN1cnJlbnQgcGF0aCwgb3IgYnkKKyAqIHNlYXJjaGluZyByZWxhdGl2ZSB0byBhbnkgcGF0aHMgc3BlY2lmaWVkIHdpdGggdGhlIC1JIGNvbXBpbGVyIGZsYWcuCisgKgorICogSW5jbHVkZWQgb2JqZWN0cyBhcmUgYWNjZXNzZWQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIC50aHJpZnQgZmlsZSBhcyBhCisgKiBwcmVmaXguIGkuZS4gc2hhcmVkLlNoYXJlZE9iamVjdAorICovCitpbmNsdWRlICJzaGFyZWQudGhyaWZ0IgorCisvKioKKyAqIFRocmlmdCBmaWxlcyBjYW4gbmFtZXNwYWNlLCBwYWNrYWdlLCBvciBwcmVmaXggdGhlaXIgb3V0cHV0IGluIHZhcmlvdXMKKyAqIHRhcmdldCBsYW5ndWFnZXMuCisgKi8KK25hbWVzcGFjZSBjcHAgdHV0b3JpYWwKK25hbWVzcGFjZSBqYXZhIHR1dG9yaWFsCituYW1lc3BhY2UgcGhwIHR1dG9yaWFsCituYW1lc3BhY2UgcGVybCB0dXRvcmlhbAorbmFtZXNwYWNlIHNtYWxsdGFsay5jYXRlZ29yeSBUaHJpZnQuVHV0b3JpYWwKKworLyoqCisgKiBUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKKyAqIEMgc3R5bGUgaGVyZS4KKyAqLwordHlwZWRlZiBpMzIgTXlJbnRlZ2VyCisKKy8qKgorICogVGhyaWZ0IGFsc28gbGV0cyB5b3UgZGVmaW5lIGNvbnN0YW50cyBmb3IgdXNlIGFjcm9zcyBsYW5ndWFnZXMuIENvbXBsZXgKKyAqIHR5cGVzIGFuZCBzdHJ1Y3RzIGFyZSBzcGVjaWZpZWQgdXNpbmcgSlNPTiBub3RhdGlvbi4KKyAqLworY29uc3QgaTMyIElOVDMyQ09OU1RBTlQgPSA5ODUzCitjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gTUFQQ09OU1RBTlQgPSB7J2hlbGxvJzond29ybGQnLCAnZ29vZG5pZ2h0JzonbW9vbid9CisKKy8qKgorICogWW91IGNhbiBkZWZpbmUgZW51bXMsIHdoaWNoIGFyZSBqdXN0IDMyIGJpdCBpbnRlZ2Vycy4gVmFsdWVzIGFyZSBvcHRpb25hbAorICogYW5kIHN0YXJ0IGF0IDEgaWYgbm90IHN1cHBsaWVkLCBDIHN0eWxlIGFnYWluLgorICovCitlbnVtIE9wZXJhdGlvbiB7CisgIEFERCA9IDEsCisgIFNVQlRSQUNUID0gMiwKKyAgTVVMVElQTFkgPSAzLAorICBESVZJREUgPSA0Cit9CisKKy8qKgorICogU3RydWN0cyBhcmUgdGhlIGJhc2ljIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBjb21wcmlzZWQgb2YgZmllbGRzCisgKiB3aGljaCBlYWNoIGhhdmUgYW4gaW50ZWdlciBpZGVudGlmaWVyLCBhIHR5cGUsIGEgc3ltYm9saWMgbmFtZSwgYW5kIGFuCisgKiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgIm9wdGlvbmFsIiwgd2hpY2ggZW5zdXJlcyB0aGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkCisgKiBpbiB0aGUgc2VyaWFsaXplZCBvdXRwdXQgaWYgdGhleSBhcmVuJ3Qgc2V0LiAgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgc29tZQorICogbWFudWFsIG1hbmFnZW1lbnQgaW4gc29tZSBsYW5ndWFnZXMuCisgKi8KK3N0cnVjdCBXb3JrIHsKKyAgMTogaTMyIG51bTEgPSAwLAorICAyOiBpMzIgbnVtMiwKKyAgMzogT3BlcmF0aW9uIG9wLAorICA0OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBhbHNvIGJlIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIG5hc3R5LgorICovCitleGNlcHRpb24gSW52YWxpZE9wZXJhdGlvbiB7CisgIDE6IGkzMiB3aGF0LAorICAyOiBzdHJpbmcgd2h5Cit9CisKKy8qKgorICogQWhoLCBub3cgb250byB0aGUgY29vbCBwYXJ0LCBkZWZpbmluZyBhIHNlcnZpY2UuIFNlcnZpY2VzIGp1c3QgbmVlZCBhIG5hbWUKKyAqIGFuZCBjYW4gb3B0aW9uYWxseSBpbmhlcml0IGZyb20gYW5vdGhlciBzZXJ2aWNlIHVzaW5nIHRoZSBleHRlbmRzIGtleXdvcmQuCisgKi8KK3NlcnZpY2UgQ2FsY3VsYXRvciBleHRlbmRzIHNoYXJlZC5TaGFyZWRTZXJ2aWNlIHsKKworICAvKioKKyAgICogQSBtZXRob2QgZGVmaW5pdGlvbiBsb29rcyBsaWtlIEMgY29kZS4gSXQgaGFzIGEgcmV0dXJuIHR5cGUsIGFyZ3VtZW50cywKKyAgICogYW5kIG9wdGlvbmFsbHkgYSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCBpdCBtYXkgdGhyb3cuIE5vdGUgdGhhdCBhcmd1bWVudAorICAgKiBsaXN0cyBhbmQgZXhjZXB0aW9uIGxpc3RzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGV4YWN0IHNhbWUgc3ludGF4IGFzCisgICAqIGZpZWxkIGxpc3RzIGluIHN0cnVjdCBvciBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICAqLworCisgICB2b2lkIHBpbmcoKSwKKworICAgaTMyIGFkZCgxOmkzMiBudW0xLCAyOmkzMiBudW0yKSwKKworICAgaTMyIGNhbGN1bGF0ZSgxOmkzMiBsb2dpZCwgMjpXb3JrIHcpIHRocm93cyAoMTpJbnZhbGlkT3BlcmF0aW9uIG91Y2gpLAorCisgICAvKioKKyAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIG9uZXdheSBtb2RpZmllci4gVGhhdCBtZWFucyB0aGUgY2xpZW50IG9ubHkgbWFrZXMKKyAgICAqIGEgcmVxdWVzdCBhbmQgZG9lcyBub3QgbGlzdGVuIGZvciBhbnkgcmVzcG9uc2UgYXQgYWxsLiBPbmV3YXkgbWV0aG9kcworICAgICogbXVzdCBiZSB2b2lkLgorICAgICovCisgICBvbmV3YXkgdm9pZCB6aXAoKQorCit9CisKKy8qKgorICogVGhhdCBqdXN0IGFib3V0IGNvdmVycyB0aGUgYmFzaWNzLiBUYWtlIGEgbG9vayBpbiB0aGUgdGVzdC8gZm9sZGVyIGZvciBtb3JlCisgKiBkZXRhaWxlZCBleGFtcGxlcy4gQWZ0ZXIgeW91IHJ1biB0aGlzIGZpbGUsIHlvdXIgZ2VuZXJhdGVkIGNvZGUgc2hvd3MgdXAKKyAqIGluIGZvbGRlcnMgd2l0aCBuYW1lcyBnZW4tPGxhbmd1YWdlPi4gVGhlIGdlbmVyYXRlZCBjb2RlIGlzbid0IHRvbyBzY2FyeQorICogdG8gbG9vayBhdC4gSXQgZXZlbiBoYXMgcHJldHR5IGluZGVudGF0aW9uLgorICovCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC5lbCBiL2NvbnRyaWIvdGhyaWZ0LmVsCmluZGV4IGNkM2UwZTguLjk0MWE5OWYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LmVsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LmVsCkBAIC0xLDQgKzEsNyBAQAotOzsKKzs7OyB0aHJpZnQuZWwgLS0tIE1ham9yIG1vZGUgZm9yIEFwYWNoZSBUaHJpZnQgZmlsZXMKKworOzsgS2V5d29yZHM6IGZpbGVzCisKIDs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIDs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiA7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTcsOSArMjAsMTYgQEAKIDs7IHVuZGVyIHRoZSBMaWNlbnNlLgogOzsKIAorOzs7IENvbW1lbnRhcnk6CisKKzs7CisKKzs7OyBDb2RlOgorCiAocmVxdWlyZSAnZm9udC1sb2NrKQogCiAoZGVmdmFyIHRocmlmdC1tb2RlLWhvb2sgbmlsKQorOzs7IyMjYXV0b2xvYWQKIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICcoIlxcLnRocmlmdFxcJyIgLiB0aHJpZnQtbW9kZSkpCiAKIChkZWZ2YXIgdGhyaWZ0LWluZGVudC1sZXZlbCAyCkBAIC0yOCwxMyArMzgsMTIgQEAKIDs7IHN5bnRheCBjb2xvcmluZwogKGRlZmNvbnN0IHRocmlmdC1mb250LWxvY2sta2V5d29yZHMKICAgKGxpc3QKLSAgICcoIiMuKiQiIC4gZm9udC1sb2NrLWNvbW1lbnQtZmFjZSkgIDs7IHBlcmwgc3R5bGUgY29tbWVudHMKICAgICcoIlxcPFxcKGluY2x1ZGVcXHxzdHJ1Y3RcXHxleGNlcHRpb25cXHx0eXBlZGVmXFx8Y29uc3RcXHxlbnVtXFx8c2VydmljZVxcfGV4dGVuZHNcXHx2b2lkXFx8b25ld2F5XFx8dGhyb3dzXFx8b3B0aW9uYWxcXHxyZXF1aXJlZFxcKVxcPiIgLiBmb250LWxvY2sta2V5d29yZC1mYWNlKSAgOzsga2V5d29yZHMKICAgICcoIlxcPFxcKGJvb2xcXHxieXRlXFx8aTE2XFx8aTMyXFx8aTY0XFx8ZG91YmxlXFx8c3RyaW5nXFx8YmluYXJ5XFx8bWFwXFx8bGlzdFxcfHNldFxcKVxcPiIgLiBmb250LWxvY2stdHlwZS1mYWNlKSAgOzsgYnVpbHQtaW4gdHlwZXMKICAgICcoIlxcPFxcKFswLTldK1xcKVxcPiIgLiBmb250LWxvY2stdmFyaWFibGUtbmFtZS1mYWNlKSAgIDs7IG9yZGluYWxzCiAgICAnKCJcXDxcXChcXHcrXFwpXFxzLSooIiAoMSBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkgIDs7IGZ1bmN0aW9ucwogICAgKQotICAiVGhyaWZ0IEtleXdvcmRzIikKKyAgIlRocmlmdCBLZXl3b3Jkcy4iKQogCiA7OyBpbmRlbnRhdGlvbgogKGRlZnVuIHRocmlmdC1pbmRlbnQtbGluZSAoKQpAQCAtMTAyLDE4ICsxMTEsMjAgQEAKICAgICAgICAgICAoaW5kZW50LWxpbmUtdG8gY3VyLWluZGVudCkKICAgICAgICAgKGluZGVudC1saW5lLXRvIDApKSkpKQogCi07OyBDL0MrKyBjb21tZW50czsgYWxzbyBhbGxvd2luZyB1bmRlcnNjb3JlIGluIHdvcmRzCis7OyBDL0MrKy0gYW5kIHNoLXN0eWxlIGNvbW1lbnRzOyBhbHNvIGFsbG93aW5nIHVuZGVyc2NvcmUgaW4gd29yZHMKIChkZWZ2YXIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlCiAgIChsZXQgKCh0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUgKG1ha2Utc3ludGF4LXRhYmxlKSkpCiAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP18gInciIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LyAiLiAxNDU2IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCi0gICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyogIi4gMjMiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XG4gIj4gYiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQorICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8jICI8IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpIDsgc2gtc3R5bGUgY29tbWVudHMKKyAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LyAiLiAxMjQiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkgOyBjL2MrKy1zdHlsZSBjb21tZW50cworICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8qICIuIDIzYiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQorICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAiPiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQogICAgIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKICAgIlN5bnRheCB0YWJsZSBmb3IgdGhyaWZ0LW1vZGUiKQogCis7OzsjIyNhdXRvbG9hZAogKGRlZnVuIHRocmlmdC1tb2RlICgpCi0gICJNb2RlIGZvciBlZGl0aW5nIFRocmlmdCBmaWxlcyIKKyAgIk1vZGUgZm9yIGVkaXRpbmcgVGhyaWZ0IGZpbGVzLiIKICAgKGludGVyYWN0aXZlKQogICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQogICAoc2V0LXN5bnRheC10YWJsZSB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCkBAIC0xMjMsNCArMTM0LDcgQEAKICAgKHJ1bi1ob29rcyAndGhyaWZ0LW1vZGUtaG9vaykKICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnaW5kZW50LWxpbmUtZnVuY3Rpb24pICd0aHJpZnQtaW5kZW50LWxpbmUpCiAgICkKLShwcm92aWRlICd0aHJpZnQtbW9kZSkKKworKHByb3ZpZGUgJ3RocmlmdCkKKzs7OyB0aHJpZnQuZWwgZW5kcyBoZXJlCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMgYi9jb250cmliL3RocmlmdC5zcGVjCmluZGV4IGVjZWU2MzEuLmJlNTI2ZTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMKKysrIGIvY29udHJpYi90aHJpZnQuc3BlYwpAQCAtMTcsMzggKzE3LDM5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIFRPRE8oZHJlaXNzKTogSGF2ZSBhIFB5dGhvbiBidWlsZCB3aXRoIGFuZCB3aXRob3V0IHRoZSBleHRlbnNpb24uCislZGVmaW5lIHdpdGhvdXRfamF2YSAxCislZGVmaW5lIHdpdGhvdXRfcHl0aG9uIDEKKyVkZWZpbmUgd2l0aG91dF90ZXN0cyAxCisKICV7IT9weXRob25fc2l0ZWxpYjogJWRlZmluZSBweXRob25fc2l0ZWxpYiAlKCV7X19weXRob259IC1jICJmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliOyBwcmludCBnZXRfcHl0aG9uX2xpYigpIil9CiAleyE/cHl0aG9uX3NpdGVhcmNoOiAlZGVmaW5lIHB5dGhvbl9zaXRlYXJjaCAlKCV7X19weXRob259IC1jICJmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliOyBwcmludCBnZXRfcHl0aG9uX2xpYigxKSIpfQotIyBUT0RPKGRyZWlzcyk6IFdoZXJlIGlzIHRoaXMgc3VwcG9zZWQgdG8gZ28/Ci0leyE/dGhyaWZ0X2VybGFuZ19yb290OiAlZGVmaW5lIHRocmlmdF9lcmxhbmdfcm9vdCAvb3B0L3RocmlmdC1lcmx9CiAKIE5hbWU6ICAgICAgICAgICB0aHJpZnQKIExpY2Vuc2U6ICAgICAgICBBcGFjaGUgTGljZW5zZSB2Mi4wCiBHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQKIFN1bW1hcnk6ICAgICAgICBSUEMgYW5kIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrCi1WZXJzaW9uOiAgICAgICAgMjAwODA1Mjlzdm4KLUVwb2NoOiAgICAgICAgICAxCi1SZWxlYXNlOiAgICAgICAgMQotVVJMOiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQKLVBhY2thZ2VyOiAgICAgICBEYXZpZCBSZWlzcyA8ZHJlaXNzQGZhY2Vib29rLmNvbT4KK1ZlcnNpb246ICAgICAgICAxLjAuMAorUmVsZWFzZTogICAgICAgIDAKK1VSTDogICAgICAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK1BhY2thZ2VyOiAgICAgICBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogU291cmNlMDogICAgICAgICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKIAogQnVpbGRSZXF1aXJlczogIGdjYyA+PSAzLjQuNgogQnVpbGRSZXF1aXJlczogIGdjYy1jKysKIAotIyBUT0RPKGRyZWlzcyk6IENhbiB0aGVzZSBiZSBtb3ZlZCBpbnRvIHRoZSBpbmRpdmlkdWFsIHBhY2thZ2VzPwotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KIEJ1aWxkUmVxdWlyZXM6ICBqYXZhLWRldmVsID49IDA6MS41LjAKIEJ1aWxkUmVxdWlyZXM6ICBhbnQgPj0gMDoxLjYuNQogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogQnVpbGRSZXF1aXJlczogIHB5dGhvbi1kZXZlbAogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1CdWlsZFJlcXVpcmVzOiAgZXJsYW5nCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KKyVkZWZpbmUgZ2VtX25hbWUgJXtuYW1lfQorQnVpbGRSZXF1aXJlczogIHJ1YnktZGV2ZWwKK0J1aWxkUmVxdWlyZXM6ICBydWJ5Z2Vtcy1kZXZlbAogJWVuZGlmCiAKIEJ1aWxkUm9vdDogICAgICAle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tJXtyZWxlYXNlfS1yb290LSUoJXtfX2lkX3V9IC1uKQpAQCAtNzUsNiArNzYsNyBAQAogJWZpbGVzIGxpYi1jcHAKICVkZWZhdHRyKC0scm9vdCxyb290KQogJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvLioKKyV7X2xpYmRpcn0vbGlidGhyaWZ0Ki5zbwogCiAKICVwYWNrYWdlIGxpYi1jcHAtZGV2ZWwKQEAgLTgyLDEwICs4NCwxMCBAQAogR3JvdXA6ICAgICBMaWJyYXJpZXMKIFJlcXVpcmVzOiAgJXtuYW1lfSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQogUmVxdWlyZXM6ICBib29zdC1kZXZlbAotJWlmICV7IT93aXRob3V0X2xpYmV2ZW50OiAxfQorJWlmIDAleyE/d2l0aG91dF9saWJldmVudDoxfQogUmVxdWlyZXM6ICBsaWJldmVudC1kZXZlbCA+PSAxLjIKICVlbmRpZgotJWlmICV7IT93aXRob3V0X3psaWI6IDF9CislaWYgMCV7IT93aXRob3V0X3psaWI6MX0KIFJlcXVpcmVzOiAgemxpYi1kZXZlbAogJWVuZGlmCiAKQEAgLTk2LDExICs5OCwxMCBAQAogJWRlZmF0dHIoLSxyb290LHJvb3QpCiAle19pbmNsdWRlZGlyfS90aHJpZnQvCiAle19saWJkaXJ9L2xpYnRocmlmdCouKmEKLSV7X2xpYmRpcn0vbGlidGhyaWZ0Ki5zbwogJXtfbGliZGlyfS9wa2djb25maWcvdGhyaWZ0Ki5wYwogCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiAlcGFja2FnZSBsaWItamF2YQogU3VtbWFyeTogICBUaHJpZnQgSmF2YSBsaWJyYXJ5CiBHcm91cDogICAgIExpYnJhcmllcwpAQCAtMTE1LDcgKzExNiw3IEBACiAlZW5kaWYKIAogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KICVwYWNrYWdlIGxpYi1weXRob24KIFN1bW1hcnk6IFRocmlmdCBQeXRob24gbGlicmFyeQogR3JvdXA6ICAgTGlicmFyaWVzCkBAIC0xMjksMTggKzEzMCwzMiBAQAogJWVuZGlmCiAKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLSVwYWNrYWdlIGxpYi1lcmxhbmcKLVN1bW1hcnk6ICBUaHJpZnQgUHl0aG9uIGxpYnJhcnkKLUdyb3VwOiAgICBMaWJyYXJpZXMKLVJlcXVpcmVzOiBlcmxhbmcKKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorJXBhY2thZ2UgLW4gcnVieWdlbS0le2dlbV9uYW1lfQorU3VtbWFyeTogVGhyaWZ0IFJ1YnkgbGlicmFyeQorR3JvdXA6ICAgTGlicmFyaWVzCitPYnNvbGV0ZXM6ICV7bmFtZX0tbGliLXJ1YnkKIAotJWRlc2NyaXB0aW9uIGxpYi1lcmxhbmcKLUVybGFuZyBsaWJyYXJpZXMgZm9yIFRocmlmdC4KKyVkZXNjcmlwdGlvbiAtbiBydWJ5Z2VtLSV7Z2VtX25hbWV9CitSdWJ5IGxpYnJhcmllcyBmb3IgVGhyaWZ0LgogCi0lZmlsZXMgbGliLWVybGFuZworJWZpbGVzIC1uIHJ1YnlnZW0tJXtnZW1fbmFtZX0KICVkZWZhdHRyKC0scm9vdCxyb290KQotJXt0aHJpZnRfZXJsYW5nX3Jvb3R9Cisle2dlbV9kaXJ9LyoKKyVlbmRpZgorCisKKyVpZiAwJXshP3dpdGhvdXRfcGhwOjF9CislcGFja2FnZSBsaWItcGhwCitTdW1tYXJ5OiBUaHJpZnQgUEhQIGxpYnJhcnkKK0dyb3VwOiAgIExpYnJhcmllcworCislZGVzY3JpcHRpb24gbGliLXBocAorUEhQIGxpYnJhcmllcyBmb3IgVGhyaWZ0LgorCislZmlsZXMgbGliLXBocAorJWRlZmF0dHIoLSxyb290LHJvb3QpCisvdXNyL2xpYi9waHAvKgogJWVuZGlmCiAKIApAQCAtMTQ4LDU5ICsxNjMsODkgQEAKICVzZXR1cCAtcQogCiAlYnVpbGQKLSMgVE9ETyhkcmVpc3MpOiBJbXBsZW1lbnQgYSBzaW5nbGUgLS13aXRob3V0LWJ1aWxkLWtsdWRnZXMuCitbWyAtZSBNYWtlZmlsZS5pbiBdXSB8fCAuL2Jvb3RzdHJhcC5zaAorZXhwb3J0IEdFTV9IT01FPSR7UFdEfS8uZ2VtLWhvbWUKK2V4cG9ydCBSVUJZTElCPSR7UFdEfS9saWIvcmIvbGliCiAlY29uZmlndXJlIFwKICAgJXs/d2l0aG91dF9saWJldmVudDogLS13aXRob3V0LWxpYmV2ZW50IH0gXAogICAlez93aXRob3V0X3psaWI6ICAgICAtLXdpdGhvdXQtemxpYiAgICAgfSBcCi0gIC0td2l0aG91dC1qYXZhIFwKKyAgJXs/d2l0aG91dF90ZXN0czogICAgLS13aXRob3V0LXRlc3RzICAgIH0gXAorICAlez93aXRob3V0X2phdmE6ICAgICAtLXdpdGhvdXQtamF2YSAgICAgfSBcCisgICV7P3dpdGhvdXRfcHl0aG9uOiAgIC0td2l0aG91dC1weXRob24gICB9IFwKKyAgJXs/d2l0aG91dF9ydWJ5OiAgICAgLS13aXRob3V0LXJ1YnkgICAgIH0gXAorICAlez93aXRob3V0X3BocDogICAgICAtLXdpdGhvdXQtcGhwICAgICAgfSBcCisgICV7IT93aXRob3V0X3BocDogICAgIFBIUF9QUkVGSVg9JHtSUE1fQlVJTERfUk9PVH0vdXNyL2xpYi9waHAgfSBcCiAgIC0td2l0aG91dC1jc2hhcnAgXAotICAtLXdpdGhvdXQtcHkgXAogICAtLXdpdGhvdXQtZXJsYW5nIFwKIAotbWFrZQorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CitldmFsICQoZ3JlcCAiXldJVEhfUlVCWV9UUlVFIiBjb25maWcubG9nKQoraWYgW1sgIiR7V0lUSF9SVUJZX1RSVUV9IiAhPSAiIiBdXTsgdGhlbgorICBzZXQgK3gKKyAgZWNobyAiIgorICBlY2hvICJjb25maWd1cmUgZGV0ZXJtaW5lZCB0aGF0IHJ1YnkgcmVxdWlyZW1lbnRzIGFyZSBtaXNzaW5nIChidW5kbGVyIGdlbT8pLCBlaXRoZXIgaW5zdGFsbCBtaXNzaW5nIGNvbXBvbmVudHMiID4mMgorICBlY2hvICJvciBkaXNhYmxlIHRoZSBydWJ5IHN1Yi1wYWNrYWdlcyBhcyBmb2xsb3dzOiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIgICAgIHJwbWJ1aWxkIC1EJyV3aXRob3V0X3J1YnkgMScgLi4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIiCisgIGV4aXQgMQorZmkKKyVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KK21ha2UgJXs/X3NtcF9tZmxhZ3N9CisKKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogY2QgbGliL2phdmEKICVhbnQKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBjZCBsaWIvcHkKIENGTEFHUz0iJXtvcHRmbGFnc30iICV7X19weXRob259IHNldHVwLnB5IGJ1aWxkCiBjZCAuLi8uLgogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1jZCBsaWIvZXJsCi1tYWtlCi1jZCAuLi8uLgorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CislZ2VtX2luc3RhbGwgLW4gbGliL3JiL3RocmlmdCouZ2VtCiAlZW5kaWYKIAogJWluc3RhbGwKK2V4cG9ydCBHRU1fSE9NRT0ke1BXRH0vLmdlbS1ob21lCitleHBvcnQgUlVCWUxJQj0ke1BXRH0vbGliL3JiL2xpYgogJW1ha2VpbnN0YWxsCitsbiAtcyBsaWJ0aHJpZnQtJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0LnNvLjAKK2xuIC1zIGxpYnRocmlmdG5iLSV7dmVyc2lvbn0uc28gJHtSUE1fQlVJTERfUk9PVH0le19saWJkaXJ9L2xpYnRocmlmdG5iLnNvLjAKK2xuIC1zIGxpYnRocmlmdHotJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0ei5zby4wCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiBta2RpciAtcCAkUlBNX0JVSUxEX1JPT1Qle19qYXZhZGlyfQotY3AgLXAgbGliL2phdmEvKi5qYXIgJFJQTV9CVUlMRF9ST09UJXtfamF2YWRpcn0KK2NwIC1wIGxpYi9qYXZhL2J1aWxkLyouamFyICRSUE1fQlVJTERfUk9PVCV7X2phdmFkaXJ9CiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBjZCBsaWIvcHkKICV7X19weXRob259IHNldHVwLnB5IGluc3RhbGwgLU8xIC0tc2tpcC1idWlsZCAtLXJvb3QgJFJQTV9CVUlMRF9ST09UCiBjZCAuLi8uLgogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1ta2RpciAtcCAke1JQTV9CVUlMRF9ST09UfSV7dGhyaWZ0X2VybGFuZ19yb290fQotY3AgLXIgbGliL2VybC9lYmluICR7UlBNX0JVSUxEX1JPT1R9JXt0aHJpZnRfZXJsYW5nX3Jvb3R9CislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KK21rZGlyIC1wICV7YnVpbGRyb290fSV7Z2VtX2Rpcn0KK2NwIC1hIC4vJXtnZW1fZGlyfS8qICV7YnVpbGRyb290fSV7Z2VtX2Rpcn0vCiAlZW5kaWYKIAotCiAlY2xlYW4KIHJtIC1yZiAke1JQTV9CVUlMRF9ST09UfQogCiAKKyVwb3N0Cit1bWFzayAwMDcKKy9zYmluL2xkY29uZmlnID4gL2Rldi9udWxsIDI+JjEKKworCislcG9zdHVuCit1bWFzayAwMDcKKy9zYmluL2xkY29uZmlnID4gL2Rldi9udWxsIDI+JjEKKwogJWNoYW5nZWxvZwotKiBXZWQgTWF5IDI4IDIwMDggRGF2aWQgUmVpc3MgPGRyZWlzc0BmYWNlYm9vay5jb20+IC0gMjAwODA1Mjlzdm4KLS0gSW5pdGlhbCBidWlsZCwgYmFzZWQgb24gdGhlIHdvcmsgb2YgS2V2aW4gU21pdGggYW5kIEJlbiBNYXVyZXIuCisqIFdlZCBPY3QgMTAgMjAxMiBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IAorLSBUaHJpZnQgMC45LjAgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnZpbSBiL2NvbnRyaWIvdGhyaWZ0LnZpbQppbmRleCA3OWNlNTQ3Li42MjMxOTU1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC52aW0KKysrIGIvY29udHJpYi90aHJpZnQudmltCkBAIC01MSw4ICs1MSw4IEBACiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIG5hbWVzcGFjZQogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCB4c2RfYWxsIHhzZF9vcHRpb25hbCB4c2RfbmlsbGFibGUgeHNkX2F0dHJzCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIGluY2x1ZGUgY3BwX2luY2x1ZGUgY3BwX3R5cGUgY29uc3Qgb3B0aW9uYWwgcmVxdWlyZWQKLXN5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKLXN5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzCitzeW4ga2V5d29yZCB0aHJpZnRCYXNpY1R5cGVzIHZvaWQgYm9vbCBieXRlIGk4IGkxNiBpMzIgaTY0IGRvdWJsZSBzdHJpbmcgYmluYXJ5CitzeW4ga2V5d29yZCB0aHJpZnRTdHJ1Y3R1cmUgbWFwIGxpc3Qgc2V0IHN0cnVjdCB0eXBlZGVmIGV4Y2VwdGlvbiBlbnVtIHRocm93cyB1bmlvbgogCiAiIFNwZWNpYWwKIHN5biBtYXRjaCB0aHJpZnRTcGVjaWFsICJcZFwrOiIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0X2R1bXAuY3BwIGIvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKaW5kZXggMGRkZmNlYy4uNTljOGFjOCAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKKysrIGIvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKQEAgLTIwLDExICsyMCwxMSBAQAogI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2xUYXAuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvTWFrZWZpbGUgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllMDNiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1IEBACitUSFJJRlRfRElSID0uLi8uLgorSU5DU19ESVJTICA9LUkke1RIUklGVF9ESVJ9L2xpYi9jcHAvc3JjIC1JLgorVEhSSUZUX0xJQiA9JHtUSFJJRlRfRElSfS9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hCitCT09TVF9MSUIgID0KK0NQUF9ERUZTICAgPQorQ1BQX09QVFMgICA9LVdhbGwgLU8yCisKK0dFTl9TUkMgICAgPSBnZW4tY3BwL1NhbXBsZVNlcnZpY2UuY3BwICBcCisgICAgICAgICAgICAgZ2VuLWNwcC9TYW1wbGVfdHlwZXMuY3BwICAgXAorICAgICAgICAgICAgIGdlbi1jcHAvU2FtcGxlQ2FsbGJhY2suY3BwIFwKKyAgICAgICAgICAgICBnZW4tY3BwL1NhbXBsZV9jb25zdGFudHMuY3BwCitHRU5fSU5DICAgID0gLUlnZW4tY3BwCisKK2RlZmF1bHQ6IHNlcnZlciBjbGllbnQKKy5QSE9OWTogc2VydmVyIGNsaWVudAorCitzZXJ2ZXI6CisJZysrICR7Q1BQX09QVFN9ICR7Q1BQX0RFRlN9IC1vIHNlcnZlci9zZXJ2ZXIgJHtHRU5fSU5DfSAke0lOQ1NfRElSU30gc2VydmVyL3NlcnZlci5jcHAgJHtHRU5fU1JDfSAke1RIUklGVF9MSUJ9ICR7Qk9PU1RfTElCfQorCitjbGllbnQ6CisJZysrICR7Q1BQX09QVFN9ICR7Q1BQX0RFRlN9IC1vIGNsaWVudC9jbGllbnQgJHtHRU5fSU5DfSAke0lOQ1NfRElSU30gY2xpZW50L2NsaWVudC5jcHAgJHtHRU5fU1JDfSAke1RIUklGVF9MSUJ9ICR7Qk9PU1RfTElCfQorCitjbGVhbjoKKwkkKFJNKSAtciBjbGllbnQvY2xpZW50IHNlcnZlci9zZXJ2ZXIKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUubWQKQEAgLTAsMCArMSw2MSBAQAorVGhyaWZ0IHRyYW5zcG9ydCBzYW1wbGUgcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNyb3NzLXBsYXRmb3JtIHByb2plY3QgaGFzIGJlZW4gYnVpbHQgd2l0aCBXaW5kb3dzIFZpc3VhbCBTdHVkaW8gMTAgYW5kIAorT1NYIDEwLjcuMSdzIGcrKy4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IHNvY2tldCBhbmQgcGlwZSB0cmFuc3BvcnRzIAordGhyb3VnaCBjb21tYW5kLWxpbmUgc3dpdGNoZXMuCisKK1dpbmRvd3Mgc3VwcG9ydHMgYm90aCBuYW1lZCAmIGFub255bW91cyBwaXBlczsgKk5JWCBnZXRzIG9ubHkgbmFtZWQgCisncGlwZXMnIGF0IHRoaXMgdGltZS4KKworV2luZG93cy1vbmx5IGF0IHRoaXMgdGltZToKK1RoZSBjbGllbnQgJiBzZXJ2ZXIgYXJlIGRvdWJsZS1lbmRlZC4gQm90aCBzaWRlcyBydW4gYSBzZXJ2ZXIgYW5kIGNsaWVudCB0byAKK2VuYWJsZSBmdWxsIGR1cGxleCBiaWRpcmVjdGlvbmFsIGV2ZW50IHNpZ25hbGluZy4gVGhleSBhcmUgc2ltcGxlIGNvbW1hbmQgCitsaW5lIGFwcHMuIFRoZSBzZXJ2ZXIgcnVucyB1bnRpbCBpdCdzIGFib3J0ZWQgKEN0bC1DKS4gVGhlIGNsaWVudCBjb25uZWN0cyB0bwordGhlIHNlcnZlciwgaW5mb3JtcyB0aGUgc2VydmVyIG9mIGl0cyBsaXN0ZW5pbmcgcGlwZS9wb3J0LCBydW5zIHNvbWUgbW9yZSBSUENzIAorYW5kIGV4aXRzLiBUaGUgc2VydmVyIGFsc28gbWFrZXMgUlBDIGNhbGxzIHRvIHRoZSBjbGllbnQgdG8gZGVtb25zdHJhdGUgCitiaWRpcmVjdGlvbmFsIG9wZXJhdGlvbi4KKworUHJlcXVpc2l0ZXM6CitCb29zdCAtLSB0ZXN0ZWQgd2l0aCBCb29zdCAxLjQ3LCBvdGhlciB2ZXJzaW9ucyBtYXkgd29yay4KK2xpYnRocmlmdCBsaWJyYXJ5IC0tIGJ1aWxkIHRoZSBsaWJyYXJ5IHVuZGVyICJ0aHJpZnQvbGliL2NwcC8iCit0aHJpZnQgSURMIGNvbXBpbGVyIC0tIGRvd25sb2FkIGZyb20gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2Rvd25sb2FkLyAKKyAgIG9yIGJ1aWxkIGZyb20gInRocmlmdC9jb21waWxlci9jcHAiLiAgVGhlIElETCBjb21waWxlciB2ZXJzaW9uIHNob3VsZAorICAgbWF0Y2ggdGhlIHRocmlmdCBzb3VyY2UgZGlzdHJpYnV0aW9uJ3MgdmVyc2lvbi4gRm9yIGluc3RhbmNlLCB0aHJpZnQtMC45LjAKKyAgIGhhcyBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYW4gdGhyaWZ0LTAuOC4wIGFuZCB0aGUgZ2VuZXJhdGVkCisgICBmaWxlcyBhcmUgbm90IGNvbXBhdGlibGUuCisKK05vdGU6IEJ1bGRpbmcgdGhlIHRocmlmdCBJREwgY29tcGlsZXIgYW5kIGxpYnJhcnkgYXJlIGJleW9uZCB0aGUgc2NvcGUKK29mIHRoaXMgYXJ0aWNsZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSBUaHJpZnQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgcmVzcGVjdGl2ZQorZGlyZWN0b3JpZXMgYW5kIG9ubGluZS4KKworCitNaWNyb3NvZnQgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8gMTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHkgdGhlIElETCBjb21waWxlciAndGhyaWZ0LmV4ZScgdG8gdGhpcyBwcm9qZWN0IGZvbGRlciBvciB0byBhIGxvY2F0aW9uIGluIHRoZSBwYXRoLgorUnVuIHRocmlmdG1lLmJhdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIHNvdXJjZSBmcm9tIHRoZSB0aHJpZnQgZmlsZXMuCisKK09wZW4gdHJhbnNwb3J0LXNhbXBsZS5zbG4gYW5kLi4uCitBZGFwdCB0aGUgQm9vc3QgcGF0aHMgZm9yIHRoZSBjbGllbnQgYW5kIHNlcnZlciBwcm9qZWN0cy4gUmlnaHQtY2xpY2sgb24gZWFjaCBwcm9qZWN0LCBzZWxlY3QKK1Byb3BlcnRpZXMsIHRoZW46CitDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgLT4gQy9DKysgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMKK0NvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMKKworVGhlIHN0b2NrIHBhdGggYXNzdW1lcyB0aGF0IEJvb3N0IGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHRocmlmdCByZXBvIHJvb3QuCisKK1J1biB0aGUgZm9sbG93aW5nIGluIHNlcGFyYXRlIGNvbW1hbmQgcHJvbXB0cyBmcm9tIHRoZSBSZWxlYXNlIG9yIERlYnVnIAorYnVpbGQgZm9sZGVyOgorIHNlcnZlci5leGUgLW5wIHRlc3QKKyBjbGllbnQuZXhlIC1ucCB0ZXN0CisKKworKk5JWCBmbGF2b3JzCistLS0tLS0tLS0tLS0KK0J1aWxkIHRoZSB0aHJpZnQgY3BwIGxpYnJhcnkuCitCdWlsZCB0aGUgSURMIGNvbXBpbGVyIGFuZCBjb3B5IGl0IHRvIHRoaXMgcHJvamVjdCBmb2xkZXIuCitSdW4gdGhyaWZ0bWUuc2ggdG8gZ2VuZXJhdGUgdGhlIGludGVyZmFjZSBzb3VyY2UgZnJvbSB0aGUgdGhyaWZ0IGZpbGVzLgorUnVuICdtYWtlJworCitSdW4gdGhlIGZvbGxvd2luZyBpbiBzZXBhcmF0ZSBzaGVsbHM6Cisgc2VydmVyL3NlcnZlciAtbnAgL3RtcC90ZXN0CisgY2xpZW50L2NsaWVudCAtbnAgL3RtcC90ZXN0CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvU2FtcGxlLnRocmlmdCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDBlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvU2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDM5IEBACisvKgorIHRyYW5zcG9ydC1zYW1wbGUgdGhyaWZ0IElETCBmaWxlIC4KKyBFeGVjdXRlIHRocmlmdG1lLmJhdCB1bmRlciBXaW5kb3dzIHRvIGdlbmVyYXRlIHRoZSBjcHAgc3R1YnMgZnJvbSB0aGlzIElETC4KKyAqLworCisvLyBTZWUgdGhyaWZ0L3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBhbmQgc2hhcmVkLnRocmlmdCBmb3IgbW9yZSBleHRlbnNpdmUgZXhhbXBsZXMuCisKKworbmFtZXNwYWNlIGNwcCBTYW1wbGUKK25hbWVzcGFjZSBqYXZhIFNhbXBsZQorbmFtZXNwYWNlIHBlcmwgU2FtcGxlCisKKy8vVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhlIHNhbXBsZS4gU2hvd24gaGVyZSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzIG9ubHkuCisvLworc3RydWN0IFNhbXBsZVN0cnVjdAoreworICAxOiBpMzIga2V5CisgIDI6IHN0cmluZyB2YWx1ZQorfQorCisKKy8vQSBzZXJ2aWNlIGNvbnRhaW5zIHRoZSBSUEMocykuCisvLworc2VydmljZSBTYW1wbGVTZXJ2aWNlCit7CisgIHN0cmluZyBIZWxsb1RoZXJlKDE6c3RyaW5nIEhlbGxvU3RyaW5nKSwKKyAgdm9pZCBTZXJ2ZXJEb1NvbWV0aGluZygpLAorCisgIC8vQ2xpZW50IGNhbGxzIHRoaXMgdG8gdGVsbCBzZXJ2ZXIgd2hpY2ggcG9ydCB0byBjb25uZWN0IGJhY2sgb24uCisgIHZvaWQgQ2xpZW50U2lkZUxpc3RlblBvcnQoMTppMTYgUG9ydCksCisgIC8vTmFtZWQgcGlwZSB2ZXJzaW9uCisgIHZvaWQgQ2xpZW50U2lkZVBpcGVOYW1lKDE6c3RyaW5nIG5hbWUpLAorfQorCisvL1NhbXBsZSBSUEMgb24gdGhlICdjbGllbnQnIHNpZGUgdGhhdCB0aGUgbWFzdGVyIHNlcnZlciBjYW4gY2FsbC4KK3NlcnZpY2UgU2FtcGxlQ2FsbGJhY2sKK3sKKyAgdm9pZCBwaW5nY2xpZW50KCksCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWJmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBUaHJpZnRDb21tb24uY3BwIDogQ29tbW9uIGZ1bmN0aW9ucyBmb3Igc2FtcGxlIFRocmlmdCBjbGllbnQgYW5kIHNlcnZlcgorLy8KKworI2luY2x1ZGUgIlRocmlmdENvbW1vbi5oIgorCituYW1lc3BhY2UgdGhyaWZ0Y29tbW9uCit7CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KKwkvL1RoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlbGV2YXRpb24gb3Igb3RoZXIgCisJLy9hZHZhbmNlZCBmZWF0dXJlcy4KKwkvLworCWJvb2wgTGF1bmNoQW5vblBpcGVDaGlsZChzdGQ6OnN0cmluZyBhcHAsIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKwl7CisjaWZkZWYgX1dJTjMyCisJCVBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisJCVNUQVJUVVBJTkZPQSBzaTsKKwkJR2V0U3RhcnR1cEluZm9BKCZzaSk7ICAvL3NldCBzdGFydHVwaW5mbyBmb3IgdGhlIHNwYXduZWQgcHJvY2VzcworCQljaGFyIGhhbmRsZXNbTUFYX1BBVEhdOyAgLy9TdG9yZXMgcGlwZSBoYW5kbGVzIGNvbnZlcnRlZCB0byB0ZXh0CisKKwkJc3ByaW50ZihoYW5kbGVzLCAiJXMgJWQgJWQiLCBhcHAuY19zdHIoKSwKKwkJCShpbnQpYm9vc3Q6OnNoYXJlZF9keW5hbWljX2Nhc3Q8VFBpcGVTZXJ2ZXI+KHRyYW5zcG9ydCktPmdldENsaWVudFJkUGlwZUhhbmRsZSgpLAorCQkJKGludClib29zdDo6c2hhcmVkX2R5bmFtaWNfY2FzdDxUUGlwZVNlcnZlcj4odHJhbnNwb3J0KS0+Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpKTsKKworCQkvL3NwYXduIHRoZSBjaGlsZCBwcm9jZXNzCisJCWlmICghQ3JlYXRlUHJvY2Vzc0EoTlVMTCwgaGFuZGxlcywgTlVMTCxOVUxMLFRSVUUsMCxOVUxMLE5VTEwsJnNpLCZwaSkpCisJCXsKKwkJCUdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVByb2Nlc3MgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7CisJCUNsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKKyNlbmRpZgorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApAQCAtMCwwICsxLDIwNSBAQAorLy8gVGhyaWZ0Q29tbW9uLmggOiBDb21tb24gaW5jbHVkZXMsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcyAKKy8vIGZvciBzYW1wbGUgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyCisvLworLy8gQWRkIHRoZSBmb2xsb3dpbmcgcGF0aHMgdG8gdGhlIFByb2plY3QncyBwcm9wZXJ0aWVzOgorLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBDL0MrKyAtPiBHZW5lcmFsLT4gQWRkaXRpb25hbCBJbmNsdWRlIERpcmVjdG9yaWVzIC0tCisvLyAuLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOworLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIExpYnJhcnkgRGlyZWN0b3JpZXMgLS0KKy8vIC4uLy4uLy4uL2xpYi9jcHAvJChDb25maWd1cmF0aW9uKTsuLi8uLi8uLi8uLi9Cb29zdC9saWIKKy8vCisvLyBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgLT4gTGlua2VyIC0+IElucHV0IC0+IEFkZGl0aW9uYWwgRGVwZW5kZW5jaWVzIC0tCisvLyBsaWJ0aHJpZnQubGliCisvLworLy8gLi4uIGFkanVzdCByZWxhdGl2ZSBwYXRocyBhcyBuZWNlc3NhcnkuCisvLworCisjaWZkZWYgX1dJTjMyIC8vdGhyaWZ0IGlzIGNyYXNoaW5nIHdoZW4gdXNpbmcgYm9vc3QgdGhyZWFkcyBvbiBNYWMgT1NYCisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBSZXF1aXJlZCBJbmNsdWRlcworLy8nc2VydmVyJyBzaWRlICNpbmNsdWRlcworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKy8vJ2NsaWVudCcgc2lkZSAjaW5jbHVkZXMKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gUmVxdWlyZWQgTmFtZXNwYWNlcworLy8nc2VydmVyJyBzaWRlIG5hbWVzcGFjZXMKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKy8vY29tbW9uIG5hbWVzcGFjZXMKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKy8vdXNpbmcgbmFtZXNwYWNlIGJvb3N0OyAvL3VzaW5nIG5zIGJvb3N0IGNhbiBpbnRyb2R1Y2UgdHlwZSBjb25mbGljdHMKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK25hbWVzcGFjZSB0aHJpZnRjb21tb24KK3sKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLworCS8vU3RhcnQgdGhlIHRocmlmdCAnc2VydmVyJyAoYm90aCBzZXJ2ZXIgJiBjbGllbnQgc2lkZSBydW4gb25lIGZvciBiaWRpciBldmVudCBzaWduYWxpbmcpCisJLy8gKioqIFRoaXMgZnVuY3Rpb24gdGVtcGxhdGUgd2lsbCBibG9jayAqKioKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCAKKwkJICAgICAgICAgICAgICAgICAgaW50IE51bVRocmVhZHMsIAorCQkJCQkJICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisJCQkJCQkgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+ICZzZXJ2ZXIpCisJeworI2lmZGVmIF9XSU4zMgorCQlpZiAoIWhuZGxyLmdldCgpKQorCQkJdGhyb3cgc3RkOjpleGNlcHRpb24oIlJ1blRocmlmdFNlcnZlcigpIGludmFsaWQgaGFuZGxlciIpOworCQlpZiAoIXRyYW5zcG9ydC5nZXQoKSkKKwkJCXRocm93IHN0ZDo6ZXhjZXB0aW9uKCJSdW5UaHJpZnRTZXJ2ZXIoKSBpbnZhbGlkIHRyYW5zcG9ydCIpOworI2Vsc2UKKwkJaWYgKCAhaG5kbHIuZ2V0KCkgfHwgIXRyYW5zcG9ydC5nZXQoKSApCisJCQl0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOworI2VuZGlmCisKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKGhuZGxyKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBNeVByb2Nlc3NvcihoYW5kbGVyKSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0ZmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKwkJaWYoTnVtVGhyZWFkcyA8PSAxKQorCQl7CS8vU2luZ2xlLXRocmVhZGVkIHNlcnZlcgorCQkJc2VydmVyLnJlc2V0KG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpKTsKKwkJfQorCQllbHNlCisJCXsJLy9NdWx0aS10aHJlYWRlZCBzZXJ2ZXIKKwkJCWJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKE51bVRocmVhZHMpOworCQkJYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCQkJdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKwkJCXRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisJCQlzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnksIHRocmVhZE1hbmFnZXIpKTsKKwkJfQorCisJCXByaW50ZigiU3RhcnRpbmcgdGhlICdzZXJ2ZXInLi4uXG4iKTsKKwkJc2VydmVyLT5zZXJ2ZSgpOworCQlwcmludGYoImRvbmUuXG4iKTsKKwl9CisKKwkvLyBUaHJpZnQgc2VydmVyIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgcGlwZSBuYW1lLgorCS8vIEEgaGFuZGxlciBtdXN0IGJlIHBhc3NlZCBpbiB0byB0aGlzIHZlcnNpb24uCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaG5kbHIsIGludCBOdW1UaHJlYWRzLCBzdGQ6OnN0cmluZyBwaXBlbmFtZSwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gJnN2cikKKwl7CisjaWZuZGVmIF9XSU4zMiAgLy9NYWMsICpuaXgKKwkJdW5saW5rKHBpcGVuYW1lLmNfc3RyKCkpOworI2VuZGlmCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFBpcGVTZXJ2ZXIocGlwZW5hbWUsIDEwMjQsIE51bVRocmVhZHMpKTsgLy9OYW1lZCBwaXBlCisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihobmRsciwgTnVtVGhyZWFkcywgdHJhbnNwb3J0LCBzdnIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwaXBlIG5hbWUuCisJLy8gVGhpcyB2ZXJzaW9uIGluc3RhbnRpYXRlcyBpdHMgb3duIGhhbmRsZXIuCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGludCBOdW1UaHJlYWRzLCBzdGQ6OnN0cmluZyBwaXBlbmFtZSkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaGFuZGxlcihuZXcgTXlIYW5kbGVyKCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CisKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhhbmRsZXIsIE51bVRocmVhZHMsIHBpcGVuYW1lLCBzZXJ2ZXIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzb2NrZXQgcG9ydCBudW1iZXIuCisJLy8gQSBoYW5kbGVyIG11c3QgYmUgcGFzc2VkIGluIHRvIHRoaXMgdmVyc2lvbi4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIGludCBQb3J0KQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KFBvcnQpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaG5kbHIsIE51bVRocmVhZHMsIHRyYW5zcG9ydCwgc2VydmVyKTsKKwl9CisKKwkvLyBUaHJpZnQgc2VydmVyIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgc29ja2V0IHBvcnQgbnVtYmVyLgorCS8vIFRoaXMgdmVyc2lvbiBpbnN0YW50aWF0ZXMgaXRzIG93biBoYW5kbGVyLgorCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChpbnQgTnVtVGhyZWFkcywgaW50IFBvcnQpCisJeworCQlib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhhbmRsZXIobmV3IE15SGFuZGxlcigpKTsKKworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaGFuZGxlciwgTnVtVGhyZWFkcywgUG9ydCk7CisJfQorCisJLy8KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhuZGxyLCBOdW1UaHJlYWRzLCB0cmFuc3BvcnQsIHNlcnZlcik7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9Db25uZWN0IHRvIHRocmlmdCAnc2VydmVyJyAtIFNvY2tldCB2ZXJzaW9uCisJLy8oYm90aCBzZXJ2ZXIgJiBjbGllbnQgc2lkZSBydW4gb25lIGZvciBiaWRpciBldmVudCBzaWduYWxpbmcpCisJLy8KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlDbGllbnQsIGNsYXNzIE15VHJhbnNwb3J0PgorCXZvaWQgQ29ubmVjdFRvU2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUNsaWVudD4gJmNsaWVudCwgYm9vc3Q6OnNoYXJlZF9wdHI8TXlUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsIGludCBQb3J0KQorCXsKKwkJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHVzaW5nIHNvY2tldHMgdHJhbnNwb3J0LgorCQlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIFBvcnQpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKworCQljbGllbnQucmVzZXQobmV3IE15Q2xpZW50KHByb3RvY29sKSk7CisJfQorCisJLy9Db25uZWN0IHRvIHRocmlmdCAnc2VydmVyJyAtIE5hbWVkIFBpcGUgdmVyc2lvbgorCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgcGlwZW5hbWUpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgTmFtZWQgUGlwZSB0cmFuc3BvcnQuCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHBpcGUobmV3IFRQaXBlKHBpcGVuYW1lKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHBpcGUpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworCisJCWNsaWVudC5yZXNldChuZXcgTXlDbGllbnQocHJvdG9jb2wpKTsKKwl9CisKKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gQW5vbnltb3VzIFBpcGUgdmVyc2lvbgorCS8vQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3MKKyNpZmRlZiBfV0lOMzIKKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlDbGllbnQsIGNsYXNzIE15VHJhbnNwb3J0PgorCXZvaWQgQ29ubmVjdFRvU2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUNsaWVudD4gJmNsaWVudCwgYm9vc3Q6OnNoYXJlZF9wdHI8TXlUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsIEhBTkRMRSBSZFBpcGUsIEhBTkRMRSBXcnRQaXBlKQorCXsKKwkJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHVzaW5nIHNvY2tldHMgdHJhbnNwb3J0LgorI2lmZGVmIF9XSU4zMgorCQlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwaXBlKG5ldyBUUGlwZSgoaW50KVJkUGlwZSwgKGludClXcnRQaXBlKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHBpcGUpKTsKKyNlbHNlCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IikpOworCQl0cmFuc3BvcnQucmVzZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyNlbmRpZgorCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisKKwkJY2xpZW50LnJlc2V0KG5ldyBNeUNsaWVudChwcm90b2NvbCkpOworCX0KKyNlbmRpZgorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KKwkvL0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB1bmRlciBXaW5kb3dzCisjaWZkZWYgX1dJTjMyCisJYm9vbCBMYXVuY2hBbm9uUGlwZUNoaWxkKHN0ZDo6c3RyaW5nIGFwcCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9SZWFkTWUudHh0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDlhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQKQEAgLTAsMCArMSw0MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ09OU09MRSBBUFBMSUNBVElPTiA6IGNsaWVudCBQcm9qZWN0IE92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXBwV2l6YXJkIGhhcyBjcmVhdGVkIHRoaXMgY2xpZW50IGFwcGxpY2F0aW9uIGZvciB5b3UuCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciBjbGllbnQgYXBwbGljYXRpb24uCisKKworY2xpZW50LnZjeHByb2oKKyAgICBUaGlzIGlzIHRoZSBtYWluIHByb2plY3QgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLgorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFZpc3VhbCBDKysgdGhhdCBnZW5lcmF0ZWQgdGhlIGZpbGUsIGFuZAorICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF0Zm9ybXMsIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBmZWF0dXJlcyBzZWxlY3RlZCB3aXRoIHRoZQorICAgIEFwcGxpY2F0aW9uIFdpemFyZC4KKworY2xpZW50LnZjeHByb2ouZmlsdGVycworICAgIFRoaXMgaXMgdGhlIGZpbHRlcnMgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLiAKKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmlsZXMgaW4geW91ciBwcm9qZWN0IAorICAgIGFuZCB0aGUgZmlsdGVycy4gVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIGluIHRoZSBJREUgdG8gc2hvdyBncm91cGluZyBvZiBmaWxlcyB3aXRoCisgICAgc2ltaWxhciBleHRlbnNpb25zIHVuZGVyIGEgc3BlY2lmaWMgbm9kZSAoZm9yIGUuZy4gIi5jcHAiIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIlNvdXJjZSBGaWxlcyIgZmlsdGVyKS4KKworY2xpZW50LmNwcAorICAgIFRoaXMgaXMgdGhlIG1haW4gYXBwbGljYXRpb24gc291cmNlIGZpbGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBzdGFuZGFyZCBmaWxlczoKKworU3RkQWZ4LmgsIFN0ZEFmeC5jcHAKKyAgICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBidWlsZCBhIHByZWNvbXBpbGVkIGhlYWRlciAoUENIKSBmaWxlCisgICAgbmFtZWQgY2xpZW50LnBjaCBhbmQgYSBwcmVjb21waWxlZCB0eXBlcyBmaWxlIG5hbWVkIFN0ZEFmeC5vYmouCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBub3RlczoKKworQXBwV2l6YXJkIHVzZXMgIlRPRE86IiBjb21tZW50cyB0byBpbmRpY2F0ZSBwYXJ0cyBvZiB0aGUgc291cmNlIGNvZGUgeW91CitzaG91bGQgYWRkIHRvIG9yIGN1c3RvbWl6ZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZiZWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvLyBjbGllbnQtPmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KKy8vCisvLyBzYW1wbGUgY2xpZW50IGNvbW1hbmQgbGluZSBhcHAgdXNpbmcgVGhyaWZ0IElQQy4KKy8vIFF1aWNrIG4gRGlydHkgZXhhbXBsZSwgbWF5IG5vdCBoYXZlIHZlcnkgcm9idXN0IGVycm9yIGhhbmRsaW5nCisvLyBmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eS4KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSAic3RkYWZ4LmgiCisjZWxzZQorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9JbmNsdWRlIHRoaXMgYmVmb3JlIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZXMKKyNpbmNsdWRlICJUaHJpZnRDb21tb24uaCIKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL1RhaWxvciB0aGVzZSB0byB5b3VyIGdlbmVyYXRlZCBmaWxlcworI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlU2VydmljZS5oIgorI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlQ2FsbGJhY2suaCIKKwordXNpbmcgbmFtZXNwYWNlIFNhbXBsZTsgLy9kZWNsYXJlZCBpbiAudGhyaWZ0IGZpbGUKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK3ZvaWQgQ2xpZW50TGlzdGVuZXJUaHJlYWRQcm9jKCk7Citib29sIGJTb2NrZXQgPSBmYWxzZTsKK2Jvb2wgYkFub25QaXBlID0gZmFsc2U7CitpbnQgc3J2UG9ydDsKK3N0ZDo6c3RyaW5nIHBpcGVuYW1lOworc3RkOjpzdHJpbmcgcGlwZW5hbWVfY2xpZW50OworI2lmZGVmIF9XSU4zMgorIEhBTkRMRSBoQ29uc29sZTsKKyNlbmRpZgorCisvL0N1c3RvbWl6ZWQgdmVyc2lvbiBvZiBwcmludGYgdGhhdCBjaGFuZ2VzIHRoZSB0ZXh0IGNvbG9yCisvL1RoaXMgZGVwZW5kcyBvbiBoQ29uc29sZSBnbG9iYWwgYmVpbmcgaW5pdGlhbGl6ZWQKK3ZvaWQgaGxwcmludGYoY29uc3QgY2hhciogX0Zvcm1hdCwgLi4uKQoreworI2lmZGVmIF9XSU4zMgorCVNldENvbnNvbGVUZXh0QXR0cmlidXRlKGhDb25zb2xlLCAweEUpOworI2VuZGlmCisJdmFfbGlzdCBhcDsKKwlpbnQgcjsKKwl2YV9zdGFydCAoYXAsIF9Gb3JtYXQpOworCXIgPSB2cHJpbnRmIChfRm9ybWF0LCBhcCk7CisJdmFfZW5kIChhcCk7CisjaWZkZWYgX1dJTjMyCisJU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaENvbnNvbGUsIDcpOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaWVudC1zaWRlIFJQQyBpbXBsZW1lbnRhdGlvbnM6IENhbGxlZCBieSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQgZm9yIAorLy8gYmlkaXJlY3Rpb25hbCBldmVudGluZy4KKy8vCitjbGFzcyBTYW1wbGVDYWxsYmFja0hhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBTYW1wbGVDYWxsYmFja0lmIHsKKyBwdWJsaWM6CisgIFNhbXBsZUNhbGxiYWNrSGFuZGxlcigpIHsKKyAgICAvLyBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUKKyAgfQorCisgIHZvaWQgcGluZ2NsaWVudCgpCisgIHsKKyAgICBobHByaW50ZigiPDw8UGluZyByZWNlaXZlZCBmcm9tIHNlcnZlciAoc2VydmVyLXRvLWNsaWVudCBldmVudCkuXG4iKTsKKyAgfQorCit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyNpZmRlZiBfV0lOMzIKK2ludCBfdG1haW4oaW50IGFyZ2MsIF9UQ0hBUiogYXJndltdKQorI2Vsc2UKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyNlbmRpZgoreworCS8vUHJvY2VzcyBjbWQgbGluZSBhcmdzIHRvIGRldGVybWluZSBuYW1lZCB2cyBhbm9uIHBpcGVzLgorCWJvb2wgdXNhZ2UgPSBmYWxzZTsKKyNpZmRlZiBfV0lOMzIKKwlIQU5ETEUgUmVhZFBpcGUsIFdyaXRlUGlwZTsKKwloQ29uc29sZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisjZW5kaWYKKworCS8vUHJvY2VzcyBjb21tYW5kIGxpbmUgcGFyYW1zCisJaWYoYXJnYyA+IDEpCisJeworCQlpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1zcCIpKSA9PSAwKQorCQl7CS8vU29ja2V0IFBvcnQgc3BlY2lmaWVkCisJCQlzcnZQb3J0ID0gX3RzdG9pKGFyZ3ZbMl0pOworCQkJYlNvY2tldCA9IHRydWU7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1ucCIpKSA9PSAwKQorCQl7CS8vTmFtZWQgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyB3cGlwZShhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVuYW1lLnJlc2l6ZSh3cGlwZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvcHkod3BpcGUuYmVnaW4oKSwgd3BpcGUuZW5kKCksIHBpcGVuYW1lLmJlZ2luKCkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVuYW1lID0gYXJndlsyXTsKKyNlbmRpZgorCQkJcGlwZW5hbWVfY2xpZW50ID0gcGlwZW5hbWUgKyAiX2NsaWVudCI7CisJCX0KKwkJZWxzZSBpZihhcmdjID09IDMpCisJCXsJLy9Bbm9ueW1vdXMgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKwkJCVJlYWRQaXBlICA9IChIQU5ETEUpX3RzdG9pKGFyZ3ZbMV0pOworCQkJV3JpdGVQaXBlID0gKEhBTkRMRSlfdHN0b2koYXJndlsyXSk7CisJCQliQW5vblBpcGUgPSB0cnVlOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQW5vbnltb3VzIHBpcGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQgdW5kZXIgKk5JWFxuIik7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCQl1c2FnZSA9IHRydWU7CisJfQorCWVsc2UKKwkJdXNhZ2UgPSB0cnVlOworCisJaWYodXNhZ2UpCisJeworCQlobHByaW50ZigiVGhyaWZ0IHNhbXBsZSBjbGllbnQgdXNhZ2U6XG5cbiIpOworCQlobHByaW50ZigiU29ja2V0IFBvcnQgdG8gY29ubmVjdCB0bzogLXNwIDxwb3J0Iz5cbiIpOworCQlobHByaW50ZigiTmFtZWQgUGlwZSB0byBjb25uZWN0IHRvOiAgLW5wIDxwaXBlbmFtZT4gKGUuZy4gYWZmcGlwZSlcbiIpOworCQlobHByaW50ZigiQW5vbnltb3VzIFBpcGUgKG11c3QgYmUgbGF1bmNoZWQgYnkgYW5vbiBwaXBlIGNyZWF0b3IpOlxuIik7CisJCWhscHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhZCBIYW5kbGU+IDxXcml0ZSBIYW5kbGU+XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHRvIHNlcnZlci4KKwlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7IC8vQ2xpZW50IGNsYXNzIGZyb20gVGhyaWZ0LWdlbmVyYXRlZCBjb2RlLgorCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKworCWlmKGJTb2NrZXQpCisJewkvL1NvY2tldCB0cmFuc3BvcnQKKyNpZmRlZiBfV0lOMzIKKwkJVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisJCWhscHJpbnRmKCJVc2luZyBzb2NrZXQgdHJhbnNwb3J0IHBvcnQgJWRcbiIsIHNydlBvcnQpOworCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVTZXJ2aWNlQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnQsIHRyYW5zcG9ydCwgc3J2UG9ydCk7CisJfQorCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwl7CisJCWhscHJpbnRmKCJVc2luZyBOYW1lZCBQaXBlICVzXG4iLCBwaXBlbmFtZS5jX3N0cigpKTsKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlU2VydmljZUNsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50LCB0cmFuc3BvcnQsIHBpcGVuYW1lKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBfV0lOMzIKKwkJaGxwcmludGYoIlVzaW5nIEFub255bW91cyBQaXBlIHRyYW5zcG9ydFxuIik7CisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZVNlcnZpY2VDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudCwgdHJhbnNwb3J0LCBSZWFkUGlwZSwgV3JpdGVQaXBlKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIF9XSU4zMgorCS8vU3RhcnQgYSB0aHJlYWQgdG8gcmVjZWl2ZSBpbmJvdW5kIGNvbm5lY3Rpb24gZnJvbSBzZXJ2ZXIgZm9yIDItd2F5IGV2ZW50IHNpZ25hbGluZy4KKwlib29zdDo6dGhyZWFkIENsaWVudExpc3RlbmVyVGhyZWFkKENsaWVudExpc3RlbmVyVGhyZWFkUHJvYyk7CisjZW5kaWYKKworCXRyeSB7CisJCXRyYW5zcG9ydC0+b3BlbigpOworCisJCS8vTm90aWZ5IHNlcnZlciB3aGF0IHRvIGNvbm5lY3QgYmFjayBvbi4KKwkJaWYoYlNvY2tldCkKKwkJCWNsaWVudC0+Q2xpZW50U2lkZUxpc3RlblBvcnQoc3J2UG9ydCArIDEpOyAvL1NvY2tldAorCQllbHNlIGlmKCFiQW5vblBpcGUpCisJCQljbGllbnQtPkNsaWVudFNpZGVQaXBlTmFtZShwaXBlbmFtZV9jbGllbnQpOyAvL05hbWVkIFBpcGUKKworCQkvL1J1biBzb21lIG1vcmUgUlBDcworCQlzdGQ6OnN0cmluZyBoZWxsb3N0ciA9ICJIZWxsbyBob3cgYXJlIHlvdT8iOworCQlzdGQ6OnN0cmluZyByZXR1cm5zdHI7CisJCWNsaWVudC0+SGVsbG9UaGVyZShyZXR1cm5zdHIsIGhlbGxvc3RyKTsKKwkJaGxwcmludGYoIlxuPj4+U2VudDogJXNcbiIsIGhlbGxvc3RyLmNfc3RyKCkpOworCQlobHByaW50ZigiPDw8UmVjZWl2ZWQ6ICVzXG4iLCByZXR1cm5zdHIuY19zdHIoKSk7CisKKwkJaGxwcmludGYoIlxuPj4+Q2FsbGluZyBTZXJ2ZXJEb1NvbWV0aGluZygpIHdoaWNoIGRlbGF5cyBmb3IgNSBzZWNvbmRzLlxuIik7CisJCWNsaWVudC0+U2VydmVyRG9Tb21ldGhpbmcoKTsKKwkJaGxwcmludGYoIj4+PlNlcnZlckRvU29tZXRoaW5nKCkgZG9uZS5cblxuIik7CisKKwkJdHJhbnNwb3J0LT5jbG9zZSgpOworCX0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7CisJCWhscHJpbnRmKCJFUlJPUjogJXNcbiIsIHR4LndoYXQoKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy9UaHJlYWQgUm91dGluZQordm9pZCBDbGllbnRMaXN0ZW5lclRocmVhZFByb2MoKQoreworCWlmKGJTb2NrZXQpCisJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZUNhbGxiYWNrSGFuZGxlciwgU2FtcGxlQ2FsbGJhY2tQcm9jZXNzb3I+KDEsIHNydlBvcnQgKyAxKTsKKwllbHNlIGlmKCFiQW5vblBpcGUpCisJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZUNhbGxiYWNrSGFuZGxlciwgU2FtcGxlQ2FsbGJhY2tQcm9jZXNzb3I+KDEsIHBpcGVuYW1lX2NsaWVudCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzljMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvagpAQCAtMCwwICsxLDEwNSBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+ezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5jbGllbnQ8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJjbGllbnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvai5maWx0ZXJzIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzdiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw2NiBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjttZmNyaWJib24tbXM8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcZ2VuLWNwcCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MTI2NWIzZGMtOTFkZS00MTZmLWFiYTYtN2I3NTBkZTQyMjFlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJjbGllbnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMTUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcApAQCAtMCwwICsxLDggQEAKKy8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCisvLyBjbGllbnQucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKKy8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgorCisjaW5jbHVkZSAic3RkYWZ4LmgiCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICisvLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmgKQEAgLTAsMCArMSwxNSBAQAorLy8gc3RkYWZ4LmggOiBpbmNsdWRlIGZpbGUgZm9yIHN0YW5kYXJkIHN5c3RlbSBpbmNsdWRlIGZpbGVzLAorLy8gb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0CisvLyBhcmUgY2hhbmdlZCBpbmZyZXF1ZW50bHkKKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidGFyZ2V0dmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKKworCisvLyBUT0RPOiByZWZlcmVuY2UgYWRkaXRpb25hbCBoZWFkZXJzIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC90YXJnZXR2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MwMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC90YXJnZXR2ZXIuaApAQCAtMCwwICsxLDggQEAKKyNwcmFnbWEgb25jZQorCisvLyBJbmNsdWRpbmcgU0RLRERLVmVyLmggZGVmaW5lcyB0aGUgaGlnaGVzdCBhdmFpbGFibGUgV2luZG93cyBwbGF0Zm9ybS4KKworLy8gSWYgeW91IHdpc2ggdG8gYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBmb3IgYSBwcmV2aW91cyBXaW5kb3dzIHBsYXRmb3JtLCBpbmNsdWRlIFdpblNES1Zlci5oIGFuZAorLy8gc2V0IHRoZSBfV0lOMzJfV0lOTlQgbWFjcm8gdG8gdGhlIHBsYXRmb3JtIHlvdSB3aXNoIHRvIHN1cHBvcnQgYmVmb3JlIGluY2x1ZGluZyBTREtEREtWZXIuaC4KKworI2luY2x1ZGUgPFNES0RES1Zlci5oPgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NvbmZpZy5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGQ3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmgKQEAgLTAsMCArMSwyNCBAQAorLy9NaXNzaW5nIGRlZmluaXRpb25zIGZvciAqTklYIHN5c3RlbXMuIFRoaXMgc2FtcGxlIHByb2plY3QKKy8vd2FzIGluaXRpYWxseSBjcmVhdGVkIG9uIFdpbmRvd3MuCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBURVhUKHN0cikgc3RyCisKK2lubGluZSBpbnQgU2xlZXAoaW50IG1zKQoreworCXJldHVybiBzbGVlcChtcy8xMDAwKTsgLy9zbGVlcCgpIHBhcmFtIGlzIGluIHNlY29uZHMKK30KKworaW5saW5lIGludCBfdGNzY21wKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpCit7CisJcmV0dXJuIHN0cmNtcChzdHIxLCBzdHIyKTsKK30KKworaW5saW5lIGludCBfdHN0b2koY29uc3QgY2hhciogc3RyKQoreworCXJldHVybiBhdG9pKHN0cik7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvUmVhZE1lLnR4dCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MwZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0CkBAIC0wLDAgKzEsNDAgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIENPTlNPTEUgQVBQTElDQVRJT04gOiBzZXJ2ZXIgUHJvamVjdCBPdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FwcFdpemFyZCBoYXMgY3JlYXRlZCB0aGlzIHNlcnZlciBhcHBsaWNhdGlvbiBmb3IgeW91LgorCitUaGlzIGZpbGUgY29udGFpbnMgYSBzdW1tYXJ5IG9mIHdoYXQgeW91IHdpbGwgZmluZCBpbiBlYWNoIG9mIHRoZSBmaWxlcyB0aGF0CittYWtlIHVwIHlvdXIgc2VydmVyIGFwcGxpY2F0aW9uLgorCisKK3NlcnZlci52Y3hwcm9qCisgICAgVGhpcyBpcyB0aGUgbWFpbiBwcm9qZWN0IGZpbGUgZm9yIFZDKysgcHJvamVjdHMgZ2VuZXJhdGVkIHVzaW5nIGFuIEFwcGxpY2F0aW9uIFdpemFyZC4KKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZiBWaXN1YWwgQysrIHRoYXQgZ2VuZXJhdGVkIHRoZSBmaWxlLCBhbmQKKyAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhdGZvcm1zLCBjb25maWd1cmF0aW9ucywgYW5kIHByb2plY3QgZmVhdHVyZXMgc2VsZWN0ZWQgd2l0aCB0aGUKKyAgICBBcHBsaWNhdGlvbiBXaXphcmQuCisKK3NlcnZlci52Y3hwcm9qLmZpbHRlcnMKKyAgICBUaGlzIGlzIHRoZSBmaWx0ZXJzIGZpbGUgZm9yIFZDKysgcHJvamVjdHMgZ2VuZXJhdGVkIHVzaW5nIGFuIEFwcGxpY2F0aW9uIFdpemFyZC4gCisgICAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGZpbGVzIGluIHlvdXIgcHJvamVjdCAKKyAgICBhbmQgdGhlIGZpbHRlcnMuIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCBpbiB0aGUgSURFIHRvIHNob3cgZ3JvdXBpbmcgb2YgZmlsZXMgd2l0aAorICAgIHNpbWlsYXIgZXh0ZW5zaW9ucyB1bmRlciBhIHNwZWNpZmljIG5vZGUgKGZvciBlLmcuICIuY3BwIiBmaWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICJTb3VyY2UgRmlsZXMiIGZpbHRlcikuCisKK3NlcnZlci5jcHAKKyAgICBUaGlzIGlzIHRoZSBtYWluIGFwcGxpY2F0aW9uIHNvdXJjZSBmaWxlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgc3RhbmRhcmQgZmlsZXM6CisKK1N0ZEFmeC5oLCBTdGRBZnguY3BwCisgICAgVGhlc2UgZmlsZXMgYXJlIHVzZWQgdG8gYnVpbGQgYSBwcmVjb21waWxlZCBoZWFkZXIgKFBDSCkgZmlsZQorICAgIG5hbWVkIHNlcnZlci5wY2ggYW5kIGEgcHJlY29tcGlsZWQgdHlwZXMgZmlsZSBuYW1lZCBTdGRBZngub2JqLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgbm90ZXM6CisKK0FwcFdpemFyZCB1c2VzICJUT0RPOiIgY29tbWVudHMgdG8gaW5kaWNhdGUgcGFydHMgb2YgdGhlIHNvdXJjZSBjb2RlIHlvdQorc2hvdWxkIGFkZCB0byBvciBjdXN0b21pemUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhODM2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcApAQCAtMCwwICsxLDE2OCBAQAorLy8gc2VydmVyLmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KKy8vCisvLyBzYW1wbGUgc2VydmVyIGNvbW1hbmQgbGluZSBhcHAgdXNpbmcgVGhyaWZ0IElQQy4KKy8vCisvLyBUaGlzIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZnVsbCBkdXBsZXggUlBDLiBUaGF0IGlzLCBlYWNoCisvLyBzaWRlIHJ1bnMgYm90aCBhIGNsaWVudCBhbmQgc2VydmVyIHRvIGVuYWJsZSBiaWRpcmVjdGlvbmFsIGV2ZW50IAorLy8gc2lnbmFsaW5nLgorLy8KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSAic3RkYWZ4LmgiCisjZWxzZQorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vSW5jbHVkZSB0aGlzIGJlZm9yZSB0aGUgZ2VuZXJhdGVkIGluY2x1ZGVzCisjaW5jbHVkZSAiVGhyaWZ0Q29tbW9uLmgiCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9UYWlsb3IgdGhlc2UgdG8geW91ciBnZW5lcmF0ZWQgZmlsZXMKKyNpbmNsdWRlICIuLi9nZW4tY3BwL1NhbXBsZVNlcnZpY2UuaCIKKyNpbmNsdWRlICIuLi9nZW4tY3BwL1NhbXBsZUNhbGxiYWNrLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBTYW1wbGU7IC8vZGVjbGFyZWQgaW4gLnRocmlmdCBmaWxlCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitpbnQxNl90IENsaWVudFBvcnRfOworc3RkOjpzdHJpbmcgQ2xpZW50UGlwZU5hbWVfOwordm9pZCBTMkNUaHJlYWRQcm9jKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJQQyBpbXBsZW1lbnRhdGlvbnMKKy8vCitjbGFzcyBTYW1wbGVTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFNhbXBsZVNlcnZpY2VJZiB7CisgcHVibGljOgorICBTYW1wbGVTZXJ2aWNlSGFuZGxlcigpIHsKKyAgICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZQorICB9CisKKyAgdm9pZCBIZWxsb1RoZXJlKHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgSGVsbG9TdHJpbmcpIHsKKyAgICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZQorICAgIHByaW50ZigiPDw8SGVsbG9UaGVyZSgpIHJlY2VpdmVkIHN0cmluZzogJXNcbiIsIEhlbGxvU3RyaW5nLmNfc3RyKCkpOworCV9yZXR1cm4gPSAiR29vZCB0aGFuayB5b3UuIjsKKyAgfQorCisgIHZvaWQgU2VydmVyRG9Tb21ldGhpbmcoKSB7CisgICAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUKKyAgICBwcmludGYoIlNlcnZlckRvU29tZXRoaW5nKCk6IFNpbXVsYXRpbmcgd29yayBmb3IgNSBzZWNvbmRzXG4iKTsKKyAgICBTbGVlcCg1MDAwKTsKKyAgICBwcmludGYoIlNlcnZlckRvU29tZXRoaW5nKCk6IERvbmVcbiIpOworICB9CisKKyAgdm9pZCBDbGllbnRTaWRlTGlzdGVuUG9ydChjb25zdCBpbnQxNl90IENsaWVudExpc3RlblBvcnQpCisgIHsKKwlDbGllbnRQb3J0XyA9IENsaWVudExpc3RlblBvcnQ7CisJQ2xpZW50UGlwZU5hbWVfID0gIiI7CisjaWZkZWYgX1dJTjMyCisJcHJpbnRmKCI+Pj5Db25uZWN0aW5nIHRvIGNsaWVudCBvbiBwb3J0ICVkXG4iLCBDbGllbnRQb3J0Xyk7CisJYm9vc3Q6OnRocmVhZCBDb25uZWN0MkNsaWVudFRocmVhZChTMkNUaHJlYWRQcm9jKTsKKyNlbmRpZgorICB9CisKKyAgdm9pZCBDbGllbnRTaWRlUGlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIENsaWVudFBpcGVOYW1lKQorICB7CisJQ2xpZW50UGlwZU5hbWVfID0gQ2xpZW50UGlwZU5hbWU7CisJQ2xpZW50UG9ydF8gPSAwOworI2lmZGVmIF9XSU4zMgorCXByaW50ZigiPj4+Q29ubmVjdGluZyB0byBjbGllbnQgcGlwZSAlc1xuIiwgQ2xpZW50UGlwZU5hbWVfLmNfc3RyKCkpOworCWJvb3N0Ojp0aHJlYWQgQ29ubmVjdDJDbGllbnRUaHJlYWQoUzJDVGhyZWFkUHJvYyk7CisjZW5kaWYKKyAgfQorfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgoraW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJaW50IHBvcnQ7CisJc3RkOjpzdHJpbmcgcGlwZW5hbWU7IC8vZS5nLiAiYWZmcGlwZSIKKworCWJvb2wgdXNhZ2UgPSBmYWxzZTsKKworCS8vUHJvY2VzcyBjb21tYW5kIGxpbmUgcGFyYW1zCisJaWYoYXJnYyA+IDEpCisJeworCQlpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1zcCIpKSA9PSAwKQorCQl7CS8vU29ja2V0IFBvcnQgc3BlY2lmaWVkCisJCQlwb3J0ID0gX3RzdG9pKGFyZ3ZbMl0pOworI2lmZGVmIF9XSU4zMgorCQkJVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisJCQkvLyBTdGFydCB0aGUgdGhyaWZ0IHNlcnZlciB3aGljaCBpcyBhIGJsb2NraW5nIGNhbGwuCisJCQl0aHJpZnRjb21tb246OlJ1blRocmlmdFNlcnZlcjxTYW1wbGVTZXJ2aWNlSGFuZGxlciwgU2FtcGxlU2VydmljZVByb2Nlc3Nvcj4oMTAsIHBvcnQpOworCQl9CisJCWVsc2UgaWYoX3Rjc2NtcChhcmd2WzFdLCBURVhUKCItbnAiKSkgPT0gMCkKKwkJewkvL05hbWVkIFBpcGUgc3BlY2lmaWVkCisjaWZkZWYgX1dJTjMyCisJCQlzdGQ6OndzdHJpbmcgd3BpcGUoYXJndlsyXSk7CisJCQlwaXBlbmFtZS5yZXNpemUod3BpcGUubGVuZ3RoKCkpOworCQkJc3RkOjpjb3B5KHdwaXBlLmJlZ2luKCksIHdwaXBlLmVuZCgpLCBwaXBlbmFtZS5iZWdpbigpKTsKKyNlbHNlCisJCQlwaXBlbmFtZSA9IGFyZ3ZbMl07CisjZW5kaWYKKwkJCXByaW50ZigiVXNpbmcgTmFtZWQgUGlwZSAlc1xuIiwgcGlwZW5hbWUuY19zdHIoKSk7CisKKwkJCS8vVGhyaWZ0IG92ZXIgTmFtZWQgUGlwZS4KKwkJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZVNlcnZpY2VIYW5kbGVyLCBTYW1wbGVTZXJ2aWNlUHJvY2Vzc29yPigxMCwgcGlwZW5hbWUpOworCQl9CisJCWVsc2UgaWYoX3Rjc2NtcChhcmd2WzFdLCBURVhUKCItYXAiKSkgPT0gMCkKKwkJewkvL0Fub255bW91cyBQaXBlIHNwZWNpZmllZAorCQkJLy9UaGlzIGlzIG1vcmUgaW52b2x2ZWQgYmVjYXVzZSB0aGUgY2hpbGQgbmVlZHMgdG8gYmUgbGF1bmNoZWQgCisJCQkvL2FmdGVyIHRoZSB0cmFuc3BvcnQgaXMgY3JlYXRlZCBidXQgYmVmb3JlIHRoZSBibG9ja2luZyBzZXJ2ZXIgCisJCQkvL2NhbGwuCisjaWZkZWYgX1dJTjMyCisJCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRQaXBlU2VydmVyKCkpOyAvL0Fub255bW91cyBwaXBlCisJCQl0aHJpZnRjb21tb246OkxhdW5jaEFub25QaXBlQ2hpbGQoIi5cXGNsaWVudC5leGUiLCB0cmFuc3BvcnQpOworCQkJYm9vc3Q6OnNoYXJlZF9wdHI8U2FtcGxlU2VydmljZUhhbmRsZXI+IGhhbmRsZXIobmV3IFNhbXBsZVNlcnZpY2VIYW5kbGVyKCkpOworCQkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlU2VydmljZUhhbmRsZXIsIFNhbXBsZVNlcnZpY2VQcm9jZXNzb3I+KGhhbmRsZXIsIDEwLCB0cmFuc3BvcnQpOworI2Vsc2UKKwkJCXByaW50ZigiQW5vbnltb3VzIHBpcGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQgdW5kZXIgKk5JWFxuIik7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCQl1c2FnZSA9IHRydWU7CisJfQorCWVsc2UKKwkJdXNhZ2UgPSB0cnVlOworCisJaWYodXNhZ2UpCisJeworCQlwcmludGYoIlRocmlmdCBzYW1wbGUgc2VydmVyIHVzYWdlOlxuXG4iKTsKKwkJcHJpbnRmKCJTb2NrZXQgUG9ydCA6ICAgLXNwIDxwb3J0Iz5cbiIpOworCQlwcmludGYoIk5hbWVkIFBpcGUgOiAgICAtbnAgPHBpcGVuYW1lPiAoZS5nLiBhZmZwaXBlKVxuIik7CisJCXByaW50ZigiQW5vbnltb3VzIFBpcGU6IC1hcFxuIik7CisJfQorCXJldHVybiAwOworfQorCisKKy8vVGhyZWFkIFJvdXRpbmUgdGhhdCBjb25uZWN0cyB0byB0aGUgJ2NsaWVudCcuCit2b2lkIFMyQ1RocmVhZFByb2MoKQoreworCS8vTWFzdGVyIHNlcnZlcidzIGNvbm5lY3Rpb24gdG8gY2xpZW50LXNpZGUncyBzZXJ2ZXIuCisJYm9vc3Q6OnNoYXJlZF9wdHI8U2FtcGxlQ2FsbGJhY2tDbGllbnQ+IGNsaWVudHNydjsgLy9DbGllbnQgY2xhc3MgZnJvbSBUaHJpZnQtZ2VuZXJhdGVkIGNvZGUuCisJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCWlmKENsaWVudFBvcnRfICE9IDApCisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZUNhbGxiYWNrQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnRzcnYsIHRyYW5zcG9ydCwgQ2xpZW50UG9ydF8pOworCWlmKCFDbGllbnRQaXBlTmFtZV8uZW1wdHkoKSkKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudHNydiwgdHJhbnNwb3J0LCBDbGllbnRQaXBlTmFtZV8pOworCisJdHJ5IHsKKwkJdHJhbnNwb3J0LT5vcGVuKCk7CisKKwkJY2xpZW50c3J2LT5waW5nY2xpZW50KCk7CisJCVNsZWVwKDE1MDApOworCQljbGllbnRzcnYtPnBpbmdjbGllbnQoKTsKKwkJU2xlZXAoMTUwMCk7CisJCWNsaWVudHNydi0+cGluZ2NsaWVudCgpOworCisJCXRyYW5zcG9ydC0+Y2xvc2UoKTsKKwl9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgeworCQlwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ogYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzliMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qCkBAIC0wLDAgKzEsMTA2IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPnNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9Cb29zdC87Li4vLi4vLi4vLi4vQm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vQm9vc3QvOy4uLy4uLy4uLy4uL0Jvb3N0L2Jvb3N0L3RyMTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPi4uLy4uLy4uL2xpYi9jcHAvJChDb25maWd1cmF0aW9uKTsuLi8uLi8uLi8uLi9Cb29zdC9saWI7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnRocmlmdC5saWI7d3MyXzMyLmxpYjtrZXJuZWwzMi5saWI7dXNlcjMyLmxpYjtnZGkzMi5saWI7d2luc3Bvb2wubGliO2NvbWRsZzMyLmxpYjthZHZhcGkzMi5saWI7c2hlbGwzMi5saWI7b2xlMzIubGliO29sZWF1dDMyLmxpYjt1dWlkLmxpYjtvZGJjMzIubGliO29kYmNjcDMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IlJlYWRNZS50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InRhcmdldHZlci5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InN0ZGFmeC5jcHAiPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5DcmVhdGU8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ouZmlsdGVycyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI2ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsNjYgQEAKKz88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPnJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXY7bWZjcmliYm9uLW1zPC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzXGdlbi1jcHAiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2RhYjY2ZGI4LWJjNDUtNDUxOC1hYWQyLTdhNzU2OTYyMjZlM308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IlJlYWRNZS50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3RkYWZ4LmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InRhcmdldHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxUaHJpZnRDb21tb24uY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWZmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAKQEAgLTAsMCArMSw4IEBACisvLyBzdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcworLy8gc2VydmVyLnBjaCB3aWxsIGJlIHRoZSBwcmUtY29tcGlsZWQgaGVhZGVyCisvLyBzdGRhZngub2JqIHdpbGwgY29udGFpbiB0aGUgcHJlLWNvbXBpbGVkIHR5cGUgaW5mb3JtYXRpb24KKworI2luY2x1ZGUgInN0ZGFmeC5oIgorCisvLyBUT0RPOiByZWZlcmVuY2UgYW55IGFkZGl0aW9uYWwgaGVhZGVycyB5b3UgbmVlZCBpbiBTVERBRlguSAorLy8gYW5kIG5vdCBpbiB0aGlzIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIHN0ZGFmeC5oIDogaW5jbHVkZSBmaWxlIGZvciBzdGFuZGFyZCBzeXN0ZW0gaW5jbHVkZSBmaWxlcywKKy8vIG9yIHByb2plY3Qgc3BlY2lmaWMgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSB1c2VkIGZyZXF1ZW50bHksIGJ1dAorLy8gYXJlIGNoYW5nZWQgaW5mcmVxdWVudGx5CisvLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInRhcmdldHZlci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCisKKworLy8gVE9ETzogcmVmZXJlbmNlIGFkZGl0aW9uYWwgaGVhZGVycyB5b3VyIHByb2dyYW0gcmVxdWlyZXMgaGVyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvdGFyZ2V0dmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMDA4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvdGFyZ2V0dmVyLmgKQEAgLTAsMCArMSw4IEBACisjcHJhZ21hIG9uY2UKKworLy8gSW5jbHVkaW5nIFNES0RES1Zlci5oIGRlZmluZXMgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIFdpbmRvd3MgcGxhdGZvcm0uCisKKy8vIElmIHlvdSB3aXNoIHRvIGJ1aWxkIHlvdXIgYXBwbGljYXRpb24gZm9yIGEgcHJldmlvdXMgV2luZG93cyBwbGF0Zm9ybSwgaW5jbHVkZSBXaW5TREtWZXIuaCBhbmQKKy8vIHNldCB0aGUgX1dJTjMyX1dJTk5UIG1hY3JvIHRvIHRoZSBwbGF0Zm9ybSB5b3Ugd2lzaCB0byBzdXBwb3J0IGJlZm9yZSBpbmNsdWRpbmcgU0RLRERLVmVyLmguCisKKyNpbmNsdWRlIDxTREtEREtWZXIuaD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWVmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuYmF0CkBAIC0wLDAgKzEgQEAKK3RocmlmdC5leGUgLS1nZW4gY3BwIFNhbXBsZS50aHJpZnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5zaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE4ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoCkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9iYXNoCisKK1RIUklGVF9DT01QSUxFUj0uL3RocmlmdAorT1VUUFVUX0ZPTERFUj0kUFdECisKK2lmIFsgISAtZSAiJHtUSFJJRlRfQ09NUElMRVJ9IiBdCit0aGVuCisgICBUSFJJRlRfQ09NUElMRVI9dGhyaWZ0CisgICBjb21tYW5kIC12ICAke1RIUklGVF9DT01QSUxFUn0gPi9kZXYvbnVsbCAyPiYxCisgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgIGVjaG8gInRocmlmdCBjb21waWxlciBub3QgZm91bmQuIgorICAgICAgZWNobworICAgICAgZXhpdAorICAgZmkKK2ZpCisKKyR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgU2FtcGxlLnRocmlmdAorCitlY2hvCitlY2hvICJGaWxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGluIGdlbi1jcHAuIgorCitleGl0CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90cmFuc3BvcnQtc2FtcGxlLnNsbiBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90cmFuc3BvcnQtc2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZhMWVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuCkBAIC0wLDAgKzEsMjYgQEAKKz8KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJzZXJ2ZXIiLCAic2VydmVyXHNlcnZlci52Y3hwcm9qIiwgIns3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJjbGllbnQiLCAiY2xpZW50XGNsaWVudC52Y3hwcm9qIiwgIns4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTgzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKQEAgLTAsMCArMSw2MSBAQAorQXBhY2hlIFRocmlmdCBDZW50b3MgNi41IFZhZ3JhbnQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBkaXJlY3RvcnkgaXMgdGhlIFZhZ3JhbnQgcHJvamVjdCBkaXJlY3RvcnkgZm9yIEFwYWNoZSBUaHJpZnQgcnVubmluZyBvbiBDZW50b3MgNi41LiBUaGUgVmFncmFudGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgY29uZmlndXJlcyBhIFZhZ3JhbnQgcHJvdmlzaW9uZWQgVk0gbGF1bmNoZWQgdW5kZXIgVmlydHVhbEJveC4gVG8gdXNlIHRoaXMgcHJvamVjdCB5b3UgbXVzdCBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgVmlydHVhbEJveCBhbmQgVmFncmFudCBpbnN0YWxsZWQgKGluIHRoYXQgb3JkZXIpLiBUbyBydW4gdGhlIFZNLCBvcGVuIGEgc2hlbGwsIGNsb25lIEFwYWNoZSBUaHJpZnQsIGNoYW5nZSB0byB0aGlzIGRpcmVjdG9yeSBhbmQgZW50ZXIgdGhlIFZhZ3JhbnQgdXAgY29tbWFuZC4KKworICAgJCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKKyAgICQgY2QgdGhyaWZ0L2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41CisgICAkIHZhZ3JhbnQgdXAKKworVGhpcyB3aWxsIGRvd25sb2FkIGFuZCBsYXVuY2ggdGhlIGJhc2UgYm94IFZNIHVuZGVyIFZpcnR1YWxCb3ggYW5kIHJ1biB0aGUgQXBhY2hlIFRocmlmdCBwcm92aXNpb25pbmcgc2NyaXB0LiBUaGlzIHdpbGwgdGFrZSB1cCB0byBhbiBob3VyIGRlcGVuZGluZyBvbiB5b3VyIGhhcmR3YXJlIGFuZCBuZXR3b3JrLiBPbmNlIGNvbXBsZXRlIHlvdSBjYW4gbG9naW4gdG8gdGhlIGJveCB3aXRoIFZhZ3JhbnQgc3NoLiBUaGUgdGhyaWZ0IHNvdXJjZSB0cmVlIGZyb20geW91ciBob3N0IG9zIGlzIG1vdW50ZWQgYXQgL3RocmlmdC4KKworICAgJCB2YWdyYW50IHNzaAorICAgW3ZhZ3JhbnRAdGhyaWZ0IH5dJCBjZCAvdGhyaWZ0CisgICBbdmFncmFudEB0aHJpZnQgdGhyaWZ0XSQgY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24KKyAgIFRocmlmdCB2ZXJzaW9uIDx2ZXJzaW9uPgorCitUaGUgcHJvdmlzaW9uaW5nIHNjcmlwdCAoaW5zaWRlIHRoZSBWYWdyYW50ZmlsZSkgcnVucyAuL2Jvb3RzdHJhcC5zaCwgLi9jb25maWd1cmUsIG1ha2UgYW5kIG1ha2UgY2hlY2ssIGJ1dCBkb2VzIG5vdCBpbnN0YWxsIHRocmlmdC4gVG8gaW5zdGFsbCB0aHJpZnQgcnVuICJtYWtlIGluc3RhbGwiLgorCitUaGUgVmFncmFudCBiYXNlIGJveCB1c2VkIGhlcmUgaXMgYSBtaW5pbWFsIENlbnRvcyA2LjUgVmlydHVhbEJveCB3aXRoIDJHQiBSQU0gYW5kIDIgQ1BVcy4gRm9yIG1vcmUgVmFncmFudCBpbmZvcm1hdGlvbjogaHR0cHM6Ly93d3cudmFncmFudHVwLmNvbS4gQSBzdW1tYXJ5IG9mIHRoZSBiYXNlIGJveCBwcmVwYXJhdGlvbiBmb2xsb3dzOgorCityb290IHBhc3N3b3JkOiB2YWdyYW50CisKKyNDcmVhdGUgdGhlIHZhZ3JhbnQgdXNlciBhbmQgZ2l2ZSBpdCBzdWRvIHBlcm1pc3Npb24KK2FkZHVzZXIgdmFncmFudAorcGFzc3dkIHZhZ3JhbnQKK3Zpc3VkbyAgOiAgdmFncmFudCBBTEw9KEFMTCkgTk9QQVNTV0Q6IEFMTAorICAgICAgICAgICAjRGVmYXVsdHMgcmVxdWlyZXR0eQorCisjU2h1dCBkb3duIHRoZSBmaXJld2FsbCBhbmQgZGlzYWJsZSBpdAorc2VydmljZSBpcHRhYmxlcyBzdG9wCitjaGtjb25maWcgaXB0YWJsZXMgb2ZmCisKKyNTZXR1cCB0aGUgdmFncmFudCBzc2ggcHVibGljIGtleSB0byBhbGxvdyB2YWdyYW50IHRvIHNzaAorbWtkaXIgL2hvbWUvdmFncmFudC8uc3NoCitjaG1vZCA3MDAgL2hvbWUvdmFncmFudC8uc3NoCitjZCAvaG9tZS92YWdyYW50Ly5zc2gKK3dnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAnaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9taXRjaGVsbGgvdmFncmFudC9tYXN0ZXIva2V5cy92YWdyYW50LnB1YicgLU8gYXV0aG9yaXplZF9rZXlzCitjaG1vZCA2MDAgL2hvbWUvdmFncmFudC8uc3NoL2F1dGhvcml6ZWRfa2V5cworY2hvd24gLVIgdmFncmFudCAvaG9tZS92YWdyYW50Ly5zc2gKKworI0luc3RhbGwgRVBFTCAoRXh0cmEgUGFja2FnZXMgZm9yIEVudGVycHJpc2UgTGludXgpIGJ1dCBwcm90ZWN0IHRoZSBiYXNlCisjcmVwb3NpdG9yaWVzIHNvIHRoYXQgRVBFTCBkb2VzIG5vdCBtYXNrIGJhc2UgcGFja2FnZXMKK3l1bSAteSBpbnN0YWxsIHl1bS1wbHVnaW4tcHJvdGVjdGJhc2UKK3JwbSAtVXZoIGh0dHA6Ly9kb3dubG9hZC5mZWRvcmFwcm9qZWN0Lm9yZy9wdWIvZXBlbC82L2kzODYvZXBlbC1yZWxlYXNlLTYtOC5ub2FyY2gucnBtCisKKyNJbnN0YWxsIHBlcmwsIGR5bmFtaWMga2VybmVsIG1vZHVsZXMsIGRldiB0b29scyBhbmQga2VybmVsIGhlYWRlcnMgdG8gc3VwcG9ydAorI1ZpcnR1YWwgYm94IGFkZGl0aW9ucworeXVtIC15IGluc3RhbGwgcGVybAoreXVtIC15IC0tZW5hYmxlcmVwbyBlcGVsIGluc3RhbGwgZGttcworeXVtIC15IGdyb3VwaW5zdGFsbCAiRGV2ZWxvcG1lbnQgVG9vbHMiCit5dW0gLXkgaW5zdGFsbCBrZXJuZWwtZGV2ZWwKKworI1VwZGF0ZSBldmVyeXRoaW5nIGFuZCByZWJvb3QKK3l1bSB1cGRhdGUKK3JlYm9vdAorCisjSW5zdGFsbCB0aGUgVmlydHVhbEJveCBHdWVzdCBhZGRpdGlvbnMgKHVzaW5nIFZpcnR1YWxCb3ggaXNvKQorbW91bnQgL2Rldi9jZHJvbSAvbW50CisvbW50L1ZCb3hMaW51eEFkZGl0aW9ucy5ydW4KK3Vtb3VudCAvbW50CisKK1NlZSB0aGUgVmFncmFudGZpbGUgZm9yIGZ1cnRoZXIgZGV0YWlscwpkaWZmIC0tZ2l0IGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEyMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKQEAgLTAsMCArMSwyNzQgQEAKKyMgLSotIG1vZGU6IHJ1YnkgLSotCisjIHZpOiBzZXQgZnQ9cnVieSA6CisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFQQUNIRSBUSFJJRlQgUFJPVklTSU9OSU5HIFNDUklQVAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJhc2UgQ2VudG9zIDYuNQorIyBWYWdyYW50IGJveCBmb3IgQXBhY2hlIFRocmlmdCBjb21waWxlciBhbmQgbGliIGJ1aWxkcy4KKyMgVGhlIGJhc2UgYm94IGlzIENlbnRvcyA2LjUgd2l0aCBubyBhZGRpdGlvbmFsIHBhY2thZ2VzCisjIGV4Y2VwdCB0aG9zZSByZXF1aXJlZCB0byBzdXBwb3J0IFZpcnR1YWxCb3ggR3Vlc3QgdG9vbHM6CisjIHBlcmwsIGRrbXMsIGtlcm5lbC1kZXZlbCBhbmQgdGhlICJEZXZlbG9wbWVudCBUb29scyIgZ3JvdXAuCisjIFRoZSBlcGVsIHJlcG8gd2FzIGFsc28gYWRkZWQgYWxvbmcgd2l0aCB0aGUKKyMgeXVtLXBsdWdpbi1wcm90ZWN0YmFzZSBwYWNrYWdlIHRvIHByZWZlciBiYXNlIHJlcG8gcGFja2FnZXMuCisjIFRoZSBzY3JpcHQgYmVsb3cgcHJvdmlzaW9ucyBBTEwgbGFuZ3VhZ2VzLiBUaGlzIHdpbGwgdGFrZQorIyB0aW1lLiBZb3UgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBidWlsZCB0aW1lIGJ5IGNvbW1lbnRpbmcKKyMgb3V0IHRoZSBMSUIgcHJvdmlzaW9uaW5nIGZvciB1bmVlZGVkIGxhbmd1YWdlIGxpYnJhcmllcy4KKyMgRXhwZWN0IGZ1bGwgcHJvdmlzaW9uaW5nIHRvIHRha2UgMzAgbWludXRlcyBvbiBhIGZhc3QKKyMgbWFjaGluZSB3aXRoIGFuIGV4Y2VsbGVudCBJbnRlcm5ldCBjb25uZWN0aW9uIChhbmQgYW5vdGhlcgorIyAxNSBtaW51dGVzIGZvciB0aGUgYnVpbGQpLgorIworIyBNYWNoaW5lIGFjY291bnRzOgorIyAtIFVzZXI6IHZhZ3JhbnQvdmFncmFudAorIyAtIEFkbWluOiByb290L3ZhZ3JhbnQKKyMgVmFncmFudCBwdWJsaWMgc3NoIGtleSBhbHNvIGluc3RhbGxlZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uX2JlZ2luCisKKyMgQXBhY2hlIFRocmlmdCBjb21waWxlciBkZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI2luc3RhbGwgYW4gdXBkYXRlZCBhdXRvY29uZgord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9jb25mL2F1dG9jb25mLTIuNjkudGFyLmd6Cit0YXIgeHZmIGF1dG9jb25mLTIuNjkudGFyLmd6CitjZCBhdXRvY29uZi0yLjY5CisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworI2luc3RhbGwgYW4gdXBkYXRlZCBhdXRvbWFrZQord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9tYWtlL2F1dG9tYWtlLTEuMTQudGFyLmd6Cit0YXIgeHZmIGF1dG9tYWtlLTEuMTQudGFyLmd6CitjZCBhdXRvbWFrZS0xLjE0CisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworI2luc3RhbGwgYW4gdXBkYXRlZCBiaXNvbgord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2Jpc29uL2Jpc29uLTIuNS4xLnRhci5negordGFyIHh2ZiBiaXNvbi0yLjUuMS50YXIuZ3oKK2NkIGJpc29uLTIuNS4xCisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworIyBDKys5OCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSAteSBpbnN0YWxsIGxpYmV2ZW50LWRldmVsIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbAorCisjSW5zdGFsbCBhbiB1cGRhdGVkIEJvb3N0IGxpYnJhcnkKK3dnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjU1LjAvYm9vc3RfMV81NV8wLnRhci5negordGFyIHh2ZiBib29zdF8xXzU1XzAudGFyLmd6CitjZCBib29zdF8xXzU1XzAKKy4vYm9vdHN0cmFwLnNoCitzdWRvIC4vYjIgaW5zdGFsbAorCisjIEphdmEgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBhbnQganVuaXQgYW50LW5vZGVwcyBhbnQtanVuaXQgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisKKyMgUHl0aG9uIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcHl0aG9uLWRldmVsIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi10d2lzdGVkCisKKyMgUnVieSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHJ1YnkgcnVieS1kZXZlbCBydWJ5Z2Vtcworc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBOb2RlLmpzIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbm9kZWpzIG5vZGVqcy1kZXZlbCBucG0KKworIyBQZXJsIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcGVybC1CaXQtVmVjdG9yIHBlcmwtQ2xhc3MtQWNjZXNzb3IgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgcGVybC1UZXN0LVNpbXBsZQorCisjIFBIUCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHBocCBwaHAtZGV2ZWwgcGhwLXBlYXIgcmUyYworCisjIEdMaWJDIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKKworIyBFcmxhbmcgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBlcmxhbmcta2VybmVsIGVybGFuZy1lcnRzIGVybGFuZy1zdGRsaWIgZXJsYW5nLWV1bml0IGVybGFuZy1yZWJhcgorCisjIEx1YSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGx1YS1kZXZlbAorCisjIEdvIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgZ29sYW5nIGdvbGFuZy1wa2ctbGludXgtYW1kNjQKKworIyBDIyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IG1vbm8tY29yZSBtb25vLWRldmVsIG1vbm8td2ViLWRldmVsIG1vbm8tZXh0cmFzIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG1pbmd3MzItbnNpcworCisjIEhhc2tlbGwgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIword2dldCBodHRwOi8vc2hlcmtpbi5qdXN0aHViLm9yZy9lbDYvUlBNUy94ODZfNjQvanVzdGh1Yi1yZWxlYXNlLTIuMC00LjAuZWw2Lng4Nl82NC5ycG0KK3N1ZG8gcnBtIC1pdmgganVzdGh1Yi1yZWxlYXNlLTIuMC00LjAuZWw2Lng4Nl82NC5ycG0KK3N1ZG8geXVtIC15IGluc3RhbGwgaGFza2VsbAorc3VkbyBjYWJhbCB1cGRhdGUKK3N1ZG8gY2FiYWwgaW5zdGFsbCBjYWJhbC1pbnN0YWxsCisKKyMgQnVpbGQgYW5kIFRlc3QgQXBhY2hlIFRocmlmdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGF0ZSA+IC9ldGMvdmFncmFudC5wcm92aXNpb25fZW5kCitlY2hvICJTdGFydGluZyBBcGFjaGUgVGhyaWZ0IGJ1aWxkLi4uIgorY2QgL3RocmlmdAorc2ggYm9vdHN0cmFwLnNoCisKKyMgQXQgdGhlIHRpbWUgb2YgdGhpcyBmaWxlJ3MgY3JlYXRpb24gUnVieSwgUHl0aG9uLCBHbyBhbmQgTHVhIGZhaWwKKyMgdGhlaXIgdW5pdCB0ZXN0cyBpbiB0aGlzIGVudmlyb25tZW50LiBUbyBidWlsZCBhbmQgdGVzdCBhbnkgb2YgdGhlc2UKKyMgbGlicmFyaWVzIHVuY29tbWVudCB0aGUgYXBwcm9wcmlhdGUgLS13aXRob3V0IHN3aXRjaGVzIGJlbG93LgorCitzaCBjb25maWd1cmUgLS13aXRob3V0LXJ1YnkgLS13aXRob3V0LWdvIC0td2l0aG91dC1sdWEgLS13aXRob3V0LXB5dGhvbgorbWFrZQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCB0ZXN0cy4uLiIKK21ha2UgY2hlY2sKK2VjaG8gIkZpbmlzaGVkIGJ1aWxkaW5nIGFuZCB0ZXN0aW5nIEFwYWNoZSBUaHJpZnQuIgorZWNobyAnVXNlICJtYWtlIGluc3RhbGwiIHRvIGluc3RhbGwgdGhlIGNvbXBpbGVyIGFuZCBsaWJyYXJpZXMuJworZGF0ZSA+IC9ldGMvdmFncmFudC5tYWtlX2VuZAorCitTQ1JJUFQKKworVmFncmFudC5jb25maWd1cmUoIjIiKSBkbyB8Y29uZmlnfAorICAjIEV2ZXJ5IFZhZ3JhbnQgdmlydHVhbCBlbnZpcm9ubWVudCByZXF1aXJlcyBhIGJveCB0byBidWlsZCBvZmYgb2YuCisgICMjIyMjIENlbnRvcyA2LjUgbWluaW1hbCBzeXN0ZW0gd2l0aCBWaXJ0dWFsQm94IEd1ZXN0IEFkZGl0aW9ucworICAjIyMjIyBCb3ggbWFpbnRhaW5lZCBieSByYUBhcGFjaGUub3JnLCBzZWUgUkVBRE1FLm1kIGZvciBib3ggY29uZmlnCisgIGNvbmZpZy52bS5ib3ggPSAiUmFuZHlBYmVybmV0aHkvdGhyaWZ0LWNlbnRvcy02LjUtNjQiCisKKyAgIyBEaXNhYmxlIGF1dG9tYXRpYyBib3ggdXBkYXRlIGNoZWNraW5nLiBJZiB5b3UgZGlzYWJsZSB0aGlzLCB0aGVuCisgICMgYm94ZXMgd2lsbCBvbmx5IGJlIGNoZWNrZWQgZm9yIHVwZGF0ZXMgd2hlbiB0aGUgdXNlciBydW5zCisgICMgYHZhZ3JhbnQgYm94IG91dGRhdGVkYC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCisgICMjIyMjIFRoaXMgYm94IHdpbGwgbmV2ZXIgY2hhbmdlCisgIGNvbmZpZy52bS5ib3hfY2hlY2tfdXBkYXRlID0gZmFsc2UKKworICAjIENyZWF0ZSBhIGZvcndhcmRlZCBwb3J0IG1hcHBpbmcgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byBhIHNwZWNpZmljIHBvcnQKKyAgIyB3aXRoaW4gdGhlIG1hY2hpbmUgZnJvbSBhIHBvcnQgb24gdGhlIGhvc3QgbWFjaGluZS4gSW4gdGhlIGV4YW1wbGUgYmVsb3csCisgICMgYWNjZXNzaW5nICJsb2NhbGhvc3Q6ODA4MCIgd2lsbCBhY2Nlc3MgcG9ydCA4MCBvbiB0aGUgZ3Vlc3QgbWFjaGluZS4KKyAgIyBjb25maWcudm0ubmV0d29yayAiZm9yd2FyZGVkX3BvcnQiLCBndWVzdDogODAsIGhvc3Q6IDgwODAKKworICAjIENyZWF0ZSBhIHByaXZhdGUgbmV0d29yaywgd2hpY2ggYWxsb3dzIGhvc3Qtb25seSBhY2Nlc3MgdG8gdGhlIG1hY2hpbmUKKyAgIyB1c2luZyBhIHNwZWNpZmljIElQLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJwcml2YXRlX25ldHdvcmsiLCBpcDogIjE5Mi4xNjguMzMuMTAiCisKKyAgIyBDcmVhdGUgYSBwdWJsaWMgbmV0d29yaywgd2hpY2ggZ2VuZXJhbGx5IG1hdGNoZWQgdG8gYnJpZGdlZCBuZXR3b3JrLgorICAjIEJyaWRnZWQgbmV0d29ya3MgbWFrZSB0aGUgbWFjaGluZSBhcHBlYXIgYXMgYW5vdGhlciBwaHlzaWNhbCBkZXZpY2Ugb24KKyAgIyB5b3VyIG5ldHdvcmsuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInB1YmxpY19uZXR3b3JrIgorCisgICMgSWYgdHJ1ZSwgdGhlbiBhbnkgU1NIIGNvbm5lY3Rpb25zIG1hZGUgd2lsbCBlbmFibGUgYWdlbnQgZm9yd2FyZGluZy4KKyAgIyBEZWZhdWx0IHZhbHVlOiBmYWxzZQorICAjIGNvbmZpZy5zc2guZm9yd2FyZF9hZ2VudCA9IHRydWUKKworICAjIFNoYXJlIGFuIGFkZGl0aW9uYWwgZm9sZGVyIHRvIHRoZSBndWVzdCBWTS4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzCisgICMgdGhlIHBhdGggb24gdGhlIGhvc3QgdG8gdGhlIGFjdHVhbCBmb2xkZXIuIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgZ3Vlc3QgdG8gbW91bnQgdGhlIGZvbGRlci4gQW5kIHRoZSBvcHRpb25hbCB0aGlyZAorICAjIGFyZ3VtZW50IGlzIGEgc2V0IG9mIG5vbi1yZXF1aXJlZCBvcHRpb25zLgorICAjIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi9kYXRhIiwgIi92YWdyYW50X2RhdGEiCisgICMjIyMjIEJ5IGNvbnZlbnRpb24gdGhlIHRocmlmdCBzb3VyY2UgdHJlZSBpcyBtYXBwZWQgdG8gL3RocmlmdAorICBjb25maWcudm0uc3luY2VkX2ZvbGRlciAiLi4vLi4vLi4vIiwgIi90aHJpZnQiCisKKyAgIyBQcm92aWRlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIHNvIHlvdSBjYW4gZmluZS10dW5lIHZhcmlvdXMKKyAgIyBiYWNraW5nIHByb3ZpZGVycyBmb3IgVmFncmFudC4gVGhlc2UgZXhwb3NlIHByb3ZpZGVyLXNwZWNpZmljIG9wdGlvbnMuCisgICMjIyMjIFRoZSBtYWNoaW5lIG5lZWRzIDIgQ1BVcyBhbmQgMkdCIFJBTSBmb3IgcmVhc29uYWJsZSBwZXJmb3JtYW5jZQorICBjb25maWcudm0ucHJvdmlkZXIgInZpcnR1YWxib3giIGRvIHx2YnwKKyAgICB2Yi5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tbWVtb3J5IiwgIjIwNDgiXQorICAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1jcHVzIiwgIjIiXQorICBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBDRkVuZ2luZS4gQ0ZFbmdpbmUgQ29tbXVuaXR5IHBhY2thZ2VzIGFyZQorICAjIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkLiBGb3IgZXhhbXBsZSwgY29uZmlndXJlIHRoZSBob3N0IGFzIGEKKyAgIyBwb2xpY3kgc2VydmVyIGFuZCBvcHRpb25hbGx5IGEgcG9saWN5IGZpbGUgdG8gcnVuOgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2ZlbmdpbmUiIGRvIHxjZnwKKyAgIyAgIGNmLmFtX3BvbGljeV9odWIgPSB0cnVlCisgICMgICAjIGNmLnJ1bl9maWxlID0gIm1vdGQuY2YiCisgICMgZW5kCisgICMKKyAgIyBZb3UgY2FuIGFsc28gY29uZmlndXJlIGFuZCBib290c3RyYXAgYSBjbGllbnQgdG8gYW4gZXhpc3RpbmcKKyAgIyBwb2xpY3kgc2VydmVyOgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2ZlbmdpbmUiIGRvIHxjZnwKKyAgIyAgIGNmLnBvbGljeV9zZXJ2ZXJfYWRkcmVzcyA9ICIxMC4wLjIuMTUiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggUHVwcGV0IHN0YW5kIGFsb25lLiAgUHVwcGV0IG1hbmlmZXN0cworICAjIGFyZSBjb250YWluZWQgaW4gYSBkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlLgorICAjIFlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBtYW5pZmVzdHMgZGlyZWN0b3J5IGFuZCBhIG1hbmlmZXN0IGluCisgICMgdGhlIGZpbGUgZGVmYXVsdC5wcCBpbiB0aGUgbWFuaWZlc3RzX3BhdGggZGlyZWN0b3J5LgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAicHVwcGV0IiBkbyB8cHVwcGV0fAorICAjICAgcHVwcGV0Lm1hbmlmZXN0c19wYXRoID0gIm1hbmlmZXN0cyIKKyAgIyAgIHB1cHBldC5tYW5pZmVzdF9maWxlICA9ICJkZWZhdWx0LnBwIgorICAjIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIGNoZWYgc29sbywgc3BlY2lmeWluZyBhIGNvb2tib29rcyBwYXRoLCByb2xlcworICAjIHBhdGgsIGFuZCBkYXRhX2JhZ3MgcGF0aCAoYWxsIHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUpLCBhbmQgYWRkaW5nCisgICMgc29tZSByZWNpcGVzIGFuZC9vciByb2xlcy4KKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNoZWZfc29sbyIgZG8gfGNoZWZ8CisgICMgICBjaGVmLmNvb2tib29rc19wYXRoID0gIi4uL215LXJlY2lwZXMvY29va2Jvb2tzIgorICAjICAgY2hlZi5yb2xlc19wYXRoID0gIi4uL215LXJlY2lwZXMvcm9sZXMiCisgICMgICBjaGVmLmRhdGFfYmFnc19wYXRoID0gIi4uL215LXJlY2lwZXMvZGF0YV9iYWdzIgorICAjICAgY2hlZi5hZGRfcmVjaXBlICJteXNxbCIKKyAgIyAgIGNoZWYuYWRkX3JvbGUgIndlYiIKKyAgIworICAjICAgIyBZb3UgbWF5IGFsc28gc3BlY2lmeSBjdXN0b20gSlNPTiBhdHRyaWJ1dGVzOgorICAjICAgY2hlZi5qc29uID0geyBteXNxbF9wYXNzd29yZDogImZvbyIgfQorICAjIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIGNoZWYgc2VydmVyLCBzcGVjaWZ5aW5nIHRoZSBjaGVmIHNlcnZlciBVUkwsCisgICMgYW5kIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGtleSAocmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSkuCisgICMKKyAgIyBUaGUgT3BzY29kZSBQbGF0Zm9ybSB1c2VzIEhUVFBTLiBTdWJzdGl0dXRlIHlvdXIgb3JnYW5pemF0aW9uIGZvcgorICAjIE9SR05BTUUgaW4gdGhlIFVSTCBhbmQgdmFsaWRhdGlvbiBrZXkuCisgICMKKyAgIyBJZiB5b3UgaGF2ZSB5b3VyIG93biBDaGVmIFNlcnZlciwgdXNlIHRoZSBhcHByb3ByaWF0ZSBVUkwsIHdoaWNoIG1heSBiZQorICAjIEhUVFAgaW5zdGVhZCBvZiBIVFRQUyBkZXBlbmRpbmcgb24geW91ciBjb25maWd1cmF0aW9uLiBBbHNvIGNoYW5nZSB0aGUKKyAgIyB2YWxpZGF0aW9uIGtleSB0byB2YWxpZGF0aW9uLnBlbS4KKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNoZWZfY2xpZW50IiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY2hlZl9zZXJ2ZXJfdXJsID0gImh0dHBzOi8vYXBpLm9wc2NvZGUuY29tL29yZ2FuaXphdGlvbnMvT1JHTkFNRSIKKyAgIyAgIGNoZWYudmFsaWRhdGlvbl9rZXlfcGF0aCA9ICJPUkdOQU1FLXZhbGlkYXRvci5wZW0iCisgICMgZW5kCisgICMKKyAgIyBJZiB5b3UncmUgdXNpbmcgdGhlIE9wc2NvZGUgcGxhdGZvcm0sIHlvdXIgdmFsaWRhdG9yIGNsaWVudCBpcworICAjIE9SR05BTUUtdmFsaWRhdG9yLCByZXBsYWNpbmcgT1JHTkFNRSB3aXRoIHlvdXIgb3JnYW5pemF0aW9uIG5hbWUuCisgICMKKyAgIyBJZiB5b3UgaGF2ZSB5b3VyIG93biBDaGVmIFNlcnZlciwgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBjbGllbnQgbmFtZSBpcworICAjIGNoZWYtdmFsaWRhdG9yLCB1bmxlc3MgeW91IGNoYW5nZWQgdGhlIGNvbmZpZ3VyYXRpb24uCisgICMKKyAgIyAgIGNoZWYudmFsaWRhdGlvbl9jbGllbnRfbmFtZSA9ICJPUkdOQU1FLXZhbGlkYXRvciIKKworICAjIyMjIyBSdW4gdGhlIEFwYWNoZSBUaHJpZnQgcHJvdmlzaW9uaW5nIHNjcmlwdCAoZGVjbGFyZWQgYWJvdmUpCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9NYWtlZmlsZSBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzk4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACitUSFJJRlQgPSB0aHJpZnQKKworQ1hYRkxBR1MgKz0gLWczIC1PMAorCitHRU5OQU1FUyA9IFN0b3JhZ2Ugc3RvcmFnZV90eXBlcworR0VOSEVBREVSUyA9ICQoYWRkc3VmZml4IC5oLCAkKEdFTk5BTUVTKSkKK0dFTlNSQ1MgPSAkKGFkZHN1ZmZpeCAuY3BwLCAkKEdFTk5BTUVTKSkKK0dFTk9CSlMgPSAkKGFkZHN1ZmZpeCAubywgJChHRU5OQU1FUykpCisKK1BZTElCUyA9IHN0b3JhZ2UvX19pbml0X18ucHkKKworUFJPR1MgPSAgdGVzdC1jbGllbnQgdGVzdC1zZXJ2ZXIgdGVzdC1zZW5kZXIgdGVzdC1yZWNlaXZlcgorCithbGw6ICQoUFlMSUJTKSAkKFBST0dTKQorCit0ZXN0LWNsaWVudDogdGVzdC1jbGllbnQubyBUWm1xQ2xpZW50Lm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAordGVzdC1zZXJ2ZXI6IHRlc3Qtc2VydmVyLm8gVFptcVNlcnZlci5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKK3Rlc3Qtc2VuZGVyOiB0ZXN0LXNlbmRlci5vIFRabXFDbGllbnQubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0Cit0ZXN0LXJlY2VpdmVyOiB0ZXN0LXJlY2VpdmVyLm8gVFptcVNlcnZlci5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKKwordGVzdC1jbGllbnQubyB0ZXN0LXNlcnZlci5vIHRlc3Qtc2VuZGVyLm8gdGVzdC1yZWNlaXZlci5vOiAkKEdFTlNSQ1MpCisKK3N0b3JhZ2UvX19pbml0X18ucHk6IHN0b3JhZ2UudGhyaWZ0CisJJChSTSkgJChkaXIgJEApCisJJChUSFJJRlQpIC0tZ2VuIHB5ICQ8CisJbXYgZ2VuLXB5LyQoZGlyICRAKSAuCisKKyQoR0VOU1JDUyk6IHN0b3JhZ2UudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCW12ICQoYWRkcHJlZml4IGdlbi1jcHAvLCAkKEdFTlNSQ1MpICQoR0VOSEVBREVSUykpIC4KKworY2xlYW46CisJJChSTSkgLXIgKi5vICQoUFJPR1MpIHN0b3JhZ2UgJChHRU5TUkNTKSAkKEdFTkhFQURFUlMpCisKKy5QSE9OWTogY2xlYW4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1JFQURNRS5tZCBiL2NvbnRyaWIvemVyb21xL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBiNWJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzAgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvbWUgZ2x1ZSBjb2RlIHRvIGFsbG93IFRocmlmdCBSUENzIHRvIGJlIHNlbnQgb3ZlcgorWmVyb01RLiAgSW5jbHVkZWQgYXJlIGNsaWVudCBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgUHl0aG9uIGFuZCBDKyssCithbG9uZyB3aXRoIGEgc2ltcGxlIGRlbW8gaW50ZXJmYWNlICh3aXRoIGEgd29ya2luZyBjbGllbnQgYW5kIHNlcnZlciBmb3IKK2VhY2ggbGFuZ3VhZ2UpLgorCitUaHJpZnQgd2FzIGRlc2lnbmVkIGZvciBzdHJlYW0tYmFzZWQgaW50ZXJmYWNlcyBsaWtlIFRDUCwgYnV0IFplcm9NUSBpcworbWVzc2FnZS1iYXNlZCwgc28gdGhlcmUgaXMgYSBzbWFsbCBpbXBlZGFuY2UgbWlzbWF0Y2guICBNb3N0IG9mIGlzc3VlcyBhcmUKK2hpZGRlbiBmcm9tIGRldmVsb3BlcnMsIGJ1dCBvbmUgY2Fubm90IGJlOiBvbmV3YXkgbWV0aG9kcyBoYXZlIHRvIGJlIGhhbmRsZWQKK2RpZmZlcmVudGx5IGZyb20gbm9ybWFsIG9uZXMuICBaZXJvTVEgcmVxdWlyZXMgdGhlIG1lc3NhZ2luZyBwYXR0ZXJuIHRvIGJlCitkZWNsYXJlZCBhdCBzb2NrZXQgY3JlYXRpb24gdGltZSwgc28gYW4gYXBwbGljYXRpb24gY2Fubm90IGRlY2lkZSBvbiBhCittZXNzYWdlLWJ5LW1lc3NhZ2UgYmFzaXMgd2hldGhlciB0byBzZW5kIGEgcmVwbHkuICBUaGVyZWZvcmUsIHRoaXMKK2ltcGxlbWVudGF0aW9uIG1ha2VzIGl0IHRoZSBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBaTVFfUkVRCitzb2NrZXRzIGFyZSB1c2VkIGZvciBub3JtYWwgbWV0aG9kcyBhbmQgWk1RX0RPV05TVFJFQU0gc29ja2V0cyBhcmUgdXNlZCBmb3IKK29uZXdheSBtZXRob2RzLiAgSW4gYWRkaXRpb24sIHNlcnZpY2VzIHRoYXQgZXhwb3NlIGJvdGggdHlwZXMgb2YgbWV0aG9kcworaGF2ZSB0byBleHBvc2UgdHdvIHNlcnZlcnMgKG9uIHR3byBwb3J0cyksIGJ1dCB0aGUgVFptcU11bHRpU2VydmVyIG1ha2VzIGl0CitlYXN5IHRvIHJ1biB0aGUgdHdvIHRvZ2V0aGVyIGluIHRoZSBzYW1lIHRocmVhZC4KKworVGhpcyBjb2RlIHdhcyB0ZXN0ZWQgd2l0aCBaZXJvTVEgMi4wLjcgYW5kIHB5em1xIGFmYWJiYjViOWJkMy4KKworVG8gYnVpbGQsIHNpbXBseSBpbnN0YWxsIFRocmlmdCBhbmQgWmVyb01RLCB0aGVuIHJ1biAibWFrZSIuICBJZiB5b3UgaW5zdGFsbAoraW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24sIG1ha2Ugc3VyZSB0byBzZXQgVEhSSUZUIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKK1RocmlmdCBjb2RlIGdlbmVyYXRvciBvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUgYW5kIFBLR19DT05GSUdfUEFUSCB0byBhIHBhdGgKK3RoYXQgaW5jbHVkZXMgdGhlIHBrZ2NvbmZpZyBmaWxlcyBmb3IgYm90aCBUaHJpZnQgYW5kIFplcm9NUS4gIFRoZSB0ZXN0CitzZXJ2ZXJzIHRha2Ugbm8gYXJndW1lbnRzLiAgUnVuIHRoZSB0ZXN0IGNsaWVudHMgd2l0aCBubyBhcmd1bWVudHMgdG8KK3JldHJpZXZlIHRoZSBzdG9yZWQgdmFsdWUgb3Igd2l0aCBhbiBpbnRlZ2VyIGFyZ3VtZW50IHRvIGluY3JlbWVudCBpdCBieQordGhhdCBhbW91bnQuCisKK1RoaXMgY29kZSBpcyBub3QgcXVpdGUgd2hhdCBJIHdvdWxkIGNvbnNpZGVyIHByb2R1Y3Rpb24tcmVhZHkuICBJdCBkb2Vzbid0CitzdXBwb3J0IGFsbCBvZiB0aGUgbm9ybWFsIGhvb2tzIGludG8gVGhyaWZ0LCBhbmQgaXRzIHBlcmZvcm1hbmNlIGlzCitzdWItb3B0aW1hbCBiZWNhdXNlIGl0IGRvZXMgc29tZSB1bm5lY2Vzc2FyeSBjb3B5aW5nLgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI3OGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVFptcUNsaWVudC5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VpbnQzMl90IFRabXFDbGllbnQ6OnJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAocmJ1Zl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7CisgICAgKHZvaWQpc29ja18ucmVjdigmbXNnXyk7CisgICAgcmJ1Zl8ucmVzZXRCdWZmZXIoKHVpbnQ4X3QqKW1zZ18uZGF0YSgpLCBtc2dfLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIHJidWZfLnJlYWQoYnVmLCBsZW4pOworfQorCit2b2lkIFRabXFDbGllbnQ6OndyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgcmV0dXJuIHdidWZfLndyaXRlKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgVFptcUNsaWVudDo6d3JpdGVFbmQoKSB7CisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgd2J1Zl8uZ2V0QnVmZmVyKCZidWYsICZzaXplKTsKKyAgem1xOjptZXNzYWdlX3QgbXNnKHNpemUpOworICBzdGQ6Om1lbWNweShtc2cuZGF0YSgpLCBidWYsIHNpemUpOworICAodm9pZClzb2NrXy5zZW5kKG1zZyk7CisgIHdidWZfLnJlc2V0QnVmZmVyKHRydWUpOworICByZXR1cm4gc2l6ZTsKK30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaCBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjE2ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWk1RQ0xJRU5UX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTVFDTElFTlRfSF8gMQorCisjaW5jbHVkZSA8em1xLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRabXFDbGllbnQgOiBwdWJsaWMgVFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUWm1xQ2xpZW50KHptcTo6Y29udGV4dF90JiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmRwb2ludCwgaW50IHR5cGUpCisgICAgOiBzb2NrXyhjdHgsIHR5cGUpCisgICAgLCBlbmRwb2ludF8oZW5kcG9pbnQpCisgICAgLCB3YnVmXygpCisgICAgLCByYnVmXygpCisgICAgLCBtc2dfKCkKKyAgICAsIHptcV90eXBlXyh0eXBlKQorICB7fQorCisgIHZvaWQgb3BlbigpIHsKKyAgICBpZih6bXFfdHlwZV8gPT0gWk1RX1BVQikgeworICAgICAgc29ja18uYmluZChlbmRwb2ludF8uY19zdHIoKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc29ja18uY29ubmVjdChlbmRwb2ludF8uY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHVpbnQzMl90IHdyaXRlRW5kKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHptcTo6c29ja2V0X3Qgc29ja187CisgIHN0ZDo6c3RyaW5nIGVuZHBvaW50XzsKKyAgVE1lbW9yeUJ1ZmZlciB3YnVmXzsKKyAgVE1lbW9yeUJ1ZmZlciByYnVmXzsKKyAgem1xOjptZXNzYWdlX3QgbXNnXzsKKyAgaW50IHptcV90eXBlXzsKK307CisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTVFDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZDYwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW1wb3J0IHptcQorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorCisKK2NsYXNzIFRabXFDbGllbnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6CisgICAgICAgIHNlbGYuX3NvY2sgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKKyAgICAgICAgc2VsZi5fZW5kcG9pbnQgPSBlbmRwb2ludAorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY29ubmVjdChzZWxmLl9lbmRwb2ludCkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fcmVhZF9tZXNzYWdlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQorCisgICAgZGVmIF9yZWFkX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhtc2cpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9zb2NrLnNlbmQobXNnKQorCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmCisKKyAgICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1ZgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY2MGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVFptcVNlcnZlci5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKKworYm9vbCBUWm1xU2VydmVyOjpzZXJ2ZU9uZShpbnQgcmVjdl9mbGFncykgeworICB6bXE6Om1lc3NhZ2VfdCBtc2c7CisgIGJvb2wgcmVjZWl2ZWQgPSBzb2NrXy5yZWN2KCZtc2csIHJlY3ZfZmxhZ3MpOworICBpZiAoIXJlY2VpdmVkKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKHVpbnQ4X3QqKW1zZy5kYXRhKCksIG1zZy5zaXplKCkpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sKAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkpOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2woCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIpOworCisgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOworCisgIGlmICh6bXFfdHlwZV8gPT0gWk1RX1JFUCkgeworICAgIHVpbnQ4X3QqIGJ1ZjsKKyAgICB1aW50MzJfdCBzaXplOworICAgIG91dHB1dFRyYW5zcG9ydC0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKKyAgICBtc2cucmVidWlsZChzaXplKTsKKyAgICBzdGQ6Om1lbWNweShtc2cuZGF0YSgpLCBidWYsIHNpemUpOworICAgICh2b2lkKXNvY2tfLnNlbmQobXNnKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQgVFptcU11bHRpU2VydmVyOjpzZXJ2ZU9uZShsb25nIHRpbWVvdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8em1xOjpwb2xsaXRlbV90PiBpdGVtcyhzZXR1cFBvbGwoKSk7CisgIHNlcnZlQWN0aXZlKGl0ZW1zLmdldCgpLCB0aW1lb3V0KTsKK30KKworCit2b2lkIFRabXFNdWx0aVNlcnZlcjo6c2VydmVGb3JldmVyKCkgeworICBib29zdDo6c2NvcGVkX3B0cjx6bXE6OnBvbGxpdGVtX3Q+IGl0ZW1zKHNldHVwUG9sbCgpKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzZXJ2ZUFjdGl2ZShpdGVtcy5nZXQoKSwgLTEpOworICB9Cit9CisKKworem1xOjpwb2xsaXRlbV90KiBUWm1xTXVsdGlTZXJ2ZXI6OnNldHVwUG9sbCgpIHsKKyAgem1xOjpwb2xsaXRlbV90KiBpdGVtcyA9IG5ldyB6bXE6OnBvbGxpdGVtX3Rbc2VydmVyc18uc2l6ZSgpXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzXy5zaXplKCk7ICsraSkgeworICAgIGl0ZW1zW2ldLnNvY2tldCA9IHNlcnZlcnNfW2ldLT5nZXRTb2NrZXQoKTsKKyAgICBpdGVtc1tpXS5ldmVudHMgPSBaTVFfUE9MTElOOworICB9CisgIHJldHVybiBpdGVtczsKK30KKwordm9pZCBUWm1xTXVsdGlTZXJ2ZXI6OnNlcnZlQWN0aXZlKHptcTo6cG9sbGl0ZW1fdCogaXRlbXMsIGxvbmcgdGltZW91dCkgeworICBpbnQgcmMgPSB6bXE6OnBvbGwoaXRlbXMsIHNlcnZlcnNfLnNpemUoKSwgdGltZW91dCk7CisgIGlmIChyYyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoKGl0ZW1zW2ldLnJldmVudHMgJiBaTVFfUE9MTElOKSAhPSAwKSB7CisgICAgICAvLyBTaG91bGQgd2UgcGFzcyBaTVFfTk9CTE9DSyBoZXJlIHRvIGJlIHNhZmU/CisgICAgICBzZXJ2ZXJzX1tpXS0+c2VydmVPbmUoKTsKKyAgICB9CisgIH0KK30KKworCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZDEzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8em1xLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKKworY2xhc3MgVFptcVNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKKyBwdWJsaWM6CisgIFRabXFTZXJ2ZXIoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgem1xOjpjb250ZXh0X3QmIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuZHBvaW50LCBpbnQgdHlwZSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKQorICAgICwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpCisgICAgLCB6bXFfdHlwZV8odHlwZSkKKyAgICAsIHNvY2tfKGN0eCwgdHlwZSkKKyAgeworICAgIGlmKHptcV90eXBlXyA9PSBaTVFfU1VCKSB7CisgICAgICBzb2NrXy5zZXRzb2Nrb3B0KFpNUV9TVUJTQ1JJQkUsICIiLCAwKSA7IC8vIGxpc3RlbiB0byBhbGwgbWVzc2FnZXMKKyAgICAgIHNvY2tfLmNvbm5lY3QoZW5kcG9pbnQuY19zdHIoKSkgOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNvY2tfLmJpbmQoZW5kcG9pbnQuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgYm9vbCBzZXJ2ZU9uZShpbnQgcmVjdl9mbGFncyA9IDApOworICB2b2lkIHNlcnZlKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzZXJ2ZU9uZSgpOworICAgIH0KKyAgfQorCisgIHptcTo6c29ja2V0X3QmIGdldFNvY2tldCgpIHsKKyAgICByZXR1cm4gc29ja187CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBpbnQgem1xX3R5cGVfOworICB6bXE6OnNvY2tldF90IHNvY2tfOworfTsKKworCitjbGFzcyBUWm1xTXVsdGlTZXJ2ZXIgeworIHB1YmxpYzoKKyAgdm9pZCBzZXJ2ZU9uZShsb25nIHRpbWVvdXQgPSAtMSk7CisgIHZvaWQgc2VydmVGb3JldmVyKCk7CisKKyAgc3RkOjp2ZWN0b3I8VFptcVNlcnZlcio+JiBzZXJ2ZXJzKCkgeworICAgIHJldHVybiBzZXJ2ZXJzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgem1xOjpwb2xsaXRlbV90KiBzZXR1cFBvbGwoKTsKKyAgdm9pZCBzZXJ2ZUFjdGl2ZSh6bXE6OnBvbGxpdGVtX3QqIGl0ZW1zLCBsb25nIHRpbWVvdXQpOworICBzdGQ6OnZlY3RvcjxUWm1xU2VydmVyKj4gc2VydmVyc187Cit9OworCisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzE1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CkBAIC0wLDAgKzEsNzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB6bXEKK2ltcG9ydCB0aHJpZnQuc2VydmVyLlRTZXJ2ZXIKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQKKworCitjbGFzcyBUWm1xU2VydmVyKHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgorICAgICAgICB0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUpCisgICAgICAgIHNlbGYuem1xX3R5cGUgPSBzb2NrX3R5cGUKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKKyAgICAgICAgc2VsZi5zb2NrZXQuYmluZChlbmRwb2ludCkKKworICAgIGRlZiBzZXJ2ZU9uZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5zb2NrZXQucmVjdigpCisgICAgICAgIGl0cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZykKKyAgICAgICAgb3RyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKKyAgICAgICAgICAgICMgRmFsbCB0aHJvdWdoIGFuZCBzZW5kIGJhY2sgYSByZXNwb25zZSwgZXZlbiBpZiBlbXB0eSBvciBpbmNvbXBsZXRlLgorCisgICAgICAgIGlmIHNlbGYuem1xX3R5cGUgPT0gem1xLlJFUDoKKyAgICAgICAgICAgIG1zZyA9IG90cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVPbmUoKQorCisKK2NsYXNzIFRabXFNdWx0aVNlcnZlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJzID0gW10KKworICAgIGRlZiBzZXJ2ZU9uZShzZWxmLCB0aW1lb3V0PS0xKToKKyAgICAgICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCisKKyAgICBkZWYgc2VydmVGb3JldmVyKHNlbGYpOgorICAgICAgICBwb2xsX2luZm8gPSBzZWxmLl9zZXR1cFBvbGwoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5fc2VydmVBY3RpdmUocG9sbF9pbmZvLCAtMSkKKworICAgIGRlZiBfc2V0dXBQb2xsKHNlbGYpOgorICAgICAgICBzZXJ2ZXJfbWFwID0ge30KKyAgICAgICAgcG9sbGVyID0gem1xLlBvbGxlcigpCisgICAgICAgIGZvciBzZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgorICAgICAgICAgICAgc2VydmVyX21hcFtzZXJ2ZXIuc29ja2V0XSA9IHNlcnZlcgorICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlcnZlci5zb2NrZXQsIHptcS5QT0xMSU4pCisgICAgICAgIHJldHVybiAoc2VydmVyX21hcCwgcG9sbGVyKQorCisgICAgZGVmIF9zZXJ2ZUFjdGl2ZShzZWxmLCBwb2xsX2luZm8sIHRpbWVvdXQpOgorICAgICAgICAoc2VydmVyX21hcCwgcG9sbGVyKSA9IHBvbGxfaW5mbworICAgICAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKKyAgICAgICAgZm9yIHNvY2ssIHN0YXRlIGluIHJlYWR5Lml0ZW1zKCk6CisgICAgICAgICAgICBhc3NlcnQgKHN0YXRlICYgem1xLlBPTExJTikgIT0gMAorICAgICAgICAgICAgc2VydmVyX21hcFtzb2NrXS5zZXJ2ZU9uZSgpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNkNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXNzZW1ibHkgaXMgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuCisvLyBDaGFuZ2UgdGhlbSB0byB0aGUgdmFsdWVzIHNwZWNpZmljIHRvIHlvdXIgcHJvamVjdC4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJabXFTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiWm1xIEV4YW1wbGVzIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBUaGUgYXNzZW1ibHkgdmVyc2lvbiBoYXMgdGhlIGZvcm1hdCAie01ham9yfS57TWlub3J9LntCdWlsZH0ue1JldmlzaW9ufSIuCisvLyBUaGUgZm9ybSAie01ham9yfS57TWlub3J9LioiIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGJ1aWxkIGFuZCByZXZpc2lvbiwKKy8vIGFuZCAie01ham9yfS57TWlub3J9LntCdWlsZH0uKiIgd2lsbCB1cGRhdGUganVzdCB0aGUgcmV2aXNpb24uCisKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorCisvLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2lnbmluZyBrZXkgZm9yIHRoZSBhc3NlbWJseSwKKy8vIGlmIGRlc2lyZWQuIFNlZSB0aGUgTW9ubyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNpZ25pbmcuCisKKy8vW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldCisvL1thc3NlbWJseTogQXNzZW1ibHlLZXlGaWxlKCIiKV0KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL01haW4uY3MgYi9jb250cmliL3plcm9tcS9jc2hhcnAvTWFpbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjZjZmUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL01haW4uY3MKQEAgLTAsMCArMSw2MCBAQAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFpNUTsKK3VzaW5nIFptcVNlcnZlcjsKK3VzaW5nIFptcUNsaWVudDsKKworbmFtZXNwYWNlIFptcVNlcnZlcgoreworCWNsYXNzIE1haW5DbGFzcworCXsKKwkJcHVibGljIHN0YXRpYyB2b2lkIE1haW4gKHN0cmluZ1tdIGFyZ3MpCisJCXsKKwkJCW5ldyBUaHJlYWQoU2VydmVyLnNlcnZlKS5TdGFydCgpOworCQkJQ2xpZW50LndvcmsoKTsKKwkJfQorCQkKKwkJc3RhdGljIGNsYXNzIFNlcnZlcnsKKwkJCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXJ2ZSgpeworCQkJCVN0b3JhZ2VIYW5kbGVyIHM9bmV3IFN0b3JhZ2VIYW5kbGVyKCk7CisJCQkJU3RvcmFnZS5Qcm9jZXNzb3IgcD1uZXcgU3RvcmFnZS5Qcm9jZXNzb3Iocyk7CisJCQkJCisJCQkJWk1RLkNvbnRleHQgYz1uZXcgWk1RLkNvbnRleHQoKTsKKwkJCQkKKwkJCQlUWm1xU2VydmVyIHR6cz1uZXcgVFptcVNlcnZlcihwLGMsInRjcDovLzEyNy4wLjAuMTo5MDkwIixaTVEuU29ja2V0VHlwZS5QQUlSKTsKKwkJCQl0enMuU2VydmUoKTsKKwkJCX0KKwkJCQorCQkJY2xhc3MgU3RvcmFnZUhhbmRsZXI6U3RvcmFnZS5JZmFjZXsKKwkJCQlpbnQgdmFsPTA7CisJCQkJCisJCQkJcHVibGljIHZvaWQgaW5jcihpbnQgYW1vdW50KXsKKwkJCQkJdmFsKz1hbW91bnQ7CisJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJpbmNyKHswfSkiLGFtb3VudCk7CisJCQkJfQorCQkJCQorCQkJCXB1YmxpYyBpbnQgZ2V0KCl7CisJCQkJCXJldHVybiB2YWw7CisJCQkJfSAKKwkJCX0KKwkJfQorCQkKKwkJc3RhdGljIGNsYXNzIENsaWVudHsKKwkJCXB1YmxpYyBzdGF0aWMgdm9pZCB3b3JrKCkKKwkJCXsKKwkJCQlDb250ZXh0IGN0eD1uZXcgQ29udGV4dCgpOworCQkJCVRabXFDbGllbnQgdHpjPW5ldyBUWm1xQ2xpZW50KGN0eCwidGNwOi8vMTI3LjAuMC4xOjkwOTAiLFNvY2tldFR5cGUuUEFJUik7CisJCQkJVEJpbmFyeVByb3RvY29sIHA9bmV3IFRCaW5hcnlQcm90b2NvbCh0emMpOworCQkJCQorCQkJCVN0b3JhZ2UuQ2xpZW50IGNsaWVudD1uZXcgU3RvcmFnZS5DbGllbnQocCk7CisJCQkJdHpjLk9wZW4oKTsKKwkJCQkKKwkJCQlDb25zb2xlLldyaXRlTGluZShjbGllbnQuQGdldCgpKTsKKwkJCQljbGllbnQuaW5jcigxKTsKKwkJCQljbGllbnQuaW5jcig0MSk7CisJCQkJQ29uc29sZS5Xcml0ZUxpbmUoY2xpZW50LkBnZXQoKSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcUNsaWVudC5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWI1MTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcUNsaWVudC5jcwpAQCAtMCwwICsxLDc4IEBACit1c2luZyBTeXN0ZW07Cit1c2luZyBaTVE7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgWm1xQ2xpZW50Cit7CisJcHVibGljIGNsYXNzIFRabXFDbGllbnQgOiBUVHJhbnNwb3J0CisJeworCQlTb2NrZXQgX3NvY2s7CisJCVN0cmluZyBfZW5kcG9pbnQ7CisJCU1lbW9yeVN0cmVhbSBfd2J1ZiA9IG5ldyBNZW1vcnlTdHJlYW0gKCk7CisJCU1lbW9yeVN0cmVhbSBfcmJ1ZiA9IG5ldyBNZW1vcnlTdHJlYW0gKCk7CisKKwkJdm9pZCBkZWJ1ZyAoc3RyaW5nIG1zZykKKwkJeworCQkJLy9VbmNvbW1lbnQgdG8gZW5hYmxlIGRlYnVnCisvLwkJCUNvbnNvbGUuV3JpdGVMaW5lIChtc2cpOworCQl9CisKKwkJcHVibGljIFRabXFDbGllbnQgKENvbnRleHQgY3R4LCBTdHJpbmcgZW5kcG9pbnQsIFNvY2tldFR5cGUgc29ja1R5cGUpCisJCXsKKwkJCV9zb2NrID0gY3R4LlNvY2tldCAoc29ja1R5cGUpOworCQkJX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuICgpCisJCXsKKwkJCV9zb2NrLkNvbm5lY3QgKF9lbmRwb2ludCk7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlICgpCisJCXsKKwkJCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiAoKTsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiB7CisJCQlnZXQgeworCQkJCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiAoKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZCAoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKwkJeworCQkJZGVidWcgKCJDbGllbnRfUmVhZCIpOworCQkJaWYgKG9mZiAhPSAwIHx8IGxlbiAhPSBidWYuTGVuZ3RoKQorCQkJCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiAoKTsKKworCQkJaWYgKF9yYnVmLkxlbmd0aCA9PSAwKSB7CisJCQkJLy9GaWxsIHRoZSBCdWZmZXIgd2l0aCB0aGUgY29tcGxldGUgWk1RIE1lc3NhZ2Ugd2hpY2ggbmVlZHMgdG8gYmUoPyEpIHRoZSBjb21wbGV0ZSBUaHJpZnQgcmVzcG9uc2UKKwkJCQlkZWJ1ZyAoIkNsaWVudF9SZWFkIEZpbGxpbmcgYnVmZmVyLi4iKTsKKwkJCQlieXRlW10gdG1wQnVmID0gX3NvY2suUmVjdiAoKTsKKwkJCQlkZWJ1ZyAoc3RyaW5nLkZvcm1hdCgiQ2xpZW50X1JlYWQgZmlsbGVkIHdpdGggezB9YiIsdG1wQnVmLkxlbmd0aCkpOworCQkJCV9yYnVmLldyaXRlICh0bXBCdWYsIDAsIHRtcEJ1Zi5MZW5ndGgpOworCQkJCV9yYnVmLlBvc2l0aW9uID0gMDsJLy9Gb3IgcmVhZGluZworCQkJfQorCQkJaW50IHJldCA9IF9yYnVmLlJlYWQgKGJ1ZiwgMCwgbGVuKTsKKwkJCWlmIChfcmJ1Zi5MZW5ndGggPT0gX3JidWYuUG9zaXRpb24pCS8vRmluaXNoZWQgcmVhZGluZworCQkJCV9yYnVmLlNldExlbmd0aCAoMCk7CisJCQlkZWJ1ZyAoc3RyaW5nLkZvcm1hdCAoIkNsaWVudF9SZWFkIHJldHVybiB7MH1iLCByZW1haW5pbmcgIHsxfWIiLCByZXQsIF9yYnVmLkxlbmd0aCAtIF9yYnVmLlBvc2l0aW9uKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUgKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisJCXsKKwkJCWRlYnVnICgiQ2xpZW50X1dyaXRlIik7CisJCQlfd2J1Zi5Xcml0ZSAoYnVmLCBvZmYsIGxlbik7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCAoKQorCQl7CisJCQlkZWJ1ZyAoIkNsaWVudF9GbHVzaCIpOworCQkJX3NvY2suU2VuZCAoX3didWYuR2V0QnVmZmVyICgpKTsKKwkJCV93YnVmID0gbmV3IE1lbW9yeVN0cmVhbSAoKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFTZXJ2ZXIuY3MgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzVjNjIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFTZXJ2ZXIuY3MKQEAgLTAsMCArMSw1NiBAQAordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBaTVE7Cit1c2luZyBTeXN0ZW0uSU87CisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgWm1xU2VydmVyCit7CisJcHVibGljIGNsYXNzIFRabXFTZXJ2ZXIKKwl7CisJCVNvY2tldCBfc29ja2V0IDsKKwkJVFByb2Nlc3NvciBfcHJvY2Vzc29yOworCQkKKwkJdm9pZCBkZWJ1ZyAoc3RyaW5nIG1zZykKKwkJeworCQkJLy9VbmNvbW1lbnQgdG8gZW5hYmxlIGRlYnVnCisvLwkJCUNvbnNvbGUuV3JpdGVMaW5lIChtc2cpOworCQl9CisKKwkJcHVibGljIFRabXFTZXJ2ZXIgKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBDb250ZXh0IGN0eCwgU3RyaW5nIGVuZHBvaW50LCBTb2NrZXRUeXBlIHNvY2tUeXBlKQorCQl7CisJCQluZXcgVFNpbXBsZVNlcnZlciAocHJvY2Vzc29yLG51bGwpOworCQkJX3NvY2tldCA9IGN0eC5Tb2NrZXQgKHNvY2tUeXBlKTsKKwkJCV9zb2NrZXQuQmluZCAoZW5kcG9pbnQpOworCQkJX3Byb2Nlc3NvciA9IHByb2Nlc3NvcjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIFNlcnZlT25lICgpCisJCXsKKwkJCWRlYnVnICgiU2VydmVyX1NlcnZlT25lIik7CisJCQlCeXRlW10gbXNnID0gX3NvY2tldC5SZWN2ICgpOworCQkJTWVtb3J5U3RyZWFtIGlzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtIChtc2cpOworCQkJTWVtb3J5U3RyZWFtIG9zdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtICgpOworCQkJVFByb3RvY29sIHRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wgKG5ldyBUU3RyZWFtVHJhbnNwb3J0IChpc3RyZWFtLCBvc3RyZWFtKSk7CisJCQlfcHJvY2Vzc29yLlByb2Nlc3MgKHRQcm90b2NvbCwgdFByb3RvY29sKTsKKworCQkJaWYgKG9zdHJlYW0uTGVuZ3RoICE9IDApIHsKKwkJCQlieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbb3N0cmVhbS5MZW5ndGhdOworCQkJCUFycmF5LkNvcHkgKG9zdHJlYW0uR2V0QnVmZmVyICgpLCBuZXdCdWYsIG9zdHJlYW0uTGVuZ3RoKTsKKwkJCQlkZWJ1ZyAoc3RyaW5nLkZvcm1hdCAoIlNlcnZlcl9TZXJ2ZU9uZSBzZW5kaW5nIHswfWIiLCBvc3RyZWFtLkxlbmd0aCkpOworCQkJCV9zb2NrZXQuU2VuZCAobmV3QnVmKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIFNlcnZlICgpCisJCXsKKwkJCXdoaWxlICh0cnVlKQorCQkJCVNlcnZlT25lICgpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvaiBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwYWQxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagpAQCAtMCwwICsxLDkxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFJvb3ROYW1lc3BhY2U+Wm1xU2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0Wk1RPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3x4ODYnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWc8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxFeHRlcm5hbGNvbnNvbGU+dHJ1ZTwvRXh0ZXJuYWxjb25zb2xlPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfHg4NicgIj4KKyAgICA8RGVidWdUeXBlPm5vbmU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxFeHRlcm5hbGNvbnNvbGU+dHJ1ZTwvRXh0ZXJuYWxjb25zb2xlPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9ImNscnptcSwgVmVyc2lvbj0yLjEuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT14ODYiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi5cY2xyem1xLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlxsaWJcY3NoYXJwXFRocmlmdC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNYWluLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUWm1xU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTdG9yYWdlLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbiBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhZjU3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbgpAQCAtMCwwICsxLDQyIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRaTVEiLCAiVGhyaWZ0Wk1RLmNzcHJvaiIsICJ7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMgPSBEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfE1peGVkIFBsYXRmb3JtcyA9IFJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zCisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8eDg2CisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3N0b3JhZ2UudGhyaWZ0IGIvY29udHJpYi96ZXJvbXEvc3RvcmFnZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlYTk2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL3N0b3JhZ2UudGhyaWZ0CkBAIC0wLDAgKzEsNCBAQAorc2VydmljZSBTdG9yYWdlIHsKKyAgb25ld2F5IHZvaWQgaW5jcigxOiBpMzIgYW1vdW50KTsKKyAgaTMyIGdldCgpOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorCisjaW5jbHVkZSAiem1xLmhwcCIKKyNpbmNsdWRlICJUWm1xQ2xpZW50LmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgY29uc3QgY2hhciogZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiOworICBpbnQgc29ja3R5cGUgPSBaTVFfUkVROworICBpbnQgaW5jciA9IDA7CisgIGlmIChhcmdjID4gMSkgeworICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOworICAgIGlmIChpbmNyKSB7CisgICAgICBzb2NrdHlwZSA9IFpNUV9QVVNIOworICAgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTEiOworICAgIH0KKyAgfQorCisgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKKyAgc2hhcmVkX3B0cjxUWm1xQ2xpZW50PiB0cmFuc3BvcnQobmV3IFRabXFDbGllbnQoY3R4LCBlbmRwb2ludCwgc29ja3R5cGUpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgIFN0b3JhZ2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKyAgdHJhbnNwb3J0LT5vcGVuKCk7CisKKyAgaWYgKGluY3IpIHsKKyAgICBjbGllbnQuaW5jcihpbmNyKTsKKyAgICB1c2xlZXAoNTAwMDApOworICB9IGVsc2UgeworICAgIGludCB2YWx1ZSA9IGNsaWVudC5nZXQoKTsKKyAgICBzdGQ6OmNvdXQgPDwgdmFsdWUgPDwgc3RkOjplbmRsOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1MTIxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weQpAQCAtMCwwICsxLDM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgem1xCitpbXBvcnQgVFptcUNsaWVudAoraW1wb3J0IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wKK2ltcG9ydCBzdG9yYWdlLnR0eXBlcworaW1wb3J0IHN0b3JhZ2UuU3RvcmFnZQorCisKK2RlZiBtYWluKGFyZ3MpOgorICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkwIgorICAgIHNvY2t0eXBlID0gem1xLlJFUQorICAgIGluY3IgPSAwCisgICAgaWYgbGVuKGFyZ3MpID4gMToKKyAgICAgICAgaW5jciA9IGludChhcmdzWzFdKQorICAgICAgICBpZiBpbmNyOgorICAgICAgICAgICAgc29ja3R5cGUgPSB6bXEuUFVTSAorICAgICAgICAgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTEiCisKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgdHJhbnNwb3J0ID0gVFptcUNsaWVudC5UWm1xQ2xpZW50KGN0eCwgZW5kcG9pbnQsIHNvY2t0eXBlKQorICAgIHByb3RvY29sID0gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFuc3BvcnQpCisgICAgY2xpZW50ID0gc3RvcmFnZS5TdG9yYWdlLkNsaWVudChwcm90b2NvbCkKKyAgICB0cmFuc3BvcnQub3BlbigpCisKKyAgICBpZiBpbmNyOgorICAgICAgICBjbGllbnQuaW5jcihpbmNyKQorICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgZWxzZToKKyAgICAgICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKKyAgICAgICAgcHJpbnQodmFsdWUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY1YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgInptcS5ocHAiCisjaW5jbHVkZSAiVFptcVNlcnZlci5oIgorI2luY2x1ZGUgIlN0b3JhZ2UuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKKworY2xhc3MgU3RvcmFnZUhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBTdG9yYWdlSWYgeworIHB1YmxpYzoKKyAgU3RvcmFnZUhhbmRsZXIoKQorICAgIDogdmFsdWVfKDApCisgIHt9CisKKyAgdm9pZCBpbmNyKGNvbnN0IGludDMyX3QgYW1vdW50KSB7CisgICAgdmFsdWVfICs9IGFtb3VudDsKKyAgICBwcmludGYoInZhbHVlXzogJWlcbiIsIHZhbHVlXykgOworICB9CisKKyAgaW50MzJfdCBnZXQoKSB7CisgICAgcmV0dXJuIHZhbHVlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCB2YWx1ZV87CisKK307CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBzaGFyZWRfcHRyPFN0b3JhZ2VIYW5kbGVyPiBoYW5kbGVyKG5ldyBTdG9yYWdlSGFuZGxlcigpKTsKKyAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFN0b3JhZ2VQcm9jZXNzb3IoaGFuZGxlcikpOworCisgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKKyAgVFptcVNlcnZlciBvbmV3YXlfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAiZXBnbTovL2V0aDA7MjM5LjE5Mi4xLjE6NTU1NSIsIFpNUV9TVUIpOworICBvbmV3YXlfc2VydmVyLnNlcnZlKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwODZhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcApAQCAtMCwwICsxLDMyIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisKKyNpbmNsdWRlICJ6bXEuaHBwIgorI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKKyNpbmNsdWRlICJTdG9yYWdlLmgiCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUWm1xQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBjb25zdCBjaGFyKiBlbmRwb2ludCA9ICJlcGdtOi8vZXRoMDsyMzkuMTkyLjEuMTo1NTU1IjsKKyAgaW50IHNvY2t0eXBlID0gWk1RX1BVQjsKKyAgaW50IGluY3IgPSAxOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICBpbmNyID0gYXRvaShhcmd2WzFdKTsKKyAgfQorCisgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKKyAgc2hhcmVkX3B0cjxUWm1xQ2xpZW50PiB0cmFuc3BvcnQobmV3IFRabXFDbGllbnQoY3R4LCBlbmRwb2ludCwgc29ja3R5cGUpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgIFN0b3JhZ2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKworICB0cmFuc3BvcnQtPm9wZW4oKTsKKworICBjbGllbnQuaW5jcihpbmNyKTsKKyAgdXNsZWVwKDUwMDAwKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYxYjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKyNpbmNsdWRlICJ6bXEuaHBwIgorI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKKyNpbmNsdWRlICJTdG9yYWdlLmgiCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xTXVsdGlTZXJ2ZXI7CisKK2NsYXNzIFN0b3JhZ2VIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgU3RvcmFnZUlmIHsKKyBwdWJsaWM6CisgIFN0b3JhZ2VIYW5kbGVyKCkKKyAgICA6IHZhbHVlXygwKQorICB7fQorCisgIHZvaWQgaW5jcihjb25zdCBpbnQzMl90IGFtb3VudCkgeworICAgIHZhbHVlXyArPSBhbW91bnQ7CisgIH0KKworICBpbnQzMl90IGdldCgpIHsKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKKyBwcml2YXRlOgorICBpbnQzMl90IHZhbHVlXzsKKworfTsKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIHNoYXJlZF9wdHI8U3RvcmFnZUhhbmRsZXI+IGhhbmRsZXIobmV3IFN0b3JhZ2VIYW5kbGVyKCkpOworICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgU3RvcmFnZVByb2Nlc3NvcihoYW5kbGVyKSk7CisKKyAgem1xOjpjb250ZXh0X3QgY3R4KDEpOworICBUWm1xU2VydmVyIHJlcXJlcF9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCBaTVFfUkVQKTsKKyAgVFptcVNlcnZlciBvbmV3YXlfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgWk1RX1BVTEwpOworICBUWm1xTXVsdGlTZXJ2ZXIgbXVsdGlzZXJ2ZXI7CisgIG11bHRpc2VydmVyLnNlcnZlcnMoKS5wdXNoX2JhY2soJnJlcXJlcF9zZXJ2ZXIpOworICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZvbmV3YXlfc2VydmVyKTsKKyAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4OWIzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQpAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCB6bXEKK2ltcG9ydCBUWm1xU2VydmVyCitpbXBvcnQgc3RvcmFnZS50dHlwZXMKK2ltcG9ydCBzdG9yYWdlLlN0b3JhZ2UKKworCitjbGFzcyBTdG9yYWdlSGFuZGxlcihzdG9yYWdlLlN0b3JhZ2UuSWZhY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IDAKKworICAgIGRlZiBpbmNyKHNlbGYsIGFtb3VudCk6CisgICAgICAgIHNlbGYudmFsdWUgKz0gYW1vdW50CisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisKK2RlZiBtYWluKCk6CisgICAgaGFuZGxlciA9IFN0b3JhZ2VIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBzdG9yYWdlLlN0b3JhZ2UuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgcmVxcmVwX3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIHptcS5SRVApCisgICAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5QVUxMKQorICAgIG11bHRpc2VydmVyID0gVFptcVNlcnZlci5UWm1xTXVsdGlTZXJ2ZXIoKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kZWJpYW4vUkVBRE1FLm1kIGIvZGViaWFuL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJmZWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL1JFQURNRS5tZApAQCAtMCwwICsxLDQxIEBACisjIyBTb21lIHRpcHMgb24gRGViaWFuIFBhY2thZ2luZworCistIERlYmlhbiBOZXcgTWFpbnRhaW5lcnMnIEd1aWRlIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL2RlYmlhbi1wb2xpY3kvXQorLSBEZWJpYW4gUG9saWN5IE1hbnVhbCBbaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy9tYW51YWxzL21haW50LWd1aWRlL10KKy0gTWFjaGluZS1yZWFkYWJsZSBkZWJpYW4vY29weXJpZ2h0IGZpbGUgW2h0dHA6Ly9kZXAuZGViaWFuLm5ldC9kZXBzL2RlcDUvXQorLSBEZWJTcmMgMy4wIGd1aWRlbGluZXMgW2h0dHBzOi8vd2lraS5kZWJpYW4ub3JnL1Byb2plY3RzL0RlYlNyYzMuMF0KKworCisjIyBCdWlsZCB1c2luZyBkcGtnLWJ1aWxkcGFja2FnZToKKworYGBgYmFzaAorJCBkcGtnLWJ1aWxkcGFja2FnZSAtZCAtdGMKKyAgLWQgICAjIGRvIG5vdCBjaGVjayBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy4KKyAgLXRjICAjIGNsZWFuIHNvdXJjZSB0cmVlIHdoZW4gZmluaXNoZWQuCitgYGAKKworCisjIyBVcGRhdGUgY2hhbmdlbG9nOgorCitgYGBiYXNoCiskIGRhdGUgLVIKK2BgYAorCitPbmUgY2FuIGFsc28gaW5zdGFsbCBgZGV2c2NyaXB0c2AgcGFja2FnZSBhbmQgcnVuOgorCitgYGBiYXNoCiskIGRjaCAtaQorYGBgCisKKworIyMgQ2hlY2sgcGFja2FnZXM6CisKK2BgYGJhc2gKKyQgZHBrZyAtYyAqLmRlYgorJCBsaW50aWFuICouZGViCitgYGAKKworCisjIyBUT0RPCisKK01ha2UgaXQgcGVyZmVjdCEKZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjVmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY2hhbmdlbG9nCkBAIC0wLDAgKzEsODMgQEAKK3RocmlmdCAoMC4xMi4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMi4wCisKKyAtLSBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4gIFdlZCwgMjggRGVjIDIwMTggMTI6MDA6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjExLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjExLjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMDcgRGVjIDIwMTcgMjA6MDc6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjEwLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjEwLjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMDMgSmFuIDIwMTcgMTY6NTI6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjkuMykgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuOS4zCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDExIE9jdCAyMDE1IDE3OjIyOjAwIC0wNTAwCisKK3RocmlmdCAoMC45LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjkuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAxMCBPY3QgMjAxMiAxMjowMDowMCAtMDUwMAorCit0aHJpZnQgKDAuNy4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC43LjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFR1ZSwgMTAgQXVnIDIwMTEgMTc6MDE6NTMgLTA1MDAKKwordGhyaWZ0ICgwLjcuMC1kZXYxKSBzdGFibGU7IHVyZ2VuY3k9bG93CisgICogYWRkZWQgZ2xpYgorICAqIGZpeCBsb2NhdGlvbiBvZiBsaWJ0aHJpZnQuamFyCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIFR1ZSwgMTIgQXByIDIwMTEgMjE6NDE6MTggKzAyMDAKKwordGhyaWZ0ICgwLjYuMC1kZXYxKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdmVyc2lvbiBmaWVsZAorICAqIGFkZGVkIGRlYmlhbiBmb2xkZXIgdG8gdGhyaWZ0L2NvbnRyaWIKKyAgKiBjaGFuZ2VkIGEgZmV3IGRldGFpbHMgaW4gY29udHJvbCBmaWxlCisgICogdXBkYXRlIGNvcHlyaWdodCBmaWxlCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIFR1ZSwgMTQgRGVjIDIwMTAgMTI6MTI6MzMgLTA4MDAKKwordGhyaWZ0ICgwLjUuMCtubXUyKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQuCisgICogTWVyZ2VkIFRIUklGVC03MV92OS5wYXRjaCB0byBza2lwIC4vYm9vdHN0cmFwLnNoIGlmIG5vdCBleGlzdHMuCisgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9hdHRhY2htZW50LzEyNDY1MzYwL1RIUklGVC03MV92OS5wYXRjaAorCisgLS0gWWFtYXNoaXRhIFl1dSA8eWFtYXNoaXRhQGdlaXNoYXRva3lvLmNvbT4gIFR1ZSwgMDcgRGVjIDIwMTAgMTU6MDA6NTUgKzA5MDAKKwordGhyaWZ0ICgwLjUuMCtubXUxKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQuCisgICogSW1wb3J0ZWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgcGhwNS10aHJpZnQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2ltcGxlZ2VvL3RocmlmdC4KKworIC0tIFlhbWFzaGl0YSBZdXUgPHlhbWFzaGl0YUBnZWlzaGF0b2t5by5jb20+ICBUdWUsIDA3IERlYyAyMDEwIDAxOjAwOjE3ICswOTAwCisKK3RocmlmdCAoMC41LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjUuMAorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBGcmksIDA4IE9jdCAyMDEwIDExOjIzOjUzICswMjAwCisKK3RocmlmdCAoMC40LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjQuMAorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGJ1ZmZlcm92ZXJmbG93LmNoPiAgU3VuLCAyMiBBdWcgMjAxMCAyMToyNjowMCArMDEwMAorCit0aHJpZnQgKDAuMjAwOC4xMi4zMH44LjA0KSBoYXJkeTsgdXJnZW5jeT1sb3cKKworICAqIEluaXRpYWwgcmVsZWFzZS4KKworIC0tIEVzdGV2ZSBGZXJuYW5kZXogPGVzdGV2ZUBmbHVpZGluZm8uY29tPiAgVGh1LCAxNSBKYW4gMjAwOSAxMTozNDoyNCArMDEwMApkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbXBhdCBiL2RlYmlhbi9jb21wYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2MzUxNAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb21wYXQKQEAgLTAsMCArMSBAQAorOQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbnRyb2wgYi9kZWJpYW4vY29udHJvbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE4YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvbnRyb2wKQEAgLTAsMCArMSwyMDIgQEAKK1NvdXJjZTogdGhyaWZ0CitTZWN0aW9uOiBkZXZlbAorUHJpb3JpdHk6IGV4dHJhCitCdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD49IDkpLCBidWlsZC1lc3NlbnRpYWwsIG1vbm8tbWNzLCBweXRob24tZGV2LCBhbnQsCisgICAgbW9uby1kZXZlbCwgIGxpYm1vbm8tc3lzdGVtLXdlYjQuMC1jaWwsIGVybGFuZy1iYXNlLCBydWJ5LWRldiB8IHJ1YnkxLjkuMS1kZXYsIHJ1YnktYnVuZGxlciAsYXV0b2NvbmYsIGF1dG9tYWtlLAorICAgIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNTMtZGV2IHwgbGliYm9vc3QxLjYzLWFsbC1kZXYsCisgICAgcHl0aG9uLWFsbCwgcHl0aG9uLXNldHVwdG9vbHMsIHB5dGhvbi1hbGwtZGV2LCBweXRob24tYWxsLWRiZywKKyAgICBweXRob24zLWFsbCwgcHl0aG9uMy1zZXR1cHRvb2xzLCBweXRob24zLWFsbC1kZXYsIHB5dGhvbjMtYWxsLWRiZywKKyAgICBvcGVuamRrLTctamRrIHwgb3Blbmpkay04LWpkayB8IGRlZmF1bHQtamRrLAorICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNTMtZGV2IHwgbGliYm9vc3QtdGVzdDEuNjMtZGV2LCBsaWJldmVudC1kZXYsIGxpYnNzbC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAorICAgIHBocCAoPj0gNSksIHBocC1kZXYgKD49IDUpLCBsaWJnbGliMi4wLWRldiwgcXRjaG9vc2VyLCBxdGJhc2U1LWRldi10b29scworTWFpbnRhaW5lcjogVGhyaWZ0IERldmVsb3BlcidzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitIb21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLworVmNzLUdpdDogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CitWY3MtQnJvd3NlcjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjkuNworWC1QeXRob24tVmVyc2lvbjogPj0gMi42CitYLVB5dGhvbjMtVmVyc2lvbjogPj0gMy4zCisKK1BhY2thZ2U6IHRocmlmdC1jb21waWxlcgorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBDb21waWxlciBmb3IgVGhyaWZ0IGRlZmluaXRpb24gZmlsZXMKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgVGhyaWZ0IGNvbXBpbGVyIHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNsYXRpbmcKKyBmcm9tIC50aHJpZnQgZmlsZXMgKGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zKSB0byB0aGUgbGFuZ3VhZ2UgYmluZGluZworIGZvciB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcy4KKworUGFja2FnZTogcHl0aG9uLXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHB5dGhvbgorRGVwZW5kczogJHtweXRob246RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi1zaXgKK1JlY29tbWVuZHM6IHB5dGhvbi10d2lzdGVkLXdlYiwgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUsIHB5dGhvbi1pcGFkZHJlc3MKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoUHl0aG9uIDIpCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFB5dGhvbgorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisgLgorIFRoaXMgcGFja2FnZSBpbnN0YWxscyB0aGUgbGlicmFyeSBmb3IgUHl0aG9uIDIuCisKK1BhY2thZ2U6IHB5dGhvbi10aHJpZnQtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24tYWxsLWRiZworUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzLgorIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdCB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91cgorIGRlZmluaXRpb24gdG8gUHl0aG9uIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93CisgeW91IHRvIHVzZSB0aG9zZSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IHB5dGhvbjMtdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogcHl0aG9uCitEZXBlbmRzOiAke3B5dGhvbjM6RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtc2l4CitSZWNvbW1lbmRzOiBweXRob24zLXR3aXN0ZWQtd2ViCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKFB5dGhvbiAzKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAzLgorCitQYWNrYWdlOiBweXRob24zLXRocmlmdC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uMy10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24zLWFsbC1kYmcKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoZGVidWcgdmVyc2lvbikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4KKyBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIKKyBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdworIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBydWJ5LXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IGxpYnMKK0RlcGVuZHM6IHJ1YnkgfCBydWJ5LWludGVycHJldGVyLCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitQcm92aWRlczogbGlidGhyaWZ0LXJ1YnkKK1JlcGxhY2VzOiBsaWJ0aHJpZnQtcnVieQorQnJlYWtzOiBsaWJ0aHJpZnQtcnVieQorRGVzY3JpcHRpb246IFJ1YnkgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBSdWJ5IGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUnVieQorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1qYXZhCitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogamF2YQorRGVwZW5kczogJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIEphdmEgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBKYXZhCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogbGlidGhyaWZ0LWNpbAorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IGNsaS1tb25vCitEZXBlbmRzOiBjbGktY29tbW9uLCBsaWJtb25vLWNvcmxpYjQuMC1jaWwgKD49IDIuMTApIHwgbGlibW9uby1jb3JsaWI0LjUtY2lsICg+PTMuMiksIGxpYm1vbm8tc3lzdGVtNC4wLWNpbCAoPj0gMi4xMCksCisgICAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCAoPj0gMi4xMCksICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEMjCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogbGlidGhyaWZ0LXBlcmwKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBwZXJsCitEZXBlbmRzOiBwZXJsICg+PSA1LjguMC03KSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogUGVybCBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFBlcmwgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQZXJsCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogbGlidGhyaWZ0MAorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zCisgdXNpbmcgVGhyaWZ0LgorCitQYWNrYWdlOiBsaWJ0aHJpZnQwLWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KQorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeSBkZWJ1ZyBzeW1ib2xzCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlYnVnIHN5bWJvbHMgZm9yIHRoZSBUaHJpZnQgQysrIHJ1bnRpbWUgbGlicmFyaWVzLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtZGV2CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogbGliZGV2ZWwKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBsaWJnbGliMi4wLWRldgorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeSAoZGV2ZWxvcG1lbnQgaGVhZGVycykKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIHJlcXVpcmVkIGZvciB3cml0aW5nIEMrKworIGFwcGxpY2F0aW9ucyB1c2luZyBUaHJpZnQuCisKK1BhY2thZ2U6IHBocDUtdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogcGhwCitEZXBlbmRzOiAke3BocDpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorUHJvdmlkZXM6ICR7cGhwOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFBIUCBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFBIUCBiaW5kaW5ncyBmb3IgVGhyaWZ0LgpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvcHlyaWdodCBiL2RlYmlhbi9jb3B5cmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNjQzYwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb3B5cmlnaHQKQEAgLTAsMCArMSwxMjkgQEAKK1RoaXMgcGFja2FnZSB3YXMgZGViaWFuaXplZCBieSBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4uCisKKworVGhpcyBwYWNrYWdlIGFuZCB0aGUgRGViaWFuIHBhY2thZ2luZyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsCitzZWUgYC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0FwYWNoZS0yLjAnLgorCitUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHdhcyBjb3BpZWQgZnJvbSBBcGFjaGUgVGhyaWZ0IExJQ0VOU0UgZmlsZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPRlRXQVJFIERJU1RSSUJVVEVEIFdJVEggVEhSSUZUOgorCitUaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKK3NlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlCitjb2RlIGZvciB0aGUgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKKworICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQorCitQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZm9sbG93aW5nIGZpbGVzIGNvbnRhaW4gc29tZSBwb3J0aW9ucyBvZiBjb2RlIGNvbnRyaWJ1dGVkIHVuZGVyCit0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UgKHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCksIGFuZCByZWxpY2Vuc2VkCit1bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgorCisgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQorICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYworICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAorICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCisgIGNvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAorICBjb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCisgIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCisgIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCisgIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworICBsaWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKKyAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagorICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCisgIGxpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKKyAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCisgIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKyAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcworICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorICBsaWIvcmIvbGliL3RocmlmdC5yYgorICBsaWIvc3QvUkVBRE1FCisgIGxpYi9zdC90aHJpZnQuc3QKKyAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKKyAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKyAgdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CisKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0CisjICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCisjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvbWQ1LltjaF0gY29tcG9uZW50czoKKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgbGliL3JiL3NldHVwLnJiOiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raSwKK2xpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGFuZCBsaWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgY29tcG9uZW50czoKKyAgICAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwNyAgTWFya3VzIE1vdHRsCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIuMQorKHNlZSBkb2MvbGdwbC0yLjEudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UpCmRpZmYgLS1naXQgYS9kZWJpYW4vZGlycyBiL2RlYmlhbi9kaXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODgyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vZGlycwpAQCAtMCwwICsxLDIgQEAKK3Vzci9iaW4KK3Vzci9zYmluCmRpZmYgLS1naXQgYS9kZWJpYW4vZG9jcyBiL2RlYmlhbi9kb2NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2JmODYKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vZG9jcwpAQCAtMCwwICsxIEBACitSRUFETUUubWQKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YjUyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCkBAIC0wLDAgKzEsNCBAQAordXNyL2xpYi8qLmEKK3Vzci9saWIvKi5sYQordXNyL2xpYi9wa2djb25maWcKK3Vzci9pbmNsdWRlCmRpZmYgLS1naXQgYS9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc0ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApAQCAtMCwwICsxLDUgQEAKK3Vzci9saWIvbGlidGhyaWZ0LnNvKgordXNyL2xpYi9saWJ0aHJpZnQtKi5zbyoKK3Vzci9saWIvbGlidGhyaWZ0bmIqLnNvKgordXNyL2xpYi9saWJ0aHJpZnRxdCouc28qCit1c3IvbGliL2xpYnRocmlmdHoqLnNvKgpkaWZmIC0tZ2l0IGEvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMgYi9kZWJpYW4vcGhwNS10aHJpZnQuZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EzYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMKQEAgLTAsMCArMSBAQAorZXRjL3BocDUvY29uZi5kCmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI0MzZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDIyOCBAQAorIyEvdXNyL2Jpbi9tYWtlIC1mCisjIC0qLSBtYWtlZmlsZSAtKi0KKyMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgorIworIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKb2V5IEhlc3MgYW5kIENyYWlnIFNtYWxsLgorIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgZGgtbWFrZSBpbnRvIGEKKyMgZGgtbWFrZSBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSBDcmFpZyBTbWFsbCBpbiB2ZXJzaW9uIDAuMzcgb2YgZGgtbWFrZS4KKyMKKyMgTW9kaWZpZWQgdG8gbWFrZSBhIHRlbXBsYXRlIGZpbGUgZm9yIGEgbXVsdGktYmluYXJ5IHBhY2thZ2Ugd2l0aCBzZXBhcmF0ZWQKKyMgYnVpbGQtYXJjaCBhbmQgYnVpbGQtaW5kZXAgdGFyZ2V0cyAgYnkgQmlsbCBBbGxvbWJlcnQgMjAwMQorCisjIFVuY29tbWVudCB0aGlzIHRvIHR1cm4gb24gdmVyYm9zZSBtb2RlLgorI2V4cG9ydCBESF9WRVJCT1NFPTEKKworIyBUaGlzIGhhcyB0byBiZSBleHBvcnRlZCB0byBtYWtlIHNvbWUgbWFnaWMgYmVsb3cgd29yay4KK2V4cG9ydCBESF9PUFRJT05TCisKK1BZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCisKK2V4cG9ydCBDUFBGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1BQRkxBR1MpCitleHBvcnQgQ0ZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDRkxBR1MpCitleHBvcnQgQ1hYRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENYWEZMQUdTKQorZXhwb3J0IExERkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCisKK2NvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCitjb25maWd1cmUtc3RhbXA6CisJZGhfdGVzdGRpcgorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCisJaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQorCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLWVuYWJsZS1wbHVnaW49bm8KKworCXRvdWNoIGNvbmZpZ3VyZS1zdGFtcAorCisKKyNBcmNoaXRlY3R1cmUKK2J1aWxkOiBidWlsZC1hcmNoIGJ1aWxkLWluZGVwCisJIyBUZXN0cyBkaXNhYmxlZAorCSMgJChNQUtFKSAtQyB0ZXN0IGNoZWNrCisKK2J1aWxkLWFyY2g6IGJ1aWxkLWFyY2gtc3RhbXAKKyQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0IGJ1aWxkLWFyY2gtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorCisJIyBDb21waWxlIGNvbXBpbGVyCisJJChNQUtFKSAtQyAkKENVUkRJUikvY29tcGlsZXIvY3BwCisKKwkjIENvbXBpbGUgQysrIGxpYnJhcnkKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3BwCisKKwkjIENvbXBpbGUgQyAoZ2xpYikgbGlicmFyeQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jX2dsaWIKKworCSMgUHl0aG9uIGxpYnJhcnkKKwljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKKyAgICBmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyAgXAorICAgICAgICAkJHB5IHNldHVwLnB5IGJ1aWxkOyBcCisgICAgICAgICQkcHktZGJnIHNldHVwLnB5IGJ1aWxkOyBcCisgICAgZG9uZQorCisJIyBQSFAKKwljZCAkKENVUkRJUikvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBcCisJCXBocGl6ZSAmJiBcCisJCS4vY29uZmlndXJlICYmICQoTUFLRSkKKworCXRvdWNoICRACisKK2J1aWxkLWluZGVwOiBidWlsZC1pbmRlcC1zdGFtcAorYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdAorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb21waWxlIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorCSMkKE1BS0UpIGRvYworCisJIyBKYXZhCisJY2QgJChDVVJESVIpL2xpYi9qYXZhICYmIFwKKwkJLi9ncmFkbGV3IC0tbm8tZGFlbW9uIC1QcmVsZWFzZT10cnVlIGphcgorCisJIyBDIworCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKKworCSMgUnVieQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9yYgorCisJIyBQZXJsCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgSU5TVEFMTERJUlM9dmVuZG9yCisKKwl0b3VjaCAkQAorCitjbGVhbjoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAorCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBweXRob24gc2V0dXAucHkgY2xlYW4gLS1hbGwKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlIGJ1aWxkIHByb2Nlc3MuCisJLSQoTUFLRSkgY2xlYW4KKworCSQoQ1VSRElSKS9jbGVhbnVwLnNoCisKKwlkaF9jbGVhbgorCitpbnN0YWxsOiBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaAoraW5zdGFsbC1pbmRlcDoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9wcmVwIC1pCisJZGhfaW5zdGFsbGRpcnMgLWkKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCisJIyBkZWJpYW4vPHBhY2thZ2U+LWRvYy4KKwkjSU5TVEFMTERPQyMKKworCSMgSmF2YQorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQqLmphciBcCisJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCisKKwkjIFJ1YnkKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMSAmJiBcCisJY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKKwkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKKwljcCAtciAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMQorCisJIyBDIworCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2NzaGFycC9UaHJpZnQuZGxsIFwKKwkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtY2lsL3Vzci9saWIvY2xpL3RocmlmdC9UaHJpZnQuZGxsCisKKwkjIFBlcmwKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBpbnN0YWxsIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybAorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJbXYgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliL3Blcmw1ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwKKworCWRoX2luc3RhbGwgLWkKKworaW5zdGFsbC1hcmNoOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2NsZWFuIC1rIC1zCisJZGhfaW5zdGFsbGRpcnMgLXMKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgYXJjaCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KKwkjIGRlYmlhbi90bXAuCisJIyQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RocmlmdCBpbnN0YWxsCisKKwkjIENvbXBpbGVyCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2JpbiAmJiBcCisJY3AgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluL3RocmlmdCAmJiBcCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL3NiaW4KKworCSMgUHl0aG9uCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCisJcHl0aG9uMiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0ICYmIFwKKwlweXRob24yLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAmJiBcCisJcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAmJiBcCisJcHl0aG9uMy1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnCisKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCSMgUEhQCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdAorCWNkICQoQ1VSRElSKS9saWIvcGhwICYmIFwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQgaW5zdGFsbAorCisJIyBDKysgYW5kIEMgKGdsaWIpCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90bXA7IFwKKwljZCAkKENVUkRJUikvbGliL2NwcCAmJiBcCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisJY2QgJChDVVJESVIpL2xpYi9jX2dsaWIgJiYgXAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCisJZGhfaW5zdGFsbCAtLXNvdXJjZWRpcj1kZWJpYW4vdG1wIC1zCisKKworIyBNdXN0IG5vdCBkZXBlbmQgb24gYW55dGhpbmcuIFRoaXMgaXMgdG8gYmUgY2FsbGVkIGJ5CisjIGJpbmFyeS1hcmNoL2JpbmFyeS1pbmRlcAorIyBpbiBhbm90aGVyICdtYWtlJyB0aHJlYWQuCitiaW5hcnktY29tbW9uOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2luc3RhbGxjaGFuZ2Vsb2dzCisJZGhfaW5zdGFsbGRvY3MKKwlkaF9pbnN0YWxsZXhhbXBsZXMKKwlkaF9pbnN0YWxsbWFuCisJZGhfbGluaworCWRoX3N0cmlwIC1wbGlidGhyaWZ0MCAtLWRiZy1wYWNrYWdlPWxpYnRocmlmdDAtZGJnCisJZGhfc3RyaXAgLXBweXRob24tdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbjMtdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uMy10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXB0aHJpZnQtY29tcGlsZXIKKwlkaF9jb21wcmVzcworCWRoX2ZpeHBlcm1zCisJZGhfbWFrZXNobGlicworCWRoX2luc3RhbGxkZWIKKwlkaF9wZXJsCisJZGhfc2hsaWJkZXBzCisJZGhfZ2VuY29udHJvbAorCWRoX21kNXN1bXMKKwlkaF9idWlsZGRlYgorIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCitiaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKKwkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KKworIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgorYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCisJZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQoc2hlbGwgcGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+ICQoQ1VSRElSKS9kZWJpYW4vc3Vic3R2YXJzCisJJChNQUtFKSAtZiBkZWJpYW4vcnVsZXMgREhfT1BUSU9OUz0tcyBiaW5hcnktY29tbW9uCisKK2JpbmFyeTogYmluYXJ5LWFyY2ggYmluYXJ5LWluZGVwCisuUEhPTlk6IGJ1aWxkIGNsZWFuIGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaCBiaW5hcnkgaW5zdGFsbCBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2RlYmlhbi9zdWJzdHZhcnMgYi9kZWJpYW4vc3Vic3R2YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vc3Vic3R2YXJzCkBAIC0wLDAgKzEgQEAKK3BocDpEZXBlbmRzPXBocGFwaS0yMDEyMTIxMgpkaWZmIC0tZ2l0IGEvZGViaWFuL3RocmlmdC1kb2MuZG9jcyBiL2RlYmlhbi90aHJpZnQtZG9jLmRvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi90aHJpZnQtZG9jLmRvY3MKQEAgLTAsMCArMSwyIEBACisjRE9DUyMKKwpkaWZmIC0tZ2l0IGEvZGViaWFuL3RocmlmdC1kb2MuaW5zdGFsbCBiL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKQEAgLTAsMCArMSwyIEBACisjRE9DUyMKKwpkaWZmIC0tZ2l0IGEvZG9hcC5yZGYgYi9kb2FwLnJkZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjc2ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9hcC5yZGYKQEAgLTAsMCArMSwxNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCI/PgorPHJkZjpSREYgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly91c2VmdWxpbmMuY29tL25zL2RvYXAjIiAKKyAgICAgICAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgCisgICAgICAgICB4bWxuczphc2ZleHQ9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL25zL2FzZmV4dCMiCisgICAgICAgICB4bWxuczpmb2FmPSJodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyI+Cis8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICA8UHJvamVjdCByZGY6YWJvdXQ9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyI+CisgICAgPGNyZWF0ZWQ+MjAxMi0wNC0xNDwvY3JlYXRlZD4KKyAgICA8bGljZW5zZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly91c2VmdWxpbmMuY29tL2RvYXAvbGljZW5zZXMvYXNsMjAiIC8+CisgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICA8aG9tZXBhZ2UgcmRmOnJlc291cmNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciIC8+CisgICAgPGFzZmV4dDpwbWMgcmRmOnJlc291cmNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciIC8+CisgICAgPHNob3J0ZGVzYz5BcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudCwgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBDKyssIEphdmEsIFB5dGhvbiwgUEhQLCBSdWJ5LCBFcmxhbmcsIFBlcmwsIEhhc2tlbGwsIEMjLCBDb2NvYSwgSmF2YVNjcmlwdCwgTm9kZS5qcywgU21hbGx0YWxrLCBPQ2FtbCBhbmQgRGVscGhpIGFuZCBvdGhlciBsYW5ndWFnZXMuIDwvc2hvcnRkZXNjPgorICAgIDxkZXNjcmlwdGlvbj5BcGFjaGUgVGhyaWZ0IGFsbG93cyB5b3UgdG8gZGVmaW5lIGRhdGEgdHlwZXMgYW5kIHNlcnZpY2UgaW50ZXJmYWNlcyBpbiBhIHNpbXBsZSBkZWZpbml0aW9uIGZpbGUuIFRha2luZyB0aGF0IGZpbGUgYXMgaW5wdXQsIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgY29kZSB0byBiZSB1c2VkIHRvIGVhc2lseSBidWlsZCBSUEMgY2xpZW50cyBhbmQgc2VydmVycyB0aGF0IGNvbW11bmljYXRlIHNlYW1sZXNzbHkgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gSW5zdGVhZCBvZiB3cml0aW5nIGEgbG9hZCBvZiBib2lsZXJwbGF0ZSBjb2RlIHRvIHNlcmlhbGl6ZSBhbmQgdHJhbnNwb3J0IHlvdXIgb2JqZWN0cyBhbmQgaW52b2tlIHJlbW90ZSBtZXRob2RzLCB5b3UgY2FuIGdldCByaWdodCBkb3duIHRvIGJ1c2luZXNzLiA8L2Rlc2NyaXB0aW9uPgorICAgIDxidWctZGF0YWJhc2UgcmRmOnJlc291cmNlPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgLz4KKyAgICA8bWFpbGluZy1saXN0IHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL21haWxpbmcvIiAvPgorICAgIDxkb3dubG9hZC1wYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2Rvd25sb2FkLyIgLz4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QWN0aW9uU2NyaXB0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkMjPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QysrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+Q29jb2E8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGFydDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkRlbHBoaTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkVybGFuZzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkdvPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGFza2VsbDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkhheGU8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YVNjcmlwdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPm5vZGUuanM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5PQ2FtbDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlBlcmw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QSFA8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QeXRob248L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5SdXN0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+U21hbGxUYWxrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9odHRwIiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2xpYnJhcnkiIC8+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvbmV0d29yay1jbGllbnQiIC8+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvbmV0d29yay1zZXJ2ZXIiIC8+CisgICAgPHJlbGVhc2UgcmRmOnBhcnNlVHlwZT0iQ29sbGVjdGlvbiI+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxOC0xMi0yODwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTIuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNy0xMS0zMDwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTEuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNy0wMy0wMTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTAuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNS0wOS0yNTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4zPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE0LTExLTA1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjI8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTMtMDgtMjI8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMTwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMi0xMC0xNTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDExLTExLTI5PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC44LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTEtMDgtMTM8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjcuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0wNC0yNTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNi4xPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDExLTAyLTA4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC42LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQgKGluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEwLTEwLTA3PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC41LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQgKGluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEwLTA4LTIzPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC40LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQgKGluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEwLTA4LTA0PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4zLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQgKGluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDA5LTEyLTExPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4yLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgIDwvcmVsZWFzZT4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxHaXRSZXBvc2l0b3J5PgorICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLz4KKyAgICAgICAgPGJyb3dzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0Ii8+CisgICAgICA8L0dpdFJlcG9zaXRvcnk+CisgICAgPC9yZXBvc2l0b3J5PgorICAgIDxtYWludGFpbmVyPgorICAgICAgPGZvYWY6UGVyc29uPgorICAgICAgICA8Zm9hZjpuYW1lPkFwYWNoZSBUaHJpZnQgUE1DPC9mb2FmOm5hbWU+CisgICAgICAgICAgPGZvYWY6bWJveCByZGY6cmVzb3VyY2U9Im1haWx0bzpkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLz4KKyAgICAgIDwvZm9hZjpQZXJzb24+CisgICAgPC9tYWludGFpbmVyPgorICA8L1Byb2plY3Q+Cis8L3JkZjpSREY+CmRpZmYgLS1naXQgYS9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODEwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDQ4IEBACisjIFRocmlmdCBDb2RpbmcgU3RhbmRhcmRzCisKKyAgIEFueSBmb29sIGNhbiB3cml0ZSBjb2RlIHRoYXQgYSBjb21wdXRlciBjYW4gdW5kZXJzdGFuZC4KKyAgIEdvb2QgcHJvZ3JhbW1lcnMgd3JpdGUgY29kZSB0aGF0IGh1bWFucyBjYW4gdW5kZXJzdGFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBNYXJ0aW4gRm93bGVyLCAxOTk5CisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gbWFrZSBldmVyeW9uZSdzIGxpZmUgZWFzaWVyLgorCitJdCdzIGVhc2llciB3aGVuIHlvdSByZWFkIGdvb2QsIHdlbGwgZm9ybWF0dGVkLCB3aXRoIGNsZWFybHkgZGVmaW5lZCBwdXJwb3NlLCBjb2RlLgorQnV0IHRoZSBvbmx5IHdheSB0byByZWFkIGNsZWFuIGNvZGUgaXMgdG8gd3JpdGUgc3VjaC4KKworVGhpcyBkb2N1bWVudCBjYW4gaGVscCBhY2hpZXZlIHRoYXQsIGJ1dCBrZWVwIGluIG1pbmQgdGhhdAordGhvc2UgYXJlIG5vdCBzaWx2ZXItYnVsbGV0LCBmaXgtYWxsLWF0LW9uY2UgcnVsZXMuIEp1c3QgdGhpbmsgYWJvdXQgcmVhZGFiaWxpdHkgd2hpbGUgd3JpdGluZyBjb2RlLgorV3JpdGUgY29kZSBsaWtlIHlvdSB3b3VsZCBoYXZlIHRvIHJlYWQgaXQgaW4gdGVuIHllYXJzIGZyb20gbm93LgorCisjIyBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHMKKworVGhyaWZ0IGhhcyBzb21lIGhpc3RvcnkuIE5vdCBhbGwgZXhpc3RpbmcgY29kZSBmb2xsb3dzIHRob3NlIHJ1bGVzLgorQnV0IHdlIHdhbnQgdG8gaW1wcm92ZSBvdmVyIHRpbWUuCitXaGVuIG1ha2luZyBzbWFsbCBjaGFuZ2UgLyBidWdmaXggLSBsaWtlIHNpbmdsZSBsaW5lIGZpeCAtIGRvICpub3QqIHJlZmFjdG9yIHdob2xlIGZ1bmN0aW9uLgorVGhhdCBkaXN0dXJicyBjb2RlIHJlcG9zaXRvcnkgaGlzdG9yeS4KK1doZW5ldmVyIGFkZGluZyBzb21ldGhpbmcgbmV3IGFuZCAvIG9yIG1ha2luZyBiaWdnZXIgcmVmYWN0b3JpbmcKKyAtIGZvbGxvdyB0aG9zZSBydWxlcyBhcyBzdHJpY3RseSBhcyB5b3UgY2FuLgorCitXaGVuIGluIGRvdWJ0IC0gY29udGFjdCBvdGhlciBkZXZlbG9wZXJzICh1c2luZyBkZXZAIG1haWxpbmcgbGlzdCBvciBJUkMpLgorQ29kZSByZXZpZXcgaXMgdGhlIGJlc3Qgd2F5IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisKKyMjIyBCYXNpY3MKKyAqIFVzZSBzcGFjZXMgbm90IHRhYnMKKyAqIFVzZSBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgaW4gZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzCisgKiBDb21taXQgdG8gcmVwb3NpdG9yeSB1c2luZyBVbml4LXN0eWxlIGxpbmUgZW5kaW5ncyAoTEYpCisgICAgIE9uIFdpbmRvd3M6CisgICAgICAgZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUKKyAqIE1heGltdW0gbGluZSB3aWR0aCAtIDEwMCBjaGFyYWN0ZXJzCisgKiBJZiBub3Qgc3BlY2lmaWVkIG90aGVyd2lzZSBpbiBsYW5ndWFnZSBzcGVjaWZpYyBzdGFuZGFyZCAtIHVzZSAyIHNwYWNlcyBhcyBpbmRlbnQvdGFiCisKKyMjIyBDb21tZW50cworICogRWFjaCBmaWxlIGhhcyB0byBzdGFydCB3aXRoIGNvbW1lbnQgY29udGFpbmluZyBbQXBhY2hlIExpY2Vuc2VdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkKKyAqIFB1YmxpYyBBUEkgb2YgbGlicmFyeSBzaG91bGQgYmUgZG9jdW1lbnRlZCwgcHJlZmVyYWJseSB1c2luZyBmb3JtYXQgbmF0aXZlIGZvciBsYW5ndWFnZSBzcGVjaWZpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gdG9vbHMgKEphdmFkb2MsIERveHlnZW4gZXRjLikKKyAqIE90aGVyIGNvbW1lbnRzIGFyZSBkaXNjb3VyYWdlZCAtIGNvbW1lbnRzIGFyZSBsaWVzLiBXaGVuIG9uZSBoYXMgdG8gbWFrZSBjb21tZW50IGl0IG1lYW5zIG9uZSBmYWlsZWQgdG8gd3JpdGUgcmVhZGFibGUgY29kZS4gSW5zdGVhZCBvZiAiSSBzaG91bGQgd3JpdGUgYSBjb21tZW50IGhlcmUiIHRoaW5rICJJIHNob3VsZCBjbGVhbiBpdCB1cCIKKyAqIERvIG5vdCBsZWF2ZSAiVE9ETy9GSVhNRSIgY29tbWVudHMgLSBmaWxlIFtKaXJhXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKSBpc3N1ZSBpbnN0ZWFkCisKKyMjIyBOYW1pbmcKKyBGaW5kaW5nIHByb3BlciBuYW1lcyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYW5kIG1vc3QgZGlmZmljdWx0IHRhc2sgaW4gc29mdHdhcmUgZGV2ZWxvcG1lbnQuCisKKyMjIExhbmd1YWdlIFNwZWNpZmljIENvZGluZyBTdGFuZGFyZHMKKworRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZSBgbGliL0xBTkcvY29kaW5nX3N0YW5kYXJkcy5tZGAKZGlmZiAtLWdpdCBhL2RvYy9jb21taXR0ZXJzLm1kIGIvZG9jL2NvbW1pdHRlcnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZDdiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb21taXR0ZXJzLm1kCkBAIC0wLDAgKzEsNTQgQEAKKyMjIFByb2Nlc3MgdXNlZCBieSBjb21taXR0ZXJzIHRvIHJldmlldyBhbmQgc3VibWl0IHBhdGNoZXMKKworMS4gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYW4gaXNzdWUgZm9yIHRoZSBwYXRjaChzKSB5b3UgYXJlIGFib3V0IHRvIGNvbW1pdCBpbiBvdXIgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkKKworMS4gQ2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUKKworICAqIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgdGhyaWZ0CisKKzEuIEFwcGx5IHRoZSBwYXRjaAorCisgICogY3VybCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvLi4uIHxnaXQgYXBwbHkgLS1pZ25vcmUtc3BhY2UtY2hhbmdlCisKKyAgb3IKKworICAqIGN1cmwgaHR0cHM6Ly9naXRodWIuY29tLzxHaXRIdWIgVXNlcj4vdGhyaWZ0L2NvbW1pdC88Q29tbWl0IElEPi5wYXRjaCB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQorCisKKzEuIEluc3BlY3QgdGhlIGFwcGxpZWQgcGF0Y2ggdG8gZW5zdXJlIHRoYXQgYWxsIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpIGFyZSBtZXQKKworMS4gUnVuIHRoZSBuZWNlc3NhcnkgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlIHBhdGNoCisKKzEuIENvbW1pdCB0aGUgcGF0Y2gKKworICAgICAgICBnaXQgLS1jb25maWcgdXNlci5uYW1lICJZb3VyIE5hbWUiCisgICAgICAgIGdpdCAtLWNvbmZpZyB1c2VyLmVtYWlsICJZb3VyQXBhY2hlSURAYXBhY2hlLm9yZyIKKyAgICAgICAgZ2l0IGFkZCAtQQorICAgICAgICBnaXQgY29tbWl0CisKKzEuIFRoZSBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdDoKKworICAgICAgIFRIUklGVC0jIyM6PEppcmEgZGVzY3JpcHRpb24+CisgICAgICAgQ2xpZW50OiA8Y29tcG9uZW50PgorICAgICAgIFBhdGNoOiA8TmFtZSBvZiBwZXJzb24gY29udHJpYnV0aW5nIHRoZSBwYXRjaD4KKworICAgICAgIERlc2NyaXB0aW9uIG9mIHdoYXQgd2FzIGZpeGVkIG9yIGFkZHJlc3NlZC4KKworICAgICAgIDwlCisgICAgICAgICAgIGlmIHRoaXMgaXMgYSBnaXRodWIgcHVsbCByZXF1ZXN0IHRoZW4gYWRkIGJlbG93IGNvbW1lbnQKKyAgICAgICAgICAgIHRvIGF1dG9tYXRpY2FseSBjbG9zZSBHaXRIdWIgcmVxdWVzdC4KKyAgICAgICAlPgorICAgICAgIFRoaXMgY2xvc2VzICNYWAorCisKKzEuIERvdWJsZSBjaGVjayB0aGUgcGF0Y2ggY29tbWl0dGVkIGFuZCB0aGF0IG5vdGhpbmcgd2FzIG1pc3NlZCB0aGVuIHB1c2ggdGhlIHBhdGNoCisKKyAgICAgICBnaXQgc3RhdHVzCisgICAgICAgZ2l0IHNob3cgSEVBRAorICAgICAgIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIKKworCisxLiBSZXNvbHZlIHRoZSBqaXJhIGlzc3VlIGFuZCBzZXQgdGhlIGZvbGxvd2luZyBmb3IgdGhlIGNoYW5nZWxvZworCisgICogQ29tcG9uZW50IHRoZSBwYXRjaCBpcyBmb3IKKyAgKiBmaXhWZXJzaW9uIHRvIHRoZSBjdXJyZW50IHZlcnNpb24gb24gbWFzdGVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2Nncm4ucG5nIGIvZG9jL2ltYWdlcy9jZ3JuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA5NjRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jZ3JuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2NyZWQucG5nIGIvZG9jL2ltYWdlcy9jcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZhNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjY0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2N5ZWwucG5nIGIvZG9jL2ltYWdlcy9jeWVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFkZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jeWVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nIGIvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFjY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9SRUFETUUubWQgYi9kb2MvaW5zdGFsbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMzFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZApAQCAtMCwwICsxLDQzIEBACisKKyMjIEJhc2ljIHJlcXVpcmVtZW50cworKiBBIHJlbGF0aXZlbHkgUE9TSVgtY29tcGxpYW50ICpOSVggc3lzdGVtCisgICAgKiBDeWd3aW4gb3IgTWluR1cgY2FuIGJlIHVzZWQgb24gV2luZG93cyAoYnV0IHRoZXJlIGFyZSBiZXR0ZXIgb3B0aW9ucywgc2VlIGJlbG93KQorKiBnKysgNC4yCisqIGJvb3N0IDEuNTMuMAorKiBSdW50aW1lIGxpYnJhcmllcyBmb3IgbGV4IGFuZCB5YWNjIG1pZ2h0IGJlIG5lZWRlZCBmb3IgdGhlIGNvbXBpbGVyLgorCisjIyBSZXF1aXJlbWVudHMgZm9yIGJ1aWxkaW5nIGZyb20gc291cmNlCisqIEdOVSBidWlsZCB0b29sczogCisgICAgKiBhdXRvY29uZiAyLjY1CisgICAgKiBhdXRvbWFrZSAxLjEzCisgICAgKiBsaWJ0b29sIDEuNS4yNAorKiBwa2ctY29uZmlnIGF1dG9jb25mIG1hY3JvcyAocGtnLm00KQorKiBsZXggYW5kIHlhY2MgKGRldmVsb3BlZCBwcmltYXJpbHkgd2l0aCBmbGV4IGFuZCBiaXNvbikKKyogbGlic3NsLWRldgorCisjIyBSZXF1aXJlbWVudHMgZm9yIGJ1aWxkaW5nIHRoZSBjb21waWxlciBmcm9tIHNvdXJjZSBvbiBXaW5kb3dzCisqIFZpc3VhbCBTdHVkaW8gQysrCisqIEZsZXggYW5kIEJpc29uIChlLmcuIHRoZSBXaW5GbGV4Qmlzb24gcGFja2FnZSkKKworIyMgTGFuZ3VhZ2UgcmVxdWlyZW1lbnRzCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIHRoZSBsaWJyYXJpZXMgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZQorCisqIEMrKworICAgICogQm9vc3QgMS41My4wCisgICAgKiBsaWJldmVudCAob3B0aW9uYWwsIHRvIGJ1aWxkIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIpCisgICAgKiB6bGliIChvcHRpb25hbCkKKyogSmF2YQorICAgICogSmF2YSAxLjgKKyAgICAqIEFwYWNoZSBBbnQKKyogQyM6IE1vbm8gMS4yLjQgKGFuZCBwa2ctY29uZmlnIHRvIGRldGVjdCBpdCkgb3IgVmlzdWFsIFN0dWRpbyAyMDA1KworKiBQeXRob24gMi42IChpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGZvciBleHRlbnNpb24gbW9kdWxlcykKKyogUEhQIDUuMCAob3B0aW9uYWxseSBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGZvciBleHRlbnNpb24gbW9kdWxlcykKKyogUnVieSAxLjgKKyAgICAqIGJ1bmRsZXIgZ2VtCisqIEVybGFuZyBSMTIgKFIxMSB3b3JrcyBidXQgbm90IHJlY29tbWVuZGVkKQorKiBQZXJsIDUKKyAgICAqIEJpdDo6VmVjdG9yCisgICAgKiBDbGFzczo6QWNjZXNzb3IKKyogSGF4ZSAzLjEuMworKiBHbyAxLjQKKyogRGVscGhpIDIwMTAKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2NlbnRvcy5tZCBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkzMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvY2VudG9zLm1kCkBAIC0wLDAgKzEsNzUgQEAKKyMgQnVpbGRpbmcgQXBhY2hlIFRocmlmdCBvbiBDZW50T1MgNi41CisKK1N0YXJ0aW5nIHdpdGggYSBtaW5pbWFsIGluc3RhbGxhdGlvbiwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgcmVxdWlyZWQgdG8gYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBDZW50b3MgNi41LiBUaGlzIGV4YW1wbGUgYnVpbGRzIGZyb20gc291cmNlLCB1c2luZyB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBtYXN0ZXIgYnJhbmNoLiBUaGVzZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGFsc28gd29yayB3aXRoIEFwYWNoZSBUaHJpZnQgcmVsZWFzZXMgYmVnaW5uaW5nIHdpdGggMC45LjIuCisKKyMjIFVwZGF0ZSB0aGUgU3lzdGVtCisKKwlzdWRvIHl1bSAteSB1cGRhdGUKKworIyMgSW5zdGFsbCB0aGUgUGxhdGZvcm0gRGV2ZWxvcG1lbnQgVG9vbHMKKworCXN1ZG8geXVtIC15IGdyb3VwaW5zdGFsbCAiRGV2ZWxvcG1lbnQgVG9vbHMiCisKKyMjIFVwZ3JhZGUgYXV0b2NvbmYvYXV0b21ha2UvYmlzb24KKworCXN1ZG8geXVtIGluc3RhbGwgLXkgd2dldAorCisjIyMgVXBncmFkZSBhdXRvY29uZgorCisJd2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9jb25mL2F1dG9jb25mLTIuNjkudGFyLmd6CisJdGFyIHh2ZiBhdXRvY29uZi0yLjY5LnRhci5negorCWNkIGF1dG9jb25mLTIuNjkKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisJY2QgLi4KKworIyMjIFVwZ3JhZGUgYXV0b21ha2UKKworCXdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvbWFrZS9hdXRvbWFrZS0xLjE0LnRhci5negorCXRhciB4dmYgYXV0b21ha2UtMS4xNC50YXIuZ3oKKwljZCBhdXRvbWFrZS0xLjE0CisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCWNkIC4uCisKKyMjIyBVcGdyYWRlIGJpc29uCisKKwl3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vYmlzb24tMi41LjEudGFyLmd6CisJdGFyIHh2ZiBiaXNvbi0yLjUuMS50YXIuZ3oKKwljZCBiaXNvbi0yLjUuMQorCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKwljZCAuLgorCisjIyBBZGQgT3B0aW9uYWwgQysrIExhbmd1YWdlIExpYnJhcnkgRGVwZW5kZW5jaWVzCisKK0FsbCBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgYW5kIGF0IHRoaXMgcG9pbnQgZXZlcnl0aGluZyBuZWVkZWQgdG8gbWFrZSB0aGUgSURMIENvbXBpbGVyIGlzIGluc3RhbGxlZCAoaWYgeW91IG9ubHkgbmVlZCB0aGUgY29tcGlsZXIgeW91IGNhbiBza2lwIHRvIHRoZSBCdWlsZCBzdGVwKS4gCisKK0lmIHlvdSB3aWxsIGJlIGRldmVsb3BpbmcgQXBhY2hlIFRocmlmdCBjbGllbnRzL3NlcnZlcnMgaW4gQysrIHlvdSB3aWxsIGFsc28gbmVlZCBhZGRpdGlvbmFsIHBhY2thZ2VzIHRvIHN1cHBvcnQgdGhlIEMrKyBzaGFyZWQgbGlicmFyeSBidWlsZC4KKworIyMjIEluc3RhbGwgQysrIExpYiBEZXBlbmRlbmNpZXMKKworCXN1ZG8geXVtIC15IGluc3RhbGwgbGliZXZlbnQtZGV2ZWwgemxpYi1kZXZlbCBvcGVuc3NsLWRldmVsCisKKyMjIyBVcGdyYWRlIEJvb3N0ID49IDEuNTMKKworCXdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjUzLjAvYm9vc3RfMV81M18wLnRhci5negorCXRhciB4dmYgYm9vc3RfMV81M18wLnRhci5negorCWNkIGJvb3N0XzFfNTNfMAorCS4vYm9vdHN0cmFwLnNoCisJc3VkbyAuL2IyIGluc3RhbGwKKworIyMgQnVpbGQgYW5kIEluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyCisKKwlnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CisJY2QgdGhyaWZ0CisJLi9ib290c3RyYXAuc2gKKwkuL2NvbmZpZ3VyZSAtLXdpdGgtbHVhPW5vCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisKK1RoaXMgd2lsbCBidWlsZCB0aGUgY29tcGlsZXIgKHRocmlmdC9jb21waWxlci9jcHAvdGhyaWZ0IC0tdmVyc2lvbikgYW5kIGFueSBsYW5ndWFnZSBsaWJyYXJpZXMgc3VwcG9ydGVkLiBUaGUgbWFrZSBpbnN0YWxsIHN0ZXAgaW5zdGFsbHMgdGhlIGNvbXBpbGVyIG9uIHRoZSBwYXRoOiAvdXNyL2xvY2FsL2Jpbi90aHJpZnQKK1lvdSBjYW4gdXNlIHRoZSAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1saWJzPW5vIHN3aXRjaCB0byBidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgb25seSB3aXRob3V0IGxpYiBidWlsZHMuIFRvIHJ1biB0ZXN0cyB1c2UgIm1ha2UgY2hlY2siLgpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvZGViaWFuLm1kIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjY5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKQEAgLTAsMCArMSw2MiBAQAorIyMgRGViaWFuL1VidW50dSBpbnN0YWxsCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBpbnN0YWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgcmVxdWlyZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgYW5kIEMrKyBsaWJyYXJpZXMgb24gYSBEZWJpYW4vVWJ1bnR1IExpbnV4IGJhc2VkIHN5c3RlbS4KKworCXN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9tYWtlIGJpc29uIGZsZXggZysrIGdpdCBsaWJib29zdC1hbGwtZGV2IGxpYmV2ZW50LWRldiBsaWJzc2wtZGV2IGxpYnRvb2wgbWFrZSBwa2ctY29uZmlnCisKK0RlYmlhbiA3L1VidW50dSAxMiB1c2VycyBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIGF1dG9tYWtlIGFuZCAoZm9yIEMrKyBsaWJyYXJ5IGFuZCB0ZXN0IHN1cHBvcnQpIGJvb3N0OgorCisgICAgd2dldCBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuL3Bvb2wvbWFpbi9hL2F1dG9tYWtlLTEuMTUvYXV0b21ha2VfMS4xNS0zX2FsbC5kZWIKKyAgICBzdWRvIGRwa2cgLWkgYXV0b21ha2VfMS4xNS0zX2FsbC5kZWIKKworICAgIHdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjYwLjAvYm9vc3RfMV82MF8wLnRhci5neiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXIgeHZmIGJvb3N0XzFfNjBfMC50YXIuZ3oKKyAgICBjZCBib29zdF8xXzYwXzAKKyAgICAuL2Jvb3RzdHJhcC5zaAorICAgIHN1ZG8gLi9iMiBpbnN0YWxsCisKKyMjIE9wdGlvbmFsIHBhY2thZ2VzCisKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgbGlicmFyaWVzIGZvciBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcy4gVGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgcGFja2FnZXM6CisKKyAqIEphdmEKKwkqIHBhY2thZ2VzOiBhbnQgIAorCSogWW91IHdpbGwgYWxzbyBuZWVkIEphdmEgSkRLIHYxLjggb3IgaGlnaGVyLiBUeXBlICoqamF2YWMqKiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrYWdlcywgcGljayB0aGUgb25lIHlvdSBwcmVmZXIgYW5kICoqYXB0LWdldCBpbnN0YWxsKiogaXQgKGUuZy4gZGVmYXVsdC1qZGspLgorICogUnVieQorCSogcnVieS1mdWxsIHJ1YnktZGV2IHJ1YnktcnNwZWMgcmFrZSBydWJ5Z2VtcyBidW5kbGVyCisgKiBQeXRob24KKwkqIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcKKyAqIFBlcmwKKwkqIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisgKiBQaHAsIGluc3RhbGwKKwkqIHBocDUtZGV2IHBocDUtY2xpIHBocHVuaXQKKyAqIENfZ2xpYgorCSogbGliZ2xpYjIuMC1kZXYKKyAqIEVybGFuZworCSogZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYgcmViYXIKKyAqIENzaGFycAorCSogbW9uby1nbWNzIG1vbm8tZGV2ZWwgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBudW5pdCBudW5pdC1jb25zb2xlCisgKiBIYXNrZWxsCisJKiBnaGMgY2FiYWwtaW5zdGFsbCBsaWJnaGMtYmluYXJ5LWRldiBsaWJnaGMtbmV0d29yay1kZXYgbGliZ2hjLWh0dHAtZGV2CisgKiBUaHJpZnQgQ29tcGlsZXIgZm9yIFdpbmRvd3MKKwkqIG1pbmd3LXc2NCBtaW5ndy13NjQteDg2LTY0LWRldiBuc2lzCisgKiBSdXN0CisJKiBydXN0YyBjYXJnbworICogSGF4ZQorCSogaGF4ZQorICogTHVhCisgICAgKiBsdWE1LjMgbGlibHVhNS4zLWRldgorICogTm9kZUpzCisgICAgKiBub2RlanMgbnBtCisgKiBkb3RuZXRjb3JlCisgICAgKiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9sZWFybi9nZXQtc3RhcnRlZC9saW51eHVidW50dQorICogZC1sYW5nCisgICAgKiBjdXJsIC1mc1MgaHR0cHM6Ly9kbGFuZy5vcmcvaW5zdGFsbC5zaCB8IGJhc2ggLXMgZG1kCisgKiBkYXJ0ICYgcHViCisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvaW5zdGFsbC9saW51eAorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL3B1Yi9pbnN0YWxsaW5nCisJCisKKyMjIEFkZGl0aW9uYWwgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVxdWlyZW1lbnRzIHNlZTogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBUaHJpZnQgc2VlOiBbQnVpbGRpbmcgZnJvbSBzb3VyY2VdKC9kb2NzL0J1aWxkaW5nRnJvbVNvdXJjZSkKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL29zX3gubWQgYi9kb2MvaW5zdGFsbC9vc194Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTllZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9vc194Lm1kCkBAIC0wLDAgKzEsMjcgQEAKKyMjIE9TIFggU2V0dXAKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBpbnN0YWxsIGFsbCB0aGUgcmVxdWlyZWQgdG9vbHMgYW5kIGxpYnJhcmllcyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBvbiBhIE9TIFggYmFzZWQgc3lzdGVtLiAKKworIyMjIEluc3RhbGwgQm9vc3QKK0Rvd25sb2FkIHRoZSBib29zdCBsaWJyYXJ5IGZyb20gW2Jvb3N0Lm9yZ10oaHR0cDovL3d3dy5ib29zdC5vcmcpIHVudGFyIGNvbXBpbGUgd2l0aAorCisJLi9ib290c3RyYXAuc2gKKwlzdWRvIC4vYjIgdGhyZWFkaW5nPW11bHRpIGFkZHJlc3MtbW9kZWw9NjQgdmFyaWFudD1yZWxlYXNlIHN0YWdlIGluc3RhbGwKKworIyMjIEluc3RhbGwgbGliZXZlbnQKK0Rvd25sb2FkIFtsaWJldmVudF0oaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudCksIHVudGFyIGFuZCBjb21waWxlIHdpdGgKKworCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IvbG9jYWwgCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisKKyMjIyBCdWlsZGluZyBBcGFjaGUgVGhyaWZ0CitEb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgW0FwYWNoZSBUaHJpZnRdKC9kb3dubG9hZCksIHVudGFyIGFuZCBjb21waWxlIHdpdGgKKworCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IvbG9jYWwvIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsIC0td2l0aC1saWJldmVudD0vdXNyL2xvY2FsCisKKyMjIEFkZGl0aW9uYWwgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVxdWlyZW1lbnRzIHNlZTogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBUaHJpZnQgc2VlOiBbQnVpbGRpbmcgZnJvbSBzb3VyY2VdKC9kb2NzL0J1aWxkaW5nRnJvbVNvdXJjZSkKKwpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvd2luZG93cy5tZCBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxODkzNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKQEAgLTAsMCArMSwxODYgQEAKKyMjIFdpbmRvd3MgU2V0dXAKKworVGhlIFRocmlmdCBlbnZpcm9ubWVudCBjb25zaXN0cyBvZiB0d28gbWFpbiBwYXJ0czogVGhlIFRocmlmdCBjb21waWxlciBFWEUgYW5kIHRoZSBsYW5ndWFnZS1kZXBlbmRlbnQgbGlicmFyaWVzLiBNb3N0IG9mIHRoZXNlIGxpYnJhcmllcyB3aWxsIHJlcXVpcmUgc29tZSBraW5kIG9mIGJ1aWxkIGFuZC9vciBpbnN0YWxsYXRpb24uIEJ1dCByZWdhcmRpbmcgdGhlIFRocmlmdCBjb21waWxlciB1dGlsaXR5IHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzLiAKKworVGhlIGZpcnN0IG9uZSBvZiB0aGVzZSBhbHRlcm5hdGl2ZXMgaXMgdG8gZG93bmxvYWQgdGhlICoqcHJlLWJ1aWx0IFRocmlmdCBDb21waWxlciBFWEUqKiBhbmQgb25seSBidWlsZCB0aGUgbGlicmFyaWVzIG5lZWRlZCBmcm9tIHNvdXJjZSwgZm9sbG93aW5nIG9uZSBvZiB0aGUgIlNldHVwIGZyb20gc291cmNlIiBtZXRob2RzIG91dGxpbmVkIGJlbG93LgorCitUaGUgb3RoZXIgdHdvIG9wdGlvbnMgYXJlIHRvIGJ1aWxkIHRoZSBUaHJpZnQgY29tcGlsZXIgZnJvbSBzb3VyY2UuIFRoZSBtb3N0IHJlY29tbWVuZGVkIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbWVhbnMgb2YgdGhlICoqVmlzdWFsIFN0dWRpbyBDKysgYnVpbGQgcHJvamVjdCoqLiBBbHRlcm5hdGl2ZWx5LCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGNhbiBhbHNvIGJlIGJ1aWx0IHZpYSAqKkN5Z3dpbioqIG9yICoqTWluR1cqKiBidWlsZCBlbnZpcm9ubWVudHMsIGhvd2V2ZXIgdGhpcyBtZXRob2QgaXMgbm90IG9ubHkgbGVzcyBjb21mb3J0YWJsZSwgYnV0IG1vcmUgdGltZS1jb25zdW1pbmcgYW5kIHJlcXVpcmVzIG11Y2ggbW9yZSBtYW51YWwgZWZmb3J0LiAKKworCisjIyBQcmVidWlsdCBUaHJpZnQgY29tcGlsZXIKKworVGhlIHdpbmRvd3MgVGhyaWZ0IGNvbXBpbGVyIGlzIGF2YWlsYWJsZSBhcyBhIHByZWJ1aWx0IGV4ZSBhdmFpbGFibGUgW2hlcmVdKC9kb3dubG9hZCkuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBpbnN0YWxsYXRpb24gdG9vbCwgcmF0aGVyIHRoaXMgRVhFIGZpbGUgKmlzKiBhbHJlYWR5IHRoZSBUaHJpZnQgY29tcGlsZXIgdXRpbGl0eS4gRG93bmxvYWQgdGhlIGZpbGUgYW5kIHB1dCBpdCBpbnRvIHNvbWUgc3VpdGFibGUgbG9jYXRpb24gb2YgeW91ciBjaG9pY2UuCisKK05vdyBwaWNrIG9uZSBvZiB0aGUgIkJ1aWxkIGFuZCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMiIGJlbG93IHRvIGNvbnRpbnVlLgorCisgCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgVmlzdWFsIFN0dWRpbyBDKysgKHJlY29tbWVuZGVkKQorCisjIyMgUmVxdWlyZW1lbnRzCisKK1RocmlmdCdzIGNvbXBpbGVyIGlzIHdyaXR0ZW4gaW4gQysrIGFuZCBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSwgYnV0IHRoZXJlIGFyZSBzb21lIHN5c3RlbSByZXF1aXJlbWVudHMuIFRocmlmdCdzIHJ1bnRpbWUgbGlicmFyaWVzIGFyZSB3cml0dGVuIGluIHZhcmlvdXMgbGFuZ3VhZ2VzLCB3aGljaCBhcmUgYWxzbyByZXF1aXJlZCBmb3IgdGhlIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgaW50ZXJmYWNlLgorCisgKiBWaXN1YWwgU3R1ZGlvIEMrKywgYW55IHJlY2VudCB2ZXJzaW9uIHNob3VsZCBkbworICogRmxleCBhbmQgQmlzb24sIGUuZy4gdGhlIFdpbkZsZXhCaXNvbiBwYWNrYWdlCisgKiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0aGUgY29tcGlsZXIKKyAKK0FmdGVyIGFsbCByZXF1aXJlbWVudHMgYXJlIGluIHBsYWNlLCB1c2UgdGhlIGBjb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvamAgYnVpbGQgcHJvamVjdCB0byBidWlsZCB0aGUgVGhyaWZ0IGNvbXBpbGVyLiBDb3B5IHRoZSByZXN1bHRpbmcgRVhFIGZpbGUgdG8gYSBsb2NhdGlvbiBvZiB5b3VyIGNob2ljZS4gCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzCisKK0EgZmV3IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGlicmFyaWVzIGFsc28gZG8gcHJvdmlkZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMsIHN1Y2ggYXMgQysrIGFuZCBDIy4gVGhlc2UgYXJlIGxvY2F0ZWQgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlcnMuIAorCitNb3N0IG9mIHRoZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMgYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMuIFR5cGljYWwgZXhhbXBsZXMgYXJlIEphdmEsIFJ1YnksIERlbHBoaSwgb3IgUEhQLiBMb29rIGZvciB0aGUgYFJFQURNRS5tZGAgZmlsZSBpbiB0aGUgYGxpYi88bGFuZ3VhZ2U+L2AgZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGVhY2ggbGFuZ3VhZ2UncyBsaWJyYXJ5IHBhY2thZ2UuCisgCisKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBDeWd3aW4KKworIyMjIFJlcXVpcmVtZW50cworCitUaHJpZnQncyBjb21waWxlciBpcyB3cml0dGVuIGluIEMrKyBhbmQgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzeXN0ZW0gcmVxdWlyZW1lbnRzLiBUaHJpZnQncyBydW50aW1lIGxpYnJhcmllcyBhcmUgd3JpdHRlbiBpbiB2YXJpb3VzIGxhbmd1YWdlcywgd2hpY2ggYXJlIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGludGVyZmFjZS4KKworICogQ3lnd2luIG9yIE1pbkdXIAorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCisjIyMgSW5zdGFsbGluZyBmcm9tIHNvdXJjZQorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdSBkb3dubG9hZGVkIGEgdGFyYmFsbC4pICBGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworCS4vYm9vdHN0cmFwLnNoCisKK09uY2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGFyZSBnZW5lcmF0ZWQsIHRocmlmdCBjYW4gYmUgY29uZmlndXJlZC4gRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKwlleHBvcnQgQ1hYRkxBR1M9Ii1EIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QPVBUSFJFQURfTVVURVhfUkVDVVJTSVZFIgorCS4vY29uZmlndXJlCisKK1NldHRpbmcgdGhlIENYWEZMQUdTIGVudmlyb25tZW50YWwgdmFyaWFibGUgd29ya3MgYXJvdW5kIGNvbXBpbGUgZXJyb3JzIHdpdGggUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAgYmVpbmcgdW5kZWNsYXJlZCwgYnkgcmVwbGFjaW5nIGl0IHdpdGggdGhlIG5ld2VyLCBwb3J0YWJsZSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRS4gKFRlc3RlZCBvbiBjeWd3aW4gMjAxMDAzMjAsIFRocmlmdCByNzYwMTg0LCBsYXRlc3QgcHRocmVhZC4pCisKKyoqT3B0aW9uYWw6KiogWW91ICoqbWF5IG5vdCoqIGJlIGFibGUgdG8gbWFrZSBmcm9tIHRoZSByb290ICBUaHJpZnQgZGlyZWN0b3J5IGR1ZSB0byBlcnJvcnMgKHNlZSBiZWxvdyB0byByZXNvbHZlKS4gVG8gbWFrZSB0aGUgY29tcGlsZXIgb25seSwgY2hhbmdlIHRvIHRoZSBjb21waWxlciBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgbWFrZToKKworCWNkIGNvbXBpbGVyL2NwcAorCitOb3cgbWFrZSB0aGUgdGhyaWZ0IGNvbXBpbGVyICgmIHJ1bnRpbWUgbGlicmFyaWVzIGlmIG1ha2UgaXMgcnVuIGZyb20gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSk6CisKKwltYWtlCisJbWFrZSBpbnN0YWxsCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzCisKK1NvbWUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMgYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMuIFR5cGljYWwgZXhhbXBsZXMgYXJlIEphdmEsIFJ1YnksIG9yIFBIUC4gTG9vayBmb3IgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorCisjIyMgUG9zc2libGUgaXNzdWVzIHdpdGggQ3lnd2luIGluc3RhbGwKKworU2VlIGFsc28gUG9zc2libGUgaXNzdWVzIHdpdGggTWluR1cgaW5zdGFsbC4KKworIyMjIyBTeW50YXggZXJyb3IgaW4gLi9jb25maWd1cmUKKworVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnMgZm9yIHNvbWUgdXNlcnMgd2hlbiBydW5uaW5nIC4vY29uZmlndXJlOgorCisJLi9jb25maWd1cmU6IGxpbmUgMjExODM6IHN5bnRheCBlcnJvciBuZWFyIHVuZXhwZWN0ZWQgdG9rZW4gYE1PTk8sJworCS4vY29uZmlndXJlOiBsaW5lIDIxMTgzOiBgICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDEuMi42LCBoYXZlX21vbm89eWVzLCBoYXZlX21vbm89bm8pJworCitUbyByZXNvbHZlIHRoaXMsIHlvdSdsbCBuZWVkIHRvIGZpbmQgeW91ciBwa2cubTQgKGluc3RhbGxlZCBieSB0aGUgcGtnLWNvbmZpZyBwYWNrYWdlKSBmaWxlIGFuZCBjb3B5IGl0IHRvIHRoZSB0aHJpZnQvYWNsb2NhbCBkaXJlY3RvcnkuICBGcm9tIHRoZSB0b3AtbGV2ZWwgdGhyaWZ0IGRpcmVjdG9yeSwgeW91IGNhbiBjb3B5IHRoZSBmaWxlIGJ5IHJ1bm5pbmcKKworCWNwIC91c3Ivc2hhcmUvYWNsb2NhbC9wa2cubTQgYWNsb2NhbAorCitGaW5hbGx5LCByZS1ydW4gLi9ib290c3RyYXAuc2ggYW5kIC4vY29uZmlndXJlLiAgKE5vdGUgdGhhdCBwa2cubTQgaXMgY3JlYXRlZCBieSB0aGUgcGtnLWNvbmZpZyB0b29sLiAgSWYgeW91ciAvdXNyL3NoYXJlL2FjbG9jYWwgZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aGUgcGtnLm00IGZpbGUsIHlvdSBtYXkgbm90IGhhdmUgcGtnLWNvbmZpZyBpbnN0YWxsZWQuKQorCisjIyMjIEluc3RhbGxpbmcgcGVybCBydW50aW1lIGxpYnJhcmllcworCitTb21ldGltZXMsIHRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgZHVyaW5nIHRoZSBpbnN0YWxsIG9mIHRoZSBwZXJsIGxpYnJhcmllcyB3aXRoIGNobW9kLgorCitBIHdvcmthcm91bmQgaXMgdG8gYXZvaWQgaW5zdGFsbGluZyB0aGUgcGVybCBsaWJyYXJpZXMgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4KKworSWYgeW91IGRvbid0IG5lZWQgcGVybCwgcnVuIGNvbmZpZ3VyZSB3aXRoIC0td2l0aG91dC1wZXJsLgorCitJZiB5b3UgbmVlZCBwZXJsLCBhbmQgYXJlIGhhcHB5IHRvIG1hbnVhbGx5IGluc3RhbGwgaXQsIHJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRocmlmdC9saWIvcGVybC9NYWtlZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcsIGFmdGVyIGJ1aWxkaW5nIHRocmlmdDoKKwkKKwlUT0RPCisKKyMjIyMgTGlua2luZyB0byBpbnN0YWxsZWQgQysrIHJ1bnRpbWUgbGlicmFyaWVzCisKK1NvbWV0aW1lcywgdGhlIGluc3RhbGxlZCBsaWJ0aHJpZnQuYSB3aWxsIG5vdCBsaW5rIHVzaW5nIGcrKywgd2l0aCBsaW5rZXIgZXJyb3JzIGFib3V0IG1pc3NpbmcgdnRhYmxlcyBhbmQgZXhjZXB0aW9ucyBmb3IgVGhyaWZ0IGNsYXNzZXMuCisKK0Egd29ya2Fyb3VuZCBpcyB0byBsaW5rIHRoZSBjb21waWxlZCBvYmplY3QgZmlsZXMgZGlyZWN0bHkgZnJvbSB5b3VyIFRocmlmdCBidWlsZCwgY29ycmVzcG9uZGluZyB0byB0aGUgbWlzc2luZyBjbGFzc2VzLgorCitUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBhIE1ha2VmaWxlIHVzaW5nIHRoZSBmb2xsb3dpbmcgbGluZXM6CisKKwlUSFJJRlRfTz08cGF0aCB0bz4vdGhyaWZ0L2xpYi9jcHAKKwlMVEhSSUZUPSQoVEhSSUZUX08pL1RocmlmdC5vICQoVEhSSUZUX08pL1RTb2NrZXQubyAkKFRIUklGVF9PKS9UQmluYXJ5UHJvdG9jb2wubyAkKFRIUklGVF9PKS9UQnVmZmVyVHJhbnNwb3J0cy5vCisKK1RoZW4gbGlua2luZyB1c2luZyAkKExUSFJJRlQpIGluc3RlYWQgb2YgLWx0aHJpZnQuCisKKwlUT0RPIC0gZGlhZ25vc2UgaXNzdWUgZnVydGhlcgorCisjIyMjIEMrKyBydW50aW1lIHNlZ2ZhdWx0IHdpdGggY3lnd2luIDEuNy41LTEsIGcrKy00LjMuNCwgZm9yaygpIGFuZCB0aHJvdworCitJZiB5b3VyIHRocmlmdCBDKysgcHJvZ3JhbXMgc2VnZmF1bHQgb24gdGhyb3cgYWZ0ZXIgZm9yaygpaW5nLCBjb21waWxlIHRoZW0gd2l0aCBnKystMy4KKworVGhlIGlzc3VlIGFuZCBwYXRjaCBhcmUgZGVzY3JpYmVkIG9uIHRoZSBDeWd3aW4gbWFpbGluZyBsaXN0IGF0IGh0dHA6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDEwLTA1L21zZzAwMjAzLmh0bWwKKworVGhpcyBpc3N1ZSBzaG91bGQgYmUgZml4ZWQgaW4gQ3lnd2luIHZlcnNpb25zIGFmdGVyIDEuNy41LTEsIG9yIGcrKyA0LjUuMC4KKworIyMgU2V0dXAgZnJvbSBzb3VyY2UgdmlhIE1pbkdXCisKKyMjIyBSZXF1aXJlbWVudHMKKworVG8gY29tcGlsZSB0aGUgVGhyaWZ0IGdlbmVyYXRvciAmIHJ1bnRpbWUgbGlicmFyaWVzICh1bnRlc3RlZCkgd2l0aG91dCB0aGUgY3lnd2luLmRsbCBkZXBlbmRlbmN5IHlvdSBuZWVkIHRvIGluc3RhbGwgTWluR1cgKHd3dy5taW5ndy5vcmcpLiAKKworICogTWluR1cgCisgKiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0luIGFkZGl0aW9uIHlvdSBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGVudHJ5IHRvIHlvdXIgd2luZG93cyBQQVRIIHZhcmlhYmxlLgorCisJQzpcTUlOR1dcQklOCisJCitOZXh0LCBvcGVuIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aHJpZnRfQ1hYRkxBR1MKKworCS1ETUlOR1cgLW1uby1jeWd3aW4gLWxmbAorCQorUnVuIGJvb3RzdHJhcC5zaDoKKworCS4vYm9vdHN0cmFwLnNoCisKK01ha2Ugc3VyZSB5b3UgaGF2ZSBqYXZhIGluIHlvdXIgJFBBVEggdmFyaWFibGUsIGlmIG5vdCBkbyhhZGp1c3QgcGF0aCBpZiBuZWNlc3NhcnkpOgorCisJZXhwb3J0IFBBVEg9JFBBVEg6Ii9jeWdkcml2ZS9jL3Byb2dyYW0gZmlsZXMvamF2YS9qcmUxLjguMF8xOTEvYmluIgorCitSdW4gY29uZmlndXJlIC0gdXNpbmcgQ1hYRkxBR1MgdG8gd29yayBhcm91bmQgYW4gaXNzdWUgd2l0aCBhbiBvbGQgcHRocmVhZHMgZGVmaW5lICh1bnRlc3RlZCBvbiBNaW5HVyAtIHdvcmtzIG9uIEN5Z3dpbik6CisKKwlleHBvcnQgQ1hYRkxBR1M9Ii1EIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QPVBUSFJFQURfTVVURVhfUkVDVVJTSVZFIgorCS4vY29uZmlndXJlCisKKycnT3B0aW9uYWw6JycgVG8gbWFrZSB0aGUgY29tcGlsZXIgb25seSwgY2hhbmdlIHRvIHRoZSBjb21waWxlciAgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIG1ha2U6CisKKwljZCBjb21waWxlci9jcHAKKwkKK1J1biBtYWtlOgorCisJbWluZ3czMi1tYWtlLmV4ZQorCisjIyMgUG9zc2libGUgaXNzdWVzIHdpdGggTWluR1cgaW5zdGFsbAorCitTZWUgYWxzbyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBDeWd3aW4gaW5zdGFsbCwgaW5jbHVkaW5nIHRoZSBkaXNjdXNzaW9uIGFib3V0IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLgorCisjIyMjIHl5d3JhcCBpcyBub3QgZm91bmQKKworTWFrZSBzdXJlIHlvdSBhZGQgLWxmbCBpbiB5b3VyIGN4eGZsYWdzIGluIE1ha2VmaWxlLCBhbHNvIHRyeSBhZGRpbmcgLUxjOi9jeWd3aW4vbGlicworCisjIyMjIGJvb3N0IGlzIG5vdCBmb3VuZAorCitUcnkgYW5kIGNoYW5nZSB0aGUgaW5jbHVkZSBkaXIgdG8gdXNlIHRoZSB3aW5kb3dzIHBhdGggZnJvbSBjIGxpa2UgdGhpczogRWRpdCBjb21waWxlci9jcHAvTWFrZWZpbGUsIGxvb2sgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBCT09TVF9DUFBGTEFHUywgY2hhbmdlIHRoYXQgbGluZSBmb3IKKworCUJPT1NUX0NQUEZMQUdTID0gLUljOi9jeWd3aW4vdXNyL2luY2x1ZGUvYm9vc3QtMV81M18wCisJCisjIyMjIHJlYWxwYXRoIGlzIG5vdCBmb3VuZAorCithZGQgLURNSU5HVyAtbW5vLWN5Z3dpbiB0byB0aGUgQ1hYREVGUyB2YXJpYWJsZSBpbiBNYWtlZmlsZQorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCisKZGlmZiAtLWdpdCBhL2RvYy9sZ3BsLTIuMS50eHQgYi9kb2MvbGljZW5zZXMvbGdwbC0yLjEudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbGdwbC0yLjEudHh0CnJlbmFtZSB0byBkb2MvbGljZW5zZXMvbGdwbC0yLjEudHh0CmRpZmYgLS1naXQgYS9kb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgYi9kb2MvbGljZW5zZXMvb3RwLWJhc2UtbGljZW5zZS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dApyZW5hbWUgdG8gZG9jL2xpY2Vuc2VzL290cC1iYXNlLWxpY2Vuc2UudHh0CmRpZmYgLS1naXQgYS9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBiL2RvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAxYTdkLi4wMDAwMDAwCi0tLSBhL2RvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLUNvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2ssIEluYy4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uCi1vYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQotdGhpcyBsaWNlbnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3BsYXksIGRpc3RyaWJ1dGUsCi1leGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQotU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KLWRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgotCi1UaGUgY29weXJpZ2h0IG5vdGljZXMgaW4gdGhlIFNvZnR3YXJlIGFuZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZwotdGhlIGFib3ZlIGxpY2Vuc2UgZ3JhbnQsIHRoaXMgcmVzdHJpY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLW11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGFuZAotYWxsIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNvZnR3YXJlLCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQotd29ya3MgYXJlIHNvbGVseSBpbiB0aGUgZm9ybSBvZiBtYWNoaW5lLWV4ZWN1dGFibGUgb2JqZWN0IGNvZGUgZ2VuZXJhdGVkIGJ5Ci1hIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQKLVNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBCRSBMSUFCTEUKLUZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCi1ERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjN2FlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApAQCAtMCwwICsxLDgyIEBACis8bGluayBocmVmPSJodHRwOi8va2V2aW5idXJrZS5iaXRidWNrZXQub3JnL21hcmtkb3duY3NzL21hcmtkb3duLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij48L2xpbms+CisKK0hlYWRlciBmb3JtYXQgZm9yIHRoZSBUSGVhZGVyLmgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICBIRUFERVIgTUFHSUMgICAgICAgICAgfCAgICAgICAgICAgIEZMQUdTICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBTRVFVRU5DRSBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgSGVhZGVyIFNpemUoLzMyKSAgICAgICAgfCAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaXMgb2YgdmFyaWFibGUgc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzdGFydHMgYXQgb2Zmc2V0IDE0KQorCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIFBST1RPQ09MIElEICAodmFyaW50KSAgfCAgIE5VTSBUUkFOU0ZPUk1TICh2YXJpbnQpICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgIFRSQU5TRk9STSAwIElEICh2YXJpbnQpICAgfCAgICAgICAgVFJBTlNGT1JNIDAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICBJTkZPIDAgSUQgKHZhcmludCkgICAgICB8ICAgICAgIElORk8gMCAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworVGhlIGBMRU5HVEhgIGZpZWxkIGlzIDMyIGJpdHMsIGFuZCBjb3VudHMgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUKK3BhY2tldCwgTk9UIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkLiAgVGhlIGhlYWRlciBzaXplIGZpZWxkIGlzIDE2CitiaXRzLCBhbmQgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHJlbWFpbmluZyBOT1QgaW5jbHVkaW5nIHRoZQorYEhFQURFUiBNQUdJQ2AsIGBGTEFHU2AsIGBTRVFVRU5DRSBOVU1CRVJgIGFuZCBoZWFkZXIgc2l6ZSBmaWVsZHMuICBUaGUKK0hlYWRlciBzaXplIGZpZWxkIGlzIGluIGJ5dGVzLzQuCisKK1RoZSB0cmFuc2Zvcm0gSUQncyBhcmUgdmFyaW50cy4gIFRoZSBkYXRhIGZvciBlYWNoIHRyYW5zZm9ybSBpcworZGVmaW5lZCBieSB0aGUgdHJhbnNmb3JtIElEIGluIHRoZSBjb2RlIC0gbm8gc2l6ZSBpcyBnaXZlbiBpbiB0aGUKK2hlYWRlci4gIElmIGEgdHJhbnNmb3JtIElEIGlzIHNwZWNpZmllZCBmcm9tIGEgY2xpZW50IGFuZCB0aGUgc2VydmVyCitkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHRyYW5zZm9ybSBJRCwgYW4gZXJyb3IgTVVTVCBiZSByZXR1cm5lZCBhcyB3ZQorZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNmb3JtIHRoZSBkYXRhLgorCitDb252ZXJzZWx5LCBkYXRhIGluIHRoZSBpbmZvIGhlYWRlcnMgaXMgaWdub3JhYmxlLiAgVGhpcyBzaG91bGQgb25seQorYmUgdGhpbmdzIGxpa2UgdGltZXN0YW1wcywgZGVidWdpbmcgdHJhY2luZywgZXRjLiAgVXNpbmcgdGhlIGhlYWRlcgorc2l6ZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcCB0aGlzIGRhdGEgYW5kIHJlYWQgdGhlIHBheWxvYWQgc2FmZWx5CitpZiB5b3UgZG9uJ3Qga25vdyB0aGUgaW5mbyBJRC4KKworSW5mbydzIHNob3VsZCBiZSBvbGRlc3Qgc3VwcG9ydGVkIHRvIG5ld2VzdCBzdXBwb3J0ZWQgb3JkZXIsIHNvIHRoYXQKK2lmIHdlIHJlYWQgYW4gaW5mbyBJRCB3ZSBkb24ndCBzdXBwb3J0LCBub25lIG9mIHRoZSByZW1haW5pbmcgaW5mbworSUQncyB3aWxsIGJlIHN1cHBvcnRlZCBlaXRoZXIsIGFuZCB3ZSBjYW4gc2FmZWx5IHNraXAgdG8gdGhlIHBheWxvYWQuCisKK0luZm8gSUQncyBhbmQgdHJhbnNmb3JtIElEJ3Mgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLgorCisjIyMgUEFERElORzoKKworSGVhZGVyIHdpbGwgYmUgcGFkZGVkIG91dCB0byBuZXh0IDQtYnl0ZSBib3VuZGFyeSB3aXRoIGAweDAwYC4KKworTWF4IGZyYW1lIHNpemUgaXMgYDB4M0ZGRkZGRkZgLCB3aGljaCBpcyBzbGlnaHRseSBsZXNzIHRoYW4gYEhUVFBfTUFHSUNgLgorVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3VzaCBiZXR3ZWVuIGRpZmZlcmVudCAob2xkZXIpIHRyYW5zcG9ydHMuCisKKyMjIyBUcmFuc2Zvcm0gSURzOgorCisgICAgWkxJQl9UUkFOU0ZPUk0gMHgwMSAtIE5vIGRhdGEgZm9yIHRoaXMuICBVc2UgemxpYiB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKyAgICBITUFDX1RSQU5TRk9STSAweDAyIC0gVmFyaWFibGUgYW1vdW50IG9mIG1hYyBkYXRhLiAgT25lIGJ5dGUgdG8gc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLiBNYWMgZGF0YSBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuCisgICAgU05BUFBZX1RSQU5TRk9STSAgMHgwMyAgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHNuYXBweSB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKworIyMjSW5mbyBJRHM6CisKKyAgICBJTkZPX0tFWVZBTFVFIDB4MDEgLSB2YXJpbnQzMiBudW1iZXIgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgLSBrZXkvdmFsdWUgcGFpcnMgb2YgdmFyc3RyaW5ncyAodmFyaW50MTYgbGVuZ3RoIHBsdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBuby10cmFpbGluZy1udWxsIHN0cmluZykuCisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy9pZGwubWQgYi9kb2Mvc3BlY3MvaWRsLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjJmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvaWRsLm1kCkBAIC0wLDAgKzEsMjcyIEBACisjIyBUaHJpZnQgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGxhbmd1YWdlCitUaGUgVGhyaWZ0IGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlIChJREwpIGFsbG93cyBmb3IgdGhlIGRlZmluaXRpb24gb2YgW1RocmlmdCBUeXBlc10oL2RvY3MvdHlwZXMpLiBBIFRocmlmdCBJREwgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIFRocmlmdCBjb2RlIGdlbmVyYXRvciB0byBwcm9kdWNlIGNvZGUgZm9yIHRoZSB2YXJpb3VzIHRhcmdldCBsYW5ndWFnZXMgdG8gc3VwcG9ydCB0aGUgZGVmaW5lZCBzdHJ1Y3RzIGFuZCBzZXJ2aWNlcyBpbiB0aGUgSURMIGZpbGUuCisKKyMjIERlc2NyaXB0aW9uCisKKypVbmRlciBjb25zdHJ1Y3Rpb24qCisKK0hlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgVGhyaWZ0IElETC4KKworIyMgRG9jdW1lbnQKKworRXZlcnkgVGhyaWZ0IGRvY3VtZW50IGNvbnRhaW5zIDAgb3IgbW9yZSBoZWFkZXJzIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBkZWZpbml0aW9ucy4KKworICAgIFsxXSAgRG9jdW1lbnQgICAgICAgIDo6PSAgSGVhZGVyKiBEZWZpbml0aW9uKgorCisjIyBIZWFkZXIKKworQSBoZWFkZXIgaXMgZWl0aGVyIGEgVGhyaWZ0IGluY2x1ZGUsIGEgQysrIGluY2x1ZGUsIG9yIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgorCisgICAgWzJdICBIZWFkZXIgICAgICAgICAgOjo9ICBJbmNsdWRlIHwgQ3BwSW5jbHVkZSB8IE5hbWVzcGFjZQorCisjIyMgVGhyaWZ0IEluY2x1ZGUKKworQW4gaW5jbHVkZSBtYWtlcyBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbm90aGVyIGZpbGUgdmlzaWJsZSAod2l0aCBhIHByZWZpeCkgYW5kIGFkZHMgY29ycmVzcG9uZGluZyBpbmNsdWRlIHN0YXRlbWVudHMgaW50byB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgVGhyaWZ0IGRvY3VtZW50LgorCisgICAgWzNdICBJbmNsdWRlICAgICAgICAgOjo9ICAnaW5jbHVkZScgTGl0ZXJhbAorCisjIyMgQysrIEluY2x1ZGUKKworQSBDKysgaW5jbHVkZSBhZGRzIGEgY3VzdG9tIEMrKyBpbmNsdWRlIHRvIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciBmb3IgdGhpcyBUaHJpZnQgZG9jdW1lbnQuIAorCisgICAgWzRdICBDcHBJbmNsdWRlICAgICAgOjo9ICAnY3BwX2luY2x1ZGUnIExpdGVyYWwKKworIyMjIE5hbWVzcGFjZQorCitBIG5hbWVzcGFjZSBkZWNsYXJlcyB3aGljaCBuYW1lc3BhY2VzL3BhY2thZ2UvbW9kdWxlL2V0Yy4gdGhlIHR5cGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIHdpbGwgYmUgZGVjbGFyZWQgaW4gZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZXNwYWNlIHNjb3BlIGluZGljYXRlcyB3aGljaCBsYW5ndWFnZSB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG87IGEgc2NvcGUgb2YgJyonIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lc3BhY2UgYXBwbGllcyB0byBhbGwgdGFyZ2V0IGxhbmd1YWdlcy4KKworICAgIFs1XSAgTmFtZXNwYWNlICAgICAgIDo6PSAgKCAnbmFtZXNwYWNlJyAoIE5hbWVzcGFjZVNjb3BlIElkZW50aWZpZXIgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3NtYWxsdGFsay5jYXRlZ29yeScgU1RJZGVudGlmaWVyICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsucHJlZml4JyBJZGVudGlmaWVyICkgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdwaHBfbmFtZXNwYWNlJyBMaXRlcmFsICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAneHNkX25hbWVzcGFjZScgTGl0ZXJhbCApCisKKyAgICBbNl0gIE5hbWVzcGFjZVNjb3BlICA6Oj0gICcqJyB8ICdjcHAnIHwgJ2phdmEnIHwgJ3B5JyB8ICdwZXJsJyB8ICdyYicgfCAnY29jb2EnIHwgJ2NzaGFycCcKKworTi5CLjogU21hbGx0YWxrIGhhcyB0d28gZGlzdGluY3QgdHlwZXMgb2YgbmFtZXNwYWNlIGNvbW1hbmRzOgorCistIHNtYWxsdGFsay5wcmVmaXg6IFByZXBlbmRlZCB0byBnZW5lcmF0ZWQgY2xhc3NuYW1lcy4KKyAgLSBTbWFsbHRhbGsgZG9lcyBub3QgaGF2ZSBuYW1lc3BhY2VzIGZvciBjbGFzc2VzLCBzbyBwcmVmaXhlcworICAgIGFyZSB1c2VkIHRvIGF2b2lkIGNsYXNzLW5hbWUgY29sbGlzaW9ucy4KKyAgICBPZnRlbiwgdGhlIHByZWZpeCBpcyB0aGUgYXV0aG9yJ3MgaW5pdGlhbHMsIGxpa2UgIktCIiBvciAiSldTIiwKKyAgICBvciBhbiBhYmJyZXZpYXRpb24gb2YgdGhlIHBhY2thZ2UgbmFtZSwgbGlrZSAiTUMiIGZvciAiTW9udGljZWxsbyIuCistIHNtYWxsdGFsay5jYXRlZ29yeTogRGV0ZXJtaW5lcyB0aGUgY2F0ZWdvcnkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzLgorICBBbnkgZG90cyBpbiB0aGUgaWRlbnRpZmllciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaHlwaGVucyB3aGVuIGdlbmVyYXRpbmcKKyAgdGhlIGNhdGVnb3J5IG5hbWUuCisgIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gIkdlbmVyYXRlZC0iICsgdGhlIHByb2dyYW0gbmFtZS4KKyAgTWV0aG9kcyB3aWxsIG5vdCBiZSBjYXRlZ29yaXplZCBiZXlvbmQgImFzIHlldCB1bmNhdGVnb3JpemVkIi4KKyAgLSBTbWFsbHRhbGsgYWxsb3dzIGZpbGluZyBib3RoIGNsYXNzZXMgYW5kIG1ldGhvZHMgd2l0aGluIGNsYXNzZXMgaW50byBuYW1lZAorICAgIGdyb3Vwcy4gVGhlc2UgbmFtZWQgZ3JvdXBzIG9mIG1ldGhvZHMgYXJlIGNhbGxlZCBjYXRlZ29yaWVzLgorCitOLkIuOiBUaGUgYHBocF9uYW1lc3BhY2VgIGRpcmVjdGl2ZSB3aWxsIGJlIGRlcHJlY2F0ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIGluIGZhdm9yIG9mIHRoZSBzY29wZWQgc3ludGF4LCBidXQgdGhlIHNjb3BlZCBzeW50YXggaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIFBIUC4KKworTi5CLjogVGhlIGB4c2RfbmFtZXNwYWNlYCBkaXJlY3RpdmUgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyBEZWZpbml0aW9uCisKKyAgICBbN10gIERlZmluaXRpb24gICAgICA6Oj0gIENvbnN0IHwgVHlwZWRlZiB8IEVudW0gfCBTZW51bSB8IFN0cnVjdCB8IFVuaW9uIHwgRXhjZXB0aW9uIHwgU2VydmljZQorCisjIyMgQ29uc3QKKworICAgIFs4XSAgQ29uc3QgICAgICAgICAgIDo6PSAgJ2NvbnN0JyBGaWVsZFR5cGUgSWRlbnRpZmllciAnPScgQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPworCisjIyMgVHlwZWRlZgorCitBIHR5cGVkZWYgY3JlYXRlcyBhbiBhbHRlcm5hdGUgbmFtZSBmb3IgYSB0eXBlLgorCisgICAgWzldICBUeXBlZGVmICAgICAgICAgOjo9ICAndHlwZWRlZicgRGVmaW5pdGlvblR5cGUgSWRlbnRpZmllcgorCisjIyMgRW51bQorCitBbiBlbnVtIGNyZWF0ZXMgYW4gZW51bWVyYXRlZCB0eXBlLCB3aXRoIG5hbWVkIHZhbHVlcy4gSWYgbm8gY29uc3RhbnQgdmFsdWUgaXMgc3VwcGxpZWQsIHRoZSB2YWx1ZSBpcyBlaXRoZXIgMCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQsIG9yIG9uZSBncmVhdGVyIHRoYW4gdGhlIHByZWNlZGluZyB2YWx1ZSBmb3IgYW55IHN1YnNlcXVlbnQgZWxlbWVudC4gQW55IGNvbnN0YW50IHZhbHVlIHRoYXQgaXMgc3VwcGxpZWQgbXVzdCBiZSBub24tbmVnYXRpdmUuCisKKyAgICBbMTBdIEVudW0gICAgICAgICAgICA6Oj0gICdlbnVtJyBJZGVudGlmaWVyICd7JyAoSWRlbnRpZmllciAoJz0nIEludENvbnN0YW50KT8gTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMjIFNlbnVtCisKK1NlbnVtIChhbmQgU2xpc3QpIGFyZSBub3cgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJvdGggYmUgcmVwbGFjZWQgd2l0aCBTdHJpbmcuCisKKyAgICBbMTFdIFNlbnVtICAgICAgICAgICA6Oj0gICdzZW51bScgSWRlbnRpZmllciAneycgKExpdGVyYWwgTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMjIFN0cnVjdAorCitTdHJ1Y3RzIGFyZSB0aGUgZnVuZGFtZW50YWwgY29tcG9zaXRpb25hbCB0eXBlIGluIFRocmlmdC4gVGhlIG5hbWUgb2YgZWFjaCBmaWVsZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHN0cnVjdC4KKworICAgIFsxMl0gU3RydWN0ICAgICAgICAgIDo6PSAgJ3N0cnVjdCcgSWRlbnRpZmllciAneHNkX2FsbCc/ICd7JyBGaWVsZCogJ30nCisKK04uQi46IFRoZSBgeHNkX2FsbGAga2V5d29yZCBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisKKyMjIyBVbmlvbgorCitVbmlvbnMgYXJlIHNpbWlsYXIgdG8gc3RydWN0cywgZXhjZXB0IHRoYXQgdGhleSBwcm92aWRlIGEgbWVhbnMgdG8gdHJhbnNwb3J0IGV4YWN0bHkgb25lIGZpZWxkIG9mIGEgcG9zc2libGUgc2V0IG9mIGZpZWxkcywganVzdCBsaWtlIHVuaW9uIHt9IGluIEMrKy4gQ29uc2VxdWVudGx5LCB1bmlvbiBtZW1iZXJzIGFyZSBpbXBsaWNpdGx5IGNvbnNpZGVyZWQgb3B0aW9uYWwgKHNlZSByZXF1aXJlZG5lc3MpLgorCisgICAgWzEzXSBVbmlvbiAgICAgICAgICA6Oj0gICd1bmlvbicgSWRlbnRpZmllciAneHNkX2FsbCc/ICd7JyBGaWVsZCogJ30nCisKK04uQi46IFRoZSBgeHNkX2FsbGAga2V5d29yZCBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisKKyMjIyBFeGNlcHRpb24KKworRXhjZXB0aW9ucyBhcmUgc2ltaWxhciB0byBzdHJ1Y3RzIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVuZGVkIHRvIGludGVncmF0ZSB3aXRoIHRoZSBuYXRpdmUgZXhjZXB0aW9uIGhhbmRsaW5nIG1lY2hhbmlzbXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZXMuIFRoZSBuYW1lIG9mIGVhY2ggZmllbGQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBleGNlcHRpb24uCisKKyAgICBbMTRdIEV4Y2VwdGlvbiAgICAgICA6Oj0gICdleGNlcHRpb24nIElkZW50aWZpZXIgJ3snIEZpZWxkKiAnfScKKworIyMjIFNlcnZpY2UKKworQSBzZXJ2aWNlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIGEgc2V0IG9mIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgYSBUaHJpZnQgc2VydmVyLiBUaGUgaW50ZXJmYWNlIGlzIHNpbXBseSBhIGxpc3Qgb2YgZnVuY3Rpb25zLiBBIHNlcnZpY2UgY2FuIGV4dGVuZCBhbm90aGVyIHNlcnZpY2UsIHdoaWNoIHNpbXBseSBtZWFucyB0aGF0IGl0IHByb3ZpZGVzIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGV4dGVuZGVkIHNlcnZpY2UgaW4gYWRkaXRpb24gdG8gaXRzIG93bi4KKworICAgIFsxNV0gU2VydmljZSAgICAgICAgIDo6PSAgJ3NlcnZpY2UnIElkZW50aWZpZXIgKCAnZXh0ZW5kcycgSWRlbnRpZmllciApPyAneycgRnVuY3Rpb24qICd9JworCisjIyBGaWVsZAorCisgICAgWzE2XSBGaWVsZCAgICAgICAgICAgOjo9ICBGaWVsZElEPyBGaWVsZFJlcT8gRmllbGRUeXBlIElkZW50aWZpZXIgKCc9IENvbnN0VmFsdWUpPyBYc2RGaWVsZE9wdGlvbnMgTGlzdFNlcGFyYXRvcj8KKworIyMjIEZpZWxkIElECisKKyAgICBbMTddIEZpZWxkSUQgICAgICAgICA6Oj0gIEludENvbnN0YW50ICc6JworCisjIyMgRmllbGQgUmVxdWlyZWRuZXNzCisKK1RoZXJlIGFyZSB0d28gZXhwbGljaXQgcmVxdWlyZWRuZXNzIHZhbHVlcywgYW5kIGEgdGhpcmQgb25lIHRoYXQgaXMgYXBwbGllZCBpbXBsaWNpdHkgaWYgbmVpdGhlciAgKnJlcXVpcmVkKiBub3IgKm9wdGlvbmFsKiBhcmUgZ2l2ZW46ICpkZWZhdWx0KiByZXF1aXJlZG5lc3MuCisKKyAgICBbMThdIEZpZWxkUmVxICAgICAgICA6Oj0gICdyZXF1aXJlZCcgfCAnb3B0aW9uYWwnIAorCitUaGUgZ2VuZXJhbCBydWxlcyBmb3IgcmVxdWlyZWRuZXNzIGFyZSBhcyBmb2xsb3dzOgorCisjIyMjIHJlcXVpcmVkCisKKy0gV3JpdGU6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4gYW5kIGFyZSBleHBlY3RlZCB0byBiZSBzZXQuCistIFJlYWQ6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHJlYWQgYW5kIGFyZSBleHBlY3RlZCB0byBiZSBjb250YWluZWQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKy0gRGVmYXVsdHMgdmFsdWVzOiBhcmUgYWx3YXlzIHdyaXR0ZW4KKworSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGR1cmluZyByZWFkLCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGlzIHRvIGluZGljYXRlIGFuIHVuc3VjY2Vzc2Z1bCByZWFkIG9wZXJhdGlvbiB0byB0aGUgY2FsbGVyLCBlLmcuIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbiBvciByZXR1cm5pbmcgYW4gZXJyb3IuIAorCitCZWNhdXNlIG9mIHRoaXMgYmVoYXZpb3VyLCByZXF1aXJlZCBmaWVsZHMgZHJhc3RpY2FsbHkgbGltaXQgdGhlIG9wdGlvbnMgd2l0aCByZWdhcmQgdG8gc29mdCB2ZXJzaW9uaW5nLiBCZWNhdXNlIHRoZXkgbXVzdCBiZSBwcmVzZW50IG9uIHJlYWQsIHRoZSBmaWVsZHMgY2Fubm90IGJlIGRlcHJlY2F0ZWQuIElmIGEgcmVxdWlyZWQgZmllbGQgd291bGQgYmUgcmVtb3ZlZCAob3IgY2hhbmdlZCB0byBvcHRpb25hbCksIHRoZSBkYXRhIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZSBiZXR3ZWVuIHZlcnNpb25zLgorCQorIyMjIyBvcHRpb25hbAorCistIFdyaXRlOiBPcHRpb25hbCBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiB3aGVuIHRoZXkgYXJlIHNldAorLSBSZWFkOiBPcHRpb25hbCBmaWVsZHMgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBhcmUgd3JpdHRlbiB3aGVuIHRoZSBpc3NldCBmbGFnIGlzIHNldAorCitNb3N0IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHJlY29tbWVuZGVkIHByYXRpY2Ugb2Ygc28tY2FsbGVkICJpc3NldCIgZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBhIHBhcnRpY3VsYXIgb3B0aW9uYWwgZmllbGQgaXMgc2V0IG9yIG5vdC4gT25seSBmaWVsZHMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSB3cml0dGVuLCBhbmQgY29udmVyc2VseSB0aGUgZmxhZyBpcyBvbmx5IHNldCB3aGVuIGEgZmllbGQgdmFsdWUgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIAorCQorIyMjIyBkZWZhdWx0IHJlcXVpcmVkbmVzcyAoaW1wbGljaXQpCisKKy0gV3JpdGU6IEluIHRoZW9yeSwgdGhlIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4uIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhhdCBydWxlLCBzZWUgYmVsb3cuCistIFJlYWQ6IExpa2Ugb3B0aW9uYWwsIHRoZSBmaWVsZCBtYXksIG9yIG1heSBub3QgYmUgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAKKy0gRGVmYXVsdCB2YWx1ZXM6IG1heSBub3QgYmUgd3JpdHRlbiAoc2VlIG5leHQgc2VjdGlvbikKKworRGVmYXVsdCByZXF1aXJlZG5lc3MgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZGVzaXJlZCBiZWhhdmlvdXIgaXMgYSBtaXggb2Ygb3B0aW9uYWwgYW5kIHJlcXVpcmVkLCBoZW5jZSB0aGUgaW50ZXJuYWwgbmFtZSAib3B0LWluLCByZXEtb3V0Ii4gQWx0aG91Z2ggaW4gdGhlb3J5IHRoZXNlIGZpZWxkcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiAoInJlcS1vdXQiKSwgaW4gcmVhbGl0eSB1bnNldCBmaWVsZHMgYXJlIG5vdCBhbHdheXMgd3JpdHRlbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlLCB3aGVuIHRoZSBmaWVsZCBjb250YWlucyBhIDxudWxsPiB2YWx1ZSwgd2hpY2ggYnkgZGVmaW5pdGlvbiBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aHJpZnQuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbm90IHdyaXRpbmcgdGhhdCBmaWVsZCBhdCBhbGwsIGFuZCB0aGF0J3Mgd2hhdCBtb3N0IGxhbmd1YWdlcyBkby4KKwkKKyMjIyMgU2VtYW50aWNzIG9mIERlZmF1bHQgVmFsdWVzCisKK1RoZXJlIGFyZSBvbmdvaW5nIGRpc2N1c3Npb25zIGFib3V0IHRoYXQgdG9waWMsIHNlZSBKSVJBIGZvciBkZXRhaWxzLiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyB0cmVhdCBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgdmVyeSBzYW1lIHdheSwgYnV0IHRoZSBjdXJyZW50IHN0YXR1cyBxdW8gaXMgbW9yZSBvciBsZXNzIHRoYXQgZGVmYXVsdCBmaWVsZHMgYXJlIHR5cGljYWxseSBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhlcmVmb3JlLCBhIHZhbHVlIHRoYXQgZXF1YWxzIHRoZSBkZWZhdWx0IG1heSBub3QgYmUgd3JpdHRlbiwgYmVjYXVzZSB0aGUgcmVhZCBlbmQgd2lsbCBzZXQgdGhlIHZhbHVlIGltcGxpY2l0bHkuIE9uIHRoZSBvdGhlciBoYW5kLCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGFueXdheXMsIGFzIHRoZXJlIGlzIG5vIGhhcmQgcmVzdHJpY3Rpb24gdGhhdCBwcmV2ZW50cyB0aGlzLiAKKworVGhlIG1ham9yIHBvaW50IHRvIGtlZXAgaW4gbWluZCBoZXJlIGlzIHRoZSBmYWN0LCB0aGF0IGFueSB1bndyaXR0ZW4gZGVmYXVsdCB2YWx1ZSBpbXBsaWNpdGx5IGJlY29tZXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHZlcnNpb24uIElmIHRoYXQgZGVmYXVsdCBpcyBjaGFuZ2VkLCB0aGUgaW50ZXJmYWNlIGNoYW5nZXMuIElmLCBpbiBjb250cmFzdCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZGF0YSwgdGhlIGRlZmF1bHQgaW4gdGhlIElETCBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHNlcmlhbGl6ZWQgZGF0YS4KKworIyMjIFhTRCBPcHRpb25zCisKK04uQi46IFRoZXNlIGhhdmUgIHNvbWUgaW50ZXJuYWwgcHVycG9zZSBhdCBGYWNlYm9vayBidXQgc2VydmUgbm8gY3VycmVudCBwdXJwb3NlIGluIFRocmlmdC4gVXNlIG9mIHRoZXNlIG9wdGlvbnMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuCisKKyAgICBbMTldIFhzZEZpZWxkT3B0aW9ucyA6Oj0gICd4c2Rfb3B0aW9uYWwnPyAneHNkX25pbGxhYmxlJz8gWHNkQXR0cnM/CisKKyAgICBbMjBdIFhzZEF0dHJzICAgICAgICA6Oj0gICd4c2RfYXR0cnMnICd7JyBGaWVsZCogJ30nCisKKyMjIEZ1bmN0aW9ucworCisgICAgWzIxXSBGdW5jdGlvbiAgICAgICAgOjo9ICAnb25ld2F5Jz8gRnVuY3Rpb25UeXBlIElkZW50aWZpZXIgJygnIEZpZWxkKiAnKScgVGhyb3dzPyBMaXN0U2VwYXJhdG9yPworCisgICAgWzIyXSBGdW5jdGlvblR5cGUgICAgOjo9ICBGaWVsZFR5cGUgfCAndm9pZCcKKworICAgIFsyM10gVGhyb3dzICAgICAgICAgIDo6PSAgJ3Rocm93cycgJygnIEZpZWxkKiAnKScKKworIyMgVHlwZXMKKworICAgIFsyNF0gRmllbGRUeXBlICAgICAgIDo6PSAgSWRlbnRpZmllciB8IEJhc2VUeXBlIHwgQ29udGFpbmVyVHlwZQorCisgICAgWzI1XSBEZWZpbml0aW9uVHlwZSAgOjo9ICBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKKworICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2k4JyB8ICdpMTYnIHwgJ2kzMicgfCAnaTY0JyB8ICdkb3VibGUnIHwgJ3N0cmluZycgfCAnYmluYXJ5JyB8ICdzbGlzdCcKKworICAgIFsyN10gQ29udGFpbmVyVHlwZSAgIDo6PSAgTWFwVHlwZSB8IFNldFR5cGUgfCBMaXN0VHlwZQorCisgICAgWzI4XSBNYXBUeXBlICAgICAgICAgOjo9ICAnbWFwJyBDcHBUeXBlPyAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCisKKyAgICBbMjldIFNldFR5cGUgICAgICAgICA6Oj0gICdzZXQnIENwcFR5cGU/ICc8JyBGaWVsZFR5cGUgJz4nCisKKyAgICBbMzBdIExpc3RUeXBlICAgICAgICA6Oj0gICdsaXN0JyAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlPworCisgICAgWzMxXSBDcHBUeXBlICAgICAgICAgOjo9ICAnY3BwX3R5cGUnIExpdGVyYWwKKworIyMgQ29uc3RhbnQgVmFsdWVzCisKKyAgICBbMzJdIENvbnN0VmFsdWUgICAgICA6Oj0gIEludENvbnN0YW50IHwgRG91YmxlQ29uc3RhbnQgfCBMaXRlcmFsIHwgSWRlbnRpZmllciB8IENvbnN0TGlzdCB8IENvbnN0TWFwCisKKyAgICBbMzNdIEludENvbnN0YW50ICAgICA6Oj0gICgnKycgfCAnLScpPyBEaWdpdCsKKworICAgIFszNF0gRG91YmxlQ29uc3RhbnQgIDo6PSAgKCcrJyB8ICctJyk/IERpZ2l0KiAoJy4nIERpZ2l0Kyk/ICggKCdFJyB8ICdlJykgSW50Q29uc3RhbnQgKT8KKworICAgIFszNV0gQ29uc3RMaXN0ICAgICAgIDo6PSAgJ1snIChDb25zdFZhbHVlIExpc3RTZXBhcmF0b3I/KSogJ10nCisKKyAgICBbMzZdIENvbnN0TWFwICAgICAgICA6Oj0gICd7JyAoQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPykqICd9JworCisjIyBCYXNpYyBEZWZpbml0aW9ucworCisjIyMgTGl0ZXJhbAorCisgICAgWzM3XSBMaXRlcmFsICAgICAgICAgOjo9ICAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikKKworIyMjIElkZW50aWZpZXIKKworICAgIFszOF0gSWRlbnRpZmllciAgICAgIDo6PSAgKCBMZXR0ZXIgfCAnXycgKSAoIExldHRlciB8IERpZ2l0IHwgJy4nIHwgJ18nICkqCisKKyAgICBbMzldIFNUSWRlbnRpZmllciAgICA6Oj0gICggTGV0dGVyIHwgJ18nICkgKCBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICdfJyB8ICctJyApKgorCisjIyMgTGlzdCBTZXBhcmF0b3IKKworICAgIFs0MF0gTGlzdFNlcGFyYXRvciAgIDo6PSAgJywnIHwgJzsnCisKKyMjIyBMZXR0ZXJzIGFuZCBEaWdpdHMKKworICAgIFs0MV0gTGV0dGVyICAgICAgICAgIDo6PSAgWydBJy0nWiddIHwgWydhJy0neiddCisKKyAgICBbNDJdIERpZ2l0ICAgICAgICAgICA6Oj0gIFsnMCctJzknXQorCisjIyBFeGFtcGxlcworCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIFRocmlmdCBkZWZpbml0aW9ucywgdXNpbmcgdGhlIFRocmlmdCBJREw6CisKKyAqIFtUaHJpZnRUZXN0LnRocmlmdF1bXSB1c2VkIGJ5IHRoZSBUaHJpZnQgVGVzdEZyYW1ld29yaworICogVGhyaWZ0IFt0dXRvcmlhbF1bXQorICogRmFjZWJvb2sncyBbZmIzMDMudGhyaWZ0XVtdCisgKiBbQXBhY2hlIENhc3NhbmRyYSdzXVtdIFRocmlmdCBJREw6IFtjYXNzYW5kcmEudGhyaWZ0XVtdCisgKiBbRXZlcm5vdGUgQVBJXVtdCisKKyBbVGhyaWZ0VGVzdC50aHJpZnRdOiAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aHJpZnQvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyBbdHV0b3JpYWxdOiAgICAgICAgICAgL3R1dG9yaWFsLworIFtmYjMwMy50aHJpZnRdOiAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKKyBbQXBhY2hlIENhc3NhbmRyYSdzXTogaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnLworIFtjYXNzYW5kcmEudGhyaWZ0XTogICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2Nhc3NhbmRyYS90cnVuay9pbnRlcmZhY2UvY2Fzc2FuZHJhLnRocmlmdD92aWV3PWNvCisgW0V2ZXJub3RlIEFQSV06ICAgICAgIGh0dHA6Ly93d3cuZXZlcm5vdGUuY29tL2Fib3V0L2RldmVsb3Blci9hcGkvCisKKyMjIFRvIERvL1F1ZXN0aW9ucworCitJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIGZvciBhbGwgTGFuZ3VhZ2VzPworCisgKiBEbyBhbGwgTGFuZ3VhZ2VzIGluaXRpYWxpemUgdGhlbSB0byAwLCBib29sPWZhbHNlIGFuZCBzdHJpbmc9IiI/IG9yIG51bGwsIHVuZGVmaW5lZD8KKworV2h5IGRvZXMgcG9zaXRpb24gb2YgYENwcFR5cGVgIHZhcnkgYmV0d2VlbiBgU2V0VHlwZWAgYW5kIGBMaXN0VHlwZWA/CisKKyAqIHN0ZDo6c2V0IGRvZXMgc29ydCB0aGUgZWxlbWVudHMgYXV0b21hdGljYWxseSwgdGhhdCdzIHRoZSBkZXNpZ24uIHNlZSBbVGhyaWZ0IFR5cGVzXSgvZG9jcy90eXBlcykgb3IgdGhlIFtDKysgc3RkOnNldCByZWZlcmVuY2VdW10gZm9yIGZ1cnRoZXIgZGV0YWlscworICogVGhlIHF1ZXN0aW9uIGlzLCBob3cgb3RoZXIgbGFuZ3VhZ2VzIGFyZSBkb2luZyB0aGF0PyBXaGF0IGFib3V0IGN1c3RvbSBvYmplY3RzLCBkbyB0aGV5IGhhdmUgYSBDb21wYXJlIGZ1bmN0aW9uIHRoZSBzZXQgdGhlIG9yZGVyIGNvcnJlY3RseT8KKworIFtDKysgc3RkOnNldCByZWZlcmVuY2VdOiBodHRwOi8vd3d3LmNwbHVzcGx1cy5jb20vcmVmZXJlbmNlL3N0bC9zZXQvCisKK1doeSBjYW4ndCBgRGVmaW5pdGlvblR5cGVgIGJlIHRoZSBzYW1lIGFzIGBGaWVsZFR5cGVgIChpLmUuIGluY2x1ZGUgYElkZW50aWZpZXJgKT8KKworRXhhbWluZSB0aGUgYHNtYWxsdGFsay5wcmVmaXhgIGFuZCBgc21hbGx0YWxrLmNhdGVnb3J5YCBzdGF0dXMgKGVzcCBgc21hbGx0YWxrLmNhdGVnb3J5YCwgd2hpY2ggdGFrZXMgYFNUSWRlbnRpZmllcmAgYXMgaXRzIGFyZ3VtZW50KS4uLgorCitXaGF0IHRvIGRvIGFib3V0IGBMaXN0U2VwYXJhdG9yYD8gRG8gd2UgcmVhbGx5IHdhbnQgdG8gYmUgYXMgbGF4IGFzIHdlIGN1cnJlbnRseSBhcmU/CisKK1Nob3VsZCBgRmllbGQqYCByZWFsbHkgYmUgYEZpZWxkK2AgaW4gYFN0cnVjdGAsIGBFbnVtYCwgZXRjLj8KKwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUyNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQKQEAgLTAsMCArMSwyNTQgQEAKK1RocmlmdCBCaW5hcnkgcHJvdG9jb2wgZW5jb2RpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnRzIGRlc2NyaWJlcyB0aGUgd2lyZSBlbmNvZGluZyBmb3IgUlBDIHVzaW5nIHRoZSBvbGRlciBUaHJpZnQgKmJpbmFyeSBwcm90b2NvbCouCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEgYW5kCiswLjkuMykuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsIHNob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBCaW5hcnkgcHJvdG9jb2wKKyAgKiBCYXNlIHR5cGVzCisgICogTWVzc2FnZQorICAqIFN0cnVjdAorICAqIExpc3QgYW5kIFNldAorICAqIE1hcAorKiBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKKyMgQmluYXJ5IHByb3RvY29sCisKKyMjIEJhc2UgdHlwZXMKKworIyMjIEludGVnZXIgZW5jb2RpbmcKKworSW4gdGhlIF9iaW5hcnkgcHJvdG9jb2xfIGludGVnZXJzIGFyZSBlbmNvZGVkIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYmlnIGVuZGlhbiBieXRlIG9yZGVyLCBha2EgbmV0d29yaworb3JkZXIpLiBBbiBgaW50OGAgbmVlZHMgMSBieXRlLCBhbiBgaW50MTZgIDIsIGFuIGBpbnQzMmAgNCBhbmQgYW4gYGludDY0YCBuZWVkcyA4IGJ5dGVzLgorCitUaGUgQ1BQIHZlcnNpb24gaGFzIHRoZSBvcHRpb24gdG8gdXNlIHRoZSBiaW5hcnkgcHJvdG9jb2wgd2l0aCBsaXR0bGUgZW5kaWFuIG9yZGVyLiBMaXR0bGUgZW5kaWFuIGdpdmVzIGEgc21hbGwgYnV0Citub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGJvb3N0IGJlY2F1c2UgY29udGVtcG9yYXJ5IENQVXMgdXNlIGxpdHRsZSBlbmRpYW4gd2hlbiBzdG9yaW5nIGludGVnZXJzIHRvIFJBTS4KKworIyMjIEVudW0gZW5jb2RpbmcKKworVGhlIGdlbmVyYXRlZCBjb2RlIGVuY29kZXMgYEVudW1gcyBieSB0YWtpbmcgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHRoZW4gZW5jb2RpbmcgdGhhdCBhcyBhbiBpbnQzMi4KKworIyMjIEJpbmFyeSBlbmNvZGluZworCitCaW5hcnkgaXMgc2VudCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCwgYmluYXJ5IGRhdGEsIDQrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgYnl0ZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgYnl0ZSBsZW5ndGhgIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXksIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIgKG11c3QgYmUgPj0gMCkuCisqIGBieXRlc2AgYXJlIHRoZSBieXRlcyBvZiB0aGUgYnl0ZSBhcnJheS4KKworIyMjIFN0cmluZyBlbmNvZGluZworCisqU3RyaW5nKnMgYXJlIGZpcnN0IGVuY29kZWQgdG8gVVRGLTgsIGFuZCB0aGVuIHNlbmQgYXMgYmluYXJ5LgorCisjIyMgRG91YmxlIGVuY29kaW5nCisKK1ZhbHVlcyBvZiB0eXBlIGBkb3VibGVgIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50NjQgYWNjb3JkaW5nIHRvIHRoZSBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCAiZG91YmxlIGZvcm1hdCIgYml0CitsYXlvdXQuIE1vc3QgcnVuLXRpbWVzIHByb3ZpZGUgYSBsaWJyYXJ5IHRvIG1ha2UgdGhpcyBjb252ZXJzaW9uLiBCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYXMgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdGhlbgorZW5jb2RlIHRoZSBpbnQ2NCBpbiA4IGJ5dGVzIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKyMjIyBCb29sZWFuIGVuY29kaW5nCisKK1ZhbHVlcyBvZiBgYm9vbGAgdHlwZSBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDguIFRydWUgaXMgY29udmVydGVkIHRvIGAxYCwgZmFsc2UgdG8gYDBgLgorCisjIyBNZXNzYWdlCisKK0EgYE1lc3NhZ2VgIGNhbiBiZSBlbmNvZGVkIGluIHR3byBkaWZmZXJlbnQgd2F5czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgTWVzc2FnZSwgc3RyaWN0IGVuY29kaW5nLCAxMisgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfDF2dnZ2dnZ2fHZ2dnZ2dnZ2fHVudXNlZCAgfDAwMDAwbW1tfCBuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwgc2VxIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHZ2dnZ2dnZ2dnZ2dnZ2dmAgaXMgdGhlIHZlcnNpb24sIGFuIHVuc2lnbmVkIDE1IGJpdCBudW1iZXIgZml4ZWQgdG8gYDFgIChpbiBiaW5hcnk6IGAwMDAgMDAwMCAwMDAwIDAwMDFgKS4KKyAgVGhlIGxlYWRpbmcgYml0IGlzIGAxYC4KKyogYHVudXNlZGAgaXMgYW4gaWdub3JlZCBieXRlLgorKiBgbW1tYCBpcyB0aGUgbWVzc2FnZSB0eXBlLCBhbiB1bnNpZ25lZCAzIGJpdCBpbnRlZ2VyLiBUaGUgNSBsZWFkaW5nIGJpdHMgbXVzdCBiZSBgMGAgYXMgc29tZSBjbGllbnRzIChjaGVja2VkIGZvcgorICBqYXZhIGluIDAuOS4xKSB0YWtlIHRoZSB3aG9sZSBieXRlLgorKiBgbmFtZSBsZW5ndGhgIGlzIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbmFtZSBmaWVsZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlciAobXVzdCBiZSA+PSAwKS4KKyogYG5hbWVgIGlzIHRoZSBtZXRob2QgbmFtZSwgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKyogYHNlcSBpZGAgaXMgdGhlIHNlcXVlbmNlIGlkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyLgorCitUaGUgc2Vjb25kLCBvbGRlciBlbmNvZGluZyAoYWthIG5vbi1zdHJpY3QpIGlzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBNZXNzYWdlLCBvbGQgZW5jb2RpbmcsIDkrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8MDAwMDBtbW18IHNlcSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworYGBgCisKK1doZXJlIGBuYW1lIGxlbmd0aGAsIGBuYW1lYCwgYG1tbWAsIGBzZXEgaWRgIGFyZSBhcyBhYm92ZS4KKworQmVjYXVzZSBgbmFtZSBsZW5ndGhgIG11c3QgYmUgcG9zaXRpdmUgKHRoZXJlZm9yZSB0aGUgZmlyc3QgYml0IGlzIGFsd2F5cyBgMGApLCB0aGUgZmlyc3QgYml0IGFsbG93cyB0aGUgcmVjZWl2ZXIgdG8gc2VlCit3aGV0aGVyIHRoZSBzdHJpY3QgZm9ybWF0IG9yIHRoZSBvbGQgZm9ybWF0IGlzIHVzZWQuIFRoZXJlZm9yZSBhIHNlcnZlciBhbmQgY2xpZW50IHVzaW5nIHRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhlCitiaW5hcnkgcHJvdG9jb2wgY2FuIHRyYW5zcGFyZW50bHkgdGFsayB3aXRoIGVhY2ggb3RoZXIuIEhvd2V2ZXIsIHdoZW4gc3RyaWN0IG1vZGUgaXMgZW5mb3JjZWQsIHRoZSBvbGQgZm9ybWF0IGlzCityZWplY3RlZC4KKworTWVzc2FnZSB0eXBlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisqIF9DYWxsXzogMQorKiBfUmVwbHlfOiAyCisqIF9FeGNlcHRpb25fOiAzCisqIF9PbmV3YXlfOiA0CisKKyMjIFN0cnVjdAorCitBICpTdHJ1Y3QqIGlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGZpZWxkcywgZm9sbG93ZWQgYnkgYSBzdG9wIGZpZWxkLiBFYWNoIGZpZWxkIHN0YXJ0cyB3aXRoIGEgZmllbGQgaGVhZGVyIGFuZAoraXMgZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuIFRoZSBlbmNvZGluZyBjYW4gYmUgc3VtbWFyaXplZCBieSB0aGUgZm9sbG93aW5nIEJORjoKKworYGBgCitzdHJ1Y3QgICAgICAgIDo6PSAoIGZpZWxkLWhlYWRlciBmaWVsZC12YWx1ZSApKiBzdG9wLWZpZWxkCitmaWVsZC1oZWFkZXIgIDo6PSBmaWVsZC10eXBlIGZpZWxkLWlkCitgYGAKKworQmVjYXVzZSBlYWNoIGZpZWxkIGhlYWRlciBjb250YWlucyB0aGUgZmllbGQtaWQgKGFzIGRlZmluZWQgYnkgdGhlIFRocmlmdCBJREwgZmlsZSksIHRoZSBmaWVsZHMgY2FuIGJlIGVuY29kZWQgaW4gYW55CitvcmRlci4gVGhyaWZ0J3MgdHlwZSBzeXN0ZW0gaXMgbm90IGV4dGVuc2libGU7IHlvdSBjYW4gb25seSBlbmNvZGUgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RydWN0cy4gVGhlcmVmb3JlIGlzIGFsc28KK3Bvc3NpYmxlIHRvIGhhbmRsZSB1bmtub3duIGZpZWxkcyB3aGlsZSBkZWNvZGluZzsgdGhlc2UgYXJlIHNpbXBseSBpZ25vcmVkLiBXaGlsZSBkZWNvZGluZyB0aGUgZmllbGQgdHlwZSBjYW4gYmUgdXNlZCB0bworZGV0ZXJtaW5lIGhvdyB0byBkZWNvZGUgdGhlIGZpZWxkIHZhbHVlLgorCitOb3RlIHRoYXQgdGhlIGZpZWxkIG5hbWUgaXMgbm90IGVuY29kZWQgc28gZmllbGQgcmVuYW1lcyBpbiB0aGUgSURMIGRvIG5vdCBhZmZlY3QgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworVGhlIGRlZmF1bHQgSmF2YSBpbXBsZW1lbnRhdGlvbiAoQXBhY2hlIFRocmlmdCAwLjkuMSkgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIGl0IHRyaWVzIHRvIGRlY29kZSBhIGZpZWxkIHRoYXQgaGFzCithbm90aGVyIGZpZWxkLXR5cGUgdGhlbiB3aGF0IGlzIGV4cGVjdGVkLiBUaGVvcmV0aWNhbGx5IHRoaXMgY291bGQgYmUgZGV0ZWN0ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nLgorT3RoZXIgaW1wbGVtZW50YXRpb24gbWF5IHBlcmZvcm0gdGhpcyBjaGVjayBhbmQgdGhlbiBlaXRoZXIgaWdub3JlIHRoZSBmaWVsZCwgb3IgcmV0dXJuIGEgcHJvdG9jb2wgZXhjZXB0aW9uLgorCitBICpVbmlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhdCBtb3N0IDEgZmllbGQgbWF5IGJlIGVuY29kZWQuCisKK0FuICpFeGNlcHRpb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdC4KKworIyMjIFN0cnVjdCBlbmNvZGluZworCitJbiB0aGUgYmluYXJ5IHByb3RvY29sIGZpZWxkIGhlYWRlcnMgYW5kIHRoZSBzdG9wIGZpZWxkIGFyZSBlbmNvZGVkIGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIGZpZWxkIGhlYWRlciBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHR0dHR0dHR0fCBmaWVsZCBpZCAgICAgICAgfCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0JpbmFyeSBwcm90b2NvbCBzdG9wIGZpZWxkOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB0dHR0dHR0dGAgdGhlIGZpZWxkLXR5cGUsIGEgc2lnbmVkIDggYml0IGludGVnZXIuCisqIGBmaWVsZCBpZGAgdGhlIGZpZWxkLWlkLCBhIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBpbiBiaWcgZW5kaWFuIG9yZGVyLgorKiBgZmllbGQtdmFsdWVgIHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLgorCitUaGUgZm9sbG93aW5nIGZpZWxkLXR5cGVzIGFyZSB1c2VkOgorCisqIGBCT09MYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgNGAKKyogYEkxNmAsIGVuY29kZWQgYXMgYDZgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA4YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgMTBgCisqIGBTVFJJTkdgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3Igc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDEzYAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTRgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgMTVgCisKKyMjIExpc3QgYW5kIFNldAorCitMaXN0IGFuZCBzZXRzIGFyZSBlbmNvZGVkIHRoZSBzYW1lOiBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlCitlbmNvZGVkIGVsZW1lbnRzLgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBsaXN0ICg1KyBieXRlcykgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3x0dHR0dHR0dHwgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB0dHR0dHR0dGAgaXMgdGhlIGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgZW5jb2RlZCBhcyBhbiBpbnQzMiwgcG9zaXRpdmUgdmFsdWVzIG9ubHkKKyogYGVsZW1lbnRzYCB0aGUgZWxlbWVudCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZpZWxkLXR5cGVzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgc2VjdGlvbiBhYm92ZS4KKworVGhlIG1heGltdW0gbGlzdC9zZXQgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMjIE1hcAorCitNYXBzIGFyZSBlbmNvZGVkIHdpdGggYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSwgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUga2V5cyBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsCitmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBlbGVtZW50cy4gVGhlIGVuY29kaW5nIGZvbGxvd3MgdGhpcyBCTkY6CisKK2BgYAorbWFwICA6Oj0gIGtleS1lbGVtZW50LXR5cGUgdmFsdWUtZWxlbWVudC10eXBlIHNpemUgKCBrZXkgdmFsdWUgKSoKK2BgYAorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBtYXAgKDYrIGJ5dGVzKSBhbmQga2V5IHZhbHVlIHBhaXJzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xra2tra2tra3x2dnZ2dnZ2dnwgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5IHZhbHVlIHBhaXJzICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBra2tra2tra2AgaXMgdGhlIGtleSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgdnZ2dnZ2dnZgIGlzIHRoZSB2YWx1ZSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgc2l6ZWAgaXMgdGhlIHNpemUgb2YgdGhlIG1hcCwgZW5jb2RlZCBhcyBhbiBpbnQzMiwgcG9zaXRpdmUgdmFsdWVzIG9ubHkKKyogYGtleSB2YWx1ZSBwYWlyc2AgYXJlIHRoZSBlbmNvZGVkIGtleXMgYW5kIHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZmllbGQtdHlwZXMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBzZWN0aW9uIGFib3ZlLgorCitUaGUgbWF4aW11bSBtYXAgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMgQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCitUaGUgZm9sbG93aW5nIEJORiBub3RhdGlvbiBpcyB1c2VkOgorCisqIGEgcGx1cyBgK2AgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDEgb3IgbW9yZSB0aW1lcworKiBhIHN0YXIgYCpgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyBvcHRpb25hbCByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAwIG9yIG1vcmUgdGltZXMKKyogYSBwaXBlIGB8YCBiZXR3ZWVuIGl0ZW1zIHJlcHJlc2VudHMgY2hvaWNlLCB0aGUgZmlyc3QgbWF0Y2hpbmcgaXRlbSBpcyBzZWxlY3RlZAorKiBwYXJlbnRoZXNpcyBgKGAgYW5kIGApYCBhcmUgdXNlZCBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgaXRlbXMKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQ2N2RkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCkBAIC0wLDAgKzEsMjk0IEBACitUaHJpZnQgQ29tcGFjdCBwcm90b2NvbCBlbmNvZGluZyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnRzIGRlc2NyaWJlcyB0aGUgd2lyZSBlbmNvZGluZyBmb3IgUlBDIHVzaW5nIHRoZSBUaHJpZnQgKmNvbXBhY3QgcHJvdG9jb2wqLgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xKSBhbmQKK1tUSFJJRlQtMTEwIEEgbW9yZSBjb21wYWN0IGZvcm1hdF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwKK3Nob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBDb21wYWN0IHByb3RvY29sCisgICogQmFzZSB0eXBlcworICAqIE1lc3NhZ2UKKyAgKiBTdHJ1Y3QKKyAgKiBMaXN0IGFuZCBTZXQKKyAgKiBNYXAKKyogQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCisjIENvbXBhY3QgcHJvdG9jb2wKKworIyMgQmFzZSB0eXBlcworCisjIyMgSW50ZWdlciBlbmNvZGluZworCitUaGUgX2NvbXBhY3QgcHJvdG9jb2xfIHVzZXMgbXVsdGlwbGUgZW5jb2RpbmdzIGZvciBpbnRzOiB0aGUgX3ppZ3phZyBpbnRfLCBhbmQgdGhlIF92YXIgaW50Xy4KKworVmFsdWVzIG9mIHR5cGUgYGludDMyYCBhbmQgYGludDY0YCBhcmUgZmlyc3QgdHJhbnNmb3JtZWQgdG8gYSAqemlnemFnIGludCouIEEgemlnemFnIGludCBmb2xkcyBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUKK251bWJlcnMgaW50byB0aGUgcG9zaXRpdmUgbnVtYmVyIHNwYWNlLiBXaGVuIHdlIHJlYWQgMCwgMSwgMiwgMywgNCBvciA1IGZyb20gdGhlIHdpcmUsIHRoaXMgaXMgdHJhbnNsYXRlZCB0byAwLCAtMSwgMSwKKy0yIG9yIDIgcmVzcGVjdGl2ZWx5LiBIZXJlIGFyZSB0aGUgKFNjYWxhKSBmb3JtdWxhcyB0byBjb252ZXJ0IGZyb20gaW50MzIvaW50NjQgdG8gYSB6aWd6YWcgaW50IGFuZCBiYWNrOgorCitgYGBzY2FsYQorZGVmIGludFRvWmlnWmFnKG46IEludCk6IEludCA9IChuIDw8IDEpIF4gKG4gPj4gMzEpCitkZWYgemlnemFnVG9JbnQobjogSW50KTogSW50ID0gKG4gPj4+IDEpIF4gLSAobiAmIDEpCitkZWYgbG9uZ1RvWmlnWmFnKG46IExvbmcpOiBMb25nID0gKG4gPDwgMSkgXiAobiA+PiA2MykKK2RlZiB6aWd6YWdUb0xvbmcobjogTG9uZyk6IExvbmcgPSAobiA+Pj4gMSkgXiAtIChuICYgMSkKK2BgYAorCitUaGUgemlnemFnIGludCBpcyB0aGVuIGVuY29kZWQgYXMgYSAqdmFyIGludCouIFZhciBpbnRzIHRha2UgMSB0byA1IGJ5dGVzIChpbnQzMikgb3IgMSB0byAxMCBieXRlcyAoaW50NjQpLiBUaGUgbW9zdAorc2lnbmlmaWNhbnQgYml0IG9mIGVhY2ggYnl0ZSBpbmRpY2F0ZXMgaWYgbW9yZSBieXRlcyBmb2xsb3cuIFRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCA3IGJpdHMgZnJvbSBlYWNoCitieXRlIGZvcm0gdGhlIG51bWJlciwgd2hlcmUgdGhlIGZpcnN0IGJ5dGUgaGFzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgKHNvIHRoZXkgYXJlIGluIGJpZyBlbmRpYW4gb3IgbmV0d29yayBvcmRlcikuCisKK1ZhciBpbnRzIGFyZSBzb21ldGltZXMgdXNlZCBkaXJlY3RseSBpbnNpZGUgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdG8gcmVwcmVzZW50IHBvc2l0aXZlIG51bWJlcnMuCisKK1RvIGVuY29kZSBhbiBgaW50MTZgIGFzIHppZ3phZyBpbnQsIGl0IGlzIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBgaW50MzJgIGFuZCB0aGVuIGVuY29kZWQgYXMgc3VjaC4gVGhlIHR5cGUgYGludDhgIHNpbXBseQordXNlcyBhIHNpbmdsZSBieXRlIGFzIGluIHRoZSBiaW5hcnkgcHJvdG9jb2wuCisKKyMjIyBFbnVtIGVuY29kaW5nCisKK1RoZSBnZW5lcmF0ZWQgY29kZSBlbmNvZGVzIGBFbnVtYHMgYnkgdGFraW5nIHRoZSBvcmRpbmFsIHZhbHVlIGFuZCB0aGVuIGVuY29kaW5nIHRoYXQgYXMgYW4gaW50MzIuCisKKyMjIyBCaW5hcnkgZW5jb2RpbmcKKworQmluYXJ5IGlzIHNlbnQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wsIGJpbmFyeSBkYXRhLCAxKyBieXRlczoKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBieXRlIGxlbmd0aCAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgYnl0ZSBsZW5ndGhgIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXksIHVzaW5nIHZhciBpbnQgZW5jb2RpbmcgKG11c3QgYmUgPj0gMCkuCisqIGBieXRlc2AgYXJlIHRoZSBieXRlcyBvZiB0aGUgYnl0ZSBhcnJheS4KKworIyMjIFN0cmluZyBlbmNvZGluZworCisqU3RyaW5nKnMgYXJlIGZpcnN0IGVuY29kZWQgdG8gVVRGLTgsIGFuZCB0aGVuIHNlbmQgYXMgYmluYXJ5LgorCisjIyMgRG91YmxlIGVuY29kaW5nCisKK1ZhbHVlcyBvZiB0eXBlIGBkb3VibGVgIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50NjQgYWNjb3JkaW5nIHRvIHRoZSBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCAiZG91YmxlIGZvcm1hdCIgYml0CitsYXlvdXQuIE1vc3QgcnVuLXRpbWVzIHByb3ZpZGUgYSBsaWJyYXJ5IHRvIG1ha2UgdGhpcyBjb252ZXJzaW9uLiBCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYXMgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdGhlbgorZW5jb2RlIHRoZSBpbnQ2NCBpbiA4IGJ5dGVzIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKyMjIyBCb29sZWFuIGVuY29kaW5nCisKK0Jvb2xlYW5zIGFyZSBlbmNvZGVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZmllbGQgdmFsdWUgKGluIGEgc3RydWN0KSBvciBhbiBlbGVtZW50IHZhbHVlIChpbiBhIHNldCwKK2xpc3Qgb3IgbWFwKS4gRmllbGQgdmFsdWVzIGFyZSBlbmNvZGVkIGRpcmVjdGx5IGluIHRoZSBmaWVsZCBoZWFkZXIuIEVsZW1lbnQgdmFsdWVzIG9mIHR5cGUgYGJvb2xgIGFyZSBzZW50IGFzIGFuIGludDg7Cit0cnVlIGFzIGAxYCBhbmQgZmFsc2UgYXMgYDBgLgorCisjIyBNZXNzYWdlCisKK0EgYE1lc3NhZ2VgIG9uIHRoZSB3aXJlIGxvb2tzIGFzIGZvbGxvd3M6CisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBNZXNzYWdlICg0KyBieXRlcyk6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8cHBwcHBwcHB8bW1tdnZ2dnZ8IHNlcSBpZCAgICAgICAgICAgICAgfCBuYW1lIGxlbmd0aCAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHBwcHBwcHBwYCBpcyB0aGUgcHJvdG9jb2wgaWQsIGZpeGVkIHRvIGAxMDAwIDAwMTBgLCAweDgyLgorKiBgbW1tYCBpcyB0aGUgbWVzc2FnZSB0eXBlLCBhbiB1bnNpZ25lZCAzIGJpdCBpbnRlZ2VyLgorKiBgdnZ2dnZgIGlzIHRoZSB2ZXJzaW9uLCBhbiB1bnNpZ25lZCA1IGJpdCBpbnRlZ2VyLCBmaXhlZCB0byBgMDAwMDFgLgorKiBgc2VxIGlkYCBpcyB0aGUgc2VxdWVuY2UgaWQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgYSB2YXIgaW50LgorKiBgbmFtZSBsZW5ndGhgIGlzIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbmFtZSBmaWVsZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBhcyBhIHZhciBpbnQgKG11c3QgYmUgPj0gMCkuCisqIGBuYW1lYCBpcyB0aGUgbWV0aG9kIG5hbWUgdG8gaW52b2tlLCBhIFVURi04IGVuY29kZWQgc3RyaW5nLgorCitNZXNzYWdlIHR5cGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyogX0NhbGxfOiAxCisqIF9SZXBseV86IDIKKyogX0V4Y2VwdGlvbl86IDMKKyogX09uZXdheV86IDQKKworIyMjIFN0cnVjdAorCitBICpTdHJ1Y3QqIGlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGZpZWxkcywgZm9sbG93ZWQgYnkgYSBzdG9wIGZpZWxkLiBFYWNoIGZpZWxkIHN0YXJ0cyB3aXRoIGEgZmllbGQgaGVhZGVyIGFuZAoraXMgZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuIFRoZSBlbmNvZGluZyBjYW4gYmUgc3VtbWFyaXplZCBieSB0aGUgZm9sbG93aW5nIEJORjoKKworYGBgCitzdHJ1Y3QgICAgICAgIDo6PSAoIGZpZWxkLWhlYWRlciBmaWVsZC12YWx1ZSApKiBzdG9wLWZpZWxkCitmaWVsZC1oZWFkZXIgIDo6PSBmaWVsZC10eXBlIGZpZWxkLWlkCitgYGAKKworQmVjYXVzZSBlYWNoIGZpZWxkIGhlYWRlciBjb250YWlucyB0aGUgZmllbGQtaWQgKGFzIGRlZmluZWQgYnkgdGhlIFRocmlmdCBJREwgZmlsZSksIHRoZSBmaWVsZHMgY2FuIGJlIGVuY29kZWQgaW4gYW55CitvcmRlci4gVGhyaWZ0J3MgdHlwZSBzeXN0ZW0gaXMgbm90IGV4dGVuc2libGU7IHlvdSBjYW4gb25seSBlbmNvZGUgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RydWN0cy4gVGhlcmVmb3JlIGlzIGFsc28KK3Bvc3NpYmxlIHRvIGhhbmRsZSB1bmtub3duIGZpZWxkcyB3aGlsZSBkZWNvZGluZzsgdGhlc2UgYXJlIHNpbXBseSBpZ25vcmVkLiBXaGlsZSBkZWNvZGluZyB0aGUgZmllbGQgdHlwZSBjYW4gYmUgdXNlZCB0bworZGV0ZXJtaW5lIGhvdyB0byBkZWNvZGUgdGhlIGZpZWxkIHZhbHVlLgorCitOb3RlIHRoYXQgdGhlIGZpZWxkIG5hbWUgaXMgbm90IGVuY29kZWQgc28gZmllbGQgcmVuYW1lcyBpbiB0aGUgSURMIGRvIG5vdCBhZmZlY3QgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworVGhlIGRlZmF1bHQgSmF2YSBpbXBsZW1lbnRhdGlvbiAoQXBhY2hlIFRocmlmdCAwLjkuMSkgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIGl0IHRyaWVzIHRvIGRlY29kZSBhIGZpZWxkIHRoYXQgaGFzCithbm90aGVyIGZpZWxkLXR5cGUgdGhhbiB3aGF0IGlzIGV4cGVjdGVkLiBUaGVvcmV0aWNhbGx5IHRoaXMgY291bGQgYmUgZGV0ZWN0ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nLgorT3RoZXIgaW1wbGVtZW50YXRpb24gbWF5IHBlcmZvcm0gdGhpcyBjaGVjayBhbmQgdGhlbiBlaXRoZXIgaWdub3JlIHRoZSBmaWVsZCwgb3IgcmV0dXJuIGEgcHJvdG9jb2wgZXhjZXB0aW9uLgorCitBICpVbmlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhdCBtb3N0IDEgZmllbGQgbWF5IGJlIGVuY29kZWQuCisKK0FuICpFeGNlcHRpb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdC4KKworIyMjIFN0cnVjdCBlbmNvZGluZworCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgZmllbGQgaGVhZGVyIChzaG9ydCBmb3JtKSBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfGRkZGR0dHR0fCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgZmllbGQgaGVhZGVyICgxIHRvIDMgYnl0ZXMsIGxvbmcgZm9ybSkgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8MDAwMHR0dHR8IGZpZWxkIGlkICAgICAgICAgICAgfCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIHN0b3AgZmllbGQ6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGRkZGRgIGlzIHRoZSBmaWVsZCBpZCBkZWx0YSwgYW4gdW5zaWduZWQgNCBiaXRzIGludGVnZXIsIHN0cmljdGx5IHBvc2l0aXZlLgorKiBgdHR0dGAgaXMgZmllbGQtdHlwZSBpZCwgYW4gdW5zaWduZWQgNCBiaXQgaW50ZWdlci4KKyogYGZpZWxkIGlkYCB0aGUgZmllbGQgaWQsIGEgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgemlnemFnIGludC4KKyogYGZpZWxkLXZhbHVlYCB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4KKworVGhlIGZpZWxkIGlkIGRlbHRhIGNhbiBiZSBjb21wdXRlZCBieSBgY3VycmVudC1maWVsZC1pZCAtIHByZXZpb3VzLWZpZWxkLWlkYCwgb3IganVzdCBgY3VycmVudC1maWVsZC1pZGAgaWYgdGhpcyBpcyB0aGUKK2ZpcnN0IG9mIHRoZSBzdHJ1Y3QuIFRoZSBzaG9ydCBmb3JtIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGZpZWxkIGlkIGRlbHRhIGlzIGluIHRoZSByYW5nZSAxIC0gMTUgKGluY2x1c2l2ZSkuCisKK1RoZSBmb2xsb3dpbmcgZmllbGQtdHlwZXMgY2FuIGJlIGVuY29kZWQ6CisKKyogYEJPT0xFQU5fVFJVRWAsIGVuY29kZWQgYXMgYDFgCisqIGBCT09MRUFOX0ZBTFNFYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNGAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDVgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGA2YAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgN2AKKyogYEJJTkFSWWAsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgOGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGA5YAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTBgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIGJvdGggc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKworTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgYXJlIDIgc3BlY2lmaWMgZmllbGQgdHlwZXMgZm9yIHRoZSBib29sZWFuIHZhbHVlcywgdGhlIGVuY29kaW5nIG9mIGEgYm9vbGVhbiBmaWVsZCB2YWx1ZSBoYXMgbm8KK2xlbmd0aCAoMCBieXRlcykuCisKKyMjIExpc3QgYW5kIFNldAorCitMaXN0IGFuZCBzZXRzIGFyZSBlbmNvZGVkIHRoZSBzYW1lOiBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlCitlbmNvZGVkIGVsZW1lbnRzLgorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgbGlzdCBoZWFkZXIgKDEgYnl0ZSwgc2hvcnQgZm9ybSkgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xzc3NzdHR0dHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIGxpc3QgaGVhZGVyICgyKyBieXRlcywgbG9uZyBmb3JtKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wxMTExdHR0dHwgc2l6ZSAgICAgICAgICAgICAgICB8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHNzc3NgIGlzIHRoZSBzaXplLCA0IGJpdCB1bnNpZ25lZCBpbnQsIHZhbHVlcyBgMGAgLSBgMTRgCisqIGB0dHR0YCBpcyB0aGUgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGEgdmFyIGludCAoaW50MzIpLCBwb3NpdGl2ZSB2YWx1ZXMgYDE1YCBvciBoaWdoZXIKKyogYGVsZW1lbnRzYCBhcmUgdGhlIGVuY29kZWQgZWxlbWVudHMKKworVGhlIHNob3J0IGZvcm0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbGVuZ3RoIGlzIGluIHRoZSByYW5nZSAwIC0gMTQgKGluY2x1c2l2ZSkuCisKK1RoZSBmb2xsb3dpbmcgZWxlbWVudC10eXBlcyBhcmUgdXNlZCAobm90ZSB0aGF0IHRoZXNlIGFyZSBfZGlmZmVyZW50XyBmcm9tIHRoZSBmaWVsZC10eXBlcyk6CisKKyogYEJPT0xgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNmAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDhgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYFNUUklOR2AsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTNgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxNGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGAxNWAKKworCitUaGUgbWF4aW11bSBsaXN0L3NldCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyMgTWFwCisKK01hcHMgYXJlIGVuY29kZWQgd2l0aCBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplLCB0aGUgdHlwZSBvZiB0aGUga2V5cyBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkCitieSB0aGUgZW5jb2RlZCBlbGVtZW50cy4gVGhlIGVuY29kaW5nIGZvbGxvd3MgdGhpcyBCTkY6CisKK2BgYAorbWFwICAgICAgICAgICA6Oj0gZW1wdHktbWFwIHwgbm9uLWVtcHR5LW1hcAorZW1wdHktbWFwICAgICA6Oj0gYDBgCitub24tZW1wdHktbWFwIDo6PSBzaXplIGtleS1lbGVtZW50LXR5cGUgdmFsdWUtZWxlbWVudC10eXBlIChrZXkgdmFsdWUpKworYGBgCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBtYXAgaGVhZGVyICgxIGJ5dGUsIGVtcHR5IG1hcCk6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgbWFwIGhlYWRlciAoMisgYnl0ZXMsIG5vbiBlbXB0eSBtYXApIGFuZCBrZXkgdmFsdWUgcGFpcnM6CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgc2l6ZSAgICAgICAgICAgICAgICB8a2tra3Z2dnZ8IGtleSB2YWx1ZSBwYWlycyAgICAgfAorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHNpemVgIGlzIHRoZSBzaXplLCBhIHZhciBpbnQgKGludDMyKSwgc3RyaWN0bHkgcG9zaXRpdmUgdmFsdWVzCisqIGBra2trYCBpcyB0aGUga2V5IGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYHZ2dnZgIGlzIHRoZSB2YWx1ZSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGBrZXkgdmFsdWUgcGFpcnNgIGFyZSB0aGUgZW5jb2RlZCBrZXlzIGFuZCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBsaXN0cy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgJ0xpc3QgYW5kIHNldCcgc2VjdGlvbi4KKworVGhlIG1heGltdW0gbWFwIHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworVGhlIGZvbGxvd2luZyBCTkYgbm90YXRpb24gaXMgdXNlZDoKKworKiBhIHBsdXMgYCtgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAxIG9yIG1vcmUgdGltZXMKKyogYSBzdGFyIGAqYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgb3B0aW9uYWwgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMCBvciBtb3JlIHRpbWVzCisqIGEgcGlwZSBgfGAgYmV0d2VlbiBpdGVtcyByZXByZXNlbnRzIGNob2ljZSwgdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gaXMgc2VsZWN0ZWQKKyogcGFyZW50aGVzaXMgYChgIGFuZCBgKWAgYXJlIHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGl0ZW1zCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxYTYxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZApAQCAtMCwwICsxLDEwMSBAQAorVGhyaWZ0IFByb3RvY29sIFN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGFzdCBNb2RpZmllZDogMjAwNy1KdW4tMjkKKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgVGhyaWZ0IHByb3RvY29sCit3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nLiBUaHVzLCB0aGUgb3JkZXIgb2YgZWxlbWVudHMKK2NvdWxkIGluIHNvbWUgY2FzZXMgYmUgcmVhcnJhbmdlZCBkZXBlbmRpbmcgdXBvbiB0aGUgVFByb3RvY29sCitpbXBsZW1lbnRhdGlvbiwgYnV0IHRoaXMgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIHJlcXVpcmVkCitzdHJ1Y3R1cmUuIFRoZXJlIGFyZSBzb21lICJkdW1iIiB0ZXJtaW5hbHMgbGlrZSBTVFJJTkcgYW5kIElOVAordGhhdCB0YWtlIHRoZSBwbGFjZSBvZiBhbiBhY3R1YWwgZW5jb2Rpbmcgc3BlY2lmaWNhdGlvbi4KKworVGhleSBrZXkgcG9pbnQgdG8gbm90aWNlIGlzIHRoYXQgQUxMIG1lc3NhZ2VzIGFyZSBqdXN0IG9uZSB3cmFwcGVkCitgPHN0cnVjdD5gLiBEZXBlbmRpbmcgdXBvbiB0aGUgbWVzc2FnZSB0eXBlLCB0aGUgYDxzdHJ1Y3Q+YCBjYW4gYmUKK2ludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKK29mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBgCisgICAgICAgPG1lc3NhZ2U+IDo6PSA8bWVzc2FnZS1iZWdpbj4gPHN0cnVjdD4gPG1lc3NhZ2UtZW5kPgorCisgPG1lc3NhZ2UtYmVnaW4+IDo6PSA8bWV0aG9kLW5hbWU+IDxtZXNzYWdlLXR5cGU+IDxtZXNzYWdlLXNlcWlkPgorCisgICA8bWV0aG9kLW5hbWU+IDo6PSBTVFJJTkcKKworICA8bWVzc2FnZS10eXBlPiA6Oj0gVF9DQUxMIHwgVF9SRVBMWSB8IFRfRVhDRVBUSU9OIHwgVF9PTkVXQVkKKworIDxtZXNzYWdlLXNlcWlkPiA6Oj0gSTMyCisKKyAgICAgICAgPHN0cnVjdD4gOjo9IDxzdHJ1Y3QtYmVnaW4+IDxmaWVsZD4qIDxmaWVsZC1zdG9wPiA8c3RydWN0LWVuZD4KKworICA8c3RydWN0LWJlZ2luPiA6Oj0gPHN0cnVjdC1uYW1lPgorCisgICA8c3RydWN0LW5hbWU+IDo6PSBTVFJJTkcKKworICAgIDxmaWVsZC1zdG9wPiA6Oj0gVF9TVE9QCisKKyAgICAgICAgIDxmaWVsZD4gOjo9IDxmaWVsZC1iZWdpbj4gPGZpZWxkLWRhdGE+IDxmaWVsZC1lbmQ+CisKKyAgIDxmaWVsZC1iZWdpbj4gOjo9IDxmaWVsZC1uYW1lPiA8ZmllbGQtdHlwZT4gPGZpZWxkLWlkPgorCisgICAgPGZpZWxkLW5hbWU+IDo6PSBTVFJJTkcKKworICAgIDxmaWVsZC10eXBlPiA6Oj0gVF9CT09MIHwgVF9CWVRFIHwgVF9JOCB8IFRfSTE2IHwgVF9JMzIgfCBUX0k2NCB8IFRfRE9VQkxFCisgICAgICAgICAgICAgICAgICAgICB8IFRfU1RSSU5HIHwgVF9CSU5BUlkgfCBUX1NUUlVDVCB8IFRfTUFQIHwgVF9TRVQgfCBUX0xJU1QKKworICAgICAgPGZpZWxkLWlkPiA6Oj0gSTE2CisKKyAgICA8ZmllbGQtZGF0YT4gOjo9IEk4IHwgSTE2IHwgSTMyIHwgSTY0IHwgRE9VQkxFIHwgU1RSSU5HIHwgQklOQVJZCisgICAgICAgICAgICAgICAgICAgICA8c3RydWN0PiB8IDxtYXA+IHwgPGxpc3Q+IHwgPHNldD4KKworICAgICAgICAgICA8bWFwPiA6Oj0gPG1hcC1iZWdpbj4gPGZpZWxkLWRhdHVtPiogPG1hcC1lbmQ+CisKKyAgICAgPG1hcC1iZWdpbj4gOjo9IDxtYXAta2V5LXR5cGU+IDxtYXAtdmFsdWUtdHlwZT4gPG1hcC1zaXplPgorCisgIDxtYXAta2V5LXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworPG1hcC12YWx1ZS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgIDxtYXAtc2l6ZT4gOjo9IEkzMgorCisgICAgICAgICAgPGxpc3Q+IDo6PSA8bGlzdC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8bGlzdC1lbmQ+CisKKyAgICA8bGlzdC1iZWdpbj4gOjo9IDxsaXN0LWVsZW0tdHlwZT4gPGxpc3Qtc2l6ZT4KKworPGxpc3QtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgPGxpc3Qtc2l6ZT4gOjo9IEkzMgorCisgICAgICAgICAgIDxzZXQ+IDo6PSA8c2V0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxzZXQtZW5kPgorCisgICAgIDxzZXQtYmVnaW4+IDo6PSA8c2V0LWVsZW0tdHlwZT4gPHNldC1zaXplPgorCisgPHNldC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworICAgICAgPHNldC1zaXplPiA6Oj0gSTMyCitgYGAKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1YzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kCkBAIC0wLDAgKzEsMTc4IEBACitUaHJpZnQgUmVtb3RlIFByb2NlZHVyZSBDYWxsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoIGxldmVsIG1lc3NhZ2UgZXhjaGFuZ2UgYmV0d2VlbiB0aGUgVGhyaWZ0IFJQQyBjbGllbnQgYW5kIHNlcnZlci4KK1NlZSBbdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZF0gYW5kIFt0aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZF0gZm9yIGEgZGVzY3JpcHRpb24gb2YgaG93IHRoZSBleGNoYW5nZXMgYXJlIGVuY29kZWQgb24KK3RoZSB3aXJlLgorCitJbiBhZGRpdGlvbiwgdGhpcyBkb2N1bWVudCBjb21wYXJlcyB0aGUgYmluYXJ5IHByb3RvY29sIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wuIEZpbmFsbHkgaXQgZGVzY3JpYmVzIHRoZSBmcmFtZWQgdnMuCit1bmZyYW1lZCB0cmFuc3BvcnQuCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEgYW5kCiswLjkuMykuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsIHNob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBUaHJpZnQgTWVzc2FnZSBleGNoYW5nZSBmb3IgUmVtb3RlIFByb2NlZHVyZSBDYWxsCisgICogTWVzc2FnZQorICAqIFJlcXVlc3Qgc3RydWN0CisgICogUmVzcG9uc2Ugc3RydWN0CisqIFByb3RvY29sIGNvbnNpZGVyYXRpb25zCisgICogQ29tcGFyaW5nIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbAorICAqIENvbXBhdGliaWxpdHkKKyAgKiBGcmFtZWQgdnMgdW5mcmFtZWQgdHJhbnNwb3J0CisKKyMgVGhyaWZ0IFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBNZXNzYWdlIGV4Y2hhbmdlCisKK0JvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhbmQgdGhlIGNvbXBhY3QgcHJvdG9jb2wgYXNzdW1lIGEgdHJhbnNwb3J0IGxheWVyIHRoYXQgZXhwb3NlcyBhIGJpLWRpcmVjdGlvbmFsIGJ5dGUgc3RyZWFtLAorZm9yIGV4YW1wbGUgYSBUQ1Agc29ja2V0LiBCb3RoIHVzZSB0aGUgZm9sbG93aW5nIGV4Y2hhbmdlOgorCisxLiBDbGllbnQgc2VuZHMgYSBgTWVzc2FnZWAgKHR5cGUgYENhbGxgIG9yIGBPbmV3YXlgKS4gVGhlIFRNZXNzYWdlIGNvbnRhaW5zIHNvbWUgbWV0YWRhdGEgYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgIHRvIGludm9rZS4KKzIuIENsaWVudCBzZW5kcyBtZXRob2QgYXJndW1lbnRzIChhIHN0cnVjdCBkZWZpbmVkIGJ5IHRoZSBnZW5lcmF0ZSBjb2RlKS4KKzMuIFNlcnZlciBzZW5kcyBhIGBNZXNzYWdlYCAodHlwZSBgUmVwbHlgIG9yIGBFeGNlcHRpb25gKSB0byBzdGFydCB0aGUgcmVzcG9uc2UuCis0LiBTZXJ2ZXIgc2VuZHMgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWV0aG9kIHJlc3VsdCBvciBleGNlcHRpb24uCisKK1RoZSBwYXR0ZXJuIGlzIGEgc2ltcGxlIGhhbGYgZHVwbGV4IHByb3RvY29sIHdoZXJlIHRoZSBwYXJ0aWVzIGFsdGVybmF0ZSBpbiBzZW5kaW5nIGEgYE1lc3NhZ2VgIGZvbGxvd2VkIGJ5IGEgc3RydWN0LgorV2hhdCB0aGVzZSBhcmUgaXMgZGVzY3JpYmVkIGJlbG93LgorCitBbHRob3VnaCB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdCBKYXZhIGNsaWVudHMgZG8gbm90IHN1cHBvcnQgcGlwZWxpbmluZyAoc2VuZGluZyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRob3V0IHdhaXRpbmcKK2ZvciBhbiByZXNwb25zZSksIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IEphdmEgc2VydmVycyBkbyBzdXBwb3J0IGl0LgorCisjIyBNZXNzYWdlCisKK0EgKk1lc3NhZ2UqIGNvbnRhaW5zOgorCisqIF9OYW1lXywgYSBzdHJpbmcgKGNhbiBiZSBlbXB0eSkuCisqIF9NZXNzYWdlIHR5cGVfLCBhIG1lc3NhZ2UgdHlwZXMsIG9uZSBvZiBgQ2FsbGAsIGBSZXBseWAsIGBFeGNlcHRpb25gIGFuZCBgT25ld2F5YC4KKyogX1NlcXVlbmNlIGlkXywgYSBzaWduZWQgaW50MzIgaW50ZWdlci4KKworVGhlICpzZXF1ZW5jZSBpZCogaXMgYSBzaW1wbGUgbWVzc2FnZSBpZCBhc3NpZ25lZCBieSB0aGUgY2xpZW50LiBUaGUgc2VydmVyIHdpbGwgdXNlIHRoZSBzYW1lIHNlcXVlbmNlIGlkIGluIHRoZQorbWVzc2FnZSBvZiB0aGUgcmVzcG9uc2UuIFRoZSBjbGllbnQgdXNlcyB0aGlzIG51bWJlciB0byBkZXRlY3Qgb3V0IG9mIG9yZGVyIHJlc3BvbnNlcy4gRWFjaCBjbGllbnQgaGFzIGFuIGludDMyIGZpZWxkCit3aGljaCBpcyBpbmNyZWFzZWQgZm9yIGVhY2ggbWVzc2FnZS4gVGhlIHNlcXVlbmNlIGlkIHNpbXBseSB3cmFwcyBhcm91bmQgd2hlbiBpdCBvdmVyZmxvd3MuCisKK1RoZSAqbmFtZSogaW5kaWNhdGVzIHRoZSBzZXJ2aWNlIG1ldGhvZCBuYW1lIHRvIGludm9rZS4gVGhlIHNlcnZlciBjb3BpZXMgdGhlIG5hbWUgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisKK1doZW4gdGhlICptdWx0aXBsZXhlZCBwcm90b2NvbCogaXMgdXNlZCwgdGhlIG5hbWUgY29udGFpbnMgdGhlIHNlcnZpY2UgbmFtZSwgYSBjb2xvbiBgOmAgYW5kIHRoZSBtZXRob2QgbmFtZS4gVGhlCittdWx0aXBsZXhlZCBwcm90b2NvbCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIHByb3RvY29scy4KKworVGhlICptZXNzYWdlIHR5cGUqIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgbWVzc2FnZSBpcyBzZW50LiBDbGllbnRzIHNlbmQgcmVxdWVzdHMgd2l0aCBUTWVzc2FnZXMgb2YgdHlwZSBgQ2FsbGAgb3IKK2BPbmV3YXlgIChzdGVwIDEgaW4gdGhlIHByb3RvY29sIGV4Y2hhbmdlKS4gU2VydmVycyBzZW5kIHJlc3BvbnNlcyB3aXRoIG1lc3NhZ2VzIG9mIHR5cGUgYEV4Y2VwdGlvbmAgb3IgYFJlcGx5YCAoc3RlcAorMykuCisKK1R5cGUgYFJlcGx5YCBpcyB1c2VkIHdoZW4gdGhlIHNlcnZpY2UgbWV0aG9kIGNvbXBsZXRlcyBub3JtYWxseS4gVGhhdCBpcywgaXQgcmV0dXJucyBhIHZhbHVlIG9yIGl0IHRocm93cyBvbmUgb2YgdGhlCitleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwgZmlsZS4KKworVHlwZSBgRXhjZXB0aW9uYCBpcyB1c2VkIGZvciBvdGhlciBleGNlcHRpb25zLiBUaGF0IGlzOiB3aGVuIHRoZSBzZXJ2aWNlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHRoYXQgaXMgbm90IGRlY2xhcmVkCitpbiB0aGUgVGhyaWZ0IElETCBmaWxlLCBvciBzb21lIG90aGVyIHBhcnQgb2YgdGhlIFRocmlmdCBzdGFjayB0aHJvd3MgYW4gZXhjZXB0aW9uLiBGb3IgZXhhbXBsZSB3aGVuIHRoZSBzZXJ2ZXIgY291bGQKK25vdCBlbmNvZGUgb3IgZGVjb2RlIGEgbWVzc2FnZSBvciBzdHJ1Y3QuCisKK0luIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uICgwLjkuMykgdGhlcmUgaXMgZGlmZmVyZW50IGJlaGF2aW9yIGZvciB0aGUgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBzZXJ2ZXIuIEluIHRoZSBhc3luYworc2VydmVyIGFsbCBleGNlcHRpb25zIGFyZSBzZW5kIGFzIGEgYFRBcHBsaWNhdGlvbkV4Y2VwdGlvbmAgKHNlZSAnUmVzcG9uc2Ugc3RydWN0JyBiZWxvdykuIEluIHRoZSBzeW5jaHJvbm91cyBKYXZhCitpbXBsZW1lbnRhdGlvbiBvbmx5ICh1bmRlY2xhcmVkKSBleGNlcHRpb25zIHRoYXQgZXh0ZW5kIGBURXhjZXB0aW9uYCBhcmUgc2VuZCBhcyBhIGBUQXBwbGljYXRpb25FeGNlcHRpb25gLiBVbmNoZWNrZWQKK2V4Y2VwdGlvbnMgbGVhZCB0byBhbiBpbW1lZGlhdGUgY2xvc2Ugb2YgdGhlIGNvbm5lY3Rpb24uCisKK1R5cGUgYE9uZXdheWAgaXMgb25seSB1c2VkIHN0YXJ0aW5nIGZyb20gQXBhY2hlIFRocmlmdCAwLjkuMy4gRWFybGllciB2ZXJzaW9ucyBkbyBfbm90XyBzZW5kIFRNZXNzYWdlcyBvZiB0eXBlIGBPbmV3YXlgLAorZXZlbiBmb3Igc2VydmljZSBtZXRob2RzIGRlZmluZWQgd2l0aCB0aGUgYG9uZXdheWAgbW9kaWZpZXIuCisKK1doZW4gY2xpZW50IHNlbmRzIGEgcmVxdWVzdCB3aXRoIHR5cGUgYE9uZXdheWAsIHRoZSBzZXJ2ZXIgbXVzdCBfbm90XyBzZW5kIGEgcmVzcG9uc2UgKHN0ZXBzIDMgYW5kIDQgYXJlIHNraXBwZWQpLiBOb3RlCit0aGF0IHRoZSBUaHJpZnQgSURMIGVuZm9yY2VzIGEgcmV0dXJuIHR5cGUgb2YgYHZvaWRgIGFuZCBkb2VzIG5vdCBhbGxvdyBleGNlcHRpb25zIGZvciBvbmV3YXkgc2VydmljZXMuCisKKyMjIFJlcXVlc3Qgc3RydWN0CisKK1RoZSBzdHJ1Y3QgdGhhdCBmb2xsb3dzIHRoZSBtZXNzYWdlIG9mIHR5cGUgYENhbGxgIG9yIGBPbmV3YXlgIGNvbnRhaW5zIHRoZSBhcmd1bWVudHMgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLiBUaGUKK2FyZ3VtZW50IGlkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBpZHMuIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoIGBfYXJnc2AgYXBwZW5kZWQuCitGb3IgbWV0aG9kcyB3aXRob3V0IGFyZ3VtZW50cyBhbiBzdHJ1Y3QgaXMgc2VudCB3aXRob3V0IGZpZWxkcy4KKworIyMgUmVzcG9uc2Ugc3RydWN0CisKK1RoZSBzdHJ1Y3QgdGhhdCBmb2xsb3dzIHRoZSBtZXNzYWdlIG9mIHR5cGUgYFJlcGx5YCBhcmUgc3RydWN0cyBpbiB3aGljaCBleGFjdGx5IDEgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgaXMgZW5jb2RlZDoKKworKiBBIGZpZWxkIHdpdGggbmFtZSBgc3VjY2Vzc2AgYW5kIGlkIGAwYCwgdXNlZCBpbiBjYXNlIHRoZSBtZXRob2QgY29tcGxldGVkIG5vcm1hbGx5LgorKiBBbiBleGNlcHRpb24gZmllbGQsIG5hbWUgYW5kIGlkIGFyZSBhcyBkZWZpbmVkIGluIHRoZSBgdGhyb3dzYCBjbGF1c2UgaW4gdGhlIFRocmlmdCBJREwncyBzZXJ2aWNlIG1ldGhvZCBkZWZpbml0aW9uLgorCitXaGVuIHRoZSBtZXNzYWdlIGlzIG9mIHR5cGUgYEV4Y2VwdGlvbmAgdGhlIHN0cnVjdCBpcyBlbmNvZGVkIGFzIGlmIGl0IHdhcyBkZWNsYXJlZCBieSB0aGUgZm9sbG93aW5nIElETDoKKworYGBgCitleGNlcHRpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UsCisgIDI6IGkzMiB0eXBlCit9CitgYGAKKworVGhlIGZvbGxvd2luZyBleGNlcHRpb24gdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGphdmEgaW1wbGVtZW50YXRpb24gKDAuOS4zKToKKworKiBfdW5rbm93bl86IDAsIHVzZWQgaW4gY2FzZSB0aGUgdHlwZSBmcm9tIHRoZSBwZWVyIGlzIHVua25vd24uCisqIF91bmtub3duIG1ldGhvZF86IDEsIHVzZWQgaW4gY2FzZSB0aGUgbWV0aG9kIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IGlzIHVua25vd24gYnkgdGhlIHNlcnZlci4KKyogX2ludmFsaWQgbWVzc2FnZSB0eXBlXzogMiwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfd3JvbmcgbWV0aG9kIG5hbWVfOiAzLCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF9iYWQgc2VxdWVuY2UgaWRfOiA0LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsaWVudCB0byBpbmRpY2F0ZSBhIHdyb25nIHNlcXVlbmNlIGlkIGluIHRoZSByZXNwb25zZS4KKyogX21pc3NpbmcgcmVzdWx0XzogNSwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGllbnQgdG8gaW5kaWNhdGUgYSByZXNwb25zZSB3aXRob3V0IGFueSBmaWVsZCAocmVzdWx0IG5vciBleGNlcHRpb24pLgorKiBfaW50ZXJuYWwgZXJyb3JfOiA2LCB1c2VkIHdoZW4gdGhlIHNlcnZlciB0aHJvd3MgYW4gZXhjZXB0aW9uIHRoYXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMIGZpbGUuIAorKiBfcHJvdG9jb2wgZXJyb3JfOiA3LCB1c2VkIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGRlY29kaW5nLiBGb3IgZXhhbXBsZSB3aGVuIGEgbGlzdCBpcyB0b28gbG9uZyBvciBhIHJlcXVpcmVkCisgZmllbGQgaXMgbWlzc2luZy4gCisqIF9pbnZhbGlkIHRyYW5zZm9ybV86IDgsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX2ludmFsaWQgcHJvdG9jb2xfOiA5LCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF91bnN1cHBvcnRlZCBjbGllbnQgdHlwZV86IDEwLCBubyB1c2FnZSB3YXMgZm91bmQuCisKKyMgUHJvdG9jb2wgY29uc2lkZXJhdGlvbnMKKworIyMgQ29tcGFyaW5nIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbAorCitUaGUgYmluYXJ5IHByb3RvY29sIGlzIGZhaXJseSBzaW1wbGUgYW5kIHRoZXJlZm9yZSBlYXN5IHRvIHByb2Nlc3MuIFRoZSBjb21wYWN0IHByb3RvY29sIG5lZWRzIGxlc3MgYnl0ZXMgdG8gc2VuZCB0aGUKK3NhbWUgZGF0YSBhdCB0aGUgY29zdCBvZiBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuIEFzIGJhbmR3aWR0aCBpcyB1c3VhbGx5IHRoZSBib3R0bGVuZWNrLCB0aGUgY29tcGFjdCBwcm90b2NvbCBpcyBhbG1vc3QKK2Fsd2F5cyBzbGlnaHRseSBmYXN0ZXIuCisKKyMjIENvbXBhdGliaWxpdHkKKworQSBzZXJ2ZXIgY291bGQgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgd2hldGhlciBhIGNsaWVudCB0YWxrcyB0aGUgYmluYXJ5IHByb3RvY29sIG9yIHRoZSBjb21wYWN0IHByb3RvY29sIGJ5CitpbnZlc3RpZ2F0aW5nIHRoZSBmaXJzdCBieXRlLiBJZiB0aGUgdmFsdWUgaXMgYDEwMDAgMDAwMWAgb3IgYDAwMDAgMDAwMGAgKGFzc3VtaW5nIGEgbmFtZSBzaG9ydGVyIHRoZW4gwrExNiBNQikgaXQgaXMgdGhlCitiaW5hcnkgcHJvdG9jb2wuIFdoZW4gdGhlIHZhbHVlIGlzIGAxMDAwIDAwMTBgIGl0IGlzIHRhbGtpbmcgdGhlIGNvbXBhY3QgcHJvdG9jb2wuCisKKyMjIEZyYW1lZCB2cy4gdW5mcmFtZWQgdHJhbnNwb3J0CisKK1RoZSBmaXJzdCB0aHJpZnQgYmluYXJ5IHdpcmUgZm9ybWF0IHdhcyB1bmZyYW1lZC4gVGhpcyBtZWFucyB0aGF0IGluZm9ybWF0aW9uIGlzIHNlbnQgb3V0IGluIGEgc2luZ2xlIHN0cmVhbSBvZiBieXRlcy4KK1dpdGggdW5mcmFtZWQgdHJhbnNwb3J0IHRoZSAoZ2VuZXJhdGVkKSBwcm9jZXNzb3JzIHdpbGwgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzb2NrZXQgKHRob3VnaCBBcGFjaGUgVGhyaWZ0IGRvZXMgdHJ5IHRvCitncmFiIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgc29ja2V0IGluIGEgYnVmZmVyIHdoZW4gaXQgY2FuKS4KKworTGF0ZXIsIFRocmlmdCBpbnRyb2R1Y2VkIHRoZSBmcmFtZWQgdHJhbnNwb3J0LgorCitXaXRoIGZyYW1lZCB0cmFuc3BvcnQgdGhlIGZ1bGwgcmVxdWVzdCBhbmQgcmVzcG9uc2UgKHRoZSBUTWVzc2FnZSBhbmQgdGhlIGZvbGxvd2luZyBzdHJ1Y3QpIGFyZSBmaXJzdCB3cml0dGVuIHRvIGEKK2J1ZmZlci4gVGhlbiB3aGVuIHRoZSBzdHJ1Y3QgaXMgY29tcGxldGUgKHRyYW5zcG9ydCBtZXRob2QgYGZsdXNoYCBpcyBoaWphY2tlZCBmb3IgdGhpcyksIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcword3JpdHRlbiB0byB0aGUgc29ja2V0IGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgYnVmZmVyZWQgYnl0ZXMuIFRoZSBjb21iaW5hdGlvbiBpcyBjYWxsZWQgYSBfZnJhbWVfLiBPbiB0aGUgcmVjZWl2ZXIgc2lkZQordGhlIGNvbXBsZXRlIGZyYW1lIGlzIGZpcnN0IHJlYWQgaW4gYSBidWZmZXIgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIHBhc3NlZCB0byBhIHByb2Nlc3Nvci4KKworVGhlIGxlbmd0aCBwcmVmaXggaXMgYSA0IGJ5dGUgc2lnbmVkIGludCwgc2VuZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlci4KK1RoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiBgMGAgPD0gbGVuZ3RoIDw9IGAxNjM4NDAwMGAgKDE2TSkuCisKK0ZyYW1lZCB0cmFuc3BvcnQgd2FzIGludHJvZHVjZWQgdG8gZWFzZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYXN5bmMgcHJvY2Vzc29ycy4gQW4gYXN5bmMgcHJvY2Vzc29yIGlzIG9ubHkgaW52b2tlZCB3aGVuCithbGwgZGF0YSBpcyByZWNlaXZlZC4gVW5mb3J0dW5hdGVseSwgZnJhbWVkIHRyYW5zcG9ydCBpcyBub3QgaWRlYWwgZm9yIGxhcmdlIG1lc3NhZ2VzIGFzIHRoZSBlbnRpcmUgZnJhbWUgc3RheXMgaW4KK21lbW9yeSB1bnRpbCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQuIEluIGFkZGl0aW9uLCB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbiBtZXJnZXMgdGhlIGluY29taW5nIGRhdGEgdG8gYSBzaW5nbGUsCitncm93aW5nIGJ5dGUgYXJyYXkuIEV2ZXJ5IHRpbWUgdGhlIGJ5dGUgYXJyYXkgaXMgZnVsbCBpdCBuZWVkcyB0byBiZSBjb3BpZWQgdG8gYSBuZXcgbGFyZ2VyIGJ5dGUgYXJyYXkuCisKK0ZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyLgpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1zYXNsLXNwZWMudHh0IGIvZG9jL3NwZWNzL3RocmlmdC1zYXNsLXNwZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2Y3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXNhc2wtc3BlYy50eHQKQEAgLTAsMCArMSwxMDggQEAKK0EgVGhyaWZ0IFNBU0wgbWVzc2FnZSBzaGFsbCBiZSBhIGJ5dGUgYXJyYXkgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCit8IDEtYnl0ZSBzdGF0dXMgY29kZSB8IDQtYnl0ZSBwYXlsb2FkIGxlbmd0aCB8IHZhcmlhYmxlLWxlbmd0aCBwYXlsb2FkIHwKKworVGhlIGxlbmd0aCBmaWVsZHMgc2hhbGwgYmUgaW50ZXJwcmV0ZWQgYXMgaW50ZWdlcnMsIHdpdGggdGhlIGhpZ2ggYnl0ZSBzZW50CitmaXJzdC4gVGhpcyBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGl0LCBub3QKK2luY2x1ZGluZyB0aGUgc3RhdHVzIGNvZGUgb3IgdGhlIGxlbmd0aCBieXRlcy4KKworVGhlIHBvc3NpYmxlIHN0YXR1cyBjb2RlcyBhcmU6CisKKzB4MDEgLSBTVEFSVCAtIEhlbGxvLCBsZXQncyBnbyBvbiBhIGRhdGUuCisweDAyIC0gT0sgLSBFdmVyeXRoaW5nJ3MgYmVlbiBnb2luZyBhbHJpZ2h0IHNvIGZhciwgbGV0J3Mgc2VlIGVhY2ggb3RoZXIgYWdhaW4uCisweDAzIC0gQkFEIC0gSSB1bmRlcnN0YW5kIHdoYXQgeW91J3JlIHNheWluZy4gSSByZWFsbHkgZG8uIEkganVzdCBkb24ndCBsaWtlIGl0LiBXZSBoYXZlIHRvIGJyZWFrIHVwLgorMHgwNCAtIEVSUk9SIC0gV2UgY2FuJ3QgZ28gb24gbGlrZSB0aGlzLiBJdCdzIGxpa2UgeW91J3JlIHNwZWFraW5nIGFub3RoZXIgbGFuZ3VhZ2UuCisweDA1IC0gQ09NUExFVEUgLSBXaWxsIHlvdSBtYXJyeSBtZT8KKworVGhlIFRocmlmdCBTQVNMIGNvbW11bmljYXRpb24gd2lsbCBwcm9jZWVkIGFzIGZvbGxvd3M6CisKKzEuIFRoZSBjbGllbnQgaXMgY29uZmlndXJlZCBhdCBpbnN0YW50aWF0aW9uIG9mIHRoZSB0cmFuc3BvcnQgd2l0aCBhIHNpbmdsZQordW5kZXJseWluZyBTQVNMIHNlY3VyaXR5IG1lY2hhbmlzbSB0aGF0IGl0IHN1cHBvcnRzLgorCisyLiBUaGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIG1hcHBpbmcgb2YgdW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20KK25hbWUgLT4gbWVjaGFuaXNtIG9wdGlvbnMuCisKKzMuIEF0IGNvbm5lY3Rpb24gdGltZSwgdGhlIGNsaWVudCB3aWxsIGluaXRpYXRlIGNvbW11bmljYXRpb24gYnkgc2VuZGluZyB0aGUKK3NlcnZlciBhIFNUQVJUIG1lc3NhZ2UuIFRoZSBwYXlsb2FkIG9mIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZQordW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20gdGhhdCB0aGUgY2xpZW50IHdvdWxkIGxpa2UgdG8gdXNlLgorVGhpcyBtZWNoYW5pc20gbmFtZSBzaGFsbCBiZSAxLTIwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCBhbmQgZm9sbG93IHRoZQorc3BlY2lmaWNhdGlvbnMgZm9yIFNBU0wgbWVjaGFuaXNtIG5hbWVzIHNwZWNpZmllZCBpbiBSRkMgMjIyMi4KKworNC4gVGhlIHNlcnZlciByZWNlaXZlcyB0aGlzIG1lc3NhZ2UgYW5kLCBpZiB0aGUgbWVjaGFuaXNtIG5hbWUgcHJvdmlkZWQgaXMKK2Ftb25nIHRoZSBzZXQgb2YgbWVjaGFuaXNtcyB0aGlzIHNlcnZlciB0cmFuc3BvcnQgaXMgY29uZmlndXJlZCB0byBhY2NlcHQsCithcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20gbWF5IHRha2UgcGxhY2UuCitJZiB0aGUgbWVjaGFuaXNtIG5hbWUgaXMgbm90IG9uZSB3aGljaCB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgdGhlCitzZXJ2ZXIgc2hhbGwgcmV0dXJuIHRoZSBCQUQgYnl0ZSwgZm9sbG93ZWQgYnkgYSA0LWJ5dGUsIHBvdGVudGlhbGx5IHplcm8tdmFsdWUKK21lc3NhZ2UgbGVuZ3RoLCBmb2xsb3dlZCBieSB0aGUgcG90ZW50aWFsbHkgemVyby1sZW5ndGggcGF5bG9hZCB3aGljaCBtYXkgYmUgYQorc3RhdHVzIGNvZGUgb3IgbWVzc2FnZSBpbmRpY2F0aW5nIGZhaWx1cmUuIE5vIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiBtYXkgdGFrZQorcGxhY2UgdmlhIHRoaXMgdHJhbnNwb3J0LiBJZiB0aGUgbWVjaGFuaXNtIG5hbWUgaXMgb25lIHdoaWNoIHRoZSBzZXJ2ZXIKK3N1cHBvcnRzLCB0aGVuIHByb2NlZWQgdG8gc3RlcCA1LgorCis1LiBGb2xsb3dpbmcgdGhlIFNUQVJUIG1lc3NhZ2UsIHRoZSBjbGllbnQgbXVzdCBzZW5kIGFub3RoZXIgbWVzc2FnZSBjb250YWluaW5nCit0aGUgImluaXRpYWwgcmVzcG9uc2UiIG9mIHRoZSBjaG9zZW4gU0FTTCBpbXBsZW1lbnRhdGlvbi4gVGhlIGNsaWVudCBtYXkgc2VuZAordGhpcyBtZXNzYWdlIHBpZ2d5LWJhY2tlZCBvbiB0aGUgIlNUQVJUIiBtZXNzYWdlIG9mIHN0ZXAgMy4gVGhlIG1lc3NhZ2UgdHlwZQorb2YgdGhpcyBtZXNzYWdlIG11c3QgYmUgZWl0aGVyICJPSyIgb3IgIkNPTVBMRVRFIiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCitTQVNMIGltcGxlbWVudGF0aW9uIGluZGljYXRlcyB0aGF0IHRoaXMgc2lkZSBvZiB0aGUgYXV0aGVudGljYXRpb24gaGFzIGJlZW4KK3NhdGlzZmllZC4KKworNi4gVGhlIHNlcnZlciB0aGVuIHByb3ZpZGVzIHRoZSBieXRlIGFycmF5IG9mIHRoZSBwYXlsb2FkIHJlY2VpdmVkIHRvIGl0cwordW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20uIEEgY2hhbGxlbmdlIGlzIGdlbmVyYXRlZCBieSB0aGUgdW5kZXJseWluZworc2VjdXJpdHkgbWVjaGFuaXNtIG9uIHRoZSBzZXJ2ZXIsIGFuZCB0aGlzIGlzIHVzZWQgYXMgdGhlIHBheWxvYWQgZm9yIGEgbWVzc2FnZQorc2VudCB0byB0aGUgY2xpZW50LiBUaGlzIG1lc3NhZ2Ugc2hhbGwgY29uc2lzdCBvZiBhbiBPSyBieXRlLCBmb2xsb3dlZCBieSB0aGUKK25vbi16ZXJvIG1lc3NhZ2UgbGVuZ3RoIHdvcmQsIGZvbGxvd2VkIGJ5IHRoZSBwYXlsb2FkLgorCis3LiBUaGUgY2xpZW50IHJlY2VpdmVzIHRoaXMgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHBhc3NlcyB0aGUgcGF5bG9hZCB0bworaXRzIHVuZGVybHlpbmcgc2VjdXJpdHkgbWVjaGFuaXNtIHRvIGdlbmVyYXRlIGEgcmVzcG9uc2UuIFRoZSBjbGllbnQgdGhlbiBzZW5kcwordGhlIHNlcnZlciBhbiBPSyBieXRlLCBmb2xsb3dlZCBieSB0aGUgbm9uLXplcm8tdmFsdWUgbGVuZ3RoIG9mIHRoZSByZXNwb25zZSwKK2ZvbGxvd2VkIGJ5IHRoZSBieXRlcyBvZiB0aGUgcmVzcG9uc2UgYXMgdGhlIHBheWxvYWQuCisKKzguIFN0ZXBzIDYgYW5kIDcgYXJlIHJlcGVhdGVkIHVudGlsIGJvdGggc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgc2F0aXNmaWVkIHdpdGgKK3RoZSBjaGFsbGVuZ2UvcmVzcG9uc2UgZXhjaGFuZ2UuIFdoZW4gZWl0aGVyIHNpZGUgaGFzIGNvbXBsZXRlZCBpdHMgc2VjdXJpdHkKK3Byb3RvY29sLCBpdHMgbmV4dCBtZXNzYWdlIHNoYWxsIGJlIHRoZSBDT01QTEVURSBieXRlLCBmb2xsb3dlZCBieSBhIDQtYnl0ZQorcG90ZW50aWFsbHkgemVyby12YWx1ZSBsZW5ndGggd29yZCwgZm9sbG93ZWQgYnkgYSBwb3RlbnRpYWxseSB6ZXJvLWxlbmd0aAorcGF5bG9hZC4gVGhpcyBwYXlsb2FkIHdpbGwgYmUgZW1wdHkgZXhjZXB0IGZvciB0aG9zZSB1bmRlcmx5aW5nIHNlY3VyaXR5CittZWNoYW5pc21zIHdoaWNoIHByb3ZpZGUgYWRkaXRpb25hbCBkYXRhIHdpdGggc3VjY2Vzcy4KKworSWYgYXQgYW55IHBvaW50IGluIHRpbWUgZWl0aGVyIHNpZGUgaXMgYWJsZSB0byBpbnRlcnByZXQgdGhlIGNoYWxsZW5nZSBvcgorcmVzcG9uc2Ugc2VudCBieSB0aGUgb3RoZXIsIGJ1dCBpcyBkaXNzYXRpc2ZpZWQgd2l0aCB0aGUgY29udGVudHMgdGhlcmVvZiwgdGhpcworc2lkZSBzaG91bGQgc2VuZCB0aGUgb3RoZXIgYSBCQUQgYnl0ZSwgZm9sbG93ZWQgYnkgYSA0LWJ5dGUgcG90ZW50aWFsbHkKK3plcm8tdmFsdWUgbGVuZ3RoIHdvcmQsIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsLCBwb3RlbnRpYWxseSB6ZXJvLWxlbmd0aAorbWVzc2FnZSBlbmNvZGVkIGluIFVURi04IGluZGljYXRpbmcgZmFpbHVyZS4gVGhpcyBtZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgdG8KK3RoZSBwcm90b2NvbCBhYm92ZSB0aGUgdGhyaWZ0IHRyYW5zcG9ydCBieSB3aGF0ZXZlciBtZWNoYW5pc20gaXMgYXBwcm9wcmlhdGUKK2FuZCBpZGlvbWF0aWMgZm9yIHRoZSBwYXJ0aWN1bGFyIGxhbmd1YWdlIHRoZXNlIHRocmlmdCBiaW5kaW5ncyBhcmUgZm9yLgorCitJZiBhdCBhbnkgcG9pbnQgaW4gdGltZSBlaXRoZXIgc2lkZSBmYWlscyB0byBpbnRlcnByZXQgdGhlIGNoYWxsZW5nZSBvcgorcmVzcG9uc2Ugc2VudCBieSB0aGUgb3RoZXIsIHRoaXMgc2lkZSBzaG91bGQgc2VuZCB0aGUgb3RoZXIgYW4gRVJST1IgYnl0ZSwKK2ZvbGxvd2VkIGJ5IGEgNC1ieXRlIHBvdGVudGlhbGx5IHplcm8tdmFsdWUgbGVuZ3RoIHdvcmQsIGZvbGxvd2VkIGJ5IGFuCitvcHRpb25hbCwgcG90ZW50aWFsbHkgemVyby1sZW5ndGggbWVzc2FnZSBlbmNvZGVkIGluIFVURi04LiBUaGlzIG1lc3NhZ2Ugc2hvdWxkCitiZSBwYXNzZWQgdG8gdGhlIHByb3RvY29sIGFib3ZlIHRoZSB0aHJpZnQgdHJhbnNwb3J0IGJ5IHdoYXRldmVyIG1lY2hhbmlzbSBpcworYXBwcm9wcmlhdGUgYW5kIGlkaW9tYXRpYyBmb3IgdGhlIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgdGhlc2UgdGhyaWZ0IGJpbmRpbmdzIGFyZQorZm9yLgorCitJZiBzdGVwIDggY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdGhlbiB0aGUgY29tbXVuaWNhdGlvbiBpcyBjb25zaWRlcmVkCithdXRoZW50aWNhdGVkIGFuZCBzdWJzZXF1ZW50IGNvbW11bmljYXRpb24gbWF5IGNvbW1lbmNlLgorCitJZiBzdGVwIDggZmFpbHMgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCB0aGVuIG5vIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiBtYXkKK3Rha2UgcGxhY2UgdmlhIHRoaXMgdHJhbnNwb3J0LgorCis4LiBBbGwgd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtdXN0IGJlIHByZWZpeGVkIGJ5IHRoZSA0LWJ5dGUgbGVuZ3RoCitvZiB0aGUgcGF5bG9hZCBkYXRhLCBmb2xsb3dlZCBieSB0aGUgcGF5bG9hZC4gQWxsIHJlYWRzIGZyb20gdGhpcyB0cmFuc3BvcnQKK3Nob3VsZCByZWFkIHRoZSA0LWJ5dGUgbGVuZ3RoIHdvcmQsIHRoZW4gcmVhZCB0aGUgZnVsbCBxdWFudGl0eSBvZiBieXRlcworc3BlY2lmaWVkIGJ5IHRoaXMgbGVuZ3RoIHdvcmQuCisKK0lmIG5vIFNBU0wgUU9QIChxdWFsaXR5IG9mIHByb3RlY3Rpb24pIGlzIG5lZ290aWF0ZWQgZHVyaW5nIHN0ZXBzIDYgYW5kIDcsIHRoZW4KK2FsbCBzdWJzZXF1ZW50IHdyaXRlcyB0by9yZWFkcyBmcm9tIHRoaXMgdHJhbnNwb3J0IGFyZSB3cml0dGVuL3JlYWQgdW5hbHRlcmVkLAorc2F2ZSBmb3IgdGhlIGxlbmd0aCBwcmVmaXgsIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKworSWYgYSBTQVNMIFFPUCBpcyBuZWdvdGlhdGVkLCB0aGVuIHRoaXMgbXVzdCBiZSB1c2VkIGJ5IHRoZSBUaHJpZnQgdHJhbnNwb3J0IGZvcgorYWxsIHN1YnNlcXVlbnQgY29tbXVuaWNhdGlvbi4gVGhpcyBpcyBkb25lIGJ5IHdyYXBwaW5nIHN1YnNlcXVlbnQgd3JpdGVzIHRvIHRoZQordHJhbnNwb3J0IHVzaW5nIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IG1lY2hhbmlzbSwgYW5kIHVud3JhcHBpbmcgc3Vic2VxdWVudAorcmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UsIHRoZSBsZW5ndGggcHJlZml4CitvZiB0aGUgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYWZ0ZXIgaXQgaGFzCitiZWVuIHdyYXBwZWQgYnkgdGhlIHVuZGVybHlpbmcgc2VjdXJpdHkgbWVjaGFuaXNtLiBOb3RlIHRoYXQgdGhlIGNvbXBsZXRlCittZXNzYWdlIG11c3QgYmUgcmVhZCBiZWZvcmUgZ2l2aW5nIHRoaXMgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzZWN1cml0eQorbWVjaGFuaXNtIGZvciB1bndyYXBwaW5nLgorCitJZiBhdCBhbnkgcG9pbnQgaW4gdGltZSByZWFkaW5nIG9mIGEgbWVzc2FnZSBmYWlscyBlaXRoZXIgYmVjYXVzZSBvZiBhCittYWxmb3JtZWQgbGVuZ3RoIHdvcmQgb3IgZmFpbHVyZSB0byB1bndyYXAgYnkgdGhlIHVuZGVybHlpbmcgc2VjdXJpdHkKK21lY2hhbmlzbSwgdGhlbiBhbGwgZnVydGhlciBjb21tdW5pY2F0aW9uIG9uIHRoaXMgdHJhbnNwb3J0IG11c3QgY2Vhc2UuCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LnRleCBiL2RvYy9zcGVjcy90aHJpZnQudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDZmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LnRleApAQCAtMCwwICsxLDEwNTcgQEAKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJQorJSAgICAgICAgICAgICAgIFRocmlmdCB3aGl0ZXBhcGVyCislCislIE5hbWU6ICAgICAgICAgdGhyaWZ0LnRleAorJQorJSBBdXRob3JzOiAgICAgIE1hcmsgU2xlZSAobWNzbGVlQGZhY2Vib29rLmNvbSkKKyUKKyUgQ3JlYXRlZDogICAgICAwNSBNYXJjaCAyMDA3CislCislIFlvdSB3aWxsIG5lZWQgYSBjb3B5IG9mIHNpZ3BsYW5jb25mLmNscyB0byBmb3JtYXQgdGhpcyBkb2N1bWVudC4KKyUgSXQgaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpZ3BsYW4ub3JnL2F1dGhvckluZm9ybWF0aW9uLmh0bT4uCislCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitcZG9jdW1lbnRjbGFzc1tub2NvcHlyaWdodHNwYWNlLGJsb2Nrc3R5bGVde3NpZ3BsYW5jb25mfQorCitcdXNlcGFja2FnZXthbXNzeW1ifQorXHVzZXBhY2thZ2V7YW1zZm9udHN9CitcdXNlcGFja2FnZXthbXNtYXRofQorXHVzZXBhY2thZ2V7dXJsfQorCitcYmVnaW57ZG9jdW1lbnR9CisKKyUgXGNvbmZlcmVuY2VpbmZve1dYWVogJzA1fXtkYXRlLCBDaXR5Ln0KKyUgXGNvcHlyaWdodHllYXJ7MjAwN30KKyUgXGNvcHlyaWdodGRhdGF7W3RvIGJlIHN1cHBsaWVkXX0KKworJSBcdGl0bGViYW5uZXJ7YmFubmVyIGFib3ZlIHBhcGVyIHRpdGxlfSAgICAgICAgJSBUaGVzZSBhcmUgaWdub3JlZCB1bmxlc3MKKyUgXHByZXByaW50Zm9vdGVye3Nob3J0IGRlc2NyaXB0aW9uIG9mIHBhcGVyfSAgICUgJ3ByZXByaW50JyBvcHRpb24gc3BlY2lmaWVkLgorCitcdGl0bGV7VGhyaWZ0OiBTY2FsYWJsZSBDcm9zcy1MYW5ndWFnZSBTZXJ2aWNlcyBJbXBsZW1lbnRhdGlvbn0KK1xzdWJ0aXRsZXt9CisKK1xhdXRob3JpbmZve01hcmsgU2xlZSwgQWRpdHlhIEFnYXJ3YWwgYW5kIE1hcmMgS3dpYXRrb3dza2l9CisgICAgICAgICAgIHtGYWNlYm9vaywgMTU2IFVuaXZlcnNpdHkgQXZlLCBQYWxvIEFsdG8sIENBfQorICAgICAgICAgICB7XHttY3NsZWUsYWRpdHlhLG1hcmNcfUBmYWNlYm9vay5jb219CisKK1xtYWtldGl0bGUKKworXGJlZ2lue2Fic3RyYWN0fQorVGhyaWZ0IGlzIGEgc29mdHdhcmUgbGlicmFyeSBhbmQgc2V0IG9mIGNvZGUtZ2VuZXJhdGlvbiB0b29scyBkZXZlbG9wZWQgYXQKK0ZhY2Vib29rIHRvIGV4cGVkaXRlIGRldmVsb3BtZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBlZmZpY2llbnQgYW5kIHNjYWxhYmxlCitiYWNrZW5kIHNlcnZpY2VzLiBJdHMgcHJpbWFyeSBnb2FsIGlzIHRvIGVuYWJsZSBlZmZpY2llbnQgYW5kIHJlbGlhYmxlCitjb21tdW5pY2F0aW9uIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYnkgYWJzdHJhY3RpbmcgdGhlIHBvcnRpb25zIG9mIGVhY2gKK2xhbmd1YWdlIHRoYXQgdGVuZCB0byByZXF1aXJlIHRoZSBtb3N0IGN1c3RvbWl6YXRpb24gaW50byBhIGNvbW1vbiBsaWJyYXJ5Cit0aGF0IGlzIGltcGxlbWVudGVkIGluIGVhY2ggbGFuZ3VhZ2UuIFNwZWNpZmljYWxseSwgVGhyaWZ0IGFsbG93cyBkZXZlbG9wZXJzIHRvCitkZWZpbmUgZGF0YXR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgbGFuZ3VhZ2UtbmV1dHJhbCBmaWxlCithbmQgZ2VuZXJhdGUgYWxsIHRoZSBuZWNlc3NhcnkgY29kZSB0byBidWlsZCBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworVGhpcyBwYXBlciBkZXRhaWxzIHRoZSBtb3RpdmF0aW9ucyBhbmQgZGVzaWduIGNob2ljZXMgd2UgbWFkZSBpbiBUaHJpZnQsIGFzCit3ZWxsIGFzIHNvbWUgb2YgdGhlIG1vcmUgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gSXQgaXMgbm90CitpbnRlbmRlZCB0byBiZSB0YWtlbiBhcyByZXNlYXJjaCwgYnV0IHJhdGhlciBpdCBpcyBhbiBleHBvc2l0aW9uIG9uIHdoYXQgd2UgZGlkCithbmQgd2h5LgorXGVuZHthYnN0cmFjdH0KKworJSBcY2F0ZWdvcnl7RC4zLjN9e1Byb2dyYW1taW5nIExhbmd1YWdlc317TGFuZ3VhZ2UgY29uc3RydWN0cyBhbmQgZmVhdHVyZXN9CisKKyVcdGVybXMKKyVMYW5ndWFnZXMsIHNlcmlhbGl6YXRpb24sIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAorCislXGtleXdvcmRzCislRGF0YSBkZXNjcmlwdGlvbiBsYW5ndWFnZSwgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UsIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAorCitcc2VjdGlvbntJbnRyb2R1Y3Rpb259CitBcyBGYWNlYm9vaydzIHRyYWZmaWMgYW5kIG5ldHdvcmsgc3RydWN0dXJlIGhhdmUgc2NhbGVkLCB0aGUgcmVzb3VyY2UKK2RlbWFuZHMgb2YgbWFueSBvcGVyYXRpb25zIG9uIHRoZSBzaXRlIChpLmUuIHNlYXJjaCwKK2FkIHNlbGVjdGlvbiBhbmQgZGVsaXZlcnksIGV2ZW50IGxvZ2dpbmcpIGhhdmUgcHJlc2VudGVkIHRlY2huaWNhbCByZXF1aXJlbWVudHMKK2RyYXN0aWNhbGx5IG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBMQU1QIGZyYW1ld29yay4gSW4gb3VyIGltcGxlbWVudGF0aW9uIG9mCit0aGVzZSBzZXJ2aWNlcywgdmFyaW91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvCitvcHRpbWl6ZSBmb3IgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIHBlcmZvcm1hbmNlLCBlYXNlIGFuZCBzcGVlZCBvZgorZGV2ZWxvcG1lbnQsIGF2YWlsYWJpbGl0eSBvZiBleGlzdGluZyBsaWJyYXJpZXMsIGV0Yy4gQnkgYW5kIGxhcmdlLAorRmFjZWJvb2sncyBlbmdpbmVlcmluZyBjdWx0dXJlIGhhcyB0ZW5kZWQgdG93YXJkcyBjaG9vc2luZyB0aGUgYmVzdAordG9vbHMgYW5kIGltcGxlbWVudGF0aW9ucyBhdmFpbGFibGUgb3ZlciBzdGFuZGFyZGl6aW5nIG9uIGFueSBvbmUKK3Byb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBiZWdydWRnaW5nbHkgYWNjZXB0aW5nIGl0cyBpbmhlcmVudCBsaW1pdGF0aW9ucy4KKworR2l2ZW4gdGhpcyBkZXNpZ24gY2hvaWNlLCB3ZSB3ZXJlIHByZXNlbnRlZCB3aXRoIHRoZSBjaGFsbGVuZ2Ugb2YgYnVpbGRpbmcKK2EgdHJhbnNwYXJlbnQsIGhpZ2gtcGVyZm9ybWFuY2UgYnJpZGdlIGFjcm9zcyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KK1dlIGZvdW5kIHRoYXQgbW9zdCBhdmFpbGFibGUgc29sdXRpb25zIHdlcmUgZWl0aGVyIHRvbyBsaW1pdGVkLCBkaWQgbm90IG9mZmVyCitzdWZmaWNpZW50IGRhdGF0eXBlIGZyZWVkb20sIG9yIHN1ZmZlcmVkIGZyb20gc3VicGFyIHBlcmZvcm1hbmNlLgorXGZvb3Rub3Rle1NlZSBBcHBlbmRpeCBBIGZvciBhIGRpc2N1c3Npb24gb2YgYWx0ZXJuYXRpdmUgc3lzdGVtcy59CisKK1RoZSBzb2x1dGlvbiB0aGF0IHdlIGhhdmUgaW1wbGVtZW50ZWQgY29tYmluZXMgYSBsYW5ndWFnZS1uZXV0cmFsIHNvZnR3YXJlCitzdGFjayBpbXBsZW1lbnRlZCBhY3Jvc3MgbnVtZXJvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBhbiBhc3NvY2lhdGVkIGNvZGUKK2dlbmVyYXRpb24gZW5naW5lIHRoYXQgdHJhbnNmb3JtcyBhIHNpbXBsZSBpbnRlcmZhY2UgYW5kIGRhdGEgZGVmaW5pdGlvbgorbGFuZ3VhZ2UgaW50byBjbGllbnQgYW5kIHNlcnZlciByZW1vdGUgcHJvY2VkdXJlIGNhbGwgbGlicmFyaWVzLgorQ2hvb3Npbmcgc3RhdGljIGNvZGUgZ2VuZXJhdGlvbiBvdmVyIGEgZHluYW1pYyBzeXN0ZW0gYWxsb3dzIHVzIHRvIGNyZWF0ZQordmFsaWRhdGVkIGNvZGUgdGhhdCBjYW4gYmUgcnVuIHdpdGhvdXQgdGhlIG5lZWQgZm9yCithbnkgYWR2YW5jZWQgaW50cm9zcGVjdGl2ZSBydW4tdGltZSB0eXBlIGNoZWNraW5nLiBJdCBpcyBhbHNvIGRlc2lnbmVkIHRvCitiZSBhcyBzaW1wbGUgYXMgcG9zc2libGUgZm9yIHRoZSBkZXZlbG9wZXIsIHdobyBjYW4gdHlwaWNhbGx5IGRlZmluZSBhbGwKK3RoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbnRlcmZhY2VzIGZvciBhIGNvbXBsZXggc2VydmljZSBpbiBhIHNpbmdsZQorc2hvcnQgZmlsZS4KKworU3VycHJpc2VkIHRoYXQgYSByb2J1c3Qgb3BlbiBzb2x1dGlvbiB0byB0aGVzZSByZWxhdGl2ZWx5IGNvbW1vbiBwcm9ibGVtcworZGlkIG5vdCB5ZXQgZXhpc3QsIHdlIGNvbW1pdHRlZCBlYXJseSBvbiB0byBtYWtpbmcgdGhlIFRocmlmdCBpbXBsZW1lbnRhdGlvbgorb3BlbiBzb3VyY2UuCisKK0luIGV2YWx1YXRpbmcgdGhlIGNoYWxsZW5nZXMgb2YgY3Jvc3MtbGFuZ3VhZ2UgaW50ZXJhY3Rpb24gaW4gYSBuZXR3b3JrZWQKK2Vudmlyb25tZW50LCBzb21lIGtleSBjb21wb25lbnRzIHdlcmUgaWRlbnRpZmllZDoKKworXHRleHRpdHtUeXBlcy59IEEgY29tbW9uIHR5cGUgc3lzdGVtIG11c3QgZXhpc3QgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcword2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHVzZSBjdXN0b20gVGhyaWZ0IGRhdGF0eXBlcworb3Igd3JpdGUgdGhlaXIgb3duIHNlcmlhbGl6YXRpb24gY29kZS4gVGhhdCBpcywKK2EgQysrIHByb2dyYW1tZXIgc2hvdWxkIGJlIGFibGUgdG8gdHJhbnNwYXJlbnRseSBleGNoYW5nZSBhIHN0cm9uZ2x5IHR5cGVkCitTVEwgbWFwIGZvciBhIGR5bmFtaWMgUHl0aG9uIGRpY3Rpb25hcnkuIE5laXRoZXIKK3Byb2dyYW1tZXIgc2hvdWxkIGJlIGZvcmNlZCB0byB3cml0ZSBhbnkgY29kZSBiZWxvdyB0aGUgYXBwbGljYXRpb24gbGF5ZXIKK3RvIGFjaGlldmUgdGhpcy4gU2VjdGlvbiAyIGRldGFpbHMgdGhlIFRocmlmdCB0eXBlIHN5c3RlbS4KKworXHRleHRpdHtUcmFuc3BvcnQufSBFYWNoIGxhbmd1YWdlIG11c3QgaGF2ZSBhIGNvbW1vbiBpbnRlcmZhY2UgdG8KK2JpZGlyZWN0aW9uYWwgcmF3IGRhdGEgdHJhbnNwb3J0LiBUaGUgc3BlY2lmaWNzIG9mIGhvdyBhIGdpdmVuCit0cmFuc3BvcnQgaXMgaW1wbGVtZW50ZWQgc2hvdWxkIG5vdCBtYXR0ZXIgdG8gdGhlIHNlcnZpY2UgZGV2ZWxvcGVyLgorVGhlIHNhbWUgYXBwbGljYXRpb24gY29kZSBzaG91bGQgYmUgYWJsZSB0byBydW4gYWdhaW5zdCBUQ1Agc3RyZWFtIHNvY2tldHMsCityYXcgZGF0YSBpbiBtZW1vcnksIG9yIGZpbGVzIG9uIGRpc2suIFNlY3Rpb24gMyBkZXRhaWxzIHRoZSBUaHJpZnQgVHJhbnNwb3J0CitsYXllci4KKworXHRleHRpdHtQcm90b2NvbC59IERhdGF0eXBlcyBtdXN0IGhhdmUgc29tZSB3YXkgb2YgdXNpbmcgdGhlIFRyYW5zcG9ydAorbGF5ZXIgdG8gZW5jb2RlIGFuZCBkZWNvZGUgdGhlbXNlbHZlcy4gQWdhaW4sIHRoZSBhcHBsaWNhdGlvbgorZGV2ZWxvcGVyIG5lZWQgbm90IGJlIGNvbmNlcm5lZCBieSB0aGlzIGxheWVyLiBXaGV0aGVyIHRoZSBzZXJ2aWNlIHVzZXMKK2FuIFhNTCBvciBiaW5hcnkgcHJvdG9jb2wgaXMgaW1tYXRlcmlhbCB0byB0aGUgYXBwbGljYXRpb24gY29kZS4KK0FsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCB0aGUgZGF0YSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBpbiBhIGNvbnNpc3RlbnQsCitkZXRlcm1pbmlzdGljIG1hdHRlci4gU2VjdGlvbiA0IGRldGFpbHMgdGhlIFRocmlmdCBQcm90b2NvbCBsYXllci4KKworXHRleHRpdHtWZXJzaW9uaW5nLn0gRm9yIHJvYnVzdCBzZXJ2aWNlcywgdGhlIGludm9sdmVkIGRhdGF0eXBlcyBtdXN0Citwcm92aWRlIGEgbWVjaGFuaXNtIGZvciB2ZXJzaW9uaW5nIHRoZW1zZWx2ZXMuIFNwZWNpZmljYWxseSwKK2l0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhZGQgb3IgcmVtb3ZlIGZpZWxkcyBpbiBhbiBvYmplY3Qgb3IgYWx0ZXIgdGhlCithcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gd2l0aG91dCBhbnkgaW50ZXJydXB0aW9uIGluIHNlcnZpY2UgKG9yLAord29yc2UgeWV0LCBuYXN0eSBzZWdtZW50YXRpb24gZmF1bHRzKS4gU2VjdGlvbiA1IGRldGFpbHMgVGhyaWZ0J3MgdmVyc2lvbmluZworc3lzdGVtLgorCitcdGV4dGl0e1Byb2Nlc3NvcnMufSBGaW5hbGx5LCB3ZSBnZW5lcmF0ZSBjb2RlIGNhcGFibGUgb2YgcHJvY2Vzc2luZyBkYXRhCitzdHJlYW1zIHRvIGFjY29tcGxpc2ggcmVtb3RlIHByb2NlZHVyZSBjYWxscy4gU2VjdGlvbiA2IGRldGFpbHMgdGhlIGdlbmVyYXRlZAorY29kZSBhbmQgVFByb2Nlc3NvciBwYXJhZGlnbS4KKworU2VjdGlvbiA3IGRpc2N1c3NlcyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBhbmQgU2VjdGlvbiA4IGRlc2NyaWJlcworb3VyIGNvbmNsdXNpb25zLgorCitcc2VjdGlvbntUeXBlc30KKworVGhlIGdvYWwgb2YgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBpcyB0byBlbmFibGUgcHJvZ3JhbW1lcnMgdG8gZGV2ZWxvcCB1c2luZworY29tcGxldGVseSBuYXRpdmVseSBkZWZpbmVkIHR5cGVzLCBubyBtYXR0ZXIgd2hhdCBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGV5Cit1c2UuIEJ5IGRlc2lnbiwgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHNwZWNpYWwgZHluYW1pYwordHlwZXMgb3Igd3JhcHBlciBvYmplY3RzLiBJdCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgZGV2ZWxvcGVyIHdyaXRlCithbnkgY29kZSBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24gb3IgdHJhbnNwb3J0LiBUaGUgVGhyaWZ0IElETCAoSW50ZXJmYWNlCitEZWZpbml0aW9uIExhbmd1YWdlKSBmaWxlIGlzCitsb2dpY2FsbHkgYSB3YXkgZm9yIGRldmVsb3BlcnMgdG8gYW5ub3RhdGUgdGhlaXIgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdGhlCittaW5pbWFsIGFtb3VudCBvZiBleHRyYSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gdGVsbCBhIGNvZGUgZ2VuZXJhdG9yCitob3cgdG8gc2FmZWx5IHRyYW5zcG9ydCB0aGUgb2JqZWN0cyBhY3Jvc3MgbGFuZ3VhZ2VzLgorCitcc3Vic2VjdGlvbntCYXNlIFR5cGVzfQorCitUaGUgdHlwZSBzeXN0ZW0gcmVzdHMgdXBvbiBhIGZldyBiYXNlIHR5cGVzLiBJbiBjb25zaWRlcmluZyB3aGljaCB0eXBlcyB0bworc3VwcG9ydCwgd2UgYWltZWQgZm9yIGNsYXJpdHkgYW5kIHNpbXBsaWNpdHkgb3ZlciBhYnVuZGFuY2UsIGZvY3VzaW5nCitvbiB0aGUga2V5IHR5cGVzIGF2YWlsYWJsZSBpbiBhbGwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBvbWl0dGluZyBhbnkKK25pY2hlIHR5cGVzIGF2YWlsYWJsZSBvbmx5IGluIHNwZWNpZmljIGxhbmd1YWdlcy4KKworVGhlIGJhc2UgdHlwZXMgc3VwcG9ydGVkIGJ5IFRocmlmdCBhcmU6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx0ZXh0dHR7Ym9vbH0gQSBib29sZWFuIHZhbHVlLCB0cnVlIG9yIGZhbHNlCitcaXRlbSBcdGV4dHR0e2J5dGV9IEEgc2lnbmVkIGJ5dGUKK1xpdGVtIFx0ZXh0dHR7aTE2fSBBIDE2LWJpdCBzaWduZWQgaW50ZWdlcgorXGl0ZW0gXHRleHR0dHtpMzJ9IEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyCitcaXRlbSBcdGV4dHR0e2k2NH0gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIKK1xpdGVtIFx0ZXh0dHR7ZG91YmxlfSBBIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIKK1xpdGVtIFx0ZXh0dHR7c3RyaW5nfSBBbiBlbmNvZGluZy1hZ25vc3RpYyB0ZXh0IG9yIGJpbmFyeSBzdHJpbmcKK1xpdGVtIFx0ZXh0dHR7YmluYXJ5fSBBIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gZm9yIGJsb2JzCitcZW5ke2l0ZW1pemV9CisKK09mIHBhcnRpY3VsYXIgbm90ZSBpcyB0aGUgYWJzZW5jZSBvZiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzLiBCZWNhdXNlIHRoZXNlCit0eXBlcyBoYXZlIG5vIGRpcmVjdCB0cmFuc2xhdGlvbiB0byBuYXRpdmUgcHJpbWl0aXZlIHR5cGVzIGluIG1hbnkgbGFuZ3VhZ2VzLAordGhlIGFkdmFudGFnZXMgdGhleSBhZmZvcmQgYXJlIGxvc3QuIEZ1cnRoZXIsIHRoZXJlIGlzIG5vIHdheSB0byBwcmV2ZW50IHRoZQorYXBwbGljYXRpb24gZGV2ZWxvcGVyIGluIGEgbGFuZ3VhZ2UgbGlrZSBQeXRob24gZnJvbSBhc3NpZ25pbmcgYSBuZWdhdGl2ZSB2YWx1ZQordG8gYW4gaW50ZWdlciB2YXJpYWJsZSwgbGVhZGluZyB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yLiBGcm9tIGEgZGVzaWduCitzdGFuZHBvaW50LCB3ZSBvYnNlcnZlZCB0aGF0IHVuc2lnbmVkIGludGVnZXJzIHdlcmUgdmVyeSByYXJlbHksIGlmIGV2ZXIsIHVzZWQKK2ZvciBhcml0aG1ldGljIHB1cnBvc2VzLCBidXQgaW4gcHJhY3RpY2Ugd2VyZSBtdWNoIG1vcmUgb2Z0ZW4gdXNlZCBhcyBrZXlzIG9yCitpZGVudGlmaWVycy4gSW4gdGhpcyBjYXNlLCB0aGUgc2lnbiBpcyBpcnJlbGV2YW50LiBTaWduZWQgaW50ZWdlcnMgc2VydmUgdGhpcworc2FtZSBwdXJwb3NlIGFuZCBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gdGhlaXIgdW5zaWduZWQgY291bnRlcnBhcnRzIChtb3N0Citjb21tb25seSBpbiBDKyspIHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuCisKK1xzdWJzZWN0aW9ue1N0cnVjdHN9CisKK0EgVGhyaWZ0IHN0cnVjdCBkZWZpbmVzIGEgY29tbW9uIG9iamVjdCB0byBiZSB1c2VkIGFjcm9zcyBsYW5ndWFnZXMuIEEgc3RydWN0CitpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIGEgY2xhc3MgaW4gb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nCitsYW5ndWFnZXMuIEEgc3RydWN0IGhhcyBhIHNldCBvZiBzdHJvbmdseSB0eXBlZCBmaWVsZHMsIGVhY2ggd2l0aCBhIHVuaXF1ZQorbmFtZSBpZGVudGlmaWVyLiBUaGUgYmFzaWMgc3ludGF4IGZvciBkZWZpbmluZyBhIFRocmlmdCBzdHJ1Y3QgbG9va3MgdmVyeQorc2ltaWxhciB0byBhIEMgc3RydWN0IGRlZmluaXRpb24uIEZpZWxkcyBtYXkgYmUgYW5ub3RhdGVkIHdpdGggYW4gaW50ZWdlciBmaWVsZAoraWRlbnRpZmllciAodW5pcXVlIHRvIHRoZSBzY29wZSBvZiB0aGF0IHN0cnVjdCkgYW5kIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWVzLgorRmllbGQgaWRlbnRpZmllcnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGlmIG9taXR0ZWQsIHRob3VnaCB0aGV5IGFyZQorc3Ryb25nbHkgZW5jb3VyYWdlZCBmb3IgdmVyc2lvbmluZyByZWFzb25zIGRpc2N1c3NlZCBsYXRlci4KKworXHN1YnNlY3Rpb257Q29udGFpbmVyc30KKworVGhyaWZ0IGNvbnRhaW5lcnMgYXJlIHN0cm9uZ2x5IHR5cGVkIGNvbnRhaW5lcnMgdGhhdCBtYXAgdG8gdGhlIG1vc3QgY29tbW9ubHkKK3VzZWQgY29udGFpbmVycyBpbiBjb21tb24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBUaGV5IGFyZSBhbm5vdGF0ZWQgdXNpbmcKK3RoZSBDKysgdGVtcGxhdGUgKG9yIEphdmEgR2VuZXJpY3MpIHN0eWxlLiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgYXZhaWxhYmxlOgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdGV4dHR0e2xpc3Q8dHlwZT59IEFuIG9yZGVyZWQgbGlzdCBvZiBlbGVtZW50cy4gVHJhbnNsYXRlcyBkaXJlY3RseSBpbnRvCithbiBTVEwgXHRleHR0dHt2ZWN0b3J9LCBKYXZhIFx0ZXh0dHR7QXJyYXlMaXN0fSwgb3IgbmF0aXZlIGFycmF5IGluIHNjcmlwdGluZyBsYW5ndWFnZXMuIE1heQorY29udGFpbiBkdXBsaWNhdGVzLgorXGl0ZW0gXHRleHR0dHtzZXQ8dHlwZT59IEFuIHVub3JkZXJlZCBzZXQgb2YgdW5pcXVlIGVsZW1lbnRzLiBUcmFuc2xhdGVzIGludG8KK2FuIFNUTCBcdGV4dHR0e3NldH0sIEphdmEgXHRleHR0dHtIYXNoU2V0fSwgXHRleHR0dHtzZXR9IGluIFB5dGhvbiwgb3IgbmF0aXZlCitkaWN0aW9uYXJ5IGluIFBIUC9SdWJ5LgorXGl0ZW0gXHRleHR0dHttYXA8dHlwZTEsdHlwZTI+fSBBIG1hcCBvZiBzdHJpY3RseSB1bmlxdWUga2V5cyB0byB2YWx1ZXMKK1RyYW5zbGF0ZXMgaW50byBhbiBTVEwgXHRleHR0dHttYXB9LCBKYXZhIFx0ZXh0dHR7SGFzaE1hcH0sIFBIUCBhc3NvY2lhdGl2ZQorYXJyYXksIG9yIFB5dGhvbi9SdWJ5IGRpY3Rpb25hcnkuCitcZW5ke2l0ZW1pemV9CisKK1doaWxlIGRlZmF1bHRzIGFyZSBwcm92aWRlZCwgdGhlIHR5cGUgbWFwcGluZ3MgYXJlIG5vdCBleHBsaWNpdGx5IGZpeGVkLiBDdXN0b20KK2NvZGUgZ2VuZXJhdG9yIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHN1YnN0aXR1dGUgY3VzdG9tIHR5cGVzIGluCitkZXN0aW5hdGlvbiBsYW5ndWFnZXMgKGkuZS4KK1x0ZXh0dHR7aGFzaFxfbWFwfSBvciBHb29nbGUncyBzcGFyc2UgaGFzaCBtYXAgY2FuIGJlIHVzZWQgaW4gQysrKS4gVGhlCitvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIGN1c3RvbSB0eXBlcyBzdXBwb3J0IGFsbCB0aGUgbmVjZXNzYXJ5IGl0ZXJhdGlvbgorcHJpbWl0aXZlcy4gQ29udGFpbmVyIGVsZW1lbnRzIG1heSBiZSBvZiBhbnkgdmFsaWQgVGhyaWZ0IHR5cGUsIGluY2x1ZGluZyBvdGhlcgorY29udGFpbmVycyBvciBzdHJ1Y3RzLgorCitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgRXhhbXBsZSB7CisgIDE6aTMyIG51bWJlcj0xMCwKKyAgMjppNjQgYmlnTnVtYmVyLAorICAzOmRvdWJsZSBkZWNpbWFscywKKyAgNDpzdHJpbmcgbmFtZT0idGhyaWZ0eSIKK31cZW5ke3ZlcmJhdGltfQorCitJbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBlYWNoIGRlZmluaXRpb24gZ2VuZXJhdGVzIGEgdHlwZSB3aXRoIHR3byBtZXRob2RzLAorXHRleHR0dHtyZWFkfSBhbmQgXHRleHR0dHt3cml0ZX0sIHdoaWNoIHBlcmZvcm0gc2VyaWFsaXphdGlvbiBhbmQgdHJhbnNwb3J0CitvZiB0aGUgb2JqZWN0cyB1c2luZyBhIFRocmlmdCBUUHJvdG9jb2wgb2JqZWN0LgorCitcc3Vic2VjdGlvbntFeGNlcHRpb25zfQorCitFeGNlcHRpb25zIGFyZSBzeW50YWN0aWNhbGx5IGFuZCBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBzdHJ1Y3RzIGV4Y2VwdAordGhhdCB0aGV5IGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgXHRleHR0dHtleGNlcHRpb259IGtleXdvcmQgaW5zdGVhZCBvZiB0aGUKK1x0ZXh0dHR7c3RydWN0fSBrZXl3b3JkLgorCitUaGUgZ2VuZXJhdGVkIG9iamVjdHMgaW5oZXJpdCBmcm9tIGFuIGV4Y2VwdGlvbiBiYXNlIGNsYXNzIGFzIGFwcHJvcHJpYXRlCitpbiBlYWNoIHRhcmdldCBwcm9ncmFtbWluZyBsYW5ndWFnZSwgaW4gb3JkZXIgdG8gc2VhbWxlc3NseQoraW50ZWdyYXRlIHdpdGggbmF0aXZlIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBhbnkgZ2l2ZW4KK2xhbmd1YWdlLiBBZ2FpbiwgdGhlIGRlc2lnbiBlbXBoYXNpcyBpcyBvbiBtYWtpbmcgdGhlIGNvZGUgZmFtaWxpYXIgdG8gdGhlCithcHBsaWNhdGlvbiBkZXZlbG9wZXIuCisKK1xzdWJzZWN0aW9ue1NlcnZpY2VzfQorCitTZXJ2aWNlcyBhcmUgZGVmaW5lZCB1c2luZyBUaHJpZnQgdHlwZXMuIERlZmluaXRpb24gb2YgYSBzZXJ2aWNlIGlzCitzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBkZWZpbmluZyBhbiBpbnRlcmZhY2UgKG9yIGEgcHVyZSB2aXJ0dWFsIGFic3RyYWN0CitjbGFzcykgaW4gb2JqZWN0IG9yaWVudGVkCitwcm9ncmFtbWluZy4gVGhlIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZXMgZnVsbHkgZnVuY3Rpb25hbCBjbGllbnQgYW5kCitzZXJ2ZXIgc3R1YnMgdGhhdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZS4gU2VydmljZXMgYXJlIGRlZmluZWQgYXMgZm9sbG93czoKKworXGJlZ2lue3ZlcmJhdGltfQorc2VydmljZSA8bmFtZT4geworICA8cmV0dXJudHlwZT4gPG5hbWU+KDxhcmd1bWVudHM+KQorICAgIFt0aHJvd3MgKDxleGNlcHRpb25zPildCisgIC4uLgorfVxlbmR7dmVyYmF0aW19CisKK0FuIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3NlcnZpY2UgU3RyaW5nQ2FjaGUgeworICB2b2lkIHNldCgxOmkzMiBrZXksIDI6c3RyaW5nIHZhbHVlKSwKKyAgc3RyaW5nIGdldCgxOmkzMiBrZXkpIHRocm93cyAoMTpLZXlOb3RGb3VuZCBrbmYpLAorICB2b2lkIGRlbGV0ZSgxOmkzMiBrZXkpCit9CitcZW5ke3ZlcmJhdGltfQorCitOb3RlIHRoYXQgXHRleHR0dHt2b2lkfSBpcyBhIHZhbGlkIHR5cGUgZm9yIGEgZnVuY3Rpb24gcmV0dXJuLCBpbiBhZGRpdGlvbiB0bworYWxsIG90aGVyIGRlZmluZWQgVGhyaWZ0IHR5cGVzLiBBZGRpdGlvbmFsbHksIGFuIFx0ZXh0dHR7YXN5bmN9IG1vZGlmaWVyCitrZXl3b3JkIG1heSBiZSBhZGRlZCB0byBhIFx0ZXh0dHR7dm9pZH0gZnVuY3Rpb24sIHdoaWNoIHdpbGwgZ2VuZXJhdGUgY29kZSB0aGF0IGRvZXMKK25vdCB3YWl0IGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gTm90ZSB0aGF0IGEgcHVyZSBcdGV4dHR0e3ZvaWR9CitmdW5jdGlvbiB3aWxsIHJldHVybiBhIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHRoZQorb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgb24gdGhlIHNlcnZlciBzaWRlLiBXaXRoIFx0ZXh0dHR7YXN5bmN9IG1ldGhvZCBjYWxscwordGhlIGNsaWVudCB3aWxsIG9ubHkgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBhdCB0aGUKK3RyYW5zcG9ydCBsYXllci4gKEluIG1hbnkgdHJhbnNwb3J0IHNjZW5hcmlvcyB0aGlzIGlzIGluaGVyZW50bHkgdW5yZWxpYWJsZQorZHVlIHRvIHRoZSBCeXphbnRpbmUgR2VuZXJhbHMnIFByb2JsZW0uIFRoZXJlZm9yZSwgYXBwbGljYXRpb24gZGV2ZWxvcGVycworc2hvdWxkIHRha2UgY2FyZSBvbmx5IHRvIHVzZSB0aGUgYXN5bmMgb3B0aW1pemF0aW9uIGluIGNhc2VzIHdoZXJlIGRyb3BwZWQKK21ldGhvZCBjYWxscyBhcmUgYWNjZXB0YWJsZSBvciB0aGUgdHJhbnNwb3J0IGlzIGtub3duIHRvIGJlIHJlbGlhYmxlLikKKworQWxzbyBvZiBub3RlIGlzIHRoZSBmYWN0IHRoYXQgYXJndW1lbnQgbGlzdHMgYW5kIGV4Y2VwdGlvbiBsaXN0cyBmb3IgZnVuY3Rpb25zCithcmUgaW1wbGVtZW50ZWQgYXMgVGhyaWZ0IHN0cnVjdHMuIEFsbCB0aHJlZSBjb25zdHJ1Y3RzIGFyZSBpZGVudGljYWwgaW4gYm90aAorbm90YXRpb24gYW5kIGJlaGF2aW9yLgorCitcc2VjdGlvbntUcmFuc3BvcnR9CisKK1RoZSB0cmFuc3BvcnQgbGF5ZXIgaXMgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZmFjaWxpdGF0ZSBkYXRhIHRyYW5zZmVyLgorCitcc3Vic2VjdGlvbntJbnRlcmZhY2V9CisKK0Ega2V5IGRlc2lnbiBjaG9pY2UgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCB3YXMgdG8gZGVjb3VwbGUgdGhlCit0cmFuc3BvcnQgbGF5ZXIgZnJvbSB0aGUgY29kZSBnZW5lcmF0aW9uIGxheWVyLiBUaG91Z2ggVGhyaWZ0IGlzIHR5cGljYWxseQordXNlZCBvbiB0b3Agb2YgdGhlIFRDUC9JUCBzdGFjayB3aXRoIHN0cmVhbWluZyBzb2NrZXRzIGFzIHRoZSBiYXNlIGxheWVyIG9mCitjb21tdW5pY2F0aW9uLCB0aGVyZSB3YXMgbm8gY29tcGVsbGluZyByZWFzb24gdG8gYnVpbGQgdGhhdCBjb25zdHJhaW50IGludG8KK3RoZSBzeXN0ZW0uIFRoZSBwZXJmb3JtYW5jZSB0cmFkZW9mZiBpbmN1cnJlZCBieSBhbiBhYnN0cmFjdGVkIEkvTyBsYXllcgorKHJvdWdobHkgb25lIHZpcnR1YWwgbWV0aG9kIGxvb2t1cCAvIGZ1bmN0aW9uIGNhbGwgcGVyIG9wZXJhdGlvbikgd2FzCitpbW1hdGVyaWFsIGNvbXBhcmVkIHRvIHRoZSBjb3N0IG9mIGFjdHVhbCBJL08gb3BlcmF0aW9ucyAodHlwaWNhbGx5IGludm9raW5nCitzeXN0ZW0gY2FsbHMpLgorCitGdW5kYW1lbnRhbGx5LCBnZW5lcmF0ZWQgVGhyaWZ0IGNvZGUgb25seSBuZWVkcyB0byBrbm93IGhvdyB0byByZWFkIGFuZAord3JpdGUgZGF0YS4gVGhlIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gb2YgdGhlIGRhdGEgYXJlIGlycmVsZXZhbnQ7IGl0IG1heSBiZSBhCitzb2NrZXQsIGEgc2VnbWVudCBvZiBzaGFyZWQgbWVtb3J5LCBvciBhIGZpbGUgb24gdGhlIGxvY2FsIGRpc2suIFRoZSBUaHJpZnQKK3RyYW5zcG9ydCBpbnRlcmZhY2Ugc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx0ZXh0dHR7b3Blbn0gT3BlbnMgdGhlIHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtjbG9zZX0gQ2xvc2VzIHRoZSB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7aXNPcGVufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KK1xpdGVtIFx0ZXh0dHR7cmVhZH0gUmVhZHMgZnJvbSB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e3dyaXRlfSBXcml0ZXMgdG8gdGhlIHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtmbHVzaH0gRm9yY2VzIGFueSBwZW5kaW5nIHdyaXRlcworXGVuZHtpdGVtaXplfQorCitUaGVyZSBhcmUgYSBmZXcgYWRkaXRpb25hbCBtZXRob2RzIG5vdCBkb2N1bWVudGVkIGhlcmUgd2hpY2ggYXJlIHVzZWQgdG8gYWlkCitpbiBiYXRjaGluZyByZWFkcyBhbmQgb3B0aW9uYWxseSBzaWduYWxpbmcgdGhlIGNvbXBsZXRpb24gb2YgYSByZWFkIG9yCit3cml0ZSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZQorXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UsIHRoZXJlIGlzIGFcXAorXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSBpbnRlcmZhY2UKK3VzZWQgdG8gYWNjZXB0IG9yIGNyZWF0ZSBwcmltaXRpdmUgdHJhbnNwb3J0IG9iamVjdHMuIEl0cyBpbnRlcmZhY2UgaXMgYXMKK2ZvbGxvd3M6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e2xpc3Rlbn0gQmVnaW5zIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMKK1xpdGVtIFx0ZXh0dHR7YWNjZXB0fSBSZXR1cm5zIGEgbmV3IGNsaWVudCB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7Y2xvc2V9IENsb3NlcyB0aGUgdHJhbnNwb3J0CitcZW5ke2l0ZW1pemV9CisKK1xzdWJzZWN0aW9ue0ltcGxlbWVudGF0aW9ufQorCitUaGUgdHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb3Igc2ltcGxlIGltcGxlbWVudGF0aW9uIGluIGFueQorcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE5ldyB0cmFuc3BvcnQgbWVjaGFuaXNtcyBjYW4gYmUgZWFzaWx5IGRlZmluZWQgYXMgbmVlZGVkCitieSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLgorCitcc3Vic3Vic2VjdGlvbntUU29ja2V0fQorCitUaGUgXHRleHR0dHtUU29ja2V0fSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhY3Jvc3MgYWxsIHRhcmdldCBsYW5ndWFnZXMuIEl0Citwcm92aWRlcyBhIGNvbW1vbiwgc2ltcGxlIGludGVyZmFjZSB0byBhIFRDUC9JUCBzdHJlYW0gc29ja2V0LgorCitcc3Vic3Vic2VjdGlvbntURmlsZVRyYW5zcG9ydH0KKworVGhlIFx0ZXh0dHR7VEZpbGVUcmFuc3BvcnR9IGlzIGFuIGFic3RyYWN0aW9uIG9mIGFuIG9uLWRpc2sgZmlsZSB0byBhIGRhdGEKK3N0cmVhbS4gSXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgb3V0IGEgc2V0IG9mIGluY29taW5nIFRocmlmdCByZXF1ZXN0cyB0byBhIGZpbGUKK29uIGRpc2suIFRoZSBvbi1kaXNrIGRhdGEgY2FuIHRoZW4gYmUgcmVwbGF5ZWQgZnJvbSB0aGUgbG9nLCBlaXRoZXIgZm9yCitwb3N0LXByb2Nlc3Npbmcgb3IgZm9yIHJlcHJvZHVjdGlvbiBhbmQvb3Igc2ltdWxhdGlvbiBvZiBwYXN0IGV2ZW50cy4KKworXHN1YnN1YnNlY3Rpb257VXRpbGl0aWVzfQorCitUaGUgVHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGVhc3kgZXh0ZW5zaW9uIHVzaW5nIGNvbW1vbgorT09QIHRlY2huaXF1ZXMsIHN1Y2ggYXMgY29tcG9zaXRpb24uIFNvbWUgc2ltcGxlIHV0aWxpdGllcyBpbmNsdWRlIHRoZQorXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnR9LCB3aGljaCBidWZmZXJzIHRoZSB3cml0ZXMgYW5kIHJlYWRzIG9uIGFuCit1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlIFx0ZXh0dHR7VEZyYW1lZFRyYW5zcG9ydH0sIHdoaWNoIHRyYW5zbWl0cyBkYXRhIHdpdGggZnJhbWUKK3NpemUgaGVhZGVycyBmb3IgY2h1bmtpbmcgb3B0aW1pemF0aW9uIG9yIG5vbmJsb2NraW5nIG9wZXJhdGlvbiwgYW5kIHRoZQorXHRleHR0dHtUTWVtb3J5QnVmZmVyfSwgd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZGlyZWN0bHkgZnJvbSB0aGUgaGVhcAorb3Igc3RhY2sgbWVtb3J5IG93bmVkIGJ5IHRoZSBwcm9jZXNzLgorCitcc2VjdGlvbntQcm90b2NvbH0KKworQSBzZWNvbmQgbWFqb3IgYWJzdHJhY3Rpb24gaW4gVGhyaWZ0IGlzIHRoZSBzZXBhcmF0aW9uIG9mIGRhdGEgc3RydWN0dXJlIGZyb20KK3RyYW5zcG9ydCByZXByZXNlbnRhdGlvbi4gVGhyaWZ0IGVuZm9yY2VzIGEgY2VydGFpbiBtZXNzYWdpbmcgc3RydWN0dXJlIHdoZW4KK3RyYW5zcG9ydGluZyBkYXRhLCBidXQgaXQgaXMgYWdub3N0aWMgdG8gdGhlIHByb3RvY29sIGVuY29kaW5nIGluIHVzZS4gVGhhdCBpcywKK2l0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIGRhdGEgaXMgZW5jb2RlZCBhcyBYTUwsIGh1bWFuLXJlYWRhYmxlIEFTQ0lJLCBvciBhCitkZW5zZSBiaW5hcnkgZm9ybWF0IGFzIGxvbmcgYXMgdGhlIGRhdGEgc3VwcG9ydHMgYSBmaXhlZCBzZXQgb2Ygb3BlcmF0aW9ucwordGhhdCBhbGxvdyBpdCB0byBiZSBkZXRlcm1pbmlzdGljYWxseSByZWFkIGFuZCB3cml0dGVuIGJ5IGdlbmVyYXRlZCBjb2RlLgorCitcc3Vic2VjdGlvbntJbnRlcmZhY2V9CisKK1RoZSBUaHJpZnQgUHJvdG9jb2wgaW50ZXJmYWNlIGlzIHZlcnkgc3RyYWlnaHRmb3J3YXJkLiBJdCBmdW5kYW1lbnRhbGx5CitzdXBwb3J0cyB0d28gdGhpbmdzOiAxKSBiaWRpcmVjdGlvbmFsIHNlcXVlbmNlZCBtZXNzYWdpbmcsIGFuZAorMikgZW5jb2Rpbmcgb2YgYmFzZSB0eXBlcywgY29udGFpbmVycywgYW5kIHN0cnVjdHMuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3dyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcSkKK3dyaXRlTWVzc2FnZUVuZCgpCit3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCit3cml0ZVN0cnVjdEVuZCgpCit3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHlwZSwgaWQpCit3cml0ZUZpZWxkRW5kKCkKK3dyaXRlRmllbGRTdG9wKCkKK3dyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQord3JpdGVNYXBFbmQoKQord3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCit3cml0ZUxpc3RFbmQoKQord3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKK3dyaXRlU2V0RW5kKCkKK3dyaXRlQm9vbChib29sKQord3JpdGVCeXRlKGJ5dGUpCit3cml0ZUkxNihpMTYpCit3cml0ZUkzMihpMzIpCit3cml0ZUk2NChpNjQpCit3cml0ZURvdWJsZShkb3VibGUpCit3cml0ZVN0cmluZyhzdHJpbmcpCisKK25hbWUsIHR5cGUsIHNlcSA9IHJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZE1lc3NhZ2VFbmQoKQorbmFtZSA9ICAgICAgICAgICAgcmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgICAgICAgIHJlYWRTdHJ1Y3RFbmQoKQorbmFtZSwgdHlwZSwgaWQgPSAgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZEZpZWxkRW5kKCkKK2ssIHYsIHNpemUgPSAgICAgIHJlYWRNYXBCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkTWFwRW5kKCkKK2V0eXBlLCBzaXplID0gICAgIHJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZExpc3RFbmQoKQorZXR5cGUsIHNpemUgPSAgICAgcmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgICAgICAgIHJlYWRTZXRFbmQoKQorYm9vbCA9ICAgICAgICAgICAgcmVhZEJvb2woKQorYnl0ZSA9ICAgICAgICAgICAgcmVhZEJ5dGUoKQoraTE2ID0gICAgICAgICAgICAgcmVhZEkxNigpCitpMzIgPSAgICAgICAgICAgICByZWFkSTMyKCkKK2k2NCA9ICAgICAgICAgICAgIHJlYWRJNjQoKQorZG91YmxlID0gICAgICAgICAgcmVhZERvdWJsZSgpCitzdHJpbmcgPSAgICAgICAgICByZWFkU3RyaW5nKCkKK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCBldmVyeSBcdGV4dHR0e3dyaXRlfSBmdW5jdGlvbiBoYXMgZXhhY3RseSBvbmUgXHRleHR0dHtyZWFkfSBjb3VudGVycGFydCwgd2l0aAordGhlIGV4Y2VwdGlvbiBvZiBcdGV4dHR0e3dyaXRlRmllbGRTdG9wKCl9LiBUaGlzIGlzIGEgc3BlY2lhbCBtZXRob2QKK3RoYXQgc2lnbmFscyB0aGUgZW5kIG9mIGEgc3RydWN0LiBUaGUgcHJvY2VkdXJlIGZvciByZWFkaW5nIGEgc3RydWN0IGlzIHRvCitcdGV4dHR0e3JlYWRGaWVsZEJlZ2luKCl9IHVudGlsIHRoZSBzdG9wIGZpZWxkIGlzIGVuY291bnRlcmVkLCBhbmQgdGhlbiB0bworXHRleHR0dHtyZWFkU3RydWN0RW5kKCl9LiAgVGhlCitnZW5lcmF0ZWQgY29kZSByZWxpZXMgdXBvbiB0aGlzIGNhbGwgc2VxdWVuY2UgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyB3cml0dGVuIGJ5CithIHByb3RvY29sIGVuY29kZXIgY2FuIGJlIHJlYWQgYnkgYSBtYXRjaGluZyBwcm90b2NvbCBkZWNvZGVyLiBGdXJ0aGVyIG5vdGUKK3RoYXQgdGhpcyBzZXQgb2YgZnVuY3Rpb25zIGlzIGJ5IGRlc2lnbiBtb3JlIHJvYnVzdCB0aGFuIG5lY2Vzc2FyeS4KK0ZvciBleGFtcGxlLCBcdGV4dHR0e3dyaXRlU3RydWN0RW5kKCl9IGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGFzIHRoZSBlbmQgb2YKK2Egc3RydWN0IG1heSBiZSBpbXBsaWVkIGJ5IHRoZSBzdG9wIGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIGZvcgordmVyYm9zZSBwcm90b2NvbHMgaW4gd2hpY2ggaXQgaXMgY2xlYW5lciB0byBzZXBhcmF0ZSB0aGVzZSBjYWxscyAoZS5nLiBhIGNsb3NpbmcKK1x0ZXh0dHR7PC9zdHJ1Y3Q+fSB0YWcgaW4gWE1MKS4KKworXHN1YnNlY3Rpb257U3RydWN0dXJlfQorCitUaHJpZnQgc3RydWN0dXJlcyBhcmUgZGVzaWduZWQgdG8gc3VwcG9ydCBlbmNvZGluZyBpbnRvIGEgc3RyZWFtaW5nCitwcm90b2NvbC4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBuZXZlciBuZWVkIHRvIGZyYW1lIG9yIGNvbXB1dGUgdGhlCitlbnRpcmUgZGF0YSBsZW5ndGggb2YgYSBzdHJ1Y3R1cmUgcHJpb3IgdG8gZW5jb2RpbmcgaXQuIFRoaXMgaXMgY3JpdGljYWwgdG8KK3BlcmZvcm1hbmNlIGluIG1hbnkgc2NlbmFyaW9zLiBDb25zaWRlciBhIGxvbmcgbGlzdCBvZiByZWxhdGl2ZWx5IGxhcmdlCitzdHJpbmdzLiBJZiB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIHJlcXVpcmVkIHJlYWRpbmcgb3Igd3JpdGluZyBhIGxpc3QgdG8gYmUgYW4KK2F0b21pYyBvcGVyYXRpb24sIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIG5lZWQgdG8gcGVyZm9ybSBhIGxpbmVhciBwYXNzIG92ZXIgdGhlCitlbnRpcmUgbGlzdCBiZWZvcmUgZW5jb2RpbmcgYW55IGRhdGEuIEhvd2V2ZXIsIGlmIHRoZSBsaXN0IGNhbiBiZSB3cml0dGVuCithcyBpdGVyYXRpb24gaXMgcGVyZm9ybWVkLCB0aGUgY29ycmVzcG9uZGluZyByZWFkIG1heSBiZWdpbiBpbiBwYXJhbGxlbCwKK3RoZW9yZXRpY2FsbHkgb2ZmZXJpbmcgYW4gZW5kLXRvLWVuZCBzcGVlZHVwIG9mICQoa04gLSBDKSQsIHdoZXJlICROJCBpcyB0aGUgc2l6ZQorb2YgdGhlIGxpc3QsICRrJCB0aGUgY29zdCBmYWN0b3IgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nIGEgc2luZ2xlCitlbGVtZW50LCBhbmQgJEMkIGlzIGZpeGVkIG9mZnNldCBmb3IgdGhlIGRlbGF5IGJldHdlZW4gZGF0YSBiZWluZyB3cml0dGVuCithbmQgYmVjb21pbmcgYXZhaWxhYmxlIHRvIHJlYWQuCisKK1NpbWlsYXJseSwgc3RydWN0cyBkbyBub3QgZW5jb2RlIHRoZWlyIGRhdGEgbGVuZ3RocyBhIHByaW9yaS4gSW5zdGVhZCwgdGhleSBhcmUKK2VuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBmaWVsZHMsIHdpdGggZWFjaCBmaWVsZCBoYXZpbmcgYSB0eXBlIHNwZWNpZmllciBhbmQgYQordW5pcXVlIGZpZWxkIGlkZW50aWZpZXIuIE5vdGUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHR5cGUgc3BlY2lmaWVycyBhbGxvd3MKK3RoZSBwcm90b2NvbCB0byBiZSBzYWZlbHkgcGFyc2VkIGFuZCBkZWNvZGVkIHdpdGhvdXQgYW55IGdlbmVyYXRlZCBjb2RlCitvciBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIElETCBmaWxlLiBTdHJ1Y3RzIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgZmllbGQgaGVhZGVyCit3aXRoIGEgc3BlY2lhbCBcdGV4dHR0e1NUT1B9IHR5cGUuIEJlY2F1c2UgYWxsIHRoZSBiYXNpYyB0eXBlcyBjYW4gYmUgcmVhZAorZGV0ZXJtaW5pc3RpY2FsbHksIGFsbCBzdHJ1Y3RzIChldmVuIHRob3NlIGNvbnRhaW5pbmcgb3RoZXIgc3RydWN0cykgY2FuIGJlCityZWFkIGRldGVybWluaXN0aWNhbGx5LiBUaGUgVGhyaWZ0IHByb3RvY29sIGlzIHNlbGYtZGVsaW1pdGluZyB3aXRob3V0IGFueQorZnJhbWluZyBhbmQgcmVnYXJkbGVzcyBvZiB0aGUgZW5jb2RpbmcgZm9ybWF0LgorCitJbiBzaXR1YXRpb25zIHdoZXJlIHN0cmVhbWluZyBpcyB1bm5lY2Vzc2FyeSBvciBmcmFtaW5nIGlzIGFkdmFudGFnZW91cywgaXQKK2NhbiBiZSB2ZXJ5IHNpbXBseSBhZGRlZCBpbnRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIsIHVzaW5nIHRoZQorXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSBhYnN0cmFjdGlvbi4KKworXHN1YnNlY3Rpb257SW1wbGVtZW50YXRpb259CisKK0ZhY2Vib29rIGhhcyBpbXBsZW1lbnRlZCBhbmQgZGVwbG95ZWQgYSBzcGFjZS1lZmZpY2llbnQgYmluYXJ5IHByb3RvY29sIHdoaWNoCitpcyB1c2VkIGJ5IG1vc3QgYmFja2VuZCBzZXJ2aWNlcy4gRXNzZW50aWFsbHksIGl0IHdyaXRlcyBhbGwgZGF0YQoraW4gYSBmbGF0IGJpbmFyeSBmb3JtYXQuIEludGVnZXIgdHlwZXMgYXJlIGNvbnZlcnRlZCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIsCitzdHJpbmdzIGFyZSBwcmVwZW5kZWQgd2l0aCB0aGVpciBieXRlIGxlbmd0aCwgYW5kIGFsbCBtZXNzYWdlIGFuZCBmaWVsZCBoZWFkZXJzCithcmUgd3JpdHRlbiB1c2luZyB0aGUgcHJpbWl0aXZlIGludGVnZXIgc2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzLiBTdHJpbmcgbmFtZXMKK2ZvciBmaWVsZHMgYXJlIG9taXR0ZWQgLSB3aGVuIHVzaW5nIGdlbmVyYXRlZCBjb2RlLCBmaWVsZCBpZGVudGlmaWVycyBhcmUKK3N1ZmZpY2llbnQuCisKK1dlIGRlY2lkZWQgYWdhaW5zdCBzb21lIGV4dHJlbWUgc3RvcmFnZSBvcHRpbWl6YXRpb25zIChpLmUuIHBhY2tpbmcKK3NtYWxsIGludGVnZXJzIGludG8gQVNDSUkgb3IgdXNpbmcgYSA3LWJpdCBjb250aW51YXRpb24gZm9ybWF0KSBmb3IgdGhlIHNha2UKK29mIHNpbXBsaWNpdHkgYW5kIGNsYXJpdHkgaW4gdGhlIGNvZGUuIFRoZXNlIGFsdGVyYXRpb25zIGNhbiBlYXNpbHkgYmUgbWFkZQoraWYgYW5kIHdoZW4gd2UgZW5jb3VudGVyIGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgdXNlIGNhc2UgdGhhdCBkZW1hbmRzIHRoZW0uCisKK1xzZWN0aW9ue1ZlcnNpb25pbmd9CisKK1RocmlmdCBpcyByb2J1c3QgaW4gdGhlIGZhY2Ugb2YgdmVyc2lvbmluZyBhbmQgZGF0YSBkZWZpbml0aW9uIGNoYW5nZXMuIFRoaXMKK2lzIGNyaXRpY2FsIHRvIGVuYWJsZSBzdGFnZWQgcm9sbG91dHMgb2YgY2hhbmdlcyB0byBkZXBsb3llZCBzZXJ2aWNlcy4gVGhlCitzeXN0ZW0gbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgcmVhZGluZyBvZiBvbGQgZGF0YSBmcm9tIGxvZyBmaWxlcywgYXMgd2VsbCBhcworcmVxdWVzdHMgZnJvbSBvdXQtb2YtZGF0ZSBjbGllbnRzIHRvIG5ldyBzZXJ2ZXJzLCBhbmQgdmljZSB2ZXJzYS4KKworXHN1YnNlY3Rpb257RmllbGQgSWRlbnRpZmllcnN9CisKK1ZlcnNpb25pbmcgaW4gVGhyaWZ0IGlzIGltcGxlbWVudGVkIHZpYSBmaWVsZCBpZGVudGlmaWVycy4gVGhlIGZpZWxkIGhlYWRlcgorZm9yIGV2ZXJ5IG1lbWJlciBvZiBhIHN0cnVjdCBpbiBUaHJpZnQgaXMgZW5jb2RlZCB3aXRoIGEgdW5pcXVlIGZpZWxkCitpZGVudGlmaWVyLiBUaGUgY29tYmluYXRpb24gb2YgdGhpcyBmaWVsZCBpZGVudGlmaWVyIGFuZCBpdHMgdHlwZSBzcGVjaWZpZXIKK2lzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGZpZWxkLiBUaGUgVGhyaWZ0IGRlZmluaXRpb24gbGFuZ3VhZ2UKK3N1cHBvcnRzIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIGZpZWxkIGlkZW50aWZpZXJzLCBidXQgaXQgaXMgZ29vZAorcHJvZ3JhbW1pbmcgcHJhY3RpY2UgdG8gYWx3YXlzIGV4cGxpY2l0bHkgc3BlY2lmeSBmaWVsZCBpZGVudGlmaWVycy4KK0lkZW50aWZpZXJzIGFyZSBzcGVjaWZpZWQgYXMgZm9sbG93czoKKworXGJlZ2lue3ZlcmJhdGltfQorc3RydWN0IEV4YW1wbGUgeworICAxOmkzMiBudW1iZXI9MTAsCisgIDI6aTY0IGJpZ051bWJlciwKKyAgMzpkb3VibGUgZGVjaW1hbHMsCisgIDQ6c3RyaW5nIG5hbWU9InRocmlmdHkiCit9XGVuZHt2ZXJiYXRpbX0KKworVG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gbWFudWFsbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWRlbnRpZmllcnMsCitmaWVsZHMgd2l0aCBpZGVudGlmaWVycyBvbWl0dGVkIGFyZSBhc3NpZ25lZCBpZGVudGlmaWVycworZGVjcmVtZW50aW5nIGZyb20gLTEsIGFuZCB0aGUgbGFuZ3VhZ2Ugb25seSBzdXBwb3J0cyB0aGUgbWFudWFsIGFzc2lnbm1lbnQgb2YKK3Bvc2l0aXZlIGlkZW50aWZpZXJzLgorCitXaGVuIGRhdGEgaXMgYmVpbmcgZGVzZXJpYWxpemVkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIHVzZSB0aGVzZSBpZGVudGlmaWVycwordG8gcHJvcGVybHkgaWRlbnRpZnkgdGhlIGZpZWxkIGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBhbGlnbnMgd2l0aCBhIGZpZWxkIGluCitpdHMgZGVmaW5pdGlvbiBmaWxlLiBJZiBhIGZpZWxkIGlkZW50aWZpZXIgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBnZW5lcmF0ZWQKK2NvZGUgY2FuIHVzZSB0aGUgdHlwZSBzcGVjaWZpZXIgdG8gc2tpcCB0aGUgdW5rbm93biBmaWVsZCB3aXRob3V0IGFueSBlcnJvci4KK0FnYWluLCB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGFsbCBkYXRhdHlwZXMgYXJlIHNlbGYKK2RlbGltaXRpbmcuCisKK0ZpZWxkIGlkZW50aWZpZXJzIGNhbiAoYW5kIHNob3VsZCkgYWxzbyBiZSBzcGVjaWZpZWQgaW4gZnVuY3Rpb24gYXJndW1lbnQKK2xpc3RzLiBJbiBmYWN0LCBhcmd1bWVudCBsaXN0cyBhcmUgbm90IG9ubHkgcmVwcmVzZW50ZWQgYXMgc3RydWN0cyBvbiB0aGUKK2JhY2tlbmQsIGJ1dCBhY3R1YWxseSBzaGFyZSB0aGUgc2FtZSBjb2RlIGluIHRoZSBjb21waWxlciBmcm9udGVuZC4gVGhpcworYWxsb3dzIGZvciB2ZXJzaW9uLXNhZmUgbW9kaWZpY2F0aW9uIG9mIG1ldGhvZCBwYXJhbWV0ZXJzCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3NlcnZpY2UgU3RyaW5nQ2FjaGUgeworICB2b2lkIHNldCgxOmkzMiBrZXksIDI6c3RyaW5nIHZhbHVlKSwKKyAgc3RyaW5nIGdldCgxOmkzMiBrZXkpIHRocm93cyAoMTpLZXlOb3RGb3VuZCBrbmYpLAorICB2b2lkIGRlbGV0ZSgxOmkzMiBrZXkpCit9CitcZW5ke3ZlcmJhdGltfQorCitUaGUgc3ludGF4IGZvciBzcGVjaWZ5aW5nIGZpZWxkIGlkZW50aWZpZXJzIHdhcyBjaG9zZW4gdG8gZWNobyB0aGVpciBzdHJ1Y3R1cmUuCitTdHJ1Y3RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgZGljdGlvbmFyeSB3aGVyZSB0aGUgaWRlbnRpZmllcnMgYXJlIGtleXMsIGFuZAordGhlIHZhbHVlcyBhcmUgc3Ryb25nbHktdHlwZWQgbmFtZWQgZmllbGRzLgorCitGaWVsZCBpZGVudGlmaWVycyBpbnRlcm5hbGx5IHVzZSB0aGUgXHRleHR0dHtpMTZ9IFRocmlmdCB0eXBlLiBOb3RlLCBob3dldmVyLAordGhhdCB0aGUgXHRleHR0dHtUUHJvdG9jb2x9IGFic3RyYWN0aW9uIG1heSBlbmNvZGUgaWRlbnRpZmllcnMgaW4gYW55IGZvcm1hdC4KKworXHN1YnNlY3Rpb257SXNzZXR9CisKK1doZW4gYW4gdW5leHBlY3RlZCBmaWVsZCBpcyBlbmNvdW50ZXJlZCwgaXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIGFuZAorZGlzY2FyZGVkLiBXaGVuIGFuIGV4cGVjdGVkIGZpZWxkIGlzIG5vdCBmb3VuZCwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSB0bworc2lnbmFsIHRvIHRoZSBkZXZlbG9wZXIgdGhhdCBpdCB3YXMgbm90IHByZXNlbnQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdmlhIGFuCitpbm5lciBcdGV4dHR0e2lzc2V0fSBzdHJ1Y3R1cmUgaW5zaWRlIHRoZSBkZWZpbmVkIG9iamVjdHMuIChJc3NldCBmdW5jdGlvbmFsaXR5CitpcyBpbXBsaWNpdCB3aXRoIGEgXHRleHR0dHtudWxsfSB2YWx1ZSBpbiBQSFAsIFx0ZXh0dHR7Tm9uZX0gaW4gUHl0aG9uCithbmQgXHRleHR0dHtuaWx9IGluIFJ1YnkuKSBFc3NlbnRpYWxseSwKK3RoZSBpbm5lciBcdGV4dHR0e2lzc2V0fSBvYmplY3Qgb2YgZWFjaCBUaHJpZnQgc3RydWN0IGNvbnRhaW5zIGEgYm9vbGVhbiB2YWx1ZQorZm9yIGVhY2ggZmllbGQgd2hpY2ggZGVub3RlcyB3aGV0aGVyIG9yIG5vdCB0aGF0IGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlCitzdHJ1Y3QuIFdoZW4gYSByZWFkZXIgcmVjZWl2ZXMgYSBzdHJ1Y3QsIGl0IHNob3VsZCBjaGVjayBmb3IgYSBmaWVsZCBiZWluZyBzZXQKK2JlZm9yZSBvcGVyYXRpbmcgZGlyZWN0bHkgb24gaXQuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2NsYXNzIEV4YW1wbGUgeworIHB1YmxpYzoKKyAgRXhhbXBsZSgpIDoKKyAgICBudW1iZXIoMTApLAorICAgIGJpZ051bWJlcigwKSwKKyAgICBkZWNpbWFscygwKSwKKyAgICBuYW1lKCJ0aHJpZnR5Iikge30KKworICBpbnQzMl90IG51bWJlcjsKKyAgaW50NjRfdCBiaWdOdW1iZXI7CisgIGRvdWJsZSBkZWNpbWFsczsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKworICBzdHJ1Y3QgX19pc3NldCB7CisgICAgX19pc3NldCgpIDoKKyAgICAgIG51bWJlcihmYWxzZSksCisgICAgICBiaWdOdW1iZXIoZmFsc2UpLAorICAgICAgZGVjaW1hbHMoZmFsc2UpLAorICAgICAgbmFtZShmYWxzZSkge30KKyAgICBib29sIG51bWJlcjsKKyAgICBib29sIGJpZ051bWJlcjsKKyAgICBib29sIGRlY2ltYWxzOworICAgIGJvb2wgbmFtZTsKKyAgfSBfX2lzc2V0OworLi4uCit9CitcZW5ke3ZlcmJhdGltfQorCitcc3Vic2VjdGlvbntDYXNlIEFuYWx5c2lzfQorCitUaGVyZSBhcmUgZm91ciBjYXNlcyBpbiB3aGljaCB2ZXJzaW9uIG1pc21hdGNoZXMgbWF5IG9jY3VyLgorCitcYmVnaW57ZW51bWVyYXRlfQorXGl0ZW0gXHRleHRpdHtBZGRlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAorY2xpZW50IGRvZXMgbm90IHNlbmQgdGhlIG5ldyBmaWVsZC4gVGhlIG5ldyBzZXJ2ZXIgcmVjb2duaXplcyB0aGF0IHRoZSBmaWVsZAoraXMgbm90IHNldCwgYW5kIGltcGxlbWVudHMgZGVmYXVsdCBiZWhhdmlvciBmb3Igb3V0LW9mLWRhdGUgcmVxdWVzdHMuCitcaXRlbSBcdGV4dGl0e1JlbW92ZWQgZmllbGQsIG9sZCBjbGllbnQsIG5ldyBzZXJ2ZXIufSBJbiB0aGlzIGNhc2UsIHRoZSBvbGQKK2NsaWVudCBzZW5kcyB0aGUgcmVtb3ZlZCBmaWVsZC4gVGhlIG5ldyBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMgaXQuCitcaXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhlIG5ldyBjbGllbnQgc2VuZHMgYQorZmllbGQgdGhhdCB0aGUgb2xkIHNlcnZlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoZSBvbGQgc2VydmVyIHNpbXBseSBpZ25vcmVzCitpdCBhbmQgcHJvY2Vzc2VzIGFzIG5vcm1hbC4KK1xpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgbmV3IGNsaWVudCwgb2xkIHNlcnZlci59IFRoaXMgaXMgdGhlIG1vc3QKK2Rhbmdlcm91cyBjYXNlLCBhcyB0aGUgb2xkIHNlcnZlciBpcyB1bmxpa2VseSB0byBoYXZlIHN1aXRhYmxlIGRlZmF1bHQKK2JlaGF2aW9yIGltcGxlbWVudGVkIGZvciB0aGUgbWlzc2luZyBmaWVsZC4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbiB0aGlzCitzaXR1YXRpb24gdGhlIG5ldyBzZXJ2ZXIgYmUgcm9sbGVkIG91dCBwcmlvciB0byB0aGUgbmV3IGNsaWVudHMuCitcZW5ke2VudW1lcmF0ZX0KKworXHN1YnNlY3Rpb257UHJvdG9jb2wvVHJhbnNwb3J0IFZlcnNpb25pbmd9CitUaGUgXHRleHR0dHtUUHJvdG9jb2x9IGFic3RyYWN0aW9ucyBhcmUgYWxzbyBkZXNpZ25lZCB0byBnaXZlIHByb3RvY29sCitpbXBsZW1lbnRhdGlvbnMgdGhlIGZyZWVkb20gdG8gdmVyc2lvbiB0aGVtc2VsdmVzIGluIHdoYXRldmVyIG1hbm5lciB0aGV5CitzZWUgZml0LiBTcGVjaWZpY2FsbHksIGFueSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHNlbmQgd2hhdGV2ZXIKK2l0IGxpa2VzIGluIHRoZSBcdGV4dHR0e3dyaXRlTWVzc2FnZUJlZ2luKCl9IGNhbGwuIEl0IGlzIGVudGlyZWx5IHVwIHRvIHRoZQoraW1wbGVtZW50b3IgaG93IHRvIGhhbmRsZSB2ZXJzaW9uaW5nIGF0IHRoZSBwcm90b2NvbCBsZXZlbC4gVGhlIGtleSBwb2ludCBpcwordGhhdCBwcm90b2NvbCBlbmNvZGluZyBjaGFuZ2VzIGFyZSBzYWZlbHkgaXNvbGF0ZWQgZnJvbSBpbnRlcmZhY2UgZGVmaW5pdGlvbgordmVyc2lvbiBjaGFuZ2VzLgorCitOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgaXMgdHJ1ZSBvZiB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuIEZvcgorZXhhbXBsZSwgaWYgd2Ugd2lzaGVkIHRvIGFkZCBzb21lIG5ldyBjaGVja3N1bW1pbmcgb3IgZXJyb3IgZGV0ZWN0aW9uIHRvIHRoZQorXHRleHR0dHtURmlsZVRyYW5zcG9ydH0sIHdlIGNvdWxkIHNpbXBseSBhZGQgYSB2ZXJzaW9uIGhlYWRlciBpbnRvIHRoZQorZGF0YSBpdCB3cml0ZXMgdG8gdGhlIGZpbGUgaW4gc3VjaCBhIHdheSB0aGF0IGl0IHdvdWxkIHN0aWxsIGFjY2VwdCBvbGQKK2xvZyBmaWxlcyB3aXRob3V0IHRoZSBnaXZlbiBoZWFkZXIuCisKK1xzZWN0aW9ue1JQQyBJbXBsZW1lbnRhdGlvbn0KKworXHN1YnNlY3Rpb257VFByb2Nlc3Nvcn0KKworVGhlIGxhc3QgY29yZSBpbnRlcmZhY2UgaW4gdGhlIFRocmlmdCBkZXNpZ24gaXMgdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0sCitwZXJoYXBzIHRoZSBtb3N0IHNpbXBsZSBvZiB0aGUgY29uc3RydWN0cy4gVGhlIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgorCitcYmVnaW57dmVyYmF0aW19CitpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpCisgICAgdGhyb3dzIFRFeGNlcHRpb24KK30KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBrZXkgZGVzaWduIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBjb21wbGV4IHN5c3RlbXMgd2UgYnVpbGQgY2FuIGZ1bmRhbWVudGFsbHkKK2JlIGJyb2tlbiBkb3duIGludG8gYWdlbnRzIG9yIHNlcnZpY2VzIHRoYXQgb3BlcmF0ZSBvbiBpbnB1dHMgYW5kIG91dHB1dHMuIEluCittb3N0IGNhc2VzLCB0aGVyZSBpcyBhY3R1YWxseSBqdXN0IG9uZSBpbnB1dCBhbmQgb3V0cHV0IChhbiBSUEMgY2xpZW50KSB0aGF0CituZWVkcyBoYW5kbGluZy4KKworXHN1YnNlY3Rpb257R2VuZXJhdGVkIENvZGV9CisKK1doZW4gYSBzZXJ2aWNlIGlzIGRlZmluZWQsIHdlIGdlbmVyYXRlIGEKK1x0ZXh0dHR7VFByb2Nlc3Nvcn0gaW5zdGFuY2UgY2FwYWJsZSBvZiBoYW5kbGluZyBSUEMgcmVxdWVzdHMgdG8gdGhhdCBzZXJ2aWNlLAordXNpbmcgYSBmZXcgaGVscGVycy4gVGhlIGZ1bmRhbWVudGFsIHN0cnVjdHVyZSAoaWxsdXN0cmF0ZWQgaW4gcHNldWRvLUMrKykgaXMKK2FzIGZvbGxvd3M6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK1NlcnZpY2UudGhyaWZ0CisgPT4gU2VydmljZS5jcHAKKyAgICAgaW50ZXJmYWNlIFNlcnZpY2VJZgorICAgICBjbGFzcyBTZXJ2aWNlQ2xpZW50IDogdmlydHVhbCBTZXJ2aWNlSWYKKyAgICAgICBUUHJvdG9jb2wgaW4KKyAgICAgICBUUHJvdG9jb2wgb3V0CisgICAgIGNsYXNzIFNlcnZpY2VQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCisgICAgICAgU2VydmljZUlmIGhhbmRsZXIKKworU2VydmljZUhhbmRsZXIuY3BwCisgY2xhc3MgU2VydmljZUhhbmRsZXIgOiB2aXJ0dWFsIFNlcnZpY2VJZgorCitUU2VydmVyLmNwcAorIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRmYWN0b3J5LAorICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwZmFjdG9yeSkKKyBzZXJ2ZSgpCitcZW5ke3ZlcmJhdGltfQorCitGcm9tIHRoZSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlLCB3ZSBnZW5lcmF0ZSB0aGUgdmlydHVhbCBzZXJ2aWNlIGludGVyZmFjZS4KK0EgY2xpZW50IGNsYXNzIGlzIGdlbmVyYXRlZCwgd2hpY2ggaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGFuZAordXNlcyB0d28gXHRleHR0dHtUUHJvdG9jb2x9IGluc3RhbmNlcyB0byBwZXJmb3JtIHRoZSBJL08gb3BlcmF0aW9ucy4gVGhlCitnZW5lcmF0ZWQgcHJvY2Vzc29yIGltcGxlbWVudHMgdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlLiBUaGUgZ2VuZXJhdGVkCitjb2RlIGhhcyBhbGwgdGhlIGxvZ2ljIHRvIGhhbmRsZSBSUEMgaW52b2NhdGlvbnMgdmlhIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0KK2NhbGwsIGFuZCB0YWtlcyBhcyBhIHBhcmFtZXRlciBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBpbnRlcmZhY2UsIGFzCitpbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyLgorCitUaGUgdXNlciBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGluIHNlcGFyYXRlLAorbm9uLWdlbmVyYXRlZCBzb3VyY2UgY29kZS4KKworXHN1YnNlY3Rpb257VFNlcnZlcn0KKworRmluYWxseSwgdGhlIFRocmlmdCBjb3JlIGxpYnJhcmllcyBwcm92aWRlIGEgXHRleHR0dHtUU2VydmVyfSBhYnN0cmFjdGlvbi4KK1RoZSBcdGV4dHR0e1RTZXJ2ZXJ9IG9iamVjdCBnZW5lcmFsbHkgd29ya3MgYXMgZm9sbG93cy4KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFNlcnZlclRyYW5zcG9ydH0gdG8gZ2V0IGEgXHRleHR0dHtUVHJhbnNwb3J0fQorXGl0ZW0gVXNlIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnRGYWN0b3J5fSB0byBvcHRpb25hbGx5IGNvbnZlcnQgdGhlIHByaW1pdGl2ZQordHJhbnNwb3J0IGludG8gYSBzdWl0YWJsZSBhcHBsaWNhdGlvbiB0cmFuc3BvcnQgKHR5cGljYWxseSB0aGUKK1x0ZXh0dHR7VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeX0gaXMgdXNlZCBoZXJlKQorXGl0ZW0gVXNlIHRoZSBcdGV4dHR0e1RQcm90b2NvbEZhY3Rvcnl9IHRvIGNyZWF0ZSBhbiBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sCitmb3IgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydH0KK1xpdGVtIEludm9rZSB0aGUgXHRleHR0dHtwcm9jZXNzKCl9IG1ldGhvZCBvZiB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBvYmplY3QKK1xlbmR7aXRlbWl6ZX0KKworVGhlIGxheWVycyBhcmUgYXBwcm9wcmlhdGVseSBzZXBhcmF0ZWQgc3VjaCB0aGF0IHRoZSBzZXJ2ZXIgY29kZSBuZWVkcyB0byBrbm93Citub3RoaW5nIGFib3V0IGFueSBvZiB0aGUgdHJhbnNwb3J0cywgZW5jb2RpbmdzLCBvciBhcHBsaWNhdGlvbnMgaW4gcGxheS4gVGhlCitzZXJ2ZXIgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBhcm91bmQgY29ubmVjdGlvbiBoYW5kbGluZywgdGhyZWFkaW5nLCBldGMuCit3aGlsZSB0aGUgcHJvY2Vzc29yIGRlYWxzIHdpdGggUlBDLiBUaGUgb25seSBjb2RlIHdyaXR0ZW4gYnkgdGhlIGFwcGxpY2F0aW9uCitkZXZlbG9wZXIgbGl2ZXMgaW4gdGhlIGRlZmluaXRpb25hbCBUaHJpZnQgZmlsZSBhbmQgdGhlIGludGVyZmFjZQoraW1wbGVtZW50YXRpb24uCisKK0ZhY2Vib29rIGhhcyBkZXBsb3llZCBtdWx0aXBsZSBcdGV4dHR0e1RTZXJ2ZXJ9IGltcGxlbWVudGF0aW9ucywgaW5jbHVkaW5nCit0aGUgc2luZ2xlLXRocmVhZGVkIFx0ZXh0dHR7VFNpbXBsZVNlcnZlcn0sIHRocmVhZC1wZXItY29ubmVjdGlvbgorXHRleHR0dHtUVGhyZWFkZWRTZXJ2ZXJ9LCBhbmQgdGhyZWFkLXBvb2xpbmcgXHRleHR0dHtUVGhyZWFkUG9vbFNlcnZlcn0uCisKK1RoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IGludGVyZmFjZSBpcyB2ZXJ5IGdlbmVyYWwgYnkgZGVzaWduLiBUaGVyZSBpcyBubworcmVxdWlyZW1lbnQgdGhhdCBhIFx0ZXh0dHR7VFNlcnZlcn0gdGFrZSBhIGdlbmVyYXRlZCBcdGV4dHR0e1RQcm9jZXNzb3J9CitvYmplY3QuIFRocmlmdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB0byBlYXNpbHkgd3JpdGUgYW55IHR5cGUgb2YKK3NlcnZlciB0aGF0IG9wZXJhdGVzIG9uIFx0ZXh0dHR7VFByb3RvY29sfSBvYmplY3RzIChmb3IgaW5zdGFuY2UsIGEgc2VydmVyCitjb3VsZCBzaW1wbHkgc3RyZWFtIGEgY2VydGFpbiB0eXBlIG9mIG9iamVjdCB3aXRob3V0IGFueSBhY3R1YWwgUlBDIG1ldGhvZAoraW52b2NhdGlvbikuCisKK1xzZWN0aW9ue0ltcGxlbWVudGF0aW9uIERldGFpbHN9Citcc3Vic2VjdGlvbntUYXJnZXQgTGFuZ3VhZ2VzfQorVGhyaWZ0IGN1cnJlbnRseSBzdXBwb3J0cyBmaXZlIHRhcmdldCBsYW5ndWFnZXM6IEMrKywgSmF2YSwgUHl0aG9uLCBSdWJ5LCBhbmQKK1BIUC4gQXQgRmFjZWJvb2ssIHdlIGhhdmUgZGVwbG95ZWQgc2VydmVycyBwcmVkb21pbmFudGx5IGluIEMrKywgSmF2YSwgYW5kCitQeXRob24uIFRocmlmdCBzZXJ2aWNlcyBpbXBsZW1lbnRlZCBpbiBQSFAgaGF2ZSBhbHNvIGJlZW4gZW1iZWRkZWQgaW50byB0aGUKK0FwYWNoZSB3ZWIgc2VydmVyLCBwcm92aWRpbmcgdHJhbnNwYXJlbnQgYmFja2VuZCBhY2Nlc3MgdG8gbWFueSBvZiBvdXIKK2Zyb250ZW5kIGNvbnN0cnVjdHMgdXNpbmcgYSBcdGV4dHR0e1RIdHRwQ2xpZW50fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK1x0ZXh0dHR7VFRyYW5zcG9ydH0gaW50ZXJmYWNlLgorCitUaG91Z2ggVGhyaWZ0IHdhcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgYW5kIHJvYnVzdAordGhhbiB0eXBpY2FsIHdlYiB0ZWNobm9sb2dpZXMsIGFzIHdlIHdlcmUgZGVzaWduaW5nIG91ciBYTUwtYmFzZWQgUkVTVCB3ZWIKK3NlcnZpY2VzIEFQSSB3ZSBub3RpY2VkIHRoYXQgVGhyaWZ0IGNvdWxkIGJlIGVhc2lseSB1c2VkIHRvIGRlZmluZSBvdXIKK3NlcnZpY2UgaW50ZXJmYWNlLiBUaG91Z2ggd2UgZG8gbm90IGN1cnJlbnRseSBlbXBsb3kgU09BUCBlbnZlbG9wZXMgKGluIHRoZQorYXV0aG9ycycgb3BpbmlvbnMgdGhlcmUgaXMgYWxyZWFkeSBmYXIgdG9vIG11Y2ggcmVwZXRpdGl2ZSBlbnRlcnByaXNlIEphdmEKK3NvZnR3YXJlIHRvIGRvIHRoYXQgc29ydCBvZiB0aGluZyksIHdlIHdlcmUgYWJsZSB0byBxdWlja2x5IGV4dGVuZCBUaHJpZnQgdG8KK2dlbmVyYXRlIFhNTCBTY2hlbWEgRGVmaW5pdGlvbiBmaWxlcyBmb3Igb3VyIHNlcnZpY2UsIGFzIHdlbGwgYXMgYSBmcmFtZXdvcmsKK2ZvciB2ZXJzaW9uaW5nIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2Ygb3VyIHdlYiBzZXJ2aWNlLiBUaG91Z2ggcHVibGljCit3ZWIgc2VydmljZXMgYXJlIGFkbWl0dGVkbHkgdGFuZ2VudGlhbCB0byBUaHJpZnQncyBjb3JlIHVzZSBjYXNlIGFuZCBkZXNpZ24sCitUaHJpZnQgZmFjaWxpdGF0ZWQgcmFwaWQgaXRlcmF0aW9uIGFuZCBhZmZvcmRzIHVzIHRoZSBhYmlsaXR5IHRvIHF1aWNrbHkKK21pZ3JhdGUgb3VyIGVudGlyZSBYTUwtYmFzZWQgd2ViIHNlcnZpY2Ugb250byBhIGhpZ2hlciBwZXJmb3JtYW5jZSBzeXN0ZW0KK3Nob3VsZCB0aGUgbmVlZCBhcmlzZS4KKworXHN1YnNlY3Rpb257R2VuZXJhdGVkIFN0cnVjdHN9CitXZSBtYWRlIGEgY29uc2Npb3VzIGRlY2lzaW9uIHRvIG1ha2Ugb3VyIGdlbmVyYXRlZCBzdHJ1Y3RzIGFzIHRyYW5zcGFyZW50IGFzCitwb3NzaWJsZS4gQWxsIGZpZWxkcyBhcmUgcHVibGljbHkgYWNjZXNzaWJsZTsgdGhlcmUgYXJlIG5vIFx0ZXh0dHR7c2V0KCl9IGFuZAorXHRleHR0dHtnZXQoKX0gbWV0aG9kcy4gU2ltaWxhcmx5LCB1c2Ugb2YgdGhlIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBpcyBub3QKK2VuZm9yY2VkLiBXZSBkbyBub3QgaW5jbHVkZSBhbnkgXHRleHR0dHtGaWVsZE5vdFNldEV4Y2VwdGlvbn0gY29uc3RydWN0LgorRGV2ZWxvcGVycyBoYXZlIHRoZSBvcHRpb24gdG8gdXNlIHRoZXNlIGZpZWxkcyB0byB3cml0ZSBtb3JlIHJvYnVzdCBjb2RlLCBidXQKK3RoZSBzeXN0ZW0gaXMgcm9idXN0IHRvIHRoZSBkZXZlbG9wZXIgaWdub3JpbmcgdGhlIFx0ZXh0dHR7aXNzZXR9IGNvbnN0cnVjdAorZW50aXJlbHkgYW5kIHdpbGwgcHJvdmlkZSBzdWl0YWJsZSBkZWZhdWx0IGJlaGF2aW9yIGluIGFsbCBjYXNlcy4KKworVGhpcyBjaG9pY2Ugd2FzIG1vdGl2YXRlZCBieSB0aGUgZGVzaXJlIHRvIGVhc2UgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuIE91ciBzdGF0ZWQKK2dvYWwgaXMgbm90IHRvIG1ha2UgZGV2ZWxvcGVycyBsZWFybiBhIHJpY2ggbmV3IGxpYnJhcnkgaW4gdGhlaXIgbGFuZ3VhZ2Ugb2YKK2Nob2ljZSwgYnV0IHJhdGhlciB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgYWxsb3cgdGhlbSB0byB3b3JrIHdpdGggdGhlIGNvbnN0cnVjdHMKK3RoYXQgYXJlIG1vc3QgZmFtaWxpYXIgaW4gZWFjaCBsYW5ndWFnZS4KKworV2UgYWxzbyBtYWRlIHRoZSBcdGV4dHR0e3JlYWQoKX0gYW5kIFx0ZXh0dHR7d3JpdGUoKX0gbWV0aG9kcyBvZiB0aGUgZ2VuZXJhdGVkCitvYmplY3RzIHB1YmxpYyBzbyB0aGF0IHRoZSBvYmplY3RzIGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQKK29mIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaHJpZnQgaXMgYSB1c2VmdWwgdG9vbCBzaW1wbHkgZm9yIGdlbmVyYXRpbmcKK29iamVjdHMgdGhhdCBhcmUgZWFzaWx5IHNlcmlhbGl6YWJsZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorCitcc3Vic2VjdGlvbntSUEMgTWV0aG9kIElkZW50aWZpY2F0aW9ufQorTWV0aG9kIGNhbGxzIGluIFJQQyBhcmUgaW1wbGVtZW50ZWQgYnkgc2VuZGluZyB0aGUgbWV0aG9kIG5hbWUgYXMgYSBzdHJpbmcuIE9uZQoraXNzdWUgd2l0aCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgbG9uZ2VyIG1ldGhvZCBuYW1lcyByZXF1aXJlIG1vcmUgYmFuZHdpZHRoLgorV2UgZXhwZXJpbWVudGVkIHdpdGggdXNpbmcgZml4ZWQtc2l6ZSBoYXNoZXMgdG8gaWRlbnRpZnkgbWV0aG9kcywgYnV0IGluIHRoZQorZW5kIGNvbmNsdWRlZCB0aGF0IHRoZSBzYXZpbmdzIHdlcmUgbm90IHdvcnRoIHRoZSBoZWFkYWNoZXMgaW5jdXJyZWQuIFJlbGlhYmx5CitkZWFsaW5nIHdpdGggY29uZmxpY3RzIGFjcm9zcyB2ZXJzaW9ucyBvZiBhbiBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlIGlzCitpbXBvc3NpYmxlIHdpdGhvdXQgYSBtZXRhLXN0b3JhZ2Ugc3lzdGVtIChpLmUuIHRvIGdlbmVyYXRlIG5vbi1jb25mbGljdGluZworaGFzaGVzIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGEgZmlsZSwgd2Ugd291bGQgaGF2ZSB0byBrbm93IGFib3V0IGFsbAorY29uZmxpY3RzIHRoYXQgZXZlciBleGlzdGVkIGluIGFueSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmaWxlKS4KKworV2Ugd2FudGVkIHRvIGF2b2lkIHRvbyBtYW55IHVubmVjZXNzYXJ5IHN0cmluZyBjb21wYXJpc29ucyB1cG9uCittZXRob2QgaW52b2NhdGlvbi4gVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGdlbmVyYXRlIG1hcHMgZnJvbSBzdHJpbmdzIHRvIGZ1bmN0aW9uCitwb2ludGVycywgc28gdGhhdCBpbnZvY2F0aW9uIGlzIGVmZmVjdGl2ZWx5IGFjY29tcGxpc2hlZCB2aWEgYSBjb25zdGFudC10aW1lCitoYXNoIGxvb2t1cCBpbiB0aGUgY29tbW9uIGNhc2UuIFRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNvdXBsZSBpbnRlcmVzdGluZworY29kZSBjb25zdHJ1Y3RzLiBCZWNhdXNlIEphdmEgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBwb2ludGVycywgcHJvY2VzcworZnVuY3Rpb25zIGFyZSBhbGwgcHJpdmF0ZSBtZW1iZXIgY2xhc3NlcyBpbXBsZW1lbnRpbmcgYSBjb21tb24gaW50ZXJmYWNlLgorCitcYmVnaW57dmVyYmF0aW19Citwcml2YXRlIGNsYXNzIHBpbmcgaW1wbGVtZW50cyBQcm9jZXNzRnVuY3Rpb24geworICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sIG9wcm90KQorICAgIHRocm93cyBURXhjZXB0aW9uCisgIHsgLi4ufQorfQorCitIYXNoTWFwPFN0cmluZyxQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0KKyAgbmV3IEhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4oKTsKK1xlbmR7dmVyYmF0aW19CisKK0luIEMrKywgd2UgdXNlIGEgcmVsYXRpdmVseSBlc290ZXJpYyBsYW5ndWFnZSBjb25zdHJ1Y3Q6IG1lbWJlciBmdW5jdGlvbgorcG9pbnRlcnMuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3N0ZDo6bWFwPHN0ZDo6c3RyaW5nLAorICB2b2lkIChFeGFtcGxlU2VydmljZVByb2Nlc3Nvcjo6KikoaW50MzJfdCwKKyAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosCisgIGZhY2Vib29rOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqKT4KKyBwcm9jZXNzTWFwXzsKK1xlbmR7dmVyYmF0aW19CisKK1VzaW5nIHRoZXNlIHRlY2huaXF1ZXMsIHRoZSBjb3N0IG9mIHN0cmluZyBwcm9jZXNzaW5nIGlzIG1pbmltaXplZCwgYW5kIHdlCityZWFwIHRoZSBiZW5lZml0IG9mIGJlaW5nIGFibGUgdG8gZWFzaWx5IGRlYnVnIGNvcnJ1cHQgb3IgbWlzdW5kZXJzdG9vZCBkYXRhIGJ5CitpbnNwZWN0aW5nIGl0IGZvciBrbm93biBzdHJpbmcgbWV0aG9kIG5hbWVzLgorCitcc3Vic2VjdGlvbntTZXJ2ZXJzIGFuZCBNdWx0aXRocmVhZGluZ30KK1RocmlmdCBzZXJ2aWNlcyByZXF1aXJlIGJhc2ljIG11bHRpdGhyZWFkaW5nIHRvIGhhbmRsZSBzaW11bHRhbmVvdXMKK3JlcXVlc3RzIGZyb20gbXVsdGlwbGUgY2xpZW50cy4gRm9yIHRoZSBQeXRob24gYW5kIEphdmEgaW1wbGVtZW50YXRpb25zIG9mCitUaHJpZnQgc2VydmVyIGxvZ2ljLCB0aGUgc3RhbmRhcmQgdGhyZWFkaW5nIGxpYnJhcmllcyBkaXN0cmlidXRlZCB3aXRoIHRoZQorbGFuZ3VhZ2VzIHByb3ZpZGUgYWRlcXVhdGUgc3VwcG9ydC4gRm9yIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIG5vIHN0YW5kYXJkIG11bHRpdGhyZWFkIHJ1bnRpbWUKK2xpYnJhcnkgZXhpc3RzLiBTcGVjaWZpY2FsbHksIHJvYnVzdCwgbGlnaHR3ZWlnaHQsIGFuZCBwb3J0YWJsZQordGhyZWFkIG1hbmFnZXIgYW5kIHRpbWVyIGNsYXNzIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZXhpc3QuIFdlIGludmVzdGlnYXRlZAorZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zLCBuYW1lbHkgXHRleHR0dHtib29zdDo6dGhyZWFkfSwKK1x0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9LCBcdGV4dHR0e0FDRVxfVGhyZWFkXF9NYW5hZ2VyfSBhbmQKK1x0ZXh0dHR7QUNFXF9UaW1lcn0uCisKK1doaWxlIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHN9XGNpdGV7Ym9vc3QudGhyZWFkc30gIHByb3ZpZGVzIGNsZWFuLAorbGlnaHR3ZWlnaHQgYW5kIHJvYnVzdCBpbXBsZW1lbnRhdGlvbnMgb2YgbXVsdGktdGhyZWFkIHByaW1pdGl2ZXMgKG11dGV4ZXMsCitjb25kaXRpb25zLCB0aHJlYWRzKSBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdGhyZWFkIG1hbmFnZXIgb3IgdGltZXIKK2ltcGxlbWVudGF0aW9uLgorCitcdGV4dHR0e2Jvb3N0Ojp0aHJlYWRwb29sfVxjaXRle2Jvb3N0LnRocmVhZHBvb2x9IGFsc28gbG9va2VkIHByb21pc2luZyBidXQKK3dhcyBub3QgZmFyIGVub3VnaCBhbG9uZyBmb3Igb3VyIHB1cnBvc2VzLiBXZSB3YW50ZWQgdG8gbGltaXQgdGhlIGRlcGVuZGVuY3kgb24KK3RoaXJkLXBhcnR5IGxpYnJhcmllcyBhcyBtdWNoIGFzIHBvc3NpYmxlLiBCZWNhdXNlXFwKK1x0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGlzCitub3QgYSBwdXJlIHRlbXBsYXRlIGxpYnJhcnkgYW5kIHJlcXVpcmVzIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBiZWNhdXNlIGl0IGlzCitub3QgeWV0IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJvb3N0IGRpc3RyaWJ1dGlvbiB3ZSBmZWx0IGl0IHdhcyBub3QgcmVhZHkgZm9yCit1c2UgaW4gVGhyaWZ0LiBBcyBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWRwb29sfSBldm9sdmVzIGFuZCBlc3BlY2lhbGx5IGlmIGl0IGlzCithZGRlZCB0byB0aGUgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIG1heSByZWNvbnNpZGVyIG91ciBkZWNpc2lvbiB0byBub3QgdXNlIGl0LgorCitBQ0UgaGFzIGJvdGggYSB0aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW4gYWRkaXRpb24gdG8gbXVsdGktdGhyZWFkCitwcmltaXRpdmVzLiBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdpdGggQUNFIGlzIHRoYXQgaXQgaXMgQUNFLiBVbmxpa2UgQm9vc3QsIEFDRQorQVBJIHF1YWxpdHkgaXMgcG9vci4gRXZlcnl0aGluZyBpbiBBQ0UgaGFzIGxhcmdlIG51bWJlcnMgb2YgZGVwZW5kZW5jaWVzIG9uCitldmVyeXRoaW5nIGVsc2UgaW4gQUNFIC0gdGh1cyBmb3JjaW5nIGRldmVsb3BlcnMgdG8gdGhyb3cgb3V0IHN0YW5kYXJkCitjbGFzc2VzLCBzdWNoIGFzIFNUTCBjb2xsZWN0aW9ucywgaW4gZmF2b3Igb2YgQUNFJ3MgaG9tZWJyZXdlZCBpbXBsZW1lbnRhdGlvbnMuIEluCithZGRpdGlvbiwgdW5saWtlIEJvb3N0LCBBQ0UgaW1wbGVtZW50YXRpb25zIGRlbW9uc3RyYXRlIGxpdHRsZSB1bmRlcnN0YW5kaW5nCitvZiB0aGUgcG93ZXIgYW5kIHBpdGZhbGxzIG9mIEMrKyBwcm9ncmFtbWluZyBhbmQgdGFrZSBubyBhZHZhbnRhZ2Ugb2YgbW9kZXJuCit0ZW1wbGF0aW5nIHRlY2huaXF1ZXMgdG8gZW5zdXJlIGNvbXBpbGUgdGltZSBzYWZldHkgYW5kIHJlYXNvbmFibGUgY29tcGlsZXIKK2Vycm9yIG1lc3NhZ2VzLiBGb3IgYWxsIHRoZXNlIHJlYXNvbnMsIEFDRSB3YXMgcmVqZWN0ZWQuIEluc3RlYWQsIHdlIGNob3NlCit0byBpbXBsZW1lbnQgb3VyIG93biBsaWJyYXJ5LCBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKworXHN1YnNlY3Rpb257VGhyZWFkIFByaW1pdGl2ZXN9CisKK1RoZSBUaHJpZnQgdGhyZWFkIGxpYnJhcmllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIG5hbWVzcGFjZVxcCitcdGV4dHR0e2ZhY2Vib29rOjp0aHJpZnQ6OmNvbmN1cnJlbmN5fSBhbmQgaGF2ZSB0aHJlZSBjb21wb25lbnRzOgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBwcmltaXRpdmVzCitcaXRlbSB0aHJlYWQgcG9vbCBtYW5hZ2VyCitcaXRlbSB0aW1lciBtYW5hZ2VyCitcZW5ke2l0ZW1pemV9CisKK0FzIG1lbnRpb25lZCBhYm92ZSwgd2Ugd2VyZSBoZXNpdGFudCB0byBpbnRyb2R1Y2UgYW55IGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCitvbiBUaHJpZnQuIFdlIGRlY2lkZWQgdG8gdXNlIFx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSBiZWNhdXNlIGl0IGlzIHNvCit1c2VmdWwgZm9yIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb24sIGl0IHJlcXVpcmVzIG5vIGxpbmstdGltZSBvcgorcnVudGltZSBsaWJyYXJpZXMgKGkuZS4gaXQgaXMgYSBwdXJlIHRlbXBsYXRlIGxpYnJhcnkpIGFuZCBpdCBpcyBkdWUKK3RvIGJlY29tZSBwYXJ0IG9mIHRoZSBDKysweCBzdGFuZGFyZC4KKworV2UgaW1wbGVtZW50IHN0YW5kYXJkIFx0ZXh0dHR7TXV0ZXh9IGFuZCBcdGV4dHR0e0NvbmRpdGlvbn0gY2xhc3NlcywgYW5kIGEKKyBcdGV4dHR0e01vbml0b3J9IGNsYXNzLiBUaGUgbGF0dGVyIGlzIHNpbXBseSBhIGNvbWJpbmF0aW9uIG9mIGEgbXV0ZXggYW5kCitjb25kaXRpb24gdmFyaWFibGUgYW5kIGlzIGFuYWxvZ291cyB0byB0aGUgXHRleHR0dHtNb25pdG9yfSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBmb3IKK3RoZSBKYXZhIFx0ZXh0dHR7T2JqZWN0fSBjbGFzcy4gVGhpcyBpcyBhbHNvIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIGJhcnJpZXIuIFdlCitwcm92aWRlIGEgXHRleHR0dHtTeW5jaHJvbml6ZWR9IGd1YXJkIGNsYXNzIHRvIGFsbG93IEphdmEtbGlrZSBzeW5jaHJvbml6ZWQgYmxvY2tzLgorVGhpcyBpcyBqdXN0IGEgYml0IG9mIHN5bnRhY3RpYyBzdWdhciwgYnV0LCBsaWtlIGl0cyBKYXZhIGNvdW50ZXJwYXJ0LCBjbGVhcmx5CitkZWxpbWl0cyBjcml0aWNhbCBzZWN0aW9ucyBvZiBjb2RlLiBVbmxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIHdlIHN0aWxsCitoYXZlIHRoZSBhYmlsaXR5IHRvIHByb2dyYW1tYXRpY2FsbHkgbG9jaywgdW5sb2NrLCBibG9jaywgYW5kIHNpZ25hbCBtb25pdG9ycy4KKworXGJlZ2lue3ZlcmJhdGltfQordm9pZCBydW4oKSB7Cisge1N5bmNocm9uaXplZCBzKG1hbmFnZXItPm1vbml0b3IpOworICBpZiAobWFuYWdlci0+c3RhdGUgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgeworICAgIG1hbmFnZXItPnN0YXRlID0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEOworICAgIG1hbmFnZXItPm1vbml0b3Iubm90aWZ5QWxsKCk7CisgIH0KKyB9Cit9CitcZW5ke3ZlcmJhdGltfQorCitXZSBhZ2FpbiBib3Jyb3dlZCBmcm9tIEphdmEgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gYSB0aHJlYWQgYW5kIGEgcnVubmFibGUKK2NsYXNzLiBBIFx0ZXh0dHR7VGhyZWFkfSBpcyB0aGUgYWN0dWFsIHNjaGVkdWxhYmxlIG9iamVjdC4gVGhlCitcdGV4dHR0e1J1bm5hYmxlfSBpcyB0aGUgbG9naWMgdG8gZXhlY3V0ZSB3aXRoaW4gdGhlIHRocmVhZC4KK1RoZSBcdGV4dHR0e1RocmVhZH0gaW1wbGVtZW50YXRpb24gZGVhbHMgd2l0aCBhbGwgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHRocmVhZAorY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGlzc3Vlcywgd2hpbGUgdGhlIFx0ZXh0dHR7UnVubmFibGV9IGltcGxlbWVudGF0aW9uIGRlYWxzCit3aXRoIHRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBwZXItdGhyZWFkIGxvZ2ljLiBUaGUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoCitpcyB0aGF0IGRldmVsb3BlcnMgY2FuIGVhc2lseSBzdWJjbGFzcyB0aGUgUnVubmFibGUgY2xhc3Mgd2l0aG91dCBwdWxsaW5nIGluCitwbGF0Zm9ybS1zcGVjaWZpYyBzdXBlci1jbGFzc2VzLgorCitcc3Vic2VjdGlvbntUaHJlYWQsIFJ1bm5hYmxlLCBhbmQgc2hhcmVkXF9wdHJ9CitXZSB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHRocm91Z2hvdXQgdGhlIFx0ZXh0dHR7VGhyZWFkTWFuYWdlcn0gYW5kCitcdGV4dHR0e1RpbWVyTWFuYWdlcn0gaW1wbGVtZW50YXRpb25zIHRvIGd1YXJhbnRlZSBjbGVhbnVwIG9mIGRlYWQgb2JqZWN0cyB0aGF0IGNhbgorYmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gRm9yIFx0ZXh0dHR7VGhyZWFkfSBjbGFzcyBpbXBsZW1lbnRhdGlvbnMsCitcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdXNhZ2UgcmVxdWlyZXMgcGFydGljdWxhciBhdHRlbnRpb24gdG8gbWFrZSBzdXJlCitcdGV4dHR0e1RocmVhZH0gb2JqZWN0cyBhcmUgbmVpdGhlciBsZWFrZWQgbm9yIGRlcmVmZXJlbmNlZCBwcmVtYXR1cmVseSB3aGlsZQorY3JlYXRpbmcgYW5kIHNodXR0aW5nIGRvd24gdGhyZWFkcy4KKworVGhyZWFkIGNyZWF0aW9uIHJlcXVpcmVzIGNhbGxpbmcgaW50byBhIEMgbGlicmFyeS4gKEluIG91ciBjYXNlIHRoZSBQT1NJWAordGhyZWFkIGxpYnJhcnksIFx0ZXh0dHR7bGlicHRocmVhZH0sIGJ1dCB0aGUgc2FtZSB3b3VsZCBiZSB0cnVlIGZvciBXSU4zMiB0aHJlYWRzKS4KK1R5cGljYWxseSwgdGhlIE9TIG1ha2VzIGZldywgaWYgYW55LCBndWFyYW50ZWVzIGFib3V0IHdoZW4gXHRleHR0dHtUaHJlYWRNYWlufSwgYSBDIHRocmVhZCdzIGVudHJ5LXBvaW50IGZ1bmN0aW9uLCB3aWxsIGJlIGNhbGxlZC4gVGhlcmVmb3JlLCBpdCBpcworcG9zc2libGUgdGhhdCBvdXIgdGhyZWFkIGNyZWF0ZSBjYWxsLAorXHRleHR0dHtUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoKX0gY291bGQgcmV0dXJuIHRvIHRoZSBjYWxsZXIKK3dlbGwgYmVmb3JlIHRoYXQgdGltZS4gVG8gZW5zdXJlIHRoYXQgdGhlIHJldHVybmVkIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgaXMgbm90CitwcmVtYXR1cmVseSBjbGVhbmVkIHVwIGlmIHRoZSBjYWxsZXIgZ2l2ZXMgdXAgaXRzIHJlZmVyZW5jZSBwcmlvciB0byB0aGUKK1x0ZXh0dHR7VGhyZWFkTWFpbn0gY2FsbCwgdGhlIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgbWFrZXMgYSB3ZWFrIHJlZmVyZW5jZSB0bworaXRzZWxmIGluIGl0cyBcdGV4dHR0e3N0YXJ0fSBtZXRob2QuCisKK1dpdGggdGhlIHdlYWsgcmVmZXJlbmNlIGluIGhhbmQgdGhlIFx0ZXh0dHR7VGhyZWFkTWFpbn0gZnVuY3Rpb24gY2FuIGF0dGVtcHQgdG8gZ2V0CithIHN0cm9uZyByZWZlcmVuY2UgYmVmb3JlIGVudGVyaW5nIHRoZSBcdGV4dHR0e1J1bm5hYmxlOjpydW59IG1ldGhvZCBvZiB0aGUKK1x0ZXh0dHR7UnVubmFibGV9IG9iamVjdCBib3VuZCB0byB0aGUgXHRleHR0dHtUaHJlYWR9LiBJZiBubyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKK3RocmVhZCBhcmUgb2J0YWluZWQgYmV0d2VlbiBleGl0aW5nIFx0ZXh0dHR7VGhyZWFkOjpzdGFydH0gYW5kIGVudGVyaW5nIFx0ZXh0dHR7VGhyZWFkTWFpbn0sIHRoZSB3ZWFrIHJlZmVyZW5jZSByZXR1cm5zIFx0ZXh0dHR7bnVsbH0gYW5kIHRoZSBmdW5jdGlvbgorZXhpdHMgaW1tZWRpYXRlbHkuCisKK1RoZSBuZWVkIGZvciB0aGUgXHRleHR0dHtUaHJlYWR9IHRvIG1ha2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBpdHNlbGYgaGFzIGEKK3NpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgQVBJLiBTaW5jZSByZWZlcmVuY2VzIGFyZSBtYW5hZ2VkIHRocm91Z2ggdGhlCitcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdGVtcGxhdGVzLCB0aGUgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBtdXN0IGhhdmUgYSByZWZlcmVuY2UKK3RvIGl0c2VsZiB3cmFwcGVkIGJ5IHRoZSBzYW1lIFx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSBlbnZlbG9wZSB0aGF0IGlzIHJldHVybmVkCit0byB0aGUgY2FsbGVyLiBUaGlzIG5lY2Vzc2l0YXRlZCB0aGUgdXNlIG9mIHRoZSBmYWN0b3J5IHBhdHRlcm4uCitcdGV4dHR0e1RocmVhZEZhY3Rvcnl9IGNyZWF0ZXMgdGhlIHJhdyBcdGV4dHR0e1RocmVhZH0gb2JqZWN0IGFuZCBhCitcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gd3JhcHBlciwgYW5kIGNhbGxzIGEgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kIG9mIHRoZSBjbGFzcworaW1wbGVtZW50aW5nIHRoZSBcdGV4dHR0e1RocmVhZH0gaW50ZXJmYWNlIChpbiB0aGlzIGNhc2UsIFx0ZXh0dHR7UG9zaXhUaHJlYWQ6OndlYWtSZWZ9KQorIHRvIGFsbG93IGl0IHRvIG1ha2UgYWRkIHdlYWsgcmVmZXJlbmNlIHRvIGl0c2VsZiB0aHJvdWdoIHRoZQorIFx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSBlbnZlbG9wZS4KKworXHRleHR0dHtUaHJlYWR9IGFuZCBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3RzIHJlZmVyZW5jZSBlYWNoIG90aGVyLiBBIFx0ZXh0dHR7UnVubmFibGV9CitvYmplY3QgbWF5IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgdGhyZWFkIGluIHdoaWNoIGl0IGlzIGV4ZWN1dGluZywgYW5kIGEgVGhyZWFkLCBvYnZpb3VzbHksCituZWVkcyB0byBrbm93IHdoYXQgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IGl0IGlzIGhvc3RpbmcuIFRoaXMgaW50ZXJkZXBlbmRlbmN5IGlzCitmdXJ0aGVyIGNvbXBsaWNhdGVkIGJlY2F1c2UgdGhlIGxpZmVjeWNsZSBvZiBlYWNoIG9iamVjdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUKK290aGVyLiBBbiBhcHBsaWNhdGlvbiBtYXkgY3JlYXRlIGEgc2V0IG9mIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdCB0byBiZSByZXVzZWQgaW4gZGlmZmVyZW50IHRocmVhZHMsIG9yIGl0IG1heSBjcmVhdGUgYW5kIGZvcmdldCBhIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdAorb25jZSBhIHRocmVhZCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBzdGFydGVkIGZvciBpdC4KKworVGhlIFx0ZXh0dHR7VGhyZWFkfSBjbGFzcyB0YWtlcyBhIFx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSByZWZlcmVuY2UgdG8gdGhlIGhvc3RlZAorXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IGluIGl0cyBjb25zdHJ1Y3Rvciwgd2hpbGUgdGhlIFx0ZXh0dHR7UnVubmFibGV9IGNsYXNzIGhhcyBhbgorZXhwbGljaXQgXHRleHR0dHt0aHJlYWR9IG1ldGhvZCB0byBhbGxvdyBleHBsaWNpdCBiaW5kaW5nIG9mIHRoZSBob3N0ZWQgdGhyZWFkLgorXHRleHR0dHtUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWR9IGJpbmRzIHRoZSBvYmplY3RzIHRvIGVhY2ggb3RoZXIuCisKK1xzdWJzZWN0aW9ue1RocmVhZE1hbmFnZXJ9CisKK1x0ZXh0dHR7VGhyZWFkTWFuYWdlcn0gY3JlYXRlcyBhIHBvb2wgb2Ygd29ya2VyIHRocmVhZHMgYW5kCithbGxvd3MgYXBwbGljYXRpb25zIHRvIHNjaGVkdWxlIHRhc2tzIGZvciBleGVjdXRpb24gYXMgZnJlZSB3b3JrZXIgdGhyZWFkcworYmVjb21lIGF2YWlsYWJsZS4gVGhlIFx0ZXh0dHR7VGhyZWFkTWFuYWdlcn0gZG9lcyBub3QgaW1wbGVtZW50IGR5bmFtaWMKK3RocmVhZCBwb29sIHJlc2l6aW5nLCBidXQgcHJvdmlkZXMgcHJpbWl0aXZlcyBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gYWRkCithbmQgcmVtb3ZlIHRocmVhZHMgYmFzZWQgb24gbG9hZC4gVGhpcyBhcHByb2FjaCB3YXMgY2hvc2VuIGJlY2F1c2UKK2ltcGxlbWVudGluZyBsb2FkIG1ldHJpY3MgYW5kIHRocmVhZCBwb29sIHNpemUgaXMgdmVyeSBhcHBsaWNhdGlvbgorc3BlY2lmaWMuIEZvciBleGFtcGxlIHNvbWUgYXBwbGljYXRpb25zIG1heSB3YW50IHRvIGFkanVzdCBwb29sIHNpemUgYmFzZWQKK29uIHJ1bm5pbmctYXZlcmFnZSBvZiB3b3JrIGFycml2YWwgcmF0ZXMgdGhhdCBhcmUgbWVhc3VyZWQgdmlhIHBvbGxlZAorc2FtcGxlcy4gT3RoZXJzIG1heSBzaW1wbHkgd2lzaCB0byByZWFjdCBpbW1lZGlhdGVseSB0byB3b3JrLXF1ZXVlCitkZXB0aCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MuIFJhdGhlciB0aGFuIHRyeWluZyB0byBjcmVhdGUgYSBjb21wbGV4CitBUEkgYWJzdHJhY3QgZW5vdWdoIHRvIGNhcHR1cmUgdGhlc2UgZGlmZmVyZW50IGFwcHJvYWNoZXMsIHdlCitzaW1wbHkgbGVhdmUgaXQgdXAgdG8gdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYW5kIHByb3ZpZGUgdGhlCitwcmltaXRpdmVzIHRvIGVuYWN0IHRoZSBkZXNpcmVkIHBvbGljeSBhbmQgc2FtcGxlIGN1cnJlbnQgc3RhdHVzLgorCitcc3Vic2VjdGlvbntUaW1lck1hbmFnZXJ9CisKK1x0ZXh0dHR7VGltZXJNYW5hZ2VyfSBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHNjaGVkdWxlCisgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0cyBmb3IgZXhlY3V0aW9uIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4gSXRzIHNwZWNpZmljIHRhc2sKK2lzIHRvIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2FtcGxlIFx0ZXh0dHR7VGhyZWFkTWFuYWdlcn0gbG9hZCBhdCByZWd1bGFyCitpbnRlcnZhbHMgYW5kIG1ha2UgY2hhbmdlcyB0byB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBiYXNlZCBvbiBhcHBsaWNhdGlvbiBwb2xpY3kuCitPZiBjb3Vyc2UsIGl0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGFueSBudW1iZXIgb2YgdGltZXIgb3IgYWxhcm0gZXZlbnRzLgorCitUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBcdGV4dHR0e1RpbWVyTWFuYWdlcn0gdXNlcyBhIHNpbmdsZSB0aHJlYWQgdG8KK2V4ZWN1dGUgZXhwaXJlZCBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3RzLiBUaHVzLCBpZiBhIHRpbWVyIG9wZXJhdGlvbiBuZWVkcyB0bworZG8gYSBsYXJnZSBhbW91bnQgb2Ygd29yayBhbmQgZXNwZWNpYWxseSBpZiBpdCBuZWVkcyB0byBkbyBibG9ja2luZyBJL08sCit0aGF0IHNob3VsZCBiZSBkb25lIGluIGEgc2VwYXJhdGUgdGhyZWFkLgorCitcc3Vic2VjdGlvbntOb25ibG9ja2luZyBPcGVyYXRpb259CitUaG91Z2ggdGhlIFRocmlmdCB0cmFuc3BvcnQgaW50ZXJmYWNlcyBtYXAgbW9yZSBkaXJlY3RseSB0byBhIGJsb2NraW5nIEkvTworbW9kZWwsIHdlIGhhdmUgaW1wbGVtZW50ZWQgYSBoaWdoIHBlcmZvcm1hbmNlIFx0ZXh0dHR7VE5vbkJsb2NraW5nU2VydmVyfQoraW4gQysrIGJhc2VkIG9uIFx0ZXh0dHR7bGliZXZlbnR9IGFuZCB0aGUgXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fS4gV2UKK2ltcGxlbWVudGVkIHRoaXMgYnkgbW92aW5nIGFsbCBJL08gaW50byBvbmUgdGlnaHQgZXZlbnQgbG9vcCB1c2luZyBhCitzdGF0ZSBtYWNoaW5lLiBFc3NlbnRpYWxseSwgdGhlIGV2ZW50IGxvb3AgcmVhZHMgZnJhbWVkIHJlcXVlc3RzIGludG8KK1x0ZXh0dHR7VE1lbW9yeUJ1ZmZlcn0gb2JqZWN0cy4gT25jZSBlbnRpcmUgcmVxdWVzdHMgYXJlIHJlYWR5LCB0aGV5IGFyZQorZGlzcGF0Y2hlZCB0byB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBvYmplY3Qgd2hpY2ggY2FuIHJlYWQgZGlyZWN0bHkgZnJvbQordGhlIGRhdGEgaW4gbWVtb3J5LgorCitcc3Vic2VjdGlvbntDb21waWxlcn0KK1RoZSBUaHJpZnQgY29tcGlsZXIgaXMgaW1wbGVtZW50ZWQgaW4gQysrIHVzaW5nIHN0YW5kYXJkIFx0ZXh0dHR7bGV4fS9cdGV4dHR0e3lhY2N9CitsZXhpbmcgYW5kIHBhcnNpbmcuIFRob3VnaCBpdCBjb3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgd2l0aCBmZXdlcgorbGluZXMgb2YgY29kZSBpbiBhbm90aGVyIGxhbmd1YWdlIChpLmUuIFB5dGhvbiBMZXgtWWFjYyAoUExZKSBvciBcdGV4dHR0e29jYW1seWFjY30pLCB1c2luZyBDKysKK2ZvcmNlcyBleHBsaWNpdCBkZWZpbml0aW9uIG9mIHRoZSBsYW5ndWFnZSBjb25zdHJ1Y3RzLiBTdHJvbmdseSB0eXBpbmcgdGhlCitwYXJzZSB0cmVlIGVsZW1lbnRzIChkZWJhdGFibHkpIG1ha2VzIHRoZSBjb2RlIG1vcmUgYXBwcm9hY2hhYmxlIGZvciBuZXcKK2RldmVsb3BlcnMuCisKK0NvZGUgZ2VuZXJhdGlvbiBpcyBkb25lIHVzaW5nIHR3byBwYXNzZXMuIFRoZSBmaXJzdCBwYXNzIGxvb2tzIG9ubHkgZm9yCitpbmNsdWRlIGZpbGVzIGFuZCB0eXBlIGRlZmluaXRpb25zLiBUeXBlIGRlZmluaXRpb25zIGFyZSBub3QgY2hlY2tlZCBkdXJpbmcKK3RoaXMgcGhhc2UsIHNpbmNlIHRoZXkgbWF5IGRlcGVuZCB1cG9uIGluY2x1ZGUgZmlsZXMuIEFsbCBpbmNsdWRlZCBmaWxlcworYXJlIHNlcXVlbnRpYWxseSBzY2FubmVkIGluIGEgZmlyc3QgcGFzcy4gT25jZSB0aGUgaW5jbHVkZSB0cmVlIGhhcyBiZWVuCityZXNvbHZlZCwgYSBzZWNvbmQgcGFzcyBvdmVyIGFsbCBmaWxlcyBpcyB0YWtlbiB0aGF0IGluc2VydHMgdHlwZSBkZWZpbml0aW9ucworaW50byB0aGUgcGFyc2UgdHJlZSBhbmQgcmFpc2VzIGFuIGVycm9yIG9uIGFueSB1bmRlZmluZWQgdHlwZXMuIFRoZSBwcm9ncmFtIGlzCit0aGVuIGdlbmVyYXRlZCBhZ2FpbnN0IHRoZSBwYXJzZSB0cmVlLgorCitEdWUgdG8gaW5oZXJlbnQgY29tcGxleGl0aWVzIGFuZCBwb3RlbnRpYWwgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY2llcywKK3dlIGV4cGxpY2l0bHkgZGlzYWxsb3cgZm9yd2FyZCBkZWNsYXJhdGlvbi4gVHdvIFRocmlmdCBzdHJ1Y3RzIGNhbm5vdAorZWFjaCBjb250YWluIGFuIGluc3RhbmNlIG9mIHRoZSBvdGhlci4gKFNpbmNlIHdlIGRvIG5vdCBhbGxvdyBcdGV4dHR0e251bGx9CitzdHJ1Y3QgaW5zdGFuY2VzIGluIHRoZSBnZW5lcmF0ZWQgQysrIGNvZGUsIHRoaXMgd291bGQgYWN0dWFsbHkgYmUgaW1wb3NzaWJsZS4pCisKK1xzdWJzZWN0aW9ue1RGaWxlVHJhbnNwb3J0fQorVGhlIFx0ZXh0dHR7VEZpbGVUcmFuc3BvcnR9IGxvZ3MgVGhyaWZ0IHJlcXVlc3RzL3N0cnVjdHMgYnkKK2ZyYW1pbmcgaW5jb21pbmcgZGF0YSB3aXRoIGl0cyBsZW5ndGggYW5kIHdyaXRpbmcgaXQgb3V0IHRvIGRpc2suCitVc2luZyBhIGZyYW1lZCBvbi1kaXNrIGZvcm1hdCBhbGxvd3MgZm9yIGJldHRlciBlcnJvciBjaGVja2luZyBhbmQKK2hlbHBzIHdpdGggdGhlIHByb2Nlc3Npbmcgb2YgYSBmaW5pdGUgbnVtYmVyIG9mIGRpc2NyZXRlIGV2ZW50cy4gVGhlXFwKK1x0ZXh0dHR7VEZpbGVXcml0ZXJUcmFuc3BvcnR9IHVzZXMgYSBzeXN0ZW0gb2Ygc3dhcHBpbmcgaW4tbWVtb3J5IGJ1ZmZlcnMKK3RvIGVuc3VyZSBnb29kIHBlcmZvcm1hbmNlIHdoaWxlIGxvZ2dpbmcgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLgorQSBUaHJpZnQgbG9nIGZpbGUgaXMgc3BsaXQgdXAgaW50byBjaHVua3Mgb2YgYSBzcGVjaWZpZWQgc2l6ZTsgbG9nZ2VkIG1lc3NhZ2VzCithcmUgbm90IGFsbG93ZWQgdG8gY3Jvc3MgY2h1bmsgYm91bmRhcmllcy4gQSBtZXNzYWdlIHRoYXQgd291bGQgY3Jvc3MgYSBjaHVuaworYm91bmRhcnkgd2lsbCBjYXVzZSBwYWRkaW5nIHRvIGJlIGFkZGVkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNodW5rIGFuZCB0aGUKK2ZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgYXJlIGFsaWduZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBjaHVuay4KK1BhcnRpdGlvbmluZyB0aGUgZmlsZSBpbnRvIGNodW5rcyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWFkIGFuZCBpbnRlcnByZXQgZGF0YQorZnJvbSBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIGZpbGUuCisKK1xzZWN0aW9ue0ZhY2Vib29rIFRocmlmdCBTZXJ2aWNlc30KK1RocmlmdCBoYXMgYmVlbiBlbXBsb3llZCBpbiBhIGxhcmdlIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgYXQgRmFjZWJvb2ssIGluY2x1ZGluZworc2VhcmNoLCBsb2dnaW5nLCBtb2JpbGUsIGFkcyBhbmQgdGhlIGRldmVsb3BlciBwbGF0Zm9ybS4gVHdvIHNwZWNpZmljIHVzYWdlcyBhcmUgZGlzY3Vzc2VkIGJlbG93LgorCitcc3Vic2VjdGlvbntTZWFyY2h9CitUaHJpZnQgaXMgdXNlZCBhcyB0aGUgdW5kZXJseWluZyBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGxheWVyIGZvciB0aGUgRmFjZWJvb2sgU2VhcmNoIHNlcnZpY2UuCitUaGUgbXVsdGktbGFuZ3VhZ2UgY29kZSBnZW5lcmF0aW9uIGlzIHdlbGwgc3VpdGVkIGZvciBzZWFyY2ggYmVjYXVzZSBpdCBhbGxvd3MgZm9yIGFwcGxpY2F0aW9uCitkZXZlbG9wbWVudCBpbiBhbiBlZmZpY2llbnQgc2VydmVyIHNpZGUgbGFuZ3VhZ2UgKEMrKykgYW5kIGFsbG93cyB0aGUgRmFjZWJvb2sgUEhQLWJhc2VkIHdlYiBhcHBsaWNhdGlvbgordG8gbWFrZSBjYWxscyB0byB0aGUgc2VhcmNoIHNlcnZpY2UgdXNpbmcgVGhyaWZ0IFBIUCBsaWJyYXJpZXMuIFRoZXJlIGlzIGFsc28gYSBsYXJnZQordmFyaWV0eSBvZiBzZWFyY2ggc3RhdHMsIGRlcGxveW1lbnQgYW5kIHRlc3RpbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGJ1aWx0IG9uIHRvcAorb2YgZ2VuZXJhdGVkIFB5dGhvbiBjb2RlLiBBZGRpdGlvbmFsbHksIHRoZSBUaHJpZnQgbG9nIGZpbGUgZm9ybWF0IGlzCit1c2VkIGFzIGEgcmVkbyBsb2cgZm9yIHByb3ZpZGluZyByZWFsLXRpbWUgc2VhcmNoIGluZGV4IHVwZGF0ZXMuIFRocmlmdCBoYXMgYWxsb3dlZCB0aGUKK3NlYXJjaCB0ZWFtIHRvIGxldmVyYWdlIGVhY2ggbGFuZ3VhZ2UgZm9yIGl0cyBzdHJlbmd0aHMgYW5kIHRvIGRldmVsb3AgY29kZSBhdCBhIHJhcGlkIHBhY2UuCisKK1xzdWJzZWN0aW9ue0xvZ2dpbmd9CitUaGUgVGhyaWZ0IFx0ZXh0dHR7VEZpbGVUcmFuc3BvcnR9IGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBmb3Igc3RydWN0dXJlZCBsb2dnaW5nLiBFYWNoCitzZXJ2aWNlIGZ1bmN0aW9uIGRlZmluaXRpb24gYWxvbmcgd2l0aCBpdHMgcGFyYW1ldGVycyBjYW4gYmUgY29uc2lkZXJlZCB0byBiZQorYSBzdHJ1Y3R1cmVkIGxvZyBlbnRyeSBpZGVudGlmaWVkIGJ5IHRoZSBmdW5jdGlvbiBuYW1lLiBUaGlzIGxvZyBjYW4gdGhlbiBiZSB1c2VkIGZvcgorYSB2YXJpZXR5IG9mIHB1cnBvc2VzLCBpbmNsdWRpbmcgaW5saW5lIGFuZCBvZmZsaW5lIHByb2Nlc3NpbmcsIHN0YXRzIGFnZ3JlZ2F0aW9uIGFuZCBhcyBhIHJlZG8gbG9nLgorCitcc2VjdGlvbntDb25jbHVzaW9uc30KK1RocmlmdCBoYXMgZW5hYmxlZCBGYWNlYm9vayB0byBidWlsZCBzY2FsYWJsZSBiYWNrZW5kCitzZXJ2aWNlcyBlZmZpY2llbnRseSBieSBlbmFibGluZyBlbmdpbmVlcnMgdG8gZGl2aWRlIGFuZCBjb25xdWVyLiBBcHBsaWNhdGlvbgorZGV2ZWxvcGVycyBjYW4gZm9jdXMgb24gYXBwbGljYXRpb24gY29kZSB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZQorc29ja2V0cyBsYXllci4gV2UgYXZvaWQgZHVwbGljYXRlZCB3b3JrIGJ5IHdyaXRpbmcgYnVmZmVyaW5nIGFuZCBJL08gbG9naWMKK2luIG9uZSBwbGFjZSwgcmF0aGVyIHRoYW4gaW50ZXJzcGVyc2luZyBpdCBpbiBlYWNoIGFwcGxpY2F0aW9uLgorCitUaHJpZnQgaGFzIGJlZW4gZW1wbG95ZWQgaW4gYSB3aWRlIHZhcmlldHkgb2YgYXBwbGljYXRpb25zIGF0IEZhY2Vib29rLAoraW5jbHVkaW5nIHNlYXJjaCwgbG9nZ2luZywgbW9iaWxlLCBhZHMsIGFuZCB0aGUgZGV2ZWxvcGVyIHBsYXRmb3JtLiBXZSBoYXZlCitmb3VuZCB0aGF0IHRoZSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBjb3N0IGluY3VycmVkIGJ5IGFuIGV4dHJhIGxheWVyIG9mCitzb2Z0d2FyZSBhYnN0cmFjdGlvbiBpcyBmYXIgZWNsaXBzZWQgYnkgdGhlIGdhaW5zIGluIGRldmVsb3BlciBlZmZpY2llbmN5IGFuZAorc3lzdGVtcyByZWxpYWJpbGl0eS4KKworXGFwcGVuZGl4CisKK1xzZWN0aW9ue1NpbWlsYXIgU3lzdGVtc30KK1RoZSBmb2xsb3dpbmcgYXJlIHNvZnR3YXJlIHN5c3RlbXMgc2ltaWxhciB0byBUaHJpZnQuIEVhY2ggaXMgKHZlcnkhKSBicmllZmx5CitkZXNjcmliZWQ6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHRpdHtTT0FQLn0gWE1MLWJhc2VkLiBEZXNpZ25lZCBmb3Igd2ViIHNlcnZpY2VzIHZpYSBIVFRQLCBleGNlc3NpdmUKK1hNTCBwYXJzaW5nIG92ZXJoZWFkLgorXGl0ZW0gXHRleHRpdHtDT1JCQS59IFJlbGF0aXZlbHkgY29tcHJlaGVuc2l2ZSwgZGViYXRhYmx5IG92ZXJkZXNpZ25lZCBhbmQKK2hlYXZ5d2VpZ2h0LiBDb21wYXJhYmx5IGN1bWJlcnNvbWUgc29mdHdhcmUgaW5zdGFsbGF0aW9uLgorXGl0ZW0gXHRleHRpdHtDT00ufSBFbWJyYWNlZCBtYWlubHkgaW4gV2luZG93cyBjbGllbnQgc29mdHdhcmUuIE5vdCBhbiBlbnRpcmVseQorb3BlbiBzb2x1dGlvbi4KK1xpdGVtIFx0ZXh0aXR7UGlsbGFyLn0gTGlnaHR3ZWlnaHQgYW5kIGhpZ2gtcGVyZm9ybWFuY2UsIGJ1dCBtaXNzaW5nIHZlcnNpb25pbmcKK2FuZCBhYnN0cmFjdGlvbi4KK1xpdGVtIFx0ZXh0aXR7UHJvdG9jb2wgQnVmZmVycy59IENsb3NlZC1zb3VyY2UsIG93bmVkIGJ5IEdvb2dsZS4gRGVzY3JpYmVkIGluCitTYXd6YWxsIHBhcGVyLgorXGVuZHtpdGVtaXplfQorCitcYWNrcworCitNYW55IHRoYW5rcyBmb3IgZmVlZGJhY2sgb24gVGhyaWZ0IChhbmQgZXh0cmVtZSB0cmlhbCBieSBmaXJlKSBhcmUgZHVlIHRvCitNYXJ0aW4gU21pdGgsIEthcmwgVm9za3VpbCBhbmQgWWlzaGFuIFdvbmcuCisKK1RocmlmdCBpcyBhIHN1Y2Nlc3NvciB0byBQaWxsYXIsIGEgc2ltaWxhciBzeXN0ZW0gZGV2ZWxvcGVkCitieSBBZGFtIEQnQW5nZWxvLCBmaXJzdCB3aGlsZSBhdCBDYWx0ZWNoIGFuZCBjb250aW51ZWQgbGF0ZXIgYXQgRmFjZWJvb2suCitUaHJpZnQgc2ltcGx5IHdvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIHdpdGhvdXQgQWRhbSdzIGluc2lnaHRzLgorCitcYmVnaW57dGhlYmlibGlvZ3JhcGh5fXt9CisKK1xiaWJpdGVte2Jvb3N0LnRocmVhZHN9CitLZW1wZiwgV2lsbGlhbSwKK2BgQm9vc3QuVGhyZWFkcycnLAorXHVybHtodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvaHRtbC90aHJlYWRzLmh0bWx9CisKK1xiaWJpdGVte2Jvb3N0LnRocmVhZHBvb2x9CitIZW5rZWwsIFBoaWxpcHAsCitgYHRocmVhZHBvb2wnJywKK1x1cmx7aHR0cDovL3RocmVhZHBvb2wuc291cmNlZm9yZ2UubmV0fQorCitcZW5ke3RoZWJpYmxpb2dyYXBoeX0KKworXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQuYm5mIGIvZG9jL3RocmlmdC5ibmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZDgzZjYuLjAwMDAwMDAKLS0tIGEvZG9jL3RocmlmdC5ibmYKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1UaHJpZnQgUHJvdG9jb2wgU3RydWN0dXJlCi0KLUxhc3QgTW9kaWZpZWQ6IDIwMDctSnVuLTI5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wKLXdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuIFRodXMsIHRoZSBvcmRlciBvZiBlbGVtZW50cwotY291bGQgaW4gc29tZSBjYXNlcyBiZSByZWFycmFuZ2VkIGRlcGVuZGluZyB1cG9uIHRoZSBUUHJvdG9jb2wKLWltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gcmVxdWlyZWQKLXN0cnVjdHVyZS4gVGhlcmUgYXJlIHNvbWUgImR1bWIiIHRlcm1pbmFscyBsaWtlIFNUUklORyBhbmQgSU5UCi10aGF0IHRha2UgdGhlIHBsYWNlIG9mIGFuIGFjdHVhbCBlbmNvZGluZyBzcGVjaWZpY2F0aW9uLgotCi1UaGV5IGtleSBwb2ludCB0byBub3RpY2UgaXMgdGhhdCBBTEwgbWVzc2FnZXMgYXJlIGp1c3Qgb25lIHdyYXBwZWQKLTxzdHJ1Y3Q+LiBEZXBlbmRpbmcgdXBvbiB0aGUgbWVzc2FnZSB0eXBlLCB0aGUgPHN0cnVjdD4gY2FuIGJlCi1pbnRlcnByZXRlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCB0byBhIGZ1bmN0aW9uLCB0aGUgcmV0dXJuIHZhbHVlCi1vZiBhIGZ1bmN0aW9uLCBvciBhbiBleGNlcHRpb24uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICA8bWVzc2FnZT4gOjo9IDxtZXNzYWdlLWJlZ2luPiA8c3RydWN0PiA8bWVzc2FnZS1lbmQ+Ci0KLSA8bWVzc2FnZS1iZWdpbj4gOjo9IDxtZXRob2QtbmFtZT4gPG1lc3NhZ2UtdHlwZT4gPG1lc3NhZ2Utc2VxaWQ+Ci0KLSAgIDxtZXRob2QtbmFtZT4gOjo9IFNUUklORwotCi0gIDxtZXNzYWdlLXR5cGU+IDo6PSBUX0NBTEwgfCBUX1JFUExZIHwgVF9FWENFUFRJT04KLQotIDxtZXNzYWdlLXNlcWlkPiA6Oj0gSTMyCi0KLSAgICAgICAgPHN0cnVjdD4gOjo9IDxzdHJ1Y3QtYmVnaW4+IDxmaWVsZD4qIDxmaWVsZC1zdG9wPiA8c3RydWN0LWVuZD4KLQotICA8c3RydWN0LWJlZ2luPiA6Oj0gPHN0cnVjdC1uYW1lPgotCi0gICA8c3RydWN0LW5hbWU+IDo6PSBTVFJJTkcKLQotICAgIDxmaWVsZC1zdG9wPiA6Oj0gVF9TVE9QCi0KLSAgICAgICAgIDxmaWVsZD4gOjo9IDxmaWVsZC1iZWdpbj4gPGZpZWxkLWRhdGE+IDxmaWVsZC1lbmQ+Ci0KLSAgIDxmaWVsZC1iZWdpbj4gOjo9IDxmaWVsZC1uYW1lPiA8ZmllbGQtdHlwZT4gPGZpZWxkLWlkPgotCi0gICAgPGZpZWxkLW5hbWU+IDo6PSBTVFJJTkcKLQotICAgIDxmaWVsZC10eXBlPiA6Oj0gVF9CT09MIHwgVF9CWVRFIHwgVF9JOCB8IFRfSTE2IHwgVF9JMzIgfCBUX0k2NCB8IFRfRE9VQkxFCi0gICAgICAgICAgICAgICAgICAgICB8IFRfU1RSSU5HIHwgVF9CSU5BUlkgfCBUX1NUUlVDVCB8IFRfTUFQIHwgVF9TRVQgfCBUX0xJU1QKLQotICAgICAgPGZpZWxkLWlkPiA6Oj0gSTE2Ci0KLSAgICA8ZmllbGQtZGF0YT4gOjo9IEk4IHwgSTE2IHwgSTMyIHwgSTY0IHwgRE9VQkxFIHwgU1RSSU5HIHwgQklOQVJZCi0gICAgICAgICAgICAgICAgICAgICA8c3RydWN0PiB8IDxtYXA+IHwgPGxpc3Q+IHwgPHNldD4KLQotICAgICAgICAgICA8bWFwPiA6Oj0gPG1hcC1iZWdpbj4gPGZpZWxkLWRhdHVtPiogPG1hcC1lbmQ+Ci0KLSAgICAgPG1hcC1iZWdpbj4gOjo9IDxtYXAta2V5LXR5cGU+IDxtYXAtdmFsdWUtdHlwZT4gPG1hcC1zaXplPgotCi0gIDxtYXAta2V5LXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotPG1hcC12YWx1ZS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+Ci0KLSAgICAgIDxtYXAtc2l6ZT4gOjo9IEkzMgotCi0gICAgICAgICAgPGxpc3Q+IDo6PSA8bGlzdC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8bGlzdC1lbmQ+Ci0KLSAgICA8bGlzdC1iZWdpbj4gOjo9IDxsaXN0LWVsZW0tdHlwZT4gPGxpc3Qtc2l6ZT4KLQotPGxpc3QtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+Ci0KLSAgICAgPGxpc3Qtc2l6ZT4gOjo9IEkzMgotCi0gICAgICAgICAgIDxzZXQ+IDo6PSA8c2V0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxzZXQtZW5kPgotCi0gICAgIDxzZXQtYmVnaW4+IDo6PSA8c2V0LWVsZW0tdHlwZT4gPHNldC1zaXplPgotCi0gPHNldC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICAgPHNldC1zaXplPiA6Oj0gSTMyCmRpZmYgLS1naXQgYS9kb2MvdGhyaWZ0LnRleCBiL2RvYy90aHJpZnQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjBiNzM3Li4wMDAwMDAwCi0tLSBhL2RvYy90aHJpZnQudGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTA1NyArMCwwIEBACi0lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUKLSUgICAgICAgICAgICAgICBUaHJpZnQgd2hpdGVwYXBlcgotJQotJSBOYW1lOiAgICAgICAgIHRocmlmdC50ZXgKLSUKLSUgQXV0aG9yczogICAgICBNYXJrIFNsZWUgKG1jc2xlZUBmYWNlYm9vay5jb20pCi0lCi0lIENyZWF0ZWQ6ICAgICAgMDUgTWFyY2ggMjAwNwotJQotJSBZb3Ugd2lsbCBuZWVkIGEgY29weSBvZiBzaWdwbGFuY29uZi5jbHMgdG8gZm9ybWF0IHRoaXMgZG9jdW1lbnQuCi0lIEl0IGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5zaWdwbGFuLm9yZy9hdXRob3JJbmZvcm1hdGlvbi5odG0+LgotJQotJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotXGRvY3VtZW50Y2xhc3Nbbm9jb3B5cmlnaHRzcGFjZSxibG9ja3N0eWxlXXtzaWdwbGFuY29uZn0KLQotXHVzZXBhY2thZ2V7YW1zc3ltYn0KLVx1c2VwYWNrYWdle2Ftc2ZvbnRzfQotXHVzZXBhY2thZ2V7YW1zbWF0aH0KLVx1c2VwYWNrYWdle3VybH0KLQotXGJlZ2lue2RvY3VtZW50fQotCi0lIFxjb25mZXJlbmNlaW5mb3tXWFlaICcwNX17ZGF0ZSwgQ2l0eS59Ci0lIFxjb3B5cmlnaHR5ZWFyezIwMDd9Ci0lIFxjb3B5cmlnaHRkYXRhe1t0byBiZSBzdXBwbGllZF19Ci0KLSUgXHRpdGxlYmFubmVye2Jhbm5lciBhYm92ZSBwYXBlciB0aXRsZX0gICAgICAgICUgVGhlc2UgYXJlIGlnbm9yZWQgdW5sZXNzCi0lIFxwcmVwcmludGZvb3RlcntzaG9ydCBkZXNjcmlwdGlvbiBvZiBwYXBlcn0gICAlICdwcmVwcmludCcgb3B0aW9uIHNwZWNpZmllZC4KLQotXHRpdGxle1RocmlmdDogU2NhbGFibGUgQ3Jvc3MtTGFuZ3VhZ2UgU2VydmljZXMgSW1wbGVtZW50YXRpb259Ci1cc3VidGl0bGV7fQotCi1cYXV0aG9yaW5mb3tNYXJrIFNsZWUsIEFkaXR5YSBBZ2Fyd2FsIGFuZCBNYXJjIEt3aWF0a293c2tpfQotICAgICAgICAgICB7RmFjZWJvb2ssIDE1NiBVbml2ZXJzaXR5IEF2ZSwgUGFsbyBBbHRvLCBDQX0KLSAgICAgICAgICAge1x7bWNzbGVlLGFkaXR5YSxtYXJjXH1AZmFjZWJvb2suY29tfQotCi1cbWFrZXRpdGxlCi0KLVxiZWdpbnthYnN0cmFjdH0KLVRocmlmdCBpcyBhIHNvZnR3YXJlIGxpYnJhcnkgYW5kIHNldCBvZiBjb2RlLWdlbmVyYXRpb24gdG9vbHMgZGV2ZWxvcGVkIGF0Ci1GYWNlYm9vayB0byBleHBlZGl0ZSBkZXZlbG9wbWVudCBhbmQgaW1wbGVtZW50YXRpb24gb2YgZWZmaWNpZW50IGFuZCBzY2FsYWJsZQotYmFja2VuZCBzZXJ2aWNlcy4gSXRzIHByaW1hcnkgZ29hbCBpcyB0byBlbmFibGUgZWZmaWNpZW50IGFuZCByZWxpYWJsZQotY29tbXVuaWNhdGlvbiBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGJ5IGFic3RyYWN0aW5nIHRoZSBwb3J0aW9ucyBvZiBlYWNoCi1sYW5ndWFnZSB0aGF0IHRlbmQgdG8gcmVxdWlyZSB0aGUgbW9zdCBjdXN0b21pemF0aW9uIGludG8gYSBjb21tb24gbGlicmFyeQotdGhhdCBpcyBpbXBsZW1lbnRlZCBpbiBlYWNoIGxhbmd1YWdlLiBTcGVjaWZpY2FsbHksIFRocmlmdCBhbGxvd3MgZGV2ZWxvcGVycyB0bwotZGVmaW5lIGRhdGF0eXBlcyBhbmQgc2VydmljZSBpbnRlcmZhY2VzIGluIGEgc2luZ2xlIGxhbmd1YWdlLW5ldXRyYWwgZmlsZQotYW5kIGdlbmVyYXRlIGFsbCB0aGUgbmVjZXNzYXJ5IGNvZGUgdG8gYnVpbGQgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCi0KLVRoaXMgcGFwZXIgZGV0YWlscyB0aGUgbW90aXZhdGlvbnMgYW5kIGRlc2lnbiBjaG9pY2VzIHdlIG1hZGUgaW4gVGhyaWZ0LCBhcwotd2VsbCBhcyBzb21lIG9mIHRoZSBtb3JlIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEl0IGlzIG5vdAotaW50ZW5kZWQgdG8gYmUgdGFrZW4gYXMgcmVzZWFyY2gsIGJ1dCByYXRoZXIgaXQgaXMgYW4gZXhwb3NpdGlvbiBvbiB3aGF0IHdlIGRpZAotYW5kIHdoeS4KLVxlbmR7YWJzdHJhY3R9Ci0KLSUgXGNhdGVnb3J5e0QuMy4zfXtQcm9ncmFtbWluZyBMYW5ndWFnZXN9e0xhbmd1YWdlIGNvbnN0cnVjdHMgYW5kIGZlYXR1cmVzfQotCi0lXHRlcm1zCi0lTGFuZ3VhZ2VzLCBzZXJpYWxpemF0aW9uLCByZW1vdGUgcHJvY2VkdXJlIGNhbGwKLQotJVxrZXl3b3JkcwotJURhdGEgZGVzY3JpcHRpb24gbGFuZ3VhZ2UsIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlLCByZW1vdGUgcHJvY2VkdXJlIGNhbGwKLQotXHNlY3Rpb257SW50cm9kdWN0aW9ufQotQXMgRmFjZWJvb2sncyB0cmFmZmljIGFuZCBuZXR3b3JrIHN0cnVjdHVyZSBoYXZlIHNjYWxlZCwgdGhlIHJlc291cmNlCi1kZW1hbmRzIG9mIG1hbnkgb3BlcmF0aW9ucyBvbiB0aGUgc2l0ZSAoaS5lLiBzZWFyY2gsCi1hZCBzZWxlY3Rpb24gYW5kIGRlbGl2ZXJ5LCBldmVudCBsb2dnaW5nKSBoYXZlIHByZXNlbnRlZCB0ZWNobmljYWwgcmVxdWlyZW1lbnRzCi1kcmFzdGljYWxseSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgTEFNUCBmcmFtZXdvcmsuIEluIG91ciBpbXBsZW1lbnRhdGlvbiBvZgotdGhlc2Ugc2VydmljZXMsIHZhcmlvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGhhdmUgYmVlbiBzZWxlY3RlZCB0bwotb3B0aW1pemUgZm9yIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBwZXJmb3JtYW5jZSwgZWFzZSBhbmQgc3BlZWQgb2YKLWRldmVsb3BtZW50LCBhdmFpbGFiaWxpdHkgb2YgZXhpc3RpbmcgbGlicmFyaWVzLCBldGMuIEJ5IGFuZCBsYXJnZSwKLUZhY2Vib29rJ3MgZW5naW5lZXJpbmcgY3VsdHVyZSBoYXMgdGVuZGVkIHRvd2FyZHMgY2hvb3NpbmcgdGhlIGJlc3QKLXRvb2xzIGFuZCBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlIG92ZXIgc3RhbmRhcmRpemluZyBvbiBhbnkgb25lCi1wcm9ncmFtbWluZyBsYW5ndWFnZSBhbmQgYmVncnVkZ2luZ2x5IGFjY2VwdGluZyBpdHMgaW5oZXJlbnQgbGltaXRhdGlvbnMuCi0KLUdpdmVuIHRoaXMgZGVzaWduIGNob2ljZSwgd2Ugd2VyZSBwcmVzZW50ZWQgd2l0aCB0aGUgY2hhbGxlbmdlIG9mIGJ1aWxkaW5nCi1hIHRyYW5zcGFyZW50LCBoaWdoLXBlcmZvcm1hbmNlIGJyaWRnZSBhY3Jvc3MgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCi1XZSBmb3VuZCB0aGF0IG1vc3QgYXZhaWxhYmxlIHNvbHV0aW9ucyB3ZXJlIGVpdGhlciB0b28gbGltaXRlZCwgZGlkIG5vdCBvZmZlcgotc3VmZmljaWVudCBkYXRhdHlwZSBmcmVlZG9tLCBvciBzdWZmZXJlZCBmcm9tIHN1YnBhciBwZXJmb3JtYW5jZS4KLVxmb290bm90ZXtTZWUgQXBwZW5kaXggQSBmb3IgYSBkaXNjdXNzaW9uIG9mIGFsdGVybmF0aXZlIHN5c3RlbXMufQotCi1UaGUgc29sdXRpb24gdGhhdCB3ZSBoYXZlIGltcGxlbWVudGVkIGNvbWJpbmVzIGEgbGFuZ3VhZ2UtbmV1dHJhbCBzb2Z0d2FyZQotc3RhY2sgaW1wbGVtZW50ZWQgYWNyb3NzIG51bWVyb3VzIHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgYW4gYXNzb2NpYXRlZCBjb2RlCi1nZW5lcmF0aW9uIGVuZ2luZSB0aGF0IHRyYW5zZm9ybXMgYSBzaW1wbGUgaW50ZXJmYWNlIGFuZCBkYXRhIGRlZmluaXRpb24KLWxhbmd1YWdlIGludG8gY2xpZW50IGFuZCBzZXJ2ZXIgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGxpYnJhcmllcy4KLUNob29zaW5nIHN0YXRpYyBjb2RlIGdlbmVyYXRpb24gb3ZlciBhIGR5bmFtaWMgc3lzdGVtIGFsbG93cyB1cyB0byBjcmVhdGUKLXZhbGlkYXRlZCBjb2RlIHRoYXQgY2FuIGJlIHJ1biB3aXRob3V0IHRoZSBuZWVkIGZvcgotYW55IGFkdmFuY2VkIGludHJvc3BlY3RpdmUgcnVuLXRpbWUgdHlwZSBjaGVja2luZy4gSXQgaXMgYWxzbyBkZXNpZ25lZCB0bwotYmUgYXMgc2ltcGxlIGFzIHBvc3NpYmxlIGZvciB0aGUgZGV2ZWxvcGVyLCB3aG8gY2FuIHR5cGljYWxseSBkZWZpbmUgYWxsCi10aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBhbmQgaW50ZXJmYWNlcyBmb3IgYSBjb21wbGV4IHNlcnZpY2UgaW4gYSBzaW5nbGUKLXNob3J0IGZpbGUuCi0KLVN1cnByaXNlZCB0aGF0IGEgcm9idXN0IG9wZW4gc29sdXRpb24gdG8gdGhlc2UgcmVsYXRpdmVseSBjb21tb24gcHJvYmxlbXMKLWRpZCBub3QgeWV0IGV4aXN0LCB3ZSBjb21taXR0ZWQgZWFybHkgb24gdG8gbWFraW5nIHRoZSBUaHJpZnQgaW1wbGVtZW50YXRpb24KLW9wZW4gc291cmNlLgotCi1JbiBldmFsdWF0aW5nIHRoZSBjaGFsbGVuZ2VzIG9mIGNyb3NzLWxhbmd1YWdlIGludGVyYWN0aW9uIGluIGEgbmV0d29ya2VkCi1lbnZpcm9ubWVudCwgc29tZSBrZXkgY29tcG9uZW50cyB3ZXJlIGlkZW50aWZpZWQ6Ci0KLVx0ZXh0aXR7VHlwZXMufSBBIGNvbW1vbiB0eXBlIHN5c3RlbSBtdXN0IGV4aXN0IGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMKLXdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB1c2UgY3VzdG9tIFRocmlmdCBkYXRhdHlwZXMKLW9yIHdyaXRlIHRoZWlyIG93biBzZXJpYWxpemF0aW9uIGNvZGUuIFRoYXQgaXMsCi1hIEMrKyBwcm9ncmFtbWVyIHNob3VsZCBiZSBhYmxlIHRvIHRyYW5zcGFyZW50bHkgZXhjaGFuZ2UgYSBzdHJvbmdseSB0eXBlZAotU1RMIG1hcCBmb3IgYSBkeW5hbWljIFB5dGhvbiBkaWN0aW9uYXJ5LiBOZWl0aGVyCi1wcm9ncmFtbWVyIHNob3VsZCBiZSBmb3JjZWQgdG8gd3JpdGUgYW55IGNvZGUgYmVsb3cgdGhlIGFwcGxpY2F0aW9uIGxheWVyCi10byBhY2hpZXZlIHRoaXMuIFNlY3Rpb24gMiBkZXRhaWxzIHRoZSBUaHJpZnQgdHlwZSBzeXN0ZW0uCi0KLVx0ZXh0aXR7VHJhbnNwb3J0Ln0gRWFjaCBsYW5ndWFnZSBtdXN0IGhhdmUgYSBjb21tb24gaW50ZXJmYWNlIHRvCi1iaWRpcmVjdGlvbmFsIHJhdyBkYXRhIHRyYW5zcG9ydC4gVGhlIHNwZWNpZmljcyBvZiBob3cgYSBnaXZlbgotdHJhbnNwb3J0IGlzIGltcGxlbWVudGVkIHNob3VsZCBub3QgbWF0dGVyIHRvIHRoZSBzZXJ2aWNlIGRldmVsb3Blci4KLVRoZSBzYW1lIGFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIGJlIGFibGUgdG8gcnVuIGFnYWluc3QgVENQIHN0cmVhbSBzb2NrZXRzLAotcmF3IGRhdGEgaW4gbWVtb3J5LCBvciBmaWxlcyBvbiBkaXNrLiBTZWN0aW9uIDMgZGV0YWlscyB0aGUgVGhyaWZ0IFRyYW5zcG9ydAotbGF5ZXIuCi0KLVx0ZXh0aXR7UHJvdG9jb2wufSBEYXRhdHlwZXMgbXVzdCBoYXZlIHNvbWUgd2F5IG9mIHVzaW5nIHRoZSBUcmFuc3BvcnQKLWxheWVyIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZW1zZWx2ZXMuIEFnYWluLCB0aGUgYXBwbGljYXRpb24KLWRldmVsb3BlciBuZWVkIG5vdCBiZSBjb25jZXJuZWQgYnkgdGhpcyBsYXllci4gV2hldGhlciB0aGUgc2VydmljZSB1c2VzCi1hbiBYTUwgb3IgYmluYXJ5IHByb3RvY29sIGlzIGltbWF0ZXJpYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvZGUuCi1BbGwgdGhhdCBtYXR0ZXJzIGlzIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4gYSBjb25zaXN0ZW50LAotZGV0ZXJtaW5pc3RpYyBtYXR0ZXIuIFNlY3Rpb24gNCBkZXRhaWxzIHRoZSBUaHJpZnQgUHJvdG9jb2wgbGF5ZXIuCi0KLVx0ZXh0aXR7VmVyc2lvbmluZy59IEZvciByb2J1c3Qgc2VydmljZXMsIHRoZSBpbnZvbHZlZCBkYXRhdHlwZXMgbXVzdAotcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgdmVyc2lvbmluZyB0aGVtc2VsdmVzLiBTcGVjaWZpY2FsbHksCi1pdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYWRkIG9yIHJlbW92ZSBmaWVsZHMgaW4gYW4gb2JqZWN0IG9yIGFsdGVyIHRoZQotYXJndW1lbnQgbGlzdCBvZiBhIGZ1bmN0aW9uIHdpdGhvdXQgYW55IGludGVycnVwdGlvbiBpbiBzZXJ2aWNlIChvciwKLXdvcnNlIHlldCwgbmFzdHkgc2VnbWVudGF0aW9uIGZhdWx0cykuIFNlY3Rpb24gNSBkZXRhaWxzIFRocmlmdCdzIHZlcnNpb25pbmcKLXN5c3RlbS4KLQotXHRleHRpdHtQcm9jZXNzb3JzLn0gRmluYWxseSwgd2UgZ2VuZXJhdGUgY29kZSBjYXBhYmxlIG9mIHByb2Nlc3NpbmcgZGF0YQotc3RyZWFtcyB0byBhY2NvbXBsaXNoIHJlbW90ZSBwcm9jZWR1cmUgY2FsbHMuIFNlY3Rpb24gNiBkZXRhaWxzIHRoZSBnZW5lcmF0ZWQKLWNvZGUgYW5kIFRQcm9jZXNzb3IgcGFyYWRpZ20uCi0KLVNlY3Rpb24gNyBkaXNjdXNzZXMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgYW5kIFNlY3Rpb24gOCBkZXNjcmliZXMKLW91ciBjb25jbHVzaW9ucy4KLQotXHNlY3Rpb257VHlwZXN9Ci0KLVRoZSBnb2FsIG9mIHRoZSBUaHJpZnQgdHlwZSBzeXN0ZW0gaXMgdG8gZW5hYmxlIHByb2dyYW1tZXJzIHRvIGRldmVsb3AgdXNpbmcKLWNvbXBsZXRlbHkgbmF0aXZlbHkgZGVmaW5lZCB0eXBlcywgbm8gbWF0dGVyIHdoYXQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhleQotdXNlLiBCeSBkZXNpZ24sIHRoZSBUaHJpZnQgdHlwZSBzeXN0ZW0gZG9lcyBub3QgaW50cm9kdWNlIGFueSBzcGVjaWFsIGR5bmFtaWMKLXR5cGVzIG9yIHdyYXBwZXIgb2JqZWN0cy4gSXQgYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlIGRldmVsb3BlciB3cml0ZQotYW55IGNvZGUgZm9yIG9iamVjdCBzZXJpYWxpemF0aW9uIG9yIHRyYW5zcG9ydC4gVGhlIFRocmlmdCBJREwgKEludGVyZmFjZQotRGVmaW5pdGlvbiBMYW5ndWFnZSkgZmlsZSBpcwotbG9naWNhbGx5IGEgd2F5IGZvciBkZXZlbG9wZXJzIHRvIGFubm90YXRlIHRoZWlyIGRhdGEgc3RydWN0dXJlcyB3aXRoIHRoZQotbWluaW1hbCBhbW91bnQgb2YgZXh0cmEgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHRlbGwgYSBjb2RlIGdlbmVyYXRvcgotaG93IHRvIHNhZmVseSB0cmFuc3BvcnQgdGhlIG9iamVjdHMgYWNyb3NzIGxhbmd1YWdlcy4KLQotXHN1YnNlY3Rpb257QmFzZSBUeXBlc30KLQotVGhlIHR5cGUgc3lzdGVtIHJlc3RzIHVwb24gYSBmZXcgYmFzZSB0eXBlcy4gSW4gY29uc2lkZXJpbmcgd2hpY2ggdHlwZXMgdG8KLXN1cHBvcnQsIHdlIGFpbWVkIGZvciBjbGFyaXR5IGFuZCBzaW1wbGljaXR5IG92ZXIgYWJ1bmRhbmNlLCBmb2N1c2luZwotb24gdGhlIGtleSB0eXBlcyBhdmFpbGFibGUgaW4gYWxsIHByb2dyYW1taW5nIGxhbmd1YWdlcywgb21taXR0aW5nIGFueQotbmljaGUgdHlwZXMgYXZhaWxhYmxlIG9ubHkgaW4gc3BlY2lmaWMgbGFuZ3VhZ2VzLgotCi1UaGUgYmFzZSB0eXBlcyBzdXBwb3J0ZWQgYnkgVGhyaWZ0IGFyZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtib29sfSBBIGJvb2xlYW4gdmFsdWUsIHRydWUgb3IgZmFsc2UKLVxpdGVtIFx0ZXh0dHR7Ynl0ZX0gQSBzaWduZWQgYnl0ZQotXGl0ZW0gXHRleHR0dHtpMTZ9IEEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCi1caXRlbSBcdGV4dHR0e2kzMn0gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIKLVxpdGVtIFx0ZXh0dHR7aTY0fSBBIDY0LWJpdCBzaWduZWQgaW50ZWdlcgotXGl0ZW0gXHRleHR0dHtkb3VibGV9IEEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcgotXGl0ZW0gXHRleHR0dHtzdHJpbmd9IEFuIGVuY29kaW5nLWFnbm9zdGljIHRleHQgb3IgYmluYXJ5IHN0cmluZwotXGl0ZW0gXHRleHR0dHtiaW5hcnl9IEEgYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbiBmb3IgYmxvYnMKLVxlbmR7aXRlbWl6ZX0KLQotT2YgcGFydGljdWxhciBub3RlIGlzIHRoZSBhYnNlbmNlIG9mIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuIEJlY2F1c2UgdGhlc2UKLXR5cGVzIGhhdmUgbm8gZGlyZWN0IHRyYW5zbGF0aW9uIHRvIG5hdGl2ZSBwcmltaXRpdmUgdHlwZXMgaW4gbWFueSBsYW5ndWFnZXMsCi10aGUgYWR2YW50YWdlcyB0aGV5IGFmZm9yZCBhcmUgbG9zdC4gRnVydGhlciwgdGhlcmUgaXMgbm8gd2F5IHRvIHByZXZlbnQgdGhlCi1hcHBsaWNhdGlvbiBkZXZlbG9wZXIgaW4gYSBsYW5ndWFnZSBsaWtlIFB5dGhvbiBmcm9tIGFzc2lnbmluZyBhIG5lZ2F0aXZlIHZhbHVlCi10byBhbiBpbnRlZ2VyIHZhcmlhYmxlLCBsZWFkaW5nIHRvIHVucHJlZGljdGFibGUgYmVoYXZpb3IuIEZyb20gYSBkZXNpZ24KLXN0YW5kcG9pbnQsIHdlIG9ic2VydmVkIHRoYXQgdW5zaWduZWQgaW50ZWdlcnMgd2VyZSB2ZXJ5IHJhcmVseSwgaWYgZXZlciwgdXNlZAotZm9yIGFyaXRobWV0aWMgcHVycG9zZXMsIGJ1dCBpbiBwcmFjdGljZSB3ZXJlIG11Y2ggbW9yZSBvZnRlbiB1c2VkIGFzIGtleXMgb3IKLWlkZW50aWZpZXJzLiBJbiB0aGlzIGNhc2UsIHRoZSBzaWduIGlzIGlycmVsZXZhbnQuIFNpZ25lZCBpbnRlZ2VycyBzZXJ2ZSB0aGlzCi1zYW1lIHB1cnBvc2UgYW5kIGNhbiBiZSBzYWZlbHkgY2FzdCB0byB0aGVpciB1bnNpZ25lZCBjb3VudGVycGFydHMgKG1vc3QKLWNvbW1vbmx5IGluIEMrKykgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KLQotXHN1YnNlY3Rpb257U3RydWN0c30KLQotQSBUaHJpZnQgc3RydWN0IGRlZmluZXMgYSBjb21tb24gb2JqZWN0IHRvIGJlIHVzZWQgYWNyb3NzIGxhbmd1YWdlcy4gQSBzdHJ1Y3QKLWlzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYSBjbGFzcyBpbiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlcy4gQSBzdHJ1Y3QgaGFzIGEgc2V0IG9mIHN0cm9uZ2x5IHR5cGVkIGZpZWxkcywgZWFjaCB3aXRoIGEgdW5pcXVlCi1uYW1lIGlkZW50aWZpZXIuIFRoZSBiYXNpYyBzeW50YXggZm9yIGRlZmluaW5nIGEgVGhyaWZ0IHN0cnVjdCBsb29rcyB2ZXJ5Ci1zaW1pbGFyIHRvIGEgQyBzdHJ1Y3QgZGVmaW5pdGlvbi4gRmllbGRzIG1heSBiZSBhbm5vdGF0ZWQgd2l0aCBhbiBpbnRlZ2VyIGZpZWxkCi1pZGVudGlmaWVyICh1bmlxdWUgdG8gdGhlIHNjb3BlIG9mIHRoYXQgc3RydWN0KSBhbmQgb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZXMuCi1GaWVsZCBpZGVudGlmaWVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWYgb21pdHRlZCwgdGhvdWdoIHRoZXkgYXJlCi1zdHJvbmdseSBlbmNvdXJhZ2VkIGZvciB2ZXJzaW9uaW5nIHJlYXNvbnMgZGlzY3Vzc2VkIGxhdGVyLgotCi1cc3Vic2VjdGlvbntDb250YWluZXJzfQotCi1UaHJpZnQgY29udGFpbmVycyBhcmUgc3Ryb25nbHkgdHlwZWQgY29udGFpbmVycyB0aGF0IG1hcCB0byB0aGUgbW9zdCBjb21tb25seQotdXNlZCBjb250YWluZXJzIGluIGNvbW1vbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRoZXkgYXJlIGFubm90YXRlZCB1c2luZwotdGhlIEMrKyB0ZW1wbGF0ZSAob3IgSmF2YSBHZW5lcmljcykgc3R5bGUuIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBhdmFpbGFibGU6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFx0ZXh0dHR7bGlzdDx0eXBlPn0gQW4gb3JkZXJlZCBsaXN0IG9mIGVsZW1lbnRzLiBUcmFuc2xhdGVzIGRpcmVjdGx5IGludG8KLWFuIFNUTCBcdGV4dHR0e3ZlY3Rvcn0sIEphdmEgXHRleHR0dHtBcnJheUxpc3R9LCBvciBuYXRpdmUgYXJyYXkgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcy4gTWF5Ci1jb250YWluIGR1cGxpY2F0ZXMuCi1caXRlbSBcdGV4dHR0e3NldDx0eXBlPn0gQW4gdW5vcmRlcmVkIHNldCBvZiB1bmlxdWUgZWxlbWVudHMuIFRyYW5zbGF0ZXMgaW50bwotYW4gU1RMIFx0ZXh0dHR7c2V0fSwgSmF2YSBcdGV4dHR0e0hhc2hTZXR9LCBcdGV4dHR0e3NldH0gaW4gUHl0aG9uLCBvciBuYXRpdmUKLWRpY3Rpb25hcnkgaW4gUEhQL1J1YnkuCi1caXRlbSBcdGV4dHR0e21hcDx0eXBlMSx0eXBlMj59IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcwotVHJhbnNsYXRlcyBpbnRvIGFuIFNUTCBcdGV4dHR0e21hcH0sIEphdmEgXHRleHR0dHtIYXNoTWFwfSwgUEhQIGFzc29jaWF0aXZlCi1hcnJheSwgb3IgUHl0aG9uL1J1YnkgZGljdGlvbmFyeS4KLVxlbmR7aXRlbWl6ZX0KLQotV2hpbGUgZGVmYXVsdHMgYXJlIHByb3ZpZGVkLCB0aGUgdHlwZSBtYXBwaW5ncyBhcmUgbm90IGV4cGxpY2l0bHkgZml4ZWQuIEN1c3RvbQotY29kZSBnZW5lcmF0b3IgZGlyZWN0aXZlcyBoYXZlIGJlZW4gYWRkZWQgdG8gc3Vic3RpdHV0ZSBjdXN0b20gdHlwZXMgaW4KLWRlc3RpbmF0aW9uIGxhbmd1YWdlcyAoaS5lLgotXHRleHR0dHtoYXNoXF9tYXB9IG9yIEdvb2dsZSdzIHNwYXJzZSBoYXNoIG1hcCBjYW4gYmUgdXNlZCBpbiBDKyspLiBUaGUKLW9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgY3VzdG9tIHR5cGVzIHN1cHBvcnQgYWxsIHRoZSBuZWNlc3NhcnkgaXRlcmF0aW9uCi1wcmltaXRpdmVzLiBDb250YWluZXIgZWxlbWVudHMgbWF5IGJlIG9mIGFueSB2YWxpZCBUaHJpZnQgdHlwZSwgaW5jbHVkaW5nIG90aGVyCi1jb250YWluZXJzIG9yIHN0cnVjdHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0cnVjdCBFeGFtcGxlIHsKLSAgMTppMzIgbnVtYmVyPTEwLAotICAyOmk2NCBiaWdOdW1iZXIsCi0gIDM6ZG91YmxlIGRlY2ltYWxzLAotICA0OnN0cmluZyBuYW1lPSJ0aHJpZnR5IgotfVxlbmR7dmVyYmF0aW19Ci0KLUluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIGVhY2ggZGVmaW5pdGlvbiBnZW5lcmF0ZXMgYSB0eXBlIHdpdGggdHdvIG1ldGhvZHMsCi1cdGV4dHR0e3JlYWR9IGFuZCBcdGV4dHR0e3dyaXRlfSwgd2hpY2ggcGVyZm9ybSBzZXJpYWxpemF0aW9uIGFuZCB0cmFuc3BvcnQKLW9mIHRoZSBvYmplY3RzIHVzaW5nIGEgVGhyaWZ0IFRQcm90b2NvbCBvYmplY3QuCi0KLVxzdWJzZWN0aW9ue0V4Y2VwdGlvbnN9Ci0KLUV4Y2VwdGlvbnMgYXJlIHN5bnRhY3RpY2FsbHkgYW5kIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHN0cnVjdHMgZXhjZXB0Ci10aGF0IHRoZXkgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBcdGV4dHR0e2V4Y2VwdGlvbn0ga2V5d29yZCBpbnN0ZWFkIG9mIHRoZQotXHRleHR0dHtzdHJ1Y3R9IGtleXdvcmQuCi0KLVRoZSBnZW5lcmF0ZWQgb2JqZWN0cyBpbmhlcml0IGZyb20gYW4gZXhjZXB0aW9uIGJhc2UgY2xhc3MgYXMgYXBwcm9wcmlhdGUKLWluIGVhY2ggdGFyZ2V0IHByb2dyYW1taW5nIGxhbmd1YWdlLCBpbiBvcmRlciB0byBzZWFtbGVzc2x5Ci1pbnRlZ3JhdGUgd2l0aCBuYXRpdmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGFueSBnaXZlbgotbGFuZ3VhZ2UuIEFnYWluLCB0aGUgZGVzaWduIGVtcGhhc2lzIGlzIG9uIG1ha2luZyB0aGUgY29kZSBmYW1pbGlhciB0byB0aGUKLWFwcGxpY2F0aW9uIGRldmVsb3Blci4KLQotXHN1YnNlY3Rpb257U2VydmljZXN9Ci0KLVNlcnZpY2VzIGFyZSBkZWZpbmVkIHVzaW5nIFRocmlmdCB0eXBlcy4gRGVmaW5pdGlvbiBvZiBhIHNlcnZpY2UgaXMKLXNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGRlZmluaW5nIGFuIGludGVyZmFjZSAob3IgYSBwdXJlIHZpcnR1YWwgYWJzdHJhY3QKLWNsYXNzKSBpbiBvYmplY3Qgb3JpZW50ZWQKLXByb2dyYW1taW5nLiBUaGUgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlcyBmdWxseSBmdW5jdGlvbmFsIGNsaWVudCBhbmQKLXNlcnZlciBzdHVicyB0aGF0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlLiBTZXJ2aWNlcyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXJ2aWNlIDxuYW1lPiB7Ci0gIDxyZXR1cm50eXBlPiA8bmFtZT4oPGFyZ3VtZW50cz4pCi0gICAgW3Rocm93cyAoPGV4Y2VwdGlvbnM+KV0KLSAgLi4uCi19XGVuZHt2ZXJiYXRpbX0KLQotQW4gZXhhbXBsZToKLQotXGJlZ2lue3ZlcmJhdGltfQotc2VydmljZSBTdHJpbmdDYWNoZSB7Ci0gIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAotICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCi0gIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBcdGV4dHR0e3ZvaWR9IGlzIGEgdmFsaWQgdHlwZSBmb3IgYSBmdW5jdGlvbiByZXR1cm4sIGluIGFkZGl0aW9uIHRvCi1hbGwgb3RoZXIgZGVmaW5lZCBUaHJpZnQgdHlwZXMuIEFkZGl0aW9uYWxseSwgYW4gXHRleHR0dHthc3luY30gbW9kaWZpZXIKLWtleXdvcmQgbWF5IGJlIGFkZGVkIHRvIGEgXHRleHR0dHt2b2lkfSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgZG9lcwotbm90IHdhaXQgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBOb3RlIHRoYXQgYSBwdXJlIFx0ZXh0dHR7dm9pZH0KLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlCi1vcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBvbiB0aGUgc2VydmVyIHNpZGUuIFdpdGggXHRleHR0dHthc3luY30gbWV0aG9kIGNhbGxzCi10aGUgY2xpZW50IHdpbGwgb25seSBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGF0IHRoZQotdHJhbnNwb3J0IGxheWVyLiAoSW4gbWFueSB0cmFuc3BvcnQgc2NlbmFyaW9zIHRoaXMgaXMgaW5oZXJlbnRseSB1bnJlbGlhYmxlCi1kdWUgdG8gdGhlIEJ5emFudGluZSBHZW5lcmFscycgUHJvYmxlbS4gVGhlcmVmb3JlLCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzCi1zaG91bGQgdGFrZSBjYXJlIG9ubHkgdG8gdXNlIHRoZSBhc3luYyBvcHRpbWl6YXRpb24gaW4gY2FzZXMgd2hlcmUgZHJvcHBlZAotbWV0aG9kIGNhbGxzIGFyZSBhY2NlcHRhYmxlIG9yIHRoZSB0cmFuc3BvcnQgaXMga25vd24gdG8gYmUgcmVsaWFibGUuKQotCi1BbHNvIG9mIG5vdGUgaXMgdGhlIGZhY3QgdGhhdCBhcmd1bWVudCBsaXN0cyBhbmQgZXhjZXB0aW9uIGxpc3RzIGZvciBmdW5jdGlvbnMKLWFyZSBpbXBsZW1lbnRlZCBhcyBUaHJpZnQgc3RydWN0cy4gQWxsIHRocmVlIGNvbnN0cnVjdHMgYXJlIGlkZW50aWNhbCBpbiBib3RoCi1ub3RhdGlvbiBhbmQgYmVoYXZpb3IuCi0KLVxzZWN0aW9ue1RyYW5zcG9ydH0KLQotVGhlIHRyYW5zcG9ydCBsYXllciBpcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmYWNpbGl0YXRlIGRhdGEgdHJhbnNmZXIuCi0KLVxzdWJzZWN0aW9ue0ludGVyZmFjZX0KLQotQSBrZXkgZGVzaWduIGNob2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0IHdhcyB0byBkZWNvdXBsZSB0aGUKLXRyYW5zcG9ydCBsYXllciBmcm9tIHRoZSBjb2RlIGdlbmVyYXRpb24gbGF5ZXIuIFRob3VnaCBUaHJpZnQgaXMgdHlwaWNhbGx5Ci11c2VkIG9uIHRvcCBvZiB0aGUgVENQL0lQIHN0YWNrIHdpdGggc3RyZWFtaW5nIHNvY2tldHMgYXMgdGhlIGJhc2UgbGF5ZXIgb2YKLWNvbW11bmljYXRpb24sIHRoZXJlIHdhcyBubyBjb21wZWxsaW5nIHJlYXNvbiB0byBidWlsZCB0aGF0IGNvbnN0cmFpbnQgaW50bwotdGhlIHN5c3RlbS4gVGhlIHBlcmZvcm1hbmNlIHRyYWRlb2ZmIGluY3VycmVkIGJ5IGFuIGFic3RyYWN0ZWQgSS9PIGxheWVyCi0ocm91Z2hseSBvbmUgdmlydHVhbCBtZXRob2QgbG9va3VwIC8gZnVuY3Rpb24gY2FsbCBwZXIgb3BlcmF0aW9uKSB3YXMKLWltbWF0ZXJpYWwgY29tcGFyZWQgdG8gdGhlIGNvc3Qgb2YgYWN0dWFsIEkvTyBvcGVyYXRpb25zICh0eXBpY2FsbHkgaW52b2tpbmcKLXN5c3RlbSBjYWxscykuCi0KLUZ1bmRhbWVudGFsbHksIGdlbmVyYXRlZCBUaHJpZnQgY29kZSBvbmx5IG5lZWRzIHRvIGtub3cgaG93IHRvIHJlYWQgYW5kCi13cml0ZSBkYXRhLiBUaGUgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBvZiB0aGUgZGF0YSBhcmUgaXJyZWxldmFudDsgaXQgbWF5IGJlIGEKLXNvY2tldCwgYSBzZWdtZW50IG9mIHNoYXJlZCBtZW1vcnksIG9yIGEgZmlsZSBvbiB0aGUgbG9jYWwgZGlzay4gVGhlIFRocmlmdAotdHJhbnNwb3J0IGludGVyZmFjZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnBzb3J0Ci1caXRlbSBcdGV4dHR0e2Nsb3NlfSBDbG9zZXMgdGhlIHRyYW5wb3J0Ci1caXRlbSBcdGV4dHR0e2lzT3Blbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCi1caXRlbSBcdGV4dHR0e3JlYWR9IFJlYWRzIGZyb20gdGhlIHRyYW5zcG9ydAotXGl0ZW0gXHRleHR0dHt3cml0ZX0gV3JpdGVzIHRvIHRoZSB0cmFuc3BvcnQKLVxpdGVtIFx0ZXh0dHR7Zmx1c2h9IEZvcmNlcyBhbnkgcGVuZGluZyB3cml0ZXMKLVxlbmR7aXRlbWl6ZX0KLQotVGhlcmUgYXJlIGEgZmV3IGFkZGl0aW9uYWwgbWV0aG9kcyBub3QgZG9jdW1lbnRlZCBoZXJlIHdoaWNoIGFyZSB1c2VkIHRvIGFpZAotaW4gYmF0Y2hpbmcgcmVhZHMgYW5kIG9wdGlvbmFsbHkgc2lnbmFsaW5nIHRoZSBjb21wbGV0aW9uIG9mIGEgcmVhZCBvcgotd3JpdGUgb3BlcmF0aW9uIGZyb20gdGhlIGdlbmVyYXRlZCBjb2RlLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUKLVx0ZXh0dHR7VFRyYW5zcG9ydH0gaW50ZXJmYWNlLCB0aGVyZSBpcyBhXFwKLVx0ZXh0dHR7VFNlcnZlclRyYW5zcG9ydH0gaW50ZXJmYWNlCi11c2VkIHRvIGFjY2VwdCBvciBjcmVhdGUgcHJpbWl0aXZlIHRyYW5zcG9ydCBvYmplY3RzLiBJdHMgaW50ZXJmYWNlIGlzIGFzCi1mb2xsb3dzOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFx0ZXh0dHR7b3Blbn0gT3BlbnMgdGhlIHRyYW5zcG9ydAotXGl0ZW0gXHRleHR0dHtsaXN0ZW59IEJlZ2lucyBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zCi1caXRlbSBcdGV4dHR0e2FjY2VwdH0gUmV0dXJucyBhIG5ldyBjbGllbnQgdHJhbnNwb3J0Ci1caXRlbSBcdGV4dHR0e2Nsb3NlfSBDbG9zZXMgdGhlIHRyYW5zcG9ydAotXGVuZHtpdGVtaXplfQotCi1cc3Vic2VjdGlvbntJbXBsZW1lbnRhdGlvbn0KLQotVGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgZm9yIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBpbiBhbnkKLXByb2dyYW1taW5nIGxhbmd1YWdlLiBOZXcgdHJhbnNwb3J0IG1lY2hhbmlzbXMgY2FuIGJlIGVhc2lseSBkZWZpbmVkIGFzIG5lZWRlZAotYnkgYXBwbGljYXRpb24gZGV2ZWxvcGVycy4KLQotXHN1YnN1YnNlY3Rpb257VFNvY2tldH0KLQotVGhlIFx0ZXh0dHR7VFNvY2tldH0gY2xhc3MgaXMgaW1wbGVtZW50ZWQgYWNyb3NzIGFsbCB0YXJnZXQgbGFuZ3VhZ2VzLiBJdAotcHJvdmlkZXMgYSBjb21tb24sIHNpbXBsZSBpbnRlcmZhY2UgdG8gYSBUQ1AvSVAgc3RyZWFtIHNvY2tldC4KLQotXHN1YnN1YnNlY3Rpb257VEZpbGVUcmFuc3BvcnR9Ci0KLVRoZSBcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhbiBvbi1kaXNrIGZpbGUgdG8gYSBkYXRhCi1zdHJlYW0uIEl0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIG91dCBhIHNldCBvZiBpbmNvbWluZyBUaHJpZnQgcmVxdWVzdHMgdG8gYSBmaWxlCi1vbiBkaXNrLiBUaGUgb24tZGlzayBkYXRhIGNhbiB0aGVuIGJlIHJlcGxheWVkIGZyb20gdGhlIGxvZywgZWl0aGVyIGZvcgotcG9zdC1wcm9jZXNzaW5nIG9yIGZvciByZXByb2R1Y3Rpb24gYW5kL29yIHNpbXVsYXRpb24gb2YgcGFzdCBldmVudHMuCi0KLVxzdWJzdWJzZWN0aW9ue1V0aWxpdGllc30KLQotVGhlIFRyYW5zcG9ydCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBlYXN5IGV4dGVuc2lvbiB1c2luZyBjb21tb24KLU9PUCB0ZWNobmlxdWVzLCBzdWNoIGFzIGNvbXBvc2l0aW9uLiBTb21lIHNpbXBsZSB1dGlsaXRlcyBpbmNsdWRlIHRoZQotXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnR9LCB3aGljaCBidWZmZXJzIHRoZSB3cml0ZXMgYW5kIHJlYWRzIG9uIGFuCi11bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlIFx0ZXh0dHR7VEZyYW1lZFRyYW5zcG9ydH0sIHdoaWNoIHRyYW5zbWl0cyBkYXRhIHdpdGggZnJhbWUKLXNpemUgaGVhZGVycyBmb3IgY2h1bmtpbmcgb3B0aW1pemF0aW9uIG9yIG5vbmJsb2NraW5nIG9wZXJhdGlvbiwgYW5kIHRoZQotXHRleHR0dHtUTWVtb3J5QnVmZmVyfSwgd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZGlyZWN0bHkgZnJvbSB0aGUgaGVhcAotb3Igc3RhY2sgbWVtb3J5IG93bmVkIGJ5IHRoZSBwcm9jZXNzLgotCi1cc2VjdGlvbntQcm90b2NvbH0KLQotQSBzZWNvbmQgbWFqb3IgYWJzdHJhY3Rpb24gaW4gVGhyaWZ0IGlzIHRoZSBzZXBhcmF0aW9uIG9mIGRhdGEgc3RydWN0dXJlIGZyb20KLXRyYW5zcG9ydCByZXByZXNlbnRhdGlvbi4gVGhyaWZ0IGVuZm9yY2VzIGEgY2VydGFpbiBtZXNzYWdpbmcgc3RydWN0dXJlIHdoZW4KLXRyYW5zcG9ydGluZyBkYXRhLCBidXQgaXQgaXMgYWdub3N0aWMgdG8gdGhlIHByb3RvY29sIGVuY29kaW5nIGluIHVzZS4gVGhhdCBpcywKLWl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIGRhdGEgaXMgZW5jb2RlZCBhcyBYTUwsIGh1bWFuLXJlYWRhYmxlIEFTQ0lJLCBvciBhCi1kZW5zZSBiaW5hcnkgZm9ybWF0IGFzIGxvbmcgYXMgdGhlIGRhdGEgc3VwcG9ydHMgYSBmaXhlZCBzZXQgb2Ygb3BlcmF0aW9ucwotdGhhdCBhbGxvdyBpdCB0byBiZSBkZXRlcm1pbmlzdGljYWxseSByZWFkIGFuZCB3cml0dGVuIGJ5IGdlbmVyYXRlZCBjb2RlLgotCi1cc3Vic2VjdGlvbntJbnRlcmZhY2V9Ci0KLVRoZSBUaHJpZnQgUHJvdG9jb2wgaW50ZXJmYWNlIGlzIHZlcnkgc3RyYWlnaHRmb3J3YXJkLiBJdCBmdW5kYW1lbnRhbGx5Ci1zdXBwb3J0cyB0d28gdGhpbmdzOiAxKSBiaWRpcmVjdGlvbmFsIHNlcXVlbmNlZCBtZXNzYWdpbmcsIGFuZAotMikgZW5jb2Rpbmcgb2YgYmFzZSB0eXBlcywgY29udGFpbmVycywgYW5kIHN0cnVjdHMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXdyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcSkKLXdyaXRlTWVzc2FnZUVuZCgpCi13cml0ZVN0cnVjdEJlZ2luKG5hbWUpCi13cml0ZVN0cnVjdEVuZCgpCi13cml0ZUZpZWxkQmVnaW4obmFtZSwgdHlwZSwgaWQpCi13cml0ZUZpZWxkRW5kKCkKLXdyaXRlRmllbGRTdG9wKCkKLXdyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQotd3JpdGVNYXBFbmQoKQotd3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCi13cml0ZUxpc3RFbmQoKQotd3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKLXdyaXRlU2V0RW5kKCkKLXdyaXRlQm9vbChib29sKQotd3JpdGVCeXRlKGJ5dGUpCi13cml0ZUkxNihpMTYpCi13cml0ZUkzMihpMzIpCi13cml0ZUk2NChpNjQpCi13cml0ZURvdWJsZShkb3VibGUpCi13cml0ZVN0cmluZyhzdHJpbmcpCi0KLW5hbWUsIHR5cGUsIHNlcSA9IHJlYWRNZXNzYWdlQmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZE1lc3NhZ2VFbmQoKQotbmFtZSA9ICAgICAgICAgICAgcmVhZFN0cnVjdEJlZ2luKCkKLSAgICAgICAgICAgICAgICAgIHJlYWRTdHJ1Y3RFbmQoKQotbmFtZSwgdHlwZSwgaWQgPSAgcmVhZEZpZWxkQmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZEZpZWxkRW5kKCkKLWssIHYsIHNpemUgPSAgICAgIHJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkTWFwRW5kKCkKLWV0eXBlLCBzaXplID0gICAgIHJlYWRMaXN0QmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZExpc3RFbmQoKQotZXR5cGUsIHNpemUgPSAgICAgcmVhZFNldEJlZ2luKCkKLSAgICAgICAgICAgICAgICAgIHJlYWRTZXRFbmQoKQotYm9vbCA9ICAgICAgICAgICAgcmVhZEJvb2woKQotYnl0ZSA9ICAgICAgICAgICAgcmVhZEJ5dGUoKQotaTE2ID0gICAgICAgICAgICAgcmVhZEkxNigpCi1pMzIgPSAgICAgICAgICAgICByZWFkSTMyKCkKLWk2NCA9ICAgICAgICAgICAgIHJlYWRJNjQoKQotZG91YmxlID0gICAgICAgICAgcmVhZERvdWJsZSgpCi1zdHJpbmcgPSAgICAgICAgICByZWFkU3RyaW5nKCkKLVxlbmR7dmVyYmF0aW19Ci0KLU5vdGUgdGhhdCBldmVyeSBcdGV4dHR0e3dyaXRlfSBmdW5jdGlvbiBoYXMgZXhhY3RseSBvbmUgXHRleHR0dHtyZWFkfSBjb3VudGVycGFydCwgd2l0aAotdGhlIGV4Y2VwdGlvbiBvZiBcdGV4dHR0e3dyaXRlRmllbGRTdG9wKCl9LiBUaGlzIGlzIGEgc3BlY2lhbCBtZXRob2QKLXRoYXQgc2lnbmFscyB0aGUgZW5kIG9mIGEgc3RydWN0LiBUaGUgcHJvY2VkdXJlIGZvciByZWFkaW5nIGEgc3RydWN0IGlzIHRvCi1cdGV4dHR0e3JlYWRGaWVsZEJlZ2luKCl9IHVudGlsIHRoZSBzdG9wIGZpZWxkIGlzIGVuY291bnRlcmVkLCBhbmQgdGhlbiB0bwotXHRleHR0dHtyZWFkU3RydWN0RW5kKCl9LiAgVGhlCi1nZW5lcmF0ZWQgY29kZSByZWxpZXMgdXBvbiB0aGlzIGNhbGwgc2VxdWVuY2UgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyB3cml0dGVuIGJ5Ci1hIHByb3RvY29sIGVuY29kZXIgY2FuIGJlIHJlYWQgYnkgYSBtYXRjaGluZyBwcm90b2NvbCBkZWNvZGVyLiBGdXJ0aGVyIG5vdGUKLXRoYXQgdGhpcyBzZXQgb2YgZnVuY3Rpb25zIGlzIGJ5IGRlc2lnbiBtb3JlIHJvYnVzdCB0aGFuIG5lY2Vzc2FyeS4KLUZvciBleGFtcGxlLCBcdGV4dHR0e3dyaXRlU3RydWN0RW5kKCl9IGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGFzIHRoZSBlbmQgb2YKLWEgc3RydWN0IG1heSBiZSBpbXBsaWVkIGJ5IHRoZSBzdG9wIGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIGZvcgotdmVyYm9zZSBwcm90b2NvbHMgaW4gd2hpY2ggaXQgaXMgY2xlYW5lciB0byBzZXBhcmF0ZSB0aGVzZSBjYWxscyAoZS5nLiBhIGNsb3NpbmcKLVx0ZXh0dHR7PC9zdHJ1Y3Q+fSB0YWcgaW4gWE1MKS4KLQotXHN1YnNlY3Rpb257U3RydWN0dXJlfQotCi1UaHJpZnQgc3RydWN0dXJlcyBhcmUgZGVzaWduZWQgdG8gc3VwcG9ydCBlbmNvZGluZyBpbnRvIGEgc3RyZWFtaW5nCi1wcm90b2NvbC4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBuZXZlciBuZWVkIHRvIGZyYW1lIG9yIGNvbXB1dGUgdGhlCi1lbnRpcmUgZGF0YSBsZW5ndGggb2YgYSBzdHJ1Y3R1cmUgcHJpb3IgdG8gZW5jb2RpbmcgaXQuIFRoaXMgaXMgY3JpdGljYWwgdG8KLXBlcmZvcm1hbmNlIGluIG1hbnkgc2NlbmFyaW9zLiBDb25zaWRlciBhIGxvbmcgbGlzdCBvZiByZWxhdGl2ZWx5IGxhcmdlCi1zdHJpbmdzLiBJZiB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIHJlcXVpcmVkIHJlYWRpbmcgb3Igd3JpdGluZyBhIGxpc3QgdG8gYmUgYW4KLWF0b21pYyBvcGVyYXRpb24sIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIG5lZWQgdG8gcGVyZm9ybSBhIGxpbmVhciBwYXNzIG92ZXIgdGhlCi1lbnRpcmUgbGlzdCBiZWZvcmUgZW5jb2RpbmcgYW55IGRhdGEuIEhvd2V2ZXIsIGlmIHRoZSBsaXN0IGNhbiBiZSB3cml0dGVuCi1hcyBpdGVyYXRpb24gaXMgcGVyZm9ybWVkLCB0aGUgY29ycmVzcG9uZGluZyByZWFkIG1heSBiZWdpbiBpbiBwYXJhbGxlbCwKLXRoZW9yZXRpY2FsbHkgb2ZmZXJpbmcgYW4gZW5kLXRvLWVuZCBzcGVlZHVwIG9mICQoa04gLSBDKSQsIHdoZXJlICROJCBpcyB0aGUgc2l6ZQotb2YgdGhlIGxpc3QsICRrJCB0aGUgY29zdCBmYWN0b3IgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nIGEgc2luZ2xlCi1lbGVtZW50LCBhbmQgJEMkIGlzIGZpeGVkIG9mZnNldCBmb3IgdGhlIGRlbGF5IGJldHdlZW4gZGF0YSBiZWluZyB3cml0dGVuCi1hbmQgYmVjb21pbmcgYXZhaWxhYmxlIHRvIHJlYWQuCi0KLVNpbWlsYXJseSwgc3RydWN0cyBkbyBub3QgZW5jb2RlIHRoZWlyIGRhdGEgbGVuZ3RocyBhIHByaW9yaS4gSW5zdGVhZCwgdGhleSBhcmUKLWVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBmaWVsZHMsIHdpdGggZWFjaCBmaWVsZCBoYXZpbmcgYSB0eXBlIHNwZWNpZmllciBhbmQgYQotdW5pcXVlIGZpZWxkIGlkZW50aWZpZXIuIE5vdGUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHR5cGUgc3BlY2lmaWVycyBhbGxvd3MKLXRoZSBwcm90b2NvbCB0byBiZSBzYWZlbHkgcGFyc2VkIGFuZCBkZWNvZGVkIHdpdGhvdXQgYW55IGdlbmVyYXRlZCBjb2RlCi1vciBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIElETCBmaWxlLiBTdHJ1Y3RzIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgZmllbGQgaGVhZGVyCi13aXRoIGEgc3BlY2lhbCBcdGV4dHR0e1NUT1B9IHR5cGUuIEJlY2F1c2UgYWxsIHRoZSBiYXNpYyB0eXBlcyBjYW4gYmUgcmVhZAotZGV0ZXJtaW5pc3RpY2FsbHksIGFsbCBzdHJ1Y3RzIChldmVuIHRob3NlIGNvbnRhaW5pbmcgb3RoZXIgc3RydWN0cykgY2FuIGJlCi1yZWFkIGRldGVybWluaXN0aWNhbGx5LiBUaGUgVGhyaWZ0IHByb3RvY29sIGlzIHNlbGYtZGVsaW1pdGluZyB3aXRob3V0IGFueQotZnJhbWluZyBhbmQgcmVnYXJkbGVzcyBvZiB0aGUgZW5jb2RpbmcgZm9ybWF0LgotCi1JbiBzaXR1YXRpb25zIHdoZXJlIHN0cmVhbWluZyBpcyB1bm5lY2Vzc2FyeSBvciBmcmFtaW5nIGlzIGFkdmFudGFnZW91cywgaXQKLWNhbiBiZSB2ZXJ5IHNpbXBseSBhZGRlZCBpbnRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIsIHVzaW5nIHRoZQotXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSBhYnN0cmFjdGlvbi4KLQotXHN1YnNlY3Rpb257SW1wbGVtZW50YXRpb259Ci0KLUZhY2Vib29rIGhhcyBpbXBsZW1lbnRlZCBhbmQgZGVwbG95ZWQgYSBzcGFjZS1lZmZpY2llbnQgYmluYXJ5IHByb3RvY29sIHdoaWNoCi1pcyB1c2VkIGJ5IG1vc3QgYmFja2VuZCBzZXJ2aWNlcy4gRXNzZW50aWFsbHksIGl0IHdyaXRlcyBhbGwgZGF0YQotaW4gYSBmbGF0IGJpbmFyeSBmb3JtYXQuIEludGVnZXIgdHlwZXMgYXJlIGNvbnZlcnRlZCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIsCi1zdHJpbmdzIGFyZSBwcmVwZW5kZWQgd2l0aCB0aGVpciBieXRlIGxlbmd0aCwgYW5kIGFsbCBtZXNzYWdlIGFuZCBmaWVsZCBoZWFkZXJzCi1hcmUgd3JpdHRlbiB1c2luZyB0aGUgcHJpbWl0aXZlIGludGVnZXIgc2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzLiBTdHJpbmcgbmFtZXMKLWZvciBmaWVsZHMgYXJlIG9taXR0ZWQgLSB3aGVuIHVzaW5nIGdlbmVyYXRlZCBjb2RlLCBmaWVsZCBpZGVudGlmaWVycyBhcmUKLXN1ZmZpY2llbnQuCi0KLVdlIGRlY2lkZWQgYWdhaW5zdCBzb21lIGV4dHJlbWUgc3RvcmFnZSBvcHRpbWl6YXRpb25zIChpLmUuIHBhY2tpbmcKLXNtYWxsIGludGVnZXJzIGludG8gQVNDSUkgb3IgdXNpbmcgYSA3LWJpdCBjb250aW51YXRpb24gZm9ybWF0KSBmb3IgdGhlIHNha2UKLW9mIHNpbXBsaWNpdHkgYW5kIGNsYXJpdHkgaW4gdGhlIGNvZGUuIFRoZXNlIGFsdGVyYXRpb25zIGNhbiBlYXNpbHkgYmUgbWFkZQotaWYgYW5kIHdoZW4gd2UgZW5jb3VudGVyIGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgdXNlIGNhc2UgdGhhdCBkZW1hbmRzIHRoZW0uCi0KLVxzZWN0aW9ue1ZlcnNpb25pbmd9Ci0KLVRocmlmdCBpcyByb2J1c3QgaW4gdGhlIGZhY2Ugb2YgdmVyc2lvbmluZyBhbmQgZGF0YSBkZWZpbml0aW9uIGNoYW5nZXMuIFRoaXMKLWlzIGNyaXRpY2FsIHRvIGVuYWJsZSBzdGFnZWQgcm9sbG91dHMgb2YgY2hhbmdlcyB0byBkZXBsb3llZCBzZXJ2aWNlcy4gVGhlCi1zeXN0ZW0gbXVzdCBiZSBhYmxlIHRvIHN1cHBvcnQgcmVhZGluZyBvZiBvbGQgZGF0YSBmcm9tIGxvZyBmaWxlcywgYXMgd2VsbCBhcwotcmVxdWVzdHMgZnJvbSBvdXQtb2YtZGF0ZSBjbGllbnRzIHRvIG5ldyBzZXJ2ZXJzLCBhbmQgdmljZSB2ZXJzYS4KLQotXHN1YnNlY3Rpb257RmllbGQgSWRlbnRpZmllcnN9Ci0KLVZlcnNpb25pbmcgaW4gVGhyaWZ0IGlzIGltcGxlbWVudGVkIHZpYSBmaWVsZCBpZGVudGlmaWVycy4gVGhlIGZpZWxkIGhlYWRlcgotZm9yIGV2ZXJ5IG1lbWJlciBvZiBhIHN0cnVjdCBpbiBUaHJpZnQgaXMgZW5jb2RlZCB3aXRoIGEgdW5pcXVlIGZpZWxkCi1pZGVudGlmaWVyLiBUaGUgY29tYmluYXRpb24gb2YgdGhpcyBmaWVsZCBpZGVudGlmaWVyIGFuZCBpdHMgdHlwZSBzcGVjaWZpZXIKLWlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGZpZWxkLiBUaGUgVGhyaWZ0IGRlZmluaXRpb24gbGFuZ3VhZ2UKLXN1cHBvcnRzIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIGZpZWxkIGlkZW50aWZpZXJzLCBidXQgaXQgaXMgZ29vZAotcHJvZ3JhbW1pbmcgcHJhY3RpY2UgdG8gYWx3YXlzIGV4cGxpY2l0bHkgc3BlY2lmeSBmaWVsZCBpZGVudGlmaWVycy4KLUlkZW50aWZpZXJzIGFyZSBzcGVjaWZpZWQgYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotc3RydWN0IEV4YW1wbGUgewotICAxOmkzMiBudW1iZXI9MTAsCi0gIDI6aTY0IGJpZ051bWJlciwKLSAgMzpkb3VibGUgZGVjaW1hbHMsCi0gIDQ6c3RyaW5nIG5hbWU9InRocmlmdHkiCi19XGVuZHt2ZXJiYXRpbX0KLQotVG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gbWFudWFsbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWRlbnRpZmllcnMsCi1maWVsZHMgd2l0aCBpZGVudGlmaWVycyBvbWl0dGVkIGFyZSBhc3NpZ25lZCBpZGVudGlmaWVycwotZGVjcmVtZW50aW5nIGZyb20gLTEsIGFuZCB0aGUgbGFuZ3VhZ2Ugb25seSBzdXBwb3J0cyB0aGUgbWFudWFsIGFzc2lnbm1lbnQgb2YKLXBvc2l0aXZlIGlkZW50aWZpZXJzLgotCi1XaGVuIGRhdGEgaXMgYmVpbmcgZGVzZXJpYWxpemVkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIHVzZSB0aGVzZSBpZGVudGlmaWVycwotdG8gcHJvcGVybHkgaWRlbnRpZnkgdGhlIGZpZWxkIGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBhbGlnbnMgd2l0aCBhIGZpZWxkIGluCi1pdHMgZGVmaW5pdGlvbiBmaWxlLiBJZiBhIGZpZWxkIGlkZW50aWZpZXIgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBnZW5lcmF0ZWQKLWNvZGUgY2FuIHVzZSB0aGUgdHlwZSBzcGVjaWZpZXIgdG8gc2tpcCB0aGUgdW5rbm93biBmaWVsZCB3aXRob3V0IGFueSBlcnJvci4KLUFnYWluLCB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGFsbCBkYXRhdHlwZXMgYXJlIHNlbGYKLWRlbGltaXRpbmcuCi0KLUZpZWxkIGlkZW50aWZpZXJzIGNhbiAoYW5kIHNob3VsZCkgYWxzbyBiZSBzcGVjaWZpZWQgaW4gZnVuY3Rpb24gYXJndW1lbnQKLWxpc3RzLiBJbiBmYWN0LCBhcmd1bWVudCBsaXN0cyBhcmUgbm90IG9ubHkgcmVwcmVzZW50ZWQgYXMgc3RydWN0cyBvbiB0aGUKLWJhY2tlbmQsIGJ1dCBhY3R1YWxseSBzaGFyZSB0aGUgc2FtZSBjb2RlIGluIHRoZSBjb21waWxlciBmcm9udGVuZC4gVGhpcwotYWxsb3dzIGZvciB2ZXJzaW9uLXNhZmUgbW9kaWZpY2F0aW9uIG9mIG1ldGhvZCBwYXJhbWV0ZXJzCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNlcnZpY2UgU3RyaW5nQ2FjaGUgewotICB2b2lkIHNldCgxOmkzMiBrZXksIDI6c3RyaW5nIHZhbHVlKSwKLSAgc3RyaW5nIGdldCgxOmkzMiBrZXkpIHRocm93cyAoMTpLZXlOb3RGb3VuZCBrbmYpLAotICB2b2lkIGRlbGV0ZSgxOmkzMiBrZXkpCi19Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGUgc3ludGF4IGZvciBzcGVjaWZ5aW5nIGZpZWxkIGlkZW50aWZpZXJzIHdhcyBjaG9zZW4gdG8gZWNobyB0aGVpciBzdHJ1Y3R1cmUuCi1TdHJ1Y3RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgZGljdGlvbmFyeSB3aGVyZSB0aGUgaWRlbnRpZmllcnMgYXJlIGtleXMsIGFuZAotdGhlIHZhbHVlcyBhcmUgc3Ryb25nbHktdHlwZWQgbmFtZWQgZmllbGRzLgotCi1GaWVsZCBpZGVudGlmaWVycyBpbnRlcm5hbGx5IHVzZSB0aGUgXHRleHR0dHtpMTZ9IFRocmlmdCB0eXBlLiBOb3RlLCBob3dldmVyLAotdGhhdCB0aGUgXHRleHR0dHtUUHJvdG9jb2x9IGFic3RyYWN0aW9uIG1heSBlbmNvZGUgaWRlbnRpZmllcnMgaW4gYW55IGZvcm1hdC4KLQotXHN1YnNlY3Rpb257SXNzZXR9Ci0KLVdoZW4gYW4gdW5leHBlY3RlZCBmaWVsZCBpcyBlbmNvdW50ZXJlZCwgaXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIGFuZAotZGlzY2FyZGVkLiBXaGVuIGFuIGV4cGVjdGVkIGZpZWxkIGlzIG5vdCBmb3VuZCwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSB0bwotc2lnbmFsIHRvIHRoZSBkZXZlbG9wZXIgdGhhdCBpdCB3YXMgbm90IHByZXNlbnQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdmlhIGFuCi1pbm5lciBcdGV4dHR0e2lzc2V0fSBzdHJ1Y3R1cmUgaW5zaWRlIHRoZSBkZWZpbmVkIG9iamVjdHMuIChJc3NldCBmdW5jdGlvbmFsaXR5Ci1pcyBpbXBsaWNpdCB3aXRoIGEgXHRleHR0dHtudWxsfSB2YWx1ZSBpbiBQSFAsIFx0ZXh0dHR7Tm9uZX0gaW4gUHl0aG9uCi1hbmQgXHRleHR0dHtuaWx9IGluIFJ1YnkuKSBFc3NlbnRpYWxseSwKLXRoZSBpbm5lciBcdGV4dHR0e2lzc2V0fSBvYmplY3Qgb2YgZWFjaCBUaHJpZnQgc3RydWN0IGNvbnRhaW5zIGEgYm9vbGVhbiB2YWx1ZQotZm9yIGVhY2ggZmllbGQgd2hpY2ggZGVub3RlcyB3aGV0aGVyIG9yIG5vdCB0aGF0IGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlCi1zdHJ1Y3QuIFdoZW4gYSByZWFkZXIgcmVjZWl2ZXMgYSBzdHJ1Y3QsIGl0IHNob3VsZCBjaGVjayBmb3IgYSBmaWVsZCBiZWluZyBzZXQKLWJlZm9yZSBvcGVyYXRpbmcgZGlyZWN0bHkgb24gaXQuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIEV4YW1wbGUgewotIHB1YmxpYzoKLSAgRXhhbXBsZSgpIDoKLSAgICBudW1iZXIoMTApLAotICAgIGJpZ051bWJlcigwKSwKLSAgICBkZWNpbWFscygwKSwKLSAgICBuYW1lKCJ0aHJpZnR5Iikge30KLQotICBpbnQzMl90IG51bWJlcjsKLSAgaW50NjRfdCBiaWdOdW1iZXI7Ci0gIGRvdWJsZSBkZWNpbWFsczsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLQotICBzdHJ1Y3QgX19pc3NldCB7Ci0gICAgX19pc3NldCgpIDoKLSAgICAgIG51bWJlcihmYWxzZSksCi0gICAgICBiaWdOdW1iZXIoZmFsc2UpLAotICAgICAgZGVjaW1hbHMoZmFsc2UpLAotICAgICAgbmFtZShmYWxzZSkge30KLSAgICBib29sIG51bWJlcjsKLSAgICBib29sIGJpZ051bWJlcjsKLSAgICBib29sIGRlY2ltYWxzOwotICAgIGJvb2wgbmFtZTsKLSAgfSBfX2lzc2V0OwotLi4uCi19Ci1cZW5ke3ZlcmJhdGltfQotCi1cc3Vic2VjdGlvbntDYXNlIEFuYWx5c2lzfQotCi1UaGVyZSBhcmUgZm91ciBjYXNlcyBpbiB3aGljaCB2ZXJzaW9uIG1pc21hdGNoZXMgbWF5IG9jY3VyLgotCi1cYmVnaW57ZW51bWVyYXRlfQotXGl0ZW0gXHRleHRpdHtBZGRlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAotY2xpZW50IGRvZXMgbm90IHNlbmQgdGhlIG5ldyBmaWVsZC4gVGhlIG5ldyBzZXJ2ZXIgcmVjb2duaXplcyB0aGF0IHRoZSBmaWVsZAotaXMgbm90IHNldCwgYW5kIGltcGxlbWVudHMgZGVmYXVsdCBiZWhhdmlvciBmb3Igb3V0LW9mLWRhdGUgcmVxdWVzdHMuCi1caXRlbSBcdGV4dGl0e1JlbW92ZWQgZmllbGQsIG9sZCBjbGllbnQsIG5ldyBzZXJ2ZXIufSBJbiB0aGlzIGNhc2UsIHRoZSBvbGQKLWNsaWVudCBzZW5kcyB0aGUgcmVtb3ZlZCBmaWVsZC4gVGhlIG5ldyBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMgaXQuCi1caXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhlIG5ldyBjbGllbnQgc2VuZHMgYQotZmllbGQgdGhhdCB0aGUgb2xkIHNlcnZlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoZSBvbGQgc2VydmVyIHNpbXBseSBpZ25vcmVzCi1pdCBhbmQgcHJvY2Vzc2VzIGFzIG5vcm1hbC4KLVxpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgbmV3IGNsaWVudCwgb2xkIHNlcnZlci59IFRoaXMgaXMgdGhlIG1vc3QKLWRhbmdlcm91cyBjYXNlLCBhcyB0aGUgb2xkIHNlcnZlciBpcyB1bmxpa2VseSB0byBoYXZlIHN1aXRhYmxlIGRlZmF1bHQKLWJlaGF2aW9yIGltcGxlbWVudGVkIGZvciB0aGUgbWlzc2luZyBmaWVsZC4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbiB0aGlzCi1zaXR1YXRpb24gdGhlIG5ldyBzZXJ2ZXIgYmUgcm9sbGVkIG91dCBwcmlvciB0byB0aGUgbmV3IGNsaWVudHMuCi1cZW5ke2VudW1lcmF0ZX0KLQotXHN1YnNlY3Rpb257UHJvdG9jb2wvVHJhbnNwb3J0IFZlcnNpb25pbmd9Ci1UaGUgXHRleHR0dHtUUHJvdG9jb2x9IGFic3RyYWN0aW9ucyBhcmUgYWxzbyBkZXNpZ25lZCB0byBnaXZlIHByb3RvY29sCi1pbXBsZW1lbnRhdGlvbnMgdGhlIGZyZWVkb20gdG8gdmVyc2lvbiB0aGVtc2VsdmVzIGluIHdoYXRldmVyIG1hbm5lciB0aGV5Ci1zZWUgZml0LiBTcGVjaWZpY2FsbHksIGFueSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHNlbmQgd2hhdGV2ZXIKLWl0IGxpa2VzIGluIHRoZSBcdGV4dHR0e3dyaXRlTWVzc2FnZUJlZ2luKCl9IGNhbGwuIEl0IGlzIGVudGlyZWx5IHVwIHRvIHRoZQotaW1wbGVtZW50b3IgaG93IHRvIGhhbmRsZSB2ZXJzaW9uaW5nIGF0IHRoZSBwcm90b2NvbCBsZXZlbC4gVGhlIGtleSBwb2ludCBpcwotdGhhdCBwcm90b2NvbCBlbmNvZGluZyBjaGFuZ2VzIGFyZSBzYWZlbHkgaXNvbGF0ZWQgZnJvbSBpbnRlcmZhY2UgZGVmaW5pdGlvbgotdmVyc2lvbiBjaGFuZ2VzLgotCi1Ob3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgaXMgdHJ1ZSBvZiB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuIEZvcgotZXhhbXBsZSwgaWYgd2Ugd2lzaGVkIHRvIGFkZCBzb21lIG5ldyBjaGVja3N1bW1pbmcgb3IgZXJyb3IgZGV0ZWN0aW9uIHRvIHRoZQotXHRleHR0dHtURmlsZVRyYW5zcG9ydH0sIHdlIGNvdWxkIHNpbXBseSBhZGQgYSB2ZXJzaW9uIGhlYWRlciBpbnRvIHRoZQotZGF0YSBpdCB3cml0ZXMgdG8gdGhlIGZpbGUgaW4gc3VjaCBhIHdheSB0aGF0IGl0IHdvdWxkIHN0aWxsIGFjY2VwdCBvbGQKLWxvZyBmaWxlcyB3aXRob3V0IHRoZSBnaXZlbiBoZWFkZXIuCi0KLVxzZWN0aW9ue1JQQyBJbXBsZW1lbnRhdGlvbn0KLQotXHN1YnNlY3Rpb257VFByb2Nlc3Nvcn0KLQotVGhlIGxhc3QgY29yZSBpbnRlcmZhY2UgaW4gdGhlIFRocmlmdCBkZXNpZ24gaXMgdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0sCi1wZXJoYXBzIHRoZSBtb3N0IHNpbXBsZSBvZiB0aGUgY29uc3RydWN0cy4gVGhlIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1pbnRlcmZhY2UgVFByb2Nlc3NvciB7Ci0gIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpCi0gICAgdGhyb3dzIFRFeGNlcHRpb24KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBrZXkgZGVzaWduIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBjb21wbGV4IHN5c3RlbXMgd2UgYnVpbGQgY2FuIGZ1bmRhbWVudGFsbHkKLWJlIGJyb2tlbiBkb3duIGludG8gYWdlbnRzIG9yIHNlcnZpY2VzIHRoYXQgb3BlcmF0ZSBvbiBpbnB1dHMgYW5kIG91dHB1dHMuIEluCi1tb3N0IGNhc2VzLCB0aGVyZSBpcyBhY3R1YWxseSBqdXN0IG9uZSBpbnB1dCBhbmQgb3V0cHV0IChhbiBSUEMgY2xpZW50KSB0aGF0Ci1uZWVkcyBoYW5kbGluZy4KLQotXHN1YnNlY3Rpb257R2VuZXJhdGVkIENvZGV9Ci0KLVdoZW4gYSBzZXJ2aWNlIGlzIGRlZmluZWQsIHdlIGdlbmVyYXRlIGEKLVx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW5zdGFuY2UgY2FwYWJsZSBvZiBoYW5kbGluZyBSUEMgcmVxdWVzdHMgdG8gdGhhdCBzZXJ2aWNlLAotdXNpbmcgYSBmZXcgaGVscGVycy4gVGhlIGZ1bmRhbWVudGFsIHN0cnVjdHVyZSAoaWxsdXN0cmF0ZWQgaW4gcHNldWRvLUMrKykgaXMKLWFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLVNlcnZpY2UudGhyaWZ0Ci0gPT4gU2VydmljZS5jcHAKLSAgICAgaW50ZXJmYWNlIFNlcnZpY2VJZgotICAgICBjbGFzcyBTZXJ2aWNlQ2xpZW50IDogdmlydHVhbCBTZXJ2aWNlSWYKLSAgICAgICBUUHJvdG9jb2wgaW4KLSAgICAgICBUUHJvdG9jb2wgb3V0Ci0gICAgIGNsYXNzIFNlcnZpY2VQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCi0gICAgICAgU2VydmljZUlmIGhhbmRsZXIKLQotU2VydmljZUhhbmRsZXIuY3BwCi0gY2xhc3MgU2VydmljZUhhbmRsZXIgOiB2aXJ0dWFsIFNlcnZpY2VJZgotCi1UU2VydmVyLmNwcAotIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCwKLSAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRmYWN0b3J5LAotICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwZmFjdG9yeSkKLSBzZXJ2ZSgpCi1cZW5ke3ZlcmJhdGltfQotCi1Gcm9tIHRoZSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlLCB3ZSBnZW5lcmF0ZSB0aGUgdmlydHVhbCBzZXJ2aWNlIGludGVyZmFjZS4KLUEgY2xpZW50IGNsYXNzIGlzIGdlbmVyYXRlZCwgd2hpY2ggaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGFuZAotdXNlcyB0d28gXHRleHR0dHtUUHJvdG9jb2x9IGluc3RhbmNlcyB0byBwZXJmb3JtIHRoZSBJL08gb3BlcmF0aW9ucy4gVGhlCi1nZW5lcmF0ZWQgcHJvY2Vzc29yIGltcGxlbWVudHMgdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlLiBUaGUgZ2VuZXJhdGVkCi1jb2RlIGhhcyBhbGwgdGhlIGxvZ2ljIHRvIGhhbmRsZSBSUEMgaW52b2NhdGlvbnMgdmlhIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0KLWNhbGwsIGFuZCB0YWtlcyBhcyBhIHBhcmFtZXRlciBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBpbnRlcmZhY2UsIGFzCi1pbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyLgotCi1UaGUgdXNlciBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGluIHNlcGFyYXRlLAotbm9uLWdlbmVyYXRlZCBzb3VyY2UgY29kZS4KLQotXHN1YnNlY3Rpb257VFNlcnZlcn0KLQotRmluYWxseSwgdGhlIFRocmlmdCBjb3JlIGxpYnJhcmllcyBwcm92aWRlIGEgXHRleHR0dHtUU2VydmVyfSBhYnN0cmFjdGlvbi4KLVRoZSBcdGV4dHR0e1RTZXJ2ZXJ9IG9iamVjdCBnZW5lcmFsbHkgd29ya3MgYXMgZm9sbG93cy4KLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFNlcnZlclRyYW5zcG9ydH0gdG8gZ2V0IGEgXHRleHR0dHtUVHJhbnNwb3J0fQotXGl0ZW0gVXNlIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnRGYWN0b3J5fSB0byBvcHRpb25hbGx5IGNvbnZlcnQgdGhlIHByaW1pdGl2ZQotdHJhbnNwb3J0IGludG8gYSBzdWl0YWJsZSBhcHBsaWNhdGlvbiB0cmFuc3BvcnQgKHR5cGljYWxseSB0aGUKLVx0ZXh0dHR7VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeX0gaXMgdXNlZCBoZXJlKQotXGl0ZW0gVXNlIHRoZSBcdGV4dHR0e1RQcm90b2NvbEZhY3Rvcnl9IHRvIGNyZWF0ZSBhbiBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sCi1mb3IgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydH0KLVxpdGVtIEludm9rZSB0aGUgXHRleHR0dHtwcm9jZXNzKCl9IG1ldGhvZCBvZiB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBvYmplY3QKLVxlbmR7aXRlbWl6ZX0KLQotVGhlIGxheWVycyBhcmUgYXBwcm9wcmlhdGVseSBzZXBhcmF0ZWQgc3VjaCB0aGF0IHRoZSBzZXJ2ZXIgY29kZSBuZWVkcyB0byBrbm93Ci1ub3RoaW5nIGFib3V0IGFueSBvZiB0aGUgdHJhbnNwb3J0cywgZW5jb2RpbmdzLCBvciBhcHBsaWNhdGlvbnMgaW4gcGxheS4gVGhlCi1zZXJ2ZXIgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBhcm91bmQgY29ubmVjdGlvbiBoYW5kbGluZywgdGhyZWFkaW5nLCBldGMuCi13aGlsZSB0aGUgcHJvY2Vzc29yIGRlYWxzIHdpdGggUlBDLiBUaGUgb25seSBjb2RlIHdyaXR0ZW4gYnkgdGhlIGFwcGxpY2F0aW9uCi1kZXZlbG9wZXIgbGl2ZXMgaW4gdGhlIGRlZmluaXRpb25hbCBUaHJpZnQgZmlsZSBhbmQgdGhlIGludGVyZmFjZQotaW1wbGVtZW50YXRpb24uCi0KLUZhY2Vib29rIGhhcyBkZXBsb3llZCBtdWx0aXBsZSBcdGV4dHR0e1RTZXJ2ZXJ9IGltcGxlbWVudGF0aW9ucywgaW5jbHVkaW5nCi10aGUgc2luZ2xlLXRocmVhZGVkIFx0ZXh0dHR7VFNpbXBsZVNlcnZlcn0sIHRocmVhZC1wZXItY29ubmVjdGlvbgotXHRleHR0dHtUVGhyZWFkZWRTZXJ2ZXJ9LCBhbmQgdGhyZWFkLXBvb2xpbmcgXHRleHR0dHtUVGhyZWFkUG9vbFNlcnZlcn0uCi0KLVRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IGludGVyZmFjZSBpcyB2ZXJ5IGdlbmVyYWwgYnkgZGVzaWduLiBUaGVyZSBpcyBubwotcmVxdWlyZW1lbnQgdGhhdCBhIFx0ZXh0dHR7VFNlcnZlcn0gdGFrZSBhIGdlbmVyYXRlZCBcdGV4dHR0e1RQcm9jZXNzb3J9Ci1vYmplY3QuIFRocmlmdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB0byBlYXNpbHkgd3JpdGUgYW55IHR5cGUgb2YKLXNlcnZlciB0aGF0IG9wZXJhdGVzIG9uIFx0ZXh0dHR7VFByb3RvY29sfSBvYmplY3RzIChmb3IgaW5zdGFuY2UsIGEgc2VydmVyCi1jb3VsZCBzaW1wbHkgc3RyZWFtIGEgY2VydGFpbiB0eXBlIG9mIG9iamVjdCB3aXRob3V0IGFueSBhY3R1YWwgUlBDIG1ldGhvZAotaW52b2NhdGlvbikuCi0KLVxzZWN0aW9ue0ltcGxlbWVudGF0aW9uIERldGFpbHN9Ci1cc3Vic2VjdGlvbntUYXJnZXQgTGFuZ3VhZ2VzfQotVGhyaWZ0IGN1cnJlbnRseSBzdXBwb3J0cyBmaXZlIHRhcmdldCBsYW5ndWFnZXM6IEMrKywgSmF2YSwgUHl0aG9uLCBSdWJ5LCBhbmQKLVBIUC4gQXQgRmFjZWJvb2ssIHdlIGhhdmUgZGVwbG95ZWQgc2VydmVycyBwcmVkb21pbmFudGx5IGluIEMrKywgSmF2YSwgYW5kCi1QeXRob24uIFRocmlmdCBzZXJ2aWNlcyBpbXBsZW1lbnRlZCBpbiBQSFAgaGF2ZSBhbHNvIGJlZW4gZW1iZWRkZWQgaW50byB0aGUKLUFwYWNoZSB3ZWIgc2VydmVyLCBwcm92aWRpbmcgdHJhbnNwYXJlbnQgYmFja2VuZCBhY2Nlc3MgdG8gbWFueSBvZiBvdXIKLWZyb250ZW5kIGNvbnN0cnVjdHMgdXNpbmcgYSBcdGV4dHR0e1RIdHRwQ2xpZW50fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLVx0ZXh0dHR7VFRyYW5zcG9ydH0gaW50ZXJmYWNlLgotCi1UaG91Z2ggVGhyaWZ0IHdhcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgYW5kIHJvYnVzdAotdGhhbiB0eXBpY2FsIHdlYiB0ZWNobm9sb2dpZXMsIGFzIHdlIHdlcmUgZGVzaWduaW5nIG91ciBYTUwtYmFzZWQgUkVTVCB3ZWIKLXNlcnZpY2VzIEFQSSB3ZSBub3RpY2VkIHRoYXQgVGhyaWZ0IGNvdWxkIGJlIGVhc2lseSB1c2VkIHRvIGRlZmluZSBvdXIKLXNlcnZpY2UgaW50ZXJmYWNlLiBUaG91Z2ggd2UgZG8gbm90IGN1cnJlbnRseSBlbXBsb3kgU09BUCBlbnZlbG9wZXMgKGluIHRoZQotYXV0aG9ycycgb3BpbmlvbnMgdGhlcmUgaXMgYWxyZWFkeSBmYXIgdG9vIG11Y2ggcmVwZXRpdGl2ZSBlbnRlcnByaXNlIEphdmEKLXNvZnR3YXJlIHRvIGRvIHRoYXQgc29ydCBvZiB0aGluZyksIHdlIHdlcmUgYWJsZSB0byBxdWlja2x5IGV4dGVuZCBUaHJpZnQgdG8KLWdlbmVyYXRlIFhNTCBTY2hlbWEgRGVmaW5pdGlvbiBmaWxlcyBmb3Igb3VyIHNlcnZpY2UsIGFzIHdlbGwgYXMgYSBmcmFtZXdvcmsKLWZvciB2ZXJzaW9uaW5nIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2Ygb3VyIHdlYiBzZXJ2aWNlLiBUaG91Z2ggcHVibGljCi13ZWIgc2VydmljZXMgYXJlIGFkbWl0dGVkbHkgdGFuZ2VudGlhbCB0byBUaHJpZnQncyBjb3JlIHVzZSBjYXNlIGFuZCBkZXNpZ24sCi1UaHJpZnQgZmFjaWxpdGF0ZWQgcmFwaWQgaXRlcmF0aW9uIGFuZCBhZmZvcmRzIHVzIHRoZSBhYmlsaXR5IHRvIHF1aWNrbHkKLW1pZ3JhdGUgb3VyIGVudGlyZSBYTUwtYmFzZWQgd2ViIHNlcnZpY2Ugb250byBhIGhpZ2hlciBwZXJmb3JtYW5jZSBzeXN0ZW0KLXNob3VsZCB0aGUgbmVlZCBhcmlzZS4KLQotXHN1YnNlY3Rpb257R2VuZXJhdGVkIFN0cnVjdHN9Ci1XZSBtYWRlIGEgY29uc2Npb3VzIGRlY2lzaW9uIHRvIG1ha2Ugb3VyIGdlbmVyYXRlZCBzdHJ1Y3RzIGFzIHRyYW5zcGFyZW50IGFzCi1wb3NzaWJsZS4gQWxsIGZpZWxkcyBhcmUgcHVibGljbHkgYWNjZXNzaWJsZTsgdGhlcmUgYXJlIG5vIFx0ZXh0dHR7c2V0KCl9IGFuZAotXHRleHR0dHtnZXQoKX0gbWV0aG9kcy4gU2ltaWxhcmx5LCB1c2Ugb2YgdGhlIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBpcyBub3QKLWVuZm9yY2VkLiBXZSBkbyBub3QgaW5jbHVkZSBhbnkgXHRleHR0dHtGaWVsZE5vdFNldEV4Y2VwdGlvbn0gY29uc3RydWN0LgotRGV2ZWxvcGVycyBoYXZlIHRoZSBvcHRpb24gdG8gdXNlIHRoZXNlIGZpZWxkcyB0byB3cml0ZSBtb3JlIHJvYnVzdCBjb2RlLCBidXQKLXRoZSBzeXN0ZW0gaXMgcm9idXN0IHRvIHRoZSBkZXZlbG9wZXIgaWdub3JpbmcgdGhlIFx0ZXh0dHR7aXNzZXR9IGNvbnN0cnVjdAotZW50aXJlbHkgYW5kIHdpbGwgcHJvdmlkZSBzdWl0YWJsZSBkZWZhdWx0IGJlaGF2aW9yIGluIGFsbCBjYXNlcy4KLQotVGhpcyBjaG9pY2Ugd2FzIG1vdGl2YXRlZCBieSB0aGUgZGVzaXJlIHRvIGVhc2UgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuIE91ciBzdGF0ZWQKLWdvYWwgaXMgbm90IHRvIG1ha2UgZGV2ZWxvcGVycyBsZWFybiBhIHJpY2ggbmV3IGxpYnJhcnkgaW4gdGhlaXIgbGFuZ3VhZ2Ugb2YKLWNob2ljZSwgYnV0IHJhdGhlciB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgYWxsb3cgdGhlbSB0byB3b3JrIHdpdGggdGhlIGNvbnN0cnVjdHMKLXRoYXQgYXJlIG1vc3QgZmFtaWxpYXIgaW4gZWFjaCBsYW5ndWFnZS4KLQotV2UgYWxzbyBtYWRlIHRoZSBcdGV4dHR0e3JlYWQoKX0gYW5kIFx0ZXh0dHR7d3JpdGUoKX0gbWV0aG9kcyBvZiB0aGUgZ2VuZXJhdGVkCi1vYmplY3RzIHB1YmxpYyBzbyB0aGF0IHRoZSBvYmplY3RzIGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQKLW9mIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaHJpZnQgaXMgYSB1c2VmdWwgdG9vbCBzaW1wbHkgZm9yIGdlbmVyYXRpbmcKLW9iamVjdHMgdGhhdCBhcmUgZWFzaWx5IHNlcmlhbGl6YWJsZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgotCi1cc3Vic2VjdGlvbntSUEMgTWV0aG9kIElkZW50aWZpY2F0aW9ufQotTWV0aG9kIGNhbGxzIGluIFJQQyBhcmUgaW1wbGVtZW50ZWQgYnkgc2VuZGluZyB0aGUgbWV0aG9kIG5hbWUgYXMgYSBzdHJpbmcuIE9uZQotaXNzdWUgd2l0aCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgbG9uZ2VyIG1ldGhvZCBuYW1lcyByZXF1aXJlIG1vcmUgYmFuZHdpZHRoLgotV2UgZXhwZXJpbWVudGVkIHdpdGggdXNpbmcgZml4ZWQtc2l6ZSBoYXNoZXMgdG8gaWRlbnRpZnkgbWV0aG9kcywgYnV0IGluIHRoZQotZW5kIGNvbmNsdWRlZCB0aGF0IHRoZSBzYXZpbmdzIHdlcmUgbm90IHdvcnRoIHRoZSBoZWFkYWNoZXMgaW5jdXJyZWQuIFJlbGlhYmx5Ci1kZWFsaW5nIHdpdGggY29uZmxpY3RzIGFjcm9zcyB2ZXJzaW9ucyBvZiBhbiBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlIGlzCi1pbXBvc3NpYmxlIHdpdGhvdXQgYSBtZXRhLXN0b3JhZ2Ugc3lzdGVtIChpLmUuIHRvIGdlbmVyYXRlIG5vbi1jb25mbGljdGluZwotaGFzaGVzIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGEgZmlsZSwgd2Ugd291bGQgaGF2ZSB0byBrbm93IGFib3V0IGFsbAotY29uZmxpY3RzIHRoYXQgZXZlciBleGlzdGVkIGluIGFueSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmaWxlKS4KLQotV2Ugd2FudGVkIHRvIGF2b2lkIHRvbyBtYW55IHVubmVjZXNzYXJ5IHN0cmluZyBjb21wYXJpc29ucyB1cG9uCi1tZXRob2QgaW52b2NhdGlvbi4gVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGdlbmVyYXRlIG1hcHMgZnJvbSBzdHJpbmdzIHRvIGZ1bmN0aW9uCi1wb2ludGVycywgc28gdGhhdCBpbnZvY2F0aW9uIGlzIGVmZmVjdGl2ZWx5IGFjY29tcGxpc2hlZCB2aWEgYSBjb25zdGFudC10aW1lCi1oYXNoIGxvb2t1cCBpbiB0aGUgY29tbW9uIGNhc2UuIFRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNvdXBsZSBpbnRlcmVzdGluZwotY29kZSBjb25zdHJ1Y3RzLiBCZWNhdXNlIEphdmEgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBwb2ludGVycywgcHJvY2VzcwotZnVuY3Rpb25zIGFyZSBhbGwgcHJpdmF0ZSBtZW1iZXIgY2xhc3NlcyBpbXBsZW1lbnRpbmcgYSBjb21tb24gaW50ZXJmYWNlLgotCi1cYmVnaW57dmVyYmF0aW19Ci1wcml2YXRlIGNsYXNzIHBpbmcgaW1wbGVtZW50cyBQcm9jZXNzRnVuY3Rpb24gewotICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaXByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sIG9wcm90KQotICAgIHRocm93cyBURXhjZXB0aW9uCi0gIHsgLi4ufQotfQotCi1IYXNoTWFwPFN0cmluZyxQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0KLSAgbmV3IEhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4oKTsKLVxlbmR7dmVyYmF0aW19Ci0KLUluIEMrKywgd2UgdXNlIGEgcmVsYXRpdmVseSBlc290ZXJpYyBsYW5ndWFnZSBjb25zdHJ1Y3Q6IG1lbWJlciBmdW5jdGlvbgotcG9pbnRlcnMuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLAotICB2b2lkIChFeGFtcGxlU2VydmljZVByb2Nlc3Nvcjo6KikoaW50MzJfdCwKLSAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosCi0gIGZhY2Vib29rOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqKT4KLSBwcm9jZXNzTWFwXzsKLVxlbmR7dmVyYmF0aW19Ci0KLVVzaW5nIHRoZXNlIHRlY2huaXF1ZXMsIHRoZSBjb3N0IG9mIHN0cmluZyBwcm9jZXNzaW5nIGlzIG1pbmltaXplZCwgYW5kIHdlCi1yZWFwIHRoZSBiZW5lZml0IG9mIGJlaW5nIGFibGUgdG8gZWFzaWx5IGRlYnVnIGNvcnJ1cHQgb3IgbWlzdW5kZXJzdG9vZCBkYXRhIGJ5Ci1pbnNwZWN0aW5nIGl0IGZvciBrbm93biBzdHJpbmcgbWV0aG9kIG5hbWVzLgotCi1cc3Vic2VjdGlvbntTZXJ2ZXJzIGFuZCBNdWx0aXRocmVhZGluZ30KLVRocmlmdCBzZXJ2aWNlcyByZXF1aXJlIGJhc2ljIG11bHRpdGhyZWFkaW5nIHRvIGhhbmRsZSBzaW11bHRhbmVvdXMKLXJlcXVlc3RzIGZyb20gbXVsdGlwbGUgY2xpZW50cy4gRm9yIHRoZSBQeXRob24gYW5kIEphdmEgaW1wbGVtZW50YXRpb25zIG9mCi1UaHJpZnQgc2VydmVyIGxvZ2ljLCB0aGUgc3RhbmRhcmQgdGhyZWFkaW5nIGxpYnJhcmllcyBkaXN0cmlidXRlZCB3aXRoIHRoZQotbGFuZ3VhZ2VzIHByb3ZpZGUgYWRlcXVhdGUgc3VwcG9ydC4gRm9yIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIG5vIHN0YW5kYXJkIG11bHRpdGhyZWFkIHJ1bnRpbWUKLWxpYnJhcnkgZXhpc3RzLiBTcGVjaWZpY2FsbHksIHJvYnVzdCwgbGlnaHR3ZWlnaHQsIGFuZCBwb3J0YWJsZQotdGhyZWFkIG1hbmFnZXIgYW5kIHRpbWVyIGNsYXNzIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZXhpc3QuIFdlIGludmVzdGlnYXRlZAotZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zLCBuYW1lbHkgXHRleHR0dHtib29zdDo6dGhyZWFkfSwKLVx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9LCBcdGV4dHR0e0FDRVxfVGhyZWFkXF9NYW5hZ2VyfSBhbmQKLVx0ZXh0dHR7QUNFXF9UaW1lcn0uCi0KLVdoaWxlIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHN9XGNpdGV7Ym9vc3QudGhyZWFkc30gIHByb3ZpZGVzIGNsZWFuLAotbGlnaHR3ZWlnaHQgYW5kIHJvYnVzdCBpbXBsZW1lbnRhdGlvbnMgb2YgbXVsdGktdGhyZWFkIHByaW1pdGl2ZXMgKG11dGV4ZXMsCi1jb25kaXRpb25zLCB0aHJlYWRzKSBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdGhyZWFkIG1hbmFnZXIgb3IgdGltZXIKLWltcGxlbWVudGF0aW9uLgotCi1cdGV4dHR0e2Jvb3N0Ojp0aHJlYWRwb29sfVxjaXRle2Jvb3N0LnRocmVhZHBvb2x9IGFsc28gbG9va2VkIHByb21pc2luZyBidXQKLXdhcyBub3QgZmFyIGVub3VnaCBhbG9uZyBmb3Igb3VyIHB1cnBvc2VzLiBXZSB3YW50ZWQgdG8gbGltaXQgdGhlIGRlcGVuZGVuY3kgb24KLXRoaXJkLXBhcnR5IGxpYnJhcmllcyBhcyBtdWNoIGFzIHBvc3NpYmxlLiBCZWNhdXNlXFwKLVx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGlzCi1ub3QgYSBwdXJlIHRlbXBsYXRlIGxpYnJhcnkgYW5kIHJlcXVpcmVzIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBiZWNhdXNlIGl0IGlzCi1ub3QgeWV0IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJvb3N0IGRpc3RyaWJ1dGlvbiB3ZSBmZWx0IGl0IHdhcyBub3QgcmVhZHkgZm9yCi11c2UgaW4gVGhyaWZ0LiBBcyBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWRwb29sfSBldm9sdmVzIGFuZCBlc3BlY2lhbGx5IGlmIGl0IGlzCi1hZGRlZCB0byB0aGUgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIG1heSByZWNvbnNpZGVyIG91ciBkZWNpc2lvbiB0byBub3QgdXNlIGl0LgotCi1BQ0UgaGFzIGJvdGggYSB0aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW4gYWRkaXRpb24gdG8gbXVsdGktdGhyZWFkCi1wcmltaXRpdmVzLiBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdpdGggQUNFIGlzIHRoYXQgaXQgaXMgQUNFLiBVbmxpa2UgQm9vc3QsIEFDRQotQVBJIHF1YWxpdHkgaXMgcG9vci4gRXZlcnl0aGluZyBpbiBBQ0UgaGFzIGxhcmdlIG51bWJlcnMgb2YgZGVwZW5kZW5jaWVzIG9uCi1ldmVyeXRoaW5nIGVsc2UgaW4gQUNFIC0gdGh1cyBmb3JjaW5nIGRldmVsb3BlcnMgdG8gdGhyb3cgb3V0IHN0YW5kYXJkCi1jbGFzc2VzLCBzdWNoIGFzIFNUTCBjb2xsZWN0aW9ucywgaW4gZmF2b3Igb2YgQUNFJ3MgaG9tZWJyZXdlZCBpbXBsZW1lbnRhdGlvbnMuIEluCi1hZGRpdGlvbiwgdW5saWtlIEJvb3N0LCBBQ0UgaW1wbGVtZW50YXRpb25zIGRlbW9uc3RyYXRlIGxpdHRsZSB1bmRlcnN0YW5kaW5nCi1vZiB0aGUgcG93ZXIgYW5kIHBpdGZhbGxzIG9mIEMrKyBwcm9ncmFtbWluZyBhbmQgdGFrZSBubyBhZHZhbnRhZ2Ugb2YgbW9kZXJuCi10ZW1wbGF0aW5nIHRlY2huaXF1ZXMgdG8gZW5zdXJlIGNvbXBpbGUgdGltZSBzYWZldHkgYW5kIHJlYXNvbmFibGUgY29tcGlsZXIKLWVycm9yIG1lc3NhZ2VzLiBGb3IgYWxsIHRoZXNlIHJlYXNvbnMsIEFDRSB3YXMgcmVqZWN0ZWQuIEluc3RlYWQsIHdlIGNob3NlCi10byBpbXBsZW1lbnQgb3VyIG93biBsaWJyYXJ5LCBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KLQotXHN1YnNlY3Rpb257VGhyZWFkIFByaW1pdGl2ZXN9Ci0KLVRoZSBUaHJpZnQgdGhyZWFkIGxpYnJhcmllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIG5hbWVzcGFjZVxcCi1cdGV4dHR0e2ZhY2Vib29rOjp0aHJpZnQ6OmNvbmN1cnJlbmN5fSBhbmQgaGF2ZSB0aHJlZSBjb21wb25lbnRzOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBwcmltaXRpdmVzCi1caXRlbSB0aHJlYWQgcG9vbCBtYW5hZ2VyCi1caXRlbSB0aW1lciBtYW5hZ2VyCi1cZW5ke2l0ZW1pemV9Ci0KLUFzIG1lbnRpb25lZCBhYm92ZSwgd2Ugd2VyZSBoZXNpdGFudCB0byBpbnRyb2R1Y2UgYW55IGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCi1vbiBUaHJpZnQuIFdlIGRlY2lkZWQgdG8gdXNlIFx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSBiZWNhdXNlIGl0IGlzIHNvCi11c2VmdWwgZm9yIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb24sIGl0IHJlcXVpcmVzIG5vIGxpbmstdGltZSBvcgotcnVudGltZSBsaWJyYXJpZXMgKGkuZS4gaXQgaXMgYSBwdXJlIHRlbXBsYXRlIGxpYnJhcnkpIGFuZCBpdCBpcyBkdWUKLXRvIGJlY29tZSBwYXJ0IG9mIHRoZSBDKysweCBzdGFuZGFyZC4KLQotV2UgaW1wbGVtZW50IHN0YW5kYXJkIFx0ZXh0dHR7TXV0ZXh9IGFuZCBcdGV4dHR0e0NvbmRpdGlvbn0gY2xhc3NlcywgYW5kIGEKLSBcdGV4dHR0e01vbml0b3J9IGNsYXNzLiBUaGUgbGF0dGVyIGlzIHNpbXBseSBhIGNvbWJpbmF0aW9uIG9mIGEgbXV0ZXggYW5kCi1jb25kaXRpb24gdmFyaWFibGUgYW5kIGlzIGFuYWxvZ291cyB0byB0aGUgXHRleHR0dHtNb25pdG9yfSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBmb3IKLXRoZSBKYXZhIFx0ZXh0dHR7T2JqZWN0fSBjbGFzcy4gVGhpcyBpcyBhbHNvIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIGJhcnJpZXIuIFdlCi1wcm92aWRlIGEgXHRleHR0dHtTeW5jaHJvbml6ZWR9IGd1YXJkIGNsYXNzIHRvIGFsbG93IEphdmEtbGlrZSBzeW5jaHJvbml6ZWQgYmxvY2tzLgotVGhpcyBpcyBqdXN0IGEgYml0IG9mIHN5bnRhY3RpYyBzdWdhciwgYnV0LCBsaWtlIGl0cyBKYXZhIGNvdW50ZXJwYXJ0LCBjbGVhcmx5Ci1kZWxpbWl0cyBjcml0aWNhbCBzZWN0aW9ucyBvZiBjb2RlLiBVbmxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIHdlIHN0aWxsCi1oYXZlIHRoZSBhYmlsaXR5IHRvIHByb2dyYW1tYXRpY2FsbHkgbG9jaywgdW5sb2NrLCBibG9jaywgYW5kIHNpZ25hbCBtb25pdG9ycy4KLQotXGJlZ2lue3ZlcmJhdGltfQotdm9pZCBydW4oKSB7Ci0ge1N5bmNocm9uaXplZCBzKG1hbmFnZXItPm1vbml0b3IpOwotICBpZiAobWFuYWdlci0+c3RhdGUgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgewotICAgIG1hbmFnZXItPnN0YXRlID0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEOwotICAgIG1hbmFnZXItPm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gIH0KLSB9Ci19Ci1cZW5ke3ZlcmJhdGltfQotCi1XZSBhZ2FpbiBib3Jyb3dlZCBmcm9tIEphdmEgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gYSB0aHJlYWQgYW5kIGEgcnVubmFibGUKLWNsYXNzLiBBIFx0ZXh0dHR7VGhyZWFkfSBpcyB0aGUgYWN0dWFsIHNjaGVkdWxhYmxlIG9iamVjdC4gVGhlCi1cdGV4dHR0e1J1bm5hYmxlfSBpcyB0aGUgbG9naWMgdG8gZXhlY3V0ZSB3aXRoaW4gdGhlIHRocmVhZC4KLVRoZSBcdGV4dHR0e1RocmVhZH0gaW1wbGVtZW50YXRpb24gZGVhbHMgd2l0aCBhbGwgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHRocmVhZAotY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGlzc3Vlcywgd2hpbGUgdGhlIFx0ZXh0dHR7UnVubmFibGV9IGltcGxlbWVudGF0aW9uIGRlYWxzCi13aXRoIHRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBwZXItdGhyZWFkIGxvZ2ljLiBUaGUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoCi1pcyB0aGF0IGRldmVsb3BlcnMgY2FuIGVhc2lseSBzdWJjbGFzcyB0aGUgUnVubmFibGUgY2xhc3Mgd2l0aG91dCBwdWxsaW5nIGluCi1wbGF0Zm9ybS1zcGVjaWZpYyBzdXBlci1jbGFzc2VzLgotCi1cc3Vic2VjdGlvbntUaHJlYWQsIFJ1bm5hYmxlLCBhbmQgc2hhcmVkXF9wdHJ9Ci1XZSB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHRocm91Z2hvdXQgdGhlIFx0ZXh0dHR7VGhyZWFkTWFuYWdlcn0gYW5kCi1cdGV4dHR0e1RpbWVyTWFuYWdlcn0gaW1wbGVtZW50YXRpb25zIHRvIGd1YXJhbnRlZSBjbGVhbnVwIG9mIGRlYWQgb2JqZWN0cyB0aGF0IGNhbgotYmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gRm9yIFx0ZXh0dHR7VGhyZWFkfSBjbGFzcyBpbXBsZW1lbnRhdGlvbnMsCi1cdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdXNhZ2UgcmVxdWlyZXMgcGFydGljdWxhciBhdHRlbnRpb24gdG8gbWFrZSBzdXJlCi1cdGV4dHR0e1RocmVhZH0gb2JqZWN0cyBhcmUgbmVpdGhlciBsZWFrZWQgbm9yIGRlcmVmZXJlbmNlZCBwcmVtYXR1cmVseSB3aGlsZQotY3JlYXRpbmcgYW5kIHNodXR0aW5nIGRvd24gdGhyZWFkcy4KLQotVGhyZWFkIGNyZWF0aW9uIHJlcXVpcmVzIGNhbGxpbmcgaW50byBhIEMgbGlicmFyeS4gKEluIG91ciBjYXNlIHRoZSBQT1NJWAotdGhyZWFkIGxpYnJhcnksIFx0ZXh0dHR7bGlicHRocmVhZH0sIGJ1dCB0aGUgc2FtZSB3b3VsZCBiZSB0cnVlIGZvciBXSU4zMiB0aHJlYWRzKS4KLVR5cGljYWxseSwgdGhlIE9TIG1ha2VzIGZldywgaWYgYW55LCBndWFyYW50ZWVzIGFib3V0IHdoZW4gXHRleHR0dHtUaHJlYWRNYWlufSwgYSBDIHRocmVhZCdzIGVudHJ5LXBvaW50IGZ1bmN0aW9uLCB3aWxsIGJlIGNhbGxlZC4gVGhlcmVmb3JlLCBpdCBpcwotcG9zc2libGUgdGhhdCBvdXIgdGhyZWFkIGNyZWF0ZSBjYWxsLAotXHRleHR0dHtUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoKX0gY291bGQgcmV0dXJuIHRvIHRoZSBjYWxsZXIKLXdlbGwgYmVmb3JlIHRoYXQgdGltZS4gVG8gZW5zdXJlIHRoYXQgdGhlIHJldHVybmVkIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgaXMgbm90Ci1wcmVtYXR1cmVseSBjbGVhbmVkIHVwIGlmIHRoZSBjYWxsZXIgZ2l2ZXMgdXAgaXRzIHJlZmVyZW5jZSBwcmlvciB0byB0aGUKLVx0ZXh0dHR7VGhyZWFkTWFpbn0gY2FsbCwgdGhlIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgbWFrZXMgYSB3ZWFrIHJlZmVyZW5lbmNlIHRvCi1pdHNlbGYgaW4gaXRzIFx0ZXh0dHR7c3RhcnR9IG1ldGhvZC4KLQotV2l0aCB0aGUgd2VhayByZWZlcmVuY2UgaW4gaGFuZCB0aGUgXHRleHR0dHtUaHJlYWRNYWlufSBmdW5jdGlvbiBjYW4gYXR0ZW1wdCB0byBnZXQKLWEgc3Ryb25nIHJlZmVyZW5jZSBiZWZvcmUgZW50ZXJpbmcgdGhlIFx0ZXh0dHR7UnVubmFibGU6OnJ1bn0gbWV0aG9kIG9mIHRoZQotXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IGJvdW5kIHRvIHRoZSBcdGV4dHR0e1RocmVhZH0uIElmIG5vIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotdGhyZWFkIGFyZSBvYnRhaW5lZCBiZXR3ZWVuIGV4aXRpbmcgXHRleHR0dHtUaHJlYWQ6OnN0YXJ0fSBhbmQgZW50ZXJpbmcgXHRleHR0dHtUaHJlYWRNYWlufSwgdGhlIHdlYWsgcmVmZXJlbmNlIHJldHVybnMgXHRleHR0dHtudWxsfSBhbmQgdGhlIGZ1bmN0aW9uCi1leGl0cyBpbW1lZGlhdGVseS4KLQotVGhlIG5lZWQgZm9yIHRoZSBcdGV4dHR0e1RocmVhZH0gdG8gbWFrZSBhIHdlYWsgcmVmZXJlbmNlIHRvIGl0c2VsZiBoYXMgYQotc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBBUEkuIFNpbmNlIHJlZmVyZW5jZXMgYXJlIG1hbmFnZWQgdGhyb3VnaCB0aGUKLVx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB0ZW1wbGF0ZXMsIHRoZSBcdGV4dHR0e1RocmVhZH0gb2JqZWN0IG11c3QgaGF2ZSBhIHJlZmVyZW5jZQotdG8gaXRzZWxmIHdyYXBwZWQgYnkgdGhlIHNhbWUgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlIHRoYXQgaXMgcmV0dXJuZWQKLXRvIHRoZSBjYWxsZXIuIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSB1c2Ugb2YgdGhlIGZhY3RvcnkgcGF0dGVybi4KLVx0ZXh0dHR7VGhyZWFkRmFjdG9yeX0gY3JlYXRlcyB0aGUgcmF3IFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgYW5kIGEKLVx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB3cmFwcGVyLCBhbmQgY2FsbHMgYSBwcml2YXRlIGhlbHBlciBtZXRob2Qgb2YgdGhlIGNsYXNzCi1pbXBsZW1lbnRpbmcgdGhlIFx0ZXh0dHR7VGhyZWFkfSBpbnRlcmZhY2UgKGluIHRoaXMgY2FzZSwgXHRleHR0dHtQb3NpeFRocmVhZDo6d2Vha1JlZn0pCi0gdG8gYWxsb3cgaXQgdG8gbWFrZSBhZGQgd2VhayByZWZlcmVuY2UgdG8gaXRzZWxmIHRocm91Z2ggdGhlCi0gXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlLgotCi1cdGV4dHR0e1RocmVhZH0gYW5kIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIuIEEgXHRleHR0dHtSdW5uYWJsZX0KLW9iamVjdCBtYXkgbmVlZCB0byBrbm93IGFib3V0IHRoZSB0aHJlYWQgaW4gd2hpY2ggaXQgaXMgZXhlY3V0aW5nLCBhbmQgYSBUaHJlYWQsIG9idmlvdXNseSwKLW5lZWRzIHRvIGtub3cgd2hhdCBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaXQgaXMgaG9zdGluZy4gVGhpcyBpbnRlcmRlcGVuZGVuY3kgaXMKLWZ1cnRoZXIgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGUgbGlmZWN5Y2xlIG9mIGVhY2ggb2JqZWN0IGlzIGluZGVwZW5kZW50IG9mIHRoZQotb3RoZXIuIEFuIGFwcGxpY2F0aW9uIG1heSBjcmVhdGUgYSBzZXQgb2YgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IHRvIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQgdGhyZWFkcywgb3IgaXQgbWF5IGNyZWF0ZSBhbmQgZm9yZ2V0IGEgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0Ci1vbmNlIGEgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQgZm9yIGl0LgotCi1UaGUgXHRleHR0dHtUaHJlYWR9IGNsYXNzIHRha2VzIGEgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHJlZmVyZW5jZSB0byB0aGUgaG9zdGVkCi1cdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaW4gaXRzIGNvbnN0cnVjdG9yLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gY2xhc3MgaGFzIGFuCi1leHBsaWNpdCBcdGV4dHR0e3RocmVhZH0gbWV0aG9kIHRvIGFsbG93IGV4cGxpY2l0IGJpbmRpbmcgb2YgdGhlIGhvc3RlZCB0aHJlYWQuCi1cdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZH0gYmluZHMgdGhlIG9iamVjdHMgdG8gZWFjaCBvdGhlci4KLQotXHN1YnNlY3Rpb257VGhyZWFkTWFuYWdlcn0KLQotXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBjcmVhdGVzIGEgcG9vbCBvZiB3b3JrZXIgdGhyZWFkcyBhbmQKLWFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUgdGFza3MgZm9yIGV4ZWN1dGlvbiBhcyBmcmVlIHdvcmtlciB0aHJlYWRzCi1iZWNvbWUgYXZhaWxhYmxlLiBUaGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBkb2VzIG5vdCBpbXBsZW1lbnQgZHluYW1pYwotdGhyZWFkIHBvb2wgcmVzaXppbmcsIGJ1dCBwcm92aWRlcyBwcmltaXRpdmVzIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBhZGQKLWFuZCByZW1vdmUgdGhyZWFkcyBiYXNlZCBvbiBsb2FkLiBUaGlzIGFwcHJvYWNoIHdhcyBjaG9zZW4gYmVjYXVzZQotaW1wbGVtZW50aW5nIGxvYWQgbWV0cmljcyBhbmQgdGhyZWFkIHBvb2wgc2l6ZSBpcyB2ZXJ5IGFwcGxpY2F0aW9uCi1zcGVjaWZpYy4gRm9yIGV4YW1wbGUgc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdhbnQgdG8gYWRqdXN0IHBvb2wgc2l6ZSBiYXNlZAotb24gcnVubmluZy1hdmVyYWdlIG9mIHdvcmsgYXJyaXZhbCByYXRlcyB0aGF0IGFyZSBtZWFzdXJlZCB2aWEgcG9sbGVkCi1zYW1wbGVzLiBPdGhlcnMgbWF5IHNpbXBseSB3aXNoIHRvIHJlYWN0IGltbWVkaWF0ZWx5IHRvIHdvcmstcXVldWUKLWRlcHRoIGhpZ2ggYW5kIGxvdyB3YXRlciBtYXJrcy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNyZWF0ZSBhIGNvbXBsZXgKLUFQSSBhYnN0cmFjdCBlbm91Z2ggdG8gY2FwdHVyZSB0aGVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcywgd2UKLXNpbXBseSBsZWF2ZSBpdCB1cCB0byB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBhbmQgcHJvdmlkZSB0aGUKLXByaW1pdGl2ZXMgdG8gZW5hY3QgdGhlIGRlc2lyZWQgcG9saWN5IGFuZCBzYW1wbGUgY3VycmVudCBzdGF0dXMuCi0KLVxzdWJzZWN0aW9ue1RpbWVyTWFuYWdlcn0KLQotXHRleHR0dHtUaW1lck1hbmFnZXJ9IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUKLSBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3RzIGZvciBleGVjdXRpb24gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBJdHMgc3BlY2lmaWMgdGFzawotaXMgdG8gYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzYW1wbGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBsb2FkIGF0IHJlZ3VsYXIKLWludGVydmFscyBhbmQgbWFrZSBjaGFuZ2VzIHRvIHRoZSB0aHJlYWQgcG9vbCBzaXplIGJhc2VkIG9uIGFwcGxpY2F0aW9uIHBvbGljeS4KLU9mIGNvdXJzZSwgaXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW55IG51bWJlciBvZiB0aW1lciBvciBhbGFybSBldmVudHMuCi0KLVRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFx0ZXh0dHR7VGltZXJNYW5hZ2VyfSB1c2VzIGEgc2luZ2xlIHRocmVhZCB0bwotZXhlY3V0ZSBleHBpcmVkIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMuIFRodXMsIGlmIGEgdGltZXIgb3BlcmF0aW9uIG5lZWRzIHRvCi1kbyBhIGxhcmdlIGFtb3VudCBvZiB3b3JrIGFuZCBlc3BlY2lhbGx5IGlmIGl0IG5lZWRzIHRvIGRvIGJsb2NraW5nIEkvTywKLXRoYXQgc2hvdWxkIGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0KLVxzdWJzZWN0aW9ue05vbmJsb2NraW5nIE9wZXJhdGlvbn0KLVRob3VnaCB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBpbnRlcmZhY2VzIG1hcCBtb3JlIGRpcmVjdGx5IHRvIGEgYmxvY2tpbmcgSS9PCi1tb2RlbCwgd2UgaGF2ZSBpbXBsZW1lbnRlZCBhIGhpZ2ggcGVyZm9ybWFuY2UgXHRleHR0dHtUTm9uQmxvY2tpbmdTZXJ2ZXJ9Ci1pbiBDKysgYmFzZWQgb24gXHRleHR0dHtsaWJldmVudH0gYW5kIHRoZSBcdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9LiBXZQotaW1wbGVtZW50ZWQgdGhpcyBieSBtb3ZpbmcgYWxsIEkvTyBpbnRvIG9uZSB0aWdodCBldmVudCBsb29wIHVzaW5nIGEKLXN0YXRlIG1hY2hpbmUuIEVzc2VudGlhbGx5LCB0aGUgZXZlbnQgbG9vcCByZWFkcyBmcmFtZWQgcmVxdWVzdHMgaW50bwotXHRleHR0dHtUTWVtb3J5QnVmZmVyfSBvYmplY3RzLiBPbmNlIGVudGlyZSByZXF1ZXN0cyBhcmUgcmVhZHksIHRoZXkgYXJlCi1kaXNwYXRjaGVkIHRvIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdCB3aGljaCBjYW4gcmVhZCBkaXJlY3RseSBmcm9tCi10aGUgZGF0YSBpbiBtZW1vcnkuCi0KLVxzdWJzZWN0aW9ue0NvbXBpbGVyfQotVGhlIFRocmlmdCBjb21waWxlciBpcyBpbXBsZW1lbnRlZCBpbiBDKysgdXNpbmcgc3RhbmRhcmQgXHRleHR0dHtsZXh9L1x0ZXh0dHR7eWFjY30KLWxleGluZyBhbmQgcGFyc2luZy4gVGhvdWdoIGl0IGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB3aXRoIGZld2VyCi1saW5lcyBvZiBjb2RlIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGkuZS4gUHl0aG9uIExleC1ZYWNjIChQTFkpIG9yIFx0ZXh0dHR7b2NhbWx5YWNjfSksIHVzaW5nIEMrKwotZm9yY2VzIGV4cGxpY2l0IGRlZmluaXRpb24gb2YgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdHMuIFN0cm9uZ2x5IHR5cGluZyB0aGUKLXBhcnNlIHRyZWUgZWxlbWVudHMgKGRlYmF0YWJseSkgbWFrZXMgdGhlIGNvZGUgbW9yZSBhcHByb2FjaGFibGUgZm9yIG5ldwotZGV2ZWxvcGVycy4KLQotQ29kZSBnZW5lcmF0aW9uIGlzIGRvbmUgdXNpbmcgdHdvIHBhc3Nlcy4gVGhlIGZpcnN0IHBhc3MgbG9va3Mgb25seSBmb3IKLWluY2x1ZGUgZmlsZXMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIFR5cGUgZGVmaW5pdGlvbnMgYXJlIG5vdCBjaGVja2VkIGR1cmluZwotdGhpcyBwaGFzZSwgc2luY2UgdGhleSBtYXkgZGVwZW5kIHVwb24gaW5jbHVkZSBmaWxlcy4gQWxsIGluY2x1ZGVkIGZpbGVzCi1hcmUgc2VxdWVudGlhbGx5IHNjYW5uZWQgaW4gYSBmaXJzdCBwYXNzLiBPbmNlIHRoZSBpbmNsdWRlIHRyZWUgaGFzIGJlZW4KLXJlc29sdmVkLCBhIHNlY29uZCBwYXNzIG92ZXIgYWxsIGZpbGVzIGlzIHRha2VuIHRoYXQgaW5zZXJ0cyB0eXBlIGRlZmluaXRpb25zCi1pbnRvIHRoZSBwYXJzZSB0cmVlIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gYW55IHVuZGVmaW5lZCB0eXBlcy4gVGhlIHByb2dyYW0gaXMKLXRoZW4gZ2VuZXJhdGVkIGFnYWluc3QgdGhlIHBhcnNlIHRyZWUuCi0KLUR1ZSB0byBpbmhlcmVudCBjb21wbGV4aXRpZXMgYW5kIHBvdGVudGlhbCBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLAotd2UgZXhwbGljaXRseSBkaXNhbGxvdyBmb3J3YXJkIGRlY2xhcmF0aW9uLiBUd28gVGhyaWZ0IHN0cnVjdHMgY2Fubm90Ci1lYWNoIGNvbnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIG90aGVyLiAoU2luY2Ugd2UgZG8gbm90IGFsbG93IFx0ZXh0dHR7bnVsbH0KLXN0cnVjdCBpbnN0YW5jZXMgaW4gdGhlIGdlbmVyYXRlZCBDKysgY29kZSwgdGhpcyB3b3VsZCBhY3R1YWxseSBiZSBpbXBvc3NpYmxlLikKLQotXHN1YnNlY3Rpb257VEZpbGVUcmFuc3BvcnR9Ci1UaGUgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gbG9ncyBUaHJpZnQgcmVxdWVzdHMvc3RydWN0cyBieQotZnJhbWluZyBpbmNvbWluZyBkYXRhIHdpdGggaXRzIGxlbmd0aCBhbmQgd3JpdGluZyBpdCBvdXQgdG8gZGlzay4KLVVzaW5nIGEgZnJhbWVkIG9uLWRpc2sgZm9ybWF0IGFsbG93cyBmb3IgYmV0dGVyIGVycm9yIGNoZWNraW5nIGFuZAotaGVscHMgd2l0aCB0aGUgcHJvY2Vzc2luZyBvZiBhIGZpbml0ZSBudW1iZXIgb2YgZGlzY3JldGUgZXZlbnRzLiBUaGVcXAotXHRleHR0dHtURmlsZVdyaXRlclRyYW5zcG9ydH0gdXNlcyBhIHN5c3RlbSBvZiBzd2FwcGluZyBpbi1tZW1vcnkgYnVmZmVycwotdG8gZW5zdXJlIGdvb2QgcGVyZm9ybWFuY2Ugd2hpbGUgbG9nZ2luZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuCi1BIFRocmlmdCBsb2cgZmlsZSBpcyBzcGxpdCB1cCBpbnRvIGNodW5rcyBvZiBhIHNwZWNpZmllZCBzaXplOyBsb2dnZWQgbWVzc2FnZXMKLWFyZSBub3QgYWxsb3dlZCB0byBjcm9zcyBjaHVuayBib3VuZGFyaWVzLiBBIG1lc3NhZ2UgdGhhdCB3b3VsZCBjcm9zcyBhIGNodW5rCi1ib3VuZGFyeSB3aWxsIGNhdXNlIHBhZGRpbmcgdG8gYmUgYWRkZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsgYW5kIHRoZQotZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBhcmUgYWxpZ25lZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGNodW5rLgotUGFydGl0aW9uaW5nIHRoZSBmaWxlIGludG8gY2h1bmtzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlYWQgYW5kIGludGVycHJldCBkYXRhCi1mcm9tIGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUgZmlsZS4KLQotXHNlY3Rpb257RmFjZWJvb2sgVGhyaWZ0IFNlcnZpY2VzfQotVGhyaWZ0IGhhcyBiZWVuIGVtcGxveWVkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIGFwcGxpY2F0aW9ucyBhdCBGYWNlYm9vaywgaW5jbHVkaW5nCi1zZWFyY2gsIGxvZ2dpbmcsIG1vYmlsZSwgYWRzIGFuZCB0aGUgZGV2ZWxvcGVyIHBsYXRmb3JtLiBUd28gc3BlY2lmaWMgdXNhZ2VzIGFyZSBkaXNjdXNzZWQgYmVsb3cuCi0KLVxzdWJzZWN0aW9ue1NlYXJjaH0KLVRocmlmdCBpcyB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHRoZSBGYWNlYm9vayBTZWFyY2ggc2VydmljZS4KLVRoZSBtdWx0aS1sYW5ndWFnZSBjb2RlIGdlbmVyYXRpb24gaXMgd2VsbCBzdWl0ZWQgZm9yIHNlYXJjaCBiZWNhdXNlIGl0IGFsbG93cyBmb3IgYXBwbGljYXRpb24KLWRldmVsb3BtZW50IGluIGFuIGVmZmljaWVudCBzZXJ2ZXIgc2lkZSBsYW5ndWFnZSAoQysrKSBhbmQgYWxsb3dzIHRoZSBGYWNlYm9vayBQSFAtYmFzZWQgd2ViIGFwcGxpY2F0aW9uCi10byBtYWtlIGNhbGxzIHRvIHRoZSBzZWFyY2ggc2VydmljZSB1c2luZyBUaHJpZnQgUEhQIGxpYnJhcmllcy4gVGhlcmUgaXMgYWxzbyBhIGxhcmdlCi12YXJpZXR5IG9mIHNlYXJjaCBzdGF0cywgZGVwbG95bWVudCBhbmQgdGVzdGluZyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgYnVpbHQgb24gdG9wCi1vZiBnZW5lcmF0ZWQgUHl0aG9uIGNvZGUuIEFkZGl0aW9uYWxseSwgdGhlIFRocmlmdCBsb2cgZmlsZSBmb3JtYXQgaXMKLXVzZWQgYXMgYSByZWRvIGxvZyBmb3IgcHJvdmlkaW5nIHJlYWwtdGltZSBzZWFyY2ggaW5kZXggdXBkYXRlcy4gVGhyaWZ0IGhhcyBhbGxvd2VkIHRoZQotc2VhcmNoIHRlYW0gdG8gbGV2ZXJhZ2UgZWFjaCBsYW5ndWFnZSBmb3IgaXRzIHN0cmVuZ3RocyBhbmQgdG8gZGV2ZWxvcCBjb2RlIGF0IGEgcmFwaWQgcGFjZS4KLQotXHN1YnNlY3Rpb257TG9nZ2luZ30KLVRoZSBUaHJpZnQgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGZvciBzdHJ1Y3R1cmVkIGxvZ2dpbmcuIEVhY2gKLXNlcnZpY2UgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbG9uZyB3aXRoIGl0cyBwYXJhbWV0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlCi1hIHN0cnVjdHVyZWQgbG9nIGVudHJ5IGlkZW50aWZpZWQgYnkgdGhlIGZ1bmN0aW9uIG5hbWUuIFRoaXMgbG9nIGNhbiB0aGVuIGJlIHVzZWQgZm9yCi1hIHZhcmlldHkgb2YgcHVycG9zZXMsIGluY2x1ZGluZyBpbmxpbmUgYW5kIG9mZmxpbmUgcHJvY2Vzc2luZywgc3RhdHMgYWdncmVnYXRpb24gYW5kIGFzIGEgcmVkbyBsb2cuCi0KLVxzZWN0aW9ue0NvbmNsdXNpb25zfQotVGhyaWZ0IGhhcyBlbmFibGVkIEZhY2Vib29rIHRvIGJ1aWxkIHNjYWxhYmxlIGJhY2tlbmQKLXNlcnZpY2VzIGVmZmljaWVudGx5IGJ5IGVuYWJsaW5nIGVuZ2luZWVycyB0byBkaXZpZGUgYW5kIGNvbnF1ZXIuIEFwcGxpY2F0aW9uCi1kZXZlbG9wZXJzIGNhbiBmb2N1cyBvbiBhcHBsaWNhdGlvbiBjb2RlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlCi1zb2NrZXRzIGxheWVyLiBXZSBhdm9pZCBkdXBsaWNhdGVkIHdvcmsgYnkgd3JpdGluZyBidWZmZXJpbmcgYW5kIEkvTyBsb2dpYwotaW4gb25lIHBsYWNlLCByYXRoZXIgdGhhbiBpbnRlcnNwZXJzaW5nIGl0IGluIGVhY2ggYXBwbGljYXRpb24uCi0KLVRocmlmdCBoYXMgYmVlbiBlbXBsb3llZCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYXQgRmFjZWJvb2ssCi1pbmNsdWRpbmcgc2VhcmNoLCBsb2dnaW5nLCBtb2JpbGUsIGFkcywgYW5kIHRoZSBkZXZlbG9wZXIgcGxhdGZvcm0uIFdlIGhhdmUKLWZvdW5kIHRoYXQgdGhlIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGNvc3QgaW5jdXJyZWQgYnkgYW4gZXh0cmEgbGF5ZXIgb2YKLXNvZnR3YXJlIGFic3RyYWN0aW9uIGlzIGZhciBlY2xpcHNlZCBieSB0aGUgZ2FpbnMgaW4gZGV2ZWxvcGVyIGVmZmljaWVuY3kgYW5kCi1zeXN0ZW1zIHJlbGlhYmlsaXR5LgotCi1cYXBwZW5kaXgKLQotXHNlY3Rpb257U2ltaWxhciBTeXN0ZW1zfQotVGhlIGZvbGxvd2luZyBhcmUgc29mdHdhcmUgc3lzdGVtcyBzaW1pbGFyIHRvIFRocmlmdC4gRWFjaCBpcyAodmVyeSEpIGJyaWVmbHkKLWRlc2NyaWJlZDoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdGV4dGl0e1NPQVAufSBYTUwtYmFzZWQuIERlc2lnbmVkIGZvciB3ZWIgc2VydmljZXMgdmlhIEhUVFAsIGV4Y2Vzc2l2ZQotWE1MIHBhcnNpbmcgb3ZlcmhlYWQuCi1caXRlbSBcdGV4dGl0e0NPUkJBLn0gUmVsYXRpdmVseSBjb21wcmVoZW5zaXZlLCBkZWJhdGFibHkgb3ZlcmRlc2lnbmVkIGFuZAotaGVhdnl3ZWlnaHQuIENvbXBhcmFibHkgY3VtYmVyc29tZSBzb2Z0d2FyZSBpbnN0YWxsYXRpb24uCi1caXRlbSBcdGV4dGl0e0NPTS59IEVtYnJhY2VkIG1haW5seSBpbiBXaW5kb3dzIGNsaWVudCBzb2Z0YXJlLiBOb3QgYW4gZW50aXJlbHkKLW9wZW4gc29sdXRpb24uCi1caXRlbSBcdGV4dGl0e1BpbGxhci59IExpZ2h0d2VpZ2h0IGFuZCBoaWdoLXBlcmZvcm1hbmNlLCBidXQgbWlzc2luZyB2ZXJzaW9uaW5nCi1hbmQgYWJzdHJhY3Rpb24uCi1caXRlbSBcdGV4dGl0e1Byb3RvY29sIEJ1ZmZlcnMufSBDbG9zZWQtc291cmNlLCBvd25lZCBieSBHb29nbGUuIERlc2NyaWJlZCBpbgotU2F3emFsbCBwYXBlci4KLVxlbmR7aXRlbWl6ZX0KLQotXGFja3MKLQotTWFueSB0aGFua3MgZm9yIGZlZWRiYWNrIG9uIFRocmlmdCAoYW5kIGV4dHJlbWUgdHJpYWwgYnkgZmlyZSkgYXJlIGR1ZSB0bwotTWFydGluIFNtaXRoLCBLYXJsIFZvc2t1aWwgYW5kIFlpc2hhbiBXb25nLgotCi1UaHJpZnQgaXMgYSBzdWNjZXNzb3IgdG8gUGlsbGFyLCBhIHNpbWlsYXIgc3lzdGVtIGRldmVsb3BlZAotYnkgQWRhbSBEJ0FuZ2VsbywgZmlyc3Qgd2hpbGUgYXQgQ2FsdGVjaCBhbmQgY29udGludWVkIGxhdGVyIGF0IEZhY2Vib29rLgotVGhyaWZ0IHNpbXBseSB3b3VsZCBub3QgaGF2ZSBoYXBwZW5lZCB3aXRob3V0IEFkYW0ncyBpbnNpZ2h0cy4KLQotXGJlZ2lue3RoZWJpYmxpb2dyYXBoeX17fQotCi1cYmliaXRlbXtib29zdC50aHJlYWRzfQotS2VtcGYsIFdpbGxpYW0sCi1gYEJvb3N0LlRocmVhZHMnJywKLVx1cmx7aHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2h0bWwvdGhyZWFkcy5odG1sfQotCi1cYmliaXRlbXtib29zdC50aHJlYWRwb29sfQotSGVua2VsLCBQaGlsaXBwLAotYGB0aHJlYWRwb29sJycsCi1cdXJse2h0dHA6Ly90aHJlYWRwb29sLnNvdXJjZWZvcmdlLm5ldH0KLQotXGVuZHt0aGViaWJsaW9ncmFwaHl9Ci0KLVxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9kdWIuanNvbiBiL2R1Yi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kdWIuanNvbgpAQCAtMCwwICsxLDI4IEBACit7CisgICJuYW1lIjogImFwYWNoZS10aHJpZnQiLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBEIGxpYnJhcnkiLAorICAiYXV0aG9ycyI6IFsKKyAgICAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImxpYmV2ZW50IjogeworICAgICAgInZlcnNpb24iOiAifj4yLjAuMiIKKyAgICB9LAorICAgICJvcGVuc3NsIjogeworICAgICAgInZlcnNpb24iOiAiPj0xLjEuNiIKKyAgICB9CisgIH0sCisgICJzeXN0ZW1EZXBlbmRlbmNpZXMiOiAiT24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMC54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4xLjEsIG9uIHN5c3RlbXMgd2l0aCBuYXRpdmUgb3BlbnNzbCAxLjEueCB1c2UgZHViIHBhY2thZ2Ugb3BlbnNzbH4+Mi4wIiwKKyAgInRhcmdldFR5cGUiOiAibGlicmFyeSIsCisgICJzb3VyY2VQYXRocyI6IFsKKyAgICAibGliL2Qvc3JjIiAKKyAgXSwKKyAgImltcG9ydFBhdGhzIjogWworICAgICJsaWIvZC9zcmMiCisgIF0sCisgICJleGNsdWRlZFNvdXJjZUZpbGVzIjogWworICAgICJsaWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQiCisgIF0KK30KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZS5hbSBiL2xpYi9NYWtlZmlsZS5hbQppbmRleCBjOTQ5ZGMwLi5iNmNlMjBlIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUuYW0KKysrIGIvbGliL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9IFwKLSAgY3BwCitTVUJESVJTID0ganNvbiB4bWwKK1BSRUNST1NTX1RBUkdFVCA9CisKK2lmIFdJVEhfQ1BQCisjIGNwcCBkaXIgaXMgcGlja2VkIGRpcmVjdGx5IGJ5IHBsdWdpbiBidWlsZAoraWYgIVdJVEhfUExVR0lOCitTVUJESVJTICs9IGNwcAorZW5kaWYKK2VuZGlmCisKK2lmIFdJVEhfQ19HTElCCitTVUJESVJTICs9IGNfZ2xpYgorZW5kaWYKIAogaWYgV0lUSF9NT05PCiBTVUJESVJTICs9IGNzaGFycApAQCAtMjYsNiArMzcsMTAgQEAKIAogaWYgV0lUSF9KQVZBCiBTVUJESVJTICs9IGphdmEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1qYXZhCisjIEphdmFTY3JpcHQgdW5pdCB0ZXN0IGRlcGVuZHMgb24gamF2YQorIyBzbyB0ZXN0IG9ubHkgaWYgamF2YSwgYW50ICYgY28gaXMgYXZhaWxhYmxlCitTVUJESVJTICs9IGpzCiBlbmRpZgogCiBpZiBXSVRIX1BZVEhPTgpAQCAtNDAsNiArNTUsMTAgQEAKIFNVQkRJUlMgKz0gcmIKIGVuZGlmCiAKK2lmIFdJVEhfSEFTS0VMTAorU1VCRElSUyArPSBocworZW5kaWYKKwogaWYgV0lUSF9QRVJMCiBTVUJESVJTICs9IHBlcmwKIGVuZGlmCkBAIC00OCwxNCArNjcsNjAgQEAKIFNVQkRJUlMgKz0gcGhwCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKK2lmIFdJVEhfR08KK1NVQkRJUlMgKz0gZ28KK2VuZGlmCisKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZAorZW5kaWYKKworaWYgV0lUSF9OT0RFSlMKK1NVQkRJUlMgKz0gbm9kZWpzCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3Mtbm9kZWpzCitTVUJESVJTICs9IG5vZGV0cworZW5kaWYKKworaWYgV0lUSF9MVUEKK1NVQkRJUlMgKz0gbHVhCitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCitpZiBXSVRIX1NXSUZUCitTVUJESVJTICs9IHN3aWZ0CitlbmRpZgorCiAjIEFsbCBvZiB0aGUgbGlicyB0aGF0IGRvbid0IHVzZSBBdXRvbWFrZSBuZWVkIHRvIGdvIGluIGhlcmUKICMgc28gdGhleSB3aWxsIGVuZCB1cCBpbiBvdXIgcmVsZWFzZSB0YXJiYWxscy4KIEVYVFJBX0RJU1QgPSBcCi0gIGNvY29hIFwKLSAgaHMgXAotICBvY2FtbCBcCi0gIHBocCBcCi0gIGVybCBcCi0gIGpzIFwKLSAgYXMzIFwKLSAgc3QKKwlhczMgXAorCWNvY29hIFwKKwlkIFwKKwlkYXJ0IFwKKwlkZWxwaGkgXAorCWhheGUgXAorCWphdmFtZSBcCisJanMgXAorCW9jYW1sIFwKKwlzdCBcCisJdHMKKworcHJlY3Jvc3MtJToKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogJChQUkVDUk9TU19UQVJHRVQpCmRpZmYgLS1naXQgYS9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC54bWwgYi9saWIvYXMzL2J1aWxkLnhtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDFiN2E1NDQuLmIwYzRjODUKLS0tIGEvbGliL2FzMy9idWlsZC54bWwKKysrIGIvbGliL2FzMy9idWlsZC54bWwKQEAgLTgsNyArOCw3IEBACiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMTYsNTEgKzE2LDE2NyBAQAogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQiIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iPgorIC0tPgorPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0LWFzMyIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiIKKyAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+CiAKLSAgPGRlc2NyaXB0aW9uPlRocmlmdCBCdWlsZCBGaWxlPC9kZXNjcmlwdGlvbj4KKyAgPHByb3BlcnR5IG5hbWU9ImFzMy5hcnRpZmFjdGlkIiB2YWx1ZT0iJHthbnQucHJvamVjdC5uYW1lfSIvPgogCi0gIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5yb290IiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLi8iLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAotICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiIC8+CisgIDwhLS0gaW5oZXJpdCBmcm9tIHRoZSBqYXZhIGJ1aWxkIGZpbGUgZm9yIHZlcnNpb24gYW5kIG90aGVyIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKLSAgPHRhcmdldCBuYW1lPSJjaGVja0ZsZXhIb21lIiB1bmxlc3M9IkZMRVhfSE9NRSI+Ci0gICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBwcm9wZXJ0eSBGTEVYX0hPTUUgd2l0aCB0aGUgcGF0aCB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CisgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KKyAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KKyAgPC9jb25kaXRpb24+CisgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tU05BUFNIT1QiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYXMzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2FzMy5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+CisKKyAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImFzMy5zd2MuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2FzMy5maW5hbC5uYW1lfS5zd2MiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFzMy5wb20ueG1sIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7YXMzLmZpbmFsLm5hbWV9LnBvbSIvPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxmbGV4LmluaXQiIHVubGVzcz0iaW5pdC5maW5pc2hlZCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImluaXQuZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iY2hlY2tGbGV4SG9tZSI+CisgIDx0YXJnZXQgbmFtZT0ic2V0dXAuaW5pdCI+CisgICAgPHRzdGFtcC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgogCi0gICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KKyAgPHRhcmdldCBuYW1lPSJmbGV4LmNoZWNrIiB1bmxlc3M9IkZMRVhfSE9NRSI+CisgICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBGTEVYX0hPTUUgcHJvcGVydHkgcG9pbnRpbmcgdG8geW91ciBmbGV4IFNESywgZWcuIGFudCAtREZMRVhfSE9NRT0iL0FwcGxpY2F0aW9ucy9BZG9iZSBGbGV4IEJ1aWxkZXIgMy9zZGtzLzMuMi4wIicvPgorICA8L3RhcmdldD4KIAotICAgIDwhLS0gY29tcGMgdGFrZXMgYSBsaXN0IG9mIGNsYXNzZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcywgZWcuICJwa2cuQ2xhc3MgcGtnLkNsYXNzMiIKLSAgICAgICAgIFRvIGdlbmVyYXRlIHRoaXMsIHdlIGhhdmUgdG8gY3JlYXRlIGFuIGFudCBwYXRoLCB0aGVuIGNvbnZlcnQgaXQgdXNpbmcKLSAgICAgICAgIHBhdGhjb252ZXJ0LCByZW1vdmluZyB0aGUgcHJlZml4IHdpdGggYSBtYXAgYW5kIHJlbW92aW5nIHRoZSAuYXMgc3VmZml4IHVzaW5nCi0gICAgICAgICBhIG1hcHBlci4gIEZyb20gaHR0cDovL3NuaXBwZXRzLmR6b25lLmNvbS9wb3N0cy9zaG93LzM2MjcuCi0gICAgLS0+Ci0gICAgPHBhdGggaWQ9ImNsYXNzZXNSYXciPgorICA8dGFyZ2V0IG5hbWU9ImZsZXguaW5pdCIgZGVwZW5kcz0iZmxleC5jaGVjayIgdW5sZXNzPSJmbGV4LmZpbmlzaGVkIj4KKyAgICA8dGFza2RlZiByZXNvdXJjZT0iZmxleFRhc2tzLnRhc2tzIiBjbGFzc3BhdGg9IiR7RkxFWF9IT01FfS9hbnQvbGliL2ZsZXhUYXNrcy5qYXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZsZXguZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHBhdGggaWQ9ImFzLnNyYy5maWxlcyI+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfS8iPgotICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5hcyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmFzIi8+CiAgICAgICA8L2ZpbGVzZXQ+CiAgICAgPC9wYXRoPgotICAgIDxwYXRoY29udmVydCAKLSAgICAgIHByb3BlcnR5PSJjbGFzc2VzQ2xlYW4iIAotICAgICAgcGF0aHNlcD0iICIgCi0gICAgICBkaXJzZXA9Ii4iIAotICAgICAgcmVmaWQ9ImNsYXNzZXNSYXciPgorICAgIDxwYXRoY29udmVydAorICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIgorICAgICAgcGF0aHNlcD0iICIKKyAgICAgIGRpcnNlcD0iLiIKKyAgICAgIHJlZmlkPSJhcy5zcmMuZmlsZXMiCisgICAgPgogICAgICAgPG1hcCBmcm9tPSIke3NyY30vIiB0bz0iIi8+CiAgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouYXMiIHRvPSIqIi8+CiAgICAgPC9wYXRoY29udmVydD4KIAotICAgIDxjb21wYyBvdXRwdXQ9IiR7YnVpbGR9L2xpYnRocmlmdC5zd2MiIGluY2x1ZGUtY2xhc3Nlcz0iJHtjbGFzc2VzQ2xlYW59Ij4KKyAgICA8Y29tcGMgb3V0cHV0PSIke2FzMy5zd2MuZmlsZX0iIGluY2x1ZGUtY2xhc3Nlcz0iJHthcy5zcmMuY2xhc3Nlc30iPgogICAgICAgPHNvdXJjZS1wYXRoIHBhdGgtZWxlbWVudD0iJHtzcmN9Ii8+CiAgICAgPC9jb21wYz4KLQogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJzZXR1cC5pbml0LG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uaW5pdCIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICAgIDxlY2hvIG1lc3NhZ2U9IiR7bXZuLmFudC50YXNrLmphcn0iLz4KKyAgICA8IS0tIERvd25sb2FkIG12biBhbnQgdGFza3MsIGRvd25sb2FkIGRlcGVuZGVuY2llcywgYW5kIHNldHVwIHBvbSBmaWxlIC0tPgorICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9Ii8+CisKKyAgICA8IS0tIHJlbW90ZSByZXBvc2l0b3JpZXMgdXNlZCB0byBkb3dubG9hZCBkZXBlbmRlbmNpZXMgZnJvbSAtLT4KKyAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iY2VudHJhbCIgdXJsPSIke212bi5yZXBvfSIvPgorICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KKworICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+CisgICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIgorICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iCisgICAgICBhcnRpZmFjdElkPSIke2FzMy5hcnRpZmFjdGlkfSIKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCisgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCisgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCisgICAgICBwYWNrYWdpbmc9InN3YyIKKyAgICA+CisgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgorICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgorICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+CisgICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICB1cmw9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0IgorICAgICAgLz4KKyAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZHJlaXNzIiBuYW1lPSJEYXZpZCBSZWlzcyIvPgorICAgICAgPGRldmVsb3BlciBpZD0iYWRpdHlhIiBuYW1lPSJBZGl0eWEgQWdhcndhbCIvPgorICAgICAgPGRldmVsb3BlciBpZD0ibWFyY2siIG5hbWU9Ik1hcmMgS3dpYXRrb3dza2kiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Imp3YW5nIiBuYW1lPSJKYW1lcyBXYW5nIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjcGlybyIgbmFtZT0iQ2hyaXMgUGlybyIvPgorICAgICAgPGRldmVsb3BlciBpZD0iYm1hdXJlciIgbmFtZT0iQmVuIE1hdXJlciIvPgorICAgICAgPGRldmVsb3BlciBpZD0ia2NsYXJrIiBuYW1lPSJLZXZpbiBDbGFyayIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iSmFrZSBMdWNpYW5pIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJicnlhbmR1eGJ1cnkiIG5hbWU9IkJyeWFuIER1eGJ1cnkiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImVzdGV2ZSIgbmFtZT0iRXN0ZXZlIEZlcm5hbmRleiIvPgorICAgICAgPGRldmVsb3BlciBpZD0idG9kZCIgbmFtZT0iVG9kZCBMaXBjb24iLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImdlZWNob3JhbWEiIG5hbWU9IkFuZHJldyBNY0dlYWNoaWUiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgorICAgIDwvYXJ0aWZhY3Q6cG9tPgorCisgICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+CisgICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwb20iIGZpbGU9IiR7YXMzLnBvbS54bWx9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0ic2lnbkFuZERlcGxveSI+CisgICAgPCEtLSBTaWduIGFuZCBkZXBsb3kgamFycyB0byBhcGFjaGUgcmVwbyAtLT4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzaWZpZXIiIGRlZmF1bHQ9IiIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnaW5nIiBkZWZhdWx0PSJqYXIiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBvbSIgZGVmYXVsdD0iIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YXJ0aWZhY3Q6bXZuIGZvcms9InRydWUiPgorICAgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZ3BnLXBsdWdpbjoxLjE6c2lnbi1hbmQtZGVwbG95LWZpbGUiLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHttYXZlbi1yZXBvc2l0b3J5LWlkfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke21hdmVuLXJlcG9zaXRvcnktdXJsfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9QHtwb219Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EZmlsZT1Ae2ZpbGV9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EY2xhc3NpZmllcj1Ae2NsYXNzaWZpZXJ9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPUB7cGFja2FnaW5nfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItUGdwZyIvPgorICAgICAgPC9hcnRpZmFjdDptdm4+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0iY2xlYW4sY29tcGlsZSxtdm4uaW5pdCI+CisgICAgPCEtLSBDb21waWxlLCBwYWNrYWdlcyBhbmQgdGhlbiBzZW5kIHJlbGVhc2UgdG8gYXBhY2hlIG1hdmVuIHJlcG8gLS0+CisgICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2ggLS0+CisgICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHthczMucG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KKyAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5zd2MuZmlsZX0iIHBhY2thZ2luZz0ic3djIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KKyAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvYXMzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvYXMzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkVycm9yLmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMKaW5kZXggMDM5ZDliOS4uMzQ0OGZjZSAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMKQEAgLTQwLDExICs0MCwxNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgV1JPTkdfTUVUSE9EX05BTUU6aW50ID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IEJBRF9TRVFVRU5DRV9JRDppbnQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTUlTU0lOR19SRVNVTFQ6aW50ID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IElOVEVSTkFMX0VSUk9SOmludCA9IDY7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBQUk9UT0NPTF9FUlJPUjppbnQgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5WQUxJRF9UUkFOU0ZPUk06aW50ID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IElOVkFMSURfUFJPVE9DT0w6aW50ID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOmludCA9IDEwOwogCiAgICAgcHVibGljIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkVycm9yKHR5cGU6aW50ID0gVU5LTk9XTiwgbWVzc2FnZTpTdHJpbmcgPSAiIikgewogICAgICAgc3VwZXIobWVzc2FnZSwgdHlwZSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6VEFwcGxpY2F0aW9uRXJyb3IgewogICAgICAgdmFyIGZpZWxkOlRGaWVsZDsKICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzCmluZGV4IDQ0MTI0NzkuLmIyZmY5ZDggMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMKQEAgLTM4LDkgKzM4LDYgQEAKICAgICBwcm90ZWN0ZWQgdmFyIHN0cmljdFJlYWRfOkJvb2xlYW4gPSBmYWxzZTsKICAgICBwcm90ZWN0ZWQgdmFyIHN0cmljdFdyaXRlXzpCb29sZWFuID0gdHJ1ZTsKICAgICAKLSAgICBwcm90ZWN0ZWQgdmFyIHJlYWRMZW5ndGhfOmludDsKLSAgICBwcm90ZWN0ZWQgdmFyIGNoZWNrUmVhZExlbmd0aF86Qm9vbGVhbiA9IGZhbHNlOwotCiAgIC8qKgogICAgKiBGYWN0b3J5CiAgICAqLwpAQCAtMjk4LDcgKzI5NSw2IEBACiAgIAogICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCk6Qnl0ZUFycmF5IHsKICAgICAgICAgdmFyIHNpemU6aW50ID0gcmVhZEkzMigpOwotICAgICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7CiAgICAgICAgIHZhciBidWY6Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpOwogICAgICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwogICAgICAgICByZXR1cm4gYnVmOwpAQCAtMzA3LDI1ICszMDMsMTAgQEAKICAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRBbGwobGVuOmludCk6dm9pZCB7CiAgICAgICByZXNldChieXRlcyk7CiAgICAgICAKLSAgICAgIGNoZWNrUmVhZExlbmd0aChsZW4pOwogICAgICAgICB0cmFuc18ucmVhZEFsbChieXRlcywgMCwgbGVuKTsKICAgICAgICAgCiAgICAgICAgIGJ5dGVzLnBvc2l0aW9uID0gMDsKICAgICAgIH0KLSAgCi0gICAgcHVibGljIGZ1bmN0aW9uIHNldFJlYWRMZW5ndGgocmVhZExlbmd0aDppbnQpOnZvaWQgewotICAgICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotICAgICAgY2hlY2tSZWFkTGVuZ3RoXyA9IHRydWU7Ci0gICAgfQotICAKLSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tSZWFkTGVuZ3RoKGxlbmd0aDppbnQpOnZvaWQgewotICAgICAgICBpZiAoY2hlY2tSZWFkTGVuZ3RoXykgewotICAgICAgICAgICAgcmVhZExlbmd0aF8gLT0gbGVuZ3RoOwotICAgICAgICAgICAgaWYgKHJlYWRMZW5ndGhfIDwgMCkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgVEVycm9yKCJNZXNzYWdlIGxlbmd0aCBleGNlZWRlZDogIiArIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZXNldChhcnI6Qnl0ZUFycmF5KTp2b2lkIHsKICAgICAgIGFyci5sZW5ndGggPSAwOwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcwppbmRleCBjNTc4OGRiLi45ZmZmNzMwIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcwpAQCAtMjksNiArMjksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgU0laRV9MSU1JVDppbnQgPSAzOwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgQkFEX1ZFUlNJT046aW50ID0gNDsKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IE5PVF9JTVBMRU1FTlRFRDppbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgREVQVEhfTElNSVQ6aW50ID0gNjsKICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIFRQcm90b2NvbEVycm9yKGVycm9yOmludCA9IFVOS05PV04sIG1lc3NhZ2U6U3RyaW5nID0gIiIpIHsKICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCmluZGV4IDMzNzQ5ODYuLjg2M2M1OWIgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcwpAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5zb2NrZXQ7CiAgICAgICAgICAgICB0aGlzLmlucHV0ID0gdGhpcy5zb2NrZXQ7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZVVURigiQ09OTkVDVCAiICsgcmVzb3VyY2UgKyAiIEhUVFAvMS4xXG4iICsgIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIiArICJVc2VyLUFnZW50OiBCYXR0bGVOZXRcclxuIiArICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4iICsgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiArICJBY2NlcHQ6ICovKlxyXG5cclxuIik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZVVURigiQ09OTkVDVCAiICsgcmVzb3VyY2UgKyAiIEhUVFAvMS4xXG4iICsgIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIiArICJVc2VyLUFnZW50OiBUaHJpZnQvQVMzXHJcbiIgKyAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuIiArICJjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgKyAiQWNjZXB0OiAqLypcclxuXHJcbiIpOwogICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmFzCmluZGV4IGE2M2UzMTQuLjQzNWY5MTEgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuYXMKQEAgLTI3LDYgKzI3LDcgQEAKICAgaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXJEYXRhRm9ybWF0OwogICBpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3Q7CiAgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdE1ldGhvZDsKKyAgaW1wb3J0IGZsYXNoLnN5c3RlbS5DYXBhYmlsaXRpZXM7CiAgIGltcG9ydCBmbGFzaC51dGlscy5CeXRlQXJyYXk7CiAgIAogICAvKioKQEAgLTM4LDE0ICszOSwxOSBAQAogICAgIHByaXZhdGUgdmFyIHJlcXVlc3RfOlVSTFJlcXVlc3QgPSBudWxsOwogICAgIHByaXZhdGUgdmFyIHJlcXVlc3RCdWZmZXJfOkJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXkoKTsKICAgICBwcml2YXRlIHZhciByZXNwb25zZUJ1ZmZlcl86Qnl0ZUFycmF5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciB0cmFjZUJ1ZmZlcnNfOkJvb2xlYW4gPSBDYXBhYmlsaXRpZXMuaXNEZWJ1Z2dlcjsKKwogICAgIAogICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKTpCeXRlQXJyYXkgewogICAgICAgcmV0dXJuIHJlcXVlc3RCdWZmZXJfOwogICAgIH0KICAgICAKLSAgICBwdWJsaWMgZnVuY3Rpb24gVEh0dHBDbGllbnQocmVxdWVzdDpVUkxSZXF1ZXN0KTp2b2lkIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gVEh0dHBDbGllbnQocmVxdWVzdDpVUkxSZXF1ZXN0LCB0cmFjZUJ1ZmZlcnM6Qm9vbGVhbj10cnVlKTp2b2lkIHsKICAgICAgIHJlcXVlc3QuY29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOwogICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OworICAgICAgaWYodHJhY2VCdWZmZXJzID09IGZhbHNlKSB7CisgICAgICAgIHRyYWNlQnVmZmVyc18gPSB0cmFjZUJ1ZmZlcnM7CisgICAgICB9CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCk6dm9pZCB7CkBAIC02NCw5ICs3MCwxNiBAQAogICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVzcG9uc2VCdWZmZXJfLnJlYWRCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICh0cmFjZUJ1ZmZlcnNfKSB7CisgICAgICAgICAgICAgIGR1bXBCdWZmZXIoYnVmLCAiUkVBRCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGxlbjsKICAgICAgICAgICB9CiAgICAgICAgICAgY2F0Y2ggKGU6RU9GRXJyb3IpIHsKKyAgICAgICAgICAgIGlmICh0cmFjZUJ1ZmZlcnNfKSB7CisgICAgICAgICAgICAgIGR1bXBCdWZmZXIocmVxdWVzdEJ1ZmZlcl8sICJGQUlMRUQtUkVTUE9OU0UtUkVRVUVTVCIpOworICAgICAgICAgICAgICBkdW1wQnVmZmVyKHJlc3BvbnNlQnVmZmVyXywgIkZBSUxFRC1SRVNQT05TRSIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC04MSw2ICs5NCw5IEBACiAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICBsb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSwgZnVuY3Rpb24oZXZlbnQ6RXZlbnQpOnZvaWQgewogICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gVVJMTG9hZGVyKGV2ZW50LnRhcmdldCkuZGF0YTsKKyAgICAgICAgIGlmICh0cmFjZUJ1ZmZlcnNfKSB7CisgICAgICAgICAgIGR1bXBCdWZmZXIocmVzcG9uc2VCdWZmZXJfLCAiUkVTUE9OU0VfQlVGRkVSIik7CisgICAgICAgICB9CiAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgIHJlc3BvbnNlQnVmZmVyXyA9IG51bGw7CiAgICAgICAgIH0pOwpAQCAtOTksNSArMTE1LDIwIEBACiAgICAgICByZXF1ZXN0Xy5kYXRhID0gcmVxdWVzdEJ1ZmZlcl87CiAgICAgICBsb2FkZXIubG9hZChyZXF1ZXN0Xyk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBkdW1wQnVmZmVyKGJ1ZjpCeXRlQXJyYXksIHByZWZpeDpTdHJpbmcpOlN0cmluZyB7CisgICAgICB2YXIgZGVidWdTdHJpbmcgOiBTdHJpbmcgPSBwcmVmaXggKyAiIEJVRkZFUiAiOworICAgICAgaWYgKGJ1ZiAhPSBudWxsKSB7CisgICAgICAgIGRlYnVnU3RyaW5nICs9ICJsZW5ndGg6ICIgKyBidWYubGVuZ3RoICsgIiwgIjsKKyAgICAgICAgZm9yICh2YXIgaSA6IGludCA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBkZWJ1Z1N0cmluZyArPSAiWyIgKyBidWZbaV0udG9TdHJpbmcoMTYpICsgIl0iOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWJ1Z1N0cmluZyA9ICJudWxsIjsKKyAgICAgIH0KKyAgICAgIHRyYWNlKGRlYnVnU3RyaW5nKTsKKyAgICAgIHJldHVybiBkZWJ1Z1N0cmluZzsKKyAgICB9CisKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBkNzExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICoJCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydAoreworCisgIGltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOworICBpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OworICBpbXBvcnQgZmxhc2guZXZlbnRzLklPRXJyb3JFdmVudDsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5Qcm9ncmVzc0V2ZW50OworICBpbXBvcnQgZmxhc2guZXZlbnRzLlNlY3VyaXR5RXJyb3JFdmVudDsKKyAgaW1wb3J0IGZsYXNoLmVycm9ycy5FT0ZFcnJvcjsKKyAgaW1wb3J0IGZsYXNoLmVycm9ycy5JT0Vycm9yOworICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlcjsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXJEYXRhRm9ybWF0OworICBpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3Q7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdE1ldGhvZDsKKyAgaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhSW5wdXQ7CisgIGltcG9ydCBmbGFzaC51dGlscy5JRGF0YU91dHB1dDsKKyAgaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTsKKyAgaW1wb3J0IGZsYXNoLm5ldC5Tb2NrZXQ7CisKKworICAvKioKKyAgICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyAgICogVGhyaWZ0IFNvY2tldCBTZXJ2ZXIgYmFzZWQgaW1wbGVtZW50YXRpb25zLgorICAgKi8KKworICBwdWJsaWMgY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKKyAgeworICAgIHByaXZhdGUgdmFyIHNvY2tldDpTb2NrZXQgPSBudWxsOworCisgICAgcHJpdmF0ZSB2YXIgaG9zdDpTdHJpbmc7CisKKyAgICBwcml2YXRlIHZhciBwb3J0OmludDsKKworICAgIHByaXZhdGUgdmFyIG9idWZmZXI6Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpOworCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQ6SURhdGFJbnB1dDsKKworICAgIHByaXZhdGUgdmFyIG91dHB1dDpJRGF0YU91dHB1dDsKKworICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsOworCisgICAgcHJpdmF0ZSB2YXIgZXZlbnREaXNwYXRjaGVyOkV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBUU29ja2V0KGhvc3Q6U3RyaW5nLCBwb3J0OmludCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmlucHV0ID0gbnVsbDsKKyAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKKyAgICAgIHNvY2tldC5jbG9zZSgpCisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKTpCb29sZWFuCisgICAgeworICAgICAgaWYoc29ja2V0LmNvbm5lY3RlZCkKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoIkJ5dGVzIHJlbWFpbmVkOiIgKyBzb2NrZXQuYnl0ZXNBdmFpbGFibGUpOworICAgICAgICByZXR1cm4gc29ja2V0LmJ5dGVzQXZhaWxhYmxlPjA7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmOkJ5dGVBcnJheSwgb2ZmOmludCwgbGVuOmludCk6aW50CisgICAgeworICAgICAgdmFyIG4xOmludCA9IDAsIG4yOmludCA9IDAsIG4zOmludCA9IDAsIG40OmludCA9IDAsIGNpZHg6aW50ID0gMjsKKyAgICAgIHZhciBjaHVua1NpemU6Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpOworCisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgaW5wdXQucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgICAgfQorICAgICAgY2F0Y2ggKGU6RU9GRXJyb3IpCisgICAgICB7CisgICAgICAgIHRyYWNlKGUpOworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5FTkRfT0ZfRklMRSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7CisgICAgICB9CisgICAgICBjYXRjaCAoZTpJT0Vycm9yKQorICAgICAgeworICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgaWYoaXNPcGVuKCkpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5VTktOT1dOLCAiSU8gZXJyb3Igd2hpbGUgcmVhZGluZzogIiArIGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLk5PVF9PUEVOLCAiU29ja2V0IHNlZW0gbm90IHRvIGJlIG9wZW5lZDogIiArIGUpOworICAgIAl9CisgICAgICB9CisgICAgICBjYXRjaCAoZTpFcnJvcikKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLlVOS05PV04sICJCYWQgSU8gZXJyb3I6ICIgKyBlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZUFycmF5LCBvZmY6aW50LCBsZW46aW50KTp2b2lkCisgICAgeworICAgICAgb2J1ZmZlci53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UsIHByaW9yaXR5OmludCA9IDAsIHVzZVdlYWtSZWZlcmVuY2U6Qm9vbGVhbiA9IGZhbHNlKTp2b2lkCisgICAgeworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSwgcHJpb3JpdHksIHVzZVdlYWtSZWZlcmVuY2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOlN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24sIHVzZUNhcHR1cmU6Qm9vbGVhbiA9IGZhbHNlKTp2b2lkCisgICAgeworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKTp2b2lkCisgICAgeworICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTk5FQ1QsIHNvY2tldENvbm5lY3RlZCk7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgc29ja2V0RXJyb3IpOworICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihTZWN1cml0eUVycm9yRXZlbnQuU0VDVVJJVFlfRVJST1IsIHNvY2tldFNlY3VyaXR5RXJyb3IpOworICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihQcm9ncmVzc0V2ZW50LlNPQ0tFVF9EQVRBLCBzb2NrZXREYXRhSGFuZGxlcik7CisgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRDb25uZWN0ZWQoZXZlbnQ6RXZlbnQpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OworICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldEVycm9yKGV2ZW50OklPRXJyb3JFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIHRyYWNlKCJFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICBpZiAoaW9DYWxsYmFjayA9PSBudWxsKQorICAgICAgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLlVOS05PV04sICJJT0Vycm9yOiAiICsgZXZlbnQudGV4dCkpOworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldFNlY3VyaXR5RXJyb3IoZXZlbnQ6U2VjdXJpdHlFcnJvckV2ZW50KTp2b2lkCisgICAgeworICAgICAgdHJhY2UoIlNlY3VyaXR5IEVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXREYXRhSGFuZGxlcihldmVudDpQcm9ncmVzc0V2ZW50KTp2b2lkCisgICAgeworICAgICAgaWYgKGlvQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgaW9DYWxsYmFjayhudWxsKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmlvQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXModGhpcy5vYnVmZmVyKTsKKyAgICAgIHRoaXMuc29ja2V0LmZsdXNoKCk7CisgICAgICB0aGlzLm9idWZmZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCk6Qm9vbGVhbgorICAgIHsKKyAgICAgIHJldHVybiAodGhpcy5zb2NrZXQgPT0gbnVsbCA/IGZhbHNlIDogdGhpcy5zb2NrZXQuY29ubmVjdGVkKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQgYi9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDNhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsODYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIEZpbmQgcmVxdWlyZWQgcGFja2FnZXMKK2ZpbmRfcGFja2FnZShHTElCIFJFUVVJUkVEIENPTVBPTkVOVFMgZ29iamVjdCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtHTElCX0lOQ0xVREVfRElSU30pCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoc3JjKQorCisjIFNZU0xJQlMgY29udGFpbnMgbGlicmFyaWVzIHRoYXQgbmVlZCB0byBiZSBsaW5rZWQgdG8gYWxsIGxpYiB0YXJnZXRzCitzZXQoU1lTTElCUyAke0dMSUJfTElCUkFSSUVTfSAke0dMSUJfR09CSkVDVF9MSUJSQVJJRVN9KQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMgZ2xpYiBsaWJyYXJ5CitzZXQodGhyaWZ0X2NfZ2xpYl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKKykKKworIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisJICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCisgICAgKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKyAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke09QRU5TU0xfTElCUkFSSUVTfSIpCitlbmRpZigpCisKKworIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIEFERF9MSUJSQVJZX1RIUklGVCBhbmQgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVAoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK0FERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRfY19nbGliICR7dGhyaWZ0X2NfZ2xpYl9TT1VSQ0VTfSkKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0X2NfZ2xpYiAke1NZU0xJQlN9KQorCisjIEluc3RhbGwgdGhlIGhlYWRlcnMKK2luc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQorIyBDb3B5IGNvbmZpZy5oIGZpbGUKK2luc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0JJTkFSWV9ESVJ9L3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvY19nbGliL01ha2VmaWxlLmFtIGIvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OWI1YjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCitTVUJESVJTID0gLiB0ZXN0CisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKKworbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0X2NfZ2xpYi5sYQorcGtnY29uZmlnX0RBVEEgPSB0aHJpZnRfY19nbGliLnBjCisKK0FNX0NQUEZMQUdTID0gLUlzcmMgLUkgc3JjL3RocmlmdC9jX2dsaWIKK0FNX0NGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCisKKyMgRGVmaW5lIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBtb2R1bGUKKworbGlidGhyaWZ0X2NfZ2xpYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworCitsaWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpCitsaWJ0aHJpZnRfY19nbGliX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykgCisKK2luY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQvY19nbGliCitpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9jb25maWcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oCisKK2luY2x1ZGVfcHJvdG9jb2xkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm90b2NvbAoraW5jbHVkZV9wcm90b2NvbF9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworaW5jbHVkZV90cmFuc3BvcnRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKK2luY2x1ZGVfdHJhbnNwb3J0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCisKK2luY2x1ZGVfc2VydmVyZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvc2VydmVyCitpbmNsdWRlX3NlcnZlcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKKworaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKK2luY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKKyAgICAgICAgICAgICB0ZXN0L2dsaWIuc3VwcHJlc3MgXAorICAgICAgICAgICAgIHRocmlmdF9jX2dsaWIucGMuaW4KKworQ0xFQU5GSUxFUyA9IFwKKyAgICAgICAgICAgICAqLmdjbm8gXAorICAgICAgICAgICAgICouZ2NkYQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9SRUFETUUubWQgYi9saWIvY19nbGliL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg0ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9SRUFETUUubWQKQEAgLTAsMCArMSw0OSBAQAorVGhyaWZ0IEMgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBDCis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBUaHJpZnQgQyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuICBGb2xsb3cgdGhlIGluc3RydWN0aW9ucworaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIE1ha2VmaWxlcy4KKworRGVwZW5kZW5jaWVzCis9PT09PT09PT09PT0KKworR0xpYgoraHR0cDovL3d3dy5ndGsub3JnLworCitCcmVha2luZyBDaGFuZ2VzCis9PT09PT09PT09PT09PT09CisKKzAuMTIuMAorLS0tLS0tCisKK1RoZSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIHRoZSBuYW1lIG9mIHR5cGVzLAorZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQuIFRoaXMgbWVhbnMgY29kZSB3cml0dGVuIHRvIHVzZQorY2xhc3NlcyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8KK3JlZmxlY3QgdGhlIHByb3BlciBjb252ZW50aW9uIGZvciBjbGFzcyBuYW1lcywgd2hpY2ggaXMKKworLSBBIGxvd2VyY2FzZSwgW3NuYWtlLWNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZXNwYWNlLCBmb2xsb3dlZCBieQorLSBBbiB1bmRlcnNjb3JlIGFuZAorLSBBIGxvd2VyY2FzZSwgc25ha2UtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWUuCmRpZmYgLS1naXQgYS9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiM2EwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDUgQEAKKyMjIEMgR2xpYiBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW0dOT01FIEMgQ29kaW5nIFN0eWxlXShodHRwczovL2hlbHAuZ25vbWUub3JnL3VzZXJzL3Byb2dyYW1taW5nLWd1aWRlbGluZXMvc3RhYmxlL2MtY29kaW5nLXN0eWxlLmh0bWwuZW4pCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkNjIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST0NFU1NPUikKKworZ2Jvb2xlYW4KK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdjaGFyICpmbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKKyAgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciA9CisgICAgVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUiAocHJvY2Vzc29yKTsKKworICAvKiBSZWFkIHRoZSBzdGFydCBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggd2UgZXhwZWN0IHRvIGJlIGEgbWV0aG9kIGNhbGwgKi8KKyAgaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIDwgMCkgeworICAgIGdfd2FybmluZyAoImVycm9yIHJlYWRpbmcgc3RhcnQgb2YgbWVzc2FnZTogJXMiLAorICAgICAgICAgICAgICAgKGVycm9yICE9IE5VTEwpID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UgaWYgKG10eXBlICE9IFRfQ0FMTCAmJiBtdHlwZSAhPSBUX09ORVdBWSkgeworICAgIGdfd2FybmluZyAoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIERpc3BhdGNoIHRoZSBtZXRob2QgY2FsbCAqLworICByZXR1cm4gVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9HRVRfQ0xBU1MgKGRpc3BhdGNoX3Byb2Nlc3NvcikKKyAgICAtPmRpc3BhdGNoX2NhbGwgKGRpc3BhdGNoX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGluLAorICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3JlYWxfZGlzcGF0Y2hfY2FsbCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIGdpbnQzMiByZXN1bHQ7CisgIGdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKKworICAvKiBCeSBkZWZhdWx0LCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUKKyAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisKKyAgaWYgKCh0aHJpZnRfcHJvdG9jb2xfc2tpcCAoaW4sIFRfU1RSVUNULCBlcnJvcikgPCAwKSB8fAorICAgICAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbiwgZXJyb3IpIDwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfb2JqZWN0X2dldCAoaW4sICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgcmVzdWx0ID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcik7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICBpZiAocmVzdWx0IDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIG1lc3NhZ2UgPSBnX3N0cmNvbmNhdCAoIkludmFsaWQgbWV0aG9kIG5hbWU6ICciLCBmbmFtZSwgIiciLCBOVUxMKTsKKyAgZ19mcmVlIChmbmFtZSk7CisgIHhjZXB0aW9uID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2ZyZWUgKG1lc3NhZ2UpOworICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICBpZiAoKHJlc3VsdCA8IDApIHx8CisgICAgICAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChvdXQsIGVycm9yKSA8IDApKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX29iamVjdF9nZXQgKG91dCwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICBkaXNwYXRjaF9yZXN1bHQgPQorICAgICgodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpID49IDApICYmCisgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiBkaXNwYXRjaF9yZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2luaXQgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyAqcHJvY2Vzc29yX2NsYXNzID0KKyAgICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTIChrbGFzcyk7CisKKyAgLyogSW1wbGVtZW50IFRocmlmdFByb2Nlc3NvcidzIHByb2Nlc3MgbWV0aG9kICovCisgIHByb2Nlc3Nvcl9jbGFzcy0+cHJvY2VzcyA9IHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzczsKKworICAvKiBQcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnQgZm9yIGRpc3BhdGNoX2NhbGwsIHdoaWNoIHJldHVybnMgYW4gZXhjZXB0aW9uCisgICAgIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUgbWV0aG9kIG5hbWUgd2FzIG5vdCByZWNvZ25pemVkICovCisgIGtsYXNzLT5kaXNwYXRjaF9jYWxsID0gdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9yZWFsX2Rpc3BhdGNoX2NhbGw7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfSAorI2RlZmluZSBfVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmgKKyAqICBcYnJpZWYgUGFyc2VzIGEgbWV0aG9kLWNhbGwgbWVzc2FnZSBoZWFkZXIgYW5kIGludm9rZXMgYSBmdW5jdGlvbgorICogICAgICAgICB0byBkaXNwYXRjaCB0aGUgY2FsbCBieSBmdW5jdGlvbiBuYW1lLgorICoKKyAqIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGlzIGFuIGFic3RyYWN0IGhlbHBlciBjbGFzcyB0aGF0IHBhcnNlcyB0aGUKKyAqIGhlYWRlciBvZiBhIG1ldGhvZC1jYWxsIG1lc3NhZ2UgYW5kIGludm9rZXMgYSBtZW1iZXIgZnVuY3Rpb24sCisgKiBkaXNwYXRjaF9jYWxsLCB3aXRoIHRoZSBtZXRob2QncyBuYW1lLgorICoKKyAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZGlzcGF0Y2hfY2FsbCB0byBkaXNwYXRjaCB0aGUgbWV0aG9kIGNhbGwKKyAqIHRvIHRoZSBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KKworLyogVHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SICh0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SLCBUaHJpZnREaXNwYXRjaFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19ESVNQQVRDSF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SLCBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzKSkKKworLyohCisgKiBUaHJpZnQgRGlzcGF0Y2ggUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBEaXNwYXRjaCBQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICAvKiBwdWJsaWMgKi8KKyAgZ2Jvb2xlYW4gKCpwcm9jZXNzKSAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisgIC8qIHByb3RlY3RlZCAqLworICBnYm9vbGVhbiAoKmRpc3BhdGNoX2NhbGwpIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3M7CisKKy8qIFVzZWQgYnkgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgYSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGEwZjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IsIFRIUklGVF9UWVBFX1BST0NFU1NPUikKKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkQKK307CisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkRdID0geyBOVUxMLCB9OworCisKK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3JfaW1wbChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihwcm9jZXNzb3IpOworICBnX2hhc2hfdGFibGVfcmVwbGFjZShzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywKKwkJICAgICAgIGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKSwKKwkJICAgICAgIGdfb2JqZWN0X3JlZiAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yKSk7CisKKyAgLyogTWFrZSBmaXJzdCByZWdpc3RlcmVkIGJlY29tZSBkZWZhdWx0ICovCisgIGlmKCFzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBnX3N0cmR1cChtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbCAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKwkJCQkJICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBnYm9vbGVhbiB0b2tlbl9lcnJvciA9IEZBTFNFOworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGU7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihwcm9jZXNzb3IpOworICBUaHJpZnRQcm9jZXNzb3IgKm11bHRpcGxleGVkX3Byb2Nlc3NvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBjaGFyICp0b2tlbj1OVUxMOworICBpbnQgdG9rZW5faW5kZXg9MDsKKyAgY2hhciAqc3RhdGU9TlVMTDsKKyAgZ2NoYXIgKmZuYW1lPU5VTEw7CisgIGdpbnQzMiBzZXFpZCwgcmVzdWx0OworCisgIC8qIEZJWE1FIEl0IHNlZW1zIHRoYXQgcHJldmlvdXMgcHJvY2Vzc29yIGlzIG5vdCBtYW5hZ2luZyBlcnJvciBjb3JyZWN0bHkgKi8KKyAgaWYoKmVycm9yIT1OVUxMKSB7CisgICAgICBnX2RlYnVnICgidGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvcjogbGFzdCBlcnJvciBub3QgcmVtb3ZlZDogJXMiLAorICAgICAgCQkgICAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgICAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICB9CisKKworICBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTKGluKS0+cmVhZF9tZXNzYWdlX2JlZ2luKGluLCAmZm5hbWUsICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgZXJyb3IpOworCisgIGlmKCEobWVzc2FnZV90eXBlID09IFRfQ0FMTCB8fCBtZXNzYWdlX3R5cGUgPT0gVF9PTkVXQVkpKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9UWVBFLAorCQkgICAibWVzc2FnZSB0eXBlIGludmFsaWQgZm9yIHRoaXMgcHJvY2Vzc29yIik7CisgIH1lbHNleworICAgICAgLyogU3BsaXQgYnkgdGhlIHRva2VuICovCisgICAgICBmb3IgKHRva2VuID0gc3RydG9rX3IoZm5hbWUsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgJnN0YXRlKSwKKwkgIHRva2VuX2luZGV4PTA7CisJICB0b2tlbiAhPSBOVUxMICYmICF0b2tlbl9lcnJvcjsKKwkgIHRva2VuID0gc3RydG9rX3IoTlVMTCwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgICAgIHRva2VuX2luZGV4KyspCisJeworCSAgc3dpdGNoKHRva2VuX2luZGV4KXsKKwkgICAgY2FzZSAwOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gZ19oYXNoX3RhYmxlX2xvb2t1cChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywgdG9rZW4pOworCSAgICAgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJCSAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgICAvKiBJdCBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKwkgICAgICBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsCisJCQkJCQkgICAgICAicHJvdG9jb2wiLCBpbiwKKwkJCQkJCSAgICAgICJuYW1lIiwgdG9rZW4sCisJCQkJCQkgICAgICAidHlwZSIsIG1lc3NhZ2VfdHlwZSwKKwkJCQkJCSAgICAgICJzZXFpZCIsIHNlcWlkLAorCQkJCQkJICAgICAgTlVMTCk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorCQkJICAgInRoZSBtZXNzYWdlIGhhcyBtb3JlIHRva2VucyB0aGFuIGV4cGVjdGVkISIpOworCSAgICAgIHRva2VuX2Vycm9yPVRSVUU7CisJICAgICAgYnJlYWs7CisJICB9CisJfQorICAgICAgLyogU2V0IGRlZmF1bHQgKi8KKyAgICAgIGlmKCFzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCAmJgorCSAgIW11bHRpcGxleGVkX3Byb2Nlc3NvciAmJgorCSAgdG9rZW5faW5kZXg9PTEgJiYgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisJICAvKiBJdCBzaG91bGQgYmUgdGhlIHNlcnZpY2UgbmFtZSAqLworCSAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gZ19oYXNoX3RhYmxlX2xvb2t1cChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICBpZihtdWx0aXBsZXhlZF9wcm9jZXNzb3I9PU5VTEwpeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCQkgICAic2VydmljZSAlcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcHJvY2Vzc29yIiwKKwkJCSAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworCSAgfWVsc2V7CisJICAgICAgLyogU2V0IHRoZSBtZXNzYWdlIG5hbWUgdG8gdGhlIG9yaWdpbmFsIG5hbWUgKi8KKwkgICAgICBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsCisJCQkJCQkgICAgICAicHJvdG9jb2wiLCBpbiwKKwkJCQkJCSAgICAgICJuYW1lIiwgZm5hbWUsCisJCQkJCQkgICAgICAidHlwZSIsIG1lc3NhZ2VfdHlwZSwKKwkJCQkJCSAgICAgICJzZXFpZCIsIHNlcWlkLAorCQkJCQkJICAgICAgTlVMTCk7CisJICB9CisKKyAgICAgIH0KKworICAgICAgaWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2whPU5VTEwgJiYgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yIT1OVUxMKXsKKwkgIHJldHZhbCA9IFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpLT5wcm9jZXNzIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIChUaHJpZnRQcm90b2NvbCAqKSBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCwgb3V0LCBlcnJvcikgOworICAgICAgfWVsc2V7CisJICBpZighZXJyb3IpCisJICBnX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkgICAgICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorCQkgICAgICAgInNlcnZpY2UgJXMgaXMgbm90IG11bHRpcGxleGVkIGluIHRoaXMgcHJvY2Vzc29yIiwKKwkJICAgICAgIGZuYW1lKTsKKyAgICAgIH0KKworCisgIH0KKworICBpZighcmV0dmFsKXsKKyAgICAgIC8qIEJ5IGRlZmF1bHQsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZQorICAgICAgICAgIG1ldGhvZCBuYW1lIGlzIG5vdCByZWNvZ25pemVkLiAqLworICAgICAgLyogQ29waWVkIGZyb20gZGlzcGFjaCBwcm9jZXNzb3IgKi8KKworICAgICAgaWYgKCh0aHJpZnRfcHJvdG9jb2xfc2tpcCAoaW4sIFRfU1RSVUNULCBlcnJvcikgPCAwKSB8fAorCSAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbiwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChpbiwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmVzdWx0ID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcik7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisJICByZXR1cm4gcmV0dmFsOworICAgICAgfQorCisgICAgICBpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dCwKKwkJCQkJICAgICAgIGZuYW1lLAorCQkJCQkgICAgICAgVF9FWENFUFRJT04sCisJCQkJCSAgICAgICBzZXFpZCwKKwkJCQkJICAgICAgIGVycm9yKSA8IDApeworCSAgLyogV2UgbXVzdCBmcmVlIGZuYW1lICovCisJICBnX2ZyZWUoZm5hbWUpOworCisJICByZXR1cm4gcmV0dmFsOworICAgICAgfQorCisKKyAgICAgIHhjZXB0aW9uID0KKwkgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAorCQkJInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorCQkJIm1lc3NhZ2UiLCAoKmVycm9yKS0+bWVzc2FnZSwKKwkJCU5VTEwpOworICAgICAgcmVzdWx0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLAorCQkJCSAgICBvdXQsCisJCQkJICAgIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgICAgICBpZiAoKHJlc3VsdCA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChvdXQsIGVycm9yKSA8IDApKQorCXJldHVybiByZXR2YWw7CisKKyAgICAgIGdfb2JqZWN0X2dldCAob3V0LCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXR2YWwgPQorCSAgKCh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkgJiYKKwkgICAgICAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIH1lbHNleworICAgICAgLyogVGhlIHByb3RvY29sIG5vdyBoYXMgYSBjb3B5IHdlIGNhbiBmcmVlIGl0ICovCisgICAgICBnX2ZyZWUoZm5hbWUpOworCisgIH0KKworICAvKgorICBGSVhNRSBUaGlzIG1ha2VzIGV2ZXJ5dGhpbmcgZmFpbCwgSSBkb24ndCBrbm93IHdoeS4KKyAgaWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2whPU5VTEwpeworCSAgLy8gQWZ0ZXIgaXRzIHVzZSB3ZSBtdXN0IGZyZWUgaXQKKwkgIGdfb2JqZWN0X3VucmVmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sKTsKKyAgfQorICAqLworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCitHUXVhcmsKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9ET01BSU4pOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FOgorICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqZWN0KTsKKworICAvKiBGcmVlIG91ciBtdWx0aXBsZXhlZCBoYXNoIHRhYmxlICovCisgIGdfaGFzaF90YWJsZV91bnJlZiAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMpOworICBzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyA9IE5VTEw7CisKKyAgaWYoc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisgICAgICBnX2ZyZWUoc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lPU5VTEw7CisgIH0KKworICAvKiBDaGFpbiB1cCB0byBwYXJlbnQgKi8KKyAgaWYgKEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKQorICAgICgqR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MgKmNscykKK3sKKyAgLyogT3ZlcnJpZGUgKi8KKyAgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhjbHMpLT5wcm9jZXNzID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzX2ltcGw7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIC8qIE9iamVjdCBtZXRob2RzICovCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplOworCisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5yZWdpc3Rlcl9wcm9jZXNzb3IgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsOworCisKKyAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZWZhdWx0IiwKKyAgICAgICAgICAiRGVmYXVsdCBzZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byB3aGVyZSBubyBtdWx0aXBsZXhlZCBjbGllbnQgdXNlZCIsCisgICAgICAgICAgIlNldCB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUiLAorICAgICAgICAgIE5VTEwsCisgICAgICAgICAgKEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChnb2JqZWN0X2NsYXNzLAorCQkJCSAgICAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORCwKKyAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXMpOworCit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmKQoreworCisgIC8qIENyZWF0ZSBvdXIgbXVsdGlwbGV4ZWQgc2VydmljZXMgaGFzaCB0YWJsZSAqLworICBzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoCisgICAgICBnX3N0cl9oYXNoLAorICAgICAgZ19zdHJfZXF1YWwsCisgICAgICBnX2ZyZWUsCisgICAgICBnX29iamVjdF91bnJlZik7CisgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBOVUxMOworfQorCisKK2dib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0dFVF9DTEFTUyhwcm9jZXNzb3IpLT5yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCBlcnJvcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDY2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKKyAqCisgKiAgQ3JlYXRlZCBvbjogMTQgc2VwdC4gMjAxNworICogICAgICBBdXRob3I6IGdhZ3VpbGFyCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXworCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICogIFxicmllZiBUaGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGZvciBjX2dsaWIuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzKSkKKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTiAidGhyaWZ0LW11bHRpcGxleGVkLXByb2Nlc3Nvci1lcnJvci1xdWFyayIKKworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZFByb2Nlc3NvciBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcgoreworICBUaHJpZnRQcm9jZXNzb3IgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2NoYXIgKiBkZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lOworICBHSGFzaFRhYmxlICptdWx0aXBsZXhlZF9zZXJ2aWNlczsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcworeworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogcmVnaXN0ZXJfcHJvY2Vzc29yKSAoVGhyaWZ0UHJvY2Vzc29yICpzZWxmLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcik7CisKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzOworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiAqLworR1R5cGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgUmVnaXN0ZXJzIGEgcHJvY2Vzc29yIGluIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgdW5kZXIgaXRzIG5hbWUuIEl0CisgKiB3aWxsIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3NvciBzbyByZWZjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkLgorICogSXQgd2lsbCBhbHNvIGJlIGRlY3JlbWVudGVkIG9uIG9iamVjdCBkZXN0cnVjdGlvbi4KKyAqCisgKiBUaGUgZmlyc3QgcmVnaXN0ZXJlZCBwcm9jZXNzb3IgYmVjb21lcyBkZWZhdWx0LiBCdXQgeW91IGNhbiBvdmVycmlkZSBpdCB3aXRoCisgKiAiZGVmYXVsdCIgcHJvcGVydHkuCisgKgorICogSXQgcmV0dXJucyBhIGNvbXBsaWFudCBlcnJvciBpZiBpdCBjYW5ub3QgYmUgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcGFyYW0gcHJvY2Vzc29yIFBvaW50ZXIgdG8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3Nvci4KKyAqIEBwYXJhbSBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSBOYW1lIG9mIHRoZSBwcm9jZXNzb3IgeW91IHdhbnQgdG8gcmVnaXN0ZXIKKyAqIEBwYXJhbSBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgUG9pbnRlciB0byBpbXBsZW1lbnRlZCBwcm9jZXNzb3IgeW91IHdhbnQgbXVsdGlwbGV4LgorICogQHBhcmFtIGVycm9yIEVycm9yIG9iamVjdCB3aGVyZSB3ZSBzaG91bGQgc3RvcmUgZXJyb3JzLgorICoKKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dsaWIvc3RhYmxlL2dsaWItRXJyb3ItUmVwb3J0aW5nLmh0bWwjZy1zZXQtZXJyb3IKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9UWVBFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfV1JPTkdMWV9NVUxUSVBMRVhFRCwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRU5ELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1JFQ0VJVkUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfQ0xPU0UKK30gVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JFcnJvcjsKKworCitHUXVhcmsgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKCkpCisKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb2Nlc3NvciwgdGhyaWZ0X3Byb2Nlc3NvciwgR19UWVBFX09CSkVDVCkKKworZ2Jvb2xlYW4KK3RocmlmdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybgorICAgIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChwcm9jZXNzb3IpLT5wcm9jZXNzIChwcm9jZXNzb3IsIGluLCBvdXQsIGVycm9yKTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgKmNscykKK3sKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+cHJvY2VzcyA9IHRocmlmdF9wcm9jZXNzb3JfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm9jZXNzb3IpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPQ0VTU09SX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm9jZXNzb3IuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb2Nlc3NvcnMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICh0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3IpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvckNsYXNzKSkKKworLyohCisgKiBUaHJpZnQgUHJvY2Vzc29yb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yCit7CisgIEdPYmplY3QgcGFyZW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm9jZXNzb3IgVGhyaWZ0UHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRQcm9jZXNzb3JDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKnByb2Nlc3MpIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcik7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzIFRocmlmdFByb2Nlc3NvckNsYXNzOworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST0NFU1NPUiAqLworR1R5cGUgdGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmQwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDkxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbCwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKK3N0YXRpYyBndWludDY0Cit0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGdkb3VibGUgdikKK3sKKyAgdW5pb24geworICAgIGdkb3VibGUgZnJvbTsKKyAgICBndWludDY0IHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitzdGF0aWMgZ2RvdWJsZQordGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChndWludDY0IHYpCit7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGZyb207CisgICAgZ2RvdWJsZSB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiB2ZXJzaW9uID0gKFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQorICAgICAgICAgICAgICAgICAgIHwgKChnaW50MzIpIG1lc3NhZ2VfdHlwZSk7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBUX1NUT1AsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgKGdpbnQzMikgc2l6ZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggdG1wOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICB0bXAgPSB2YWx1ZSA/IDEgOiAwOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCB0bXAsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgICAKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZ2YWx1ZSwgMSwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MTYgbmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBuZXQgPSBnX2h0b25zICh2YWx1ZSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCAyLCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiBuZXQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIG5ldCA9IGdfaHRvbmwgKHZhbHVlKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDQsIGVycm9yKSkKKyAgeworICAgIHJldHVybiA0OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDY0IG5ldDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbmV0ID0gR1VJTlQ2NF9UT19CRSAodmFsdWUpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgOCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ2NCBiaXRzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBiaXRzID0gR1VJTlQ2NF9GUk9NX0JFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQzMiBsZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKKyAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgbGVuLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkKKyAgeworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IGxlbjsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHN6OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzeiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHN6IDwgMCkKKyAgeworICAgIC8qIGNoZWNrIGZvciB2ZXJzaW9uICovCisgICAgZ3VpbnQzMiB2ZXJzaW9uID0gc3ogJiBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKKyAgICB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZlcnNpb24gJWQsIGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEsIHZlcnNpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICptZXNzYWdlX3R5cGUgPSAoVGhyaWZ0TWVzc2FnZVR5cGUpIChzeiAmIDB4MDAwMDAwZmYpOworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICAqbmFtZSA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IHR5cGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdHlwZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICpmaWVsZF90eXBlID0gKFRocmlmdFR5cGUpIHR5cGU7CisgIGlmICgqZmllbGRfdHlwZSA9PSBUX1NUT1ApCisgIHsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IGssIHY7CisgIGdpbnQzMiBzaXplaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmssIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqa2V5X3R5cGUgPSAoVGhyaWZ0VHlwZSkgazsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICp2YWx1ZV90eXBlID0gKFRocmlmdFR5cGUpIHY7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc2l6ZWksIGVycm9yKSkgPDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHNpemVpIDwgMCkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICpzaXplID0gKGd1aW50MzIpIHNpemVpOworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50OCBlOworICBnaW50MzIgc2l6ZWk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZlLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKmVsZW1lbnRfdHlwZSA9IChUaHJpZnRUeXBlKSBlOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZWkgPCAwKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBzaXplaSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKnNpemUgPSAoZ3VpbnQzMikgc2l6ZWk7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSAKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYiAhPSAwOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVsyXTsKKyAgICBnaW50MTYgaW50MTY7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCAyLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSBnX250b2hzIChiLmludDE2KTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbNF07CisgICAgZ2ludDMyIGludDMyOworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgNCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gZ19udG9obCAoYi5pbnQzMik7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzhdOworICAgIGdpbnQ2NCBpbnQ2NDsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IEdVSU5UNjRfRlJPTV9CRSAoYi5pbnQ2NCk7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVs4XTsKKyAgICBndWludDY0IHVpbnQ2NDsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAoR1VJTlQ2NF9GUk9NX0JFIChiLnVpbnQ2NCkpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQzMiBsZW47CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHJlYWRfbGVuID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KKyAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLyogc3BhY2UgZm9yIG51bGwgdGVybWluYXRvciAqLworICAqc3RyID0gZ19uZXcwIChnY2hhciwgbGVuKTsKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIGlmICgocmV0ID0KKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgZ19mcmVlICgqc3RyKTsKKyAgICAgICpzdHIgPSBOVUxMOworICAgICAgbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgKipzdHIgPSAwOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHJlYWRfbGVuID0gMDsKKyAKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChyZWFkX2xlbiA+IDApCisgIHsKKyAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWYsICpsZW4sIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzBiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuaAorICogIFxicmllZiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzKSkKKworLyogdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIDB4ODAwMTAwMDAKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OX01BU0sgMHhmZmZmMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2wgVGhyaWZ0QmluYXJ5UHJvdG9jb2w7CisKKy8qIQorICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGU5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnksIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKnByb3RvY29sX2ZhY3RvcnlfY2xhc3MgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoY2xzKTsKKworICBwcm90b2NvbF9mYWN0b3J5X2NsYXNzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkYzA3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7CisKK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Cit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKworLyoKKyAqICpfdG9femlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAorICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCisgKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KKyAqLworI2lmICFkZWZpbmVkKFNJR05FRF9SSUdIVF9TSElGVF9JUykgfHwgIWRlZmluZWQoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyMgZXJyb3IgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorI2VuZGlmCisjaWYgU0lHTkVEX1JJR0hUX1NISUZUX0lTICE9IEFSSVRITUVUSUNfUklHSFRfU0hJRlQKKyMgZXJyb3IgInRocmlmdF9jb21wYWN0X3Byb3RvY29sIG9ubHkgd29ya3MgaWYgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCisjZW5kaWYKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbFByb3BlcnRpZXMKK3sKKyAgICBQUk9QXzAsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbCwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworc3RhdGljIGNvbnN0IGdpbnQ4IFBST1RPQ09MX0lEID0gKGdpbnQ4KTB4ODJ1Oworc3RhdGljIGNvbnN0IGdpbnQ4IFZFUlNJT05fTiA9IDE7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9NQVNLID0gMHgxZjsgICAgICAgLyogMDAwMSAxMTExICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9NQVNLID0gKGdpbnQ4KTB4ZTB1OyAgLyogMTExMCAwMDAwICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLyogMDAwMCAwMTExICovCitzdGF0aWMgY29uc3QgZ2ludDMyIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworZW51bSBUeXBlcyB7CisgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCisgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKKyAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAorICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCisgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKKyAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAorICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCisgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKKyAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAorICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCisgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQworfTsKKworc3RhdGljIGNvbnN0IGdpbnQ4IFRUeXBlVG9DVHlwZVsxNl0gPSB7CisgIENUX1NUT1AsIC8qIFRfU1RPUCAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfQk9PTEVBTl9UUlVFLCAvKiBUX0JPT0wgKi8KKyAgQ1RfQllURSwgLyogVF9CWVRFICovCisgIENUX0RPVUJMRSwgLyogVF9ET1VCTEUgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kxNiwgLyogVF9JMTYgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kzMiwgLyogVF9JMzIgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0k2NCwgLyogVF9JNjQgKi8KKyAgQ1RfQklOQVJZLCAvKiBUX1NUUklORyAqLworICBDVF9TVFJVQ1QsIC8qIFRfU1RSVUNUICovCisgIENUX01BUCwgLyogVF9NQVAgKi8KKyAgQ1RfU0VULCAvKiBUX1NFVCAqLworICBDVF9MSVNULCAvKiBUX0xJU1QgKi8KK307CisKK3N0YXRpYyBndWludDY0Cit0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGNvbnN0IGdkb3VibGUgdikKK3sKKyAgdW5pb24geworICAgIGdkb3VibGUgZnJvbTsKKyAgICBndWludDY0IHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitzdGF0aWMgZ2RvdWJsZQordGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChjb25zdCBndWludDY0IHYpCit7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGZyb207CisgICAgZ2RvdWJsZSB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDY0CitpNjRfdG9femlnemFnIChjb25zdCBnaW50NjQgbCkKK3sKKyAgcmV0dXJuICgoKGd1aW50NjQpbCkgPDwgMSkgXiAobCA+PiA2Myk7Cit9CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDMyCitpMzJfdG9femlnemFnIChjb25zdCBnaW50MzIgbikKK3sKKyAgcmV0dXJuICgoKGd1aW50MzIpbikgPDwgMSkgXiAobiA+PiAzMSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitzdGF0aWMgZ2ludDMyCit6aWd6YWdfdG9faTMyIChndWludDMyIG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDMyKSAoLShnaW50MzIpIChuICYgMSkpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgZ2ludDY0Cit6aWd6YWdfdG9faTY0IChndWludDY0IG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDY0KSAoLShnaW50NjQpIChuICYgMSkpOworfQorCitUaHJpZnRUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICAgIHJldHVybiBUX1NUT1A7CisgICAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgICAgcmV0dXJuIFRfQk9PTDsKKyAgICBjYXNlIENUX0JZVEU6CisgICAgICByZXR1cm4gVF9CWVRFOworICAgIGNhc2UgQ1RfSTE2OgorICAgICAgcmV0dXJuIFRfSTE2OworICAgIGNhc2UgQ1RfSTMyOgorICAgICAgcmV0dXJuIFRfSTMyOworICAgIGNhc2UgQ1RfSTY0OgorICAgICAgcmV0dXJuIFRfSTY0OworICAgIGNhc2UgQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFRfRE9VQkxFOworICAgIGNhc2UgQ1RfQklOQVJZOgorICAgICAgcmV0dXJuIFRfU1RSSU5HOworICAgIGNhc2UgQ1RfTElTVDoKKyAgICAgIHJldHVybiBUX0xJU1Q7CisgICAgY2FzZSBDVF9TRVQ6CisgICAgICByZXR1cm4gVF9TRVQ7CisgICAgY2FzZSBDVF9NQVA6CisgICAgICByZXR1cm4gVF9NQVA7CisgICAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVF9TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1Zls1XTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50MzIgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCltOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KSgobSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBtID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKS0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIHhmZXIsIGVycm9yKSkgeworICAgIHJldHVybiB4ZmVyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50NjQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1ZlsxMF07CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IG07CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICB4ZmVyID0gMDsKKyAgbSA9IG47CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKG0gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnRwOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQ2NCB2YWw7CisgIGdpbnQgc2hpZnQ7CisgIGd1aW50OCBieXRlOworCisgIHRwID0gVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHhmZXIgPSAwOworICB2YWwgPSAwOworICBzaGlmdCA9IDA7CisgIGJ5dGUgPSAwOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsICh0cC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSAmYnl0ZSwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKyt4ZmVyOworICAgIHZhbCB8PSAoZ3VpbnQ2NCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTY0ID0gKGdpbnQ2NCkgdmFsOworICAgICAgcmV0dXJuIHhmZXI7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZICh4ZmVyID09IDEwKSkgeyAvKiA3ICogOSA8IDY0IDwgNyAqIDEwICovCisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDY0IHZhbDsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChwcm90b2NvbCwgJnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqaTMyID0gKGdpbnQzMil2YWw7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW5faW50ZXJuYWwgKFRocmlmdENvbXBhY3RQcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggdHlwZV9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisgIGdpbnQ4IHR5cGVfdG9fd3JpdGU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIHhmZXIgPSAwOworCisgIC8qIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4gKi8KKyAgdHlwZV90b193cml0ZQorICAgID0gKHR5cGVfb3ZlcnJpZGUgPT0gLTEgPyBUVHlwZVRvQ1R5cGVbZmllbGRfdHlwZV0gOiB0eXBlX292ZXJyaWRlKTsKKworICAvKiBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQgKi8KKyAgaWYgKGZpZWxkX2lkID4gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkCisgICAgICAmJiBmaWVsZF9pZCAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA8PSAxNSkgeworICAgIC8qIHdyaXRlIHRoZW0gdG9nZXRoZXIgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgoZmllbGRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IHR5cGVfdG9fd3JpdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgIC8qIHdyaXRlIHRoZW0gc2VwYXJhdGUgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX3dyaXRlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qKgorICogTWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIHhmZXIgPSAwOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoc2l6ZSA8PCA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoMHhmMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW2VsZW1fdHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworLyoKKyAqIHB1YmxpYyBtZXRob2RzCisgKi8KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQ4IHZlcnNpb247CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgdmVyc2lvbiA9IChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spCisgICAgICAgICAgICB8ICgoKGdpbnQzMikgbWVzc2FnZV90eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSyk7CisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBQUk9UT0NPTF9JRCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZlcnNpb24sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKGdpbnQxNikgR1BPSU5URVJfVE9fSU5UIChnX3F1ZXVlX3BvcF90YWlsIChxKSk7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoZmllbGRfdHlwZSA9PSBUX0JPT0wpIHsKKyAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSA9IG5hbWU7CisgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUgPSBmaWVsZF90eXBlOworICAgIGNwLT5fYm9vbF9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIFRfU1RPUCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIChndWludDMyKSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChUVHlwZVRvQ1R5cGVba2V5X3R5cGVdIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVt2YWx1ZV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKGNwLCBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmIChjcC0+X2Jvb2xfZmllbGRfbmFtZSAhPSBOVUxMKSB7CisgICAgLyogd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0ICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKHZhbHVlID8gQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZ2YWx1ZSwgMSwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICgoZ2ludDMyKSB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90b196aWd6YWcgKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDY0IGJpdHM7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBiaXRzID0gR1VJTlQ2NF9UT19MRSAodGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0ICh2YWx1ZSkpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJmJpdHMsIDgsIGVycm9yKSkgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc2l6ZV90IGxlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKKyAgaWYgKGxlbiA+IEdfTUFYSU5UMzIpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJzdHJpbmcgc2l6ZSAoZ3Vlc3M6ICVsdSkgaXMgdG9vIGxhcmdlIiwgKHVuc2lnbmVkIGxvbmcpIGxlbik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBndWludDMyKSBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIGxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGxlbiA+IDApIHsKKyAgICAvKiBjaGVja2luZyBsZW4gKyB4ZmVyID4gdWludF9tYXgsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG92ZXJmbG93IHdoaWxlCisgICAgICogY2hlY2tpbmcgZm9yIG92ZXJmbG93cy4gdHJhbnNmb3JtaW5nIHRvIGxlbiA+IHVpbnRfbWF4IC0geGZlci4KKyAgICAgKi8KKyAgICBpZiAobGVuID4gKGd1aW50MzIpIChHX01BWElOVDMyIC0geGZlcikpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICJzaXplICVkICsgJWQgaXMgdG9vIGxhcmdlIiwgbGVuLCB4ZmVyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIGxlbiwgZXJyb3IpID09IEZBTFNFKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gbGVuOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDggcHJvdG9jb2xfaWQsIHZlcnNpb25fYW5kX3R5cGUsIHZlcnNpb247CisKKyAgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocHJvdG9jb2xfaWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAiYmFkIHByb3RvY29sIGlkIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdmVyc2lvbiA9IChnaW50OCkodmVyc2lvbl9hbmRfdHlwZSAmIFZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fTikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgdmVyc2lvbiBhbmQvb3IgdHlwZSIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICptZXNzYWdlX3R5cGUKKyAgICA9IChUaHJpZnRNZXNzYWdlVHlwZSkoKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCBzZXFpZCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgICpuYW1lID0gTlVMTDsKKworICBnX3F1ZXVlX3B1c2hfdGFpbCAocSwgR0lOVF9UT19QT0lOVEVSICgoZ2ludCkgY3AtPl9sYXN0X2ZpZWxkX2lkKSk7CisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQxNiBtb2RpZmllcjsKKyAgZ2ludDggYnl0ZTsKKyAgZ2ludDggdHlwZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmJ5dGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOworCisgIC8qIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4gKi8KKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgKmZpZWxkX3R5cGUgPSBUX1NUT1A7CisgICAgKmZpZWxkX2lkID0gMDsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorCisgIC8qIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuCisgICAqIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICovCisgIG1vZGlmaWVyID0gKGdpbnQxNikoKChndWludDgpYnl0ZSAmIDB4ZjApID4+IDQpOworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8qIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4gKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqZmllbGRfaWQgPSAoZ2ludDE2KShjcC0+X2xhc3RfZmllbGRfaWQgKyBtb2RpZmllcik7CisgIH0KKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLCB0eXBlLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZmllbGRfdHlwZSA9IHJldDsKKworICAvKiBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZSAqLworICBpZiAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgfHwgdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFKSB7CisgICAgLyogc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuICovCisgICAgY3AtPl9oYXNfYm9vbF92YWx1ZSA9IFRSVUU7CisgICAgY3AtPl9ib29sX3ZhbHVlID0KKyAgICAgICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSA/IFRSVUUgOiBGQUxTRSk7CisgIH0KKworICAvKiBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4gKi8KKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKmZpZWxkX2lkOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBrdl90eXBlOworICBnaW50MzIgbXNpemU7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGt2X3R5cGUgPSAwOworICBtc2l6ZSA9IDA7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZtc2l6ZSwgZXJyb3IpKSA8MCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAvKiBzdGlsbCByZWFkIHRoZSBrdiBieXRlIGlmIG5lZ2F0aXZlIHNpemUgKi8KKyAgaWYgKG1zaXplICE9IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAma3ZfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbXNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBtc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKG1zaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmtleV90eXBlID0gcmV0OworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICp2YWx1ZV90eXBlID0gcmV0OworICAgICpzaXplID0gKGd1aW50MzIpIG1zaXplOworICB9IGVsc2UgaWYgKG1zaXplID09IDApIHsKKyAgICAqa2V5X3R5cGUgPSAwOworICAgICp2YWx1ZV90eXBlID0gMDsKKyAgICAqc2l6ZSA9IDA7CisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBtc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBzaXplX2FuZF90eXBlOworICBnaW50MzIgbHNpemU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgc2l6ZV9hbmRfdHlwZSA9IDA7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnNpemVfYW5kX3R5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGxzaXplID0gKChndWludDgpc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7CisgIGlmIChsc2l6ZSA9PSAxNSkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZsc2l6ZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBsc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKGNwLT5jb250YWluZXJfbGltaXQgPiAwICYmIGxzaXplID4gY3AtPmNvbnRhaW5lcl9saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgbHNpemUsIGNwLT5jb250YWluZXJfbGltaXQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkoc2l6ZV9hbmRfdHlwZSAmIDB4MGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKmVsZW1lbnRfdHlwZSA9IHJldDsKKyAgKnNpemUgPSAoZ3VpbnQzMikgbHNpemU7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLCBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCB2YWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5faGFzX2Jvb2xfdmFsdWUgPT0gVFJVRSkgeworICAgICp2YWx1ZSA9IGNwLT5fYm9vbF92YWx1ZTsKKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gRkFMU0U7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICAqdmFsdWUgPSAodmFsID09IENUX0JPT0xFQU5fVFJVRSk7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYjsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IChnaW50MTYpIHppZ3phZ190b19pMzIgKChndWludDMyKSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50NjQgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTY0ICgoZ3VpbnQ2NCkgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24geworICAgIGd1aW50NjQgYml0czsKKyAgICBndWludDggYls4XTsKKyAgfSB1OworCisgIGdfYXNzZXJ0IChzaXplb2YgKGdkb3VibGUpID09IHNpemVvZiAoZ3VpbnQ2NCkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5iLCA4LCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB1LmJpdHMgPSBHVUlOVDY0X0ZST01fTEUgKHUuYml0cyk7CisgICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAodS5iaXRzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCByZWFkX2xlbiArIDEpOworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgICAgZ19mcmVlICgqc3RyKTsKKyAgICAgICpzdHIgPSBOVUxMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqKnN0ciA9IDA7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWYsICpsZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpidWYpOworICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgICAqbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgfSBlbHNlIGlmIChyZWFkX2xlbiA9PSAwKSB7CisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gTlVMTDsKKworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0YyA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlUOgorICAgICAgdGMtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIHBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImNvbnRhaW5lcl9saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgY29udGFpbmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IGNvbnRhaW5lciBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpzZWxmKQoreworICBnX3F1ZXVlX2luaXQgKCYoc2VsZi0+X2xhc3RfZmllbGQpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZjYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzKSkKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sIFRocmlmdENvbXBhY3RQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50MzIgc3RyaW5nX2xpbWl0OworICBnaW50MzIgY29udGFpbmVyX2xpbWl0OworCisgIC8qIHByaXZhdGUgKi8KKworICAvKioKKyAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCisgICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAqLworICBjb25zdCBnY2hhciogX2Jvb2xfZmllbGRfbmFtZTsKKyAgVGhyaWZ0VHlwZSBfYm9vbF9maWVsZF90eXBlOworICBnaW50MTYgX2Jvb2xfZmllbGRfaWQ7CisKKyAgLyoqCisgICAqIChSZWFkaW5nKSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUKKyAgICogdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRfYm9vbCBjYW4gdXNlIGl0LgorICAgKi8KKyAgZ2Jvb2xlYW4gX2hhc19ib29sX3ZhbHVlOworICBnYm9vbGVhbiBfYm9vbF92YWx1ZTsKKworICAvKioKKyAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICovCisKKyAgR1F1ZXVlIF9sYXN0X2ZpZWxkOworICBnaW50MTYgX2xhc3RfZmllbGRfaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IENvbXBhY3QgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjVlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5UHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlULAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnksIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAoZmFjdG9yeSk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZ19saW1pdCIsIHRjZi0+c3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5lcl9saW1pdCIsIHRjZi0+Y29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTCAodGMpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjZiA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3Rvcnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgdGNmLT5zdHJpbmdfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjZi0+Y29udGFpbmVyX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQsIHBhcmFtX3NwZWMpOworCisgIGNscy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmOTUzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIFwKKyAgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeTsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Cit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzCisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzczsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjRhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICptdWx0aXBsZXhDbGFzcyA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Moc2VsZik7CisKKyAgaWYoIChtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkgJiYgc2VsZi0+c2VydmljZV9uYW1lICE9IE5VTEwpIHsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzJXMlcyIsIHNlbGYtPnNlcnZpY2VfbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCBuYW1lKTsKKyAgfWVsc2V7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXAobmFtZSk7CisgIH0KKworICAvKiByZWxheSB0byB0aGUgcHJvdG9jb2xfZGVjb3JhdG9yICovCisgIHJldCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbihwcm90b2NvbCwgc2VydmljZV9uYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkLCBlcnJvcik7CisKKyAgZ19mcmVlKHNlcnZpY2VfbmFtZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPnNlcnZpY2VfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5zZXJ2aWNlX25hbWUpIHsKKyAgICBnX2ZyZWUoc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmljZS1uYW1lIiwKKyAgICAgICAgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorICAgICAgICAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk2YThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1JfRE9NQUlOICJ0aHJpZnQtcHJvdG9jb2wtZXJyb3ItcXVhcmsiCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRQcm90b2NvbFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQKK307CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2wsIHRocmlmdF9wcm90b2NvbCwgR19UWVBFX09CSkVDVCkKKwordm9pZAordGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBwcm90b2NvbC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvY29sLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kxNiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pMzIgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTY0IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3NldF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2Jvb2wgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9ieXRlIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMTYgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTMyIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2k2NCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZG91YmxlIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJpbmcgKHByb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc3dpdGNoICh0eXBlKQorICB7CisgICAgY2FzZSBUX0JPT0w6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIGJvb2x2OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsICZib29sdiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9CWVRFOgorICAgICAgeworICAgICAgICBnaW50OCBieXRldjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZXYsIGVycm9yKTsKKyAgICAgIH0KKworICAgIGNhc2UgVF9JMTY6CisgICAgICB7CisgICAgICAgIGdpbnQxNiBpMTY7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmaTE2LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIGkzMjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZpMzIsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfSTY0OgorICAgICAgeworICAgICAgICBnaW50NjQgaTY0OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJmk2NCwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICB7CisgICAgICAgIGdkb3VibGUgZHViOworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwgJmR1YiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICB7CisgICAgICAgIGdwb2ludGVyIGRhdGE7CisgICAgICAgIGd1aW50MzIgbGVuOworICAgICAgICBnaW50MzIgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmRhdGEsICZsZW4sIGVycm9yKTsKKyAgICAgICAgZ19mcmVlIChkYXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICBjYXNlIFRfU1RSVUNUOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2NoYXIgKm5hbWU7CisgICAgICAgIGdpbnQxNiBmaWQ7CisgICAgICAgIFRocmlmdFR5cGUgZnR5cGU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKTsKKyAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApCisgICAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcik7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfU0VUOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfTUFQOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIFRocmlmdFR5cGUga2V5X3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGtleV90eXBlLCBlcnJvcik7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBUX0xJU1Q6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCBwcm90b2NvbHMgKi8KK0dRdWFyawordGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4pOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnRyYW5zcG9ydCk7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbENsYXNzICpjbHMpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfcHJvdG9jb2xfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JULAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJUcmFuc3BvcnQiLCAiVGhyaWZ0IFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZlNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wgc3VwcG9ydHMuCisgKiBUYWtlIHNwZWNpYWwgbm90ZSBvZiB0aGUgVF9FTkQgdHlwZSB3aGljaCBpcyB1c2VkIHNwZWNpZmljYWxseSB0byBtYXJrCisgKiB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgorICovCit0eXBlZGVmIGVudW0geworICBUX1NUT1AgICA9IDAsCisgIFRfVk9JRCAgID0gMSwKKyAgVF9CT09MICAgPSAyLAorICBUX0JZVEUgICA9IDMsCisgIFRfSTA4ICAgID0gMywKKyAgVF9JMTYgICAgPSA2LAorICBUX0kzMiAgICA9IDgsCisgIFRfVTY0ICAgID0gOSwKKyAgVF9JNjQgICAgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgICA9IDExLAorICBUX1NUUlVDVCA9IDEyLAorICBUX01BUCAgICA9IDEzLAorICBUX1NFVCAgICA9IDE0LAorICBUX0xJU1QgICA9IDE1LAorICBUX1VURjggICA9IDE2LAorICBUX1VURjE2ICA9IDE3Cit9IFRocmlmdFR5cGU7CisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAorICogc3VwcG9ydHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFRfQ0FMTCAgICAgID0gMSwKKyAgVF9SRVBMWSAgICAgPSAyLAorICBUX0VYQ0VQVElPTiA9IDMsCisgIFRfT05FV0FZICAgID0gNAorfSBUaHJpZnRNZXNzYWdlVHlwZTsKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0wgKHRocmlmdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sIFRocmlmdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbAoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcyBUaHJpZnRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sQ2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2ZpZWxkX3N0b3ApIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9saXN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnYm9vbGVhbiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfYnl0ZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2RvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKyAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbCwgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWVzc2FnZV9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2ZpZWxkX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLCBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2ZpZWxkX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX21hcF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWFwX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc2V0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3NldF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pMTYpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pMzIpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pNjQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9kb3VibGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdkb3VibGUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworLyogZGVmaW5lIGVycm9yIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTk9UX0lNUExFTUVOVEVELAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfREVQVEhfTElNSVQKK30gVGhyaWZ0UHJvdG9jb2xFcnJvcjsKKworLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUiAodGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjk0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRQcm90b2NvbERlY29yYXRvciwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvciwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKKworZW51bQoreworICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTCA9IDEsCisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5EXSA9IHsgTlVMTCwgfTsKKworCisKKworCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworCisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworICBUaHJpZnRQcm90b2NvbENsYXNzICpwcm90byA9IFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICBnX2RlYnVnKCJDb25jcmV0ZSBwcm90b2NvbCAlcCB8ICVwIiwgKHZvaWQgKilzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgKHZvaWQgKilwcm90byk7CisKKyAgcmV0dXJuIHByb3RvLT53cml0ZV9tZXNzYWdlX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cnVjdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX3N0b3AgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYmluYXJ5IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3NldF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2JpbmFyeSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X2NvbmNyZXRlX3Byb3RvY29sKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnJldHZhbCA9IE5VTEw7CisgIGlmKCFUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKSl7CisgICAgZ193YXJuaW5nKCJUaGUgdHlwZSBpcyBub3QgcHJvdG9jb2wgZGVjb3JhdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKTsKKyAgZ19kZWJ1ZygiR2V0dGluZyBjb25jcmV0ZSBwcm90b2NvbCBmcm9tICVwIC0+ICVwIiwgKHZvaWQgKilzZWxmLCAodm9pZCAqKXNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2luaXQgKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPmNvbmNyZXRlX3Byb3RvY29sID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZTsKKworICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MXSA9CisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvdG9jb2wiLAorICAgICAgICAgICJQcm90b2NvbCIsCisgICAgICAgICAgIlNldCB0aGUgcHJvdG9jb2wgdG8gYmUgaW1wbGVtZW50ZWQiLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkQsCisgICAgICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzKTsKKworICBnX2RlYnVnKCJDdXJyZW50IGRlY29yYXRvciB3cml0ZV9tZXNzYWdlX2JlZ2luIGFkZHIgJXAsIG5ldyAlcCIsIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3I7CisKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqY29uY3JldGVfcHJvdG9jb2w7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKKworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjQwODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5LCB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeSwgR19UWVBFX09CSkVDVCkKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoZmFjdG9yeSktPmdldF9wcm90b2NvbCAoZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNDZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGZhY3RvcnkgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnkgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5OworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeQoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzczsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgVGhyaWZ0UHJvdG9jb2wgKigqZ2V0X3Byb3RvY29sKSAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ1NjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRCwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JULCAvKiBUT0RPIHVnbHkgaGFjayAqLworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sLCB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorCQkJCQkgICBnY2hhciAqKm5hbWUsCisJCQkJCSAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisJCQkJCSAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0ID0gMDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgLyogV2UgcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWVzIG9uIGNvbnN0cnVjdGlvbiAqLworICAqbmFtZSA9IHNlbGYtPm5hbWU7CisgICptZXNzYWdlX3R5cGUgPSBzZWxmLT5tdHlwZTsKKyAgKnNlcWlkID0gc2VsZi0+c2VxaWQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBzZWxmLT5uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRToKKyAgICAgIHNlbGYtPm10eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEOgorICAgICAgc2VsZi0+c2VxaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgR1ZhbHVlICAgICAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKmRlY29yYXRvciA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0PU5VTEw7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICAvKiBGSVhNRSBTaW5jZSB3ZSBkb24ndCBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHRoZSBkZWNvcmF0b3IgYXMgaXQgc2hvdWxkCisgICAgICAgICB3ZSBqdXN0IG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2Uga25vdyBhcmUgdXNlZCAqLworICAgICAgZ19vYmplY3RfZ2V0KGRlY29yYXRvci0+Y29uY3JldGVfcHJvdG9jb2wscHNwZWMtPm5hbWUsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIHRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPm5hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5uYW1lKSB7CisgICAgICBnX2ZyZWUoc2VsZi0+bmFtZSk7CisgICAgICBzZWxmLT5uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyBhcyB3aXRoIGRpc3Bvc2UoKSwgZmluYWxpemUoKQorICAgKiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IG9uIHRoZSBwYXJlbnQncyBjbGFzcyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKGdvYmplY3QpOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemU7CisKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm5hbWUiLAorCQkJICAgIlNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIiwKKwkJCSAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisJCQkgICBOVUxMLAorCQkJICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsCisJCQkiTWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIG1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQlUX0NBTEwsIFRfT05FV0FZLAorCQkJVF9DQUxMLAorCQkJKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSURdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzZXFpZCIsCisJCQkiU2VxdWVuY2UgaWQgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBTZXF1ZW5jZSBpZCBpbiB0aGUgd2lyZSIsCisJCQkwLCBHX01BWElOVCwKKwkJCTAsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgLyogVE9ETyBVZ2x5IGhhY2ssIGluIHRoZW9yeSB3ZSBtdXN0IG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGZyb20gdW5kZXJsYXlpbmcKKyAgICAgcHJvdG9jb2wgKi8KKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVF0gPQorICAgICAgZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJ0cmFuc3BvcnQiLAorCQkJIlRyYW5zcG9ydCBvbiB0aGUgdW5kZXJsYXlpbmcgaW1wbGVtZW50YXRpb24iLAorCQkJIlRyYW5zcG9ydCBvZiBkZWNvcmF0ZWQgcHJvdG9jb2wiLAorCQkJR19QQVJBTV9SRUFEQUJMRSk7CisKKworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorCQkJCSAgICAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ELAorCQkJCSAgICAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzgyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgKiAgXGJyaWVmIFN0b3JlZE1lc3NhZ2UgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBwcmUtc3RvcmVkIG1lc3NhZ2UgaGVhZGVyCisgKiAgb24gVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcykpCisKKy8qIGNvbnN0YW50ICovCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiAiOiIKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBTdG9yZWRNZXNzYWdlIFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKm5hbWU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOworICBnaW50MzIgc2VxaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmOTE1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc2VydmVyLmgiCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTZXJ2ZXJQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCisgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWQorfTsKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXIsIHRocmlmdF9zZXJ2ZXIsIEdfVFlQRV9PQkpFQ1QpCisKK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5wcm9jZXNzb3IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6CisgICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKKyAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnNlcnZlIChzZXJ2ZXIsIGVycm9yKTsKK30KKwordm9pZAordGhyaWZ0X3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnN0b3AgKHNlcnZlcik7Cit9CisKKy8qIGluc3RhbmNlIGluaXRpYWxpemVyIGZvciBUaHJpZnQgU2VydmVyICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9pbml0IChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgc2VydmVyLT5wcm9jZXNzb3IgPSBOVUxMOworICBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gTlVMTDsKKyAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U2VydmVyICpzZWxmID0gVEhSSUZUX1NFUlZFUiAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnNlcnZlcl90cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+cHJvY2Vzc29yKTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zZXJ2ZXJfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworLyoKKyAqIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRTZXJ2ZXIKKyAqIFRPRE86IGltcGxlbWVudCBTZXJ2ZXJFdmVudEhhbmRsZXIgYXMgYSBHQ2xvc3VyZQorICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJDbGFzcyAqY2xzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfc2VydmVyX2Rpc3Bvc2U7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvY2Vzc29yIiwgIlByb2Nlc3NvciIsICJUaHJpZnQgUHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic2VydmVyX3RyYW5zcG9ydCIsICJTZXJ2ZXIgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAiSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIklucHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAiT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworCisgIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLworICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NlcnZlcl9zZXJ2ZTsKKyAgY2xzLT5zdG9wID0gdGhyaWZ0X3NlcnZlcl9zdG9wOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NlcnZlci5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVycy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVIgKHRocmlmdF9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlcikpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyIFRocmlmdFNlcnZlcjsKKworLyohCisgKiBUaHJpZnQgU2VydmVyIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlcgoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3I7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqaW5wdXRfdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICppbnB1dF9wcm90b2NvbF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKm91dHB1dF9wcm90b2NvbF9mYWN0b3J5OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzIFRocmlmdFNlcnZlckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXIgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKnNlcnZlKSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKTsKKyAgdm9pZCAoKnN0b3ApIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUiAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBTdG9wIGhhbmRsaW5nIHJlcXVlc3RzLgorICovCit2b2lkIHRocmlmdF9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfSCAqLworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE5NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRTaW1wbGVTZXJ2ZXIsIHRocmlmdF9zaW1wbGVfc2VydmVyLCBUSFJJRlRfVFlQRV9TRVJWRVIpCisKK2dib29sZWFuCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmlucHV0X3RyYW5zcG9ydCA9IE5VTEwsICpvdXRwdXRfdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sID0gTlVMTCwgKm91dHB1dF9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNpbXBsZVNlcnZlciAqdHNzID0gVEhSSUZUX1NJTVBMRV9TRVJWRVIoc2VydmVyKTsKKyAgR0Vycm9yICpwcm9jZXNzX2Vycm9yID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlciksIEZBTFNFKTsKKworICBpZiAodGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIGVycm9yKSkgeworICAgIHRzcy0+cnVubmluZyA9IFRSVUU7CisgICAgd2hpbGUgKHRzcy0+cnVubmluZyA9PSBUUlVFKQorICAgIHsKKyAgICAgIHQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgIGlmICh0ICE9IE5VTEwgJiYgdHNzLT5ydW5uaW5nKSB7CisgICAgICAgIGlucHV0X3RyYW5zcG9ydCA9CisgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOworICAgICAgICBvdXRwdXRfdHJhbnNwb3J0ID0KKyAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKKyAgICAgICAgaW5wdXRfcHJvdG9jb2wgPQorICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnksIGlucHV0X3RyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dF9wcm90b2NvbCA9CisgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5LCBvdXRwdXRfdHJhbnNwb3J0KTsKKworICAgICAgICB3aGlsZSAoVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHNlcnZlci0+cHJvY2Vzc29yKQorICAgICAgICAgICAgICAgLT5wcm9jZXNzIChzZXJ2ZXItPnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3NfZXJyb3IpICYmCisgICAgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGlucHV0X3RyYW5zcG9ydCwgJnByb2Nlc3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvY2Vzc19lcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmU6ICVzIiwgcHJvY2Vzc19lcnJvci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJnByb2Nlc3NfZXJyb3IpOworCisgICAgICAgICAgLyogTm90ZSB3ZSBkbyBub3QgcHJvcGFnYXRlIHByb2Nlc3NpbmcgZXJyb3JzIHRvIHRoZSBjYWxsZXIgYXMgdGhleQorICAgICAgICAgICAqIG5vcm1hbGx5IGFyZSB0cmFuc2llbnQgYW5kIG5vdCBmYXRhbCB0byB0aGUgc2VydmVyICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUT0RPOiBoYW5kbGUgZXhjZXB0aW9ucyAqLworICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAoaW5wdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKGlucHV0X3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKG91dHB1dF90cmFuc3BvcnQpLT5jbG9zZSAob3V0cHV0X3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogYXR0ZW1wdCB0byBzaHV0ZG93biAqLworICAgIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KQorICAgICAgLT5jbG9zZSAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKKyAgfQorCisgIC8qIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJ1biBmb3JldmVyLCBpdCBjYW4gb25seSBldmVyIHJldHVybiBvbgorICAgKiBlcnJvciAqLworICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK3RocmlmdF9zaW1wbGVfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBnX3JldHVybl9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSk7CisgIChUSFJJRlRfU0lNUExFX1NFUlZFUiAoc2VydmVyKSktPnJ1bm5pbmcgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zaW1wbGVfc2VydmVyX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlciAqdHNzKQoreworICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIodHNzKTsKKworICB0c3MtPnJ1bm5pbmcgPSBGQUxTRTsKKworICBpZiAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorICBpZiAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorICBpZiAoc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIE5VTEwpOworICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfY2xhc3NfaW5pdCAoVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MgKmNsYXNzKQoreworICBUaHJpZnRTZXJ2ZXJDbGFzcyAqY2xzID0gVEhSSUZUX1NFUlZFUl9DTEFTUyhjbGFzcyk7CisKKyAgY2xzLT5zZXJ2ZSA9IHRocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlOworICBjbHMtPnN0b3AgPSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9zdG9wOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICisjZGVmaW5lIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2ltcGxlX3NlcnZlci5oCisgKiAgXGJyaWVmIEEgc2ltcGxlIFRocmlmdCBzZXJ2ZXIsIHNpbmdsZS10aHJlYWRlZC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSICh0aHJpZnRfc2ltcGxlX3NlcnZlcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXIpKQorI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TSU1QTEVfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXIgVGhyaWZ0U2ltcGxlU2VydmVyOworCisvKioKKyAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlcgoreworICBUaHJpZnRTZXJ2ZXIgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgdm9sYXRpbGUgZ2Jvb2xlYW4gcnVubmluZzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcyBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzczsKKworLyoqCisgKiBUaHJpZnQgU2ltcGxlIFNlcnZlciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcworeworICBUaHJpZnRTZXJ2ZXJDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKi8KK0dUeXBlIHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU0lNUExFX1NFUlZFUl9IICovCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTg2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorCisvKioKKyAqIEdIYXNoVGFibGUgY2FsbGJhY2sgdG8gYWRkIGtleXMgdG8gYSBHTGlzdC4KKyAqLwordm9pZAordGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR0xpc3QgKipsaXN0ID0gKEdMaXN0ICoqKSB1c2VyX2RhdGE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsKKworICAqbGlzdCA9IGdfbGlzdF9hcHBlbmQgKCpsaXN0LCBrZXkpOworfQordm9pZCB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSkKK3sKKyAgaWYgKGhhc2hfdGFibGUpCisgIHsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveShoYXNoX3RhYmxlKTsKKyAgfQorfQorCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2Jvb2xlYW4qIHAgPSB2OworICByZXR1cm4gcCAmJiAqcCA/IDEgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2Jvb2xlYW5fZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2Jvb2xlYW4qIHBhID0gYTsKKyAgY29uc3QgZ2Jvb2xlYW4qIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnaW50OCogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDhfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDgqIHBhID0gYTsKKyAgY29uc3QgZ2ludDgqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQxNl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDE2KiBwID0gdjsKKyAgcmV0dXJuIHAgPyAqcCA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfaW50MTZfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDE2KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQxNiogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKwordm9pZAordGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpCit7CisJR0J5dGVBcnJheSogcHRyID0gc3RyOworCWdfYnl0ZV9hcnJheV91bnJlZihwdHIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfSAorI2RlZmluZSBfVEhSSUZUX0gKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisvKiB0aGlzIG1hY3JvIGlzIGNhbGxlZCB0byBzYXRpc2Z5IC1XYWxsIGhhcmRjb3JlIGNvbXBpbGF0aW9uICovCisjaWZuZGVmIFRIUklGVF9VTlVTRURfVkFSCisjIGRlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUih4KSAoKHZvaWQpIHgpCisjZW5kaWYKKwordm9pZCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKTsKKworZ3VpbnQgdGhyaWZ0X2Jvb2xlYW5faGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2Jvb2xlYW5fZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCitndWludCB0aHJpZnRfaW50OF9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfaW50OF9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQxNl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfaW50MTZfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCit2b2lkIHRocmlmdF9zdHJpbmdfZnJlZSAoZ3BvaW50ZXIgc3RyKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM0Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25Qcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEUsCisgIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uLCB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLCBUSFJJRlRfVFlQRV9TVFJVQ1QpCisKK2dpbnQzMgordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0VHlwZSBmdHlwZTsKKyAgZ2ludDE2IGZpZDsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIC8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8KKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworCisgIHdoaWxlICgxKQorICB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLworICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApCisgICAgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChmaWQpCisgICAgeworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVFJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZ0aGlzLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgICB0aGlzLT5fX2lzc2V0X21lc3NhZ2UgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChmdHlwZSA9PSBUX0kzMikKKyAgICAgICAgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnRoaXMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICAgIHRoaXMtPl9faXNzZXRfdHlwZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgICByZXR1cm4gLTE7CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0aGlzID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9TVFJJTkcsIDEsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIHRoaXMtPm1lc3NhZ2UsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9JMzIsIDIsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHRoaXMtPnR5cGUsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworCisvKiBHRXJyb3IgZG9tYWluICovCisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfRE9NQUlOICJ0aHJpZnQtYXBwbGljYXRpb24tZXhjZXB0aW9uLWVycm9yLXF1YXJrIgorCitHUXVhcmsKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4pOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGFlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRhZS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdGFlLT5tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFOgorICAgICAgdGFlLT50eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICB0YWUtPl9faXNzZXRfdHlwZSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFOgorICAgICAgaWYgKHRhZS0+bWVzc2FnZSAhPSBOVUxMKQorICAgICAgICBnX2ZyZWUgKHRhZS0+bWVzc2FnZSk7CisKKyAgICAgIHRhZS0+bWVzc2FnZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgdGFlLT5fX2lzc2V0X21lc3NhZ2UgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqb2JqZWN0KQoreworICBvYmplY3QtPnR5cGUgPSAwOworICBvYmplY3QtPl9faXNzZXRfdHlwZSA9IEZBTFNFOworICBvYmplY3QtPm1lc3NhZ2UgPSBOVUxMOworICBvYmplY3QtPl9faXNzZXRfbWVzc2FnZSA9IEZBTFNFOworfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIGlmICh0YWUtPl9faXNzZXRfbWVzc2FnZSkgeworCQlnX2ZyZWUodGFlLT5tZXNzYWdlKTsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2NsYXNzX2luaXQgKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgKmNsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyhjbGFzcyk7CisgIFRocmlmdFN0cnVjdENsYXNzICpjbHMgPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNsYXNzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMtPnJlYWQgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQ7CisgIGNscy0+d3JpdGUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24sIG9uZSBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBkZWZpbmVkIGJ5IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25FcnJvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bWVyYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGV4Y2VwdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1cnJlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNmNzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKKyNkZWZpbmUgX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaAorICogIFxicmllZiBDIEltcGxlbWVudGF0aW9uIG9mIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAodGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24pKQorI2RlZmluZSBUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKworc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbgoreworICBUaHJpZnRTdHJ1Y3QgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2ludDMyIHR5cGU7CisgIGdib29sZWFuIF9faXNzZXRfdHlwZTsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIGdib29sZWFuIF9faXNzZXRfbWVzc2FnZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcworeworICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF90eXBlICh2b2lkKTsKKworLyogZ2Vycm9yIGNvZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0JBRF9TRVFVRU5DRV9JRCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9NSVNTSU5HX1JFU1VMVCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUiwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9QUk9UT0NPTF9FUlJPUiwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1RSQU5TRk9STSwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1BST1RPQ09MLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFLAorCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTgorfSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yOworCisvKiBkZWZpbmUgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgKi8KK0dRdWFyayB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiAodGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAoKSkKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0ZjJhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFN0cnVjdCwgdGhyaWZ0X3N0cnVjdCwgR19UWVBFX09CSkVDVCkKKworZ2ludDMyCit0aHJpZnRfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUUlVDVCAob2JqZWN0KSwgLTEpOworICByZXR1cm4gVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1MgKG9iamVjdCktPnJlYWQgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7CisgIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+d3JpdGUgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdHJ1Y3RfY2xhc3NfaW5pdCAoVGhyaWZ0U3RydWN0Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5yZWFkID0gdGhyaWZ0X3N0cnVjdF9yZWFkOworICBjbHMtPndyaXRlID0gdGhyaWZ0X3N0cnVjdF93cml0ZTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdHJ1Y3RfaW5pdCAoVGhyaWZ0U3RydWN0ICpzdHJ1Y3R1cmUpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzdHJ1Y3R1cmUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNmY2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9TVFJVQ1RfSAorI2RlZmluZSBUSFJJRlRfU1RSVUNUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RSVUNUICh0aHJpZnRfc3RydWN0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNULCBUaHJpZnRTdHJ1Y3QpKQorI2RlZmluZSBUSFJJRlRfU1RSVUNUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCkpCisjZGVmaW5lIFRIUklGVF9JU19TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdCBUaHJpZnRTdHJ1Y3Q7CisKKy8qIHN0cnVjdCAqLworc3RydWN0IF9UaHJpZnRTdHJ1Y3QKK3sKKyAgR09iamVjdCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdENsYXNzIFRocmlmdFN0cnVjdENsYXNzOworCitzdHJ1Y3QgX1RocmlmdFN0cnVjdENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogcHVibGljICovCisgIGdpbnQzMiAoKnJlYWQpIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZSkgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworfTsKKworR1R5cGUgdGhyaWZ0X3N0cnVjdF9nZXRfdHlwZSAodm9pZCk7CisKK2dpbnQzMiB0aHJpZnRfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjNlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+aXNfb3BlbiAodC0+dHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiAodC0+cl9idWYtPmxlbiA+IDApIHx8IHRocmlmdF90cmFuc3BvcnRfcGVlayAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5vcGVuICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Y2xvc2UgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCitnaW50MzIKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50MzIgd2FudCA9IGxlbjsKKyAgZ3VpbnQzMiBnb3QgPSAwOworICBndWNoYXIgKnRtcGRhdGEgPSBnX2FsbG9jYSAobGVuKTsKKyAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKKworICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisKKyAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlci4gKi8KKyAgaWYgKGhhdmUgPiAwKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKKyAgICB3YW50IC09IHQtPnJfYnVmLT5sZW47CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7CisgIH0KKworICAvKiBpZiB0aGUgYnVmZmVyIGlzIHN0aWxsIHNtYWxsZXIgdGhhbiB3aGF0IHdlIHdhbnQgdG8gcmVhZCwgdGhlbiBqdXN0CisgICAqIHJlYWQgaXQgZGlyZWN0bHkuICBvdGhlcndpc2UsIGZpbGwgdGhlIGJ1ZmZlciBhbmQgdGhlbiBnaXZlIG91dAorICAgKiBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgcmVhZC4gKi8KKyAgaWYgKHQtPnJfYnVmX3NpemUgPCB3YW50KQorICB7CisgICAgaWYgKChyZXQgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKworICAgIC8qIGNvcHkgdGhlIGRhdGEgc3RhcnRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZiAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGhhdmUsIHRtcGRhdGEsIGdvdCk7CisgICAgcmV0dXJuIGdvdCArIGhhdmU7IAorICB9IGVsc2UgeworICAgIGd1aW50MzIgZ2l2ZTsKKworICAgIGlmICgocmV0ID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGdvdCArPSByZXQ7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgZ290KTsKKyAgICAKKyAgICAvKiBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cyAqLworICAgIGdpdmUgPSB3YW50IDwgdC0+cl9idWYtPmxlbiA/IHdhbnQgOiB0LT5yX2J1Zi0+bGVuOworCisKKyAgICBtZW1jcHkgKChndWludDggKilidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7CisgICAgd2FudCAtPSBnaXZlOworCisgICAgcmV0dXJuIChsZW4gLSB3YW50KTsKKyAgfQorfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCisgICAqIGEgbWVtY3B5ICovCisgIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKKyAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgaGF2ZV9ieXRlcyA9IHQtPndfYnVmLT5sZW47CisgIGd1aW50MzIgc3BhY2UgPSB0LT53X2J1Zl9zaXplIC0gdC0+d19idWYtPmxlbjsKKworICAvKiB3ZSBuZWVkIHR3byBzeXNjYWxscyBiZWNhdXNlIHRoZSBidWZmZXJlZCBkYXRhIHBsdXMgdGhlIGJ1ZmZlciBpdHNlbGYKKyAgICogaXMgdG9vIGJpZy4gKi8KKyAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqdC0+d19idWZfc2l6ZSkgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpCisgIHsKKyAgICBpZiAoaGF2ZV9ieXRlcyA+IDApCisgICAgeworICAgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCBoYXZlX2J5dGVzKTsKKyAgICB9CisgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBsZW4sIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1Ziwgc3BhY2UpOworICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7CisgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIChndWludDggKilidWYgKyBzcGFjZSwgbGVuLXNwYWNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLworICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQorICB7CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworICAgIHJldHVybiBsZW47CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICBpZiAodC0+d19idWYgIT0gTlVMTCAmJiB0LT53X2J1Zi0+bGVuID4gMCkKKyAgeworICAgIC8qIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQgKi8KKyAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOworICB9CisgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5mbHVzaCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7CisgIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKKworICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+d19idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJyX2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdmNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgYnVmZmVyZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcworICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0OworCisvKiEKKyAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKworICAvKiBwcml2YXRlICovCisgIEdCeXRlQXJyYXkgKnJfYnVmOworICBHQnl0ZUFycmF5ICp3X2J1ZjsKKyAgZ3VpbnQzMiByX2J1Zl9zaXplOworICBndWludDMyIHdfYnVmX3NpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwNTBiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFIChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkKKworLyogV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5ICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmJhc2VfY2xhc3MgPQorICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworCisgIGJhc2VfY2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIGtsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZjRlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorICogIFxicmllZiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkgICAgICAgICAgXAorICAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgQnVmZmVyZWQtVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Cit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgQnVmZmVyZWQtVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEZEVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0RkRUcmFuc3BvcnQsIHRocmlmdF9mZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiB0LT5mZCA+PSAwICYmICEgKGZjbnRsICh0LT5mZCwgRl9HRVRGTCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApCisgIHJldHVybiBnX2Nsb3NlICh0LT5mZCwgZXJyb3IpOworI2Vsc2UKKyAgaWYgKGNsb3NlICh0LT5mZCkgPT0gMCkgeworICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBuID0gcmVhZCAodC0+ZmQsIChndWludDggKikgYnVmLCBsZW4pOworICBpZiAobiA9PSAtMSkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBndWludDggKl9idWY7CisgIGd1aW50MzIgX2xlbjsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBfYnVmID0gKGd1aW50OCAqKSBidWY7CisgIF9sZW4gPSBsZW47CisgIHdoaWxlIChfbGVuID4gMCkgeworICAgIG4gPSB3cml0ZSAodC0+ZmQsIF9idWYsIF9sZW4pOworICAgIGlmIChuID09IC0xKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIF9idWYgKz0gbjsKKyAgICAgIF9sZW4gLT0gbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGlmIChmc3luYyAodC0+ZmQpID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmx1c2ggZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT5mZCA9IC0xOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHQtPmZkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIHQtPmZkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YzsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJmZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUlOLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NQVgsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mZF90cmFuc3BvcnQuaAorICogIFxicmllZiBDbGFzcyBmb3IgVGhyaWZ0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnRzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAodGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydCBUaHJpZnRGRFRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50IGZkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQ4MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LCB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuICh0LT5yX2J1Zi0+bGVuID4gMCkgfHwgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPm9wZW4gKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5jbG9zZSAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIHJlYWRzIGEgZnJhbWUgYW5kIHB1dHMgaXQgaW50byB0aGUgYnVmZmVyICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9mcmFtZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgc3o7CisgIGdpbnQzMiBieXRlczsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisKKyAgLyogcmVhZCB0aGUgc2l6ZSAqLworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzeiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSA9PSBzaXplb2YgKHN6KSkKKyAgeworICAgIGd1Y2hhciAqdG1wZGF0YTsKKworICAgIHN6ID0gbnRvaGwgKHN6KTsKKworICAgIC8qIGNyZWF0ZSBhIGJ1ZmZlciB0byBob2xkIHRoZSBkYXRhIGFuZCByZWFkIHRoYXQgbXVjaCBkYXRhICovCisgICAgdG1wZGF0YSA9IGdfYWxsb2NhIChzeik7CisgICAgYnl0ZXMgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHQtPnRyYW5zcG9ydCwgdG1wZGF0YSwgc3osIGVycm9yKTsKKworICAgIGlmIChieXRlcyA+IDAgJiYgKGVycm9yID09IE5VTEwgfHwgKmVycm9yID09IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIGFkZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyICovCisgICAgICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgYnl0ZXMpOworCisgICAgICByZXN1bHQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHRoZSBhY3R1YWwgcmVhZCBpcyAic2xvdyIgYmVjYXVzZSBpdCBjYWxscyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKi8KK2dpbnQzMgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBndWludDMyIHdhbnQgPSBsZW47CisgIGd1aW50MzIgaGF2ZSA9IHQtPnJfYnVmLT5sZW47CisgIGdpbnQzMiByZXN1bHQgPSAtMTsKKworICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisKKyAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCAqLworICBpZiAoaGF2ZSA+IDApCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOworICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKKyAgfQorCisgIC8qIHJlYWQgYSBmcmFtZSBvZiBpbnB1dCBhbmQgYnVmZmVyIGl0ICovCisgIGlmICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2ZyYW1lICh0cmFuc3BvcnQsIGVycm9yKSA9PSBUUlVFKQorICB7CisgICAgLyogaGFuZCBvdmVyIHdoYXQgd2UgaGF2ZSB1cCB0byB3aGF0IHRoZSBjYWxsZXIgd2FudHMgKi8KKyAgICBndWludDMyIGdpdmUgPSB3YW50IDwgdC0+cl9idWYtPmxlbiA/IHdhbnQgOiB0LT5yX2J1Zi0+bGVuOworCisgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICBtZW1jcHkgKChndWludDggKilidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7CisgICAgd2FudCAtPSBnaXZlOworCisgICAgcmVzdWx0ID0gbGVuIC0gd2FudDsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCisgICAqIGEgbWVtY3B5IGZyb20gdGhlIGJ1ZmZlciAqLworICBpZiAobGVuIDw9IHQtPnJfYnVmLT5sZW4pCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYtPmRhdGEsIGxlbik7CisgICAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICAvKiBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZSAqLworICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLworICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQorICB7CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ2ludDMyIHN6X2hibywgc3pfbmJvOworICBndWNoYXIgKnRtcGRhdGE7CisKKyAgLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBpbiBob3N0IGFuZCBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKyAgc3pfaGJvID0gdC0+d19idWYtPmxlbiArIHNpemVvZihzel9uYm8pOworICBzel9uYm8gPSAoZ2ludDMyKSBodG9ubCAoKGd1aW50MzIpIHQtPndfYnVmLT5sZW4pOworCisgIC8qIGNvcHkgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHRoZSBmcmFtZSBpdHNlbGYgKi8KKyAgdG1wZGF0YSA9IGdfYWxsb2NhIChzel9oYm8pOworICBtZW1jcHkgKHRtcGRhdGEsIChndWludDggKikgJnN6X25ibywgc2l6ZW9mIChzel9uYm8pKTsKKworICBpZiAodC0+d19idWYtPmxlbiA+IDApCisgIHsKKyAgICBtZW1jcHkgKHRtcGRhdGEgKyBzaXplb2YgKHN6X25ibyksIHQtPndfYnVmLT5kYXRhLCB0LT53X2J1Zi0+bGVuKTsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKKyAgfQorICAgIAorICAvKiB3cml0ZSB0aGUgYnVmZmVyIGFuZCB0aGVuIGVtcHR5IGl0ICovCisgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsIHN6X2hibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmZsdXNoICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBOVUxMOworICB0cmFuc3BvcnQtPnJfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgdHJhbnNwb3J0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIGlmICh0cmFuc3BvcnQtPnJfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5yX2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IE5VTEw7CisKKyAgaWYgKHRyYW5zcG9ydC0+d19idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPndfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPndfYnVmID0gTlVMTDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJ0cmFuc3BvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCB0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzAxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgZnJhbWVkIHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMKKyAqICAgICAgICAgdGhlIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0OworCisvKiEKKyAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBHQnl0ZUFycmF5ICpyX2J1ZjsKKyAgR0J5dGVBcnJheSAqd19idWY7CisgIGd1aW50MzIgcl9idWZfc2l6ZTsKKyAgZ3VpbnQzMiB3X2J1Zl9zaXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4ZmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFIChUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKQorCisvKiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpiYXNlX2NsYXNzID0KKyAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MgKGtsYXNzKTsKKworICBiYXNlX2NsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICBrbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTk0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZICAgIFwKKyAgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgRnJhbWVkLVRyYW5zcG9ydCBGYWN0b3J5IGluc3RhbmNlICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzczsKKworLyogVGhyaWZ0IEZyYW1lZC1UcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MThlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRNZW1vcnlCdWZmZXJQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVIsCisgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVIKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0TWVtb3J5QnVmZmVyLCB0aHJpZnRfbWVtb3J5X2J1ZmZlciwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgZ2l2ZSA9IGxlbjsgCisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICAvKiBpZiB0aGUgcmVxdWVzdGVkIGJ5dGVzIGFyZSBtb3JlIHRoYW4gd2hhdCB3ZSBoYXZlIGF2YWlsYWJsZSwKKyAgICoganVzdCBnaXZlIGFsbCB0aGF0IHdlIGhhdmUgdGhlIGJ1ZmZlciAqLworICBpZiAodC0+YnVmLT5sZW4gPCBsZW4pCisgIHsKKyAgICBnaXZlID0gdC0+YnVmLT5sZW47CisgIH0KKworICBtZW1jcHkgKGJ1ZiwgdC0+YnVmLT5kYXRhLCBnaXZlKTsKKyAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+YnVmLCAwLCBnaXZlKTsKKworICByZXR1cm4gZ2l2ZTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIHJldHVybiBhbiBleGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLiAqLworICBpZiAobGVuID4gdC0+YnVmX3NpemUgLSB0LT5idWYtPmxlbikKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHdyaXRlICVkIGJ5dGVzIHRvIGJ1ZmZlciBvZiBsZW5ndGggJWQiLAorICAgICAgICAgICAgICAgICBsZW4sIHQtPmJ1Zl9zaXplKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+YnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgY2xhc3MgYmVmb3JlIGNvbnN0cnVjdG9yIHByb3BlcnRpZXMgYXJlIHNldCAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlciAqdCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHQpOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPm93bmVyICYmIHQtPmJ1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X3VucmVmICh0LT5idWYpOworICB9CisgIHQtPmJ1ZiA9IE5VTEw7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdC0+YnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCAoZ3BvaW50ZXIpICh0LT5idWYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0LT5vd25lcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6CisgICAgICB0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVI6CisgICAgICB0LT5idWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIHQtPm93bmVyID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgY2xhc3MgYWZ0ZXIgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPmJ1ZiA9PSBOVUxMKSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9wYXJlbnRfY2xhc3MpLT5jb25zdHJ1Y3RlZCAob2JqZWN0KTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3NfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJ1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQvd3JpdGUgYnVmZmVyIHNpemUgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYVUlOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWFVJTlQzMiwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgiYnVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgib3duZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBidWZmZXIgbWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHdoZXRoZXIgaW50ZXJuYWwgYnVmZmVyIHNob3VsZCBiZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5yZWZlcmVuY2VkIHdoZW4gdGhyaWZ0X21lbW9yeV9idWZmZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIGZpbmFsaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmNvbnN0cnVjdGVkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQ7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ0N2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKKyNkZWZpbmUgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbWVtb3J5X2J1ZmZlci5oCisgKiAgXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IG1lbW9yeSBidWZmZXIgdHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlcikpCisjZGVmaW5lIFRIUklGVF9JU19NRU1PUllfQlVGRkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUikpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NRU1PUllfQlVGRkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSKQorI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlciBUaHJpZnRNZW1vcnlCdWZmZXI7CisKKy8qIQorICogVGhyaWZ0TWVtb3J5QnVmZmVyIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlcgoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgR0J5dGVBcnJheSAqYnVmOworICBndWludDMyIGJ1Zl9zaXplOworICBnYm9vbGVhbiBvd25lcjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzczsKKworLyohCisgKiBUaHJpZnRNZW1vcnlCdWZmZXIgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICovCitHVHlwZSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY2xhbmctZm9ybWF0IG9mZiAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworIyAgZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgV1NBRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OIFdTQUVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCBXU0FFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19FWENMVVNJVkVBRERSVVNFCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUIElOVkFMSURfU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgdGhyaWZ0X3NvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgdGhyaWZ0X2ZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgMQorIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIDAKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCAxCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSB0aHJpZnRfZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3Nlc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIF9jbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIF9vcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBfY2hzaXplX3MKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgX2NvbW1pdAorIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IoLi4uKSB0aHJpZnRfd3N0cjJzdHIoZ2FpX3N0cmVycm9yVyhfX1ZBX0FSR1NfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIHRocmlmdF9jdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgdGhyaWZ0X3BvbGwKKyMgIGlmIFdJTlZFUiA8PSAweDA1MDIgLyogWFAsIFNlcnZlcjIwMDMgKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHRocmlmdF9wb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIDB4MDMwMAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgMHgwMDEwCisjICBlbHNlIC8qIFZpc3RhLCBXaW43Li4uICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZW5kaWYgLyogV0lOVkVSICovCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjZWxzZSAvKiBub3QgX1dJTjMyICovCisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSICAgICAgIEVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIEVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgIEVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gICAgRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUICAgRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiAgICAgIEVBR0FJTgorIyAgZGVmaW5lIFRIUklGVF9FUElQRSAgICAgICBFUElQRQorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19SRVVTRUFERFIKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgKC0xKQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHNvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyBPX05PTkJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgRl9HRVRGTAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIEZfU0VURkwKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIGdldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIG9wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIGZ0cnVuY2F0ZQorIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBmc3luYworIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CisjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHNzaXplX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHBvbGwKKyMgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTSFVUX1JEV1IKKyNlbmRpZgorCisjZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE4OTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U2VydmVyU29ja2V0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HCit9OworCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXNlcnZlci1zb2NrZXQtZXJyb3ItcXVhcmsiCisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U2VydmVyU29ja2V0LCB0aHJpZnRfc2VydmVyX3NvY2tldCwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkKKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2xpc3RlbiAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBpbnQgZW5hYmxlZCA9IDE7IC8qIGZvciBzZXRzb2Nrb3B0KCkgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgLyogY3JlYXRlIGEgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zKHRzb2NrZXQtPnBvcnQpOworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCAqLworICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChzZXRzb2Nrb3B0KHRzb2NrZXQtPnNkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZlbmFibGVkLAorICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlZCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU0VUU09DS09QVCwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSIC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGJpbmQgdG8gdGhlIHNvY2tldCAqLworICBpZiAoYmluZCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9CSU5ELAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGJpbmQgdG8gcG9ydCAlZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAobGlzdGVuKHRzb2NrZXQtPnNkLCB0c29ja2V0LT5iYWNrbG9nKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsaXN0ZW4gdG8gcG9ydCAlZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBpbnQgc2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGd1aW50IGFkZHJsZW4gPSAwOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcmVzczsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBOVUxMOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmICgoc2QgPSBhY2NlcHQodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJlc3MsICZhZGRybGVuKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYWNjZXB0IGNvbm5lY3Rpb24gLSAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsIE5VTEwpOworICBzb2NrZXQtPnNkID0gc2Q7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlQoc29ja2V0KTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmIChjbG9zZSAodHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB0c29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciB0aGlzIGltcGxlbWVudGF0aW9uICovCitHUXVhcmsKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcoVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOKTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQpCit7CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIGlmIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKKyAgeworICAgIGNsb3NlIChzb2NrZXQtPnNkKTsKKyAgfQorICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+YmFja2xvZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKKyAgICAgIHNvY2tldC0+cG9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgorICAgICAgc29ja2V0LT5iYWNrbG9nID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKnRzdGMgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrbG9nIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBhY2NlcHQgYmFja2xvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZTsKKworICB0c3RjLT5saXN0ZW4gPSB0aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW47CisgIHRzdGMtPmFjY2VwdCA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdDsKKyAgdHN0Yy0+Y2xvc2UgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9jbG9zZTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNDk1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorICogIFxicmllZiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICh0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0IFRocmlmdFNlcnZlclNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU2VydmVyU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldAoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ3VpbnQgcG9ydDsKKyAgZ3Nob3J0IGJhY2tsb2c7CisgIGludCBzZDsKKyAgZ3VpbnQ4ICpidWY7CisgIGd1aW50MzIgYnVmX3NpemU7CisgIGd1aW50MzIgYnVmX2xlbjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzczsKKworLyohCisgKiBUaHJpZnQgU2VydmVyU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldENsYXNzCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU09DS0VULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TRVRTT0NLT1BULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9CSU5ELAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9MSVNURU4sCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQ0xPU0UKK30gVGhyaWZ0U2VydmVyU29ja2V0RXJyb3I7CisKKy8qIGRlZmluZSBhIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWQxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U2VydmVyVHJhbnNwb3J0LCB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKKworLyogYmFzZSBpbml0aWFsaXplciBmb3IgdGhlIHNlcnZlciB0cmFuc3BvcnQgaW50ZXJmYWNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKmMpCit7CisgIGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbjsKKyAgYy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0OworICBjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmxpc3RlbiAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5hY2NlcHQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhOTE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAodGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQ7CisKK3N0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKmxpc3RlbikgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIFRocmlmdFRyYW5zcG9ydCAqKCphY2NlcHQpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIExpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIEFjY2VwdCBhIGNvbm5lY3Rpb24uCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitUaHJpZnRUcmFuc3BvcnQgKnRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdAorICAgIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQwZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNvY2tldFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUUsCisgIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBndWludDggYnVmOworICBpbnQgcjsKKyAgaW50IGVycm5vX2NvcHk7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpCisgIHsKKyAgICByID0gcmVjdiAoc29ja2V0LT5zZCwgJmJ1ZiwgMSwgTVNHX1BFRUspOworICAgIGlmIChyID09IC0xKQorICAgIHsKKyAgICAgIGVycm5vX2NvcHkgPSBlcnJubzsKKworICAgICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXworICAgICAgLyogRnJlZUJTRCByZXR1cm5zIC0xIGFuZCBFQ09OTlJFU0VUIGlmIHRoZSBzb2NrZXQgd2FzIGNsb3NlZCBieSB0aGUgb3RoZXIKKyAgICAgICAgIHNpZGUgKi8KKyAgICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpCisgICAgICB7CisgICAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgZXJyb3IpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgI2VuZGlmCisKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGVlayBhdCBzb2NrZXQgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vX2NvcHkpKTsKKworICAgICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXworICAgICAgfQorICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHIgPiAwKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgaW50IGVycjsKKyNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBzdHJ1Y3QgaG9zdGVudCBoZTsKKyAgY2hhciBidWZbMTAyNF07CisjZW5kaWYKKworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodHNvY2tldC0+c2QgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VULCBGQUxTRSk7CisKKyAgLyogbG9va3VwIHRoZSBkZXN0aW5hdGlvbiBob3N0ICovCisjaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaWYgKGdldGhvc3RieW5hbWVfciAodHNvY2tldC0+aG9zdG5hbWUsICZoZSwgYnVmLCAxMDI0LCAmaHAsICZlcnIpICE9IDAgfHwgaHAgPT0gTlVMTCkKKyNlbHNlCisgIGlmICgoaHAgPSBnZXRob3N0YnluYW1lICh0c29ja2V0LT5ob3N0bmFtZSkpID09IE5VTEwgJiYgKGVyciA9IGhfZXJybm8pKQorI2VuZGlmCisgIHsKKyAgICAvKiBob3N0IGxvb2t1cCBmYWlsZWQsIGJhaWwgb3V0IHdpdGggYW4gZXJyb3IgKi8KKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfSE9TVCwKKyAgICAgICAgICAgICAgICAgImhvc3QgbG9va3VwIGZhaWxlZCBmb3IgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LAorICAgICAgICAgICAgICAgICBoc3RyZXJyb3IgKGVycikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHJfbGlzdFswXSkpLT5zX2FkZHI7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsKKworICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVzOiVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdCAodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQorICB7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlKHRzb2NrZXQsIE5VTEwpOworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NPTk5FQ1QsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29ubmVjdCB0byBob3N0ICVzOiVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc29ja2V0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludCByZXQgPSAwOworICBndWludCBnb3QgPSAwOworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICB3aGlsZSAoZ290IDwgbGVuKQorICB7CisgICAgcmV0ID0gcmVjdiAoc29ja2V0LT5zZCwgKGd1aW50OCAqKWJ1ZiArIGdvdCwgbGVuLWdvdCwgMCk7CisgICAgaWYgKHJldCA8PSAwKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIC0gJXMiLCBsZW4sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGdvdCArPSByZXQ7CisgIH0KKworICByZXR1cm4gZ290OworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQsIEZBTFNFKTsKKworICB3aGlsZSAoc2VudCA8IGxlbikKKyAgeworICAgIHJldCA9IHNlbmQgKHNvY2tldC0+c2QsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50LCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2VuZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzZW50ICs9IHJldDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2luaXQgKFRocmlmdFNvY2tldCAqc29ja2V0KQoreworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgaWYgKHNvY2tldC0+aG9zdG5hbWUgIT0gTlVMTCkKKyAgeworICAgIGdfZnJlZSAoc29ja2V0LT5ob3N0bmFtZSk7CisgIH0KKyAgc29ja2V0LT5ob3N0bmFtZSA9IE5VTEw7CisKKyAgaWYgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICB7CisgICAgY2xvc2UgKHNvY2tldC0+c2QpOworICB9CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc29ja2V0LT5ob3N0bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+cG9ydCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgorICAgICAgaWYgKHNvY2tldC0+aG9zdG5hbWUpIHsKKyAgICAgICAgZ19mcmVlKHNvY2tldC0+aG9zdG5hbWUpOworICAgICAgfQorICAgICAgc29ja2V0LT5ob3N0bmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgorICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfc3RyaW5nICgiaG9zdG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGhvc3RuYW1lIG9mIHRoZSByZW1vdGUgaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxob3N0IiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgb2YgdGhlIHJlbW90ZSBob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzV1LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zb2NrZXRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NvY2tldF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfc29ja2V0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc29ja2V0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc29ja2V0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9zb2NrZXRfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZjY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc29ja2V0LmgKKyAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TT0NLRVQgKHRocmlmdF9zb2NrZXRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0IFRocmlmdFNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNvY2tldAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2NoYXIgKmhvc3RuYW1lOworICBndWludCBwb3J0OworICBpbnQgc2Q7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0Q2xhc3MgVGhyaWZ0U29ja2V0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIEhBTkRMRQorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgKHgpID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBDbG9zZUhhbmRsZSh4KQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgUmVsZWFzZU11dGV4KHgpCisjZWxzZQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgcHRocmVhZF9tdXRleF90CisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJih4KSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKHgpKQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCYoeCkpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmKHgpKQorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCAweDEwMDAwMDAwTAorCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCA9IDMsCisgIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRAorfTsKKworLyogVG8gaG9sZCBhIGdsb2JhbCBzdGF0ZSBtYW5hZ2VtZW50IG9mIG9wZW5zc2wgZm9yIGFsbCBpbnN0YW5jZXMgKi8KK3N0YXRpYyBnYm9vbGVhbiB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPUZBTFNFOworLyogVGhpcyBhcnJheSB3aWxsIHN0b3JlIGFsbCBvZiB0aGUgbXV0ZXhlcyBhdmFpbGFibGUgdG8gT3BlblNTTC4gKi8KK3N0YXRpYyBNVVRFWF9UWVBFICp0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmPU5VTEw7CisKKworLyoqCisgKiBPcGVuU1NMIHVuaXEgaWQgZnVuY3Rpb24uCisgKgorICogQHJldHVybiAgICB0aHJlYWQgaWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKHZvaWQpCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgcHRocmVhZF9zZWxmKCkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworICBlbHNlCisgICAgTVVURVhfVU5MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfU0VUVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKHZvaWQpCit7CisgIGludCBpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBmcmVlKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpOworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCitzdGF0aWMgdm9pZCogdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnQoIldlIHNob3VsZCBjcmVhdGUgYSBsb2NrXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKGludCBtb2RlLCB2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCBsb2NrIHRocmVhZCAlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgdW5sb2NrIHRocmVhZCAlZFxuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludGYoIldlIG11c3QgZGVzdHJveSB0aGUgbG9ja1xuIik7Cit9CisgKi8KKworCitHX0RFRklORV9UWVBFKFRocmlmdFNTTFNvY2tldCwgdGhyaWZ0X3NzbF9zb2NrZXQsIFRIUklGVF9UWVBFX1NPQ0tFVCkKKworCisKKy8qKgorICogV2hlbiB0aGVyZSdzIGEgdGhyZWFkIGNvbnRleHQgYXR0YWNoZWQsIHdlIHBhc3MgdGhlIFNTTCBzb2NrZXQgY29udGV4dCBzbyBpdAorICogY2FuIGNoZWNrIGlmIHRoZSBlcnJvciBpcyBvdXRzaWRlIFNTTCwgb24gSS9PIGZvciBleGFtcGxlCisgKiBAcGFyYW0gc29ja2V0CisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gc3NsX2Vycm9yCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3IoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQsIGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIGludCBzc2xfZXJyb3IsIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgYnVmZmVyX3NpemU9MTAyNDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZXJyb3IgPSBUUlVFOworICBpbnQgc3NsX2Vycm9yX3R5cGUgPSBTU0xfZ2V0X2Vycm9yKHNvY2tldC0+c3NsLCBzc2xfZXJyb3IpOworICBpZihzc2xfZXJyb3JfdHlwZT4wKXsKKyAgICAgIHN3aXRjaChzc2xfZXJyb3JfdHlwZSl7CisJY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJTU0wgJXM6ICIsIGVycm9yX21zZyk7CisJICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDAgJiYgYnVmZmVyX3NpemU+MSkgeworCSAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworCSAgICAgIGlmKHJlYXNvbiE9TlVMTCl7CisJCSAgaWYoIWZpcnN0X2Vycm9yKSB7CisJCSAgICAgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIlxuXHQiKTsKKwkJICAgICAgZmlyc3RfZXJyb3I9RkFMU0U7CisJCSAgfQorCQkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCglcykgLT4gJXMiLCBlcnJvcl9jb2RlLCByZWFzb24sIFNTTF9zdGF0ZV9zdHJpbmcoc29ja2V0LT5zc2wpKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgd3JpdHRpbmcgdG8gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCisgICAgICB9CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIHRocmlmdF9lcnJvcl9ubywgIiVzIiwgYnVmZmVyKTsKKyAgfQorfQorCisvKioKKyAqIEZvciBnbG9iYWwgU1NMIGVycm9ycworICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKyAgICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFg6ICVzIiwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKTsKKyAgICAgIH1lbHNleworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFggJXM6ICVzIiwgZXJyb3JfY29kZSxyZWFzb24sIGVycm9yX21zZyk7CisgICAgICB9CisgIH0KK30KKworCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2lzX29wZW4odHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBpZiAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBpbnQgcmM7CisgICAgICBnY2hhciBieXRlOworICAgICAgcmMgPSBTU0xfcGVlayhzc2xfc29ja2V0LT5zc2wsICZieXRlLCAxKTsKKyAgICAgIGlmIChyYyA8IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkNoZWNrIHNvY2tldCBkYXRhIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJjLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZiAocmMgPT0gMCkgeworCSAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICB9CisgICAgICByZXR2YWwgPSAocmMgPiAwKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICBpZiAoIXRocmlmdF9zb2NrZXRfb3Blbih0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1ModHJhbnNwb3J0KS0+aGFuZGxlX2hhbmRzaGFrZSh0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQodHJhbnNwb3J0KTsKKyAgaWYoc3NsX3NvY2tldCE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2wpIHsKKyAgICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfc29ja2V0LT5zc2wpOworLyogICAgICBpZiAocmMgPCAwKSB7CisJICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTDsKKyAgICAgIH0qLworICAgICAgU1NMX2ZyZWUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIHNzbF9zb2NrZXQtPnNzbCA9IE5VTEw7CisgICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorCQkJZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBndWludCBtYXhSZWN2UmV0cmllc18gPSAxMDsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGd1aW50IGJ5dGVzID0gMDsKKyAgZ3VpbnQgcmV0cmllcyA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIGZvciAocmV0cmllcz0wOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsX3NvY2tldC0+c3NsLCBidWYsIGxlbik7CisgICAgICBpZiAoYnl0ZXMgPj0gMCkKKwlicmVhazsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAoU1NMX2dldF9lcnJvcihzc2xfc29ja2V0LT5zc2wsIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworCSAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7CisJICAgICAgY29udGludWU7CisJICB9CisgICAgICB9ZWxzZXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlJlY2VpdmUgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgYnl0ZXMsIGVycm9yKTsKKworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBieXRlczsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisJCQkgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pCisgICAgeworICAgICAgcmV0ID0gU1NMX3dyaXRlIChzc2xfc29ja2V0LT5zc2wsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICAgIGlmIChyZXQgPCAwKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlNlbmQgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmV0LCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgc2VudCArPSByZXQ7CisgICAgfQorCisgIHJldHVybiBzZW50PT1sZW47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBCSU8qIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfc29ja2V0LT5zc2wpOworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoLCB3YmlvIHJldHVybmVkIG51bGwiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2ggaXQgcmV0dXJuZWQgZXJyb3IiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpLCBGQUxTRSk7CisKKyAgaWYoVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpLT5jcmVhdGVfc3NsX2NvbnRleHQodHJhbnNwb3J0LCBlcnJvcikpeworICAgICAgLypDb250ZXh0IGNyZWF0ZWQqLworICAgICAgU1NMX3NldF9mZChzc2xfc29ja2V0LT5zc2wsIHNvY2tldC0+c2QpOworICAgICAgaW50IHJjOworICAgICAgaWYoc3NsX3NvY2tldC0+c2VydmVyKXsKKwkgIHJjID0gU1NMX2FjY2VwdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfWVsc2V7CisJICByYyA9IFNTTF9jb25uZWN0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9CisgICAgICBpZiAocmMgPD0gMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kIiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELCByYywgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9ZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gdGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0KFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworICAgICAgaWYoc29ja2V0LT5zc2whPU5VTEwpIHsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBzb2NrZXQtPnNzbCA9IFNTTF9uZXcoc29ja2V0LT5jdHgpOworICAgICAgaWYgKHNvY2tldC0+c3NsID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVCwKKwkJICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgU1NMIGNvbnRleHQiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBlcnJvcl9idWZmZXJbMjU1XTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICBnX2Vycm9yKCJPcGVuU1NMIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgcmMgPSBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfc29ja2V0LT5jdHgsIGZpbGVfbmFtZSwgTlVMTCk7CisgIGlmIChyYyAhPSAxKSB7IC8qdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCovCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsIDI1NCk7CisgICAgICBnX3dhcm5pbmcoIkxvYWQgb2YgY2VydGlmaWNhdGVzIGZhaWxlZDogJXMhIiwgZXJyb3JfYnVmZmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSkKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIC8qIExvYWQgY2hhaW4gb2YgY2VydHMqLworICBYNTA5ICpjYWNlcnQ9TlVMTDsKKyAgQklPICptZW0gPSBCSU9fbmV3X21lbV9idWYoY2hhaW5fY2VydHMsc3RybGVuKGNoYWluX2NlcnRzKSk7CisgIFg1MDlfU1RPUkUgKmNlcnRfc3RvcmUgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKHNzbF9zb2NrZXQtPmN0eCk7CisKKyAgaWYoY2VydF9zdG9yZSE9TlVMTCl7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKChjYWNlcnQgPSBQRU1fcmVhZF9iaW9fWDUwOShtZW0sIE5VTEwsIDAsIE5VTEwpKSE9TlVMTCkgeworCSAgaWYoY2FjZXJ0KSB7CisJICAgICAgWDUwOV9TVE9SRV9hZGRfY2VydChjZXJ0X3N0b3JlLCBjYWNlcnQpOworCSAgICAgIFg1MDlfZnJlZShjYWNlcnQpOworCSAgICAgIGNhY2VydD1OVUxMOworCSAgfSAvKiBGcmVlIGltbWVkaWF0ZWx5ICovCisJICBpbmRleCsrOworICAgICAgfQorICAgICAgcmV0dmFsPVRSVUU7CisgIH0KKyAgQklPX2ZyZWUobWVtKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpOworICBnYm9vbGVhbiBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IEZBTFNFOworCisgIGlmKGNscyE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwpeworICAgICAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8qIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQgKi8KKwkgIGlmIChyYyA9PSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCAmJiBzc2xfc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkKSB7CisJICAgICAgZ19kZWJ1ZygiVGhlIGNlcnRpZmljYXRlIGlzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYW5kIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGl0Iik7CisJICB9IGVsc2UgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJUaGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJXMgKCVkKSIsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSwgcmMpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKGNlcnQgPT0gTlVMTCkgeworCSAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsX3NvY2tldC0+c3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiTm8gY2VydGlmaWNhdGUgcHJlc2VudC4gQXJlIHlvdSBjb25uZWN0aW5nIFNTTCBzZXJ2ZXI/Iik7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorCSAgZ19kZWJ1ZygiTm8gY2VydGlmaWNhdGUgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICAvKiBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50LCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyBtYW5hZ2VyIHdlIGFyZSBkb25lICovCisgICAgICBpZiAoY2xzLT5hdXRob3JpemVfcGVlciA9PSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisJICBnX2RlYnVnKCJDZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnV0IHdlJ3JlIG5vdCBjaGVja2luZyBpdCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCSAgLyogYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQgKi8KKwkgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCSAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkgIGlmIChnZXRwZWVybmFtZShzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworCSAgICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwkgIH0KKwkgIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gY2xzLT5hdXRob3JpemVfcGVlcih0cmFuc3BvcnQsIGNlcnQsICZzYSwgZXJyb3IpOworICAgICAgfQorICAgICAgaWYoY2VydCAhPSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gYXV0aG9yaXphdGlvbl9yZXN1bHQ7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdCAoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBzb2NrZXQtPnNzbCA9IE5VTEw7CisgIHNvY2tldC0+Y3R4ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFNTTFRMUywgJmVycm9yKTsKKyAgaWYoc29ja2V0LT5jdHggPT0gTlVMTCkgeworICAgICAgZ19pbmZvKCJUaGUgU1NMIGNvbnRleHQgd2FzIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggcHJvdG9jb2wgJWQiLCBTU0xUTFMpOworICAgICAgaWYoZXJyb3IhPU5VTEwpeworCSAgZ19pbmZvKCJSZXBvcnRlZCByZWFzb24gJXMiLCBlcnJvci0+bWVzc2FnZSk7CisJICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIH0KKyAgfQorICBzb2NrZXQtPnNlcnZlciA9IEZBTFNFOworICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBGQUxTRTsKKworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBpZihzb2NrZXQhPU5VTEwpeworICAgICAgZ19kZWJ1ZygiSW5zdGFuY2UgJXAgZGVzdHJveWVkIiwgKHZvaWQgKilzb2NrZXQpOworICAgICAgaWYoc29ja2V0LT5zc2wgIT0gTlVMTCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZShUSFJJRlRfVFJBTlNQT1JUKG9iamVjdCksICZlcnJvcik7CisJICBzb2NrZXQtPnNzbD1OVUxMOworCX0KKworICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBmb3IgdGhlIGluc3RhbmNlIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworCSAgc29ja2V0LT5jdHg9TlVMTDsKKyAgICAgIH0KKyAgfQorCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCUdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCBzb2NrZXQtPmN0eCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBzaW5jZSB3ZSBhcmUgc2V0dGluZyBhIG5ldyBvbmUiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmN0eCA9IGdfdmFsdWVfZ2V0X3BvaW50ZXIodmFsdWUpOyAvKiBXZSBjb3B5IHRoZSBjb250ZXh0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVEOgorICAgICAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gZ192YWx1ZV9nZXRfYm9vbGVhbih2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nKCJUcnlpbmcgdG8gc2V0IHByb3BlcnR5ICVpIHRoYXQgZG9lc24ndCBleGlzdHMhIiwgcHJvcGVydHlfaWQpOworICAgICAgLyogICAgdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsgKi8KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZih0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKXsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPVRSVUU7CisgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKyAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9CSU9fc3RyaW5ncygpOworCisgIC8qIFNldHVwIGxvY2tpbmcgKi8KKyAgZ19kZWJ1ZygiV2Ugc2V0dXAgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAoKSk7CisKKyAgLyogZHluYW1pYyBsb2NraW5nCisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKTsKKyAgICovCit9CisKKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBnX2RlYnVnKCJXZSBjbGVhcmVkICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAoKSk7CisgIC8qIE5vdCBzdXBwb3J0ZWQKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgICAqLworICBFUlJfZnJlZV9zdHJpbmdzKCk7CisgIEVWUF9jbGVhbnVwKCk7CisgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgIEVSUl9yZW1vdmVfc3RhdGUoMCk7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICBnX2RlYnVnKCJJbml0aWFsaXphdGlvbiBvZiBUaHJpZnRTU0xTb2NrZXRDbGFzcyIpOworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5OworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJzc2xfY29udGV4dCIsCisJCQkJICAgICAiU1NMQ29udGV4dCIsCisJCQkJICAgICAiU2V0IHRoZSBTU0wgY29udGV4dCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIHJlbW90ZSBob3N0IiwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhULAorCQkJCSAgIHBhcmFtX3NwZWMpOworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2xfYWNjZXB0X3NlbGZzaWduZWQiLAorCQkJCSAgICAgIkFjY2VwdCBTZWxmIFNpZ25lZCIsCisJCQkJICAgICAiV2hldGhlciBvciBub3QgYWNjZXB0IHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIiwKKwkJCQkgICAgIEZBTFNFLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5oYW5kbGVfaGFuZHNoYWtlID0gdGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZTsKKyAgY2xzLT5jcmVhdGVfc3NsX2NvbnRleHQgPSB0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQ7CisKKyAgLyogT3ZlcnJpZGUgKi8KKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NzbF9zb2NrZXRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaDsKK30KKworCisvKgorICogUHVibGljIEFQSQorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICBnX3dhcm5pbmcoIldlIGNhbm5vdCBpbml0aWFsaXplIGNvbnRleHQgZm9yIHByb3RvY29sICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKworICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgLyogRklYTUUgRG8gZXJyb3IgY29udHJvbCAqLworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCAiaG9zdG5hbWUiLCBob3N0bmFtZSwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjaykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKnNzbFNvY2tldENsYXNzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTIChzc2xfc29ja2V0KTsKKyAgaWYoc3NsU29ja2V0Q2xhc3MpeworICAgICAgc3NsU29ja2V0Q2xhc3MtPmF1dGhvcml6ZV9wZWVyID0gY2FsbGJhY2s7CisgIH0KK30KKworCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFNTTF9DVFgqIGNvbnRleHQgPSBOVUxMOworICBzd2l0Y2goc3NsX3Byb3RvY29sKXsKKyAgICBjYXNlIFNTTFRMUzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICAgIGNhc2UgU1NMdjM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFRMU3YxXzA6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8xOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8yOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisJCSAgICJUaGUgU1NMIHByb3RvY29sIGlzIHVua25vd24gZm9yICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29udGV4dCA9PSBOVUxMKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoIk5vIGNpcGhlciBvdmVybGF5IiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsIGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIFNTTF9DVFhfc2V0X21vZGUoY29udGV4dCwgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLyogRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAgICB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuICovCisgIGlmIChzc2xfcHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Mik7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Myk7ICAgLyogVEhSSUZULTMxNjQgKi8KKyAgfQorCisgIHJldHVybiBjb250ZXh0OworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NzbF9zb2NrZXQuaAorICogIFxicmllZiBTU0wgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFNvY2tldCBjbGFzcy4gQmFzZWQgb24gcGxhaW4gb3BlbnNzbC4KKyAqICAgICAgICAgSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgdGFrZSBhIGxvb2sgdG8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAxNgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVD03LAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVECit9IFRocmlmdFNTTFNvY2tldEVycm9yOworCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQgVGhyaWZ0U1NMU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTU0wgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldAoreworICBUaHJpZnRTb2NrZXQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgU1NMICpzc2w7CisgIFNTTF9DVFgqIGN0eDsKKyAgZ2Jvb2xlYW4gc2VydmVyOworICBnYm9vbGVhbiBhbGxvd19zZWxmc2lnbmVkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzIFRocmlmdFNTTFNvY2tldENsYXNzOwordHlwZWRlZiBnYm9vbGVhbiAoKiBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0spIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcworeworICBUaHJpZnRTb2NrZXRDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogaGFuZGxlX2hhbmRzaGFrZSkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBjcmVhdGVfc3NsX2NvbnRleHQpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogYXV0aG9yaXplX3BlZXIpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogUGFkZGluZyB0byBhbGxvdyBhZGRpbmcgdXAgdG8gMTIgbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHdpdGhvdXQKKyAgICogYnJlYWtpbmcgQUJJLiAqLworICBncG9pbnRlciBwYWRkaW5nWzEyXTsKK307CisKK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvKiBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4gKi8KKy8qU1NMdjIgICA9IDEsICAgSE9SUklCTFkgSU5TRUNVUkUhICovCisgIFNTTHYzICAgPSAyLCAgLyogU3VwcG9ydHMgU1NMdjMgb25seSAtIGFsc28gaG9ycmlibHkgaW5zZWN1cmUhICovCisgIFRMU3YxXzAgPSAzLCAgLyogU3VwcG9ydHMgVExTdjFfMCBvciBsYXRlci4gKi8KKyAgVExTdjFfMSA9IDQsICAvKiBTdXBwb3J0cyBUTFN2MV8xIG9yIGxhdGVyLiAqLworICBUTFN2MV8yID0gNSwgIC8qIFN1cHBvcnRzIFRMU3YxXzIgb3IgbGF0ZXIuICovCisgIExBVEVTVCAgPSBUTFN2MV8yCit9OwordHlwZWRlZiBlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBUaHJpZnRTU0xTb2NrZXRQcm90b2NvbDsKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IGEgcGlubmluZyBtYW5hZ2VyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLgorICoKKyAqIFRoZSBwaW5uaW5nIG1hbmFnZXIgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgU1NMIGhhbmRzaGFrZSB0byBjaGVjayBjZXJ0aWZpY2F0ZQorICogYW5kIHBpbm5pbmcgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gc3NsX3NvY2tldCBTU0wgU29ja2V0IHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgdGhlIGNvbnRyb2wgd2hpbGUgdmFsaWRhdGluZyBwaW5uaW5nCisgKgorICovCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKTsKKworLyogVGhpcyBpcyB0aGUgU1NMIEFQSSAqLworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0IHdpdGggc3BlY2lmaWVkIGhvc3Q6cG9ydC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBob3N0bmFtZQorICogQHBhcmFtIHBvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBQRU0gZmlsZS4KKyAqIEBwYXJhbSBzc2xfc29ja2V0IFRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gZmlsZV9uYW1lIFRoZSBmaWxlIG5hbWUgb2YgdGhlIFBFTSBjZXJ0aWZpY2F0ZSBjaGFpbgorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBtZW1vcnkKKyAqIEBwYXJhbSBzc2xfc29ja2V0IHRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gY2hhaW5fY2VydHMgdGhlIGJ1ZmZlciB0byBsb2FkIFBFTSBmcm9tCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHNzbCBzb2NrZXQgaXMgb3BlbiBhbmQgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHJldHVybiB0cnVlIGlmIG9wZW4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworCisvKioKKyAqIE9wZW4gY29ubmVjdGlvbiBpZiByZXF1aXJlZCBhbmQgc2V0IHRoZSBzb2NrZXQgdG8gYmUgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBjb3JyZWN0CisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgd2lsbCBpbml0aWFsaXplIE9wZW5TU0wgZnVuY3Rpb24uIFRoaXMgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBkb25lIGFwcAorICogd2lkZS4gU28gaWYgeW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBpdCBieSB5b3Vyc2VsZiB5b3Ugc2hvdWxkIG5vdCBjYWxsIGl0LgorICogQnV0IGl0IG1lYW5zIHlvdSBtdXN0IGhhbmRsZSBPcGVuU1NMIGluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGUgbG9ja2luZy4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKTsKKy8qKgorICogQGJyaWVmIEZpbmFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IGNsZWFycyBhbGwgcmVzb3VyY2VzIGluaXRpYWxpemVkIGluIGluaXRpYWxpemUgZnVuY3Rpb24uCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyNjcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXRyYW5zcG9ydC1lcnJvci1xdWFyayIKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRUcmFuc3BvcnQsIHRocmlmdF90cmFuc3BvcnQsIEdfVFlQRV9PQkpFQ1QpCisKK2dib29sZWFuIAordGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5pc19vcGVuICh0cmFuc3BvcnQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cGVlayAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5vcGVuICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZCAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZF9lbmQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZSAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZV9lbmQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5mbHVzaCAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCisvKiBieSBkZWZhdWx0LCBwZWVrIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4gKi8KK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyBnaW50MzIKK3RocmlmdF90cmFuc3BvcnRfcmVhbF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBndWludDMyIGhhdmU7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQ4ICpieXRlczsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworICBoYXZlID0gMDsKKyAgcmV0ID0gMDsKKyAgYnl0ZXMgPSAoZ2ludDgqKSBidWY7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBpZiAoKHJldCA9IHR0Yy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIChieXRlcyArIGhhdmUpLCBsZW4gLSBoYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaGF2ZSArPSByZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLworR1F1YXJrCit0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOKTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFRyYW5zcG9ydCAqLworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+aXNfb3BlbiA9IHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgY2xzLT5vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuOworICBjbHMtPmNsb3NlID0gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZTsKKyAgY2xzLT5yZWFkID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkOworICBjbHMtPnJlYWRfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgY2xzLT53cml0ZSA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGU7CisgIGNscy0+d3JpdGVfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIGNscy0+Zmx1c2ggPSB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoOworCisgIC8qIHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgcGVlayBhbmQgcmVhZF9hbGwgbWV0aG9kcyAqLworICBjbHMtPnBlZWsgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlazsKKyAgY2xzLT5yZWFkX2FsbCA9IHRocmlmdF90cmFuc3BvcnRfcmVhbF9yZWFkX2FsbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnQuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMuCisgKgorICogQW4gYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZSBiZWNhdXNlOgorICogIC0gaW50ZXJmYWNlcyBjYW4ndCBzZWVtIHRvIGJlIHVzZWQgYXMgcHJvcGVydGllcy4gIFRocmlmdFByb3RvY29sIGhhcworICogICAgYSBUaHJpZnRUcmFuc3BvcnQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LgorICogIC0gaWYgYSBtZXRob2QgbmVlZHMgdG8gYmUgYWRkZWQgdGhhdCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlLCBhIGNsYXNzCisgKiAgICBpcyBuZWNlc3NhcnkuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICh0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydCBUaHJpZnRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydAoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcyBUaHJpZnRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgZ2Jvb2xlYW4gKCppc19vcGVuKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICBnYm9vbGVhbiAoKnBlZWspIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKm9wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnJlYWRfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp3cml0ZSkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp3cml0ZV9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmZsdXNoKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9hbGwpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KKworLyohCisgKiBDaGVja3MgaWYgdGhpcyB0cmFuc3BvcnQgaXMgb3BlbmVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCisvKiEKKyAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGVzdHMgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCBvciBpZiB0aGUgcmVtb3RlIHNpZGUgaXMgc3RpbGwKKyAqIG9wZW4uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIHdoZW5ldmVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgYnV0CisgKiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZSBwb3NzaWJsZQorICogKGkuZS4gb24gYSBzb2NrZXQpLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogV3JpdGVzIGRhdGEgZnJvbSBhIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiAgVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAorICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBSZWFkIGxlbiBieXRlcyBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRQorfSBUaHJpZnRUcmFuc3BvcnRFcnJvcjsKKworLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SICh0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICgpKQorCisvKiBkZWZpbmUgbWFjcm8gZm9yIGludmFsaWQgc29ja2V0ICovCisjZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDI1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFRyYW5zcG9ydEZhY3RvcnksIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeSwgR19UWVBFX09CSkVDVCkKKworLyogYnVpbGRzIGEgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisgIHJldHVybiB0cmFuc3BvcnQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpjbHMpCit7CisgIGNscy0+Z2V0X3RyYW5zcG9ydCA9IHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzZGEzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorICogIFxicmllZiBCYXNlIGNsYXNzIGZvciBUaHJpZnQgVHJhbnNwb3J0IEZhY3Rvcmllcy4gIFVzZWQgYnkgVGhyaWZ0IFNlcnZlcnMKKyAqICAgICAgICAgdG8gb2J0YWluIGEgY2xpZW50IHRyYW5zcG9ydCBmcm9tIGFuIGV4aXN0aW5nIHRyYW5zcG9ydC4gIFRoZSBkZWZhdWx0CisgKiAgICAgICAgIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbG9uZXMgdGhlIHByb3ZpZGVkIHRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSAodGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeQoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIFRocmlmdFRyYW5zcG9ydCAqKCpnZXRfdHJhbnNwb3J0KSAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRUcmFuc3BvcnQgKnRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNlNDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitzZXQoVEVTVF9QUkVGSVggImNfZ2xpYiIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKworI01ha2Ugc3VyZSBnZW4tY3BwIGFuZCBnZW4tY19nbGliIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDIHRlc3QgbGlicmFyeQorc2V0KHRlc3RnZW5jX1NPVVJDRVMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorKQorCithZGRfbGlicmFyeSh0ZXN0Z2VuYyBTVEFUSUMgJHt0ZXN0Z2VuY19TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Z2VuYyB0aHJpZnRfY19nbGliKQorCisKK2FkZF9leGVjdXRhYmxlKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RzZXJpYWxpemF0aW9uLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHNlcmlhbGl6YXRpb24gdGVzdGdlbmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNlcmlhbGl6YXRpb24gdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHNlcmlhbGl6YXRpb24gQ09NTUFORCB0ZXN0c2VyaWFsaXphdGlvbikKKworYWRkX2V4ZWN1dGFibGUodGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gQ09NTUFORCB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24pCisKK2FkZF9leGVjdXRhYmxlKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGVzdHRyYW5zcG9ydHNvY2tldC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHRyYW5zcG9ydHNvY2tldCBDT01NQU5EIHRlc3R0cmFuc3BvcnRzb2NrZXQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RiaW5hcnlwcm90b2NvbCB0ZXN0YmluYXJ5cHJvdG9jb2wuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YmluYXJ5cHJvdG9jb2wgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGJpbmFyeXByb3RvY29sIENPTU1BTkQgdGVzdGJpbmFyeXByb3RvY29sKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0Y29tcGFjdHByb3RvY29sIHRlc3Rjb21wYWN0cHJvdG9jb2wuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Y29tcGFjdHByb3RvY29sIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3Rjb21wYWN0cHJvdG9jb2wgQ09NTUFORCB0ZXN0Y29tcGFjdHByb3RvY29sKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RidWZmZXJlZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RidWZmZXJlZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGZyYW1lZHRyYW5zcG9ydCB0ZXN0ZnJhbWVkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZyYW1lZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZnJhbWVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGZyYW1lZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGZkdHJhbnNwb3J0IHRlc3RmZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RmZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZmR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZmR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RtZW1vcnlidWZmZXIgdGVzdG1lbW9yeWJ1ZmZlci5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RtZW1vcnlidWZmZXIgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdG1lbW9yeWJ1ZmZlciBDT01NQU5EIHRlc3RtZW1vcnlidWZmZXIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RzaW1wbGVzZXJ2ZXIgdGVzdHNpbXBsZXNlcnZlci5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RzaW1wbGVzZXJ2ZXIgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHNpbXBsZXNlcnZlciBDT01NQU5EIHRlc3RzaW1wbGVzZXJ2ZXIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RkZWJ1Z3Byb3RvIHRlc3RkZWJ1Z3Byb3RvLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdGRlYnVncHJvdG8gdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3RkZWJ1Z3Byb3RvIENPTU1BTkQgdGVzdGRlYnVncHJvdG8pCisKK2FkZF9leGVjdXRhYmxlKHRlc3RvcHRpb25hbHJlcXVpcmVkIHRlc3RvcHRpb25hbHJlcXVpcmVkLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdG9wdGlvbmFscmVxdWlyZWQgdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3RvcHRpb25hbHJlcXVpcmVkIENPTU1BTkQgdGVzdG9wdGlvbmFscmVxdWlyZWQpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0IHRlc3R0aHJpZnR0ZXN0LmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dGhyaWZ0dGVzdCB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdHRocmlmdHRlc3QgQ09NTUFORCB0ZXN0dGhyaWZ0dGVzdCkKKworCitpZihCVUlMRF9DUFApCisKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCisgICAgIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CisgICAgc2V0KHRlc3RnZW5jX2NwcF9TT1VSQ0VTCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuaAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmgKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICApCisKKyAgICBhZGRfbGlicmFyeSh0ZXN0Z2VuY19jcHAgU1RBVElDICR7dGVzdGdlbmNfY3BwX1NPVVJDRVN9KQorICAgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Z2VuY19jcHAgdGhyaWZ0KQorCisgICAgI0hBQ0s6IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCBpbmNsdWRlcyBUaHJpZnRUZXN0Lmggd2l0aG91dCBnZW4tKi8gcHJlZml4ZXMKKyAgICAjIHNvIHdlIGluY2x1ZGUgaXQgaGVyZQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jX2dsaWIiKQorCisgICAgYWRkX2V4ZWN1dGFibGUodGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0Z2VuYyB0ZXN0Z2VuY19jcHAgJHtaTElCX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdGNsaWVudCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0Y2xpZW50KQorCitlbmRpZihCVUlMRF9DUFApCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCisjIFRPRE86IEFkZCBtZW1vcnkgY2hlY2tzIHVzaW5nIGN0ZXN0X21lbWNoZWNrIG9yIHNpbWlsYXIKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdCBiL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAorCit0eXBlZGVmIGxpc3Q8c3RyaW5nPiBTdHJpbmdMaXN0Cit0eXBlZGVmIGxpc3Q8U3RyaW5nTGlzdD4gTGlzdFN0cmluZ0xpc3QKKworc3RydWN0IENvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyB7CisgIDE6IGxpc3Q8c3RyaW5nPiBTdHJpbmdMaXN0ID0gWyAiQXBhY2hlIiwgIlRocmlmdCIgXTsKK30KKworc2VydmljZSBDb250YWluZXJTZXJ2aWNlIHsKKyAgdm9pZCByZWNlaXZlU3RyaW5nTGlzdCgxOiBsaXN0PHN0cmluZz4gc3RyaW5nTGlzdCk7CisgIGxpc3Q8c3RyaW5nPiByZXR1cm5TdHJpbmdMaXN0KCk7CisKKyAgbGlzdDxsaXN0PHN0cmluZz4+IHJldHVybkxpc3RTdHJpbmdMaXN0KCk7CisgIExpc3RTdHJpbmdMaXN0IHJldHVyblR5cGVkZWZkTGlzdFN0cmluZ0xpc3QoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTlkMmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK1NVQkRJUlMgPQorCitCVUlMVF9TT1VSQ0VTID0gXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorCitBTV9DUFBGTEFHUyA9IC1JLi4vc3JjIC1JLi9nZW4tY19nbGliCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIFwKKwlAR0NPVl9DRkxBR1NACitBTV9DWFhGTEFHUyA9ICQoQU1fQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xJQlMpIEBHQ09WX0xERkxBR1NACisKK2NoZWNrX1BST0dSQU1TID0gXAorICB0ZXN0c2VyaWFsaXphdGlvbiBcCisgIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiBcCisgIHRlc3Rjb250YWluZXJ0ZXN0IFwKKyAgdGVzdHRyYW5zcG9ydHNvY2tldCBcCisgIHRlc3R0cmFuc3BvcnRzc2xzb2NrZXQgXAorICB0ZXN0YmluYXJ5cHJvdG9jb2wgXAorICB0ZXN0Y29tcGFjdHByb3RvY29sIFwKKyAgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IFwKKyAgdGVzdGZyYW1lZHRyYW5zcG9ydCBcCisgIHRlc3RmZHRyYW5zcG9ydCBcCisgIHRlc3RtZW1vcnlidWZmZXIgXAorICB0ZXN0c3RydWN0IFwKKyAgdGVzdHNpbXBsZXNlcnZlciBcCisgIHRlc3RkZWJ1Z3Byb3RvIFwKKyAgdGVzdG9wdGlvbmFscmVxdWlyZWQgXAorICB0ZXN0dGhyaWZ0dGVzdAorCitpZiBXSVRIX0NQUAorICBCVUlMVF9TT1VSQ0VTICs9IGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgY2hlY2tfUFJPR1JBTVMgKz0gdGVzdHRocmlmdHRlc3RjbGllbnQKK2VuZGlmCisKK3Rlc3RzZXJpYWxpemF0aW9uX1NPVVJDRVMgPSB0ZXN0c2VyaWFsaXphdGlvbi5jCit0ZXN0c2VyaWFsaXphdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgIGxpYnRlc3RnZW5jLmxhCisKK3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9TT1VSQ0VTID0gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKK3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24ubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc3RydWN0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworCit0ZXN0Y29udGFpbmVydGVzdF9TT1VSQ0VTID0gdGVzdGNvbnRhaW5lcnRlc3QuYwordGVzdGNvbnRhaW5lcnRlc3RfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc3RydWN0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm9jZXNzb3IubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyLm8gXAorCSAgbGlidGVzdGdlbmMubGEKKwordGVzdHRyYW5zcG9ydHNvY2tldF9TT1VSQ0VTID0gdGVzdHRyYW5zcG9ydHNvY2tldC5jCit0ZXN0dHJhbnNwb3J0c29ja2V0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKKwordGVzdHRyYW5zcG9ydHNzbHNvY2tldF9TT1VSQ0VTID0gdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKworCit0ZXN0YmluYXJ5cHJvdG9jb2xfU09VUkNFUyA9IHRlc3RiaW5hcnlwcm90b2NvbC5jCit0ZXN0YmluYXJ5cHJvdG9jb2xfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGNvbXBhY3Rwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGNvbXBhY3Rwcm90b2NvbC5jCit0ZXN0Y29tcGFjdHByb3RvY29sX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKK3Rlc3RidWZmZXJlZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKK3Rlc3RidWZmZXJlZHRyYW5zcG9ydF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0ZnJhbWVkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKK3Rlc3RmcmFtZWR0cmFuc3BvcnRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGZkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0ZmR0cmFuc3BvcnQuYwordGVzdGZkdHJhbnNwb3J0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZkX3RyYW5zcG9ydC5vCisKK3Rlc3RtZW1vcnlidWZmZXJfU09VUkNFUyA9IHRlc3RtZW1vcnlidWZmZXIuYwordGVzdG1lbW9yeWJ1ZmZlcl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KKwordGVzdHN0cnVjdF9TT1VSQ0VTID0gdGVzdHN0cnVjdC5jCit0ZXN0c3RydWN0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworCit0ZXN0c2ltcGxlc2VydmVyX1NPVVJDRVMgPSB0ZXN0c2ltcGxlc2VydmVyLmMKK3Rlc3RzaW1wbGVzZXJ2ZXJfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubworCit0ZXN0ZGVidWdwcm90b19TT1VSQ0VTID0gdGVzdGRlYnVncHJvdG8uYwordGVzdGRlYnVncHJvdG9fTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYQorCit0ZXN0b3B0aW9uYWxyZXF1aXJlZF9TT1VSQ0VTID0gdGVzdG9wdGlvbmFscmVxdWlyZWQuYwordGVzdG9wdGlvbmFscmVxdWlyZWRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICBsaWJ0ZXN0Z2VuYy5sYQorCit0ZXN0dGhyaWZ0dGVzdF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3QuYwordGVzdHRocmlmdHRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLm8KK3Rlc3R0aHJpZnR0ZXN0X0NGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS90ZXN0L2NfZ2xpYi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKKwordGVzdHRocmlmdHRlc3RjbGllbnRfU09VUkNFUyA9IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcAordGVzdHRocmlmdHRlc3RjbGllbnRfQ1BQRkxBR1MgPSAtSS4uLy4uL2NwcC9zcmMgJChCT09TVF9DUFBGTEFHUykgLUkuL2dlbi1jcHAgLUkuLi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKK3Rlc3R0aHJpZnR0ZXN0Y2xpZW50X0xEQUREID0gLi4vLi4vY3BwLy5saWJzL2xpYnRocmlmdC5sYSAuLi9saWJ0aHJpZnRfY19nbGliLmxhIGxpYnRlc3RnZW5jLmxhIGxpYnRlc3RnZW5jcHAubGEKK3Rlc3R0aHJpZnR0ZXN0Y2xpZW50X0xERkxBR1MgPSAtTC4uLy5saWJzIC1MLi4vLi4vY3BwLy5saWJzICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykKKworY2hlY2tfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuYy5sYQorCitpZiBXSVRIX0NQUAorICBjaGVja19MVExJQlJBUklFUyArPSBsaWJ0ZXN0Z2VuY3BwLmxhCitlbmRpZgorCitub2Rpc3RfbGlidGVzdGdlbmNfbGFfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCitsaWJ0ZXN0Z2VuY19sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCitsaWJ0ZXN0Z2VuY19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCisKK25vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuaCBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCitsaWJ0ZXN0Z2VuY3BwX2xhX0NQUEZMQUdTID0gLUkuLi8uLi9jcHAvc3JjICQoQk9PU1RfQ1BQRkxBR1MpIC1JLi9nZW4tY3BwCisKK2dlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmg6IENvbnRhaW5lclRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBnZW4tY19nbGliL3RfdGVzdF9zcnYuaDogLi4vLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggOiAuLi8uLi8uLi90ZXN0L0VudW1UZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHA6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitURVNUUyA9IFwKKyAgJChjaGVja19QUk9HUkFNUykgXAorICAkKGNoZWNrX1NDUklQVFMpCisKKyMgZ2xvYmFsbHkgYWRkZWQgdG8gYWxsIGluc3RhbmNlcyBvZiB2YWxncmluZCBjYWxscworIyBWQUxHUklORF9PUFRTID0gLS1zdXBwcmVzc2lvbnM9Z2xpYi5zdXBwcmVzcworVkFMR1JJTkRfT1BUUyA9CisKKyMgZ2xvYmFsbHkgYWRkZWQgdG8gYWxsIG1lbWNoZWNrIGNhbGxzCitWQUxHUklORF9NRU1fT1BUUyA9IC0tdG9vbD1tZW1jaGVjayBcCisgICAgICAgICAgICAgICAgICAgIC0tbnVtLWNhbGxlcnM9MTAgXAorICAgICAgICAgICAgICAgICAgICAke215ZXh0cmF2YWxncmluZG1lbW9wdHN9CisKKyMgZ2xvYmFsbHkgYWRkZWQgdG8gYWxsIGxlYWtjaGVjayBjYWxscworVkFMR1JJTkRfTEVBS19PUFRTID0gLS10b29sPW1lbWNoZWNrIFwKKyAgICAgICAgICAgICAgICAgICAgIC0tbnVtLWNhbGxlcnM9MTAgXAorICAgICAgICAgICAgICAgICAgICAgLS1sZWFrLWNoZWNrPWZ1bGwgXAorICAgICAgICAgICAgICAgICAgICAgLS1sZWFrLXJlc29sdXRpb249aGlnaCBcCisgICAgICAgICAgICAgICAgICAgICAke215ZXh0cmF2YWxncmluZGxlYWtvcHRzfQorCittZW1jaGVjazogJChjaGVja19QUk9HUkFNUykKKwlAZm9yIHggaW4gJChjaGVja19QUk9HUkFNUyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJChNQUtFKSBtZW1jaGVjay0kJHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgIGRvbmUKKworbGVha2NoZWNrOiAkKGNoZWNrX1BST0dSQU1TKQorCUBmb3IgeCBpbiAkKGNoZWNrX1BST0dSQU1TKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAkKE1BS0UpIGxlYWtjaGVjay0kJHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvbmUKKworbWVtY2hlY2stJTogJQorCUBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7ICAgICAgICAgICAgICAgXAorCWVjaG8gIk1FTUNIRUNLOiAkPCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWVjaG8gIkFSR1M6ICR7VkFMR1JJTkRfT1BUU30gJHtWQUxHUklORF9NRU1fT1BUU30gJHskPF9WQUxHUklORF9NRU1fT1BUU30iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJJChMSUJUT09MKSAtLW1vZGU9ZXhlY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICB2YWxncmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICR7VkFMR1JJTkRfT1BUU30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICR7VkFMR1JJTkRfTUVNX09QVFN9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICR7JDxfVkFMR1JJTkRfTUVNX09QVFN9IC4vJDwKKworbGVha2NoZWNrLSU6ICUKKwlAZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOyAgICAgICAgICAgICAgXAorCWVjaG8gIkxFQUtDSEVDSzogJDwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWNobyAiQVJHUzogJHtWQUxHUklORF9PUFRTfSAke1ZBTEdSSU5EX0xFQUtfT1BUU30gJHskPF9WQUxHUklORF9MRUFLX09QVFN9IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUdfU0xJQ0U9YWx3YXlzLW1hbGxvYyAkKExJQlRPT0wpIC0tbW9kZT1leGVjdXRlICAgICAgICAgICAgICAgICBcCisJICB2YWxncmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJHtWQUxHUklORF9PUFRTfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAke1ZBTEdSSU5EX0xFQUtfT1BUU30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICR7JDxfVkFMR1JJTkRfTEVBS19PUFRTfSAgLi8kPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY19nbGliLyogZ2VuLWNwcC8qCisKK0NMRUFORklMRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKi5iYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICouYmJnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqLmRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKi5nY25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICouZ2NkYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqLmdjb3YKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgQ29udGFpbmVyVGVzdC50aHJpZnQKKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L2dsaWIuc3VwcHJlc3MgYi9saWIvY19nbGliL3Rlc3QvZ2xpYi5zdXBwcmVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBlOWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L2dsaWIuc3VwcHJlc3MKQEAgLTAsMCArMSw2NCBAQAoreworICAgZ190eXBlX2luaXRfMQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgLi4uCisgICBmdW46Z190eXBlX2luaXRfd2l0aF9kZWJ1Z19mbGFncworfQorCit7CisgICBnX3R5cGVfaW5pdF8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICAuLi4KKyAgIGZ1bjpnX3R5cGVfaW5pdF93aXRoX2RlYnVnX2ZsYWdzCit9CisKK3sKKyAgIGdfdHlwZV9pbml0XzMKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpyZWFsbG9jCisgICAuLi4KKyAgIGZ1bjpnX3R5cGVfaW5pdF93aXRoX2RlYnVnX2ZsYWdzCit9CisKK3sKKyAgIGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOnJlYWxsb2MKKyAgIC4uLgorICAgZnVuOmdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMKK30KKworeworICAgZ190eXBlX3JlZ2lzdGVyX3N0YXR1Y18yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46cmVhbGxvYworICAgZnVuOmdfcmVhbGxvYworICAgLi4uCisgICBmdW46Z190eXBlX3JlZ2lzdGVyX3N0YXRpYworfQorCit7CisgICB0eXBlX2NsYXNzX2luaXRfV20xCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46Z19tYWxsb2MwCisgICBmdW46dHlwZV9jbGFzc19pbml0X1dtCisgICBmdW46Z190eXBlX2NsYXNzX3JlZgorICAgLi4uCisgICBmdW46Z19vYmplY3RfbmV3dgorfQorCit7CisgICB0eXBlX2NsYXNzX2luaXRfV20yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46Z19tYWxsb2MwCisgICBmdW46dHlwZV9jbGFzc19pbml0X1dtCisgICBmdW46Z190eXBlX2NsYXNzX3JlZgorICAgLi4uCisgICBmdW46dHlwZV9jbGFzc19pbml0X1dtCit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUzOWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnaW50MzIgdHlwZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5URVJOQUxfRVJST1I7CisgIGdjaGFyICptZXNzYWdlID0gIkV4Y2VwdGlvbiBtZXNzYWdlIjsKKyAgZ2ludDMyIHJldHJpZXZlZF90eXBlID0gMDsKKyAgZ2NoYXIgKnJldHJpZXZlZF9tZXNzYWdlID0gTlVMTDsKKworICAvKiBBIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIGhhcyAidHlwZSIgYW5kICJtZXNzYWdlIiBwcm9wZXJ0aWVzIHRoYXQgY2FuCisgICAgIGJlIGluaXRpYWxpemVkIGF0IG9iamVjdCBjcmVhdGlvbiAqLworICB4Y2VwdGlvbiA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoeGNlcHRpb24gIT0gTlVMTCk7CisKKyAgLyogQSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbidzIHByb3BlcnRpZXMgY2FuIGJlIHJldHJpZXZlZCAqLworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgJnJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJnJldHJpZXZlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChyZXRyaWV2ZWRfdHlwZSA9PSB0eXBlKTsKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF9tZXNzYWdlICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKHJldHJpZXZlZF9tZXNzYWdlLCA9PSwgbWVzc2FnZSk7CisKKyAgZ19mcmVlIChyZXRyaWV2ZWRfbWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Byb3BlcnRpZXNfdGVzdCAodm9pZCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gTlVMTDsKKyAgZ2ludDMyIHJldHJpZXZlZF90eXBlOworCisgIHhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisjZGVmaW5lIFRFU1RfVFlQRV9WQUxVRShfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXRyaWV2ZWRfdHlwZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgInR5cGUiLCBfdHlwZSwgTlVMTCk7ICAgICAgICAgICAgICAgICBcCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJ0eXBlIiwgJnJldHJpZXZlZF90eXBlLCBOVUxMKTsgICAgICAgXAorICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCA9PSwgX3R5cGUpOworCisgIC8qIFRoZSAidHlwZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBhbnkgdmFsaWQgVGhyaWZ0IGV4Y2VwdGlvbiB0eXBlICovCisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9EKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0JBRF9TRVFVRU5DRV9JRCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9NSVNTSU5HX1JFU1VMVCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUik7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9QUk9UT0NPTF9FUlJPUik7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1RSQU5TRk9STSk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1BST1RPQ09MKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFKTsKKworLyogImdfdGVzdF9leHBlY3RfbWVzc2FnZSIgaXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXJ0eSByYW5nZSB0ZXN0cyBiZWxvdyBidXQgaXMKKyAgIG5vdCBwcmVzZW50IGluIEdMaWIgYmVmb3JlIHZlcnNpb24gMi4zNCAqLworI2lmIChHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM0LCAwKSkKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAidHlwZSIsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBUaGUgInR5cGUiIHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSB0b28gbG93IChsZXNzIHRoYW4gemVybykgKi8KKyAgZ190ZXN0X2V4cGVjdF9tZXNzYWdlICgiR0xpYi1HT2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHX0xPR19MRVZFTF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSpvdXQgb2YgcmFuZ2UqdHlwZSoiKTsKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAtMSwgTlVMTCk7CisgIGdfdGVzdF9hc3NlcnRfZXhwZWN0ZWRfbWVzc2FnZXMgKCk7CisKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCAhPSwgLTEpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTik7CisKKyAgLyogVGhlICJ0eXBlIiBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIGEgdmFsdWUgdG9vIGhpZ2ggKGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgaGlnaGVzdCBkZWZpbmVkIGV4Y2VwdGlvbi10eXBlIHZhbHVlKSAqLworICBnX3Rlc3RfZXhwZWN0X21lc3NhZ2UgKCJHTGliLUdPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdfTE9HX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlKm91dCBvZiByYW5nZSp0eXBlKiIpOworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTiwgTlVMTCk7CisgIGdfdGVzdF9hc3NlcnRfZXhwZWN0ZWRfbWVzc2FnZXMgKCk7CisKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCAhPSwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICA9PSwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04pOworI2VuZGlmCisKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvcGVydGllc19tZXNzYWdlICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnY2hhciAqbWVzc2FnZSA9ICJFeGNlcHRpb24gbWVzc2FnZSI7CisgIGdjaGFyICpyZXRyaWV2ZWRfbWVzc2FnZTsKKworICB4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsKKworICAvKiBUaGUgIm1lc3NhZ2UiIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsICZyZXRyaWV2ZWRfbWVzc2FnZSwgTlVMTCk7CisgIGdfYXNzZXJ0IChyZXRyaWV2ZWRfbWVzc2FnZSA9PSBOVUxMKTsKKworICAvKiBUaGUgIm1lc3NhZ2UiIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gYSB2YWxpZCBzdHJpbmcgKi8KKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCBtZXNzYWdlLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCAmcmV0cmlldmVkX21lc3NhZ2UsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHN0cmNtcCAocmV0cmlldmVkX21lc3NhZ2UsIG1lc3NhZ2UpLCA9PSwgMCk7CisKKyAgZ19mcmVlIChyZXRyaWV2ZWRfbWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9DcmVhdGVBbmREZXN0cm95IiwKKyAgICB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YXBwbGljYXRpb25leGNlcHRpb24vSW5pdGlhbGl6ZSIsCisgICAgdGVzdF9pbml0aWFsaXplKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Qcm9wZXJ0aWVzL3Rlc3QiLAorICAgIHRlc3RfcHJvcGVydGllc190ZXN0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Qcm9wZXJ0aWVzL21lc3NhZ2UiLAorICAgIHRlc3RfcHJvcGVydGllc19tZXNzYWdlKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNGY0ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCkBAIC0wLDAgKzEsODU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmZGVmIF9fR0xJQkNfXworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fTk9fU1RSSU5HX0lOTElORVMgMQorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKworI2RlZmluZSBURVNUX0JPT0wgVFJVRQorI2RlZmluZSBURVNUX0JZVEUgMTIzCisjZGVmaW5lIFRFU1RfSTE2IDEyMzQ1CisjZGVmaW5lIFRFU1RfSTMyIDEyMzQ1Njc4OTAKKyNkZWZpbmUgVEVTVF9JNjQgR19HSU5UNjRfQ09OU1RBTlQgKDEyMzQ1Njc4OTAxMjM0NSkKKyNkZWZpbmUgVEVTVF9ET1VCTEUgMTIzNDU2Nzg5MC4xMjMKKyNkZWZpbmUgVEVTVF9TVFJJTkcgInRoaXMgaXMgYSB0ZXN0IHN0cmluZyAxMjM0NTY3ODkwIUAjJCVeJiooKSIKKyNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CitnaW50MzIKK215X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGlmICh0cmFuc3BvcnRfcmVhZF9jb3VudCAhPSB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPT0gMCkKKyAgeworICAgIHRyYW5zcG9ydF9yZWFkX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CitnYm9vbGVhbgorbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF93cml0ZV9jb3VudCAhPSB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQKKyAgICAgICYmIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyIKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBjcmVhdGUgYW4gb2JqZWN0IGFuZCB0aGVuIGRlc3Ryb3kgaXQgKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5pdGlhbGl6ZSh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTb2NrZXQgKnRlbXAgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhIFRocmlmdFRyYW5zcG9ydCAqLworICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVByb3RvY29sIHVzaW5nIHRoZSBUcmFuc3BvcnQgKi8KKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAvKiBmZXRjaCB0aGUgcHJvcGVydGllcyAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKHByb3RvY29sKSwgInRyYW5zcG9ydCIsICZ0ZW1wLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRlbXApOworCisgIC8qIGNsZWFuIHVwIG1lbW9yeSAqLworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXModm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLworICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKworICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgYmluYXJ5IHBhcnRpYWwgZmFpbHVyZSAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLworICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHRlc3Qgc3RydWN0dXJlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlX2ZpZWxkX3N0b3AgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHdyaXRlIGEgbWFwICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworCisgICAgLyogdGVzdCAzcmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworCisgICAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGxpc3QgKi8KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgKi8KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IHNldCBvcGVyYXRpb24gcyovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogaW52YWxpZCB2ZXJzaW9uICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CisKKyAgICAvKiBzeiA+IDAgZm9yIGEgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDEsIE5VTEwpID4gMCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCk7CisKKyAgICAvKiBicm9rZW4gMm5kIHJlYWQgKi8KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDB4ODAwMTAwMDAsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiAzcmQgcmVhZCAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID4gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogc2VuZCBicm9rZW4gd3JpdGVzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAzOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgYmluYXJ5IHByb3RvY29sICovCisgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGIpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YnAgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0YnApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYnl0ZSwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IHBhcnRpYWwgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRicCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdjaGFyICpzdHJ1Y3RfbmFtZSA9IE5VTEw7CisgIGdjaGFyICpmaWVsZF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1lc3NhZ2VfbmFtZSA9IE5VTEw7CisgIFRocmlmdFR5cGUgZWxlbWVudF90eXBlLCBrZXlfdHlwZSwgdmFsdWVfdHlwZSwgZmllbGRfdHlwZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBnaW50OCB2YWx1ZSA9IDA7CisgIGdpbnQxNiBmaWVsZF9pZCA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQzMiBzZXFpZCA9IDA7CisgIGdpbnQzMiB2ZXJzaW9uID0gMDsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CisKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZzdHJ1Y3RfbmFtZSwgTlVMTCk7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpcnN0IHJlYWQgZXJyb3Igb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IGZpZWxkIHN0b3AgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKTsKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAzcmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgM3JkIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworCisgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbGlzdCBzaXplIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBzZXQgb3BlcmF0aW9ucyAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIGJyb2tlbiByZWFkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiBpbnZhbGlkIHByb3RvY29sIHZlcnNpb24gKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogc3ogPiAwICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKworICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICAvKiBicm9rZW4gMm5kIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOyAvKiByZWFkX3N0cmluZyBkb2VzIHR3byByZWFkcyAqLworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZlcnNpb24sIE5VTEwpOworCisgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2ZXJzaW9uLCBOVUxMKTsKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICAvKiBUT0RPOiBpbnZlc3RpZ2F0ZSBnX29iamVjdF91bnJlZiAodGJwKTsgKi8KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGJwID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0YnApOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL0luaXRpYWxpemUiLCB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZVByaW1pdGl2ZXMiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZUNvbXBsZXhUeXBlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlTWFueUZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAxODA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KKworI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMiCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOworCisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIGd1aW50IHJfYnVmX3NpemUgPSAwOworICBndWludCB3X2J1Zl9zaXplID0gMDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAorCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCS8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CisKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCisJLyogd3JpdGUgMSBieXRlIGF0IGEgdGltZSAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCisJLyogb3ZlcmZsb3cgdGhlIGJ1ZmZlciAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAyLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworCS8qIHdyaXRlIDEgYnl0ZSBhbmQgZmx1c2ggKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgd2l0aCAyIHN5c3RlbSBjYWxscyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMywgTlVMTCk7CisKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7CisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworCisgIC8qIHJlYWQgMSBieXRlICovCisgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CisKKyAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA2LCBOVUxMKTsKKyAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAyLCBOVUxMKTsKKyAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKworICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF93cml0ZV9mYWlsKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk4OworICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworICAvKiBTSUdQSVBFIHdoZW4gc2VuZCB0byBkaXNjb25uZWN0ZWQgc29ja2V0ICovCisgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworCisgICAgICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCQkgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KKyAgICAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKwkJCSAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAgICAgLyoganVzdCBjbG9zZSBzb2NrZXQgKi8KKyAgICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCisKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisJLyogcmVjb2duaXplIGRpc2Nvbm5lY3Rpb24gKi8KKwlzbGVlcCgxKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOworCisJLyogd3JpdGUgMSBhbmQgZmx1c2ggKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvV3JpdGVGYWlsIiwgdGVzdF93cml0ZV9mYWlsKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVhZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKKyAgICAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX18KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCisjZGVmaW5lIFRFU1RfQllURSAxMjMKKyNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKKyNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAorI2RlZmluZSBURVNUX0k2NCAxMjM0NTY3ODkwMTIzNDUKKyNkZWZpbmUgVEVTVF9OSTE2ICgtMTIzNDUpCisjZGVmaW5lIFRFU1RfTkkzMiAoLTEyMzQ1Njc4OTApCisjZGVmaW5lIFRFU1RfTkk2NCAoLTEyMzQ1Njc4OTAxMjM0NSkKKyNkZWZpbmUgVEVTVF9ET1VCTEUgMTIzNDU2Nzg5MC4xMjMKKyNkZWZpbmUgVEVTVF9TVFJJTkcgInRoaXMgaXMgYSB0ZXN0IHN0cmluZyAxMjM0NTY3ODkwIUAjJCVeJiooKSIKKyNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CitnaW50MzIKK215X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGlmICh0cmFuc3BvcnRfcmVhZF9jb3VudCAhPSB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPT0gMCkKKyAgeworICAgIHRyYW5zcG9ydF9yZWFkX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CitnYm9vbGVhbgorbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF93cml0ZV9jb3VudCAhPSB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQKKyAgICAgICYmIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMiCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfd3JpdGUKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KTsKKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5pdGlhbGl6ZSAodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNvY2tldCAqdGVtcCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgLyogY3JlYXRlIGEgVGhyaWZ0Q29tcGFjdFByb3RvY29sIHVzaW5nIHRoZSBUcmFuc3BvcnQgKi8KKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodGVtcCk7CisKKyAgLyogY2xlYW4gdXAgbWVtb3J5ICovCisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKworICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBiaW5hcnkgcGFydGlhbCBmYWlsdXJlICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHRlc3Qgc3RydWN0dXJlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwgMSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsIE5VTEwpID09IDEpOworCisgICAgLyogdGVzdCBmaWVsZHMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAgIC8qIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiBubyBkZWx0YXMgKi8KKyAgICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHdyaXRlIGEgbWFwICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIHNtYWxsIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0LS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBiaWcgbGlzdCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweGYwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIC0xMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgc21hbGwgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IHNldCBvcGVyYXRpb24gcyovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CisKKyAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKSA+IDApOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKKworICAgIC8qIGJyb2tlbiAybmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gM3JkIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gNHRoIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIDEsIE5VTEwpOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGNvbXBhY3QgcHJvdG9jb2wgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRjKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMCwKKyAgICB6aWd6YWdfcDE2ID0gMCwgemlnemFnX3AzMiA9IDAsIHppZ3phZ19wNjQgPSAwLAorICAgIHppZ3phZ19uMTYgPSAwLCB6aWd6YWdfbjMyID0gMCwgemlnemFnX242NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV9uMTYgPSAwOworICBnaW50MzIgdmFsdWVfbjMyID0gMDsKKyAgZ2ludDY0IHZhbHVlX242NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24xNiA9PSBURVNUX05JMTYpOworICBnX2Fzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uNjQgPT0gVEVTVF9OSTY0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMTYgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3A2NCA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMTYgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX242NCA9PSAzKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfbjE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgcGFydGlhbCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGMpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnY2hhciAqc3RydWN0X25hbWUgPSBOVUxMOworICBnY2hhciAqZmllbGRfbmFtZSA9IE5VTEw7CisgIGdjaGFyICptZXNzYWdlX25hbWUgPSBOVUxMOworICBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwga2V5X3R5cGUsIHZhbHVlX3R5cGUsIGZpZWxkX3R5cGU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnaW50OCB2YWx1ZSA9IDA7CisgIGdpbnQxNiBmaWVsZF9pZCA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQzMiBzZXFpZCA9IDA7CisgIGdpbnQ4IHZlcnNpb25fYW5kX3R5cGUgPSAwOworICBnaW50OCBwcm90b2NvbF9pZCA9IDA7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisKKyAgLyogdGVzdCBzdHJ1Y3Qgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJnN0cnVjdF9uYW1lLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gZGVsdGFzICovCisKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTUpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDMwKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nyk7CisgIGZpZWxkX2lkID0gMDsKKworICAvKiB0ZXN0IGZpZWxkIG9wZXJhdGlvbnMgKi8KKworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gc3RydWN0cyAqLworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTYpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9uYW1lLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAyNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGJvb2xzICovCisKKyAgLyogZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIG5vIGRlbHRhcyAqLworICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgZmllbGQgc3RvcCAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisKKyAgLyogdGVzdCBtYXAgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBtYXAtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBzaWRlICovCisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisKKyAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDJuZCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbGlzdCBzaXplIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogdGVzdCBzbWFsbCBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3Qgd3JpdGUgZmFpbHVyZS0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IHNldCBvcGVyYXRpb25zICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiBicm9rZW4gcmVhZCAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworCisgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogYnJva2VuIDR0aCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKworICAvKiBoYW5kbGUgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKworICAvKiBoYW5kbGUgNHRoIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAodGMsICZzZXFpZCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0Y3AgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0Y3AgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Y3ApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGNwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9Jbml0aWFsaXplIiwgdGVzdF9pbml0aWFsaXplKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNTFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jCkBAIC0wLDAgKzEsNTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lIFRFU1RfU0VSVkVSX0hPU1ROQU1FICJsb2NhbGhvc3QiCisjZGVmaW5lIFRFU1RfU0VSVkVSX1BPUlQgICAgIDkwOTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoZSBDb250YWluZXJTZXJ2aWNlIGhhbmRsZXIgd2UnbGwgdXNlIGZvciB0ZXN0aW5nICovCisKK0dfQkVHSU5fREVDTFMKKworR1R5cGUgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiBcCisgICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIpKQorI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIElTX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIpKQorI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorCitzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgcGFyZW50X2luc3RhbmNlOworCisgIC8qIHByaXZhdGUgKi8KKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlcjsKKworc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyB7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzCisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzOworCitHX0VORF9ERUNMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitHX0RFRklORV9UWVBFIChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIsCisgICAgICAgICAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXIsCisgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKQorCisvKiBBIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGFwcGVuZCBjb3BpZXMgb2Ygc3RyaW5ncyB0byBhIHN0cmluZyBsaXN0ICovCitzdGF0aWMgdm9pZCBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSAoZ3BvaW50ZXIgZWxlbWVudCwgZ3BvaW50ZXIgcHRyX2FycmF5KQoreworICBnX3B0cl9hcnJheV9hZGQgKChHUHRyQXJyYXkgKilwdHJfYXJyYXksIGdfc3RyZHVwICgoZ2NoYXIgKillbGVtZW50KSk7Cit9CisKKy8qIEFjY2VwdCBhIHN0cmluZyBsaXN0IGZyb20gdGhlIGNsaWVudCBhbmQgYXBwZW5kIGl0cyBjb250ZW50cyB0byBvdXIgaW50ZXJuYWwKKyAgIGxpc3QgKi8KK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JlY2VpdmVfc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHUHRyQXJyYXkgKnN0cmluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworCisgIC8qIEFwcGVuZCB0aGUgY2xpZW50J3Mgc3RyaW5ncyB0byBvdXIgb3duIGludGVybmFsIHN0cmluZyBsaXN0ICovCisgIGdfcHRyX2FycmF5X2ZvcmVhY2ggKChHUHRyQXJyYXkgKilzdHJpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyaW5nX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2Ygb3VyIGludGVybmFsIHN0cmluZyBsaXN0IHRvIHRoZSBjbGllbnQgKi8KK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1B0ckFycmF5ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBSZXR1cm4gKGNvcGllcyBvZikgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIG91ciBsaXN0ICovCisgIGdfcHRyX2FycmF5X2ZvcmVhY2ggKHNlbGYtPnN0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgKl9yZXR1cm4pOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9saXN0X3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQdHJBcnJheSAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKyAgR1B0ckFycmF5ICpuZXN0ZWRfbGlzdDsKKworICAvKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgb3VyIGxpc3Qgb2Ygc3RyaW5ncyAqLworICBuZXN0ZWRfbGlzdAorICAgID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKG5lc3RlZF9saXN0LCBzZWxmLT5zdHJpbmdfbGlzdCk7CisgIGdfcHRyX2FycmF5X3JlZiAoc2VsZi0+c3RyaW5nX2xpc3QpOworCisgIGdfcHRyX2FycmF5X2FkZCAoKl9yZXR1cm4sIG5lc3RlZF9saXN0KTsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdExpc3RTdHJpbmdMaXN0ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworICBUVGVzdFN0cmluZ0xpc3QgKm5lc3RlZF9saXN0OworCisgIC8qIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBvdXIgbGlzdCBvZiBzdHJpbmdzICovCisgIG5lc3RlZF9saXN0CisgICAgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAobmVzdGVkX2xpc3QsIHNlbGYtPnN0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfcmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19wdHJfYXJyYXlfYWRkICgqX3JldHVybiwgbmVzdGVkX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkgeworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKG9iamVjdCk7CisKKyAgLyogRGVzdHJveSBvdXIgaW50ZXJuYWwgY29udGFpbmVycyAqLworICBnX3B0cl9hcnJheV91bnJlZiAoc2VsZi0+c3RyaW5nX2xpc3QpOworICBzZWxmLT5zdHJpbmdfbGlzdCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9wYXJlbnRfY2xhc3MpLT4KKyAgICBmaW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9pbml0IChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYpCit7CisgIC8qIENyZWF0ZSBvdXIgaW50ZXJuYWwgY29udGFpbmVycyAqLworICBzZWxmLT5zdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19mcmVlKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyAqcGFyZW50X2NsYXNzID0KKyAgICBUX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2ZpbmFsaXplOworCisgIHBhcmVudF9jbGFzcy0+cmVjZWl2ZV9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JlY2VpdmVfc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3N0cmluZ19saXN0OworICBwYXJlbnRfY2xhc3MtPnJldHVybl9saXN0X3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogT3VyIHRlc3Qgc2VydmVyLCBkZWNsYXJlZCBnbG9iYWxseSBzbyB3ZSBjYW4gYWNjZXNzIGl0IHdpdGhpbiBhIHNpZ25hbAorICAgaGFuZGxlciAqLworVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCisvKiBBIHNpZ25hbCBoYW5kbGVyIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgKHRoZSB0ZXN0IHN1aXRlKSBoYXMKKyAgIGV4aXRlZCBzbyB3ZSBrbm93IHRvIHNodXQgZG93biB0aGUgc2VydmVyIGFuZCB0ZXJtaW5hdGUgb3Vyc2VsdmVzICovCitzdGF0aWMgdm9pZAorc2lnY2hsZF9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIFRoZSBjaGlsZCBwcm9jZXNzICh0aGUgdGVzdHMpIGhhcyBleGl0ZWQgb3IgYmVlbiB0ZXJtaW5hdGVkOyBzaHV0IGRvd24gdGhlCisgICAgIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIGlmIChzZXJ2ZXIgIT0gTlVMTCkKKyAgICB0aHJpZnRfc2VydmVyX3N0b3AgKHNlcnZlcik7Cit9CisKKy8qIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSB0ZXN0IGNhc2UgYWdhaW5zdCBhIG5ld2x5IGNvbnN0cnVjdGVkCisgICBzZXJ2aWNlIGNsaWVudCAqLworc3RhdGljIHZvaWQKK2V4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudCAodm9pZCAoKnRlc3RfY2FzZSkoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqKSkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQ7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2w7CisKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudDsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICAvKiBDcmVhdGUgYSBjbGllbnQgd2l0aCB3aGljaCB0byBhY2Nlc3MgdGhlIHNlcnZlciAqLworICBzb2NrZXQgICAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBURVNUX1NFUlZFUl9IT1NUTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICBURVNUX1NFUlZFUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBwcm90b2NvbCAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQ09OVEFJTkVSX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogRXhlY3V0ZSB0aGUgdGVzdCBhZ2FpbnN0IHRoaXMgY2xpZW50ICovCisgICgqdGVzdF9jYXNlKShjbGllbnQsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJzX3dpdGhfZGVmYXVsdF92YWx1ZXMgKHZvaWQpCit7CisgIFRUZXN0Q29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzICpkZWZhdWx0X3ZhbHVlczsKKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKKworICAvKiBGZXRjaCBhIG5ldyBDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgc3RydWN0IGFuZCBpdHMgU3RyaW5nTGlzdCBtZW1iZXIgKi8KKyAgZGVmYXVsdF92YWx1ZXMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0NPTlRBSU5FUlNfV0lUSF9ERUZBVUxUX1ZBTFVFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9nZXQgKGRlZmF1bHRfdmFsdWVzLAorICAgICAgICAgICAgICAgICJTdHJpbmdMaXN0IiwgJnN0cmluZ19saXN0LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBoYXMgYmVlbiBwb3B1bGF0ZWQgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgZ19hc3NlcnRfY21waW50IChzdHJpbmdfbGlzdC0+bGVuLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilzdHJpbmdfbGlzdC0+cGRhdGEpWzBdLCA9PSwgIkFwYWNoZSIpOworICBnX2Fzc2VydF9jbXBzdHIgKCgoZ2NoYXIgKiopc3RyaW5nX2xpc3QtPnBkYXRhKVsxXSwgPT0sICJUaHJpZnQiKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoc3RyaW5nX2xpc3QpOworICBnX29iamVjdF91bnJlZiAoZGVmYXVsdF92YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdF9pbm5lciAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnY2hhciAqdGVzdF9kYXRhW10gPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OworCisgIEdQdHJBcnJheSAqb3V0Z29pbmdfc3RyaW5nX2xpc3Q7CisgIEdQdHJBcnJheSAqaW5jb21pbmdfc3RyaW5nX2xpc3Q7CisgIGd1aW50IGluZGV4OworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKworICAvKiBQcmVwYXJlIG91ciB0ZXN0IGRhdGEgKG91ciBzdHJpbmcgbGlzdCB0byBzZW5kKSAqLworICBvdXRnb2luZ19zdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXggKz0gMSkKKyAgICBnX3B0cl9hcnJheV9hZGQgKG91dGdvaW5nX3N0cmluZ19saXN0LCAmdGVzdF9kYXRhW2luZGV4XSk7CisKKyAgLyogU2VuZCBvdXIgZGF0YSB0byB0aGUgc2VydmVyIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBzYW1lIGRhdGEgYmFjayBvbgorICAgICByZXRyaWV2ZSAqLworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JlY2VpdmVfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ19zdHJpbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIGluY29taW5nX3N0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JldHVybl9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHR3byBsaXN0cyBhcmUgZXF1aXZhbGVudCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGluY29taW5nX3N0cmluZ19saXN0LT5sZW4sID09LCBvdXRnb2luZ19zdHJpbmdfbGlzdC0+bGVuKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaW5jb21pbmdfc3RyaW5nX2xpc3QtPmxlbjsgaW5kZXggKz0gMSkKKyAgICBnX2Fzc2VydF9jbXBzdHIgKCgoZ2NoYXIgKiopaW5jb21pbmdfc3RyaW5nX2xpc3QtPnBkYXRhKVtpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICA9PSwKKyAgICAgICAgICAgICAgICAgICAgICgoZ2NoYXIgKiopb3V0Z29pbmdfc3RyaW5nX2xpc3QtPnBkYXRhKVtpbmRleF0pOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIGdfcHRyX2FycmF5X3VucmVmIChpbmNvbWluZ19zdHJpbmdfbGlzdCk7CisgIGdfcHRyX2FycmF5X3VucmVmIChvdXRnb2luZ19zdHJpbmdfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0ICh2b2lkKQoreworICAgIGV4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudCAodGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdF9pbm5lcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBHUHRyQXJyYXkgKmluY29taW5nX2xpc3Q7CisgIEdQdHJBcnJheSAqbmVzdGVkX2xpc3Q7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworCisgIC8qIFJlY2VpdmUgYSBsaXN0IG9mIHN0cmluZyBsaXN0cyBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgaW5jb21pbmdfbGlzdCA9CisgICAgZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JldHVybl9saXN0X3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNvbWluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBhbmQgaXRzIGNvbnRlbnRzIGFyZSB2YWxpZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGluY29taW5nX2xpc3QtPmxlbiwgPiwgMCk7CisKKyAgbmVzdGVkX2xpc3QgPSAoR1B0ckFycmF5ICopZ19wdHJfYXJyYXlfaW5kZXggKGluY29taW5nX2xpc3QsIDApOworICBnX2Fzc2VydCAobmVzdGVkX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAobmVzdGVkX2xpc3QtPmxlbiwgPj0sIDApOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIGdfcHRyX2FycmF5X3VucmVmIChpbmNvbWluZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdCAodm9pZCkKK3sKKyAgZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0X2lubmVyIChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVFRlc3RMaXN0U3RyaW5nTGlzdCAqaW5jb21pbmdfbGlzdDsKKyAgVFRlc3RTdHJpbmdMaXN0ICpuZXN0ZWRfbGlzdDsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisKKyAgLyogUmVjZWl2ZSBhIGxpc3Qgb2Ygc3RyaW5nIGxpc3RzIGZyb20gdGhlIHNlcnZlciAqLworICBpbmNvbWluZ19saXN0ID0KKyAgICBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGFuZCBpdHMgY29udGVudHMgYXJlIHZhbGlkICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfbGlzdC0+bGVuLCA+LCAwKTsKKworICBuZXN0ZWRfbGlzdCA9IChUVGVzdFN0cmluZ0xpc3QgKilnX3B0cl9hcnJheV9pbmRleCAoaW5jb21pbmdfbGlzdCwgMCk7CisgIGdfYXNzZXJ0IChuZXN0ZWRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChuZXN0ZWRfbGlzdC0+bGVuLCA+PSwgMCk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0ICh2b2lkKQoreworICBleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQKKyAgICAodGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0X2lubmVyKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogRm9yayB0byBydW4gb3VyIHRlc3Qgc3VpdGUgaW4gYSBjaGlsZCBwcm9jZXNzICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0X2NtcGludCAocGlkLCA+PSwgMCk7CisKKyAgaWYgKHBpZCA9PSAwKSB7ICAgIC8qIFRoZSBjaGlsZCBwcm9jZXNzICovCisgICAgLyogV2FpdCBhIG1vbWVudCBmb3IgdGhlIHNlcnZlciB0byBmaW5pc2ggc3RhcnRpbmcgKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TdHJ1Y3RzL0NvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyIsCisgICAgICAgdGVzdF9jb250YWluZXJzX3dpdGhfZGVmYXVsdF92YWx1ZXMpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1N0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL0xpc3RTdHJpbmdMaXN0IiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1R5cGVkZWZkTGlzdFN0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCk7CisKKyAgICAvKiBSdW4gdGhlIHRlc3RzIGFuZCBtYWtlIHRoZSByZXN1bHQgYXZhaWxhYmxlIHRvIG91ciBwYXJlbnQgcHJvY2VzcyAqLworICAgIF9leGl0IChnX3Rlc3RfcnVuICgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpoYW5kbGVyOworICAgIFRUZXN0Q29udGFpbmVyU2VydmljZVByb2Nlc3NvciAqcHJvY2Vzc29yOworCisgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICAgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OworICAgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqcHJvdG9jb2xfZmFjdG9yeTsKKworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2lnY2hsZF9hY3Rpb247CisKKyAgICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgICBpbnQgZXhpdF9zdGF0dXMgPSAxOworCisgICAgLyogVHJhcCB0aGUgZXZlbnQgb2YgdGhlIGNoaWxkIHByb2Nlc3MgdGVybWluYXRpbmcgc28gd2Uga25vdyB0byBzdG9wIHRoZQorICAgICAgIHNlcnZlciBhbmQgZXhpdCAqLworICAgIG1lbXNldCAoJnNpZ2NobGRfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ2NobGRfYWN0aW9uKSk7CisgICAgc2lnY2hsZF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2NobGRfaGFuZGxlcjsKKyAgICBzaWdjaGxkX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgICBzaWdhY3Rpb24gKFNJR0NITEQsICZzaWdjaGxkX2FjdGlvbiwgTlVMTCk7CisKKyAgICAvKiBDcmVhdGUgb3VyIHRlc3Qgc2VydmVyICovCisgICAgaGFuZGxlciA9IGdfb2JqZWN0X25ldyAoVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9TRVJWRVJfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB0cmFuc3BvcnRfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHByb3RvY29sX2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgc2VydmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLyogU3RhcnQgdGhlIHNlcnZlciAqLworICAgIHRocmlmdF9zZXJ2ZXJfc2VydmUgKHNlcnZlciwgJmVycm9yKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgc2VydmVyIHN0b3BwZWQgb25seSBiZWNhdXNlIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYnkgdGhlCisgICAgICAgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZykgKi8KKyAgICBnX2Fzc2VydCghZXJyb3IgfHwgZ19lcnJvcl9tYXRjaGVzKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKKworICAgIC8qIEZyZWUgb3VyIHJlc291cmNlcyAqLworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb3RvY29sX2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyX3RyYW5zcG9ydCk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm9jZXNzb3IpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmaGFuZGxlcik7CisKKyAgICAvKiBXYWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJuIGl0cyBleGl0IHN0YXR1cyAqLworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGlmIChXSUZFWElURUQgKHN0YXR1cykpCisgICAgICBleGl0X3N0YXR1cyA9IFdFWElUU1RBVFVTIChzdGF0dXMpOworCisgICAgcmV0dXJuIGV4aXRfc3RhdHVzOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOWE0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwpAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NQorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIgorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2RvdWJsZXNfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgRG91YmxlcyBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ET1VCTEVTLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0RPVUJMRVMgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZG91Ymxlc19pbml0aWFsaXplICh2b2lkKQoreworICBUVGVzdERvdWJsZXMgKmRvdWJsZXMgPSBOVUxMOworICBnZG91YmxlIG5hbjsKKyAgZ2RvdWJsZSBpbmY7CisgIGdkb3VibGUgbmVnaW5mOworICBnZG91YmxlIHJlcGVhdGluZzsKKyAgZ2RvdWJsZSBiaWc7CisgIGdkb3VibGUgdGlueTsKKyAgZ2RvdWJsZSB6ZXJvOworICBnZG91YmxlIG5lZ3plcm87CisKKyAgLyogTm90ZSB0aGVyZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gZ2V0IG5vdC1hLW51bWJlciAoIk5BTiIpIHZhbHVlcyBwYXN0CisgICAgIEdPYmplY3QncyByYW5nZS1jaGVja2luZywgc28gdGhhdCBwb3J0aW9uIG9mIHRoZSB0ZXN0IGhhcyBiZWVuIGNvbW1lbnRlZAorICAgICBvdXQgYmVsb3cuICovCisKKyAgLyogQSBEb3VibGVzIHN0cnVjdHVyZSdzIG1lbWJlcnMgYXJlIGF2YWlsYWJsZSBhcyBHT2JqZWN0IHByb3BlcnRpZXMKKyAgICAgdGhhdCBjYW4gYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uLi4uICovCisgIGRvdWJsZXMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0RPVUJMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJuYW4iLCAgICAgIDAgKiBJTkZJTklUWSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluZiIsICAgICAgICAgIElORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgICAtSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRpbmciLCAgICAgMS4wIC8gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJpZyIsICAgICAgIEdfTUFYRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGlueSIsICAgICAgICAgIDEwRS0xMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIiwgICAgICAgICAgMS4wICogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ3plcm8iLCAgICAgIC0xLjAgKiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoZG91YmxlcyAhPSBOVUxMKTsKKworICAvKiAuLi5hbmQgbGF0ZXIgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAoZG91YmxlcywKKyAgICAgICAgICAgICAgICAibmFuIiwgICAgICAgJm5hbiwKKyAgICAgICAgICAgICAgICAiaW5mIiwgICAgICAgJmluZiwKKyAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgJm5lZ2luZiwKKyAgICAgICAgICAgICAgICAicmVwZWF0aW5nIiwgJnJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAiYmlnIiwgICAgICAgJmJpZywKKyAgICAgICAgICAgICAgICAidGlueSIsICAgICAgJnRpbnksCisgICAgICAgICAgICAgICAgInplcm8iLCAgICAgICZ6ZXJvLAorICAgICAgICAgICAgICAgICJuZWd6ZXJvIiwgICAmbmVnemVybywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBnX2Fzc2VydF9jbXBpbnQgKGlzbmFuIChuYW4pLCAgICAhPSwgIDApOyAqLworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChpbmYpLCAgICA9PSwgIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChuZWdpbmYpLCA9PSwgLTEpOworCisgIGdfYXNzZXJ0X2NtcGZsb2F0IChyZXBlYXRpbmcsID09LCAgICAgMS4wIC8gMyk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChiaWcsICAgICAgID09LCBHX01BWERPVUJMRSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh0aW55LCAgICAgID09LCAgICAgMTBFLTEwMSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh6ZXJvLCAgICAgID09LCAgICAgMS4wICogMCk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChuZWd6ZXJvLCAgID09LCAgICAtMS4wICogMCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGRvdWJsZXMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX2RlZmF1bHRfdmFsdWVzICh2b2lkKQoreworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2ggPSBOVUxMOworICBnaW50ICAgYV9iaXRlOworICBnaW50ICAgaW50ZWdlcjE2OworICBnaW50NjQgaW50ZWdlcjY0OworICBHQXJyYXkgKmJ5dGVfbGlzdDsKKyAgR0FycmF5ICppMTZfbGlzdDsKKyAgR0FycmF5ICppNjRfbGlzdDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY3JlYXRlZCB3aXRoIG5vIGV4cGxpY2l0IHByb3BlcnR5IHZhbHVlcworICAgICB3aWxsIGhvbGQgdGhlIGRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgLnRocmlmdCBmaWxlICovCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgJmludGVnZXI2NCwKKyAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgJmJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAmaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChhX2JpdGUsICAgID09LCAweDdmKTsKKyAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyMTYsID09LCAweDdmZmYpOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgxMDAwMDAwMDAwMCkpOworCisgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCAzKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChieXRlX2xpc3QsIGdpbnQ4LCAwKSwgPT0sIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGJ5dGVfbGlzdCwgZ2ludDgsIDEpLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoYnl0ZV9saXN0LCBnaW50OCwgMiksID09LCAzKTsKKworICBnX2Fzc2VydCAoaTE2X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoaTE2X2xpc3QtPmxlbiwgPT0sIDMpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGkxNl9saXN0LCBnaW50MTYsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTE2X2xpc3QsIGdpbnQxNiwgMSksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpMTZfbGlzdCwgZ2ludDE2LCAyKSwgPT0sIDMpOworCisgIGdfYXNzZXJ0IChpNjRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChpNjRfbGlzdC0+bGVuLCA9PSwgMyk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTY0X2xpc3QsIGdpbnQ2NCwgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpNjRfbGlzdCwgZ2ludDY0LCAxKSwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGk2NF9saXN0LCBnaW50NjQsIDIpLCA9PSwgMyk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9zcGVjaWZpZWRfdmFsdWVzICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgZ2ludDggaW5pdGlhbF9ieXRlX2xpc3RbNV0gPSB7IDEzLCAyMSwgMzQsIDU1LCA4OSB9OworICBzdGF0aWMgY29uc3QgZ2ludDE2IGluaXRpYWxfaTE2X2xpc3RbNV0gPSB7IDQxODEsIDY3NjUsIDEwOTQ2LCAxNzcxMSwgMjg2NTcgfTsKKyAgc3RhdGljIGNvbnN0IGdpbnQ2NCBpbml0aWFsX2k2NF9saXN0WzVdID0KKyAgICB7CisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTEwMDA4Nzc3ODM2NjEwMTkzMSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTc3OTk3OTQxNjAwNDcxNDE4OSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMjg4MDA2NzE5NDM3MDgxNjEyMCksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNDY2MDA0NjYxMDM3NTUzMDMwOSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNzU0MDExMzgwNDc0NjM0NjQyOSkKKyAgICB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IGluaXRpYWxfYmFzZTY0WzhdID0KKyAgICB7CisgICAgICAweDU2LCAweDQ3LCAweDY4LCAweDc5LCAweDYxLCAweDU3LCAweDVhLCAweDMwCisgICAgfTsKKworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2g7CisgIGdib29sZWFuIGltX3RydWU7CisgIGdib29sZWFuIGltX2ZhbHNlOworICBnaW50IGFfYml0ZTsKKyAgZ2ludCBpbnRlZ2VyMTY7CisgIGdpbnQgaW50ZWdlcjMyOworICBnaW50NjQgaW50ZWdlcjY0OworICBkb3VibGUgZG91YmxlX3ByZWNpc2lvbjsKKyAgZ2NoYXIgKnNvbWVfY2hhcmFjdGVyczsKKyAgZ2NoYXIgKnpvbWdfdW5pY29kZTsKKyAgZ2Jvb2xlYW4gd2hhdF93aG87CisgIEdCeXRlQXJyYXkgKmJhc2U2NDsKKyAgR0FycmF5ICpieXRlX2xpc3Q7CisgIEdBcnJheSAqaTE2X2xpc3Q7CisgIEdBcnJheSAqaTY0X2xpc3Q7CisKKyAgYmFzZTY0ID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19ieXRlX2FycmF5X2FwcGVuZCAoYmFzZTY0LCBpbml0aWFsX2Jhc2U2NCwgOCk7CisKKyAgYnl0ZV9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50OCkpOworICBnX2FycmF5X2FwcGVuZF92YWxzIChieXRlX2xpc3QsIGluaXRpYWxfYnl0ZV9saXN0LCA1KTsKKworICBpMTZfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDE2KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGkxNl9saXN0LCBpbml0aWFsX2kxNl9saXN0LCA1KTsKKworICBpNjRfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDY0KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGk2NF9saXN0LCBpbml0aWFsX2k2NF9saXN0LCA1KTsKKworICAvKiBBbGwgb2YgT25lT2ZFYWNoJ3MgcHJvcGVydGllcyBjYW4gYmUgc2V0IGF0IGNvbnN0cnVjdGlvbi4uLiAqLworICBvbmVfb2ZfZWFjaCA9CisgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJpbV9mYWxzZSIsICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgICAgICAgIDB4N2U1NywKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgMHhkZWFkYmVlZiwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDB4ZmExNWVmYWNhZGUxNWJhZCksCisgICAgICAgICAgICAgICAgICAiZG91YmxlX3ByZWNpc2lvbiIsIE1fUEksCisgICAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICJEZWJ1ZyBUSElTISIsCisgICAgICAgICAgICAgICAgICAiem9tZ191bmljb2RlIiwgICAgICJceGQ3XG5cYVx0IiwKKyAgICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgYmFzZTY0LAorICAgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICBieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgICAgICAgIGkxNl9saXN0LAorICAgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICBpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBpNjRfbGlzdCA9IE5VTEw7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgaTE2X2xpc3QgPSBOVUxMOworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBieXRlX2xpc3QgPSBOVUxMOworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJhc2U2NCk7CisgIGJhc2U2NCA9IE5VTEw7CisKKyAgLyogLi4uYW5kIGxhdGVyIHJldHJpZXZlZCAqLworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgJmltX3RydWUsCisgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICAmaW1fZmFsc2UsCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICAgICAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjMyIiwgICAgICAgICZpbnRlZ2VyMzIsCisgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICAmaW50ZWdlcjY0LAorICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgJmRvdWJsZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgInNvbWVfY2hhcmFjdGVycyIsICAmc29tZV9jaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgJnpvbWdfdW5pY29kZSwKKyAgICAgICAgICAgICAgICAid2hhdF93aG8iLCAgICAgICAgICZ3aGF0X3dobywKKyAgICAgICAgICAgICAgICAiYmFzZTY0IiwgICAgICAgICAgICZiYXNlNjQsCisgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICAmYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAgICAgICAgJmk2NF9saXN0LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChpbV90cnVlICA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGltX2ZhbHNlID09IEZBTFNFKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2U1Nyk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjMyLCA9PSwgKGdpbnQzMikweGRlYWRiZWVmKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyNjQsID09LCBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSk7CisKKyAgZ19hc3NlcnRfY21wZmxvYXQgKGRvdWJsZV9wcmVjaXNpb24sID09LCBNX1BJKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKHNvbWVfY2hhcmFjdGVycywgPT0sICJEZWJ1ZyBUSElTISIpOworICBnX2Fzc2VydF9jbXBzdHIgKHpvbWdfdW5pY29kZSwgICAgPT0sICJceGQ3XG5cYVx0Iik7CisKKyAgZ19hc3NlcnQgKHdoYXRfd2hvID09IFRSVUUpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmFzZTY0LT5sZW4sID09LCA4KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGJhc2U2NC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfYmFzZTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIHNpemVvZiAoZ3VpbnQ4KSksID09LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJ5dGVfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChieXRlX2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2J5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YgKGdpbnQ4KSksICA9PSwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChpMTZfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChpMTZfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICogc2l6ZW9mIChnaW50MTYpKSwgPT0sIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoaTY0X2xpc3QtPmxlbiwgPT0sIDUpOworICBnX2Fzc2VydF9jbXBpbnQgKG1lbWNtcCAoaTY0X2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2k2NF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIHNpemVvZiAoZ2ludDY0KSksID09LCAwKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoYnl0ZV9saXN0KTsKKyAgZ19ieXRlX2FycmF5X3VucmVmIChiYXNlNjQpOworCisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19ieXRlX2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICpieXRlX2xpc3QgPSBOVUxMOworCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgLyogT25lT2ZFYWNoJ3MgImJ5dGVfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIGVpZ2h0LWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJieXRlX2xpc3QiLCAmYnl0ZV9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoYnl0ZV9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoYnl0ZV9saXN0KSwgPT0sIHNpemVvZiAoZ2ludDgpKTsKKworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTE2X2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICppMTZfbGlzdCA9IE5VTEw7CisKKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICAvKiBPbmVPZkVhY2gncyAiaTE2X2xpc3QiIG1lbWJlciBpcyBhIGxpc3QgdGhhdCBob2xkcyBzaXh0ZWVuLWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJpMTZfbGlzdCIsICZpMTZfbGlzdCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGkxNl9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoaTE2X2xpc3QpLCA9PSwgc2l6ZW9mIChnaW50MTYpKTsKKworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pNjRfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmk2NF9saXN0ID0gTlVMTDsKKworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOworCisgIC8qIE9uZU9mRWFjaCdzICJpNjRfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIHNpeHR5LWZvdXItYml0LXdpZGUKKyAgICAgaW50ZWdlciB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImk2NF9saXN0IiwgJmk2NF9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoaTY0X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChpNjRfbGlzdCksID09LCBzaXplb2YgKGdpbnQ2NCkpOworCisgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19uZXN0aW5nX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE5lc3Rpbmcgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19ORVNUSU5HIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9ib25rICh2b2lkKQoreworICBUVGVzdE5lc3RpbmcgKm5lc3Rpbmc7CisgIFRUZXN0Qm9uayAqYm9uayA9IE5VTEw7CisgIGdpbnQgdHlwZTsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisKKyAgbmVzdGluZyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgLyogTmVzdGluZydzICJteV9ib25rIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldywgZGVmYXVsdCBCb25rIG9iamVjdAorICAgICBkdXJpbmcgY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfQk9OSyAoYm9uaykpOworCisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMCk7CisgIGdfYXNzZXJ0IChtZXNzYWdlID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgLyogSXQgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIGJvbmsgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JPTkssCisgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICJSZXBsYWNlbWVudCBCb25rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X2JvbmsiLCBib25rLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJvbmspOworICBib25rID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9ib25rIiwgJmJvbmssIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0JPTksgKGJvbmspKTsKKworICBnX29iamVjdF9nZXQgKGJvbmssCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZtZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAodHlwZSwgPT0sIDEwMCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAobWVzc2FnZSwgPT0sICJSZXBsYWNlbWVudCBCb25rIik7CisKKyAgZ19mcmVlIChtZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJvbmspOworICBib25rID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gbnVsbCAqLworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9ib25rIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG5lc3RpbmcpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9vb2UgKHZvaWQpCit7CisgIFRUZXN0TmVzdGluZyAqbmVzdGluZzsKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoID0gTlVMTDsKKyAgZ2ludCBhX2JpdGU7CisgIGdpbnQgaW50ZWdlcjE2OworCisgIG5lc3RpbmcgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX05FU1RJTkcsIE5VTEwpOworCisgIC8qIE5lc3RpbmcncyAibXlfb29lIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldywgZGVmYXVsdCBPbmVPZkVhY2gKKyAgICAgb2JqZWN0IGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfb29lIiwgJm9uZV9vZl9lYWNoLCBOVUxMKTsKKworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfT05FX09GX0VBQ0ggKG9uZV9vZl9lYWNoKSk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4N2YpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2ZmZik7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKKyAgb25lX29mX2VhY2ggPSBOVUxMOworCisgIC8qIEl0IGNhbiBiZSByZXBsYWNlZC4uLiAqLworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAweDUwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfb29lIiwgb25lX29mX2VhY2gsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfb29lIiwgJm9uZV9vZl9lYWNoLCBOVUxMKTsKKworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfT05FX09GX0VBQ0ggKG9uZV9vZl9lYWNoKSk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4NTA1MCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKKyAgb25lX29mX2VhY2ggPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBudWxsICovCisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X29vZSIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAobmVzdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBIb2x5TW9sZXkgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19IT0xZX01PTEVZIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19iaWcgKHZvaWQpCit7CisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHUHRyQXJyYXkgKmJpZyA9IE5VTEw7CisgIGdpbnQgYV9iaXRlID0gMDsKKyAgZ2ludCBpbnRlZ2VyMTYgPSAwOworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImJpZyIgbWVtYmVyIGlzIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYmlnICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGJpZy0+bGVuLCA9PSwgMCk7CisKKyAgLyogSXQgY2FuIGJlIG1vZGlmaWVkLi4uICovCisgIGdfcHRyX2FycmF5X2FkZCAoYmlnLAorICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAweDUwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChiaWctPmxlbiwgPT0sIDEpOworICBnX29iamVjdF9nZXQgKGdfcHRyX2FycmF5X2luZGV4IChiaWcsIDApLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg1MDUwKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICAvKiAuLi5yZXBsYWNlZC4uLiAqLworICBiaWcgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfb2JqZWN0X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChiaWcsCisgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4MTU0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJiaWciLCBiaWcsIE5VTEwpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmlnLT5sZW4sID09LCAxKTsKKyAgZ19vYmplY3RfZ2V0IChnX3B0cl9hcnJheV9pbmRleCAoYmlnLCAwKSwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NjQpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4MTU0MSk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYmlnIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0IChiaWcgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGhvbHlfbW9sZXkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19jb250YWluICh2b2lkKQoreworICBzdGF0aWMgZ2NoYXIgKnN0cmluZ3NbMl0gPSB7ICJBcGFjaGUiLCAiVGhyaWZ0IiB9OworCisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHSGFzaFRhYmxlICpjb250YWluID0gTlVMTDsKKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKKyAgR0xpc3QgKmtleV9saXN0OworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImNvbnRhaW4iIG1lbWJlciBpcyBpbml0aWFsaXplZCBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydCAoY29udGFpbiAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoY29udGFpbiksID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgc3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGdfcHRyX2FycmF5X2FkZCAoc3RyaW5nX2xpc3QsIHN0cmluZ3NbMF0pOworICBnX3B0cl9hcnJheV9hZGQgKHN0cmluZ19saXN0LCBzdHJpbmdzWzFdKTsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb250YWluLCBzdHJpbmdfbGlzdCwgTlVMTCk7CisgIHN0cmluZ19saXN0ID0gTlVMTDsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGNvbnRhaW4pLCA9PSwgMSk7CisKKyAga2V5X2xpc3QgPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGNvbnRhaW4pOworICBzdHJpbmdfbGlzdCA9IGdfbGlzdF9udGhfZGF0YSAoa2V5X2xpc3QsIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoc3RyaW5nX2xpc3QtPmxlbiwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBzdHIgKGdfcHRyX2FycmF5X2luZGV4IChzdHJpbmdfbGlzdCwgMCksID09LCAiQXBhY2hlIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZ19wdHJfYXJyYXlfaW5kZXggKHN0cmluZ19saXN0LCAxKSwgPT0sICJUaHJpZnQiKTsKKworICBnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICAvKiAuLi5yZXBsYWNlZC4uLiAqLworICBjb250YWluID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCBjb250YWluLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChjb250YWluKSwgPT0sIDApOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydCAoY29udGFpbiA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JvbmtzICh2b2lkKQoreworICBUVGVzdEhvbHlNb2xleSAqaG9seV9tb2xleTsKKyAgR0hhc2hUYWJsZSAqYm9ua3MgPSBOVUxMOworICBHUHRyQXJyYXkgKmJvbmtfbGlzdCA9IE5VTEw7CisgIFRUZXN0Qm9uayAqYm9uayA9IE5VTEw7CisgIGdpbnQgdHlwZTsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIEdMaXN0ICprZXlfbGlzdDsKKworICBob2x5X21vbGV5ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICAvKiBBIEhvbHlNb2xleSdzICJib25rcyIgbWVtYmVyIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmtzICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChib25rcyksID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgYm9uayA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQk9OSywKKyAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgIlNhbXBsZSBCb25rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGJvbmtfbGlzdCA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19vYmplY3RfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKGJvbmtfbGlzdCwgYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGJvbmtzLCBnX3N0cmR1cCAoIlNhbXBsZSBCb25rcyIpLCBib25rX2xpc3QpOworICBib25rX2xpc3QgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDEpOworCisgIGtleV9saXN0ID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChib25rcyk7CisgIGJvbmtfbGlzdCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGJvbmtzLCBnX2xpc3RfbnRoX2RhdGEgKGtleV9saXN0LCAwKSk7CisKKyAgZ19hc3NlcnRfY21waW50IChib25rX2xpc3QtPmxlbiwgPT0sIDEpOworCisgIGJvbmsgPSAoZ19wdHJfYXJyYXlfaW5kZXggKGJvbmtfbGlzdCwgMCkpOworICBnX29iamVjdF9nZXQgKGJvbmssCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZtZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAodHlwZSwgPT0sIDEwMCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAobWVzc2FnZSwgPT0sICJTYW1wbGUgQm9uayIpOworCisgIGJvbmsgPSBOVUxMOworICBnX2ZyZWUgKG1lc3NhZ2UpOworICBnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGJvbmtzKTsKKyAgYm9ua3MgPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGJvbmtzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX3N0cl9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCBib25rcywgTlVMTCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDApOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rcyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZW1wdHkgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdQYXJhbVNwZWMgKipwcm9wZXJ0aWVzOworICBndWludCBwcm9wZXJ0eV9jb3VudDsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQgKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9FTVBUWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAob2JqZWN0KSk7CisKKyAgLyogQW4gRW1wdHkgc3RydWN0dXJlIGhhcyBubyBtZW1iZXJzIGFuZCB0aHVzIG5vIHByb3BlcnRpZXMgKi8KKyAgcHJvcGVydGllcyA9IGdfb2JqZWN0X2NsYXNzX2xpc3RfcHJvcGVydGllcyAoR19PQkpFQ1RfR0VUX0NMQVNTIChvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfY291bnQpOworICBnX2Fzc2VydF9jbXBpbnQgKHByb3BlcnR5X2NvdW50LCA9PSwgMCk7CisgIGdfZnJlZSAocHJvcGVydGllcyk7CisKKyAgLyogQW4gRW1wdHkgc3RydWN0dXJlIGNhbiBiZSBkZXN0cm95ZWQgICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX3dyYXBwZXJfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgV3JhcHBlciBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9FTVBUWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfd3JhcHBlcl9wcm9wZXJ0aWVzX2ZvbyAodm9pZCkgeworICBUVGVzdFdyYXBwZXIgKndyYXBwZXI7CisgIFRUZXN0RW1wdHkgKmZvbzsKKworICB3cmFwcGVyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9XUkFQUEVSLCBOVUxMKTsKKworICAvKiBBIFdyYXBwZXIgc3RydWN0dXJlIGhhcyBvbmUgbWVtYmVyLCAiZm9vIiwgd2hpY2ggaXMgYW4gRW1wdHkKKyAgICAgc3RydWN0dXJlIGluaXRpYWxpemVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0ICh3cmFwcGVyLCAiZm9vIiwgJmZvbywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGZvbyAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAoZm9vKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGZvbyk7CisgIGZvbyA9IE5VTEw7CisKKyAgLyogQSBXcmFwcGVyJ3MgZm9vIHByb3BlcnR5IGNhbiBiZSByZXBsYWNlZC4uLiAqLworICBmb28gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICh3cmFwcGVyLCAiZm9vIiwgZm9vLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKHdyYXBwZXIsICJmb28iLCAmZm9vLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGZvbyAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAoZm9vKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGZvbyk7CisgIGZvbyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0ICh3cmFwcGVyLCAiZm9vIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAod3JhcHBlciwgImZvbyIsICZmb28sIE5VTEwpOworCisgIGdfYXNzZXJ0IChmb28gPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHdyYXBwZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZXJ2aWNlc19pbmhlcml0ZWQgKHZvaWQpCit7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbDsKKyAgVFRlc3RJbmhlcml0ZWRDbGllbnQgKmluaGVyaXRlZF9jbGllbnQ7CisgIEdPYmplY3QgKmlucHV0X3Byb3RvY29sLCAqb3V0cHV0X3Byb3RvY29sOworCisgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIE5VTEwpOworICBpbmhlcml0ZWRfY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbmhlcml0cyBmcm9tIFRUZXN0U3J2Q2xpZW50ICovCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0NMSUVOVCkpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGltcGxlbWVudHMgVFRlc3RTcnZDbGllbnQncyBpbnRlcmZhY2UgKi8KKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfSUYpKTsKKworICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCdzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYW5kIHJldHJpZXZlZCAqLworICBnX29iamVjdF9zZXQgKGluaGVyaXRlZF9jbGllbnQsCisgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfb2JqZWN0X2dldCAoaW5oZXJpdGVkX2NsaWVudCwKKyAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAmaW5wdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsICZvdXRwdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGlucHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisgIGdfYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKworICBnX29iamVjdF91bnJlZiAob3V0cHV0X3Byb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKGlucHV0X3Byb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKGluaGVyaXRlZF9jbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Eb3VibGVzL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfZG91Ymxlc19jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvRG91Ymxlcy9Jbml0aWFsaXplIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2RvdWJsZXNfaW5pdGlhbGl6ZSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvSW5pdGlhbGl6ZS9EZWZhdWx0VmFsdWVzIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfZGVmYXVsdF92YWx1ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL0luaXRpYWxpemUvU3BlY2lmaWVkVmFsdWVzIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfc3BlY2lmaWVkX3ZhbHVlcyk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9ieXRlX2xpc3QiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19ieXRlX2xpc3QpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL1Byb3BlcnRpZXMvaTE2X2xpc3QiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pMTZfbGlzdCk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9pNjRfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2k2NF9saXN0KTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX25lc3RpbmdfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL05lc3RpbmcvUHJvcGVydGllcy9teV9ib25rIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9ib25rKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL05lc3RpbmcvUHJvcGVydGllcy9teV9vb2UiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X29vZSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9Qcm9wZXJ0aWVzL2JpZyIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYmlnKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9Qcm9wZXJ0aWVzL2NvbnRhaW4iLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2NvbnRhaW4pOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvYm9ua3MiLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JvbmtzKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvRW1wdHkiLAorICAgICB0ZXN0X3N0cnVjdHNfZW1wdHkpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9XcmFwcGVyL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfd3JhcHBlcl9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvV3JhcHBlci9Qcm9wZXJ0aWVzL2ZvbyIsCisgICAgIHRlc3Rfc3RydWN0c193cmFwcGVyX3Byb3BlcnRpZXNfZm9vKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1NlcnZpY2VzL0luaGVyaXRlZCIsCisgICAgIHRlc3Rfc2VydmljZXNfaW5oZXJpdGVkKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZWE4OWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworc3RhdGljIGNvbnN0IGdjaGFyIFRFU1RfREFUQVsxMl0gPSAiYWJjZGUwMTIzNCEiOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsICJmZCIsIC0xLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlICh2b2lkKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmtsYXNzOworICBHRXJyb3IgKmVycm9yOworICBnaW50IGZkOworICBnY2hhciAqZmlsZW5hbWU7CisKKyAgZXJyb3IgPSBOVUxMOworICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZmQgPSBnX2ZpbGVfb3Blbl90bXAgKE5VTEwsICZmaWxlbmFtZSwgJmVycm9yKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICAvKiBvcGVuIGlzIG5vLW9wICovCisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgLyogYWxyZWFkeSBjbG9zZWQgKi8KKyAgZ19hc3NlcnQgKGNsb3NlIChmZCkgIT0gMCk7CisgIGdfYXNzZXJ0IChlcnJubyA9PSBFQkFERik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChmaWxlbmFtZSk7CisKKyAgLyogdGVzdCBiYWQgZmQgKi8KKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIGdfYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlICh2b2lkKQoreworICBnY2hhciBvdXRfYnVmWzhdOworICBnY2hhciAqYjsKKyAgZ2ludCB3YW50LCBnb3Q7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgLyogd3JpdGUgKi8KKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPndyaXRlICh0cmFuc3BvcnQsIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMSwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+Zmx1c2ggKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIC8qIHJlYWQgKi8KKyAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgU19JUlVTUiB8IFNfSVdVU1IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIG1lbXNldChvdXRfYnVmLCAwLCA4KTsKKyAgYiA9IG91dF9idWY7CisgIHdhbnQgPSA3OworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSBrbGFzcy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSwgNykgPT0gMCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDQ7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBICsgNywgNCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogY2xlYW4gdXAgKi8KKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDA4ZTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9CisKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyIKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgZ3VpbnQgcl9idWZfc2l6ZSA9IDA7CisgIGd1aW50IHdfYnVmX3NpemUgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAorCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCS8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisKKwkvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOworCisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk5OworICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKy8qIHRlc3QgcmVhZGluZyBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIHVuZXhwZWN0ZWRseQorICAgY2xvc2VkIHRoZSBjb25uZWN0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FmdGVyX3BlZXJfY2xvc2Uodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKKyAgICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydCA9IE5VTEw7CisKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKyAgICAgIC8qIHdyYXAgdGhlIGNsaWVudCB0cmFuc3BvcnQgaW4gYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKi8KKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCSAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKSwKKwkgICAicl9idWZfc2l6ZSIsIDAsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CisKKyAgICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbGllbnQgY29ubmVjdHMgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsIE5VTEwpOworCisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKwlUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisJZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKwkJCQkiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsICAgICBwb3J0LAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCAgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDAsCisJCQkJICBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKwkvKiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyBjbG9zZWQKKyAgICAgICB0aGUgY29ubmVjdGlvbiBmYWlscyBncmFjZWZ1bGx5IHdpdGhvdXQgZ2VuZXJhdGluZyBhIGNyaXRpY2FsCisgICAgICAgd2FybmluZyBvciBzZWdtZW50YXRpb24gZmF1bHQgKi8KKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHRyYW5zcG9ydCwgYnVmLCAxMCwgJmVycik7CisJZ19hc3NlcnQgKGVyciAhPSBOVUxMKTsKKworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCisJdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCisJdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisJZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEyXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKwkJCSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAvKiByZWFkIDEwIGJ5dGVzICovCisgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNiwgTlVMTCk7CisgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDUsIE5VTEwpOworICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKworICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMiwgTlVMTCk7CisKKyAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9SZWFkQWZ0ZXJQZWVyQ2xvc2UiLCB0ZXN0X3JlYWRfYWZ0ZXJfcGVlcl9jbG9zZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZmI2OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzExXSA9ICJhYmNkZWZnaGlqIjsKKworI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIgorCisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2xhcmdlICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Zl9zaXplIiwgMTAgKiAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9kZWZhdWx0ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZiIsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBHVmFsdWUgdmFsID0gR19WQUxVRV9JTklUOworICBHQnl0ZUFycmF5ICpidWY7CisKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvd25lciIsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworCisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1BPSU5URVIpOworICBnX29iamVjdF9nZXRfcHJvcGVydHkgKG9iamVjdCwgImJ1ZiIsICZ2YWwpOworICBidWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKCZ2YWwpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIGdfYnl0ZV9hcnJheV91bnJlZiAoYnVmKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vcGVuX2FuZF9jbG9zZSAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKworICAvKiBjcmVhdGUgYSBUaHJpZnRNZW1vcnlCdWZmZXIgKi8KKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisKKyAgLyogbm8tb3BzICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworCisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgZ290LCB3YW50OworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICZlcnJvcikgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoZXJyb3IgIT0gTlVMTCk7CisgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICBlcnJvciA9IE5VTEw7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKKworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxNSwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgIGIgPSByZWFkOworICB3YW50ID0gMTA7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgZ290LCB3YW50LCBpOworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBtZW1zZXQocmVhZCwgMCwgMTApOworICAgIGIgPSByZWFkOworICAgIHdhbnQgPSAxMDsKKyAgICB3aGlsZSAod2FudCA+IDApIHsKKyAgICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgYiArPSBnb3Q7CisgICAgICB3YW50IC09IGdvdDsKKyAgICB9CisgICAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWYiLCBidWYsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBnX2Fzc2VydCAobWVtY21wIChidWYtPmRhdGEsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUxhcmdlIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5saW1pdGVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lFeHRlcm5hbCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVub3duZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVVbmxpbWl0ZWQiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVFeHRlcm5hbCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzZjMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgiCisKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMiCisKK3N0YXRpYyB2b2lkCit3cml0ZV90b19yZWFkIChUaHJpZnRTdHJ1Y3QgKncsIFRocmlmdFN0cnVjdCAqciwgR0Vycm9yICoqd3JpdGVfZXJyb3IsCisgICAgICAgICAgICAgICBHRXJyb3IgKipyZWFkX2Vycm9yKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRidWZmZXIsIE5VTEwpOworCisgIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKHcsIHByb3RvY29sLCB3cml0ZV9lcnJvcik7CisgIHRocmlmdF9zdHJ1Y3RfcmVhZCAociwgcHJvdG9jb2wsIHJlYWRfZXJyb3IpOworCisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb2xkX3NjaG9vbDEgKHZvaWQpCit7CisgIFRUZXN0T2xkU2Nob29sICpvID0gTlVMTDsKKworICBvID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTERfU0NIT09MLCBOVUxMKTsKKyAgby0+aW1faW50ID0gMTA7CisgIG8tPmltX3N0ciA9IGdfc3RyZHVwICgidGVzdCIpOworICBvLT5pbV9iaWcgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKG8tPmltX2JpZywgVFJVRSk7CisgIG8tPmltX2JpZyA9IE5VTEw7CisgIGdfZnJlZSAoby0+aW1fc3RyKTsKKyAgby0+aW1fc3RyID0gTlVMTDsKKyAgZ19vYmplY3RfdW5yZWYgKG8pOworfQorCisvKioKKyAqIFdyaXRlIHRvIHJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMKKyAqLworc3RhdGljIHZvaWQKK3Rlc3Rfc2ltcGxlICh2b2lkKQoreworICBUVGVzdFNpbXBsZSAqczEgPSBOVUxMLCAqczIgPSBOVUxMLCAqczMgPSBOVUxMOworCisgIHMxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TSU1QTEUsIE5VTEwpOworICBzMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0lNUExFLCBOVUxMKTsKKyAgczMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NJTVBMRSwgTlVMTCk7CisKKyAgLyogd3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcyAqLworICBzMS0+aW1fb3B0aW9uYWwgPSAxMDsKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczIpLCBOVUxMLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CisKKyAgczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPSBUUlVFOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChzMSksIFRIUklGVF9TVFJVQ1QgKHMzKSwgTlVMTCwgTlVMTCk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+aW1fb3B0aW9uYWwgPT0gMTApOworCisgIGdfb2JqZWN0X3VucmVmIChzMSk7CisgIGdfb2JqZWN0X3VucmVmIChzMik7Cit9CisKKy8qKgorICogV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCBkZWZhdWx0CisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RyaWNreTEgKHZvaWQpCit7CisgIFRUZXN0VHJpY2t5MSAqdDEgPSBOVUxMOworICBUVGVzdFRyaWNreTIgKnQyID0gTlVMTDsKKworICB0MSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMSwgTlVMTCk7CisgIHQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kyLCBOVUxMKTsKKworICB0Mi0+aW1fb3B0aW9uYWwgPSAxMDsKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHQxKTsKKyAgZ19vYmplY3RfdW5yZWYgKHQyKTsKK30KKworLyoqCisgKiBXcml0aW5nIGJldHdlZW4gZGVmYXVsdCBhbmQgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RyaWNreTIgKHZvaWQpCit7CisgIFRUZXN0VHJpY2t5MSAqdDEgPSBOVUxMOworICBUVGVzdFRyaWNreTMgKnQzID0gTlVMTDsKKworICB0MSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMSwgTlVMTCk7CisgIHQzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kzLCBOVUxMKTsKKworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgTlVMTCk7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKKworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKworICBnX29iamVjdF91bnJlZiAodDEpOworICBnX29iamVjdF91bnJlZiAodDMpOworfQorCisvKioKKyAqIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RyaWNreTMgKHZvaWQpCit7CisgIFRUZXN0VHJpY2t5MiAqdDIgPSBOVUxMOworICBUVGVzdFRyaWNreTMgKnQzID0gTlVMTDsKKworICB0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMiwgTlVMTCk7CisgIHQzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kzLCBOVUxMKTsKKworICB0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9IFRSVUU7CisKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsIE5VTEwpOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHQyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHQzKTsKK30KKworLyoqCisgKiBDYXRjaCBhbiBvcHRpb25hbCBub3Qgc2V0IGV4Y2VwdGlvbi4gIFRvIHF1b3RlIHRoZQorICogQysrIHRlc3QsICJNdS1odS1oYS1oYS1oYSEiCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RyaWNreTQgKHZvaWQpCit7CisgIFRUZXN0VHJpY2t5MiAqdDIgPSBOVUxMOworICBUVGVzdFRyaWNreTMgKnQzID0gTlVMTDsKKyAgR0Vycm9yICpyZWFkX2Vycm9yID0gTlVMTDsKKworICB0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMiwgTlVMTCk7CisgIHQzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kzLCBOVUxMKTsKKworICAvKiB0aHJvd3MgcHJvdG9jb2wgZXhjZXB0aW9uICovCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCAmcmVhZF9lcnJvcik7CisgIGdfYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOworICBnX2Vycm9yX2ZyZWUgKHJlYWRfZXJyb3IpOworCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKKworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Mik7CisgIGdfb2JqZWN0X3VucmVmICh0Myk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25vbl9zZXRfYmluYXJ5ICh2b2lkKQoreworICBUVGVzdEJpbmFyaWVzICpiMSA9IE5VTEw7CisgIFRUZXN0QmluYXJpZXMgKmIyID0gTlVMTDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgYjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKyAgYjIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMSksIFRIUklGVF9TVFJVQ1QgKGIyKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoYjIpLCBUSFJJRlRfU1RSVUNUIChiMSksIE5VTEwsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIC8qIE9LLiBObyBzZWdmYXVsdCAqLworCisgIGdfb2JqZWN0X3VucmVmIChiMSk7CisgIGdfb2JqZWN0X3VucmVmIChiMik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvT2xkU2Nob29sIiwgdGVzdF9vbGRfc2Nob29sMSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9TaW1wbGUiLCB0ZXN0X3NpbXBsZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kxIiwgdGVzdF90cmlja3kxKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTIiLCB0ZXN0X3RyaWNreTIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5MyIsIHRlc3RfdHJpY2t5Myk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3k0IiwgdGVzdF90cmlja3k0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL0JpbmFyeSIsIHRlc3Rfbm9uX3NldF9iaW5hcnkpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q0MTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIgorCitzdGF0aWMgdm9pZCBlbnVtX2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMTAyNCwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0VOVU1fVEVTVDsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0VOVU1fVEVTVF9TVFJVQ1QsIE5VTEwpOworICBUVGVzdEVudW1UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9FTlVNX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNDA5NiwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBzcmMgPSBUX1RFU1RfQ09NUEFDVF9URVNUOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X3JlYWRfd3JpdGVfbGVuZ3RoX3Nob3VsZF9lcXVhbCgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDIwNDgsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Qm9uayogc3JjID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOworICBUVGVzdEJvbmsqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rQ2xhc3MqIGNscyA9IFRfVEVTVF9CT05LX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHNyYyk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorICBnX3Rlc3RfaW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL1N0cnVjdFJlYWRXcml0ZUxlbmd0aFNob3VsZEVxdWFsIiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RDb25zdGFudHMiLCBzdHJ1Y3RfY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9FbnVtQ29uc3RhbnRzIiwgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSk7CisgIHJldHVybiBnX3Rlc3RfcnVuKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzZmMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisjZGVmaW5lIFRFU1RfUE9SVCA1MTE5OQorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYz4KKworLyogY3JlYXRlIGEgcnVkaW1lbnRhcnkgcHJvY2Vzc29yICovCisjZGVmaW5lIFRFU1RfUFJPQ0VTU09SX1RZUEUgKHRlc3RfcHJvY2Vzc29yX2dldF90eXBlICgpKQorCitzdHJ1Y3QgX1Rlc3RQcm9jZXNzb3IKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yIHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdFByb2Nlc3NvciBUZXN0UHJvY2Vzc29yOworCitzdHJ1Y3QgX1Rlc3RQcm9jZXNzb3JDbGFzcworeworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1Rlc3RQcm9jZXNzb3JDbGFzcyBUZXN0UHJvY2Vzc29yQ2xhc3M7CisKK0dfREVGSU5FX1RZUEUoVGVzdFByb2Nlc3NvciwgdGVzdF9wcm9jZXNzb3IsIFRIUklGVF9UWVBFX1BST0NFU1NPUikKKworZ2Jvb2xlYW4KK3Rlc3RfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb2Nlc3Nvcik7CisgIFRIUklGVF9VTlVTRURfVkFSIChpbik7CisgIFRIUklGVF9VTlVTRURfVkFSIChvdXQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvY2Vzc29yX2luaXQgKFRlc3RQcm9jZXNzb3IgKnApCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRlc3RQcm9jZXNzb3JDbGFzcyAqcHJvYykKK3sKKyAgKFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MocHJvYykpLT5wcm9jZXNzID0gdGVzdF9wcm9jZXNzb3JfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2VydmVyICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRlc3RQcm9jZXNzb3IgKnAgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzcyA9IE5VTEw7CisgIFRocmlmdFNpbXBsZVNlcnZlciAqc3MgPSBOVUxMOworCisgIHAgPSBnX29iamVjdF9uZXcgKFRFU1RfUFJPQ0VTU09SX1RZUEUsIE5VTEwpOworICB0c3MgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgVEVTVF9QT1JULCBOVUxMKTsKKyAgc3MgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsICJwcm9jZXNzb3IiLCBwLAorICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl90cmFuc3BvcnQiLCBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNzKSwgTlVMTCk7CisKKyAgLyogcnVuIHRoZSBzZXJ2ZXIgaW4gYSBjaGlsZCBwcm9jZXNzICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKFRIUklGVF9TRVJWRVIgKHNzKSktPnNlcnZlIChUSFJJRlRfU0VSVkVSIChzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICBzbGVlcCAoNSk7CisgICAga2lsbCAocGlkLCBTSUdJTlQpOworCisgICAgZ19vYmplY3RfdW5yZWYgKHNzKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNzKTsKKyAgICBnX29iamVjdF91bnJlZiAocCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOworICB9Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHNpbXBsZXNlcnZlci9TaW1wbGVTZXJ2ZXIiLCB0ZXN0X3NlcnZlcik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTIwY2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYyIKKworLyogdGVzdHMgdG8gZW5zdXJlIHdlIGNhbiBleHRlbmQgYSBUaHJpZnRTdHJ1Y3QgKi8KKworc3RydWN0IF9UaHJpZnRUZXN0U3RydWN0Cit7CisgIFRocmlmdFN0cnVjdCBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRlc3RTdHJ1Y3QgVGhyaWZ0VGVzdFN0cnVjdDsKKworc3RydWN0IF9UaHJpZnRUZXN0U3RydWN0Q2xhc3MKK3sKKyAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUZXN0U3RydWN0Q2xhc3MgVGhyaWZ0VGVzdFN0cnVjdENsYXNzOworCitHVHlwZSB0aHJpZnRfdGVzdF9zdHJ1Y3RfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFRIUklGVF9UWVBFX1RFU1RfU1RSVUNUICh0aHJpZnRfdGVzdF9zdHJ1Y3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9URVNUX1NUUlVDVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RFU1RfU1RSVUNULCBUaHJpZnRUZXN0U3RydWN0KSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfU1RSVUNUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgVGhyaWZ0VGVzdFN0cnVjdENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RFU1RfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QpKQorI2RlZmluZSBUSFJJRlRfSVNfVEVTVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RFU1RfU1RSVUNUKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QsIFRocmlmdFRlc3RTdHJ1Y3RDbGFzcykpCisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0VGVzdFN0cnVjdCwgdGhyaWZ0X3Rlc3Rfc3RydWN0LCBUSFJJRlRfVFlQRV9TVFJVQ1QpCisKK2dpbnQzMgordGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF90ZXN0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Rlc3Rfc3RydWN0X2NsYXNzX2luaXQgKFRocmlmdFRlc3RTdHJ1Y3RDbGFzcyAqY2xzKQoreworICBUaHJpZnRTdHJ1Y3RDbGFzcyAqdHNfY2xzID0gVEhSSUZUX1NUUlVDVF9DTEFTUyAoY2xzKTsKKyAgdHNfY2xzLT5yZWFkID0gdGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQ7CisgIHRzX2Nscy0+d3JpdGUgPSB0aHJpZnRfdGVzdF9zdHJ1Y3Rfd3JpdGU7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdGVzdF9zdHJ1Y3RfaW5pdCAoVGhyaWZ0VGVzdFN0cnVjdCAqcykKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplX29iamVjdCAodm9pZCkKK3sKKyAgVGhyaWZ0VGVzdFN0cnVjdCAqdCA9IE5VTEw7CisKKyAgdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QsIE5VTEwpOworICBnX2Fzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKKyAgdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CisgIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKKyAgdGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKKyAgdGhyaWZ0X3Rlc3Rfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0c3RydWN0L0luaXRpYWxpemVPYmplY3QiLCB0ZXN0X2luaXRpYWxpemVfb2JqZWN0KTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjNhOTM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCkBAIC0wLDAgKzEsMTEyIEBACisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisjaW5jbHVkZSAidF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAidGhyaWZ0X3Rlc3RfaGFuZGxlci5oIgorCitzdGF0aWMgY29uc3QgY2hhciBURVNUX0FERFJFU1NbXSA9ICJsb2NhbGhvc3QiOworc3RhdGljIGNvbnN0IGludCBURVNUX1BPUlQgPSA2NDQ0NDsKKworc3RhdGljIHZvaWQKK3Rlc3RfdGhyaWZ0X3NlcnZlciAodm9pZCkKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9QT1JULCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfaW5kaWNhdG9yIChncG9pbnRlciBkYXRhLCBHT2JqZWN0ICp3aGVyZV90aGVfb2JqZWN0X3dhcykgeworICBUSFJJRlRfVU5VU0VEX1ZBUih3aGVyZV90aGVfb2JqZWN0X3dhcyk7CisKKyAgKihnYm9vbGVhbiAqKSBkYXRhID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGhyaWZ0X2hhbmRsZXIgKHZvaWQpCit7CisgIEdFcnJvciAqZXJyb3I7CisgIEdIYXNoVGFibGUgKl9yZXR1cm47CisgIFRUZXN0SW5zYW5pdHkgKmFyZ3VtZW50OworICBnYm9vbGVhbiBpbmRpY2F0b3I7CisKKyAgVFRlc3RYdHJ1Y3QgICp4dHJ1Y3QsICAqeHRydWN0MjsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcno7CisgIFRUZXN0TnVtYmVyeiBudW1iZXJ6MjsKKyAgVFRlc3RVc2VySWQgdXNlcl9pZCwgKnVzZXJfaWRfcHRyLCAqdXNlcl9pZF9wdHIyOworICBHSGFzaFRhYmxlICp1c2VyX21hcDsKKyAgR1B0ckFycmF5ICp4dHJ1Y3RzOworCisgIGVycm9yID0gTlVMTDsKKyAgaW5kaWNhdG9yID0gRkFMU0U7CisKKyAgdXNlcl9tYXAgPSBOVUxMOworICB4dHJ1Y3RzID0gTlVMTDsKKworICBhcmd1bWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICBnX29iamVjdF9nZXQgKGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgbnVtYmVyeiA9IFRfVEVTVF9OVU1CRVJaX0ZJVkU7CisgIG51bWJlcnoyID0gVF9URVNUX05VTUJFUlpfRUlHSFQ7CisgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAqdXNlcl9pZF9wdHIgPSA1OworICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0cjIgPSA4OworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnosIHVzZXJfaWRfcHRyKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgeHRydWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHh0cnVjdDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJHb29kYnllNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0Mik7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0KTsKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgIF9yZXR1cm4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50NjRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnQ2NF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICBnX29iamVjdF93ZWFrX3JlZiAoR19PQkpFQ1QgKGFyZ3VtZW50KSwgc2V0X2luZGljYXRvciwgKGdwb2ludGVyKSAmaW5kaWNhdG9yKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5IChOVUxMLCAmX3JldHVybiwgYXJndW1lbnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBpbmRpY2F0b3IpOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoX3JldHVybik7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19vYmplY3RfdW5yZWYgKGFyZ3VtZW50KTsKKyAgZ19hc3NlcnQgKGluZGljYXRvcik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9TZXJ2ZXIiLCB0ZXN0X3RocmlmdF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9IYW5kbGVyIiwgdGVzdF90aHJpZnRfaGFuZGxlcik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTEwYzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgICh0aGF0IG1ha2VzIHNlbnNlLi4uKSAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKKyNpbmNsdWRlICJUaHJpZnRUZXN0X3R5cGVzLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKKwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpmaXhlZDsKK3VzaW5nIHN0ZDo6bWFrZV9wYWlyOwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnNldDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKyNkZWZpbmUgVEVTVF9QT1JUIDk5ODAKKworLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKK25hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CisKK2Jvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgeworICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CisgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7Cit9CisKK319CisKK2NsYXNzIFRlc3RIYW5kbGVyIDogcHVibGljIFRocmlmdFRlc3RJZiB7CisgIHB1YmxpYzoKKyAgVGVzdEhhbmRsZXIoKSB7fQorCisgIHZvaWQgdGVzdFZvaWQoKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Vm9pZCgpIiA8PCBlbmRsOworICB9CisKKyAgdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJnRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nKFwiIiA8PCB0aGluZyA8PCAiXCIpIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKKyAgYm9vbCB0ZXN0Qm9vbChjb25zdCBib29sIHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qm9vbCgiIDw8ICh0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQorICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qnl0ZSgiIDw8IChpbnQpdGhpbmcgPDwgIikiIDw8IGVuZGw7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisgIGludDMyX3QgdGVzdEkzMihjb25zdCBpbnQzMl90IHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0STMyKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgaW50NjRfdCB0ZXN0STY0KGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RJNjQoIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBkb3VibGUgdGVzdERvdWJsZShjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgICBjb3V0LnByZWNpc2lvbig2KTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3REb3VibGUoIiA8PCBmaXhlZCA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RCaW5hcnkoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCaW5hcnkoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJ1Y3Qoe1wiIiA8PCB0aGluZy5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpdGhpbmcuYnl0ZV90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmkzMl90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmk2NF90aGluZyA8PCAifSkiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgeworICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3ROZXN0KHsiIDw8IChpbnQpbmVzdC5ieXRlX3RoaW5nIDw8ICIsIHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0sICIgPDwgbmVzdC5pMzJfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOworICAgIG91dCA9IG5lc3Q7CisgIH0KKworICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNYXAoeyI7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CisgICAgfQorICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZvdXQsIGNvbnN0IG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cmluZ01hcCh7IjsKKyAgICBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbV9pdGVyICE9IHRoaW5nLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJcIiIgPDwgbV9pdGVyLT5maXJzdCA8PCAiXCIgPT4gXCIiIDw8IG1faXRlci0+c2Vjb25kIDw8ICJcIiI7CisgICAgfQorICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKKworICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTZXQoeyI7CisgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBzX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKKyAgICB9CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TGlzdCh7IjsKKyAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGxfaXRlciA9IHRoaW5nLmJlZ2luKCk7IGxfaXRlciAhPSB0aGluZy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOworICAgICAgfQorICAgICAgY291dCA8PCAqbF9pdGVyOworICAgIH0KKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBvdXQgPSB0aGluZzsKKyAgfQorCisgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEVudW0oIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsgIH0KKworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcE1hcCgiIDw8IGhlbGxvIDw8ICIpIiA8PCBlbmRsOworCisgICAgbWFwPGludDMyX3QsaW50MzJfdD4gcG9zOworICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG5lZzsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSxpKSk7CisgICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwtaSkpOworICAgIH0KKworICAgIG1hcG1hcC5pbnNlcnQobWFrZV9wYWlyKDQsIHBvcykpOworICAgIG1hcG1hcC5pbnNlcnQobWFrZV9wYWlyKC00LCBuZWcpKTsKKworICB9CisKKyAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID4gJmluc2FuZSwgY29uc3QgSW5zYW5pdHkgJmFyZ3VtZW50KSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJndW1lbnQpOworCisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0SW5zYW5pdHkoKSIgPDwgZW5kbDsKKworICAgIFh0cnVjdCBoZWxsbzsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBYdHJ1Y3QgZ29vZGJ5ZTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgSW5zYW5pdHkgY3Jhenk7CisgICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7CisgICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soZ29vZGJ5ZSk7CisKKyAgICBJbnNhbml0eSBsb29uZXk7CisgICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUpKTsKKyAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhoZWxsbyk7CisKKyAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IGZpcnN0X21hcDsKKyAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IHNlY29uZF9tYXA7CisKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUV08sIGNyYXp5KSk7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VEhSRUUsIGNyYXp5KSk7CisKKyAgICBzZWNvbmRfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6U0lYLCBsb29uZXkpKTsKKworICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDEsIGZpcnN0X21hcCkpOworICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDIsIHNlY29uZF9tYXApKTsKKworICAgIGNvdXQgPDwgInJldHVybiA9IHsiOworICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgICAgZm9yIChpX2l0ZXIgPSBpbnNhbmUuYmVnaW4oKTsgaV9pdGVyICE9IGluc2FuZS5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICAgIGNvdXQgPDwgaV9pdGVyLT5maXJzdCA8PCAiID0+IHsiOworICAgICAgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsKKyAgICAgICAgICAgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsKKyAgICAgICAgICAgKytpMl9pdGVyKSB7CisgICAgICAgIGNvdXQgPDwgaTJfaXRlci0+Zmlyc3QgPDwgIiA9PiB7IjsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CisgICAgICAgIGNvdXQgPDwgInsiOworICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7CisgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICJ9LCAiOworCisgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKKyAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CisgICAgICAgIGNvdXQgPDwgInsiOworICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7CisgICAgICAgICAgY291dCA8PCAie1wiIiA8PCB4LT5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpeC0+Ynl0ZV90aGluZyA8PCAiLCAiIDw8IHgtPmkzMl90aGluZyA8PCAiLCAiIDw8IHgtPmk2NF90aGluZyA8PCAifSwgIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICJ9IjsKKworICAgICAgICBjb3V0IDw8ICJ9LCAiOworICAgICAgfQorICAgICAgY291dCA8PCAifSwgIjsKKyAgICB9CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKworCisgIH0KKworICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QgJmhlbGxvLCBjb25zdCBpbnQ4X3QgYXJnMCwgY29uc3QgaW50MzJfdCBhcmcxLCBjb25zdCBpbnQ2NF90IGFyZzIsIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiAgJmFyZzMsIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmczKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmc0KTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmc1KTsKKworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE11bHRpKCkiIDw8IGVuZGw7CisKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IChpbnQ2NF90KWFyZzI7CisgIH0KKworICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmFyZykKKyAgICB0aHJvdyhYY2VwdGlvbiwgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24pCisgIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oIiA8PCBhcmcgPDwgIikiIDw8IGVuZGw7CisgICAgaWYgKGFyZy5jb21wYXJlKCJYY2VwdGlvbiIpID09IDApIHsKKyAgICAgIFhjZXB0aW9uIGU7CisgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CisgICAgICBlLm1lc3NhZ2UgPSBhcmc7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnLmNvbXBhcmUoIkFwcGxpY2F0aW9uRXhjZXB0aW9uIikgPT0gMCkgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gZTsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIHsKKyAgICAgIFh0cnVjdCByZXN1bHQ7CisgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCAmcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzEpIHRocm93KFhjZXB0aW9uLCBYY2VwdGlvbjIpIHsKKworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE11bHRpRXhjZXB0aW9uKCIgPDwgYXJnMCA8PCAiLCAiIDw8IGFyZzEgPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoYXJnMC5jb21wYXJlKCJYY2VwdGlvbiIpID09IDApIHsKKyAgICAgIFhjZXB0aW9uIGU7CisgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CisgICAgICBlLm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnMC5jb21wYXJlKCJYY2VwdGlvbjIiKSA9PSAwKSB7CisgICAgICBYY2VwdGlvbjIgZTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7CisgICAgY291dCA8PCAidGVzdE9uZXdheSgiIDw8IHNsZWVwRm9yIDw8ICIpOiBTbGVlcGluZy4uLiIgPDwgZW5kbDsKKyAgICBzbGVlcChzbGVlcEZvcik7CisgICAgY291dCA8PCAidGVzdE9uZXdheSgiIDw8IHNsZWVwRm9yIDw8ICIpOiBkb25lIHNsZWVwaW5nISIgPDwgZW5kbDsKKyAgfQorfTsKKworLy8gQyBDTElFTlQKK2V4dGVybiAiQyIgeworCisjdW5kZWYgVEhSSUZUX1NPQ0tFVCAvKiBmcm9tIGxpYi9jcHAgKi8KKworI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfY2xpZW50ICh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUVGVzdFRocmlmdFRlc3RDbGllbnQgKmNsaWVudCA9IE5VTEw7CisgIFRUZXN0VGhyaWZ0VGVzdElmICppZmFjZSA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2ludDggYnl0ZSA9IDA7CisgIGdpbnQxNiBpMTYgPSAwOworICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsKKyAgZ2ludDY0IGk2NCA9IDA7CisgIGRvdWJsZSBkYmwgPSAwLjA7CisgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW4sICp4dHJ1Y3Rfb3V0OworICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfaW4sICp4dHJ1Y3QyX291dDsKKyAgR0hhc2hUYWJsZSAqbWFwX2luID0gTlVMTCwgKm1hcF9vdXQgPSBOVUxMOworICBHSGFzaFRhYmxlICpzZXRfaW4gPSBOVUxMLCAqc2V0X291dCA9IE5VTEw7CisgIEdBcnJheSAqbGlzdF9pbiA9IE5VTEwsICpsaXN0X291dCA9IE5VTEw7CisgIFRUZXN0TnVtYmVyeiBlbnVtX2luLCBlbnVtX291dDsKKyAgVFRlc3RVc2VySWQgdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQ7CisgIEdIYXNoVGFibGUgKmluc2FuaXR5X2luID0gTlVMTDsKKyAgVFRlc3RYdHJ1Y3QgKnh0cnVjdDEsICp4dHJ1Y3QyOworICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQgPSBOVUxMOworICBUVGVzdFh0cnVjdCAqbXVsdGlfaW4gPSBOVUxMOworICBHSGFzaFRhYmxlICptdWx0aV9tYXBfb3V0ID0gTlVMTDsKKyAgVFRlc3RYY2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gTlVMTDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIC8vIGluaXRpYWxpemUgZ29iamVjdAorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIC8vIGNyZWF0ZSBhIEMgY2xpZW50CisgIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOworICBwcm90b2NvbCA9IChUaHJpZnRCaW5hcnlQcm90b2NvbCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgIGNsaWVudCA9IChUVGVzdFRocmlmdFRlc3RDbGllbnQgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9DTElFTlQsICJpbnB1dF9wcm90b2NvbCIsIHByb3RvY29sLCAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsIE5VTEwpOworICBpZmFjZSA9IFRfVEVTVF9USFJJRlRfVEVTVF9JRiAoY2xpZW50KTsKKworICAvLyBvcGVuIGFuZCBzZW5kCisgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCh0c29ja2V0KSwgTlVMTCk7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfdm9pZCAoaWZhY2UsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc3RyaW5nIChpZmFjZSwgJnN0cmluZywgInRlc3QxMjMiLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKHN0cmNtcCAoc3RyaW5nLCAidGVzdDEyMyIpID09IDApOworICBnX2ZyZWUgKHN0cmluZyk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfYnl0ZSAoaWZhY2UsICZieXRlLCAoZ2ludDgpIDUsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoYnl0ZSA9PSA1KTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9pMzIgKGlmYWNlLCAmaTMyLCAxMjMsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoaTMyID09IDEyMyk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfaTY0IChpZmFjZSwgJmk2NCwgMTIzNDUsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoaTY0ID09IDEyMzQ1KTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9kb3VibGUgKGlmYWNlLCAmZGJsLCA1LjYsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZGJsID09IDUuNik7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgeHRydWN0X291dCA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIHh0cnVjdF9vdXQtPmJ5dGVfdGhpbmcgPSAxOworICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X2J5dGVfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3Rfb3V0LT5pMzJfdGhpbmcgPSAxNTsKKyAgeHRydWN0X291dC0+X19pc3NldF9pMzJfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3Rfb3V0LT5pNjRfdGhpbmcgPSAxNTE7CisgIHh0cnVjdF9vdXQtPl9faXNzZXRfaTY0X3RoaW5nID0gVFJVRTsKKyAgeHRydWN0X291dC0+c3RyaW5nX3RoaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKKyAgeHRydWN0X291dC0+X19pc3NldF9zdHJpbmdfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3RfaW4gPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X3N0cnVjdCAoaWZhY2UsICZ4dHJ1Y3RfaW4sIHh0cnVjdF9vdXQsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgeHRydWN0Ml9vdXQgPSAoVFRlc3RYdHJ1Y3QyICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CisgIHh0cnVjdDJfb3V0LT5ieXRlX3RoaW5nID0gMTsKKyAgeHRydWN0Ml9vdXQtPl9faXNzZXRfYnl0ZV90aGluZyA9IFRSVUU7CisgIGlmICh4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nICE9IE5VTEwpCisgICAgZ19vYmplY3RfdW5yZWYoeHRydWN0Ml9vdXQtPnN0cnVjdF90aGluZyk7CisgIHh0cnVjdDJfb3V0LT5zdHJ1Y3RfdGhpbmcgPSB4dHJ1Y3Rfb3V0OworICB4dHJ1Y3QyX291dC0+X19pc3NldF9zdHJ1Y3RfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyX291dC0+aTMyX3RoaW5nID0gMTIzOworICB4dHJ1Y3QyX291dC0+X19pc3NldF9pMzJfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyX2luID0gKFRUZXN0WHRydWN0MiAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVDIsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9uZXN0IChpZmFjZSwgJnh0cnVjdDJfaW4sIHh0cnVjdDJfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX291dCk7CisgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX2luKTsKKyAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisKKyAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsICZpMzIsICZpMzIpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tYXAgKGlmYWNlLCAmbWFwX2luLCBtYXBfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX291dCk7CisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfaW4pOworCisgIG1hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgiYSIpLCBnX3N0cmR1cCAoIjEyMyIpKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJhIGIiKSwgZ19zdHJkdXAgKCJ3aXRoIHNwYWNlcyAiKSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgic2FtZSIpLCBnX3N0cmR1cCAoInNhbWUiKSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgiMCIpLCBnX3N0cmR1cCAoIm51bWVyaWMga2V5IikpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zdHJpbmdfbWFwIChpZmFjZSwgJm1hcF9pbiwgbWFwX291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKG1hcF9vdXQpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX2luKTsKKworICBzZXRfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIHNldF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXRfb3V0LCAmaTMyLCAmaTMyKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc2V0IChpZmFjZSwgJnNldF9pbiwgc2V0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNldF9vdXQpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAoc2V0X2luKTsKKworICBsaXN0X291dCA9IGdfYXJyYXlfbmV3KFRSVUUsIFRSVUUsIHNpemVvZihnaW50MzIpKTsKKyAgbGlzdF9pbiA9IGdfYXJyYXlfbmV3KFRSVUUsIFRSVUUsIHNpemVvZihnaW50MzIpKTsKKyAgYW5vdGhlcl9pMzIgPSA0NTY7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAobGlzdF9vdXQsIGkzMik7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAobGlzdF9vdXQsIGFub3RoZXJfaTMyKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbGlzdCAoaWZhY2UsICZsaXN0X2luLCBsaXN0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19hcnJheV9mcmVlIChsaXN0X291dCwgVFJVRSk7CisgIGdfYXJyYXlfZnJlZSAobGlzdF9pbiwgVFJVRSk7CisKKyAgZW51bV9vdXQgPSBUX1RFU1RfTlVNQkVSWl9PTkU7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2VudW0gKGlmYWNlLCAmZW51bV9pbiwgZW51bV9vdXQsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZW51bV9pbiA9PSBlbnVtX291dCk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgdXNlcl9pZF9vdXQgPSAxMjM0NTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfdHlwZWRlZiAoaWZhY2UsICZ1c2VyX2lkX2luLCB1c2VyX2lkX291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0ICh1c2VyX2lkX2luID09IHVzZXJfaWRfb3V0KTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbWFwX21hcCAoaWZhY2UsICZtYXBfaW4sIGkzMiwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKG1hcF9pbik7CisKKyAgLy8gaW5zYW5pdHkKKyAgaW5zYW5pdHlfb3V0ID0gKFRUZXN0SW5zYW5pdHkgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGluc2FuaXR5X291dC0+dXNlck1hcCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChpbnNhbml0eV9vdXQtPnVzZXJNYXAsIEdJTlRfVE9fUE9JTlRFUiAoZW51bV9vdXQpLCAmdXNlcl9pZF9vdXQpOworCisgIHh0cnVjdDEgPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICB4dHJ1Y3QxLT5ieXRlX3RoaW5nID0gMTsKKyAgeHRydWN0MS0+X19pc3NldF9ieXRlX3RoaW5nID0gVFJVRTsKKyAgeHRydWN0MS0+aTMyX3RoaW5nID0gMTU7CisgIHh0cnVjdDEtPl9faXNzZXRfaTMyX3RoaW5nID0gVFJVRTsKKyAgeHRydWN0MS0+aTY0X3RoaW5nID0gMTUxOworICB4dHJ1Y3QxLT5fX2lzc2V0X2k2NF90aGluZyA9IFRSVUU7CisgIHh0cnVjdDEtPnN0cmluZ190aGluZyA9IGdfc3RyZHVwICgiYWJjMTIzIik7CisgIHh0cnVjdDEtPl9faXNzZXRfc3RyaW5nX3RoaW5nID0gVFJVRTsKKyAgeHRydWN0MiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIHh0cnVjdDItPmJ5dGVfdGhpbmcgPSAxOworICB4dHJ1Y3QyLT5fX2lzc2V0X2J5dGVfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyLT5pMzJfdGhpbmcgPSAxNTsKKyAgeHRydWN0Mi0+X19pc3NldF9pMzJfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyLT5pNjRfdGhpbmcgPSAxNTE7CisgIHh0cnVjdDItPl9faXNzZXRfaTY0X3RoaW5nID0gVFJVRTsKKyAgeHRydWN0Mi0+c3RyaW5nX3RoaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKKyAgeHRydWN0Mi0+X19pc3NldF9zdHJpbmdfdGhpbmcgPSBUUlVFOworCisgIGluc2FuaXR5X2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGdfcHRyX2FycmF5X2FkZCAoaW5zYW5pdHlfb3V0LT54dHJ1Y3RzLCB4dHJ1Y3QxKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChpbnNhbml0eV9vdXQtPnh0cnVjdHMsIHh0cnVjdDIpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9pbnNhbml0eSAoaWZhY2UsICZpbnNhbml0eV9pbiwgaW5zYW5pdHlfb3V0LCAmZXJyb3IpID09IFRSVUUpOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoaW5zYW5pdHlfaW4pOworICBnX3B0cl9hcnJheV9mcmVlIChpbnNhbml0eV9vdXQtPnh0cnVjdHMsIFRSVUUpOworCisgIG11bHRpX21hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgc3RyaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobXVsdGlfbWFwX291dCwgJmkxNiwgc3RyaW5nKTsKKyAgbXVsdGlfaW4gPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aSAoaWZhY2UsICZtdWx0aV9pbiwgYnl0ZSwgaTMyLCBpNjQsIG11bHRpX21hcF9vdXQsIGVudW1fb3V0LCB1c2VyX2lkX291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChtdWx0aV9pbi0+aTMyX3RoaW5nID09IGkzMik7CisgIGFzc2VydCAobXVsdGlfaW4tPmk2NF90aGluZyA9PSBpNjQpOworICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOworICBnX2hhc2hfdGFibGVfdW5yZWYgKG11bHRpX21hcF9vdXQpOworICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIlhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbi0+ZXJyb3JDb2RlID09IDEwMDEpOworICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICB4Y2VwdGlvbiA9IE5VTEw7CisKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgIGVycm9yID0gTlVMTDsKKyAgYXNzZXJ0ICh4Y2VwdGlvbiA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiVGVzdCIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24iLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOworICBhc3NlcnQgKHhjZXB0aW9uLT5lcnJvckNvZGUgPT0gMTAwMSk7CisgIGFzc2VydCAoeGNlcHRpb24yID09IE5VTEwpOworICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOworICB4Y2VwdGlvbiA9IE5VTEw7CisgIG11bHRpX2luID0gTlVMTDsKKworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24yIiwgTlVMTCwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbjItPmVycm9yQ29kZSA9PSAyMDAyKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbiA9PSBOVUxMKTsKKyAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgIGVycm9yID0gTlVMTDsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uMik7CisgIGdfb2JqZWN0X3VucmVmIChtdWx0aV9pbik7CisgIHhjZXB0aW9uMiA9IE5VTEw7CisgIG11bHRpX2luID0gTlVMTDsKKworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCBOVUxMICwgTlVMTCwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX29iamVjdF91bnJlZihtdWx0aV9pbik7CisgIG11bHRpX2luID0gTlVMTDsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9vbmV3YXkgKGlmYWNlLCAxLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIC8qIHNsZWVwIHRvIGxldCB0aGUgb25ld2F5IGNhbGwgZ28gdGhyb3VnaCAqLworICBzbGVlcCAoNSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCh0c29ja2V0KSwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIHZvaWQKK2JhaWxvdXQgKGludCBzaWdudW0pCit7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKHNpZ251bSk7CisKKyAgZXhpdCAoMSk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgaW50IHBpZCA9IGZvcmsgKCk7CisgIGFzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkgLyogY2hpbGQgKi8KKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KFRFU1RfUE9SVCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKyAgICBUU2ltcGxlU2VydmVyIHNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgc2lnbmFsIChTSUdBTFJNLCBiYWlsb3V0KTsKKyAgICBhbGFybSAoNjApOworICAgIHNpbXBsZVNlcnZlci5zZXJ2ZSgpOworICB9IGVsc2UgeworICAgIHNsZWVwICgxKTsKKyAgICB0ZXN0X3RocmlmdF9jbGllbnQgKCk7CisgICAga2lsbCAocGlkLCBTSUdJTlQpOworICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OWM2MWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KKworLyogc3Vic3RpdHV0ZWQgZnVuY3Rpb25zIHRvIHRlc3QgZmFpbHVyZXMgb2Ygc3lzdGVtIGFuZCBsaWJyYXJ5IGNhbGxzICovCitzdGF0aWMgaW50IHNvY2tldF9lcnJvciA9IDA7CitpbnQKK215X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBpZiAoc29ja2V0X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVjdl9lcnJvciA9IDA7Citzc2l6ZV90CitteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAocmVjdl9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9lcnJvciA9IDA7Citzc2l6ZV90CitteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAoc2VuZF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgc29ja2V0IG15X3NvY2tldAorI2RlZmluZSByZWN2IG15X3JlY3YKKyNkZWZpbmUgc2VuZCBteV9zZW5kCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyIKKyN1bmRlZiBzb2NrZXQKKyN1bmRlZiByZWN2CisjdW5kZWYgc2VuZAorCitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKKyAgZ19mcmVlIChob3N0bmFtZSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk5OworICBwaWRfdCBwaWQ7CisgIGludCBzdGF0dXM7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsIDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwl0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisJLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisJdHNvY2tldC0+c2QgPSAtMTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCS8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCisJLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlzb2NrZXRfZXJyb3IgPSAxOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCXNvY2tldF9lcnJvciA9IDA7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOworICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisKKwkvKiB3cml0ZSBmYWlsICovCisJc2VuZF9lcnJvciA9IDE7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXNlbmRfZXJyb3IgPSAwOworCisJdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworLyogdGVzdCBUaHJpZnRTb2NrZXQncyBwZWVrKCkgaW1wbGVtZW50YXRpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3BlZWsodm9pZCkKK3sKKyAgZ2ludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgZ3VpbnQgcG9ydCA9IDUxMTk5OworICBnY2hhciBkYXRhID0gJ0EnOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQ7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKwkJCQkgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkgICAicG9ydCIsICAgICBwb3J0LAorCQkJCSAgIE5VTEwpOworCisgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgICJ3X2J1Zl9zaXplIiwgc2l6ZW9mIGRhdGEsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgLyogd3JpdGUgZXhhY3RseSBvbmUgY2hhcmFjdGVyIHRvIHRoZSBjbGllbnQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChjbGllbnRfdHJhbnNwb3J0LAorCQkJCQkmZGF0YSwKKwkJCQkJc2l6ZW9mIGRhdGEsCisJCQkJCSZlcnJvcikgPT0gVFJVRSk7CisKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfQorICBlbHNlIHsKKyAgICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgICAgICBzbGVlcCAoMSk7CisKKyAgICAgIC8qIGNvbm5lY3QgdG8gdGhlIGNoaWxkICovCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKKyAgICAgICBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICAvKiByZWFkIGV4YWN0bHkgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChjbGllbnRfdHJhbnNwb3J0LAorCQkJCQkgICAgICAmZGF0YSwKKwkJCQkJICAgICAgc2l6ZW9mIGRhdGEsCisJCQkJCSAgICAgICZlcnJvciksID09LCBzaXplb2YgZGF0YSk7CisKKyAgICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcworICAgICAgIG5vIChtb3JlKSBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworCisgICAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAvKiByZWFkIDEwIGJ5dGVzICovCisgIGJ5dGVzID0gdGhyaWZ0X3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworCisgIC8qIGZhaWxlZCByZWFkICovCisgIHJlY3ZfZXJyb3IgPSAxOworICB0aHJpZnRfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKyAgcmVjdl9lcnJvciA9IDA7CisKKyAgdGhyaWZ0X3NvY2tldF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvUGVlayIsIHRlc3RfcGVlayk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMIC8qIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NTQxOTg1L3N0b3JhZ2Utc2l6ZS1vZi1hZGRyaW5mby1pc250LWtub3duICovCisKKworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorCisvKiAjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9ICovCisjZGVmaW5lIFRFU1RfREFUQSB7ICJHRVQgLyBIVFRQLzEuMVxuXG4iIH0KKworCisvKiBzdWJzdGl0dXRlZCBmdW5jdGlvbnMgdG8gdGVzdCBmYWlsdXJlcyBvZiBzeXN0ZW0gYW5kIGxpYnJhcnkgY2FsbHMgKi8KK3N0YXRpYyBpbnQgc29ja2V0X2Vycm9yID0gMDsKK2ludAorbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWN2X2Vycm9yID0gMDsKK3NzaXplX3QKK215X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChyZWN2X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZW5kX2Vycm9yID0gMDsKK3NzaXplX3QKK215X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChzZW5kX2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBzb2NrZXQgbXlfc29ja2V0CisjZGVmaW5lIHJlY3YgbXlfcmVjdgorI2RlZmluZSBzZW5kIG15X3NlbmQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyIKKyN1bmRlZiBzb2NrZXQKKyN1bmRlZiByZWN2CisjdW5kZWYgc2VuZAorCitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworCisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsIE5VTEwpOworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworICBTU0xfQ1RYKiBzc2xfY3R4PSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFNTTFRMUywgJmVycm9yKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsICJzc2xfY29udGV4dCIsICZzc2xfY3R4LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHNzbF9jdHghPU5VTEwpOworCisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBub25fc3NsX3BvcnQgPSA1MTE5ODsKKyAgY2hhciBlcnJvcm1zZ1syNTVdOworCisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIC8qIFRoaXMgaXMgYSBub24gU1NMIHNlcnZlciAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKG5vbl9zc2xfcG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0Iiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSAsIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZDogNjggLT4gQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisJLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisJVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdC5icm9rZW4iLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJc25wcmludGYoZXJyb3Jtc2csIDI1NSwgImhvc3QgbG9va3VwIGZhaWxlZCBmb3IgbG9jYWxob3N0LmJyb2tlbjolZCAtIFVua25vd24gaG9zdCIsIG5vbl9zc2xfcG9ydCk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSwgZXJyb3Jtc2cpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCWVycm9yID0gTlVMTDsKKworCQkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCS8qCisJCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisJCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCQlzb2NrZXRfZXJyb3IgPSAxOworCQlhc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJCXNvY2tldF9lcnJvciA9IDA7CisJCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwkJZ19lcnJvcl9mcmVlIChlcnJvcik7CisJICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIGNoYXIgYnVmZmVyW10gPSAidGhpcyBtdXN0IG5vdCBicmVhayI7CisKKyAgLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisgIHRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIDUxMTg4KzEsICZlcnJvcik7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIEZJWE1FIFRoaXMgbXVzdCBiZSB0ZXN0ZWQgYnV0IHNpbmNlIHRoZSBhc3NlcnRpb24gaW5zaWRlIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlIGJyZWFrcyB0aGUgdGVzdCB1bml0CisgICBpdCdzIGRpc2FibGVkLiBUaGV5IGlkZWEgaXMgdG8gZGlzYWJsZSB0cmFwL2NvcmVkdW1wIGR1cmluZyB0aGlzIHRlc3QKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X3dyaXRlKHRyYW5zcG9ydCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGdfbWVzc2FnZSAoIndyaXRlX2ZhaWxlZF93aXRoX2Vycm9yOiAlcyIsCisJICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiTm8iKTsKKyAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKyAgVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKK30KKworCisKKy8qKgorICogUHJpbnQgdGhlIGNvbW1vbiBuYW1lIG9mIGNlcnRpZmljYXRlCisgKi8KK3Vuc2lnbmVkIGNoYXIgKiBnZXRfY25fbmFtZShYNTA5X05BTUUqIGNvbnN0IG5hbWUpCit7CisgIGludCBpZHggPSAtMTsKKyAgdW5zaWduZWQgY2hhciAqdXRmOCA9IE5VTEw7CisKKyAgZG8KKyAgICB7CisgICAgICBpZighbmFtZSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpZHggPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgLTEpOworICAgICAgaWYoIShpZHggPiAtMSkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGlkeCk7CisgICAgICBpZighZW50cnkpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgQVNOMV9TVFJJTkcqIGRhdGEgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgICAgaWYoIWRhdGEpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaW50IGxlbmd0aCA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnV0ZjgsIGRhdGEpOworICAgICAgaWYoIXV0ZjggfHwgIShsZW5ndGggPiAwKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgIH0gd2hpbGUgKDApOworICByZXR1cm4gdXRmODsKK30KKworLyoKKyAqIEhhbmRsZSBJUFY0IGFuZCBJUFY2IGFkZHIKKyAqLwordm9pZCAqZ2V0X2luX2FkZHIoc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKyAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKyAgICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopc2EpLT5zaW5fYWRkcik7CisgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luNiopc2EpLT5zaW42X2FkZHIpOworfQorCitpbnQgdmVyaWZ5X2lwKGNoYXIgKiBob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIpCit7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcl9pbmZvLCpwOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIGludCByZXM7CisgIGludCByZXR2YWwgPSAwOworCisKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAvKiB1c2UgQUZfSU5FVDYgdG8gZm9yY2UgSVB2NiAqLworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisKKyAgaWYgKCAocmVzID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIE5VTEwsICZoaW50cywgJmFkZHJfaW5mbykgKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIGdldCB0aGUgaG9zdCBpbmZvICovCisgICAgICBnX2Vycm9yKCJDYW5ub3QgZ2V0IHRoZSBob3N0IGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAvKiBsb29wIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZSBjYW4gKi8KKyAgY2hhciBkbnNob3N0W0lORVQ2X0FERFJTVFJMRU5dOyAvKiBiaWdnZXIgYWRkciBzdXBwb3J0ZWQgSVBWNiAqLworICBjaGFyIHNvY2tldF9pcFtJTkVUNl9BRERSU1RSTEVOXTsKKyAgaWYoaW5ldF9udG9wKGFkZHItPnNzX2ZhbWlseSwgZ2V0X2luX2FkZHIoYWRkciksIHNvY2tldF9pcCwgSU5FVDZfQUREUlNUUkxFTik9PXNvY2tldF9pcCl7CisgICAgICBnX2RlYnVnKCJXZSBhcmUgY29ubmVjdGVkIHRvIGhvc3QgJXMgY2hlY2tpbmcgYWdhaW5zdCBjZXJ0aWZpY2F0ZS4uLiIsIHNvY2tldF9pcCk7CisgICAgICBpbnQgc2l6ZWlwID0gc29ja2V0X2lwIT1OVUxMID8gc3RybGVuKHNvY2tldF9pcCkgOiAwOworICAgICAgZm9yKHAgPSBhZGRyX2luZm87IHAgIT0gTlVMTDsgcCA9IHAtPmFpX25leHQpIHsKKwkgIGlmKGluZXRfbnRvcChwLT5haV9mYW1pbHksIGdldF9pbl9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKilwLT5haV9hZGRyKSwgZG5zaG9zdCwgSU5FVDZfQUREUlNUUkxFTik9PWRuc2hvc3QpeworCSAgICAgIGlmKGRuc2hvc3QhPU5VTEwpeworCQkgIGdfaW5mbygiRE5TIGFkZHJlc3MgWyVpIC0+ICVzXSIsIHAtPmFpX2FkZHIsIGRuc2hvc3QpOworCQkgIGlmKCFzdHJuY21wKGRuc2hvc3QsIHNvY2tldF9pcCwgc2l6ZWlwKSl7CisJCSAgICAgIHJldHZhbD0xOworCQkgICAgICBicmVhazsgLyogaWYgd2UgZ2V0IGhlcmUsIHdlIG11c3QgaGF2ZSBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIGlmKGFkZHJfaW5mbykKKyAgICBmcmVlYWRkcmluZm8oYWRkcl9pbmZvKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9mcm9tX2ZpbGUoY2hhciAqYnVmZmVyLCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBjaDsKKyAgbG9uZyBpbmRleD0wOworICBGSUxFICpmcDsKKworICBmcCA9IGZvcGVuKGZpbGVfbmFtZSwiciIpOyAvKiByZWFkIG1vZGUgKi8KKworICBpZiggZnAgPT0gTlVMTCApCisgICAgeworICAgICAgcGVycm9yKCJFcnJvciB3aGlsZSBvcGVuaW5nIHRoZSBmaWxlLlxuIik7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgIHByaW50ZigiVGhlIGNvbnRlbnRzIG9mICVzIGZpbGUgYXJlIDpcbiIsIGZpbGVfbmFtZSk7CisKKyAgd2hpbGUoaW5kZXg8c2l6ZSAmJiAoIGNoID0gZmdldGMoZnApICkgIT0gRU9GICl7CisgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKyAgfQorCisgIGZjbG9zZShmcCk7Cit9CisKKyNkZWZpbmUgSVNTVUVSX0NOX1BJTk5JTkcgIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKKyNkZWZpbmUgU1VCSkVDVF9DTl9QSU5OSU5HICJsb2NhbGhvc3QiCisjZGVmaW5lIENFUlRfU0VSSUFMX05VTUJFUiAiMSIKKworZ2Jvb2xlYW4gdmVyaWZ5X2NlcnRpZmljYXRlX3NuKFg1MDkgKmNlcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcmlhbF9udW1iZXIpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworCisgIEFTTjFfSU5URUdFUiAqc2VyaWFsID0gWDUwOV9nZXRfc2VyaWFsTnVtYmVyKGNlcnQpOworCisgIEJJR05VTSAqYm4gPSBBU04xX0lOVEVHRVJfdG9fQk4oc2VyaWFsLCBOVUxMKTsKKyAgaWYgKCFibikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBBU04xSU5URUdFUiB0byBCTlxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIGNoYXIgKnRtcCA9IEJOX2JuMmRlYyhibik7CisgIGlmICghdG1wKSB7CisgICAgICBnX3dhcm5pbmcoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQk4gdG8gZGVjaW1hbCBzdHJpbmcuXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICAvKgorICAgIGlmIChzdHJsZW4odG1wKSA+PSBsZW4pIHsKKyAgICAgIGdfd2FybihzdGRlcnIsICJidWZmZXIgbGVuZ3RoIHNob3J0ZXIgdGhhbiBzZXJpYWwgbnVtYmVyXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgT1BFTlNTTF9mcmVlKHRtcCk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgKi8KKyAgaWYoIXN0cm5jbXAoc2VyaWFsX251bWJlciwgdG1wLCBzdHJsZW4oc2VyaWFsX251bWJlcikpKXsKKyAgICAgIHJldHZhbD1UUlVFOworICB9ZWxzZXsKKyAgICAgIGdfd2FybmluZygiU2VyaWFsIG51bWJlciBpcyBub3QgdmFsaWQiKTsKKyAgfQorCisgIEJOX2ZyZWUoYm4pOworICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4gbXlfYWNjZXNzX21hbmFnZXIoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsU29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgZ19pbmZvKCJQcm9jZXNzaW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIik7CisgIFg1MDlfTkFNRSogaW5hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkgOiBOVUxMOworICBYNTA5X05BTUUqIHNuYW1lID0gY2VydCA/IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSA6IE5VTEw7CisKKyAgLyogSXNzdWVyIGlzIHRoZSBhdXRob3JpdHkgd2UgdHJ1c3QgdGhhdCB3YXJyYW50cyBub3RoaW5nIHVzZWZ1bCAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogaXNzdWVyID0gZ2V0X2NuX25hbWUoaW5hbWUpOworICBpZihpc3N1ZXIpeworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworICAgICAgZ19pbmZvKCJJc3N1ZXIgKGNuKSAlcyIsIGlzc3Vlcik7CisKKyAgICAgIC8qIElzc3VlciBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKElTU1VFUl9DTl9QSU5OSU5HLCBpc3N1ZXIsIHN0cmxlbihJU1NVRVJfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIElzc3VlciBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShpc3N1ZXIpOworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisKKyAgLyogU3ViamVjdCBpcyB3aG8gdGhlIGNlcnRpZmljYXRlIGlzIGlzc3VlZCB0byBieSB0aGUgYXV0aG9yaXR5ICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3ViamVjdCA9IGdldF9jbl9uYW1lKHNuYW1lKTsKKyAgaWYoc3ViamVjdCl7CisgICAgICBnX2luZm8oIlN1YmplY3QgKGNuKSAlcyIsIHN1YmplY3QpOworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworCisgICAgICAvKiBTdWJqZWN0IHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoU1VCSkVDVF9DTl9QSU5OSU5HLCBzdWJqZWN0LCBzdHJsZW4oU1VCSkVDVF9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKworICAgICAgLyogSG9zdCBwaW5uaW5nICAgICAgICovCisgICAgICBpZih2ZXJpZnlfaXAoc3ViamVjdCwgYWRkcikpeworCSAgZ19pbmZvKCJWZXJpZmllZCBzdWJqZWN0Iik7CisgICAgICB9ZWxzZXsKKwkgIGdfaW5mbygiQ2Fubm90IHZlcmlmeSBzdWJqZWN0Iik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShzdWJqZWN0KTsKKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisgIGlmKCF2ZXJpZnlfY2VydGlmaWNhdGVfc24oY2VydCwgQ0VSVF9TRVJJQUxfTlVNQkVSKSl7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH1lbHNleworICAgICAgZ19pbmZvKCJWZXJpZmllZCBzZXJpYWwgbnVtYmVyIik7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworfQorCisKKworCisjaWZkZWYgQlVJTERfU0VSVkVSCitzdGF0aWMgdm9pZAordGVzdF9zc2xfYXV0aG9yaXphdGlvbl9tYW5hZ2VyKHZvaWQpCit7CisgIGludCBzdGF0dXM9MDsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIC8qICBpbnQgcG9ydCA9IDUxMTk5OyAqLworICBpbnQgcG9ydCA9IDQ0MzsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIGd1Y2hhciBidWZbMTddID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisvKgorICBwaWQgPSBmb3JrICgpOworICAgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICAgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCSovCisgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgIHNsZWVwICgxKTsKKworICAvKiBUZXN0IGFnYWluc3QgbGV2ZWwyIG93bmNsb3VkIGNlcnRpZmljYXRlICovCisgIHRTU0xzb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisgIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKHRTU0xzb2NrZXQsIG15X2FjY2Vzc19tYW5hZ2VyKTsgICAgICAgICAgIC8qIEluc3RhbGwgcGlubmluZyBtYW5hZ2VyICovCisgIC8qIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZSh0U1NMc29ja2V0LCAiLi9vd25jbG91ZC5sZXZlbDJjcm0ucGVtIik7ICovCisgIHVuc2lnbmVkIGNoYXIgY2VydF9idWZmZXJbNjU1MzRdOworICByZWFkX2Zyb21fZmlsZShjZXJ0X2J1ZmZlciwgNjU1MzQsICIuLi8uLi9rZXlzL2NsaWVudC5wZW0iKTsKKyAgaWYoIXRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKHRTU0xzb2NrZXQsIGNlcnRfYnVmZmVyKSl7CisgICAgICBnX3dhcm5pbmcoIkNlcnRpZmljYXRlcyBjYW5ub3QgYmUgbG9hZGVkISIpOworICB9CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTHNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxNywgTlVMTCk7CisKKyAgLyogd3JpdGUgZmFpbCAqLworICBzZW5kX2Vycm9yID0gMTsKKyAgLyoKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisgICAgIHNlbmRfZXJyb3IgPSAwOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xzb2NrZXQpOworCisgIC8qICAgIGdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7ICovCisgIGdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgLyogIH0gKi8KK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAvKiByZWFkIDEwIGJ5dGVzICovCisgIGJ5dGVzID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKworICAvKiBmYWlsZWQgcmVhZCAqLworICByZWN2X2Vycm9yID0gMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworICByZWN2X2Vycm9yID0gMDsKKworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcmV0dmFsOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kU2V0UHJvcGVydGllcyIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kQ2xvc2VOb25TU0xTZXJ2ZXIiLCB0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRXcml0ZUludmFsaWRTb2NrZXQiLCB0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCk7CisKKworCisKKyAgcmV0dmFsID0gZ190ZXN0X3J1biAoKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluIGIvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGM3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQyBBUEkKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IGdsaWItMi4wIGdvYmplY3QtMi4wCitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdF9jX2dsaWIKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY2wvTWFrZWZpbGUuYW0gYi9saWIvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiMzg4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworYWxsLWxvY2FsOgorCWJhc2ggZW5zdXJlLWV4dGVybmFscy5zaAorCitydW4tdGVzdHM6IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisJJChTQkNMKSAtLXNjcmlwdCB0ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcAorCitjaGVjay1sb2NhbDogcnVuLXRlc3RzCisJLi9ydW4tdGVzdHMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgcnVuLXRlc3RzIHF1aWNrbGlzcC5saXNwIGJhY2twb3J0LXVwZGF0ZS56aXAKKwkkKFJNKSAtcmYgbGliIGV4dGVybmFscyBxdWlja2xpc3AKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVJFQURNRVMgXAorCWxvYWQtbG9jYWxseS5saXNwIFwKKwl0ZXN0IFwKKwllbnN1cmUtZXh0ZXJuYWxzLnNoCmRpZmYgLS1naXQgYS9saWIvY2wvUkVBRE1FLm1kIGIvbGliL2NsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZlYWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRS5tZApAQCAtMCwwICsxLDI1MyBAQAorVGhyaWZ0IENvbW1vbiBMaXNwIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworCisKK1VzaW5nIFRocmlmdCB3aXRoIENvbW1vbiBMaXNwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBUaHJpZnQgaXMgYSBwcm90b2NvbCBhbmQgbGlicmFyeSBmb3IgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNvb3BlcmF0aW5nCisgcHJvY2Vzc2VzLiBUaGUgY29tbXVuaWNhdGlvbiB0YWtlcyB0aGUgZm9ybSBvZiByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlcywgb2Ygd2hpY2ggdGhlIGZvcm1zCisgYXJlIHNwZWNpZmllZCBpbiBhZHZhbmNlIHRocm91ZmggYSBzaGFyZWQgaW50ZXJmYWNlIGRlZmluaXRpb24uIEEgVGhyaWZ0IGRlZmluaXRpb24gZmlsZSBpcyB0cmFuc2xhdGVkCisgaW50byBMaXNwIHNvdXJjZSBmaWxlcywgd2hpY2ggY29tcHJpc2Ugc2V2ZXJhbCBkZWZpbml0aW9uczoKKworICAqIFRocmVlIHBhY2thZ2VzLCBvbmUgZm9yIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIG9wZXJhdG9ycywgYW5kIG9uZSBlYWNoIGZvciByZXF1ZXN0IGFuZAorICByZXNwb25zZSBvcGVyYXRvcnMuCisgICogVmFyaW91cyB0eXBlIGRlZmluaXRpb25zIGFzIGltcGxlbWVudGF0aW9ucyBmb3IgVGhyaWZ0IHR5cGVkZWYgYW5kIGVudW0gZGVmaW5pdGlvbnMuCisgICogREVGLVNUUlVDVCBhbmQgREVGLUVYQ0VQVElPTiBmb3JtcyBmb3IgVGhyaWZ0IHN0cnVjdCBhbmQgZXhjZXB0aW9uIGRlZmluaXRpb25zLgorICAqIERFRi1TRVJWSUNFIGZvcm1zIGZvciB0aHJpZnQgc2VydmljZSBkZWZpbml0aW9ucy4KKworIEVhY2ggc2VydmljZSBkZWZpbml0aW9uIGV4cGFuZHMgaW4gYSBjb2xsZWN0aW9uIG9mIGdlbmVyaWMgZnVuY3Rpb24gZGVmaW5pdGlvbnMuIEZvciBlYWNoIGBvcGAKKyBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLCB0d28gZnVuY3Rpb25zIGFyZSBkZWZpbmVkCisKKyAgKiBgb3BgLXJlcXVlc3QgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgY2xpZW50LiBJdCBhY2NlcHRzIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBgcHJvdG9jb2xgIGFyZ3VtZW50LAorICAgIHRvIGFjdCBhcyB0aGUgY2xpZW50IHByb3h5IGZvciB0aGUgb3BlcmF0aW9uIGFuZCBtZWRpYXRlIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGEgcmVtb3RlIHByb2Nlc3MKKyAgICB0aHJvdWdoIGEgVGhyaWZ0LWVuY29kZWQgdHJhbnNwb3J0IHN0cmVhbS4KKyAgKiBgb3BgLXJlc3BvbnNlIGlzIGRlZmluZWQgZm9yIHVzZSBieSBhIHNlcnZlci4gSXQgYWNjZXB0cyBhIHNpbmdsZSBgcHJvdG9jb2xgIGFyZ3VtZW50LiBBIHNlcnZlcgorICAgIHVzZXMgaXQgdG8gZGVjb2RlIHRoZSByZXF1ZXN0IG1lc3NhZ2UsIGludm9rZSB0aGUgYmFzZSBgb3BgIGZ1bmN0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYXJndW1lbnRzLAorICAgIGVuY29kZSBhbmQgc2VuZCB0aGUgdGhlIHJlc3VsdCBhcyBhIHJlc3BvbnNlLCBhbmQgaGFuZGxlcyBleGNlcHRpb25zLgorCisgVGhlIGNsaWVudCBpbnRlcmZhY2UgaXMgb25lIG9wZXJhdG9yCisKKyAgKiBgd2l0aC1jbGllbnQgKHZhcmlhYmxlIGxvY2F0aW9uKSAuIGJvZHlgIDogY3JlYXRlcyBhIGNvbm5lY3Rpb24gaW4gYSBkeW5hbWljIGNvbnRleHQgYW5kIGNsb3NlcyBpdAorICAgIHVwb24gZXhpdC4gVGhlIHZhcmlhYmxlIGlzIGJvdW5kIHRvIGEgY2xpZW50IHByb3h5IHN0cmVhbS9wcm90b2NvbCBpbnN0YW5jZSwgd2hpY2ggd3JhcHMgdGhlCisgICAgYmFzZSBpL28gc3RyZWFtIC0gc29ja2V0LCBmaWxlLCBldGMsIHdpdGggYW4gb3BlcmF0b3JzIHdoaWNoIGltcGxlbWVudCB0aGUgVGhyaWZ0IHByb3RvY29sCisgICAgYW5kIHRyYW5zcG9ydCBtZWNoYW5pc21zLgorCisgVGhlIHNlcnZlciBpbnRlcmZhY2UgY29tYmluZXMgc2VydmVyIGFuZCBzZXJ2aWNlIG9iamVjdHMKKworICAqIGBzZXJ2ZSAobG9jYXRpb24gc2VydmljZSlgIDogYWNjZXB0cyBjb25uZWN0aW9ucyBvbiB0aGUgZGVzaWduYXRlZCBwb3J0IGFuZCByZXNwb25kcyB0bworICAgIHJlcXVlc3RzIG9mIHRoZSBzZXJ2aWNlJ3Mgb3BlcmF0aW9ucy4KKworCitCdWlsZGluZyAKKy0tLS0tLS0tCisKK1RoZSBUaHJpZnQgQ29tbW9uIExpc3AgbGlicmFyeSBpcyBwYWNrYWdlZCBhcyB0aGUgQVNERltbMV1dIHN5c3RlbSBgdGhyaWZ0YC4KK0l0IGRlcGVuZHMgb24gdGhlIHN5c3RlbXMKKworKiBwdXJpW1syXV0gOiBmb3IgdGhlIHRocmlmdCB1cmkgY2xhc3MKKyogY2xvc2VyLW1vcFtbM11dIDogZm9yIGNsYXNzIG1ldGFkYXRhCisqIHRyaXZpYWwtdXRmLThbWzRdXSA6IGZvciBzdHJpbmcgY29kZWNzCisqIHVzb2NrZXRbWzVdXSA6IGZvciB0aGUgc29ja2V0IHRyYW5zcG9ydAorKiBpZWVlLWZsb2F0c1tbNl1dIDogZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBpbnRzIGFuZCBmbG9hdHMKKyogdHJpdmlhbC1ncmF5LXN0cmVhbXNbWzddXSA6IGFuIGFic3RyYWN0aW9uIGxheWVyIGZvciBncmF5IHN0cmVhbXMKKyogYWxleGFuZHJpYVtbOF1dIDogaGFuZHkgdXRpbGl0aWVzCisKK1RoZSBkZXBlbmRlbmNpZXMgYXJlIGJ1bmRsZWQgZm9yIGxvY2FsIGJ1aWxkcyBvZiB0ZXN0cyBhbmQgdHV0b3JpYWwgYmluYXJpZXMgLSAKK2l0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aG9zZSBidW5kbGVzIHRvIGxvYWQgdGhlIGxpYnJhcnksIHRvby4KKworSW4gb3JkZXIgdG8gYnVpbGQgaXQsIHJlZ2lzdGVyIHRob3NlIHN5c3RlbXMgd2l0aCBBU0RGIGFuZCBldmFsdWF0ZToKKworICAgIChhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCisKK1RoaXMgd2lsbCBjb21waWxlIGFuZCBsb2FkIHRoZSBMaXNwIGNvbXBpbGVyIGZvciBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlcywgdGhlCit0cmFuc3BvcnQgYW5kIHByb3RvY29sIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBjbGllbnQgYW5kIHNlcnZlciBpbnRlcmZhY2UKK2Z1bmN0aW9ucy4gSW4gb3JkZXIgdG8gdXNlIFRocmlmdCBpbiBhbiBhcHBsaWNhdGlvbiwgb25lIG11c3QgYWxzbyBhdXRob3IgYW5kL29yCitsb2FkIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIHRoZSByZW1vdGUgc2VydmljZS5bWzldXSBJZiBvbmUgaXMgaW1wbGVtZW50aW5nIGEgc2VydmljZSwKK29uZSBtdXN0IGFsc28gZGVmaW5lIHRoZSBhY3R1YWwgZnVuY3Rpb25zIHRvIHdoaWNoIFRocmlmdCBpcyB0byBhY3QgYXMgdGhlIHByb3h5CitpbnRlcmZhY2UuIFRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCBmb2xsb3dzIHRoZSBUaHJpZnQgdHV0b3JpYWwgdG8gaWxsdXN0cmF0ZSBob3cKK3RvIHBlcmZvcm0gdGhlIHN0ZXBzCisKKyAgKiBpbXBsZW1lbnQgdGhlIHNlcnZpY2UKKyAgKiB0cmFuc2xhdGUgdGhlIFRocmlmdCBJREwKKyAgKiBsb2FkIHRoZSBMaXNwIHNlcnZpY2UgaW50ZXJmYWNlcworICAqIHJ1biBhIHNlcnZlciBmb3IgdGhlIHNlcnZpY2UKKyAgKiB1c2UgYSBjbGllbnQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlIHJlbW90ZWx5CisKK05vdGUgdGhhdCwgaWYgb25lIGlzIHRvIGltcGxlbWVudCBhIG5ldyBzZXJ2aWNlLCBvbmUgd2lsbCBhbHNvIG5lZWQgdG8gYXV0aG9yIHRoZQorSURMIGZpbGVzLCBhcyB0aGVyZSBpcyBubyBmYWNpbGl0eSB0byBnZW5lcmF0ZSB0aGVtIGZyb20gYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorCisKK0ltcGxlbWVudCB0aGUgU2VydmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0dXRvcmlhbCBjb21wcmlzZXMgc2VydmVyYWwgZnVuY3Rpb25zOiBgYWRkYCwgYHBpbmdgLCBgemlwYCwgYW5kIGBjYWxjdWxhdGVgLgorRWFjaCB0cmFuc2xhdGVkIElETCBmaWxlIGdlbmVyYXRlcyB0aHJlZSBwYWNrYWdlcyBmb3IgZXZlcnkgc2VydmljZS4gSW4gdGhlIGNhc2Ugb2YKK3RoZSB0dXRvcmlhbCBmaWxlLCB0aGUgcmVsZXZhbnQgcGFja2FnZXMgYXJlOgorCisgICogdHV0b3JpYWwuY2FsY3VsYXRvcgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb24KKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yLXJlc3BvbnNlCisgIAorVGhpcyBpcyB0byBzZXBhcmF0ZSB0aGUgcmVxdWVzdCAoZ2VuZXJhdGVkKSwgcmVzcG9uc2UgKGdlbmVyYXRlZCkgYW5kIGltcGxlbWVudGF0aW9uCisobWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHByb2dyYW1tZXIpIGZ1bmN0aW9ucyBmb3IgZGVmaW5lZCBUaHJpZnQgbWV0aG9kcy4KKworSXQgaXMgc3VnZ2VzdGVkIHRvIHdvcmsgaW4gdGhlIGB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbmAgcGFja2FnZSB3aGlsZSBpbXBsZW1lbnRpbmcKK3RoZSBzZXJ2aWNlcyAtIGl0IGltcG9ydHMgdGhlIGBjb21tb24tbGlzcGAgcGFja2FnZSwgd2hpbGUgdGhlIHNlcnZpY2Utc3BlY2lmaWMgb25lcworZG9uJ3QgKHRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIFRocmlmdCBtZXRob2QgbmFtZXMgYW5kIGZ1bmN0aW9uIG5hbWVzIGluIGBjb21tb24tbGlzcGApLgorCisgICAgOzsgZGVmaW5lIHRoZSBiYXNlIG9wZXJhdGlvbnMKKyAgICAKKyAgICAoaW4tcGFja2FnZSA6dHV0b3JpYWwtaW1wbGVtZW50YXRpb24pCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246YWRkIChudW0xIG51bTIpCisgICAgICAoZm9ybWF0IHQgIn4mQXNrZWQgdG8gYWRkIH5BIGFuZCB+QS4iIG51bTEgbnVtMikKKyAgICAgICgrIG51bTEgbnVtMikpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246cGluZyAoKQorICAgICAgKHByaW50IDpwaW5nKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjp6aXAgKCkKKyAgICAgIChwcmludCA6emlwKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpjYWxjdWxhdGUgKGxvZ2lkIHRhc2spCisgICAgICAoY2FsY3VsYXRlLW9wICh3b3JrLW9wIHRhc2spICh3b3JrLW51bTEgdGFzaykgKHdvcmstbnVtMiB0YXNrKSkpCisgICAgCisgICAgKGRlZmdlbmVyaWMgY2FsY3VsYXRlLW9wIChvcCBhcmcxIGFyZzIpCisgICAgICAoOm1ldGhvZCA6YXJvdW5kIChvcCBhcmcxIGFyZzIpCisgICAgICAgIChsZXQgKChyZXN1bHQgKGNhbGwtbmV4dC1tZXRob2QpKSkKKyAgICAgICAgICAoZm9ybWF0IHQgIn4mQXNrZWQgdG8gY2FsY3VsYXRlOiB+ZCBvbiAgfkEgYW5kIH5BID0gfmQuIiBvcCBhcmcxIGFyZzIgcmVzdWx0KQorICAgICAgICAgIHJlc3VsdCkpCisgICAgCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmFkZCkpIGFyZzEgYXJnMikKKyAgICAgICAgKCsgYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uc3VidHJhY3QpKSBhcmcxIGFyZzIpCisgICAgICAgICgtIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLm11bHRpcGx5KSkgYXJnMSBhcmcyKQorICAgICAgICAoKiBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5kaXZpZGUpKSBhcmcxIGFyZzIpCisgICAgICAgICgvIGFyZzEgYXJnMikpKQorICAgIAorICAgIChkZWZ1biB6aXAgKCkgKHByaW50ICd6aXApKQorCisKK1RyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lETCBmaWxlcyBlbXBsb3kgdGhlIGZpbGUgZXh0ZW5zaW9uIGB0aHJpZnRgLiBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gZmlsZXMgdG8gdHJhbnNsYXRlCisgICogYHR1dG9yaWFsLnRocmlmdGAKKyAgKiBgc2hhcmVkLnRocmlmdGAKK0FzIHRoZSBmb3JtZXIgaW5jbHVkZXMgdGhlIGxhdHRlciwgb25lIHVzZXMgaXQgdG8gZ2VuZXJhdGUgdGhlIGludGVyZmFjZXM6CisKKyAgICAkVEhSSUZUL2Jpbi90aHJpZnQgLXIgLS1nZW4gY2wgJFRIUklGVC90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKyAgICAKK2AtcmAgc3RhbmRzIGZvciByZWN1cnNpb24sIHdoaWxlIGAtLWdlbmAgbGV0cyBvbmUgY2hvb3NlIHRoZSBsYW5ndWFnZSB0byB0cmFuc2xhdGUgdG8uCisKKworTG9hZCB0aGUgTGlzcCB0cmFuc2xhdGVkIHNlcnZpY2UgaW50ZXJmYWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdHJhbnNsYXRvciBnZW5lcmF0ZXMgdGhyZWUgZmlsZXMgZm9yIGVhY2ggSURMIGZpbGUuIEZvciBleGFtcGxlIGB0dXRvcmlhbC10eXBlcy5saXNwYCwKK2B0dXRvcmlhbC12YXJzLmxpc3BgIGFuZCBhbiBgLmFzZGAgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgdGhlbSBib3RoIGFuZCBwdWxsIGluCitvdGhlciBpbmNsdWRlcyAobGlrZSBgc2hhcmVkYCB3aXRoaW4gdGhlIHR1dG9yaWFsKSBhcyBkZXBlbmRlbmNpZXMuCisKKworUnVuIGEgU2VydmVyIGZvciB0aGUgU2VydmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYWN0dWFsIHNlcnZpY2UgbmFtZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBgZGVmLXNlcnZpY2VgIGZvcm0gaW4gYHR1dG9yaWFsLmxpc3BgLCBpcyBgY2FsY3VsYXRvcmAuIAorRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZGVmaW5lcyBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIGJpbmRzIGl0IHRvIGEKK3NlcnZpY2UgaW5zdGFuY2Ugd2hjaCBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbnMuCisKK0luIG9yZGVyIHRvIHN0YXJ0IGEgc2VydmljZSwgc3BlY2lmeSBhIGxvY2F0aW9uIGFuZCB0aGUgc2VydmljZSBpbnN0YW5jZS4gCisKKyAgICAoaW4tcGFja2FnZSA6dHV0b3JpYWwpCisgICAgKHNlcnZlICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkxIiBjYWxjdWxhdG9yKQorCisKK1VzZSBhIENsaWVudCB0byBBY2Nlc3MgdGhlIFNlcnZpY2UgUmVtb3RlbHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitbaW4gc29tZSBvdGhlciBwcm9jZXNzXSBydW4gdGhlIGNsaWVudAorCisgICAgKGluLXBhY2thZ2UgOmNsLXVzZXIpCisKKyAgICAobWFjcm9sZXQgKChzaG93IChmb3JtKQorICAgICAgICAgICAgICAgICBgKGZvcm1hdCAqdHJhY2Utb3V0cHV0KiAifiV+cyA9Pn57IH5zfn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICcsZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAobXVsdGlwbGUtdmFsdWUtbGlzdCAoaWdub3JlLWVycm9ycyAsZm9ybSkpKSkpCisgICAgICAod2l0aC1jbGllbnQgKHByb3RvY29sICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkxIikKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6cGluZyBwcm90b2NvbCkpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDIpKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdG9jb2wgMSA0KSkKKyAgICAKKyAgICAgICAgKGxldCAoKHRhc2sgKG1ha2UtaW5zdGFuY2UgJ3R1dG9yaWFsOndvcmsKKyAgICAgICAgICAgICAgICAgICAgICA6b3Agb3BlcmF0aW9uLnN1YnRyYWN0IDpudW0xIDE1IDpudW0yIDEwKSkpCisgICAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3RvY29sIDEgdGFzaykpCisgICAgICAgIAorICAgICAgICAgIChzZXRmICh0dXRvcmlhbDp3b3JrLW9wIHRhc2spIG9wZXJhdGlvbi5kaXZpZGUKKyAgICAgICAgICAgICAgICAodHV0b3JpYWw6d29yay1udW0xIHRhc2spIDEKKyAgICAgICAgICAgICAgICAodHV0b3JpYWw6d29yay1udW0yIHRhc2spIDApCisgICAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3RvY29sIDEgdGFzaykpKQorICAgICAgICAKKyAgICAgICAgKHNob3cgKHNoYXJlZC5zaGFyZWQtc2VydmljZTpnZXQtc3RydWN0IHByb3RvY29sIDEpKQorICAgIAorICAgICAgICAoc2hvdyAoemlwIHByb3RvY29sKSkpKQorCitJc3N1ZXMKKy0tLS0tLQorCisjIyMgb3B0aW9uYWwgZmllbGRzIAorIFdoZXJlIHRoZSBJREwgZGVjbGFyZXMgYSBmaWVsZCBvcHRpb25zLCB0aGUgZGVmLXN0cnVjdCBmb3JtIGluY2x1ZGVzIG5vCisgaW5pdGZvcm0gZm9yIHRoZSBzbG90IGFuZCB0aGUgZW5jb2Rpbmcgb3BlcmF0b3Igc2tpcHMgYW4gdW5ib3VuZCBzbG90LiBUaGlzIGxlYXZlIHNvbWUgYW1iaWd1aXR5Cisgd2l0aCBib29sIGZpZWxkcy4KKworIyMjIGluc3RhbnRpYXRpb24gcHJvdG9jb2wgOgorIHN0cnVjdCBjbGFzc2VzIGFyZSBzdGFuZGFyZCBjbGFzc2VzIGFuZCBleGNlcHRpb24gY2xhc3NlcyBhcmUKKyB3aGF0ZXZlciB0aGUgaW1wbGVtZW50YXRpb24gcHJlc2NyaWJlcy4gZGVjb2RlcnMgYXBwbHkgbWFrZS1zdHJ1Y3QgdG8gYW4gaW5pdGFyZ3MgbGlzdC4KKyBwYXJ0aWN1bGFybHkgYXQgdGhlIHNlcnZpY2UgZW5kLCB0aGVyZSBhcmUgYWR2YW50YWdlcyB0byByZXNvdXJjaW5nIHN0cnVjdHMgYW5kIGRlY29kaW5nCisgd2l0aCBkaXJlY3Qgc2lkZS1lZmZlY3RzIG9uIHNsb3QtdmFsdWVzCisKKyMjIyBtYXBzOgorIE1hcHMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBoYXNoIHRhYmxlcy4gQXMgZGF0YSB0aHJvdWdoIHRoZSBjYWxsL3JlcGx5IGludGVyZmFjZSBpcyBhbGwgc3RhdGljYWxseQorIHR5cGVkLCBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgb2JqZWN0cyB0byB0aGVtc2VsdmVzIGluZGljYXRlIHRoZSBjb2RpbmcgZm9ybS4gQXNzb2NpYXRpb24gbGlzdHMKKyB3b3VsZCBiZSBzdWZmaWNpZW50LiBBcyB0aGUga2V5IHR5cGUgaXMgYXJiaXRyYXJ5LCBwcm9wZXJ0eSBsaXN0cyBvZmZlciBubyBhZGRpdGlvbmFsIGNvbnZlbmllbmNlOgorIGFzIGBnZXRmYCBvcGVyYXRlcyB3aXRoIGBlcWAgYSBuZXcgYWNjZXNzIGludGVyZmFjZSB3b3VsZCBiZSBuZWNlc3NhcnkgYW5kIHRoZXkgd291bGQgbm90IGJlCisgYXZhaWxhYmxlIGZvciBmdW5jdGlvbiBhcHBsaWNhdGlvbi4KKworCisgWzFdOiB3d3cuY29tbW9uLWxpc3AubmV0L2FzZGYKKyBbMl06IGh0dHA6Ly9naXRodWIuY29tL2xpc3AvY29tLmI5LnB1cmkucHBjcmUKKyBbM106IHd3dy5jb21tb24tbGlzcC5uZXQvY2xvc2VyLW1vcAorIFs0XTogdHJpdmlhbC11dGYtOAorIFs1XTogaHR0cHM6Ly9naXRodWIuY29tL3Vzb2NrZXQvdXNvY2tldAorIFs2XTogaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvaWVlZS1mbG9hdHMKKyBbN106IGh0dHBzOi8vZ2l0aHViLmNvbS90cml2aWFsLWdyYXktc3RyZWFtcy90cml2aWFsLWdyYXktc3RyZWFtcworIFs4XTogaHR0cHM6Ly9naXRsYWIuY29tbW9uLWxpc3AubmV0L2FsZXhhbmRyaWEvYWxleGFuZHJpYQorIFs5XTogaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0R2VuZXJhdGlvbgorCisqIHVzb2NrZXRbWzVdXSA6IGZvciB0aGUgc29ja2V0IHRyYW5zcG9ydAorKiBpZWVlLWZsb2F0c1tbNl1dIDogZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBpbnRzIGFuZCBmbG9hdHMKKyogdHJpdmlhbC1ncmF5LXN0cmVhbXNbWzddXSA6IGFuIGFic3RyYWN0aW9uIGxheWVyIGZvciBncmF5IHN0cmVhbXMKKyogYWxleGFuZHJpYVtbOF1dIDogaGFuZHkgdXRpbGl0aWVzCmRpZmYgLS1naXQgYS9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AgYi9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApAQCAtMCwwICsxLDY0IEBACisoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworIysob3IgY2NsIHNiY2wpIC9kZXZlbG9wbWVudC9zb3VyY2UvbGlicmFyeS8KKyhsb2FkICJidWlsZC1pbml0Lmxpc3AiKQorCis7OzsgISBmaXJzdCwgc2VsZWN0IHRoZSBhcGkgdmVyc2lvbiBpbiB0aGUgY2Fzc2FuZHJhIHN5c3RlbSBkZWZpbml0aW9uCis7OzsgYXMgb25seSBvbmUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhIHRpbWUuCisoYXNkZjpsb2FkLXN5c3RlbSA6ZGUuc2V0Zi5jYXNzYW5kcmEpCisKKyhpbi1wYWNrYWdlIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGRlZnBhcmFtZXRlciAqYy1sb2NhdGlvbioKKyAgOzsgcmVtb3RlCisgIDs7ICN1InRocmlmdDovL2VjMi0xNzQtMTI5LTY2LTE0OC5jb21wdXRlLTEuYW1hem9uYXdzLmNvbTo5MTYwIgorICA7OyBsb2NhbAorICAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTE2MCIKKyAgIkEgY2Fzc2FuZHJhIHNlcnZpY2UgbG9jYXRpb24gLSBlaXRoZXIgdGhlIGxvY2FsIG9uZSBvciBhIHJlbW90ZSBzZXJ2aWNlIAorIC0gYWx3YXlzIGEgJ3RocmlmdCcgdXJpLiIpCisKKyhkZWZwYXJhbWV0ZXIgKmMqICh0aHJpZnQ6Y2xpZW50ICpjLWxvY2F0aW9uKikpCisKKworKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgKmMqKQorOzsgPT4gKCJLZXlzcGFjZTEiICJzeXN0ZW0iKQorCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWNsdXN0ZXItbmFtZSAqYyopCis7OyA9PiJUZXN0IENsdXN0ZXIiCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtdmVyc2lvbiAqYyopCis7OyA9PiAiMi4xLjAiCisKKyhsb29wIGZvciBzcGFjZSBpbiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCisgICAgICBjb2xsZWN0IChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlICpjKiBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkgdmFsdWUpKSkpKQorCisKKyhjbG9zZSAqYyopCisKKyhkZWZ1biBkZXNjcmliZS1jYXNzYW5kcmEgKGxvY2F0aW9uICZvcHRpb25hbCAoc3RyZWFtICpzdGFuZGFyZC1vdXRwdXQqKSkKKyAgIlByaW50IHRoZSBmaXJzdC1vcmRlciBzdG9yZSBtZXRhZGF0YSBmb3IgYSBjYXNzYW5kcmEgTE9DQVRJT04uIgorCisgICh0aHJpZnQ6d2l0aC1jbGllbnQgKGNhc3NhbmRyYSBsb2NhdGlvbikKKyAgICAobGV0KiAoKGtleXNwYWNlLW5hbWVzIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChjbHVzdGVyIChjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lIGNhc3NhbmRyYSkpCisgICAgICAgICAgICh2ZXJzaW9uIChjYXNzYW5kcmE6ZGVzY3JpYmUtdmVyc2lvbiBjYXNzYW5kcmEpKQorICAgICAgICAgICAoa2V5c3BhY2UtZGVzY3JpcHRpb25zIChsb29wIGZvciBzcGFjZSBpbiBrZXlzcGFjZS1uYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZSBjYXNzYW5kcmEgc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkgdmFsdWUpKSkpKSkpKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mY29ubmVjdGlvbiB0byA6IH5hIiBjYXNzYW5kcmEpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZ2ZXJzaW9uIDogfmEiIHZlcnNpb24pCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjbHVzdGVyIDogfmEiIGNsdXN0ZXIpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZrZXlzcGFjZXN+e357fiV+JXNwYWNlOiB+YX5Ae34lICB+e35hIDp+QHt+MjB0fjp3fl5+JX59fn1+fX59fn0iIGtleXNwYWNlLWRlc2NyaXB0aW9ucykpKSkKKworOzs7IChkZXNjcmliZS1jYXNzYW5kcmEgKmMtbG9jYXRpb24qKQpkaWZmIC0tZ2l0IGEvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2ggYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDk1ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1lCisKK2lmIFtbICEgLWUgcXVpY2tsaXNwLmxpc3AgXV07IHRoZW4gY3VybCAtTyBodHRwczovL2JldGEucXVpY2tsaXNwLm9yZy9xdWlja2xpc3AubGlzcDsgZmkKK3NiY2wgLS1sb2FkIHF1aWNrbGlzcC5saXNwIFwKKyAgICAgLS1ldmFsICIoaWdub3JlLWVycm9ycyAocXVpY2tsaXNwLXF1aWNrc3RhcnQ6aW5zdGFsbCA6cGF0aCBcInF1aWNrbGlzcC9cIikpIiBcCisgICAgIC0tZXZhbCAiKGxvYWQgXCJxdWlja2xpc3Avc2V0dXAubGlzcFwiKSIgXAorICAgICAtLWV2YWwgIihxdWlja2xpc3A6YnVuZGxlLXN5c3RlbXMgJygjOnB1cmkgIzp1c29ja2V0ICM6Y2xvc2VyLW1vcCAjOnRyaXZpYWwtdXRmLTggIzppZWVlLWZsb2F0cyAjOnRyaXZpYWwtZ3JheS1zdHJlYW1zICM6YWxleGFuZHJpYSAjOmJvcmRlYXV4LXRocmVhZHMgIzpjbC1wcGNyZSAjOmZpYXNjbyAjOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKSA6dG8gXCJleHRlcm5hbHMvXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aXQpIiBcCisgICAgIC0tbm8tdXNlcmluaXQKK2lmIFtbICEgLWUgYmFja3BvcnQtdXBkYXRlLnppcCBdXTsgdGhlbgorICAgIGN1cmwgLU8gLUwgaHR0cHM6Ly9naXRodWIuY29tL1R1cnRsZVdhcmVQTC9kZS5zZXRmLnRocmlmdC9hcmNoaXZlL2JhY2twb3J0LXVwZGF0ZS56aXA7CitmaQorbWtkaXIgLXAgbGliCit1bnppcCAtdSBiYWNrcG9ydC11cGRhdGUuemlwIC1kIGxpYgpkaWZmIC0tZ2l0IGEvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIGIvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmM3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKQEAgLTAsMCArMSwyMyBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgSnVzdCBhIHNjcmlwdCBmb3IgbG9hZGluZyB0aGUgbGlicmFyeSBpdHNlbGYsIHVzaW5nIGJ1bmRsZWQgZGVwZW5kZW5jaWVzLgorOzs7OyBUaGlzIGlzIGhlcmUgZm9yIHdoZW4gd2Ugd2FudCB0byBidWlsZCB0aGUgc2VsZi10ZXN0IGFuZCBjcm9zcy10ZXN0Cis7Ozs7IGJpbmFyaWVzLgorCisocmVxdWlyZSAiYXNkZiIpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImV4dGVybmFscy9idW5kbGUubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImxpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGhyaWZ0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCmRpZmYgLS1naXQgYS9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AgYi9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3YTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApAQCAtMCwwICsxLDMxIEBACis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgVGhpcyBmaWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGJpbmFyeSB0aGF0IHJ1bnMgYWxsIHNlbGYtdGVzdHMuIFRoZQorOzs7OyBiaW5hcnkgaXMgdGhlbiBtZWFudCB0byBiZSBob29rZWQgdXAgdG8gVGhyaWZ0J3MgYG1ha2UgY2hlY2tgIGZhY2lsaXR5LAorOzs7OyBidXQgY2FuIGVhc2lseSBiZSBydW4gb24gaXRzIG93biBhcyB3ZWxsLgorCisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90ZXN0L3RocmlmdC10ZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdGVzdCkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgIChsZXQgKChyZXN1bHQgKGlmIChmaWFzY286cnVuLXRlc3RzICd0aHJpZnQtdGVzdCkgMCAtMSkpKQorICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpCisKKyhjbG9uOmR1bXAgInJ1bi10ZXN0cyIgbWFpbikKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9SRUFETUUgYi9saWIvY29jb2EvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvY29jb2EvUkVBRE1FCnJlbmFtZSB0byBsaWIvY29jb2EvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk4ODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JEb21haW47CisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUQXBwbGljYXRpb25FcnJvcikgeworICBUQXBwbGljYXRpb25FcnJvclVua25vd24gICAgICAgICAgICAgICAgPSAwLAorICBUQXBwbGljYXRpb25FcnJvclVua25vd25NZXRob2QgICAgICAgICAgPSAxLAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRNZXNzYWdlVHlwZSAgICAgPSAyLAorICBUQXBwbGljYXRpb25FcnJvcldyb25nTWV0aG9kTmFtZSAgICAgICAgPSAzLAorICBUQXBwbGljYXRpb25FcnJvckJhZFNlcXVlbmNlSWQgICAgICAgICAgPSA0LAorICBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQgICAgICAgICAgPSA1LAorICBUQXBwbGljYXRpb25FcnJvckludGVybmFsRXJyb3IgICAgICAgICAgPSA2LAorICBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3IgICAgICAgICAgPSA3LAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRUcmFuc2Zvcm0gICAgICAgPSA4LAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRQcm90b2NvbCAgICAgICAgPSA5LAorICBUQXBwbGljYXRpb25FcnJvclVuc3VwcG9ydGVkQ2xpZW50VHlwZSAgPSAxMCwKK307CisKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTsKKworCitAaW50ZXJmYWNlIE5TRXJyb3IgKFRBcHBsaWNhdGlvbkVycm9yKQorCitAcHJvcGVydHkgKHJlYWRvbmx5LCBjb3B5KSBOU1N0cmluZyAqbmFtZTsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpyZWFzb247CisKKysoaW5zdGFuY2V0eXBlKSBlcnJvcldpdGhUeXBlOihUQXBwbGljYXRpb25FcnJvcil0eXBlIHJlYXNvbjooTlNTdHJpbmcgKilyZWFzb247CisKKysoaW5zdGFuY2V0eXBlKSByZWFkOihpZDxUUHJvdG9jb2w+KXByb3RvY29sOworCistKEJPT0wpIHdyaXRlOihpZDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5tIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MGJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXJyb3IuaCIKKyNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKKworCitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JEb21haW4gPSBAIlRBcHBsaWNhdGlvbkVycm9yRG9tYWluIjsKKworCitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5ID0gQCJuYW1lIjsKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvclJlYXNvbktleSA9IEAicmVhc29uIjsKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleSA9IEAibWV0aG9kIjsKKworCitAaW1wbGVtZW50YXRpb24gTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKKy0oTlNTdHJpbmcgKikgcmVhc29uCit7CisgIHJldHVybiBzZWxmLnVzZXJJbmZvW1RBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5XTsKK30KKworLShOU1N0cmluZyAqKSBuYW1lCit7CisgIHJldHVybiBzZWxmLnVzZXJJbmZvW1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleV07Cit9CisKKysoaW5zdGFuY2V0eXBlKSBlcnJvcldpdGhUeXBlOihUQXBwbGljYXRpb25FcnJvcil0eXBlIHJlYXNvbjooTlNTdHJpbmcgKilyZWFzb24KK3sKKyAgTlNTdHJpbmcgKm5hbWU7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZDoKKyAgICBuYW1lID0gQCJVbmtub3duIE1ldGhvZCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludmFsaWRNZXNzYWdlVHlwZToKKyAgICBuYW1lID0gQCJJbnZhbGlkIE1lc3NhZ2UgVHlwZSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvcldyb25nTWV0aG9kTmFtZToKKyAgICBuYW1lID0gQCJXcm9uZyBNZXRob2QgTmFtZSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckJhZFNlcXVlbmNlSWQ6CisgICAgbmFtZSA9IEAiQmFkIFNlcXVlbmNlIElEIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdDoKKyAgICBuYW1lID0gQCJNaXNzaW5nIFJlc3VsdCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludGVybmFsRXJyb3I6CisgICAgbmFtZSA9IEAiSW50ZXJuYWwgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JQcm90b2NvbEVycm9yOgorICAgIG5hbWUgPSBAIlByb3RvY29sIEVycm9yIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybToKKyAgICBuYW1lID0gQCJJbnZhbGlkIFRyYW5zZm9ybSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludmFsaWRQcm90b2NvbDoKKyAgICBuYW1lID0gQCJJbnZhbGlkIFByb3RvY29sIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlOgorICAgIG5hbWUgPSBAIlVuc3VwcG9ydGVkIENsaWVudCBUeXBlIjsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIG5hbWUgPSBAIlVua25vd24iOworICAgIGJyZWFrOworICB9CisKKyAgTlNEaWN0aW9uYXJ5ICp1c2VySW5mbzsKKyAgaWYgKHJlYXNvbikgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZSwKKyAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk6cmVhc29ufTsKKyAgfQorICBlbHNlIHsKKyAgICB1c2VySW5mbyA9IEB7VEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5Om5hbWV9OworICB9CisKKyAgcmV0dXJuIFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUQXBwbGljYXRpb25FcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzp1c2VySW5mb107Cit9CisKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2wKK3sKKyAgTlNTdHJpbmcgKnJlYXNvbiA9IG5pbDsKKyAgU0ludDMyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclVua25vd247CisgIFNJbnQzMiBmaWVsZFR5cGU7CisgIFNJbnQzMiBmaWVsZElEOworCisgIE5TRXJyb3IgKmVycm9yOworICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOk5VTEwgZXJyb3I6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6TlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTomZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiZmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiZlcnJvcl0pCisgICAgeworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlU1RSSU5HKSB7CisgICAgICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJpbmc6JnJlYXNvbiBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVJMzIpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkzMjomdHlwZSBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEVuZDomZXJyb3JdKSB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgIH0KKworICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0RW5kOiZlcnJvcl0pIHsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoVHlwZTp0eXBlIHJlYXNvbjpyZWFzb25dOworfQorCisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpAIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHNlbGYubG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbmlsKSB7CisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6QCJtZXNzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOlRUeXBlU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MSBlcnJvcjplcnJvcl0pCisgICAgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3Byb3RvY29sIHdyaXRlU3RyaW5nOnNlbGYubG9jYWxpemVkRGVzY3JpcHRpb24gZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAInR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOlRUeXBlSTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVJMzI6KFNJbnQzMilzZWxmLmNvZGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkU3RvcDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZVN0cnVjdEVuZDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxNjQxZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLQotZW51bSB7Ci0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOID0gMCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EID0gMSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FID0gMywKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRCA9IDQsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCA9IDUKLX07Ci0KLS8vIEZJWE1FCi1AaW50ZXJmYWNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotICBpbnQgbVR5cGU7Ci19Ci0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSBtZXNzYWdlOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2ODc1My4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xVdGlsLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24KLQotLSAoaWQpIGluaXRXaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICBtVHlwZSA9IHR5cGU7Ci0KLSAgTlNTdHJpbmcgKiBuYW1lOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0Q6Ci0gICAgbmFtZSA9IEAiVW5rbm93biBtZXRob2QiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX01FU1NBR0VfVFlQRToKLSAgICBuYW1lID0gQCJJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FOgotICAgIG5hbWUgPSBAIldyb25nIG1ldGhvZCBuYW1lIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEOgotICAgIG5hbWUgPSBAIkJhZCBzZXF1ZW5jZSBJRCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUOgotICAgIG5hbWUgPSBAIk1pc3NpbmcgcmVzdWx0IjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBuYW1lID0gQCJVbmtub3duIjsKLSAgICBicmVhazsKLSAgfQotCi0gIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOiBuYW1lIHJlYXNvbjogcmVhc29uIHVzZXJJbmZvOiBuaWxdOwotICByZXR1cm4gc2VsZjsKLX0KLQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBOU1N0cmluZyAqIHJlYXNvbiA9IG5pbDsKLSAgaW50IHR5cGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTjsKLSAgaW50IGZpZWxkVHlwZTsKLSAgaW50IGZpZWxkSUQ7Ci0KLSAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTAotICAgICAgICAgICAgICB0eXBlOiAmZmllbGRUeXBlCi0gICAgICAgICAgICAgIGZpZWxkSUQ6ICZmaWVsZElEXTsKLSAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUUklORykgewotICAgICAgICByZWFzb24gPSBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfSTMyKSB7Ci0gICAgICAgIHR5cGUgPSBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKLSAgfQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0KLSAgcmV0dXJuIFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IHR5cGUgcmVhc29uOiByZWFzb25dOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIl07Ci0KLSAgaWYgKFtzZWxmIHJlYXNvbl0gIT0gbmlsKSB7Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAIm1lc3NhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU6IFRUeXBlX1NUUklORwotICAgICAgICAgICAgICAgICBmaWVsZElEOiAxXTsKLSAgICBbcHJvdG9jb2wgd3JpdGVTdHJpbmc6IFtzZWxmIHJlYXNvbl1dOwotICAgIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLSAgfQotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQCJ0eXBlIgotICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfSTMyCi0gICAgICAgICAgICAgICBmaWVsZElEOiAyXTsKLSAgW3Byb3RvY29sIHdyaXRlSTMyOiBtVHlwZV07Ci0gIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLQotICBbcHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOwotICBbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtbW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhUeXBlOiB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXSBhdXRvcmVsZWFzZV07Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjczYWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorCitAaW50ZXJmYWNlIFRCYXNlQ2xpZW50IDogTlNPYmplY3QKKworLShOU0Vycm9yICopIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOihpZDxUUHJvdG9jb2w+KXByb3RvY29sOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5Y2FlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRCYXNlQ2xpZW50LmgiCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgKCkKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEJhc2VDbGllbnQKKworLShOU0Vycm9yICopIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOihpZDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKK3sKKyAgTlNFcnJvciAqdGhyaWZ0RXJyb3I7CisKKyAgU0ludDMyIG1zZ1R5cGUgPSAwOworICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5pbCB0eXBlOiZtc2dUeXBlIHNlcXVlbmNlSUQ6TlVMTCBlcnJvcjomdGhyaWZ0RXJyb3JdKSB7CisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlRVhDRVBUSU9OKSB7CisKKyAgICB0aHJpZnRFcnJvciA9IFtOU0Vycm9yIHJlYWQ6aW5Qcm90b2NvbF07CisKKyAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDpOVUxMXTsKKworICAgIHJldHVybiB0aHJpZnRFcnJvcjsKKyAgfQorCisgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJpbmFyeS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEJpbmFyeS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGEzNjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0CkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUQmluYXJ5IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNUUklORyB9CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogTlNEYXRhCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBOU0RhdGEoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mRmlsZSBmaWxlOiBTdHJpbmcsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mRmlsZTogZmlsZSwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGluaXQoY29udGVudHNPZlVSTCBVUkw6IE5TVVJMLCBvcHRpb25zOiBOU0RhdGFSZWFkaW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHNlbGYuc3RvcmFnZSA9IHRyeSBOU0RhdGEoY29udGVudHNPZlVSTDogVVJMLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdD8oYmFzZTY0RW5jb2RlZERhdGEgYmFzZTY0RGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFCYXNlNjREZWNvZGluZ09wdGlvbnMgPSBbXSkgeworICAgIGd1YXJkIGxldCBzdG9yYWdlID0gTlNEYXRhKGJhc2U2NEVuY29kZWREYXRhOiBiYXNlNjREYXRhLCBvcHRpb25zOiBvcHRpb25zKSBlbHNlIHsKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgc2VsZi5zdG9yYWdlID0gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgaW5pdChkYXRhOiBOU0RhdGEpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBkYXRhCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgbGVuZ3RoIDogSW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5sZW5ndGgKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmhhc2hWYWx1ZQorICB9CisgIAorICBwdWJsaWMgdmFyIGJ5dGVzIDogVW5zYWZlUG9pbnRlcjxWb2lkPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UuYnl0ZXMKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgbGVuZ3RoOiBJbnQpIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgbGVuZ3RoOiBsZW5ndGgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGdldEJ5dGVzKGJ1ZmZlcjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8Vm9pZD4sIHJhbmdlOiBSYW5nZTxJbnQ+KSB7CisgICAgc3RvcmFnZS5nZXRCeXRlcyhidWZmZXIsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ViQmluYXJ5V2l0aFJhbmdlKHJhbmdlOiBSYW5nZTxJbnQ+KSAtPiBUQmluYXJ5IHsKKyAgICByZXR1cm4gVEJpbmFyeShkYXRhOiBzdG9yYWdlLnN1YmRhdGFXaXRoUmFuZ2UoTlNSYW5nZShyYW5nZSkpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvRmlsZShwYXRoOiBTdHJpbmcsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb0ZpbGUocGF0aCwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVUb1VSTCh1cmw6IE5TVVJMLCBvcHRpb25zOiBOU0RhdGFXcml0aW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHRyeSBzdG9yYWdlLndyaXRlVG9VUkwodXJsLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByYW5nZU9mRGF0YShkYXRhVG9GaW5kIGRhdGE6IE5TRGF0YSwgb3B0aW9uczogTlNEYXRhU2VhcmNoT3B0aW9ucywgcmFuZ2U6IFJhbmdlPEludD4pIC0+IFJhbmdlPEludD4/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yYW5nZU9mRGF0YShkYXRhLCBvcHRpb25zOiBvcHRpb25zLCByYW5nZTogTlNSYW5nZShyYW5nZSkpLnRvUmFuZ2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBlbnVtZXJhdGVCeXRlUmFuZ2VzVXNpbmdCbG9jayhibG9jazogKFVuc2FmZVBvaW50ZXI8Vm9pZD4sIFJhbmdlPEludD4sIGlub3V0IEJvb2wpIC0+IFZvaWQpIHsKKyAgICBzdG9yYWdlLmVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrIHsgYnl0ZXMsIHJhbmdlLCBzdG9wIGluCisgICAgICB2YXIgc3RvcFRtcCA9IEJvb2woc3RvcC5tZW1vcnkpCisgICAgICBibG9jayhieXRlcywgcmFuZ2UudG9SYW5nZSgpISwgJnN0b3BUbXApCisgICAgICBzdG9wLm1lbW9yeSA9IE9iakNCb29sKHN0b3BUbXApCisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUQmluYXJ5IHsKKyAgICB2YXIgZGF0YSA6IE5TRGF0YT8KKyAgICB0cnkgcHJvdG8ucmVhZEJpbmFyeSgmZGF0YSkKKyAgICByZXR1cm4gVEJpbmFyeShkYXRhOiBkYXRhISkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRCaW5hcnksIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVCaW5hcnkodmFsdWUuc3RvcmFnZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFRCaW5hcnkgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT0obGhzOiBUQmluYXJ5LCByaHM6IFRCaW5hcnkpIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQgYi9saWIvY29jb2Evc3JjL1RFbnVtLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmE1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RFbnVtLnN3aWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVEVudW0gOiBUU2VyaWFsaXphYmxlIHsKKyAgCit9CisKK3B1YmxpYyBleHRlbnNpb24gVEVudW0geworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIFRUeXBlLkkzMiB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiNzJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworCitleHRlcm4gTlNTdHJpbmcgKlRFcnJvckRvbWFpbjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmN2Y5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RFcnJvci5tCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRFcnJvckRvbWFpbiA9IEAiVEVycm9yRG9tYWluIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NmY0ZmEuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi1AaW50ZXJmYWNlIFRFeGNlcHRpb24gOiBOU0V4Y2VwdGlvbiB7Ci19Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWU7Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzg0MTk5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBURXhjZXB0aW9uCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLXsKLSAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lIHJlYXNvbjogQCJ1bmtub3duIiBlcnJvcjogbmlsXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lIHJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcgotewotICBOU0RpY3Rpb25hcnkgKiB1c2VySW5mbyA9IG5pbDsKLSAgaWYgKGVycm9yICE9IG5pbCkgewotICAgIHVzZXJJbmZvID0gW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDogZXJyb3IgZm9yS2V5OiBAImVycm9yIl07Ci0gIH0KLQotICByZXR1cm4gW3N1cGVyIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lCi0gICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb24KLSAgICAgICAgICAgICAgICB1c2VySW5mbzogdXNlckluZm9dOwotfQotCi0KLS0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCi17Ci0gIE5TTXV0YWJsZVN0cmluZyAqIHJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogW3NlbGYgbmFtZV1dOwotICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCI6ICVAIiwgW3NlbGYgcmVhc29uXV07Ci0gIGlmIChbc2VsZiB1c2VySW5mb10gIT0gbmlsKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6IEAiXG4gIHVzZXJJbmZvID0gJUAiLCBbc2VsZiB1c2VySW5mb11dOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UTGlzdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDViZDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTGlzdC5zd2lmdApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKKworcHVibGljIHN0cnVjdCBUTGlzdDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBNdXRhYmxlQ29sbGVjdGlvblR5cGUsIEhhc2hhYmxlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLkxJU1QgfQorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBBcnJheTxFbGVtZW50PgorCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIAorICBwdWJsaWMgdmFyIGVuZEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcG9zaXRpb25dID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShzdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kKG5ld0VsZW1lbnQ6IEVsZW1lbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuYXBwZW5kKG5ld0VsZW1lbnQpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGFwcGVuZENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3c3RvcmFnZTogQykgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmRDb250ZW50c09mKG5ld3N0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChuZXdFbGVtZW50OiBFbGVtZW50LCBhdEluZGV4IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0KG5ld0VsZW1lbnQsIGF0SW5kZXg6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnRDb250ZW50c09mPEMgOiBDb2xsZWN0aW9uVHlwZSB3aGVyZSBDLkdlbmVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQ+KG5ld0VsZW1lbnRzOiBDLCBhdCBpbmRleDogSW50KSB7CisgICAgc2VsZi5zdG9yYWdlLmluc2VydENvbnRlbnRzT2YobmV3RWxlbWVudHMsIGF0OiBpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQWxsKGtlZXBDYXBhY2l0eSBrZWVwQ2FwYWNpdHk6IEJvb2wgPSB0cnVlKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogSW5kZXgpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlRmlyc3QobjogSW50ID0gMCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVGaXJzdChuKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVMYXN0KCkgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHNlbGYuc3RvcmFnZS5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlUmFuZ2Uoc3ViUmFuZ2U6IFJhbmdlPEluZGV4PikgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVSYW5nZShzdWJSYW5nZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlc2VydmVDYXBhY2l0eShtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRMaXN0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogVFByb3RvY29sRXh0ZW5kZWRFcnJvci5VbmV4cGVjdGVkVHlwZS5yYXdWYWx1ZSldKQorICAgIH0KKyAgICB2YXIgbGlzdCA9IFRMaXN0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxpc3Quc3RvcmFnZS5hcHBlbmQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICByZXR1cm4gbGlzdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVExpc3QsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUxpc3RFbmQoKQorICB9Cit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRMaXN0PEVsZW1lbnQ+LCByaHM6IFRMaXN0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RNYXAuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RNYXAuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZTc0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBzdHJ1Y3QgVE1hcDxLZXkgOiBUU2VyaWFsaXphYmxlLCBWYWx1ZSA6IFRTZXJpYWxpemFibGU+IDogQ29sbGVjdGlvblR5cGUsIERpY3Rpb25hcnlMaXRlcmFsQ29udmVydGlibGUsIFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5NQVAgfQorCisgIHR5cGVhbGlhcyBTdG9yYWdlID0gRGljdGlvbmFyeTxLZXksIFZhbHVlPgorCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisKKyAgcHVibGljIHR5cGVhbGlhcyBFbGVtZW50ID0gU3RvcmFnZS5FbGVtZW50CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogU3RvcmFnZQorCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisKKyAgcHVibGljIHZhciBrZXlzOiBMYXp5TWFwQ29sbGVjdGlvbjxbS2V5IDogVmFsdWVdLCBLZXk+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5rZXlzCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgdmFsdWVzOiBMYXp5TWFwQ29sbGVjdGlvbjxbS2V5IDogVmFsdWVdLCBWYWx1ZT4geworICAgIHJldHVybiBzdG9yYWdlLnZhbHVlcworICB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRpY3Rpb25hcnlMaXRlcmFsIGVsZW1lbnRzOiAoS2V5LCBWYWx1ZSkuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBlbGVtZW50cyB7CisgICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGluaXQobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShtaW5pbXVtQ2FwYWNpdHk6IG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleEZvcktleShrZXk6IEtleSkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleEZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtrZXldCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW2tleV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZVZhbHVlKHZhbHVlOiBWYWx1ZSwgZm9yS2V5IGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiB1cGRhdGVWYWx1ZSh2YWx1ZSwgZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoaW5kZXg6IERpY3Rpb25hcnlJbmRleDxLZXksIFZhbHVlPikgLT4gKEtleSwgVmFsdWUpIHsKKyAgICByZXR1cm4gcmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlVmFsdWVGb3JLZXkoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlVmFsdWVGb3JLZXkoa2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgc3RvcmFnZS5yZW1vdmVBbGwoa2VlcENhcGFjaXR5OiBrZWVwQ2FwYWNpdHkpCisgIH0KKworICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGtleS5oYXNoVmFsdWUKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdmFsdWUuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVE1hcCB7CisgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRNYXBCZWdpbigpCisgICAgaWYga2V5VHlwZSAhPSBLZXkudGhyaWZ0VHlwZSB8fCB2YWx1ZVR5cGUgIT0gVmFsdWUudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBtYXAgPSBUTWFwKCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQga2V5ID0gdHJ5IEtleS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBsZXQgdmFsdWUgPSB0cnkgVmFsdWUucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbWFwLnN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTWFwRW5kKCkKKyAgICByZXR1cm4gbWFwCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTWFwLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZShLZXkudGhyaWZ0VHlwZSwgdmFsdWVUeXBlOiBWYWx1ZS50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEtleS53cml0ZVZhbHVlKGtleSwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgICB0cnkgVmFsdWUud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZU1hcEVuZCgpCisgIH0KKyAgCit9CisKKworZXh0ZW5zaW9uIFRNYXAgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08S2V5LCBWYWx1ZT4obGhzOiBUTWFwPEtleSxWYWx1ZT4sIHJoczogVE1hcDxLZXksIFZhbHVlPikgLT4gQm9vbCB7CisgIGlmIGxocy5jb3VudCAhPSByaHMuY291bnQgeworICAgIHJldHVybiBmYWxzZQorICB9CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yLmggYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaAppbmRleCA5ODBiZTk0Li4yMGM3MmUyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaApAQCAtMjAsMTAgKzIwLDE2IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm90b2NvbC5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCiAKIEBwcm90b2NvbCBUUHJvY2Vzc29yIDxOU09iamVjdD4KIAotLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sCi0gICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOworLShCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOihpZCA8VFByb3RvY29sPilpblByb3RvY29sCisgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAppbmRleCAyOWQxMmIzLi44NTAyMGE1IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKKysrIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCkBAIC0yMCw4ICsyMCwxNCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQHByb3RvY29sIFRQcm9jZXNzb3JGYWN0b3J5IDxOU09iamVjdD4KIAotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvdG9jb2wuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc1ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgZXh0ZW5zaW9uIFRQcm90b2NvbCB7CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8KKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2VxdWVuY2VJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWUoJm5hbWUsIHR5cGU6ICZ0eXBlLCBzZXF1ZW5jZUlEOiAmc2VxdWVuY2VJRCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUgYXMgU3RyaW5nISwgVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChzZXF1ZW5jZUlEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lOiBTdHJpbmcsIHR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWUsIHR5cGU6IHR5cGUucmF3VmFsdWUsIHNlcXVlbmNlSUQ6IEludDMyKHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZz8pIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPyA9IG5pbAorICAgIAorICAgIHRyeSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmc/KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPywgVFR5cGUsIEludCkgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgdmFyIHR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIGZpZWxkSUQgOiBJbnQzMiA9IC0xCisgICAgCisgICAgdHJ5IHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIGZpZWxkSUQ6ICZmaWVsZElEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmc/LCBUVHlwZShyYXdWYWx1ZTogdHlwZSkhLCBJbnQoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgZmllbGRJRDogSW50MzIoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIHZhciBrZXlUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciB2YWx1ZVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZSgma2V5VHlwZSwgdmFsdWVUeXBlOiAmdmFsdWVUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBrZXlUeXBlKSEsIFRUeXBlKHJhd1ZhbHVlOiB2YWx1ZVR5cGUpISwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZShrZXlUeXBlLnJhd1ZhbHVlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlKCZlbGVtZW50VHlwZSwgc2l6ZTogJnNpemUpCisgICAgCisgICAgcmV0dXJuIChUVHlwZShyYXdWYWx1ZTogZWxlbWVudFR5cGUpISwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIHZhciBlbGVtZW50VHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGUoZWxlbWVudFR5cGUucmF3VmFsdWUsIHNpemU6IEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQsIG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGlkOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgZmllbGRJRDogaWQpCisgICAgdHJ5IHdyaXRlVmFsdWUodmFsdWUpCisgICAgdHJ5IHdyaXRlRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4oKSB0aHJvd3MgLT4gVCB7CisgICAgcmV0dXJuIHRyeSBULnJlYWRWYWx1ZUZyb21Qcm90b2NvbChzZWxmKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVZhbHVlPFQ6IFRTZXJpYWxpemFibGU+KHZhbHVlOiBUKSB0aHJvd3MgeworICAgIHRyeSBULndyaXRlVmFsdWUodmFsdWUsIHRvUHJvdG9jb2w6IHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgeworICAgIAorICAgIGxldCAoXywgdHlwZSwgXykgPSB0cnkgcmVhZE1lc3NhZ2VCZWdpbigpOworICAgIAorICAgIGlmIHR5cGUgPT0gLkVYQ0VQVElPTiB7CisgICAgICBsZXQgeCA9IHRyeSByZWFkRXhjZXB0aW9uKCkKKyAgICAgIHRocm93IHgKKyAgICB9CisgICAgCisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHZhbGlkYXRlVmFsdWUodmFsdWU6IEFueT8sIG5hbWVkIG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICAKKyAgICBpZiB2YWx1ZSA9PSBuaWwgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLlVua25vd24ucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OiBuYW1lXSkKKyAgICB9CisgICAgCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRFeGNlcHRpb24oKSB0aHJvd3MgLT4gRXJyb3JUeXBlIHsKKyAgICAKKyAgICB2YXIgcmVhc29uIDogU3RyaW5nPworICAgIHZhciB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bgorICAgIAorICAgIHRyeSByZWFkU3RydWN0QmVnaW4oKQorICAgIAorICAgIGZpZWxkczogd2hpbGUgKHRydWUpIHsKKyAgICAgIAorICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIAorICAgICAgc3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIHsKKyAgICAgIGNhc2UgKF8sIC5TVE9QKToKKyAgICAgICAgYnJlYWsgZmllbGRzCisgICAgICAgIAorICAgICAgY2FzZSAoMSwgLlNUUklORyk6CisgICAgICAgIHJlYXNvbiA9IHRyeSByZWFkVmFsdWUoKSBhcyBTdHJpbmcKKyAgICAgICAgCisgICAgICBjYXNlICgyLCAuSTMyKToKKyAgICAgICAgbGV0IHR5cGVWYWwgPSB0cnkgcmVhZFZhbHVlKCkgYXMgSW50MzIKKyAgICAgICAgaWYgbGV0IHRtcCA9IFRBcHBsaWNhdGlvbkVycm9yKHJhd1ZhbHVlOiB0eXBlVmFsKSB7CisgICAgICAgICAgdHlwZSA9IHRtcAorICAgICAgICB9CisgICAgICAgIAorICAgICAgY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToKKyAgICAgICAgdHJ5IHNraXBUeXBlKHVua25vd25UeXBlKQorICAgICAgfQorICAgICAgCisgICAgICB0cnkgcmVhZEZpZWxkRW5kKCkKKyAgICB9CisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RFbmQoKQorICAgIAorICAgIHJldHVybiBOU0Vycm9yKHR5cGU6dHlwZSwgcmVhc29uOnJlYXNvbiA/PyAiIikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShuYW1lOiBTdHJpbmcsIHNlcXVlbmNlSUQ6IEludCwgZXg6IE5TRXJyb3IpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogLkVYQ0VQVElPTiwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB0cnkgZXgud3JpdGUoc2VsZikKKyAgICB0cnkgd3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc2tpcFR5cGUodHlwZTogVFR5cGUpIHRocm93cyB7CisgICAgdHJ5IFRQcm90b2NvbFV0aWwuc2tpcFR5cGUodHlwZS5yYXdWYWx1ZSwgb25Qcm90b2NvbDogc2VsZikKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNlcmlhbGl6YWJsZS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRmZDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0CkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTZXJpYWxpemFibGUgOiBIYXNoYWJsZSB7CisgIAorICBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IGdldCB9CisgIAorICBpbml0KCkKKyAgCisgIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU2VsZgorICAKKyAgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogU2VsZiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MKKyAgCit9CisKKworCitpbmZpeCBvcGVyYXRvciA/PT0ge30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVD8sIHJoczogVD8pIC0+IEJvb2wgeworICBpZiBsZXQgbCA9IGxocywgciA9IHJocyB7CisgICAgcmV0dXJuIGwgPT0gcgorICB9CisgIHJldHVybiBsaHMgPT0gcmhzCit9CisKK3B1YmxpYyBmdW5jID89PTxUOiBUU2VyaWFsaXphYmxlPihsaHM6IFQsIHJoczogVCkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMgPT0gcmhzCit9CisKKworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkJPT0wKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHZhciB2YWx1ZSA6IE9iakNCb29sID0gZmFsc2UKKyAgICB0cnkgcHJvdG8ucmVhZEJvb2woJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZS5ib29sVmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEJvb2wsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVCb29sKHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50OCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkJZVEUKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDggeworICAgIHZhciB2YWx1ZSA9IFVJbnQ4KCkKKyAgICB0cnkgcHJvdG8ucmVhZEJ5dGUoJnZhbHVlKQorICAgIHJldHVybiBJbnQ4KHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50OCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJ5dGUoVUludDgodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MTYgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMTYKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQxNigpCisgICAgdHJ5IHByb3RvLnJlYWRJMTYoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MTYsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMTYodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludCB7CisgICAgdmFyIHZhbHVlID0gSW50MzIoKQorICAgIHRyeSBwcm90by5yZWFkSTMyKCZ2YWx1ZSkKKyAgICByZXR1cm4gSW50KHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTMyKEludDMyKHZhbHVlKSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludDMyIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuSTMyCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQzMiB7CisgICAgdmFyIHZhbHVlID0gSW50MzIoKQorICAgIHRyeSBwcm90by5yZWFkSTMyKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludDMyLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTMyKHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50NjQgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JNjQKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQ2NCgpCisgICAgdHJ5IHByb3RvLnJlYWRJNjQoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50NjQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJNjQodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBEb3VibGUgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5ET1VCTEUKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgdmFyIHZhbHVlID0gRG91YmxlKCkKKyAgICB0cnkgcHJvdG8ucmVhZERvdWJsZSgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBEb3VibGUsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVEb3VibGUodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBTdHJpbmcgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5TVFJJTkcKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgdmFyIHZhbHVlIDogTlNTdHJpbmc/CisgICAgdHJ5IHByb3RvLnJlYWRTdHJpbmcoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZSBhcyEgU3RyaW5nCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTdHJpbmcsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJpbmcodmFsdWUpCisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTZXQuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTZXQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4MzNlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBzdHJ1Y3QgVFNldDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgQXJyYXlMaXRlcmFsQ29udmVydGlibGUsIFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5TRVQgfQorICAKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHR5cGVhbGlhcyBTdG9yYWdlID0gU2V0PEVsZW1lbnQ+CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogU3RvcmFnZQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICAKKyAgcHVibGljIGluaXQ8UyA6IFNlcXVlbmNlVHlwZSB3aGVyZSBTLkdlbmVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQ+KF8gc2VxdWVuY2U6IFMpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShzZXF1ZW5jZSkgICAgCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIAorICBwdWJsaWMgdmFyIGVuZEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnQobWVtYmVyOiBFbGVtZW50KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5zZXJ0KG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlKGVsZW1lbnQ6IEVsZW1lbnQpIC0+IEVsZW1lbnQ/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUoZWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQWxsKGtlZXBDYXBhY2l0eSBrZWVwQ2FwYWNpdHk6IEJvb2wgPSBmYWxzZSkgeworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogU2V0SW5kZXg8RWxlbWVudD4pIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLnVuaW9uKG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW50ZXJzZWN0KG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLmludGVyc2VjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGV4Y2x1c2l2ZU9yKG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLmV4Y2x1c2l2ZU9yKG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3VidHJhY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2Uuc3VidHJhY3Qob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnRlcnNlY3RJblBsYWNlKG90aGVyOiBUU2V0KSB7CisgICAgc3RvcmFnZS5pbnRlcnNlY3RJblBsYWNlKG90aGVyKQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZXhjbHVzaXZlT3JJblBsYWNlKG90aGVyOiBUU2V0KSB7CisgICAgc3RvcmFnZS5leGNsdXNpdmVPckluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBzdWJ0cmFjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLnN1YnRyYWN0SW5QbGFjZShvdGhlcikKKyAgfSAgCisKKyAgcHVibGljIGZ1bmMgaXNTdWJzZXRPZihvdGhlcjogVFNldCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaXNTdWJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyBmdW5jIGlzRGlzam9pbnRXaXRoKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc0Rpc2pvaW50V2l0aChvdGhlcikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaXNTdXBlcnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1cGVyc2V0T2Yob3RoZXIpCisgIH0KKworICBwdWJsaWMgdmFyIGlzRW1wdHk6IEJvb2wgeyByZXR1cm4gc3RvcmFnZS5pc0VtcHR5IH0KKworICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRTZXQgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRTZXRCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IGVsZW1lbnRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBzZXQgPSBUU2V0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVFNldCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogdmFsdWUuY291bnQpCisgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZVZhbHVlKGVsZW1lbnQsIHRvUHJvdG9jb2w6IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVTZXRFbmQoKQorICB9CisgIAorfQorCitleHRlbnNpb24gVFNldCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRTZXQ8RWxlbWVudD4sIHJoczogVFNldDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IGQzZTU1YzQuLmM3NWZhZDEgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDkgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb2Nlc3NvckZhY3RvcnkuaCIKIAotQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yRmFjdG9yeT4gewotICBpZDxUUHJvY2Vzc29yPiBtU2hhcmVkUHJvY2Vzc29yOwotfQorCitAaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PgorCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yOwogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0gYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KaW5kZXggYjM4ZTczYS4uM2Q1NWY0NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQpAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oIgogCiAKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yPiBzaGFyZWRQcm9jZXNzb3I7CisKK0BlbmQKKworCiBAaW1wbGVtZW50YXRpb24gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkKIAogCi0tIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6IChpZDxUUHJvY2Vzc29yPikgc2hhcmVkUHJvY2Vzc29yCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7CisgIGlmIChzZWxmKSB7CisgICAgX3NoYXJlZFByb2Nlc3NvciA9IHNoYXJlZFByb2Nlc3NvcjsKICAgfQotICAKLSAgbVNoYXJlZFByb2Nlc3NvciA9IFtzaGFyZWRQcm9jZXNzb3IgcmV0YWluXTsKKwogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tICh2b2lkKSBkZWFsbG9jCistKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAogewotICBbbVNoYXJlZFByb2Nlc3NvciByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IChpZDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gIHJldHVybiBbW21TaGFyZWRQcm9jZXNzb3IgcmV0YWluXSBhdXRvcmVsZWFzZV07CisgIHJldHVybiBfc2hhcmVkUHJvY2Vzc29yOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhNzJlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTdHJ1Y3QgOiBUU2VyaWFsaXphYmxlIHsKK30KKworCitwdWJsaWMgZXh0ZW5zaW9uIFRTdHJ1Y3QgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIFRUeXBlLlNUUlVDVCB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UaHJpZnQuaCBiL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxODI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIFRocmlmdFZlcnNpb24gQCIxLjAuMCIKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM1ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitAcHJvdG9jb2wgVEJhc2UgPE5TT2JqZWN0PgorCisvKioKKyAqIERlLXNlcmlhbGl6ZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKKyAqCisgKiBAcGFyYW0gaW5Qcm90b2NvbCBwcm90b2NvbCB1c2VkIGZvciByZWFkaW5nCisgKi8KKy0oQk9PTCkgcmVhZDooaWQgPFRQcm90b2NvbD4paW5Qcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworLyoqCisgKiBTZXJpYWxpemUgb2JqZWN0IHRvIHRoZSBnaXZlbiBwcm90b2NvbAorICoKKyAqIEBwYXJhbSBvdXRQcm90b2NvbCBvdXRwdXQgcHJvdG9jb2wgdXNlZCBmb3Igd3JpdGluZworICovCistKEJPT0wpIHdyaXRlOihpZCA8VFByb3RvY29sPilvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworCisvKioKKyAqIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkcworICovCistKEJPT0wpIHZhbGlkYXRlOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAppbmRleCA1MmNmMjY2Li5iYjkwZmFkIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTIxLDMxICsyMSwyOSBAQAogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogI2ltcG9ydCAiVFByb3RvY29sRmFjdG9yeS5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi1AaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbCA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+IHsKLSAgaWQgPFRUcmFuc3BvcnQ+IG1UcmFuc3BvcnQ7Ci0gIEJPT0wgbVN0cmljdFJlYWQ7Ci0gIEJPT0wgbVN0cmljdFdyaXRlOwotICBpbnQzMl90IG1NZXNzYWdlU2l6ZUxpbWl0OwotfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKK0BpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgc3RyaWN0UmVhZDogKEJPT0wpIHN0cmljdFJlYWQKLSAgICAgICAgICAgICBzdHJpY3RXcml0ZTogKEJPT0wpIHN0cmljdFdyaXRlOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgVUludDMyIG1lc3NhZ2VTaXplTGltaXQ7CiAKLS0gKGludDMyX3QpIG1lc3NhZ2VTaXplTGltaXQ7Ci0tICh2b2lkKSBzZXRNZXNzYWdlU2l6ZUxpbWl0OiAoaW50MzJfdCkgc2l6ZUxpbWl0OworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CisgICAgICAgICAgICAgc3RyaWN0UmVhZDooQk9PTClzdHJpY3RSZWFkCisgICAgICAgICAgICBzdHJpY3RXcml0ZTooQk9PTClzdHJpY3RXcml0ZTsKIAogQGVuZDsKIAogCi1AaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4gewotfQorQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CiAKLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKKysoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OwogCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCmluZGV4IGIyNzI3MTYuLjFmOWU1N2EgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQpAQCAtMTgsMTcgKzE4LDIwIEBACiAgKi8KIAogI2ltcG9ydCAiVEJpbmFyeVByb3RvY29sLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKIAogCi1zdGF0aWMgVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqIGdTaGFyZWRGYWN0b3J5ID0gbmlsOworc3RhdGljIFNJbnQzMiBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworc3RhdGljIFNJbnQzMiBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworCisKK3N0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpnU2hhcmVkRmFjdG9yeSA9IG5pbDsKKwogCiBAaW1wbGVtZW50YXRpb24gVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCi0rIChUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkgeworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkKK3sKICAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgewogICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKICAgfQpAQCAtMzYsMzU4ICszOSw1NTMgQEAKICAgcmV0dXJuIGdTaGFyZWRGYWN0b3J5OwogfQogCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0IHsKLSAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0XTsKKy0oTlNTdHJpbmcgKikgcHJvdG9jb2xOYW1lCit7CisgIHJldHVybiBAImJpbmFyeSI7Cit9CisKKy0oVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDp0cmFuc3BvcnRdOwogfQogCiBAZW5kCiAKIAorQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIEJPT0wgc3RyaWN0UmVhZDsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgQk9PTCBzdHJpY3RXcml0ZTsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudE1lc3NhZ2VOYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudEZpZWxkTmFtZTsKKworQGVuZAorCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2wKIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydCBzdHJpY3RSZWFkOiBOTyBzdHJpY3RXcml0ZTogTk9dOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6YVRyYW5zcG9ydCBzdHJpY3RSZWFkOk5PIHN0cmljdFdyaXRlOllFU107CiB9CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZQorLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl07Ci0gIG1TdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKLSAgbVN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIGlmIChzZWxmKSB7CisgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICBfc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgX3N0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdAorLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAogewotICByZXR1cm4gbU1lc3NhZ2VTaXplTGltaXQ7CisgIHJldHVybiBfdHJhbnNwb3J0OwogfQogCi0KLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQKKy0oTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6KGludClzaXplIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7Ci0gIG1NZXNzYWdlU2l6ZUxpbWl0ID0gc2l6ZUxpbWl0OwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21UcmFuc3BvcnQgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gbVRyYW5zcG9ydDsKLX0KLQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTogKGludCkgc2l6ZQotewotICBjaGFyICogYnVmZmVyID0gbWFsbG9jKHNpemUrMSk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluICVzLCBzaXplOiAlaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOzsKKyAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworICBpZiAoIWRhdGEpIHsKKyAgICBQUk9UT0NPTF9FUlJPUihuaWwsIFVua25vd24sIEAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwgc2l6ZSk7CiAgIH0KLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmZmVyIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICBidWZmZXJbc2l6ZV0gPSAwOwotICBOU1N0cmluZyAqIHJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzogYnVmZmVyXTsKLSAgZnJlZShidWZmZXIpOwotICByZXR1cm4gcmVzdWx0OworCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpkYXRhLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IobmlsLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YSBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRAorLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIDsKKwogICBpZiAoc2l6ZSA8IDApIHsKICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiJdOworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIEJhZFZlcnNpb24sIEAiQmFkIG1lc3NhZ2UgdmVyc2lvbiIpOwogICAgIH0KICAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAqdHlwZSA9IHZlcnNpb24gJiAweDAwRkY7CisgICAgICAqdHlwZSA9IHNpemUgJiAweDAwRkY7CiAgICAgfQotICAgIE5TU3RyaW5nICogbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nXTsKKyAgICBOU1N0cmluZyAqbWVzc2FnZU5hbWU7CisgICAgaWYgKCFbc2VsZiByZWFkU3RyaW5nOiZtZXNzYWdlTmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKG5hbWUgIT0gbmlsKSB7CisgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOworICAgIH0KKyAgfQorICBlbHNlIHsKKworICAgIGlmIChfc3RyaWN0UmVhZCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIEludmFsaWREYXRhLCBAIk1pc3NpbmcgbWVzc2FnZSB2ZXJzaW9uLCBvbGQgY2xpZW50PyIpOworICAgIH0KKworICAgIGlmIChfbWVzc2FnZVNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IF9tZXNzYWdlU2l6ZUxpbWl0KSB7CisgICAgICBQUk9UT0NPTF9FUlJPUihOTywgU2l6ZUxpbWl0LCBAIk1lc3NhZ2UgZXhjZWVlZHMgc2l6ZSBsaW1pdCBvZiAlZCIsIChpbnQpc2l6ZSk7CisgICAgfQorCisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6c2l6ZSBlcnJvcjplcnJvcl07CisgICAgaWYgKCFtZXNzYWdlTmFtZSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKwogICAgIGlmIChuYW1lICE9IE5VTEwpIHsKICAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7CisKKyAgICBVSW50OCBtZXNzYWdlVHlwZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZtZXNzYWdlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1TdHJpY3RSZWFkKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Il07Ci0gICAgfQotICAgIGlmIChbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSA+IDAgJiYgc2l6ZSA+IFtzZWxmIG1lc3NhZ2VTaXplTGltaXRdKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiTWVzc2FnZSB0b28gYmlnLiAgU2l6ZSBsaW1pdCBpczogJWQgTWVzc2FnZSBzaXplIGlzOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlU2l6ZUxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07Ci0gICAgfQotICAgIE5TU3RyaW5nICogbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nQm9keTogc2l6ZV07Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKLSAgICB9Ci0gICAgaW50IG1lc3NhZ2VUeXBlID0gW3NlbGYgcmVhZEJ5dGVdOworCiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewogICAgICAgKnR5cGUgPSBtZXNzYWdlVHlwZTsKICAgICB9Ci0gICAgaW50IHNlcUlEID0gW3NlbGYgcmVhZEkzMl07Ci0gICAgaWYgKHNlcXVlbmNlSUQgIT0gTlVMTCkgewotICAgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKLSAgICB9CiAgIH0KKworICBTSW50MzIgc2VxSUQ7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2VxSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKKyAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQorLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICpuYW1lID0gbmlsOwotICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZFN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgZmllbGRJRAorLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgeworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKG5hbWUgIT0gbmlsKSB7CiAgICAgKm5hbWUgPSBuaWw7CiAgIH0KLSAgaW50IGZ0ID0gW3NlbGYgcmVhZEJ5dGVdOworCisgIFVJbnQ4IGZ0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZmdCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KICAgaWYgKGZpZWxkVHlwZSAhPSBOVUxMKSB7CiAgICAgKmZpZWxkVHlwZSA9IGZ0OwogICB9Ci0gIGlmIChmdCAhPSBUVHlwZV9TVE9QKSB7Ci0gICAgaW50IGZpZCA9IFtzZWxmIHJlYWRJMTZdOworICBpZiAoZnQgIT0gVFR5cGVTVE9QKSB7CisgICAgU0ludDE2IGZpZDsKKyAgICBpZiAoIVtzZWxmIHJlYWRJMTY6JmZpZCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgaWYgKGZpZWxkSUQgIT0gTlVMTCkgewogICAgICAgKmZpZWxkSUQgPSBmaWQ7CiAgICAgfQogICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZEZpZWxkRW5kIHt9Ci0KLQotLSAoaW50MzJfdCkgcmVhZEkzMgorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgaTMycmRbNF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGkzMnJkIG9mZnNldDogMCBsZW5ndGg6IDRdOwotICByZXR1cm4KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgU0ludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU1N0cmluZyAqc3RyaW5nID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6c2l6ZSBlcnJvcjplcnJvcl07CisgIGlmICghc3RyaW5nKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgKnZhbHVlID0gc3RyaW5nOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IGJ5dGUgPT0gMTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMV07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPSBidWZmWzBdOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZlsyXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjIgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CisgICAgKChTSW50MTYpKGJ1ZmZbMF0gJiAweGZmKSA8PCA4KSB8CisgICAgKChTSW50MTYpKGJ1ZmZbMV0gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBpMzJyZFs0XTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDo0IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQogICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAogICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAogICAgICgoaTMycmRbM10gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nCistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOwotICByZXR1cm4gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOworICBVSW50OCBidWZmWzhdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KKyAgICAoKFNJbnQ2NCkoYnVmZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICgoU0ludDY0KShidWZmWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICgoU0ludDY0KShidWZmWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls2XSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbN10gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tIChCT09MKSByZWFkQm9vbAotewotICByZXR1cm4gW3NlbGYgcmVhZEJ5dGVdID09IDE7Ci19Ci0KLS0gKHVpbnQ4X3QpIHJlYWRCeXRlCi17Ci0gIHVpbnQ4X3QgbXlCeXRlOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiAmbXlCeXRlIG9mZnNldDogMCBsZW5ndGg6IDFdOwotICByZXR1cm4gbXlCeXRlOwotfQotCi0tIChzaG9ydCkgcmVhZEkxNgotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogMl07Ci0gIHJldHVybiAoc2hvcnQpCi0gICAgKCgoYnVmZlswXSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgKChidWZmWzFdICYgMHhmZikpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS0gKGludDY0X3QpIHJlYWRJNjQ7Ci17Ci0gIHVpbnQ4X3QgaTY0cmRbOF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGk2NHJkIG9mZnNldDogMCBsZW5ndGg6IDhdOwotICByZXR1cm4KLSAgICAoKGludDY0X3QpKGk2NHJkWzBdICYgMHhmZikgPDwgNTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzJdICYgMHhmZikgPDwgNDApIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzNdICYgMHhmZikgPDwgMzIpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzVdICYgMHhmZikgPDwgMTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzZdICYgMHhmZikgPDwgIDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzddICYgMHhmZikpOwotfQotCi0tIChkb3VibGUpIHJlYWREb3VibGU7CistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICAvLyBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW50byB0cm91YmxlIG9uIFBvd2VyUEM/Ci0gIGludDY0X3QgaWVlZTc1NCA9IFtzZWxmIHJlYWRJNjRdOwotICByZXR1cm4gKigoZG91YmxlICopICZpZWVlNzU0KTsKKyAgcmV0dXJuIFtzZWxmIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeQorLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQzMl90IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKLSAgdWludDhfdCAqIGJ1ZmYgPSBtYWxsb2Moc2l6ZSk7Ci0gIGlmIChidWZmID09IE5VTEwpIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbgotICAgICAgICAgICAgIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk91dCBvZiBtZW1vcnkuICBVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgdHJ5aW5nIHRvIHJlYWQgYmluYXJ5IGRhdGEuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogc2l6ZV07Ci0gIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6IGJ1ZmYgbGVuZ3RoOiBzaXplXTsKKworICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisgIGlmICghZGF0YSkgeworICAgIFBST1RPQ09MX0VSUk9SKE5PLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIChpbnQpc2l6ZSk7CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9IGRhdGE7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQga3QgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCB2dCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgVUludDgga3Q7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6Jmt0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZ0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZ2dCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChrZXlUeXBlICE9IE5VTEwpIHsKICAgICAqa2V5VHlwZSA9IGt0OwogICB9CisKICAgaWYgKHZhbHVlVHlwZSAhPSBOVUxMKSB7CiAgICAgKnZhbHVlVHlwZSA9IHZ0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHJlYWRNYXBFbmQge30KIAotCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZXQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGV0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZldCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChlbGVtZW50VHlwZSAhPSBOVUxMKSB7CiAgICAgKmVsZW1lbnRUeXBlID0gZXQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkU2V0RW5kIHt9Ci0KLQotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZXQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGV0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZldCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChlbGVtZW50VHlwZSAhPSBOVUxMKSB7CiAgICAgKmVsZW1lbnRUeXBlID0gZXQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTGlzdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlCistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbbVRyYW5zcG9ydCB3cml0ZTogJnZhbHVlIG9mZnNldDogMCBsZW5ndGg6IDFdOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRAorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG1TdHJpY3RXcml0ZSkgeworICBpZiAoX3N0cmljdFdyaXRlKSB7CisKICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2VUeXBlOwotICAgIFtzZWxmIHdyaXRlSTMyOiB2ZXJzaW9uXTsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOwotICB9IGVsc2UgewotICAgIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKLSAgICBbc2VsZiB3cml0ZUJ5dGU6IG1lc3NhZ2VUeXBlXTsKLSAgICBbc2VsZiB3cml0ZUkzMjogc2VxdWVuY2VJRF07CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnZlcnNpb24gZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlU3RyaW5nOm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6bWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZSB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCkgZmllbGRJRAorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZmllbGRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMTY6IGZpZWxkSURdOworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbNF07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpmaWVsZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbc2VsZiB3cml0ZUkxNjpmaWVsZElEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGU6KHZhbHVlID8gMSA6IDApIGVycm9yOmVycm9yXTsKK30KKworCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6JnZhbHVlIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkxNjooc2hvcnQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOworICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MiBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzRdOwogICBidWZmWzBdID0gMHhGRiAmICh2YWx1ZSA+PiAyNCk7CiAgIGJ1ZmZbMV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKICAgYnVmZlsyXSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7CiAgIGJ1ZmZbM10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDRdOwotfQogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZQotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOwotICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo0IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgYnVmZls4XTsKKyAgVUludDggYnVmZls4XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gNTYpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiA0OCk7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDQwKTsKQEAgLTM5Niw4MiArNTk0LDE0NyBAQAogICBidWZmWzVdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbNl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzddID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWUKKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAvLyBzcGl0IG91dCBJRUVFIDc1NCBiaXRzIC0gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGluIHRyb3VibGUgb24KLSAgLy8gUG93ZXJQQz8KLSAgW3NlbGYgd3JpdGVJNjQ6ICooKGludDY0X3QgKikgJnZhbHVlKV07CisgIC8vIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uIFBvd2VyUEM/CisgIGlmICghW3NlbGYgd3JpdGVJNjQ6KihTSW50NjQgKikmdmFsdWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICBpZiAodmFsdWUgIT0gbmlsKSB7Ci0gICAgY29uc3QgY2hhciAqIHV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHV0ZjhCeXRlcyk7Ci0gICAgW3NlbGYgd3JpdGVJMzI6IGxlbmd0aF07Ci0gICAgW21UcmFuc3BvcnQgd3JpdGU6ICh1aW50OF90ICopIHV0ZjhCeXRlcyBvZmZzZXQ6IDAgbGVuZ3RoOiBsZW5ndGhdOwotICB9IGVsc2UgeworCisgICAgY29uc3QgY2hhciAqdXRmOEJ5dGVzID0gW3ZhbHVlIFVURjhTdHJpbmddOworCisgICAgU0ludDMyIGxlbmd0aCA9IChTSW50MzIpc3RybGVuKHV0ZjhCeXRlcyk7CisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKil1dGY4Qnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihpbnQpbGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgICAgfQorCisgIH0KKyAgZWxzZSB7CisKICAgICAvLyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gd2UgZ2V0IG51bGwsIGxldCdzIHdyaXRlIG91dCBhIHplcm8KICAgICAvLyBsZW5ndGggc3RyaW5nCi0gICAgW3NlbGYgd3JpdGVJMzI6IDBdOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6MCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YQorLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVJMzI6IFtkYXRhIGxlbmd0aF1dOwotICBbbVRyYW5zcG9ydCB3cml0ZTogW2RhdGEgYnl0ZXNdIG9mZnNldDogMCBsZW5ndGg6IFtkYXRhIGxlbmd0aF1dOwotfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOihTSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wCi17Ci0gIFtzZWxmIHdyaXRlQnl0ZTogVFR5cGVfU1RPUF07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6ZGF0YS5ieXRlcyBvZmZzZXQ6MCBsZW5ndGg6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVGaWVsZEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBrZXlUeXBlXTsKLSAgW3NlbGYgd3JpdGVCeXRlOiB2YWx1ZVR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOlRUeXBlU1RPUCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZU1hcEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZWxlbWVudFR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlU2V0RW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBlbGVtZW50VHlwZV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6a2V5VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6dmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOihpbnQpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVMaXN0RW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogKHZhbHVlID8gMSA6IDApXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTplbGVtZW50VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjZhY2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRQcm90b2NvbEZhY3RvcnkuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworQGVuZAorCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CisKKysoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKKworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpAQCAtMCwwICsxLDk4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQ29tcGFjdFByb3RvY29sLmgiCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgorCitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9QUk9UT0NPTF9JRCA9IDB4ODI7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OID0gMTsKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1ZFUlNJT05fTUFTSyA9IDB4MUY7IC8vIDAwMDEgMTExMQorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwCitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9UWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKK3N0YXRpYyBjb25zdCBpbnQgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKK2VudW0geworICBUQ1R5cGVfU1RPUCA9IDB4MDAsCisgIFRDVHlwZV9CT09MRUFOX1RSVUUgPSAweDAxLAorICBUQ1R5cGVfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgIFRDVHlwZV9CWVRFID0gMHgwMywKKyAgVENUeXBlX0kxNiA9IDB4MDQsCisgIFRDVHlwZV9JMzIgPSAweDA1LAorICBUQ1R5cGVfSTY0ID0gMHgwNiwKKyAgVENUeXBlX0RPVUJMRSA9IDB4MDcsCisgIFRDVHlwZV9CSU5BUlkgPSAweDA4LAorICBUQ1R5cGVfTElTVCA9IDB4MDksCisgIFRDVHlwZV9TRVQgPSAweDBBLAorICBUQ1R5cGVfTUFQID0gMHgwQiwKKyAgVENUeXBlX1NUUlVDVCA9IDB4MEMsCit9OworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbEZhY3RvcnkKKworKyhUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5Cit7CisgIHN0YXRpYyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CisgIGlmIChnU2hhcmVkRmFjdG9yeSA9PSBuaWwpIHsKKyAgICBnU2hhcmVkRmFjdG9yeSA9IFtbVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOworICB9CisKKyAgcmV0dXJuIGdTaGFyZWRGYWN0b3J5OworfQorCistKE5TU3RyaW5nICopIHByb3RvY29sTmFtZQoreworICByZXR1cm4gQCJjb21wYWN0IjsKK30KKworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVENvbXBhY3RQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKK30KKworQGVuZAorCisKK0BpbnRlcmZhY2UgVENvbXBhY3RQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkIDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlQXJyYXkgKmxhc3RGaWVsZDsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgc2hvcnQgbGFzdEZpZWxkSWQ7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmJvb2xGaWVsZE5hbWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTnVtYmVyICpib29sRmllbGRUeXBlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkSWQ7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTnVtYmVyICpib29sZWFuVmFsdWU7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRNZXNzYWdlTmFtZTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQ29tcGFjdFByb3RvY29sCisKKy0oaWQpIGluaXQKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKworICBpZiAoc2VsZiAhPSBuaWwpIHsKKyAgICBfbGFzdEZpZWxkID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0Cit7CisgIHNlbGYgPSBbc2VsZiBpbml0XTsKKworICBpZiAoc2VsZiAhPSBuaWwpIHsKKyAgICBfdHJhbnNwb3J0ID0gYVRyYW5zcG9ydDsKKyAgfQorCisgIHJldHVybiBzZWxmOworfQorCistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Cit7CisgIHJldHVybiBfdHJhbnNwb3J0OworfQorCistKEJPT0wpIHdyaXRlQnl0ZURpcmVjdDooVUludDgpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKikmbiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlVmFyaW50MzI6KFVJbnQzMiluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBpMzJidWZbNV0gPSB7MH07CisgIFVJbnQzMiBpZHggPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGkzMmJ1ZltpZHgrK10gPSAoVUludDgpbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGkzMmJ1ZltpZHgrK10gPSAoVUludDgpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTppMzJidWYgb2Zmc2V0OjAgbGVuZ3RoOmlkeCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDpDT01QQUNUX1BST1RPQ09MX0lEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDooVUludDgpKChDT01QQUNUX1ZFUlNJT04gJiBDT01QQUNUX1ZFUlNJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChVSW50MzIpbWVzc2FnZVR5cGUpIDw8IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX01BU0spKSBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfbGFzdEZpZWxkIGFkZE9iamVjdDpAKF9sYXN0RmllbGRJZCldOworICBfbGFzdEZpZWxkSWQgPSAwOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfbGFzdEZpZWxkSWQgPSBbX2xhc3RGaWVsZC5sYXN0T2JqZWN0IHNob3J0VmFsdWVdOworICBbX2xhc3RGaWVsZCByZW1vdmVMYXN0T2JqZWN0XTsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUJPT0wpIHsKKyAgICBfYm9vbEZpZWxkTmFtZSA9IFtuYW1lIGNvcHldOworICAgIF9ib29sRmllbGRUeXBlID0gQChmaWVsZFR5cGUpOworICAgIF9ib29sRmllbGRJZCA9IEAoZmllbGRJRCk7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOjB4RkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07CisgIH0KK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOihVSW50OCl0eXBlT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZmllbGRUeXBlXSA6IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkSUQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGRJRCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgeworICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDooZmllbGRJRCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6dHlwZVRvV3JpdGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfbGFzdEZpZWxkSWQgPSBmaWVsZElEOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6VENUeXBlX1NUT1AgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6MCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6W3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTprZXlUeXBlXSA8PCA0IHwgW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTp2YWx1ZVR5cGVdIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKWIgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIEJPT0wgcmVzdWx0OworICBpZiAoX2Jvb2xGaWVsZElkICE9IG5pbCAmJiBfYm9vbEZpZWxkTmFtZSAhPSBuaWwgJiYgX2Jvb2xGaWVsZFR5cGUgIT0gbmlsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTpfYm9vbEZpZWxkTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6X2Jvb2xGaWVsZFR5cGUuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOl9ib29sRmllbGRJZC5pbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6YiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICAgIF9ib29sRmllbGRJZCA9IG5pbDsKKyAgICBfYm9vbEZpZWxkTmFtZSA9IG5pbDsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IG5pbDsKKyAgfQorICBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICByZXN1bHQgPSBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6YiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRSBlcnJvcjplcnJvcl07CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkxNjooU0ludDE2KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQzMjpbc2VsZiBpMzJUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDMyOltzZWxmIGkzMlRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50NjQ6W3NlbGYgaTY0VG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICAvLyBTYWZlIGJpdC1jYXN0aW5nIGRvdWJsZS0+dWludDY0CisKKyAgVUludDY0IGJpdHMgPSAwOworICBtZW1jcHkoJmJpdHMsICZ2YWx1ZSwgOCk7CisKKyAgYml0cyA9IE9TU3dhcEhvc3RUb0xpdHRsZUludDY0KGJpdHMpOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCaW5hcnk6W3ZhbHVlIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuaWw7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGN0eXBlRWxlbWVudCA9IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZWxlbWVudFR5cGVdOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6c2l6ZSA8PCA0IHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDoweGYwIHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlVmFyaW50NjQ6KFVJbnQ2NCluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCB2YXJpbnQ2NG91dFsxMF0gPSB7MH07CisgIGludCBpZHggPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoVUludDgpbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChVSW50OCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOnZhcmludDY0b3V0IG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgaTMyVG9aaWdaYWc6KFNJbnQzMiluCit7CisgIC8qCisgICAgIFppZ1phZyBlbmNvZGluZyBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZCBpbnRlZ2VycyBzbyB0aGF0CisgICAgIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCisgICAgIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAorICAgICAiemlnLXphZ3MiIGJhY2sgYW5kIGZvcnRoIHRocm91Z2ggdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbnRlZ2VycywKKyAgICAgc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbworICAgICAgICAgb24KKyAgICovCisgIHJldHVybiAoVUludDMyKShuIDw8IDEpIF4gKFVJbnQzMikobiA+PiAzMSk7Cit9CisKKy0oVUludDY0KSBpNjRUb1ppZ1phZzooU0ludDY0KW4KK3sKKyAgcmV0dXJuIChVSW50NjQpKG4gPDwgMSkgXiAoVUludDY0KShuID4+IDYzKTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilwc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggcHJvdG9jb2xJZDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomcHJvdG9jb2xJZCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocHJvdG9jb2xJZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogQChUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzbWF0Y2hlZFByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleTogQChDT01QQUNUX1BST1RPQ09MX0lEKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2ZXJzaW9uQW5kVHlwZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomdmVyc2lvbkFuZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisgIGlmICh2ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTikgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JCYWRWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleTogQChDT01QQUNUX1ZFUlNJT04pfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFM7CisgIFVJbnQzMiBzZXF1ZW5jZUlEOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgTlNTdHJpbmcgKm5hbWU7CisgIGlmICghW3NlbGYgcmVhZFN0cmluZzombmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocHR5cGUgIT0gTlVMTCkgeworICAgICpwdHlwZSA9IHR5cGU7CisgIH0KKyAgaWYgKHBzZXF1ZW5jZUlEICE9IE5VTEwpIHsKKyAgICAqcHNlcXVlbmNlSUQgPSBzZXF1ZW5jZUlEOworICB9CisgIGlmIChwbmFtZSAhPSBOVUxMKSB7CisgICAgKnBuYW1lID0gbmFtZTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKworICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IEAiIjsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2xhc3RGaWVsZElkID0gW19sYXN0RmllbGQubGFzdE9iamVjdCBzaG9ydFZhbHVlXTsKKyAgW19sYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXBmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilwZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ5dGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdHlwZSA9IGJ5dGUgJiAweDBmOworCisgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgaWYgKHR5cGUgPT0gVENUeXBlX1NUT1ApIHsKKyAgICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICAgKnBuYW1lID0gQCIiOworICAgIH0KKyAgICBpZiAocGZpZWxkVHlwZSAhPSBOVUxMKSB7CisgICAgICAqcGZpZWxkVHlwZSA9IFRUeXBlU1RPUDsKKyAgICB9CisgICAgaWYgKHBmaWVsZElEICE9IE5VTEwpIHsKKyAgICAgICpwZmllbGRJRCA9IDA7CisgICAgfQorICAgIHJldHVybiBZRVM7CisgIH0KKworICBzaG9ydCBmaWVsZElkID0gMDsKKworICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIHNob3J0IG1vZGlmaWVyID0gKGJ5dGUgJiAweGYwKSA+PiA0OworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICBpZiAoIVtzZWxmIHJlYWRJMTY6JmZpZWxkSWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IF9sYXN0RmllbGRJZCArIG1vZGlmaWVyOworICB9CisKKyAgVUludDggZmllbGRUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZmaWVsZFR5cGUgZm9yQ29tcGFjdFR5cGU6dHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IEAiIjsKKyAgfQorICBpZiAocGZpZWxkVHlwZSAhPSBOVUxMKSB7CisgICAgKnBmaWVsZFR5cGUgPSBmaWVsZFR5cGU7CisgIH0KKyAgaWYgKHBmaWVsZElEICE9IE5VTEwpIHsKKyAgICAqcGZpZWxkSUQgPSBmaWVsZElkOworICB9CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgaWYgKHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRSB8fAorICAgICAgdHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSkKKyAgeworICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgIF9ib29sZWFuVmFsdWUgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6dHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9UUlVFXTsKKyAgfQorCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBfbGFzdEZpZWxkSWQgPSBmaWVsZElkOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopcGtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopcHZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilwc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBrZXlBbmRWYWx1ZVR5cGUgPSAwOworICBVSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmIChzaXplICE9IDApIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrZXlBbmRWYWx1ZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgVUludDgga2V5VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZToma2V5VHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgPj4gNCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2YWx1ZVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JnZhbHVlVHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgJiAweGYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBrZXlUeXBlICE9IE5VTEwpIHsKKyAgICAqcGtleVR5cGUgPSBrZXlUeXBlOworICB9CisgIGlmIChwdmFsdWVUeXBlICE9IE5VTEwpIHsKKyAgICAqcHZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgfQorICBpZiAocHNpemUgIT0gTlVMTCkgeworICAgICpwc2l6ZSA9IHNpemU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopcGVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBzaXplQW5kVHlwZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomc2l6ZUFuZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDMyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICBpZiAoc2l6ZSA9PSAxNSkgeworICAgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIFVJbnQ4IGVsZW1lbnRUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZlbGVtZW50VHlwZSBmb3JDb21wYWN0VHlwZTpzaXplQW5kVHlwZSAmIDB4MGYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBlbGVtZW50VHlwZSAhPSBOVUxMKSB7CisgICAgKnBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICB9CisgIGlmIChwc2l6ZSAhPSBOVUxMKSB7CisgICAgKnBzaXplID0gc2l6ZTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6cGVsZW1lbnRUeXBlIHNpemU6cHNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChfYm9vbGVhblZhbHVlICE9IG5pbCkgeworCisgICAgQk9PTCByZXN1bHQgPSBfYm9vbGVhblZhbHVlLmJvb2xWYWx1ZTsKKyAgICBfYm9vbGVhblZhbHVlID0gbmlsOworCisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisgIGVsc2UgeworCisgICAgVUludDggcmVzdWx0OworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnJlc3VsdCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICAqdmFsdWUgPSByZXN1bHQgPT0gVENUeXBlX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDp2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSAoU0ludDE2KVtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDY0IHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDY0OiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTY0OnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDY0IGJpdHM7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDooVUludDggKikmYml0cyBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgYml0cyA9IE9TU3dhcExpdHRsZVRvSG9zdEludDY0KGJpdHMpOworCisgIGlmICh2YWx1ZSkgeworICAgIG1lbWNweSh2YWx1ZSwgJmJpdHMsIHNpemVvZihiaXRzKSk7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGxlbmd0aDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6Jmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU1N0cmluZyAqcmVzdWx0OworCisgIGlmIChsZW5ndGggIT0gMCkgeworCisgICAgTlNEYXRhICpkYXRhOworICAgIGlmICghW3NlbGYgcmVhZEJpbmFyeU9mTGVuZ3RoOmxlbmd0aCBkYXRhOiZkYXRhIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKKyAgfQorICBlbHNlIHsKKyAgICByZXN1bHQgPSBAIiI7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBsZW5ndGg7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJpbmFyeU9mTGVuZ3RoOihVSW50MzIpbGVuZ3RoIGRhdGE6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TRGF0YSAqcmVzdWx0OworCisgIGlmIChsZW5ndGggIT0gMCkgeworCisgICAgTlNNdXRhYmxlRGF0YSAqYnVmID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bGVuZ3RoXTsKKyAgICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBidWY7CisgIH0KKyAgZWxzZSB7CisKKyAgICByZXN1bHQgPSBbTlNEYXRhIGRhdGFdOworCisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRWYXJpbnQzMjooVUludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiByZXN1bHQgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBVSW50OCBieXRlOworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgcmVzdWx0IHw9IChVSW50MzIpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNoaWZ0ICs9IDc7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRWYXJpbnQ2NDooVUludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGludCBzaGlmdCA9IDA7CisgIFVJbnQ2NCByZXN1bHQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBVSW50OCBieXRlOworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgcmVzdWx0IHw9IChVSW50NjQpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNoaWZ0ICs9IDc7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFNJbnQzMikgemlnWmFnVG9pMzI6KFVJbnQzMiluCit7CisgIHJldHVybiAoU0ludDMyKShuID4+IDEpIF4gKC0oU0ludDMyKShuICYgMSkpOworfQorCistKFNJbnQ2NCkgemlnWmFnVG9pNjQ6KFVJbnQ2NCluCit7CisgIHJldHVybiAoU0ludDY0KShuID4+IDEpIF4gKC0oU0ludDY0KShuICYgMSkpOworfQorCistKEJPT0wpIHR0eXBlOihVSW50OCAqKXR0eXBlIGZvckNvbXBhY3RUeXBlOihVSW50OCljdHlwZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgc3dpdGNoIChjdHlwZSAmIDB4MGYpIHsKKyAgY2FzZSBUQ1R5cGVfU1RPUDoKKyAgICAqdHR5cGUgPSBUVHlwZVNUT1A7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CT09MRUFOX0ZBTFNFOgorICBjYXNlIFRDVHlwZV9CT09MRUFOX1RSVUU6CisgICAgKnR0eXBlID0gVFR5cGVCT09MOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQllURToKKyAgICAqdHR5cGUgPSBUVHlwZUJZVEU7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JMTY6CisgICAgKnR0eXBlID0gVFR5cGVJMTY7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JMzI6CisgICAgKnR0eXBlID0gVFR5cGVJMzI7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JNjQ6CisgICAgKnR0eXBlID0gVFR5cGVJNjQ7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9ET1VCTEU6CisgICAgKnR0eXBlID0gVFR5cGVET1VCTEU7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CSU5BUlk6CisgICAgKnR0eXBlID0gVFR5cGVTVFJJTkc7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9MSVNUOgorICAgICp0dHlwZSA9IFRUeXBlTElTVDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX1NFVDoKKyAgICAqdHR5cGUgPSBUVHlwZVNFVDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX01BUDoKKyAgICAqdHR5cGUgPSBUVHlwZU1BUDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX1NUUlVDVDoKKyAgICAqdHR5cGUgPSBUVHlwZVNUUlVDVDsKKyAgICByZXR1cm4gWUVTOworCisgIGRlZmF1bHQ6CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yVHlwZUtleTogQCgoVUludDgpKGN0eXBlICYgMHgwRikpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorfQorCistKFVJbnQ4KSBjb21wYWN0VHlwZUZvclRUeXBlOihVSW50OCl0dHlwZQoreworICBzdGF0aWMgVUludDggdHR5cGVUb0NvbXBhY3RUeXBlW10gPSB7CisgICAgW1RUeXBlU1RPUF0gPSBUQ1R5cGVfU1RPUCwKKyAgICBbVFR5cGVCT09MXSA9IFRDVHlwZV9CT09MRUFOX0ZBTFNFLAorICAgIFtUVHlwZUJZVEVdID0gVENUeXBlX0JZVEUsCisgICAgW1RUeXBlRE9VQkxFXSA9IFRDVHlwZV9ET1VCTEUsCisgICAgW1RUeXBlSTE2XSA9IFRDVHlwZV9JMTYsCisgICAgW1RUeXBlSTMyXSA9IFRDVHlwZV9JMzIsCisgICAgW1RUeXBlSTY0XSA9IFRDVHlwZV9JNjQsCisgICAgW1RUeXBlU1RSSU5HXSA9IFRDVHlwZV9CSU5BUlksCisgICAgW1RUeXBlU1RSVUNUXSA9IFRDVHlwZV9TVFJVQ1QsCisgICAgW1RUeXBlTUFQXSA9IFRDVHlwZV9NQVAsCisgICAgW1RUeXBlU0VUXSA9IFRDVHlwZV9TRVQsCisgICAgW1RUeXBlTElTVF0gPSBUQ1R5cGVfTElTVAorICB9OworCisgIHJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjZTM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitleHRlcm4gTlNTdHJpbmcgKlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZTsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM4YzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVE11bHRpcGxleGVkUHJvdG9jb2wuaCIKKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK05TU3RyaW5nICpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvciA9IEAiOiI7CisKKworQGludGVyZmFjZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpzZXJ2aWNlTmFtZTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbAorICAgICAgICAgICBzZXJ2aWNlTmFtZTooTlNTdHJpbmcgKiluYW1lCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhQcm90b2NvbDpwcm90b2NvbF07CisgIGlmIChzZWxmKSB7CisgICAgX3NlcnZpY2VOYW1lID0gbmFtZTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKyAgY2FzZSBUTWVzc2FnZVR5cGVDQUxMOgorICBjYXNlIFRNZXNzYWdlVHlwZU9ORVdBWTogeworICAgIE5TTXV0YWJsZVN0cmluZyAqc2VydmljZUZ1bmN0aW9uID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOl9zZXJ2aWNlTmFtZV07CisgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6VE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3JdOworICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOm5hbWVdOworICAgIHJldHVybiBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpzZXJ2aWNlRnVuY3Rpb24gdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9CisgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUgdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCmluZGV4IDI4MTIzOWQuLjg0MTA1OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjIsMTI3ICsyMiwxNDMgQEAKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAogCi1lbnVtIHsKLSAgVE1lc3NhZ2VUeXBlX0NBTEwgPSAxLAotICBUTWVzc2FnZVR5cGVfUkVQTFkgPSAyLAotICBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OID0gMywKLSAgVE1lc3NhZ2VUeXBlX09ORVdBWSA9IDQKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRNZXNzYWdlVHlwZSkgeworICBUTWVzc2FnZVR5cGVDQUxMID0gMSwKKyAgVE1lc3NhZ2VUeXBlUkVQTFkgPSAyLAorICBUTWVzc2FnZVR5cGVFWENFUFRJT04gPSAzLAorICBUTWVzc2FnZVR5cGVPTkVXQVkgPSA0CiB9OwogCi1lbnVtIHsKLSAgVFR5cGVfU1RPUCAgID0gMCwKLSAgVFR5cGVfVk9JRCAgID0gMSwKLSAgVFR5cGVfQk9PTCAgID0gMiwKLSAgVFR5cGVfQllURSAgID0gMywKLSAgVFR5cGVfRE9VQkxFID0gNCwKLSAgVFR5cGVfSTE2ICAgID0gNiwKLSAgVFR5cGVfSTMyICAgID0gOCwKLSAgVFR5cGVfSTY0ICAgID0gMTAsCi0gIFRUeXBlX1NUUklORyA9IDExLAotICBUVHlwZV9TVFJVQ1QgPSAxMiwKLSAgVFR5cGVfTUFQICAgID0gMTMsCi0gIFRUeXBlX1NFVCAgICA9IDE0LAotICBUVHlwZV9MSVNUICAgPSAxNQordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUeXBlKSB7CisgIFRUeXBlU1RPUCAgID0gMCwKKyAgVFR5cGVWT0lEICAgPSAxLAorICBUVHlwZUJPT0wgICA9IDIsCisgIFRUeXBlQllURSAgID0gMywKKyAgVFR5cGVET1VCTEUgPSA0LAorICBUVHlwZUkxNiAgICA9IDYsCisgIFRUeXBlSTMyICAgID0gOCwKKyAgVFR5cGVJNjQgICAgPSAxMCwKKyAgVFR5cGVTVFJJTkcgPSAxMSwKKyAgVFR5cGVTVFJVQ1QgPSAxMiwKKyAgVFR5cGVNQVAgICAgPSAxMywKKyAgVFR5cGVTRVQgICAgPSAxNCwKKyAgVFR5cGVMSVNUICAgPSAxNQogfTsKIAogCiBAcHJvdG9jb2wgVFByb3RvY29sIDxOU09iamVjdD4KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwogCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQ7CistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToobnVsbGFibGUgU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDoobnVsbGFibGUgU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lOwotLSAodm9pZCkgcmVhZFN0cnVjdEVuZDsKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQ7Ci0tICh2b2lkKSByZWFkRmllbGRFbmQ7CistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihudWxsYWJsZSBTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmc7CistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKEJPT0wpIHJlYWRCb29sOworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodW5zaWduZWQgY2hhcikgcmVhZEJ5dGU7CistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoc2hvcnQpIHJlYWRJMTY7CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50MzJfdCkgcmVhZEkzMjsKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChpbnQ2NF90KSByZWFkSTY0OworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGRvdWJsZSkgcmVhZERvdWJsZTsKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeTsKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRNYXBFbmQ7CistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZToobnVsbGFibGUgU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZFNldEVuZDsKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRMaXN0RW5kOworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kOworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQ7CistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQ7CistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlOworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlOworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhOworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wOworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQ7CistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZU1hcEVuZDsKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZVNldEVuZDsKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQ7CistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAogQGVuZAogCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YjZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUUHJvdG9jb2xEZWNvcmF0b3IgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGY5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbERlY29yYXRvci5oIgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sPiBjb25jcmV0ZVByb3RvY29sOworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbERlY29yYXRvcgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9jb25jcmV0ZVByb3RvY29sID0gcHJvdG9jb2w7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB0cmFuc3BvcnRdOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKil0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6bmFtZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RyaW5nOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCb29sOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkzMjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEk2NDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZERvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQmluYXJ5OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTprZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTp2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXTsKK30KKworCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOm1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDpzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTE2OihTSW50MTYpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMTY6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCeXRlOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZURvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQm9vbDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCaW5hcnk6ZGF0YSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwRW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEVuZDplcnJvcl07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBiYzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRQcm90b2NvbEVycm9yKSB7CisgIFRQcm90b2NvbEVycm9yVW5rbm93biAgICAgICAgICAgICAgICAgICA9IDAsCisgIFRQcm90b2NvbEVycm9ySW52YWxpZERhdGEgICAgICAgICAgICAgICA9IDEsCisgIFRQcm90b2NvbEVycm9yTmVnYXRpdmVTaXplICAgICAgICAgICAgICA9IDIsCisgIFRQcm90b2NvbEVycm9yU2l6ZUxpbWl0ICAgICAgICAgICAgICAgICA9IDMsCisgIFRQcm90b2NvbEVycm9yQmFkVmVyc2lvbiAgICAgICAgICAgICAgICA9IDQsCisgIFRQcm90b2NvbEVycm9yTm90SW1wbGVtZW50ZWQgICAgICAgICAgICA9IDUsCisgIFRQcm90b2NvbEVycm9yRGVwdGhMaW1pdCAgICAgICAgICAgICAgICA9IDYsCit9OworCisKK3R5cGVkZWYgTlNfRU5VTShpbnQsIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IpIHsKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc3NpbmdSZXF1aXJlZEZpZWxkICA9IDEwMDEsCisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JVbmV4cGVjdGVkVHlwZSAgICAgICAgPSAxMDAyLAorICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzbWF0Y2hlZFByb3RvY29sICAgID0gMTAwMywKK307CisKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZElkS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JUeXBlS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXk7CisKKworI2RlZmluZSBQUk9UT0NPTF9FUlJPUihyZXQsIGVyciwgLi4uKSBcCisgIGlmIChlcnJvcikgeyAgXAorICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yICMjIGVyciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6X19WQV9BUkdTX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VGaWxlIjogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fRklMRV9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlTGluZSI6IEAoX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VGdW5jdGlvbiI6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX1BSRVRUWV9GVU5DVElPTl9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiTWVzc2FnZSI6IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lID8gc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgOiBAIiJ9XTsgXAorICB9IFwKKyAgcmV0dXJuIHJldAorCisjZGVmaW5lIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihyZXQsIGVycm9yUHRyLCAuLi4pIFwKKyAgaWYgKGVycm9yUHRyKSB7IFwKKyAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6IFtbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpfX1ZBX0FSR1NfX10gc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6QCI6ICVAIiwgWygqZXJyb3JQdHIpIGxvY2FsaXplZERlc2NyaXB0aW9uXV0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX0ZJTEVfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXk6IEAoX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX1BSRVRUWV9GVU5DVElPTl9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXk6IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lID8gc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgOiBAIiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1VuZGVybHlpbmdFcnJvcktleTogKmVycm9yUHRyfV07IFwKKyAgfSBcCisgIHJldHVybiByZXQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM2NzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKKworCitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JEb21haW4gPSBAIlRQcm90b2NvbEVycm9yRG9tYWluIjsKKworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleSA9IEAiZXh0ZW5kZWRFcnJvciI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXkgPSBAImZpZWxkIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXkgPSBAImV4cGVjdGVkSWQiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5ID0gQCJleHBlY3RlZFZlcnNpb24iOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yVHlwZUtleSA9IEAidHlwZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5ID0gQCJzb3VyY2VMaW5lIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXkgPSBAInNvdXJjZUZpbGUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5ID0gQCJzb3VyY2VNZXRob2QiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXkgPSBAIm1lc3NhZ2VOYW1lIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM1NGZjLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGludGVyZmFjZSBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTQ4N2EuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFByb3RvY29sRXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKaW5kZXggZjIwMGE2ZC4uYTAyMmE3ZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKQEAgLTIxLDkgKzIxLDE2IEBACiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKwogCiBAcHJvdG9jb2wgVFByb3RvY29sRmFjdG9yeSA8TlNPYmplY3Q+CiAKLS0gKGlkIDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CitAcHJvcGVydHkgKHJlYWRvbmx5LCBub25hdG9taWMpIE5TU3RyaW5nICpwcm90b2NvbE5hbWU7CisKKy0oaWQ8VFByb3RvY29sPikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCmluZGV4IGMyZDI1MjEuLjgyNTEwY2YgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCkBAIC0yMCwxMCArMjAsMTQgQEAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRQcm90b2NvbFV0aWwgOiBOU09iamVjdCB7CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi19CiAKLSsgKHZvaWQpIHNraXBUeXBlOiAoaW50KSB0eXBlIG9uUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7CitAaW50ZXJmYWNlIFRQcm90b2NvbFV0aWwgOiBOU09iamVjdAorCisrKEJPT0wpIHNraXBUeXBlOihpbnQpdHlwZSBvblByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZDsKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCmluZGV4IDEzZDcwOTUuLmMwZDY1YWMgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCkBAIC0yMSw4NCArMjEsMTUxIEBACiAKIEBpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xVdGlsCiAKLSsgKHZvaWQpIHNraXBUeXBlOiAoaW50KSB0eXBlIG9uUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKKysoQk9PTCkgc2tpcFR5cGU6KGludCl0eXBlIG9uUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7CiAgIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRUeXBlX0JPT0w6Ci0gICAgW3Byb3RvY29sIHJlYWRCb29sXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9CWVRFOgotICAgIFtwcm90b2NvbCByZWFkQnl0ZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTE2OgotICAgIFtwcm90b2NvbCByZWFkSTE2XTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JMzI6Ci0gICAgW3Byb3RvY29sIHJlYWRJMzJdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0k2NDoKLSAgICBbcHJvdG9jb2wgcmVhZEk2NF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfRE9VQkxFOgotICAgIFtwcm90b2NvbCByZWFkRG91YmxlXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9TVFJJTkc6Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJpbmddOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX1NUUlVDVDoKLSAgICBbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07CisgIGNhc2UgVFR5cGVCT09MOiB7CisgICAgQk9PTCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEJvb2w6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUJZVEU6IHsKKyAgICBVSW50OCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEJ5dGU6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUkxNjogeworICAgIFNJbnQxNiB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkxNjomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTMyOiB7CisgICAgU0ludDMyIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJNjQ6IHsKKyAgICBTSW50NjQgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJNjQ6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZURPVUJMRTogeworICAgIGRvdWJsZSB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZERvdWJsZTomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU1RSSU5HOiB7CisgICAgTlNTdHJpbmcgKnZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RyaW5nOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTVFJVQ1Q6IHsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOk5VTEwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgZmllbGRUeXBlOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogbmlsXTsKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgeworICAgICAgU0ludDMyIGZpZWxkVHlwZTsKKyAgICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpuaWwgdHlwZTomZmllbGRUeXBlIGZpZWxkSUQ6bmlsIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlU1RPUCkgewogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEVuZF07CisgICAgICBpZiAoIVtzZWxmIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRFbmQ6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KICAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX01BUDoKLSAgewotICAgIGludCBrZXlUeXBlOwotICAgIGludCB2YWx1ZVR5cGU7Ci0gICAgaW50IHNpemU7Ci0gICAgW3Byb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6ICZrZXlUeXBlIHZhbHVlVHlwZTogJnZhbHVlVHlwZSBzaXplOiAmc2l6ZV07CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZU1BUDogeworICAgIFNJbnQzMiBrZXlUeXBlOworICAgIFNJbnQzMiB2YWx1ZVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZToma2V5VHlwZSB2YWx1ZVR5cGU6JnZhbHVlVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZToga2V5VHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogdmFsdWVUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRNYXBFbmRdOwotICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBUVHlwZV9TRVQ6Ci0gICAgewotICAgICAgaW50IGVsZW1UeXBlOwotICAgICAgaW50IHNpemU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ICZlbGVtVHlwZSBzaXplOiAmc2l6ZV07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGVsZW1UeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6a2V5VHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CiAgICAgICB9Ci0gICAgICBbcHJvdG9jb2wgcmVhZFNldEVuZF07Ci0gICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUVHlwZV9MSVNUOgotICAgIHsKLSAgICAgIGludCBlbGVtVHlwZTsKLSAgICAgIGludCBzaXplOwotICAgICAgW3Byb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTp2YWx1ZVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POwogICAgICAgfQotICAgICAgW3Byb3RvY29sIHJlYWRMaXN0RW5kXTsKICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOworICAgIGlmICghW3Byb3RvY29sIHJlYWRNYXBFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTRVQ6IHsKKyAgICBTSW50MzIgZWxlbVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6JmVsZW1UeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZWxlbVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgIH0KKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU2V0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlTElTVDogeworICAgIFNJbnQzMiBlbGVtVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6JmVsZW1UeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZWxlbVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgIH0KKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTGlzdEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaCBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAppbmRleCAwZDY2NDA0Li45NWIwZDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCkBAIC0yNywyNCArMjcsMjUgQEAKICNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KICNlbmRpZgogCi1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb247Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXk7CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCiAKLUBpbnRlcmZhY2UgVFNvY2tldFNlcnZlciA6IE5TT2JqZWN0IHsKLSAgTlNTb2NrZXRQb3J0ICogbVNlcnZlclNvY2tldDsKLSAgTlNGaWxlSGFuZGxlICogbVNvY2tldEZpbGVIYW5kbGU7Ci0gIGlkIDxUUHJvdG9jb2xGYWN0b3J5PiBtSW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvdG9jb2xGYWN0b3J5PiBtT3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICBpZCA8VFByb2Nlc3NvckZhY3Rvcnk+IG1Qcm9jZXNzb3JGYWN0b3J5OwotfQorZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkOworZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5OwogCi0tIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0Ci0gICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKLSAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OworCitAaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgOiBOU09iamVjdAorCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhQb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTooaWQgPFRQcm90b2NvbEZhY3Rvcnk+KXByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTooaWQgPFRQcm9jZXNzb3JGYWN0b3J5Pilwcm9jZXNzb3JGYWN0b3J5OworCistIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKIAogQGVuZAogCiAKLQorTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0gYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KaW5kZXggNWY3ZmEzYy4uMDliNjAzYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCisrKyBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQpAQCAtMjEsMzUgKzIxLDkyIEBACiAjaW1wb3J0ICJUU29ja2V0U2VydmVyLmgiCiAjaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCiAjaW1wb3J0IDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgogCiAKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gQCJUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyUHJvY2Vzc29yIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5ID0gQCJUU29ja2VyU2VydmVyVHJhbnNwb3J0IjsKIAotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24gPSBAIlRTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uIjsKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyX1Byb2Nlc3NvciI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlcl9UcmFuc3BvcnQiOworCitAaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpzb2NrZXRGaWxlSGFuZGxlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBkaXNwYXRjaF9xdWV1ZV90IHByb2Nlc3NpbmdRdWV1ZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmRvbWFpblNvY2tldFBhdGg7CisKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVFNvY2tldFNlcnZlcgogCi0tIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0Ci0gICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKLSAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoU29ja2V0OihDRlNvY2tldFJlZilzb2NrZXQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKIAotICBtSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl07Ci0gIG1PdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl07Ci0gIG1Qcm9jZXNzb3JGYWN0b3J5ID0gW3Byb2Nlc3NvckZhY3RvcnkgcmV0YWluXTsKKyAgX2lucHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfcHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgZGlzcGF0Y2hfcXVldWVfYXR0cl90IHByb2Nlc3NpbmdRdWV1ZUF0dHIgPQorICAgIGRpc3BhdGNoX3F1ZXVlX2F0dHJfbWFrZV93aXRoX3Fvc19jbGFzcyhESVNQQVRDSF9RVUVVRV9DT05DVVJSRU5ULCBRT1NfQ0xBU1NfQkFDS0dST1VORCwgMCk7CisKKyAgX3Byb2Nlc3NpbmdRdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwgcHJvY2Vzc2luZ1F1ZXVlQXR0cik7CiAKICAgLy8gY3JlYXRlIGEgc29ja2V0LgotICBpbnQgZmQgPSAtMTsKKyAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKworICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgIF9zb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6ZmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzpZRVNdOworCisgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKKyAgQ0ZSZWxlYXNlKHNvY2tldCk7CisKKyAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6TlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6X3NvY2tldEZpbGVIYW5kbGVdOworCisgIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgorICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUG9ydDpwb3J0XTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKworKyhDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBvcnQ6KGludClwb3J0Cit7CiAgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgMCwgTlVMTCwgTlVMTCk7CiAgIGlmIChzb2NrZXQpIHsKICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKLSAgICBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKICAgICBpbnQgeWVzID0gMTsKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOwogCkBAIC02MCwxMDEgKzExNywxMjMgQEAKICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CiAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKICAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07Ci0gICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwogICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gICAgICBOU0xvZyhAIioqKiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gbmlsOworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTlNMb2coQCIqKiogTm8gc2VydmVyIHNvY2tldCIpOworCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfQorICBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeQoreworICBfZG9tYWluU29ja2V0UGF0aCA9IHBhdGg7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBhdGg6cGF0aF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgewogICAgIHJldHVybiBuaWw7CiAgIH0KLSAgCi0gIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKLSAgbVNvY2tldEZpbGVIYW5kbGUgPSBbW05TRmlsZUhhbmRsZSBhbGxvY10gaW5pdFdpdGhGaWxlRGVzY3JpcHRvcjogZmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzogWUVTXTsKLSAgCi0gIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAotICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKLSAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gIAotICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCi0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogQHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IE5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBtU29ja2V0RmlsZUhhbmRsZV07Ci0gIAotICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KLSAgW21Tb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOwotICAKLSAgTlNMb2coQCJMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKLSAgCisKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gcGF0aCAlQCIsIHBhdGgpOworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MgewotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9iamVjdDogc2VsZl07Ci0gIFttSW5wdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV07Ci0gIFttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHJlbGVhc2VdOwotICBbbVByb2Nlc3NvckZhY3RvcnkgcmVsZWFzZV07Ci0gIFttU29ja2V0RmlsZUhhbmRsZSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKHZvaWQpIGNvbm5lY3Rpb25BY2NlcHRlZDogKE5TTm90aWZpY2F0aW9uICopIGFOb3RpZmljYXRpb24KKysgKENGU29ja2V0UmVmKSBjcmVhdGVTb2NrZXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKIHsKLSAgTlNGaWxlSGFuZGxlICogc29ja2V0ID0gW1thTm90aWZpY2F0aW9uIHVzZXJJbmZvXSBvYmplY3RGb3JLZXk6IE5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQLCAwLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldCkgeworICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29ja2V0LCAgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCB5ZXMgPSAxOworICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CiAKLSAgLy8gbm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIHNwaW4gb2ZmIGEgdGhyZWFkIHRvIGhhbmRsZSBhY3Rpdml0eQotICBbTlNUaHJlYWQgZGV0YWNoTmV3VGhyZWFkU2VsZWN0b3I6IEBzZWxlY3RvcihoYW5kbGVDbGllbnRDb25uZWN0aW9uOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGFyZ2V0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aE9iamVjdDogc29ja2V0XTsKKyAgICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihhZGRyLnN1bl9wYXRoKSkgeworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gIFtbYU5vdGlmaWNhdGlvbiBvYmplY3RdIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgICAgYWRkci5zdW5fbGVuID0gU1VOX0xFTigmYWRkcik7CisKKyAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfSBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogfQogCi0KLS0gKHZvaWQpIGhhbmRsZUNsaWVudENvbm5lY3Rpb246IChOU0ZpbGVIYW5kbGUgKikgY2xpZW50U29ja2V0CistKHZvaWQpIGRlYWxsb2MKIHsKLSAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gIAotICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICogdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6IGNsaWVudFNvY2tldF07Ci0gIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFttUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gIAotICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW1ttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07Ci0gIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW1ttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF0gYXV0b3JlbGVhc2VdOworICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOnNlbGZdOwogCi0gIEB0cnkgewotICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgZG8gewotICAgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBteVBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgW215UG9vbCByZWxlYXNlXTsKLSAgICB9IHdoaWxlIChyZXN1bHQpOworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOwogICB9Ci0gIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgfQotCi0gIE5TTm90aWZpY2F0aW9uICogbiA9IFtOU05vdGlmaWNhdGlvbiBub3RpZmljYXRpb25XaXRoTmFtZToga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3RzQW5kS2V5czogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsXV07Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOiBAc2VsZWN0b3IocG9zdE5vdGlmaWNhdGlvbjopIHdpdGhPYmplY3Q6IG4gd2FpdFVudGlsRG9uZTogWUVTXTsKLSAgCi0gIFtwb29sIHJlbGVhc2VdOwogfQogCiAKKy0odm9pZCkgY29ubmVjdGlvbkFjY2VwdGVkOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbgoreworICBOU0ZpbGVIYW5kbGUgKnNvY2tldCA9IFtub3RpZmljYXRpb24udXNlckluZm8gb2JqZWN0Rm9yS2V5Ok5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgaGFuZGxlIHJlcXVlc3Qgb24gcXVldWUKKyAgZGlzcGF0Y2hfYXN5bmMoX3Byb2Nlc3NpbmdRdWV1ZSwgXnsKKworICAgIFtzZWxmIGhhbmRsZUNsaWVudENvbm5lY3Rpb246c29ja2V0XTsKKworICB9KTsKKworICAvLyBDb250aW51ZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMKKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworfQorCisKKy0odm9pZCkgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjooTlNGaWxlSGFuZGxlICopY2xpZW50U29ja2V0Cit7CisgIEBhdXRvcmVsZWFzZXBvb2wgeworCisgICAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6Y2xpZW50U29ja2V0XTsKKyAgICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbX3Byb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW19pbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisgICAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbX291dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBOU0Vycm9yICplcnJvcjsKKyAgICBpZiAoIVtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDppblByb3RvY29sIG91dHB1dFByb3RvY29sOm91dFByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgIC8vIEhhbmRsZSBlcnJvcgorICAgICAgTlNMb2coQCJFcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6ICVAIiwgZXJyb3IpOworICAgIH0KKworICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57CisKKyAgICAgIFtOU05vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0Q2VudGVyIHBvc3ROb3RpZmljYXRpb25OYW1lOlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFNvY2tldFNlcnZlclByb2Nlc3NvcktleTogcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnR9XTsKKyAgICB9KTsKKworICB9Cit9CiAKIEBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiNGZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0Bwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnQ7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgPE5TT2JqZWN0PgorCistKGlkPFRBc3luY1RyYW5zcG9ydD4pIG5ld1RyYW5zcG9ydDsKKworQGVuZAorCisKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0NvbXBsZXRpb25CbG9jaykoKTsKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0ZhaWx1cmVCbG9jaykoTlNFcnJvciAqIF9fbm9ubnVsbCk7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA8VFRyYW5zcG9ydD4KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjhhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRGcmFtZWRUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisjZGVmaW5lIEhFQURFUl9TSVpFIDQKKyNkZWZpbmUgSU5JVF9GUkFNRV9TSVpFIDEwMjQKKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKndyaXRlQnVmZmVyOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZWFkQnVmZmVyOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBOU1VJbnRlZ2VyIHJlYWRPZmZzZXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEZyYW1lZFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKK3sKKyAgaWYgKChzZWxmID0gW3NlbGYgaW5pdF0pKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgICAgX3JlYWRCdWZmZXIgPSBuaWw7CisgICAgX3JlYWRPZmZzZXQgPSAwOworICAgIF93cml0ZUJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOkhFQURFUl9TSVpFXTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqKillcnJvcgoreworICBpbnQgbGVuID0gKGludClbX3dyaXRlQnVmZmVyIGxlbmd0aF07CisgIGludCBkYXRhX2xlbiA9IGxlbiAtIEhFQURFUl9TSVpFOworICBpZiAoZGF0YV9sZW4gPCAwKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaTMycmRbMF0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKKyAgaTMycmRbMV0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMTYpKTsKKyAgaTMycmRbMl0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gOCkpOworICBpMzJyZFszXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbikpOworCisgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZAorICAvLyAgb3BlcmF0aW9ucyEKKyAgW193cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOl93cml0ZUJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IGZsdXNoOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF93cml0ZUJ1ZmZlci5sZW5ndGggPSBIRUFERVJfU0laRTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW193cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworCisgICAgTlNVSW50ZWdlciBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aCAtIF9yZWFkT2Zmc2V0OworICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICBpZiAoIVtzZWxmIHJlYWRGcmFtZTplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICB9CisKKyAgICBOU1JhbmdlIHJhbmdlOworICAgIHJhbmdlLmxvY2F0aW9uID0gX3JlYWRPZmZzZXQ7CisgICAgcmFuZ2UubGVuZ3RoID0gTUlOKGxlbmd0aCAtIGdvdCwgYXZhaWwpOworCisgICAgW19yZWFkQnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQrZ290IHJhbmdlOnJhbmdlXTsKKyAgICBfcmVhZE9mZnNldCArPSByYW5nZS5sZW5ndGg7CisgICAgZ290ICs9IHJhbmdlLmxlbmd0aDsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy0oQk9PTCkgcmVhZEZyYW1lOihOU0Vycm9yICoqKWVycm9yCit7CisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDpIRUFERVJfU0laRSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgc2l6ZSA9CisgICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKKworICBpZiAoX3JlYWRCdWZmZXIgPT0gbmlsKSB7CisKKyAgICBfcmVhZEJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworCisgIH0KKyAgZWxzZSB7CisKKyAgICBTSW50MzIgbGVuID0gKFNJbnQzMilfcmVhZEJ1ZmZlci5sZW5ndGg7CisgICAgaWYgKGxlbiA+PSBzaXplKSB7CisKKyAgICAgIF9yZWFkQnVmZmVyLmxlbmd0aCA9IHNpemU7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIC8vIGluY3JlYXNlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICAgICAgW19yZWFkQnVmZmVyIGluY3JlYXNlTGVuZ3RoQnk6c2l6ZS1sZW5dOworCisgICAgfQorCisgIH0KKworICAvLyBjb3B5IGludG8gaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlcgorICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6X3JlYWRCdWZmZXIubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU3ODQwLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRIVFRQQ2xpZW50IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNVUkwgKiBtVVJMOwotICBOU011dGFibGVVUkxSZXF1ZXN0ICogbVJlcXVlc3Q7Ci0gIE5TTXV0YWJsZURhdGEgKiBtUmVxdWVzdERhdGE7Ci0gIE5TRGF0YSAqIG1SZXNwb25zZURhdGE7Ci0gIGludCBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICBOU1N0cmluZyAqIG1Vc2VyQWdlbnQ7Ci0gIGludCBtVGltZW91dDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTDsKLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQ7Ci0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWE4NTkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRIVFRQQ2xpZW50LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUSFRUUENsaWVudAotCi0KLS0gKHZvaWQpIHNldHVwUmVxdWVzdAotewotICBpZiAobVJlcXVlc3QgIT0gbmlsKSB7Ci0gICAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICB9Ci0KLSAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0Ci0gIG1SZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDogbVVSTF07Ci0gIFttUmVxdWVzdCBzZXRIVFRQTWV0aG9kOiBAIlBPU1QiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQ29udGVudC1UeXBlIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkFjY2VwdCJdOwotCi0gIE5TU3RyaW5nICogdXNlckFnZW50ID0gbVVzZXJBZ2VudDsKLSAgaWYgKCF1c2VyQWdlbnQpIHsKLSAgICB1c2VyQWdlbnQgPSBAIkNvY29hL1RIVFRQQ2xpZW50IjsKLSAgfQotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IHVzZXJBZ2VudCBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiVXNlci1BZ2VudCJdOwotCi0gIFttUmVxdWVzdCBzZXRDYWNoZVBvbGljeTogTlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOwotICBpZiAobVRpbWVvdXQpIHsKLSAgICBbbVJlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOiBtVGltZW91dF07Ci0gIH0KLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFVSTDogYVVSTAotICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IG5pbAotICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBdOwotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLSAgICAgICAgIHVzZXJBZ2VudDogKE5TU3RyaW5nICopIHVzZXJBZ2VudAotICAgICAgICAgICB0aW1lb3V0OiAoaW50KSB0aW1lb3V0Ci17Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLQotICBtVGltZW91dCA9IHRpbWVvdXQ7Ci0gIGlmICh1c2VyQWdlbnQpIHsKLSAgICBtVXNlckFnZW50ID0gW3VzZXJBZ2VudCByZXRhaW5dOwotICB9Ci0gIG1VUkwgPSBbYVVSTCByZXRhaW5dOwotCi0gIFtzZWxmIHNldHVwUmVxdWVzdF07Ci0KLSAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCi0gIG1SZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogMTAyNF07Ci0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTAotewotICBbYVVSTCByZXRhaW5dOwotICBbbVVSTCByZWxlYXNlXTsKLSAgbVVSTCA9IGFVUkw7Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVVJMIHJlbGVhc2VdOwotICBbbVVzZXJBZ2VudCByZWxlYXNlXTsKLSAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICBbbVJlcXVlc3REYXRhIHJlbGVhc2VdOwotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCi17Ci0gIE5TUmFuZ2UgcjsKLSAgci5sb2NhdGlvbiA9IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIHIubGVuZ3RoID0gbGVuOwotCi0gIFttUmVzcG9uc2VEYXRhIGdldEJ5dGVzOiBidWYrb2ZmIHJhbmdlOiByXTsKLSAgbVJlc3BvbnNlRGF0YU9mZnNldCArPSBsZW47Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAotewotICBbbVJlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOiBkYXRhK29mZnNldCBsZW5ndGg6IGxlbmd0aF07Ci19Ci0KLQotLSAodm9pZCkgZmx1c2gKLXsKLSAgW21SZXF1ZXN0IHNldEhUVFBCb2R5OiBtUmVxdWVzdERhdGFdOyAvLyBub3Qgc3VyZSBpZiBpdCBjb3BpZXMgdGhlIGRhdGEKLQotICAvLyBtYWtlIHRoZSBIVFRQIHJlcXVlc3QKLSAgTlNVUkxSZXNwb25zZSAqIHJlc3BvbnNlOwotICBOU0Vycm9yICogZXJyb3I7Ci0gIE5TRGF0YSAqIHJlc3BvbnNlRGF0YSA9Ci0gICAgW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0OiBtUmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTogJnJlc3BvbnNlIGVycm9yOiAmZXJyb3JdOwotCi0gIFttUmVxdWVzdERhdGEgc2V0TGVuZ3RoOiAwXTsKLQotICBpZiAocmVzcG9uc2VEYXRhID09IG5pbCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ291bGQgbm90IG1ha2UgSFRUUCByZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JdOwotICB9Ci0gIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6IFtOU0hUVFBVUkxSZXNwb25zZSBjbGFzc11dKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmV4cGVjdGVkIE5TVVJMUmVzcG9uc2UgdHlwZTogJUAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nRnJvbUNsYXNzKFtyZXNwb25zZSBjbGFzc10pXV07Ci0gIH0KLQotICBOU0hUVFBVUkxSZXNwb25zZSAqIGh0dHBSZXNwb25zZSA9IChOU0hUVFBVUkxSZXNwb25zZSAqKSByZXNwb25zZTsKLSAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJCYWQgcmVzcG9uc2UgZnJvbSBIVFRQIHNlcnZlcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV1dXTsKLSAgfQotCi0gIC8vIHBoZXchCi0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2VdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5dOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ID0gMDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzQ5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVEFzeW5jVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU0Vycm9yICpfX251bGxhYmxlICheVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrKSAoTlNIVFRQVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0RhdGEgKnJlc3BvbnNlRGF0YSk7CisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5IDogTlNPYmplY3Q8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4KKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrIHJlc3BvbnNlVmFsaWRhdGU7CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWU7CisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgVVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUQXN5bmNUcmFuc3BvcnQ+CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwYjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMU2Vzc2lvbiAqc2Vzc2lvbjsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhGYWN0b3J5OihUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICopZmFjdG9yeTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnIHdpdGhQcm90b2NvbE5hbWU6KE5TU3RyaW5nICopcHJvdG9jb2xOYW1lCit7CisgIE5TU3RyaW5nICp0aHJpZnRDb250ZW50VHlwZSA9IEAiYXBwbGljYXRpb24veC10aHJpZnQiOworICBpZiAocHJvdG9jb2xOYW1lLmxlbmd0aCkgeworICAgIHRocmlmdENvbnRlbnRUeXBlID0gW3RocmlmdENvbnRlbnRUeXBlIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOyBwPSVAIiwgcHJvdG9jb2xOYW1lXTsKKyAgfQorCisgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YTsKKyAgY29uZmlnLkhUVFBTaG91bGRVc2VQaXBlbGluaW5nID0gWUVTOworICBjb25maWcuSFRUUFNob3VsZFNldENvb2tpZXMgPSBOTzsKKyAgY29uZmlnLlVSTENhY2hlID0gbmlsOworICBjb25maWcuSFRUUEFkZGl0aW9uYWxIZWFkZXJzID0gQHtAIkNvbnRlbnQtVHlwZSI6dGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiQWNjZXB0Ijp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJVc2VyLUFnZW50IjpAIlRocmlmdC9Db2NvYSAoU2Vzc2lvbikifTsKK30KKworCistKGlkKSBpbml0V2l0aFNlc3Npb246KE5TVVJMU2Vzc2lvbiAqKXNlc3Npb24gVVJMOihOU1VSTCAqKXVybAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBfdXJsID0gdXJsOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RIVFRQU2Vzc2lvblRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGYWN0b3J5OnNlbGZdOworfQorCistKE5TVVJMU2Vzc2lvbkRhdGFUYXNrICopIHRhc2tXaXRoUmVxdWVzdDooTlNVUkxSZXF1ZXN0ICopcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQgKF4pKE5TRGF0YSAqZGF0YSwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRXJyb3IgKmVycm9yKSljb21wbGV0aW9uSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICpuZXdUYXNrID0gW19zZXNzaW9uIGRhdGFUYXNrV2l0aFJlcXVlc3Q6cmVxdWVzdCBjb21wbGV0aW9uSGFuZGxlcjpjb21wbGV0aW9uSGFuZGxlcl07CisgIGlmICghbmV3VGFzaykgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6QCJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIn1dOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIG5ld1Rhc2s7Cit9CisKKy0oTlNFcnJvciAqKSB2YWxpZGF0ZVJlc3BvbnNlOihOU0hUVFBVUkxSZXNwb25zZSAqKXJlc3BvbnNlIGRhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKF9yZXNwb25zZVZhbGlkYXRlKSB7CisgICAgcmV0dXJuIF9yZXNwb25zZVZhbGlkYXRlKHJlc3BvbnNlLCBkYXRhKTsKKyAgfQorICByZXR1cm4gbmlsOworfQorCitAZW5kCisKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBTZXNzaW9uVHJhbnNwb3J0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2ZhY3RvcnkgPSBmYWN0b3J5OworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIV9yZXF1ZXN0RGF0YSkgeworICAgIF9yZXF1ZXN0RGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6MjU2XTsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlCit7CisgIE5TRXJyb3IgKmVycm9yOworCisgIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl9mYWN0b3J5LnVybF07CisgIHJlcXVlc3QuSFRUUE1ldGhvZCA9IEAiUE9TVCI7CisgIHJlcXVlc3QuSFRUUEJvZHkgPSBfcmVxdWVzdERhdGE7CisKKyAgX3JlcXVlc3REYXRhID0gbmlsOworCisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICp0YXNrID0gW19mYWN0b3J5IHRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOl4oTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpIHsKKworICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICBpZiAoIWVycm9yICYmICFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczpOU0hUVFBVUkxSZXNwb25zZS5jbGFzc10pIHsKKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisKKyAgICB9CisKKyAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoaWQpcmVzcG9uc2U7CisgICAgaWYgKCFlcnJvciAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDApIHsKKworICAgICAgVEh0dHBUcmFuc3BvcnRFcnJvciBjb2RlOworICAgICAgaWYgKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1czsKKyAgICAgIH0KKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKworICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICBpZiAoIWVycm9yKSB7CisgICAgICBlcnJvciA9IFtfZmFjdG9yeSB2YWxpZGF0ZVJlc3BvbnNlOmh0dHBSZXNwb25zZSBkYXRhOmRhdGFdOworICAgIH0KKworICAgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBuaWw7CisKKyAgICAgIGZhaWx1cmUoZXJyb3IpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICBpZiAoZGF0YSA9PSBuaWwpIHsKKyAgICAgICAgZGF0YSA9IFtOU0RhdGEgZGF0YV07CisgICAgICB9CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBkYXRhOworCisgICAgICBjb21wbGV0ZWQoc2VsZik7CisgICAgfQorCisgIH0gZXJyb3I6JmVycm9yXTsKKworICBpZiAoIXRhc2spIHsKKyAgICBmYWlsdXJlKGVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBbdGFzayByZXN1bWVdOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBjb21wbGV0ZWQgPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKDApOworCisgIF9fYmxvY2sgQk9PTCByZXN1bHQ7CisgIF9fYmxvY2sgTlNFcnJvciAqaW50ZXJuYWxFcnJvcjsKKworICBbc2VsZiBmbHVzaFdpdGhDb21wbGV0aW9uOl4oaWQgPCBUQXN5bmNUcmFuc3BvcnQgPiB0cmFuc3BvcnQpIHsKKworICAgIHJlc3VsdCA9IFlFUzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9IGZhaWx1cmU6XihOU0Vycm9yICplcnJvcikgeworCisgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yOworCisgICAgcmVzdWx0ID0gTk87CisKKyAgICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKGNvbXBsZXRlZCk7CisKKyAgfV07CisKKyAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoY29tcGxldGVkLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOworCisgIGlmIChlcnJvcikgeworICAgICplcnJvciA9IGludGVybmFsRXJyb3I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTDsKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KG51bGxhYmxlIE5TU3RyaW5nICopdXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KXRpbWVvdXQ7CisKKy0odm9pZCkgc2V0VVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnVzZXJBZ2VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVGltZUludGVydmFsIHRpbWVvdXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBUcmFuc3BvcnQKKworLSh2b2lkKSBzZXR1cFJlcXVlc3QKK3sKKyAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0CisgIF9yZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDpfdXJsXTsKKyAgW19yZXF1ZXN0IHNldEhUVFBNZXRob2Q6QCJQT1NUIl07CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTpAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6QCJDb250ZW50LVR5cGUiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkFjY2VwdCJdOworCisgIE5TU3RyaW5nICp1c2VyQWdlbnQgPSBfdXNlckFnZW50OworICBpZiAoIXVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudCA9IEAiVGhyaWZ0L0NvY29hIjsKKyAgfQorICBbX3JlcXVlc3Qgc2V0VmFsdWU6dXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDpAIlVzZXItQWdlbnQiXTsKKworICBbX3JlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6TlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOworICBpZiAoX3RpbWVvdXQpIHsKKyAgICBbX3JlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOl90aW1lb3V0XTsKKyAgfQorfQorCisKKy0oaWQpIGluaXRXaXRoVVJMOihOU1VSTCAqKWFVUkwKK3sKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOmFVUkwKKyAgICAgICAgICAgICAgICAgdXNlckFnZW50Om5pbAorICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6MF07Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KE5TU3RyaW5nICopYVVzZXJBZ2VudAorICAgICAgICAgIHRpbWVvdXQ6KGludClhVGltZW91dAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoIXNlbGYpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgX3RpbWVvdXQgPSBhVGltZW91dDsKKyAgX3VzZXJBZ2VudCA9IGFVc2VyQWdlbnQ7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07CisKKyAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCisgIF9yZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToxMDI0XTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTAoreworICBfdXJsID0gYVVSTDsKKworICBbc2VsZiBzZXR1cFJlcXVlc3RdOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX3JlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdCBzZXRIVFRQQm9keTpfcmVxdWVzdERhdGFdOworCisgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAorICBOU1VSTFJlc3BvbnNlICpyZXNwb25zZTsKKyAgX3Jlc3BvbnNlRGF0YSA9IFtOU1VSTENvbm5lY3Rpb24gc2VuZFN5bmNocm9ub3VzUmVxdWVzdDpfcmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTomcmVzcG9uc2UgZXJyb3I6ZXJyb3JdOworICBpZiAoIV9yZXNwb25zZURhdGEpIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBbX3JlcXVlc3REYXRhIHNldExlbmd0aDowXTsKKworICBpZiAoIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU0hUVFBVUkxSZXNwb25zZSAqaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2U7CisgIGlmIChbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdICE9IDIwMCkgeworICAgIGlmIChlcnJvcikgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKaW5kZXggZmE0ZDM3MS4uNjI0OWQzMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaApAQCAtMjAsMTAgKzIwLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLQlOU011dGFibGVEYXRhICptQnVmZmVyOwotCU5TVUludGVnZXIgbU9mZnNldDsKLX0KLS0gKGlkKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YTsKLS0gKE5TRGF0YSAqKWdldEJ1ZmZlcjsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oTlNEYXRhICopIGJ1ZmZlcjsKKworLShpZCkgaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOworCistKGlkKSBpbml0V2l0aERhdGFOb0NvcHk6KE5TTXV0YWJsZURhdGEgKilkYXRhOworCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KaW5kZXggODY5MDEwYS4uZWMxOWNjOCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQpAQCAtMTgsNTQgKzE4LDEwNCBAQAogICovCiAKICNpbXBvcnQgIlRNZW1vcnlCdWZmZXIuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCiAKICNkZWZpbmUgR0FSQkFHRV9CVUZGRVJfU0laRSA0MDk2IC8vIDRLaUIKIAorCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIFVJbnQzMiBidWZmZXJPZmZzZXQ7CisKK0BlbmQKKworCiBAaW1wbGVtZW50YXRpb24gVE1lbW9yeUJ1ZmZlcgotLSAoaWQpaW5pdCB7Ci0JaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKLQkJbUJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKKworLShpZCkgaW5pdAoreworICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7CisgICAgX2J1ZmZlciA9IFtOU011dGFibGVEYXRhIG5ld107CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKGlkKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YSB7Ci0JaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKLQkJbUJ1ZmZlciA9IFtkYXRhIG11dGFibGVDb3B5XTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworLShpZCkgaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhCit7CisgIGlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7CisgICAgX2J1ZmZlciA9IFtkYXRhIG11dGFibGVDb3B5XTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaW50KXJlYWRBbGw6KHVpbnQ4X3QgKilidWYgb2Zmc2V0OihpbnQpb2ZmIGxlbmd0aDooaW50KWxlbiB7Ci0JaWYgKFttQnVmZmVyIGxlbmd0aF0gLSBtT2Zmc2V0IDwgbGVuKSB7Ci0JCUB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOkAiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gYnVmZmVyIl07Ci0JfQotCVttQnVmZmVyIGdldEJ5dGVzOmJ1ZiByYW5nZTpOU01ha2VSYW5nZShtT2Zmc2V0LCBsZW4pXTsKLQltT2Zmc2V0ICs9IGxlbjsKLQlpZiAobU9mZnNldCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7Ci0JCVttQnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgbU9mZnNldCkgd2l0aEJ5dGVzOk5VTEwgbGVuZ3RoOjBdOwotCQltT2Zmc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIGxlbjsKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gZGF0YTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAodm9pZCl3cml0ZTooY29uc3QgdWludDhfdCAqKWRhdGEgb2Zmc2V0Oih1bnNpZ25lZCBpbnQpb2Zmc2V0IGxlbmd0aDoodW5zaWduZWQgaW50KWxlbmd0aCB7Ci0JW21CdWZmZXIgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKWZsdXNoIHsKLQkvLyBub29wCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgYXZhaWwgPSAoVUludDMyKV9idWZmZXIubGVuZ3RoIC0gX2J1ZmZlck9mZnNldDsKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX2J1ZmZlck9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfYnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlciArIG91dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9idWZmZXJPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIGlmIChfYnVmZmVyT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKKyAgICBbX2J1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIF9idWZmZXJPZmZzZXQpIHdpdGhCeXRlczpOVUxMIGxlbmd0aDowXTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKIH0KIAotLSAoTlNEYXRhICopZ2V0QnVmZmVyIHsKLQlyZXR1cm4gW1ttQnVmZmVyIGNvcHldIGF1dG9yZWxlYXNlXTsKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopaW5CdWZmZXIgb2Zmc2V0OihVSW50MzIpaW5CdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2J1ZmZlciBhcHBlbmRCeXRlczppbkJ1ZmZlciArIGluQnVmZmVyT2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZGVhbGxvYyB7Ci0JW21CdWZmZXIgcmVsZWFzZV07Ci0JW3N1cGVyIGRlYWxsb2NdOworLShOU0RhdGEgKikgYnVmZmVyCit7CisgIHJldHVybiBfYnVmZmVyOwogfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKaW5kZXggYmEyYTIwOS4uZGI2ZWRmMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaApAQCAtMjEsMTUgKzIxLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNGaWxlSGFuZGxlICogbUlucHV0RmlsZUhhbmRsZTsKLSAgTlNGaWxlSGFuZGxlICogbU91dHB1dEZpbGVIYW5kbGU7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGZpbGVIYW5kbGU7CiAKLS0gKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBpbnB1dEZpbGVIYW5kbGUKLSAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBvdXRwdXRGaWxlSGFuZGxlOworQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oaWQpIGluaXRXaXRoRmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopZmlsZUhhbmRsZTsKKworLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWlucHV0RmlsZUhhbmRsZQorICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKW91dHB1dEZpbGVIYW5kbGU7CiAKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCmluZGV4IGIyMTgyMTguLmM5MDdmODcgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KQEAgLTE5LDczICsxOSwxMDAgQEAKIAogCiAjaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKmlucHV0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpvdXRwdXRGaWxlSGFuZGxlOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQKIAotLSAoaWQpIGluaXRXaXRoRmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBmaWxlSGFuZGxlCistKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWZpbGVIYW5kbGUKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZV07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlXTsKIH0KIAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgaW5wdXRGaWxlSGFuZGxlCi0gICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgb3V0cHV0RmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWFJbnB1dEZpbGVIYW5kbGUKKyAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhT3V0cHV0RmlsZUhhbmRsZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotCi0gIG1JbnB1dEZpbGVIYW5kbGUgPSBbaW5wdXRGaWxlSGFuZGxlIHJldGFpbl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluXTsKLQorICBpZiAoc2VsZikgeworICAgIF9pbnB1dEZpbGVIYW5kbGUgPSBhSW5wdXRGaWxlSGFuZGxlOworICAgIF9vdXRwdXRGaWxlSGFuZGxlID0gYU91dHB1dEZpbGVIYW5kbGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKIAotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFttSW5wdXRGaWxlSGFuZGxlIHJlbGVhc2VdOwotICBbbU91dHB1dEZpbGVIYW5kbGUgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIE5TRGF0YSAqZCA9IFtfaW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKKyAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZ290ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW4pIHsKLSAgICBOU0RhdGEgKiBkID0gW21JbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDogbGVuLWdvdF07Ci0gICAgaWYgKFtkIGxlbmd0aF0gPT0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkNhbm5vdCByZWFkLiBObyBtb3JlIGRhdGEuIl07CisKKyAgICBOU0RhdGEgKmQgPSBbX2lucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChkLmxlbmd0aCA9PSAwKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgW2QgZ2V0Qnl0ZXM6IGJ1Zitnb3RdOwotICAgIGdvdCArPSBbZCBsZW5ndGhdOworCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKICAgfQogICByZXR1cm4gZ290OwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAodWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgTlNEYXRhICogZGF0YU9iamVjdCA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzTm9Db3B5OiBkYXRhK29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlV2hlbkRvbmU6IE5PXTsKKyAgdm9pZCAqcG9zID0gKHZvaWQgKilkYXRhICsgb2Zmc2V0OwogCiAgIEB0cnkgewotICAgIFttT3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6IGRhdGFPYmplY3RdOwotICB9IEBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCIlczogVW5hYmxlIHRvIHdyaXRlIGRhdGE6ICVAIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZV1dOworICAgIFtfb3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6W05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OnBvcyBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpOT11dOworICB9CisgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmUpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POwogICB9CiAKLSAgW2RhdGFPYmplY3QgcmVsZWFzZV07CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0KKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAppbmRleCBkN2JlNDBiLi41NGM0ODg0IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaApAQCAtMjAsMTkgKzIwLDI0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0lucHV0U3RyZWFtICogbUlucHV0OwotICBOU091dHB1dFN0cmVhbSAqIG1PdXRwdXQ7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OwogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQ7CitAaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgogCi0tIChpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0lucHV0U3RyZWFtICppbnB1dDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KG51bGxhYmxlIE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbToobnVsbGFibGUgTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dDsKKworLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OworCistKHZvaWQpIGNsb3NlOwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KaW5kZXggMWQ0Y2ZlZS4uMThjNDFkMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KQEAgLTE4LDcyICsxOCwxMzYgQEAKICAqLwogCiAjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0ICgpCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU1N0cmVhbVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIFtzdXBlciBpbml0XTsKLSAgbUlucHV0ID0gW2lucHV0IHJldGFpbl07Ci0gIG1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl07CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0ID0gaW5wdXQ7CisgICAgX291dHB1dCA9IG91dHB1dDsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IGlucHV0IG91dHB1dFN0cmVhbTogbmlsXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXQgb3V0cHV0U3RyZWFtOm5pbF07CiB9CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dAorLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOiBuaWwgb3V0cHV0U3RyZWFtOiBvdXRwdXRdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTpuaWwgb3V0cHV0U3RyZWFtOm91dHB1dF07CiB9CiAKLS0gKHZvaWQpIGRlYWxsb2MKKy0odm9pZCkgZGVhbGxvYwogewotICBbbUlucHV0IHJlbGVhc2VdOwotICBbbU91dHB1dCByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOworICBbc2VsZiBjbG9zZV07CiB9CiAKLQotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7Ci0gIGludCByZXQgPSAwOworICBVSW50MzIgZ290ID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbikgewotICAgIHJldCA9IFttSW5wdXQgcmVhZDogYnVmK29mZitnb3QgbWF4TGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiJdOworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXQ7CisKKyAgICBnb3QgKz0gcmVhZDsKICAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdvdCArPSByZWFkOworICB9CisKICAgcmV0dXJuIGdvdDsKIH0KIAogCi0tICh2b2lkKSB3cml0ZTogKHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAorLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CisgIE5TSW50ZWdlciB0b3RhbCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKLSAgICByZXN1bHQgPSBbbU91dHB1dCB3cml0ZTogZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDogbGVuZ3RoLWdvdF07Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiRXJyb3Igd3JpdGluZyB0byB0cmFuc3BvcnQgb3V0cHV0IHN0cmVhbS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogW21PdXRwdXQgc3RyZWFtRXJyb3JdXTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFbmQgb2Ygb3V0cHV0IHN0cmVhbS4iXTsKKworICAgIHRvdGFsID0gW19vdXRwdXQgd3JpdGU6ZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDpsZW5ndGgtZ290XTsKKyAgICBpZiAodG90YWwgPT0gLTEpIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgICAgfQorICAgICAgcmV0dXJuIE5POwogICAgIH0KLSAgICBnb3QgKz0gcmVzdWx0OworICAgIGVsc2UgaWYgKHRvdGFsID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgZ290ICs9IHRvdGFsOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIC8vIG5vIGZsdXNoIGZvciB5b3UhCisgIHJldHVybiBZRVM7Cit9CisKKy0odm9pZCkgY2xvc2UKK3sKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXQgPSBzZWxmLmlucHV0OworICBpZiAoaW5wdXQpIHsKKyAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZSZWFkU3RyZWFtUmVmKShpbnB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbaW5wdXQgc2V0RGVsZWdhdGU6bmlsXTsKKyAgICBbaW5wdXQgY2xvc2VdOworICAgIFtpbnB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBpbnB1dCA9IG5pbDsKKyAgfQorCisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQgPSBzZWxmLm91dHB1dDsKKyAgaWYgKG91dHB1dCkgeworICAgIC8vIENsb3NlIGFuZCByZXNldCBvdXRwdXRzdHJlYW0KKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGV3JpdGVTdHJlYW1SZWYpKG91dHB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbb3V0cHV0IHNldERlbGVnYXRlOm5pbF07CisgICAgW291dHB1dCBjbG9zZV07CisgICAgW291dHB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBvdXRwdXQgPSBuaWw7CisgIH0KIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNTTFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydCA8TlNTdHJlYW1EZWxlZ2F0ZT4KKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CisKKy0oQk9PTCkgaXNPcGVuOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnNzbEhvc3RuYW1lOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBpbnQgc2Q7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNTTFNvY2tldFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcgoreworICBfc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisKKworCisgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeworICAgICAgTlNMb2coQCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSAlQCIsIGhvc3RuYW1lKTsKKyAgICAgIGhlcnJvcigicmVzb2x2Iik7CisgICAgICBpZiAoaSA9PSA5KSB7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuaWw7CisgICAgICB9CisgICAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6MC4yXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1zZXQoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIG1lbWNweSgmcGluLnNpbl9hZGRyLCBocC0+aF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgaWYgKChfc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdChfc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGluLCBzaXplb2YocGluKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgY29uZW5jdCB0byBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgX3NkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKworICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpOworCisgICAgTlNEaWN0aW9uYXJ5ICpzZXR0aW5ncyA9IEB7KF9fYnJpZGdlIE5TU3RyaW5nICopa0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbjogQFlFU307CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZSZWFkU3RyZWFtUmVmKXJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworCisgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgIH0KKworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvYworeworICBbc2VsZiBjbG9zZV07Cit9CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQorCistKHZvaWQpIHN0cmVhbTooTlNTdHJlYW0gKilhU3RyZWFtCisgICBoYW5kbGVFdmVudDooTlNTdHJlYW1FdmVudClldmVudENvZGUKK3sKKyAgc3dpdGNoIChldmVudENvZGUpIHsKKyAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOiB7CisKKyAgICBCT09MIHByb2NlZWQgPSBOTzsKKyAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQgPSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOworICAgIENGTXV0YWJsZUFycmF5UmVmIG5ld1BvbGljaWVzID0gTlVMTDsKKworICAgIGRvIHsKKworICAgICAgU2VjVHJ1c3RSZWYgdHJ1c3QgPSAoX19icmlkZ2UgU2VjVHJ1c3RSZWYpW2FTdHJlYW0gcHJvcGVydHlGb3JLZXk6KE5TU3RyaW5nICopa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3RdOworCisgICAgICAvLyBBZGQgbmV3IHBvbGljeSB0byBjdXJyZW50IGxpc3Qgb2YgcG9saWNpZXMKKyAgICAgIFNlY1BvbGljeVJlZiBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woTk8sIChfX2JyaWRnZSBDRlN0cmluZ1JlZikoX3NzbEhvc3RuYW1lKSk7CisgICAgICBpZiAoIXBvbGljeSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgQ0ZBcnJheVJlZiBwb2xpY2llczsKKyAgICAgIGlmIChTZWNUcnVzdENvcHlQb2xpY2llcyh0cnVzdCwgJnBvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3UG9saWNpZXMgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkoTlVMTCwgMCwgcG9saWNpZXMpOworICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwb2xpY3kpOworCisgICAgICBDRlJlbGVhc2UocG9saWNpZXMpOworICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisKKyAgICAgIC8vIFVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgaWYgKFNlY1RydXN0U2V0UG9saWNpZXModHJ1c3QsIG5ld1BvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHJ1c3RSZXN1bHQpIHsKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IFVTRVIiKTsKKyAgICAgICAgcHJvY2VlZCA9IFlFUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQ6CisgICAgICAgIC8vIE5TTG9nKEAiVHJ1c3RlZCBieSBPUyIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZToKKyAgICAgICAgcHJvY2VlZCA9IHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCB0cnVzdFJlc3VsdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdERlbnk6CisgICAgICAgIC8vIE5TTG9nKEAiRGVueSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZToKKyAgICAgICAgLy8gTlNMb2coQCJGYXRhbFRydXN0RmFpbHVyZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgorICAgICAgICAvLyBOU0xvZyhAIk90aGVyRXJyb3IiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0SW52YWxpZDoKKyAgICAgICAgLy8gTlNMb2coQCJJbnZhbGlkIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBOU0xvZyhAIkRlZmF1bHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9CisgICAgd2hpbGUgKE5PKTsKKworICAgIGlmICghcHJvY2VlZCkgeworICAgICAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFJlc3VsdDogJXUiLCB0cnVzdFJlc3VsdCk7CisgICAgICBbYVN0cmVhbSBjbG9zZV07CisgICAgfQorCisgICAgaWYgKG5ld1BvbGljaWVzKSB7CisgICAgICBDRlJlbGVhc2UobmV3UG9saWNpZXMpOworICAgIH0KKworICB9CisgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IEVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtOiAlQCIsIFthU3RyZWFtIHN0cmVhbUVycm9yXSk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIE5TU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoKKyAgICBicmVhazsKKyAgfQorfQorCitCT09MIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKFNlY1RydXN0UmVmIG15VHJ1c3QsIFNlY1RydXN0UmVzdWx0VHlwZSBsYXN0VHJ1c3RSZXN1bHQpCit7CisgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKKyAgQ0ZBYnNvbHV0ZVRpbWUgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKTsKKworICBDRkFic29sdXRlVGltZSB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDA7CisgIENGQWJzb2x1dGVUaW1lIG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIHRpbWVJbmNyZW1lbnQ7CisKKyAgaWYgKHRydXN0VGltZSAtIG5ld1RpbWUpIHsKKworICAgIENGRGF0ZVJlZiBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOworICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlKTsKKyAgICBDRlJlbGVhc2UobmV3RGF0ZSk7CisKKyAgICBpZiAoU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmbGFzdFRydXN0UmVzdWx0KSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgIH0KKworICBpZiAobGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgfHwgbGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkKSB7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorCisgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIGlzT3BlbgoreworICBpZiAoX3NkID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2YzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IpIHsKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbiAgPSAtMTAwMDAsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZSAgICAgICAgID0gLTEwMDAxLAorICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JDb25uZWN0ICAgICAgICAgICAgICA9IC0xMDAwMiwKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTk1N2QuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQgewotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ0YWY5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgIlRTb2NrZXRDbGllbnQuaCIKLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0JTlNJbnB1dFN0cmVhbSAqIGlucHV0U3RyZWFtID0gTlVMTDsKLQlOU091dHB1dFN0cmVhbSAqIG91dHB1dFN0cmVhbSA9IE5VTEw7Ci0JQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOwotCUNGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOwotCUNGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKLQlpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgewotCQlDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0JCUNGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQkKLQkJaW5wdXRTdHJlYW0gPSAoTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07Ci0JCVtpbnB1dFN0cmVhbSByZXRhaW5dOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluXTsKLQkJW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLQkJW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW291dHB1dFN0cmVhbSBvcGVuXTsKLQl9Ci0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0JCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjkxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydDsKKworLShpZCkgaW5pdFdpdGhQYXRoOihOU1N0cmluZyAqKXBhdGg7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU4YWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0ICJUU29ja2V0VHJhbnNwb3J0LmgiCisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworQGludGVyZmFjZSBUU29ja2V0VHJhbnNwb3J0ICgpIDxOU1N0cmVhbURlbGVnYXRlPgorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU29ja2V0VHJhbnNwb3J0CisKKy0gKGlkKSBpbml0V2l0aFJlYWRTdHJlYW06IChDRlJlYWRTdHJlYW1SZWYpIHJlYWRTdHJlYW0gd3JpdGVTdHJlYW06IChDRldyaXRlU3RyZWFtUmVmKSB3cml0ZVN0cmVhbQoreworICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbSA9IG5pbDsKKyAgTlNPdXRwdXRTdHJlYW0gKm91dHB1dFN0cmVhbSA9IG5pbDsKKworICBpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgeworCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgICAgaW5wdXRTdHJlYW0gPSAoX19icmlkZ2UgTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07CisgICAgW2lucHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpOU1J1bkxvb3AuY3VycmVudFJ1bkxvb3AgZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOk5TUnVuTG9vcC5jdXJyZW50UnVuTG9vcCBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworICB9CisgIGVsc2UgeworCisgICAgaWYgKHJlYWRTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKKyAgICB9CisKKyAgICBpZiAod3JpdGVTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgICAgfQorCisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIHJldHVybiBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKK30KKworLSAoaWQpIGluaXRXaXRoSG9zdG5hbWU6IChOU1N0cmluZyAqKSBob3N0bmFtZQorICAgICAgICAgICAgICAgICAgIHBvcnQ6IChpbnQpIHBvcnQKK3sKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpaG9zdG5hbWUsIHBvcnQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAoreworICBDRlNvY2tldE5hdGl2ZUhhbmRsZSBzb2NrZmQgPSBzb2NrZXQoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgaW50IHllcyA9IDE7CisgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gc2V0IFJFVVNFQUREUiBwcm9wZXJ0eSBvZiBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIE5TRGF0YSAqc2VydmVyQWRkcmVzcyA9IFtbc2VsZiBjbGFzc10gY3JlYXRlQWRkcmVzc1dpdGhQYXRoOnBhdGhdOworCisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc29ja2ZkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgaWYgKCFyZWFkU3RyZWFtIHx8ICF3cml0ZVN0cmVhbSkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSByZWFkL3dyaXRlIHN0cmVhbSBwYWlyIGZvciBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXNlcnZlckFkZHJlc3MuYnl0ZXMsIChzb2NrbGVuX3QpIHNlcnZlckFkZHJlc3MubGVuZ3RoKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IENvbm5lY3QgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCisrIChOU0RhdGEgKikgY3JlYXRlQWRkcmVzc1dpdGhQYXRoOiAoTlNTdHJpbmcgKilwYXRoCit7CisgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2YWRkcjsKKworICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2Yoc2VydmFkZHIuc3VuX3BhdGgpKSB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBiemVybygmc2VydmFkZHIsc2l6ZW9mKHNlcnZhZGRyKSk7CisgIHNlcnZhZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgbWVtY3B5KHNlcnZhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgIHNlcnZhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZzZXJ2YWRkcik7CisKKyAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlczomc2VydmFkZHIgbGVuZ3RoOnNpemVvZihzZXJ2YWRkcildOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAppbmRleCA2MWViYmQyLi41NThjZjYwIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCkBAIC0xNywyMCArMTcsMzIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQHByb3RvY29sIFRUcmFuc3BvcnQgPE5TT2JqZWN0PgogCi0gIC8qKgotICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgcmVhZAotICAgKgotICAgKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8KLSAgICogQHBhcmFtIG9mZiBJbmRleCBpbiBidWZmZXIgdG8gc3RhcnQgc3RvcmluZyBieXRlcyBhdAotICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCi0gICAqLwotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW47CisvKioKKyAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCisgKgorICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCisgKiBAcGFyYW0gb2ZmIEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0CisgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXR1cm4gWUVTIGlmIHN1Y2NlZWRlZCwgTk8gaWYgZmFpbGVkCisgKiBAdGhyb3dzIFRUcmFuc3BvcnRFcnJvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgKi8KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoOworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKW1heExlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIGZsdXNoOworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKwogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckRvbWFpbjsKKworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFRyYW5zcG9ydEVycm9yKSB7CisgIFRUcmFuc3BvcnRFcnJvclVua25vd24gICAgICAgID0gMCwKKyAgVFRyYW5zcG9ydEVycm9yTm90T3BlbiAgICAgICAgPSAxLAorICBUVHJhbnNwb3J0RXJyb3JBbHJlYWR5T3BlbiAgICA9IDIsCisgIFRUcmFuc3BvcnRFcnJvclRpbWVkT3V0ICAgICAgID0gMywKKyAgVFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlICAgICAgPSA0LAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTsKKworCit0eXBlZGVmIE5TX0VOVU0oaW50LCBUSHR0cFRyYW5zcG9ydEVycm9yKSB7CisgIFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UgID0gMTAwMSwKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXMgICAgPSAxMDAyLAorICBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb24gICA9IDEwMDMsCit9OwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFmMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0KQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRG9tYWluID0gQCJUVHJhbnNwb3J0RXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXkgPSBAImh0dHBFcnJvciI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDlmZTIuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbjsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY3MTQ5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwLzNyZHBhcnR5LnByb3BzIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhkNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiAvPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyI+CisgICAgPEJPT1NUX1JPT1Q+JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wPC9CT09TVF9ST09UPgorICAgIDxPUEVOU1NMX1JPT1RfRElSPiQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMjwvT1BFTlNTTF9ST09UX0RJUj4KKyAgICA8TElCRVZFTlRfUk9PVD4kKFRISVJEX1BBUlRZKVxsaWJldmVudC0yLjAuMjEtc3RhYmxlPC9MSUJFVkVOVF9ST09UPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIC8+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIC8+CisgIDxJdGVtR3JvdXA+CisgICAgPEJ1aWxkTWFjcm8gSW5jbHVkZT0iQk9PU1RfUk9PVCI+CisgICAgICA8VmFsdWU+JChCT09TVF9ST09UKTwvVmFsdWU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZT50cnVlPC9FbnZpcm9ubWVudFZhcmlhYmxlPgorICAgIDwvQnVpbGRNYWNybz4KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJPUEVOU1NMX1JPT1RfRElSIj4KKyAgICAgIDxWYWx1ZT4kKE9QRU5TU0xfUk9PVF9ESVIpPC9WYWx1ZT4KKyAgICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlPnRydWU8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgPC9CdWlsZE1hY3JvPgorICAgIDxCdWlsZE1hY3JvIEluY2x1ZGU9IkxJQkVWRU5UX1JPT1QiPgorICAgICAgPFZhbHVlPiQoTElCRVZFTlRfUk9PVCk8L1ZhbHVlPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGU+dHJ1ZTwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICA8L0J1aWxkTWFjcm8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllYTgyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgIiIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIGxpYnJhcnkKK3NldCggdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKykKKworIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CisjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCitpZiAoTk9UIFdJTkNFKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCisgICAgKQorZW5kaWYoKQorCisKK2lmIChXSU4zMikKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisgICAgKQorICAgIGlmKE5PVCBXSU5DRSkKKyAgICAgICAgIyBUaGlzIGZpbGUgdXNlcyBwaXBlcyBzbyBpdCBjdXJyZW50bHkgd29uJ3Qgd29yayBvbiBXaW5kb3dzIENFCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICAjIFRoZXNlIGZpbGVzIGV2YWx1YXRlIHRvIG5vdGhpbmcgb24gV2luZG93cywgc28gb21pdCB0aGVtIGZyb20gdGhlCisgICAgIyBXaW5kb3dzIGJ1aWxkCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAorICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCisgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKKyAgICApCitlbHNlKCkKKyAgICBpZihVTklYKQorICAgICAgICBpZihBTkRST0lEKQorICAgICAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgc2V0KCB0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBUaHJpZnQgbm9uIGJsb2NraW5nIHNlcnZlcgorc2V0KCB0aHJpZnRjcHBuYl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCispCisKKyMgVGhyaWZ0IHpsaWIgc2VydmVyCitzZXQoIHRocmlmdGNwcHpfU09VUkNFUworICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKykKKworIyBUaHJpZnQgUXQ0IHNlcnZlcgorc2V0KCB0aHJpZnRjcHBxdF9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCispCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0ICR7dGhyaWZ0Y3BwX1NPVVJDRVN9ICR7dGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFU30pCitpZihXSU4zMikKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9IHdzMl8zMikKK2Vsc2UoKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30pCitlbmRpZigpCisKK2lmKFdJVEhfTElCRVZFTlQpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZm9ybSB1cHN0cmVhbQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKworICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRuYiAke3RocmlmdGNwcG5iX1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0bmIgJHtTWVNMSUJTfSAke0xJQkVWRU5UX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdG5iIHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9aTElCKQorICAgIGZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHogJHt0aHJpZnRjcHB6X1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0eiAke1NZU0xJQlN9ICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnR6IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCisgICAgc2V0KENNQUtFX0FVVE9NT0MgT04pCisgICAgZmluZF9wYWNrYWdlKFF0NCBSRVFVSVJFRCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0ICR7dGhyaWZ0Y3BwcXRfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdCAke1NZU0xJQlN9IFF0NDo6UXRDb3JlIFF0NDo6UXROZXR3b3JrKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdCB0aHJpZnQpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorICAgICMgUXQ1IGhhcyBpdHMgb3duIGRpcmVjdG9yeSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFF0NCBjYXVzZWQgYnkgQ01BS0VfQVVUT01PQworICAgIGFkZF9zdWJkaXJlY3Rvcnkoc3JjL3RocmlmdC9xdCkKK2VuZGlmKCkKKworaWYoTVNWQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIEluc3RhbGwgdGhlIGhlYWRlcnMKK2luc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiIFBBVFRFUk4gIioudGNjIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiZjJmZTI2Li44NWJiOWFiCi0tLSBhL2xpYi9jcHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDMwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1BQ0xPQ0FMX0FNRkxBR1MgPSAtSSAuL2FjbG9jYWwKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCittb2NfJS5jcHA6ICUuaAorCSQoUVRfTU9DKSAkKFFUX0NGTEFHUykgJDwgLW8gJEAKKworbW9jX18lLmNwcDogJS5oCisJJChRVDVfTU9DKSAkKFFUNV9DRkxBR1MpICQ8IC1vICRACisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKKyMgVGhpcyBmaWxlIGlzIG5lZWRlZCBieSBjb21waWxlciB3aXRoIHBsdWdpbiwgd2hpbGUgdGVzdC9NYWtlZmlsZS5hbSBuZWVkcyBjb21waWxlcgorIyBTbyB0ZXN0IGRpcmVjdG9yeSBpcyBkaXJlY3RseSBwaWNrZWQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLmFtIGZvciBwbHVnaW4gYnVpbGQKK2lmICFXSVRIX1BMVUdJTgorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorZW5kaWYKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwogCiBsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnQubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0LnBjCitsaWJ0aHJpZnRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikKK2xpYnRocmlmdF9sYV9MSUJBREQgPSAkKEJPT1NUX0xERkxBR1MpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykKIAogIyMgV2Ugb25seSBidWlsZCB0aGUgZXh0cmEgbGlicmFyaWVzIGlmIHdlIGhhdmUgdGhlIGRlcGVuZGVuY2llcywKICMjIGJ1dCB3ZSBpbnN0YWxsIGFsbCBvZiB0aGUgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkuCkBAIC0zNCwxMzEgKzUyLDIzMSBAQAogbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHoubGEKIHBrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC16LnBjCiBlbmRpZgoraWYgQU1YX0hBVkVfUVQKK2xpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnRxdC5sYQorcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXF0LnBjCitlbmRpZgoraWYgQU1YX0hBVkVfUVQ1CitsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0cXQ1LmxhCitwa2djb25maWdfREFUQSArPSB0aHJpZnQtcXQ1LnBjCitlbmRpZgogCi1BTV9DWFhGTEFHUyA9IC1XYWxsCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJChzcmNkaXIpL3NyYworQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIC1JJChzcmNkaXIpL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL1RocmlmdC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAorbGlidGhyaWZ0X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogCi1saWJ0aHJpZnRuYl9sYV9TT1VSQ0VTID0gc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCitsaWJ0aHJpZnRfbGFfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAogCi1saWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorbGlidGhyaWZ0bmJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCiAKK2xpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKworCitsaWJ0aHJpZnRxdF9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKK25vZGlzdF9saWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpCitsaWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKK0NMRUFORklMRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykKKworbGlidGhyaWZ0cXQ1X2xhX01PQyA9IHNyYy90aHJpZnQvcXQvbW9jX19UUVRjcFNlcnZlci5jcHAKK25vZGlzdF9saWJ0aHJpZnRxdDVfbGFfU09VUkNFUyA9ICQobGlidGhyaWZ0cXQ1X2xhX01PQykKK2xpYnRocmlmdHF0NV9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCitDTEVBTkZJTEVTICs9ICQobGlidGhyaWZ0cXQ1X2xhX01PQykKIAogIyBGbGFncyBmb3IgdGhlIHZhcmlvdXMgbGlicmFyaWVzCiBsaWJ0aHJpZnRuYl9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpCiBsaWJ0aHJpZnR6X2xhX0NQUEZMQUdTICA9ICQoQU1fQ1BQRkxBR1MpICQoWkxJQl9DUFBGTEFHUykKLQorbGlidGhyaWZ0cXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFFUX0NGTEFHUykKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVQ1X0NGTEFHUykKK2lmIFFUNV9SRURVQ0VfUkVMT0NBVElPTlMKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyArPSAtZlBJQworZW5kaWYKK2xpYnRocmlmdG5iX2xhX0NYWEZMQUdTID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdHpfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdHF0X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCitsaWJ0aHJpZnRxdDVfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdG5iX2xhX0xERkxBR1MgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCitsaWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFpMSUJfTElCUykKK2xpYnRocmlmdHF0X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUX0xJQlMpCitsaWJ0aHJpZnRxdDVfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVQ1X0xJQlMpCiAKIGluY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvVGhyaWZ0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UUmVmbGVjdGlvbkxvY2FsLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RMb2dnaW5nLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UaHJpZnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RMb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEJhc2UuaAogCiBpbmNsdWRlX2NvbmN1cnJlbmN5ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvY29uY3VycmVuY3kKIGluY2x1ZGVfY29uY3VycmVuY3lfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9NdXRleC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTW9uaXRvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaHJlYWQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1V0aWwuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCiBpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UT25lV2F5UHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCiAKIGluY2x1ZGVfdHJhbnNwb3J0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvdHJhbnNwb3J0CiBpbmNsdWRlX3RyYW5zcG9ydF9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNvY2tldC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCiAKIGluY2x1ZGVfc2VydmVyZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvc2VydmVyCiBpbmNsdWRlX3NlcnZlcl9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKIAogaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKIGluY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKIAotbm9pbnN0X1BST0dSQU1TID0gY29uY3VycmVuY3lfdGVzdAoraW5jbHVkZV9hc3luY2RpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL2FzeW5jCitpbmNsdWRlX2FzeW5jX0hFQURFUlMgPSBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKIAotY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTID0gc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZEZhY3RvcnlUZXN0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKK2luY2x1ZGVfcXRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9xdAoraW5jbHVkZV9xdF9IRUFERVJTID0gXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCiAKLWNvbmN1cnJlbmN5X3Rlc3RfTERBREQgPSBsaWJ0aHJpZnQubGEKK1dJTkRPV1NfRElTVCA9IFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MgXAorICAgICAgICAgICAgIHRocmlmdC5zbG4gXAorICAgICAgICAgICAgIGxpYnRocmlmdC52Y3hwcm9qIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnRuYi52Y3hwcm9qIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgXAorICAgICAgICAgICAgIDNyZHBhcnR5LnByb3BzCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgUkVBRE1FIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKICAgICAgICAgICAgICB0aHJpZnQtbmIucGMuaW4gXAogICAgICAgICAgICAgIHRocmlmdC5wYy5pbiBcCi0gICAgICAgICAgICAgdGhyaWZ0LXoucGMuaW4KKyAgICAgICAgICAgICB0aHJpZnQtei5wYy5pbiBcCisgICAgICAgICAgICAgdGhyaWZ0LXF0LnBjLmluIFwKKyAgICAgICAgICAgICB0aHJpZnQtcXQ1LnBjLmluIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRSBiL2xpYi9jcHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZkMDE3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotVGhyaWZ0IEMrKyBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIEMrKwotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBUaHJpZnQgQysrIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKLWluIHRoZSB0b3AtbGV2ZWwgUkVBRE1FLCBvciBydW4gYm9vdHN0cmFwLnNoIGluIHRoaXMgZm9sZGVyIHRvIGdlbmVyYXRlIHRoZQotTWFrZWZpbGVzLgotCi1JbiBjYXNlIHlvdSBkbyBub3Qgd2FudCB0byBvcGVuIGFub3RoZXIgUkVBRE1FIGZpbGUsIGRvIHRoaXM6Ci0gIC4vYm9vdHN0cmFwLnNoCi0gIC4vY29uZmlndXJlICgtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCkKLSAgbWFrZQotICBzdWRvIG1ha2UgaW5zdGFsbAotCi1UaHJpZnQgaXMgZGl2aWRlZCBpbnRvIHR3byBsaWJyYXJpZXMuCi0KLWxpYnRocmlmdAotICBUaGUgY29yZSBUaHJpZnQgbGlicmFyeSBjb250YWlucyBhbGwgdGhlIGNvcmUgVGhyaWZ0IGNvZGUuIEl0IHJlcXVpcmVzCi0gIGJvb3N0IHNoYXJlZCBwb2ludGVycywgcHRocmVhZHMsIGFuZCBsaWJydC4KLQotbGlidGhyaWZ0bmIKLSAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KLQotTGlua2luZyBBZ2FpbnN0IFRocmlmdAotPT09PT09PT09PT09PT09PT09PT09PQotCi1BZnRlciB5b3UgYnVpbGQgYW5kIGluc3RhbGwgVGhyaWZ0IHRoZSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB0bwotL3Vzci9sb2NhbC9saWIgYnkgZGVmYXVsdC4gTWFrZSBzdXJlIHRoaXMgaXMgaW4geW91ciBMRFBBVEguCi0KLU9uIExpbnV4LCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbnN1cmUgdGhhdCAvdXNyL2xvY2FsL2xpYiBpcyBpbgoteW91ciAvZXRjL2xkLnNvLmNvbmYgYW5kIHRoZW4gcnVuIC9zYmluL2xkY29uZmlnLgotCi1EZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHlvdSBhcmUgbGlua2luZyBkeW5hbWljYWxseSBvciBzdGF0aWNhbGx5IGFuZCBob3cKLXlvdXIgYnVpbGQgZW52aXJvbm1lbnQgaXQgc2V0IHVwLCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsCi1saWJyYXJpZXMgd2hlbiBsaW5raW5nIGFnYWluc3QgdGhyaWZ0LCBzdWNoIGFzIGxpYnJ0IGFuZC9vciBsaWJwdGhyZWFkLiBJZgoteW91IGFyZSB1c2luZyBsaWJ0aHJpZnRuYiB5b3Ugd2lsbCBhbHNvIG5lZWQgbGliZXZlbnQuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQotCi1saWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCi1odHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9SRUFETUUubWQgYi9saWIvY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzQ0YTZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9SRUFETUUubWQKQEAgLTAsMCArMSwyOTYgQEAKK1RocmlmdCBDKysgU29mdHdhcmUgTGlicmFyeQorCisjIExpY2Vuc2UKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVXNpbmcgVGhyaWZ0IHdpdGggQysrCisKK1RoZSBUaHJpZnQgQysrIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2luIHRoZSB0b3AtbGV2ZWwgUkVBRE1FLm1kCisKK0luIGNhc2UgeW91IGRvIG5vdCB3YW50IHRvIG9wZW4gYW5vdGhlciBSRUFETUUubWQgZmlsZSwgZG8gdGhpcyB0aHJpZnQgc3JjOgorCisgICAgLi9ib290c3RyYXAuc2gKKyAgICAuL2NvbmZpZ3VyZSAoLS13aXRoLWJvb3N0PS91c3IvbG9jYWwpCisgICAgbWFrZQorICAgIHN1ZG8gbWFrZSBpbnN0YWxsCisKK1RocmlmdCBpcyBkaXZpZGVkIGludG8gdHdvIGxpYnJhcmllcy4KKworKiBsaWJ0aHJpZnQgLSBUaGUgY29yZSBUaHJpZnQgbGlicmFyeSBjb250YWlucyBhbGwgdGhlIGNvcmUgVGhyaWZ0IGNvZGUuIEl0IHJlcXVpcmVzCisgIGJvb3N0IHNoYXJlZCBwb2ludGVycywgcHRocmVhZHMsIGFuZCBsaWJydC4KKworKiBsaWJ0aHJpZnRuYiAtIFRoaXMgbGlicmFyeSBjb250YWlucyB0aGUgVGhyaWZ0IG5vbmJsb2NraW5nIHNlcnZlciwgd2hpY2ggdXNlcyBsaWJldmVudC4KKyAgVG8gbGluayB0aGlzIGxpYnJhcnkgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGxpbmsgbGliZXZlbnQuCisKKyMjIExpbmtpbmcgQWdhaW5zdCBUaHJpZnQKKworQWZ0ZXIgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIFRocmlmdCB0aGUgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgdG8KKy91c3IvbG9jYWwvbGliIGJ5IGRlZmF1bHQuIE1ha2Ugc3VyZSB0aGlzIGlzIGluIHlvdXIgTERQQVRILgorCitPbiBMaW51eCwgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgL3Vzci9sb2NhbC9saWIgaXMgaW4KK3lvdXIgL2V0Yy9sZC5zby5jb25mIGFuZCB0aGVuIHJ1biAvc2Jpbi9sZGNvbmZpZy4KKworRGVwZW5kaW5nIHVwb24gd2hldGhlciB5b3UgYXJlIGxpbmtpbmcgZHluYW1pY2FsbHkgb3Igc3RhdGljYWxseSBhbmQgaG93Cit5b3VyIGJ1aWxkIGVudmlyb25tZW50IGl0IHNldCB1cCwgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgYWRkaXRpb25hbAorbGlicmFyaWVzIHdoZW4gbGlua2luZyBhZ2FpbnN0IHRocmlmdCwgc3VjaCBhcyBsaWJydCBhbmQvb3IgbGlicHRocmVhZC4gSWYKK3lvdSBhcmUgdXNpbmcgbGlidGhyaWZ0bmIgeW91IHdpbGwgYWxzbyBuZWVkIGxpYmV2ZW50LgorCisjIyBEZXBlbmRlbmNpZXMKKworSWYgeW91ciBDKysgZW52aXJvbm1lbnQgaW1wbGVtZW50cyBDKysxMSBvciBsYXRlciwgdGhyaWZ0IHdpbGwgYXV0b21hdGljYWxseSB1c2UKK3N0ZDo6c2hhcmVkX3B0ci4gIE90aGVyd2lzZSB5b3Ugd2lsbCBuZWVkIHRoZSBib29zdCBsaWJyYXJ5IHRvIHByb3ZpZGUgYSBzaGFyZWRfcHRyCitpbXBsZW1lbnRhdGlvbiBmb3IgQysrIGVudmlyb25tZW50cyBwcmUtQysrMTEuICBJZiB5b3UgYXJlIGxpbmtpbmcgYWdhaW5zdCBjb2RlCit0aGF0IGV4cGVjdHMgdG8gYmUgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHIsIHlvdSBjYW4gZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IKK3ZhcmlhYmxlIEZPUkNFX0JPT1NUX1NNQVJUX1BUUiBmb3IgeW91ciBidWlsZCBvZiB0aHJpZnQgdG8gbWFrZSBpdCB1c2UgYm9vc3QgaW5zdGVhZAorb2Ygc3RkIGZvciBhIG51bWJlciBvZiBtZW1vcnkgcmVsYXRlZCBjbGFzc2VzLiAgU2VlIHRocmlmdC9zdGRjeHguaCBmb3IgbW9yZS4KKworbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQoraHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KKworIyBVc2luZyBUaHJpZnQgd2l0aCBDKysgb24gV2luZG93cworCitCb3RoIHRoZSBhdXRvY29uZiBhbmQgY21ha2UgYnVpbGQgc3lzdGVtcyBhcmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBtYW55CitzeXN0ZW0gY29uZmlndXJhdGlvbnMgd2l0aG91dCB0aGUgbmVlZCB0byBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb25zLCBob3dldmVyIGlmCit5b3UgcnVuIGludG8gcHJvYmxlbXMgb3Igd2FudCB0byByZWRpcmVjdCB0aHJpZnQgdG8gYnVpbGQgYW5kIGxpbmsgYWdhaW5zdCB5b3VyCitvd24gcHJvdmlkZWQgdGhpcmQgcGFydHkgbGlicmFyaWVzOgorCitCT09TVF9ST09UIDogRm9yIGJvb3N0LCBlLmcuIEQ6XGJvb3N0XzFfNTVfMAorT1BFTlNTTF9ST09UX0RJUiA6IEZvciBPcGVuU1NMLCBlLmcuIEQ6XE9wZW5TU0wtV2luMzIKKworb25seSByZXF1aXJlZCBieSBsaWJ0aHJpZnRuYjoKKworTElCRVZFTlRfUk9PVF9ESVIgOiBGb3IgTGliZXZlbnQgZS5nLiBEOlxsaWJldmVudC0yLjAuMjEtc3RhYmxlCisKK1NlZSAvM3JkcGFydHkudXNlciBmb3IgbW9yZSBkZXRhaWxzLgorCitUaGUgc2FtZSBsaW5raW5nIGd1aWRlbGluZXMgZGVzY3JpYmVkIGFib3ZlIGZvciBsaWJ0aHJpZnRuYiBhcHBseSB0byB3aW5kb3dzIGFzIHdlbGwuCisKKyMjIExpbmtpbmcgQWdhaW5zdCBUaHJpZnQKKworWW91IG5lZWQgdG8gbGluayB5b3VyIHByb2plY3QgdGhhdCB1c2VzIHRocmlmdCBhZ2FpbnN0IGFsbCB0aGUgdGhyaWZ0CitkZXBlbmRlbmNpZXM7IGluIHRoZSBjYXNlIG9mIGxpYnRocmlmdCwgYm9vc3QgYW5kIGZvcgorbGlidGhyaWZ0bmIsIGxpYmV2ZW50LgorCitJbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHlvdSBtdXN0IGFsc28gc2V0IEhBVkVfQ09ORklHX0ggYXMgZm9yY2UgaW5jbHVkZQordGhlIGNvbmZpZyBoZWFkZXI6ICJ3aW5kb3dzL2NvbmZnLmgiCisKKyMjIERlcGVuZGVuY2llcworCitUaGUgc2FtZSBkZXBlbmRlbmNpZXMgZm9yIHNoYXJlZF9wdHIgYXMgZGVzY3JpYmVkIGFib3ZlIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KKworYm9vc3QgdGhyZWFkCitodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy9yZWxlYXNlL2RvYy9odG1sL3RocmVhZC5odG1sCisKK2xpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkKK2h0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCisKKyMjIE5vdGVzIG9uIGJvb3N0IHRocmVhZCAoc3RhdGljIHZzIHNoYXJlZCk6CisKK0J5IGRlZmF1bHQgbGliL2NwcC93aW5kb3dzL2ZvcmNlX2luYy5oIGRlZmluZXM6CisKKyAgICAjZGVmaW5lIEJPT1NUX0FMTF9OT19MSUIgMQorICAgICNkZWZpbmUgQk9PU1RfVEhSRUFEX05PX0xJQiAxCisKK1RoaXMgaGFzIGZvciBlZmZlY3QgdG8gaGF2ZSB0aGUgaG9zdCBhcHBsaWNhdGlvbiBsaW5raW5nIGFnYWluc3QgVGhyaWZ0Cit0byBoYXZlIHRvIGxpbmsgd2l0aCBib29zdCB0aHJlYWQgYXMgYSBzdGF0aWMgbGlicmFyeS4KKworSWYgeW91IHdhbnRlZCBpbnN0ZWFkIHRvIGxpbmsgd2l0aCBib29zdCB0aHJlYWQgYXMgYSBzaGFyZWQgbGlicmFyeSwKK3lvdSdsbCBuZWVkIHRvIHVuY29tbWVudCB0aG9zZSB0d28gbGluZXMsIGFuZCByZWNvbXBpbGUuCisKKyMjIFdpbmRvd3MgdmVyc2lvbiBjb21wYXRpYmlsaXR5CisKK1RoZSBUaHJpZnQgbGlicmFyeSB0YXJnZXRzIFdpbmRvd3MgWFAgZm9yIGJyb2FkZXN0IGNvbXBhdGJpbGl0eS4gQSBub3RhYmxlCitkaWZmZXJlbmNlIGlzIGluIHRoZSBXaW5kb3dzLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb2NrZXQgcG9sbAorZnVuY3Rpb24uIFRvIHRhcmdldCBWaXN0YSwgV2luNyBvciBvdGhlciB2ZXJzaW9ucywgY29tbWVudCBvdXQgdGhlIGxpbmUKKworICAgICNkZWZpbmUgVEFSR0VUX1dJTl9YUC4KKworIyMgTmFtZWQgUGlwZXMKKworTmFtZWQgUGlwZSB0cmFuc3BvcnQgaGFzIGJlZW4gYWRkZWQgaW4gdGhlIFRQaXBlIGFuZCBUUGlwZVNlcnZlciBjbGFzc2VzLiBUaGlzCitpcyBjdXJyZW50bHkgV2luZG93cy1vbmx5LiBOYW1lZCBwaXBlIHRyYW5zcG9ydCBmb3IgKk5JWCBoYXMgbm90IGJlZW4KK2ltcGxlbWVudGVkLiBEb21haW4gc29ja2V0cyBhcmUgYSBiZXR0ZXIgY2hvaWNlIGZvciBsb2NhbCBJUEMgdW5kZXIgbm9uLVdpbmRvd3MKK09TJ3MuICpOSVggbmFtZWQgcGlwZXMgb25seSBzdXBwb3J0IDE6MSBjbGllbnQtc2VydmVyIGNvbm5lY3Rpb24uCisKKyMgVGhyaWZ0L1NTTAorCisjIyBTY29wZQorCitUaGlzIFNTTCBvbmx5IHN1cHBvcnRzIGJsb2NraW5nIG1vZGUgc29ja2V0IEkvTy4gSXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoCitUU2ltcGxlU2VydmVyLCBUVGhyZWFkZWRTZXJ2ZXIsIGFuZCBUVGhyZWFkUG9vbFNlcnZlci4KKworIyMgSW1wbGVtZW50YXRpb24KKworVGhlcmUncmUgdHdvIG1haW4gY2xhc3NlcyBUU1NMU29ja2V0RmFjdG9yeSBhbmQgVFNTTFNvY2tldC4gSW5zdGFuY2VzIG9mCitUU1NMU29ja2V0IGFyZSBhbHdheXMgY3JlYXRlZCBmcm9tIFRTU0xTb2NrZXRGYWN0b3J5LgorCitQb3NpeFNTTFRocmVhZEZhY3RvcnkgY3JlYXRlcyBQb3NpeFNTTFRocmVhZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIHRoZQorUHRocmVhZFRocmVhZCB0eXBlIGlzIHRoYXQgaXQgY2xlYW51cHMgT3BlblNTTCBlcnJvciBxdWV1ZSB1cG9uIGV4aXRpbmcKK3RoZSB0aHJlYWQuIElkZWFsbHksIE9wZW5TU0wgQVBJcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBQb3NpeFNTTFRocmVhZC4KKworIyMgSG93IHRvIHVzZSBTU0wgQVBJcworCitUaGlzIGlzIGZvciBkZW1vLiBJbiByZWFsIGNvZGUsIHR5cGljYWxseSBvbmx5IG9uZSBUU1NMU29ja2V0RmFjdG9yeQoraW5zdGFuY2UgaXMgbmVlZGVkLgorCisgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZ2V0U1NMU29ja2V0RmFjdG9yeSgpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgICAgLy8gY2xpZW50OiBsb2FkIHRydXN0ZWQgY2VydGlmaWNhdGVzCisgICAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygibXktdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZXMucGVtIik7CisgICAgICAvLyBjbGllbnQ6IG9wdGlvbmFsbHkgc2V0IHlvdXIgb3duIGFjY2VzcyBtYW5hZ2VyLCBvdGhlcndpc2UsCisgICAgICAvLyAgICAgICAgIHRoZSBkZWZhdWx0IGNsaWVudCBhY2Nlc3MgbWFuYWdlciB3aWxsIGJlIGxvYWRlZC4KKworICAgICAgZmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKCJteS1jZXJ0aWZpY2F0ZS1zaWduZWQtYnktY2EucGVtIik7CisgICAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleSgibXktcHJpdmF0ZS1rZXkucGVtIik7CisgICAgICAvLyBzZXJ2ZXI6IG9wdGlvbmFsbHkgc2V0dXAgYWNjZXNzIG1hbmFnZXIKKyAgICAgIC8vIHNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzTWFuYWdlcihuZXcgTXlBY2Nlc3NNYW5hZ2VyKTsKKyAgICAgIC8vIGZhY3RvcnktPmFjY2VzcyhhY2Nlc3NNYW5hZ2VyKTsKKyAgICAgIC4uLgorICAgIH0KKworCitjbGllbnQgY29kZSBzYW1wbGUKKworICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkgPSBnZXRTU0xTb2NrZXRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQgPSBmYWN0b3J5LmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKKyAgICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgLi4uCisKKworc2VydmVyIGNvZGUgc2FtcGxlCisKKyAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8VFNTTFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnQsIGZhY3RvcnkpKTsKKyAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSk7CisgICAgLi4uCisKKyMjIEFjY2Vzc01hbmFnZXIKKworQWNjZXNzTWFuYWdlciBkZWZpbmVzIGEgY2FsbGJhY2sgaW50ZXJmYWNlLiBJdCBoYXMgdGhyZWUgY2FsbGJhY2sgbWV0aG9kczoKKworKGEpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSk7CisKKyhiKSBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSk7CisKKyhjKSBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKTsKKworQWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMsIGFkZGl0aW9uYWwgY2hlY2tzIGFyZSBjb25kdWN0ZWQuIEFwcGxpY2F0aW9uCitpcyBnaXZlbiB0aGUgY2hhbmNlIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBjb250aW51ZSB0aGUgY29udmVyc2F0aW9uCit3aXRoIHRoZSByZW1vdGUuIEFwcGxpY2F0aW9uIGlzIHF1ZXJpZWQgdGhyb3VnaCB0aGUgYWJvdmUgdGhyZWUgInZlcmlmeSIKK21ldGhvZC4gVGhleSBhcmUgY2FsbGVkIGF0IGRpZmZlcmVudCBwb2ludHMgb2YgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgorCitEZWNpc2lvbnMgY2FuIGJlIG9uZSBvZiBBTExPVywgREVOWSwgYW5kIFNLSVAuIEFMTE9XIGFuZCBERU5ZIG1lYW5zIHRoZQorY29udmVyc2F0aW9uIHNob3VsZCBiZSBjb250aW51ZWQgb3IgZGlzY29ubmVjdGVkLCByZXNwZWN0aXZlbHkuIEFMTE9XIGFuZAorREVOWSBkZWNpc2lvbiBzdG9wcyB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuIFNLSVAgbWVhbnMgdGhlcmUncyBubyBkZWNpc2lvbgorYmFzZWQgb24gdGhlIGdpdmVuIGlucHV0LCBjb250aW51ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCisKK0ZpcnN0LCAoYSkgaXMgY2FsbGVkIHdpdGggdGhlIHJlbW90ZSBJUC4gSXQgaXMgY2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZy4KKyJzYSIgaXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBwZWVyLgorCitUaGVuLCB0aGUgY2VydGlmaWNhdGUgb2YgcmVtb3RlIHBlZXIgaXMgbG9hZGVkLiBTdWJqZWN0QWx0TmFtZSBleHRlbnNpb25zCithcmUgZXh0cmFjdGVkIGFuZCBzZW50IHRvIGFwcGxpY2F0aW9uIGZvciB2ZXJpZmljYXRpb24uIFdoZW4gYSBETlMKK3N1YmplY3RBbHROYW1lIGZpZWxkIGlzIGV4dHJhY3RlZCwgKGIpIGlzIGNhbGxlZC4gV2hlbiBhbiBJUCBzdWJqZWN0QWx0TmFtZQorZmllbGQgaXMgZXh0cmFjdGVkLCAoYykgaXMgY2FsbGVkLgorCitUaGUgImhvc3QiIGluIChiKSBpcyB0aGUgdmFsdWUgZnJvbSBUU29ja2V0OjpnZXRIb3N0KCkgaWYgdGhpcyBpcyBhIGNsaWVudAorc2lkZSBzb2NrZXQsIG9yIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkgaWYgdGhpcyBpcyBhIHNlcnZlciBzaWRlIHNvY2tldC4gVGhlCityZWFzb24gaXMgY2xpZW50IHNpZGUgc29ja2V0IGluaXRpYXRlcyB0aGUgY29ubmVjdGlvbi4gVFNvY2tldDo6Z2V0SG9zdCgpCitpcyB0aGUgcmVtb3RlIGhvc3QgbmFtZS4gT24gc2VydmVyIHNpZGUsIHRoZSByZW1vdGUgaG9zdCBuYW1lIGlzIHVua25vd24KK3VubGVzcyBpdCdzIHJldHJpZXZlZCB0aHJvdWdoIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkuIEVpdGhlciB3YXksICJob3N0Igorc2hvdWxkIGJlIHRoZSByZW1vdGUgaG9zdCBuYW1lLiBLZWVwIGluIG1pbmQsIGlmIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkKK2ZhaWxlZCwgaXQgd291bGQgcmV0dXJuIHRoZSByZW1vdGUgaG9zdCBuYW1lIGluIG51bWVyaWMgZm9ybWF0LgorCitJZiBhbGwgc3ViamVjdEFsdE5hbWUgZXh0ZW5zaW9ucyB3ZXJlICJza2lwcGVkIiwgdGhlIGNvbW1vbiBuYW1lIGZpZWxkIHdvdWxkCitiZSBjaGVja2VkLiBJdCBpcyBzZW50IHRvIGFwcGxpY2F0aW9uIHRocm91Z2ggKGMpLCB3aGVyZSAic2EiIGlzIHRoZSByZW1vdGUKK0lQIGFkZHJlc3MuICJkYXRhIiBpcyB0aGUgSVAgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSBzdWJqZWN0QWx0TmFtZSBJUAorZXh0ZW5zaW9uLCBhbmQgInNpemUiIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV4dGVuc2lvbiBkYXRhLgorCitJZiBhbnkgb2YgdGhlIGFib3ZlICJ2ZXJpZnkiIG1ldGhvZHMgcmV0dXJuZWQgYSBkZWNpc2lvbiBBTExPVyBvciBERU5ZLCB0aGUKK3ZlcmlmaWNhdGlvbiBwcm9jZXNzIHdvdWxkIGJlIHN0b3BwZWQuCisKK0lmIGFueSBvZiB0aGUgYWJvdmUgInZlcmlmeSIgbWV0aG9kcyByZXR1cm5lZCBTS0lQLCB0aGF0IGRlY2lzaW9uIHdvdWxkIGJlCitpZ25vcmVkIGFuZCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3Mgd291bGQgbW92ZSBvbiB0aWxsIHRoZSBsYXN0IGl0ZW0gaXMKK2V4YW1pbmVkLiBBdCB0aGF0IHBvaW50LCBpZiB0aGVyZSdzIHN0aWxsIG5vIGRlY2lzaW9uLCB0aGUgY29ubmVjdGlvbiBpcwordGVybWluYXRlZC4KKworVGhyZWFkIHNhZmV0eSwgYW4gYWNjZXNzIG1hbmFnZXIgc2hvdWxkIG5vdCBzdG9yZSBzdGF0ZSBpbmZvcm1hdGlvbiBpZiBpdCdzCit0byBiZSB1c2VkIGJ5IG1hbnkgU1NMIHNvY2tldHMuCisKKyMjIFNJR1BJUEUgc2lnbmFsCisKK0FwcGxpY2F0aW9ucyBydW5uaW5nIE9wZW5TU0wgb3ZlciBuZXR3b3JrIGNvbm5lY3Rpb25zIG1heSBjcmFzaCBpZiBTSUdQSVBFCitpcyBub3QgaWdub3JlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhleSByZWNlaXZlIGEgY29ubmVjdGlvbiByZXNldCBieSByZW1vdGUKK3BlZXIgZXhjZXB0aW9uLCB3aGljaCBzb21laG93IHRyaWdnZXJzIGEgU0lHUElQRSBzaWduYWwuIElmIG5vdCBoYW5kbGVkLAordGhpcyBzaWduYWwgd291bGQga2lsbCB0aGUgYXBwbGljYXRpb24uCisKKyMjIEhvdyB0byBydW4gdGVzdCBjbGllbnQvc2VydmVyIGluIFNTTCBtb2RlCisKK1RoZSBzZXJ2ZXIgYW5kIGNsaWVudCBleHBlY3RzIHRoZSBmb2xsb3dpbmdzIGZyb20gdGhlIGRpcmVjdG9yeSAvdGVzdC8KKworLSBrZXlzL3NlcnZlci5jcnQKKy0ga2V5cy9zZXJ2ZXIua2V5CistIGtleXMvQ0EucGVtCisKK1RoZSBmaWxlIG5hbWVzIGFyZSBoYXJkIGNvZGVkIGluIHRoZSBzb3VyY2UgY29kZS4gWW91IG5lZWQgdG8gY3JlYXRlIHRoZXNlCitjZXJ0aWZpY2F0ZXMgYmVmb3JlIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGNvZGUgaW4gU1NMIG1vZGUuIE1ha2Ugc3VyZSBhdCBsZWFzdAorb25lIG9mIHRoZSBmb2xsb3dpbmdzIGlzIGluY2x1ZGVkIGluICJrZXlzL3NlcnZlci5jcnQiLAorCistIHN1YmplY3RBbHROYW1lLCBETlMgbG9jYWxob3N0CistIHN1YmplY3RBbHROYW1lLCBJUCAgMTI3LjAuMC4xCistIGNvbW1vbiBuYW1lLCAgICBsb2NhbGhvc3QKKworUnVuIHdpdGhpbiAvdGVzdC8gZm9sZGVyLAorCisgICAgICAgICAuL2NwcC9UZXN0U2VydmVyIC0tc3NsICYKKyAgICAgICAgIC4vY3BwL1Rlc3RDbGllbnQgLS1zc2wKKworSWYgIi1oIDxob3N0PiIgaXMgdXNlZCB0byBydW4gY2xpZW50LCB0aGUgYWJvdmUgImxvY2FsaG9zdCIgaW4gdGhlIGFib3ZlCitrZXlzL3NlcnZlci5jcnQgaGFzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhhdCBob3N0IG5hbWUuCisKKyMjIFRTU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKQorCitUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkgc2ltcGx5IGNhbGxzCitPcGVuU1NMJ3MgUkFORF9wb2xsKCkgd2hlbiBPcGVuU1NMIGxpYnJhcnkgaXMgZmlyc3QgaW5pdGlhbGl6ZWQuCisKK1RoZSBQUk5HIHNlZWQgaXMga2V5IHRvIHRoZSBhcHBsaWNhdGlvbiBzZWN1cml0eS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCitvdmVycmlkZGVuIGlmIGl0J3Mgbm90IHN0cm9uZyBlbm91Z2ggZm9yIHlvdS4KKworIyBCcmVha2luZyBDaGFuZ2VzCisKKyMjIDAuMTEuMAorCitPbGRlciB2ZXJzaW9ucyBvZiB0aHJpZnQgZGVwZW5kZWQgb24gdGhlIDxib29zdC9zbWFydF9wdHIuaHBwPiBjbGFzc2VzIHdoaWNoCit3ZXJlIHVzZWQgaW4gdGhyaWZ0IGhlYWRlcnMgdG8gZGVmaW5lIGludGVyZmFjZXMuICBUaHJpZnQgbm93IGRldGVjdHMgQysrMTEKK2F0IGJ1aWxkIHRpbWUgYW5kIHdpbGwgcHJlZmVyIHRvIHVzZSA8bWVtb3J5PiBjbGFzc2VzIGZyb20gQysrMTEgaW5zdGVhZC4KK1lvdSBjYW4gZm9yY2UgdGhlIGxpYnJhcnkgdG8gYnVpbGQgd2l0aCBib29zdCBtZW1vcnkgY2xhc3NlcyBieSBkZWZpbmluZyB0aGUKK3ByZXByb2Nlc3NvciBtYWNybyBgRk9SQ0VfQk9PU1RfU01BUlRfUFRSYC4gIChUSFJJRlQtMjIyMSkKKworSW4gdGhlIHB0aHJlYWQgbXV0ZXggaW1wbGVtZW50YXRpb24sIHRoZSBjb250ZW50aW9uIHByb2ZpbGluZyBjb2RlIHdhcyBlbmFibGVkCitieSBkZWZhdWx0IGluIGFsbCBidWlsZHMuICBUaGlzIGNoYW5nZWQgdG8gYmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIChUSFJJRlQtNDE1MSkKKworSW4gb2xkZXIgcmVsZWFzZXMsIGlmIGEgVFNTTFNvY2tldEZhY3RvcnkncyBsaWZldGltZSB3YXMgbm90IGF0IGxlYXN0IGFzIGxvbmcKK2FzIHRoZSBUU1NMU29ja2V0cyBpdCBjcmVhdGVkLCB3ZSBzaWxlbnRseSByZXZlcnRlZCBvcGVuc3NsIHRvIHVuc2FmZSBtdWx0aXRocmVhZCBiZWhhdmlvcgorYW5kIHNvIHRoZSByZXN1bHRzIHdlcmUgdW5kZWZpbmVkLiAgQ2hhbmdlcyB3ZXJlIG1hZGUgaW4gMC4xMS4wIHRoYXQgY2F1c2UgZWl0aGVyIGFuCithc3NlcnRpb24gb3IgYSBjb3JlIGluc3RlYWQgb2YgdW5kZWZpbmVkIGJlaGF2aW9yLiAgVGhlIGxpZmV0aW1lIG9mIGEgVFNTTFNvY2tldEZhY3RvcnkKKyptdXN0KiBiZSBsb25nZXIgdGhhbiBhbnkgVFNTTFNvY2tldCB0aGF0IGl0IGNyZWF0ZXMsIG90aGVyd2lzZSBvcGVuc3NsIHdpbGwgYmUgY2xlYW5lZAordXAgdG9vIGVhcmx5LiAgSWYgdGhlIHN0YXRpYyBib29sZWFuIGlzIHNldCB0byBkaXNhYmxlIG9wZW5zc2wgaW5pdGlhbGl6YXRpb24gYW5kCitjbGVhbnVwIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uLCB0aGlzIHJlcXVpcmVtZW50IGlzIG5vdCBuZWVkZWQuCisoVEhSSUZULTQxNjQpCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDE4Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNCBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisKKyAqIHNlZSAuY2xhbmctZm9ybWF0IGluIHJvb3QgZGlyIGZvciBzZXR0aW5ncyBvZiBhY2NlcHRlZCBmb3JtYXQKKyAqIGNsYW5nLWZvcm1hdCAoMy41IG9yIG5ld2VyKSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbHkgcmVmb3JtYXQgY29kZSAoJ21ha2Ugc3R5bGUnIGNvbW1hbmQpCmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA5N2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagpAQCAtMCwwICsxLDM2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1Zy1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UtbXR8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZS1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZS1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdE1vbml0b3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdE11dGV4LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcU3RkVGhyZWFkRmFjdG9yeS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFRocmVhZE1hbmFnZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFRpbWVyTWFuYWdlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVXRpbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCYXNlNjRVdGlscy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZWJ1Z1Byb3RvY29sLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVENvbm5lY3RlZENsaWVudC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTZXJ2ZXJGcmFtZXdvcmsuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwVHJhbnNwb3J0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGaWxlVHJhbnNwb3J0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTb2NrZXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRVdGlscy5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xHZXRUaW1lT2ZEYXkuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTb2NrZXRQYWlyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuY3BwIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEV4Y2VwdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxQbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUUHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFZpcnR1YWxQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVFByb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2ltcGxlRmlsZVRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVmlydHVhbFRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXE9wZXJhdG9ycy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU29ja2V0UGFpci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRXaW5zb2NrU2luZ2xldG9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wudGNjIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPnRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8UHJvamVjdE5hbWU+bGlidGhyaWZ0PC9Qcm9qZWN0TmFtZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0LnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0LnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NGY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDI4MyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xHZXRUaW1lT2ZEYXkuY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaHJlYWRNYW5hZ2VyLmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFRpbWVyTWFuYWdlci5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxVdGlsLmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZWJ1Z1Byb3RvY29sLmNwcCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCYXNlNjRVdGlscy5jcHAiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmNwcCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmNwcCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBUcmFuc3BvcnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRVdGlscy5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmNwcCI+CisgICAgICA8RmlsdGVyPnByb2Nlc3NvcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdE1vbml0b3IuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNdXRleC5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcU3RkVGhyZWFkRmFjdG9yeS5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFdpbkZjbnRsLmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxFeGNlcHRpb24uaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVmlydHVhbFRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFZpcnR1YWxQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCI+CisgICAgICA8RmlsdGVyPnByb2Nlc3NvcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGaWxlVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTaW1wbGVGaWxlVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZWJ1Z1Byb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3BlcmF0b3JzLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTb2NrZXRQYWlyLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcU3RkVGhyZWFkRmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFdpbkZjbnRsLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0icHJvdG9jb2wiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezA3Y2VkMTliLWI3MmEtNDEwNS05ZmZiLTZkMmJjZjY0NDk3ZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ0cmFuc3BvcnQiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2U5ZjYxNDA0LTExNDgtNDEwMy1iZDZmLWU1ODY5ZDM3ZmE3OX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsyODE0MDAyYS0zYzY4LTQyN2UtYjBlYi0zM2FjZDJmNDA2YWV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iY29uY3VycmVuY3kiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2FkZGQ0NzA3LWRiYWEtNGQwYy1iZWY2LWZmZjhiZTdiNDk1YX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzZXJ2ZXIiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Y1NWE4ZTliLTY5NTktNDg3Zi1hMzk2LWMzMWI0ZDZjNjFkNn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJhc3luYyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZDUyNjg4NWItMWIzZS00ZWUzLTgwMjctZTY5NGZlOThhZDYzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InByb2Nlc3NvciI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OGY0MjhkYTgtNWE4My00NGZiLTk1NzgtZGU5MzVmYjQxNWUxfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IndpbmRvd3NcdHIxIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlZWExMDQwNi0zMzgwLTRmMmQtOTM2NS1jMjZmYTI4NzVkYWV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC50Y2MiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcdHIxXGZ1bmN0aW9uYWwiPgorICAgICAgPEZpbHRlcj53aW5kb3dzXHRyMTwvRmlsdGVyPgorICAgIDwvTm9uZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE2ZmZlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMCwwICsxLDI5OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1Zy1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UtbXR8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZS1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZS1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPntEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+bGlidGhyaWZ0bmI8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnRuYi5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnRuYi5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnRuYi5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTcwM2RkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw3NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNlcnZlciI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YmY0NDlkOTItNGJlOC00ZjZmLWEwMTAtYzUzNmY1N2M2ZjEzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9ImFzeW5jIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswMjk0ZDBhNi1jZTQ2LTRiZTgtYTY1OS04MjZkNmU5OGFlNDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjBmYzllNWUtMDg2Ni00YWJhLTg2NjItNDM5YmI0YTQ2MWQzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjNmZTJmZGUtYTdjOS00M2VjLWE0MDktN2Y1M2RmNWVlZTY0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjM4ZmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLXVpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6cmVhZChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIHN0ZDo6c3RyaW5nIGZuYW1lOwotICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICBpbnQxNl90IGZpZDsKLQotICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0QmVnaW4oZm5hbWUpOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOwotICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoZmlkKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcpIHsKLSAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZFN0cmluZyhtZXNzYWdlXyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyKSB7Ci0gICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZEkzMih0eXBlKTsKLSAgICAgICAgdHlwZV8gPSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSl0eXBlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7Ci0gIH0KLQotICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OndyaXRlKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgewotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigibWVzc2FnZSIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcsIDEpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cmluZyhtZXNzYWdlXyk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJ0eXBlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiwgMik7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlSTMyKHR5cGVfKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOwotICByZXR1cm4geGZlcjsKLX0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjVjNTIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfIDEKLQotI2luY2x1ZGUgPFRocmlmdC5oPgotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotbmFtZXNwYWNlIHByb3RvY29sIHsKLSAgY2xhc3MgVFByb3RvY29sOwotfQotCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBwdWJsaWMgVEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotCi0gIC8qKgotICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KLSAgICovCi0gIGVudW0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB7Ci0gICAgVU5LTk9XTiA9IDAsCi0gICAgVU5LTk9XTl9NRVRIT0QgPSAxLAotICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKLSAgICBXUk9OR19NRVRIT0RfTkFNRSA9IDMsCi0gICAgQkFEX1NFUVVFTkNFX0lEID0gNCwKLSAgICBNSVNTSU5HX1JFU1VMVCA9IDUKLSAgfTsKLQotICBUQXBwbGljYXRpb25FeGNlcHRpb24oKSA6Ci0gICAgVEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIFRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgotICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KLSAgICoKLSAgICogQHJldHVybiBFcnJvciBjb2RlCi0gICAqLwotICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKLSAgICAgIHN3aXRjaCAodHlwZV8pIHsKLSAgICAgICAgY2FzZSBVTktOT1dOICAgICAgICAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgVU5LTk9XTl9NRVRIT0QgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBtZXRob2QiOwotICAgICAgICBjYXNlIElOVkFMSURfTUVTU0FHRV9UWVBFIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICAgICAgY2FzZSBXUk9OR19NRVRIT0RfTkFNRSAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBXcm9uZyBtZXRob2QgbmFtZSI7Ci0gICAgICAgIGNhc2UgQkFEX1NFUVVFTkNFX0lEICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogQmFkIHNlcXVlbmNlIGlkZW50aWZpZXIiOwotICAgICAgICBjYXNlIE1JU1NJTkdfUkVTVUxUICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IE1pc3NpbmcgcmVzdWx0IjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOwotICAgICAgfTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9Ci0KLSAgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7Ci0gIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIEVycm9yIGNvZGUKLSAgICovCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZV87Ci0KLX07Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UTG9nZ2luZy5oIGIvbGliL2NwcC9zcmMvVExvZ2dpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmODJkZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UTG9nZ2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RMT0dHSU5HX0hfCi0jZGVmaW5lIF9USFJJRlRfVExPR0dJTkdfSF8gMQotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLS8qKgotICogQ29udGFpbnMgdXRpbGl0eSBtYWNyb3MgZm9yIGRlYnVnZ2luZyBhbmQgbG9nZ2luZy4KLSAqCi0gKi8KLQotI2lmbmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vKioKLSAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDA6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9mZiwgZGVidWcgbWFjcm9zIHVuZGVmaW5lZAotICogVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID0gMTogYWxsIGRlYnVnZ2luZyB0dXJuZWQgb24KLSAqLwotI2RlZmluZSBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgMAotCi0KLS8qKgotICogVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA9IDA6IGFsbCBsb2dnaW5nIHR1cm5lZCBvZmYsIGxvZ2dpbmcgbWFjcm9zIHVuZGVmaW5lZAotICogVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA9IDE6IGFsbCBsb2dnaW5nIHR1cm5lZCBvbgotICovCi0jZGVmaW5lIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgICAxCi0KLQotLyoqCi0gKiBTdGFuZGFyZCB3cmFwcGVyIGFyb3VuZCBmcHJpbnRmIHdoYXQgd2lsbCBwcmVmaXggdGhlIGZpbGUgbmFtZSBhbmQgbGluZQotICogbnVtYmVyIHRvIHRoZSBsaW5lLiBVc2VzIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCB0byBjb250cm9sIHdoZXRoZXIgaXQgaXMKLSAqIHR1cm5lZCBvbiBvciBvZmYuCi0gKgotICogQHBhcmFtIGZvcm1hdF9zdHJpbmcKLSAqLwotI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gIiAjZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNlbHNlCi0gICNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLC4uLikKLSNlbmRpZgotCi0KLS8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IGFsc28gcHJpbnRzIHRoZSB0aW1lCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gIiAjZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLSNlbHNlCi0gICNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsLi4uKQotI2VuZGlmCi0KLQotLyoqCi0gKiBhbmFsYWdvdXMgdG8gVF9ERUJVRyBidXQgdXNlcyBpbnB1dCBsZXZlbCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHN0cmluZwotICogc2hvdWxkIGJlIGxvZ2dlZC4KLSAqCi0gKiBAcGFyYW0gaW50ICAgICBsZXZlbDogc3BlY2lmaWVkIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBmb3JtYXQgc3RyaW5nCi0gKi8KLSNkZWZpbmUgVF9ERUJVR19MKGxldmVsLCBmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoKGxldmVsKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gIiAjZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotCi0vKioKLSAqIEV4cGxpY2l0IGVycm9yIGxvZ2dpbmcuIFByaW50cyB0aW1lLCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2RlZmluZSBUX0VSUk9SKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gRVJST1I6ICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxkYmd0aW1lLCMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotCi0vKioKLSAqIEFuYWxhZ291cyB0byBUX0VSUk9SLCBhZGRpdGlvbmFsbHkgYWJvcnRpbmcgdGhlIHByb2Nlc3MuCi0gKiBXQVJOSU5HOiBtYWNybyBjYWxscyBhYm9ydCgpLCBlbmRpbmcgcHJvZ3JhbSBleGVjdXRpb24KLSAqCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwotICovCi0jZGVmaW5lIFRfRVJST1JfQUJPUlQoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiAjZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7IFwKLSAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLS8qKgotICogTG9nIGlucHV0IG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwotICovCi0jaWYgVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlslc10gIiAjZm9ybWF0X3N0cmluZyAiIFxuIiwgZGJndGltZSwjI19fVkFfQVJHU19fKTsgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0jZWxzZQotICAjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywuLi4pCi0jZW5kaWYKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvVFByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmQ1Mjc5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RQUk9DRVNTT1JfSF8KLSNkZWZpbmUgX1RIUklGVF9UUFJPQ0VTU09SX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi0vKioKLSAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3QgdGhhdCBhY3RzIHVwb24gdHdvIHN0cmVhbXMgb2YgZGF0YSwgb25lCi0gKiBhbiBpbnB1dCBhbmQgdGhlIG90aGVyIGFuIG91dHB1dC4gVGhlIGRlZmluaXRpb24gb2YgdGhpcyBvYmplY3QgaXMgbG9vc2UsCi0gKiB0aG91Z2ggdGhlIHR5cGljYWwgY2FzZSBpcyBmb3Igc29tZSBzb3J0IG9mIHNlcnZlciB0aGF0IGVpdGhlciBnZW5lcmF0ZXMKLSAqIHJlc3BvbnNlcyB0byBhbiBpbnB1dCBzdHJlYW0gb3IgZm9yd2FyZHMgZGF0YSBmcm9tIG9uZSBwaXBlIG9udG8gYW5vdGhlci4KLSAqCi0gKi8KLWNsYXNzIFRQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgPSAwOwotCi0gIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKLSAgICByZXR1cm4gcHJvY2VzcyhpbywgaW8pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRQcm9jZXNzb3IoKSB7fQotfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RSZWZsZWN0aW9uTG9jYWwuaCBiL2xpYi9jcHAvc3JjL1RSZWZsZWN0aW9uTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzZTQ3NS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UUmVmbGVjdGlvbkxvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXyAxCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbC5oPgotCi0vKioKLSAqIExvY2FsIFJlZmxlY3Rpb24gaXMgYSBibGFua2V0IHRlcm0gcmVmZXJyaW5nIHRvIHRoZSB0aGUgc3RydWN0dXJlCi0gKiBhbmQgZ2VuZXJhdGlvbiBvZiB0aGlzIHBhcnRpY3VsYXIgcmVwcmVzZW50YXRpb24gb2YgVGhyaWZ0IHR5cGVzLgotICogKEl0IGlzIGNhbGxlZCBsb2NhbCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IFRocmlmdCkuCi0gKgotICovCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlOwotCi0vLyBXZSBpbmNsdWRlIHRoaXMgbWFueSBieXRlcyBvZiB0aGUgc3RydWN0dXJlJ3MgZmluZ2VycHJpbnQgd2hlbiBzZXJpYWxpemluZwotLy8gYSB0b3AtbGV2ZWwgc3RydWN0dXJlLiAgTG9uZyBlbm91Z2ggdG8gbWFrZSBjb2xsaXNpb25zIHVubGlrZWx5LCBzaG9ydAotLy8gZW5vdWdoIHRvIG5vdCBzaWduaWZpY2FudGx5IGFmZmVjdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkLgotY29uc3QgaW50IEZQX1BSRUZJWF9MRU4gPSA0OwotCi1zdHJ1Y3QgRmllbGRNZXRhIHsKLSAgaW50MTZfdCB0YWc7Ci0gIGJvb2wgaXNfb3B0aW9uYWw7Ci19OwotCi1zdHJ1Y3QgVHlwZVNwZWMgewotICBUVHlwZSB0dHlwZTsKLSAgdWludDhfdCAgICBmcF9wcmVmaXhbRlBfUFJFRklYX0xFTl07Ci0KLSAgLy8gVXNlIGFuIGFub255bW91cyB1bmlvbiBoZXJlIHNvIHdlIGNhbiBmaXQgdHdvIFR5cGVTcGVjcyBpbiBvbmUgY2FjaGUgbGluZS4KLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICAvLyBVc2UgcGFyYWxsZWwgYXJyYXlzIGhlcmUgZm9yIGRlbnNlciBwYWNraW5nIChvZiB0aGUgYXJyYXlzKS4KLSAgICAgIEZpZWxkTWV0YSogbWV0YXM7Ci0gICAgICBUeXBlU3BlYyoqIHNwZWNzOwotICAgIH0gdHN0cnVjdDsKLSAgICBzdHJ1Y3QgewotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUxOwotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUyOwotICAgIH0gdGNvbnRhaW5lcjsKLSAgfTsKLQotICAvLyBTdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdW5pb25zIGlzbid0IHJlYWxseSBwb3NzaWJsZSwKLSAgLy8gc28gdGFrZSB0aGUgcGx1bmdlIGFuZCB1c2UgY29uc3RydWN0b3JzLgotICAvLyBIb3BlZnVsbHkgdGhleSdsbCBiZSBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lLgotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlKSA6IHR0eXBlKHR0eXBlKSB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLAotICAgICAgICAgICBjb25zdCB1aW50OF90KiBmaW5nZXJwcmludCwKLSAgICAgICAgICAgRmllbGRNZXRhKiBtZXRhcywKLSAgICAgICAgICAgVHlwZVNwZWMqKiBzcGVjcykgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1jcHkoZnBfcHJlZml4LCBmaW5nZXJwcmludCwgRlBfUFJFRklYX0xFTik7Ci0gICAgdHN0cnVjdC5tZXRhcyA9IG1ldGFzOwotICAgIHRzdHJ1Y3Quc3BlY3MgPSBzcGVjczsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLCBUeXBlU3BlYyogc3VidHlwZTEsIFR5cGVTcGVjKiBzdWJ0eXBlMikgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgICB0Y29udGFpbmVyLnN1YnR5cGUxID0gc3VidHlwZTE7Ci0gICAgdGNvbnRhaW5lci5zdWJ0eXBlMiA9IHN1YnR5cGUyOwotICB9Ci0KLX07Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVGhyaWZ0LmNwcCBiL2xpYi9jcHAvc3JjL1RocmlmdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGEwMWIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVGhyaWZ0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLVRPdXRwdXQgR2xvYmFsT3V0cHV0OwotCi12b2lkIFRPdXRwdXQ6OnByaW50Zihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pIHsKLSAgLy8gVHJ5IHRvIHJlZHVjZSBoZWFwIHVzYWdlLCBldmVuIGlmIHByaW50ZiBpcyBjYWxsZWQgcmFyZWx5LgotICBzdGF0aWMgY29uc3QgaW50IFNUQUNLX0JVRl9TSVpFID0gMjU2OwotICBjaGFyIHN0YWNrX2J1ZltTVEFDS19CVUZfU0laRV07Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOwotICBpbnQgbmVlZCA9IHZzbnByaW50ZihzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgewotICAgIGZfKHN0YWNrX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2hhciAqaGVhcF9idWYgPSAoY2hhciopbWFsbG9jKChuZWVkKzEpICogc2l6ZW9mKGNoYXIpKTsKLSAgaWYgKGhlYXBfYnVmID09IE5VTEwpIHsKLSAgICAvLyBNYWxsb2MgZmFpbGVkLiAgV2UgbWlnaHQgYXMgd2VsbCBwcmludCB0aGUgc3RhY2sgYnVmZmVyLgotICAgIGZfKHN0YWNrX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOwotICBpbnQgcnZhbCA9IHZzbnByaW50ZihoZWFwX2J1ZiwgbmVlZCsxLCBtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIC8vIFRPRE8oc2hpZ2luKTogaW5mb3JtIHVzZXIKLSAgaWYgKHJ2YWwgIT0gLTEpIHsKLSAgICBmXyhoZWFwX2J1Zik7Ci0gIH0KLSAgZnJlZShoZWFwX2J1Zik7Ci19Ci0KLXZvaWQgVE91dHB1dDo6cGVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7Ci0gIHN0ZDo6c3RyaW5nIG91dCA9IG1lc3NhZ2UgKyBzdHJlcnJvcl9zKGVycm5vX2NvcHkpOwotICBmXyhvdXQuY19zdHIoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFRPdXRwdXQ6OnN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpIHsKLSNpZm5kZWYgSEFWRV9TVFJFUlJPUl9SCi0gIHJldHVybiAiZXJybm8gPSAiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oZXJybm9fY29weSk7Ci0jZWxzZSAgLy8gSEFWRV9TVFJFUlJPUl9SCi0KLSAgY2hhciBiX2VycmJ1ZlsxMDI0XSA9IHsgJ1wwJyB9OwotI2lmZGVmIFNUUkVSUk9SX1JfQ0hBUl9QCi0gIGNoYXIgKmJfZXJyb3IgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKLSNlbHNlCi0gIGNoYXIgKmJfZXJyb3IgPSBiX2VycmJ1ZjsKLSAgaW50IHJ2ID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7Ci0gIGlmIChydiA9PSAtMSkgewotICAgIC8vIHN0cmVycm9yX3IgZmFpbGVkLiAgb21nd3RmYmJxLgotICAgIHJldHVybiAiWFNJLWNvbXBsaWFudCBzdHJlcnJvcl9yKCkgZmFpbGVkIHdpdGggZXJybm8gPSAiICsKLSAgICAgIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOwotICB9Ci0jZW5kaWYKLSAgLy8gQ2FuIGFueW9uZSBwcm92ZSB0aGF0IGV4cGxpY2l0IGNhc3QgaXMgcHJvYmFibHkgbm90IG5lY2Vzc2FyeQotICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUKLSAgLy8gYl9lcnJvciBiZWNvbWVzIGludmFsaWQ/Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhiX2Vycm9yKTsKLQotI2VuZGlmICAvLyBIQVZFX1NUUkVSUk9SX1IKLX0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RocmlmdC5oIGIvbGliL2NwcC9zcmMvVGhyaWZ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiY2UyM2YuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVGhyaWZ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCi0jZGVmaW5lIF9USFJJRlRfVEhSSUZUX0hfIDEKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLQotI2luY2x1ZGUgIlRMb2dnaW5nLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotY2xhc3MgVE91dHB1dCB7Ci0gcHVibGljOgotICBUT3V0cHV0KCkgOiBmXygmZXJyb3JUaW1lV3JhcHBlcikge30KLQotICBpbmxpbmUgdm9pZCBzZXRPdXRwdXRGdW5jdGlvbih2b2lkICgqZnVuY3Rpb24pKGNvbnN0IGNoYXIgKikpewotICAgIGZfID0gZnVuY3Rpb247Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGNoYXIgKm1lc3NhZ2UpewotICAgIGZfKG1lc3NhZ2UpOwotICB9Ci0KLSAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIGhhdmUgYSBjb25zdCBjaGFyKiBvdmVybG9hZCBoZXJlIGluc3RlYWQgb2YKLSAgLy8ganVzdCB0aGUgc3RyaW5nIHZlcnNpb24sIG90aGVyd2lzZSBlcnJubyBjb3VsZCBiZSBjb3JydXB0ZWQKLSAgLy8gaWYgdGhlcmUgaXMgc29tZSBwcm9ibGVtIGFsbG9jYXRpbmcgbWVtb3J5IHdoZW4gY29uc3RydWN0aW5nCi0gIC8vIHRoZSBzdHJpbmcuCi0gIHZvaWQgcGVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGludCBlcnJub19jb3B5KTsKLSAgaW5saW5lIHZvaWQgcGVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICAgIHBlcnJvcihtZXNzYWdlLmNfc3RyKCksIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgdm9pZCBwcmludGYoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKLQotICBpbmxpbmUgc3RhdGljIHZvaWQgZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpIHsKLSAgICB0aW1lX3Qgbm93OwotICAgIGNoYXIgZGJndGltZVsyNl07Ci0gICAgdGltZSgmbm93KTsKLSAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOwotICAgIGRiZ3RpbWVbMjRdID0gMDsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmlmdDogJXMgJXNcbiIsIGRiZ3RpbWUsIG1zZyk7Ci0gIH0KLQotICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCAoKmZfKShjb25zdCBjaGFyICopOwotfTsKLQotZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OwotCi1jbGFzcyBURXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFeGNlcHRpb24oKSB7fQotCi0gIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBtZXNzYWdlXyhtZXNzYWdlKSB7fQotCi0gIHZpcnR1YWwgflRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiAiRGVmYXVsdCBURXhjZXB0aW9uLiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKLQotfTsKLQotCi0vLyBGb3J3YXJkIGRlY2xhcmUgdGhpcyBzdHJ1Y3R1cmUgdXNlZCBieSBURGVuc2VQcm90b2NvbAotbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotc3RydWN0IFR5cGVTcGVjOwotfX0KLQotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NjYyOS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307Ci0KLWNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OwotCi1jbGFzcyBUaW1lZE91dEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci1wdWJsaWM6Ci0gIFRpbWVkT3V0RXhjZXB0aW9uKCk6VEV4Y2VwdGlvbigiVGltZWRPdXRFeGNlcHRpb24iKXt9OwotICBUaW1lZE91dEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSApIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Ci19OwotCi1jbGFzcyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLXB1YmxpYzoKLSAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOlRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OwotICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlICkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KLX07Ci0KLWNsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLXB1YmxpYzoKLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9Ci0KLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgICAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Y2QzZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQotCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSAidGhyaWZ0L2xpYi9jcHAvY29uY3VycmVuY3kvVGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBDb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIFJ1bm5hYmxlIHRoYXQgd2lsbCBleGVjdXRlIGFyYml0cmFyeSBjYWxsYmFja3MuCi0gKiBJbnRlcmZhY2VzIGFyZSBwcm92aWRlZCB0byBhY2NlcHQgYm90aCBhIGdlbmVyaWMgJ3ZvaWQodm9pZCknIGNhbGxiYWNrLCBhbmQKLSAqIGEgJ3ZvaWQqICh2b2lkKiknIHB0aHJlYWRfY3JlYXRlLXN0eWxlIGNhbGxiYWNrLgotICoKLSAqIEV4YW1wbGUgdXNlOgotICogIHZvaWQqIG15X3RocmVhZF9tYWluKHZvaWQqIGFyZyk7Ci0gKiAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiBmYWN0b3J5ID0gLi4uOwotICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIG15X3RocmVhZF9tYWluIG9uY2U6Ci0gKiAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9Ci0gKiAgICBmYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4oCi0gKiAgICAgIG5ldyBGdW5jdGlvblJ1bm5lcihteV90aHJlYWRfbWFpbiwgc29tZV9hcmd1bWVudCkpKTsKLSAqICB0aHJlYWQtPnN0YXJ0KCk7Ci0gKgotICogIGJvb2wgQTo6Zm9vKCk7Ci0gKiAgQSogYSA9IG5ldyBBKCk7Ci0gKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgYS5mb28oKSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzOgotICogIGZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPigKLSAqICAgIG5ldyBGdW5jdGlvblJ1bm5lcihzdGQ6OnRyMTo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSkpLT5zdGFydCgpOwotICoKLSAqLwotCi1jbGFzcyBGdW5jdGlvblJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGNhbGxiYWNrICdwdGhyZWFkX2NyZWF0ZSgpJyBleHBlY3RzLgotICB0eXBlZGVmIHZvaWQqICgqUHRocmVhZEZ1bmNQdHIpKHZvaWQgKmFyZyk7Ci0gIC8vIFRoaXMgYSBmdWxseS1nZW5lcmljIHZvaWQodm9pZCkgY2FsbGJhY2sgZm9yIGN1c3RvbSBiaW5kaW5ncy4KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKLQotICB0eXBlZGVmIHN0ZDo6dHIxOjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOwotCi0gIC8qKgotICAgKiBHaXZlbiBhICdwdGhyZWFkX2NyZWF0ZScgc3R5bGUgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbAotICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KLSAgICovCi0gIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKLSAgIDogZnVuY18oc3RkOjp0cjE6OmJpbmQoZnVuYywgYXJnKSksIHJlcEZ1bmNfKDApCi0gIHsgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGdlbmVyaWMgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlIGl0LgotICAgKi8KLSAgRnVuY3Rpb25SdW5uZXIoY29uc3QgVm9pZEZ1bmMmIGNvYikKLSAgIDogZnVuY18oY29iKSwgcmVwRnVuY18oMCkKLSAgeyB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgYm9vbCBmb28oLi4uKSB0eXBlIGNhbGxiYWNrLCBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUKLSAgICogdGhlIGNhbGxiYWNrIHJlcGVhdGVkbHkgd2l0aCAnaW50ZXJ2YWxNcycgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGNhbGxzLAotICAgKiB1bnRpbCBpdCByZXR1cm5zIGZhbHNlLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHdpbGwKLSAgICogYmUgaW50ZXJ2YWxNcyBwbHVzIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBjYWxsYmFjay4KLSAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IEJvb2xGdW5jJiBjb2IsIGludCBpbnRlcnZhbE1zKQotICAgOiBmdW5jXygwKSwgcmVwRnVuY18oY29iKSwgaW50ZXJ2YWxNc18oaW50ZXJ2YWxNcykKLSAgeyB9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHJlcEZ1bmNfKSB7Ci0gICAgICB3aGlsZShyZXBGdW5jXygpKSB7Ci0gICAgICAgIHVzbGVlcChpbnRlcnZhbE1zXyoxMDAwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZnVuY18oKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFZvaWRGdW5jIGZ1bmNfOwotICBCb29sRnVuYyByZXBGdW5jXzsKLSAgaW50IGludGVydmFsTXNfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQzZWY3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLQotLyoqCi0gKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBQT1NJWCBwdGhyZWFkIGxpYnJhcnkKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNb25pdG9yOjpJbXBsIHsKLQotIHB1YmxpYzoKLQotICBJbXBsKCkKLSAgICAgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksCi0gICAgICAgbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKLSAgICBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsKLSAgfQotCi0gIEltcGwoTXV0ZXgqIG11dGV4KQotICAgICA6IG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdChtdXRleCk7Ci0gIH0KLQotICBJbXBsKE1vbml0b3IqIG1vbml0b3IpCi0gICAgIDogbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKLSAgICBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOwotICB9Ci0KLSAgfkltcGwoKSB7IGNsZWFudXAoKTsgfQotCi0gIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KLSAgdm9pZCBsb2NrKCkgeyBtdXRleCgpLmxvY2soKTsgfQotICB2b2lkIHVubG9jaygpIHsgbXV0ZXgoKS51bmxvY2soKTsgfQotCi0gIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLSAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAotICAgIGFzc2VydCh0aW1lb3V0ID49IDBMTCk7Ci0gICAgaWYgKHRpbWVvdXQgPT0gMExMKSB7Ci0gICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF93YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwpOwotICAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOwotICAgICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgVXRpbDo6dG9UaW1lc3BlYyhhYnN0aW1lLCBub3cgKyB0aW1lb3V0KTsKLSAgICAgIGludCByZXN1bHQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZwdGhyZWFkX2NvbmRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFic3RpbWUpOwotICAgICAgaWYgKHJlc3VsdCA9PSBFVElNRURPVVQpIHsKLSAgICAgICAgLy8gcHRocmVhZF9jb25kX3RpbWVkd2FpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byByZXR1cm4gZWFybHkgb24KLSAgICAgICAgLy8gdmFyaW91cyBwbGF0Zm9ybXMsIHNvIGNvbW1lbnQgb3V0IHRoaXMgYXNzZXJ0LgotICAgICAgICAvL2Fzc2VydChVdGlsOjpjdXJyZW50VGltZSgpID49IChub3cgKyB0aW1lb3V0KSk7Ci0gICAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBub3RpZnkoKSB7Ci0gICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnB0aHJlYWRfY29uZF8pOwotICAgIGFzc2VydChpcmV0ID09IDApOwotICB9Ci0KLSAgdm9pZCBub3RpZnlBbGwoKSB7Ci0gICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnB0aHJlYWRfY29uZF8pOwotICAgIGFzc2VydChpcmV0ID09IDApOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKLSAgICBtdXRleF8gPSBtdXRleDsKLQotICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmcHRocmVhZF9jb25kXywgTlVMTCkgPT0gMCkgewotICAgICAgY29uZEluaXRpYWxpemVkXyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFjb25kSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBjbGVhbnVwKCk7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgY2xlYW51cCgpIHsKLSAgICBpZiAoY29uZEluaXRpYWxpemVkXykgewotICAgICAgY29uZEluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcHRocmVhZF9jb25kXyk7Ci0gICAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICBzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgTXV0ZXgqIG11dGV4XzsKLQotICBtdXRhYmxlIHB0aHJlYWRfY29uZF90IHB0aHJlYWRfY29uZF87Ci0gIG11dGFibGUgYm9vbCBjb25kSW5pdGlhbGl6ZWRfOwotfTsKLQotTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkge30KLU1vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkge30KLU1vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkge30KLQotTW9uaXRvcjo6fk1vbml0b3IoKSB7IGRlbGV0ZSBpbXBsXzsgfQotCi1NdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bXV0ZXgoKTsgfQotCi12b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7IGltcGxfLT5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQotCi12b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7IGltcGxfLT53YWl0KHRpbWVvdXQpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeyBpbXBsXy0+bm90aWZ5KCk7IH0KLQotdm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7IGltcGxfLT5ub3RpZnlBbGwoKTsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTExOWQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8gMQotCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiTXV0ZXguaCIKLQotI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBBIG1vbml0b3IgaXMgYSBjb21iaW5hdGlvbiBtdXRleCBhbmQgY29uZGl0aW9uLWV2ZW50LiAgV2FpdGluZyBhbmQKLSAqIG5vdGlmeWluZyBjb25kaXRpb24gZXZlbnRzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBvd24gdGhlIG11dGV4LiAgTXV0ZXgKLSAqIGxvY2sgYW5kIHVubG9jayBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgaW5kZXBlbmRlbnRseSBvZiBjb25kaXRpb24KLSAqIGV2ZW50cy4gIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuT2JqZWN0IG11bHRpLXRocmVhZAotICogb3BlcmF0aW9ucy4KLSAqCi0gKiBOb3RlIHRoZSBNb25pdG9yIGNhbiBjcmVhdGUgYSBuZXcsIGludGVybmFsIG11dGV4OyBhbHRlcm5hdGl2ZWx5LCBhCi0gKiBzZXBhcmF0ZSBNdXRleCBjYW4gYmUgcGFzc2VkIGluIGFuZCB0aGUgTW9uaXRvciB3aWxsIHJlLXVzZSBpdCB3aXRob3V0Ci0gKiB0YWtpbmcgb3duZXJzaGlwLiAgSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICogTXV0ZXggaXMgbm90IGRlYWxsb2NhdGVkIGJlZm9yZSB0aGUgTW9uaXRvci4KLSAqCi0gKiBOb3RlIHRoYXQgYWxsIG1ldGhvZHMgYXJlIGNvbnN0LiAgTW9uaXRvcnMgaW1wbGVtZW50IGxvZ2ljYWwgY29uc3RuZXNzLCBub3QKLSAqIGJpdCBjb25zdG5lc3MuICBUaGlzIGFsbG93cyBjb25zdCBtZXRob2RzIHRvIGNhbGwgbW9uaXRvciBtZXRob2RzIHdpdGhvdXQKLSAqIG5lZWRpbmcgdG8gY2FzdCBhd2F5IGNvbnN0bmVzcyBvciBjaGFuZ2UgdG8gbm9uLWNvbnN0IHNpZ25hdHVyZXMuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTW9uaXRvciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgotICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KLSAgTW9uaXRvcigpOwotCi0gIC8qKiBVc2VzIHRoZSBwcm92aWRlZCBtdXRleCB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCi0gIGV4cGxpY2l0IE1vbml0b3IoTXV0ZXgqIG11dGV4KTsKLQotICAvKiogVXNlcyB0aGUgbXV0ZXggaW5zaWRlIHRoZSBwcm92aWRlZCBNb25pdG9yIHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KLSAgZXhwbGljaXQgTW9uaXRvcihNb25pdG9yKiBtb25pdG9yKTsKLQotICAvKiogRGVhbGxvY2F0ZXMgdGhlIG11dGV4IG9ubHkgaWYgd2Ugb3duIGl0LiAqLwotICB2aXJ0dWFsIH5Nb25pdG9yKCk7Ci0KLSAgTXV0ZXgmIG11dGV4KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0PTBMTCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIG5vdGlmeSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBub3RpZnlBbGwoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0KLSAgY2xhc3MgSW1wbDsKLQotICBJbXBsKiBpbXBsXzsKLX07Ci0KLWNsYXNzIFN5bmNocm9uaXplZCB7Ci0gcHVibGljOgotIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yKiBtb25pdG9yKSA6IGcobW9uaXRvci0+bXV0ZXgoKSkgeyB9Ci0gU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3ImIG1vbml0b3IpIDogZyhtb25pdG9yLm11dGV4KCkpIHsgfQotCi0gcHJpdmF0ZToKLSAgR3VhcmQgZzsKLX07Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MTcxMC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTXV0ZXguaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KLXN0YXRpYyBzaWdfYXRvbWljX3QgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gMDsKLXN0YXRpYyBNdXRleFdhaXRDYWxsYmFjayBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gMDsKLQotdm9sYXRpbGUgc3RhdGljIHNpZ19hdG9taWNfdCBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSAwOwotCi12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gcHJvZmlsaW5nU2FtcGxlUmF0ZTsKLSAgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IGNhbGxiYWNrOwotfQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpIFwKLSAgICBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBpZiAoX2xvY2tfc3RhcnRUaW1lID4gMCkgeyBcCi0gICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgXAotICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBlbmRUaW1lIC0gX2xvY2tfc3RhcnRUaW1lKTsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBwcm9maWxlVGltZV8gPSBfbG9ja19zdGFydFRpbWU7IFwKLSAgICBpZiAocHJvZmlsZVRpbWVfID4gMCkgeyBcCi0gICAgICBwcm9maWxlVGltZV8gPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKSAtIHByb2ZpbGVUaW1lXzsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgXAotICBpbnQ2NF90IF90ZW1wX3Byb2ZpbGVUaW1lID0gcHJvZmlsZVRpbWVfOyBcCi0gIHByb2ZpbGVUaW1lXyA9IDA7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpIFwKLSAgZG8geyBcCi0gICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyBcCi0gICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGludDY0X3QgbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKSB7Ci0gIGlmIChtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgJiYgbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykgewotICAgIC8vIFRoaXMgYmxvY2sgaXMgdW5zeW5jaHJvbml6ZWQsIGJ1dCBzaG91bGQgcHJvZHVjZSBhIHJlYXNvbmFibGUgc2FtcGxpbmcKLSAgICAvLyByYXRlIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcy4gIFRoZSBtYWluIHJhY2UgY29uZGl0aW9ucyBhcmUgdGhlIGdhcAotICAgIC8vIGJldHdlZW4gdGhlIGRlY3JlbWVudCBhbmQgdGhlIHRlc3QsIHRoZSBub24tYXRvbWljaXR5IG9mIGRlY3JlbWVudCwgYW5kCi0gICAgLy8gcG90ZW50aWFsIGNhY2hpbmcgb2YgZGlmZmVyZW50IHZhbHVlcyBhdCBkaWZmZXJlbnQgQ1BVcy4KLSAgICAvLwotICAgIC8vIC0gaWYgdHdvIGRlY3JlbWVudHMgcmFjZSwgdGhlIGxpa2VsaWVzdCByZXN1bHQgaXMgdGhhdCB0aGUgY291bnRlcgotICAgIC8vICAgICAgZGVjcmVtZW50cyBzbG93bHkgKHBlcmhhcHMgbXVjaCBtb3JlIHNsb3dseSkgdGhhbiBpbnRlbmRlZC4KLSAgICAvLwotICAgIC8vIC0gbWFueSB0aHJlYWRzIGNvdWxkIHBvdGVudGlhbGx5IGRlY3JlbWVudCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBjb3VudGVyCi0gICAgLy8gICAgICB0byBpdHMgbGFyZ2UgdmFsdWUsIGNhdXNpbmcgZWFjaCBhZGRpdGlvbmFsIGluY29taW5nIHRocmVhZCB0bwotICAgIC8vICAgICAgcHJvZmlsZSBldmVyeSBjYWxsLiAgVGhpcyBzaXR1YXRpb24gaXMgdW5saWtlbHkgdG8gcGVyc2lzdCBmb3IgbG9uZwotICAgIC8vICAgICAgYXMgdGhlIGNyaXRpY2FsIGdhcCBpcyBxdWl0ZSBzaG9ydCwgYnV0IHByb2ZpbGluZyBjb3VsZCBiZSBidXJzdHkuCi0gICAgc2lnX2F0b21pY190IGxvY2FsVmFsdWUgPSAtLW11dGV4UHJvZmlsaW5nQ291bnRlcjsKLSAgICBpZiAobG9jYWxWYWx1ZSA8PSAwKSB7Ci0gICAgICBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGU7Ci0gICAgICByZXR1cm4gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCi0jZW5kaWYgLy8gVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNdXRleDo6aW1wbCB7Ci0gcHVibGljOgotICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICAgIHByb2ZpbGVUaW1lXyA9IDA7Ci0jZW5kaWYKLSAgICBpbml0KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgfQotCi0gIH5pbXBsKCkgewotICAgIGlmIChpbml0aWFsaXplZF8pIHsKLSAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvY2soKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgfQotCi0gIGJvb2wgdHJ5bG9jaygpIGNvbnN0IHsgcmV0dXJuICgwID09IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsgfQotCi0gIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdCB7Ci0jaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAyMDAxMTJMCi0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0KLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgVXRpbDo6dG9UaW1lc3BlYyh0cywgbWlsbGlzZWNvbmRzKTsKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgLy8gSWYgcHRocmVhZF9tdXRleF90aW1lZGxvY2sgaXNuJ3Qgc3VwcG9ydGVkLCB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvCi0gICAgLy8gaXMganVzdCBkbyBhIG5vbmJsb2NraW5nIHRyeWxvY2suCi0gICAgcmV0dXJuIHRyeWxvY2soKTsKLSNlbmRpZgotICB9Ci0KLSAgdm9pZCB1bmxvY2soKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pOwotICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKLSAgfQotCi0gIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSAmcHRocmVhZF9tdXRleF87IH0KLQotIHByaXZhdGU6Ci0gIG11dGFibGUgcHRocmVhZF9tdXRleF90IHB0aHJlYWRfbXV0ZXhfOwotICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKLSNlbmRpZgotfTsKLQotTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKGluaXQpKSB7fQotCi12b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0VW5kZXJseWluZ0ltcGwoKTsgfQotCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dHJ5bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dGltZWRsb2NrKG1zKTsgfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQotCi12b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBwdGhyZWFkX211dGV4X3QqIHB0aHJlYWRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90Kilhcmc7Ci0gIGludCByZXQgPSBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfd2l0aF9raW5kKHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXgsIGludCBraW5kKSB7Ci0gIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhhdHRyOwotICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICAvLyBBcHBhcmVudGx5LCB0aGlzIGNhbiBmYWlsLiAgU2hvdWxkIHdlIHJlYWxseSBiZSBhYm9ydGluZz8KLSAgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4X2luaXQobXV0ZXgsICZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotCi0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci19Ci0KLSNpZmRlZiBQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi12b2lkIE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLSAgLy8gRnJvbSBteXNxbCBzb3VyY2U6IG15c3lzL215X3Rocl9pbml0LmMKLSAgLy8gU2V0IG11dGV4IHR5cGUgdG8gImZhc3QiIGEuay5hICJhZGFwdGl2ZSIKLSAgLy8KLSAgLy8gSW4gdGhpcyBjYXNlIHRoZSB0aHJlYWQgbWF5IHN0ZWFsIHRoZSBtdXRleCBmcm9tIHNvbWUgb3RoZXIgdGhyZWFkCi0gIC8vIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIHNhbWUgbXV0ZXguIFRoaXMgd2lsbCBzYXZlIHVzIHNvbWUKLSAgLy8gY29udGV4dCBzd2l0Y2hlcyBidXQgbWF5IGNhdXNlIGEgdGhyZWFkIHRvICdzdGFydmUgZm9yZXZlcicgd2hpbGUKLSAgLy8gd2FpdGluZyBmb3IgdGhlIG11dGV4IChub3QgbGlrZWx5IGlmIHRoZSBjb2RlIHdpdGhpbiB0aGUgbXV0ZXggaXMKLSAgLy8gc2hvcnQpLgotICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfQURBUFRJVkVfTlApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAotdm9pZCBNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKLX0KLSNlbmRpZgotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUmVhZFdyaXRlTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggcncgbG9jawotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFJlYWRXcml0ZU11dGV4OjppbXBsIHsKLXB1YmxpYzoKLSAgaW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICAgIHByb2ZpbGVUaW1lXyA9IDA7Ci0jZW5kaWYKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpOwotICAgIGFzc2VydChyZXQgPT0gMCk7Ci0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgfQotCi0gIH5pbXBsKCkgewotICAgIGlmKGluaXRpYWxpemVkXykgewotICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAotICB9Ci0KLSAgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZyd19sb2NrXyk7Ci0gICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgfQotCi0gIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiBwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKTsgfQotCi0gIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3QgeyByZXR1cm4gcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXyk7IH0KLQotICB2b2lkIHJlbGVhc2UoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgbXV0YWJsZSBwdGhyZWFkX3J3bG9ja190IHJ3X2xvY2tfOwotICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKLSNlbmRpZgotfTsKLQotUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkge30KLQotdm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7IGltcGxfLT5hY3F1aXJlUmVhZCgpOyB9Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOyB9Ci0KLWJvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRSZWFkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRSZWFkKCk7IH0KLQotYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFdyaXRlKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRXcml0ZSgpOyB9Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7IGltcGxfLT5yZWxlYXNlKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZGJlMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8gMQotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLQotLyoqCi0gKiBEZXRlcm1pbmVzIGlmIHRoZSBUaHJpZnQgTXV0ZXggYW5kIFJlYWRXcml0ZU11dGV4IGNsYXNzZXMgd2lsbCBhdHRlbXB0IHRvCi0gKiBwcm9maWxlIHRoZWlyIGJsb2NraW5nIGFjcXVpcmUgbWV0aG9kcy4gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gbm9uLXplcm8sCi0gKiBUaHJpZnQgd2lsbCBhdHRlbXB0IHRvIGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSBldmVyeSBwcm9maWxpbmdTYW1wbGVSYXRlCi0gKiB0aW1lcy4gIEhvd2V2ZXIsIGFzIHRoZSBzYW1wbGluZyBpcyBub3Qgc3luY2hyb25pemVkIHRoZSByYXRlIGlzIG5vdAotICogZ3VyYW5hdGVlZCwgYW5kIGNvdWxkIGJlIHN1YmplY3QgdG8gYmlnIGJ1cnN0cyBhbmQgc3dpbmdzLiAgUGxlYXNlIGVuc3VyZQotICogeW91ciBzYW1wbGluZyBjYWxsYmFjayBpcyBhcyBwZXJmb3JtYW50IGFzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMuCi0gKgotICogVGhlIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCB3aXRoIHRoZSB3YWl0IHRpbWUgdGFrZW4gdG8gbG9jayB0aGUgbXV0ZXggaW4KLSAqIHVzZWMgYW5kIGEgKHZvaWQqKSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIE11dGV4IChvciBSZWFkV3JpdGVNdXRleCkKLSAqIGJlaW5nIGxvY2tlZC4KLSAqCi0gKiBUaGUgZW5hYmxlTXV0ZXhQcm9maWxpbmcoKSBmdW5jdGlvbiBpcyB1bnN5bmNocm9uaXplZDsgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiB3aGlsZSBwcm9maWxpbmcgaXMgYWxyZWFkeSBlbmFibGVkIG1heSByZXN1bHQgaW4gcmFjZSBjb25kaXRpb25zLiAgT24KLSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgYSBwb2ludGVyIGFzc2lnbm1lbnQgaXMgYXRvbWljLCB0aGlzIGlzIHNhZmUgYnV0IHRoZXJlCi0gKiBpcyBubyBndWFyYW50ZWUgdGhyZWFkcyB3aWxsIGFncmVlIG9uIGEgc2luZ2xlIGNhbGxiYWNrIHdpdGhpbiBhbnkKLSAqIHBhcnRpY3VsYXIgdGltZSBwZXJpb2QuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKk11dGV4V2FpdENhbGxiYWNrKShjb25zdCB2b2lkKiBpZCwgaW50NjRfdCB3YWl0VGltZU1pY3Jvcyk7Ci12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOwotCi0jZW5kaWYKLQotLyoqCi0gKiBBIHNpbXBsZSBtdXRleCBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemVyKSh2b2lkKik7Ci0KLSAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOwotICB2aXJ0dWFsIH5NdXRleCgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB0cnlsb2NrKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7Ci0KLSAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdDsKLQotICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKLSAgc3RhdGljIHZvaWQgQURBUFRJVkVfSU5JVElBTElaRVIodm9pZCopOwotICBzdGF0aWMgdm9pZCBSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCopOwotCi0gcHJpdmF0ZToKLQotICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKLX07Ci0KLWNsYXNzIFJlYWRXcml0ZU11dGV4IHsKLXB1YmxpYzoKLSAgUmVhZFdyaXRlTXV0ZXgoKTsKLSAgdmlydHVhbCB+UmVhZFdyaXRlTXV0ZXgoKSB7fQotCi0gIC8vIHRoZXNlIGdldCB0aGUgbG9jayBhbmQgYmxvY2sgdW50aWwgaXQgaXMgZG9uZSBzdWNjZXNzZnVsbHkKLSAgdmlydHVhbCB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdDsKLQotICAvLyB0aGVzZSBhdHRlbXB0IHRvIGdldCB0aGUgbG9jaywgcmV0dXJuaW5nIGZhbHNlIGltbWVkaWF0ZWx5IGlmIHRoZXkgZmFpbAotICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0OwotCi0gIC8vIHRoaXMgcmVsZWFzZXMgYm90aCByZWFkIGFuZCB3cml0ZSBsb2NrcwotICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0OwotCi1wcml2YXRlOgotCi0gIGNsYXNzIGltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwotfTsKLQotY2xhc3MgR3VhcmQgewotIHB1YmxpYzoKLSAgR3VhcmQoY29uc3QgTXV0ZXgmIHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQgPSAwKSA6IG11dGV4XygmdmFsdWUpIHsKLSAgICBpZiAodGltZW91dCA9PSAwKSB7Ci0gICAgICB2YWx1ZS5sb2NrKCk7Ci0gICAgfSBlbHNlIGlmICh0aW1lb3V0IDwgMCkgewotICAgICAgaWYgKCF2YWx1ZS50cnlsb2NrKCkpIHsKLSAgICAgICAgbXV0ZXhfID0gTlVMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCF2YWx1ZS50aW1lZGxvY2sodGltZW91dCkpIHsKLSAgICAgICAgbXV0ZXhfID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgfkd1YXJkKCkgewotICAgIGlmIChtdXRleF8pIHsKLSAgICAgIG11dGV4Xy0+dW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKG11dGV4XyAhPSBOVUxMKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLS8vIENhbiBiZSB1c2VkIGFzIHNlY29uZCBhcmd1bWVudCB0byBSV0d1YXJkIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlCi0vLyBhcyB0byB3aGV0aGVyIHdlJ3JlIGRvaW5nIGFjcXVpcmVSZWFkKCkgb3IgYWNxdWlyZVdyaXRlKCkuCi1lbnVtIFJXR3VhcmRUeXBlIHsKLSAgUldfUkVBRCA9IDAsCi0gIFJXX1dSSVRFID0gMSwKLX07Ci0KLQotY2xhc3MgUldHdWFyZCB7Ci0gIHB1YmxpYzoKLSAgICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgYm9vbCB3cml0ZSA9IGZhbHNlKQotICAgICAgICAgOiByd19tdXRleF8odmFsdWUpIHsKLSAgICAgIGlmICh3cml0ZSkgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgUldHdWFyZFR5cGUgdHlwZSkKLSAgICAgICAgIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgICBpZiAodHlwZSA9PSBSV19XUklURSkgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgflJXR3VhcmQoKSB7Ci0gICAgICByd19tdXRleF8ucmVsZWFzZSgpOwotICAgIH0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBSZWFkV3JpdGVNdXRleCYgcndfbXV0ZXhfOwotfTsKLQotCi0vLyBBIGxpdHRsZSBoYWNrIHRvIHByZXZlbnQgc29tZW9uZSBmcm9tIHRyeWluZyB0byBkbyAiR3VhcmQobSk7IgotLy8gU3VjaCBhIHVzZSBpcyBpbnZhbGlkIGJlY2F1c2UgdGhlIHRlbXBvcmFyeSBHdWFyZCBvYmplY3QgaXMKLS8vIGRlc3RvcnllZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCByZWxlYXNpbmcgdGhlIGxvY2suCi0vLyBTb3JyeSBmb3IgcG9sbHV0aW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBidXQgSSB0aGluayBpdCdzIHdvcnRoIGl0LgotI2RlZmluZSBHdWFyZChtKSBpbmNvcnJlY3RfdXNlX29mX0d1YXJkKG0pCi0jZGVmaW5lIFJXR3VhcmQobSkgaW5jb3JyZWN0X3VzZV9vZl9SV0d1YXJkKG0pCi0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyMjg4Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBvc2l4VGhyZWFkRmFjdG9yeS5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotCi0jaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKLSMgIGluY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0Ojp3ZWFrX3B0cjsKLQotLyoqCi0gKiBUaGUgUE9TSVggdGhyZWFkIGNsYXNzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFB0aHJlYWRUaHJlYWQ6IHB1YmxpYyBUaHJlYWQgewotIHB1YmxpYzoKLQotICBlbnVtIFNUQVRFIHsKLSAgICB1bmluaXRpYWxpemVkLAotICAgIHN0YXJ0aW5nLAotICAgIHN0YXJ0ZWQsCi0gICAgc3RvcHBpbmcsCi0gICAgc3RvcHBlZAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKLQotICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOwotCi0gcHJpdmF0ZToKLSAgcHRocmVhZF90IHB0aHJlYWRfOwotICBTVEFURSBzdGF0ZV87Ci0gIGludCBwb2xpY3lfOwotICBpbnQgcHJpb3JpdHlfOwotICBpbnQgc3RhY2tTaXplXzsKLSAgd2Vha19wdHI8UHRocmVhZFRocmVhZD4gc2VsZl87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gcHVibGljOgotCi0gIFB0aHJlYWRUaHJlYWQoaW50IHBvbGljeSwgaW50IHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkLCBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgOgotICAgIHB0aHJlYWRfKDApLAotICAgIHN0YXRlXyh1bmluaXRpYWxpemVkKSwKLSAgICBwb2xpY3lfKHBvbGljeSksCi0gICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKLSAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7Ci0KLSAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKLSAgfQotCi0gIH5QdGhyZWFkVGhyZWFkKCkgewotICAgIC8qIE5vdGhpbmcgcmVmZXJlbmNlcyB0aGlzIHRocmVhZCwgaWYgaXMgaXMgbm90IGRldGFjaGVkLCBkbyBhIGpvaW4KLSAgICAgICBub3csIG90aGVyd2lzZSB0aGUgdGhyZWFkLWlkIGFuZCwgcG9zc2libHksIG90aGVyIHJlc291cmNlcyB3aWxsCi0gICAgICAgYmUgbGVha2VkLiAqLwotICAgIGlmKCFkZXRhY2hlZF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGpvaW4oKTsKLSAgICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIHN0YXJ0KCkgewotICAgIGlmIChzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOwotICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOwotICAgIH0KLQotICAgIGlmKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhyZWFkIHN0YWNrIHNpemUKLSAgICBpZiAocHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmdGhyZWFkX2F0dHIsIE1CICogc3RhY2tTaXplXykgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRocmVhZCBwb2xpY3kKLSAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCZ0aHJlYWRfYXR0ciwgcG9saWN5XykgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWRfcGFyYW07Ci0gICAgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eV87Ci0KLSAgICAvLyBTZXQgdGhyZWFkIHByaW9yaXR5Ci0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaGVkX3BhcmFtKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gZmFpbGVkIik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHJlZmVyZW5jZQotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPigpOwotICAgICpzZWxmUmVmID0gc2VsZl8ubG9jaygpOwotCi0gICAgc3RhdGVfID0gc3RhcnRpbmc7Ci0KLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJnB0aHJlYWRfLCAmdGhyZWFkX2F0dHIsIHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9jcmVhdGUgZmFpbGVkIik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBqb2luKCkgewotICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7Ci0gICAgICB2b2lkKiBpZ25vcmU7Ci0gICAgICAvKiBYWFgKLSAgICAgICAgIElmIGpvaW4gZmFpbHMgaXQgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBmYWN0Ci0gICAgICAgICB0aGF0IHRoZSBsYXN0IHJlZmVyZW5jZSB3YXMgdGhlIHRocmVhZCBpdHNlbGYgYW5kIGNhbm5vdAotICAgICAgICAgam9pbi4gIFRoaXMgcmVzdWx0cyBpbiBsZWFrZWQgdGhyZWFkcyBhbmQgd2lsbCBldmVudHVhbGx5Ci0gICAgICAgICBjYXVzZSB0aGUgcHJvY2VzcyB0byBydW4gb3V0IG9mIHRocmVhZCByZXNvdXJjZXMuCi0gICAgICAgICBXZSdyZSBiZXlvbmQgdGhlIHBvaW50IG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIE5vdCBjbGVhciBob3cKLSAgICAgICAgIGJlc3QgdG8gaGFuZGxlIHRoaXMuICovCi0gICAgICBkZXRhY2hlZF8gPSBwdGhyZWFkX2pvaW4ocHRocmVhZF8sICZpZ25vcmUpID09IDA7Ci0gICAgfQotICB9Ci0KLSAgVGhyZWFkOjppZF90IGdldElkKCkgewotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KLQotICB2b2lkIHJ1bm5hYmxlKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9Ci0KLSAgdm9pZCB3ZWFrUmVmKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gc2VsZikgewotICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOwotICAgIHNlbGZfID0gd2Vha19wdHI8UHRocmVhZFRocmVhZD4oc2VsZik7Ci0gIH0KLX07Ci0KLXZvaWQqIFB0aHJlYWRUaHJlYWQ6OnRocmVhZE1haW4odm9pZCogYXJnKSB7Ci0gIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kilhcmc7Ci0gIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOwotCi0gIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdGFydGluZykgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0jaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKLSAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOwotI2VuZGlmCi0KLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGluZzsKLSAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0b3BwaW5nICYmIHRocmVhZC0+c3RhdGVfICE9IHN0b3BwZWQpIHsKLSAgICB0aHJlYWQtPnN0YXRlXyA9IHN0b3BwaW5nOwotICB9Ci0KLSAgcmV0dXJuICh2b2lkKikwOwotfQotCi0vKioKLSAqIFBPU0lYIFRocmVhZCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCi0gKi8KLWNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeTo6SW1wbCB7Ci0KLSBwcml2YXRlOgotICBQT0xJQ1kgcG9saWN5XzsKLSAgUFJJT1JJVFkgcHJpb3JpdHlfOwotICBpbnQgc3RhY2tTaXplXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKLSAgICogQVBJIHZhbHVlcy4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUG9saWN5KFBPTElDWSBwb2xpY3kpIHsKLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgIGNhc2UgT1RIRVI6Ci0gICAgICByZXR1cm4gU0NIRURfT1RIRVI7Ci0gICAgY2FzZSBGSUZPOgotICAgICAgcmV0dXJuIFNDSEVEX0ZJRk87Ci0gICAgY2FzZSBST1VORF9ST0JJTjoKLSAgICAgIHJldHVybiBTQ0hFRF9SUjsKLSAgICB9Ci0gICAgcmV0dXJuIFNDSEVEX09USEVSOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHJlbGF0aXZlIHRocmVhZCBwcmlvcml0aWVzIHRvIGFic29sdXRlIHZhbHVlIGJhc2VkIG9uIHBvc2l4Ci0gICAqIHRocmVhZCBzY2hlZHVsZXIgcG9saWN5Ci0gICAqCi0gICAqICBUaGUgaWRlYSBpcyBzaW1wbHkgdG8gZGl2aWRlIHVwIHRoZSBwcmlvcml0eSByYW5nZSBmb3IgdGhlIGdpdmVuIHBvbGljeQotICAgKiBpbnRvIHRoZSBjb3JyZXBzb25kaW5nIHJlbGF0aXZlIHByaW9yaXR5IGxldmVsIChsb3dlc3QuLmhpZ2hlc3QpIGFuZAotICAgKiB0aGVuIHByby1yYXRlIGFjY29yZGluZ2x5LgotICAgKi8KLSAgc3RhdGljIGludCB0b1B0aHJlYWRQcmlvcml0eShQT0xJQ1kgcG9saWN5LCBQUklPUklUWSBwcmlvcml0eSkgewotICAgIGludCBwdGhyZWFkX3BvbGljeSA9IHRvUHRocmVhZFBvbGljeShwb2xpY3kpOwotICAgIGludCBtaW5fcHJpb3JpdHkgPSAwOwotICAgIGludCBtYXhfcHJpb3JpdHkgPSAwOwotI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTgotICAgIG1pbl9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocHRocmVhZF9wb2xpY3kpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYCi0gICAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7Ci0jZW5kaWYKLSAgICBpbnQgcXVhbnRhID0gKEhJR0hFU1QgLSBMT1dFU1QpICsgMTsKLSAgICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChtYXhfcHJpb3JpdHkgLSBtaW5fcHJpb3JpdHkpIC8gcXVhbnRhOwotCi0gICAgaWYgKHByaW9yaXR5IDw9IEhJR0hFU1QpIHsKLSAgICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIHByaW9yaXR5KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlIGZvciBwcmlvcml0eSBpbmNyZW1lbnRzLgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIE5PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSBwdWJsaWM6Ci0KLSAgSW1wbChQT0xJQ1kgcG9saWN5LCBQUklPUklUWSBwcmlvcml0eSwgaW50IHN0YWNrU2l6ZSwgYm9vbCBkZXRhY2hlZCkgOgotICAgIHBvbGljeV8ocG9saWN5KSwKLSAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAotICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwKLSAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHt9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUE9TSVggdGhyZWFkIHRvIHJ1biB0aGUgcnVubmFibGUgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBydW5uYWJsZSBBIHJ1bm5hYmxlIG9iamVjdAotICAgKi8KLSAgc2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0ID0gc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksIHRvUHRocmVhZFByaW9yaXR5KHBvbGljeV8sIHByaW9yaXR5XyksIHN0YWNrU2l6ZV8sIGRldGFjaGVkXywgcnVubmFibGUpKTsKLSAgICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKLSAgICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGludCBnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBzdGFja1NpemVfOyB9Ci0KLSAgdm9pZCBzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7IHN0YWNrU2l6ZV8gPSB2YWx1ZTsgfQotCi0gIFBSSU9SSVRZIGdldFByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gcHJpb3JpdHlfOyB9Ci0KLSAgLyoqCi0gICAqIFNldHMgcHJpb3JpdHkuCi0gICAqCi0gICAqICBYWFgKLSAgICogIE5lZWQgdG8gaGFuZGxlIGluY3JlbWVudGFsIHByaW9yaXRpZXMgcHJvcGVybHkuCi0gICAqLwotICB2b2lkIHNldFByaW9yaXR5KFBSSU9SSVRZIHZhbHVlKSB7IHByaW9yaXR5XyA9IHZhbHVlOyB9Ci0KLSAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9Ci0KLSAgdm9pZCBzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGRldGFjaGVkXyA9IHZhbHVlOyB9Ci0KLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKTsKLSAgfQotCi19OwotCi1Qb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5LCBQUklPUklUWSBwcmlvcml0eSwgaW50IHN0YWNrU2l6ZSwgYm9vbCBkZXRhY2hlZCkgOgotICBpbXBsXyhuZXcgUG9zaXhUaHJlYWRGYWN0b3J5OjpJbXBsKHBvbGljeSwgcHJpb3JpdHksIHN0YWNrU2l6ZSwgZGV0YWNoZWQpKSB7fQotCi1zaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5uZXdUaHJlYWQocnVubmFibGUpOyB9Ci0KLWludCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFN0YWNrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRTdGFja1NpemUoKTsgfQotCi12b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBpbXBsXy0+c2V0U3RhY2tTaXplKHZhbHVlKTsgfQotCi1Qb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0UHJpb3JpdHkoKTsgfQotCi12b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSB2YWx1ZSkgeyBpbXBsXy0+c2V0UHJpb3JpdHkodmFsdWUpOyB9Ci0KLWJvb2wgUG9zaXhUaHJlYWRGYWN0b3J5Ojppc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmlzRGV0YWNoZWQoKTsgfQotCi12b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBpbXBsXy0+c2V0RGV0YWNoZWQodmFsdWUpOyB9Ci0KLVRocmVhZDo6aWRfdCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQ4M2EzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlICJUaHJlYWQuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciBwb2xpY2llcwotICAgKi8KLSAgZW51bSBQT0xJQ1kgewotICAgIE9USEVSLAotICAgIEZJRk8sCi0gICAgUk9VTkRfUk9CSU4KLSAgfTsKLQotICAvKioKLSAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciByZWxhdGl2ZSBwcmlvcml0aWVzLAotICAgKgotICAgKiBBYnNvbHV0ZSBwcmlvcml0eSBpcyBkZXRlcm1pbmVkIGJ5IHNjaGVkdWxlciBwb2xpY3kgYW5kIE9TLiBUaGlzCi0gICAqIGVudW1lcmF0aW9uIHNwZWNpZmllcyByZWxhdGl2ZSBwcmlvcml0aWVzIHN1Y2ggdGhhdCBvbmUgY2FuIHNwZWNpZnkgYQotICAgKiBwcmlvcml0eSB3aXRoaW5nIGEgZ2l2aW5nIHNjaGVkdWxlciBwb2xpY3kgd2l0aG91dCBrbm93aW5nIHRoZSBhYnNvbHV0ZQotICAgKiB2YWx1ZSBvZiB0aGUgcHJpb3JpdHkuCi0gICAqLwotICBlbnVtIFBSSU9SSVRZIHsKLSAgICBMT1dFU1QgPSAwLAotICAgIExPV0VSID0gMSwKLSAgICBMT1cgPSAyLAotICAgIE5PUk1BTCA9IDMsCi0gICAgSElHSCA9IDQsCi0gICAgSElHSEVSID0gNSwKLSAgICBISUdIRVNUID0gNiwKLSAgICBJTkNSRU1FTlQgPSA3LAotICAgIERFQ1JFTUVOVCA9IDgKLSAgfTsKLQotICAvKioKLSAgICogUG9zaXggdGhyZWFkIChwdGhyZWFkKSBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCi0gICAqIHZpYSBib29zdDo6c2hhcmVkX3B0ciBhbmQgYm9vc3Q6OndlYWtfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kCi0gICAqIHRoZSBSdW5uYWJsZSB0YXNrcyB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgotICAgKgotICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKLSAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKLSAgICogd2hlbiBpdCBjb21wbGV0ZXMuICBBIGRldGFjaGFibGUgdGhyZWFkIGlzIG5vdCBqb2luYWJsZS4gIFRoZSBqb2luIG1ldGhvZAotICAgKiBvZiBhIGRldGFjaGFibGUgdGhyZWFkIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggbm8gZXJyb3IuCi0gICAqCi0gICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgotICAgKi8KLQotICBQb3NpeFRocmVhZEZhY3RvcnkoUE9MSUNZIHBvbGljeT1ST1VORF9ST0JJTiwgUFJJT1JJVFkgcHJpb3JpdHk9Tk9STUFMLCBpbnQgc3RhY2tTaXplPTEsIGJvb2wgZGV0YWNoZWQ9dHJ1ZSk7Ci0KLSAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHN0YWNrIHNpemUgZm9yIGNyZWF0ZWQgdGhyZWFkcwotICAgKgotICAgKiBAcmV0dXJuIGludCBzaXplIGluIG1lZ2FieXRlcwotICAgKi8KLSAgdmlydHVhbCBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFNldHMgc3RhY2sgc2l6ZSBmb3IgY3JlYXRlZCB0aHJlYWRzCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBzaXplIGluIG1lZ2FieXRlcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldFN0YWNrU2l6ZShpbnQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5Ci0gICAqLwotICB2aXJ0dWFsIFBSSU9SSVRZIGdldFByaW9yaXR5KCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFNldHMgcHJpb3JpdHkgcmVsYXRpdmUgdG8gY3VycmVudCBwb2xpY3kKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSBwcmlvcml0eSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgZGV0YWNoZWQgbW9kZSBvZiB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI4MmFkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXyAxCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotY2xhc3MgVGhyZWFkOwotCi0vKioKLSAqIE1pbmltYWwgcnVubmFibGUgY2xhc3MuICBNb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5SdW5uYWJsZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflJ1bm5hYmxlKCkge307Ci0gIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHRocmVhZCBvYmplY3QgdGhhdCBpcyBob3N0aW5nIHRoaXMgcnVubmFibGUgb2JqZWN0ICAtIGNhbiByZXR1cm4KLSAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoZXQgdGhyZWFkICBvYmplY3QKLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0aHJlYWQgdGhhdCBpcyBleGVjdXRpbmcgdGhpcyBvYmplY3QuICBUaGlzIGlzIG9ubHkgbWVhbnQgZm9yCi0gICAqIHVzZSBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgVGhyZWFkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHZhbHVlKSB7IHRocmVhZF8gPSB2YWx1ZTsgfQotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OndlYWtfcHRyPFRocmVhZD4gdGhyZWFkXzsKLX07Ci0KLS8qKgotICogTWluaW1hbCB0aHJlYWQgY2xhc3MuIFJldHVybmVkIGJ5IHRocmVhZCBmYWN0b3J5IGJvdW5kIHRvIGEgUnVubmFibGUgb2JqZWN0Ci0gKiBhbmQgcmVhZHkgdG8gc3RhcnQgZXhlY3V0aW9uLiAgTW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuVGhyZWFkCi0gKiAobWludXMgYWxsIHRoZSB0aHJlYWQgZ3JvdXAsIHByaW9yaXR5LCBtb2RlIGFuZCBvdGhlciBiYWdnYWdlLCBzaW5jZSB0aGF0Ci0gKiBpcyBkaWZmaWN1bHQgdG8gYWJzdHJhY3QgYWNyb3NzIHBsYXRmb3JtcyBhbmQgaXMgbGVmdCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKLSAqIFRocmVhZEZhY3RvcnkgaW1wbGVtdGF0aW9ucyB0byBkZWFsIHdpdGgKLSAqCi0gKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeSkKLSAqLwotY2xhc3MgVGhyZWFkIHsKLQotIHB1YmxpYzoKLQotICB0eXBlZGVmIHVpbnQ2NF90IGlkX3Q7Ci0KLSAgdmlydHVhbCB+VGhyZWFkKCkge307Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgdGhyZWFkLiBEb2VzIHBsYXRmb3JtIHNwZWNpZmljIHRocmVhZCBjcmVhdGlvbiBhbmQKLSAgICogY29uZmlndXJhdGlvbiB0aGVuIGludm9rZXMgdGhlIHJ1biBtZXRob2Qgb2YgdGhlIFJ1bm5hYmxlIG9iamVjdCBib3VuZAotICAgKiB0byB0aGlzIHRocmVhZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKLQotICAvKioKLSAgICogSm9pbiB0aGlzIHRocmVhZC4gQ3VycmVudCB0aHJlYWQgYmxvY2tzIHVudGlsIHRoaXMgdGFyZ2V0IHRocmVhZAotICAgKiBjb21wbGV0ZXMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdGhyZWFkJ3MgcGxhdGZvcm0tc3BlY2lmaWMgSUQKLSAgICovCi0gIHZpcnR1YWwgaWRfdCBnZXRJZCgpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgcnVubmFibGUgb2JqZWN0IHRoaXMgdGhyZWFkIGlzIGhvc3RpbmcKLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBydW5uYWJsZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgX3J1bm5hYmxlID0gdmFsdWU7IH0KLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBfcnVubmFibGU7Ci0KLX07Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkIG9iamVjdCBhbmQgYmluZCB0aGVtIHRvIFJ1bm5hYmxlCi0gKiBvYmplY3QgZm9yIGV4ZWN1dGlvbgotICovCi1jbGFzcyBUaHJlYWRGYWN0b3J5IHsKLQotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGhyZWFkRmFjdG9yeSgpIHt9Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCA9IDA7Ci0KLSAgLyoqIEdldHMgdGhlIGN1cnJlbnQgdGhyZWFkIGlkIG9yIHVua25vd25fdGhyZWFkX2lkIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB0aHJpZnQgdGhyZWFkICovCi0KLSAgc3RhdGljIGNvbnN0IFRocmVhZDo6aWRfdCB1bmtub3duX3RocmVhZF9pZDsKLQotICB2aXJ0dWFsIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCA9IDA7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWU1N2YzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRocmVhZE1hbmFnZXIuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpZiBkZWZpbmVkKERFQlVHKQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2VuZGlmIC8vZGVmaW5lZChERUJVRykKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCi0gKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKLSAqIHRocmVhZHMuICBJdCBuZXZlciBhY3R1YWxseSBjcmVhdGVzIG9yIGRlc3Ryb3lzIHdvcmtlciB0aHJlYWRzLCByYXRoZXIKLSAqIGl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKLSAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgIHsKLQotIHB1YmxpYzoKLSAgSW1wbCgpIDoKLSAgICB3b3JrZXJDb3VudF8oMCksCi0gICAgd29ya2VyTWF4Q291bnRfKDApLAotICAgIGlkbGVDb3VudF8oMCksCi0gICAgcGVuZGluZ1Rhc2tDb3VudE1heF8oMCksCi0gICAgZXhwaXJlZENvdW50XygwKSwKLSAgICBzdGF0ZV8oVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCi0gICAgbW9uaXRvcl8oJm11dGV4XyksCi0gICAgbWF4TW9uaXRvcl8oJm11dGV4Xykge30KLQotICB+SW1wbCgpIHsgc3RvcCgpOyB9Ci0KLSAgdm9pZCBzdGFydCgpOwotCi0gIHZvaWQgc3RvcCgpIHsgc3RvcEltcGwoZmFsc2UpOyB9Ci0KLSAgdm9pZCBqb2luKCkgeyBzdG9wSW1wbCh0cnVlKTsgfQotCi0gIGNvbnN0IFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0ZV87Ci0gIH0KLQotICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB0aHJlYWRGYWN0b3J5XzsKLSAgfQotCi0gIHZvaWQgdGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7Ci0gIH0KLQotICB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWUpOwotCi0gIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSk7Ci0KLSAgc2l6ZV90IGlkbGVXb3JrZXJDb3VudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRsZUNvdW50XzsKLSAgfQotCi0gIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHdvcmtlckNvdW50XzsKLSAgfQotCi0gIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gdGFza3NfLnNpemUoKTsKLSAgfQotCi0gIHNpemVfdCB0b3RhbFRhc2tDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHRhc2tzXy5zaXplKCkgKyB3b3JrZXJDb3VudF8gLSBpZGxlQ291bnRfOwotICB9Ci0KLSAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiBwZW5kaW5nVGFza0NvdW50TWF4XzsKLSAgfQotCi0gIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzaXplX3QgcmVzdWx0ID0gZXhwaXJlZENvdW50XzsKLSAgICBleHBpcmVkQ291bnRfID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgdm9pZCBwZW5kaW5nVGFza0NvdW50TWF4KGNvbnN0IHNpemVfdCB2YWx1ZSkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XyA9IHZhbHVlOwotICB9Ci0KLSAgYm9vbCBjYW5TbGVlcCgpOwotCi0gIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7Ci0KLSAgdm9pZCByZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7Ci0KLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKTsKLQotICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpOwotCi0gIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spOwotCi1wcml2YXRlOgotICB2b2lkIHN0b3BJbXBsKGJvb2wgam9pbik7Ci0KLSAgc2l6ZV90IHdvcmtlckNvdW50XzsKLSAgc2l6ZV90IHdvcmtlck1heENvdW50XzsKLSAgc2l6ZV90IGlkbGVDb3VudF87Ci0gIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4XzsKLSAgc2l6ZV90IGV4cGlyZWRDb3VudF87Ci0gIEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrXzsKLQotICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZV87Ci0gIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0KLQotICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzazsKLSAgc3RkOjpxdWV1ZTxzaGFyZWRfcHRyPFRhc2s+ID4gdGFza3NfOwotICBNdXRleCBtdXRleF87Ci0gIE1vbml0b3IgbW9uaXRvcl87Ci0gIE1vbml0b3IgbWF4TW9uaXRvcl87Ci0gIE1vbml0b3Igd29ya2VyTW9uaXRvcl87Ci0KLSAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gd29ya2Vyc187Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IGRlYWRXb3JrZXJzXzsKLSAgc3RkOjptYXA8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPiBpZE1hcF87Ci19OwotCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLQotIHB1YmxpYzoKLSAgZW51bSBTVEFURSB7Ci0gICAgV0FJVElORywKLSAgICBFWEVDVVRJTkcsCi0gICAgQ0FOQ0VMTEVELAotICAgIENPTVBMRVRFCi0gIH07Ci0KLSAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uPTBMTCkgIDoKLSAgICBydW5uYWJsZV8ocnVubmFibGUpLAotICAgIHN0YXRlXyhXQUlUSU5HKSwKLSAgICBleHBpcmVUaW1lXyhleHBpcmF0aW9uICE9IDBMTCA/IFV0aWw6OmN1cnJlbnRUaW1lKCkgKyBleHBpcmF0aW9uIDogMExMKSB7fQotCi0gIH5UYXNrKCkge30KLQotICB2b2lkIHJ1bigpIHsKLSAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgewotICAgICAgcnVubmFibGVfLT5ydW4oKTsKLSAgICAgIHN0YXRlXyA9IENPTVBMRVRFOwotICAgIH0KLSAgfQotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IGdldFJ1bm5hYmxlKCkgewotICAgIHJldHVybiBydW5uYWJsZV87Ci0gIH0KLQotICBpbnQ2NF90IGdldEV4cGlyZVRpbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4cGlyZVRpbWVfOwotICB9Ci0KLSBwcml2YXRlOgotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87Ci0gIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7Ci0gIFNUQVRFIHN0YXRlXzsKLSAgaW50NjRfdCBleHBpcmVUaW1lXzsKLX07Ci0KLWNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjogcHVibGljIFJ1bm5hYmxlIHsKLSAgZW51bSBTVEFURSB7Ci0gICAgVU5JTklUSUFMSVpFRCwKLSAgICBTVEFSVElORywKLSAgICBTVEFSVEVELAotICAgIFNUT1BQSU5HLAotICAgIFNUT1BQRUQKLSAgfTsKLQotIHB1YmxpYzoKLSAgV29ya2VyKFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXIpIDoKLSAgICBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICBzdGF0ZV8oVU5JTklUSUFMSVpFRCksCi0gICAgaWRsZV8oZmFsc2UpIHt9Ci0KLSAgfldvcmtlcigpIHt9Ci0KLSBwcml2YXRlOgotICBib29sIGlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybgotICAgICAgKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPD0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgfHwKLSAgICAgIChtYW5hZ2VyXy0+c3RhdGVfID09IEpPSU5JTkcgJiYgIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSk7Ci0gIH0KLQotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFdvcmtlciBlbnRyeSBwb2ludAotICAgKgotICAgKiBBcyBsb25nIGFzIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgcXVldWUgYW5kCi0gICAqIGV4ZWN1dGUuCi0gICAqLwotICB2b2lkIHJ1bigpIHsKLSAgICBib29sIGFjdGl2ZSA9IGZhbHNlOwotICAgIGJvb2wgbm90aWZ5TWFuYWdlciA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogSW5jcmVtZW50IHdvcmtlciBzZW1hcGhvcmUgYW5kIG5vdGlmeSBtYW5hZ2VyIGlmIHdvcmtlciBjb3VudCByZWFjaGVkCi0gICAgICogZGVzaXJlZCBtYXgKLSAgICAgKgotICAgICAqIE5vdGU6IFdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgbW9uaXRvciBhbmQgYWNxdWlyZSB0aGUgd29ya2VyTW9uaXRvcgotICAgICAqIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgbWFuYWdlciBibG9ja3Mgb24gZm9yIHdvcmtlciBhZGQvcmVtb3ZlCi0gICAgICovCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGFjdGl2ZSA9IG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPCBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgaWYgKGFjdGl2ZSkgewotICAgICAgICBtYW5hZ2VyXy0+d29ya2VyQ291bnRfKys7Ci0gICAgICAgIG5vdGlmeU1hbmFnZXIgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5vdGlmeU1hbmFnZXIpIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXyk7Ci0gICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICBub3RpZnlNYW5hZ2VyID0gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKGFjdGl2ZSkgewotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrOwotCi0gICAgICAvKioKLSAgICAgICAqIFdoaWxlIGhvbGRpbmcgbWFuYWdlciBtb25pdG9yIGJsb2NrIGZvciBub24tZW1wdHkgdGFzayBxdWV1ZSAoQWxzbwotICAgICAgICogY2hlY2sgdGhhdCB0aGUgdGhyZWFkIGhhc24ndCBiZWVuIHJlcXVlc3RlZCB0byBzdG9wKS4gT25jZSB0aGUgcXVldWUKLSAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQotICAgICAgICogd29ya2VyIG1heCBjb3VudCBoYXMgYmVlbiBkZWNyZW1lbnRlZCBzdWNoIHRoYXQgd2UgZXhjZWVkIGl0LCBtYXJrCi0gICAgICAgKiBvdXJzZWxmIGluYWN0aXZlLCBkZWNyZW1lbnQgdGhlIHdvcmtlciBjb3VudCBhbmQgbm90aWZ5IHRoZSBtYW5hZ2VyCi0gICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5Ci0gICAgICAgKiB0aGUgbWFuYWdlciB3aWxsIHNlZSBpdC4KLSAgICAgICAqLwotICAgICAgewotICAgICAgICBHdWFyZCBnKG1hbmFnZXJfLT5tdXRleF8pOwotICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOwotCi0gICAgICAgIHdoaWxlIChhY3RpdmUgJiYgbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8rKzsKLSAgICAgICAgICBpZGxlXyA9IHRydWU7Ci0gICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQoKTsKLSAgICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOwotICAgICAgICAgIGlkbGVfID0gZmFsc2U7Ci0gICAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8tLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgICBtYW5hZ2VyXy0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0KLSAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wKCk7Ci0gICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyB0YXNrIG1heCBhbmQgd2UganVzdCBkcm9wcGVkIGJlbG93IGl0LCB3YWtldXAgYW55Ci0gICAgICAgICAgICAgICB0aHJlYWQgdGhhdCBtaWdodCBiZSBibG9ja2VkIG9uIGFkZC4gKi8KLSAgICAgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMCAmJgotICAgICAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18uc2l6ZSgpIDw9IG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAtIDEpIHsKLSAgICAgICAgICAgICAgbWFuYWdlcl8tPm1heE1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZGxlXyA9IHRydWU7Ci0gICAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50Xy0tOwotICAgICAgICAgIG5vdGlmeU1hbmFnZXIgPSAobWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAodGFzayAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhc2stPnJ1bigpOwotICAgICAgICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICAgICAgICAvLyBYWFggbmVlZCB0byBsb2cgdGhpcwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXyk7Ci0gICAgICBtYW5hZ2VyXy0+ZGVhZFdvcmtlcnNfLmluc2VydCh0aGlzLT50aHJlYWQoKSk7Ci0gICAgICBpZiAobm90aWZ5TWFuYWdlcikgewotICAgICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyXzsKLSAgICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbDsKLSAgICBTVEFURSBzdGF0ZV87Ci0gICAgYm9vbCBpZGxlXzsKLX07Ci0KLQotICB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcihzaXplX3QgdmFsdWUpIHsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gbmV3VGhyZWFkczsKLSAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7Ci0gICAgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIgPSBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4obmV3IFRocmVhZE1hbmFnZXI6Oldvcmtlcih0aGlzKSk7Ci0gICAgbmV3VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZCh3b3JrZXIpKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOwotICAgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOwotICB9Ci0KLSAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBuZXdUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IG5ld1RocmVhZHMuZW5kKCk7IGl4KyspIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4oKCppeCktPnJ1bm5hYmxlKCkpOwotICAgIHdvcmtlci0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6V29ya2VyOjpTVEFSVElORzsKLSAgICAoKml4KS0+c3RhcnQoKTsKLSAgICBpZE1hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+KCgqaXgpLT5nZXRJZCgpLCAqaXgpKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpIHsKLQotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgaWYgKHRocmVhZEZhY3RvcnlfID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEOwotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0YXRlXyA9PSBTVEFSVElORykgewotICAgICAgbW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0b3BJbXBsKGJvb2wgam9pbikgewotICBib29sIGRvU3RvcCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBqb2luID8gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyA6IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HOwotICAgIH0KLSAgfQotCi0gIGlmIChkb1N0b3ApIHsKLSAgICByZW1vdmVXb3JrZXIod29ya2VyQ291bnRfKTsKLSAgfQotCi0gIC8vIFhYWAotICAvLyBzaG91bGQgYmUgYWJsZSB0byBibG9jayBoZXJlIGZvciB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc2luY2Ugd2UncmUgbm8KLSAgLy8gdXNpbmcgc2hhcmVkX3B0cnMKLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQ7Ci0gIH0KLQotfQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIHsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gcmVtb3ZlZFRocmVhZHM7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7Ci0KLSAgICBpZiAoaWRsZUNvdW50XyA8IHZhbHVlKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaWRsZUNvdW50XzsgaXgrKykgewotICAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKHdvcmtlck1vbml0b3JfKTsKLQotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsgaXggIT0gZGVhZFdvcmtlcnNfLmVuZCgpOyBpeCsrKSB7Ci0gICAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOwotICAgICAgaWRNYXBfLmVyYXNlKCgqaXgpLT5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBkZWFkV29ya2Vyc18uY2xlYXIoKTsKLSAgfQotfQotCi0gIGJvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSB7Ci0gICAgY29uc3QgVGhyZWFkOjppZF90IGlkID0gdGhyZWFkRmFjdG9yeV8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOwotICAgIHJldHVybiBpZE1hcF8uZmluZChpZCkgPT0gaWRNYXBfLmVuZCgpOwotICB9Ci0KLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcmF0aW9uKSB7Ci0gICAgR3VhcmQgZyhtdXRleF8sIHRpbWVvdXQpOwotCi0gICAgaWYgKCFnKSB7Ci0gICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewotICAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0gICAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKLSAgICAgIGlmIChjYW5TbGVlcCgpICYmIHRpbWVvdXQgPj0gMCkgewotICAgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKLSAgICAgICAgICAvLyBUaGlzIGlzIHRocmVhZCBzYWZlIGJlY2F1c2UgdGhlIG11dGV4IGlzIHNoYXJlZCBiZXR3ZWVuIG1vbml0b3JzLgotICAgICAgICAgIG1heE1vbml0b3JfLndhaXQodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0YXNrc18ucHVzaChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyOjpUYXNrKHZhbHVlLCBleHBpcmF0aW9uKSkpOwotCi0gICAgLy8gSWYgaWRsZSB0aHJlYWQgaXMgYXZhaWxhYmxlIG5vdGlmeSBpdCwgb3RoZXJ3aXNlIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUKLSAgICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCi0gICAgaWYgKGlkbGVDb3VudF8gPiAwKSB7Ci0gICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICB9Ci0gIH0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewotICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICB9Ci19Ci0KLWJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZygpIHsKLSAgR3VhcmQgZyhtdXRleF8pOwotICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgfQotCi0gIGlmICh0YXNrc18uZW1wdHkoKSkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICB0YXNrc18ucG9wKCk7Ci0gIAotICByZXR1cm4gdGFzay0+Z2V0UnVubmFibGUoKTsKLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVFeHBpcmVkVGFza3MoKSB7Ci0gIGludDY0X3Qgbm93ID0gMExMOyAvLyB3ZSB3b24ndCBhc2sgZm9yIHRoZSB0aW1lIHVudGlsZSB3ZSBuZWVkIGl0Ci0KLSAgLy8gbm90ZSB0aGF0IHRoaXMgbG9vcCBicmVha3MgYXQgdGhlIGZpcnN0IG5vbi1leHBpcmluZyB0YXNrCi0gIHdoaWxlICghdGFza3NfLmVtcHR5KCkpIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID09IDBMTCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChub3cgPT0gMExMKSB7Ci0gICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIH0KLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID4gbm93KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGV4cGlyZUNhbGxiYWNrXykgewotICAgICAgZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOwotICAgIH0KLSAgICB0YXNrc18ucG9wKCk7Ci0gICAgZXhwaXJlZENvdW50XysrOwotICB9Ci19Ci0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgewotICBleHBpcmVDYWxsYmFja18gPSBleHBpcmVDYWxsYmFjazsKLX0KLQotY2xhc3MgU2ltcGxlVGhyZWFkTWFuYWdlciA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyOjpJbXBsIHsKLQotIHB1YmxpYzoKLSAgU2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3Qgd29ya2VyQ291bnQ9NCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXg9MCkgOgotICAgIHdvcmtlckNvdW50Xyh3b3JrZXJDb3VudCksCi0gICAgcGVuZGluZ1Rhc2tDb3VudE1heF8ocGVuZGluZ1Rhc2tDb3VudE1heCksCi0gICAgZmlyc3RUaW1lXyh0cnVlKSB7Ci0gIH0KLQotICB2b2lkIHN0YXJ0KCkgewotICAgIFRocmVhZE1hbmFnZXI6OkltcGw6OnBlbmRpbmdUYXNrQ291bnRNYXgocGVuZGluZ1Rhc2tDb3VudE1heF8pOwotICAgIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0YXJ0KCk7Ci0gICAgYWRkV29ya2VyKHdvcmtlckNvdW50Xyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IHNpemVfdCB3b3JrZXJDb3VudF87Ci0gIGNvbnN0IHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4XzsKLSAgYm9vbCBmaXJzdFRpbWVfOwotICBNb25pdG9yIG1vbml0b3JfOwotfTsKLQotCi1zaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1RocmVhZE1hbmFnZXIoKSB7Ci0gIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpJbXBsKCkpOwotfQotCi1zaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCkgewotICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgU2ltcGxlVGhyZWFkTWFuYWdlcihjb3VudCwgcGVuZGluZ1Rhc2tDb3VudE1heCkpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjNDkwNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8gMQotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBUaHJlYWQgUG9vbCBNYW5hZ2VyIGFuZCByZWxhdGVkIGNsYXNzZXMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOwotCi0vKioKLSAqIFRocmVhZE1hbmFnZXIgY2xhc3MKLSAqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBwb29sIG9mIHRocmVhZHMuIEl0IHVzZXMgYSBUaHJlYWRGYWN0b3J5IHRvIGNyZWF0ZQotICogdGhyZWFkcy4gSXQgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlcyBvciBkZXN0cm95cyB3b3JrZXIgdGhyZWFkcywgcmF0aGVyCi0gKiBJdCBtYWludGFpbnMgc3RhdGlzdGljcyBvbiBudW1iZXIgb2YgaWRsZSB0aHJlYWRzLCBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMsCi0gKiB0YXNrIGJhY2tsb2csIGFuZCBhdmVyYWdlIHdhaXQgYW5kIHNlcnZpY2UgdGltZXMgYW5kIGluZm9ybXMgdGhlIFBvb2xQb2xpY3kKLSAqIG9iamVjdCBib3VuZCB0byBpbnN0YW5jZXMgb2YgdGhpcyBtYW5hZ2VyIG9mIGludGVyZXN0aW5nIHRyYW5zaXRpb25zLiBJdCBpcwotICogdGhlbiB1cCB0aGUgUG9vbFBvbGljeSBvYmplY3QgdG8gZGVjaWRlIGlmIHRoZSB0aHJlYWQgcG9vbCBzaXplIG5lZWRzIHRvIGJlCi0gKiBhZGp1c3RlZCBhbmQgY2FsbCB0aGlzIG9iamVjdCBhZGRXb3JrZXIgYW5kIHJlbW92ZVdvcmtlciBtZXRob2RzIHRvIG1ha2UKLSAqIGNoYW5nZXMuCi0gKgotICogVGhpcyBkZXNpZ24gYWxsb3dzIGRpZmZlcmVudCBwb2xpY3kgaW1wbGVtZW50YXRpb25zIHRvIHVzZWQgdGhpcyBjb2RlIHRvCi0gKiBoYW5kbGUgYmFzaWMgd29ya2VyIHRocmVhZCBtYW5hZ2VtZW50IGFuZCB3b3JrZXIgdGFzayBleGVjdXRpb24gYW5kIGZvY3VzIG9uCi0gKiBwb2xpY3kgaXNzdWVzLiBUaGUgc2ltcGxlc3QgcG9saWN5LCBTdGF0aWNQb2xpY3ksIGRvZXMgbm90aGluZyBvdGhlciB0aGFuCi0gKiBjcmVhdGUgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcy4KLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlciB7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRocmVhZE1hbmFnZXIoKSB7fQotCi0gcHVibGljOgotICBjbGFzcyBUYXNrOwotICB0eXBlZGVmIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPik+IEV4cGlyZUNhbGxiYWNrOwotCi0gIHZpcnR1YWwgflRocmVhZE1hbmFnZXIoKSB7fQotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBWZXJpZmllcyBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gcHJvcGVybHkKLSAgICogaW5pdGlhbGl6ZWQsIHRoZW4gYWxsb2NhdGVzIG5lY2Vzc2FyeSByZXNvdXJjZXMgdG8gYmVnaW4gb3BlcmF0aW9uCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKLSAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlYWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KLSAgICogVGhpcyBtZXRob2QgYmxvY2tzIGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gY29tcGxldGUsIHRodXMgaXQgY2FuCi0gICAqIHBvdGVudGlhbGx5IGJsb2NrIGZvcmV2ZXIgaWYgYSB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcgYSB0YXNrIHRoYXQKLSAgICogd29uJ3QgdGVybWluYXRlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEpvaW5zIHRoZSB0aHJlYWQgbWFuYWdlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBzdG9wLCBleGNlcHQgdGhhdCBpdCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHdvcmsuIEF0IHRoYXQgcG9pbnQKLSAgICogdGhlIFRocmVhZE1hbmFnZXIgd2lsbCB0cmFuc2l0aW9uIGludG8gdGhlIFNUT1BQRUQgc3RhdGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKLQotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgSk9JTklORywKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07Ci0KLSAgdmlydHVhbCBjb25zdCBTVEFURSBzdGF0ZSgpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWU9MSkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBpZGxlIHdvcmtlciB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRvdGFsIHdvcmtlciB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyB0YXNrcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0ICA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgYW5kIGV4ZWN1dGluZyB0YXNrcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG1heGltdW0gcGVuZGluZyB0YXNrIGNvdW50LiAgMCBpbmRpY2F0ZXMgbm8gbWF4aW11bQotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuLgotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpID0gMDsKLQotICAvKioKLSAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHBlbmRpbmdUYXNrQ291bnRNYXgoKSBpbiBub3QgemVybyBhbmQgcGVuZGluZ1Rhc2tDb3VudCgpCi0gICAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHQgdG8gcGVuZGluZ1Rhc2tDb3VudE1heCgpLiAgSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZQotICAgKiBjb250ZXh0IG9mIGEgVGhyZWFkTWFuYWdlciB3b3JrZXIgdGhyZWFkIGl0IHdpbGwgdGhyb3cgYQotICAgKiBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uCi0gICAqCi0gICAqIEBwYXJhbSB0YXNrICBUaGUgdGFzayB0byBxdWV1ZSBmb3IgZXhlY3V0aW9uCi0gICAqCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMgdG8gYWRkIGEgdGFzayB3aGVuIGEgcGVuZGluZy10YXNrLWNvdW50Ci0gICAqIGlzIHNwZWNpZmllZC4gU3BlY2lmaWMgY2FzZXM6Ci0gICAqIHRpbWVvdXQgPSAwICA6IFdhaXQgZm9yZXZlciB0byBxdWV1ZSB0YXNrLgotICAgKiB0aW1lb3V0ID0gLTEgOiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgcGVuZGluZyB0YXNrIGNvdW50IGV4Y2VlZHMgc3BlY2lmaWVkIG1heAotICAgKiBAcGFyYW0gZXhwaXJhdGlvbiB3aGVuIG5vbnplcm8sIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSB0YXNrIGlzIHZhbGlkCi0gICAqIHRvIGJlIHJ1bjsgaWYgZXhjZWVkZWQsIHRoZSB0YXNrIHdpbGwgYmUgZHJvcHBlZCBvZmYgdGhlIHF1ZXVlIGFuZCBub3QgcnVuLgotICAgKgotICAgKiBAdGhyb3dzIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24gUGVuZGluZyB0YXNrIGNvdW50IGV4Y2VlZHMgbWF4IHBlbmRpbmcgdGFzayBjb3VudAotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT50YXNrLAotICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dD0wTEwsCi0gICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcmF0aW9uPTBMTCkgPSAwOwotCi0gIC8qKgotICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0aGUgbmV4dCBwZW5kaW5nIHRhc2sgd2hpY2ggd291bGQgYmUgcnVuLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB0YXNrIHJlbW92ZWQuCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKLQotICAvKioKLSAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFNldCBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGFzayBpcyBleHBpcmVkIGFuZCBub3QgcnVuLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJlQ2FsbGJhY2sgYSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZm9yCi0gICAqIHRoZSBleHBpcmVkIHRhc2suCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKLQotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgc2ltcGxlIHRocmVhZCBtYW5hZ2VyIHRoZSB1c2VzIGNvdW50IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgaGFzCi0gICAqIGEgcGVuZGluZ1Rhc2tDb3VudE1heCBtYXhpbXVtIHBlbmRpbmcgdGFza3MuIFRoZSBkZWZhdWx0LCAwLCBzcGVjaWZpZWQgbm8gbGltaXQKLSAgICogb24gcGVuZGluZyB0YXNrcwotICAgKi8KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50PTQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4PTApOwotCi0gIGNsYXNzIFRhc2s7Ci0KLSAgY2xhc3MgV29ya2VyOwotCi0gIGNsYXNzIEltcGw7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDBkOWMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUaW1lck1hbmFnZXIuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogVGltZXJNYW5hZ2VyIGNsYXNzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGltZXJNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLQotIHB1YmxpYzoKLSAgZW51bSBTVEFURSB7Ci0gICAgV0FJVElORywKLSAgICBFWEVDVVRJTkcsCi0gICAgQ0FOQ0VMTEVELAotICAgIENPTVBMRVRFCi0gIH07Ci0KLSAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgOgotICAgIHJ1bm5hYmxlXyhydW5uYWJsZSksCi0gICAgc3RhdGVfKFdBSVRJTkcpIHt9Ci0KLSAgflRhc2soKSB7Ci0gIH0KLQotICB2b2lkIHJ1bigpIHsKLSAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgewotICAgICAgcnVubmFibGVfLT5ydW4oKTsKLSAgICAgIHN0YXRlXyA9IENPTVBMRVRFOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwotICBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7Ci0gIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7Ci0gIFNUQVRFIHN0YXRlXzsKLX07Ci0KLWNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjogcHVibGljIFJ1bm5hYmxlIHsKLQotIHB1YmxpYzoKLSAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDoKLSAgICBtYW5hZ2VyXyhtYW5hZ2VyKSB7fQotCi0gIH5EaXNwYXRjaGVyKCkge30KLQotICAvKioKLSAgICogRGlzcGF0Y2hlciBlbnRyeSBwb2ludAotICAgKgotICAgKiBBcyBsb25nIGFzIGRpc3BhdGNoZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHRhc2tNYXBfCi0gICAqIGFuZCBleGVjdXRlLgotICAgKi8KLSAgdm9pZCBydW4oKSB7Ci0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKLSAgICAgICAgbWFuYWdlcl8tPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRDsKLSAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGRvIHsKLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+IGV4cGlyZWRUYXNrczsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgICAgdGFza19pdGVyYXRvciBleHBpcmVkVGFza0VuZDsKLSAgICAgICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgICB3aGlsZSAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQgJiYKLSAgICAgICAgICAgICAgIChleHBpcmVkVGFza0VuZCA9IG1hbmFnZXJfLT50YXNrTWFwXy51cHBlcl9ib3VuZChub3cpKSA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgewotICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKLSAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrTWFwXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aW1lb3V0ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCktPmZpcnN0IC0gbm93OwotICAgICAgICAgIH0KLSAgICAgICAgICBhc3NlcnQoKHRpbWVvdXQgIT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA+IDApIHx8ICh0aW1lb3V0ID09IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPT0gMCkpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKLSAgICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZSkge30KLSAgICAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgICAgICAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrRW5kOyBpeCsrKSB7Ci0gICAgICAgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gdGFzayA9IGl4LT5zZWNvbmQ7Ci0gICAgICAgICAgICBleHBpcmVkVGFza3MuaW5zZXJ0KHRhc2spOwotICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+dGFza0NvdW50Xy0tOwotICAgICAgICAgIH0KLSAgICAgICAgICBtYW5hZ2VyXy0+dGFza01hcF8uZXJhc2UobWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCksIGV4cGlyZWRUYXNrRW5kKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSAgZXhwaXJlZFRhc2tzLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsgaXgrKykgewotICAgICAgICAoKml4KS0+cnVuKCk7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7Ci0KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwotICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVE9QUElORykgewotICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOwotICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVGltZXJNYW5hZ2VyKiBtYW5hZ2VyXzsKLSAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjsKLX07Ci0KLVRpbWVyTWFuYWdlcjo6VGltZXJNYW5hZ2VyKCkgOgotICB0YXNrQ291bnRfKDApLAotICBzdGF0ZV8oVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKLSAgZGlzcGF0Y2hlcl8oc2hhcmVkX3B0cjxEaXNwYXRjaGVyPihuZXcgRGlzcGF0Y2hlcih0aGlzKSkpIHsKLX0KLQotCi1UaW1lck1hbmFnZXI6On5UaW1lck1hbmFnZXIoKSB7Ci0KLSAgLy8gSWYgd2UgaGF2ZW4ndCBiZWVuIGV4cGxpY2l0bHkgc3RvcHBlZCwgZG8gc28gbm93LiAgV2UgZG9uJ3QgbmVlZCB0byBncmFiCi0gIC8vIHRoZSBtb25pdG9yIGhlcmUsIHNpbmNlIHN0b3AgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHJlZW50cmFuY3kuCi0KLSAgaWYgKHN0YXRlXyAhPSBTVE9QUEVEKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHN0b3AoKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgdGhyb3c7Ci0gICAgICAvLyB1aG9oCi0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjpzdGFydCgpIHsKLSAgYm9vbCBkb1N0YXJ0ID0gZmFsc2U7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHRocmVhZEZhY3RvcnlfID09IE5VTEwpIHsKLSAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgc3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVElORzsKLSAgICAgIGRvU3RhcnQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChkb1N0YXJ0KSB7Ci0gICAgZGlzcGF0Y2hlclRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKGRpc3BhdGNoZXJfKTsKLSAgICBkaXNwYXRjaGVyVGhyZWFkXy0+c3RhcnQoKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd2hpbGUgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7Ci0gICAgICBtb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICAgIGFzc2VydChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORyk7Ci0gIH0KLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnN0b3AoKSB7Ci0gIGJvb2wgZG9TdG9wID0gZmFsc2U7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKLSAgICB9IGVsc2UgaWYgKHN0YXRlXyAhPSBTVE9QUElORyAmJiAgc3RhdGVfICE9IFNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBTVE9QUElORzsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgICB3aGlsZSAoc3RhdGVfICE9IFNUT1BQRUQpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZG9TdG9wKSB7Ci0gICAgLy8gQ2xlYW4gdXAgYW55IG91dHN0YW5kaW5nIHRhc2tzCi0gICAgdGFza01hcF8uY2xlYXIoKTsKLQotICAgIC8vIFJlbW92ZSBkaXNwYXRjaGVyJ3MgcmVmZXJlbmNlIHRvIHVzLgotICAgIGRpc3BhdGNoZXJfLT5tYW5hZ2VyXyA9IE5VTEw7Ci0gIH0KLX0KLQotc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3RvcnkoKSBjb25zdCB7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+ICB2YWx1ZSkgewotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7Ci19Ci0KLXNpemVfdCBUaW1lck1hbmFnZXI6OnRhc2tDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRhc2tDb3VudF87Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7Ci0gIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgdGltZW91dCArPSBub3c7Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewotICAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHRhc2sgbWFwIGlzIGVtcHR5LCB3ZSB3aWxsIGtpY2sgdGhlIGRpc3BhdGNoZXIgZm9yIHN1cmUuIE90aGVyd2lzZSwgd2Uga2ljayBoaW0KLSAgICAvLyBpZiB0aGUgZXhwaXJhdGlvbiB0aW1lIGlzIHNob3J0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZS4gTmVlZCB0byB0ZXN0IGJlZm9yZSB3ZSBpbnNlcnQsCi0gICAgLy8gYmVjYXVzZSB0aGUgbmV3IHRhc2sgbWlnaHQgaW5zZXJ0IGF0IHRoZSBmcm9udC4KLSAgICBib29sIG5vdGlmeVJlcXVpcmVkID0gKHRhc2tDb3VudF8gPT0gMCkgPyB0cnVlIDogdGltZW91dCA8IHRhc2tNYXBfLmJlZ2luKCktPmZpcnN0OwotCi0gICAgdGFza0NvdW50XysrOwotICAgIHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHNoYXJlZF9wdHI8VGFzaz4obmV3IFRhc2sodGFzaykpKSk7Ci0KLSAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCi0gICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCi0gICAgLy8gdGltZW91dAotICAgIGlmIChub3RpZnlSZXF1aXJlZCkgewotICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB2YWx1ZSkgewotCi0gIGludDY0X3QgZXhwaXJhdGlvbjsKLSAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOwotCi0gIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgewotICAgIHRocm93ICBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgfQotCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKLX0KLQotCi12b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewotICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICB9Ci19Ci0KLWNvbnN0IFRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmYwZWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfIDEKLQotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJUaHJlYWQuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBUaW1lciBNYW5hZ2VyCi0gKgotICogVGhpcyBjbGFzcyBkaXNwYXRjaGVzIHRpbWVyIHRhc2tzIHdoZW4gdGhleSBmYWxsIGR1ZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXIgewotCi0gcHVibGljOgotCi0gIFRpbWVyTWFuYWdlcigpOwotCi0gIHZpcnR1YWwgflRpbWVyTWFuYWdlcigpOwotCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTWlzc2luZyB0aHJlYWQgZmFjdG9yeSBhdHRyaWJ1dGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHRhc2tDb3VudCgpIGNvbnN0IDsKLQotICAvKioKLSAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgotICAgKgotICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzawotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KTsKLQotICAvKioKLSAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgotICAgKgotICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCi0gICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHRpbWVvdXQpOwotCi0gIC8qKgotICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCi0gICAqCi0gICAqIEB0aHJvd3MgTm9TdWNoVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBkb2Vzbid0IGV4aXN0LiBJdCB3YXMgZWl0aGVyCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYWxyZWFkeSBvciB0aGlzIGNhbGwgd2FzIG1hZGUgZm9yIGEKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhpcyB0aW1lcgotICAgKgotICAgKiBAdGhyb3dzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGlzIGFscmVhZHkgYmVpbmcKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBvciBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCByZW1vdmUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwotCi0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07Ci0KLSAgdmlydHVhbCBjb25zdCBTVEFURSBzdGF0ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIGNsYXNzIFRhc2s7Ci0gIGZyaWVuZCBjbGFzcyBUYXNrOwotICBzdGQ6Om11bHRpbWFwPGludDY0X3QsIGJvb3N0OjpzaGFyZWRfcHRyPFRhc2s+ID4gdGFza01hcF87Ci0gIHNpemVfdCB0YXNrQ291bnRfOwotICBNb25pdG9yIG1vbml0b3JfOwotICBTVEFURSBzdGF0ZV87Ci0gIGNsYXNzIERpc3BhdGNoZXI7Ci0gIGZyaWVuZCBjbGFzcyBEaXNwYXRjaGVyOwotICBib29zdDo6c2hhcmVkX3B0cjxEaXNwYXRjaGVyPiBkaXNwYXRjaGVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBkaXNwYXRjaGVyVGhyZWFkXzsKLSAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPGludDY0X3QsIGJvb3N0OjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMmE0NjAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZiAvLyBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi1jb25zdCBpbnQ2NF90IFV0aWw6OmN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYykgewotICBpbnQ2NF90IHJlc3VsdDsKLQotI2lmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKQotICBzdHJ1Y3QgdGltZXNwZWMgbm93OwotICBpbnQgcmV0ID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKLSNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgaW50IHJldCA9IGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgdG9UaWNrcyhyZXN1bHQsIG5vdywgdGlja3NQZXJTZWMpOwotI2Vsc2UKLSNlcnJvciAiTm8gaGlnaC1wcmVjaXNpb24gY2xvY2sgaXMgYXZhaWxhYmxlLiIKLSNlbmRpZiAvLyBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTIyMWQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfIDEKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyBiYXNpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgdGltZSBmb3JtYXRzLAotICogYW5kIG90aGVyIGNvbW1vbiBwbGF0Zm9ybS1kZXBlbmRlbnQgY29uY3VycmVuY3kgb3BlcmF0aW9ucy4KLSAqIEl0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gQVBJIGhlYWRlcnMgZm9yIG90aGVyIGNvbmN1cnJlbmN5IGxpYnJhcnkKLSAqIGhlYWRlcnMsIHNpbmNlIGl0IHdpbGwsIGJ5IGRlZmluaXRpb24sIHB1bGwgaW4gYWxsIHNvcnRzIG9mIGhvcnJpZAotICogcGxhdGZvcm0gZGVwZW5kZW50IHN0dWZmLiAgUmF0aGVyIGl0IHNob3VsZCBiZSBpbmx1ZGVkIGRpcmVjdGx5IGluCi0gKiBjb25jdXJyZW5jeSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHNvdXJjZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBVdGlsIHsKLQotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfUyA9IDEwMDAwMDAwMDBMTDsKLSAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX1MgPSAxMDAwMDAwTEw7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1TX1BFUl9TID0gMTAwMExMOwotCi0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9NUyA9IE5TX1BFUl9TIC8gTVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9VUyA9IE5TX1BFUl9TIC8gVVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9NUyA9IFVTX1BFUl9TIC8gTVNfUEVSX1M7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBpbnRvIGEgdGltZXNwZWMgc3RydWN0Ci0gICAqCi0gICAqIEBwYXJhbSBzdHJ1Y3QgdGltZXNwZWMmIHJlc3VsdAotICAgKiBAcGFyYW0gdGltZSBvciBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGltZXNwZWMoc3RydWN0IHRpbWVzcGVjJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl9uc2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogTlNfUEVSX01TOyAvLyBtcyB0byBucwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl91c2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogVVNfUEVSX01TOyAvLyBtcyB0byB1cwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGludDY0X3Qgc2VjcywgaW50NjRfdCBvbGRUaWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzUGVyU2VjLCBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7Ci0gICAgcmVzdWx0ID0gc2VjcyAqIG5ld1RpY2tzUGVyU2VjOwotICAgIHJlc3VsdCArPSBvbGRUaWNrcyAqIG5ld1RpY2tzUGVyU2VjIC8gb2xkVGlja3NQZXJTZWM7Ci0KLSAgICBpbnQ2NF90IG9sZFBlck5ldyA9IG9sZFRpY2tzUGVyU2VjIC8gbmV3VGlja3NQZXJTZWM7Ci0gICAgaWYgKG9sZFBlck5ldyAmJiAoKG9sZFRpY2tzICUgb2xkUGVyTmV3KSA+PSAob2xkUGVyTmV3IC8gMikpKSB7Ci0gICAgICArK3Jlc3VsdDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1lc3BlYyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKLSAgICovCi0gIHN0YXRpYyBjb25zdCB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aWNrc1BlclNlYykgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUudHZfc2VjLCB2YWx1ZS50dl9uc2VjLCBOU19QRVJfUywgdGlja3NQZXJTZWMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIGFyYml0cmFyeS1zaXplZCB0aWNrcyBzaW5jZSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfdXNlYywgVVNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgY29uc3Qgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgY29uc3Qgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gbWljcm9zZWNvbmRzCi0gICAqLwotICBzdGF0aWMgY29uc3Qgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IHRpbWUgYXMgYSBudW1iZXIgb2YgYXJiaXRyYXJ5LXNpemUgdGlja3MgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVUaWNrcyhpbnQ2NF90IHRpY2tzUGVyU2VjKTsKLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWxsaXNlY29uZHMgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWUoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKE1TX1BFUl9TKTsgfQotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIG1pY3JvcyBmcm9tIGVwb2NoCi0gICAqLwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZVVzZWMoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKFVTX1BFUl9TKTsgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGJiODguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIlRocmVhZEZhY3RvcnlUZXN0cy5oIgotI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCi0jaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotCi0gIHN0ZDo6c3RyaW5nIGFyZzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gIGFyZ3MoYXJnYyAtIDEgPiAxID8gYXJnYyAtIDEgOiAxKTsKLQotICBhcmdzWzBdID0gImFsbCI7Ci0KLSAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKLSAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7Ci0gIH0KLQotICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7Ci0KLSAgICBUaHJlYWRGYWN0b3J5VGVzdHMgdGhyZWFkRmFjdG9yeVRlc3RzOwotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRGYWN0b3J5IHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzaXplX3QgY291bnQgPSAgMTAwMDsKLSAgICBzaXplX3QgZmxvb2RMb29wcyA9ICAxOwotICAgIHNpemVfdCBmbG9vZENvdW50ID0gIDEwMDAwMDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5yZWFwTlRocmVhZHMoY291bnQpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgZmxvb2ROIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgZmxvb2RDb3VudCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLmZsb29kTlRlc3QoZmxvb2RMb29wcywgZmxvb2RDb3VudCkpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBzeW5jaHJvbm91cyBzdGFydCB0ZXN0IiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBtb25pdG9yIHRpbWVvdXQgdGVzdCIgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSk7Ci0gIH0KLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidXRpbCIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVXRpbCB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VXRpbCBtaW5pbXVtIHRpbWUiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICBpbnQ2NF90IHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdE1pbmltdW0gdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIHRpbWUwMSA9IHRpbWUwMDsKLSAgICBzaXplX3QgY291bnQgPSAwOwotCi0gICAgd2hpbGUgKHRpbWUwMSA8IHRpbWUwMCArIDEwKSB7Ci0gICAgICBjb3VudCsrOwotICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdHNjYWxsIHBlciBtczogIiA8PCBjb3VudCAvICh0aW1lMDEgLSB0aW1lMDApIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRpbWVyLW1hbmFnZXIiKSA9PSAwKSB7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlRpbWVyTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGltZXJNYW5hZ2VyIHRlc3QwMCIgPDwgc3RkOjplbmRsOwotCi0gICAgVGltZXJNYW5hZ2VyVGVzdHMgdGltZXJNYW5hZ2VyVGVzdHM7Ci0KLSAgICBhc3NlcnQodGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpOwotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICB7Ci0KLSAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwMDsKLQotICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDEwMDAwMDsKLQotICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7Ci0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQgPDwgIiB0YXNrIGNvdW50OiAiIDw8IHRhc2tDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKLQotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSk7Ci0KLSAgICB9Ci0gIH0KLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXItYmVuY2htYXJrIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRNYW5hZ2VyIGJlbmNobWFyayB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgewotCi0gICAgICBzaXplX3QgbWluV29ya2VyQ291bnQgPSAyOwotCi0gICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA1MTI7Ci0KLSAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMDA7Ci0KLSAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwotCi0gICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8IG1heFdvcmtlckNvdW50OyB3b3JrZXJDb3VudCo9IDIpIHsKLQotICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKLQotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKLQotICAgICAgICB0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Zjk4YTkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVXRpbC5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi0vKioKLSAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRocmVhZEZhY3RvcnlUZXN0cyB7Ci0KLXB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIEVSUk9SOwotCi0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSAgcHVibGljOgotCi0gICAgVGFzaygpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0SGVsbG8gV29ybGQiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH07Ci0KLSAgLyoqCi0gICAqIEhlbGxvIHdvcmxkIHRlc3QKLSAgICovCi0gIGJvb2wgaGVsbG9Xb3JsZFRlc3QoKSB7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBvc2l4VGhyZWFkRmFjdG9yeSgpOwotCi0gICAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxUYXNrPihuZXcgVGhyZWFkRmFjdG9yeVRlc3RzOjpUYXNrKCkpOwotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwotCi0gICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgdGhyZWFkLT5qb2luKCk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFwIE4gdGhyZWFkcwotICAgKi8KLSAgY2xhc3MgUmVhcE5UYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gICBwdWJsaWM6Ci0KLSAgICBSZWFwTlRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50JiBhY3RpdmVDb3VudCkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfY291bnQoYWN0aXZlQ291bnQpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX2NvdW50LS07Ci0KLSAgICAgIC8vc3RkOjpjb3V0IDw8ICJcdFx0XHR0aHJlYWQgY291bnQ6ICIgPDwgX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0gICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICAgIE1vbml0b3ImIF9tb25pdG9yOwotCi0gICAgaW50JiBfY291bnQ7Ci0gIH07Ci0KLSAgYm9vbCByZWFwTlRocmVhZHMoaW50IGxvb3A9MSwgaW50IGNvdW50PTEwKSB7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9ICBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIE1vbml0b3IqIG1vbml0b3IgPSBuZXcgTW9uaXRvcigpOwotCi0gICAgZm9yKGludCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewotCi0gICAgICBpbnQqIGFjdGl2ZUNvdW50ICA9IG5ldyBpbnQoY291bnQpOwotCi0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwotCi0gICAgICBpbnQgdGl4OwotCi0gICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsICphY3RpdmVDb3VudCkpKSk7Ci0gICAgICAgIH0gY2F0Y2goU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRpeCA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOyB0aXgrKywgKyt0aHJlYWQpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlICgqYWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgbW9uaXRvci0+d2FpdCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdHJlYXBlZCAiIDw8IGxpeCAqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOwotICAgIH0KLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY2xhc3MgU3luY2hTdGFydFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSAgIHB1YmxpYzoKLQotICAgIGVudW0gU1RBVEUgewotICAgICAgVU5JTklUSUFMSVpFRCwKLSAgICAgIFNUQVJUSU5HLAotICAgICAgU1RBUlRFRCwKLSAgICAgIFNUT1BQSU5HLAotICAgICAgU1RPUFBFRAotICAgIH07Ci0KLSAgICBTeW5jaFN0YXJ0VGFzayhNb25pdG9yJiBtb25pdG9yLCB2b2xhdGlsZSAgU1RBVEUmIHN0YXRlKSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9zdGF0ZShzdGF0ZSkge30KLQotICAgIHZvaWQgcnVuKCkgewotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIGlmIChfc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKSB7Ci0gICAgICAgICAgX3N0YXRlID0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQ7Ci0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlIChfc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKLSAgICAgICAgICBfbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORykgewotICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUEVEOwotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIE1vbml0b3ImIF9tb25pdG9yOwotICAgIHZvbGF0aWxlICBTVEFURSYgX3N0YXRlOwotICB9OwotCi0gIGJvb2wgc3luY2hTdGFydFRlc3QoKSB7Ci0KLSAgICBNb25pdG9yIG1vbml0b3I7Ci0KLSAgICBTeW5jaFN0YXJ0VGFzazo6U1RBVEUgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRDsKLQotICAgIHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+IHRhc2sgPSBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPihuZXcgU3luY2hTdGFydFRhc2sobW9uaXRvciwgc3RhdGUpKTsKLQotICAgIFBvc2l4VGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gIFBvc2l4VGhyZWFkRmFjdG9yeSgpOwotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwotCi0gICAgaWYgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpVTklOSVRJQUxJWkVEKSB7Ci0KLSAgICAgIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HOwotCi0gICAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0gICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydChzdGF0ZSAhPSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpOwotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KDEwMCk7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRCkgewotCi0gICAgICAgIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HOwotCi0gICAgICAgIG1vbml0b3Iubm90aWZ5KCk7Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKLSAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXNzZXJ0KHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVE9QUEVEKTsKLQotICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKiBTZWUgaG93IGFjY3VyYXRlIG1vbml0b3IgdGltZW91dCBpcy4gKi8KLQotICBib29sIG1vbml0b3JUaW1lb3V0VGVzdChzaXplX3QgY291bnQ9MTAwMCwgaW50NjRfdCB0aW1lb3V0PTEwKSB7Ci0KLSAgICBNb25pdG9yIG1vbml0b3I7Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb25pdG9yLndhaXQodGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBkb3VibGUgZXJyb3IgPSAoKGVuZFRpbWUgLSBzdGFydFRpbWUpIC0gKGNvdW50ICogdGltZW91dCkpIC8gKGRvdWJsZSkoY291bnQgKiB0aW1lb3V0KTsKLQotICAgIGlmIChlcnJvciA8IDAuMCkgIHsKLQotICAgICAgZXJyb3IgKj0gMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgVGhyZWFkRmFjdG9yeVRlc3RzOjpFUlJPUjsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCBjb3VudCAqIHRpbWVvdXQgPDwgIm1zIGVsYXBzZWQgdGltZTogIjw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiBzdWNjZXNzOwotICB9Ci0KLQotICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewotICBwdWJsaWM6Ci0KLSAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkKSA6X2lkKGlkKSB7fQotICAgIH5GbG9vZFRhc2soKXsKLSAgICAgIGlmKF9pZCAlIDEwMDAgPT0gMCkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBkb25lIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBydW4oKXsKLSAgICAgIGlmKF9pZCAlIDEwMDAgPT0gMCkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBzdGFydGVkIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHVzbGVlcCgxKTsKLSAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IF9pZDsKLSAgfTsKLQotICB2b2lkIGZvbyhQb3NpeFRocmVhZEZhY3RvcnkgKnRmKSB7Ci0gIH0KLQotICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3A9MSwgc2l6ZV90IGNvdW50PTEwMDAwMCkgewotCi0gICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgICBmb3Ioc2l6ZV90IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7Ci0KLSAgICAgIFBvc2l4VGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUG9zaXhUaHJlYWRGYWN0b3J5KCk7Ci0gICAgICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKHRydWUpOwotCi0gICAgICAgIGZvcihzaXplX3QgdGl4ID0gMDsgdGl4IDwgY291bnQ7IHRpeCsrKSB7Ci0KLSAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4ICkpOwotCi0gICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KLSAgICAgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgICAgICAgICAgdXNsZWVwKDEpOwotCi0gICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgewotCi0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmbG9vZGVkICIgPDwgKGxpeCArIDEpICogY291bnQgPDwgIiB0aHJlYWRzIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gIH0KLX07Ci0KLWNvbnN0IGRvdWJsZSBUaHJlYWRGYWN0b3J5VGVzdHM6OkVSUk9SID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6dGVzdAotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRNYW5hZ2VyVGVzdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5YTlhMi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVXRpbC5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLS8qKgotICogVGhyZWFkTWFuYWdlclRlc3RzIGNsYXNzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlclRlc3RzIHsKLQotcHVibGljOgotCi0gIHN0YXRpYyBjb25zdCBkb3VibGUgRVJST1I7Ci0KLSAgY2xhc3MgVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotICBwdWJsaWM6Ci0KLSAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgY291bnQsIGludDY0X3QgdGltZW91dCkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfY291bnQoY291bnQpLAotICAgICAgX3RpbWVvdXQodGltZW91dCksCi0gICAgICBfZG9uZShmYWxzZSkge30KLQotICAgIHZvaWQgcnVuKCkgewotCi0gICAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgX3NsZWVwLndhaXQoX3RpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9Y2F0Y2goLi4uKSB7Ci0gICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgX2RvbmUgPSB0cnVlOwotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIlRocmVhZCAiIDw8IF9jb3VudCA8PCAiIGNvbXBsZXRlZCAiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBfY291bnQtLTsKLQotICAgICAgICBpZiAoX2NvdW50ID09IDApIHsKLQotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgc2l6ZV90JiBfY291bnQ7Ci0gICAgaW50NjRfdCBfdGltZW91dDsKLSAgICBpbnQ2NF90IF9zdGFydFRpbWU7Ci0gICAgaW50NjRfdCBfZW5kVGltZTsKLSAgICBib29sIF9kb25lOwotICAgIE1vbml0b3IgX3NsZWVwOwotICB9OwotCi0gIC8qKgotICAgKiBEaXNwYXRjaCBjb3VudCB0YXNrcywgZWFjaCBvZiB3aGljaCBibG9ja3MgZm9yIHRpbWVvdXQgbWlsbGlzZWNvbmRzIHRoZW4KLSAgICogY29tcGxldGVzLiBWZXJpZnkgdGhhdCBhbGwgdGFza3MgY29tcGxldGVkIGFuZCB0aGF0IHRocmVhZCBtYW5hZ2VyIGNsZWFucwotICAgKiB1cCBwcm9wZXJseSBvbiBkZWxldGUuCi0gICAqLwotICBib29sIGxvYWRUZXN0KHNpemVfdCBjb3VudD0xMDAsIGludDY0X3QgdGltZW91dD0xMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50PTQpIHsKLQotICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IGNvdW50OwotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCi0gICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKLQotICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotCi0gICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID4gdGFza3M7Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKLQotICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKG1vbml0b3IsIGFjdGl2ZUNvdW50LCB0aW1lb3V0KSkpOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKLQotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQotICAgICAgd2hpbGUoYWN0aXZlQ291bnQgPiAwKSB7Ci0KLSAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgaW50NjRfdCBsYXN0VGltZSA9IDA7Ci0KLSAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOwotICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOyBpeCAhPSB0YXNrcy5lbmQoKTsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gdGFzayA9ICppeDsKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IHRhc2stPl9lbmRUaW1lIC0gdGFzay0+X3N0YXJ0VGltZTsKLQotICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7Ci0KLSAgICAgIGlmICh0YXNrLT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7Ci0gICAgICAgIGZpcnN0VGltZSA9IHRhc2stPl9zdGFydFRpbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YXNrLT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7Ci0gICAgICAgIGxhc3RUaW1lID0gdGFzay0+X2VuZFRpbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKLSAgICAgICAgbWluVGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7Ci0gICAgICAgIG1heFRpbWUgPSBkZWx0YTsKLSAgICAgIH0KLQotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKLSAgICB9Ci0KLSAgICBhdmVyYWdlVGltZSAvPSBjb3VudDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICJtcyBMYXN0IGVuZDogIiA8PCBsYXN0VGltZSA8PCAibXMgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lIDw8ICJtcyIgPDwgc3RkOjplbmRsOwotCi0gICAgZG91YmxlIGV4cGVjdGVkVGltZSA9ICgoY291bnQgKyAod29ya2VyQ291bnQgLSAxKSkgLyB3b3JrZXJDb3VudCkgKiB0aW1lb3V0OwotCi0gICAgZG91YmxlIGVycm9yID0gKCh0aW1lMDEgLSB0aW1lMDApIC0gZXhwZWN0ZWRUaW1lKSAvIGV4cGVjdGVkVGltZTsKLQotICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgIGVycm9yKj0gLTEuMDsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBlcnJvciA8IEVSUk9SOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGV4cGVjdGVkVGltZSA8PCAibXMgZWxhcHNlZCB0aW1lOiAiPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyBlcnJvciU6ICIgPDwgZXJyb3IgKiAxMDAuMCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotCi0gIGNsYXNzIEJsb2NrVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotICBwdWJsaWM6Ci0KLSAgICBCbG9ja1Rhc2soTW9uaXRvciYgbW9uaXRvciwgTW9uaXRvciYgYm1vbml0b3IsIHNpemVfdCYgY291bnQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2Jtb25pdG9yKGJtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCkge30KLQotICAgIHZvaWQgcnVuKCkgewotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfYm1vbml0b3IpOwotCi0gICAgICAgIF9ibW9uaXRvci53YWl0KCk7Ci0KLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIE1vbml0b3ImIF9tb25pdG9yOwotICAgIE1vbml0b3ImIF9ibW9uaXRvcjsKLSAgICBzaXplX3QmIF9jb3VudDsKLSAgfTsKLQotICAvKioKLSAgICogQmxvY2sgdGVzdC4gIENyZWF0ZSBwZW5kaW5nVGFza0NvdW50TWF4IHRhc2tzLiAgVmVyaWZ5IHRoYXQgd2UgYmxvY2sgYWRkaW5nIHRoZQotICAgKiBwZW5kaW5nVGFza0NvdW50TWF4ICsgMXRoIHRhc2suICBWZXJpZnkgdGhhdCB3ZSB1bmJsb2NrIHdoZW4gYSB0YXNrIGNvbXBsZXRlcyAqLwotCi0gIGJvb2wgYmxvY2tUZXN0KGludDY0X3QgdGltZW91dD0xMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50PTIpIHsKLQotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgdHJ5IHsKLQotICAgICAgTW9uaXRvciBibW9uaXRvcjsKLSAgICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrTWF4Q291bnQgPSB3b3JrZXJDb3VudDsKLQotICAgICAgc2l6ZV90IGFjdGl2ZUNvdW50c1tdID0ge3dvcmtlckNvdW50LCBwZW5kaW5nVGFza01heENvdW50LCAxfTsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7Ci0KLSAgICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzBdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzFdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzayhuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgLTEpOwotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1Y2Nlc3MgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJhZGQgdGltZWQgb3V0IHVuZXhwZWN0ZWRseSIgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0KLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgImFkZCBlbmNvdW50ZXJlZCB0b28gbWFueSBwZW5kaW5nIGV4ZXBjdGlvbnMiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdha2UgdXAgdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcgYmVmb3JlIGFuZCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlCi0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gV2FrZSB1cCB0aGUgZXh0cmEgdGFzayBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0KLQotICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiYgZSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gfQotfTsKLQotY29uc3QgZG91YmxlIFRocmVhZE1hbmFnZXJUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MDc0Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7Ci0KLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotICAgcHVibGljOgotCi0gICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBpbnQ2NF90IHRpbWVvdXQpIDoKLSAgICAgIF90aW1lb3V0KHRpbWVvdXQpLAotICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAotICAgICAgX2RvbmUoZmFsc2UpIHt9Ci0KLSAgICB+VGFzaygpIHsgc3RkOjpjZXJyIDw8IHRoaXMgPDwgc3RkOjplbmRsOyB9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLQotICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICAvLyBGaWd1cmUgb3V0IGVycm9yIHBlcmNlbnRhZ2UKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IF9lbmRUaW1lIC0gX3N0YXJ0VGltZTsKLQotCi0gICAgICBkZWx0YSA9IGRlbHRhID4gX3RpbWVvdXQgPyAgZGVsdGEgLSBfdGltZW91dCA6IF90aW1lb3V0IC0gZGVsdGE7Ci0KLSAgICAgIGZsb2F0IGVycm9yID0gZGVsdGEgLyBfdGltZW91dDsKLQotICAgICAgaWYoZXJyb3IgPCBFUlJPUikgewotICAgICAgICBfc3VjY2VzcyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRUaW1lck1hbmFnZXJUZXN0czo6VGFza1siIDw8IHRoaXMgPDwgIl0gZG9uZSIgPDwgc3RkOjplbmRsOyAvL2RlYnVnCi0KLSAgICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgX3RpbWVvdXQ7Ci0gICAgaW50NjRfdCBfc3RhcnRUaW1lOwotICAgIGludDY0X3QgX2VuZFRpbWU7Ci0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgYm9vbCBfc3VjY2VzczsKLSAgICBib29sIF9kb25lOwotICB9OwotCi0gIC8qKgotICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MgYW5kIHdhaXRzIGZvciB0aGUgZmlyc3QgdG8gZXhwaXJlIHdpdGhpbiAxMCUKLSAgICogb2YgdGhlIGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyCi0gICAqIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUKLSAgICogbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgotICAgKi8KLSAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0PTEwMDBMTCkgewotCi0gICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzayA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7Ci0KLSAgICB7Ci0KLSAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KLSAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpKTsKLQotICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7Ci0KLSAgICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOwotCi0gICAgICAvLyBEb24ndCBjcmVhdGUgdGFzayB5ZXQsIGJlY2F1c2UgaXRzIGNvbnN0cnVjdG9yIHNldHMgdGhlIGV4cGVjdGVkIGNvbXBsZXRpb24gdGltZSwgYW5kIHdlCi0gICAgICAvLyBuZWVkIHRvIGRlbGF5IGJldHdlZW4gaW5zZXJ0aW5nIHRoZSB0d28gdGFza3MgaW50byB0aGUgcnVuIHF1ZXVlLgotICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzazsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgLy8gV2FpdCBmb3IgMSBzZWNvbmQgaW4gb3JkZXIgdG8gZ2l2ZSB0aW1lck1hbmFnZXIgYSBjaGFuY2UgdG8gc3RhcnQgc2xlZXBpbmcgaW4gcmVzcG9uc2UKLSAgICAgICAgICAvLyB0byBhZGRpbmcgb3JwaGFuVGFzay4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBhZGRpbmcgdGhlIHNlY29uZCB0YXNrCi0gICAgICAgICAgLy8ga2lja3MgdGhlIGRpc3BhdGNoZXIgb3V0IG9mIHRoZSBjdXJyZW50IHdhaXQgYW5kIHN0YXJ0cyB0aGUgbmV3IDEgc2Vjb25kIHdhaXQuCi0gICAgICAgICAgX21vbml0b3Iud2FpdCAoMTAwMCk7Ci0gICAgICAgICAgYXNzZXJ0ICgwID09ICJFUlJPUjogVGhpcyB3YWl0IHNob3VsZCB0aW1lIG91dC4gVGltZXJNYW5hZ2VyIGRpc3BhdGNoZXIgbWF5IGhhdmUgYSBwcm9ibGVtLiIpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZXgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2sucmVzZXQgKG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOwotCi0gICAgICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGltZW91dCk7Ci0KLSAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgfQotCi0gICAgICBhc3NlcnQodGFzay0+X2RvbmUpOwotCi0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgLy8gdGltZXJNYW5hZ2VyLnN0b3AoKTsgVGhpcyBpcyB3aGVyZSBpdCBoYXBwZW5zIHZpYSBkZXN0cnVjdG9yCi0KLSAgICBhc3NlcnQoIW9ycGhhblRhc2stPl9kb25lKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIFRlc3RUYXNrOwotCi0gIE1vbml0b3IgX21vbml0b3I7Ci19OwotCi1jb25zdCBkb3VibGUgVGltZXJNYW5hZ2VyVGVzdHM6OkVSUk9SID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjE4NjEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBlZWtQcm9jZXNzb3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgewotCi1QZWVrUHJvY2Vzc29yOjpQZWVrUHJvY2Vzc29yKCkgewotICBtZW1vcnlCdWZmZXJfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICB0YXJnZXRUcmFuc3BvcnRfID0gbWVtb3J5QnVmZmVyXzsKLX0KLVBlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkge30KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewotICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOwotICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7Ci0gIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKLSAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7Ci19Ci0KLWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7Ci0gIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7Ci0gIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7Ci0gIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7Ci0gIH0gZWxzZSBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7Ci0gIH0KLQotICBpZiAoIW1lbW9yeUJ1ZmZlcl8pIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IG11c3QgYmUgYSBUTWVtb3J5QnVmZmVyIG9yIGEgVFBpcGVkVHJhbnNwb3J0IHdpdGggVE1lbW9yeUJ1ZmZlciIpOwotICB9Ci19Ci0KLWJvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0KSB7Ci0KLSAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gIFRNZXNzYWdlVHlwZSBtdHlwZTsKLSAgaW50MzJfdCBzZXFpZDsKLSAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7Ci0KLSAgaWYgKG10eXBlICE9IFRfQ0FMTCkgewotICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gIH0KLQotICAvLyBQZWVrIGF0IHRoZSBuYW1lCi0gIHBlZWtOYW1lKGZuYW1lKTsKLQotICBUVHlwZSBmdHlwZTsKLSAgaW50MTZfdCBmaWQ7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaW4tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBQZWVrIGF0IHRoZSB2YXJpYWJsZQotICAgIHBlZWsoaW4sIGZ0eXBlLCBmaWQpOwotICAgIGluLT5yZWFkRmllbGRFbmQoKTsKLSAgfQotICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0KLSAgLy8KLSAgLy8gQWxsIHRoZSBkYXRhIGlzIG5vdyBpbiBtZW1vcnlCdWZmZXJfIGFuZCByZWFkeSB0byBiZSBwcm9jZXNzZWQKLSAgLy8KLQotICAvLyBMZXQncyBmaXJzdCB0YWtlIGEgcGVlayBhdCB0aGUgZnVsbCBkYXRhIGluIG1lbW9yeQotICB1aW50OF90KiBidWZmZXI7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIG1lbW9yeUJ1ZmZlcl8tPmdldEJ1ZmZlcigmYnVmZmVyLCAmc2l6ZSk7Ci0gIHBlZWtCdWZmZXIoYnVmZmVyLCBzaXplKTsKLQotICAvLyBEb25lIHBlZWtpbmcgYXQgdmFyaWFibGVzCi0gIHBlZWtFbmQoKTsKLQotICBib29sIHJldCA9IGFjdHVhbFByb2Nlc3Nvcl8tPnByb2Nlc3MocGlwZWRQcm90b2NvbF8sIG91dCk7Ci0gIG1lbW9yeUJ1ZmZlcl8tPnJlc2V0QnVmZmVyKCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKSB7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUgZnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpIHsKLSAgaW4tPnNraXAoZnR5cGUpOwotfQotCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtFbmQoKSB7fQotCi19fX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdjMDE2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUEVFS1BST0NFU1NPUl9ICi0jZGVmaW5lIFBFRUtQUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvY2Vzc29yIHsKLQotLyoKLSAqIENsYXNzIGZvciBwZWVraW5nIGF0IHRoZSByYXcgZGF0YSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZCBieSBhbm90aGVyIHByb2Nlc3NvcgotICogYW5kIGdpdmVzIHRoZSBkZXJpdmVkIGNsYXNzIGEgY2hhbmNlIHRvIGNoYW5nZSBiZWhhdmlvciBhY2NvcmRpbmdseQotICoKLSAqLwotY2xhc3MgUGVla1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7Ci0KLSBwdWJsaWM6Ci0gIFBlZWtQcm9jZXNzb3IoKTsKLSAgdmlydHVhbCB+UGVla1Byb2Nlc3NvcigpOwotCi0gIC8vIElucHV0IGhlcmU6IGFjdHVhbFByb2Nlc3NvciAgLSB0aGUgdW5kZXJseWluZyBwcm9jZXNzb3IKLSAgLy8gICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5ICAtIHRoZSBwcm90b2NvbCBmYWN0b3J5IHVzZWQgdG8gd3JhcCB0aGUgbWVtb3J5IGJ1ZmZlcgotICAvLyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IC0gdGhpcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IGlzIHVzZWQgdG8gd3JhcCB0aGUgc291cmNlIHRyYW5zcG9ydAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGEgY2FsbCB0byBnZXRQaXBlZFRyYW5zcG9ydAotICB2b2lkIGluaXRpYWxpemUoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gZ2V0UGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gaW4pOwotCi0gIHZvaWQgc2V0VGFyZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCk7Ci0KLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KTsKLQotICAvLyBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBjYW4gYmUgb3ZlcmxvYWRlZCBieSBjaGlsZCBjbGFzc2VzIHRvCi0gIC8vIGFjaGlldmUgZGVzaXJlZCBwZWVraW5nIGJlaGF2aW9yCi0gIHZpcnR1YWwgdm9pZCBwZWVrTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUpOwotICB2aXJ0dWFsIHZvaWQgcGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpOwotICB2aXJ0dWFsIHZvaWQgcGVlayhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKTsKLSAgdmlydHVhbCB2b2lkIHBlZWtFbmQoKTsKLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwZWRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnRfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBiM2FkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTVEFUU1BST0NFU1NPUl9ICi0jZGVmaW5lIFNUQVRTUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgewotCi0vKgotICogQ2xhc3MgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZnVuY3Rpb24gY2FsbCBzdGF0aXN0aWNzIGFuZCBwcmludGluZyB0aGVtIGlmIGRlc2lyZWQKLSAqCi0gKi8KLWNsYXNzIFN0YXRzUHJvY2Vzc29yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yIHsKLXB1YmxpYzoKLSAgU3RhdHNQcm9jZXNzb3IoYm9vbCBwcmludCwgYm9vbCBmcmVxdWVuY3kpCi0gICAgOiBwcmludF8ocHJpbnQpLAotICAgICAgZnJlcXVlbmN5XyhmcmVxdWVuY3kpCi0gIHt9Ci0gIHZpcnR1YWwgflN0YXRzUHJvY2Vzc29yKCkge307Ci0KLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCkgewotCi0gICAgcGlwcm90XyA9IHBpcHJvdDsKLQotICAgIHN0ZDo6c3RyaW5nIGZuYW1lOwotICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwotICAgIGludDMyX3Qgc2VxaWQ7Ci0KLSAgICBwaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOwotICAgIGlmIChtdHlwZSAhPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCkgewotICAgICAgaWYgKHByaW50XykgewotICAgICAgICBwcmludGYoIlVua25vd24gbWVzc2FnZSB0eXBlXG4iKTsKLSAgICAgIH0KLSAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOwotICAgIH0KLSAgICBpZiAocHJpbnRfKSB7Ci0gICAgICBwcmludGYoIiVzICgiLCBmbmFtZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgaWYgKGZyZXF1ZW5jeV8pIHsKLSAgICAgIGlmIChmcmVxdWVuY3lfbWFwXy5maW5kKGZuYW1lKSAhPSBmcmVxdWVuY3lfbWFwXy5lbmQoKSkgewotICAgICAgICBmcmVxdWVuY3lfbWFwX1tmbmFtZV0rKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZXF1ZW5jeV9tYXBfW2ZuYW1lXSA9IDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKLSAgICBpbnQxNl90IGZpZDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBwaXByb3RfLT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKLSAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcmludF8pIHsKLSAgICAgIHByaW50ZigiXGJcYilcbiIpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiYgZ2V0X2ZyZXF1ZW5jeV9tYXAoKSB7Ci0gICAgcmV0dXJuIGZyZXF1ZW5jeV9tYXBfOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgdm9pZCBwcmludEFuZFBhc3NUb0J1ZmZlcihhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlKSB7Ci0gICAgc3dpdGNoIChmdHlwZSkgewotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTDoKLSAgICAgICAgewotICAgICAgICAgIGJvb2wgYm9vbHY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEJvb2woYm9vbHYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBib29sdik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURToKLSAgICAgICAgewotICAgICAgICAgIGludDhfdCBieXRldjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkQnl0ZShieXRldik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGJ5dGV2KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTY6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQxNl90IGkxNjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTE2KGkxNik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGkxNik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyOgotICAgICAgICB7Ci0gICAgICAgICAgaW50MzJfdCBpMzI7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEkzMihpMzIpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBpMzIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NDoKLSAgICAgICAgewotICAgICAgICAgIGludDY0X3QgaTY0OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJNjQoaTY0KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVsZCIsIGk2NCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFOgotICAgICAgICB7Ci0gICAgICAgICAgZG91YmxlIGR1YjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkRG91YmxlKGR1Yik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZiIsIGR1Yik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HOgotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJpbmcoc3RyKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzIiwgc3RyLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVDoKLSAgICAgICAgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgICAgaW50MTZfdCBmaWQ7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCI8Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICAgICAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGI+Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQOgotICAgICAgICB7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBrZXlUeXBlOwotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgdmFsVHlwZTsKLSAgICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoa2V5VHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiPT4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKHZhbFR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZE1hcEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJ9Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUOgotICAgICAgICB7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKLSAgICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTZXRFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxifSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJbIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYl0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+IGZyZXF1ZW5jeV9tYXBfOwotCi0gIGJvb2wgcHJpbnRfOwotICBib29sIGZyZXF1ZW5jeV87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ4MWM0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUQmFzZTY0VXRpbHMuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0KLXN0YXRpYyBjb25zdCB1aW50OF90ICprQmFzZTY0RW5jb2RlVGFibGUgPSAoY29uc3QgdWludDhfdCAqKQotICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci0KLXZvaWQgIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmKSB7Ci0gIGJ1ZlswXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPj4gMikgJiAweDNGXTsKLSAgaWYgKGxlbiA9PSAzKSB7Ci0gICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgKyAoaW5bMV0gPj4gNCkpICYgMHgzZl07Ci0gICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMV0gPDwgMikgKyAoaW5bMl0gPj4gNikpICYgMHgzZl07Ci0gICAgYnVmWzNdID0ga0Jhc2U2NEVuY29kZVRhYmxlW2luWzJdICYgMHgzZl07Ci0gIH0gZWxzZSBpZiAobGVuID09IDIpIHsKLSAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSArIChpblsxXSA+PiA0KSkgJiAweDNmXTsKLSAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzFdIDw8IDIpICYgMHgzZl07Ci0gIH0gZWxzZSAgeyAvLyBsZW4gPT0gMQotICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPDwgNCkgJiAweDNmXTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrQmFzZTY0RGVjb2RlVGFibGVbMjU2XSA9ewotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAotICA1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEsMTIsMTMsMTQsCi0gIDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAotICAtMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKLSAgNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLX07Ci0KLXZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90ICpidWYsIHVpbnQzMl90IGxlbikgewotICBidWZbMF0gPSAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlswXV0gPDwgMikgfAotICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPj4gNCk7Ci0gIGlmIChsZW4gPiAyKSB7Ci0gICAgYnVmWzFdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA8PCA0KSAmIDB4ZjApIHwKLSAgICAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dID4+IDIpOwotICAgIGlmIChsZW4gPiAzKSB7Ci0gICAgICBidWZbMl0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dIDw8IDYpICYgMHhjMCkgfAotICAgICAgICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzNdXSk7Ci0gICAgfQotICB9Ci19Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZjczMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8vIGluIG11c3QgYmUgYXQgbGVhc3QgbGVuIGJ5dGVzCi0vLyBsZW4gbXVzdCBiZSAxLCAyLCBvciAzCi0vLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBtYXkgbm90IG92ZXJsYXAgaW4KLS8vIHRoZSBkYXRhIGlzIG5vdCBwYWRkZWQgd2l0aCAnPSc7IHRoZSBjYWxsZXIgY2FuIGRvIHRoaXMgaWYgZGVzaXJlZAotdm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmJ1Zik7Ci0KLS8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIGNvbnRhaW4gYmFzZTY0IGVuY29kZWQgdmFsdWVzCi0vLyBidWYgd2lsbCBiZSBjaGFuZ2VkIHRvIGNvbnRhaW4gb3V0cHV0IGJ5dGVzCi0vLyBsZW4gaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWUgZnJvbSBpbnB1dCAobXVzdCBiZSAyLCAzLCBvciA0KQotLy8gbm8gJz0nIHBhZGRpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBpbnB1dAotdm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuKTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDgzOGIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUQmluYXJ5UHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIGlmIChzdHJpY3Rfd3JpdGVfKSB7Ci0gICAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMSkgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOwotICAgIHVpbnQzMl90IHdzaXplID0gMDsKLSAgICB3c2l6ZSArPSB3cml0ZUkzMih2ZXJzaW9uKTsKLSAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKLSAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7Ci0gICAgcmV0dXJuIHdzaXplOwotICB9IGVsc2UgewotICAgIHVpbnQzMl90IHdzaXplID0gMDsKLSAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCltZXNzYWdlVHlwZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVJMzIoc2VxaWQpOwotICAgIHJldHVybiB3c2l6ZTsKLSAgfQotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWZpZWxkVHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybgotICAgIHdyaXRlQnl0ZSgoaW50OF90KVRfU1RPUCk7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWtleVR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCl2YWxUeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCkgZWxlbVR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICB1aW50OF90IHRtcCA9ICB2YWx1ZSA/IDEgOiAwOwotICB0cmFuc18tPndyaXRlKCZ0bXAsIDEpOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJ5dGUsIDEpOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICBpbnQxNl90IG5ldCA9IChpbnQxNl90KWh0b25zKGkxNik7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDIpOwotICByZXR1cm4gMjsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKGkzMik7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDQpOwotICByZXR1cm4gNDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KWh0b25sbChpNjQpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA4KTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOwotICBiaXRzID0gaHRvbmxsKGJpdHMpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7Ci0gIHJldHVybiA4OwotfQotCi0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICBpZiAoc2l6ZSA+IDApIHsKLSAgICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKLSAgfQotICByZXR1cm4gcmVzdWx0ICsgc2l6ZTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdHJpbmcmIHN0cikgewotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOwotfQotCi0vKioKLSAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gKi8KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzejsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc3opOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB2ZXJzaW9uIG51bWJlcgotICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpZGVudGlmaWVyIik7Ci0gICAgfQotICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoc3ogJiAweDAwMDAwMGZmKTsKLSAgICByZXN1bHQgKz0gcmVhZFN0cmluZyhuYW1lKTsKLSAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHN0cmljdF9yZWFkXykgewotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJObyB2ZXJzaW9uIGlkZW50aWZpZXIuLi4gb2xkIHByb3RvY29sIGNsaWVudCBpbiBzdHJpY3QgbW9kZT8iKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSGFuZGxlIHByZS12ZXJzaW9uZWQgaW5wdXQKLSAgICAgIGludDhfdCB0eXBlOwotICAgICAgcmVzdWx0ICs9IHJlYWRTdHJpbmdCb2R5KG5hbWUsIHN6KTsKLSAgICAgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKLSAgICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSl0eXBlOwotICAgICAgcmVzdWx0ICs9IHJlYWRJMzIoc2VxaWQpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RyaW5nJiBuYW1lKSB7Ci0gIG5hbWUgPSAiIjsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDhfdCB0eXBlOwotICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7Ci0gIGZpZWxkVHlwZSA9IChUVHlwZSl0eXBlOwotICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgewotICAgIGZpZWxkSWQgPSAwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcmVzdWx0ICs9IHJlYWRJMTYoZmllbGRJZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGludDhfdCBrLCB2OwotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICBpbnQzMl90IHNpemVpOwotICByZXN1bHQgKz0gcmVhZEJ5dGUoayk7Ci0gIGtleVR5cGUgPSAoVFR5cGUpazsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKHYpOwotICB2YWxUeXBlID0gKFRUeXBlKXY7Ci0gIHJlc3VsdCArPSByZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3QgZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOwotICBlbGVtVHlwZSA9IChUVHlwZSllOwotICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3QgZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOwotICBlbGVtVHlwZSA9IChUVHlwZSllOwotICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZFNldEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgdWludDhfdCBiWzFdOwotICB0cmFuc18tPnJlYWRBbGwoYiwgMSk7Ci0gIHZhbHVlID0gKihpbnQ4X3QqKWIgIT0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIHVpbnQ4X3QgYlsxXTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDEpOwotICBieXRlID0gKihpbnQ4X3QqKWI7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gIHVpbnQ4X3QgYlsyXTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDIpOwotICBpMTYgPSAqKGludDE2X3QqKWI7Ci0gIGkxNiA9IChpbnQxNl90KW50b2hzKGkxNik7Ci0gIHJldHVybiAyOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIHVpbnQ4X3QgYls0XTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDQpOwotICBpMzIgPSAqKGludDMyX3QqKWI7Ci0gIGkzMiA9IChpbnQzMl90KW50b2hsKGkzMik7Ci0gIHJldHVybiA0OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIHVpbnQ4X3QgYls4XTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDgpOwotICBpNjQgPSAqKGludDY0X3QqKWI7Ci0gIGk2NCA9IChpbnQ2NF90KW50b2hsbChpNjQpOwotICByZXR1cm4gODsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwotCi0gIHVpbnQ2NF90IGJpdHM7Ci0gIHVpbnQ4X3QgYls4XTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDgpOwotICBiaXRzID0gKih1aW50NjRfdCopYjsKLSAgYml0cyA9IG50b2hsbChiaXRzKTsKLSAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4oYml0cyk7Ci0gIHJldHVybiA4OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0OwotICBpbnQzMl90IHNpemU7Ci0gIHJlc3VsdCA9IHJlYWRJMzIoc2l6ZSk7Ci0gIHJldHVybiByZXN1bHQgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZFN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTdHJpbmdCb2R5KHN0cmluZyYgc3RyLCBpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLQotICAvLyBDYXRjaCBlcnJvciBjYXNlcwotICBpZiAoc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfQotICBpZiAoc3RyaW5nX2xpbWl0XyA+IDAgJiYgc2l6ZSA+IHN0cmluZ19saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCi0gIGlmIChzaXplID09IDApIHsKLSAgICBzdHIgPSAiIjsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gVXNlIHRoZSBoZWFwIGhlcmUgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyBmb3Igdi4gbGFyZ2Ugc3RyaW5ncwotICBpZiAoc2l6ZSA+IHN0cmluZ19idWZfc2l6ZV8gfHwgc3RyaW5nX2J1Zl8gPT0gTlVMTCkgewotICAgIHZvaWQqIG5ld19zdHJpbmdfYnVmID0gc3RkOjpyZWFsbG9jKHN0cmluZ19idWZfLCAodWludDMyX3Qpc2l6ZSk7Ci0gICAgaWYgKG5ld19zdHJpbmdfYnVmID09IE5VTEwpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICJPdXQgb2YgbWVtb3J5IGluIFRCaW5hcnlQcm90b2NvbDo6cmVhZFN0cmluZyIpOwotICAgIH0KLSAgICBzdHJpbmdfYnVmXyA9ICh1aW50OF90KiluZXdfc3RyaW5nX2J1ZjsKLSAgICBzdHJpbmdfYnVmX3NpemVfID0gc2l6ZTsKLSAgfQotICB0cmFuc18tPnJlYWRBbGwoc3RyaW5nX2J1Zl8sIHNpemUpOwotICBzdHIgPSBzdHJpbmcoKGNoYXIqKXN0cmluZ19idWZfLCBzaXplKTsKLSAgcmV0dXJuICh1aW50MzJfdClzaXplOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQzZGU2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUUHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgYmluYXJ5IHByb3RvY29sIGZvciB0aHJpZnQuIFdyaXRlcyBhbGwgZGF0YSBpbiBhIHZlcnkgYmFzaWMKLSAqIGJpbmFyeSBmb3JtYXQsIGVzc2VudGlhbGx5IGp1c3Qgc3BpdHRpbmcgb3V0IHRoZSByYXcgYnl0ZXMuCi0gKgotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci0gIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgIGlzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sLgotCi0gcHVibGljOgotICBUQmluYXJ5UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIDoKLSAgICBUUHJvdG9jb2wodHJhbnMpLAotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSwKLSAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAotICAgIHN0cmljdF93cml0ZV8odHJ1ZSksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSB7fQotCi0gIFRCaW5hcnlQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLAotICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBUUHJvdG9jb2wodHJhbnMpLAotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCi0gICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSB7fQotCi0gIH5UQmluYXJ5UHJvdG9jb2woKSB7Ci0gICAgaWYgKHN0cmluZ19idWZfICE9IE5VTEwpIHsKLSAgICAgIHN0ZDo6ZnJlZShzdHJpbmdfYnVmXyk7Ci0gICAgICBzdHJpbmdfYnVmX3NpemVfID0gMDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewotICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwotICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOwotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IHJlYWRTdHJpbmdCb2R5KHN0ZDo6c3RyaW5nJiBzdHIsIGludDMyX3Qgc3opOwotCi0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOwotCi0gIC8vIEVuZm9yY2UgcHJlc2VuY2Ugb2YgdmVyc2lvbiBpZGVudGlmaWVyCi0gIGJvb2wgc3RyaWN0X3JlYWRfOwotICBib29sIHN0cmljdF93cml0ZV87Ci0KLSAgLy8gQnVmZmVyIGZvciByZWFkaW5nIHN0cmluZ3MsIHNhdmUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvdG9jb2wgdG8KLSAgLy8gYXZvaWQgbWVtb3J5IGNodXJuIGFsbG9jYXRpbmcgbWVtb3J5IG9uIGV2ZXJ5IHN0cmluZyByZWFkCi0gIHVpbnQ4X3QqIHN0cmluZ19idWZfOwotICBpbnQzMl90IHN0cmluZ19idWZfc2l6ZV87Ci0KLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBiaW5hcnkgcHJvdG9jb2wgaGFuZGxlcnMKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSA6Ci0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKDApLAotICAgIHN0cmljdF9yZWFkXyhmYWxzZSksCi0gICAgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQotCi0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0LCBib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCi0gICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KLQotICB2aXJ0dWFsIH5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkge30KLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewotICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwotICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xywgc3RyaWN0X3JlYWRfLCBzdHJpY3Rfd3JpdGVfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOwotICBib29sIHN0cmljdF9yZWFkXzsKLSAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTJlZTU0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRDb21wYWN0UHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotLyoKLSAqIFRDb21wYWN0UHJvdG9jb2w6OmkqVG9aaWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0Ci0gKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KLSAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgotICogSWYgYW55b25lIGVuY291bnRlcnMgdGhpcyBlcnJvciwgd2UgY2FuIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBiZXN0Ci0gKiB3YXkgdG8gaW1wbGVtZW50IGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb24gdGhlaXIgcGxhdGZvcm0uCi0gKi8KLSNpZiAhZGVmaW5lZChTSUdORURfUklHSFRfU0hJRlRfSVMpIHx8ICFkZWZpbmVkKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCi0jIGVycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKLSNlbmRpZgotI2lmIFNJR05FRF9SSUdIVF9TSElGVF9JUyAhPSBBUklUSE1FVElDX1JJR0hUX1NISUZUCi0jIGVycm9yICJUQ29tcGFjdFByb3RvY29sIGN1cnJlbmx5IG9ubHkgd29ya3MgaWYgYSBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCi0jZWxzZQotI2RlZmluZSBVTkxJS0VMWSh2YWwpICh2YWwpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi1jb25zdCBpbnQ4X3QgVENvbXBhY3RQcm90b2NvbDo6VFR5cGVUb0NUeXBlWzE2XSA9IHsKLSAgICBDVF9TVE9QLCAvLyBUX1NUT1AKLSAgICAwLCAvLyB1bnVzZWQKLSAgICBDVF9CT09MRUFOX1RSVUUsIC8vIFRfQk9PTAotICAgIENUX0JZVEUsIC8vIFRfQllURQotICAgIENUX0RPVUJMRSwgLy8gVF9ET1VCTEUKLSAgICAwLCAvLyB1bnVzZWQKLSAgICBDVF9JMTYsIC8vIFRfSTE2Ci0gICAgMCwgLy8gdW51c2VkCi0gICAgQ1RfSTMyLCAvLyBUX0kzMgotICAgIDAsIC8vIHVudXNlZAotICAgIENUX0k2NCwgLy8gVF9JNjQKLSAgICBDVF9CSU5BUlksIC8vIFRfU1RSSU5HCi0gICAgQ1RfU1RSVUNULCAvLyBUX1NUUlVDVAotICAgIENUX01BUCwgLy8gVF9NQVAKLSAgICBDVF9TRVQsIC8vIFRfU0VUCi0gICAgQ1RfTElTVCwgLy8gVF9MSVNUCi0gIH07Ci0KLQotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spIHwgKCgoaW50MzJfdCltZXNzYWdlVHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKLSAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzZXFpZCk7Ci0gIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKDwgMTUpLAotICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQotICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICBpZiAoZmllbGRUeXBlID09IFRfQk9PTCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IG5hbWU7Ci0gICAgYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUgPSBmaWVsZFR5cGU7Ci0gICAgYm9vbGVhbkZpZWxkXy5maWVsZElkID0gZmllbGRJZDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkLCAtMSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuIHdyaXRlQnl0ZShUX1NUT1ApOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQotICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gKiBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwotICBsYXN0RmllbGRJZF8gPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCi0gKiBvZiB0aGUgZmllbGQgc3RhY2suCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnRvcCgpOwotICBsYXN0RmllbGRfLnBvcCgpOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIExpc3QgaGVhZGVyLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHNldCBoZWFkZXIuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQotICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIGlmIChzaXplID09IDApIHsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKHZhbFR5cGUpKTsKLSAgfQotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCi0gKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQotICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgotICogT3RoZXJ3aXNlLCB3cml0ZSBhIHNpbmdsZSBieXRlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgaWYgKGJvb2xlYW5GaWVsZF8ubmFtZSAhPSBOVUxMKSB7Ci0gICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0Ci0gICAgd3NpemUgKz0gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpOwotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUodmFsdWUgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKTsKLSAgfQotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7Ci0gIHJldHVybiAxOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkxNikpOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkzMikpOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIHJldHVybiB3cml0ZVZhcmludDY0KGk2NFRvWmlnemFnKGk2NCkpOwotfQotCi0vKioKLSAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b2xlbGwoYml0cyk7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKLSAgcmV0dXJuIDg7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZWRpbmcuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHdyaXRlQmluYXJ5KHN0cik7Ci19Ci0KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc3NpemUgPSBzdHIuc2l6ZSgpOwotICB1aW50MzJfdCB3c2l6ZSA9IHdyaXRlVmFyaW50MzIoc3NpemUpICsgc3NpemU7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vLwotLy8gSW50ZXJuYWwgV3JpdGluZyBtZXRob2RzCi0vLwotCi0vKioKLSAqIFRoZSB3b3JraG9yc2Ugb2Ygd3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCi0gKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQotICogYm9vbGVhbiBmaWVsZCBjYXNlLgotICovCi1pbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbkludGVybmFsKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgdHlwZU92ZXJyaWRlKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCi0gIGludDhfdCB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyBnZXRDb21wYWN0VHlwZShmaWVsZFR5cGUpIDogdHlwZU92ZXJyaWRlKTsKLQotICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKLSAgaWYgKGZpZWxkSWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkgewotICAgIC8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGZpZWxkSWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQotICAgIHdzaXplICs9IHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7Ci0gIH0KLQotICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgotICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQ4X3QgZWxlbVR5cGUsIGludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIGlmIChzaXplIDw9IDE0KSB7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKHNpemUgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOwotICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlVmFyaW50MzIodWludDMyX3QgbikgewotICB1aW50OF90IGJ1Zls1XTsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICBuID4+PSA3OwotICAgIH0KLSAgfQotICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlVmFyaW50NjQodWludDY0X3QgbikgewotICB1aW50OF90IGJ1ZlsxMF07Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKLSAgICAgIG4gPj49IDc7Ci0gICAgfQotICB9Ci0gIHRyYW5zXy0+d3JpdGUoYnVmLCB3c2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gKi8KLXVpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2w6Omk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCkgewotICByZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2Myk7Ci19Ci0KLS8qKgotICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OmkzMlRvWmlnemFnKGNvbnN0IGludDMyX3QgbikgewotICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7Ci19Ci0KLS8qKgotICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlIHZhbHVlCi0gKi8KLWludDhfdCBUQ29tcGFjdFByb3RvY29sOjpnZXRDb21wYWN0VHlwZShpbnQ4X3QgdHR5cGUpIHsKLSAgcmV0dXJuIFRUeXBlVG9DVHlwZVt0dHlwZV07Ci19Ci0KLS8vCi0vLyBSZWFkaW5nIE1ldGhvZHMKLS8vCi0KLS8qKgotICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICB1aW50MzJfdCByc2l6ZSA9IDA7Ci0gIGludDhfdCBwcm90b2NvbElkOwotICBpbnQ4X3QgdmVyc2lvbkFuZFR5cGU7Ci0gIGludDhfdCB2ZXJzaW9uOwotCi0gIHJzaXplICs9IHJlYWRCeXRlKHByb3RvY29sSWQpOwotICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIGlkZW50aWZpZXIiKTsKLSAgfQotCi0gIHJzaXplICs9IHJlYWRCeXRlKHZlcnNpb25BbmRUeXBlKTsKLSAgdmVyc2lvbiA9IChpbnQ4X3QpKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKLSAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiIpOwotICB9Ci0KLSAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7Ci0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihzZXFpZCk7Ci0gIHJzaXplICs9IHJlYWRTdHJpbmcobmFtZSk7Ci0KLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgotICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9uIHRoZSBmaWVsZCBzdGFjay4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gIG5hbWUgPSAiIjsKLSAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7Ci0gIGxhc3RGaWVsZElkXyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCi0gKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy50b3AoKTsKLSAgbGFzdEZpZWxkXy5wb3AoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQ4X3QgYnl0ZTsKLSAgaW50OF90IHR5cGU7Ci0KLSAgcnNpemUgKz0gcmVhZEJ5dGUoYnl0ZSk7Ci0gIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOwotCi0gIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KLSAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgZmllbGRUeXBlID0gVF9TVE9QOwotICAgIGZpZWxkSWQgPSAwOwotICAgIHJldHVybiByc2l6ZTsKLSAgfQotCi0gIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KLSAgaW50MTZfdCBtb2RpZmllciA9IChpbnQxNl90KSgoKHVpbnQ4X3QpYnl0ZSAmIDB4ZjApID4+IDQpOwotICBpZiAobW9kaWZpZXIgPT0gMCkgewotICAgIC8vIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KLSAgICByc2l6ZSArPSByZWFkSTE2KGZpZWxkSWQpOwotICB9IGVsc2UgewotICAgIGZpZWxkSWQgPSAoaW50MTZfdCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOwotICB9Ci0gIGZpZWxkVHlwZSA9IGdldFRUeXBlKHR5cGUpOwotCi0gIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCi0gIGlmICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUX0JPT0xFQU5fRkFMU0UpIHsKLSAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KLSAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IHRydWU7Ci0gICAgYm9vbFZhbHVlXy5ib29sVmFsdWUgPSAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOwotICB9Ci0KLSAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCi0gIGxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7Ci0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgcmVhZGluZyB0aGUga2V5Ci0gKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQotICogImNvcnJlY3QiIHR5cGVzLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQ4X3Qga3ZUeXBlID0gMDsKLSAgaW50MzJfdCBtc2l6ZSA9IDA7Ci0KLSAgcnNpemUgKz0gcmVhZFZhcmludDMyKG1zaXplKTsKLSAgaWYgKG1zaXplICE9IDApCi0gICAgcnNpemUgKz0gcmVhZEJ5dGUoa3ZUeXBlKTsKLQotICBpZiAobXNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBtc2l6ZSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIGtleVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KSgodWludDhfdClrdlR5cGUgPj4gNCkpOwotICB2YWxUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlICYgMHhmKSk7Ci0gIHNpemUgPSAodWludDMyX3QpbXNpemU7Ci0KLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gKiB0cnVlIHNpemUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3Qgc2l6ZV9hbmRfdHlwZTsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQzMl90IGxzaXplOwotCi0gIHJzaXplICs9IHJlYWRCeXRlKHNpemVfYW5kX3R5cGUpOwotCi0gIGxzaXplID0gKCh1aW50OF90KXNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOwotICBpZiAobHNpemUgPT0gMTUpIHsKLSAgICByc2l6ZSArPSByZWFkVmFyaW50MzIobHNpemUpOwotICB9Ci0KLSAgaWYgKGxzaXplIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbHNpemUgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICBlbGVtVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKHNpemVfYW5kX3R5cGUgJiAweDBmKSk7Ci0gIHNpemUgPSAodWludDMyX3QpbHNpemU7Ci0KLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCi0gKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gKiB0cnVlIHNpemUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgcmV0dXJuIHJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotfQotCi0vKioKLSAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIHJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCi0gKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIHJlYWQgYSBieXRlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICBpZiAoYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPT0gdHJ1ZSkgewotICAgIHZhbHVlID0gYm9vbFZhbHVlXy5ib29sVmFsdWU7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICBpbnQ4X3QgdmFsOwotICAgIHJlYWRCeXRlKHZhbCk7Ci0gICAgdmFsdWUgPSAodmFsID09IENUX0JPT0xFQU5fVFJVRSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICB1aW50OF90IGJbMV07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCAxKTsKLSAgYnl0ZSA9ICooaW50OF90KiliOwotICByZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOwotICBpMTYgPSAoaW50MTZfdCl6aWd6YWdUb0kzMih2YWx1ZSk7Ci0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOwotICBpMzIgPSB6aWd6YWdUb0kzMih2YWx1ZSk7Ci0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50NjQodmFsdWUpOwotICBpNjQgPSB6aWd6YWdUb0k2NCh2YWx1ZSk7Ci0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1aW50NjRfdCBiaXRzOwotICB1aW50OF90IGJbOF07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCA4KTsKLSAgYml0cyA9ICoodWludDY0X3QqKWI7Ci0gIGJpdHMgPSBsZXRvaGxsKGJpdHMpOwotICBkdWIgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPihiaXRzKTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gcmVhZEJpbmFyeShzdHIpOwotfQotCi0vKioKLSAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGludDMyX3QgcnNpemUgPSAwOwotICBpbnQzMl90IHNpemU7Ci0KLSAgcnNpemUgKz0gcmVhZFZhcmludDMyKHNpemUpOwotICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgc3RyID0gIiI7Ci0gICAgcmV0dXJuIHJzaXplOwotICB9Ci0KLSAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0KLSAgaWYgKHN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICAvLyBVc2UgdGhlIGhlYXAgaGVyZSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IGZvciB2LiBsYXJnZSBzdHJpbmdzCi0gIGlmIChzaXplID4gc3RyaW5nX2J1Zl9zaXplXyB8fCBzdHJpbmdfYnVmXyA9PSBOVUxMKSB7Ci0gICAgdm9pZCogbmV3X3N0cmluZ19idWYgPSBzdGQ6OnJlYWxsb2Moc3RyaW5nX2J1Zl8sICh1aW50MzJfdClzaXplKTsKLSAgICBpZiAobmV3X3N0cmluZ19idWYgPT0gTlVMTCkgewotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIk91dCBvZiBtZW1vcnkgaW4gVENvbXBhY3RQcm90b2NvbDo6cmVhZFN0cmluZyIpOwotICAgIH0KLSAgICBzdHJpbmdfYnVmXyA9ICh1aW50OF90KiluZXdfc3RyaW5nX2J1ZjsKLSAgICBzdHJpbmdfYnVmX3NpemVfID0gc2l6ZTsKLSAgfQotICB0cmFuc18tPnJlYWRBbGwoc3RyaW5nX2J1Zl8sIHNpemUpOwotICBzdHIuYXNzaWduKChjaGFyKilzdHJpbmdfYnVmXywgc2l6ZSk7Ci0KLSAgcmV0dXJuIHJzaXplICsgKHVpbnQzMl90KXNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpIHsKLSAgaW50NjRfdCB2YWw7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbCk7Ci0gIGkzMiA9IChpbnQzMl90KXZhbDsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKLSAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRWYXJpbnQ2NChpbnQ2NF90JiBpNjQpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICB1aW50NjRfdCB2YWwgPSAwOwotICBpbnQgc2hpZnQgPSAwOwotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOwotICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKLQotICAvLyBGYXN0IHBhdGguCi0gIGlmIChib3Jyb3dlZCAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJvcnJvd2VkW3JzaXplXTsKLSAgICAgIHJzaXplKys7Ci0gICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0gICAgICBzaGlmdCArPSA3OwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIGk2NCA9IHZhbDsKLSAgICAgICAgdHJhbnNfLT5jb25zdW1lKHJzaXplKTsKLSAgICAgICAgcmV0dXJuIHJzaXplOwotICAgICAgfQotICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgotICAgICAgaWYgKFVOTElLRUxZKHJzaXplID09IHNpemVvZihidWYpKSkgewotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gU2xvdyBwYXRoLgotICBlbHNlIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdWludDhfdCBieXRlOwotICAgICAgcnNpemUgKz0gdHJhbnNfLT5yZWFkQWxsKCZieXRlLCAxKTsKLSAgICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgaTY0ID0gdmFsOwotICAgICAgICByZXR1cm4gcnNpemU7Ci0gICAgICB9Ci0gICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCi0gICAgICBpZiAoVU5MSUtFTFkocnNpemUgPj0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gKi8KLWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6emlnemFnVG9JMzIodWludDMyX3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAqLwotaW50NjRfdCBUQ29tcGFjdFByb3RvY29sOjp6aWd6YWdUb0k2NCh1aW50NjRfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOwotfQotCi1UVHlwZSBUQ29tcGFjdFByb3RvY29sOjpnZXRUVHlwZShpbnQ4X3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICAgIHJldHVybiBUX1NUT1A7Ci0gICAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgotICAgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgotICAgICAgcmV0dXJuIFRfQk9PTDsKLSAgICBjYXNlIENUX0JZVEU6Ci0gICAgICByZXR1cm4gVF9CWVRFOwotICAgIGNhc2UgQ1RfSTE2OgotICAgICAgcmV0dXJuIFRfSTE2OwotICAgIGNhc2UgQ1RfSTMyOgotICAgICAgcmV0dXJuIFRfSTMyOwotICAgIGNhc2UgQ1RfSTY0OgotICAgICAgcmV0dXJuIFRfSTY0OwotICAgIGNhc2UgQ1RfRE9VQkxFOgotICAgICAgcmV0dXJuIFRfRE9VQkxFOwotICAgIGNhc2UgQ1RfQklOQVJZOgotICAgICAgcmV0dXJuIFRfU1RSSU5HOwotICAgIGNhc2UgQ1RfTElTVDoKLSAgICAgIHJldHVybiBUX0xJU1Q7Ci0gICAgY2FzZSBDVF9TRVQ6Ci0gICAgICByZXR1cm4gVF9TRVQ7Ci0gICAgY2FzZSBDVF9NQVA6Ci0gICAgICByZXR1cm4gVF9NQVA7Ci0gICAgY2FzZSBDVF9TVFJVQ1Q6Ci0gICAgICByZXR1cm4gVF9TVFJVQ1Q7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImRvbid0IGtub3cgd2hhdCB0eXBlOiAiICsgdHlwZSk7Ci0gIH0KLSAgcmV0dXJuIFRfU1RPUDsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk0MGEyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUUHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8qKgotICogQysrIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wYWN0IFByb3RvY29sIGFzIGRlc2NyaWJlZCBpbiBUSFJJRlQtMTEwCi0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgUFJPVE9DT0xfSUQgPSAweDgyOwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX04gPSAxOwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKLQotICAvKioKLSAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCi0gICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAqLwotICBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICAgVFR5cGUgZmllbGRUeXBlOwotICAgIGludDE2X3QgZmllbGRJZDsKLSAgfSBib29sZWFuRmllbGRfOwotCi0gIC8qKgotICAgKiAoUmVhZGluZykgSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlCi0gICAqIHRoZSBib29sZWFuIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgotICAgKi8KLSAgc3RydWN0IHsKLSAgICBib29sIGhhc0Jvb2xWYWx1ZTsKLSAgICBib29sIGJvb2xWYWx1ZTsKLSAgfSBib29sVmFsdWVfOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAotICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgotICAgKi8KLQotICBzdGQ6OnN0YWNrPGludDE2X3Q+IGxhc3RGaWVsZF87Ci0gIGludDE2X3QgbGFzdEZpZWxkSWRfOwotCi0gIGVudW0gVHlwZXMgewotICAgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKLSAgICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCi0gICAgQ1RfQk9PTEVBTl9GQUxTRSAgPSAweDAyLAotICAgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKLSAgICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCi0gICAgQ1RfSTMyICAgICAgICAgICAgPSAweDA1LAotICAgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKLSAgICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCi0gICAgQ1RfQklOQVJZICAgICAgICAgPSAweDA4LAotICAgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKLSAgICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCi0gICAgQ1RfTUFQICAgICAgICAgICAgPSAweDBCLAotICAgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQywKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgaW50OF90IFRUeXBlVG9DVHlwZVsxNl07Ci0KLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIDoKLSAgICBUUHJvdG9jb2wodHJhbnMpLAotICAgIGxhc3RGaWVsZElkXygwKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSB7Ci0gICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKLSAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOwotICB9Ci0KLSAgVENvbXBhY3RQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgOgotICAgIFRQcm90b2NvbCh0cmFucyksCi0gICAgbGFzdEZpZWxkSWRfKDApLAotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSB7Ci0gICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKLSAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOwotICB9Ci0KLSAgflRDb21wYWN0UHJvdG9jb2woKSB7Ci0gICAgZnJlZShzdHJpbmdfYnVmXyk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoqCi0gICogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlZAotICAqIG91dHB1dCBvciBwdXJwb3NlCi0gICovCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KLQotIHByb3RlY3RlZDoKLSAgaW50MzJfdCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR5cGVPdmVycmlkZSk7Ci0gIHVpbnQzMl90IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGludDhfdCBlbGVtVHlwZSwgaW50MzJfdCBzaXplKTsKLSAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKTsKLSAgdWludDMyX3Qgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKTsKLSAgdWludDY0X3QgaTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKTsKLSAgdWludDMyX3QgaTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKTsKLSAgaW5saW5lIGludDhfdCBnZXRDb21wYWN0VHlwZShpbnQ4X3QgdHR5cGUpOwotCi0gcHVibGljOgotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKLQotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOwotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoKLSAgICpUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCi0gICAqIGVuY29kaW5nLgotICAgKi8KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7IHJldHVybiAwOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IHJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpOwotICB1aW50MzJfdCByZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KTsKLSAgaW50MzJfdCB6aWd6YWdUb0kzMih1aW50MzJfdCBuKTsKLSAgaW50NjRfdCB6aWd6YWdUb0k2NCh1aW50NjRfdCBuKTsKLSAgVFR5cGUgZ2V0VFR5cGUoaW50OF90IHR5cGUpOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIHVpbnQ4X3QqIHN0cmluZ19idWZfOwotICBpbnQzMl90IHN0cmluZ19idWZfc2l6ZV87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBjb21wYWN0IHByb3RvY29sIGhhbmRsZXJzCi0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSA6Ci0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKDApIHt9Ci0KLSAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0KSA6Ci0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSB7fQotCi0gIHZpcnR1YWwgflRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkge30KLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwotICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYWEzNmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlREZWJ1Z1Byb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi0KLXN0YXRpYyBzdHJpbmcgYnl0ZV90b19oZXgoY29uc3QgdWludDhfdCBieXRlKSB7Ci0gIGNoYXIgYnVmWzNdOwotICBpbnQgcmV0ID0gc3RkOjpzcHJpbnRmKGJ1ZiwgIiUwMngiLCAoaW50KWJ5dGUpOwotICBhc3NlcnQocmV0ID09IDIpOwotICBhc3NlcnQoYnVmWzJdID09ICdcMCcpOwotICByZXR1cm4gYnVmOwotfQotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotc3RyaW5nIFREZWJ1Z1Byb3RvY29sOjpmaWVsZFR5cGVOYW1lKFRUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUX1NUT1AgICA6IHJldHVybiAic3RvcCIgICA7Ci0gICAgY2FzZSBUX1ZPSUQgICA6IHJldHVybiAidm9pZCIgICA7Ci0gICAgY2FzZSBUX0JPT0wgICA6IHJldHVybiAiYm9vbCIgICA7Ci0gICAgY2FzZSBUX0JZVEUgICA6IHJldHVybiAiYnl0ZSIgICA7Ci0gICAgY2FzZSBUX0kxNiAgICA6IHJldHVybiAiaTE2IiAgICA7Ci0gICAgY2FzZSBUX0kzMiAgICA6IHJldHVybiAiaTMyIiAgICA7Ci0gICAgY2FzZSBUX1U2NCAgICA6IHJldHVybiAidTY0IiAgICA7Ci0gICAgY2FzZSBUX0k2NCAgICA6IHJldHVybiAiaTY0IiAgICA7Ci0gICAgY2FzZSBUX0RPVUJMRSA6IHJldHVybiAiZG91YmxlIiA7Ci0gICAgY2FzZSBUX1NUUklORyA6IHJldHVybiAic3RyaW5nIiA7Ci0gICAgY2FzZSBUX1NUUlVDVCA6IHJldHVybiAic3RydWN0IiA7Ci0gICAgY2FzZSBUX01BUCAgICA6IHJldHVybiAibWFwIiAgICA7Ci0gICAgY2FzZSBUX1NFVCAgICA6IHJldHVybiAic2V0IiAgICA7Ci0gICAgY2FzZSBUX0xJU1QgICA6IHJldHVybiAibGlzdCIgICA7Ci0gICAgY2FzZSBUX1VURjggICA6IHJldHVybiAidXRmOCIgICA7Ci0gICAgY2FzZSBUX1VURjE2ICA6IHJldHVybiAidXRmMTYiICA7Ci0gICAgZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsKLSAgfQotfQotCi12b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnRVcCgpIHsKLSAgaW5kZW50X3N0cl8gKz0gc3RyaW5nKGluZGVudF9pbmMsICcgJyk7Ci19Ci0KLXZvaWQgVERlYnVnUHJvdG9jb2w6OmluZGVudERvd24oKSB7Ci0gIGlmIChpbmRlbnRfc3RyXy5sZW5ndGgoKSA8IChzdHJpbmc6OnNpemVfdHlwZSlpbmRlbnRfaW5jKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgfQotICBpbmRlbnRfc3RyXy5lcmFzZShpbmRlbnRfc3RyXy5sZW5ndGgoKSAtIGluZGVudF9pbmMpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVQbGFpbihjb25zdCBzdHJpbmcmIHN0cikgewotICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdHIubGVuZ3RoKCkpOwotICByZXR1cm4gc3RyLmxlbmd0aCgpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJbmRlbnRlZChjb25zdCBzdHJpbmcmIHN0cikgewotICB0cmFuc18tPndyaXRlKCh1aW50OF90KilpbmRlbnRfc3RyXy5kYXRhKCksIGluZGVudF9zdHJfLmxlbmd0aCgpKTsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RyLmxlbmd0aCgpKTsKLSAgcmV0dXJuIGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6c3RhcnRJdGVtKCkgewotICB1aW50MzJfdCBzaXplOwotCi0gIHN3aXRjaCAod3JpdGVfc3RhdGVfLmJhY2soKSkgewotICAgIGNhc2UgVU5JTklUOgotICAgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgotICAgICAgLy90aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgLy9yZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTVFJVQ1Q6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIFNFVDoKLSAgICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKLSAgICBjYXNlIE1BUF9LRVk6Ci0gICAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7Ci0gICAgY2FzZSBNQVBfVkFMVUU6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiIC0+ICIpOwotICAgIGNhc2UgTElTVDoKLSAgICAgIHNpemUgPSB3cml0ZUluZGVudGVkKAotICAgICAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7Ci0gICAgICBsaXN0X2lkeF8uYmFjaygpKys7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOwotICB9Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjplbmRJdGVtKCkgewotICAvL3VpbnQzMl90IHNpemU7Ci0KLSAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7Ci0gICAgY2FzZSBVTklOSVQ6Ci0gICAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCi0gICAgICAvL3Rocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAvL3JldHVybiB3cml0ZUluZGVudGVkKHN0cik7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBjYXNlIFNFVDoKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBjYXNlIE1BUF9LRVk6Ci0gICAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX1ZBTFVFOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBNQVBfVkFMVUU6Ci0gICAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX0tFWTsKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBjYXNlIExJU1Q6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKLSAgfQotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIHNpemUgKz0gd3JpdGVQbGFpbihzdHIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICBzdHJpbmcgbXR5cGU7Ci0gIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKLSAgICBjYXNlIFRfQ0FMTCAgICAgIDogbXR5cGUgPSAiY2FsbCIgIDsgYnJlYWs7Ci0gICAgY2FzZSBUX1JFUExZICAgICA6IG10eXBlID0gInJlcGx5IiA7IGJyZWFrOwotICAgIGNhc2UgVF9FWENFUFRJT04gOiBtdHlwZSA9ICJleG4iICAgOyBicmVhazsKLSAgfQotCi0gIHVpbnQzMl90IHNpemUgPSB3cml0ZUluZGVudGVkKCIoIiArIG10eXBlICsgIikgIiArIG5hbWUgKyAiKCIpOwotICBpbmRlbnRVcCgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiKVxuIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIHNpemUgKz0gd3JpdGVQbGFpbihzdHJpbmcobmFtZSkgKyAiIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNUUlVDVCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOwotICBzdHJpbmcgaWRfc3RyID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGZpZWxkSWQpOwotICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKLQotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgKLSAgICAgIGlkX3N0ciArICI6ICIgKwotICAgICAgbmFtZSArICIgKCIgKwotICAgICAgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIGFzc2VydCh3cml0ZV9zdGF0ZV8uYmFjaygpID09IFNUUlVDVCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiAwOwotICAgIC8vd3JpdGVJbmRlbnRlZCgiKioqU1RPUCoqKlxuIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IG1hcHM/Ci0gIHVpbnQzMl90IGJzaXplID0gMDsKLSAgYnNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIGJzaXplICs9IHdyaXRlUGxhaW4oCi0gICAgICAibWFwPCIgKyBmaWVsZFR5cGVOYW1lKGtleVR5cGUpICsgIiwiICsgZmllbGRUeXBlTmFtZSh2YWxUeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7Ci0gIGluZGVudFVwKCk7Ci0gIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTUFQX0tFWSk7Ci0gIHJldHVybiBic2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBhcnJheXMuCi0gIHVpbnQzMl90IGJzaXplID0gMDsKLSAgYnNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIGJzaXplICs9IHdyaXRlUGxhaW4oCi0gICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKExJU1QpOwotICBsaXN0X2lkeF8ucHVzaF9iYWNrKDApOwotICByZXR1cm4gYnNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIGxpc3RfaWR4Xy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgc2V0cy4KLSAgdWludDMyX3QgYnNpemUgPSAwOwotICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgYnNpemUgKz0gd3JpdGVQbGFpbigKLSAgICAgICJzZXQ8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKLSAgaW5kZW50VXAoKTsKLSAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTRVQpOwotICByZXR1cm4gYnNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gd3JpdGVJdGVtKHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbSgiMHgiICsgYnl0ZV90b19oZXgoYnl0ZSkpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTE2KSk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMzIpKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGk2NCkpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihkdWIpKTsKLX0KLQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgLy8gWFhYIFJhdy9VVEYtOD8KLQotICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKLSAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgewotICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOwotICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc3RyLmxlbmd0aCgpKSArICIpIjsKLSAgfQotCi0gIHN0cmluZyBvdXRwdXQgPSAiXCIiOwotCi0gIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHRvX3Nob3cuYmVnaW4oKTsgaXQgIT0gdG9fc2hvdy5lbmQoKTsgKytpdCkgewotICAgIGlmICgqaXQgPT0gJ1xcJykgewotICAgICAgb3V0cHV0ICs9ICJcXFxcIjsKLSAgICB9IGVsc2UgaWYgKCppdCA9PSAnIicpIHsKLSAgICAgIG91dHB1dCArPSAiXFxcIiI7Ci0gICAgfSBlbHNlIGlmIChzdGQ6OmlzcHJpbnQoKml0KSkgewotICAgICAgb3V0cHV0ICs9ICppdDsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICgqaXQpIHsKLSAgICAgICAgY2FzZSAnXGEnOiBvdXRwdXQgKz0gIlxcYSI7IGJyZWFrOwotICAgICAgICBjYXNlICdcYic6IG91dHB1dCArPSAiXFxiIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xmJzogb3V0cHV0ICs9ICJcXGYiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOiBvdXRwdXQgKz0gIlxcbiI7IGJyZWFrOwotICAgICAgICBjYXNlICdccic6IG91dHB1dCArPSAiXFxyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x0Jzogb3V0cHV0ICs9ICJcXHQiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHYnOiBvdXRwdXQgKz0gIlxcdiI7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIG91dHB1dCArPSAiXFx4IjsKLSAgICAgICAgICBvdXRwdXQgKz0gYnl0ZV90b19oZXgoKml0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBvdXRwdXQgKz0gJ1wiJzsKLSAgcmV0dXJuIHdyaXRlSXRlbShvdXRwdXQpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgLy8gWFhYIEhleD8KLSAgcmV0dXJuIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2OWUwYy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0jaW5jbHVkZSAiVE9uZVdheVByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKgotCi0hISEgRVhQRVJJTUVOVEFMIENPREUgISEhCi0KLVRoaXMgcHJvdG9jb2wgaXMgdmVyeSBtdWNoIGEgd29yayBpbiBwcm9ncmVzcy4KLUl0IGRvZXNuJ3QgaGFuZGxlIG1hbnkgY2FzZXMgcHJvcGVybHkuCi1JdCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBtYW55IGNhc2VzLgotSXQgcHJvYmFibHkgc2VnZmF1bHRzIGluIG1hbnkgY2FzZXMuCi1CdWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0cyBhcmUgd2VsY29tZS4KLUNvbXBsYWludHMgYXJlIG5vdC4gOlIKLQotKi8KLQotCi0vKioKLSAqIFByb3RvY29sIHRoYXQgcHJpbnRzIHRoZSBwYXlsb2FkIGluIGEgbmljZSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCi0gKiBSZWFkaW5nIGZyb20gdGhpcyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkLgotICoKLSAqLwotY2xhc3MgVERlYnVnUHJvdG9jb2wgOiBwdWJsaWMgVFdyaXRlT25seVByb3RvY29sIHsKLSBwcml2YXRlOgotICBlbnVtIHdyaXRlX3N0YXRlX3QKLSAgeyBVTklOSVQKLSAgLCBTVFJVQ1QKLSAgLCBMSVNUCi0gICwgU0VUCi0gICwgTUFQX0tFWQotICAsIE1BUF9WQUxVRQotICB9OwotCi0gcHVibGljOgotICBURGVidWdQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKLSAgICA6IFRXcml0ZU9ubHlQcm90b2NvbCh0cmFucywgIlREZWJ1Z1Byb3RvY29sIikKLSAgICAsIHN0cmluZ19saW1pdF8oREVGQVVMVF9TVFJJTkdfTElNSVQpCi0gICAgLCBzdHJpbmdfcHJlZml4X3NpemVfKERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFKQotICB7Ci0gICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhVTklOSVQpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfTElNSVQgPSAyNTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFID0gMTY7Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRTdHJpbmdQcmVmaXhTaXplKGludDMyX3Qgc3RyaW5nX3ByZWZpeF9zaXplKSB7Ci0gICAgc3RyaW5nX3ByZWZpeF9zaXplXyA9IHN0cmluZ19wcmVmaXhfc2l6ZTsKLSAgfQotCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSBwcml2YXRlOgotICB2b2lkIGluZGVudFVwKCk7Ci0gIHZvaWQgaW5kZW50RG93bigpOwotICB1aW50MzJfdCB3cml0ZVBsYWluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICB1aW50MzJfdCB3cml0ZUluZGVudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICB1aW50MzJfdCBzdGFydEl0ZW0oKTsKLSAgdWludDMyX3QgZW5kSXRlbSgpOwotICB1aW50MzJfdCB3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSk7Ci0KLSAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwotICBpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZV87Ci0KLSAgc3RkOjpzdHJpbmcgaW5kZW50X3N0cl87Ci0gIHN0YXRpYyBjb25zdCBpbnQgaW5kZW50X2luYyA9IDI7Ci0KLSAgc3RkOjp2ZWN0b3I8d3JpdGVfc3RhdGVfdD4gd3JpdGVfc3RhdGVfOwotICBzdGQ6OnZlY3RvcjxpbnQ+IGxpc3RfaWR4XzsKLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBkZWJ1ZyBwcm90b2NvbCBoYW5kbGVycwotICovCi1jbGFzcyBURGVidWdQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKLSAgfQotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLQotLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIChwYXJ0IG9mKSBUaHJpZnREZWJ1Z1N0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+Ci1zdGQ6OnN0cmluZyBUaHJpZnREZWJ1Z1N0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKLSAgVERlYnVnUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOwotCi0gIHRzLndyaXRlKCZwcm90b2NvbCk7Ci0KLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBzaXplOwotICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwotfQotCi0vLyBUT0RPKGRyZWlzcyk6IFRoaXMgaXMgYmFkbHkgYnJva2VuLiAgRG9uJ3QgdXNlIGl0IHVubGVzcyB5b3UgYXJlIG1lLgotI2lmIDAKLXRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdD4KLXN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4mIHZlYykgewotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7Ci0gIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICAvLyBJIGFtIGdyb3NzIQotICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKCJTb21lUmFuZG9tVmVjdG9yIik7Ci0KLSAgLy8gVE9ETzogRml4IHRoaXMgd2l0aCBhIHRyYWl0LgotICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbigoVFR5cGUpOTksIHZlYy5zaXplKCkpOwotICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxPYmplY3Q+Ojpjb25zdF9pdGVyYXRvciBpdDsKLSAgZm9yIChpdCA9IHZlYy5iZWdpbigpOyBpdCAhPSB2ZWMuZW5kKCk7ICsraXQpIHsKLSAgICBpdC0+d3JpdGUoJnByb3RvY29sKTsKLSAgfQotICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKLQotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Ci19Ci0jZW5kaWYgLy8gMAotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KLQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YTNkMWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLQotSU1QTEVNRU5UQVRJT04gREVUQUlMUwotCi1URGVuc2VQcm90b2NvbCB3YXMgZGVzaWduZWQgdG8gaGF2ZSBhIHNtYWxsZXIgc2VyaWFsaXplZCBmb3JtIHRoYW4KLVRCaW5hcnlQcm90b2NvbC4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHVzaW5nIHR3byB0ZWNobmlxdWVzLiAgVGhlIGZpcnN0IGlzCi12YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZy4gIFdlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWUgdGhhdCB0aGUgU3RhbmRhcmQKLU1JREkgRmlsZSBmb3JtYXQgdXNlcyBmb3IgInZhcmlhYmxlLWxlbmd0aCBxdWFudGl0aWVzIgotKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFyaWFibGUtbGVuZ3RoX3F1YW50aXR5KS4KLUFsbCBpbnRlZ2VycyAoaW5jbHVkaW5nIGkxNiwgYnV0IG5vdCBieXRlKSBhcmUgZmlyc3QgY2FzdCB0byB1aW50NjRfdCwKLXRoZW4gd3JpdHRlbiBvdXQgYXMgdmFyaWFibGUtbGVuZ3RoIHF1YW50aXRpZXMuICBUaGlzIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZQotZWZmZWN0IHRoYXQgYWxsIG5lZ2F0aXZlIG51bWJlcnMgcmVxdWlyZSAxMCBieXRlcywgYnV0IG5lZ2F0aXZlIG51bWJlcnMgdGVuZAotdG8gYmUgZmFyIGxlc3MgY29tbW9uIHRoYW4gcG9zaXRpdmUgb25lcy4KLQotVGhlIHNlY29uZCB0ZWNobmlxdWUgZWxpbWluYXRpbmcgdGhlIGZpZWxkIGlkcyB1c2VkIGJ5IFRCaW5hcnlQcm90b2NvbC4gIFRoaXMKLWRlY2lzaW9uIHJlcXVpcmVkIHN1cHBvcnQgZnJvbSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBhbHNvIHNhY3JpZmljZXMgc29tZSBvZgotdGhlIGJhY2t3YXJkIGFuZCBmb3J3YXJkIGNvbXBhdGliaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sLgotCi1XZSBjb25zaWRlcmVkIGltcGxlbWVudGluZyB0aGlzIHRlY2huaXF1ZSBieSBnZW5lcmF0aW5nIHNlcGFyYXRlIHJlYWRlcnMgYW5kCi13cml0ZXJzIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wgKHRoaXMgaXMgaG93IFBpbGxhciwgVGhyaWZ0J3MgcHJlZGVjZXNzb3IsCi13b3JrZWQpLCBidXQgdGhpcyBpZGVhIGhhZCBhIGZldyBwcm9ibGVtczoKLS0gT3VyIGFic3RyYWN0aW9ucyBnbyBvdXQgdGhlIHdpbmRvdy4KLS0gV2Ugd291bGQgaGF2ZSB0byBtYWludGFpbiBhIHNlY29uZCBjb2RlIGdlbmVyYXRvci4KLS0gUHJlc2VydmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVzIHdvdWxkIGJlIGEKLSAgbmlnaHRtYXJlLgotCi1UaGVyZWZvcmUsIHdlIGNob3NlIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN0b3JlZCB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZSBkYXRhIG5laXRoZXIgaW4gdGhlIGRhdGEgaXRzZWxmIChsaWtlIFRCaW5hcnlQcm90b2NvbCkgbm9yIGluIHRoZQotc2VyaWFsaXphdGlvbiBjb2RlIChsaWtlIFBpbGxhciksIGJ1dCBpbnN0ZWFkIGluIGEgc2VwYXJhdGUgZGF0YSBzdHJ1Y3R1cmUsCi1jYWxsZWQgYSBUeXBlU3BlYy4gIFR5cGVTcGVjcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKLShzcGVjaWZpY2FsbHkgaW4gdGhlIHRfY3BwX2dlbmVyYXRvciksIGFuZCB0aGVpciBzdHJ1Y3R1cmUgc2hvdWxkIGJlCi1kb2N1bWVudGVkIHRoZXJlIChUT0RPKGRyZWlzcyk6IHMvc2hvdWxkIGJlL2lzLykuCi0KLVdlIG1haW50YWluIGEgc3RhY2sgb2YgVHlwZVNwZWNzIHdpdGhpbiB0aGUgcHJvdG9jb2wgc28gaXQga25vd3Mgd2hlcmUgdGhlCi1nZW5lcmF0ZWQgY29kZSBpcyBpbiB0aGUgcmVhZGluZy93cml0aW5nIHByb2Nlc3MuICBGb3IgZXhhbXBsZSwgaWYgd2UgYXJlCi13cml0aW5nIGFuIGkzMiBjb250YWluZWQgaW4gYSBzdHJ1Y3QgYmFyLCBjb250YWluZWQgaW4gYSBzdHJ1Y3QgZm9vLCB0aGVuIHRoZQotc3RhY2sgd291bGQgbG9vayBsaWtlOiBUT1AgLCBpMzIgLCBzdHJ1Y3QgYmFyICwgc3RydWN0IGZvbyAsIEJPVFRPTS4KLVRoZSBmb2xsb3dpbmcgaW52YXJpYW50OiB3aGVuZXZlciB3ZSBhcmUgYWJvdXQgdG8gcmVhZC93cml0ZSBhbiBvYmplY3QKLShzdHJ1Y3RCZWdpbiwgY29udGFpbmVyQmVnaW4sIG9yIGEgc2NhbGFyKSwgdGhlIFR5cGVTcGVjIG9uIHRoZSB0b3Agb2YgdGhlCi1zdGFjayBtdXN0IG1hdGNoIHRoZSB0eXBlIGJlaW5nIHJlYWQvd3JpdHRlbi4gIFRoZSBtYWluIHJlYXNvbnMgdGhhdCB0aGlzCi1pbnZhcmlhbnQgbXVzdCBiZSBtYWludGFpbmVkIGlzIHRoYXQgaWYgd2UgZXZlciBzdGFydCByZWFkaW5nIGEgc3RydWN0dXJlLCB3ZQotbXVzdCBoYXZlIGl0cyBleGFjdCBUeXBlU3BlYyBpbiBvcmRlciB0byBwYXNzIHRoZSByaWdodCB0YWdzIHRvIHRoZQotZGVzZXJpYWxpemVyLgotCi1XZSB1c2UgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGZvciBtYWludGFpbmluZyB0aGlzIGludmFyaWFudDoKLQotLSBGb3Igc3RydWN0dXJlcywgd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIG9mIGluZGV4ZXMsIG9uZSBmb3IgZWFjaCBzdHJ1Y3R1cmUKLSAgb24gdGhlIFR5cGVTcGVjIHN0YWNrLiAgVGhlc2UgYXJlIGluZGV4ZXMgaW50byB0aGUgbGlzdCBvZiBmaWVsZHMgaW4gdGhlCi0gIHN0cnVjdHVyZSdzIFR5cGVTcGVjLiAgV2hlbiB3ZSB7cmVhZCx3cml0ZX1GaWVsZEJlZ2luLCB3ZSBwdXNoIG9uIHRoZQotICBUeXBlU3BlYyBmb3IgdGhlIGZpZWxkLgotLSBXaGVuIHdlIGJlZ2luIHdyaXRpbmcgYSBsaXN0IG9yIHNldCwgd2UgcHVzaCBvbiB0aGUgVHlwZVNwZWMgZm9yIHRoZQotICBlbGVtZW50IHR5cGUuCi0tIEZvciBtYXBzLCB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgb2YgYm9vbGVhbnMsIG9uZSBmb3IgZWFjaCBtYXAgb24gdGhlCi0gIFR5cGVTcGVjIHN0YWNrLiAgVGhlIGJvb2xlYW4gaXMgdHJ1ZSBpZiB3ZSBhcmUgd3JpdGluZyB0aGUga2V5IGZvciB0aGF0Ci0gIG1hcCwgYW5kIGZhbHNlIGlmIHdlIGFyZSB3cml0aW5nIHRoZSB2YWx1ZS4gIE1hcHMgYXJlIHRoZSB0cmlja2llc3QgY2FzZQotICBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjYWxsIGFueSBwcm90b2NvbCBtZXRob2QgYmV0d2VlbgotICB0aGUga2V5IGFuZCB0aGUgdmFsdWUuICBBcyBhIHJlc3VsdCwgd2UgcG90ZW50aWFsbHkgaGF2ZSB0byBzd2l0Y2gKLSAgYmV0d2VlbiBtYXAga2V5IHN0YXRlIGFuZCBtYXAgdmFsdWUgc3RhdGUgYWZ0ZXIgcmVhZGluZy93cml0aW5nIGFueSBvYmplY3QuCi0tIFRoaXMgam9iIGlzIGhhbmRsZWQgYnkgdGhlIHN0YXRlVHJhbnNpdGlvbiBtZXRob2QuICBJdCBpcyBjYWxsZWQgYWZ0ZXIKLSAgcmVhZGluZy93cml0aW5nIGV2ZXJ5IG9iamVjdC4gIEl0IHBvcHMgdGhlIGN1cnJlbnQgVHlwZVNwZWMgb2ZmIHRoZSBzdGFjaywKLSAgdGhlbiBvcHRpb25hbGx5IHB1c2hlcyBhIG5ldyBvbmUgb24sIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBuZXh0IFR5cGVTcGVjIGlzLgotICBJZiBpdCBpcyBhIHN0cnVjdCwgdGhlIGpvYiBpcyBsZWZ0IHRvIHRoZSBuZXh0IHdyaXRlRmllbGRCZWdpbi4gIElmIGl0IGlzIGEKLSAgc2V0IG9yIGxpc3QsIHRoZSBqdXN0LXBvcHBlZCB0eXBlc3BlYyBpcyBwdXNoZWQgYmFjayBvbi4gIElmIGl0IGlzIGEgbWFwLAotICB0aGUgdG9wIG9mIHRoZSBrZXkvdmFsdWUgc3RhY2sgaXMgdG9nZ2xlZCwgYW5kIHRoZSBhcHByb3ByaWF0ZSBUeXBlU3BlYwotICBpcyBwdXNoZWQuCi0KLU9wdGlvbmFsIGZpZWxkcyBhcmUgYSBsaXR0bGUgdHJpY2t5IGFsc28uICBXZSB3cml0ZSBhIHplcm8gYnl0ZSBpZiB0aGV5IGFyZQotYWJzZW50IGFuZCBwcmVmaXggdGhlbSB3aXRoIGFuIDB4MDEgYnl0ZSBpZiB0aGV5IGFyZSBwcmVzZW50Ci0qLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJURGVuc2VQcm90b2NvbC5oIgotI2luY2x1ZGUgIlRSZWZsZWN0aW9uTG9jYWwuaCIKLQotLy8gTGVhdmluZyB0aGlzIG9uIGZvciBub3cuICBEaXNhYmxpbmcgaXQgd2lsbCB0dXJuIG9mZiBhc3NlcnRzLCB3aGljaCBzaG91bGQKLS8vIGdpdmUgYSBwZXJmb3JtYW5jZSBib29zdC4gIFdoZW4gd2UgaGF2ZSAqcmVhbGx5KiB0aG9yb3VnaCB0ZXN0IGNhc2VzLAotLy8gd2Ugc2hvdWxkIGRyb3AgdGhpcy4KLSNkZWZpbmUgREVCVUdfVERFTlNFUFJPVE9DT0wKLQotLy8gTk9URTogQXNzZXJ0aW9ucyBzaG91bGQgKm9ubHkqIGJlIHVzZWQgdG8gZGV0ZWN0IGJ1Z3MgaW4gY29kZSwKLS8vICAgICAgIGVpdGhlciBpbiBURGVuc2VQcm90b2NvbCBpdHNlbGYsIG9yIGluIGNvZGUgdXNpbmcgaXQuCi0vLyAgICAgICAoRm9yIGV4YW1wbGUsIHVzaW5nIHRoZSB3cm9uZyBUeXBlU3BlYy4pCi0vLyAgICAgICBJbnZhbGlkIGRhdGEgc2hvdWxkIE5FVkVSIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlLAotLy8gICAgICAgbm8gbWF0dGVyIGhvdyBncm9zc2x5IGNvcnJ1cHRlZCwgbm9yIGhvdyBpbmdlbmlvdXNseSBjcmFmdGVkLgotI2lmZGVmIERFQlVHX1RERU5TRVBST1RPQ09MCi0jdW5kZWYgTkRFQlVHCi0jZWxzZQotI2RlZmluZSBOREVCVUcKLSNlbmRpZgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCi0jZWxzZQotI2RlZmluZSBVTkxJS0VMWSh2YWwpICh2YWwpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi1jb25zdCBpbnQgVERlbnNlUHJvdG9jb2w6OkZQX1BSRUZJWF9MRU4gPQotICBhcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZQX1BSRUZJWF9MRU47Ci0KLS8vIFRvcCBUeXBlU3BlYy4gIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgZW5jb2RlZC4KLSNkZWZpbmUgVFRTICAodHNfc3RhY2tfLmJhY2soKSkgIC8vIHR5cGUgPSBUeXBlU3BlYyoKLS8vIEluRGVYLiAgSW5kZXggaW50byBUVFMgb2YgdGhlIGN1cnJlbnQvbmV4dCBmaWVsZCB0byBlbmNvZGUuCi0jZGVmaW5lIElEWCAoaWR4X3N0YWNrXy5iYWNrKCkpICAvLyB0eXBlID0gaW50Ci0vLyBGaWVsZCBUeXBlU3BlYy4gIFR5cGVTcGVjIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBGVFMgKFRUUy0+dHN0cnVjdC5zcGVjc1tJRFhdKSAgLy8gdHlwZSA9IFR5cGVTcGVjKgotLy8gRmllbGQgTWVUYS4gIE1ldGFkYXRhIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBGTVQgKFRUUy0+dHN0cnVjdC5tZXRhc1tJRFhdKSAgLy8gdHlwZSA9IEZpZWxkTWV0YQotLy8gU3ViVHlwZSAxLzIuICBUeXBlU3BlYyBvZiB0aGUgZmlyc3Qvc2Vjb25kIHN1YnR5cGUgb2YgdGhpcyBjb250YWluZXIuCi0jZGVmaW5lIFNUMSAoVFRTLT50Y29udGFpbmVyLnN1YnR5cGUxKQotI2RlZmluZSBTVDIgKFRUUy0+dGNvbnRhaW5lci5zdWJ0eXBlMikKLQotCi0vKioKLSAqIENoZWNrcyB0aGF0IEBjIHR0eXBlIGlzIGluZGVlZCB0aGUgdHR5cGUgdGhhdCB3ZSBzaG91bGQgYmUgd3JpdGluZywKLSAqIGFjY29yZGluZyB0byBvdXIgdHlwZXNwZWMuICBBYm9ydHMgaWYgdGhlIHRlc3QgZmFpbHMgYW5kIGRlYnVnZ2luZyBpbiBvbi4KLSAqLwotaW5saW5lIHZvaWQgVERlbnNlUHJvdG9jb2w6OmNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpIHsKLSAgYXNzZXJ0KCF0c19zdGFja18uZW1wdHkoKSk7Ci0gIGFzc2VydChUVFMtPnR0eXBlID09IHR0eXBlKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBzdXJlIHRoYXQgdGhlIFR5cGVTcGVjIHN0YWNrIGlzIGNvcnJlY3QgZm9yIHRoZSBuZXh0IG9iamVjdC4KLSAqIFNlZSB0b3Atb2YtZmlsZSBjb21tZW50cy4KLSAqLwotaW5saW5lIHZvaWQgVERlbnNlUHJvdG9jb2w6OnN0YXRlVHJhbnNpdGlvbigpIHsKLSAgVHlwZVNwZWMqIG9sZF90dHMgPSB0c19zdGFja18uYmFjaygpOwotICB0c19zdGFja18ucG9wX2JhY2soKTsKLQotICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHRvcC1sZXZlbCB3cml0ZSwgd2Ugc2hvdWxkIGhhdmUganVzdCBwb3BwZWQKLSAgLy8gdGhlIFR5cGVTcGVjIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChvbGRfdHRzID0gdHlwZV9zcGVjXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChUVFMtPnR0eXBlKSB7Ci0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgYXNzZXJ0KG9sZF90dHMgPT0gRlRTKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xJU1Q6Ci0gICAgY2FzZSBUX1NFVDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IFNUMSk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKG9sZF90dHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTUFQOgotICAgICAgYXNzZXJ0KG9sZF90dHMgPT0gKG1rdl9zdGFja18uYmFjaygpID8gU1QxIDogU1QyKSk7Ci0gICAgICBta3Zfc3RhY2tfLmJhY2soKSA9ICFta3Zfc3RhY2tfLmJhY2soKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sobWt2X3N0YWNrXy5iYWNrKCkgPyBTVDEgOiBTVDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KCEiSW52YWxpZCBUVHlwZSBpbiBzdGF0ZVRyYW5zaXRpb24uIik7Ci0gICAgICBicmVhazsKLQotICB9Ci19Ci0KLQotLyoKLSAqIFZhcmlhYmxlLWxlbmd0aCBxdWFudGl0eSBmdW5jdGlvbnMuCi0gKi8KLQotaW5saW5lIHVpbnQzMl90IFREZW5zZVByb3RvY29sOjp2bHFSZWFkKHVpbnQ2NF90JiB2bHEpIHsKLSAgdWludDMyX3QgdXNlZCA9IDA7Ci0gIHVpbnQ2NF90IHZhbCA9IDA7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCi0gIHVpbnQzMl90IGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkID0gdHJhbnNfLT5ib3Jyb3coYnVmLCAmYnVmX3NpemUpOwotCi0gIC8vIEZhc3QgcGF0aC4gIFRPRE8oZHJlaXNzKTogTWFrZSBpdCBmYXN0ZXIuCi0gIGlmIChib3Jyb3dlZCAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJvcnJvd2VkW3VzZWRdOwotICAgICAgdXNlZCsrOwotICAgICAgdmFsID0gKHZhbCA8PCA3KSB8IChieXRlICYgMHg3Zik7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgdmxxID0gdmFsOwotICAgICAgICB0cmFuc18tPmNvbnN1bWUodXNlZCk7Ci0gICAgICAgIHJldHVybiB1c2VkOwotICAgICAgfQotICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgotICAgICAgaWYgKFVOTElLRUxZKHVzZWQgPT0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFNsb3cgcGF0aC4KLSAgZWxzZSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZTsKLSAgICAgIHVzZWQgKz0gdHJhbnNfLT5yZWFkQWxsKCZieXRlLCAxKTsKLSAgICAgIHZhbCA9ICh2YWwgPDwgNykgfCAoYnl0ZSAmIDB4N2YpOwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIHZscSA9IHZhbDsKLSAgICAgICAgcmV0dXJuIHVzZWQ7Ci0gICAgICB9Ci0gICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCi0gICAgICBpZiAoVU5MSUtFTFkodXNlZCA+PSBzaXplb2YoYnVmKSkpIHsKLSAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6dmxxV3JpdGUodWludDY0X3QgdmxxKSB7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCi0gIGludDMyX3QgcG9zID0gc2l6ZW9mKGJ1ZikgLSAxOwotCi0gIC8vIFdyaXRlIHRoZSB0aGluZyBmcm9tIGJhY2sgdG8gZnJvbnQuCi0gIGJ1Zltwb3NdID0gdmxxICYgMHg3ZjsKLSAgdmxxID4+PSA3OwotICBwb3MtLTsKLQotICB3aGlsZSAodmxxID4gMCkgewotICAgIGFzc2VydChwb3MgPj0gMCk7Ci0gICAgYnVmW3Bvc10gPSAodmxxIHwgMHg4MCk7Ci0gICAgdmxxID4+PSA3OwotICAgIHBvcy0tOwotICB9Ci0KLSAgLy8gQmFjayB1cCBvbmUgc3RlcCBiZWZvcmUgd3JpdGluZy4KLSAgcG9zKys7Ci0KLSAgdHJhbnNfLT53cml0ZShidWYrcG9zLCBzaXplb2YoYnVmKSAtIHBvcyk7Ci0gIHJldHVybiBzaXplb2YoYnVmKSAtIHBvczsKLX0KLQotCi0KLS8qCi0gKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAqLwotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2wgZG9lc24ndCB3b3JrIHdpdGggbWVzc2FnZXMgKHlldCkuIik7Ci0KLSAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMikgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHN1YldyaXRlSTMyKHZlcnNpb24pOwotICB3c2l6ZSArPSBzdWJXcml0ZVN0cmluZyhuYW1lKTsKLSAgd3NpemUgKz0gc3ViV3JpdGVJMzIoc2VxaWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIFRoZSBUeXBlU3BlYyBzdGFjayBzaG91bGQgYmUgZW1wdHkgaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIHJlYWQvd3JpdGUuCi0gIC8vIElmIGl0IGlzLCB3ZSBwdXNoIHRoZSBUeXBlU3BlYyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQoc3RhbmRhbG9uZV8pOwotCi0gICAgaWYgKHR5cGVfc3BlY18gPT0gTlVMTCkgewotICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2w6IE5vIHR5cGUgc3BlY2lmaWVkLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQodHlwZV9zcGVjXy0+dHR5cGUgPT0gVF9TVFJVQ1QpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayh0eXBlX3NwZWNfKTsKLSAgICAgIC8vIFdyaXRlIG91dCBhIHByZWZpeCBvZiB0aGUgc3RydWN0dXJlIGZpbmdlcnByaW50LgotICAgICAgdHJhbnNfLT53cml0ZSh0eXBlX3NwZWNfLT5mcF9wcmVmaXgsIEZQX1BSRUZJWF9MRU4pOwotICAgICAgeGZlciArPSBGUF9QUkVGSVhfTEVOOwotICAgIH0KLSAgfQotCi0gIC8vIFdlIG5lZWQgYSBuZXcgZmllbGQgaW5kZXggZm9yIHRoaXMgc3RydWN0dXJlLgotICBpZHhfc3RhY2tfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgaWR4X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgLy8gU2tpcCBvdmVyIG9wdGlvbmFsIGZpZWxkcy4KLSAgd2hpbGUgKEZNVC50YWcgIT0gZmllbGRJZCkgewotICAgIC8vIFRPRE8oZHJlaXNzKTogT2xkIG1ldGEgaGVyZS4KLSAgICBhc3NlcnQoRlRTLT50dHlwZSAhPSBUX1NUT1ApOwotICAgIGFzc2VydChGTVQuaXNfb3B0aW9uYWwpOwotICAgIC8vIFdyaXRlIGEgemVybyBieXRlIHNvIHRoZSByZWFkZXIgY2FuIHNraXAgaXQuCi0gICAgeGZlciArPSBzdWJXcml0ZUJvb2woZmFsc2UpOwotICAgIC8vIEFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IGZpZWxkLgotICAgIElEWCsrOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBnaXZlIGEgYmV0dGVyIGV4Y2VwdGlvbi4KLSAgYXNzZXJ0KEZUUy0+dHR5cGUgPT0gZmllbGRUeXBlKTsKLQotICBpZiAoRk1ULmlzX29wdGlvbmFsKSB7Ci0gICAgc3ViV3JpdGVCb29sKHRydWUpOwotICAgIHhmZXIgKz0gMTsKLSAgfQotCi0gIC8vIHdyaXRlRmllbGRTdG9wIHNoYXJlcyBhbGwgbG90IG9mIGxvZ2ljIHVwIHRvIHRoaXMgcG9pbnQuCi0gIC8vIEluc3RlYWQgb2YgcmVwbGljYXRpbmcgaXQgYWxsLCB3ZSBqdXN0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGF0IG9uZQotICAvLyBhbmQgdXNlIGEgZ3Jvc3Mgc3BlY2lhbCBjYXNlIGhlcmUuCi0gIGlmIChVTkxJS0VMWShGVFMtPnR0eXBlICE9IFRfU1RPUCkpIHsKLSAgICAvLyBGb3Igbm9ybWFsIGZpZWxkcywgcHVzaCB0aGUgVHlwZVNwZWMgdGhhdCB3ZSdyZSBhYm91dCB0byB1c2UuCi0gICAgdHNfc3RhY2tfLnB1c2hfYmFjayhGVFMpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgLy8gSnVzdCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGZpZWxkLgotICBJRFgrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oIiIsIFRfU1RPUCwgMCk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTUFQKTsKLQotICBhc3NlcnQoa2V5VHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgYXNzZXJ0KHZhbFR5cGUgPT0gU1QyLT50dHlwZSk7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICBta3Zfc3RhY2tfLnB1c2hfYmFjayh0cnVlKTsKLQotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgdmFsdWUgdHlwZSwgYXMgd2VsbCBhcyBvdXIgZW50cnkgaW4gdGhlIG1hcCBrZXkvdmFsdWUgc3RhY2suCi0gIC8vIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91ciBUeXBlU3BlYy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIG1rdl9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTElTVCk7Ci0KLSAgYXNzZXJ0KGVsZW1UeXBlID09IFNUMS0+dHR5cGUpOwotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgZWxlbWVudCB0eXBlLiAgc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3Vycy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9TRVQpOwotCi0gIGFzc2VydChlbGVtVHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgZWxlbWVudCB0eXBlLiAgc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3Vycy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CT09MKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgY2hlY2tUVHlwZShUX0JZVEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCeXRlKGJ5dGUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgY2hlY2tUVHlwZShUX0kxNik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTE2KTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIGNoZWNrVFR5cGUoVF9JMzIpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGkzMik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBjaGVja1RUeXBlKFRfSTY0KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpNjQpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBjaGVja1RUeXBlKFRfRE9VQkxFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlRG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGNoZWNrVFR5cGUoVF9TVFJJTkcpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHN1YldyaXRlU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotaW5saW5lIHVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJXcml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gdmxxV3JpdGUoaTMyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YldyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHhmZXIgPSBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHhmZXIgKyBzaXplOwotfQotCi0KLQotLyoKLSAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gKgotICogVGhlc2UgaGF2ZSBhIGxvdCBvZiB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgd3JpdGluZyBmdW5jdGlvbnMsIHNvIGlmCi0gKiBzb21ldGhpbmcgaXMgY29uZnVzaW5nLCBsb29rIGZvciBjb21tZW50cyBpbiB0aGUgY29ycmVzcG9uZGluZyB3cml0ZXIuCi0gKi8KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2wgZG9lc24ndCB3b3JrIHdpdGggbWVzc2FnZXMgKHlldCkuIik7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc3o7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzeik7Ci0KLSAgaWYgKHN6IDwgMCkgewotICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gbnVtYmVyCi0gICAgaW50MzJfdCB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7Ci0gICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8yKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGlkZW50aWZpZXIiKTsKLSAgICB9Ci0gICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzeiAmIDB4MDAwMDAwZmYpOwotICAgIHhmZXIgKz0gc3ViUmVhZFN0cmluZyhuYW1lKTsKLSAgICB4ZmVyICs9IHN1YlJlYWRJMzIoc2VxaWQpOwotICB9IGVsc2UgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiTm8gdmVyc2lvbiBpZGVudGlmaWVyLi4uIG9sZCBwcm90b2NvbCBjbGllbnQgaW4gc3RyaWN0IG1vZGU/Iik7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RyaW5nJiBuYW1lKSB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChzdGFuZGFsb25lXyk7Ci0KLSAgICBpZiAodHlwZV9zcGVjXyA9PSBOVUxMKSB7Ci0gICAgICByZXNldFN0YXRlKCk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbDogTm8gdHlwZSBzcGVjaWZpZWQuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydCh0eXBlX3NwZWNfLT50dHlwZSA9PSBUX1NUUlVDVCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKHR5cGVfc3BlY18pOwotCi0gICAgICAvLyBDaGVjayB0aGUgZmluZ2VycHJpbnQgcHJlZml4LgotICAgICAgdWludDhfdCBidWZbRlBfUFJFRklYX0xFTl07Ci0gICAgICB4ZmVyICs9IHRyYW5zXy0+cmVhZChidWYsIEZQX1BSRUZJWF9MRU4pOwotICAgICAgaWYgKHN0ZDo6bWVtY21wKGJ1ZiwgdHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKSAhPSAwKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgIkZpbmdlcnByaW50IGluIGRhdGEgZG9lcyBub3QgbWF0Y2ggdHlwZV9zcGVjLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFdlIG5lZWQgYSBuZXcgZmllbGQgaW5kZXggZm9yIHRoaXMgc3RydWN0dXJlLgotICBpZHhfc3RhY2tfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgewotICBpZHhfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgLy8gRm9yIG9wdGlvbmFsIGZpZWxkcywgY2hlY2sgdG8gc2VlIGlmIHRoZXkgYXJlIHRoZXJlLgotICB3aGlsZSAoRk1ULmlzX29wdGlvbmFsKSB7Ci0gICAgYm9vbCBpc19wcmVzZW50OwotICAgIHhmZXIgKz0gc3ViUmVhZEJvb2woaXNfcHJlc2VudCk7Ci0gICAgaWYgKGlzX3ByZXNlbnQpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBJRFgrKzsKLSAgfQotCi0gIC8vIE9uY2Ugd2UgaGl0IGEgbWFuZGF0b3J5IGZpZWxkLCBvciBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IGlzIHByZXNlbnQsCi0gIC8vIHdlIGtub3cgdGhhdCBGTVQgYW5kIEZUUyBwb2ludCB0byB0aGUgYXBwcm9wcmlhdGUgZmllbGQuCi0KLSAgZmllbGRJZCAgID0gRk1ULnRhZzsKLSAgZmllbGRUeXBlID0gRlRTLT50dHlwZTsKLQotICAvLyBOb3JtYWxseSwgd2UgcHVzaCB0aGUgVHlwZVNwZWMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gcmVhZCwKLSAgLy8gYnV0IG5vIHJlYWRpbmcgaXMgZG9uZSBmb3IgVF9TVE9QLgotICBpZiAoRlRTLT50dHlwZSAhPSBUX1NUT1ApIHsKLSAgICB0c19zdGFja18ucHVzaF9iYWNrKEZUUyk7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRmllbGRFbmQoKSB7Ci0gIElEWCsrOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9NQVApOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHNpemVpOwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0KLSAga2V5VHlwZSA9IFNUMS0+dHR5cGU7Ci0gIHZhbFR5cGUgPSBTVDItPnR0eXBlOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgbWt2X3N0YWNrXy5wdXNoX2JhY2sodHJ1ZSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgbWt2X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9MSVNUKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGVsZW1UeXBlID0gU1QxLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTGlzdEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9TRVQpOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHNpemVpOwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0KLSAgZWxlbVR5cGUgPSBTVDEtPnR0eXBlOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICBjaGVja1RUeXBlKFRfQk9PTCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgY2hlY2tUVHlwZShUX0JZVEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZEJ5dGUoYnl0ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICBjaGVja1RUeXBlKFRfSTE2KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMTZfTUFYIHx8IHZhbCA8IElOVDE2X01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTE2IG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMTYgPSAoaW50MTZfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIGNoZWNrVFR5cGUoVF9JMzIpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQzMl9NQVggfHwgdmFsIDwgSU5UMzJfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzIgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGkzMiA9IChpbnQzMl90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgY2hlY2tUVHlwZShUX0k2NCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDY0X01BWCB8fCB2YWwgPCBJTlQ2NF9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NCBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTY0ID0gKGludDY0X3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIGNoZWNrVFR5cGUoVF9ET1VCTEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZERvdWJsZShkdWIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGNoZWNrVFR5cGUoVF9TVFJJTkcpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHN1YlJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YlJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMzJfTUFYIHx8IHZhbCA8IElOVDMyX01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICB1aW50MzJfdCB4ZmVyOwotICBpbnQzMl90IHNpemU7Ci0gIHhmZXIgPSBzdWJSZWFkSTMyKHNpemUpOwotICByZXR1cm4geGZlciArIHJlYWRTdHJpbmdCb2R5KHN0ciwgc2l6ZSk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjU1YTQ3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFTlNFUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUQmluYXJ5UHJvdG9jb2wuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqICEhIVdBUk5JTkchISEKLSAqIFRoaXMgY2xhc3MgaXMgc3RpbGwgaGlnaGx5IGV4cGVyaW1lbnRhbC4gIEluY29tcGF0aWJsZSBjaGFuZ2VzCi0gKiBXSUxMIGJlIG1hZGUgdG8gaXQgd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFIElUIFlFVCB1bmxlc3MKLSAqIHlvdSBhcmUgY29vcmRpbmF0aW5nIHlvdXIgdGVzdGluZyB3aXRoIHRoZSBhdXRob3IuCi0gKgotICogVGhlIGRlbnNlIHByb3RvY29sIGlzIGRlc2lnbmVkIHRvIHVzZSBhcyBsaXR0bGUgc3BhY2UgYXMgcG9zc2libGUuCi0gKgotICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBkZW5zZSBwcm90b2NvbCBpbnN0YW5jZXMuICBTdGFuZGFsb25lIGluc3RhbmNlcwotICogYXJlIG5vdCB1c2VkIGZvciBSUEMgYW5kIGp1c3QgZW5jb2RlZCBhbmQgZGVjb2RlIHN0cnVjdHVyZXMgb2YKLSAqIGEgcHJlZGV0ZXJtaW5lZCB0eXBlLiAgTm9uLXN0YW5kYWxvbmUgaW5zdGFuY2VzIGFyZSB1c2VkIGZvciBSUEMuCi0gKiBDdXJyZW50bHksIG9ubHkgc3RhbmRhbG9uZSBpbnN0YW5jZXMgZXhpc3QuCi0gKgotICogVG8gdXNlIGEgc3RhbmRhbG9uZSBkZW5zZSBwcm90b2NvbCBvYmplY3QsIHlvdSBtdXN0IHNldCB0aGUgdHlwZV9zcGVjCi0gKiBwcm9wZXJ0eSAoZWl0aGVyIGluIHRoZSBjb25zdHJ1Y3Rvciwgb3Igd2l0aCBzZXRUeXBlU3BlYykgdG8gdGhlIGxvY2FsCi0gKiByZWZsZWN0aW9uIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmVzIHlvdSB3aWxsIHdyaXRlIHRvIChvciByZWFkIGZyb20pIHRoZQotICogcHJvdG9jb2wgaW5zdGFuY2UuCi0gKgotICogQkVTVCBQUkFDVElDRVM6Ci0gKiAtIE5ldmVyIHVzZSBvcHRpb25hbCBmb3IgcHJpbWl0aXZlcyBvciBjb250YWluZXJzLgotICogLSBPbmx5IHVzZSBvcHRpb25hbCBmb3Igc3RydWN0dXJlcyBpZiB0aGV5IGFyZSB2ZXJ5IGJpZyBhbmQgdmVyeSByYXJlbHkgc2V0LgotICogLSBBbGwgaW50ZWdlcnMgYXJlIHZhcmlhYmxlLWxlbmd0aCwgc28geW91IGNhbiB1c2UgaTY0IHdpdGhvdXQgYmxvYXRpbmcuCi0gKiAtIE5FVkVSIEVWRVIgY2hhbmdlIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbnMgSU4gQU5ZIFdBWSB3aXRob3V0IGVpdGhlcgotICogICBjaGFuZ2luZyB5b3VyIGNhY2hlIGtleXMgb3IgdGFsa2luZyB0byBkcmVpc3MuCi0gKgotICogVE9ETyhkcmVpc3MpOiBOZXcgY2xhc3Mgd3JpdGUgd2l0aCBvbGQgbWV0YS4KLSAqCi0gKiBXZSBvdmVycmlkZSBhbGwgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcy4KLSAqIFdlIGluaGVyaXQgc28gdGhhdCB3ZSBjYW4gY2FuIGV4cGxpY2l0bHkgY2FsbCBUQlBzJ3MgcHJpbWl0aXZlLXdyaXRpbmcKLSAqIG1ldGhvZHMgd2l0aGluIG91ciB2ZXJzaW9ucy4KLSAqCi0gKi8KLWNsYXNzIFREZW5zZVByb3RvY29sIDogcHVibGljIFRCaW5hcnlQcm90b2NvbCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICAvLyBWRVJTSU9OXzEgKDB4ODAwMTAwMDApICBpcyB0YWtlbiBieSBUQmluYXJ5UHJvdG9jb2wuCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fMiA9IDB4ODAwMjAwMDA7Ci0KLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyBUeXBlU3BlYzsKLSAgc3RhdGljIGNvbnN0IGludCBGUF9QUkVGSVhfTEVOOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdHJhbiAgICAgICBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KLSAgICogQHBhcmFtIHR5cGVfc3BlYyAgVGhlIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmVzIHVzaW5nIHRoaXMgcHJvdG9jb2wuCi0gICAqLwotICBURGVuc2VQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgVHlwZVNwZWMqIHR5cGVfc3BlYyA9IE5VTEwpIDoKLSAgICBUQmluYXJ5UHJvdG9jb2wodHJhbnMpLAotICAgIHR5cGVfc3BlY18odHlwZV9zcGVjKSwKLSAgICBzdGFuZGFsb25lXyh0cnVlKQotICB7fQotCi0gIHZvaWQgc2V0VHlwZVNwZWMoVHlwZVNwZWMqIHR5cGVfc3BlYykgewotICAgIHR5cGVfc3BlY18gPSB0eXBlX3NwZWM7Ci0gIH0KLSAgVHlwZVNwZWMqIGdldFR5cGVTcGVjKCkgewotICAgIHJldHVybiB0eXBlX3NwZWNfOwotICB9Ci0KLQotICAvKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLQotICAvKgotICAgKiBIZWxwZXIgd3JpdGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YldyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHN1YldyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCb29sKHZhbHVlKTsKLSAgfQotCi0KLSAgLyoKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOwotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qCi0gICAqIEhlbHBlciByZWFkaW5nIGZ1bmN0aW9ucyAoZG9uJ3QgZG8gc3RhdGUgdHJhbnNpdGlvbnMpLgotICAgKi8KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICBpbmxpbmUgdWludDMyX3Qgc3ViUmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJSZWFkQm9vbChib29sJiB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCb29sKHZhbHVlKTsKLSAgfQotCi0KLSBwcml2YXRlOgotCi0gIC8vIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucywgZG9jdW1lbnRlZCBpbiB0aGUgLmNwcC4KLSAgaW5saW5lIHZvaWQgY2hlY2tUVHlwZShjb25zdCBUVHlwZSB0dHlwZSk7Ci0gIGlubGluZSB2b2lkIHN0YXRlVHJhbnNpdGlvbigpOwotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2Vycy4KLSAgLy8gVXNlcyB0aGUgc2FtZSB0ZWNobmlxdWUgYXMgdGhlIE1JREkgZmlsZSBmb3JtYXQuCi0gIGlubGluZSB1aW50MzJfdCB2bHFSZWFkKHVpbnQ2NF90JiB2bHEpOwotICBpbmxpbmUgdWludDMyX3QgdmxxV3JpdGUodWludDY0X3QgdmxxKTsKLQotICAvLyBDYWxsZWQgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB0byBtYWtlIHRoZSBvYmplY3QgcmV1c2FibGUuCi0gIHZvaWQgcmVzZXRTdGF0ZSgpIHsKLSAgICB0c19zdGFja18uY2xlYXIoKTsKLSAgICBpZHhfc3RhY2tfLmNsZWFyKCk7Ci0gICAgbWt2X3N0YWNrXy5jbGVhcigpOwotICB9Ci0KLSAgLy8gVHlwZVNwZWMgb2YgdGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUgdG8gd3JpdGUsCi0gIC8vIGZvciBzdGFuZGFsb25lIHByb3RvY29sIG9iamVjdHMuCi0gIFR5cGVTcGVjKiB0eXBlX3NwZWNfOwotCi0gIHN0ZDo6dmVjdG9yPFR5cGVTcGVjKj4gdHNfc3RhY2tfOyAgIC8vIFR5cGVTcGVjIHN0YWNrLgotICBzdGQ6OnZlY3RvcjxpbnQ+ICAgICAgIGlkeF9zdGFja187ICAvLyBJbkRlWCBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8Ym9vbD4gICAgICBta3Zfc3RhY2tfOyAgLy8gTWFwIEtleS9WbHVlIHN0YWNrLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnVlID0ga2V5LCBGYWxzZSA9IHZhbHVlLgotCi0gIC8vIFRydWUgaWZmIHRoaXMgaXMgYSBzdGFuZGFsb25lIGluc3RhbmNlIChubyBSUEMpLgotICBib29sIHN0YW5kYWxvbmVfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTljOGYwLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRKU09OUHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgIlRCYXNlNjRVdGlscy5oIgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLQotLy8gU3RhdGljIGRhdGEKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RTdGFydCA9ICd7JzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0RW5kID0gJ30nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheVN0YXJ0ID0gJ1snOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheUVuZCA9ICddJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OTmV3bGluZSA9ICdcbic7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlBhaXJTZXBhcmF0b3IgPSAnOic7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkJhY2tzbGFzaCA9ICdcXCc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OWmVyb0NoYXIgPSAnMCc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVzY2FwZUNoYXIgPSAndSc7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSlNPTkVzY2FwZVByZWZpeCgiXFx1MDAiKTsKLQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaHJpZnRWZXJzaW9uMSA9IDE7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0TmFuKCJOYU4iKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0SW5maW5pdHkoIkluZmluaXR5Iik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkoIi1JbmZpbml0eSIpOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQm9vbCgidGYiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVCeXRlKCJpOCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkxNigiaTE2Iik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTMyKCJpMzIiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJNjQoImk2NCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZURvdWJsZSgiZGJsIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RydWN0KCJyZWMiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTdHJpbmcoInN0ciIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZU1hcCgibWFwIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lTGlzdCgibHN0Iik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU2V0KCJzZXQiKTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpIHsKLSAgc3dpdGNoICh0eXBlSUQpIHsKLSAgY2FzZSBUX0JPT0w6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUJvb2w7Ci0gIGNhc2UgVF9CWVRFOgotICAgIHJldHVybiBrVHlwZU5hbWVCeXRlOwotICBjYXNlIFRfSTE2OgotICAgIHJldHVybiBrVHlwZU5hbWVJMTY7Ci0gIGNhc2UgVF9JMzI6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUkzMjsKLSAgY2FzZSBUX0k2NDoKLSAgICByZXR1cm4ga1R5cGVOYW1lSTY0OwotICBjYXNlIFRfRE9VQkxFOgotICAgIHJldHVybiBrVHlwZU5hbWVEb3VibGU7Ci0gIGNhc2UgVF9TVFJJTkc6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZVN0cmluZzsKLSAgY2FzZSBUX1NUUlVDVDoKLSAgICByZXR1cm4ga1R5cGVOYW1lU3RydWN0OwotICBjYXNlIFRfTUFQOgotICAgIHJldHVybiBrVHlwZU5hbWVNYXA7Ci0gIGNhc2UgVF9TRVQ6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZVNldDsKLSAgY2FzZSBUX0xJU1Q6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUxpc3Q7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKLSAgfQotfQotCi1zdGF0aWMgVFR5cGUgZ2V0VHlwZUlERm9yVHlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKLSAgVFR5cGUgcmVzdWx0ID0gVF9TVE9QOyAvLyBTZW50aW5lbCB2YWx1ZQotICBpZiAobmFtZS5sZW5ndGgoKSA+IDEpIHsKLSAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKLSAgICBjYXNlICdkJzoKLSAgICAgIHJlc3VsdCA9IFRfRE9VQkxFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKLSAgICAgIGNhc2UgJzgnOgotICAgICAgICByZXN1bHQgPSBUX0JZVEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnMSc6Ci0gICAgICAgIHJlc3VsdCA9IFRfSTE2OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzMnOgotICAgICAgICByZXN1bHQgPSBUX0kzMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc2JzoKLSAgICAgICAgcmVzdWx0ID0gVF9JNjQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbCc6Ci0gICAgICByZXN1bHQgPSBUX0xJU1Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdtJzoKLSAgICAgIHJlc3VsdCA9IFRfTUFQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICByZXN1bHQgPSBUX1NUUlVDVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7Ci0gICAgICAgIHJlc3VsdCA9IFRfU1RSSU5HOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKLSAgICAgICAgcmVzdWx0ID0gVF9TRVQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd0JzoKLSAgICAgIHJlc3VsdCA9IFRfQk9PTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAocmVzdWx0ID09IFRfU1RPUCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vLyBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaGFuZGxpbmcgZm9yIHRoZSBmaXJzdCAweDMwIGNoYXJhY3RlcnMKLS8vICAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCi0vLyAgMSA6IGp1c3Qgb3V0cHV0IGluZGV4Ci0vLyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQ2hhclRhYmxlWzB4MzBdID0gewotLy8gIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwnYicsJ3QnLCduJywgIDAsJ2YnLCdyJywgIDAsICAwLCAvLyAwCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLy8gMQotICAgIDEsICAxLCciJywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIC8vIDIKLX07Ci0KLQotLy8gVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4ga0VzY2FwZUNoYXJWYWxzLgotLy8gSSBkb24ndCBoYXZlICcvJyBvbiB0aGlzIGxpc3QgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBvbiB3d3cuanNvbi5vcmcgLS0KLS8vIGl0IGlzIG5vdCBpbiB0aGUgUkZDCi1jb25zdCBzdGF0aWMgc3RkOjpzdHJpbmcga0VzY2FwZUNoYXJzKCJcIlxcYmZucnQiKTsKLQotLy8gVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCi0vLyBrRXNjYXBlQ2hhcnMKLWNvbnN0IHN0YXRpYyB1aW50OF90IGtFc2NhcGVDaGFyVmFsc1s3XSA9IHsKLSAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAotfTsKLQotCi0vLyBTdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwotCi0vLyBSZWFkIDEgY2hhcmFjdGVyIGZyb20gdGhlIHRyYW5zcG9ydCB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlCi0vLyBleHBlY3RlZCBjaGFyYWN0ZXIgY2guCi0vLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3QuCi1zdGF0aWMgdWludDMyX3QgcmVhZFN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyICZyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaCkgewotICB1aW50OF90IGNoMiA9IHJlYWRlci5yZWFkKCk7Ci0gIGlmIChjaDIgIT0gY2gpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaCwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCc7IGdvdCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaDIsIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnLiIpOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLyBSZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgb2YgYSBoZXggY2hhcmFjdGVyIGNoLgotLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgdGhlIGNoYXJhY3RlciBpcyBub3QgWzAtOWEtZl0uCi1zdGF0aWMgdWludDhfdCBoZXhWYWwodWludDhfdCBjaCkgewotICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHsKLSAgICByZXR1cm4gY2ggLSAnMCc7Ci0gIH0KLSAgZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKLSAgICByZXR1cm4gY2ggLSAnYSc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgXCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaCwgMSkgKyAiXCcuIik7Ci0gIH0KLX0KLQotLy8gUmV0dXJuIHRoZSBoZXggY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciB2YWwuIFRoZSB2YWx1ZSBpcyBtYXNrZWQKLS8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KLXN0YXRpYyB1aW50OF90IGhleENoYXIodWludDhfdCB2YWwpIHsKLSAgdmFsICY9IDB4MEY7Ci0gIGlmICh2YWwgPCAxMCkgewotICAgIHJldHVybiB2YWwgKyAnMCc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIHZhbCArICdhJzsKLSAgfQotfQotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNoIGlzIGluIFstKzAtOS5FZV07IGZhbHNlIG90aGVyd2lzZQotc3RhdGljIGJvb2wgaXNKU09OTnVtZXJpYyh1aW50OF90IGNoKSB7Ci0gIHN3aXRjaCAoY2gpIHsKLSAgY2FzZSAnKyc6Ci0gIGNhc2UgJy0nOgotICBjYXNlICcuJzoKLSAgY2FzZSAnMCc6Ci0gIGNhc2UgJzEnOgotICBjYXNlICcyJzoKLSAgY2FzZSAnMyc6Ci0gIGNhc2UgJzQnOgotICBjYXNlICc1JzoKLSAgY2FzZSAnNic6Ci0gIGNhc2UgJzcnOgotICBjYXNlICc4JzoKLSAgY2FzZSAnOSc6Ci0gIGNhc2UgJ0UnOgotICBjYXNlICdlJzoKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoqCi0gKiBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpTT04gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAotICogaW1wbGVtZW50YXRpb25zCi0gKi8KLWNsYXNzIFRKU09OQ29udGV4dCB7Ci0KLSBwdWJsaWM6Ci0KLSAgVEpTT05Db250ZXh0KCkge307Ci0KLSAgdmlydHVhbCB+VEpTT05Db250ZXh0KCkge307Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgotICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi0vLyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycwotY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7Ci0KLXB1YmxpYzoKLQotICBKU09OUGFpckNvbnRleHQoKSA6Ci0gICAgZmlyc3RfKHRydWUpLAotICAgIGNvbG9uXyh0cnVlKSB7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0ICZ0cmFucykgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgY29sb25fID0gdHJ1ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/ICZrSlNPTlBhaXJTZXBhcmF0b3IgOiAma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKLSAgICAgIGNvbG9uXyA9ICFjb2xvbl87Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgaWYgKGZpcnN0XykgewotICAgICAgZmlyc3RfID0gZmFsc2U7Ci0gICAgICBjb2xvbl8gPSB0cnVlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdWludDhfdCBjaCA9IChjb2xvbl8gPyBrSlNPTlBhaXJTZXBhcmF0b3IgOiBrSlNPTkVsZW1TZXBhcmF0b3IpOwotICAgICAgY29sb25fID0gIWNvbG9uXzsKLSAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCi0gIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7Ci0gICAgcmV0dXJuIGNvbG9uXzsKLSAgfQotCi0gIHByaXZhdGU6Ci0KLSAgICBib29sIGZpcnN0XzsKLSAgICBib29sIGNvbG9uXzsKLX07Ci0KLS8vIENvbnRleHQgY2xhc3MgZm9yIGxpc3RzCi1jbGFzcyBKU09OTGlzdENvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKLQotcHVibGljOgotCi0gIEpTT05MaXN0Q29udGV4dCgpIDoKLSAgICBmaXJzdF8odHJ1ZSkgewotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKLSAgICBpZiAoZmlyc3RfKSB7Ci0gICAgICBmaXJzdF8gPSBmYWxzZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyYW5zLndyaXRlKCZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwga0pTT05FbGVtU2VwYXJhdG9yKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlOgotICAgIGJvb2wgZmlyc3RfOwotfTsKLQotCi1USlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOgotICBUUHJvdG9jb2wocHRyYW5zKSwKLSAgY29udGV4dF8obmV3IFRKU09OQ29udGV4dCgpKSwKLSAgcmVhZGVyXygqcHRyYW5zKSB7Ci19Ci0KLVRKU09OUHJvdG9jb2w6On5USlNPTlByb3RvY29sKCkge30KLQotdm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpIHsKLSAgY29udGV4dHNfLnB1c2goY29udGV4dF8pOwotICBjb250ZXh0XyA9IGM7Ci19Ci0KLXZvaWQgVEpTT05Qcm90b2NvbDo6cG9wQ29udGV4dCgpIHsKLSAgY29udGV4dF8gPSBjb250ZXh0c18udG9wKCk7Ci0gIGNvbnRleHRzXy5wb3AoKTsKLX0KLQotLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpTT04gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkVzY2FwZUNoYXIodWludDhfdCBjaCkgewotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopa0pTT05Fc2NhcGVQcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgICAgICBrSlNPTkVzY2FwZVByZWZpeC5sZW5ndGgoKSk7Ci0gIHVpbnQ4X3Qgb3V0Q2ggPSBoZXhDaGFyKGNoID4+IDQpOwotICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7Ci0gIG91dENoID0gaGV4Q2hhcihjaCk7Ci0gIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKLSAgcmV0dXJuIDY7Ci19Ci0KLS8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgcGFydCBvZiBhIEpTT04gc3RyaW5nLCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkNoYXIodWludDhfdCBjaCkgewotICBpZiAoY2ggPj0gMHgzMCkgewotICAgIGlmIChjaCA9PSBrSlNPTkJhY2tzbGFzaCkgeyAvLyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCi0gICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7Ci0gICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0cmFuc18tPndyaXRlKCZjaCwgMSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdWludDhfdCBvdXRDaCA9IGtKU09OQ2hhclRhYmxlW2NoXTsKLSAgICAvLyBDaGVjayBpZiByZWd1bGFyIGNoYXJhY3RlciwgYmFja3NsYXNoIGVzY2FwZWQsIG9yIEpTT04gZXNjYXBlZAotICAgIGlmIChvdXRDaCA9PSAxKSB7Ci0gICAgICB0cmFuc18tPndyaXRlKCZjaCwgMSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3V0Q2ggPiAxKSB7Ci0gICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7Ci0gICAgICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gd3JpdGVKU09ORXNjYXBlQ2hhcihjaCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBzdHIgYXMgYSBKU09OIHN0cmluZywgZXNjYXBpbmcKLS8vIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCi0gIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIoc3RyLmJlZ2luKCkpOwotICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKHN0ci5lbmQoKSk7Ci0gIHdoaWxlIChpdGVyICE9IGVuZCkgewotICAgIHJlc3VsdCArPSB3cml0ZUpTT05DaGFyKCppdGVyKyspOwotICB9Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKLS8vIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCi0gIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgdWludDhfdCBiWzRdOwotICBjb25zdCB1aW50OF90ICpieXRlcyA9IChjb25zdCB1aW50OF90ICopc3RyLmNfc3RyKCk7Ci0gIHVpbnQzMl90IGxlbiA9IHN0ci5sZW5ndGgoKTsKLSAgd2hpbGUgKGxlbiA+PSAzKSB7Ci0gICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCi0gICAgYmFzZTY0X2VuY29kZShieXRlcywgMywgYik7Ci0gICAgdHJhbnNfLT53cml0ZShiLCA0KTsKLSAgICByZXN1bHQgKz0gNDsKLSAgICBieXRlcyArPSAzOwotICAgIGxlbiAtPTM7Ci0gIH0KLSAgaWYgKGxlbikgeyAvLyBIYW5kbGUgcmVtYWluZGVyCi0gICAgYmFzZTY0X2VuY29kZShieXRlcywgbGVuLCBiKTsKLSAgICB0cmFuc18tPndyaXRlKGIsIGxlbiArIDEpOwotICAgIHJlc3VsdCArPSBsZW4gKyAxOwotICB9Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQ29udmVydCB0aGUgZ2l2ZW4gaW50ZWdlciB0eXBlIHRvIGEgSlNPTiBudW1iZXIsIG9yIGEgc3RyaW5nCi0vLyBpZiB0aGUgY29udGV4dCByZXF1aXJlcyBpdCAoZWc6IGtleSBpbiBhIG1hcCBwYWlyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHN0ZDo6c3RyaW5nIHZhbChib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihudW0pKTsKLSAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0Xy0+ZXNjYXBlTnVtKCk7Ci0gIGlmIChlc2NhcGVOdW0pIHsKLSAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gICAgcmVzdWx0ICs9IDE7Ci0gIH0KLSAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCAqKXZhbC5jX3N0cigpLCB2YWwubGVuZ3RoKCkpOwotICByZXN1bHQgKz0gdmFsLmxlbmd0aCgpOwotICBpZiAoZXNjYXBlTnVtKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICAgIHJlc3VsdCArPSAxOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIENvbnZlcnQgdGhlIGdpdmVuIGRvdWJsZSB0byBhIEpTT04gc3RyaW5nLCB3aGljaCBpcyBlaXRoZXIgdGhlIG51bWJlciwKLS8vICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHN0ZDo6c3RyaW5nIHZhbChib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihudW0pKTsKLQotICAvLyBOb3JtYWxpemUgb3V0cHV0IG9mIGJvb3N0OjpsZXhpY2FsX2Nhc3QgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKLSAgYm9vbCBzcGVjaWFsID0gZmFsc2U7Ci0gIHN3aXRjaCAodmFsWzBdKSB7Ci0gIGNhc2UgJ04nOgotICBjYXNlICduJzoKLSAgICB2YWwgPSBrVGhyaWZ0TmFuOwotICAgIHNwZWNpYWwgPSB0cnVlOwotICAgIGJyZWFrOwotICBjYXNlICdJJzoKLSAgY2FzZSAnaSc6Ci0gICAgdmFsID0ga1RocmlmdEluZmluaXR5OwotICAgIHNwZWNpYWwgPSB0cnVlOwotICAgIGJyZWFrOwotICBjYXNlICctJzoKLSAgICBpZiAoKHZhbFsxXSA9PSAnSScpIHx8ICh2YWxbMV0gPT0gJ2knKSkgewotICAgICAgdmFsID0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHk7Ci0gICAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dF8tPmVzY2FwZU51bSgpOwotICBpZiAoZXNjYXBlTnVtKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICAgIHJlc3VsdCArPSAxOwotICB9Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKil2YWwuY19zdHIoKSwgdmFsLmxlbmd0aCgpKTsKLSAgcmVzdWx0ICs9IHZhbC5sZW5ndGgoKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdFN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdCArIDE7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdEVuZCgpIHsKLSAgcG9wQ29udGV4dCgpOwotICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdEVuZCwgMSk7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheVN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlTdGFydCwgMSk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7Ci0gIHJldHVybiByZXN1bHQgKyAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheUVuZCgpIHsKLSAgcG9wQ29udGV4dCgpOwotICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5RW5kLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKGtUaHJpZnRWZXJzaW9uMSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcobmFtZSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2VUeXBlKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoc2VxaWQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OSW50ZWdlcihmaWVsZElkKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGRUeXBlKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGtleVR5cGUpKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRCh2YWxUeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXN1bHQgKz0gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKSArIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKHZhbHVlKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMKLSAgLy8gaW50OF90IGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCi0gIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKChpbnQxNl90KWJ5dGUpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMTYpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMzIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpNjQpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIHJldHVybiB3cml0ZUpTT05Eb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gd3JpdGVKU09OU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkJhc2U2NChzdHIpOwotfQotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotLy8gUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCkgewotICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOwotfQotCi0vLyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCi0vLyB0aGUgY2hhcmFjdGVyIHZpYSBvdXQuIFRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBtdXN0IGJlICIwMCIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCAqb3V0KSB7Ci0gIHVpbnQ4X3QgYlsyXTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05aZXJvQ2hhcik7Ci0gIGJbMF0gPSByZWFkZXJfLnJlYWQoKTsKLSAgYlsxXSA9IHJlYWRlcl8ucmVhZCgpOwotICAqb3V0ID0gKGhleFZhbChiWzBdKSA8PCA0KSArIGhleFZhbChiWzFdKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8vIERlY29kZXMgYSBKU09OIHN0cmluZywgaW5jbHVkaW5nIHVuZXNjYXBpbmcsIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmlhIHN0cgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCkgewotICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOwotICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgdWludDhfdCBjaDsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKLSAgICArK3Jlc3VsdDsKLSAgICBpZiAoY2ggPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsKLSAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7Ci0gICAgICArK3Jlc3VsdDsKLSAgICAgIGlmIChjaCA9PSBrSlNPTkVzY2FwZUNoYXIpIHsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRKU09ORXNjYXBlQ2hhcigmY2gpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyICopJmNoLCAxKSAgKyAiJy4iKTsKLSAgICAgICAgfQotICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOwotICAgICAgfQotICAgIH0KLSAgICBzdHIgKz0gY2g7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBibG9jayBvZiBiYXNlNjQgY2hhcmFjdGVycywgZGVjb2RpbmcgaXQsIGFuZCByZXR1cm5zIHZpYSBzdHIKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgc3RkOjpzdHJpbmcgdG1wOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN0cmluZyh0bXApOwotICB1aW50OF90ICpiID0gKHVpbnQ4X3QgKil0bXAuY19zdHIoKTsKLSAgdWludDMyX3QgbGVuID0gdG1wLmxlbmd0aCgpOwotICBzdHIuY2xlYXIoKTsKLSAgd2hpbGUgKGxlbiA+PSA0KSB7Ci0gICAgYmFzZTY0X2RlY29kZShiLCA0KTsKLSAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyICopYiwgMyk7Ci0gICAgYiArPSA0OwotICAgIGxlbiAtPSA0OwotICB9Ci0gIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAotICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCi0gIGlmIChsZW4gPiAxKSB7Ci0gICAgYmFzZTY0X2RlY29kZShiLCBsZW4pOwotICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIgKiliLCBsZW4gLSAxKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKLS8vIGEgdmFsaWQgSlNPTiBudW1lcmljIGNoYXJhY3Rlci4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOwotICAgIGlmICghaXNKU09OTnVtZXJpYyhjaCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZWFkZXJfLnJlYWQoKTsKLSAgICBzdHIgKz0gY2g7Ci0gICAgKytyZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAotLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQotdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSAmbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwotICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3RyOwotICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKLSAgdHJ5IHsKLSAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PE51bWJlclR5cGU+KHN0cik7Ci0gIH0KLSAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKLSAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICB9Ci0gIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhIEpTT04gbnVtYmVyIG9yIHN0cmluZyBhbmQgaW50ZXJwcmV0cyBpdCBhcyBhIGRvdWJsZS4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORG91YmxlKGRvdWJsZSAmbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwotICBzdGQ6OnN0cmluZyBzdHI7Ci0gIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBrSlNPTlN0cmluZ0RlbGltaXRlcikgewotICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhzdHIsIHRydWUpOwotICAgIC8vIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKLSAgICBpZiAoc3RyID09IGtUaHJpZnROYW4pIHsKLSAgICAgIG51bSA9IEhVR0VfVkFML0hVR0VfVkFMOyAvLyBnZW5lcmF0ZXMgTmFOCi0gICAgfQotICAgIGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0SW5maW5pdHkpIHsKLSAgICAgIG51bSA9IEhVR0VfVkFMOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIgPT0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpIHsKLSAgICAgIG51bSA9IC1IVUdFX1ZBTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoIWNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCi0gICAgICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwotICAgIH0KLSAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKLSAgICB0cnkgewotICAgICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxkb3VibGU+KHN0cik7Ci0gICAgfQotICAgIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RFbmQoKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdEVuZCk7Ci0gIHBvcENvbnRleHQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkFycmF5RW5kKCkgewotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheUVuZCk7Ci0gIHBvcENvbnRleHQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYgKHRtcFZhbCAhPSBrVGhyaWZ0VmVyc2lvbjEpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwotICB9Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhuYW1lKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdG1wVmFsOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIHNlcWlkID0gdG1wVmFsOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gIHJldHVybiByZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIC8vIENoZWNrIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKLSAgaWYgKGNoID09IGtKU09OT2JqZWN0RW5kKSB7Ci0gICAgZmllbGRUeXBlID0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1A7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICAgIGZpZWxkSWQgPSB0bXBWYWw7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAgICBmaWVsZFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAga2V5VHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICB2YWxUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzaXplID0gdG1wVmFsOwotICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKSArIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHRtcFN0cjsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgc2l6ZSA9IHRtcFZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgc3RkOjpzdHJpbmcgdG1wU3RyOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzaXplID0gdG1wVmFsOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0RW5kKCkgewotICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKHZhbHVlKTsKLX0KLQotLy8gcmVhZEJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgcHJvcGVybHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMgaW50OF90Ci0vLyBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGludDE2X3QgdG1wID0gKGludDE2X3QpIGJ5dGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9ICByZWFkSlNPTkludGVnZXIodG1wKTsKLSAgYXNzZXJ0KHRtcCA8IDI1Nik7Ci0gIGJ5dGUgPSAoaW50OF90KXRtcDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMTYpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkzMik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIHJldHVybiByZWFkSlNPTkludGVnZXIoaTY0KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICByZXR1cm4gcmVhZEpTT05Eb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHJldHVybiByZWFkSlNPTlN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KHN0cik7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNDk5YS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxzdGFjaz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uCi1jbGFzcyBUSlNPTkNvbnRleHQ7Ci0KLS8qKgotICogSlNPTiBwcm90b2NvbCBmb3IgVGhyaWZ0LgotICoKLSAqIEltcGxlbWVudHMgYSBwcm90b2NvbCB3aGljaCB1c2VzIEpTT04gYXMgdGhlIHdpcmUtZm9ybWF0LgotICoKLSAqIFRocmlmdCB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZGVzY3JpYmVkIGJlbG93OgotICoKLSAqIDEuIEV2ZXJ5IFRocmlmdCBpbnRlZ2VyIHR5cGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG51bWJlci4KLSAqCi0gKiAyLiBUaHJpZnQgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBudW1iZXJzLiBTb21lIHNwZWNpYWwgdmFsdWVzIGFyZQotICogICAgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKLSAqICAgIGEuICJOYU4iIGZvciBub3QtYS1udW1iZXIgdmFsdWVzCi0gKiAgICBiLiAiSW5maW5pdHkiIGZvciBwb3N0aXZlIGluZmluaXR5Ci0gKiAgICBjLiAiLUluZmluaXR5IiBmb3IgbmVnYXRpdmUgaW5maW5pdHkKLSAqCi0gKiAzLiBUaHJpZnQgc3RyaW5nIHZhbHVlcyBhcmUgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MsIHdpdGggYXBwcm9wcmlhdGUKLSAqICAgIGVzY2FwaW5nLgotICoKLSAqIDQuIFRocmlmdCBiaW5hcnkgdmFsdWVzIGFyZSBlbmNvZGVkIGludG8gQmFzZTY0IGFuZCBlbWl0dGVkIGFzIEpTT04gc3RyaW5ncy4KLSAqICAgIFRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIGlzIHdyaXR0ZW4gc3VjaCB0aGF0IGl0IHdpbGwgcHJvcGVybHkgc2tpcCBpZgotICogICAgY2FsbGVkIG9uIGEgVGhyaWZ0IHN0cmluZyAoYWx0aG91Z2ggaXQgd2lsbCBkZWNvZGUgZ2FyYmFnZSBkYXRhKS4KLSAqCi0gKiA1LiBUaHJpZnQgc3RydWN0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBvYmplY3RzLCB3aXRoIHRoZSBmaWVsZCBJRCBhcyB0aGUKLSAqICAgIGtleSwgYW5kIHRoZSBmaWVsZCB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIEpTT04gb2JqZWN0IHdpdGggYSBzaW5nbGUKLSAqICAgIGtleS12YWx1ZSBwYWlyLiBUaGUga2V5IGlzIGEgc2hvcnQgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoYXQgdHlwZSwKLSAqICAgIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZS4gVGhlIHZhbGlkIHR5cGUgaWRlbnRpZmllcnMgYXJlOiAidGYiIGZvciBib29sLAotICogICAgImk4IiBmb3IgYnl0ZSwgImkxNiIgZm9yIDE2LWJpdCBpbnRlZ2VyLCAiaTMyIiBmb3IgMzItYml0IGludGVnZXIsICJpNjQiCi0gKiAgICBmb3IgNjQtYml0IGludGVnZXIsICJkYmwiIGZvciBkb3VibGUtcHJlY2lzaW9uIGxvYXRpbmcgcG9pbnQsICJzdHIiIGZvcgotICogICAgc3RyaW5nIChpbmNsdWRpbmcgYmluYXJ5KSwgInJlYyIgZm9yIHN0cnVjdCAoInJlY29yZHMiKSwgIm1hcCIgZm9yIG1hcCwKLSAqICAgICJsc3QiIGZvciBsaXN0LCAic2V0IiBmb3Igc2V0LgotICoKLSAqIDYuIFRocmlmdCBsaXN0cyBhbmQgc2V0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0Ci0gKiAgICBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIFRocmlmdAotICogICAgZWxlbWVudCB0eXBlIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIGNvdW50IG9mCi0gKiAgICB0aGUgVGhyaWZ0IGVsZW1lbnRzLiBUaGUgVGhyaWZ0IGVsZW1lbnRzIHRoZW4gZm9sbG93LgotICoKLSAqIDcuIFRocmlmdCBtYXBzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIGFycmF5cywgd2l0aCB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzCi0gKiAgICBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXJzIGZvciB0aGUgVGhyaWZ0IGtleSB0eXBlCi0gKiAgICBhbmQgdmFsdWUgdHlwZSwgZm9sbG93ZWQgYnkgdGhlIGNvdW50IG9mIHRoZSBUaHJpZnQgcGFpcnMsIGZvbGxvd2VkIGJ5IGEKLSAqICAgIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycy4gTm90ZSB0aGF0IEpTT04ga2V5cyBjYW4gb25seQotICogICAgYmUgc3RyaW5ncywgd2hpY2ggbWVhbnMgdGhhdCB0aGUga2V5IHR5cGUgb2YgdGhlIFRocmlmdCBtYXAgc2hvdWxkIGJlCi0gKiAgICByZXN0cmljdGVkIHRvIG51bWVyaWMgb3Igc3RyaW5nIHR5cGVzIC0tIGluIHRoZSBjYXNlIG9mIG51bWVyaWNzLCB0aGV5Ci0gKiAgICBhcmUgc2VyaWFsaXplZCBhcyBzdHJpbmdzLgotICoKLSAqIDguIFRocmlmdCBtZXNzYWdlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIHByb3RvY29sCi0gKiAgICB2ZXJzaW9uICMsIHRoZSBtZXNzYWdlIG5hbWUsIHRoZSBtZXNzYWdlIHR5cGUsIGFuZCB0aGUgc2VxdWVuY2UgSUQgYXMKLSAqICAgIHRoZSBmaXJzdCA0IGVsZW1lbnRzLgotICoKLSAqIE1vcmUgZGlzY3Vzc2lvbiBvZiB0aGUgZG91YmxlIGhhbmRsaW5nIGlzIHByb2JhYmx5IHdhcnJhbnRlZC4gVGhlIGFpbSBvZgotICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0aGUgYmVoYXZpb3IKLSAqIG9mIEphdmEncyBEb3VibGUudG9TdHJpbmcoKSwgd2hpY2ggaGFzIG5vIHByZWNpc2lvbiBsb3NzLiAgSW1wbGVtZW50b3JzIGluCi0gKiBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIHN0cml2ZSB0byBhY2hpZXZlIHRoYXQgd2hlcmUgcG9zc2libGUuIEkgaGF2ZSBub3QKLSAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIGJvb3N0OmxleGljYWxfY2FzdCwgd2hpY2ggaXMgZG9pbmcgdGhhdCB3b3JrIGZvciBtZSBpbgotICogQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUgaW1wcm92ZW1lbnQuIEkKLSAqIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyIGxhbmd1YWdlcyBjb3VsZAotICogYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtIGNvbnNpc3RlbmN5LgotICoKLSAqIE5vdGUgZnVydGhlciB0aGF0IEphdmFTY3JpcHQgaXRzZWxmIGlzIG5vdCBjYXBhYmxlIG9mIHJlcHJlc2VudGluZwotICogZmxvYXRpbmcgcG9pbnQgaW5maW5pdGllcyAtLSBwcmVzdW1hYmx5IHdoZW4gd2UgaGF2ZSBhIEphdmFTY3JpcHQgVGhyaWZ0Ci0gKiBjbGllbnQsIHRoaXMgd291bGQgbWVhbiB0aGF0IGluZmluaXRpZXMgZ2V0IGNvbnZlcnRlZCB0byBub3QtYS1udW1iZXIgaW4KLSAqIHRyYW5zbWlzc2lvbi4gSSBkb24ndCBrbm93IG9mIGFueSB3b3JrLWFyb3VuZCBmb3IgdGhpcyBpc3N1ZS4KLSAqCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwdWJsaWM6Ci0KLSAgVEpTT05Qcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOwotCi0gIH5USlNPTlByb3RvY29sKCk7Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKTsKLQotICB2b2lkIHBvcENvbnRleHQoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgY2gpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkNoYXIodWludDhfdCBjaCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLSAgdWludDMyX3Qgd3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05BcnJheUVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCAqb3V0KTsKLQotICB1aW50MzJfdCByZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyAmc3RyLCBib29sIHNraXBDb250ZXh0ID0gZmFsc2UpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nICZzdHIpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nICZzdHIpOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgotICB1aW50MzJfdCByZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSAmbnVtKTsKLQotICB1aW50MzJfdCByZWFkSlNPTkRvdWJsZShkb3VibGUgJm51bSk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05PYmplY3RTdGFydCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05BcnJheUVuZCgpOwotCi0gcHVibGljOgotCi0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICBjbGFzcyBMb29rYWhlYWRSZWFkZXIgewotCi0gICBwdWJsaWM6Ci0KLSAgICBMb29rYWhlYWRSZWFkZXIoVFRyYW5zcG9ydCAmdHJhbnMpIDoKLSAgICAgIHRyYW5zXygmdHJhbnMpLAotICAgICAgaGFzRGF0YV8oZmFsc2UpIHsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJlYWQoKSB7Ci0gICAgICBpZiAoaGFzRGF0YV8pIHsKLSAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkYXRhXzsKLSAgICB9Ci0KLSAgICB1aW50OF90IHBlZWsoKSB7Ci0gICAgICBpZiAoIWhhc0RhdGFfKSB7Ci0gICAgICAgIHRyYW5zXy0+cmVhZEFsbCgmZGF0YV8sIDEpOwotICAgICAgfQotICAgICAgaGFzRGF0YV8gPSB0cnVlOwotICAgICAgcmV0dXJuIGRhdGFfOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBUVHJhbnNwb3J0ICp0cmFuc187Ci0gICAgYm9vbCBoYXNEYXRhXzsKLSAgICB1aW50OF90IGRhdGFfOwotICB9OwotCi0gcHJpdmF0ZToKLQotICBzdGQ6OnN0YWNrPGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87Ci0gIExvb2thaGVhZFJlYWRlciByZWFkZXJfOwotfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgotICovCi1jbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5USlNPTlByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKSk7Ci0gIH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotCi0vLyBUT0RPKGRyZWlzcyk6IE1vdmUgcGFydCBvZiBUaHJpZnRKU09OU3RyaW5nIGludG8gYSAuY3BwIGZpbGUgYW5kIHJlbW92ZSB0aGlzLgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KLSAgc3RkOjpzdHJpbmcgVGhyaWZ0SlNPTlN0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKLSAgVEpTT05Qcm90b2NvbCBwcm90b2NvbCh0cmFucyk7Ci0KLSAgdHMud3JpdGUoJnByb3RvY29sKTsKLQotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Ci19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UT25lV2F5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RPbmVXYXlQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA4ZmUxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RPbmVXYXlQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RPTkVXQVlQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RPTkVXQVlQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUUHJvdG9jb2wuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgYSBwcm90b2NvbCB0aGF0IGNhbiBvbmx5IGJlIHdyaXR0ZW4sCi0gKiBub3QgcmVhZC4KLSAqCi0gKi8KLWNsYXNzIFRXcml0ZU9ubHlQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEBwYXJhbSBzdWJjbGFzc19uYW1lICBUaGUgbmFtZSBvZiB0aGUgY29uY3JldGUgc3ViY2xhc3MuCi0gICAqLwotICBUV3JpdGVPbmx5UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ViY2xhc3NfbmFtZSkKLSAgICA6IFRQcm90b2NvbCh0cmFucykKLSAgICAsIHN1YmNsYXNzXyhzdWJjbGFzc19uYW1lKQotICB7fQotCi0gIC8vIEFsbCB3cml0aW5nIGZ1bmN0aW9ucyByZW1haW4gYWJzdHJhY3QuCi0KLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zIGFsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzdWJjbGFzc187Ci19OwotCi0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIHByb3RvY29sIHRoYXQgY2FuIG9ubHkgYmUgcmVhZCwKLSAqIG5vdCB3cml0dGVuLgotICoKLSAqLwotY2xhc3MgVFJlYWRPbmx5UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBAcGFyYW0gc3ViY2xhc3NfbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzLgotICAgKi8KLSAgVFJlYWRPbmx5UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJjbGFzc19uYW1lKQotICAgIDogVFByb3RvY29sKHRyYW5zKQotICAgICwgc3ViY2xhc3NfKHN1YmNsYXNzX25hbWUpCi0gIHt9Ci0KLSAgLy8gQWxsIHJlYWRpbmcgZnVuY3Rpb25zIHJlbWFpbiBhYnN0cmFjdC4KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMgYWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICovCi0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIHN1YmNsYXNzXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2IwNjUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotCi0KLS8vIFVzZSB0aGlzIHRvIGdldCBhcm91bmQgc3RyaWN0IGFsaWFzaW5nIHJ1bGVzLgotLy8gRm9yIGV4YW1wbGUsIHVpbnQ2NF90IGkgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KHJldHVybnNfZG91YmxlKCkpOwotLy8gVGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBpcyB0byBqdXN0IGNhc3QgYSBwb2ludGVyLAotLy8gYnV0IHRoYXQgZG9lc24ndCB3b3JrLgotLy8gRm9yIGEgcHJldHR5IGluLWRlcHRoIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9ibGVtLCBzZWUKLS8vIGh0dHA6Ly93d3cuY2VsbHBlcmZvcm1hbmNlLmNvbS9taWtlX2FjdG9uLzIwMDYvMDYvICguLi4pCi0vLyB1bmRlcnN0YW5kaW5nX3N0cmljdF9hbGlhc2luZy5odG1sCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+Ci1zdGF0aWMgaW5saW5lIFRvIGJpdHdpc2VfY2FzdChGcm9tIGZyb20pIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSk7Ci0KLSAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KLSAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKLSAgLy9yZXR1cm4gKnN0YXRpY19jYXN0PFRvKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KCZmcm9tKSk7ICAvLyBCQUQhISEKLSAgLy9yZXR1cm4gKihUbyopKHZvaWQqKSZmcm9tOyAgLy8gQkFEISEhCi0KLSAgLy8gU3VwZXIgY2xlYW4gYW5kIHBhcml0YWxseSBibGVzc2VkIGJ5IHNlY3Rpb24gMy45IG9mIHRoZSBzdGFuZGFyZC4KLSAgLy91bnNpZ25lZCBjaGFyIGNbc2l6ZW9mKGZyb20pXTsKLSAgLy9tZW1jcHkoYywgJmZyb20sIHNpemVvZihmcm9tKSk7Ci0gIC8vVG8gdG87Ci0gIC8vbWVtY3B5KCZ0bywgYywgc2l6ZW9mKGMpKTsKLSAgLy9yZXR1cm4gdG87Ci0KLSAgLy8gU2xpZ2h0bHkgbW9yZSBxdWVzdGlvbmFibGUuCi0gIC8vIFNhbWUgY29kZSBlbWl0dGVkIGJ5IEdDQy4KLSAgLy9UbyB0bzsKLSAgLy9tZW1jcHkoJnRvLCAmZnJvbSwgc2l6ZW9mKGZyb20pKTsKLSAgLy9yZXR1cm4gdG87Ci0KLSAgLy8gVGVjaG5pY2FsbHkgdW5kZWZpbmVkLCBidXQgYWxtb3N0IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwKLSAgLy8gYW5kIHRoZSBtb3N0IGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAgdW5pb24gewotICAgIEZyb20gZjsKLSAgICBUbyB0OwotICB9IHU7Ci0gIHUuZiA9IGZyb207Ci0gIHJldHVybiB1LnQ7Ci19Ci0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotCi0jaWZkZWYgSEFWRV9FTkRJQU5fSAotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX19CWVRFX09SREVSCi0jIGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pCi0jICBkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKLSMgIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgotIyAgZGVmaW5lIF9fQklHX0VORElBTiBCSUdfRU5ESUFOCi0jIGVsc2UKLSMgIGluY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+Ci0jICBkZWZpbmUgX19CWVRFX09SREVSIEJPT1NUX0JZVEVfT1JERVIKLSMgIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gQk9PU1RfTElUVExFX0VORElBTgotIyAgZGVmaW5lIF9fQklHX0VORElBTiBCT09TVF9CSUdfRU5ESUFOCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSMgIGRlZmluZSBudG9obGwobikgKG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIChuKQotIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKLSMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgaHRvbGVsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGxldG9obGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBic3dhcF82NChuKSBcCi0gICAgICAoICgoKG4pICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikgXAotICAgICAgfCAoKChuKSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KSBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDBmZjAwMDAwMDAwdWxsKSA+PiA4KSAgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgOCkgIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KSBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpICkKLSMgIGRlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQotIyBlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KLSNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBodG9sZWxsKG4pIChuKQotIyAgZGVmaW5lIGxldG9obGwobikgKG4pCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vKioKLSAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgotICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyawotICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KLSAqLwotZW51bSBUVHlwZSB7Ci0gIFRfU1RPUCAgICAgICA9IDAsCi0gIFRfVk9JRCAgICAgICA9IDEsCi0gIFRfQk9PTCAgICAgICA9IDIsCi0gIFRfQllURSAgICAgICA9IDMsCi0gIFRfSTA4ICAgICAgICA9IDMsCi0gIFRfSTE2ICAgICAgICA9IDYsCi0gIFRfSTMyICAgICAgICA9IDgsCi0gIFRfVTY0ICAgICAgICA9IDksCi0gIFRfSTY0ICAgICAgICA9IDEwLAotICBUX0RPVUJMRSAgICAgPSA0LAotICBUX1NUUklORyAgICAgPSAxMSwKLSAgVF9VVEY3ICAgICAgID0gMTEsCi0gIFRfU1RSVUNUICAgICA9IDEyLAotICBUX01BUCAgICAgICAgPSAxMywKLSAgVF9TRVQgICAgICAgID0gMTQsCi0gIFRfTElTVCAgICAgICA9IDE1LAotICBUX1VURjggICAgICAgPSAxNiwKLSAgVF9VVEYxNiAgICAgID0gMTcKLX07Ci0KLS8qKgotICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAotICogc3VwcG9ydHMuCi0gKi8KLWVudW0gVE1lc3NhZ2VUeXBlIHsKLSAgVF9DQUxMICAgICAgID0gMSwKLSAgVF9SRVBMWSAgICAgID0gMiwKLSAgVF9FWENFUFRJT04gID0gMywKLSAgVF9PTkVXQVkgICAgID0gNAotfTsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYSB0aHJpZnQgcHJvdG9jb2wgZHJpdmVyLiBUaGVzZSBhcmUgYWxsIHRoZSBtZXRob2RzIHRoYXQKLSAqIGEgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQuIEVzc2VudGlhbGx5LCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IG9mIHJlYWRpbmcKLSAqIGFuZCB3cml0aW5nIGFsbCB0aGUgYmFzZSB0eXBlcywgcGx1cyBhIG1lY2hhbmlzbSBmb3Igd3JpdGluZyBvdXQgc3RydWN0cwotICogd2l0aCBpbmRleGVkIGZpZWxkcy4KLSAqCi0gKiBUUHJvdG9jb2wgb2JqZWN0cyBzaG91bGQgbm90IGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgZW5jb2RpbmcgY29udGV4dHMsCi0gKiBhcyB0aGV5IG1heSBuZWVkIHRvIG1haW50YWluIGludGVybmFsIHN0YXRlIGluIHNvbWUgcHJvdG9jb2xzIChpLmUuIFhNTCkuCi0gKiBOb3RlIHRoYXQgaXMgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIFRQcm90b2NvbCBtb2R1bGUgdG8gZG8gaXRzIG93biBpbnRlcm5hbAotICogYnVmZmVyZWQgcmVhZHMvd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIFRUcmFuc3BvcnQgd2hlcmUgYXBwcm9wcmlhdGUgKGkuZS4KLSAqIHdoZW4gcGFyc2luZyBhbiBpbnB1dCBYTUwgc3RyZWFtLCByZWFkaW5nIHNob3VsZCBiZSBiYXRjaGVkIHJhdGhlciB0aGFuCi0gKiBsb29raW5nIGFoZWFkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgZm9yIGEgY2xvc2UgdGFnKS4KLSAqCi0gKi8KLWNsYXNzIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UUHJvdG9jb2woKSB7fQotCi0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgPSAwOwotCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSByZWYpIHsKLSAgICBib29sIHZhbHVlOwotICAgIHVpbnQzMl90IHJ2ID0gcmVhZEJvb2wodmFsdWUpOwotICAgIHJlZiA9IHZhbHVlOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEuCi0gICAqLwotICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIHsKLSAgICAgICAgYm9vbCBib29sdjsKLSAgICAgICAgcmV0dXJuIHJlYWRCb29sKGJvb2x2KTsKLSAgICAgIH0KLSAgICBjYXNlIFRfQllURToKLSAgICAgIHsKLSAgICAgICAgaW50OF90IGJ5dGV2OwotICAgICAgICByZXR1cm4gcmVhZEJ5dGUoYnl0ZXYpOwotICAgICAgfQotICAgIGNhc2UgVF9JMTY6Ci0gICAgICB7Ci0gICAgICAgIGludDE2X3QgaTE2OwotICAgICAgICByZXR1cm4gcmVhZEkxNihpMTYpOwotICAgICAgfQotICAgIGNhc2UgVF9JMzI6Ci0gICAgICB7Ci0gICAgICAgIGludDMyX3QgaTMyOwotICAgICAgICByZXR1cm4gcmVhZEkzMihpMzIpOwotICAgICAgfQotICAgIGNhc2UgVF9JNjQ6Ci0gICAgICB7Ci0gICAgICAgIGludDY0X3QgaTY0OwotICAgICAgICByZXR1cm4gcmVhZEk2NChpNjQpOwotICAgICAgfQotICAgIGNhc2UgVF9ET1VCTEU6Ci0gICAgICB7Ci0gICAgICAgIGRvdWJsZSBkdWI7Ci0gICAgICAgIHJldHVybiByZWFkRG91YmxlKGR1Yik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX1NUUklORzoKLSAgICAgIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICAgICByZXR1cm4gcmVhZEJpbmFyeShzdHIpOwotICAgICAgfQotICAgIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgIGludDE2X3QgZmlkOwotICAgICAgICBUVHlwZSBmdHlwZTsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICByZXN1bHQgKz0gcmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdCArPSBza2lwKGZ0eXBlKTsKLSAgICAgICAgICByZXN1bHQgKz0gcmVhZEZpZWxkRW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHJlYWRTdHJ1Y3RFbmQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRfTUFQOgotICAgICAgewotICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgICBUVHlwZSBrZXlUeXBlOwotICAgICAgICBUVHlwZSB2YWxUeXBlOwotICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gcmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHNraXAoa2V5VHlwZSk7Ci0gICAgICAgICAgcmVzdWx0ICs9IHNraXAodmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHJlYWRNYXBFbmQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRfU0VUOgotICAgICAgewotICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgICBUVHlwZSBlbGVtVHlwZTsKLSAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICByZXN1bHQgKz0gc2tpcChlbGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHJlYWRTZXRFbmQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRfTElTVDoKLSAgICAgIHsKLSAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgICAgVFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgIHJlc3VsdCArPSBza2lwKGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gcmVhZExpc3RFbmQoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gcHRyYW5zXzsKLSAgfQotCi0gIC8vIFRPRE86IHJlbW92ZSB0aGVzZSB0d28gY2FsbHMsIHRoZXkgYXJlIGZvciBiYWNrd2FyZHMKLSAgLy8gY29tcGF0aWJpbGl0eQotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0SW5wdXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gcHRyYW5zXzsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBUUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKToKLSAgICBwdHJhbnNfKHB0cmFucykgewotICAgIHRyYW5zXyA9IHB0cmFucy5nZXQoKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187Ci0gIFRUcmFuc3BvcnQqIHRyYW5zXzsKLQotIHByaXZhdGU6Ci0gIFRQcm90b2NvbCgpIHt9Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCi0gKi8KLWNsYXNzIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVFByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA9IDA7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwM2QzYzguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgcHJvdG9jb2wgZXJyb3JzIHRoYXQgbWF5Ci0gKiBvY2N1ciBpbiB2YXJpb3VzIHByb3RvY29sIHN5c3RlbXMuIFRoaXMgcHJvdmlkZXMgYSBzb3J0IG9mIGdlbmVyaWMKLSAqIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWd1ZSBVTklYIEVfIGVycm9yIGNvZGVzIHRoYXQgbGV0cyBhIGNvbW1vbiBjb2RlCi0gKiBiYXNlIG9mIGVycm9yIGhhbmRsaW5nIHRvIGJlIHVzZWQgZm9yIHZhcmlvdXMgdHlwZXMgb2YgcHJvdG9jb2xzLCBpLmUuCi0gKiBwaXBlcyBldGMuCi0gKgotICovCi1jbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewotIHB1YmxpYzoKLQotICAvKioKLSAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCi0gICAqLwotICBlbnVtIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUKLSAgeyBVTktOT1dOID0gMAotICAsIElOVkFMSURfREFUQSA9IDEKLSAgLCBORUdBVElWRV9TSVpFID0gMgotICAsIFNJWkVfTElNSVQgPSAzCi0gICwgQkFEX1ZFUlNJT04gPSA0Ci0gICwgTk9UX0lNUExFTUVOVEVEID0gNQotICB9OwotCi0gIFRQcm90b2NvbEV4Y2VwdGlvbigpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KLQotICBUUHJvdG9jb2xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KLQotICB2aXJ0dWFsIH5UUHJvdG9jb2xFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCi0gICAqIHRoYXQgaGFzIG9jY3VycmVkLgotICAgKgotICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKLSAgICovCi0gIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBVbmtub3duIHByb3RvY29sIGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgSU5WQUxJRF9EQVRBICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgZGF0YSI7Ci0gICAgICAgIGNhc2UgTkVHQVRJVkVfU0laRSAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5lZ2F0aXZlIHNpemUiOwotICAgICAgICBjYXNlIFNJWkVfTElNSVQgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBFeGNlZWRlZCBzaXplIGxpbWl0IjsKLSAgICAgICAgY2FzZSBCQURfVkVSU0lPTiAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCB2ZXJzaW9uIjsKLSAgICAgICAgY2FzZSBOT1RfSU1QTEVNRU5URUQgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTm90IGltcGxlbWVudGVkIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBFcnJvciBjb2RlCi0gICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGVfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgwMjE2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCi0KLSNpbmNsdWRlIDxwcm90b2NvbC9UT25lV2F5UHJvdG9jb2wuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotCi0vKioKLSAqIFB1dHMgYSB3aXJldGFwIG9uIGEgcHJvdG9jb2wgb2JqZWN0LiAgQW55IHJlYWRzIHRvIHRoaXMgY2xhc3MgYXJlIHBhc3NlZAotICogdGhyb3VnaCB0byBhbiBlbmNsb3NlZCBwcm90b2NvbCBvYmplY3QsIGJ1dCBhbHNvIG1pcnJvcmVkIGFzIHdyaXRlIHRvIGEKLSAqIHNlY29uZCBwcm90b2NvbCBvYmplY3QuCi0gKgotICovCi1jbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFJlYWRPbmx5UHJvdG9jb2wgewotIHB1YmxpYzoKLSAgIFRQcm90b2NvbFRhcChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCi0gICAgIDogVFJlYWRPbmx5UHJvdG9jb2woc291cmNlLT5nZXRUcmFuc3BvcnQoKSwgIlRQcm90b2NvbFRhcCIpCi0gICAgICwgc291cmNlXyhzb3VyY2UpCi0gICAgICwgc2lua18oc2luaykKLSAge30KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKLSAgICBzaW5rXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgewotICAgICAgc2lua18tPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpbmtfLT53cml0ZUZpZWxkQmVnaW4obmFtZS5jX3N0cigpLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgc2lua18tPndyaXRlRmllbGRFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gICAgc2lua18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwRW5kKCk7Ci0gICAgc2lua18tPndyaXRlTWFwRW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICBzaW5rXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgc2lua18tPndyaXRlTGlzdEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgc2lua18tPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kKCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEVuZCgpOwotICAgIHNpbmtfLT53cml0ZVNldEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCb29sKHZhbHVlKTsKLSAgICBzaW5rXy0+d3JpdGVCb29sKHZhbHVlKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJ5dGUoYnl0ZSk7Ci0gICAgc2lua18tPndyaXRlQnl0ZShieXRlKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTE2KGkxNik7Ci0gICAgc2lua18tPndyaXRlSTE2KGkxNik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkzMihpMzIpOwotICAgIHNpbmtfLT53cml0ZUkzMihpMzIpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJNjQoaTY0KTsKLSAgICBzaW5rXy0+d3JpdGVJNjQoaTY0KTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWREb3VibGUoZHViKTsKLSAgICBzaW5rXy0+d3JpdGVEb3VibGUoZHViKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cmluZyhzdHIpOwotICAgIHNpbmtfLT53cml0ZVN0cmluZyhzdHIpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQmluYXJ5KHN0cik7Ci0gICAgc2lua18tPndyaXRlQmluYXJ5KHN0cik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjNlNjkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVE5vbmJsb2NraW5nU2VydmVyLmgiCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2lmbmRlZiBBRl9MT0NBTAotI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotY2xhc3MgVENvbm5lY3Rpb246OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICBUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSA6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHdoaWxlIChwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XykpIHsKLSAgICAgICAgaWYgKCFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIGNsaWVudCBkaWVkOiAiIDw8IHR0eC53aGF0KCkgPDwgZW5kbDsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB4KSB7Ci0gICAgICBjZXJyIDw8ICJUTm9uYmxvY2tpbmdTZXJ2ZXIgZXhjZXB0aW9uOiAiIDw8IHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgfSBjYXRjaCAoYmFkX2FsbG9jJikgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiI7Ci0gICAgICBleGl0KC0xKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGNlcnIgPDwgIlROb25ibG9ja2luZ1NlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpZ25hbCBjb21wbGV0aW9uIGJhY2sgdG8gdGhlIGxpYmV2ZW50IHRocmVhZCB2aWEgYSBwaXBlCi0gICAgaWYgKCFjb25uZWN0aW9uXy0+bm90aWZ5U2VydmVyKCkpIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKLSAgICB9Ci0gIH0KLQotICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25fOwotICB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87Ci19OwotCi12b2lkIFRDb25uZWN0aW9uOjppbml0KGludCBzb2NrZXQsIHNob3J0IGV2ZW50RmxhZ3MsIFROb25ibG9ja2luZ1NlcnZlciogcykgewotICBzb2NrZXRfID0gc29ja2V0OwotICBzZXJ2ZXJfID0gczsKLSAgYXBwU3RhdGVfID0gQVBQX0lOSVQ7Ci0gIGV2ZW50RmxhZ3NfID0gMDsKLQotICByZWFkQnVmZmVyUG9zXyA9IDA7Ci0gIHJlYWRXYW50XyA9IDA7Ci0KLSAgd3JpdGVCdWZmZXJfID0gTlVMTDsKLSAgd3JpdGVCdWZmZXJTaXplXyA9IDA7Ci0gIHdyaXRlQnVmZmVyUG9zXyA9IDA7Ci0KLSAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7Ci0gIGFwcFN0YXRlXyA9IEFQUF9JTklUOwotCi0gIC8vIFNldCBmbGFncywgd2hpY2ggYWxzbyByZWdpc3RlcnMgdGhlIGV2ZW50Ci0gIHNldEZsYWdzKGV2ZW50RmxhZ3MpOwotCi0gIC8vIGdldCBpbnB1dC90cmFuc3BvcnRzCi0gIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPSBzLT5nZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gcy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7Ci0KLSAgLy8gQ3JlYXRlIHByb3RvY29sCi0gIGlucHV0UHJvdG9jb2xfID0gcy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7Ci0gIG91dHB1dFByb3RvY29sXyA9IHMtPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7Ci19Ci0KLXZvaWQgVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSB7Ci0gIGludCBmbGFncz0wLCBnb3Q9MCwgbGVmdD0wLCBzZW50PTA7Ci0gIHVpbnQzMl90IGZldGNoID0gMDsKLQotICBzd2l0Y2ggKHNvY2tldFN0YXRlXykgewotICBjYXNlIFNPQ0tFVF9SRUNWOgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGJlIGluIHRoaXMgc3RhdGUgaWYgd2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YQotICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8IHJlYWRXYW50Xyk7Ci0KLSAgICAvLyBEb3VibGUgdGhlIGJ1ZmZlciBzaXplIHVudGlsIGl0IGlzIGJpZyBlbm91Z2gKLSAgICBpZiAocmVhZFdhbnRfID4gcmVhZEJ1ZmZlclNpemVfKSB7Ci0gICAgICB1aW50MzJfdCBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOwotICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKLSAgICAgICAgbmV3U2l6ZSAqPSAyOwotICAgICAgfQotICAgICAgdWludDhfdCogbmV3QnVmZmVyID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyZWFkQnVmZmVyXywgbmV3U2l6ZSk7Ci0gICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHJlYWxsb2MiKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXdCdWZmZXI7Ci0gICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOwotICAgIH0KLQotICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0Ci0gICAgZmV0Y2ggPSByZWFkV2FudF8gLSByZWFkQnVmZmVyUG9zXzsKLSAgICBnb3QgPSByZWN2KHNvY2tldF8sIHJlYWRCdWZmZXJfICsgcmVhZEJ1ZmZlclBvc18sIGZldGNoLCAwKTsKLQotICAgIGlmIChnb3QgPiAwKSB7Ci0gICAgICAvLyBNb3ZlIGFsb25nIGluIHRoZSBidWZmZXIKLSAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGdvdDsKLQotICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWQgbm90IG92ZXJkbyBpdAotICAgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDw9IHJlYWRXYW50Xyk7Ci0KLSAgICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcsIG1vdmUgb250byB0aGUgbmV4dCBzdGF0ZQotICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfID09IHJlYWRXYW50XykgewotICAgICAgICB0cmFuc2l0aW9uKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChnb3QgPT0gLTEpIHsKLSAgICAgIC8vIEJsb2NraW5nIGVycm9ycyBhcmUgb2theSwganVzdCBtb3ZlIG9uCi0gICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKGVycm5vICE9IEVDT05OUkVTRVQpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSByZWN2IC0xICIsIGVycm5vKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXaGVuZXZlciB3ZSBnZXQgZG93biBoZXJlIGl0IG1lYW5zIGEgcmVtb3RlIGRpc2Nvbm5lY3QKLSAgICBjbG9zZSgpOwotCi0gICAgcmV0dXJuOwotCi0gIGNhc2UgU09DS0VUX1NFTkQ6Ci0gICAgLy8gU2hvdWxkIG5ldmVyIGhhdmUgcG9zaXRpb24gcGFzdCBzaXplCi0gICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZCwgdGhlbiBsZXQgdXMgbW92ZSBvbgotICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgewotICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kXG4iKTsKLSAgICAgIHRyYW5zaXRpb24oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbGFncyA9IDA7Ci0gICAgI2lmZGVmIE1TR19OT1NJR05BTAotICAgIC8vIE5vdGUgdGhlIHVzZSBvZiBNU0dfTk9TSUdOQUwgdG8gc3VwcHJlc3MgU0lHUElQRSBlcnJvcnMsIGluc3RlYWQgd2UKLSAgICAvLyBjaGVjayBmb3IgdGhlIEVQSVBFIHJldHVybiBjb25kaXRpb24gYW5kIGNsb3NlIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlCi0gICAgZmxhZ3MgfD0gTVNHX05PU0lHTkFMOwotICAgICNlbmRpZiAvLyBpZmRlZiBNU0dfTk9TSUdOQUwKLQotICAgIGxlZnQgPSB3cml0ZUJ1ZmZlclNpemVfIC0gd3JpdGVCdWZmZXJQb3NfOwotICAgIHNlbnQgPSBzZW5kKHNvY2tldF8sIHdyaXRlQnVmZmVyXyArIHdyaXRlQnVmZmVyUG9zXywgbGVmdCwgZmxhZ3MpOwotCi0gICAgaWYgKHNlbnQgPD0gMCkgewotICAgICAgLy8gQmxvY2tpbmcgZXJyb3JzIGFyZSBva2F5LCBqdXN0IG1vdmUgb24KLSAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGVycm5vICE9IEVQSVBFKSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgc2VuZCAtMSAiLCBlcnJubyk7Ci0gICAgICB9Ci0gICAgICBjbG9zZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdyaXRlQnVmZmVyUG9zXyArPSBzZW50OwotCi0gICAgLy8gRGlkIHdlIG92ZXJkbyBpdD8KLSAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyU2l6ZV8pOwotCi0gICAgLy8gV2UgYXJlIGRvbmUhCi0gICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7Ci0gICAgICB0cmFuc2l0aW9uKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotCi0gIGRlZmF1bHQ6Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVW5leHBlY3RlZCBTb2NrZXQgU3RhdGUgJWQiLCBzb2NrZXRTdGF0ZV8pOwotICAgIGFzc2VydCgwKTsKLSAgfQotfQotCi0vKioKLSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KLSAqIGFub3RoZXIuIFRoaXMgbWVhbnMgdGhhdCBpdCBoYXMgZmluaXNoZWQgd3JpdGluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZAotICogdG8sIG9yIGZpbmlzaGVkIHJlY2VpdmluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZCB0by4KLSAqLwotdm9pZCBUQ29ubmVjdGlvbjo6dHJhbnNpdGlvbigpIHsKLQotICBpbnQgc3ogPSAwOwotCi0gIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKLSAgc3dpdGNoIChhcHBTdGF0ZV8pIHsKLQotICBjYXNlIEFQUF9SRUFEX1JFUVVFU1Q6Ci0gICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKLSAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCi0gICAgLy8gSWYgd2UndmUgdXNlZCB0aGVzZSB0cmFuc3BvcnQgYnVmZmVycyBlbm91Z2ggdGltZXMsIHJlc2V0IHRoZW0gdG8gYXZvaWQgYmxvYXRpbmcKLQotICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJQb3NfKTsKLSAgICArK251bVJlYWRzU2luY2VSZXNldF87Ci0gICAgaWYgKG51bVdyaXRlc1NpbmNlUmVzZXRfIDwgNTEyKSB7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyByZXNldCB0aGUgY2FwYWNpdHkgb2YgdGhlIG91dHB1dCB0cmFuc3BvcnQgaWYgd2UgdXNlZCBpdCBlbm91Z2ggdGltZXMgdGhhdCBpdCBtaWdodCBiZSBibG9hdGVkCi0gICAgICB0cnkgewotICAgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcih0cnVlKTsKLSAgICAgICAgbnVtV3JpdGVzU2luY2VSZXNldF8gPSAwOwotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUcmFuc3BvcnRFeGNlcHRpb246IFRNZW1vcnlCdWZmZXI6OnJlc2V0QnVmZmVyKCkgJXMiLCB0dHgud2hhdCgpKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFByZXBlbmQgZm91ciBieXRlcyBvZiBibGFuayBzcGFjZSB0byB0aGUgYnVmZmVyIHNvIHdlIGNhbgotICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgotICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldFdyaXRlUHRyKDQpOwotICAgIG91dHB1dFRyYW5zcG9ydF8tPndyb3RlQnl0ZXMoNCk7Ci0KLSAgICBzZXJ2ZXJfLT5pbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0KLSAgICBpZiAoc2VydmVyXy0+aXNUaHJlYWRQb29sUHJvY2Vzc2luZygpKSB7Ci0gICAgICAvLyBXZSBhcmUgc2V0dGluZyB1cCBhIFRhc2sgdG8gZG8gdGhpcyB3b3JrIGFuZCB3ZSB3aWxsIHdhaXQgb24gaXQKLQotICAgICAgLy8gQ3JlYXRlIHRhc2sgYW5kIGRpc3BhdGNoIHRvIHRoZSB0aHJlYWQgbWFuYWdlcgotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPQotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4obmV3IFRhc2soc2VydmVyXy0+Z2V0UHJvY2Vzc29yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKLSAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKLSAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBzZXJ2ZXJfLT5hZGRUYXNrKHRhc2spOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gJiBpc2UpIHsKLSAgICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgotICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKLSAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCi0gICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCi0gICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCi0gICAgICBzZXRJZGxlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIEludm9rZSB0aGUgcHJvY2Vzc29yCi0gICAgICAgIHNlcnZlcl8tPmdldFByb2Nlc3NvcigpLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUcmFuc3BvcnRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdHR4LndoYXQoKSk7Ci0gICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmeCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJURXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHgud2hhdCgpKTsKLSAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU2VydmVyOjpwcm9jZXNzKCkgdW5rbm93biBleGNlcHRpb24iKTsKLSAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSwgdGhlIGNhbGwgdG8gcHJvY2VzcyBoYXMgd3JpdHRlbiBpbnRvCi0gICAgLy8gdGhlIHdyaXRlQnVmZmVyXwotCi0gIGNhc2UgQVBQX1dBSVRfVEFTSzoKLSAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgdGFzayBhbmQgdGhlIHJlc3VsdCBoYXMgYmVlbiB3cml0dGVuCi0gICAgLy8gaW50byB0aGUgb3V0cHV0VHJhbnNwb3J0Xywgc28gd2UgZ3JhYiBpdHMgY29udGVudHMgYW5kIHBsYWNlIHRoZW0gaW50bwotICAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8gZm9yIGFjdHVhbCB3cml0aW5nIGJ5IHRoZSBsaWJldmVudCB0aHJlYWQKLQotICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0QnVmZmVyKCZ3cml0ZUJ1ZmZlcl8sICZ3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIElmIHRoZSBmdW5jdGlvbiBjYWxsIGdlbmVyYXRlZCByZXR1cm4gZGF0YSwgdGhlbiBtb3ZlIGludG8gdGhlIHNlbmQKLSAgICAvLyBzdGF0ZSBhbmQgZ2V0IGdvaW5nCi0gICAgLy8gNCBieXRlcyB3ZXJlIHJlc2VydmVkIGZvciBmcmFtZSBzaXplCi0gICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiA0KSB7Ci0KLSAgICAgIC8vIE1vdmUgaW50byB3cml0ZSBzdGF0ZQotICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKLSAgICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9TRU5EOwotCi0gICAgICAvLyBQdXQgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgd3JpdGUgYnVmZmVyCi0gICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IChpbnQzMl90KWh0b25sKHdyaXRlQnVmZmVyU2l6ZV8gLSA0KTsKLSAgICAgIG1lbWNweSh3cml0ZUJ1ZmZlcl8sICZmcmFtZVNpemUsIDQpOwotCi0gICAgICAvLyBTb2NrZXQgaW50byB3cml0ZSBtb2RlCi0gICAgICBhcHBTdGF0ZV8gPSBBUFBfU0VORF9SRVNVTFQ7Ci0gICAgICBzZXRXcml0ZSgpOwotCi0gICAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IGltbWVkaWF0ZWx5Ci0gICAgICAvLyB3b3JrU29ja2V0KCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXF1ZXN0IHdhcyBvbmV3YXkgYW5kIHdlIHNob3VsZCBmYWxsIHRocm91Z2gKLSAgICAvLyByaWdodCBiYWNrIGludG8gdGhlIHJlYWQgZnJhbWUgaGVhZGVyIHN0YXRlCi0gICAgZ290byBMQUJFTF9BUFBfSU5JVDsKLQotICBjYXNlIEFQUF9TRU5EX1JFU1VMVDoKLQotICAgICsrbnVtV3JpdGVzU2luY2VSZXNldF87Ci0KLSAgICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKLQotICBMQUJFTF9BUFBfSU5JVDoKLSAgY2FzZSBBUFBfSU5JVDoKLQotICAgIC8vIHJlc2V0IHRoZSBpbnB1dCBidWZmZXIgaWYgd2UgdXNlZCBpdCBlbm91Z2ggdGltZXMgdGhhdCBpdCBtaWdodCBiZSBibG9hdGVkCi0gICAgaWYgKG51bVJlYWRzU2luY2VSZXNldF8gPiA1MTIpCi0gICAgewotICAgICAgdm9pZCAqIG5ld19idWZmZXIgPSBzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIDEwMjQpOwotICAgICAgaWYgKG5ld19idWZmZXIgPT0gTlVMTCkgewotICAgICAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjp0cmFuc2l0aW9uKCkgcmVhbGxvYyIpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZWFkQnVmZmVyXyA9ICh1aW50OF90KikgbmV3X2J1ZmZlcjsKLSAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDEwMjQ7Ci0gICAgICBudW1SZWFkc1NpbmNlUmVzZXRfID0gMDsKLSAgICB9Ci0KLSAgICAvLyBDbGVhciB3cml0ZSBidWZmZXIgdmFyaWFibGVzCi0gICAgd3JpdGVCdWZmZXJfID0gTlVMTDsKLSAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOwotICAgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwotCi0gICAgLy8gU2V0IHVwIHJlYWQgYnVmZmVyIGZvciBnZXR0aW5nIDQgYnl0ZXMKLSAgICByZWFkQnVmZmVyUG9zXyA9IDA7Ci0gICAgcmVhZFdhbnRfID0gNDsKLQotICAgIC8vIEludG8gcmVhZDQgc3RhdGUgd2UgZ28KLSAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVjsKLSAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9GUkFNRV9TSVpFOwotCi0gICAgLy8gUmVnaXN0ZXIgcmVhZCBldmVudAotICAgIHNldFJlYWQoKTsKLQotICAgIC8vIFRyeSB0byB3b3JrIHRoZSBzb2NrZXQgcmlnaHQgYXdheQotICAgIC8vIHdvcmtTb2NrZXQoKTsKLQotICAgIHJldHVybjsKLQotICBjYXNlIEFQUF9SRUFEX0ZSQU1FX1NJWkU6Ci0gICAgLy8gV2UganVzdCByZWFkIHRoZSByZXF1ZXN0IGxlbmd0aCwgZGVzZXJpYWxpemUgaXQKLSAgICBzeiA9ICooaW50MzJfdCopcmVhZEJ1ZmZlcl87Ci0gICAgc3ogPSAoaW50MzJfdCludG9obChzeik7Ci0KLSAgICBpZiAoc3ogPD0gMCkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246dHJhbnNpdGlvbigpIE5lZ2F0aXZlIGZyYW1lIHNpemUgJWQsIHJlbW90ZSBzaWRlIG5vdCB1c2luZyBURnJhbWVkVHJhbnNwb3J0PyIsIHN6KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgdGhlIHJlYWQgYnVmZmVyCi0gICAgcmVhZFdhbnRfID0gKHVpbnQzMl90KXN6OwotICAgIHJlYWRCdWZmZXJQb3NfPSAwOwotCi0gICAgLy8gTW92ZSBpbnRvIHJlYWQgcmVxdWVzdCBzdGF0ZQotICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX1JFUVVFU1Q7Ci0KLSAgICAvLyBXb3JrIHRoZSBzb2NrZXQgcmlnaHQgYXdheQotICAgIC8vIHdvcmtTb2NrZXQoKTsKLQotICAgIHJldHVybjsKLQotICBjYXNlIEFQUF9DTE9TRV9DT05ORUNUSU9OOgotICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICBjbG9zZSgpOwotICAgIHJldHVybjsKLQotICBkZWZhdWx0OgotICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gU3RhdGUgJWQiLCBhcHBTdGF0ZV8pOwotICAgIGFzc2VydCgwKTsKLSAgfQotfQotCi12b2lkIFRDb25uZWN0aW9uOjpzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKSB7Ci0gIC8vIENhdGNoIHRoZSBkbyBub3RoaW5nIGNhc2UKLSAgaWYgKGV2ZW50RmxhZ3NfID09IGV2ZW50RmxhZ3MpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBEZWxldGUgYSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50Ci0gIGlmIChldmVudEZsYWdzXyAhPSAwKSB7Ci0gICAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MgZXZlbnRfZGVsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gVXBkYXRlIGluIG1lbW9yeSBzdHJ1Y3R1cmUKLSAgZXZlbnRGbGFnc18gPSBldmVudEZsYWdzOwotCi0gIC8vIERvIG5vdCBjYWxsIGV2ZW50X3NldCBpZiB0aGVyZSBhcmUgbm8gZmxhZ3MKLSAgaWYgKCFldmVudEZsYWdzXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8qCi0gICAqIGV2ZW50X3NldDoKLSAgICoKLSAgICogUHJlcGFyZXMgdGhlIGV2ZW50IHN0cnVjdHVyZSAmZXZlbnQgdG8gYmUgdXNlZCBpbiBmdXR1cmUgY2FsbHMgdG8KLSAgICogZXZlbnRfYWRkKCkgYW5kIGV2ZW50X2RlbCgpLiAgVGhlIGV2ZW50IHdpbGwgYmUgcHJlcGFyZWQgdG8gY2FsbCB0aGUKLSAgICogZXZlbnRIYW5kbGVyIHVzaW5nIHRoZSAnc29jaycgZmlsZSBkZXNjcmlwdG9yIHRvIG1vbml0b3IgZXZlbnRzLgotICAgKgotICAgKiBUaGUgZXZlbnRzIGNhbiBiZSBlaXRoZXIgRVZfUkVBRCwgRVZfV1JJVEUsIG9yIGJvdGgsIGluZGljYXRpbmcKLSAgICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gcmVhZCBvciB3cml0ZSBmcm9tIHRoZSBmaWxlIHJlc3BlY3RpdmVseSB3aXRob3V0Ci0gICAqIGJsb2NraW5nLgotICAgKgotICAgKiBUaGUgZXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRyaWdnZXJlZAotICAgKiB0aGUgZXZlbnQgYW5kIHRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIHdpbGwgYmUgb25lIG9mOiBFVl9USU1FT1VULAotICAgKiBFVl9TSUdOQUwsIEVWX1JFQUQsIEVWX1dSSVRFLgotICAgKgotICAgKiBUaGUgYWRkaXRpb25hbCBmbGFnIEVWX1BFUlNJU1QgbWFrZXMgYW4gZXZlbnRfYWRkKCkgcGVyc2lzdGVudCB1bnRpbAotICAgKiBldmVudF9kZWwoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAqCi0gICAqIE9uY2UgaW5pdGlhbGl6ZWQsIHRoZSAmZXZlbnQgc3RydWN0IGNhbiBiZSB1c2VkIHJlcGVhdGVkbHkgd2l0aAotICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVpbml0aWFsaXplZCB1bmxlc3MKLSAgICogdGhlIGV2ZW50SGFuZGxlciBhbmQvb3IgdGhlIGFyZ3VtZW50IHRvIGl0IGFyZSB0byBiZSBjaGFuZ2VkLiAgSG93ZXZlciwKLSAgICogd2hlbiBhbiBldiBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWRkZWQgdG8gbGliZXZlbnQgdXNpbmcgZXZlbnRfYWRkKCkgdGhlCi0gICAqIHN0cnVjdHVyZSBtdXN0IHBlcnNpc3QgdW50aWwgdGhlIGV2ZW50IG9jY3VycyAoYXNzdW1pbmcgRVZfUEVSU0lTVAotICAgKiBpcyBub3Qgc2V0KSBvciBpcyByZW1vdmVkIHVzaW5nIGV2ZW50X2RlbCgpLiAgWW91IG1heSBub3QgcmV1c2UgdGhlIHNhbWUKLSAgICogZXYgc3RydWN0dXJlIGZvciBtdWx0aXBsZSBtb25pdG9yZWQgZGVzY3JpcHRvcnM7IGVhY2ggZGVzY3JpcHRvciBuZWVkcwotICAgKiBpdHMgb3duIGV2LgotICAgKi8KLSAgZXZlbnRfc2V0KCZldmVudF8sIHNvY2tldF8sIGV2ZW50RmxhZ3NfLCBUQ29ubmVjdGlvbjo6ZXZlbnRIYW5kbGVyLCB0aGlzKTsKLSAgZXZlbnRfYmFzZV9zZXQoc2VydmVyXy0+Z2V0RXZlbnRCYXNlKCksICZldmVudF8pOwotCi0gIC8vIEFkZCB0aGUgZXZlbnQKLSAgaWYgKGV2ZW50X2FkZCgmZXZlbnRfLCAwKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiKTsKLSAgfQotfQotCi0vKioKLSAqIENsb3NlcyBhIGNvbm5lY3Rpb24KLSAqLwotdm9pZCBUQ29ubmVjdGlvbjo6Y2xvc2UoKSB7Ci0gIC8vIERlbGV0ZSB0aGUgcmVnaXN0ZXJlZCBsaWJldmVudAotICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6Y2xvc2UoKSBldmVudF9kZWwiKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBzb2NrZXQKLSAgaWYgKHNvY2tldF8gPj0gMCkgewotICAgIDo6Y2xvc2Uoc29ja2V0Xyk7Ci0gIH0KLSAgc29ja2V0XyA9IC0xOwotCi0gIC8vIGNsb3NlIGFueSBmYWN0b3J5IHByb2R1Y2VkIHRyYW5zcG9ydHMKLSAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0KLSAgLy8gR2l2ZSB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBzZXJ2ZXIgdGhhdCBvd25zIGl0Ci0gIHNlcnZlcl8tPnJldHVybkNvbm5lY3Rpb24odGhpcyk7Ci19Ci0KLXZvaWQgVENvbm5lY3Rpb246OmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCBsaW1pdCkgewotICBpZiAocmVhZEJ1ZmZlclNpemVfID4gbGltaXQpIHsKLSAgICByZWFkQnVmZmVyU2l6ZV8gPSBsaW1pdDsKLSAgICByZWFkQnVmZmVyXyA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJTaXplXyk7Ci0gICAgaWYgKHJlYWRCdWZmZXJfID09IE5VTEwpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KCkgcmVhbGxvYyIpOwotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gZWl0aGVyIGJ5IHJldXNpbmcgYW4gb2JqZWN0IG9mZiB0aGUgc3RhY2sgb3IKLSAqIGJ5IGFsbG9jYXRpbmcgYSBuZXcgb25lIGVudGlyZWx5Ci0gKi8KLVRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oaW50IHNvY2tldCwgc2hvcnQgZmxhZ3MpIHsKLSAgLy8gQ2hlY2sgdGhlIHN0YWNrCi0gIGlmIChjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgZmxhZ3MsIHRoaXMpOwotICB9IGVsc2UgewotICAgIFRDb25uZWN0aW9uKiByZXN1bHQgPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOwotICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7Ci0gICAgcmVzdWx0LT5pbml0KHNvY2tldCwgZmxhZ3MsIHRoaXMpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byB0aGUgc3RhY2sKLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKLSAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJgotICAgICAgKGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpID49IGNvbm5lY3Rpb25TdGFja0xpbWl0XykpIHsKLSAgICBkZWxldGUgY29ubmVjdGlvbjsKLSAgfSBlbHNlIHsKLSAgICBjb25uZWN0aW9uLT5jaGVja0lkbGVCdWZmZXJNZW1MaW1pdChpZGxlQnVmZmVyTWVtTGltaXRfKTsKLSAgICBjb25uZWN0aW9uU3RhY2tfLnB1c2goY29ubmVjdGlvbik7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nIGNsaWVudAotICogY29ubmVjdGlvbnMgb24gZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmhhbmRsZUV2ZW50KGludCBmZCwgc2hvcnQgd2hpY2gpIHsKLSAgLy8gTWFrZSBzdXJlIHRoYXQgbGliZXZlbnQgZGlkbid0IG1lc3MgdXAgdGhlIHNvY2tldCBoYW5kbGVzCi0gIGFzc2VydChmZCA9PSBzZXJ2ZXJTb2NrZXRfKTsKLQotICAvLyBTZXJ2ZXIgc29ja2V0IGFjY2VwdGVkIGEgbmV3IGNvbm5lY3Rpb24KLSAgc29ja2xlbl90IGFkZHJMZW47Ci0gIHN0cnVjdCBzb2NrYWRkciBhZGRyOwotICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotCi0gIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0Ci0gIGludCBjbGllbnRTb2NrZXQ7Ci0KLSAgLy8gQWNjZXB0IGFzIG1hbnkgbmV3IGNsaWVudHMgYXMgcG9zc2libGUsIGV2ZW4gdGhvdWdoIGxpYmV2ZW50IHNpZ25hbGVkIG9ubHkKLSAgLy8gb25lLCB0aGlzIGhlbHBzIHVzIHRvIGF2b2lkIGhhdmluZyB0byBnbyBiYWNrIGludG8gdGhlIGxpYmV2ZW50IGVuZ2luZSBzbwotICAvLyBtYW55IHRpbWVzCi0gIHdoaWxlICgoY2xpZW50U29ja2V0ID0gYWNjZXB0KGZkLCAmYWRkciwgJmFkZHJMZW4pKSAhPSAtMSkgewotICAgIC8vIElmIHdlJ3JlIG92ZXJsb2FkZWQsIHRha2UgYWN0aW9uIGhlcmUKLSAgICBpZiAob3ZlcmxvYWRBY3Rpb25fICE9IFRfT1ZFUkxPQURfTk9fQUNUSU9OICYmIHNlcnZlck92ZXJsb2FkZWQoKSkgewotICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKLSAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKLSAgICAgIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQpIHsKLSAgICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFKSB7Ci0gICAgICAgIGlmICghZHJhaW5QZW5kaW5nVGFzaygpKSB7Ci0gICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRpc2NhcmQsIHNvIHdlIGRyb3AgY29ubmVjdGlvbiBpbnN0ZWFkLgotICAgICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IGZjbnRsKGNsaWVudFNvY2tldCwgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgICBmY250bChjbGllbnRTb2NrZXQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBPX05PTkJMT0NLIChmY250bCkgIiwgZXJybm8pOwotICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgVENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KLSAgICBUQ29ubmVjdGlvbiogY2xpZW50Q29ubmVjdGlvbiA9Ci0gICAgICBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCwgRVZfUkVBRCB8IEVWX1BFUlNJU1QpOwotCi0gICAgLy8gRmFpbCBmYXN0IGlmIHdlIGNvdWxkIG5vdCBjcmVhdGUgYSBUQ29ubmVjdGlvbiBvYmplY3QKLSAgICBpZiAoY2xpZW50Q29ubmVjdGlvbiA9PSBOVUxMKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGZhaWxlZCBUQ29ubmVjdGlvbiBmYWN0b3J5Iik7Ci0gICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFB1dCB0aGlzIGNsaWVudCBjb25uZWN0aW9uIGludG8gdGhlIHByb3BlciBzdGF0ZQotICAgIGNsaWVudENvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKLQotICAgIC8vIGFkZHJMZW4gaXMgd3JpdHRlbiBieSB0aGUgYWNjZXB0KCkgY2FsbCwgc28gbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSB0aGUgbmV4dCBjYWxsLgotICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7Ci0gIH0KLQotICAvLyBEb25lIGxvb3BpbmcgYWNjZXB0LCBub3cgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGlzIGR1ZSB0bwotICAvLyBibG9ja2luZy4gQW55IG90aGVyIGVycm9yIGlzIGEgcHJvYmxlbQotICBpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVXT1VMREJMT0NLKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBhY2NlcHQoKSAiLCBlcnJubyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpsaXN0ZW5Tb2NrZXQoKSB7Ci0gIGludCBzOwotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICBpbnQgZXJyb3I7Ci0KLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzYiKSArIDFdOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0gIGlmIChlcnJvcikgewotICAgIHN0cmluZyBlcnJTdHIgPSAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGdldGFkZHJpbmZvICIgKyBzdHJpbmcoZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAotICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldAotICBzID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgaWYgKHMgPT0gLTEpIHsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHNvY2tldCgpIC0xIik7Ci0gIH0KLQotICAjaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZ6ZXJvLCBzaXplb2YoemVybykpKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZIik7Ci0gICAgfQotICB9Ci0gICNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKLQotCi0gIGludCBvbmUgPSAxOwotCi0gIC8vIFNldCByZXVzZWFkZHIgdG8gYXZvaWQgMk1TTCBkZWxheSBvbiBzZXJ2ZXIgcmVzdGFydAotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uZSwgc2l6ZW9mKG9uZSkpOwotCi0gIGlmIChiaW5kKHMsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSA9PSAtMSkgewotICAgIGNsb3NlKHMpOwotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgYmluZCIpOwotICB9Ci0KLSAgLy8gRG9uZSB3aXRoIHRoZSBhZGRyIGluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIFNldCB1cCB0aGlzIGZpbGUgZGVzY3JpcHRvciBmb3IgbGlzdGVuaW5nCi0gIGxpc3RlblNvY2tldChzKTsKLX0KLQotLyoqCi0gKiBUYWtlcyBhIHNvY2tldCBjcmVhdGVkIGJ5IGxpc3RlblNvY2tldCgpIGFuZCBzZXRzIHZhcmlvdXMgb3B0aW9ucyBvbiBpdAotICogdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpsaXN0ZW5Tb2NrZXQoaW50IHMpIHsKLSAgLy8gU2V0IHNvY2tldCB0byBub25ibG9ja2luZyBtb2RlCi0gIGludCBmbGFnczsKLSAgaWYgKChmbGFncyA9IGZjbnRsKHMsIEZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgIGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgY2xvc2Uocyk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIE9fTk9OQkxPQ0siKTsKLSAgfQotCi0gIGludCBvbmUgPSAxOwotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0KLSAgLy8gS2VlcGFsaXZlIHRvIGVuc3VyZSBmdWxsIHJlc3VsdCBmbHVzaGluZwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOwotCi0gIC8vIFR1cm4gbGluZ2VyIG9mZiB0byBhdm9pZCBodW5nIHNvY2tldHMKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nLCBzaXplb2YobGluZykpOwotCi0gIC8vIFNldCBUQ1Agbm9kZWxheSBpZiBhdmFpbGFibGUsIE1BQyBPUyBYIEhhY2sKLSAgLy8gU2VlIGh0dHA6Ly9saXN0cy5kYW5nYS5jb20vcGlwZXJtYWlsL21lbWNhY2hlZC8yMDA1LU1hcmNoLzAwMTI0MC5odG1sCi0gICNpZm5kZWYgVENQX05PUFVTSAotICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJm9uZSwgc2l6ZW9mKG9uZSkpOwotICAjZW5kaWYKLQotICAjaWZkZWYgVENQX0xPV19NSU5fUlRPCi0gIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgewotICAgIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgJm9uZSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0gICNlbmRpZgotCi0gIGlmIChsaXN0ZW4ocywgTElTVEVOX0JBQ0tMT0cpID09IC0xKSB7Ci0gICAgY2xvc2Uocyk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGxpc3RlbiIpOwotICB9Ci0KLSAgLy8gQ29vbCwgdGhpcyBzb2NrZXQgaXMgZ29vZCB0byBnbywgc2V0IGl0IGFzIHRoZSBzZXJ2ZXJTb2NrZXRfCi0gIHNlcnZlclNvY2tldF8gPSBzOwotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIHsKLSAgaWYgKHBpcGUobm90aWZpY2F0aW9uUGlwZUZEc18pICE9IDApIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUgIiwgZXJybm8pOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiY2FuJ3QgY3JlYXRlIG5vdGlmaWNhdGlvbiBwaXBlIik7Ci0gIH0KLSAgaW50IGZsYWdzOwotICBpZiAoKGZsYWdzID0gZmNudGwobm90aWZpY2F0aW9uUGlwZUZEc19bMF0sIEZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgIGZjbnRsKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spIDwgMCkgewotICAgIGNsb3NlKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKLSAgICBjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgT19OT05CTE9DSyIpOwotICB9Ci19Ci0KLS8qKgotICogUmVnaXN0ZXIgdGhlIGNvcmUgbGliZXZlbnQgZXZlbnRzIG9udG8gdGhlIHByb3BlciBiYXNlLgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6cmVnaXN0ZXJFdmVudHMoZXZlbnRfYmFzZSogYmFzZSkgewotICBhc3NlcnQoc2VydmVyU29ja2V0XyAhPSAtMSk7Ci0gIGFzc2VydCghZXZlbnRCYXNlXyk7Ci0gIGV2ZW50QmFzZV8gPSBiYXNlOwotCi0gIC8vIFByaW50IHNvbWUgbGliZXZlbnQgc3RhdHMKLSAgR2xvYmFsT3V0cHV0LnByaW50ZigibGliZXZlbnQgJXMgbWV0aG9kICVzIiwKLSAgICAgICAgICBldmVudF9nZXRfdmVyc2lvbigpLAotICAgICAgICAgIGV2ZW50X2dldF9tZXRob2QoKSk7Ci0KLSAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZlciBldmVudAotICBldmVudF9zZXQoJnNlcnZlckV2ZW50XywKLSAgICAgICAgICAgIHNlcnZlclNvY2tldF8sCi0gICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKLSAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlcjo6ZXZlbnRIYW5kbGVyLAotICAgICAgICAgICAgdGhpcyk7Ci0gIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZzZXJ2ZXJFdmVudF8pOwotCi0gIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKLSAgaWYgKC0xID09IGV2ZW50X2FkZCgmc2VydmVyRXZlbnRfLCAwKSkgewotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogY291bHQgbm90IGV2ZW50X2FkZCIpOwotICB9Ci0gIGlmICh0aHJlYWRQb29sUHJvY2Vzc2luZ18pIHsKLSAgICAvLyBDcmVhdGUgYW4gZXZlbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHRhc2sgZmluaXNoZXMKLSAgICBldmVudF9zZXQoJm5vdGlmaWNhdGlvbkV2ZW50XywKLSAgICAgICAgICAgICAgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCksCi0gICAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNULAotICAgICAgICAgICAgICBUQ29ubmVjdGlvbjo6dGFza0hhbmRsZXIsCi0gICAgICAgICAgICAgIHRoaXMpOwotCi0gICAgLy8gQXR0YWNoIHRvIHRoZSBiYXNlCi0gICAgZXZlbnRfYmFzZV9zZXQoZXZlbnRCYXNlXywgJm5vdGlmaWNhdGlvbkV2ZW50Xyk7Ci0KLSAgICAvLyBBZGQgdGhlIGV2ZW50IGFuZCBzdGFydCB1cCB0aGUgc2VydmVyCi0gICAgaWYgKC0xID09IGV2ZW50X2FkZCgmbm90aWZpY2F0aW9uRXZlbnRfLCAwKSkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiBub3RpZmljYXRpb24gZXZlbnRfYWRkIGZhaWwiKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNldFRocmVhZE1hbmFnZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgewotICB0aHJlYWRNYW5hZ2VyXyA9IHRocmVhZE1hbmFnZXI7Ci0gIGlmICh0aHJlYWRNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICB0aHJlYWRNYW5hZ2VyLT5zZXRFeHBpcmVDYWxsYmFjayhzdGQ6OnRyMTo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwgdGhpcywgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpKTsKLSAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOwotICB9IGVsc2UgewotICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmVyT3ZlcmxvYWRlZCgpIHsKLSAgc2l6ZV90IGFjdGl2ZUNvbm5lY3Rpb25zID0gbnVtVENvbm5lY3Rpb25zXyAtIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOwotICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzXyB8fAotICAgICAgYWN0aXZlQ29ubmVjdGlvbnMgPiBtYXhDb25uZWN0aW9uc18pIHsKLSAgICBpZiAoIW92ZXJsb2FkZWRfKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnQgbm9uLWJsb2NraW5nIHNlcnZlciBvdmVybG9hZCBjb25kaXRpb24iKTsKLSAgICAgIG92ZXJsb2FkZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG92ZXJsb2FkZWRfICYmCi0gICAgICAgIChudW1BY3RpdmVQcm9jZXNzb3JzXyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4QWN0aXZlUHJvY2Vzc29yc18pICYmCi0gICAgICAgIChhY3RpdmVDb25uZWN0aW9ucyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4Q29ubmVjdGlvbnNfKSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0IG5vbi1ibG9ja2luZyBzZXJ2ZXIgb3ZlcmxvYWQgZW5kZWQ7ICV1IGRyb3BwZWQgKCVsbHUgdG90YWwpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8sIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8pOwotICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOwotICAgICAgb3ZlcmxvYWRlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gb3ZlcmxvYWRlZF87Ci19Ci0KLWJvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpkcmFpblBlbmRpbmdUYXNrKCkgewotICBpZiAodGhyZWFkTWFuYWdlcl8pIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHRocmVhZE1hbmFnZXJfLT5yZW1vdmVOZXh0UGVuZGluZygpOwotICAgIGlmICh0YXNrKSB7Ci0gICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PFRDb25uZWN0aW9uOjpUYXNrKj4odGFzay5nZXQoKSktPmdldFRDb25uZWN0aW9uKCk7Ci0gICAgICBhc3NlcnQoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLT5nZXRTZXJ2ZXIoKQotICAgICAgICAgICAgICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7Ci0gICAgICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPQotICAgIHN0YXRpY19jYXN0PFRDb25uZWN0aW9uOjpUYXNrKj4odGFzay5nZXQoKSktPmdldFRDb25uZWN0aW9uKCk7Ci0gIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpCi0JICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7Ci0gIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKLX0KLQotLyoqCi0gKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKLSAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHsKLSAgLy8gSW5pdCBzb2NrZXQKLSAgbGlzdGVuU29ja2V0KCk7Ci0KLSAgaWYgKHRocmVhZFBvb2xQcm9jZXNzaW5nXykgewotICAgIC8vIEluaXQgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBwaXBlCi0gICAgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSBsaWJldmVudCBjb3JlCi0gIHJlZ2lzdGVyRXZlbnRzKHN0YXRpY19jYXN0PGV2ZW50X2Jhc2UqPihldmVudF9pbml0KCkpKTsKLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKLSAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY0NmM2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXZlbnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBjbGFzcwotY2xhc3MgVENvbm5lY3Rpb247Ci0KLS8qKgotICogVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBzZXJ2ZXIgaW4gQysrIGZvciBoaWdoIHBlcmZvcm1hbmNlIHRoYXQgb3BlcmF0ZXMgYQotICogc2luZ2xlIElPIHRocmVhZC4gSXQgYXNzdW1lcyB0aGF0IGFsbCBpbmNvbWluZyByZXF1ZXN0cyBhcmUgZnJhbWVkIHdpdGggYQotICogNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kIHdyaXRlcyBvdXQgcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIGZyYW1pbmcuCi0gKgotICogSXQgZG9lcyBub3QgdXNlIHRoZSBUU2VydmVyVHJhbnNwb3J0IGZyYW1ld29yaywgYnV0IHJhdGhlciBoYXMgc29ja2V0Ci0gKiBvcGVyYXRpb25zIGhhcmRjb2RlZCBmb3IgdXNlIHdpdGggc2VsZWN0LgotICoKLSAqLwotCi0KLS8vLyBPdmVybG9hZCBjb25kaXRpb24gYWN0aW9ucy4KLWVudW0gVE92ZXJsb2FkQWN0aW9uIHsKLSAgVF9PVkVSTE9BRF9OT19BQ1RJT04sICAgICAgICAvLy88IERvbid0IGhhbmRsZSBvdmVybG9hZCAqLwotICBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCwgIC8vLzwgRHJvcCBuZXcgY29ubmVjdGlvbnMgaW1tZWRpYXRlbHkgKi8KLSAgVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFICAvLy88IERyb3Agc29tZSB0YXNrcyBmcm9tIGhlYWQgb2YgdGFzayBxdWV1ZSAqLwotfTsKLQotY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHByaXZhdGU6Ci0gIC8vLyBMaXN0ZW4gYmFja2xvZwotICBzdGF0aWMgY29uc3QgaW50IExJU1RFTl9CQUNLTE9HID0gMTAyNDsKLQotICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBzaXplIG9mIGlkbGUgY29ubmVjdGlvbiBwb29sCi0gIHN0YXRpYyBjb25zdCBzaXplX3QgQ09OTkVDVElPTl9TVEFDS19MSU1JVCA9IDEwMjQ7Ci0KLSAgLy8vIE1heGltdW0gc2l6ZSBvZiBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgY29ubmVjdGlvbgotICBzdGF0aWMgY29uc3QgdWludDMyX3QgSURMRV9CVUZGRVJfTUVNX0xJTUlUID0gODE5MjsKLQotICAvLy8gRGVmYXVsdCBsaW1pdCBvbiB0b3RhbCBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMKLSAgc3RhdGljIGNvbnN0IGludCBNQVhfQ09OTkVDVElPTlMgPSBJTlRfTUFYOwotCi0gIC8vLyBEZWZhdWx0IGxpbWl0IG9uIGNvbm5lY3Rpb25zIGluIGhhbmRsZXIvdGFzayBwcm9jZXNzaW5nCi0gIHN0YXRpYyBjb25zdCBpbnQgTUFYX0FDVElWRV9QUk9DRVNTT1JTID0gSU5UX01BWDsKLQotICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKLSAgaW50IHNlcnZlclNvY2tldF87Ci0KLSAgLy8vIFBvcnQgc2VydmVyIHJ1bnMgb24KLSAgaW50IHBvcnRfOwotCi0gIC8vLyBGb3IgcHJvY2Vzc2luZyB2aWEgdGhyZWFkIHBvb2wsIG1heSBiZSBOVUxMCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotCi0gIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPwotICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKLQotICAvLy8gVGhlIGV2ZW50IGJhc2UgZm9yIGxpYmV2ZW50Ci0gIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87Ci0KLSAgLy8vIEV2ZW50IHN0cnVjdCwgdXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIGNvbm5lY3Rpb24gZXZlbnRzCi0gIHN0cnVjdCBldmVudCBzZXJ2ZXJFdmVudF87Ci0KLSAgLy8vIEV2ZW50IHN0cnVjdCwgdXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24KLSAgc3RydWN0IGV2ZW50IG5vdGlmaWNhdGlvbkV2ZW50XzsKLQotICAvLy8gTnVtYmVyIG9mIFRDb25uZWN0aW9uIG9iamVjdCB3ZSd2ZSBjcmVhdGVkCi0gIHNpemVfdCBudW1UQ29ubmVjdGlvbnNfOwotCi0gIC8vLyBOdW1iZXIgb2YgQ29ubmVjdGlvbnMgcHJvY2Vzc2luZyBvciB3YWl0aW5nIHRvIHByb2Nlc3MKLSAgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnNfOwotCi0gIC8vLyBMaW1pdCBmb3IgaG93IG1hbnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBjYWNoZQotICBzaXplX3QgY29ubmVjdGlvblN0YWNrTGltaXRfOwotCi0gIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCi0gIHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzXzsKLQotICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zCi0gIHNpemVfdCBtYXhDb25uZWN0aW9uc187Ci0KLSAgLy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhbiB1bnBlcmZvcm1lZCB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgotICBpbnQ2NF90IHRhc2tFeHBpcmVUaW1lXzsKLQotICAvKioKLSAgICogSHlzdGVyZXNpcyBmb3Igb3ZlcmxvYWQgc3RhdGUuICBUaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmxvYWQKLSAgICogdmFsdWUgdGhhdCBuZWVkcyB0byBiZSByZWFjaGVkIGJlZm9yZSB0aGUgb3ZlcmxvYWQgc3RhdGUgaXMgY2xlYXJlZDsKLSAgICogbXVzdCBiZSA8PSAxLjAuCi0gICAqLwotICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKLQotICAvLy8gQWN0aW9uIHRvIHRha2Ugd2hlbiB3ZSdyZSBvdmVybG9hZGVkLgotICBUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb25fOwotCi0gIC8qKgotICAgKiBNYXggcmVhZCBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBjb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCi0gICAqIFRDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXywgd2UgaW5zdXJlIHRoYXQgaXRzIHJlYWQgYnVmZmVyIGlzCi0gICAqIHJlZHVjZWQgdG8gdGhpcyBzaXplIHRvIGluc3VyZSB0aGF0IGlkbGUgY29ubmVjdGlvbnMgZG9uJ3QgaG9nIG1lbW9yeS4KLSAgICovCi0gIHNpemVfdCBpZGxlQnVmZmVyTWVtTGltaXRfOwotCi0gIC8vLyBTZXQgaWYgd2UgYXJlIGN1cnJlbnRseSBpbiBhbiBvdmVybG9hZGVkIHN0YXRlLgotICBib29sIG92ZXJsb2FkZWRfOwotCi0gIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIHNpbmNlIG92ZXJsb2FkIHN0YXJ0ZWQKLSAgdWludDMyX3QgbkNvbm5lY3Rpb25zRHJvcHBlZF87Ci0KLSAgLy8vIENvdW50IG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgb24gb3ZlcmxvYWQgc2luY2Ugc2VydmVyIHN0YXJ0ZWQKLSAgdWludDY0X3QgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXzsKLQotICAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgotICBpbnQgbm90aWZpY2F0aW9uUGlwZUZEc19bMl07Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgYSBzdGFjayBvZiBhbGwgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBidXQgdGhhdAotICAgKiBhcmUgTk9UIGN1cnJlbnRseSBpbiB1c2UuIFdoZW4gd2UgY2xvc2UgYSBjb25uZWN0aW9uLCB3ZSBwbGFjZSBpdCBvbiB0aGlzCi0gICAqIHN0YWNrIHNvIHRoYXQgdGhlIG9iamVjdCBjYW4gYmUgcmV1c2VkIGxhdGVyLCByYXRoZXIgdGhhbiBmcmVlaW5nIHRoZQotICAgKiBtZW1vcnkgYW5kIHJlYWxsb2NhdGluZyBhIG5ldyBvYmplY3QgbGF0ZXIuCi0gICAqLwotICBzdGQ6OnN0YWNrPFRDb25uZWN0aW9uKj4gY29ubmVjdGlvblN0YWNrXzsKLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gc2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZwotICAgKiBjbGllbnQgY29ubmVjdGlvbnMgb24gbGlzdGVuIHNvY2tldCBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMKLSAgICogdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGxpc3RlbiBzb2NrZXQuCi0gICAqIEBwYXJhbSB3aGljaCB0aGUgZXZlbnQgZmxhZyB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlci4KLSAgICovCi0gIHZvaWQgaGFuZGxlRXZlbnQoaW50IGZkLCBzaG9ydCB3aGljaCk7Ci0KLSBwdWJsaWM6Ci0gIFROb25ibG9ja2luZ1NlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgICBwb3J0Xyhwb3J0KSwKLSAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18oZmFsc2UpLAotICAgIGV2ZW50QmFzZV8oTlVMTCksCi0gICAgbnVtVENvbm5lY3Rpb25zXygwKSwKLSAgICBudW1BY3RpdmVQcm9jZXNzb3JzXygwKSwKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8oQ09OTkVDVElPTl9TVEFDS19MSU1JVCksCi0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18oTUFYX0FDVElWRV9QUk9DRVNTT1JTKSwKLSAgICBtYXhDb25uZWN0aW9uc18oTUFYX0NPTk5FQ1RJT05TKSwKLSAgICB0YXNrRXhwaXJlVGltZV8oMCksCi0gICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXygwLjgpLAotICAgIG92ZXJsb2FkQWN0aW9uXyhUX09WRVJMT0FEX05PX0FDVElPTiksCi0gICAgaWRsZUJ1ZmZlck1lbUxpbWl0XyhJRExFX0JVRkZFUl9NRU1fTElNSVQpLAotICAgIG92ZXJsb2FkZWRfKGZhbHNlKSwKLSAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXygwKSwKLSAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKDApIHt9Ci0KLSAgVE5vbmJsb2NraW5nU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgZXZlbnRCYXNlXyhOVUxMKSwKLSAgICBudW1UQ29ubmVjdGlvbnNfKDApLAotICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfKDApLAotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyhDT05ORUNUSU9OX1NUQUNLX0xJTUlUKSwKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyhNQVhfQUNUSVZFX1BST0NFU1NPUlMpLAotICAgIG1heENvbm5lY3Rpb25zXyhNQVhfQ09OTkVDVElPTlMpLAotICAgIHRhc2tFeHBpcmVUaW1lXygwKSwKLSAgICBvdmVybG9hZEh5c3RlcmVzaXNfKDAuOCksCi0gICAgb3ZlcmxvYWRBY3Rpb25fKFRfT1ZFUkxPQURfTk9fQUNUSU9OKSwKLSAgICBpZGxlQnVmZmVyTWVtTGltaXRfKElETEVfQlVGRkVSX01FTV9MSU1JVCksCi0gICAgb3ZlcmxvYWRlZF8oZmFsc2UpLAotICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKDApLAotICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8oMCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKLSAgfQotCi0gIFROb25ibG9ja2luZ1NlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgZXZlbnRCYXNlXyhOVUxMKSwKLSAgICBudW1UQ29ubmVjdGlvbnNfKDApLAotICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfKDApLAotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyhDT05ORUNUSU9OX1NUQUNLX0xJTUlUKSwKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyhNQVhfQUNUSVZFX1BST0NFU1NPUlMpLAotICAgIG1heENvbm5lY3Rpb25zXyhNQVhfQ09OTkVDVElPTlMpLAotICAgIHRhc2tFeHBpcmVUaW1lXygwKSwKLSAgICBvdmVybG9hZEh5c3RlcmVzaXNfKDAuOCksCi0gICAgb3ZlcmxvYWRBY3Rpb25fKFRfT1ZFUkxPQURfTk9fQUNUSU9OKSwKLSAgICBpZGxlQnVmZmVyTWVtTGltaXRfKElETEVfQlVGRkVSX01FTV9MSU1JVCksCi0gICAgb3ZlcmxvYWRlZF8oZmFsc2UpLAotICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKDApLAotICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8oMCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoaW5wdXRQcm90b2NvbEZhY3RvcnkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7Ci0gIH0KLQotICB+VE5vbmJsb2NraW5nU2VydmVyKCkge30KLQotICB2b2lkIHNldFRocmVhZE1hbmFnZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIHsKLSAgICByZXR1cm4gdGhyZWFkTWFuYWdlcl87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGltaXQgb24gVENvbm5lY3Rpb24gcG9vbCBzaXplLgotICAgKi8KLSAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCi0gICAqCi0gICAqIEBwYXJhbSBzeiB0aGUgbmV3IGxpbWl0IGZvciBUQ29ubmVjdGlvbiBwb29sIHNpemUuCi0gICAqLwotICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgewotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyA9IHN6OwotICB9Ci0KLSAgYm9vbCBpc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkgY29uc3QgewotICAgIHJldHVybiB0aHJlYWRQb29sUHJvY2Vzc2luZ187Ci0gIH0KLQotICB2b2lkIGFkZFRhc2soYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKLSAgfQotCi0gIGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXZlbnRCYXNlXzsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgb3VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMuCi0gIHZvaWQgaW5jcmVtZW50TnVtQ29ubmVjdGlvbnMoKSB7Ci0gICAgKytudW1UQ29ubmVjdGlvbnNfOwotICB9Ci0KLSAgLy8vIERlY3JlbWVudCBvdXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KLSAgdm9pZCBkZWNyZW1lbnROdW1Db25uZWN0aW9ucygpIHsKLSAgICAtLW51bVRDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBzb2NrZXRzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCi0gICAqCi0gICAqIEByZXR1cm4gY291bnQgb2YgY29ubmVjdGVkIHNvY2tldHMuCi0gICAqLwotICBzaXplX3QgZ2V0TnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bVRDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBjb25uZWN0aW9uIG9iamVjdHMgYWxsb2NhdGVkIGJ1dCBub3QgaW4gdXNlLgotICAgKgotICAgKiBAcmV0dXJuIGNvdW50IG9mIGlkbGUgY29ubmVjdGlvbiBvYmplY3RzLgotICAgKi8KLSAgc2l6ZV90IGdldE51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBjb25uZWN0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCi0gICAqIFRoaXMgaXMgZGVmaW5lZCBhcyBhIGNvbm5lY3Rpb24gd2hlcmUgYWxsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kCi0gICAqIGVpdGhlciBhc3NpZ25lZCBhIHRhc2sgKHdoZW4gdGhyZWFkaW5nKSBvciBwYXNzZWQgdG8gYSBoYW5kbGVyICh3aGVuCi0gICAqIG5vdCB0aHJlYWRpbmcpLCBhbmQgd2hlcmUgdGhlIGhhbmRsZXIgaGFzIG5vdCB5ZXQgcmV0dXJuZWQuCi0gICAqCi0gICAqIEByZXR1cm4gIyBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KLSAgICovCi0gIHNpemVfdCBnZXROdW1BY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgewotICAgIHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7Ci0gICAgKytudW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgfQotCi0gIC8vLyBEZWNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICB2b2lkIGRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7Ci0gICAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gMCkgewotICAgICAgLS1udW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgotICAgKi8KLSAgc2l6ZV90IGdldE1heENvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtYXhDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBtYXhDb25uZWN0aW9ucyBuZXcgc2V0dGluZyBmb3IgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zLgotICAgKi8KLSAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyhzaXplX3QgbWF4Q29ubmVjdGlvbnMpIHsKLSAgICBtYXhDb25uZWN0aW9uc18gPSBtYXhDb25uZWN0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgotICAgKi8KLSAgc2l6ZV90IGdldE1heEFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heEFjdGl2ZVByb2Nlc3NvcnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KLSAgICoKLSAgICogQHBhcmFtIG1heEFjdGl2ZVByb2Nlc3NvcnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBhY3RpdmUgcHJvY2Vzc2VzLgotICAgKi8KLSAgdm9pZCBzZXRNYXhBY3RpdmVQcm9jZXNzb3JzKHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzKSB7Ci0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBtYXhBY3RpdmVQcm9jZXNzb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBmcmFjdGlvbiBvZiBtYXhpbXVtIGxpbWl0cyBiZWZvcmUgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gaHlzdGVyZXNpcyBmcmFjdGlvbgotICAgKi8KLSAgZG91YmxlIGdldE92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IHsKLSAgICByZXR1cm4gb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgotICAgKiBBIGdvb2QgdmFsdWUgd291bGQgcHJvYmFibHkgYmUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KLSAgICoKLSAgICogQHBhcmFtIGh5c3RlcmVzaXNGcmFjdGlvbiBmcmFjdGlvbiA8PSAxLjAuCi0gICAqLwotICB2b2lkIHNldE92ZXJsb2FkSHlzdGVyZXNpcyhkb3VibGUgaHlzdGVyZXNpc0ZyYWN0aW9uKSB7Ci0gICAgaWYgKGh5c3RlcmVzaXNGcmFjdGlvbiA8PSAxLjAgJiYgaHlzdGVyZXNpc0ZyYWN0aW9uID4gMC4wKSB7Ci0gICAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gaHlzdGVyZXNpc0ZyYWN0aW9uOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIHdpbGwgdGFrZSBvbiBvdmVybG9hZC4KLSAgICoKLSAgICogQHJldHVybiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgY3VycmVudGx5IHNldCBhY3Rpb24uCi0gICAqLwotICBUT3ZlcmxvYWRBY3Rpb24gZ2V0T3ZlcmxvYWRBY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG92ZXJsb2FkQWN0aW9uXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIGlzIHRvIHRha2Ugb24gb3ZlcmxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBvdmVybG9hZEFjdGlvbiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgYWN0aW9uLgotICAgKi8KLSAgdm9pZCBzZXRPdmVybG9hZEFjdGlvbihUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb24pIHsKLSAgICBvdmVybG9hZEFjdGlvbl8gPSBvdmVybG9hZEFjdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgICoKLSAgICogQHJldHVybiBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIGludDY0X3QgZ2V0VGFza0V4cGlyZVRpbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRhc2tFeHBpcmVUaW1lXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgICoKLSAgICogQHBhcmFtIHRhc2tFeHBpcmVUaW1lIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgdm9pZCBzZXRUYXNrRXhwaXJlVGltZShpbnQ2NF90IHRhc2tFeHBpcmVUaW1lKSB7Ci0gICAgdGFza0V4cGlyZVRpbWVfID0gdGFza0V4cGlyZVRpbWU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCi0gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBtYXhpbXVtcyBmb3Igb3BlbiBjb25uZWN0aW9ucyBhbmQgY29ubmVjdGlvbnMKLSAgICogY3VycmVudGx5IGluIHByb2Nlc3NpbmcsIGFuZCBzZXRzIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpZiB0aGV5IGFyZQotICAgKiBleGNlZWRlZC4gIFRoZSBvdmVybG9hZCB3aWxsIHBlcnNpc3QgdW50aWwgYm90aCB2YWx1ZXMgYXJlIGJlbG93IHRoZQotICAgKiBjdXJyZW50IGh5c3RlcmVzaXMgZnJhY3Rpb24gb2YgdGhlaXIgbWF4aW11bXMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdmVybG9hZCBjb25kaXRpb24gZXhpc3RzLCBmYWxzZSBpZiBub3QuCi0gICAqLwotICBib29sIHNlcnZlck92ZXJsb2FkZWQoKTsKLQotICAvKiogUG9wIGFuZCBkaXNjYXJkIG5leHQgdGFzayBvbiB0aHJlYWRwb29sIHdhaXQgcXVldWUuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHRhc2sgd2FzIGRpc2NhcmRlZCwgZmFsc2UgaWYgdGhlIHdhaXQgcXVldWUgd2FzIGVtcHR5LgotICAgKi8KLSAgYm9vbCBkcmFpblBlbmRpbmdUYXNrKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSBsaW1pdCBvZiBtZW1vcnkgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KLSAgICoKLSAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gaWRsZS4KLSAgICovCi0gIHNpemVfdCBnZXRJZGxlQnVmZmVyTWVtTGltaXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkbGVCdWZmZXJNZW1MaW1pdF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIGxpbWl0IG9mIG1lbW9yeSBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBnb2VzIGlkbGUgd2l0aCBtb3JlIHRoYW4gdGhpcyBtdWNoIG1lbW9yeQotICAgKiBhbGxvY2F0ZWQgdG8gaXRzIGJ1ZmZlciwgd2Ugc2hyaW5rIGl0IHRvIHRoaXMgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGlkbGUuCi0gICAqLwotICB2b2lkIHNldElkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgbGltaXQpIHsKLSAgICBpZGxlQnVmZmVyTWVtTGltaXRfID0gbGltaXQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluaXRpYWxpemVkIGNvbm5lY3Rpb24gb2JqZWN0LiAgQ3JlYXRlcyBvciByZWNvdmVycyBmcm9tCi0gICAqIHBvb2wgYSBUQ29ubmVjdGlvbiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgc29ja2V0IEZECi0gICAqIGFuZCBmbGFncy4KLSAgICoKLSAgICogQHBhcmFtIHNvY2tldCBGRCBvZiBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIGZsYWdzIGluaXRpYWwgbGliX2V2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEByZXR1cm4gcG9pbnRlciB0byBpbml0aWFsaXplZCBUQ29ubmVjdGlvbiBvYmplY3QuCi0gICAqLwotICBUQ29ubmVjdGlvbiogY3JlYXRlQ29ubmVjdGlvbihpbnQgc29ja2V0LCBzaG9ydCBmbGFncyk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHBvb2wgb3IgZGVsZXRpb24uICBJZiB0aGUgY29ubmVjdGlvbiBwb29sCi0gICAqIChhIHN0YWNrKSBpc24ndCBmdWxsLCBwbGFjZSB0aGUgY29ubmVjdGlvbiBvYmplY3Qgb24gaXQsIG90aGVyd2lzZQotICAgKiBqdXN0IGRlbGV0ZSBpdC4KLSAgICoKLSAgICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIFRDb25lY3Rpb24gYmVpbmcgcmV0dXJuZWQuCi0gICAqLwotICB2b2lkIHJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB0aHJlYWRtYW5hZ2VyIGNhbGxzIHdoZW4gYSB0YXNrIHJlYWNoZXMKLSAgICogaXRzIGV4cGlyYXRpb24gdGltZS4gIEl0IGlzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZXhwaXJlZCBjb25uZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdGFzayB0aGUgcnVubmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBpcmVkIHRhc2suCi0gICAqLwotICB2b2lkIGV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5lciBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCi0gICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBzZXJ2ZXItPmhhbmRsZUV2ZW50KCkuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgotICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFROb25ibG9ja2luZ1NlcnZlcidzICJ0aGlzIi4KLSAgICovCi0gIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihpbnQgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KSB7Ci0gICAgKChUTm9uYmxvY2tpbmdTZXJ2ZXIqKXYpLT5oYW5kbGVFdmVudChmZCwgd2hpY2gpOwotICB9Ci0KLSAgLy8vIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KLSAgdm9pZCBsaXN0ZW5Tb2NrZXQoKTsKLQotICAvKioKLSAgICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBsaXN0ZW5Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzIG9wdGlvbnMgb24gaXQKLSAgICogdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmZCBkZXNjcmlwdG9yIG9mIHNvY2tldCB0byBiZSBpbml0aWFsaXplZC8KLSAgICovCi0gIHZvaWQgbGlzdGVuU29ja2V0KGludCBmZCk7Ci0KLSAgLy8vIENyZWF0ZSB0aGUgcGlwZSB1c2VkIHRvIG5vdGlmeSBJL08gcHJvY2VzcyBvZiB0YXNrIGNvbXBsZXRpb24uCi0gIHZvaWQgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOwotCi0gIC8qKgotICAgKiBHZXQgbm90aWZpY2F0aW9uIHBpcGUgc2VuZCBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcmV0dXJuIHdyaXRlIGZkIGZvciBwaXBlLgotICAgKi8KLSAgaW50IGdldE5vdGlmaWNhdGlvblNlbmRGRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMV07Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG5vdGlmaWNhdGlvbiBwaXBlIHJlY2VpdmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHJldHVybiByZWFkIGZkIG9mIHBpcGUuCi0gICAqLwotICBpbnQgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCkgY29uc3QgewotICAgIHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1swXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgY29yZSBsaWJldmVudCBldmVudHMgb250byB0aGUgcHJvcGVyIGJhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBiYXNlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGJhc2UgdG8gYmUgaW5pdGlhbGl6ZWQuCi0gICAqLwotICB2b2lkIHJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIGJhc2UpOwotCi0gIC8qKgotICAgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKLSAgICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KLSAgICovCi0gIHZvaWQgc2VydmUoKTsKLX07Ci0KLS8vLyBUd28gc3RhdGVzIGZvciBzb2NrZXRzLCByZWN2IGFuZCBzZW5kIG1vZGUKLWVudW0gVFNvY2tldFN0YXRlIHsKLSAgU09DS0VUX1JFQ1YsCi0gIFNPQ0tFVF9TRU5ECi19OwotCi0vKioKLSAqIEZpdmUgc3RhdGVzIGZvciB0aGUgbm9uYmxvY2tpbmcgc2VydnI6Ci0gKiAgMSkgaW5pdGlhbGl6ZQotICogIDIpIHJlYWQgNCBieXRlIGZyYW1lIHNpemUKLSAqICAzKSByZWFkIGZyYW1lIG9mIGRhdGEKLSAqICA0KSBzZW5kIGJhY2sgZGF0YSAoaWYgYW55KQotICogIDUpIGZvcmNlIGltbWVkaWF0ZSBjb25uZWN0aW9uIGNsb3NlCi0gKi8KLWVudW0gVEFwcFN0YXRlIHsKLSAgQVBQX0lOSVQsCi0gIEFQUF9SRUFEX0ZSQU1FX1NJWkUsCi0gIEFQUF9SRUFEX1JFUVVFU1QsCi0gIEFQUF9XQUlUX1RBU0ssCi0gIEFQUF9TRU5EX1JFU1VMVCwKLSAgQVBQX0NMT1NFX0NPTk5FQ1RJT04KLX07Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNvbm5lY3Rpb24gdGhhdCBpcyBoYW5kbGVkIHZpYSBsaWJldmVudC4gVGhpcyBjb25uZWN0aW9uCi0gKiBlc3NlbnRpYWxseSBlbmNhcHN1bGF0ZXMgYSBzb2NrZXQgdGhhdCBoYXMgc29tZSBhc3NvY2lhdGVkIGxpYmV2ZW50IHN0YXRlLgotICovCi1jbGFzcyBUQ29ubmVjdGlvbiB7Ci0gcHJpdmF0ZToKLQotICAvLy8gU3RhcnRpbmcgc2l6ZSBmb3IgbmV3IGNvbm5lY3Rpb24gYnVmZmVyCi0gIHN0YXRpYyBjb25zdCBpbnQgU1RBUlRJTkdfQ09OTkVDVElPTl9CVUZGRVJfU0laRSA9IDEwMjQ7Ci0KLSAgLy8vIFNlcnZlciBoYW5kbGUKLSAgVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXJfOwotCi0gIC8vLyBTb2NrZXQgaGFuZGxlCi0gIGludCBzb2NrZXRfOwotCi0gIC8vLyBMaWJldmVudCBvYmplY3QKLSAgc3RydWN0IGV2ZW50IGV2ZW50XzsKLQotICAvLy8gTGliZXZlbnQgZmxhZ3MKLSAgc2hvcnQgZXZlbnRGbGFnc187Ci0KLSAgLy8vIFNvY2tldCBtb2RlCi0gIFRTb2NrZXRTdGF0ZSBzb2NrZXRTdGF0ZV87Ci0KLSAgLy8vIEFwcGxpY2F0aW9uIHN0YXRlCi0gIFRBcHBTdGF0ZSBhcHBTdGF0ZV87Ci0KLSAgLy8vIEhvdyBtdWNoIGRhdGEgbmVlZGVkIHRvIHJlYWQKLSAgdWludDMyX3QgcmVhZFdhbnRfOwotCi0gIC8vLyBXaGVyZSBpbiB0aGUgcmVhZCBidWZmZXIgYXJlIHdlCi0gIHVpbnQzMl90IHJlYWRCdWZmZXJQb3NfOwotCi0gIC8vLyBSZWFkIGJ1ZmZlcgotICB1aW50OF90KiByZWFkQnVmZmVyXzsKLQotICAvLy8gUmVhZCBidWZmZXIgc2l6ZQotICB1aW50MzJfdCByZWFkQnVmZmVyU2l6ZV87Ci0KLSAgLy8vIFdyaXRlIGJ1ZmZlcgotICB1aW50OF90KiB3cml0ZUJ1ZmZlcl87Ci0KLSAgLy8vIFdyaXRlIGJ1ZmZlciBzaXplCi0gIHVpbnQzMl90IHdyaXRlQnVmZmVyU2l6ZV87Ci0KLSAgLy8vIEhvdyBmYXIgdGhyb3VnaCB3cml0aW5nIGFyZSB3ZT8KLSAgdWludDMyX3Qgd3JpdGVCdWZmZXJQb3NfOwotCi0gIC8vLyBIb3cgbWFueSB0aW1lcyBoYXZlIHdlIHJlYWQgc2luY2Ugb3VyIGxhc3QgYnVmZmVyIHJlc2V0PwotICB1aW50MzJfdCBudW1SZWFkc1NpbmNlUmVzZXRfOwotCi0gIC8vLyBIb3cgbWFueSB0aW1lcyBoYXZlIHdlIHdyaXR0ZW4gc2luY2Ugb3VyIGxhc3QgYnVmZmVyIHJlc2V0PwotICB1aW50MzJfdCBudW1Xcml0ZXNTaW5jZVJlc2V0XzsKLQotICAvLy8gVGFzayBoYW5kbGUKLSAgaW50IHRhc2tIYW5kbGVfOwotCi0gIC8vLyBUYXNrIGV2ZW50Ci0gIHN0cnVjdCBldmVudCB0YXNrRXZlbnRfOwotCi0gIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKLQotICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOwotCi0gIC8vLyBleHRyYSB0cmFuc3BvcnQgZ2VuZXJhdGVkIGJ5IHRyYW5zcG9ydCBmYWN0b3J5IChlLmcuIEJ1ZmZlcmVkUm91dGVyVHJhbnNwb3J0KQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKLQotICAvLy8gUHJvdG9jb2wgZGVjb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOwotCi0gIC8vLyBQcm90b2NvbCBlbmNvZGVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOwotCi0gIC8vLyBHbyBpbnRvIHJlYWQgbW9kZQotICB2b2lkIHNldFJlYWQoKSB7Ci0gICAgc2V0RmxhZ3MoRVZfUkVBRCB8IEVWX1BFUlNJU1QpOwotICB9Ci0KLSAgLy8vIEdvIGludG8gd3JpdGUgbW9kZQotICB2b2lkIHNldFdyaXRlKCkgewotICAgIHNldEZsYWdzKEVWX1dSSVRFIHwgRVZfUEVSU0lTVCk7Ci0gIH0KLQotICAvLy8gU2V0IHNvY2tldCBpZGxlCi0gIHZvaWQgc2V0SWRsZSgpIHsKLSAgICBzZXRGbGFncygwKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZXZlbnQgZmxhZ3MgZm9yIHRoaXMgY29ubmVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50RmxhZ3MgZmxhZ3Mgd2UgcGFzcyB0byBsaWJldmVudCBmb3IgdGhlIGNvbm5lY3Rpb24uCi0gICAqLwotICB2b2lkIHNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpOwotCi0gIC8qKgotICAgKiBMaWJldmVudCBoYW5kbGVyIGNhbGxlZCAodmlhIG91ciBzdGF0aWMgd3JhcHBlcikgd2hlbiB0aGUgY29ubmVjdGlvbgotICAgKiBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBSYXRoZXIgdGhhbiB1c2UgdGhlIGZsYWdzIGxpYmV2ZW50IHBhc3NlZCwKLSAgICogd2UgdXNlIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gcmVhZCBvcgotICAgKiB3cml0ZSB0aGUgc29ja2V0LgotICAgKi8KLSAgdm9pZCB3b3JrU29ja2V0KCk7Ci0KLSAgLy8vIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZnJlZSBvciByZXNldCBpdHMgcmVzb3VyY2VzLgotICB2b2lkIGNsb3NlKCk7Ci0KLSBwdWJsaWM6Ci0KLSAgY2xhc3MgVGFzazsKLQotICAvLy8gQ29uc3RydWN0b3IKLSAgVENvbm5lY3Rpb24oaW50IHNvY2tldCwgc2hvcnQgZXZlbnRGbGFncywgVE5vbmJsb2NraW5nU2VydmVyICpzKSB7Ci0gICAgcmVhZEJ1ZmZlcl8gPSAodWludDhfdCopc3RkOjptYWxsb2MoU1RBUlRJTkdfQ09OTkVDVElPTl9CVUZGRVJfU0laRSk7Ci0gICAgaWYgKHJlYWRCdWZmZXJfID09IE5VTEwpIHsKLSAgICAgIHRocm93IG5ldyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeS4iKTsKLSAgICB9Ci0gICAgcmVhZEJ1ZmZlclNpemVfID0gU1RBUlRJTkdfQ09OTkVDVElPTl9CVUZGRVJfU0laRTsKLQotICAgIG51bVJlYWRzU2luY2VSZXNldF8gPSAwOwotICAgIG51bVdyaXRlc1NpbmNlUmVzZXRfID0gMDsKLQotICAgIC8vIEFsbG9jYXRlIGlucHV0IGFuZCBvdXRwdXQgdHJhbnBzb3J0cwotICAgIC8vIHRoZXNlIG9ubHkgbmVlZCB0byBiZSBhbGxvY2F0ZWQgb25jZSBwZXIgVENvbm5lY3Rpb24gKHRoZXkgZG9uJ3QgbmVlZCB0byBiZQotICAgIC8vIHJlYWxsb2NhdGVkIG9uIGluaXQoKSBjYWxsKQotICAgIGlucHV0VHJhbnNwb3J0XyA9IGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+KG5ldyBUTWVtb3J5QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyU2l6ZV8pKTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfID0gYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4obmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0KLSAgICBpbml0KHNvY2tldCwgZXZlbnRGbGFncywgcyk7Ci0gICAgc2VydmVyXy0+aW5jcmVtZW50TnVtQ29ubmVjdGlvbnMoKTsKLSAgfQotCi0gIH5UQ29ubmVjdGlvbigpIHsKLSAgICBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOwotICAgIHNlcnZlcl8tPmRlY3JlbWVudE51bUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgcmVhZCBidWZmZXIgYWdhaW5zdCBhIGdpdmVuIGxpbWl0IGFuZCBzaHJpbmsgaXQgaWYgZXhjZWVkZWQuCi0gICAqCi0gICAqIEBwYXJhbSBsaW1pdCB3ZSBsaW1pdCBidWZmZXIgc2l6ZSB0by4KLSAgICovCi0gIHZvaWQgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KTsKLQotICAvLy8gSW5pdGlhbGl6ZQotICB2b2lkIGluaXQoaW50IHNvY2tldCwgc2hvcnQgZXZlbnRGbGFncywgVE5vbmJsb2NraW5nU2VydmVyICpzKTsKLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bwotICAgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKLSAgICogdG8sIG9yIGZpbmlzaGVkIHJlY2VpdmluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZCB0by4KLSAgICovCi0gIHZvaWQgdHJhbnNpdGlvbigpOwotCi0gIC8qKgotICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIGNvbm5lY3Rpb24gZXZlbnRzLiAgUHJvdmlkZXMgYSBjYWxsYmFjawotICAgKiB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHdoaWNoIGludm9rZXMgY29ubmVjdGlvbl8tPndvcmtTb2NrZXQoKS4KLSAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cmVkIG9uLgotICAgKiBAcGFyYW0gd2hpY2ggdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCi0gICAqIEBwYXJhbSB2IHZvaWQqIGNhbGxiYWNrIGFyZyB3aGVyZSB3ZSBwbGFjZWQgVENvbm5lY3Rpb24ncyAidGhpcyIuCi0gICAqLwotICBzdGF0aWMgdm9pZCBldmVudEhhbmRsZXIoaW50IGZkLCBzaG9ydCAvKiB3aGljaCAqLywgdm9pZCogdikgewotICAgIGFzc2VydChmZCA9PSAoKFRDb25uZWN0aW9uKil2KS0+c29ja2V0Xyk7Ci0gICAgKChUQ29ubmVjdGlvbiopdiktPndvcmtTb2NrZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIHNpZ25hbGluZyB0YXNrIGNvbXBsZXRpb24uICBQcm92aWRlcyBhCi0gICAqIGNhbGxiYWNrIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgdGhhdCB3aWxsIHJlYWQgYSBjb25uZWN0aW9uCi0gICAqIG9iamVjdCdzIGFkZHJlc3MgZnJvbSBhIHBpcGUgYW5kIGNhbGwgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpIGZvcgotICAgKiB0aGF0IG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cmVkIG9uLgotICAgKi8KLSAgc3RhdGljIHZvaWQgdGFza0hhbmRsZXIoaW50IGZkLCBzaG9ydCAvKiB3aGljaCAqLywgdm9pZCogLyogdiAqLykgewotICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uOwotICAgIHNzaXplX3QgbkJ5dGVzOwotICAgIHdoaWxlICgobkJ5dGVzID0gcmVhZChmZCwgKHZvaWQqKSZjb25uZWN0aW9uLCBzaXplb2YoVENvbm5lY3Rpb24qKSkpCi0gICAgICAgID09IHNpemVvZihUQ29ubmVjdGlvbiopKSB7Ci0gICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7Ci0gICAgfQotICAgIGlmIChuQnl0ZXMgPiAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6dGFza0hhbmRsZXIgdW5leHBlY3RlZCBwYXJ0aWFsIHJlYWQiKTsKLSAgICB9Ci0gICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnRhc2tIYW5kbGVyIHJlYWQgZmFpbGVkLCByZXNvdXJjZSBsZWFrIiwgZXJybm8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBOb3RpZmljYXRpb24gdG8gc2VydmVyIHRoYXQgcHJvY2Vzc2luZyBoYXMgZW5kZWQgb24gdGhpcyByZXF1ZXN0LgotICAgKiBDYW4gYmUgY2FsbGVkIGVpdGhlciB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGVkIG9yIHdoZW4gYSB3YWl0aW5nCi0gICAqIHRhc2sgaGFzIGJlZW4gcHJlZW1wdGl2ZWx5IHRlcm1pbmF0ZWQgKG9uIG92ZXJsb2FkKS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHVuYWJsZSB0byBub3RpZnkgKGNoZWNrIGVycm5vKS4KLSAgICovCi0gIGJvb2wgbm90aWZ5U2VydmVyKCkgewotICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gdGhpczsKLSAgICBpZiAod3JpdGUoc2VydmVyXy0+Z2V0Tm90aWZpY2F0aW9uU2VuZEZEKCksIChjb25zdCB2b2lkKikmY29ubmVjdGlvbiwKLSAgICAgICAgICAgICBzaXplb2YoVENvbm5lY3Rpb24qKSkgIT0gc2l6ZW9mKFRDb25uZWN0aW9uKikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vLyBGb3JjZSBjb25uZWN0aW9uIHNodXRkb3duIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gIHZvaWQgZm9yY2VDbG9zZSgpIHsKLSAgICBhcHBTdGF0ZV8gPSBBUFBfQ0xPU0VfQ09OTkVDVElPTjsKLSAgICBpZiAoIW5vdGlmeVNlcnZlcigpKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6Zm9yY2VDbG9zZTogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7Ci0gICAgfQotICB9Ci0KLSAgLy8vIHJldHVybiB0aGUgc2VydmVyIHRoaXMgY29ubmVjdGlvbiB3YXMgaW5pdGlhbGl6ZWQgZm9yLgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIGdldFNlcnZlcigpIHsKLSAgICByZXR1cm4gc2VydmVyXzsKLSAgfQotCi0gIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KLSAgVEFwcFN0YXRlIGdldFN0YXRlKCkgewotICAgIHJldHVybiBhcHBTdGF0ZV87Ci0gIH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2OTJhYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi1pbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2Zkcz0oMTw8MjQpKSAgewotICBzdHJ1Y3QgcmxpbWl0IGZkbWF4cmw7Ci0KLSAgZm9yKGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkczsKLSAgICAgIG1heF9mZHMgJiYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmZmRtYXhybCkgPCAwKTsKLSAgICAgIGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkcykgewotICAgIG1heF9mZHMgLz0gMjsKLSAgfQotCi0gIHJldHVybiAgZmRtYXhybC5ybGltX2N1cjsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRjNTg4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLQotLyoqCi0gKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlciBjb3JlLiBUbwotICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKLSAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCi0gKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKLSAqIGluc3RhbmNlJ3Mgc3RhdGUpLgotICovCi1jbGFzcyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0KLSAgdmlydHVhbCB+VFNlcnZlckV2ZW50SGFuZGxlcigpIHt9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBjbGllbnRCZWdpbihib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IC8qIGlucHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiAvKiBvdXRwdXQgKi8pIHt9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCBtYWtpbmcgcmVxdWVzdHMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2xpZW50RW5kKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gLyogaW5wdXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiAvKiBvdXRwdXQgKi8pIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgLyoqCi0gICAqIFByZXZlbnQgZGlyZWN0IGluc3RhbnRpYXRpb24uCi0gICAqLwotICBUU2VydmVyRXZlbnRIYW5kbGVyKCkge30KLQotfTsKLQotLyoqCi0gKiBUaHJpZnQgc2VydmVyLgotICoKLSAqLwotY2xhc3MgVFNlcnZlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUgewotIHB1YmxpYzoKLQotICB2aXJ0dWFsIH5UU2VydmVyKCkge30KLQotICB2aXJ0dWFsIHZvaWQgc2VydmUoKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQotCi0gIC8vIEFsbG93cyBydW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBSdW5uYWJsZSB0aHJlYWQKLSAgdmlydHVhbCB2b2lkIHJ1bigpIHsKLSAgICBzZXJ2ZSgpOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKCkgewotICAgIHJldHVybiBwcm9jZXNzb3JfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gZ2V0U2VydmVyVHJhbnNwb3J0KCkgewotICAgIHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgewotICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldElucHV0UHJvdG9jb2xGYWN0b3J5KCkgewotICAgIHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87Ci0gIH0KLQotcHJvdGVjdGVkOgotICBUU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcik6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgfQotCi0gIFRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCk6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gIH0KLQotICBUU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KToKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9Ci0KLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQotCi0KLSAgLy8gQ2xhc3MgdmFyaWFibGVzCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKLQotcHVibGljOgotICB2b2lkIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7Ci0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgfQotCi0gIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgewotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgfQotCi0gIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgfQotCi0gIHZvaWQgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKLSAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwotICB9Ci0KLX07Ci0KLS8qKgotICogSGVscGVyIGZ1bmN0aW9uIHRvIGluY3JlYXNlIHRoZSBtYXggZmlsZSBkZXNjcmlwdG9ycyBsaW1pdAotICogZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4uCi0gKiBCeSBkZWZhdWx0LCB0cmllcyB0byBpbmNyZWFzZSBpdCB0byBhcyBtdWNoIGFzIDJeMjQuCi0gKi8KLSBpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2Zkcz0oMTw8MjQpKTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGNlMjEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlcnZlci9UU2ltcGxlU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQotLyoqCi0gKiBBIHNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgYXBwbGljYXRpb24gc2VydmVyLiBQZXJmZWN0IGZvciB1bml0IHRlc3RzIQotICoKLSAqLwotdm9pZCBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpIHsKLQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7Ci0KLSAgdHJ5IHsKLSAgICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICBjZXJyIDw8ICJUU2ltcGxlU2VydmVyOjpydW4oKSBsaXN0ZW4oKTogIiA8PCB0dHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICB3aGlsZSAoIXN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgICAgZXZlbnRIYW5kbGVyXy0+Y2xpZW50QmVnaW4oaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgd2hpbGUgKHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7Ci0gICAgICAgICAgLy8gUGVlayBhaGVhZCwgaXMgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZD8KLSAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LT5wZWVrKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICAgIGNlcnIgPDwgIlRTaW1wbGVTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIgPDwgdHR4LndoYXQoKSA8PCBlbmRsOwotICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgICAgY2VyciA8PCAiVFNpbXBsZVNlcnZlciBleGNlcHRpb246ICIgPDwgdHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgICAgIGV2ZW50SGFuZGxlcl8tPmNsaWVudEVuZChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgICB9Ci0gICAgICBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICAgIGNsaWVudC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBjZXJyIDw8ICJUU2VydmVyVHJhbnNwb3J0IGRpZWQgb24gYWNjZXB0OiAiIDw8IHR0eC53aGF0KCkgPDwgZW5kbDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgY2VyciA8PCAiU29tZSBraW5kIG9mIGFjY2VwdCBleGNlcHRpb246ICIgPDwgdHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGNlcnIgPDwgIlRUaHJlYWRQb29sU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiA8PCBzIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICZ0dHgpIHsKLSAgICAgIGNlcnIgPDwgIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiIDw8IHR0eC53aGF0KCkgPDwgZW5kbDsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmM5MWMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSAic2VydmVyL1RTZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgc2ltcGxlIHNlcnZlci4gSXQgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBydW5zIGEKLSAqIGNvbnRpbnVvdXMgbG9vcCBvZiBhY2NlcHRpbmcgYSBzaW5nbGUgY29ubmVjdGlvbiwgcHJvY2Vzc2luZyByZXF1ZXN0cyBvbgotICogdGhhdCBjb25uZWN0aW9uIHVudGlsIGl0IGNsb3NlcywgYW5kIHRoZW4gcmVwZWF0aW5nLiBJdCBpcyBhIGdvb2QgZXhhbXBsZQotICogb2YgaG93IHRvIGV4dGVuZCB0aGUgVFNlcnZlciBpbnRlcmZhY2UuCi0gKgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHB1YmxpYzoKLSAgVFNpbXBsZVNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9Ci0KLSAgVFNpbXBsZVNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9Ci0KLSAgflRTaW1wbGVTZXJ2ZXIoKSB7fQotCi0gIHZvaWQgc2VydmUoKTsKLQotICB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgc3RvcF87Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWVhM2RiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9UaHJlYWQuaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDs7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQotY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewotCi1wdWJsaWM6Ci0KLSAgVGFzayhUVGhyZWFkUG9vbFNlcnZlciAmc2VydmVyLAotICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSA6Ci0gICAgc2VydmVyXyhzZXJ2ZXIpLAotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXItPmNsaWVudEJlZ2luKGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICB3aGlsZSAocHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8pKSB7Ci0gICAgICAgIGlmICghaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIC8vIFRoaXMgaXMgcmVhc29uYWJseSBleHBlY3RlZCwgY2xpZW50IGRpZG4ndCBzZW5kIGEgZnVsbCByZXF1ZXN0IHNvIGp1c3QKLSAgICAgIC8vIGlnbm9yZSBoaW0KLSAgICAgIC8vIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGNsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAvLyBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGV4Y2VwdGlvbjogIikgKyB4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJngpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyLCBzdGQ6OmV4Y2VwdGlvbjogIikgKyB4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRQb29sU2VydmVyLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgIlRUaHJlYWRQb29sU2VydmVyOjpUYXNrOjpydW4oKSIpOwotICAgIH0KLQotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5jbGllbnRFbmQoaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFNlcnZlciYgc2VydmVyXzsKLSAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKLQotfTsKLQotVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICBzdG9wXyhmYWxzZSksIHRpbWVvdXRfKDApIHt9Ci0KLVRUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICBzdG9wXyhmYWxzZSksIHRpbWVvdXRfKDApIHt9Ci0KLQotVFRocmVhZFBvb2xTZXJ2ZXI6On5UVGhyZWFkUG9vbFNlcnZlcigpIHt9Ci0KLXZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNlcnZlKCkgewotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7Ci0KLSAgdHJ5IHsKLSAgICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjo6cnVuKCkgbGlzdGVuKCk6ICIpICsgdHR4LndoYXQoKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICB3aGlsZSAoIXN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudC5yZXNldCgpOwotICAgICAgaW5wdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgaW5wdXRQcm90b2NvbC5yZXNldCgpOwotICAgICAgb3V0cHV0UHJvdG9jb2wucmVzZXQoKTsKLQotICAgICAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCi0gICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKLQotICAgICAgLy8gTWFrZSBJTyB0cmFuc3BvcnRzCi0gICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICAvLyBBZGQgdG8gdGhyZWFkbWFuYWdlciBwb29sCi0gICAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2s+KG5ldyBUVGhyZWFkUG9vbFNlcnZlcjo6VGFzaygqdGhpcywgcHJvY2Vzc29yXywgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSwgdGltZW91dF8pOwotCi0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKCFzdG9wXyB8fCB0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBUU2VydmVyVHJhbnNwb3J0IGRpZWQgb24gYWNjZXB0OiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBDYXVnaHQgVEV4Y2VwdGlvbjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gIlRUaHJlYWRQb29sU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgc3RvcHBlZCBtYW51YWxseSwgam9pbiB0aGUgZXhpc3RpbmcgdGhyZWFkcwotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAgIHRocmVhZE1hbmFnZXJfLT5qb2luKCk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBFeGNlcHRpb24gc2h1dHRpbmcgZG93bjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9Ci0KLX0KLQotaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGltZW91dCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRpbWVvdXRfOwotfQotCi12b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpIHsKLSAgdGltZW91dF8gPSB2YWx1ZTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiN2U5MDYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLQotICBUVGhyZWFkUG9vbFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgVFRocmVhZFBvb2xTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKLQotICB2aXJ0dWFsIH5UVGhyZWFkUG9vbFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwotCi0gIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIHNldFRpbWVvdXQoaW50NjRfdCB2YWx1ZSk7Ci0KLSAgdmlydHVhbCB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87Ci0KLSAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKLQotICB2b2xhdGlsZSBpbnQ2NF90IHRpbWVvdXRfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzMGY4Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlcjo6VGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXIsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIDoKLSAgICBzZXJ2ZXJfKHNlcnZlciksCi0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpIHsKLSAgfQotCi0gIH5UYXNrKCkge30KLQotICB2b2lkIHJ1bigpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIgPQotICAgICAgc2VydmVyXy5nZXRFdmVudEhhbmRsZXIoKTsKLSAgICBpZiAoZXZlbnRIYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50SGFuZGxlci0+Y2xpZW50QmVnaW4oaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIHdoaWxlIChwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XykpIHsKLSAgICAgICAgaWYgKCFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGNsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlciBleGNlcHRpb246ICIpICsgeC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgR2xvYmFsT3V0cHV0KCJUVGhyZWFkZWRTZXJ2ZXIgdW5jYXVnaHQgZXhjZXB0aW9uLiIpOwotICAgIH0KLSAgICBpZiAoZXZlbnRIYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50SGFuZGxlci0+Y2xpZW50RW5kKGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgb3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhpcyB0YXNrIGZyb20gcGFyZW50IGJvb2trZWVwaW5nCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMoc2VydmVyXy50YXNrc01vbml0b3JfKTsKLSAgICAgIHNlcnZlcl8udGFza3NfLmVyYXNlKHRoaXMpOwotICAgICAgaWYgKHNlcnZlcl8udGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgc2VydmVyXy50YXNrc01vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSBwcml2YXRlOgotICBUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcl87Ci0gIGZyaWVuZCBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXI7Ci0KLSAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKLX07Ci0KLQotVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSk6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHN0b3BfKGZhbHNlKSB7Ci0gIHRocmVhZEZhY3RvcnlfID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci19Ci0KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSk6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpLAotICBzdG9wXyhmYWxzZSkgewotfQotCi1UVGhyZWFkZWRTZXJ2ZXI6On5UVGhyZWFkZWRTZXJ2ZXIoKSB7fQotCi12b2lkIFRUaHJlYWRlZFNlcnZlcjo6c2VydmUoKSB7Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOjpydW4oKSBsaXN0ZW4oKTogIikgK3R0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQucmVzZXQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKLSAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7Ci0KLSAgICAgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgIC8vIE1ha2UgSU8gdHJhbnNwb3J0cwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgVFRocmVhZGVkU2VydmVyOjpUYXNrKiB0YXNrID0gbmV3IFRUaHJlYWRlZFNlcnZlcjo6VGFzaygqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAvLyBDcmVhdGUgYSB0YXNrCi0gICAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSA9Ci0gICAgICAgIHNoYXJlZF9wdHI8UnVubmFibGU+KHRhc2spOwotCi0gICAgICAvLyBDcmVhdGUgYSB0aHJlYWQgZm9yIHRoaXMgdGFzawotICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9Ci0gICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPih0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHJ1bm5hYmxlKSk7Ci0KLSAgICAgIC8vIEluc2VydCB0aHJlYWQgaW50byB0aGUgc2V0IG9mIHRocmVhZHMKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHModGFza3NNb25pdG9yXyk7Ci0gICAgICAgIHRhc2tzXy5pbnNlcnQodGFzayk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQhCi0gICAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoIXN0b3BfIHx8IHR0eC5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpIHsKLSAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBUU2VydmVyVHJhbnNwb3J0IGRpZWQgb24gYWNjZXB0OiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogQ2F1Z2h0IFRFeGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9ICJUVGhyZWFkZWRTZXJ2ZXI6IFVua25vd24gZXhjZXB0aW9uOiAiICsgczsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBzdG9wcGVkIG1hbnVhbGx5LCBtYWtlIHN1cmUgdG8gY2xvc2Ugc2VydmVyIHRyYW5zcG9ydAotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBFeGNlcHRpb24gc2h1dHRpbmcgZG93bjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgU3luY2hyb25pemVkIHModGFza3NNb25pdG9yXyk7Ci0gICAgICB3aGlsZSAoIXRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgIHRhc2tzTW9uaXRvcl8ud2FpdCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IEV4Y2VwdGlvbiBqb2luaW5nIHdvcmtlcnM6ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotCi19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDgxMWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSA8c2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKLQotY2xhc3MgVFRocmVhZGVkU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotCi0gcHVibGljOgotICBjbGFzcyBUYXNrOwotCi0gIFRUaHJlYWRlZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgVFRocmVhZGVkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSk7Ci0KLSAgdmlydHVhbCB+VFRocmVhZGVkU2VydmVyKCk7Ci0KLSAgdmlydHVhbCB2b2lkIHNlcnZlKCk7Ci0KLSAgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKLSAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKLQotICBNb25pdG9yIHRhc2tzTW9uaXRvcl87Ci0gIHN0ZDo6c2V0PFRhc2sqPiB0YXNrc187Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE0NjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpyZWFkKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgeworICB1aW50MzJfdCB4ZmVyID0gMDsKKyAgc3RkOjpzdHJpbmcgZm5hbWU7CisgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgIGludDE2X3QgZmlkOworCisgIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7CisgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChmaWQpIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORykgeworICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkU3RyaW5nKG1lc3NhZ2VfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIpIHsKKyAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkSTMyKHR5cGUpOworICAgICAgICB0eXBlXyA9IChUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlKXR5cGU7CisgICAgICB9IGVsc2UgeworICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsKKyAgfQorCisgIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK3VpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6d3JpdGUoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7CisgIHVpbnQzMl90IHhmZXIgPSAwOworICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJtZXNzYWdlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORywgMSk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RyaW5nKG1lc3NhZ2VfKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oInR5cGUiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAyKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVJMzIodHlwZV8pOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7CisgIHJldHVybiB4ZmVyOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjE4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXworI2RlZmluZSBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK25hbWVzcGFjZSBwcm90b2NvbCB7CitjbGFzcyBUUHJvdG9jb2w7Cit9CisKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IHB1YmxpYyBURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHsKKyAgICBVTktOT1dOID0gMCwKKyAgICBVTktOT1dOX01FVEhPRCA9IDEsCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAorICAgIFdST05HX01FVEhPRF9OQU1FID0gMywKKyAgICBCQURfU0VRVUVOQ0VfSUQgPSA0LAorICAgIE1JU1NJTkdfUkVTVUxUID0gNSwKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDYsCisgICAgUFJPVE9DT0xfRVJST1IgPSA3LAorICAgIElOVkFMSURfVFJBTlNGT1JNID0gOCwKKyAgICBJTlZBTElEX1BST1RPQ09MID0gOSwKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwCisgIH07CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgOiBURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSkgOiBURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQorCisgIHZpcnR1YWwgflRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgLyoqCisgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCisgICAqIHRoYXQgaGFzIG9jY3VycmVkLgorICAgKgorICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKKyAgICovCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgeworICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgICBjYXNlIFVOS05PV046CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiI7CisgICAgICBjYXNlIFVOS05PV05fTUVUSE9EOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBtZXRob2QiOworICAgICAgY2FzZSBJTlZBTElEX01FU1NBR0VfVFlQRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgbWVzc2FnZSB0eXBlIjsKKyAgICAgIGNhc2UgV1JPTkdfTUVUSE9EX05BTUU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBXcm9uZyBtZXRob2QgbmFtZSI7CisgICAgICBjYXNlIEJBRF9TRVFVRU5DRV9JRDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKKyAgICAgIGNhc2UgTUlTU0lOR19SRVNVTFQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBNaXNzaW5nIHJlc3VsdCI7CisgICAgICBjYXNlIElOVEVSTkFMX0VSUk9SOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW50ZXJuYWwgZXJyb3IiOworICAgICAgY2FzZSBQUk9UT0NPTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFByb3RvY29sIGVycm9yIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9UUkFOU0ZPUk06CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIHRyYW5zZm9ybSI7CisgICAgICBjYXNlIElOVkFMSURfUFJPVE9DT0w6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIHByb3RvY29sIjsKKyAgICAgIGNhc2UgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworICAgIH0KKyAgfQorCisgIHVpbnQzMl90IHJlYWQocHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOworICB1aW50MzJfdCB3cml0ZShwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEVycm9yIGNvZGUKKyAgICovCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZV87Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjc0YmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEJBU0VfSF8KKyNkZWZpbmUgX1RIUklGVF9UQkFTRV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBUQmFzZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRCYXNlKCl7fTsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0ID0gMDsKK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEJBU0VfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQzNDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVERJU1BBVENIUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfVERJU1BBVENIUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKKy8qKgorICogVERpc3BhdGNoUHJvY2Vzc29yIGlzIGEgaGVscGVyIGNsYXNzIHRvIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciB0aGVuIGNhbGwKKyAqIGFub3RoZXIgZnVuY3Rpb24gdG8gZGlzcGF0Y2ggYmFzZWQgb24gdGhlIGZ1bmN0aW9uIG5hbWUuCisgKgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBkaXNwYXRjaENhbGwoKSB0byBkaXNwYXRjaCBvbiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQgOiBwdWJsaWMgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKKworICAgIC8vIFRyeSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIHRlbXBsYXRlIHByb3RvY29sIHR5cGUKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljSW4gPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaW5SYXcpOworICAgIFByb3RvY29sXyogc3BlY2lmaWNPdXQgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3V0UmF3KTsKKyAgICBpZiAoc3BlY2lmaWNJbiAmJiBzcGVjaWZpY091dCkgeworICAgICAgcmV0dXJuIHByb2Nlc3NGYXN0KHNwZWNpZmljSW4sIHNwZWNpZmljT3V0LCBjb25uZWN0aW9uQ29udGV4dCk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIHNsb3cgcGF0aAorICAgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpblJhdywgc3BlY2lmaWNJbik7CisgICAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG91dFJhdywgc3BlY2lmaWNPdXQpOworCisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluUmF3LT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgLy8gSWYgdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHZhbGlkIGNhbGwsIGxvZyBhbiBlcnJvciBhbmQgcmV0dXJuIGZhbHNlIHNvCisgICAgLy8gdGhhdCB0aGUgc2VydmVyIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgLy8KKyAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAorICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQorICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbChpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgcHJvY2Vzc0Zhc3QoUHJvdG9jb2xfKiBpbiwgUHJvdG9jb2xfKiBvdXQsIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKGluLCBvdXQsIGZuYW1lLCBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOworICB9CisKKyAgLyoqCisgICAqIGRpc3BhdGNoQ2FsbCgpIG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCisgICAqLworICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7CisKKyAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZChQcm90b2NvbF8qIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7Cit9OworCisvKioKKyAqIE5vbi10ZW1wbGF0aXplZCB2ZXJzaW9uIG9mIFREaXNwYXRjaFByb2Nlc3NvciwgdGhhdCBkb2Vzbid0IGJvdGhlciB0cnlpbmcgdG8KKyAqIHBlcmZvcm0gYSBkeW5hbWljX2Nhc3QuCisgKi8KK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BhdGNoQ2FsbChpbi5nZXQoKSwgb3V0LmdldCgpLCBmbmFtZSwgc2VxaWQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKK307CisKKy8vIFNwZWNpYWxpemUgVERpc3BhdGNoUHJvY2Vzc29yVCBmb3IgVFByb3RvY29sIGFuZCBURHVtbXlQcm90b2NvbCBqdXN0IHRvIHVzZQorLy8gdGhlIGdlbmVyaWMgVERpc3BhdGNoUHJvY2Vzc29yLgordGVtcGxhdGUgPD4KK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiA6IHB1YmxpYyBURGlzcGF0Y2hQcm9jZXNzb3Ige307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6IHB1YmxpYyBURGlzcGF0Y2hQcm9jZXNzb3Ige307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZmMDMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RMT0dHSU5HX0hfCisjZGVmaW5lIF9USFJJRlRfVExPR0dJTkdfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworLyoqCisgKiBDb250YWlucyB1dGlsaXR5IG1hY3JvcyBmb3IgZGVidWdnaW5nIGFuZCBsb2dnaW5nLgorICoKKyAqLworCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qKgorICogVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID0gMDogYWxsIGRlYnVnZ2luZyB0dXJuZWQgb2ZmLCBkZWJ1ZyBtYWNyb3MgdW5kZWZpbmVkCisgKiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPSAxOiBhbGwgZGVidWdnaW5nIHR1cm5lZCBvbgorICovCisjZGVmaW5lIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCAwCisKKy8qKgorICogVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA9IDA6IGFsbCBsb2dnaW5nIHR1cm5lZCBvZmYsIGxvZ2dpbmcgbWFjcm9zIHVuZGVmaW5lZAorICogVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA9IDE6IGFsbCBsb2dnaW5nIHR1cm5lZCBvbgorICovCisjZGVmaW5lIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgMQorCisvKioKKyAqIFN0YW5kYXJkIHdyYXBwZXIgYXJvdW5kIGZwcmludGYgd2hhdCB3aWxsIHByZWZpeCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lCisgKiBudW1iZXIgdG8gdGhlIGxpbmUuIFVzZXMgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIHRvIGNvbnRyb2wgd2hldGhlciBpdCBpcworICogdHVybmVkIG9uIG9yIG9mZi4KKyAqCisgKiBAcGFyYW0gZm9ybWF0X3N0cmluZworICovCisjaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAorI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsIC4uLikKKyNlbmRpZgorCisvKioKKyAqIGFuYWxvZ291cyB0byBUX0RFQlVHIGJ1dCBhbHNvIHByaW50cyB0aGUgdGltZQorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCisjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJbJXMsJWRdIFslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLCAuLi4pCisjZW5kaWYKKworLyoqCisgKiBhbmFsb2dvdXMgdG8gVF9ERUJVRyBidXQgdXNlcyBpbnB1dCBsZXZlbCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHN0cmluZworICogc2hvdWxkIGJlIGxvZ2dlZC4KKyAqCisgKiBAcGFyYW0gaW50ICAgICBsZXZlbDogc3BlY2lmaWVkIGRlYnVnIGxldmVsCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBmb3JtYXQgc3RyaW5nCisgKi8KKyNkZWZpbmUgVF9ERUJVR19MKGxldmVsLCBmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChsZXZlbCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgIFwKKyAgfQorCisvKioKKyAqIEV4cGxpY2l0IGVycm9yIGxvZ2dpbmcuIFByaW50cyB0aW1lLCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisgKgorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqLworI2RlZmluZSBUX0VSUk9SKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlslcywlZF0gWyVzXSBFUlJPUjogIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qKgorICogQW5hbG9nb3VzIHRvIFRfRVJST1IsIGFkZGl0aW9uYWxseSBhYm9ydGluZyB0aGUgcHJvY2Vzcy4KKyAqIFdBUk5JTkc6IG1hY3JvIGNhbGxzIGFib3J0KCksIGVuZGluZyBwcm9ncmFtIGV4ZWN1dGlvbgorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNkZWZpbmUgVF9FUlJPUl9BQk9SVChmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJbJXMsJWRdIFslc10gRVJST1I6IEdvaW5nIHRvIGFib3J0ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKioKKyAqIExvZyBpbnB1dCBtZXNzYWdlCisgKgorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqLworI2lmIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwCisjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBkYmd0aW1lLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywgLi4uKQorI2VuZGlmCisKKy8qKgorICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDAgb3IgdW5zZXQ6IG5vcm1hbCBvcGVyYXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBjYWxsIGRlYnVnIG1lc3NhZ2VzIGRpc2FibGVkCisgKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMTogICAgICAgICAgbG9nIGEgZGVidWcgbWVzc2FnZXMgd2hlbmV2ZXIgYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZGFibGUgdmlydHVhbCBjYWxsIGlzIG1hZGUKKyAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAyOiAgICAgICAgICByZWNvcmQgZGV0YWlsZWQgaW5mbyB0aGF0IGNhbiBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZWQgYnkgY2FsbGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ByaW50X2luZm8oKQorICovCisjaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKKyNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ZpcnR1YWxfY2FsbCh0eXBlaWQoKnRoaXMpKQorI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHNwZWNpZmljX3Byb3QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKHR5cGVpZCgqdGVtcGxhdGVfY2xhc3MpLCB0eXBlaWQoKmdlbmVyaWNfcHJvdCkpOyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VsaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9PSAxCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdIHZpcnR1YWwgY2FsbFxuIiwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHNwZWNpZmljX3Byb3QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdIGZhaWxlZCB0byBjYXN0IHRvIHNwZWNpZmljIHByb3RvY29sIHR5cGVcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKQorI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkKKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RMT0dHSU5HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzYTllMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworVE91dHB1dCBHbG9iYWxPdXRwdXQ7CisKK3ZvaWQgVE91dHB1dDo6cHJpbnRmKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikgeworI2lmbmRlZiBUSFJJRlRfU1FVRUxDSF9DT05TT0xFX09VVFBVVAorICAvLyBUcnkgdG8gcmVkdWNlIGhlYXAgdXNhZ2UsIGV2ZW4gaWYgcHJpbnRmIGlzIGNhbGxlZCByYXJlbHkuCisgIHN0YXRpYyBjb25zdCBpbnQgU1RBQ0tfQlVGX1NJWkUgPSAyNTY7CisgIGNoYXIgc3RhY2tfYnVmW1NUQUNLX0JVRl9TSVpFXTsKKyAgdmFfbGlzdCBhcDsKKworI2lmZGVmIF9NU0NfVkVSCisgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgaW50IG5lZWQgPSBfdnNjcHJpbnRmKG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKworICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7CisgICAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICAgIHZzbnByaW50Zl9zKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIF9UUlVOQ0FURSwgbWVzc2FnZSwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKyNlbHNlCisgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgaW50IG5lZWQgPSB2c25wcmludGYoc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgbWVzc2FnZSwgYXApOworICB2YV9lbmQoYXApOworCisgIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisKKyAgY2hhciogaGVhcF9idWYgPSAoY2hhciopbWFsbG9jKChuZWVkICsgMSkgKiBzaXplb2YoY2hhcikpOworICBpZiAoaGVhcF9idWYgPT0gTlVMTCkgeworI2lmZGVmIF9NU0NfVkVSCisgICAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICAgIHZzbnByaW50Zl9zKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIF9UUlVOQ0FURSwgbWVzc2FnZSwgYXApOworICAgIHZhX2VuZChhcCk7CisjZW5kaWYKKyAgICAvLyBNYWxsb2MgZmFpbGVkLiAgV2UgbWlnaHQgYXMgd2VsbCBwcmludCB0aGUgc3RhY2sgYnVmZmVyLgorICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBpbnQgcnZhbCA9IHZzbnByaW50ZihoZWFwX2J1ZiwgbmVlZCArIDEsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgLy8gVE9ETyhzaGlnaW4pOiBpbmZvcm0gdXNlcgorICBpZiAocnZhbCAhPSAtMSkgeworICAgIGZfKGhlYXBfYnVmKTsKKyAgfQorICBmcmVlKGhlYXBfYnVmKTsKKyNlbmRpZgorfQorCit2b2lkIFRPdXRwdXQ6OmVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKSB7CisjaWZuZGVmIFRIUklGVF9TUVVFTENIX0NPTlNPTEVfT1VUUFVUCisgIHRpbWVfdCBub3c7CisgIGNoYXIgZGJndGltZVsyNl07CisgIHRpbWUoJm5vdyk7CisgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOworICBkYmd0aW1lWzI0XSA9IDA7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyaWZ0OiAlcyAlc1xuIiwgZGJndGltZSwgbXNnKTsKKyNlbmRpZgorfQorCit2b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSkgeworICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RkOjpzdHJpbmcoIjogIikgKyBzdHJlcnJvcl9zKGVycm5vX2NvcHkpOworICBmXyhvdXQuY19zdHIoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRPdXRwdXQ6OnN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpIHsKKyNpZm5kZWYgSEFWRV9TVFJFUlJPUl9SCisgIHJldHVybiAiZXJybm8gPSAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworI2Vsc2UgLy8gSEFWRV9TVFJFUlJPUl9SCisKKyAgY2hhciBiX2VycmJ1ZlsxMDI0XSA9IHsnXDAnfTsKKyNpZmRlZiBTVFJFUlJPUl9SX0NIQVJfUAorICBjaGFyKiBiX2Vycm9yID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7CisjZWxzZQorICBjaGFyKiBiX2Vycm9yID0gYl9lcnJidWY7CisgIGludCBydiA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOworICBpZiAocnYgPT0gLTEpIHsKKyAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KKyAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIgorICAgICAgICAgICArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyAgfQorI2VuZGlmCisgIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKKyAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgaXMgY29uc3RydWN0ZWQgYmVmb3JlCisgIC8vIGJfZXJyb3IgYmVjb21lcyBpbnZhbGlkPworICByZXR1cm4gc3RkOjpzdHJpbmcoYl9lcnJvcik7CisKKyNlbmRpZiAvLyBIQVZFX1NUUkVSUk9SX1IKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzVmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX09VVFBVVF9IXworI2RlZmluZSBfVEhSSUZUX09VVFBVVF9IXyAxCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK2NsYXNzIFRPdXRwdXQgeworcHVibGljOgorICBUT3V0cHV0KCkgOiBmXygmZXJyb3JUaW1lV3JhcHBlcikge30KKworICBpbmxpbmUgdm9pZCBzZXRPdXRwdXRGdW5jdGlvbih2b2lkICgqZnVuY3Rpb24pKGNvbnN0IGNoYXIqKSkgeyBmXyA9IGZ1bmN0aW9uOyB9CisKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBtZXNzYWdlKSB7IGZfKG1lc3NhZ2UpOyB9CisKKyAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIGhhdmUgYSBjb25zdCBjaGFyKiBvdmVybG9hZCBoZXJlIGluc3RlYWQgb2YKKyAgLy8ganVzdCB0aGUgc3RyaW5nIHZlcnNpb24sIG90aGVyd2lzZSBlcnJubyBjb3VsZCBiZSBjb3JydXB0ZWQKKyAgLy8gaWYgdGhlcmUgaXMgc29tZSBwcm9ibGVtIGFsbG9jYXRpbmcgbWVtb3J5IHdoZW4gY29uc3RydWN0aW5nCisgIC8vIHRoZSBzdHJpbmcuCisgIHZvaWQgcGVycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KTsKKyAgaW5saW5lIHZvaWQgcGVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSkgeworICAgIHBlcnJvcihtZXNzYWdlLmNfc3RyKCksIGVycm5vX2NvcHkpOworICB9CisKKyAgdm9pZCBwcmludGYoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKTsKKworICBzdGF0aWMgdm9pZCBlcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZyk7CisKKyAgLyoqIEp1c3QgbGlrZSBzdHJlcnJvcl9yIGJ1dCByZXR1cm5zIGEgQysrIHN0cmluZyBvYmplY3QuICovCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKKworcHJpdmF0ZToKKyAgdm9pZCAoKmZfKShjb25zdCBjaGFyKik7Cit9OworCitleHRlcm4gVE91dHB1dCBHbG9iYWxPdXRwdXQ7Cit9Cit9IC8vIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy9fVEhSSUZUX09VVFBVVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0NjQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RQUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9UUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKKy8qKgorICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBwcm9jZXNzb3IuIFRvCisgKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQorICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKKyAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAorICogaW5zdGFuY2UncyBzdGF0ZSkuCisgKi8KK2NsYXNzIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KKworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSBjYWxsaW5nIG90aGVyIGNhbGxiYWNrIG1ldGhvZHMuCisgICAqIEV4cGVjdGVkIHRvIHJldHVybiBzb21lIHNvcnQgb2YgY29udGV4dCBvYmplY3QuCisgICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgcGFzc2VkIHRvIGFsbCBvdGhlciBjYWxsYmFja3MKKyAgICogZm9yIHRoYXQgZnVuY3Rpb24gaW52b2NhdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICAodm9pZClzZXJ2ZXJDb250ZXh0OworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyoqCisgICAqIEV4cGVjdGVkIHRvIGZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRleHQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSByZWFkaW5nIGFyZ3VtZW50cy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICAodm9pZClieXRlczsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYWZ0ZXIgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICAodm9pZClieXRlczsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhbiBhc3luYyBmdW5jdGlvbiBjYWxsIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSB7fQorfTsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmcmVlIGVhY2ggY29udGV4dC4KKyAqLworY2xhc3MgVFByb2Nlc3NvckNvbnRleHRGcmVlciB7CitwdWJsaWM6CisgIFRQcm9jZXNzb3JDb250ZXh0RnJlZXIoVFByb2Nlc3NvckV2ZW50SGFuZGxlciogaGFuZGxlciwgdm9pZCogY29udGV4dCwgY29uc3QgY2hhciogbWV0aG9kKQorICAgIDogaGFuZGxlcl8oaGFuZGxlciksIGNvbnRleHRfKGNvbnRleHQpLCBtZXRob2RfKG1ldGhvZCkge30KKyAgflRQcm9jZXNzb3JDb250ZXh0RnJlZXIoKSB7CisgICAgaWYgKGhhbmRsZXJfICE9IE5VTEwpCisgICAgICBoYW5kbGVyXy0+ZnJlZUNvbnRleHQoY29udGV4dF8sIG1ldGhvZF8pOworICB9CisgIHZvaWQgdW5yZWdpc3RlcigpIHsgaGFuZGxlcl8gPSBOVUxMOyB9CisKK3ByaXZhdGU6CisgIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyXzsKKyAgdm9pZCogY29udGV4dF87CisgIGNvbnN0IGNoYXIqIG1ldGhvZF87Cit9OworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3QgdGhhdCBhY3RzIHVwb24gdHdvIHN0cmVhbXMgb2YgZGF0YSwgb25lCisgKiBhbiBpbnB1dCBhbmQgdGhlIG90aGVyIGFuIG91dHB1dC4gVGhlIGRlZmluaXRpb24gb2YgdGhpcyBvYmplY3QgaXMgbG9vc2UsCisgKiB0aG91Z2ggdGhlIHR5cGljYWwgY2FzZSBpcyBmb3Igc29tZSBzb3J0IG9mIHNlcnZlciB0aGF0IGVpdGhlciBnZW5lcmF0ZXMKKyAqIHJlc3BvbnNlcyB0byBhbiBpbnB1dCBzdHJlYW0gb3IgZm9yd2FyZHMgZGF0YSBmcm9tIG9uZSBwaXBlIG9udG8gYW5vdGhlci4KKyAqCisgKi8KK2NsYXNzIFRQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvY2Vzc29yKCkge30KKworICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSA9IDA7CisKKyAgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8sIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgcmV0dXJuIHByb2Nlc3MoaW8sIGlvLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorCisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9CisKK3Byb3RlY3RlZDoKKyAgVFByb2Nlc3NvcigpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Cit9OworCisvKioKKyAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gYWxsb3cgc3RkOjpzaGFyZWRfcHRyIHRvIGJlIHVzZWQgd2l0aCBoYW5kbGVyCisgKiBwb2ludGVycyByZXR1cm5lZCBieSB0aGUgZ2VuZXJhdGVkIGhhbmRsZXIgZmFjdG9yaWVzLgorICoKKyAqIFRoZSBoYW5kbGVyIGZhY3RvcnkgY2xhc3NlcyBnZW5lcmF0ZWQgYnkgdGhlIHRocmlmdCBjb21waWxlciByZXR1cm4gcmF3CisgKiBwb2ludGVycywgYW5kIGZhY3RvcnktPnJlbGVhc2VIYW5kbGVyKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgaGFuZGxlciBpcworICogbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBBIFJlbGVhc2VIYW5kbGVyIG9iamVjdCBjYW4gYmUgaW5zdGFudGlhdGVkIGFuZCBwYXNzZWQgYXMgdGhlIHNlY29uZAorICogcGFyYW1ldGVyIHRvIGEgc2hhcmVkX3B0ciwgc28gdGhhdCBmYWN0b3J5LT5yZWxlYXNlSGFuZGxlcigpIHdpbGwgYmUgY2FsbGVkCisgKiB3aGVuIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaW5zdGVhZCBvZiBkZWxldGluZyB0aGUgcG9pbnRlci4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xz4KK2NsYXNzIFJlbGVhc2VIYW5kbGVyIHsKK3B1YmxpYzoKKyAgUmVsZWFzZUhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4mIGhhbmRsZXJGYWN0b3J5KQorICAgIDogaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKSh0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV86OkhhbmRsZXIqIGhhbmRsZXIpIHsKKyAgICBpZiAoaGFuZGxlcikgeworICAgICAgaGFuZGxlckZhY3RvcnlfLT5yZWxlYXNlSGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4gaGFuZGxlckZhY3RvcnlfOworfTsKKworc3RydWN0IFRDb25uZWN0aW9uSW5mbyB7CisgIC8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CisgIC8vIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgY29ubmVjdGlvbgorICAvLyBUaGlzIGlzIHRoZSB0cmFuc3BvcnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgVFNlcnZlclRyYW5zcG9ydDo6YWNjZXB0KCksCisgIC8vIGFuZCBpdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9ydCBwb2ludGVkIHRvIGJ5IHRoZSBpbnB1dCBhbmQKKyAgLy8gb3V0cHV0IHByb3RvY29scy4KKyAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworfTsKKworY2xhc3MgVFByb2Nlc3NvckZhY3RvcnkgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvY2Vzc29yRmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIEdldCB0aGUgVFByb2Nlc3NvciB0byB1c2UgZm9yIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgaW52b2tlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMKKyAgICogYWNjZXB0ZWQgb24uICBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBuZWVkIHRvIGJlCisgICAqIHRocmVhZCBzYWZlLCBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKK307CisKK2NsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogcHVibGljIFRQcm9jZXNzb3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgOiBwcm9jZXNzb3JfKHByb2Nlc3Nvcikge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYpIHsgcmV0dXJuIHByb2Nlc3Nvcl87IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc4MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UT1NUUklOR19IXworI2RlZmluZSBfVEhSSUZUX1RPU1RSSU5HX0hfIDEKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgVCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworLy8gVE9ETzogcmVwbGFjZSB0aGUgY29tcHV0YXRpb25zIGJlbG93IHdpdGggc3RkOjpudW1lcmljX2xpbWl0czo6bWF4X2RpZ2l0czEwIG9uY2UgQysrMTEKKy8vIGlzIGVuYWJsZWQuCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGZsb2F0JiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGxvbmcgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6bWFwPEssIFY+JiBtKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjpzZXQ8VD4mIHMpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHR5cGVuYW1lIHN0ZDo6cGFpcjxLLCBWPiYgdikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCB0b19zdHJpbmcodi5maXJzdCkgPDwgIjogIiA8PCB0b19zdHJpbmcodi5zZWNvbmQpOworICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgVCYgYmVnLCBjb25zdCBUJiBlbmQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIGZvciAoVCBpdCA9IGJlZzsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgaWYgKGl0ICE9IGJlZykKKyAgICAgIG8gPDwgIiwgIjsKKyAgICBvIDw8IHRvX3N0cmluZygqaXQpOworICB9CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCAiWyIgPDwgdG9fc3RyaW5nKHQuYmVnaW4oKSwgdC5lbmQoKSkgPDwgIl0iOworICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjptYXA8SywgVj4mIG0pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgInsiIDw8IHRvX3N0cmluZyhtLmJlZ2luKCksIG0uZW5kKCkpIDw8ICJ9IjsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6c2V0PFQ+JiBzKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8ICJ7IiA8PCB0b19zdHJpbmcocy5iZWdpbigpLCBzLmVuZCgpKSA8PCAifSI7CisgIHJldHVybiBvLnN0cigpOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gX1RIUklGVF9UT1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXworI2RlZmluZSBfVEhSSUZUX1RIUklGVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgorI2luY2x1ZGUgPHRocmlmdC9UT3V0cHV0Lmg+CisKKyNkZWZpbmUgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh4KSAoKHZvaWQpKHgpKQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBURW51bUl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gPiB7CitwdWJsaWM6CisgIFRFbnVtSXRlcmF0b3IoaW50IG4sIGludCogZW51bXMsIGNvbnN0IGNoYXIqKiBuYW1lcykKKyAgICA6IGlpXygwKSwgbl8obiksIGVudW1zXyhlbnVtcyksIG5hbWVzXyhuYW1lcykge30KKworICBpbnQgb3BlcmF0b3IrKygpIHsgcmV0dXJuICsraWlfOyB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRFbnVtSXRlcmF0b3ImIGVuZCkgeworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoZW5kKTsKKyAgICBhc3NlcnQoZW5kLm5fID09IC0xKTsKKyAgICByZXR1cm4gKGlpXyAhPSBuXyk7CisgIH0KKworICBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsgfQorCitwcml2YXRlOgorICBpbnQgaWlfOworICBjb25zdCBpbnQgbl87CisgIGludCogZW51bXNfOworICBjb25zdCBjaGFyKiogbmFtZXNfOworfTsKKworY2xhc3MgVEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRFeGNlcHRpb24oKSA6IG1lc3NhZ2VfKCkge30KKworICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IG1lc3NhZ2VfKG1lc3NhZ2UpIHt9CisKKyAgdmlydHVhbCB+VEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgeworICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gIkRlZmF1bHQgVEV4Y2VwdGlvbi4iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKK307CisKK2NsYXNzIFREZWxheWVkRXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIEU+CisgIHN0YXRpYyBURGVsYXllZEV4Y2VwdGlvbiogZGVsYXlFeGNlcHRpb24oY29uc3QgRSYgZSk7CisgIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpID0gMDsKKyAgdmlydHVhbCB+VERlbGF5ZWRFeGNlcHRpb24oKXt9OworfTsKKwordGVtcGxhdGUgPGNsYXNzIEU+CitjbGFzcyBURXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBURGVsYXllZEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRFeGNlcHRpb25XcmFwcGVyKGNvbnN0IEUmIGUpIDogZV8oZSkge30KKyAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgeworICAgIEUgdGVtcChlXyk7CisgICAgZGVsZXRlIHRoaXM7CisgICAgdGhyb3cgdGVtcDsKKyAgfQorCitwcml2YXRlOgorICBFIGVfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEU+CitURGVsYXllZEV4Y2VwdGlvbiogVERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpIHsKKyAgcmV0dXJuIG5ldyBURXhjZXB0aW9uV3JhcHBlcjxFPihlKTsKK30KKworI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCit2b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBpbmZvKTsKK3ZvaWQgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0ZW1wbGF0ZV90eXBlLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgcHJvdF90eXBlKTsKK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUqIGYpOwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oKTsKK3ZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZihGSUxFKiBnZW5fY2FsbHNfZiwgRklMRSogdmlydHVhbF9jYWxsc19mKTsKKyNlbmRpZgorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTM0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworLy8gRG8gbm90aGluZyBpZiB2aXJ0dWFsIGNhbGwgcHJvZmlsaW5nIGlzIG5vdCBlbmFibGVkCisjaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKKworLy8gVE9ETzogVGhpcyBjb2RlIG9ubHkgd29ya3Mgd2l0aCBnKysgKHNpbmNlIHdlIHJlbHkgb24gdGhlIGZhY3QKKy8vIHRoYXQgYWxsIHN0ZDo6dHlwZV9pbmZvIGluc3RhbmNlcyByZWZlcnJpbmcgdG8gYSBwYXJ0aWN1bGFyIHR5cGUKKy8vIGFsd2F5cyByZXR1cm4gdGhlIGV4YWN0IHNhbWUgcG9pbnRlciB2YWx1ZSBmcm9tIG5hbWUoKS4pCisjaWZuZGVmIF9fR05VR19fCisjZXJyb3IgIlRocmlmdCB2aXJ0dWFsIGZ1bmN0aW9uIHByb2ZpbGluZyBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIGdjYyIKKyNlbmRpZiAvLyAhX19HTlVHX18KKworLy8gVE9ETzogV2UgYWxzbyByZXF1aXJlIGdsaWJjIGZvciB0aGUgYmFja3RyYWNlKCkgYW5kIGJhY2t0cmFjZV9zeW1ib2xzKCkKKy8vIGZ1bmN0aW9ucy4KKyNpZm5kZWYgX19HTElCQ19fCisjZXJyb3IgIlRocmlmdCB2aXJ0dWFsIGZ1bmN0aW9uIHByb2ZpbGluZyBjdXJyZW50bHkgcmVxdWlyZXMgZ2xpYmMiCisjZW5kaWYgLy8gIV9fR0xJQkNfXworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKKyNpbmNsdWRlIDxleHQvaGFzaF9tYXA+CisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1NUQUNLX0RFUFRIID0gMTU7CisKKy8qKgorICogQSBzdGFjayB0cmFjZQorICovCitjbGFzcyBCYWNrdHJhY2UgeworcHVibGljOgorICBCYWNrdHJhY2UoaW50IHNraXAgPSAwKTsKKyAgQmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCYgYnQpOworCisgIHZvaWQgb3BlcmF0b3I9KEJhY2t0cmFjZSBjb25zdCYgYnQpIHsKKyAgICBudW1DYWxsZXJzXyA9IGJ0Lm51bUNhbGxlcnNfOworICAgIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7CisgICAgICBtZW1jcHkoY2FsbGVyc18sIGJ0LmNhbGxlcnNfLCBudW1DYWxsZXJzXyAqIHNpemVvZih2b2lkKikpOworICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShCYWNrdHJhY2UgY29uc3QmIGJ0KSBjb25zdCB7IHJldHVybiAoY21wKGJ0KSA9PSAwKTsgfQorCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIGludHB0cl90IHJldCA9IDA7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1DYWxsZXJzXzsgKytuKSB7CisgICAgICByZXQgXj0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY2FsbGVyc19bbl0pOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpOworICB9CisKKyAgaW50IGNtcChCYWNrdHJhY2UgY29uc3QmIGJ0KSBjb25zdCB7CisgICAgaW50IGRlcHRoX2RpZmYgPSAobnVtQ2FsbGVyc18gLSBidC5udW1DYWxsZXJzXyk7CisgICAgaWYgKGRlcHRoX2RpZmYgIT0gMCkgeworICAgICAgcmV0dXJuIGRlcHRoX2RpZmY7CisgICAgfQorCisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1DYWxsZXJzXzsgKytuKSB7CisgICAgICBpbnQgZGlmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNhbGxlcnNfW25dKQorICAgICAgICAgICAgICAgICAtIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJ0LmNhbGxlcnNfW25dKTsKKyAgICAgIGlmIChkaWZmICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIHByaW50KEZJTEUqIGYsIGludCBpbmRlbnQgPSAwLCBpbnQgc3RhcnQgPSAwKSBjb25zdCB7CisgICAgY2hhcioqIHN0cmluZ3MgPSBiYWNrdHJhY2Vfc3ltYm9scyhjYWxsZXJzXywgbnVtQ2FsbGVyc18pOworICAgIGlmIChzdHJpbmdzKSB7CisgICAgICBzdGFydCArPSBza2lwXzsKKyAgICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgfQorICAgICAgZm9yIChpbnQgbiA9IHN0YXJ0OyBuIDwgbnVtQ2FsbGVyc187ICsrbikgeworICAgICAgICBmcHJpbnRmKGYsICIlKnMjJS0yZCAlc1xuIiwgaW5kZW50LCAiIiwgbiwgc3RyaW5nc1tuXSk7CisgICAgICB9CisgICAgICBmcmVlKHN0cmluZ3MpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKGYsICIlKnM8ZmFpbGVkIHRvIGRldGVybWluZSBzeW1ib2xzPlxuIiwgaW5kZW50LCAiIik7CisgICAgfQorICB9CisKKyAgaW50IGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gbnVtQ2FsbGVyc18gLSBza2lwXzsgfQorCisgIHZvaWQqIGdldEZyYW1lKGludCBpbmRleCkgY29uc3QgeworICAgIGludCBhZGp1c3RlZF9pbmRleCA9IGluZGV4ICsgc2tpcF87CisgICAgaWYgKGFkanVzdGVkX2luZGV4IDwgMCB8fCBhZGp1c3RlZF9pbmRleCA+PSBudW1DYWxsZXJzXykgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBjYWxsZXJzX1thZGp1c3RlZF9pbmRleF07CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCogY2FsbGVyc19bTUFYX1NUQUNLX0RFUFRIXTsKKyAgaW50IG51bUNhbGxlcnNfOworICBpbnQgc2tpcF87Cit9OworCisvLyBEZWZpbmUgdGhlIGNvbnN0cnVjdG9ycyBub24taW5saW5lLCBzbyB0aGV5IGNvbnNpc3RlbnRseSBhZGQgYSBzaW5nbGUKKy8vIGZyYW1lIHRvIHRoZSBzdGFjayB0cmFjZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9wdGltaXphdGlvbiBpcyBlbmFibGVkCitCYWNrdHJhY2U6OkJhY2t0cmFjZShpbnQgc2tpcCkKKyAgOiBza2lwXyhza2lwICsgMSkgLy8gaWdub3JlIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYKK3sKKyAgbnVtQ2FsbGVyc18gPSBiYWNrdHJhY2UoY2FsbGVyc18sIE1BWF9TVEFDS19ERVBUSCk7CisgIGlmIChza2lwXyA+IG51bUNhbGxlcnNfKSB7CisgICAgc2tpcF8gPSBudW1DYWxsZXJzXzsKKyAgfQorfQorCitCYWNrdHJhY2U6OkJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QmIGJ0KSA6IG51bUNhbGxlcnNfKGJ0Lm51bUNhbGxlcnNfKSwgc2tpcF8oYnQuc2tpcF8pIHsKKyAgaWYgKG51bUNhbGxlcnNfID49IDApIHsKKyAgICBtZW1jcHkoY2FsbGVyc18sIGJ0LmNhbGxlcnNfLCBudW1DYWxsZXJzXyAqIHNpemVvZih2b2lkKikpOworICB9Cit9CisKKy8qKgorICogQSBiYWNrdHJhY2UsIHBsdXMgb25lIG9yIHR3byB0eXBlIG5hbWVzCisgKi8KK2NsYXNzIEtleSB7CitwdWJsaWM6CisgIGNsYXNzIEhhc2ggeworICBwdWJsaWM6CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoS2V5IGNvbnN0JiBrKSBjb25zdCB7IHJldHVybiBrLmhhc2goKTsgfQorICB9OworCisgIEtleShjb25zdCBCYWNrdHJhY2UqIGJ0LCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvKQorICAgIDogYmFja3RyYWNlXyhidCksIHR5cGVOYW1lMV8odHlwZV9pbmZvLm5hbWUoKSksIHR5cGVOYW1lMl8oTlVMTCkge30KKworICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzEsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8yKQorICAgIDogYmFja3RyYWNlXyhidCksIHR5cGVOYW1lMV8odHlwZV9pbmZvMS5uYW1lKCkpLCB0eXBlTmFtZTJfKHR5cGVfaW5mbzIubmFtZSgpKSB7fQorCisgIEtleShjb25zdCBLZXkmIGspCisgICAgOiBiYWNrdHJhY2VfKGsuYmFja3RyYWNlXyksIHR5cGVOYW1lMV8oay50eXBlTmFtZTFfKSwgdHlwZU5hbWUyXyhrLnR5cGVOYW1lMl8pIHt9CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgS2V5JiBrKSB7CisgICAgYmFja3RyYWNlXyA9IGsuYmFja3RyYWNlXzsKKyAgICB0eXBlTmFtZTFfID0gay50eXBlTmFtZTFfOworICAgIHR5cGVOYW1lMl8gPSBrLnR5cGVOYW1lMl87CisgIH0KKworICBjb25zdCBCYWNrdHJhY2UqIGdldEJhY2t0cmFjZSgpIGNvbnN0IHsgcmV0dXJuIGJhY2t0cmFjZV87IH0KKworICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVOYW1lMV87IH0KKworICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZTIoKSBjb25zdCB7IHJldHVybiB0eXBlTmFtZTJfOyB9CisKKyAgdm9pZCBtYWtlUGVyc2lzdGVudCgpIHsKKyAgICAvLyBDb3B5IHRoZSBCYWNrdHJhY2Ugb2JqZWN0CisgICAgYmFja3RyYWNlXyA9IG5ldyBCYWNrdHJhY2UoKmJhY2t0cmFjZV8pOworCisgICAgLy8gTk9URTogV2UgZG9uJ3QgY29weSB0aGUgdHlwZSBuYW1lLgorICAgIC8vIFRoZSBHTlUgbGlic3RkYysrIGltcGxlbWVudGF0aW9uIG9mIHR5cGVfaW5mbzo6bmFtZSgpIHJldHVybnMgYSB2YWx1ZQorICAgIC8vIHRoYXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9ncmFtLiAgKEFsdGhvdWdoIHRoZSBDKysKKyAgICAvLyBzdGFuZGFyZCBkb2Vzbid0IGd1YXJhbnRlZSB0aGlzIHdpbGwgYmUgdHJ1ZSBvbiBhbGwgaW1wbGVtZW50YXRpb25zLikKKyAgfQorCisgIC8qKgorICAgKiBDbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGVkIGJ5IG1ha2VQZXJzaXN0ZW50KCkKKyAgICoKKyAgICogU2hvdWxkIG9ubHkgYmUgaW52b2tlZCBpZiBtYWtlUGVyc2lzdGVudCgpIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLgorICAgKiBUaGUgS2V5IHNob3VsZCBubyBsb25nZXIgYmUgdXNlZCBhZnRlciBjbGVhbnVwKCkgaXMgY2FsbGVkLgorICAgKi8KKyAgdm9pZCBjbGVhbnVwKCkgeworICAgIGRlbGV0ZSBiYWNrdHJhY2VfOworICAgIGJhY2t0cmFjZV8gPSBOVUxMOworICB9CisKKyAgaW50IGNtcChjb25zdCBLZXkmIGspIGNvbnN0IHsKKyAgICBpbnQgcmV0ID0gYmFja3RyYWNlXy0+Y21wKCprLmJhY2t0cmFjZV8pOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBXZSBjb21wYXJlIGp1c3QgdGhlIG5hbWUgcG9pbnRlcnMuCisgICAgLy8gV2l0aCBHTlUgbGlic3RkYysrLCBldmVyeSB0eXBlX2luZm8gb2JqZWN0IGZvciB0aGUgc2FtZSB0eXBlIHBvaW50cyB0bworICAgIC8vIGV4YWN0bHkgdGhlIHNhbWUgbmFtZSBzdHJpbmcuICAoQWx0aG91Z2ggdGhpcyBpc24ndCBndWFyYW50ZWVkIGJ5IHRoZQorICAgIC8vIEMrKyBzdGFuZGFyZC4pCisgICAgcmV0ID0gay50eXBlTmFtZTFfIC0gdHlwZU5hbWUxXzsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBrLnR5cGVOYW1lMl8gLSB0eXBlTmFtZTJfOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleSYgaykgY29uc3QgeyByZXR1cm4gY21wKGspID09IDA7IH0KKworICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKKyAgICAvLyBOT1RFOiBBcyBhYm92ZSwgd2UganVzdCB1c2UgdGhlIG5hbWUgcG9pbnRlciB2YWx1ZS4KKyAgICAvLyBXb3JrcyB3aXRoIEdOVSBsaWJzdGRjKyssIGJ1dCBub3QgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IG9uIGFsbAorICAgIC8vIGltcGxlbWVudGF0aW9ucy4KKyAgICByZXR1cm4gYmFja3RyYWNlXy0+aGFzaCgpIF4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMV8pCisgICAgICAgICAgIF4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMl8pOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IEJhY2t0cmFjZSogYmFja3RyYWNlXzsKKyAgY29uc3QgY2hhciogdHlwZU5hbWUxXzsKKyAgY29uc3QgY2hhciogdHlwZU5hbWUyXzsKK307CisKKy8qKgorICogQSBmdW5jdG9yIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBvZiB0d28gQmFja3RyYWNlTWFwIGVudHJpZXMKKyAqIGhhcyBhIGhpZ2hlciBjb3VudC4KKyAqLworY2xhc3MgQ291bnRHcmVhdGVyIHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQxLCBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MikgY29uc3QgeworICAgIHJldHVybiBidDEuc2Vjb25kID4gYnQyLnNlY29uZDsKKyAgfQorfTsKKwordHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbWFwPEtleSwgc2l6ZV90LCBLZXk6Okhhc2g+IEJhY2t0cmFjZU1hcDsKKworLyoqCisgKiBBIG1hcCBkZXNjcmliaW5nIGhvdyBtYW55IHRpbWVzIFRfVklSVFVBTF9DQUxMKCkgaGFzIGJlZW4gaW52b2tlZC4KKyAqLworQmFja3RyYWNlTWFwIHZpcnR1YWxfY2FsbHM7CitNdXRleCB2aXJ0dWFsX2NhbGxzX211dGV4OworCisvKioKKyAqIEEgbWFwIGRlc2NyaWJpbmcgaG93IG1hbnkgdGltZXMgVF9HRU5FUklDX1BST1RPQ09MKCkgaGFzIGJlZW4gaW52b2tlZC4KKyAqLworQmFja3RyYWNlTWFwIGdlbmVyaWNfY2FsbHM7CitNdXRleCBnZW5lcmljX2NhbGxzX211dGV4OworCit2b2lkIF9yZWNvcmRfYmFja3RyYWNlKEJhY2t0cmFjZU1hcCogbWFwLCBjb25zdCBNdXRleCYgbXV0ZXgsIEtleSogaykgeworICBHdWFyZCBndWFyZChtdXRleCk7CisKKyAgQmFja3RyYWNlTWFwOjppdGVyYXRvciBpdCA9IG1hcC0+ZmluZCgqayk7CisgIGlmIChpdCA9PSBtYXAtPmVuZCgpKSB7CisgICAgay0+bWFrZVBlcnNpc3RlbnQoKTsKKyAgICBtYXAtPmluc2VydChzdGQ6Om1ha2VfcGFpcigqaywgMSkpOworICB9IGVsc2UgeworICAgIC8vIGluY3JlbWVudCB0aGUgY291bnQKKyAgICAvLyBOT1RFOiB3ZSBjb3VsZCBhc3NlcnQgaWYgaXQtPnNlY29uZCBpcyAwIGFmdGVyd2FyZHMsIHNpbmNlIHRoYXQgd291bGQKKyAgICAvLyBtZWFuIHdlJ3ZlIHdyYXBwZWQuCisgICAgKysoaXQtPnNlY29uZCk7CisgIH0KK30KKworLyoqCisgKiBSZWNvcmQgYW4gdW5uZWNlc3NhcnkgdmlydHVhbCBmdW5jdGlvbiBjYWxsLgorICoKKyAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIFRfVklSVFVBTF9DQUxMKCkgbWFjcm8uCisgKi8KK3ZvaWQgcHJvZmlsZV92aXJ0dWFsX2NhbGwoY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGUpIHsKKyAgaW50IGNvbnN0IHNraXAgPSAxOyAvLyBpZ25vcmUgdGhpcyBmcmFtZQorICBCYWNrdHJhY2UgYnQoc2tpcCk7CisgIEtleSBrKCZidCwgdHlwZSk7CisgIF9yZWNvcmRfYmFja3RyYWNlKCZ2aXJ0dWFsX2NhbGxzLCB2aXJ0dWFsX2NhbGxzX211dGV4LCAmayk7Cit9CisKKy8qKgorICogUmVjb3JkIGEgY2FsbCB0byBhIHRlbXBsYXRlIHByb2Nlc3NvciB3aXRoIGEgcHJvdG9jb2wgdGhhdCBpcyBub3QgdGhlIG9uZQorICogc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgKgorICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgVF9HRU5FUklDX1BST1RPQ09MKCkgbWFjcm8uCisgKi8KK3ZvaWQgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0ZW1wbGF0ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHByb3RfdHlwZSkgeworICBpbnQgY29uc3Qgc2tpcCA9IDE7IC8vIGlnbm9yZSB0aGlzIGZyYW1lCisgIEJhY2t0cmFjZSBidChza2lwKTsKKyAgS2V5IGsoJmJ0LCB0ZW1wbGF0ZV90eXBlLCBwcm90X3R5cGUpOworICBfcmVjb3JkX2JhY2t0cmFjZSgmZ2VuZXJpY19jYWxscywgZ2VuZXJpY19jYWxsc19tdXRleCwgJmspOworfQorCisvKioKKyAqIFByaW50IHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gdGhlIHNwZWNpZmllZCBmaWxlLgorICovCit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFKiBmKSB7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKKworICBDb3VudEdyZWF0ZXIgaXNfZ3JlYXRlcjsKKworICAvLyBHcmFiIGJvdGggbG9ja3MgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJpbnQgb3BlcmF0aW9uLAorICAvLyB0byBlbnN1cmUgdGhlIG91dHB1dCBpcyBhIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgYSBzaW5nbGUgcG9pbnQgaW4gdGltZQorICBHdWFyZCBnZW5lcmljX2NhbGxzX2d1YXJkKGdlbmVyaWNfY2FsbHNfbXV0ZXgpOworICBHdWFyZCB2aXJ0dWFsX2NhbGxzX2d1YXJkKHZpcnR1YWxfY2FsbHNfbXV0ZXgpOworCisgIC8vIHByaW50IHRoZSBpbmZvIGZyb20gZ2VuZXJpY19jYWxscywgc29ydGVkIGJ5IGZyZXF1ZW5jeQorICAvLworICAvLyBXZSBwcmludCB0aGUgZ2VuZXJpY19jYWxscyBpbmZvIGFoZWFkIG9mIHZpcnR1YWxfY2FsbHMsIHNpbmNlIGl0IGlzIG1vcmUKKyAgLy8gdXNlZnVsIGluIHNvbWUgY2FzZXMuICBBbGwgVF9HRU5FUklDX1BST1RPQ09MIGNhbGxzIGNhbiBiZSBlbGltaW5hdGVkCisgIC8vIGZyb20gbW9zdCBwcm9ncmFtcy4gIE5vdCBhbGwgVF9WSVJUVUFMX0NBTExzIHdpbGwgYmUgZWxpbWluYXRlZCBieQorICAvLyBjb252ZXJ0aW5nIHRvIHRlbXBsYXRlcy4KKyAgQmFja3RyYWNlVmVjdG9yIGdwX3NvcnRlZChnZW5lcmljX2NhbGxzLmJlZ2luKCksIGdlbmVyaWNfY2FsbHMuZW5kKCkpOworICBzdGQ6OnNvcnQoZ3Bfc29ydGVkLmJlZ2luKCksIGdwX3NvcnRlZC5lbmQoKSwgaXNfZ3JlYXRlcik7CisKKyAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ3Bfc29ydGVkLmJlZ2luKCk7IGl0ICE9IGdwX3NvcnRlZC5lbmQoKTsgKytpdCkgeworICAgIEtleSBjb25zdCYga2V5ID0gaXQtPmZpcnN0OworICAgIHNpemVfdCBjb25zdCBjb3VudCA9IGl0LT5zZWNvbmQ7CisgICAgZnByaW50ZihmLAorICAgICAgICAgICAgIlRfR0VORVJJQ19QUk9UT0NPTDogJXp1IGNhbGxzIHRvICVzIHdpdGggYSAlczpcbiIsCisgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgIGtleS5nZXRUeXBlTmFtZSgpLAorICAgICAgICAgICAga2V5LmdldFR5cGVOYW1lMigpKTsKKyAgICBrZXkuZ2V0QmFja3RyYWNlKCktPnByaW50KGYsIDIpOworICAgIGZwcmludGYoZiwgIlxuIik7CisgIH0KKworICAvLyBwcmludCB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMsIHNvcnRlZCBieSBmcmVxdWVuY3kKKyAgQmFja3RyYWNlVmVjdG9yIHZjX3NvcnRlZCh2aXJ0dWFsX2NhbGxzLmJlZ2luKCksIHZpcnR1YWxfY2FsbHMuZW5kKCkpOworICBzdGQ6OnNvcnQodmNfc29ydGVkLmJlZ2luKCksIHZjX3NvcnRlZC5lbmQoKSwgaXNfZ3JlYXRlcik7CisKKyAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdmNfc29ydGVkLmJlZ2luKCk7IGl0ICE9IHZjX3NvcnRlZC5lbmQoKTsgKytpdCkgeworICAgIEtleSBjb25zdCYga2V5ID0gaXQtPmZpcnN0OworICAgIHNpemVfdCBjb25zdCBjb3VudCA9IGl0LT5zZWNvbmQ7CisgICAgZnByaW50ZihmLCAiVF9WSVJUVUFMX0NBTEw6ICV6dSBjYWxscyBvbiAlczpcbiIsIGNvdW50LCBrZXkuZ2V0VHlwZU5hbWUoKSk7CisgICAga2V5LmdldEJhY2t0cmFjZSgpLT5wcmludChmLCAyKTsKKyAgICBmcHJpbnRmKGYsICJcbiIpOworICB9Cit9CisKKy8qKgorICogUHJpbnQgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byBzdGRvdXQuCisgKi8KK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKCkgeworICBwcm9maWxlX3ByaW50X2luZm8oc3Rkb3V0KTsKK30KKworLyoqCisgKiBXcml0ZSBhIEJhY2t0cmFjZU1hcCBhcyBHb29nbGUgQ1BVIHByb2ZpbGVyIGJpbmFyeSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mX2ZpbGUoRklMRSogZiwgQmFja3RyYWNlTWFwIGNvbnN0JiBtYXApIHsKKyAgLy8gV3JpdGUgdGhlIGhlYWRlcgorICB1aW50cHRyX3QgaGVhZGVyWzVdID0gezAsIDMsIDAsIDAsIDB9OworICBmd3JpdGUoJmhlYWRlciwgc2l6ZW9mKGhlYWRlciksIDEsIGYpOworCisgIC8vIFdyaXRlIHRoZSBwcm9maWxlIHJlY29yZHMKKyAgZm9yIChCYWNrdHJhY2VNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgeworICAgIHVpbnRwdHJfdCBjb3VudCA9IGl0LT5zZWNvbmQ7CisgICAgZndyaXRlKCZjb3VudCwgc2l6ZW9mKGNvdW50KSwgMSwgZik7CisKKyAgICBCYWNrdHJhY2UgY29uc3QqIGJ0ID0gaXQtPmZpcnN0LmdldEJhY2t0cmFjZSgpOworICAgIHVpbnRwdHJfdCBudW1fcGNzID0gYnQtPmdldERlcHRoKCk7CisgICAgZndyaXRlKCZudW1fcGNzLCBzaXplb2YobnVtX3BjcyksIDEsIGYpOworCisgICAgZm9yICh1aW50cHRyX3QgbiA9IDA7IG4gPCBudW1fcGNzOyArK24pIHsKKyAgICAgIHZvaWQqIHBjID0gYnQtPmdldEZyYW1lKG4pOworICAgICAgZndyaXRlKCZwYywgc2l6ZW9mKHBjKSwgMSwgZik7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgdGhlIHRyYWlsZXIKKyAgdWludHB0cl90IHRyYWlsZXJbM10gPSB7MCwgMSwgMH07CisgIGZ3cml0ZSgmdHJhaWxlciwgc2l6ZW9mKHRyYWlsZXIpLCAxLCBmKTsKKworICAvLyBXcml0ZSAvcHJvYy9zZWxmL21hcHMKKyAgLy8gVE9ETyhzaW1wa2lucyk6IFRoaXMgb25seSB3b3JrcyBvbiBsaW51eAorICBGSUxFKiBwcm9jX21hcHMgPSBmb3BlbigiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKKyAgaWYgKHByb2NfbWFwcykgeworICAgIHVpbnQ4X3QgYnVmWzQwOTZdOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIHByb2NfbWFwcyk7CisgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZndyaXRlKGJ1ZiwgMSwgYnl0ZXNfcmVhZCwgZik7CisgICAgfQorICAgIGZjbG9zZShwcm9jX21hcHMpOworICB9Cit9CisKKy8qKgorICogV3JpdGUgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhcyBwcHJvZiBmaWxlcy4KKyAqCisgKiBUaGlzIHdyaXRlcyB0aGUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIEdvb2dsZSBDUFUgcHJvZmlsZXIgYmluYXJ5IGRhdGEKKyAqIGZvcm1hdCwgc28gaXQgY2FuIGJlIGFuYWx5emVkIHdpdGggcHByb2YuICBOb3RlIHRoYXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBwcm90b2NvbC90cmFuc3BvcnQgZGF0YSB0eXBlcyBjYW5ub3QgYmUgc3RvcmVkIGluIHRoaXMgZmlsZSBmb3JtYXQuCisgKgorICogU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtcGVyZnRvb2xzLyBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSBnZW5fY2FsbHNfZiAgICAgVGhlIGluZm9ybWF0aW9uIGFib3V0IGNhbGxzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCgpIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuCisgKiBAcGFyYW0gdmlydHVhbF9jYWxsc19mIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxscyB0bworICogICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX3ZpcnR1YWxfY2FsbCgpIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuCisgKi8KK3ZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZihGSUxFKiBnZW5fY2FsbHNfZiwgRklMRSogdmlydHVhbF9jYWxsc19mKSB7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKKworICBDb3VudEdyZWF0ZXIgaXNfZ3JlYXRlcjsKKworICAvLyBHcmFiIGJvdGggbG9ja3MgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJpbnQgb3BlcmF0aW9uLAorICAvLyB0byBlbnN1cmUgdGhlIG91dHB1dCBpcyBhIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgYSBzaW5nbGUgcG9pbnQgaW4gdGltZQorICBHdWFyZCBnZW5lcmljX2NhbGxzX2d1YXJkKGdlbmVyaWNfY2FsbHNfbXV0ZXgpOworICBHdWFyZCB2aXJ0dWFsX2NhbGxzX2d1YXJkKHZpcnR1YWxfY2FsbHNfbXV0ZXgpOworCisgIC8vIHdyaXRlIHRoZSBpbmZvIGZyb20gZ2VuZXJpY19jYWxscworICBwcm9maWxlX3dyaXRlX3Bwcm9mX2ZpbGUoZ2VuX2NhbGxzX2YsIGdlbmVyaWNfY2FsbHMpOworCisgIC8vIHdyaXRlIHRoZSBpbmZvIGZyb20gdmlydHVhbF9jYWxscworICBwcm9maWxlX3dyaXRlX3Bwcm9mX2ZpbGUodmlydHVhbF9jYWxsc19mLCB2aXJ0dWFsX2NhbGxzKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIFRfR0xPQkFMX1BST0ZJTEVfVklSVFVBTCA+IDAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk2YjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7CitwdWJsaWM6CisgIC8vIFByb2Nlc3MgZGF0YSBpbiAiaW4iLCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gIm91dCIuCisgIC8vIENhbGwgX3JldHVybih0cnVlKSB3aGVuIGRvbmUsIG9yIF9yZXR1cm4oZmFsc2UpIHRvCisgIC8vIGZvcmNlZnVsbHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKGlmIGFwcGxpY2FibGUpLgorICAvLyAiaW4iIGFuZCAib3V0IiBzaG91bGQgYmUgVE1lbW9yeUJ1ZmZlciBvciBzaW1pbGFyLAorICAvLyBub3QgYSB3cmFwcGVyIGFyb3VuZCBhIHNvY2tldC4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1ZikgPSAwOworICB2aXJ0dWFsIH5UQXN5bmNCdWZmZXJQcm9jZXNzb3IoKSB7fQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI5MTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCit2b2lkIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBzZW5kX2RvbmUKKyAgICAgID0gc3RkOjpiaW5kKCZUQXN5bmNDaGFubmVsOjpyZWN2TWVzc2FnZSwgdGhpcywgY29iLCByZWN2QnVmKTsKKworICBzZW5kTWVzc2FnZShzZW5kX2RvbmUsIHNlbmRCdWYpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWNlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KKyNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfIDEKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKK30KK30KK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOworCitjbGFzcyBUQXN5bmNDaGFubmVsIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZENhbGxiYWNrOworCisgIHZpcnR1YWwgflRBc3luY0NoYW5uZWwoKSB7fQorCisgIC8vIGlzIHRoZSBjaGFubmVsIGluIGEgZ29vZCBzdGF0ZT8KKyAgdmlydHVhbCBib29sIGdvb2QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBlcnJvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBTZW5kIGEgbWVzc2FnZSBvdmVyIHRoZSBjaGFubmVsLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlbmRNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOworCisgIC8qKgorICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBjaGFubmVsLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOworCisgIC8qKgorICAgKiBTZW5kIGEgbWVzc2FnZSBvdmVyIHRoZSBjaGFubmVsIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGI1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfQVNZTkNfVEFTWU5DRElTUEFUQ0hQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworLyoqCisgKiBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciBpcyBhIGhlbHBlciBjbGFzcyB0byBwYXJzZSB0aGUgbWVzc2FnZSBoZWFkZXIgdGhlbgorICogY2FsbCBhbm90aGVyIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICoKKyAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZGlzcGF0Y2hDYWxsKCkgdG8gZGlzcGF0Y2ggb24gdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+CitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQgOiBwdWJsaWMgVEFzeW5jUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOworCisgICAgLy8gVHJ5IHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgdGVtcGxhdGUgcHJvdG9jb2wgdHlwZQorICAgIFByb3RvY29sXyogc3BlY2lmaWNJbiA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpblJhdyk7CisgICAgUHJvdG9jb2xfKiBzcGVjaWZpY091dCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvdXRSYXcpOworICAgIGlmIChzcGVjaWZpY0luICYmIHNwZWNpZmljT3V0KSB7CisgICAgICByZXR1cm4gcHJvY2Vzc0Zhc3QoX3JldHVybiwgc3BlY2lmaWNJbiwgc3BlY2lmaWNPdXQpOworICAgIH0KKworICAgIC8vIExvZyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBzbG93IHBhdGgKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaW5SYXcsIHNwZWNpZmljSW4pOworICAgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvdXRSYXcsIHNwZWNpZmljT3V0KTsKKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpblJhdy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIC8vIElmIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBjYWxsLCBsb2cgYW4gZXJyb3IgYW5kIHJldHVybiBmYWxzZSBzbworICAgIC8vIHRoYXQgdGhlIHNlcnZlciB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgIC8vCisgICAgLy8gKFRoZSBvbGQgZ2VuZXJhdGVkIHByb2Nlc3NvciBjb2RlIHVzZWQgdG8gdHJ5IHRvIHNraXAgYSBUX1NUUlVDVCBhbmQKKyAgICAvLyBjb250aW51ZS4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMgdW5zYWZlLikKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgX3JldHVybihmYWxzZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCBwcm9jZXNzRmFzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIGluLAorICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogb3V0KSB7CisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIF9yZXR1cm4oZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoX3JldHVybiwgaW4sIG91dCwgZm5hbWUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOworfTsKKworLyoqCisgKiBOb24tdGVtcGxhdGl6ZWQgdmVyc2lvbiBvZiBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciwKKyAqIHRoYXQgZG9lc24ndCBib3RoZXIgdHJ5aW5nIHRvIHBlcmZvcm0gYSBkeW5hbWljX2Nhc3QuCisgKi8KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpblJhdy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIC8vIElmIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBjYWxsLCBsb2cgYW4gZXJyb3IgYW5kIHJldHVybiBmYWxzZSBzbworICAgIC8vIHRoYXQgdGhlIHNlcnZlciB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgIC8vCisgICAgLy8gKFRoZSBvbGQgZ2VuZXJhdGVkIHByb2Nlc3NvciBjb2RlIHVzZWQgdG8gdHJ5IHRvIHNraXAgYSBUX1NUUlVDVCBhbmQKKyAgICAvLyBjb250aW51ZS4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMgdW5zYWZlLikKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgX3JldHVybihmYWxzZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKK307CisKKy8vIFNwZWNpYWxpemUgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIGZvciBUUHJvdG9jb2wgYW5kIFREdW1teVByb3RvY29sIGp1c3QgdG8KKy8vIHVzZSB0aGUgZ2VuZXJpYyBURGlzcGF0Y2hQcm9jZXNzb3IuCit0ZW1wbGF0ZSA8PgorY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOiBwdWJsaWMgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3Ige307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpUUHJvdG9jb2w+IDogcHVibGljIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIHt9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vIF9USFJJRlRfQVNZTkNfVEFTWU5DRElTUEFUQ0hQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI5NzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCisvKioKKyAqIEFzeW5jIHZlcnNpb24gb2YgYSBUUHJvY2Vzc29yLiAgSXQgaXMgbm90IGV4cGVjdGVkIHRvIGNvbXBsZXRlIGJ5IHRoZSB0aW1lCisgKiB0aGUgY2FsbCB0byBwcm9jZXNzIHJldHVybnMuICBJbnN0ZWFkLCBpdCBjYWxscyBhIGNvYiB0byBzaWduYWwgY29tcGxldGlvbi4KKyAqLworCitjbGFzcyBUQXN5bmNQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIH5UQXN5bmNQcm9jZXNzb3IoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKKworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKKyAgICByZXR1cm4gcHJvY2VzcyhfcmV0dXJuLCBpbywgaW8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFRBc3luY1Byb2Nlc3NvcigpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Cit9OworCitjbGFzcyBUQXN5bmNQcm9jZXNzb3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIEdldCB0aGUgVEFzeW5jUHJvY2Vzc29yIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGlzIGFsd2F5cyBpbnZva2VkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcworICAgKiBhY2NlcHRlZCBvbi4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhpcyBjYWxsIGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgICogdGhyZWFkIHNhZmUsIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGludm9rZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7Cit9Cit9CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUyMDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK3ZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBvYnVmKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2woaWJ1ZikpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKKyAgcmV0dXJuIHVuZGVybHlpbmdfCisgICAgICAtPnByb2Nlc3Moc3RkOjpiaW5kKCZUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICBpcHJvdCwKKyAgICAgICAgICAgICAgICBvcHJvdCk7Cit9CisKKy8qIHN0YXRpYyAqLyB2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2goCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QsCisgICAgYm9vbCBoZWFsdGh5KSB7CisgICh2b2lkKW9wcm90OworICAvLyBUaGlzIGlzIGEgc3R1YiBmdW5jdGlvbiB0byBob2xkIGEgcmVmZXJlbmNlIHRvIG9wcm90LgorICByZXR1cm4gX3JldHVybihoZWFsdGh5KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTJjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UTkFNRV9NRV9IXworI2RlZmluZSBfVEhSSUZUX1ROQU1FX01FX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jQnVmZmVyUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCisgICAgOiB1bmRlcmx5aW5nXyh1bmRlcmx5aW5nKSwgcGZhY3RfKHBmYWN0KSB7fQorCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CisKKyAgdmlydHVhbCB+VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoKSB7fQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBmaW5pc2goc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFsdGh5KTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVE5BTUVfTUVfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UyN2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKCkgOgorICBzdG9wXyhmYWxzZSksCisgIHNlcWlkTXV0ZXhfKCksCisgIC8vIHRlc3Qgcm9sbG92ZXIgYWxsIHRoZSB0aW1lCisgIG5leHRzZXFpZF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKS0xMCksCisgIHNlcWlkVG9Nb25pdG9yTWFwXygpLAorICBmcmVlTW9uaXRvcnNfKCksCisgIHdyaXRlTXV0ZXhfKCksCisgIHJlYWRNdXRleF8oKSwKKyAgcmVjdlBlbmRpbmdfKGZhbHNlKSwKKyAgd2FrZXVwU29tZW9uZV8oZmFsc2UpLAorICBzZXFpZFBlbmRpbmdfKDApLAorICBmbmFtZVBlbmRpbmdfKCksCisgIG10eXBlUGVuZGluZ18oOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCkKK3sKKyAgZnJlZU1vbml0b3JzXy5yZXNlcnZlKE1PTklUT1JfQ0FDSEVfU0laRSk7Cit9CisKK2Jvb2wgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6Z2V0UGVuZGluZygKKyAgc3RkOjpzdHJpbmcgJmZuYW1lLAorICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlICZtdHlwZSwKKyAgaW50MzJfdCAmcnNlcWlkKQoreworICBpZihzdG9wXykKKyAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworICB3YWtldXBTb21lb25lXyA9IGZhbHNlOworICBpZihyZWN2UGVuZGluZ18pCisgIHsKKyAgICByZWN2UGVuZGluZ18gPSBmYWxzZTsKKyAgICByc2VxaWQgPSBzZXFpZFBlbmRpbmdfOworICAgIGZuYW1lICA9IGZuYW1lUGVuZGluZ187CisgICAgbXR5cGUgID0gbXR5cGVQZW5kaW5nXzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6dXBkYXRlUGVuZGluZygKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmZuYW1lLAorICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlLAorICBpbnQzMl90IHJzZXFpZCkKK3sKKyAgcmVjdlBlbmRpbmdfID0gdHJ1ZTsKKyAgc2VxaWRQZW5kaW5nXyA9IHJzZXFpZDsKKyAgZm5hbWVQZW5kaW5nXyA9IGZuYW1lOworICBtdHlwZVBlbmRpbmdfID0gbXR5cGU7CisgIE1vbml0b3JQdHIgbW9uaXRvcjsKKyAgeworICAgIEd1YXJkIHNlcWlkR3VhcmQoc2VxaWRNdXRleF8pOworICAgIE1vbml0b3JNYXA6Oml0ZXJhdG9yIGkgPSBzZXFpZFRvTW9uaXRvck1hcF8uZmluZChyc2VxaWQpOworICAgIGlmKGkgPT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpKQorICAgICAgdGhyb3dCYWRTZXFJZF8oKTsKKyAgICBtb25pdG9yID0gaS0+c2Vjb25kOworICB9CisgIG1vbml0b3ItPm5vdGlmeSgpOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OndhaXRGb3JXb3JrKGludDMyX3Qgc2VxaWQpCit7CisgIE1vbml0b3JQdHIgbTsKKyAgeworICAgIEd1YXJkIHNlcWlkR3VhcmQoc2VxaWRNdXRleF8pOworICAgIG0gPSBzZXFpZFRvTW9uaXRvck1hcF9bc2VxaWRdOworICB9CisgIHdoaWxlKHRydWUpCisgIHsKKyAgICAvLyBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQgc2V0dGluZyBzdGF0ZSBpbiB0aGlzIGxvb3AgdGhhdCBhZmZlY3RzIHdha2luZyB1cC4gIFlvdSBtYXkgZXhpdAorICAgIC8vIHRoaXMgZnVuY3Rpb24sIGF0dGVtcHQgdG8gZ3JhYiBzb21lIHdvcmssIGFuZCBzb21lb25lIGVsc2UgY291bGQgaGF2ZSBiZWF0ZW4geW91IChvciBub3QKKyAgICAvLyBsZWZ0KSB0aGUgcmVhZCBtdXRleCwgYW5kIHRoYXQgd2lsbCBwdXQgeW91IHJpZ2h0IGJhY2sgaW4gdGhpcyBsb29wLCB3aXRoIHRoZSBtYW5nbGVkCisgICAgLy8gc3RhdGUgeW91IGxlZnQgYmVoaW5kLgorICAgIGlmKHN0b3BfKQorICAgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKyAgICBpZih3YWtldXBTb21lb25lXykKKyAgICAgIHJldHVybjsKKyAgICBpZihyZWN2UGVuZGluZ18gJiYgc2VxaWRQZW5kaW5nXyA9PSBzZXFpZCkKKyAgICAgIHJldHVybjsKKyAgICBtLT53YWl0Rm9yZXZlcigpOworICB9Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6dGhyb3dCYWRTZXFJZF8oKQoreworICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lELAorICAgICJzZXJ2ZXIgc2VudCBhIGJhZCBzZXFpZCIpOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnRocm93RGVhZENvbm5lY3Rpb25fKCkKK3sKKyAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAidGhpcyBjbGllbnQgZGllZCBvbiBhbm90aGVyIHRocmVhZCwgYW5kIGlzIG5vdyBpbiBhbiB1bnVzYWJsZSBzdGF0ZSIpOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ondha2V1cEFueW9uZV8oY29uc3QgR3VhcmQgJikKK3sKKyAgd2FrZXVwU29tZW9uZV8gPSB0cnVlOworICBpZighc2VxaWRUb01vbml0b3JNYXBfLmVtcHR5KCkpCisgIHsKKyAgICAvLyBUaGUgbW9uaXRvciBtYXAgbWFwcyBpbnRlZ2VycyB0byBtb25pdG9ycy4gIExhcmdlciBpbnRlZ2VycyBhcmUgbW9yZSByZWNlbnQKKyAgICAvLyBtZXNzYWdlcy4gIFNpbmNlIHRoaXMgaXMgb3JkZXJlZCwgaXQgbWVhbnMgdGhhdCB0aGUgbGFzdCBlbGVtZW50IGlzIHRoZSBtb3N0IHJlY2VudC4KKyAgICAvLyBXZSBhcmUgdHJ5aW5nIHRvIGd1ZXNzIHdoaWNoIHRocmVhZCB3aWxsIGhhdmUgaXRzIG1lc3NhZ2UgY29tcGxldGUgbmV4dCwgc28gd2UgYXJlIHBpY2tpbmcKKyAgICAvLyB0aGUgbW9zdCByZWNlbnQuIFRoZSBvbGRlc3QgbWVzc2FnZSBpcyBsaWtlbHkgdG8gYmUgc29tZSBwb2xsaW5nLCBsb25nIGxpdmVkIG1lc3NhZ2UuCisgICAgLy8gSWYgd2UgZ3Vlc3MgcmlnaHQsIHRoZSB0aHJlYWQgd2Ugd2FrZSB1cCB3aWxsIGhhbmRsZSB0aGUgbWVzc2FnZSB0aGF0IGNvbWVzIGluLgorICAgIC8vIElmIHdlIGd1ZXNzIHdyb25nLCB0aGUgdGhyZWFkIHdlIHdha2UgdXAgd2lsbCBoYW5kIG9mZiB0aGUgd29yayB0byB0aGUgY29ycmVjdCB0aHJlYWQsCisgICAgLy8gY29zdGluZyB1cyBhbiBleHRyYSBjb250ZXh0IHN3aXRjaC4KKyAgICBzZXFpZFRvTW9uaXRvck1hcF8ucmJlZ2luKCktPnNlY29uZC0+bm90aWZ5KCk7CisgIH0KK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjptYXJrQmFkXyhjb25zdCBHdWFyZCAmKQoreworICB3YWtldXBTb21lb25lXyA9IHRydWU7CisgIHN0b3BfID0gdHJ1ZTsKKyAgZm9yKE1vbml0b3JNYXA6Oml0ZXJhdG9yIGkgPSBzZXFpZFRvTW9uaXRvck1hcF8uYmVnaW4oKTsgaSAhPSBzZXFpZFRvTW9uaXRvck1hcF8uZW5kKCk7ICsraSkKKyAgICBpLT5zZWNvbmQtPm5vdGlmeSgpOworfQorCitUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpNb25pdG9yUHRyCitUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpuZXdNb25pdG9yXyhjb25zdCBHdWFyZCAmKQoreworICBpZihmcmVlTW9uaXRvcnNfLmVtcHR5KCkpCisgICAgcmV0dXJuIE1vbml0b3JQdHIobmV3IE1vbml0b3IoJnJlYWRNdXRleF8pKTsKKyAgTW9uaXRvclB0ciByZXR2YWw7CisgIC8vc3dhcHBpbmcgdG8gYXZvaWQgYW4gYXRvbWljIG9wZXJhdGlvbgorICByZXR2YWwuc3dhcChmcmVlTW9uaXRvcnNfLmJhY2soKSk7CisgIGZyZWVNb25pdG9yc18ucG9wX2JhY2soKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpkZWxldGVNb25pdG9yXygKKyAgY29uc3QgR3VhcmQgJiwKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0ciAmbSkgLypub2V4Y2VwdCovCit7CisgIGlmKGZyZWVNb25pdG9yc18uc2l6ZSgpID4gTU9OSVRPUl9DQUNIRV9TSVpFKQorICB7CisgICAgbS5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorICAvL2ZyZWVNb25pdG9yc18gd2FzIHJlc2VydmVkIHVwIHRvIE1PTklUT1JfQ0FDSEVfU0laRSBpbiB0aGUgY3RvciwKKyAgLy9zbyB0aGlzIHNob3VsZG4ndCB0aHJvdworICBmcmVlTW9uaXRvcnNfLnB1c2hfYmFjayhUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpNb25pdG9yUHRyKCkpOworICAvL3N3YXBwaW5nIHRvIGF2b2lkIGFuIGF0b21pYyBvcGVyYXRpb24KKyAgbS5zd2FwKGZyZWVNb25pdG9yc18uYmFjaygpKTsKK30KKworaW50MzJfdCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpnZW5lcmF0ZVNlcUlkKCkKK3sKKyAgR3VhcmQgc2VxaWRHdWFyZChzZXFpZE11dGV4Xyk7CisgIGlmKHN0b3BfKQorICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisKKyAgaWYoIXNlcWlkVG9Nb25pdG9yTWFwXy5lbXB0eSgpKQorICAgIGlmKG5leHRzZXFpZF8gPT0gc2VxaWRUb01vbml0b3JNYXBfLmJlZ2luKCktPmZpcnN0KQorICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQsCisgICAgICAgICJhYm91dCB0byByZXBlYXQgYSBzZXFpZCIpOworICBpbnQzMl90IG5ld1NlcUlkID0gbmV4dHNlcWlkXysrOworICBzZXFpZFRvTW9uaXRvck1hcF9bbmV3U2VxSWRdID0gbmV3TW9uaXRvcl8oc2VxaWRHdWFyZCk7CisgIHJldHVybiBuZXdTZXFJZDsKK30KKworVENvbmN1cnJlbnRSZWN2U2VudHJ5OjpUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyAqc3luYywgaW50MzJfdCBzZXFpZCkgOgorICBzeW5jXygqc3luYyksCisgIHNlcWlkXyhzZXFpZCksCisgIGNvbW1pdHRlZF8oZmFsc2UpCit7CisgIHN5bmNfLmdldFJlYWRNdXRleCgpLmxvY2soKTsKK30KKworVENvbmN1cnJlbnRSZWN2U2VudHJ5Ojp+VENvbmN1cnJlbnRSZWN2U2VudHJ5KCkKK3sKKyAgeworICAgIEd1YXJkIHNlcWlkR3VhcmQoc3luY18uc2VxaWRNdXRleF8pOworICAgIHN5bmNfLmRlbGV0ZU1vbml0b3JfKHNlcWlkR3VhcmQsIHN5bmNfLnNlcWlkVG9Nb25pdG9yTWFwX1tzZXFpZF9dKTsKKworICAgIHN5bmNfLnNlcWlkVG9Nb25pdG9yTWFwXy5lcmFzZShzZXFpZF8pOworICAgIGlmKGNvbW1pdHRlZF8pCisgICAgICBzeW5jXy53YWtldXBBbnlvbmVfKHNlcWlkR3VhcmQpOworICAgIGVsc2UKKyAgICAgIHN5bmNfLm1hcmtCYWRfKHNlcWlkR3VhcmQpOworICB9CisgIHN5bmNfLmdldFJlYWRNdXRleCgpLnVubG9jaygpOworfQorCit2b2lkIFRDb25jdXJyZW50UmVjdlNlbnRyeTo6Y29tbWl0KCkKK3sKKyAgY29tbWl0dGVkXyA9IHRydWU7Cit9CisKK1RDb25jdXJyZW50U2VuZFNlbnRyeTo6VENvbmN1cnJlbnRTZW5kU2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMpIDoKKyAgc3luY18oKnN5bmMpLAorICBjb21taXR0ZWRfKGZhbHNlKQoreworICBzeW5jXy5nZXRXcml0ZU11dGV4KCkubG9jaygpOworfQorCitUQ29uY3VycmVudFNlbmRTZW50cnk6On5UQ29uY3VycmVudFNlbmRTZW50cnkoKQoreworICBpZighY29tbWl0dGVkXykKKyAgeworICAgIEd1YXJkIHNlcWlkR3VhcmQoc3luY18uc2VxaWRNdXRleF8pOworICAgIHN5bmNfLm1hcmtCYWRfKHNlcWlkR3VhcmQpOworICB9CisgIHN5bmNfLmdldFdyaXRlTXV0ZXgoKS51bmxvY2soKTsKK30KKwordm9pZCBUQ29uY3VycmVudFNlbmRTZW50cnk6OmNvbW1pdCgpCit7CisgIGNvbW1pdHRlZF8gPSB0cnVlOworfQorCisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzVlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXworI2RlZmluZSBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzsKKworY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVENvbmN1cnJlbnRTZW5kU2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8qIHN5bmMpOworICB+VENvbmN1cnJlbnRTZW5kU2VudHJ5KCk7CisKKyAgdm9pZCBjb21taXQoKTsKKworcHJpdmF0ZToKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyYgc3luY187CisgIGJvb2wgY29tbWl0dGVkXzsKK307CisKK2NsYXNzIFRDb25jdXJyZW50UmVjdlNlbnRyeSB7CitwdWJsaWM6CisgIFRDb25jdXJyZW50UmVjdlNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jLCBpbnQzMl90IHNlcWlkKTsKKyAgflRDb25jdXJyZW50UmVjdlNlbnRyeSgpOworCisgIHZvaWQgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8mIHN5bmNfOworICBpbnQzMl90IHNlcWlkXzsKKyAgYm9vbCBjb21taXR0ZWRfOworfTsKKworY2xhc3MgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyB7Citwcml2YXRlOiAvLyB0eXBlZGVmcworICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I+IE1vbml0b3JQdHI7CisgIHR5cGVkZWYgc3RkOjptYXA8aW50MzJfdCwgTW9uaXRvclB0cj4gTW9uaXRvck1hcDsKKworcHVibGljOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKCk7CisKKyAgaW50MzJfdCBnZW5lcmF0ZVNlcUlkKCk7CisKKyAgYm9vbCBnZXRQZW5kaW5nKHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUmIG10eXBlLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgcnNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLworCisgIHZvaWQgdXBkYXRlUGVuZGluZyhjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisKKyAgdm9pZCB3YWl0Rm9yV29yayhpbnQzMl90IHNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCYgZ2V0UmVhZE11dGV4KCkgeyByZXR1cm4gcmVhZE11dGV4XzsgfQorICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXgmIGdldFdyaXRlTXV0ZXgoKSB7IHJldHVybiB3cml0ZU11dGV4XzsgfQorCitwcml2YXRlOiAvLyBjb25zdGFudHMKKyAgZW51bSB7IE1PTklUT1JfQ0FDSEVfU0laRSA9IDEwIH07CisKK3ByaXZhdGU6IC8vIGZ1bmN0aW9ucworICBNb25pdG9yUHRyIG5ld01vbml0b3JfKAorICAgICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCBkZWxldGVNb25pdG9yXyhjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQsIE1vbml0b3JQdHImIG0pOworICAgICAgLypub2V4Y2VwdCovIC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgd2FrZXVwQW55b25lXygKKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7ICAgICAgICAgICAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIG1hcmtCYWRfKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgdGhyb3dCYWRTZXFJZF8oKTsKKyAgdm9pZCB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworCitwcml2YXRlOiAvLyBkYXRhIG1lbWJlcnMKKyAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggc2VxaWRNdXRleF87CisgIC8vIGJlZ2luIHNlcWlkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisgIGludDMyX3QgbmV4dHNlcWlkXzsKKyAgTW9uaXRvck1hcCBzZXFpZFRvTW9uaXRvck1hcF87CisgIHN0ZDo6dmVjdG9yPE1vbml0b3JQdHI+IGZyZWVNb25pdG9yc187CisgIC8vIGVuZCBzZXFpZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCB3cml0ZU11dGV4XzsKKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggcmVhZE11dGV4XzsKKyAgLy8gYmVnaW4gcmVhZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworICBib29sIHJlY3ZQZW5kaW5nXzsKKyAgYm9vbCB3YWtldXBTb21lb25lXzsKKyAgaW50MzJfdCBzZXFpZFBlbmRpbmdfOworICBzdGQ6OnN0cmluZyBmbmFtZVBlbmRpbmdfOworICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlUGVuZGluZ187CisgIC8vIGVuZCByZWFkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisKKyAgZnJpZW5kIGNsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeTsKKyAgZnJpZW5kIGNsYXNzIFRDb25jdXJyZW50UmVjdlNlbnRyeTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY4MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CisjaW5jbHVkZSA8ZXZodHRwLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlci5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXJfY29tcGF0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworVEV2aHR0cENsaWVudENoYW5uZWw6OlRFdmh0dHBDbGllbnRDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmRuc19iYXNlKiBkbnNiYXNlKQorCisgIDogaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpLCBjb25uXyhOVUxMKSB7CisgIGNvbm5fID0gZXZodHRwX2Nvbm5lY3Rpb25fYmFzZV9uZXcoZWIsIGRuc2Jhc2UsIGFkZHJlc3MsIHBvcnQpOworICBpZiAoY29ubl8gPT0gTlVMTCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9jb25uZWN0aW9uX25ldyBmYWlsZWQiKTsKKyAgfQorfQorCitURXZodHRwQ2xpZW50Q2hhbm5lbDo6flRFdmh0dHBDbGllbnRDaGFubmVsKCkgeworICBpZiAoY29ubl8gIT0gTlVMTCkgeworICAgIGV2aHR0cF9jb25uZWN0aW9uX2ZyZWUoY29ubl8pOworICB9Cit9CisKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKKyAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEgPSBldmh0dHBfcmVxdWVzdF9uZXcocmVzcG9uc2UsIHRoaXMpOworICBpZiAocmVxID09IE5VTEwpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfcmVxdWVzdF9uZXcgZmFpbGVkIik7CisgIH0KKworICBpbnQgcnY7CisKKyAgcnYgPSBldmh0dHBfYWRkX2hlYWRlcihyZXEtPm91dHB1dF9oZWFkZXJzLCAiSG9zdCIsIGhvc3RfLmNfc3RyKCkpOworICBpZiAocnYgIT0gMCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9hZGRfaGVhZGVyIGZhaWxlZCIpOworICB9CisKKyAgcnYgPSBldmh0dHBfYWRkX2hlYWRlcihyZXEtPm91dHB1dF9oZWFkZXJzLCAiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2FkZF9oZWFkZXIgZmFpbGVkIik7CisgIH0KKworICB1aW50OF90KiBvYnVmOworICB1aW50MzJfdCBzejsKKyAgc2VuZEJ1Zi0+Z2V0QnVmZmVyKCZvYnVmLCAmc3opOworICBydiA9IGV2YnVmZmVyX2FkZChyZXEtPm91dHB1dF9idWZmZXIsIG9idWYsIHN6KTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmJ1ZmZlcl9hZGQgZmFpbGVkIik7CisgIH0KKworICBydiA9IGV2aHR0cF9tYWtlX3JlcXVlc3QoY29ubl8sIHJlcSwgRVZIVFRQX1JFUV9QT1NULCBwYXRoXy5jX3N0cigpKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfbWFrZV9yZXF1ZXN0IGZhaWxlZCIpOworICB9CisKKyAgY29tcGxldGlvblF1ZXVlXy5wdXNoKENvbXBsZXRpb24oY29iLCByZWN2QnVmKSk7Cit9CisKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgeworICAodm9pZCljb2I7CisgICh2b2lkKW1lc3NhZ2U7CisgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNhbGwgdG8gVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRNZXNzYWdlIik7Cit9CisKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgeworICAodm9pZCljb2I7CisgICh2b2lkKW1lc3NhZ2U7CisgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNhbGwgdG8gVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlIik7Cit9CisKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OmZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgeworICBhc3NlcnQoIWNvbXBsZXRpb25RdWV1ZV8uZW1wdHkoKSk7CisgIENvbXBsZXRpb24gY29tcGxldGlvbiA9IGNvbXBsZXRpb25RdWV1ZV8uZnJvbnQoKTsKKyAgY29tcGxldGlvblF1ZXVlXy5wb3AoKTsKKyAgaWYgKHJlcSA9PSBOVUxMKSB7CisgICAgdHJ5IHsKKyAgICAgIGNvbXBsZXRpb24uZmlyc3QoKTsKKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7CisgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpCisgICAgICAgIHRocm93IFRFeGNlcHRpb24oImNvbm5lY3QgZmFpbGVkIik7CisgICAgICBlbHNlCisgICAgICAgIHRocm93OworICAgIH0KKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAocmVxLT5yZXNwb25zZV9jb2RlICE9IDIwMCkgeworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAic2VydmVyIHJldHVybmVkIGNvZGUgIiA8PCByZXEtPnJlc3BvbnNlX2NvZGU7CisgICAgICBpZiAocmVxLT5yZXNwb25zZV9jb2RlX2xpbmUpCisgICAgICAgIHNzIDw8ICI6ICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlX2xpbmU7CisgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpCisgICAgICAgIHRocm93IFRFeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGNvbXBsZXRpb24uc2Vjb25kLT5yZXNldEJ1ZmZlcihFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSk7CisgIGNvbXBsZXRpb24uZmlyc3QoKTsKKyAgcmV0dXJuOworfQorCisvKiBzdGF0aWMgKi8gdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVzcG9uc2Uoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIGFyZykgeworICBURXZodHRwQ2xpZW50Q2hhbm5lbCogc2VsZiA9IChURXZodHRwQ2xpZW50Q2hhbm5lbCopYXJnOworICB0cnkgeworICAgIHNlbGYtPmZpbmlzaChyZXEpOworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIC8vIGRvbid0IHByb3BhZ2F0ZSBhIEMrKyBleGNlcHRpb24gaW4gQyBjb2RlIChlLmcuIGxpYmV2ZW50KQorICAgIHN0ZDo6Y2VyciA8PCAiVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlIGV4Y2VwdGlvbiB0aHJvd24gKGlnbm9yZWQpOiAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KKyNkZWZpbmUgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfIDEKKworI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgorCitzdHJ1Y3QgZXZlbnRfYmFzZTsKK3N0cnVjdCBldmRuc19iYXNlOworc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uOworc3RydWN0IGV2aHR0cF9yZXF1ZXN0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CitjbGFzcyBUTWVtb3J5QnVmZmVyOworfQorfQorfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVEV2aHR0cENsaWVudENoYW5uZWwgOiBwdWJsaWMgVEFzeW5jQ2hhbm5lbCB7CitwdWJsaWM6CisgIHVzaW5nIFRBc3luY0NoYW5uZWw6OlZvaWRDYWxsYmFjazsKKworICBURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmRuc19iYXNlICpkbnNiYXNlID0gMCk7CisgIH5URXZodHRwQ2xpZW50Q2hhbm5lbCgpOworCisgIHZpcnR1YWwgdm9pZCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKKworICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKTsKKyAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CisKKyAgdm9pZCBmaW5pc2goc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOworCisgIC8vIFhYWAorICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgcmVzcG9uc2Uoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIGFyZyk7CisKKyAgc3RkOjpzdHJpbmcgaG9zdF87CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworICB0eXBlZGVmIHN0ZDo6cGFpcjxWb2lkQ2FsbGJhY2ssIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqPiBDb21wbGV0aW9uOworICB0eXBlZGVmIHN0ZDo6cXVldWU8Q29tcGxldGlvbj4gQ29tcGxldGlvblF1ZXVlOworICBDb21wbGV0aW9uUXVldWUgY29tcGxldGlvblF1ZXVlXzsKKyAgc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uKiBjb25uXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMzMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGV2aHR0cC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXIuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyX2NvbXBhdC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaWZuZGVmIEhUVFBfSU5URVJOQUwgLy8gbGliZXZlbnQgPCAyCisjZGVmaW5lIEhUVFBfSU5URVJOQUwgNTAwCisjZW5kaWYKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK3N0cnVjdCBURXZodHRwU2VydmVyOjpSZXF1ZXN0Q29udGV4dCB7CisgIHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaWJ1ZjsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG9idWY7CisKKyAgUmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOworfTsKKworVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8oTlVMTCksIGVoXyhOVUxMKSB7Cit9CisKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKKyAgLy8gQ3JlYXRlIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cC4KKyAgZWJfID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgaWYgKGViXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZlbnRfYmFzZV9uZXcgZmFpbGVkIik7CisgIH0KKyAgZWhfID0gZXZodHRwX25ldyhlYl8pOworICBpZiAoZWhfID09IE5VTEwpIHsKKyAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfbmV3IGZhaWxlZCIpOworICB9CisKKyAgLy8gQmluZCB0byBwb3J0LgorICBpbnQgcmV0ID0gZXZodHRwX2JpbmRfc29ja2V0KGVoXywgTlVMTCwgcG9ydCk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgZXZodHRwX2ZyZWUoZWhfKTsKKyAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfYmluZF9zb2NrZXQgZmFpbGVkIik7CisgIH0KKworICAvLyBSZWdpc3RlciBhIGhhbmRsZXIuICBJZiB5b3UgdXNlIHRoZSBvdGhlciBjb25zdHJ1Y3RvciwKKyAgLy8geW91IHdpbGwgd2FudCB0byBkbyB0aGlzIHlvdXJzZWxmLgorICAvLyBEb24ndCBmb3JnZXQgdG8gdW5yZWdpc3RlciBiZWZvcmUgZGVzdG9yeWluZyB0aGlzIFRFdmh0dHBTZXJ2ZXIuCisgIGV2aHR0cF9zZXRfY2IoZWhfLCAiLyIsIHJlcXVlc3QsICh2b2lkKil0aGlzKTsKK30KKworVEV2aHR0cFNlcnZlcjo6flRFdmh0dHBTZXJ2ZXIoKSB7CisgIGlmIChlaF8gIT0gTlVMTCkgeworICAgIGV2aHR0cF9mcmVlKGVoXyk7CisgIH0KKyAgaWYgKGViXyAhPSBOVUxMKSB7CisgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CisgIH0KK30KKworaW50IFRFdmh0dHBTZXJ2ZXI6OnNlcnZlKCkgeworICBpZiAoZWJfID09IE5VTEwpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNhbGwgdG8gVEV2aHR0cFNlcnZlcjo6c2VydmUiKTsKKyAgfQorICByZXR1cm4gZXZlbnRfYmFzZV9kaXNwYXRjaChlYl8pOworfQorCitURXZodHRwU2VydmVyOjpSZXF1ZXN0Q29udGV4dDo6UmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpCisgIDogcmVxKHJlcSksCisgICAgaWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcihFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSkpLAorICAgIG9idWYobmV3IFRNZW1vcnlCdWZmZXIoKSkgeworfQorCit2b2lkIFRFdmh0dHBTZXJ2ZXI6OnJlcXVlc3Qoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIHNlbGYpIHsKKyAgdHJ5IHsKKyAgICBzdGF0aWNfY2FzdDxURXZodHRwU2VydmVyKj4oc2VsZiktPnByb2Nlc3MocmVxKTsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBldmh0dHBfc2VuZF9yZXBseShyZXEsIEhUVFBfSU5URVJOQUwsIGUud2hhdCgpLCAwKTsKKyAgfQorfQorCit2b2lkIFRFdmh0dHBTZXJ2ZXI6OnByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKKyAgUmVxdWVzdENvbnRleHQqIGN0eCA9IG5ldyBSZXF1ZXN0Q29udGV4dChyZXEpOworICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vYnVmKTsKK30KKwordm9pZCBURXZodHRwU2VydmVyOjpjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpIHsKKyAgKHZvaWQpc3VjY2VzczsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlcXVlc3RDb250ZXh0PiBwdHIoY3R4KTsKKworICBpbnQgY29kZSA9IHN1Y2Nlc3MgPyAyMDAgOiA0MDA7CisgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IHN1Y2Nlc3MgPyAiT0siIDogIkJhZCBSZXF1ZXN0IjsKKworICBpbnQgcnYgPSBldmh0dHBfYWRkX2hlYWRlcihjdHgtPnJlcS0+b3V0cHV0X2hlYWRlcnMsICJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICAvLyBUT0RPOiBMb2cgYW4gZXJyb3IuCisgICAgc3RkOjpjZXJyIDw8ICJldmh0dHBfYWRkX2hlYWRlciBmYWlsZWQgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgc3RkOjplbmRsOworICB9CisKKyAgc3RydWN0IGV2YnVmZmVyKiBidWYgPSBldmJ1ZmZlcl9uZXcoKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgorICAgIHN0ZDo6Y2VyciA8PCAiZXZidWZmZXJfbmV3IGZhaWxlZCAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogb2J1ZjsKKyAgICB1aW50MzJfdCBzejsKKyAgICBjdHgtPm9idWYtPmdldEJ1ZmZlcigmb2J1ZiwgJnN6KTsKKyAgICBpbnQgcmV0ID0gZXZidWZmZXJfYWRkKGJ1Ziwgb2J1Ziwgc3opOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgorICAgICAgc3RkOjpjZXJyIDw8ICJldmh0dHBfYWRkIGZhaWxlZCB3aXRoICIgPDwgcmV0IDw8ICIgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18KKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisKKyAgZXZodHRwX3NlbmRfcmVwbHkoY3R4LT5yZXEsIGNvZGUsIHJlYXNvbiwgYnVmKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgZXZidWZmZXJfZnJlZShidWYpOworICB9Cit9CisKK3N0cnVjdCBldmVudF9iYXNlKiBURXZodHRwU2VydmVyOjpnZXRFdmVudEJhc2UoKSB7CisgIHJldHVybiBlYl87Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViZjNiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3N0cnVjdCBldmVudF9iYXNlOworc3RydWN0IGV2aHR0cDsKK3N0cnVjdCBldmh0dHBfcmVxdWVzdDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY0J1ZmZlclByb2Nlc3NvcjsKKworY2xhc3MgVEV2aHR0cFNlcnZlciB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIGZvciB1c2Ugd2l0aCBhbiBleHRlcm5hbCBldmh0dHAgaW5zdGFuY2UuCisgICAqIE11c3QgYmUgbWFudWFsbHkgaW5zdGFsbGVkIHdpdGggZXZodHRwX3NldF9jYiwgdXNpbmcKKyAgICogVEV2aHR0cFNlcnZlcjo6cmVxdWVzdCBhcyB0aGUgY2FsbGJhY2sgYW5kIHRoZQorICAgKiBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgYXMgdGhlIGV4dHJhIGFyZy4KKyAgICogRG8gbm90IGNhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlci4KKyAgICovCisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKTsKKworICAvKioKKyAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciB3aXRoIGFuIGVtYmVkZGVkIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cCwKKyAgICogbGlzdGVuaW5nIG9uIHBvcnQgYW5kIHJlc3BvbmRpbmcgb24gdGhlIGVuZHBvaW50ICIvIi4KKyAgICogQ2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyIHRvIHNlcnZlIGZvcmV2ZXIuCisgICAqLworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpOworCisgIH5URXZodHRwU2VydmVyKCk7CisKKyAgc3RhdGljIHZvaWQgcmVxdWVzdChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogc2VsZik7CisgIGludCBzZXJ2ZSgpOworCisgIHN0cnVjdCBldmVudF9iYXNlKiBnZXRFdmVudEJhc2UoKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IFJlcXVlc3RDb250ZXh0OworCisgIHZvaWQgcHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CisgIHZvaWQgY29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWJfOworICBzdHJ1Y3QgZXZodHRwKiBlaF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzhmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfIDEKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCitjbGFzcyBOb1N1Y2hUYXNrRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OworCitjbGFzcyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKKworY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OworCitjbGFzcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7fQorICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVGltZWRPdXRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICBUaW1lZE91dEV4Y2VwdGlvbigpIDogVEV4Y2VwdGlvbigiVGltZWRPdXRFeGNlcHRpb24iKXt9OworICBUaW1lZE91dEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Cit9OworCitjbGFzcyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpIDogVEV4Y2VwdGlvbigiVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiIpe307CisgIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9CisKKyAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSCAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBDb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIFJ1bm5hYmxlIHRoYXQgd2lsbCBleGVjdXRlIGFyYml0cmFyeSBjYWxsYmFja3MuCisgKiBJbnRlcmZhY2VzIGFyZSBwcm92aWRlZCB0byBhY2NlcHQgYm90aCBhIGdlbmVyaWMgJ3ZvaWQodm9pZCknIGNhbGxiYWNrLCBhbmQKKyAqIGEgJ3ZvaWQqICh2b2lkKiknIHB0aHJlYWRfY3JlYXRlLXN0eWxlIGNhbGxiYWNrLgorICoKKyAqIEV4YW1wbGUgdXNlOgorICogIHZvaWQqIG15X3RocmVhZF9tYWluKHZvaWQqIGFyZyk7CisgKiAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiBmYWN0b3J5ID0gLi4uOworICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIG15X3RocmVhZF9tYWluIG9uY2U6CisgKiAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IGZhY3RvcnktPm5ld1RocmVhZCgKKyAqICAgIEZ1bmN0aW9uUnVubmVyOjpjcmVhdGUobXlfdGhyZWFkX21haW4sIHNvbWVfYXJndW1lbnQpKTsKKyAqICB0aHJlYWQtPnN0YXJ0KCk7CisgKgorICogIGJvb2wgQTo6Zm9vKCk7CisgKiAgQSogYSA9IG5ldyBBKCk7CisgKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgYS5mb28oKSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzOgorICogIGZhY3RvcnktPm5ld1RocmVhZChGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKAorICogICAgc3RkOjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKS0+c3RhcnQoKTsKKyAqCisgKi8KKworY2xhc3MgRnVuY3Rpb25SdW5uZXIgOiBwdWJsaWMgUnVubmFibGUgeworcHVibGljOgorICAvLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGNhbGxiYWNrICdwdGhyZWFkX2NyZWF0ZSgpJyBleHBlY3RzLgorICB0eXBlZGVmIHZvaWQqICgqUHRocmVhZEZ1bmNQdHIpKHZvaWQqIGFyZyk7CisgIC8vIFRoaXMgYSBmdWxseS1nZW5lcmljIHZvaWQodm9pZCkgY2FsbGJhY2sgZm9yIGN1c3RvbSBiaW5kaW5ncy4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CisKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gQm9vbEZ1bmM7CisKKyAgLyoqCisgICAqIFN5bnRhY3RpYyBzdWdhciB0byBtYWtlIGl0IGVhc2llciB0byBjcmVhdGUgbmV3IEZ1bmN0aW9uUnVubmVyCisgICAqIG9iamVjdHMgd3JhcHBlZCBpbiBzaGFyZWRfcHRyLgorICAgKi8KKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKGNvbnN0IFZvaWRGdW5jJiBjb2IpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoY29iKSk7CisgIH0KKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHB0aHJlYWRfZnVuY193cmFwcGVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgeworICAgIC8vIGRpc2NhcmQgcmV0dXJuIHZhbHVlCisgICAgZnVuYyhhcmcpOworICB9CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIEdpdmVuIGEgJ3B0aHJlYWRfY3JlYXRlJyBzdHlsZSBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsCisgICAqIGV4ZWN1dGUgdGhlIGdpdmVuIGNhbGxiYWNrLiAgTm90ZSB0aGF0IHRoZSAndm9pZConIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgorICAgKi8KKyAgRnVuY3Rpb25SdW5uZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKQorICAgIDogZnVuY18oc3RkOjpiaW5kKHB0aHJlYWRfZnVuY193cmFwcGVyLCBmdW5jLCBhcmcpKSwgaW50ZXJ2YWxNc18oLTEpIHt9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgZ2VuZXJpYyBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUgaXQuCisgICAqLworICBGdW5jdGlvblJ1bm5lcihjb25zdCBWb2lkRnVuYyYgY29iKSA6IGZ1bmNfKGNvYiksIGludGVydmFsTXNfKC0xKSB7fQorCisgIC8qKgorICAgKiBHaXZlbiBhIGJvb2wgZm9vKC4uLikgdHlwZSBjYWxsYmFjaywgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlCisgICAqIHRoZSBjYWxsYmFjayByZXBlYXRlZGx5IHdpdGggJ2ludGVydmFsTXMnIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjYWxscywKKyAgICogdW50aWwgaXQgcmV0dXJucyBmYWxzZS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgaW50ZXJ2YWwgYmV0d2VlbiBjYWxscyB3aWxsCisgICAqIGJlIGludGVydmFsTXMgcGx1cyBleGVjdXRpb24gdGltZSBvZiB0aGUgY2FsbGJhY2suCisgICAqLworICBGdW5jdGlvblJ1bm5lcihjb25zdCBCb29sRnVuYyYgY29iLCBpbnQgaW50ZXJ2YWxNcykgOiByZXBGdW5jXyhjb2IpLCBpbnRlcnZhbE1zXyhpbnRlcnZhbE1zKSB7fQorCisgIHZvaWQgcnVuKCkgeworICAgIGlmIChyZXBGdW5jXykgeworICAgICAgd2hpbGUgKHJlcEZ1bmNfKCkpIHsKKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoaW50ZXJ2YWxNc18gKiAxMDAwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnVuY18oKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgVm9pZEZ1bmMgZnVuY187CisgIEJvb2xGdW5jIHJlcEZ1bmNfOworICBpbnQgaW50ZXJ2YWxNc187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzBjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5CisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTW9uaXRvcjo6SW1wbCB7CisKK3B1YmxpYzoKKyAgSW1wbCgpIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLCBtdXRleF8oTlVMTCksIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKKyAgICBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsKKyAgfQorCisgIEltcGwoTXV0ZXgqIG11dGV4KSA6IG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeyBpbml0KG11dGV4KTsgfQorCisgIEltcGwoTW9uaXRvciogbW9uaXRvcikgOiBtdXRleF8oTlVMTCksIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsgfQorCisgIH5JbXBsKCkgeyBjbGVhbnVwKCk7IH0KKworICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9CisgIHZvaWQgbG9jaygpIHsgbXV0ZXgoKS5sb2NrKCk7IH0KKyAgdm9pZCB1bmxvY2soKSB7IG11dGV4KCkudW5sb2NrKCk7IH0KKworICAvKioKKyAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5CisgICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KKyAgICoKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgorICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKyAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgY29uc3QgeworICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOworICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgeworICAgICAgLy8gcHRocmVhZF9jb25kX3RpbWVkd2FpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byByZXR1cm4gZWFybHkgb24KKyAgICAgIC8vIHZhcmlvdXMgcGxhdGZvcm1zLCBzbyBjb21tZW50IG91dCB0aGlzIGFzc2VydC4KKyAgICAgIC8vIGFzc2VydChVdGlsOjpjdXJyZW50VGltZSgpID49IChub3cgKyB0aW1lb3V0KSk7CisgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oInB0aHJlYWRfY29uZF93YWl0KCkgb3IgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGZhaWxlZCIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uIHRvCisgICAqIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KKyAgICoKKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgeworICAgIGlmICh0aW1lb3V0X21zID09IDBMTCkgeworICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7CisgICAgfQorCisgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBhYnN0aW1lOworICAgIFV0aWw6OnRvVGltZXNwZWMoYWJzdGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSArIHRpbWVvdXRfbXMpOworICAgIHJldHVybiB3YWl0Rm9yVGltZSgmYWJzdGltZSk7CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPSByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisKKyAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAorICAgIHJldHVybiBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwsIGFic3RpbWUpOworICB9CisKKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CisgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0ZW1wOworICAgIHRlbXAudHZfc2VjID0gYWJzdGltZS0+dHZfc2VjOworICAgIHRlbXAudHZfbnNlYyA9IGFic3RpbWUtPnR2X3VzZWMgKiAxMDAwOworICAgIHJldHVybiB3YWl0Rm9yVGltZSgmdGVtcCk7CisgIH0KKyAgLyoqCisgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICovCisgIGludCB3YWl0Rm9yZXZlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3dhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCk7CisgIH0KKworICB2b2lkIG5vdGlmeSgpIHsKKyAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAorICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX3NpZ25hbCgmcHRocmVhZF9jb25kXyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKKyAgICBhc3NlcnQoaXJldCA9PSAwKTsKKyAgfQorCisgIHZvaWQgbm90aWZ5QWxsKCkgeworICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4CisgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwdGhyZWFkX2NvbmRfKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOworICAgIGFzc2VydChpcmV0ID09IDApOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKKyAgICBtdXRleF8gPSBtdXRleDsKKworICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmcHRocmVhZF9jb25kXywgTlVMTCkgPT0gMCkgeworICAgICAgY29uZEluaXRpYWxpemVkXyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFjb25kSW5pdGlhbGl6ZWRfKSB7CisgICAgICBjbGVhbnVwKCk7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgY2xlYW51cCgpIHsKKyAgICBpZiAoY29uZEluaXRpYWxpemVkXykgeworICAgICAgY29uZEluaXRpYWxpemVkXyA9IGZhbHNlOworICAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcHRocmVhZF9jb25kXyk7CisgICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOworICAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CisgICAgfQorICB9CisKKyAgdW5pcXVlX3B0cjxNdXRleD4gb3duZWRNdXRleF87CisgIE11dGV4KiBtdXRleF87CisKKyAgbXV0YWJsZSBwdGhyZWFkX2NvbmRfdCBwdGhyZWFkX2NvbmRfOworICBtdXRhYmxlIGJvb2wgY29uZEluaXRpYWxpemVkXzsKK307CisKK01vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7Cit9CisKK01vbml0b3I6On5Nb25pdG9yKCkgeworICBkZWxldGUgaW1wbF87Cit9CisKK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5tdXRleCgpOworfQorCit2b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7CisgIGltcGxfLT5sb2NrKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgeworICBpbXBsXy0+dW5sb2NrKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgaW1wbF8tPndhaXQodGltZW91dCk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPndhaXRGb3JldmVyKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeworICBpbXBsXy0+bm90aWZ5KCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeworICBpbXBsXy0+bm90aWZ5QWxsKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5OWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfIDEKKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBBIG1vbml0b3IgaXMgYSBjb21iaW5hdGlvbiBtdXRleCBhbmQgY29uZGl0aW9uLWV2ZW50LiAgV2FpdGluZyBhbmQKKyAqIG5vdGlmeWluZyBjb25kaXRpb24gZXZlbnRzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBvd24gdGhlIG11dGV4LiAgTXV0ZXgKKyAqIGxvY2sgYW5kIHVubG9jayBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgaW5kZXBlbmRlbnRseSBvZiBjb25kaXRpb24KKyAqIGV2ZW50cy4gIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuT2JqZWN0IG11bHRpLXRocmVhZAorICogb3BlcmF0aW9ucy4KKyAqCisgKiBOb3RlIHRoZSBNb25pdG9yIGNhbiBjcmVhdGUgYSBuZXcsIGludGVybmFsIG11dGV4OyBhbHRlcm5hdGl2ZWx5LCBhCisgKiBzZXBhcmF0ZSBNdXRleCBjYW4gYmUgcGFzc2VkIGluIGFuZCB0aGUgTW9uaXRvciB3aWxsIHJlLXVzZSBpdCB3aXRob3V0CisgKiB0YWtpbmcgb3duZXJzaGlwLiAgSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICogTXV0ZXggaXMgbm90IGRlYWxsb2NhdGVkIGJlZm9yZSB0aGUgTW9uaXRvci4KKyAqCisgKiBOb3RlIHRoYXQgYWxsIG1ldGhvZHMgYXJlIGNvbnN0LiAgTW9uaXRvcnMgaW1wbGVtZW50IGxvZ2ljYWwgY29uc3RuZXNzLCBub3QKKyAqIGJpdCBjb25zdG5lc3MuICBUaGlzIGFsbG93cyBjb25zdCBtZXRob2RzIHRvIGNhbGwgbW9uaXRvciBtZXRob2RzIHdpdGhvdXQKKyAqIG5lZWRpbmcgdG8gY2FzdCBhd2F5IGNvbnN0bmVzcyBvciBjaGFuZ2UgdG8gbm9uLWNvbnN0IHNpZ25hdHVyZXMuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTW9uaXRvciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIC8qKiBDcmVhdGVzIGEgbmV3IG11dGV4LCBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIGl0LiAqLworICBNb25pdG9yKCk7CisKKyAgLyoqIFVzZXMgdGhlIHByb3ZpZGVkIG11dGV4IHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KKyAgZXhwbGljaXQgTW9uaXRvcihNdXRleCogbXV0ZXgpOworCisgIC8qKiBVc2VzIHRoZSBtdXRleCBpbnNpZGUgdGhlIHByb3ZpZGVkIE1vbml0b3Igd2l0aG91dCB0YWtpbmcgb3duZXJzaGlwLiAqLworICBleHBsaWNpdCBNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpOworCisgIC8qKiBEZWFsbG9jYXRlcyB0aGUgbXV0ZXggb25seSBpZiB3ZSBvd24gaXQuICovCisgIHZpcnR1YWwgfk1vbml0b3IoKTsKKworICBNdXRleCYgbXV0ZXgoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgbG9jaygpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBjb25zdDsKKworICAvKioKKyAgICogV2FpdHMgYSBtYXhpbXVtIG9mIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24KKyAgICogdG8gb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdDsKKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdDsKKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCB0aW1ldmFsLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdDsKKworICAvKioKKyAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgKi8KKyAgaW50IHdhaXRGb3JldmVyKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQorICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCisgICAqCisgICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGNsZWFubHk7IG9uIHRpbWVvdXQgb3IKKyAgICogZXJyb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisgIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMgPSAwTEwpIGNvbnN0OworCisgIC8qKiBXYWtlcyB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBtb25pdG9yLiAqLworICB2aXJ0dWFsIHZvaWQgbm90aWZ5KCkgY29uc3Q7CisKKyAgLyoqIFdha2VzIHVwIGFsbCB3YWl0aW5nIHRocmVhZHMgb24gdGhpcyBtb25pdG9yLiAqLworICB2aXJ0dWFsIHZvaWQgbm90aWZ5QWxsKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNsYXNzIEltcGw7CisKKyAgSW1wbCogaW1wbF87Cit9OworCitjbGFzcyBTeW5jaHJvbml6ZWQgeworcHVibGljOgorICBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciogbW9uaXRvcikgOiBnKG1vbml0b3ItPm11dGV4KCkpIHt9CisgIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yJiBtb25pdG9yKSA6IGcobW9uaXRvci5tdXRleCgpKSB7fQorCitwcml2YXRlOgorICBHdWFyZCBnOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbmVlZGVkIHRvIHRlc3QgZm9yIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gY2FwYWJpbGl0aWVzOgorI2RlZmluZSBfX1VTRV9HTlUKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLy8gRW5hYmxlIHRoaXMgdG8gdHVybiBvbiBtdXRleCBjb250ZW50aW9uIHByb2ZpbGluZyBzdXBwb3J0CisvLyAjZGVmaW5lIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworCitzdGF0aWMgaW50MzJfdCBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSAwOworc3RhdGljIGludDMyX3QgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gMDsKK3N0YXRpYyBNdXRleFdhaXRDYWxsYmFjayBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gMDsKKwordm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKSB7CisgIG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IHByb2ZpbGluZ1NhbXBsZVJhdGU7CisgIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKK30KKworI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKSBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7CisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX2xvY2tfc3RhcnRUaW1lID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgZW5kVGltZSAtIF9sb2NrX3N0YXJ0VGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByb2ZpbGVUaW1lXyA9IF9sb2NrX3N0YXJ0VGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwcm9maWxlVGltZV8gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJvZmlsZVRpbWVfID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCkgLSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludDY0X3QgX3RlbXBfcHJvZmlsZVRpbWUgPSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByb2ZpbGVUaW1lXyA9IDA7CisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX3RlbXBfcHJvZmlsZVRpbWUgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgX3RlbXBfcHJvZmlsZVRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQ2NF90IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCkgeworICBpZiAobXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlICYmIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2spIHsKKyAgICAvLyBUaGlzIGJsb2NrIGlzIHVuc3luY2hyb25pemVkLCBidXQgc2hvdWxkIHByb2R1Y2UgYSByZWFzb25hYmxlIHNhbXBsaW5nCisgICAgLy8gcmF0ZSBvbiBtb3N0IGFyY2hpdGVjdHVyZXMuICBUaGUgbWFpbiByYWNlIGNvbmRpdGlvbnMgYXJlIHRoZSBnYXAKKyAgICAvLyBiZXR3ZWVuIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSB0ZXN0LCB0aGUgbm9uLWF0b21pY2l0eSBvZiBkZWNyZW1lbnQsIGFuZAorICAgIC8vIHBvdGVudGlhbCBjYWNoaW5nIG9mIGRpZmZlcmVudCB2YWx1ZXMgYXQgZGlmZmVyZW50IENQVXMuCisgICAgLy8KKyAgICAvLyAtIGlmIHR3byBkZWNyZW1lbnRzIHJhY2UsIHRoZSBsaWtlbGllc3QgcmVzdWx0IGlzIHRoYXQgdGhlIGNvdW50ZXIKKyAgICAvLyAgICAgIGRlY3JlbWVudHMgc2xvd2x5IChwZXJoYXBzIG11Y2ggbW9yZSBzbG93bHkpIHRoYW4gaW50ZW5kZWQuCisgICAgLy8KKyAgICAvLyAtIG1hbnkgdGhyZWFkcyBjb3VsZCBwb3RlbnRpYWxseSBkZWNyZW1lbnQgYmVmb3JlIHJlc2V0dGluZyB0aGUgY291bnRlcgorICAgIC8vICAgICAgdG8gaXRzIGxhcmdlIHZhbHVlLCBjYXVzaW5nIGVhY2ggYWRkaXRpb25hbCBpbmNvbWluZyB0aHJlYWQgdG8KKyAgICAvLyAgICAgIHByb2ZpbGUgZXZlcnkgY2FsbC4gIFRoaXMgc2l0dWF0aW9uIGlzIHVubGlrZWx5IHRvIHBlcnNpc3QgZm9yIGxvbmcKKyAgICAvLyAgICAgIGFzIHRoZSBjcml0aWNhbCBnYXAgaXMgcXVpdGUgc2hvcnQsIGJ1dCBwcm9maWxpbmcgY291bGQgYmUgYnVyc3R5LgorICAgIHNpZ19hdG9taWNfdCBsb2NhbFZhbHVlID0gLS1tdXRleFByb2ZpbGluZ0NvdW50ZXI7CisgICAgaWYgKGxvY2FsVmFsdWUgPD0gMCkgeworICAgICAgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlOworICAgICAgcmV0dXJuIFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCisjZW5kaWYgLy8gVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworI2RlZmluZSBFSU5UUl9MT09QKF9DQUxMKSAgICAgICAgICBpbnQgcmV0OyBkbyB7IHJldCA9IF9DQUxMOyB9IHdoaWxlIChyZXQgPT0gRUlOVFIpCisjZGVmaW5lIEFCT1JUX09ORkFJTChfQ0FMTCkgICAgICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IGFib3J0KCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkUoX0NBTExTVFIsIFJFVCkgeyB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihib29zdDo6c3RyKGJvb3N0Ojpmb3JtYXQoIiUxJSByZXR1cm5lZCAlMiUgKCUzJSkiKSAlIF9DQUxMU1RSICUgUkVUICUgOjpzdHJlcnJvcihSRVQpKSk7IH0KKyNkZWZpbmUgVEhST1dfU1JFX09ORkFJTChfQ0FMTCkgIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQpIHsgVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfSB9CisjZGVmaW5lIFRIUk9XX1NSRV9UUllGQUlMKF9DQUxMKSB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0ID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSBpZiAocmV0ID09IEVCVVNZKSB7IHJldHVybiBmYWxzZTsgfSBUSFJPV19TUkUoI19DQUxMLCByZXQpOyB9CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKKyAqCisgKiBUaHJvd3MgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiBvbiBlcnJvci4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNdXRleDo6aW1wbCB7CitwdWJsaWM6CisgIGltcGwoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworICAgIHByb2ZpbGVUaW1lXyA9IDA7CisjZW5kaWYKKyAgICBpbml0KCZwdGhyZWFkX211dGV4Xyk7CisgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgfQorCisgIH5pbXBsKCkgeworICAgIGlmIChpbml0aWFsaXplZF8pIHsKKyAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvY2soKSBjb25zdCB7CisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2xvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CisgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKKyAgfQorCisgIGJvb2wgdHJ5bG9jaygpIGNvbnN0IHsKKyAgICBUSFJPV19TUkVfVFJZRkFJTChwdGhyZWFkX211dGV4X3RyeWxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CisgIH0KKworICBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3QgeworI2lmIGRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSAmJiBfUE9TSVhfVElNRU9VVFMgPj0gMjAwMTEyTAorICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworCisgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0czsKKyAgICBVdGlsOjp0b1RpbWVzcGVjKHRzLCBtaWxsaXNlY29uZHMgKyBVdGlsOjpjdXJyZW50VGltZSgpKTsKKyAgICBFSU5UUl9MT09QKHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKSk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gRVRJTUVET1VUKSB7CisgICAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBUSFJPV19TUkUoInB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKSIsIHJldCk7CisjZWxzZQorICAgIC8qIE90aGVyd2lzZSBmb2xsb3cgc29sdXRpb24gdXNlZCBieSBNb25vIGZvciBBbmRyb2lkICovCisgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBzbGVlcHl0aW1lLCBub3csIHRvOworCisgICAgLyogVGhpcyBpcyBqdXN0IHRvIGF2b2lkIGEgY29tcGxldGVseSBidXN5IHdhaXQgKi8KKyAgICBzbGVlcHl0aW1lLnR2X3NlYyA9IDA7CisgICAgc2xlZXB5dGltZS50dl9uc2VjID0gMTAwMDAwMDBMOyAvKiAxMG1zICovCisKKyAgICBVdGlsOjp0b1RpbWVzcGVjKHRvLCBtaWxsaXNlY29uZHMgKyBVdGlsOjpjdXJyZW50VGltZSgpKTsKKworICAgIHdoaWxlICgodHJ5bG9jaygpKSA9PSBmYWxzZSkgeworICAgICAgVXRpbDo6dG9UaW1lc3BlYyhub3csIFV0aWw6OmN1cnJlbnRUaW1lKCkpOworICAgICAgaWYgKG5vdy50dl9zZWMgPj0gdG8udHZfc2VjICYmIG5vdy50dl9uc2VjID49IHRvLnR2X25zZWMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgbmFub3NsZWVwKCZzbGVlcHl0aW1lLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICB9CisKKyAgdm9pZCB1bmxvY2soKSBjb25zdCB7CisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdGhyZWFkX211dGV4XykpOworICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKKyAgfQorCisgIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZwdGhyZWFkX211dGV4XzsgfQorCitwcml2YXRlOgorICBtdXRhYmxlIHB0aHJlYWRfbXV0ZXhfdCBwdGhyZWFkX211dGV4XzsKKyAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOworI2VuZGlmCit9OworCitNdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHsKK30KKwordm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPmdldFVuZGVybHlpbmdJbXBsKCk7Cit9CisKK3ZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7CisgIGltcGxfLT5sb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dHJ5bG9jaygpOworfQorCitib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRpbWVkbG9jayhtcyk7Cit9CisKK3ZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPnVubG9jaygpOworfQorCit2b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICBwdGhyZWFkX211dGV4X3QqIHB0aHJlYWRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90Kilhcmc7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXgsIE5VTEwpKTsKK30KKworI2lmIGRlZmluZWQoUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCitzdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgeworICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleGF0dHIpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleGF0dHIsIGtpbmQpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2luaXQobXV0ZXgsICZtdXRleGF0dHIpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6QURBUFRJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIC8vIEZyb20gbXlzcWwgc291cmNlOiBteXN5cy9teV90aHJfaW5pdC5jCisgIC8vIFNldCBtdXRleCB0eXBlIHRvICJmYXN0IiBhLmsuYSAiYWRhcHRpdmUiCisgIC8vCisgIC8vIEluIHRoaXMgY2FzZSB0aGUgdGhyZWFkIG1heSBzdGVhbCB0aGUgbXV0ZXggZnJvbSBzb21lIG90aGVyIHRocmVhZAorICAvLyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSBzYW1lIG11dGV4LiBUaGlzIHdpbGwgc2F2ZSB1cyBzb21lCisgIC8vIGNvbnRleHQgc3dpdGNoZXMgYnV0IG1heSBjYXVzZSBhIHRocmVhZCB0byAnc3RhcnZlIGZvcmV2ZXInIHdoaWxlCisgIC8vIHdhaXRpbmcgZm9yIHRoZSBtdXRleCAobm90IGxpa2VseSBpZiB0aGUgY29kZSB3aXRoaW4gdGhlIG11dGV4IGlzCisgIC8vIHNob3J0KS4KKyAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX0FEQVBUSVZFX05QKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QCit2b2lkIE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSyk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCit2b2lkIE11dGV4OjpSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOworfQorI2VuZGlmCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgUmVhZFdyaXRlTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggcncgbG9jaworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFJlYWRXcml0ZU11dGV4OjppbXBsIHsKK3B1YmxpYzoKKyAgaW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgICBwcm9maWxlVGltZV8gPSAwOworI2VuZGlmCisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja19pbml0KCZyd19sb2NrXywgTlVMTCkpOworICAgIGluaXRpYWxpemVkXyA9IHRydWU7CisgIH0KKworICB+aW1wbCgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CisgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICAgIEFCT1JUX09ORkFJTChwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZyd19sb2NrXykpOworICAgIH0KKyAgfQorCisgIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdCB7CisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja19yZGxvY2soJnJ3X2xvY2tfKSk7CisgICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7IC8vIG5vdCBleGNsdXNpdmUsIHNvIHVzZSBub3QtbG9ja2VkIHBhdGgKKyAgfQorCisgIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CisgIH0KKworICBib29sIGF0dGVtcHRSZWFkKCkgY29uc3QgeyBUSFJPV19TUkVfVFJZRkFJTChwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKSk7IH0KKworICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXykpOyB9CisKKyAgdm9pZCByZWxlYXNlKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKSk7CisgICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOworICB9CisKK3ByaXZhdGU6CisgIG11dGFibGUgcHRocmVhZF9yd2xvY2tfdCByd19sb2NrXzsKKyAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOworI2VuZGlmCit9OworCitSZWFkV3JpdGVNdXRleDo6UmVhZFdyaXRlTXV0ZXgoKSA6IGltcGxfKG5ldyBSZWFkV3JpdGVNdXRleDo6aW1wbCgpKSB7Cit9CisKK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCkgY29uc3QgeworICBpbXBsXy0+YWNxdWlyZVJlYWQoKTsKK30KKwordm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QgeworICBpbXBsXy0+YWNxdWlyZVdyaXRlKCk7Cit9CisKK2Jvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRSZWFkKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPmF0dGVtcHRSZWFkKCk7Cit9CisKK2Jvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRXcml0ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5hdHRlbXB0V3JpdGUoKTsKK30KKwordm9pZCBSZWFkV3JpdGVNdXRleDo6cmVsZWFzZSgpIGNvbnN0IHsKKyAgaW1wbF8tPnJlbGVhc2UoKTsKK30KKworTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6Tm9TdGFydmVSZWFkV3JpdGVNdXRleCgpIDogd3JpdGVyV2FpdGluZ18oZmFsc2UpIHsKK30KKwordm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKKyAgaWYgKHdyaXRlcldhaXRpbmdfKSB7CisgICAgLy8gd3JpdGVyIGlzIHdhaXRpbmcsIGJsb2NrIG9uIHRoZSB3cml0ZXIncyBtdXRleCB1bnRpbCBoZSdzIGRvbmUgd2l0aCBpdAorICAgIG11dGV4Xy5sb2NrKCk7CisgICAgbXV0ZXhfLnVubG9jaygpOworICB9CisKKyAgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCk7Cit9CisKK3ZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QgeworICAvLyBpZiB3ZSBjYW4gYWNxdWlyZSB0aGUgcndsb2NrIHRoZSBlYXN5IHdheSwgd2UncmUgZG9uZQorICBpZiAoYXR0ZW1wdFdyaXRlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBmYWlsZWQgdG8gZ2V0IHRoZSByd2xvY2ssIGRvIGl0IHRoZSBoYXJkIHdheToKKyAgLy8gbG9ja2luZyB0aGUgbXV0ZXggYW5kIHNldHRpbmcgd3JpdGVyV2FpdGluZyB3aWxsIGNhdXNlIGFsbCBuZXcgcmVhZGVycyB0bworICAvLyBibG9jayBvbiB0aGUgbXV0ZXggcmF0aGVyIHRoYW4gb24gdGhlIHJ3bG9jay4KKyAgbXV0ZXhfLmxvY2soKTsKKyAgd3JpdGVyV2FpdGluZ18gPSB0cnVlOworICBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCk7CisgIHdyaXRlcldhaXRpbmdfID0gZmFsc2U7CisgIG11dGV4Xy51bmxvY2soKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjUzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKKworLyoqCisgKiBEZXRlcm1pbmVzIGlmIHRoZSBUaHJpZnQgTXV0ZXggYW5kIFJlYWRXcml0ZU11dGV4IGNsYXNzZXMgd2lsbCBhdHRlbXB0IHRvCisgKiBwcm9maWxlIHRoZWlyIGJsb2NraW5nIGFjcXVpcmUgbWV0aG9kcy4gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gbm9uLXplcm8sCisgKiBUaHJpZnQgd2lsbCBhdHRlbXB0IHRvIGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSBldmVyeSBwcm9maWxpbmdTYW1wbGVSYXRlCisgKiB0aW1lcy4gIEhvd2V2ZXIsIGFzIHRoZSBzYW1wbGluZyBpcyBub3Qgc3luY2hyb25pemVkIHRoZSByYXRlIGlzIG5vdAorICogZ3VyYW5hdGVlZCwgYW5kIGNvdWxkIGJlIHN1YmplY3QgdG8gYmlnIGJ1cnN0cyBhbmQgc3dpbmdzLiAgUGxlYXNlIGVuc3VyZQorICogeW91ciBzYW1wbGluZyBjYWxsYmFjayBpcyBhcyBwZXJmb3JtYW50IGFzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMuCisgKgorICogVGhlIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCB3aXRoIHRoZSB3YWl0IHRpbWUgdGFrZW4gdG8gbG9jayB0aGUgbXV0ZXggaW4KKyAqIHVzZWMgYW5kIGEgKHZvaWQqKSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIE11dGV4IChvciBSZWFkV3JpdGVNdXRleCkKKyAqIGJlaW5nIGxvY2tlZC4KKyAqCisgKiBUaGUgZW5hYmxlTXV0ZXhQcm9maWxpbmcoKSBmdW5jdGlvbiBpcyB1bnN5bmNocm9uaXplZDsgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiB3aGlsZSBwcm9maWxpbmcgaXMgYWxyZWFkeSBlbmFibGVkIG1heSByZXN1bHQgaW4gcmFjZSBjb25kaXRpb25zLiAgT24KKyAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgYSBwb2ludGVyIGFzc2lnbm1lbnQgaXMgYXRvbWljLCB0aGlzIGlzIHNhZmUgYnV0IHRoZXJlCisgKiBpcyBubyBndWFyYW50ZWUgdGhyZWFkcyB3aWxsIGFncmVlIG9uIGEgc2luZ2xlIGNhbGxiYWNrIHdpdGhpbiBhbnkKKyAqIHBhcnRpY3VsYXIgdGltZSBwZXJpb2QuCisgKi8KK3R5cGVkZWYgdm9pZCAoKk11dGV4V2FpdENhbGxiYWNrKShjb25zdCB2b2lkKiBpZCwgaW50NjRfdCB3YWl0VGltZU1pY3Jvcyk7Cit2b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOworCisjZW5kaWYKKworLyoqCisgKiBOT1RFOiBBbGwgbXV0ZXggaW1wbGVtZW50YXRpb25zIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAgU2VlIGVhY2gKKyAqICAgICAgIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlKHMpIHVzZWQuCisgKi8KKworLyoqCisgKiBBIHNpbXBsZSBtdXRleCBjbGFzcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE11dGV4IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqSW5pdGlhbGl6ZXIpKHZvaWQqKTsKKworICBNdXRleChJbml0aWFsaXplciBpbml0ID0gREVGQVVMVF9JTklUSUFMSVpFUik7CisgIHZpcnR1YWwgfk11dGV4KCkge30KKworICB2aXJ0dWFsIHZvaWQgbG9jaygpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgdHJ5bG9jaygpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHVubG9jaygpIGNvbnN0OworCisgIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3Q7CisKKyAgLy8gSWYgeW91IGF0dGVtcHQgdG8gdXNlIG9uZSBvZiB0aGVzZSBhbmQgaXQgZmFpbHMgdG8gbGluaywgaXQgbWVhbnMKKyAgLy8geW91ciB2ZXJzaW9uIG9mIHB0aHJlYWRzIGRvZXMgbm90IHN1cHBvcnQgaXQgLSB0cnkgYW5vdGhlciBvbmUuCisgIHN0YXRpYyB2b2lkIEFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgREVGQVVMVF9JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIEVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCopOworCitwcml2YXRlOgorICBjbGFzcyBpbXBsOworICBzdGQ6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87Cit9OworCitjbGFzcyBSZWFkV3JpdGVNdXRleCB7CitwdWJsaWM6CisgIFJlYWRXcml0ZU11dGV4KCk7CisgIHZpcnR1YWwgflJlYWRXcml0ZU11dGV4KCkge30KKworICAvLyB0aGVzZSBnZXQgdGhlIGxvY2sgYW5kIGJsb2NrIHVudGlsIGl0IGlzIGRvbmUgc3VjY2Vzc2Z1bGx5CisgIHZpcnR1YWwgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3Q7CisKKyAgLy8gdGhlc2UgYXR0ZW1wdCB0byBnZXQgdGhlIGxvY2ssIHJldHVybmluZyBmYWxzZSBpbW1lZGlhdGVseSBpZiB0aGV5IGZhaWwKKyAgdmlydHVhbCBib29sIGF0dGVtcHRSZWFkKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdDsKKworICAvLyB0aGlzIHJlbGVhc2VzIGJvdGggcmVhZCBhbmQgd3JpdGUgbG9ja3MKKyAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY2xhc3MgaW1wbDsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOworfTsKKworLyoqCisgKiBBIFJlYWRXcml0ZU11dGV4IHRoYXQgZ3VhcmFudGVlcyB3cml0ZXJzIHdpbGwgbm90IGJlIHN0YXJ2ZWQgYnkgcmVhZGVyczoKKyAqIFdoZW4gYSB3cml0ZXIgYXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbXV0ZXgsIGFsbCBuZXcgcmVhZGVycyB3aWxsIGJlCisgKiBibG9ja2VkIGZyb20gYWNxdWlyaW5nIHRoZSBtdXRleCB1bnRpbCB0aGUgd3JpdGVyIGhhcyBhY3F1aXJlZCBhbmQKKyAqIHJlbGVhc2VkIGl0LiBJbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIG1heSBhbHJlYWR5IGJlIGd1YXJhbnRlZWQKKyAqIGJ5IGEgcmVndWxhciBSZWFkV3JpdGVNdXRleC4KKyAqLworY2xhc3MgTm9TdGFydmVSZWFkV3JpdGVNdXRleCA6IHB1YmxpYyBSZWFkV3JpdGVNdXRleCB7CitwdWJsaWM6CisgIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKTsKKworICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0OworCitwcml2YXRlOgorICBNdXRleCBtdXRleF87CisgIG11dGFibGUgdm9sYXRpbGUgYm9vbCB3cml0ZXJXYWl0aW5nXzsKK307CisKK2NsYXNzIEd1YXJkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgR3VhcmQoY29uc3QgTXV0ZXgmIHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQgPSAwKSA6IG11dGV4XygmdmFsdWUpIHsKKyAgICBpZiAodGltZW91dCA9PSAwKSB7CisgICAgICB2YWx1ZS5sb2NrKCk7CisgICAgfSBlbHNlIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgaWYgKCF2YWx1ZS50cnlsb2NrKCkpIHsKKyAgICAgICAgbXV0ZXhfID0gTlVMTDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCF2YWx1ZS50aW1lZGxvY2sodGltZW91dCkpIHsKKyAgICAgICAgbXV0ZXhfID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgfkd1YXJkKCkgeworICAgIGlmIChtdXRleF8pIHsKKyAgICAgIG11dGV4Xy0+dW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtdXRleF8gIT0gTlVMTCk7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgTXV0ZXgqIG11dGV4XzsKK307CisKKy8vIENhbiBiZSB1c2VkIGFzIHNlY29uZCBhcmd1bWVudCB0byBSV0d1YXJkIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlCisvLyBhcyB0byB3aGV0aGVyIHdlJ3JlIGRvaW5nIGFjcXVpcmVSZWFkKCkgb3IgYWNxdWlyZVdyaXRlKCkuCitlbnVtIFJXR3VhcmRUeXBlIHsgUldfUkVBRCA9IDAsIFJXX1dSSVRFID0gMSB9OworCitjbGFzcyBSV0d1YXJkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkgOiByd19tdXRleF8odmFsdWUpIHsKKyAgICBpZiAod3JpdGUpIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7CisgICAgfQorICB9CisKKyAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpIDogcndfbXV0ZXhfKHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7CisgICAgfQorICB9CisgIH5SV0d1YXJkKCkgeyByd19tdXRleF8ucmVsZWFzZSgpOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFJlYWRXcml0ZU11dGV4JiByd19tdXRleF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjQ0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfIDEKKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaWYgVVNFX1NURF9USFJFQUQKKyMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CisjZWxzZQorIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorI2VuZGlmCisvLyBjbGFuZy1mb3JtYXQgb24KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpZiBVU0VfU1REX1RIUkVBRAorICB0eXBlZGVmIFN0ZFRocmVhZEZhY3RvcnkgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OworI2Vsc2UKKyAgdHlwZWRlZiBQb3NpeFRocmVhZEZhY3RvcnkgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OworI2VuZGlmCisvLyBjbGFuZy1mb3JtYXQgb24KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1OTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorCisjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKKyNpbmNsdWRlIDxnb29nbGUvcHJvZmlsZXIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIFRoZSBQT1NJWCB0aHJlYWQgY2xhc3MuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgUHRocmVhZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICBlbnVtIFNUQVRFIHsgdW5pbml0aWFsaXplZCwgc3RhcnRpbmcsIHN0YXJ0ZWQsIHN0b3BwaW5nLCBzdG9wcGVkIH07CisKKyAgc3RhdGljIGNvbnN0IGludCBNQiA9IDEwMjQgKiAxMDI0OworCisgIHN0YXRpYyB2b2lkKiB0aHJlYWRNYWluKHZvaWQqIGFyZyk7CisKK3ByaXZhdGU6CisgIHB0aHJlYWRfdCBwdGhyZWFkXzsKKyAgTW9uaXRvciBtb25pdG9yXzsJCS8vIGd1YXJkIHRvIHByb3RlY3Qgc3RhdGVfIGFuZCBhbHNvIG5vdGlmaWNhdGlvbgorICBTVEFURSBzdGF0ZV87ICAgICAgICAgLy8gdG8gcHJvdGVjdCBwcm9wZXIgdGhyZWFkIHN0YXJ0IGJlaGF2aW9yCisgIGludCBwb2xpY3lfOworICBpbnQgcHJpb3JpdHlfOworICBpbnQgc3RhY2tTaXplXzsKKyAgc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKKyAgYm9vbCBkZXRhY2hlZF87CisKK3B1YmxpYzoKKyAgUHRocmVhZFRocmVhZChpbnQgcG9saWN5LAorICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAorICAgICAgICAgICAgICAgIGJvb2wgZGV0YWNoZWQsCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKKyAgICA6CisKKyNpZm5kZWYgX1dJTjMyCisgICAgICBwdGhyZWFkXygwKSwKKyNlbmRpZiAvLyBfV0lOMzIKKyAgICAgIHN0YXRlXyh1bmluaXRpYWxpemVkKSwKKyAgICAgIHBvbGljeV8ocG9saWN5KSwKKyAgICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCisgICAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCisgICAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKKworICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOworICB9CisKKyAgflB0aHJlYWRUaHJlYWQoKSB7CisgICAgLyogTm90aGluZyByZWZlcmVuY2VzIHRoaXMgdGhyZWFkLCBpZiBpcyBpcyBub3QgZGV0YWNoZWQsIGRvIGEgam9pbgorICAgICAgIG5vdywgb3RoZXJ3aXNlIHRoZSB0aHJlYWQtaWQgYW5kLCBwb3NzaWJseSwgb3RoZXIgcmVzb3VyY2VzIHdpbGwKKyAgICAgICBiZSBsZWFrZWQuICovCisgICAgaWYgKCFkZXRhY2hlZF8pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGpvaW4oKTsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCisgICAgICB9CisgICAgfQorICB9CisKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc3RhcnQoKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfaW5pdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/IFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDogUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpCisgICAgICAgICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgZmFpbGVkIik7CisgICAgfQorCisgICAgLy8gU2V0IHRocmVhZCBzdGFjayBzaXplCisgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBNQiAqIHN0YWNrU2l6ZV8pICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplIGZhaWxlZCIpOworICAgIH0KKworLy8gU2V0IHRocmVhZCBwb2xpY3kKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBXSU4zMiBQdGhyZWFkIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHNoZWR1bGluZyBwb2xpY2llcyBvdGhlciB0aGVuCisgICAgLy8gUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUiAtIHJ1bnRpbWUgZXJyb3IKKyAgICBwb2xpY3lfID0gUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUjsKKyNlbmRpZgorCisjaWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HID4gMAorICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnRocmVhZF9hdHRyLCBwb2xpY3lfKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGZhaWxlZCIpOworICAgIH0KKyNlbmRpZgorCisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkX3BhcmFtOworICAgIHNjaGVkX3BhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHlfOworCisgICAgLy8gU2V0IHRocmVhZCBwcmlvcml0eQorICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSgmdGhyZWFkX2F0dHIsICZzY2hlZF9wYXJhbSkgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtIGZhaWxlZCIpOworICAgIH0KKworICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7CisgICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7CisKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CisKKwlTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisJCisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkXywgJnRocmVhZF9hdHRyLCB0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfY3JlYXRlIGZhaWxlZCIpOworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgY2FsbGVyIG1heSBub3QgY2hvb3NlIHRvIGd1YXJhbnRlZSB0aGUgc2NvcGUgb2YgdGhlIFJ1bm5hYmxlCisgICAgLy8gYmVpbmcgdXNlZCBpbiB0aGUgdGhyZWFkLCBzbyB3ZSBtdXN0IGFjdHVhbGx5IHdhaXQgdW50aWwgdGhlIHRocmVhZAorICAgIC8vIHN0YXJ0cyBiZWZvcmUgd2UgcmV0dXJuLiAgSWYgd2UgZG8gbm90IHdhaXQsIGl0IHdvdWxkIGJlIHBvc3NpYmxlCisgICAgLy8gZm9yIHRoZSBjYWxsZXIgdG8gc3RhcnQgZGVzdHJ1Y3RpbmcgdGhlIFJ1bm5hYmxlIGFuZCB0aGUgVGhyZWFkLAorICAgIC8vIGFuZCB3ZSB3b3VsZCBlbmQgdXAgaW4gYSByYWNlLiAgVGhpcyB3YXMgaWRlbnRpZmllZCB3aXRoIHZhbGdyaW5kLgorICAgIG1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIHZvaWQgam9pbigpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiBnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHZvaWQqIGlnbm9yZTsKKyAgICAgIC8qIFhYWAorICAgICAgICAgSWYgam9pbiBmYWlscyBpdCBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIGZhY3QKKyAgICAgICAgIHRoYXQgdGhlIGxhc3QgcmVmZXJlbmNlIHdhcyB0aGUgdGhyZWFkIGl0c2VsZiBhbmQgY2Fubm90CisgICAgICAgICBqb2luLiAgVGhpcyByZXN1bHRzIGluIGxlYWtlZCB0aHJlYWRzIGFuZCB3aWxsIGV2ZW50dWFsbHkKKyAgICAgICAgIGNhdXNlIHRoZSBwcm9jZXNzIHRvIHJ1biBvdXQgb2YgdGhyZWFkIHJlc291cmNlcy4KKyAgICAgICAgIFdlJ3JlIGJleW9uZCB0aGUgcG9pbnQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgTm90IGNsZWFyIGhvdworICAgICAgICAgYmVzdCB0byBoYW5kbGUgdGhpcy4gKi8KKyAgICAgIGludCByZXMgPSBwdGhyZWFkX2pvaW4ocHRocmVhZF8sICZpZ25vcmUpOworICAgICAgZGV0YWNoZWRfID0gKHJlcyA9PSAwKTsKKyAgICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJQdGhyZWFkVGhyZWFkOjpqb2luKCk6IGZhaWwgd2l0aCBjb2RlICVkIiwgcmVzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7CisKKyNpZm5kZWYgX1dJTjMyCisgICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF87CisjZWxzZQorICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfLnA7CisjZW5kaWYgLy8gX1dJTjMyCisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisKKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CisKKyAgdm9pZCB3ZWFrUmVmKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmKSB7CisgICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7CisgICAgc2VsZl8gPSBzdGQ6OndlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+KHNlbGYpOworICB9Cit9OworCit2b2lkKiBQdGhyZWFkVGhyZWFkOjp0aHJlYWRNYWluKHZvaWQqIGFyZykgeworICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKKyAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kj4oYXJnKTsKKworI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECisgIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKKyNlbmRpZgorCisgIHRocmVhZC0+c2V0U3RhdGUoc3RhcnRlZCk7CisKKyAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKKworICBTVEFURSBfcyA9IHRocmVhZC0+Z2V0U3RhdGUoKTsKKyAgaWYgKF9zICE9IHN0b3BwaW5nICYmIF9zICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKKyAgfQorCisgIHJldHVybiAodm9pZCopMDsKK30KKworLyoqCisgKiBDb252ZXJ0cyBnZW5lcmljIHBvc2l4IHRocmVhZCBzY2hlZHVsZSBwb2xpY3kgZW51bXMgaW50byBwdGhyZWFkCisgKiBBUEkgdmFsdWVzLgorICovCitzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgc3dpdGNoIChwb2xpY3kpIHsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOgorICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk86CisgICAgcmV0dXJuIFNDSEVEX0ZJRk87CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTjoKKyAgICByZXR1cm4gU0NIRURfUlI7CisgIH0KKyAgcmV0dXJuIFNDSEVEX09USEVSOworfQorCisvKioKKyAqIENvbnZlcnRzIHJlbGF0aXZlIHRocmVhZCBwcmlvcml0aWVzIHRvIGFic29sdXRlIHZhbHVlIGJhc2VkIG9uIHBvc2l4CisgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQorICoKKyAqICBUaGUgaWRlYSBpcyBzaW1wbHkgdG8gZGl2aWRlIHVwIHRoZSBwcmlvcml0eSByYW5nZSBmb3IgdGhlIGdpdmVuIHBvbGljeQorICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKKyAqIHRoZW4gcHJvLXJhdGUgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5LCBQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIHByaW9yaXR5KSB7CisgIGludCBwdGhyZWFkX3BvbGljeSA9IHRvUHRocmVhZFBvbGljeShwb2xpY3kpOworICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKKyAgaW50IG1heF9wcmlvcml0eSA9IDA7CisjaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOCisgIG1pbl9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocHRocmVhZF9wb2xpY3kpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYCisgIG1heF9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocHRocmVhZF9wb2xpY3kpOworI2VuZGlmCisgIGludCBxdWFudGEgPSAoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUIC0gUG9zaXhUaHJlYWRGYWN0b3J5OjpMT1dFU1QpICsgMTsKKyAgZmxvYXQgc3RlcHNwZXJxdWFudGEgPSAoZmxvYXQpKG1heF9wcmlvcml0eSAtIG1pbl9wcmlvcml0eSkgLyBxdWFudGE7CisKKyAgaWYgKHByaW9yaXR5IDw9IFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCkgeworICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIHByaW9yaXR5KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgZm9yIHByaW9yaXR5IGluY3JlbWVudHMuCisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCk7CisgIH0KK30KKworUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoUE9MSUNZIHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV0YWNoZWQpCisgIDogVGhyZWFkRmFjdG9yeShkZXRhY2hlZCksCisgICAgcG9saWN5Xyhwb2xpY3kpLAorICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCisgICAgc3RhY2tTaXplXyhzdGFja1NpemUpIHsKK30KKworUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKFJPVU5EX1JPQklOKSwKKyAgICBwcmlvcml0eV8oTk9STUFMKSwKKyAgICBzdGFja1NpemVfKDEpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV0YWNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uYWJsZSkpOworICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRTdGFja1NpemUoKSBjb25zdCB7CisgIHJldHVybiBzdGFja1NpemVfOworfQorCit2b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeworICBzdGFja1NpemVfID0gdmFsdWU7Cit9CisKK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIHByaW9yaXR5XzsKK30KKwordm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFByaW9yaXR5KFBSSU9SSVRZIHZhbHVlKSB7CisgIHByaW9yaXR5XyA9IHZhbHVlOworfQorCitUaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7CisjaWZuZGVmIF9XSU4zMgorICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKTsKKyNlbHNlCisgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpLnA7CisjZW5kaWYgLy8gX1dJTjMyCit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYjE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKKworcHVibGljOgorICAvKioKKyAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciBwb2xpY2llcworICAgKi8KKyAgZW51bSBQT0xJQ1kgeyBPVEhFUiwgRklGTywgUk9VTkRfUk9CSU4gfTsKKworICAvKioKKyAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciByZWxhdGl2ZSBwcmlvcml0aWVzLAorICAgKgorICAgKiBBYnNvbHV0ZSBwcmlvcml0eSBpcyBkZXRlcm1pbmVkIGJ5IHNjaGVkdWxlciBwb2xpY3kgYW5kIE9TLiBUaGlzCisgICAqIGVudW1lcmF0aW9uIHNwZWNpZmllcyByZWxhdGl2ZSBwcmlvcml0aWVzIHN1Y2ggdGhhdCBvbmUgY2FuIHNwZWNpZnkgYQorICAgKiBwcmlvcml0eSB3aXRoaW4gYSBnaXZpbmcgc2NoZWR1bGVyIHBvbGljeSB3aXRob3V0IGtub3dpbmcgdGhlIGFic29sdXRlCisgICAqIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KKyAgICovCisgIGVudW0gUFJJT1JJVFkgeworICAgIExPV0VTVCA9IDAsCisgICAgTE9XRVIgPSAxLAorICAgIExPVyA9IDIsCisgICAgTk9STUFMID0gMywKKyAgICBISUdIID0gNCwKKyAgICBISUdIRVIgPSA1LAorICAgIEhJR0hFU1QgPSA2LAorICAgIElOQ1JFTUVOVCA9IDcsCisgICAgREVDUkVNRU5UID0gOAorICB9OworCisgIC8qKgorICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKKyAgICogdmlhIHN0ZDo6c2hhcmVkX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZCB0aGUgUnVubmFibGUgdGFza3MgCisgICAqIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIHRvIGJvdGggaXMKKyAgICogZ2l2ZW4gdXAuCisgICAqCisgICAqIFRocmVhZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBvbGljeSwgcHJpb3JpdHksIHN0YWNrLXNpemUgYW5kIGRldGFjaGFibGUtbW9kZQorICAgKiBkZXRhY2hlZCBtZWFucyB0aGUgdGhyZWFkIGlzIGZyZWUtcnVubmluZyBhbmQgd2lsbCByZWxlYXNlIGFsbCBzeXN0ZW0gcmVzb3VyY2VzIHRoZQorICAgKiB3aGVuIGl0IGNvbXBsZXRlcy4gIEEgZGV0YWNoYWJsZSB0aHJlYWQgaXMgbm90IGpvaW5hYmxlLiAgVGhlIGpvaW4gbWV0aG9kCisgICAqIG9mIGEgZGV0YWNoYWJsZSB0aHJlYWQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBubyBlcnJvci4KKyAgICoKKyAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoUE9MSUNZIHBvbGljeSA9IFJPVU5EX1JPQklOLAorICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFkgcHJpb3JpdHkgPSBOT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplID0gMSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV0YWNoZWQgPSB0cnVlKTsKKworICAvKioKKyAgICogUHJvdmlkZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgb3RoZXIgZmFjdG9yaWVzCisgICAqIFRoZSBkZWZhdWx0IHBvbGljeSBpcyBQT0xJQ1k6OlJPVU5EX1JPQklOLgorICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyBQUklPUklUWTo6Tk9STUFMLgorICAgKiBUaGUgZGVmYXVsdCBzdGFja1NpemUgaXMgMS4KKyAgICovCisgIFBvc2l4VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKTsKKworICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKKworICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7CisgIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKKyAgICoKKyAgICogQHJldHVybiBpbnQgc2l6ZSBpbiBtZWdhYnl0ZXMKKyAgICovCisgIHZpcnR1YWwgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXRzIHN0YWNrIHNpemUgZm9yIG5ld2x5IGNyZWF0ZWQgdGhyZWFkcworICAgKgorICAgKiBAcGFyYW0gdmFsdWUgc2l6ZSBpbiBtZWdhYnl0ZXMKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXRTdGFja1NpemUoaW50IHZhbHVlKTsKKworICAvKioKKyAgICogR2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQorICAgKi8KKyAgdmlydHVhbCBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5CisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgcHJpb3JpdHkpOworCitwcml2YXRlOgorICBQT0xJQ1kgcG9saWN5XzsKKyAgUFJJT1JJVFkgcHJpb3JpdHlfOworICBpbnQgc3RhY2tTaXplXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2IyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBzdGQgdGhyZWFkIGxpYnJhcnkKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNb25pdG9yOjpJbXBsIHsKKworcHVibGljOgorICBJbXBsKCkgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgeyBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsgfQorCisgIEltcGwoTXV0ZXgqIG11dGV4KSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgeyBpbml0KG11dGV4KTsgfQorCisgIEltcGwoTW9uaXRvciogbW9uaXRvcikgOiBvd25lZE11dGV4XygpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKE5VTEwpIHsKKyAgICBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOworICB9CisKKyAgTXV0ZXgmIG11dGV4KCkgeyByZXR1cm4gKm11dGV4XzsgfQorICB2b2lkIGxvY2soKSB7IG11dGV4Xy0+bG9jaygpOyB9CisgIHZvaWQgdW5sb2NrKCkgeyBtdXRleF8tPnVubG9jaygpOyB9CisKKyAgLyoqCisgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQorICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCisgICAqCisgICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGNsZWFubHk7IG9uIHRpbWVvdXQgb3IKKyAgICogZXJyb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisgIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIHsKKyAgICBpbnQgcmVzdWx0ID0gd2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKKyAgICBpZiAocmVzdWx0ID09IFRIUklGVF9FVElNRURPVVQpIHsKKyAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiTW9uaXRvcjo6d2FpdCgpIGZhaWxlZCIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uIHRvCisgICAqIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KKyAgICoKKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgeworICAgIGlmICh0aW1lb3V0X21zID09IDBMTCkgeworICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7CisgICAgfQorCisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgc3RkOjp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6dGltZWRfbXV0ZXg+IGxvY2soKm11dGV4SW1wbCwgc3RkOjphZG9wdF9sb2NrKTsKKyAgICBib29sIHRpbWVkb3V0ID0gKGNvbmRpdGlvblZhcmlhYmxlXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdGVtcDsKKyAgICB0ZW1wLnR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyk7CisgICAgdGVtcC50dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfbnNlYykgLyAxMDAwOworICAgIHJldHVybiB3YWl0Rm9yVGltZSgmdGVtcCk7CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCB0aW1ldmFsLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhYnN0aW1lKSB7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgc3RkOjp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBjdXJyZW50dGltZTsKKyAgICBVdGlsOjp0b1RpbWV2YWwoY3VycmVudHRpbWUsIFV0aWw6OmN1cnJlbnRUaW1lKCkpOworCisgICAgbG9uZyB0dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMgLSBjdXJyZW50dGltZS50dl9zZWMpOworICAgIGxvbmcgdHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3VzZWMgLSBjdXJyZW50dGltZS50dl91c2VjKTsKKyAgICBpZiAodHZfc2VjIDwgMCkKKyAgICAgIHR2X3NlYyA9IDA7CisgICAgaWYgKHR2X3VzZWMgPCAwKQorICAgICAgdHZfdXNlYyA9IDA7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6dGltZWRfbXV0ZXg+IGxvY2soKm11dGV4SW1wbCwgc3RkOjphZG9wdF9sb2NrKTsKKyAgICBib29sIHRpbWVkb3V0ID0gKGNvbmRpdGlvblZhcmlhYmxlXy53YWl0X2Zvcihsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKHR2X3NlYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModHZfdXNlYykpCisgICAgICAgICAgICAgICAgICAgICA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuICh0aW1lZG91dCA/IFRIUklGVF9FVElNRURPVVQgOiAwKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3Vycywgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAqLworICBpbnQgd2FpdEZvcmV2ZXIoKSB7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgc3RkOjp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6dGltZWRfbXV0ZXg+IGxvY2soKm11dGV4SW1wbCwgc3RkOjphZG9wdF9sb2NrKTsKKyAgICBjb25kaXRpb25WYXJpYWJsZV8ud2FpdChsb2NrKTsKKyAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZvaWQgbm90aWZ5KCkgeyBjb25kaXRpb25WYXJpYWJsZV8ubm90aWZ5X29uZSgpOyB9CisKKyAgdm9pZCBub3RpZnlBbGwoKSB7IGNvbmRpdGlvblZhcmlhYmxlXy5ub3RpZnlfYWxsKCk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgeyBtdXRleF8gPSBtdXRleDsgfQorCisgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxNdXRleD4gb3duZWRNdXRleF87CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSBjb25kaXRpb25WYXJpYWJsZV87CisgIE11dGV4KiBtdXRleF87Cit9OworCitNb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkgeworfQorCitNb25pdG9yOjp+TW9uaXRvcigpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCitNdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm11dGV4KCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5sb2NrKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPnVubG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdCh0aW1lb3V0KTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvcmV2ZXIoKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JldmVyKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeSgpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnlBbGwoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGY3OWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBDKysxMSBzdGQ6OnRpbWVkX211dGV4CisgKgorICogTWV0aG9kcyB0aHJvdyBzdGQ6OnN5c3RlbV9lcnJvciBvbiBlcnJvci4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNdXRleDo6aW1wbCA6IHB1YmxpYyBzdGQ6OnRpbWVkX211dGV4IHt9OworCitNdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoKSkgeworICAoKHZvaWQpaW5pdCk7Cit9CisKK3ZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLmdldCgpOworfQorCit2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQorCitib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRyeV9sb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dHJ5X2xvY2tfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMobXMpKTsKK30KKwordm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeworICBpbXBsXy0+dW5sb2NrKCk7Cit9CisKK3ZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgICgodm9pZClhcmcpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg1ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaWYgVVNFX1NURF9USFJFQUQKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIFRoZSBDKysxMSB0aHJlYWQgY2xhc3MuCisgKgorICogTm90ZSB0aGF0IHdlIHVzZSBib29zdCBzaGFyZWRfcHRyIHJhdGhlciB0aGFuIHN0ZCBzaGFyZWRfcHRycyBoZXJlCisgKiBiZWNhdXNlIHRoZSBUaHJlYWQvUnVubmFibGUgY2xhc3NlcyB1c2UgdGhvc2UgYW5kIHdlIGRvbid0IHdhbnQgdG8KKyAqIG1peCB0aGVtLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFN0ZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFN0ZFRocmVhZD4geworcHVibGljOgorICBlbnVtIFNUQVRFIHsgdW5pbml0aWFsaXplZCwgc3RhcnRpbmcsIHN0YXJ0ZWQsIHN0b3BwaW5nLCBzdG9wcGVkIH07CisKKyAgc3RhdGljIHZvaWQgdGhyZWFkTWFpbihzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpOworCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+IHRocmVhZF87CisgIE1vbml0b3IgbW9uaXRvcl87CisgIFNUQVRFIHN0YXRlXzsKKyAgYm9vbCBkZXRhY2hlZF87CisKK3B1YmxpYzoKKyAgU3RkVGhyZWFkKGJvb2wgZGV0YWNoZWQsIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOiBzdGF0ZV8odW5pbml0aWFsaXplZCksIGRldGFjaGVkXyhkZXRhY2hlZCkgeworICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOworICB9CisKKyAgflN0ZFRocmVhZCgpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiB0aHJlYWRfLT5qb2luYWJsZSgpKSB7CisgICAgICB0cnkgeworICAgICAgICBqb2luKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIFNUQVRFIGdldFN0YXRlKCkgY29uc3QKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICByZXR1cm4gc3RhdGVfOworICB9CisKKyAgdm9pZCBzZXRTdGF0ZShTVEFURSBuZXdTdGF0ZSkKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICBzdGF0ZV8gPSBuZXdTdGF0ZTsKKworICAgIC8vIHVuYmxvY2sgc3RhcnQoKSB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgdGhyZWFkIGhhcyBhY3R1YWxseQorICAgIC8vIHN0YXJ0ZWQgcnVubmluZywgd2hpY2ggYXZvaWRzIGEgcmFjZSBpbiBkZXRhY2hlZCB0aHJlYWRzLgorICAgIGlmIChuZXdTdGF0ZSA9PSBzdGFydGVkKSB7CisJICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHN0YXJ0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiBzZWxmUmVmID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIHNldFN0YXRlKHN0YXJ0aW5nKTsKKworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICB0aHJlYWRfID0gc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPihuZXcgc3RkOjp0aHJlYWQodGhyZWFkTWFpbiwgc2VsZlJlZikpOworCisgICAgaWYgKGRldGFjaGVkXykKKyAgICAgIHRocmVhZF8tPmRldGFjaCgpOworICAgIAorICAgIC8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQgYW5kIGdldCBmYXIgZW5vdWdoIHRvIGdyYWIgZXZlcnl0aGluZworICAgIC8vIHRoYXQgaXQgbmVlZHMgZnJvbSB0aGUgY2FsbGluZyBjb250ZXh0LCB0aHVzIGFic29sdmluZyB0aGUgY2FsbGVyCisgICAgLy8gZnJvbSBiZWluZyByZXF1aXJlZCB0byBob2xkIG9uIHRvIHJ1bm5hYmxlIGluZGVmaW5pdGVseS4KKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KKworICB2b2lkIGpvaW4oKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHRocmVhZF8tPmpvaW4oKTsKKyAgICB9CisgIH0KKworICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7IHJldHVybiB0aHJlYWRfLmdldCgpID8gdGhyZWFkXy0+Z2V0X2lkKCkgOiBzdGQ6OnRocmVhZDo6aWQoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KKworICB2b2lkIHJ1bm5hYmxlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KK307CisKK3ZvaWQgU3RkVGhyZWFkOjp0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCkgeworI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECisgIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKKyNlbmRpZgorCisgIHRocmVhZC0+c2V0U3RhdGUoc3RhcnRlZCk7CisgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7CisKKyAgaWYgKHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBlZCkgeworICAgIHRocmVhZC0+c2V0U3RhdGUoc3RvcHBpbmcpOworICB9Cit9CisKK1N0ZFRocmVhZEZhY3Rvcnk6OlN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IFN0ZFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHJlc3VsdCA9IHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+KG5ldyBTdGRUaHJlYWQoaXNEZXRhY2hlZCgpLCBydW5uYWJsZSkpOworICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RocmVhZDo6aWRfdCBTdGRUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7CisgIHJldHVybiBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyBVU0VfU1REX1RIUkVBRApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MDQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBBIHRocmVhZCBmYWN0b3J5IHRvIGNyZWF0ZSBzdGQ6OnRocmVhZHMuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgU3RkVGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKKworcHVibGljOgorICAvKioKKyAgICogU3RkIHRocmVhZCBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzCisgICAqIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCisgICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCisgICAqCisgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgorICAgKi8KKworICBTdGRUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQgPSB0cnVlKTsKKworICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKKworICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7CisgIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXyAxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaWYgVVNFX1NURF9USFJFQUQKKyNpbmNsdWRlIDx0aHJlYWQ+CisjZWxzZQorI2lmZGVmIEhBVkVfUFRIUkVBRF9ICisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKK2NsYXNzIFRocmVhZDsKKworLyoqCisgKiBNaW5pbWFsIHJ1bm5hYmxlIGNsYXNzLiAgTW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuUnVubmFibGUuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgUnVubmFibGUgeworCitwdWJsaWM6CisgIHZpcnR1YWwgflJ1bm5hYmxlKCl7fTsKKyAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgdGhyZWFkIG9iamVjdCB0aGF0IGlzIGhvc3RpbmcgdGhpcyBydW5uYWJsZSBvYmplY3QgIC0gY2FuIHJldHVybgorICAgKiBhbiBlbXB0eSBib29zdDo6c2hhcmVkIHBvaW50ZXIgaWYgbm8gcmVmZXJlbmNlcyByZW1haW4gb24gdGhhdCB0aHJlYWQgb2JqZWN0CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRocmVhZCB0aGF0IGlzIGV4ZWN1dGluZyB0aGlzIG9iamVjdC4gIFRoaXMgaXMgb25seSBtZWFudCBmb3IKKyAgICogdXNlIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiBUaHJlYWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgdGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHZhbHVlKSB7IHRocmVhZF8gPSB2YWx1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OndlYWtfcHRyPFRocmVhZD4gdGhyZWFkXzsKK307CisKKy8qKgorICogTWluaW1hbCB0aHJlYWQgY2xhc3MuIFJldHVybmVkIGJ5IHRocmVhZCBmYWN0b3J5IGJvdW5kIHRvIGEgUnVubmFibGUgb2JqZWN0CisgKiBhbmQgcmVhZHkgdG8gc3RhcnQgZXhlY3V0aW9uLiAgTW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuVGhyZWFkCisgKiAobWludXMgYWxsIHRoZSB0aHJlYWQgZ3JvdXAsIHByaW9yaXR5LCBtb2RlIGFuZCBvdGhlciBiYWdnYWdlLCBzaW5jZSB0aGF0CisgKiBpcyBkaWZmaWN1bHQgdG8gYWJzdHJhY3QgYWNyb3NzIHBsYXRmb3JtcyBhbmQgaXMgbGVmdCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKKyAqIFRocmVhZEZhY3RvcnkgaW1wbGVtdGF0aW9ucyB0byBkZWFsIHdpdGgKKyAqCisgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeSkKKyAqLworY2xhc3MgVGhyZWFkIHsKKworcHVibGljOgorI2lmIFVTRV9TVERfVEhSRUFECisgIHR5cGVkZWYgc3RkOjp0aHJlYWQ6OmlkIGlkX3Q7CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzX2N1cnJlbnQoaWRfdCB0KSB7IHJldHVybiB0ID09IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9CisgIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9CisjZWxzZQorICB0eXBlZGVmIHB0aHJlYWRfdCBpZF90OworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gcHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgdCk7IH0KKyAgc3RhdGljIGlubGluZSBpZF90IGdldF9jdXJyZW50KCkgeyByZXR1cm4gcHRocmVhZF9zZWxmKCk7IH0KKyNlbmRpZgorCisgIHZpcnR1YWwgflRocmVhZCgpe307CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgdGhyZWFkLiBEb2VzIHBsYXRmb3JtIHNwZWNpZmljIHRocmVhZCBjcmVhdGlvbiBhbmQKKyAgICogY29uZmlndXJhdGlvbiB0aGVuIGludm9rZXMgdGhlIHJ1biBtZXRob2Qgb2YgdGhlIFJ1bm5hYmxlIG9iamVjdCBib3VuZAorICAgKiB0byB0aGlzIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKKworICAvKioKKyAgICogSm9pbiB0aGlzIHRocmVhZC4gSWYgdGhpcyB0aHJlYWQgaXMgam9pbmFibGUsIHRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MKKyAgICogdW50aWwgdGhpcyB0aHJlYWQgY29tcGxldGVzLiAgSWYgdGhlIHRhcmdldCB0aHJlYWQgaXMgbm90IGpvaW5hYmxlLCB0aGVuCisgICAqIG5vdGhpbmcgaGFwcGVucy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBqb2luKCkgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSB0aHJlYWQncyBwbGF0Zm9ybS1zcGVjaWZpYyBJRAorICAgKi8KKyAgdmlydHVhbCBpZF90IGdldElkKCkgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBydW5uYWJsZSBvYmplY3QgdGhpcyB0aHJlYWQgaXMgaG9zdGluZworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIHJ1bm5hYmxlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgX3J1bm5hYmxlID0gdmFsdWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBfcnVubmFibGU7Cit9OworCisvKioKKyAqIEZhY3RvcnkgdG8gY3JlYXRlIHBsYXRmb3JtLXNwZWNpZmljIHRocmVhZCBvYmplY3QgYW5kIGJpbmQgdGhlbSB0byBSdW5uYWJsZQorICogb2JqZWN0IGZvciBleGVjdXRpb24KKyAqLworY2xhc3MgVGhyZWFkRmFjdG9yeSB7Citwcm90ZWN0ZWQ6CisgIFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBkZXRhY2hlZF8oZGV0YWNoZWQpIHsgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgflRocmVhZEZhY3RvcnkoKSB7IH0KKworICAvKioKKyAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKKyAgICovCisgIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBkZXRhY2hlZCBkaXNwb3NpdGlvbiBvZiBuZXdseSBjcmVhdGVkIHRocmVhZHMuCisgICAqLworICB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpIHsgZGV0YWNoZWRfID0gZGV0YWNoZWQ7IH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCB0aHJlYWQgaWQgb3IgdW5rbm93bl90aHJlYWRfaWQgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHRocmlmdCB0aHJlYWQKKyAgICovCisgIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogRm9yIGNvZGUgcmVhZGFiaWxpdHkgZGVmaW5lIHRoZSB1bmtub3duL3VuZGVmaW5lZCB0aHJlYWQgaWQKKyAgICovCisgIHN0YXRpYyBjb25zdCBUaHJlYWQ6OmlkX3QgdW5rbm93bl90aHJlYWRfaWQ7CisKK3ByaXZhdGU6CisgIGJvb2wgZGV0YWNoZWRfOworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAyNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7CisKKy8qKgorICogVGhyZWFkTWFuYWdlciBjbGFzcworICoKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCisgKiB0aHJlYWRzLiAgSXQgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlcyBvciBkZXN0cm95cyB3b3JrZXIgdGhyZWFkcywgcmF0aGVyCisgKiBpdCBtYWludGFpbnMgc3RhdGlzdGljcyBvbiBudW1iZXIgb2YgaWRsZSB0aHJlYWRzLCBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMsCisgKiB0YXNrIGJhY2tsb2csIGFuZCBhdmVyYWdlIHdhaXQgYW5kIHNlcnZpY2UgdGltZXMuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBtb25pdG9ycyB1c2VkIGZvciBzaWduYWxpbmcgZGlmZmVyZW50IGNvbmRpdGlvbnMKKyAqIGhvd2V2ZXIgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgbXV0ZXhfLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRocmVhZE1hbmFnZXI6OkltcGwgOiBwdWJsaWMgVGhyZWFkTWFuYWdlciB7CisKK3B1YmxpYzoKKyAgSW1wbCgpCisgICAgOiB3b3JrZXJDb3VudF8oMCksCisgICAgICB3b3JrZXJNYXhDb3VudF8oMCksCisgICAgICBpZGxlQ291bnRfKDApLAorICAgICAgcGVuZGluZ1Rhc2tDb3VudE1heF8oMCksCisgICAgICBleHBpcmVkQ291bnRfKDApLAorICAgICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAorICAgICAgbW9uaXRvcl8oJm11dGV4XyksCisgICAgICBtYXhNb25pdG9yXygmbXV0ZXhfKSwKKyAgICAgIHdvcmtlck1vbml0b3JfKCZtdXRleF8pIHt9CisKKyAgfkltcGwoKSB7IHN0b3AoKTsgfQorCisgIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdG9wKCk7CisKKyAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KKworICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiB0aHJlYWRGYWN0b3J5XzsKKyAgfQorCisgIHZvaWQgdGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIGlmICh0aHJlYWRGYWN0b3J5XyAmJiB0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpICE9IHZhbHVlLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOworICB9CisKKyAgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlKTsKKworICB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpOworCisgIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCB7IHJldHVybiBpZGxlQ291bnRfOyB9CisKKyAgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gd29ya2VyQ291bnRfOworICB9CisKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiB0YXNrc18uc2l6ZSgpOworICB9CisKKyAgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gdGFza3NfLnNpemUoKSArIHdvcmtlckNvdW50XyAtIGlkbGVDb3VudF87CisgIH0KKworICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHBlbmRpbmdUYXNrQ291bnRNYXhfOworICB9CisKKyAgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiBleHBpcmVkQ291bnRfOworICB9CisKKyAgdm9pZCBwZW5kaW5nVGFza0NvdW50TWF4KGNvbnN0IHNpemVfdCB2YWx1ZSkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBwZW5kaW5nVGFza0NvdW50TWF4XyA9IHZhbHVlOworICB9CisKKyAgdm9pZCBhZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsIGludDY0X3QgdGltZW91dCwgaW50NjRfdCBleHBpcmF0aW9uKTsKKworICB2b2lkIHJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpOworCisgIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgeworICAgIHJlbW92ZUV4cGlyZWQoZmFsc2UpOworICB9CisKKyAgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjayk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBSZW1vdmUgb25lIG9yIG1vcmUgZXhwaXJlZCB0YXNrcy4KKyAgICogXHBhcmFtW2luXSAganVzdE9uZSAgaWYgdHJ1ZSwgdHJ5IHRvIHJlbW92ZSBqdXN0IG9uZSB0YXNrIGFuZCByZXR1cm4KKyAgICovCisgIHZvaWQgcmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpOworCisgIC8qKgorICAgKiBccmV0dXJucyB3aGV0aGVyIGl0IGlzIGFjY2VwdGFibGUgdG8gYmxvY2ssIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0aHJlYWQgaWQKKyAgICovCisgIGJvb2wgY2FuU2xlZXAoKSBjb25zdDsKKworICAvKioKKyAgICogTG93ZXJzIHRoZSBtYXhpbXVtIHdvcmtlciBjb3VudCBhbmQgYmxvY2tzIHVudGlsIGVub3VnaCB3b3JrZXIgdGhyZWFkcyBjb21wbGV0ZQorICAgKiB0byBnZXQgdG8gdGhlIG5ldyBtYXhpbXVtIHdvcmtlciBsaW1pdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjcXVpcmluZworICAgKiBhIGxvY2sgb24gdGhlIGNsYXNzIG11dGV4Xy4KKyAgICovCisgIHZvaWQgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpOworCisgIHNpemVfdCB3b3JrZXJDb3VudF87CisgIHNpemVfdCB3b3JrZXJNYXhDb3VudF87CisgIHNpemVfdCBpZGxlQ291bnRfOworICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87CisgIHNpemVfdCBleHBpcmVkQ291bnRfOworICBFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFja187CisKKyAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGVfOworICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOworCisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrOworICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2hhcmVkX3B0cjxUYXNrPiA+IFRhc2tRdWV1ZTsKKyAgVGFza1F1ZXVlIHRhc2tzXzsKKyAgTXV0ZXggbXV0ZXhfOworICBNb25pdG9yIG1vbml0b3JfOworICBNb25pdG9yIG1heE1vbml0b3JfOworICBNb25pdG9yIHdvcmtlck1vbml0b3JfOyAgICAgICAvLyB1c2VkIHRvIHN5bmNocm9uaXplIGNoYW5nZXMgaW4gd29ya2VyIGNvdW50CisKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKKyAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gd29ya2Vyc187CisgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IGRlYWRXb3JrZXJzXzsKKyAgc3RkOjptYXA8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPiBpZE1hcF87Cit9OworCitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworcHVibGljOgorICBlbnVtIFNUQVRFIHsgV0FJVElORywgRVhFQ1VUSU5HLCBUSU1FRE9VVCwgQ09NUExFVEUgfTsKKworICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlLCBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpCisgICAgOiBydW5uYWJsZV8ocnVubmFibGUpLAorICAgICAgc3RhdGVfKFdBSVRJTkcpLAorICAgICAgZXhwaXJlVGltZV8oZXhwaXJhdGlvbiAhPSAwTEwgPyBVdGlsOjpjdXJyZW50VGltZSgpICsgZXhwaXJhdGlvbiA6IDBMTCkge30KKworICB+VGFzaygpIHt9CisKKyAgdm9pZCBydW4oKSB7CisgICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKKyAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7CisgICAgICBzdGF0ZV8gPSBDT01QTEVURTsKKyAgICB9CisgIH0KKworICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBnZXRSdW5uYWJsZSgpIHsgcmV0dXJuIHJ1bm5hYmxlXzsgfQorCisgIGludDY0X3QgZ2V0RXhwaXJlVGltZSgpIGNvbnN0IHsgcmV0dXJuIGV4cGlyZVRpbWVfOyB9CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKKyAgU1RBVEUgc3RhdGVfOworICBpbnQ2NF90IGV4cGlyZVRpbWVfOworfTsKKworY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OworCitwdWJsaWM6CisgIFdvcmtlcihUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyKSA6IG1hbmFnZXJfKG1hbmFnZXIpLCBzdGF0ZV8oVU5JTklUSUFMSVpFRCkge30KKworICB+V29ya2VyKCkge30KKworcHJpdmF0ZToKKyAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPD0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykKKyAgICAgICAgICAgfHwgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gSk9JTklORyAmJiAhbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8qKgorICAgKiBXb3JrZXIgZW50cnkgcG9pbnQKKyAgICoKKyAgICogQXMgbG9uZyBhcyB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHF1ZXVlIGFuZAorICAgKiBleGVjdXRlLgorICAgKi8KKyAgdm9pZCBydW4oKSB7CisgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0aHJlZSBwYXJ0czsgb25lIGlzIHRvIGNoZWNrIGZvciBhbmQgYWNjb3VudCBmb3IKKyAgICAgKiBhZG1pdHRpbmcgYSB0YXNrIHdoaWNoIGhhcHBlbnMgdW5kZXIgYSBsb2NrLiAgVGhlbiB0aGUgbG9jayBpcyByZWxlYXNlZAorICAgICAqIGFuZCB0aGUgdGFzayBpdHNlbGYgaXMgZXhlY3V0ZWQuICBGaW5hbGx5IHdlIGRvIHNvbWUgYWNjb3VudGluZworICAgICAqIHVuZGVyIGxvY2sgYWdhaW4gd2hlbiB0aGUgdGFzayBjb21wbGV0ZXMuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBBZG1pdHRpbmcKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB3b3JrZXIgc2VtYXBob3JlIGFuZCBub3RpZnkgbWFuYWdlciBpZiB3b3JrZXIgY291bnQgcmVhY2hlZAorICAgICAqIGRlc2lyZWQgbWF4CisgICAgICovCisgICAgYm9vbCBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICBpZiAoKyttYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHsKKyAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChhY3RpdmUpIHsKKyAgICAgIC8qKgorICAgICAgICAqIFdoaWxlIGhvbGRpbmcgbWFuYWdlciBtb25pdG9yIGJsb2NrIGZvciBub24tZW1wdHkgdGFzayBxdWV1ZSAoQWxzbworICAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCisgICAgICAgICogaXMgbm9uLWVtcHR5LCBkZXF1ZXVlIGEgdGFzaywgcmVsZWFzZSBtb25pdG9yLCBhbmQgZXhlY3V0ZS4gSWYgdGhlCisgICAgICAgICogd29ya2VyIG1heCBjb3VudCBoYXMgYmVlbiBkZWNyZW1lbnRlZCBzdWNoIHRoYXQgd2UgZXhjZWVkIGl0LCBtYXJrCisgICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgorICAgICAgICAqICh0ZWNobmljYWxseSB3ZSdyZSBub3RpZnlpbmcgdGhlIG5leHQgYmxvY2tlZCB0aHJlYWQgYnV0IGV2ZW50dWFsbHkKKyAgICAgICAgKiB0aGUgbWFuYWdlciB3aWxsIHNlZSBpdC4KKyAgICAgICAgKi8KKyAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7CisKKyAgICAgIHdoaWxlIChhY3RpdmUgJiYgbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7CisgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7CisgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7CisgICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7CisgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzazsKKworICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyXy0+dGFza3NfLmZyb250KCk7CisgICAgICAgICAgbWFuYWdlcl8tPnRhc2tzXy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gRVhFQ1VUSU5HIG9yIFRJTUVET1VUIGhlcmUKKyAgICAgICAgICAgIC8vIHRoZW4gdGhlIGV4ZWN1dGlvbiBsb29wIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVsb3cuCisgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPQorICAgICAgICAgICAgICAgICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgJiYgdGFzay0+Z2V0RXhwaXJlVGltZSgpIDwgVXRpbDo6Y3VycmVudFRpbWUoKSkgPworICAgICAgICAgICAgICAgICAgICBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpUSU1FRE9VVCA6CisgICAgICAgICAgICAgICAgICAgIFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyB0YXNrIG1heCBhbmQgd2UganVzdCBkcm9wcGVkIGJlbG93IGl0LCB3YWtldXAgYW55CisgICAgICAgICAgICB0aHJlYWQgdGhhdCBtaWdodCBiZSBibG9ja2VkIG9uIGFkZC4gKi8KKyAgICAgICAgaWYgKG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAhPSAwCisgICAgICAgICAgICAmJiBtYW5hZ2VyXy0+dGFza3NfLnNpemUoKSA8PSBtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gLSAxKSB7CisgICAgICAgICAgbWFuYWdlcl8tPm1heE1vbml0b3JfLm5vdGlmeSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRXhlY3V0aW9uIC0gbm90IGhvbGRpbmcgYSBsb2NrCisgICAgICAgKi8KKyAgICAgIGlmICh0YXNrKSB7CisgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HKSB7CisKKyAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIHdlIGNhbiBydW4gdGhlIHRhc2sgd2l0aG91dCBibG9ja2luZyB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgICAgICBtYW5hZ2VyXy0+bXV0ZXhfLnVubG9jaygpOworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhc2stPnJ1bigpOworICAgICAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIHRhc2stPnJ1bigpIHJhaXNlZCBhbiBleGNlcHRpb246ICVzIiwgZS53aGF0KCkpOworICAgICAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiW0VSUk9SXSB0YXNrLT5ydW4oKSByYWlzZWQgYW4gdW5rbm93biBleGNlcHRpb24iKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBSZS1hY3F1aXJlIHRoZSBsb2NrIHRvIHByb2NlZWQgaW4gdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICAgICAgbWFuYWdlcl8tPm11dGV4Xy5sb2NrKCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChtYW5hZ2VyXy0+ZXhwaXJlQ2FsbGJhY2tfKSB7CisgICAgICAgICAgLy8gVGhlIG9ubHkgb3RoZXIgc3RhdGUgdGhlIHRhc2sgY291bGQgaGF2ZSBiZWVuIGluIGlzIFRJTUVET1VUIChzZWUgYWJvdmUpCisgICAgICAgICAgbWFuYWdlcl8tPmV4cGlyZUNhbGxiYWNrXyh0YXNrLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgICAgICBtYW5hZ2VyXy0+ZXhwaXJlZENvdW50XysrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluYWwgYWNjb3VudGluZyBmb3IgdGhlIHdvcmtlciB0aHJlYWQgdGhhdCBpcyBkb25lIHdvcmtpbmcKKyAgICAgKi8KKyAgICBtYW5hZ2VyXy0+ZGVhZFdvcmtlcnNfLmluc2VydCh0aGlzLT50aHJlYWQoKSk7CisgICAgaWYgKC0tbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CisgICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXJfOworICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbDsKKyAgU1RBVEUgc3RhdGVfOworfTsKKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSB7CisgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IG5ld1RocmVhZHM7CisgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgeworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4obmV3IFRocmVhZE1hbmFnZXI6Oldvcmtlcih0aGlzKSk7CisgICAgbmV3VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZCh3b3JrZXIpKTsKKyAgfQorCisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOworICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKKworICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IG5ld1RocmVhZHMuYmVnaW4oKTsgaXggIT0gbmV3VGhyZWFkcy5lbmQoKTsKKyAgICAgICArK2l4KSB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlcgorICAgICAgICA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRocmVhZE1hbmFnZXI6OldvcmtlciwgUnVubmFibGU+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKyAgICB3b3JrZXItPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6Oldvcmtlcjo6U1RBUlRJTkc7CisgICAgKCppeCktPnN0YXJ0KCk7CisgICAgaWRNYXBfLmluc2VydChzdGQ6OnBhaXI8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPigoKml4KS0+Z2V0SWQoKSwgKml4KSk7CisgIH0KKworICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgeworICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKKyAgfQorfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0YXJ0KCkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgeworICAgIGlmICghdGhyZWFkRmFjdG9yeV8pIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKyAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEOworICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICB9CisKKyAgd2hpbGUgKHN0YXRlXyA9PSBTVEFSVElORykgeworICAgIG1vbml0b3JfLndhaXQoKTsKKyAgfQorfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0b3AoKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgYm9vbCBkb1N0b3AgPSBmYWxzZTsKKworICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HICYmIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HCisgICAgICAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRCkgeworICAgIGRvU3RvcCA9IHRydWU7CisgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORzsKKyAgfQorCisgIGlmIChkb1N0b3ApIHsKKyAgICByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHdvcmtlckNvdW50Xyk7CisgIH0KKworICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOworfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHZhbHVlKTsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHNpemVfdCB2YWx1ZSkgeworICBpZiAodmFsdWUgPiB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgfQorCisgIHdvcmtlck1heENvdW50XyAtPSB2YWx1ZTsKKworICBpZiAoaWRsZUNvdW50XyA+IHZhbHVlKSB7CisgICAgLy8gVGhlcmUgYXJlIG1vcmUgaWRsZSB3b3JrZXJzIHRoYW4gd2UgbmVlZCB0byByZW1vdmUsCisgICAgLy8gc28gbm90aWZ5IGVub3VnaCBvZiB0aGVtIHNvIHRoZXkgY2FuIHRlcm1pbmF0ZS4KKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKKyAgICAgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBUaGVyZSBhcmUgYXMgbWFueSBvciBsZXNzIGlkbGUgd29ya2VycyB0aGFuIHdlIG5lZWQgdG8gcmVtb3ZlLAorICAgIC8vIHNvIGp1c3Qgbm90aWZ5IHRoZW0gYWxsIHNvIHRoZXkgY2FuIHRlcm1pbmF0ZS4KKyAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgfQorCisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsKKyAgICAgICBpeCAhPSBkZWFkV29ya2Vyc18uZW5kKCk7CisgICAgICAgKytpeCkgeworCisgICAgLy8gd2hlbiB1c2VkIHdpdGggYSBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSwgd2Ugam9pbiB0aGUgdGhyZWFkcyBhcyB3ZSByZW1vdmUgdGhlbQorICAgIGlmICghdGhyZWFkRmFjdG9yeV8tPmlzRGV0YWNoZWQoKSkgeworICAgICAgKCppeCktPmpvaW4oKTsKKyAgICB9CisKKyAgICBpZE1hcF8uZXJhc2UoKCppeCktPmdldElkKCkpOworICAgIHdvcmtlcnNfLmVyYXNlKCppeCk7CisgIH0KKworICBkZWFkV29ya2Vyc18uY2xlYXIoKTsKK30KKworYm9vbCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpjYW5TbGVlcCgpIGNvbnN0IHsKKyAgY29uc3QgVGhyZWFkOjppZF90IGlkID0gdGhyZWFkRmFjdG9yeV8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOworICByZXR1cm4gaWRNYXBfLmZpbmQoaWQpID09IGlkTWFwXy5lbmQoKTsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsIGludDY0X3QgdGltZW91dCwgaW50NjRfdCBleHBpcmF0aW9uKSB7CisgIEd1YXJkIGcobXV0ZXhfLCB0aW1lb3V0KTsKKworICBpZiAoIWcpIHsKKyAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOworICB9CisKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkIFRocmVhZE1hbmFnZXIgIgorICAgICAgICAibm90IHN0YXJ0ZWQiKTsKKyAgfQorCisgIC8vIGlmIHdlJ3JlIGF0IGEgbGltaXQsIHJlbW92ZSBhbiBleHBpcmVkIHRhc2sgdG8gc2VlIGlmIHRoZSBsaW1pdCBjbGVhcnMKKyAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKKyAgICByZW1vdmVFeHBpcmVkKHRydWUpOworICB9CisKKyAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKKyAgICBpZiAoY2FuU2xlZXAoKSAmJiB0aW1lb3V0ID49IDApIHsKKyAgICAgIHdoaWxlIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgdGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykgeworICAgICAgICAvLyBUaGlzIGlzIHRocmVhZCBzYWZlIGJlY2F1c2UgdGhlIG11dGV4IGlzIHNoYXJlZCBiZXR3ZWVuIG1vbml0b3JzLgorICAgICAgICBtYXhNb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgdGFza3NfLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyOjpUYXNrKHZhbHVlLCBleHBpcmF0aW9uKSkpOworCisgIC8vIElmIGlkbGUgdGhyZWFkIGlzIGF2YWlsYWJsZSBub3RpZnkgaXQsIG90aGVyd2lzZSBhbGwgd29ya2VyIHRocmVhZHMgYXJlCisgIC8vIHJ1bm5pbmcgYW5kIHdpbGwgZ2V0IGFyb3VuZCB0byB0aGlzIHRhc2sgaW4gdGltZS4KKyAgaWYgKGlkbGVDb3VudF8gPiAwKSB7CisgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZSBUaHJlYWRNYW5hZ2VyIG5vdCAiCisgICAgICAgICJzdGFydGVkIik7CisgIH0KKworICBmb3IgKFRhc2tRdWV1ZTo6aXRlcmF0b3IgaXQgPSB0YXNrc18uYmVnaW4oKTsgaXQgIT0gdGFza3NfLmVuZCgpOyArK2l0KQorICB7CisgICAgaWYgKCgqaXQpLT5nZXRSdW5uYWJsZSgpID09IHRhc2spCisgICAgeworICAgICAgdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZygpIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZyAiCisgICAgICAgICJUaHJlYWRNYW5hZ2VyIG5vdCBzdGFydGVkIik7CisgIH0KKworICBpZiAodGFza3NfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOworICB9CisKKyAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7CisgIHRhc2tzXy5wb3BfZnJvbnQoKTsKKworICByZXR1cm4gdGFzay0+Z2V0UnVubmFibGUoKTsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVFeHBpcmVkKGJvb2wganVzdE9uZSkgeworICAvLyB0aGlzIGlzIGFsd2F5cyBjYWxsZWQgdW5kZXIgYSBsb2NrCisgIGludDY0X3Qgbm93ID0gMExMOworCisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICkKKyAgeworICAgIGlmIChub3cgPT0gMExMKSB7CisgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIH0KKworICAgIGlmICgoKml0KS0+Z2V0RXhwaXJlVGltZSgpID4gMExMICYmICgqaXQpLT5nZXRFeHBpcmVUaW1lKCkgPCBub3cpIHsKKyAgICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgZXhwaXJlQ2FsbGJhY2tfKCgqaXQpLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGl0ID0gdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgICsrZXhwaXJlZENvdW50XzsKKyAgICAgIGlmIChqdXN0T25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICsraXQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBleHBpcmVDYWxsYmFja18gPSBleHBpcmVDYWxsYmFjazsKK30KKworY2xhc3MgU2ltcGxlVGhyZWFkTWFuYWdlciA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyOjpJbXBsIHsKKworcHVibGljOgorICBTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCB3b3JrZXJDb3VudCA9IDQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCkKKyAgICA6IHdvcmtlckNvdW50Xyh3b3JrZXJDb3VudCksIHBlbmRpbmdUYXNrQ291bnRNYXhfKHBlbmRpbmdUYXNrQ291bnRNYXgpIHt9CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpwZW5kaW5nVGFza0NvdW50TWF4KHBlbmRpbmdUYXNrQ291bnRNYXhfKTsKKyAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpOworICAgIGFkZFdvcmtlcih3b3JrZXJDb3VudF8pOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IHNpemVfdCB3b3JrZXJDb3VudF87CisgIGNvbnN0IHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4XzsKK307CisKK3NoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gVGhyZWFkTWFuYWdlcjo6bmV3VGhyZWFkTWFuYWdlcigpIHsKKyAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFRocmVhZE1hbmFnZXI6OkltcGwoKSk7Cit9CisKK3NoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgpIHsKKyAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFNpbXBsZVRocmVhZE1hbmFnZXIoY291bnQsIHBlbmRpbmdUYXNrQ291bnRNYXgpKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzBmYzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8gMQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaHJlYWQgUG9vbCBNYW5hZ2VyIGFuZCByZWxhdGVkIGNsYXNzZXMKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaHJlYWRNYW5hZ2VyOworCisvKioKKyAqIFRocmVhZE1hbmFnZXIgY2xhc3MKKyAqCisgKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBwb29sIG9mIHRocmVhZHMuIEl0IHVzZXMgYSBUaHJlYWRGYWN0b3J5IHRvIGNyZWF0ZQorICogdGhyZWFkcy4gSXQgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlcyBvciBkZXN0cm95cyB3b3JrZXIgdGhyZWFkcywgcmF0aGVyCisgKiBpdCBtYWludGFpbnMgc3RhdGlzdGljcyBvbiBudW1iZXIgb2YgaWRsZSB0aHJlYWRzLCBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMsCisgKiB0YXNrIGJhY2tsb2csIGFuZCBhdmVyYWdlIHdhaXQgYW5kIHNlcnZpY2UgdGltZXMgYW5kIGluZm9ybXMgdGhlIFBvb2xQb2xpY3kKKyAqIG9iamVjdCBib3VuZCB0byBpbnN0YW5jZXMgb2YgdGhpcyBtYW5hZ2VyIG9mIGludGVyZXN0aW5nIHRyYW5zaXRpb25zLiBJdCBpcworICogdGhlbiB1cCB0aGUgUG9vbFBvbGljeSBvYmplY3QgdG8gZGVjaWRlIGlmIHRoZSB0aHJlYWQgcG9vbCBzaXplIG5lZWRzIHRvIGJlCisgKiBhZGp1c3RlZCBhbmQgY2FsbCB0aGlzIG9iamVjdCBhZGRXb3JrZXIgYW5kIHJlbW92ZVdvcmtlciBtZXRob2RzIHRvIG1ha2UKKyAqIGNoYW5nZXMuCisgKgorICogVGhpcyBkZXNpZ24gYWxsb3dzIGRpZmZlcmVudCBwb2xpY3kgaW1wbGVtZW50YXRpb25zIHRvIHVzZSB0aGlzIGNvZGUgdG8KKyAqIGhhbmRsZSBiYXNpYyB3b3JrZXIgdGhyZWFkIG1hbmFnZW1lbnQgYW5kIHdvcmtlciB0YXNrIGV4ZWN1dGlvbiBhbmQgZm9jdXMgb24KKyAqIHBvbGljeSBpc3N1ZXMuIFRoZSBzaW1wbGVzdCBwb2xpY3ksIFN0YXRpY1BvbGljeSwgZG9lcyBub3RoaW5nIG90aGVyIHRoYW4KKyAqIGNyZWF0ZSBhIGZpeGVkIG51bWJlciBvZiB0aHJlYWRzLgorICovCitjbGFzcyBUaHJlYWRNYW5hZ2VyIHsKKworcHJvdGVjdGVkOgorICBUaHJlYWRNYW5hZ2VyKCkge30KKworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7CisKKyAgdmlydHVhbCB+VGhyZWFkTWFuYWdlcigpIHt9CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgdGhyZWFkIG1hbmFnZXIuIFZlcmlmaWVzIGFsbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBwcm9wZXJseQorICAgKiBpbml0aWFsaXplZCwgdGhlbiBhbGxvY2F0ZXMgbmVjZXNzYXJ5IHJlc291cmNlcyB0byBiZWdpbiBvcGVyYXRpb24KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKKworICAvKioKKyAgICogU3RvcHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBBYm9ydHMgYWxsIHJlbWFpbmluZyB1bnByb2Nlc3NlZCB0YXNrLCBzaHV0cworICAgKiBkb3duIGFsbCBjcmVhdGVkIHdvcmtlciB0aHJlYWRzLCBhbmQgcmVsZWFzZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMuCisgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIGNvbXBsZXRlLCB0aHVzIGl0IGNhbgorICAgKiBwb3RlbnRpYWxseSBibG9jayBmb3JldmVyIGlmIGEgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nIGEgdGFzayB0aGF0CisgICAqIHdvbid0IHRlcm1pbmF0ZS4KKyAgICoKKyAgICogV29ya2VyIHRocmVhZHMgd2lsbCBiZSBqb2luZWQgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWRGYWN0b3J5J3MgZGV0YWNoZWQKKyAgICogZGlzcG9zaXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RvcCgpID0gMDsKKworICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIEpPSU5JTkcsIFNUT1BQSU5HLCBTVE9QUEVEIH07CisKKyAgdmlydHVhbCBTVEFURSBzdGF0ZSgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogXHJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkIGZhY3RvcnkKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIFNldCB0aGUgdGhyZWFkIGZhY3RvcnkuCisgICAqIFx0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuZXcgdGhyZWFkIGZhY3RvcnkgaGFzIGEgZGlmZmVyZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkIGRpc3Bvc2l0aW9uIHRoYW4gdGhlIG9uZSByZXBsYWNpbmcgaXQKKyAgICovCisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgPSAwOworCisgIC8qKgorICAgKiBBZGRzIHdvcmtlciB0aHJlYWQocykuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlcyB3b3JrZXIgdGhyZWFkKHMpLgorICAgKiBUaHJlYWRzIGFyZSBqb2luZWQgaWYgdGhlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIGFsbG93cyBpdC4KKyAgICogQmxvY2tzIHVudGlsIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgcmVhY2hlcyB0aGUgbmV3IGxpbWl0LgorICAgKiBccGFyYW1baW5dICB2YWx1ZSAgdGhlIG51bWJlciB0byByZW1vdmUKKyAgICogXHRocm93cyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHdvcmtlcnMKKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlID0gMSkgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBpZGxlIHdvcmtlciB0aHJlYWRzCisgICAqLworICB2aXJ0dWFsIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRvdGFsIHdvcmtlciB0aHJlYWRzCisgICAqLworICB2aXJ0dWFsIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyB0YXNrcworICAgKi8KKyAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyBhbmQgZXhlY3V0aW5nIHRhc2tzCisgICAqLworICB2aXJ0dWFsIHNpemVfdCB0b3RhbFRhc2tDb3VudCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgbWF4aW11bSBwZW5kaW5nIHRhc2sgY291bnQuICAwIGluZGljYXRlcyBubyBtYXhpbXVtCisgICAqLworICB2aXJ0dWFsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGFza3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGlyZWQgd2l0aG91dCBiZWluZyBydW4KKyAgICogc2luY2Ugc3RhcnQoKSB3YXMgY2FsbGVkLgorICAgKi8KKyAgdmlydHVhbCBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpID0gMDsKKworICAvKioKKyAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHBlbmRpbmdUYXNrQ291bnRNYXgoKSBpbiBub3QgemVybyBhbmQgcGVuZGluZ1Rhc2tDb3VudCgpCisgICAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHQgdG8gcGVuZGluZ1Rhc2tDb3VudE1heCgpLiAgSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZQorICAgKiBjb250ZXh0IG9mIGEgVGhyZWFkTWFuYWdlciB3b3JrZXIgdGhyZWFkIGl0IHdpbGwgdGhyb3cgYQorICAgKiBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uCisgICAqCisgICAqIEBwYXJhbSB0YXNrICBUaGUgdGFzayB0byBxdWV1ZSBmb3IgZXhlY3V0aW9uCisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMgdG8gYWRkIGEgdGFzayB3aGVuIGEgcGVuZGluZy10YXNrLWNvdW50CisgICAqIGlzIHNwZWNpZmllZC4gU3BlY2lmaWMgY2FzZXM6CisgICAqIHRpbWVvdXQgPSAwICA6IFdhaXQgZm9yZXZlciB0byBxdWV1ZSB0YXNrLgorICAgKiB0aW1lb3V0ID0gLTEgOiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgcGVuZGluZyB0YXNrIGNvdW50IGV4Y2VlZHMgc3BlY2lmaWVkIG1heAorICAgKiBAcGFyYW0gZXhwaXJhdGlvbiB3aGVuIG5vbnplcm8sIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSB0YXNrIGlzIHZhbGlkCisgICAqIHRvIGJlIHJ1bjsgaWYgZXhjZWVkZWQsIHRoZSB0YXNrIHdpbGwgYmUgZHJvcHBlZCBvZmYgdGhlIHF1ZXVlIGFuZCBub3QgcnVuLgorICAgKgorICAgKiBAdGhyb3dzIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24gUGVuZGluZyB0YXNrIGNvdW50IGV4Y2VlZHMgbWF4IHBlbmRpbmcgdGFzayBjb3VudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0ID0gMExMLAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbiA9IDBMTCkgPSAwOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOworCisgIC8qKgorICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KKyAgICoKKyAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCkgPSAwOworCisgIC8qKgorICAgKiBSZW1vdmUgdGFza3MgZnJvbSBmcm9udCBvZiB0YXNrIHF1ZXVlIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpID0gMDsKKworICAvKioKKyAgICogU2V0IGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB0YXNrIGlzIGV4cGlyZWQgYW5kIG5vdCBydW4uCisgICAqCisgICAqIEBwYXJhbSBleHBpcmVDYWxsYmFjayBhIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBmb3IKKyAgICogdGhlIGV4cGlyZWQgdGFzay4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgPSAwOworCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgc2ltcGxlIHRocmVhZCBtYW5hZ2VyIHRoZSB1c2VzIGNvdW50IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgaGFzCisgICAqIGEgcGVuZGluZ1Rhc2tDb3VudE1heCBtYXhpbXVtIHBlbmRpbmcgdGFza3MuIFRoZSBkZWZhdWx0LCAwLCBzcGVjaWZpZWQgbm8gbGltaXQKKyAgICogb24gcGVuZGluZyB0YXNrcworICAgKi8KKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCk7CisKKyAgY2xhc3MgVGFzazsKKworICBjbGFzcyBXb3JrZXI7CisKKyAgY2xhc3MgSW1wbDsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMzRmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OndlYWtfcHRyOworCisvKioKKyAqIFRpbWVyTWFuYWdlciBjbGFzcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRpbWVyTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgQ0FOQ0VMTEVELCBDT01QTEVURSB9OworCisgIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDogcnVubmFibGVfKHJ1bm5hYmxlKSwgc3RhdGVfKFdBSVRJTkcpIHt9CisKKyAgflRhc2soKSB7fQorCisgIHZvaWQgcnVuKCkgeworICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7CisgICAgICBydW5uYWJsZV8tPnJ1bigpOworICAgICAgc3RhdGVfID0gQ09NUExFVEU7CisgICAgfQorICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9wdHI8UnVubmFibGU+ICYgcnVubmFibGUpIGNvbnN0IHsgcmV0dXJuIHJ1bm5hYmxlXyA9PSBydW5uYWJsZTsgfQorCisgIHRhc2tfaXRlcmF0b3IgaXRfOworCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CisgIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7CisgIFNUQVRFIHN0YXRlXzsKK307CisKK2NsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlciA6IHB1YmxpYyBSdW5uYWJsZSB7CisKK3B1YmxpYzoKKyAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlcikge30KKworICB+RGlzcGF0Y2hlcigpIHt9CisKKyAgLyoqCisgICAqIERpc3BhdGNoZXIgZW50cnkgcG9pbnQKKyAgICoKKyAgICogQXMgbG9uZyBhcyBkaXNwYXRjaGVyIHRocmVhZCBpcyBydW5uaW5nLCBwdWxsIHRhc2tzIG9mZiB0aGUgdGFzayB0YXNrTWFwXworICAgKiBhbmQgZXhlY3V0ZS4KKyAgICovCisgIHZvaWQgcnVuKCkgeworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7CisgICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7CisgICAgICAgIG1hbmFnZXJfLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7CisgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBkbyB7CisgICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPiBleHBpcmVkVGFza3M7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7CisgICAgICAgIHRhc2tfaXRlcmF0b3IgZXhwaXJlZFRhc2tFbmQ7CisgICAgICAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgICAgd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVECisgICAgICAgICAgICAgICAmJiAoZXhwaXJlZFRhc2tFbmQgPSBtYW5hZ2VyXy0+dGFza01hcF8udXBwZXJfYm91bmQobm93KSkKKyAgICAgICAgICAgICAgICAgID09IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpKSB7CisgICAgICAgICAgaW50NjRfdCB0aW1lb3V0ID0gMExMOworICAgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tNYXBfLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHRpbWVvdXQgPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKS0+Zmlyc3QgLSBub3c7CisgICAgICAgICAgfQorICAgICAgICAgIGFzc2VydCgodGltZW91dCAhPSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID4gMCkKKyAgICAgICAgICAgICAgICAgfHwgKHRpbWVvdXQgPT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA9PSAwKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgICAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgICAgIH0KKyAgICAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICAgICAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrRW5kOyBpeCsrKSB7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gdGFzayA9IGl4LT5zZWNvbmQ7CisgICAgICAgICAgICBleHBpcmVkVGFza3MuaW5zZXJ0KHRhc2spOworICAgICAgICAgICAgdGFzay0+aXRfID0gbWFuYWdlcl8tPnRhc2tNYXBfLmVuZCgpOworICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKKyAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYW5hZ2VyXy0+dGFza0NvdW50Xy0tOworICAgICAgICAgIH0KKyAgICAgICAgICBtYW5hZ2VyXy0+dGFza01hcF8uZXJhc2UobWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCksIGV4cGlyZWRUYXNrRW5kKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSBleHBpcmVkVGFza3MuYmVnaW4oKTsKKyAgICAgICAgICAgaXggIT0gZXhwaXJlZFRhc2tzLmVuZCgpOworICAgICAgICAgICArK2l4KSB7CisgICAgICAgICgqaXgpLT5ydW4oKTsKKyAgICAgIH0KKworICAgIH0gd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7CisgICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUT1BQSU5HKSB7CisgICAgICAgIG1hbmFnZXJfLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7CisgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKK3ByaXZhdGU6CisgIFRpbWVyTWFuYWdlciogbWFuYWdlcl87CisgIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI7Cit9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MzU1KSAvLyAndGhpcycgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CisjZW5kaWYKKworVGltZXJNYW5hZ2VyOjpUaW1lck1hbmFnZXIoKQorICA6IHRhc2tDb3VudF8oMCksCisgICAgc3RhdGVfKFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCisgICAgZGlzcGF0Y2hlcl8oc2hhcmVkX3B0cjxEaXNwYXRjaGVyPihuZXcgRGlzcGF0Y2hlcih0aGlzKSkpIHsKK30KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKK1RpbWVyTWFuYWdlcjo6flRpbWVyTWFuYWdlcigpIHsKKworICAvLyBJZiB3ZSBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBzdG9wcGVkLCBkbyBzbyBub3cuICBXZSBkb24ndCBuZWVkIHRvIGdyYWIKKyAgLy8gdGhlIG1vbml0b3IgaGVyZSwgc2luY2Ugc3RvcCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgcmVlbnRyYW5jeS4KKworICBpZiAoc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICB0cnkgeworICAgICAgc3RvcCgpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgorICAgIH0KKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6c3RhcnQoKSB7CisgIGJvb2wgZG9TdGFydCA9IGZhbHNlOworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIGlmICghdGhyZWFkRmFjdG9yeV8pIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKyAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgeworICAgICAgc3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVElORzsKKyAgICAgIGRvU3RhcnQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChkb1N0YXJ0KSB7CisgICAgZGlzcGF0Y2hlclRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKGRpc3BhdGNoZXJfKTsKKyAgICBkaXNwYXRjaGVyVGhyZWFkXy0+c3RhcnQoKTsKKyAgfQorCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgd2hpbGUgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7CisgICAgICBtb25pdG9yXy53YWl0KCk7CisgICAgfQorICAgIGFzc2VydChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORyk7CisgIH0KK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnN0b3AoKSB7CisgIGJvb2wgZG9TdG9wID0gZmFsc2U7CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXRlXyAhPSBTVE9QUElORyAmJiBzdGF0ZV8gIT0gU1RPUFBFRCkgeworICAgICAgZG9TdG9wID0gdHJ1ZTsKKyAgICAgIHN0YXRlXyA9IFNUT1BQSU5HOworICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgICAgfQorICAgIHdoaWxlIChzdGF0ZV8gIT0gU1RPUFBFRCkgeworICAgICAgbW9uaXRvcl8ud2FpdCgpOworICAgIH0KKyAgfQorCisgIGlmIChkb1N0b3ApIHsKKyAgICAvLyBDbGVhbiB1cCBhbnkgb3V0c3RhbmRpbmcgdGFza3MKKyAgICB0YXNrTWFwXy5jbGVhcigpOworCisgICAgLy8gUmVtb3ZlIGRpc3BhdGNoZXIncyByZWZlcmVuY2UgdG8gdXMuCisgICAgZGlzcGF0Y2hlcl8tPm1hbmFnZXJfID0gTlVMTDsKKyAgfQorfQorCitzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeSgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICByZXR1cm4gdGhyZWFkRmFjdG9yeV87Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjp0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOworfQorCitzaXplX3QgVGltZXJNYW5hZ2VyOjp0YXNrQ291bnQoKSBjb25zdCB7CisgIHJldHVybiB0YXNrQ291bnRfOworfQorCitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCkgeworICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgIHRpbWVvdXQgKz0gbm93OworCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vIElmIHRoZSB0YXNrIG1hcCBpcyBlbXB0eSwgd2Ugd2lsbCBraWNrIHRoZSBkaXNwYXRjaGVyIGZvciBzdXJlLiBPdGhlcndpc2UsIHdlIGtpY2sgaGltCisgICAgLy8gaWYgdGhlIGV4cGlyYXRpb24gdGltZSBpcyBzaG9ydGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUuIE5lZWQgdG8gdGVzdCBiZWZvcmUgd2UgaW5zZXJ0LAorICAgIC8vIGJlY2F1c2UgdGhlIG5ldyB0YXNrIG1pZ2h0IGluc2VydCBhdCB0aGUgZnJvbnQuCisgICAgYm9vbCBub3RpZnlSZXF1aXJlZCA9ICh0YXNrQ291bnRfID09IDApID8gdHJ1ZSA6IHRpbWVvdXQgPCB0YXNrTWFwXy5iZWdpbigpLT5maXJzdDsKKworICAgIHNoYXJlZF9wdHI8VGFzaz4gdGltZXIobmV3IFRhc2sodGFzaykpOworICAgIHRhc2tDb3VudF8rKzsKKyAgICB0aW1lci0+aXRfID0gdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgdGltZXIpKTsKKworICAgIC8vIElmIHRoZSB0YXNrIG1hcCB3YXMgZW1wdHksIG9yIGlmIHdlIGhhdmUgYW4gZXhwaXJhdGlvbiB0aGF0IGlzIGVhcmxpZXIKKyAgICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKKyAgICAvLyB0aW1lb3V0CisgICAgaWYgKG5vdGlmeVJlcXVpcmVkKSB7CisgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGltZXI7CisgIH0KK30KKworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CisKKyAgaW50NjRfdCBleHBpcmF0aW9uOworICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CisKKyAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgIGlmIChleHBpcmF0aW9uIDwgbm93KSB7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgIH0KKworICByZXR1cm4gYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOworfQorCitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisKKyAgaW50NjRfdCBleHBpcmF0aW9uOworICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CisKKyAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgIGlmIChleHBpcmF0aW9uIDwgbm93KSB7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgIH0KKworICByZXR1cm4gYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOworfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gdGFza01hcF8uYmVnaW4oKTsgaXggIT0gdGFza01hcF8uZW5kKCk7KSB7CisgICAgaWYgKCppeC0+c2Vjb25kID09IHRhc2spIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIHRhc2tDb3VudF8tLTsKKyAgICAgIHRhc2tNYXBfLmVyYXNlKGl4KyspOworICAgIH0gZWxzZSB7CisgICAgICArK2l4OworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjpyZW1vdmUoVGltZXIgaGFuZGxlKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VGFzaz4gdGFzayA9IGhhbmRsZS5sb2NrKCk7CisgIGlmICghdGFzaykgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorCisgIGlmICh0YXNrLT5pdF8gPT0gdGFza01hcF8uZW5kKCkpIHsKKyAgICAvLyBUYXNrIGlzIGJlaW5nIGV4ZWN1dGVkCisgICAgdGhyb3cgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24oKTsKKyAgfQorCisgIHRhc2tNYXBfLmVyYXNlKHRhc2stPml0Xyk7CisgIHRhc2tDb3VudF8tLTsKK30KKworVGltZXJNYW5hZ2VyOjpTVEFURSBUaW1lck1hbmFnZXI6OnN0YXRlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGVfOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc5MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIFRpbWVyIE1hbmFnZXIKKyAqCisgKiBUaGlzIGNsYXNzIGRpc3BhdGNoZXMgdGltZXIgdGFza3Mgd2hlbiB0aGV5IGZhbGwgZHVlLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRpbWVyTWFuYWdlciB7CisKK3B1YmxpYzoKKyAgY2xhc3MgVGFzazsKKyAgdHlwZWRlZiBzdGQ6OndlYWtfcHRyPFRhc2s+IFRpbWVyOworCisgIFRpbWVyTWFuYWdlcigpOworCisgIHZpcnR1YWwgflRpbWVyTWFuYWdlcigpOworCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdmFsdWUpOworCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHRpbWVyIG1hbmFnZXIgc2VydmljZQorICAgKgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBNaXNzaW5nIHRocmVhZCBmYWN0b3J5IGF0dHJpYnV0ZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CisKKyAgLyoqCisgICAqIFN0b3BzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisKKyAgdmlydHVhbCBzaXplX3QgdGFza0NvdW50KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQorICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHRhc2sKKyAgICogQHJldHVybiBIYW5kbGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIHRpbWVyLgorICAgKi8KKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpOworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICogQHBhcmFtIHRpbWVvdXQgQWJzb2x1dGUgdGltZSBpbiB0aGUgZnV0dXJlIHRvIGV4ZWN1dGUgdGFzay4KKyAgICogQHJldHVybiBIYW5kbGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIHRpbWVyLgorICAgKi8KKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKKworICAvKioKKyAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgorICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCisgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KKyAgICovCisgIHZpcnR1YWwgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHRpbWVvdXQpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIHJlbW92ZS4gQWxsIHRpbWVycyB3aGljaCBleGVjdXRlIHRoaXMgdGFzayB3aWxsCisgICAqIGJlIHJlbW92ZWQuCisgICAqIEB0aHJvd3MgTm9TdWNoVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBkb2Vzbid0IGV4aXN0LiBJdCB3YXMgZWl0aGVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYWxyZWFkeSBvciB0aGlzIGNhbGwgd2FzIG1hZGUgZm9yIGEKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhpcyB0aW1lcgorICAgKgorICAgKiBAdGhyb3dzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGlzIGFscmVhZHkgYmVpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBvciBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHNpbmdsZSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRpbWVyIFRoZSB0aW1lciB0byByZW1vdmUuIFRoZSB0aW1lciBpcyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgdGhlCisgICAqIGFkZCgpIG1ldGhvZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShUaW1lciB0aW1lcik7CisKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OworCisgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOworICBmcmllbmQgY2xhc3MgVGFzazsKKyAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKKyAgc2l6ZV90IHRhc2tDb3VudF87CisgIE1vbml0b3IgbW9uaXRvcl87CisgIFNUQVRFIHN0YXRlXzsKKyAgY2xhc3MgRGlzcGF0Y2hlcjsKKyAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxEaXNwYXRjaGVyPiBkaXNwYXRjaGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87CisgIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cGFpcjx0YXNrX2l0ZXJhdG9yLCB0YXNrX2l0ZXJhdG9yPiB0YXNrX3JhbmdlOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2ZDE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCitpbnQ2NF90IFV0aWw6OmN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYykgeworICBpbnQ2NF90IHJlc3VsdDsKKyAgc3RydWN0IHRpbWV2YWwgbm93OworICBpbnQgcmV0ID0gVEhSSUZUX0dFVFRJTUVPRkRBWSgmbm93LCBOVUxMKTsKKyAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOyAvLyBzcXVlbGNoaW5nICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmcKKyAgdG9UaWNrcyhyZXN1bHQsIG5vdywgdGlja3NQZXJTZWMpOworICByZXR1cm4gcmVzdWx0OworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTE1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXyAxCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcworICoKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgYmFzaWMgdXRpbGl0eSBtZXRob2RzIGZvciBjb252ZXJ0aW5nIHRpbWUgZm9ybWF0cywKKyAqIGFuZCBvdGhlciBjb21tb24gcGxhdGZvcm0tZGVwZW5kZW50IGNvbmN1cnJlbmN5IG9wZXJhdGlvbnMuCisgKiBJdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIEFQSSBoZWFkZXJzIGZvciBvdGhlciBjb25jdXJyZW5jeSBsaWJyYXJ5CisgKiBoZWFkZXJzLCBzaW5jZSBpdCB3aWxsLCBieSBkZWZpbml0aW9uLCBwdWxsIGluIGFsbCBzb3J0cyBvZiBob3JyaWQKKyAqIHBsYXRmb3JtIGRlcGVuZGVudCBzdHVmZi4gIFJhdGhlciBpdCBzaG91bGQgYmUgaW5sdWRlZCBkaXJlY3RseSBpbgorICogY29uY3VycmVuY3kgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzb3VyY2UuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVXRpbCB7CisKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX1MgPSAxMDAwMDAwMDAwTEw7CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9TID0gMTAwMDAwMExMOworICBzdGF0aWMgY29uc3QgaW50NjRfdCBNU19QRVJfUyA9IDEwMDBMTDsKKworICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfTVMgPSBOU19QRVJfUyAvIE1TX1BFUl9TOworICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfVVMgPSBOU19QRVJfUyAvIFVTX1BFUl9TOworICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfTVMgPSBVU19QRVJfUyAvIE1TX1BFUl9TOworCitwdWJsaWM6CisgIC8qKgorICAgKiBDb252ZXJ0cyBtaWxsaXNlY29uZCB0aW1lc3RhbXAgaW50byBhIFRIUklGVF9USU1FU1BFQyBzdHJ1Y3QKKyAgICoKKyAgICogQHBhcmFtIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHJlc3VsdAorICAgKiBAcGFyYW0gdGltZSBvciBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVGltZXNwZWMoc3RydWN0IFRIUklGVF9USU1FU1BFQyYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7CisgICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7ICAgICAgICAgICAgICAgIC8vIG1zIHRvIHMKKyAgICByZXN1bHQudHZfbnNlYyA9ICh2YWx1ZSAlIE1TX1BFUl9TKSAqIE5TX1BFUl9NUzsgLy8gbXMgdG8gbnMKKyAgfQorCisgIHN0YXRpYyB2b2lkIHRvVGltZXZhbChzdHJ1Y3QgdGltZXZhbCYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7CisgICAgcmVzdWx0LnR2X3NlYyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAvIE1TX1BFUl9TKTsgICAgICAgICAgICAgICAgLy8gbXMgdG8gcworICAgIHJlc3VsdC50dl91c2VjID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCh2YWx1ZSAlIE1TX1BFUl9TKSAqIFVTX1BFUl9NUyk7IC8vIG1zIHRvIHVzCisgIH0KKworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNlY3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzUGVyU2VjLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbmV3VGlja3NQZXJTZWMpIHsKKyAgICByZXN1bHQgPSBzZWNzICogbmV3VGlja3NQZXJTZWM7CisgICAgcmVzdWx0ICs9IG9sZFRpY2tzICogbmV3VGlja3NQZXJTZWMgLyBvbGRUaWNrc1BlclNlYzsKKworICAgIGludDY0X3Qgb2xkUGVyTmV3ID0gb2xkVGlja3NQZXJTZWMgLyBuZXdUaWNrc1BlclNlYzsKKyAgICBpZiAob2xkUGVyTmV3ICYmICgob2xkVGlja3MgJSBvbGRQZXJOZXcpID49IChvbGRQZXJOZXcgLyAyKSkpIHsKKyAgICAgICsrcmVzdWx0OworICAgIH0KKyAgfQorICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSwgaW50NjRfdCB0aWNrc1BlclNlYykgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUudHZfc2VjLCB2YWx1ZS50dl9uc2VjLCBOU19QRVJfUywgdGlja3NQZXJTZWMpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIGFyYml0cmFyeS1zaXplZCB0aWNrcyBzaW5jZSBlcG9jaAorICAgKi8KKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSwgaW50NjRfdCB0aWNrc1BlclNlYykgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcpdmFsdWUudHZfc2VjLCAodW5zaWduZWQgbG9uZyl2YWx1ZS50dl91c2VjLCBVU19QRVJfUywgdGlja3NQZXJTZWMpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gbWlsbGlzZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pbGxpc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBtaWNyb3NlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pY3Jvc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOworICB9CisKKyAgLyoqCisgICAqIEdldCBjdXJyZW50IHRpbWUgYXMgYSBudW1iZXIgb2YgYXJiaXRyYXJ5LXNpemUgdGlja3MgZnJvbSBlcG9jaAorICAgKi8KKyAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVUaWNrcyhpbnQ2NF90IHRpY2tzUGVyU2VjKTsKKworICAvKioKKyAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWxsaXNlY29uZHMgZnJvbSBlcG9jaAorICAgKi8KKyAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWUoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKE1TX1BFUl9TKTsgfQorCisgIC8qKgorICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIG1pY3JvcyBmcm9tIGVwb2NoCisgICAqLworICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZVVzZWMoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKFVTX1BFUl9TKTsgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvY2Vzc29yIHsKKworUGVla1Byb2Nlc3Nvcjo6UGVla1Byb2Nlc3NvcigpIHsKKyAgbWVtb3J5QnVmZmVyXy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgdGFyZ2V0VHJhbnNwb3J0XyA9IG1lbW9yeUJ1ZmZlcl87Cit9CitQZWVrUHJvY2Vzc29yOjp+UGVla1Byb2Nlc3NvcigpIHsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgeworICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOworICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7CisgIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKKyAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBQZWVrUHJvY2Vzc29yOjpnZXRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW4pIHsKKyAgcmV0dXJuIHRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoaW4pOworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7CisgIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7CisgIGlmIChzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmIChzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKKyAgICBtZW1vcnlCdWZmZXJfID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPigKKyAgICAgICAgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7CisgIH0KKworICBpZiAoIW1lbW9yeUJ1ZmZlcl8pIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAiVGFyZ2V0IHRyYW5zcG9ydCBtdXN0IGJlIGEgVE1lbW9yeUJ1ZmZlciBvciBhIFRQaXBlZFRyYW5zcG9ydCB3aXRoIFRNZW1vcnlCdWZmZXIiKTsKKyAgfQorfQorCitib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisKKyAgc3RkOjpzdHJpbmcgZm5hbWU7CisgIFRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgaW50MzJfdCBzZXFpZDsKKyAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgaWYgKG10eXBlICE9IFRfQ0FMTCAmJiBtdHlwZSAhPSBUX09ORVdBWSkgeworICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CisgIH0KKworICAvLyBQZWVrIGF0IHRoZSBuYW1lCisgIHBlZWtOYW1lKGZuYW1lKTsKKworICBUVHlwZSBmdHlwZTsKKyAgaW50MTZfdCBmaWQ7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaW4tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKKyAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBQZWVrIGF0IHRoZSB2YXJpYWJsZQorICAgIHBlZWsoaW4sIGZ0eXBlLCBmaWQpOworICAgIGluLT5yZWFkRmllbGRFbmQoKTsKKyAgfQorICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7CisKKyAgLy8KKyAgLy8gQWxsIHRoZSBkYXRhIGlzIG5vdyBpbiBtZW1vcnlCdWZmZXJfIGFuZCByZWFkeSB0byBiZSBwcm9jZXNzZWQKKyAgLy8KKworICAvLyBMZXQncyBmaXJzdCB0YWtlIGEgcGVlayBhdCB0aGUgZnVsbCBkYXRhIGluIG1lbW9yeQorICB1aW50OF90KiBidWZmZXI7CisgIHVpbnQzMl90IHNpemU7CisgIG1lbW9yeUJ1ZmZlcl8tPmdldEJ1ZmZlcigmYnVmZmVyLCAmc2l6ZSk7CisgIHBlZWtCdWZmZXIoYnVmZmVyLCBzaXplKTsKKworICAvLyBEb25lIHBlZWtpbmcgYXQgdmFyaWFibGVzCisgIHBlZWtFbmQoKTsKKworICBib29sIHJldCA9IGFjdHVhbFByb2Nlc3Nvcl8tPnByb2Nlc3MocGlwZWRQcm90b2NvbF8sIG91dCwgY29ubmVjdGlvbkNvbnRleHQpOworICBtZW1vcnlCdWZmZXJfLT5yZXNldEJ1ZmZlcigpOworICByZXR1cm4gcmV0OworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSkgeworICAodm9pZClmbmFtZTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkgeworICAodm9pZClidWZmZXI7CisgICh2b2lkKXNpemU7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVlayhzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwgVFR5cGUgZnR5cGUsIGludDE2X3QgZmlkKSB7CisgICh2b2lkKWZpZDsKKyAgaW4tPnNraXAoZnR5cGUpOworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtFbmQoKSB7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWMyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUEVFS1BST0NFU1NPUl9ICisjZGVmaW5lIFBFRUtQUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CisKKy8qCisgKiBDbGFzcyBmb3IgcGVla2luZyBhdCB0aGUgcmF3IGRhdGEgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzb3IKKyAqIGFuZCBnaXZlcyB0aGUgZGVyaXZlZCBjbGFzcyBhIGNoYW5jZSB0byBjaGFuZ2UgYmVoYXZpb3IgYWNjb3JkaW5nbHkKKyAqCisgKi8KK2NsYXNzIFBlZWtQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgeworCitwdWJsaWM6CisgIFBlZWtQcm9jZXNzb3IoKTsKKyAgdmlydHVhbCB+UGVla1Byb2Nlc3NvcigpOworCisgIC8vIElucHV0IGhlcmU6IGFjdHVhbFByb2Nlc3NvciAgLSB0aGUgdW5kZXJseWluZyBwcm9jZXNzb3IKKyAgLy8gICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5ICAtIHRoZSBwcm90b2NvbCBmYWN0b3J5IHVzZWQgdG8gd3JhcCB0aGUgbWVtb3J5IGJ1ZmZlcgorICAvLyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IC0gdGhpcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IGlzIHVzZWQgdG8gd3JhcCB0aGUgc291cmNlIHRyYW5zcG9ydAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGEgY2FsbCB0byBnZXRQaXBlZFRyYW5zcG9ydAorICB2b2lkIGluaXRpYWxpemUoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KTsKKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gZ2V0UGlwZWRUcmFuc3BvcnQoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gaW4pOworCisgIHZvaWQgc2V0VGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOworCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgY2FuIGJlIG92ZXJsb2FkZWQgYnkgY2hpbGQgY2xhc3NlcyB0bworICAvLyBhY2hpZXZlIGRlc2lyZWQgcGVla2luZyBiZWhhdmlvcgorICB2aXJ0dWFsIHZvaWQgcGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKTsKKyAgdmlydHVhbCB2b2lkIHBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKTsKKyAgdmlydHVhbCB2b2lkIHBlZWsoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOworICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwZWRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThlZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBVFNQUk9DRVNTT1JfSAorI2RlZmluZSBTVEFUU1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgeworCisvKgorICogQ2xhc3MgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZnVuY3Rpb24gY2FsbCBzdGF0aXN0aWNzIGFuZCBwcmludGluZyB0aGVtIGlmIGRlc2lyZWQKKyAqCisgKi8KK2NsYXNzIFN0YXRzUHJvY2Vzc29yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgU3RhdHNQcm9jZXNzb3IoYm9vbCBwcmludCwgYm9vbCBmcmVxdWVuY3kpIDogcHJpbnRfKHByaW50KSwgZnJlcXVlbmN5XyhmcmVxdWVuY3kpIHt9CisgIHZpcnR1YWwgflN0YXRzUHJvY2Vzc29yKCl7fTsKKworICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKKworICAgIHBpcHJvdF8gPSBwaXByb3Q7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworCisgICAgcGlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKyAgICBpZiAobXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlVua25vd24gbWVzc2FnZSB0eXBlXG4iKTsKKyAgICAgIH0KKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOworICAgIH0KKyAgICBpZiAocHJpbnRfKSB7CisgICAgICBwcmludGYoIiVzICgiLCBmbmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKGZyZXF1ZW5jeV8pIHsKKyAgICAgIGlmIChmcmVxdWVuY3lfbWFwXy5maW5kKGZuYW1lKSAhPSBmcmVxdWVuY3lfbWFwXy5lbmQoKSkgeworICAgICAgICBmcmVxdWVuY3lfbWFwX1tmbmFtZV0rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZyZXF1ZW5jeV9tYXBfW2ZuYW1lXSA9IDE7CisgICAgICB9CisgICAgfQorCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKKyAgICBpbnQxNl90IGZpZDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBwaXByb3RfLT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmludF8pIHsKKyAgICAgIHByaW50ZigiXGJcYilcbiIpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiYgZ2V0X2ZyZXF1ZW5jeV9tYXAoKSB7IHJldHVybiBmcmVxdWVuY3lfbWFwXzsgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgcHJpbnRBbmRQYXNzVG9CdWZmZXIoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSkgeworICAgIHN3aXRjaCAoZnR5cGUpIHsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MOiB7CisgICAgICBib29sIGJvb2x2OworICAgICAgcGlwcm90Xy0+cmVhZEJvb2woYm9vbHYpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVkIiwgYm9vbHYpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURTogeworICAgICAgaW50OF90IGJ5dGV2OworICAgICAgcGlwcm90Xy0+cmVhZEJ5dGUoYnl0ZXYpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVkIiwgYnl0ZXYpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2OiB7CisgICAgICBpbnQxNl90IGkxNjsKKyAgICAgIHBpcHJvdF8tPnJlYWRJMTYoaTE2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGkxNik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzI6IHsKKyAgICAgIGludDMyX3QgaTMyOworICAgICAgcGlwcm90Xy0+cmVhZEkzMihpMzIpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVkIiwgaTMyKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NDogeworICAgICAgaW50NjRfdCBpNjQ7CisgICAgICBwaXByb3RfLT5yZWFkSTY0KGk2NCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWxkIiwgaTY0KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRTogeworICAgICAgZG91YmxlIGR1YjsKKyAgICAgIHBpcHJvdF8tPnJlYWREb3VibGUoZHViKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZiIsIGR1Yik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkc6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgIHBpcHJvdF8tPnJlYWRTdHJpbmcoc3RyKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlcyIsIHN0ci5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVDogeworICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgIGludDE2X3QgZmlkOworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCI8Iik7CisgICAgICB9CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmdHlwZSwgZmlkKTsKKyAgICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkU3RydWN0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGI+Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVA6IHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUga2V5VHlwZTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgdmFsVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigieyIpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihrZXlUeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiPT4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcih2YWxUeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkTWFwRW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJ9Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQ6IHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkU2V0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJ9Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOworICAgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRMaXN0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJdIik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4gZnJlcXVlbmN5X21hcF87CisKKyAgYm9vbCBwcmludF87CisgIGJvb2wgZnJlcXVlbmN5XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE3Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UTVVMVElQTEVYRURQUk9DRVNTT1JfSF8KKyNkZWZpbmUgVEhSSUZUX1RNVUxUSVBMRVhFRFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogIFRvIGJlIGFibGUgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbERlY29yYXRvciB7CitwdWJsaWM6CisgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCisgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgbmFtZShfbmFtZSksIHR5cGUoX3R5cGUpLCBzZXFpZChfc2VxaWQpIHt9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBfbmFtZSwgVE1lc3NhZ2VUeXBlJiBfdHlwZSwgaW50MzJfdCYgX3NlcWlkKSB7CisKKyAgICBfbmFtZSA9IG5hbWU7CisgICAgX3R5cGUgPSB0eXBlOworICAgIF9zZXFpZCA9IHNlcWlkOworCisgICAgcmV0dXJuIDA7IC8vIChOb3JtYWwgVFByb3RvY29sIHJlYWQgZnVuY3Rpb25zIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCkKKyAgfQorCisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIFRNZXNzYWdlVHlwZSB0eXBlOworICBpbnQzMl90IHNlcWlkOworfTsKK30gLy8gbmFtZXNwYWNlIHByb3RvY29sCisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIDxjb2RlPlRQcm9jZXNzb3I8L2NvZGU+IGFsbG93aW5nCisgKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICoKKyAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCisgKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+CisgKgorICogPGJsb2NrcXVvdGU+PGNvZGU+CisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4oIG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRIYW5kbGVyPiggbmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKSkpOworICoKKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gPiBzZXJ2aWNlc190OworCisgIC8qKgorICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCisgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICoKKyAgICAqIFxwYXJhbSBbaW5dIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIsCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydElmIGludGVyZmFjZS4KKyAgICAqLworICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlTmFtZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgeworICAgIHNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHByb2Nlc3NvcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UuCisgICAqLworICB2b2lkIHJlZ2lzdGVyRGVmYXVsdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikgeworICAgIGRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogQ2hldyB1cCBpbnZhbGlkIGlucHV0IGFuZCByZXR1cm4gYW4gZXhjZXB0aW9uIHRvIHRocm93LgorICAgKi8KKyAgVEV4Y2VwdGlvbiBwcm90b2NvbF9lcnJvcihzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgY29uc3QgeworICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7CisgICAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7CisgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsCisgICAgICAgICJUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6ICIgKyBtc2cpOworICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7CisgICAgeC53cml0ZShvdXQuZ2V0KCkpOworICAgIG91dC0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworICAgIHJldHVybiBURXhjZXB0aW9uKG1zZyk7Cit9CisgICAKKyAgLyoqCisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICoKKyAgICogPG9sPgorICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgorICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KKyAgICogPC9vbD4KKyAgICoKKyAgICogXHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IFRfQ0FMTCBvciBUX09ORVdBWSwgaWYKKyAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgKi8KKyAgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSB0eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisKKyAgICAvLyBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAvLyBtZXNzYWdlIGhlYWRlci4gIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgLy8gZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpOworCisgICAgaWYgKHR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiB0eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgLy8gVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUuCisgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2sobmFtZSwgYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+KCI6IikpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzdGQ6OmNvcHkodG9rLmJlZ2luKCksIHRvay5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHRva2VucykpOworCisgICAgLy8gQSB2YWxpZCBtZXNzYWdlIHNob3VsZCBjb25zaXN0IG9mIHR3byB0b2tlbnM6IHRoZSBzZXJ2aWNlCisgICAgLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLgorICAgIGlmICh0b2tlbnMuc2l6ZSgpID09IDIpIHsKKyAgICAgIC8vIFNlYXJjaCBmb3IgYSBwcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBuYW1lLgorICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7CisKKyAgICAgIGlmIChpdCAhPSBzZXJ2aWNlcy5lbmQoKSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gaXQtPnNlY29uZDsKKyAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1sxXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVW5rbm93biBzZXJ2aWNlLgorICAgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgCisgICAgICAgICAgICAiVW5rbm93biBzZXJ2aWNlOiAiICsgdG9rZW5zWzBdICsKKwkJCQkiLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbnMuc2l6ZSgpID09IDEpIHsKKwkgIGlmIChkZWZhdWx0UHJvY2Vzc29yKSB7CisgICAgICAgIC8vIG5vbi1tdWx0aXBsZXhlZCBjbGllbnQgZm9yd2FyZHMgdG8gZGVmYXVsdCBwcm9jZXNzb3IKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3IgICAgICAgICAgICAKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMF0sIHR5cGUsIHNlcWlkKSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKKwkgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkJIk5vbi1tdWx0aXBsZXhlZCBjbGllbnQgcmVxdWVzdCBkcm9wcGVkLiAiCisJCQkiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBkZWZhdWx0UHJvY2Vzc29yKCk/Iik7CisJICB9CisgICAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCSAgICAiV3JvbmcgbnVtYmVyIG9mIHRva2Vucy4iKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLyoqIE1hcCBvZiBzZXJ2aWNlIHByb2Nlc3NvciBvYmplY3RzLCBpbmRleGVkIGJ5IHNlcnZpY2UgbmFtZXMuICovCisgIHNlcnZpY2VzX3Qgc2VydmljZXM7CisgIAorICAvLyEgSWYgYSBub24tbXVsdGkgY2xpZW50IHJlcXVlc3RzIHNvbWV0aGluZywgaXQgZ29lcyB0byB0aGUKKyAgLy8hIGRlZmF1bHQgcHJvY2Vzc29yIChpZiBvbmUgaXMgZGVmaW5lZCkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZGVmYXVsdFByb2Nlc3NvcjsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzRmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBrQmFzZTY0RW5jb2RlVGFibGUKKyAgICA9IChjb25zdCB1aW50OF90KikiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKK3ZvaWQgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90KiBpbiwgdWludDMyX3QgbGVuLCB1aW50OF90KiBidWYpIHsKKyAgYnVmWzBdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA+PiAyKSAmIDB4M2ZdOworICBpZiAobGVuID09IDMpIHsKKyAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSAmIDB4MzApIHwgKChpblsxXSA+PiA0KSAmIDB4MGYpXTsKKyAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblsxXSA8PCAyKSAmIDB4M2MpIHwgKChpblsyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICBidWZbM10gPSBrQmFzZTY0RW5jb2RlVGFibGVbaW5bMl0gJiAweDNmXTsKKyAgfSBlbHNlIGlmIChsZW4gPT0gMikgeworICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICYgMHgzMCkgfCAoKGluWzFdID4+IDQpICYgMHgwZildOworICAgIGJ1ZlsyXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMV0gPDwgMikgJiAweDNjXTsKKyAgfSBlbHNlIHsgLy8gbGVuID09IDEKKyAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdIDw8IDQpICYgMHgzMF07CisgIH0KK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0Jhc2U2NERlY29kZVRhYmxlWzI1Nl0gPSB7CisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDNlLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4M2YsCisgICAgMHgzNCwKKyAgICAweDM1LAorICAgIDB4MzYsCisgICAgMHgzNywKKyAgICAweDM4LAorICAgIDB4MzksCisgICAgMHgzYSwKKyAgICAweDNiLAorICAgIDB4M2MsCisgICAgMHgzZCwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4MDAsCisgICAgMHgwMSwKKyAgICAweDAyLAorICAgIDB4MDMsCisgICAgMHgwNCwKKyAgICAweDA1LAorICAgIDB4MDYsCisgICAgMHgwNywKKyAgICAweDA4LAorICAgIDB4MDksCisgICAgMHgwYSwKKyAgICAweDBiLAorICAgIDB4MGMsCisgICAgMHgwZCwKKyAgICAweDBlLAorICAgIDB4MGYsCisgICAgMHgxMCwKKyAgICAweDExLAorICAgIDB4MTIsCisgICAgMHgxMywKKyAgICAweDE0LAorICAgIDB4MTUsCisgICAgMHgxNiwKKyAgICAweDE3LAorICAgIDB4MTgsCisgICAgMHgxOSwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDFhLAorICAgIDB4MWIsCisgICAgMHgxYywKKyAgICAweDFkLAorICAgIDB4MWUsCisgICAgMHgxZiwKKyAgICAweDIwLAorICAgIDB4MjEsCisgICAgMHgyMiwKKyAgICAweDIzLAorICAgIDB4MjQsCisgICAgMHgyNSwKKyAgICAweDI2LAorICAgIDB4MjcsCisgICAgMHgyOCwKKyAgICAweDI5LAorICAgIDB4MmEsCisgICAgMHgyYiwKKyAgICAweDJjLAorICAgIDB4MmQsCisgICAgMHgyZSwKKyAgICAweDJmLAorICAgIDB4MzAsCisgICAgMHgzMSwKKyAgICAweDMyLAorICAgIDB4MzMsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKK307CisKK3ZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBidWZbMF0gPSAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlswXV0gPDwgMikgfCAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPj4gNCk7CisgIGlmIChsZW4gPiAyKSB7CisgICAgYnVmWzFdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA8PCA0KSAmIDB4ZjApIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dID4+IDIpOworICAgIGlmIChsZW4gPiAzKSB7CisgICAgICBidWZbMl0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dIDw8IDYpICYgMHhjMCkgfCAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlszXV0pOworICAgIH0KKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE2NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLy8gaW4gbXVzdCBiZSBhdCBsZWFzdCBsZW4gYnl0ZXMKKy8vIGxlbiBtdXN0IGJlIDEsIDIsIG9yIDMKKy8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIG1heSBub3Qgb3ZlcmxhcCBpbgorLy8gdGhlIGRhdGEgaXMgbm90IHBhZGRlZCB3aXRoICc9JzsgdGhlIGNhbGxlciBjYW4gZG8gdGhpcyBpZiBkZXNpcmVkCit2b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCogaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCogYnVmKTsKKworLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgY29udGFpbiBiYXNlNjQgZW5jb2RlZCB2YWx1ZXMKKy8vIGJ1ZiB3aWxsIGJlIGNoYW5nZWQgdG8gY29udGFpbiBvdXRwdXQgYnl0ZXMKKy8vIGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZSBmcm9tIGlucHV0IChtdXN0IGJlIDIsIDMsIG9yIDQpCisvLyBubyAnPScgcGFkZGluZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGlucHV0Cit2b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY3NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqIFRoZSBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbCBmb3IgdGhyaWZ0LiBXcml0ZXMgYWxsIGRhdGEgaW4gYSB2ZXJ5IGJhc2ljCisgKiBiaW5hcnkgZm9ybWF0LCBlc3NlbnRpYWxseSBqdXN0IHNwaXR0aW5nIG91dCB0aGUgcmF3IGJ5dGVzLgorICoKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8gPSBUTmV0d29ya0JpZ0VuZGlhbj4KK2NsYXNzIFRCaW5hcnlQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAoKGludDMyX3QpMHhmZmZmMDAwMCk7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fMSA9ICgoaW50MzJfdCkweDgwMDEwMDAwKTsKKyAgLy8gVkVSU0lPTl8yICgweDgwMDIwMDAwKSB3YXMgdGFrZW4gYnkgVERlbnNlUHJvdG9jb2wgKHdoaWNoIGhhcyBzaW5jZSBiZWVuIHJlbW92ZWQpCisKKyAgVEJpbmFyeVByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCisgICAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAorICAgICAgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQorCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAorICAgICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKKyAgICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSB7fQorCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKKyAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKKyAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOworICB9CisKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKKworICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+CisgIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBTdHJUeXBlJiBzdHIpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKKworICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPjo6cmVhZEJvb2w7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgorICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cmluZyhTdHJUeXBlJiBzdHIpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOworCitwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgorICB1aW50MzJfdCByZWFkU3RyaW5nQm9keShTdHJUeXBlJiBzdHIsIGludDMyX3Qgc3opOworCisgIFRyYW5zcG9ydF8qIHRyYW5zXzsKKworICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKKworICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgorICBib29sIHN0cmljdF9yZWFkXzsKKyAgYm9vbCBzdHJpY3Rfd3JpdGVfOworfTsKKwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IFRCaW5hcnlQcm90b2NvbDsKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0LCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gVExFQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogQ29uc3RydWN0cyBiaW5hcnkgcHJvdG9jb2wgaGFuZGxlcnMKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8gPSBUTmV0d29ya0JpZ0VuZGlhbj4KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUIDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpCisgICAgOiBzdHJpbmdfbGltaXRfKDApLCBjb250YWluZXJfbGltaXRfKDApLCBzdHJpY3RfcmVhZF8oZmFsc2UpLCBzdHJpY3Rfd3JpdGVfKHRydWUpIHt9CisKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF93cml0ZSkKKyAgICA6IHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKKyAgICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCisgICAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KKworICB2aXJ0dWFsIH5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpIHt9CisKKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQorCisgIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7IGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7IH0KKworICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgeworICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOworICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgICBUUHJvdG9jb2wqIHByb3Q7CisgICAgaWYgKHNwZWNpZmljX3RyYW5zKSB7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4oc3BlY2lmaWNfdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQsIEJ5dGVPcmRlcl8+KHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3dyaXRlXyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOworICB9CisKK3ByaXZhdGU6CisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOworICBib29sIHN0cmljdF9yZWFkXzsKKyAgYm9vbCBzdHJpY3Rfd3JpdGVfOworfTsKKwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0LCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gVExFQmluYXJ5UHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjPgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTczOTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKKyAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7CisgICAgdWludDMyX3Qgd3NpemUgPSAwOworICAgIHdzaXplICs9IHdyaXRlSTMyKHZlcnNpb24pOworICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOworICAgIHdzaXplICs9IHdyaXRlSTMyKHNlcWlkKTsKKyAgICByZXR1cm4gd3NpemU7CisgIH0gZWxzZSB7CisgICAgdWludDMyX3Qgd3NpemUgPSAwOworICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOworICAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KW1lc3NhZ2VUeXBlKTsKKyAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7CisgICAgcmV0dXJuIHdzaXplOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNZXNzYWdlRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClmaWVsZFR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkxNihmaWVsZElkKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gd3JpdGVCeXRlKChpbnQ4X3QpVF9TVE9QKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClrZXlUeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpdmFsVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNYXBFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHVpbnQ4X3QgdG1wID0gdmFsdWUgPyAxIDogMDsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClCeXRlT3JkZXJfOjp0b1dpcmUxNihpMTYpOworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKKyAgcmV0dXJuIDI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClCeXRlT3JkZXJfOjp0b1dpcmUzMihpMzIpOworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA0KTsKKyAgcmV0dXJuIDQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClCeXRlT3JkZXJfOjp0b1dpcmU2NChpNjQpOworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA4KTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOworCisgIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7CisgIGJpdHMgPSBCeXRlT3JkZXJfOjp0b1dpcmU2NChiaXRzKTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RyaW5nKGNvbnN0IFN0clR5cGUmIHN0cikgeworICBpZiAoc3RyLnNpemUoKSA+IHN0YXRpY19jYXN0PHNpemVfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLnNpemUoKSk7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKKyAgfQorICByZXR1cm4gcmVzdWx0ICsgc2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cmluZyhzdHIpOworfQorCisvKioKKyAqIFJlYWRpbmcgZnVuY3Rpb25zCisgKi8KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHN6OworICByZXN1bHQgKz0gcmVhZEkzMihzeik7CisKKyAgaWYgKHN6IDwgMCkgeworICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gbnVtYmVyCisgICAgaW50MzJfdCB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGlkZW50aWZpZXIiKTsKKyAgICB9CisgICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzeiAmIDB4MDAwMDAwZmYpOworICAgIHJlc3VsdCArPSByZWFkU3RyaW5nKG5hbWUpOworICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodGhpcy0+c3RyaWN0X3JlYWRfKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdmVyc2lvbiBpZGVudGlmaWVyLi4uIG9sZCBwcm90b2NvbCBjbGllbnQgaW4gc3RyaWN0IG1vZGU/Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0CisgICAgICBpbnQ4X3QgdHlwZTsKKyAgICAgIHJlc3VsdCArPSByZWFkU3RyaW5nQm9keShuYW1lLCBzeik7CisgICAgICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7CisgICAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdHlwZTsKKyAgICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIG5hbWUgPSAiIjsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgeworICAodm9pZCluYW1lOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQ4X3QgdHlwZTsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOworICBmaWVsZFR5cGUgPSAoVFR5cGUpdHlwZTsKKyAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKKyAgICBmaWVsZElkID0gMDsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJlc3VsdCArPSByZWFkSTE2KGZpZWxkSWQpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIGludDhfdCBrLCB2OworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHNpemVpOworICByZXN1bHQgKz0gcmVhZEJ5dGUoayk7CisgIGtleVR5cGUgPSAoVFR5cGUpazsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKHYpOworICB2YWxUeXBlID0gKFRUeXBlKXY7CisgIHJlc3VsdCArPSByZWFkSTMyKHNpemVpKTsKKyAgaWYgKHNpemVpIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKHRoaXMtPmNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiB0aGlzLT5jb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKyAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWFwRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgaW50OF90IGU7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDMyX3Qgc2l6ZWk7CisgIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKKyAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOworICBpZiAoc2l6ZWkgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorICBzaXplID0gKHVpbnQzMl90KXNpemVpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRMaXN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3QgZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzaXplaTsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOworICBlbGVtVHlwZSA9IChUVHlwZSllOworICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7CisgIGlmIChzaXplaSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisgIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFNldEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgdWludDhfdCBiWzFdOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwoYiwgMSk7CisgIHZhbHVlID0gKihpbnQ4X3QqKWIgIT0gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgIHVpbnQ4X3QgYlsxXTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKGIsIDEpOworICBieXRlID0gKihpbnQ4X3QqKWI7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgIHVuaW9uIGJ5dGVzIHsKKyAgICB1aW50OF90IGJbMl07CisgICAgaW50MTZfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCAyKTsKKyAgaTE2ID0gKGludDE2X3QpQnl0ZU9yZGVyXzo6ZnJvbVdpcmUxNih0aGVCeXRlcy5hbGwpOworICByZXR1cm4gMjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTMyKGludDMyX3QmIGkzMikgeworICB1bmlvbiBieXRlcyB7CisgICAgdWludDhfdCBiWzRdOworICAgIGludDMyX3QgYWxsOworICB9IHRoZUJ5dGVzOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgNCk7CisgIGkzMiA9IChpbnQzMl90KUJ5dGVPcmRlcl86OmZyb21XaXJlMzIodGhlQnl0ZXMuYWxsKTsKKyAgcmV0dXJuIDQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYls4XTsKKyAgICBpbnQ2NF90IGFsbDsKKyAgfSB0aGVCeXRlczsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDgpOworICBpNjQgPSAoaW50NjRfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTY0KHRoZUJ5dGVzLmFsbCk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1bmlvbiBieXRlcyB7CisgICAgdWludDhfdCBiWzhdOworICAgIHVpbnQ2NF90IGFsbDsKKyAgfSB0aGVCeXRlczsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDgpOworICB0aGVCeXRlcy5hbGwgPSBCeXRlT3JkZXJfOjpmcm9tV2lyZTY0KHRoZUJ5dGVzLmFsbCk7CisgIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KHRoZUJ5dGVzLmFsbCk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFN0cmluZyhTdHJUeXBlJiBzdHIpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICBpbnQzMl90IHNpemU7CisgIHJlc3VsdCA9IHJlYWRJMzIoc2l6ZSk7CisgIHJldHVybiByZXN1bHQgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFN0cmluZyhzdHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFN0cmluZ0JvZHkoU3RyVHlwZSYgc3RyLCBpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKworICAvLyBDYXRjaCBlcnJvciBjYXNlcworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfQorICBpZiAodGhpcy0+c3RyaW5nX2xpbWl0XyA+IDAgJiYgc2l6ZSA+IHRoaXMtPnN0cmluZ19saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorCisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09IDApIHsKKyAgICBzdHIuY2xlYXIoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gVHJ5IHRvIGJvcnJvdyBmaXJzdAorICBjb25zdCB1aW50OF90KiBib3Jyb3dfYnVmOworICB1aW50MzJfdCBnb3QgPSBzaXplOworICBpZiAoKGJvcnJvd19idWYgPSB0aGlzLT50cmFuc18tPmJvcnJvdyhOVUxMLCAmZ290KSkpIHsKKyAgICBzdHIuYXNzaWduKChjb25zdCBjaGFyKilib3Jyb3dfYnVmLCBzaXplKTsKKyAgICB0aGlzLT50cmFuc18tPmNvbnN1bWUoc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBzdHIucmVzaXplKHNpemUpOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN0clswXSksIHNpemUpOworICByZXR1cm4gKHVpbnQzMl90KXNpemU7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ZiNDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogQysrIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wYWN0IFByb3RvY29sIGFzIGRlc2NyaWJlZCBpbiBUSFJJRlQtMTEwCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgorY2xhc3MgVENvbXBhY3RQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludDhfdCBQUk9UT0NPTF9JRCA9IChpbnQ4X3QpMHg4MnU7CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVkVSU0lPTl9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvLyAwMDAxIDExMTEKKworcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfTUFTSyA9IChpbnQ4X3QpMHhFMHU7IC8vIDExMTAgMDAwMAorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfQklUUyA9IDB4MDc7ICAgICAgICAgIC8vIDAwMDAgMDExMQorICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgVHJhbnNwb3J0XyogdHJhbnNfOworCisgIC8qKgorICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKKyAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICovCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBUVHlwZSBmaWVsZFR5cGU7CisgICAgaW50MTZfdCBmaWVsZElkOworICB9IGJvb2xlYW5GaWVsZF87CisKKyAgLyoqCisgICAqIChSZWFkaW5nKSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUKKyAgICogdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAqLworICBzdHJ1Y3QgeworICAgIGJvb2wgaGFzQm9vbFZhbHVlOworICAgIGJvb2wgYm9vbFZhbHVlOworICB9IGJvb2xWYWx1ZV87CisKKyAgLyoqCisgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAqLworCisgIHN0ZDo6c3RhY2s8aW50MTZfdD4gbGFzdEZpZWxkXzsKKyAgaW50MTZfdCBsYXN0RmllbGRJZF87CisKK3B1YmxpYzoKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBsYXN0RmllbGRJZF8oMCksCisgICAgICBzdHJpbmdfbGltaXRfKDApLAorICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmX3NpemVfKDApLAorICAgICAgY29udGFpbmVyX2xpbWl0XygwKSB7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKKyAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOworICB9CisKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIGxhc3RGaWVsZElkXygwKSwKKyAgICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKKyAgICAgIHN0cmluZ19idWZfKE5VTEwpLAorICAgICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSB7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKKyAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOworICB9CisKKyAgflRDb21wYWN0UHJvdG9jb2xUKCkgeyBmcmVlKHN0cmluZ19idWZfKTsgfQorCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucworICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlZAorICAqIG91dHB1dCBvciBwdXJwb3NlCisgICovCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KKworcHJvdGVjdGVkOgorICBpbnQzMl90IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgdHlwZU92ZXJyaWRlKTsKKyAgdWludDMyX3Qgd3JpdGVDb2xsZWN0aW9uQmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGludDMyX3Qgc2l6ZSk7CisgIHVpbnQzMl90IHdyaXRlVmFyaW50MzIodWludDMyX3Qgbik7CisgIHVpbnQzMl90IHdyaXRlVmFyaW50NjQodWludDY0X3Qgbik7CisgIHVpbnQ2NF90IGk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCk7CisgIHVpbnQzMl90IGkzMlRvWmlnemFnKGNvbnN0IGludDMyX3Qgbik7CisgIGlubGluZSBpbnQ4X3QgZ2V0Q29tcGFjdFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpOworCitwdWJsaWM6CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCk7CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID46OnJlYWRCb29sOworCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOworCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qCisgICAqVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgKiBlbmNvZGluZy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeyByZXR1cm4gMDsgfQorCitwcm90ZWN0ZWQ6CisgIHVpbnQzMl90IHJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpOworICB1aW50MzJfdCByZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KTsKKyAgaW50MzJfdCB6aWd6YWdUb0kzMih1aW50MzJfdCBuKTsKKyAgaW50NjRfdCB6aWd6YWdUb0k2NCh1aW50NjRfdCBuKTsKKyAgVFR5cGUgZ2V0VFR5cGUoaW50OF90IHR5cGUpOworCisgIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCisgIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAorICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIHVpbnQ4X3QqIHN0cmluZ19idWZfOworICBpbnQzMl90IHN0cmluZ19idWZfc2l6ZV87CisgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKK307CisKK3R5cGVkZWYgVENvbXBhY3RQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGNvbXBhY3QgcHJvdG9jb2wgaGFuZGxlcnMKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIDogc3RyaW5nX2xpbWl0XygwKSwgY29udGFpbmVyX2xpbWl0XygwKSB7fQorCisgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VChpbnQzMl90IHN0cmluZ19saW1pdCwgaW50MzJfdCBjb250YWluZXJfbGltaXQpCisgICAgOiBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSB7fQorCisgIHZpcnR1YWwgflRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIHt9CisKKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQorCisgIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7IGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgICBUUHJvdG9jb2wqIHByb3Q7CisgICAgaWYgKHNwZWNpZmljX3RyYW5zKSB7CisgICAgICBwcm90ID0gbmV3IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+KHNwZWNpZmljX3RyYW5zLCBzdHJpbmdfbGltaXRfLCBjb250YWluZXJfbGltaXRfKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zLCBzdHJpbmdfbGltaXRfLCBjb250YWluZXJfbGltaXRfKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgIH0KKworcHJpdmF0ZToKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Cit9OworCit0eXBlZGVmIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmVjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKQEAgLTAsMCArMSw4MjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX1RDQ18KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX1RDQ18gMQorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmZpZy5oIgorCisvKgorICogVENvbXBhY3RQcm90b2NvbDo6aSpUb1ppZ3phZyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcmlnaHQgc2hpZnQKKyAqIG9wZXJhdG9yIG9uIGEgc2lnbmVkIGludGVnZXIgaXMgYW4gYXJpdGhtZXRpYyAoc2lnbi1leHRlbmRpbmcpIHNoaWZ0LgorICogSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgbm90IHdvcmsuCisgKiBJZiBhbnlvbmUgZW5jb3VudGVycyB0aGlzIGVycm9yLCB3ZSBjYW4gdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3QKKyAqIHdheSB0byBpbXBsZW1lbnQgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBvbiB0aGVpciBwbGF0Zm9ybS4KKyAqLworI2lmICFkZWZpbmVkKFNJR05FRF9SSUdIVF9TSElGVF9JUykgfHwgIWRlZmluZWQoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyMgZXJyb3IgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorI2VuZGlmCisjaWYgU0lHTkVEX1JJR0hUX1NISUZUX0lTICE9IEFSSVRITUVUSUNfUklHSFRfU0hJRlQKKyMgZXJyb3IgIlRDb21wYWN0UHJvdG9jb2wgY3VycmVudGx5IG9ubHkgd29ya3MgaWYgYSBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCisjZWxzZQorI2RlZmluZSBVTkxJS0VMWSh2YWwpICh2YWwpCisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworCituYW1lc3BhY2UgZGV0YWlsIHsgbmFtZXNwYWNlIGNvbXBhY3QgeworCitlbnVtIFR5cGVzIHsKKyAgQ1RfU1RPUCAgICAgICAgICAgPSAweDAwLAorICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKKyAgQ1RfQllURSAgICAgICAgICAgPSAweDAzLAorICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCisgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKKyAgQ1RfSTY0ICAgICAgICAgICAgPSAweDA2LAorICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCisgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKKyAgQ1RfTElTVCAgICAgICAgICAgPSAweDA5LAorICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCisgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKKyAgQ1RfU1RSVUNUICAgICAgICAgPSAweDBDCit9OworCitjb25zdCBpbnQ4X3QgVFR5cGVUb0NUeXBlWzE2XSA9IHsKKyAgQ1RfU1RPUCwgLy8gVF9TVE9QCisgIDAsIC8vIHVudXNlZAorICBDVF9CT09MRUFOX1RSVUUsIC8vIFRfQk9PTAorICBDVF9CWVRFLCAvLyBUX0JZVEUKKyAgQ1RfRE9VQkxFLCAvLyBUX0RPVUJMRQorICAwLCAvLyB1bnVzZWQKKyAgQ1RfSTE2LCAvLyBUX0kxNgorICAwLCAvLyB1bnVzZWQKKyAgQ1RfSTMyLCAvLyBUX0kzMgorICAwLCAvLyB1bnVzZWQKKyAgQ1RfSTY0LCAvLyBUX0k2NAorICBDVF9CSU5BUlksIC8vIFRfU1RSSU5HCisgIENUX1NUUlVDVCwgLy8gVF9TVFJVQ1QKKyAgQ1RfTUFQLCAvLyBUX01BUAorICBDVF9TRVQsIC8vIFRfU0VUCisgIENUX0xJU1QsIC8vIFRfTElTVAorfTsKKworfX0gLy8gZW5kIGRldGFpbDo6Y29tcGFjdCBuYW1lc3BhY2UKKworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1lc3NhZ2VCZWdpbigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIHdzaXplICs9IHdyaXRlQnl0ZShQUk9UT0NPTF9JRCk7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoVkVSU0lPTl9OICYgVkVSU0lPTl9NQVNLKSB8ICgoKGludDMyX3QpbWVzc2FnZVR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7CisgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2VxaWQpOworICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICBpZiAoZmllbGRUeXBlID09IFRfQk9PTCkgeworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IG5hbWU7CisgICAgYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUgPSBmaWVsZFR5cGU7CisgICAgYm9vbGVhbkZpZWxkXy5maWVsZElkID0gZmllbGRJZDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkLCAtMSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHdyaXRlQnl0ZShUX1NUT1ApOworfQorCisvKioKKyAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgKiBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICh2b2lkKSBuYW1lOworICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKKyAgbGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICogb2YgdGhlIGZpZWxkIHN0YWNrLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy50b3AoKTsKKyAgbGFzdEZpZWxkXy5wb3AoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgYSBMaXN0IGhlYWRlci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCisvKioKKyAqIFdyaXRlIGEgc2V0IGhlYWRlci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKworLyoqCisgKiBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQorICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHdzaXplICs9IHdyaXRlQnl0ZSgwKTsKKyAgfSBlbHNlIHsKKyAgICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNpemUpOworICAgIHdzaXplICs9IHdyaXRlQnl0ZShnZXRDb21wYWN0VHlwZShrZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUodmFsVHlwZSkpOworICB9CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgKiByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuCisgKiBPdGhlcndpc2UsIHdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICBpZiAoYm9vbGVhbkZpZWxkXy5uYW1lICE9IE5VTEwpIHsKKyAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICB3c2l6ZQorICAgICAgKz0gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCisgICAgd3NpemUKKyAgICAgICs9IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRSkpOworICB9CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTE2KSk7Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTMyKSk7Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50NjQoaTY0VG9aaWd6YWcoaTY0KSk7Cit9CisKKy8qKgorICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOworCisgIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7CisgIGJpdHMgPSBUSFJJRlRfaHRvbGVsbChiaXRzKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOworICByZXR1cm4gODsKK30KKworLyoqCisgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiB3cml0ZUJpbmFyeShzdHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIGlmKHN0ci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3Qgc3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLnNpemUoKSk7CisgIHVpbnQzMl90IHdzaXplID0gd3JpdGVWYXJpbnQzMihzc2l6ZSkgOworICAvLyBjaGVja2luZyBzc2l6ZSArIHdzaXplID4gdWludF9tYXgsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG92ZXJmbG93IHdoaWxlIGNoZWNraW5nIGZvciBvdmVyZmxvd3MuCisgIC8vIHRyYW5zZm9ybWluZyB0aGUgY2hlY2sgdG8gc3NpemUgPiB1aW50X21heCAtIHdzaXplCisgIGlmKHNzaXplID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkgLSB3c2l6ZSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgd3NpemUgKz0gc3NpemU7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCisvLworLy8gSW50ZXJuYWwgV3JpdGluZyBtZXRob2RzCisvLworCisvKioKKyAqIFRoZSB3b3JraG9yc2Ugb2Ygd3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICogYm9vbGVhbiBmaWVsZCBjYXNlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRmllbGRCZWdpbkludGVybmFsKAorICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCwKKyAgICBpbnQ4X3QgdHlwZU92ZXJyaWRlKSB7CisgICh2b2lkKSBuYW1lOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICBpbnQ4X3QgdHlwZVRvV3JpdGUgPSAodHlwZU92ZXJyaWRlID09IC0xID8gZ2V0Q29tcGFjdFR5cGUoZmllbGRUeXBlKSA6IHR5cGVPdmVycmlkZSk7CisKKyAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElkID4gbGFzdEZpZWxkSWRfICYmIGZpZWxkSWQgLSBsYXN0RmllbGRJZF8gPD0gMTUpIHsKKyAgICAvLyB3cml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgd3NpemUgKz0gd3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oKGZpZWxkSWQgLSBsYXN0RmllbGRJZF8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IHR5cGVUb1dyaXRlKSk7CisgIH0gZWxzZSB7CisgICAgLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgIHdzaXplICs9IHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7CisgICAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7CisgIH0KKworICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOworICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUNvbGxlY3Rpb25CZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIHdzaXplICs9IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSk7CisgIH0gZWxzZSB7CisgICAgd3NpemUgKz0gd3JpdGVCeXRlKDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlVmFyaW50MzIodWludDMyX3QgbikgeworICB1aW50OF90IGJ1Zls1XTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlVmFyaW50NjQodWludDY0X3QgbikgeworICB1aW50OF90IGJ1ZlsxMF07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisgIHRyYW5zXy0+d3JpdGUoYnVmLCB3c2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46Omk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCkgeworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsKSA8PCAxKSBeIChsID4+IDYzKTsKK30KKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG4pIDw8IDEpIF4gKG4gPj4gMzEpOworfQorCisvKioKKyAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGRldGFpbDo6Y29tcGFjdDo6VHlwZXMgdmFsdWUKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitpbnQ4X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKSB7CisgIHJldHVybiBkZXRhaWw6OmNvbXBhY3Q6OlRUeXBlVG9DVHlwZVt0dHlwZV07Cit9CisKKy8vCisvLyBSZWFkaW5nIE1ldGhvZHMKKy8vCisKKy8qKgorICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWVzc2FnZUJlZ2luKAorICAgIHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICBpbnQ4X3QgcHJvdG9jb2xJZDsKKyAgaW50OF90IHZlcnNpb25BbmRUeXBlOworICBpbnQ4X3QgdmVyc2lvbjsKKworICByc2l6ZSArPSByZWFkQnl0ZShwcm90b2NvbElkKTsKKyAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyIik7CisgIH0KKworICByc2l6ZSArPSByZWFkQnl0ZSh2ZXJzaW9uQW5kVHlwZSk7CisgIHZlcnNpb24gPSAoaW50OF90KSh2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fTikgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIHZlcnNpb24iKTsKKyAgfQorCisgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgIHJzaXplICs9IHJlYWRWYXJpbnQzMihzZXFpZCk7CisgIHJzaXplICs9IHJlYWRTdHJpbmcobmFtZSk7CisKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9uIHRoZSBmaWVsZCBzdGFjay4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIG5hbWUgPSAiIjsKKyAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7CisgIGxhc3RGaWVsZElkXyA9IDA7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEVuZCgpIHsKKyAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy50b3AoKTsKKyAgbGFzdEZpZWxkXy5wb3AoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgeworICAodm9pZCkgbmFtZTsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICBpbnQ4X3QgYnl0ZTsKKyAgaW50OF90IHR5cGU7CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUoYnl0ZSk7CisgIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOworCisgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgZmllbGRUeXBlID0gVF9TVE9QOworICAgIGZpZWxkSWQgPSAwOworICAgIHJldHVybiByc2l6ZTsKKyAgfQorCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgaW50MTZfdCBtb2RpZmllciA9IChpbnQxNl90KSgoKHVpbnQ4X3QpYnl0ZSAmIDB4ZjApID4+IDQpOworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8vIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICByc2l6ZSArPSByZWFkSTE2KGZpZWxkSWQpOworICB9IGVsc2UgeworICAgIGZpZWxkSWQgPSAoaW50MTZfdCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICB9CisgIGZpZWxkVHlwZSA9IGdldFRUeXBlKHR5cGUpOworCisgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgIGlmICh0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRSkgeworICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gdHJ1ZTsKKyAgICBib29sVmFsdWVfLmJvb2xWYWx1ZSA9CisgICAgICAodHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZSk7CisgIH0KKworICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgbGFzdEZpZWxkSWRfID0gZmllbGRJZDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKKyAqIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgKiAiY29ycmVjdCIgdHlwZXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50OF90IGt2VHlwZSA9IDA7CisgIGludDMyX3QgbXNpemUgPSAwOworCisgIHJzaXplICs9IHJlYWRWYXJpbnQzMihtc2l6ZSk7CisgIGlmIChtc2l6ZSAhPSAwKQorICAgIHJzaXplICs9IHJlYWRCeXRlKGt2VHlwZSk7CisKKyAgaWYgKG1zaXplIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbXNpemUgPiBjb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICBrZXlUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlID4+IDQpKTsKKyAgdmFsVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKCh1aW50OF90KWt2VHlwZSAmIDB4ZikpOworICBzaXplID0gKHVpbnQzMl90KW1zaXplOworCisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICogdHJ1ZSBzaXplLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIGludDhfdCBzaXplX2FuZF90eXBlOworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIGludDMyX3QgbHNpemU7CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUoc2l6ZV9hbmRfdHlwZSk7CisKKyAgbHNpemUgPSAoKHVpbnQ4X3Qpc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7CisgIGlmIChsc2l6ZSA9PSAxNSkgeworICAgIHJzaXplICs9IHJlYWRWYXJpbnQzMihsc2l6ZSk7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBsc2l6ZSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorCisgIGVsZW1UeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoc2l6ZV9hbmRfdHlwZSAmIDB4MGYpKTsKKyAgc2l6ZSA9ICh1aW50MzJfdClsc2l6ZTsKKworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAqIHRydWUgc2l6ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCisvKioKKyAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIHJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIHJlYWQgYSBieXRlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQm9vbChib29sJiB2YWx1ZSkgeworICBpZiAoYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPT0gdHJ1ZSkgeworICAgIHZhbHVlID0gYm9vbFZhbHVlXy5ib29sVmFsdWU7CisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpbnQ4X3QgdmFsOworICAgIHJlYWRCeXRlKHZhbCk7CisgICAgdmFsdWUgPSAodmFsID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvKioKKyAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgIHVpbnQ4X3QgYlsxXTsKKyAgdHJhbnNfLT5yZWFkQWxsKGIsIDEpOworICBieXRlID0gKihpbnQ4X3QqKWI7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICBpbnQzMl90IHZhbHVlOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMih2YWx1ZSk7CisgIGkxNiA9IChpbnQxNl90KXppZ3phZ1RvSTMyKHZhbHVlKTsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTMyKGludDMyX3QmIGkzMikgeworICBpbnQzMl90IHZhbHVlOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMih2YWx1ZSk7CisgIGkzMiA9IHppZ3phZ1RvSTMyKHZhbHVlKTsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTY0KGludDY0X3QmIGk2NCkgeworICBpbnQ2NF90IHZhbHVlOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQ2NCh2YWx1ZSk7CisgIGk2NCA9IHppZ3phZ1RvSTY0KHZhbHVlKTsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CisKKyAgdW5pb24geworICAgIHVpbnQ2NF90IGJpdHM7CisgICAgdWludDhfdCBiWzhdOworICB9IHU7CisgIHRyYW5zXy0+cmVhZEFsbCh1LmIsIDgpOworICB1LmJpdHMgPSBUSFJJRlRfbGV0b2hsbCh1LmJpdHMpOworICBkdWIgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih1LmJpdHMpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiByZWFkQmluYXJ5KHN0cik7Cit9CisKKy8qKgorICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCByc2l6ZSA9IDA7CisgIGludDMyX3Qgc2l6ZTsKKworICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2l6ZSk7CisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09IDApIHsKKyAgICBzdHIgPSAiIjsKKyAgICByZXR1cm4gcnNpemU7CisgIH0KKworICAvLyBDYXRjaCBlcnJvciBjYXNlcworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfQorICBpZiAoc3RyaW5nX2xpbWl0XyA+IDAgJiYgc2l6ZSA+IHN0cmluZ19saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorCisgIC8vIFVzZSB0aGUgaGVhcCBoZXJlIHRvIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgZm9yIHYuIGxhcmdlIHN0cmluZ3MKKyAgaWYgKHNpemUgPiBzdHJpbmdfYnVmX3NpemVfIHx8IHN0cmluZ19idWZfID09IE5VTEwpIHsKKyAgICB2b2lkKiBuZXdfc3RyaW5nX2J1ZiA9IHN0ZDo6cmVhbGxvYyhzdHJpbmdfYnVmXywgKHVpbnQzMl90KXNpemUpOworICAgIGlmIChuZXdfc3RyaW5nX2J1ZiA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICBzdHJpbmdfYnVmXyA9ICh1aW50OF90KiluZXdfc3RyaW5nX2J1ZjsKKyAgICBzdHJpbmdfYnVmX3NpemVfID0gc2l6ZTsKKyAgfQorICB0cmFuc18tPnJlYWRBbGwoc3RyaW5nX2J1Zl8sIHNpemUpOworICBzdHIuYXNzaWduKChjaGFyKilzdHJpbmdfYnVmXywgc2l6ZSk7CisKKyAgcmV0dXJuIHJzaXplICsgKHVpbnQzMl90KXNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpIHsKKyAgaW50NjRfdCB2YWw7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbCk7CisgIGkzMiA9IChpbnQzMl90KXZhbDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRWYXJpbnQ2NChpbnQ2NF90JiBpNjQpIHsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICB1aW50NjRfdCB2YWwgPSAwOworICBpbnQgc2hpZnQgPSAwOworICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgorICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOworICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKKworICAvLyBGYXN0IHBhdGguCisgIGlmIChib3Jyb3dlZCAhPSBOVUxMKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJvcnJvd2VkW3JzaXplXTsKKyAgICAgIHJzaXplKys7CisgICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBzaGlmdCArPSA3OworICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAgIGk2NCA9IHZhbDsKKyAgICAgICAgdHJhbnNfLT5jb25zdW1lKHJzaXplKTsKKyAgICAgICAgcmV0dXJuIHJzaXplOworICAgICAgfQorICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgorICAgICAgaWYgKFVOTElLRUxZKHJzaXplID09IHNpemVvZihidWYpKSkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gU2xvdyBwYXRoLgorICBlbHNlIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdWludDhfdCBieXRlOworICAgICAgcnNpemUgKz0gdHJhbnNfLT5yZWFkQWxsKCZieXRlLCAxKTsKKyAgICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICAgaTY0ID0gdmFsOworICAgICAgICByZXR1cm4gcnNpemU7CisgICAgICB9CisgICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCisgICAgICBpZiAoVU5MSUtFTFkocnNpemUgPj0gc2l6ZW9mKGJ1ZikpKSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgoraW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6emlnemFnVG9JMzIodWludDMyX3QgbikgeworICByZXR1cm4gKG4gPj4gMSkgXiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLXN0YXRpY19jYXN0PGludDMyX3Q+KG4gJiAxKSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgoraW50NjRfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6emlnemFnVG9JNjQodWludDY0X3QgbikgeworICByZXR1cm4gKG4gPj4gMSkgXiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLXN0YXRpY19jYXN0PGludDY0X3Q+KG4gJiAxKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgorVFR5cGUgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmdldFRUeXBlKGludDhfdCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVF9TVE9QOgorICAgICAgcmV0dXJuIFRfU1RPUDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRToKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFOgorICAgICAgcmV0dXJuIFRfQk9PTDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQllURToKKyAgICAgIHJldHVybiBUX0JZVEU7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0kxNjoKKyAgICAgIHJldHVybiBUX0kxNjsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTMyOgorICAgICAgcmV0dXJuIFRfSTMyOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JNjQ6CisgICAgICByZXR1cm4gVF9JNjQ7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0RPVUJMRToKKyAgICAgIHJldHVybiBUX0RPVUJMRTsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQklOQVJZOgorICAgICAgcmV0dXJuIFRfU1RSSU5HOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9MSVNUOgorICAgICAgcmV0dXJuIFRfTElTVDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfU0VUOgorICAgICAgcmV0dXJuIFRfU0VUOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9NQVA6CisgICAgICByZXR1cm4gVF9NQVA7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUX1NUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgVEV4Y2VwdGlvbihzdGQ6OnN0cmluZygiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICIpICsgKGNoYXIpdHlwZSk7CisgIH0KK30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworc3RhdGljIHN0cmluZyBieXRlX3RvX2hleChjb25zdCB1aW50OF90IGJ5dGUpIHsKKyAgY2hhciBidWZbM107CisgIGludCByZXQgPSBzdGQ6OnNwcmludGYoYnVmLCAiJTAyeCIsIChpbnQpYnl0ZSk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKKyAgYXNzZXJ0KHJldCA9PSAyKTsKKyAgYXNzZXJ0KGJ1ZlsyXSA9PSAnXDAnKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3N0cmluZyBURGVidWdQcm90b2NvbDo6ZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfU1RPUDoKKyAgICByZXR1cm4gInN0b3AiOworICBjYXNlIFRfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIFRfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIFRfQllURToKKyAgICByZXR1cm4gImJ5dGUiOworICBjYXNlIFRfSTE2OgorICAgIHJldHVybiAiaTE2IjsKKyAgY2FzZSBUX0kzMjoKKyAgICByZXR1cm4gImkzMiI7CisgIGNhc2UgVF9VNjQ6CisgICAgcmV0dXJuICJ1NjQiOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiAiaTY0IjsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGNhc2UgVF9TVFJJTkc6CisgICAgcmV0dXJuICJzdHJpbmciOworICBjYXNlIFRfU1RSVUNUOgorICAgIHJldHVybiAic3RydWN0IjsKKyAgY2FzZSBUX01BUDoKKyAgICByZXR1cm4gIm1hcCI7CisgIGNhc2UgVF9TRVQ6CisgICAgcmV0dXJuICJzZXQiOworICBjYXNlIFRfTElTVDoKKyAgICByZXR1cm4gImxpc3QiOworICBjYXNlIFRfVVRGODoKKyAgICByZXR1cm4gInV0ZjgiOworICBjYXNlIFRfVVRGMTY6CisgICAgcmV0dXJuICJ1dGYxNiI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorfQorCit2b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnRVcCgpIHsKKyAgaW5kZW50X3N0cl8gKz0gc3RyaW5nKGluZGVudF9pbmMsICcgJyk7Cit9CisKK3ZvaWQgVERlYnVnUHJvdG9jb2w6OmluZGVudERvd24oKSB7CisgIGlmIChpbmRlbnRfc3RyXy5sZW5ndGgoKSA8IChzdHJpbmc6OnNpemVfdHlwZSlpbmRlbnRfaW5jKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgfQorICBpbmRlbnRfc3RyXy5lcmFzZShpbmRlbnRfc3RyXy5sZW5ndGgoKSAtIGluZGVudF9pbmMpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVQbGFpbihjb25zdCBzdHJpbmcmIHN0cikgeworICBpZiAoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIubGVuZ3RoKCkpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIubGVuZ3RoKCkpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJbmRlbnRlZChjb25zdCBzdHJpbmcmIHN0cikgeworICBpZiAoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIGlmIChpbmRlbnRfc3RyXy5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50NjRfdCB0b3RhbF9sZW4gPSBpbmRlbnRfc3RyXy5sZW5ndGgoKSArIHN0ci5sZW5ndGgoKTsKKyAgaWYgKHRvdGFsX2xlbiA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilpbmRlbnRfc3RyXy5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRlbnRfc3RyXy5sZW5ndGgoKSkpOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZW50X3N0cl8ubGVuZ3RoKCkgKyBzdHIubGVuZ3RoKCkpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6c3RhcnRJdGVtKCkgeworICB1aW50MzJfdCBzaXplOworCisgIHN3aXRjaCAod3JpdGVfc3RhdGVfLmJhY2soKSkgeworICBjYXNlIFVOSU5JVDoKKyAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCisgICAgLy8gdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAvLyByZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOworICAgIHJldHVybiAwOworICBjYXNlIFNUUlVDVDoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBTRVQ6CisgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOworICBjYXNlIE1BUF9LRVk6CisgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOworICBjYXNlIE1BUF9WQUxVRToKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiIC0+ICIpOworICBjYXNlIExJU1Q6CisgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIlsiICsgdG9fc3RyaW5nKGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKKyAgICBsaXN0X2lkeF8uYmFjaygpKys7CisgICAgcmV0dXJuIHNpemU7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOworICB9Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjplbmRJdGVtKCkgeworICAvLyB1aW50MzJfdCBzaXplOworCisgIHN3aXRjaCAod3JpdGVfc3RhdGVfLmJhY2soKSkgeworICBjYXNlIFVOSU5JVDoKKyAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCisgICAgLy8gdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAvLyByZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOworICAgIHJldHVybiAwOworICBjYXNlIFNUUlVDVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgU0VUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBNQVBfS0VZOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOworICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBMSVNUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CisgIH0KK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSXRlbShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHN0YXJ0SXRlbSgpOworICBzaXplICs9IHdyaXRlUGxhaW4oc3RyKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgKHZvaWQpc2VxaWQ7CisgIHN0cmluZyBtdHlwZTsKKyAgc3dpdGNoIChtZXNzYWdlVHlwZSkgeworICBjYXNlIFRfQ0FMTDoKKyAgICBtdHlwZSA9ICJjYWxsIjsKKyAgICBicmVhazsKKyAgY2FzZSBUX1JFUExZOgorICAgIG10eXBlID0gInJlcGx5IjsKKyAgICBicmVhazsKKyAgY2FzZSBUX0VYQ0VQVElPTjoKKyAgICBtdHlwZSA9ICJleG4iOworICAgIGJyZWFrOworICBjYXNlIFRfT05FV0FZOgorICAgIG10eXBlID0gIm9uZXdheSI7CisgICAgYnJlYWs7CisgIH0KKworICB1aW50MzJfdCBzaXplID0gd3JpdGVJbmRlbnRlZCgiKCIgKyBtdHlwZSArICIpICIgKyBuYW1lICsgIigiKTsKKyAgaW5kZW50VXAoKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIilcbiIpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHN0YXJ0SXRlbSgpOworICBzaXplICs9IHdyaXRlUGxhaW4oc3RyaW5nKG5hbWUpICsgIiB7XG4iKTsKKyAgaW5kZW50VXAoKTsKKyAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTVFJVQ1QpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAvLyBzcHJpbnRmKGlkX3N0ciwgIiUwMmQiLCBmaWVsZElkKTsKKyAgc3RyaW5nIGlkX3N0ciA9IHRvX3N0cmluZyhmaWVsZElkKTsKKyAgaWYgKGlkX3N0ci5sZW5ndGgoKSA9PSAxKQorICAgIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKKworICByZXR1cm4gd3JpdGVJbmRlbnRlZChpZF9zdHIgKyAiOiAiICsgbmFtZSArICIgKCIgKyBmaWVsZFR5cGVOYW1lKGZpZWxkVHlwZSkgKyAiKSA9ICIpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKKyAgYXNzZXJ0KHdyaXRlX3N0YXRlXy5iYWNrKCkgPT0gU1RSVUNUKTsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIDA7CisgIC8vIHdyaXRlSW5kZW50ZWQoIioqKlNUT1AqKipcbiIpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBtYXBzPworICB1aW50MzJfdCBic2l6ZSA9IDA7CisgIGJzaXplICs9IHN0YXJ0SXRlbSgpOworICBic2l6ZSArPSB3cml0ZVBsYWluKAorICAgICAgIm1hcDwiICsgZmllbGRUeXBlTmFtZShrZXlUeXBlKSArICIsIiArIGZpZWxkVHlwZU5hbWUodmFsVHlwZSkgKyAiPiIKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOworICByZXR1cm4gYnNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IGFycmF5cy4KKyAgdWludDMyX3QgYnNpemUgPSAwOworICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgYnNpemUgKz0gd3JpdGVQbGFpbigKKyAgICAgICJsaXN0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgorICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CisgIGluZGVudFVwKCk7CisgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTElTVCk7CisgIGxpc3RfaWR4Xy5wdXNoX2JhY2soMCk7CisgIHJldHVybiBic2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKKyAgbGlzdF9pZHhfLnBvcF9iYWNrKCk7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IHNldHMuCisgIHVpbnQzMl90IGJzaXplID0gMDsKKyAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CisgIGJzaXplICs9IHdyaXRlUGxhaW4oCisgICAgICAic2V0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgorICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CisgIGluZGVudFVwKCk7CisgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU0VUKTsKKyAgcmV0dXJuIGJzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgIHJldHVybiB3cml0ZUl0ZW0oIjB4IiArIGJ5dGVfdG9faGV4KGJ5dGUpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkxNikpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTMyKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpNjQpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoZHViKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cikgeworICAvLyBYWFggUmF3L1VURi04PworCisgIHN0cmluZyB0b19zaG93ID0gc3RyOworICBpZiAodG9fc2hvdy5sZW5ndGgoKSA+IChzdHJpbmc6OnNpemVfdHlwZSlzdHJpbmdfbGltaXRfKSB7CisgICAgdG9fc2hvdyA9IHN0ci5zdWJzdHIoMCwgc3RyaW5nX3ByZWZpeF9zaXplXyk7CisgICAgdG9fc2hvdyArPSAiWy4uLl0oIiArIHRvX3N0cmluZyhzdHIubGVuZ3RoKCkpICsgIikiOworICB9CisKKyAgc3RyaW5nIG91dHB1dCA9ICJcIiI7CisKKyAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdG9fc2hvdy5iZWdpbigpOyBpdCAhPSB0b19zaG93LmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCppdCA9PSAnXFwnKSB7CisgICAgICBvdXRwdXQgKz0gIlxcXFwiOworICAgIH0gZWxzZSBpZiAoKml0ID09ICciJykgeworICAgICAgb3V0cHV0ICs9ICJcXFwiIjsKKyAgICAgIC8vIHBhc3NpbmcgY2hhcmFjdGVycyA8MCB0byBzdGQ6OmlzcHJpbnQgY2F1c2VzIGFzc2VydHMuIGlzcHJpbnQgdGFrZXMgYW4KKyAgICAgIC8vIGludCwgc28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNpZ24gZXh0ZW5zaW9uCisgICAgfSBlbHNlIGlmIChzdGQ6OmlzcHJpbnQoKHVuc2lnbmVkIGNoYXIpKml0KSkgeworICAgICAgb3V0cHV0ICs9ICppdDsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgqaXQpIHsKKyAgICAgIGNhc2UgJ1xhJzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXGEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXGIiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXGYiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXG4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXHIiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXHQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1x2JzoKKyAgICAgICAgb3V0cHV0ICs9ICJcXHYiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG91dHB1dCArPSAiXFx4IjsKKyAgICAgICAgb3V0cHV0ICs9IGJ5dGVfdG9faGV4KCppdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0cHV0ICs9ICdcIic7CisgIHJldHVybiB3cml0ZUl0ZW0ob3V0cHV0KTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIC8vIFhYWCBIZXg/CisgIHJldHVybiBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzk2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoKKworISEhIEVYUEVSSU1FTlRBTCBDT0RFICEhIQorCitUaGlzIHByb3RvY29sIGlzIHZlcnkgbXVjaCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCitJdCBkb2Vzbid0IGhhbmRsZSBtYW55IGNhc2VzIHByb3Blcmx5LgorSXQgdGhyb3dzIGV4Y2VwdGlvbnMgaW4gbWFueSBjYXNlcy4KK0l0IHByb2JhYmx5IHNlZ2ZhdWx0cyBpbiBtYW55IGNhc2VzLgorQnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMgYXJlIHdlbGNvbWUuCitDb21wbGFpbnRzIGFyZSBub3QuIDpSCisKKyovCisKKy8qKgorICogUHJvdG9jb2wgdGhhdCBwcmludHMgdGhlIHBheWxvYWQgaW4gYSBuaWNlIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4KKyAqIFJlYWRpbmcgZnJvbSB0aGlzIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQuCisgKgorICovCitjbGFzcyBURGVidWdQcm90b2NvbCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFREZWJ1Z1Byb3RvY29sPiB7Citwcml2YXRlOgorICBlbnVtIHdyaXRlX3N0YXRlX3QgeyBVTklOSVQsIFNUUlVDVCwgTElTVCwgU0VULCBNQVBfS0VZLCBNQVBfVkFMVUUgfTsKKworcHVibGljOgorICBURGVidWdQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFREZWJ1Z1Byb3RvY29sPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XyhERUZBVUxUX1NUUklOR19MSU1JVCksCisgICAgICBzdHJpbmdfcHJlZml4X3NpemVfKERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFKSB7CisgICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhVTklOSVQpOworICB9CisKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfTElNSVQgPSAyNTY7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFID0gMTY7CisKKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQorCisgIHZvaWQgc2V0U3RyaW5nUHJlZml4U2l6ZShpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZSkgeyBzdHJpbmdfcHJlZml4X3NpemVfID0gc3RyaW5nX3ByZWZpeF9zaXplOyB9CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCitwcml2YXRlOgorICB2b2lkIGluZGVudFVwKCk7CisgIHZvaWQgaW5kZW50RG93bigpOworICB1aW50MzJfdCB3cml0ZVBsYWluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworICB1aW50MzJfdCB3cml0ZUluZGVudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworICB1aW50MzJfdCBzdGFydEl0ZW0oKTsKKyAgdWludDMyX3QgZW5kSXRlbSgpOworICB1aW50MzJfdCB3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSk7CisKKyAgVFRyYW5zcG9ydCogdHJhbnNfOworCisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemVfOworCisgIHN0ZDo6c3RyaW5nIGluZGVudF9zdHJfOworICBzdGF0aWMgY29uc3QgaW50IGluZGVudF9pbmMgPSAyOworCisgIHN0ZDo6dmVjdG9yPHdyaXRlX3N0YXRlX3Q+IHdyaXRlX3N0YXRlXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsaXN0X2lkeF87Cit9OworCisvKioKKyAqIENvbnN0cnVjdHMgZGVidWcgcHJvdG9jb2wgaGFuZGxlcnMKKyAqLworY2xhc3MgVERlYnVnUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKy8vIFRPRE8oZHJlaXNzKTogTW92ZSAocGFydCBvZikgVGhyaWZ0RGVidWdTdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgorc3RkOjpzdHJpbmcgVGhyaWZ0RGVidWdTdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgeworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKyAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CisKKyAgdHMud3JpdGUoJnByb3RvY29sKTsKKworICB1aW50OF90KiBidWY7CisgIHVpbnQzMl90IHNpemU7CisgIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Cit9CisKKy8vIFRPRE8oZHJlaXNzKTogVGhpcyBpcyBiYWRseSBicm9rZW4uICBEb24ndCB1c2UgaXQgdW5sZXNzIHlvdSBhcmUgbWUuCisjaWYgMAordGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0Pgorc3RkOjpzdHJpbmcgRGVidWdTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8T2JqZWN0PiYgdmVjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKKworICAvLyBJIGFtIGdyb3NzIQorICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKCJTb21lUmFuZG9tVmVjdG9yIik7CisKKyAgLy8gVE9ETzogRml4IHRoaXMgd2l0aCBhIHRyYWl0LgorICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbigoVFR5cGUpOTksIHZlYy5zaXplKCkpOworICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxPYmplY3Q+Ojpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHZlYy5iZWdpbigpOyBpdCAhPSB2ZWMuZW5kKCk7ICsraXQpIHsKKyAgICBpdC0+d3JpdGUoJnByb3RvY29sKTsKKyAgfQorICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICB1aW50OF90KiBidWY7CisgIHVpbnQzMl90IHNpemU7CisgIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Cit9CisjZW5kaWYgLy8gMAorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDJlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit2b2lkIFRIZWFkZXJQcm90b2NvbDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgaWYgKHByb3RvXyAmJiBwcm90b0lkXyA9PSB0cmFuc18tPmdldFByb3RvY29sSWQoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHByb3RvSWRfID0gdHJhbnNfLT5nZXRQcm90b2NvbElkKCk7CisKKyAgc3dpdGNoIChwcm90b0lkXykgeworICBjYXNlIFRfQklOQVJZX1BST1RPQ09MOgorICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sVDxUSGVhZGVyVHJhbnNwb3J0PiA+KHRyYW5zXyk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUX0NPTVBBQ1RfUFJPVE9DT0w6CisgICAgcHJvdG9fID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sVDxUSGVhZGVyVHJhbnNwb3J0PiA+KHRyYW5zXyk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQiKTsKKyAgfQorfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxSWQpIHsKKyAgcmVzZXRQcm90b2NvbCgpOyAvLyBSZXNldCBpbiBjYXNlIHdlIGNoYW5nZWQgcHJvdG9jb2xzCisgIHRyYW5zXy0+c2V0U2VxdWVuY2VOdW1iZXIoc2VxSWQpOworICByZXR1cm4gcHJvdG9fLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNZXNzYWdlRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlU3RydWN0QmVnaW4obmFtZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlU3RydWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUZpZWxkU3RvcCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNYXBFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUxpc3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVNldEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQm9vbCh2YWx1ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQnl0ZShieXRlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUkxNihpMTYpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTMyKGkzMik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJNjQoaTY0KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRG91YmxlKGR1Yik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVCaW5hcnkoc3RyKTsKK30KKworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcUlkKSB7CisgIC8vIFJlYWQgdGhlIG5leHQgZnJhbWUsIGFuZCBjaGFuZ2UgcHJvdG9jb2xzIGlmIG5lZWRlZAorICB0cnkgeworICAgIHRyYW5zXy0+cmVzZXRQcm90b2NvbCgpOworICAgIHJlc2V0UHJvdG9jb2woKTsKKyAgfSBjYXRjaCAoY29uc3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJiBleCkgeworICAgIHdyaXRlTWVzc2FnZUJlZ2luKCIiLCBUX0VYQ0VQVElPTiwgMCk7CisgICAgZXgud3JpdGUoKFRQcm90b2NvbCopdGhpcyk7CisgICAgd3JpdGVNZXNzYWdlRW5kKCk7CisgICAgdHJhbnNfLT5mbHVzaCgpOworCisgICAgLy8gVGhlIGZyYW1pbmcgaXMgc3RpbGwgZ29vZCwgYnV0IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcyBwcm90b2NvbC4KKyAgICAvLyBJbiB0aGUgZnV0dXJlLCB0aGlzIGNvdWxkIGJlIG1hZGUgYSBjbGllbnQtc2lkZSBvbmx5IGVycm9yIGlmCisgICAgLy8gY29ubmVjdGlvbiBwb29saW5nIGlzIHVzZWQuCisgICAgdGhyb3cgZXg7CisgIH0KKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNZXNzYWdlRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkTWVzc2FnZUVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cnVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRmllbGRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1hcEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZExpc3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTZXRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQm9vbCh2YWx1ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRCeXRlKGJ5dGUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJMTYoaTE2KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTMyKGkzMik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEk2NChpNjQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZERvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU3RyaW5nKHN0cik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgYmluYXJ5KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRCaW5hcnkoYmluYXJ5KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjaWZuZGVmIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTJiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIZWFkZXJUcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqIFRoZSBoZWFkZXIgcHJvdG9jb2wgZm9yIHRocmlmdC4gUmVhZHMgdW5mcmFtZWQsIGZyYW1lZCwgaGVhZGVyIGZvcm1hdCwKKyAqIGFuZCBodHRwCisgKgorICovCitjbGFzcyBUSGVhZGVyUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSGVhZGVyUHJvdG9jb2w+IHsKK3Byb3RlY3RlZDoKK3B1YmxpYzoKKyAgdm9pZCByZXNldFByb3RvY29sKCk7CisKKyAgZXhwbGljaXQgVEhlYWRlclByb3RvY29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b0lkID0gVF9DT01QQUNUX1BST1RPQ09MKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUSGVhZGVyUHJvdG9jb2w+KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydCh0cmFucykpKSwKKyAgICAgIHRyYW5zXyhzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRIZWFkZXJUcmFuc3BvcnQ+KGdldFRyYW5zcG9ydCgpKSksCisgICAgICBwcm90b0lkXyhwcm90b0lkKSB7CisgICAgdHJhbnNfLT5zZXRQcm90b2NvbElkKHByb3RvSWQpOworICAgIHJlc2V0UHJvdG9jb2woKTsKKyAgfQorCisgIFRIZWFkZXJQcm90b2NvbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIGluVHJhbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIG91dFRyYW5zLAorICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9JZCA9IFRfQ09NUEFDVF9QUk9UT0NPTCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPigKKyAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQoaW5UcmFucywgb3V0VHJhbnMpKSksCisgICAgICB0cmFuc18oc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUSGVhZGVyVHJhbnNwb3J0PihnZXRUcmFuc3BvcnQoKSkpLAorICAgICAgcHJvdG9JZF8ocHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICB+VEhlYWRlclByb3RvY29sKCkge30KKworICAvKioKKyAgICogRnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBoZWFkZXJzIGJ5IGNhbGxpbmcgaW50byBUSGVhZGVyVHJhbnNwb3J0CisgICAqLworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICB0eXBlZGVmIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwIFN0cmluZ1RvU3RyaW5nTWFwOworCisgIC8vIHRoZXNlIHdvcmsgd2l0aCB3cml0ZSBoZWFkZXJzCisgIHZvaWQgc2V0SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIHRyYW5zXy0+c2V0SGVhZGVyKGtleSwgdmFsdWUpOworICB9CisKKyAgdm9pZCBjbGVhckhlYWRlcnMoKSB7IHRyYW5zXy0+Y2xlYXJIZWFkZXJzKCk7IH0KKworICBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0V3JpdGVIZWFkZXJzKCkgeyByZXR1cm4gdHJhbnNfLT5nZXRXcml0ZUhlYWRlcnMoKTsgfQorCisgIC8vIHRoZXNlIHdvcmsgd2l0aCByZWFkIGhlYWRlcnMKKyAgY29uc3QgU3RyaW5nVG9TdHJpbmdNYXAmIGdldEhlYWRlcnMoKSBjb25zdCB7IHJldHVybiB0cmFuc18tPmdldEhlYWRlcnMoKTsgfQorCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFJZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcUlkKTsKKworICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUSGVhZGVyUHJvdG9jb2w+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgYmluYXJ5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VEhlYWRlclRyYW5zcG9ydD4gdHJhbnNfOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvXzsKKyAgdWludDMyX3QgcHJvdG9JZF87Cit9OworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbAorICAgICAgICA9IG5ldyBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIHRyYW5zLCBUX0JJTkFSWV9QUk9UT0NPTCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KGhlYWRlclByb3RvY29sKTsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpblRyYW5zLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gb3V0VHJhbnMpIHsKKyAgICBUSGVhZGVyUHJvdG9jb2wqIGhlYWRlclByb3RvY29sID0gbmV3IFRIZWFkZXJQcm90b2NvbChpblRyYW5zLCBvdXRUcmFucywgVF9CSU5BUllfUFJPVE9DT0wpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihoZWFkZXJQcm90b2NvbCk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NmZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcApAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxib29zdC9sb2NhbGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMvZnBjbGFzc2lmeS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9zaWduLmhwcD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8vIFN0YXRpYyBkYXRhCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0U3RhcnQgPSAneyc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdEVuZCA9ICd9JzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlTdGFydCA9ICdbJzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlFbmQgPSAnXSc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlBhaXJTZXBhcmF0b3IgPSAnOic7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkJhY2tzbGFzaCA9ICdcXCc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORXNjYXBlQ2hhciA9ICd1JzsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtKU09ORXNjYXBlUHJlZml4KCJcXHUwMCIpOworCitzdGF0aWMgY29uc3QgdWludDMyX3Qga1RocmlmdFZlcnNpb24xID0gMTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnROYW4oIk5hTiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnRJbmZpbml0eSgiSW5maW5pdHkiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSgiLUluZmluaXR5Iik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVCb29sKCJ0ZiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUJ5dGUoImk4Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTE2KCJpMTYiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJMzIoImkzMiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUk2NCgiaTY0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lRG91YmxlKCJkYmwiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTdHJ1Y3QoInJlYyIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVN0cmluZygic3RyIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lTWFwKCJtYXAiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVMaXN0KCJsc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTZXQoInNldCIpOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkgeworICBzd2l0Y2ggKHR5cGVJRCkgeworICBjYXNlIFRfQk9PTDoKKyAgICByZXR1cm4ga1R5cGVOYW1lQm9vbDsKKyAgY2FzZSBUX0JZVEU6CisgICAgcmV0dXJuIGtUeXBlTmFtZUJ5dGU7CisgIGNhc2UgVF9JMTY6CisgICAgcmV0dXJuIGtUeXBlTmFtZUkxNjsKKyAgY2FzZSBUX0kzMjoKKyAgICByZXR1cm4ga1R5cGVOYW1lSTMyOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiBrVHlwZU5hbWVJNjQ7CisgIGNhc2UgVF9ET1VCTEU6CisgICAgcmV0dXJuIGtUeXBlTmFtZURvdWJsZTsKKyAgY2FzZSBUX1NUUklORzoKKyAgICByZXR1cm4ga1R5cGVOYW1lU3RyaW5nOworICBjYXNlIFRfU1RSVUNUOgorICAgIHJldHVybiBrVHlwZU5hbWVTdHJ1Y3Q7CisgIGNhc2UgVF9NQVA6CisgICAgcmV0dXJuIGtUeXBlTmFtZU1hcDsKKyAgY2FzZSBUX1NFVDoKKyAgICByZXR1cm4ga1R5cGVOYW1lU2V0OworICBjYXNlIFRfTElTVDoKKyAgICByZXR1cm4ga1R5cGVOYW1lTGlzdDsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICB9Cit9CisKK3N0YXRpYyBUVHlwZSBnZXRUeXBlSURGb3JUeXBlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICBUVHlwZSByZXN1bHQgPSBUX1NUT1A7IC8vIFNlbnRpbmVsIHZhbHVlCisgIGlmIChuYW1lLmxlbmd0aCgpID4gMSkgeworICAgIHN3aXRjaCAobmFtZVswXSkgeworICAgIGNhc2UgJ2QnOgorICAgICAgcmVzdWx0ID0gVF9ET1VCTEU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgIHN3aXRjaCAobmFtZVsxXSkgeworICAgICAgY2FzZSAnOCc6CisgICAgICAgIHJlc3VsdCA9IFRfQllURTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcxJzoKKyAgICAgICAgcmVzdWx0ID0gVF9JMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMyc6CisgICAgICAgIHJlc3VsdCA9IFRfSTMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzYnOgorICAgICAgICByZXN1bHQgPSBUX0k2NDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgIHJlc3VsdCA9IFRfTElTVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgcmVzdWx0ID0gVF9NQVA7CisgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJlc3VsdCA9IFRfU1RSVUNUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBpZiAobmFtZVsxXSA9PSAndCcpIHsKKyAgICAgICAgcmVzdWx0ID0gVF9TVFJJTkc7CisgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICAgIHJlc3VsdCA9IFRfU0VUOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICByZXN1bHQgPSBUX0JPT0w7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHJlc3VsdCA9PSBUX1NUT1ApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycworLy8gIDAgOiBlc2NhcGUgdXNpbmcgIlx1MDB4eCIgbm90YXRpb24KKy8vICAxIDoganVzdCBvdXRwdXQgaW5kZXgKKy8vIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05DaGFyVGFibGVbMHgzMF0gPSB7CisgICAgLy8gIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgJ2InLAorICAgICd0JywKKyAgICAnbicsCisgICAgMCwKKyAgICAnZicsCisgICAgJ3InLAorICAgIDAsCisgICAgMCwgLy8gMAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsIC8vIDEKKyAgICAxLAorICAgIDEsCisgICAgJyInLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsIC8vIDIKK307CisKKy8vIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGtFc2NhcGVDaGFyVmFscy4KKy8vIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCisvLyBpdCBpcyBub3QgaW4gdGhlIFJGQworY29uc3Qgc3RhdGljIHN0ZDo6c3RyaW5nIGtFc2NhcGVDaGFycygiXCJcXGJmbnJ0Iik7CisKKy8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgorLy8ga0VzY2FwZUNoYXJzCitjb25zdCBzdGF0aWMgdWludDhfdCBrRXNjYXBlQ2hhclZhbHNbN10gPSB7CisgICAgJyInLAorICAgICdcXCcsCisgICAgJ1xiJywKKyAgICAnXGYnLAorICAgICdcbicsCisgICAgJ1xyJywKKyAgICAnXHQnLAorfTsKKworLy8gU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKKworLy8gUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFuc3BvcnQgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZQorLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgorLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90Lgorc3RhdGljIHVpbnQzMl90IHJlYWRTeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyLCB1aW50OF90IGNoKSB7CisgIHVpbnQ4X3QgY2gyID0gcmVhZGVyLnJlYWQoKTsKKyAgaWYgKGNoMiAhPSBjaCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gsIDEpICsgIlwnOyBnb3QgXCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaDIsIDEpICsgIlwnLiIpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgb2YgYSBoZXggY2hhcmFjdGVyIGNoLgorLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgdGhlIGNoYXJhY3RlciBpcyBub3QgWzAtOWEtZl0uCitzdGF0aWMgdWludDhfdCBoZXhWYWwodWludDhfdCBjaCkgeworICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHsKKyAgICByZXR1cm4gY2ggLSAnMCc7CisgIH0gZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKKyAgICByZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggdmFsIChbMC05YS1mXSk7IGdvdCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcJy4iKTsKKyAgfQorfQorCisvLyBSZXR1cm4gdGhlIGhleCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHRoZSBpbnRlZ2VyIHZhbC4gVGhlIHZhbHVlIGlzIG1hc2tlZAorLy8gdG8gbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlLgorc3RhdGljIHVpbnQ4X3QgaGV4Q2hhcih1aW50OF90IHZhbCkgeworICB2YWwgJj0gMHgwRjsKKyAgaWYgKHZhbCA8IDEwKSB7CisgICAgcmV0dXJuIHZhbCArICcwJzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdmFsIC0gMTAgKyAnYSc7CisgIH0KK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjaCBpcyBpbiBbLSswLTkuRWVdOyBmYWxzZSBvdGhlcndpc2UKK3N0YXRpYyBib29sIGlzSlNPTk51bWVyaWModWludDhfdCBjaCkgeworICBzd2l0Y2ggKGNoKSB7CisgIGNhc2UgJysnOgorICBjYXNlICctJzoKKyAgY2FzZSAnLic6CisgIGNhc2UgJzAnOgorICBjYXNlICcxJzoKKyAgY2FzZSAnMic6CisgIGNhc2UgJzMnOgorICBjYXNlICc0JzoKKyAgY2FzZSAnNSc6CisgIGNhc2UgJzYnOgorICBjYXNlICc3JzoKKyAgY2FzZSAnOCc6CisgIGNhc2UgJzknOgorICBjYXNlICdFJzoKKyAgY2FzZSAnZSc6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGhpZ2ggc3Vycm9nYXRlCitzdGF0aWMgYm9vbCBpc0hpZ2hTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEODAwICYmIHZhbCA8PSAweERCRkY7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHVuaXQgaXMgbG93IHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNMb3dTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEQzAwICYmIHZhbCA8PSAweERGRkY7Cit9CisKKy8qKgorICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKU09OIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKKyAqIGltcGxlbWVudGF0aW9ucworICovCitjbGFzcyBUSlNPTkNvbnRleHQgeworCitwdWJsaWM6CisgIFRKU09OQ29udGV4dCgpe307CisKKyAgdmlydHVhbCB+VEpTT05Db250ZXh0KCl7fTsKKworICAvKioKKyAgICogV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgICAodm9pZCl0cmFuczsKKyAgICByZXR1cm4gMDsKKyAgfTsKKworICAvKioKKyAgICogUmVhZCBjb250ZXh0IGRhdGEgZnJvbSB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgICAodm9pZClyZWFkZXI7CisgICAgcmV0dXJuIDA7CisgIH07CisKKyAgLyoqCisgICAqIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgorICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7IHJldHVybiBmYWxzZTsgfQorfTsKKworLy8gQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKK2NsYXNzIEpTT05QYWlyQ29udGV4dCA6IHB1YmxpYyBUSlNPTkNvbnRleHQgeworCitwdWJsaWM6CisgIEpTT05QYWlyQ29udGV4dCgpIDogZmlyc3RfKHRydWUpLCBjb2xvbl8odHJ1ZSkge30KKworICB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0JiB0cmFucykgeworICAgIGlmIChmaXJzdF8pIHsKKyAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICB0cmFucy53cml0ZShjb2xvbl8gPyAma0pTT05QYWlyU2VwYXJhdG9yIDogJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7CisgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlcikgeworICAgIGlmIChmaXJzdF8pIHsKKyAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICB1aW50OF90IGNoID0gKGNvbG9uXyA/IGtKU09OUGFpclNlcGFyYXRvciA6IGtKU09ORWxlbVNlcGFyYXRvcik7CisgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwgY2gpOworICAgIH0KKyAgfQorCisgIC8vIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKKyAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsgcmV0dXJuIGNvbG9uXzsgfQorCitwcml2YXRlOgorICBib29sIGZpcnN0XzsKKyAgYm9vbCBjb2xvbl87Cit9OworCisvLyBDb250ZXh0IGNsYXNzIGZvciBsaXN0cworY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7CisKK3B1YmxpYzoKKyAgSlNPTkxpc3RDb250ZXh0KCkgOiBmaXJzdF8odHJ1ZSkge30KKworICB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0JiB0cmFucykgeworICAgIGlmIChmaXJzdF8pIHsKKyAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyYW5zLndyaXRlKCZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlcikgeworICAgIGlmIChmaXJzdF8pIHsKKyAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGtKU09ORWxlbVNlcGFyYXRvcik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIGJvb2wgZmlyc3RfOworfTsKKworVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQorICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4ocHRyYW5zKSwKKyAgICB0cmFuc18ocHRyYW5zLmdldCgpKSwKKyAgICBjb250ZXh0XyhuZXcgVEpTT05Db250ZXh0KCkpLAorICAgIHJlYWRlcl8oKnB0cmFucykgeworfQorCitUSlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHsKK30KKwordm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7CisgIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKKyAgY29udGV4dF8gPSBjOworfQorCit2b2lkIFRKU09OUHJvdG9jb2w6OnBvcENvbnRleHQoKSB7CisgIGNvbnRleHRfID0gY29udGV4dHNfLnRvcCgpOworICBjb250ZXh0c18ucG9wKCk7Cit9CisKKy8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgYSBKU09OIGVzY2FwZSBzZXF1ZW5jZSAoIlx1MDB4eCIpCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopa0pTT05Fc2NhcGVQcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oa0pTT05Fc2NhcGVQcmVmaXgubGVuZ3RoKCkpKTsKKyAgdWludDhfdCBvdXRDaCA9IGhleENoYXIoY2ggPj4gNCk7CisgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKKyAgb3V0Q2ggPSBoZXhDaGFyKGNoKTsKKyAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOworICByZXR1cm4gNjsKK30KKworLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQ2hhcih1aW50OF90IGNoKSB7CisgIGlmIChjaCA+PSAweDMwKSB7CisgICAgaWYgKGNoID09IGtKU09OQmFja3NsYXNoKSB7IC8vIE9ubHkgc3BlY2lhbCBjaGFyYWN0ZXIgPj0gMHgzMCBpcyAnXCcKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKKyAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSB7CisgICAgICB0cmFuc18tPndyaXRlKCZjaCwgMSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDhfdCBvdXRDaCA9IGtKU09OQ2hhclRhYmxlW2NoXTsKKyAgICAvLyBDaGVjayBpZiByZWd1bGFyIGNoYXJhY3RlciwgYmFja3NsYXNoIGVzY2FwZWQsIG9yIEpTT04gZXNjYXBlZAorICAgIGlmIChvdXRDaCA9PSAxKSB7CisgICAgICB0cmFuc18tPndyaXRlKCZjaCwgMSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKG91dENoID4gMSkgeworICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOworICAgICAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOworICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKTsKKyAgICB9CisgIH0KK30KKworLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIHN0ciBhcyBhIEpTT04gc3RyaW5nLCBlc2NhcGluZworLy8gY2hhcmFjdGVycyBhcyBhcHByb3ByaWF0ZS4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKKyAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlcihzdHIuYmVnaW4oKSk7CisgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmQoc3RyLmVuZCgpKTsKKyAgd2hpbGUgKGl0ZXIgIT0gZW5kKSB7CisgICAgcmVzdWx0ICs9IHdyaXRlSlNPTkNoYXIoKml0ZXIrKyk7CisgIH0KKyAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgYXMgSlNPTiBzdHJpbmcsIGJhc2U2NC1lbmNvZGluZworLy8gdGhlIHN0cmluZydzIGNvbnRlbnRzLCBhbmQgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKKyAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICB1aW50OF90IGJbNF07CisgIGNvbnN0IHVpbnQ4X3QqIGJ5dGVzID0gKGNvbnN0IHVpbnQ4X3QqKXN0ci5jX3N0cigpOworICBpZiAoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQzMl90IGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICB3aGlsZSAobGVuID49IDMpIHsKKyAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBiYXNlNjRfZW5jb2RlKGJ5dGVzLCAzLCBiKTsKKyAgICB0cmFuc18tPndyaXRlKGIsIDQpOworICAgIHJlc3VsdCArPSA0OworICAgIGJ5dGVzICs9IDM7CisgICAgbGVuIC09IDM7CisgIH0KKyAgaWYgKGxlbikgeyAvLyBIYW5kbGUgcmVtYWluZGVyCisgICAgYmFzZTY0X2VuY29kZShieXRlcywgbGVuLCBiKTsKKyAgICB0cmFuc18tPndyaXRlKGIsIGxlbiArIDEpOworICAgIHJlc3VsdCArPSBsZW4gKyAxOworICB9CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ29udmVydCB0aGUgZ2l2ZW4gaW50ZWdlciB0eXBlIHRvIGEgSlNPTiBudW1iZXIsIG9yIGEgc3RyaW5nCisvLyBpZiB0aGUgY29udGV4dCByZXF1aXJlcyBpdCAoZWc6IGtleSBpbiBhIG1hcCBwYWlyKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHN0ZDo6c3RyaW5nIHZhbCh0b19zdHJpbmcobnVtKSk7CisgIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIGlmICh2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKKyAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBkb3VibGVUb1N0cmluZyhkb3VibGUgZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOworICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBtYXhfZGlnaXRzMTAgPSAyICsgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMDsKKyAgc3RyLnByZWNpc2lvbihtYXhfZGlnaXRzMTApOworICBzdHIgPDwgZDsKKyAgcmV0dXJuIHN0ci5zdHIoKTsKK30KK30KKworLy8gQ29udmVydCB0aGUgZ2l2ZW4gZG91YmxlIHRvIGEgSlNPTiBzdHJpbmcsIHdoaWNoIGlzIGVpdGhlciB0aGUgbnVtYmVyLAorLy8gIk5hTiIgb3IgIkluZmluaXR5IiBvciAiLUluZmluaXR5Ii4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgc3RkOjpzdHJpbmcgdmFsOworCisgIGJvb2wgc3BlY2lhbCA9IGZhbHNlOworICBzd2l0Y2ggKGJvb3N0OjptYXRoOjpmcGNsYXNzaWZ5KG51bSkpIHsKKyAgY2FzZSBGUF9JTkZJTklURToKKyAgICBpZiAoYm9vc3Q6Om1hdGg6OnNpZ25iaXQobnVtKSkgeworICAgICAgdmFsID0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbCA9IGtUaHJpZnRJbmZpbml0eTsKKyAgICB9CisgICAgc3BlY2lhbCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgRlBfTkFOOgorICAgIHZhbCA9IGtUaHJpZnROYW47CisgICAgc3BlY2lhbCA9IHRydWU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdmFsID0gZG91YmxlVG9TdHJpbmcobnVtKTsKKyAgICBicmVhazsKKyAgfQorCisgIGJvb2wgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0Xy0+ZXNjYXBlTnVtKCk7CisgIGlmIChlc2NhcGVOdW0pIHsKKyAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgICAgcmVzdWx0ICs9IDE7CisgIH0KKyAgaWYgKHZhbC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90Kil2YWwuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSkpOworICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSk7CisgIGlmIChlc2NhcGVOdW0pIHsKKyAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgICAgcmVzdWx0ICs9IDE7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0U3RhcnQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RTdGFydCwgMSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOworICByZXR1cm4gcmVzdWx0ICsgMTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0RW5kKCkgeworICBwb3BDb250ZXh0KCk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0RW5kLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5U3RhcnQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheVN0YXJ0LCAxKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQgKyAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheUVuZCgpIHsKKyAgcG9wQ29udGV4dCgpOworICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5RW5kLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKGtUaHJpZnRWZXJzaW9uMSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcobmFtZSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2VUeXBlKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoc2VxaWQpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OSW50ZWdlcihmaWVsZElkKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGRUeXBlKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGtleVR5cGUpKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRCh2YWxUeXBlKSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOworICByZXN1bHQgKz0gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTk9iamVjdEVuZCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7CisgIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7CisgIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcih2YWx1ZSk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UgdG9fc3RyaW5nIHNlZXMKKyAgLy8gaW50OF90IGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCisgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKChpbnQxNl90KWJ5dGUpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMTYpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMzIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpNjQpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHJldHVybiB3cml0ZUpTT05Eb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gd3JpdGVKU09OU3RyaW5nKHN0cik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkJhc2U2NChzdHIpOworfQorCisvKioKKyAqIFJlYWRpbmcgZnVuY3Rpb25zCisgKi8KKworLy8gUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCkgeworICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOworfQorCisvLyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCisvLyB0aGUgVVRGLTE2IGNvZGUgdW5pdCB2aWEgb3V0LgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpIHsKKyAgdWludDhfdCBiWzRdOworICBiWzBdID0gcmVhZGVyXy5yZWFkKCk7CisgIGJbMV0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlsyXSA9IHJlYWRlcl8ucmVhZCgpOworICBiWzNdID0gcmVhZGVyXy5yZWFkKCk7CisKKyAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgMTIpCisgICAgKyAoaGV4VmFsKGJbMV0pIDw8IDgpICsgKGhleFZhbChiWzJdKSA8PCA0KSArIGhleFZhbChiWzNdKTsKKworICByZXR1cm4gNDsKK30KKworLy8gRGVjb2RlcyBhIEpTT04gc3RyaW5nLCBpbmNsdWRpbmcgdW5lc2NhcGluZywgYW5kIHJldHVybnMgdGhlIHN0cmluZyB2aWEgc3RyCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCBib29sIHNraXBDb250ZXh0KSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IChza2lwQ29udGV4dCA/IDAgOiBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKSk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29kZXVuaXRzOworICB1aW50OF90IGNoOworICBzdHIuY2xlYXIoKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICsrcmVzdWx0OworICAgIGlmIChjaCA9PSBrSlNPTlN0cmluZ0RlbGltaXRlcikgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjaCA9PSBrSlNPTkJhY2tzbGFzaCkgeworICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgICsrcmVzdWx0OworICAgICAgaWYgKGNoID09IGtKU09ORXNjYXBlQ2hhcikgeworICAgICAgICB1aW50MTZfdCBjcDsKKyAgICAgICAgcmVzdWx0ICs9IHJlYWRKU09ORXNjYXBlQ2hhcigmY3ApOworICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKGNwKSkgeworICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soY3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShjcCkKKyAgICAgICAgICAgICAgICYmIGNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGhpZ2ggc3Vycm9nYXRlIHBhaXIuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soY3ApOworICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soMCk7CisgICAgICAgICAgc3RyICs9IGJvb3N0Ojpsb2NhbGU6OmNvbnY6OnV0Zl90b191dGY8Y2hhcj4oY29kZXVuaXRzLmRhdGEoKSk7CisgICAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgcG9zID0ga0VzY2FwZUNoYXJzLmZpbmQoY2gpOworICAgICAgICBpZiAocG9zID09IGtFc2NhcGVDaGFycy5ucG9zKSB7CisgICAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgKyBzdGQ6OnN0cmluZygoY29uc3QgY2hhciopJmNoLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInLiIpOworICAgICAgICB9CisgICAgICAgIGNoID0ga0VzY2FwZUNoYXJWYWxzW3Bvc107CisgICAgICB9CisgICAgfQorICAgIGlmICghY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZSBwYWlyLiIpOworICAgIH0KKyAgICBzdHIgKz0gY2g7CisgIH0KKworICBpZiAoIWNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZSBwYWlyLiIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TdHJpbmcodG1wKTsKKyAgdWludDhfdCogYiA9ICh1aW50OF90Kil0bXAuY19zdHIoKTsKKyAgaWYgKHRtcC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wLmxlbmd0aCgpKTsKKyAgc3RyLmNsZWFyKCk7CisgIC8vIElnbm9yZSBwYWRkaW5nCisgIGlmIChsZW4gPj0gMikgIHsKKyAgICB1aW50MzJfdCBib3VuZCA9IGxlbiAtIDI7CisgICAgZm9yICh1aW50MzJfdCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CisgIH0KKyAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgYmFzZTY0X2RlY29kZShiLCA0KTsKKyAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyKiliLCAzKTsKKyAgICBiICs9IDQ7CisgICAgbGVuIC09IDQ7CisgIH0KKyAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgaWYgKGxlbiA+IDEpIHsKKyAgICBiYXNlNjRfZGVjb2RlKGIsIGxlbik7CisgICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciopYiwgbGVuIC0gMSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90CisvLyBhIHZhbGlkIEpTT04gbnVtZXJpYyBjaGFyYWN0ZXIuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIHN0ci5jbGVhcigpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBpZiAoIWlzSlNPTk51bWVyaWMoY2gpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmVhZGVyXy5yZWFkKCk7CisgICAgc3RyICs9IGNoOworICAgICsrcmVzdWx0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK25hbWVzcGFjZSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICBUIHQ7CisgIHN0ZDo6aXN0cmluZ3N0cmVhbSBzdHIocyk7CisgIHN0ci5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgc3RyID4+IHQ7CisgIGlmIChzdHIuYmFkKCkgfHwgIXN0ci5lb2YoKSkKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Iocyk7CisgIHJldHVybiB0OworfQorfQorCisvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCisvLyByZXR1cm5pbmcgdGhlbSB2aWEgbnVtCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OSW50ZWdlcihOdW1iZXJUeXBlJiBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgfQorICBzdGQ6OnN0cmluZyBzdHI7CisgIHJlc3VsdCArPSByZWFkSlNPTk51bWVyaWNDaGFycyhzdHIpOworICB0cnkgeworICAgIG51bSA9IGZyb21TdHJpbmc8TnVtYmVyVHlwZT4oc3RyKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJikgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKKyAgfQorICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkRvdWJsZShkb3VibGUmIG51bSkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKKyAgc3RkOjpzdHJpbmcgc3RyOworICBpZiAocmVhZGVyXy5wZWVrKCkgPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcoc3RyLCB0cnVlKTsKKyAgICAvLyBDaGVjayBmb3IgTmFOLCBJbmZpbml0eSBhbmQgLUluZmluaXR5CisgICAgaWYgKHN0ciA9PSBrVGhyaWZ0TmFuKSB7CisgICAgICBudW0gPSBIVUdFX1ZBTCAvIEhVR0VfVkFMOyAvLyBnZW5lcmF0ZXMgTmFOCisgICAgfSBlbHNlIGlmIChzdHIgPT0ga1RocmlmdEluZmluaXR5KSB7CisgICAgICBudW0gPSBIVUdFX1ZBTDsKKyAgICB9IGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSkgeworICAgICAgbnVtID0gLUhVR0VfVkFMOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICAgIH0KKyAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKKyAgICB0cnkgeworICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0U3RhcnQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOworICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OT2JqZWN0U3RhcnQpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RFbmQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdEVuZCk7CisgIHBvcENvbnRleHQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheUVuZCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OQXJyYXlFbmQpOworICBwb3BDb250ZXh0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOworICB1aW50NjRfdCB0bXBWYWwgPSAwOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgIT0ga1RocmlmdFZlcnNpb24xKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgfQorICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcobmFtZSk7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXRtcFZhbDsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBzZXFpZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRtcFZhbCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNZXNzYWdlRW5kKCkgeworICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgcmV0dXJuIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIC8vIENoZWNrIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisgIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgaWYgKGNoID09IGtKU09OT2JqZWN0RW5kKSB7CisgICAgZmllbGRUeXBlID0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1A7CisgIH0gZWxzZSB7CisgICAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgICBzdGQ6OnN0cmluZyB0bXBTdHI7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICAgIGlmICh0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkpCisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgICBmaWVsZElkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4odG1wVmFsKTsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICAgIGZpZWxkVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgeworICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgc3RkOjpzdHJpbmcgdG1wU3RyOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIGtleVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAgdmFsVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcFZhbCk7CisgIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSByZWFkSlNPTkFycmF5RW5kKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50NjRfdCB0bXBWYWwgPSAwOworICBzdGQ6OnN0cmluZyB0bXBTdHI7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgc3RkOjpzdHJpbmcgdG1wU3RyOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFNldEVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcih2YWx1ZSk7Cit9CisKKy8vIHJlYWRCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHByb3Blcmx5IGJlY2F1c2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzIGludDhfdAorLy8gYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICBpbnQxNl90IHRtcCA9IChpbnQxNl90KWJ5dGU7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OSW50ZWdlcih0bXApOworICBhc3NlcnQodG1wIDwgMjU2KTsKKyAgYnl0ZSA9IChpbnQ4X3QpdG1wOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkxNik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIoaTMyKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpNjQpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHJldHVybiByZWFkSlNPTkRvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKHN0cik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcmVhZEpTT05CYXNlNjQoc3RyKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJmODcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaApAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHN0YWNrPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgorY2xhc3MgVEpTT05Db250ZXh0OworCisvKioKKyAqIEpTT04gcHJvdG9jb2wgZm9yIFRocmlmdC4KKyAqCisgKiBJbXBsZW1lbnRzIGEgcHJvdG9jb2wgd2hpY2ggdXNlcyBKU09OIGFzIHRoZSB3aXJlLWZvcm1hdC4KKyAqCisgKiBUaHJpZnQgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGFzIGRlc2NyaWJlZCBiZWxvdzoKKyAqCisgKiAxLiBFdmVyeSBUaHJpZnQgaW50ZWdlciB0eXBlIGlzIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBudW1iZXIuCisgKgorICogMi4gVGhyaWZ0IGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gbnVtYmVycy4gU29tZSBzcGVjaWFsIHZhbHVlcyBhcmUKKyAqICAgIHJlcHJlc2VudGVkIGFzIHN0cmluZ3M6CisgKiAgICBhLiAiTmFOIiBmb3Igbm90LWEtbnVtYmVyIHZhbHVlcworICogICAgYi4gIkluZmluaXR5IiBmb3IgcG9zaXRpdmUgaW5maW5pdHkKKyAqICAgIGMuICItSW5maW5pdHkiIGZvciBuZWdhdGl2ZSBpbmZpbml0eQorICoKKyAqIDMuIFRocmlmdCBzdHJpbmcgdmFsdWVzIGFyZSBlbWl0dGVkIGFzIEpTT04gc3RyaW5ncywgd2l0aCBhcHByb3ByaWF0ZQorICogICAgZXNjYXBpbmcuCisgKgorICogNC4gVGhyaWZ0IGJpbmFyeSB2YWx1ZXMgYXJlIGVuY29kZWQgaW50byBCYXNlNjQgYW5kIGVtaXR0ZWQgYXMgSlNPTiBzdHJpbmdzLgorICogICAgVGhlIHJlYWRCaW5hcnkoKSBtZXRob2QgaXMgd3JpdHRlbiBzdWNoIHRoYXQgaXQgd2lsbCBwcm9wZXJseSBza2lwIGlmCisgKiAgICBjYWxsZWQgb24gYSBUaHJpZnQgc3RyaW5nIChhbHRob3VnaCBpdCB3aWxsIGRlY29kZSBnYXJiYWdlIGRhdGEpLgorICoKKyAqICAgIE5PVEU6IEJhc2U2NCBwYWRkaW5nIGlzIG9wdGlvbmFsIGZvciBUaHJpZnQgYmluYXJ5IHZhbHVlIGVuY29kaW5nLiBTbworICogICAgdGhlIHJlYWRCaW5hcnkoKSBtZXRob2QgbmVlZHMgdG8gZGVjb2RlIGJvdGggaW5wdXQgc3RyaW5ncyB3aXRoIHBhZGRpbmcKKyAqICAgIGFuZCB0aG9zZSB3aXRob3V0IG9uZS4KKyAqCisgKiA1LiBUaHJpZnQgc3RydWN0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBvYmplY3RzLCB3aXRoIHRoZSBmaWVsZCBJRCBhcyB0aGUKKyAqICAgIGtleSwgYW5kIHRoZSBmaWVsZCB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIEpTT04gb2JqZWN0IHdpdGggYSBzaW5nbGUKKyAqICAgIGtleS12YWx1ZSBwYWlyLiBUaGUga2V5IGlzIGEgc2hvcnQgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoYXQgdHlwZSwKKyAqICAgIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZS4gVGhlIHZhbGlkIHR5cGUgaWRlbnRpZmllcnMgYXJlOiAidGYiIGZvciBib29sLAorICogICAgImk4IiBmb3IgYnl0ZSwgImkxNiIgZm9yIDE2LWJpdCBpbnRlZ2VyLCAiaTMyIiBmb3IgMzItYml0IGludGVnZXIsICJpNjQiCisgKiAgICBmb3IgNjQtYml0IGludGVnZXIsICJkYmwiIGZvciBkb3VibGUtcHJlY2lzaW9uIGxvYXRpbmcgcG9pbnQsICJzdHIiIGZvcgorICogICAgc3RyaW5nIChpbmNsdWRpbmcgYmluYXJ5KSwgInJlYyIgZm9yIHN0cnVjdCAoInJlY29yZHMiKSwgIm1hcCIgZm9yIG1hcCwKKyAqICAgICJsc3QiIGZvciBsaXN0LCAic2V0IiBmb3Igc2V0LgorICoKKyAqIDYuIFRocmlmdCBsaXN0cyBhbmQgc2V0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0CisgKiAgICBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIFRocmlmdAorICogICAgZWxlbWVudCB0eXBlIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIGNvdW50IG9mCisgKiAgICB0aGUgVGhyaWZ0IGVsZW1lbnRzLiBUaGUgVGhyaWZ0IGVsZW1lbnRzIHRoZW4gZm9sbG93LgorICoKKyAqIDcuIFRocmlmdCBtYXBzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIGFycmF5cywgd2l0aCB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzCisgKiAgICBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXJzIGZvciB0aGUgVGhyaWZ0IGtleSB0eXBlCisgKiAgICBhbmQgdmFsdWUgdHlwZSwgZm9sbG93ZWQgYnkgdGhlIGNvdW50IG9mIHRoZSBUaHJpZnQgcGFpcnMsIGZvbGxvd2VkIGJ5IGEKKyAqICAgIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycy4gTm90ZSB0aGF0IEpTT04ga2V5cyBjYW4gb25seQorICogICAgYmUgc3RyaW5ncywgd2hpY2ggbWVhbnMgdGhhdCB0aGUga2V5IHR5cGUgb2YgdGhlIFRocmlmdCBtYXAgc2hvdWxkIGJlCisgKiAgICByZXN0cmljdGVkIHRvIG51bWVyaWMgb3Igc3RyaW5nIHR5cGVzIC0tIGluIHRoZSBjYXNlIG9mIG51bWVyaWNzLCB0aGV5CisgKiAgICBhcmUgc2VyaWFsaXplZCBhcyBzdHJpbmdzLgorICoKKyAqIDguIFRocmlmdCBtZXNzYWdlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIHByb3RvY29sCisgKiAgICB2ZXJzaW9uICMsIHRoZSBtZXNzYWdlIG5hbWUsIHRoZSBtZXNzYWdlIHR5cGUsIGFuZCB0aGUgc2VxdWVuY2UgSUQgYXMKKyAqICAgIHRoZSBmaXJzdCA0IGVsZW1lbnRzLgorICoKKyAqIE1vcmUgZGlzY3Vzc2lvbiBvZiB0aGUgZG91YmxlIGhhbmRsaW5nIGlzIHByb2JhYmx5IHdhcnJhbnRlZC4gVGhlIGFpbSBvZgorICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0aGUgYmVoYXZpb3IKKyAqIG9mIEphdmEncyBEb3VibGUudG9TdHJpbmcoKSwgd2hpY2ggaGFzIG5vIHByZWNpc2lvbiBsb3NzLiAgSW1wbGVtZW50b3JzIGluCisgKiBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIHN0cml2ZSB0byBhY2hpZXZlIHRoYXQgd2hlcmUgcG9zc2libGUuIEkgaGF2ZSBub3QKKyAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIHN0ZDo6aXN0cmluZ3N0cmVhbTo6b3BlcmF0b3I+Piwgd2hpY2ggaXMgZG9pbmcgdGhhdAorICogd29yayBmb3IgbWUgaW4gQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUKKyAqIGltcHJvdmVtZW50LiBJIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyCisgKiBsYW5ndWFnZXMgY291bGQgYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtCisgKiBjb25zaXN0ZW5jeS4KKyAqCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPiB7CitwdWJsaWM6CisgIFRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk7CisKKyAgflRKU09OUHJvdG9jb2woKTsKKworcHJpdmF0ZToKKyAgdm9pZCBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKTsKKworICB2b2lkIHBvcENvbnRleHQoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgY2gpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkNoYXIodWludDhfdCBjaCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgdWludDMyX3Qgd3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pOworCisgIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OQXJyYXlTdGFydCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkFycmF5RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpOworCisgIHVpbnQzMl90IHJlYWRKU09ORXNjYXBlQ2hhcih1aW50MTZfdCogb3V0KTsKKworICB1aW50MzJfdCByZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCBib29sIHNraXBDb250ZXh0ID0gZmFsc2UpOworCisgIHVpbnQzMl90IHJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgorICB1aW50MzJfdCByZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSYgbnVtKTsKKworICB1aW50MzJfdCByZWFkSlNPTkRvdWJsZShkb3VibGUmIG51bSk7CisKKyAgdWludDMyX3QgcmVhZEpTT05PYmplY3RTdGFydCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05BcnJheVN0YXJ0KCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05BcnJheUVuZCgpOworCitwdWJsaWM6CisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCk7CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKKworICBjbGFzcyBMb29rYWhlYWRSZWFkZXIgeworCisgIHB1YmxpYzoKKyAgICBMb29rYWhlYWRSZWFkZXIoVFRyYW5zcG9ydCYgdHJhbnMpIDogdHJhbnNfKCZ0cmFucyksIGhhc0RhdGFfKGZhbHNlKSB7fQorCisgICAgdWludDhfdCByZWFkKCkgeworICAgICAgaWYgKGhhc0RhdGFfKSB7CisgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkYXRhXzsKKyAgICB9CisKKyAgICB1aW50OF90IHBlZWsoKSB7CisgICAgICBpZiAoIWhhc0RhdGFfKSB7CisgICAgICAgIHRyYW5zXy0+cmVhZEFsbCgmZGF0YV8sIDEpOworICAgICAgfQorICAgICAgaGFzRGF0YV8gPSB0cnVlOworICAgICAgcmV0dXJuIGRhdGFfOworICAgIH0KKworICBwcml2YXRlOgorICAgIFRUcmFuc3BvcnQqIHRyYW5zXzsKKyAgICBib29sIGhhc0RhdGFfOworICAgIHVpbnQ4X3QgZGF0YV87CisgIH07CisKK3ByaXZhdGU6CisgIFRUcmFuc3BvcnQqIHRyYW5zXzsKKworICBzdGQ6OnN0YWNrPHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+ID4gY29udGV4dHNfOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjb250ZXh0XzsKKyAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87Cit9OworCisvKioKKyAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBUSlNPTlByb3RvY29sRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIHBhcnQgb2YgVGhyaWZ0SlNPTlN0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+CitzdGQ6OnN0cmluZyBUaHJpZnRKU09OU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgVEpTT05Qcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CisKKyAgdHMud3JpdGUoJnByb3RvY29sKTsKKworICB1aW50OF90KiBidWY7CisgIHVpbnQzMl90IHNpemU7CisgIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRjNjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7Cit1aW50MzJfdCBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IF9zZXFpZCkgeworICBpZiAoX3R5cGUgPT0gVF9DQUxMIHx8IF90eXBlID09IFRfT05FV0FZKSB7CisgICAgcmV0dXJuIFRQcm90b2NvbERlY29yYXRvcjo6d3JpdGVNZXNzYWdlQmVnaW5fdmlydChzZXJ2aWNlTmFtZSArIHNlcGFyYXRvciArIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VxaWQpOworICB9IGVsc2UgeworICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoX25hbWUsIF90eXBlLCBfc2VxaWQpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmQ4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1RNVUxUSVBMRVhFRFBST1RPQ09MX0hfCisjZGVmaW5lIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogXG5vdGUgVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLiAgT24gdGhlIHNlcnZlciwgdXNlCisgKiB7QGxpbmsgYXBhY2hlOjp0aHJpZnQ6OlRNdWx0aXBsZXhlZFByb2Nlc3NvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3J9IHRvIGhhbmRsZSByZXF1ZXN0cworICogZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gdHJhbnNwb3J0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7CisgKiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgKgorICogICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDEobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpKTsKKyAqICAgICBzaGFyZWRfcHRyPENhbGN1bGF0b3JDbGllbnQ+IHNlcnZpY2UxKG5ldyBDYWxjdWxhdG9yQ2xpZW50KG1wMSkpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDIobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpKTsKKyAqICAgICBzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRDbGllbnQ+IHNlcnZpY2UyKG5ldyBXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikpOworICoKKyAqICAgICBzZXJ2aWNlMS0+YWRkKDIsMik7CisgKiAgICAgaW50IHRlbXAgPSBzZXJ2aWNlMi0+Z2V0VGVtcGVyYXR1cmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbERlY29yYXRvcgorICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgeworcHVibGljOgorICAvKioKKyAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAqCisgICAqIFxwYXJhbSBfcHJvdG9jb2wgICAgWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8Y29kZT5UQmluYXJ5UHJvdG9jb2w8L2NvZGU+LgorICAgKiBccGFyYW0gX3NlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICovCisgIFRNdWx0aXBsZXhlZFByb3RvY29sKHNoYXJlZF9wdHI8VFByb3RvY29sPiBfcHJvdG9jb2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfc2VydmljZU5hbWUpCisgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgc2VydmljZU5hbWUoX3NlcnZpY2VOYW1lKSwgc2VwYXJhdG9yKCI6Iikge30KKyAgdmlydHVhbCB+VE11bHRpcGxleGVkUHJvdG9jb2woKSB7fQorCisgIC8qKgorICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUi4KKyAgICoKKyAgICogXHBhcmFtIFtpbl0gX25hbWUgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCBpbiB0aGUgc2VydmljZS4KKyAgICogXHBhcmFtIFtpbl0gX3R5cGUgICBUaGUgdHlwZSBvZiBtZXNzYWdlCisgICAqIFxwYXJhbSBbaW5dIF9uYW1lICAgVGhlIHNlcXVlbnRpYWwgaWQgb2YgdGhlIG1lc3NhZ2UKKyAgICoKKyAgICogXHRocm93cyBURXhjZXB0aW9uICBQYXNzZWQgdGhyb3VnaCBmcm9tIHdyYXBwZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IF9zZXFpZCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lOworICBjb25zdCBzdGQ6OnN0cmluZyBzZXBhcmF0b3I7Cit9OworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1RNVUxUSVBMRVhFRFBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzhhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitUUHJvdG9jb2w6On5UUHJvdG9jb2woKSB7fQordWludDMyX3QgVFByb3RvY29sOjpza2lwX3ZpcnQoVFR5cGUgdHlwZSkgeworICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnRoaXMsIHR5cGUpOworfQorCitUUHJvdG9jb2xGYWN0b3J5Ojp+VFByb3RvY29sRmFjdG9yeSgpIHt9CisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmM2ODE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCkBAIC0wLDAgKzEsNzYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xfSF8gMQorCisjaWZkZWYgX1dJTjMyCisvLyBOZWVkIHRvIGNvbWUgYmVmb3JlIGFueSBXaW5kb3dzLmggaW5jbHVkZXMKKyNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNsaW1pdHM+CisKKy8vIFVzZSB0aGlzIHRvIGdldCBhcm91bmQgc3RyaWN0IGFsaWFzaW5nIHJ1bGVzLgorLy8gRm9yIGV4YW1wbGUsIHVpbnQ2NF90IGkgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KHJldHVybnNfZG91YmxlKCkpOworLy8gVGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBpcyB0byBqdXN0IGNhc3QgYSBwb2ludGVyLAorLy8gYnV0IHRoYXQgZG9lc24ndCB3b3JrLgorLy8gRm9yIGEgcHJldHR5IGluLWRlcHRoIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9ibGVtLCBzZWUKKy8vIGh0dHA6Ly9jZWxscGVyZm9ybWFuY2UuYmV5b25kM2QuY29tL2FydGljbGVzLzIwMDYvMDYvdW5kZXJzdGFuZGluZy1zdHJpY3QtYWxpYXNpbmcuaHRtbAordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgorc3RhdGljIGlubGluZSBUbyBiaXR3aXNlX2Nhc3QoRnJvbSBmcm9tKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbyksICJzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSIpOworCisgIC8vIEJBRCEhISAgVGhlc2UgYXJlIGFsbCBicm9rZW4gd2l0aCAtTzIuCisgIC8vcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRvKj4oJmZyb20pOyAgLy8gQkFEISEhCisgIC8vcmV0dXJuICpzdGF0aWNfY2FzdDxUbyo+KHN0YXRpY19jYXN0PHZvaWQqPigmZnJvbSkpOyAgLy8gQkFEISEhCisgIC8vcmV0dXJuICooVG8qKSh2b2lkKikmZnJvbTsgIC8vIEJBRCEhIQorCisgIC8vIFN1cGVyIGNsZWFuIGFuZCBwYXJpdGFsbHkgYmxlc3NlZCBieSBzZWN0aW9uIDMuOSBvZiB0aGUgc3RhbmRhcmQuCisgIC8vdW5zaWduZWQgY2hhciBjW3NpemVvZihmcm9tKV07CisgIC8vbWVtY3B5KGMsICZmcm9tLCBzaXplb2YoZnJvbSkpOworICAvL1RvIHRvOworICAvL21lbWNweSgmdG8sIGMsIHNpemVvZihjKSk7CisgIC8vcmV0dXJuIHRvOworCisgIC8vIFNsaWdodGx5IG1vcmUgcXVlc3Rpb25hYmxlLgorICAvLyBTYW1lIGNvZGUgZW1pdHRlZCBieSBHQ0MuCisgIC8vVG8gdG87CisgIC8vbWVtY3B5KCZ0bywgJmZyb20sIHNpemVvZihmcm9tKSk7CisgIC8vcmV0dXJuIHRvOworCisgIC8vIFRlY2huaWNhbGx5IHVuZGVmaW5lZCwgYnV0IGFsbW9zdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsCisgIC8vIGFuZCB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24uCisgIHVuaW9uIHsKKyAgICBGcm9tIGY7CisgICAgVG8gdDsKKyAgfSB1OworICB1LmYgPSBmcm9tOworICByZXR1cm4gdS50OworfQorCisKKyNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX1RIUklGVF9CWVRFX09SREVSCisjIGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pCisjICBkZWZpbmUgX19USFJJRlRfQllURV9PUkRFUiBCWVRFX09SREVSCisjICBkZWZpbmUgX19USFJJRlRfTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19USFJJRlRfQklHX0VORElBTiBCSUdfRU5ESUFOCisjIGVsc2UKKyMgIGluY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjICBpbmNsdWRlIDxib29zdC9kZXRhaWwvZW5kaWFuLmhwcD4KKyMgIGRlZmluZSBfX1RIUklGVF9CWVRFX09SREVSIEJPT1NUX0JZVEVfT1JERVIKKyMgIGlmZGVmIEJPT1NUX0xJVFRMRV9FTkRJQU4KKyMgICBkZWZpbmUgX19USFJJRlRfTElUVExFX0VORElBTiBfX1RIUklGVF9CWVRFX09SREVSCisjICAgZGVmaW5lIF9fVEhSSUZUX0JJR19FTkRJQU4gMAorIyAgZWxzZQorIyAgIGRlZmluZSBfX1RIUklGVF9MSVRUTEVfRU5ESUFOIDAKKyMgICBkZWZpbmUgX19USFJJRlRfQklHX0VORElBTiBfX1RIUklGVF9CWVRFX09SREVSCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBfX1RIUklGVF9CWVRFX09SREVSID09IF9fVEhSSUZUX0JJR19FTkRJQU4KKyMgaWYgIWRlZmluZWQoVEhSSUZUX250b2hsbCkKKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgKG4pCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIGJzd2FwXzE2KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSBic3dhcF8xNihuKQorIyBlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworIyAgZGVmaW5lIGJzd2FwXzY0KG4pIFwKKyAgICAgICggKCgobikgJiAweGZmMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2KSBcCisgICAgICB8ICgoKG4pICYgMHgwMGZmMDAwMDAwMDAwMDAwdWxsKSA+PiA0MCkgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMGZmMDAwMDAwMDB1bGwpID4+IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMGZmMDAwMDAwdWxsKSA8PCA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMGZmMDB1bGwpIDw8IDQwKSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDAwMGZmdWxsKSA8PCA1NikgKQorIyAgZGVmaW5lIGJzd2FwXzMyKG4pIFwKKyAgICAgICggKCgobikgJiAweGZmMDAwMDAwdWwpID4+IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMGZmMDAwMHVsKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMGZmMDB1bCkgPDwgOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMGZmdWwpIDw8IDI0KSApCisjICBkZWZpbmUgYnN3YXBfMTYobikgXAorICAgICAgKCAoKChuKSAmICgodW5zaWduZWQgc2hvcnQpMHhmZjAwdWwpKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmICgodW5zaWduZWQgc2hvcnQpMHgwMGZmdWwpKSA8PCA4KSAgKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZXMobikgYnN3YXBfMTYobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hzKG4pIGJzd2FwXzE2KG4pCisjIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLworI2VsaWYgX19USFJJRlRfQllURV9PUkRFUiA9PSBfX1RIUklGVF9MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZXMobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSAobikKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjICBpbmNsdWRlIDxieXRlc3dhcC5oPgorIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pIGJzd2FwXzY0KG4pCisjIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgLyogTWljcm9zb2Z0IFZpc3VhbCBDKysgKi8KKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgKCBfYnl0ZXN3YXBfdWludDY0KCh1aW50NjRfdCluKSApCisjIGVsaWYgIWRlZmluZWQoVEhSSUZUX250b2hsbCkgLyogTm90IEdOVUMvR0xJQkMgb3IgTVNWQyAqLworIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKCAoKCh1aW50NjRfdCludG9obCgodWludDMyX3QpbikpIDw8IDMyKSArIG50b2hsKCh1aW50MzJfdCkobiA+PiAzMikpICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pICggKCgodWludDY0X3QpaHRvbmwoKHVpbnQzMl90KW4pKSA8PCAzMikgKyBodG9ubCgodWludDMyX3QpKG4gPj4gMzIpKSApCisjIGVuZGlmIC8qIEdOVUMvR0xJQkMgb3IgTVNWQyBvciBzb21ldGhpbmcgZWxzZSAqLworI2Vsc2UgLyogX19USFJJRlRfQllURV9PUkRFUiAqLworIyBlcnJvciAiQ2FuJ3QgZGVmaW5lIFRIUklGVF9odG9ubGwgb3IgVEhSSUZUX250b2hsbCEiCisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wgc3VwcG9ydHMuCisgKiBUYWtlIHNwZWNpYWwgbm90ZSBvZiB0aGUgVF9FTkQgdHlwZSB3aGljaCBpcyB1c2VkIHNwZWNpZmljYWxseSB0byBtYXJrCisgKiB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgorICovCitlbnVtIFRUeXBlIHsKKyAgVF9TVE9QICAgICAgID0gMCwKKyAgVF9WT0lEICAgICAgID0gMSwKKyAgVF9CT09MICAgICAgID0gMiwKKyAgVF9CWVRFICAgICAgID0gMywKKyAgVF9JMDggICAgICAgID0gMywKKyAgVF9JMTYgICAgICAgID0gNiwKKyAgVF9JMzIgICAgICAgID0gOCwKKyAgVF9VNjQgICAgICAgID0gOSwKKyAgVF9JNjQgICAgICAgID0gMTAsCisgIFRfRE9VQkxFICAgICA9IDQsCisgIFRfU1RSSU5HICAgICA9IDExLAorICBUX1VURjcgICAgICAgPSAxMSwKKyAgVF9TVFJVQ1QgICAgID0gMTIsCisgIFRfTUFQICAgICAgICA9IDEzLAorICBUX1NFVCAgICAgICAgPSAxNCwKKyAgVF9MSVNUICAgICAgID0gMTUsCisgIFRfVVRGOCAgICAgICA9IDE2LAorICBUX1VURjE2ICAgICAgPSAxNworfTsKKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sCisgKiBzdXBwb3J0cy4KKyAqLworZW51bSBUTWVzc2FnZVR5cGUgeworICBUX0NBTEwgICAgICAgPSAxLAorICBUX1JFUExZICAgICAgPSAyLAorICBUX0VYQ0VQVElPTiAgPSAzLAorICBUX09ORVdBWSAgICAgPSA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9SRUNVUlNJT05fTElNSVQgPSA2NDsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBmb3IgYSB0aHJpZnQgcHJvdG9jb2wgZHJpdmVyLiBUaGVzZSBhcmUgYWxsIHRoZSBtZXRob2RzIHRoYXQKKyAqIGEgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQuIEVzc2VudGlhbGx5LCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IG9mIHJlYWRpbmcKKyAqIGFuZCB3cml0aW5nIGFsbCB0aGUgYmFzZSB0eXBlcywgcGx1cyBhIG1lY2hhbmlzbSBmb3Igd3JpdGluZyBvdXQgc3RydWN0cworICogd2l0aCBpbmRleGVkIGZpZWxkcy4KKyAqCisgKiBUUHJvdG9jb2wgb2JqZWN0cyBzaG91bGQgbm90IGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgZW5jb2RpbmcgY29udGV4dHMsCisgKiBhcyB0aGV5IG1heSBuZWVkIHRvIG1haW50YWluIGludGVybmFsIHN0YXRlIGluIHNvbWUgcHJvdG9jb2xzIChpLmUuIFhNTCkuCisgKiBOb3RlIHRoYXQgaXMgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIFRQcm90b2NvbCBtb2R1bGUgdG8gZG8gaXRzIG93biBpbnRlcm5hbAorICogYnVmZmVyZWQgcmVhZHMvd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIFRUcmFuc3BvcnQgd2hlcmUgYXBwcm9wcmlhdGUgKGkuZS4KKyAqIHdoZW4gcGFyc2luZyBhbiBpbnB1dCBYTUwgc3RyZWFtLCByZWFkaW5nIHNob3VsZCBiZSBiYXRjaGVkIHJhdGhlciB0aGFuCisgKiBsb29raW5nIGFoZWFkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgZm9yIGEgY2xvc2UgdGFnKS4KKyAqCisgKi8KK2NsYXNzIFRQcm90b2NvbCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm90b2NvbCgpOworCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKQorICAgICAgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVNZXNzYWdlQmVnaW5fdmlydChuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTWVzc2FnZUVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQobmFtZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZVN0cnVjdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUZpZWxkQmVnaW5fdmlydChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUZpZWxkRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlRmllbGRTdG9wX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTWFwRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVMaXN0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVMaXN0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZVNldEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTZXRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUJvb2xfdmlydCh2YWx1ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUJ5dGVfdmlydChieXRlKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVJMTZfdmlydChpMTYpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUkzMl92aXJ0KGkzMik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlSTY0X3ZpcnQoaTY0KTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZURvdWJsZV92aXJ0KGR1Yik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTdHJpbmdfdmlydChzdHIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlQmluYXJ5X3ZpcnQoc3RyKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWVzc2FnZUJlZ2luX3ZpcnQobmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRNZXNzYWdlRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU3RydWN0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEZpZWxkQmVnaW5fdmlydChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRGaWVsZEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRNYXBCZWdpbl92aXJ0KGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWFwRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRMaXN0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTGlzdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTZXRCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFNldEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCb29sX3ZpcnQodmFsdWUpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEJ5dGVfdmlydChieXRlKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEkxNl92aXJ0KGkxNik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRJMzJfdmlydChpMzIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkSTY0X3ZpcnQoaTY0KTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkRG91YmxlX3ZpcnQoZHViKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTdHJpbmdfdmlydChzdHIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEJpbmFyeV92aXJ0KHN0cik7CisgIH0KKworICAvKgorICAgKiBzdGQ6OnZlY3RvciBpcyBzcGVjaWFsaXplZCBmb3IgYm9vbCwgYW5kIGl0cyBlbGVtZW50cyBhcmUgaW5kaXZpZHVhbCBiaXRzCisgICAqIHJhdGhlciB0aGFuIGJvb2xzLiAgIFdlIG5lZWQgdG8gZGVmaW5lIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgcmVhZEJvb2woKQorICAgKiB0byB3b3JrIHdpdGggc3RkOjp2ZWN0b3I8Ym9vbD4uCisgICAqLworICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEJvb2xfdmlydCh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgorICAgKi8KKyAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gc2tpcF92aXJ0KHR5cGUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpOworCisgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQorCisgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSB0d28gY2FsbHMsIHRoZXkgYXJlIGZvciBiYWNrd2FyZHMKKyAgLy8gY29tcGF0aWJpbGl0eQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldElucHV0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKworICAvLyBpbnB1dCBhbmQgb3V0cHV0IHJlY3Vyc2lvbiBkZXB0aCBhcmUga2VwdCBzZXBhcmF0ZSBzbyB0aGF0IG9uZSBwcm90b2NvbAorICAvLyBjYW4gYmUgdXNlZCBjb25jdXJyZW50bHkgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KKyAgdm9pZCBpbmNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCkgeworICAgIGlmIChyZWN1cnNpb25fbGltaXRfIDwgKytpbnB1dF9yZWN1cnNpb25fZGVwdGhfKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpERVBUSF9MSU1JVCk7CisgICAgfQorICB9CisgIHZvaWQgZGVjcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpIHsgLS1pbnB1dF9yZWN1cnNpb25fZGVwdGhfOyB9CisKKyAgdm9pZCBpbmNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpIHsKKyAgICBpZiAocmVjdXJzaW9uX2xpbWl0XyA8ICsrb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF8pIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkRFUFRIX0xJTUlUKTsKKyAgICB9CisgIH0KKyAgdm9pZCBkZWNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpIHsgLS1vdXRwdXRfcmVjdXJzaW9uX2RlcHRoXzsgfQorCisgIHVpbnQzMl90IGdldFJlY3Vyc2lvbkxpbWl0KCkgY29uc3Qge3JldHVybiByZWN1cnNpb25fbGltaXRfO30KKyAgdm9pZCBzZXRSZWN1cmlzaW9uTGltaXQodWludDMyX3QgZGVwdGgpIHtyZWN1cnNpb25fbGltaXRfID0gZGVwdGg7fQorCitwcm90ZWN0ZWQ6CisgIFRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQorICAgIDogcHRyYW5zXyhwdHJhbnMpLCBpbnB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCBvdXRwdXRfcmVjdXJzaW9uX2RlcHRoXygwKSwgcmVjdXJzaW9uX2xpbWl0XyhERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCkKKyAge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zXzsKKworcHJpdmF0ZToKKyAgVFByb3RvY29sKCkge30KKyAgdWludDMyX3QgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsKKyAgdWludDMyX3Qgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87CisgIHVpbnQzMl90IHJlY3Vyc2lvbl9saW1pdF87Cit9OworCisvKioKKyAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCisgKi8KK2NsYXNzIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBUUHJvdG9jb2xGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5UUHJvdG9jb2xGYWN0b3J5KCk7CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFucykgeworICAgICh2b2lkKW91dFRyYW5zOworICAgIHJldHVybiBnZXRQcm90b2NvbChpblRyYW5zKTsKKyAgfQorfTsKKworLyoqCisgKiBEdW1teSBwcm90b2NvbCBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGRvZXMgbm90aGluZywgYW5kIHNob3VsZCBuZXZlciBiZSBpbnN0YW50aWF0ZWQuCisgKiBJdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGdlbmVyYXRvciBjb2RlLgorICovCitjbGFzcyBURHVtbXlQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2wge307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgLyBsZWdhY3kgY2hvaWNlCitzdHJ1Y3QgVE5ldHdvcmtCaWdFbmRpYW4KK3sKKyAgc3RhdGljIHVpbnQxNl90IHRvV2lyZTE2KHVpbnQxNl90IHgpICAge3JldHVybiBodG9ucyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCB0b1dpcmUzMih1aW50MzJfdCB4KSAgIHtyZXR1cm4gaHRvbmwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgdG9XaXJlNjQodWludDY0X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9ubGwoeCk7fQorICBzdGF0aWMgdWludDE2X3QgZnJvbVdpcmUxNih1aW50MTZfdCB4KSB7cmV0dXJuIG50b2hzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IGZyb21XaXJlMzIodWludDMyX3QgeCkge3JldHVybiBudG9obCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCBmcm9tV2lyZTY0KHVpbnQ2NF90IHgpIHtyZXR1cm4gVEhSSUZUX250b2hsbCh4KTt9Cit9OworCisvLyBPbiBtb3N0IHN5c3RlbXMsIHRoaXMgd2lsbCBiZSBhIGJpdCBmYXN0ZXIgdGhhbiBUTmV0d29ya0JpZ0VuZGlhbgorc3RydWN0IFROZXR3b3JrTGl0dGxlRW5kaWFuCit7CisgIHN0YXRpYyB1aW50MTZfdCB0b1dpcmUxNih1aW50MTZfdCB4KSAgIHtyZXR1cm4gVEhSSUZUX2h0b2xlcyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCB0b1dpcmUzMih1aW50MzJfdCB4KSAgIHtyZXR1cm4gVEhSSUZUX2h0b2xlbCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCB0b1dpcmU2NCh1aW50NjRfdCB4KSAgIHtyZXR1cm4gVEhSSUZUX2h0b2xlbGwoeCk7fQorICBzdGF0aWMgdWludDE2X3QgZnJvbVdpcmUxNih1aW50MTZfdCB4KSB7cmV0dXJuIFRIUklGVF9sZXRvaHMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgZnJvbVdpcmUzMih1aW50MzJfdCB4KSB7cmV0dXJuIFRIUklGVF9sZXRvaGwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgZnJvbVdpcmU2NCh1aW50NjRfdCB4KSB7cmV0dXJuIFRIUklGVF9sZXRvaGxsKHgpO30KK307CisKK3N0cnVjdCBUT3V0cHV0UmVjdXJzaW9uVHJhY2tlciB7CisgIFRQcm90b2NvbCAmcHJvdF87CisgIFRPdXRwdXRSZWN1cnNpb25UcmFja2VyKFRQcm90b2NvbCAmcHJvdCkgOiBwcm90Xyhwcm90KSB7CisgICAgcHJvdF8uaW5jcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorICB+VE91dHB1dFJlY3Vyc2lvblRyYWNrZXIoKSB7CisgICAgcHJvdF8uZGVjcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorfTsKKworc3RydWN0IFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgeworICBUUHJvdG9jb2wgJnByb3RfOworICBUSW5wdXRSZWN1cnNpb25UcmFja2VyKFRQcm90b2NvbCAmcHJvdCkgOiBwcm90Xyhwcm90KSB7CisgICAgcHJvdF8uaW5jcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpOworICB9CisgIH5USW5wdXRSZWN1cnNpb25UcmFja2VyKCkgeworICAgIHByb3RfLmRlY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorfTsKKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBUUHJvdG9jb2w6OnNraXAoKS4KKyAqCisgKiBUZW1wbGF0aXplZCB0byBhdm9pZCBoYXZpbmcgdG8gbWFrZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgordWludDMyX3Qgc2tpcChQcm90b2NvbF8mIHByb3QsIFRUeXBlIHR5cGUpIHsKKyAgVElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKHByb3QpOworCisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfQk9PTDogeworICAgIGJvb2wgYm9vbHY7CisgICAgcmV0dXJuIHByb3QucmVhZEJvb2woYm9vbHYpOworICB9CisgIGNhc2UgVF9CWVRFOiB7CisgICAgaW50OF90IGJ5dGV2ID0gMDsKKyAgICByZXR1cm4gcHJvdC5yZWFkQnl0ZShieXRldik7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgaTE2OworICAgIHJldHVybiBwcm90LnJlYWRJMTYoaTE2KTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCBpMzI7CisgICAgcmV0dXJuIHByb3QucmVhZEkzMihpMzIpOworICB9CisgIGNhc2UgVF9JNjQ6IHsKKyAgICBpbnQ2NF90IGk2NDsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTY0KGk2NCk7CisgIH0KKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSBkdWI7CisgICAgcmV0dXJuIHByb3QucmVhZERvdWJsZShkdWIpOworICB9CisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgcmV0dXJuIHByb3QucmVhZEJpbmFyeShzdHIpOworICB9CisgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgaW50MTZfdCBmaWQ7CisgICAgVFR5cGUgZnR5cGU7CisgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICByZXN1bHQgKz0gcHJvdC5yZWFkRmllbGRCZWdpbihuYW1lLCBmdHlwZSwgZmlkKTsKKyAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBmdHlwZSk7CisgICAgICByZXN1bHQgKz0gcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX01BUDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUga2V5VHlwZTsKKyAgICBUVHlwZSB2YWxUeXBlOworICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGtleVR5cGUpOworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgdmFsVHlwZSk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9TRVQ6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGVsZW1UeXBlOworICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgcmVzdWx0ICs9IHByb3QucmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9MSVNUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBlbGVtVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1U2NDoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VVEYxNjoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICB9CisgIHJldHVybiAwOworfQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNhMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXworI2RlZmluZSBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCisvKioKKyAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCisgKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKKyAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLgorICoKKyAqIDxwPlNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLik8L3A+CisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciA6IHB1YmxpYyBUUHJvdG9jb2wgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2xEZWNvcmF0b3IoKSB7fQorCisgIC8vIERlc2M6IEluaXRpYWxpemVzIHRoZSBwcm90b2NvbCBkZWNvcmF0b3Igb2JqZWN0LgorICBUUHJvdG9jb2xEZWNvcmF0b3Ioc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKQorICAgIDogVFByb3RvY29sKHByb3RvLT5nZXRUcmFuc3BvcnQoKSksIHByb3RvY29sKHByb3RvKSB7fQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkU3RvcCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZU1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUxpc3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQm9vbCh2YWx1ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGVfdmlydChjb25zdCBpbnQ4X3QgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQnl0ZShieXRlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkxNihpMTYpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTMyKGkzMik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NF92aXJ0KGNvbnN0IGludDY0X3QgaTY0KSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJNjQoaTY0KTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVEb3VibGUoZHViKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RyaW5nKHN0cik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJpbmFyeShzdHIpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEZpZWxkRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU2V0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkQm9vbCh2YWx1ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkQnl0ZShieXRlKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkxNl92aXJ0KGludDE2X3QmIGkxNikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJMTYoaTE2KTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTMyKGkzMik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEk2NChpNjQpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkRG91YmxlKGR1Yik7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cmluZyhzdHIpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkQmluYXJ5KHN0cik7IH0KKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworfTsKK30KK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE3OGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8gMQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIHByb3RvY29sIGVycm9ycyB0aGF0IG1heQorICogb2NjdXIgaW4gdmFyaW91cyBwcm90b2NvbCBzeXN0ZW1zLiBUaGlzIHByb3ZpZGVzIGEgc29ydCBvZiBnZW5lcmljCisgKiB3cmFwcGVyIGFyb3VuZCB0aGUgdmFndWUgVU5JWCBFXyBlcnJvciBjb2RlcyB0aGF0IGxldHMgYSBjb21tb24gY29kZQorICogYmFzZSBvZiBlcnJvciBoYW5kbGluZyB0byBiZSB1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIHByb3RvY29scywgaS5lLgorICogcGlwZXMgZXRjLgorICoKKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHsKKyAgICBVTktOT1dOID0gMCwKKyAgICBJTlZBTElEX0RBVEEgPSAxLAorICAgIE5FR0FUSVZFX1NJWkUgPSAyLAorICAgIFNJWkVfTElNSVQgPSAzLAorICAgIEJBRF9WRVJTSU9OID0gNCwKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1LAorICAgIERFUFRIX0xJTUlUID0gNgorICB9OworCisgIFRQcm90b2NvbEV4Y2VwdGlvbigpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CisKKyAgVFByb3RvY29sRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KKworICB2aXJ0dWFsIH5UUHJvdG9jb2xFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgorICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KKyAgICoKKyAgICogQHJldHVybiBFcnJvciBjb2RlCisgICAqLworICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgc3dpdGNoICh0eXBlXykgeworICAgICAgY2FzZSBVTktOT1dOOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOworICAgICAgY2FzZSBJTlZBTElEX0RBVEE6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIGRhdGEiOworICAgICAgY2FzZSBORUdBVElWRV9TSVpFOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTmVnYXRpdmUgc2l6ZSI7CisgICAgICBjYXNlIFNJWkVfTElNSVQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBFeGNlZWRlZCBzaXplIGxpbWl0IjsKKyAgICAgIGNhc2UgQkFEX1ZFUlNJT046CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIHZlcnNpb24iOworICAgICAgY2FzZSBOT1RfSU1QTEVNRU5URUQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOb3QgaW1wbGVtZW50ZWQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBFcnJvciBjb2RlCisgICAqLworICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGVfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwMGJhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OworCisvKioKKyAqIFB1dHMgYSB3aXJldGFwIG9uIGEgcHJvdG9jb2wgb2JqZWN0LiAgQW55IHJlYWRzIHRvIHRoaXMgY2xhc3MgYXJlIHBhc3NlZAorICogdGhyb3VnaCB0byBhbiBlbmNsb3NlZCBwcm90b2NvbCBvYmplY3QsIGJ1dCBhbHNvIG1pcnJvcmVkIGFzIHdyaXRlIHRvIGEKKyAqIHNlY29uZCBwcm90b2NvbCBvYmplY3QuCisgKgorICovCitjbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+IHsKK3B1YmxpYzoKKyAgVFByb3RvY29sVGFwKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2luaykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPihzb3VyY2UtPmdldFRyYW5zcG9ydCgpKSwgc291cmNlXyhzb3VyY2UpLCBzaW5rXyhzaW5rKSB7fQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgICAgc2lua18tPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIHNpbmtfLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0RW5kKCk7CisgICAgc2lua18tPndyaXRlU3RydWN0RW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgICAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIHNpbmtfLT53cml0ZUZpZWxkU3RvcCgpOworICAgIH0gZWxzZSB7CisgICAgICBzaW5rXy0+d3JpdGVGaWVsZEJlZ2luKG5hbWUuY19zdHIoKSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkRW5kKCk7CisgICAgc2lua18tPndyaXRlRmllbGRFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgIHNpbmtfLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwRW5kKCk7CisgICAgc2lua18tPndyaXRlTWFwRW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBzaW5rXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZExpc3RFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVMaXN0RW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgc2lua18tPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0RW5kKCk7CisgICAgc2lua18tPndyaXRlU2V0RW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCb29sKHZhbHVlKTsKKyAgICBzaW5rXy0+d3JpdGVCb29sKHZhbHVlKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQnl0ZShieXRlKTsKKyAgICBzaW5rXy0+d3JpdGVCeXRlKGJ5dGUpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTE2KGkxNik7CisgICAgc2lua18tPndyaXRlSTE2KGkxNik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJMzIoaTMyKTsKKyAgICBzaW5rXy0+d3JpdGVJMzIoaTMyKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEk2NChpNjQpOworICAgIHNpbmtfLT53cml0ZUk2NChpNjQpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWREb3VibGUoZHViKTsKKyAgICBzaW5rXy0+d3JpdGVEb3VibGUoZHViKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJpbmcoc3RyKTsKKyAgICBzaW5rXy0+d3JpdGVTdHJpbmcoc3RyKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCaW5hcnkoc3RyKTsKKyAgICBzaW5rXy0+d3JpdGVCaW5hcnkoc3RyKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODk4YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8gMQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworZW51bSBQUk9UT0NPTF9UWVBFUyB7CisgIFRfQklOQVJZX1BST1RPQ09MID0gMCwKKyAgVF9KU09OX1BST1RPQ09MID0gMSwKKyAgVF9DT01QQUNUX1BST1RPQ09MID0gMiwKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZWE1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIFRQcm90b2NvbCBtZXRob2RzLgorICoKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG5vbi12aXJ0dWFsIFRQcm90b2NvbAorICogbWV0aG9kcy4gIEl0IGV4aXN0cyBwcmltYXJpbHkgc28gVFZpcnR1YWxQcm90b2NvbCBjYW4gZGVyaXZlIGZyb20gaXQuICBJdAorICogcHJldmVudHMgVFZpcnR1YWxQcm90b2NvbCBtZXRob2RzIGZyb20gY2F1c2luZyBpbmZpbml0ZSByZWN1cnNpb24gaWYgdGhlCisgKiBub24tdmlydHVhbCBtZXRob2RzIGFyZSBub3Qgb3ZlcnJpZGRlbiBieSB0aGUgVFZpcnR1YWxQcm90b2NvbCBzdWJjbGFzcy4KKyAqCisgKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseS4gIFVzZSBUVmlydHVhbFByb3RvY29sCisgKiBpbnN0ZWFkLgorICovCitjbGFzcyBUUHJvdG9jb2xEZWZhdWx0cyA6IHB1YmxpYyBUUHJvdG9jb2wgeworcHVibGljOgorICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpbWVzc2FnZVR5cGU7CisgICAgKHZvaWQpc2VxaWQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgICh2b2lkKW5hbWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKWZpZWxkVHlwZTsKKyAgICAodm9pZClmaWVsZElkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICAodm9pZClrZXlUeXBlOworICAgICh2b2lkKXZhbFR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgICAodm9pZCl2YWx1ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICAodm9pZCl2YWx1ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICAgICh2b2lkKWJ5dGU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgeworICAgICh2b2lkKWkxNjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgICAgKHZvaWQpaTMyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgICAodm9pZClpNjQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgICAgKHZvaWQpZHViOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgKHZvaWQpc3RyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgKHZvaWQpc3RyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpbWVzc2FnZVR5cGU7CisgICAgKHZvaWQpc2VxaWQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAodm9pZCluYW1lOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKWZpZWxkVHlwZTsKKyAgICAodm9pZClmaWVsZElkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgKHZvaWQpa2V5VHlwZTsKKyAgICAodm9pZCl2YWxUeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICAgICh2b2lkKXZhbHVlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgICAgKHZvaWQpYnl0ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgICAgKHZvaWQpaTE2OworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgICAodm9pZClpMzI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICAgICh2b2lkKWk2NDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgICAodm9pZClkdWI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgKHZvaWQpc3RyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeyByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnRoaXMsIHR5cGUpOyB9CisKK3Byb3RlY3RlZDoKKyAgVFByb3RvY29sRGVmYXVsdHMoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBUUHJvdG9jb2wocHRyYW5zKSB7fQorfTsKKworLyoqCisgKiBDb25jcmV0ZSBUUHJvdG9jb2wgY2xhc3NlcyBzaG91bGQgaW5oZXJpdCBmcm9tIFRWaXJ0dWFsUHJvdG9jb2wKKyAqIHNvIHRoZXkgZG9uJ3QgaGF2ZSB0byBtYW51YWxseSBvdmVycmlkZSB2aXJ0dWFsIG1ldGhvZHMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8sIGNsYXNzIFN1cGVyXyA9IFRQcm90b2NvbERlZmF1bHRzPgorY2xhc3MgVFZpcnR1YWxQcm90b2NvbCA6IHB1YmxpYyBTdXBlcl8geworcHVibGljOgorICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlRW5kKCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZFN0b3AoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGVfdmlydChjb25zdCBpbnQ4X3QgYnl0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCeXRlKGJ5dGUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUkxNihpMTYpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUkzMihpMzIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NF92aXJ0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUk2NChpNjQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRG91YmxlKGR1Yik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUJpbmFyeShzdHIpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbCh2YWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJ5dGUoYnl0ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJMTYoaTE2KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMl92aXJ0KGludDMyX3QmIGkzMikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEkzMihpMzIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTY0KGk2NCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZERvdWJsZShkdWIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nX3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cmluZyhzdHIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJpbmFyeShzdHIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnNraXAodHlwZSk7IH0KKworICAvKgorICAgKiBQcm92aWRlIGEgZGVmYXVsdCBza2lwKCkgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG5vbi12aXJ0dWFsIHJlYWQKKyAgICogbWV0aG9kcy4KKyAgICoKKyAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFByb3RvY29sIHRvIGRlcml2ZSBmcm9tIGFub3RoZXIgcHJvdG9jb2wKKyAgICogaW1wbGVtZW50YXRpb24gKGkuZS4sIG5vdCBUUHJvdG9jb2xEZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0IHRoaXMgbWF5CisgICAqIG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCBza2lwKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHBhcmVudAorICAgKiB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVkZWZpbmUgc2tpcCgpIHRvIGNhbGwgdGhlCisgICAqIGNvcnJlY3QgcGFyZW50IGltcGxlbWVudGF0aW9uLCBpZiBkZXNpcmVkLgorICAgKi8KKyAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7CisgICAgUHJvdG9jb2xfKiBjb25zdCBwcm90ID0gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyk7CisgICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCpwcm90LCB0eXBlKTsKKyAgfQorCisgIC8qCisgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHVzZSB3aXRoCisgICAqIHN0ZDo6dmVjdG9yPGJvb2w+LCB0aGF0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgcmVhZGluZyBpbnRvIGEgbm9ybWFsIGJvb2wuCisgICAqCisgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgaWYgZGVzaXJlZCwgYnV0IHRoZXJlIG5vcm1hbGx5IHNob3VsZG4ndAorICAgKiBiZSBhIG5lZWQgdG8uCisgICAqLworICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgYm9vbCBiID0gZmFsc2U7CisgICAgdWludDMyX3QgcmV0ID0gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKGIpOworICAgIHZhbHVlID0gYjsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHVzaW5nIFN1cGVyXzo6cmVhZEJvb2w7IC8vIHNvIHdlIGRvbid0IGhpZGUgcmVhZEJvb2woYm9vbCYpCisKK3Byb3RlY3RlZDoKKyAgVFZpcnR1YWxQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFN1cGVyXyhwdHJhbnMpIHt9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE5YTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoIHRocmlmdGNwcHF0NV9TT1VSQ0VTCisgICAgVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKKyAgICBUUVRjcFNlcnZlci5jcHAKKykKK3NldChDTUFLRV9BVVRPTU9DIE9OKQorZmluZF9wYWNrYWdlKFF0NSBSRVFVSVJFRCBDT01QT05FTlRTIENvcmUgTmV0d29yaykKK0FERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRxdDUgJHt0aHJpZnRjcHBxdDVfU09VUkNFU30pCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdHF0NSBRdDU6OkNvcmUgUXQ1OjpOZXR3b3JrKQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHF0NSB0aHJpZnQpCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3Yzk5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPFFBYnN0cmFjdFNvY2tldD4KKyNpbmNsdWRlIDxRSU9EZXZpY2U+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUUUlPRGV2aWNlVHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0KHNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXYpIDogZGV2XyhkZXYpIHsKK30KKworVFFJT0RldmljZVRyYW5zcG9ydDo6flRRSU9EZXZpY2VUcmFuc3BvcnQoKSB7CisgIGRldl8tPmNsb3NlKCk7Cit9CisKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6b3BlbigpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlbigpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpc24ndCBvcGVuIik7CisgIH0KK30KKworYm9vbCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojppc09wZW4oKSB7CisgIHJldHVybiBkZXZfLT5pc09wZW4oKTsKK30KKworYm9vbCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpwZWVrKCkgeworICByZXR1cm4gZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSA+IDA7Cit9CisKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y2xvc2UoKSB7CisgIGRldl8tPmNsb3NlKCk7Cit9CisKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgcmVxdWVzdExlbiA9IGxlbjsKKyAgd2hpbGUgKGxlbikgeworICAgIHVpbnQzMl90IHJlYWRTaXplOworICAgIHRyeSB7CisgICAgICByZWFkU2l6ZSA9IHJlYWQoYnVmLCBsZW4pOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgaWYgKGxlbiAhPSByZXF1ZXN0TGVuKSB7CisgICAgICAgIC8vIHNvbWV0aGluZyByZWFkIGFscmVhZHkKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RMZW4gLSBsZW47CisgICAgICB9CisgICAgICAvLyBlcnJvciBidXQgbm90aGluZyByZWFkIHlldAorICAgICAgdGhyb3c7CisgICAgfQorICAgIGlmIChyZWFkU2l6ZSA9PSAwKSB7CisgICAgICBkZXZfLT53YWl0Rm9yUmVhZHlSZWFkKDUwKTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmICs9IHJlYWRTaXplOworICAgICAgbGVuIC09IHJlYWRTaXplOworICAgIH0KKyAgfQorICByZXR1cm4gcmVxdWVzdExlbjsKK30KKwordWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBhY3R1YWxTaXplOworICBxaW50NjQgcmVhZFNpemU7CisKKyAgaWYgKCFkZXZfLT5pc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOworICB9CisKKyAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdCkoc3RkOjptaW4pKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKKyAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZiksIGFjdHVhbFNpemUpOworCisgIGlmIChyZWFkU2l6ZSA8IDApIHsKKyAgICBRQWJzdHJhY3RTb2NrZXQqIHNvY2tldDsKKyAgICBpZiAoKHNvY2tldCA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTb2NrZXQqPihkZXZfLmdldCgpKSkpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkKCkgZnJvbSBRQWJzdHJhY3RTb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQtPmVycm9yKCkpOworICAgIH0KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZyb20gUUlPRGV2aWNlIik7CisgIH0KKworICByZXR1cm4gKHVpbnQzMl90KXJlYWRTaXplOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHdoaWxlIChsZW4pIHsKKyAgICB1aW50MzJfdCB3cml0dGVuID0gd3JpdGVfcGFydGlhbChidWYsIGxlbik7CisgICAgbGVuIC09IHdyaXR0ZW47CisgICAgZGV2Xy0+d2FpdEZvckJ5dGVzV3JpdHRlbig1MCk7CisgIH0KK30KKwordWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBxaW50NjQgd3JpdHRlbjsKKworICBpZiAoIWRldl8tPmlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9wYXJ0aWFsKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CisgIH0KKworICB3cml0dGVuID0gZGV2Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmKSwgbGVuKTsKKyAgaWYgKHdyaXR0ZW4gPCAwKSB7CisgICAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CisgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9wYXJ0aWFsKCk6IGZhaWxlZCB0byB3cml0ZSB0byBRQWJzdHJhY3RTb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQtPmVycm9yKCkpOworICAgIH0KKworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9wYXJ0aWFsKCk6IGZhaWxlZCB0byB3cml0ZSB0byB1bmRlcmx5aW5nIFFJT0RldmljZSIpOworICB9CisKKyAgcmV0dXJuICh1aW50MzJfdCl3cml0dGVuOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBpZiAoIWRldl8tPmlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVzaCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOworICB9CisKKyAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CisKKyAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CisgICAgc29ja2V0LT5mbHVzaCgpOworICB9IGVsc2UgeworICAgIGRldl8tPndhaXRGb3JCeXRlc1dyaXR0ZW4oMSk7CisgIH0KK30KKwordWludDhfdCogVFFJT0RldmljZVRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgKHZvaWQpbGVuOworICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNlOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworY2xhc3MgUUlPRGV2aWNlOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogIFRyYW5zcG9ydCB0aGF0IG9wZXJhdGVzIG9uIGEgUUlPRGV2aWNlIChzb2NrZXQsIGZpbGUsIGV0YykuCisgKi8KK2NsYXNzIFRRSU9EZXZpY2VUcmFuc3BvcnQKKyAgICA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVmlydHVhbFRyYW5zcG9ydDxUUUlPRGV2aWNlVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRRSU9EZXZpY2VUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKKyAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOworCisgIHZvaWQgb3BlbigpOworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKyAgdm9pZCBjbG9zZSgpOworCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3Qgd3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCBmbHVzaCgpOworCisgIHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKTsKKworcHJpdmF0ZToKKyAgVFFJT0RldmljZVRyYW5zcG9ydChjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CisgIFRRSU9EZXZpY2VUcmFuc3BvcnQmIG9wZXJhdG9yPShjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhYWQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dGhyaWZ0L3F0L1RRVGNwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPFFNZXRhVHlwZT4KKyNpbmNsdWRlIDxRVGNwU29ja2V0PgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQ7Cit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OmZ1bmN0aW9uOwordXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitRVF9VU0VfTkFNRVNQQUNFCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitzdHJ1Y3QgVFFUY3BTZXJ2ZXI6OkNvbm5lY3Rpb25Db250ZXh0IHsKKyAgc2hhcmVkX3B0cjxRVGNwU29ja2V0PiBjb25uZWN0aW9uXzsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3RfOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3RfOworCisgIGV4cGxpY2l0IENvbm5lY3Rpb25Db250ZXh0KHNoYXJlZF9wdHI8UVRjcFNvY2tldD4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90KQorICAgIDogY29ubmVjdGlvbl8oY29ubmVjdGlvbiksIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwgaXByb3RfKGlwcm90KSwgb3Byb3RfKG9wcm90KSB7fQorfTsKKworVFFUY3BTZXJ2ZXI6OlRRVGNwU2VydmVyKHNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQpCisgIDogUU9iamVjdChwYXJlbnQpLCBzZXJ2ZXJfKHNlcnZlciksIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgcGZhY3RfKHBmYWN0KSB7CisgIHFSZWdpc3Rlck1ldGFUeXBlPFFUY3BTb2NrZXQqPigiUVRjcFNvY2tldCoiKTsKKyAgY29ubmVjdChzZXJ2ZXIuZ2V0KCksIFNJR05BTChuZXdDb25uZWN0aW9uKCkpLCBTTE9UKHByb2Nlc3NJbmNvbWluZygpKSk7Cit9CisKK1RRVGNwU2VydmVyOjp+VFFUY3BTZXJ2ZXIoKSB7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OnByb2Nlc3NJbmNvbWluZygpIHsKKyAgd2hpbGUgKHNlcnZlcl8tPmhhc1BlbmRpbmdDb25uZWN0aW9ucygpKSB7CisgICAgLy8gdGFrZSBvd25lcnNoaXAgb2YgdGhlIFFUY3BTb2NrZXQ7IHRlY2huaWNhbGx5IGl0IGNvdWxkIGJlIGRlbGV0ZWQKKyAgICAvLyB3aGVuIHRoZSBRVGNwU2VydmVyIGlzIGRlc3Ryb3llZCwgYnV0IGFueSByZWFsIGFwcCBzaG91bGQgZGVsZXRlIHRoaXMKKyAgICAvLyBjbGFzcyBiZWZvcmUgZGVsZXRpbmcgdGhlIFFUY3BTZXJ2ZXIgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICBzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IGNvbm5lY3Rpb24oc2VydmVyXy0+bmV4dFBlbmRpbmdDb25uZWN0aW9uKCkpOworCisgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90OworICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdDsKKworICAgIHRyeSB7CisgICAgICB0cmFuc3BvcnQgPSBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUUlPRGV2aWNlVHJhbnNwb3J0KGNvbm5lY3Rpb24pKTsKKyAgICAgIGlwcm90ID0gc2hhcmVkX3B0cjxUUHJvdG9jb2w+KHBmYWN0Xy0+Z2V0UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICBvcHJvdCA9IHNoYXJlZF9wdHI8VFByb3RvY29sPihwZmFjdF8tPmdldFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gRmFpbGVkIHRvIGluaXRpYWxpemUgdHJhbnNwb3J0cy9wcm90b2NvbHMiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGN0eE1hcF9bY29ubmVjdGlvbi5nZXQoKV0KKyAgICAgICAgPSBzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PihuZXcgQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbiwgdHJhbnNwb3J0LCBpcHJvdCwgb3Byb3QpKTsKKworICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKHJlYWR5UmVhZCgpKSwgU0xPVChiZWdpbkRlY29kZSgpKSk7CisKKyAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChkaXNjb25uZWN0ZWQoKSksIFNMT1Qoc29ja2V0Q2xvc2VkKCkpKTsKKyAgfQorfQorCit2b2lkIFRRVGNwU2VydmVyOjpiZWdpbkRlY29kZSgpIHsKKyAgUVRjcFNvY2tldCogY29ubmVjdGlvbihxb2JqZWN0X2Nhc3Q8UVRjcFNvY2tldCo+KHNlbmRlcigpKSk7CisgIFFfQVNTRVJUKGNvbm5lY3Rpb24pOworCisgIGlmIChjdHhNYXBfLmZpbmQoY29ubmVjdGlvbikgPT0gY3R4TWFwXy5lbmQoKSkgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIEdvdCBkYXRhIG9uIGFuIHVua25vd24gUVRjcFNvY2tldCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCA9IGN0eE1hcF9bY29ubmVjdGlvbl07CisKKyAgdHJ5IHsKKyAgICBwcm9jZXNzb3JfCisgICAgICAgIC0+cHJvY2VzcyhiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLCBjdHgsIF8xKSwKKyAgICAgICAgICAgICAgICAgIGN0eC0+aXByb3RfLAorICAgICAgICAgICAgICAgICAgY3R4LT5vcHJvdF8pOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmc6ICclcyciLCBleC53aGF0KCkpOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gcHJvY2Vzc29yIGV4Y2VwdGlvbiIpOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CisgIH0KK30KKwordm9pZCBUUVRjcFNlcnZlcjo6c29ja2V0Q2xvc2VkKCkgeworICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKKyAgUV9BU1NFUlQoY29ubmVjdGlvbik7CisgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgY29uc3QgQ29ubmVjdGlvbkNvbnRleHRNYXA6OnNpemVfdHlwZSBkZWxldGVkID0gY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgaWYgKDAgPT0gZGVsZXRlZCkgeworICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0Iik7CisgIH0KK30KKwordm9pZCBUUVRjcFNlcnZlcjo6c2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIFFNZXRhT2JqZWN0OjppbnZva2VNZXRob2QodGhpcywgImRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0IiwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24sIFFfQVJHKFFUY3BTb2NrZXQqLCBjb25uZWN0aW9uKSk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmZpbmlzaChzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSkgeworICBpZiAoIWhlYWx0aHkpIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBQcm9jZXNzb3IgZmFpbGVkIHRvIHByb2Nlc3MgZGF0YSBzdWNjZXNzZnVsbHkiKTsKKyAgICBkZWxldGVDb25uZWN0aW9uQ29udGV4dChjdHgtPmNvbm5lY3Rpb25fLmdldCgpKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzZmUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19RVENQX1NFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1RBU1lOQ19RVENQX1NFUlZFUl9IXworCisjaW5jbHVkZSA8UU9iamVjdD4KKyNpbmNsdWRlIDxRVGNwU2VydmVyPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK2NsYXNzIFRQcm90b2NvbEZhY3Rvcnk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVEFzeW5jUHJvY2Vzc29yOworCisvKioKKyAqICBTZXJ2ZXIgdGhhdCB1c2VzIFF0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMuCisgKiAgU2ltcGx5IGdpdmUgaXQgYSBRVGNwU2VydmVyIHRoYXQgaXMgbGlzdGVuaW5nLCBhbG9uZyB3aXRoIGFuIGFzeW5jCisgKiAgcHJvY2Vzc29yIGFuZCBhIHByb3RvY29sIGZhY3RvcnksIGFuZCB0aGVuIHJ1biB0aGUgUXQgZXZlbnQgbG9vcC4KKyAqLworY2xhc3MgVFFUY3BTZXJ2ZXIgOiBwdWJsaWMgUU9iamVjdCB7CisgIFFfT0JKRUNUCitwdWJsaWM6CisgIFRRVGNwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXIsCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQgPSBOVUxMKTsKKyAgdmlydHVhbCB+VFFUY3BTZXJ2ZXIoKTsKKworcHJpdmF0ZSBRX1NMT1RTOgorICB2b2lkIHByb2Nlc3NJbmNvbWluZygpOworICB2b2lkIGJlZ2luRGVjb2RlKCk7CisgIHZvaWQgc29ja2V0Q2xvc2VkKCk7CisgIHZvaWQgZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbik7CisKK3ByaXZhdGU6CisgIFFfRElTQUJMRV9DT1BZKFRRVGNwU2VydmVyKQorCisgIHN0cnVjdCBDb25uZWN0aW9uQ29udGV4dDsKKworICB2b2lkIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbik7CisgIHZvaWQgZmluaXNoKHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxRVGNwU29ja2V0Kiwgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IENvbm5lY3Rpb25Db250ZXh0TWFwOworICBDb25uZWN0aW9uQ29udGV4dE1hcCBjdHhNYXBfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DX1FUQ1BfU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RhYTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitUQ29ubmVjdGVkQ2xpZW50OjpUQ29ubmVjdGVkQ2xpZW50KGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbD4mIG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+JiBldmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIGNsaWVudCkKKworICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sXyhpbnB1dFByb3RvY29sKSwKKyAgICBvdXRwdXRQcm90b2NvbF8ob3V0cHV0UHJvdG9jb2wpLAorICAgIGV2ZW50SGFuZGxlcl8oZXZlbnRIYW5kbGVyKSwKKyAgICBjbGllbnRfKGNsaWVudCksCisgICAgb3BhcXVlQ29udGV4dF8oMCkgeworfQorCitUQ29ubmVjdGVkQ2xpZW50Ojp+VENvbm5lY3RlZENsaWVudCgpIHsKK30KKwordm9pZCBUQ29ubmVjdGVkQ2xpZW50OjpydW4oKSB7CisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgb3BhcXVlQ29udGV4dF8gPSBldmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9CisKKyAgZm9yIChib29sIGRvbmUgPSBmYWxzZTsgIWRvbmU7KSB7CisgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KG9wYXF1ZUNvbnRleHRfLCBjbGllbnRfKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIG9wYXF1ZUNvbnRleHRfKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIHN3aXRjaCAodHR4LmdldFR5cGUoKSkgeworICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFOgorICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEOgorICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVDoKKyAgICAgICAgICAvLyBDbGllbnQgZGlzY29ubmVjdGVkIG9yIHdhcyBpbnRlcnJ1cHRlZCBvciBkaWQgbm90IHJlc3BvbmQgd2l0aGluIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICAgICAgLy8gTm8gbG9nZ2luZyBuZWVkZWQuICBEb25lLgorICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAvLyBBbGwgb3RoZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4KKyAgICAgICAgICAvLyBTdGF0ZSBvZiBjb25uZWN0aW9uIGlzIHVua25vd24uICBEb25lLgorICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOworICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJiB0ZXgpIHsKKyAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgcHJvY2Vzc2luZyBleGNlcHRpb246ICIpICsgdGV4LndoYXQoKTsKKyAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAvLyBEaXNjb25uZWN0IGZyb20gY2xpZW50LCBiZWNhdXNlIHdlIGNvdWxkIG5vdCBwcm9jZXNzIHRoZSBtZXNzYWdlLgorICAgICAgZG9uZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgY2xlYW51cCgpOworfQorCit2b2lkIFRDb25uZWN0ZWRDbGllbnQ6OmNsZWFudXAoKSB7CisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgZXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChvcGFxdWVDb250ZXh0XywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgIH0KKworICB0cnkgeworICAgIGlucHV0UHJvdG9jb2xfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBpbnB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICB9CisKKyAgdHJ5IHsKKyAgICBvdXRwdXRQcm90b2NvbF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICB9CisKKyAgdHJ5IHsKKyAgICBjbGllbnRfLT5jbG9zZSgpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGNsaWVudCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllNzBjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIFRoaXMgcmVwcmVzZW50cyBhIGNsaWVudCBjb25uZWN0ZWQgdG8gYSBUU2VydmVyLiAgVGhlCisgKiBwcm9jZXNzaW5nIGxvb3AgZm9yIGEgY2xpZW50IG11c3QgcHJvdmlkZSBzb21lIHJlcXVpcmVkCisgKiBmdW5jdGlvbmFsaXR5IGNvbW1vbiB0byBhbGwgaW1wbGVtZW50YXRpb25zIHNvIGl0IGlzCisgKiBlbmNhcHN1bGF0ZWQgaGVyZS4KKyAqLworCitjbGFzcyBUQ29ubmVjdGVkQ2xpZW50IDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbVtpbl0gcHJvY2Vzc29yICAgICAgdGhlIFRQcm9jZXNzb3IKKyAgICogQHBhcmFtW2luXSBpbnB1dFByb3RvY29sICB0aGUgaW5wdXQgVFByb3RvY29sCisgICAqIEBwYXJhbVtpbl0gb3V0cHV0UHJvdG9jb2wgdGhlIG91dHB1dCBUUHJvdG9jb2wKKyAgICogQHBhcmFtW2luXSBldmVudEhhbmRsZXIgICB0aGUgc2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICogQHBhcmFtW2luXSBjbGllbnQgICAgICAgICB0aGUgVFRyYW5zcG9ydCByZXByZXNlbnRpbmcgdGhlIGNsaWVudAorICAgKi8KKyAgVENvbm5lY3RlZENsaWVudCgKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIGlucHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+JiBjbGllbnQpOworCisgIC8qKgorICAgKiBEZXN0cnVjdG9yLgorICAgKi8KKyAgdmlydHVhbCB+VENvbm5lY3RlZENsaWVudCgpOworCisgIC8qKgorICAgKiBEcml2ZSB0aGUgY2xpZW50IHVudGlsIGl0IGlzIGRvbmUuCisgICAqIFRoZSBjbGllbnQgcHJvY2Vzc2luZyBsb29wIGlzOgorICAgKgorICAgKiBbb3B0aW9uYWxdIGNhbGwgZXZlbnRIYW5kbGVyLT5jcmVhdGVDb250ZXh0IG9uY2UKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+cHJvY2Vzc0NvbnRleHQgcGVyIHJlcXVlc3QKKyAgICogICAgICAgICAgICBjYWxsIHByb2Nlc3Nvci0+cHJvY2VzcyBwZXIgcmVxdWVzdAorICAgKiAgICAgICAgICAgICAgaGFuZGxlIGV4cGVjdGVkIHRyYW5zcG9ydCBleGNlcHRpb25zOgorICAgKiAgICAgICAgICAgICAgICBFTkRfT0ZfRklMRSBtZWFucyB0aGUgY2xpZW50IGlzIGdvbmUKKyAgICogICAgICAgICAgICAgICAgSU5URVJSVVBURUQgbWVhbnMgdGhlIGNsaWVudCB3YXMgaW50ZXJydXB0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgVFNlcnZlclRyYW5zcG9ydDo6aW50ZXJydXB0Q2hpbGRyZW4oKQorICAgKiAgICAgICAgICAgICAgaGFuZGxlIHVuZXhwZWN0ZWQgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYnkgbG9nZ2luZworICAgKiAgICAgICAgICAgICAgaGFuZGxlIHN0YW5kYXJkIGV4Y2VwdGlvbnMgYnkgbG9nZ2luZworICAgKiAgICAgICAgICAgICAgaGFuZGxlIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBieSBsb2dnaW5nCisgICAqICAgICAgICAgICAgY2xlYW51cCgpCisgICAqLworICB2aXJ0dWFsIHZvaWQgcnVuKCkgLyogb3ZlcnJpZGUgKi87CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIENsZWFudXAgYWZ0ZXIgYSBjbGllbnQuICBUaGlzIGhhcHBlbnMgaWYgdGhlIGNsaWVudCBkaXNjb25uZWN0cywKKyAgICogb3IgaWYgdGhlIHNlcnZlciBpcyBzdG9wcGVkLCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzLgorICAgKgorICAgKiBUaGUgY2xlYW51cCBwcm9jZXNzaW5nIGlzOgorICAgKiBbb3B0aW9uYWxdIGNhbGwgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0IG9uY2UKKyAgICogICAgICAgICAgICBjbG9zZSB0aGUgaW5wdXRQcm90b2NvbCdzIFRUcmFuc3BvcnQKKyAgICogICAgICAgICAgICBjbG9zZSB0aGUgb3V0cHV0UHJvdG9jb2wncyBUVHJhbnNwb3J0CisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIGNsaWVudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGNsZWFudXAoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBjbGllbnRfOworCisgIC8qKgorICAgKiBDb250ZXh0IGFjcXVpcmVkIGZyb20gdGhlIGV2ZW50SGFuZGxlcl8gaWYgb25lIGV4aXN0cy4KKyAgICovCisgIHZvaWQqIG9wYXF1ZUNvbnRleHRfOworfTsKK30KK30KK30KKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmZjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKQEAgLTAsMCArMSwxNTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VsaWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2lmZGVmIEhBVkVfU0NIRURfSAorI2luY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLy8vIFRocmVlIHN0YXRlcyBmb3Igc29ja2V0czogcmVjdiBmcmFtZSBzaXplLCByZWN2IGRhdGEsIGFuZCBzZW5kIG1vZGUKK2VudW0gVFNvY2tldFN0YXRlIHsgU09DS0VUX1JFQ1ZfRlJBTUlORywgU09DS0VUX1JFQ1YsIFNPQ0tFVF9TRU5EIH07CisKKy8qKgorICogRml2ZSBzdGF0ZXMgZm9yIHRoZSBub25ibG9ja2luZyBzZXJ2ZXI6CisgKiAgMSkgaW5pdGlhbGl6ZQorICogIDIpIHJlYWQgNCBieXRlIGZyYW1lIHNpemUKKyAqICAzKSByZWFkIGZyYW1lIG9mIGRhdGEKKyAqICA0KSBzZW5kIGJhY2sgZGF0YSAoaWYgYW55KQorICogIDUpIGZvcmNlIGltbWVkaWF0ZSBjb25uZWN0aW9uIGNsb3NlCisgKi8KK2VudW0gVEFwcFN0YXRlIHsKKyAgQVBQX0lOSVQsCisgIEFQUF9SRUFEX0ZSQU1FX1NJWkUsCisgIEFQUF9SRUFEX1JFUVVFU1QsCisgIEFQUF9XQUlUX1RBU0ssCisgIEFQUF9TRU5EX1JFU1VMVCwKKyAgQVBQX0NMT1NFX0NPTk5FQ1RJT04KK307CisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbm5lY3Rpb24gdGhhdCBpcyBoYW5kbGVkIHZpYSBsaWJldmVudC4gVGhpcyBjb25uZWN0aW9uCisgKiBlc3NlbnRpYWxseSBlbmNhcHN1bGF0ZXMgYSBzb2NrZXQgdGhhdCBoYXMgc29tZSBhc3NvY2lhdGVkIGxpYmV2ZW50IHN0YXRlLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uIHsKK3ByaXZhdGU6CisgIC8vLyBTZXJ2ZXIgSU8gVGhyZWFkIGhhbmRsaW5nIHRoaXMgY29ubmVjdGlvbgorICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWRfOworCisgIC8vLyBTZXJ2ZXIgaGFuZGxlCisgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKKworICAvLy8gVFByb2Nlc3NvcgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKworICAvLy8gT2JqZWN0IHdyYXBwaW5nIG5ldHdvcmsgc29ja2V0CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiB0U29ja2V0XzsKKworICAvLy8gTGliZXZlbnQgb2JqZWN0CisgIHN0cnVjdCBldmVudCBldmVudF87CisKKyAgLy8vIExpYmV2ZW50IGZsYWdzCisgIHNob3J0IGV2ZW50RmxhZ3NfOworCisgIC8vLyBTb2NrZXQgbW9kZQorICBUU29ja2V0U3RhdGUgc29ja2V0U3RhdGVfOworCisgIC8vLyBBcHBsaWNhdGlvbiBzdGF0ZQorICBUQXBwU3RhdGUgYXBwU3RhdGVfOworCisgIC8vLyBIb3cgbXVjaCBkYXRhIG5lZWRlZCB0byByZWFkCisgIHVpbnQzMl90IHJlYWRXYW50XzsKKworICAvLy8gV2hlcmUgaW4gdGhlIHJlYWQgYnVmZmVyIGFyZSB3ZQorICB1aW50MzJfdCByZWFkQnVmZmVyUG9zXzsKKworICAvLy8gUmVhZCBidWZmZXIKKyAgdWludDhfdCogcmVhZEJ1ZmZlcl87CisKKyAgLy8vIFJlYWQgYnVmZmVyIHNpemUKKyAgdWludDMyX3QgcmVhZEJ1ZmZlclNpemVfOworCisgIC8vLyBXcml0ZSBidWZmZXIKKyAgdWludDhfdCogd3JpdGVCdWZmZXJfOworCisgIC8vLyBXcml0ZSBidWZmZXIgc2l6ZQorICB1aW50MzJfdCB3cml0ZUJ1ZmZlclNpemVfOworCisgIC8vLyBIb3cgZmFyIHRocm91Z2ggd3JpdGluZyBhcmUgd2U/CisgIHVpbnQzMl90IHdyaXRlQnVmZmVyUG9zXzsKKworICAvLy8gTGFyZ2VzdCBzaXplIG9mIHdyaXRlIGJ1ZmZlciBzZWVuIHNpbmNlIGJ1ZmZlciB3YXMgY29uc3RydWN0ZWQKKyAgc2l6ZV90IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfOworCisgIC8vLyBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNhbGxzIGZvciB1c2Ugd2l0aCBnZXRSZXNpemVCdWZmZXJFdmVyeU4oKS4KKyAgaW50MzJfdCBjYWxsc0ZvclJlc2l6ZV87CisKKyAgLy8vIFRyYW5zcG9ydCB0byByZWFkIGZyb20KKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKKworICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gb3V0cHV0VHJhbnNwb3J0XzsKKworICAvLy8gZXh0cmEgdHJhbnNwb3J0IGdlbmVyYXRlZCBieSB0cmFuc3BvcnQgZmFjdG9yeSAoZS5nLiBCdWZmZXJlZFJvdXRlclRyYW5zcG9ydCkKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKKworICAvLy8gUHJvdG9jb2wgZGVjb2RlcgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKworICAvLy8gUHJvdG9jb2wgZW5jb2RlcgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisKKyAgLy8vIFNlcnZlciBldmVudCBoYW5kbGVyLCBpZiBhbnkKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisKKyAgLy8vIFRocmlmdCBjYWxsIGNvbnRleHQsIGlmIGFueQorICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87CisKKyAgLy8vIEdvIGludG8gcmVhZCBtb2RlCisgIHZvaWQgc2V0UmVhZCgpIHsgc2V0RmxhZ3MoRVZfUkVBRCB8IEVWX1BFUlNJU1QpOyB9CisKKyAgLy8vIEdvIGludG8gd3JpdGUgbW9kZQorICB2b2lkIHNldFdyaXRlKCkgeyBzZXRGbGFncyhFVl9XUklURSB8IEVWX1BFUlNJU1QpOyB9CisKKyAgLy8vIFNldCBzb2NrZXQgaWRsZQorICB2b2lkIHNldElkbGUoKSB7IHNldEZsYWdzKDApOyB9CisKKyAgLyoqCisgICAqIFNldCBldmVudCBmbGFncyBmb3IgdGhpcyBjb25uZWN0aW9uLgorICAgKgorICAgKiBAcGFyYW0gZXZlbnRGbGFncyBmbGFncyB3ZSBwYXNzIHRvIGxpYmV2ZW50IGZvciB0aGUgY29ubmVjdGlvbi4KKyAgICovCisgIHZvaWQgc2V0RmxhZ3Moc2hvcnQgZXZlbnRGbGFncyk7CisKKyAgLyoqCisgICAqIExpYmV2ZW50IGhhbmRsZXIgY2FsbGVkICh2aWEgb3VyIHN0YXRpYyB3cmFwcGVyKSB3aGVuIHRoZSBjb25uZWN0aW9uCisgICAqIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFJhdGhlciB0aGFuIHVzZSB0aGUgZmxhZ3MgbGliZXZlbnQgcGFzc2VkLAorICAgKiB3ZSB1c2UgdGhlIGNvbm5lY3Rpb24gc3RhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byByZWFkIG9yCisgICAqIHdyaXRlIHRoZSBzb2NrZXQuCisgICAqLworICB2b2lkIHdvcmtTb2NrZXQoKTsKKworcHVibGljOgorICBjbGFzcyBUYXNrOworCisgIC8vLyBDb25zdHJ1Y3RvcgorICBUQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0LAorICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpIHsKKyAgICByZWFkQnVmZmVyXyA9IE5VTEw7CisgICAgcmVhZEJ1ZmZlclNpemVfID0gMDsKKworICAgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOworICAgIHNlcnZlcl8gPSBpb1RocmVhZC0+Z2V0U2VydmVyKCk7CisKKyAgICAvLyBBbGxvY2F0ZSBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMgdGhlc2Ugb25seSBuZWVkIHRvIGJlIGFsbG9jYXRlZAorICAgIC8vIG9uY2UgcGVyIFRDb25uZWN0aW9uICh0aGV5IGRvbid0IG5lZWQgdG8gYmUgcmVhbGxvY2F0ZWQgb24gaW5pdCgpIGNhbGwpCisgICAgaW5wdXRUcmFuc3BvcnRfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyU2l6ZV8pKTsKKyAgICBvdXRwdXRUcmFuc3BvcnRfLnJlc2V0KAorICAgICAgICBuZXcgVE1lbW9yeUJ1ZmZlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VydmVyXy0+Z2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpKSkpOworCisgICAgdFNvY2tldF8gPSAgc29ja2V0OworCisgICAgaW5pdChpb1RocmVhZCk7CisgIH0KKworICB+VENvbm5lY3Rpb24oKSB7IHN0ZDo6ZnJlZShyZWFkQnVmZmVyXyk7IH0KKworICAvLy8gQ2xvc2UgdGhpcyBjb25uZWN0aW9uIGFuZCBmcmVlIG9yIHJlc2V0IGl0cyByZXNvdXJjZXMuCisgIHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICAqIENoZWNrIGJ1ZmZlcnMgYWdhaW5zdCBhbnkgc2l6ZSBsaW1pdHMgYW5kIHNocmluayBpdCBpZiBleGNlZWRlZC4KKyAgICAqCisgICAgKiBAcGFyYW0gcmVhZExpbWl0IHdlIHJlZHVjZSByZWFkIGJ1ZmZlciBzaXplIHRvIHRoaXMgKGlmIG5vbnplcm8pLgorICAgICogQHBhcmFtIHdyaXRlTGltaXQgaWYgbm9uemVybyBhbmQgd3JpdGUgYnVmZmVyIGlzIGxhcmdlciwgcmVwbGFjZSBpdC4KKyAgICAqLworICB2b2lkIGNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCByZWFkTGltaXQsIHNpemVfdCB3cml0ZUxpbWl0KTsKKworICAvLy8gSW5pdGlhbGl6ZQorICB2b2lkIGluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKTsKKworICAvLy8gc2V0IHNvY2tldCBmb3IgY29ubmVjdGlvbgorICB2b2lkIHNldFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKKworICAvKioKKyAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bworICAgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKKyAgICogdG8sIG9yIGZpbmlzaGVkIHJlY2VpdmluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZCB0by4KKyAgICovCisgIHZvaWQgdHJhbnNpdGlvbigpOworCisgIC8qKgorICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIGNvbm5lY3Rpb24gZXZlbnRzLiAgUHJvdmlkZXMgYSBjYWxsYmFjaworICAgKiB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHdoaWNoIGludm9rZXMgY29ubmVjdGlvbl8tPndvcmtTb2NrZXQoKS4KKyAgICoKKyAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cnJlZCBvbi4KKyAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgorICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFRDb25uZWN0aW9uJ3MgInRoaXMiLgorICAgKi8KKyAgc3RhdGljIHZvaWQgZXZlbnRIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgLyogd2hpY2ggKi8sIHZvaWQqIHYpIHsKKyAgICBhc3NlcnQoZmQgPT0gc3RhdGljX2Nhc3Q8ZXZ1dGlsX3NvY2tldF90PigoKFRDb25uZWN0aW9uKil2KS0+Z2V0VFNvY2tldCgpLT5nZXRTb2NrZXRGRCgpKSk7CisgICAgKChUQ29ubmVjdGlvbiopdiktPndvcmtTb2NrZXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBOb3RpZmljYXRpb24gdG8gc2VydmVyIHRoYXQgcHJvY2Vzc2luZyBoYXMgZW5kZWQgb24gdGhpcyByZXF1ZXN0LgorICAgKiBDYW4gYmUgY2FsbGVkIGVpdGhlciB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGVkIG9yIHdoZW4gYSB3YWl0aW5nCisgICAqIHRhc2sgaGFzIGJlZW4gcHJlZW1wdGl2ZWx5IHRlcm1pbmF0ZWQgKG9uIG92ZXJsb2FkKS4KKyAgICoKKyAgICogRG9uJ3QgY2FsbCB0aGlzIGZyb20gdGhlIElPIHRocmVhZCBpdHNlbGYuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bmFibGUgdG8gbm90aWZ5IChjaGVjayBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUikuCisgICAqLworICBib29sIG5vdGlmeUlPVGhyZWFkKCkgeyByZXR1cm4gaW9UaHJlYWRfLT5ub3RpZnkodGhpcyk7IH0KKworICAvKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhpcyBjb25uZWN0aW9uJ3MgY3VycmVudGx5IGFzc2lnbmVkIElPCisgICAqIHRocmVhZC4KKyAgICovCisgIGludCBnZXRJT1RocmVhZE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIGlvVGhyZWFkXy0+Z2V0VGhyZWFkTnVtYmVyKCk7IH0KKworICAvLy8gRm9yY2UgY29ubmVjdGlvbiBzaHV0ZG93biBmb3IgdGhpcyBjb25uZWN0aW9uLgorICB2b2lkIGZvcmNlQ2xvc2UoKSB7CisgICAgYXBwU3RhdGVfID0gQVBQX0NMT1NFX0NPTk5FQ1RJT047CisgICAgaWYgKCFub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVENvbm5lY3Rpb246OmZvcmNlQ2xvc2U6IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOworICAgIH0KKyAgfQorCisgIC8vLyByZXR1cm4gdGhlIHNlcnZlciB0aGlzIGNvbm5lY3Rpb24gd2FzIGluaXRpYWxpemVkIGZvci4KKyAgVE5vbmJsb2NraW5nU2VydmVyKiBnZXRTZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJfOyB9CisKKyAgLy8vIGdldCBzdGF0ZSBvZiBjb25uZWN0aW9uLgorICBUQXBwU3RhdGUgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBhcHBTdGF0ZV87IH0KKworICAvLy8gcmV0dXJuIHRoZSBUU29ja2V0IHRyYW5zcG9ydCB3cmFwcGluZyB0aGlzIG5ldHdvcmsgY29ubmVjdGlvbgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gZ2V0VFNvY2tldCgpIGNvbnN0IHsgcmV0dXJuIHRTb2NrZXRfOyB9CisKKyAgLy8vIHJldHVybiB0aGUgc2VydmVyIGV2ZW50IGhhbmRsZXIgaWYgYW55CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CisKKyAgLy8vIHJldHVybiB0aGUgVGhyaWZ0IGNvbm5lY3Rpb24gY29udGV4dCBpZiBhbnkKKyAgdm9pZCogZ2V0Q29ubmVjdGlvbkNvbnRleHQoKSB7IHJldHVybiBjb25uZWN0aW9uQ29udGV4dF87IH0KK307CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworcHVibGljOgorICBUYXNrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAorICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKQorICAgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgICAgaW5wdXRfKGlucHV0KSwKKyAgICAgIG91dHB1dF8ob3V0cHV0KSwKKyAgICAgIGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLAorICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXyhjb25uZWN0aW9uXy0+Z2V0U2VydmVyRXZlbnRIYW5kbGVyKCkpLAorICAgICAgY29ubmVjdGlvbkNvbnRleHRfKGNvbm5lY3Rpb25fLT5nZXRDb25uZWN0aW9uQ29udGV4dCgpKSB7fQorCisgIHZvaWQgcnVuKCkgeworICAgIHRyeSB7CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBjb25uZWN0aW9uXy0+Z2V0VFNvY2tldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRfLCBvdXRwdXRfLCBjb25uZWN0aW9uQ29udGV4dF8pCisgICAgICAgICAgICB8fCAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogY2xpZW50IGRpZWQ6ICVzIiwgdHR4LndoYXQoKSk7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfYWxsb2MmKSB7CisgICAgICBHbG9iYWxPdXRwdXQoIlROb25ibG9ja2luZ1NlcnZlcjogY2F1Z2h0IGJhZF9hbGxvYyBleGNlcHRpb24uIik7CisgICAgICBleGl0KDEpOworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiB4KSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHByb2Nlc3MoKSBleGNlcHRpb246ICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHgud2hhdCgpKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogdW5rbm93biBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZy4iKTsKKyAgICB9CisKKyAgICAvLyBTaWduYWwgY29tcGxldGlvbiBiYWNrIHRvIHRoZSBsaWJldmVudCB0aHJlYWQgdmlhIGEgcGlwZQorICAgIGlmICghY29ubmVjdGlvbl8tPm5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogZmFpbGVkIHRvIG5vdGlmeUlPVGhyZWFkLCBjbG9zaW5nLiIpOworICAgICAgY29ubmVjdGlvbl8tPnNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5jbG9zZSgpOworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpUYXNrOjpydW46IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOworICAgIH0KKyAgfQorCisgIFRDb25uZWN0aW9uKiBnZXRUQ29ubmVjdGlvbigpIHsgcmV0dXJuIGNvbm5lY3Rpb25fOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87CisgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKK307CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6aW5pdChUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpIHsKKyAgaW9UaHJlYWRfID0gaW9UaHJlYWQ7CisgIHNlcnZlcl8gPSBpb1RocmVhZC0+Z2V0U2VydmVyKCk7CisgIGFwcFN0YXRlXyA9IEFQUF9JTklUOworICBldmVudEZsYWdzXyA9IDA7CisKKyAgcmVhZEJ1ZmZlclBvc18gPSAwOworICByZWFkV2FudF8gPSAwOworCisgIHdyaXRlQnVmZmVyXyA9IE5VTEw7CisgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOworICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CisKKyAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1ZfRlJBTUlORzsKKyAgY2FsbHNGb3JSZXNpemVfID0gMDsKKworICAvLyBnZXQgaW5wdXQvdHJhbnNwb3J0cworICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOworCisgIC8vIENyZWF0ZSBwcm90b2NvbAorICBpZiAoc2VydmVyXy0+Z2V0SGVhZGVyVHJhbnNwb3J0KCkpIHsKKyAgICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gaW5wdXRQcm90b2NvbF87CisgIH0gZWxzZSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICB9CisKKyAgLy8gU2V0IHVwIGZvciBhbnkgc2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgc2VydmVyRXZlbnRIYW5kbGVyXyA9IHNlcnZlcl8tPmdldEV2ZW50SGFuZGxlcigpOworICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IHNlcnZlckV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbkNvbnRleHRfID0gTlVMTDsKKyAgfQorCisgIC8vIEdldCB0aGUgcHJvY2Vzc29yCisgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLT5nZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdFNvY2tldF8pOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnNldFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KSB7CisgIHRTb2NrZXRfID0gc29ja2V0OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSB7CisgIGludCBnb3QgPSAwLCBsZWZ0ID0gMCwgc2VudCA9IDA7CisgIHVpbnQzMl90IGZldGNoID0gMDsKKworICBzd2l0Y2ggKHNvY2tldFN0YXRlXykgeworICBjYXNlIFNPQ0tFVF9SRUNWX0ZSQU1JTkc6CisgICAgdW5pb24geworICAgICAgdWludDhfdCBidWZbc2l6ZW9mKHVpbnQzMl90KV07CisgICAgICB1aW50MzJfdCBzaXplOworICAgIH0gZnJhbWluZzsKKworICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgcmVjZWl2ZWQgc29tZSBieXRlcyB3ZSBrZXB0IHRoZW0gaGVyZQorICAgIGZyYW1pbmcuc2l6ZSA9IHJlYWRXYW50XzsKKyAgICAvLyBkZXRlcm1pbmUgc2l6ZSBvZiB0aGlzIGZyYW1lCisgICAgdHJ5IHsKKyAgICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgICAgICBmZXRjaCA9IHRTb2NrZXRfLT5yZWFkKCZmcmFtaW5nLmJ1ZltyZWFkQnVmZmVyUG9zX10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KHNpemVvZihmcmFtaW5nLnNpemUpIC0gcmVhZEJ1ZmZlclBvc18pKTsKKyAgICAgIGlmIChmZXRjaCA9PSAwKSB7CisgICAgICAgIC8vIFdoZW5ldmVyIHdlIGdldCBoZXJlIGl0IG1lYW5zIGEgcmVtb3RlIGRpc2Nvbm5lY3QKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gZmV0Y2g7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIC8vSW4gTm9uYmxvY2tpbmcgU1NMU29ja2V0IHNvbWUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHJldHJpZWQgYWdhaW4uCisgICAgICAvL0N1cnJlbnQgYXBwcm9hY2ggaXMgcGFyc2luZyBleGNlcHRpb24gbWVzc2FnZSwgYnV0IGEgYmV0dGVyIHNvbHV0aW9uIG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgIGlmKCFzdHJzdHIodGUud2hhdCgpLCAicmV0cnkiKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7CisgICAgICAgIGNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IHNpemVvZihmcmFtaW5nLnNpemUpKSB7CisgICAgICAvLyBtb3JlIG5lZWRlZCBiZWZvcmUgZnJhbWUgc2l6ZSBpcyBrbm93biAtLSBzYXZlIHdoYXQgd2UgaGF2ZSBzbyBmYXIKKyAgICAgIHJlYWRXYW50XyA9IGZyYW1pbmcuc2l6ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZWFkV2FudF8gPSBudG9obChmcmFtaW5nLnNpemUpOworICAgIGlmIChyZWFkV2FudF8gPiBzZXJ2ZXJfLT5nZXRNYXhGcmFtZVNpemUoKSkgeworICAgICAgLy8gRG9uJ3QgYWxsb3cgZ2lhbnQgZnJhbWUgc2l6ZXMuICBUaGlzIHByZXZlbnRzIGJhZCBjbGllbnRzIGZyb20KKyAgICAgIC8vIGNhdXNpbmcgdXMgdG8gdHJ5IGFuZCBhbGxvY2F0ZSBhIGdpYW50IGJ1ZmZlci4KKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjogZnJhbWUgc2l6ZSB0b28gbGFyZ2UgIgorICAgICAgICAgICIoJSIgUFJJdTMyICIgPiAlIiBQUkl1NjQKKyAgICAgICAgICAiKSBmcm9tIGNsaWVudCAlcy4gIgorICAgICAgICAgICJSZW1vdGUgc2lkZSBub3QgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydD8iLAorICAgICAgICAgIHJlYWRXYW50XywKKyAgICAgICAgICAodWludDY0X3Qpc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCksCisgICAgICAgICAgdFNvY2tldF8tPmdldFNvY2tldEluZm8oKS5jX3N0cigpKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHNpemUga25vd247IG5vdyBnZXQgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lCisgICAgdHJhbnNpdGlvbigpOworCisgICAgLy8gSWYgdGhlIHNvY2tldCBoYXMgbW9yZSBkYXRhIHRoYW4gdGhlIGZyYW1lIGhlYWRlciwgY29udGludWUgdG8gd29yayBvbiBpdC4gVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvcgorICAgIC8vIHJlZ3VsYXIgc29ja2V0cywgYmVjYXVzZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEsIGxpYmV2ZW50IHdpbGwgZmlyZSB0aGUgZXZlbnQgaGFuZGxlciByZWdpc3RlcmVkIGZvciByZWFkCisgICAgLy8gcmVhZGluZXNzLCB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCB3b3JrU29ja2V0KCkuIEhvd2V2ZXIsIHNvbWUgc29ja2V0IHR5cGVzIChzdWNoIGFzIFRTU0xTb2NrZXQpIG1heSBoYXZlIHRoZQorICAgIC8vIGRhdGEgc2l0dGluZyBpbiB0aGVpciBpbnRlcm5hbCBidWZmZXJzIGFuZCBmcm9tIGxpYmV2ZW50J3MgcGVyc3BlY3RpdmUsIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZGF0YSBhdmFpbGFibGUuIEluCisgICAgLy8gdGhhdCBjYXNlLCBub3QgaGF2aW5nIHRoaXMgd29ya1NvY2tldCgpIGNhbGwgaGVyZSB3b3VsZCByZXN1bHQgaW4gYSBoYW5nIGFzIHdlIHdpbGwgbmV2ZXIgZ2V0IHRvIHdvcmsgdGhlIHNvY2tldCwKKyAgICAvLyBkZXNwaXRlIGhhdmluZyBtb3JlIGRhdGEuCisgICAgaWYgKHRTb2NrZXRfLT5oYXNQZW5kaW5nRGF0YVRvUmVhZCgpKQorICAgIHsKKyAgICAgICAgd29ya1NvY2tldCgpOworICAgIH0KKworICAgIHJldHVybjsKKworICBjYXNlIFNPQ0tFVF9SRUNWOgorICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGJlIGluIHRoaXMgc3RhdGUgaWYgd2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YQorICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8IHJlYWRXYW50Xyk7CisKKyAgICB0cnkgeworICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgICAgIGZldGNoID0gcmVhZFdhbnRfIC0gcmVhZEJ1ZmZlclBvc187CisgICAgICBnb3QgPSB0U29ja2V0Xy0+cmVhZChyZWFkQnVmZmVyXyArIHJlYWRCdWZmZXJQb3NfLCBmZXRjaCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIC8vSW4gTm9uYmxvY2tpbmcgU1NMU29ja2V0IHNvbWUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHJldHJpZWQgYWdhaW4uCisgICAgICAvL0N1cnJlbnQgYXBwcm9hY2ggaXMgcGFyc2luZyBleGNlcHRpb24gbWVzc2FnZSwgYnV0IGEgYmV0dGVyIHNvbHV0aW9uIG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgIGlmKCFzdHJzdHIodGUud2hhdCgpLCAicmV0cnkiKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZ290ID4gMCkgeworICAgICAgLy8gTW92ZSBhbG9uZyBpbiB0aGUgYnVmZmVyCisgICAgICByZWFkQnVmZmVyUG9zXyArPSBnb3Q7CisKKyAgICAgIC8vIENoZWNrIHRoYXQgd2UgZGlkIG5vdCBvdmVyZG8gaXQKKyAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8PSByZWFkV2FudF8pOworCisgICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nLCBtb3ZlIG9udG8gdGhlIG5leHQgc3RhdGUKKyAgICAgIGlmIChyZWFkQnVmZmVyUG9zXyA9PSByZWFkV2FudF8pIHsKKyAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW5ldmVyIHdlIGdldCBkb3duIGhlcmUgaXQgbWVhbnMgYSByZW1vdGUgZGlzY29ubmVjdAorICAgIGNsb3NlKCk7CisKKyAgICByZXR1cm47CisKKyAgY2FzZSBTT0NLRVRfU0VORDoKKyAgICAvLyBTaG91bGQgbmV2ZXIgaGF2ZSBwb3NpdGlvbiBwYXN0IHNpemUKKyAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyU2l6ZV8pOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB0byBzZW5kLCB0aGVuIGxldCB1cyBtb3ZlIG9uCisgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICBHbG9iYWxPdXRwdXQoIldBUk5JTkc6IFNlbmQgc3RhdGUgd2l0aCBubyBkYXRhIHRvIHNlbmQiKTsKKyAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgbGVmdCA9IHdyaXRlQnVmZmVyU2l6ZV8gLSB3cml0ZUJ1ZmZlclBvc187CisgICAgICBzZW50ID0gdFNvY2tldF8tPndyaXRlX3BhcnRpYWwod3JpdGVCdWZmZXJfICsgd3JpdGVCdWZmZXJQb3NfLCBsZWZ0KTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMgIiwgdGUud2hhdCgpKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd3JpdGVCdWZmZXJQb3NfICs9IHNlbnQ7CisKKyAgICAvLyBEaWQgd2Ugb3ZlcmRvIGl0PworICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJTaXplXyk7CisKKyAgICAvLyBXZSBhcmUgZG9uZSEKKyAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRyYW5zaXRpb24oKTsKKyAgICB9CisKKyAgICByZXR1cm47CisKKyAgZGVmYXVsdDoKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJVbmV4cGVjdGVkIFNvY2tldCBTdGF0ZSAlZCIsIHNvY2tldFN0YXRlXyk7CisgICAgYXNzZXJ0KDApOworICB9Cit9CisKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpnZXRIZWFkZXJUcmFuc3BvcnQoKSB7CisgIC8vIEN1cnJlbnRseSBpZiB0aGVyZSBpcyBubyBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSwKKyAgLy8gd2UgYXNzdW1lIGhlYWRlciB0cmFuc3BvcnQgKHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZQorICAvLyBhIG5ldyB0cmFuc3BvcnQgYW5kIGNoZWNrKQorICByZXR1cm4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgPT0gTlVMTDsKK30KKworLyoqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCisgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKKyAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6dHJhbnNpdGlvbigpIHsKKyAgLy8gZW5zdXJlIHRoaXMgY29ubmVjdGlvbiBpcyBhY3RpdmUgcmlnaHQgbm93CisgIGFzc2VydChpb1RocmVhZF8pOworICBhc3NlcnQoc2VydmVyXyk7CisKKyAgLy8gU3dpdGNoIHVwb24gdGhlIHN0YXRlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBpbiBhbmQgbW92ZSB0byBhIG5ldyBzdGF0ZQorICBzd2l0Y2ggKGFwcFN0YXRlXykgeworCisgIGNhc2UgQVBQX1JFQURfUkVRVUVTVDoKKyAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nIHRoZSByZXF1ZXN0LCBwYWNrYWdlIHRoZSByZWFkIGJ1ZmZlciBpbnRvIHRyYW5zcG9ydAorICAgIC8vIGFuZCBnZXQgYmFjayBzb21lIGRhdGEgZnJvbSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24KKyAgICBpZiAoc2VydmVyXy0+Z2V0SGVhZGVyVHJhbnNwb3J0KCkpIHsKKyAgICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJQb3NfKTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIHNhdmVkIHJvb20gZm9yIHRoZSBmcmFtaW5nIHNpemUgaW4gY2FzZSBoZWFkZXIgdHJhbnNwb3J0IG5lZWRlZCBpdCwKKyAgICAgIC8vIGJ1dCBqdXN0IHNraXAgaXQgZm9yIHRoZSBub24taGVhZGVyIGNhc2UKKyAgICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8gKyA0LCByZWFkQnVmZmVyUG9zXyAtIDQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKworICAgICAgLy8gUHJlcGVuZCBmb3VyIGJ5dGVzIG9mIGJsYW5rIHNwYWNlIHRvIHRoZSBidWZmZXIgc28gd2UgY2FuCisgICAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldFdyaXRlUHRyKDQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+d3JvdGVCeXRlcyg0KTsKKyAgICB9CisKKyAgICBzZXJ2ZXJfLT5pbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisKKyAgICBpZiAoc2VydmVyXy0+aXNUaHJlYWRQb29sUHJvY2Vzc2luZygpKSB7CisgICAgICAvLyBXZSBhcmUgc2V0dGluZyB1cCBhIFRhc2sgdG8gZG8gdGhpcyB3b3JrIGFuZCB3ZSB3aWxsIHdhaXQgb24gaXQKKworICAgICAgLy8gQ3JlYXRlIHRhc2sgYW5kIGRpc3BhdGNoIHRvIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigKKyAgICAgICAgICBuZXcgVGFzayhwcm9jZXNzb3JfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCB0aGlzKSk7CisgICAgICAvLyBUaGUgYXBwbGljYXRpb24gaXMgbm93IHdhaXRpbmcgb24gdGhlIHRhc2sgdG8gZmluaXNoCisgICAgICBhcHBTdGF0ZV8gPSBBUFBfV0FJVF9UQVNLOworCisgICAgICAvLyBTZXQgdGhpcyBjb25uZWN0aW9uIGlkbGUgc28gdGhhdCBsaWJldmVudCBkb2Vzbid0IHByb2Nlc3MgbW9yZQorICAgICAgLy8gZGF0YSBvbiBpdCB3aGlsZSB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgdGhyZWFkbWFuYWdlciB0bworICAgICAgLy8gZmluaXNoIHRoaXMgdGFzaworICAgICAgc2V0SWRsZSgpOworCisgICAgICB0cnkgeworICAgICAgICBzZXJ2ZXJfLT5hZGRUYXNrKHRhc2spOworICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uJiBpc2UpIHsKKyAgICAgICAgLy8gVGhlIFRocmVhZE1hbmFnZXIgaXMgbm90IHJlYWR5IHRvIGhhbmRsZSBhbnkgbW9yZSB0YXNrcyAoaXQncyBwcm9iYWJseSBzaHV0dGluZyBkb3duKS4KKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiSWxsZWdhbFN0YXRlRXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIGlzZS53aGF0KCkpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYgdG8pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiW0VSUk9SXSBUaW1lZE91dEV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCB0by53aGF0KCkpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKKyAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGdldFRTb2NrZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSW52b2tlIHRoZSBwcm9jZXNzb3IKKyAgICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBjb25uZWN0aW9uQ29udGV4dF8pOworICAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoCisgICAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyIHRyYW5zcG9ydCBlcnJvciBpbiAiCisgICAgICAgICAgICAicHJvY2VzcygpOiAlcyIsCisgICAgICAgICAgICB0dHgud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTZXJ2ZXI6OnByb2Nlc3MoKSB1bmNhdWdodCBleGNlcHRpb246ICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNlcnZlcjo6cHJvY2VzcygpIHVua25vd24gZXhjZXB0aW9uIik7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICAvLyBmYWxsdGhyb3VnaAorCisgIC8vIEludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUsIHRoZSBjYWxsIHRvIHByb2Nlc3MgaGFzIHdyaXR0ZW4gaW50bworICAvLyB0aGUgd3JpdGVCdWZmZXJfCisKKyAgY2FzZSBBUFBfV0FJVF9UQVNLOgorICAgIC8vIFdlIGhhdmUgbm93IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB0YXNrIGFuZCB0aGUgcmVzdWx0IGhhcyBiZWVuIHdyaXR0ZW4KKyAgICAvLyBpbnRvIHRoZSBvdXRwdXRUcmFuc3BvcnRfLCBzbyB3ZSBncmFiIGl0cyBjb250ZW50cyBhbmQgcGxhY2UgdGhlbSBpbnRvCisgICAgLy8gdGhlIHdyaXRlQnVmZmVyXyBmb3IgYWN0dWFsIHdyaXRpbmcgYnkgdGhlIGxpYmV2ZW50IHRocmVhZAorCisgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRCdWZmZXIoJndyaXRlQnVmZmVyXywgJndyaXRlQnVmZmVyU2l6ZV8pOworCisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGNhbGwgZ2VuZXJhdGVkIHJldHVybiBkYXRhLCB0aGVuIG1vdmUgaW50byB0aGUgc2VuZAorICAgIC8vIHN0YXRlIGFuZCBnZXQgZ29pbmcKKyAgICAvLyA0IGJ5dGVzIHdlcmUgcmVzZXJ2ZWQgZm9yIGZyYW1lIHNpemUKKyAgICBpZiAod3JpdGVCdWZmZXJTaXplXyA+IDQpIHsKKworICAgICAgLy8gTW92ZSBpbnRvIHdyaXRlIHN0YXRlCisgICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICAgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1NFTkQ7CisKKyAgICAgIC8vIFB1dCB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSB3cml0ZSBidWZmZXIKKyAgICAgIGludDMyX3QgZnJhbWVTaXplID0gKGludDMyX3QpaHRvbmwod3JpdGVCdWZmZXJTaXplXyAtIDQpOworICAgICAgbWVtY3B5KHdyaXRlQnVmZmVyXywgJmZyYW1lU2l6ZSwgNCk7CisKKyAgICAgIC8vIFNvY2tldCBpbnRvIHdyaXRlIG1vZGUKKyAgICAgIGFwcFN0YXRlXyA9IEFQUF9TRU5EX1JFU1VMVDsKKyAgICAgIHNldFdyaXRlKCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXF1ZXN0IHdhcyBvbmV3YXkgYW5kIHdlIHNob3VsZCBmYWxsIHRocm91Z2gKKyAgICAvLyByaWdodCBiYWNrIGludG8gdGhlIHJlYWQgZnJhbWUgaGVhZGVyIHN0YXRlCisgICAgZ290byBMQUJFTF9BUFBfSU5JVDsKKworICBjYXNlIEFQUF9TRU5EX1JFU1VMVDoKKyAgICAvLyBpdCdzIG5vdyBzYWZlIHRvIHBlcmZvcm0gYnVmZmVyIHNpemUgaG91c2VrZWVwaW5nLgorICAgIGlmICh3cml0ZUJ1ZmZlclNpemVfID4gbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8pIHsKKyAgICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gd3JpdGVCdWZmZXJTaXplXzsKKyAgICB9CisgICAgaWYgKHNlcnZlcl8tPmdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpID4gMAorICAgICAgICAmJiArK2NhbGxzRm9yUmVzaXplXyA+PSBzZXJ2ZXJfLT5nZXRSZXNpemVCdWZmZXJFdmVyeU4oKSkgeworICAgICAgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2VydmVyXy0+Z2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyXy0+Z2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoKSk7CisgICAgICBjYWxsc0ZvclJlc2l6ZV8gPSAwOworICAgIH0KKyAgICAvLyBmYWxsdGhyb3VnaAorCisgIC8vIE4uQi46IFdlIGFsc28gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSBpbnRvIHRoZSBJTklUIHN0YXRlIQorCisgIExBQkVMX0FQUF9JTklUOgorICBjYXNlIEFQUF9JTklUOgorCisgICAgLy8gQ2xlYXIgd3JpdGUgYnVmZmVyIHZhcmlhYmxlcworICAgIHdyaXRlQnVmZmVyXyA9IE5VTEw7CisgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKKworICAgIC8vIEludG8gcmVhZDQgc3RhdGUgd2UgZ28KKyAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVl9GUkFNSU5HOworICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX0ZSQU1FX1NJWkU7CisKKyAgICByZWFkQnVmZmVyUG9zXyA9IDA7CisKKyAgICAvLyBSZWdpc3RlciByZWFkIGV2ZW50CisgICAgc2V0UmVhZCgpOworCisgICAgcmV0dXJuOworCisgIGNhc2UgQVBQX1JFQURfRlJBTUVfU0laRToKKyAgICByZWFkV2FudF8gKz0gNDsKKworICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgKKyAgICAvLyBEb3VibGUgdGhlIGJ1ZmZlciBzaXplIHVudGlsIGl0IGlzIGJpZyBlbm91Z2gKKyAgICBpZiAocmVhZFdhbnRfID4gcmVhZEJ1ZmZlclNpemVfKSB7CisgICAgICBpZiAocmVhZEJ1ZmZlclNpemVfID09IDApIHsKKyAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gMTsKKyAgICAgIH0KKyAgICAgIHVpbnQzMl90IG5ld1NpemUgPSByZWFkQnVmZmVyU2l6ZV87CisgICAgICB3aGlsZSAocmVhZFdhbnRfID4gbmV3U2l6ZSkgeworICAgICAgICBuZXdTaXplICo9IDI7CisgICAgICB9CisKKyAgICAgIHVpbnQ4X3QqIG5ld0J1ZmZlciA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOworICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBiZSBkb25lLi4uCisgICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisgICAgICByZWFkQnVmZmVyXyA9IG5ld0J1ZmZlcjsKKyAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7CisgICAgfQorCisgICAgcmVhZEJ1ZmZlclBvc18gPSA0OworICAgICooKHVpbnQzMl90KilyZWFkQnVmZmVyXykgPSBodG9ubChyZWFkV2FudF8gLSA0KTsKKworICAgIC8vIE1vdmUgaW50byByZWFkIHJlcXVlc3Qgc3RhdGUKKyAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVjsKKyAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9SRVFVRVNUOworCisgICAgcmV0dXJuOworCisgIGNhc2UgQVBQX0NMT1NFX0NPTk5FQ1RJT046CisgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgIGNsb3NlKCk7CisgICAgcmV0dXJuOworCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVW5leHBlY3RlZCBBcHBsaWNhdGlvbiBTdGF0ZSAlZCIsIGFwcFN0YXRlXyk7CisgICAgYXNzZXJ0KDApOworICB9Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6c2V0RmxhZ3Moc2hvcnQgZXZlbnRGbGFncykgeworICAvLyBDYXRjaCB0aGUgZG8gbm90aGluZyBjYXNlCisgIGlmIChldmVudEZsYWdzXyA9PSBldmVudEZsYWdzKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRGVsZXRlIGEgcHJldmlvdXNseSBleGlzdGluZyBldmVudAorICBpZiAoZXZlbnRGbGFnc18gJiYgZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCkgZXZlbnRfZGVsIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFVwZGF0ZSBpbiBtZW1vcnkgc3RydWN0dXJlCisgIGV2ZW50RmxhZ3NfID0gZXZlbnRGbGFnczsKKworICAvLyBEbyBub3QgY2FsbCBldmVudF9zZXQgaWYgdGhlcmUgYXJlIG5vIGZsYWdzCisgIGlmICghZXZlbnRGbGFnc18pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKgorICAgKiBldmVudF9zZXQ6CisgICAqCisgICAqIFByZXBhcmVzIHRoZSBldmVudCBzdHJ1Y3R1cmUgJmV2ZW50IHRvIGJlIHVzZWQgaW4gZnV0dXJlIGNhbGxzIHRvCisgICAqIGV2ZW50X2FkZCgpIGFuZCBldmVudF9kZWwoKS4gIFRoZSBldmVudCB3aWxsIGJlIHByZXBhcmVkIHRvIGNhbGwgdGhlCisgICAqIGV2ZW50SGFuZGxlciB1c2luZyB0aGUgJ3NvY2snIGZpbGUgZGVzY3JpcHRvciB0byBtb25pdG9yIGV2ZW50cy4KKyAgICoKKyAgICogVGhlIGV2ZW50cyBjYW4gYmUgZWl0aGVyIEVWX1JFQUQsIEVWX1dSSVRFLCBvciBib3RoLCBpbmRpY2F0aW5nCisgICAqIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHJlYWQgb3Igd3JpdGUgZnJvbSB0aGUgZmlsZSByZXNwZWN0aXZlbHkgd2l0aG91dAorICAgKiBibG9ja2luZy4KKyAgICoKKyAgICogVGhlIGV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0cmlnZ2VyZWQKKyAgICogdGhlIGV2ZW50IGFuZCB0aGUgdHlwZSBvZiBldmVudCB3aGljaCB3aWxsIGJlIG9uZSBvZjogRVZfVElNRU9VVCwKKyAgICogRVZfU0lHTkFMLCBFVl9SRUFELCBFVl9XUklURS4KKyAgICoKKyAgICogVGhlIGFkZGl0aW9uYWwgZmxhZyBFVl9QRVJTSVNUIG1ha2VzIGFuIGV2ZW50X2FkZCgpIHBlcnNpc3RlbnQgdW50aWwKKyAgICogZXZlbnRfZGVsKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgKgorICAgKiBPbmNlIGluaXRpYWxpemVkLCB0aGUgJmV2ZW50IHN0cnVjdCBjYW4gYmUgdXNlZCByZXBlYXRlZGx5IHdpdGgKKyAgICogZXZlbnRfYWRkKCkgYW5kIGV2ZW50X2RlbCgpIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlaW5pdGlhbGl6ZWQgdW5sZXNzCisgICAqIHRoZSBldmVudEhhbmRsZXIgYW5kL29yIHRoZSBhcmd1bWVudCB0byBpdCBhcmUgdG8gYmUgY2hhbmdlZC4gIEhvd2V2ZXIsCisgICAqIHdoZW4gYW4gZXYgc3RydWN0dXJlIGhhcyBiZWVuIGFkZGVkIHRvIGxpYmV2ZW50IHVzaW5nIGV2ZW50X2FkZCgpIHRoZQorICAgKiBzdHJ1Y3R1cmUgbXVzdCBwZXJzaXN0IHVudGlsIHRoZSBldmVudCBvY2N1cnMgKGFzc3VtaW5nIEVWX1BFUlNJU1QKKyAgICogaXMgbm90IHNldCkgb3IgaXMgcmVtb3ZlZCB1c2luZyBldmVudF9kZWwoKS4gIFlvdSBtYXkgbm90IHJldXNlIHRoZSBzYW1lCisgICAqIGV2IHN0cnVjdHVyZSBmb3IgbXVsdGlwbGUgbW9uaXRvcmVkIGRlc2NyaXB0b3JzOyBlYWNoIGRlc2NyaXB0b3IgbmVlZHMKKyAgICogaXRzIG93biBldi4KKyAgICovCisgIGV2ZW50X3NldCgmZXZlbnRfLCB0U29ja2V0Xy0+Z2V0U29ja2V0RkQoKSwgZXZlbnRGbGFnc18sIFRDb25uZWN0aW9uOjpldmVudEhhbmRsZXIsIHRoaXMpOworICBldmVudF9iYXNlX3NldChpb1RocmVhZF8tPmdldEV2ZW50QmFzZSgpLCAmZXZlbnRfKTsKKworICAvLyBBZGQgdGhlIGV2ZW50CisgIGlmIChldmVudF9hZGQoJmV2ZW50XywgMCkgPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgfQorfQorCisvKioKKyAqIENsb3NlcyBhIGNvbm5lY3Rpb24KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjbG9zZSgpIHsKKyAgc2V0SWRsZSgpOworCisgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9CisgIGlvVGhyZWFkXyA9IE5VTEw7CisKKyAgLy8gQ2xvc2UgdGhlIHNvY2tldAorICB0U29ja2V0Xy0+Y2xvc2UoKTsKKworICAvLyBjbG9zZSBhbnkgZmFjdG9yeSBwcm9kdWNlZCB0cmFuc3BvcnRzCisgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7CisgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfLT5jbG9zZSgpOworCisgIC8vIHJlbGVhc2UgcHJvY2Vzc29yIGFuZCBoYW5kbGVyCisgIHByb2Nlc3Nvcl8ucmVzZXQoKTsKKworICAvLyBHaXZlIHRoaXMgb2JqZWN0IGJhY2sgdG8gdGhlIHNlcnZlciB0aGF0IG93bnMgaXQKKyAgc2VydmVyXy0+cmV0dXJuQ29ubmVjdGlvbih0aGlzKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCkgeworICBpZiAocmVhZExpbWl0ID4gMCAmJiByZWFkQnVmZmVyU2l6ZV8gPiByZWFkTGltaXQpIHsKKyAgICBmcmVlKHJlYWRCdWZmZXJfKTsKKyAgICByZWFkQnVmZmVyXyA9IE5VTEw7CisgICAgcmVhZEJ1ZmZlclNpemVfID0gMDsKKyAgfQorCisgIGlmICh3cml0ZUxpbWl0ID4gMCAmJiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA+IHdyaXRlTGltaXQpIHsKKyAgICAvLyBqdXN0IHN0YXJ0IG92ZXIKKyAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VydmVyXy0+Z2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpKSk7CisgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworICB9Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlcjo6flROb25ibG9ja2luZ1NlcnZlcigpIHsKKyAgLy8gQ2xvc2UgYW55IGFjdGl2ZSBjb25uZWN0aW9ucyAobW92ZXMgdGhlbSB0byB0aGUgaWRsZSBjb25uZWN0aW9uIHN0YWNrKQorICB3aGlsZSAoYWN0aXZlQ29ubmVjdGlvbnNfLnNpemUoKSkgeworICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5mcm9udCgpLT5jbG9zZSgpOworICB9CisgIC8vIENsZWFuIHVwIHVudXNlZCBUQ29ubmVjdGlvbiBvYmplY3RzIGluIGNvbm5lY3Rpb25TdGFja18KKyAgd2hpbGUgKCFjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKKyAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7CisgICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKKyAgICBkZWxldGUgY29ubmVjdGlvbjsKKyAgfQorICAvLyBUaGUgVE5vbmJsb2NraW5nSU9UaHJlYWQgb2JqZWN0cyBoYXZlIHNoYXJlZF9wdHJzIHRvIHRoZSBUaHJlYWQKKyAgLy8gb2JqZWN0cyBhbmQgdGhlIFRocmVhZCBvYmplY3RzIGhhdmUgc2hhcmVkX3B0cnMgdG8gdGhlIFROb25ibG9ja2luZ0lPVGhyZWFkCisgIC8vIG9iamVjdHMgKGFzIHJ1bm5hYmxlKSBzbyB0aGVzZSBvYmplY3RzIHdpbGwgbmV2ZXIgZGVhbGxvY2F0ZSB3aXRob3V0IGhlbHAuCisgIHdoaWxlICghaW9UaHJlYWRzXy5lbXB0eSgpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiBpb3QgPSBpb1RocmVhZHNfLmJhY2soKTsKKyAgICBpb1RocmVhZHNfLnBvcF9iYWNrKCk7CisgICAgaW90LT5zZXRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4oKSk7CisgIH0KK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gZWl0aGVyIGJ5IHJldXNpbmcgYW4gb2JqZWN0IG9mZiB0aGUgc3RhY2sgb3IKKyAqIGJ5IGFsbG9jYXRpbmcgYSBuZXcgb25lIGVudGlyZWx5CisgKi8KK1ROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KSB7CisgIC8vIENoZWNrIHRoZSBzdGFjaworICBHdWFyZCBnKGNvbm5NdXRleF8pOworCisgIC8vIHBpY2sgYW4gSU8gdGhyZWFkIHRvIGhhbmRsZSB0aGlzIGNvbm5lY3Rpb24gLS0gY3VycmVudGx5IHJvdW5kIHJvYmluCisgIGFzc2VydChuZXh0SU9UaHJlYWRfIDwgaW9UaHJlYWRzXy5zaXplKCkpOworICBpbnQgc2VsZWN0ZWRUaHJlYWRJZHggPSBuZXh0SU9UaHJlYWRfOworICBuZXh0SU9UaHJlYWRfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChuZXh0SU9UaHJlYWRfICsgMSkgJSBpb1RocmVhZHNfLnNpemUoKSk7CisKKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkID0gaW9UaHJlYWRzX1tzZWxlY3RlZFRocmVhZElkeF0uZ2V0KCk7CisKKyAgLy8gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gc3RhY2sgdG8gc2VlIGlmIHdlIGNhbiByZS11c2UKKyAgVENvbm5lY3Rpb24qIHJlc3VsdCA9IE5VTEw7CisgIGlmIChjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKKyAgICByZXN1bHQgPSBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBpb1RocmVhZCk7CisgICAgKytudW1UQ29ubmVjdGlvbnNfOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7CisgICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKKyAgICByZXN1bHQtPnNldFNvY2tldChzb2NrZXQpOworICAgIHJlc3VsdC0+aW5pdChpb1RocmVhZCk7CisgIH0KKyAgYWN0aXZlQ29ubmVjdGlvbnNfLnB1c2hfYmFjayhyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHRoZSBzdGFjaworICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6cmV0dXJuQ29ubmVjdGlvbihUQ29ubmVjdGlvbiogY29ubmVjdGlvbikgeworICBHdWFyZCBnKGNvbm5NdXRleF8pOworCisgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lcmFzZShzdGQ6OnJlbW92ZShhY3RpdmVDb25uZWN0aW9uc18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnNfLmVuZCgpKTsKKworICBpZiAoY29ubmVjdGlvblN0YWNrTGltaXRfICYmIChjb25uZWN0aW9uU3RhY2tfLnNpemUoKSA+PSBjb25uZWN0aW9uU3RhY2tMaW1pdF8pKSB7CisgICAgZGVsZXRlIGNvbm5lY3Rpb247CisgICAgLS1udW1UQ29ubmVjdGlvbnNfOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24tPmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KGlkbGVSZWFkQnVmZmVyTGltaXRfLCBpZGxlV3JpdGVCdWZmZXJMaW1pdF8pOworICAgIGNvbm5lY3Rpb25TdGFja18ucHVzaChjb25uZWN0aW9uKTsKKyAgfQorfQorCisvKioKKyAqIFNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcgY2xpZW50CisgKiBjb25uZWN0aW9ucyBvbiBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6aGFuZGxlRXZlbnQoVEhSSUZUX1NPQ0tFVCBmZCwgc2hvcnQgd2hpY2gpIHsKKyAgKHZvaWQpd2hpY2g7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IGxpYmV2ZW50IGRpZG4ndCBtZXNzIHVwIHRoZSBzb2NrZXQgaGFuZGxlcworICBhc3NlcnQoZmQgPT0gc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gR29pbmcgdG8gYWNjZXB0IGEgbmV3IGNsaWVudCBzb2NrZXQKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudFNvY2tldDsKKworICBjbGllbnRTb2NrZXQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKKyAgaWYgKGNsaWVudFNvY2tldCkgeworICAgIC8vIElmIHdlJ3JlIG92ZXJsb2FkZWQsIHRha2UgYWN0aW9uIGhlcmUKKyAgICBpZiAob3ZlcmxvYWRBY3Rpb25fICE9IFRfT1ZFUkxPQURfTk9fQUNUSU9OICYmIHNlcnZlck92ZXJsb2FkZWQoKSkgeworICAgICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKyAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7CisgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7CisgICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBUKSB7CisgICAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFKSB7CisgICAgICAgIGlmICghZHJhaW5QZW5kaW5nVGFzaygpKSB7CisgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRpc2NhcmQsIHNvIHdlIGRyb3AgY29ubmVjdGlvbiBpbnN0ZWFkLgorICAgICAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KKyAgICBUQ29ubmVjdGlvbiogY2xpZW50Q29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oY2xpZW50U29ja2V0KTsKKworICAgIC8vIEZhaWwgZmFzdCBpZiB3ZSBjb3VsZCBub3QgY3JlYXRlIGEgVENvbm5lY3Rpb24gb2JqZWN0CisgICAgaWYgKGNsaWVudENvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBmYWlsZWQgVENvbm5lY3Rpb24gZmFjdG9yeSIpOworICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogRWl0aGVyIG5vdGlmeSB0aGUgaW9UaHJlYWQgdGhhdCBpcyBhc3NpZ25lZCB0aGlzIGNvbm5lY3Rpb24gdG8KKyAgICAgKiBzdGFydCBwcm9jZXNzaW5nLCBvciBpZiBpdCBpcyB1cywgd2UnbGwganVzdCBhc2sgdGhpcworICAgICAqIGNvbm5lY3Rpb24gdG8gZG8gaXRzIGluaXRpYWwgc3RhdGUgY2hhbmdlIGhlcmUuCisgICAgICoKKyAgICAgKiAoV2UgbmVlZCB0byBhdm9pZCB3cml0aW5nIHRvIG91ciBvd24gbm90aWZpY2F0aW9uIHBpcGUsIHRvCisgICAgICogYXZvaWQgcG9zc2libGUgZGVhZGxvY2tzIGlmIHRoZSBwaXBlIGlzIGZ1bGwuKQorICAgICAqCisgICAgICogVGhlIElPIHRocmVhZCAjMCBpcyB0aGUgb25seSBvbmUgdGhhdCBoYW5kbGVzIHRoZXNlIGxpc3RlbgorICAgICAqIGV2ZW50cywgc28gdW5sZXNzIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRocmVhZCAjMAorICAgICAqIHdlIGtub3cgaXQncyBub3Qgb24gb3VyIHRocmVhZC4KKyAgICAgKi8KKyAgICBpZiAoY2xpZW50Q29ubmVjdGlvbi0+Z2V0SU9UaHJlYWROdW1iZXIoKSA9PSAwKSB7CisgICAgICBjbGllbnRDb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghY2xpZW50Q29ubmVjdGlvbi0+bm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJbRVJST1JdIG5vdGlmeUlPVGhyZWFkIGZhaWxlZCBvbiBmcmVzaCBjb25uZWN0aW9uLCBjbG9zaW5nIiwgZXJybm8pOworICAgICAgICBjbGllbnRDb25uZWN0aW9uLT5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCkgeworICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKKyAgc2VydmVyU29ja2V0XyA9IHNlcnZlclRyYW5zcG9ydF8tPmdldFNvY2tldEZEKCk7Cit9CisKKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNldFRocmVhZE1hbmFnZXIoc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIHsKKyAgdGhyZWFkTWFuYWdlcl8gPSB0aHJlYWRNYW5hZ2VyOworICBpZiAodGhyZWFkTWFuYWdlcikgeworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKAorICAgICAgICBzdGQ6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOworICB9IGVsc2UgeworICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOworICB9Cit9CisKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZXJPdmVybG9hZGVkKCkgeworICBzaXplX3QgYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1UQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7CisgIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnNfIHx8IGFjdGl2ZUNvbm5lY3Rpb25zID4gbWF4Q29ubmVjdGlvbnNfKSB7CisgICAgaWYgKCFvdmVybG9hZGVkXykgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBvdmVybG9hZCBjb25kaXRpb24gYmVndW4uIik7CisgICAgICBvdmVybG9hZGVkXyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChvdmVybG9hZGVkXyAmJiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heEFjdGl2ZVByb2Nlc3NvcnNfKQorICAgICAgICAmJiAoYWN0aXZlQ29ubmVjdGlvbnMgPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heENvbm5lY3Rpb25zXykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjogb3ZlcmxvYWQgZW5kZWQ7ICIKKyAgICAgICAgICAiJXUgZHJvcHBlZCAoJWxsdSB0b3RhbCkiLAorICAgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfLAorICAgICAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8pOworICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICAgICAgb3ZlcmxvYWRlZF8gPSBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gb3ZlcmxvYWRlZF87Cit9CisKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpkcmFpblBlbmRpbmdUYXNrKCkgeworICBpZiAodGhyZWFkTWFuYWdlcl8pIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAodGFzaykgeworICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOworICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKKyAgICAgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOworICBhc3NlcnQoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLT5nZXRTZXJ2ZXIoKSAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOworICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkgeworICAvLyBCcmVha3MgdGhlIGV2ZW50IGxvb3AgaW4gYWxsIHRocmVhZHMgc28gdGhhdCB0aGV5IGVuZCBBU0FQLgorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW9UaHJlYWRzXy5zaXplKCk7ICsraSkgeworICAgIGlvVGhyZWFkc19baV0tPnN0b3AoKTsKKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6cmVnaXN0ZXJFdmVudHMoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKSB7CisgIHVzZXJFdmVudEJhc2VfID0gdXNlcl9ldmVudF9iYXNlOworCisgIC8vIGluaXQgbGlzdGVuIHNvY2tldAorICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpCisgICAgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKTsKKworICAvLyBzZXQgdXAgdGhlIElPIHRocmVhZHMKKyAgYXNzZXJ0KGlvVGhyZWFkc18uZW1wdHkoKSk7CisgIGlmICghbnVtSU9UaHJlYWRzXykgeworICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX0lPX1RIUkVBRFM7CisgIH0KKyAgLy8gVXNlci1wcm92aWRlZCBldmVudC1iYXNlIGRvZXNuJ3Qgd29ya3MgZm9yIG11bHRpLXRocmVhZGVkIHNlcnZlcnMKKyAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPT0gMSB8fCAhdXNlckV2ZW50QmFzZV8pOworCisgIGZvciAodWludDMyX3QgaWQgPSAwOyBpZCA8IG51bUlPVGhyZWFkc187ICsraWQpIHsKKyAgICAvLyB0aGUgZmlyc3QgSU8gdGhyZWFkIGFsc28gZG9lcyB0aGUgbGlzdGVuaW5nIG9uIHNlcnZlciBzb2NrZXQKKyAgICBUSFJJRlRfU09DS0VUIGxpc3RlbkZkID0gKGlkID09IDAgPyBzZXJ2ZXJTb2NrZXRfIDogVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKKworICAgIHNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IHRocmVhZCgKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ0lPVGhyZWFkKHRoaXMsIGlkLCBsaXN0ZW5GZCwgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXykpOworICAgIGlvVGhyZWFkc18ucHVzaF9iYWNrKHRocmVhZCk7CisgIH0KKworICAvLyBOb3RpZnkgaGFuZGxlciBvZiB0aGUgcHJlU2VydmUgZXZlbnQKKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOworICB9CisKKyAgLy8gU3RhcnQgYWxsIG9mIG91ciBoZWxwZXIgSU8gdGhyZWFkcy4gTm90ZSB0aGF0IHRoZSB0aHJlYWRzIHJ1biBmb3JldmVyLAorICAvLyBvbmx5IHRlcm1pbmF0aW5nIGlmIHN0b3AoKSBpcyBjYWxsZWQuCisgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA9PSBudW1JT1RocmVhZHNfKTsKKyAgYXNzZXJ0KGlvVGhyZWFkc18uc2l6ZSgpID4gMCk7CisKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBTZXJ2aW5nIHdpdGggJWQgaW8gdGhyZWFkcy4iLAorICAgICAgICAgICAgICAgICAgICAgIGlvVGhyZWFkc18uc2l6ZSgpKTsKKworICAvLyBMYXVuY2ggYWxsIHRoZSBzZWNvbmRhcnkgSU8gdGhyZWFkcyBpbiBzZXBhcmF0ZSB0aHJlYWRzCisgIGlmIChpb1RocmVhZHNfLnNpemUoKSA+IDEpIHsKKyAgICBpb1RocmVhZEZhY3RvcnlfLnJlc2V0KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsICAvLyBzY2hlZHVsZXIKKyAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsIC8vIHByaW9yaXR5CisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBzaXplIChNQikKKyNlbmRpZgorICAgICAgICBmYWxzZSAvLyBkZXRhY2hlZAorICAgICAgICApKTsKKworICAgIGFzc2VydChpb1RocmVhZEZhY3RvcnlfLmdldCgpKTsKKworICAgIC8vIGludGVudGlvbmFsbHkgc3RhcnRpbmcgYXQgdGhyZWFkIDEsIG5vdCAwCisgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGlvVGhyZWFkc18uc2l6ZSgpOyArK2kpIHsKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSBpb1RocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQoaW9UaHJlYWRzX1tpXSk7CisgICAgICBpb1RocmVhZHNfW2ldLT5zZXRUaHJlYWQodGhyZWFkKTsKKyAgICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICB9CisgIH0KKworICAvLyBSZWdpc3RlciB0aGUgZXZlbnRzIGZvciB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZAorICBpb1RocmVhZHNfWzBdLT5yZWdpc3RlckV2ZW50cygpOworfQorCisvKioKKyAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZAorICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgeworCisgIGlmIChpb1RocmVhZHNfLmVtcHR5KCkpCisgICAgcmVnaXN0ZXJFdmVudHMoTlVMTCk7CisKKyAgLy8gUnVuIHRoZSBwcmltYXJ5IChsaXN0ZW5lcikgSU8gdGhyZWFkIGxvb3AgaW4gb3VyIG1haW4gdGhyZWFkOyB0aGlzIHdpbGwKKyAgLy8gb25seSByZXR1cm4gd2hlbiB0aGUgc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCisgIGlvVGhyZWFkc19bMF0tPnJ1bigpOworCisgIC8vIEVuc3VyZSBhbGwgdGhyZWFkcyBhcmUgZmluaXNoZWQgYmVmb3JlIGV4aXRpbmcgc2VydmUoKQorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW9UaHJlYWRzXy5zaXplKCk7ICsraSkgeworICAgIGlvVGhyZWFkc19baV0tPmpvaW4oKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IGpvaW4gZG9uZSBmb3IgSU8gdGhyZWFkICMlZCIsIGkpOworICB9Cit9CisKK1ROb25ibG9ja2luZ0lPVGhyZWFkOjpUTm9uYmxvY2tpbmdJT1RocmVhZChUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGlnaFByaW9yaXR5KQorICA6IHNlcnZlcl8oc2VydmVyKSwKKyAgICBudW1iZXJfKG51bWJlciksCisgICAgbGlzdGVuU29ja2V0XyhsaXN0ZW5Tb2NrZXQpLAorICAgIHVzZUhpZ2hQcmlvcml0eV8odXNlSGlnaFByaW9yaXR5KSwKKyAgICBldmVudEJhc2VfKE5VTEwpLAorICAgIG93bkV2ZW50QmFzZV8oZmFsc2UpIHsKKyAgbm90aWZpY2F0aW9uUGlwZUZEc19bMF0gPSAtMTsKKyAgbm90aWZpY2F0aW9uUGlwZUZEc19bMV0gPSAtMTsKK30KKworVE5vbmJsb2NraW5nSU9UaHJlYWQ6On5UTm9uYmxvY2tpbmdJT1RocmVhZCgpIHsKKyAgLy8gbWFrZSBzdXJlIG91ciBhc3NvY2lhdGVkIHRocmVhZCBpcyBmdWxseSBmaW5pc2hlZAorICBqb2luKCk7CisKKyAgaWYgKGV2ZW50QmFzZV8gJiYgb3duRXZlbnRCYXNlXykgeworICAgIGV2ZW50X2Jhc2VfZnJlZShldmVudEJhc2VfKTsKKyAgICBvd25FdmVudEJhc2VfID0gZmFsc2U7CisgIH0KKworICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpZiAoMCAhPSA6OlRIUklGVF9DTE9TRVNPQ0tFVChsaXN0ZW5Tb2NrZXRfKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nSU9UaHJlYWQgbGlzdGVuU29ja2V0XyBjbG9zZSgpOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICAgIGxpc3RlblNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGlmIChub3RpZmljYXRpb25QaXBlRkRzX1tpXSA+PSAwKSB7CisgICAgICBpZiAoMCAhPSA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1tpXSkpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nSU9UaHJlYWQgbm90aWZpY2F0aW9uUGlwZSBjbG9zZSgpOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgIH0KKyAgICAgIG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgeworICBpZiAoZXZ1dGlsX3NvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBub3RpZmljYXRpb25QaXBlRkRzXykgPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUgIiwgRVZVVElMX1NPQ0tFVF9FUlJPUigpKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJjYW4ndCBjcmVhdGUgbm90aWZpY2F0aW9uIHBpcGUiKTsKKyAgfQorICBpZiAoZXZ1dGlsX21ha2Vfc29ja2V0X25vbmJsb2NraW5nKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKSA8IDAKKyAgICAgIHx8IGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1sxXSkgPCAwKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSBUSFJJRlRfT19OT05CTE9DSyIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPCAweDAyMDAwMDAwCisgICAgaW50IGZsYWdzOworICAgIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZEc19baV0sIEZfR0VURkQsIDApKSA8IDAKKyAgICAgICAgfHwgVEhSSUZUX0ZDTlRMKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldLCBGX1NFVEZELCBmbGFncyB8IEZEX0NMT0VYRUMpIDwgMCkgeworI2Vsc2UKKyAgICBpZiAoZXZ1dGlsX21ha2Vfc29ja2V0X2Nsb3Nlb25leGVjKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldKSA8IDApIHsKKyNlbmRpZgorICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOworICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgIgorICAgICAgICAgICJGRF9DTE9FWEVDIik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVnaXN0ZXIgdGhlIGNvcmUgbGliZXZlbnQgZXZlbnRzIG9udG8gdGhlIHByb3BlciBiYXNlLgorICovCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpyZWdpc3RlckV2ZW50cygpIHsKKyAgdGhyZWFkSWRfID0gVGhyZWFkOjpnZXRfY3VycmVudCgpOworCisgIGFzc2VydChldmVudEJhc2VfID09IDApOworICBldmVudEJhc2VfID0gZ2V0U2VydmVyKCktPmdldFVzZXJFdmVudEJhc2UoKTsKKyAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkgeworICAgIGV2ZW50QmFzZV8gPSBldmVudF9iYXNlX25ldygpOworICAgIG93bkV2ZW50QmFzZV8gPSB0cnVlOworICB9CisKKyAgLy8gUHJpbnQgc29tZSBsaWJldmVudCBzdGF0cworICBpZiAobnVtYmVyXyA9PSAwKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiB1c2luZyBsaWJldmVudCAlcyBtZXRob2QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfZ2V0X3ZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChldmVudEJhc2VfKSk7CisgIH0KKworICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGV2ZW50CisgICAgZXZlbnRfc2V0KCZzZXJ2ZXJFdmVudF8sCisgICAgICAgICAgICAgIGxpc3RlblNvY2tldF8sCisgICAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNULAorICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bGlzdGVuSGFuZGxlciwKKyAgICAgICAgICAgICAgc2VydmVyXyk7CisgICAgZXZlbnRfYmFzZV9zZXQoZXZlbnRCYXNlXywgJnNlcnZlckV2ZW50Xyk7CisKKyAgICAvLyBBZGQgdGhlIGV2ZW50IGFuZCBzdGFydCB1cCB0aGUgc2VydmVyCisgICAgaWYgKC0xID09IGV2ZW50X2FkZCgmc2VydmVyRXZlbnRfLCAwKSkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiAiCisgICAgICAgICAgImV2ZW50X2FkZCgpIGZhaWxlZCBvbiBzZXJ2ZXIgbGlzdGVuIGV2ZW50Iik7CisgICAgfQorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gdGhyZWFkICMlZCByZWdpc3RlcmVkIGZvciBsaXN0ZW4uIiwgbnVtYmVyXyk7CisgIH0KKworICBjcmVhdGVOb3RpZmljYXRpb25QaXBlKCk7CisKKyAgLy8gQ3JlYXRlIGFuIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSB0YXNrIGZpbmlzaGVzCisgIGV2ZW50X3NldCgmbm90aWZpY2F0aW9uRXZlbnRfLAorICAgICAgICAgICAgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCksCisgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKKyAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkOjpub3RpZnlIYW5kbGVyLAorICAgICAgICAgICAgdGhpcyk7CisKKyAgLy8gQXR0YWNoIHRvIHRoZSBiYXNlCisgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZub3RpZmljYXRpb25FdmVudF8pOworCisgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKKyAgaWYgKC0xID09IGV2ZW50X2FkZCgmbm90aWZpY2F0aW9uRXZlbnRfLCAwKSkgeworICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6ICIKKyAgICAgICAgImV2ZW50X2FkZCgpIGZhaWxlZCBvbiB0YXNrLWRvbmUgbm90aWZpY2F0aW9uIGV2ZW50Iik7CisgIH0KKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyB0aHJlYWQgIyVkIHJlZ2lzdGVyZWQgZm9yIG5vdGlmeS4iLCBudW1iZXJfKTsKK30KKworYm9vbCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pIHsKKyAgVEhSSUZUX1NPQ0tFVCBmZCA9IGdldE5vdGlmaWNhdGlvblNlbmRGRCgpOworICBpZiAoZmQgPCAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50IHJldCA9IC0xOworICBsb25nIGtTaXplID0gc2l6ZW9mKGNvbm4pOworICBjb25zdCBjaGFyICogcG9zID0gKGNvbnN0IGNoYXIgKiljb25zdF9jYXN0X3NvY2tvcHQoJmNvbm4pOworCisjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkgfHwgZGVmaW5lZChIQVZFX1NZU19QT0xMX0gpCisgIHN0cnVjdCBwb2xsZmQgcGZkID0ge2ZkLCBQT0xMT1VULCAwfTsKKworICB3aGlsZSAoa1NpemUgPiAwKSB7CisgICAgcGZkLnJldmVudHMgPSAwOworICAgIHJldCA9IHBvbGwoJnBmZCwgMSwgLTEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTEhVUCB8fCBwZmQucmV2ZW50cyAmIFBPTExFUlIpIHsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICByZXQgPSBzZW5kKGZkLCBwb3MsIGtTaXplLCAwKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBrU2l6ZSAtPSByZXQ7CisgICAgICBwb3MgKz0gcmV0OworICAgIH0KKyAgfQorI2Vsc2UKKyAgZmRfc2V0IHdmZHMsIGVmZHM7CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIEZEX1pFUk8oJndmZHMpOworICAgIEZEX1pFUk8oJmVmZHMpOworICAgIEZEX1NFVChmZCwgJndmZHMpOworICAgIEZEX1NFVChmZCwgJmVmZHMpOworICAgIHJldCA9IHNlbGVjdChzdGF0aWNfY2FzdDxpbnQ+KGZkICsgMSksIE5VTEwsICZ3ZmRzLCAmZWZkcywgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoZmQsICZlZmRzKSkgeworICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChGRF9JU1NFVChmZCwgJndmZHMpKSB7CisgICAgICByZXQgPSBzZW5kKGZkLCBwb3MsIGtTaXplLCAwKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBrU2l6ZSAtPSByZXQ7CisgICAgICBwb3MgKz0gcmV0OworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIHN0YXRpYyAqLwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KSB7CisgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCA9IChUTm9uYmxvY2tpbmdJT1RocmVhZCopdjsKKyAgYXNzZXJ0KGlvVGhyZWFkKTsKKyAgKHZvaWQpd2hpY2g7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gMDsKKyAgICBjb25zdCBpbnQga1NpemUgPSBzaXplb2YoY29ubmVjdGlvbik7CisgICAgbG9uZyBuQnl0ZXMgPSByZWN2KGZkLCBjYXN0X3NvY2tvcHQoJmNvbm5lY3Rpb24pLCBrU2l6ZSwgMCk7CisgICAgaWYgKG5CeXRlcyA9PSBrU2l6ZSkgeworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb21tYW5kIHRvIHN0b3Agb3VyIHRocmVhZCwgZXhpdCB0aGUgaGFuZGxlciEKKyAgICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcChmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKKyAgICB9IGVsc2UgaWYgKG5CeXRlcyA+IDApIHsKKyAgICAgIC8vIHRocm93IGF3YXkgdGhlc2UgYnl0ZXMgYW5kIGhvcGUgdGhhdCBuZXh0IHRpbWUgd2UgZ2V0IGEgc29saWQgcmVhZAorICAgICAgR2xvYmFsT3V0cHV0LnByaW50Zigibm90aWZ5SGFuZGxlcjogQmFkIHJlYWQgb2YgJWQgYnl0ZXMsIHdhbnRlZCAlZCIsIG5CeXRlcywga1NpemUpOworICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcCh0cnVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG5CeXRlcyA9PSAwKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJub3RpZnlIYW5kbGVyOiBOb3RpZnkgc29ja2V0IGNsb3NlZCEiKTsKKyAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOworICAgICAgLy8gZXhpdCB0aGUgbG9vcAorICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsgLy8gbkJ5dGVzIDwgMAorICAgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSworICAgICAgICAgICYmIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FQUdBSU4pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBub3RpZnlIYW5kbGVyIHJlYWQoKSBmYWlsZWQ6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gZXhpdCB0aGUgbG9vcAorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmJyZWFrTG9vcChib29sIGVycm9yKSB7CisgIGlmIChlcnJvcikgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBleGl0aW5nIHdpdGggZXJyb3IuIiwgbnVtYmVyXyk7CisgICAgLy8gVE9ETzogZmlndXJlIG91dCBzb21ldGhpbmcgYmV0dGVyIHRvIGRvIGhlcmUsIGJ1dCBmb3Igbm93IGtpbGwgdGhlCisgICAgLy8gd2hvbGUgcHJvY2Vzcy4KKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGFib3J0aW5nIHByb2Nlc3MuIik7CisgICAgOjphYm9ydCgpOworICB9CisKKyAgLy8gSWYgd2UncmUgcnVubmluZyBpbiB0aGUgc2FtZSB0aHJlYWQsIHdlIGNhbid0IHVzZSB0aGUgbm90aWZ5KDApCisgIC8vIG1lY2hhbmlzbSB0byBzdG9wIHRoZSB0aHJlYWQsIGJ1dCBoYXBwaWx5IGlmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlCisgIC8vIHNhbWUgdGhyZWFkLCB0aGlzIG1lYW5zIHRoZSB0aHJlYWQgY2FuJ3QgYmUgYmxvY2tpbmcgaW4gdGhlIGV2ZW50CisgIC8vIGxvb3AgZWl0aGVyLgorICBpZiAoIVRocmVhZDo6aXNfY3VycmVudCh0aHJlYWRJZF8pKSB7CisgICAgbm90aWZ5KE5VTEwpOworICB9IGVsc2UgeworICAgIC8vIGNhdXNlIHRoZSBsb29wIHRvIHN0b3AgQVNBUCAtIGV2ZW4gaWYgaXQgaGFzIHRoaW5ncyB0byBkbyBpbiBpdAorICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOworICB9Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoYm9vbCB2YWx1ZSkgeworI2lmZGVmIEhBVkVfU0NIRURfSAorICAvLyBTdGFydCBvdXQgd2l0aCBhIHN0YW5kYXJkLCBsb3ctcHJpb3JpdHkgc2V0dXAgZm9yIHRoZSBzY2hlZCBwYXJhbXMuCisgIHN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKyAgYnplcm8oKHZvaWQqKSZzcCwgc2l6ZW9mKHNwKSk7CisgIGludCBwb2xpY3kgPSBTQ0hFRF9PVEhFUjsKKworICAvLyBJZiBkZXNpcmVkLCBzZXQgdXAgaGlnaC1wcmlvcml0eSBzY2hlZCBwYXJhbXMgc3RydWN0dXJlLgorICBpZiAodmFsdWUpIHsKKyAgICAvLyBGSUZPIHNjaGVkdWxlciwgcmFua2VkIGFib3ZlIGRlZmF1bHQgU0NIRURfT1RIRVIgcXVldWUKKyAgICBwb2xpY3kgPSBTQ0hFRF9GSUZPOworICAgIC8vIFRoZSBwcmlvcml0eSBvbmx5IGNvbXBhcmVzIHVzIHRvIG90aGVyIFNDSEVEX0ZJRk8gdGhyZWFkcywgc28gd2UKKyAgICAvLyBqdXN0IHBpY2sgYSByYW5kb20gcHJpb3JpdHkgaGFsZndheSBiZXR3ZWVuIG1pbiAmIG1heC4KKyAgICBjb25zdCBpbnQgcHJpb3JpdHkgPSAoc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwb2xpY3kpICsgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwb2xpY3kpKSAvIDI7CisKKyAgICBzcC5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OworICB9CisKKyAgLy8gQWN0dWFsbHkgc2V0IHRoZSBzY2hlZCBwYXJhbXMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgaWYgKDAgPT0gcHRocmVhZF9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigpLCBwb2xpY3ksICZzcCkpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIFRocmVhZCAjJWQgdXNpbmcgaGlnaC1wcmlvcml0eSBzY2hlZHVsZXIhIiwgbnVtYmVyXyk7CisgIH0gZWxzZSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBwdGhyZWFkX3NldHNjaGVkcGFyYW0oKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICB9CisjZWxzZQorICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHZhbHVlKTsKKyNlbmRpZgorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpydW4oKSB7CisgIGlmIChldmVudEJhc2VfID09IE5VTEwpIHsKKyAgICByZWdpc3RlckV2ZW50cygpOworICB9CisgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eSh0cnVlKTsKKyAgfQorCisgIGlmIChldmVudEJhc2VfICE9IE5VTEwpCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZW50ZXJpbmcgbG9vcC4uLiIsIG51bWJlcl8pOworICAgIC8vIFJ1biBsaWJldmVudCBlbmdpbmUsIG5ldmVyIHJldHVybnMsIGludm9rZXMgY2FsbHMgdG8gZXZlbnRIYW5kbGVyCisgICAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOworCisgICAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKKyAgICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoZmFsc2UpOworICAgIH0KKworICAgIC8vIGNsZWFucyB1cCBvdXIgcmVnaXN0ZXJlZCBldmVudHMKKyAgICBjbGVhbnVwRXZlbnRzKCk7CisgIH0KKworICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgcnVuKCkgZG9uZSEiLCBudW1iZXJfKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6Y2xlYW51cEV2ZW50cygpIHsKKyAgLy8gc3RvcCB0aGUgbGlzdGVuIHNvY2tldCwgaWYgYW55CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGlmIChldmVudF9kZWwoJnNlcnZlckV2ZW50XykgPT0gLTEpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgZXZlbnRfZGVsOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisKKyAgZXZlbnRfZGVsKCZub3RpZmljYXRpb25FdmVudF8pOworfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgeworICAvLyBUaGlzIHNob3VsZCBjYXVzZSB0aGUgdGhyZWFkIHRvIGZhbGwgb3V0IG9mIGl0cyBldmVudCBsb29wIEFTQVAuCisgIGJyZWFrTG9vcChmYWxzZSk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmpvaW4oKSB7CisgIC8vIElmIHRoaXMgd2FzIGEgdGhyZWFkIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IChub3QgdGhlIHRocmVhZCB0aGF0IGNhbGxlZAorICAvLyBzZXJ2ZSgpKSwgd2Ugam9pbigpIGl0IHRvIG1ha2Ugc3VyZSB3ZSBzaHV0IGRvd24gZnVsbHkuCisgIGlmICh0aHJlYWRfKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIGJvdGggam9pbigpIG91cnNlbHZlcyB0d2ljZSwgYXMgd2VsbCBhcyBqb2luCisgICAgICAvLyB0aGUgY3VycmVudCB0aHJlYWQgYXMgdGhlIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBkZWFkbG9jay4KKyAgICAgIHRocmVhZF8tPmpvaW4oKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIC8vIHN3YWxsb3cgZXZlcnl0aGluZworICAgIH0KKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzljMjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApAQCAtMCwwICsxLDg2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGV2ZW50Lmg+CisjaW5jbHVkZSA8ZXZlbnQyL2V2ZW50X2NvbXBhdC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9ldmVudF9zdHJ1Y3QuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKKworI2lmZGVmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgKExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4+IDI0KQorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01JTk9SICgoTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj4gMTYpICYgMHhGRikKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9SRUwgKChMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+PiA4KSAmIDB4RkYpCisjZWxzZQorLy8gYXNzdW1lIGxhdGVzdCB2ZXJzaW9uIDEgc2VyaWVzCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgMQorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01JTk9SIDE0CisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fUkVMIDEzCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTElCRVZFTlRfVkVSU0lPTl9NQUpPUiA8PCAyNCkgfCAoTElCRVZFTlRfVkVSU0lPTl9NSU5PUiA8PCAxNikgfCAoTElCRVZFTlRfVkVSU0lPTl9SRUwgPDwgOCkpCisjZW5kaWYKKworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSIDwgMHgwMjAwMDAwMAordHlwZWRlZiBUSFJJRlRfU09DS0VUIGV2dXRpbF9zb2NrZXRfdDsKKyNlbmRpZgorCisjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCisvKioKKyAqIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgc2VydmVyIGluIEMrKyBmb3IgaGlnaCBwZXJmb3JtYW5jZSB0aGF0CisgKiBvcGVyYXRlcyBhIHNldCBvZiBJTyB0aHJlYWRzIChieSBkZWZhdWx0IG9ubHkgb25lKS4gSXQgYXNzdW1lcyB0aGF0CisgKiBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYXJlIGZyYW1lZCB3aXRoIGEgNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kCisgKiB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgorICovCisKKy8vLyBPdmVybG9hZCBjb25kaXRpb24gYWN0aW9ucy4KK2VudW0gVE92ZXJsb2FkQWN0aW9uIHsKKyAgVF9PVkVSTE9BRF9OT19BQ1RJT04sICAgICAgIC8vLzwgRG9uJ3QgaGFuZGxlIG92ZXJsb2FkICovCisgIFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBULCAvLy88IERyb3AgbmV3IGNvbm5lY3Rpb25zIGltbWVkaWF0ZWx5ICovCisgIFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSAvLy88IERyb3Agc29tZSB0YXNrcyBmcm9tIGhlYWQgb2YgdGFzayBxdWV1ZSAqLworfTsKKworY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQ7CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKK3ByaXZhdGU6CisgIGNsYXNzIFRDb25uZWN0aW9uOworCisgIGZyaWVuZCBjbGFzcyBUTm9uYmxvY2tpbmdJT1RocmVhZDsKKworcHJpdmF0ZToKKyAgLy8vIExpc3RlbiBiYWNrbG9nCisgIHN0YXRpYyBjb25zdCBpbnQgTElTVEVOX0JBQ0tMT0cgPSAxMDI0OworCisgIC8vLyBEZWZhdWx0IGxpbWl0IG9uIHNpemUgb2YgaWRsZSBjb25uZWN0aW9uIHBvb2wKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBDT05ORUNUSU9OX1NUQUNLX0xJTUlUID0gMTAyNDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBmcmFtZSBzaXplCisgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiB0b3RhbCBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMKKyAgc3RhdGljIGNvbnN0IGludCBNQVhfQ09OTkVDVElPTlMgPSBJTlRfTUFYOworCisgIC8vLyBEZWZhdWx0IGxpbWl0IG9uIGNvbm5lY3Rpb25zIGluIGhhbmRsZXIvdGFzayBwcm9jZXNzaW5nCisgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0FDVElWRV9QUk9DRVNTT1JTID0gSU5UX01BWDsKKworICAvLy8gRGVmYXVsdCBzaXplIG9mIHdyaXRlIGJ1ZmZlcgorICBzdGF0aWMgY29uc3QgaW50IFdSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUgPSAxMDI0OworCisgIC8vLyBNYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgY29ubmVjdGlvbiAoMCA9IHVubGltaXRlZCkKKyAgc3RhdGljIGNvbnN0IGludCBJRExFX1JFQURfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvLy8gTWF4aW11bSBzaXplIG9mIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBjb25uZWN0aW9uICgwID0gdW5saW1pdGVkKQorICBzdGF0aWMgY29uc3QgaW50IElETEVfV1JJVEVfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvLy8gIyBvZiBjYWxscyBiZWZvcmUgcmVzaXppbmcgb3ZlcnNpemVkIGJ1ZmZlcnMgKDAgPSBjaGVjayBvbmx5IG9uIGNsb3NlKQorICBzdGF0aWMgY29uc3QgaW50IFJFU0laRV9CVUZGRVJfRVZFUllfTiA9IDUxMjsKKworICAvLy8gIyBvZiBJTyB0aHJlYWRzIHRvIHVzZSBieSBkZWZhdWx0CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9JT19USFJFQURTID0gMTsKKworICAvLy8gIyBvZiBJTyB0aHJlYWRzIHRoaXMgc2VydmVyIHdpbGwgdXNlCisgIHNpemVfdCBudW1JT1RocmVhZHNfOworCisgIC8vLyBXaGV0aGVyIHRvIHNldCBoaWdoIHNjaGVkdWxpbmcgcHJpb3JpdHkgZm9yIElPIHRocmVhZHMKKyAgYm9vbCB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfOworCisgIC8vLyBTZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CisKKyAgLy8vIFRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpCisgIGV2ZW50X2Jhc2UqIHVzZXJFdmVudEJhc2VfOworCisgIC8vLyBGb3IgcHJvY2Vzc2luZyB2aWEgdGhyZWFkIHBvb2wsIG1heSBiZSBOVUxMCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKworICAvLy8gSXMgdGhyZWFkIHBvb2wgcHJvY2Vzc2luZz8KKyAgYm9vbCB0aHJlYWRQb29sUHJvY2Vzc2luZ187CisKKyAgLy8gRmFjdG9yeSB0byBjcmVhdGUgdGhlIElPIHRocmVhZHMKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gaW9UaHJlYWRGYWN0b3J5XzsKKworICAvLyBWZWN0b3Igb2YgSU9UaHJlYWQgb2JqZWN0cyB0aGF0IHdpbGwgaGFuZGxlIG91ciBJTworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+ID4gaW9UaHJlYWRzXzsKKworICAvLyBJbmRleCBvZiBuZXh0IElPIFRocmVhZCB0byBiZSB1c2VkIChmb3Igcm91bmQtcm9iaW4pCisgIHVpbnQzMl90IG5leHRJT1RocmVhZF87CisKKyAgLy8gU3luY2hyb25pemVzIGFjY2VzcyB0byBjb25uZWN0aW9uIHN0YWNrIGFuZCBzaW1pbGFyIGRhdGEKKyAgTXV0ZXggY29ubk11dGV4XzsKKworICAvLy8gTnVtYmVyIG9mIFRDb25uZWN0aW9uIG9iamVjdCB3ZSd2ZSBjcmVhdGVkCisgIHNpemVfdCBudW1UQ29ubmVjdGlvbnNfOworCisgIC8vLyBOdW1iZXIgb2YgQ29ubmVjdGlvbnMgcHJvY2Vzc2luZyBvciB3YWl0aW5nIHRvIHByb2Nlc3MKKyAgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnNfOworCisgIC8vLyBMaW1pdCBmb3IgaG93IG1hbnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBjYWNoZQorICBzaXplX3QgY29ubmVjdGlvblN0YWNrTGltaXRfOworCisgIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCisgIHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzXzsKKworICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zCisgIHNpemVfdCBtYXhDb25uZWN0aW9uc187CisKKyAgLy8vIExpbWl0IGZvciBmcmFtZSBzaXplCisgIHNpemVfdCBtYXhGcmFtZVNpemVfOworCisgIC8vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdW5wZXJmb3JtZWQgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KKyAgaW50NjRfdCB0YXNrRXhwaXJlVGltZV87CisKKyAgLyoqCisgICAqIEh5c3RlcmVzaXMgZm9yIG92ZXJsb2FkIHN0YXRlLiAgVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgdGhlIG92ZXJsb2FkCisgICAqIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgcmVhY2hlZCBiZWZvcmUgdGhlIG92ZXJsb2FkIHN0YXRlIGlzIGNsZWFyZWQ7CisgICAqIG11c3QgYmUgPD0gMS4wLgorICAgKi8KKyAgZG91YmxlIG92ZXJsb2FkSHlzdGVyZXNpc187CisKKyAgLy8vIEFjdGlvbiB0byB0YWtlIHdoZW4gd2UncmUgb3ZlcmxvYWRlZC4KKyAgVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uXzsKKworICAvKioKKyAgICogVGhlIHdyaXRlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCAoYW5kIHdoZW4gaWRsZVdyaXRlQnVmZmVyTGltaXRfIGlzIGNoZWNrZWQKKyAgICogYW5kIGZvdW5kIHRvIGJlIGV4Y2VlZGVkLCByZWluaXRpYWxpemVkKSB0byB0aGlzIHNpemUuCisgICAqLworICBzaXplX3Qgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87CisKKyAgLyoqCisgICAqIE1heCByZWFkIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIFRDb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCisgICAqIFRDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAorICAgKiB3ZSB3aWxsIGZyZWUgdGhlIGJ1ZmZlciAoc3VjaCB0aGF0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZCBieSB0aGUgbmV4dAorICAgKiByZWNlaXZlZCBmcmFtZSkgaWYgaXQgaGFzIGV4Y2VlZGVkIHRoaXMgbGltaXQuICAwIGRpc2FibGVzIHRoaXMgY2hlY2suCisgICAqLworICBzaXplX3QgaWRsZVJlYWRCdWZmZXJMaW1pdF87CisKKyAgLyoqCisgICAqIE1heCB3cml0ZSBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBjb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCisgICAqIFRDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAorICAgKiB3ZSBpbnN1cmUgdGhhdCBpdHMgd3JpdGUgYnVmZmVyIGlzIDw9IHRvIHRoaXMgc2l6ZTsgb3RoZXJ3aXNlIHdlCisgICAqIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUgb2Ygd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gYnl0ZXMgdG8gaW5zdXJlIHRoYXQKKyAgICogaWRsZSBjb25uZWN0aW9ucyBkb24ndCBob2cgbWVtb3J5LiAwIGRpc2FibGVzIHRoaXMgY2hlY2suCisgICAqLworICBzaXplX3QgaWRsZVdyaXRlQnVmZmVyTGltaXRfOworCisgIC8qKgorICAgKiBFdmVyeSBOIGNhbGxzIHdlIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSBsaW1pdHMgb24gYSBjb25uZWN0ZWQgVENvbm5lY3Rpb24uCisgICAqIDAgZGlzYWJsZXMgKGkuZS4gdGhlIGNoZWNrcyBhcmUgb25seSBkb25lIHdoZW4gYSBjb25uZWN0aW9uIGNsb3NlcykuCisgICAqLworICBpbnQzMl90IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl87CisKKyAgLy8vIFNldCBpZiB3ZSBhcmUgY3VycmVudGx5IGluIGFuIG92ZXJsb2FkZWQgc3RhdGUuCisgIGJvb2wgb3ZlcmxvYWRlZF87CisKKyAgLy8vIENvdW50IG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgc2luY2Ugb3ZlcmxvYWQgc3RhcnRlZAorICB1aW50MzJfdCBuQ29ubmVjdGlvbnNEcm9wcGVkXzsKKworICAvLy8gQ291bnQgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBvbiBvdmVybG9hZCBzaW5jZSBzZXJ2ZXIgc3RhcnRlZAorICB1aW50NjRfdCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfOworCisgIC8qKgorICAgKiBUaGlzIGlzIGEgc3RhY2sgb2YgYWxsIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnV0IHRoYXQKKyAgICogYXJlIE5PVCBjdXJyZW50bHkgaW4gdXNlLiBXaGVuIHdlIGNsb3NlIGEgY29ubmVjdGlvbiwgd2UgcGxhY2UgaXQgb24gdGhpcworICAgKiBzdGFjayBzbyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHJldXNlZCBsYXRlciwgcmF0aGVyIHRoYW4gZnJlZWluZyB0aGUKKyAgICogbWVtb3J5IGFuZCByZWFsbG9jYXRpbmcgYSBuZXcgb2JqZWN0IGxhdGVyLgorICAgKi8KKyAgc3RkOjpzdGFjazxUQ29ubmVjdGlvbio+IGNvbm5lY3Rpb25TdGFja187CisKKyAgLyoqCisgICAqIFRoaXMgY29udGFpbmVyIGhvbGRzIHBvaW50ZXJzIHRvIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMuIFRoaXMgY29udGFpbmVyCisgICAqIGFsbG93cyB0aGUgc2VydmVyIHRvIGNsZWFuIHVwIHVubGNvc2VkIGNvbm5lY3Rpb24gb2JqZWN0cyBhdCBkZXN0cnVjdGlvbiwKKyAgICogd2hpY2ggaW4gdHVybiBhbGxvd3MgdGhlaXIgdHJhbnNwb3J0cywgcHJvdG9jb2xzLCBwcm9jZXNzb3JzIGFuZCBoYW5kbGVycworICAgKiB0byBkZWFsbG9jYXRlIGFuZCBjbGVhbiB1cCBjb3JyZWN0bHkuCisgICAqLworICBzdGQ6OnZlY3RvcjxUQ29ubmVjdGlvbio+IGFjdGl2ZUNvbm5lY3Rpb25zXzsKKworICAvKgorICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBzZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nCisgICAqIGNsaWVudCBjb25uZWN0aW9ucyBvbiBsaXN0ZW4gc29ja2V0IGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cworICAgKiB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCisgICAqCisgICAqIEBwYXJhbSB3aGljaCB0aGUgZXZlbnQgZmxhZyB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlci4KKyAgICovCisgIHZvaWQgaGFuZGxlRXZlbnQoVEhSSUZUX1NPQ0tFVCBmZCwgc2hvcnQgd2hpY2gpOworCisgIHZvaWQgaW5pdCgpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX0lPX1RIUkVBRFM7CisgICAgbmV4dElPVGhyZWFkXyA9IDA7CisgICAgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IGZhbHNlOworICAgIHVzZXJFdmVudEJhc2VfID0gTlVMTDsKKyAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKKyAgICBudW1UQ29ubmVjdGlvbnNfID0gMDsKKyAgICBudW1BY3RpdmVQcm9jZXNzb3JzXyA9IDA7CisgICAgY29ubmVjdGlvblN0YWNrTGltaXRfID0gQ09OTkVDVElPTl9TVEFDS19MSU1JVDsKKyAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyA9IE1BWF9BQ1RJVkVfUFJPQ0VTU09SUzsKKyAgICBtYXhDb25uZWN0aW9uc18gPSBNQVhfQ09OTkVDVElPTlM7CisgICAgbWF4RnJhbWVTaXplXyA9IE1BWF9GUkFNRV9TSVpFOworICAgIHRhc2tFeHBpcmVUaW1lXyA9IDA7CisgICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXyA9IDAuODsKKyAgICBvdmVybG9hZEFjdGlvbl8gPSBUX09WRVJMT0FEX05PX0FDVElPTjsKKyAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IFdSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkU7CisgICAgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBJRExFX1JFQURfQlVGRkVSX0xJTUlUOworICAgIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyA9IElETEVfV1JJVEVfQlVGRkVSX0xJTUlUOworICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gPSBSRVNJWkVfQlVGRkVSX0VWRVJZX047CisgICAgb3ZlcmxvYWRlZF8gPSBmYWxzZTsKKyAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CisgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CisgIH0KKworcHVibGljOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKyAgfQorCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworICB9CisKKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworCisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOworICB9CisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoaW5wdXRQcm90b2NvbEZhY3RvcnkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGlucHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkob3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOworICB9CisKKyAgflROb25ibG9ja2luZ1NlcnZlcigpOworCisgIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7CisKKyAgaW50IGdldExpc3RlblBvcnQoKSB7IHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRMaXN0ZW5Qb3J0KCk7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIHsgcmV0dXJuIHRocmVhZE1hbmFnZXJfOyB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIG51bWJlciBvZiBJTyB0aHJlYWRzIHVzZWQgYnkgdGhpcyBzZXJ2ZXIuIENhbiBvbmx5IGJlIHVzZWQgYmVmb3JlCisgICAqIHRoZSBjYWxsIHRvIHNlcnZlKCkgYW5kIGhhcyBubyBlZmZlY3QgYWZ0ZXJ3YXJkcy4gIFdlIGFsd2F5cyB1c2UgYQorICAgKiBQb3NpeFRocmVhZEZhY3RvcnkgZm9yIHRoZSBJTyB3b3JrZXIgdGhyZWFkcywgYmVjYXVzZSB0aGV5IG11c3Qgam9pbmFibGUKKyAgICogZm9yIGNsZWFuIHNodXRkb3duLgorICAgKi8KKyAgdm9pZCBzZXROdW1JT1RocmVhZHMoc2l6ZV90IG51bVRocmVhZHMpIHsKKyAgICBudW1JT1RocmVhZHNfID0gbnVtVGhyZWFkczsKKyAgICAvLyBVc2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgZG9lc24ndCB3b3JrcyBmb3IgbXVsdGktdGhyZWFkZWQgc2VydmVycworICAgIGFzc2VydChudW1JT1RocmVhZHNfIDw9IDEgfHwgIXVzZXJFdmVudEJhc2VfKTsKKyAgfQorCisgIC8qKiBSZXR1cm4gd2hldGhlciB0aGUgSU8gdGhyZWFkcyB3aWxsIGdldCBoaWdoIHNjaGVkdWxpbmcgcHJpb3JpdHkgKi8KKyAgYm9vbCB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHMoKSBjb25zdCB7IHJldHVybiB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfOyB9CisKKyAgLyoqIFNldCB3aGV0aGVyIHRoZSBJTyB0aHJlYWRzIHdpbGwgZ2V0IGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eS4gKi8KKyAgdm9pZCBzZXRVc2VIaWdoUHJpb3JpdHlJT1RocmVhZHMoYm9vbCB2YWwpIHsgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IHZhbDsgfQorCisgIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBJTyB0aHJlYWRzIHVzZWQgYnkgdGhpcyBzZXJ2ZXIuICovCisgIHNpemVfdCBnZXROdW1JT1RocmVhZHMoKSBjb25zdCB7IHJldHVybiBudW1JT1RocmVhZHNfOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpbWl0IG9uIFRDb25uZWN0aW9uIHBvb2wgc2l6ZS4KKyAgICovCisgIHNpemVfdCBnZXRDb25uZWN0aW9uU3RhY2tMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25TdGFja0xpbWl0XzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVudXNlZCBUQ29ubmVjdGlvbiB3ZSB3aWxsIGhvbGQgaW4gcmVzZXJ2ZS4KKyAgICoKKyAgICogQHBhcmFtIHN6IHRoZSBuZXcgbGltaXQgZm9yIFRDb25uZWN0aW9uIHBvb2wgc2l6ZS4KKyAgICovCisgIHZvaWQgc2V0Q29ubmVjdGlvblN0YWNrTGltaXQoc2l6ZV90IHN6KSB7IGNvbm5lY3Rpb25TdGFja0xpbWl0XyA9IHN6OyB9CisKKyAgYm9vbCBpc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOyB9CisKKyAgdm9pZCBhZGRUYXNrKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICAgIHRocmVhZE1hbmFnZXJfLT5hZGQodGFzaywgMExMLCB0YXNrRXhwaXJlVGltZV8pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgY291bnQgb2Ygc29ja2V0cyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLgorICAgKgorICAgKiBAcmV0dXJuIGNvdW50IG9mIGNvbm5lY3RlZCBzb2NrZXRzLgorICAgKi8KKyAgc2l6ZV90IGdldE51bUNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gbnVtVENvbm5lY3Rpb25zXzsgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHNvY2tldHMgY3VycmVudGx5IGNvbm5lY3RlZCB0by4KKyAgICoKKyAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAgICovCisgIHNpemVfdCBnZXROdW1BY3RpdmVDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGdldE51bUNvbm5lY3Rpb25zKCkgLSBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhbGxvY2F0ZWQgYnV0IG5vdCBpbiB1c2UuCisgICAqCisgICAqIEByZXR1cm4gY291bnQgb2YgaWRsZSBjb25uZWN0aW9uIG9iamVjdHMuCisgICAqLworICBzaXplX3QgZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7IH0KKworICAvKioKKyAgICogUmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBjb25uZWN0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgICAqIFRoaXMgaXMgZGVmaW5lZCBhcyBhIGNvbm5lY3Rpb24gd2hlcmUgYWxsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kCisgICAqIGVpdGhlciBhc3NpZ25lZCBhIHRhc2sgKHdoZW4gdGhyZWFkaW5nKSBvciBwYXNzZWQgdG8gYSBoYW5kbGVyICh3aGVuCisgICAqIG5vdCB0aHJlYWRpbmcpLCBhbmQgd2hlcmUgdGhlIGhhbmRsZXIgaGFzIG5vdCB5ZXQgcmV0dXJuZWQuCisgICAqCisgICAqIEByZXR1cm4gIyBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICovCisgIHNpemVfdCBnZXROdW1BY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbnVtQWN0aXZlUHJvY2Vzc29yc187IH0KKworICAvLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBpbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisgICAgKytudW1BY3RpdmVQcm9jZXNzb3JzXzsKKyAgfQorCisgIC8vLyBEZWNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICB2b2lkIGRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CisgICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKyAgICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiAwKSB7CisgICAgICAtLW51bUFjdGl2ZVByb2Nlc3NvcnNfOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCisgICAqLworICBzaXplX3QgZ2V0TWF4Q29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBtYXhDb25uZWN0aW9uc187IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCisgICAqCisgICAqIEBwYXJhbSBtYXhDb25uZWN0aW9ucyBuZXcgc2V0dGluZyBmb3IgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyhzaXplX3QgbWF4Q29ubmVjdGlvbnMpIHsgbWF4Q29ubmVjdGlvbnNfID0gbWF4Q29ubmVjdGlvbnM7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgd2FpdGluZyBpbiBoYW5kbGVyL3Rhc2sgYmVmb3JlIG92ZXJsb2FkLgorICAgKgorICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KKyAgICovCisgIHNpemVfdCBnZXRNYXhBY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gbWF4QWN0aXZlUHJvY2Vzc29yc187IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgd2FpdGluZyBpbiBoYW5kbGVyL3Rhc2sgYmVmb3JlIG92ZXJsb2FkLgorICAgKgorICAgKiBAcGFyYW0gbWF4QWN0aXZlUHJvY2Vzc29ycyBuZXcgc2V0dGluZyBmb3IgbWF4aW11bSAjIG9mIGFjdGl2ZSBwcm9jZXNzZXMuCisgICAqLworICB2b2lkIHNldE1heEFjdGl2ZVByb2Nlc3NvcnMoc2l6ZV90IG1heEFjdGl2ZVByb2Nlc3NvcnMpIHsKKyAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyA9IG1heEFjdGl2ZVByb2Nlc3NvcnM7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJhbWUgc2l6ZS4KKyAgICoKKyAgICogSWYgYSBjbGllbnQgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gdGhpcyBsaW1pdCwKKyAgICogaXRzIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQuCisgICAqCisgICAqIEByZXR1cm4gTWF4aXVtIGZyYW1lIHNpemUsIGluIGJ5dGVzLgorICAgKi8KKyAgc2l6ZV90IGdldE1heEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJhbWUgc2l6ZS4KKyAgICoKKyAgICogQHBhcmFtIG1heEZyYW1lU2l6ZSBUaGUgbmV3IG1heGltdW0gZnJhbWUgc2l6ZS4KKyAgICovCisgIHZvaWQgc2V0TWF4RnJhbWVTaXplKHNpemVfdCBtYXhGcmFtZVNpemUpIHsgbWF4RnJhbWVTaXplXyA9IG1heEZyYW1lU2l6ZTsgfQorCisgIC8qKgorICAgKiBHZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgorICAgKgorICAgKiBAcmV0dXJuIGh5c3RlcmVzaXMgZnJhY3Rpb24KKyAgICovCisgIGRvdWJsZSBnZXRPdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCB7IHJldHVybiBvdmVybG9hZEh5c3RlcmVzaXNfOyB9CisKKyAgLyoqCisgICAqIFNldCBmcmFjdGlvbiBvZiBtYXhpbXVtIGxpbWl0cyBiZWZvcmUgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCisgICAqIEEgZ29vZCB2YWx1ZSB3b3VsZCBwcm9iYWJseSBiZSBiZXR3ZWVuIDAuNSBhbmQgMC45LgorICAgKgorICAgKiBAcGFyYW0gaHlzdGVyZXNpc0ZyYWN0aW9uIGZyYWN0aW9uIDw9IDEuMC4KKyAgICovCisgIHZvaWQgc2V0T3ZlcmxvYWRIeXN0ZXJlc2lzKGRvdWJsZSBoeXN0ZXJlc2lzRnJhY3Rpb24pIHsKKyAgICBpZiAoaHlzdGVyZXNpc0ZyYWN0aW9uIDw9IDEuMCAmJiBoeXN0ZXJlc2lzRnJhY3Rpb24gPiAwLjApIHsKKyAgICAgIG92ZXJsb2FkSHlzdGVyZXNpc18gPSBoeXN0ZXJlc2lzRnJhY3Rpb247CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgd2lsbCB0YWtlIG9uIG92ZXJsb2FkLgorICAgKgorICAgKiBAcmV0dXJuIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBjdXJyZW50bHkgc2V0IGFjdGlvbi4KKyAgICovCisgIFRPdmVybG9hZEFjdGlvbiBnZXRPdmVybG9hZEFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIG92ZXJsb2FkQWN0aW9uXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIGlzIHRvIHRha2Ugb24gb3ZlcmxvYWQuCisgICAqCisgICAqIEBwYXJhbSBvdmVybG9hZEFjdGlvbiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgYWN0aW9uLgorICAgKi8KKyAgdm9pZCBzZXRPdmVybG9hZEFjdGlvbihUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb24pIHsgb3ZlcmxvYWRBY3Rpb25fID0gb3ZlcmxvYWRBY3Rpb247IH0KKworICAvKioKKyAgICogR2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCisgICAqCisgICAqIEByZXR1cm4gYSA2NC1iaXQgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgICAqLworICBpbnQ2NF90IGdldFRhc2tFeHBpcmVUaW1lKCkgY29uc3QgeyByZXR1cm4gdGFza0V4cGlyZVRpbWVfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgorICAgKgorICAgKiBAcGFyYW0gdGFza0V4cGlyZVRpbWUgYSA2NC1iaXQgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgICAqLworICB2b2lkIHNldFRhc2tFeHBpcmVUaW1lKGludDY0X3QgdGFza0V4cGlyZVRpbWUpIHsgdGFza0V4cGlyZVRpbWVfID0gdGFza0V4cGlyZVRpbWU7IH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lIGlmIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCisgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBtYXhpbXVtcyBmb3Igb3BlbiBjb25uZWN0aW9ucyBhbmQgY29ubmVjdGlvbnMKKyAgICogY3VycmVudGx5IGluIHByb2Nlc3NpbmcsIGFuZCBzZXRzIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpZiB0aGV5IGFyZQorICAgKiBleGNlZWRlZC4gIFRoZSBvdmVybG9hZCB3aWxsIHBlcnNpc3QgdW50aWwgYm90aCB2YWx1ZXMgYXJlIGJlbG93IHRoZQorICAgKiBjdXJyZW50IGh5c3RlcmVzaXMgZnJhY3Rpb24gb2YgdGhlaXIgbWF4aW11bXMuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdmVybG9hZCBjb25kaXRpb24gZXhpc3RzLCBmYWxzZSBpZiBub3QuCisgICAqLworICBib29sIHNlcnZlck92ZXJsb2FkZWQoKTsKKworICAvKiogUG9wIGFuZCBkaXNjYXJkIG5leHQgdGFzayBvbiB0aHJlYWRwb29sIHdhaXQgcXVldWUuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHRhc2sgd2FzIGRpc2NhcmRlZCwgZmFsc2UgaWYgdGhlIHdhaXQgcXVldWUgd2FzIGVtcHR5LgorICAgKi8KKyAgYm9vbCBkcmFpblBlbmRpbmdUYXNrKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgc3RhcnRpbmcgc2l6ZSBvZiBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlci4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCisgICAqLworICBzaXplX3QgZ2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgc3RhcnRpbmcgc2l6ZSBvZiBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlci4KKyAgICoKKyAgICogQHBhcmFtIHNpemUgIyBieXRlcyB3ZSBpbml0aWFsaXplIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyIHRvLgorICAgKi8KKyAgdm9pZCBzZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKHNpemVfdCBzaXplKSB7IHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfID0gc2l6ZTsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKgorICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KKyAgICovCisgIHNpemVfdCBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVJlYWRCdWZmZXJMaW1pdF87IH0KKworICAvKioKKyAgICogW05PVEU6IFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB1c2UgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpLl0KKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCisgICAqLworICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVJlYWRCdWZmZXJMaW1pdF87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICogSWYgYSBUQ29ubmVjdGlvbiBvYmplY3QgaXMgZm91bmQgKGVpdGhlciBvbiBjb25uZWN0aW9uIGNsb3NlIG9yIGJldHdlZW4KKyAgICogY2FsbHMgd2hlbiByZXNpemVCdWZmZXJFdmVyeU5fIGlzIHNldCkgd2l0aCBtb3JlIHRoYW4gdGhpcyBtdWNoIG1lbW9yeQorICAgKiBhbGxvY2F0ZWQgdG8gaXRzIHJlYWQgYnVmZmVyLCB3ZSBmcmVlIGl0IGFuZCBhbGxvdyBpdCB0byBiZSByZWluaXRpYWxpemVkCisgICAqIG9uIHRoZSBuZXh0IHJlY2VpdmVkIGZyYW1lLgorICAgKgorICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgorICAgKi8KKyAgdm9pZCBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgeyBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OyB9CisKKyAgLyoqCisgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHNldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCisgICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKKyAgICogYWxsb2NhdGVkIHRvIGl0cyByZWFkIGJ1ZmZlciwgd2UgZnJlZSBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgcmVpbml0aWFsaXplZAorICAgKiBvbiB0aGUgbmV4dCByZWNlaXZlZCBmcmFtZS4KKyAgICoKKyAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gY2hlY2tlZC4KKyAgICovCisgIHZvaWQgc2V0SWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCBsaW1pdCkgeyBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKgorICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgcmVhbGxvY2F0ZSBidWZmZXJzIHdoZW4gY2hlY2tlZC4KKyAgICovCisgIHNpemVfdCBnZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSB3cml0ZSBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICogSWYgYSBUQ29ubmVjdGlvbiBvYmplY3QgaXMgZm91bmQgKGVpdGhlciBvbiBjb25uZWN0aW9uIGNsb3NlIG9yIGJldHdlZW4KKyAgICogY2FsbHMgd2hlbiByZXNpemVCdWZmZXJFdmVyeU5fIGlzIHNldCkgd2l0aCBtb3JlIHRoYW4gdGhpcyBtdWNoIG1lbW9yeQorICAgKiBhbGxvY2F0ZWQgdG8gaXRzIHdyaXRlIGJ1ZmZlciwgd2UgZGVzdHJveSBhbmQgY29uc3RydWN0IHRoYXQgYnVmZmVyIHdpdGgKKyAgICogd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gYnl0ZXMuCisgICAqCisgICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGlkbGUuCisgICAqLworICB2b2lkIHNldElkbGVXcml0ZUJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgeyBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gPSBsaW1pdDsgfQorCisgIC8qKgorICAgKiBHZXQgIyBvZiBjYWxscyBtYWRlIGJldHdlZW4gYnVmZmVyIHNpemUgY2hlY2tzLiAgMCBtZWFucyBkaXNhYmxlZC4KKyAgICoKKyAgICogQHJldHVybiAjIG9mIGNhbGxzIGJldHdlZW4gYnVmZmVyIHNpemUgY2hlY2tzLgorICAgKi8KKyAgaW50MzJfdCBnZXRSZXNpemVCdWZmZXJFdmVyeU4oKSBjb25zdCB7IHJldHVybiByZXNpemVCdWZmZXJFdmVyeU5fOyB9CisKKyAgLyoqCisgICAqIENoZWNrIGJ1ZmZlciBzaXplcyBldmVyeSAiY291bnQiIGNhbGxzLiAgVGhpcyBhbGxvd3MgYnVmZmVyIGxpbWl0cworICAgKiB0byBiZSBlbmZvcmNlZCBmb3IgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aXRoIGEgY29udHJvbGxhYmxlIGRlZ3JlZQorICAgKiBvZiBvdmVyaGVhZC4gMCBkaXNhYmxlcyBjaGVja3MgZXhjZXB0IGF0IGNvbm5lY3Rpb24gY2xvc2UuCisgICAqCisgICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGNhbGxzIGJldHdlZW4gY2hlY2tzLCBvciAwIHRvIGRpc2FibGUKKyAgICovCisgIHZvaWQgc2V0UmVzaXplQnVmZmVyRXZlcnlOKGludDMyX3QgY291bnQpIHsgcmVzaXplQnVmZmVyRXZlcnlOXyA9IGNvdW50OyB9CisKKyAgLyoqCisgICAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZAorICAgKiBsb29wcyBvdmVyIHRoZSBsaWJldmVudCBoYW5kbGVyLgorICAgKi8KKyAgdm9pZCBzZXJ2ZSgpOworCisgIC8qKgorICAgKiBDYXVzZXMgdGhlIHNlcnZlciB0byB0ZXJtaW5hdGUgZ3JhY2VmdWxseSAoY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQpLgorICAgKi8KKyAgdm9pZCBzdG9wKCk7CisKKyAgLy8vIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KKyAgdm9pZCBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpOworCisgIC8qKgorICAgKiBSZWdpc3RlciB0aGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQorICAgKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbiBhIHNpbmdsZS10aHJlYWQKKyAgICogbW9kZSwgYW5kIHRoZSBldmVudCBiYXNlIGlzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIChpLmUuLCB0aGUgY2FsbGVyKS4KKyAgICoKKyAgICogQHBhcmFtIHVzZXJfZXZlbnRfYmFzZSB0aGUgdXNlci1wcm92aWRlZCBldmVudC1iYXNlLiBUaGUgdXNlciBpcworICAgKiByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZXZlbnQgYmFzZSBtZW1vcnkuCisgICAqLworICB2b2lkIHJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykuCisgICAqLworICBldmVudF9iYXNlKiBnZXRVc2VyRXZlbnRCYXNlKCkgY29uc3QgeyByZXR1cm4gdXNlckV2ZW50QmFzZV87IH0KKworICAvKiogU29tZSB0cmFuc3BvcnRzLCBsaWtlIFRIZWFkZXJUcmFuc3BvcnQsIHJlcXVpcmUgcGFzc2luZyB0aHJvdWdoCisgICAqIHRoZSBmcmFtaW5nIHNpemUgaW5zdGVhZCBvZiBzdHJpcHBpbmcgaXQuCisgICAqLworICBib29sIGdldEhlYWRlclRyYW5zcG9ydCgpOworCitwcml2YXRlOgorICAvKioKKyAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUgdGhyZWFkbWFuYWdlciBjYWxscyB3aGVuIGEgdGFzayByZWFjaGVzCisgICAqIGl0cyBleHBpcmF0aW9uIHRpbWUuICBJdCBpcyBuZWVkZWQgdG8gY2xlYW4gdXAgdGhlIGV4cGlyZWQgY29ubmVjdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgdGhlIHJ1bm5hYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwaXJlZCB0YXNrLgorICAgKi8KKyAgdm9pZCBleHBpcmVDbG9zZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworCisgIC8qKgorICAgKiBSZXR1cm4gYW4gaW5pdGlhbGl6ZWQgY29ubmVjdGlvbiBvYmplY3QuICBDcmVhdGVzIG9yIHJlY292ZXJzIGZyb20KKyAgICogcG9vbCBhIFRDb25uZWN0aW9uIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIHRoZSBwcm92aWRlZCBzb2NrZXQgRkQKKyAgICogYW5kIGZsYWdzLgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEZEIG9mIHNvY2tldCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLgorICAgKiBAcGFyYW0gYWRkciB0aGUgc29ja2FkZHIgb2YgdGhlIGNsaWVudAorICAgKiBAcGFyYW0gYWRkckxlbiB0aGUgbGVuZ3RoIG9mIGFkZHIKKyAgICogQHJldHVybiBwb2ludGVyIHRvIGluaXRpYWxpemVkIFRDb25uZWN0aW9uIG9iamVjdC4KKyAgICovCisgIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbAorICAgKiAoYSBzdGFjaykgaXNuJ3QgZnVsbCwgcGxhY2UgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IG9uIGl0LCBvdGhlcndpc2UKKyAgICoganVzdCBkZWxldGUgaXQuCisgICAqCisgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBUQ29uZWN0aW9uIGJlaW5nIHJldHVybmVkLgorICAgKi8KKyAgdm9pZCByZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKTsKK307CisKK2NsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhbiBJTyB0aHJlYWQgYW5kIHNldHMgdXAgdGhlIGV2ZW50IGJhc2UuICBUaGUgbGlzdGVuU29ja2V0IHNob3VsZAorICAvLyBiZSBhIHZhbGlkIEZEIG9uIHdoaWNoIGxpc3RlbigpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiAgSWYgdGhlCisgIC8vIGxpc3RlblNvY2tldCBpcyA8IDAsIGFjY2VwdGluZyB3aWxsIG5vdCBiZSBkb25lLgorICBUTm9uYmxvY2tpbmdJT1RocmVhZChUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5Tb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGlnaFByaW9yaXR5KTsKKworICB+VE5vbmJsb2NraW5nSU9UaHJlYWQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBldmVudC1iYXNlIGZvciB0aGlzIHRocmVhZC4KKyAgZXZlbnRfYmFzZSogZ2V0RXZlbnRCYXNlKCkgY29uc3QgeyByZXR1cm4gZXZlbnRCYXNlXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNlcnZlciBmb3IgdGhpcyB0aHJlYWQuCisgIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGlzIElPIHRocmVhZC4KKyAgaW50IGdldFRocmVhZE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG51bWJlcl87IH0KKworICAvLyBSZXR1cm5zIHRoZSB0aHJlYWQgaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiAgVGhpcyBzaG91bGQKKyAgLy8gb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRocmVhZCBoYXMgYmVlbiBzdGFydGVkLgorICBUaHJlYWQ6OmlkX3QgZ2V0VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiB0aHJlYWRJZF87IH0KKworICAvLyBSZXR1cm5zIHRoZSBzZW5kLWZkIGZvciB0YXNrIGNvbXBsZXRlIG5vdGlmaWNhdGlvbnMuCisgIGV2dXRpbF9zb2NrZXRfdCBnZXROb3RpZmljYXRpb25TZW5kRkQoKSBjb25zdCB7IHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1sxXTsgfQorCisgIC8vIFJldHVybnMgdGhlIHJlYWQtZmQgZm9yIHRhc2sgY29tcGxldGUgbm90aWZpY2F0aW9ucy4KKyAgZXZ1dGlsX3NvY2tldF90IGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpIGNvbnN0IHsgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBnZXRUaHJlYWQoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfOyB9CisKKyAgLy8gU2V0cyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgorICB2b2lkIHNldFRocmVhZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiYgdCkgeyB0aHJlYWRfID0gdDsgfQorCisgIC8vIFVzZWQgYnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBpbmRpY2F0ZSBwcm9jZXNzaW5nIGhhcyBmaW5pc2hlZC4KKyAgYm9vbCBub3RpZnkoVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubik7CisKKyAgLy8gRW50ZXJzIHRoZSBldmVudCBsb29wIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgYSBjYWxsIHRvIHN0b3AoKS4KKyAgdmlydHVhbCB2b2lkIHJ1bigpOworCisgIC8vIEV4aXRzIHRoZSBldmVudCBsb29wIGFzIHNvb24gYXMgcG9zc2libGUuCisgIHZvaWQgc3RvcCgpOworCisgIC8vIEVuc3VyZXMgdGhhdCB0aGUgZXZlbnQtbG9vcCB0aHJlYWQgaXMgZnVsbHkgZmluaXNoZWQgYW5kIHNodXQgZG93bi4KKyAgdm9pZCBqb2luKCk7CisKKyAgLy8vIFJlZ2lzdGVycyB0aGUgZXZlbnRzIGZvciB0aGUgbm90aWZpY2F0aW9uICYgbGlzdGVuIHNvY2tldHMKKyAgdm9pZCByZWdpc3RlckV2ZW50cygpOworCitwcml2YXRlOgorICAvKioKKyAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBzaWduYWxpbmcgdGFzayBjb21wbGV0aW9uLiAgUHJvdmlkZXMgYQorICAgKiBjYWxsYmFjayB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHRoYXQgd2lsbCByZWFkIGEgY29ubmVjdGlvbgorICAgKiBvYmplY3QncyBhZGRyZXNzIGZyb20gYSBwaXBlIGFuZCBjYWxsIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKSBmb3IKKyAgICogdGhhdCBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAqLworICBzdGF0aWMgdm9pZCBub3RpZnlIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpOworCisgIC8qKgorICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIGxpc3RlbmVyIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKKyAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIHNlcnZlci0+aGFuZGxlRXZlbnQoKS4KKyAgICoKKyAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cnJlZCBvbi4KKyAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgorICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFROb25ibG9ja2luZ1NlcnZlcidzICJ0aGlzIi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGxpc3RlbkhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdikgeworICAgICgoVE5vbmJsb2NraW5nU2VydmVyKil2KS0+aGFuZGxlRXZlbnQoZmQsIHdoaWNoKTsKKyAgfQorCisgIC8vLyBFeGl0cyB0aGUgbG9vcCBBU0FQIGluIGNhc2Ugb2Ygc2h1dGRvd24gb3IgZXJyb3IuCisgIHZvaWQgYnJlYWtMb29wKGJvb2wgZXJyb3IpOworCisgIC8vLyBDcmVhdGUgdGhlIHBpcGUgdXNlZCB0byBub3RpZnkgSS9PIHByb2Nlc3Mgb2YgdGFzayBjb21wbGV0aW9uLgorICB2b2lkIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKKworICAvLy8gVW5yZWdpc3RlcnMgb3VyIGV2ZW50cyBmb3Igbm90aWZpY2F0aW9uIGFuZCBsaXN0ZW4gc29ja2V0cy4KKyAgdm9pZCBjbGVhbnVwRXZlbnRzKCk7CisKKyAgLy8vIFNldHMgKG9yIGNsZWFycykgaGlnaCBwcmlvcml0eSBzY2hlZHVsaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICB2b2lkIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoYm9vbCB2YWx1ZSk7CisKK3ByaXZhdGU6CisgIC8vLyBhc3NvY2lhdGVkIHNlcnZlcgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlcl87CisKKyAgLy8vIHRocmVhZCBudW1iZXIgKGZvciBkZWJ1Z2dpbmcpLgorICBjb25zdCBpbnQgbnVtYmVyXzsKKworICAvLy8gVGhlIGFjdHVhbCBwaHlzaWNhbCB0aHJlYWQgaWQuCisgIFRocmVhZDo6aWRfdCB0aHJlYWRJZF87CisKKyAgLy8vIElmIGxpc3RlblNvY2tldF8gPj0gMCwgYWRkcyBhbiBldmVudCBvbiB0aGUgZXZlbnRfYmFzZSB0byBhY2NlcHQgY29ubnMKKyAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5Tb2NrZXRfOworCisgIC8vLyBTZXRzIGEgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5IHdoZW4gcnVubmluZworICBib29sIHVzZUhpZ2hQcmlvcml0eV87CisKKyAgLy8vIHBvaW50ZXIgdG8gZXZlbnRiYXNlIHRvIGJlIHVzZWQgZm9yIGxvb3BpbmcKKyAgZXZlbnRfYmFzZSogZXZlbnRCYXNlXzsKKworICAvLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZXZlbnQgYmFzZQorICAvLy8gbWVtb3J5LgorICBib29sIG93bkV2ZW50QmFzZV87CisKKyAgLy8vIFVzZWQgd2l0aCBldmVudEJhc2VfIGZvciBjb25uZWN0aW9uIGV2ZW50cyAob25seSBpbiBsaXN0ZW5lciB0aHJlYWQpCisgIHN0cnVjdCBldmVudCBzZXJ2ZXJFdmVudF87CisKKyAgLy8vIFVzZWQgd2l0aCBldmVudEJhc2VfIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCisgIHN0cnVjdCBldmVudCBub3RpZmljYXRpb25FdmVudF87CisKKyAgLy8vIEZpbGUgZGVzY3JpcHRvcnMgZm9yIHBpcGUgdXNlZCBmb3IgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KKyAgZXZ1dGlsX3NvY2tldF90IG5vdGlmaWNhdGlvblBpcGVGRHNfWzJdOworCisgIC8vLyBBY3R1YWwgSU8gVGhyZWFkCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3MzFjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKyNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICitpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2ZkcyA9ICgxIDw8IDI0KSkgeworICBzdHJ1Y3QgcmxpbWl0IGZkbWF4cmw7CisKKyAgZm9yIChmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHM7CisgICAgICAgbWF4X2ZkcyAmJiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZmZG1heHJsKSA8IDApOworICAgICAgIGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkcykgeworICAgIG1heF9mZHMgLz0gMjsKKyAgfQorCisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZkbWF4cmwucmxpbV9jdXIpOworfQorI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZDgxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKKworLyoqCisgKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlciBjb3JlLiBUbworICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKKyAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCisgKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKKyAqIGluc3RhbmNlJ3Mgc3RhdGUpLgorICovCitjbGFzcyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFNlcnZlckV2ZW50SGFuZGxlcigpIHt9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgICh2b2lkKWlucHV0OworICAgICh2b2lkKW91dHB1dDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyCisgICAqIGNvbnRleHQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgICAodm9pZClzZXJ2ZXJDb250ZXh0OworICAgICh2b2lkKXRyYW5zcG9ydDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBQcmV2ZW50IGRpcmVjdCBpbnN0YW50aWF0aW9uLgorICAgKi8KKyAgVFNlcnZlckV2ZW50SGFuZGxlcigpIHt9Cit9OworCisvKioKKyAqIFRocmlmdCBzZXJ2ZXIuCisgKgorICovCitjbGFzcyBUU2VydmVyIDogcHVibGljIGNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRTZXJ2ZXIoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CisKKyAgLy8gQWxsb3dzIHJ1bm5pbmcgdGhlIHNlcnZlciBhcyBhIFJ1bm5hYmxlIHRocmVhZAorICB2aXJ0dWFsIHZvaWQgcnVuKCkgeyBzZXJ2ZSgpOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBnZXRQcm9jZXNzb3JGYWN0b3J5KCkgeyByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gZ2V0U2VydmVyVHJhbnNwb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKKyAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisKK3Byb3RlY3RlZDoKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgfQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgfQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgfQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgfQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQorCisgIC8qKgorICAgKiBHZXQgYSBUUHJvY2Vzc29yIHRvIGhhbmRsZSBjYWxscyBvbiBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIGNvbm5lY3Rpb24gKG5ldmVyIG9uY2UgcGVyCisgICAqIGNhbGwpLiAgVGhpcyBhbGxvd3MgdGhlIFRQcm9jZXNzb3JGYWN0b3J5IHRvIHJldHVybiBhIGRpZmZlcmVudCBwcm9jZXNzb3IKKyAgICogZm9yIGVhY2ggY29ubmVjdGlvbiBpZiBpdCBkZXNpcmVzLgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgICAgVENvbm5lY3Rpb25JbmZvIGNvbm5JbmZvOworICAgIGNvbm5JbmZvLmlucHV0ID0gaW5wdXRQcm90b2NvbDsKKyAgICBjb25uSW5mby5vdXRwdXQgPSBvdXRwdXRQcm90b2NvbDsKKyAgICBjb25uSW5mby50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLT5nZXRQcm9jZXNzb3IoY29ubkluZm8pOworICB9CisKKyAgLy8gQ2xhc3MgdmFyaWFibGVzCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKworcHVibGljOgorICB2b2lkIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgIH0KKworICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICB9CisKKyAgdm9pZCBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICB9CisKKyAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisgIH0KK307CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGluY3JlYXNlIHRoZSBtYXggZmlsZSBkZXNjcmlwdG9ycyBsaW1pdAorICogZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4uCisgKiBCeSBkZWZhdWx0LCB0cmllcyB0byBpbmNyZWFzZSBpdCB0byBhcyBtdWNoIGFzIDJeMjQuCisgKi8KKyNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICitpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2ZkcyA9ICgxIDw8IDI0KSk7CisjZW5kaWYKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmVhYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3IsCisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjp+VFNlcnZlckZyYW1ld29yaygpIHsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCByZWxlYXNlT25lRGVzY3JpcHRvcihjb25zdCBzdHJpbmcmIG5hbWUsIFQmIHBUcmFuc3BvcnQpIHsKKyAgaWYgKHBUcmFuc3BvcnQpIHsKKyAgICB0cnkgeworICAgICAgcFRyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJGcmFtZXdvcmsgIiArIG5hbWUgKyAiIGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpIHsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCisgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQgdG8gaW5kaWNhdGUgc2VydmVyIGlzIG5vdyBsaXN0ZW5pbmcKKyAgLy8gYW5kIHRoYXQgaXQgaXMgc2FmZSB0byBjb25uZWN0LgorICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7CisgIH0KKworICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKKyAgZm9yICg7OykgeworICAgIHRyeSB7CisgICAgICAvLyBEZXJlZmVyZW5jZSBhbnkgcmVzb3VyY2VzIGZyb20gYW55IHByZXZpb3VzIGNsaWVudCBjcmVhdGlvbgorICAgICAgLy8gc3VjaCB0aGF0IGEgYmxvY2tpbmcgYWNjZXB0IGRvZXMgbm90IGhvbGQgdGhlbSBpbmRlZmluaXRlbHkuCisgICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOworICAgICAgaW5wdXRQcm90b2NvbC5yZXNldCgpOworICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7CisgICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOworICAgICAgY2xpZW50LnJlc2V0KCk7CisKKyAgICAgIC8vIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50CisgICAgICAvLyBjbGllbnRzIGFsbG93ZWQsIHdhaXQgZm9yIG9uZSBvciBtb3JlIGNsaWVudHMgdG8gZHJhaW4gYmVmb3JlCisgICAgICAvLyBhY2NlcHRpbmcgYW5vdGhlci4KKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgICAgICAgIHdoaWxlIChjbGllbnRzXyA+PSBsaW1pdF8pIHsKKyAgICAgICAgICBtb25fLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgIGlmICghb3V0cHV0UHJvdG9jb2xGYWN0b3J5XykgeworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9CisKKyAgICAgIG5ld2x5Q29ubmVjdGVkQ2xpZW50KHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4oCisgICAgICAgICAgbmV3IFRDb25uZWN0ZWRDbGllbnQoZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQpLAorICAgICAgICAgIGJpbmQoJlRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpKTsKKworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoImlucHV0VHJhbnNwb3J0IiwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoIm91dHB1dFRyYW5zcG9ydCIsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigiY2xpZW50IiwgY2xpZW50KTsKKyAgICAgIGlmICh0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgeworICAgICAgICAvLyBBY2NlcHQgdGltZW91dCAtIGNvbnRpbnVlIHByb2Nlc3NpbmcuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmICh0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFCisgICAgICAgICAgICAgICAgIHx8IHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpIHsKKyAgICAgICAgLy8gU2VydmVyIHdhcyBpbnRlcnJ1cHRlZC4gIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gc3RvcHBpbmcuCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCisgICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCisgICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZGllZDogIikgKyB0dHgud2hhdCgpOworICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZWxlYXNlT25lRGVzY3JpcHRvcigic2VydmVyVHJhbnNwb3J0Iiwgc2VydmVyVHJhbnNwb3J0Xyk7Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGxpbWl0XzsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gY2xpZW50c187Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGh3bV87Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QgbmV3TGltaXQpIHsKKyAgaWYgKG5ld0xpbWl0IDwgMSkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgibmV3TGltaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICB9CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICBsaW1pdF8gPSBuZXdMaW1pdDsKKyAgaWYgKGxpbWl0XyAtIGNsaWVudHNfID4gMCkgeworICAgIG1vbl8ubm90aWZ5KCk7CisgIH0KK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzdG9wKCkgeworICAvLyBPcmRlciBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzZXJ2ZSgpIHJlbGVhc2VzIHNlcnZlclRyYW5zcG9ydF8gd2hlbiBpdCBpcworICAvLyBpbnRlcnJ1cHRlZCwgd2hpY2ggY2xvc2VzIHRoZSBzb2NrZXQgdGhhdCBpbnRlcnJ1cHRDaGlsZHJlbiB1c2VzLgorICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgICArK2NsaWVudHNfOworICAgIGh3bV8gPSAoc3RkOjptYXgpKGh3bV8sIGNsaWVudHNfKTsKKyAgfQorCisgIG9uQ2xpZW50Q29ubmVjdGVkKHBDbGllbnQpOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgeworICBvbkNsaWVudERpc2Nvbm5lY3RlZChwQ2xpZW50KTsKKyAgZGVsZXRlIHBDbGllbnQ7CisKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIGlmIChsaW1pdF8gLSAtLWNsaWVudHNfID4gMCkgeworICAgIG1vbl8ubm90aWZ5KCk7CisgIH0KK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWNjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogVFNlcnZlckZyYW1ld29yayBwcm92aWRlcyBhIHNpbmdsZSBjb25zb2xpZGF0ZWQgcHJvY2Vzc2luZyBsb29wIGZvcgorICogc2VydmVycy4gIEJ5IGhhdmluZyBhIHNpbmdsZSBwcm9jZXNzaW5nIGxvb3AsIGJlaGF2aW9yIGJldHdlZW4gc2VydmVycworICogaXMgbW9yZSBwcmVkaWN0YWJsZSBhbmQgbWFpbnRlbmFuY2UgY29zdCBpcyBsb3dlcmVkLiAgSW1wbGVtZW50YXRpb25zCisgKiBvZiBUU2VydmVyRnJhbWV3b3JrIG11c3QgcHJvdmlkZSBhIG1ldGhvZCB0byBkZWFsIHdpdGggYSBjbGllbnQgdGhhdAorICogY29ubmVjdHMgYW5kIG9uZSB0aGF0IGRpc2Nvbm5lY3RzLgorICoKKyAqIFdoaWxlIHRoaXMgZnVuY3Rpb25hbGl0eSBjb3VsZCBiZSByb2xsZWQgZGlyZWN0bHkgaW50byBUU2VydmVyLCBhbmQKKyAqIHByb2JhYmx5IHNob3VsZCBiZSwgaXQgd291bGQgYnJlYWsgdGhlIFRTZXJ2ZXIgaW50ZXJmYWNlIGNvbnRyYWN0IHNvCisgKiB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdGhpcmQgcGFydHkgc2VydmVycywgbm8gVFNlcnZlcnMKKyAqIHdlcmUgaGFybWVkIGluIHRoZSBtYWtpbmcgb2YgdGhpcyBjbGFzcy4KKyAqLworY2xhc3MgVFNlcnZlckZyYW1ld29yayA6IHB1YmxpYyBUU2VydmVyIHsKK3B1YmxpYzoKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICB2aXJ0dWFsIH5UU2VydmVyRnJhbWV3b3JrKCk7CisKKyAgLyoqCisgICAqIEFjY2VwdCBjbGllbnRzIGZyb20gdGhlIFRTZXJ2ZXJUcmFuc3BvcnQgYW5kIGFkZCB0aGVtIGZvciBwcm9jZXNzaW5nLgorICAgKiBDYWxsIHN0b3AoKSBvbiBhbm90aGVyIHRocmVhZCB0byBpbnRlcnJ1cHQgcHJvY2Vzc2luZworICAgKiBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGNhbGxlci4KKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlIHNlcnZlclRyYW5zcG9ydCB3aWxsIGJlIGNsb3NlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOworCisgIC8qKgorICAgKiBJbnRlcnJ1cHQgc2VydmUoKSBzbyB0aGF0IGl0IG1lZXRzIHBvc3QtY29uZGl0aW9ucyBhbmQgcmV0dXJucy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQuCisgICAqIFxyZXR1cm5zIHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdAorICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMuCisgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzCisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudENvdW50KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKiBccmV0dXJucyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNldCB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdoaWxlCisgICAqIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyBob3dldmVyIGl0IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlCisgICAqIGVuZm9yY2VkIHVudGlsIHRoZSBuZXh0IGNsaWVudCBpcyBhY2NlcHRlZCBhbmQgYWRkZWQuICBJZiB0aGUKKyAgICogbGltaXQgaXMgbG93ZXJlZCBiZWxvdyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBjbGllbnRzLCBubworICAgKiBhY3Rpb24gaXMgdGFrZW4gdG8gZGlzY29ubmVjdCB0aGUgY2xpZW50cy4KKyAgICogVGhlIGRlZmF1bHQgdmFsdWUgdXNlZCBpZiB0aGlzIGlzIG5vdCBjYWxsZWQgaXMgSU5UNjRfTUFYLgorICAgKiBccGFyYW1baW5dICBuZXdMaW1pdCAgdGhlIG5ldyBsaW1pdCBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICogXHRocm93cyBzdGQ6OmludmFsaWRfYXJndW1lbnQgaWYgbmV3TGltaXQgaXMgbGVzcyB0aGFuIDEKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEEgY2xpZW50IGhhcyBjb25uZWN0ZWQuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorICAgKiBsaWZldGltZSBvZiB0aGUgY2xpZW50IG9iamVjdC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmUoKSB0aHJlYWQsCisgICAqIHRoZXJlZm9yZSBhIGZhaWx1cmUgdG8gcmV0dXJuIHF1aWNrbHkgd2lsbCByZXN1bHQgaW4gbmV3IGNsaWVudCBjb25uZWN0aW9uCisgICAqIGRlbGF5cy4KKyAgICoKKyAgICogXHBhcmFtW2luXSAgcENsaWVudCAgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpID0gMDsKKworICAvKioKKyAgICogQSBjbGllbnQgaGFzIGRpc2Nvbm5lY3RlZC4KKyAgICogV2hlbiBjYWxsZWQ6CisgICAqICAgVGhlIHNlcnZlciBubyBsb25nZXIgdHJhY2tzIHRoZSBjbGllbnQuCisgICAqICAgVGhlIGNsaWVudCBUVHJhbnNwb3J0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgKiAgIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBkZWxldGUgdGhlIHBvaW50ZXIuCisgICAqCisgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBkaXNjb25uZWN0ZWQgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgPSAwOworCitwcml2YXRlOgorICAvKioKKyAgICogQ29tbW9uIGhhbmRsaW5nIGZvciBuZXcgY29ubmVjdGVkIGNsaWVudHMuICBJbXBsZW1lbnRzIGNvbmN1cnJlbnQKKyAgICogY2xpZW50IHJhdGUgbGltaXRpbmcgYWZ0ZXIgb25DbGllbnRDb25uZWN0ZWQgcmV0dXJucyBieSBibG9ja2luZyB0aGUKKyAgICogc2VydmUoKSB0aHJlYWQgaWYgdGhlIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuCisgICAqLworICB2b2lkIG5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CisKKyAgLyoqCisgICAqIFNtYXJ0IHBvaW50ZXIgY2xpZW50IGRlbGV0aW9uLgorICAgKiBDYWxscyBvbkNsaWVudERpc2Nvbm5lY3RlZCBhbmQgdGhlbiBkZWxldGVzIHBDbGllbnQuCisgICAqLworICB2b2lkIGRpc3Bvc2VDb25uZWN0ZWRDbGllbnQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCk7CisKKyAgLyoqCisgICAqIE1vbml0b3IgZm9yIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIG1vbl87CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBjbGllbnRzXzsKKworICAvKioKKyAgICogVGhlIGhpZ2ggd2F0ZXIgbWFyayBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGh3bV87CisKKyAgLyoqCisgICAqIFRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgbGltaXRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYyMzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6On5UU2ltcGxlU2VydmVyKCkgeworfQorCisvKioKKyAqIFRoZSBtYWluIGJvZHkgb2YgY3VzdG9taXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgVFNpbXBsZVNlcnZlciBpcyBxdWl0ZSBzaW1wbGU6CisgKiBXaGVuIGEgY2xpZW50IGNvbm5lY3RzLCB1c2UgdGhlIHNlcnZlKCkgdGhyZWFkIHRvIGRyaXZlIGl0IHRvIGNvbXBsZXRpb24gdGh1cworICogYmxvY2tpbmcgbmV3IGNvbm5lY3Rpb25zLgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgcENsaWVudC0+cnVuKCk7Cit9CisKKy8qKgorICogVFNpbXBsZVNlcnZlciBkb2VzIG5vdCB0cmFjayBjbGllbnRzIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZS4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KikgeworfQorCisvKioKKyAqIFRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIHRoZSBzaW1wbGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgbm90IGNhcGFibGUKKyAqIG9mIGhhdmluZyBtb3JlIHRoYW4gb25lIGNsaWVudCBhdCBhIHRpbWUsIHNvIHdlIGhpZGUgaXQuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QpIHsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ5MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgc2ltcGxlIHNlcnZlci4gSXQgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBydW5zIGEKKyAqIGNvbnRpbnVvdXMgbG9vcCBvZiBhY2NlcHRpbmcgYSBzaW5nbGUgY29ubmVjdGlvbiwgcHJvY2Vzc2luZyByZXF1ZXN0cyBvbgorICogdGhhdCBjb25uZWN0aW9uIHVudGlsIGl0IGNsb3NlcywgYW5kIHRoZW4gcmVwZWF0aW5nLgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgeworcHVibGljOgorICBUU2ltcGxlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2ltcGxlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIHZpcnR1YWwgflRTaW1wbGVTZXJ2ZXIoKTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworCitwcml2YXRlOgorICB2b2lkIHNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KTsgLy8gaGlkZQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzQ1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CisKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CisKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CisKK1RUaHJlYWRQb29sU2VydmVyOjp+VFRocmVhZFBvb2xTZXJ2ZXIoKSB7Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNlcnZlKCkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOworICB0aHJlYWRNYW5hZ2VyXy0+c3RvcCgpOworfQorCitpbnQ2NF90IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUaW1lb3V0KCkgY29uc3QgeworICByZXR1cm4gdGltZW91dF87Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNldFRpbWVvdXQoaW50NjRfdCB2YWx1ZSkgeworICB0aW1lb3V0XyA9IHZhbHVlOworfQorCitpbnQ2NF90IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHRhc2tFeHBpcmF0aW9uXzsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSkgeworICB0YXNrRXhwaXJhdGlvbl8gPSB2YWx1ZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4KK1RUaHJlYWRQb29sU2VydmVyOjpnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3QgeworICByZXR1cm4gdGhyZWFkTWFuYWdlcl87Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgdGhyZWFkTWFuYWdlcl8tPmFkZChwQ2xpZW50LCBnZXRUaW1lb3V0KCksIGdldFRhc2tFeHBpcmF0aW9uKCkpOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KikgeworfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjE5OThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBNYW5hZ2UgY2xpZW50cyB1c2luZyBhIHRocmVhZCBwb29sLgorICovCitjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKKyAgVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CisKKyAgVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOworCisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOworCisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICB2aXJ0dWFsIH5UVGhyZWFkUG9vbFNlcnZlcigpOworCisgIC8qKgorICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKKyAgICogICBUaGVyZSB3aWxsIGJlIG5vIGNsaWVudHMgY29ubmVjdGVkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisKKyAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVvdXQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHNldFRpbWVvdXQoaW50NjRfdCB2YWx1ZSk7CisKKyAgdmlydHVhbCBpbnQ2NF90IGdldFRhc2tFeHBpcmF0aW9uKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRUYXNrRXhwaXJhdGlvbihpbnQ2NF90IHZhbHVlKTsKKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0aW1lb3V0XzsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gdGFza0V4cGlyYXRpb25fOworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OworCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6On5UVGhyZWFkZWRTZXJ2ZXIoKSB7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpzZXJ2ZSgpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKTsKKworICAvLyBFbnN1cmUgcG9zdC1jb25kaXRpb24gb2Ygbm8gYWN0aXZlIGNsaWVudHMKKyAgU3luY2hyb25pemVkIHMoY2xpZW50TW9uaXRvcl8pOworICB3aGlsZSAoIWFjdGl2ZUNsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIGNsaWVudE1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIGRyYWluRGVhZENsaWVudHMoKTsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OmRyYWluRGVhZENsaWVudHMoKSB7CisgIC8vIHdlJ3JlIGluIGEgbW9uaXRvciBoZXJlCisgIHdoaWxlICghZGVhZENsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBkZWFkQ2xpZW50TWFwXy5iZWdpbigpOworICAgIGl0LT5zZWNvbmQtPmpvaW4oKTsKKyAgICBkZWFkQ2xpZW50TWFwXy5lcmFzZShpdCk7CisgIH0KK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOworICBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnRSdW5uZXI+IHBSdW5uYWJsZSA9IG1ha2Vfc2hhcmVkPFRDb25uZWN0ZWRDbGllbnRSdW5uZXI+KHBDbGllbnQpOworICBzaGFyZWRfcHRyPFRocmVhZD4gcFRocmVhZCA9IHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocFJ1bm5hYmxlKTsKKyAgcFJ1bm5hYmxlLT50aHJlYWQocFRocmVhZCk7CisgIGFjdGl2ZUNsaWVudE1hcF8uaW5zZXJ0KENsaWVudE1hcDo6dmFsdWVfdHlwZShwQ2xpZW50LmdldCgpLCBwVGhyZWFkKSk7CisgIHBUaHJlYWQtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSB7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgZHJhaW5EZWFkQ2xpZW50cygpOyAvLyB1c2UgdGhlIG91dGdvaW5nIHRocmVhZCB0byBkbyBzb21lIG1haW50ZW5hbmNlIG9uIG91ciBkZWFkIGNsaWVudCBiYWNrbG9nCisgIENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBhY3RpdmVDbGllbnRNYXBfLmZpbmQocENsaWVudCk7CisgIGlmIChpdCAhPSBhY3RpdmVDbGllbnRNYXBfLmVuZCgpKSB7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQgPSBpdDsKKyAgICBkZWFkQ2xpZW50TWFwXy5pbnNlcnQoaXQsICsrZW5kKTsKKyAgICBhY3RpdmVDbGllbnRNYXBfLmVyYXNlKGl0KTsKKyAgfQorICBpZiAoYWN0aXZlQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgY2xpZW50TW9uaXRvcl8ubm90aWZ5KCk7CisgIH0KK30KKworVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpCisgIDogcENsaWVudF8ocENsaWVudCkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6On5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6cnVuKCkgLyogb3ZlcnJpZGUgKi8geworICBwQ2xpZW50Xy0+cnVuKCk7ICAvLyBSdW4gdGhlIGNsaWVudAorICBwQ2xpZW50Xy5yZXNldCgpOyAvLyBUaGUgY2xpZW50IGlzIGRvbmUgLSByZWxlYXNlIGl0IGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGRlc3RydWN0b3IgZm9yIHNhZmV0eQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2NkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogTWFuYWdlIGNsaWVudHMgdXNpbmcgdGhyZWFkcyAtIHRocmVhZHMgYXJlIGNyZWF0ZWQgb25lIGZvciBlYWNoIGNsaWVudCBhbmQgYXJlCisgKiByZWxlYXNlZCB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuICBUaGlzIHNlcnZlciBpcyB1c2VkIHRvIG1ha2UgYSBkeW5hbWljYWxseQorICogc2NhbGFibGUgc2VydmVyIHVwIHRvIHRoZSBjb25jdXJyZW50IGNvbm5lY3Rpb24gbGltaXQuCisgKi8KK2NsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CisKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CisKKyAgdmlydHVhbCB+VFRocmVhZGVkU2VydmVyKCk7CisKKyAgLyoqCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZXJlIHdpbGwgYmUgbm8gY2xpZW50cyBjb25uZWN0ZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogRHJhaW4gcmVjZW50bHkgY29ubmVjdGVkIGNsaWVudHMgYnkgam9pbmluZyB0aGVpciB0aHJlYWRzIC0gdGhpcyBpcyBkb25lIGxhemlseSBiZWNhdXNlCisgICAqIHdlIGNhbm5vdCBkbyBpdCBpbnNpZGUgdGhlIHRocmVhZCBjb250ZXh0IHRoYXQgaXMgZGlzY29ubmVjdGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBkcmFpbkRlYWRDbGllbnRzKCk7CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50Q29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnREaXNjb25uZWN0ZWQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50ICpwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKworICAvKioKKyAgICogQSBoZWxwZXIgd3JhcHBlciB1c2VkIHRvIHdyYXAgdGhlIGNsaWVudCBpbiBzb21ldGhpbmcgd2UgY2FuIHVzZSB0byBtYWludGFpbgorICAgKiB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3RlZCBjbGllbnQgd2l0aGluIGEgZGV0YWNoZWQgdGhyZWFkLiAgV2UgY2Fubm90IHNpbXBseQorICAgKiB0cmFjayB0aGUgdGhyZWFkcyBiZWNhdXNlIGEgc2hhcmVkX3B0cjxUaHJlYWQ+IGhhbmdzIG9uIHRvIHRoZSBSdW5uYWJsZSBpdCBpcworICAgKiBwYXNzZWQsIGFuZCBUU2VydmVyRnJhbWV3b3JrIHJlcXVpcmVzIHRoZSBydW5uYWJsZSAoVENvbm5lY3RlZENsaWVudCkgdG8gYmUKKyAgICogZGVzdHJveWVkIGluIG9yZGVyIHRvIHdvcmsgcHJvcGVybHkuCisgICAqLworICBjbGFzcyBUQ29ubmVjdGVkQ2xpZW50UnVubmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUKKyAgeworICBwdWJsaWM6CisgICAgVENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworICAgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKTsKKyAgICB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiBwQ2xpZW50XzsKKyAgfTsKKworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgY2xpZW50TW9uaXRvcl87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxUQ29ubmVjdGVkQ2xpZW50ICosIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gPiBDbGllbnRNYXA7CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGFjdGl2ZSBjbGllbnRzCisgICAqLworICBDbGllbnRNYXAgYWN0aXZlQ2xpZW50TWFwXzsKKworICAvKioKKyAgICogQSBtYXAgb2YgY2xpZW50cyB0aGF0IGhhdmUgZGlzY29ubmVjdGVkIGJ1dCB0aGVpciB0aHJlYWRzIGhhdmUgbm90IGJlZW4gam9pbmVkCisgICAqLworICBDbGllbnRNYXAgZGVhZENsaWVudE1hcF87Cit9OworCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ4NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9jb25maWcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MTA1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisKKyNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgV1NBRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OIFdTQUVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCBXU0FFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19FWENMVVNJVkVBRERSVVNFCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVCBTT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgSU5WQUxJRF9TT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiB0aHJpZnRfc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCB0aHJpZnRfZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyAxCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgMAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIDEKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIHRocmlmdF9nZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2Vzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgX2Nsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gX29wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIF9jaHNpemVfcworIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBfY29tbWl0CisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGxzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIHVfbG9uZworIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAorIyAgaWZkZWYgX1dJTjMyX1dDRQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiguLi4pIHRocmlmdF93c3RyMnN0cihnYWlfc3RyZXJyb3JXKF9fVkFfQVJHU19fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAorIyAgaWYgKF9NU0NfVkVSIDwgMTkwMCkKKyMgICAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHRocmlmdF9zbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHRocmlmdF91c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGhyaWZ0X3RpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgdGhyaWZ0X2N0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCB0aHJpZnRfcG9sbAorIyAgaWYgV0lOVkVSIDw9IDB4MDUwMiAvL1hQLCBTZXJ2ZXIyMDAzCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICB0aHJpZnRfcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICAweDAzMDAKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIDB4MDAxMAorIyAgZWxzZSAvL1Zpc3RhLCBXaW43Li4uCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZW5kaWYgLy9XSU5WRVIKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyMgIGlmICFkZWZpbmVkKEFJX0FERFJDT05GSUcpCisjICAgIGRlZmluZSBBSV9BRERSQ09ORklHIDB4MDAwMDA0MDAKKyMgIGVuZGlmCisjZWxzZSAvL25vdCBfV0lOMzIKKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgICAgICAgRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCAgRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiAgICBFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgICBFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOICAgICAgRUFHQUlOCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFICAgICAgIEVQSVBFCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX1JFVVNFQUREUgorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVQgaW50CisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiBzb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIGZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgT19OT05CTE9DSworIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIEZfR0VURkwKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCBGX1NFVEZMCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSBnZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBvcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBmdHJ1bmNhdGUKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgZnN5bmMKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVCBpb2N0bAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgaW50CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAorIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBzc2l6ZV90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyBzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHVzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIGN0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCBwb2xsCisjICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0hVVF9SRFdSCisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWMyZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1aW50MzJfdCBUQnVmZmVyZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CisKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IHNhdGlzZnkgdGhlIHJlYWQKKyAgLy8gd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisgIGFzc2VydChoYXZlIDwgbGVuKTsKKworICAvLyBJZiB3ZSBoYXZlIHNvbWUgZGF0YSBpbiB0aGUgYnVmZmVyLCBjb3B5IGl0IG91dCBhbmQgcmV0dXJuIGl0LgorICAvLyBXZSBoYXZlIHRvIHJldHVybiBpdCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlLCBzaW5jZSB3ZSBhcmVuJ3QKKyAgLy8gZ3VhcmFudGVlZCB0aGF0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhY3R1YWxseSBoYXMgbW9yZSBkYXRhLCBzbworICAvLyBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBpdCBjb3VsZCBibG9jay4KKyAgaWYgKGhhdmUgPiAwKSB7CisgICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKKyAgICByZXR1cm4gaGF2ZTsKKyAgfQorCisgIC8vIE5vIGRhdGEgaXMgYXZhaWxhYmxlIGluIG91ciBidWZmZXIuCisgIC8vIEdldCBtb3JlIGZyb20gdW5kZXJseWluZyB0cmFuc3BvcnQgdXAgdG8gYnVmZmVyIHNpemUuCisgIC8vIE5vdGUgdGhhdCB0aGlzIG1ha2VzIGEgbG90IG9mIHNlbnNlIGlmIGxlbiA8IHJCdWZTaXplXworICAvLyBhbmQgYWxtb3N0IG5vIHNlbnNlIG90aGVyd2lzZS4gIFRPRE8oZHJlaXNzKTogRml4IHRoYXQKKyAgLy8gY2FzZSAocG9zc2libHkgaW5jbHVkaW5nIHNvbWUgcmVhZHYgaG90bmVzcykuCisgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHRyYW5zcG9ydF8tPnJlYWQockJ1Zl8uZ2V0KCksIHJCdWZTaXplXykpOworCisgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgorICB1aW50MzJfdCBnaXZlID0gKHN0ZDo6bWluKShsZW4sIHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKSk7CisgIG1lbWNweShidWYsIHJCYXNlXywgZ2l2ZSk7CisgIHJCYXNlXyArPSBnaXZlOworCisgIHJldHVybiBnaXZlOworfQorCit2b2lkIFRCdWZmZXJlZFRyYW5zcG9ydDo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICB1aW50MzJfdCBzcGFjZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IGFjY29tbW9kYXRlIHRoZSB3cml0ZQorICAvLyB3aXRoIHRoZSBmcmVlIHNwYWNlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KKyAgYXNzZXJ0KHdCb3VuZF8gLSB3QmFzZV8gPCBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikpOworCisgIC8vIE5vdyBoZXJlJ3MgdGhlIHRyaWNreSBxdWVzdGlvbjogc2hvdWxkIHdlIGNvcHkgZGF0YSBmcm9tIGJ1ZiBpbnRvIG91cgorICAvLyBpbnRlcm5hbCBidWZmZXIgYW5kIHdyaXRlIGl0IGZyb20gdGhlcmUsIG9yIHNob3VsZCB3ZSBqdXN0IHdyaXRlIG91dAorICAvLyB0aGUgY3VycmVudCBpbnRlcm5hbCBidWZmZXIgaW4gb25lIHN5c2NhbGwgYW5kIHdyaXRlIG91dCBidWYgaW4gYW5vdGhlci4KKyAgLy8gSWYgb3VyIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIHBsdXMgYnVmIGlzIGF0IGxlYXN0IGRvdWJsZSBvdXIgYnVmZmVyCisgIC8vIHNpemUsIHdlIHdpbGwgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMgbm8gbWF0dGVyIHdoYXQgKGV4Y2VwdCBpbiB0aGUKKyAgLy8gZGVnZW5lcmF0ZSBjYXNlIHdoZW4gb3VyIGJ1ZmZlciBpcyBlbXB0eSksIHNvIHRoZXJlIGlzIG5vIHVzZSBjb3B5aW5nLgorICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIHNvcnQgb2YgYSBzbGlkaW5nIHNjYWxlLiAgSWYgd2UgaGF2ZSBOLTEgYnl0ZXMKKyAgLy8gYnVmZmVyZWQgYW5kIG5lZWQgdG8gd3JpdGUgMiwgaXQgd291bGQgYmUgY3JhenkgdG8gZG8gdHdvIHN5c2NhbGxzLgorICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGF2ZSAyIGJ5dGVzIGJ1ZmZlcmVkIGFuZCBhcmUgd3JpdGluZyAyTi0zLAorICAvLyB3ZSBjYW4gc2F2ZSBhIHN5c2NhbGwgaW4gdGhlIHNob3J0IHRlcm0gYnkgbG9hZGluZyB1cCBvdXIgYnVmZmVyLCB3cml0aW5nCisgIC8vIGl0IG91dCwgYW5kIGNvcHlpbmcgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGludG8gb3VyIGJ1ZmZlci4gIE9mIGNvdXJzZSwKKyAgLy8gaWYgd2UgZ2V0IGFub3RoZXIgMi1ieXRlIHdyaXRlLCB3ZSBoYXZlbid0IHNhdmVkIGFueSBzeXNjYWxscyBhdCBhbGwsCisgIC8vIGFuZCBoYXZlIGp1c3QgY29waWVkIG5lYXJseSAyTiBieXRlcyBmb3Igbm90aGluZy4gIEZpbmRpbmcgYSBwZXJmZWN0CisgIC8vIHBvbGljeSB3b3VsZCByZXF1aXJlIHByZWRpY3RpbmcgdGhlIHNpemUgb2YgZnV0dXJlIHdyaXRlcywgc28gd2UncmUganVzdAorICAvLyBnb2luZyB0byBhbHdheXMgZXNjaGV3IHN5c2NhbGxzIGlmIHdlIGhhdmUgbGVzcyB0aGFuIDJOIGJ5dGVzIHRvIHdyaXRlLgorCisgIC8vIFRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzLgorICAvLyBUaGlzIGNhc2UgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBpcyBlbXB0eSwKKyAgLy8gYnV0IGl0IGlzIGNsZWFyZXIgKEkgdGhpbmspIHRvIHRoaW5rIG9mIGl0IGFzIHR3byBzZXBhcmF0ZSBjYXNlcy4KKyAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIgKiB3QnVmU2l6ZV8pIHx8IChoYXZlX2J5dGVzID09IDApKSB7CisgICAgLy8gVE9ETyhkcmVpc3MpOiB3cml0ZXYKKyAgICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKKyAgICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKKyAgICB9CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEZpbGwgdXAgb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgYSB3cml0ZS4KKyAgbWVtY3B5KHdCYXNlXywgYnVmLCBzcGFjZSk7CisgIGJ1ZiArPSBzcGFjZTsKKyAgbGVuIC09IHNwYWNlOworICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKworICAvLyBDb3B5IHRoZSByZXN0IGludG8gb3VyIGJ1ZmZlci4KKyAgYXNzZXJ0KGxlbiA8IHdCdWZTaXplXyk7CisgIG1lbWNweSh3QnVmXy5nZXQoKSwgYnVmLCBsZW4pOworICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGxlbjsKKyAgcmV0dXJuOworfQorCitjb25zdCB1aW50OF90KiBUQnVmZmVyZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOworICAvLyBTaW1wbHkgcmV0dXJuIE5VTEwuICBXZSBkb24ndCBrbm93IGlmIHRoZXJlIGlzIGFjdHVhbGx5IGRhdGEgYXZhaWxhYmxlIG9uCisgIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgc28gY2FsbGluZyByZWFkKCkgbWlnaHQgYmxvY2suCisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCisgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKKyAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCk7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVfYnl0ZXMpOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICB0cmFuc3BvcnRfLT5mbHVzaCgpOworfQorCit1aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCB3YW50ID0gbGVuOworICB1aW50MzJfdCBoYXZlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pOworCisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSByZWFkCisgIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgorICBhc3NlcnQoaGF2ZSA8IHdhbnQpOworCisgIC8vIElmIHdlIGhhdmUgc29tZSBkYXRhIGluIHRoZSBidWZmZXIsIGNvcHkgaXQgb3V0IGFuZCByZXR1cm4gaXQuCisgIC8vIFdlIGhhdmUgdG8gcmV0dXJuIGl0IHdpdGhvdXQgYXR0ZW1wdGluZyB0byByZWFkIG1vcmUsIHNpbmNlIHdlIGFyZW4ndAorICAvLyBndWFyYW50ZWVkIHRoYXQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGFjdHVhbGx5IGhhcyBtb3JlIGRhdGEsIHNvCisgIC8vIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIGl0IGNvdWxkIGJsb2NrLgorICBpZiAoaGF2ZSA+IDApIHsKKyAgICBtZW1jcHkoYnVmLCByQmFzZV8sIGhhdmUpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDApOworICAgIHJldHVybiBoYXZlOworICB9CisKKyAgLy8gUmVhZCBhbm90aGVyIGZyYW1lLgorICBpZiAoIXJlYWRGcmFtZSgpKSB7CisgICAgLy8gRU9GLiAgTm8gZnJhbWUgYXZhaWxhYmxlLgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVE9ETyhkcmVpc3MpOiBTaG91bGQgd2Ugd2FybiB3aGVuIHJlYWRzIGNyb3NzIGZyYW1lcz8KKworICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KKyAgdWludDMyX3QgZ2l2ZSA9IChzdGQ6Om1pbikod2FudCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pKTsKKyAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBnaXZlKTsKKyAgckJhc2VfICs9IGdpdmU7CisgIHdhbnQgLT0gZ2l2ZTsKKworICByZXR1cm4gKGxlbiAtIHdhbnQpOworfQorCitib29sIFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRGcmFtZSgpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCB1c2luZyByZWFkdiBoZXJlLCBldmVuIHRob3VnaCBpdCB3b3VsZAorICAvLyByZXN1bHQgaW4gKGdhc3ApIHJlYWQtYWhlYWQuCisKKyAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4KKyAgLy8gV2UgY2FuJ3QgdXNlIHJlYWRBbGwoJnN6LCBzaXplb2Yoc3opKSwgc2luY2UgdGhhdCBhbHdheXMgdGhyb3dzIGFuCisgIC8vIGV4Y2VwdGlvbiBvbiBFT0YuICBXZSB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbmx5IGlmIEVPRiBvY2N1cnMgYWZ0ZXIKKyAgLy8gcGFydGlhbCBzaXplIGRhdGEuCisgIGludDMyX3Qgc3ogPSAtMTsKKyAgdWludDMyX3Qgc2l6ZV9ieXRlc19yZWFkID0gMDsKKyAgd2hpbGUgKHNpemVfYnl0ZXNfcmVhZCA8IHNpemVvZihzeikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3opICsgc2l6ZV9ieXRlc19yZWFkOworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQKKyAgICAgICAgPSB0cmFuc3BvcnRfLT5yZWFkKHN6cCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemVvZihzeikpIC0gc2l6ZV9ieXRlc19yZWFkKTsKKyAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZV9ieXRlc19yZWFkID09IDApIHsKKyAgICAgICAgLy8gRU9GIGJlZm9yZSBhbnkgZGF0YSB3YXMgcmVhZC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRU9GIGFmdGVyIGEgcGFydGlhbCBmcmFtZSBoZWFkZXIuICBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgZGF0YSB0byByZWFkIGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydGlhbCBmcmFtZSBoZWFkZXIuIik7CisgICAgICB9CisgICAgfQorICAgIHNpemVfYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkOworICB9CisKKyAgc3ogPSBudG9obChzeik7CisKKyAgaWYgKHN6IDwgMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgaGFzIG5lZ2F0aXZlIHZhbHVlIik7CisgIH0KKworICAvLyBDaGVjayBmb3Igb3ZlcnNpemVkIGZyYW1lCisgIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KG1heEZyYW1lU2l6ZV8pKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJSZWNlaXZlZCBhbiBvdmVyc2l6ZWQgZnJhbWUiKTsKKworICAvLyBSZWFkIHRoZSBmcmFtZSBwYXlsb2FkLCBhbmQgcmVzZXQgbWFya2Vycy4KKyAgaWYgKHN6ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4ockJ1ZlNpemVfKSkgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KKyAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSwgc3opOworICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAvLyBEb3VibGUgYnVmZmVyIHNpemUgdW50aWwgc3VmZmljaWVudC4KKyAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIHVpbnQzMl90IG5ld19zaXplID0gd0J1ZlNpemVfOworICBpZiAobGVuICsgaGF2ZSA8IGhhdmUgLyogb3ZlcmZsb3cgKi8gfHwgbGVuICsgaGF2ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byB3cml0ZSBvdmVyIDIgR0IgdG8gVEZyYW1lZFRyYW5zcG9ydC4iKTsKKyAgfQorICB3aGlsZSAobmV3X3NpemUgPCBsZW4gKyBoYXZlKSB7CisgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOworICB9CisKKyAgLy8gVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtb2RpZnlpbmcgdGhpcyBjbGFzcyB0byB1c2UgbWFsbG9jL2ZyZWUKKyAgLy8gc28gd2UgY2FuIHVzZSByZWFsbG9jIGhlcmUuCisKKyAgLy8gQWxsb2NhdGUgbmV3IGJ1ZmZlci4KKyAgdWludDhfdCogbmV3X2J1ZiA9IG5ldyB1aW50OF90W25ld19zaXplXTsKKworICAvLyBDb3B5IHRoZSBvbGQgYnVmZmVyIHRvIHRoZSBuZXcgb25lLgorICBtZW1jcHkobmV3X2J1Ziwgd0J1Zl8uZ2V0KCksIGhhdmUpOworCisgIC8vIE5vdyBwb2ludCBidWYgdG8gdGhlIG5ldyBvbmUuCisgIHdCdWZfLnJlc2V0KG5ld19idWYpOworICB3QnVmU2l6ZV8gPSBuZXdfc2l6ZTsKKyAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBoYXZlOworICB3Qm91bmRfID0gd0J1Zl8uZ2V0KCkgKyB3QnVmU2l6ZV87CisKKyAgLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBuZXcgYnVmZmVyLgorICBtZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7CisgIHdCYXNlXyArPSBsZW47Cit9CisKK3ZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIGludDMyX3Qgc3pfaGJvLCBzel9uYm87CisgIGFzc2VydCh3QnVmU2l6ZV8gPiBzaXplb2Yoc3pfbmJvKSk7CisKKyAgLy8gU2xpcCB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICBzel9oYm8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gKHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibykpKTsKKyAgc3pfbmJvID0gKGludDMyX3QpaHRvbmwoKHVpbnQzMl90KShzel9oYm8pKTsKKyAgbWVtY3B5KHdCdWZfLmdldCgpLCAodWludDhfdCopJnN6X25ibywgc2l6ZW9mKHN6X25ibykpOworCisgIGlmIChzel9oYm8gPiAwKSB7CisgICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyAod2l0aCBhIHBhZCBmb3IgdGhlIGZyYW1lIHNpemUpCisgICAgLy8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUgdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZQorICAgIC8vIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKSBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MKKyAgICAvLyB1cCBhbiBleGNlcHRpb24KKyAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIHNpemVvZihzel9uYm8pOworCisgICAgLy8gV3JpdGUgc2l6ZSBhbmQgZnJhbWUgYm9keS4KKyAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemVvZihzel9uYm8pKSArIHN6X2hibyk7CisgIH0KKworICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgLy8gcmVjbGFpbSB3cml0ZSBidWZmZXIKKyAgaWYgKHdCdWZTaXplXyA+IGJ1ZlJlY2xhaW1UaHJlc2hfKSB7CisgICAgd0J1ZlNpemVfID0gREVGQVVMVF9CVUZGRVJfU0laRTsKKyAgICB3QnVmXy5yZXNldChuZXcgdWludDhfdFt3QnVmU2l6ZV9dKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKworICAgIC8vIHJlc2V0IHdCYXNlXyB3aXRoIGEgcGFkIGZvciB0aGUgZnJhbWUgc2l6ZQorICAgIGludDMyX3QgcGFkID0gMDsKKyAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIHNpemVvZihwYWQpOworICB9Cit9CisKK3VpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKK30KKworY29uc3QgdWludDhfdCogVEZyYW1lZFRyYW5zcG9ydDo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CisgIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgorICAvLyBJZiB0aGUgZmFzdCBwYXRoIGZhaWxlZCBsZXQgdGhlIHByb3RvY29sIHVzZSBpdHMgc2xvdyBwYXRoLgorICAvLyBCZXNpZGVzLCB3aG8gaXMgZ29pbmcgdG8gdHJ5IHRvIGJvcnJvdyBhY3Jvc3MgbWVzc2FnZXM/CisgIHJldHVybiBOVUxMOworfQorCit1aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkRW5kKCkgeworICAvLyBpbmNsdWRlIGZyYW1pbmcgYnl0ZXMKKyAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJ1Zl8uZ2V0KCkgKyBzaXplb2YodWludDMyX3QpKTsKKworICBpZiAockJ1ZlNpemVfID4gYnVmUmVjbGFpbVRocmVzaF8pIHsKKyAgICByQnVmU2l6ZV8gPSAwOworICAgIHJCdWZfLnJlc2V0KCk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKTsKKyAgfQorCisgIHJldHVybiBieXRlc19yZWFkOworfQorCit2b2lkIFRNZW1vcnlCdWZmZXI6OmNvbXB1dGVSZWFkKHVpbnQzMl90IGxlbiwgdWludDhfdCoqIG91dF9zdGFydCwgdWludDMyX3QqIG91dF9naXZlKSB7CisgIC8vIENvcnJlY3QgckJvdW5kXyBzbyB3ZSBjYW4gdXNlIHRoZSBmYXN0IHBhdGggaW4gdGhlIGZ1dHVyZS4KKyAgckJvdW5kXyA9IHdCYXNlXzsKKworICAvLyBEZWNpZGUgaG93IG11Y2ggdG8gZ2l2ZS4KKyAgdWludDMyX3QgZ2l2ZSA9IChzdGQ6Om1pbikobGVuLCBhdmFpbGFibGVfcmVhZCgpKTsKKworICAqb3V0X3N0YXJ0ID0gckJhc2VfOworICAqb3V0X2dpdmUgPSBnaXZlOworCisgIC8vIFByZWluY3JlbWVudCByQmFzZV8gc28gdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8uCisgIHJCYXNlXyArPSBnaXZlOworfQorCit1aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50OF90KiBzdGFydDsKKyAgdWludDMyX3QgZ2l2ZTsKKyAgY29tcHV0ZVJlYWQobGVuLCAmc3RhcnQsICZnaXZlKTsKKworICAvLyBDb3B5IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKyAgbWVtY3B5KGJ1Ziwgc3RhcnQsIGdpdmUpOworCisgIHJldHVybiBnaXZlOworfQorCit1aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKSB7CisgIC8vIERvbid0IGdldCBzb21lIHN0dXBpZCBhc3NlcnRpb24gZmFpbHVyZS4KKyAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDhfdCogc3RhcnQ7CisgIHVpbnQzMl90IGdpdmU7CisgIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7CisKKyAgLy8gQXBwZW5kIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcuCisgIHN0ci5hcHBlbmQoKGNoYXIqKXN0YXJ0LCBnaXZlKTsKKworICByZXR1cm4gZ2l2ZTsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjplbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pIHsKKyAgLy8gQ2hlY2sgYXZhaWxhYmxlIHNwYWNlCisgIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7CisgIGlmIChsZW4gPD0gYXZhaWwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIW93bmVyXykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkluc3VmZmljaWVudCBzcGFjZSBpbiBleHRlcm5hbCBNZW1vcnlCdWZmZXIiKTsKKyAgfQorCisgIC8vIEdyb3cgdGhlIGJ1ZmZlciBhcyBuZWNlc3NhcnkuCisgIHVpbnQ2NF90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87CisgIHdoaWxlIChsZW4gPiBhdmFpbCkgeworICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKKyAgICBpZiAobmV3X3NpemUgPiBtYXhCdWZmZXJTaXplXykgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGJ1ZmZlciBzaXplIG92ZXJmbG93Iik7CisgICAgfQorICAgIGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCkgKyAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5ld19zaXplKSAtIGJ1ZmZlclNpemVfKTsKKyAgfQorCisgIC8vIEFsbG9jYXRlIGludG8gYSBuZXcgcG9pbnRlciBzbyB3ZSBkb24ndCBib3JrIG91cnMgaWYgaXQgZmFpbHMuCisgIHVpbnQ4X3QqIG5ld19idWZmZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RkOjpyZWFsbG9jKGJ1ZmZlcl8sIG5ld19zaXplKSk7CisgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKKyAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICB9CisKKyAgckJhc2VfID0gbmV3X2J1ZmZlciArIChyQmFzZV8gLSBidWZmZXJfKTsKKyAgckJvdW5kXyA9IG5ld19idWZmZXIgKyAockJvdW5kXyAtIGJ1ZmZlcl8pOworICB3QmFzZV8gPSBuZXdfYnVmZmVyICsgKHdCYXNlXyAtIGJ1ZmZlcl8pOworICB3Qm91bmRfID0gbmV3X2J1ZmZlciArIG5ld19zaXplOworICBidWZmZXJfID0gbmV3X2J1ZmZlcjsKKyAgYnVmZmVyU2l6ZV8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X3NpemUpOworfQorCit2b2lkIFRNZW1vcnlCdWZmZXI6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBlbnN1cmVDYW5Xcml0ZShsZW4pOworCisgIC8vIENvcHkgaW50byB0aGUgYnVmZmVyIGFuZCBpbmNyZW1lbnQgd0Jhc2VfLgorICBtZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7CisgIHdCYXNlXyArPSBsZW47Cit9CisKK3ZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JvdGVCeXRlcyh1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKTsKKyAgaWYgKGxlbiA+IGF2YWlsKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2xpZW50IHdyb3RlIG1vcmUgYnl0ZXMgdGhhbiBzaXplIG9mIGJ1ZmZlci4iKTsKKyAgfQorICB3QmFzZV8gKz0gbGVuOworfQorCitjb25zdCB1aW50OF90KiBUTWVtb3J5QnVmZmVyOjpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgIHJCb3VuZF8gPSB3QmFzZV87CisgIGlmIChhdmFpbGFibGVfcmVhZCgpID49ICpsZW4pIHsKKyAgICAqbGVuID0gYXZhaWxhYmxlX3JlYWQoKTsKKyAgICByZXR1cm4gckJhc2VfOworICB9CisgIHJldHVybiBOVUxMOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyM2Y5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaApAQCAtMCwwICsxLDc0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFREQl9MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMSkpCisjZGVmaW5lIFREQl9VTkxJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAwKSkKKyNlbHNlCisjZGVmaW5lIFREQl9MSUtFTFkodmFsKSAodmFsKQorI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAodmFsKQorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhbnNwb3J0cyB0aGF0IHVzZSByZWFkL3dyaXRlIGJ1ZmZlcnMgZm9yIHBlcmZvcm1hbmNlLgorICoKKyAqIFRCdWZmZXJCYXNlIGlzIGRlc2lnbmVkIHRvIGltcGxlbWVudCB0aGUgZmFzdC1wYXRoICJtZW1jcHkiIHN0eWxlCisgKiBvcGVyYXRpb25zIHRoYXQgd29yayBpbiB0aGUgY29tbW9uIGNhc2UuICBJdCBkb2VzIHNvIHdpdGggc21hbGwgYW5kCisgKiAoZXZlbnR1YWxseSkgbm9udmlydHVhbCwgaW5saW5hYmxlIG1ldGhvZHMuICBUQnVmZmVyQmFzZSBpcyBhbiBhYnN0cmFjdAorICogY2xhc3MuICBTdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBkZWZpbmUgdGhlICJzbG93IHBhdGgiIG9wZXJhdGlvbnMKKyAqIHRoYXQgaGF2ZSB0byBiZSBkb25lIHdoZW4gdGhlIGJ1ZmZlcnMgYXJlIGZ1bGwgb3IgZW1wdHkuCisgKgorICovCitjbGFzcyBUQnVmZmVyQmFzZSA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUQnVmZmVyQmFzZT4geworCitwdWJsaWM6CisgIC8qKgorICAgKiBGYXN0LXBhdGggcmVhZC4KKyAgICoKKyAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBkYXRhIGJ1ZmZlcmVkIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIHdlIGNhbiBzYXRpc2Z5IGl0CisgICAqIHdpdGggYSBzaW5nbGUgbWVtY3B5LCB0aGVuIGFkanVzdCBvdXIgaW50ZXJuYWwgcG9pbnRlcnMuICBJZiB0aGUgYnVmZmVyCisgICAqIGlzIGVtcHR5LCB3ZSBjYWxsIG91dCB0byBvdXIgc2xvdyBwYXRoLCBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kIGlubGluYWJsZS4KKyAgICovCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB1aW50OF90KiBuZXdfckJhc2UgPSByQmFzZV8gKyBsZW47CisgICAgaWYgKFREQl9MSUtFTFkobmV3X3JCYXNlIDw9IHJCb3VuZF8pKSB7CisgICAgICBzdGQ6Om1lbWNweShidWYsIHJCYXNlXywgbGVuKTsKKyAgICAgIHJCYXNlXyA9IG5ld19yQmFzZTsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIHJldHVybiByZWFkU2xvdyhidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXR0ZWQgdmVyc2lvbiBvZiByZWFkQWxsLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHVpbnQ4X3QqIG5ld19yQmFzZSA9IHJCYXNlXyArIGxlbjsKKyAgICBpZiAoVERCX0xJS0VMWShuZXdfckJhc2UgPD0gckJvdW5kXykpIHsKKyAgICAgIHN0ZDo6bWVtY3B5KGJ1ZiwgckJhc2VfLCBsZW4pOworICAgICAgckJhc2VfID0gbmV3X3JCYXNlOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgcmV0dXJuIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRoaXMsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBGYXN0LXBhdGggd3JpdGUuCisgICAqCisgICAqIFdoZW4gd2UgaGF2ZSBlbm91Z2ggZW1wdHkgc3BhY2UgaW4gb3VyIGJ1ZmZlciB0byBhY2NvbW1vZGF0ZSB0aGUgd3JpdGUsIHdlCisgICAqIGNhbiBzYXRpc2Z5IGl0IHdpdGggYSBzaW5nbGUgbWVtY3B5LCB0aGVuIGFkanVzdCBvdXIgaW50ZXJuYWwgcG9pbnRlcnMuCisgICAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYQorICAgKiBzdWJjbGFzcy4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGV2ZW50dWFsbHkgYmUgbm9udmlydHVhbCBhbmQKKyAgICogaW5saW5hYmxlLgorICAgKi8KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHVpbnQ4X3QqIG5ld193QmFzZSA9IHdCYXNlXyArIGxlbjsKKyAgICBpZiAoVERCX0xJS0VMWShuZXdfd0Jhc2UgPD0gd0JvdW5kXykpIHsKKyAgICAgIHN0ZDo6bWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOworICAgICAgd0Jhc2VfID0gbmV3X3dCYXNlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3cml0ZVNsb3coYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIEZhc3QtcGF0aCBib3Jyb3cuICBBIGxvdCBsaWtlIHRoZSBmYXN0LXBhdGggcmVhZC4KKyAgICovCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KCpsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7CisgICAgICAvLyBXaXRoIHN0cmljdCBhbGlhc2luZywgd3JpdGluZyB0byBsZW4gc2hvdWxkbid0IGZvcmNlIHVzIHRvCisgICAgICAvLyByZWZldGNoIHJCYXNlXyBmcm9tIG1lbW9yeS4gIFRPRE8oZHJlaXNzKTogVmVyaWZ5IHRoaXMuCisgICAgICAqbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pOworICAgICAgcmV0dXJuIHJCYXNlXzsKKyAgICB9CisgICAgcmV0dXJuIGJvcnJvd1Nsb3coYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIENvbnN1bWUgZG9lc24ndCByZXF1aXJlIGEgc2xvdyBwYXRoLgorICAgKi8KKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeworICAgIGlmIChUREJfTElLRUxZKHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgeworICAgICAgckJhc2VfICs9IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFNsb3cgcGF0aCByZWFkLgorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisKKyAgLy8vIFNsb3cgcGF0aCB3cml0ZS4KKyAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworCisgIC8qKgorICAgKiBTbG93IHBhdGggYm9ycm93LgorICAgKgorICAgKiBQT1NUQ09ORElUSU9OOiByZXR1cm4gPT0gTlVMTCB8fCByQm91bmRfIC0gckJhc2VfID49ICpsZW4KKyAgICovCisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pID0gMDsKKworICAvKioKKyAgICogVHJpdmlhbCBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogSW5pdGlhbGl6ZSBwb2ludGVycyBzYWZlbHkuICBDb25zdHJ1Y3RpbmcgaXMgbm90IGEgdmVyeQorICAgKiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgb3BlcmF0aW9uLCBzbyBpdCBpcyBva2F5IHRvIGp1c3QgbGVhdmUgaXQgdG8KKyAgICogdGhlIGNvbmNyZXRlIGNsYXNzIHRvIHNldCB1cCBwb2ludGVycyBjb3JyZWN0bHkuCisgICAqLworICBUQnVmZmVyQmFzZSgpIDogckJhc2VfKE5VTEwpLCByQm91bmRfKE5VTEwpLCB3QmFzZV8oTlVMTCksIHdCb3VuZF8oTlVMTCkge30KKworICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgcmVhZCBidWZmZXIuCisgIHZvaWQgc2V0UmVhZEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJCYXNlXyA9IGJ1ZjsKKyAgICByQm91bmRfID0gYnVmICsgbGVuOworICB9CisKKyAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdm9pZCBzZXRXcml0ZUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHdCYXNlXyA9IGJ1ZjsKKyAgICB3Qm91bmRfID0gYnVmICsgbGVuOworICB9CisKKyAgdmlydHVhbCB+VEJ1ZmZlckJhc2UoKSB7fQorCisgIC8vLyBSZWFkcyBiZWdpbiBoZXJlLgorICB1aW50OF90KiByQmFzZV87CisgIC8vLyBSZWFkcyBtYXkgZXh0ZW5kIHRvIGp1c3QgYmVmb3JlIGhlcmUuCisgIHVpbnQ4X3QqIHJCb3VuZF87CisKKyAgLy8vIFdyaXRlcyBiZWdpbiBoZXJlLgorICB1aW50OF90KiB3QmFzZV87CisgIC8vLyBXcml0ZXMgbWF5IGV4dGVuZCB0byBqdXN0IGJlZm9yZSBoZXJlLgorICB1aW50OF90KiB3Qm91bmRfOworfTsKKworLyoqCisgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIEZvciByZWFkcyBpdCB3aWxsIHJlYWQgbW9yZSBkYXRhIHRoYW4gaXMgcmVxdWVzdGVkCisgKiBhbmQgd2lsbCBzZXJ2ZSBmdXR1cmUgZGF0YSBvdXQgb2YgYSBsb2NhbCBidWZmZXIuIEZvciB3cml0ZXMsIGRhdGEgaXMKKyAqIHN0b3JlZCB0byBhbiBpbiBtZW1vcnkgYnVmZmVyIGJlZm9yZSBiZWluZyB3cml0dGVuIG91dC4KKyAqCisgKi8KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUQnVmZmVyZWRUcmFuc3BvcnQsIFRCdWZmZXJCYXNlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgLy8vIFVzZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzLgorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oc3opLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgLy8vIFVzZSBzcGVjaWZpZWQgcmVhZCBhbmQgd3JpdGUgYnVmZmVyIHNpemVzLgorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8ocnN6KSwKKyAgICAgIHdCdWZTaXplXyh3c3opLAorICAgICAgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7CisgICAgaWYgKHJCYXNlXyA9PSByQm91bmRfKSB7CisgICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKKyAgICB9CisgICAgcmV0dXJuIChyQm91bmRfID4gckJhc2VfKTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgZmx1c2goKTsKKyAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCBmbHVzaCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CisKKyAgLyoqCisgICAqIFRoZSBmb2xsb3dpbmcgYmVoYXZpb3IgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGJ5IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICogYnV0IHRoYXQgbWF5IGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgorICAgKiAxLyBJZiBsZW4gaXMgYXQgbW9zdCByQnVmU2l6ZV8sIGJvcnJvdyB3aWxsIG5ldmVyIHJldHVybiBOVUxMLgorICAgKiAgICBEZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBpdCBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICogICAgb3IgaGFuZyBmb3JldmVyLgorICAgKiAyLyBTb21lIGJvcnJvdyByZXF1ZXN0cyBtYXkgY29weSBieXRlcyBpbnRlcm5hbGx5LiAgSG93ZXZlciwKKyAgICogICAgaWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLzIsIG5vbmUgb2YgdGhlIGNvcGllZCBieXRlcworICAgKiAgICB3aWxsIGV2ZXIgaGF2ZSB0byBiZSBjb3BpZWQgYWdhaW4uICBGb3Igb3B0aW1pYWwgcGVyZm9ybWFuY2UsCisgICAqICAgIHN0YXkgdW5kZXIgdGhpcyBsaW1pdC4KKyAgICovCisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCisgIC8qCisgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCisgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCisgICAqLworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsIGxlbik7IH0KKworcHJvdGVjdGVkOgorICB2b2lkIGluaXRQb2ludGVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKyAgICAvLyBXcml0ZSBzaXplIG5ldmVyIGNoYW5nZXMuCisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKworICB1aW50MzJfdCByQnVmU2l6ZV87CisgIHVpbnQzMl90IHdCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOworICB9Cit9OworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzCisgKiBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZQorICogYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIHBheWxvYWQuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlciBvbiB0aGUKKyAqIG90aGVyIGVuZCB0byBhbHdheXMgZG8gZml4ZWQtbGVuZ3RoIHJlYWRzLgorICoKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxURnJhbWVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9NQVhfRlJBTUVfU0laRSA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgIFRGcmFtZWRUcmFuc3BvcnQoKQorICAgIDogdHJhbnNwb3J0XygpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXygwKSwKKyAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHJCdWZfKCksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSwKKyAgICAgIGJ1ZlJlY2xhaW1UaHJlc2hfKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIG1heEZyYW1lU2l6ZV8oREVGQVVMVF9NQVhfRlJBTUVfU0laRSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2ggPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXygwKSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXyhidWZSZWNsYWltVGhyZXNoKSwKKyAgICAgIG1heEZyYW1lU2l6ZV8oREVGQVVMVF9NQVhfRlJBTUVfU0laRSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gKHJCYXNlXyA8IHJCb3VuZF8pIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgZmx1c2goKTsKKyAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKKyAgdWludDMyX3QgcmVhZEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRW5kKCk7CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCisgIC8qCisgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCisgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCisgICAqLworICB1c2luZyBUQnVmZmVyQmFzZTo6cmVhZEFsbDsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZnJhbWUgYXQgcmVhZAorICAgKi8KKyAgdm9pZCBzZXRNYXhGcmFtZVNpemUodWludDMyX3QgbWF4RnJhbWVTaXplKSB7IG1heEZyYW1lU2l6ZV8gPSBtYXhGcmFtZVNpemU7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZyYW1lIGF0IHJlYWQKKyAgICovCisgIHVpbnQzMl90IGdldE1heEZyYW1lU2l6ZSgpIHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICoKKyAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCisgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKKyAgICovCisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKKworICB2b2lkIGluaXRQb2ludGVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworCisgICAgLy8gUGFkIHRoZSBidWZmZXIgc28gd2UgY2FuIGluc2VydCB0aGUgc2l6ZSBsYXRlci4KKyAgICBpbnQzMl90IHBhZCA9IDA7CisgICAgdGhpcy0+d3JpdGUoKHVpbnQ4X3QqKSZwYWQsIHNpemVvZihwYWQpKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworCisgIHVpbnQzMl90IHJCdWZTaXplXzsKKyAgdWludDMyX3Qgd0J1ZlNpemVfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHJCdWZfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHdCdWZfOworICB1aW50MzJfdCBidWZSZWNsYWltVGhyZXNoXzsKKyAgdWludDMyX3QgbWF4RnJhbWVTaXplXzsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCisgKgorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucykpOworICB9Cit9OworCisvKioKKyAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KKyAqIGluIG1lbW9yeSBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseSBwbGFjZWQKKyAqIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQgYnVmZmVyLgorICoKKyAqIFRoZSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgdXNpbmcgQyBjb25zdHJ1Y3RzIG1hbGxvYyxyZWFsbG9jLCBhbmQgdGhlIHNpemUKKyAqIGRvdWJsZXMgYXMgbmVjZXNzYXJ5LiAgV2UndmUgY29uc2lkZXJlZCB1c2luZyBzY29wZWQKKyAqCisgKi8KK2NsYXNzIFRNZW1vcnlCdWZmZXIgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VE1lbW9yeUJ1ZmZlciwgVEJ1ZmZlckJhc2U+IHsKK3ByaXZhdGU6CisgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgIHZvaWQgaW5pdENvbW1vbih1aW50OF90KiBidWYsIHVpbnQzMl90IHNpemUsIGJvb2wgb3duZXIsIHVpbnQzMl90IHdQb3MpIHsKKworICAgIG1heEJ1ZmZlclNpemVfID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCk7CisKKyAgICBpZiAoYnVmID09IE5VTEwgJiYgc2l6ZSAhPSAwKSB7CisgICAgICBhc3NlcnQob3duZXIpOworICAgICAgYnVmID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemUpOworICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisJdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXJfID0gYnVmOworICAgIGJ1ZmZlclNpemVfID0gc2l6ZTsKKworICAgIHJCYXNlXyA9IGJ1ZmZlcl87CisgICAgckJvdW5kXyA9IGJ1ZmZlcl8gKyB3UG9zOworICAgIC8vIFRPRE8oZHJlaXNzKTogSW52ZXN0aWdhdGUgTlVMTC1pbmcgdGhpcyBpZiAhb3duZXIuCisgICAgd0Jhc2VfID0gYnVmZmVyXyArIHdQb3M7CisgICAgd0JvdW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJTaXplXzsKKworICAgIG93bmVyXyA9IG93bmVyOworCisgICAgLy8gckJvdW5kXyBpcyByZWFsbHkgYW4gYXJ0aWZhY3QuICBJbiBwcmluY2lwbGUsIGl0IHNob3VsZCBhbHdheXMgYmUKKyAgICAvLyBlcXVhbCB0byB3QmFzZV8uICBXZSB1cGRhdGUgaXQgaW4gYSBmZXcgcGxhY2VzIChjb21wdXRlUmVhZCwgZXRjLikuCisgIH0KKworcHVibGljOgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgZGVmYXVsdFNpemUgPSAxMDI0OworCisgIC8qKgorICAgKiBUaGlzIGVudW0gc3BlY2lmaWVzIGhvdyBhIFRNZW1vcnlCdWZmZXIgc2hvdWxkIHRyZWF0CisgICAqIG1lbW9yeSBwYXNzZWQgdG8gaXQgdmlhIGNvbnN0cnVjdG9ycyBvciByZXNldEJ1ZmZlci4KKyAgICoKKyAgICogT0JTRVJWRToKKyAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgc2ltcGx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5LgorICAgKiAgIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBwb2ludGVyCisgICAqICAgcmVtYWlucyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBUTWVtb3J5QnVmZmVyLAorICAgKiAgIGFuZCB0aGF0IGl0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAuCisgICAqICAgTm90ZSB0aGF0IG5vIGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gb2JzZXJ2ZWQgYnVmZmVycy4KKyAgICoKKyAgICogQ09QWToKKyAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgbWFrZSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBidWZmZXIuCisgICAqICAgVGhlIGNhbGxlciBoYXMgbm8gcmVzcG9uc2liaWxpdGllcy4KKyAgICoKKyAgICogVEFLRV9PV05FUlNISVA6CisgICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIGJlY29tZSB0aGUgIm93bmVyIiBvZiB0aGUgYnVmZmVyLAorICAgKiAgIGFuZCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgorICAgKiAgIFRoZSBtZW1ib3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4KKyAgICovCisgIGVudW0gTWVtb3J5UG9saWN5IHsgT0JTRVJWRSA9IDEsIENPUFkgPSAyLCBUQUtFX09XTkVSU0hJUCA9IDMgfTsKKworICAvKioKKyAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGEgZGVmYXVsdC1zaXplZCBidWZmZXIsCisgICAqIG93bmVkIGJ5IHRoZSBUTWVtb3J5QnVmZmVyIG9iamVjdC4KKyAgICovCisgIFRNZW1vcnlCdWZmZXIoKSB7IGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOyB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGJ1ZmZlciBvZiBhIHNwZWNpZmllZCBzaXplLAorICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSBzeiAgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICAgKi8KKyAgVE1lbW9yeUJ1ZmZlcih1aW50MzJfdCBzeikgeyBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYnVmIGFzIGl0cyBpbml0aWFsIGNvbnRlbnRzLgorICAgKgorICAgKiBAcGFyYW0gYnVmICAgIFRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAqICAgICAgICAgICAgICAgTm90ZSB0aGF0LCB3aGlsZSBidWYgaXMgYSBub24tY29uc3QgcG9pbnRlciwKKyAgICogICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyIHdpbGwgbm90IHdyaXRlIHRvIGl0IGlmIHBvbGljeSA9PSBPQlNFUlZFLAorICAgKiAgICAgICAgICAgICAgIHNvIGl0IGlzIHNhZmUgdG8gY29uc3RfY2FzdDx1aW50OF90Kj4od2hhdGV2ZXIpLgorICAgKiBAcGFyYW0gc3ogICAgIFRoZSBzaXplIG9mIEBjIGJ1Zi4KKyAgICogQHBhcmFtIHBvbGljeSBTZWUgQGxpbmsgTWVtb3J5UG9saWN5IEBlbmRsaW5rIC4KKyAgICovCisgIFRNZW1vcnlCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKKyAgICBpZiAoYnVmID09IE5VTEwgJiYgc3ogIT0gMCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRNZW1vcnlCdWZmZXIgZ2l2ZW4gbnVsbCBidWZmZXIgd2l0aCBub24temVybyBzaXplLiIpOworICAgIH0KKworICAgIHN3aXRjaCAocG9saWN5KSB7CisgICAgY2FzZSBPQlNFUlZFOgorICAgIGNhc2UgVEFLRV9PV05FUlNISVA6CisgICAgICBpbml0Q29tbW9uKGJ1Ziwgc3osIHBvbGljeSA9PSBUQUtFX09XTkVSU0hJUCwgc3opOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT1BZOgorICAgICAgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7CisgICAgICB0aGlzLT53cml0ZShidWYsIHN6KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBNZW1vcnlQb2xpY3kgZm9yIFRNZW1vcnlCdWZmZXIiKTsKKyAgICB9CisgIH0KKworICB+VE1lbW9yeUJ1ZmZlcigpIHsKKyAgICBpZiAob3duZXJfKSB7CisgICAgICBzdGQ6OmZyZWUoYnVmZmVyXyk7CisgICAgfQorICB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gKHJCYXNlXyA8IHdCYXNlXyk7IH0KKworICB2b2lkIG9wZW4oKSB7fQorCisgIHZvaWQgY2xvc2UoKSB7fQorCisgIC8vIFRPRE8oZHJlaXNzKTogTWFrZSBidWZQdHIgY29uc3QuCisgIHZvaWQgZ2V0QnVmZmVyKHVpbnQ4X3QqKiBidWZQdHIsIHVpbnQzMl90KiBzeikgeworICAgICpidWZQdHIgPSByQmFzZV87CisgICAgKnN6ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRCdWZmZXJBc1N0cmluZygpIHsKKyAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHVpbnQ4X3QqIGJ1ZjsKKyAgICB1aW50MzJfdCBzejsKKyAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUpc3opOworICB9CisKKyAgdm9pZCBhcHBlbmRCdWZmZXJUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90KiBidWY7CisgICAgdWludDMyX3Qgc3o7CisgICAgZ2V0QnVmZmVyKCZidWYsICZzeik7CisgICAgc3RyLmFwcGVuZCgoY2hhciopYnVmLCBzeik7CisgIH0KKworICB2b2lkIHJlc2V0QnVmZmVyKCkgeworICAgIHJCYXNlXyA9IGJ1ZmZlcl87CisgICAgckJvdW5kXyA9IGJ1ZmZlcl87CisgICAgd0Jhc2VfID0gYnVmZmVyXzsKKyAgICAvLyBJdCBpc24ndCBzYWZlIHRvIHdyaXRlIGludG8gYSBidWZmZXIgd2UgZG9uJ3Qgb3duLgorICAgIGlmICghb3duZXJfKSB7CisgICAgICB3Qm91bmRfID0gd0Jhc2VfOworICAgICAgYnVmZmVyU2l6ZV8gPSAwOworICAgIH0KKyAgfQorCisgIC8vLyBTZWUgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KKyAgdm9pZCByZXNldEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgeworICAgIC8vIFVzZSBhIHZhcmlhbnQgb2YgdGhlIGNvcHktYW5kLXN3YXAgdHJpY2sgZm9yIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICAgIC8vIFRoaXMgaXMgc3ViLW9wdGltYWwgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UgZm9yIHR3byByZWFzb25zOgorICAgIC8vICAgMS8gVGhlIGNvbnN0cnVjdGluZyBhbmQgc3dhcHBpbmcgb2YgdGhlIChzbWFsbCkgdmFsdWVzCisgICAgLy8gICAgICBpbiB0aGUgdGVtcG9yYXJ5IG9iamVjdCB0YWtlcyBzb21lIHRpbWUsIGFuZCBpcyBub3QgbmVjZXNzYXJ5LgorICAgIC8vICAgMi8gSWYgcG9saWN5ID09IENPUFksIHdlIGFsbG9jYXRlIHRoZSBuZXcgYnVmZmVyIGJlZm9yZQorICAgIC8vICAgICAgZnJlZWluZyB0aGUgb2xkIG9uZSwgcHJlY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YKKyAgICAvLyAgICAgIHJldXNpbmcgdGhhdCBtZW1vcnkuCisgICAgLy8gSSBkb3VidCB0aGF0IGVpdGhlciBvZiB0aGVzZSBwcm9ibGVtcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXdheSwKKyAgICAvLyBidXQgdGhlIHNlY29uZCBpcyBwcm9iYWJseSBubyBhIGNvbW1vbiBjYXNlLCBhbmQgdGhlIGZpcnN0IGlzIG1pbm9yLgorICAgIC8vIEkgZG9uJ3QgZXhwZWN0IHJlc2V0QnVmZmVyIHRvIGJlIGEgY29tbW9uIG9wZXJhdGlvbiwgc28gSSdtIHdpbGxpbmcgdG8KKyAgICAvLyBiaXRlIHRoZSBwZXJmb3JtYW5jZSBidWxsZXQgdG8gbWFrZSB0aGUgbWV0aG9kIHRoaXMgc2ltcGxlLgorCisgICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgorICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihidWYsIHN6LCBwb2xpY3kpOworICAgIC8vIE1vdmUgaXQgaW50byBvdXJzZWxmLgorICAgIHRoaXMtPnN3YXAobmV3X2J1ZmZlcik7CisgICAgLy8gT3VyIG9sZCBzZWxmIGdldHMgZGVzdHJveWVkLgorICB9CisKKyAgLy8vIFNlZSBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgorICB2b2lkIHJlc2V0QnVmZmVyKHVpbnQzMl90IHN6KSB7CisgICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgorICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihzeik7CisgICAgLy8gTW92ZSBpdCBpbnRvIG91cnNlbGYuCisgICAgdGhpcy0+c3dhcChuZXdfYnVmZmVyKTsKKyAgICAvLyBPdXIgb2xkIHNlbGYgZ2V0cyBkZXN0cm95ZWQuCisgIH0KKworICBzdGQ6OnN0cmluZyByZWFkQXNTdHJpbmcodWludDMyX3QgbGVuKSB7CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICh2b2lkKXJlYWRBcHBlbmRUb1N0cmluZyhzdHIsIGxlbik7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRBcHBlbmRUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCB1aW50MzJfdCBsZW4pOworCisgIC8vIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICB1aW50MzJfdCByZWFkRW5kKCkgeworICAgIC8vIFRoaXMgY2FzdCBzaG91bGQgYmUgc2FmZSwgYmVjYXVzZSBidWZmZXJfJ3Mgc2l6ZSBpcyBhIHVpbnQzMl90CisgICAgdWludDMyX3QgYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJhc2VfIC0gYnVmZmVyXyk7CisgICAgaWYgKHJCYXNlXyA9PSB3QmFzZV8pIHsKKyAgICAgIHJlc2V0QnVmZmVyKCk7CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICB1aW50MzJfdCB3cml0ZUVuZCgpIHsKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gYnVmZmVyXyk7CisgIH0KKworICB1aW50MzJfdCBhdmFpbGFibGVfcmVhZCgpIGNvbnN0IHsKKyAgICAvLyBSZW1lbWJlciwgd0Jhc2VfIGlzIHRoZSByZWFsIHJCb3VuZF8uCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSByQmFzZV8pOworICB9CisKKyAgdWludDMyX3QgYXZhaWxhYmxlX3dyaXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCb3VuZF8gLSB3QmFzZV8pOyB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNsaWVudCBjYW4gd3JpdGUgZGF0YSB0byBhcHBlbmQgdG8KKyAgLy8gdGhlIFRNZW1vcnlCdWZmZXIsIGFuZCBlbnN1cmVzIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBhCisgIC8vIHdyaXRlIG9mIHRoZSBwcm92aWRlZCBsZW5ndGguICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyB2ZXJ5IGNvbnZlbmllbnQgZm9yCisgIC8vIHBhc3NpbmcgdG8gcmVhZCgpLCByZWN2KCksIG9yIHNpbWlsYXIuIFlvdSBtdXN0IGNhbGwgd3JvdGVCeXRlcygpIGFzIHNvb24KKyAgLy8gYXMgZGF0YSBpcyB3cml0dGVuIG9yIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgYXdhcmUgdGhhdCBkYXRhIGhhcyBjaGFuZ2VkLgorICB1aW50OF90KiBnZXRXcml0ZVB0cih1aW50MzJfdCBsZW4pIHsKKyAgICBlbnN1cmVDYW5Xcml0ZShsZW4pOworICAgIHJldHVybiB3QmFzZV87CisgIH0KKworICAvLyBJbmZvcm1zIHRoZSBidWZmZXIgdGhhdCB0aGUgY2xpZW50IGhhcyB3cml0dGVuICdsZW4nIGJ5dGVzIGludG8gc3RvcmFnZQorICAvLyB0aGF0IGhhZCBiZWVuIHByb3ZpZGVkIGJ5IGdldFdyaXRlUHRyKCkuCisgIHZvaWQgd3JvdGVCeXRlcyh1aW50MzJfdCBsZW4pOworCisgIC8qCisgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCisgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCisgICAqLworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsIGxlbik7IH0KKworICAvLyEgXGJyaWVmIEdldCB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICAvLyEgXHJldHVybnMgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIEdldCB0aGUgY3VycmVudCBtYXhpbXVtIGJ1ZmZlciBzaXplCisgIC8vISBccmV0dXJucyB0aGUgY3VycmVudCBtYXhpbXVtIGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldE1heEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1heEJ1ZmZlclNpemVfOworICB9CisKKyAgLy8hIFxicmllZiBDaGFuZ2UgdGhlIG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxwYXJhbVtpbl0gIG1heFNpemUgIHRoZSBuZXcgbWF4aW11bSBidWZmZXIgc2l6ZSBhbGxvd2VkIHRvIGdyb3cgdG8KKyAgLy8hIFx0aHJvd3MgIFRUcmFuc3BvcnRFeGNlcHRpb24oQkFEX0FSR1MpIGlmIG1heFNpemUgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHZvaWQgc2V0TWF4QnVmZmVyU2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgaWYgKG1heFNpemUgPCBidWZmZXJTaXplXykgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heGltdW0gYnVmZmVyIHNpemUgd291bGQgYmUgbGVzcyB0aGFuIGN1cnJlbnQgYnVmZmVyIHNpemUiKTsKKyAgICB9CisgICAgbWF4QnVmZmVyU2l6ZV8gPSBtYXhTaXplOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzd2FwKFRNZW1vcnlCdWZmZXImIHRoYXQpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dhcChidWZmZXJfLCB0aGF0LmJ1ZmZlcl8pOworICAgIHN3YXAoYnVmZmVyU2l6ZV8sIHRoYXQuYnVmZmVyU2l6ZV8pOworCisgICAgc3dhcChyQmFzZV8sIHRoYXQuckJhc2VfKTsKKyAgICBzd2FwKHJCb3VuZF8sIHRoYXQuckJvdW5kXyk7CisgICAgc3dhcCh3QmFzZV8sIHRoYXQud0Jhc2VfKTsKKyAgICBzd2FwKHdCb3VuZF8sIHRoYXQud0JvdW5kXyk7CisKKyAgICBzd2FwKG93bmVyXywgdGhhdC5vd25lcl8pOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoZXJlJ3MgYXQgbGVhc3QgJ2xlbicgYnl0ZXMgYXZhaWxhYmxlIGZvciB3cml0aW5nLgorICB2b2lkIGVuc3VyZUNhbldyaXRlKHVpbnQzMl90IGxlbik7CisKKyAgLy8gQ29tcHV0ZSB0aGUgcG9zaXRpb24gYW5kIGF2YWlsYWJsZSBkYXRhIGZvciByZWFkaW5nLgorICB2b2lkIGNvbXB1dGVSZWFkKHVpbnQzMl90IGxlbiwgdWludDhfdCoqIG91dF9zdGFydCwgdWludDMyX3QqIG91dF9naXZlKTsKKworICB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICAvLyBEYXRhIGJ1ZmZlcgorICB1aW50OF90KiBidWZmZXJfOworCisgIC8vIEFsbG9jYXRlZCBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBidWZmZXJTaXplXzsKKworICAvLyBNYXhpbXVtIGFsbG93ZWQgc2l6ZQorICB1aW50MzJfdCBtYXhCdWZmZXJTaXplXzsKKworICAvLyBJcyB0aGlzIG9iamVjdCB0aGUgb3duZXIgb2YgdGhlIGJ1ZmZlcj8KKyAgYm9vbCBvd25lcl87CisKKyAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBjb25zdHJjdG9ycywgaW5pdENvbW1vbiwgYW5kIHN3YXAgaWYKKyAgLy8geW91IGFkZCBuZXcgbWVtYmVycy4KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RkMTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit2b2lkIFRGRFRyYW5zcG9ydDo6Y2xvc2UoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgcnYgPSA6OlRIUklGVF9DTE9TRShmZF8pOworICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgZmRfID0gLTE7CisgIC8vIEhhdmUgdG8gY2hlY2sgdW5jYXVnaHRfZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIGRlc3RydWN0b3IuCisgIGlmIChydiA8IDAgJiYgIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OmNsb3NlKCkiLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit1aW50MzJfdCBURkRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdW5zaWduZWQgaW50IG1heFJldHJpZXMgPSA1OyAvLyBzYW1lIGFzIHRoZSBUU29ja2V0IGRlZmF1bHQKKyAgdW5zaWduZWQgaW50IHJldHJpZXMgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIFRIUklGVF9TU0laRVQgcnYgPSA6OlRIUklGVF9SRUFEKGZkXywgYnVmLCBsZW4pOworICAgIGlmIChydiA8IDApIHsKKyAgICAgIGlmIChUSFJJRlRfRVJSTk8gPT0gVEhSSUZUX0VJTlRSICYmIHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7CisgICAgICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KKyAgICAgICAgKytyZXRyaWVzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLCBlcnJub19jb3B5KTsKKyAgICB9CisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgc2luY2Ugd2UgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsCisgICAgLy8gYW5kIDo6cmVhZCBzaG91bGQgb25seSByZXR1cm4gYSAzMi1iaXQgdmFsdWUgc2luY2UgbGVuIGlzIDMyLWJpdC4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJ2KTsKKyAgfQorfQorCit2b2lkIFRGRFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICBUSFJJRlRfU1NJWkVUIHJ2ID0gOjpUSFJJRlRfV1JJVEUoZmRfLCBidWYsIGxlbik7CisKKyAgICBpZiAocnYgPCAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIsIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSBpZiAocnYgPT0gMCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIpOworICAgIH0KKworICAgIGJ1ZiArPSBydjsKKyAgICAvLyB0aGlzIHNob3VsZCBiZSBmaW5lLCBhcyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywgYW5kCisgICAgLy86OndyaXRlIHNob3VsZG4ndCByZXR1cm4gbW9yZSB0aGFuIGEgdWludDMyX3Qgc2luY2UgbGVuIGlzIGEgdWludDMyX3QKKyAgICBsZW4gLT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJ2KTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTkzZDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICovCitjbGFzcyBURkRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZEVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIGVudW0gQ2xvc2VQb2xpY3kgeyBOT19DTE9TRV9PTl9ERVNUUk9ZID0gMCwgQ0xPU0VfT05fREVTVFJPWSA9IDEgfTsKKworICBURkRUcmFuc3BvcnQoaW50IGZkLCBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3kgPSBOT19DTE9TRV9PTl9ERVNUUk9ZKQorICAgIDogZmRfKGZkKSwgY2xvc2VfcG9saWN5XyhjbG9zZV9wb2xpY3kpIHt9CisKKyAgflRGRFRyYW5zcG9ydCgpIHsKKyAgICBpZiAoY2xvc2VfcG9saWN5XyA9PSBDTE9TRV9PTl9ERVNUUk9ZKSB7CisgICAgICB0cnkgeworICAgICAgICBjbG9zZSgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiflRGRFRyYW5zcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uOiAnJXMnIiwgZXgud2hhdCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIGZkXyA+PSAwOyB9CisKKyAgdm9pZCBvcGVuKCkge30KKworICB2b2lkIGNsb3NlKCk7CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCBzZXRGRChpbnQgZmQpIHsgZmRfID0gZmQ7IH0KKyAgaW50IGdldEZEKCkgeyByZXR1cm4gZmRfOyB9CisKK3Byb3RlY3RlZDoKKyAgaW50IGZkXzsKKyAgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjQ0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDEwODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CisKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZWxzZQorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworVEZpbGVUcmFuc3BvcnQ6OlRGaWxlVHJhbnNwb3J0KHN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5KQorICA6IHJlYWRTdGF0ZV8oKSwKKyAgICByZWFkQnVmZl8oTlVMTCksCisgICAgY3VycmVudEV2ZW50XyhOVUxMKSwKKyAgICByZWFkQnVmZlNpemVfKERFRkFVTFRfUkVBRF9CVUZGX1NJWkUpLAorICAgIHJlYWRUaW1lb3V0XyhOT19UQUlMX1JFQURfVElNRU9VVCksCisgICAgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpLAorICAgIGV2ZW50QnVmZmVyU2l6ZV8oREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSksCisgICAgZmx1c2hNYXhVc18oREVGQVVMVF9GTFVTSF9NQVhfVVMpLAorICAgIGZsdXNoTWF4Qnl0ZXNfKERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTKSwKKyAgICBtYXhFdmVudFNpemVfKERFRkFVTFRfTUFYX0VWRU5UX1NJWkUpLAorICAgIG1heENvcnJ1cHRlZEV2ZW50c18oREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyksCisgICAgZW9mU2xlZXBUaW1lXyhERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTKSwKKyAgICBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8oREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUyksCisgICAgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8oREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMpLAorICAgIGRlcXVldWVCdWZmZXJfKE5VTEwpLAorICAgIGVucXVldWVCdWZmZXJfKE5VTEwpLAorICAgIG5vdEZ1bGxfKCZtdXRleF8pLAorICAgIG5vdEVtcHR5XygmbXV0ZXhfKSwKKyAgICBjbG9zaW5nXyhmYWxzZSksCisgICAgZmx1c2hlZF8oJm11dGV4XyksCisgICAgZm9yY2VGbHVzaF8oZmFsc2UpLAorICAgIGZpbGVuYW1lXyhwYXRoKSwKKyAgICBmZF8oMCksCisgICAgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKGZhbHNlKSwKKyAgICBvZmZzZXRfKDApLAorICAgIGxhc3RCYWRDaHVua18oMCksCisgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18oMCksCisgICAgcmVhZE9ubHlfKHJlYWRPbmx5KSB7CisgIHRocmVhZEZhY3RvcnlfLnNldERldGFjaGVkKGZhbHNlKTsKKyAgb3BlbkxvZ0ZpbGUoKTsKK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6cmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RyaW5nIGZpbGVuYW1lLCBvZmZfdCBvZmZzZXQpIHsKKyAgZmlsZW5hbWVfID0gZmlsZW5hbWU7CisgIG9mZnNldF8gPSBvZmZzZXQ7CisKKyAgLy8gY2hlY2sgaWYgY3VycmVudCBmaWxlIGlzIHN0aWxsIG9wZW4KKyAgaWYgKGZkXyA+IDApIHsKKyAgICAvLyBmbHVzaCBhbnkgZXZlbnRzIGluIHRoZSBxdWV1ZQorICAgIGZsdXNoKCk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZXJyb3IsIGN1cnJlbnQgZmlsZSAoJXMpIG5vdCBjbG9zZWQiLCBmaWxlbmFtZV8uY19zdHIoKSk7CisgICAgaWYgKC0xID09IDo6VEhSSUZUX0NMT1NFKGZkXykpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHJlc2V0T3V0cHV0RmlsZSgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiBlcnJvciBpbiBmaWxlIGNsb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHN1Y2Nlc3NmdWxseSBjbG9zZWQgZmQKKyAgICAgIGZkXyA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKGZkKSB7CisgICAgZmRfID0gZmQ7CisgIH0gZWxzZSB7CisgICAgLy8gb3BlbiBmaWxlIGlmIHRoZSBpbnB1dCBmZCBpcyAwCisgICAgb3BlbkxvZ0ZpbGUoKTsKKyAgfQorfQorCitURmlsZVRyYW5zcG9ydDo6flRGaWxlVHJhbnNwb3J0KCkgeworICAvLyBmbHVzaCB0aGUgYnVmZmVyIGlmIGEgd3JpdGVyIHRocmVhZCBpcyBhY3RpdmUKKyAgaWYgKHdyaXRlclRocmVhZF8uZ2V0KCkpIHsKKyAgICAvLyBzZXQgc3RhdGUgdG8gY2xvc2luZworICAgIGNsb3NpbmdfID0gdHJ1ZTsKKworICAgIC8vIHdha2UgdXAgdGhlIHdyaXRlciB0aHJlYWQKKyAgICAvLyBTaW5jZSBjbG9zaW5nXyBpcyB0cnVlLCBpdCB3aWxsIGF0dGVtcHQgdG8gZmx1c2ggYWxsIGRhdGEsIHRoZW4gZXhpdC4KKyAgICBub3RFbXB0eV8ubm90aWZ5KCk7CisKKyAgICB3cml0ZXJUaHJlYWRfLT5qb2luKCk7CisgICAgd3JpdGVyVGhyZWFkXy5yZXNldCgpOworICB9CisKKyAgaWYgKGRlcXVldWVCdWZmZXJfKSB7CisgICAgZGVsZXRlIGRlcXVldWVCdWZmZXJfOworICAgIGRlcXVldWVCdWZmZXJfID0gTlVMTDsKKyAgfQorCisgIGlmIChlbnF1ZXVlQnVmZmVyXykgeworICAgIGRlbGV0ZSBlbnF1ZXVlQnVmZmVyXzsKKyAgICBlbnF1ZXVlQnVmZmVyXyA9IE5VTEw7CisgIH0KKworICBpZiAocmVhZEJ1ZmZfKSB7CisgICAgZGVsZXRlW10gcmVhZEJ1ZmZfOworICAgIHJlYWRCdWZmXyA9IE5VTEw7CisgIH0KKworICBpZiAoY3VycmVudEV2ZW50XykgeworICAgIGRlbGV0ZSBjdXJyZW50RXZlbnRfOworICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOworICB9CisKKyAgLy8gY2xvc2UgbG9nZmlsZQorICBpZiAoZmRfID4gMCkgeworICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogflRGaWxlVHJhbnNwb3J0KCkgOjpjbG9zZSgpICIsIFRIUklGVF9FUlJOTyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHN1Y2Nlc3NmdWxseSBjbG9zZWQgZmQKKyAgICAgIGZkXyA9IDA7CisgICAgfQorICB9Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OmluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpIHsKKyAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgeworICAgIFRfRVJST1IoIiVzIiwgIlRyeWluZyB0byBkb3VibGUtaW5pdCBURmlsZVRyYW5zcG9ydCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghd3JpdGVyVGhyZWFkXy5nZXQoKSkgeworICAgIHdyaXRlclRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Xy5uZXdUaHJlYWQoCisgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6RnVuY3Rpb25SdW5uZXI6OmNyZWF0ZShzdGFydFdyaXRlclRocmVhZCwgdGhpcykpOworICAgIHdyaXRlclRocmVhZF8tPnN0YXJ0KCk7CisgIH0KKworICBkZXF1ZXVlQnVmZmVyXyA9IG5ldyBURmlsZVRyYW5zcG9ydEJ1ZmZlcihldmVudEJ1ZmZlclNpemVfKTsKKyAgZW5xdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7CisgIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChyZWFkT25seV8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogYXR0ZW1wdGluZyB0byB3cml0ZSB0byBmaWxlIG9wZW5lZCByZWFkb25seSIpOworICB9CisKKyAgZW5xdWV1ZUV2ZW50KGJ1ZiwgbGVuKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RydWN0IHVuaXF1ZURlbGV0ZXIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKF9UICpwdHIpIGNvbnN0IHsgZGVsZXRlIHB0cjsgfQorfTsKKwordm9pZCBURmlsZVRyYW5zcG9ydDo6ZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pIHsKKyAgLy8gY2FuJ3QgZW5xdWV1ZSBtb3JlIGV2ZW50cyBpZiBmaWxlIGlzIGdvaW5nIHRvIGNsb3NlCisgIGlmIChjbG9zaW5nXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW50IHNpemUgaXMgdmFsaWQKKyAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKGV2ZW50TGVuID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIGV2ZW50TGVuLCBtYXhFdmVudFNpemVfKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZXZlbnRMZW4gPT0gMCkgeworICAgIFRfRVJST1IoIiVzIiwgImNhbm5vdCBlbnF1ZXVlIGFuIGVtcHR5IGV2ZW50Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPGV2ZW50SW5mbywgdW5pcXVlRGVsZXRlcjxldmVudEluZm8+ID4gdG9FbnF1ZXVlKG5ldyBldmVudEluZm8oKSk7CisgIHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyA9IG5ldyB1aW50OF90WyhzaXplb2YodWludDhfdCkgKiBldmVudExlbikgKyA0XTsKKworICAvLyBmaXJzdCA0IGJ5dGVzIGlzIHRoZSBldmVudCBsZW5ndGgKKyAgbWVtY3B5KHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXywgKHZvaWQqKSgmZXZlbnRMZW4pLCA0KTsKKyAgLy8gYWN0dWFsIGV2ZW50IGNvbnRlbnRzCisgIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8gKyA0LCBidWYsIGV2ZW50TGVuKTsKKyAgdG9FbnF1ZXVlLT5ldmVudFNpemVfID0gZXZlbnRMZW4gKyA0OworCisgIC8vIGxvY2sgbXV0ZXgKKyAgR3VhcmQgZyhtdXRleF8pOworCisgIC8vIG1ha2Ugc3VyZSB0aGF0IGVucXVldWUgYnVmZmVyIGlzIGluaXRpYWxpemVkIGFuZCB3cml0ZXIgdGhyZWFkIGlzIHJ1bm5pbmcKKyAgaWYgKCFidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKKyAgICBpZiAoIWluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gQ2FuJ3QgZW5xdWV1ZSB3aGlsZSBidWZmZXIgaXMgZnVsbAorICB3aGlsZSAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRnVsbCgpKSB7CisgICAgbm90RnVsbF8ud2FpdCgpOworICB9CisKKyAgLy8gV2Ugc2hvdWxkbid0IGJlIHRyeWluZyB0byBlbnF1ZXVlIG5ldyBkYXRhIHdoaWxlIGEgZm9yY2VkIGZsdXNoIGlzCisgIC8vIHJlcXVlc3RlZC4gIChPdGhlcndpc2UgdGhlIHdyaXRlciB0aHJlYWQgbWlnaHQgbm90IGV2ZXIgYmUgYWJsZSB0byBmaW5pc2gKKyAgLy8gdGhlIGZsdXNoIGlmIG1vcmUgZGF0YSBrZWVwcyBiZWluZyBlbnF1ZXVlZC4pCisgIGFzc2VydCghZm9yY2VGbHVzaF8pOworCisgIC8vIGFkZCB0byB0aGUgYnVmZmVyCisgIGV2ZW50SW5mbyogcEV2ZW50ID0gdG9FbnF1ZXVlLnJlbGVhc2UoKTsKKyAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQocEV2ZW50KSkgeworICAgIGRlbGV0ZSBwRXZlbnQ7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gc2lnbmFsIGFueWJvZHkgd2hvJ3Mgd2FpdGluZyBmb3IgdGhlIGJ1ZmZlciB0byBiZSBub24tZW1wdHkKKyAgbm90RW1wdHlfLm5vdGlmeSgpOworCisgIC8vIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIGxvb3Agd2hlcmUgaXQgbWFrZXMgc3VyZSBpdCBnb3QgZmx1c2hlZAorICAvLyBiZWNhdXNlIGNvbmRpdGlvbiB2YXJpYWJsZXMgY2FuIGdldCB0cmlnZ2VyZWQgYnkgdGhlIG9zIGZvciBubyByZWFzb24KKyAgLy8gaXQgaXMgcHJvYmFibHkgYSBub24tZmFjdG9yIGZvciB0aGUgdGltZSBiZWluZworfQorCitib29sIFRGaWxlVHJhbnNwb3J0Ojpzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1ldmFsKiBkZWFkbGluZSkgeworICBib29sIHN3YXA7CisgIEd1YXJkIGcobXV0ZXhfKTsKKworICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKKyAgICBzd2FwID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChjbG9zaW5nXykgeworICAgIC8vIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGRhdGEgdG8gd3JpdGUsCisgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgY2xvc2luZworICAgIHN3YXAgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVhZGxpbmUgIT0gTlVMTCkgeworICAgICAgLy8gaWYgd2Ugd2VyZSBoYW5kZWQgYSBkZWFkbGluZSB0aW1lIHN0cnVjdCwgZG8gYSB0aW1lZCB3YWl0CisgICAgICBub3RFbXB0eV8ud2FpdEZvclRpbWUoZGVhZGxpbmUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBqdXN0IHdhaXQgdW50aWwgdGhlIGJ1ZmZlciBnZXRzIGFuIGl0ZW0KKyAgICAgIG5vdEVtcHR5Xy53YWl0KCk7CisgICAgfQorCisgICAgLy8gY291bGQgYmUgZW1wdHkgaWYgd2UgdGltZWQgb3V0CisgICAgc3dhcCA9IGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCk7CisgIH0KKworICBpZiAoc3dhcCkgeworICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiB0ZW1wID0gZW5xdWV1ZUJ1ZmZlcl87CisgICAgZW5xdWV1ZUJ1ZmZlcl8gPSBkZXF1ZXVlQnVmZmVyXzsKKyAgICBkZXF1ZXVlQnVmZmVyXyA9IHRlbXA7CisgIH0KKworICBpZiAoc3dhcCkgeworICAgIG5vdEZ1bGxfLm5vdGlmeSgpOworICB9CisKKyAgcmV0dXJuIHN3YXA7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OndyaXRlclRocmVhZCgpIHsKKyAgYm9vbCBoYXNJT0Vycm9yID0gZmFsc2U7CisKKyAgLy8gb3BlbiBmaWxlIGlmIGl0IGlzIG5vdCBvcGVuCisgIGlmICghZmRfKSB7CisgICAgdHJ5IHsKKyAgICAgIG9wZW5Mb2dGaWxlKCk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBvcGVuTG9nRmlsZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgZmRfID0gMDsKKyAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIHNldCB0aGUgb2Zmc2V0IHRvIHRoZSBjb3JyZWN0IHZhbHVlIChFT0YpCisgIGlmICghaGFzSU9FcnJvcikgeworICAgIHRyeSB7CisgICAgICBzZWVrVG9FbmQoKTsKKyAgICAgIC8vIHRocm93IGF3YXkgYW55IHBhcnRpYWwgZXZlbnRzCisgICAgICBvZmZzZXRfICs9IHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXzsKKyAgICAgIGlmICgwID09IFRIUklGVF9GVFJVTkNBVEUoZmRfLCBvZmZzZXRfKSkgeworICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIHRydW5jYXRlICIsIGVycm5vX2NvcHkpOworICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGluaXRpYWxpemF0aW9uICIsIGVycm5vX2NvcHkpOworICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gRmlndXJlIG91dCB0aGUgbmV4dCB0aW1lIGJ5IHdoaWNoIGEgZmx1c2ggbXVzdCB0YWtlIHBsYWNlCisgIHN0cnVjdCB0aW1ldmFsIHRzX25leHRfZmx1c2g7CisgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworICB1aW50MzJfdCB1bmZsdXNoZWQgPSAwOworCisgIHdoaWxlICgxKSB7CisgICAgLy8gdGhpcyB3aWxsIG9ubHkgYmUgdHJ1ZSB3aGVuIHRoZSBkZXN0cnVjdG9yIGlzIGJlaW5nIGludm9rZWQKKyAgICBpZiAoY2xvc2luZ18pIHsKKyAgICAgIGlmIChoYXNJT0Vycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gVHJ5IHRvIGVtcHR5IGJ1ZmZlcnMgYmVmb3JlIGV4aXQKKyAgICAgIGlmIChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpICYmIGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgOjpUSFJJRlRfRlNZTkMoZmRfKTsKKyAgICAgICAgaWYgKC0xID09IDo6VEhSSUZUX0NMT1NFKGZkXykpIHsKKyAgICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGZkIHN1Y2Nlc3NmdWxseSBjbG9zZWQKKyAgICAgICAgICBmZF8gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3dhcEV2ZW50QnVmZmVycygmdHNfbmV4dF9mbHVzaCkpIHsKKyAgICAgIGV2ZW50SW5mbyogb3V0RXZlbnQ7CisgICAgICB3aGlsZSAoTlVMTCAhPSAob3V0RXZlbnQgPSBkZXF1ZXVlQnVmZmVyXy0+Z2V0TmV4dCgpKSkgeworICAgICAgICAvLyBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzay4gSWYgdGhlcmUgaXMgYW55IElPIGVycm9yLCBmb3IKKyAgICAgICAgLy8gaW5zdGFuY2UsCisgICAgICAgIC8vIHRoZSBvdXRwdXQgZmlsZSBpcyB1bm1vdW50ZWQgb3IgZGVsZXRlZCwgdGhlbiB0aGlzIGV2ZW50IGlzIGRyb3BwZWQuIEhvd2V2ZXIsIHRoZSB3cml0ZXIKKyAgICAgICAgLy8gdGhyZWFkCisgICAgICAgIC8vIHdpbGw6ICgxKSBzbGVlcCBmb3IgYSBzaG9ydCB3aGlsZTsgKDIpIHRyeSB0byByZW9wZW4gdGhlIGZpbGU7ICgzKSBpZiBzdWNjZXNzZnVsIHRoZW4KKyAgICAgICAgLy8gc3RhcnQgd3JpdGluZworICAgICAgICAvLyBmcm9tIHRoZSBlbmQuCisKKyAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKKyAgICAgICAgICBUX0VSUk9SKAorICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICV1IG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOworICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKKyAgICAgICAgICBpZiAoY2xvc2luZ18pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFmZF8pIHsKKyAgICAgICAgICAgIDo6VEhSSUZUX0NMT1NFKGZkXyk7CisgICAgICAgICAgICBmZF8gPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgb3BlbkxvZ0ZpbGUoKTsKKyAgICAgICAgICAgIHNlZWtUb0VuZCgpOworICAgICAgICAgICAgdW5mbHVzaGVkID0gMDsKKyAgICAgICAgICAgIGhhc0lPRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIFRfTE9HX09QRVIoCisgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSAlcyByZW9wZW5lZCBieSB3cml0ZXIgdGhyZWFkIGR1cmluZyBlcnJvciByZWNvdmVyeSIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgICAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IHVuYWJsZSB0byByZW9wZW4gbG9nIGZpbGUgJXMgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbml0eSBjaGVjayBvbiBldmVudAorICAgICAgICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgeworICAgICAgICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwKKyAgICAgICAgICAgICAgICAgIG91dEV2ZW50LT5ldmVudFNpemVfLAorICAgICAgICAgICAgICAgICAgbWF4RXZlbnRTaXplXyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBjaHVua2luZyBpcyByZXF1aXJlZCwgdGhlbiBtYWtlIHN1cmUgdGhhdCBtc2cgZG9lcyBub3QgY3Jvc3MgY2h1bmsgYm91bmRhcnkKKyAgICAgICAgaWYgKChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IDApICYmIChjaHVua1NpemVfICE9IDApKSB7CisgICAgICAgICAgLy8gZXZlbnQgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBjaHVuayBzaXplCisgICAgICAgICAgaWYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgeworICAgICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IGV2ZW50IHNpemUoJXUpID4gY2h1bmsgc2l6ZSgldSk6IHNraXBwaW5nIGV2ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgb3V0RXZlbnQtPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZV8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW50NjRfdCBjaHVuazEgPSBvZmZzZXRfIC8gY2h1bmtTaXplXzsKKyAgICAgICAgICBpbnQ2NF90IGNodW5rMiA9IChvZmZzZXRfICsgb3V0RXZlbnQtPmV2ZW50U2l6ZV8gLSAxKSAvIGNodW5rU2l6ZV87CisKKyAgICAgICAgICAvLyBpZiBhZGRpbmcgdGhpcyBldmVudCB3aWxsIGNyb3NzIGEgY2h1bmsgYm91bmRhcnksIHBhZCB0aGUgY2h1bmsgd2l0aCB6ZXJvcworICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7CisgICAgICAgICAgICAvLyByZWZldGNoIHRoZSBvZmZzZXQgdG8ga2VlcCBpbiBzeW5jCisgICAgICAgICAgICBvZmZzZXRfID0gVEhSSUZUX0xTRUVLKGZkXywgMCwgU0VFS19DVVIpOworICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gKGludDMyX3QpKChvZmZzZXRfIC8gY2h1bmtTaXplXyArIDEpICogY2h1bmtTaXplXyAtIG9mZnNldF8pOworCisgICAgICAgICAgICB1aW50OF90KiB6ZXJvcyA9IG5ldyB1aW50OF90W3BhZGRpbmddOworICAgICAgICAgICAgbWVtc2V0KHplcm9zLCAnXDAnLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gYXJyYXkoemVyb3MpOworICAgICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCB6ZXJvcywgcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBlcnJvciB3aGlsZSBwYWRkaW5nIHplcm9zICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuZmx1c2hlZCArPSBwYWRkaW5nOworICAgICAgICAgICAgb2Zmc2V0XyArPSBwYWRkaW5nOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRlIHRoZSBkZXF1ZXVlZCBldmVudCB0byB0aGUgZmlsZQorICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSB7CisgICAgICAgICAgaWYgKC0xID09IDo6VEhSSUZUX1dSSVRFKGZkXywgb3V0RXZlbnQtPmV2ZW50QnVmZl8sIG91dEV2ZW50LT5ldmVudFNpemVfKSkgeworICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgd3JpdGluZyBldmVudCAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHVuZmx1c2hlZCArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKKyAgICAgICAgICBvZmZzZXRfICs9IG91dEV2ZW50LT5ldmVudFNpemVfOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXF1ZXVlQnVmZmVyXy0+cmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAoaGFzSU9FcnJvcikgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTG9jYWwgdmFyaWFibGUgdG8gY2FjaGUgdGhlIHN0YXRlIG9mIGZvcmNlRmx1c2hfLgorICAgIC8vCisgICAgLy8gV2Ugb25seSB3YW50IHRvIGNoZWNrIHRoZSB2YWx1ZSBvZiBmb3JjZUZsdXNoXyBvbmNlIGVhY2ggdGltZSBhcm91bmQgdGhlCisgICAgLy8gbG9vcC4gIElmIHdlIGNoZWNrIGl0IG1vcmUgdGhhbiBvbmNlIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jayB0aGUgZW50aXJlCisgICAgLy8gdGltZSwgaXQgY291bGQgaGF2ZSBjaGFuZ2VkIHN0YXRlIGluIGJldHdlZW4uICBUaGlzIHdpbGwgcmVzdWx0IGluIHVzCisgICAgLy8gbWFraW5nIGluY29uc2lzdGVudCBkZWNpc2lvbnMuCisgICAgYm9vbCBmb3JjZWRfZmx1c2ggPSBmYWxzZTsKKyAgICB7CisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICBpZiAoZm9yY2VGbHVzaF8pIHsKKyAgICAgICAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgLy8gSWYgZm9yY2VGbHVzaF8gaXMgdHJ1ZSwgd2UgbmVlZCB0byBmbHVzaCBhbGwgYXZhaWxhYmxlIGRhdGEuCisgICAgICAgICAgLy8gSWYgZW5xdWV1ZUJ1ZmZlcl8gaXMgbm90IGVtcHR5LCBnbyBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbG9vcCB0bworICAgICAgICAgIC8vIHdyaXRlIGl0IG91dC4KKyAgICAgICAgICAvLworICAgICAgICAgIC8vIFdlIGtub3cgdGhlIG1haW4gdGhyZWFkIGlzIHdhaXRpbmcgb24gZm9yY2VGbHVzaF8gdG8gYmUgY2xlYXJlZCwKKyAgICAgICAgICAvLyBzbyBubyBuZXcgZXZlbnRzIHdpbGwgYmUgYWRkZWQgdG8gZW5xdWV1ZUJ1ZmZlcl8gdW50aWwgd2UgY2xlYXIKKyAgICAgICAgICAvLyBmb3JjZUZsdXNoXy4gIFRoZXJlZm9yZSB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcCBlbnF1ZXVlQnVmZmVyXworICAgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW1wdHkuICAoSS5lLiwgd2UncmUgZ3VhcmFudGVlZCB0byBtYWtlIHByb2dyZXNzCisgICAgICAgICAgLy8gYW5kIGNsZWFyIGZvcmNlRmx1c2hfIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3JjZWRfZmx1c2ggPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gZnN5bmMKKyAgICBib29sIGZsdXNoID0gZmFsc2U7CisgICAgaWYgKGZvcmNlZF9mbHVzaCB8fCB1bmZsdXNoZWQgPiBmbHVzaE1heEJ5dGVzXykgeworICAgICAgZmx1c2ggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CisgICAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZjdXJyZW50X3RpbWUsIE5VTEwpOworICAgICAgaWYgKGN1cnJlbnRfdGltZS50dl9zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3NlYworICAgICAgICAgIHx8IChjdXJyZW50X3RpbWUudHZfc2VjID09IHRzX25leHRfZmx1c2gudHZfc2VjCisgICAgICAgICAgICAgICYmIGN1cnJlbnRfdGltZS50dl91c2VjID4gdHNfbmV4dF9mbHVzaC50dl91c2VjKSkgeworICAgICAgICBpZiAodW5mbHVzaGVkID4gMCkgeworICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXcgZGF0YSBzaW5jZSB0aGUgbGFzdCBmc3luYywKKyAgICAgICAgICAvLyBkb24ndCBwZXJmb3JtIHRoZSBmc3luYywgYnV0IGRvIHJlc2V0IHRoZSB0aW1lci4KKyAgICAgICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChmbHVzaCkgeworICAgICAgLy8gc3luYyAoZm9yY2UgZmx1c2gpIGZpbGUgdG8gZGlzaworICAgICAgVEhSSUZUX0ZTWU5DKGZkXyk7CisgICAgICB1bmZsdXNoZWQgPSAwOworICAgICAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7CisKKyAgICAgIC8vIG5vdGlmeSBhbnlib2R5IHdhaXRpbmcgZm9yIGZsdXNoIGNvbXBsZXRpb24KKyAgICAgIGlmIChmb3JjZWRfZmx1c2gpIHsKKyAgICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgICBmb3JjZUZsdXNoXyA9IGZhbHNlOworICAgICAgICBhc3NlcnQoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydChkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKTsKKyAgICAgICAgZmx1c2hlZF8ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBmaWxlIG11c3QgYmUgb3BlbiBmb3Igd3JpdGluZyBmb3IgYW55IGZsdXNoaW5nIHRvIHRha2UgcGxhY2UKKyAgaWYgKCF3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vIHdhaXQgZm9yIGZsdXNoIHRvIHRha2UgcGxhY2UKKyAgR3VhcmQgZyhtdXRleF8pOworCisgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIHJlcXVlc3RpbmcgYSBmbHVzaAorICBmb3JjZUZsdXNoXyA9IHRydWU7CisgIC8vIFdha2UgdXAgdGhlIHdyaXRlciB0aHJlYWQgc28gaXQgd2lsbCBwZXJmb3JtIHRoZSBmbHVzaCBpbW1lZGlhdGVseQorICBub3RFbXB0eV8ubm90aWZ5KCk7CisKKyAgd2hpbGUgKGZvcmNlRmx1c2hfKSB7CisgICAgZmx1c2hlZF8ud2FpdCgpOworICB9Cit9CisKK3VpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpyZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGhhdmUgPSAwOworICB1aW50MzJfdCBnZXQgPSAwOworCisgIHdoaWxlIChoYXZlIDwgbGVuKSB7CisgICAgZ2V0ID0gcmVhZChidWYgKyBoYXZlLCBsZW4gLSBoYXZlKTsKKyAgICBpZiAoZ2V0IDw9IDApIHsKKyAgICAgIHRocm93IFRFT0ZFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaGF2ZSArPSBnZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydDo6cGVlaygpIHsKKyAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gZXZlbnQgcmVhZHkgdG8gYmUgcmVhZAorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisgIH0KKworICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAorICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCisgIGlmICghY3VycmVudEV2ZW50XykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIHJlYWQKKyAgcmV0dXJuIChjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXykgPiAwOworfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAvLyBjaGVjayBpZiB0aGVyZSBhbiBldmVudCBpcyByZWFkeSB0byBiZSByZWFkCisgIGlmICghY3VycmVudEV2ZW50XykgeworICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKKyAgfQorCisgIC8vIGRpZCBub3QgbWFuYWdlIHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgZmlsZS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbmVkCisgIC8vIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgb3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IKKyAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyByZWFkIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgZXZlbnQgYXMgcG9zc2libGUKKyAgaW50MzJfdCByZW1haW5pbmcgPSBjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXzsKKyAgaWYgKHJlbWFpbmluZyA8PSAoaW50MzJfdClsZW4pIHsKKyAgICAvLyBjb3B5IG92ZXIgYW55dGhpbmcgdGhhdHMgcmVtYWluaW5nCisgICAgaWYgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCByZW1haW5pbmcpOworICAgIH0KKyAgICBkZWxldGUgKGN1cnJlbnRFdmVudF8pOworICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOworICAgIHJldHVybiByZW1haW5pbmc7CisgIH0KKworICAvLyByZWFkIGFzIG11Y2ggYXMgcG9zc2libGUKKyAgbWVtY3B5KGJ1ZiwgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sIGxlbik7CisgIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18gKz0gbGVuOworICByZXR1cm4gbGVuOworfQorCisvLyBub3RlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyByZXR1cm5lZCBldmVudHMKK2V2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnQ6OnJlYWRFdmVudCgpIHsKKyAgaW50IHJlYWRUcmllcyA9IDA7CisKKyAgaWYgKCFyZWFkQnVmZl8pIHsKKyAgICByZWFkQnVmZl8gPSBuZXcgdWludDhfdFtyZWFkQnVmZlNpemVfXTsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgLy8gcmVhZCBmcm9tIHRoZSBmaWxlIGlmIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZAorICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPT0gcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CisgICAgICAvLyBhZHZhbmNlIHRoZSBvZmZzZXQgcG9pbnRlcgorICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmJ1ZmZlckxlbl87CisgICAgICByZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oOjpUSFJJRlRfUkVBRChmZF8sIHJlYWRCdWZmXywgcmVhZEJ1ZmZTaXplXykpOworICAgICAgLy8gICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgLy8gICAgICAgICBUX0RFQlVHX0woMSwgIkFtb3VudCByZWFkOiAldSAob2Zmc2V0OiAlbHUpIiwgcmVhZFN0YXRlXy5idWZmZXJMZW5fLCBvZmZzZXRfKTsKKyAgICAgIC8vICAgICAgIH0KKyAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA9IDA7CisgICAgICByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8gPSAwOworCisgICAgICAvLyByZWFkIGVycm9yCisgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IC0xKSB7CisgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7CisgICAgICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAwKSB7IC8vIEVPRgorICAgICAgICAvLyB3YWl0IGluZGVmaW5pdGVseSBpZiB0aGVyZSBpcyBubyB0aW1lb3V0CisgICAgICAgIGlmIChyZWFkVGltZW91dF8gPT0gVEFJTF9SRUFEX1RJTUVPVVQpIHsKKyAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhlb2ZTbGVlcFRpbWVfKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gTk9fVEFJTF9SRUFEX1RJTUVPVVQpIHsKKyAgICAgICAgICAvLyByZXNldCBzdGF0ZQorICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPiAwKSB7CisgICAgICAgICAgLy8gdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb25jZQorICAgICAgICAgIGlmIChyZWFkVHJpZXMgPiAwKSB7CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMocmVhZFRpbWVvdXRfICogMTAwMCk7CisgICAgICAgICAgICByZWFkVHJpZXMrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJlYWRUcmllcyA9IDA7CisKKyAgICAvLyBhdHRlbXB0IHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyCisgICAgd2hpbGUgKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgaWYgKHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfKSB7CisgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDApIHsKKyAgICAgICAgICBpZiAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIC8gY2h1bmtTaXplXworICAgICAgICAgICAgICAhPSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyAzKSAvIGNodW5rU2l6ZV8pKSB7CisgICAgICAgICAgICAvLyBza2lwIG9uZSBieXRlIHRvd2FyZHMgY2h1bmsgYm91bmRhcnkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJTa2lwcGluZyBhIGJ5dGUiKTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdCisgICAgICAgICAgICA9IHJlYWRCdWZmX1tyZWFkU3RhdGVfLmJ1ZmZlclB0cl8rK107CisKKyAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gNCkgeworICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmdldEV2ZW50U2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIDAgbGVuZ3RoIGV2ZW50IGluZGljYXRlcyBwYWRkaW5nCisgICAgICAgICAgICAvLyAgICAgICAgICAgIFRfREVCVUdfTCgxLCAiR290IHBhZGRpbmciKTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGdvdCBhIHZhbGlkIGV2ZW50CisgICAgICAgICAgcmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8gPSBmYWxzZTsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8pIHsKKyAgICAgICAgICAgIGRlbGV0ZSAocmVhZFN0YXRlXy5ldmVudF8pOworICAgICAgICAgIH0KKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG5ldyBldmVudEluZm8oKTsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA9IHJlYWRTdGF0ZV8uZ2V0RXZlbnRTaXplKCk7CisKKyAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaXMgY29ycnVwdGVkIGFuZCBwZXJmb3JtIHJlY292ZXJ5IGlmIHJlcXVpcmVkCisgICAgICAgICAgaWYgKGlzRXZlbnRDb3JydXB0ZWQoKSkgeworICAgICAgICAgICAgcGVyZm9ybVJlY292ZXJ5KCk7CisgICAgICAgICAgICAvLyBzdGFydCBmcm9tIHRoZSB0b3AKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXykgeworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV9dOworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBpbnQgcmVjbGFpbUJ1ZmZlciA9IChzdGQ6Om1pbikoKHVpbnQzMl90KShyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyk7CisKKyAgICAgICAgLy8gY29weSBkYXRhIGZyb20gcmVhZCBidWZmZXIgaW50byBldmVudCBidWZmZXIKKyAgICAgICAgbWVtY3B5KHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18sCisgICAgICAgICAgICAgICByZWFkQnVmZl8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8sCisgICAgICAgICAgICAgICByZWNsYWltQnVmZmVyKTsKKworICAgICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gcHRycworICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyArPSByZWNsYWltQnVmZmVyOworICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKz0gcmVjbGFpbUJ1ZmZlcjsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaGFzIGJlZW4gcmVhZCBpbiBmdWxsCisgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9PSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXykgeworICAgICAgICAgIC8vIHNldCB0aGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBjdXJyZW50IGV2ZW50CisgICAgICAgICAgZXZlbnRJbmZvKiBjb21wbGV0ZUV2ZW50ID0gcmVhZFN0YXRlXy5ldmVudF87CisgICAgICAgICAgY29tcGxldGVFdmVudC0+ZXZlbnRCdWZmUG9zXyA9IDA7CisKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IE5VTEw7CisgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyk7CisKKyAgICAgICAgICAvLyBleGl0IGNyaXRlcmlhCisgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlRXZlbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworYm9vbCBURmlsZVRyYW5zcG9ydDo6aXNFdmVudENvcnJ1cHRlZCgpIHsKKyAgLy8gYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGlmOgorICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgeworICAgIC8vIDEuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gdXNlci1zcGVmaWNpZWQgbWF4LWV2ZW50IHNpemUKKyAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IHNpemUoJXUpIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZSAoJXUpIiwKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAorICAgICAgICAgICAgbWF4RXZlbnRTaXplXyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7CisgICAgLy8gMi4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBjaHVuayBzaXplCisgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gY2h1bmsgc2l6ZSAoJXUpIiwKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAorICAgICAgICAgICAgY2h1bmtTaXplXyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfIC0gNCkgLyBjaHVua1NpemVfKQorICAgICAgICAgICAgICE9ICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gMSkKKyAgICAgICAgICAgICAgICAgLyBjaHVua1NpemVfKSkgeworICAgIC8vIDMuIHNpemUgaW5kaWNhdGVzIHRoYXQgZXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeQorICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeS4gRXZlbnQgc2l6ZToldSAgT2Zmc2V0OiVsdSIsCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyA0KSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6cGVyZm9ybVJlY292ZXJ5KCkgeworICAvLyBwZXJmb3JtIHNvbWUga2lja2FzcyByZWNvdmVyeQorICB1aW50MzJfdCBjdXJDaHVuayA9IGdldEN1ckNodW5rKCk7CisgIGlmIChsYXN0QmFkQ2h1bmtfID09IGN1ckNodW5rKSB7CisgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18rKzsKKyAgfSBlbHNlIHsKKyAgICBsYXN0QmFkQ2h1bmtfID0gY3VyQ2h1bms7CisgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPSAxOworICB9CisKKyAgaWYgKG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfIDwgbWF4Q29ycnVwdGVkRXZlbnRzXykgeworICAgIC8vIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzaworICAgIC8vIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiBjaHVuayBhbmQgdHJ5IGFnYWluCisgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmspOworICB9IGVsc2UgeworCisgICAgLy8ganVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IGNodW5rIGlmIHdlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGNodW5rCisgICAgaWYgKGN1ckNodW5rICE9IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CisgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOworICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7CisgICAgICAvLyBpZiB0YWlsaW5nIHRoZSBmaWxlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHN0YXJ0CisgICAgICAvLyB0aGUgbmV4dCBjaHVuaworICAgICAgd2hpbGUgKGN1ckNodW5rID09IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyk7CisgICAgICB9CisgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBwcmV0dHkgaG9zZWQgYXQgdGhpcyBzdGFnZSwgcmV3aW5kIHRoZSBmaWxlIGJhY2sgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bAorICAgICAgLy8gcG9pbnQgYW5kIHB1bnQgb24gdGhlIGVycm9yCisgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOworICAgICAgY2hhciBlcnJvck1zZ1sxMDI0XTsKKyAgICAgIHNwcmludGYoZXJyb3JNc2csCisgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgY29ycnVwdGVkIGF0IG9mZnNldDogJWx1IiwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ob2Zmc2V0XyArIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXykpOworCisgICAgICBHbG9iYWxPdXRwdXQoZXJyb3JNc2cpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihlcnJvck1zZyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspIHsKKyAgaWYgKGZkXyA8PSAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRmlsZSBub3Qgb3BlbiIpOworICB9CisKKyAgaW50MzJfdCBudW1DaHVua3MgPSBnZXROdW1DaHVua3MoKTsKKworICAvLyBmaWxlIGlzIGVtcHR5LCBzZWVraW5nIHRvIGNodW5rIGlzIHBvaW50bGVzcworICBpZiAobnVtQ2h1bmtzID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBuZWdhdGl2ZSBpbmRpY2F0ZXMgcmV2ZXJzZSBzZWVrIChmcm9tIHRoZSBlbmQpCisgIGlmIChjaHVuayA8IDApIHsKKyAgICBjaHVuayArPSBudW1DaHVua3M7CisgIH0KKworICAvLyB0b28gbGFyZ2UgYSB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLCBqdXN0IHNlZWsgdG8gYmVnaW5uaW5nCisgIGlmIChjaHVuayA8IDApIHsKKyAgICBUX0RFQlVHKCIlcyIsICJJbmNvcnJlY3QgdmFsdWUgZm9yIHJldmVyc2Ugc2Vlay4gU2Vla2luZyB0byBiZWdpbm5pbmcuLi4iKTsKKyAgICBjaHVuayA9IDA7CisgIH0KKworICAvLyBjYW5ub3Qgc2VlayBwYXN0IEVPRgorICBib29sIHNlZWtUb0VuZCA9IGZhbHNlOworICBvZmZfdCBtaW5FbmRPZmZzZXQgPSAwOworICBpZiAoY2h1bmsgPj0gbnVtQ2h1bmtzKSB7CisgICAgVF9ERUJVRygiJXMiLCAiVHJ5aW5nIHRvIHNlZWsgcGFzdCBFT0YuIFNlZWtpbmcgdG8gRU9GIGluc3RlYWQuLi4iKTsKKyAgICBzZWVrVG9FbmQgPSB0cnVlOworICAgIGNodW5rID0gbnVtQ2h1bmtzIC0gMTsKKyAgICAvLyB0aGlzIGlzIHRoZSBtaW4gb2Zmc2V0IHRvIHByb2Nlc3MgZXZlbnRzIHRpbGwKKyAgICBtaW5FbmRPZmZzZXQgPSA6OlRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfRU5EKTsKKyAgfQorCisgIG9mZl90IG5ld09mZnNldCA9IG9mZl90KGNodW5rKSAqIGNodW5rU2l6ZV87CisgIG9mZnNldF8gPSA6OlRIUklGVF9MU0VFSyhmZF8sIG5ld09mZnNldCwgU0VFS19TRVQpOworICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgIGN1cnJlbnRFdmVudF8gPSBOVUxMOworICBpZiAob2Zmc2V0XyA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7CisgIH0KKworICAvLyBzZWVrIHRvIEVPRiBpZiB1c2VyIHdhbnRlZCB0byBnbyB0byBsYXN0IGNodW5rCisgIGlmIChzZWVrVG9FbmQpIHsKKyAgICB1aW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGdldFJlYWRUaW1lb3V0KCk7CisgICAgc2V0UmVhZFRpbWVvdXQoTk9fVEFJTF9SRUFEX1RJTUVPVVQpOworICAgIC8vIGtlZXAgb24gcmVhZGluZyB1bnRpIHRoZSBsYXN0IGV2ZW50IGF0IHBvaW50IG9mIHNlZWtDaHVuayBjYWxsCisgICAgc2hhcmVkX3B0cjxldmVudEluZm8+IGV2ZW50OworICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgPCBtaW5FbmRPZmZzZXQpIHsKKyAgICAgIGV2ZW50LnJlc2V0KHJlYWRFdmVudCgpKTsKKyAgICAgIGlmIChldmVudC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7CisgIH0KK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvRW5kKCkgeworICBzZWVrVG9DaHVuayhnZXROdW1DaHVua3MoKSk7Cit9CisKK3VpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7CisgIGlmIChmZF8gPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc3RydWN0IFRIUklGVF9TVEFUIGZfaW5mbzsKKyAgaW50IHJ2ID0gOjpUSFJJRlRfRlNUQVQoZmRfLCAmZl9pbmZvKTsKKworICBpZiAocnYgPCAwKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSAoZnN0YXQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGZfaW5mby5zdF9zaXplID4gMCkgeworICAgIHNpemVfdCBudW1DaHVua3MgPSAoKGZfaW5mby5zdF9zaXplKSAvIGNodW5rU2l6ZV8pICsgMTsKKyAgICBpZiAobnVtQ2h1bmtzID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJUb28gbWFueSBjaHVua3MiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bUNodW5rcyk7CisgIH0KKworICAvLyBlbXB0eSBmaWxlIGhhcyBubyBjaHVua3MKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihvZmZzZXRfIC8gY2h1bmtTaXplXyk7Cit9CisKKy8vIFV0aWxpdHkgRnVuY3Rpb25zCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpvcGVuTG9nRmlsZSgpIHsKKyNpZm5kZWYgX1dJTjMyCisgIG1vZGVfdCBtb2RlID0gcmVhZE9ubHlfID8gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIDogU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyAgaW50IGZsYWdzID0gcmVhZE9ubHlfID8gT19SRE9OTFkgOiBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CisjZWxzZQorICBpbnQgbW9kZSA9IHJlYWRPbmx5XyA/IF9TX0lSRUFEIDogX1NfSVJFQUQgfCBfU19JV1JJVEU7CisgIGludCBmbGFncyA9IHJlYWRPbmx5XyA/IF9PX1JET05MWSA6IF9PX1JEV1IgfCBfT19DUkVBVCB8IF9PX0FQUEVORDsKKyNlbmRpZgorICBmZF8gPSA6OlRIUklGVF9PUEVOKGZpbGVuYW1lXy5jX3N0cigpLCBmbGFncywgbW9kZSk7CisgIG9mZnNldF8gPSAwOworCisgIC8vIG1ha2Ugc3VyZSBvcGVuIGNhbGwgd2FzIHN1Y2Nlc3NmdWwKKyAgaWYgKGZkXyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiBvcGVuTG9nRmlsZSgpIDo6b3BlbigpIGZpbGU6ICIgKyBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sIGZpbGVuYW1lXywgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6Z2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXZhbCogdHNfbmV4dF9mbHVzaCkgeworICBUSFJJRlRfR0VUVElNRU9GREFZKHRzX25leHRfZmx1c2gsIE5VTEwpOworCisgIHRzX25leHRfZmx1c2gtPnR2X3VzZWMgKz0gZmx1c2hNYXhVc187CisgIGlmICh0c19uZXh0X2ZsdXNoLT50dl91c2VjID4gMTAwMDAwMCkgeworICAgIGxvbmcgZXh0cmFfc2VjcyA9IHRzX25leHRfZmx1c2gtPnR2X3VzZWMgLyAxMDAwMDAwOworICAgIHRzX25leHRfZmx1c2gtPnR2X3VzZWMgJT0gMTAwMDAwMDsKKyAgICB0c19uZXh0X2ZsdXNoLT50dl9zZWMgKz0gZXh0cmFfc2VjczsKKyAgfQorfQorCitURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6VEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSkKKyAgOiBidWZmZXJNb2RlXyhXUklURSksIHdyaXRlUG9pbnRfKDApLCByZWFkUG9pbnRfKDApLCBzaXplXyhzaXplKSB7CisgIGJ1ZmZlcl8gPSBuZXcgZXZlbnRJbmZvKiBbc2l6ZV07Cit9CisKK1RGaWxlVHJhbnNwb3J0QnVmZmVyOjp+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKSB7CisgIGlmIChidWZmZXJfKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlUG9pbnRfOyBpKyspIHsKKyAgICAgIGRlbGV0ZSBidWZmZXJfW2ldOworICAgIH0KKyAgICBkZWxldGVbXSBidWZmZXJfOworICAgIGJ1ZmZlcl8gPSBOVUxMOworICB9Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmFkZEV2ZW50KGV2ZW50SW5mbyogZXZlbnQpIHsKKyAgaWYgKGJ1ZmZlck1vZGVfID09IFJFQUQpIHsKKyAgICBHbG9iYWxPdXRwdXQoIlRyeWluZyB0byB3cml0ZSB0byBhIGJ1ZmZlciBpbiByZWFkIG1vZGUiKTsKKyAgfQorICBpZiAod3JpdGVQb2ludF8gPCBzaXplXykgeworICAgIGJ1ZmZlcl9bd3JpdGVQb2ludF8rK10gPSBldmVudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBidWZmZXIgaXMgZnVsbAorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpnZXROZXh0KCkgeworICBpZiAoYnVmZmVyTW9kZV8gPT0gV1JJVEUpIHsKKyAgICBidWZmZXJNb2RlXyA9IFJFQUQ7CisgIH0KKyAgaWYgKHJlYWRQb2ludF8gPCB3cml0ZVBvaW50XykgeworICAgIHJldHVybiBidWZmZXJfW3JlYWRQb2ludF8rK107CisgIH0gZWxzZSB7CisgICAgLy8gbm8gbW9yZSBlbnRyaWVzCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwordm9pZCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6cmVzZXQoKSB7CisgIGlmIChidWZmZXJNb2RlXyA9PSBXUklURSB8fCB3cml0ZVBvaW50XyA+IHJlYWRQb2ludF8pIHsKKyAgICBUX0RFQlVHKCIlcyIsICJSZXNldHRpbmcgYSBidWZmZXIgd2l0aCB1bnJlYWQgZW50cmllcyIpOworICB9CisgIC8vIENsZWFuIHVwIHRoZSBvbGQgZW50cmllcworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVQb2ludF87IGkrKykgeworICAgIGRlbGV0ZSBidWZmZXJfW2ldOworICB9CisgIGJ1ZmZlck1vZGVfID0gV1JJVEU7CisgIHdyaXRlUG9pbnRfID0gMDsKKyAgcmVhZFBvaW50XyA9IDA7Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmlzRnVsbCgpIHsKKyAgcmV0dXJuIHdyaXRlUG9pbnRfID09IHNpemVfOworfQorCitib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjppc0VtcHR5KCkgeworICByZXR1cm4gd3JpdGVQb2ludF8gPT0gMDsKK30KKworVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CisKKyAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKKyAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKK30KKworVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgeworCisgIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCisgIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Cit9CisKK1RGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCksCisgICAgb3V0cHV0VHJhbnNwb3J0XyhvdXRwdXRUcmFuc3BvcnQpIHsKK30KKwordm9pZCBURmlsZVByb2Nlc3Nvcjo6cHJvY2Vzcyh1aW50MzJfdCBudW1FdmVudHMsIGJvb2wgdGFpbCkgeworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnRfKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgLy8gc2V0IHRoZSByZWFkIHRpbWVvdXQgdG8gMCBpZiB0YWlsaW5nIGlzIHJlcXVpcmVkCisgIGludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBpbnB1dFRyYW5zcG9ydF8tPmdldFJlYWRUaW1lb3V0KCk7CisgIGlmICh0YWlsKSB7CisgICAgLy8gc2F2ZSBvbGQgcmVhZCB0aW1lb3V0IHNvIGl0IGNhbiBiZSByZXN0b3JlZAorICAgIGlucHV0VHJhbnNwb3J0Xy0+c2V0UmVhZFRpbWVvdXQoVEZpbGVUcmFuc3BvcnQ6OlRBSUxfUkVBRF9USU1FT1VUKTsKKyAgfQorCisgIHVpbnQzMl90IG51bVByb2Nlc3NlZCA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5CisgICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAorICAgIHRyeSB7CisgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKKyAgICAgIG51bVByb2Nlc3NlZCsrOworICAgICAgaWYgKChudW1FdmVudHMgPiAwKSAmJiAobnVtUHJvY2Vzc2VkID09IG51bUV2ZW50cykpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRFT0ZFeGNlcHRpb24mKSB7CisgICAgICBpZiAoIXRhaWwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyByZXN0b3JlIG9sZCByZWFkIHRpbWVvdXQKKyAgaWYgKHRhaWwpIHsKKyAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKKyAgfQorfQorCit2b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzQ2h1bmsoKSB7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKKworICB1aW50MzJfdCBjdXJDaHVuayA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKTsKKworICB3aGlsZSAoMSkgeworICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQorICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKKyAgICB0cnkgeworICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CisgICAgICBpZiAoY3VyQ2h1bmsgIT0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRFT0ZFeGNlcHRpb24mKSB7CisgICAgICBicmVhazsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0ZSkgeworICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjN2JkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKKworLy8gRGF0YSBwZXJ0YWluaW5nIHRvIGEgc2luZ2xlIGV2ZW50Cit0eXBlZGVmIHN0cnVjdCBldmVudEluZm8geworICB1aW50OF90KiBldmVudEJ1ZmZfOworICB1aW50MzJfdCBldmVudFNpemVfOworICB1aW50MzJfdCBldmVudEJ1ZmZQb3NfOworCisgIGV2ZW50SW5mbygpIDogZXZlbnRCdWZmXyhOVUxMKSwgZXZlbnRTaXplXygwKSwgZXZlbnRCdWZmUG9zXygwKXt9OworICB+ZXZlbnRJbmZvKCkgeworICAgIGlmIChldmVudEJ1ZmZfKSB7CisgICAgICBkZWxldGVbXSBldmVudEJ1ZmZfOworICAgIH0KKyAgfQorfSBldmVudEluZm87CisKKy8vIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcmVhZCBzdGF0ZQordHlwZWRlZiBzdHJ1Y3QgcmVhZFN0YXRlIHsKKyAgZXZlbnRJbmZvKiBldmVudF87CisKKyAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCisgIHVpbnQ4X3QgZXZlbnRTaXplQnVmZl9bNF07CisgIHVpbnQ4X3QgZXZlbnRTaXplQnVmZlBvc187CisgIGJvb2wgcmVhZGluZ1NpemVfOworCisgIC8vIHJlYWQgYnVmZmVyIHZhcmlhYmxlcworICBpbnQzMl90IGJ1ZmZlclB0cl87CisgIGludDMyX3QgYnVmZmVyTGVuXzsKKworICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKKyAgaW50MzJfdCBsYXN0RGlzcGF0Y2hQdHJfOworCisgIHZvaWQgcmVzZXRTdGF0ZSh1aW50MzJfdCBsYXN0RGlzcGF0Y2hQdHIpIHsKKyAgICByZWFkaW5nU2l6ZV8gPSB0cnVlOworICAgIGV2ZW50U2l6ZUJ1ZmZQb3NfID0gMDsKKyAgICBsYXN0RGlzcGF0Y2hQdHJfID0gbGFzdERpc3BhdGNoUHRyOworICB9CisKKyAgdm9pZCByZXNldEFsbFZhbHVlcygpIHsKKyAgICByZXNldFN0YXRlKDApOworICAgIGJ1ZmZlclB0cl8gPSAwOworICAgIGJ1ZmZlckxlbl8gPSAwOworICAgIGlmIChldmVudF8pIHsKKyAgICAgIGRlbGV0ZSAoZXZlbnRfKTsKKyAgICB9CisgICAgZXZlbnRfID0gMDsKKyAgfQorCisgIGlubGluZSB1aW50MzJfdCBnZXRFdmVudFNpemUoKSB7CisgICAgY29uc3Qgdm9pZCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oZXZlbnRTaXplQnVmZl8pOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KGJ1ZmZlcik7CisgIH0KKworICByZWFkU3RhdGUoKSB7CisgICAgZXZlbnRfID0gMDsKKyAgICByZXNldEFsbFZhbHVlcygpOworICB9CisKKyAgfnJlYWRTdGF0ZSgpIHsKKyAgICBpZiAoZXZlbnRfKSB7CisgICAgICBkZWxldGUgKGV2ZW50Xyk7CisgICAgfQorICB9CisKK30gcmVhZFN0YXRlOworCisvKioKKyAqIFRGaWxlVHJhbnNwb3J0QnVmZmVyIC0gYnVmZmVyIGNsYXNzIHVzZWQgYnkgVEZpbGVUcmFuc3BvcnQgZm9yIHF1ZXVlaW5nIHVwIGV2ZW50cworICogdG8gYmUgd3JpdHRlbiB0byBkaXNrLiAgU2hvdWxkIGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgKiAgMSkgQnVmZmVyIGNyZWF0ZWQKKyAqICAyKSBCdWZmZXIgd3JpdHRlbiB0byAoYWRkRXZlbnQpCisgKiAgMykgQnVmZmVyIHJlYWQgZnJvbSAoZ2V0TmV4dCkKKyAqICA0KSBCdWZmZXIgcmVzZXQgKHJlc2V0KQorICogIDUpIEdvIGJhY2sgdG8gMiwgb3IgZGVzdHJveSBidWZmZXIKKyAqCisgKiBUaGUgYnVmZmVyIHNob3VsZCBuZXZlciBiZSB3cml0dGVuIHRvIGFmdGVyIGl0IGlzIHJlYWQgZnJvbSwgdW5sZXNzIGl0IGlzIHJlc2V0IGZpcnN0LgorICogTm90ZTogVGhlIGFib3ZlIHJ1bGVzIGFyZSBlbmZvcmNlZCBtYWlubHkgZm9yIGRlYnVnZ2luZyBpdHMgc29sZSBjbGllbnQgVEZpbGVUcmFuc3BvcnQKKyAqICAgICAgIHdoaWNoIHVzZXMgdGhlIGJ1ZmZlciBpbiB0aGlzIHdheS4KKyAqCisgKi8KK2NsYXNzIFRGaWxlVHJhbnNwb3J0QnVmZmVyIHsKK3B1YmxpYzoKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSk7CisgIH5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpOworCisgIGJvb2wgYWRkRXZlbnQoZXZlbnRJbmZvKiBldmVudCk7CisgIGV2ZW50SW5mbyogZ2V0TmV4dCgpOworICB2b2lkIHJlc2V0KCk7CisgIGJvb2wgaXNGdWxsKCk7CisgIGJvb2wgaXNFbXB0eSgpOworCitwcml2YXRlOgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlcigpOyAvLyBzaG91bGQgbm90IGJlIHVzZWQKKworICBlbnVtIG1vZGUgeyBXUklURSwgUkVBRCB9OworICBtb2RlIGJ1ZmZlck1vZGVfOworCisgIHVpbnQzMl90IHdyaXRlUG9pbnRfOworICB1aW50MzJfdCByZWFkUG9pbnRfOworICB1aW50MzJfdCBzaXplXzsKKyAgZXZlbnRJbmZvKiogYnVmZmVyXzsKK307CisKKy8qKgorICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0cmFuc3BvcnRzIHVzZWQgdG8gcmVhZCBmaWxlcworICovCitjbGFzcyBURmlsZVJlYWRlclRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1DaHVua3MoKSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZWVrVG9FbmQoKSA9IDA7Cit9OworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHdyaXRlIGZpbGVzCisgKi8KK2NsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgPSAwOworfTsKKworLyoqCisgKiBGaWxlIGltcGxlbWVudGF0aW9uIG9mIGEgdHJhbnNwb3J0LiBSZWFkcyBhbmQgd3JpdGVzIGFyZSBkb25lIHRvIGEKKyAqIGZpbGUgb24gZGlzay4KKyAqCisgKi8KK2NsYXNzIFRGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVXcml0ZXJUcmFuc3BvcnQgeworcHVibGljOgorICBURmlsZVRyYW5zcG9ydChzdGQ6OnN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5ID0gZmFsc2UpOworICB+VEZpbGVUcmFuc3BvcnQoKTsKKworICAvLyBUT0RPOiB3aGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBmb3IgdGhpcz8KKyAgLy8gdGhlIGxvZyBmaWxlIGlzIGdlbmVyYWxseSBhbHdheXMgb3BlbgorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCBmbHVzaCgpOworCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgYm9vbCBwZWVrKCk7CisKKyAgLy8gbG9nLWZpbGUgc3BlY2lmaWMgZnVuY3Rpb25zCisgIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuayk7CisgIHZvaWQgc2Vla1RvRW5kKCk7CisgIHVpbnQzMl90IGdldE51bUNodW5rcygpOworICB1aW50MzJfdCBnZXRDdXJDaHVuaygpOworCisgIC8vIGZvciBjaGFuZ2luZyB0aGUgb3V0cHV0IGZpbGUKKyAgdm9pZCByZXNldE91dHB1dEZpbGUoaW50IGZkLCBzdGQ6OnN0cmluZyBmaWxlbmFtZSwgb2ZmX3Qgb2Zmc2V0KTsKKworICAvLyBTZXR0ZXIvR2V0dGVyIGZ1bmN0aW9ucyBmb3IgdXNlci1jb250cm9sbGFibGUgb3B0aW9ucworICB2b2lkIHNldFJlYWRCdWZmU2l6ZSh1aW50MzJfdCByZWFkQnVmZlNpemUpIHsKKyAgICBpZiAocmVhZEJ1ZmZTaXplKSB7CisgICAgICByZWFkQnVmZlNpemVfID0gcmVhZEJ1ZmZTaXplOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRSZWFkQnVmZlNpemUoKSB7IHJldHVybiByZWFkQnVmZlNpemVfOyB9CisKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVEFJTF9SRUFEX1RJTUVPVVQgPSAtMTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgTk9fVEFJTF9SRUFEX1RJTUVPVVQgPSAwOworICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsgcmVhZFRpbWVvdXRfID0gcmVhZFRpbWVvdXQ7IH0KKyAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpIHsgcmV0dXJuIHJlYWRUaW1lb3V0XzsgfQorCisgIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgeworICAgIGlmIChjaHVua1NpemUpIHsKKyAgICAgIGNodW5rU2l6ZV8gPSBjaHVua1NpemU7CisgICAgfQorICB9CisgIHVpbnQzMl90IGdldENodW5rU2l6ZSgpIHsgcmV0dXJuIGNodW5rU2l6ZV87IH0KKworICB2b2lkIHNldEV2ZW50QnVmZmVyU2l6ZSh1aW50MzJfdCBidWZmZXJTaXplKSB7CisgICAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgeworICAgICAgR2xvYmFsT3V0cHV0KCJDYW5ub3QgY2hhbmdlIHRoZSBidWZmZXIgc2l6ZSBhZnRlciB3cml0ZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXZlbnRCdWZmZXJTaXplXyA9IGJ1ZmZlclNpemU7CisgIH0KKworICB1aW50MzJfdCBnZXRFdmVudEJ1ZmZlclNpemUoKSB7IHJldHVybiBldmVudEJ1ZmZlclNpemVfOyB9CisKKyAgdm9pZCBzZXRGbHVzaE1heFVzKHVpbnQzMl90IGZsdXNoTWF4VXMpIHsKKyAgICBpZiAoZmx1c2hNYXhVcykgeworICAgICAgZmx1c2hNYXhVc18gPSBmbHVzaE1heFVzOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRGbHVzaE1heFVzKCkgeyByZXR1cm4gZmx1c2hNYXhVc187IH0KKworICB2b2lkIHNldEZsdXNoTWF4Qnl0ZXModWludDMyX3QgZmx1c2hNYXhCeXRlcykgeworICAgIGlmIChmbHVzaE1heEJ5dGVzKSB7CisgICAgICBmbHVzaE1heEJ5dGVzXyA9IGZsdXNoTWF4Qnl0ZXM7CisgICAgfQorICB9CisgIHVpbnQzMl90IGdldEZsdXNoTWF4Qnl0ZXMoKSB7IHJldHVybiBmbHVzaE1heEJ5dGVzXzsgfQorCisgIHZvaWQgc2V0TWF4RXZlbnRTaXplKHVpbnQzMl90IG1heEV2ZW50U2l6ZSkgeyBtYXhFdmVudFNpemVfID0gbWF4RXZlbnRTaXplOyB9CisgIHVpbnQzMl90IGdldE1heEV2ZW50U2l6ZSgpIHsgcmV0dXJuIG1heEV2ZW50U2l6ZV87IH0KKworICB2b2lkIHNldE1heENvcnJ1cHRlZEV2ZW50cyh1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHMpIHsKKyAgICBtYXhDb3JydXB0ZWRFdmVudHNfID0gbWF4Q29ycnVwdGVkRXZlbnRzOworICB9CisgIHVpbnQzMl90IGdldE1heENvcnJ1cHRlZEV2ZW50cygpIHsgcmV0dXJuIG1heENvcnJ1cHRlZEV2ZW50c187IH0KKworICB2b2lkIHNldEVvZlNsZWVwVGltZVVzKHVpbnQzMl90IGVvZlNsZWVwVGltZSkgeworICAgIGlmIChlb2ZTbGVlcFRpbWUpIHsKKyAgICAgIGVvZlNsZWVwVGltZV8gPSBlb2ZTbGVlcFRpbWU7CisgICAgfQorICB9CisgIHVpbnQzMl90IGdldEVvZlNsZWVwVGltZVVzKCkgeyByZXR1cm4gZW9mU2xlZXBUaW1lXzsgfQorCisgIC8qCisgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgorICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAorICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KKworcHJpdmF0ZToKKyAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBhIGZpbGUKKyAgdm9pZCBlbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbik7CisgIGJvb2wgc3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXZhbCogZGVhZGxpbmUpOworICBib29sIGluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpOworCisgIC8vIGNvbnRyb2wgZm9yIHdyaXRlciB0aHJlYWQKKyAgc3RhdGljIHZvaWQqIHN0YXJ0V3JpdGVyVGhyZWFkKHZvaWQqIHB0cikgeworICAgIHN0YXRpY19jYXN0PFRGaWxlVHJhbnNwb3J0Kj4ocHRyKS0+d3JpdGVyVGhyZWFkKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdm9pZCB3cml0ZXJUaHJlYWQoKTsKKworICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gYSBmaWxlCisgIGV2ZW50SW5mbyogcmVhZEV2ZW50KCk7CisKKyAgLy8gZXZlbnQgY29ycnVwdGlvbi1yZWxhdGVkIGZ1bmN0aW9ucworICBib29sIGlzRXZlbnRDb3JydXB0ZWQoKTsKKyAgdm9pZCBwZXJmb3JtUmVjb3ZlcnkoKTsKKworICAvLyBVdGlsaXR5IGZ1bmN0aW9ucworICB2b2lkIG9wZW5Mb2dGaWxlKCk7CisgIHZvaWQgZ2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXZhbCogdHNfbmV4dF9mbHVzaCk7CisKKyAgLy8gQ2xhc3MgdmFyaWFibGVzCisgIHJlYWRTdGF0ZSByZWFkU3RhdGVfOworICB1aW50OF90KiByZWFkQnVmZl87CisgIGV2ZW50SW5mbyogY3VycmVudEV2ZW50XzsKKworICB1aW50MzJfdCByZWFkQnVmZlNpemVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9SRUFEX0JVRkZfU0laRSA9IDEgKiAxMDI0ICogMTAyNDsKKworICBpbnQzMl90IHJlYWRUaW1lb3V0XzsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9SRUFEX1RJTUVPVVRfTVMgPSAyMDA7CisKKyAgLy8gc2l6ZSBvZiBjaHVua3MgdGhhdCBmaWxlIHdpbGwgYmUgc3BsaXQgdXAgaW50bworICB1aW50MzJfdCBjaHVua1NpemVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9DSFVOS19TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsKKworICAvLyBzaXplIG9mIGV2ZW50IGJ1ZmZlcnMKKyAgdWludDMyX3QgZXZlbnRCdWZmZXJTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkUgPSAxMDAwMDsKKworICAvLyBtYXggbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0aGF0IGNhbiBwYXNzIHdpdGhvdXQgZmx1c2hpbmcKKyAgdWludDMyX3QgZmx1c2hNYXhVc187CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0ZMVVNIX01BWF9VUyA9IDMwMDAwMDA7CisKKyAgLy8gbWF4IG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHdpdGhvdXQgZmx1c2hpbmcKKyAgdWludDMyX3QgZmx1c2hNYXhCeXRlc187CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0ZMVVNIX01BWF9CWVRFUyA9IDEwMDAgKiAxMDI0OworCisgIC8vIG1heCBldmVudCBzaXplCisgIHVpbnQzMl90IG1heEV2ZW50U2l6ZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX01BWF9FVkVOVF9TSVpFID0gMDsKKworICAvLyBtYXggbnVtYmVyIG9mIGNvcnJ1cHRlZCBldmVudHMgcGVyIGNodW5rCisgIHVpbnQzMl90IG1heENvcnJ1cHRlZEV2ZW50c187CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTID0gMDsKKworICAvLyBzbGVlcCBkdXJhdGlvbiB3aGVuIEVPRiBpcyBoaXQKKyAgdWludDMyX3QgZW9mU2xlZXBUaW1lXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRU9GX1NMRUVQX1RJTUVfVVMgPSA1MDAgKiAxMDAwOworCisgIC8vIHNsZWVwIGR1cmF0aW9uIHdoZW4gYSBjb3JydXB0ZWQgZXZlbnQgaXMgZW5jb3VudGVyZWQKKyAgdWludDMyX3QgY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUyA9IDEgKiAxMDAwICogMTAwMDsKKworICAvLyBzbGVlcCBkdXJhdGlvbiBpbiBzZWNvbmRzIHdoZW4gYW4gSU8gZXJyb3IgaXMgZW5jb3VudGVyZWQgaW4gdGhlIHdyaXRlciB0aHJlYWQKKyAgdWludDMyX3Qgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUyA9IDYwICogMTAwMCAqIDEwMDA7CisKKyAgLy8gd3JpdGVyIHRocmVhZAorICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB3cml0ZXJUaHJlYWRfOworCisgIC8vIGJ1ZmZlcnMgdG8gaG9sZCBkYXRhIGJlZm9yZSBpdCBpcyBmbHVzaGVkLiBFYWNoIGVsZW1lbnQgb2YgdGhlIGJ1ZmZlciBzdG9yZXMgYSBtc2cgdGhhdAorICAvLyBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLiAgVGhlIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgYnkgdGhlIHdyaXRlciB0aHJlYWQuCisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiBkZXF1ZXVlQnVmZmVyXzsKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIGVucXVldWVCdWZmZXJfOworCisgIC8vIGNvbmRpdGlvbnMgdXNlZCB0byBibG9jayB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBvciBlbXB0eQorICBNb25pdG9yIG5vdEZ1bGxfLCBub3RFbXB0eV87CisgIHN0ZDo6YXRvbWljPGJvb2w+IGNsb3NpbmdfOworCisgIC8vIFRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIGZsdXNoZWQKKyAgTW9uaXRvciBmbHVzaGVkXzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gZm9yY2VGbHVzaF87CisKKyAgLy8gTXV0ZXggdGhhdCBpcyBncmFiYmVkIHdoZW4gZW5xdWV1ZWluZyBhbmQgc3dhcHBpbmcgdGhlIHJlYWQvd3JpdGUgYnVmZmVycworICBNdXRleCBtdXRleF87CisKKyAgLy8gRmlsZSBpbmZvcm1hdGlvbgorICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisgIGludCBmZF87CisKKyAgLy8gV2hldGhlciB0aGUgd3JpdGVyIHRocmVhZCBhbmQgYnVmZmVycyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKyAgYm9vbCBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF87CisKKyAgLy8gT2Zmc2V0IHdpdGhpbiB0aGUgZmlsZQorICBvZmZfdCBvZmZzZXRfOworCisgIC8vIGV2ZW50IGNvcnJ1cHRpb24gaW5mb3JtYXRpb24KKyAgdWludDMyX3QgbGFzdEJhZENodW5rXzsKKyAgdWludDMyX3QgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua187CisKKyAgYm9vbCByZWFkT25seV87Cit9OworCisvLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gRU9GIGlzIGhpdAorY2xhc3MgVEVPRkV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVEVPRkV4Y2VwdGlvbigpIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSl7fTsKK307CisKKy8vIHdyYXBwZXIgY2xhc3MgdG8gcHJvY2VzcyBldmVudHMgZnJvbSBhIGZpbGUgY29udGFpbmluZyB0aHJpZnQgZXZlbnRzCitjbGFzcyBURmlsZVByb2Nlc3NvciB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlZmF1bHRzIG91dHB1dCB0cmFuc3BvcnQgdG8gbnVsbCB0cmFuc3BvcnQKKyAgICoKKyAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCisgICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQorICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgZmlsZSB0cmFuc3BvcnQKKyAgICovCisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworCisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBwcm9jZXNzb3IgcHJvY2Vzc2VzIGxvZy1maWxlIGV2ZW50cworICAgKiBAcGFyYW0gcHJvdG9jb2xGYWN0b3J5IHByb3RvY29sIGZhY3RvcnkKKyAgICogQHBhcmFtIGlucHV0VHJhbnNwb3J0IGlucHV0IGZpbGUgdHJhbnNwb3J0CisgICAqIEBwYXJhbSBvdXRwdXQgb3V0cHV0IHRyYW5zcG9ydAorICAgKi8KKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7CisKKyAgLyoqCisgICAqIHByb2Nlc3NlcyBldmVudHMgZnJvbSB0aGUgZmlsZQorICAgKgorICAgKiBAcGFyYW0gbnVtRXZlbnRzIG51bWJlciBvZiBldmVudHMgdG8gcHJvY2VzcyAoMCBmb3IgdW5saW1pdGVkKQorICAgKiBAcGFyYW0gdGFpbCB0YWlscyB0aGUgZmlsZSBpZiB0cnVlCisgICAqLworICB2b2lkIHByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpOworCisgIC8qKgorICAgKiBwcm9jZXNzIGV2ZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjaHVuaworICAgKgorICAgKi8KKyAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA4NGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHJldHVybiBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyhidWYsIGxlbik7Cit9CisKK3VpbnQxNl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFByb3RvY29sSWQoKSBjb25zdCB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICByZXR1cm4gcHJvdG9JZDsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIFRfQ09NUEFDVF9QUk9UT0NPTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVF9CSU5BUllfUFJPVE9DT0w7IC8vIEFzc3VtZSBvdGhlciB0cmFuc3BvcnRzIHVzZSBUQmluYXJ5CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjplbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KSB7CisgIGlmIChzeiA+IHJCdWZTaXplXykgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KK30KKworYm9vbCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIHN6TiBpcyBuZXR3b3JrIGJ5dGUgb3JkZXIgb2Ygc3oKKyAgdWludDMyX3Qgc3pOOworICB1aW50MzJfdCBzejsKKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgdWludDMyX3Qgc2l6ZUJ5dGVzUmVhZCA9IDA7CisgIHdoaWxlIChzaXplQnl0ZXNSZWFkIDwgc2l6ZW9mKHN6TikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOKSArIHNpemVCeXRlc1JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzek4pIC0gc2l6ZUJ5dGVzUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZUJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3pOKTsKKworICBlbnN1cmVSZWFkQnVmZmVyKDQpOworCisgIGlmICgoc3ogJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgLy8gdW5mcmFtZWQKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgeworICAgIC8vIENvdWxkIGJlIGhlYWRlciBmb3JtYXQgb3IgZnJhbWVkLiBDaGVjayBuZXh0IHVpbnQzMgorICAgIHVpbnQzMl90IG1hZ2ljX247CisgICAgdWludDMyX3QgbWFnaWM7CisKKyAgICBpZiAoc3ogPiBNQVhfRlJBTUVfU0laRSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgZW5zdXJlUmVhZEJ1ZmZlcihzeik7CisKKyAgICAvLyBXZSBjYW4gdXNlIHJlYWRBbGwgaGVyZSwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGZyYW1lIG90aGVyd2lzZQorICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJm1hZ2ljX24pLCBzaXplb2YobWFnaWNfbikpOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJm1hZ2ljX24sIHNpemVvZihtYWdpY19uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpY19uKTsKKworICAgIGlmICgobWFnaWMgJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgICAvLyBmcmFtZWQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0JJTkFSWTsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1Q7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKEhFQURFUl9NQUdJQyA9PSAobWFnaWMgJiBIRUFERVJfTUFTSykpIHsKKyAgICAgIGlmIChzeiA8IDEwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIHNtYWxsIik7CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworCisgICAgICAvLyBoZWFkZXIgZm9ybWF0CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKyAgICAgIC8vIGZsYWdzCisgICAgICBmbGFncyA9IG1hZ2ljICYgRkxBR1NfTUFTSzsKKyAgICAgIC8vIHNlcUlkCisgICAgICB1aW50MzJfdCBzZXFJZF9uOworICAgICAgbWVtY3B5KCZzZXFJZF9uLCByQnVmXy5nZXQoKSArIDQsIHNpemVvZihzZXFJZF9uKSk7CisgICAgICBzZXFJZCA9IG50b2hsKHNlcUlkX24pOworICAgICAgLy8gaGVhZGVyIHNpemUKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemVfbjsKKyAgICAgIG1lbWNweSgmaGVhZGVyU2l6ZV9uLCByQnVmXy5nZXQoKSArIDgsIHNpemVvZihoZWFkZXJTaXplX24pKTsKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemUgPSBudG9ocyhoZWFkZXJTaXplX24pOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgICAgcmVhZEhlYWRlckZvcm1hdChoZWFkZXJTaXplLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKKyAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCisgKgorICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKKyAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLyBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSkgeworICBpbnQzMl90IHN0ckxlbjsKKworICB1aW50MzJfdCBieXRlcyA9IHJlYWRWYXJpbnQzMihwdHIsICZzdHJMZW4sIGhlYWRlckJvdW5kYXJ5KTsKKyAgaWYgKHN0ckxlbiA+IGhlYWRlckJvdW5kYXJ5IC0gcHRyKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIGhlYWRlciBsZW5ndGggZXhjZWVkcyBoZWFkZXIgc2l6ZSIpOworICB9CisgIHB0ciArPSBieXRlczsKKyAgc3RyLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBzdHJMZW4pOworICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opIHsKKyAgcmVhZFRyYW5zXy5jbGVhcigpOyAgIC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgcmVhZEhlYWRlcnNfLmNsZWFyKCk7IC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgaGVhZGVycy4KKworICAvLyBza2lwIG92ZXIgYWxyZWFkeSBwcm9jZXNzZWQgbWFnaWMoNCksIHNlcUlkKDQpLCBoZWFkZXJTaXplKDIpCisgIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHJCdWZfLmdldCgpICsgMTApOworCisgIC8vIENhdGNoIGludGVnZXIgb3ZlcmZsb3csIGNoZWNrIGZvciByZWFzb25hYmxlIGhlYWRlciBzaXplCisgIGlmIChoZWFkZXJTaXplID49IDE2Mzg0KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgfQorICBoZWFkZXJTaXplICo9IDQ7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlckJvdW5kYXJ5ID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgaWYgKGhlYWRlclNpemUgPiBzeikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUiKTsKKyAgfQorICB1aW50OF90KiBkYXRhID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZwcm90b0lkLCBoZWFkZXJCb3VuZGFyeSk7CisgIGludDE2X3QgbnVtVHJhbnNmb3JtczsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZudW1UcmFuc2Zvcm1zLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgLy8gRm9yIG5vdyBhbGwgdHJhbnNmb3JtcyBjb25zaXN0IG9mIG9ubHkgdGhlIElELCBub3QgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHsKKyAgICBpbnQzMl90IHRyYW5zSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZ0cmFuc0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICByZWFkVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsKKyAgfQorCisgIC8vIEluZm8gaGVhZGVycworICB3aGlsZSAocHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICBpbnQzMl90IGluZm9JZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJmluZm9JZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgaWYgKGluZm9JZCA9PSAwKSB7CisgICAgICAvLyBoZWFkZXIgcGFkZGluZworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmZvSWQgPj0gaW5mb0lkVHlwZTo6RU5EKSB7CisgICAgICAvLyBjYW5ub3QgaGFuZGxlIGluZm9JZAorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoaW5mb0lkKSB7CisgICAgY2FzZSBpbmZvSWRUeXBlOjpLRVlWQUxVRToKKyAgICAgIC8vIFByb2Nlc3Mga2V5LXZhbHVlIGhlYWRlcnMKKyAgICAgIHVpbnQzMl90IG51bUtWSGVhZGVyczsKKyAgICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAoaW50MzJfdCopJm51bUtWSGVhZGVycywgaGVhZGVyQm91bmRhcnkpOworICAgICAgLy8gY29udGludWUgdW50aWwgd2UgcmVhY2ggKHBhZGRlZCkgZW5kIG9mIHBhY2tldAorICAgICAgd2hpbGUgKG51bUtWSGVhZGVycy0tICYmIHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgICAgIC8vIGZvcm1hdDoga2V5OyB2YWx1ZQorICAgICAgICAvLyBib3RoOiBsZW5ndGggKHZhcmludDMyKTsgdmFsdWUgKHN0cmluZykKKyAgICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgIHJlYWRTdHJpbmcocHRyLCBrZXksIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIHZhbHVlLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHNhdmUgdG8gaGVhZGVycworICAgICAgICByZWFkSGVhZGVyc19ba2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gVW50cmFuc2Zvcm0gdGhlIGRhdGEgc2VjdGlvbi4gIHJCdWYgd2lsbCBjb250YWluIHJlc3VsdC4KKyAgdW50cmFuc2Zvcm0oZGF0YSwgc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oc3opIC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVhZFRyYW5zXy5iZWdpbigpOyBpdCAhPSByZWFkVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICAvLyBTZXR0aW5nIHRoZXNlIHRvIDAgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGZyZWUvYWxsb2MgZnVuY3Rpb25zCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGUiKTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHNldFJlYWRCdWZmZXIocHRyLCBzeik7Cit9CisKKy8qKgorICogV2UgbWF5IGhhdmUgdXBkYXRlZCB0aGUgd0J1ZiBzaXplLCB1cGRhdGUgdGhlIHRCdWYgc2l6ZSB0byBtYXRjaC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdHJhbnNmb3JtLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGJlIHNsaWdodGx5IGxhcmdlciB0aGFuIHdyaXRlIGJ1ZmZlciBzaXplIGR1ZSB0bworICogY29tcHJlc3Npb24gdHJhbnNmb3JtcyAodGhhdCBtYXkgc2xpZ2h0bHkgZ3JvdyBvbiBzbWFsbCBmcmFtZSBzaXplcykKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUpIHsKKyAgaWYgKHRCdWZTaXplXyA8IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUgKyBhZGRpdGlvbmFsU2l6ZTsKKyAgICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworICAgIHRCdWZfLnJlc2V0KG5ld19idWYpOworICAgIHRCdWZTaXplXyA9IG5ld19zaXplOworICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICB1aW50MzJfdCB0YnVmX3NpemUgPSAwOworICAgICAgd2hpbGUgKGVyciA9PSBaX09LKSB7CisgICAgICAgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih0YnVmX3NpemUpOworCisgICAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgdGJ1Zl9zaXplICs9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc3o7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgLy8gU2V0IHRvIGFueXRoaW5nIGV4Y2VwdCBIVFRQIHR5cGUgc28gd2UgZG9uJ3QgZmx1c2ggYWdhaW4KKyAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisKKyAgLy8gUmVhZCB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hpY2ggcHJvdG9jb2wgdG8gZ28gd2l0aAorICByZWFkRnJhbWUoKTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0V3JpdGVCeXRlcygpIHsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgYnl0ZSBidWZmZXIsIGFzIHNpemUgKHZhcmludDMyKSArIHN0cmluZyAobm9uLW51bGwKKyAqIHRlcm1pbmF0ZWQpCisgKiBBdXRvbWF0aWNhbGx5IGFkdmFuY2VzIHB0ciB0byBhZnRlciB0aGUgd3JpdHRlbiBwb3J0aW9uCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CisgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6c2V0SGVhZGVyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIHdyaXRlSGVhZGVyc19ba2V5XSA9IHZhbHVlOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgeworICBzaXplX3QgbWF4V3JpdGVIZWFkZXJzU2l6ZSA9IDA7CisgIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIC8vIGFkZCBzaXplcyBvZiBrZXkgYW5kIHZhbHVlIHRvIG1heFdyaXRlSGVhZGVyc1NpemUKKyAgICAvLyAyIHZhcmludHMzMiArIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMKKyAgICBtYXhXcml0ZUhlYWRlcnNTaXplICs9IDUgKyA1ICsgKGl0LT5maXJzdCkubGVuZ3RoKCkgKyAoaXQtPnNlY29uZCkubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CisgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOworCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICB0cmFuc2Zvcm0od0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgICAgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOyAvLyB0cmFuc2Zvcm0gbWF5IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZQorICB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworCisgIGlmIChoYXZlQnl0ZXMgPiBNQVhfRlJBTUVfU0laRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgIH0KKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgLy8gaGVhZGVyIHNpemUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHZhcmludHMuCisgICAgLy8gTWFrZSBpdCBiaWcgZW5vdWdoIGhlcmUgZm9yIG1heCB2YXJpbnQgc2l6ZSwgcGx1cyA0IGZvciBwYWRkaW5nLgorICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKKyAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKKyAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKKworICAgIC8vIFBrdCBzaXplCisgICAgdWludDMyX3QgbWF4U3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICArIDEwOyAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIHVpbnQ4X3QqIHBrdCA9IHRCdWZfLmdldCgpOworICAgIHVpbnQ4X3QqIGhlYWRlclN0YXJ0OworICAgIHVpbnQ4X3QqIGhlYWRlclNpemVQdHI7CisgICAgdWludDhfdCogcGt0U3RhcnQgPSBwa3Q7CisKKyAgICBpZiAobWF4U3pIYm8gPiB0QnVmU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGhlYWRlciBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIHVpbnQzMl90IHN6SGJvOworICAgIHVpbnQzMl90IHN6TmJvOworICAgIHVpbnQxNl90IGhlYWRlclNpemVOOworCisgICAgLy8gRml4dXAgc3pIYm8gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKHN6TmJvKTsKKyAgICB1aW50MTZfdCBoZWFkZXJOID0gaHRvbnMoSEVBREVSX01BR0lDID4+IDE2KTsKKyAgICBtZW1jcHkocGt0LCAmaGVhZGVyTiwgc2l6ZW9mKGhlYWRlck4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlck4pOworICAgIHVpbnQxNl90IGZsYWdzTiA9IGh0b25zKGZsYWdzKTsKKyAgICBtZW1jcHkocGt0LCAmZmxhZ3NOLCBzaXplb2YoZmxhZ3NOKSk7CisgICAgcGt0ICs9IHNpemVvZihmbGFnc04pOworICAgIHVpbnQzMl90IHNlcUlkTiA9IGh0b25sKHNlcUlkKTsKKyAgICBtZW1jcHkocGt0LCAmc2VxSWROLCBzaXplb2Yoc2VxSWROKSk7CisgICAgcGt0ICs9IHNpemVvZihzZXFJZE4pOworICAgIGhlYWRlclNpemVQdHIgPSBwa3Q7CisgICAgLy8gRml4dXAgaGVhZGVyU2l6ZU4gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlclNpemVOKTsKKyAgICBoZWFkZXJTdGFydCA9IHBrdDsKKworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHByb3RvSWQsIHBrdCk7CisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoZ2V0TnVtVHJhbnNmb3JtcygpLCBwa3QpOworCisgICAgLy8gRm9yIG5vdywgZWFjaCB0cmFuc2Zvcm0gaXMgb25seSB0aGUgSUQsIG5vIGZvbGxvd2luZyBkYXRhLgorICAgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoKml0LCBwa3QpOworICAgIH0KKworICAgIC8vIHdyaXRlIGluZm8gaGVhZGVycworCisgICAgLy8gZm9yIG5vdyBvbmx5IHdyaXRlIGt2LWhlYWRlcnMKKyAgICBpbnQzMl90IGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOworICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOworICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGhlYWRlckNvdW50KSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGluZm8gaGVhZGVycworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPmZpcnN0KTsgIC8vIGtleQorICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5zZWNvbmQpOyAvLyB2YWx1ZQorICAgICAgfQorICAgICAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworICAgIH0KKworICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKKyAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CisKKyAgICAvLyBQYWQgb3V0IHBrdCB3aXRoIDB4MDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworICAgICAgKihwa3QrKykgPSAweDAwOworICAgIH0KKworICAgIC8vIFBrdCBzaXplCisgICAgcHRyZGlmZl90IHN6SGJwID0gKGhlYWRlclN0YXJ0IC0gcGt0U3RhcnQgLSA0KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN6SGJwKSA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD4oKS5tYXgpKCkpIC0gKGhlYWRlclNpemUgKyBoYXZlQnl0ZXMpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNlY3Rpb24gc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgICB9CisgICAgc3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzICAgICAgICAgIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICArIHN0YXRpY19jYXN0PHVpbnQzMl90PihzekhicCk7IC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIGhlYWRlclNpemVOID0gaHRvbnMoaGVhZGVyU2l6ZSAvIDQpOworICAgIG1lbWNweShoZWFkZXJTaXplUHRyLCAmaGVhZGVyU2l6ZU4sIHNpemVvZihoZWFkZXJTaXplTikpOworCisgICAgLy8gU2V0IGZyYW1pbmcgc2l6ZS4KKyAgICBzek5ibyA9IGh0b25sKHN6SGJvKTsKKyAgICBtZW1jcHkocGt0U3RhcnQsICZzek5ibywgc2l6ZW9mKHN6TmJvKSk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShwa3RTdGFydCwgc3pIYm8gLSBoYXZlQnl0ZXMgKyA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgdWludDMyX3Qgc3pIYm8gPSAodWludDMyX3QpaGF2ZUJ5dGVzOworICAgIHVpbnQzMl90IHN6TmJvID0gaHRvbmwoc3pIYm8pOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TmJvKSwgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiVW5rbm93biBjbGllbnQgdHlwZSIpOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBvdXRUcmFuc3BvcnRfLT5mbHVzaCgpOworfQorCisvKioKKyAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisgIGludDMyX3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMihwdHIsICZ2YWwsIGJvdW5kYXJ5KTsKKyAgKmkxNiA9IChpbnQxNl90KXZhbDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisKKyAgdWludDMyX3QgcnNpemUgPSAwOworICB1aW50MzJfdCB2YWwgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHB0ciA9PSBib3VuZGFyeSkgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byByZWFkIHBhc3QgaGVhZGVyIGJvdW5kYXJ5Iik7CisgICAgfQorICAgIHVpbnQ4X3QgYnl0ZSA9ICoocHRyKyspOworICAgIHJzaXplKys7CisgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTMyID0gdmFsOworICAgICAgcmV0dXJuIHJzaXplOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICAvLyBDYWxsZXIgd2lsbCBhZHZhbmNlIHBrdC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdzaXplOyBpKyspIHsKKyAgICBwa3RbaV0gPSBidWZbaV07CisgIH0KKworICByZXR1cm4gd3NpemU7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIobiwgcGt0KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM1N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2VudW0gQ0xJRU5UX1RZUEUgeworICBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFID0gMCwKKyAgVEhSSUZUX0ZSQU1FRF9CSU5BUlkgPSAxLAorICBUSFJJRlRfVU5GUkFNRURfQklOQVJZID0gMiwKKyAgVEhSSUZUX0ZSQU1FRF9DT01QQUNUID0gMywKKyAgVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QgPSA0LAorICBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRSA9IDUsCit9OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DT01QQUNUX1BST1RPQ09MOworCisvKioKKyAqIEhlYWRlciB0cmFuc3BvcnQuIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzCisgKiBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZQorICogYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIHBheWxvYWQuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlciBvbiB0aGUKKyAqIG90aGVyIGVuZCB0byBhbHdheXMgZG8gZml4ZWQtbGVuZ3RoIHJlYWRzLgorICoKKyAqIFN1YmNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgYmVjYXVzZSBtb3N0IG9mIHRoZSByZWFkL3dyaXRlIG1ldGhvZHMgYXJlIHNpbWlsYXIKKyAqIGFuZCBuZWVkIHNpbWlsYXIgYnVmZmVycy4gIE1ham9yIGNoYW5nZXMgYXJlIHJlYWRGcmFtZSAmIGZsdXNoLgorICoKKyAqIEhlYWRlciBUcmFuc3BvcnQgKm11c3QqIGJlIHRoZSBzYW1lIHRyYW5zcG9ydCBmb3IgYm90aCBpbnB1dCBhbmQKKyAqIG91dHB1dCB3aGVuIHVzZWQgb24gdGhlIHNlcnZlciBzaWRlIC0gY2xpZW50IHJlc3BvbnNlcyBzaG91bGQgYmUKKyAqIHRoZSBzYW1lIHByb3RvY29sIGFzIHRob3NlIGluIHRoZSByZXF1ZXN0LgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIZWFkZXJUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEydTsKKyAgc3RhdGljIGNvbnN0IGludCBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTID0gNTsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBleHBsaWNpdCBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJ0cmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KGluVHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8ob3V0VHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJpblRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGlmICghb3V0VHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJvdXRUcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHZvaWQgcmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplID0gMCk7CisKKyAgdWludDE2X3QgZ2V0UHJvdG9jb2xJZCgpIGNvbnN0OworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeyB0aGlzLT5wcm90b0lkID0gcHJvdG9JZDsgfQorCisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIC8qKgorICAgKiBXZSBrbm93IHdlIGdvdCBhIHBhY2tldCBpbiBoZWFkZXIgZm9ybWF0IGhlcmUsIHRyeSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAqCisgICAqIEBwYXJhbSBoZWFkZXJTaXplIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uCisgICAqIEBwYXJhbSBzeiBTaXplIG9mIHRoZSB3aG9sZSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyCisgICAqLworICB2b2lkIHJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBVbnRyYW5zZm9ybSB0aGUgZGF0YSBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgaGVhZGVyIGZsYWdzCisgICAqIE9uIGNvbmNsdXNpb24gb2YgZnVuY3Rpb24sIHNldFJlYWRCdWZmZXIgaXMgY2FsbGVkIHdpdGggdGhlCisgICAqIHVudHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBwdHIgdG8gZGF0YQorICAgKiBAcGFyYW0gc2l6ZSBvZiBkYXRhCisgICAqLworICB2b2lkIHVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gb3VyIHdyaXRlIHRyYW5zZm9ybSBmbGFncworICAgKiBBdCBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uIHRoZSB3cml0ZSBidWZmZXIgaXMgc2V0IHRvIHRoZQorICAgKiB0cmFuc2Zvcm1lZCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gcHRyIFB0ciB0byBkYXRhIHRvIHRyYW5zZm9ybQorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICAgKi8KKyAgdm9pZCB0cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeik7CisKKyAgdWludDE2X3QgZ2V0TnVtVHJhbnNmb3JtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDE2X3Q+KHdyaXRlVHJhbnNfLnNpemUoKSk7CisgIH0KKworICB2b2lkIHNldFRyYW5zZm9ybSh1aW50MTZfdCB0cmFuc0lkKSB7IHdyaXRlVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsgfQorCisgIC8vIEluZm8gaGVhZGVycworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIHZvaWQgY2xlYXJIZWFkZXJzKCk7CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHdyaXRlSGVhZGVyc187IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gcmVhZEhlYWRlcnNfOyB9CisKKyAgLy8gYWNjZXNzb3JzIGZvciBzZXFJZAorICBpbnQzMl90IGdldFNlcXVlbmNlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VxSWQ7IH0KKyAgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihpbnQzMl90IHNlcUlkKSB7IHRoaXMtPnNlcUlkID0gc2VxSWQ7IH0KKworICBlbnVtIFRSQU5TRk9STVMgeworICAgIFpMSUJfVFJBTlNGT1JNID0gMHgwMSwKKyAgfTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICoKKyAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCisgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKKyAgICovCisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKKworICB2b2lkIGVuc3VyZVJlYWRCdWZmZXIodWludDMyX3Qgc3opOworICB1aW50MzJfdCBnZXRXcml0ZUJ5dGVzKCk7CisKKyAgdm9pZCBpbml0QnVmZmVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydF87CisKKyAgLy8gMCBhbmQgMTZ0aCBiaXRzIG11c3QgYmUgMCB0byBkaWZmZXJlbnRpYXRlIGZyb20gZnJhbWVkICYgdW5mcmFtZWQKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQUdJQyA9IDB4MEZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFTSyA9IDB4RkZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHU19NQVNLID0gMHgwMDAwRkZGRjsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGOworCisgIGludDE2X3QgcHJvdG9JZDsKKyAgdWludDE2X3QgY2xpZW50VHlwZTsKKyAgdWludDMyX3Qgc2VxSWQ7CisgIHVpbnQxNl90IGZsYWdzOworCisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiByZWFkVHJhbnNfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gd3JpdGVUcmFuc187CisKKyAgLy8gTWFwIHRvIHVzZSBmb3IgaGVhZGVycworICBTdHJpbmdUb1N0cmluZ01hcCByZWFkSGVhZGVyc187CisgIFN0cmluZ1RvU3RyaW5nTWFwIHdyaXRlSGVhZGVyc187CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd3JpdGUgay92IGhlYWRlcnMgY2FuIHRha2UKKyAgICovCisgIHVpbnQzMl90IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdDsKKworICBzdHJ1Y3QgaW5mb0lkVHlwZSB7CisgICAgZW51bSBpZFR5cGUgeworICAgICAgLy8gc3RhcnQgYXQgMSB0byBhdm9pZCBjb25mdXNpbmcgaGVhZGVyIHBhZGRpbmcgZm9yIGFuIGluZm9JZAorICAgICAgS0VZVkFMVUUgPSAxLAorICAgICAgRU5EIC8vIHNpZ25hbCB0aGUgZW5kIG9mIGluZm9JZHMgd2UgY2FuIGhhbmRsZQorICAgIH07CisgIH07CisKKyAgLy8gQnVmZmVycyB0byB1c2UgZm9yIHRyYW5zZm9ybSBwcm9jZXNzaW5nCisgIHVpbnQzMl90IHRCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB0QnVmXzsKKworICB2b2lkIHJlYWRTdHJpbmcodWludDhfdComIHB0ciwgLyogb3V0ICovIHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQ4X3QgY29uc3QqIGhlYWRlckJvdW5kYXJ5KTsKKworICB2b2lkIHdyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8vIFZhcmludCB1dGlscworICAvKioKKyAgICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTE2IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMyBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTIxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCkKKyAgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpLCBob3N0Xyhob3N0KSwgcGF0aF8ocGF0aCkgeworfQorCitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdHJpbmcgcGF0aCkKKyAgOiBUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwKKyAgICBob3N0Xyhob3N0KSwKKyAgICBwYXRoXyhwYXRoKSB7Cit9CisKK1RIdHRwQ2xpZW50Ojp+VEh0dHBDbGllbnQoKSB7Cit9CisKK3ZvaWQgVEh0dHBDbGllbnQ6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgeworICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGNoYXIqIHZhbHVlID0gY29sb24gKyAxOworCisgIGlmIChib29zdDo6aXN0YXJ0c193aXRoKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIikpIHsKKyAgICBpZiAoYm9vc3Q6OmllbmRzX3dpdGgodmFsdWUsICJjaHVua2VkIikpIHsKKyAgICAgIGNodW5rZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYm9vc3Q6OmlzdGFydHNfd2l0aChoZWFkZXIsICJDb250ZW50LUxlbmd0aCIpKSB7CisgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOworICB9Cit9CisKK2Jvb2wgVEh0dHBDbGllbnQ6OnBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIHsKKyAgY2hhciogaHR0cCA9IHN0YXR1czsKKworICBjaGFyKiBjb2RlID0gc3RyY2hyKGh0dHAsICcgJyk7CisgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9CisKKyAgKmNvZGUgPSAnXDAnOworICB3aGlsZSAoKihjb2RlKyspID09ICcgJykgeworICB9OworCisgIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOworICBpZiAobXNnID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9CisgICptc2cgPSAnXDAnOworCisgIGlmIChzdHJjbXAoY29kZSwgIjIwMCIpID09IDApIHsKKyAgICAvLyBIVFRQIDIwMCA9IE9LLCB3ZSBnb3QgdGhlIHJlc3BvbnNlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoc3RyY21wKGNvZGUsICIxMDAiKSA9PSAwKSB7CisgICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorfQorCit2b2lkIFRIdHRwQ2xpZW50OjpmbHVzaCgpIHsKKyAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBsZW47CisgIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgorICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKKyAgaCA8PCAiUE9TVCAiIDw8IHBhdGhfIDw8ICIgSFRUUC8xLjEiIDw8IENSTEYgPDwgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRgorICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgorICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBQQUNLQUdFX1ZFUlNJT04KKyAgICA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8IENSTEY7CisgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOworCisgIGlmIChoZWFkZXIuc2l6ZSgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiSGVhZGVyIHRvbyBiaWciKTsKKyAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAorICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihoZWFkZXIuc2l6ZSgpKSk7CisgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKKworICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCisgIHdyaXRlQnVmZmVyXy5yZXNldEJ1ZmZlcigpOworICByZWFkSGVhZGVyc18gPSB0cnVlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmYjEyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRIdHRwQ2xpZW50IDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgaG9zdCwgc3RkOjpzdHJpbmcgcGF0aCA9ICIiKTsKKworICBUSHR0cENsaWVudChzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzdHJpbmcgcGF0aCA9ICIiKTsKKworICB2aXJ0dWFsIH5USHR0cENsaWVudCgpOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIGhvc3RfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKTsKKyAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIyNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNlbmRpZgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUSHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpIHsKK30KKworVEh0dHBTZXJ2ZXI6On5USHR0cFNlcnZlcigpIHsKK30KKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3MoJlRNLCAmVElNRSkKKyAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBfc3RybmljbXAoc3RyMSwgc3RyMiwgbGVuKQorICAjZGVmaW5lIFRIUklGVF9zdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpIFN0clN0cklBKGhheXN0YWNrLCBuZWVkbGUpCisjZWxzZQorICAjZGVmaW5lIFRIUklGVF9HTVRJTUUoVE0sIFRJTUUpICAgICAgICAgICAgIGdtdGltZV9yKCZUSU1FLCAmVE0pCisgICNkZWZpbmUgVEhSSUZUX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikgc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKQorICAjZGVmaW5lIFRIUklGVF9zdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpIHN0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkKKyNlbmRpZgorCit2b2lkIFRIdHRwU2VydmVyOjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKKyAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBzaXplX3Qgc3ogPSBjb2xvbiAtIGhlYWRlcjsKKyAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CisKKyAgaWYgKFRIUklGVF9zdHJuY2FzZWNtcChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIsIHN6KSA9PSAwKSB7CisgICAgaWYgKFRIUklGVF9zdHJjYXNlc3RyKHZhbHVlLCAiY2h1bmtlZCIpICE9IE5VTEwpIHsKKyAgICAgIGNodW5rZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoVEhSSUZUX3N0cm5jYXNlY21wKGhlYWRlciwgIkNvbnRlbnQtbGVuZ3RoIiwgc3opID09IDApIHsKKyAgICBjaHVua2VkXyA9IGZhbHNlOworICAgIGNvbnRlbnRMZW5ndGhfID0gYXRvaSh2YWx1ZSk7CisgIH0gZWxzZSBpZiAoc3RybmNtcChoZWFkZXIsICJYLUZvcndhcmRlZC1Gb3IiLCBzeikgPT0gMCkgeworICAgIG9yaWdpbl8gPSB2YWx1ZTsKKyAgfQorfQorCitib29sIFRIdHRwU2VydmVyOjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7CisgIGNoYXIqIG1ldGhvZCA9IHN0YXR1czsKKworICBjaGFyKiBwYXRoID0gc3RyY2hyKG1ldGhvZCwgJyAnKTsKKyAgaWYgKHBhdGggPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KKworICAqcGF0aCA9ICdcMCc7CisgIHdoaWxlICgqKCsrcGF0aCkgPT0gJyAnKSB7CisgIH07CisKKyAgY2hhciogaHR0cCA9IHN0cmNocihwYXRoLCAnICcpOworICBpZiAoaHR0cCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorICAqaHR0cCA9ICdcMCc7CisKKyAgaWYgKHN0cmNtcChtZXRob2QsICJQT1NUIikgPT0gMCkgeworICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJPUFRJT05TIikgPT0gMCkgeworICAgIC8vIHByZWZsaWdodCBPUFRJT05TIG1ldGhvZCwgd2UgZG9uJ3QgbmVlZCBmdXJ0aGVyIGNvbnRlbnQuCisgICAgLy8gaG93IHRvIGdyYWNpb3VzbHkgY2xvc2UgY29ubmVjdGlvbj8KKyAgICB1aW50OF90KiBidWY7CisgICAgdWludDMyX3QgbGVuOworICAgIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7CisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CisgICAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRgorICAgICAgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kczogUE9TVCwgT1BUSU9OUyIKKyAgICAgIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnM6IENvbnRlbnQtVHlwZSIgPDwgQ1JMRiA8PCBDUkxGOworICAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOworCisgICAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAorICAgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKKyAgICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgICAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKKworICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKKyAgICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzICh1bnN1cHBvcnRlZCBtZXRob2QpOiAiKSArIHN0YXR1cyk7Cit9CisKK3ZvaWQgVEh0dHBTZXJ2ZXI6OmZsdXNoKCkgeworICAvLyBGZXRjaCB0aGUgY29udGVudHMgb2YgdGhlIHdyaXRlIGJ1ZmZlcgorICB1aW50OF90KiBidWY7CisgIHVpbnQzMl90IGxlbjsKKyAgd3JpdGVCdWZmZXJfLmdldEJ1ZmZlcigmYnVmLCAmbGVuKTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOworICBoIDw8ICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwgIkRhdGU6ICIgPDwgZ2V0VGltZVJGQzExMjMoKSA8PCBDUkxGIDw8ICJTZXJ2ZXI6IFRocmlmdC8iCisgICAgPDwgUEFDS0FHRV9WRVJTSU9OIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgPDwgQ1JMRgorICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgorICAgIDw8ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBDUkxGIDw8IENSTEY7CisgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOworCisgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKKyAgLy8gY2FzdCBzaG91bGQgYmUgZmluZSwgYmVjYXVzZSBub25lIG9mICJoZWFkZXIiIGlzIHVuZGVyIGF0dGFja2VyIGNvbnRyb2wKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaGVhZGVyLnNpemUoKSkpOworICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcworICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgVEh0dHBTZXJ2ZXI6OmdldFRpbWVSRkMxMTIzKCkgeworICBzdGF0aWMgY29uc3QgY2hhciogRGF5c1tdID0geyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQifTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIE1vbnRoc1tdCisgICAgICA9IHsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKKyAgY2hhciBidWZmWzEyOF07CisKKyAgdGltZV90IHQgPSB0aW1lKE5VTEwpOworICBzdHJ1Y3QgdG0gdG1iOworICBUSFJJRlRfR01USU1FKHRtYiwgdCk7CisKKyAgc3ByaW50ZihidWZmLAorICAgICAgICAgICIlcywgJWQgJXMgJWQgJWQ6JWQ6JWQgR01UIiwKKyAgICAgICAgICBEYXlzW3RtYi50bV93ZGF5XSwKKyAgICAgICAgICB0bWIudG1fbWRheSwKKyAgICAgICAgICBNb250aHNbdG1iLnRtX21vbl0sCisgICAgICAgICAgdG1iLnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgIHRtYi50bV9ob3VyLAorICAgICAgICAgIHRtYi50bV9taW4sCisgICAgICAgICAgdG1iLnRtX3NlYyk7CisgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODYwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUSHR0cFNlcnZlciA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRIdHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworCisgIHZpcnR1YWwgflRIdHRwU2VydmVyKCk7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCByZWFkSGVhZGVycygpOworICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKTsKKyAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpOworICBzdGQ6OnN0cmluZyBnZXRUaW1lUkZDMTEyMygpOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIEhUVFAgcHJvdG9jb2wKKyAqLworY2xhc3MgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5USHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NjMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCitjb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKK2NvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOworCitUSHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgb3JpZ2luXygiIiksCisgICAgcmVhZEhlYWRlcnNfKHRydWUpLAorICAgIGNodW5rZWRfKGZhbHNlKSwKKyAgICBjaHVua2VkRG9uZV8oZmFsc2UpLAorICAgIGNodW5rU2l6ZV8oMCksCisgICAgY29udGVudExlbmd0aF8oMCksCisgICAgaHR0cEJ1Zl8oTlVMTCksCisgICAgaHR0cFBvc18oMCksCisgICAgaHR0cEJ1Zkxlbl8oMCksCisgICAgaHR0cEJ1ZlNpemVfKDEwMjQpIHsKKyAgaW5pdCgpOworfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0Ojppbml0KCkgeworICBodHRwQnVmXyA9IChjaGFyKilzdGQ6Om1hbGxvYyhodHRwQnVmU2l6ZV8gKyAxKTsKKyAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKKyAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICB9CisgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Cit9CisKK1RIdHRwVHJhbnNwb3J0Ojp+VEh0dHBUcmFuc3BvcnQoKSB7CisgIGlmIChodHRwQnVmXyAhPSBOVUxMKSB7CisgICAgc3RkOjpmcmVlKGh0dHBCdWZfKTsKKyAgfQorfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAocmVhZEJ1ZmZlcl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7CisgICAgcmVhZEJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgICB1aW50MzJfdCBnb3QgPSByZWFkTW9yZURhdGEoKTsKKyAgICBpZiAoZ290ID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkRW5kKCkgeworICAvLyBSZWFkIGFueSBwZW5kaW5nIGNodW5rZWQgZGF0YSAoZm9vdGVycyBldGMuKQorICBpZiAoY2h1bmtlZF8pIHsKKyAgICB3aGlsZSAoIWNodW5rZWREb25lXykgeworICAgICAgcmVhZENodW5rZWQoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkTW9yZURhdGEoKSB7CisgIHVpbnQzMl90IHNpemU7CisKKyAgaWYgKGh0dHBQb3NfID09IGh0dHBCdWZMZW5fKSB7CisgICAgLy8gR2V0IG1vcmUgZGF0YSEKKyAgICByZWZpbGwoKTsKKyAgfQorCisgIGlmIChyZWFkSGVhZGVyc18pIHsKKyAgICByZWFkSGVhZGVycygpOworICB9CisKKyAgaWYgKGNodW5rZWRfKSB7CisgICAgc2l6ZSA9IHJlYWRDaHVua2VkKCk7CisgIH0gZWxzZSB7CisgICAgc2l6ZSA9IHJlYWRDb250ZW50KGNvbnRlbnRMZW5ndGhfKTsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ2h1bmtlZCgpIHsKKyAgdWludDMyX3QgbGVuZ3RoID0gMDsKKworICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKKyAgdWludDMyX3QgY2h1bmtTaXplID0gcGFyc2VDaHVua1NpemUobGluZSk7CisgIGlmIChjaHVua1NpemUgPT0gMCkgeworICAgIHJlYWRDaHVua2VkRm9vdGVycygpOworICB9IGVsc2UgeworICAgIC8vIFJlYWQgZGF0YSBjb250ZW50CisgICAgbGVuZ3RoICs9IHJlYWRDb250ZW50KGNodW5rU2l6ZSk7CisgICAgLy8gUmVhZCB0cmFpbGluZyBDUkxGIGFmdGVyIGNvbnRlbnQKKyAgICByZWFkTGluZSgpOworICB9CisgIHJldHVybiBsZW5ndGg7Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDaHVua2VkRm9vdGVycygpIHsKKyAgLy8gRW5kIG9mIGRhdGEsIHJlYWQgZm9vdGVyIGxpbmVzIHVudGlsIGEgYmxhbmsgb25lIGFwcGVhcnMKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKKyAgICBpZiAoc3RybGVuKGxpbmUpID09IDApIHsKKyAgICAgIGNodW5rZWREb25lXyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnBhcnNlQ2h1bmtTaXplKGNoYXIqIGxpbmUpIHsKKyAgY2hhciogc2VtaSA9IHN0cmNocihsaW5lLCAnOycpOworICBpZiAoc2VtaSAhPSBOVUxMKSB7CisgICAgKnNlbWkgPSAnXDAnOworICB9CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzc2NhbmYobGluZSwgIiV4IiwgJnNpemUpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDb250ZW50KHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3QgbmVlZCA9IHNpemU7CisgIHdoaWxlIChuZWVkID4gMCkgeworICAgIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKKyAgICBpZiAoYXZhaWwgPT0gMCkgeworICAgICAgLy8gV2UgaGF2ZSBnaXZlbiBhbGwgdGhlIGRhdGEsIHJlc2V0IHBvc2l0aW9uIHRvIGhlYWQgb2YgdGhlIGJ1ZmZlcgorICAgICAgaHR0cFBvc18gPSAwOworICAgICAgaHR0cEJ1Zkxlbl8gPSAwOworICAgICAgcmVmaWxsKCk7CisKKyAgICAgIC8vIE5vdyBoYXZlIGF2YWlsYWJsZSBob3dldmVyIG11Y2ggd2UgcmVhZAorICAgICAgYXZhaWwgPSBodHRwQnVmTGVuXzsKKyAgICB9CisgICAgdWludDMyX3QgZ2l2ZSA9IGF2YWlsOworICAgIGlmIChuZWVkIDwgZ2l2ZSkgeworICAgICAgZ2l2ZSA9IG5lZWQ7CisgICAgfQorICAgIHJlYWRCdWZmZXJfLndyaXRlKCh1aW50OF90KikoaHR0cEJ1Zl8gKyBodHRwUG9zXyksIGdpdmUpOworICAgIGh0dHBQb3NfICs9IGdpdmU7CisgICAgbmVlZCAtPSBnaXZlOworICB9CisgIHJldHVybiBzaXplOworfQorCitjaGFyKiBUSHR0cFRyYW5zcG9ydDo6cmVhZExpbmUoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogZW9sID0gTlVMTDsKKworICAgIGVvbCA9IHN0cnN0cihodHRwQnVmXyArIGh0dHBQb3NfLCBDUkxGKTsKKworICAgIC8vIE5vIENSTEYgeWV0PworICAgIGlmIChlb2wgPT0gTlVMTCkgeworICAgICAgLy8gU2hpZnQgd2hhdGV2ZXIgd2UgaGF2ZSBub3cgdG8gZnJvbnQgYW5kIHJlZmlsbAorICAgICAgc2hpZnQoKTsKKyAgICAgIHJlZmlsbCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUKKyAgICAgICplb2wgPSAnXDAnOworICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfICsgaHR0cFBvc187CisgICAgICBodHRwUG9zXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoZW9sIC0gaHR0cEJ1Zl8pICsgQ1JMRl9MRU4pOworICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OnNoaWZ0KCkgeworICBpZiAoaHR0cEJ1Zkxlbl8gPiBodHRwUG9zXykgeworICAgIC8vIFNoaWZ0IGRvd24gcmVtYWluaW5nIGRhdGEgYW5kIHJlYWQgbW9yZQorICAgIHVpbnQzMl90IGxlbmd0aCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187CisgICAgbWVtbW92ZShodHRwQnVmXywgaHR0cEJ1Zl8gKyBodHRwUG9zXywgbGVuZ3RoKTsKKyAgICBodHRwQnVmTGVuXyA9IGxlbmd0aDsKKyAgfSBlbHNlIHsKKyAgICBodHRwQnVmTGVuXyA9IDA7CisgIH0KKyAgaHR0cFBvc18gPSAwOworICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOworfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWZpbGwoKSB7CisgIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87CisgIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKKyAgICBodHRwQnVmU2l6ZV8gKj0gMjsKKyAgICBjaGFyKiB0bXBCdWYgPSAoY2hhciopc3RkOjpyZWFsbG9jKGh0dHBCdWZfLCBodHRwQnVmU2l6ZV8gKyAxKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIGh0dHBCdWZfID0gdG1wQnVmOworICB9CisKKyAgLy8gUmVhZCBtb3JlIGRhdGEKKyAgdWludDMyX3QgZ290ID0gdHJhbnNwb3J0Xy0+cmVhZCgodWludDhfdCopKGh0dHBCdWZfICsgaHR0cEJ1Zkxlbl8pLCBodHRwQnVmU2l6ZV8gLSBodHRwQnVmTGVuXyk7CisgIGh0dHBCdWZMZW5fICs9IGdvdDsKKyAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKKworICBpZiAoZ290ID09IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKKyAgfQorfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkSGVhZGVycygpIHsKKyAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcworICBjb250ZW50TGVuZ3RoXyA9IDA7CisgIGNodW5rZWRfID0gZmFsc2U7CisgIGNodW5rZWREb25lXyA9IGZhbHNlOworICBjaHVua1NpemVfID0gMDsKKworICAvLyBDb250cm9sIHN0YXRlIGZsb3cKKyAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOworCisgIC8vIExvb3AgdW50aWwgaGVhZGVycyBhcmUgZmluaXNoZWQKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKKworICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgeworICAgICAgaWYgKGZpbmlzaGVkKSB7CisgICAgICAgIHJlYWRIZWFkZXJzXyA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBNdXN0IGhhdmUgYmVlbiBhbiBIVFRQIDEwMCwga2VlcCBnb2luZyBmb3IgYW5vdGhlciBzdGF0dXMgbGluZQorICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKKyAgICAgICAgc3RhdHVzTGluZSA9IGZhbHNlOworICAgICAgICBmaW5pc2hlZCA9IHBhcnNlU3RhdHVzTGluZShsaW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmLCBsZW4pOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBUSHR0cFRyYW5zcG9ydDo6Z2V0T3JpZ2luKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICBpZiAoIW9yaWdpbl8uZW1wdHkoKSkgeworICAgIG9zcyA8PCBvcmlnaW5fIDw8ICIsICI7CisgIH0KKyAgb3NzIDw8IHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOworICByZXR1cm4gb3NzLnN0cigpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGhyaWZ0IHRyYW5zcG9ydC4gVGhpcyB3YXMgaXJyaXRhdGluZworICogdG8gd3JpdGUsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIGluIEMrKyBsYW5kIGFyZSBkYXVudGluZy4gTGlua2luZyBDVVJMCisgKiByZXF1aXJlcyAyMyBkeW5hbWljIGxpYnJhcmllcyBsYXN0IHRpbWUgSSBjaGVja2VkIChXVEY/IT8pLiBBbGwgd2UgaGF2ZQorICogaGVyZSBpcyBhIFZFUlkgYmFzaWMgSFRUUC8xLjEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIEhUVFAgMTAwIENvbnRpbnVlLAorICogY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZywga2VlcGFsaXZlLCBldGMuIFRlc3RlZCBhZ2FpbnN0IEFwYWNoZS4KKyAqLworY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEh0dHBUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CisKKyAgdmlydHVhbCB+VEh0dHBUcmFuc3BvcnQoKTsKKworICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7IHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3QgcmVhZEVuZCgpOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKKworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBzdGQ6OnN0cmluZyBvcmlnaW5fOworCisgIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOworICBUTWVtb3J5QnVmZmVyIHJlYWRCdWZmZXJfOworCisgIGJvb2wgcmVhZEhlYWRlcnNfOworICBib29sIGNodW5rZWRfOworICBib29sIGNodW5rZWREb25lXzsKKyAgdWludDMyX3QgY2h1bmtTaXplXzsKKyAgdWludDMyX3QgY29udGVudExlbmd0aF87CisKKyAgY2hhciogaHR0cEJ1Zl87CisgIHVpbnQzMl90IGh0dHBQb3NfOworICB1aW50MzJfdCBodHRwQnVmTGVuXzsKKyAgdWludDMyX3QgaHR0cEJ1ZlNpemVfOworCisgIHZpcnR1YWwgdm9pZCBpbml0KCk7CisKKyAgdWludDMyX3QgcmVhZE1vcmVEYXRhKCk7CisgIGNoYXIqIHJlYWRMaW5lKCk7CisKKyAgdm9pZCByZWFkSGVhZGVycygpOworICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSA9IDA7CisKKyAgdWludDMyX3QgcmVhZENodW5rZWQoKTsKKyAgdm9pZCByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKKyAgdWludDMyX3QgcGFyc2VDaHVua1NpemUoY2hhciogbGluZSk7CisKKyAgdWludDMyX3QgcmVhZENvbnRlbnQodWludDMyX3Qgc2l6ZSk7CisKKyAgdm9pZCByZWZpbGwoKTsKKyAgdm9pZCBzaGlmdCgpOworCisgIHN0YXRpYyBjb25zdCBjaGFyKiBDUkxGOworICBzdGF0aWMgY29uc3QgaW50IENSTEZfTEVOOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWM1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIE5vbmJsb2NraW5nIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgorICovCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoYWRkcmVzcywgcG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiB0U1NMU29ja2V0OworICB0U1NMU29ja2V0ID0gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB0U1NMU29ja2V0LT5zZXRMaWJldmVudFNhZmUoKTsKKyAgcmV0dXJuIHRTU0xTb2NrZXQ7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0IDogcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzRjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgbGlzdGVuUG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6flROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIAorICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fS0VFUEFMSVZFICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjaworICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKKyNpZm5kZWYgVENQX05PUFVTSAorICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0xPV19NSU5fUlRPICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CisgICAgY2hhciBlcnJidWZbMTAyNF07CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRMaXN0ZW5Qb3J0KCkgeworICByZXR1cm4gbGlzdGVuUG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgeworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKKyAgfQorICAKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKKyAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CisKKyAgaWYgKGNsaWVudFNvY2tldCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgY2xpZW50LT5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKyAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIHNpemUpOworCisgIGlmIChhY2NlcHRDYWxsYmFja18pCisgICAgYWNjZXB0Q2FsbGJhY2tfKGNsaWVudFNvY2tldCk7CisKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBsaXN0ZW5pbmdfID0gZmFsc2U7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU29ja2V0OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKworICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bml4IHNvY2tldHMuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIGZvciB1bml4IHNvY2tldC4KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KCk7CisKKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CisKKyAgdm9pZCBzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKTsKKworICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOworICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOworCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7IGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7IH0KKworICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOworICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOworCisgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRMaXN0ZW5DYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBsaXN0ZW5DYWxsYmFjaykgeyBsaXN0ZW5DYWxsYmFja18gPSBsaXN0ZW5DYWxsYmFjazsgfQorCisgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CisKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKworICBpbnQgZ2V0UG9ydCgpOworICAKKyAgaW50IGdldExpc3RlblBvcnQoKTsKKworICB2b2lkIGxpc3RlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKworcHJpdmF0ZToKKyAgaW50IHBvcnRfOworICBpbnQgbGlzdGVuUG9ydF87CisgIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworICBpbnQgYWNjZXB0QmFja2xvZ187CisgIGludCBzZW5kVGltZW91dF87CisgIGludCByZWN2VGltZW91dF87CisgIGludCByZXRyeUxpbWl0XzsKKyAgaW50IHJldHJ5RGVsYXlfOworICBpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIGludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CisKKyAgc29ja2V0X2Z1bmNfdCBsaXN0ZW5DYWxsYmFja187CisgIHNvY2tldF9mdW5jX3QgYWNjZXB0Q2FsbGJhY2tfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCisgKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLiAgVGhlIHNlcnZlciBpcyBleHBlY3RlZAorICogdG8ga2VlcCB0cmFjayBvZiBUVHJhbnNwb3J0IGNoaWxkcmVuIHRoYXQgaXQgY3JlYXRlcyBmb3IgcHVycG9zZXMgb2YKKyAqIGNvbnRyb2xsaW5nIHRoZWlyIGxpZmV0aW1lLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIH5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqIAorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldFBvcnQoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgZ2V0TGlzdGVuUG9ydCgpID0gMDsKKworICAvKioKKyAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworcHJvdGVjdGVkOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpID0gMDsKKworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4NDQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCkBAIC0wLDAgKzEsMzk4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisqIFRQaXBlIGltcGxlbWVudGF0aW9uLgorKi8KKworI2lmZGVmIF9XSU4zMgorCit1aW50MzJfdCBwaXBlX3JlYWQoSEFORExFIHBpcGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK3ZvaWQgcGlwZV93cml0ZShIQU5ETEUgcGlwZSwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCit1aW50MzJfdCBwc2V1ZG9fc3luY19yZWFkKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK3ZvaWQgcHNldWRvX3N5bmNfd3JpdGUoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCitjbGFzcyBUUGlwZUltcGwgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICBUUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIH5UUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSA9IDA7IC8vIGRvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSkge30KKyAgdmlydHVhbCBib29sIGlzQnVmZmVyZWREYXRhQXZhaWxhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9Cit9OworCitjbGFzcyBUTmFtZWRQaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgeworcHVibGljOgorICBleHBsaWNpdCBUTmFtZWRQaXBlSW1wbChUQXV0b0hhbmRsZSAmcGlwZWhhbmRsZSkgOiBQaXBlXyhwaXBlaGFuZGxlLnJlbGVhc2UoKSkge30KKyAgdmlydHVhbCB+VE5hbWVkUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByZXR1cm4gcHNldWRvX3N5bmNfcmVhZChQaXBlXy5oLCByZWFkX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcHNldWRvX3N5bmNfd3JpdGUoUGlwZV8uaCwgd3JpdGVfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7IFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUpOyB9CisKK3ByaXZhdGU6CisgIFRNYW51YWxSZXNldEV2ZW50IHJlYWRfZXZlbnRfOworICBUTWFudWFsUmVzZXRFdmVudCB3cml0ZV9ldmVudF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworfTsKKworY2xhc3MgVEFub25QaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgeworcHVibGljOgorICBUQW5vblBpcGVJbXBsKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KSA6IFBpcGVSZF8oUGlwZVJkKSwgUGlwZVdydF8oUGlwZVdydCkge30KKyAgdmlydHVhbCB+VEFub25QaXBlSW1wbCgpIHt9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gcGlwZV9yZWFkKFBpcGVSZF8uaCwgYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyBwaXBlX3dyaXRlKFBpcGVXcnRfLmgsIGJ1ZiwgbGVuKTsgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUmRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIFBpcGVSZCkgeyBQaXBlUmRfLnJlc2V0KFBpcGVSZCk7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXcnRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFIFBpcGVXcnQpIHsgUGlwZVdydF8ucmVzZXQoUGlwZVdydCk7IH0KKworcHJpdmF0ZToKKyAgVEF1dG9IYW5kbGUgUGlwZVJkXzsKKyAgVEF1dG9IYW5kbGUgUGlwZVdydF87Cit9OworCisvLyBJZiB5b3Ugd2FudCBhIHNlbGVjdC1saWtlIGxvb3AgdG8gd29yaywgdXNlIHRoaXMgc3ViY2xhc3MuICBCZSB3YXJuZWQuLi4KKy8vIHRoZSByZWFkIGltcGxlbWVudGF0aW9uIGhhcyBzZXZlcmFsIGNvbnRleHQgc3dpdGNoZXMsIHNvIHRoaXMgaXMgc2xvd2VyCisvLyB0aGFuIHVzaW5nIHRoZSByZWd1bGFyIG5hbWVkIHBpcGUgaW1wbGVtZW50YXRpb24KK2NsYXNzIFRXYWl0YWJsZU5hbWVkUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChUQXV0b0hhbmRsZSAmcGlwZWhhbmRsZSkKKyAgICA6IGJlZ2luX3VucmVhZF9pZHhfKDApLCBlbmRfdW5yZWFkX2lkeF8oMCkgeworICAgIHJlYWRPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpSRUFEOworICAgIHJlYWRPdmVybGFwXy5oID0gcGlwZWhhbmRsZS5oOworICAgIGNhbmNlbE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNBTkNFTElPOworICAgIGNhbmNlbE92ZXJsYXBfLmggPSBwaXBlaGFuZGxlLmg7CisgICAgYnVmZmVyXy5yZXNpemUoMTAyNCAvKmFyYml0cmFyeSBidWZmZXIgc2l6ZSovLCAnXDAnKTsKKyAgICBiZWdpbkFzeW5jUmVhZCgmYnVmZmVyX1swXSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl8uc2l6ZSgpKSk7CisgICAgUGlwZV8ucmVzZXQocGlwZWhhbmRsZS5yZWxlYXNlKCkpOworICB9CisgIHZpcnR1YWwgflRXYWl0YWJsZU5hbWVkUGlwZUltcGwoKSB7CisgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGFuIG91dHN0YW5kaW5nIHJlYWQgcmVxdWVzdAorICAgIGlmIChiZWdpbl91bnJlYWRfaWR4XyA9PSBlbmRfdW5yZWFkX2lkeF8pIHsKKyAgICAgIC8vIGlmIHNvLCBjYW5jZWwgaXQsIGFuZCB3YWl0IGZvciB0aGUgZGVhZCBjb21wbGV0aW9uCisgICAgICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY2FuY2VsT3ZlcmxhcF8pOworICAgICAgcmVhZE92ZXJsYXBfLm92ZXJsYXBwZWRSZXN1bHRzKGZhbHNlIC8qaWdub3JlIGVycm9ycyovKTsKKyAgICB9CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcHNldWRvX3N5bmNfd3JpdGUoUGlwZV8uaCwgd3JpdGVfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7IFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUpOyB9CisgIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHsgcmV0dXJuIGJlZ2luX3VucmVhZF9pZHhfIDwgZW5kX3VucmVhZF9pZHhfOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiByZWFkeV9ldmVudF8uaDsgfQorCitwcml2YXRlOgorICB2b2lkIGJlZ2luQXN5bmNSZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgZW5kQXN5bmNSZWFkKCk7CisKKyAgVEF1dG9PdmVybGFwVGhyZWFkIHRocmVhZF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIHJlYWRPdmVybGFwXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBjYW5jZWxPdmVybGFwXzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgcmVhZHlfZXZlbnRfOworICBUTWFudWFsUmVzZXRFdmVudCB3cml0ZV9ldmVudF87CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcl87CisgIHVpbnQzMl90IGJlZ2luX3VucmVhZF9pZHhfOworICB1aW50MzJfdCBlbmRfdW5yZWFkX2lkeF87Cit9OworCit2b2lkIFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OmJlZ2luQXN5bmNSZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGJlZ2luX3VucmVhZF9pZHhfID0gZW5kX3VucmVhZF9pZHhfID0gMDsKKyAgcmVhZE92ZXJsYXBfLnJlc2V0KGJ1ZiwgbGVuLCByZWFkeV9ldmVudF8uaCk7CisgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZyZWFkT3ZlcmxhcF8pOworICBpZiAocmVhZE92ZXJsYXBfLnN1Y2Nlc3MgPT0gRkFMU0UgJiYgcmVhZE92ZXJsYXBfLmxhc3RfZXJyb3IgIT0gRVJST1JfSU9fUEVORElORykgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6UmVhZEZpbGUgZXJyb3JlZCBHTEU9IiwgcmVhZE92ZXJsYXBfLmxhc3RfZXJyb3IpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiBSZWFkRmlsZSBmYWlsZWQiKTsKKyAgfQorfQorCit1aW50MzJfdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjplbmRBc3luY1JlYWQoKSB7CisgIHJldHVybiByZWFkT3ZlcmxhcF8ub3ZlcmxhcHBlZFJlc3VsdHMoKTsKK30KKwordWludDMyX3QgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gPT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgZW5kX3VucmVhZF9pZHhfID0gZW5kQXN5bmNSZWFkKCk7CisgIH0KKworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOworICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOworICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OworICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gIT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgYXNzZXJ0KGxlbiA9PSBieXRlc190b19jb3B5KTsKKyAgICAvLyB3ZSB3ZXJlIGFibGUgdG8gZnVsZmlsbCB0aGUgcmVhZCB3aXRoIGp1c3QgdGhlIGJ5dGVzIGluIG91cgorICAgIC8vIGJ1ZmZlciwgYW5kIHdlIHN0aWxsIGhhdmUgYnVmZmVyIGxlZnQKKyAgICByZXR1cm4gYnl0ZXNfdG9fY29weTsKKyAgfQorICB1aW50MzJfdCBieXRlc19jb3BpZWQgPSBieXRlc190b19jb3B5OworCisgIC8vIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGJlZW4gcmVhZC4gIEtpY2sgb2ZmIGFuIGFzeW5jIHJlYWQgZm9yIHRoZSBuZXh0IHJvdW5kLgorICBiZWdpbkFzeW5jUmVhZCgmYnVmZmVyX1swXSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl8uc2l6ZSgpKSk7CisKKyAgcmV0dXJuIGJ5dGVzX2NvcGllZDsKK30KKwordm9pZCBwc2V1ZG9fc3luY193cml0ZShIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOworICBtZW1zZXQoJnRlbXBPdmVybGFwLCAwLCBzaXplb2YodGVtcE92ZXJsYXApKTsKKyAgdGVtcE92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CisKKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgQk9PTCByZXN1bHQgPSA6OldyaXRlRmlsZShwaXBlLCBidWYgKyB3cml0dGVuLCBsZW4gLSB3cml0dGVuLCBOVUxMLCAmdGVtcE92ZXJsYXApOworCisgICAgaWYgKHJlc3VsdCA9PSBGQUxTRSAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6V3JpdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IHdyaXRlIGZhaWxlZCIpOworICAgIH0KKworICAgIERXT1JEIGJ5dGVzID0gMDsKKyAgICByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQocGlwZSwgJnRlbXBPdmVybGFwLCAmYnl0ZXMsIFRSVUUpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgICB9CisgICAgd3JpdHRlbiArPSBieXRlczsKKyAgfQorfQorCit1aW50MzJfdCBwc2V1ZG9fc3luY19yZWFkKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIE9WRVJMQVBQRUQgdGVtcE92ZXJsYXA7CisgIG1lbXNldCgmdGVtcE92ZXJsYXAsIDAsIHNpemVvZih0ZW1wT3ZlcmxhcCkpOworICB0ZW1wT3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKKworICBCT09MIHJlc3VsdCA9IDo6UmVhZEZpbGUocGlwZSwgYnVmLCBsZW4sIE5VTEwsICZ0ZW1wT3ZlcmxhcCk7CisKKyAgaWYgKHJlc3VsdCA9PSBGQUxTRSAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OlJlYWRGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiByZWFkIGZhaWxlZCIpOworICB9CisKKyAgRFdPUkQgYnl0ZXMgPSAwOworICByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQocGlwZSwgJnRlbXBPdmVybGFwLCAmYnl0ZXMsIFRSVUUpOworICBpZiAoIXJlc3VsdCkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6R2V0T3ZlcmxhcHBlZFJlc3VsdCBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKKy8vLS0tLSBDb25zdHJ1Y3RvcnMgLS0tLQorVFBpcGU6OlRQaXBlKFRBdXRvSGFuZGxlICZQaXBlKQorICA6IGltcGxfKG5ldyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKFBpcGUpKSwgVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKK30KKworVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlKQorICA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKQoreworICBUQXV0b0hhbmRsZSBwaXBlSGFuZGxlKFBpcGUpOworICBpbXBsXy5yZXNldChuZXcgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChwaXBlSGFuZGxlKSk7Cit9CisKK1RQaXBlOjpUUGlwZShjb25zdCBjaGFyKiBwaXBlbmFtZSkgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Cit9CisKK1RQaXBlOjpUUGlwZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZTo6VFBpcGUoSEFORExFIFBpcGVSZCwgSEFORExFIFBpcGVXcnQpCisgIDogaW1wbF8obmV3IFRBbm9uUGlwZUltcGwoUGlwZVJkLCBQaXBlV3J0KSksIFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKK30KKworVFBpcGU6OlRQaXBlKCkgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworfQorCitUUGlwZTo6flRQaXBlKCkgeworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNwb3J0IGNhbGxiYWNrcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Jvb2wgVFBpcGU6OmlzT3BlbigpIHsKKyAgcmV0dXJuIGltcGxfLmdldCgpICE9IE5VTEw7Cit9CisKK2Jvb2wgVFBpcGU6OnBlZWsoKSB7CisgIHJldHVybiBpc09wZW4oKTsKK30KKwordm9pZCBUUGlwZTo6b3BlbigpIHsKKyAgaWYgKGlzT3BlbigpKQorICAgIHJldHVybjsKKworICBUQXV0b0hhbmRsZSBoUGlwZTsKKyAgZG8geworICAgIERXT1JEIGZsYWdzID0gRklMRV9GTEFHX09WRVJMQVBQRUQ7IC8vIGFzeW5jIG1vZGUsIHNvIHdlIGNhbiBkbyByZWFkcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHdyaXRlcworICAgIGhQaXBlLnJlc2V0KENyZWF0ZUZpbGVBKHBpcGVuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgLy8gbm8gc2hhcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIC8vIG9wZW5zIGV4aXN0aW5nIHBpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7IC8vIG5vIHRlbXBsYXRlIGZpbGUKKworICAgIGlmIChoUGlwZS5oICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MhCisKKyAgICBpZiAoOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9QSVBFX0JVU1kpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlOjpvcGVuIDo6Q3JlYXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJVbmFibGUgdG8gb3BlbiBwaXBlIik7CisgICAgfQorICB9IHdoaWxlICg6OldhaXROYW1lZFBpcGVBKHBpcGVuYW1lXy5jX3N0cigpLCBUaW1lb3V0U2Vjb25kc18gKiAxMDAwKSk7CisKKyAgaWYgKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZTo6b3BlbiA6OkNyZWF0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlVuYWJsZSB0byBvcGVuIHBpcGUiKTsKKyAgfQorCisgIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlSW1wbChoUGlwZSkpOworfQorCit2b2lkIFRQaXBlOjpjbG9zZSgpIHsKKyAgaW1wbF8ucmVzZXQoKTsKK30KKwordWludDMyX3QgVFBpcGU6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKCFpc09wZW4oKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZSIpOworICByZXR1cm4gaW1wbF8tPnJlYWQoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBwaXBlX3JlYWQoSEFORExFIHBpcGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIERXT1JEIGNiUmVhZDsKKyAgaW50IGZTdWNjZXNzID0gUmVhZEZpbGUocGlwZSwgICAgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAgICAgLy8gYnVmZmVyIHRvIHJlY2VpdmUgcmVwbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgLy8gc2l6ZSBvZiBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNiUmVhZCwgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgLy8gbm90IG92ZXJsYXBwZWQKKworICBpZiAoIWZTdWNjZXNzICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX01PUkVfREFUQSkKKyAgICByZXR1cm4gMDsgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCisKKyAgcmV0dXJuIGNiUmVhZDsKK30KKwordm9pZCBUUGlwZTo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKCFpc09wZW4oKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUiKTsKKyAgaW1wbF8tPndyaXRlKGJ1ZiwgbGVuKTsKK30KKwordm9pZCBwaXBlX3dyaXRlKEhBTkRMRSBwaXBlLCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBEV09SRCBjYldyaXR0ZW47CisgIGludCBmU3VjY2VzcyA9IFdyaXRlRmlsZShwaXBlLCAgICAgICAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAgICAgICAgLy8gbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgICAgLy8gbWVzc2FnZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYldyaXR0ZW4sIC8vIGJ5dGVzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgIC8vIG5vdCBvdmVybGFwcGVkCisKKyAgaWYgKCFmU3VjY2VzcykKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiV3JpdGUgdG8gcGlwZSBmYWlsZWQiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFjY2Vzc29ycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RkOjpzdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgeworICByZXR1cm4gcGlwZW5hbWVfOworfQorCit2b2lkIFRQaXBlOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKKyAgZWxzZQorICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOworfQorCitIQU5ETEUgVFBpcGU6OmdldFBpcGVIYW5kbGUoKSB7CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldFBpcGVIYW5kbGUoKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCit2b2lkIFRQaXBlOjpzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7CisgIGlmIChpc0Fub255bW91c18pCisgICAgaW1wbF8tPnNldFBpcGVIYW5kbGUocGlwZWhhbmRsZSk7CisgIGVsc2UKKyAgeworICAgIFRBdXRvSGFuZGxlIHBpcGUocGlwZWhhbmRsZSk7CisgICAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVJbXBsKHBpcGUpKTsKKyAgfQorfQorCitIQU5ETEUgVFBpcGU6OmdldFdydFBpcGVIYW5kbGUoKSB7CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldFdydFBpcGVIYW5kbGUoKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCit2b2lkIFRQaXBlOjpzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+c2V0V3J0UGlwZUhhbmRsZShwaXBlaGFuZGxlKTsKK30KKworSEFORExFIFRQaXBlOjpnZXROYXRpdmVXYWl0SGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXROYXRpdmVXYWl0SGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworbG9uZyBUUGlwZTo6Z2V0Q29ublRpbWVvdXQoKSB7CisgIHJldHVybiBUaW1lb3V0U2Vjb25kc187Cit9CisKK3ZvaWQgVFBpcGU6OnNldENvbm5UaW1lb3V0KGxvbmcgc2Vjb25kcykgeworICBUaW1lb3V0U2Vjb25kc18gPSBzZWNvbmRzOworfQorCisjZW5kaWYgLy9fV0lOMzIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTRmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UUElQRV9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UUElQRV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogV2luZG93cyBQaXBlcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKiBEb24ndCBkZXN0cm95IGEgVFBpcGUgYXQgZ2xvYmFsIHNjb3BlLCBhcyB0aGF0IHdpbGwgY2F1c2UgYSB0aHJlYWQgam9pbgorICogZHVyaW5nIERMTE1haW4uICBUaGF0IGFsc28gbWVhbnMgdGhhdCBjbGllbnQgb2JqZWN0cyB1c2luZyBUUGlwZSBzaG91bGRuJ3QgYmUgYXQgZ2xvYmFsCisgKiBzY29wZS4KKyAqLworI2lmZGVmIF9XSU4zMgorY2xhc3MgVFBpcGVJbXBsOworCitjbGFzcyBUUGlwZSA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUUGlwZT4geworcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHBpcGUgb2JqZWN0LgorICBUUGlwZSgpOworICAvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9ycyAtCisgIGV4cGxpY2l0IFRQaXBlKEhBTkRMRSBQaXBlKTsgICAgICAgLy8gSEFORExFIGlzIGEgdm9pZCoKKyAgZXhwbGljaXQgVFBpcGUoVEF1dG9IYW5kbGUmIFBpcGUpOyAvLyB0aGlzIGN0b3Igd2lsbCBjbGVhciBvdXQgLyBtb3ZlIGZyb20gUGlwZQorICAvLyBuZWVkIGEgY29uc3QgY2hhciAqIG92ZXJsb2FkIHNvIHN0cmluZyBsaXRlcmFscyBkb24ndCBnbyB0byB0aGUgSEFORExFIG92ZXJsb2FkCisgIGV4cGxpY2l0IFRQaXBlKGNvbnN0IGNoYXIqIHBpcGVuYW1lKTsKKyAgZXhwbGljaXQgVFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKKyAgLy8gQW5vbnltb3VzIHBpcGUgLQorICBUUGlwZShIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCk7CisKKyAgLy8gRGVzdHJveXMgdGhlIHBpcGUgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgdmlydHVhbCB+VFBpcGUoKTsKKworICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBpcGUgaXMgb3BlbiAmIHZhbGlkLgorICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCk7CisKKyAgLy8gQ2hlY2tzIHdoZXRoZXIgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgcGlwZS4KKyAgdmlydHVhbCBib29sIHBlZWsoKTsKKworICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgbmFtZWQvYW5vbnltb3VzIHBpcGUuCisgIHZpcnR1YWwgdm9pZCBvcGVuKCk7CisKKyAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgcGlwZS4KKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgLy8gUmVhZHMgZnJvbSB0aGUgcGlwZS4KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvLyBXcml0ZXMgdG8gdGhlIHBpcGUuCisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLy8gQWNjZXNzb3JzCisgIHN0ZDo6c3RyaW5nIGdldFBpcGVuYW1lKCk7CisgIHZvaWQgc2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKKyAgSEFORExFIGdldFBpcGVIYW5kbGUoKTsgLy8gZG91YmxlcyBhcyB0aGUgcmVhZCBoYW5kbGUgZm9yIGFub24gcGlwZQorICB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpOworICBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpOworICB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpOworICBsb25nIGdldENvbm5UaW1lb3V0KCk7CisgIHZvaWQgc2V0Q29ublRpbWVvdXQobG9uZyBzZWNvbmRzKTsKKworICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZ2VuZXJpYyAvIHRlbXBsYXRlIHNpdHVhdGlvbnMsCisgIC8vIHNvIGl0cyBuYW1lIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIFRQaXBlU2VydmVyJ3MKKyAgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlSW1wbD4gaW1wbF87CisKKyAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOworCisgIGxvbmcgVGltZW91dFNlY29uZHNfOworICBib29sIGlzQW5vbnltb3VzXzsKK307CisKKyNlbHNlCit0eXBlZGVmIFRTb2NrZXQgVFBpcGU7CisjZW5kaWYKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UUElQRV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWMzNTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDxBY2NDdHJsLmg+CisjaW5jbHVkZSA8QWNsYXBpLmg+CisjZW5kaWYgLy9fV0lOMzIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisjaWZkZWYgX1dJTjMyCisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworY2xhc3MgVFBpcGVTZXJ2ZXJJbXBsIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgVFBpcGVTZXJ2ZXJJbXBsKCkge30KKyAgdmlydHVhbCB+VFBpcGVTZXJ2ZXJJbXBsKCkge30KKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBOVUxMOyB9Cit9OworCitjbGFzcyBUQW5vblBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFBpcGVTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgVEFub25QaXBlU2VydmVyKCkgeworICAgIC8vIFRoZSBhbm9ueW1vdXMgcGlwZSBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4KKyAgICAvLyBwYXNzIHRoZSBoYW5kbGVzIG9uIHRvIHRoZSBjbGllbnQgYmVmb3JlIHRoZSBzZXJ2ZSAoYWNjZXB0SW1wbCkKKyAgICAvLyBibG9ja2luZyBjYWxsLgorICAgIGlmICghY3JlYXRlQW5vblBpcGUoKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlKEFub24pUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkIik7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB+VEFub25QaXBlU2VydmVyKCkgeworICAgIFBpcGVSXy5yZXNldCgpOworICAgIFBpcGVXXy5yZXNldCgpOworICAgIENsaWVudEFub25SZWFkXy5yZXNldCgpOworICAgIENsaWVudEFub25Xcml0ZV8ucmVzZXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7fSAvLyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkCisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUl8uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVdfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeyByZXR1cm4gQ2xpZW50QW5vblJlYWRfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIENsaWVudEFub25Xcml0ZV8uaDsgfQorCitwcml2YXRlOgorICBib29sIGNyZWF0ZUFub25QaXBlKCk7CisKKyAgVEF1dG9IYW5kbGUgUGlwZVJfOyAvLyBBbm9ueW1vdXMgUGlwZSAoUikKKyAgVEF1dG9IYW5kbGUgUGlwZVdfOyAvLyBBbm9ueW1vdXMgUGlwZSAoVykKKworICAvLyBDbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgIC8vPyBEbyB3ZSBuZWVkIGR1cGxpY2F0ZXMgdG8gc2VuZCB0byBjbGllbnQ/CisgIFRBdXRvSGFuZGxlIENsaWVudEFub25SZWFkXzsKKyAgVEF1dG9IYW5kbGUgQ2xpZW50QW5vbldyaXRlXzsKK307CisKK2NsYXNzIFROYW1lZFBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFBpcGVTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgVE5hbWVkUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKQorICAgIDogc3RvcHBpbmdfKGZhbHNlKSwgcGlwZW5hbWVfKHBpcGVuYW1lKSwgYnVmc2l6ZV8oYnVmc2l6ZSksIG1heGNvbm5zXyhtYXhjb25uZWN0aW9ucykKKyAgeworICAgIGNvbm5lY3RPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDT05ORUNUOworICAgIGNhbmNlbE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNBTkNFTElPOworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIGluaXRpYXRlTmFtZWRDb25uZWN0KGxvY2spOworICB9CisgIHZpcnR1YWwgflROYW1lZFBpcGVTZXJ2ZXIoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQoKTsKKyAgICBpZiAoUGlwZV8uaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgc3RvcHBpbmdfID0gdHJ1ZTsKKyAgICAgIGNhbmNlbE92ZXJsYXBfLmggPSBQaXBlXy5oOworICAgICAgLy8gVGhpcyBzaG91bGQgd2FrZSB1cCBHZXRPdmVybGFwcGVkUmVzdWx0CisgICAgICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY2FuY2VsT3ZlcmxhcF8pOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBsaXN0ZW5fZXZlbnRfLmg7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBjcmVhdGVOYW1lZFBpcGUoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpOworICB2b2lkIGluaXRpYXRlTmFtZWRDb25uZWN0KGNvbnN0IFRBdXRvQ3JpdCAmbG9ja1Byb29mKTsKKworICBUQXV0b092ZXJsYXBUaHJlYWQgdGhyZWFkXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBjb25uZWN0T3ZlcmxhcF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY2FuY2VsT3ZlcmxhcF87CisKKyAgYm9vbCBzdG9wcGluZ187CisgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKKyAgdWludDMyX3QgYnVmc2l6ZV87CisgIHVpbnQzMl90IG1heGNvbm5zXzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgbGlzdGVuX2V2ZW50XzsKKworICBUQ3JpdGljYWxTZWN0aW9uIHBpcGVfcHJvdGVjdF87CisgIC8vIG9ubHkgcmVhZCBvciB3cml0ZSB0aGVzZSB2YXJpYWJsZXMgdW5kZXJuZWF0aCBhIGxvY2tlZCBwaXBlX3Byb3RlY3RfCisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZT4gY2FjaGVkX2NsaWVudF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworfTsKKworSEFORExFIFRQaXBlU2VydmVyOjpnZXROYXRpdmVXYWl0SGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXROYXRpdmVXYWl0SGFuZGxlKCk7CisgIHJldHVybiBOVUxMOworfQorCisvLy0tLS0gQ29uc3RydWN0b3JzIC0tLS0KK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUpCisgIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworICBzZXRNYXhDb25uZWN0aW9ucyhUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQpOworICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Cit9CisKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKQorICA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMobWF4Y29ubmVjdGlvbnMpOworICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Cit9CisKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIDogYnVmc2l6ZV8oMTAyNCksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworICBzZXRNYXhDb25uZWN0aW9ucyhUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQpOworICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Cit9CisKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihpbnQgYnVmc2l6ZSkgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoMSk7CisgIGltcGxfLnJlc2V0KG5ldyBUQW5vblBpcGVTZXJ2ZXIpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoKSA6IGJ1ZnNpemVfKDEwMjQpLCBpc0Fub255bW91c18odHJ1ZSkgeworICBzZXRNYXhDb25uZWN0aW9ucygxKTsKKyAgaW1wbF8ucmVzZXQobmV3IFRBbm9uUGlwZVNlcnZlcik7Cit9CisKKy8vLS0tLSBEZXN0cnVjdG9yIC0tLS0KK1RQaXBlU2VydmVyOjp+VFBpcGVTZXJ2ZXIoKSB7fQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNwb3J0IGNhbGxiYWNrcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgVFBpcGVTZXJ2ZXI6Omxpc3RlbigpIHsKKyAgaWYgKGlzQW5vbnltb3VzXykKKyAgICByZXR1cm47CisgIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlU2VydmVyKHBpcGVuYW1lXywgYnVmc2l6ZV8sIG1heGNvbm5zXykpOworfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRQaXBlU2VydmVyOjphY2NlcHRJbXBsKCkgeworICByZXR1cm4gaW1wbF8tPmFjY2VwdEltcGwoKTsKK30KKworc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUQW5vblBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7CisgIC8vIFRoaXMgMC1ieXRlIHJlYWQgc2VydmVzIG1lcmVseSBhcyBhIGJsb2NraW5nIGNhbGwuCisgIGJ5dGUgYnVmOworICBEV09SRCBicjsKKyAgaW50IGZTdWNjZXNzID0gUmVhZEZpbGUoUGlwZVJfLmgsIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsICAgICAvLyBidWZmZXIgdG8gcmVjZWl2ZSByZXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgLy8gc2l6ZSBvZiBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyLCAgICAgIC8vIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAvLyBub3Qgb3ZlcmxhcHBlZAorCisgIGlmICghZlN1Y2Nlc3MgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTU9SRV9EQVRBKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMiKTsKKyAgfQorICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVSXy5oLCBQaXBlV18uaCkpOworICByZXR1cm4gY2xpZW50OworfQorCit2b2lkIFROYW1lZFBpcGVTZXJ2ZXI6OmluaXRpYXRlTmFtZWRDb25uZWN0KGNvbnN0IFRBdXRvQ3JpdCAmbG9ja1Byb29mKSB7CisgIGlmIChzdG9wcGluZ18pCisgICAgcmV0dXJuOworICBpZiAoIWNyZWF0ZU5hbWVkUGlwZShsb2NrUHJvb2YpKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlTmFtZWRQaXBlIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFRQaXBlU2VydmVyIENyZWF0ZU5hbWVkUGlwZSBmYWlsZWQiKTsKKyAgfQorCisgIC8vIFRoZSBwcmlvciBjb25uZWN0aW9uIGhhcyBiZWVuIGhhbmRsZWQsIHNvIGNsb3NlIHRoZSBnYXRlCisgIFJlc2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKKyAgY29ubmVjdE92ZXJsYXBfLnJlc2V0KE5VTEwsIDAsIGxpc3Rlbl9ldmVudF8uaCk7CisgIGNvbm5lY3RPdmVybGFwXy5oID0gUGlwZV8uaDsKKyAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNvbm5lY3RPdmVybGFwXyk7CisKKyAgLy8gV2FpdCBmb3IgdGhlIGNsaWVudCB0byBjb25uZWN0OyBpZiBpdCBzdWNjZWVkcywgdGhlCisgIC8vIGZ1bmN0aW9uIHJldHVybnMgYSBub256ZXJvIHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAvLyB6ZXJvLCBHZXRMYXN0RXJyb3Igc2hvdWxkIHJldHVybiBFUlJPUl9QSVBFX0NPTk5FQ1RFRC4KKyAgaWYgKGNvbm5lY3RPdmVybGFwXy5zdWNjZXNzKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBjYWNoZWRfY2xpZW50Xy5yZXNldChuZXcgVFBpcGUoUGlwZV8pKTsKKyAgICAvLyBtYWtlIHN1cmUgcGVvcGxlIGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICBTZXRFdmVudChsaXN0ZW5fZXZlbnRfLmgpOworICAgIHJldHVybjsKKyAgfQorCisgIERXT1JEIGR3RXJyID0gY29ubmVjdE92ZXJsYXBfLmxhc3RfZXJyb3I7CisgIHN3aXRjaCAoZHdFcnIpIHsKKyAgY2FzZSBFUlJPUl9QSVBFX0NPTk5FQ1RFRDoKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJDbGllbnQgY29ubmVjdGVkLiIpOworICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KG5ldyBUUGlwZShQaXBlXykpOworICAgIC8vIG1ha2Ugc3VyZSBwZW9wbGUga25vdyB0aGF0IGEgY29ubmVjdGlvbiBpcyByZWFkeQorICAgIFNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CisgICAgcmV0dXJuOworICBjYXNlIEVSUk9SX0lPX1BFTkRJTkc6CisgICAgcmV0dXJuOyAvLyBhY2NlcHRJbXBsIHdpbGwgZG8gdGhlIGFwcHJvcHJpYXRlIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMKKyAgZGVmYXVsdDoKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIGZhaWxlZCwgR0xFPSIsIGR3RXJyKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIGZhaWxlZCIpOworICB9Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVE5hbWVkUGlwZVNlcnZlcjo6YWNjZXB0SW1wbCgpIHsKKyAgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIGlmIChjYWNoZWRfY2xpZW50Xy5nZXQoKSAhPSBOVUxMKSB7CisgICAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQ7CisgICAgICAvLyB6ZXJvIG91dCBjYWNoZWRfY2xpZW50LCBzaW5jZSB3ZSBhcmUgYWJvdXQgdG8gcmV0dXJuIGl0LgorICAgICAgY2xpZW50LnN3YXAoY2FjaGVkX2NsaWVudF8pOworCisgICAgICAvLyBraWNrIG9mZiB0aGUgbmV4dCBjb25uZWN0aW9uIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgIGluaXRpYXRlTmFtZWRDb25uZWN0KGxvY2spOworICAgICAgcmV0dXJuIGNsaWVudDsgLy8gc3VjY2VzcyEKKyAgICB9CisgIH0KKworICBpZiAoUGlwZV8uaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE5hbWVkUGlwZVNlcnZlcjogc29tZW9uZSBjYWxsZWQgYWNjZXB0IG9uIGEgY2xvc2VkIHBpcGUgc2VydmVyIik7CisgIH0KKworICBEV09SRCBkd0R1bW15ID0gMDsKKworICAvLyBGb3IgdGhlIG1vc3QgcGFydCwgUGlwZV8gc2hvdWxkIGJlIHByb3RlY3RlZCB3aXRoIHBpcGVfcHJvdGVjdF8uICBXZSBjYW4ndAorICAvLyByZWFzb25hYmx5IGRvIHRoYXQgaGVyZSB0aG91Z2ggd2l0aG91dCBicmVha2luZyBpbnRlcnJ1cHRhYmlsaXR5LiAgSG93ZXZlciwKKyAgLy8gdGhpcyBzaG91bGQgYmUgc2FmZSwgdGhvdWdoIEknbSBub3QgaGFwcHkgYWJvdXQgaXQuICBXZSBvbmx5IG5lZWQgdG8gZW5zdXJlCisgIC8vIHRoYXQgbm8gb25lIHdyaXRlcyAvIG1vZGlmaWVzIFBpcGVfLmggd2hpbGUgd2UgYXJlIHJlYWRpbmcgaXQuICBXZWxsLCB0aGUKKyAgLy8gb25seSB0d28gdGhpbmdzIHRoYXQgc2hvdWxkIGJlIG1vZGlmeWluZyBQaXBlXyBhcmUgYWNjZXB0SW1wbCwgdGhlCisgIC8vIGZ1bmN0aW9ucyBpdCBjYWxscywgYW5kIHRoZSBkZXN0cnVjdG9yLiAgVGhvc2UgdGhpbmdzIHNob3VsZG4ndCBiZSBydW4KKyAgLy8gY29uY3VycmVudGx5IGFueXdheS4gIFNvIHRoaXMgY2FsbCBpcyAncmVhbGx5JyBqdXN0IGEgcmVhZCB0aGF0IG1heSBoYXBwZW4KKyAgLy8gY29uY3VycmVudGx5IHdpdGggaW50ZXJydXB0LCBhbmQgdGhhdCBzaG91bGQgYmUgZmluZS4KKyAgaWYgKEdldE92ZXJsYXBwZWRSZXN1bHQoUGlwZV8uaCwgJmNvbm5lY3RPdmVybGFwXy5vdmVybGFwLCAmZHdEdW1teSwgVFJVRSkpIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJDbGllbnQgY29ubmVjdGVkLiIpOworICAgIHNoYXJlZF9wdHI8VFBpcGU+IGNsaWVudChuZXcgVFBpcGUoUGlwZV8pKTsKKyAgICAvLyBraWNrIG9mZiB0aGUgbmV4dCBjb25uZWN0aW9uIGJlZm9yZSByZXR1cm5pbmcKKyAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgICByZXR1cm4gY2xpZW50OyAvLyBzdWNjZXNzIQorICB9CisgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGFyZSBpbiBhbiBlcnJvciAvIHNodXRkb3duIGNhc2UKKyAgRFdPUkQgZ2xlID0gR2V0TGFzdEVycm9yKCk7IC8vIHNhdmUgZXJyb3IgYmVmb3JlIGRvaW5nIGNsZWFudXAKKyAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBHTEU9IiwgZ2xlKTsKKyAgaWYoZ2xlID09IEVSUk9SX09QRVJBVElPTl9BQk9SVEVEKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7ICAgIAkvLyBOZWVkZWQgdG8gaW5zdXJlIGNvbmN1cnJlbnQgdGhyZWFkIHRvIGJlIG91dCBvZiBpbnRlcnJ1cHQuCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIlRQaXBlU2VydmVyOiBzZXJ2ZXIgaW50ZXJ1cHRlZCIpOworICB9CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUUGlwZVNlcnZlcjogY2xpZW50IGNvbm5lY3Rpb24gZmFpbGVkIik7Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OmludGVycnVwdCgpIHsKKyAgaWYgKGltcGxfKQorICAgIGltcGxfLT5pbnRlcnJ1cHQoKTsKK30KKwordm9pZCBUUGlwZVNlcnZlcjo6Y2xvc2UoKSB7CisgIGltcGxfLnJlc2V0KCk7Cit9CisKK2Jvb2wgVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlKGNvbnN0IFRBdXRvQ3JpdCAmIC8qbG9ja1Byb29mKi8pIHsKKworICAvLyBXaW5kb3dzIC0gc2V0IHNlY3VyaXR5IHRvIGFsbG93IG5vbi1lbGV2YXRlZCBhcHBzCisgIC8vIHRvIGFjY2VzcyBwaXBlcyBjcmVhdGVkIGJ5IGVsZXZhdGVkIGFwcHMuCisgIFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSBTSURBdXRoV29ybGQgPSBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZOworICBQU0lEIGV2ZXJ5b25lX3NpZCA9IE5VTEw7CisgIEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCgKKyAgICAgICZTSURBdXRoV29ybGQsIDEsIFNFQ1VSSVRZX1dPUkxEX1JJRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJmV2ZXJ5b25lX3NpZCk7CisKKyAgRVhQTElDSVRfQUNDRVNTIGVhOworICBaZXJvTWVtb3J5KCZlYSwgc2l6ZW9mKEVYUExJQ0lUX0FDQ0VTUykpOworICBlYS5ncmZBY2Nlc3NQZXJtaXNzaW9ucyA9IFNQRUNJRklDX1JJR0hUU19BTEwgfCBTVEFOREFSRF9SSUdIVFNfQUxMOworICBlYS5ncmZBY2Nlc3NNb2RlID0gU0VUX0FDQ0VTUzsKKyAgZWEuZ3JmSW5oZXJpdGFuY2UgPSBOT19JTkhFUklUQU5DRTsKKyAgZWEuVHJ1c3RlZS5UcnVzdGVlRm9ybSA9IFRSVVNURUVfSVNfU0lEOworICBlYS5UcnVzdGVlLlRydXN0ZWVUeXBlID0gVFJVU1RFRV9JU19XRUxMX0tOT1dOX0dST1VQOworICBlYS5UcnVzdGVlLnB0c3RyTmFtZSA9IHN0YXRpY19jYXN0PExQVFNUUj4oZXZlcnlvbmVfc2lkKTsKKworICBQQUNMIGFjbCA9IE5VTEw7CisgIFNldEVudHJpZXNJbkFjbCgxLCAmZWEsIE5VTEwsICZhY2wpOworCisgIFBTRUNVUklUWV9ERVNDUklQVE9SIHNkID0gKFBTRUNVUklUWV9ERVNDUklQVE9SKUxvY2FsQWxsb2MoTFBUUiwgU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKTsKKyAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTik7CisgIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woc2QsIFRSVUUsIGFjbCwgRkFMU0UpOworCisgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7CisgIHNhLm5MZW5ndGggPSBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyk7CisgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gc2Q7CisgIHNhLmJJbmhlcml0SGFuZGxlID0gRkFMU0U7CisKKyAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCisgIFRBdXRvSGFuZGxlIGhQaXBlKENyZWF0ZU5hbWVkUGlwZUEocGlwZW5hbWVfLmNfc3RyKCksICAgIC8vIHBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCB8ICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAvLyBhc3luYyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX0JZVEUgfCAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y29ubnNfLCAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGltZS1vdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2EpKTsgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkgYXR0cmlidXRlcworCisgIERXT1JEIGxhc3RFcnJvciA9IEdldExhc3RFcnJvcigpOworICBMb2NhbEZyZWUoc2QpOworICBMb2NhbEZyZWUoYWNsKTsKKyAgRnJlZVNpZChldmVyeW9uZV9zaWQpOworCisgIGlmIChoUGlwZS5oID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgUGlwZV8ucmVzZXQoKTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlcjo6VENyZWF0ZU5hbWVkUGlwZSgpIEdMRT0iLCBsYXN0RXJyb3IpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVENyZWF0ZU5hbWVkUGlwZSgpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgbGFzdEVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBQaXBlXy5yZXNldChoUGlwZS5yZWxlYXNlKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUQW5vblBpcGVTZXJ2ZXI6OmNyZWF0ZUFub25QaXBlKCkgeworICBTRUNVUklUWV9BVFRSSUJVVEVTIHNhOworICBTRUNVUklUWV9ERVNDUklQVE9SIHNkOyAvLyBzZWN1cml0eSBpbmZvcm1hdGlvbiBmb3IgcGlwZXMKKworICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCZzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTik7CisgIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woJnNkLCB0cnVlLCBOVUxMLCBmYWxzZSk7CisgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gJnNkOworICBzYS5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOworICBzYS5iSW5oZXJpdEhhbmRsZSA9IHRydWU7IC8vIGFsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCisKKyAgSEFORExFIENsaWVudEFub25SZWFkSCwgUGlwZVdfSCwgQ2xpZW50QW5vbldyaXRlSCwgUGlwZV9IOworICBpZiAoIUNyZWF0ZVBpcGUoJkNsaWVudEFub25SZWFkSCwgJlBpcGVXX0gsICZzYSwgMCkpIC8vIGNyZWF0ZSBzdGRpbiBwaXBlCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ3JlYXRlUGlwZSgmUGlwZV9ILCAmQ2xpZW50QW5vbldyaXRlSCwgJnNhLCAwKSkgLy8gY3JlYXRlIHN0ZG91dCBwaXBlCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgQ2xvc2VIYW5kbGUoQ2xpZW50QW5vblJlYWRIKTsKKyAgICBDbG9zZUhhbmRsZShQaXBlV19IKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBDbGllbnRBbm9uUmVhZF8ucmVzZXQoQ2xpZW50QW5vblJlYWRIKTsKKyAgQ2xpZW50QW5vbldyaXRlXy5yZXNldChDbGllbnRBbm9uV3JpdGVIKTsKKyAgUGlwZVJfLnJlc2V0KFBpcGVfSCk7CisgIFBpcGVXXy5yZXNldChQaXBlV19IKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFjY2Vzc29ycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0ZDo6c3RyaW5nIFRQaXBlU2VydmVyOjpnZXRQaXBlbmFtZSgpIHsKKyAgcmV0dXJuIHBpcGVuYW1lXzsKK30KKwordm9pZCBUUGlwZVNlcnZlcjo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7CisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CisgIGVsc2UKKyAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKK30KKworaW50IFRQaXBlU2VydmVyOjpnZXRCdWZmZXJTaXplKCkgeworICByZXR1cm4gYnVmc2l6ZV87Cit9Cit2b2lkIFRQaXBlU2VydmVyOjpzZXRCdWZmZXJTaXplKGludCBidWZzaXplKSB7CisgIGJ1ZnNpemVfID0gYnVmc2l6ZTsKK30KKworSEFORExFIFRQaXBlU2VydmVyOjpnZXRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFdydFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRXcnRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldENsaWVudFdydFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitib29sIFRQaXBlU2VydmVyOjpnZXRBbm9ueW1vdXMoKSB7CisgIHJldHVybiBpc0Fub255bW91c187Cit9Cit2b2lkIFRQaXBlU2VydmVyOjpzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKSB7CisgIGlzQW5vbnltb3VzXyA9IGFub247Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldE1heENvbm5lY3Rpb25zKHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKSB7CisgIGlmIChtYXhjb25uZWN0aW9ucyA9PSAwKQorICAgIG1heGNvbm5zXyA9IDE7CisgIGVsc2UgaWYgKG1heGNvbm5lY3Rpb25zID4gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKQorICAgIG1heGNvbm5zXyA9IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUzsKKyAgZWxzZQorICAgIG1heGNvbm5zXyA9IG1heGNvbm5lY3Rpb25zOworfQorCisjZW5kaWYgLy9fV0lOMzIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjEzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKKworI2RlZmluZSBUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBXaW5kb3dzIFBpcGVzIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuCisgKiBEb24ndCBkZXN0cm95IGEgVFBpcGVTZXJ2ZXIgYXQgZ2xvYmFsIHNjb3BlLCBhcyB0aGF0IHdpbGwgY2F1c2UgYSB0aHJlYWQgam9pbgorICogZHVyaW5nIERMTE1haW4uICBUaGF0IGFsc28gbWVhbnMgdGhhdCBUU2VydmVyJ3MgdXNpbmcgVFBpcGVTZXJ2ZXIgc2hvdWxkbid0IGJlIGF0IGdsb2JhbAorICogc2NvcGUuCisgKi8KKyNpZmRlZiBfV0lOMzIKK2NsYXNzIFRQaXBlU2VydmVySW1wbDsKK2NsYXNzIFRQaXBlOworCitjbGFzcyBUUGlwZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3JzCisgIC8vIE5hbWVkIFBpcGUgLQorICBUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUpOworICBUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKTsKKyAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKKyAgLy8gQW5vbnltb3VzIHBpcGUgLQorICBUUGlwZVNlcnZlcihpbnQgYnVmc2l6ZSk7CisgIFRQaXBlU2VydmVyKCk7CisKKyAgLy8gRGVzdHJ1Y3RvcgorICB2aXJ0dWFsIH5UUGlwZVNlcnZlcigpOworCisgIC8vIFN0YW5kYXJkIHRyYW5zcG9ydCBjYWxsYmFja3MKKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpOworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpOworCisgIC8vIEFjY2Vzc29ycworICBzdGQ6OnN0cmluZyBnZXRQaXBlbmFtZSgpOworICB2b2lkIHNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIGludCBnZXRCdWZmZXJTaXplKCk7CisgIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgYnVmc2l6ZSk7CisgIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vIE5hbWVkIFBpcGUgUi9XIC1vci0gQW5vbnltb3VzIHBpcGUgUmVhZCBoYW5kbGUKKyAgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKTsKKyAgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpOworICBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpOworICBib29sIGdldEFub255bW91cygpOworICB2b2lkIHNldEFub255bW91cyhib29sIGFub24pOworICB2b2lkIHNldE1heENvbm5lY3Rpb25zKHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKTsKKworICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZ2VuZXJpYyAvIHRlbXBsYXRlIHNpdHVhdGlvbnMsCisgIC8vIHNvIGl0cyBuYW1lIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIFRQaXBlJ3MKKyAgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZVNlcnZlckltcGw+IGltcGxfOworCisgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKKyAgdWludDMyX3QgYnVmc2l6ZV87CisgIHVpbnQzMl90IG1heGNvbm5zXzsKKyAgYm9vbCBpc0Fub255bW91c187Cit9OworI2Vsc2UgLy9fV0lOMzIKKy8vKk5JWCBuYW1lZCBwaXBlIGltcGxlbWVudGF0aW9uIHVzZXMgZG9tYWluIHNvY2tldAordHlwZWRlZiBUU2VydmVyU29ja2V0IFRQaXBlU2VydmVyOworI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDYwNWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgorICovCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFRTZXJ2ZXJTb2NrZXQoYWRkcmVzcywgcG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCkgeworICBpZiAoaW50ZXJydXB0YWJsZUNoaWxkcmVuXykgeworICAgICAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50LCBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXyk7CisKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCk7CisgIH0KK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NWRlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKKy8qKgorICogU2VydmVyIHNvY2tldCB0aGF0IGFjY2VwdHMgU1NMIGNvbm5lY3Rpb25zLgorICovCitjbGFzcyBUU1NMU2VydmVyU29ja2V0IDogcHVibGljIFRTZXJ2ZXJTb2NrZXQgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVFNTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGU5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCkBAIC0wLDAgKzEsMTExOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSURfQkVGT1JFICAgIDB4MTAwMDAwMDBMCisjZGVmaW5lIE9QRU5TU0xfRU5HSU5FX0NMRUFOVVBfUkVRVUlSRURfQkVGT1JFIDB4MTAxMDAwMDBMCisKKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfYXJyYXkuaHBwPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfRU5HSU5FX0NMRUFOVVBfUkVRVUlSRURfQkVGT1JFKQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgc3RkOjpzdHJpbmc7CisKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CisgIE11dGV4IG11dGV4OworfTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvLyBPcGVuU1NMIGluaXRpYWxpemF0aW9uL2NsZWFudXAKKworc3RhdGljIGJvb2wgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7CitzdGF0aWMgYm9vc3Q6OnNoYXJlZF9hcnJheTxNdXRleD4gbXV0ZXhlczsKKworc3RhdGljIHZvaWQgY2FsbGJhY2tMb2NraW5nKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciosIGludCkgeworICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgLy8gYXNzZXJ0aW9uIG9mIChweCAhPSAwKSBoZXJlIHR5cGljYWxseSBtZWFucyB0aGF0IGEgVFNTTFNvY2tldCdzIGxpZmV0aW1lCisgICAgLy8gZXhjZWVkZWQgdGhlIGxpZmV0aW1lIG9mIHRoZSBUU1NMU29ja2V0RmFjdG9yeSB0aGF0IGNyZWF0ZWQgaXQsIGFuZCB0aGUKKyAgICAvLyBUU1NMU29ja2V0RmFjdG9yeSBhbHJlYWR5IHJhbiBjbGVhbnVwT3BlblNTTCgpLCB3aGljaCBkZWxldGVkICJtdXRleGVzIi4KKyAgICBtdXRleGVzW25dLmxvY2soKTsKKyAgfSBlbHNlIHsKKyAgICBtdXRleGVzW25dLnVubG9jaygpOworICB9Cit9CisKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSURfQkVGT1JFKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsbGJhY2tUaHJlYWRJRCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKUdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXB0aHJlYWRfc2VsZigpOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIENSWVBUT19keW5sb2NrX3ZhbHVlKiBkeW5fY3JlYXRlKGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgcmV0dXJuIG5ldyBDUllQVE9fZHlubG9ja192YWx1ZTsKK30KKworc3RhdGljIHZvaWQgZHluX2xvY2soaW50IG1vZGUsIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgeworICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgbG9jay0+bXV0ZXgubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICBsb2NrLT5tdXRleC51bmxvY2soKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgZHluX2Rlc3Ryb3koc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlKiBsb2NrLCBjb25zdCBjaGFyKiwgaW50KSB7CisgIGRlbGV0ZSBsb2NrOworfQorCit2b2lkIGluaXRpYWxpemVPcGVuU1NMKCkgeworICBpZiAob3BlblNTTEluaXRpYWxpemVkKSB7CisgICAgcmV0dXJuOworICB9CisgIG9wZW5TU0xJbml0aWFsaXplZCA9IHRydWU7CisgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCisgIC8vIHN0YXRpYyBsb2NraW5nCisgIC8vIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wgY2hhbmdlZCBDUllQVE9fbnVtX2xvY2tzIC0gc2VlIFRIUklGVC0zODc4CisjaWZkZWYgQ1JZUFRPX251bV9sb2NrcworICBtdXRleGVzID0gYm9vc3Q6OnNoYXJlZF9hcnJheTxNdXRleD4obmV3IE11dGV4W0NSWVBUT19udW1fbG9ja3MoKV0pOworI2Vsc2UKKyAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFsgOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKKyNlbmRpZgorCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSkKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhjYWxsYmFja1RocmVhZElEKTsKKyNlbmRpZgorCisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhjYWxsYmFja0xvY2tpbmcpOworCisgIC8vIGR5bmFtaWMgbG9ja2luZworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGR5bl9jcmVhdGUpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhkeW5fbG9jayk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGR5bl9kZXN0cm95KTsKK30KKwordm9pZCBjbGVhbnVwT3BlblNTTCgpIHsKKyAgaWYgKCFvcGVuU1NMSW5pdGlhbGl6ZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgLy8gaHR0cHM6Ly93aWtpLm9wZW5zc2wub3JnL2luZGV4LnBocC9MaWJyYXJ5X0luaXRpYWxpemF0aW9uI0NsZWFudXAKKyAgLy8gd2UgcHVycG9zZWZ1bGx5IGRvIE5PVCBjYWxsIEZJUFNfbW9kZV9zZXQoMCkgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBlbmNsb3NpbmcgYXBwbGljYXRpb24gdG8gbWFuYWdlIEZJUFMgZW50aXJlbHkKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfRU5HSU5FX0NMRUFOVVBfUkVRVUlSRURfQkVGT1JFKQorICBFTkdJTkVfY2xlYW51cCgpOyAgICAgICAgICAgICAvLyBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL21hbjEuMS4wL2NyeXB0by9FTkdJTkVfY2xlYW51cC5odG1sIC0gY2xlYW51cCBjYWxsIGlzIG5lZWRlZCBiZWZvcmUgMS4xLjAKKyNlbmRpZgorICBDT05GX21vZHVsZXNfdW5sb2FkKDEpOworICBFVlBfY2xlYW51cCgpOworICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICBFUlJfZnJlZV9zdHJpbmdzKCk7CisKKyAgbXV0ZXhlcy5yZXNldCgpOworfQorCitzdGF0aWMgdm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIG1lc3NhZ2UsIGludCBlcnJub19jb3B5ID0gMCwgaW50IHNzbGVycm5vID0gMCk7CitzdGF0aWMgYm9vbCBtYXRjaE5hbWUoY29uc3QgY2hhciogaG9zdCwgY29uc3QgY2hhciogcGF0dGVybiwgaW50IHNpemUpOworc3RhdGljIGNoYXIgdXBwZXJjYXNlKGNoYXIgYyk7CisKKy8vIFNTTENvbnRleHQgaW1wbGVtZW50YXRpb24KK1NTTENvbnRleHQ6OlNTTENvbnRleHQoY29uc3QgU1NMUHJvdG9jb2wmIHByb3RvY29sKSB7CisgIGlmIChwcm90b2NvbCA9PSBTU0xUTFMpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gU1NMdjMpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjNfbWV0aG9kKCkpOworI2VuZGlmCisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gVExTdjFfMCkgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV9tZXRob2QoKSk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gVExTdjFfMSkgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV8xX21ldGhvZCgpKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8yKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICB9IGVsc2UgeworICAgIC8vLyBVTktOT1dOIFBST1RPQ09MIQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3OiBVbmtub3duIHByb3RvY29sIik7CisgIH0KKworICBpZiAoY3R4XyA9PSBOVUxMKSB7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3OiAiICsgZXJyb3JzKTsKKyAgfQorICBTU0xfQ1RYX3NldF9tb2RlKGN0eF8sIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworCisgIC8vIERpc2FibGUgaG9ycmlibHkgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzIHByb3RvY29scyBidXQgYWxsb3cgYSBoYW5kc2hha2UKKyAgLy8gd2l0aCBvbGRlciBjbGllbnRzIHNvIHRoZXkgZ2V0IGEgZ3JhY2VmdWwgZGVuaWFsLgorICBpZiAocHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Mik7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Myk7ICAgLy8gVEhSSUZULTMxNjQKKyAgfQorfQorCitTU0xDb250ZXh0Ojp+U1NMQ29udGV4dCgpIHsKKyAgaWYgKGN0eF8gIT0gTlVMTCkgeworICAgIFNTTF9DVFhfZnJlZShjdHhfKTsKKyAgICBjdHhfID0gTlVMTDsKKyAgfQorfQorCitTU0wqIFNTTENvbnRleHQ6OmNyZWF0ZVNTTCgpIHsKKyAgU1NMKiBzc2wgPSBTU0xfbmV3KGN0eF8pOworICBpZiAoc3NsID09IE5VTEwpIHsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycyk7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX25ldzogIiArIGVycm9ycyk7CisgIH0KKyAgcmV0dXJuIHNzbDsKK30KKworLy8gVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgorVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KQorICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworICBpbnRlcnJ1cHRMaXN0ZW5lcl8gPSBpbnRlcnJ1cHRMaXN0ZW5lcjsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCkKKyAgOiBUU29ja2V0KHNvY2tldCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgOiBUU29ja2V0KGhvc3QsIHBvcnQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CisgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOworfQorCitUU1NMU29ja2V0Ojp+VFNTTFNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJUU1NMU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgLy8gZGF0YSBtYXkgYmUgYXZhaWxhYmxlIGluIFNTTCBidWZmZXJzIChub3RlOiBTU0xfcGVuZGluZyBkb2VzIG5vdCBoYXZlIGEgZmFpbHVyZSBtb2RlKQorICByZXR1cm4gU1NMX3BlbmRpbmcoc3NsXykgPiAwIHx8IFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdCgpIHsKKyAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IGZhbHNlOworICByZWFkUmV0cnlDb3VudF8gPSAwOworICBldmVudFNhZmVfID0gZmFsc2U7Cit9CisKK2Jvb2wgVFNTTFNvY2tldDo6aXNPcGVuKCkgeworICBpZiAoc3NsXyA9PSBOVUxMIHx8ICFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOworICAvLyAiISEiIGlzIHNxdWVsY2hpbmcgQzQ4MDAgImZvcmNpbmcgYm9vbCAtPiB0cnVlIG9yIGZhbHNlIiBwZXJmb3JtYW5jZSB3YXJuaW5nCisgIGJvb2wgc2h1dGRvd25SZWNlaXZlZCA9ICEhKHNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKKyAgYm9vbCBzaHV0ZG93blNlbnQgPSAhIShzaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKTsKKyAgaWYgKHNodXRkb3duUmVjZWl2ZWQgJiYgc2h1dGRvd25TZW50KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLworYm9vbCBUU1NMU29ja2V0OjpwZWVrKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOworICBpbnQgcmM7CisgIHVpbnQ4X3QgYnl0ZTsKKyAgZG8geworICAgIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ5dGUsIDEpOworICAgIGlmIChyYyA8IDApIHsKKworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHJlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogIiArIGVycm9ycyk7CisgICAgfSBlbHNlIGlmIChyYyA9PSAwKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAodHJ1ZSk7CisgIHJldHVybiAocmMgPiAwKTsKK30KKwordm9pZCBUU1NMU29ja2V0OjpvcGVuKCkgeworICBpZiAoaXNPcGVuKCkgfHwgc2VydmVyKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKyAgfQorICBUU29ja2V0OjpvcGVuKCk7Cit9CisKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCit2b2lkIFRTU0xTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc3NsXyAhPSBOVUxMKSB7CisgICAgdHJ5IHsKKyAgICAgIGludCByYzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gMDsKKyAgICAgIGludCBlcnJvciA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IHdoaWxlIChyYyA9PSAyKTsKKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KCgiU1NMX3NodXRkb3duOiAiICsgZXJyb3JzKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICAvLyBkZXN0cnVjdG9yLiBUaGVyZSdzIGFsc28gbm90IG11Y2ggdGhhdCBhIHVzZXIgY2FuIGRvIHRvIHJlY292ZXIsIHNvCisgICAgICAvLyBqdXN0IGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCB0aHJvd2luZywgc2ltaWxhciB0byB0aGUgcmMKKyAgICAgIC8vIDwgMCBjYXNlIGFib3ZlLgorICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU1NMX3NodXRkb3duOiAlcyIsIHRlLndoYXQoKSk7CisgICAgfQorICAgIFNTTF9mcmVlKHNzbF8pOworICAgIHNzbF8gPSBOVUxMOworICAgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisgIFRTb2NrZXQ6OmNsb3NlKCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHJlYWQgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwordWludDMyX3QgVFNTTFNvY2tldDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOworICBpbnQzMl90IGJ5dGVzID0gMDsKKyAgd2hpbGUgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsXywgYnVmLCBsZW4pOworICAgIGludDMyX3QgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGludDMyX3QgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICByZWFkUmV0cnlDb3VudF8rKzsKKyAgICBpZiAoZXJyb3IgPT0gU1NMX0VSUk9SX05PTkUpIHsKKyAgICAgIHJlYWRSZXRyeUNvdW50XyA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IHdhaXRFdmVudFJldHVybjsKKyAgICBib29sIGJyZWFrb3V0ID0gZmFsc2U7CisgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJjbGllbnQgZGlzY29ubmVjdGVkIik7CisKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgIGlmIChlcnJub19jb3B5ID09IDAgJiYgRVJSX3BlZWtfZXJyb3IoKSA9PSAwKSB7CisgICAgICAgICAgYnJlYWtvdXQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfID49IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIC8vIGZhbGx0aHJvdWdoCisKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gcmVhZCBldmVudCBhZ2FpbgorICAgICAgICBlbHNlIGlmICgod2FpdEV2ZW50UmV0dXJuID0gd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKSkgPT0gVFNTTF9FSU5UUiApIHsKKyAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ0b28gbXVjaCByZWN2IHJldHJpZXMiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3YWl0RXZlbnRSZXR1cm4gPT0gVFNTTF9EQVRBKSB7CisgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIFNTTCBhbmQgaHVnZSB0aHJpZnQgcGFja2V0cywgdGhlcmUgbWF5IGJlIGEgbnVtYmVyIG9mCisgICAgICAgICAgICAvLyBzb2NrZXQgb3BlcmF0aW9ucywgYmVmb3JlIGFueSBkYXRhIGJlY29tZXMgYXZhaWxhYmxlIGJ5IFNTTF9yZWFkKCkuCisgICAgICAgICAgICAvLyBUaGVyZWZvcmUgdGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBub3QgYmUgaW5jcmVhc2VkIGFuZAorICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQuCisgICAgICAgICAgICByZWFkUmV0cnlDb3VudF8tLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ1bmtvd24gd2FpdEZvckV2ZW50IHJldHVybiB2YWx1ZSIpOworICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgIH0KKyAgICBpZiAoYnJlYWtvdXQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9yZWFkOiAiICsgZXJyb3JzKTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgcmV0dXJuOworICAvLyBsb29wIGluIGNhc2UgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgaXMgc2V0IGluIFNTTF9DVFguCisgIHVpbnQzMl90IHdyaXR0ZW4gPSAwOworICB3aGlsZSAod3JpdHRlbiA8IGxlbikgeworICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIGludDMyX3QgYnl0ZXMgPSBTU0xfd3JpdGUoc3NsXywgJmJ1Zlt3cml0dGVuXSwgbGVuIC0gd3JpdHRlbik7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaCAgICAgICAgCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3dyaXRlOiAiICsgZXJyb3JzKTsKKyAgICB9CisgICAgd3JpdHRlbiArPSBieXRlczsKKyAgfQorfQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBTU0wgU29ja2V0LgorICogSWYgZXZlbnRTYWZlIGlzIHNldCwgYW5kIGl0IG1heSByZXR1cm5zIDAgYnl0ZXMgdGhlbiB3cml0ZSBtZXRob2QKKyAqIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCBpdCBpcyBzdWNjZXNzZnVsbCBvciBpdCB0aHJvd3MKKyAqIGV4Y2VwdGlvbiBpbmNhc2Ugb2YgZmFpbHVyZS4KKyovCit1aW50MzJfdCBUU1NMU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybiAwOworICAvLyBsb29wIGluIGNhc2UgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgaXMgc2V0IGluIFNTTF9DVFguCisgIHVpbnQzMl90IHdyaXR0ZW4gPSAwOworICB3aGlsZSAod3JpdHRlbiA8IGxlbikgeworICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIGludDMyX3QgYnl0ZXMgPSBTU0xfd3JpdGUoc3NsXywgJmJ1Zlt3cml0dGVuXSwgbGVuIC0gd3JpdHRlbik7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3dyaXRlOiAiICsgZXJyb3JzKTsKKyAgICB9CisgICAgd3JpdHRlbiArPSBieXRlczsKKyAgfQorICByZXR1cm4gd3JpdHRlbjsKK30KKwordm9pZCBUU1NMU29ja2V0OjpmbHVzaCgpIHsKKyAgLy8gRG9uJ3QgdGhyb3cgZXhjZXB0aW9uIGlmIG5vdCBvcGVuLiBUaHJpZnQgc2VydmVycyBjbG9zZSBzb2NrZXQgdHdpY2UuCisgIGlmIChzc2xfID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiQklPX2ZsdXNoOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOworICBCSU8qIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF93YmlvIHJldHVybnMgTlVMTCIpOworICB9CisgIGlmIChCSU9fZmx1c2goYmlvKSAhPSAxKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiQklPX2ZsdXNoOiAiICsgZXJyb3JzKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKSB7CisgIC8vIHNldCB1bmRlcmx5aW5nIHNvY2tldCB0byBub24tYmxvY2tpbmcKKyAgaW50IGZsYWdzOworICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCisgICAgICB8fCBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spIDwgMCkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogc2V0IFRIUklGVF9PX05PTkJMT0NLIChUSFJJRlRfRkNOVEwpICIsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc29ja2V0Xyk7CisgICAgcmV0dXJuOworICB9CisgIHNzbF8gPSBjdHhfLT5jcmVhdGVTU0woKTsKKworICBTU0xfc2V0X2ZkKHNzbF8sIHN0YXRpY19jYXN0PGludD4oc29ja2V0XykpOworfQorCitib29sIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgeworICByZXR1cm4gaGFuZHNoYWtlQ29tcGxldGVkXzsKK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlKCkgeworICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgIH0KKyAgaWYgKGNoZWNrSGFuZHNoYWtlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3NsXyA9PSBOVUxMKSB7CisgICAgaW5pdGlhbGl6ZUhhbmRzaGFrZVBhcmFtcygpOworICB9CisKKyAgaW50IHJjOworICBpbnQgZXJybm9fY29weSA9IDA7CisgIGludCBlcnJvciA9IDA7CisgIGlmIChzZXJ2ZXIoKSkgeworICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2FjY2VwdChzc2xfKTsKKyAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICB9CisgICAgfSB3aGlsZSAocmMgPT0gMik7CisgIH0gZWxzZSB7CisgICAgLy8gT3BlblNTTCA8IDAuOS44ZiBkb2VzIG5vdCBoYXZlIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCisgICAgI2lmIGRlZmluZWQoU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKQorICAgICAgLy8gc2V0IHRoZSBTTkkgaG9zdG5hbWUKKyAgICAgIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc2xfLCBnZXRIb3N0KCkuY19zdHIoKSk7CisgICAgI2VuZGlmCisgICAgZG8geworICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKKyAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICB9CisgICAgfSB3aGlsZSAocmMgPT0gMik7CisgIH0KKyAgaWYgKHJjIDw9IDApIHsKKyAgICBzdHJpbmcgZm5hbWUoc2VydmVyKCkgPyAiU1NMX2FjY2VwdCIgOiAiU1NMX2Nvbm5lY3QiKTsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oZm5hbWUgKyAiOiAiICsgZXJyb3JzKTsKKyAgfQorICBhdXRob3JpemUoKTsKKyAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IHRydWU7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6YXV0aG9yaXplKCkgeworICBpbnQgcmMgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsXyk7CisgIGlmIChyYyAhPSBYNTA5X1ZfT0spIHsgLy8gdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdAorICAgIHRocm93IFRTU0xFeGNlcHRpb24oc3RyaW5nKCJTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSwgIikgKyBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYykpOworICB9CisKKyAgWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2xfKTsKKyAgaWYgKGNlcnQgPT0gTlVMTCkgeworICAgIC8vIGNlcnRpZmljYXRlIGlzIG5vdCBwcmVzZW50CisgICAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsXykgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IHJlcXVpcmVkIGNlcnRpZmljYXRlIG5vdCBwcmVzZW50Iik7CisgICAgfQorICAgIC8vIGNlcnRpZmljYXRlIHdhcyBvcHRpb25hbDogZGlkbid0IGludGVuZCB0byBhdXRob3JpemUgcmVtb3RlCisgICAgaWYgKHNlcnZlcigpICYmIGFjY2Vzc18gIT0gTlVMTCkgeworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiBjZXJ0aWZpY2F0ZSByZXF1aXJlZCBmb3IgYXV0aG9yaXphdGlvbiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgLy8gY2VydGlmaWNhdGUgaXMgcHJlc2VudAorICBpZiAoYWNjZXNzXyA9PSBOVUxMKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIHJldHVybjsKKyAgfQorICAvLyBib3RoIGNlcnRpZmljYXRlIGFuZCBhY2Nlc3MgbWFuYWdlciBhcmUgcHJlc2VudAorCisgIHN0cmluZyBob3N0OworICBzb2NrYWRkcl9zdG9yYWdlIHNhOworICBzb2NrbGVuX3Qgc2FMZW5ndGggPSBzaXplb2Yoc2EpOworCisgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZzYSwgJnNhTGVuZ3RoKSAhPSAwKSB7CisgICAgc2Euc3NfZmFtaWx5ID0gQUZfVU5TUEVDOworICB9CisKKyAgQWNjZXNzTWFuYWdlcjo6RGVjaXNpb24gZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoc2EpOworCisgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpTS0lQKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpBTExPVykgeworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiBhY2Nlc3MgZGVuaWVkIGJhc2VkIG9uIHJlbW90ZSBJUCIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBleHRyYWN0IHN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKKyAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzCisgICAgICA9IChTVEFDS19PRihHRU5FUkFMX05BTUUpKilYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKyAgaWYgKGFsdGVybmF0aXZlcyAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IGNvdW50ID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRlcm5hdGl2ZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBkZWNpc2lvbiA9PSBBY2Nlc3NNYW5hZ2VyOjpTS0lQICYmIGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBjb25zdCBHRU5FUkFMX05BTUUqIG5hbWUgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYWx0ZXJuYXRpdmVzLCBpKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKUFTTjFfU1RSSU5HX2RhdGEobmFtZS0+ZC5pYTUpOworICAgICAgaW50IGxlbmd0aCA9IEFTTjFfU1RSSU5HX2xlbmd0aChuYW1lLT5kLmlhNSk7CisgICAgICBzd2l0Y2ggKG5hbWUtPnR5cGUpIHsKKyAgICAgIGNhc2UgR0VOX0ROUzoKKyAgICAgICAgaWYgKGhvc3QuZW1wdHkoKSkgeworICAgICAgICAgIGhvc3QgPSAoc2VydmVyKCkgPyBnZXRQZWVySG9zdCgpIDogZ2V0SG9zdCgpKTsKKyAgICAgICAgfQorICAgICAgICBkZWNpc2lvbiA9IGFjY2Vzc18tPnZlcmlmeShob3N0LCBkYXRhLCBsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0VOX0lQQUREOgorICAgICAgICBkZWNpc2lvbiA9IGFjY2Vzc18tPnZlcmlmeShzYSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHNrX0dFTkVSQUxfTkFNRV9wb3BfZnJlZShhbHRlcm5hdGl2ZXMsIEdFTkVSQUxfTkFNRV9mcmVlKTsKKyAgfQorCisgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpTS0lQKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpBTExPVykgeworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiBhY2Nlc3MgZGVuaWVkIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIGV4dHJhY3QgY29tbW9uTmFtZQorICBYNTA5X05BTUUqIG5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBYNTA5X05BTUVfRU5UUlkqIGVudHJ5OworICAgIHVuc2lnbmVkIGNoYXIqIHV0Zjg7CisgICAgaW50IGxhc3QgPSAtMTsKKyAgICB3aGlsZSAoZGVjaXNpb24gPT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgeworICAgICAgbGFzdCA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCBsYXN0KTsKKyAgICAgIGlmIChsYXN0ID09IC0xKQorICAgICAgICBicmVhazsKKyAgICAgIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBsYXN0KTsKKyAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIEFTTjFfU1RSSU5HKiBjb21tb24gPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgICAgaW50IHNpemUgPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBjb21tb24pOworICAgICAgaWYgKGhvc3QuZW1wdHkoKSkgeworICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7CisgICAgICB9CisgICAgICBkZWNpc2lvbiA9IGFjY2Vzc18tPnZlcmlmeShob3N0LCAoY2hhciopdXRmOCwgc2l6ZSk7CisgICAgICBPUEVOU1NMX2ZyZWUodXRmOCk7CisgICAgfQorICB9CisgIFg1MDlfZnJlZShjZXJ0KTsKKyAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OkFMTE9XKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiBjYW5ub3QgYXV0aG9yaXplIHBlZXIiKTsKKyAgfQorfQorCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwordW5zaWduZWQgaW50IFRTU0xTb2NrZXQ6OndhaXRGb3JFdmVudChib29sIHdhbnRSZWFkKSB7CisgIGludCBmZFNvY2tldDsKKyAgQklPKiBiaW87CisKKyAgaWYgKHdhbnRSZWFkKSB7CisgICAgYmlvID0gU1NMX2dldF9yYmlvKHNzbF8pOworICB9IGVsc2UgeworICAgIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgfQorCisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfP2JpbyByZXR1cm5lZCBOVUxMIik7CisgIH0KKworICBpZiAoQklPX2dldF9mZChiaW8sICZmZFNvY2tldCkgPD0gMCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19nZXRfZmQgZmFpbGVkIik7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgIG1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgZmRzWzBdLmZkID0gZmRTb2NrZXQ7CisgIC8vIHVzZSBQT0xMSU4gYWxzbyBvbiB3cml0ZSBvcGVyYXRpb25zIHRvbywgdGhpcyBpcyBuZWVkZWQgZm9yIG9wZXJhdGlvbnMKKyAgLy8gd2hpY2ggcmVxdWlyZXMgcmVhZCBhbmQgd3JpdGUgb24gdGhlIHNvY2tldC4KKyAgZmRzWzBdLmV2ZW50cyA9IHdhbnRSZWFkID8gVEhSSUZUX1BPTExJTiA6IFRIUklGVF9QT0xMSU4gfCBUSFJJRlRfUE9MTE9VVDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICB9CisKKyAgaW50IHRpbWVvdXQgPSAtMTsKKyAgaWYgKHdhbnRSZWFkICYmIHJlY3ZUaW1lb3V0XykgeworICAgIHRpbWVvdXQgPSByZWN2VGltZW91dF87CisgIH0KKyAgaWYgKCF3YW50UmVhZCAmJiBzZW5kVGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gc2VuZFRpbWVvdXRfOworICB9CisKKyAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgaW50ZXJydXB0TGlzdGVuZXJfID8gMiA6IDEsIHRpbWVvdXQpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgLy8gZXJyb3IgY2FzZXMKKyAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VJTlRSKSB7CisgICAgICByZXR1cm4gVFNTTF9FSU5UUjsgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgIH0KKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTU0xTb2NrZXQ6OnJlYWQgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0gZWxzZSBpZiAocmV0ID4gMCl7CisgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgfQorICAgIHJldHVybiBUU1NMX0RBVEE7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfUE9MTCAodGltZWQgb3V0KSIpOworICB9Cit9CisKKy8vIFRTU0xTb2NrZXRGYWN0b3J5IGltcGxlbWVudGF0aW9uCit1aW50NjRfdCBUU1NMU29ja2V0RmFjdG9yeTo6Y291bnRfID0gMDsKK011dGV4IFRTU0xTb2NrZXRGYWN0b3J5OjptdXRleF87Citib29sIFRTU0xTb2NrZXRGYWN0b3J5OjptYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fID0gZmFsc2U7CisKK1RTU0xTb2NrZXRGYWN0b3J5OjpUU1NMU29ja2V0RmFjdG9yeShTU0xQcm90b2NvbCBwcm90b2NvbCkgOiBzZXJ2ZXJfKGZhbHNlKSB7CisgIEd1YXJkIGd1YXJkKG11dGV4Xyk7CisgIGlmIChjb3VudF8gPT0gMCkgeworICAgIGlmICghbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXykgeworICAgICAgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKyAgICB9CisgICAgcmFuZG9taXplKCk7CisgIH0KKyAgY291bnRfKys7CisgIGN0eF8gPSBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4obmV3IFNTTENvbnRleHQocHJvdG9jb2wpKTsKK30KKworVFNTTFNvY2tldEZhY3Rvcnk6On5UU1NMU29ja2V0RmFjdG9yeSgpIHsKKyAgR3VhcmQgZ3VhcmQobXV0ZXhfKTsKKyAgY3R4Xy5yZXNldCgpOworICBjb3VudF8tLTsKKyAgaWYgKGNvdW50XyA9PSAwICYmICFtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fKSB7CisgICAgY2xlYW51cE9wZW5TU0woKTsKKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldCgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGludGVycnVwdExpc3RlbmVyKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0KSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBzb2NrZXQsIGludGVycnVwdExpc3RlbmVyKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0KSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQsIGludGVycnVwdExpc3RlbmVyKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6c2V0dXAoc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCkgeworICBzc2wtPnNlcnZlcihzZXJ2ZXIoKSk7CisgIGlmIChhY2Nlc3NfID09IE5VTEwgJiYgIXNlcnZlcigpKSB7CisgICAgYWNjZXNzXyA9IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPihuZXcgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIpOworICB9CisgIGlmIChhY2Nlc3NfICE9IE5VTEwpIHsKKyAgICBzc2wtPmFjY2VzcyhhY2Nlc3NfKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpjaXBoZXJzKGNvbnN0IHN0cmluZyYgZW5hYmxlKSB7CisgIGludCByYyA9IFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eF8tPmdldCgpLCBlbmFibGUuY19zdHIoKSk7CisgIGlmIChFUlJfcGVla19lcnJvcigpICE9IDApIHsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycyk7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3Q6ICIgKyBlcnJvcnMpOworICB9CisgIGlmIChyYyA9PSAwKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiTm9uZSBvZiBzcGVjaWZpZWQgY2lwaGVycyBhcmUgc3VwcG9ydGVkIik7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6YXV0aGVudGljYXRlKGJvb2wgcmVxdWlyZWQpIHsKKyAgaW50IG1vZGU7CisgIGlmIChyZXF1aXJlZCkgeworICAgIG1vZGUgPSBTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKyAgfSBlbHNlIHsKKyAgICBtb2RlID0gU1NMX1ZFUklGWV9OT05FOworICB9CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLT5nZXQoKSwgbW9kZSwgTlVMTCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKKyAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZENlcnRpZmljYXRlQ2hhaW46IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOworICB9CisgIGlmIChzdHJjbXAoZm9ybWF0LCAiUEVNIikgPT0gMCkgeworICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGN0eF8tPmdldCgpLCBwYXRoKSA9PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlOiAiICsgZXJyb3JzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgZm9ybWF0OiAiICsgc3RyaW5nKGZvcm1hdCkpOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCkgeworICBpZiAocGF0aCA9PSBOVUxMIHx8IGZvcm1hdCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CisgIH0KKyAgaWYgKHN0cmNtcChmb3JtYXQsICJQRU0iKSA9PSAwKSB7CisgICAgaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHhfLT5nZXQoKSwgcGF0aCwgU1NMX0ZJTEVUWVBFX1BFTSkgPT0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlOiAiICsgZXJyb3JzKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogY2FwYXRoKSB7CisgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzOiA8cGF0aD4gaXMgTlVMTCIpOworICB9CisgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLT5nZXQoKSwgcGF0aCwgY2FwYXRoKSA9PSAwKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnM6ICIgKyBlcnJvcnMpOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpIHsKKyAgUkFORF9wb2xsKCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6Om92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKSB7CisgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGN0eF8tPmdldCgpLCBwYXNzd29yZENhbGxiYWNrKTsKKyAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoY3R4Xy0+Z2V0KCksIHRoaXMpOworfQorCitpbnQgVFNTTFNvY2tldEZhY3Rvcnk6OnBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpIHsKKyAgVFNTTFNvY2tldEZhY3RvcnkqIGZhY3RvcnkgPSAoVFNTTFNvY2tldEZhY3RvcnkqKWRhdGE7CisgIHN0cmluZyB1c2VyUGFzc3dvcmQ7CisgIGZhY3RvcnktPmdldFBhc3N3b3JkKHVzZXJQYXNzd29yZCwgc2l6ZSk7CisgIGludCBsZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQ+KHVzZXJQYXNzd29yZC5zaXplKCkpOworICBpZiAobGVuZ3RoID4gc2l6ZSkgeworICAgIGxlbmd0aCA9IHNpemU7CisgIH0KKyAgc3RybmNweShwYXNzd29yZCwgdXNlclBhc3N3b3JkLmNfc3RyKCksIGxlbmd0aCk7CisgIHVzZXJQYXNzd29yZC5hc3NpZ24odXNlclBhc3N3b3JkLnNpemUoKSwgJyonKTsKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLy8gZXh0cmFjdCBlcnJvciBtZXNzYWdlcyBmcm9tIGVycm9yIHF1ZXVlCit2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgZXJyb3JzLCBpbnQgZXJybm9fY29weSwgaW50IHNzbGVycm5vKSB7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JDb2RlOworICBjaGFyIG1lc3NhZ2VbMjU2XTsKKworICBlcnJvcnMucmVzZXJ2ZSg1MTIpOworICB3aGlsZSAoKGVycm9yQ29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgIGlmICghZXJyb3JzLmVtcHR5KCkpIHsKKyAgICAgIGVycm9ycyArPSAiOyAiOworICAgIH0KKyAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvckNvZGUpOworICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSAtIDEsICJTU0wgZXJyb3IgIyAlbHUiLCBlcnJvckNvZGUpOworICAgICAgcmVhc29uID0gbWVzc2FnZTsKKyAgICB9CisgICAgZXJyb3JzICs9IHJlYXNvbjsKKyAgfQorICBpZiAoZXJyb3JzLmVtcHR5KCkpIHsKKyAgICBpZiAoZXJybm9fY29weSAhPSAwKSB7CisgICAgICBlcnJvcnMgKz0gVE91dHB1dDo6c3RyZXJyb3JfcyhlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyAgaWYgKGVycm9ycy5lbXB0eSgpKSB7CisgICAgZXJyb3JzID0gImVycm9yIGNvZGU6ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyAgaWYgKHNzbGVycm5vKSB7CisgICAgZXJyb3JzICs9ICIgKFNTTF9lcnJvcl9jb2RlID0gIiArIHRvX3N0cmluZyhzc2xlcnJubykgKyAiKSI7CisgICAgaWYgKHNzbGVycm5vID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisgICAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICAgIGludCBlcnI7CisgICAgICB3aGlsZSAoKGVyciA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgICBlcnJvcnMgKz0gIiAiOworICAgICAgICBlcnJvcnMgKz0gRVJSX2Vycm9yX3N0cmluZyhlcnIsIGJ1Zik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBY2Nlc3NNYW5hZ2VyCisgKi8KK0RlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIG5vZXhjZXB0IHsKKyAgKHZvaWQpc2E7CisgIHJldHVybiBTS0lQOworfQorCitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIG5vZXhjZXB0IHsKKyAgaWYgKGhvc3QuZW1wdHkoKSB8fCBuYW1lID09IE5VTEwgfHwgc2l6ZSA8PSAwKSB7CisgICAgcmV0dXJuIFNLSVA7CisgIH0KKyAgcmV0dXJuIChtYXRjaE5hbWUoaG9zdC5jX3N0cigpLCBuYW1lLCBzaXplKSA/IEFMTE9XIDogU0tJUCk7Cit9CisKK0RlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBub2V4Y2VwdCB7CisgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKKyAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUICYmIHNpemUgPT0gc2l6ZW9mKGluX2FkZHIpKSB7CisgICAgbWF0Y2ggPSAobWVtY21wKCYoKHNvY2thZGRyX2luKikmc2EpLT5zaW5fYWRkciwgZGF0YSwgc2l6ZSkgPT0gMCk7CisgIH0gZWxzZSBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2ICYmIHNpemUgPT0gc2l6ZW9mKGluNl9hZGRyKSkgeworICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbjYqKSZzYSktPnNpbjZfYWRkciwgZGF0YSwgc2l6ZSkgPT0gMCk7CisgIH0KKyAgcmV0dXJuIChtYXRjaCA/IEFMTE9XIDogU0tJUCk7Cit9CisKKy8qKgorICogTWF0Y2ggYSBuYW1lIHdpdGggYSBwYXR0ZXJuLiBUaGUgcGF0dGVybiBtYXkgaW5jbHVkZSB3aWxkY2FyZC4gQSBzaW5nbGUKKyAqIHdpbGRjYXJkICIqIiBjYW4gbWF0Y2ggdXAgdG8gb25lIGNvbXBvbmVudCBpbiB0aGUgZG9tYWluIG5hbWUuCisgKgorICogQHBhcmFtICBob3N0ICAgIEhvc3QgbmFtZSwgdHlwaWNhbGx5IHRoZSBuYW1lIG9mIHRoZSByZW1vdGUgaG9zdAorICogQHBhcmFtICBwYXR0ZXJuIE5hbWUgcmV0cmlldmVkIGZyb20gY2VydGlmaWNhdGUKKyAqIEBwYXJhbSAgc2l6ZSAgICBTaXplIG9mICJwYXR0ZXJuIgorICogQHJldHVybiBUcnVlLCBpZiAiaG9zdCIgbWF0Y2hlcyAicGF0dGVybiIuIEZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBtYXRjaE5hbWUoY29uc3QgY2hhciogaG9zdCwgY29uc3QgY2hhciogcGF0dGVybiwgaW50IHNpemUpIHsKKyAgYm9vbCBtYXRjaCA9IGZhbHNlOworICBpbnQgaSA9IDAsIGogPSAwOworICB3aGlsZSAoaSA8IHNpemUgJiYgaG9zdFtqXSAhPSAnXDAnKSB7CisgICAgaWYgKHVwcGVyY2FzZShwYXR0ZXJuW2ldKSA9PSB1cHBlcmNhc2UoaG9zdFtqXSkpIHsKKyAgICAgIGkrKzsKKyAgICAgIGorKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocGF0dGVybltpXSA9PSAnKicpIHsKKyAgICAgIHdoaWxlIChob3N0W2pdICE9ICcuJyAmJiBob3N0W2pdICE9ICdcMCcpIHsKKyAgICAgICAgaisrOworICAgICAgfQorICAgICAgaSsrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGlmIChpID09IHNpemUgJiYgaG9zdFtqXSA9PSAnXDAnKSB7CisgICAgbWF0Y2ggPSB0cnVlOworICB9CisgIHJldHVybiBtYXRjaDsKK30KKworLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCB0aGUgVHVya2lzaCBsb2NhbGUgaXNzdWUsIGkuZS4sCisvLyB0b3VwcGVyKCdpJykgIT0gdG91cHBlcignSScpIGlmIGxvY2FsZSBpcyAidHJfVFIiCitjaGFyIHVwcGVyY2FzZShjaGFyIGMpIHsKKyAgaWYgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB7CisgICAgcmV0dXJuIGMgKyAoJ0EnIC0gJ2EnKTsKKyAgfQorICByZXR1cm4gYzsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4N2QxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU09DS0VUX0hfIDEKKworLy8gUHV0IHRoaXMgZmlyc3QgdG8gYXZvaWQgV0lOMzIgYnVpbGQgZmFpbHVyZQorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgQWNjZXNzTWFuYWdlcjsKK2NsYXNzIFNTTENvbnRleHQ7CisKK2VudW0gU1NMUHJvdG9jb2wgeworICBTU0xUTFMgID0gMCwgIC8vIFN1cHBvcnRzIFNTTHYyIGFuZCBTU0x2MyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlcyBhdCBUTFN2MV8wIG9yIGxhdGVyLgorLy9TU0x2MiAgID0gMSwgIC8vIEhPUlJJQkxZIElOU0VDVVJFIQorICBTU0x2MyAgID0gMiwgIC8vIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlIQorICBUTFN2MV8wID0gMywgIC8vIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuCisgIFRMU3YxXzEgPSA0LCAgLy8gU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4KKyAgVExTdjFfMiA9IDUsICAvLyBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLgorICBMQVRFU1QgID0gVExTdjFfMgorfTsKKworI2RlZmluZSBUU1NMX0VJTlRSIDAKKyNkZWZpbmUgVFNTTF9EQVRBIDEKKworLyoqCisgKiBJbml0aWFsaXplIE9wZW5TU0wgbGlicmFyeS4gIFRoaXMgZnVuY3Rpb24sIG9yIHNvbWUgb3RoZXIKKyAqIGVxdWl2YWxlbnQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBPcGVuU1NMLCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqIFRTU0xTb2NrZXQgaXMgdXNlZC4gIElmIHlvdSBzZXQgVFNTTFNvY2tldEZhY3RvcnkgdG8gdXNlIG1hbnVhbAorICogT3BlblNTTCBpbml0aWFsaXphdGlvbiwgeW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJ3aXNlCisgKiBlbnN1cmUgT3BlblNTTCBpcyBpbml0aWFsaXplZCB5b3Vyc2VsZi4KKyAqLwordm9pZCBpbml0aWFsaXplT3BlblNTTCgpOworLyoqCisgKiBDbGVhbnVwIE9wZW5TU0wgbGlicmFyeS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB0byBjbGVhbgorICogdXAgT3BlblNTTCBhZnRlciB1c2Ugb2YgT3BlblNTTCBmdW5jdGlvbmFsaXR5IGlzIGZpbmlzaGVkLiAgSWYgeW91CisgKiBzZXQgVFNTTFNvY2tldEZhY3RvcnkgdG8gdXNlIG1hbnVhbCBPcGVuU1NMIGluaXRpYWxpemF0aW9uLCB5b3UKKyAqIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24geW91cnNlbGYgb3IgZW5zdXJlIHRoYXQgd2hhdGV2ZXIKKyAqIGluaXRpYWxpemVkIE9wZW5TU0wgY2xlYW5zIGl0IHVwIHRvby4KKyAqLwordm9pZCBjbGVhbnVwT3BlblNTTCgpOworCisvKioKKyAqIE9wZW5TU0wgaW1wbGVtZW50YXRpb24gZm9yIFNTTCBzb2NrZXQgaW50ZXJmYWNlLgorICovCitjbGFzcyBUU1NMU29ja2V0IDogcHVibGljIFRTb2NrZXQgeworcHVibGljOgorICB+VFNTTFNvY2tldCgpOworICAvKioKKyAgICogVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAqLworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKyAgdm9pZCBvcGVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKyAgYm9vbCBoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIGZsdXNoKCk7CisgIC8qKgorICAqIFNldCB3aGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgKgorICAqIEBwYXJhbSBmbGFnICBVc2Ugc2VydmVyIHNpZGUgaGFuZHNoYWtlIHByb3RvY29sIGlmIHRydWUuCisgICovCisgIHZvaWQgc2VydmVyKGJvb2wgZmxhZykgeyBzZXJ2ZXJfID0gZmxhZzsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNTTCBzb2NrZXQgaXMgc2VydmVyIG9yIGNsaWVudCBtb2RlLgorICAgKi8KKyAgYm9vbCBzZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJfOyB9CisgIC8qKgorICAgKiBTZXQgQWNjZXNzTWFuYWdlci4KKyAgICoKKyAgICogQHBhcmFtIG1hbmFnZXIgIEluc3RhbmNlIG9mIEFjY2Vzc01hbmFnZXIKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgLyoqCisgICAqIFNldCBldmVudFNhZmUgZmxhZyBpZiBsaWJldmVudCBpcyB1c2VkLgorICAgKi8KKyAgdm9pZCBzZXRMaWJldmVudFNhZmUoKSB7IGV2ZW50U2FmZV8gPSB0cnVlOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgU1NMIFNvY2tldCBpcyBsaWJldmVudCBzYWZlIG9yIG5vdC4KKyAgICovCisgIGJvb2wgaXNMaWJldmVudFNhZmUoKSBjb25zdCB7IHJldHVybiBldmVudFNhZmVfOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KTsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCBnaXZlbiBhbiBleGlzdGluZyBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0CisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCBnaXZlbiBhbiBleGlzdGluZyBzb2NrZXQgdGhhdCBjYW4gYmUgaW50ZXJydXB0ZWQuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0CisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgbmFtZQorICAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgbnVtYmVyCisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0KTsKKyAgICAvKioKKyAgKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGludGVycnVwdCBzaWduYWwuCisgICoKKyAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgbmFtZQorICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKKyAgKi8KKyAgICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgICogQXV0aG9yaXplIHBlZXIgYWNjZXNzIGFmdGVyIFNTTCBoYW5kc2hha2UgY29tcGxldGVzLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGF1dGhvcml6ZSgpOworICAvKioKKyAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBpZiBub3QgYWxyZWFkeSBpbml0aWF0ZWQuCisgICAqLworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgLyoqCisgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgcGFyYW1zLgorICAgKi8KKyAgdm9pZCBpbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCk7CisgIC8qKgorICAgKiBDaGVjayBpZiAgU1NMIGhhbmRzaGFrZSBpcyBjb21wbGV0ZWQgb3Igbm90LgorICAgKi8KKyAgYm9vbCBjaGVja0hhbmRzaGFrZSgpOworICAvKioKKyAgICogV2FpdHMgZm9yIGFuIHNvY2tldCBvciBzaHV0ZG93biBldmVudC4KKyAgICoKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEIGlmIGludGVycnVwdGVkIGlzIHNpZ25hbGVkLgorICAgKgorICAgKiBAcmV0dXJuIFRTU0xfRUlOVFIgaWYgRUlOVFIgaGFwcGVuZWQgb24gdGhlIHVuZGVybHlpbmcgc29ja2V0CisgICAqICAgICAgICAgVFNTTF9EQVRBICBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgorICAgKi8KKyAgdW5zaWduZWQgaW50IHdhaXRGb3JFdmVudChib29sIHdhbnRSZWFkKTsKKworICBib29sIHNlcnZlcl87CisgIFNTTCogc3NsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBmcmllbmQgY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFuZHNoYWtlQ29tcGxldGVkXzsKKyAgaW50IHJlYWRSZXRyeUNvdW50XzsKKyAgYm9vbCBldmVudFNhZmVfOworCisgIHZvaWQgaW5pdCgpOworfTsKKworLyoqCisgKiBTU0wgc29ja2V0IGZhY3RvcnkuIFNTTCBzb2NrZXRzIHNob3VsZCBiZSBjcmVhdGVkIHZpYSBTU0wgZmFjdG9yeS4KKyAqIFRoZSBmYWN0b3J5IHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgYXMgbG9uZyBhcworICogdGhlcmUgaXMgYSBUU1NMU29ja2V0RmFjdG9yeSBpbnN0YW50aWF0ZWQsIGFuZCBhcyBsb25nIGFzIHRoZSBzdGF0aWMKKyAqIGJvb2xlYW4gbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBkZWZhdWx0LgorICoKKyAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCB5b3Vyc2VsZiwgc2V0CisgKiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIHRvIHRydWUgYW5kIFRTU0xTb2NrZXRGYWN0b3J5IHdpbGwgbm8KKyAqIGxvbmdlciBiZSByZXNwb25zaWJsZSBmb3Igb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQgdGVhcmRvd24uCisgKgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb2RlIHVzaW5nIFRTU0xTb2NrZXRGYWN0b3J5IHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgZmFjdG9yeSBsaWZldGltZSBleGNlZWRzIHRoZSBsaWZldGltZSBvZiBhbnkgc29ja2V0cworICogaXQgbWlnaHQgY3JlYXRlLiAgSWYgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgYSBzb2NrZXQgbWF5IGNhbGwgaW50bworICogb3BlbnNzbCBhZnRlciB0aGUgc29ja2V0IGZhY3RvcnkgaGFzIGNsZWFuZWQgdXAgb3BlbnNzbCEgIFRoaXMKKyAqIGd1YXJhbnRlZSBpcyB1bm5lY2Vzc2FyeSBpZiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHRydWUsCisgKiBob3dldmVyLCBzaW5jZSBpdCB3b3VsZCBiZSB1cCB0byB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIGluc3RlYWQuCisgKi8KK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yL0Rlc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHByb3RvY29sIFRoZSBTU0wvVExTIHByb3RvY29sIHRvIHVzZS4KKyAgICovCisgIFRTU0xTb2NrZXRGYWN0b3J5KFNTTFByb3RvY29sIHByb3RvY29sID0gU1NMVExTKTsKKyAgdmlydHVhbCB+VFNTTFNvY2tldEZhY3RvcnkoKTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggYSBmcmVzaCBuZXcgc29ja2V0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldCwgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIHRoZSBnaXZlbiBzb2NrZXQgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIFNldCBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgorICAgKgorICAgKiBAcGFyYW0gY2lwaGVycyAgQSBsaXN0IG9mIGNpcGhlcnMKKyAgICovCisgIHZpcnR1YWwgdm9pZCBjaXBoZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmFibGUpOworICAvKioKKyAgICogRW5hYmxlL0Rpc2FibGUgYXV0aGVudGljYXRpb24uCisgICAqCisgICAqIEBwYXJhbSByZXF1aXJlZCBSZXF1aXJlIHBlZXIgdG8gcHJlc2VudCB2YWxpZCBjZXJ0aWZpY2F0ZSBpZiB0cnVlCisgICAqLworICB2aXJ0dWFsIHZvaWQgYXV0aGVudGljYXRlKGJvb2wgcmVxdWlyZWQpOworICAvKioKKyAgICogTG9hZCBzZXJ2ZXIgY2VydGlmaWNhdGUuCisgICAqCisgICAqIEBwYXJhbSBwYXRoICAgUGF0aCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZQorICAgKiBAcGFyYW0gZm9ybWF0IENlcnRpZmljYXRlIGZpbGUgZm9ybWF0CisgICAqLworICB2aXJ0dWFsIHZvaWQgbG9hZENlcnRpZmljYXRlKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCA9ICJQRU0iKTsKKyAgLyoqCisgICAqIExvYWQgcHJpdmF0ZSBrZXkuCisgICAqCisgICAqIEBwYXJhbSBwYXRoICAgUGF0aCB0byB0aGUgcHJpdmF0ZSBrZXkgZmlsZQorICAgKiBAcGFyYW0gZm9ybWF0IFByaXZhdGUga2V5IGZpbGUgZm9ybWF0CisgICAqLworICB2aXJ0dWFsIHZvaWQgbG9hZFByaXZhdGVLZXkoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0ID0gIlBFTSIpOworICAvKioKKyAgICogTG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcyBmcm9tIHNwZWNpZmllZCBmaWxlLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRydXN0ZWQgY2VydGlmaWNhdGUgZmlsZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGNhcGF0aCA9IE5VTEwpOworICAvKioKKyAgICogRGVmYXVsdCByYW5kb21pemUgbWV0aG9kLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJhbmRvbWl6ZSgpOworICAvKioKKyAgICogT3ZlcnJpZGUgZGVmYXVsdCBPcGVuU1NMIHBhc3N3b3JkIGNhbGxiYWNrIHdpdGggZ2V0UGFzc3dvcmQoKS4KKyAgICovCisgIHZvaWQgb3ZlcnJpZGVEZWZhdWx0UGFzc3dvcmRDYWxsYmFjaygpOworICAvKioKKyAgICogU2V0L1Vuc2V0IHNlcnZlciBtb2RlLgorICAgKgorICAgKiBAcGFyYW0gZmxhZyAgU2VydmVyIG1vZGUgaWYgdHJ1ZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlcihib29sIGZsYWcpIHsgc2VydmVyXyA9IGZsYWc7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgaW4gc2VydmVyIG9yIGNsaWVudCBtb2RlLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUsIGlmIHNlcnZlciBtb2RlLCBvciwgZmFsc2UsIGlmIGNsaWVudCBtb2RlCisgICAqLworICB2aXJ0dWFsIGJvb2wgc2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorICAvKioKKyAgICogU2V0IEFjY2Vzc01hbmFnZXIuCisgICAqCisgICAqIEBwYXJhbSBtYW5hZ2VyICBUaGUgQWNjZXNzTWFuYWdlciBpbnN0YW5jZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFjY2VzcyhzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICBzdGF0aWMgdm9pZCBzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24oYm9vbCBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24pIHsKKyAgICBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fID0gbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uOworICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87CisKKyAgLyoqCisgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFzc3dvcmQgY2FsbGJhY2suIEl0IG1heSBiZSBjYWxsZWQKKyAgICogbXVsdGlwbGUgdGltZXMgYXQgYW55IHRpbWUgZHVyaW5nIGEgc2Vzc2lvbiBhcyBuZWNlc3NhcnkuCisgICAqCisgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzIGNvbGxlY3RlZCBwYXNzd29yZCB0byBPcGVuU1NMCisgICAqIEBwYXJhbSBzaXplICAgICBNYXhpbXVtIGxlbmd0aCBvZiBwYXNzd29yZCBpbmNsdWRpbmcgTlVMTCBjaGFyYWN0ZXIKKyAgICovCisgIHZpcnR1YWwgdm9pZCBnZXRQYXNzd29yZChzdGQ6OnN0cmluZyYgLyogcGFzc3dvcmQgKi8sIGludCAvKiBzaXplICovKSB7fQorCitwcml2YXRlOgorICBib29sIHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGF0aWMgY29uY3VycmVuY3k6Ok11dGV4IG11dGV4XzsKKyAgc3RhdGljIHVpbnQ2NF90IGNvdW50XzsKKyAgc3RhdGljIGJvb2wgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXzsKKyAgdm9pZCBzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKKyAgc3RhdGljIGludCBwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKTsKK307CisKKy8qKgorICogU1NMIGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFNTTEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVFNTTEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsIG1lc3NhZ2UpIHt9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgeworICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gIlRTU0xFeGNlcHRpb24iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KK307CisKKy8qKgorICogV3JhcCBPcGVuU1NMIFNTTF9DVFggaW50byBhIGNsYXNzLgorICovCitjbGFzcyBTU0xDb250ZXh0IHsKK3B1YmxpYzoKKyAgU1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wgPSBTU0xUTFMpOworICB2aXJ0dWFsIH5TU0xDb250ZXh0KCk7CisgIFNTTCogY3JlYXRlU1NMKCk7CisgIFNTTF9DVFgqIGdldCgpIHsgcmV0dXJuIGN0eF87IH0KKworcHJpdmF0ZToKKyAgU1NMX0NUWCogY3R4XzsKK307CisKKy8qKgorICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhY2Nlc3MgY29udHJvbC4gSXQncyBtZWFudCB0byB2ZXJpZnkgdGhlIHJlbW90ZSBob3N0LgorICogSXQncyBjb25zdHJ1Y3RlZCB3aGVuIGFwcGxpY2F0aW9uIHN0YXJ0cyBhbmQgc2V0IHRvIFRTU0xTb2NrZXRGYWN0b3J5CisgKiBpbnN0YW5jZS4gSXQncyBwYXNzZWQgb250byBhbGwgVFNTTFNvY2tldCBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKKyAqIG9iamVjdC4KKyAqLworY2xhc3MgQWNjZXNzTWFuYWdlciB7CitwdWJsaWM6CisgIGVudW0gRGVjaXNpb24geworICAgIERFTlkgPSAtMSwgLy8gZGVueSBhY2Nlc3MKKyAgICBTS0lQID0gMCwgIC8vIGNhbm5vdCBtYWtlIGRlY2lzaW9uLCBtb3ZlIG9uIHRvIG5leHQgKGlmIGFueSkKKyAgICBBTExPVyA9IDEgIC8vIGFsbG93IGFjY2VzcworICB9OworICAvKioKKyAgICogRGVzdHJ1Y3RvcgorICAgKi8KKyAgdmlydHVhbCB+QWNjZXNzTWFuYWdlcigpIHt9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90LiBJdCdzIGNhbGxlZAorICAgKiBvbmNlIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGJlZm9yZSBwZWVyIGNlcnRpZmljYXRlCisgICAqIGlzIGV4YW1pbmVkLgorICAgKgorICAgKiBJZiBhIHZhbGlkIGRlY2lzaW9uIChBTExPVyBvciBERU5ZKSBpcyByZXR1cm5lZCwgdGhlIHBlZXIgY2VydGlmaWNhdGUgaXMKKyAgICogbm90IHRvIGJlIHZlcmlmaWVkLgorICAgKgorICAgKiBAcGFyYW0gIHNhIFBlZXIgSVAgYWRkcmVzcworICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLykgbm9leGNlcHQgeyByZXR1cm4gREVOWTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIEBwYXJhbSAgaG9zdCBDbGllbnQgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldEhvc3QoKQorICAgKiAgICAgICAgICAgICAgU2VydmVyIG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRQZWVySG9zdCgpCisgICAqIEBwYXJhbSAgbmFtZSBTdWJqZWN0QWx0TmFtZSBvciBjb21tb24gbmFtZSBleHRyYWN0ZWQgZnJvbSBwZWVyIGNlcnRpZmljYXRlCisgICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgbmFtZQorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqCisgICAqIE5vdGU6IFRoZSAibmFtZSIgcGFyYW1ldGVyIG1heSBiZSBVVEY4IGVuY29kZWQuCisgICAqLworICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgLyogaG9zdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogbmFtZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKKyAgICByZXR1cm4gREVOWTsKKyAgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogZXZlcnkgdGltZSBhbiBJUCBzdWJqZWN0QWx0TmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MgY2VydGlmaWNhdGUuCisgICAqCisgICAqIEBwYXJhbSAgc2EgICBQZWVyIElQIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0CisgICAqIEBwYXJhbSAgZGF0YSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIGNlcnRpZmljYXRlCisgICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgdGhlIElQIGFkZHJlc3MKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGRhdGEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIERFTlk7CisgIH0KK307CisKK3R5cGVkZWYgQWNjZXNzTWFuYWdlcjo6RGVjaXNpb24gRGVjaXNpb247CisKK2NsYXNzIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyIDogcHVibGljIEFjY2Vzc01hbmFnZXIgeworcHVibGljOgorICAvLyBBY2Nlc3NNYW5hZ2VyIGludGVyZmFjZQorICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIG5vZXhjZXB0OworICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBzaXplKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgbm9leGNlcHQ7Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGI5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNjk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWZuZGVmIEFGX0xPQ0FMCisjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKKyNlbmRpZgorCisjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit2b2lkIGRlc3Ryb3llcl9vZl9maW5lX3NvY2tldHMoVEhSSUZUX1NPQ0tFVCogc3NvY2spIHsKKyAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoKnNzb2NrKTsKKyAgZGVsZXRlIHNzb2NrOworfQorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK1RHZXRBZGRySW5mb1dyYXBwZXI6OlRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cykKKyAgOiBub2RlXyhub2RlKSwgc2VydmljZV8oc2VydmljZSksIGhpbnRzXyhoaW50cyksIHJlc18oTlVMTCkge30KKworVEdldEFkZHJJbmZvV3JhcHBlcjo6flRHZXRBZGRySW5mb1dyYXBwZXIoKSB7CisgIGlmICh0aGlzLT5yZXNfICE9IE5VTEwpCisgICAgZnJlZWFkZHJpbmZvKHRoaXMtPnJlc18pOworfQorCitpbnQgVEdldEFkZHJJbmZvV3JhcHBlcjo6aW5pdCgpIHsKKyAgaWYgKHRoaXMtPnJlc18gPT0gTlVMTCkKKyAgICByZXR1cm4gZ2V0YWRkcmluZm8odGhpcy0+bm9kZV8sIHRoaXMtPnNlcnZpY2VfLCB0aGlzLT5oaW50c18sICYodGhpcy0+cmVzXykpOworICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBUR2V0QWRkckluZm9XcmFwcGVyOjpyZXMoKSB7CisgIHJldHVybiB0aGlzLT5yZXNfOworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0KQorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KQorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKHNlbmRUaW1lb3V0KSwKKyAgICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8ocG9ydCksCisgICAgYWRkcmVzc18oYWRkcmVzcyksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6On5UU2VydmVyU29ja2V0KCkgeworICBjbG9zZSgpOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpIHsKKyAgcmVjdlRpbWVvdXRfID0gcmVjdlRpbWVvdXQ7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0QWNjZXB0VGltZW91dChpbnQgYWNjVGltZW91dCkgeworICBhY2NUaW1lb3V0XyA9IGFjY1RpbWVvdXQ7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZykgeworICBhY2NlcHRCYWNrbG9nXyA9IGFjY0JhY2tsb2c7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSkgeworICByZXRyeURlbGF5XyA9IHJldHJ5RGVsYXk7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcikgeworICB0Y3BTZW5kQnVmZmVyXyA9IHRjcFNlbmRCdWZmZXI7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKSB7CisgIGlmIChsaXN0ZW5pbmdfKSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigic2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgbGlzdGVuKCkiKTsKKyAgfQorICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fID0gZW5hYmxlOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHsKKyAgbGlzdGVuaW5nXyA9IHRydWU7CisjaWZkZWYgX1dJTjMyCisgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZiAvLyBfV0lOMzIKKyAgVEhSSUZUX1NPQ0tFVCBzdlsyXTsKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdAorICBpZiAoLTEgPT0gVEhSSUZUX1NPQ0tFVFBBSVIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgaW50ZXJydXB0IiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIGludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIGludGVycnVwdFNvY2tSZWFkZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICB9IGVsc2UgeworICAgIGludGVycnVwdFNvY2tXcml0ZXJfID0gc3ZbMV07CisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8gPSBzdlswXTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQgYWxsIGNsaWVudHMKKyAgaWYgKC0xID09IFRIUklGVF9TT0NLRVRQQUlSKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgc3YpKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0cGFpcigpIGNoaWxkSW50ZXJydXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfLnJlc2V0KCk7CisgIH0gZWxzZSB7CisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IHN2WzFdOworICAgIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfCisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+KG5ldyBUSFJJRlRfU09DS0VUKHN2WzBdKSwgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyk7CisgIH0KKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0KCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgaW50IG9uZSA9IDE7CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob25lKSkpIHsKKy8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKy8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKyNpZm5kZWYgX1dJTjMyCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HICIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisjZW5kaWYKKyAgfQorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCisgIGlmICh0Y3BTZW5kQnVmZmVyXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU09fU05EQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmdGNwU2VuZEJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fUkNWQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKy8vIERlZmVyIGFjY2VwdAorI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX0RFRkVSX0FDQ0VQVCwgJm9uZSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9ERUZFUl9BQ0NFUFQgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX0RFRkVSX0FDQ0VQVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmIC8vICNpZmRlZiBUQ1BfREVGRVJfQUNDRVBUCisKKyNpZmRlZiBJUFY2X1Y2T05MWQorICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIGludCB6ZXJvID0gMDsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIElQUFJPVE9fSVBWNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFY2X1Y2T05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnplcm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih6ZXJvKSkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKKworICAvLyBUdXJuIGxpbmdlciBvZmYsIGRvbid0IHdhbnQgdG8gYmxvY2sgb24gY2FsbHMgdG8gY2xvc2UKKyAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNhc3Rfc29ja29wdCgmbGluZyksIHNpemVvZihsaW5nKSkpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFVuaXggU29ja2V0cyBkbyBub3QgbmVlZCB0aGF0CisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCisgICAgaWYgKC0xCisgICAgICAgID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNlcnZlclNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CisgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgorICBpbnQgcmV0cmllcyA9IDA7CisgIGludCBlcnJub19jb3B5ID0gMDsKKworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKworI2lmbmRlZiBfV0lOMzIKKworICAgIC8vIFVuaXggRG9tYWluIFNvY2tldAorICAgIHNpemVfdCBsZW4gPSBwYXRoXy5zaXplKCkgKyAxOworICAgIGlmIChsZW4gPiBzaXplb2YoKChzb2NrYWRkcl91biopTlVMTCktPnN1bl9wYXRoKSkgeworICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6bGlzdGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOworICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKKyAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCisgICAgZG8geworICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKyNlbHNlCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZG8geworICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8aW50PihyZXMtPmFpX2FkZHJsZW4pKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisKKyAgICAvLyByZXRyaWV2ZSBiaW5kIGluZm8KKyAgICBpZiAocG9ydF8gPT0gMCAmJiByZXRyaWVzIDw9IHJldHJ5TGltaXRfKSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgICAgIHNvY2tsZW5fdCBsZW4gPSBzaXplb2Yoc2EpOworICAgICAgc3RkOjptZW1zZXQoJnNhLCAwLCBsZW4pOworICAgICAgaWYgKDo6Z2V0c29ja25hbWUoc2VydmVyU29ja2V0XywgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHIqPigmc2EpLCAmbGVuKSA8IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOworICAgICAgICAgIHBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIHBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CisgICAgY2hhciBlcnJidWZbMTAyNF07CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGJpbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAobGlzdGVuQ2FsbGJhY2tfKQorICAgIGxpc3RlbkNhbGxiYWNrXyhzZXJ2ZXJTb2NrZXRfKTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiAoLTEgPT0gOjpsaXN0ZW4oc2VydmVyU29ja2V0XywgYWNjZXB0QmFja2xvZ18pKSB7CisgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK30KKworaW50IFRTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSB7CisgIHJldHVybiBwb3J0XzsKK30KKworc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgeworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFNlcnZlclNvY2tldCBub3QgbGlzdGVuaW5nIik7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisKKyAgaW50IG1heEVpbnRycyA9IDU7CisgIGludCBudW1FaW50cnMgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgICAgZmRzWzBdLmZkID0gc2VydmVyU29ja2V0XzsKKyAgICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICBpZiAoaW50ZXJydXB0U29ja1JlYWRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgICBmZHNbMV0uZmQgPSBpbnRlcnJ1cHRTb2NrUmVhZGVyXzsKKyAgICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgIH0KKyAgICAvKgorICAgICAgVE9ETzogaWYgVEhSSUZUX0VJTlRSIGlzIHJlY2VpdmVkLCB3ZSdsbCByZXN0YXJ0IHRoZSB0aW1lb3V0LgorICAgICAgVG8gYmUgYWNjdXJhdGUsIHdlIG5lZWQgdG8gZml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKi8KKyAgICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAyLCBhY2NUaW1lb3V0Xyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUlOVFIgJiYgKG51bUVpbnRycysrIDwgbWF4RWludHJzKSkgeworICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAvLyBDaGVjayBmb3IgYW4gaW50ZXJydXB0IHNpZ25hbAorICAgICAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSkgeworICAgICAgICBpbnQ4X3QgYnVmOworICAgICAgICBpZiAoLTEgPT0gcmVjdihpbnRlcnJ1cHRTb2NrUmVhZGVyXywgY2FzdF9zb2Nrb3B0KCZidWYpLCBzaXplb2YoaW50OF90KSwgMCkpIHsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcmVjdigpIGludGVycnVwdCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgICAgICB9CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGJlaW5nIHJlYWR5CisgICAgICBpZiAoZmRzWzBdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHbG9iYWxPdXRwdXQoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfUE9MTCAwIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworICAgIH0KKyAgfQorCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGNsaWVudEFkZHJlc3M7CisgIGludCBzaXplID0gc2l6ZW9mKGNsaWVudEFkZHJlc3MpOworICBUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldAorICAgICAgPSA6OmFjY2VwdChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgKHNvY2tsZW5fdCopJnNpemUpOworCisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfR0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyAmIH5USFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0CisgICAgICAgIC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgY2xpZW50LT5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKyAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIHNpemUpOworCisgIGlmIChhY2NlcHRDYWxsYmFja18pCisgICAgYWNjZXB0Q2FsbGJhY2tfKGNsaWVudFNvY2tldCk7CisKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQpIHsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQsIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7CisgIH0KK30KKwordm9pZCBUU2VydmVyU29ja2V0Ojpub3RpZnkoVEhSSUZUX1NPQ0tFVCBub3RpZnlTb2NrZXQpIHsKKyAgaWYgKG5vdGlmeVNvY2tldCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQ4X3QgYnl0ZSA9IDA7CisgICAgaWYgKC0xID09IHNlbmQobm90aWZ5U29ja2V0LCBjYXN0X3NvY2tvcHQoJmJ5dGUpLCBzaXplb2YoaW50OF90KSwgMCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Om5vdGlmeSgpIHNlbmQoKSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChpbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0Q2hpbGRyZW4oKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgbm90aWZ5KGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6Y2xvc2UoKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKHNlcnZlclNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc2VydmVyU29ja2V0Xyk7CisgIH0KKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorICBpZiAoaW50ZXJydXB0U29ja1JlYWRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoaW50ZXJydXB0U29ja1JlYWRlcl8pOworICB9CisgIGlmIChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9CisgIHNlcnZlclNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8ucmVzZXQoKTsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2QyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU29ja2V0OworCitjbGFzcyBUR2V0QWRkckluZm9XcmFwcGVyIHsKK3B1YmxpYzoKKyAgVEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLCBjb25zdCBjaGFyKiBzZXJ2aWNlLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzKTsKKworICB2aXJ0dWFsIH5UR2V0QWRkckluZm9XcmFwcGVyKCk7CisKKyAgaW50IGluaXQoKTsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiByZXMoKTsKKworcHJpdmF0ZToKKyAgY29uc3QgY2hhciogbm9kZV87CisgIGNvbnN0IGNoYXIqIHNlcnZpY2VfOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzXzsKKyAgc3RydWN0IGFkZHJpbmZvKiByZXNfOworfTsKKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuIFdyYXBwZXIgYXJvdW5kIGEgdW5peAorICogc29ja2V0IGxpc3RlbiBhbmQgYWNjZXB0IGNhbGxzLgorICoKKyAqLworY2xhc3MgVFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CisKKyAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVFNlcnZlclNvY2tldChpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgKi8KKyAgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgdW5peCBzb2NrZXRzLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBQYXRobmFtZSBmb3IgdW5peCBzb2NrZXQuCisgICAqLworICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICB2aXJ0dWFsIH5UU2VydmVyU29ja2V0KCk7CisKKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CisKKyAgdm9pZCBzZXRBY2NlcHRUaW1lb3V0KGludCBhY2NUaW1lb3V0KTsKKyAgdm9pZCBzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKTsKKworICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOworICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOworCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7IGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7IH0KKworICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOworICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOworCisgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRMaXN0ZW5DYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBsaXN0ZW5DYWxsYmFjaykgeyBsaXN0ZW5DYWxsYmFja18gPSBsaXN0ZW5DYWxsYmFjazsgfQorCisgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CisKKyAgLy8gV2hlbiBlbmFibGVkICh0aGUgZGVmYXVsdCksIG5ldyBjaGlsZHJlbiBUU29ja2V0cyB3aWxsIGJlIGNvbnN0cnVjdGVkIHNvCisgIC8vIHRoZXkgY2FuIGJlIGludGVycnVwdGVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmludGVycnVwdENoaWxkcmVuKCkuCisgIC8vIFRoaXMgaXMgbW9yZSBleHBlbnNpdmUgaW4gdGVybXMgb2Ygc3lzdGVtIGNhbGxzIChwb2xsICsgcmVjdikgaG93ZXZlcgorICAvLyBlbnN1cmVzIGEgY29ubmVjdGVkIGNsaWVudCBjYW5ub3QgaW50ZXJmZXJlIHdpdGggVFNlcnZlcjo6c3RvcCgpLgorICAvLworICAvLyBXaGVuIGRpc2FibGVkLCBUU29ja2V0IGNoaWxkcmVuIGRvIG5vdCBpbmN1ciBhbiBhZGRpdGlvbmFsIHBvbGwoKSBjYWxsLgorICAvLyBTZXJ2ZXItc2lkZSByZWFkcyBhcmUgbW9yZSBlZmZpY2llbnQsIGhvd2V2ZXIgYSBjbGllbnQgY2FuIGludGVyZmVyZSB3aXRoCisgIC8vIHRoZSBzZXJ2ZXIncyBhYmlsaXR5IHRvIHNodXRkb3duIHByb3Blcmx5IGJ5IHN0YXlpbmcgY29ubmVjdGVkLgorICAvLworICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGlzdGVuKCk7IG1vZGUgY2Fubm90IGJlIHN3aXRjaGVkIGFmdGVyIHRoYXQuCisgIC8vIFx0aHJvd3Mgc3RkOjpsb2dpY19lcnJvciBpZiBsaXN0ZW4oKSBoYXMgYmVlbiBjYWxsZWQKKyAgdm9pZCBzZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oYm9vbCBlbmFibGUpOworCisgIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiBzZXJ2ZXJTb2NrZXRfOyB9CisKKyAgaW50IGdldFBvcnQoKTsKKworICB2b2lkIGxpc3RlbigpOworICB2b2lkIGludGVycnVwdCgpOworICB2b2lkIGludGVycnVwdENoaWxkcmVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworICBib29sIGludGVycnVwdGFibGVDaGlsZHJlbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXzsgLy8gaWYgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisKK3ByaXZhdGU6CisgIHZvaWQgbm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29jayk7CisKKyAgaW50IHBvcnRfOworICBzdGQ6OnN0cmluZyBhZGRyZXNzXzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKKyAgaW50IGFjY2VwdEJhY2tsb2dfOworICBpbnQgc2VuZFRpbWVvdXRfOworICBpbnQgcmVjdlRpbWVvdXRfOworICBpbnQgYWNjVGltZW91dF87CisgIGludCByZXRyeUxpbWl0XzsKKyAgaW50IHJldHJ5RGVsYXlfOworICBpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIGludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CisKKyAgY29uY3VycmVuY3k6Ok11dGV4IHJ3TXV0ZXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZC1zYWZlIGludGVycnVwdAorICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0KCkKKyAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrUmVhZGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVzZWQgaW4gc2VsZWN0L3BvbGwgd2l0aCBzZXJ2ZXJTb2NrZXRfIGZvciBpbnRlcnJ1cHRhYmlsaXR5CisgIFRIUklGVF9TT0NLRVQgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHRDaGlsZHJlbigpCisKKyAgc29ja2V0X2Z1bmNfdCBsaXN0ZW5DYWxsYmFja187CisgIHNvY2tldF9mdW5jX3QgYWNjZXB0Q2FsbGJhY2tfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzYzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCisgKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLiAgVGhlIHNlcnZlciBpcyBleHBlY3RlZAorICogdG8ga2VlcCB0cmFjayBvZiBUVHJhbnNwb3J0IGNoaWxkcmVuIHRoYXQgaXQgY3JlYXRlcyBmb3IgcHVycG9zZXMgb2YKKyAqIGNvbnRyb2xsaW5nIHRoZWlyIGxpZmV0aW1lLgorICovCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFNlcnZlclRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gUHJpb3IgdG8gdGhpcworICAgKiBjYWxsIG1vc3QgdHJhbnNwb3J0cyB3aWxsIG5vdCByZXR1cm4gYW55dGhpbmcgd2hlbiBhY2NlcHQgaXMgY2FsbGVkLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd2Ugd2VyZSB1bmFibGUgdG8gbGlzdGVuCisgICAqLworICB2aXJ0dWFsIHZvaWQgbGlzdGVuKCkge30KKworICAvKioKKyAgICogR2V0cyBhIG5ldyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IG9iamVjdCBhbmQgcGFzc2VzIGl0IHRvIHRoZQorICAgKiBjYWxsZXIuIE5vdGUgdGhhdCBpdCBpcyB0aGUgZXhwbGljaXQgZHV0eSBvZiB0aGUgY2FsbGVyIHRvIGZyZWUgdGhlCisgICAqIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZXR1cm5lZCBUVHJhbnNwb3J0IG9iamVjdCBtdXN0IGFsd2F5cyBiZSBpbiB0aGUKKyAgICogb3BlbmVkIHN0YXRlLiBOVUxMIHNob3VsZCBuZXZlciBiZSByZXR1cm5lZCwgaW5zdGVhZCBhbiBFeGNlcHRpb24gc2hvdWxkCisgICAqIGFsd2F5cyBiZSB0aHJvd24uCisgICAqCisgICAqIEByZXR1cm4gQSBuZXcgVFRyYW5zcG9ydCBvYmplY3QKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBGb3IgInNtYXJ0IiBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0aGF0IHdvcmsgaW4gYSBtdWx0aQorICAgKiB0aHJlYWRlZCBjb250ZXh0IHRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgb3V0IG9mIGFuIGFjY2VwdCgpIGNhbGwuCisgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHRyYW5zcG9ydCB3aWxsIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBJTlRFUlJVUFRFRCBlcnJvciBjb2RlLgorICAgKgorICAgKiBUaGlzIHdpbGwgbm90IG1ha2UgYW4gYXR0ZW1wdCB0byBpbnRlcnJ1cHQgYW55IFRUcmFuc3BvcnQgY2hpbGRyZW4uCisgICAqLworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30KKworICAvKioKKyAgICogVGhpcyB3aWxsIGludGVycnVwdCB0aGUgY2hpbGRyZW4gY3JlYXRlZCBieSB0aGUgc2VydmVyIHRyYW5zcG9ydC4KKyAgICogYWxsb3dpbmcgdGhlbSB0byBicmVhayBvdXQgb2YgYW55IGJsb2NraW5nIGRhdGEgcmVjZXB0aW9uIGNhbGwuCisgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGNoaWxkcmVuIHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqIHdpdGggdGhlIElOVEVSUlVQVEVEIGVycm9yIGNvZGUuCisgICAqLworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0Q2hpbGRyZW4oKSB7fQorCisgIC8qKgorICAqIFV0aWxpdHkgbWV0aG9kCisgICoKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gLTE7IH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworcHJvdGVjdGVkOgorICBUU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gZm9yIGFjY2VwdC4KKyAgICoKKyAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4MjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIHRlc3QgeworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgb25seSBtZWFudCBmb3IgdGVzdGluZy4gIEl0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0LgorICogQ2FsbHMgdG8gcmVhZCBhcmUgcGFzc2VkIHRocm91Z2ggd2l0aCBzb21lIHByb2JhYmlsaXR5LiAgT3RoZXJ3aXNlLAorICogdGhlIHJlYWQgYW1vdW50IGlzIHJhbmRvbWx5IHJlZHVjZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0aHJvdWdoLgorICoKKyAqLworY2xhc3MgVFNob3J0UmVhZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU2hvcnRSZWFkVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIFRTaG9ydFJlYWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwgZnVsbFByb2JfKGZ1bGxfcHJvYikge30KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHJhbmQoKSAvIChkb3VibGUpUkFORF9NQVggPj0gZnVsbFByb2JfKSB7CisgICAgICBsZW4gPSAxICsgcmFuZCgpICUgbGVuOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7CisgIH0KKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsgfQorCisgIHZvaWQgZmx1c2goKSB7IHRyYW5zcG9ydF8tPmZsdXNoKCk7IH0KKworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7IHJldHVybiB0cmFuc3BvcnRfLT5ib3Jyb3coYnVmLCBsZW4pOyB9CisKKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Y29uc3VtZShsZW4pOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIGRvdWJsZSBmdWxsUHJvYl87Cit9OworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMzk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUU2ltcGxlRmlsZVRyYW5zcG9ydDo6VFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCwgYm9vbCB3cml0ZSkKKyAgOiBURkRUcmFuc3BvcnQoLTEsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkgeworICBpbnQgZmxhZ3MgPSAwOworICBpZiAocmVhZCAmJiB3cml0ZSkgeworICAgIGZsYWdzID0gT19SRFdSOworICB9IGVsc2UgaWYgKHJlYWQpIHsKKyAgICBmbGFncyA9IE9fUkRPTkxZOworICB9IGVsc2UgaWYgKHdyaXRlKSB7CisgICAgZmxhZ3MgPSBPX1dST05MWTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOZWl0aGVyIFJFQUQgbm9yIFdSSVRFIHNwZWNpZmllZCIpOworICB9CisgIGlmICh3cml0ZSkgeworICAgIGZsYWdzIHw9IE9fQ1JFQVQgfCBPX0FQUEVORDsKKyAgfQorI2lmbmRlZiBfV0lOMzIKKyAgbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworI2Vsc2UKKyAgaW50IG1vZGUgPSBfU19JUkVBRCB8IF9TX0lXUklURTsKKyNlbmRpZgorICBpbnQgZmQgPSA6OlRIUklGVF9PUEVOKHBhdGguY19zdHIoKSwgZmxhZ3MsIG1vZGUpOworICBpZiAoZmQgPCAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiZmFpbGVkIHRvIG9wZW4gZmlsZSBmb3Igd3JpdGluZzogIiArIHBhdGgpOworICB9CisgIHNldEZEKGZkKTsKKyAgb3BlbigpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlMTg5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZS4KKyAqCisgKiBXcml0ZWFibGUgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIE9fQ1JFQVQgYW5kIE9fQVBQRU5ECisgKi8KK2NsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGRFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQgPSB0cnVlLCBib29sIHdyaXRlID0gZmFsc2UpOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMyYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcApAQCAtMCwwICsxLDk1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFRTb2NrZXQgaW1wbGVtZW50YXRpb24uCisgKgorICovCisKK1RTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBob3N0Xyhob3N0KSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7Cit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKK30KKworVFNvY2tldDo6VFNvY2tldCgpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworfQorCitUU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KQorICA6IHBvcnRfKDApLAorICAgIHNvY2tldF8oc29ja2V0KSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgorfQorCitUU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0Xyhzb2NrZXQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBpbnRlcnJ1cHRMaXN0ZW5lcl8oaW50ZXJydXB0TGlzdGVuZXIpLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisjaWZkZWYgU09fTk9TSUdQSVBFCisgIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKK30KKworVFNvY2tldDo6flRTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK2Jvb2wgVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbnQzMl90IHJldHJpZXMgPSAwOworICBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIG51bUJ5dGVzQXZhaWxhYmxlOwordHJ5X2FnYWluOgorICBpbnQgciA9IFRIUklGVF9JT0NUTF9TT0NLRVQoc29ja2V0XywgRklPTlJFQUQsICZudW1CeXRlc0F2YWlsYWJsZSk7CisgIGlmIChyID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykpIHsKKyAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIFRIUklGVF9JT0NUTF9TT0NLRVQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0KKyAgcmV0dXJuIG51bUJ5dGVzQXZhaWxhYmxlID4gMDsKK30KKworYm9vbCBUU29ja2V0Ojppc09wZW4oKSB7CisgIHJldHVybiAoc29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpOworfQorCitib29sIFRTb2NrZXQ6OnBlZWsoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIGZvciAoaW50IHJldHJpZXMgPSAwOzspIHsKKyAgICAgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKyAgICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgICAgZmRzWzBdLmZkID0gc29ja2V0XzsKKyAgICAgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAyLCAocmVjdlRpbWVvdXRfID09IDApID8gLTEgOiByZWN2VGltZW91dF8pOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnBlZWsoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBkYXRhIG9yIGEgZGlzY29ubmVjdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSBQRUVLCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdGltZW91dAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQKKyAgdWludDhfdCBidWY7CisgIGludCByID0gc3RhdGljX2Nhc3Q8aW50PihyZWN2KHNvY2tldF8sIGNhc3Rfc29ja29wdCgmYnVmKSwgMSwgTVNHX1BFRUspKTsKKyAgaWYgKHIgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXworICAgIC8qIHNoaWdpbjoKKyAgICAgKiBmcmVlYnNkIHJldHVybnMgLTEgYW5kIFRIUklGVF9FQ09OTlJFU0VUIGlmIHNvY2tldCB3YXMgY2xvc2VkIGJ5CisgICAgICogdGhlIG90aGVyIHNpZGUKKyAgICAgKi8KKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnBlZWsoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmVjdigpIiwgZXJybm9fY29weSk7CisgIH0KKyAgcmV0dXJuIChyID4gMCk7Cit9CisKK3ZvaWQgVFNvY2tldDo6b3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvKiByZXMpIHsKKworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICBzb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgfSBlbHNlIHsKKyAgICBzb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIHNvY2tldCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQoKSIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2VuZCB0aW1lb3V0CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgc2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKKyAgfQorCisgIC8vIFJlY3YgdGltZW91dAorICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIHNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7CisgIH0KKworICBpZiAoa2VlcEFsaXZlXykgeworICAgIHNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKKyAgfQorCisgIC8vIExpbmdlcgorICBzZXRMaW5nZXIobGluZ2VyT25fLCBsaW5nZXJWYWxfKTsKKworICAvLyBObyBkZWxheQorICBzZXROb0RlbGF5KG5vRGVsYXlfKTsKKworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCisKKy8vIFVzZXMgYSBsb3cgbWluIFJUTyBpZiBhc2tlZCB0by4KKyNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KKyAgaWYgKGdldFVzZUxvd01pblJ0bygpKSB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgorCisgIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChjb25uVGltZW91dF8gPiAwKSB7CisgICAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzICYgflRIUklGVF9PX05PTkJMT0NLKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgLy8gQ29ubmVjdCB0aGUgc29ja2V0CisgIGludCByZXQ7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworCisjaWZuZGVmIF9XSU4zMgorICAgIHNpemVfdCBsZW4gPSBwYXRoXy5zaXplKCkgKyAxOworICAgIGlmIChsZW4gPiBzaXplb2YoKChzb2NrYWRkcl91biopTlVMTCktPnN1bl9wYXRoKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIpOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOworICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKKyAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCisgICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKTsKKyNlbHNlCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBjb25uZWN0KHNvY2tldF8sIHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8aW50PihyZXMtPmFpX2FkZHJsZW4pKTsKKyAgfQorCisgIC8vIHN1Y2Nlc3MgY2FzZQorICBpZiAocmV0ID09IDApIHsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FSU5QUk9HUkVTUykKKyAgICAgICYmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgY29ubmVjdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJjb25uZWN0KCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMV07CisgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICBmZHNbMF0uZmQgPSBzb2NrZXRfOworICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExPVVQ7CisgIHJldCA9IFRIUklGVF9QT0xMKGZkcywgMSwgY29ublRpbWVvdXRfKTsKKworICBpZiAocmV0ID4gMCkgeworICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAorICAgIGludCB2YWw7CisgICAgc29ja2xlbl90IGxvbjsKKyAgICBsb24gPSBzaXplb2YoaW50KTsKKyAgICBpbnQgcmV0MiA9IGdldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fRVJST1IsIGNhc3Rfc29ja29wdCgmdmFsKSwgJmxvbik7CisgICAgaWYgKHJldDIgPT0gLTEpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZ2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImdldHNvY2tvcHQoKSIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCisgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIFRIUklGVF9QT0xMKSAiICsgZ2V0U29ja2V0SW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAic29ja2V0IG9wZW4oKSBlcnJvciIsIHZhbCk7CisgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAvLyBzb2NrZXQgdGltZWQgb3V0CisgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0OjpvcGVuKCkgdGltZWQgb3V0ICIgKyBnZXRTb2NrZXRJbmZvKCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAib3BlbigpIHRpbWVkIG91dCIpOworICB9IGVsc2UgeworICAgIC8vIGVycm9yIG9uIFRIUklGVF9QT0xMKCkKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfUE9MTCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfUE9MTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CisKK2RvbmU6CisgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgIH0KKworICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIHNldENhY2hlZEFkZHJlc3MocmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHJlcy0+YWlfYWRkcmxlbikpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6b3BlbigpIHsKKyAgaWYgKGlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHVuaXhfb3BlbigpOworICB9IGVsc2UgeworICAgIGxvY2FsX29wZW4oKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgLy8gVW5peCBEb21haW4gU09ja2V0IGRvZXMgbm90IG5lZWQgYWRkcmluZm8gc3RydWN0LCBzbyB3ZSBwYXNzIE5VTEwKKyAgICBvcGVuQ29ubmVjdGlvbihOVUxMKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OmxvY2FsX29wZW4oKSB7CisKKyNpZmRlZiBfV0lOMzIKKyAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmIC8vIF9XSU4zMgorCisgIGlmIChpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOworICB9CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKKyAgcmVzID0gTlVMTDsKKyAgcmVzMCA9IE5VTEw7CisgIGludCBlcnJvcjsKKyAgY2hhciBwb3J0W3NpemVvZigiNjU1MzUiKV07CisgIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKKyAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7CisKKyAgZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0Xy5jX3N0cigpLCBwb3J0LCAmaGludHMsICZyZXMwKTsKKworI2lmZGVmIF9XSU4zMgorICBpZiAoZXJyb3IgPT0gV1NBTk9fREFUQSkgeworICAgIGhpbnRzLmFpX2ZsYWdzICY9IH5BSV9BRERSQ09ORklHOworICAgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdF8uY19zdHIoKSwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7CisgIH0KKyNlbmRpZgorCisgIGlmIChlcnJvcikgeworICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIGdldGFkZHJpbmZvKCkgIiArIGdldFNvY2tldEluZm8oKQorICAgICAgICAgICAgICAgICAgICArIHN0cmluZyhUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3IgY2xpZW50IHNvY2tldC4iKTsKKyAgfQorCisgIC8vIEN5Y2xlIHRocm91Z2ggYWxsIHRoZSByZXR1cm5lZCBhZGRyZXNzZXMgdW50aWwgb25lCisgIC8vIGNvbm5lY3RzIG9yIHB1c2ggdGhlIGV4Y2VwdGlvbiB1cC4KKyAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIHRyeSB7CisgICAgICBvcGVuQ29ubmVjdGlvbihyZXMpOworICAgICAgYnJlYWs7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIGlmIChyZXMtPmFpX25leHQpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsgLy8gY2xlYW51cCBvbiBmYWlsdXJlCisgICAgICAgIHRocm93OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZyZWUgYWRkcmVzcyBzdHJ1Y3R1cmUgbWVtb3J5CisgIGZyZWVhZGRyaW5mbyhyZXMwKTsKK30KKwordm9pZCBUU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc29ja2V0Xyk7CisgIH0KKyAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKwordm9pZCBUU29ja2V0OjpzZXRTb2NrZXRGRChUSFJJRlRfU09DS0VUIHNvY2tldCkgeworICBpZiAoc29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBjbG9zZSgpOworICB9CisgIHNvY2tldF8gPSBzb2NrZXQ7Cit9CisKK3VpbnQzMl90IFRTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCIpOworICB9CisKKyAgaW50MzJfdCByZXRyaWVzID0gMDsKKworICAvLyBUSFJJRlRfRUFHQUlOIGNhbiBiZSBzaWduYWxsZWQgYm90aCB3aGVuIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgYW5kIHdoZW4KKyAgLy8gdGhlIHN5c3RlbSBpcyBvdXQgb2YgcmVzb3VyY2VzIChhbiBhd2Vzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlKS4KKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFsIHVuZGVyIHdoaWNoCisgIC8vIFRIUklGVF9FQUdBSU4gaXMgdGFrZW4gdG8gaW5kaWNhdGUgYW4gb3V0IG9mIHJlc291cmNlcyBlcnJvci4KKyAgdWludDMyX3QgZWFnYWluVGhyZXNob2xkTWljcm9zID0gMDsKKyAgaWYgKHJlY3ZUaW1lb3V0XykgeworICAgIC8vIGlmIGEgcmVhZFRpbWVvdXQgaXMgc3BlY2lmaWVkIGFsb25nIHdpdGggYSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcywgdGhlbgorICAgIC8vIHRoZSB0aHJlc2hvbGQgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcmVhZCB0aW1lb3V0IGlzIG5vdCBleGNlZWRlZCBldmVuIGluIHRoZQorICAgIC8vIGNhc2Ugb2YgcmVzb3VyY2UgZXJyb3JzCisgICAgZWFnYWluVGhyZXNob2xkTWljcm9zID0gKHJlY3ZUaW1lb3V0XyAqIDEwMDApIC8gKChtYXhSZWN2UmV0cmllc18gPiAwKSA/IG1heFJlY3ZSZXRyaWVzXyA6IDIpOworICB9CisKK3RyeV9hZ2FpbjoKKyAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgc3RydWN0IHRpbWV2YWwgYmVnaW47CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmYmVnaW4sIE5VTEwpOworICB9IGVsc2UgeworICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlYWQgdGltZW91dCB3ZSBkb24ndCBuZWVkIHRoZSBUT0QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KKyAgICBiZWdpbi50dl9zZWMgPSBiZWdpbi50dl91c2VjID0gMDsKKyAgfQorCisgIGludCBnb3QgPSAwOworCisgIGlmIChpbnRlcnJ1cHRMaXN0ZW5lcl8pIHsKKyAgICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgICAgZmRzWzBdLmZkID0gc29ja2V0XzsKKyAgICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICBmZHNbMV0uZmQgPSAqKGludGVycnVwdExpc3RlbmVyXy5nZXQoKSk7CisgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisKKyAgICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAyLCAocmVjdlRpbWVvdXRfID09IDApID8gLTEgOiByZWN2VGltZW91dF8pOworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykpIHsKKyAgICAgICAgZ290byB0cnlfYWdhaW47CisgICAgICB9CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpyZWFkKCkgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiSW50ZXJydXB0ZWQiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgLyogcmV0ID09IDAgKi8geworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfRUFHQUlOICh0aW1lZCBvdXQpIik7CisgICAgfQorCisgICAgLy8gZmFsbGluZyB0aHJvdWdoIG1lYW5zIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWN2IGFuZCBpdCBjYW5ub3QgYmxvY2sKKyAgfQorCisgIGdvdCA9IHN0YXRpY19jYXN0PGludD4ocmVjdihzb2NrZXRfLCBjYXN0X3NvY2tvcHQoYnVmKSwgbGVuLCAwKSk7CisgIC8vIFRIUklGVF9HRVRUSU1FT0ZEQVkgY2FuIGNoYW5nZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUgorICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworCisgIC8vIENoZWNrIGZvciBlcnJvciBvbiByZWFkCisgIGlmIChnb3QgPCAwKSB7CisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VBR0FJTikgeworICAgICAgLy8gaWYgbm8gdGltZW91dCB3ZSBjYW4gYXNzdW1lIHRoYXQgcmVzb3VyY2UgZXhoYXVzdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICBpZiAocmVjdlRpbWVvdXRfID09IDApIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykiKTsKKyAgICAgIH0KKyAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhY2sgb2YgcmVzb3VyY2VzIG9yIHRpbWVvdXQgY2FzZQorICAgICAgc3RydWN0IHRpbWV2YWwgZW5kOworICAgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmZW5kLCBOVUxMKTsKKyAgICAgIHVpbnQzMl90IHJlYWRFbGFwc2VkTWljcm9zID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCgoZW5kLnR2X3NlYyAtIGJlZ2luLnR2X3NlYykgKiAxMDAwICogMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGVuZC50dl91c2VjIC0gYmVnaW4udHZfdXNlYykpOworCisgICAgICBpZiAoIWVhZ2FpblRocmVzaG9sZE1pY3JvcyB8fCAocmVhZEVsYXBzZWRNaWNyb3MgPCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MpKSB7CisgICAgICAgIGlmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyg1MCk7CisgICAgICAgICAgZ290byB0cnlfYWdhaW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgcmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICB9CisKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgorICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FTk9UQ09OTikgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9FTk9UQ09OTiIpOworICAgIH0KKworICAgIC8vIFRpbWVkIG91dCEKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRVRJTUVET1VUKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9FVElNRURPVVQiKTsKKyAgICB9CisKKyAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnJlYWQoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisKKyAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9CisKKyAgcmV0dXJuIGdvdDsKK30KKwordm9pZCBUU29ja2V0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBzZW50ID0gMDsKKworICB3aGlsZSAoc2VudCA8IGxlbikgeworICAgIHVpbnQzMl90IGIgPSB3cml0ZV9wYXJ0aWFsKGJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQpOworICAgIGlmIChiID09IDApIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCisgICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgInNlbmQgdGltZW91dCBleHBpcmVkIik7CisgICAgfQorICAgIHNlbnQgKz0gYjsKKyAgfQorfQorCit1aW50MzJfdCBUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Iik7CisgIH0KKworICB1aW50MzJfdCBzZW50ID0gMDsKKworICBpbnQgZmxhZ3MgPSAwOworI2lmZGVmIE1TR19OT1NJR05BTAorICAvLyBOb3RlIHRoZSB1c2Ugb2YgTVNHX05PU0lHTkFMIHRvIHN1cHByZXNzIFNJR1BJUEUgZXJyb3JzLCBpbnN0ZWFkIHdlCisgIC8vIGNoZWNrIGZvciB0aGUgVEhSSUZUX0VQSVBFIHJldHVybiBjb25kaXRpb24gYW5kIGNsb3NlIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlCisgIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKKyNlbmRpZiAvLyBpZmRlZiBNU0dfTk9TSUdOQUwKKworICBpbnQgYiA9IHN0YXRpY19jYXN0PGludD4oc2VuZChzb2NrZXRfLCBjb25zdF9jYXN0X3NvY2tvcHQoYnVmICsgc2VudCksIGxlbiAtIHNlbnQsIGZsYWdzKSk7CisKKyAgaWYgKGIgPCAwKSB7CisgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FV09VTERCTE9DSyB8fCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUFHQUlOKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gRmFpbCBvbiBhIHNlbmQgZXJyb3IKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OndyaXRlX3BhcnRpYWwoKSBzZW5kKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRVBJUEUgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVAorICAgICAgICB8fCBlcnJub19jb3B5ID09IFRIUklGVF9FTk9UQ09OTikgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIndyaXRlKCkgc2VuZCgpIiwgZXJybm9fY29weSk7CisgICAgfQorCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEZhaWwgb24gYmxvY2tlZCBzZW5kCisgIGlmIChiID09IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiU29ja2V0IHNlbmQgcmV0dXJuZWQgMC4iKTsKKyAgfQorICByZXR1cm4gYjsKK30KKworc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0SG9zdCgpIHsKKyAgcmV0dXJuIGhvc3RfOworfQorCitpbnQgVFNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCit2b2lkIFRTb2NrZXQ6OnNldEhvc3Qoc3RyaW5nIGhvc3QpIHsKKyAgaG9zdF8gPSBob3N0OworfQorCit2b2lkIFRTb2NrZXQ6OnNldFBvcnQoaW50IHBvcnQpIHsKKyAgcG9ydF8gPSBwb3J0OworfQorCit2b2lkIFRTb2NrZXQ6OnNldExpbmdlcihib29sIG9uLCBpbnQgbGluZ2VyKSB7CisgIGxpbmdlck9uXyA9IG9uOworICBsaW5nZXJWYWxfID0gbGluZ2VyOworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICByZXR1cm47CisgIH0KKworI2lmbmRlZiBfV0lOMzIKKyAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OworI2Vsc2UKKyAgc3RydWN0IGxpbmdlciBsID0ge3N0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlck9uXyA/IDEgOiAwKSwgc3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyVmFsXyl9OworI2VuZGlmCisKKyAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmwpLCBzaXplb2YobCkpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkKKyAgICAgICAgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldExpbmdlcigpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnNldE5vRGVsYXkoYm9vbCBub0RlbGF5KSB7CisgIG5vRGVsYXlfID0gbm9EZWxheTsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUIHx8ICFwYXRoXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2V0IHNvY2tldCB0byBOT0RFTEFZCisgIGludCB2ID0gbm9EZWxheV8gPyAxIDogMDsKKyAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJnYpLCBzaXplb2YodikpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkKKyAgICAgICAgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpzZXRDb25uVGltZW91dChpbnQgbXMpIHsKKyAgY29ublRpbWVvdXRfID0gbXM7Cit9CisKK3ZvaWQgc2V0R2VuZXJpY1RpbWVvdXQoVEhSSUZUX1NPQ0tFVCBzLCBpbnQgdGltZW91dF9tcywgaW50IG9wdG5hbWUpIHsKKyAgaWYgKHRpbWVvdXRfbXMgPCAwKSB7CisgICAgY2hhciBlcnJCdWZbNTEyXTsKKyAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldEdlbmVyaWNUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCB0aW1lb3V0X21zKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyQnVmKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICByZXR1cm47CisgIH0KKworI2lmZGVmIF9XSU4zMgorICBEV09SRCBwbGF0Zm9ybV90aW1lID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KHRpbWVvdXRfbXMpOworI2Vsc2UKKyAgc3RydWN0IHRpbWV2YWwgcGxhdGZvcm1fdGltZSA9IHsoaW50KSh0aW1lb3V0X21zIC8gMTAwMCksIChpbnQpKCh0aW1lb3V0X21zICUgMTAwMCkgKiAxMDAwKX07CisjZW5kaWYKKworICBpbnQgcmV0ID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBvcHRuYW1lLCBjYXN0X3NvY2tvcHQoJnBsYXRmb3JtX3RpbWUpLCBzaXplb2YocGxhdGZvcm1fdGltZSkpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkKKyAgICAgICAgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldEdlbmVyaWNUaW1lb3V0KCkgc2V0c29ja29wdCgpICIsIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IG1zKSB7CisgIHNldEdlbmVyaWNUaW1lb3V0KHNvY2tldF8sIG1zLCBTT19SQ1ZUSU1FTyk7CisgIHJlY3ZUaW1lb3V0XyA9IG1zOworfQorCit2b2lkIFRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBtcykgeworICBzZXRHZW5lcmljVGltZW91dChzb2NrZXRfLCBtcywgU09fU05EVElNRU8pOworICBzZW5kVGltZW91dF8gPSBtczsKK30KKwordm9pZCBUU29ja2V0OjpzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpIHsKKyAga2VlcEFsaXZlXyA9IGtlZXBBbGl2ZTsKKworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgdmFsdWUgPSBrZWVwQWxpdmVfOworICBpbnQgcmV0CisgICAgICA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJnZhbHVlKSwgc2l6ZW9mKHZhbHVlKSk7CisKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRLZWVwQWxpdmUoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpzZXRNYXhSZWN2UmV0cmllcyhpbnQgbWF4UmVjdlJldHJpZXMpIHsKKyAgbWF4UmVjdlJldHJpZXNfID0gbWF4UmVjdlJldHJpZXM7Cit9CisKK3N0cmluZyBUU29ja2V0OjpnZXRTb2NrZXRJbmZvKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKKyAgICAgIG9zcyA8PCAiIFBvcnQ6ICIgPDwgZ2V0UGVlclBvcnQoKSA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3NzIDw8ICI8UGF0aDogIiA8PCBwYXRoXyA8PCAiPiI7CisgIH0KKyAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSB7CisgIGlmIChwZWVySG9zdF8uZW1wdHkoKSAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7CisgICAgc29ja2xlbl90IGFkZHJMZW47CisKKyAgICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgIHJldHVybiBob3N0XzsKKyAgICB9CisKKyAgICBhZGRyUHRyID0gZ2V0Q2FjaGVkQWRkcmVzcygmYWRkckxlbik7CisKKyAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7CisgICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBwZWVySG9zdF87CisgICAgICB9CisgICAgICBhZGRyUHRyID0gKHNvY2thZGRyKikmYWRkcjsKKworICAgICAgc2V0Q2FjaGVkQWRkcmVzcyhhZGRyUHRyLCBhZGRyTGVuKTsKKyAgICB9CisKKyAgICBjaGFyIGNsaWVudGhvc3RbTklfTUFYSE9TVF07CisgICAgY2hhciBjbGllbnRzZXJ2aWNlW05JX01BWFNFUlZdOworCisgICAgZ2V0bmFtZWluZm8oKHNvY2thZGRyKilhZGRyUHRyLAorICAgICAgICAgICAgICAgIGFkZHJMZW4sCisgICAgICAgICAgICAgICAgY2xpZW50aG9zdCwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50aG9zdCksCisgICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50c2VydmljZSksCisgICAgICAgICAgICAgICAgMCk7CisKKyAgICBwZWVySG9zdF8gPSBjbGllbnRob3N0OworICB9CisgIHJldHVybiBwZWVySG9zdF87Cit9CisKK3N0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJBZGRyZXNzKCkgeworICBpZiAocGVlckFkZHJlc3NfLmVtcHR5KCkgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyKiBhZGRyUHRyOworICAgIHNvY2tsZW5fdCBhZGRyTGVuOworCisgICAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgICByZXR1cm4gcGVlckFkZHJlc3NfOworICAgIH0KKworICAgIGFkZHJQdHIgPSBnZXRDYWNoZWRBZGRyZXNzKCZhZGRyTGVuKTsKKworICAgIGlmIChhZGRyUHRyID09IE5VTEwpIHsKKyAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7CisgICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKKyAgICAgIH0KKyAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOworCisgICAgICBzZXRDYWNoZWRBZGRyZXNzKGFkZHJQdHIsIGFkZHJMZW4pOworICAgIH0KKworICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKKyAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07CisKKyAgICBnZXRuYW1laW5mbyhhZGRyUHRyLAorICAgICAgICAgICAgICAgIGFkZHJMZW4sCisgICAgICAgICAgICAgICAgY2xpZW50aG9zdCwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50aG9zdCksCisgICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50c2VydmljZSksCisgICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7CisKKyAgICBwZWVyQWRkcmVzc18gPSBjbGllbnRob3N0OworICAgIHBlZXJQb3J0XyA9IHN0ZDo6YXRvaShjbGllbnRzZXJ2aWNlKTsKKyAgfQorICByZXR1cm4gcGVlckFkZHJlc3NfOworfQorCitpbnQgVFNvY2tldDo6Z2V0UGVlclBvcnQoKSB7CisgIGdldFBlZXJBZGRyZXNzKCk7CisgIHJldHVybiBwZWVyUG9ydF87Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGxlbikgeworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgeworICBjYXNlIEFGX0lORVQ6CisgICAgaWYgKGxlbiA9PSBzaXplb2Yoc29ja2FkZHJfaW4pKSB7CisgICAgICBtZW1jcHkoKHZvaWQqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NCwgKHZvaWQqKWFkZHIsIGxlbik7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQUZfSU5FVDY6CisgICAgaWYgKGxlbiA9PSBzaXplb2Yoc29ja2FkZHJfaW42KSkgeworICAgICAgbWVtY3B5KCh2b2lkKikmY2FjaGVkUGVlckFkZHJfLmlwdjYsICh2b2lkKilhZGRyLCBsZW4pOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBwZWVyQWRkcmVzc18uY2xlYXIoKTsKKyAgcGVlckhvc3RfLmNsZWFyKCk7Cit9CisKK3NvY2thZGRyKiBUU29ja2V0OjpnZXRDYWNoZWRBZGRyZXNzKHNvY2tsZW5fdCogbGVuKSBjb25zdCB7CisgIHN3aXRjaCAoY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSkgeworICBjYXNlIEFGX0lORVQ6CisgICAgKmxlbiA9IHNpemVvZihzb2NrYWRkcl9pbik7CisgICAgcmV0dXJuIChzb2NrYWRkciopJmNhY2hlZFBlZXJBZGRyXy5pcHY0OworCisgIGNhc2UgQUZfSU5FVDY6CisgICAgKmxlbiA9IHNpemVvZihzb2NrYWRkcl9pbjYpOworICAgIHJldHVybiAoc29ja2FkZHIqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NjsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2Jvb2wgVFNvY2tldDo6dXNlTG93TWluUnRvXyA9IGZhbHNlOwordm9pZCBUU29ja2V0OjpzZXRVc2VMb3dNaW5SdG8oYm9vbCB1c2VMb3dNaW5SdG8pIHsKKyAgdXNlTG93TWluUnRvXyA9IHVzZUxvd01pblJ0bzsKK30KK2Jvb2wgVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkgeworICByZXR1cm4gdXNlTG93TWluUnRvXzsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0T3JpZ2luKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICBvc3MgPDwgZ2V0UGVlckhvc3QoKSA8PCAiOiIgPDwgZ2V0UGVlclBvcnQoKTsKKyAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMwZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKi8KK2NsYXNzIFRTb2NrZXQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNvY2tldD4geworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAqIHNvY2tldC4KKyAgICoKKyAgICovCisgIFRTb2NrZXQoKTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAqIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCisgICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICovCisgIFRTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBVbml4IGRvbWFpbiBzb2NrZXQuCisgICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggVGhlIFVuaXggZG9tYWluIHNvY2tldCBlLmcuICIvdG1wL1RocmlmdFRlc3QuYmluYXJ5LnRocmlmdCIKKyAgICovCisgIFRTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIC8qKgorICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgKi8KKyAgdmlydHVhbCB+VFNvY2tldCgpOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUuCisgICAqCisgICAqIEByZXR1cm4gSXMgdGhlIHNvY2tldCBhbGl2ZT8KKyAgICovCisgIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKKworICAvKioKKyAgICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgc29ja2V0IHRvIHJlYWQuCisgICAqCisgICAqIFRoaXMgY2FsbCBibG9ja3MgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgYXZhaWxhYmxlIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgorICAgKi8KKyAgdmlydHVhbCBib29sIHBlZWsoKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9wZW4oKTsKKworICAvKioKKyAgICogU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCBvciBub3QuCisgICAqCisgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBibG9jay4KKyAgICogXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgKiAgICAgICAgICAgTk9UX09QRU4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICogICAgICAgICAgIFVOS05PV04gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICogXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKKworICAvKioKKyAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluZGljYXRlcyBFT0YKKyAgICogXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgKiAgICAgICAgICAgSU5URVJSVVBURUQgbWVhbnMgdGhlIHNvY2tldCB3YXMgaW50ZXJydXB0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgICAgIG91dCBvZiBhIGJsb2NraW5nIGNhbGwKKyAgICogICAgICAgICAgIE5PVF9PUEVOIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAqICAgICAgICAgICBUSU1FRF9PVVQgbWVhbnMgdGhlIHJlY2VpdmUgdGltZW91dCBleHBpcmVkCisgICAqICAgICAgICAgICBVTktOT1dOIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8qKgorICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgTG9vcHMgdW50aWwgZG9uZSBvciBmYWlsLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8qKgorICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgKgorICAgKiBAcmV0dXJuIHN0cmluZyBob3N0IGlkZW50aWZpZXIKKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldEhvc3QoKTsKKworICAvKioKKyAgICogR2V0IHRoZSBwb3J0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICoKKyAgICogQHJldHVybiBpbnQgcG9ydCBudW1iZXIKKyAgICovCisgIGludCBnZXRQb3J0KCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgaG9zdCB0aGF0IHNvY2tldCB3aWxsIGNvbm5lY3QgdG8KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgaG9zdCBpZGVudGlmaWVyCisgICAqLworICB2b2lkIHNldEhvc3Qoc3RkOjpzdHJpbmcgaG9zdCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgcG9ydCB0aGF0IHNvY2tldCB3aWxsIGNvbm5lY3QgdG8KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgcG9ydCBudW1iZXIKKyAgICovCisgIHZvaWQgc2V0UG9ydChpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpbmdlciBvcHRpb24gaXMgc2V0IG9uIHRoZSBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBvbiAgICAgIFdoZXRoZXIgU09fTElOR0VSIGlzIG9uCisgICAqIEBwYXJhbSBsaW5nZXIgIElmIGxpbmdlciBpcyBhY3RpdmUsIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBsaW5nZXIgZm9yCisgICAqLworICB2b2lkIHNldExpbmdlcihib29sIG9uLCBpbnQgbGluZ2VyKTsKKworICAvKioKKyAgICogV2hldGhlciB0byBlbmFibGUvZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobS4KKyAgICoKKyAgICogQHBhcmFtIG5vRGVsYXkgV2hldGhlciBvciBub3QgdG8gZGlzYWJsZSB0aGUgYWxnb3JpdGhtLgorICAgKiBAcmV0dXJuCisgICAqLworICB2b2lkIHNldE5vRGVsYXkoYm9vbCBub0RlbGF5KTsKKworICAvKioKKyAgICogU2V0IHRoZSBjb25uZWN0IHRpbWVvdXQKKyAgICovCisgIHZvaWQgc2V0Q29ublRpbWVvdXQoaW50IG1zKTsKKworICAvKioKKyAgICogU2V0IHRoZSByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IG1zKTsKKworICAvKioKKyAgICogU2V0IHRoZSBzZW5kIHRpbWVvdXQKKyAgICovCisgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IG1zKTsKKworICAvKioKKyAgICogU2V0IHRoZSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcyBpbiBjYXNlIG9mIGFuIFRIUklGVF9FQUdBSU4KKyAgICogZXJyb3IKKyAgICovCisgIHZvaWQgc2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKTsKKworICAvKioKKyAgICogU2V0IFNPX0tFRVBBTElWRQorICAgKi8KKyAgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpOworCisgIC8qKgorICAgKiBHZXQgc29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdHRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0U29ja2V0SW5mbygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0UGVlckhvc3QoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0UGVlckFkZHJlc3MoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgKiovCisgIGludCBnZXRQZWVyUG9ydCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCisgICAqLworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc29ja2V0XzsgfQorCisgIC8qKgorICAgKiAoUmUtKWluaXRpYWxpemUgYSBUU29ja2V0IGZvciB0aGUgc3VwcGxpZWQgZGVzY3JpcHRvci4gIFRoaXMgaXMgb25seQorICAgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IFROb25ibG9ja2luZ1NlcnZlciAtLSBvdGhlciB1c2UgbWF5IHJlc3VsdCBpbgorICAgKiB1bmZvcnR1bmF0ZSBzdXJwcmlzZXMuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciBmb3IgYW4gYWxyZWFkeS1jb25uZWN0ZWQgc29ja2V0CisgICAqLworICB2b2lkIHNldFNvY2tldEZEKFRIUklGVF9TT0NLRVQgZmQpOworCisgIC8qCisgICAqIFJldHVybnMgYSBjYWNoZWQgY29weSBvZiB0aGUgcGVlciBhZGRyZXNzLgorICAgKi8KKyAgc29ja2FkZHIqIGdldENhY2hlZEFkZHJlc3Moc29ja2xlbl90KiBsZW4pIGNvbnN0OworCisgIC8qKgorICAgKiBTZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCisgICAqLworICBzdGF0aWMgdm9pZCBzZXRVc2VMb3dNaW5SdG8oYm9vbCB1c2VMb3dNaW5SdG8pOworCisgIC8qKgorICAgKiBHZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCisgICAqLworICBzdGF0aWMgYm9vbCBnZXRVc2VMb3dNaW5SdG8oKTsKKworICAvKioKKyAgICogR2V0IHRoZSBvcmlnaW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICoKKyAgICogQHJldHVybiBzdHJpbmcgcGVlciBob3N0IGlkZW50aWZpZXIgYW5kIHBvcnQKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBmaWxlIGRlc2NyaXB0b3IuCisgICAqLworICBUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIGZpbGUgZGVzY3JpcHRvciB0aGF0CisgICAqIGNhbiBiZSBpbnRlcnJ1cHRlZCBzYWZlbHkuCisgICAqLworICBUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworCisgIC8qKgorICAgKiBTZXQgYSBjYWNoZSBvZiB0aGUgcGVlciBhZGRyZXNzICh1c2VkIHdoZW4gdHJpdmlhbGx5IGF2YWlsYWJsZTogZS5nLgorICAgKiBhY2NlcHQoKSBvciBjb25uZWN0KCkpLiBPbmx5IGNhY2hlcyBJUFY0IGFuZCBJUFY2OyB1bnNldCBmb3Igb3RoZXJzLgorICAgKi8KKyAgdm9pZCBzZXRDYWNoZWRBZGRyZXNzKGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgbGVuKTsKKworcHJvdGVjdGVkOgorICAvKiogY29ubmVjdCwgY2FsbGVkIGJ5IG9wZW4gKi8KKyAgdm9pZCBvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8qIHJlcyk7CisKKyAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLworICBzdGQ6OnN0cmluZyBob3N0XzsKKworICAvKiogUG9ydCBudW1iZXIgdG8gY29ubmVjdCBvbiAqLworICBpbnQgcG9ydF87CisKKyAgLyoqIFVOSVggZG9tYWluIHNvY2tldCBwYXRoICovCisgIHN0ZDo6c3RyaW5nIHBhdGhfOworCisgIC8qKiBVbmRlcmx5aW5nIHNvY2tldCBoYW5kbGUgKi8KKyAgVEhSSUZUX1NPQ0tFVCBzb2NrZXRfOworCisgIC8qKiBQZWVyIGhvc3RuYW1lICovCisgIHN0ZDo6c3RyaW5nIHBlZXJIb3N0XzsKKworICAvKiogUGVlciBhZGRyZXNzICovCisgIHN0ZDo6c3RyaW5nIHBlZXJBZGRyZXNzXzsKKworICAvKiogUGVlciBwb3J0ICovCisgIGludCBwZWVyUG9ydF87CisKKyAgLyoqCisgICAqIEEgc2hhcmVkIHNvY2tldCBwb2ludGVyIHRoYXQgd2lsbCBpbnRlcnJ1cHQgYSBibG9ja2luZyByZWFkIGlmIGRhdGEKKyAgICogYmVjb21lcyBhdmFpbGFibGUgb24gaXQKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CisKKyAgLyoqIENvbm5lY3QgdGltZW91dCBpbiBtcyAqLworICBpbnQgY29ublRpbWVvdXRfOworCisgIC8qKiBTZW5kIHRpbWVvdXQgaW4gbXMgKi8KKyAgaW50IHNlbmRUaW1lb3V0XzsKKworICAvKiogUmVjdiB0aW1lb3V0IGluIG1zICovCisgIGludCByZWN2VGltZW91dF87CisKKyAgLyoqIEtlZXAgYWxpdmUgb24gKi8KKyAgYm9vbCBrZWVwQWxpdmVfOworCisgIC8qKiBMaW5nZXIgb24gKi8KKyAgYm9vbCBsaW5nZXJPbl87CisKKyAgLyoqIExpbmdlciB2YWwgKi8KKyAgaW50IGxpbmdlclZhbF87CisKKyAgLyoqIE5vZGVsYXkgKi8KKyAgYm9vbCBub0RlbGF5XzsKKworICAvKiogUmVjdiBFR0FJTiByZXRyaWVzICovCisgIGludCBtYXhSZWN2UmV0cmllc187CisKKyAgLyoqIENhY2hlZCBwZWVyIGFkZHJlc3MgKi8KKyAgdW5pb24geworICAgIHNvY2thZGRyX2luIGlwdjQ7CisgICAgc29ja2FkZHJfaW42IGlwdjY7CisgIH0gY2FjaGVkUGVlckFkZHJfOworCisgIC8qKiBXaGV0aGVyIHRvIHVzZSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCAqLworICBzdGF0aWMgYm9vbCB1c2VMb3dNaW5SdG9fOworCitwcml2YXRlOgorICB2b2lkIHVuaXhfb3BlbigpOworICB2b2lkIGxvY2FsX29wZW4oKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc3YmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorI2luY2x1ZGUgPHJhbmRvbT4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oPgorCit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiBUU29ja2V0UG9vbFNlcnZlciBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworVFNvY2tldFBvb2xTZXJ2ZXI6OlRTb2NrZXRQb29sU2VydmVyKCkKKyAgOiBob3N0XygiIiksIHBvcnRfKDApLCBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksIGxhc3RGYWlsVGltZV8oMCksIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCisgKi8KK1RTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IGhvc3RfKGhvc3QpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBsYXN0RmFpbFRpbWVfKDApLAorICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHsKK30KKworLyoqCisgKiBUU29ja2V0UG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKi8KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKCkKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworfQorCitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPHN0cmluZz4mIGhvc3RzLCBjb25zdCB2ZWN0b3I8aW50PiYgcG9ydHMpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKKyAgaWYgKGhvc3RzLnNpemUoKSAhPSBwb3J0cy5zaXplKCkpIHsKKyAgICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpUU29ja2V0UG9vbDogaG9zdHMuc2l6ZSAhPSBwb3J0cy5zaXplIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGhvc3RzLnNpemUoKTsgKytpKSB7CisgICAgYWRkU2VydmVyKGhvc3RzW2ldLCBwb3J0c1tpXSk7CisgIH0KK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxwYWlyPHN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzZXJ2ZXJzLnNpemUoKTsgKytpKSB7CisgICAgYWRkU2VydmVyKHNlcnZlcnNbaV0uZmlyc3QsIHNlcnZlcnNbaV0uc2Vjb25kKTsKKyAgfQorfQorCitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpCisgIDogVFNvY2tldCgpLAorICAgIHNlcnZlcnNfKHNlcnZlcnMpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKKyAgYWRkU2VydmVyKGhvc3QsIHBvcnQpOworfQorCitUU29ja2V0UG9vbDo6flRTb2NrZXRQb29sKCkgeworICB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNlcnZlcnNfLmJlZ2luKCk7CisgIHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyRW5kID0gc2VydmVyc18uZW5kKCk7CisgIGZvciAoOyBpdGVyICE9IGl0ZXJFbmQ7ICsraXRlcikgeworICAgIHNldEN1cnJlbnRTZXJ2ZXIoKml0ZXIpOworICAgIFRTb2NrZXRQb29sOjpjbG9zZSgpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OmFkZFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7CisgIHNlcnZlcnNfLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPihuZXcgVFNvY2tldFBvb2xTZXJ2ZXIoaG9zdCwgcG9ydCkpKTsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKKyAgaWYgKHNlcnZlcikgeworICAgIHNlcnZlcnNfLnB1c2hfYmFjayhzZXJ2ZXIpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldFNlcnZlcnMoY29uc3QgdmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKKyAgc2VydmVyc18gPSBzZXJ2ZXJzOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpnZXRTZXJ2ZXJzKHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7CisgIHNlcnZlcnMgPSBzZXJ2ZXJzXzsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0TnVtUmV0cmllcyhpbnQgbnVtUmV0cmllcykgeworICBudW1SZXRyaWVzXyA9IG51bVJldHJpZXM7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpIHsKKyAgcmV0cnlJbnRlcnZhbF8gPSByZXRyeUludGVydmFsOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7CisgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKSB7CisgIHJhbmRvbWl6ZV8gPSByYW5kb21pemU7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KSB7CisgIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKSB7CisgIGN1cnJlbnRTZXJ2ZXJfID0gc2VydmVyOworICBob3N0XyA9IHNlcnZlci0+aG9zdF87CisgIHBvcnRfID0gc2VydmVyLT5wb3J0XzsKKyAgc29ja2V0XyA9IHNlcnZlci0+c29ja2V0XzsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgc29ja2V0IG9wZW4gZmFpbHMuIFdoZW4gc29ja2V0CisgKiBvcGVucyBmYWlscywgdGhlIHNvY2tldCBpbiB0aGUgY3VycmVudCBzZXJ2ZXIgaXMgcmVzZXQuCisgKi8KKy8qIFRPRE86IHdpdGhvdXQgYXBjIHdlIGlnbm9yZSBhIGxvdCBvZiBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIHBocCB2ZXJzaW9uICovCit2b2lkIFRTb2NrZXRQb29sOjpvcGVuKCkgeworCisgIHNpemVfdCBudW1TZXJ2ZXJzID0gc2VydmVyc18uc2l6ZSgpOworICBpZiAobnVtU2VydmVycyA9PSAwKSB7CisgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgfQorCisgIGlmIChpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyYW5kb21pemVfICYmIG51bVNlcnZlcnMgPiAxKSB7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorICAgIHN0ZDo6cmFuZG9tX2RldmljZSBybmc7CisgICAgc3RkOjptdDE5OTM3IHVybmcocm5nKCkpOworICAgIHN0ZDo6c2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSwgdXJuZyk7CisjZWxzZQorICAgIHN0ZDo6cmFuZG9tX3NodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCkpOworI2VuZGlmCisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlcnZlcnM7ICsraSkgeworCisgICAgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlciA9IHNlcnZlcnNfW2ldOworICAgIC8vIEltcGVyc29uYXRlIHRoZSBzZXJ2ZXIgc29ja2V0CisgICAgc2V0Q3VycmVudFNlcnZlcihzZXJ2ZXIpOworCisgICAgaWYgKGlzT3BlbigpKSB7CisgICAgICAvLyBhbHJlYWR5IG9wZW4gbWVhbnMgd2UncmUgZG9uZQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IChzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPT0gMCk7CisgICAgYm9vbCBpc0xhc3RTZXJ2ZXIgPSBhbHdheXNUcnlMYXN0XyA/IChpID09IChudW1TZXJ2ZXJzIC0gMSkpIDogZmFsc2U7CisKKyAgICBpZiAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID4gMCkgeworICAgICAgLy8gVGhlIHNlcnZlciB3YXMgbWFya2VkIGFzIGRvd24sIHNvIGNoZWNrIGlmIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHRvIHJldHJ5CisgICAgICB0aW1lX3QgZWxhcHNlZFRpbWUgPSB0aW1lKE5VTEwpIC0gc2VydmVyLT5sYXN0RmFpbFRpbWVfOworICAgICAgaWYgKGVsYXBzZWRUaW1lID4gcmV0cnlJbnRlcnZhbF8pIHsKKyAgICAgICAgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldHJ5SW50ZXJ2YWxQYXNzZWQgfHwgaXNMYXN0U2VydmVyKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJldHJpZXNfOyArK2opIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBUU29ja2V0OjpvcGVuKCk7CisgICAgICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24gJmUpIHsKKyAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXRQb29sOjpvcGVuIGZhaWxlZCAiICsgZ2V0U29ja2V0SW5mbygpICsgIjogIiArIGUud2hhdCgpOworICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3ZlciB0aGUgb3BlbmVkIHNvY2tldCBzbyB0aGF0IHdlIGNhbiBrZWVwIGl0IHBlcnNpc3RlbnQKKyAgICAgICAgc2VydmVyLT5zb2NrZXRfID0gc29ja2V0XzsKKyAgICAgICAgLy8gcmVzZXQgbGFzdEZhaWxUaW1lXyBpcyByZXF1aXJlZAorICAgICAgICBzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPSAwOworICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgKytzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfOworICAgICAgaWYgKHNlcnZlci0+Y29uc2VjdXRpdmVGYWlsdXJlc18gPiBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgeworICAgICAgICAvLyBNYXJrIHNlcnZlciBhcyBkb3duCisgICAgICAgIHNlcnZlci0+Y29uc2VjdXRpdmVGYWlsdXJlc18gPSAwOworICAgICAgICBzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPSB0aW1lKE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdsb2JhbE91dHB1dCgiVFNvY2tldFBvb2w6Om9wZW46IGFsbCBjb25uZWN0aW9ucyBmYWlsZWQiKTsKKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OmNsb3NlKCkgeworICBUU29ja2V0OjpjbG9zZSgpOworICBpZiAoY3VycmVudFNlcnZlcl8pIHsKKyAgICBjdXJyZW50U2VydmVyXy0+c29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmMTAxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAorICoKKyAqLworY2xhc3MgVFNvY2tldFBvb2xTZXJ2ZXIgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBzZXJ2ZXIgaW5mbworICAgKi8KKyAgVFNvY2tldFBvb2xTZXJ2ZXIoKTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgorICAgKi8KKyAgVFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKworICAvLyBIb3N0IG5hbWUKKyAgc3RkOjpzdHJpbmcgaG9zdF87CisKKyAgLy8gUG9ydCB0byBjb25uZWN0IG9uCisgIGludCBwb3J0XzsKKworICAvLyBTb2NrZXQgZm9yIHRoZSBzZXJ2ZXIKKyAgVEhSSUZUX1NPQ0tFVCBzb2NrZXRfOworCisgIC8vIExhc3QgdGltZSBjb25uZWN0aW5nIHRvIHRoaXMgc2VydmVyIGZhaWxlZAorICB0aW1lX3QgbGFzdEZhaWxUaW1lXzsKKworICAvLyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgdGltZXMgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKKyAgaW50IGNvbnNlY3V0aXZlRmFpbHVyZXNfOworfTsKKworLyoqCisgKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKi8KK2NsYXNzIFRTb2NrZXRQb29sIDogcHVibGljIFRTb2NrZXQgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKi8KKyAgVFNvY2tldFBvb2woKTsKKworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIGhvc3RzIGxpc3Qgb2YgaG9zdCBuYW1lcworICAgKiBAcGFyYW0gcG9ydHMgbGlzdCBvZiBwb3J0IG5hbWVzCisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGhvc3RzLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwb3J0cyk7CisKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgcGFpcnMgb2YgaG9zdCBuYW1lIGFuZCBwb3J0CisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7CisKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgVFNvY2tldFBvb2xTZXJ2ZXJzCisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gaG9zdCBzaW5nbGUgaG9zdAorICAgKiBAcGFyYW0gcG9ydCBzaW5nbGUgcG9ydAorICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKworICAvKioKKyAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICovCisgIHZpcnR1YWwgflRTb2NrZXRQb29sKCk7CisKKyAgLyoqCisgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgKi8KKyAgdm9pZCBhZGRTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCisgICAqLworICB2b2lkIGFkZFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOworCisgIC8qKgorICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAorICAgKi8KKyAgdm9pZCBzZXRTZXJ2ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisKKyAgLyoqCisgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCisgICAqLworICB2b2lkIGdldFNlcnZlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKworICAvKioKKyAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KKyAgICovCisgIHZvaWQgc2V0TnVtUmV0cmllcyhpbnQgbnVtUmV0cmllcyk7CisKKyAgLyoqCisgICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCisgICAqLworICB2b2lkIHNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpOworCisgIC8qKgorICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCisgICAqLworICB2b2lkIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXMpOworCisgIC8qKgorICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgorICAgKi8KKyAgdm9pZCBzZXRSYW5kb21pemUoYm9vbCByYW5kb21pemUpOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgorICAgKi8KKyAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KKyAgICovCisgIHZvaWQgb3BlbigpOworCisgIC8qCisgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKKyAgICovCisgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHNldEN1cnJlbnRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKTsKKworICAvKiogTGlzdCBvZiBzZXJ2ZXJzIHRvIGNvbm5lY3QgdG8gKi8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOworCisgIC8qKiBDdXJyZW50IHNlcnZlciAqLworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+IGN1cnJlbnRTZXJ2ZXJfOworCisgIC8qKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdCAqLworICBpbnQgbnVtUmV0cmllc187CisKKyAgLyoqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCisgICAqIG1hcmtlZCBhcyBkb3duLgorICAgKi8KKyAgdGltZV90IHJldHJ5SW50ZXJ2YWxfOworCisgIC8qKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uICovCisgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKKworICAvKiogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPyAqLworICBib29sIHJhbmRvbWl6ZV87CisKKyAgLyoqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPyAqLworICBib29sIGFsd2F5c1RyeUxhc3RfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ0MjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgdG8gaG9pc3QgcmVhZEFsbCBpbXBsZW1lbnRhdGlvbiBvdXQgb2YgVFRyYW5zcG9ydAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IHJlYWRBbGwoVHJhbnNwb3J0XyYgdHJhbnMsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGhhdmUgPSAwOworICB1aW50MzJfdCBnZXQgPSAwOworCisgIHdoaWxlIChoYXZlIDwgbGVuKSB7CisgICAgZ2V0ID0gdHJhbnMucmVhZChidWYgKyBoYXZlLCBsZW4gLSBoYXZlKTsKKyAgICBpZiAoZ2V0IDw9IDApIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJObyBtb3JlIGRhdGEgdG8gcmVhZC4iKTsKKyAgICB9CisgICAgaGF2ZSArPSBnZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKworLyoqCisgKiBHZW5lcmljIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgb2YgdHJhbnNwb3J0aW5nIGRhdGEuIEEgVFRyYW5zcG9ydCBtYXkgYmUKKyAqIGNhcGFibGUgb2YgZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0IG5vdCBuZWNlc3NhcmlseSBib3RoLgorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBWaXJ0dWFsIGRlY29uc3RydWN0b3IuCisgICAqLworICB2aXJ0dWFsIH5UVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKi8KKyAgdmlydHVhbCBib29sIGlzT3BlbigpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLyoqCisgICAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzCisgICAqIHN0aWxsIG9wZW4uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIHdoZW5ldmVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwKKyAgICogYnV0IGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWRkIGxvZ2ljIHRvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uIHdoZXJlCisgICAqIHBvc3NpYmxlIChpLmUuIG9uIGEgc29ja2V0KS4KKyAgICogVGhpcyBpcyB1c2VkIGJ5IGEgc2VydmVyIHRvIGNoZWNrIGlmIGl0IHNob3VsZCBsaXN0ZW4gZm9yIGFub3RoZXIKKyAgICogcmVxdWVzdC4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBwZWVrKCkgeyByZXR1cm4gaXNPcGVuKCk7IH0KKworICAvKioKKyAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCisgICAqCisgICAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHRoZSB0cmFuc3BvcnQgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb3BlbigpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFzZSBUVHJhbnNwb3J0LiIpOworICB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGNsb3NlKCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3QgY2xvc2UgYmFzZSBUVHJhbnNwb3J0LiIpOworICB9CisKKyAgLyoqCisgICAqIEF0dGVtcHQgdG8gcmVhZCB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBidWYgIFJlZmVyZW5jZSB0byB0aGUgbG9jYXRpb24gdG8gd3JpdGUgdGhlIGRhdGEKKyAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZF92aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHJlYWQuIik7CisgIH0KKworICAvKioKKyAgICogUmVhZHMgdGhlIGdpdmVuIGFtb3VudCBvZiBkYXRhIGluIGl0cyBlbnRpcmV0eSBubyBtYXR0ZXIgd2hhdC4KKyAgICoKKyAgICogQHBhcmFtIHMgICAgIFJlZmVyZW5jZSB0byBsb2NhdGlvbiBmb3IgcmVhZCBkYXRhCisgICAqIEBwYXJhbSBsZW4gICBIb3cgbWFueSBieXRlcyB0byByZWFkCisgICAqIEByZXR1cm4gSG93IG1hbnkgYnl0ZXMgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBzaXplCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBpbnN1ZmZpY2llbnQgZGF0YSB3YXMgcmVhZAorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRBbGxfdmlydChidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByZXR1cm4gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6cmVhZEFsbCgqdGhpcywgYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgorICAgKiBUaGlzIGNhbiBiZSBvdmVyLXJpZGRlbiB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbgorICAgKiBlLmcuIGxvZ2dpbmcgdGhlIHJlcXVlc3QgdG8gYSBmaWxlCisgICAqCisgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEVuZCgpIHsKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBzdHJpbmcgaW4gaXRzIGVudGlyZXR5IHRvIHRoZSBidWZmZXIuCisgICAqCisgICAqIE5vdGU6IFlvdSBtdXN0IGNhbGwgZmx1c2goKSB0byBlbnN1cmUgdGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiwKKyAgICogYW5kIGF2YWlsYWJsZSB0byBiZSByZWFkIGJhY2sgaW4gdGhlIGZ1dHVyZS4gIERlc3Ryb3lpbmcgYSBUVHJhbnNwb3J0CisgICAqIG9iamVjdCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGZsdXNoIHBlbmRpbmcgZGF0YS0taWYgeW91IGRlc3Ryb3kgYQorICAgKiBUVHJhbnNwb3J0IG9iamVjdCB3aXRoIHdyaXR0ZW4gYnV0IHVuZmx1c2hlZCBkYXRhLCB0aGF0IGRhdGEgbWF5IGJlCisgICAqIGRpc2NhcmRlZC4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUgb3V0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHdyaXRlX3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3Qgd3JpdGUuIik7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGVkLgorICAgKiBUaGlzIGNhbiBiZSBvdmVyLXJpZGRlbiB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbgorICAgKiBhdCB0aGUgZW5kIG9mIGEgcmVxdWVzdC4KKyAgICoKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRW5kKCkgeworICAgIC8vIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qKgorICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4gVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAorICAgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCB2b2lkIGZsdXNoKCkgeworICAgIC8vIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byByZXR1cm4gYSBwb2ludGVyIHRvIFxjIGxlbiBieXRlcywgcG9zc2libHkgY29waWVkIGludG8gXGMgYnVmLgorICAgKiBEb2VzIG5vdCBjb25zdW1lIHRoZSBieXRlcyByZWFkIChpLmUuOiBhIGxhdGVyIHJlYWQgd2lsbCByZXR1cm4gdGhlIHNhbWUKKyAgICogZGF0YSkuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBzdXBwb3J0IHByb3RvY29scyB0aGF0IG5lZWQgdG8gcmVhZAorICAgKiB2YXJpYWJsZS1sZW5ndGggZmllbGRzLiAgVGhleSBjYW4gYXR0ZW1wdCB0byBib3Jyb3cgdGhlIG1heGltdW0gYW1vdW50IG9mCisgICAqIGRhdGEgdGhhdCB0aGV5IHdpbGwgbmVlZCwgdGhlbiBjb25zdW1lIChzZWUgbmV4dCBtZXRob2QpIHdoYXQgdGhleQorICAgKiBhY3R1YWxseSB1c2UuICBTb21lIHRyYW5zcG9ydHMgd2lsbCBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCBhbmQgb3RoZXJzCisgICAqIHdpbGwgZmFpbCBvY2Nhc2lvbmFsbHksIHNvIHByb3RvY29scyBtdXN0IGJlIHByZXBhcmVkIHRvIHVzZSByZWFkIGlmCisgICAqIGJvcnJvdyBmYWlscy4KKyAgICoKKyAgICogQG9hcmFtIGJ1ZiAgQSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgY2FuIGJlIHN0b3JlZCBpZiBuZWVkZWQuCisgICAqICAgICAgICAgICAgIElmIGJvcnJvdyBkb2Vzbid0IHJldHVybiBidWYsIHRoZW4gdGhlIGNvbnRlbnRzIG9mCisgICAqICAgICAgICAgICAgIGJ1ZiBhZnRlciB0aGUgY2FsbCBhcmUgdW5kZWZpbmVkLiAgVGhpcyBwYXJhbWV0ZXIgbWF5IGJlCisgICAqICAgICAgICAgICAgIE5VTEwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2FsbGVyIGlzIG5vdCBzdXBwbHlpbmcgc3RvcmFnZSwKKyAgICogICAgICAgICAgICAgYnV0IHdvdWxkIGxpa2UgYSBwb2ludGVyIGludG8gYW4gaW50ZXJuYWwgYnVmZmVyLCBpZgorICAgKiAgICAgICAgICAgICBhdmFpbGFibGUuCisgICAqIEBwYXJhbSBsZW4gICpsZW4gc2hvdWxkIGluaXRpYWxseSBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYm9ycm93LgorICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgc3VjY2VlZHMsICpsZW4gd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICogICAgICAgICAgICAgYXZhaWxhYmxlIGluIHRoZSByZXR1cm5lZCBwb2ludGVyLiAgVGhpcyB3aWxsIGJlIGF0IGxlYXN0CisgICAqICAgICAgICAgICAgIHdoYXQgd2FzIHJlcXVlc3RlZCwgYnV0IG1heSBiZSBtb3JlIGlmIGJvcnJvdyByZXR1cm5zCisgICAqICAgICAgICAgICAgIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBidWZmZXIsIHJhdGhlciB0aGFuIGJ1Zi4KKyAgICogICAgICAgICAgICAgSWYgYm9ycm93IGZhaWxzLCB0aGUgY29udGVudHMgb2YgKmxlbiBhcmUgdW5kZWZpbmVkLgorICAgKiBAcmV0dXJuIElmIHRoZSBib3Jyb3cgc3VjY2VlZHMsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJvcnJvd2VkIGRhdGEuCisgICAqICAgICAgICAgVGhpcyBtaWdodCBiZSBlcXVhbCB0byBcYyBidWYsIG9yIGl0IG1pZ2h0IGJlIGEgcG9pbnRlciBpbnRvCisgICAqICAgICAgICAgdGhlIHRyYW5zcG9ydCdzIGludGVybmFsIGJ1ZmZlcnMuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiBib3Jyb3dfdmlydChidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90KiAvKiBsZW4gKi8pIHsgcmV0dXJuIE5VTEw7IH0KKworICAvKioKKyAgICogUmVtb3ZlIGxlbiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQuICBUaGlzIHNob3VsZCBhbHdheXMgZm9sbG93IGEgYm9ycm93CisgICAqIG9mIGF0IGxlYXN0IGxlbiBieXRlcywgYW5kIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KKyAgICogVE9ETyhkcmVpc3MpOiBJcyB0aGVyZSBhbnkgdHJhbnNwb3J0IHRoYXQgY291bGQgYm9ycm93IGJ1dCBmYWlsIHRvCisgICAqIGNvbnN1bWUsIG9yIHRoYXQgd291bGQgcmVxdWlyZSBhIGJ1ZmZlciB0byBkdW1wIHRoZSBjb25zdW1lZCBkYXRhPworICAgKgorICAgKiBAcGFyYW0gbGVuICBIb3cgbWFueSBieXRlcyB0byBjb25zdW1lCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIGNvbnN1bWVfdmlydChsZW4pOworICB9CisgIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgLyogbGVuICovKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgY29uc3VtZS4iKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHRyYW5zcG9ydHMgY2FsbC4gVGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlCisgICAqIHRyYW5zcG9ydCB1c2VkLiBBbiBJUCBiYXNlZCB0cmFuc3BvcnQgZm9yIGV4YW1wbGUgd2lsbCByZXR1cm4gdGhlCisgICAqIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCBtYWtpbmcgdGhlIHJlcXVlc3QuCisgICAqIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBrbm93IHRoZSBvcmlnaW4gVW5rbm93biBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkIGluIGEgbG9nIG1lc3NhZ2UgZm9yIGV4YW1wbGUKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gIlVua25vd24iOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFNpbXBsZSBjb25zdHJ1Y3Rvci4KKyAgICovCisgIFRUcmFuc3BvcnQoKSB7fQorfTsKKworLyoqCisgKiBHZW5lcmljIGZhY3RvcnkgY2xhc3MgdG8gbWFrZSBhbiBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydCBvdXQgb2YgYQorICogc291cmNlIHRyYW5zcG9ydC4gQ29tbW9ubHkgdXNlZCBpbnNpZGUgc2VydmVycyB0byBtYWtlIGlucHV0IGFuZCBvdXRwdXQKKyAqIHN0cmVhbXMgb3V0IG9mIHJhdyBjbGllbnRzLgorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywganVzdCByZXR1cm5zIHRoZSB0cmFuc3BvcnQgZ2l2ZW4uCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHRyYW5zOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjczMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjb25zdCBjaGFyKiBUVHJhbnNwb3J0RXhjZXB0aW9uOjp3aGF0KCkgY29uc3Qgbm9leGNlcHQgeworICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIFVOS05PV046CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFVua25vd24gdHJhbnNwb3J0IGV4Y2VwdGlvbiI7CisgICAgY2FzZSBOT1RfT1BFTjoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogVHJhbnNwb3J0IG5vdCBvcGVuIjsKKyAgICBjYXNlIFRJTUVEX09VVDoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogVGltZWQgb3V0IjsKKyAgICBjYXNlIEVORF9PRl9GSUxFOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBFbmQgb2YgZmlsZSI7CisgICAgY2FzZSBJTlRFUlJVUFRFRDoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW50ZXJydXB0ZWQiOworICAgIGNhc2UgQkFEX0FSR1M6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludmFsaWQgYXJndW1lbnRzIjsKKyAgICBjYXNlIENPUlJVUFRFRF9EQVRBOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBDb3JydXB0ZWQgRGF0YSI7CisgICAgY2FzZSBJTlRFUk5BTF9FUlJPUjoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW50ZXJuYWwgZXJyb3IiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1ZjAwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfIDEKKworI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvY29udmVyc2lvbi9jYXN0LmhwcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiB0cmFuc3BvcnQgZXJyb3JzIHRoYXQgbWF5CisgKiBvY2N1ciBpbiB2YXJpb3VzIHRyYW5zcG9ydCBzeXN0ZW1zLiBUaGlzIHByb3ZpZGVzIGEgc29ydCBvZiBnZW5lcmljCisgKiB3cmFwcGVyIGFyb3VuZCB0aGUgdmFndWUgVU5JWCBFXyBlcnJvciBjb2RlcyB0aGF0IGxldHMgYSBjb21tb24gY29kZQorICogYmFzZSBvZiBlcnJvciBoYW5kbGluZyB0byBiZSB1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRyYW5zcG9ydHMsIGkuZS4KKyAqIHBpcGVzIGV0Yy4KKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHsKKyAgICBVTktOT1dOID0gMCwKKyAgICBOT1RfT1BFTiA9IDEsCisgICAgVElNRURfT1VUID0gMiwKKyAgICBFTkRfT0ZfRklMRSA9IDMsCisgICAgSU5URVJSVVBURUQgPSA0LAorICAgIEJBRF9BUkdTID0gNSwKKyAgICBDT1JSVVBURURfREFUQSA9IDYsCisgICAgSU5URVJOQUxfRVJST1IgPSA3CisgIH07CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbigpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwgdHlwZV8odHlwZSkge30KKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSArICI6ICIgKyBUT3V0cHV0OjpzdHJlcnJvcl9zKGVycm5vX2NvcHkpKSwgdHlwZV8odHlwZSkge30KKworICB2aXJ0dWFsIH5UVHJhbnNwb3J0RXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICAvKioKKyAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICogdGhhdCBoYXMgb2NjdXJyZWQuCisgICAqCisgICAqIEByZXR1cm4gRXJyb3IgY29kZQorICAgKi8KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7CisKK3Byb3RlY3RlZDoKKyAgLyoqIEp1c3QgbGlrZSBzdHJlcnJvcl9yIGJ1dCByZXR1cm5zIGEgQysrIHN0cmluZyBvYmplY3QuICovCisgIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOworCisgIC8qKiBFcnJvciBjb2RlICovCisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGVfOworfTsKKworLyoqCisgKiBMZWdhY3kgY29kZSBpbiB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGhhdmUgb3ZlcmZsb3cgaXNzdWVzCisgKiB0aGF0IG5lZWQgdG8gYmUgZW5mb3JjZWQuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gVG8gc2FmZV9udW1lcmljX2Nhc3QoRnJvbSBpKSB7CisgIHRyeSB7CisgICAgcmV0dXJuIGJvb3N0OjpudW1lcmljX2Nhc3Q8VG8+KGkpOworICB9CisgIGNhdGNoIChjb25zdCBzdGQ6OmJhZF9jYXN0JiBiYykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYy53aGF0KCkpOworICB9Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0N2M3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordWludDMyX3QgVFBpcGVkVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IG5lZWQgPSBsZW47CisKKyAgLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQKKyAgaWYgKHJMZW5fIC0gclBvc18gPCBuZWVkKSB7CisgICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZQorICAgIGlmIChyTGVuXyAtIHJQb3NfID4gMCkgeworICAgICAgbWVtY3B5KGJ1ZiwgckJ1Zl8gKyByUG9zXywgckxlbl8gLSByUG9zXyk7CisgICAgICBuZWVkIC09IHJMZW5fIC0gclBvc187CisgICAgICBidWYgKz0gckxlbl8gLSByUG9zXzsKKyAgICAgIHJQb3NfID0gckxlbl87CisgICAgfQorCisgICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCisgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgeworICAgICAgckJ1ZlNpemVfICo9IDI7CisgICAgICB1aW50OF90ICp0bXBCdWYgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIH0KKyAgICAgIHJCdWZfID0gdG1wQnVmOworICAgIH0KKworICAgIC8vIHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIKKyAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8gKyByUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOworICB9CisKKyAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUKKyAgdWludDMyX3QgZ2l2ZSA9IG5lZWQ7CisgIGlmIChyTGVuXyAtIHJQb3NfIDwgZ2l2ZSkgeworICAgIGdpdmUgPSByTGVuXyAtIHJQb3NfOworICB9CisgIGlmIChnaXZlID4gMCkgeworICAgIG1lbWNweShidWYsIHJCdWZfICsgclBvc18sIGdpdmUpOworICAgIHJQb3NfICs9IGdpdmU7CisgICAgbmVlZCAtPSBnaXZlOworICB9CisKKyAgcmV0dXJuIChsZW4gLSBuZWVkKTsKK30KKwordm9pZCBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChsZW4gPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE1ha2UgdGhlIGJ1ZmZlciBhcyBiaWcgYXMgaXQgbmVlZHMgdG8gYmUKKyAgaWYgKChsZW4gKyB3TGVuXykgPj0gd0J1ZlNpemVfKSB7CisgICAgdWludDMyX3QgbmV3QnVmU2l6ZSA9IHdCdWZTaXplXyAqIDI7CisgICAgd2hpbGUgKChsZW4gKyB3TGVuXykgPj0gbmV3QnVmU2l6ZSkgeworICAgICAgbmV3QnVmU2l6ZSAqPSAyOworICAgIH0KKyAgICB1aW50OF90ICp0bXBCdWY9ICh1aW50OF90KilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOworICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgd0J1Zl8gPSB0bXBCdWY7CisKKyAgICB3QnVmU2l6ZV8gPSBuZXdCdWZTaXplOworICB9CisKKyAgLy8gQ29weSBpbnRvIHRoZSBidWZmZXIKKyAgbWVtY3B5KHdCdWZfICsgd0xlbl8sIGJ1ZiwgbGVuKTsKKyAgd0xlbl8gKz0gbGVuOworfQorCit2b2lkIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIKKyAgaWYgKHdMZW5fID4gMCkgeworICAgIHNyY1RyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKKyAgICB3TGVuXyA9IDA7CisgIH0KKworICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgc3JjVHJhbnNfLT5mbHVzaCgpOworfQorCitUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KAorICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICA6IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnMpLCBzcmNUcmFuc18oc3JjVHJhbnMpIHsKK30KKworVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6flRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKSB7Cit9CisKK2Jvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6aXNPcGVuKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0Ojppc09wZW4oKTsKK30KKworYm9vbCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpwZWVrKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0OjpwZWVrKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6b3BlbigpIHsKKyAgVFBpcGVkVHJhbnNwb3J0OjpvcGVuKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Y2xvc2UoKSB7CisgIFRQaXBlZFRyYW5zcG9ydDo6Y2xvc2UoKTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0OjpyZWFkKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gMDsKKyAgdWludDMyX3QgZ2V0ID0gMDsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGdldCA9IHJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CisgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGhhdmUgKz0gZ2V0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7CisgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnJlYWRFbmQoKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGVFbmQoKSB7CisgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKTsKK30KKworaW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRSZWFkVGltZW91dCgpIHsKKyAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0UmVhZFRpbWVvdXQoKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7CisgIHNyY1RyYW5zXy0+c2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7CisgIHJldHVybiBzcmNUcmFuc18tPmdldE51bUNodW5rcygpOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKKyAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0Q3VyQ2h1bmsoKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7CisgIHNyY1RyYW5zXy0+c2Vla1RvQ2h1bmsoY2h1bmspOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKKyAgc3JjVHJhbnNfLT5zZWVrVG9FbmQoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVFVUSUxTX0hfIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorLy8gSW5jbHVkZSB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0cyB0aGF0IHVzZWQgdG8gYmUgZGVmaW5lZCBoZXJlLgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBUaGUgbnVsbCB0cmFuc3BvcnQgaXMgYSBkdW1teSB0cmFuc3BvcnQgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLgorICogSXQncyBzb3J0IG9mIGFuIGFuYWxvZ3kgdG8gL2Rldi9udWxsLCB5b3UgY2FuIG5ldmVyIHJlYWQgYW55dGhpbmcgZnJvbSBpdAorICogYW5kIGl0IHdpbGwgbGV0IHlvdSB3cml0ZSBhbnl0aGluZyB5b3Ugd2FudCB0byBpdCwgdGhvdWdoIGl0IHdvbid0IGFjdHVhbGx5CisgKiBnbyBhbnl3aGVyZS4KKyAqCisgKi8KK2NsYXNzIFROdWxsVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFROdWxsVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIFROdWxsVHJhbnNwb3J0KCkge30KKworICB+VE51bGxUcmFuc3BvcnQoKSB7fQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgb3BlbigpIHt9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgeyByZXR1cm47IH0KK307CisKKy8qKgorICogVFBpcGVkVHJhbnNwb3J0LiBUaGlzIHRyYW5zcG9ydCBhbGxvd3MgcGlwaW5nIG9mIGEgcmVxdWVzdCBmcm9tIG9uZQorICogdHJhbnNwb3J0IHRvIGFub3RoZXIgZWl0aGVyIHdoZW4gcmVhZEVuZCgpIG9yIHdyaXRlRW5kKCkuIFRoZSB0eXBpY2FsCisgKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBsb2cgYSByZXF1ZXN0IG9yIGEgcmVwbHkgdG8gZGlzay4KKyAqIFRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBleHBhbmRzIHRvIGEga2VlcCBhIGNvcHkgb2YgdGhlIGVudGlyZQorICogcmVxdWVzdC9yZXNwb25zZS4KKyAqCisgKi8KK2NsYXNzIFRQaXBlZFRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgeworcHVibGljOgorICBUUGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgICAgOiBzcmNUcmFuc18oc3JjVHJhbnMpLAorICAgICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKKyAgICAgIHJCdWZTaXplXyg1MTIpLAorICAgICAgclBvc18oMCksCisgICAgICByTGVuXygwKSwKKyAgICAgIHdCdWZTaXplXyg1MTIpLAorICAgICAgd0xlbl8oMCkgeworCisgICAgLy8gZGVmYXVsdCBpcyB0byB0byBwaXBlIHRoZSByZXF1ZXN0IHdoZW4gcmVhZEVuZCgpIGlzIGNhbGxlZAorICAgIHBpcGVPblJlYWRfID0gdHJ1ZTsKKyAgICBwaXBlT25Xcml0ZV8gPSBmYWxzZTsKKworICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgaWYgKHJCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHdCdWZTaXplXyk7CisgICAgaWYgKHdCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICB9CisKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KQorICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKKyAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCisgICAgICByQnVmU2l6ZV8oNTEyKSwKKyAgICAgIHJQb3NfKDApLAorICAgICAgckxlbl8oMCksCisgICAgICB3QnVmU2l6ZV8oc3opLAorICAgICAgd0xlbl8oMCkgeworCisgICAgckJ1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICBpZiAockJ1Zl8gPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgd0J1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKKyAgICBpZiAod0J1Zl8gPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgIH0KKworICB+VFBpcGVkVHJhbnNwb3J0KCkgeworICAgIHN0ZDo6ZnJlZShyQnVmXyk7CisgICAgc3RkOjpmcmVlKHdCdWZfKTsKKyAgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gc3JjVHJhbnNfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoclBvc18gPj0gckxlbl8pIHsKKyAgICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAorICAgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgeworICAgICAgICByQnVmU2l6ZV8gKj0gMjsKKyAgICAgICAgdWludDhfdCAqIHRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisJaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCX0KKwlyQnVmXyA9IHRtcEJ1ZjsKKyAgICAgIH0KKworICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgorICAgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfICsgclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKKyAgICB9CisgICAgcmV0dXJuIChyTGVuXyA+IHJQb3NfKTsKKyAgfQorCisgIHZvaWQgb3BlbigpIHsgc3JjVHJhbnNfLT5vcGVuKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeyBzcmNUcmFuc18tPmNsb3NlKCk7IH0KKworICB2b2lkIHNldFBpcGVPblJlYWQoYm9vbCBwaXBlVmFsKSB7IHBpcGVPblJlYWRfID0gcGlwZVZhbDsgfQorCisgIHZvaWQgc2V0UGlwZU9uV3JpdGUoYm9vbCBwaXBlVmFsKSB7IHBpcGVPbldyaXRlXyA9IHBpcGVWYWw7IH0KKworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB1aW50MzJfdCByZWFkRW5kKCkgeworCisgICAgaWYgKHBpcGVPblJlYWRfKSB7CisgICAgICBkc3RUcmFuc18tPndyaXRlKHJCdWZfLCByUG9zXyk7CisgICAgICBkc3RUcmFuc18tPmZsdXNoKCk7CisgICAgfQorCisgICAgc3JjVHJhbnNfLT5yZWFkRW5kKCk7CisKKyAgICAvLyBJZiByZXF1ZXN0cyBhcmUgYmVpbmcgcGlwZWxpbmVkLCBjb3B5IGRvd24gb3VyIHJlYWQtYWhlYWQgZGF0YSwKKyAgICAvLyB0aGVuIHJlc2V0IG91ciBzdGF0ZS4KKyAgICBpbnQgcmVhZF9haGVhZCA9IHJMZW5fIC0gclBvc187CisgICAgdWludDMyX3QgYnl0ZXMgPSByUG9zXzsKKyAgICBtZW1jcHkockJ1Zl8sIHJCdWZfICsgclBvc18sIHJlYWRfYWhlYWQpOworICAgIHJQb3NfID0gMDsKKyAgICByTGVuXyA9IHJlYWRfYWhlYWQ7CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB1aW50MzJfdCB3cml0ZUVuZCgpIHsKKyAgICBpZiAocGlwZU9uV3JpdGVfKSB7CisgICAgICBkc3RUcmFuc18tPndyaXRlKHdCdWZfLCB3TGVuXyk7CisgICAgICBkc3RUcmFuc18tPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiB3TGVuXzsKKyAgfQorCisgIHZvaWQgZmx1c2goKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VGFyZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gZHN0VHJhbnNfOyB9CisKKyAgLyoKKyAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCisgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CisgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKKworICB1aW50OF90KiByQnVmXzsKKyAgdWludDMyX3QgckJ1ZlNpemVfOworICB1aW50MzJfdCByUG9zXzsKKyAgdWludDMyX3Qgckxlbl87CisKKyAgdWludDhfdCogd0J1Zl87CisgIHVpbnQzMl90IHdCdWZTaXplXzsKKyAgdWludDMyX3Qgd0xlbl87CisKKyAgYm9vbCBwaXBlT25SZWFkXzsKKyAgYm9vbCBwaXBlT25Xcml0ZV87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBwaXBlZFRyYW5zcG9ydCBpbnN0YW5jZS4KKyAqCisgKi8KK2NsYXNzIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKKyAgICBpbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KGRzdFRyYW5zKTsKKyAgfQorICB2aXJ0dWFsIH5UUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIGJhc2UgdHJhbnNwb3J0IGludG8gYSBwaXBlZCB0cmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgeworICAgIGlmIChkc3RUcmFuc18uZ2V0KCkgPT0gTlVMTCkgeworICAgICAgZHN0VHJhbnNfID0gZHN0VHJhbnM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlRhcmdldCB0cmFuc3BvcnQgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187Cit9OworCisvKioKKyAqIFRQaXBlZEZpbGVUcmFuc3BvcnQuIFRoaXMgaXMganVzdCBsaWtlIGEgVFRyYW5zcG9ydCwgZXhjZXB0IHRoYXQKKyAqIGl0IGlzIGEgdGVtcGxhdGl6ZWQgY2xhc3MsIHNvIHRoYXQgY2xpZW50cyB3aG8gcmVseSBvbiBhIHNwZWNpZmljCisgKiBUVHJhbnNwb3J0IGNhbiBzdGlsbCBhY2Nlc3MgdGhlIG9yaWdpbmFsIHRyYW5zcG9ydC4KKyAqCisgKi8KK2NsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgeworcHVibGljOgorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKKworICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOworCisgIC8vIFRUcmFuc3BvcnQgZnVuY3Rpb25zCisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworICB2b2lkIG9wZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWRFbmQoKTsKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlRW5kKCk7CisgIHZvaWQgZmx1c2goKTsKKworICAvLyBURmlsZVJlYWRlclRyYW5zcG9ydCBmdW5jdGlvbnMKKyAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpOworICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpOworICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKKyAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKKyAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKKyAgdm9pZCBzZWVrVG9FbmQoKTsKKworICAvKgorICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KKyAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKKyAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8gc2hvdWxkbid0IGJlIHVzZWQKKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgZnJvbSBhIGZpbGVwYXRoIGFuZCBhIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorICoKKyAqLworY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykge30KKyAgdmlydHVhbCB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydAorICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KHNyY1RyYW5zKTsKKyAgICBpZiAocEZpbGVSZWFkZXJUcmFuc3BvcnQuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIGdldEZpbGVSZWFkZXJUcmFuc3BvcnQocEZpbGVSZWFkZXJUcmFuc3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KCk7CisgICAgfQorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KAorICAgICAgICBuZXcgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVFVUSUxTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhY2Y2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgVFRyYW5zcG9ydCBtZXRob2RzLgorICoKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgcmVhZCgpLCByZWFkQWxsKCksIHdyaXRlKCksCisgKiBib3Jyb3coKSBhbmQgY29uc3VtZSgpLgorICoKKyAqIEluIHRoZSBUVHJhbnNwb3J0IGJhc2UgY2xhc3MsIGVhY2ggb2YgdGhlc2UgbWV0aG9kcyBzaW1wbHkgaW52b2tlcyBpdHMKKyAqIHZpcnR1YWwgY291bnRlcnBhcnQuICBUaGlzIGNsYXNzIG92ZXJyaWRlcyB0aGVtIHRvIGFsd2F5cyBwZXJmb3JtIHRoZQorICogZGVmYXVsdCBiZWhhdmlvciwgd2l0aG91dCBhIHZpcnR1YWwgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gc2VydmUgYXMgYSBiYXNlIGNsYXNzIGZvcgorICogVFZpcnR1YWxUcmFuc3BvcnQsIGFuZCBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBpZiBvbmUgb2YgaXRzIHN1YmNsYXNzZXMKKyAqIGRvZXMgbm90IG92ZXJyaWRlIHRoZSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMuICAoU2luY2UKKyAqIFRWaXJ0dWFsVHJhbnNwb3J0OjpyZWFkX3ZpcnQoKSBjYWxscyByZWFkKCksIGFuZCBUVHJhbnNwb3J0OjpyZWFkKCkgY2FsbHMKKyAqIHJlYWRfdmlydCgpLikKKyAqLworY2xhc3MgVFRyYW5zcG9ydERlZmF1bHRzIDogcHVibGljIFRUcmFuc3BvcnQgeworcHVibGljOgorICAvKgorICAgKiBUVHJhbnNwb3J0ICpfdmlydCgpIG1ldGhvZHMgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgorICAgKiBJbnZva2UgdGhlbSBub24tdmlydHVhbGx5LgorICAgKi8KKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZF92aXJ0KGJ1ZiwgbGVuKTsgfQorICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOyB9CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+VFRyYW5zcG9ydDo6d3JpdGVfdmlydChidWYsIGxlbik7IH0KKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0Ojpib3Jyb3dfdmlydChidWYsIGxlbik7CisgIH0KKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeyB0aGlzLT5UVHJhbnNwb3J0Ojpjb25zdW1lX3ZpcnQobGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIFRUcmFuc3BvcnREZWZhdWx0cygpIHt9Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHBvbHltb3JwaGlzbSBmb3Igc3ViY2xhc3NlcyBvZiBUVHJhbnNwb3J0LgorICoKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyAqX3ZpcnQoKSBtZXRob2RzIG9mIFRUcmFuc3BvcnQsIHRvIGNhbGwgdGhlCisgKiBub24tdmlydHVhbCB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIHByb3BlciBzdWJjbGFzcy4KKyAqCisgKiBUbyBkZWZpbmUgeW91ciBvd24gdHJhbnNwb3J0IGNsYXNzIHVzaW5nIFRWaXJ0dWFsVHJhbnNwb3J0OgorICogMSkgRGVyaXZlIHlvdXIgc3ViY2xhc3MgZnJvbSBUVmlydHVhbFRyYW5zcG9ydDx5b3VyIGNsYXNzPgorICogICAgZS5nOiAgY2xhc3MgTXlUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8TXlUcmFuc3BvcnQ+IHsKKyAqIDIpIFByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIHJlYWQoKSwgcmVhZEFsbCgpLCBldGMuCisgKiAgICBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSBub24tdmlydHVhbC4KKyAqCisgKiBUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgbmVlZCB0byB1c2UgdmlydHVhbCBpbmhlcml0YW5jZSB3aGVuCisgKiBpbmhlcml0aW5nIGZyb20gVFRyYW5zcG9ydCBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0LgorICoKKyAqIEBhdXRob3IgQ2hhZCBXYWx0ZXJzIDxjaGFkQHBvd2Vyc2V0LmNvbT4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIFN1cGVyXyA9IFRUcmFuc3BvcnREZWZhdWx0cz4KK2NsYXNzIFRWaXJ0dWFsVHJhbnNwb3J0IDogcHVibGljIFN1cGVyXyB7CitwdWJsaWM6CisgIC8qCisgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgKl92aXJ0KCkgZnVuY3Rpb25zLCB0byBjYWxsIHRoZSBzdWJjbGFzcydzCisgICAqIG5vbi12aXJ0dWFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+cmVhZEFsbChidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+d3JpdGUoYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5ib3Jyb3coYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNvbnN1bWVfdmlydCh1aW50MzJfdCBsZW4pIHsgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5jb25zdW1lKGxlbik7IH0KKworICAvKgorICAgKiBQcm92aWRlIGEgZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gdGhhdCBpbnZva2VzCisgICAqIHJlYWQoKSBub24tdmlydHVhbGx5LgorICAgKgorICAgKiBOb3RlOiBzdWJjbGFzc2VzIHRoYXQgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIGRlcml2ZSBmcm9tIGFub3RoZXIKKyAgICogdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIChpLmUuLCBub3QgVFRyYW5zcG9ydERlZmF1bHRzKSBzaG91bGQgYmV3YXJlIHRoYXQKKyAgICogdGhpcyBtYXkgb3ZlcnJpZGUgYW55IG5vbi1kZWZhdWx0IHJlYWRBbGwoKSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieQorICAgKiB0aGUgcGFyZW50IHRyYW5zcG9ydCBjbGFzcy4gIFRoZXkgbWF5IG5lZWQgdG8gcmVkZWZpbmUgcmVhZEFsbCgpIHRvIGNhbGwKKyAgICogdGhlIGNvcnJlY3QgcGFyZW50IGltcGxlbWVudGF0aW9uLCBpZiBkZXNpcmVkLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIFRyYW5zcG9ydF8qIHRyYW5zID0gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpOworICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRyYW5zLCBidWYsIGxlbik7CisgIH0KKworcHJvdGVjdGVkOgorICBUVmlydHVhbFRyYW5zcG9ydCgpIHt9CisKKyAgLyoKKyAgICogVGVtcGxhdGl6ZWQgY29uc3RydWN0b3JzLCB0byBhbGxvdyBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBTdXBlcl8KKyAgICogY29uc3RydWN0b3IuICBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IDAsIDEsIG9yIDIgYXJndW1lbnRzLCBidXQKKyAgICogYWRkaXRpb25hbCB2ZXJzaW9ucyBjYW4gYmUgYWRkZWQgYXMgbmVlZGVkLgorICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ18+CisgIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZ18gY29uc3QmIGFyZykKKyAgICA6IFN1cGVyXyhhcmcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzFfLCB0eXBlbmFtZSBBcmcyXz4KKyAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnMV8gY29uc3QmIGExLCBBcmcyXyBjb25zdCYgYTIpCisgICAgOiBTdXBlcl8oYTEsIGEyKSB7fQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI2ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCit2b2lkIFRabGliVHJhbnNwb3J0Ojppbml0WmxpYigpIHsKKyAgaW50IHJ2OworICBib29sIHJfaW5pdCA9IGZhbHNlOworICB0cnkgeworICAgIHJzdHJlYW1fID0gbmV3IHpfc3RyZWFtOworICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOworCisgICAgcnN0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKKyAgICB3c3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOworICAgIHJzdHJlYW1fLT56ZnJlZSA9IFpfTlVMTDsKKyAgICB3c3RyZWFtXy0+emZyZWUgPSBaX05VTEw7CisgICAgcnN0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKKyAgICB3c3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOworCisgICAgcnN0cmVhbV8tPm5leHRfaW4gPSBjcmJ1Zl87CisgICAgd3N0cmVhbV8tPm5leHRfaW4gPSB1d2J1Zl87CisgICAgcnN0cmVhbV8tPm5leHRfb3V0ID0gdXJidWZfOworICAgIHdzdHJlYW1fLT5uZXh0X291dCA9IGN3YnVmXzsKKyAgICByc3RyZWFtXy0+YXZhaWxfaW4gPSAwOworICAgIHdzdHJlYW1fLT5hdmFpbF9pbiA9IDA7CisgICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOworICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKKworICAgIHJ2ID0gaW5mbGF0ZUluaXQocnN0cmVhbV8pOworICAgIGNoZWNrWmxpYlJ2KHJ2LCByc3RyZWFtXy0+bXNnKTsKKworICAgIC8vIEhhdmUgdG8gc2V0IHRoaXMgZmxhZyBzbyB3ZSBrbm93IHdoZXRoZXIgdG8gZGUtaW5pdGlhbGl6ZS4KKyAgICByX2luaXQgPSB0cnVlOworCisgICAgcnYgPSBkZWZsYXRlSW5pdCh3c3RyZWFtXywgY29tcF9sZXZlbF8pOworICAgIGNoZWNrWmxpYlJ2KHJ2LCB3c3RyZWFtXy0+bXNnKTsKKyAgfQorCisgIGNhdGNoICguLi4pIHsKKyAgICBpZiAocl9pbml0KSB7CisgICAgICBydiA9IGluZmxhdGVFbmQocnN0cmVhbV8pOworICAgICAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCByc3RyZWFtXy0+bXNnKTsKKyAgICB9CisgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHdlIGNhbiBnZXQgaGVyZSBpZiB3c3RyZWFtXyB3YXMgaW5pdGlhbGl6ZWQuCisKKyAgICB0aHJvdzsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbWVzc2FnZSkgeworICBpZiAoc3RhdHVzICE9IFpfT0spIHsKKyAgICB0aHJvdyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbihzdGF0dXMsIG1lc3NhZ2UpOworICB9Cit9CisKK2lubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbWVzc2FnZSkgeworICBpZiAoc3RhdHVzICE9IFpfT0spIHsKKyAgICBzdHJpbmcgb3V0cHV0ID0gIlRabGliVHJhbnNwb3J0OiB6bGliIGZhaWx1cmUgaW4gZGVzdHJ1Y3RvcjogIgorICAgICAgICAgICAgICAgICAgICArIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uOjplcnJvck1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlKTsKKyAgICBHbG9iYWxPdXRwdXQob3V0cHV0LmNfc3RyKCkpOworICB9Cit9CisKK1RabGliVHJhbnNwb3J0Ojp+VFpsaWJUcmFuc3BvcnQoKSB7CisgIGludCBydjsKKyAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKKyAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCByc3RyZWFtXy0+bXNnKTsKKworICBydiA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOworICAvLyBaX0RBVEFfRVJST1IgbWF5IGJlIHJldHVybmVkIGlmIHRoZSBjYWxsZXIgaGFzIHdyaXR0ZW4gZGF0YSwgYnV0IG5vdAorICAvLyBjYWxsZWQgZmx1c2goKSB0byBhY3R1YWxseSBmaW5pc2ggd3JpdGluZyB0aGUgZGF0YSBvdXQgdG8gdGhlIHVuZGVybHlpbmcKKyAgLy8gdHJhbnNwb3J0LiAgVGhlIGRlZmluZWQgVFRyYW5zcG9ydCBiZWhhdmlvciBpbiB0aGlzIGNhc2UgaXMgdGhhdCB0aGlzIGRhdGEKKyAgLy8gbWF5IGJlIGRpc2NhcmRlZCwgc28gd2UgaWdub3JlIHRoZSBlcnJvciBhbmQgc2lsZW50bHkgZGlzY2FyZCB0aGUgZGF0YS4KKyAgLy8gRm9yIG90aGVyIGVycm9zLCBsb2cgYSBtZXNzYWdlLgorICBpZiAocnYgIT0gWl9EQVRBX0VSUk9SKSB7CisgICAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCB3c3RyZWFtXy0+bXNnKTsKKyAgfQorCisgIGRlbGV0ZVtdIHVyYnVmXzsKKyAgZGVsZXRlW10gY3JidWZfOworICBkZWxldGVbXSB1d2J1Zl87CisgIGRlbGV0ZVtdIGN3YnVmXzsKKyAgZGVsZXRlIHJzdHJlYW1fOworICBkZWxldGUgd3N0cmVhbV87Cit9CisKK2Jvb2wgVFpsaWJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKKyAgcmV0dXJuIChyZWFkQXZhaWwoKSA+IDApIHx8IChyc3RyZWFtXy0+YXZhaWxfaW4gPiAwKSB8fCB0cmFuc3BvcnRfLT5pc09wZW4oKTsKK30KKworYm9vbCBUWmxpYlRyYW5zcG9ydDo6cGVlaygpIHsKKyAgcmV0dXJuIChyZWFkQXZhaWwoKSA+IDApIHx8IChyc3RyZWFtXy0+YXZhaWxfaW4gPiAwKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7Cit9CisKKy8vIFJFQURJTkcgU1RSQVRFR1kKKy8vCisvLyBXZSBoYXZlIHR3byBidWZmZXJzIGZvciByZWFkaW5nOiBvbmUgY29udGFpbmluZyB0aGUgY29tcHJlc3NlZCBkYXRhIChjcmJ1Zl8pCisvLyBhbmQgb25lIGNvbnRhaW5pbmcgdGhlIHVuY29tcHJlc3NlZCBkYXRhICh1cmJ1Zl8pLiAgV2hlbiByZWFkIGlzIGNhbGxlZCwKKy8vIHdlIHJlcGVhdCB0aGUgZm9sbG93aW5nIHN0ZXBzIHVudGlsIHdlIGhhdmUgc2F0aXNmaWVkIHRoZSByZXF1ZXN0OgorLy8gLSBDb3B5IGRhdGEgZnJvbSB1cmJ1Zl8gaW50byB0aGUgY2FsbGVyJ3MgYnVmZmVyLgorLy8gLSBJZiB3ZSBoYWQgZW5vdWdoLCByZXR1cm4uCisvLyAtIElmIHVyYnVmXyBpcyBlbXB0eSwgcmVhZCBzb21lIGRhdGEgaW50byBpdCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKy8vIC0gSW5mbGF0ZSBkYXRhIGZyb20gY3JidWZfIGludG8gdXJidWZfLgorLy8KKy8vIEluIHN0YW5kYWxvbmUgb2JqZWN0cywgd2Ugc2V0IGlucHV0X2VuZGVkXyB0byB0cnVlIHdoZW4gaW5mbGF0ZSByZXR1cm5zCisvLyBaX1NUUkVBTV9FTkQuICBUaGlzIGFsbG93cyB0byBtYWtlIHN1cmUgdGhhdCBhIGNoZWNrc3VtIHdhcyB2ZXJpZmllZC4KKworaW5saW5lIGludCBUWmxpYlRyYW5zcG9ydDo6cmVhZEF2YWlsKCkgeworICByZXR1cm4gdXJidWZfc2l6ZV8gLSByc3RyZWFtXy0+YXZhaWxfb3V0IC0gdXJwb3NfOworfQorCit1aW50MzJfdCBUWmxpYlRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBuZWVkID0gbGVuOworCisgIC8vIFRPRE8oZHJlaXNzKTogU2tpcCB1cmJ1ZiBvbiBiaWcgcmVhZHMuCisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlIGF2YWlsYWJsZSwgdGhlbiBnaXZlIHRoZW0gdGhlIG1pbiBvZgorICAgIC8vIHdoYXQgd2UgaGF2ZSBhbmQgd2hhdCB0aGV5IHdhbnQsIHRoZW4gYWR2YW5jZSBpbmRpY2VzLgorICAgIGludCBnaXZlID0gKHN0ZDo6bWluKSgodWludDMyX3QpcmVhZEF2YWlsKCksIG5lZWQpOworICAgIG1lbWNweShidWYsIHVyYnVmXyArIHVycG9zXywgZ2l2ZSk7CisgICAgbmVlZCAtPSBnaXZlOworICAgIGJ1ZiArPSBnaXZlOworICAgIHVycG9zXyArPSBnaXZlOworCisgICAgLy8gSWYgdGhleSB3ZXJlIHNhdGlzZmllZCwgd2UgYXJlIGRvbmUuCisgICAgaWYgKG5lZWQgPT0gMCkgeworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSB3aWxsIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byBnZXQgbW9yZSBkYXRhLAorICAgIC8vIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIGF2YWlsYWJsZSwgcmV0dXJuIGl0IG5vdy4gIFJlYWRpbmcgZnJvbQorICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtYXkgYmxvY2ssIGFuZCByZWFkKCkgaXMgb25seSBhbGxvd2VkIHRvIGJsb2NrCisgICAgLy8gd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICBpZiAobmVlZCA8IGxlbiAmJiByc3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gZ2V0IHNvbWUgbW9yZSBkYXRhLgorCisgICAgLy8gSWYgemxpYiBoYXMgcmVwb3J0ZWQgdGhlIGVuZCBvZiBhIHN0cmVhbSwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueSBtb3JlLgorICAgIGlmIChpbnB1dF9lbmRlZF8pIHsKKyAgICAgIHJldHVybiBsZW4gLSBuZWVkOworICAgIH0KKworICAgIC8vIFRoZSB1bmNvbXByZXNzZWQgcmVhZCBidWZmZXIgaXMgZW1wdHksIHNvIHJlc2V0IHRoZSBzdHJlYW0gZmllbGRzLgorICAgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKKyAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CisgICAgdXJwb3NfID0gMDsKKworICAgIC8vIENhbGwgaW5mbGF0ZSgpIHRvIHVuY29tcHJlc3Mgc29tZSBtb3JlIGRhdGEKKyAgICBpZiAoIXJlYWRGcm9tWmxpYigpKSB7CisgICAgICAvLyBubyBkYXRhIGF2YWlsYWJsZSBmcm9tIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICByZXR1cm4gbGVuIC0gbmVlZDsKKyAgICB9CisKKyAgICAvLyBPa2F5LiAgVGhlIHJlYWQgYnVmZmVyIHNob3VsZCBoYXZlIHdoYXRldmVyIHdlIGNhbiBnaXZlIGl0IG5vdy4KKyAgICAvLyBMb29wIGJhY2sgdG8gdGhlIHN0YXJ0IGFuZCB0cnkgdG8gZ2l2ZSBzb21lIG1vcmUuCisgIH0KK30KKworYm9vbCBUWmxpYlRyYW5zcG9ydDo6cmVhZEZyb21abGliKCkgeworICBhc3NlcnQoIWlucHV0X2VuZGVkXyk7CisKKyAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb21wcmVzc2VkIGRhdGEgYXZhaWxhYmxlLAorICAvLyByZWFkIHNvbWUgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgIGlmIChyc3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgeworICAgIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoY3JidWZfLCBjcmJ1Zl9zaXplXyk7CisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJzdHJlYW1fLT5uZXh0X2luID0gY3JidWZfOworICAgIHJzdHJlYW1fLT5hdmFpbF9pbiA9IGdvdDsKKyAgfQorCisgIC8vIFdlIGhhdmUgc29tZSBjb21wcmVzc2VkIGRhdGEgbm93LiAgVW5jb21wcmVzcyBpdC4KKyAgaW50IHpsaWJfcnYgPSBpbmZsYXRlKHJzdHJlYW1fLCBaX1NZTkNfRkxVU0gpOworCisgIGlmICh6bGliX3J2ID09IFpfU1RSRUFNX0VORCkgeworICAgIGlucHV0X2VuZGVkXyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgY2hlY2tabGliUnYoemxpYl9ydiwgcnN0cmVhbV8tPm1zZyk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gV1JJVElORyBTVFJBVEVHWQorLy8KKy8vIFdlIGJ1ZmZlciB1cCBzbWFsbCB3cml0ZXMgYmVmb3JlIHNlbmRpbmcgdGhlbSB0byB6bGliLCBzbyBvdXIgbG9naWMgaXM6CisvLyAtIElzIHRoZSB3cml0ZSBiaWc/CisvLyAgIC0gU2VuZCB0aGUgYnVmZmVyIHRvIHpsaWIuCisvLyAgIC0gU2VuZCB0aGlzIGRhdGEgdG8gemxpYi4KKy8vIC0gSXMgdGhlIHdyaXRlIHNtYWxsPworLy8gICAtIElzIHRoZXJlIGluc3VmZmljaWVudCBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciBpdD8KKy8vICAgICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgorLy8gICAtIENvcHkgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlci4KKy8vCisvLyBXZSBoYXZlIHR3byBidWZmZXJzIGZvciB3cml0aW5nIGFsc286IHRoZSB1bmNvbXByZXNzZWQgYnVmZmVyIChtZW50aW9uZWQKKy8vIGFib3ZlKSBhbmQgdGhlIGNvbXByZXNzZWQgYnVmZmVyLiAgV2hlbiBzZW5kaW5nIGRhdGEgdG8gemxpYiB3ZSBsb29wIG92ZXIKKy8vIHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHNvdXJjZSAodW5jb21wcmVzc2VkIGJ1ZmZlciBvciBiaWcgd3JpdGUpIGlzIGVtcHR5OgorLy8gLSBJcyB0aGVyZSBubyBtb3JlIHNwYWNlIGluIHRoZSBjb21wcmVzc2VkIGJ1ZmZlcj8KKy8vICAgLSBXcml0ZSB0aGUgY29tcHJlc3NlZCBidWZmZXIgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorLy8gLSBEZWZsYXRlIGZyb20gdGhlIHNvdXJjZSBpbnRvIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAid3JpdGUoKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKKyAgfQorCisgIC8vIHpsaWIncyAiZGVmbGF0ZSIgZnVuY3Rpb24gaGFzIGVub3VnaCBsb2dpYyBpbiBpdCB0aGF0IEkgdGhpbmsKKyAgLy8gd2UncmUgYmV0dGVyIG9mZiAocGVyZm9ybWFuY2Utd2lzZSkgYnVmZmVyaW5nIHVwIHNtYWxsIHdyaXRlcy4KKyAgaWYgKGxlbiA+IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7CisgICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfTk9fRkxVU0gpOworICAgIHV3cG9zXyA9IDA7CisgICAgZmx1c2hUb1psaWIoYnVmLCBsZW4sIFpfTk9fRkxVU0gpOworICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKKyAgICBpZiAodXdidWZfc2l6ZV8gLSB1d3Bvc18gPCBsZW4pIHsKKyAgICAgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBaX05PX0ZMVVNIKTsKKyAgICAgIHV3cG9zXyA9IDA7CisgICAgfQorICAgIG1lbWNweSh1d2J1Zl8gKyB1d3Bvc18sIGJ1ZiwgbGVuKTsKKyAgICB1d3Bvc18gKz0gbGVuOworICB9Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJmbHVzaCgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOworICB9CisKKyAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfQkxPQ0spOworICB1d3Bvc18gPSAwOworCisgIGlmKHdzdHJlYW1fLT5hdmFpbF9vdXQgPCA2KXsKKyAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfIC0gd3N0cmVhbV8tPmF2YWlsX291dCk7CisgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKKyAgfQorCisgIGZsdXNoVG9UcmFuc3BvcnQoWl9GVUxMX0ZMVVNIKTsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6ZmluaXNoKCkgeworICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJmaW5pc2goKSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgfQorCisgIGZsdXNoVG9UcmFuc3BvcnQoWl9GSU5JU0gpOworfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaFRvVHJhbnNwb3J0KGludCBmbHVzaCkgeworICAvLyB3cml0ZSBwZW5kaW5nIGRhdGEgaW4gdXdidWZfIHRvIHpsaWIKKyAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIGZsdXNoKTsKKyAgdXdwb3NfID0gMDsKKworICAvLyB3cml0ZSBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSB6bGliIHRvIHRoZSB0cmFuc3BvcnQKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyAtIHdzdHJlYW1fLT5hdmFpbF9vdXQpOworICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKKworICAvLyBmbHVzaCB0aGUgdHJhbnNwb3J0CisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IGZsdXNoKSB7CisgIHdzdHJlYW1fLT5uZXh0X2luID0gY29uc3RfY2FzdDx1aW50OF90Kj4oYnVmKTsKKyAgd3N0cmVhbV8tPmF2YWlsX2luID0gbGVuOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChmbHVzaCA9PSBaX05PX0ZMVVNIIHx8IGZsdXNoID09IFpfQkxPQ0spICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiBvdXIgb3VwdXQgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICBpZiAod3N0cmVhbV8tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfKTsKKyAgICAgIHdzdHJlYW1fLT5uZXh0X291dCA9IGN3YnVmXzsKKyAgICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKKyAgICB9CisKKyAgICBpbnQgemxpYl9ydiA9IGRlZmxhdGUod3N0cmVhbV8sIGZsdXNoKTsKKworICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCAmJiB6bGliX3J2ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgYXNzZXJ0KHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKTsKKyAgICAgIG91dHB1dF9maW5pc2hlZF8gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2hlY2tabGliUnYoemxpYl9ydiwgd3N0cmVhbV8tPm1zZyk7CisKKyAgICBpZiAoKGZsdXNoID09IFpfU1lOQ19GTFVTSCB8fCBmbHVzaCA9PSBaX0ZVTExfRkxVU0gpICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwCisgICAgICAgICYmIHdzdHJlYW1fLT5hdmFpbF9vdXQgIT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK2NvbnN0IHVpbnQ4X3QqIFRabGliVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgLy8gRG9uJ3QgdHJ5IHRvIGJlIGNsZXZlciB3aXRoIHNoaWZ0aW5nIGJ1ZmZlcnMuCisgIC8vIElmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIGdpdmUgYSBwb2ludGVyIHRvIGl0LAorICAvLyBvdGhlcndpc2UgbGV0IHRoZSBwcm90Y29sIHVzZSBpdHMgc2xvdyBwYXRoLgorICBpZiAocmVhZEF2YWlsKCkgPj0gKGludCkqbGVuKSB7CisgICAgKmxlbiA9ICh1aW50MzJfdClyZWFkQXZhaWwoKTsKKyAgICByZXR1cm4gdXJidWZfICsgdXJwb3NfOworICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFRabGliVHJhbnNwb3J0Ojpjb25zdW1lKHVpbnQzMl90IGxlbikgeworICBpZiAocmVhZEF2YWlsKCkgPj0gKGludClsZW4pIHsKKyAgICB1cnBvc18gKz0gbGVuOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOworICB9Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OnZlcmlmeUNoZWNrc3VtKCkgeworICAvLyBJZiB6bGliIGhhcyBhbHJlYWR5IHJlcG9ydGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwKKyAgLy8gaXQgaGFzIHZlcmlmaWVkIHRoZSBjaGVja3N1bS4KKyAgaWYgKGlucHV0X2VuZGVkXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KKyAgLy8gSWYgdGhlIGNhbGxlciBzdGlsbCBoYXMgdW5yZWFkIGRhdGEsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgaWYgKHJlYWRBdmFpbCgpID4gMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIpOworICB9CisKKyAgLy8gUmVzZXQgdGhlIHJzdHJlYW0gZmllbGRzLCBpbiBjYXNlIGF2YWlsX291dCBpcyAwLgorICAvLyAoU2luY2UgcmVhZEF2YWlsKCkgaXMgMCwgd2Uga25vdyB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YSBpbiB1cmJ1Zl8pCisgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKKyAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOworICB1cnBvc18gPSAwOworCisgIC8vIENhbGwgaW5mbGF0ZSgpCisgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNoZWNrc3VtIGlzIGJhZC4KKyAgYm9vbCBwZXJmb3JtZWRfaW5mbGF0ZSA9IHJlYWRGcm9tWmxpYigpOworICBpZiAoIXBlcmZvcm1lZF9pbmZsYXRlKSB7CisgICAgLy8gV2UgbmVlZGVkIHRvIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIGFuZCB0aGUgcmVhZCgpIGNhbGwKKyAgICAvLyByZXR1cm5lZCAwLgorICAgIC8vCisgICAgLy8gTm90IGFsbCBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBiZWhhdmUgdGhlIHNhbWUgd2F5IGhlcmUsIHNvIHdlJ2xsCisgICAgLy8gZW5kIHVwIHdpdGggZGlmZmVyZW50IGJlaGF2aW9yIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgLy8KKyAgICAvLyBGb3Igc29tZSB0cmFuc3BvcnRzIChlLmcuLCBURkRUcmFuc3BvcnQpLCByZWFkKCkgYmxvY2tzIGlmIG5vIG1vcmUgZGF0YQorICAgIC8vIGlzIGF2YWlsYWJsZS4gIFRoZXkgb25seSByZXR1cm4gMCBpZiBFT0YgaGFzIGJlZW4gcmVhY2hlZCwgb3IgaWYgdGhlCisgICAgLy8gcmVtb3RlIGVuZHBvaW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uICBGb3IgdGhvc2UgdHJhbnNwb3J0cywKKyAgICAvLyB2ZXJpZnlDaGVja3N1bSgpIHdpbGwgYmxvY2sgdW50aWwgdGhlIGNoZWNrc3VtIGJlY29tZXMgYXZhaWxhYmxlLgorICAgIC8vCisgICAgLy8gT3RoZXIgdHJhbnNwb3J0IHR5cGVzIChlLmcuLCBUTWVtb3J5QnVmZmVyKSBhbHdheXMgcmV0dXJuIDAgaW1tZWRpYXRlbHkKKyAgICAvLyBpZiBubyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLiAgRm9yIHRob3NlIHRyYW5zcG9ydCB0eXBlcywgdmVyaWZ5Q2hlY2tzdW0KKyAgICAvLyB3aWxsIHJhaXNlIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBub3QgYXZhaWxhYmxlIGZyb20KKyAgICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgeWV0LgorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tzdW0gbm90IGF2YWlsYWJsZSB5ZXQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkiKTsKKyAgfQorCisgIC8vIElmIGlucHV0X2VuZGVkXyBpcyB0cnVlIG5vdywgdGhlIGNoZWNrc3VtIGhhcyBiZWVuIHZlcmlmaWVkCisgIGlmIChpbnB1dF9lbmRlZF8pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGUgY2FsbGVyIGludm9rZWQgdXMgYmVmb3JlIHRoZSBhY3R1YWwgZW5kIG9mIHRoZSBkYXRhIHN0cmVhbQorICBhc3NlcnQocnN0cmVhbV8tPmF2YWlsX291dCA8IHVyYnVmX3NpemVfKTsKKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpsaWIgc3RyZWFtIik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVlYzQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKK3N0cnVjdCB6X3N0cmVhbV9zOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24geworcHVibGljOgorICBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpCisgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKKyAgICAgIHpsaWJfc3RhdHVzXyhzdGF0dXMpLAorICAgICAgemxpYl9tc2dfKG1zZyA9PSBOVUxMID8gIihudWxsKSIgOiBtc2cpIHt9CisKKyAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIGludCBnZXRabGliU3RhdHVzKCkgeyByZXR1cm4gemxpYl9zdGF0dXNfOyB9CisgIHN0ZDo6c3RyaW5nIGdldFpsaWJNZXNzYWdlKCkgeyByZXR1cm4gemxpYl9tc2dfOyB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZShpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpIHsKKyAgICBzdGQ6OnN0cmluZyBydiA9ICJ6bGliIGVycm9yOiAiOworICAgIGlmIChtc2cpIHsKKyAgICAgIHJ2ICs9IG1zZzsKKyAgICB9IGVsc2UgeworICAgICAgcnYgKz0gIihubyBtZXNzYWdlKSI7CisgICAgfQorICAgIHJ2ICs9ICIgKHN0YXR1cyA9ICI7CisgICAgcnYgKz0gdG9fc3RyaW5nKHN0YXR1cyk7CisgICAgcnYgKz0gIikiOworICAgIHJldHVybiBydjsKKyAgfQorCisgIGludCB6bGliX3N0YXR1c187CisgIHN0ZDo6c3RyaW5nIHpsaWJfbXNnXzsKK307CisKKy8qKgorICogVGhpcyB0cmFuc3BvcnQgdXNlcyB6bGliIHRvIGNvbXByZXNzIG9uIHdyaXRlIGFuZCBkZWNvbXByZXNzIG9uIHJlYWQKKyAqCisgKiBUT0RPKGRyZWlzcyk6IERvbid0IGRvIGFuIGV4dHJhIGNvcHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpZgorICogICAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgVEJ1ZmZlcmVkIG9yIFRNZW1vcnkuCisgKgorICovCitjbGFzcyBUWmxpYlRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUWmxpYlRyYW5zcG9ydD4geworcHVibGljOgorICAvKioKKyAgICogQHBhcmFtIHRyYW5zcG9ydCAgICBUaGUgdHJhbnNwb3J0IHRvIHJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20KKyAgICogICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgY29tcHJlc3NlZCBkYXRhIHRvLgorICAgKiBAcGFyYW0gdXJidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KKyAgICogQHBhcmFtIGNyYnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgorICAgKiBAcGFyYW0gdXdidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KKyAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgorICAgKiBAcGFyYW0gY29tcF9sZXZlbCAgIENvbXByZXNzaW9uIGxldmVsICgwPW5vbmVbZmFzdF0sIDY9ZGVmYXVsdCwgOT1tYXhbc2xvd10pLgorICAgKi8KKyAgVFpsaWJUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgaW50IHVyYnVmX3NpemUgPSBERUZBVUxUX1VSQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgIGludCBjcmJ1Zl9zaXplID0gREVGQVVMVF9DUkJVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQgdXdidWZfc2l6ZSA9IERFRkFVTFRfVVdCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50IGN3YnVmX3NpemUgPSBERUZBVUxUX0NXQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgIGludDE2X3QgY29tcF9sZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHVycG9zXygwKSwKKyAgICAgIHV3cG9zXygwKSwKKyAgICAgIGlucHV0X2VuZGVkXyhmYWxzZSksCisgICAgICBvdXRwdXRfZmluaXNoZWRfKGZhbHNlKSwKKyAgICAgIHVyYnVmX3NpemVfKHVyYnVmX3NpemUpLAorICAgICAgY3JidWZfc2l6ZV8oY3JidWZfc2l6ZSksCisgICAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKKyAgICAgIGN3YnVmX3NpemVfKGN3YnVmX3NpemUpLAorICAgICAgdXJidWZfKE5VTEwpLAorICAgICAgY3JidWZfKE5VTEwpLAorICAgICAgdXdidWZfKE5VTEwpLAorICAgICAgY3didWZfKE5VTEwpLAorICAgICAgcnN0cmVhbV8oTlVMTCksCisgICAgICB3c3RyZWFtXyhOVUxMKSwKKyAgICAgIGNvbXBfbGV2ZWxfKGNvbXBfbGV2ZWwpIHsKKyAgICBpZiAodXdidWZfc2l6ZV8gPCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgeworICAgICAgLy8gSGF2ZSB0byBjb3B5IHRoaXMgaW50byBhIGxvY2FsIGJlY2F1c2Ugb2YgYSBsaW5raW5nIGlzc3VlLgorICAgICAgaW50IG1pbmltdW0gPSBNSU5fRElSRUNUX0RFRkxBVEVfU0laRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvX3N0cmluZyhtaW5pbXVtKSArICIuIik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHVyYnVmXyA9IG5ldyB1aW50OF90W3VyYnVmX3NpemVdOworICAgICAgY3JidWZfID0gbmV3IHVpbnQ4X3RbY3JidWZfc2l6ZV07CisgICAgICB1d2J1Zl8gPSBuZXcgdWludDhfdFt1d2J1Zl9zaXplXTsKKyAgICAgIGN3YnVmXyA9IG5ldyB1aW50OF90W2N3YnVmX3NpemVdOworCisgICAgICAvLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCisgICAgICBpbml0WmxpYigpOworCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBkZWxldGVbXSB1cmJ1Zl87CisgICAgICBkZWxldGVbXSBjcmJ1Zl87CisgICAgICBkZWxldGVbXSB1d2J1Zl87CisgICAgICBkZWxldGVbXSBjd2J1Zl87CisgICAgICB0aHJvdzsKKyAgICB9CisgIH0KKworICAvLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCisgIHZvaWQgaW5pdFpsaWIoKTsKKworICAvKioKKyAgICogVFpsaWJUcmFuc3BvcnQgZGVzdHJ1Y3Rvci4KKyAgICoKKyAgICogV2FybmluZzogRGVzdHJveWluZyBhIFRabGliVHJhbnNwb3J0IG9iamVjdCBtYXkgZGlzY2FyZCBhbnkgd3JpdHRlbiBidXQKKyAgICogdW5mbHVzaGVkIGRhdGEuICBZb3UgbXVzdCBleHBsaWNpdGx5IGNhbGwgZmx1c2goKSBvciBmaW5pc2goKSB0byBlbnN1cmUKKyAgICogdGhhdCBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gYW5kIGZsdXNoZWQgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgKi8KKyAgflRabGliVHJhbnNwb3J0KCk7CisKKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCBmbHVzaCgpOworCisgIC8qKgorICAgKiBGaW5hbGl6ZSB0aGUgemxpYiBzdHJlYW0uCisgICAqCisgICAqIFRoaXMgY2F1c2VzIHpsaWIgdG8gZmx1c2ggYW55IHBlbmRpbmcgd3JpdGUgZGF0YSBhbmQgd3JpdGUgZW5kLW9mLXN0cmVhbQorICAgKiBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBjaGVja3N1bS4gIE9uY2UgZmluaXNoKCkgaGFzIGJlZW4gY2FsbGVkLCBubworICAgKiBuZXcgZGF0YSBjYW4gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgorICAgKi8KKyAgdm9pZCBmaW5pc2goKTsKKworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogVmVyaWZ5IHRoZSBjaGVja3N1bSBhdCB0aGUgZW5kIG9mIHRoZSB6bGliIHN0cmVhbS4KKyAgICoKKyAgICogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4KKyAgICogSXQgdmVyaWZpZXMgdGhlIGNoZWNrc3VtIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIGZpbmlzaCgpIGNhbGwuCisgICAqLworICB2b2lkIHZlcmlmeUNoZWNrc3VtKCk7CisKKyAgLyoqCisgICAqIFRPRE8oc29tZW9uZV9zbWFydCk6IENob29zZSBzbWFydCBkZWZhdWx0cy4KKyAgICovCisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VUkJVRl9TSVpFID0gMTI4OworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1JCVUZfU0laRSA9IDEwMjQ7CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKK3Byb3RlY3RlZDoKKyAgaW5saW5lIHZvaWQgY2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKKyAgaW5saW5lIHZvaWQgY2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CisgIGlubGluZSBpbnQgcmVhZEF2YWlsKCk7CisgIHZvaWQgZmx1c2hUb1RyYW5zcG9ydChpbnQgZmx1c2gpOworICB2b2lkIGZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IGZsdXNoKTsKKyAgYm9vbCByZWFkRnJvbVpsaWIoKTsKKworcHJvdGVjdGVkOgorICAvLyBXcml0ZXMgc21hbGxlciB0aGFuIHRoaXMgYXJlIGJ1ZmZlcmVkIHVwLgorICAvLyBMYXJnZXIgKG9yIGVxdWFsKSB3cml0ZXMgYXJlIGR1bXBlZCBzdHJhaWdodCB0byB6bGliLgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUgPSAzMjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKworICBpbnQgdXJwb3NfOworICBpbnQgdXdwb3NfOworCisgIC8vLyBUcnVlIGlmZiB6bGliIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgYm9vbCBpbnB1dF9lbmRlZF87CisgIC8vLyBUcnVlIGlmZiB3ZSBoYXZlIGZpbmlzaGVkIHRoZSBvdXRwdXQgc3RyZWFtLgorICBib29sIG91dHB1dF9maW5pc2hlZF87CisKKyAgdWludDMyX3QgdXJidWZfc2l6ZV87CisgIHVpbnQzMl90IGNyYnVmX3NpemVfOworICB1aW50MzJfdCB1d2J1Zl9zaXplXzsKKyAgdWludDMyX3QgY3didWZfc2l6ZV87CisKKyAgdWludDhfdCogdXJidWZfOworICB1aW50OF90KiBjcmJ1Zl87CisgIHVpbnQ4X3QqIHV3YnVmXzsKKyAgdWludDhfdCogY3didWZfOworCisgIHN0cnVjdCB6X3N0cmVhbV9zKiByc3RyZWFtXzsKKyAgc3RydWN0IHpfc3RyZWFtX3MqIHdzdHJlYW1fOworCisgIGNvbnN0IGludCBjb21wX2xldmVsXzsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHpsaWJiZWQgb25lLgorICoKKyAqLworY2xhc3MgVFpsaWJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUWmxpYlRyYW5zcG9ydCh0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA4MjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworLy8gd2luMzIKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCisjZGVmaW5lIERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUyAxMTY0NDQ3MzYwMDAwMDAwMFVpNjQKKyNlbHNlCisjZGVmaW5lIERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUyAxMTY0NDQ3MzYwMDAwMDAwMFVMTAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01JTkdXMzJfXykKK3N0cnVjdCB0aW1lem9uZSB7CisgIGludCB0el9taW51dGVzd2VzdDsgLyogbWludXRlcyBXIG9mIEdyZWVud2ljaCAqLworICBpbnQgdHpfZHN0dGltZTsgICAgIC8qIHR5cGUgb2YgZHN0IGNvcnJlY3Rpb24gKi8KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCitpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopIHsKKyAgcmV0dXJuIGdldHRpbWVvZmRheSh0dix0eik7Cit9CisjZWxzZQoraW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KSB7CisgIEZJTEVUSU1FIGZ0OworICB1bnNpZ25lZCBfX2ludDY0IHRtcHJlcygwKTsKKyAgc3RhdGljIGludCB0emZsYWc7CisKKyAgaWYgKE5VTEwgIT0gdHYpIHsKKyAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOworCisgICAgdG1wcmVzIHw9IGZ0LmR3SGlnaERhdGVUaW1lOworICAgIHRtcHJlcyA8PD0gMzI7CisgICAgdG1wcmVzIHw9IGZ0LmR3TG93RGF0ZVRpbWU7CisKKyAgICAvKmNvbnZlcnRpbmcgZmlsZSB0aW1lIHRvIHVuaXggZXBvY2gqLworICAgIHRtcHJlcyAtPSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1M7CisgICAgdG1wcmVzIC89IDEwOyAvKmNvbnZlcnQgaW50byBtaWNyb3NlY29uZHMqLworICAgIHR2LT50dl9zZWMgPSAobG9uZykodG1wcmVzIC8gMTAwMDAwMFVMKTsKKyAgICB0di0+dHZfdXNlYyA9IChsb25nKSh0bXByZXMgJSAxMDAwMDAwVUwpOworICB9CisKKyAgaWYgKE5VTEwgIT0gdHopIHsKKyAgICBpZiAoIXR6ZmxhZykgeworICAgICAgX3R6c2V0KCk7CisgICAgICB0emZsYWcrKzsKKyAgICB9CisKKyAgICBsb25nIHRpbWVfem9uZSgwKTsKKyAgICBlcnJub190IGVycihfZ2V0X3RpbWV6b25lKCZ0aW1lX3pvbmUpKTsKKyAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICB0ei0+dHpfbWludXRlc3dlc3QgPSB0aW1lX3pvbmUgLyA2MDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBkYXlfbGlnaHQoMCk7CisgICAgZXJyID0gKF9nZXRfZGF5bGlnaHQoJmRheV9saWdodCkpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgIHR6LT50el9kc3R0aW1lID0gZGF5X2xpZ2h0OworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgdGhyaWZ0X3NsZWVwKHVuc2lnbmVkIGludCBzZWNvbmRzKSB7CisgIDo6U2xlZXAoc2Vjb25kcyAqIDEwMDApOworICByZXR1cm4gMDsKK30KK2ludCB0aHJpZnRfdXNsZWVwKHVuc2lnbmVkIGludCBtaWNyb3NlY29uZHMpIHsKKyAgdW5zaWduZWQgaW50IG1pbGxpc2Vjb25kcyA9IChtaWNyb3NlY29uZHMgKyA5OTkpIC8gMTAwMDsKKyAgOjpTbGVlcChtaWxsaXNlY29uZHMpOworICByZXR1cm4gMDsKK30KKworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpIHsKKyAgc3RyY3B5KF9idWYsIGN0aW1lKF9jbG9jaykpOworICByZXR1cm4gX2J1ZjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyYWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfR0VUVElNRU9GREFZX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19HRVRUSU1FT0ZEQVlfSF8KKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworc3RydWN0IHRocmlmdF90aW1lc3BlYyB7CisgIGludDY0X3QgdHZfc2VjOworICBpbnQ2NF90IHR2X25zZWM7Cit9OworCitpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopOworaW50IHRocmlmdF9zbGVlcCh1bnNpZ25lZCBpbnQgc2Vjb25kcyk7CitpbnQgdGhyaWZ0X3VzbGVlcCh1bnNpZ25lZCBpbnQgbWljcm9fc2Vjb25kcyk7CitjaGFyKiB0aHJpZnRfY3RpbWVfcihjb25zdCB0aW1lX3QqIF9jbG9jaywgY2hhciogX2J1Zik7CisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfR0VUVElNRU9GREFZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL09wZXJhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODYwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX09QRVJBVE9SU19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfT1BFUkFUT1JTX0hfCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEVudW1JdGVyYXRvcjsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBURW51bUl0ZXJhdG9yJiwgY29uc3QgVEVudW1JdGVyYXRvciYpIHsKKyAgLy8gTm90IGVudGlyZWx5IHN1cmUgd2hhdCB0aGUgdGVzdCBzaG91bGQgYmUgaGVyZS4gSXQgaXMgb25seSB0byBlbmFibGUKKyAgLy8gaXRlcmF0b3IgZGVidWdnaW5nIGFuZCBpcyBub3QgdXNlZCBpbiByZWxlYXNlIG1vZGUuCisgIHJldHVybiB0cnVlOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX09QRVJBVE9SU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzZmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zY29wZV9leGl0LmhwcD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVE92ZXJsYXBwZWRXb3JrSXRlbTo6VE92ZXJsYXBwZWRXb3JrSXRlbSgpCisgIDogU0xJU1RfRU5UUlkoKSwKKyAgICBhY3Rpb24oVU5LTk9XTiksCisgICAgaChJTlZBTElEX0hBTkRMRV9WQUxVRSksCisgICAgYnVmZmVyKE5VTEwpLAorICAgIGJ1ZmZlcl9sZW4oMCksCisgICAgb3ZlcmxhcCgpLAorICAgIGxhc3RfZXJyb3IoMCksCisgICAgc3VjY2VzcyhUUlVFKSB7Cit9CisKK3ZvaWQgVE92ZXJsYXBwZWRXb3JrSXRlbTo6cmVzZXQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCkgeworICBtZW1zZXQoJm92ZXJsYXAsIDAsIHNpemVvZihvdmVybGFwKSk7CisgIG92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CisgIGJ1ZmZlciA9IGJ1ZjsKKyAgYnVmZmVyX2xlbiA9IGxlbjsKKyAgbGFzdF9lcnJvciA9IDA7CisgIHN1Y2Nlc3MgPSBGQUxTRTsKK30KKwordWludDMyX3QgVE92ZXJsYXBwZWRXb3JrSXRlbTo6b3ZlcmxhcHBlZFJlc3VsdHMoYm9vbCBzaWduYWxfZmFpbHVyZSkgeworICBEV09SRCBieXRlcyA9IDA7CisgIEJPT0wgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KGgsICZvdmVybGFwLCAmYnl0ZXMsIFRSVUUpOworICBpZiAoc2lnbmFsX2ZhaWx1cmUgJiYgIXJlc3VsdCkgLy8gZ2V0IG92ZXJsYXBwZWQgZXJyb3IgY2FzZQorICB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpHZXRPdmVybGFwcGVkUmVzdWx0IGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiBHZXRPdmVybGFwcGVkUmVzdWx0IGZhaWxlZCIpOworICB9CisgIHJldHVybiBieXRlczsKK30KKworYm9vbCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpwcm9jZXNzKCkgeworICBCT09TVF9TQ09QRV9FWElUKCgmZG9uZVN1Ym1pdHRpbmdFdmVudCkpIHsgU2V0RXZlbnQoZG9uZVN1Ym1pdHRpbmdFdmVudC5oKTsgfQorICBCT09TVF9TQ09QRV9FWElUX0VORAorCisgIHN3aXRjaCAoYWN0aW9uKSB7CisgIGNhc2UgKENPTk5FQ1QpOgorICAgIHN1Y2Nlc3MgPSA6OkNvbm5lY3ROYW1lZFBpcGUoaCwgJm92ZXJsYXApOworICAgIGlmIChzdWNjZXNzID09IEZBTFNFKQorICAgICAgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgKFJFQUQpOgorICAgIHN1Y2Nlc3MgPSA6OlJlYWRGaWxlKGgsIGJ1ZmZlciwgYnVmZmVyX2xlbiwgTlVMTCwgJm92ZXJsYXApOworICAgIGlmIChzdWNjZXNzID09IEZBTFNFKQorICAgICAgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgKENBTkNFTElPKToKKyAgICBzdWNjZXNzID0gOjpDYW5jZWxJbyhoKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIChTVE9QKToKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OmFkZFdvcmtJdGVtKFRPdmVybGFwcGVkV29ya0l0ZW0qIGl0ZW0pIHsKKyAgSW50ZXJsb2NrZWRQdXNoRW50cnlTTGlzdCgmd29ya0xpc3RfLCBpdGVtKTsKKyAgU2V0RXZlbnQod29ya0F2YWlsYWJsZUV2ZW50Xy5oKTsKKyAgV2FpdEZvclNpbmdsZU9iamVjdChpdGVtLT5kb25lU3VibWl0dGluZ0V2ZW50LmgsIElORklOSVRFKTsKK30KKworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OmFjcXVpcmVfaW5zdGFuY2UoKSB7CisgIFRBdXRvQ3JpdCBsb2NrKGluc3RhbmNlR3VhcmRfKTsKKyAgaWYgKGluc3RhbmNlXyA9PSBOVUxMKSB7CisgICAgYXNzZXJ0KGluc3RhbmNlUmVmQ291bnRfID09IDApOworICAgIGluc3RhbmNlXyA9IG5ldyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ7CisgIH0KKyAgKytpbnN0YW5jZVJlZkNvdW50XzsKKyAgcmV0dXJuIGluc3RhbmNlXzsKK30KK3ZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpyZWxlYXNlX2luc3RhbmNlKCkgeworICBUQXV0b0NyaXQgbG9jayhpbnN0YW5jZUd1YXJkXyk7CisgIGlmICgtLWluc3RhbmNlUmVmQ291bnRfID09IDApIHsKKyAgICBkZWxldGUgaW5zdGFuY2VfOworICAgIGluc3RhbmNlXyA9IE5VTEw7CisgIH0KK30KKworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKSB7CisgIHN0b3BJdGVtXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpTVE9QOworCisgIEluaXRpYWxpemVTTGlzdEhlYWQoJndvcmtMaXN0Xyk7CisgIHRocmVhZF8gPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KE5VTEwsIDAsIHRocmVhZF9wcm9jLCB0aGlzLCAwLCBOVUxMKTsKKyAgaWYgKHRocmVhZF8gPT0gMCkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCB1bmFibGUgdG8gY3JlYXRlIHRocmVhZCwgZXJybm89IiwgZXJybm8pOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCB1bmFibGUgdG8gY3JlYXRlIHRocmVhZCIpOworICB9Cit9CisKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6flRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpIHsKKyAgYWRkV29ya0l0ZW0oJnN0b3BJdGVtXyk7CisgIDo6V2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWRfLCBJTkZJTklURSk7CisgIENsb3NlSGFuZGxlKHRocmVhZF8pOworfQorCit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cnVuKCkgeworICBmb3IgKDs7KSB7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdCh3b3JrQXZhaWxhYmxlRXZlbnRfLmgsIElORklOSVRFKTsKKyAgICAvLyB0b2RvIGNoZWNrIHJlc3VsdAorICAgIFNMSVNUX0VOVFJZKiBlbnRyeSA9IE5VTEw7CisgICAgd2hpbGUgKChlbnRyeSA9IEludGVybG9ja2VkUG9wRW50cnlTTGlzdCgmd29ya0xpc3RfKSkgIT0gTlVMTCkgeworICAgICAgVE92ZXJsYXBwZWRXb3JrSXRlbSYgaXRlbSA9ICpzdGF0aWNfY2FzdDxUT3ZlcmxhcHBlZFdvcmtJdGVtKj4oZW50cnkpOworICAgICAgaWYgKCFpdGVtLnByb2Nlc3MoKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit1bnNpZ25lZCBfX3N0ZGNhbGwgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjp0aHJlYWRfcHJvYyh2b2lkKiBhZGRyKSB7CisgIHN0YXRpY19jYXN0PFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCo+KGFkZHIpLT5ydW4oKTsKKyAgcmV0dXJuIDA7Cit9CisKK1RDcml0aWNhbFNlY3Rpb24gVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZUd1YXJkXzsKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZV87Cit1aW50MzJfdCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlUmVmQ291bnRfID0gMDsKK30KK30KK30gLy8gYXBhY2g6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBjNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZF9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWRfSF8gMQorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIGlzIG9ubHkgdXNhYmxlIG9uIFdpbmRvd3MiCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8V2luZG93cy5oPgorCisvKgorICAqKiogV2h5IGRvZXMgdGhpcyBjbGFzcyBleGlzdD8KKyAgSW4gc2hvcnQsIGJlY2F1c2Ugd2Ugd2FudCB0byBlbmFibGUgc29tZXRoaW5nIHNpbWlsYXIgdG8gYSAic2VsZWN0IiBsb29wLCBvbiBXaW5kb3dzLCB3aXRoCisgIG5hbWVkIHBpcGVzLiAgVGhlIGNvcmUgb2YgdGhlICJzZWxlY3QiIGxvb3AgaXMgYSBjYWxsIHRvIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMuICBTbyB0aGF0IG1lYW5zCisgIHdlIG5lZWQgYSBzaWduYWxhYmxlIG9iamVjdCB0aGF0IGluZGljYXRlcyB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlLgorCisgIEEgcGlwZSBoYW5kbGUgZG9lc24ndCBkbyB0aGF0LiAgQSBwaXBlIGhhbmRsZSBpcyBzaWduYWxlZCB3aGVuIGEgcmVhZCBvciB3cml0ZSBjb21wbGV0ZXMsIGFuZCBpZgorICBubyBvbmUgaGFzIGNhbGxlZCByZWFkIG9yIHdyaXRlLCB0aGVuIHRoZSBwaXBlIGhhbmRsZSBpcyB1c2VsZXNzIGluIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMuICBTbworICBpbnN0ZWFkLCB3ZSB1c2Ugb3ZlcmxhcHBlZCBJL08uICBXaXRoIG92ZXJsYXBwZWQgSS9PLCB5b3UgY2FsbCByZWFkLCBhbmQgYXNzb2NpYXRlIGFuIGV2ZW50IHdpdGgKKyAgdGhlIHJlYWQuICBXaGVuIHRoZSByZWFkIGZpbmlzaGVzLCB0aGUgZXZlbnQgaXMgc2lnbmFsZWQuICBUaGlzIG1lYW5zIHRoYXQgd2hlbiB5b3UgY3JlYXRlIGEgcGlwZSwKKyAgeW91IHN0YXJ0IGEgcmVhZC4gIFdoZW4gdGhlIGN1c3RvbWVyIGNhbGxzIHJlYWQgb24geW91ciB0cmFuc3BvcnQgb2JqZWN0LCB5b3Ugd2FpdCBmb3IgdGhlIGxhc3QKKyAgcmVhZCB0byBmaW5pc2gsIGFuZCB0aGVuIGtpY2sgb2ZmIGFub3RoZXIuCisKKyAgVGhlcmUgaXMgb25lIGJpZyBjYXZlYXQgdG8gdGhpcyB0aG91Z2guICBUaGUgdGhyZWFkIHRoYXQgaW5pdGlhdGVkIHRoZSByZWFkIG11c3Qgc3RheSBhbGl2ZS4gIElmCisgIHRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZWQgdGhlIHJlYWQgZXhpdHMsIHRoZW4gdGhlIHJlYWQgY29tcGxldGVzIGluIGFuIGVycm9yIHN0YXRlLiAgVG8gZW5zdXJlCisgIHRoYXQgdGhlIGluaXRpYXRpbmcgdGhyZWFkIHN0YXlzIGFsaXZlLCB3ZSBjcmVhdGUgYSBzaW5nbGV0b24gdGhyZWFkIHdob3NlIHNvbGUgcmVzcG9uc2liaWxpdHkgaXMKKyAgdG8gbWFuYWdlIHRoaXMgb3ZlcmxhcHBlZCBJL08gcmVxdWVzdHMuICBUaGlzIGludHJvZHVjZXMgc29tZSBvdmVyaGVhZCwgYnV0IGl0IGlzIG92ZXJoZWFkIHRoYXQKKyAgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IGJlaGF2aW9yLgorCisgIFRoaXMgdGhyZWFkIGN1cnJlbnRseSBzdXBwb3J0cyBjb25uZWN0LCByZWFkLCBhbmQgY2FuY2VsIGlvLiAgU28gZmFyLCBJIGhhdmVuJ3QgbmVlZGVkIHRvIHB1dCBhbnkKKyAgd3JpdGVzIG9uIHRoaXMgdGhyZWFkLCBidXQgaWYgbmVlZGVkLCBpdCBjb3VsZCBiZSBkb25lLiAgVGhlIGNsaWVudCB3cml0ZSBidWZmZXIgd291bGQgbmVlZCB0byBiZQorICBjb3BpZWQgdG8gZW5zdXJlIHRoYXQgaXQgZG9lc24ndCBnZXQgaW52YWxpZGF0ZWQuCisKKyAgKioqIEhvdyBkb2VzIG9uZSB1c2UgdGhpcyBjbGFzcz8KKyAgQ3JlYXRlIGEgVE92ZXJsYXBwZWRXb3JrSXRlbSwgYW5kIGZpbGwgaW4gdGhlIGFjdGlvbiBhbmQgImgiLCB0aGVuIGNhbGwgcmVzZXQoKS4gIFlvdXIgd29yayBpdGVtCisgIGlzIG5vdyByZWFkeSB0byBiZSBzdWJtaXR0ZWQgdG8gdGhlIG92ZXJsYXBwZWQgc3VibWlzc2lvbiB0aHJlYWQuICBDcmVhdGUgYSBUQXV0b092ZXJsYXBUaHJlYWQsCisgIGFuZCBjYWxsIHRocmVhZC0+YWRkV29ya0l0ZW0gd2l0aCB5b3VyIHdvcmsgaXRlbS4gIEFmdGVyIGFkZFdvcmtJdGVtIGNvbXBsZXRlcywgeW91IG1heSBpbnNwZWN0CisgIGxhc3RfZXJyb3IgYW5kIHN1Y2Nlc3MuICBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIGNhbGwgd29ya0l0ZW0ub3ZlcmxhcHBlZFJlc3VsdHMgdG8gd2FpdAorICB1bnRpbCB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisqLworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3N0cnVjdCBERUNMU1BFQ19BTElHTihNRU1PUllfQUxMT0NBVElPTl9BTElHTk1FTlQpIFRPdmVybGFwcGVkV29ya0l0ZW0gOiBwdWJsaWMgU0xJU1RfRU5UUlkgeworICBUT3ZlcmxhcHBlZFdvcmtJdGVtKCk7CisKKyAgZW51bSBhY3Rpb25fdCB7CisgICAgVU5LTk9XTiA9IDMwMDAsCisgICAgQ09OTkVDVCwKKyAgICBSRUFELAorICAgIENBTkNFTElPLAorICAgIFNUT1AsCisgIH07CisKKyAgVEF1dG9SZXNldEV2ZW50IGRvbmVTdWJtaXR0aW5nRXZlbnQ7CisgIGFjdGlvbl90IGFjdGlvbjsKKyAgSEFORExFIGg7CisgIHVpbnQ4X3QqIGJ1ZmZlcjsKKyAgdWludDMyX3QgYnVmZmVyX2xlbjsKKyAgT1ZFUkxBUFBFRCBvdmVybGFwOworCisgIERXT1JEIGxhc3RfZXJyb3I7CisgIEJPT0wgc3VjY2VzczsKKworICB2b2lkIHJlc2V0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuLCBIQU5ETEUgZXZlbnQpOworICB1aW50MzJfdCBvdmVybGFwcGVkUmVzdWx0cyhib29sIHNpZ25hbF9mYWlsdXJlID0gdHJ1ZSk7CisgIGJvb2wgcHJvY2VzcygpOworfTsKKworY2xhc3MgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgdm9pZCBhZGRXb3JrSXRlbShUT3ZlcmxhcHBlZFdvcmtJdGVtKiBpdGVtKTsKKworICAvLyBzaW5nbGV0b24gc3R1ZmYKK3B1YmxpYzoKKyAgc3RhdGljIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogYWNxdWlyZV9pbnN0YW5jZSgpOworICBzdGF0aWMgdm9pZCByZWxlYXNlX2luc3RhbmNlKCk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBUQ3JpdGljYWxTZWN0aW9uIGluc3RhbmNlR3VhcmRfOworICBzdGF0aWMgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBpbnN0YW5jZV87CisgIHN0YXRpYyB1aW50MzJfdCBpbnN0YW5jZVJlZkNvdW50XzsKKworICAvLyB0aHJlYWQgZGV0YWlscworcHJpdmF0ZToKKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCk7CisgIH5UT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKTsKKyAgdm9pZCBydW4oKTsKKyAgc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB0aHJlYWRfcHJvYyh2b2lkKiBhZGRyKTsKKworcHJpdmF0ZToKKyAgREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBTTElTVF9IRUFERVIgd29ya0xpc3RfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIHN0b3BJdGVtXzsKKyAgVEF1dG9SZXNldEV2ZW50IHdvcmtBdmFpbGFibGVFdmVudF87CisgIEhBTkRMRSB0aHJlYWRfOworfTsKKworY2xhc3MgVEF1dG9PdmVybGFwVGhyZWFkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3ByaXZhdGU6CisgIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogcDsKKworcHVibGljOgorICBUQXV0b092ZXJsYXBUaHJlYWQoKSA6IHAoVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphY3F1aXJlX2luc3RhbmNlKCkpIHt9CisgIH5UQXV0b092ZXJsYXBUaHJlYWQoKSB7IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cmVsZWFzZV9pbnN0YW5jZSgpOyB9CisgIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIHA7IH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjg4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcApAQCAtMCwwICsxLDEwMCBAQAorLyogc29ja2V0cGFpci5jCisgKiBDb3B5cmlnaHQgMjAwNyBieSBOYXRoYW4gQy4gTXllcnMgPG5jbUBjYW50cmlwLm9yZz47IHNvbWUgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBjb2RlIGlzIEZyZWUgU29mdHdhcmUuICBJdCBtYXkgYmUgY29waWVkIGZyZWVseSwgaW4gb3JpZ2luYWwgb3IKKyAqIG1vZGlmaWVkIGZvcm0sIHN1YmplY3Qgb25seSB0byB0aGUgcmVzdHJpY3Rpb25zIHRoYXQgKDEpIHRoZSBhdXRob3IgaXMKKyAqIHJlbGlldmVkIGZyb20gYWxsIHJlc3BvbnNpYmlsaXRpZXMgZm9yIGFueSB1c2UgZm9yIGFueSBwdXJwb3NlLCBhbmQgKDIpCisgKiB0aGlzIGNvcHlyaWdodCBub3RpY2UgbXVzdCBiZSByZXRhaW5lZCwgdW5jaGFuZ2VkLCBpbiBpdHMgZW50aXJldHkuICBJZgorICogZm9yIGFueSByZWFzb24gdGhlIGF1dGhvciBtaWdodCBiZSBoZWxkIHJlc3BvbnNpYmxlIGZvciBhbnkgY29uc2VxdWVuY2VzCisgKiBvZiBjb3B5aW5nIG9yIHVzZSwgbGljZW5zZSBpcyB3aXRoaGVsZC4KKyAqLworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCisvLyBzdGwKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gV2luMzIKKyNpbmNsdWRlIDxXUzJ0Y3BpcC5oPgorCitpbnQgdGhyaWZ0X3NvY2tldHBhaXIoaW50IGQsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIFRIUklGVF9TT0NLRVQgc3ZbMl0pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUodHlwZSk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoZCk7CisKKyAgdW5pb24geworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbmFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyIGFkZHI7CisgIH0gYTsKKyAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5lcjsKKyAgaW50IGU7CisgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGEuaW5hZGRyKTsKKyAgRFdPUkQgZmxhZ3MgPSAwOworICBpbnQgcmV1c2UgPSAxOworCisgIGlmIChzdiA9PSAwKSB7CisgICAgV1NBU2V0TGFzdEVycm9yKFdTQUVJTlZBTCk7CisgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKyAgfQorCisgIGxpc3RlbmVyID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisgIGlmIChsaXN0ZW5lciA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICByZXR1cm4gU09DS0VUX0VSUk9SOworCisgIG1lbXNldCgmYSwgMCwgc2l6ZW9mKGEpKTsKKyAgYS5pbmFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIGEuaW5hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisgIGEuaW5hZGRyLnNpbl9wb3J0ID0gMDsKKworICBzdlswXSA9IHN2WzFdID0gSU5WQUxJRF9TT0NLRVQ7CisgIGRvIHsKKyAgICAvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0LiAgVGhpcyBpcyBiZWNhdXNlCisgICAgLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKyAgICAvLyB3YW50IHRvIGZvcmNlIHNvY2tldCBwYWlycyB0byBiZSBhbiBhZG1pbi4KKyAgICBzZXRzb2Nrb3B0KGxpc3RlbmVyLCBTT0xfU09DS0VULCBTT19FWENMVVNJVkVBRERSVVNFLCAoY2hhciopJnJldXNlLCAoc29ja2xlbl90KXNpemVvZihyZXVzZSkpOworICAgIGlmIChiaW5kKGxpc3RlbmVyLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICBicmVhazsKKyAgICBpZiAoZ2V0c29ja25hbWUobGlzdGVuZXIsICZhLmFkZHIsICZhZGRybGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICBicmVhazsKKyAgICBpZiAobGlzdGVuKGxpc3RlbmVyLCAxKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICBicmVhazsKKyAgICBzdlswXSA9IFdTQVNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCwgTlVMTCwgMCwgZmxhZ3MpOworICAgIGlmIChzdlswXSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgIGJyZWFrOworICAgIGlmIChjb25uZWN0KHN2WzBdLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICBicmVhazsKKyAgICBzdlsxXSA9IGFjY2VwdChsaXN0ZW5lciwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN2WzFdID09IElOVkFMSURfU09DS0VUKQorICAgICAgYnJlYWs7CisKKyAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgICAgcmV0dXJuIDA7CisKKyAgfSB3aGlsZSAoMCk7CisKKyAgZSA9IFdTQUdldExhc3RFcnJvcigpOworICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgIGNsb3Nlc29ja2V0KHN2WzBdKTsKKyAgY2xvc2Vzb2NrZXQoc3ZbMV0pOworICBXU0FTZXRMYXN0RXJyb3IoZSk7CisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiZjQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX1NPQ0tFVFBBSVJfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1NPQ0tFVFBBSVJfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZW5kaWYKKworLy8gV2luMzIKKyNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKK2ludCB0aHJpZnRfc29ja2V0cGFpcihpbnQgZCwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgVEhSSUZUX1NPQ0tFVCBzdlsyXSk7CisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfU09DS0VUUEFJUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzIxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TeW5jLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfU3luY19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfU3luY19IXyAxCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIndpbmRvd3MvU3luYy5oIGlzIG9ubHkgdXNhYmxlIG9uIFdpbmRvd3MiCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8V2luZG93cy5oPgorCisvKgorICBMaWdodHdlaWdodCBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyB0aGF0IG9ubHkgbWFrZSBzZW5zZSBvbiBXaW5kb3dzLiAgRm9yIGNyb3NzLXBsYXRmb3JtCisgIGNvZGUsIHVzZSB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgY29uY3VycmVuY3kgbmFtZXNwYWNlCisqLworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitzdHJ1Y3QgVENyaXRpY2FsU2VjdGlvbiA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIENSSVRJQ0FMX1NFQ1RJT04gY3M7CisgIFRDcml0aWNhbFNlY3Rpb24oKSB7IEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNzKTsgfQorICB+VENyaXRpY2FsU2VjdGlvbigpIHsgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZjcyk7IH0KK307CisKK2NsYXNzIFRBdXRvQ3JpdCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Citwcml2YXRlOgorICBDUklUSUNBTF9TRUNUSU9OKiBjc187CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVEF1dG9Dcml0KFRDcml0aWNhbFNlY3Rpb24mIGNzKSA6IGNzXygmY3MuY3MpIHsgRW50ZXJDcml0aWNhbFNlY3Rpb24oY3NfKTsgfQorICB+VEF1dG9Dcml0KCkgeyBMZWF2ZUNyaXRpY2FsU2VjdGlvbihjc18pOyB9Cit9OworCitzdHJ1Y3QgVEF1dG9SZXNldEV2ZW50IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisKKyAgVEF1dG9SZXNldEV2ZW50KCkgeworICAgIGggPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRBdXRvUmVzZXRFdmVudCB1bmFibGUgdG8gY3JlYXRlIGV2ZW50LCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigiQ3JlYXRlRXZlbnQgZmFpbGVkIik7CisgICAgfQorICB9CisgIH5UQXV0b1Jlc2V0RXZlbnQoKSB7IENsb3NlSGFuZGxlKGgpOyB9Cit9OworCitzdHJ1Y3QgVE1hbnVhbFJlc2V0RXZlbnQgOiBib29zdDo6bm9uY29weWFibGUgeworICBIQU5ETEUgaDsKKworICBUTWFudWFsUmVzZXRFdmVudCgpIHsKKyAgICBoID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRNYW51YWxSZXNldEV2ZW50IHVuYWJsZSB0byBjcmVhdGUgZXZlbnQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJDcmVhdGVFdmVudCBmYWlsZWQiKTsKKyAgICB9CisgIH0KKyAgflRNYW51YWxSZXNldEV2ZW50KCkgeyBDbG9zZUhhbmRsZShoKTsgfQorfTsKKworc3RydWN0IFRBdXRvSGFuZGxlIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisgIGV4cGxpY2l0IFRBdXRvSGFuZGxlKEhBTkRMRSBoXyA9IElOVkFMSURfSEFORExFX1ZBTFVFKSA6IGgoaF8pIHt9CisgIH5UQXV0b0hhbmRsZSgpIHsKKyAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIENsb3NlSGFuZGxlKGgpOworICB9CisKKyAgSEFORExFIHJlbGVhc2UoKSB7CisgICAgSEFORExFIHJldHZhbCA9IGg7CisgICAgaCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKyAgdm9pZCByZXNldChIQU5ETEUgaF8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIGlmIChoXyA9PSBoKQorICAgICAgcmV0dXJuOworICAgIGlmIChoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgQ2xvc2VIYW5kbGUoaCk7CisgICAgaCA9IGhfOworICB9Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY4M2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisKKy8vIGJvb3N0CisjaW5jbHVkZSA8Ym9vc3QvYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0ciBUV2luc29ja1NpbmdsZXRvbjo6aW5zdGFuY2VfcHRyXyhOVUxMKTsKK3N0ZDo6b25jZV9mbGFnIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc187CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUV2luc29ja1NpbmdsZXRvbjo6VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgeworICBXT1JEIHZlcnNpb24oTUFLRVdPUkQoMiwgMikpOworICBXU0FEYXRhIGRhdGEgPSB7MH07CisKKyAgaW50IGVycm9yKFdTQVN0YXJ0dXAodmVyc2lvbiwgJmRhdGEpKTsKKyAgaWYgKGVycm9yICE9IDApIHsKKyAgICBCT09TVF9BU1NFUlQoZmFsc2UpOworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpc2UgV2luc29jay4iKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFdpbnNvY2tTaW5nbGV0b246On5UV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CisgIFdTQUNsZWFudXAoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSh2b2lkKSB7CisgIHN0ZDo6Y2FsbF9vbmNlKGZsYWdzXywgaW5pdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFRXaW5zb2NrU2luZ2xldG9uOjppbml0KHZvaWQpIHsKKyAgaW5zdGFuY2VfcHRyXy5yZXNldChuZXcgVFdpbnNvY2tTaW5nbGV0b24pOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA4MDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfV0lORE9XU19UV0lOU09DS1NJTkdMRVRPTl9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9XSU5ET1dTX1RXSU5TT0NLU0lOR0xFVE9OX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisvLyBib29zdAorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogV2luc29jazIgbXVzdCBiZSBpbnRpYWxpc2VkIG9uY2Ugb25seSBpbiBvcmRlciB0byBjcmVhdGUgc29ja2V0cy4gVGhpcyBjbGFzcworICogcGVyZm9ybXMgYSBvbmUgdGltZSBpbml0aWFsaXNhdGlvbiB3aGVuIGNyZWF0ZSBpcyBjYWxsZWQuCisgKi8KK2NsYXNzIFRXaW5zb2NrU2luZ2xldG9uIDogcHJpdmF0ZSBib29zdDo6bm9uY29weWFibGUgeworCitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPFRXaW5zb2NrU2luZ2xldG9uPiBpbnN0YW5jZV9wdHI7CisKK3ByaXZhdGU6CisgIFRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOworCitwdWJsaWM6CisgIH5UV2luc29ja1NpbmdsZXRvbih2b2lkKTsKKworcHVibGljOgorICBzdGF0aWMgdm9pZCBjcmVhdGUodm9pZCk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGluaXQodm9pZCk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBpbnN0YW5jZV9wdHIgaW5zdGFuY2VfcHRyXzsKKyAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWdzXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1dJTkRPV1NfVFdJTlNPQ0tTSU5HTEVUT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA3ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9XaW5GY250bC5oPgorCitpbnQgdGhyaWZ0X2ZjbnRsKFRIUklGVF9TT0NLRVQgZmQsIGludCBjbWQsIGludCBmbGFncykgeworICBpZiAoY21kICE9IFRIUklGVF9GX0dFVEZMICYmIGNtZCAhPSBUSFJJRlRfRl9TRVRGTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChmbGFncyAhPSBUSFJJRlRfT19OT05CTE9DSyAmJiBmbGFncyAhPSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGNtZCA9PSBUSFJJRlRfRl9HRVRGTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaW50IHJlczsKKyAgaWYgKGZsYWdzKSB7CisgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nKj4oJihmbGFncyA9IDEpKSk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nKj4oJihmbGFncyA9IDApKSk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisjaWYgV0lOVkVSIDw9IDB4MDUwMiAvLyBYUCwgU2VydmVyMjAwMworaW50IHRocmlmdF9wb2xsKFRIUklGVF9QT0xMRkQqIGZkQXJyYXksIFVMT05HIG5mZHMsIElOVCB0aW1lb3V0KSB7CisgIGZkX3NldCByZWFkX2Zkcywgd3JpdGVfZmRzOworICBmZF9zZXQqIHJlYWRfZmRzX3B0ciA9IE5VTEw7CisgIGZkX3NldCogd3JpdGVfZmRzX3B0ciA9IE5VTEw7CisKKyAgRkRfWkVSTygmcmVhZF9mZHMpOworICBGRF9aRVJPKCZ3cml0ZV9mZHMpOworCisgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAvLyBSZWFkIChpbikgc29ja2V0CisgICAgaWYgKChmZEFycmF5W2ldLmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pID09IFRIUklGVF9QT0xMSU4pIHsKKyAgICAgIHJlYWRfZmRzX3B0ciA9ICZyZWFkX2ZkczsKKyAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmcmVhZF9mZHMpOworICAgIH0KKyAgICAvLyBXcml0ZSAob3V0KSBzb2NrZXQKKyAgICBlbHNlIGlmICgoZmRBcnJheVtpXS5ldmVudHMgJiBUSFJJRlRfUE9MTE9VVCkgPT0gVEhSSUZUX1BPTExPVVQpIHsKKyAgICAgIHdyaXRlX2Zkc19wdHIgPSAmd3JpdGVfZmRzOworICAgICAgRkRfU0VUKGZkQXJyYXlbaV0uZmQsICZ3cml0ZV9mZHMpOworICAgIH0KKyAgfQorCisgIHRpbWV2YWwgdGltZV9vdXQ7CisgIHRpbWV2YWwqIHRpbWVfb3V0X3B0ciA9IE5VTEw7CisgIGlmICh0aW1lb3V0ID49IDApIHsKKyAgICB0aW1lX291dC50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKyAgICB0aW1lX291dC50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CisgICAgdGltZV9vdXRfcHRyID0gJnRpbWVfb3V0OworICB9IGVsc2UgeyAvLyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncworICAgICh2b2lkKXRpbWVfb3V0OworICAgICh2b2lkKXRpbWVvdXQ7CisgIH0KKworICBpbnQgc2t0cmVhZHkgPSBzZWxlY3QoMSwgcmVhZF9mZHNfcHRyLCB3cml0ZV9mZHNfcHRyLCBOVUxMLCB0aW1lX291dF9wdHIpOworICBpZiAoc2t0cmVhZHkgPiAwKSB7CisgICAgZm9yIChVTE9ORyBpID0gMDsgaSA8IG5mZHM7IGkrKykgeworICAgICAgZmRBcnJheVtpXS5yZXZlbnRzID0gMDsKKyAgICAgIGlmIChGRF9JU1NFVChmZEFycmF5W2ldLmZkLCAmcmVhZF9mZHMpKQorICAgICAgICBmZEFycmF5W2ldLnJldmVudHMgfD0gVEhSSUZUX1BPTExJTjsKKyAgICAgIGlmIChGRF9JU1NFVChmZEFycmF5W2ldLmZkLCAmd3JpdGVfZmRzKSkKKyAgICAgICAgZmRBcnJheVtpXS5yZXZlbnRzIHw9IFRIUklGVF9QT0xMT1VUOworICAgIH0KKyAgfQorICByZXR1cm4gc2t0cmVhZHk7Cit9CisjZWxzZSAgLy8gVmlzdGEsIFdpbjcuLi4KK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkgeworICByZXR1cm4gV1NBUG9sbChmZEFycmF5LCBuZmRzLCB0aW1lb3V0KTsKK30KKyNlbmRpZiAvLyBXSU5WRVIKKworI2lmZGVmIF9XSU4zMl9XQ0UKK3N0ZDo6c3RyaW5nIHRocmlmdF93c3RyMnN0cihzdGQ6OndzdHJpbmcgd3MpIHsKKyAgc3RkOjpzdHJpbmcgcyh3cy5iZWdpbigpLCB3cy5lbmQoKSk7CisgIHJldHVybiBzOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZiZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0ZDTlRMX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19GQ05UTF9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN0cmluZz4KKyNlbmRpZgorCisvLyBXaW4zMgorI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWYgV0lOVkVSIDw9IDB4MDUwMiAvLyBYUCwgU2VydmVyMjAwMworc3RydWN0IHRocmlmdF9wb2xsZmQgeworICBUSFJJRlRfU09DS0VUIGZkOworICBTSE9SVCBldmVudHM7CisgIFNIT1JUIHJldmVudHM7Cit9OworI2VuZGlmCisKK2V4dGVybiAiQyIgeworaW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpOworaW50IHRocmlmdF9wb2xsKFRIUklGVF9QT0xMRkQqIGZkQXJyYXksIFVMT05HIG5mZHMsIElOVCB0aW1lb3V0KTsKK30KKworI2lmZGVmIF9XSU4zMl9XQ0UKK3N0ZDo6c3RyaW5nIHRocmlmdF93c3RyMnN0cihzdGQ6OndzdHJpbmcgd3MpOworI2VuZGlmCisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfRkNOVExfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKKyNlbmRpZgorCisvLyB1c2Ugc3RkOjp0aHJlYWQgaW4gTVNWQzExICgyMDEyKSBvciBuZXdlciBhbmQgaW4gTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTcwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorI2VuZGlmCisKKy8vIFNvbWV0aGluZyB0aGF0IGRlZmluZXMgUFJJZDY0IGlzIHJlcXVpcmVkIHRvIGJ1aWxkCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8vIFZTMjAxMCBvciBsYXRlciBoYXMgc3RkaW50LmggYXMgZG9lcyBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNlbmRpZgorCisjaWZuZGVmIFRBUkdFVF9XSU5fWFAKKyNkZWZpbmUgVEFSR0VUX1dJTl9YUCAxCisjZW5kaWYKKworI2lmIFRBUkdFVF9XSU5fWFAKKyNpZm5kZWYgV0lOVkVSCisjZGVmaW5lIFdJTlZFUiAweDA1MDEKKyNlbmRpZgorI2lmbmRlZiBfV0lOMzJfV0lOTlQKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDUwMQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzJfV0lOTlQKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDYwMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KQorI2RlZmluZSBBUklUSE1FVElDX1JJR0hUX1NISUZUIDEKKyNkZWZpbmUgU0lHTkVEX1JJR0hUX1NISUZUX0lTIDEKKyNlbmRpZgorCisjaWZuZGVmIF9fTUlOR1czMl9fCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpIC8vIERlcHJlY2F0ZWQgcG9zaXggbmFtZS4KKyNlbmRpZgorCisjZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZIDEKKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLy8gTXVzdCBiZSB1c2luZyBWUzIwMTAgb3IgbGF0ZXIsIG9yIGJvb3N0LCBzbyB0aGF0IEM5OSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Ym9vc3QvY3N0ZGludC5ocHA+CisKK3R5cGVkZWYgYm9vc3Q6OmludDY0X3QgaW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ2NF90IHVpbnQ2NF90OwordHlwZWRlZiBib29zdDo6aW50MzJfdCBpbnQzMl90OwordHlwZWRlZiBib29zdDo6dWludDMyX3QgdWludDMyX3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQxNl90IGludDE2X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDhfdCBpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1dpbkZjbnRsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oPgorCisvLyB3aW5kb3dzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorI2lmbmRlZiBfX01JTkdXMzJfXworICAjaWZkZWYgX1dJTjMyX1dDRQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyLmxpYiIpCisgICNlbHNlCisgICNwcmFnbWEgY29tbWVudChsaWIsICJXczJfMzIubGliIikKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgImFkdmFwaTMyLmxpYiIpIC8vIEZvciBzZWN1cml0eSBBUElzIGluIFRQaXBlU2VydmVyCisgICNwcmFnbWEgY29tbWVudChsaWIsICJTaGx3YXBpLmxpYiIpICAvLyBGb3IgU3RyU3RySUEgaW4gVFBpcGVTZXJ2ZXIKKyAgI2VuZGlmCisjZW5kaWYgLy8gX19NSU5HVzMyX18KKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk3MTMwLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLQotdWludDMyX3QgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCB3YW50ID0gbGVuOwotICB1aW50MzJfdCBoYXZlID0gckJvdW5kXyAtIHJCYXNlXzsKLQotICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAotICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KLSAgYXNzZXJ0KGhhdmUgPCB3YW50KTsKLQotICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlLgotICBpZiAoaGF2ZSA+IDApIHsKLSAgICBtZW1jcHkoYnVmLCByQmFzZV8sIGhhdmUpOwotICAgIHdhbnQgLT0gaGF2ZTsKLSAgICBidWYgKz0gaGF2ZTsKLSAgfQotICAvLyBHZXQgbW9yZSBmcm9tIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVwIHRvIGJ1ZmZlciBzaXplLgotICAvLyBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGxvdCBvZiBzZW5zZSBpZiBsZW4gPCByQnVmU2l6ZV8KLSAgLy8gYW5kIGFsbW9zdCBubyBzZW5zZSBvdGhlcndpc2UuICBUT0RPKGRyZWlzcyk6IEZpeCB0aGF0Ci0gIC8vIGNhc2UgKHBvc3NpYmx5IGluY2x1ZGluZyBzb21lIHJlYWR2IGhvdG5lc3MpLgotICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKLQotICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KLSAgdWludDMyX3QgZ2l2ZSA9IHN0ZDo6bWluKHdhbnQsIHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKSk7Ci0gIG1lbWNweShidWYsIHJCYXNlXywgZ2l2ZSk7Ci0gIHJCYXNlXyArPSBnaXZlOwotICB3YW50IC09IGdpdmU7Ci0KLSAgcmV0dXJuIChsZW4gLSB3YW50KTsKLX0KLQotdm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBoYXZlX2J5dGVzID0gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci0gIHVpbnQzMl90IHNwYWNlID0gd0JvdW5kXyAtIHdCYXNlXzsKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IGFjY29tb2RhdGUgdGhlIHdyaXRlCi0gIC8vIHdpdGggdGhlIGZyZWUgc3BhY2UgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgotICBhc3NlcnQod0JvdW5kXyAtIHdCYXNlXyA8IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSk7Ci0KLSAgLy8gTm93IGhlcmUncyB0aGUgdHJpY2t5IHF1ZXN0aW9uOiBzaG91bGQgd2UgY29weSBkYXRhIGZyb20gYnVmIGludG8gb3VyCi0gIC8vIGludGVybmFsIGJ1ZmZlciBhbmQgd3JpdGUgaXQgZnJvbSB0aGVyZSwgb3Igc2hvdWxkIHdlIGp1c3Qgd3JpdGUgb3V0Ci0gIC8vIHRoZSBjdXJyZW50IGludGVybmFsIGJ1ZmZlciBpbiBvbmUgc3lzY2FsbCBhbmQgd3JpdGUgb3V0IGJ1ZiBpbiBhbm90aGVyLgotICAvLyBJZiBvdXIgY3VycmVudGx5IGJ1ZmZlcmVkIGRhdGEgcGx1cyBidWYgaXMgYXQgbGVhc3QgZG91YmxlIG91ciBidWZmZXIKLSAgLy8gc2l6ZSwgd2Ugd2lsbCBoYXZlIHRvIGRvIHR3byBzeXNjYWxscyBubyBtYXR0ZXIgd2hhdCAoZXhjZXB0IGluIHRoZQotICAvLyBkZWdlbmVyYXRlIGNhc2Ugd2hlbiBvdXIgYnVmZmVyIGlzIGVtcHR5KSwgc28gdGhlcmUgaXMgbm8gdXNlIGNvcHlpbmcuCi0gIC8vIE90aGVyd2lzZSwgdGhlcmUgaXMgc29ydCBvZiBhIHNsaWRpbmcgc2NhbGUuICBJZiB3ZSBoYXZlIE4tMSBieXRlcwotICAvLyBidWZmZXJlZCBhbmQgbmVlZCB0byB3cml0ZSAyLCBpdCB3b3VsZCBiZSBjcmF6eSB0byBkbyB0d28gc3lzY2FsbHMuCi0gIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBoYXZlIDIgYnl0ZXMgYnVmZmVyZWQgYW5kIGFyZSB3cml0aW5nIDJOLTMsCi0gIC8vIHdlIGNhbiBzYXZlIGEgc3lzY2FsbCBpbiB0aGUgc2hvcnQgdGVybSBieSBsb2FkaW5nIHVwIG91ciBidWZmZXIsIHdyaXRpbmcKLSAgLy8gaXQgb3V0LCBhbmQgY29weWluZyB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgaW50byBvdXIgYnVmZmVyLiAgT2YgY291cnNlLAotICAvLyBpZiB3ZSBnZXQgYW5vdGhlciAyLWJ5dGUgd3JpdGUsIHdlIGhhdmVuJ3Qgc2F2ZWQgYW55IHN5c2NhbGxzIGF0IGFsbCwKLSAgLy8gYW5kIGhhdmUganVzdCBjb3BpZWQgbmVhcmx5IDJOIGJ5dGVzIGZvciBub3RoaW5nLiAgRmluZGluZyBhIHBlcmZlY3QKLSAgLy8gcG9saWN5IHdvdWxkIHJlcXVpcmUgcHJlZGljdGluZyB0aGUgc2l6ZSBvZiBmdXR1cmUgd3JpdGVzLCBzbyB3ZSdyZSBqdXN0Ci0gIC8vIGdvaW5nIHRvIGFsd2F5cyBlc2NoZXcgc3lzY2FsbHMgaWYgd2UgaGF2ZSBsZXNzIHRoYW4gMk4gYnl0ZXMgdG8gd3JpdGUuCi0KLSAgLy8gVGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMuCi0gIC8vIFRoaXMgY2FzZSBhbHNvIGNvdmVycyB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGlzIGVtcHR5LAotICAvLyBidXQgaXQgaXMgY2xlYXJlciAoSSB0aGluaykgdG8gdGhpbmsgb2YgaXQgYXMgdHdvIHNlcGFyYXRlIGNhc2VzLgotICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMip3QnVmU2l6ZV8pIHx8IChoYXZlX2J5dGVzID09IDApKSB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiB3cml0ZXYKLSAgICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKLSAgICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKLSAgICB9Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEZpbGwgdXAgb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgYSB3cml0ZS4KLSAgbWVtY3B5KHdCYXNlXywgYnVmLCBzcGFjZSk7Ci0gIGJ1ZiArPSBzcGFjZTsKLSAgbGVuIC09IHNwYWNlOwotICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKLQotICAvLyBDb3B5IHRoZSByZXN0IGludG8gb3VyIGJ1ZmZlci4KLSAgYXNzZXJ0KGxlbiA8IHdCdWZTaXplXyk7Ci0gIG1lbWNweSh3QnVmXy5nZXQoKSwgYnVmLCBsZW4pOwotICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGxlbjsKLSAgcmV0dXJuOwotfQotCi1jb25zdCB1aW50OF90KiBUQnVmZmVyZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gIC8vIElmIHRoZSByZXF1ZXN0IGlzIGJpZ2dlciB0aGFuIG91ciBidWZmZXIsIHdlIGFyZSBob3NlZC4KLSAgaWYgKCpsZW4gPiByQnVmU2l6ZV8pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB3ZSBoYXZlIGFscmVhZHkuCi0gIHVpbnQzMl90IGhhdmUgPSByQm91bmRfIC0gckJhc2VfOwotICAvLyBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgd2UgbmVlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgaW50MzJfdCBuZWVkID0gKmxlbiAtIGhhdmU7Ci0gIC8vIFRoZSBzcGFjZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHRvIHRoZSBlbmQgb2Ygb3VyIGRhdGEuCi0gIHVpbnQzMl90IG9mZnNldCA9IHJCb3VuZF8gLSByQnVmXy5nZXQoKTsKLSAgYXNzZXJ0KG5lZWQgPiAwKTsKLQotICAvLyBJZiB3ZSBoYXZlIGxlc3MgdGhhbiBoYWxmIG91ciBidWZmZXIgc3BhY2UgYXZhaWxhYmxlLCBzaGlmdCB0aGUgZGF0YQotICAvLyB3ZSBoYXZlIGRvd24gdG8gdGhlIHN0YXJ0LiAgSWYgdGhlIGJvcnJvdyBpcyBiaWcgY29tcGFyZWQgdG8gb3VyIGJ1ZmZlciwKLSAgLy8gdGhpcyBjb3VsZCBiZSBraW5kIG9mIGEgd2FzdGUsIGJ1dCBpZiB0aGUgYm9ycm93IGlzIHNtYWxsLCBpdCBmcmVlcyB1cAotICAvLyBzcGFjZSBhdCB0aGUgZW5kIG9mIG91ciBidWZmZXIgdG8gZG8gYSBiaWdnZXIgc2luZ2xlIHJlYWQgZnJvbSB0aGUKLSAgLy8gdW5kZXJseWluZyB0cmFuc3BvcnQuICBBbHNvLCBpZiBvdXIgbmVlZHMgZXh0ZW5kIHBhc3QgdGhlIGVuZCBvZiB0aGUKLSAgLy8gYnVmZmVyLCB3ZSBoYXZlIHRvIGRvIGEgY29weSBubyBtYXR0ZXIgd2hhdC4KLSAgaWYgKChvZmZzZXQgPiByQnVmU2l6ZV8vMikgfHwgKG9mZnNldCArIG5lZWQgPiByQnVmU2l6ZV8pKSB7Ci0gICAgbWVtbW92ZShyQnVmXy5nZXQoKSwgckJhc2VfLCBoYXZlKTsKLSAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBoYXZlKTsKLSAgICBvZmZzZXQgPSBoYXZlOwotICB9Ci0KLSAgLy8gRmlyc3QgdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlci4KLSAgdWludDMyX3QgZ290ID0gdHJhbnNwb3J0Xy0+cmVhZChyQm91bmRfLCByQnVmU2l6ZV8gLSBvZmZzZXQpOwotICByQm91bmRfICs9IGdvdDsKLSAgbmVlZCAtPSBnb3Q7Ci0KLSAgLy8gSWYgdGhhdCBmYWlscywgcmVhZEFsbCB1bnRpbCB3ZSBnZXQgd2hhdCB3ZSBuZWVkLgotICBpZiAobmVlZCA+IDApIHsKLSAgICByQm91bmRfICs9IHRyYW5zcG9ydF8tPnJlYWRBbGwockJvdW5kXywgbmVlZCk7Ci0gIH0KLQotICAqbGVuID0gckJvdW5kXyAtIHJCYXNlXzsKLSAgcmV0dXJuIHJCYXNlXzsKLX0KLQotdm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OmZsdXNoKCkgIHsKLSAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KLSAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHdCYXNlXyAtIHdCdWZfLmdldCgpOwotICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKLSAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCi0gICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCk7Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVfYnl0ZXMpOwotICB9Ci0KLSAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotfQotCi0KLXVpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IHdhbnQgPSBsZW47Ci0gIHVpbnQzMl90IGhhdmUgPSByQm91bmRfIC0gckJhc2VfOwotCi0gIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSByZWFkCi0gIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgotICBhc3NlcnQoaGF2ZSA8IHdhbnQpOwotCi0gIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUuCi0gIGlmIChoYXZlID4gMCkgewotICAgIG1lbWNweShidWYsIHJCYXNlXywgaGF2ZSk7Ci0gICAgd2FudCAtPSBoYXZlOwotICAgIGJ1ZiArPSBoYXZlOwotICB9Ci0KLSAgLy8gUmVhZCBhbm90aGVyIGZyYW1lLgotICByZWFkRnJhbWUoKTsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFNob3VsZCB3ZSB3YXJuIHdoZW4gcmVhZHMgY3Jvc3MgZnJhbWVzPwotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgotICB1aW50MzJfdCBnaXZlID0gc3RkOjptaW4od2FudCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pKTsKLSAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBnaXZlKTsKLSAgckJhc2VfICs9IGdpdmU7Ci0gIHdhbnQgLT0gZ2l2ZTsKLQotICByZXR1cm4gKGxlbiAtIHdhbnQpOwotfQotCi12b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRGcmFtZSgpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCB1c2luZyByZWFkdiBoZXJlLCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAvLyByZXN1bHQgaW4gKGdhc3ApIHJlYWQtYWhlYWQuCi0KLSAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4KLSAgaW50MzJfdCBzejsKLSAgdHJhbnNwb3J0Xy0+cmVhZEFsbCgodWludDhfdCopJnN6LCBzaXplb2Yoc3opKTsKLSAgc3ogPSBudG9obChzeik7Ci0KLSAgaWYgKHN6IDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgaGFzIG5lZ2F0aXZlIHZhbHVlIik7Ci0gIH0KLQotICAvLyBSZWFkIHRoZSBmcmFtZSBwYXlsb2FkLCBhbmQgcmVzZXQgbWFya2Vycy4KLSAgaWYgKHN6ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4ockJ1ZlNpemVfKSkgewotICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7Ci0gICAgckJ1ZlNpemVfID0gc3o7Ci0gIH0KLSAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSwgc3opOwotICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7Ci19Ci0KLXZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIC8vIERvdWJsZSBidWZmZXIgc2l6ZSB1bnRpbCBzdWZmaWNpZW50LgotICB1aW50MzJfdCBoYXZlID0gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci0gIHdoaWxlICh3QnVmU2l6ZV8gPCBsZW4gKyBoYXZlKSB7Ci0gICAgd0J1ZlNpemVfICo9IDI7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1vZGlmeWluZyB0aGlzIGNsYXNzIHRvIHVzZSBtYWxsb2MvZnJlZQotICAvLyBzbyB3ZSBjYW4gdXNlIHJlYWxsb2MgaGVyZS4KLQotICAvLyBBbGxvY2F0ZSBuZXcgYnVmZmVyLgotICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXTsKLQotICAvLyBDb3B5IHRoZSBvbGQgYnVmZmVyIHRvIHRoZSBuZXcgb25lLgotICBtZW1jcHkobmV3X2J1Ziwgd0J1Zl8uZ2V0KCksIGhhdmUpOwotCi0gIC8vIE5vdyBwb2ludCBidWYgdG8gdGhlIG5ldyBvbmUuCi0gIHdCdWZfLnJlc2V0KG5ld19idWYpOwotICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGhhdmU7Ci0gIHdCb3VuZF8gPSB3QnVmXy5nZXQoKSArIHdCdWZTaXplXzsKLQotICAvLyBDb3B5IHRoZSBkYXRhIGludG8gdGhlIG5ldyBidWZmZXIuCi0gIG1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKLSAgd0Jhc2VfICs9IGxlbjsKLX0KLQotdm9pZCBURnJhbWVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIGludDMyX3Qgc3pfaGJvLCBzel9uYm87Ci0gIGFzc2VydCh3QnVmU2l6ZV8gPiBzaXplb2Yoc3pfbmJvKSk7Ci0KLSAgLy8gU2xpcCB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgotICBzel9oYm8gPSB3QmFzZV8gLSAod0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKSk7Ci0gIHN6X25ibyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkoc3pfaGJvKSk7Ci0gIG1lbWNweSh3QnVmXy5nZXQoKSwgKHVpbnQ4X3QqKSZzel9uYm8sIHNpemVvZihzel9uYm8pKTsKLQotICBpZiAoc3pfaGJvID4gMCkgewotICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gKHdpdGggYSBwYWQgZm9yIHRoZSBmcmFtZSBzaXplKQotICAgIC8vIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUKLSAgICAvLyAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkgaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzCi0gICAgLy8gdXAgYW4gZXhjZXB0aW9uCi0gICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKLQotICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCi0gICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHNpemVvZihzel9uYm8pK3N6X2hibyk7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFRGcmFtZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgotICAvLyBJZiB0aGUgZmFzdCBwYXRoIGZhaWxlZCBsZXQgdGhlIHByb3RvY29sIHVzZSBpdHMgc2xvdyBwYXRoLgotICAvLyBCZXNpZGVzLCB3aG8gaXMgZ29pbmcgdG8gdHJ5IHRvIGJvcnJvdyBhY3Jvc3MgbWVzc2FnZXM/Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6Y29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpIHsKLSAgLy8gQ29ycmVjdCByQm91bmRfIHNvIHdlIGNhbiB1c2UgdGhlIGZhc3QgcGF0aCBpbiB0aGUgZnV0dXJlLgotICByQm91bmRfID0gd0Jhc2VfOwotCi0gIC8vIERlY2lkZSBob3cgbXVjaCB0byBnaXZlLgotICB1aW50MzJfdCBnaXZlID0gc3RkOjptaW4obGVuLCBhdmFpbGFibGVfcmVhZCgpKTsKLQotICAqb3V0X3N0YXJ0ID0gckJhc2VfOwotICAqb3V0X2dpdmUgPSBnaXZlOwotCi0gIC8vIFByZWluY3JlbWVudCByQmFzZV8gc28gdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8uCi0gIHJCYXNlXyArPSBnaXZlOwotfQotCi11aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50OF90KiBzdGFydDsKLSAgdWludDMyX3QgZ2l2ZTsKLSAgY29tcHV0ZVJlYWQobGVuLCAmc3RhcnQsICZnaXZlKTsKLQotICAvLyBDb3B5IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KLSAgbWVtY3B5KGJ1Ziwgc3RhcnQsIGdpdmUpOwotCi0gIHJldHVybiBnaXZlOwotfQotCi11aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKSB7Ci0gIC8vIERvbid0IGdldCBzb21lIHN0dXBpZCBhc3NlcnRpb24gZmFpbHVyZS4KLSAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDhfdCogc3RhcnQ7Ci0gIHVpbnQzMl90IGdpdmU7Ci0gIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7Ci0KLSAgLy8gQXBwZW5kIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcuCi0gIHN0ci5hcHBlbmQoKGNoYXIqKXN0YXJ0LCBnaXZlKTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotdm9pZCBUTWVtb3J5QnVmZmVyOjplbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pIHsKLSAgLy8gQ2hlY2sgYXZhaWxhYmxlIHNwYWNlCi0gIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7Ci0gIGlmIChsZW4gPD0gYXZhaWwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIW93bmVyXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkluc3VmZmljaWVudCBzcGFjZSBpbiBleHRlcm5hbCBNZW1vcnlCdWZmZXIiKTsKLSAgfQotCi0gIC8vIEdyb3cgdGhlIGJ1ZmZlciBhcyBuZWNlc3NhcnkuCi0gIHdoaWxlIChsZW4gPiBhdmFpbCkgewotICAgIGJ1ZmZlclNpemVfICo9IDI7Ci0gICAgd0JvdW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJTaXplXzsKLSAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgaW50byBhIG5ldyBwb2ludGVyIHNvIHdlIGRvbid0IGJvcmsgb3VycyBpZiBpdCBmYWlscy4KLSAgdm9pZCogbmV3X2J1ZmZlciA9IHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBidWZmZXJTaXplXyk7Ci0gIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5LiIpOwotICB9Ci0KLSAgcHRyZGlmZl90IG9mZnNldCA9ICh1aW50OF90KiluZXdfYnVmZmVyIC0gYnVmZmVyXzsKLSAgYnVmZmVyXyArPSBvZmZzZXQ7Ci0gIHJCYXNlXyArPSBvZmZzZXQ7Ci0gIHJCb3VuZF8gKz0gb2Zmc2V0OwotICB3QmFzZV8gKz0gb2Zmc2V0OwotICB3Qm91bmRfICs9IG9mZnNldDsKLX0KLQotdm9pZCBUTWVtb3J5QnVmZmVyOjp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKLQotICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlciBhbmQgaW5jcmVtZW50IHdCYXNlXy4KLSAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOwotICB3QmFzZV8gKz0gbGVuOwotfQotCi12b2lkIFRNZW1vcnlCdWZmZXI6Ondyb3RlQnl0ZXModWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7Ci0gIGlmIChsZW4gPiBhdmFpbCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNsaWVudCB3cm90ZSBtb3JlIGJ5dGVzIHRoYW4gc2l6ZSBvZiBidWZmZXIuIik7Ci0gIH0KLSAgd0Jhc2VfICs9IGxlbjsKLX0KLQotY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgckJvdW5kXyA9IHdCYXNlXzsKLSAgaWYgKGF2YWlsYWJsZV9yZWFkKCkgPj0gKmxlbikgewotICAgICpsZW4gPSBhdmFpbGFibGVfcmVhZCgpOwotICAgIHJldHVybiByQmFzZV87Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4MjA1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXyAxCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgImJvb3N0L3Njb3BlZF9hcnJheS5ocHAiCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVERCX0xJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAxKSkKLSNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVERCX0xJS0VMWSh2YWwpICh2YWwpCi0jZGVmaW5lIFREQl9VTkxJS0VMWSh2YWwpICh2YWwpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFuc3BvcnRzIHRoYXQgdXNlIHJlYWQvd3JpdGUgYnVmZmVycyBmb3IgcGVyZm9ybWFuY2UuCi0gKgotICogVEJ1ZmZlckJhc2UgaXMgZGVzaWduZWQgdG8gaW1wbGVtZW50IHRoZSBmYXN0LXBhdGggIm1lbWNweSIgc3R5bGUKLSAqIG9wZXJhdGlvbnMgdGhhdCB3b3JrIGluIHRoZSBjb21tb24gY2FzZS4gIEl0IGRvZXMgc28gd2l0aCBzbWFsbCBhbmQKLSAqIChldmVudHVhbGx5KSBub252aXJ0dWFsLCBpbmxpbmFibGUgbWV0aG9kcy4gIFRCdWZmZXJCYXNlIGlzIGFuIGFic3RyYWN0Ci0gKiBjbGFzcy4gIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIGRlZmluZSB0aGUgInNsb3cgcGF0aCIgb3BlcmF0aW9ucwotICogdGhhdCBoYXZlIHRvIGJlIGRvbmUgd2hlbiB0aGUgYnVmZmVycyBhcmUgZnVsbCBvciBlbXB0eS4KLSAqCi0gKi8KLWNsYXNzIFRCdWZmZXJCYXNlIDogcHVibGljIFRUcmFuc3BvcnQgewotCi0gcHVibGljOgotCi0gIC8qKgotICAgKiBGYXN0LXBhdGggcmVhZC4KLSAgICoKLSAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBkYXRhIGJ1ZmZlcmVkIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIHdlIGNhbiBzYXRpc2Z5IGl0Ci0gICAqIHdpdGggYSBzaW5nbGUgbWVtY3B5LCB0aGVuIGFkanVzdCBvdXIgaW50ZXJuYWwgcG9pbnRlcnMuICBJZiB0aGUgYnVmZmVyCi0gICAqIGlzIGVtcHR5LCB3ZSBjYWxsIG91dCB0byBvdXIgc2xvdyBwYXRoLCBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgotICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kIGlubGluYWJsZS4KLSAgICovCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB1aW50OF90KiBuZXdfckJhc2UgPSByQmFzZV8gKyBsZW47Ci0gICAgaWYgKFREQl9MSUtFTFkobmV3X3JCYXNlIDw9IHJCb3VuZF8pKSB7Ci0gICAgICBzdGQ6Om1lbWNweShidWYsIHJCYXNlXywgbGVuKTsKLSAgICAgIHJCYXNlXyA9IG5ld19yQmFzZTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICAgIHJldHVybiByZWFkU2xvdyhidWYsIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogRmFzdC1wYXRoIHdyaXRlLgotICAgKgotICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21vZGF0ZSB0aGUgd3JpdGUsIHdlCi0gICAqIGNhbiBzYXRpc2Z5IGl0IHdpdGggYSBzaW5nbGUgbWVtY3B5LCB0aGVuIGFkanVzdCBvdXIgaW50ZXJuYWwgcG9pbnRlcnMuCi0gICAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYQotICAgKiBzdWJjbGFzcy4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGV2ZW50dWFsbHkgYmUgbm9udmlydHVhbCBhbmQKLSAgICogaW5saW5hYmxlLgotICAgKi8KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHVpbnQ4X3QqIG5ld193QmFzZSA9IHdCYXNlXyArIGxlbjsKLSAgICBpZiAoVERCX0xJS0VMWShuZXdfd0Jhc2UgPD0gd0JvdW5kXykpIHsKLSAgICAgIHN0ZDo6bWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOwotICAgICAgd0Jhc2VfID0gbmV3X3dCYXNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3cml0ZVNsb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIEZhc3QtcGF0aCBib3Jyb3cuICBBIGxvdCBsaWtlIHRoZSBmYXN0LXBhdGggcmVhZC4KLSAgICovCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KCpsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7Ci0gICAgICAvLyBXaXRoIHN0cmljdCBhbGlhc2luZywgd3JpdGluZyB0byBsZW4gc2hvdWxkbid0IGZvcmNlIHVzIHRvCi0gICAgICAvLyByZWZldGNoIHJCYXNlXyBmcm9tIG1lbW9yeS4gIFRPRE8oZHJlaXNzKTogVmVyaWZ5IHRoaXMuCi0gICAgICAqbGVuID0gckJvdW5kXyAtIHJCYXNlXzsKLSAgICAgIHJldHVybiByQmFzZV87Ci0gICAgfQotICAgIHJldHVybiBib3Jyb3dTbG93KGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdW1lIGRvZXNuJ3QgcmVxdWlyZSBhIHNsb3cgcGF0aC4KLSAgICovCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKLSAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikgPD0gckJvdW5kXyAtIHJCYXNlXykpIHsKLSAgICAgIHJCYXNlXyArPSBsZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOwotICAgIH0KLSAgfQotCi0KLSBwcm90ZWN0ZWQ6Ci0KLSAgLy8vIFNsb3cgcGF0aCByZWFkLgotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7Ci0KLSAgLy8vIFNsb3cgcGF0aCB3cml0ZS4KLSAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwotCi0gIC8qKgotICAgKiBTbG93IHBhdGggYm9ycm93LgotICAgKgotICAgKiBQT1NUQ09ORElUSU9OOiByZXR1cm4gPT0gTlVMTCB8fCByQm91bmRfIC0gckJhc2VfID49ICpsZW4KLSAgICovCi0gIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pID0gMDsKLQotICAvKioKLSAgICogVHJpdmlhbCBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogSW5pdGlhbGl6ZSBwb2ludGVycyBzYWZlbHkuICBDb25zdHJ1Y3RpbmcgaXMgbm90IGEgdmVyeQotICAgKiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgb3BlcmF0aW9uLCBzbyBpdCBpcyBva2F5IHRvIGp1c3QgbGVhdmUgaXQgdG8KLSAgICogdGhlIGNvbmNyZXRlIGNsYXNzIHRvIHNldCB1cCBwb2ludGVycyBjb3JyZWN0bHkuCi0gICAqLwotICBUQnVmZmVyQmFzZSgpCi0gICAgOiByQmFzZV8oTlVMTCkKLSAgICAsIHJCb3VuZF8oTlVMTCkKLSAgICAsIHdCYXNlXyhOVUxMKQotICAgICwgd0JvdW5kXyhOVUxMKQotICB7fQotCi0gIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSByZWFkIGJ1ZmZlci4KLSAgdm9pZCBzZXRSZWFkQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgckJhc2VfID0gYnVmOwotICAgIHJCb3VuZF8gPSBidWYrbGVuOwotICB9Ci0KLSAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHdyaXRlIGJ1ZmZlci4KLSAgdm9pZCBzZXRXcml0ZUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHdCYXNlXyA9IGJ1ZjsKLSAgICB3Qm91bmRfID0gYnVmK2xlbjsKLSAgfQotCi0gIHZpcnR1YWwgflRCdWZmZXJCYXNlKCkge30KLQotICAvLy8gUmVhZHMgYmVnaW4gaGVyZS4KLSAgdWludDhfdCogckJhc2VfOwotICAvLy8gUmVhZHMgbWF5IGV4dGVuZCB0byBqdXN0IGJlZm9yZSBoZXJlLgotICB1aW50OF90KiByQm91bmRfOwotCi0gIC8vLyBXcml0ZXMgYmVnaW4gaGVyZS4KLSAgdWludDhfdCogd0Jhc2VfOwotICAvLy8gV3JpdGVzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KLSAgdWludDhfdCogd0JvdW5kXzsKLX07Ci0KLQotLyoqIAotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRyYW5zcG9ydCB3aGljaCB3cmFwcyB0cmFuc3BvcnQgdG8gbmV3IG9uZS4KLSAqLwotY2xhc3MgVFVuZGVybHlpbmdUcmFuc3BvcnQgOiBwdWJsaWMgVEJ1ZmZlckJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwotCi0gIHZpcnR1YWwgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiAockJhc2VfIDwgckJvdW5kXykgfHwgdHJhbnNwb3J0Xy0+cGVlaygpOwotICB9Ci0KLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgZmx1c2goKTsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0XzsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotCi0gIHVpbnQzMl90IHJCdWZTaXplXzsKLSAgdWludDMyX3Qgd0J1ZlNpemVfOwotICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHJCdWZfOwotICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHdCdWZfOwotCi0gIFRVbmRlcmx5aW5nVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhzeikKLSAgICAsIHdCdWZTaXplXyhzeikKLSAgICAsIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7fQotCi0gIFRVbmRlcmx5aW5nVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSkKLSAgICAsIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7fQotCi0gIFRVbmRlcmx5aW5nVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhyc3opCi0gICAgLCB3QnVmU2l6ZV8od3N6KQotICAgICwgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHt9Ci19OwotCi0vKioKLSAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gRm9yIHJlYWRzIGl0IHdpbGwgcmVhZCBtb3JlIGRhdGEgdGhhbiBpcyByZXF1ZXN0ZWQKLSAqIGFuZCB3aWxsIHNlcnZlIGZ1dHVyZSBkYXRhIG91dCBvZiBhIGxvY2FsIGJ1ZmZlci4gRm9yIHdyaXRlcywgZGF0YSBpcwotICogc3RvcmVkIHRvIGFuIGluIG1lbW9yeSBidWZmZXIgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gb3V0LgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRVbmRlcmx5aW5nVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0KLSAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IFRVbmRlcmx5aW5nVHJhbnNwb3J0KHRyYW5zcG9ydCkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgLy8vIFVzZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKLSAgICA6IFRVbmRlcmx5aW5nVHJhbnNwb3J0KHRyYW5zcG9ydCwgc3opCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCi0gICAgOiBUVW5kZXJseWluZ1RyYW5zcG9ydCh0cmFuc3BvcnQsIHJzeiwgd3N6KQotICB7Ci0gICAgaW5pdFBvaW50ZXJzKCk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICAvKiBzaGlnaW46IHNlZSBUSFJJRlQtOTYgZGlzY3Vzc2lvbiAqLwotICAgIGlmIChyQmFzZV8gPT0gckJvdW5kXykgewotICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7Ci0gICAgfQotICAgIHJldHVybiAockJvdW5kXyA+IHJCYXNlXyk7Ci0gIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0KLSAgLyoqCi0gICAqIFRoZSBmb2xsb3dpbmcgYmVoYXZpb3IgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGJ5IFRCdWZmZXJlZFRyYW5zcG9ydCwKLSAgICogYnV0IHRoYXQgbWF5IGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgotICAgKiAxLyBJZiBsZW4gaXMgYXQgbW9zdCByQnVmU2l6ZV8sIGJvcnJvdyB3aWxsIG5ldmVyIHJldHVybiBOVUxMLgotICAgKiAgICBEZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBpdCBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICogICAgb3IgaGFuZyBmb3JldmVyLgotICAgKiAyLyBTb21lIGJvcnJvdyByZXF1ZXN0cyBtYXkgY29weSBieXRlcyBpbnRlcm5hbGx5LiAgSG93ZXZlciwKLSAgICogICAgaWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLzIsIG5vbmUgb2YgdGhlIGNvcGllZCBieXRlcwotICAgKiAgICB3aWxsIGV2ZXIgaGF2ZSB0byBiZSBjb3BpZWQgYWdhaW4uICBGb3Igb3B0aW1pYWwgcGVyZm9ybWFuY2UsCi0gICAqICAgIHN0YXkgdW5kZXIgdGhpcyBsaW1pdC4KLSAgICovCi0gIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIGluaXRQb2ludGVycygpIHsKLSAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKLSAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKLSAgICAvLyBXcml0ZSBzaXplIG5ldmVyIGNoYW5nZXMuCi0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOwotICB9Ci0KLX07Ci0KLQotLyoqCi0gKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcwotICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKLSAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCi0gKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KLSAqCi0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFVuZGVybHlpbmdUcmFuc3BvcnQgewotIHB1YmxpYzoKLQotICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IFRVbmRlcmx5aW5nVHJhbnNwb3J0KHRyYW5zcG9ydCkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogVFVuZGVybHlpbmdUcmFuc3BvcnQodHJhbnNwb3J0LCBzeikKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdmlydHVhbCB2b2lkIGZsdXNoKCk7Ci0KLSAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICovCi0gIHZvaWQgcmVhZEZyYW1lKCk7Ci0KLSAgdm9pZCBpbml0UG9pbnRlcnMoKSB7Ci0gICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKLSAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKLQotICAgIC8vIFBhZCB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbnNlcnQgdGhlIHNpemUgbGF0ZXIuCi0gICAgaW50MzJfdCBwYWQgPSAwOwotICAgIHRoaXMtPndyaXRlKCh1aW50OF90KikmcGFkLCBzaXplb2YocGFkKSk7Ci0gIH0KLX07Ci0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCi0gKgotICovCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKLSAgfQotCi19OwotCi0KLS8qKgotICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgotICogaW4gbWVtb3J5IGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5IHBsYWNlZAotICogaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdCBidWZmZXIuCi0gKgotICogVGhlIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB1c2luZyBDIGNvbnN0cnVjdHMgbWFsbG9jLHJlYWxsb2MsIGFuZCB0aGUgc2l6ZQotICogZG91YmxlcyBhcyBuZWNlc3NhcnkuICBXZSd2ZSBjb25zaWRlcmVkIHVzaW5nIHNjb3BlZAotICoKLSAqLwotY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IHB1YmxpYyBUQnVmZmVyQmFzZSB7Ci0gcHJpdmF0ZToKLQotICAvLyBDb21tb24gaW5pdGlhbGl6YXRpb24gZG9uZSBieSBhbGwgY29uc3RydWN0b3JzLgotICB2b2lkIGluaXRDb21tb24odWludDhfdCogYnVmLCB1aW50MzJfdCBzaXplLCBib29sIG93bmVyLCB1aW50MzJfdCB3UG9zKSB7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHNpemUgIT0gMCkgewotICAgICAgYXNzZXJ0KG93bmVyKTsKLSAgICAgIGJ1ZiA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYnVmZmVyXyA9IGJ1ZjsKLSAgICBidWZmZXJTaXplXyA9IHNpemU7Ci0KLSAgICByQmFzZV8gPSBidWZmZXJfOwotICAgIHJCb3VuZF8gPSBidWZmZXJfICsgd1BvczsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEludmVzdGlnYXRlIE5VTEwtaW5nIHRoaXMgaWYgIW93bmVyLgotICAgIHdCYXNlXyA9IGJ1ZmZlcl8gKyB3UG9zOwotICAgIHdCb3VuZF8gPSBidWZmZXJfICsgYnVmZmVyU2l6ZV87Ci0KLSAgICBvd25lcl8gPSBvd25lcjsKLQotICAgIC8vIHJCb3VuZF8gaXMgcmVhbGx5IGFuIGFydGlmYWN0LiAgSW4gcHJpbmNpcGxlLCBpdCBzaG91bGQgYWx3YXlzIGJlCi0gICAgLy8gZXF1YWwgdG8gd0Jhc2VfLiAgV2UgdXBkYXRlIGl0IGluIGEgZmV3IHBsYWNlcyAoY29tcHV0ZVJlYWQsIGV0Yy4pLgotICB9Ci0KLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBkZWZhdWx0U2l6ZSA9IDEwMjQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZW51bSBzcGVjaWZpZXMgaG93IGEgVE1lbW9yeUJ1ZmZlciBzaG91bGQgdHJlYXQKLSAgICogbWVtb3J5IHBhc3NlZCB0byBpdCB2aWEgY29uc3RydWN0b3JzIG9yIHJlc2V0QnVmZmVyLgotICAgKgotICAgKiBPQlNFUlZFOgotICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBzaW1wbHkgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkuCi0gICAqICAgSXQgaXMgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIHBvaW50ZXIKLSAgICogICByZW1haW5zIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIFRNZW1vcnlCdWZmZXIsCi0gICAqICAgYW5kIHRoYXQgaXQgaXMgcHJvcGVybHkgY2xlYW5lZCB1cC4KLSAgICogICBOb3RlIHRoYXQgbm8gZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBvYnNlcnZlZCBidWZmZXJzLgotICAgKgotICAgKiBDT1BZOgotICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBtYWtlIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGJ1ZmZlci4KLSAgICogICBUaGUgY2FsbGVyIGhhcyBubyByZXNwb25zaWJpbGl0aWVzLgotICAgKgotICAgKiBUQUtFX09XTkVSU0hJUDoKLSAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgYmVjb21lIHRoZSAib3duZXIiIG9mIHRoZSBidWZmZXIsCi0gICAqICAgYW5kIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCi0gICAqICAgVGhlIG1lbWJvcnkgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggbWFsbG9jLgotICAgKi8KLSAgZW51bSBNZW1vcnlQb2xpY3kKLSAgeyBPQlNFUlZFID0gMQotICAsIENPUFkgPSAyCi0gICwgVEFLRV9PV05FUlNISVAgPSAzCi0gIH07Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGRlZmF1bHQtc2l6ZWQgYnVmZmVyLAotICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCi0gICAqLwotICBUTWVtb3J5QnVmZmVyKCkgewotICAgIGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGJ1ZmZlciBvZiBhIHNwZWNpZmllZCBzaXplLAotICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBzeiAgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcih1aW50MzJfdCBzeikgewotICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBidWYgYXMgaXRzIGluaXRpYWwgY29udGVudHMuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgICAgVGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KLSAgICogICAgICAgICAgICAgICBOb3RlIHRoYXQsIHdoaWxlIGJ1ZiBpcyBhIG5vbi1jb25zdCBwb2ludGVyLAotICAgKiAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIgd2lsbCBub3Qgd3JpdGUgdG8gaXQgaWYgcG9saWN5ID09IE9CU0VSVkUsCi0gICAqICAgICAgICAgICAgICAgc28gaXQgaXMgc2FmZSB0byBjb25zdF9jYXN0PHVpbnQ4X3QqPih3aGF0ZXZlcikuCi0gICAqIEBwYXJhbSBzeiAgICAgVGhlIHNpemUgb2YgQGMgYnVmLgotICAgKiBAcGFyYW0gcG9saWN5IFNlZSBAbGluayBNZW1vcnlQb2xpY3kgQGVuZGxpbmsgLgotICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgewotICAgIGlmIChidWYgPT0gTlVMTCAmJiBzeiAhPSAwKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE1lbW9yeUJ1ZmZlciBnaXZlbiBudWxsIGJ1ZmZlciB3aXRoIG5vbi16ZXJvIHNpemUuIik7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICAgIGNhc2UgT0JTRVJWRToKLSAgICAgIGNhc2UgVEFLRV9PV05FUlNISVA6Ci0gICAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT1BZOgotICAgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKLSAgICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBNZW1vcnlQb2xpY3kgZm9yIFRNZW1vcnlCdWZmZXIiKTsKLSAgICB9Ci0gIH0KLQotICB+VE1lbW9yeUJ1ZmZlcigpIHsKLSAgICBpZiAob3duZXJfKSB7Ci0gICAgICBzdGQ6OmZyZWUoYnVmZmVyXyk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIChyQmFzZV8gPCB3QmFzZV8pOwotICB9Ci0KLSAgdm9pZCBvcGVuKCkge30KLQotICB2b2lkIGNsb3NlKCkge30KLQotICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgYnVmUHRyIGNvbnN0LgotICB2b2lkIGdldEJ1ZmZlcih1aW50OF90KiogYnVmUHRyLCB1aW50MzJfdCogc3opIHsKLSAgICAqYnVmUHRyID0gckJhc2VfOwotICAgICpzeiA9IHdCYXNlXyAtIHJCYXNlXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldEJ1ZmZlckFzU3RyaW5nKCkgewotICAgIGlmIChidWZmZXJfID09IE5VTEwpIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgdWludDhfdCogYnVmOwotICAgIHVpbnQzMl90IHN6OwotICAgIGdldEJ1ZmZlcigmYnVmLCAmc3opOwotICAgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSlzeik7Ci0gIH0KLQotICB2b2lkIGFwcGVuZEJ1ZmZlclRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQ4X3QqIGJ1ZjsKLSAgICB1aW50MzJfdCBzejsKLSAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKLSAgICBzdHIuYXBwZW5kKChjaGFyKilidWYsIHN6KTsKLSAgfQotCi0gIHZvaWQgcmVzZXRCdWZmZXIoYm9vbCByZXNldF9jYXBhY2l0eSA9IGZhbHNlKSB7Ci0gICAgaWYgKHJlc2V0X2NhcGFjaXR5KQotICAgIHsKLSAgICAgIGFzc2VydChvd25lcl8pOwotCi0gICAgICB2b2lkKiBuZXdfYnVmZmVyID0gc3RkOjpyZWFsbG9jKGJ1ZmZlcl8sIGRlZmF1bHRTaXplKTsKLQotICAgICAgaWYgKG5ld19idWZmZXIgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5LiIpOwotICAgICAgfQotCi0gICAgICBidWZmZXJfID0gKHVpbnQ4X3QqKSBuZXdfYnVmZmVyOwotICAgICAgYnVmZmVyU2l6ZV8gPSBkZWZhdWx0U2l6ZTsKLQotICAgICAgd0JvdW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJTaXplXzsKLSAgICB9Ci0KLSAgICByQmFzZV8gPSBidWZmZXJfOwotICAgIHJCb3VuZF8gPSBidWZmZXJfOwotICAgIHdCYXNlXyA9IGJ1ZmZlcl87Ci0gICAgLy8gSXQgaXNuJ3Qgc2FmZSB0byB3cml0ZSBpbnRvIGEgYnVmZmVyIHdlIGRvbid0IG93bi4KLSAgICBpZiAoIW93bmVyXykgewotICAgICAgd0JvdW5kXyA9IHdCYXNlXzsKLSAgICAgIGJ1ZmZlclNpemVfID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLy8gU2VlIGNvbnN0cnVjdG9yIGRvY3VtZW50YXRpb24uCi0gIHZvaWQgcmVzZXRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKLSAgICAvLyBVc2UgYSB2YXJpYW50IG9mIHRoZSBjb3B5LWFuZC1zd2FwIHRyaWNrIGZvciBhc3NpZ25tZW50IG9wZXJhdG9ycy4KLSAgICAvLyBUaGlzIGlzIHN1Yi1vcHRpbWFsIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlIGZvciB0d28gcmVhc29uczoKLSAgICAvLyAgIDEvIFRoZSBjb25zdHJ1Y3RpbmcgYW5kIHN3YXBwaW5nIG9mIHRoZSAoc21hbGwpIHZhbHVlcwotICAgIC8vICAgICAgaW4gdGhlIHRlbXBvcmFyeSBvYmplY3QgdGFrZXMgc29tZSB0aW1lLCBhbmQgaXMgbm90IG5lY2Vzc2FyeS4KLSAgICAvLyAgIDIvIElmIHBvbGljeSA9PSBDT1BZLCB3ZSBhbGxvY2F0ZSB0aGUgbmV3IGJ1ZmZlciBiZWZvcmUKLSAgICAvLyAgICAgIGZyZWVpbmcgdGhlIG9sZCBvbmUsIHByZWNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mCi0gICAgLy8gICAgICByZXVzaW5nIHRoYXQgbWVtb3J5LgotICAgIC8vIEkgZG91YnQgdGhhdCBlaXRoZXIgb2YgdGhlc2UgcHJvYmxlbXMgY291bGQgYmUgb3B0aW1pemVkIGF3YXksCi0gICAgLy8gYnV0IHRoZSBzZWNvbmQgaXMgcHJvYmFibHkgbm8gYSBjb21tb24gY2FzZSwgYW5kIHRoZSBmaXJzdCBpcyBtaW5vci4KLSAgICAvLyBJIGRvbid0IGV4cGVjdCByZXNldEJ1ZmZlciB0byBiZSBhIGNvbW1vbiBvcGVyYXRpb24sIHNvIEknbSB3aWxsaW5nIHRvCi0gICAgLy8gYml0ZSB0aGUgcGVyZm9ybWFuY2UgYnVsbGV0IHRvIG1ha2UgdGhlIG1ldGhvZCB0aGlzIHNpbXBsZS4KLQotICAgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGJ1ZmZlci4KLSAgICBUTWVtb3J5QnVmZmVyIG5ld19idWZmZXIoYnVmLCBzeiwgcG9saWN5KTsKLSAgICAvLyBNb3ZlIGl0IGludG8gb3Vyc2VsZi4KLSAgICB0aGlzLT5zd2FwKG5ld19idWZmZXIpOwotICAgIC8vIE91ciBvbGQgc2VsZiBnZXRzIGRlc3Ryb3llZC4KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlYWRBc1N0cmluZyh1aW50MzJfdCBsZW4pIHsKLSAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgKHZvaWQpcmVhZEFwcGVuZFRvU3RyaW5nKHN0ciwgbGVuKTsKLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCByZWFkRW5kKCkgewotICAgIGlmIChyQmFzZV8gPT0gd0Jhc2VfKSB7Ci0gICAgICByZXNldEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIHVpbnQzMl90IGF2YWlsYWJsZV9yZWFkKCkgY29uc3QgewotICAgIC8vIFJlbWVtYmVyLCB3QmFzZV8gaXMgdGhlIHJlYWwgckJvdW5kXy4KLSAgICByZXR1cm4gd0Jhc2VfIC0gckJhc2VfOwotICB9Ci0KLSAgdWludDMyX3QgYXZhaWxhYmxlX3dyaXRlKCkgY29uc3QgewotICAgIHJldHVybiB3Qm91bmRfIC0gd0Jhc2VfOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNsaWVudCBjYW4gd3JpdGUgZGF0YSB0byBhcHBlbmQgdG8KLSAgLy8gdGhlIFRNZW1vcnlCdWZmZXIsIGFuZCBlbnN1cmVzIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBhY2NvbW9kYXRlIGEKLSAgLy8gd3JpdGUgb2YgdGhlIHByb3ZpZGVkIGxlbmd0aC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCBmb3IKLSAgLy8gcGFzc2luZyB0byByZWFkKCksIHJlY3YoKSwgb3Igc2ltaWxhci4gWW91IG11c3QgY2FsbCB3cm90ZUJ5dGVzKCkgYXMgc29vbgotICAvLyBhcyBkYXRhIGlzIHdyaXR0ZW4gb3IgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBhd2FyZSB0aGF0IGRhdGEgaGFzIGNoYW5nZWQuCi0gIHVpbnQ4X3QqIGdldFdyaXRlUHRyKHVpbnQzMl90IGxlbikgewotICAgIGVuc3VyZUNhbldyaXRlKGxlbik7Ci0gICAgcmV0dXJuIHdCYXNlXzsKLSAgfQotCi0gIC8vIEluZm9ybXMgdGhlIGJ1ZmZlciB0aGF0IHRoZSBjbGllbnQgaGFzIHdyaXR0ZW4gJ2xlbicgYnl0ZXMgaW50byBzdG9yYWdlCi0gIC8vIHRoYXQgaGFkIGJlZW4gcHJvdmlkZWQgYnkgZ2V0V3JpdGVQdHIoKS4KLSAgdm9pZCB3cm90ZUJ5dGVzKHVpbnQzMl90IGxlbik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgc3dhcChUTWVtb3J5QnVmZmVyJiB0aGF0KSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoYnVmZmVyXywgICAgIHRoYXQuYnVmZmVyXyk7Ci0gICAgc3dhcChidWZmZXJTaXplXywgdGhhdC5idWZmZXJTaXplXyk7Ci0KLSAgICBzd2FwKHJCYXNlXywgICAgICB0aGF0LnJCYXNlXyk7Ci0gICAgc3dhcChyQm91bmRfLCAgICAgdGhhdC5yQm91bmRfKTsKLSAgICBzd2FwKHdCYXNlXywgICAgICB0aGF0LndCYXNlXyk7Ci0gICAgc3dhcCh3Qm91bmRfLCAgICAgdGhhdC53Qm91bmRfKTsKLQotICAgIHN3YXAob3duZXJfLCAgICAgIHRoYXQub3duZXJfKTsKLSAgfQotCi0gIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIGF0IGxlYXN0ICdsZW4nIGJ5dGVzIGF2YWlsYWJsZSBmb3Igd3JpdGluZy4KLSAgdm9pZCBlbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pOwotCi0gIC8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIGFuZCBhdmFpbGFibGUgZGF0YSBmb3IgcmVhZGluZy4KLSAgdm9pZCBjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7Ci0KLSAgLy8gRGF0YSBidWZmZXIKLSAgdWludDhfdCogYnVmZmVyXzsKLQotICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKLSAgdWludDMyX3QgYnVmZmVyU2l6ZV87Ci0KLSAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/Ci0gIGJvb2wgb3duZXJfOwotCi0gIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCi0gIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0MmY4Yi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdm9pZCBURkRUcmFuc3BvcnQ6OmNsb3NlKCkgewotICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IHJ2ID0gOjpjbG9zZShmZF8pOwotICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICBmZF8gPSAtMTsKLSAgLy8gSGF2ZSB0byBjaGVjayB1bmNhdWdodF9leGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgaWYgKHJ2IDwgMCAmJiAhc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OmNsb3NlKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdWludDMyX3QgVEZEVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHNzaXplX3QgcnYgPSA6OnJlYWQoZmRfLCBidWYsIGxlbik7Ci0gIGlmIChydiA8IDApIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OnJlYWQoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKLSAgfQotICByZXR1cm4gcnY7Ci19Ci0KLXZvaWQgVEZEVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB3aGlsZSAobGVuID4gMCkgewotICAgIHNzaXplX3QgcnYgPSA6OndyaXRlKGZkXywgYnVmLCBsZW4pOwotCi0gICAgaWYgKHJ2IDwgMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICAgIH0gZWxzZSBpZiAocnYgPT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIpOwotICAgIH0KLQotICAgIGJ1ZiArPSBydjsKLSAgICBsZW4gLT0gcnY7Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhNWQ4Mi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlIGRlc2NyaXB0b3IuCi0gKgotICovCi1jbGFzcyBURkRUcmFuc3BvcnQgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBlbnVtIENsb3NlUG9saWN5Ci0gIHsgTk9fQ0xPU0VfT05fREVTVFJPWSA9IDAKLSAgLCBDTE9TRV9PTl9ERVNUUk9ZID0gMQotICB9OwotCi0gIFRGRFRyYW5zcG9ydChpbnQgZmQsIENsb3NlUG9saWN5IGNsb3NlX3BvbGljeSA9IE5PX0NMT1NFX09OX0RFU1RST1kpCi0gICAgOiBmZF8oZmQpCi0gICAgLCBjbG9zZV9wb2xpY3lfKGNsb3NlX3BvbGljeSkKLSAge30KLQotICB+VEZEVHJhbnNwb3J0KCkgewotICAgIGlmIChjbG9zZV9wb2xpY3lfID09IENMT1NFX09OX0RFU1RST1kpIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmZF8gPj0gMDsgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCBjbG9zZSgpOwotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgc2V0RkQoaW50IGZkKSB7IGZkXyA9IGZkOyB9Ci0gIGludCBnZXRGRCgpIHsgcmV0dXJuIGZkXzsgfQotCi0gcHJvdGVjdGVkOgotICBpbnQgZmRfOwotICBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3lfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MTY5NC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgIlRGaWxlVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydFV0aWxzLmgiCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIGJvb3N0OjpzY29wZWRfcHRyOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotI2lmbmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKLQotLyoqCi0gKiBGYWtlIGNsb2NrX2dldHRpbWUgZm9yIHN5c3RlbXMgbGlrZSBkYXJ3aW4KLSAqCi0gKi8KLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUUgMAotc3RhdGljIGludCBjbG9ja19nZXR0aW1lKGludCBjbGtfaWQgLyppZ25vcmVkKi8sIHN0cnVjdCB0aW1lc3BlYyAqdHApIHsKLSAgc3RydWN0IHRpbWV2YWwgbm93OwotCi0gIGludCBydiA9IGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKLSAgaWYgKHJ2ICE9IDApIHsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB0cC0+dHZfc2VjID0gbm93LnR2X3NlYzsKLSAgdHAtPnR2X25zZWMgPSBub3cudHZfdXNlYyAqIDEwMDA7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLVRGaWxlVHJhbnNwb3J0OjpURmlsZVRyYW5zcG9ydChzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSkKLSAgOiByZWFkU3RhdGVfKCkKLSAgLCByZWFkQnVmZl8oTlVMTCkKLSAgLCBjdXJyZW50RXZlbnRfKE5VTEwpCi0gICwgcmVhZEJ1ZmZTaXplXyhERUZBVUxUX1JFQURfQlVGRl9TSVpFKQotICAsIHJlYWRUaW1lb3V0XyhOT19UQUlMX1JFQURfVElNRU9VVCkKLSAgLCBjaHVua1NpemVfKERFRkFVTFRfQ0hVTktfU0laRSkKLSAgLCBldmVudEJ1ZmZlclNpemVfKERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkUpCi0gICwgZmx1c2hNYXhVc18oREVGQVVMVF9GTFVTSF9NQVhfVVMpCi0gICwgZmx1c2hNYXhCeXRlc18oREVGQVVMVF9GTFVTSF9NQVhfQllURVMpCi0gICwgbWF4RXZlbnRTaXplXyhERUZBVUxUX01BWF9FVkVOVF9TSVpFKQotICAsIG1heENvcnJ1cHRlZEV2ZW50c18oREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUykKLSAgLCBlb2ZTbGVlcFRpbWVfKERFRkFVTFRfRU9GX1NMRUVQX1RJTUVfVVMpCi0gICwgY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpCi0gICwgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8oREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMpCi0gICwgd3JpdGVyVGhyZWFkSWRfKDApCi0gICwgZGVxdWV1ZUJ1ZmZlcl8oTlVMTCkKLSAgLCBlbnF1ZXVlQnVmZmVyXyhOVUxMKQotICAsIGNsb3NpbmdfKGZhbHNlKQotICAsIGZvcmNlRmx1c2hfKGZhbHNlKQotICAsIGZpbGVuYW1lXyhwYXRoKQotICAsIGZkXygwKQotICAsIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyhmYWxzZSkKLSAgLCBvZmZzZXRfKDApCi0gICwgbGFzdEJhZENodW5rXygwKQotICAsIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKDApCi0gICwgcmVhZE9ubHlfKHJlYWRPbmx5KQotewotICAvLyBpbml0aWFsaXplIGFsbCB0aGUgY29uZGl0aW9uIHZhcnMvbXV0ZXhlcwotICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCk7Ci0gIHB0aHJlYWRfY29uZF9pbml0KCZub3RGdWxsXywgTlVMTCk7Ci0gIHB0aHJlYWRfY29uZF9pbml0KCZub3RFbXB0eV8sIE5VTEwpOwotICBwdGhyZWFkX2NvbmRfaW5pdCgmZmx1c2hlZF8sIE5VTEwpOwotCi0gIG9wZW5Mb2dGaWxlKCk7Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OnJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0cmluZyBmaWxlbmFtZSwgaW50NjRfdCBvZmZzZXQpIHsKLSAgZmlsZW5hbWVfID0gZmlsZW5hbWU7Ci0gIG9mZnNldF8gPSBvZmZzZXQ7Ci0KLSAgLy8gY2hlY2sgaWYgY3VycmVudCBmaWxlIGlzIHN0aWxsIG9wZW4KLSAgaWYgKGZkXyA+IDApIHsKLSAgICAvLyBmbHVzaCBhbnkgZXZlbnRzIGluIHRoZSBxdWV1ZQotICAgIGZsdXNoKCk7Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZXJyb3IsIGN1cnJlbnQgZmlsZSAoJXMpIG5vdCBjbG9zZWQiLCBmaWxlbmFtZV8uY19zdHIoKSk7Ci0gICAgaWYgKC0xID09IDo6Y2xvc2UoZmRfKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiByZXNldE91dHB1dEZpbGUoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURmlsZVRyYW5zcG9ydDogZXJyb3IgaW4gZmlsZSBjbG9zZSIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIGlmIChmZCkgewotICAgIGZkXyA9IGZkOwotICB9IGVsc2UgewotICAgIC8vIG9wZW4gZmlsZSBpZiB0aGUgaW5wdXQgZmQgaXMgMAotICAgIG9wZW5Mb2dGaWxlKCk7Ci0gIH0KLX0KLQotCi1URmlsZVRyYW5zcG9ydDo6flRGaWxlVHJhbnNwb3J0KCkgewotICAvLyBmbHVzaCB0aGUgYnVmZmVyIGlmIGEgd3JpdGVyIHRocmVhZCBpcyBhY3RpdmUKLSAgaWYgKHdyaXRlclRocmVhZElkXyA+IDApIHsKLSAgICAvLyByZWR1Y2UgdGhlIGZsdXNoIHRpbWVvdXQgc28gdGhhdCBjbG9zaW5nIGlzIHF1aWNrZXIKLSAgICBzZXRGbHVzaE1heFVzKDMwMCoxMDAwKTsKLQotICAgIC8vIGZsdXNoIG91dHB1dCBidWZmZXIKLSAgICBmbHVzaCgpOwotCi0gICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKLSAgICBjbG9zaW5nXyA9IHRydWU7Ci0KLSAgICAvLyBUT0RPOiBtYWtlIHN1cmUgZXZlbnQgcXVldWUgaXMgZW1wdHkKLSAgICAvLyBjdXJyZW50bHkgb25seSB0aGUgd3JpdGUgYnVmZmVyIGlzIGZsdXNoZWQKLSAgICAvLyB3ZSBkb250IGFjdHVhbGx5IHdhaXQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LiBUaGlzIHNob3VsZG4ndCBiZSBhIGJpZwotICAgIC8vIGRlYWwgaW4gdGhlIGNvbW1vbiBjYXNlIGJlY2F1c2Ugd3JpdGluZyBpcyBxdWljawotCi0gICAgcHRocmVhZF9qb2luKHdyaXRlclRocmVhZElkXywgTlVMTCk7Ci0gICAgd3JpdGVyVGhyZWFkSWRfID0gMDsKLSAgfQotCi0gIGlmIChkZXF1ZXVlQnVmZmVyXykgewotICAgIGRlbGV0ZSBkZXF1ZXVlQnVmZmVyXzsKLSAgICBkZXF1ZXVlQnVmZmVyXyA9IE5VTEw7Ci0gIH0KLQotICBpZiAoZW5xdWV1ZUJ1ZmZlcl8pIHsKLSAgICBkZWxldGUgZW5xdWV1ZUJ1ZmZlcl87Ci0gICAgZW5xdWV1ZUJ1ZmZlcl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKHJlYWRCdWZmXykgewotICAgIGRlbGV0ZVtdIHJlYWRCdWZmXzsKLSAgICByZWFkQnVmZl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKGN1cnJlbnRFdmVudF8pIHsKLSAgICBkZWxldGUgY3VycmVudEV2ZW50XzsKLSAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgfQotCi0gIC8vIGNsb3NlIGxvZ2ZpbGUKLSAgaWYgKGZkXyA+IDApIHsKLSAgICBpZigtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB+VEZpbGVUcmFuc3BvcnQoKSA6OmNsb3NlKCkgIiwgZXJybm8pOwotICAgIH0KLSAgfQotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojppbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSB7Ci0gIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKLSAgICBUX0VSUk9SKCJUcnlpbmcgdG8gZG91YmxlLWluaXQgVEZpbGVUcmFuc3BvcnQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAod3JpdGVyVGhyZWFkSWRfID09IDApIHsKLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJndyaXRlclRocmVhZElkXywgTlVMTCwgc3RhcnRXcml0ZXJUaHJlYWQsICh2b2lkICopdGhpcykgIT0gMCkgewotICAgICAgVF9FUlJPUigiQ291bGQgbm90IGNyZWF0ZSB3cml0ZXIgdGhyZWFkIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgZGVxdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7Ci0gIGVucXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOwotICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAocmVhZE9ubHlfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gZmlsZSBvcGVuZWQgcmVhZG9ubHkiKTsKLSAgfQotCi0gIGVucXVldWVFdmVudChidWYsIGxlbiwgZmFsc2UpOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjplbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbiwgYm9vbCBibG9ja1VudGlsRmx1c2gpIHsKLSAgLy8gY2FuJ3QgZW5xdWV1ZSBtb3JlIGV2ZW50cyBpZiBmaWxlIGlzIGdvaW5nIHRvIGNsb3NlCi0gIGlmIChjbG9zaW5nXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW50IHNpemUgaXMgdmFsaWQKLSAgaWYgKCAobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pICkgewotICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgZXZlbnRMZW4sIG1heEV2ZW50U2l6ZV8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChldmVudExlbiA9PSAwKSB7Ci0gICAgVF9FUlJPUigiY2Fubm90IGVucXVldWUgYW4gZW1wdHkgZXZlbnQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBldmVudEluZm8qIHRvRW5xdWV1ZSA9IG5ldyBldmVudEluZm8oKTsKLSAgdG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID0gKHVpbnQ4X3QgKilzdGQ6Om1hbGxvYygoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNCk7Ci0gIC8vIGZpcnN0IDQgYnl0ZXMgaXMgdGhlIGV2ZW50IGxlbmd0aAotICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfLCAodm9pZCopKCZldmVudExlbiksIDQpOwotICAvLyBhY3R1YWwgZXZlbnQgY29udGVudHMKLSAgbWVtY3B5KHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyArIDQsIGJ1ZiwgZXZlbnRMZW4pOwotICB0b0VucXVldWUtPmV2ZW50U2l6ZV8gPSBldmVudExlbiArIDQ7Ci0KLSAgLy8gbG9jayBtdXRleAotICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0KLSAgLy8gbWFrZSBzdXJlIHRoYXQgZW5xdWV1ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHdyaXRlciB0aHJlYWQgaXMgcnVubmluZwotICBpZiAoIWJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewotICAgIGlmICghaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkpIHsKLSAgICAgIGRlbGV0ZSB0b0VucXVldWU7Ci0gICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvLyBDYW4ndCBlbnF1ZXVlIHdoaWxlIGJ1ZmZlciBpcyBmdWxsCi0gIHdoaWxlIChlbnF1ZXVlQnVmZmVyXy0+aXNGdWxsKCkpIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmbm90RnVsbF8sICZtdXRleF8pOwotICB9Ci0KLSAgLy8gYWRkIHRvIHRoZSBidWZmZXIKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQodG9FbnF1ZXVlKSkgewotICAgIGRlbGV0ZSB0b0VucXVldWU7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gc2lnbmFsIGFueWJvZHkgd2hvJ3Mgd2FpdGluZyBmb3IgdGhlIGJ1ZmZlciB0byBiZSBub24tZW1wdHkKLSAgcHRocmVhZF9jb25kX3NpZ25hbCgmbm90RW1wdHlfKTsKLQotICBpZiAoYmxvY2tVbnRpbEZsdXNoKSB7Ci0gICAgcHRocmVhZF9jb25kX3dhaXQoJmZsdXNoZWRfLCAmbXV0ZXhfKTsKLSAgfQotCi0gIC8vIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIGxvb3Agd2hlcmUgaXQgbWFrZXMgc3VyZSBpdCBnb3QgZmx1c2hlZAotICAvLyBiZWNhdXNlIGNvbmRpdGlvbiB2YXJpYWJsZXMgY2FuIGdldCB0cmlnZ2VyZWQgYnkgdGhlIG9zIGZvciBubyByZWFzb24KLSAgLy8gaXQgaXMgcHJvYmFibHkgYSBub24tZmFjdG9yIGZvciB0aGUgdGltZSBiZWluZwotICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6c3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXNwZWMqIGRlYWRsaW5lKSB7Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsKLSAgaWYgKGRlYWRsaW5lICE9IE5VTEwpIHsKLSAgICAvLyBpZiB3ZSB3ZXJlIGhhbmRlZCBhIGRlYWRsaW5lIHRpbWUgc3RydWN0LCBkbyBhIHRpbWVkIHdhaXQKLSAgICBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZub3RFbXB0eV8sICZtdXRleF8sIGRlYWRsaW5lKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBqdXN0IHdhaXQgdW50aWwgdGhlIGJ1ZmZlciBnZXRzIGFuIGl0ZW0KLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmbm90RW1wdHlfLCAmbXV0ZXhfKTsKLSAgfQotCi0gIGJvb2wgc3dhcHBlZCA9IGZhbHNlOwotCi0gIC8vIGNvdWxkIGJlIGVtcHR5IGlmIHdlIHRpbWVkIG91dAotICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKLSAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqdGVtcCA9IGVucXVldWVCdWZmZXJfOwotICAgIGVucXVldWVCdWZmZXJfID0gZGVxdWV1ZUJ1ZmZlcl87Ci0gICAgZGVxdWV1ZUJ1ZmZlcl8gPSB0ZW1wOwotCi0gICAgc3dhcHBlZCA9IHRydWU7Ci0gIH0KLQotICAvLyB1bmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgaWYgcmVxdWlyZWQKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0KLSAgaWYgKHN3YXBwZWQpIHsKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZub3RGdWxsXyk7Ci0gIH0KLQotICByZXR1cm4gc3dhcHBlZDsKLX0KLQotCi12b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZXJUaHJlYWQoKSB7Ci0gIGJvb2wgaGFzSU9FcnJvciA9IGZhbHNlOwotCi0gIC8vIG9wZW4gZmlsZSBpZiBpdCBpcyBub3Qgb3BlbgotICBpZighZmRfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIG9wZW5Mb2dGaWxlKCk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIG9wZW5Mb2dGaWxlKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICBmZF8gPSAwOwotICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gc2V0IHRoZSBvZmZzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUgKEVPRikKLSAgaWYgKCFoYXNJT0Vycm9yKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlZWtUb0VuZCgpOwotICAgICAgLy8gdGhyb3cgYXdheSBhbnkgcGFydGlhbCBldmVudHMKLSAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfOwotICAgICAgZnRydW5jYXRlKGZkXywgb2Zmc2V0Xyk7Ci0gICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGluaXRpYWxpemF0aW9uICIsIGVycm5vX2NvcHkpOwotICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gRmlndXJlIG91dCB0aGUgbmV4dCB0aW1lIGJ5IHdoaWNoIGEgZmx1c2ggbXVzdCB0YWtlIHBsYWNlCi0gIHN0cnVjdCB0aW1lc3BlYyB0c19uZXh0X2ZsdXNoOwotICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKLSAgdWludDMyX3QgdW5mbHVzaGVkID0gMDsKLQotICB3aGlsZSAoMSkgewotICAgIC8vIHRoaXMgd2lsbCBvbmx5IGJlIHRydWUgd2hlbiB0aGUgZGVzdHJ1Y3RvciBpcyBiZWluZyBpbnZva2VkCi0gICAgaWYgKGNsb3NpbmdfKSB7Ci0gICAgICBpZiAoaGFzSU9FcnJvcikgewotICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0IAotICAgICAgaWYgKGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkgJiYgZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgewotICAgICAgICBmc3luYyhmZF8pOwotICAgICAgICBpZiAoLTEgPT0gOjpjbG9zZShmZF8pKSB7Ci0gICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOwotICAgICAgICB9Ci0gICAgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3dhcEV2ZW50QnVmZmVycygmdHNfbmV4dF9mbHVzaCkpIHsKLSAgICAgIGV2ZW50SW5mbyogb3V0RXZlbnQ7Ci0gICAgICB3aGlsZSAoTlVMTCAhPSAob3V0RXZlbnQgPSBkZXF1ZXVlQnVmZmVyXy0+Z2V0TmV4dCgpKSkgewotICAgICAgICAvLyBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzay4gSWYgdGhlcmUgaXMgYW55IElPIGVycm9yLCBmb3IgaW5zdGFuY2UsCi0gICAgICAgIC8vIHRoZSBvdXRwdXQgZmlsZSBpcyB1bm1vdW50ZWQgb3IgZGVsZXRlZCwgdGhlbiB0aGlzIGV2ZW50IGlzIGRyb3BwZWQuIEhvd2V2ZXIsIHRoZSB3cml0ZXIgdGhyZWFkCi0gICAgICAgIC8vIHdpbGw6ICgxKSBzbGVlcCBmb3IgYSBzaG9ydCB3aGlsZTsgKDIpIHRyeSB0byByZW9wZW4gdGhlIGZpbGU7ICgzKSBpZiBzdWNjZXNzZnVsIHRoZW4gc3RhcnQgd3JpdGluZwotICAgICAgICAvLyBmcm9tIHRoZSBlbmQuCi0KLSAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKLSAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJWQgbWljcm9zZWNvbmRzIGR1ZSB0byBJTyBlcnJvcnMiLCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7Ci0gICAgICAgICAgdXNsZWVwKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKLSAgICAgICAgICBpZiAoY2xvc2luZ18pIHsKLSAgICAgICAgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFmZF8pIHsKLSAgICAgICAgICAgIDo6Y2xvc2UoZmRfKTsKLSAgICAgICAgICAgIGZkXyA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcGVuTG9nRmlsZSgpOwotICAgICAgICAgICAgc2Vla1RvRW5kKCk7Ci0gICAgICAgICAgICB1bmZsdXNoZWQgPSAwOwotICAgICAgICAgICAgaGFzSU9FcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgVF9MT0dfT1BFUigiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlICVzIHJlb3BlbmVkIGJ5IHdyaXRlciB0aHJlYWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IHVuYWJsZSB0byByZW9wZW4gbG9nIGZpbGUgJXMgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNhbml0eSBjaGVjayBvbiBldmVudAotICAgICAgICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgewotICAgICAgICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgb3V0RXZlbnQtPmV2ZW50U2l6ZV8sIG1heEV2ZW50U2l6ZV8pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgY2h1bmtpbmcgaXMgcmVxdWlyZWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgbXNnIGRvZXMgbm90IGNyb3NzIGNodW5rIGJvdW5kYXJ5Ci0gICAgICAgIGlmICgob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSAmJiAoY2h1bmtTaXplXyAhPSAwKSkgewotICAgICAgICAgIC8vIGV2ZW50IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmsgc2l6ZQotICAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0Xy9jaHVua1NpemVfOwotICAgICAgICAgIGludDY0X3QgY2h1bmsyID0gKG9mZnNldF8gKyBvdXRFdmVudC0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV87Ci0KLSAgICAgICAgICAvLyBpZiBhZGRpbmcgdGhpcyBldmVudCB3aWxsIGNyb3NzIGEgY2h1bmsgYm91bmRhcnksIHBhZCB0aGUgY2h1bmsgd2l0aCB6ZXJvcwotICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7Ci0gICAgICAgICAgICAvLyByZWZldGNoIHRoZSBvZmZzZXQgdG8ga2VlcCBpbiBzeW5jCi0gICAgICAgICAgICBvZmZzZXRfID0gbHNlZWsoZmRfLCAwLCBTRUVLX0NVUik7Ci0gICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAoaW50MzJfdCkoKG9mZnNldF8gLyBjaHVua1NpemVfICsgMSkgKiBjaHVua1NpemVfIC0gb2Zmc2V0Xyk7Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgemVyb3NbcGFkZGluZ107Ci0gICAgICAgICAgICBiemVybyh6ZXJvcywgcGFkZGluZyk7Ci0gICAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIHplcm9zLCBwYWRkaW5nKSkgewotICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgZXJyb3Igd2hpbGUgcGFkZGluZyB6ZXJvcyAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5mbHVzaGVkICs9IHBhZGRpbmc7Ci0gICAgICAgICAgICBvZmZzZXRfICs9IHBhZGRpbmc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3JpdGUgdGhlIGRlcXVldWVkIGV2ZW50IHRvIHRoZSBmaWxlCi0gICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IDApIHsKLSAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIG91dEV2ZW50LT5ldmVudEJ1ZmZfLCBvdXRFdmVudC0+ZXZlbnRTaXplXykpIHsKLSAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgd3JpdGluZyBldmVudCAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVuZmx1c2hlZCArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKLSAgICAgICAgICBvZmZzZXRfICs9IG91dEV2ZW50LT5ldmVudFNpemVfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXF1ZXVlQnVmZmVyXy0+cmVzZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzSU9FcnJvcikgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgYm9vbCBmbHVzaFRpbWVFbGFwc2VkID0gZmFsc2U7Ci0gICAgc3RydWN0IHRpbWVzcGVjIGN1cnJlbnRfdGltZTsKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VycmVudF90aW1lKTsKLQotICAgIGlmIChjdXJyZW50X3RpbWUudHZfc2VjID4gdHNfbmV4dF9mbHVzaC50dl9zZWMgfHwKLSAgICAgICAgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gdHNfbmV4dF9mbHVzaC50dl9zZWMgJiYgY3VycmVudF90aW1lLnR2X25zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X25zZWMpKSB7Ci0gICAgICBmbHVzaFRpbWVFbGFwc2VkID0gdHJ1ZTsKLSAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOwotICAgIH0KLQotICAgIC8vIGNvdXBsZSBvZiBjYXNlcyBmcm9tIHdoaWNoIGEgZmx1c2ggY291bGQgYmUgdHJpZ2dlcmVkCi0gICAgaWYgKChmbHVzaFRpbWVFbGFwc2VkICYmIHVuZmx1c2hlZCA+IDApIHx8Ci0gICAgICAgdW5mbHVzaGVkID4gZmx1c2hNYXhCeXRlc18gfHwKLSAgICAgICBmb3JjZUZsdXNoXykgewotCi0gICAgICAvLyBzeW5jIChmb3JjZSBmbHVzaCkgZmlsZSB0byBkaXNrCi0gICAgICBmc3luYyhmZF8pOwotICAgICAgdW5mbHVzaGVkID0gMDsKLQotICAgICAgLy8gbm90aWZ5IGFueWJvZHkgd2FpdGluZyBmb3IgZmx1c2ggY29tcGxldGlvbgotICAgICAgZm9yY2VGbHVzaF8gPSBmYWxzZTsKLSAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmZsdXNoZWRfKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6Zmx1c2goKSB7Ci0gIC8vIGZpbGUgbXVzdCBiZSBvcGVuIGZvciB3cml0aW5nIGZvciBhbnkgZmx1c2hpbmcgdG8gdGFrZSBwbGFjZQotICBpZiAod3JpdGVyVGhyZWFkSWRfIDw9IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gd2FpdCBmb3IgZmx1c2ggdG8gdGFrZSBwbGFjZQotICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0KLSAgZm9yY2VGbHVzaF8gPSB0cnVlOwotCi0gIHdoaWxlIChmb3JjZUZsdXNoXykgewotICAgIHB0aHJlYWRfY29uZF93YWl0KCZmbHVzaGVkXywgJm11dGV4Xyk7Ci0gIH0KLQotICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLX0KLQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBoYXZlID0gMDsKLSAgdWludDMyX3QgZ2V0ID0gMDsKLQotICB3aGlsZSAoaGF2ZSA8IGxlbikgewotICAgIGdldCA9IHJlYWQoYnVmK2hhdmUsIGxlbi1oYXZlKTsKLSAgICBpZiAoZ2V0IDw9IDApIHsKLSAgICAgIHRocm93IFRFT0ZFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgaGF2ZSArPSBnZXQ7Ci0gIH0KLQotICByZXR1cm4gaGF2ZTsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6cGVlaygpIHsKLSAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gZXZlbnQgcmVhZHkgdG8gYmUgcmVhZAotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7Ci0gIH0KLQotICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAotICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIHJlYWQKLSAgcmV0dXJuIChjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXykgPiAwOwotfQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAvLyBjaGVjayBpZiB0aGVyZSBhbiBldmVudCBpcyByZWFkeSB0byBiZSByZWFkCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKLSAgfQotCi0gIC8vIGRpZCBub3QgbWFuYWdlIHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgZmlsZS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbmVkCi0gIC8vIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgb3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IKLSAgaWYgKCFjdXJyZW50RXZlbnRfKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyByZWFkIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgZXZlbnQgYXMgcG9zc2libGUKLSAgaW50MzJfdCByZW1haW5pbmcgPSBjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXzsKLSAgaWYgKHJlbWFpbmluZyA8PSAoaW50MzJfdClsZW4pIHsKLSAgICAvLyBjb3B5IG92ZXIgYW55dGhpbmcgdGhhdHMgcmVtYWluaW5nCi0gICAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsCi0gICAgICAgICAgICAgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgcmVtYWluaW5nKTsKLSAgICB9Ci0gICAgZGVsZXRlKGN1cnJlbnRFdmVudF8pOwotICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOwotICAgIHJldHVybiByZW1haW5pbmc7Ci0gIH0KLQotICAvLyByZWFkIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgbWVtY3B5KGJ1ZiwgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sIGxlbik7Ci0gIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18gKz0gbGVuOwotICByZXR1cm4gbGVuOwotfQotCi0vLyBub3RlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyByZXR1cm5lZCBldmVudHMKLWV2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnQ6OnJlYWRFdmVudCgpIHsKLSAgaW50IHJlYWRUcmllcyA9IDA7Ci0KLSAgaWYgKCFyZWFkQnVmZl8pIHsKLSAgICByZWFkQnVmZl8gPSBuZXcgdWludDhfdFtyZWFkQnVmZlNpemVfXTsKLSAgfQotCi0gIHdoaWxlICgxKSB7Ci0gICAgLy8gcmVhZCBmcm9tIHRoZSBmaWxlIGlmIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZAotICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPT0gcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7Ci0gICAgICAvLyBhZHZhbmNlIHRoZSBvZmZzZXQgcG9pbnRlcgotICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmJ1ZmZlckxlbl87Ci0gICAgICByZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPSA6OnJlYWQoZmRfLCByZWFkQnVmZl8sIHJlYWRCdWZmU2l6ZV8pOwotICAgICAgLy8gICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgLy8gICAgICAgICBUX0RFQlVHX0woMSwgIkFtb3VudCByZWFkOiAldSAob2Zmc2V0OiAlbHUpIiwgcmVhZFN0YXRlXy5idWZmZXJMZW5fLCBvZmZzZXRfKTsKLSAgICAgIC8vICAgICAgIH0KLSAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA9IDA7Ci0gICAgICByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8gPSAwOwotCi0gICAgICAvLyByZWFkIGVycm9yCi0gICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IC0xKSB7Ci0gICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7Ci0gICAgICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAwKSB7ICAvLyBFT0YKLSAgICAgICAgLy8gd2FpdCBpbmRlZmluaXRlbHkgaWYgdGhlcmUgaXMgbm8gdGltZW91dAotICAgICAgICBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7Ci0gICAgICAgICAgdXNsZWVwKGVvZlNsZWVwVGltZV8pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBOT19UQUlMX1JFQURfVElNRU9VVCkgewotICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCi0gICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA+IDApIHsKLSAgICAgICAgICAvLyB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCBvbmNlCi0gICAgICAgICAgaWYgKHJlYWRUcmllcyA+IDApIHsKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2xlZXAocmVhZFRpbWVvdXRfICogMTAwMCk7Ci0gICAgICAgICAgICByZWFkVHJpZXMrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJlYWRUcmllcyA9IDA7Ci0KLSAgICAvLyBhdHRlbXB0IHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyCi0gICAgd2hpbGUocmVhZFN0YXRlXy5idWZmZXJQdHJfIDwgcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7Ci0gICAgICBpZiAocmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8pIHsKLSAgICAgICAgaWYocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7Ci0gICAgICAgICAgaWYgKCAob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykvY2h1bmtTaXplXyAhPQotICAgICAgICAgICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykvY2h1bmtTaXplXykpIHsKLSAgICAgICAgICAgIC8vIHNraXAgb25lIGJ5dGUgdG93YXJkcyBjaHVuayBib3VuZGFyeQotICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIlNraXBwaW5nIGEgYnl0ZSIpOwotICAgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10gPQotICAgICAgICAgIHJlYWRCdWZmX1tyZWFkU3RhdGVfLmJ1ZmZlclB0cl8rK107Ci0gICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDQpIHsKLSAgICAgICAgICAvLyAwIGxlbmd0aCBldmVudCBpbmRpY2F0ZXMgcGFkZGluZwotICAgICAgICAgIGlmICgqKCh1aW50MzJfdCAqKShyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfKSkgPT0gMCkgewotICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIkdvdCBwYWRkaW5nIik7Ci0gICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7Ci0gICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfKSB7Ci0gICAgICAgICAgICBkZWxldGUocmVhZFN0YXRlXy5ldmVudF8pOwotICAgICAgICAgIH0KLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG5ldyBldmVudEluZm8oKTsKLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA9ICooKHVpbnQzMl90ICopKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl8pKTsKLQotICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBpcyBjb3JydXB0ZWQgYW5kIHBlcmZvcm0gcmVjb3ZlcnkgaWYgcmVxdWlyZWQKLSAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7Ci0gICAgICAgICAgICBwZXJmb3JtUmVjb3ZlcnkoKTsKLSAgICAgICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIHRvcAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfKSB7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFtyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplX107Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPSAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRha2UgZWl0aGVyIHRoZSBlbnRpcmUgZXZlbnQgb3IgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGludCByZWNsYWltQnVmZmVyID0gbWluKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyk7Ci0KLSAgICAgICAgLy8gY29weSBkYXRhIGZyb20gcmVhZCBidWZmZXIgaW50byBldmVudCBidWZmZXIKLSAgICAgICAgbWVtY3B5KHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgICByZWFkQnVmZl8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8sCi0gICAgICAgICAgICAgICByZWNsYWltQnVmZmVyKTsKLQotICAgICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gcHRycwotICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyArPSByZWNsYWltQnVmZmVyOwotICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKz0gcmVjbGFpbUJ1ZmZlcjsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaGFzIGJlZW4gcmVhZCBpbiBmdWxsCi0gICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9PSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXykgewotICAgICAgICAgIC8vIHNldCB0aGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBjdXJyZW50IGV2ZW50Ci0gICAgICAgICAgZXZlbnRJbmZvKiBjb21wbGV0ZUV2ZW50ID0gcmVhZFN0YXRlXy5ldmVudF87Ci0gICAgICAgICAgY29tcGxldGVFdmVudC0+ZXZlbnRCdWZmUG9zXyA9IDA7Ci0KLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IE5VTEw7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyk7Ci0KLSAgICAgICAgICAvLyBleGl0IGNyaXRlcmlhCi0gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlRXZlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojppc0V2ZW50Q29ycnVwdGVkKCkgewotICAvLyBhbiBlcnJvciBpcyB0cmlnZ2VyZWQgaWY6Ci0gIGlmICggKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKLSAgICAvLyAxLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCi0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemUgKCV1KSIsCi0gICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgbWF4RXZlbnRTaXplXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7Ci0gICAgLy8gMi4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBjaHVuayBzaXplCi0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gY2h1bmsgc2l6ZSAoJXUpIiwKLSAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmKCAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gLSA0KS9jaHVua1NpemVfKSAhPQotICAgICAgICAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gMSkvY2h1bmtTaXplXykgKSB7Ci0gICAgLy8gMy4gc2l6ZSBpbmRpY2F0ZXMgdGhhdCBldmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5Ci0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5LiBFdmVudCBzaXplOiV1ICBPZmZzZXQ6JWxkIiwKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLCBvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgNCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OnBlcmZvcm1SZWNvdmVyeSgpIHsKLSAgLy8gcGVyZm9ybSBzb21lIGtpY2thc3MgcmVjb3ZlcnkKLSAgdWludDMyX3QgY3VyQ2h1bmsgPSBnZXRDdXJDaHVuaygpOwotICBpZiAobGFzdEJhZENodW5rXyA9PSBjdXJDaHVuaykgewotICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKys7Ci0gIH0gZWxzZSB7Ci0gICAgbGFzdEJhZENodW5rXyA9IGN1ckNodW5rOwotICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfID0gMTsKLSAgfQotCi0gIGlmIChudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA8IG1heENvcnJ1cHRlZEV2ZW50c18pIHsKLSAgICAvLyBtYXliZSB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgZmlsZSBmcm9tIGRpc2sKLSAgICAvLyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgY2h1bmsgYW5kIHRyeSBhZ2FpbgotICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKTsKLSAgfSBlbHNlIHsKLQotICAgIC8vIGp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBjaHVuayBpZiB3ZSBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBjaHVuawotICAgIGlmIChjdXJDaHVuayAhPSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgewotICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKLSAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgewotICAgICAgLy8gaWYgdGFpbGluZyB0aGUgZmlsZSwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBzdGFydAotICAgICAgLy8gdGhlIG5leHQgY2h1bmsKLSAgICAgIHdoaWxlKGN1ckNodW5rID09IChnZXROdW1DaHVua3MoKSAtIDEpKSB7Ci0gICAgICAgIHVzbGVlcChERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKTsKLSAgICAgIH0KLSAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHByZXR0eSBob3NlZCBhdCB0aGlzIHN0YWdlLCByZXdpbmQgdGhlIGZpbGUgYmFjayB0byB0aGUgbGFzdCBzdWNjZXNzZnVsCi0gICAgICAvLyBwb2ludCBhbmQgcHVudCBvbiB0aGUgZXJyb3IKLSAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pOwotICAgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7Ci0gICAgICBjaGFyIGVycm9yTXNnWzEwMjRdOwotICAgICAgc3ByaW50ZihlcnJvck1zZywgIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSBjb3JydXB0ZWQgYXQgb2Zmc2V0OiAlbHUiLAotICAgICAgICAgICAgICBvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJvck1zZyk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKGVycm9yTXNnKTsKLSAgICB9Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7Ci0gIGlmIChmZF8gPD0gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZpbGUgbm90IG9wZW4iKTsKLSAgfQotCi0gIGludDMyX3QgbnVtQ2h1bmtzID0gZ2V0TnVtQ2h1bmtzKCk7Ci0KLSAgLy8gZmlsZSBpcyBlbXB0eSwgc2Vla2luZyB0byBjaHVuayBpcyBwb2ludGxlc3MKLSAgaWYgKG51bUNodW5rcyA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gbmVnYXRpdmUgaW5kaWNhdGVzIHJldmVyc2Ugc2VlayAoZnJvbSB0aGUgZW5kKQotICBpZiAoY2h1bmsgPCAwKSB7Ci0gICAgY2h1bmsgKz0gbnVtQ2h1bmtzOwotICB9Ci0KLSAgLy8gdG9vIGxhcmdlIGEgdmFsdWUgZm9yIHJldmVyc2Ugc2VlaywganVzdCBzZWVrIHRvIGJlZ2lubmluZwotICBpZiAoY2h1bmsgPCAwKSB7Ci0gICAgVF9ERUJVRygiSW5jb3JyZWN0IHZhbHVlIGZvciByZXZlcnNlIHNlZWsuIFNlZWtpbmcgdG8gYmVnaW5uaW5nLi4uIiwgY2h1bmspCi0gICAgY2h1bmsgPSAwOwotICB9Ci0KLSAgLy8gY2Fubm90IHNlZWsgcGFzdCBFT0YKLSAgYm9vbCBzZWVrVG9FbmQgPSBmYWxzZTsKLSAgdWludDMyX3QgbWluRW5kT2Zmc2V0ID0gMDsKLSAgaWYgKGNodW5rID49IG51bUNodW5rcykgewotICAgIFRfREVCVUcoIlRyeWluZyB0byBzZWVrIHBhc3QgRU9GLiBTZWVraW5nIHRvIEVPRiBpbnN0ZWFkLi4uIik7Ci0gICAgc2Vla1RvRW5kID0gdHJ1ZTsKLSAgICBjaHVuayA9IG51bUNodW5rcyAtIDE7Ci0gICAgLy8gdGhpcyBpcyB0aGUgbWluIG9mZnNldCB0byBwcm9jZXNzIGV2ZW50cyB0aWxsCi0gICAgbWluRW5kT2Zmc2V0ID0gbHNlZWsoZmRfLCAwLCBTRUVLX0VORCk7Ci0gIH0KLQotICBvZmZfdCBuZXdPZmZzZXQgPSBvZmZfdChjaHVuaykgKiBjaHVua1NpemVfOwotICBvZmZzZXRfID0gbHNlZWsoZmRfLCBuZXdPZmZzZXQsIFNFRUtfU0VUKTsKLSAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOwotICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgaWYgKG9mZnNldF8gPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQoIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOwotICB9Ci0KLSAgLy8gc2VlayB0byBFT0YgaWYgdXNlciB3YW50ZWQgdG8gZ28gdG8gbGFzdCBjaHVuawotICBpZiAoc2Vla1RvRW5kKSB7Ci0gICAgdWludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBnZXRSZWFkVGltZW91dCgpOwotICAgIHNldFJlYWRUaW1lb3V0KE5PX1RBSUxfUkVBRF9USU1FT1VUKTsKLSAgICAvLyBrZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrQ2h1bmsgY2FsbAotICAgIGJvb3N0OjpzY29wZWRfcHRyPGV2ZW50SW5mbz4gZXZlbnQ7Ci0gICAgd2hpbGUgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSA8IG1pbkVuZE9mZnNldCkgewotICAgICAgZXZlbnQucmVzZXQocmVhZEV2ZW50KCkpOwotICAgICAgaWYgKGV2ZW50LmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKLSAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOwotfQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgewotICBpZiAoZmRfIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHN0cnVjdCBzdGF0IGZfaW5mbzsKLSAgaW50IHJ2ID0gZnN0YXQoZmRfLCAmZl9pbmZvKTsKLQotICBpZiAocnYgPCAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIChmc3RhdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7Ci0gIH0KLQotICBpZiAoZl9pbmZvLnN0X3NpemUgPiAwKSB7Ci0gICAgcmV0dXJuICgoZl9pbmZvLnN0X3NpemUpL2NodW5rU2l6ZV8pICsgMTsKLSAgfQotCi0gIC8vIGVtcHR5IGZpbGUgaGFzIG5vIGNodW5rcwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldEN1ckNodW5rKCkgewotICByZXR1cm4gb2Zmc2V0Xy9jaHVua1NpemVfOwotfQotCi0vLyBVdGlsaXR5IEZ1bmN0aW9ucwotdm9pZCBURmlsZVRyYW5zcG9ydDo6b3BlbkxvZ0ZpbGUoKSB7Ci0gIG1vZGVfdCBtb2RlID0gcmVhZE9ubHlfID8gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIDogU19JUlVTUiB8IFNfSVdVU1J8IFNfSVJHUlAgfCBTX0lST1RIOwotICBpbnQgZmxhZ3MgPSByZWFkT25seV8gPyBPX1JET05MWSA6IE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKLSAgZmRfID0gOjpvcGVuKGZpbGVuYW1lXy5jX3N0cigpLCBmbGFncywgbW9kZSk7Ci0gIG9mZnNldF8gPSAwOwotCi0gIC8vIG1ha2Ugc3VyZSBvcGVuIGNhbGwgd2FzIHN1Y2Nlc3NmdWwKLSAgaWYoZmRfID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogb3BlbkxvZ0ZpbGUoKSA6Om9wZW4oKSBmaWxlOiAiICsgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOwotICB9Ci0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6Z2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXNwZWMqIHRzX25leHRfZmx1c2gpIHsKLSAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgdHNfbmV4dF9mbHVzaCk7Ci0gIHRzX25leHRfZmx1c2gtPnR2X25zZWMgKz0gKGZsdXNoTWF4VXNfICUgMTAwMDAwMCkgKiAxMDAwOwotICBpZiAodHNfbmV4dF9mbHVzaC0+dHZfbnNlYyA+IDEwMDAwMDAwMDApIHsKLSAgICB0c19uZXh0X2ZsdXNoLT50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IDE7Ci0gIH0KLSAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGZsdXNoTWF4VXNfIC8gMTAwMDAwMDsKLX0KLQotVEZpbGVUcmFuc3BvcnRCdWZmZXI6OlRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpCi0gIDogYnVmZmVyTW9kZV8oV1JJVEUpCi0gICwgd3JpdGVQb2ludF8oMCkKLSAgLCByZWFkUG9pbnRfKDApCi0gICwgc2l6ZV8oc2l6ZSkKLXsKLSAgYnVmZmVyXyA9IG5ldyBldmVudEluZm8qW3NpemVdOwotfQotCi1URmlsZVRyYW5zcG9ydEJ1ZmZlcjo6flRGaWxlVHJhbnNwb3J0QnVmZmVyKCkgewotICBpZiAoYnVmZmVyXykgewotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7Ci0gICAgICBkZWxldGUgYnVmZmVyX1tpXTsKLSAgICB9Ci0gICAgZGVsZXRlW10gYnVmZmVyXzsKLSAgICBidWZmZXJfID0gTlVMTDsKLSAgfQotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjphZGRFdmVudChldmVudEluZm8gKmV2ZW50KSB7Ci0gIGlmIChidWZmZXJNb2RlXyA9PSBSRUFEKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUcnlpbmcgdG8gd3JpdGUgdG8gYSBidWZmZXIgaW4gcmVhZCBtb2RlIik7Ci0gIH0KLSAgaWYgKHdyaXRlUG9pbnRfIDwgc2l6ZV8pIHsKLSAgICBidWZmZXJfW3dyaXRlUG9pbnRfKytdID0gZXZlbnQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gYnVmZmVyIGlzIGZ1bGwKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotZXZlbnRJbmZvKiBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6Z2V0TmV4dCgpIHsKLSAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFKSB7Ci0gICAgYnVmZmVyTW9kZV8gPSBSRUFEOwotICB9Ci0gIGlmIChyZWFkUG9pbnRfIDwgd3JpdGVQb2ludF8pIHsKLSAgICByZXR1cm4gYnVmZmVyX1tyZWFkUG9pbnRfKytdOwotICB9IGVsc2UgewotICAgIC8vIG5vIG1vcmUgZW50cmllcwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OnJlc2V0KCkgewotICBpZiAoYnVmZmVyTW9kZV8gPT0gV1JJVEUgfHwgd3JpdGVQb2ludF8gPiByZWFkUG9pbnRfKSB7Ci0gICAgVF9ERUJVRygiUmVzZXR0aW5nIGEgYnVmZmVyIHdpdGggdW5yZWFkIGVudHJpZXMiKTsKLSAgfQotICAvLyBDbGVhbiB1cCB0aGUgb2xkIGVudHJpZXMKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlUG9pbnRfOyBpKyspIHsKLSAgICBkZWxldGUgYnVmZmVyX1tpXTsKLSAgfQotICBidWZmZXJNb2RlXyA9IFdSSVRFOwotICB3cml0ZVBvaW50XyA9IDA7Ci0gIHJlYWRQb2ludF8gPSAwOwotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjppc0Z1bGwoKSB7Ci0gIHJldHVybiB3cml0ZVBvaW50XyA9PSBzaXplXzsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNFbXB0eSgpIHsKLSAgcmV0dXJuIHdyaXRlUG9pbnRfID09IDA7Ci19Ci0KLVRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7Ci0KLSAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKLSAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKLX0KLQotVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOgotICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7Ci0KLSAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKLSAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKLX0KLQotVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KToKLSAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpLAotICBvdXRwdXRUcmFuc3BvcnRfKG91dHB1dFRyYW5zcG9ydCkge307Ci0KLXZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpIHsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOwotCi0gIC8vIHNldCB0aGUgcmVhZCB0aW1lb3V0IHRvIDAgaWYgdGFpbGluZyBpcyByZXF1aXJlZAotICBpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRSZWFkVGltZW91dCgpOwotICBpZiAodGFpbCkgewotICAgIC8vIHNhdmUgb2xkIHJlYWQgdGltZW91dCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQKLSAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KFRGaWxlVHJhbnNwb3J0OjpUQUlMX1JFQURfVElNRU9VVCk7Ci0gIH0KLQotICB1aW50MzJfdCBudW1Qcm9jZXNzZWQgPSAwOwotICB3aGlsZSgxKSB7Ci0gICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5Ci0gICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAotICAgIHRyeSB7Ci0gICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICAgIG51bVByb2Nlc3NlZCsrOwotICAgICAgaWYgKCAobnVtRXZlbnRzID4gMCkgJiYgKG51bVByb2Nlc3NlZCA9PSBudW1FdmVudHMpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJiB0ZW9mKSB7Ci0gICAgICBpZiAoIXRhaWwpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKLSAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyByZXN0b3JlIG9sZCByZWFkIHRpbWVvdXQKLSAgaWYgKHRhaWwpIHsKLSAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3NDaHVuaygpIHsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOwotCi0gIHVpbnQzMl90IGN1ckNodW5rID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpOwotCi0gIHdoaWxlKDEpIHsKLSAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKLSAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0Ci0gICAgdHJ5IHsKLSAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgICAgaWYgKGN1ckNodW5rICE9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJiB0ZW9mKSB7Ci0gICAgICBicmVhazsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0ZSkgewotICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkM2E5Yi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSAiVFRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRocmlmdC5oIgotI2luY2x1ZGUgIlRQcm9jZXNzb3IuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotCi0vLyBEYXRhIHBlcnRhaW5pbmcgdG8gYSBzaW5nbGUgZXZlbnQKLXR5cGVkZWYgc3RydWN0IGV2ZW50SW5mbyB7Ci0gIHVpbnQ4X3QqIGV2ZW50QnVmZl87Ci0gIHVpbnQzMl90IGV2ZW50U2l6ZV87Ci0gIHVpbnQzMl90IGV2ZW50QnVmZlBvc187Ci0KLSAgZXZlbnRJbmZvKCk6ZXZlbnRCdWZmXyhOVUxMKSwgZXZlbnRTaXplXygwKSwgZXZlbnRCdWZmUG9zXygwKXt9OwotICB+ZXZlbnRJbmZvKCkgewotICAgIGlmIChldmVudEJ1ZmZfKSB7Ci0gICAgICBkZWxldGVbXSBldmVudEJ1ZmZfOwotICAgIH0KLSAgfQotfSBldmVudEluZm87Ci0KLS8vIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcmVhZCBzdGF0ZQotdHlwZWRlZiBzdHJ1Y3QgcmVhZFN0YXRlIHsKLSAgZXZlbnRJbmZvKiBldmVudF87Ci0KLSAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCi0gIHVpbnQ4X3QgICBldmVudFNpemVCdWZmX1s0XTsKLSAgdWludDhfdCAgIGV2ZW50U2l6ZUJ1ZmZQb3NfOwotICBib29sICAgICAgcmVhZGluZ1NpemVfOwotCi0gIC8vIHJlYWQgYnVmZmVyIHZhcmlhYmxlcwotICBpbnQzMl90ICBidWZmZXJQdHJfOwotICBpbnQzMl90ICBidWZmZXJMZW5fOwotCi0gIC8vIGxhc3Qgc3VjY2Vzc2Z1bCBkaXNwYXRjaCBwb2ludAotICBpbnQzMl90IGxhc3REaXNwYXRjaFB0cl87Ci0KLSAgdm9pZCByZXNldFN0YXRlKHVpbnQzMl90IGxhc3REaXNwYXRjaFB0cikgewotICAgIHJlYWRpbmdTaXplXyA9IHRydWU7Ci0gICAgZXZlbnRTaXplQnVmZlBvc18gPSAwOwotICAgIGxhc3REaXNwYXRjaFB0cl8gPSBsYXN0RGlzcGF0Y2hQdHI7Ci0gIH0KLQotICB2b2lkIHJlc2V0QWxsVmFsdWVzKCkgewotICAgIHJlc2V0U3RhdGUoMCk7Ci0gICAgYnVmZmVyUHRyXyA9IDA7Ci0gICAgYnVmZmVyTGVuXyA9IDA7Ci0gICAgaWYgKGV2ZW50XykgewotICAgICAgZGVsZXRlKGV2ZW50Xyk7Ci0gICAgfQotICAgIGV2ZW50XyA9IDA7Ci0gIH0KLQotICByZWFkU3RhdGUoKSB7Ci0gICAgZXZlbnRfID0gMDsKLSAgIHJlc2V0QWxsVmFsdWVzKCk7Ci0gIH0KLQotICB+cmVhZFN0YXRlKCkgewotICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOwotICAgIH0KLSAgfQotCi19IHJlYWRTdGF0ZTsKLQotLyoqCi0gKiBURmlsZVRyYW5zcG9ydEJ1ZmZlciAtIGJ1ZmZlciBjbGFzcyB1c2VkIGJ5IFRGaWxlVHJhbnNwb3J0IGZvciBxdWV1ZWluZyB1cCBldmVudHMKLSAqIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gIFNob3VsZCBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotICogIDEpIEJ1ZmZlciBjcmVhdGVkCi0gKiAgMikgQnVmZmVyIHdyaXR0ZW4gdG8gKGFkZEV2ZW50KQotICogIDMpIEJ1ZmZlciByZWFkIGZyb20gKGdldE5leHQpCi0gKiAgNCkgQnVmZmVyIHJlc2V0IChyZXNldCkKLSAqICA1KSBHbyBiYWNrIHRvIDIsIG9yIGRlc3Ryb3kgYnVmZmVyCi0gKgotICogVGhlIGJ1ZmZlciBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbiB0byBhZnRlciBpdCBpcyByZWFkIGZyb20sIHVubGVzcyBpdCBpcyByZXNldCBmaXJzdC4KLSAqIE5vdGU6IFRoZSBhYm92ZSBydWxlcyBhcmUgZW5mb3JjZWQgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgaXRzIHNvbGUgY2xpZW50IFRGaWxlVHJhbnNwb3J0Ci0gKiAgICAgICB3aGljaCB1c2VzIHRoZSBidWZmZXIgaW4gdGhpcyB3YXkuCi0gKgotICovCi1jbGFzcyBURmlsZVRyYW5zcG9ydEJ1ZmZlciB7Ci0gIHB1YmxpYzoKLSAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKTsKLSAgICB+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsKLQotICAgIGJvb2wgYWRkRXZlbnQoZXZlbnRJbmZvICpldmVudCk7Ci0gICAgZXZlbnRJbmZvKiBnZXROZXh0KCk7Ci0gICAgdm9pZCByZXNldCgpOwotICAgIGJvb2wgaXNGdWxsKCk7Ci0gICAgYm9vbCBpc0VtcHR5KCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlcigpOyAvLyBzaG91bGQgbm90IGJlIHVzZWQKLQotICAgIGVudW0gbW9kZSB7Ci0gICAgICBXUklURSwKLSAgICAgIFJFQUQKLSAgICB9OwotICAgIG1vZGUgYnVmZmVyTW9kZV87Ci0KLSAgICB1aW50MzJfdCB3cml0ZVBvaW50XzsKLSAgICB1aW50MzJfdCByZWFkUG9pbnRfOwotICAgIHVpbnQzMl90IHNpemVfOwotICAgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87Ci19OwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHJlYWQgZmlsZXMKLSAqLwotY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bUNodW5rcygpID0gMDsKLSAgdmlydHVhbCB1aW50MzJfdCBnZXRDdXJDaHVuaygpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspID0gMDsKLSAgdmlydHVhbCB2b2lkIHNlZWtUb0VuZCgpID0gMDsKLX07Ci0KLS8qKgotICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0cmFuc3BvcnRzIHVzZWQgdG8gd3JpdGUgZmlsZXMKLSAqLwotY2xhc3MgVEZpbGVXcml0ZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgPSAwOwotfTsKLQotLyoqCi0gKiBGaWxlIGltcGxlbWVudGF0aW9uIG9mIGEgdHJhbnNwb3J0LiBSZWFkcyBhbmQgd3JpdGVzIGFyZSBkb25lIHRvIGEKLSAqIGZpbGUgb24gZGlzay4KLSAqCi0gKi8KLWNsYXNzIFRGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVXcml0ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seT1mYWxzZSk7Ci0gIH5URmlsZVRyYW5zcG9ydCgpOwotCi0gIC8vIFRPRE86IHdoYXQgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIGZvciB0aGlzPwotICAvLyB0aGUgbG9nIGZpbGUgaXMgZ2VuZXJhbGx5IGFsd2F5cyBvcGVuCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgZmx1c2goKTsKLQotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIGJvb2wgcGVlaygpOwotCi0gIC8vIGxvZy1maWxlIHNwZWNpZmljIGZ1bmN0aW9ucwotICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOwotICB2b2lkIHNlZWtUb0VuZCgpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKLQotICAvLyBmb3IgY2hhbmdpbmcgdGhlIG91dHB1dCBmaWxlCi0gIHZvaWQgcmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RkOjpzdHJpbmcgZmlsZW5hbWUsIGludDY0X3Qgb2Zmc2V0KTsKLQotICAvLyBTZXR0ZXIvR2V0dGVyIGZ1bmN0aW9ucyBmb3IgdXNlci1jb250cm9sbGFibGUgb3B0aW9ucwotICB2b2lkIHNldFJlYWRCdWZmU2l6ZSh1aW50MzJfdCByZWFkQnVmZlNpemUpIHsKLSAgICBpZiAocmVhZEJ1ZmZTaXplKSB7Ci0gICAgICByZWFkQnVmZlNpemVfID0gcmVhZEJ1ZmZTaXplOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRSZWFkQnVmZlNpemUoKSB7Ci0gICAgcmV0dXJuIHJlYWRCdWZmU2l6ZV87Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50MzJfdCBUQUlMX1JFQURfVElNRU9VVCA9IC0xOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBOT19UQUlMX1JFQURfVElNRU9VVCA9IDA7Ci0gIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgewotICAgIHJlYWRUaW1lb3V0XyA9IHJlYWRUaW1lb3V0OwotICB9Ci0gIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSB7Ci0gICAgcmV0dXJuIHJlYWRUaW1lb3V0XzsKLSAgfQotCi0gIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgewotICAgIGlmIChjaHVua1NpemUpIHsKLSAgICAgIGNodW5rU2l6ZV8gPSBjaHVua1NpemU7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldENodW5rU2l6ZSgpIHsKLSAgICByZXR1cm4gY2h1bmtTaXplXzsKLSAgfQotCi0gIHZvaWQgc2V0RXZlbnRCdWZmZXJTaXplKHVpbnQzMl90IGJ1ZmZlclNpemUpIHsKLSAgICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIkNhbm5vdCBjaGFuZ2UgdGhlIGJ1ZmZlciBzaXplIGFmdGVyIHdyaXRlciB0aHJlYWQgc3RhcnRlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBldmVudEJ1ZmZlclNpemVfID0gYnVmZmVyU2l6ZTsKLSAgfQotCi0gIHVpbnQzMl90IGdldEV2ZW50QnVmZmVyU2l6ZSgpIHsKLSAgICByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsKLSAgfQotCi0gIHZvaWQgc2V0Rmx1c2hNYXhVcyh1aW50MzJfdCBmbHVzaE1heFVzKSB7Ci0gICAgaWYgKGZsdXNoTWF4VXMpIHsKLSAgICAgIGZsdXNoTWF4VXNfID0gZmx1c2hNYXhVczsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0Rmx1c2hNYXhVcygpIHsKLSAgICByZXR1cm4gZmx1c2hNYXhVc187Ci0gIH0KLQotICB2b2lkIHNldEZsdXNoTWF4Qnl0ZXModWludDMyX3QgZmx1c2hNYXhCeXRlcykgewotICAgIGlmIChmbHVzaE1heEJ5dGVzKSB7Ci0gICAgICBmbHVzaE1heEJ5dGVzXyA9IGZsdXNoTWF4Qnl0ZXM7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4Qnl0ZXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4Qnl0ZXNfOwotICB9Ci0KLSAgdm9pZCBzZXRNYXhFdmVudFNpemUodWludDMyX3QgbWF4RXZlbnRTaXplKSB7Ci0gICAgbWF4RXZlbnRTaXplXyA9IG1heEV2ZW50U2l6ZTsKLSAgfQotICB1aW50MzJfdCBnZXRNYXhFdmVudFNpemUoKSB7Ci0gICAgcmV0dXJuIG1heEV2ZW50U2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldE1heENvcnJ1cHRlZEV2ZW50cyh1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHMpIHsKLSAgICBtYXhDb3JydXB0ZWRFdmVudHNfID0gbWF4Q29ycnVwdGVkRXZlbnRzOwotICB9Ci0gIHVpbnQzMl90IGdldE1heENvcnJ1cHRlZEV2ZW50cygpIHsKLSAgICByZXR1cm4gbWF4Q29ycnVwdGVkRXZlbnRzXzsKLSAgfQotCi0gIHZvaWQgc2V0RW9mU2xlZXBUaW1lVXModWludDMyX3QgZW9mU2xlZXBUaW1lKSB7Ci0gICAgaWYgKGVvZlNsZWVwVGltZSkgewotICAgICAgZW9mU2xlZXBUaW1lXyA9IGVvZlNsZWVwVGltZTsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0RW9mU2xlZXBUaW1lVXMoKSB7Ci0gICAgcmV0dXJuIGVvZlNsZWVwVGltZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gYSBmaWxlCi0gIHZvaWQgZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4sIGJvb2wgYmxvY2tVbnRpbEZsdXNoKTsKLSAgYm9vbCBzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1lc3BlYyogZGVhZGxpbmUpOwotICBib29sIGluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpOwotCi0gIC8vIGNvbnRyb2wgZm9yIHdyaXRlciB0aHJlYWQKLSAgc3RhdGljIHZvaWQqIHN0YXJ0V3JpdGVyVGhyZWFkKHZvaWQqIHB0cikgewotICAgICgoKFRGaWxlVHJhbnNwb3J0KilwdHIpLT53cml0ZXJUaHJlYWQoKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdm9pZCB3cml0ZXJUaHJlYWQoKTsKLQotICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gYSBmaWxlCi0gIGV2ZW50SW5mbyogcmVhZEV2ZW50KCk7Ci0KLSAgLy8gZXZlbnQgY29ycnVwdGlvbi1yZWxhdGVkIGZ1bmN0aW9ucwotICBib29sIGlzRXZlbnRDb3JydXB0ZWQoKTsKLSAgdm9pZCBwZXJmb3JtUmVjb3ZlcnkoKTsKLQotICAvLyBVdGlsaXR5IGZ1bmN0aW9ucwotICB2b2lkIG9wZW5Mb2dGaWxlKCk7Ci0gIHZvaWQgZ2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXNwZWMqIHRzX25leHRfZmx1c2gpOwotCi0gIC8vIENsYXNzIHZhcmlhYmxlcwotICByZWFkU3RhdGUgcmVhZFN0YXRlXzsKLSAgdWludDhfdCogcmVhZEJ1ZmZfOwotICBldmVudEluZm8qIGN1cnJlbnRFdmVudF87Ci0KLSAgdWludDMyX3QgcmVhZEJ1ZmZTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVBRF9CVUZGX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7Ci0KLSAgaW50MzJfdCByZWFkVGltZW91dF87Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfUkVBRF9USU1FT1VUX01TID0gMjAwOwotCi0gIC8vIHNpemUgb2YgY2h1bmtzIHRoYXQgZmlsZSB3aWxsIGJlIHNwbGl0IHVwIGludG8KLSAgdWludDMyX3QgY2h1bmtTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7Ci0KLSAgLy8gc2l6ZSBvZiBldmVudCBidWZmZXJzCi0gIHVpbnQzMl90IGV2ZW50QnVmZmVyU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFID0gMTAwMDA7Ci0KLSAgLy8gbWF4IG51bWJlciBvZiBtaWNyb3NlY29uZHMgdGhhdCBjYW4gcGFzcyB3aXRob3V0IGZsdXNoaW5nCi0gIHVpbnQzMl90IGZsdXNoTWF4VXNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfVVMgPSAzMDAwMDAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGZsdXNoaW5nCi0gIHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfQllURVMgPSAxMDAwICogMTAyNDsKLQotICAvLyBtYXggZXZlbnQgc2l6ZQotICB1aW50MzJfdCBtYXhFdmVudFNpemVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfRVZFTlRfU0laRSA9IDA7Ci0KLSAgLy8gbWF4IG51bWJlciBvZiBjb3JydXB0ZWQgZXZlbnRzIHBlciBjaHVuawotICB1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBFT0YgaXMgaGl0Ci0gIHVpbnQzMl90IGVvZlNsZWVwVGltZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTID0gNTAwICogMTAwMDsKLQotICAvLyBzbGVlcCBkdXJhdGlvbiB3aGVuIGEgY29ycnVwdGVkIGV2ZW50IGlzIGVuY291bnRlcmVkCi0gIHVpbnQzMl90IGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMgPSAxICogMTAwMCAqIDEwMDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gaW4gc2Vjb25kcyB3aGVuIGFuIElPIGVycm9yIGlzIGVuY291bnRlcmVkIGluIHRoZSB3cml0ZXIgdGhyZWFkCi0gIHVpbnQzMl90IHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMgPSA2MCAqIDEwMDAgKiAxMDAwOwotCi0gIC8vIHdyaXRlciB0aHJlYWQgaWQKLSAgcHRocmVhZF90IHdyaXRlclRocmVhZElkXzsKLQotICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKLSAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZGVxdWV1ZUJ1ZmZlcl87Ci0gIFRGaWxlVHJhbnNwb3J0QnVmZmVyICplbnF1ZXVlQnVmZmVyXzsKLQotICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKLSAgcHRocmVhZF9jb25kX3Qgbm90RnVsbF8sIG5vdEVtcHR5XzsKLSAgdm9sYXRpbGUgYm9vbCBjbG9zaW5nXzsKLQotICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCi0gIHB0aHJlYWRfY29uZF90IGZsdXNoZWRfOwotICB2b2xhdGlsZSBib29sIGZvcmNlRmx1c2hfOwotCi0gIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKLSAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKLQotICAvLyBGaWxlIGluZm9ybWF0aW9uCi0gIHN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKLSAgaW50IGZkXzsKLQotICAvLyBXaGV0aGVyIHRoZSB3cml0ZXIgdGhyZWFkIGFuZCBidWZmZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZAotICBib29sIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXzsKLQotICAvLyBPZmZzZXQgd2l0aGluIHRoZSBmaWxlCi0gIG9mZl90IG9mZnNldF87Ci0KLSAgLy8gZXZlbnQgY29ycnVwdGlvbiBpbmZvcm1hdGlvbgotICB1aW50MzJfdCBsYXN0QmFkQ2h1bmtfOwotICB1aW50MzJfdCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXzsKLQotICBib29sIHJlYWRPbmx5XzsKLX07Ci0KLS8vIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBFT0YgaXMgaGl0Ci1jbGFzcyBURU9GRXhjZXB0aW9uIDogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgVEVPRkV4Y2VwdGlvbigpOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpIHt9OwotfTsKLQotCi0vLyB3cmFwcGVyIGNsYXNzIHRvIHByb2Nlc3MgZXZlbnRzIGZyb20gYSBmaWxlIGNvbnRhaW5pbmcgdGhyaWZ0IGV2ZW50cwotY2xhc3MgVEZpbGVQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHRoYXQgZGVmYXVsdHMgb3V0cHV0IHRyYW5zcG9ydCB0byBudWxsIHRyYW5zcG9ydAotICAgKgotICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKLSAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5Ci0gICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBmaWxlIHRyYW5zcG9ydAotICAgKi8KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7Ci0KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKLSAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5Ci0gICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAotICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKLSAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgLyoqCi0gICAqIHByb2Nlc3NlcyBldmVudHMgZnJvbSB0aGUgZmlsZQotICAgKgotICAgKiBAcGFyYW0gbnVtRXZlbnRzIG51bWJlciBvZiBldmVudHMgdG8gcHJvY2VzcyAoMCBmb3IgdW5saW1pdGVkKQotICAgKiBAcGFyYW0gdGFpbCB0YWlscyB0aGUgZmlsZSBpZiB0cnVlCi0gICAqLwotICB2b2lkIHByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpOwotCi0gIC8qKgotICAgKiBwcm9jZXNzIGV2ZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjaHVuawotICAgKgotICAgKi8KLSAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKLX07Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNTk3ZS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cENsaWVudC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKLX0KLQotVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKLX0KLQotVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpIHt9Ci0KLXZvaWQgVEh0dHBDbGllbnQ6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgewotICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7Ci0gIGlmIChjb2xvbiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IHN6ID0gY29sb24gLSBoZWFkZXI7Ci0gIGNoYXIqIHZhbHVlID0gY29sb24rMTsKLQotICBpZiAoc3RybmNtcChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIsIHN6KSA9PSAwKSB7Ci0gICAgaWYgKHN0cnN0cih2YWx1ZSwgImNodW5rZWQiKSAhPSBOVUxMKSB7Ci0gICAgICBjaHVua2VkXyA9IHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHN0cm5jbXAoaGVhZGVyLCAiQ29udGVudC1MZW5ndGgiLCBzeikgPT0gMCkgewotICAgIGNodW5rZWRfID0gZmFsc2U7Ci0gICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKLSAgfQotfQotCi1ib29sIFRIdHRwQ2xpZW50OjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7Ci0gIGNoYXIqIGh0dHAgPSBzdGF0dXM7Ci0KLSAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOwotICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotCi0gICpjb2RlID0gJ1wwJzsKLSAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpOwotCi0gIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOwotICBpZiAobXNnID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci0gICptc2cgPSAnXDAnOwotCi0gIGlmIChzdHJjbXAoY29kZSwgIjIwMCIpID09IDApIHsKLSAgICAvLyBIVFRQIDIwMCA9IE9LLCB3ZSBnb3QgdGhlIHJlc3BvbnNlCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKGNvZGUsICIxMDAiKSA9PSAwKSB7Ci0gICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIFRIdHRwQ2xpZW50OjpmbHVzaCgpIHsKLSAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBsZW47Ci0gIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7Ci0KLSAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgotICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJQT1NUICIgPDwgcGF0aF8gPDwgIiBIVFRQLzEuMSIgPDwgQ1JMRiA8PAotICAgICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PAotICAgICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRiA8PAotICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIlVzZXItQWdlbnQ6IFRocmlmdC8iIDw8IFZFUlNJT04gPDwgIiAoQysrL1RIdHRwQ2xpZW50KSIgPDwgQ1JMRiA8PAotICAgIENSTEY7Ci0gIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwotCi0gIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBoZWFkZXIuc2l6ZSgpKTsKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotCi0gIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKLSAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7Ci0gIHJlYWRIZWFkZXJzXyA9IHRydWU7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIwNjNkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOwotCi0gIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoPSIiKTsKLQotICB2aXJ0dWFsIH5USHR0cENsaWVudCgpOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKTsKLSAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDg2OWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1USHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gIFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCkgewotfQotCi1USHR0cFNlcnZlcjo6flRIdHRwU2VydmVyKCkge30KLQotdm9pZCBUSHR0cFNlcnZlcjo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7Ci0gIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKLSAgaWYgKGNvbG9uID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3Qgc3ogPSBjb2xvbiAtIGhlYWRlcjsKLSAgY2hhciogdmFsdWUgPSBjb2xvbisxOwotCi0gIGlmIChzdHJuY21wKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIiwgc3opID09IDApIHsKLSAgICBpZiAoc3Ryc3RyKHZhbHVlLCAiY2h1bmtlZCIpICE9IE5VTEwpIHsKLSAgICAgIGNodW5rZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3RybmNtcChoZWFkZXIsICJDb250ZW50LUxlbmd0aCIsIHN6KSA9PSAwKSB7Ci0gICAgY2h1bmtlZF8gPSBmYWxzZTsKLSAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOwotICB9Ci19Ci0KLWJvb2wgVEh0dHBTZXJ2ZXI6OnBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIHsKLSAgY2hhciogbWV0aG9kID0gc3RhdHVzOwotCi0gIGNoYXIqIHBhdGggPSBzdHJjaHIobWV0aG9kLCAnICcpOwotICBpZiAocGF0aCA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotCi0gICpwYXRoID0gJ1wwJzsKLSAgd2hpbGUgKCooKytwYXRoKSA9PSAnICcpOwotCi0gIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKLSAgaWYgKGh0dHAgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7Ci0gIH0KLSAgKmh0dHAgPSAnXDAnOwotCi0gIGlmIChzdHJjbXAobWV0aG9kLCAiUE9TVCIpID09IDApIHsKLSAgICAvLyBQT1NUIG1ldGhvZCBvaywgbG9va2luZyBmb3IgY29udGVudC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1cyAodW5zdXBwb3J0ZWQgbWV0aG9kKTogIikgKyBzdGF0dXMpOwotfQotCi12b2lkIFRIdHRwU2VydmVyOjpmbHVzaCgpIHsKLSAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBsZW47Ci0gIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7Ci0KLSAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgotICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwKLSAgICAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwKLSAgICAiU2VydmVyOiBUaHJpZnQvIiA8PCBWRVJTSU9OIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PAotICAgICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRiA8PAotICAgICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBDUkxGIDw8Ci0gICAgQ1JMRjsKLSAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAotICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIGhlYWRlci5zaXplKCkpOwotICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0KLSAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcwotICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKLX0KLQotc3RkOjpzdHJpbmcgVEh0dHBTZXJ2ZXI6OmdldFRpbWVSRkMxMTIzKCkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0In07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXSA9IHsiSmFuIiwiRmViIiwiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsIkF1ZyIsICJTZXAiLCAiT2N0IiwiTm92IiwiRGVjIn07Ci0gIGNoYXIgYnVmZlsxMjhdOwotICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7Ci0gIHRtKiBicm9rZW5fdCA9IGdtdGltZSgmdCk7Ci0KLSAgc3ByaW50ZihidWZmLCIlcywgJWQgJXMgJWQgJWQ6JWQ6JWQgR01UIiwKLSAgICAgICAgICBEYXlzW2Jyb2tlbl90LT50bV93ZGF5XSwgYnJva2VuX3QtPnRtX21kYXksIE1vbnRoc1ticm9rZW5fdC0+dG1fbW9uXSwKLSAgICAgICAgICBicm9rZW5fdC0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX2hvdXIsYnJva2VuX3QtPnRtX21pbixicm9rZW5fdC0+dG1fc2VjKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmYpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMzQwOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKLQotICB2aXJ0dWFsIH5USHR0cFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHZvaWQgcmVhZEhlYWRlcnMoKTsKLSAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7Ci0gIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKLSAgc3RkOjpzdHJpbmcgZ2V0VGltZVJGQzExMjMoKTsKLQotfTsKLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIEhUVFAgcHJvdG9jb2wKLSAqLwotY2xhc3MgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIdHRwU2VydmVyKHRyYW5zKSk7Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDEwZDZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCi1jb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKLWNvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOwotCi1USHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKLSAgcmVhZEhlYWRlcnNfKHRydWUpLAotICBjaHVua2VkXyhmYWxzZSksCi0gIGNodW5rZWREb25lXyhmYWxzZSksCi0gIGNodW5rU2l6ZV8oMCksCi0gIGNvbnRlbnRMZW5ndGhfKDApLAotICBodHRwQnVmXyhOVUxMKSwKLSAgaHR0cFBvc18oMCksCi0gIGh0dHBCdWZMZW5fKDApLAotICBodHRwQnVmU2l6ZV8oMTAyNCkgewotICBpbml0KCk7Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OmluaXQoKSB7Ci0gIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6bWFsbG9jKGh0dHBCdWZTaXplXysxKTsKLSAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5LiIpOwotICB9Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci19Ci0KLVRIdHRwVHJhbnNwb3J0Ojp+VEh0dHBUcmFuc3BvcnQoKSB7Ci0gIGlmIChodHRwQnVmXyAhPSBOVUxMKSB7Ci0gICAgc3RkOjpmcmVlKGh0dHBCdWZfKTsKLSAgfQotfQotCi11aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAocmVhZEJ1ZmZlcl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7Ci0gICAgcmVhZEJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgICB1aW50MzJfdCBnb3QgPSByZWFkTW9yZURhdGEoKTsKLSAgICBpZiAoZ290ID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIGxlbik7Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7Ci0gIC8vIFJlYWQgYW55IHBlbmRpbmcgY2h1bmtlZCBkYXRhIChmb290ZXJzIGV0Yy4pCi0gIGlmIChjaHVua2VkXykgewotICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7Ci0gICAgICByZWFkQ2h1bmtlZCgpOwotICAgIH0KLSAgfQotfQotCi11aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZE1vcmVEYXRhKCkgewotICB1aW50MzJfdCBzaXplOwotCi0gIC8vIEdldCBtb3JlIGRhdGEhCi0gIHJlZmlsbCgpOwotCi0gIGlmIChyZWFkSGVhZGVyc18pIHsKLSAgICByZWFkSGVhZGVycygpOwotICB9Ci0KLSAgaWYgKGNodW5rZWRfKSB7Ci0gICAgc2l6ZSA9IHJlYWRDaHVua2VkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc2l6ZSA9IHJlYWRDb250ZW50KGNvbnRlbnRMZW5ndGhfKTsKLSAgfQotICByZWFkSGVhZGVyc18gPSB0cnVlOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDaHVua2VkKCkgewotICB1aW50MzJfdCBsZW5ndGggPSAwOwotCi0gIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOwotICB1aW50MzJfdCBjaHVua1NpemUgPSBwYXJzZUNodW5rU2l6ZShsaW5lKTsKLSAgaWYgKGNodW5rU2l6ZSA9PSAwKSB7Ci0gICAgcmVhZENodW5rZWRGb290ZXJzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gUmVhZCBkYXRhIGNvbnRlbnQKLSAgICBsZW5ndGggKz0gcmVhZENvbnRlbnQoY2h1bmtTaXplKTsKLSAgICAvLyBSZWFkIHRyYWlsaW5nIENSTEYgYWZ0ZXIgY29udGVudAotICAgIHJlYWRMaW5lKCk7Ci0gIH0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotdm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVhZENodW5rZWRGb290ZXJzKCkgewotICAvLyBFbmQgb2YgZGF0YSwgcmVhZCBmb290ZXIgbGluZXMgdW50aWwgYSBibGFuayBvbmUgYXBwZWFycwotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOwotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgewotICAgICAgY2h1bmtlZERvbmVfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi11aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cGFyc2VDaHVua1NpemUoY2hhciogbGluZSkgewotICBjaGFyKiBzZW1pID0gc3RyY2hyKGxpbmUsICc7Jyk7Ci0gIGlmIChzZW1pICE9IE5VTEwpIHsKLSAgICAqc2VtaSA9ICdcMCc7Ci0gIH0KLSAgaW50IHNpemUgPSAwOwotICBzc2NhbmYobGluZSwgIiV4IiwgJnNpemUpOwotICByZXR1cm4gKHVpbnQzMl90KXNpemU7Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ29udGVudCh1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IG5lZWQgPSBzaXplOwotICB3aGlsZSAobmVlZCA+IDApIHsKLSAgICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187Ci0gICAgaWYgKGF2YWlsID09IDApIHsKLSAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIKLSAgICAgIGh0dHBQb3NfID0gMDsKLSAgICAgIGh0dHBCdWZMZW5fID0gMDsKLSAgICAgIHJlZmlsbCgpOwotCi0gICAgICAvLyBOb3cgaGF2ZSBhdmFpbGFibGUgaG93ZXZlciBtdWNoIHdlIHJlYWQKLSAgICAgIGF2YWlsID0gaHR0cEJ1Zkxlbl87Ci0gICAgfQotICAgIHVpbnQzMl90IGdpdmUgPSBhdmFpbDsKLSAgICBpZiAobmVlZCA8IGdpdmUpIHsKLSAgICAgIGdpdmUgPSBuZWVkOwotICAgIH0KLSAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfK2h0dHBQb3NfKSwgZ2l2ZSk7Ci0gICAgaHR0cFBvc18gKz0gZ2l2ZTsKLSAgICBuZWVkIC09IGdpdmU7Ci0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWNoYXIqIFRIdHRwVHJhbnNwb3J0OjpyZWFkTGluZSgpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBlb2wgPSBOVUxMOwotCi0gICAgZW9sID0gc3Ryc3RyKGh0dHBCdWZfK2h0dHBQb3NfLCBDUkxGKTsKLQotICAgIC8vIE5vIENSTEYgeWV0PwotICAgIGlmIChlb2wgPT0gTlVMTCkgewotICAgICAgLy8gU2hpZnQgd2hhdGV2ZXIgd2UgaGF2ZSBub3cgdG8gZnJvbnQgYW5kIHJlZmlsbAotICAgICAgc2hpZnQoKTsKLSAgICAgIHJlZmlsbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUKLSAgICAgICplb2wgPSAnXDAnOwotICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfK2h0dHBQb3NfOwotICAgICAgaHR0cFBvc18gPSAoZW9sLWh0dHBCdWZfKSArIENSTEZfTEVOOwotICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBUSHR0cFRyYW5zcG9ydDo6c2hpZnQoKSB7Ci0gIGlmIChodHRwQnVmTGVuXyA+IGh0dHBQb3NfKSB7Ci0gICAgLy8gU2hpZnQgZG93biByZW1haW5pbmcgZGF0YSBhbmQgcmVhZCBtb3JlCi0gICAgdWludDMyX3QgbGVuZ3RoID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKLSAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXytodHRwUG9zXywgbGVuZ3RoKTsKLSAgICBodHRwQnVmTGVuXyA9IGxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICBodHRwQnVmTGVuXyA9IDA7Ci0gIH0KLSAgaHR0cFBvc18gPSAwOwotICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOwotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWZpbGwoKSB7Ci0gIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87Ci0gIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKLSAgICBodHRwQnVmU2l6ZV8gKj0gMjsKLSAgICBodHRwQnVmXyA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXysxKTsKLSAgICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeS4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZWFkIG1vcmUgZGF0YQotICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cEJ1Zkxlbl8pLCBodHRwQnVmU2l6ZV8taHR0cEJ1Zkxlbl8pOwotICBodHRwQnVmTGVuXyArPSBnb3Q7Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci0KLSAgaWYgKGdvdCA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKLSAgfQotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkSGVhZGVycygpIHsKLSAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcwotICBjb250ZW50TGVuZ3RoXyA9IDA7Ci0gIGNodW5rZWRfID0gZmFsc2U7Ci0gIGNodW5rZWREb25lXyA9IGZhbHNlOwotICBjaHVua1NpemVfID0gMDsKLQotICAvLyBDb250cm9sIHN0YXRlIGZsb3cKLSAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOwotCi0gIC8vIExvb3AgdW50aWwgaGVhZGVycyBhcmUgZmluaXNoZWQKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKLQotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgewotICAgICAgaWYgKGZpbmlzaGVkKSB7Ci0gICAgICAgIHJlYWRIZWFkZXJzXyA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBNdXN0IGhhdmUgYmVlbiBhbiBIVFRQIDEwMCwga2VlcCBnb2luZyBmb3IgYW5vdGhlciBzdGF0dXMgbGluZQotICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKLSAgICAgICAgc3RhdHVzTGluZSA9IGZhbHNlOwotICAgICAgICBmaW5pc2hlZCA9IHBhcnNlU3RhdHVzTGluZShsaW5lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmLCBsZW4pOwotfQotCi19fX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWRjYmQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRocmlmdCB0cmFuc3BvcnQuIFRoaXMgd2FzIGlycml0YXRpbmcKLSAqIHRvIHdyaXRlLCBidXQgdGhlIGFsdGVybmF0aXZlcyBpbiBDKysgbGFuZCBhcmUgZGF1bnRpbmcuIExpbmtpbmcgQ1VSTAotICogcmVxdWlyZXMgMjMgZHluYW1pYyBsaWJyYXJpZXMgbGFzdCB0aW1lIEkgY2hlY2tlZCAoV1RGPyE/KS4gQWxsIHdlIGhhdmUKLSAqIGhlcmUgaXMgYSBWRVJZIGJhc2ljIEhUVFAvMS4xIGNsaWVudCB3aGljaCBzdXBwb3J0cyBIVFRQIDEwMCBDb250aW51ZSwKLSAqIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcsIGtlZXBhbGl2ZSwgZXRjLiBUZXN0ZWQgYWdhaW5zdCBBcGFjaGUuCi0gKi8KLWNsYXNzIFRIdHRwVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKLQotICB2aXJ0dWFsIH5USHR0cFRyYW5zcG9ydCgpOwotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgcmVhZEVuZCgpOwotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKLQotIHByb3RlY3RlZDoKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotCi0gIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOwotICBUTWVtb3J5QnVmZmVyIHJlYWRCdWZmZXJfOwotCi0gIGJvb2wgcmVhZEhlYWRlcnNfOwotICBib29sIGNodW5rZWRfOwotICBib29sIGNodW5rZWREb25lXzsKLSAgdWludDMyX3QgY2h1bmtTaXplXzsKLSAgdWludDMyX3QgY29udGVudExlbmd0aF87Ci0KLSAgY2hhciogaHR0cEJ1Zl87Ci0gIHVpbnQzMl90IGh0dHBQb3NfOwotICB1aW50MzJfdCBodHRwQnVmTGVuXzsKLSAgdWludDMyX3QgaHR0cEJ1ZlNpemVfOwotCi0gIHZpcnR1YWwgdm9pZCBpbml0KCk7Ci0KLSAgdWludDMyX3QgcmVhZE1vcmVEYXRhKCk7Ci0gIGNoYXIqIHJlYWRMaW5lKCk7Ci0KLSAgdm9pZCByZWFkSGVhZGVycygpOwotICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSA9IDA7Ci0KLSAgdWludDMyX3QgcmVhZENodW5rZWQoKTsKLSAgdm9pZCByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKLSAgdWludDMyX3QgcGFyc2VDaHVua1NpemUoY2hhciogbGluZSk7Ci0KLSAgdWludDMyX3QgcmVhZENvbnRlbnQodWludDMyX3Qgc2l6ZSk7Ci0KLSAgdm9pZCByZWZpbGwoKTsKLSAgdm9pZCBzaGlmdCgpOwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBDUkxGOwotICBzdGF0aWMgY29uc3QgaW50IENSTEZfTEVOOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNGZkNS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLSNpZm5kZWYgQUZfTE9DQUwKLSNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQotVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGludFNvY2sxXygtMSksCi0gIGludFNvY2syXygtMSkge30KLQotVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpIDoKLSAgcG9ydF8ocG9ydCksCi0gIHNlcnZlclNvY2tldF8oLTEpLAotICBhY2NlcHRCYWNrbG9nXygxMDI0KSwKLSAgc2VuZFRpbWVvdXRfKHNlbmRUaW1lb3V0KSwKLSAgcmVjdlRpbWVvdXRfKHJlY3ZUaW1lb3V0KSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGludFNvY2sxXygtMSksCi0gIGludFNvY2syXygtMSkge30KLQotVFNlcnZlclNvY2tldDo6flRTZXJ2ZXJTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KSB7Ci0gIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgewotICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KSB7Ci0gIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7Ci0gIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7Ci0gIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSB7Ci0gIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7Ci0gIGludCBzdlsyXTsKLSAgaWYgKC0xID09IHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgIiwgZXJybm8pOwotICAgIGludFNvY2sxXyA9IC0xOwotICAgIGludFNvY2syXyA9IC0xOwotICB9IGVsc2UgewotICAgIGludFNvY2sxXyA9IHN2WzFdOwotICAgIGludFNvY2syXyA9IHN2WzBdOwotICB9Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07Ci0gIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJnZXRhZGRyaW5mbyAlZDogJXMiLCBlcnJvciwgZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBTZXQgcmV1c2FkZHJlc3MgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAotICBpbnQgb25lID0gMTsKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAotICAgICAgICAgICAgICAgICAgICAgICAmb25lLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SRVVTRUFERFIgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19SRVVTRUFERFIiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCi0gIGlmICh0Y3BTZW5kQnVmZmVyXyA+IDApIHsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnRjcFNlbmRCdWZmZXJfLCBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgIiwgZXJybm9fY29weSk7Ci0gICAgICBjbG9zZSgpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGNwUmVjdkJ1ZmZlcl8sIHNpemVvZih0Y3BSZWN2QnVmZmVyXykpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZWZlciBhY2NlcHQKLSAgI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgVENQX0RFRkVSX0FDQ0VQVCwKLSAgICAgICAgICAgICAgICAgICAgICAgJm9uZSwgc2l6ZW9mKG9uZSkpKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0RFRkVSX0FDQ0VQVCAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFRDUF9ERUZFUl9BQ0NFUFQiLCBlcnJub19jb3B5KTsKLSAgfQotICAjZW5kaWYgLy8gI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKLQotICAjaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIAotICAgICAgICAgICZ6ZXJvLCBzaXplb2YoemVybykpKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBlcnJubyk7Ci0gICAgfQotICB9Ci0gICNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKLQotICAvLyBUdXJuIGxpbmdlciBvZmYsIGRvbid0IHdhbnQgdG8gYmxvY2sgb24gY2FsbHMgdG8gY2xvc2UKLSAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OwotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICZsaW5nLCBzaXplb2YobGluZykpKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAmb25lLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKLSAgaW50IGZsYWdzID0gZmNudGwoc2VydmVyU29ja2V0XywgRl9HRVRGTCwgMCk7Ci0gIGlmIChmbGFncyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgZmNudGwoKSBGX0dFVEZMICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgaWYgKC0xID09IGZjbnRsKHNlcnZlclNvY2tldF8sIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGZjbnRsKCkgT19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZmNudGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KLSAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFNPX1JFVVNFQUREUiBkb2Vzbid0Ci0gIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgotICBpbnQgcmV0cmllcyA9IDA7Ci0gIGRvIHsKLSAgICBpZiAoMCA9PSBiaW5kKHNlcnZlclNvY2tldF8sIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bwotICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChzbGVlcChyZXRyeURlbGF5XykgPT0gMCkpOwotCi0gIC8vIGZyZWUgYWRkcmluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5Ci0gIGlmIChyZXRyaWVzID4gcmV0cnlMaW1pdF8pIHsKLSAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKLSAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7Ci0gICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGJpbmQiKTsKLSAgfQotCi0gIC8vIENhbGwgbGlzdGVuCi0gIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKLX0KLQotc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgewotICBpZiAoc2VydmVyU29ja2V0XyA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFNlcnZlclNvY2tldCBub3QgbGlzdGVuaW5nIik7Ci0gIH0KLQotICBzdHJ1Y3QgcG9sbGZkIGZkc1syXTsKLQotICBpbnQgbWF4RWludHJzID0gNTsKLSAgaW50IG51bUVpbnRycyA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7Ci0gICAgZmRzWzBdLmZkID0gc2VydmVyU29ja2V0XzsKLSAgICBmZHNbMF0uZXZlbnRzID0gUE9MTElOOwotICAgIGlmIChpbnRTb2NrMl8gPj0gMCkgewotICAgICAgZmRzWzFdLmZkID0gaW50U29jazJfOwotICAgICAgZmRzWzFdLmV2ZW50cyA9IFBPTExJTjsKLSAgICB9Ci0gICAgaW50IHJldCA9IHBvbGwoZmRzLCAyLCAtMSk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgLy8gZXJyb3IgY2FzZXMKLSAgICAgIGlmIChlcnJubyA9PSBFSU5UUiAmJiAobnVtRWludHJzKysgPCBtYXhFaW50cnMpKSB7Ci0gICAgICAgIC8vIEVJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQotICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBwb2xsKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7Ci0gICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0gICAgICAvLyBDaGVjayBmb3IgYW4gaW50ZXJydXB0IHNpZ25hbAotICAgICAgaWYgKGludFNvY2syXyA+PSAwICYmIChmZHNbMV0ucmV2ZW50cyAmIFBPTExJTikpIHsKLSAgICAgICAgaW50OF90IGJ1ZjsKLSAgICAgICAgaWYgKC0xID09IHJlY3YoaW50U29jazJfLCAmYnVmLCBzaXplb2YoaW50OF90KSwgMCkpIHsKLSAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcmVjdigpIGludGVycnVwdCAiLCBlcnJubyk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgYmVpbmcgcmVhZHkKLSAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcG9sbCAwIik7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLSAgfQotCi0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGNsaWVudEFkZHJlc3M7Ci0gIGludCBzaXplID0gc2l6ZW9mKGNsaWVudEFkZHJlc3MpOwotICBpbnQgY2xpZW50U29ja2V0ID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2xlbl90ICopICZzaXplKTsKLQotICBpZiAoY2xpZW50U29ja2V0IDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCi0gIGludCBmbGFncyA9IGZjbnRsKGNsaWVudFNvY2tldCwgRl9HRVRGTCwgMCk7Ci0gIGlmIChmbGFncyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIGZjbnRsKCkgRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJmY250bChGX0dFVEZMKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgaWYgKC0xID09IGZjbnRsKGNsaWVudFNvY2tldCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBmY250bCgpIEZfU0VURkwgfk9fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiZmNudGwoRl9TRVRGTCkiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCkpOwotICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgewotICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKLSAgfQotICBpZiAocmVjdlRpbWVvdXRfID4gMCkgewotICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKLSAgfQotCi0gIHJldHVybiBjbGllbnQ7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgewotICBpZiAoaW50U29jazFfID49IDApIHsKLSAgICBpbnQ4X3QgYnl0ZSA9IDA7Ci0gICAgaWYgKC0xID09IHNlbmQoaW50U29jazFfLCAmYnl0ZSwgc2l6ZW9mKGludDhfdCksIDApKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSBzZW5kKCkgIiwgZXJybm8pOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgewotICBpZiAoc2VydmVyU29ja2V0XyA+PSAwKSB7Ci0gICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgU0hVVF9SRFdSKTsKLSAgICA6OmNsb3NlKHNlcnZlclNvY2tldF8pOwotICB9Ci0gIGlmIChpbnRTb2NrMV8gPj0gMCkgewotICAgIDo6Y2xvc2UoaW50U29jazFfKTsKLSAgfQotICBpZiAoaW50U29jazJfID49IDApIHsKLSAgICA6OmNsb3NlKGludFNvY2syXyk7Ci0gIH0KLSAgc2VydmVyU29ja2V0XyA9IC0xOwotICBpbnRTb2NrMV8gPSAtMTsKLSAgaW50U29jazJfID0gLTE7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiZTAxNy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXyAxCi0KLSNpbmNsdWRlICJUU2VydmVyVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLWNsYXNzIFRTb2NrZXQ7Ci0KLS8qKgotICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKLSAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2VydmVyU29ja2V0KGludCBwb3J0KTsKLSAgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOwotCi0gIH5UU2VydmVyU29ja2V0KCk7Ci0KLSAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOwotICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7Ci0KLSAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKLSAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKLQotICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOwotICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOwotCi0gIHZvaWQgbGlzdGVuKCk7Ci0gIHZvaWQgY2xvc2UoKTsKLQotICB2b2lkIGludGVycnVwdCgpOwotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0KLSBwcml2YXRlOgotICBpbnQgcG9ydF87Ci0gIGludCBzZXJ2ZXJTb2NrZXRfOwotICBpbnQgYWNjZXB0QmFja2xvZ187Ci0gIGludCBzZW5kVGltZW91dF87Ci0gIGludCByZWN2VGltZW91dF87Ci0gIGludCByZXRyeUxpbWl0XzsKLSAgaW50IHJldHJ5RGVsYXlfOwotICBpbnQgdGNwU2VuZEJ1ZmZlcl87Ci0gIGludCB0Y3BSZWN2QnVmZmVyXzsKLQotICBpbnQgaW50U29jazFfOwotICBpbnQgaW50U29jazJfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmJjNmMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSAiVFRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgotICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFNlcnZlclRyYW5zcG9ydCgpIHt9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gUHJpb3IgdG8gdGhpcwotICAgKiBjYWxsIG1vc3QgdHJhbnNwb3J0cyB3aWxsIG5vdCByZXR1cm4gYW55dGhpbmcgd2hlbiBhY2NlcHQgaXMgY2FsbGVkLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd2Ugd2VyZSB1bmFibGUgdG8gbGlzdGVuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgbGlzdGVuKCkge30KLQotICAvKioKLSAgICogR2V0cyBhIG5ldyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IG9iamVjdCBhbmQgcGFzc2VzIGl0IHRvIHRoZQotICAgKiBjYWxsZXIuIE5vdGUgdGhhdCBpdCBpcyB0aGUgZXhwbGljaXQgZHV0eSBvZiB0aGUgY2FsbGVyIHRvIGZyZWUgdGhlCi0gICAqIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZXR1cm5lZCBUVHJhbnNwb3J0IG9iamVjdCBtdXN0IGFsd2F5cyBiZSBpbiB0aGUKLSAgICogb3BlbmVkIHN0YXRlLiBOVUxMIHNob3VsZCBuZXZlciBiZSByZXR1cm5lZCwgaW5zdGVhZCBhbiBFeGNlcHRpb24gc2hvdWxkCi0gICAqIGFsd2F5cyBiZSB0aHJvd24uCi0gICAqCi0gICAqIEByZXR1cm4gQSBuZXcgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEZvciAic21hcnQiIFRTZXJ2ZXJUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgd29yayBpbiBhIG11bHRpCi0gICAqIHRocmVhZGVkIGNvbnRleHQgdGhpcyBjYW4gYmUgdXNlZCB0byBicmVhayBvdXQgb2YgYW4gYWNjZXB0KCkgY2FsbC4KLSAgICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdHJhbnNwb3J0IHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCi0gICAqIHdpdGggdGhlIGludGVycnVwdGVkIGVycm9yIGNvZGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30KLQotICAvKioKLSAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgVFNlcnZlclRyYW5zcG9ydCgpIHt9Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGZvciBhY2NlcHQuCi0gICAqCi0gICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4YTU3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IG1lYW50IGZvciB0ZXN0aW5nLiAgSXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQuCi0gKiBDYWxscyB0byByZWFkIGFyZSBwYXNzZWQgdGhyb3VnaCB3aXRoIHNvbWUgcHJvYmFiaWxpdHkuICBPdGhlcndpc2UsCi0gKiB0aGUgcmVhZCBhbW91bnQgaXMgcmFuZG9tbHkgcmVkdWNlZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRocm91Z2guCi0gKgotICovCi1jbGFzcyBUU2hvcnRSZWFkVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFNob3J0UmVhZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIGRvdWJsZSBmdWxsX3Byb2IpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIGZ1bGxQcm9iXyhmdWxsX3Byb2IpCi0gIHt9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KLQotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgewotICAgICAgbGVuID0gMSArIHJhbmQoKSVsZW47Ci0gICAgfQotICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7Ci0gIH0KLQotICB2b2lkIGZsdXNoKCkgewotICAgIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KLQotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLSAgZG91YmxlIGZ1bGxQcm9iXzsKLX07Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4YTU3NC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotVFNpbXBsZUZpbGVUcmFuc3BvcnQ6OgotVFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCwgYm9vbCB3cml0ZSkKLSAgICA6IFRGRFRyYW5zcG9ydCgtMSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSB7Ci0gIGludCBmbGFncyA9IDA7Ci0gIGlmIChyZWFkICYmIHdyaXRlKSB7Ci0gICAgZmxhZ3MgPSBPX1JEV1I7Ci0gIH0gZWxzZSBpZiAocmVhZCkgewotICAgIGZsYWdzID0gT19SRE9OTFk7Ci0gIH0gZWxzZSBpZiAod3JpdGUpIHsKLSAgICBmbGFncyA9IE9fV1JPTkxZOwotICB9IGVsc2UgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5laXRoZXIgUkVBRCBub3IgV1JJVEUgc3BlY2lmaWVkIik7Ci0gIH0KLSAgaWYgKHdyaXRlKSB7Ci0gICAgZmxhZ3MgfD0gT19DUkVBVCB8IE9fQVBQRU5EOwotICB9Ci0gIGludCBmZCA9IDo6b3BlbihwYXRoLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJmYWlsZWQgdG8gb3BlbiBmaWxlIGZvciB3cml0aW5nOiAiICsgcGF0aCk7Ci0gIH0KLSAgc2V0RkQoZmQpOwotICBvcGVuKCk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M1MmVhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgIlRGRFRyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZS4KLSAqCi0gKiBXcml0ZWFibGUgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIE9fQ1JFQVQgYW5kIE9fQVBQRU5ECi0gKi8KLWNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGRFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSBmYWxzZSk7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMWRkY2IuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgImNvbmN1cnJlbmN5L01vbml0b3IuaCIKLSNpbmNsdWRlICJUU29ja2V0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vLyBHbG9iYWwgdmFyIHRvIHRyYWNrIHRvdGFsIHNvY2tldCBzeXMgY2FsbHMKLXVpbnQzMl90IGdfc29ja2V0X3N5c2NhbGxzID0gMDsKLQotLyoqCi0gKiBUU29ja2V0IGltcGxlbWVudGF0aW9uLgotICoKLSAqLwotCi1UU29ja2V0OjpUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkgOgotICBob3N0Xyhob3N0KSwKLSAgcG9ydF8ocG9ydCksCi0gIHNvY2tldF8oLTEpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgewotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci19Ci0KLVRTb2NrZXQ6OlRTb2NrZXQoKSA6Ci0gIGhvc3RfKCIiKSwKLSAgcG9ydF8oMCksCi0gIHNvY2tldF8oLTEpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgewotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci19Ci0KLVRTb2NrZXQ6OlRTb2NrZXQoaW50IHNvY2tldCkgOgotICBob3N0XygiIiksCi0gIHBvcnRfKDApLAotICBzb2NrZXRfKHNvY2tldCksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLX0KLQotVFNvY2tldDo6flRTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLWJvb2wgVFNvY2tldDo6aXNPcGVuKCkgewotICByZXR1cm4gKHNvY2tldF8gPj0gMCk7Ci19Ci0KLWJvb2wgVFNvY2tldDo6cGVlaygpIHsKLSAgaWYgKCFpc09wZW4oKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50OF90IGJ1ZjsKLSAgaW50IHIgPSByZWN2KHNvY2tldF8sICZidWYsIDEsIE1TR19QRUVLKTsKLSAgaWYgKHIgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICAvKiBzaGlnaW46Ci0gICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBFQ09OTlJFU0VUIGlmIHNvY2tldCB3YXMgY2xvc2VkIGJ5IAotICAgICAqIHRoZSBvdGhlciBzaWRlCi0gICAgICovCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkKLSAgICB7Ci0gICAgICBjbG9zZSgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAjZW5kaWYKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJlY3YoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0gIHJldHVybiAociA+IDApOwotfQotCi12b2lkIFRTb2NrZXQ6Om9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyAqcmVzKSB7Ci0gIGlmIChpc09wZW4oKSkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKLSAgfQotCi0gIHNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICBpZiAoc29ja2V0XyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIHNvY2tldCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gU2VuZCB0aW1lb3V0Ci0gIGlmIChzZW5kVGltZW91dF8gPiAwKSB7Ci0gICAgc2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKLSAgfQotCi0gIC8vIFJlY3YgdGltZW91dAotICBpZiAocmVjdlRpbWVvdXRfID4gMCkgewotICAgIHNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7Ci0gIH0KLQotICAvLyBMaW5nZXIKLSAgc2V0TGluZ2VyKGxpbmdlck9uXywgbGluZ2VyVmFsXyk7Ci0KLSAgLy8gTm8gZGVsYXkKLSAgc2V0Tm9EZWxheShub0RlbGF5Xyk7Ci0KLSAgLy8gVXNlcyBhIGxvdyBtaW4gUlRPIGlmIGFza2VkIHRvLgotI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoZ2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBpbnQgb25lID0gMTsKLSAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sICZvbmUsIHNpemVvZihvbmUpKTsKLSAgfQotI2VuZGlmCi0KLQotICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cwotICBpbnQgZmxhZ3MgPSBmY250bChzb2NrZXRfLCBGX0dFVEZMLCAwKTsKLSAgaWYgKGNvbm5UaW1lb3V0XyA+IDApIHsKLSAgICBpZiAoLTEgPT0gZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBmY250bCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICgtMSA9PSBmY250bChzb2NrZXRfLCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBmY250bCAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIENvbm5lY3QgdGhlIHNvY2tldAotICBpbnQgcmV0ID0gY29ubmVjdChzb2NrZXRfLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7Ci0KLSAgLy8gc3VjY2VzcyBjYXNlCi0gIGlmIChyZXQgPT0gMCkgewotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIGlmIChlcnJubyAhPSBFSU5QUk9HUkVTUykgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGNvbm5lY3QoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiY29ubmVjdCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICB9Ci0KLQotICBzdHJ1Y3QgcG9sbGZkIGZkc1sxXTsKLSAgc3RkOjptZW1zZXQoZmRzLCAwICwgc2l6ZW9mKGZkcykpOwotICBmZHNbMF0uZmQgPSBzb2NrZXRfOwotICBmZHNbMF0uZXZlbnRzID0gUE9MTE9VVDsKLSAgcmV0ID0gcG9sbChmZHMsIDEsIGNvbm5UaW1lb3V0Xyk7Ci0KLSAgaWYgKHJldCA+IDApIHsKLSAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKLSAgICBpbnQgdmFsOwotICAgIHNvY2tsZW5fdCBsb247Ci0gICAgbG9uID0gc2l6ZW9mKGludCk7Ci0gICAgaW50IHJldDIgPSBnZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSZ2YWwsICZsb24pOwotICAgIGlmIChyZXQyID09IC0xKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGdldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJnZXRzb2Nrb3B0KCkiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgotICAgIGlmICh2YWwgPT0gMCkgewotICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBwb2xsKSAiICsgZ2V0U29ja2V0SW5mbygpLCB2YWwpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQgb3BlbigpIGVycm9yIiwgdmFsKTsKLSAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewotICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKLSAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSB0aW1lZCBvdXQgIiArIGdldFNvY2tldEluZm8oKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJvcGVuKCkgdGltZWQgb3V0Iik7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gZXJyb3Igb24gcG9sbCgpCi0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgcG9sbCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJwb2xsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotIGRvbmU6Ci0gIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCi0gIGZjbnRsKHNvY2tldF8sIEZfU0VURkwsIGZsYWdzKTsKLX0KLQotdm9pZCBUU29ja2V0OjpvcGVuKCkgewotICBpZiAoaXNPcGVuKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7Ci0gIH0KLQotICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgotICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKLSAgfQotCi0gIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7Ci0gIHJlcyA9IE5VTEw7Ci0gIHJlczAgPSBOVUxMOwotICBpbnQgZXJyb3I7Ci0gIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOwotICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7Ci0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7Ci0gIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOwotCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdF8uY19zdHIoKSwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0KLSAgaWYgKGVycm9yKSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0OjpvcGVuKCkgZ2V0YWRkcmluZm8oKSAiICsgZ2V0U29ja2V0SW5mbygpICsgc3RyaW5nKGdhaV9zdHJlcnJvcihlcnJvcikpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3IgY2xpZW50IHNvY2tldC4iKTsKLSAgfQotCi0gIC8vIEN5Y2xlIHRocm91Z2ggYWxsIHRoZSByZXR1cm5lZCBhZGRyZXNzZXMgdW50aWwgb25lCi0gIC8vIGNvbm5lY3RzIG9yIHB1c2ggdGhlIGV4Y2VwdGlvbiB1cC4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIHRyeSB7Ci0gICAgICBvcGVuQ29ubmVjdGlvbihyZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAocmVzLT5haV9uZXh0KSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBmcmVlYWRkcmluZm8ocmVzMCk7IC8vIGNsZWFudXAgb24gZmFpbHVyZQotICAgICAgICB0aHJvdzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGcmVlIGFkZHJlc3Mgc3RydWN0dXJlIG1lbW9yeQotICBmcmVlYWRkcmluZm8ocmVzMCk7Ci19Ci0KLXZvaWQgVFNvY2tldDo6Y2xvc2UoKSB7Ci0gIGlmIChzb2NrZXRfID49IDApIHsKLSAgICBzaHV0ZG93bihzb2NrZXRfLCBTSFVUX1JEV1IpOwotICAgIDo6Y2xvc2Uoc29ja2V0Xyk7Ci0gIH0KLSAgc29ja2V0XyA9IC0xOwotfQotCi11aW50MzJfdCBUU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQiKTsKLSAgfQotCi0gIGludDMyX3QgcmV0cmllcyA9IDA7Ci0KLSAgLy8gRUFHQUlOIGNhbiBiZSBzaWduYWxsZWQgYm90aCB3aGVuIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgYW5kIHdoZW4KLSAgLy8gdGhlIHN5c3RlbSBpcyBvdXQgb2YgcmVzb3VyY2VzIChhbiBhd2Vzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlKS4KLSAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFsIHVuZGVyIHdoaWNoCi0gIC8vIEVBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgotICB1aW50MzJfdCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAwOwotICBpZiAocmVjdlRpbWVvdXRfKSB7Ci0gICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCi0gICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCi0gICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKLSAgICBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAocmVjdlRpbWVvdXRfKjEwMDApLyAoKG1heFJlY3ZSZXRyaWVzXz4wKSA/IG1heFJlY3ZSZXRyaWVzXyA6IDIpOwotICB9Ci0KLSB0cnlfYWdhaW46Ci0gIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0Ci0gIHN0cnVjdCB0aW1ldmFsIGJlZ2luOwotICBnZXR0aW1lb2ZkYXkoJmJlZ2luLCBOVUxMKTsKLSAgaW50IGdvdCA9IHJlY3Yoc29ja2V0XywgYnVmLCBsZW4sIDApOwotICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAvL2dldHRpbWVvZmRheSBjYW4gY2hhbmdlIGVycm5vCi0gICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKLSAgaWYgKGdvdCA8IDApIHsKLSAgICBpZiAoZXJybm9fY29weSA9PSBFQUdBSU4pIHsKLSAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhY2sgb2YgcmVzb3VyY2VzIG9yIHRpbWVvdXQgY2FzZQotICAgICAgc3RydWN0IHRpbWV2YWwgZW5kOwotICAgICAgZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOwotICAgICAgdWludDMyX3QgcmVhZEVsYXBzZWRNaWNyb3MgPSAgKCgoZW5kLnR2X3NlYyAtIGJlZ2luLnR2X3NlYykgKiAxMDAwICogMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKHVpbnQ2NF90KShlbmQudHZfdXNlYyAtIGJlZ2luLnR2X3VzZWMpKSkpOwotCi0gICAgICBpZiAoIWVhZ2FpblRocmVzaG9sZE1pY3JvcyB8fCAocmVhZEVsYXBzZWRNaWNyb3MgPCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MpKSB7Ci0gICAgICAgIGlmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKLSAgICAgICAgICB1c2xlZXAoNTApOwotICAgICAgICAgIGdvdG8gdHJ5X2FnYWluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFQUdBSU4gKHRpbWVkIG91dCkiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRUlOVFIgJiYgcmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSB7Ci0gICAgICBnb3RvIHRyeV9hZ2FpbjsKLSAgICB9Ci0KLSAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkgewotICAgICAgLyogc2hpZ2luOiBmcmVlYnNkIGRvZXNuJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YgYW5kIGZhaWxzIHdpdGgKLSAgICAgICAqIEVDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24gCi0gICAgICAgKi8KLSAgICAgIGNsb3NlKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgI2VuZGlmCi0KLSAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnJlYWQoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0KLSAgICAvLyBJZiB3ZSBkaXNjb25uZWN0IHdpdGggbm8gbGluZ2VyIHRpbWUKLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiRUNPTk5SRVNFVCIpOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KLSAgICBpZiAoZXJybm9fY29weSA9PSBFTk9UQ09OTikgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkVOT1RDT05OIik7Ci0gICAgfQotCi0gICAgLy8gVGltZWQgb3V0IQotICAgIGlmIChlcnJub19jb3B5ID09IEVUSU1FRE9VVCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJFVElNRURPVVQiKTsKLSAgICB9Ci0KLSAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gVGhlIHJlbW90ZSBob3N0IGhhcyBjbG9zZWQgdGhlIHNvY2tldAotICBpZiAoZ290ID09IDApIHsKLSAgICBjbG9zZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUGFjayBkYXRhIGludG8gc3RyaW5nCi0gIHJldHVybiBnb3Q7Ci19Ci0KLXZvaWQgVFNvY2tldDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBzb2NrZXQiKTsKLSAgfQotCi0gIHVpbnQzMl90IHNlbnQgPSAwOwotCi0gIHdoaWxlIChzZW50IDwgbGVuKSB7Ci0KLSAgICBpbnQgZmxhZ3MgPSAwOwotICAgICNpZmRlZiBNU0dfTk9TSUdOQUwKLSAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgTVNHX05PU0lHTkFMIHRvIHN1cHByZXNzIFNJR1BJUEUgZXJyb3JzLCBpbnN0ZWFkIHdlCi0gICAgLy8gY2hlY2sgZm9yIHRoZSBFUElQRSByZXR1cm4gY29uZGl0aW9uIGFuZCBjbG9zZSB0aGUgc29ja2V0IGluIHRoYXQgY2FzZQotICAgIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKLSAgICAjZW5kaWYgLy8gaWZkZWYgTVNHX05PU0lHTkFMCi0KLSAgICBpbnQgYiA9IHNlbmQoc29ja2V0XywgYnVmICsgc2VudCwgbGVuIC0gc2VudCwgZmxhZ3MpOwotICAgICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgICAvLyBGYWlsIG9uIGEgc2VuZCBlcnJvcgotICAgIGlmIChiIDwgMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OndyaXRlKCkgc2VuZCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotCi0gICAgICBpZiAoZXJybm8gPT0gRVBJUEUgfHwgZXJybm8gPT0gRUNPTk5SRVNFVCB8fCBlcnJubyA9PSBFTk9UQ09OTikgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKLSAgICAgIH0KLQotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0KLSAgICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAotICAgIGlmIChiID09IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTb2NrZXQgc2VuZCByZXR1cm5lZCAwLiIpOwotICAgIH0KLSAgICBzZW50ICs9IGI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0SG9zdCgpIHsKLSAgcmV0dXJuIGhvc3RfOwotfQotCi1pbnQgVFNvY2tldDo6Z2V0UG9ydCgpIHsKLSAgcmV0dXJuIHBvcnRfOwotfQotCi12b2lkIFRTb2NrZXQ6OnNldEhvc3Qoc3RyaW5nIGhvc3QpIHsKLSAgaG9zdF8gPSBob3N0OwotfQotCi12b2lkIFRTb2NrZXQ6OnNldFBvcnQoaW50IHBvcnQpIHsKLSAgcG9ydF8gPSBwb3J0OwotfQotCi12b2lkIFRTb2NrZXQ6OnNldExpbmdlcihib29sIG9uLCBpbnQgbGluZ2VyKSB7Ci0gIGxpbmdlck9uXyA9IG9uOwotICBsaW5nZXJWYWxfID0gbGluZ2VyOwotICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJ1Y3QgbGluZ2VyIGwgPSB7KGxpbmdlck9uXyA/IDEgOiAwKSwgbGluZ2VyVmFsX307Ci0gIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgJmwsIHNpemVvZihsKSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldExpbmdlcigpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnNldE5vRGVsYXkoYm9vbCBub0RlbGF5KSB7Ci0gIG5vRGVsYXlfID0gbm9EZWxheTsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU2V0IHNvY2tldCB0byBOT0RFTEFZCi0gIGludCB2ID0gbm9EZWxheV8gPyAxIDogMDsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmdiwgc2l6ZW9mKHYpKTsKLSAgaWYgKHJldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87ICAvLyBDb3B5IGVycm5vIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnNldENvbm5UaW1lb3V0KGludCBtcykgewotICBjb25uVGltZW91dF8gPSBtczsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRSZWN2VGltZW91dChpbnQgbXMpIHsKLSAgaWYgKG1zIDwgMCkgewotICAgIGNoYXIgZXJyQnVmWzUxMl07Ci0gICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRSZWN2VGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgbXMpOwotICAgIEdsb2JhbE91dHB1dChlcnJCdWYpOwotICAgIHJldHVybjsKLSAgfQotICByZWN2VGltZW91dF8gPSBtczsKLQotICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci0KLSAgLy8gQ29weSBiZWNhdXNlIHBvbGwgbWF5IG1vZGlmeQotICBzdHJ1Y3QgdGltZXZhbCByID0gcmVjdlRpbWV2YWxfOwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnIsIHNpemVvZihyKSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IG1zKSB7Ci0gIGlmIChtcyA8IDApIHsKLSAgICBjaGFyIGVyckJ1Zls1MTJdOwotICAgIHNwcmludGYoZXJyQnVmLCAiVFNvY2tldDo6c2V0U2VuZFRpbWVvdXQgd2l0aCBuZWdhdGl2ZSBpbnB1dDogJWRcbiIsIG1zKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyQnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2VuZFRpbWVvdXRfID0gbXM7Ci0KLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RydWN0IHRpbWV2YWwgcyA9IHsoaW50KShzZW5kVGltZW91dF8vMTAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgKGludCkoKHNlbmRUaW1lb3V0XyUxMDAwKSoxMDAwKX07Ci0gIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAmcywgc2l6ZW9mKHMpKTsKLSAgaWYgKHJldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87ICAvLyBDb3B5IGVycm5vIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0U2VuZFRpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXRNYXhSZWN2UmV0cmllcyhpbnQgbWF4UmVjdlJldHJpZXMpIHsKLSAgbWF4UmVjdlJldHJpZXNfID0gbWF4UmVjdlJldHJpZXM7Ci19Ci0KLXN0cmluZyBUU29ja2V0OjpnZXRTb2NrZXRJbmZvKCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICBvc3MgPDwgIjxIb3N0OiAiIDw8IGhvc3RfIDw8ICIgUG9ydDogIiA8PCBwb3J0XyA8PCAiPiI7Ci0gIHJldHVybiBvc3Muc3RyKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkgewotICBpZiAocGVlckhvc3RfLmVtcHR5KCkpIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgIHNvY2tsZW5fdCBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotCi0gICAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgICByZXR1cm4gaG9zdF87Ci0gICAgfQotCi0gICAgaW50IHJ2ID0gZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikgJmFkZHIsICZhZGRyTGVuKTsKLQotICAgIGlmIChydiAhPSAwKSB7Ci0gICAgICByZXR1cm4gcGVlckhvc3RfOwotICAgIH0KLQotICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKLSAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07Ci0KLSAgICBnZXRuYW1laW5mbygoc29ja2FkZHIqKSAmYWRkciwgYWRkckxlbiwKLSAgICAgICAgICAgICAgICBjbGllbnRob3N0LCBzaXplb2YoY2xpZW50aG9zdCksCi0gICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLCAwKTsKLQotICAgIHBlZXJIb3N0XyA9IGNsaWVudGhvc3Q7Ci0gIH0KLSAgcmV0dXJuIHBlZXJIb3N0XzsKLX0KLQotc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckFkZHJlc3MoKSB7Ci0gIGlmIChwZWVyQWRkcmVzc18uZW1wdHkoKSkgewotICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0gICAgc29ja2xlbl90IGFkZHJMZW4gPSBzaXplb2YoYWRkcik7Ci0KLSAgICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICAgIHJldHVybiBwZWVyQWRkcmVzc187Ci0gICAgfQotCi0gICAgaW50IHJ2ID0gZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikgJmFkZHIsICZhZGRyTGVuKTsKLQotICAgIGlmIChydiAhPSAwKSB7Ci0gICAgICByZXR1cm4gcGVlckFkZHJlc3NfOwotICAgIH0KLQotICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKLSAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07Ci0KLSAgICBnZXRuYW1laW5mbygoc29ja2FkZHIqKSAmYWRkciwgYWRkckxlbiwKLSAgICAgICAgICAgICAgICBjbGllbnRob3N0LCBzaXplb2YoY2xpZW50aG9zdCksCi0gICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAotICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKTsKLQotICAgIHBlZXJBZGRyZXNzXyA9IGNsaWVudGhvc3Q7Ci0gICAgcGVlclBvcnRfID0gc3RkOjphdG9pKGNsaWVudHNlcnZpY2UpOwotICB9Ci0gIHJldHVybiBwZWVyQWRkcmVzc187Ci19Ci0KLWludCBUU29ja2V0OjpnZXRQZWVyUG9ydCgpIHsKLSAgZ2V0UGVlckFkZHJlc3MoKTsKLSAgcmV0dXJuIHBlZXJQb3J0XzsKLX0KLQotYm9vbCBUU29ja2V0Ojp1c2VMb3dNaW5SdG9fID0gZmFsc2U7Ci12b2lkIFRTb2NrZXQ6OnNldFVzZUxvd01pblJ0byhib29sIHVzZUxvd01pblJ0bykgewotICB1c2VMb3dNaW5SdG9fID0gdXNlTG93TWluUnRvOwotfQotYm9vbCBUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSB7Ci0gIHJldHVybiB1c2VMb3dNaW5SdG9fOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzE2N2YuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFNlcnZlclNvY2tldC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIFRDUCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKLSAqLwotY2xhc3MgVFNvY2tldCA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKLSAgLyoqCi0gICAqIFdlIGFsbG93IHRoZSBUU2VydmVyU29ja2V0IGFjY2VwdEltcGwoKSBtZXRob2QgdG8gYWNjZXNzIHRoZSBwcml2YXRlCi0gICAqIG1lbWJlcnMgb2YgYSBzb2NrZXQgc28gdGhhdCBpdCBjYW4gYWNjZXNzIHRoZSBUU29ja2V0KGludCBzb2NrZXQpCi0gICAqIGNvbnN0cnVjdG9yIHdoaWNoIGNyZWF0ZXMgYSBzb2NrZXQgb2JqZWN0IGZyb20gdGhlIHJhdyBVTklYIHNvY2tldAotICAgKiBoYW5kbGUuCi0gICAqLwotICBmcmllbmQgY2xhc3MgVFNlcnZlclNvY2tldDsKLQotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqLwotICBUU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bwotICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqLwotICBUU29ja2V0KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0KTsKLQotICAvKioKLSAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSAgICovCi0gIHZpcnR1YWwgflRTb2NrZXQoKTsKLQotICAvKioKLSAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlLgotICAgKgotICAgKiBAcmV0dXJuIElzIHRoZSBzb2NrZXQgYWxpdmU/Ci0gICAqLwotICBib29sIGlzT3BlbigpOwotCi0gIC8qKgotICAgKiBDYWxscyBzZWxlY3Qgb24gdGhlIHNvY2tldCB0byBzZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZS4KLSAgICovCi0gIGJvb2wgcGVlaygpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiB0aGUgc29ja2V0IGNvdWxkIG5vdCBjb25uZWN0Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgb3BlbigpOwotCi0gIC8qKgotICAgKiBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi0gICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICAvKioKLSAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KLSAgICovCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBob3N0IGlkZW50aWZpZXIKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldEhvc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBwb3J0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBpbnQgcG9ydCBudW1iZXIKLSAgICovCi0gIGludCBnZXRQb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaG9zdCB0aGF0IHNvY2tldCB3aWxsIGNvbm5lY3QgdG8KLSAgICoKLSAgICogQHBhcmFtIGhvc3QgaG9zdCBpZGVudGlmaWVyCi0gICAqLwotICB2b2lkIHNldEhvc3Qoc3RkOjpzdHJpbmcgaG9zdCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcG9ydCB0aGF0IHNvY2tldCB3aWxsIGNvbm5lY3QgdG8KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgcG9ydCBudW1iZXIKLSAgICovCi0gIHZvaWQgc2V0UG9ydChpbnQgcG9ydCk7Ci0KLSAgLyoqCi0gICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpbmdlciBvcHRpb24gaXMgc2V0IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBvbiAgICAgIFdoZXRoZXIgU09fTElOR0VSIGlzIG9uCi0gICAqIEBwYXJhbSBsaW5nZXIgIElmIGxpbmdlciBpcyBhY3RpdmUsIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBsaW5nZXIgZm9yCi0gICAqLwotICB2b2lkIHNldExpbmdlcihib29sIG9uLCBpbnQgbGluZ2VyKTsKLQotICAvKioKLSAgICogV2hldGhlciB0byBlbmFibGUvZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobS4KLSAgICoKLSAgICogQHBhcmFtIG5vRGVsYXkgV2hldGhlciBvciBub3QgdG8gZGlzYWJsZSB0aGUgYWxnb3JpdGhtLgotICAgKiBAcmV0dXJuCi0gICAqLwotICB2b2lkIHNldE5vRGVsYXkoYm9vbCBub0RlbGF5KTsKLQotICAvKioKLSAgICogU2V0IHRoZSBjb25uZWN0IHRpbWVvdXQKLSAgICovCi0gIHZvaWQgc2V0Q29ublRpbWVvdXQoaW50IG1zKTsKLQotICAvKioKLSAgICogU2V0IHRoZSByZWNlaXZlIHRpbWVvdXQKLSAgICovCi0gIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IG1zKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBzZW5kIHRpbWVvdXQKLSAgICovCi0gIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IG1zKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcyBpbiBjYXNlIG9mIGFuIEVBR0FJTgotICAgKiBlcnJvcgotICAgKi8KLSAgdm9pZCBzZXRNYXhSZWN2UmV0cmllcyhpbnQgbWF4UmVjdlJldHJpZXMpOwotCi0gIC8qKgotICAgKiBHZXQgc29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdGVkIGFzIGEgc3RyaW5nIDxIb3N0OiB4IFBvcnQ6IHg+Ci0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRTb2NrZXRJbmZvKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEROUyBuYW1lIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCi0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRQZWVySG9zdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCi0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRQZWVyQWRkcmVzcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3J0IG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCi0gICAqKi8KLSAgaW50IGdldFBlZXJQb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgd2hldGhlciB0byB1c2UgYSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dC4KLSAgICovCi0gIHN0YXRpYyB2b2lkIHNldFVzZUxvd01pblJ0byhib29sIHVzZUxvd01pblJ0byk7Ci0KLSAgLyoqCi0gICAqIEdldHMgd2hldGhlciB0byB1c2UgYSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dC4KLSAgICovCi0gIHN0YXRpYyBib29sIGdldFVzZUxvd01pblJ0bygpOwotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHJhdyBVTklYIGhhbmRsZS4gTmV2ZXIgY2FsbGVkIGRpcmVjdGx5Ci0gICAqIGJ1dCB1c2VkIGJ5IHRoZSBUU2VydmVyU29ja2V0IGNsYXNzLgotICAgKi8KLSAgVFNvY2tldChpbnQgc29ja2V0KTsKLQotICAvKiogY29ubmVjdCwgY2FsbGVkIGJ5IG9wZW4gKi8KLSAgdm9pZCBvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8gKnJlcyk7Ci0KLSAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnN0cmluZyBob3N0XzsKLQotICAvKiogUGVlciBob3N0bmFtZSAqLwotICBzdGQ6OnN0cmluZyBwZWVySG9zdF87Ci0KLSAgLyoqIFBlZXIgYWRkcmVzcyAqLwotICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187Ci0KLSAgLyoqIFBlZXIgcG9ydCAqLwotICBpbnQgcGVlclBvcnRfOwotCi0gIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCi0gIGludCBwb3J0XzsKLQotICAvKiogVW5kZXJseWluZyBVTklYIHNvY2tldCBoYW5kbGUgKi8KLSAgaW50IHNvY2tldF87Ci0KLSAgLyoqIENvbm5lY3QgdGltZW91dCBpbiBtcyAqLwotICBpbnQgY29ublRpbWVvdXRfOwotCi0gIC8qKiBTZW5kIHRpbWVvdXQgaW4gbXMgKi8KLSAgaW50IHNlbmRUaW1lb3V0XzsKLQotICAvKiogUmVjdiB0aW1lb3V0IGluIG1zICovCi0gIGludCByZWN2VGltZW91dF87Ci0KLSAgLyoqIExpbmdlciBvbiAqLwotICBib29sIGxpbmdlck9uXzsKLQotICAvKiogTGluZ2VyIHZhbCAqLwotICBpbnQgbGluZ2VyVmFsXzsKLQotICAvKiogTm9kZWxheSAqLwotICBib29sIG5vRGVsYXlfOwotCi0gIC8qKiBSZWN2IEVHQUlOIHJldHJpZXMgKi8KLSAgaW50IG1heFJlY3ZSZXRyaWVzXzsKLQotICAvKiogUmVjdiB0aW1lb3V0IHRpbWV2YWwgKi8KLSAgc3RydWN0IHRpbWV2YWwgcmVjdlRpbWV2YWxfOwotCi0gIC8qKiBXaGV0aGVyIHRvIHVzZSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCAqLwotICBzdGF0aWMgYm9vbCB1c2VMb3dNaW5SdG9fOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXwotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwYzVhMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgIlRTb2NrZXRQb29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi0vKioKLSAqIFRTb2NrZXRQb29sU2VydmVyIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1UU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoKQotICA6IGhvc3RfKCIiKSwKLSAgICBwb3J0XygwKSwKLSAgICBzb2NrZXRfKC0xKSwKLSAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgotICovCi1UU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RyaW5nICZob3N0LCBpbnQgcG9ydCkKLSAgOiBob3N0Xyhob3N0KSwKLSAgICBwb3J0Xyhwb3J0KSwKLSAgICBzb2NrZXRfKC0xKSwKLSAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9Ci0KLS8qKgotICogVFNvY2tldFBvb2wgaW1wbGVtZW50YXRpb24uCi0gKgotICovCi0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbCgpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgewotfQotCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPHN0cmluZz4gJmhvc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+ICZwb3J0cykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQotewotICBpZiAoaG9zdHMuc2l6ZSgpICE9IHBvcnRzLnNpemUoKSkgewotICAgIEdsb2JhbE91dHB1dCgiVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sOiBob3N0cy5zaXplICE9IHBvcnRzLnNpemUiKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKLSAgfQotCi0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaG9zdHMuc2l6ZSgpOyArK2kpIHsKLSAgICBhZGRTZXJ2ZXIoaG9zdHNbaV0sIHBvcnRzW2ldKTsKLSAgfQotfQotCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPHBhaXI8c3RyaW5nLCBpbnQ+ID4mIHNlcnZlcnMpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNlcnZlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBhZGRTZXJ2ZXIoc2VydmVyc1tpXS5maXJzdCwgc2VydmVyc1tpXS5zZWNvbmQpOwotICB9Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIDogVFNvY2tldCgpLAotICBzZXJ2ZXJzXyhzZXJ2ZXJzKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17Ci0gIGFkZFNlcnZlcihob3N0LCBwb3J0KTsKLX0KLQotVFNvY2tldFBvb2w6On5UU29ja2V0UG9vbCgpIHsKLSAgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gc2VydmVyc18uYmVnaW4oKTsKLSAgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyRW5kID0gc2VydmVyc18uZW5kKCk7Ci0gIGZvciAoOyBpdGVyICE9IGl0ZXJFbmQ7ICsraXRlcikgewotICAgIHNldEN1cnJlbnRTZXJ2ZXIoKml0ZXIpOwotICAgIFRTb2NrZXRQb29sOjpjbG9zZSgpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OmFkZFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7Ci0gIHNlcnZlcnNfLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPihuZXcgVFNvY2tldFBvb2xTZXJ2ZXIoaG9zdCwgcG9ydCkpKTsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIpIHsKLSAgaWYgKHNlcnZlcikgewotICAgIHNlcnZlcnNfLnB1c2hfYmFjayhzZXJ2ZXIpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldFNlcnZlcnMoY29uc3QgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7Ci0gIHNlcnZlcnNfID0gc2VydmVyczsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6Z2V0U2VydmVycyh2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKLSAgc2VydmVycyA9IHNlcnZlcnNfOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKSB7Ci0gIG51bVJldHJpZXNfID0gbnVtUmV0cmllczsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0UmV0cnlJbnRlcnZhbChpbnQgcmV0cnlJbnRlcnZhbCkgewotICByZXRyeUludGVydmFsXyA9IHJldHJ5SW50ZXJ2YWw7Ci19Ci0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykgewotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSkgewotICByYW5kb21pemVfID0gcmFuZG9taXplOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCkgewotICBhbHdheXNUcnlMYXN0XyA9IGFsd2F5c1RyeUxhc3Q7Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldEN1cnJlbnRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewotICBjdXJyZW50U2VydmVyXyA9IHNlcnZlcjsKLSAgaG9zdF8gPSBzZXJ2ZXItPmhvc3RfOwotICBwb3J0XyA9IHNlcnZlci0+cG9ydF87Ci0gIHNvY2tldF8gPSBzZXJ2ZXItPnNvY2tldF87Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNvY2tldCBvcGVuIGZhaWxzLiBXaGVuIHNvY2tldAotICogb3BlbnMgZmFpbHMsIHRoZSBzb2NrZXQgaW4gdGhlIGN1cnJlbnQgc2VydmVyIGlzIHJlc2V0LgotICovCi0vKiBUT0RPOiB3aXRob3V0IGFwYyB3ZSBpZ25vcmUgYSBsb3Qgb2YgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBwaHAgdmVyc2lvbiAqLwotdm9pZCBUU29ja2V0UG9vbDo6b3BlbigpIHsKLQotICB1bnNpZ25lZCBpbnQgbnVtU2VydmVycyA9IHNlcnZlcnNfLnNpemUoKTsKLSAgaWYgKG51bVNlcnZlcnMgPT0gMCkgewotICAgIHNvY2tldF8gPSAtMTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgfQotCi0gIGlmIChpc09wZW4oKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChyYW5kb21pemVfICYmIG51bVNlcnZlcnMgPiAxKSB7Ci0gICAgcmFuZG9tX3NodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCkpOwotICB9Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1TZXJ2ZXJzOyArK2kpIHsKLQotICAgIHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIgPSBzZXJ2ZXJzX1tpXTsKLSAgICAvLyBJbXBlcnNvbmF0ZSB0aGUgc2VydmVyIHNvY2tldAotICAgIHNldEN1cnJlbnRTZXJ2ZXIoc2VydmVyKTsKLQotICAgIGlmIChpc09wZW4oKSkgewotICAgICAgLy8gYWxyZWFkeSBvcGVuIG1lYW5zIHdlJ3JlIGRvbmUKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID09IDApOwotICAgIGJvb2wgaXNMYXN0U2VydmVyID0gYWx3YXlzVHJ5TGFzdF8gPyAoaSA9PSAobnVtU2VydmVycyAtIDEpKSA6IGZhbHNlOwotCi0gICAgaWYgKHNlcnZlci0+bGFzdEZhaWxUaW1lXyA+IDApIHsKLSAgICAgIC8vIFRoZSBzZXJ2ZXIgd2FzIG1hcmtlZCBhcyBkb3duLCBzbyBjaGVjayBpZiBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCB0byByZXRyeQotICAgICAgaW50IGVsYXBzZWRUaW1lID0gdGltZShOVUxMKSAtIHNlcnZlci0+bGFzdEZhaWxUaW1lXzsKLSAgICAgIGlmIChlbGFwc2VkVGltZSA+IHJldHJ5SW50ZXJ2YWxfKSB7Ci0gICAgICAgIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXRyeUludGVydmFsUGFzc2VkIHx8IGlzTGFzdFNlcnZlcikgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1SZXRyaWVzXzsgKytqKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgVFNvY2tldDo6b3BlbigpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXRQb29sOjpvcGVuIGZhaWxlZCAiK2dldFNvY2tldEluZm8oKSsiOiAiK2Uud2hhdCgpOwotICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgc29ja2V0XyA9IC0xOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29weSBvdmVyIHRoZSBvcGVuZWQgc29ja2V0IHNvIHRoYXQgd2UgY2FuIGtlZXAgaXQgcGVyc2lzdGVudAotICAgICAgICBzZXJ2ZXItPnNvY2tldF8gPSBzb2NrZXRfOwotICAgICAgICAvLyByZXNldCBsYXN0RmFpbFRpbWVfIGlzIHJlcXVpcmVkCi0gICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IDA7Ci0gICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICArK3NlcnZlci0+Y29uc2VjdXRpdmVGYWlsdXJlc187Ci0gICAgICBpZiAoc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA+IG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7Ci0gICAgICAgIC8vIE1hcmsgc2VydmVyIGFzIGRvd24KLSAgICAgICAgc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDA7Ci0gICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IHRpbWUoTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6b3BlbjogYWxsIGNvbm5lY3Rpb25zIGZhaWxlZCIpOwotICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6Y2xvc2UoKSB7Ci0gIFRTb2NrZXQ6OmNsb3NlKCk7Ci0gIGlmIChjdXJyZW50U2VydmVyXykgewotICAgIGN1cnJlbnRTZXJ2ZXJfLT5zb2NrZXRfID0gLTE7Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTExNmEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfIDEKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJUU29ja2V0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLSAvKioKLSAgKiBDbGFzcyB0byBob2xkIHNlcnZlciBpbmZvcm1hdGlvbiBmb3IgVFNvY2tldFBvb2wKLSAgKgotICAqLwotY2xhc3MgVFNvY2tldFBvb2xTZXJ2ZXIgewotCi0gIHB1YmxpYzoKLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHNlcnZlciBpbmZvCi0gICAqLwotICBUU29ja2V0UG9vbFNlcnZlcigpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCi0gICAqLwotICBUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyAmaG9zdCwgaW50IHBvcnQpOwotCi0gIC8vIEhvc3QgbmFtZQotICBzdGQ6OnN0cmluZyBob3N0XzsKLQotICAvLyBQb3J0IHRvIGNvbm5lY3Qgb24KLSAgaW50IHBvcnRfOwotCi0gIC8vIFNvY2tldCBmb3IgdGhlIHNlcnZlcgotICBpbnQgc29ja2V0XzsKLQotICAvLyBMYXN0IHRpbWUgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKLSAgaW50IGxhc3RGYWlsVGltZV87Ci0KLSAgLy8gTnVtYmVyIG9mIGNvbnNlY3V0aXZlIHRpbWVzIGNvbm5lY3RpbmcgdG8gdGhpcyBzZXJ2ZXIgZmFpbGVkCi0gIGludCBjb25zZWN1dGl2ZUZhaWx1cmVzXzsKLX07Ci0KLS8qKgotICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICovCi1jbGFzcyBUU29ja2V0UG9vbCA6IHB1YmxpYyBUU29ja2V0IHsKLQotIHB1YmxpYzoKLQotICAgLyoqCi0gICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgICovCi0gICBUU29ja2V0UG9vbCgpOwotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIGhvc3RzIGxpc3Qgb2YgaG9zdCBuYW1lcwotICAgICogQHBhcmFtIHBvcnRzIGxpc3Qgb2YgcG9ydCBuYW1lcwotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmhvc3RzLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiAmcG9ydHMpOwotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBwYWlycyBvZiBob3N0IG5hbWUgYW5kIHBvcnQKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBUU29ja2V0UG9vbFNlcnZlcnMKLSAgICAqLwotICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIGhvc3Qgc2luZ2xlIGhvc3QKLSAgICAqIEBwYXJhbSBwb3J0IHNpbmdsZSBwb3J0Ci0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7Ci0KLSAgIC8qKgotICAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSAgICAqLwotICAgdmlydHVhbCB+VFNvY2tldFBvb2woKTsKLQotICAgLyoqCi0gICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKLSAgICAqLwotICAgdm9pZCBhZGRTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKLQotICAgLyoqCi0gICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKLSAgICAqLwotICB2b2lkIGFkZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcik7Ci0KLSAgIC8qKgotICAgICogU2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKLSAgICAqLwotICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKLQotICAgLyoqCi0gICAgKiBHZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAotICAgICovCi0gIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCi0gICAgKi8KLSAgIHZvaWQgc2V0TnVtUmV0cmllcyhpbnQgbnVtUmV0cmllcyk7Ci0KLSAgIC8qKgotICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KLSAgICAqLwotICAgdm9pZCBzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKTsKLQotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAgKi8KLSAgIHZvaWQgc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcyk7Ci0KLSAgIC8qKgotICAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KLSAgICAqLwotICAgdm9pZCBzZXRSYW5kb21pemUoYm9vbCByYW5kb21pemUpOwotCi0gICAvKioKLSAgICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCi0gICAgKi8KLSAgIHZvaWQgc2V0QWx3YXlzVHJ5TGFzdChib29sIGFsd2F5c1RyeUxhc3QpOwotCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KLSAgICAqLwotICAgdm9pZCBvcGVuKCk7Ci0KLSAgIC8qCi0gICAgKiBDbG9zZXMgdGhlIFVOSVggc29ja2V0Ci0gICAgKi8KLSAgIHZvaWQgY2xvc2UoKTsKLQotIHByb3RlY3RlZDoKLQotICB2b2lkIHNldEN1cnJlbnRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIpOwotCi0gICAvKiogTGlzdCBvZiBzZXJ2ZXJzIHRvIGNvbm5lY3QgdG8gKi8KLSAgc3RkOjp2ZWN0b3I8IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOwotCi0gIC8qKiBDdXJyZW50IHNlcnZlciAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87Ci0KLSAgIC8qKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdCAqLwotICAgaW50IG51bVJldHJpZXNfOwotCi0gICAvKiogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICAqIG1hcmtlZCBhcyBkb3duLgotICAgICovCi0gICBpbnQgcmV0cnlJbnRlcnZhbF87Ci0KLSAgIC8qKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uICovCi0gICBpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc187Ci0KLSAgIC8qKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/ICovCi0gICBib29sIHJhbmRvbWl6ZV87Ci0KLSAgIC8qKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8gKi8KLSAgIGJvb2wgYWx3YXlzVHJ5TGFzdF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXwotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllMjBjZS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIG9mIHRyYW5zcG9ydGluZyBkYXRhLiBBIFRUcmFuc3BvcnQgbWF5IGJlCi0gKiBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYm90aC4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFZpcnR1YWwgZGVjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHZpcnR1YWwgflRUcmFuc3BvcnQoKSB7fQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcwotICAgKiBzdGlsbCBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sCi0gICAqIGJ1dCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZQotICAgKiBwb3NzaWJsZSAoaS5lLiBvbiBhIHNvY2tldCkuCi0gICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCi0gICAqIHJlcXVlc3QuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gaXNPcGVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHRoZSB0cmFuc3BvcnQgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbGVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgb3BlbigpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3QgY2xvc2UgYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gcmVhZCB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBzdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgIFJlZmVyZW5jZSB0byB0aGUgbG9jYXRpb24gdG8gd3JpdGUgdGhlIGRhdGEKLSAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YSBpbiBpdHMgZW50aXJldHkgbm8gbWF0dGVyIHdoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBzICAgICBSZWZlcmVuY2UgdG8gbG9jYXRpb24gZm9yIHJlYWQgZGF0YQotICAgKiBAcGFyYW0gbGVuICAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gc2l6ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgaW5zdWZmaWNpZW50IGRhdGEgd2FzIHJlYWQKLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHVpbnQzMl90IGhhdmUgPSAwOwotICAgIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgICB3aGlsZSAoaGF2ZSA8IGxlbikgewotICAgICAgZ2V0ID0gcmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOwotICAgICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCi0JCQkJICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQuIik7Ci0gICAgICB9Ci0gICAgICBoYXZlICs9IGdldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGF2ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KLSAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KLSAgICogZS5nLiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZQotICAgKgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlYWRFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIHN0cmluZyBpbiBpdHMgZW50aXJldHkgdG8gdGhlIGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUgb3V0Ci0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHdyaXRlLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KLSAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KLSAgICogYXQgdGhlIGVuZCBvZiBhIHJlcXVlc3QuCi0gICAqCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4gVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAotICAgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgdmlydHVhbCB2b2lkIGZsdXNoKCkge30KLQotICAvKioKLSAgICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcG9pbnRlciB0byBcYyBsZW4gYnl0ZXMsIHBvc3NpYmx5IGNvcGllZCBpbnRvIFxjIGJ1Zi4KLSAgICogRG9lcyBub3QgY29uc3VtZSB0aGUgYnl0ZXMgcmVhZCAoaS5lLjogYSBsYXRlciByZWFkIHdpbGwgcmV0dXJuIHRoZSBzYW1lCi0gICAqIGRhdGEpLiAgVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gc3VwcG9ydCBwcm90b2NvbHMgdGhhdCBuZWVkIHRvIHJlYWQKLSAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4gIFRoZXkgY2FuIGF0dGVtcHQgdG8gYm9ycm93IHRoZSBtYXhpbXVtIGFtb3VudCBvZgotICAgKiBkYXRhIHRoYXQgdGhleSB3aWxsIG5lZWQsIHRoZW4gY29uc3VtZSAoc2VlIG5leHQgbWV0aG9kKSB3aGF0IHRoZXkKLSAgICogYWN0dWFsbHkgdXNlLiAgU29tZSB0cmFuc3BvcnRzIHdpbGwgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QgYW5kIG90aGVycwotICAgKiB3aWxsIGZhaWwgb2NjYXNpb25hbGx5LCBzbyBwcm90b2NvbHMgbXVzdCBiZSBwcmVwYXJlZCB0byB1c2UgcmVhZCBpZgotICAgKiBib3Jyb3cgZmFpbHMuCi0gICAqCi0gICAqIEBvYXJhbSBidWYgIEEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSBzdG9yZWQgaWYgbmVlZGVkLgotICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZG9lc24ndCByZXR1cm4gYnVmLCB0aGVuIHRoZSBjb250ZW50cyBvZgotICAgKiAgICAgICAgICAgICBidWYgYWZ0ZXIgdGhlIGNhbGwgYXJlIHVuZGVmaW5lZC4KLSAgICogQHBhcmFtIGxlbiAgKmxlbiBzaG91bGQgaW5pdGlhbGx5IGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBib3Jyb3cuCi0gICAqICAgICAgICAgICAgIElmIGJvcnJvdyBzdWNjZWVkcywgKmxlbiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcwotICAgKiAgICAgICAgICAgICBhdmFpbGFibGUgaW4gdGhlIHJldHVybmVkIHBvaW50ZXIuICBUaGlzIHdpbGwgYmUgYXQgbGVhc3QKLSAgICogICAgICAgICAgICAgd2hhdCB3YXMgcmVxdWVzdGVkLCBidXQgbWF5IGJlIG1vcmUgaWYgYm9ycm93IHJldHVybnMKLSAgICogICAgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIGludGVybmFsIGJ1ZmZlciwgcmF0aGVyIHRoYW4gYnVmLgotICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZmFpbHMsIHRoZSBjb250ZW50cyBvZiAqbGVuIGFyZSB1bmRlZmluZWQuCi0gICAqIEByZXR1cm4gSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYm9ycm93ZWQgZGF0YS4KLSAgICogICAgICAgICBUaGlzIG1pZ2h0IGJlIGVxdWFsIHRvIFxjIGJ1Ziwgb3IgaXQgbWlnaHQgYmUgYSBwb2ludGVyIGludG8KLSAgICogICAgICAgICB0aGUgdHJhbnNwb3J0J3MgaW50ZXJuYWwgYnVmZmVycy4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCogLyogbGVuICovKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGxlbiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQuICBUaGlzIHNob3VsZCBhbHdheXMgZm9sbG93IGEgYm9ycm93Ci0gICAqIG9mIGF0IGxlYXN0IGxlbiBieXRlcywgYW5kIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KLSAgICogVE9ETyhkcmVpc3MpOiBJcyB0aGVyZSBhbnkgdHJhbnNwb3J0IHRoYXQgY291bGQgYm9ycm93IGJ1dCBmYWlsIHRvCi0gICAqIGNvbnN1bWUsIG9yIHRoYXQgd291bGQgcmVxdWlyZSBhIGJ1ZmZlciB0byBkdW1wIHRoZSBjb25zdW1lZCBkYXRhPwotICAgKgotICAgKiBAcGFyYW0gbGVuICBIb3cgbWFueSBieXRlcyB0byBjb25zdW1lCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBjb25zdW1lKHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IGNvbnN1bWUuIik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIFNpbXBsZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIFRUcmFuc3BvcnQoKSB7fQotfTsKLQotLyoqCi0gKiBHZW5lcmljIGZhY3RvcnkgY2xhc3MgdG8gbWFrZSBhbiBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydCBvdXQgb2YgYQotICogc291cmNlIHRyYW5zcG9ydC4gQ29tbW9ubHkgdXNlZCBpbnNpZGUgc2VydmVycyB0byBtYWtlIGlucHV0IGFuZCBvdXRwdXQKLSAqIHN0cmVhbXMgb3V0IG9mIHJhdyBjbGllbnRzLgotICoKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGp1c3QgcmV0dXJucyB0aGUgdHJhbnNwb3J0IGdpdmVuLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFhZWRjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpsZXhpY2FsX2Nhc3Q7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FkMDJiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiB0cmFuc3BvcnQgZXJyb3JzIHRoYXQgbWF5Ci0gKiBvY2N1ciBpbiB2YXJpb3VzIHRyYW5zcG9ydCBzeXN0ZW1zLiBUaGlzIHByb3ZpZGVzIGEgc29ydCBvZiBnZW5lcmljCi0gKiB3cmFwcGVyIGFyb3VuZCB0aGUgdmFndWUgVU5JWCBFXyBlcnJvciBjb2RlcyB0aGF0IGxldHMgYSBjb21tb24gY29kZQotICogYmFzZSBvZiBlcnJvciBoYW5kbGluZyB0byBiZSB1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRyYW5zcG9ydHMsIGkuZS4KLSAqIHBpcGVzIGV0Yy4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgotICAgKi8KLSAgZW51bSBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZQotICB7IFVOS05PV04gPSAwCi0gICwgTk9UX09QRU4gPSAxCi0gICwgQUxSRUFEWV9PUEVOID0gMgotICAsIFRJTUVEX09VVCA9IDMKLSAgLCBFTkRfT0ZfRklMRSA9IDQKLSAgLCBJTlRFUlJVUFRFRCA9IDUKLSAgLCBCQURfQVJHUyA9IDYKLSAgLCBDT1JSVVBURURfREFUQSA9IDcKLSAgLCBJTlRFUk5BTF9FUlJPUiA9IDgKLSAgfTsKLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJub19jb3B5KSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSArICI6ICIgKyBUT3V0cHV0OjpzdHJlcnJvcl9zKGVycm5vX2NvcHkpKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCi0gICAqIHRoYXQgaGFzIG9jY3VycmVkLgotICAgKgotICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKLSAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIE5PVF9PUEVOICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOwotICAgICAgICBjYXNlIEFMUkVBRFlfT1BFTiAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgYWxyZWFkeSBvcGVuIjsKLSAgICAgICAgY2FzZSBUSU1FRF9PVVQgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogVGltZWQgb3V0IjsKLSAgICAgICAgY2FzZSBFTkRfT0ZfRklMRSAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogRW5kIG9mIGZpbGUiOwotICAgICAgICBjYXNlIElOVEVSUlVQVEVEICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcnJ1cHRlZCI7Ci0gICAgICAgIGNhc2UgQkFEX0FSR1MgICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludmFsaWQgYXJndW1lbnRzIjsKLSAgICAgICAgY2FzZSBDT1JSVVBURURfREFUQSA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogQ29ycnVwdGVkIERhdGEiOwotICAgICAgICBjYXNlIElOVEVSTkFMX0VSUk9SIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KLSAgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7Ci0KLSAgLyoqIEVycm9yIGNvZGUgKi8KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZV87Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDBmYTYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdWludDMyX3QgVFBpcGVkVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IG5lZWQgPSBsZW47Ci0KLSAgLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQKLSAgaWYgKHJMZW5fLXJQb3NfIDwgbmVlZCkgewotICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUKLSAgICBpZiAockxlbl8tclBvc18gPiAwKSB7Ci0gICAgICBtZW1jcHkoYnVmLCByQnVmXytyUG9zXywgckxlbl8tclBvc18pOwotICAgICAgbmVlZCAtPSByTGVuXy1yUG9zXzsKLSAgICAgIGJ1ZiArPSByTGVuXy1yUG9zXzsKLSAgICAgIHJQb3NfID0gckxlbl87Ci0gICAgfQotCi0gICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCi0gICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgewotICAgICAgckJ1ZlNpemVfICo9MjsKLSAgICAgIHJCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7Ci0gICAgfQotCi0gICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXytyUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOwotICB9Ci0KLQotICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZQotICB1aW50MzJfdCBnaXZlID0gbmVlZDsKLSAgaWYgKHJMZW5fLXJQb3NfIDwgZ2l2ZSkgewotICAgIGdpdmUgPSByTGVuXy1yUG9zXzsKLSAgfQotICBpZiAoZ2l2ZSA+IDApIHsKLSAgICBtZW1jcHkoYnVmLCByQnVmXytyUG9zXywgZ2l2ZSk7Ci0gICAgclBvc18gKz0gZ2l2ZTsKLSAgICBuZWVkIC09IGdpdmU7Ci0gIH0KLQotICByZXR1cm4gKGxlbiAtIG5lZWQpOwotfQotCi12b2lkIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gTWFrZSB0aGUgYnVmZmVyIGFzIGJpZyBhcyBpdCBuZWVkcyB0byBiZQotICBpZiAoKGxlbiArIHdMZW5fKSA+PSB3QnVmU2l6ZV8pIHsKLSAgICB1aW50MzJfdCBuZXdCdWZTaXplID0gd0J1ZlNpemVfKjI7Ci0gICAgd2hpbGUgKChsZW4gKyB3TGVuXykgPj0gbmV3QnVmU2l6ZSkgewotICAgICAgbmV3QnVmU2l6ZSAqPSAyOwotICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90ICopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKLSAgICB3QnVmU2l6ZV8gPSBuZXdCdWZTaXplOwotICB9Ci0KLSAgLy8gQ29weSBpbnRvIHRoZSBidWZmZXIKLSAgbWVtY3B5KHdCdWZfICsgd0xlbl8sIGJ1ZiwgbGVuKTsKLSAgd0xlbl8gKz0gbGVuOwotfQotCi12b2lkIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKSAgewotICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyCi0gIGlmICh3TGVuXyA+IDApIHsKLSAgICBzcmNUcmFuc18tPndyaXRlKHdCdWZfLCB3TGVuXyk7Ci0gICAgd0xlbl8gPSAwOwotICB9Ci0KLSAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gIHNyY1RyYW5zXy0+Zmx1c2goKTsKLX0KLQotVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICA6IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnMpLAotICAgIHNyY1RyYW5zXyhzcmNUcmFucykgewotfQotCi1UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpIHsKLX0KLQotYm9vbCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojppc09wZW4oKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OmlzT3BlbigpOwotfQotCi1ib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnBlZWsoKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnBlZWsoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpvcGVuKCkgewotICBUUGlwZWRUcmFuc3BvcnQ6Om9wZW4oKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpjbG9zZSgpIHsKLSAgVFBpcGVkVHJhbnNwb3J0OjpjbG9zZSgpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQoYnVmLCBsZW4pOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGhhdmUgPSAwOwotICB1aW50MzJfdCBnZXQgPSAwOwotCi0gIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgZ2V0ID0gcmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOwotICAgIGlmIChnZXQgPD0gMCkgewotICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBoYXZlICs9IGdldDsKLSAgfQotCi0gIHJldHVybiBoYXZlOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6cmVhZEVuZCgpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGUoYnVmLCBsZW4pOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OndyaXRlRW5kKCkgewotICBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCk7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKTsKLX0KLQotaW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRSZWFkVGltZW91dCgpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0UmVhZFRpbWVvdXQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7Ci0gIHNyY1RyYW5zXy0+c2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7Ci0gIHJldHVybiBzcmNUcmFuc18tPmdldE51bUNodW5rcygpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0Q3VyQ2h1bmsoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7Ci0gIHNyY1RyYW5zXy0+c2Vla1RvQ2h1bmsoY2h1bmspOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKLSAgc3JjVHJhbnNfLT5zZWVrVG9FbmQoKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1YzkxNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8gMQotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLS8vIEluY2x1ZGUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgaGVyZS4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBUaGUgbnVsbCB0cmFuc3BvcnQgaXMgYSBkdW1teSB0cmFuc3BvcnQgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLgotICogSXQncyBzb3J0IG9mIGFuIGFuYWxvZ3kgdG8gL2Rldi9udWxsLCB5b3UgY2FuIG5ldmVyIHJlYWQgYW55dGhpbmcgZnJvbSBpdAotICogYW5kIGl0IHdpbGwgbGV0IHlvdSB3cml0ZSBhbnl0aGluZyB5b3Ugd2FudCB0byBpdCwgdGhvdWdoIGl0IHdvbid0IGFjdHVhbGx5Ci0gKiBnbyBhbnl3aGVyZS4KLSAqCi0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVE51bGxUcmFuc3BvcnQoKSB7fQotCi0gIH5UTnVsbFRyYW5zcG9ydCgpIHt9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIG9wZW4oKSB7fQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotfTsKLQotCi0vKioKLSAqIFRQaXBlZFRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgYWxsb3dzIHBpcGluZyBvZiBhIHJlcXVlc3QgZnJvbSBvbmUKLSAqIHRyYW5zcG9ydCB0byBhbm90aGVyIGVpdGhlciB3aGVuIHJlYWRFbmQoKSBvciB3cml0ZUVuZCgpLiBUaGUgdHlwaWNhbAotICogdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gbG9nIGEgcmVxdWVzdCBvciBhIHJlcGx5IHRvIGRpc2suCi0gKiBUaGUgdW5kZXJseWluZyBidWZmZXIgZXhwYW5kcyB0byBhIGtlZXAgYSBjb3B5IG9mIHRoZSBlbnRpcmUKLSAqIHJlcXVlc3QvcmVzcG9uc2UuCi0gKgotICovCi1jbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSA6Ci0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSwKLSAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAotICAgIHJCdWZTaXplXyg1MTIpLCByUG9zXygwKSwgckxlbl8oMCksCi0gICAgd0J1ZlNpemVfKDUxMiksIHdMZW5fKDApIHsKLQotICAgIC8vIGRlZmF1bHQgaXMgdG8gdG8gcGlwZSB0aGUgcmVxdWVzdCB3aGVuIHJlYWRFbmQoKSBpcyBjYWxsZWQKLSAgICBwaXBlT25SZWFkXyA9IHRydWU7Ci0gICAgcGlwZU9uV3JpdGVfID0gZmFsc2U7Ci0KLSAgICByQnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKLSAgfQotCi0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAotICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3opIDoKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpLAotICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCi0gICAgckJ1ZlNpemVfKDUxMiksIHJQb3NfKDApLCByTGVuXygwKSwKLSAgICB3QnVmU2l6ZV8oc3opLCB3TGVuXygwKSB7Ci0KLSAgICByQnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKLSAgfQotCi0gIH5UUGlwZWRUcmFuc3BvcnQoKSB7Ci0gICAgc3RkOjpmcmVlKHJCdWZfKTsKLSAgICBzdGQ6OmZyZWUod0J1Zl8pOwotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgaWYgKHJQb3NfID49IHJMZW5fKSB7Ci0gICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKLSAgICAgICAgckJ1ZlNpemVfICo9MjsKLSAgICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICAgIH0KLQotICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gICAgfQotICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7Ci0gIH0KLQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICBzcmNUcmFuc18tPm9wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgc3JjVHJhbnNfLT5jbG9zZSgpOwotICB9Ci0KLSAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgewotICAgIHBpcGVPblJlYWRfID0gcGlwZVZhbDsKLSAgfQotCi0gIHZvaWQgc2V0UGlwZU9uV3JpdGUoYm9vbCBwaXBlVmFsKSB7Ci0gICAgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgcmVhZEVuZCgpIHsKLQotICAgIGlmIChwaXBlT25SZWFkXykgewotICAgICAgZHN0VHJhbnNfLT53cml0ZShyQnVmXywgclBvc18pOwotICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOwotICAgIH0KLQotICAgIHNyY1RyYW5zXy0+cmVhZEVuZCgpOwotCi0gICAgLy8gSWYgcmVxdWVzdHMgYXJlIGJlaW5nIHBpcGVsaW5lZCwgY29weSBkb3duIG91ciByZWFkLWFoZWFkIGRhdGEsCi0gICAgLy8gdGhlbiByZXNldCBvdXIgc3RhdGUuCi0gICAgaW50IHJlYWRfYWhlYWQgPSByTGVuXyAtIHJQb3NfOwotICAgIG1lbWNweShyQnVmXywgckJ1Zl8gKyByUG9zXywgcmVhZF9haGVhZCk7Ci0gICAgclBvc18gPSAwOwotICAgIHJMZW5fID0gcmVhZF9haGVhZDsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgd3JpdGVFbmQoKSB7Ci0gICAgaWYgKHBpcGVPbldyaXRlXykgewotICAgICAgZHN0VHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOwotICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZmx1c2goKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUYXJnZXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIGRzdFRyYW5zXzsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKLQotICB1aW50OF90KiByQnVmXzsKLSAgdWludDMyX3QgckJ1ZlNpemVfOwotICB1aW50MzJfdCByUG9zXzsKLSAgdWludDMyX3Qgckxlbl87Ci0KLSAgdWludDhfdCogd0J1Zl87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgdWludDMyX3Qgd0xlbl87Ci0KLSAgYm9vbCBwaXBlT25SZWFkXzsKLSAgYm9vbCBwaXBlT25Xcml0ZV87Ci19OwotCi0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHBpcGVkVHJhbnNwb3J0IGluc3RhbmNlLgotICoKLSAqLwotY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewotICAgIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoZHN0VHJhbnMpOwotICB9Ci0gIHZpcnR1YWwgflRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKLSAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKLSAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwotfTsKLQotLyoqCi0gKiBUUGlwZWRGaWxlVHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgbGlrZSBhIFRUcmFuc3BvcnQsIGV4Y2VwdCB0aGF0Ci0gKiBpdCBpcyBhIHRlbXBsYXRpemVkIGNsYXNzLCBzbyB0aGF0IGNsaWVudHMgd2hvIHJlbHkgb24gYSBzcGVjaWZpYwotICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCi0gKgotICovCi1jbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKLQotICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwotCi0gIC8vIFRUcmFuc3BvcnQgZnVuY3Rpb25zCi0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIG9wZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgcmVhZEVuZCgpOwotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdm9pZCB3cml0ZUVuZCgpOwotICB2b2lkIGZsdXNoKCk7Ci0KLSAgLy8gVEZpbGVSZWFkZXJUcmFuc3BvcnQgZnVuY3Rpb25zCi0gIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKTsKLSAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KTsKLSAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7Ci0gIHVpbnQzMl90IGdldEN1ckNodW5rKCk7Ci0gIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuayk7Ci0gIHZvaWQgc2Vla1RvRW5kKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHNob3VsZG4ndCBiZSB1c2VkCi0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKLX07Ci0KLS8qKgotICogQ3JlYXRlcyBhIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgZnJvbSBhIGZpbGVwYXRoIGFuZCBhIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAotICoKLSAqLwotY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykKLSAge30KLSAgdmlydHVhbCB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydCA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwotICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwotICAgIH0KLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4obmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE0ZTkwLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCi12b2lkIFRabGliVHJhbnNwb3J0Ojppbml0WmxpYigpIHsKLSAgaW50IHJ2OwotICBib29sIHJfaW5pdCA9IGZhbHNlOwotICB0cnkgewotICAgIHJzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotCi0gICAgcnN0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwotICAgIHJzdHJlYW1fLT56ZnJlZSAgPSBaX05VTEw7Ci0gICAgd3N0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICByc3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOwotICAgIHdzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgID0gY3JidWZfOwotICAgIHdzdHJlYW1fLT5uZXh0X2luICAgPSB1d2J1Zl87Ci0gICAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKLSAgICB3c3RyZWFtXy0+bmV4dF9vdXQgID0gY3didWZfOwotICAgIHJzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHdzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87Ci0KLSAgICBydiA9IGluZmxhdGVJbml0KHJzdHJlYW1fKTsKLSAgICBjaGVja1psaWJSdihydiwgcnN0cmVhbV8tPm1zZyk7Ci0KLSAgICAvLyBIYXZlIHRvIHNldCB0aGlzIGZsYWcgc28gd2Uga25vdyB3aGV0aGVyIHRvIGRlLWluaXRpYWxpemUuCi0gICAgcl9pbml0ID0gdHJ1ZTsKLQotICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgY2hlY2tabGliUnYocnYsIHdzdHJlYW1fLT5tc2cpOwotICB9Ci0KLSAgY2F0Y2ggKC4uLikgewotICAgIGlmIChyX2luaXQpIHsKLSAgICAgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7Ci0gICAgICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOwotICAgIH0KLSAgICAvLyBUaGVyZSBpcyBubyB3YXkgd2UgY2FuIGdldCBoZXJlIGlmIHdzdHJlYW1fIHdhcyBpbml0aWFsaXplZC4KLQotICAgIHRocm93OwotICB9Ci19Ci0KLWlubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHRocm93IFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKHN0YXR1cywgbWVzc2FnZSk7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHN0cmluZyBvdXRwdXQgPSAiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAiICsKLSAgICAgIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uOjplcnJvck1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlKTsKLSAgICBHbG9iYWxPdXRwdXQob3V0cHV0LmNfc3RyKCkpOwotICB9Ci19Ci0KLVRabGliVHJhbnNwb3J0Ojp+VFpsaWJUcmFuc3BvcnQoKSB7Ci0gIGludCBydjsKLSAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKLSAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCByc3RyZWFtXy0+bXNnKTsKLSAgcnYgPSBkZWZsYXRlRW5kKHdzdHJlYW1fKTsKLSAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCB3c3RyZWFtXy0+bXNnKTsKLQotICBkZWxldGVbXSB1cmJ1Zl87Ci0gIGRlbGV0ZVtdIGNyYnVmXzsKLSAgZGVsZXRlW10gdXdidWZfOwotICBkZWxldGVbXSBjd2J1Zl87Ci0gIGRlbGV0ZSByc3RyZWFtXzsKLSAgZGVsZXRlIHdzdHJlYW1fOwotfQotCi1ib29sIFRabGliVHJhbnNwb3J0Ojppc09wZW4oKSB7Ci0gIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLX0KLQotLy8gUkVBRElORyBTVFJBVEVHWQotLy8KLS8vIFdlIGhhdmUgdHdvIGJ1ZmZlcnMgZm9yIHJlYWRpbmc6IG9uZSBjb250YWluaW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKGNyYnVmXykKLS8vIGFuZCBvbmUgY29udGFpbmluZyB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKHVyYnVmXykuICBXaGVuIHJlYWQgaXMgY2FsbGVkLAotLy8gd2UgcmVwZWF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgdW50aWwgd2UgaGF2ZSBzYXRpc2ZpZWQgdGhlIHJlcXVlc3Q6Ci0vLyAtIENvcHkgZGF0YSBmcm9tIHVyYnVmXyBpbnRvIHRoZSBjYWxsZXIncyBidWZmZXIuCi0vLyAtIElmIHdlIGhhZCBlbm91Z2gsIHJldHVybi4KLS8vIC0gSWYgdXJidWZfIGlzIGVtcHR5LCByZWFkIHNvbWUgZGF0YSBpbnRvIGl0IGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotLy8gLSBJbmZsYXRlIGRhdGEgZnJvbSBjcmJ1Zl8gaW50byB1cmJ1Zl8uCi0vLwotLy8gSW4gc3RhbmRhbG9uZSBvYmplY3RzLCB3ZSBzZXQgaW5wdXRfZW5kZWRfIHRvIHRydWUgd2hlbiBpbmZsYXRlIHJldHVybnMKLS8vIFpfU1RSRUFNX0VORC4gIFRoaXMgYWxsb3dzIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY2hlY2tzdW0gd2FzIHZlcmlmaWVkLgotCi1pbmxpbmUgaW50IFRabGliVHJhbnNwb3J0OjpyZWFkQXZhaWwoKSB7Ci0gIHJldHVybiB1cmJ1Zl9zaXplXyAtIHJzdHJlYW1fLT5hdmFpbF9vdXQgLSB1cnBvc187Ci19Ci0KLXVpbnQzMl90IFRabGliVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGludCBuZWVkID0gbGVuOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogU2tpcCB1cmJ1ZiBvbiBiaWcgcmVhZHMuCi0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlIGF2YWlsYWJsZSwgdGhlbiBnaXZlIHRoZW0gdGhlIG1pbiBvZgotICAgIC8vIHdoYXQgd2UgaGF2ZSBhbmQgd2hhdCB0aGV5IHdhbnQsIHRoZW4gYWR2YW5jZSBpbmRpY2VzLgotICAgIGludCBnaXZlID0gc3RkOjptaW4ocmVhZEF2YWlsKCksIG5lZWQpOwotICAgIG1lbWNweShidWYsIHVyYnVmXyArIHVycG9zXywgZ2l2ZSk7Ci0gICAgbmVlZCAtPSBnaXZlOwotICAgIGJ1ZiArPSBnaXZlOwotICAgIHVycG9zXyArPSBnaXZlOwotCi0gICAgLy8gSWYgdGhleSB3ZXJlIHNhdGlzZmllZCwgd2UgYXJlIGRvbmUuCi0gICAgaWYgKG5lZWQgPT0gMCkgewotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBnZXQgdG8gdGhpcyBwb2ludCwgd2UgbmVlZCB0byBnZXQgc29tZSBtb3JlIGRhdGEuCi0KLSAgICAvLyBJZiB6bGliIGhhcyByZXBvcnRlZCB0aGUgZW5kIG9mIGEgc3RyZWFtLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55IG1vcmUuCi0gICAgaWYgKGlucHV0X2VuZGVkXykgewotICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgfQotCi0gICAgLy8gVGhlIHVuY29tcHJlc3NlZCByZWFkIGJ1ZmZlciBpcyBlbXB0eSwgc28gcmVzZXQgdGhlIHN0cmVhbSBmaWVsZHMuCi0gICAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKLSAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87Ci0gICAgdXJwb3NfID0gMDsKLQotICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29tcHJlc3NlZCBkYXRhIGF2YWlsYWJsZSwKLSAgICAvLyByZWFkIHNvbWUgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAgaWYgKHJzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKGNyYnVmXywgY3JidWZfc2l6ZV8pOwotICAgICAgaWYgKGdvdCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBsZW4gLSBuZWVkOwotICAgICAgfQotICAgICAgcnN0cmVhbV8tPm5leHRfaW4gID0gY3JidWZfOwotICAgICAgcnN0cmVhbV8tPmF2YWlsX2luID0gZ290OwotICAgIH0KLQotICAgIC8vIFdlIGhhdmUgc29tZSBjb21wcmVzc2VkIGRhdGEgbm93LiAgVW5jb21wcmVzcyBpdC4KLSAgICBpbnQgemxpYl9ydiA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7Ci0KLSAgICBpZiAoemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgIGlmIChzdGFuZGFsb25lXykgewotICAgICAgICBpbnB1dF9lbmRlZF8gPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBjaGVja1psaWJSdih6bGliX3J2LCByc3RyZWFtXy0+bXNnKTsKLSAgICB9Ci0KLSAgICAvLyBPa2F5LiAgVGhlIHJlYWQgYnVmZmVyIHNob3VsZCBoYXZlIHdoYXRldmVyIHdlIGNhbiBnaXZlIGl0IG5vdy4KLSAgICAvLyBMb29wIGJhY2sgdG8gdGhlIHN0YXJ0IGFuZCB0cnkgdG8gZ2l2ZSBzb21lIG1vcmUuCi0gIH0KLX0KLQotCi0vLyBXUklUSU5HIFNUUkFURUdZCi0vLwotLy8gV2UgYnVmZmVyIHVwIHNtYWxsIHdyaXRlcyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHpsaWIsIHNvIG91ciBsb2dpYyBpczoKLS8vIC0gSXMgdGhlIHdyaXRlIGJpZz8KLS8vICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KLS8vICAgLSBTZW5kIHRoaXMgZGF0YSB0byB6bGliLgotLy8gLSBJcyB0aGUgd3JpdGUgc21hbGw/Ci0vLyAgIC0gSXMgdGhlcmUgaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIGl0PwotLy8gICAgIC0gU2VuZCB0aGUgYnVmZmVyIHRvIHpsaWIuCi0vLyAgIC0gQ29weSB0aGUgZGF0YSB0byB0aGUgYnVmZmVyLgotLy8KLS8vIFdlIGhhdmUgdHdvIGJ1ZmZlcnMgZm9yIHdyaXRpbmcgYWxzbzogdGhlIHVuY29tcHJlc3NlZCBidWZmZXIgKG1lbnRpb25lZAotLy8gYWJvdmUpIGFuZCB0aGUgY29tcHJlc3NlZCBidWZmZXIuICBXaGVuIHNlbmRpbmcgZGF0YSB0byB6bGliIHdlIGxvb3Agb3ZlcgotLy8gdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgc291cmNlICh1bmNvbXByZXNzZWQgYnVmZmVyIG9yIGJpZyB3cml0ZSkgaXMgZW1wdHk6Ci0vLyAtIElzIHRoZXJlIG5vIG1vcmUgc3BhY2UgaW4gdGhlIGNvbXByZXNzZWQgYnVmZmVyPwotLy8gICAtIFdyaXRlIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0vLyAtIERlZmxhdGUgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotCi12b2lkIFRabGliVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAvLyB6bGliJ3MgImRlZmxhdGUiIGZ1bmN0aW9uIGhhcyBlbm91Z2ggbG9naWMgaW4gaXQgdGhhdCBJIHRoaW5rCi0gIC8vIHdlJ3JlIGJldHRlciBvZmYgKHBlcmZvcm1hbmNlLXdpc2UpIGJ1ZmZlcmluZyB1cCBzbWFsbCB3cml0ZXMuCi0gIGlmICgoaW50KWxlbiA+IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7Ci0gICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18pOwotICAgIHV3cG9zXyA9IDA7Ci0gICAgZmx1c2hUb1psaWIoYnVmLCBsZW4pOwotICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLSAgICBpZiAodXdidWZfc2l6ZV8gLSB1d3Bvc18gPCAoaW50KWxlbikgewotICAgICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18pOwotICAgICAgdXdwb3NfID0gMDsKLSAgICB9Ci0gICAgbWVtY3B5KHV3YnVmXyArIHV3cG9zXywgYnVmLCBsZW4pOwotICAgIHV3cG9zXyArPSBsZW47Ci0gIH0KLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSAgewotICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgdHJ1ZSk7Ci0gIGFzc2VydCgoaW50KXdzdHJlYW1fLT5hdmFpbF9vdXQgIT0gY3didWZfc2l6ZV8pOwotICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfIC0gd3N0cmVhbV8tPmF2YWlsX291dCk7Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgYm9vbCBmaW5pc2gpIHsKLSAgaW50IGZsdXNoID0gKGZpbmlzaCA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7Ci0KLSAgd3N0cmVhbV8tPm5leHRfaW4gID0gY29uc3RfY2FzdDx1aW50OF90Kj4oYnVmKTsKLSAgd3N0cmVhbV8tPmF2YWlsX2luID0gbGVuOwotCi0gIHdoaWxlICh3c3RyZWFtXy0+YXZhaWxfaW4gPiAwIHx8IGZpbmlzaCkgewotICAgIC8vIElmIG91ciBvdXB1dCBidWZmZXIgaXMgZnVsbCwgZmx1c2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgIGlmICh3c3RyZWFtXy0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8pOwotICAgICAgd3N0cmVhbV8tPm5leHRfb3V0ICA9IGN3YnVmXzsKLSAgICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKLSAgICB9Ci0KLSAgICBpbnQgemxpYl9ydiA9IGRlZmxhdGUod3N0cmVhbV8sIGZsdXNoKTsKLQotICAgIGlmIChmaW5pc2ggJiYgemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgIGFzc2VydCh3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjaGVja1psaWJSdih6bGliX3J2LCB3c3RyZWFtXy0+bXNnKTsKLSAgfQotfQotCi1jb25zdCB1aW50OF90KiBUWmxpYlRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KLSAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgZ2l2ZSBhIHBvaW50ZXIgdG8gaXQsCi0gIC8vIG90aGVyd2lzZSBsZXQgdGhlIHByb3Rjb2wgdXNlIGl0cyBzbG93IHBhdGguCi0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KSpsZW4pIHsKLSAgICAqbGVuID0gKHVpbnQzMl90KXJlYWRBdmFpbCgpOwotICAgIHJldHVybiB1cmJ1Zl8gKyB1cnBvc187Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KWxlbikgewotICAgIHVycG9zXyArPSBsZW47Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOwotICB9Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OnZlcmlmeUNoZWNrc3VtKCkgewotICBpZiAoIXN0YW5kYWxvbmVfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICJUWkxpYlRyYW5zcG9ydCBjYW4gb25seSB2ZXJpZnkgY2hlY2tzdW1zIGZvciBzdGFuZGFsb25lIG9iamVjdHMuIik7Ci0gIH0KLQotICBpZiAoIWlucHV0X2VuZGVkXykgewotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZSwKLSAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB3aG9sZSBjaGVja3N1bSBoYXMgbm90IGJlZW4gZmVkIHRvIHpsaWIgeWV0LgotICAgIC8vIFdlIHRyeSB0byByZWFkIGFuIGV4dHJhIGJ5dGUgaGVyZSB0byBmb3JjZSB6bGliIHRvIGZpbmlzaCB0aGUgc3RyZWFtLgotICAgIC8vIEl0IG1pZ2h0IG5vdCBhbHdheXMgYmUgZWFzeSB0byAidW5yZWFkIiB0aGlzIGJ5dGUsCi0gICAgLy8gYnV0IHdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZSBnZXQgaXQsIHdoaWNoIGlzIG5vdCByZWFsbHkKLSAgICAvLyBhIHJlY292ZXJhYmxlIGVycm9yLCBzbyBpdCBkb2Vzbid0IG1hdHRlci4KLSAgICB1aW50OF90IGJ1ZlsxXTsKLSAgICB1aW50MzJfdCBnb3QgPSB0aGlzLT5yZWFkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgIGlmIChnb3QgfHwgIWlucHV0X2VuZGVkXykgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKLSAgICAgICAgICAiWmxpYiBzdHJlYW0gbm90IGNvbXBsZXRlLiIpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBjaGVja3N1bSBoYWQgYmVlbiBiYWQsIHdlIHdvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIHdoaWxlCi0gIC8vIGluZmxhdGluZy4KLX0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzOWQ5ZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotCi1zdHJ1Y3Qgel9zdHJlYW1fczsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotY2xhc3MgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpIDoKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlKHN0YXR1cywgbXNnKSksCi0gICAgemxpYl9zdGF0dXNfKHN0YXR1cyksCi0gICAgemxpYl9tc2dfKG1zZyA9PSBOVUxMID8gIihudWxsKSIgOiBtc2cpIHt9Ci0KLSAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgaW50IGdldFpsaWJTdGF0dXMoKSB7IHJldHVybiB6bGliX3N0YXR1c187IH0KLSAgc3RkOjpzdHJpbmcgZ2V0WmxpYk1lc3NhZ2UoKSB7IHJldHVybiB6bGliX21zZ187IH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgewotICAgIHN0ZDo6c3RyaW5nIHJ2ID0gInpsaWIgZXJyb3I6ICI7Ci0gICAgaWYgKG1zZykgewotICAgICAgcnYgKz0gbXNnOwotICAgIH0gZWxzZSB7Ci0gICAgICBydiArPSAiKG5vIG1lc3NhZ2UpIjsKLSAgICB9Ci0gICAgcnYgKz0gIiAoc3RhdHVzID0gIjsKLSAgICBydiArPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihzdGF0dXMpOwotICAgIHJ2ICs9ICIpIjsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBpbnQgemxpYl9zdGF0dXNfOwotICBzdGQ6OnN0cmluZyB6bGliX21zZ187Ci19OwotCi0vKioKLSAqIFRoaXMgdHJhbnNwb3J0IHVzZXMgemxpYidzIGNvbXByZXNzZWQgZm9ybWF0IG9uIHRoZSAiZmFyIiBzaWRlLgotICoKLSAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgVFpsaWJUcmFuc3BvcnQgb2JqZWN0czoKLSAqIC0gU3RhbmRhbG9uZSBvYmplY3RzIGFyZSB1c2VkIHRvIGVuY29kZSBzZWxmLWNvbnRhaW5lZCBjaHVua3Mgb2YgZGF0YQotICogICAobGlrZSBzdHJ1Y3R1cmVzKS4gIFRoZXkgaW5jbHVkZSBjaGVja3N1bXMuCi0gKiAtIE5vbi1zdGFuZGFsb25lIHRyYW5zcG9ydHMgYXJlIHVzZWQgZm9yIFJQQy4gIFRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gKgotICogVE9ETyhkcmVpc3MpOiBEb24ndCBkbyBhbiBleHRyYSBjb3B5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaWYKLSAqICAgICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIFRCdWZmZXJlZCBvciBUTWVtb3J5LgotICoKLSAqLwotY2xhc3MgVFpsaWJUcmFuc3BvcnQgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotCi0gIC8qKgotICAgKiBAcGFyYW0gdHJhbnNwb3J0ICAgIFRoZSB0cmFuc3BvcnQgdG8gcmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbQotICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8uCi0gICAqIEBwYXJhbSB1c2VfZm9yX3JwYyAgVHJ1ZSBpZiB0aGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgZm9yIFJQQywKLSAgICogICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGlzIGlzIGEgc3RhbmRhbG9uZSBvYmplY3QuCi0gICAqIEBwYXJhbSB1cmJ1Zl9zaXplICAgVW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgotICAgKiBAcGFyYW0gY3JidWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHJlYWRpbmcuCi0gICAqIEBwYXJhbSB1d2J1Zl9zaXplICAgVW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgotICAgKiBAcGFyYW0gY3didWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCi0gICAqCi0gICAqIFRPRE8oZHJlaXNzKTogV3JpdGUgYSBjb25zdHJ1Y3RvciB0aGF0IGlzbid0IGEgcGFpbi4KLSAgICovCi0gIFRabGliVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgYm9vbCB1c2VfZm9yX3JwYywKLSAgICAgICAgICAgICAgICAgaW50IHVyYnVmX3NpemUgPSBERUZBVUxUX1VSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCBjcmJ1Zl9zaXplID0gREVGQVVMVF9DUkJVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgdXdidWZfc2l6ZSA9IERFRkFVTFRfVVdCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IGN3YnVmX3NpemUgPSBERUZBVUxUX0NXQlVGX1NJWkUpIDoKLSAgICB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCi0gICAgc3RhbmRhbG9uZV8oIXVzZV9mb3JfcnBjKSwKLSAgICB1cnBvc18oMCksCi0gICAgdXdwb3NfKDApLAotICAgIGlucHV0X2VuZGVkXyhmYWxzZSksCi0gICAgb3V0cHV0X2ZsdXNoZWRfKGZhbHNlKSwKLSAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKLSAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKLSAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKLSAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKLSAgICB1cmJ1Zl8oTlVMTCksCi0gICAgY3JidWZfKE5VTEwpLAotICAgIHV3YnVmXyhOVUxMKSwKLSAgICBjd2J1Zl8oTlVMTCksCi0gICAgcnN0cmVhbV8oTlVMTCksCi0gICAgd3N0cmVhbV8oTlVMTCkKLSAgewotCi0gICAgaWYgKCFzdGFuZGFsb25lXykgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgUlBDLiIpOwotICAgIH0KLQotICAgIGlmICh1d2J1Zl9zaXplXyA8IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7Ci0gICAgICAvLyBIYXZlIHRvIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgYmVjYXVzZSBvZiBhIGxpbmtpbmcgaXNzdWUuCi0gICAgICBpbnQgbWluaW11bSA9IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG1pbmltdW0pICsgIi4iKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgdXJidWZfID0gbmV3IHVpbnQ4X3RbdXJidWZfc2l6ZV07Ci0gICAgICBjcmJ1Zl8gPSBuZXcgdWludDhfdFtjcmJ1Zl9zaXplXTsKLSAgICAgIHV3YnVmXyA9IG5ldyB1aW50OF90W3V3YnVmX3NpemVdOwotICAgICAgY3didWZfID0gbmV3IHVpbnQ4X3RbY3didWZfc2l6ZV07Ci0KLSAgICAgIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgIGluaXRabGliKCk7Ci0KLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGRlbGV0ZVtdIHVyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIGNyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIHV3YnVmXzsKLSAgICAgIGRlbGV0ZVtdIGN3YnVmXzsKLSAgICAgIHRocm93OwotICAgIH0KLSAgfQotCi0gIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgdm9pZCBpbml0WmxpYigpOwotCi0gIH5UWmxpYlRyYW5zcG9ydCgpOwotCi0gIGJvb2wgaXNPcGVuKCk7Ci0KLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgZmx1c2goKTsKLQotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKLQotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKTsKLQotICB2b2lkIHZlcmlmeUNoZWNrc3VtKCk7Ci0KLSAgIC8qKgotICAgICogVE9ETyhzb21lb25lX3NtYXJ0KTogQ2hvb3NlIHNtYXJ0IGRlZmF1bHRzLgotICAgICovCi0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VUkJVRl9TSVpFID0gMTI4OwotICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1JCVUZfU0laRSA9IDEwMjQ7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OwotICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgaW5saW5lIHZvaWQgY2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKLSAgaW5saW5lIHZvaWQgY2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7Ci0gIGlubGluZSBpbnQgcmVhZEF2YWlsKCk7Ci0gIHZvaWQgZmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBib29sIGZpbmlzaCA9IGZhbHNlKTsKLQotICAvLyBXcml0ZXMgc21hbGxlciB0aGFuIHRoaXMgYXJlIGJ1ZmZlcmVkIHVwLgotICAvLyBMYXJnZXIgKG9yIGVxdWFsKSB3cml0ZXMgYXJlIGR1bXBlZCBzdHJhaWdodCB0byB6bGliLgotICBzdGF0aWMgY29uc3QgaW50IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLSAgYm9vbCBzdGFuZGFsb25lXzsKLQotICBpbnQgdXJwb3NfOwotICBpbnQgdXdwb3NfOwotCi0gIC8vLyBUcnVlIGlmZiB6bGliIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgYSBzdHJlYW0uCi0gIC8vLyBUaGlzIGlzIG9ubHkgZXZlciB0cnVlIGluIHN0YW5kYWxvbmUgcHJvdGNvbCBvYmplY3RzLgotICBib29sIGlucHV0X2VuZGVkXzsKLSAgLy8vIFRydWUgaWZmIHdlIGhhdmUgZmx1c2hlZCB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgLy8vIFRoaXMgaXMgb25seSBldmVyIHRydWUgaW4gc3RhbmRhbG9uZSBwcm90Y29sIG9iamVjdHMuCi0gIGJvb2wgb3V0cHV0X2ZsdXNoZWRfOwotCi0gIGludCB1cmJ1Zl9zaXplXzsKLSAgaW50IGNyYnVmX3NpemVfOwotICBpbnQgdXdidWZfc2l6ZV87Ci0gIGludCBjd2J1Zl9zaXplXzsKLQotICB1aW50OF90KiB1cmJ1Zl87Ci0gIHVpbnQ4X3QqIGNyYnVmXzsKLSAgdWludDhfdCogdXdidWZfOwotICB1aW50OF90KiBjd2J1Zl87Ci0KLSAgc3RydWN0IHpfc3RyZWFtX3MqIHJzdHJlYW1fOwotICBzdHJ1Y3Qgel9zdHJlYW1fcyogd3N0cmVhbV87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWM3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBBbGxQcm90b2NvbFRlc3RzCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAiQWxsUHJvdG9jb2xUZXN0cy50Y2MiCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKworY2hhciBlcnJvck1lc3NhZ2VbRVJSX0xFTl07CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluYXJ5X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9saXR0bGVfYmluYXJ5X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUTEVCaW5hcnlQcm90b2NvbD4oIlRMRUJpbmFyeVByb3RvY29sIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY29tcGFjdF9wcm90b2NvbCkgeworICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VhYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNQUk9UT0NPTFRFU1RfVENDXworI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ1BST1RPQ09MVEVTVF9UQ0NfIDEKKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCisjaW5jbHVkZSAiR2VuZXJpY0hlbHBlcnMuaCIKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCisjZGVmaW5lIEVSUl9MRU4gNTEyCitleHRlcm4gY2hhciBlcnJvck1lc3NhZ2VbRVJSX0xFTl07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdG8sIHR5cGVuYW1lIFZhbD4KK3ZvaWQgdGVzdE5ha2VkKFZhbCB2YWwpIHsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVFByb3RvKHRyYW5zcG9ydCkpOworCisgIEdlbmVyaWNJTzo6d3JpdGUocHJvdG9jb2wsIHZhbCk7CisgIFZhbCBvdXQ7CisgIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKKyAgaWYgKG91dCAhPSB2YWwpIHsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBFUlJfTEVOLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdG8sIFRUeXBlIHR5cGUsIHR5cGVuYW1lIFZhbD4KK3ZvaWQgdGVzdEZpZWxkKGNvbnN0IFZhbCB2YWwpIHsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVFByb3RvKHRyYW5zcG9ydCkpOworCisgIHByb3RvY29sLT53cml0ZVN0cnVjdEJlZ2luKCJ0ZXN0X3N0cnVjdCIpOworICBwcm90b2NvbC0+d3JpdGVGaWVsZEJlZ2luKCJ0ZXN0X2ZpZWxkIiwgdHlwZSwgKGludDE2X3QpMTUpOworCisgIEdlbmVyaWNJTzo6d3JpdGUocHJvdG9jb2wsIHZhbCk7CisKKyAgcHJvdG9jb2wtPndyaXRlRmllbGRFbmQoKTsKKyAgcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgVFR5cGUgZmllbGRUeXBlOworICBpbnQxNl90IGZpZWxkSWQ7CisKKyAgcHJvdG9jb2wtPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisKKyAgaWYgKGZpZWxkSWQgIT0gMTUpIHsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCBJRCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgIH0KKyAgaWYgKGZpZWxkVHlwZSAhPSB0eXBlKSB7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgRmllbGQgVHlwZSAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgIH0KKworICBWYWwgb3V0OworICBHZW5lcmljSU86OnJlYWQocHJvdG9jb2wsIG91dCk7CisKKyAgaWYgKG91dCAhPSB2YWwpIHsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCB2YWx1ZSByZWFkICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgfQorCisgIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsKKyAgcHJvdG9jb2wtPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bz4KK3ZvaWQgdGVzdE1lc3NhZ2UoKSB7CisgIHN0cnVjdCBUTWVzc2FnZSB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICB9IG1lc3NhZ2VzW10gPSB7eyJzaG9ydCBtZXNzYWdlIG5hbWUiLCBUX0NBTEwsIDB9LAorICAgICAgICAgICAgICAgICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAorICAgICAgICAgICAgICAgICAgeyJsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIiwgVF9FWENFUFRJT04sIDEgPDwgMTZ9LAorICAgICAgICAgICAgICAgICAgeyJvbmUgd2F5IHB1c2giLCBUX09ORVdBWSwgMTJ9LAorICAgICAgICAgICAgICAgICAgeyJKYW5reSIsIFRfQ0FMTCwgMH19OworICBjb25zdCBpbnQgbWVzc2FnZXNfY291bnQgPSBzaXplb2YobWVzc2FnZXMpIC8gc2l6ZW9mKFRNZXNzYWdlKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzX2NvdW50OyBpKyspIHsKKyAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKKworICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlc1tpXS5uYW1lLCBtZXNzYWdlc1tpXS50eXBlLCBtZXNzYWdlc1tpXS5zZXFpZCk7CisgICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworCisgICAgcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpOworICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8IHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJyZWFkTWVzc2FnZUJlZ2luIGZhaWxlZC4iKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bz4KK3ZvaWQgdGVzdFByb3RvY29sKGNvbnN0IGNoYXIqIHByb3RvbmFtZSkgeworICB0cnkgeworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDhfdD4oKGludDhfdCkxMjMpOworCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfQllURSwgaW50OF90PigoaW50OF90KWkpOworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9CWVRFLCBpbnQ4X3Q+KChpbnQ4X3QpLWkpOworICAgIH0KKworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTEpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTE1MDAwKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCkweDdmZmYpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpOworCisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCkxKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpNyk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTE1MCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTE1MDAwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMHg3ZmZmKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpLTEpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktNyk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0xNTApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMHg3ZmZmKTsKKworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDEpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDE1MDAwKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90PigweGZmZmYpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90PigtMTUwMDApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0weGZmZmYpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCkpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpOworCisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigxKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oNyk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDE1MCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDE1MDAwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMzEzMzcpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigweGZmZmYpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigweGZmZmZmZik7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0xKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTcpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTE1MDAwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZik7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0weGZmZmZmZik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSArIDEwKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpIC0gMTYpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworCisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgeworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oLSgxTEwgPDwgaSkpOworICAgIH0KKworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDYyOyBpKyspIHsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTEwgPDwgaSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTEwgPDwgaSkpOworICAgIH0KKworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGRvdWJsZT4oMTIzLjQ1Nik7CisKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oIiIpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigic2hvcnQiKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oImJvcmRlcmxpbmV0aW55Iik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJhIGJpdCBsb25nZXIgdGhhbiB0aGUgc21hbGxlc3QgcG9zc2libGUiKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oIlx4MVx4Mlx4M1x4NFx4NVx4Nlx4N1x4OFx4OVx4QSIpOyAvLyBraW5kYSBiaW5hcnkgdGVzdAorCisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigiIik7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigic2hvcnQiKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJib3JkZXJsaW5ldGlueSIpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfU1RSSU5HLCBzdGQ6OnN0cmluZz4oImEgYml0IGxvbmdlciB0aGFuIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSIpOworCisgICAgdGVzdE1lc3NhZ2U8VFByb3RvPigpOworCisgICAgcHJpbnRmKCIlcyA9PiBPS1xuIiwgcHJvdG9uYW1lKTsKKyAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIiVzID0+IFRlc3QgRkFJTEVEOiAlcyIsIHByb3RvbmFtZSwgZS53aGF0KCkpOworICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTg4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgQW5ub3RhdGlvblRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSAiZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gTm9ybWFsbHkgdGhyaWZ0IGdlbmVyYXRlcyBvc3RyZWFtIG9wZXJhdG9ycywgaG93ZXZlcgorLy8gd2l0aCB0aGUgYW5ub3RhdGlvbiAiY3BwLmN1c3RvbW9zdHJlYW0iIG9uZSBjYW4gdGVsbCB0aGUKKy8vIGNvbXBpbGVyIHRoZXkgYXJlIGdvaW5nIHRvIHByb3ZpZGUgdGhlaXIgb3duLCBhbmQgbm90CisvLyBlbWl0IG9wZXJhdG9yIDw8IG9yIHByaW50VG8oKS4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IG9zdHJfY3VzdG9tJiBvc2MpCit7CisgIG9zIDw8ICJ7IGJhciA9ICIgPDwgb3NjLmJhciA8PCAiOyB9IjsKKyAgcmV0dXJuIG9zOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoQk9PU1RfVEVTVF9NT0RVTEUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX2NvbXBpbGVyX2dlbmVyYXRlZF9vc3RyZWFtX29wZXJhdG9yKQoreworICBvc3RyX2RlZmF1bHQgZGVmOworICBkZWYuX19zZXRfYmFyKDEwKTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBzc2Q7CisgIHNzZCA8PCBkZWY7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNzZC5zdHIoKSwgIm9zdHJfZGVmYXVsdChiYXI9MTApIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX2N1c3RvbW9zdHJlYW1fdXNlc19jb25zdW1pbmdfYXBwbGljYXRpb25fZGVmaW5pdGlvbikKK3sKKyAgb3N0cl9jdXN0b20gY3VzOworICBjdXMuX19zZXRfYmFyKDEwKTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBjc2Q7CisgIGNzZCA8PCBjdXM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzZC5zdHIoKSwgInsgYmFyID0gMTA7IH0iKTsKK30KKworLyoqCisgKiBEaXNhYmxlZDsgc2VlIFRIUklGVC0xNTY3IC0gbm90IHN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkbworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfdHlwZSkgeworICAvLyBDaGVjayB0aGF0IHRoZSAiY3BwLnR5cGUiIGFubm90YXRpb24gY2hhbmdlcyAic3RydWN0IGZvbyIgdG8gIkRlbnNlRm9vIgorICAvLyBUaGlzIHdvbid0IGNvbXBpbGUgaWYgdGhlIGFubm90YXRpb24gaXMgbWlzaGFuZGxlZAorICBEZW5zZUZvbyBmb287CisgIGZvby5fX3NldF9iYXIoNSk7Cit9CisgKi8KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NmU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6YmFzZTY0X2VuY29kZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6YmFzZTY0X2RlY29kZTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEJhc2U2NFRlc3QpCisKK3ZvaWQgc2V0dXBUZXN0RGF0YShpbnQgaSwgdWludDhfdCogZGF0YSwgaW50JiBsZW4pIHsKKyAgbGVuID0gMDsKKyAgZG8geworICAgIGRhdGFbbGVuXSA9ICh1aW50OF90KShpICYgMHhGRik7CisgICAgaSA+Pj0gODsKKyAgICBsZW4rKzsKKyAgfSB3aGlsZSAoKGxlbiA8IDMpICYmIChpICE9IDApKTsKKworICBCT09TVF9BU1NFUlQoaSA9PSAwKTsKK30KKwordm9pZCBjaGVja0VuY29kaW5nKHVpbnQ4X3QqIGRhdGEsIGludCBsZW4pIHsKKyNpZmRlZiBOREVCVUcKKyAgKCh2b2lkKWRhdGEpOworI2VuZGlmCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIEJPT1NUX0FTU0VSVChpc2FsbnVtKGRhdGFbaV0pIHx8IGRhdGFbaV0gPT0gJy8nIHx8IGRhdGFbaV0gPT0gJysnKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X0Jhc2U2NF9FbmNvZGVfRGVjb2RlKSB7CisgIGludCBsZW47CisgIHVpbnQ4X3QgdGVzdElucHV0WzNdOworICB1aW50OF90IHRlc3RPdXRwdXRbNF07CisKKyAgLy8gVGVzdCBhbGwgcG9zc2libGUgZW5jb2RpbmcgLyBkZWNvZGluZyBjYXNlcyBnaXZlbiB0aGUKKyAgLy8gdGhyZWUgYnl0ZSBsaW1pdCBmb3IgYmFzZTY0X2VuY29kZS4KKworICBmb3IgKGludCBpID0gMHhGRkZGRkY7IGkgPj0gMDsgaS0tKSB7CisKKyAgICAvLyBmaWxsIHRlc3RJbnB1dCBiYXNlZCBvbiBpCisgICAgc2V0dXBUZXN0RGF0YShpLCB0ZXN0SW5wdXQsIGxlbik7CisKKyAgICAvLyBlbmNvZGUgdGhlIHRlc3QgZGF0YSwgdGhlbiBkZWNvZGUgaXQgYWdhaW4KKyAgICBiYXNlNjRfZW5jb2RlKHRlc3RJbnB1dCwgbGVuLCB0ZXN0T3V0cHV0KTsKKworICAgIC8vIHZlcmlmeSBlYWNoIGJ5dGUgaGFzIGEgdmFsaWQgQmFzZTY0IHZhbHVlIChhbHBoYW51bWVyaWMgb3IgZWl0aGVyICsgb3IgLykKKyAgICBjaGVja0VuY29kaW5nKHRlc3RPdXRwdXQsIGxlbik7CisKKyAgICAvLyBkZWNvZGUgb3V0cHV0IGFuZCBjaGVjayB0aGF0IGl0IG1hdGNoZXMgaW5wdXQKKyAgICBiYXNlNjRfZGVjb2RlKHRlc3RPdXRwdXQsIGxlbiArIDEpOworICAgIEJPT1NUX0FTU0VSVCgwID09IG1lbWNtcCh0ZXN0SW5wdXQsIHRlc3RPdXRwdXQsIGxlbikpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAgYi9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY3N2FhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKK2NsYXNzIFRpbWVyIHsKK3B1YmxpYzoKKyAgdGltZXZhbCB2U3RhcnQ7CisKKyAgVGltZXIoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7IH0KKyAgdm9pZCBzdGFydCgpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCAwKTsgfQorCisgIGRvdWJsZSBmcmFtZSgpIHsKKyAgICB0aW1ldmFsIHZFbmQ7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdkVuZCwgMCk7CisgICAgZG91YmxlIGRzdGFydCA9IHZTdGFydC50dl9zZWMgKyAoKGRvdWJsZSl2U3RhcnQudHZfdXNlYyAvIDEwMDAwMDAuMCk7CisgICAgZG91YmxlIGRlbmQgPSB2RW5kLnR2X3NlYyArICgoZG91YmxlKXZFbmQudHZfdXNlYyAvIDEwMDAwMDAuMCk7CisgICAgcmV0dXJuIGRlbmQgLSBkc3RhcnQ7CisgIH0KK307CisKK2ludCBtYWluKCkgeworICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisgIHVzaW5nIHN0ZDo6Y291dDsKKyAgdXNpbmcgc3RkOjplbmRsOworCisgIE9uZU9mRWFjaCBvb2U7CisgIG9vZS5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS5hX2JpdGUgPSAweDdmOworICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7CisgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKKyAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOworICBvb2Uuc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CisgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CisKKyAgaW50IG51bSA9IDEwMDAwMDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcihudW0qMTAwMCkpOworCisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZS53cml0ZSgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIldyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIGJ1Zi0+Z2V0QnVmZmVyKCZkYXRhLCAmZGF0YXNpemUpOworCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZTIucmVhZCgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZTIucmVhZCgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2Uud3JpdGUoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgT25lT2ZFYWNoIG9vZTI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2UyLnJlYWQoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworCisgIGRhdGEgPSBOVUxMOworICBkYXRhc2l6ZSA9IDA7CisgIG51bSA9IDEwMDAwMDAwOworCisgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmOworICBsaXN0RG91YmxlUGVyZi5maWVsZC5yZXNlcnZlKG51bSk7CisgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtOyArK3gpCisgICAgbGlzdERvdWJsZVBlcmYuZmllbGQucHVzaF9iYWNrKGRvdWJsZSh4KSk7CisKKyAgYnVmLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKG51bSAqIDEwMCkpOworCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIGJ1Zi0+Z2V0QnVmZmVyKCZkYXRhLCAmZGF0YXNpemUpOworCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ0N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDA1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2lmIChXSVRIX0RZTl9MSU5LX1RFU1QpCisgICAgYWRkX2RlZmluaXRpb25zKCAtREJPT1NUX1RFU1RfRFlOX0xJTksgKQorZW5kaWYoKQorCisjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CitzZXQodGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvT25lV2F5U2VydmljZS5oCisgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBUaHJpZnRUZXN0X2V4dHJhcy5jcHAKKyAgICBEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCispCisKK2FkZF9saWJyYXJ5KHRlc3RnZW5jcHAgU1RBVElDICR7dGVzdGdlbmNwcF9TT1VSQ0VTfSkKKworc2V0KHRlc3RnZW5jcHBfY29iX1NPVVJDRVMKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5jcHAKKyAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAorKQorYWRkX2xpYnJhcnkodGVzdGdlbmNwcF9jb2IgU1RBVElDICR7dGVzdGdlbmNwcF9jb2JfU09VUkNFU30pCisKK2FkZF9leGVjdXRhYmxlKEJlbmNobWFyayBCZW5jaG1hcmsuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKEJlbmNobWFyayB0aHJpZnQpCithZGRfdGVzdChOQU1FIEJlbmNobWFyayBDT01NQU5EIEJlbmNobWFyaykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKKworc2V0KFVuaXRUZXN0X1NPVVJDRVMKKyAgICBVbml0VGVzdE1haW4uY3BwCisgICAgT25lV2F5SFRUUFRlc3QuY3BwCisgICAgVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisgICAgVEJ1ZmZlckJhc2VUZXN0LmNwcAorICAgIEJhc2U2NFRlc3QuY3BwCisgICAgVG9TdHJpbmdUZXN0LmNwcAorICAgIFR5cGVkZWZUZXN0LmNwcAorICAgIFRTZXJ2ZXJTb2NrZXRUZXN0LmNwcAorICAgIFRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAorKQorCitpZihOT1QgV0lUSF9TVERUSFJFQURTIEFORCBOT1QgTVNWQyBBTkQgTk9UIE1JTkdXKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCkKKyAgICBsaXN0KEFQUEVORCBVbml0VGVzdF9TT1VSQ0VTIGNvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVW5pdFRlc3RzICR7VW5pdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVW5pdFRlc3RzIHRlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFVuaXRUZXN0cyB0aHJpZnQpCithZGRfdGVzdChOQU1FIFVuaXRUZXN0cyBDT01NQU5EIFVuaXRUZXN0cykKK2lmICggTVNWQyApCisgICAgIyBEaXNhYmxlIEM0NTAzOiBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZAorICAgICMgJ2luc2FuaXR5JyByZXN1bHRzIGluIHZlcnkgbG9uZyBkZWNvcmF0ZWQgbmFtZXMKKyAgICBzZXRfcHJvcGVydHkoIFRBUkdFVCBVbml0VGVzdHMgQVBQRU5EX1NUUklORyBQUk9QRVJUWSBDT01QSUxFX0ZMQUdTIC93ZDQ1MDMgKQorZW5kaWYgKCBNU1ZDICkKKworCitzZXQoIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisgICAgIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKQoraWYgKFdJTjMyKQorICAgIGxpc3QoQVBQRU5EIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgICAgVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAorICAgICkKK2VuZGlmKCkKK2FkZF9leGVjdXRhYmxlKFRJbnRlcnJ1cHRUZXN0ICR7VEludGVycnVwdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEludGVycnVwdFRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRJbnRlcnJ1cHRUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKKworYWRkX2V4ZWN1dGFibGUoVFNlcnZlckludGVncmF0aW9uVGVzdCBUU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUU2VydmVySW50ZWdyYXRpb25UZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUU2VydmVySW50ZWdyYXRpb25UZXN0IENPTU1BTkQgVFNlcnZlckludGVncmF0aW9uVGVzdCkKKworaWYoV0lUSF9aTElCKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7WkxJQl9JTkNMVURFX0RJUlN9IikKK2FkZF9leGVjdXRhYmxlKFRyYW5zcG9ydFRlc3QgVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVHJhbnNwb3J0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0eikKK2FkZF90ZXN0KE5BTUUgVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFpsaWJUZXN0IFpsaWJUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhabGliVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShabGliVGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBabGliVGVzdCBDT01NQU5EIFpsaWJUZXN0KQorZW5kaWYoV0lUSF9aTElCKQorCithZGRfZXhlY3V0YWJsZShBbm5vdGF0aW9uVGVzdCBBbm5vdGF0aW9uVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQW5ub3RhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQW5ub3RhdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBBbm5vdGF0aW9uVGVzdCBDT01NQU5EIEFubm90YXRpb25UZXN0KQorCithZGRfZXhlY3V0YWJsZShFbnVtVGVzdCBFbnVtVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRW51bVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRW51bVRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBFbnVtVGVzdCBDT01NQU5EIEVudW1UZXN0KQorCitpZihIQVZFX0dFVE9QVF9IKQorYWRkX2V4ZWN1dGFibGUoVEZpbGVUcmFuc3BvcnRUZXN0IFRGaWxlVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEZpbGVUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRGaWxlVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGaWxlVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGaWxlVHJhbnNwb3J0VGVzdCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVEZEVHJhbnNwb3J0VGVzdCBURkRUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURkRUcmFuc3BvcnRUZXN0CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZEVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGRFRyYW5zcG9ydFRlc3QgQ09NTUFORCBURkRUcmFuc3BvcnRUZXN0KQorCithZGRfZXhlY3V0YWJsZShUUGlwZWRUcmFuc3BvcnRUZXN0IFRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRQaXBlZFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUGlwZWRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVFBpcGVkVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRQaXBlZFRyYW5zcG9ydFRlc3QpCisKK3NldChBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVMKKyAgICBBbGxQcm90b2NvbFRlc3RzLmNwcAorICAgIEFsbFByb3RvY29sVGVzdHMudGNjCisgICAgR2VuZXJpY0hlbHBlcnMKKyAgICApCisKK2FkZF9leGVjdXRhYmxlKEFsbFByb3RvY29sc1Rlc3QgJHtBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEFsbFByb3RvY29sc1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQWxsUHJvdG9jb2xzVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFsbFByb3RvY29sc1Rlc3QgQ09NTUFORCBBbGxQcm90b2NvbHNUZXN0KQorCisjIFRoZSBkZWJ1ZyBydW4tdGltZSBpbiBXaW5kb3dzIGFzc2VydHMgb24gaXNwcmludCgpIHdpdGggbmVnYXRpdmUgaW5wdXRzCitpZiAoTk9UIE1TVkMgT1IgKE1TVkMgQU5EIENNQUtFX0JVSUxEX1RZUEUgRVFVQUwgIkRFQlVHIikpCithZGRfZXhlY3V0YWJsZShEZWJ1Z1Byb3RvVGVzdCBEZWJ1Z1Byb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRGVidWdQcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRGVidWdQcm90b1Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBEZWJ1Z1Byb3RvVGVzdCBDT01NQU5EIERlYnVnUHJvdG9UZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShKU09OUHJvdG9UZXN0IEpTT05Qcm90b1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEpTT05Qcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoSlNPTlByb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEpTT05Qcm90b1Rlc3QgQ09NTUFORCBKU09OUHJvdG9UZXN0KQorCithZGRfZXhlY3V0YWJsZShPcHRpb25hbFJlcXVpcmVkVGVzdCBPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3B0aW9uYWxSZXF1aXJlZFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBPcHRpb25hbFJlcXVpcmVkVGVzdCBDT01NQU5EIE9wdGlvbmFsUmVxdWlyZWRUZXN0KQorCithZGRfZXhlY3V0YWJsZShSZWN1cnNpdmVUZXN0IFJlY3Vyc2l2ZVRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFJlY3Vyc2l2ZVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoUmVjdXJzaXZlVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFJlY3Vyc2l2ZVRlc3QgQ09NTUFORCBSZWN1cnNpdmVUZXN0KQorCithZGRfZXhlY3V0YWJsZShTcGVjaWFsaXphdGlvblRlc3QgU3BlY2lhbGl6YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTcGVjaWFsaXphdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3BlY2lhbGl6YXRpb25UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgU3BlY2lhbGl6YXRpb25UZXN0IENPTU1BTkQgU3BlY2lhbGl6YXRpb25UZXN0KQorCitzZXQoY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTCisgICAgY29uY3VycmVuY3kvVGVzdHMuY3BwCisgICAgY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKykKK2FkZF9leGVjdXRhYmxlKGNvbmN1cnJlbmN5X3Rlc3QgJHtjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNvbmN1cnJlbmN5X3Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBjb25jdXJyZW5jeV90ZXN0IENPTU1BTkQgY29uY3VycmVuY3lfdGVzdCkKKworc2V0KGxpbmtfdGVzdF9TT1VSQ0VTCisgICAgbGluay9MaW5rVGVzdC5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGxpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKKykKKworYWRkX2V4ZWN1dGFibGUobGlua190ZXN0ICR7bGlua190ZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShsaW5rX3Rlc3QgdGhyaWZ0KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwKQorYWRkX3Rlc3QoTkFNRSBsaW5rX3Rlc3QgQ09NTUFORCBsaW5rX3Rlc3QpCisKK2lmKFdJVEhfTElCRVZFTlQpCitzZXQocHJvY2Vzc29yX3Rlc3RfU09VUkNFUworICAgIHByb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5jcHAKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5oCisgICAgcHJvY2Vzc29yL0hhbmRsZXJzLmgKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKykKK2FkZF9leGVjdXRhYmxlKHByb2Nlc3Nvcl90ZXN0ICR7cHJvY2Vzc29yX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMocHJvY2Vzc29yX3Rlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShwcm9jZXNzb3JfdGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgcHJvY2Vzc29yX3Rlc3QgQ09NTUFORCBwcm9jZXNzb3JfdGVzdCkKKworc2V0KFROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcCkKK2FkZF9leGVjdXRhYmxlKFROb25ibG9ja2luZ1NlcnZlclRlc3QgJHtUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X1NPVVJDRVN9KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgVE5vbmJsb2NraW5nU2VydmVyVGVzdCBDT01NQU5EIFROb25ibG9ja2luZ1NlcnZlclRlc3QpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgc2V0KFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCkKKyAgYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFU30pCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICkKKyAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgdGhyaWZ0KQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnRuYikKKyAgYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCitlbmRpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCitlbmRpZihXSVRIX0xJQkVWRU5UKQorCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCithZGRfZXhlY3V0YWJsZShPcGVuU1NMTWFudWFsSW5pdFRlc3QgT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcGVuU1NMTWFudWFsSW5pdFRlc3QKKyAgICAke09QRU5TU0xfTElCUkFSSUVTfQorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKE9wZW5TU0xNYW51YWxJbml0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wZW5TU0xNYW51YWxJbml0VGVzdCBDT01NQU5EIE9wZW5TU0xNYW51YWxJbml0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU2VjdXJpdHlUZXN0IFNlY3VyaXR5VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFNlY3VyaXR5VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBTZWN1cml0eVRlc3QgQ09NTUFORCBTZWN1cml0eVRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCitlbmRpZigpCisKK2lmKFdJVEhfUVQ0KQorc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEIENPTVBPTkVOVFMgUXRUZXN0KQorc2V0KFRRVGNwU2VydmVyVGVzdF9TT1VSQ0VTCisgICAgcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0ICR7VFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdCB0ZXN0Z2VuY3BwX2NvYiB0aHJpZnRxdCBRdDQ6OlF0VGVzdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUVRjcFNlcnZlclRlc3QgQ09NTUFORCBUUVRjcFNlcnZlclRlc3QpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorYWRkX3N1YmRpcmVjdG9yeShxdCkKK2VuZGlmKCkKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L09uZVdheVRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Byb2Nlc3Nvci9wcm9jLnRocmlmdAorKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZjM1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgRGVidWdQcm90b1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOworCitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8xKCkgeworICBvb2UucmVzZXQobmV3IE9uZU9mRWFjaCk7CisgIG9vZS0+aW1fdHJ1ZSA9IHRydWU7CisgIG9vZS0+aW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLT5hX2JpdGUgPSAweDdmOworICBvb2UtPmludGVnZXIxNiA9IDI3MDAwOworICBvb2UtPmludGVnZXIzMiA9IDEgPDwgMjQ7CisgIG9vZS0+aW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKKyAgb29lLT5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKKyAgb29lLT5zb21lX2NoYXJhY3RlcnMgPSAiRGVidWcgVEhJUyEiOworICBvb2UtPnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT25lT2ZFYWNoIHtcbiIKKyAgICAiICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAwMzogYV9iaXRlIChieXRlKSA9IDB4N2YsXG4iCisgICAgIiAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDI3MDAwLFxuIgorICAgICIgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAxNjc3NzIxNixcbiIKKyAgICAiICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjAwMDAwMDAwMCxcbiIKKyAgICAiICAwNzogZG91YmxlX3ByZWNpc2lvbiAoZG91YmxlKSA9IDMuMTQxNTkyNjUzNTg5NzkzMSxcbiIKKyAgICAiICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCJEZWJ1ZyBUSElTIVwiLFxuIgorICAgICIgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQ3XFxuXFxhXFx0XCIsXG4iCisgICAgIiAgMTA6IHdoYXRfd2hvIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAweDAxLFxuIgorICAgICIgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDEsXG4iCisgICAgIiAgICBbMV0gPSAyLFxuIgorICAgICIgICAgWzJdID0gMyxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDE0OiBpNjRfbGlzdCAobGlzdCkgPSBsaXN0PGk2ND5bM10ge1xuIgorICAgICIgICAgWzBdID0gMSxcbiIKKyAgICAiICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICBbMl0gPSAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZygqb29lKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgbi5yZXNldChuZXcgTmVzdGluZyk7CisgIG4tPm15X29vZSA9ICpvb2U7CisgIG4tPm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKKyAgbi0+bXlfb29lLmludGVnZXIzMiA9IDMyOworICBuLT5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7CisgIG4tPm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLT5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLT5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4tPm15X2JvbmsudHlwZSA9IDMxMzM3OworICBuLT5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMikgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk5lc3Rpbmcge1xuIgorICAgICIgIDAxOiBteV9ib25rIChzdHJ1Y3QpID0gQm9uayB7XG4iCisgICAgIiAgICAwMTogdHlwZSAoaTMyKSA9IDMxMzM3LFxuIgorICAgICIgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIkkgYW0gYSBib25rLi4uIHhvciFcIixcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDAyOiBteV9vb2UgKHN0cnVjdCkgPSBPbmVPZkVhY2gge1xuIgorICAgICIgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHg3ZixcbiIKKyAgICAiICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAxNixcbiIKKyAgICAiICAgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAzMixcbiIKKyAgICAiICAgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2NCxcbiIKKyAgICAiICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMS42MTgwMzM5ODg3NDk4OTQ5LFxuIgorICAgICIgICAgMDg6IHNvbWVfY2hhcmFjdGVycyAoc3RyaW5nKSA9IFwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIilcIixcbiIKKyAgICAiICAgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQzXFx4ODBcXHhlMlxceDg1XFx4YWVcXHhjZVxceDlkIFxceGQiCisgICAgICAiMFxceDlkXFx4Y2VcXHhiZlxceGUyXFx4ODVcXHhiZlxceGQwXFx4YmVcXHhjOVxceGExXFx4ZDBcXHhiM1xceGQwXFx4YjAiCisgICAgICAiXFx4Y2ZcXHg4MVxceGUyXFx4ODRcXHg4ZSBcXHhjZVxceDkxdHRcXHhjZVxceGIxXFx4ZTJcXHg4NVxceGJkXFx4Y2VcXHhiIgorICAgICAgImFcXHhjN1xceDgzXFx4ZTJcXHg4MFxceGJjXCIsXG4iCisgICAgIiAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAxMTogYmFzZTY0IChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgIFsxXSA9IDB4MDIsXG4iCisgICAgIiAgICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgMTM6IGkxNl9saXN0IChsaXN0KSA9IGxpc3Q8aTE2PlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZygqbikpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8SG9seU1vbGV5PiBobTsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzMoKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGhtLnJlc2V0KG5ldyBIb2x5TW9sZXkpOworCisgIGhtLT5iaWcucHVzaF9iYWNrKCpvb2UpOworICBobS0+YmlnLnB1c2hfYmFjayhuLT5teV9vb2UpOworICBobS0+YmlnWzBdLmFfYml0ZSA9IDB4MjI7CisgIGhtLT5iaWdbMV0uYV9iaXRlID0gMHgzMzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOworICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOworICBzdGFnZTEuY2xlYXIoKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7CisgIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOworICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIHN0YWdlMS5jbGVhcigpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKworICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7CisgIGhtLT5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7CisgIHN0YWdlMi5jbGVhcigpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMykgeworICB0ZXN0Q2FzZVNldHVwXzMoKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIkhvbHlNb2xleSB7XG4iCisgICAgIiAgMDE6IGJpZyAobGlzdCkgPSBsaXN0PHN0cnVjdD5bMl0ge1xuIgorICAgICIgICAgWzBdID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4MjIsXG4iCisgICAgIiAgICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAyNzAwMCxcbiIKKyAgICAiICAgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgICAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjAwMDAwMDAwMCxcbiIKKyAgICAiICAgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAzLjE0MTU5MjY1MzU4OTc5MzEsXG4iCisgICAgIiAgICAgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgICAgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQ3XFxuXFxhXFx0XCIsXG4iCisgICAgIiAgICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgICAgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMV0gPSBPbmVPZkVhY2gge1xuIgorICAgICIgICAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgICAwMjogaW1fZmFsc2UgKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHgzMyxcbiIKKyAgICAiICAgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgICAwNTogaW50ZWdlcjMyIChpMzIpID0gMzIsXG4iCisgICAgIiAgICAgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2NCxcbiIKKyAgICAiICAgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCIsXG4iCisgICAgIiAgICAgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQzXFx4ODBcXHhlMlxceDg1XFx4YWVcXHhjZVxceDlkIFxcIgorICAgICAgInhkMFxceDlkXFx4Y2VcXHhiZlxceGUyXFx4ODVcXHhiZlxceGQwXFx4YmVcXHhjOVxceGExXFx4ZDBcXHhiM1xceGQwXFx4YiIKKyAgICAgICIwXFx4Y2ZcXHg4MVxceGUyXFx4ODRcXHg4ZSBcXHhjZVxceDkxdHRcXHhjZVxceGIxXFx4ZTJcXHg4NVxceGJkXFx4Y2VcXHgiCisgICAgICAiYmFcXHhjN1xceDgzXFx4ZTJcXHg4MFxceGJjXCIsXG4iCisgICAgIiAgICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgICAgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwMjogY29udGFpbiAoc2V0KSA9IHNldDxsaXN0PlszXSB7XG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlsyXSB7XG4iCisgICAgIiAgICAgIFswXSA9IFwiYW5kIGEgb25lXCIsXG4iCisgICAgIiAgICAgIFsxXSA9IFwiYW5kIGEgdHdvXCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gXCJ0aGVuIGEgb25lLCB0d29cIixcbiIKKyAgICAiICAgICAgWzFdID0gXCJ0aHJlZSFcIixcbiIKKyAgICAiICAgICAgWzJdID0gXCJGT1VSISFcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwMzogYm9ua3MgKG1hcCkgPSBtYXA8c3RyaW5nLGxpc3Q+WzNdIHtcbiIKKyAgICAiICAgIFwibm90aGluZ1wiIC0+IGxpc3Q8c3RydWN0PlswXSB7XG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgXCJwb2VcIiAtPiBsaXN0PHN0cnVjdD5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDMsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcInF1b3RoXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsxXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gNCxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwidGhlIHJhdmVuXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsyXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gNSxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwibmV2ZXJtb3JlXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgXCJzb21ldGhpbmdcIiAtPiBsaXN0PHN0cnVjdD5bMl0ge1xuIgorICAgICIgICAgICBbMF0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDEsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIldhaXQuXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsxXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gMixcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiV2hhdD9cIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpobSkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRmZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIERlYnVnUHJvdG9UZXN0X3R5cGVzIHRvIHdvcmsKKworI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgZGVidWcgeworCitib29sIEVtcHR5OjpvcGVyYXRvcjwoRW1wdHkgY29uc3QmIG90aGVyKSBjb25zdCB7CisgICh2b2lkKW90aGVyOworICAvLyBJdCBpcyBlbXB0eSwgc28gYWxsIGFyZSBlcXVhbC4KKyAgcmV0dXJuIGZhbHNlOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBFbnVtVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlICJnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgiCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW06OnR5cGUmIHZhbCkKK3sKKyAgb3MgPDwgInsiIDw8IChpbnQpdmFsIDw8ICI6Q1VTVE9NISIgPDwgIn0iOworICByZXR1cm4gb3M7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShFbnVtVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX3ZhbHVlKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIHRoZSBlbnVtIHZhbHVlcyBtYXRjaCB3aGF0IHdlIGV4cGVjdAorICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8xLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzIsIDIpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMywgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV81LCA1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzYsIDYpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTI6Ok1FMl8wLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMjo6TUUyXzEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0yOjpNRTJfMiwgMik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19OMiwgLTIpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfTjEsIC0xKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX0QwLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX0QxLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzksIDkpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfMTAsIDEwKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQSwgMHg3ZmZmZmZmZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9CLCAweDdmZmZmZmZlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0MsIDB4N2ZmZmZmZmYpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTU6OmUxLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTIsIDQyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RkOjpzdHJpbmcgRW51bVRvU3RyaW5nKF9UIGUpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX29zdHJlYW0pCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0xOjpNRTFfMCksICJNRTFfMCIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtNTo6ZTIpLCAiZTIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTM6Ok1FM19OMSksICJNRTNfTjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjpDdXN0b00yKSwgInsyOkNVU1RPTSF9Iik7CisKKyAgLy8gc29tZSBpbnZhbGlkIG9yIHVua25vd24gdmFsdWUKKyAgTXlFbnVtNTo6dHlwZSB1dXQgPSAoTXlFbnVtNTo6dHlwZSk0NDsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKHV1dCksICI0NCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fY29uc3RhbnQpCit7CisgIE15U3RydWN0IG1zOworICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTJfMiwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lM19uMiwgLTIpOworICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTNfZDEsIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oIGIvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlZjlmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworLyogQ2xhc3NOYW1lIEhlbHBlciBmb3IgY2xlYW5lciBleGNlcHRpb25zICovCitjbGFzcyBDbGFzc05hbWVzIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeworICAgIHJldHVybiAiVW5rbm93biB0eXBlIjsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50OF90PigpIHsKKyAgcmV0dXJuICJieXRlIjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDE2X3Q+KCkgeworICByZXR1cm4gInNob3J0IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeworICByZXR1cm4gImludCI7Cit9Cit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ2NF90PigpIHsKKyAgcmV0dXJuICJsb25nIjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGRvdWJsZT4oKSB7CisgIHJldHVybiAiZG91YmxlIjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsKKyAgcmV0dXJuICJzdHJpbmciOworfQorCisvKiBHZW5lcmljIFByb3RvY29sIEkvTyBmdW5jdGlvbiBmb3IgdGVzdHMgKi8KK2NsYXNzIEdlbmVyaWNJTyB7CitwdWJsaWM6CisgIC8qIFdyaXRlIGZ1bmN0aW9ucyAqLworCisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ4X3QmIHZhbCkgeworICAgIHJldHVybiBwcm90by0+d3JpdGVCeXRlKHZhbCk7CisgIH0KKworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDMyX3QmIHZhbCkgeworICAgIHJldHVybiBwcm90by0+d3JpdGVJMzIodmFsKTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICAgIHJldHVybiBwcm90by0+d3JpdGVEb3VibGUodmFsKTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgICByZXR1cm4gcHJvdG8tPndyaXRlSTY0KHZhbCk7CisgIH0KKworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCkgeworICAgIHJldHVybiBwcm90by0+d3JpdGVTdHJpbmcodmFsKTsKKyAgfQorCisgIC8qIFJlYWQgZnVuY3Rpb25zICovCisKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50MTZfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkxNih2YWwpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50MzJfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgZG91YmxlJiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkRG91YmxlKHZhbCk7IH0KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT5yZWFkU3RyaW5nKHZhbCk7CisgIH0KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWQ3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEpTT05Qcm90b1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxPbmVPZkVhY2g+IG9vZTsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzEoKSB7CisgIG9vZS5yZXNldChuZXcgT25lT2ZFYWNoKTsKKyAgb29lLT5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLT5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UtPmFfYml0ZSA9IDB4N2Y7CisgIG9vZS0+aW50ZWdlcjE2ID0gMjcwMDA7CisgIG9vZS0+aW50ZWdlcjMyID0gMSA8PCAyNDsKKyAgb29lLT5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOworICBvb2UtPmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOworICBvb2UtPnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2UtPnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLT5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNjc3NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKm9vZSkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE5lc3Rpbmc+IG47CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8yKCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBuLnJlc2V0KG5ldyBOZXN0aW5nKTsKKyAgbi0+bXlfb29lID0gKm9vZTsKKyAgbi0+bXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLT5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4tPm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKKyAgbi0+bXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4tPm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4tPm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi0+bXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4tPm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzIpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJ7XCIxXCI6e1wicmVjXCI6e1wiMVwiOntcImkzMlwiOjMxMzM3fSxcIjJcIjp7XCJzdHJcIjpcIkkgYW0gYSBib25rLi4uIHhvciIKKyAgICAiIVwifX19LFwiMlwiOntcInJlY1wiOntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjciCisgICAgIn0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sXCI3XCI6e1wiZGJsXCI6IgorICAgICIxLjYxODAzMzk4ODc0OTg5NDl9LFwiOFwiOntcInN0clwiOlwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIilcIn0sXCI5XCI6eyIKKyAgICAiXCJzdHJcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrHg+KAvFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIiCisgICAgIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyIgorICAgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19fX0iCisgICk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKCpuKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SG9seU1vbGV5PiBobTsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzMoKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGhtLnJlc2V0KG5ldyBIb2x5TW9sZXkpOworCisgIGhtLT5iaWcucHVzaF9iYWNrKCpvb2UpOworICBobS0+YmlnLnB1c2hfYmFjayhuLT5teV9vb2UpOworICBobS0+YmlnWzBdLmFfYml0ZSA9IDB4MjI7CisgIGhtLT5iaWdbMV0uYV9iaXRlID0gMHgzMzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOworICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOworICBzdGFnZTEuY2xlYXIoKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7CisgIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOworICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIHN0YWdlMS5jbGVhcigpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKworICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7CisgIGhtLT5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7CisgIHN0YWdlMi5jbGVhcigpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18zKSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJsc3RcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoiCisgICIzNH0sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LFwiNVwiOntcImkzMlwiOjE2Nzc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwIgorICAifSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjY1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMSIKKyAgIlwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXG5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjoiCisgICJcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyIgorICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fSx7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LCIKKyAgIlwiM1wiOntcImk4XCI6NTF9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LCIKKyAgIlwiN1wiOntcImRibFwiOjEuNjE4MDMzOTg4NzQ5ODk0OX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiIgorICAiKVwifSxcIjlcIjp7XCJzdHJcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrHg+KAvFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6eyIKKyAgIlwic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTYiCisgICJcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NFwiLDMsMSwyLDNdfX1dfSxcIjJcIjp7XCJzZXRcIjpbXCJsc3RcIiwzIgorICAiLFtcInN0clwiLDBdLFtcInN0clwiLDIsXCJhbmQgYSBvbmVcIixcImFuZCBhIHR3b1wiXSxbXCJzdHJcIiwzLFwidGhlbiBhIG9uZSIKKyAgIiwgdHdvXCIsXCJ0aHJlZSFcIixcIkZPVVIhIVwiXV19LFwiM1wiOntcIm1hcFwiOltcInN0clwiLFwibHN0XCIsMyx7XCJub3RoaW4iCisgICJnXCI6W1wicmVjXCIsMF0sXCJwb2VcIjpbXCJyZWNcIiwzLHtcIjFcIjp7XCJpMzJcIjozfSxcIjJcIjp7XCJzdHJcIjpcInF1b3RoIgorICAiXCJ9fSx7XCIxXCI6e1wiaTMyXCI6NH0sXCIyXCI6e1wic3RyXCI6XCJ0aGUgcmF2ZW5cIn19LHtcIjFcIjp7XCJpMzJcIjo1fSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIm5ldmVybW9yZVwifX1dLFwic29tZXRoaW5nXCI6W1wicmVjXCIsMix7XCIxXCI6e1wiaTMyXCI6MX0sXCIiCisgICIyXCI6e1wic3RyXCI6XCJXYWl0LlwifX0se1wiMVwiOntcImkzMlwiOjJ9LFwiMlwiOntcInN0clwiOlwiV2hhdD9cIn19XX1dfX0iCisgICk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKCpobSkpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgb29lLT53cml0ZShwcm90by5nZXQoKSk7CisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKCpvb2UgPT0gb29lMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBobS0+d3JpdGUocHJvdG8uZ2V0KCkpOworICBIb2x5TW9sZXkgaG0yOworICBobTIucmVhZChwcm90by5nZXQoKSk7CisKKyAgQk9PU1RfQ0hFQ0soKmhtID09IGhtMik7CisKKyAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOworCisgIEJPT1NUX0NIRUNLKCpobSAhPSBobTIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNikgeworICBEb3VibGVzIGR1YjsKKyAgZHViLm5hbiA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7CisgIGR1Yi5pbmYgPSBIVUdFX1ZBTDsKKyAgZHViLm5lZ2luZiA9IC1IVUdFX1ZBTDsKKyAgZHViLnJlcGVhdGluZyA9IDEwLjAgLyAzLjA7CisgIGR1Yi5iaWcgPSAxRSszMDU7CisgIGR1Yi50aW55ID0gMUUtMzA1OworICBkdWIuemVybyA9IDAuMDsKKyAgZHViLm5lZ3plcm8gPSAtMC4wOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJkYmxcIjpcIk5hTlwifSxcIjJcIjp7XCJkYmxcIjpcIkluZmluaXR5XCJ9LFwiM1wiOntcImRibFwiOlwiLUluZmkiCisgICJuaXR5XCJ9LFwiNFwiOntcImRibFwiOjMuMzMzMzMzMzMzMzMzMzMzNX0sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTk0ZSsiCisgICIzMDR9LFwiNlwiOntcImRibFwiOjFlLTMwNX0sXCI3XCI6e1wiZGJsXCI6MH0sXCI4XCI6e1wiZGJsXCI6LTB9fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoZHViKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBCYXNlNjQgYmFzZTsKKyAgYmFzZS5hID0gMTIzOworICBiYXNlLmIxID0gIjEiOworICBiYXNlLmIyID0gIjEyIjsKKyAgYmFzZS5iMyA9ICIxMjMiOworICBiYXNlLmI0ID0gIjEyMzQiOworICBiYXNlLmI1ID0gIjEyMzQ1IjsKKyAgYmFzZS5iNiA9ICIxMjM0NTYiOworCisgIGJhc2Uud3JpdGUocHJvdG8uZ2V0KCkpOworICBCYXNlNjQgYmFzZTI7CisgIGJhc2UyLnJlYWQocHJvdG8uZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKGJhc2UgPT0gYmFzZTIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fOCkgeworICBjb25zdCBjaGFyKiBqc29uX3N0cmluZyA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTYuNzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBjb25zdCBzdGQ6OnNpemVfdCBidWZTaXogPSBzdHJsZW4oanNvbl9zdHJpbmcpICogc2l6ZW9mKGNoYXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmU2l6KSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b0hleFNlcXVlbmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgaSsrKSB7CisgICAgc3MgPDwgIlxceCIgPDwgaW50KHVpbnQ4X3Qoc3RyW2ldKSk7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworICBjb25zdCBjaGFyKiBleHBlY3RlZF96b21nX3VuaWNvZGUgPSAiXHhlMFx4YjhceDgxIFx4ZjBceDlkXHg5NFx4YmUiOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFvb2UyLnpvbWdfdW5pY29kZS5jb21wYXJlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSksCisgICAgIkV4cGVjdGVkOlxuIiA8PCB0b0hleFNlcXVlbmNlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSkgPDwgIlxuR290dGVuOlxuIgorICAgICAgICAgICAgICAgICAgPDwgdG9IZXhTZXF1ZW5jZShvb2UyLnpvbWdfdW5pY29kZSkpOworCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWRfbWlzc2luZ19sb3dfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZDgzNVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2hpX3N1cnJvZ2F0ZSkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdWRkM2VcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY0NWE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggXAorCQlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJwcm9jZXNzb3J0ZXN0LmxhCitub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcCBcCisJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKKwlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisKK25vZGlzdF9saWJwcm9jZXNzb3J0ZXN0X2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKKwlnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAgXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuaAorCitUaHJpZnRUZXN0X2V4dHJhcy5vOiBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorRGVidWdQcm90b1Rlc3RfZXh0cmFzLm86IGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAorCitsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitub2luc3RfUFJPR1JBTVMgPSBCZW5jaG1hcmsgXAorCWNvbmN1cnJlbmN5X3Rlc3QKKworQmVuY2htYXJrX1NPVVJDRVMgPSBcCisJQmVuY2htYXJrLmNwcAorCitCZW5jaG1hcmtfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCisKK2NoZWNrX1BST0dSQU1TID0gXAorCVVuaXRUZXN0cyBcCisJVEZEVHJhbnNwb3J0VGVzdCBcCisJVFBpcGVkVHJhbnNwb3J0VGVzdCBcCisJRGVidWdQcm90b1Rlc3QgXAorCUpTT05Qcm90b1Rlc3QgXAorCU9wdGlvbmFsUmVxdWlyZWRUZXN0IFwKKwlSZWN1cnNpdmVUZXN0IFwKKwlTcGVjaWFsaXphdGlvblRlc3QgXAorCUFsbFByb3RvY29sc1Rlc3QgXAorCVRyYW5zcG9ydFRlc3QgXAorCVRJbnRlcnJ1cHRUZXN0IFwKKwlUU2VydmVySW50ZWdyYXRpb25UZXN0IFwKKwlTZWN1cml0eVRlc3QgXAorCVpsaWJUZXN0IFwKKwlURmlsZVRyYW5zcG9ydFRlc3QgXAorCWxpbmtfdGVzdCBcCisJT3BlblNTTE1hbnVhbEluaXRUZXN0IFwKKwlFbnVtVGVzdCBcCisJUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0IFwKKyAgICAgICAgQW5ub3RhdGlvblRlc3QKKworaWYgQU1YX0hBVkVfTElCRVZFTlQKK25vaW5zdF9QUk9HUkFNUyArPSBcCisJcHJvY2Vzc29yX3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IFwKKwlUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IFwKKwlUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CitlbmRpZgorCitURVNUU19FTlZJUk9OTUVOVD0gXAorCUJPT1NUX1RFU1RfTE9HX1NJTks9dGVzdHMueG1sIFwKKwlCT09TVF9URVNUX0xPR19MRVZFTD10ZXN0X3N1aXRlIFwKKwlCT09TVF9URVNUX0xPR19GT1JNQVQ9WE1MCisKK1RFU1RTID0gXAorCSQoY2hlY2tfUFJPR1JBTVMpCisKK1VuaXRUZXN0c19TT1VSQ0VTID0gXAorCVVuaXRUZXN0TWFpbi5jcHAgXAorCU9uZVdheUhUVFBUZXN0LmNwcCBcCisJVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKKwlUQnVmZmVyQmFzZVRlc3QuY3BwIFwKKwlCYXNlNjRUZXN0LmNwcCBcCisJVG9TdHJpbmdUZXN0LmNwcCBcCisJVHlwZWRlZlRlc3QuY3BwIFwKKwlUU2VydmVyU29ja2V0VGVzdC5jcHAgXAorCVRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBcCisJVFRyYW5zcG9ydENoZWNrVGhyb3cuaAorCitVbml0VGVzdHNfU09VUkNFUyArPSBcCisgIGNvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAgXAorICBjb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKKworVW5pdFRlc3RzX0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUSW50ZXJydXB0VGVzdF9TT1VSQ0VTID0gXAorCVRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBcCisJVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCisKK1RJbnRlcnJ1cHRUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKKworVFNlcnZlckludGVncmF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCisKK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitTZWN1cml0eVRlc3RfU09VUkNFUyA9IFwKKwlTZWN1cml0eVRlc3QuY3BwCisKK1NlY3VyaXR5VGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgIGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCisJVHJhbnNwb3J0VGVzdC5jcHAKKworVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgLWx6CisKK1psaWJUZXN0X1NPVVJDRVMgPSBcCisJWmxpYlRlc3QuY3BwCisKK1psaWJUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAtbHoKKworRW51bVRlc3RfU09VUkNFUyA9IFwKKwlFbnVtVGVzdC5jcHAKKworRW51bVRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9TT1VSQ0VTID0gUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcAorCitSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhICQoQk9PU1RfVEVTVF9MREFERCkKKworQW5ub3RhdGlvblRlc3RfU09VUkNFUyA9IFwKKwlBbm5vdGF0aW9uVGVzdC5jcHAKKworQW5ub3RhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKK1RGaWxlVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAorCVRGaWxlVHJhbnNwb3J0VGVzdC5jcHAKKworVEZpbGVUcmFuc3BvcnRUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIFRGRFRyYW5zcG9ydFRlc3QKKyMKK1RGRFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKKwlURkRUcmFuc3BvcnRUZXN0LmNwcAorCitURkRUcmFuc3BvcnRUZXN0X0xEQUREID0gIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworCisjCisjIFRQaXBlZFRyYW5zcG9ydFRlc3QKKyMKK1RQaXBlZFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKKwlUUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBcCisJVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAorCitUUGlwZWRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChCT09TVF9TWVNURU1fTERBREQpIFwKKwkkKEJPT1NUX1RIUkVBRF9MREFERCkKKworIworIyBBbGxQcm90b2NvbHNUZXN0CisjCitBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVMgPSBcCisJQWxsUHJvdG9jb2xUZXN0cy5jcHAgXAorCUFsbFByb3RvY29sVGVzdHMudGNjIFwKKwlHZW5lcmljSGVscGVycy5oCisKK0FsbFByb3RvY29sc1Rlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKKyMKKyMgRGVidWdQcm90b1Rlc3QKKyMKK0RlYnVnUHJvdG9UZXN0X1NPVVJDRVMgPSBcCisJRGVidWdQcm90b1Rlc3QuY3BwCisKK0RlYnVnUHJvdG9UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworCisjCisjIEpTT05Qcm90b1Rlc3QKKyMKK0pTT05Qcm90b1Rlc3RfU09VUkNFUyA9IFwKKwlKU09OUHJvdG9UZXN0LmNwcAorCitKU09OUHJvdG9UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisjCitUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X1NPVVJDRVMgPSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcAorCitUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQorIworIyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisjCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X1NPVVJDRVMgPSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcAorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9DSFJPTk9fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEhSRUFEX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQorCisjCisjIE9wdGlvbmFsUmVxdWlyZWRUZXN0CisjCitPcHRpb25hbFJlcXVpcmVkVGVzdF9TT1VSQ0VTID0gXAorCU9wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAorCitPcHRpb25hbFJlcXVpcmVkVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCisKKyMKKyMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyMKK1JlY3Vyc2l2ZVRlc3RfU09VUkNFUyA9IFwKKwlSZWN1cnNpdmVUZXN0LmNwcAorCitSZWN1cnNpdmVUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBTcGVjaWFsaXphdGlvblRlc3QKKyMKK1NwZWNpYWxpemF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCVNwZWNpYWxpemF0aW9uVGVzdC5jcHAKKworU3BlY2lhbGl6YXRpb25UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTID0gXAorCWNvbmN1cnJlbmN5L1Rlc3RzLmNwcCBcCisJY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmggXAorCWNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oIFwKKwljb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oCisKK2NvbmN1cnJlbmN5X3Rlc3RfTERBREQgPSBcCisgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitsaW5rX3Rlc3RfU09VUkNFUyA9IFwKKyAgbGluay9MaW5rVGVzdC5jcHAgXAorICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcCBcCisgIGxpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwCisKK3Byb2Nlc3Nvcl90ZXN0X1NPVVJDRVMgPSBcCisJcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwIFwKKwlwcm9jZXNzb3IvRXZlbnRMb2cuY3BwIFwKKwlwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcCBcCisJcHJvY2Vzc29yL0V2ZW50TG9nLmggXAorCXByb2Nlc3Nvci9IYW5kbGVycy5oIFwKKwlwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKworcHJvY2Vzc29yX3Rlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKKworT3BlblNTTE1hbnVhbEluaXRUZXN0X1NPVVJDRVMgPSBcCisJT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAorCitPcGVuU1NMTWFudWFsSW5pdFRlc3RfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpIFwKKwkkKE9QRU5TU0xfTERGTEFHUykgXAorCSQoT1BFTlNTTF9MSUJTKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2dlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworCitnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9FbnVtVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIGdlbi1jcHAvT25lV2F5U2VydmljZS5oIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwOiBPbmVXYXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oOiBwcm9jZXNzb3IvcHJvYy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MgLUkuCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY3BwLyoKKworRVhUUkFfRElTVCA9IFwKKwljb25jdXJyZW5jeSBcCisJcHJvY2Vzc29yIFwKKwlxdCBcCisJQ01ha2VMaXN0cy50eHQgXAorCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAorCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCisJT25lV2F5VGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmExNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgiCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShPbmVXYXlIVFRQVGVzdCkKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworbmFtZXNwYWNlIHV0ZiA9IGJvb3N0Ojp1bml0X3Rlc3Q7CisKKy8vIERlZmluZSB0aGlzIGVudiB2YXIgdG8gZW5hYmxlIHNvbWUgbG9nZ2luZyAoaW4gY2FzZSB5b3UgbmVlZCB0byBkZWJ1ZykKKyN1bmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKworY2xhc3MgT25lV2F5U2VydmljZUhhbmRsZXIgOiBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgT25lV2F5U2VydmljZUhhbmRsZXIoKSB7fQorCisgIHZvaWQgcm91bmRUcmlwUlBDKCkgb3ZlcnJpZGUgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgInJvdW5kVHJpcFJQQygpIiA8PCBlbmRsOworI2VuZGlmCisgIH0KKyAgdm9pZCBvbmVXYXlSUEMoKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAib25lV2F5UlBDKCkiIDw8IHN0ZDo6ZW5kbCA7CisjZW5kaWYKKyB9Cit9OworCitjbGFzcyBPbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5IDogdmlydHVhbCBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmRmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5KCkge30KKyAgdmlydHVhbCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGdldEhhbmRsZXIoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykKKyAgeworICAgICh2b2lkKWNvbm5JbmZvIDsKKyAgICByZXR1cm4gbmV3IE9uZVdheVNlcnZpY2VIYW5kbGVyOworICB9CisgIHZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlciggb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CisKK2NsYXNzIFJQQzBUaHJlYWRDbGFzcyB7CitwdWJsaWM6CisgIFJQQzBUaHJlYWRDbGFzcyhUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcikgOiBzZXJ2ZXJfKHNlcnZlcikgeyB9IC8vIENvbnN0cnVjdG9yCit+UlBDMFRocmVhZENsYXNzKCkgeyB9IC8vIERlc3RydWN0b3IKKwordm9pZCBSdW4oKSB7CisgIHNlcnZlcl8uc2VydmUoKSA7Cit9CisgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfIDsKK30gOworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7CisKKy8vIGNvcGllZCBmcm9tIEludGVncmF0aW9uVGVzdAorY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworY2xhc3MgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQsIDEwMjQwKSwKKyAgICBibG9ja2VkXyhmYWxzZSkgeworICB9CisKKyAgdWludDMyX3Qgd3JpdGVfYnVmZmVyX2xlbmd0aCgpIHsKKyAgICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgICByZXR1cm4gaGF2ZV9ieXRlcyA7CisgIH0KKworICB2b2lkIGJsb2NrKCkgeworICAgIGJsb2NrZWRfID0gdHJ1ZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAiYmxvY2sgZmx1c2hpbmdcbiIgOworI2VuZGlmCisgfQorICB2b2lkIHVuYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSBmYWxzZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAidW5ibG9jayBmbHVzaGluZywgYnVmZmVyIGlzXG48PCIgPDwgc3RkOjpzdHJpbmcoKGNoYXIgKil3QnVmXy5nZXQoKSwgd3JpdGVfYnVmZmVyX2xlbmd0aCgpKSA8PCAiPj5cbiIgOworI2VuZGlmCisgfQorCisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgaWYgKGJsb2NrZWRfKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgICBjZXJyIDw8ICJmbHVzaCB3YXMgYmxvY2tlZFxuIiA7CisjZW5kaWYKKyAgICAgIHJldHVybiA7CisgICAgfQorICAgIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSA7CisgIH0KKworICBib29sIGJsb2NrZWRfIDsKK30gOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggSlNPTl9CdWZmZXJlZEhUVFAgKQoreworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDApIDsKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPE9uZVdheVNlcnZpY2VDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHNzLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyKG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpIDsKKyAgc2VydmVyLnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOworI2VuZGlmCisgIFJQQzBUaHJlYWRDbGFzcyB0KHNlcnZlcikgOworICBib29zdDo6dGhyZWFkIHRocmVhZCgmUlBDMFRocmVhZENsYXNzOjpSdW4sICZ0KTsKKworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorICB9CisKKyAgaW50IHBvcnQgPSBzcy0+Z2V0UG9ydCgpIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAicG9ydCAiIDw8IHBvcnQgPDwgZW5kbCA7CisjZW5kaWYKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCkpOworICAgIHNvY2tldC0+c2V0UmVjdlRpbWVvdXQoMTAwMDApIDsgLy8gMTAwMG1zZWMgc2hvdWxkIGJlIGVub3VnaAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQ+IGJsb2NrYWJsZV90cmFuc3BvcnQobmV3IFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUSHR0cENsaWVudChibG9ja2FibGVfdHJhbnNwb3J0LCAibG9jYWxob3N0IiwgIi9zZXJ2aWNlIikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKworCisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgICAgY2xpZW50LnJvdW5kVHJpcFJQQygpOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmJsb2NrKCkgOworICAgIHVpbnQzMl90IHNpemUwID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBjbGllbnQuc2VuZF9vbmVXYXlSUEMoKSA7CisgICAgdWludDMyX3Qgc2l6ZTEgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMiA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgQk9PU1RfQ0hFQ0soKHNpemUxIC0gc2l6ZTApID09IChzaXplMiAtIHNpemUxKSkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPnVuYmxvY2soKSA7CisgICAgY2xpZW50LnNlbmRfcm91bmRUcmlwUlBDKCkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmZsdXNoKCkgOworICAgIHRyeSB7CisgICAgICBjbGllbnQucmVjdl9yb3VuZFRyaXBSUEMoKSA7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBCT09TVF9FUlJPUiggIndlIHNob3VsZCBub3QgZ2V0IGEgdHJhbnNwb3J0IGV4Y2VwdGlvbiAtLSB0aGlzIG1lYW5zIHdlIGZhaWxlZDogIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSApIDsKKyAgICB9CisgICAgdHJhbnNwb3J0LT5jbG9zZSgpOworICB9CisgIHNlcnZlci5zdG9wKCk7CisgIHRocmVhZC5qb2luKCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJmaW5pc2hlZC5cbiI7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIE9uZVdheVRlc3QKK25hbWVzcGFjZSBqYXZhIG9uZXdheXRlc3QKK25hbWVzcGFjZSBjcHAgb25ld2F5dGVzdAorbmFtZXNwYWNlIHJiIE9uZXdheXRlc3QKK25hbWVzcGFjZSBwZXJsIE9uZVdheVRlc3QKK25hbWVzcGFjZSBjc2hhcnAgT25ld2F5dGVzdAorbmFtZXNwYWNlIGpzIE9uZVdheVRlc3QKK25hbWVzcGFjZSBzdCBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgT25lV2F5VGVzdAorbmFtZXNwYWNlIGdvIG9uZXdheXRlc3QKK25hbWVzcGFjZSBwaHAgT25lV2F5VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBPbmV3YXl0ZXN0CituYW1lc3BhY2UgY29jb2EgT25lV2F5VGVzdAorbmFtZXNwYWNlIGx1YSBPbmVXYXlUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvT25lV2F5VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRBc3luYy5PbmVXYXlUZXN0CisKKy8vIGEgbWluaW1hbCBUaHJpZnQgc2VydmljZSwgZm9yIHVzZSBpbiBPbmVXYXlIVFRQVHRlc3QuY3BwCitzZXJ2aWNlIE9uZVdheVNlcnZpY2UgeworICB2b2lkIHJvdW5kVHJpcFJQQygpLAorICBvbmV3YXkgdm9pZCBvbmVXYXlSUEMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBiMzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gVG8gc2hvdyB0aGF0IHRoaXMgdGVzdCBhY3R1YWxseSB0ZXN0cyBzb21ldGhpbmcsIHlvdSBjYW4gY2hhbmdlCisvLyBNQU5VQUxfT1BFTlNTTF9JTklUIHRvIDAgdG8gY2F1c2UgYXV0b21hdGljIE9wZW5TU0wgaW5pdC9jbGVhbnVwLAorLy8gd2hpY2ggd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCisjZGVmaW5lIE1BTlVBTF9PUEVOU1NMX0lOSVQgMQorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPFdpblNvY2syLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKwordm9pZCBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKSB7CisgIC8vIEhlcmUgd2UgY3JlYXRlIGFuIGlzb2xhdGVkIFRTU0xTb2NrZXRGYWN0b3J5IHRvIGVuc3VyZSB0aGUKKyAgLy8gY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb2YgVFNTTFNvY2tldEZhY3RvcnkgZ2V0IHJ1bi4gIFRodXMKKyAgLy8gd2l0aG91dCBtYW51YWwgaW5pdGlhbGl6YXRpb24gbm9ybWFsbHkgT3BlblNTTCB3b3VsZCBiZQorICAvLyB1bmluaXRpYWxpemVkIGFmdGVyIHRoaXMgZnVuY3Rpb24uCisgIFRTU0xTb2NrZXRGYWN0b3J5IGZhY3Rvcnk7Cit9CisKK3ZvaWQgb3BlbnNzbF9pbml0KCkgeworI2lmIE1BTlVBTF9PUEVOU1NMX0lOSVQKKyAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKyNlbmRpZgorfQorCit2b2lkIG9wZW5zc2xfY2xlYW51cCgpIHsKKyNpZiBNQU5VQUxfT1BFTlNTTF9JTklUCisgIGNsZWFudXBPcGVuU1NMKCk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KCkgeworICAvLyBDaGVjayB3aGV0aGVyIFRocmlmdCBsZWF2ZXMgT3BlblNTTCBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZSBhZnRlcgorICAvLyB0aGUgbGFzdCBUU1NMU29ja2V0RmFjdG9yeSBpcyBkZXN0cm95ZWQgd2hlbiBtYW51YWwKKyAgLy8gaW5pdGlhbGl6YXRpb24gaXMgc2V0CisgIG9wZW5zc2xfaW5pdCgpOworICBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKTsKKworICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIG9uZSB0aGF0IHdpbGwgZmFpbCBpZiBPcGVuU1NMIGlzCisgIC8vIHVuaW5pdGlhbGl6ZWQuICBJdCBtaWdodCBhbHNvIGZhaWwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YKKyAgLy8gT3BlblNTTC4uLgorICBjb25zdCBFVlBfTUQqIG1kID0gRVZQX2dldF9kaWdlc3RieW5hbWUoIlNIQTI1NiIpOworICBCT09TVF9DSEVDSyhtZCAhPSBOVUxMKTsKKyAgb3BlbnNzbF9jbGVhbnVwKCk7Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiT3BlblNTTE1hbnVhbEluaXQiOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfb3BlbnNzbF9hdmFpbGFiaWxpdHkpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKyAKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiBOVUxMOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0MzU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisKKy8qCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3Q+Cit2b2lkIHRyeXdyaXRlKGNvbnN0IFN0cnVjdCYgcywgYm9vbCBzaG91bGRfd29yaykgeworICBib29sIHdvcmtlZDsKKyAgdHJ5IHsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgICAgcy53cml0ZSgmcHJvdG9jb2wpOworICAgIHdvcmtlZCA9IHRydWU7CisgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAmIGV4KSB7CisgICAgd29ya2VkID0gZmFsc2U7CisgIH0KKyAgQk9PU1RfQ0hFQ0sod29ya2VkID09IHNob3VsZF93b3JrKTsKK30KKyovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJ1Y3QxLCB0eXBlbmFtZSBTdHJ1Y3QyPgordm9pZCB3cml0ZV90b19yZWFkKGNvbnN0IFN0cnVjdDEmIHcsIFN0cnVjdDImIHIpIHsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICB3LndyaXRlKCZwcm90b2NvbCk7CisgIHIucmVhZCgmcHJvdG9jb2wpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzEpIHsKKyAgT2xkU2Nob29sIG87CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbGRTY2hvb2wge1xuIgorICAgICIgIDAxOiBpbV9pbnQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9zdHIgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgIDAzOiBpbV9iaWcgKGxpc3QpID0gbGlzdDxtYXA+WzBdIHtcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMSkgeworICBTaW1wbGUgczsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8yKSB7CisgIFNpbXBsZSBzOworICBzLmltX29wdGlvbmFsID0gMTA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMykgeworICBTaW1wbGUgczsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAxMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzQpIHsKKyAgU2ltcGxlIHM7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl81KSB7CisgIFNpbXBsZSBzOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBzLmltX29wdGlvbmFsID0gMTA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDEwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzMpIHsKKyAgLy8gYXNzaWduL2NvcHktY29uc3RydWN0IHdpdGggbm9uLXJlcXVpcmVkIGZpZWxkcworCisgIFNpbXBsZSBzMSwgczI7CisgIHMxLl9faXNzZXQuaW1fZGVmYXVsdCA9IHRydWU7CisgIHMxLl9fc2V0X2ltX29wdGlvbmFsKDEwKTsKKyAgQk9PU1RfQ0hFQ0soczEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczEuX19pc3NldC5pbV9vcHRpb25hbCk7CisKKyAgczIgPSBzMTsKKworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKworICBTaW1wbGUgczMoczEpOworCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzQpIHsKKyAgLy8gV3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcy4KKworICBTaW1wbGUgczEsIHMyLCBzMzsKKyAgczEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKKworICB3cml0ZV90b19yZWFkKHMxLCBzMik7CisKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIHMyLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soIXMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyhzMy5pbV9vcHRpb25hbCA9PSAwKTsKKworICBzMS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgd3JpdGVfdG9fcmVhZChzMSwgczMpOworCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCBzMy5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyhzMy5pbV9vcHRpb25hbCA9PSAxMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNSkgeworICAvLyBXcml0aW5nIGJldHdlZW4gb3B0aW9uYWwgYW5kIGRlZmF1bHQuCisKKyAgVHJpY2t5MSB0MTsKKyAgVHJpY2t5MiB0MjsKKworICB0Mi5pbV9vcHRpb25hbCA9IDEwOworICB3cml0ZV90b19yZWFkKHQyLCB0MSk7CisgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKKyAgQk9PU1RfQ0hFQ0soIXQxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyh0MS5pbV9kZWZhdWx0ID09IHQyLmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0sodDEuaW1fZGVmYXVsdCA9PSAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF82KSB7CisgIC8vIFdyaXRpbmcgYmV0d2VlbiBkZWZhdWx0IGFuZCByZXF1aXJlZC4KKworICBUcmlja3kxIHQxOworICBUcmlja3kzIHQzOworICB3cml0ZV90b19yZWFkKHQxLCB0Myk7CisgIHdyaXRlX3RvX3JlYWQodDMsIHQxKTsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5pbV9kZWZhdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF83KSB7CisgIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgcmVxdWlyZWQuCisKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzgpIHsKKyAgLy8gTXUtaHUtaGEtaGEtaGEhCisKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdHJ5IHsKKyAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7CisgICAgYWJvcnQoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFByb3RvY29sRXhjZXB0aW9uJikgeworICB9CisKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF85KSB7CisgIENvbXBsZXggYzsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIkNvbXBsZXgge1xuIgorICAgICIgIDAxOiBjcF9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogY3BfcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDA0OiB0aGVfbWFwIChtYXApID0gbWFwPGkxNixzdHJ1Y3Q+WzBdIHtcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDA1OiByZXFfc2ltcCAoc3RydWN0KSA9IFNpbXBsZSB7XG4iCisgICAgIiAgICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhjKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTApIHsKKyAgVHJpY2t5MSB0MTsKKyAgVHJpY2t5MiB0MjsKKyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgLy8odm9pZCkodDEgPT0gdDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzExKSB7CisgIE9sZFNjaG9vbCBvMSwgbzIsIG8zOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX2ludCA9IG8yLmltX2ludCA9IDEwOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLl9faXNzZXQuaW1faW50ID0gdHJ1ZTsKKyAgbzIuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9pbnQgPSAyMDsKKyAgbzEuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9pbnQgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9zdHIgPSBvMi5pbV9zdHIgPSAiZm9vIjsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5fX2lzc2V0LmltX3N0ciA9IG8yLl9faXNzZXQuaW1fc3RyID0gdHJ1ZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gbXltYXA7CisgIG15bWFwWzFdID0gImJhciI7CisgIG15bWFwWzJdID0gImJheiI7CisgIG8xLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICBvMS53cml0ZSgmcHJvdG9jb2wpOworCisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBteW1hcFszXSA9ICJxdXgiOworICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9iaWcuYmFjaygpWzNdID0gInF1eCI7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgCisgIG8zLnJlYWQoJnByb3RvY29sKTsKKyAgbzMuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8zKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk9sZFNjaG9vbCB7XG4iCisgICAgIiAgMDE6IGltX2ludCAoaTE2KSA9IDEwLFxuIgorICAgICIgIDAyOiBpbV9zdHIgKHN0cmluZykgPSBcImZvb1wiLFxuIgorICAgICIgIDAzOiBpbV9iaWcgKGxpc3QpID0gbGlzdDxtYXA+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IG1hcDxpMzIsc3RyaW5nPlswXSB7XG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzFdID0gbWFwPGkzMixzdHJpbmc+WzJdIHtcbiIKKyAgICAiICAgICAgMSAtPiBcImJhclwiLFxuIgorICAgICIgICAgICAyIC0+IFwiYmF6XCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzJdID0gbWFwPGkzMixzdHJpbmc+WzNdIHtcbiIKKyAgICAiICAgICAgMSAtPiBcImJhclwiLFxuIgorICAgICIgICAgICAyIC0+IFwiYmF6XCIsXG4iCisgICAgIiAgICAgIDMgLT4gXCJxdXhcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG8zKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTIpIHsKKyAgVHJpY2t5MiB0MSwgdDI7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0MS5pbV9vcHRpb25hbCA9IDU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDIuaW1fb3B0aW9uYWwgPSA1OworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBCT09TVF9DSEVDSyh0MSAhPSB0Mik7CisgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLmltX29wdGlvbmFsID0gMTA7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IGZhbHNlOworICBCT09TVF9DSEVDSyh0MSAhPSB0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTMpIHsKKyAgT3B0aW9uYWxEZWZhdWx0IHQxLCB0MjsKKworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0Lm9wdF9pbnQgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X3N0ciA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X2ludCA9PSB0Mi5vcHRfaW50KTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X3N0ciA9PSB0Mi5vcHRfc3RyKTsKKworICB3cml0ZV90b19yZWFkKHQxLCB0Mik7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT3B0aW9uYWxEZWZhdWx0IHtcbiIKKyAgICAiICAwMTogb3B0X2ludCAoaTE2KSA9IDEyMzQsXG4iCisgICAgIiAgMDI6IG9wdF9zdHIgKHN0cmluZykgPSBcImRlZmF1bHRcIixcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHQyKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMjM0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcApAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZWN1cnNpdmVUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzEpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CisKKyAgUmVjVHJlZSB0cmVlOworICBSZWNUcmVlIGNoaWxkOworICB0cmVlLmNoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7CisKKyAgdHJlZS53cml0ZShwcm90LmdldCgpKTsKKworICBSZWNUcmVlIHJlc3VsdDsKKyAgcmVzdWx0LnJlYWQocHJvdC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLKHRyZWUgPT0gcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMikgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBSZWNMaXN0IGw7CisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gbDIobmV3IFJlY0xpc3QpOworICBsLm5leHRpdGVtID0gbDI7CisKKyAgbC53cml0ZShwcm90LmdldCgpKTsKKworICBSZWNMaXN0IHJlc3VsdGxpc3Q7CisgIHJlc3VsdGxpc3QucmVhZChwcm90LmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbSAhPSBOVUxMKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbS0+bmV4dGl0ZW0gPT0gTlVMTCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzMpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CisKKyAgQ29SZWMgYzsKKyAgc2hhcmVkX3B0cjxDb1JlYzI+IHIobmV3IENvUmVjMik7CisgIGMub3RoZXIgPSByOworCisgIGMud3JpdGUocHJvdC5nZXQoKSk7CisKKyAgYy5yZWFkKHByb3QuZ2V0KCkpOworICBCT09TVF9DSEVDSyhjLm90aGVyICE9IE5VTEwpOworICBCT09TVF9DSEVDSyhjLm90aGVyLT5vdGhlci5vdGhlciA9PSBOVUxMKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfNCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOworICBkZXB0aExpbWl0LT5uZXh0aXRlbSA9IGRlcHRoTGltaXQ7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGRlcHRoTGltaXQtPndyaXRlKHByb3QuZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKKworICBkZXB0aExpbWl0LT5uZXh0aXRlbS5yZXNldCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EwNDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgRVBTSUxPTiAwLjAwMDAwMDEKKyNpbmNsdWRlIDx0eXBlaW5kZXg+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5oIgordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cykgeworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkKKyAgICAgICAgICAgIC5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiBFWFBFQ1RFRF9ET1VCTEVfTElTVHsxLjAsLTEwMC4wLDEwMC4wLDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwtOTIyMzM3MjAzNjg1NDc3NTgwNy4wLAorICAgICAgICAzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzfTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1Quc2l6ZSgpLCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgRVhQRUNURURfRE9VQkxFX0xJU1Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUW2ldLCBFWFBFQ1RFRF9ET1VCTEVfTElTVFtpXSwgRVBTSUxPTik7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTRmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU2VjdXJpdHlUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKKwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIGtleURpciAvIGZpbGVuYW1lOworfQorYm9vc3Q6Om11dGV4IGdNdXRleDsKKworc3RydWN0IEdsb2JhbEZpeHR1cmUKK3sKKyAgICBHbG9iYWxGaXh0dXJlKCkKKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICB7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiYXJndlslMSVdID0gXCIlMiVcIiIpICUgaSAlIG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndltpXSk7CisgICAgfQorCisgICAgI2lmZGVmIF9fbGludXhfXworICAgIC8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCisgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgICNlbmRpZgorCisgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpIC8gInRlc3QiIC8gImtleXMiOworICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICB7CisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOworICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgeworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZSgpCisgICAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmNsZWFudXBPcGVuU1NMKCk7CisjaWZkZWYgX19saW51eF9fCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpCisjZW5kaWYKKworc3RydWN0IFNlY3VyaXR5Rml4dHVyZQoreworICAgIHZvaWQgc2VydmVyKGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNlcnZlclNvY2tldD4gcFNlcnZlclNvY2tldDsKKworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihwcm90b2NvbCkpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNvbm5lY3RlZENsaWVudDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlcnZlclNvY2tldC0+bGlzdGVuKCk7CisgICAgICAgICAgICAgICAgbVBvcnQgPSBwU2VydmVyU29ja2V0LT5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgbUNWYXIubm90aWZ5X29uZSgpOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQgPSBwU2VydmVyU29ja2V0LT5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlsyXTsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnTyc7CisgICAgICAgICAgICAgICAgYnVmWzFdID0gJ0snOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC0+d3JpdGUoJmJ1ZlswXSwgMik7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT5mbHVzaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKGdNdXRleCk7CisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlNSViAlMSUgRXhjZXB0aW9uOiAlMiUiKSAlIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgJSBleC53aGF0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubmVjdGVkQ2xpZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNlcnZlclNvY2tldC0+Y2xvc2UoKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsaWVudChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gcENsaWVudFNvY2tldDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihwcm90b2NvbCkpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoImNsaWVudC5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBtUG9ydCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC0+b3BlbigpOworCisgICAgICAgICAgICAgICAgdWludDhfdCBidWZbM107CisgICAgICAgICAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgICAgICAgICBidWZbMV0gPSAwOworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBDbGllbnRTb2NrZXQtPnJlYWQoJmJ1ZlswXSwgMikpOworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIG1lbWNtcCgmYnVmWzBdLCAiT0siLCAyKSk7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKGdNdXRleCk7CisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIkNMSSAlMSUgRXhjZXB0aW9uOiAlMiUiKSAlIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgJSBleC53aGF0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocENsaWVudFNvY2tldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcHJvdG9jb2wyc3RyKHNpemVfdCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdID0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICJTU0xUTFMiLAorICAgICAgICAgICAgICAgICJTU0x2MiIsCisgICAgICAgICAgICAgICAgIlNTTHYzIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMCIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzEiLAorICAgICAgICAgICAgICAgICJUTFN2MV8yIgorICAgICAgICB9OworICAgICAgICByZXR1cm4gc3RyaW5nc1twcm90b2NvbF07CisgICAgfQorCisgICAgYm9vc3Q6Om11dGV4IG1NdXRleDsKKyAgICBib29zdDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DVmFyOworICAgIGludCBtUG9ydDsKKyAgICBib29sIG1Db25uZWN0ZWQ7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoQk9PU1RfVEVTVF9NT0RVTEUsIFNlY3VyaXR5Rml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc3NsX3NlY3VyaXR5X21hdHJpeCkKK3sKKyAgICB0cnkKKyAgICB7CisgICAgICAgIC8vIG1hdHJpeCBvZiBjb25uZWN0aW9uIHN1Y2Nlc3MgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciB3aXRoIGRpZmZlcmVudCBTU0xQcm90b2NvbCBzZWxlY3Rpb25zCisgICAgICAgIGJvb2wgbWF0cml4W2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdW2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdID0KKyAgICAgICAgeworICAgIC8vICAgc2VydmVyICAgID0gU1NMVExTICAgU1NMdjIgICAgU1NMdjMgICAgVExTdjFfMCAgVExTdjFfMSAgVExTdjFfMgorICAgIC8vIGNsaWVudAorICAgIC8qIFNTTFRMUyAgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgdHJ1ZSwgICAgdHJ1ZSAgICB9LAorICAgIC8qIFNTTHYyICAgKi8gIHsgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFNTTHYzICAgKi8gIHsgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzAgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzEgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzIgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3Qgc2kgPSAwOyBzaSA8PSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1Q7ICsrc2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGNpID0gMDsgY2kgPD0gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUOyArK2NpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzaSA9PSAxIHx8IGNpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCBTU0x2MiBjYXNlcyAtIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgT1BFTlNTTF9OT19TU0wzCisgICAgICAgICAgICAgICAgaWYgKHNpID09IDIgfHwgY2kgPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIFNTTHYzIGNhc2VzIC0gcHJvdG9jb2wgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlRFU1Q6IFNlcnZlciA9ICUxJSwgQ2xpZW50ID0gJTIlIikKKyAgICAgICAgICAgICAgICAgICAgJSBwcm90b2NvbDJzdHIoc2kpICUgcHJvdG9jb2wyc3RyKGNpKSk7CisKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gdGhyZWFkX2dyb3VwIG1hbmFnZXMgdGhlIHRocmVhZCBsaWZldGltZSAtIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGNyZWF0ZV90aHJlYWQKKyAgICAgICAgICAgICAgICBib29zdDo6dGhyZWFkX2dyb3VwIHRocmVhZHM7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6c2VydmVyLCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oc2kpKSk7CisgICAgICAgICAgICAgICAgbUNWYXIud2FpdChsb2NrKTsgICAgICAgICAgIC8vIHdhaXQgZm9yIGxpc3RlbigpIHRvIHN1Y2NlZWQKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICh2b2lkKXRocmVhZHMuY3JlYXRlX3RocmVhZChiaW5kKCZTZWN1cml0eUZpeHR1cmU6OmNsaWVudCwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KGNpKSkpOworICAgICAgICAgICAgICAgIHRocmVhZHMuam9pbl9hbGwoKTsKKworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX01FU1NBR0UobUNvbm5lY3RlZCA9PSBtYXRyaXhbY2ldW3NpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojpmb3JtYXQoIiAgICAgIFNlcnZlciA9ICUxJSwgQ2xpZW50ID0gJTIlIGV4cGVjdGVkIG1Db25uZWN0ZWQgPT0gJTMlIGJ1dCB3YXMgJTQlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpICUgbWF0cml4W2NpXVtzaV0gJSBtQ29ubmVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgIHsKKyAgICAgICAgQk9PU1RfRkFJTChib29zdDo6Zm9ybWF0KCIlMSU6ICUyJSIpICUgdHlwZWlkKGV4KS5uYW1lKCkgJSBleC53aGF0KCkpOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODgzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcApAQCAtMCwwICsxLDEwMyBAQAorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU3BlY2lhbGl6YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gTXlQcm90b2NvbDsKKy8vIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0PiBNeVByb3RvY29sOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NwZWNpYWxpemF0aW9uXzEpIHsKKyAgT25lT2ZFYWNoIG9vZTsKKyAgb29lLmltX3RydWUgPSB0cnVlOworICBvb2UuaW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLmFfYml0ZSA9IDB4N2Y7CisgIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CisgIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOworICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS5zb21lX2NoYXJhY3RlcnMgPSAiSlNPTiBUSElTISBcIlwxIjsKKyAgb29lLnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKKworICBOZXN0aW5nIG47CisgIG4ubXlfb29lID0gb29lOworICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKKyAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OworICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjBceGQwXHg5ZFx4Y2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4ubXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworCisgIEhvbHlNb2xleSBobTsKKworICBobS5iaWcucHVzaF9iYWNrKG9vZSk7CisgIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOworICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7CisgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOworICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBzdGFnZTEuY2xlYXIoKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7CisgIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOworICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKKyAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgc3RhZ2UxLmNsZWFyKCk7CisgIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisKKyAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOworICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7CisgIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLmNsZWFyKCk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKKyAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKG5ldyBNeVByb3RvY29sKGJ1ZmZlcikpOworCisgIG9vZS53cml0ZShwcm90by5nZXQoKSk7CisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKG9vZSA9PSBvb2UyKTsKKworICBobS53cml0ZShwcm90by5nZXQoKSk7CisgIEhvbHlNb2xleSBobTI7CisgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKKworICBCT09TVF9DSEVDSyhobSA9PSBobTIpOworCisgIGhtMi5iaWdbMF0uYV9iaXRlID0gMHgwMDsKKworICBCT09TVF9DSEVDSyhobSAhPSBobTIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAzMDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKQEAgLTAsMCArMSw2NDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3Q6OlRTaG9ydFJlYWRUcmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworLy8gU2hhbWVsZXNzbHkgY29waWVkIGZyb20gWmxpYlRyYW5zcG9ydC4gIFRPRE86IHJlZmFjdG9yLgordW5zaWduZWQgaW50IGRpc3RbXVs1MDAwXSA9IHsKKyB7IDE8PDE1IH0sCisKKyB7CisgIDUsMTMsOSwxLDgsOSwxMSwxMywxOCw0OCwyNCwxMywyMSwxMyw1LDExLDM1LDIsNCwyMCwxNyw3MiwyNywxNCwxNSw0LDcsMjYsCisgIDEyLDEsMTQsOSwyLDE2LDI5LDQxLDcsMjQsNCwyNywxNCw0LDEsNCwyNSwzLDYsMzQsMTAsOCw1MCwyLDE0LDEzLDU1LDI5LDMsCisgIDQzLDUzLDQ5LDE0LDQsMTAsMzIsMjcsNDgsMSwzLDEsMTEsNSwxNywxNiw1MSwxNywzMCwxNSwxMSw5LDIsMiwxMSw1MiwxMiwyLAorICAxMyw5NCwxLDE5LDEsMzgsMiw4LDQzLDgsMzMsNywzMCw4LDE3LDIyLDIsMTUsMTQsMTIsMzQsMiwxMiw2LDM3LDI5LDc0LDMsCisgIDE2NSwxNiwxMSwxNyw1LDE0LDMsMTAsNywzNywxMSwyNCw3LDEsMywxMiwzNyw4LDksMzQsMTcsMTIsOCwyMSwxMywzNywxLDQsCisgIDMwLDE0LDc4LDQsMTUsMiw0MCwzNywxNywxMiwzNiw4MiwxNCw0LDEsNCw3LDE3LDExLDE2LDg4LDc3LDIsMywxNSwzLDM0LDExLAorICA1LDc5LDIyLDM0LDgsNCw0LDQwLDIyLDI0LDI4LDksMTMsMywzNCwyNyw5LDE2LDM5LDE2LDM5LDEzLDIsNCwzLDQxLDI2LDEwLDQsCisgIDMzLDQsNywxMiw1LDYsMywxMCwzMCw4LDIxLDE2LDU4LDE5LDksMCw0Nyw3LDEzLDExLDE5LDE1LDcsNTMsNTcsMiwxMywyOCwyMiwKKyAgMywxNiw5LDI1LDMzLDEyLDQwLDcsMTIsNjQsNywxNCwyNCw0NCw5LDIsMTQsMTEsMiw1OCwxLDI2LDMwLDExLDksNSwyNCw3LDksCisgIDk0LDIsMTAsMjEsNSw1LDQsNSw2LDE3OSw5LDE4LDIsNywxMywzMSw0MSwxNyw0LDM2LDMsMjEsNiwyNiw4LDE1LDE4LDQ0LDI3LAorICAxMSw5LDI1LDcsMCwxNCwyLDEyLDIwLDIzLDEzLDIsMTYzLDksNSwxNSw2NSwyLDE0LDYsOCw5OCwxMSwxNSwxNCwzNCwyLDMsMTAsCisgIDIyLDksOTIsNywxMCwzMiw2NywxMywzLDQsMzUsOCwyLDEsNSwwLDI2LDM4MSw3LDI3LDgsMiwxNiw5Myw0LDE5LDUsOCwyNSw5LAorICAzMSwxNCw0LDIxLDUsMyw5LDIyLDU2LDQsMTgsMywxMSwxOCw2LDQsMyw0MCwxMiwxNiwxMTAsOCwzNSwxNCwxLDE4LDQwLDksMTIsCisgIDE0LDMsMTEsNyw1NywxMywxOCwxMTYsNTMsMTksMjIsNywxNiwxMSw1LDgsMjEsMTYsMSw3NSwyMSwyMCwxLDI4LDIsNiwxLDcsCisgIDE5LDM4LDUsNiw5LDksNCwxLDcsNTUsMzYsNjIsNSw0LDQsMjQsMTUsMSwxMiwzNSw0OCwyMCw1LDE3LDEsNSwyNiwxNSw0LDU0LAorICAxMyw1LDUsMTUsNSwxOSwzMiwyOSwzMSw3LDYsNDAsNyw4MCwxMSwxOCw4LDEyOCw0OCw2LDEyLDg0LDEzLDQsNywyLDEzLDksMTYsCisgIDE3LDMsMjU0LDEsNCwxODEsOCw0NCw3LDYsMjQsMjcsOSwyMywxNCwzNCwxNiwyMiwyNSwxMCwzLDMsNCw0LDEyLDIsMTIsNiw3LAorICAxMyw1OCwxMyw2LDExLDE5LDUzLDExLDY2LDE4LDE5LDEwLDQsMTMsMiw1LDQ5LDU4LDEsNjcsNywyMSw2NCwxNCwxMSwxNCw4LDMsCisgIDI2LDMzLDkxLDMxLDIwLDcsOSw0MiwzOSw0LDMsNTUsMTEsMTAsMCw3LDQsNzUsOCwxMiwwLDI3LDMsOCw5LDAsMTIsMTIsMjMsCisgIDI4LDIzLDIwLDQsMTMsMzAsMiwyMiwyMCwxOSwzMCw2LDIyLDIsNiw0LDI0LDcsMTksNTUsODYsNSwzMywyLDE2MSw2LDcsMSw2MiwKKyAgMTMsMyw3MiwxMiwxMiw5LDcsMTIsMTAsNSwxMCwyOSwxLDUsMjIsMTMsMTMsNSwyLDEyLDMsNywxNCwxOCwyLDMsNDYsMjEsMTcsCisgIDE1LDE5LDMsMjcsNSwxNiw0NSwzMSwxMCw4LDE3LDE4LDE4LDMsNywyNCw2LDU1LDksMyw2LDEyLDEwLDEyLDgsOTEsOSw0LDQsNCwKKyAgMjcsMjksMTYsNSw3LDIyLDQzLDI4LDExLDE0LDgsMTEsMjgsMTA5LDU1LDcxLDQwLDMsOCwyMiwyNiwxNSw0NCwzLDI1LDI5LDUsCisgIDMsMzIsMTcsMTIsMywyOSwyNywyNSwxNSwxMSw4LDQwLDM5LDM4LDE3LDMsOSwxMSwyLDMyLDExLDYsMjAsNDgsNzUsMjcsMyw3LAorICA1NCwxMiw5NSwxMiw3LDI0LDIzLDIsMTMsOCwxNSwxNiw1LDEyLDQsMTcsNywxOSw4OCwyLDYsMTMsMTE1LDQ1LDEyLDIxLDIsODYsCisgIDc0LDksNyw1LDE2LDMyLDE2LDIsMjEsMTgsNiwzNCw1LDE4LDI2MCw3LDEyLDE2LDQ0LDE5LDkyLDMxLDcsOCwyLDksMCwwLDE1LAorICA4LDM4LDQsOCwyMCwxOCwyLDgzLDMsMyw0LDksNSwzLDEwLDMsNSwyOSwxNSw3LDExLDgsNDgsMTcsMjMsMiwxNyw0LDExLDIyLAorICAyMSw2NCw4LDgsNCwxOSw5NSwwLDE3LDI4LDksMTEsMjAsNzEsNSwxMSwxOCwxMiwxMyw0NSw0OSw0LDEsMzMsMzIsMjMsMTMsNSwKKyAgNTIsMiwyLDE2LDMsNCw3LDEyLDIsMSwxMiw2LDI0LDEsMjIsMTU1LDIxLDMsNDUsNCwxMiw0NCwyNiw1LDQwLDM2LDksOSw4LDIwLAorICAzNSwzMSwzLDIsMzIsNTAsMTAsOCwzNywyLDc1LDM1LDIyLDE1LDE5Miw4LDExLDIzLDEsNCwyOSw2LDgsOCw1LDEyLDE4LDMyLDQsCisgIDcsMTIsMiwwLDAsOSw1LDQ4LDExLDM1LDMsMSwxMjMsNiwyOSw4LDExLDgsMjMsNTEsMTYsNiw2MywxMiwyLDUsNCwxNCwyLDE1LAorICA3LDE0LDMsMiw3LDE3LDMyLDgsOCwxMCwxLDIzLDYyLDIsNDksNiw0OSw0NywyMywzLDIwLDcsMTEsMzksMTAsMjQsNiwxNSw1LDUsCisgIDExLDgsMTYsMzYsOCwxMywyMCwzLDEwLDQ0LDcsNTIsNywxMCwzNiw2LDE1LDEwLDUsMTEsNCwxNCwxOSwxNywxMCwxMiwzLDYsCisgIDIzLDQsMTMsOTQsNzAsNywzNiw3LDM4LDcsMjgsOCw0LDE1LDMsMTksNCwzMywzOSwyMSwxMDksNCw4MCw2LDQwLDQsNDMyLDQsNCwKKyAgNyw4LDMsMzEsOCwyOCwzNywzNCwxMCwyLDIxLDUsMjIsMCw3LDM2LDE0LDEyLDYsMjQsMSwyMSw1LDksMiwyOSwyMCw1NCwxMTMsCisgIDEzLDMxLDM5LDI3LDYsMCwyNyw0LDUsMiw0Myw3LDgsNTcsOCw2Miw3LDksMTIsMjIsOTAsMzAsNiwxOSw3LDEwLDIwLDYsNSw1OCwKKyAgMzIsMzAsNDEsNCwxMCwyNSwxMywzLDgsNywxMCwyLDksNiwxNTEsNDQsMTYsMTIsMTYsMjAsOCwzLDE4LDExLDE3LDQsMTAsNDUsCisgIDE1LDgsNTYsMzgsNTIsMjUsNDAsMTQsNCwxNywxNSw4LDIsMTksNyw4LDI2LDMwLDIsMywxODAsOCwyNiwxNywzOCwzNSw1LDE2LAorICAyOCw1LDE1LDU2LDEzLDE0LDE4LDksMTUsODMsMjcsMyw5LDQsMTEsOCwyNywyNyw0NCwxMCwxMiw4LDMsNDgsMTQsNyw5LDQsNCwKKyAgOCw0LDUsOSwxMjIsOCwxNCwxMiwxOSwxNywyMSw0LDI5LDYzLDIxLDE3LDEwLDEyLDE4LDQ3LDEwLDEwLDUzLDQsMTgsMTYsNCw4LAorICAxMTgsOSw1LDEyLDksMTEsOSwzLDEyLDMyLDMsMjMsMiwxNSwzLDMsMzAsMywxNywyMzUsMTUsMjIsOSwyOTksMTQsMTcsMSw1LAorICAxNiw4LDMsNywzLDEzLDIsNyw2LDQsOCw2NiwyLDEzLDYsMTUsMTYsNDcsMywzNiw1LDcsMTAsMjQsMSw5LDksOCwxMywxNiwyNiwKKyAgMTIsNywyNCwyMSwxOCw0OSwyMywzOSwxMCw0MSw0LDEzLDQsMjcsMTEsMTIsMTIsMTksNCwxNDcsOCwxMCw5LDQwLDIxLDIsODMsCisgIDEwLDUsNiwxMSwyNSw5LDUwLDU3LDQwLDEyLDEyLDIxLDEsMywyNCwyMyw5LDMsOSwxMywyLDMsMTIsNTcsOCwxMSwxMywxNSwyNiwKKyAgMTUsMTAsNDcsMzYsNCwyNSwxLDUsOCw1LDQsMCwxMiw0OSw1LDE5LDQsNiwxNiwxNCw2LDEwLDY5LDEwLDMzLDI5LDcsOCw2MSwKKyAgMTIsNCwwLDMsNyw2LDMsMTYsMjksMjcsMzgsNCwyMSwwLDI0LDMsMiwxLDE5LDE2LDIyLDIsOCwxMzgsMTEsNyw3LDMsMTIsMjIsCisgIDMsMTYsNSw3LDMsNTMsOSwxMCwzMiwxNCw1LDcsMyw2LDIyLDksNTksMjYsOCw3LDU4LDUsMTYsMTEsNTUsNyw0LDExLDE0Niw5MSwKKyAgOCwxMywxOCwxNCw2LDgsOCwzMSwyNiwyMiw2LDExLDMwLDExLDMwLDE1LDE4LDMxLDMsNDgsMTcsNyw2LDQsOSwyLDI1LDMsMzUsCisgIDEzLDEzLDcsOCw0LDMxLDEwLDgsMTAsNCwzLDQ1LDEwLDIzLDIsNywyNTksMTcsMjEsMTMsMTQsMywyNiwzLDgsMjcsNCwxOCw5LAorICA2Niw3LDEyLDUsOCwxNyw0LDIzLDU1LDQxLDUxLDIsMzIsMjYsNjYsNCwyMSwxNCwxMiw2NSwxNiwyMiwxNyw1LDE0LDIsMjksMjQsCisgIDcsMywzNiwyLDQzLDUzLDg2LDUsMjgsNCw1OCwxMyw0OSwxMjEsNiwyLDczLDIsMSw0Nyw0LDIsMjcsMTAsMzUsMjgsMjcsMTAsCisgIDE3LDEwLDU2LDcsMTAsMTQsMjgsMjAsMjQsNDAsNyw0LDcsMywxMCwxMSwzMiw2LDYsMywxNSwxMSw1NCw1NzMsMiwzLDYsMiwzLAorICAxNCw2NCw0LDE2LDEyLDE2LDQyLDEwLDI2LDQsNiwxMSw2OSwxOCwyNywyLDIsMTcsMjIsOSwxMywyMiwxMSw2LDEsMTUsNDksMywKKyAgMTQsMQorIH0sCisKKyB7CisgIDExLDExLDExLDE1LDQ3LDEsMywxLDIzLDUsOCwxOCwzLDIzLDE1LDIxLDEsNywxOSwxMCwyNiwxLDE3LDExLDMxLDIxLDQxLDE4LAorICAzNCw0LDksNTgsMTksMywzLDM2LDUsMTgsMTMsMywxNCw0LDksMTAsNCwxOSw1NiwxNSwzLDUsMywxMSwyNyw5LDQsMTAsMTMsNCwKKyAgMTEsNiw5LDIsMTgsMywxMCwxOSwxMSw0LDUzLDQsMiwyLDMsNCw1OCwxNiwzLDAsNSwzMCwyLDExLDkzLDEwLDIsMTQsMTAsNiwyLAorICAxMTUsMiwyNSwxNiwyMiwzOCwxMDEsNCwxOCwxMywyLDE0NSw1MSw0NSwxNSwxNCwxNSwxMywyMCw3LDI0LDUsMTMsMTQsMzAsNDAsCisgIDEwLDQsMTA3LDEyLDI0LDE0LDM5LDEyLDYsMTMsMjAsNyw3LDExLDUsMTgsMTgsNDUsMjIsNiwzOSwzLDIsMSw1MSw5LDExLDQsCisgIDEzLDksMzgsNDQsOCwxMSw5LDE1LDE5LDksMjMsMTcsMTcsMTcsMTMsOSw5LDEsMTAsNCwxOCw2LDIsOSw1LDI3LDMyLDcyLDgsCisgIDM3LDksNCwxMCwzMCwxNywyMCwxNSwxNyw2NiwxMCw0LDczLDM1LDM3LDYsNCwxNiwxMTcsNDUsMTMsNCw3NSw1LDI0LDY1LDEwLAorICA0LDksNCwxMyw0Niw1LDI2LDI5LDEwLDQsNCw1MiwzLDEzLDE4LDYzLDYsMTQsOSwyNCwyNzcsOSw4OCwyLDQ4LDI3LDEyMywxNCwKKyAgNjEsNyw1LDEwLDgsNyw5MCwzLDEwLDMsMyw0OCwxNywxMywxMCwxOCwzMywyLDE5LDM2LDYsMjEsMSwxNiwxMiw1LDYsMiwxNiwKKyAgMTUsMjksODgsMjgsMiwxNSw2LDExLDQsNiwxMSwzLDMsNCwxOCw5LDUzLDUsNCwzLDMzLDgsOSw4LDYsNywzNiw5LDYyLDE0LDIsCisgIDEsMTAsMSwxNiw3LDMyLDcsMjMsMjAsMTEsMTAsMjMsMiwxLDAsOSwxNiw0MCwyLDgxLDUsMjIsOCw1LDQsMzcsNTEsMzcsMTAsCisgIDE5LDU3LDExLDIsOTIsMzEsNiwzOSwxMCwxMywxNiw4LDIwLDYsOSwzLDEwLDE4LDI1LDIzLDEyLDMwLDYsMiwyNiw3LDY0LDE4LAorICA2LDMwLDEyLDEzLDI3LDcsMTAsNSwzLDMzLDI0LDk5LDQsMjMsNCwxLDI3LDcsMjcsNDksOCwyMCwxNiwzLDQsMTMsOSwyMiw2NywKKyAgMjgsMywxMCwxNiwzLDIsMTAsNCw4LDEsOCwxOSwzLDg1LDYsMjEsMSw5LDE2LDIsMzAsMTAsMzMsMTIsNCw5LDMsMSw2MCwzOCw2LAorICAyNCwzMiwzLDE0LDMsNDAsOCwzNCwxMTUsNSw5LDI3LDUsOTYsMyw0MCw2LDE1LDUsOCwyMiwxMTIsNSw1LDI1LDE3LDU4LDIsNywKKyAgMzYsMjEsNTIsMSwzLDk1LDEyLDIxLDQsMTEsOCw1OSwyNCw1LDIxLDQsOSwxNSw4LDcsMjEsMywyNiw1LDExLDYsNywxNyw2NSwKKyAgMTQsMTEsMTAsMiwxNyw1LDEyLDIyLDQsNCwyLDIxLDgsMTEyLDMsMzQsNjMsMzUsMiwyNSwxLDIsMTUsNjUsMjMsMCwzLDUsMTUsCisgIDI2LDI3LDksNSw0OCwxMSwxNSw0LDksNSwzMywyMCwxNSwxLDE4LDE5LDExLDI0LDQwLDEwLDIxLDc0LDYsNiwzMiwzMCw0MCw1LAorICA0LDcsNDQsMTAsMjUsNDYsMTYsMTIsNSw0MCw3LDE4LDUsMTgsOSwxMiw4LDQsMjUsNSw2LDM2LDQsNDMsOCw5LDEyLDM1LDE3LDQsCisgIDgsOSwxMSwyNyw1LDEwLDE3LDQwLDgsMTIsNCwxOCw5LDE4LDEyLDIwLDI1LDM5LDQyLDEsMjQsMTMsMjIsMTUsNywxMTIsMzUsMywKKyAgNywxNywzMywyLDUsNSwxOSw4LDQsMTIsMjQsMTQsMTMsMiwxLDEzLDYsNSwxOSwxMSw3LDU3LDAsMTksNiwxMTcsNDgsMTQsOCwKKyAgMTAsNTEsMTcsMTIsMTQsMiw1LDgsOSwxNSw0LDQ4LDUzLDEzLDIyLDQsMjUsMTIsMTEsMTksNDUsNSwyLDYsNTQsMjIsOSwxNSw5LAorICAxMywyLDcsMTEsMjksODIsMTYsNDYsNCwyNiwxNCwyNiw0MCwyMiw0LDI2LDYsMTgsMTMsNCw0LDIwLDMsMyw3LDEyLDE3LDgsOSwKKyAgMjMsNiwyMCw3LDI1LDIzLDE5LDUsMTUsNiwyMywxNSwxMSwxOSwxMSwzLDE3LDU5LDgsMTgsNDEsNCw1NCwyMyw0NCw3NSwxMywKKyAgMjAsNiwxMSwyLDMsMSwxMywxMCwzLDcsMTIsMyw0LDcsOCwzMCw2LDYsNywzLDMyLDksNSwyOCw2LDExNCw0MiwxMywzNiwyNywKKyAgNTksNiw5MywxMyw3NCw4LDY5LDE0MCwzLDEsMTcsNDgsMTA1LDYsMTEsNSwxNSwxLDEwLDEwLDE0LDgsNTMsMCw4LDI0LDYwLDIsCisgIDYsMzUsMiwxMiwzMiw0NywxNiwxNyw3NSwyLDUsNCwzNywyOCwxMCw1LDksNTcsNCw1OSw1LDEyLDEzLDcsOTAsNSwxMSw1LDI0LAorICAyMiwxMywzMCwxLDIsMTAsOSw2LDE5LDMsMTgsNDcsMiw1LDcsOSwzNSwxNSwzLDYsMSwyMSwxNCwxNCwxOCwxNCw5LDEyLDgsNzMsCisgIDYsMTksMywzMiw5LDE0LDE3LDE3LDUsNTUsMjMsNiwxNiwyOCwzLDExLDQ4LDQsNiw2LDYsMTIsMTYsMzAsMTAsMzAsMjcsNTEsCisgIDE4LDI5LDIsMywxNSwxLDc2LDAsMTYsMzMsNCwyNywzLDYyLDQsMTAsMiw0LDgsMTUsOSw0MSwyNiwyMiwyLDQsMjAsNCw0OSwwLAorICA4LDEsNTcsMTMsMTIsMzksMyw2MywxMCwxOSwzNCwzNSwyLDcsOCwyOSw3Miw0LDEwLDAsNzcsOCw2LDcsOSwxNSwyMSw5LDQsMSwKKyAgMjAsMjMsMSw5LDE4LDksMTUsMzYsNCw3LDYsMTUsNSw3LDcsNDAsMiw5LDIyLDIsMywyMCw0LDEyLDM0LDEzLDYsMTgsMTUsMSwKKyAgMzgsMjAsMTIsNywxNiwzLDE5LDg1LDEyLDE2LDE4LDE2LDIsMTcsMSwxMyw4LDYsMTIsMTUsOTcsMTcsMTIsOSwzLDIxLDE1LDEyLAorICAyMyw0NCw4MSwyNiwzMCwyLDUsMTcsNiw2LDAsMjIsNDIsMTksNiwxOSw0MSwxNCwzNiw3LDMsNTYsNyw5LDMsMiw2LDksNjksMywKKyAgMTUsNCwzMCwyOCwyOSw3LDksMTUsMTcsMTcsNiwxLDYsMTUzLDksMzMsNSwxMiwxNCwxNiwyOCwzLDgsNywxNCwxMiw0LDYsMzYsCisgIDksMjQsMTMsMTMsNCwyLDksMTUsMTksOSw1Myw3LDEzLDQsMTUwLDE3LDksMiw2LDEyLDcsMyw1LDU4LDE5LDU4LDI4LDgsMTQsMywKKyAgMjAsMywwLDMyLDU2LDcsNSw0LDI3LDEsNjgsNCwyOSwxMyw1LDU4LDIsOSw2NSw0MSwyNywxNiwxNSwxMiwxNCwyLDEwLDksMjQsCisgIDMsMiw5LDIsMiwzLDE0LDMyLDEwLDIyLDMsMTMsMTEsNCw2LDM5LDE3LDAsMTAsNSw1LDEwLDM1LDE2LDE5LDE0LDEsOCw2MywxOSwKKyAgMTQsOCw1NiwxMCwyLDEyLDYsMTIsNiw3LDE2LDIsOSw5LDEyLDIwLDczLDI1LDEzLDIxLDE3LDI0LDUsMzIsOCwxMiwyNSw4LDE0LAorICAxNiw1LDIzLDMsNyw2LDMsMTEsMjQsNiwzMCw0LDIxLDEzLDI4LDQsNiwyOSwxNSw1LDE3LDYsMjYsOCwxNSw4LDMsNyw3LDUwLAorICAxMSwzMCw2LDIsMjgsNTYsMTYsMjQsMjUsMjMsMjQsODksMzEsMzEsMTIsNywyMiw0LDEwLDE3LDMsMyw4LDExLDEzLDUsMywyNywKKyAgMSwxMiwxLDE0LDgsMTAsMjksMiw1LDIsMiwyMCwxMCwwLDMxLDEwLDIxLDEsNDgsMyw1LDQzLDQsNSwxOCwxMyw1LDE4LDI1LDM0LAorICAxOCwzLDUsMjIsMTYsMyw0LDIwLDMsOSwzLDI1LDYsNiw0NCwyMSwzLDEyLDcsNSw0MiwzLDIsMTQsNCwzNiw1LDMsNDUsNTEsMTUsCisgIDksMTEsMjgsOSw3LDYsNiwxMiwyNiw1LDE0LDEwLDExLDQyLDU1LDEzLDIxLDQsMjgsNiw3LDIzLDI3LDExLDEsNDEsMzYsMCwzMiwKKyAgMTUsMjYsMiwzLDIzLDMyLDExLDIsMTUsNywyOSwyNiwxNDQsMzMsMjAsMTIsNywyMSwxMCw3LDExLDY1LDQ2LDEwLDEzLDIwLDMyLAorICA0LDQsNSwxOSwyLDE5LDE1LDQ5LDQxLDEsNzUsMTAsMTEsMjUsMSwyLDQ1LDExLDgsMjcsMTgsMTAsNjAsMjgsMjksMTIsMzAsMTksCisgIDE2LDQsMjQsMTEsMTksMjcsMTcsNDksMTgsNyw0MCwxMywxOSwyMiw4LDU1LDEyLDExLDMsNiw1LDExLDgsMTAsMjIsNSw5LDksCisgIDI1LDcsMTcsNyw2NCwxLDI0LDIsMTIsMTcsNDQsNCwxMiwyNywyMSwxMSwxMCw3LDQ3LDUsOSwxMywxMiwzOCwyNywyMSw3LDI5LAorICA3LDEsMTcsMywzLDUsNDgsNjIsMTAsMywxMSwxNywxNSwxNSw2LDMsOCwxMCw4LDE4LDE5LDEzLDMsOSw3LDYsNDQsOSwxMCw0LAorICA0Myw4LDYsNiwxNCwyMCwzOCwyNCwyLDQsNSw1LDcsNSw5LDM5LDgsNDQsNDAsOSwxOSw3LDMsMTUsMjUsMiwzNywxOCwxNSw5LDUsCisgIDgsMzIsMTAsNSwxOCw0LDcsNDYsMjAsMTcsMjMsNCwxMSwxNiwxOCwzMSwxMSwzLDExLDEsMTQsMSwyNSw0LDI3LDEzLDEzLDM5LAorICAxNCw2LDYsMzUsNiwxNiwxMywxMSwxMjIsMjEsMTUsMjAsMjQsMTAsNSwxNTIsMTUsMzksNSwyMCwxNiw5LDE0LDcsNTMsNiwzLDgsCisgIDE5LDYzLDMyLDYsMiwzLDIwLDEsMTksNSwxMyw0MiwxNSw0LDYsNjgsMzEsNDYsMTEsMzgsMTAsMjQsNSw1LDgsOSwxMiwzLDM1LAorICA0NiwyNiwxNiwyLDgsNCw3NCwxNiw0NCw0LDUsMSwxNiw0LDE0LDIzLDE2LDY5LDE1LDQyLDMxLDE0LDcsNyw2LDk3LDE0LDQwLDEsCisgIDgsNywzNCw5LDM5LDE5LDEzLDE1LDEwLDIxLDE4LDEwLDUsMTUsMzgsNyw1LDEyLDcsMjAsMTUsNCwxMSw2LDE0LDUsMTcsNywzOSwKKyAgMzUsMzYsMTgsMjAsMjYsMjIsNCwyLDM2LDIxLDY0LDAsNSw5LDEwLDYsNCwxLDcsMywxLDMsMyw0LDEwLDIwLDkwLDIsMjIsNDgsCisgIDE2LDIzLDIsMzMsNDAsMSwyMSwyMSwxNywyMCw4LDgsMTIsNCw4MywxNCw0OCw0LDIxLDMsOSwyNyw1LDExLDQwLDE1LDksMywxNiwKKyAgMTcsOSwxMSw0LDI0LDMxLDE3LDMsNCwyLDExLDEsOCw0LDgsNiw0MSwxNyw0LDEzLDMsNywxNyw4LDI3LDUsMTMsNiwxMCw3LDEzLAorICAxMiwxOCwxMyw2MCwxOCwzLDgsMSwxMiwxMjUsMiw3LDE2LDIsMTEsMiw0LDcsMjYsNSw5LDE0LDE0LDE2LDgsMTQsNywxNCw2LDksCisgIDEzLDksNiw0LDI2LDM1LDQ5LDM2LDU1LDMsOSw2LDQwLDI2LDIzLDMxLDE5LDQxLDIsMTAsMzEsNiw1NCw1LDY5LDE2LDcsOCwxNiwKKyAgMSw1LDcsNCwyMiw3LDcsNSw0LDQ4LDExLDEzLDMsOTgsNCwxMSwxOSw0LDIsMTQsNywzNCw3LDEwLDMsMiwxMiw3LDYsMiw1LDExOAorIH0sCit9OworCit1aW50OF90IGRhdGFbMTw8MTVdOworc3RyaW5nIGRhdGFfc3RyOwordm9pZCBpbml0X2RhdGEoKSB7CisgIHN0YXRpYyBib29sIGluaXR0ZWQgPSBmYWxzZTsKKyAgaWYgKGluaXR0ZWQpIHJldHVybjsKKyAgaW5pdHRlZCA9IHRydWU7CisKKyAgLy8gUmVwZWF0YWJpbGl0eS4gIEtpbmQgb2YuCisgIHN0ZDo6c3JhbmQoNDIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplb2YoZGF0YSkvc2l6ZW9mKGRhdGFbMF0pKTsgKytpKSB7CisgICAgZGF0YVtpXSA9ICh1aW50OF90KXJhbmQoKTsKKyAgfQorCisgIGRhdGFfc3RyLmFzc2lnbigoY2hhciopZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoIFRCdWZmZXJCYXNlVGVzdCApCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9HZXRCdWZmZXIgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBpbmRleCA9IDA7CisKKyAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOworICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci5nZXRCdWZmZXJBc1N0cmluZygpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLCBvdXRwdXQpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkICkgeworICBpbml0X2RhdGEoKTsKKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBpbnQgaW5kZXg7CisKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGdvdCA9IGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QyXVtpbmRleF0pOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZFN0cmluZyApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOworICAgICAgc3RyaW5nIG91dHB1dDsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBpbnQgaW5kZXg7CisKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGdvdCA9IGJ1ZmZlci5yZWFkQXBwZW5kVG9TdHJpbmcob3V0cHV0LCBkaXN0W2QyXVtpbmRleF0pOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKG91dHB1dCwgZGF0YV9zdHIpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZF9NdWx0aTEgKSB7CisgIGluaXRfZGF0YSgpOworCisgIC8vIERvIHNob3J0ZXIgd3JpdGVzIGFuZCByZWFkcyBzbyB3ZSBkb24ndCBhbGlnbiB0byBwb3dlci1vZi10d28gYm91bmRhcmllcy4KKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBpbnQgaW5kZXg7CisKKyAgICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgNjsgaXRlcisrKSB7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKKyAgICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCAoMTw8MTUpLTQyKSB7CisgICAgICAgICAgYnVmZmVyLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKKyAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgKDE8PDE1KS00MikpOworCisgICAgICAgIC8vIFB1bGwgb3V0IHRoZSBleHRyYSBkYXRhLgorICAgICAgICBidWZmZXIucmVhZChkYXRhX291dCwgNDIpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZF9NdWx0aTIgKSB7CisgIGluaXRfZGF0YSgpOworCisgIC8vIERvIHNob3J0ZXIgd3JpdGVzIGFuZCByZWFkcyBzbyB3ZSBkb24ndCBhbGlnbiB0byBwb3dlci1vZi10d28gYm91bmRhcmllcy4KKyAgLy8gUHVsbCB0aGUgYnVmZmVyIG91dCBvZiB0aGUgbG9vcCBzbyBpdHMgc3RhdGUgZ2V0cyB3b3JrZWQgaGFyZGVyLgorICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisKKyAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07CisgICAgICBpbnQgb2Zmc2V0OworICAgICAgaW50IGluZGV4OworCisgICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDY7IGl0ZXIrKykgeworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCAoMTw8MTUpLTQyKSB7CisgICAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgKDE8PDE1KS00MikgeworICAgICAgICAgIGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QyXVtpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07CisgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsICgxPDwxNSktNDIpKTsKKworICAgICAgICAvLyBQdWxsIG91dCB0aGUgZXh0cmEgZGF0YS4KKyAgICAgICAgYnVmZmVyLnJlYWQoZGF0YV9vdXQsIDQyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWRfSW5jb21wbGV0ZSApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgorICAvLyBQdWxsIHRoZSBidWZmZXIgb3V0IG9mIHRoZSBsb29wIHNvIGl0cyBzdGF0ZSBnZXRzIHdvcmtlZCBoYXJkZXIuCisKKyAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOworICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxM107CisKKyAgICAgIGludCB3cml0ZV9vZmZzZXQgPSAwOworICAgICAgaW50IHdyaXRlX2luZGV4ID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCB0b193cml0ZSA9ICgxPDwxNCktNDI7CisgICAgICB3aGlsZSAodG9fd3JpdGUgPiAwKSB7CisgICAgICAgIGludCB3cml0ZV9hbXQgPSAoc3RkOjptaW4pKGRpc3RbZDFdW3dyaXRlX2luZGV4XSwgdG9fd3JpdGUpOworICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbd3JpdGVfb2Zmc2V0XSwgd3JpdGVfYW10KTsKKyAgICAgICAgd3JpdGVfb2Zmc2V0ICs9IHdyaXRlX2FtdDsKKyAgICAgICAgd3JpdGVfaW5kZXgrKzsKKyAgICAgICAgdG9fd3JpdGUgLT0gd3JpdGVfYW10OworICAgICAgfQorCisgICAgICBpbnQgcmVhZF9vZmZzZXQgPSAwOworICAgICAgaW50IHJlYWRfaW5kZXggPSAwOworICAgICAgdW5zaWduZWQgaW50IHRvX3JlYWQgPSAoMTw8MTMpLTQyOworICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKSB7CisgICAgICAgIGludCByZWFkX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMl1bcmVhZF9pbmRleF0sIHRvX3JlYWQpOworICAgICAgICBpbnQgZ290ID0gYnVmZmVyLnJlYWQoJmRhdGFfb3V0W3JlYWRfb2Zmc2V0XSwgcmVhZF9hbXQpOworICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIHJlYWRfYW10KTsKKyAgICAgICAgcmVhZF9vZmZzZXQgKz0gcmVhZF9hbXQ7CisgICAgICAgIHJlYWRfaW5kZXgrKzsKKyAgICAgICAgdG9fcmVhZCAtPSByZWFkX2FtdDsKKyAgICAgIH0KKworICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgKDE8PDEzKS00MikpOworCisgICAgICBpbnQgc2Vjb25kX29mZnNldCA9IHdyaXRlX29mZnNldDsKKyAgICAgIGludCBzZWNvbmRfaW5kZXggPSB3cml0ZV9pbmRleC0xOworICAgICAgdW5zaWduZWQgaW50IHRvX3NlY29uZCA9ICgxPDwxNCkrNDI7CisgICAgICB3aGlsZSAodG9fc2Vjb25kID4gMCkgeworICAgICAgICBpbnQgc2Vjb25kX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bc2Vjb25kX2luZGV4XSwgdG9fc2Vjb25kKTsKKyAgICAgICAgLy9wcmludGYoIiVkXG4iLCBzZWNvbmRfYW10KTsKKyAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW3NlY29uZF9vZmZzZXRdLCBzZWNvbmRfYW10KTsKKyAgICAgICAgc2Vjb25kX29mZnNldCArPSBzZWNvbmRfYW10OworICAgICAgICBzZWNvbmRfaW5kZXgrKzsKKyAgICAgICAgdG9fc2Vjb25kIC09IHNlY29uZF9hbXQ7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBvdXRwdXQgPSBidWZmZXIuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLnN1YnN0cigoMTw8MTMpLTQyKSwgb3V0cHV0KTsKKyAgICB9CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfQnVmZmVyZWRUcmFuc3BvcnRfV3JpdGUgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGludCBzaXplc1tdID0geworICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKKyAgICA1MDEsIDUxMiwgNTIzLAorICAgIDIwMDAsIDIwNDgsIDIwOTYsCisgICAgMTw8MTQsIDE8PDE3LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7CisgICAgaW50IHNpemUgPSBzaXplc1tpXTsKKyAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoMTYpKTsKKyAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOworCisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIHRyYW5zLmZsdXNoKCk7CisKKyAgICAgIHN0cmluZyBvdXRwdXQgPSBidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ciwgb3V0cHV0KTsKKyAgICB9CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfQnVmZmVyZWRUcmFuc3BvcnRfUmVhZF9GdWxsICkgeworICBpbml0X2RhdGEoKTsKKworICBpbnQgc2l6ZXNbXSA9IHsKKyAgICAxMiwgMTUsIDE2LCAxNywgMjAsCisgICAgNTAxLCA1MTIsIDUyMywKKyAgICAyMDAwLCAyMDQ4LCAyMDk2LAorICAgIDE8PDE0LCAxPDwxNywKKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgeworICAgIGludCBzaXplID0gc2l6ZXNbaV07CisgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIHNpemVvZihkYXRhKSkpOworICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKworICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIHdpdGggInJlYWQiIGJlY2F1c2UgVEJ1ZmZlcmVkVHJhbnNwb3J0CisgICAgICAgIC8vIGRvZXNuJ3QgdHJ5IGxvb3Agb3ZlciByZWFkcywgc28gd2UgZ2V0IHNob3J0IHJlYWRzLiAgV2UgZG9uJ3QKKyAgICAgICAgLy8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSwgc28gdGhhdCBtZXNzZXMgdXMgdXAuCisgICAgICAgIHRyYW5zLnJlYWRBbGwoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CdWZmZXJlZFRyYW5zcG9ydF9SZWFkX1Nob3J0ICkgeworICBpbml0X2RhdGEoKTsKKworICBpbnQgc2l6ZXNbXSA9IHsKKyAgICAxMiwgMTUsIDE2LCAxNywgMjAsCisgICAgNTAxLCA1MTIsIDUyMywKKyAgICAyMDAwLCAyMDQ4LCAyMDk2LAorICAgIDE8PDE0LCAxPDwxNywKKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgeworICAgIGludCBzaXplID0gc2l6ZXNbaV07CisgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIHNpemVvZihkYXRhKSkpOworICAgICAgc2hhcmVkX3B0cjxUU2hvcnRSZWFkVHJhbnNwb3J0PiB0c2hvcnQobmV3IFRTaG9ydFJlYWRUcmFuc3BvcnQoYnVmZmVyLCAwLjEyNSkpOworICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKworICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIHdpdGggInJlYWQiIGJlY2F1c2UgVEJ1ZmZlcmVkVHJhbnNwb3J0CisgICAgICAgIC8vIGRvZXNuJ3QgdHJ5IGxvb3Agb3ZlciByZWFkcywgc28gd2UgZ2V0IHNob3J0IHJlYWRzLiAgV2UgZG9uJ3QKKyAgICAgICAgLy8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSwgc28gdGhhdCBtZXNzZXMgdXMgdXAuCisgICAgICAgIHRyYW5zLnJlYWRBbGwoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisKKyAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfV3JpdGUgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGludCBzaXplc1tdID0geworICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKKyAgICA1MDEsIDUxMiwgNTIzLAorICAgIDIwMDAsIDIwNDgsIDIwOTYsCisgICAgMTw8MTQsIDE8PDE3LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7CisgICAgaW50IHNpemUgPSBzaXplc1tpXTsKKyAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoMTYpKTsKKyAgICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKKworICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7CisgICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIGluZGV4Kys7CisgICAgICB9CisgICAgICB0cmFucy5mbHVzaCgpOworCisgICAgICBpbnQzMl90IGZyYW1lX3NpemUgPSAtMTsKKyAgICAgIGJ1ZmZlci0+cmVhZChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmZnJhbWVfc2l6ZSksIHNpemVvZihmcmFtZV9zaXplKSk7CisgICAgICBmcmFtZV9zaXplID0gKGludDMyX3QpbnRvaGwoKHVpbnQzMl90KWZyYW1lX3NpemUpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZnJhbWVfc2l6ZSwgMTw8MTUpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIuc2l6ZSgpLCAodW5zaWduZWQgaW50KWZyYW1lX3NpemUpOworICAgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLCBvdXRwdXQpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfUmVhZCApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlcik7CisgICAgaW50MzJfdCBsZW5ndGggPSBzaXplb2YoZGF0YSk7CisgICAgbGVuZ3RoID0gKGludDMyX3QpaHRvbmwoKHVpbnQzMl90KWxlbmd0aCk7CisgICAgYnVmZmVyLT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmbGVuZ3RoKSwgc2l6ZW9mKGxlbmd0aCkpOworICAgIGJ1ZmZlci0+d3JpdGUoZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7CisgICAgICAvLyBUaGlzIHNob3VsZCB3b3JrIHdpdGggcmVhZCBiZWNhdXNlIHdlIGhhdmUgb25lIGh1Z2UgZnJhbWUuCisgICAgICB0cmFucy5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOworICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfRnJhbWVkVHJhbnNwb3J0X1dyaXRlX1JlYWQgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGludCBzaXplc1tdID0geworICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKKyAgICA1MDEsIDUxMiwgNTIzLAorICAgIDIwMDAsIDIwNDgsIDIwOTYsCisgICAgMTw8MTQsIDE8PDE3LAorICB9OworCisgIGludCBwcm9ic1tdID0geyAxLCAyLCA0LCA4LCAxNiwgMzIsIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKKyAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mIChwcm9icykgLyBzaXplb2YgKHByb2JzWzBdKTsgaisrKSB7CisgICAgICBpbnQgcHJvYiA9IHByb2JzW2pdOworICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoMTYpKTsKKyAgICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX291dCgxPDwxNywgMCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmx1c2hfc2l6ZXM7CisKKyAgICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7CisgICAgICAgIGludCB3cml0ZV9pbmRleCA9IDA7CisgICAgICAgIGludCBmbHVzaF9zaXplID0gMDsKKyAgICAgICAgd2hpbGUgKHdyaXRlX29mZnNldCA8IDE8PDE1KSB7CisgICAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbd3JpdGVfb2Zmc2V0XSwgZGlzdFtkMV1bd3JpdGVfaW5kZXhdKTsKKyAgICAgICAgICB3cml0ZV9vZmZzZXQgKz0gZGlzdFtkMV1bd3JpdGVfaW5kZXhdOworICAgICAgICAgIGZsdXNoX3NpemUgKz0gZGlzdFtkMV1bd3JpdGVfaW5kZXhdOworICAgICAgICAgIHdyaXRlX2luZGV4Kys7CisgICAgICAgICAgaWYgKGZsdXNoX3NpemUgPiAwICYmIHJhbmQoKSVwcm9iID09IDApIHsKKyAgICAgICAgICAgIGZsdXNoX3NpemVzLnB1c2hfYmFjayhmbHVzaF9zaXplKTsKKyAgICAgICAgICAgIGZsdXNoX3NpemUgPSAwOworICAgICAgICAgICAgdHJhbnMuZmx1c2goKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsdXNoX3NpemUgIT0gMCkgeworICAgICAgICAgIGZsdXNoX3NpemVzLnB1c2hfYmFjayhmbHVzaF9zaXplKTsKKyAgICAgICAgICBmbHVzaF9zaXplID0gMDsKKyAgICAgICAgICB0cmFucy5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlYWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IHJlYWRfaW5kZXggPSAwOworCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGsgPSAwOyBrIDwgZmx1c2hfc2l6ZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICBpbnQgZnNpemUgPSBmbHVzaF9zaXplc1trXTsKKyAgICAgICAgICAvLyBXZSBhcmUgZXhwbG9pdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgVEZyYW1lZFRyYW5zcG9ydC4KKyAgICAgICAgICAvLyBUaGUgcmVhZCBidWZmZXIgc3RhcnRzIGVtcHR5IGFuZCBpdCB3aWxsIG5ldmVyIGRvIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICAvLyByZWFkRnJhbWUgcGVyIHJlYWQsIHNvIHdlIHNob3VsZCBhbHdheXMgZ2V0IGV4YWN0bHkgb25lIGZyYW1lLgorICAgICAgICAgIGludCBnb3QgPSB0cmFucy5yZWFkKCZkYXRhX291dFtyZWFkX29mZnNldF0sIDE8PDE1KTsKKyAgICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGZzaXplKTsKKyAgICAgICAgICByZWFkX29mZnNldCArPSBnb3Q7CisgICAgICAgICAgcmVhZF9pbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHVuc2lnbmVkIGludClyZWFkX29mZnNldCwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCAmZGF0YV9vdXRbMF0sIHNpemVvZihkYXRhKSkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfRW1wdHlfRmx1c2ggKSB7CisgIGluaXRfZGF0YSgpOworCisgIHN0cmluZyBvdXRwdXQxKCJceDAwXHgwMFx4MDBceDAxIiJhIiwgNSk7CisgIHN0cmluZyBvdXRwdXQyKCJceDAwXHgwMFx4MDBceDAxIiJhXHgwMFx4MDBceDAwXHgwMiIiYmMiLCAxMSk7CisKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyKTsKKworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7CisgIHRyYW5zLmZsdXNoKCk7CisgIHRyYW5zLmZsdXNoKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgIiIpOworICB0cmFucy53cml0ZSgoY29uc3QgdWludDhfdCopImEiLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7CisgIHRyYW5zLmZsdXNoKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgb3V0cHV0MSk7CisgIHRyYW5zLmZsdXNoKCk7CisgIHRyYW5zLmZsdXNoKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgb3V0cHV0MSk7CisgIHRyYW5zLndyaXRlKChjb25zdCB1aW50OF90KikiYmMiLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQyKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQyKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEwMzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRGRFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKy8vIERpc2FibGVkIG9uIE1TVkMgYmVjYXVzZSB0aGUgUlRMIGFzc2VydHMgb24gYW4gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKy8vIGluIGJvdGggZGVidWcgYW5kIHJlbGVhc2UgbW9kZTsgYXQgbGVhc3QgaW4gTVNWQ1IxMDAgKFZpc3VhbCBTdHVkaW8gMjAxMCkKKyNpZiAhZGVmaW5lZChXSU4zMikKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfMSkgeworICBCT09TVF9DSEVDS19OT19USFJPVyhURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3RmZHRyYW5zcG9ydF8yKSB7CisgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1codC5jbG9zZSgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworI2Vsc2UKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfZHVtbXkpIHsKKyAgQk9PU1RfQ0hFQ0sodHJ1ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGMyNmIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgLy8gbmVlZGVkIGZvciBnZXRvcHRfbG9uZworI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKworI2lmZGVmIF9fTUlOR1czMl9fCisgICNpbmNsdWRlIDxpby5oPgorICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPGZjbnRsLmg+CisgICNpbmNsdWRlIDxzeXNcc3RhdC5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdsb2JhbCBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgY2hhciogdG1wX2RpciA9ICIvdG1wIjsKKworY2xhc3MgRnN5bmNMb2c7CitGc3luY0xvZyogZnN5bmNfbG9nOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhlbHBlciBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQ2xhc3MgdG8gcmVjb3JkIGNhbGxzIHRvIGZzeW5jCisgKi8KK2NsYXNzIEZzeW5jTG9nIHsKK3B1YmxpYzoKKyAgc3RydWN0IEZzeW5jQ2FsbCB7CisgICAgc3RydWN0IHRpbWV2YWwgdGltZTsKKyAgICBpbnQgZmQ7CisgIH07CisgIHR5cGVkZWYgc3RkOjpsaXN0PEZzeW5jQ2FsbD4gQ2FsbExpc3Q7CisKKyAgRnN5bmNMb2coKSB7fQorCisgIHZvaWQgZnN5bmMoaW50IGZkKSB7CisgICAgKHZvaWQpZmQ7CisgICAgRnN5bmNDYWxsIGNhbGw7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmY2FsbC50aW1lLCBOVUxMKTsKKyAgICBjYWxsc18ucHVzaF9iYWNrKGNhbGwpOworICB9CisKKyAgY29uc3QgQ2FsbExpc3QqIGdldENhbGxzKCkgY29uc3QgeyByZXR1cm4gJmNhbGxzXzsgfQorCitwcml2YXRlOgorICBDYWxsTGlzdCBjYWxsc187Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMKKyAqLworY2xhc3MgVGVtcEZpbGUgeworcHVibGljOgorICBUZW1wRmlsZShjb25zdCBjaGFyKiBkaXJlY3RvcnksIGNvbnN0IGNoYXIqIHByZWZpeCkgeworICAjaWZkZWYgX19NSU5HVzMyX18KKyAgICAoKHZvaWQpZGlyZWN0b3J5KTsKKyAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4ocHJlZml4KSArIDg7CisgICAgcGF0aF8gPSBuZXcgY2hhcltwYXRoX2xlbl07CisgICAgc25wcmludGYocGF0aF8sIHBhdGhfbGVuLCAiJXNYWFhYWFgiLCBwcmVmaXgpOworICAgIGlmIChfbWt0ZW1wX3MocGF0aF8scGF0aF9sZW4pID09IDApIHsKKyAgICAgIGZkXyA9IG9wZW4ocGF0aF8sT19DUkVBVCB8IE9fUkRXUiB8IE9fQklOQVJZLFNfSVJFQUQgfCBTX0lXUklURSk7CisgICAgICBpZiAoZmRfIDwgMCkgeworICAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiX21rdGVtcF9zKCkgZmFpbGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICB9CisgICNlbHNlCisgICAgc2l6ZV90IHBhdGhfbGVuID0gc3RybGVuKGRpcmVjdG9yeSkgKyBzdHJsZW4ocHJlZml4KSArIDg7CisgICAgcGF0aF8gPSBuZXcgY2hhcltwYXRoX2xlbl07CisgICAgc25wcmludGYocGF0aF8sIHBhdGhfbGVuLCAiJXMvJXNYWFhYWFgiLCBkaXJlY3RvcnksIHByZWZpeCk7CisKKyAgICBmZF8gPSBta3N0ZW1wKHBhdGhfKTsKKyAgICBpZiAoZmRfIDwgMCkgeworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIm1rc3RlbXAoKSBmYWlsZWQiKTsKKyAgICB9CisgICNlbmRpZgorICB9CisKKyAgflRlbXBGaWxlKCkgeworICAgIHVubGluaygpOworICAgIGNsb3NlKCk7CisgIH0KKworICBjb25zdCBjaGFyKiBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKworICBpbnQgZ2V0RkQoKSBjb25zdCB7IHJldHVybiBmZF87IH0KKworICB2b2lkIHVubGluaygpIHsKKyAgICBpZiAocGF0aF8pIHsKKyAgICAgIDo6dW5saW5rKHBhdGhfKTsKKyAgICAgIGRlbGV0ZVtdIHBhdGhfOworICAgICAgcGF0aF8gPSBOVUxMOworICAgIH0KKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGZkXyA8IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICA6OmNsb3NlKGZkXyk7CisgICAgZmRfID0gLTE7CisgIH0KKworcHJpdmF0ZToKKyAgY2hhciogcGF0aF87CisgIGludCBmZF87Cit9OworCisvLyBVc2Ugb3VyIG93biB2ZXJzaW9uIG9mIGZzeW5jKCkgZm9yIHRlc3RpbmcuCisvLyBUaGlzIHJldHVybnMgaW1tZWRpYXRlbHksIHNvIHRpbWluZyBpbiB0ZXN0X2Rlc3RydWN0b3IoKSBpc24ndCBhZmZlY3RlZCBieQorLy8gd2FpdGluZyBvbiB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uCitleHRlcm4gIkMiIGludCBmc3luYyhpbnQgZmQpIHsKKyAgaWYgKGZzeW5jX2xvZykgeworICAgIGZzeW5jX2xvZy0+ZnN5bmMoZmQpOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgdGltZV9kaWZmKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0MSwgY29uc3Qgc3RydWN0IHRpbWV2YWwqIHQyKSB7CisgIHJldHVybiAodDItPnR2X3VzZWMgLSB0MS0+dHZfdXNlYykgKyAodDItPnR2X3NlYyAtIHQxLT50dl9zZWMpICogMTAwMDAwMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0IGNhc2VzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogTWFrZSBzdXJlIHRoZSBURmlsZVRyYW5zcG9ydCBkZXN0cnVjdG9yIGV4aXRzICJxdWlja2x5Ii4KKyAqCisgKiBQcmV2aW91cyB2ZXJzaW9ucyBoYWQgYSBidWcgY2F1c2luZyB0aGUgd3JpdGVyIHRocmVhZCBub3QgdG8gZXhpdAorICogcmlnaHQgYXdheS4KKyAqCisgKiBJdCdzIGtpbmQgb2YgbGFtZSB0aGF0IHdlIGp1c3QgY2hlY2sgdG8gc2VlIGhvdyBsb25nIHRoZSBkZXN0cnVjdG9yIHRha2VzIGluCisgKiB3YWxsLWNsb2NrIHRpbWUuICBUaGlzIGNvdWxkIHJlc3VsdCBpbiBmYWxzZSBmYWlsdXJlcyBvbiBzbG93ZXIgc3lzdGVtcywgb3IKKyAqIG9uIGhlYXZpbHkgbG9hZGVkIG1hY2hpbmVzLgorICovCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Rlc3RydWN0b3IpIHsKKyAgVGVtcEZpbGUgZih0bXBfZGlyLCAidGhyaWZ0LlRGaWxlVHJhbnNwb3J0VGVzdC4iKTsKKworICB1bnNpZ25lZCBpbnQgY29uc3QgTlVNX0lURVJBVElPTlMgPSAxMDAwOworCisgIHVuc2lnbmVkIGludCBudW1fb3ZlciA9IDA7CisgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgTlVNX0lURVJBVElPTlM7ICsrbikgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApKTsKKworICAgIFRGaWxlVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBuZXcgVEZpbGVUcmFuc3BvcnQoZi5nZXRQYXRoKCkpOworCisgICAgLy8gd3JpdGUgc29tZXRoaW5nIHNvIHRoYXQgdGhlIHdyaXRlciB0aHJlYWQgZ2V0cyBzdGFydGVkCisgICAgdHJhbnNwb3J0LT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigiZm9vIiksIDMpOworCisgICAgLy8gRXZlcnkgb3RoZXIgaXRlcmF0aW9uLCBhbHNvIGNhbGwgZmx1c2goKSwganVzdCBpbiBjYXNlIHRoYXQgcG90ZW50aWFsbHkKKyAgICAvLyBoYXMgYW55IGVmZmVjdCBvbiBob3cgdGhlIHdyaXRlciB0aHJlYWQgd2FrZXMgdXAuCisgICAgaWYgKG4gJiAweDEpIHsKKyAgICAgIHRyYW5zcG9ydC0+Zmx1c2goKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRpbWUgdGhlIGNhbGwgdG8gdGhlIGRlc3RydWN0b3IKKyAgICAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CisKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CisgICAgZGVsZXRlIHRyYW5zcG9ydDsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOworCisgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJmVuZCk7CisKKyAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gNTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYWlsdXJlLgorICAgIC8vIFRyZWF0IHRoaXMgYXMgYSBmYXRhbCBmYWlsdXJlLCBzbyB3ZSdsbCByZXR1cm4gbm93IGluc3RlYWQgb2YKKyAgICAvLyBsb29waW5nIG92ZXIgYSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLgorICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgNTAwMDAwICk7CisKKyAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDEwMG1zIG9uIG15IGRldiBib3guCisgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zCisgICAgLy8gdGFrZSBsb25nZXIsIHNpbmNlIHdlJ3JlIGp1c3Qgd2FpdGluZyBmb3Igb3VyIHR1cm4gb24gdGhlIENQVS4KKyAgICBpZiAoZGVsdGEgPiAxMDAwMDApIHsKKyAgICAgICsrbnVtX292ZXI7CisgICAgfQorICB9CisKKyAgLy8gTWFrZSBzdXJlIGZld2VyIHRoYW4gMTAlIG9mIHRoZSBydW5zIHRvb2sgbG9uZ2VyIHRoYW4gMTAwMHVzCisgIEJPT1NUX1dBUk4obnVtX292ZXIgPCAoTlVNX0lURVJBVElPTlMgLyAxMCkpOworfQorCisvKioKKyAqIE1ha2Ugc3VyZSBzZXRGbHVzaE1heFVzKCkgaXMgaG9ub3JlZC4KKyAqLwordm9pZCB0ZXN0X2ZsdXNoX21heF91c19pbXBsKHVpbnQzMl90IGZsdXNoX3VzLCB1aW50MzJfdCB3cml0ZV91cywgdWludDMyX3QgdGVzdF91cykgeworICAvLyBURmlsZVRyYW5zcG9ydCBvbmx5IGNhbGxzIGZzeW5jKCkgaWYgZGF0YSBoYXMgYmVlbiB3cml0dGVuLAorICAvLyBzbyBtYWtlIHN1cmUgdGhlIHdyaXRlIGludGVydmFsIGlzIHNtYWxsZXIgdGhhbiB0aGUgZmx1c2ggaW50ZXJ2YWwuCisgIEJPT1NUX1dBUk4od3JpdGVfdXMgPCBmbHVzaF91cyk7CisKKyAgVGVtcEZpbGUgZih0bXBfZGlyLCAidGhyaWZ0LlRGaWxlVHJhbnNwb3J0VGVzdC4iKTsKKworICAvLyBSZWNvcmQgY2FsbHMgdG8gZnN5bmMoKQorICBGc3luY0xvZyBsb2c7CisgIGZzeW5jX2xvZyA9ICZsb2c7CisKKyAgVEZpbGVUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG5ldyBURmlsZVRyYW5zcG9ydChmLmdldFBhdGgoKSk7CisgIC8vIERvbid0IGZsdXNoIGJlY2F1c2Ugb2YgIyBvZiBieXRlcyB3cml0dGVuCisgIHRyYW5zcG9ydC0+c2V0Rmx1c2hNYXhCeXRlcygweGZmZmZmZmZmKTsKKyAgdWludDhfdCBidWZbXSA9ICJhIjsKKyAgdWludDMyX3QgYnVmbGVuID0gc2l6ZW9mKGJ1Zik7CisKKyAgLy8gU2V0IHRoZSBmbHVzaCBpbnRlcnZhbAorICB0cmFuc3BvcnQtPnNldEZsdXNoTWF4VXMoZmx1c2hfdXMpOworCisgIC8vIE1ha2Ugb25lIGNhbGwgdG8gd3JpdGUsIHRvIHN0YXJ0IHRoZSB3cml0ZXIgdGhyZWFkIG5vdy4KKyAgLy8gKElmIHdlIGp1c3QgbGV0IHRoZSB0aHJlYWQgZ2V0IGNyZWF0ZWQgZHVyaW5nIG91ciB0ZXN0IGxvb3AsCisgIC8vIHRoZSB0aHJlYWQgY3JlYXRpb24gc29tZXRpbWVzIHRha2VzIGxvbmcgZW5vdWdoIHRvIG1ha2UgdGhlIGZpcnN0CisgIC8vIGZzeW5jIGludGVydmFsIGZhaWwgdGhlIGNoZWNrLikKKyAgdHJhbnNwb3J0LT53cml0ZShidWYsIGJ1Zmxlbik7CisKKyAgLy8gQWRkIG9uZSBlbnRyeSB0byB0aGUgZnN5bmMgbG9nLCBqdXN0IHRvIG1hcmsgdGhlIHN0YXJ0IHRpbWUKKyAgbG9nLmZzeW5jKC0xKTsKKworICAvLyBMb29wIGRvaW5nIHdyaXRlKCksIHNsZWVwKCksIC4uLgorICB1aW50MzJfdCB0b3RhbF90aW1lID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB0cmFuc3BvcnQtPndyaXRlKGJ1ZiwgYnVmbGVuKTsKKyAgICBpZiAodG90YWxfdGltZSA+IHRlc3RfdXMpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB1c2xlZXAod3JpdGVfdXMpOworICAgIHRvdGFsX3RpbWUgKz0gd3JpdGVfdXM7CisgIH0KKworICBkZWxldGUgdHJhbnNwb3J0OworCisgIC8vIFN0b3AgbG9nZ2luZyBuZXcgZnN5bmMoKSBjYWxscworICBmc3luY19sb2cgPSBOVUxMOworCisgIC8vIEV4YW1pbmUgdGhlIGZzeW5jKCkgbG9nCisgIC8vCisgIC8vIFRGaWxlVHJhbnNwb3J0IHVzZXMgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgpLCB3aGljaCBvbmx5IGhhcyBtaWxsaXNlY29uZAorICAvLyByZXNvbHV0aW9uLiAgSW4gbXkgdGVzdGluZywgaXQgbm9ybWFsbHkgd2FrZXMgdXAgYWJvdXQgMSBtaWxsaXNlY29uZCBsYXRlLgorICAvLyBIb3dldmVyLCBzb21ldGltZXMgaXQgdGFrZXMgYSBiaXQgbG9uZ2VyLiAgQWxsb3cgNW1zIGxlZXdheS4KKyAgaW50IG1heF9hbGxvd2VkX2RlbHRhID0gZmx1c2hfdXMgKyA1MDAwOworCisgIGNvbnN0IEZzeW5jTG9nOjpDYWxsTGlzdCogY2FsbHMgPSBsb2cuZ2V0Q2FsbHMoKTsKKyAgLy8gV2UgYWRkZWQgMSBmc3luYyBjYWxsIGFib3ZlLgorICAvLyBNYWtlIHN1cmUgVEZpbGVUcmFuc3BvcnQgY2FsbGVkIGZzeW5jIGF0IGxlYXN0IG9uY2UKKyAgQk9PU1RfV0FSTl9HRShjYWxscy0+c2l6ZSgpLCBzdGF0aWNfY2FzdDxGc3luY0xvZzo6Q2FsbExpc3Q6OnNpemVfdHlwZT4oMSkpOworCisgIGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBwcmV2X3RpbWUgPSBOVUxMOworICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsgaXQgIT0gY2FsbHMtPmVuZCgpOyArK2l0KSB7CisgICAgaWYgKHByZXZfdGltZSkgeworICAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKHByZXZfdGltZSwgJml0LT50aW1lKTsKKyAgICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgbWF4X2FsbG93ZWRfZGVsdGEgKTsKKyAgICB9CisgICAgcHJldl90aW1lID0gJml0LT50aW1lOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZmx1c2hfbWF4X3VzMSkgeworICAvLyBmc3luYyBldmVyeSAxMG1zLCB3cml0ZSBldmVyeSA1bXMsIGZvciA1MDBtcworICB0ZXN0X2ZsdXNoX21heF91c19pbXBsKDEwMDAwLCA1MDAwLCA1MDAwMDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ZsdXNoX21heF91czIpIHsKKyAgLy8gZnN5bmMgZXZlcnkgNTBtcywgd3JpdGUgZXZlcnkgMjBtcywgZm9yIDUwMG1zCisgIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwoNTAwMDAsIDIwMDAwLCA1MDAwMDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ZsdXNoX21heF91czMpIHsKKyAgLy8gZnN5bmMgZXZlcnkgNDAwbXMsIHdyaXRlIGV2ZXJ5IDMwMG1zLCBmb3IgMXMKKyAgdGVzdF9mbHVzaF9tYXhfdXNfaW1wbCg0MDAwMDAsIDMwMDAwMCwgMTAwMDAwMCk7Cit9CisKKy8qKgorICogTWFrZSBzdXJlIGZsdXNoKCkgaXMgZmFzdCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgKgorICogVEZpbGVUcmFuc3BvcnQgdXNlZCB0byBoYXZlIGEgYnVnIHdoZXJlIGZsdXNoKCkgd291bGQgd2FpdCBmb3IgdGhlIGZzeW5jCisgKiB0aW1lb3V0IHRvIGV4cGlyZS4KKyAqLworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9ub29wX2ZsdXNoKSB7CisgIFRlbXBGaWxlIGYodG1wX2RpciwgInRocmlmdC5URmlsZVRyYW5zcG9ydFRlc3QuIik7CisgIFRGaWxlVHJhbnNwb3J0IHRyYW5zcG9ydChmLmdldFBhdGgoKSk7CisKKyAgLy8gV3JpdGUgc29tZXRoaW5nIHRvIHN0YXJ0IHRoZSB3cml0ZXIgdGhyZWFkLgorICB1aW50OF90IGJ1ZltdID0gImEiOworICB0cmFuc3BvcnQud3JpdGUoYnVmLCAxKTsKKworICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmc3RhcnQsIE5VTEwpOworCisgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgMTA7ICsrbikgeworICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgc3RydWN0IHRpbWV2YWwgbm93OworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7CisKKyAgICAvLyBGYWlsIGlmIGF0IGFueSBwb2ludCB3ZSd2ZSBiZWVuIHJ1bm5pbmcgZm9yIGxvbmdlciB0aGFuIGhhbGYgYSBzZWNvbmQuCisgICAgLy8gKFdpdGggdGhlIGJ1Z2d5IGNvZGUsIFRGaWxlVHJhbnNwb3J0IHVzZWQgdG8gdGFrZSAzIHNlY29uZHMgcGVyIGZsdXNoKCkpCisgICAgLy8KKyAgICAvLyBVc2UgYSBmYXRhbCBmYWlsIHNvIHdlIGJyZWFrIG91dCBlYXJseSwgcmF0aGVyIHRoYW4gY29udGludWluZyB0byBtYWtlCisgICAgLy8gbWFueSBtb3JlIHNsb3cgZmx1c2goKSBjYWxscy4KKyAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmbm93KTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDIwMDAwMDAgKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyYWwgSW5pdGlhbGl6YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgeworICBmcHJpbnRmKGYsICJVc2FnZTogJXMgW2Jvb3N0X29wdGlvbnNdIFtvcHRpb25zXVxuIiwgYXJndjApOworICBmcHJpbnRmKGYsICJPcHRpb25zOlxuIik7CisgIGZwcmludGYoZiwgIiAgLS10bXAtZGlyPURJUiwgLXQgRElSXG4iKTsKKyAgZnByaW50ZihmLCAiICAtLWhlbHBcbiIpOworfQorCit2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdCisgICAgICA9IHt7ImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnfSwgeyJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnfSwge05VTEwsIDAsIE5VTEwsIDB9fTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIG9wdG9wdCA9IDE7CisgICAgaW50IG9wdGNoYXIgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaHQ6IiwgbG9uZ19vcHRzLCBOVUxMKTsKKyAgICBpZiAob3B0Y2hhciA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChvcHRjaGFyKSB7CisgICAgY2FzZSAndCc6CisgICAgICB0bXBfZGlyID0gb3B0YXJnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOworICAgICAgZXhpdCgwKTsKKyAgICBjYXNlICc/JzoKKyAgICAgIGV4aXQoMSk7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIE9ubHkgaGFwcGVucyBpZiBzb21lb25lIGFkZHMgYW5vdGhlciBvcHRpb24gdG8gdGhlIG9wdGFyZyBzdHJpbmcsCisgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgorICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbiBcIi0lY1wiXG4iLCBvcHRjaGFyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitzdGF0aWMgaW50IG15QXJnYyA9IDA7CitzdGF0aWMgY2hhciAqKm15QXJndiA9IE5VTEw7CisKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKKworICAvLyBQYXJzZSBhcmd1bWVudHMKKyAgcGFyc2VfYXJncyhteUFyZ2MsbXlBcmd2KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICBteUFyZ2MgPSBhcmdjOworICBteUFyZ3YgPSBhcmd2OworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKKworICAvLyBQYXJzZSBhcmd1bWVudHMKKyAgcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRNZW1vcnlCdWZmZXJUZXN0KQorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZV9ncm93KSB7CisgIC8vIEFkZGVkIHRvIHRlc3QgdGhlIGZpeCBmb3IgVEhSSUZULTEyNDgKKyAgVE1lbW9yeUJ1ZmZlciB1dXQ7CisgIGNvbnN0IGludCBtYXhTaXplID0gNjU1MzY7CisgIHVpbnQ4X3QgdmVyaWZ5W21heFNpemVdOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWY7CisgIGJ1Zi5yZXNpemUobWF4U2l6ZSk7CisKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1heFNpemU7ICsraSkgeworICAgIGJ1ZltpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpOworICB9CisKKyAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkgKj0gMikgeworICAgIHV1dC53cml0ZSgmYnVmWzBdLCBpKTsKKyAgfQorCisgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpICo9IDIpIHsKKyAgICB1dXQucmVhZCh2ZXJpZnksIGkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIDo6bWVtY21wKHZlcmlmeSwgJmJ1ZlswXSwgaSkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfcm91bmR0cmlwKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbChuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcikpOworCisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGE7CisgIGEuaTMyX3RoaW5nID0gMTA7CisgIGEuaTY0X3RoaW5nID0gMzA7CisgIGEuc3RyaW5nX3RoaW5nID0gImhvbGxhIGJhY2sgYSI7CisKKyAgYS53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IHN0ckJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKKworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sMihuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcjIpKTsKKworICBzdHJCdWZmZXIyLT5yZXNldEJ1ZmZlcigodWludDhfdCopc2VyaWFsaXplZC5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJpYWxpemVkLmxlbmd0aCgpKSk7CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGEyOworICBhMi5yZWFkKGJpbmFyeVByb3Rjb2wyLmdldCgpKTsKKworICBCT09TVF9DSEVDSyhhID09IGEyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkQXBwZW5kVG9TdHJpbmcpIHsKKyAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKKyAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cjEtPmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7CisKKyAgc3RyaW5nIHN0cjMgPSAid3h5eiIsIHN0cjQgPSAiNjc4OSI7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyNCwgSU5UX01BWCk7CisKKyAgQk9PU1RfQ0hFQ0soc3RyMyA9PSAid3h5emFiY2QiKTsKKyAgQk9PU1RfQ0hFQ0soc3RyNCA9PSAiNjc4OTEyMzQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9leGNlcHRpb25zKSB7CisgIGNoYXIgZGF0YVtdID0gImZvb1wwYmFyIjsKKworICBUTWVtb3J5QnVmZmVyIGJ1ZjEoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6Ok9CU0VSVkUpOworICBzdHJpbmcgc3RyID0gYnVmMS5nZXRCdWZmZXJBc1N0cmluZygpOworICBCT09TVF9DSEVDSyhzdHIubGVuZ3RoKCkgPT0gNyk7CisKKyAgYnVmMS5yZXNldEJ1ZmZlcigpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1ZjEud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJmb28iLCAzKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CisKKyAgVE1lbW9yeUJ1ZmZlciBidWYyKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coYnVmMi53cml0ZSgoY29uc3QgdWludDhfdCopImJhciIsIDMpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X21heGltdW1fYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpLCBUTWVtb3J5QnVmZmVyKCkuZ2V0TWF4QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X2J1ZmZlcl9zaXplKQoreworICBCT09TVF9DSEVDS19FUVVBTCgxMDI0LCBUTWVtb3J5QnVmZmVyKCkuZ2V0QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lcnJvcl9zZXRfbWF4X2J1ZmZlcl9zaXplX3Rvb19zbWFsbCkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi5zZXRNYXhCdWZmZXJTaXplKGJ1Zi5nZXRCdWZmZXJTaXplKCkgLSAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIGJ1Zi5zZXRNYXhCdWZmZXJTaXplKDgxOTIpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzbWFsbF9idWZmKDEpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODE5MjsgKytpKQorICB7CisgICAgYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X21lbW9yeV9idWZmZXJfdG9fZ2V0X3NpemVvZl9vYmplY3RzKQoreworICAvLyBUaGlzIGlzIGEgZGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIFRNZW1vcnlCdWZmZXIgdG8gZGV0ZXJtaW5lCisgIC8vIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgYSB0aHJpZnQgb2JqZWN0IGluIHRoZSBCaW5hcnkgcHJvdG9jb2wuCisgIC8vIFNlZSBUSFJJRlQtMzQ4MAorCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbChuZXcgVEJpbmFyeVByb3RvY29sKG1lbUJ1ZmZlcikpOworCisgIHRocmlmdDo6dGVzdDo6WHRydWN0IG9iamVjdDsKKyAgb2JqZWN0LmkzMl90aGluZyA9IDEwOworICBvYmplY3QuaTY0X3RoaW5nID0gMzA7CisgIG9iamVjdC5zdHJpbmdfdGhpbmcgPSAid2hvJ3MgeW91ciBkYWRkeT8iOworCisgIHVpbnQzMl90IHNpemUgPSBvYmplY3Qud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDQ3LCBzaXplKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMzgwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCIKKworI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorCisjaW5jbHVkZSA8ZXZlbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OworCitzdHJ1Y3QgSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlSWYgeworICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeyBzdHJpbmdzXy5wdXNoX2JhY2socyk7IH0KKyAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeyBfcmV0dXJuID0gc3RyaW5nc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3NfOworCisgIC8vIGR1bW15IG92ZXJyaWRlcyBub3QgdXNlZCBpbiB0aGlzIHRlc3QKKyAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQorICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmLCBjb25zdCBpbnQzMl90KSB7fQorICB2b2lkIG9uZXdheVdhaXQoKSB7fQorICB2b2lkIGV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KK307CisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgcmV0dXJuIGtleURpciAvIGZpbGVuYW1lOworfQorCitzdHJ1Y3QgR2xvYmFsRml4dHVyZVNTTAoreworICAgIEdsb2JhbEZpeHR1cmVTU0woKQorICAgIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYzsgKytpKQorICAgICAgeworICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiYXJndlslMSVdID0gXCIlMiVcIiIpICUgaSAlIG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndltpXSk7CisgICAgICB9CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCisgICAgICAvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyNlbmRpZgorCisgICAgICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6aW5pdGlhbGl6ZU9wZW5TU0woKTsKKworICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpIC8gInRlc3QiIC8gImtleXMiOworICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgeworICAgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOworICAgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkdsb2JhbEZpeHR1cmVTU0woKQorICAgIHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmNsZWFudXBPcGVuU1NMKCk7CisjaWZkZWYgX19saW51eF9fCisgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisjZW5kaWYKKyAgICB9Cit9OworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZVNTTCk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZVNTTCkKKyNlbmRpZgorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisKKyAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgIHJldHVybiBwU2VydmVyU29ja2V0RmFjdG9yeTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OworCisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoImNsaWVudC5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNlcnRGaWxlKCJDQS5wZW0iKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcmV0dXJuIHBDbGllbnRTb2NrZXRGYWN0b3J5OworfQorCitjbGFzcyBGaXh0dXJlIHsKK3ByaXZhdGU6CisgIHN0cnVjdCBMaXN0ZW5FdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgTGlzdGVuRXZlbnRIYW5kbGVyKE11dGV4KiBtdXRleCkgOiBsaXN0ZW5Nb25pdG9yXyhtdXRleCksIHJlYWR5XyhmYWxzZSkge30KKworICAgICAgdm9pZCBwcmVTZXJ2ZSgpIC8qIG92ZXJyaWRlICovIHsKKyAgICAgICAgR3VhcmQgZyhsaXN0ZW5Nb25pdG9yXy5tdXRleCgpKTsKKyAgICAgICAgcmVhZHlfID0gdHJ1ZTsKKyAgICAgICAgbGlzdGVuTW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisKKyAgICAgIE1vbml0b3IgbGlzdGVuTW9uaXRvcl87CisgICAgICBib29sIHJlYWR5XzsKKyAgfTsKKworICBzdHJ1Y3QgUnVubmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUgeworICAgIGludCBwb3J0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbkV2ZW50SGFuZGxlcj4gbGlzdGVuSGFuZGxlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldD4gc29ja2V0OworICAgIE11dGV4IG11dGV4XzsKKworICAgIFJ1bm5lcigpIHsKKyAgICAgIGxpc3RlbkhhbmRsZXIucmVzZXQobmV3IExpc3RlbkV2ZW50SGFuZGxlcigmbXV0ZXhfKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJ1bigpIHsKKyAgICAgIC8vIFdoZW4gYmluZGluZyB0byBleHBsaWNpdCBwb3J0LCBhbGxvdyByZXRyeWluZyB0byB3b3JrYXJvdW5kIGJpbmQgZmFpbHVyZXMgb24gcG9ydHMgaW4gdXNlCisgICAgICBpbnQgcmV0cnlDb3VudCA9IHBvcnQgPyAxMCA6IDA7CisgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsgIAorICAgICAgc3RhcnRTZXJ2ZXIocmV0cnlDb3VudCk7CisgICAgfQorCisgICAgdm9pZCByZWFkeUJhcnJpZXIoKSB7CisgICAgICAvLyBibG9jayB1bnRpbCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGFuZCByZWFkeSB0byBhY2NlcHQgY29ubmVjdGlvbnMKKyAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgIHdoaWxlICghbGlzdGVuSGFuZGxlci0+cmVhZHlfKSB7CisgICAgICAgIGxpc3RlbkhhbmRsZXItPmxpc3Rlbk1vbml0b3JfLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisgIHByaXZhdGU6CisgICAgdm9pZCBzdGFydFNlcnZlcihpbnQgcmV0cnlfY291bnQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldC5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKKyAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCkpOworCSAgICAgIHNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKGxpc3RlbkhhbmRsZXIpOworICAgICAgICBzZXJ2ZXItPnNldE51bUlPVGhyZWFkcygxKTsKKyAgICAgICAgaWYgKHVzZXJFdmVudEJhc2UpIHsKKyAgICAgICAgICBzZXJ2ZXItPnJlZ2lzdGVyRXZlbnRzKHVzZXJFdmVudEJhc2UuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHNlcnZlci0+c2VydmUoKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgaWYgKHJldHJ5X2NvdW50ID4gMCkgeworICAgICAgICAgICsrcG9ydDsKKyAgICAgICAgICBzdGFydFNlcnZlcihyZXRyeV9jb3VudCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIHN0cnVjdCBFdmVudERlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKShldmVudF9iYXNlKiBwKSB7IGV2ZW50X2Jhc2VfZnJlZShwKTsgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIEZpeHR1cmUoKSA6IHByb2Nlc3NvcihuZXcgdGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcihzdGQ6Om1ha2Vfc2hhcmVkPEhhbmRsZXI+KCkpKSB7fQorCisgIH5GaXh0dXJlKCkgeworICAgIGlmIChzZXJ2ZXIpIHsKKyAgICAgIHNlcnZlci0+c3RvcCgpOworICAgIH0KKyAgICBpZiAodGhyZWFkKSB7CisgICAgICB0aHJlYWQtPmpvaW4oKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldEV2ZW50QmFzZShldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpIHsKKyAgICB1c2VyRXZlbnRCYXNlXy5yZXNldCh1c2VyX2V2ZW50X2Jhc2UsIEV2ZW50RGVsZXRlcigpKTsKKyAgfQorCisgIGludCBzdGFydFNlcnZlcihpbnQgcG9ydCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uZXI+IHJ1bm5lcihuZXcgUnVubmVyKTsKKyAgICBydW5uZXItPnBvcnQgPSBwb3J0OworICAgIHJ1bm5lci0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIHJ1bm5lci0+dXNlckV2ZW50QmFzZSA9IHVzZXJFdmVudEJhc2VfOworCisgICAgc3RkOjp1bmlxdWVfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgKKyAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICAgICAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAgIDEsCisjZW5kaWYKKyAgICAgICAgICAgIGZhbHNlKSk7CisgICAgdGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHJ1bm5lcik7CisgICAgdGhyZWFkLT5zdGFydCgpOworICAgIHJ1bm5lci0+cmVhZHlCYXJyaWVyKCk7CisKKyAgICBzZXJ2ZXIgPSBydW5uZXItPnNlcnZlcjsKKyAgICByZXR1cm4gcnVubmVyLT5wb3J0OworICB9CisKKyAgYm9vbCBjYW5Db21tdW5pY2F0ZShpbnQgc2VydmVyUG9ydCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworICAgIHNvY2tldC0+b3BlbigpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0Pihzb2NrZXQpKSk7CisgICAgY2xpZW50LmFkZFN0cmluZygiZm9vIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7CisgICAgY2xpZW50LmdldFN0cmluZ3Moc3RyaW5ncyk7CisgICAgcmV0dXJuIHN0cmluZ3Muc2l6ZSgpID09IDEgJiYgIShzdHJpbmdzWzBdLmNvbXBhcmUoImZvbyIpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPiBwcm9jZXNzb3I7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQ7CisKK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0KQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfc3BlY2lmaWVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0dFKHNwZWNpZmllZF9wb3J0LCAxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIHNwZWNpZmllZF9wb3J0KTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc3BlY2lmaWVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X2Fzc2lnbmVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3BlY2lmaWVkX3BvcnQsIDApOworICBpbnQgYXNzaWduZWRfcG9ydCA9IHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpOworICBCT09TVF9SRVFVSVJFX05FKGFzc2lnbmVkX3BvcnQsIDApOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShhc3NpZ25lZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHByb3ZpZGVfZXZlbnRfYmFzZSwgRml4dHVyZSkgeworICBldmVudF9iYXNlKiBlYiA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIHNldEV2ZW50QmFzZShlYik7CisgIHN0YXJ0U2VydmVyKDApOworCisgIC8vIGFzc2VydCB0aGF0IHRoZSBzZXJ2ZXIgd29ya3MKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCkpKTsKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+IDB4MDIwMTA0MDAKKyAgLy8gYWxzbyBhc3NlcnQgdGhhdCB0aGUgZXZlbnRfYmFzZSBpcyBhY3R1YWxseSB1c2VkIHdoZW4gaXQncyBlYXN5CisgIEJPT1NUX0NIRUNLX0dUKGV2ZW50X2Jhc2VfZ2V0X251bV9ldmVudHMoZWIsIEVWRU5UX0JBU0VfQ09VTlRfQURERUQpLCAwKTsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJiMjgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGV2ZW50Lmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCitzdHJ1Y3QgSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlSWYgeworICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeyBzdHJpbmdzXy5wdXNoX2JhY2socyk7IH0KKyAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeyBfcmV0dXJuID0gc3RyaW5nc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3NfOworCisgIC8vIGR1bW15IG92ZXJyaWRlcyBub3QgdXNlZCBpbiB0aGlzIHRlc3QKKyAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQorICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmLCBjb25zdCBpbnQzMl90KSB7fQorICB2b2lkIG9uZXdheVdhaXQoKSB7fQorICB2b2lkIGV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KK307CisKK2NsYXNzIEZpeHR1cmUgeworcHJpdmF0ZToKKyAgc3RydWN0IExpc3RlbkV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICBMaXN0ZW5FdmVudEhhbmRsZXIoTXV0ZXgqIG11dGV4KSA6IGxpc3Rlbk1vbml0b3JfKG11dGV4KSwgcmVhZHlfKGZhbHNlKSB7fQorCisgICAgICB2b2lkIHByZVNlcnZlKCkgLyogb3ZlcnJpZGUgKi8geworICAgICAgICBHdWFyZCBnKGxpc3Rlbk1vbml0b3JfLm11dGV4KCkpOworICAgICAgICByZWFkeV8gPSB0cnVlOworICAgICAgICBsaXN0ZW5Nb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgTW9uaXRvciBsaXN0ZW5Nb25pdG9yXzsKKyAgICAgIGJvb2wgcmVhZHlfOworICB9OworCisgIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgUnVubmFibGUgeworICAgIGludCBwb3J0OworICAgIHNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZTsKKyAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcjsKKyAgICBzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7CisgICAgc2hhcmVkX3B0cjxMaXN0ZW5FdmVudEhhbmRsZXI+IGxpc3RlbkhhbmRsZXI7CisgICAgc2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0OworICAgIE11dGV4IG11dGV4XzsKKworICAgIFJ1bm5lcigpIHsKKyAgICAgIGxpc3RlbkhhbmRsZXIucmVzZXQobmV3IExpc3RlbkV2ZW50SGFuZGxlcigmbXV0ZXhfKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJ1bigpIHsKKyAgICAgIC8vIFdoZW4gYmluZGluZyB0byBleHBsaWNpdCBwb3J0LCBhbGxvdyByZXRyeWluZyB0byB3b3JrYXJvdW5kIGJpbmQgZmFpbHVyZXMgb24gcG9ydHMgaW4gdXNlCisgICAgICBpbnQgcmV0cnlDb3VudCA9IHBvcnQgPyAxMCA6IDA7CisgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICAgIHNlcnZlci5yZXNldChuZXcgc2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQpKTsKKyAgICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CisgICAgICAgIGlmICh1c2VyRXZlbnRCYXNlKSB7CisgICAgICAgICAgc2VydmVyLT5yZWdpc3RlckV2ZW50cyh1c2VyRXZlbnRCYXNlLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBzZXJ2ZXItPnNlcnZlKCk7CisgICAgICB9IGNhdGNoIChjb25zdCB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIGlmIChyZXRyeV9jb3VudCA+IDApIHsKKyAgICAgICAgICArK3BvcnQ7CisgICAgICAgICAgc3RhcnRTZXJ2ZXIocmV0cnlfY291bnQgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgRXZlbnREZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoZXZlbnRfYmFzZSogcCkgeyBldmVudF9iYXNlX2ZyZWUocCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IobWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CisKKyAgfkZpeHR1cmUoKSB7CisgICAgaWYgKHNlcnZlcikgeworICAgICAgc2VydmVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmICh0aHJlYWQpIHsKKyAgICAgIHRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICAgIHVzZXJFdmVudEJhc2VfLnJlc2V0KHVzZXJfZXZlbnRfYmFzZSwgRXZlbnREZWxldGVyKCkpOworICB9CisKKyAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7CisgICAgc2hhcmVkX3B0cjxSdW5uZXI+IHJ1bm5lcihuZXcgUnVubmVyKTsKKyAgICBydW5uZXItPnBvcnQgPSBwb3J0OworICAgIHJ1bm5lci0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIHJ1bm5lci0+dXNlckV2ZW50QmFzZSA9IHVzZXJFdmVudEJhc2VfOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICBmYWxzZSkpOworICAgIHRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChydW5uZXIpOworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBydW5uZXItPnJlYWR5QmFycmllcigpOworCisgICAgc2VydmVyID0gcnVubmVyLT5zZXJ2ZXI7CisgICAgcmV0dXJuIHJ1bm5lci0+cG9ydDsKKyAgfQorCisgIGJvb2wgY2FuQ29tbXVuaWNhdGUoaW50IHNlcnZlclBvcnQpIHsKKyAgICBzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFNvY2tldD4gc29ja2V0KG5ldyB0cmFuc3BvcnQ6OlRTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpKTsKKyAgICBzb2NrZXQtPm9wZW4oKTsKKyAgICB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChtYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgICAgbWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0Pihzb2NrZXQpKSk7CisgICAgY2xpZW50LmFkZFN0cmluZygiZm9vIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7CisgICAgY2xpZW50LmdldFN0cmluZ3Moc3RyaW5ncyk7CisgICAgcmV0dXJuIHN0cmluZ3Muc2l6ZSgpID09IDEgJiYgIShzdHJpbmdzWzBdLmNvbXBhcmUoImZvbyIpKTsKKyAgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOworCit9OworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X3NwZWNpZmllZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9HRShzcGVjaWZpZWRfcG9ydCwgMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpLCBzcGVjaWZpZWRfcG9ydCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNwZWNpZmllZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9hc3NpZ25lZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDApOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNwZWNpZmllZF9wb3J0LCAwKTsKKyAgaW50IGFzc2lnbmVkX3BvcnQgPSBzZXJ2ZXItPmdldExpc3RlblBvcnQoKTsKKyAgQk9PU1RfUkVRVUlSRV9ORShhc3NpZ25lZF9wb3J0LCAwKTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoYXNzaWduZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShwcm92aWRlX2V2ZW50X2Jhc2UsIEZpeHR1cmUpIHsKKyAgZXZlbnRfYmFzZSogZWIgPSBldmVudF9iYXNlX25ldygpOworICBzZXRFdmVudEJhc2UoZWIpOworICBzdGFydFNlcnZlcigwKTsKKworICAvLyBhc3NlcnQgdGhhdCB0aGUgc2VydmVyIHdvcmtzCisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpKSk7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPiAweDAyMDEwNDAwCisgIC8vIGFsc28gYXNzZXJ0IHRoYXQgdGhlIGV2ZW50X2Jhc2UgaXMgYWN0dWFsbHkgdXNlZCB3aGVuIGl0J3MgZWFzeQorICBCT09TVF9DSEVDS19HVChldmVudF9iYXNlX2dldF9udW1fZXZlbnRzKGViLCBFVkVOVF9CQVNFX0NPVU5UX0FEREVEKSwgMCk7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjNmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfV0lOMzIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdGVzdF90b29scy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3Rfc3VpdGUuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFBpcGVJbnRlcnJ1cHRUZXN0KQorCisvLyBUT0RPOiBkdXBsaWNhdGUgdGhlIHRlc3QgY2FzZXMgaW4gVFNvY2tldEludGVycnVwdFRlc3QgZm9yIHBpcGVzLAorLy8gb25jZSBwaXBlcyBpbXBsZW1lbnQgaW50ZXJydXB0Q2hpbGRyZW4KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9pbnRlcnJ1cHRfYmVmb3JlX2FjY2VwdCkgeworICBUUGlwZVNlcnZlciBwaXBlMSgiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgIHBpcGUxLmxpc3RlbigpOworICBwaXBlMS5pbnRlcnJ1cHQoKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cocGlwZTEuYWNjZXB0KCksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQorCitzdGF0aWMgdm9pZCBhY2NlcHRXb3JrZXIoVFBpcGVTZXJ2ZXIgKnBpcGUpIHsKKyAgdHJ5CisgIHsKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0ZW1wID0gcGlwZS0+YWNjZXB0KCk7CisgICAgfQorICB9CisgIGNhdGNoICguLi4pIHsvKmp1c3Qgd2FudCB0byBtYWtlIHN1cmUgbm90aGluZyBjcmFzaGVzKi8gfQorfQorCitzdGF0aWMgdm9pZCBpbnRlcnJ1cHRXb3JrZXIoVFBpcGVTZXJ2ZXIgKnBpcGUpIHsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIHBpcGUtPmludGVycnVwdCgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzdHJlc3NfcGlwZV9hY2NlcHRfaW50ZXJydXB0aW9uKSB7CisgIGludCBpbnRlcnJ1cHRJdGVycyA9IDEwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJydXB0SXRlcnM7ICsraSkKKyAgeworICAgIFRQaXBlU2VydmVyIHBpcGVTZXJ2ZXIoIlRQaXBlSW50ZXJydXB0VGVzdCIpOworICAgIHBpcGVTZXJ2ZXIubGlzdGVuKCk7CisgICAgYm9vc3Q6OnRocmVhZCBhY2NlcHRUaHJlYWQoc3RkOjpiaW5kKGFjY2VwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKKyAgICBib29zdDo6dGhyZWFkIGludGVycnVwdFRocmVhZChzdGQ6OmJpbmQoaW50ZXJydXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIHRyeQorICAgIHsKKyAgICAgIGZvciAoOzspCisgICAgICB7CisgICAgICAgIFRQaXBlIGNsaWVudCgiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgICAgICAgIGNsaWVudC5zZXRDb25uVGltZW91dCgxKTsKKyAgICAgICAgY2xpZW50Lm9wZW4oKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoICguLi4pIHsgLypqdXN0IHRlc3RpbmcgZm9yIGNyYXNoZXMqLyB9CisgICAgaW50ZXJydXB0VGhyZWFkLmpvaW4oKTsKKyAgICBhY2NlcHRUaHJlYWQuam9pbigpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwOTFhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRQaXBlZFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfd3JpdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHVuZGVybHlpbmcobmV3IFRNZW1vcnlCdWZmZXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gcGlwZShuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnQ+IHRyYW5zKG5ldyBUUGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZSkpOworCisgIHVpbnQ4X3QgYnVmZmVyWzRdOworCisgIHVuZGVybHlpbmctPndyaXRlKCh1aW50OF90KikiYWJjZCIsIDQpOworICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiYWIiKTsKKyAgdHJhbnMtPnJlYWRFbmQoKTsKKyAgQk9PU1RfQ0hFQ0socGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiYWIiKTsKKyAgcGlwZS0+cmVzZXRCdWZmZXIoKTsKKyAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJlZiIsIDIpOworICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiY2QiKTsKKyAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKKyAgQk9PU1RfQ0hFQ0soc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImVmIik7CisgIHRyYW5zLT5yZWFkRW5kKCk7CisgIEJPT1NUX0NIRUNLKHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImNkZWYiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7CisKK3VzaW5nIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KK2Jvb3N0OjptdXRleCBnTXV0ZXg7CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3ZvaWQgcmVhZGVyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHRyeSB7CisgICAgdWludDhfdCBidWZbNDAwXTsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5yZWFkKGJ1ZiwgNDAwKTsKKyAgICBCT09TVF9FUlJPUigic2hvdWxkIG5vdCBoYXZlIGdvdHRlbiBoZXJlIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisKKyAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgIHJldHVybiBwU2VydmVyU29ja2V0RmFjdG9yeTsKK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZF93aGlsZV9oYW5kc2hha2luZykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpLAorICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2stPm9wZW4oKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcmVhZCIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyB3YWl0IGZvciByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0MDBdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHBlZWtlcldvcmtlckludGVycnVwdChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICB0dC0+cGVlaygpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VySW50ZXJydXB0LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcGVla1RocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHBlZWsiKTsKKworICAvLyB3YWl0IGZvciB0aGUgcmVjZWl2ZSB0aW1lb3V0IHRvIGtpY2sgaW4KKyAgcGVla1RocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2YzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFNlcnZlckludGVncmF0aW9uVGVzdAorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wdGltZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2ltcGxlU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWZGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZlNpbmdsZXRvbkZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5OwordXNpbmcgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kczsKKworLyoqCisgKiBwcmVTZXJ2ZSBydW5zIGFmdGVyIGxpc3RlbigpIGlzIHN1Y2Nlc3NmdWwsIHdoZW4gd2UgY2FuIGNvbm5lY3QKKyAqLworY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworLyoqCisgKiBSZXVzaW5nIGFub3RoZXIgZ2VuZXJhdGVkIHRlc3QsIGp1c3Qgc29tZXRoaW5nIHRvIHNlcnZlIHVwCisgKi8KK2NsYXNzIFBhcmVudEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcigpIDogZ2VuZXJhdGlvbl8oMCkge30KKworICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiArK2dlbmVyYXRpb25fOworICB9CisKKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbl87CisgIH0KKworICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBzdHJpbmdzXy5wdXNoX2JhY2socyk7CisgIH0KKworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKKyAgfQorCisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShfcmV0dXJuKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGxlbmd0aCk7CisgIH0KKworICB2b2lkIG9uZXdheVdhaXQoKSB7fQorCisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKK3Byb3RlY3RlZDoKKyAgTXV0ZXggbXV0ZXhfOworICBpbnQzMl90IGdlbmVyYXRpb25fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Cit9OworCit2b2lkIGF1dG9Tb2NrZXRDbG9zZXIoVFNvY2tldCogcFNvY2spIHsKKyAgcFNvY2stPmNsb3NlKCk7CisgIGRlbGV0ZSBwU29jazsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUgeworcHVibGljOgorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCisgICAgOiBwU2VydmVyKG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAorICAgICAgcEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpLAorICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgeworICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKyAgfQorCisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIF9wcm9jZXNzb3IpCisgICAgOiBwU2VydmVyKAorICAgICAgICAgIG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KG5ldyBUU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgICBiU3RyZXNzRG9uZShmYWxzZSksCisgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCgwKSwKKyAgICBiU3RyZXNzUmVxdWVzdENvdW50KDApIHsKKyAgICBwU2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIocEV2ZW50SGFuZGxlcik7CisgIH0KKworICB2b2lkIHN0YXJ0U2VydmVyKCkgeworICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQobmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVyVHlwZTo6c2VydmUsIHBTZXJ2ZXIuZ2V0KCkpKSk7CisKKyAgICAvLyBibG9jayB1bnRpbCBsaXN0ZW4oKSBjb21wbGV0ZXMgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gY29ubmVjdAorICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlICghcEV2ZW50SGFuZGxlci0+aXNMaXN0ZW5pbmcoKSkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgaXMgbGlzdGVuaW5nIik7CisgIH0KKworICB2b2lkIGJsb2NrVW50aWxBY2NlcHRlZCh1aW50NjRfdCBudW1BY2NlcHRlZCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlIChwRXZlbnRIYW5kbGVyLT5hY2NlcHRlZENvdW50KCkgPCBudW1BY2NlcHRlZCkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZlciBoYXMgYWNjZXB0ZWQgJTElIikgJSBudW1BY2NlcHRlZCk7CisgIH0KKworICB2b2lkIHN0b3BTZXJ2ZXIoKSB7CisgICAgaWYgKHBTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgIHBTZXJ2ZXItPnN0b3AoKTsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgc3RvcCBjb21wbGV0ZWQiKTsKKworICAgICAgcFNlcnZlclRocmVhZC0+am9pbigpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciB0aHJlYWQgam9pbmVkIik7CisgICAgICBwU2VydmVyVGhyZWFkLnJlc2V0KCk7CisgICAgfQorICB9CisKKyAgflRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKCkgeyBzdG9wU2VydmVyKCk7IH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBiYXNlbGluZSB0ZXN0IHdoZXJlIHNvbWUgY2xpZW50cyBhcmUgb3BlbmVkIGFuZCBpc3N1ZSBhIHNpbmdsZSBvcGVyYXRpb24KKyAgICogYW5kIHRoZW4gZGlzY29ubmVjdCBhdCBkaWZmZXJlbnQgaW50ZXJ2YWxzLgorICAgKiBccGFyYW1baW5dICBudW1Ub01ha2UgIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqIFxwYXJhbVtpbl0gIGV4cGVjdGVkSFdNICB0aGUgaGlnaCB3YXRlciBtYXJrIHdlIGV4cGVjdCBvZiBjb25jdXJyZW5jeQorICAgKiBccGFyYW1baW5dICBwdXJwb3NlICBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAqLworICB2b2lkIGJhc2VsaW5lKGludDY0X3QgbnVtVG9NYWtlLCBpbnQ2NF90IGV4cGVjdGVkSFdNLCBjb25zdCBzdGQ6OnN0cmluZyYgcHVycG9zZSkgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJUZXN0aW5nICUxJTogJTIlIHdpdGggJTMlIGNsaWVudHMsIGV4cGVjdCAlNCUgSFdNIikKKyAgICAgICAgICAgICUgdHlwZWlkKFRTZXJ2ZXJUeXBlKS5uYW1lKCkgJSBwdXJwb3NlICUgbnVtVG9NYWtlICUgZXhwZWN0ZWRIV00pOworCisgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldD4gPiBob2xkU29ja2V0czsKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgeworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jayhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICAgICAgaG9sZFNvY2tldHMucHVzaF9iYWNrKHBDbGllbnRTb2NrKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwQ2xpZW50UHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwQ2xpZW50U29jaykpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocENsaWVudFByb3RvY29sKTsKKyAgICAgIHBDbGllbnRTb2NrLT5vcGVuKCk7CisgICAgICBjbGllbnQuaW5jcmVtZW50R2VuZXJhdGlvbigpOworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygxMCAqIG51bVRvTWFrZSkpKSkpOworICAgIH0KKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkSFdNLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CisKKyAgICBCT09TVF9GT1JFQUNIIChzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7CisgICAgaG9sZFNvY2tldHMuY2xlYXIoKTsKKworICAgIHN0b3BTZXJ2ZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgdG8gY2xvc2UgYSBjb25uZWN0aW9uIGFmdGVyIGEgZGVsYXkuCisgICAqIFxwYXJhbVtpbl0gIHRvQ2xvc2UgIHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlCisgICAqIFxwYXJhbVtpbl0gIGFmdGVyICB0aGUgZGVsYXkgdG8gaW1wb3NlCisgICAqLworICB2b2lkIGRlbGF5Q2xvc2Uoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0b0Nsb3NlLCBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBhZnRlcikgeworICAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYWZ0ZXIpOworICAgIHRvQ2xvc2UtPmNsb3NlKCk7CisgIH0KKworICAvKioKKyAgICogXHJldHVybnMgIHRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIKKyAgICovCisgIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgIFRTZXJ2ZXJTb2NrZXQqIHBTb2NrID0gZHluYW1pY19jYXN0PFRTZXJ2ZXJTb2NrZXQqPihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKS5nZXQoKSk7CisgICAgaWYgKCFwU29jaykgeyB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJob3cgY29tZT8iKTsgfQorICAgIHJldHVybiBwU29jay0+Z2V0UG9ydCgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgc3RyZXNzIHRlc3QgYnkgc3Bhd25pbmcgdGhyZWFkcyB0aGF0IGNvbm5lY3QsIGRvIGEgbnVtYmVyIG9mIG9wZXJhdGlvbnMKKyAgICogYW5kIGRpc2Nvbm5lY3QsIHRoZW4gYSByYW5kb20gZGVsYXksIHRoZW4gZG8gaXQgb3ZlciBhZ2Fpbi4gIFRoaXMgaXMgZG9uZSBmb3IgYSBmaXhlZAorICAgKiBwZXJpb2Qgb2YgdGltZSB0byB0ZXN0IGZvciBjb25jdXJyZW5jeSBjb3JyZWN0bmVzcy4KKyAgICogXHBhcmFtW2luXSAgbnVtVG9NYWtlICB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdm9pZCBzdHJlc3MoaW50NjRfdCBudW1Ub01ha2UsIGNvbnN0IGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uJiBkdXJhdGlvbikgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJTdHJlc3MgdGVzdGluZyAlMSUgd2l0aCAlMiUgY2xpZW50cyBmb3IgJTMlIHNlY29uZHMiKQorICAgICAgICAlIHR5cGVpZChUU2VydmVyVHlwZSkubmFtZSgpICUgbnVtVG9NYWtlICUgZHVyYXRpb24udG90YWxfc2Vjb25kcygpKTsKKworICAgIHN0YXJ0U2VydmVyKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgbnVtVG9NYWtlOyArK2kpIHsKKyAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+KAorICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpzdHJlc3NvciwgdGhpcykpKSk7CisgICAgfQorCisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChkdXJhdGlvbik7CisgICAgYlN0cmVzc0RvbmUgPSB0cnVlOworCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmljZWQgJTElIGNvbm5lY3Rpb25zIChIV00gJTIlKSB0b3RhbGluZyAlMyUgcmVxdWVzdHMiKQorICAgICAgICAlIGJTdHJlc3NDb25uZWN0aW9uQ291bnQgJSBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSAlIGJTdHJlc3NSZXF1ZXN0Q291bnQpOworCisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KKyAgICBob2xkVGhyZWFkcy5jbGVhcigpOworCisgICAgQk9PU1RfQ0hFQ0soYlN0cmVzc1JlcXVlc3RDb3VudCA+IDApOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdG8gc3RyZXNzIHRoZSBzeXN0ZW0KKyAgICovCisgIHZvaWQgc3RyZXNzb3IoKSB7CisgIHdoaWxlICghYlN0cmVzc0RvbmUpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gcFNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocFNvY2tldCkpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocFByb3RvY29sKTsKKyAgICAgIHBTb2NrZXQtPm9wZW4oKTsKKyAgICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kKCkgJSAxMDAwOyArK2kpIHsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNoYXJlZF9wdHI8VFNlcnZlclR5cGU+IHBTZXJ2ZXI7CisgIHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyOworICBzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7CisgIHN0ZDo6YXRvbWljPGJvb2w+IGJTdHJlc3NEb25lOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzQ29ubmVjdGlvbkNvdW50OworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzUmVxdWVzdENvdW50OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlCisgICAgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKK3B1YmxpYzoKKyAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPihtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oCisgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeT4oCisgICAgICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KK2NsYXNzIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlIDogcHVibGljIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPiB7CitwdWJsaWM6CisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPihtYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkge30KK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShjb25zdHJ1Y3RvcnMpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3Rfc2ltcGxlX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMywgMSwgImZhY3RvcnkiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGUsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRTaW1wbGVTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDMsIDEsICJwcm9jZXNzb3IiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMTAsIDEwLCAiZmFjdG9yeSIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkLCBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDEwLCAxMCwgInByb2Nlc3NvciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoNCk7CisgIGJhc2VsaW5lKDEwLCA0LCAibGltaXQgYnkgc2VydmVyIGZyYW1ld29yayIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX3N0cmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKKworICBiYXNlbGluZSgxMCwgNCwgInNlcnZlciBmcmFtZXdvcmsgY29ubmVjdGlvbiBsaW1pdCIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT5zdGFydCgpOworCisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdG9wX3dpdGhfaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgeworICAvLyBUaGlzIHRlc3RzIFRIUklGVC0yNDQxIG5ldyBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBkaXNjb25uZWN0cyBjbGllbnRzCisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIC8vIFRoZSB0ZXN0IGZpeHR1cmUgZGVzdHJ1Y3RvciB3aWxsIGZvcmNlIHRoZSBzb2NrZXRzIHRvIGRpc2Nvbm5lY3QKKyAgLy8gUHJpb3IgdG8gVEhSSUZULTI0NDEsIHBTZXJ2ZXItPnN0b3AoKSB3b3VsZCBoYW5nIHVudGlsIGNsaWVudHMgZGlzY29ubmVjdGVkCisgIHN0b3BTZXJ2ZXIoKTsKKworICAvLyBleHRyYSBwcm9vZiB0aGUgc2VydmVyIGVuZCBkaXNjb25uZWN0ZWQgdGhlIGNsaWVudHMKKyAgdWludDhfdCBidWZbMV07CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBDbGllbnRTb2NrMS0+cmVhZCgmYnVmWzBdLCAxKSk7IC8vIDAgPSBkaXNjb25uZWN0ZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcENsaWVudFNvY2syLT5yZWFkKCZidWZbMF0sIDEpKTsgLy8gMCA9IGRpc2Nvbm5lY3RlZAorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF91bmludGVycnVwdGFibGVfY2xpZW50c19jb25uZWN0ZWQpIHsKKyAgLy8gVGhpcyB0ZXN0cyBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3I6IHN0b3BwaW5nIHRoZSBzZXJ2ZXIgYmxvY2tzIHVudGlsIGNsaWVudHMKKyAgLy8gZGlzY29ubmVjdC4KKyAgICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3Rpbmcgc3RvcCB3aXRoIHVuaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCisgICAgICAtPnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIGJvb3N0Ojp0aHJlYWQgdDEoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOworICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKKworICAvLyBPbmNlIHRoZSBjbGllbnRzIGRpc2Nvbm5lY3QgdGhlIHNlcnZlciB3aWxsIHN0b3AKKyAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOworICB0MS5qb2luKCk7CisgIHQyLmpvaW4oKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb25jdXJyZW50X2NsaWVudF9saW1pdCkgeworICBzdGFydFNlcnZlcigpOworICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3RpbmcgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0Iik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoSU5UNjRfTUFYLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2sxLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKworICAvLyBhIHRoaXJkIGNsaWVudCBjYW5ub3QgY29ubmVjdCB1bnRpbCBvbmUgb2YgdGhlIG90aGVyIHR3byBjbG9zZXMKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2szKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkpOworCisgIHN0b3BTZXJ2ZXIoKTsKKyAgQk9PU1RfQ0hFQ0socFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgPiAwKTsKKyAgdDIuam9pbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclNvY2tldFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluZF90b19hZGRyZXNzKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworCisgIHN0ZDo6Y291dCA8PCAiQW4gZXJyb3IgbWVzc2FnZSBmcm9tIGdldGFkZHJpbmZvIG9uIHRoZSBjb25zb2xlIGlzIGV4cGVjdGVkOiIgPDwgc3RkOjplbmRsOworICBUU2VydmVyU29ja2V0IHNvY2syKCIyNTcuMjU4LjI1OS4yNjAiLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworICBzb2NrMi5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpc3Rlbl92YWxpZF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoLTEpOworICBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKHNvY2sxLmxpc3RlbigpLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisKKyAgVFNlcnZlclNvY2tldCBzb2NrMig2NTUzNik7CisgIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jbG9zZV9iZWZvcmVfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2dldF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsSG9zdCIsIDg4OCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDg4OCwgc29jazEuZ2V0UG9ydCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzliZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTZXJ2ZXJUcmFuc3BvcnRUZXN0KQorCitjbGFzcyBUZXN0VFRyYW5zcG9ydCA6IHB1YmxpYyBUVHJhbnNwb3J0IHt9OworCitjbGFzcyBUZXN0VFNlcnZlclRyYW5zcG9ydCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQoKSA6IHZhbGlkXyh0cnVlKSB7fQorICB2b2lkIGNsb3NlKCkge30KKyAgYm9vbCB2YWxpZF87CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgeworICAgIHJldHVybiB2YWxpZF8gPyBzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PihuZXcgVGVzdFRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KCk7CisgIH0KK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcG9zaXRpdmVfYWNjZXB0KSB7CisgIFRlc3RUU2VydmVyVHJhbnNwb3J0IHV1dDsKKyAgQk9PU1RfQ0hFQ0sodXV0LmFjY2VwdCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9uZWdhdGl2ZV9hY2NlcHQpIHsKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQgdXV0OworICB1dXQudmFsaWRfID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHV1dC5hY2NlcHQoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MjQyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU29ja2V0SW50ZXJydXB0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU29ja2V0SW50ZXJydXB0VGVzdCkKKwordm9pZCByZWFkZXJXb3JrZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCB1aW50MzJfdCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0XTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdHJ5IHsKKyAgICB1aW50OF90IGJ1Zls0XTsKKyAgICB0dC0+cmVhZChidWYsIDQpOworICAgIEJPT1NUX0VSUk9SKCJzaG91bGQgbm90IGhhdmUgZ290dGVuIGhlcmUiKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyBvbmx5IHdheSB0byBwcm9jZWVkIGlzIHRvIGhhdmUgdGhlIGNsaWVudCBkaXNjb25uZWN0CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgcmVhZFRocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKSwgc3RkOjpsb2dpY19lcnJvcik7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK3ZvaWQgcGVla2VyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiByZW1vdGUgc2lkZSBpcyBjbG9zZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmggYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI3N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgVFRSQU5TUE9SVF9SRVFVSVJFX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIGNhdWdodCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfQ0FMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhdWdodCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgIFwKKyAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NjA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yaworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCitib29sIEluc2FuaXR5OjpvcGVyYXRvcjwodGhyaWZ0Ojp0ZXN0OjpJbnNhbml0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nOworICByZXR1cm4gVGhyaWZ0RGVidWdTdHJpbmcoKnRoaXMpIDwgVGhyaWZ0RGVidWdTdHJpbmcob3RoZXIpOworfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RvU3RyaW5nVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA0Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RvU3RyaW5nVGVzdC5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKworI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUb1N0cmluZ1Rlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGJhc2VfdHlwZXNfdG9fc3RyaW5nKSB7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxMCksICIxMCIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcodHJ1ZSksICIxIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygnYScpLCAiYSIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoMS4yKSwgIjEuMiIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoImFiYyIpLCAiYWJjIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5X3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW5nbGVfaXRlbV92ZWN0b3JfdG9fc3RyaW5nKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gbDsKKyAgbC5wdXNoX2JhY2soMTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiWzEwMF0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UobXVsdGlwbGVfaXRlbV92ZWN0b3JfdG9fc3RyaW5nKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gbDsKKyAgbC5wdXNoX2JhY2soMTAwKTsKKyAgbC5wdXNoX2JhY2soMTUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiWzEwMCwgMTUwXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9tYXBfdG9fc3RyaW5nKSB7CisgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInt9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX21hcF90b19zdHJpbmcpIHsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTsKKyAgbVsxMl0gPSAiYWJjIjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKG0pLCAiezEyOiBhYmN9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fbWFwX3RvX3N0cmluZykgeworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOworICBtWzEyXSA9ICJhYmMiOworICBtWzMxXSA9ICJ4eXoiOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiYywgMzE6IHh5en0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZW1wdHlfc2V0X3RvX3N0cmluZykgeworICBzdGQ6OnNldDxjaGFyPiBzOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7fSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW5nbGVfaXRlbV9zZXRfdG9fc3RyaW5nKSB7CisgIHN0ZDo6c2V0PGNoYXI+IHM7CisgIHMuaW5zZXJ0KCdjJyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgIntjfSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtdWx0aV9pdGVtX3NldF90b19zdHJpbmcpIHsKKyAgc3RkOjpzZXQ8Y2hhcj4gczsKKyAgcy5pbnNlcnQoJ2EnKTsKKyAgcy5pbnNlcnQoJ3onKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKHMpLCAie2EsIHp9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9lbXB0eV9vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6RW1wdHlTdHJ1Y3QgZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGUpLCAiRW1wdHlTdHJ1Y3QoKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfc2luZ2xlX2Jhc2ljX2ZpZWxkX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpTdHJ1Y3RBIGE7CisgIGEuX19zZXRfcygiYWJjZCIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJTdHJ1Y3RBKHM9YWJjZCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX3R3b19iYXNpY19maWVsZHNfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6OkJvbmsgYTsKKyAgYS5fX3NldF9tZXNzYWdlKCJhYmNkIik7CisgIGEuX19zZXRfdHlwZSgxMjM0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGEpLCAiQm9uayhtZXNzYWdlPWFiY2QsIHR5cGU9MTIzNCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX29wdGlvbmFsX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6VHJpY2t5MiBhOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTxudWxsPikiKTsKKyAgYS5fX3NldF9pbV9vcHRpb25hbCgxMjMpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTEyMykiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX25lc3RlZF9vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6T25lRmllbGQgYTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGEpLCAiT25lRmllbGQoZmllbGQ9RW1wdHlTdHJ1Y3QoKSkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX25lc3RlZF9saXN0X29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpMaXN0Qm9ua3MgbDsKKyAgbC5ib25rLmFzc2lnbigyLCB0aHJpZnQ6OnRlc3Q6OkJvbmsoKSk7CisgIGwuYm9ua1swXS5fX3NldF9tZXNzYWdlKCJhIik7CisgIGwuYm9ua1sxXS5fX3NldF9tZXNzYWdlKCJiIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLAorICAgICAgICAgICAgICAgICAgICAiTGlzdEJvbmtzKGJvbms9W0JvbmsobWVzc2FnZT1hLCB0eXBlPTApLCBCb25rKG1lc3NhZ2U9YiwgdHlwZT0wKV0pIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTk1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTAsMCArMSwxMDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Ym9vc3QvbXBsL2xpc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCitzdGF0aWMgYm9vc3Q6Om10MTk5Mzcgcm5nOworCit2b2lkIGluaXRyYW5kKHVuc2lnbmVkIGludCBzZWVkKSB7CisgIHJuZy5zZWVkKHNlZWQpOworfQorCitjbGFzcyBTaXplR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+U2l6ZUdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgdWludDMyX3QgbmV4dFNpemUoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7Cit9OworCitjbGFzcyBDb25zdGFudFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIENvbnN0YW50U2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gdmFsdWVfOyB9CisgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBkZXNjOworICAgIGRlc2MgPDwgdmFsdWVfOworICAgIHJldHVybiBkZXNjLnN0cigpOworICB9CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IHZhbHVlXzsKK307CisKK2NsYXNzIFJhbmRvbVNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIFJhbmRvbVNpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpCisgICAgOiBnZW5lcmF0b3JfKHJuZywgYm9vc3Q6OnVuaWZvcm1faW50PGludD4obWluLCBtYXgpKSB7fQorCisgIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gZ2VuZXJhdG9yXygpOyB9CisKKyAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGRlc2M7CisgICAgZGVzYyA8PCAicmFuZCgiIDw8IGdldE1pbigpIDw8ICIsICIgPDwgZ2V0TWF4KCkgPDwgIikiOworICAgIHJldHVybiBkZXNjLnN0cigpOworICB9CisKKyAgdWludDMyX3QgZ2V0TWluKCkgY29uc3QgeyByZXR1cm4gKGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWluKSgpOyB9CisgIHVpbnQzMl90IGdldE1heCgpIGNvbnN0IHsgcmV0dXJuIChnZW5lcmF0b3JfLmRpc3RyaWJ1dGlvbigpLm1heCkoKTsgfQorCitwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcmLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PiA+IGdlbmVyYXRvcl87Cit9OworCisvKioKKyAqIFRoaXMgY2xhc3MgZXhpc3RzIHNvbGVseSB0byBtYWtlIHRoZSBURVNUX1JXKCkgbWFjcm8gZWFzaWVyIHRvIHVzZS4KKyAqIC0gaXQgY2FuIGJlIGNvbnN0cnVjdGVkIGltcGxpY2l0bHkgZnJvbSBhbiBpbnRlZ2VyCisgKiAtIGl0IGNhbiBjb250YWluIGVpdGhlciBhIENvbnN0YW50U2l6ZUdlbmVyYXRvciBvciBhIFJhbmRvbVNpemVHZW5lcmF0b3IKKyAqICAgKFRFU1RfUlcgY2FuJ3QgdGFrZSBhIFNpemVHZW5lcmF0b3IgcG9pbnRlciBvciByZWZlcmVuY2UsIHNpbmNlIGl0IG5lZWRzCisgKiAgIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBnZW5lcmF0b3IgdG8gYmluZCBpdCB0byB0aGUgdGVzdCBmdW5jdGlvbi4pCisgKi8KK2NsYXNzIEdlbmVyaWNTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgeworcHVibGljOgorICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOiBnZW5lcmF0b3JfKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IodmFsdWUpKSB7fQorICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCBtaW4sIHVpbnQzMl90IG1heCkKKyAgICA6IGdlbmVyYXRvcl8obmV3IFJhbmRvbVNpemVHZW5lcmF0b3IobWluLCBtYXgpKSB7fQorCisgIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+bmV4dFNpemUoKTsgfQorICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYXRvcl8tPmRlc2NyaWJlKCk7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IGdlbmVyYXRvcl87Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsYXNzZXMgdG8gc2V0IHVwIGNvdXBsZWQgdHJhbnNwb3J0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byByZXByZXNlbnQgYSBjb3VwbGVkIHBhaXIgb2YgdHJhbnNwb3J0cy4KKyAqCisgKiBEYXRhIHdyaXR0ZW4gdG8gdGhlIG91dCB0cmFuc3BvcnQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgaW4gdHJhbnNwb3J0LgorICoKKyAqIFRoaXMgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIHZhcmlvdXMgY291cGxlZCB0cmFuc3BvcnQKKyAqIGltcGxlbWVudGF0aW9ucy4gIEl0IHNob3VsZG4ndCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgorY2xhc3MgQ291cGxlZFRyYW5zcG9ydHMgeworcHVibGljOgorICB2aXJ0dWFsIH5Db3VwbGVkVHJhbnNwb3J0cygpIHt9CisgIHR5cGVkZWYgVHJhbnNwb3J0XyBUcmFuc3BvcnRUeXBlOworCisgIENvdXBsZWRUcmFuc3BvcnRzKCkgOiBpbigpLCBvdXQoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBpbjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IG91dDsKKworcHJpdmF0ZToKKyAgQ291cGxlZFRyYW5zcG9ydHMoY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKKyAgQ291cGxlZFRyYW5zcG9ydHMmIG9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOworfTsKKworLyoqCisgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzCisgKi8KK2NsYXNzIENvdXBsZWRNZW1vcnlCdWZmZXJzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRNZW1vcnlCdWZmZXI+IHsKK3B1YmxpYzoKKyAgQ291cGxlZE1lbW9yeUJ1ZmZlcnMoKSA6IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcikgeworICAgIGluID0gYnVmOworICAgIG91dCA9IGJ1ZjsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSBjbGFzcyBmb3IgY3JlYXRpbmcgY291cGxlZCB0cmFuc3BvcnRzIHRoYXQgd3JhcAorICogYW5vdGhlciB0cmFuc3BvcnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBXcmFwcGVyVHJhbnNwb3J0XywgY2xhc3MgSW5uZXJDb3VwbGVkVHJhbnNwb3J0c18+CitjbGFzcyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHNUIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFdyYXBwZXJUcmFuc3BvcnRfPiB7CitwdWJsaWM6CisgIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QoKSB7CisgICAgaWYgKGlubmVyXy5pbikgeworICAgICAgdGhpcy0+aW4ucmVzZXQobmV3IFdyYXBwZXJUcmFuc3BvcnRfKGlubmVyXy5pbikpOworICAgIH0KKyAgICBpZiAoaW5uZXJfLm91dCkgeworICAgICAgdGhpcy0+b3V0LnJlc2V0KG5ldyBXcmFwcGVyVHJhbnNwb3J0Xyhpbm5lcl8ub3V0KSk7CisgICAgfQorICB9CisKKyAgSW5uZXJDb3VwbGVkVHJhbnNwb3J0c18gaW5uZXJfOworfTsKKworLyoqCisgKiBDb3VwbGVkIFRCdWZmZXJlZFRyYW5zcG9ydHMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+CitjbGFzcyBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVAorICAgIDogcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OworCit0eXBlZGVmIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPiBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOworCisvKioKKyAqIENvdXBsZWQgVEZyYW1lZFRyYW5zcG9ydHMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+CitjbGFzcyBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1QKKyAgICA6IHB1YmxpYyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHNUPFRGcmFtZWRUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4ge307CisKK3R5cGVkZWYgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPiBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0czsKKworLyoqCisgKiBDb3VwbGVkIFRabGliVHJhbnNwb3J0cy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KK2NsYXNzIENvdXBsZWRabGliVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUWmxpYlRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7fTsKKwordHlwZWRlZiBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPiBDb3VwbGVkWmxpYlRyYW5zcG9ydHM7CisKKyNpZm5kZWYgX1dJTjMyCisvLyBGRCB0cmFuc3BvcnQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2Ugb24gV2luZG93cy4KKy8qKgorICogQ291cGxlZCBURkRUcmFuc3BvcnRzLgorICovCitjbGFzcyBDb3VwbGVkRkRUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRGRFRyYW5zcG9ydD4geworcHVibGljOgorICBDb3VwbGVkRkRUcmFuc3BvcnRzKCkgeworICAgIGludCBwaXBlc1syXTsKKworICAgIGlmIChwaXBlKHBpcGVzKSAhPSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW4ucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1swXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CisgICAgb3V0LnJlc2V0KG5ldyBURkRUcmFuc3BvcnQocGlwZXNbMV0sIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkpOworICB9Cit9OworI2Vsc2UKKy8qKgorICogQ291cGxlZCBwaXBlIHRyYW5zcG9ydHMKKyAqLworY2xhc3MgQ291cGxlZFBpcGVUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRQaXBlPiB7CitwdWJsaWM6CisgIEhBTkRMRSBoUmVhZDsKKyAgSEFORExFIGhXcml0ZTsKKworICBDb3VwbGVkUGlwZVRyYW5zcG9ydHMoKSB7CisgICAgQk9PU1RfUkVRVUlSRShDcmVhdGVQaXBlKCZoUmVhZCwgJmhXcml0ZSwgTlVMTCwgMTA0ODU3NiAqIDIpKTsKKyAgICBpbi5yZXNldChuZXcgVFBpcGUoaFJlYWQsIGhXcml0ZSkpOworICAgIGluLT5vcGVuKCk7CisgICAgb3V0ID0gaW47CisgIH0KK307CisjZW5kaWYKKworLyoqCisgKiBDb3VwbGVkIFRTb2NrZXRzCisgKi8KK2NsYXNzIENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRTb2NrZXQ+IHsKK3B1YmxpYzoKKyAgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKSB7CisgICAgVEhSSUZUX1NPQ0tFVCBzb2NrZXRzWzJdID0gezB9OworICAgIGlmIChUSFJJRlRfU09DS0VUUEFJUihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc29ja2V0cykgIT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluLnJlc2V0KG5ldyBUU29ja2V0KHNvY2tldHNbMF0pKTsKKyAgICBvdXQucmVzZXQobmV3IFRTb2NrZXQoc29ja2V0c1sxXSkpOworICAgIG91dC0+c2V0U2VuZFRpbWVvdXQoMTAwKTsKKyAgfQorfTsKKworLy8gVGhlc2UgY291bGQgYmUgbWFkZSB0byB3b3JrIG9uIFdpbmRvd3MsIGJ1dCBJIGRvbid0IGNhcmUgZW5vdWdoIHRvIG1ha2UgaXQgaGFwcGVuCisjaWZuZGVmIF9XSU4zMgorLyoqCisgKiBDb3VwbGVkIFRGaWxlVHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkRmlsZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEZpbGVUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgQ291cGxlZEZpbGVUcmFuc3BvcnRzKCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyKiB0bXBfZGlyID0gIi90bXAiOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIi90aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZWxzZQorICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSBnZXRlbnYoIlRNUCIpOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIlxcdGhyaWZ0LnRyYW5zcG9ydF90ZXN0IgorI2VuZGlmCisKKyAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKKyAgICBmaWxlbmFtZS5yZXNpemUoc3RybGVuKHRtcF9kaXIpICsgc3RybGVuKEZJTEVOQU1FX1NVRkZJWCkpOworICAgIFRIUklGVF9TTlBSSU5URigmZmlsZW5hbWVbMF0sIGZpbGVuYW1lLnNpemUoKSwgIiVzIiBGSUxFTkFNRV9TVUZGSVgsIHRtcF9kaXIpOworI3VuZGVmIEZJTEVOQU1FX1NVRkZJWAorCisgICAgeyBzdGQ6Om9mc3RyZWFtIGR1bW15X2NyZWF0aW9uKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6b2ZzdHJlYW06OnRydW5jKTsgfQorCisgICAgaW4ucmVzZXQobmV3IFRGaWxlVHJhbnNwb3J0KGZpbGVuYW1lLCB0cnVlKSk7CisgICAgb3V0LnJlc2V0KG5ldyBURmlsZVRyYW5zcG9ydChmaWxlbmFtZSkpOworICB9CisKKyAgfkNvdXBsZWRGaWxlVHJhbnNwb3J0cygpIHsgcmVtb3ZlKGZpbGVuYW1lLmNfc3RyKCkpOyB9CisKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7Cit9OworI2VuZGlmCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgYW5vdGhlciBDb3VwbGVkVHJhbnNwb3J0cyBpbXBsZW1lbnRhdGlvbiB0aGF0IGV4cG9zZXMgdGhlCisgKiB0cmFuc3BvcnRzIGFzIFRUcmFuc3BvcnQgcG9pbnRlcnMuCisgKgorICogVGhpcyBpcyB1c2VkIHNpbmNlIGFjY2Vzc2luZyBhIHRyYW5zcG9ydCB2aWEgYSAiVFRyYW5zcG9ydCoiIGV4ZXJjaXNlcyBhCisgKiBkaWZmZXJlbnQgY29kZSBwYXRoIHRoYW4gdXNpbmcgdGhlIGJhc2UgcG9pbnRlciBjbGFzcy4gIEFzIHBhcnQgb2YgdGhlCisgKiB0ZW1wbGF0ZSBjb2RlIGNoYW5nZXMsIG1vc3QgdHJhbnNwb3J0IG1ldGhvZHMgYXJlIG5vIGxvbmdlciB2aXJ0dWFsLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHNfPgorY2xhc3MgQ291cGxlZFRUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgQ291cGxlZFRUcmFuc3BvcnRzKCkgOiB0cmFuc3BvcnRzKCkgeworICAgIGluID0gdHJhbnNwb3J0cy5pbjsKKyAgICBvdXQgPSB0cmFuc3BvcnRzLm91dDsKKyAgfQorCisgIENvdXBsZWRUcmFuc3BvcnRzXyB0cmFuc3BvcnRzOworfTsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhbm90aGVyIENvdXBsZWRUcmFuc3BvcnRzIGltcGxlbWVudGF0aW9uIHRoYXQgZXhwb3NlcyB0aGUKKyAqIHRyYW5zcG9ydHMgYXMgVEJ1ZmZlckJhc2UgcG9pbnRlcnMuCisgKgorICogVGhpcyBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHRyYW5zcG9ydCB0eXBlIHRoYXQgaXMgYSBzdWJjbGFzcyBvZgorICogVEJ1ZmZlckJhc2UuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0c18+CitjbGFzcyBDb3VwbGVkQnVmZmVyQmFzZXMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKKyAgQ291cGxlZEJ1ZmZlckJhc2VzKCkgOiB0cmFuc3BvcnRzKCkgeworICAgIGluID0gdHJhbnNwb3J0cy5pbjsKKyAgICBvdXQgPSB0cmFuc3BvcnRzLm91dDsKKyAgfQorCisgIENvdXBsZWRUcmFuc3BvcnRzXyB0cmFuc3BvcnRzOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGFybSBoYW5kbGluZyBjb2RlIGZvciB1c2UgaW4gdGVzdHMgdGhhdCBjaGVjayB0aGUgdHJhbnNwb3J0IGJsb2NraW5nCisgKiBzZW1hbnRpY3MuCisgKgorICogSWYgdGhlIHRyYW5zcG9ydCBlbmRzIHVwIGJsb2NraW5nLCB3ZSBkb24ndCB3YW50IHRvIGhhbmcgZm9yZXZlci4gIFdlIHVzZQorICogU0lHQUxSTSB0byBmaXJlIHNjaGVkdWxlIHNpZ25hbCB0byB3YWtlIHVwIGFuZCB0cnkgdG8gd3JpdGUgZGF0YSBzbyB0aGUKKyAqIHRyYW5zcG9ydCB3aWxsIHVuYmxvY2suCisgKgorICogSXQgaXNuJ3QgcmVhbGx5IHRoZSBzYWZlc3QgdGhpbmcgaW4gdGhlIHdvcmxkIHRvIGJlIG11Y2tpbmcgYXJvdW5kIHdpdGgKKyAqIGNvbXBsaWNhdGVkIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgaW4gYSBzaWduYWwgaGFuZGxlci4gIEl0IHNob3VsZCBwcm9iYWJseQorICogYmUgb2theSB0aG91Z2gsIHNpbmNlIHdlIGtub3cgdGhlIG1haW4gdGhyZWFkIHNob3VsZCBhbHdheXMgYmUgYmxvY2tlZCBpbiBhCisgKiByZWFkKCkgcmVxdWVzdCB3aGVuIHRoZSBzaWduYWwgaGFuZGxlciBpcyBydW5uaW5nLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgVHJpZ2dlckluZm8geworICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsIHVpbnQzMl90IHdyaXRlTGVuZ3RoKQorICAgIDogdGltZW91dFNlY29uZHMoc2Vjb25kcyksIHRyYW5zcG9ydCh0cmFuc3BvcnQpLCB3cml0ZUxlbmd0aCh3cml0ZUxlbmd0aCksIG5leHQoTlVMTCkge30KKworICBpbnQgdGltZW91dFNlY29uZHM7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHVpbnQzMl90IHdyaXRlTGVuZ3RoOworICBUcmlnZ2VySW5mbyogbmV4dDsKK307CisKK2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBnX2FsYXJtX21vbml0b3I7CitUcmlnZ2VySW5mbyogZ190cmlnZ2VySW5mbzsKK3Vuc2lnbmVkIGludCBnX251bVRyaWdnZXJzRmlyZWQ7Citib29sIGdfdGVhcmRvd24gPSBmYWxzZTsKKwordm9pZCBhbGFybV9oYW5kbGVyKCkgeworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjaworICAgIC8vIG9uIGEgdHJhbnNwb3J0IHRoYXQgaXMgaW5jb3JyZWN0bHkgYmxvY2tlZC4KKyAgICArK2dfbnVtVHJpZ2dlcnNGaXJlZDsKKworICAgIC8vIE5vdGU6IHdlIHByaW50IG1lc3NhZ2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciwgc2luY2UKKyAgICAvLyB0b29scy90ZXN0L3J1bm5lciBvbmx5IHJlY29yZHMgc3Rkb3V0IG1lc3NhZ2VzIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIGZvcgorICAgIC8vIGJvb3N0IHRlc3RzLiAgKGJvb3N0IHByaW50cyBpdHMgdGVzdCBpbmZvIHRvIHN0ZG91dC4pCisgICAgcHJpbnRmKCJUaW1lb3V0IGFsYXJtIGV4cGlyZWQ7IGF0dGVtcHRpbmcgdG8gdW5ibG9jayB0cmFuc3BvcnRcbiIpOworICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgIHByaW50ZigiICB0cmlnZ2VyIHN0YWNrIGlzIGVtcHR5IVxuIik7CisgICAgfQorCisgICAgLy8gUG9wIG9mZiB0aGUgZmlyc3QgVHJpZ2dlckluZm8uCisgICAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciBvbmUsIHNjaGVkdWxlIGFuIGFsYXJtIGZvciBpdC4KKyAgICBpbmZvID0gZ190cmlnZ2VySW5mbzsKKyAgICBnX3RyaWdnZXJJbmZvID0gaW5mby0+bmV4dDsKKyAgfQorCisgIC8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgdHJhbnNwb3J0IHRvIGhvcGVmdWxseSB1bmJsb2NrIGl0LgorICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtpbmZvLT53cml0ZUxlbmd0aF07CisgIG1lbXNldChidWYsICdiJywgaW5mby0+d3JpdGVMZW5ndGgpOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IGFycmF5KGJ1Zik7CisgIGluZm8tPnRyYW5zcG9ydC0+d3JpdGUoYnVmLCBpbmZvLT53cml0ZUxlbmd0aCk7CisgIGluZm8tPnRyYW5zcG9ydC0+Zmx1c2goKTsKKworICBkZWxldGUgaW5mbzsKK30KKwordm9pZCBhbGFybV9oYW5kbGVyX3dyYXBwZXIoKSB7CisgIGludDY0X3QgdGltZW91dCA9IDA7IC8vIHRpbWVvdXQgb2YgMCBtZWFucyB3YWl0IGZvcmV2ZXIKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBib29sIGZpcmVIYW5kbGVyID0gZmFsc2U7CisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgICAgaWYgKGdfdGVhcmRvd24pCisgICAgICAgIHJldHVybjsKKyAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lb3V0CisgICAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IGdfdHJpZ2dlckluZm8tPnRpbWVvdXRTZWNvbmRzICogMTAwMDsKKyAgICAgIH0KKworICAgICAgaW50IHdhaXRSZXN1bHQgPSBnX2FsYXJtX21vbml0b3Iud2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0KTsKKyAgICAgIGlmICh3YWl0UmVzdWx0ID09IFRIUklGVF9FVElNRURPVVQpCisgICAgICAgIGZpcmVIYW5kbGVyID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZpcmVIYW5kbGVyKQorICAgICAgYWxhcm1faGFuZGxlcigpOyAvLyBjYWxsaW5nIG91dHNpZGUgdGhlIGxvY2sKKyAgfQorfQorCisvKioKKyAqIEFkZCBhIHRyaWdnZXIgdG8gYmUgc2NoZWR1bGVkICJzZWNvbmRzIiBzZWNvbmRzIGFmdGVyIHRoZQorICogbGFzdCBjdXJyZW50bHkgc2NoZWR1bGVkIHRyaWdnZXIuCisgKgorICogKE5vdGUgdGhhdCB0aGlzIGlzIG5vdCAic2Vjb25kcyIgZnJvbSBub3cuICBUaGF0IG1pZ2h0IGJlIG1vcmUgbG9naWNhbCwgYnV0CisgKiB3b3VsZCByZXF1aXJlIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgc29ydGluZywgcmF0aGVyIHRoYW4ganVzdCBhcHBlbmRpbmcKKyAqIHRvIHRoZSBlbmQuKQorICovCit2b2lkIGFkZF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gbmV3IFRyaWdnZXJJbmZvKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmlnZ2VyLgorICAgICAgLy8gU2V0IGdfdHJpZ2dlckluZm8sIGFuZCBzY2hlZHVsZSB0aGUgYWxhcm0KKyAgICAgIGdfdHJpZ2dlckluZm8gPSBpbmZvOworICAgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBZGQgdGhpcyB0cmlnZ2VyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgIFRyaWdnZXJJbmZvKiBwcmV2ID0gZ190cmlnZ2VySW5mbzsKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0KSB7CisgICAgICAgIHByZXYgPSBwcmV2LT5uZXh0OworICAgICAgfQorICAgICAgcHJldi0+bmV4dCA9IGluZm87CisgICAgfQorICB9Cit9CisKK3ZvaWQgY2xlYXJfdHJpZ2dlcnMoKSB7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gTlVMTDsKKworICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgIGluZm8gPSBnX3RyaWdnZXJJbmZvOworICAgIGdfdHJpZ2dlckluZm8gPSBOVUxMOworICAgIGdfbnVtVHJpZ2dlcnNGaXJlZCA9IDA7CisgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOworICB9CisKKyAgd2hpbGUgKGluZm8gIT0gTlVMTCkgeworICAgIFRyaWdnZXJJbmZvKiBuZXh0ID0gaW5mby0+bmV4dDsKKyAgICBkZWxldGUgaW5mbzsKKyAgICBpbmZvID0gbmV4dDsKKyAgfQorfQorCit2b2lkIHNldF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7CisgIGNsZWFyX3RyaWdnZXJzKCk7CisgIGFkZF90cmlnZ2VyKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRlc3QgaW50ZXJsZWF2ZWQgd3JpdGUgYW5kIHJlYWQgY2FsbHMuCisgKgorICogR2VuZXJhdGVzIGEgYnVmZmVyIHRvdGFsU2l6ZSBieXRlcyBsb25nLCB0aGVuIHdyaXRlcyBpdCB0byB0aGUgdHJhbnNwb3J0LAorICogYW5kIHZlcmlmaWVzIHRoZSB3cml0dGVuIGRhdGEgY2FuIGJlIHJlYWQgYmFjayBjb3JyZWN0bHkuCisgKgorICogTW9kZSBvZiBvcGVyYXRpb246CisgKiAtIGNhbGwgd0NodW5rR2VuZXJhdG9yIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIG9mIGEgY2h1bmsgdG8gd3JpdGUKKyAqICAgLSBjYWxsIHdTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCB3cml0ZSgpIGNhbGxzLAorICogICAgIGFuZCBkbyB0aGlzIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBjaHVuayBpcyB3cml0dGVuLgorICogLSBjYWxsIHJDaHVua0dlbmVyYXRvciB0byBmaWd1cmUgb3V0IGhvdyBsYXJnZSBvZiBhIGNodW5rIHRvIHJlYWQKKyAqICAgLSBjYWxsIHJTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCByZWFkKCkgY2FsbHMsCisgKiAgICAgYW5kIGRvIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW50aXJlIGNodW5rIGlzIHJlYWQuCisgKiAtIHJlcGVhdCB1bnRpbCB0aGUgZnVsbCBidWZmZXIgaXMgd3JpdHRlbiBhbmQgcmVhZCBiYWNrLAorICogICB0aGVuIGNvbXBhcmUgdGhlIGRhdGEgcmVhZCBiYWNrIGFnYWluc3QgdGhlIG9yaWdpbmFsIGJ1ZmZlcgorICoKKyAqCisgKiAtIElmIGFueSBvZiB0aGUgc2l6ZSBnZW5lcmF0b3JzIHJldHVybiAwLCB0aGlzIG1lYW5zIHRvIHVzZSB0aGUgbWF4aW11bQorICogICBwb3NzaWJsZSBzaXplLgorICoKKyAqIC0gSWYgbWF4T3V0c3RhbmRpbmcgaXMgbm9uLXplcm8sIHdyaXRlIGNodW5rIHNpemVzIHdpbGwgYmUgY2hvc2VuIHN1Y2ggdGhhdAorICogICB0aGVyZSBhcmUgbmV2ZXIgbW9yZSB0aGFuIG1heE91dHN0YW5kaW5nIGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCBiYWNrLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Cit2b2lkIHRlc3RfcncodWludDMyX3QgdG90YWxTaXplLAorICAgICAgICAgICAgIFNpemVHZW5lcmF0b3ImIHdTaXplR2VuZXJhdG9yLAorICAgICAgICAgICAgIFNpemVHZW5lcmF0b3ImIHJTaXplR2VuZXJhdG9yLAorICAgICAgICAgICAgIFNpemVHZW5lcmF0b3ImIHdDaHVua0dlbmVyYXRvciwKKyAgICAgICAgICAgICBTaXplR2VuZXJhdG9yJiByQ2h1bmtHZW5lcmF0b3IsCisgICAgICAgICAgICAgdWludDMyX3QgbWF4T3V0c3RhbmRpbmcpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gd2J1ZiA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7CisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gcmJ1ZiA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7CisKKyAgLy8gc3RvcmUgc29tZSBkYXRhIGluIHdidWYKKyAgZm9yICh1aW50MzJfdCBuID0gMDsgbiA8IHRvdGFsU2l6ZTsgKytuKSB7CisgICAgd2J1ZltuXSA9IChuICYgMHhmZik7CisgIH0KKyAgLy8gY2xlYXIgcmJ1ZgorICBtZW1zZXQocmJ1Zi5nZXQoKSwgMCwgdG90YWxTaXplKTsKKworICB1aW50MzJfdCB0b3RhbF93cml0dGVuID0gMDsKKyAgdWludDMyX3QgdG90YWxfcmVhZCA9IDA7CisgIHdoaWxlICh0b3RhbF9yZWFkIDwgdG90YWxTaXplKSB7CisgICAgLy8gRGV0ZXJtaW5lIGhvdyBsYXJnZSBhIGNodW5rIG9mIGRhdGEgdG8gd3JpdGUKKyAgICB1aW50MzJfdCB3Y2h1bmtfc2l6ZSA9IHdDaHVua0dlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgIGlmICh3Y2h1bmtfc2l6ZSA9PSAwIHx8IHdjaHVua19zaXplID4gdG90YWxTaXplIC0gdG90YWxfd3JpdHRlbikgeworICAgICAgd2NodW5rX3NpemUgPSB0b3RhbFNpemUgLSB0b3RhbF93cml0dGVuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpICsgd2NodW5rX3NpemUKKyAgICAvLyBpcyBsZXNzIHRoYW4gbWF4T3V0c3RhbmRpbmcKKyAgICBpZiAobWF4T3V0c3RhbmRpbmcgPiAwICYmIHdjaHVua19zaXplID4gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpKSB7CisgICAgICB3Y2h1bmtfc2l6ZSA9IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgY2h1bmsKKyAgICB1aW50MzJfdCBjaHVua193cml0dGVuID0gMDsKKyAgICB3aGlsZSAoY2h1bmtfd3JpdHRlbiA8IHdjaHVua19zaXplKSB7CisgICAgICB1aW50MzJfdCB3cml0ZV9zaXplID0gd1NpemVHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICAgIGlmICh3cml0ZV9zaXplID09IDAgfHwgd3JpdGVfc2l6ZSA+IHdjaHVua19zaXplIC0gY2h1bmtfd3JpdHRlbikgeworICAgICAgICB3cml0ZV9zaXplID0gd2NodW5rX3NpemUgLSBjaHVua193cml0dGVuOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod2J1Zi5nZXQoKSArIHRvdGFsX3dyaXR0ZW4sIHdyaXRlX3NpemUpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgICAgaWYgKHRlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHRocm93IHRlOworICAgICAgfQorICAgICAgY2h1bmtfd3JpdHRlbiArPSB3cml0ZV9zaXplOworICAgICAgdG90YWxfd3JpdHRlbiArPSB3cml0ZV9zaXplOworICAgIH0KKworICAgIC8vIEZsdXNoIHRoZSBkYXRhLCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcmVhZCB0cmFuc3BvcnQKKyAgICAvLyBEb24ndCBmbHVzaCBpZiB3Y2h1bmtfc2l6ZSBpcyAwLiAgKFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmCisgICAgLy8gdG90YWxfd3JpdHRlbiA9PSB0b3RhbFNpemUgYWxyZWFkeSwgYW5kIHdlJ3JlIG9ubHkgcmVhZGluZyBub3cuKQorICAgIGlmICh3Y2h1bmtfc2l6ZSA+IDApIHsKKyAgICAgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworICAgIH0KKworICAgIC8vIERldGVybWluZSBob3cgbGFyZ2UgYSBjaHVuayBvZiBkYXRhIHRvIHJlYWQgYmFjaworICAgIHVpbnQzMl90IHJjaHVua19zaXplID0gckNodW5rR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgaWYgKHJjaHVua19zaXplID09IDAgfHwgcmNodW5rX3NpemUgPiB0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkgeworICAgICAgcmNodW5rX3NpemUgPSB0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZDsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBjaHVuaworICAgIHVpbnQzMl90IGNodW5rX3JlYWQgPSAwOworICAgIHdoaWxlIChjaHVua19yZWFkIDwgcmNodW5rX3NpemUpIHsKKyAgICAgIHVpbnQzMl90IHJlYWRfc2l6ZSA9IHJTaXplR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgICBpZiAocmVhZF9zaXplID09IDAgfHwgcmVhZF9zaXplID4gcmNodW5rX3NpemUgLSBjaHVua19yZWFkKSB7CisgICAgICAgIHJlYWRfc2l6ZSA9IHJjaHVua19zaXplIC0gY2h1bmtfcmVhZDsKKyAgICAgIH0KKworICAgICAgaW50IGJ5dGVzX3JlYWQgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJidWYuZ2V0KCkgKyB0b3RhbF9yZWFkLCByZWFkX3NpemUpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgICBCT09TVF9GQUlMKCJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSB0aHJldyBleGNlcHRpb24gXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZS53aGF0KCkgPDwgIlwiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuIDw8ICIgLyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKKyAgICAgIH0KKworICAgICAgQk9PU1RfUkVRVUlSRV9NRVNTQUdFKGJ5dGVzX3JlYWQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnl0ZXNfcmVhZCA8PCAiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAvICIgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKKyAgICAgIGNodW5rX3JlYWQgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIHRvdGFsX3JlYWQgKz0gYnl0ZXNfcmVhZDsKKyAgICB9CisgIH0KKworICAvLyBtYWtlIHN1cmUgdGhlIGRhdGEgcmVhZCBiYWNrIGlzIGlkZW50aWNhbCB0byB0aGUgZGF0YSB3cml0dGVuCisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChyYnVmLmdldCgpLCB3YnVmLmdldCgpLCB0b3RhbFNpemUpLCAwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgordm9pZCB0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGUoKSB7CisgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKworICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CisgIHVpbnQ4X3QgcmVhZF9idWZbMTZdOworICBtZW1zZXQod3JpdGVfYnVmLCAnYScsIHNpemVvZih3cml0ZV9idWYpKTsKKworICAvLyBBdHRlbXBpbmcgdG8gcmVhZCAxMCBieXRlcyB3aGVuIG9ubHkgOSBhcmUgYXZhaWxhYmxlIHNob3VsZCByZXR1cm4gOQorICAvLyBpbW1lZGlhdGVseS4KKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgOSk7CisgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTkpOworCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rcygpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIFdyaXRlIDEwIGJ5dGVzIChpbiBhIHNpbmdsZSBmcmFtZSwgZm9yIHRyYW5zcG9ydHMgdGhhdCB1c2UgZnJhbWluZykKKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgMTApOworICB0cmFuc3BvcnRzLm91dC0+Zmx1c2goKTsKKworICAvLyBSZWFkIDEgYnl0ZSwgdG8gZm9yY2UgdGhlIHRyYW5zcG9ydCB0byByZWFkIHRoZSBmcmFtZQorICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsIDF1KTsKKworICAvLyBSZWFkIG1vcmUgdGhhbiB3aGF0IGlzIHJlbWFpbmluZyBhbmQgdmVyaWZ5IHRoZSB0cmFuc3BvcnQgZG9lcyBub3QgYmxvY2sKKyAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOworICBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMTApOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsIDB1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgOXUpOworCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWUoKSB7CisgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKworICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CisgIHVpbnQ4X3QgcmVhZF9idWZbMTZdOworICBtZW1zZXQod3JpdGVfYnVmLCAnYScsIHNpemVvZih3cml0ZV9idWYpKTsKKworICAvLyBBdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMsIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUsIGJ1dCBhZnRlciB3ZSBoYXZlCisgIC8vIGFscmVhZHkgcmVhZCBwYXJ0IG9mIHRoZSBkYXRhIHRoYXQgaXMgYXZhaWxhYmxlLiAgVGhpcyBleGVyY2lzZXMgYQorICAvLyBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXZlcmFsIG9mIHRoZSB0cmFuc3BvcnRzLgorICAvLworICAvLyBGb3IgdHJhbnNwb3J0cyB0aGF0IGFkZCB0aGVpciBvd24gZnJhbWluZyAoZS5nLiwgVEZyYW1lZFRyYW5zcG9ydCBhbmQKKyAgLy8gVEZpbGVUcmFuc3BvcnQpLCB0aGUgdHdvIGZsdXNoIGNhbGxzIGJyZWFrIHVwIHRoZSBkYXRhIGluIHRvIGEgMTAgYnl0ZQorICAvLyBmcmFtZSBhbmQgYSAzIGJ5dGUgZnJhbWUuICBUaGUgZmlyc3QgcmVhZCB0aGVuIHB1dHMgdXMgcGFydHdheSB0aHJvdWdoIHRoZQorICAvLyBmaXJzdCBmcmFtZSwgYW5kIHRoZW4gd2UgYXR0ZW1wdCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGF0IGZyYW1lLCBhbmQKKyAgLy8gdGhyb3VnaCB0aGUgbmV4dCBmcmFtZSwgdG9vLgorICAvLworICAvLyBGb3IgYnVmZmVyZWQgdHJhbnNwb3J0cyB0aGF0IHBlcmZvcm0gcmVhZC1haGVhZCAoZS5nLiwKKyAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0KSwgdGhlIHJlYWQtYWhlYWQgd2lsbCBtb3N0IGxpa2VseSBzZWUgYWxsIDEzIGJ5dGVzCisgIC8vIHdyaXR0ZW4gb24gdGhlIGZpcnN0IHJlYWQuICBUaGUgbmV4dCByZWFkIHdpbGwgdGhlbiBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAvLyB0aGUgZW5kIG9mIHRoZSByZWFkLWFoZWFkIGJ1ZmZlci4KKyAgLy8KKyAgLy8gRmx1c2ggMTAgYnl0ZXMsIHRoZW4gMyBieXRlcy4gIFRoaXMgY3JlYXRlcyAyIHNlcGFyYXRlIGZyYW1lcyBmb3IKKyAgLy8gdHJhbnNwb3J0cyB0aGF0IHRyYWNrIGZyYW1pbmcgaW50ZXJuYWxseS4KKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgMTApOworICB0cmFuc3BvcnRzLm91dC0+Zmx1c2goKTsKKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgMyk7CisgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworCisgIC8vIE5vdyByZWFkIDQgYnl0ZXMsIHNvIHRoYXQgd2UgYXJlIHBhcnR3YXkgdGhyb3VnaCB0aGUgd3JpdHRlbiBkYXRhLgorICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCk0KTsKKworICAvLyBOb3cgYXR0ZW1wdCB0byByZWFkIDEwIGJ5dGVzLiAgT25seSA5IG1vcmUgYXJlIGF2YWlsYWJsZS4KKyAgLy8KKyAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCA5IGJ5dGVzLCBidXQgaXQgbWlnaHQgdGFrZSBtdWx0aXBsZSByZWFkCisgIC8vIGNhbGxzLCBzaW5jZSBpdCBpcyB2YWxpZCBmb3IgcmVhZCgpIHRvIHJldHVybiBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZC4KKyAgLy8gKE1vc3QgdHJhbnNwb3J0cyBkbyBpbW1lZGlhdGVseSByZXR1cm4gOSBieXRlcywgYnV0IHRoZSBmcmFtaW5nIHRyYW5zcG9ydHMKKyAgLy8gdGVuZCB0byBvbmx5IHJldHVybiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBpcyA2IGJ5dGVzIGluCisgIC8vIHRoaXMgY2FzZS4pCisgIHVpbnQzMl90IHRvdGFsX3JlYWQgPSAwOworICB3aGlsZSAodG90YWxfcmVhZCA8IDkpIHsKKyAgICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CisgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgICBCT09TVF9SRVFVSVJFX0dUKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkwKTsKKyAgICB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQ7CisgICAgQk9PU1RfUkVRVUlSRV9MRSh0b3RhbF9yZWFkLCAodWludDMyX3QpOSk7CisgIH0KKworICBCT09TVF9DSEVDS19FUVVBTCh0b3RhbF9yZWFkLCAodWludDMyX3QpOSk7CisKKyAgY2xlYXJfdHJpZ2dlcnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgordm9pZCB0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIEF0dGVtcGluZyB0byBib3Jyb3cgMTAgYnl0ZXMgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSBzaG91bGQgcmV0dXJuIE5VTEwKKyAgLy8gaW1tZWRpYXRlbHkuCisgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3cml0ZV9idWYsIDkpOworICB0cmFuc3BvcnRzLm91dC0+Zmx1c2goKTsKKyAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOworICB1aW50MzJfdCBib3Jyb3dfbGVuID0gMTA7CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkX2J1ZiA9IHRyYW5zcG9ydHMuaW4tPmJvcnJvdyhyZWFkX2J1ZiwgJmJvcnJvd19sZW4pOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgIEJPT1NUX0NIRUNLKGJvcnJvd2VkX2J1ZiA9PSBOVUxMKTsKKworICBjbGVhcl90cmlnZ2VycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Cit2b2lkIHRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIEF0dGVtcHRpbmcgdG8gcmVhZCB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHNob3VsZCBlaXRoZXIgYmxvY2sgdW50aWwKKyAgLy8gc29tZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgZmFpbCBpbW1lZGlhdGVseS4gIChlLmcuLCBUU29ja2V0IGJsb2NrcywKKyAgLy8gVE1lbW9yeUJ1ZmZlciBqdXN0IGZhaWxzLikKKyAgLy8KKyAgLy8gSWYgdGhlIHRyYW5zcG9ydCBibG9ja3MsIGl0IHNob3VsZCBzdWNjZWVkIG9uY2Ugc29tZSBkYXRhIGlzIGF2YWlsYWJsZSwKKyAgLy8gZXZlbiBpZiBsZXNzIHRoYW4gdGhlIGFtb3VudCByZXF1ZXN0ZWQgYmVjb21lcyBhdmFpbGFibGUuCisgIHNldF90cmlnZ2VyKDEsIHRyYW5zcG9ydHMub3V0LCAyKTsKKyAgYWRkX3RyaWdnZXIoMSwgdHJhbnNwb3J0cy5vdXQsIDgpOworICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMTApOworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOworICAgIGNsZWFyX3RyaWdnZXJzKCk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTEpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkyKTsKKyAgfQorCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSB7CisgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKworICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIEF0dGVtcHRpbmcgdG8gYm9ycm93IHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgc2hvdWxkIGZhaWwgaW1tZWRpYXRlbHkKKyAgc2V0X3RyaWdnZXIoMSwgdHJhbnNwb3J0cy5vdXQsIDEwKTsKKyAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOworICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3coTlVMTCwgJmJvcnJvd19sZW4pOworICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKworICBjbGVhcl90cmlnZ2VycygpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3QgY2FzZSBnZW5lcmF0aW9uCisgKgorICogUHJldHR5IHVnbHkgYW5kIGFubm95aW5nLiAgVGhpcyB3b3VsZCBiZSBtdWNoIGVhc2llciBpZiB3ZSB0aGUgdW5pdCB0ZXN0CisgKiBmcmFtZXdvcmsgZGlkbid0IGZvcmNlIGVhY2ggdGVzdCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uLgorICogLSBXcml0aW5nIGEgY29tcGxldGVseSBzZXBhcmF0ZSBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBlYWNoIG9mIHRoZXNlIHdvdWxkCisgKiAgIHJlc3VsdCBpbiBhIGxvdCBvZiByZXBldGl0aXZlIGJvaWxlcnBsYXRlIGNvZGUuCisgKiAtIENvbWJpbmluZyBtYW55IHRlc3RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8KKyAqICAgdGVsbCBwcmVjaXNlbHkgd2hpY2ggdGVzdHMgZmFpbGVkLiAgSXQgYWxzbyBtZWFucyB5b3UgY2FuJ3QgZ2V0IGEgcHJvZ3Jlc3MKKyAqICAgdXBkYXRlIGFmdGVyIGVhY2ggdGVzdCwgYW5kIHRoZSB0ZXN0cyBhcmUgYWxyZWFkeSBmYWlybHkgc2xvdy4KKyAqIC0gU2ltaWxhciByZWdpc3RyYXRpb24gY291bGQgYmUgYWNoaWV2ZWQgd2l0aCBCT09TVF9URVNUX0NBU0VfVEVNUExBVEUsCisgKiAgIGJ1dCBpdCByZXF1aXJlcyBhIGxvdCBvZiBhd2t3YXJkIE1QTCBjb2RlLCBhbmQgcmVzdWx0cyBpbiB1c2VsZXNzIHRlc3QKKyAqICAgY2FzZSBuYW1lcy4gIChUaGUgbmFtZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHN0ZDo6dHlwZV9pbmZvOjpuYW1lKCksIHdoaWNoCisgKiAgIGlzIGNvbXBpbGVyLWRlcGVuZGVudC4gIGdjYyByZXR1cm5zIG1hbmdsZWQgbmFtZXMuKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFERF9URVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RSVzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsKKworI2RlZmluZSBURVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFkZCB0aGUgdGVzdCBhcyBzcGVjaWZpZWQsIHRvIHRlc3QgdGhlIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqIEFsc28gdGVzdCB1c2luZyB0aGUgdHJhbnNwb3J0IGFzIGEgVFRyYW5zcG9ydCosIHRvIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqIHRoZSByZWFkX3ZpcnQoKS93cml0ZV92aXJ0KCkgY2FsbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRCdWZmZXJlZFRyYW5zcG9ydCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRGcmFtZWRUcmFuc3BvcnRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRabGliVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RCbG9ja2luZzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CisKKyNkZWZpbmUgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkVHJhbnNwb3J0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOworCitjbGFzcyBUcmFuc3BvcnRUZXN0R2VuIHsKK3B1YmxpYzoKKyAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwgZmxvYXQgc2l6ZU11bHRpcGxpZXIpCisgICAgOiBzdWl0ZV8oc3VpdGUpLCBzaXplTXVsdGlwbGllcl8oc2l6ZU11bHRpcGxpZXIpIHt9CisKKyAgdm9pZCBnZW5lcmF0ZSgpIHsKKyAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByYW5kNGsoMSwgNDA5Nik7CisKKyAgICAvKgorICAgICAqIFdlIGRvIHRoZSBiYXNpY2FsbHkgdGhlIHNhbWUgc2V0IG9mIHRlc3RzIGZvciBlYWNoIHRyYW5zcG9ydCB0eXBlLAorICAgICAqIGFsdGhvdWdoIHdlIHR3ZWFrIHRoZSBwYXJhbWV0ZXJzIGluIHNvbWUgcGxhY2VzLgorICAgICAqLworCisgICAgLy8gVE1lbW9yeUJ1ZmZlciB0ZXN0cworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkTWVtb3J5QnVmZmVycyk7CisKKyNpZm5kZWYgX1dJTjMyCisgICAgLy8gVEZEVHJhbnNwb3J0IHRlc3RzCisgICAgLy8gU2luY2UgQ291cGxlZEZEVHJhbnNwb3J0cyB0ZXN0cyB3aXRoIGEgcGlwZSwgd3JpdGVzIHdpbGwgYmxvY2sKKyAgICAvLyBpZiB0aGVyZSBpcyB0b28gbXVjaCBvdXRzdGFuZGluZyB1bnJlYWQgZGF0YSBpbiB0aGUgcGlwZS4KKyAgICB1aW50MzJfdCBmZF9tYXhfb3V0c3RhbmRpbmcgPSA0MDk2OworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDAsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworCisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisKKyAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGRFRyYW5zcG9ydHMpOworI2Vsc2UKKyAgICAvLyBUUGlwZSB0ZXN0cyAoV0lOMzIgb25seSkKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkUGlwZVRyYW5zcG9ydHMpOworI2VuZGlmIC8vX1dJTjMyCisKKyAgICAvLyBUU29ja2V0IHRlc3RzCisgICAgdWludDMyX3Qgc29ja2V0X21heF9vdXRzdGFuZGluZyA9IDQwOTY7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDAsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgLy8gRG9oLiAgQXBwYXJlbnRseSB3cml0aW5nIHRvIGEgc29ja2V0IGhhcyBzb21lIGFkZGl0aW9uYWwgb3ZlcmhlYWQgZm9yCisgICAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCisgICAgLy8gcmVxdWVzdHMsIGFkZGl0aW9uYWwgc2VuZCgpIGNhbGxzIHN0YXJ0IGJsb2NraW5nLgorICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsCisgICAgICAgICAgICAxMDI0ICogMjU2LAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMpOworCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCisgICAgLy8gVEZpbGVUcmFuc3BvcnQgdGVzdHMKKyAgICAvLyBXZSB1c2Ugc21hbGxlciBidWZmZXIgc2l6ZXMgaGVyZSwgc2luY2UgVEZpbGVUcmFuc3BvcnQgaXMgZmFpcmx5IHNsb3cuCisgICAgLy8KKyAgICAvLyBURmlsZVRyYW5zcG9ydCBjYW4ndCB3cml0ZSBtb3JlIHRoYW4gMTZNQiBhdCBvbmNlCisgICAgdWludDMyX3QgbWF4X3dyaXRlX2F0X29uY2UgPSAxMDI0ICogMTAyNCAqIDE2IC0gNDsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIG1heF93cml0ZV9hdF9vbmNlLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEyOCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGaWxlVHJhbnNwb3J0cyk7CisjZW5kaWYKKworICAgIC8vIEFkZCBzb21lIHRlc3RzIHRoYXQgYWNjZXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgIC8vIHZpYSBUVHJhbnNwb3J0IHBvaW50ZXJzIGFuZCBUQnVmZmVyQmFzZSBwb2ludGVycy4KKyAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cz4sCisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKKyAgICBBRERfVEVTVF9SVyhDb3VwbGVkQnVmZmVyQmFzZXM8Q291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cz4sCisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKKyAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEZyYW1lZFRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CisgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOworCisgICAgLy8gVGVzdCB1c2luZyBUWmxpYlRyYW5zcG9ydCB2aWEgYSBUVHJhbnNwb3J0IHBvaW50ZXIKKyAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFpsaWJUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOworICB9CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCisjZGVmaW5lIE1BS0VfVEVTVF9DQVNFKF9GVU5DLCBfTkFNRSkgYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoX0ZVTkMsIF9OQU1FLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQorI2RlZmluZSBNQUtFX1RFU1RfQ0FTRShfRlVOQywgX05BTUUpIGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKF9GVU5DLCBfTkFNRSkKKyNlbmRpZgorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+CisgIHZvaWQgYWRkVGVzdFJXKGNvbnN0IGNoYXIqIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd0NodW5rU2l6ZUdlbiA9IDAsCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJDaHVua1NpemVHZW4gPSAwLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhPdXRzdGFuZGluZyA9IDAsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkRmFpbHVyZXMgPSAwKSB7CisgICAgLy8gYWRqdXN0IHRvdGFsU2l6ZSBieSB0aGUgc3BlY2lmaWVkIHNpemVNdWx0aXBsaWVyXyBmaXJzdAorICAgIHRvdGFsU2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0b3RhbFNpemUgKiBzaXplTXVsdGlwbGllcl8pOworCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG5hbWU7CisgICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwgd1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiCisgICAgICAgICA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgd0NodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIKKyAgICAgICAgIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IG1heE91dHN0YW5kaW5nIDw8ICIpIjsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYworI2Vsc2UKKyAgICBib29zdDo6dW5pdF90ZXN0OjpjYWxsYmFjazA8PiB0ZXN0X2Z1bmMKKyNlbmRpZgorICAgICAgICA9IHN0ZDo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclNpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q2h1bmtTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckNodW5rU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE91dHN0YW5kaW5nKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2Z1bmMsIG5hbWUuc3RyKCkpLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KKyAgdm9pZCBhZGRUZXN0QmxvY2tpbmcoY29uc3QgY2hhciogdHJhbnNwb3J0TmFtZSwgdWludDMyX3QgZXhwZWN0ZWRGYWlsdXJlcyA9IDApIHsKKyAgICBjaGFyIG5hbWVbMTAyNF07CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOworCisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOworCisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOworCisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgfQorCisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlXzsKKyAgLy8gc2l6ZU11bHRpcGxpZXJfIGlzIGNvbmZpZ3VyYWJsZSB2aWEgdGhlIGNvbW1hbmQgbGluZSwgYW5kIGFsbG93cyB0aGUKKyAgLy8gdXNlciB0byBhZGp1c3QgYmV0d2VlbiBzbWFsbGVyIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgdGVzdGVkIHF1aWNrbHksCisgIC8vIG9yIGxhcmdlciBidWZmZXJzIHRoYXQgbW9yZSB0aG9yb3VnaGx5IGV4ZXJjaXNlIHRoZSBjb2RlLCBidXQgdGFrZQorICAvLyBsb25nZXIuCisgIGZsb2F0IHNpemVNdWx0aXBsaWVyXzsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBJbml0aWFsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgeworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKKyAgZ2xvYmFsX2ZpeHR1cmUoKSB7CisjaWYgX1dJTjMyCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OworICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOworCisgICAgYWxhcm1UaHJlYWRfID0gZmFjdG9yeS5uZXdUaHJlYWQoCisgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6RnVuY3Rpb25SdW5uZXI6OmNyZWF0ZShhbGFybV9oYW5kbGVyX3dyYXBwZXIpKTsKKyAgICBhbGFybVRocmVhZF8tPnN0YXJ0KCk7CisgIH0KKyAgfmdsb2JhbF9maXh0dXJlKCkgeworICAgIHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICAgIGdfdGVhcmRvd24gPSB0cnVlOworICAgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOworICAgIH0KKyAgICBhbGFybVRocmVhZF8tPmpvaW4oKTsKKyAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShnbG9iYWxfZml4dHVyZSkKKyNlbmRpZgorCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKKyAgaW50IHNlZWQgPSB0di50dl9zZWMgXiB0di50dl91c2VjOworCisgIGluaXRyYW5kKHNlZWQpOworCisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgTlVMTCk7CisgIGludCBzZWVkID0gdHYudHZfc2VjIF4gdHYudHZfdXNlYzsKKworICBpbml0cmFuZChzZWVkKTsKKworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiVHJhbnNwb3J0VGVzdCI7CisgIFRyYW5zcG9ydFRlc3RHZW4gdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yKHN1aXRlLCAxKTsKKyAgdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yLmdlbmVyYXRlKCk7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU5MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKworI2luY2x1ZGUgImdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCIKKworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8aW50MzJfdCwgdGhyaWZ0Ojp0ZXN0OjpNeUludDMyPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKGJvb3N0Ojppc19zYW1lPHN0ZDo6c3RyaW5nLCB0aHJpZnQ6OnRlc3Q6Ok15U3RyaW5nPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoCisgICAgKGJvb3N0Ojppc19zYW1lPHRocmlmdDo6dGVzdDo6VHlwZWRlZlRlc3RTdHJ1Y3QsIHRocmlmdDo6dGVzdDo6TXlTdHJ1Y3Q+Ojp2YWx1ZSkpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1VuaXRUZXN0TWFpbi5jcHAgYi9saWIvY3BwL3Rlc3QvVW5pdFRlc3RNYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVmMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1VuaXRUZXN0TWFpbi5jcHAKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIHRocmlmdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyNjgxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxNzAwKQorLy8gcG9seW5vbWlhbCBhbmQgc3RkOjpmaWxsX3Qgd2FybmluZyBoYXBwZW5zIGluIE1TVkMgMjAxMCwgMjAxMywgbWF5YmUgb3RoZXJzCisvLyBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYy9ib29zdC90aWNrZXQvMTE0MjYKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfYXJyYXkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK2Jvb3N0OjptdDE5OTM3IHJuZzsKKworLyoKKyAqIFV0aWxpdHkgY29kZQorICovCisKK2NsYXNzIFNpemVHZW5lcmF0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpID0gMDsKK307CisKK2NsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVuc2lnbmVkIGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldFNpemUoKSB7IHJldHVybiB2YWx1ZV87IH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgaW50IHZhbHVlXzsKK307CisKK2NsYXNzIExvZ05vcm1hbFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIExvZ05vcm1hbFNpemVHZW5lcmF0b3IoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KQorICAgIDogZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAvLyBMb29wIHVudGlsIHdlIGdldCBhIHNpemUgb2YgMSBvciBtb3JlCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2VuXygpKTsKKyAgICAgIGlmICh2YWx1ZSA+PSAxKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+ID4gZ2VuXzsKK307CisKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX3VuaWZvcm1fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4sIHVpbnQ4X3QgYykgeworICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKKyAgbWVtc2V0KGJ1ZiwgYywgYnVmX2xlbik7CisgIHJldHVybiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KGJ1Zik7Cit9CisKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgeworICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKKworICAvLyBHZW5lcmF0ZSBzbWFsbCBydW5zIG9mIGFsdGVybmF0ZWx5IGluY3JlYXNpbmcgYW5kIGRlY3JlYXNpbmcgYnl0ZXMKKyAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+IHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKDEsIDY0KTsKKyAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gYnl0ZV9kaXN0cmlidXRpb24oMCwgVUlOVDhfTUFYKTsKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50OF90PiA+CisgICAgICBieXRlX2dlbmVyYXRvcihybmcsIGJ5dGVfZGlzdHJpYnV0aW9uKTsKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gPgorICAgICAgcnVuX2xlbl9nZW5lcmF0b3Iocm5nLCBydW5fbGVuZ3RoX2Rpc3RyaWJ1dGlvbik7CisKKyAgdWludDMyX3QgaWR4ID0gMDsKKyAgaW50OF90IHN0ZXAgPSAxOworICB3aGlsZSAoaWR4IDwgYnVmX2xlbikgeworICAgIHVpbnQzMl90IHJ1bl9sZW5ndGggPSBydW5fbGVuX2dlbmVyYXRvcigpOworICAgIGlmIChpZHggKyBydW5fbGVuZ3RoID4gYnVmX2xlbikgeworICAgICAgcnVuX2xlbmd0aCA9IGJ1Zl9sZW4gLSBpZHg7CisgICAgfQorCisgICAgdWludDhfdCBieXRlID0gYnl0ZV9nZW5lcmF0b3IoKTsKKyAgICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgcnVuX2xlbmd0aDsgKytuKSB7CisgICAgICBidWZbaWR4XSA9IGJ5dGU7CisgICAgICArK2lkeDsKKyAgICAgIGJ5dGUgKz0gc3RlcDsKKyAgICB9CisKKyAgICBzdGVwICo9IC0xOworICB9CisKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKK30KKworYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fcmFuZG9tX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7CisgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOworCisgIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+IGRpc3RyaWJ1dGlvbigwLCBVSU5UOF9NQVgpOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGdlbmVyYXRvcihybmcsIGRpc3RyaWJ1dGlvbik7CisKKyAgZm9yICh1aW50MzJfdCBuID0gMDsgbiA8IGJ1Zl9sZW47ICsrbikgeworICAgIGJ1ZltuXSA9IGdlbmVyYXRvcigpOworICB9CisKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKK30KKworLyoKKyAqIFRlc3QgZnVuY3Rpb25zCisgKi8KKwordm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOworCisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKKyAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOworICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOworfQorCit2b2lkIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKKyAgLy8gVGhpcyBvbmUgaXMgdHJpY2t5LiAgSSBzZXBhcmF0ZSB0aGUgbGFzdCBieXRlIG9mIHRoZSBzdHJlYW0gb3V0CisgIC8vIGludG8gYSBzZXBhcmF0ZSBjcmJ1Zl8uICBUaGUgbGFzdCBieXRlIGlzIHBhcnQgb2YgdGhlIGNoZWNrc3VtLAorICAvLyBzbyB0aGUgZW50aXJlIHJlYWQgZ29lcyBmaW5lLCBidXQgd2hlbiBJIGdvIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0KKyAgLy8gaXQgaXNuJ3QgdGhlcmUuICBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gY29tcGxhaW5lZCB0aGF0CisgIC8vIHRoZSBzdHJlYW0gd2FzIG5vdCBjb21wbGV0ZS4gIEknbSBhYm91dCB0byBnbyBmaXggdGhhdC4KKyAgLy8gSXQgd29ya2VkLiAgQXdlc29tZS4KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT5maW5pc2goKTsKKyAgc3RyaW5nIHRtcF9idWY7CisgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CisgIHpsaWJfdHJhbnMucmVzZXQobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFpsaWJUcmFuc3BvcnQ6OkRFRkFVTFRfVVJCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkgLSAxKSkpOworCisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKKyAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOworICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOworfQorCit2b2lkIHRlc3RfaW5jb21wbGV0ZV9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgeworICAvLyBNYWtlIHN1cmUgd2Ugc3RpbGwgZ2V0IHRoYXQgIm5vdCBjb21wbGV0ZSIgZXJyb3IgaWYKKyAgLy8gaXQgcmVhbGx5IGlzbid0IGNvbXBsZXRlLgorICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOworICBzdHJpbmcgdG1wX2J1ZjsKKyAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKKyAgdG1wX2J1Zi5lcmFzZSh0bXBfYnVmLmxlbmd0aCgpIC0gMSk7CisgIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSkpOworCisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKKyAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOworICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOworICB0cnkgeworICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CisgICAgQk9PU1RfRVJST1IoInZlcmlmeUNoZWNrc3VtKCkgZGlkIG5vdCByZXBvcnQgYW4gZXJyb3IiKTsKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcmVhZF93cml0ZV9taXgoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKKyAgLy8gVHJ5IGl0IHdpdGggYSBtaXggb2YgcmVhZC93cml0ZSBzaXplcy4KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICB1bnNpZ25lZCBpbnQgdG90OworCisgIHRvdCA9IDA7CisgIHdoaWxlICh0b3QgPCBidWZfbGVuKSB7CisgICAgdWludDMyX3Qgd3JpdGVfbGVuID0gd3JpdGVfZ2VuLT5nZXRTaXplKCk7CisgICAgaWYgKHRvdCArIHdyaXRlX2xlbiA+IGJ1Zl9sZW4pIHsKKyAgICAgIHdyaXRlX2xlbiA9IGJ1Zl9sZW4gLSB0b3Q7CisgICAgfQorICAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSArIHRvdCwgd3JpdGVfbGVuKTsKKyAgICB0b3QgKz0gd3JpdGVfbGVuOworICB9CisKKyAgemxpYl90cmFucy0+ZmluaXNoKCk7CisKKyAgdG90ID0gMDsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOworICB3aGlsZSAodG90IDwgYnVmX2xlbikgeworICAgIHVpbnQzMl90IHJlYWRfbGVuID0gcmVhZF9nZW4tPmdldFNpemUoKTsKKyAgICB1aW50MzJfdCBleHBlY3RlZF9yZWFkX2xlbiA9IHJlYWRfbGVuOworICAgIGlmICh0b3QgKyByZWFkX2xlbiA+IGJ1Zl9sZW4pIHsKKyAgICAgIGV4cGVjdGVkX3JlYWRfbGVuID0gYnVmX2xlbiAtIHRvdDsKKyAgICB9CisgICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZChtaXJyb3IuZ2V0KCkgKyB0b3QsIHJlYWRfbGVuKTsKKyAgICBCT09TVF9SRVFVSVJFX0xFKGdvdCwgZXhwZWN0ZWRfcmVhZF9sZW4pOworICAgIEJPT1NUX1JFUVVJUkVfTkUoZ290LCAodWludDMyX3QpMCk7CisgICAgdG90ICs9IGdvdDsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOworICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOworfQorCit2b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgeworICAvLyBWZXJpZnkgY2hlY2tzdW0gY2hlY2tpbmcuCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKKyAgemxpYl90cmFucy0+ZmluaXNoKCk7CisgIHN0cmluZyB0bXBfYnVmOworICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOworICAvLyBNb2RpZnkgYSBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAocGFydCBvZiB0aGUgY2hlY2tzdW0pLgorICAvLyBPbiByYXJlIG9jY2FzaW9ucywgbW9kaWZ5aW5nIGEgYnl0ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBidWZmZXIKKyAgLy8gaXNuJ3QgY2F1Z2h0IGJ5IHRoZSBjaGVja3N1bS4KKyAgLy8KKyAgLy8gKFRoaXMgaGFwcGVucyBlc3BlY2lhbGx5IG9mdGVuIGZvciB0aGUgdW5pZm9ybSBidWZmZXIuICBUaGUKKyAgLy8gcmUtaW5mbGF0ZWQgZGF0YSBpcyBjb3JyZWN0LCBob3dldmVyLiAgSSBzdXNwZWN0IGluIHRoaXMgY2FzZSB0aGF0CisgIC8vIHdlJ3JlIG1vcmUgbGlrZWx5IHRvIG1vZGlmeSBieXRlcyB0aGF0IGFyZSBwYXJ0IG9mIHpsaWIgbWV0YWRhdGEKKyAgLy8gaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YS4pCisgIC8vCisgIC8vIEkndmUgYWxzbyBzZWVuIHNvbWUgZmFpbHVyZSBzY2VuYXJpb3Mgd2hlcmUgYSBjaGVja3N1bSBmYWlsdXJlIGlzbid0CisgIC8vIHJlcG9ydGVkLCBidXQgemxpYiBrZWVwcyB0cnlpbmcgdG8gZGVjb2RlIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGF0YS4KKyAgLy8gKFdoZW4gdGhpcyBvY2N1cnMsIHZlcmlmeUNoZWNrc3VtKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nCisgIC8vIHRoYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBoYXNuJ3QgYmVlbiByZWFjaGVkLikgIEkgaGF2ZW4ndCBzZWVuIHRoaXMKKyAgLy8gZXJyb3Igd2hlbiBvbmx5IG1vZGlmeWluZyBjaGVja3N1bSBieXRlcy4KKyAgaW50IGluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pih0bXBfYnVmLnNpemUoKSAtIDEpOworICB0bXBfYnVmW2luZGV4XSsrOworICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkpKTsKKworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CisgIHRyeSB7CisgICAgemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOworICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CisgICAgQk9PU1RfRVJST1IoInZlcmlmeUNoZWNrc3VtKCkgZGlkIG5vdCByZXBvcnQgYW4gZXJyb3IiKTsKKyAgfSBjYXRjaCAoVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXguZ2V0VHlwZSgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7CisgIH0KK30KKwordm9pZCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIC8vIHdyaXRlIHNvbWUgZGF0YQorICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CisKKyAgLy8gY2FsbCBmaW5pc2goKQorICB6bGliX3RyYW5zLT5maW5pc2goKTsKKworICAvLyBtYWtlIHN1cmUgd3JpdGUoKSB0aHJvd3MgYW4gZXJyb3IKKyAgdHJ5IHsKKyAgICB1aW50OF90IHdyaXRlX2J1ZltdID0gImEiOworICAgIHpsaWJfdHJhbnMtPndyaXRlKHdyaXRlX2J1ZiwgMSk7CisgICAgQk9PU1RfRVJST1IoIndyaXRlKCkgYWZ0ZXIgZmluaXNoKCkgZGlkIG5vdCByYWlzZSBhbiBleGNlcHRpb24iKTsKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKyAgfQorCisgIC8vIG1ha2Ugc3VyZSBmbHVzaCgpIHRocm93cyBhbiBlcnJvcgorICB0cnkgeworICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7CisgICAgQk9PU1RfRVJST1IoImZsdXNoKCkgYWZ0ZXIgZmluaXNoKCkgZGlkIG5vdCByYWlzZSBhbiBleGNlcHRpb24iKTsKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKyAgfQorCisgIC8vIG1ha2Ugc3VyZSBmaW5pc2goKSB0aHJvd3MgYW4gZXJyb3IKKyAgdHJ5IHsKKyAgICB6bGliX3RyYW5zLT5maW5pc2goKTsKKyAgICBCT09TVF9FUlJPUigiZmluaXNoKCkgYWZ0ZXIgZmluaXNoKCkgZGlkIG5vdCByYWlzZSBhbiBleGNlcHRpb24iKTsKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfbm9fd3JpdGUoKSB7CisgIC8vIFZlcmlmeSB0aGF0IG5vIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgd2UKKyAgLy8gbmV2ZXIgd3JpdGUgZGF0YSB0byB0aGUgVFpsaWJUcmFuc3BvcnQuCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICB7CisgICAgLy8gQ3JlYXRlIGEgVFpsaWJUcmFuc3BvcnQgb2JqZWN0LCBhbmQgaW1tZWRpYXRlbHkgZGVzdHJveSBpdAorICAgIC8vIHdoZW4gaXQgZ29lcyBvdXQgb2Ygc2NvcGUuCisgICAgVFpsaWJUcmFuc3BvcnQgd196bGliX3RyYW5zKG1lbWJ1Zik7CisgIH0KKworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYtPmF2YWlsYWJsZV9yZWFkKCksICh1aW50MzJfdCkwKTsKK30KKwordm9pZCB0ZXN0X2dldF91bmRlcmx5aW5nX3RyYW5zcG9ydCgpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYuZ2V0KCksIHpsaWJfdHJhbnMtPmdldFVuZGVybHlpbmdUcmFuc3BvcnQoKS5nZXQoKSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXphdGlvbgorICovCisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCisjZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIF9GVU5DLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjpzdGQ6OmJpbmQoX0ZVTkMsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lX3NzLnN0cigpLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgXAorICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgX0ZVTkMsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShfRlVOQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKDo6c3RkOjpiaW5kKF9GVU5DLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjX19WQV9BUkdTX18pLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9zcy5zdHIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKK3ZvaWQgYWRkX3Rlc3RzKGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlLAorICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiYgYnVmLAorICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2xlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF93cml0ZV90aGVuX3JlYWQsIGJ1ZiwgYnVmX2xlbik7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0sIGJ1ZiwgYnVmX2xlbik7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3RfaW5jb21wbGV0ZV9jaGVja3N1bSwgYnVmLCBidWZfbGVuKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF9pbnZhbGlkX2NoZWNrc3VtLCBidWYsIGJ1Zl9sZW4pOworICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoLCBidWYsIGJ1Zl9sZW4pOworCisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV8zMmsobmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigxIDw8IDE1KSk7CisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV9sb2dub3JtYWwobmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1jb25zdGFudCIsIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwgc2l6ZV8zMmssIHNpemVfMzJrKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXdyaXRlIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLAorICAgICAgICAgICAgICAgIHNpemVfMzJrKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXJlYWQiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV8zMmssCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwpOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtYm90aCIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCwKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCk7CisKKyAgLy8gVGVzdCB3aXRoIGEgcmFuZG9tIHNpemUgZGlzdHJpYnV0aW9uLAorICAvLyBidXQgdXNlIHRoZSBleGFjdCBzYW1lIGRpc3RyaWJ1dGlvbiBmb3IgcmVhZGluZyBhcyBmb3Igd3JpdGluZy4KKyAgLy8KKyAgLy8gQmVjYXVzZSB0aGUgU2l6ZUdlbmVyYXRvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLAorICAvLyBib3RoIFNpemVHZW5lcmF0b3JzIHNob3VsZCByZXR1cm4gdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHZhbHVlcywgc2luY2UgdGhleQorICAvLyBib3RoIHN0YXJ0IHdpdGggcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIHRoZSBzYW1lIHN0YXRlLgorICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHJlYWRfc2l6ZV9nZW4obmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1zYW1lLWRpc3RyaWJ1dGlvbiIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICB3cml0ZV9zaXplX2dlbiwKKyAgICAgICAgICAgICAgICByZWFkX3NpemVfZ2VuKTsKK30KKwordm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgeworICBmcHJpbnRmKGYsICJVc2FnZTogJXMgW2Jvb3N0X29wdGlvbnNdIFtvcHRpb25zXVxuIiwgYXJndjApOworICBmcHJpbnRmKGYsICJPcHRpb25zOlxuIik7CisgIGZwcmludGYoZiwgIiAgLS1zZWVkPTxOPiwgLXMgPE4+XG4iKTsKKyAgZnByaW50ZihmLCAiICAtLWhlbHBcbiIpOworfQorCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X25vX3dyaXRlKSk7CisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfZ2V0X3VuZGVybHlpbmdfdHJhbnNwb3J0KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIHVpbnQzMl90IHNlZWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGltZShOVUxMKSk7CisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisgIHByaW50Zigic2VlZDogJSIgUFJJdTMyICJcbiIsIHNlZWQpOworI2VuZGlmCisgIHJuZy5zZWVkKHNlZWQpOworCisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJabGliVGVzdCI7CisKKyAgdWludDMyX3QgYnVmX2xlbiA9IDEwMjQgKiAzMjsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fdW5pZm9ybV9idWZmZXIoYnVmX2xlbiwgJ2EnKSwgYnVmX2xlbiwgInVuaWZvcm0iKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fY29tcHJlc3NpYmxlX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgImNvbXByZXNzaWJsZSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9yYW5kb21fYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAicmFuZG9tIik7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9ub193cml0ZSkpOworCisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIGxpbmtlZCBpbnRvIHRoZSBVbml0VGVzdHMgdGVzdCBleGVjdXRhYmxlCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdHJ1Y3QgTEZBVAoreworICBMRkFUKCkKKyAgICA6IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUikKKyAgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXgsIDApKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBwdGhyZWFkX2NvbmRfaW5pdCgmY3YsIDApKTsKKyAgfQorCisgIE11dGV4IHV1dDsKKyAgcHRocmVhZF9tdXRleF90IG14OworICBwdGhyZWFkX2NvbmRfdCBjdjsKK307CisKKy8vIEhlbHBlciBmb3IgdGVzdGluZyBtdXRleCBiZWhhdmlvciB3aGVuIGxvY2tlZCBieSBhbm90aGVyIHRocmVhZAordm9pZCAqIGxvY2tGcm9tQW5vdGhlclRocmVhZCh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBMRkFUICpsZmF0ID0gKExGQVQgKilwdHI7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfbG9jaygmbGZhdC0+bXgpKTsgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHdpdGggdGVzdGluZyB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LT5jdikpOyAgICAgICAgICAvLyB0ZWxsIHRlc3RpbmcgdGhyZWFkIHdlIGhhdmUgbG9ja2VkIHRoZSBtdXRleAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC0+Y3YsICZsZmF0LT5teCkpOyAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byBzaWduYWwgY29uZGl0aW9uIHZhcmlhYmxlIHRlbGxpbmcgdXMgdG8gdW5sb2NrCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LT51dXQudW5sb2NrKCkpOworICByZXR1cm4gcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0aW5nIHRocmVhZCBzaG91bGQgam9pbiB0byBlbnN1cmUgY29tcGxldGVuZXNzCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShNdXRleFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGhhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZCB0byB0ZXN0IHVubG9ja2luZyB0d2ljZSB3aXRob3V0IHVuZGVmaW5lZCBiZWhhdmlvcgorCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIHV1dC5sb2NrKCksIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKTsgICAgICAgLy8gRURFQURMSyAodGhpcyB0aHJlYWQgb3ducyBpdCkKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHJlY3Vyc2l2ZV9oYXBweV9wYXRoKQoreworICBNdXRleCB1dXQoTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUik7CisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodHJ5bG9jaykKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUik7ICAgLy8ganVzdCB1c2luZyBhbm90aGVyIGluaXRpYWxpemVyIGZvciBjb3ZlcmFnZQorCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQudHJ5bG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIXV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGltZWRsb2NrKQoreworICBwdGhyZWFkX3QgdGg7CisgIHN0cnVjdCBMRkFUIGxmYXQ7CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAgICAgICAgICAgICAvLyBFREVBRExLIChjdXJyZW50IHRocmVhZCBvd25zIG11dGV4IC0gbG9naWMgZXJyb3IpCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LnV1dC51bmxvY2soKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0Lm14KSk7ICAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCBoZWxwZXIgdGhyZWFkCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY3JlYXRlKCZ0aCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrRnJvbUFub3RoZXJUaHJlYWQsICZsZmF0KSk7ICAgICAgICAgLy8gY3JlYXRlIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3dhaXQoJmxmYXQuY3YsICZsZmF0Lm14KSk7ICAgLy8gd2FpdCBmb3IgaGVscGVyIHRocmVhZCB0byBsb2NrIG11dGV4CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIWxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsgICAgICAgICAgICAgICAgICAgLy8gZmFsc2U6IGFub3RoZXIgdGhyZWFkIG93bnMgdGhlIGxvY2sKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LmN2KSk7ICAgICAgICAgICAvLyB0ZWxsIGhlbHBlciB0aHJlYWQgd2UgYXJlIGRvbmUKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF91bmxvY2soJmxmYXQubXgpKTsgICAgICAgICAgLy8gbGV0IGhlbHBlciB0aHJlYWQgY2xlYW4gdXAKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9qb2luKHRoLCAwKSk7ICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGVzdGluZyB0aHJlYWQgdG8gdW5sb2NrIGFuZCBiZSBkb25lCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHVuZGVybHlpbmcpCit7CisgIE11dGV4IHV1dDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggdXV0LmdldFVuZGVybHlpbmdJbXBsKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWEyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUgeworcHJvdGVjdGVkOgorICBMb2NrZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKKyAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgc3RhcnRlZF8gPSB0cnVlOworICAgIGlmICh3cml0ZXJfKSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKKyAgICB9CisgICAgZ290TG9ja18gPSB0cnVlOworICAgIHdoaWxlICghc2lnbmFsZWRfKSB7CisgICAgICB1c2xlZXAoNTAwMCk7CisgICAgfQorICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKKyAgfQorCisgIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9CisgIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9CisgIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrXzsKKyAgYm9vbCB3cml0ZXJfOworICB2b2xhdGlsZSBib29sIHN0YXJ0ZWRfOworICB2b2xhdGlsZSBib29sIGdvdExvY2tfOworICB2b2xhdGlsZSBib29sIHNpZ25hbGVkXzsKK307CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBMb2NrZXIgeworcHVibGljOgorICBSZWFkZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7fQorfTsKKworY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFdyaXRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KK307CisKK3ZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAorICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQorICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KKyAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKKyAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKG5ldyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkpOworCisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8V3JpdGVyPiB3cml0ZXIobmV3IFdyaXRlcihyd2xvY2spKTsKKworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0d3JpdGVyID0gZmFjdG9yeS5uZXdUaHJlYWQod3JpdGVyKTsKKworICAvLyBsYXVuY2ggYSByZWFkZXIgYW5kIG1ha2Ugc3VyZSBoZSBoYXMgdGhlIGxvY2sKKyAgdHJlYWRlcjEtPnN0YXJ0KCk7CisgIHdoaWxlICghcmVhZGVyMS0+Z290TG9jaygpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisKKyAgLy8gbGF1bmNoIGEgd3JpdGVyIGFuZCBtYWtlIHN1cmUgaGUncyBibG9ja2VkIG9uIHRoZSBsb2NrCisgIHR3cml0ZXItPnN0YXJ0KCk7CisgIHdoaWxlICghd3JpdGVyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gdHJpY2t5IHBhcnQuLi4gd2UgY2FuIG5ldmVyIGJlIDEwMCUgc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgYWN0dWFsbHkKKyAgLy8gYmxvY2tlZCBvbiB0aGUgbG9jaywgYnV0IHdlIGNhbiBwcmV0dHkgcmVhc29uYWJseSBzdXJlIGJlY2F1c2Ugd2Uga25vdworICAvLyBoZSBqdXN0IGV4ZWN1dGVkIHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrLCBhbmQKKyAgLy8gd2UnbGwgd2FpdCBhIGZ1bGwgc2Vjb25kIGZvciBoaW0gdG8gZ2V0IG9uIGl0LgorICBzbGVlcCgxKTsKKworICAvLyBsYXVuY2ggYSBzZWNvbmQgcmVhZGVyLi4uIGlmIHRoZSBSV011dGV4IGd1YXJhbnRlZXMgdGhhdCB3cml0ZXJzIHdvbid0CisgIC8vIHN0YXJ2ZSwgdGhpcyByZWFkZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgdW50aWwgdGhlIHdyaXRlcgorICAvLyBoYXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGl0LgorICB0cmVhZGVyMi0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gYWdhaW4uLi4gY2FuJ3QgYmUgMTAwJSBzdXJlIHRoZSByZWFkZXIgaXMgd2FpdGluZyBvbiAob3IgaGFzKSB0aGUgbG9jaworICAvLyBidXQgd2UgY2FuIGJlIGNsb3NlLgorICBzbGVlcCgxKTsKKworICAvLyB0ZWxsIHJlYWRlciAxIHRvIGxldCBnbyBvZiB0aGUgbG9jaworICByZWFkZXIxLT5zaWduYWwoKTsKKworICAvLyB3YWl0IGZvciBzb21lb25lIHRvIGdldCB0aGUgbG9jaworICB3aGlsZSAoIXJlYWRlcjItPmdvdExvY2soKSAmJiAhd3JpdGVyLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyB0aGUgdGVzdCBzdWNjZWVkZWQgaWYgdGhlIFdSSVRFUiBnb3QgdGhlIGxvY2suCisgIGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Z290TG9jaygpOworCisgIC8vIHRlbGwgZXZlcnlvbmUgd2UncmUgZG9uZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2gKKyAgcmVhZGVyMi0+c2lnbmFsKCk7CisgIHdyaXRlci0+c2lnbmFsKCk7CisgIHRyZWFkZXIxLT5qb2luKCk7CisgIHRyZWFkZXIyLT5qb2luKCk7CisgIHR3cml0ZXItPmpvaW4oKTsKKworICAvLyBtYWtlIHN1cmUgaXQgd29ya2VkLgorICBCT09TVF9DSEVDS19NRVNTQUdFKHN1Y2Nlc3MsICJ3cml0ZXIgaXMgc3RhcnZpbmciKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJXTXV0ZXhTdGFydmVUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9vdGhlcikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfcnIpIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX2ZpZm8pIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBiYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIlRocmVhZEZhY3RvcnlUZXN0cy5oIgorI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCisjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCisKKy8vIFRoZSB0ZXN0IHdlaWdodCwgd2hlcmUgMTAgaXMgMTAgdGltZXMgbW9yZSB0aHJlYWRzIHRoYW4gYmFzZWxpbmUKKy8vIGFuZCB0aGUgYmFzZWxpbmUgaXMgb3B0aW1pemVkIGZvciBydW5uaW5nIGluIHZhbGdyaW5kCitzdGF0aWMgaW50IFdFSUdIVCA9IDEwOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKworICBzdGQ6OnN0cmluZyBhcmc7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoYXJnYyAtIDEgPiAxID8gYXJnYyAtIDEgOiAxKTsKKworICBhcmdzWzBdID0gImFsbCI7CisKKyAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKKyAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7CisgIH0KKworICBpZiAoZ2V0ZW52KCJWQUxHUklORCIpICE9IDApIHsKKwkgIC8vIGxvd2VyIHRoZSBzY2FsZSBvZiBldmVyeSB0ZXN0CisJICBXRUlHSFQgPSAxOworICB9CisKKyAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgeworCisgICAgVGhyZWFkRmFjdG9yeVRlc3RzIHRocmVhZEZhY3RvcnlUZXN0czsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgaW50IHJlYXBMb29wcyA9IDIgKiBXRUlHSFQ7CisgICAgaW50IHJlYXBDb3VudCA9IDEwMCAqIFdFSUdIVDsKKyAgICBzaXplX3QgZmxvb2RMb29wcyA9IDM7CisgICAgc2l6ZV90IGZsb29kQ291bnQgPSA1MDAgKiBXRUlHSFQ7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IHJlYXBMb29wcyA8PCAieCIgPDwgcmVhcENvdW50IDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnJlYXBOVGhyZWFkcyhyZWFwTG9vcHMsIHJlYXBDb3VudCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgZmxvb2RMb29wcyA8PCAieCIgPDwgZmxvb2RDb3VudCA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHR0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBtb25pdG9yIHRpbWVvdXQgdGVzdCIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMubW9uaXRvclRpbWVvdXRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ1dGlsIikgPT0gMCkgeworCisgICAgc3RkOjpjb3V0IDw8ICJVdGlsIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRVdGlsIG1pbmltdW0gdGltZSIgPDwgc3RkOjplbmRsOworCisgICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0TWluaW11bSB0aW1lOiAiIDw8IHRpbWUwMSAtIHRpbWUwMCA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgdGltZTAxID0gdGltZTAwOworICAgIHNpemVfdCBjb3VudCA9IDA7CisKKyAgICB3aGlsZSAodGltZTAxIDwgdGltZTAwICsgMTApIHsKKyAgICAgIGNvdW50Kys7CisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0c2NhbGwgcGVyIG1zOiAiIDw8IGNvdW50IC8gKHRpbWUwMSAtIHRpbWUwMCkgPDwgc3RkOjplbmRsOworICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRpbWVyLW1hbmFnZXIiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRpbWVyTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGltZXJNYW5hZ2VyIHRlc3QwMCIgPDwgc3RkOjplbmRsOworCisgICAgVGltZXJNYW5hZ2VyVGVzdHMgdGltZXJNYW5hZ2VyVGVzdHM7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAxIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAyIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMygpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDA0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwNCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXIiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZE1hbmFnZXIgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwICogV0VJR0hUOworICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMCAqIFdFSUdIVDsKKyAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOworCisgICAgICBUaHJlYWRNYW5hZ2VyVGVzdHMgdGhyZWFkTWFuYWdlclRlc3RzOworCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaSB0ZXN0OiIgPDwgc3RkOjplbmRsOworCisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5hcGlUZXN0KCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBhcGlUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9ja1Rlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlci1iZW5jaG1hcmsiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZE1hbmFnZXIgYmVuY2htYXJrIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB7CisKKyAgICAgIHNpemVfdCBtaW5Xb3JrZXJDb3VudCA9IDI7CisKKyAgICAgIHNpemVfdCBtYXhXb3JrZXJDb3VudCA9IDg7CisKKyAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMCAqIFdFSUdIVDsKKworICAgICAgaW50NjRfdCBkZWxheSA9IDVMTDsKKworICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPD0gbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKKworICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKKworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50CisgICAgICAgICAgICAgICAgICA8PCAiIHRhc2sgY291bnQ6ICIgPDwgdGFza0NvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworCisgICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CisKKyAgICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0ZDo6Y291dCA8PCAiQUxMIFRFU1RTIFBBU1NFRCIgPDwgc3RkOjplbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk4NTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSB0ZXN0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworLyoqCisgKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaHJlYWRGYWN0b3J5VGVzdHMgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBSZWFwIE4gdGhyZWFkcworICAgKi8KKyAgY2xhc3MgUmVhcE5UYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChhY3RpdmVDb3VudCkge30KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgCisgICAgICBpZiAoLS1fY291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICBpbnQmIF9jb3VudDsKKyAgfTsKKworICBib29sIHJlYXBOVGhyZWFkcyhpbnQgbG9vcCA9IDEsIGludCBjb3VudCA9IDEwKSB7CisKKyAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8TW9uaXRvcj4gbW9uaXRvcihuZXcgTW9uaXRvcik7CisKKyAgICBmb3IgKGludCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgeworCisgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOworCisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOworICAgICAgaW50IHRpeDsKKworICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICArK2FjdGl2ZUNvdW50OworICAgICAgICAgIHRocmVhZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCBhY3RpdmVDb3VudCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRpeCA9IDA7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CisgICAgICAgICAgIHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOworICAgICAgICAgICB0aXgrKywgKyt0aHJlYWQpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgICBtb25pdG9yLT53YWl0KDEwMDApOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4KiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjbGFzcyBTeW5jaFN0YXJ0VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKKyAgcHVibGljOgorICAgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworICAgIFN5bmNoU3RhcnRUYXNrKE1vbml0b3ImIG1vbml0b3IsIHZvbGF0aWxlIFNUQVRFJiBzdGF0ZSkgOiBfbW9uaXRvcihtb25pdG9yKSwgX3N0YXRlKHN0YXRlKSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpIHsKKyAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRDsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRCkgeworICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7CisgICAgICAgICAgX3N0YXRlID0gU3luY2hTdGFydFRhc2s6OlNUT1BQRUQ7CisgICAgICAgICAgX21vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICB2b2xhdGlsZSBTVEFURSYgX3N0YXRlOworICB9OworCisgIGJvb2wgc3luY2hTdGFydFRlc3QoKSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBTeW5jaFN0YXJ0VGFzazo6U1RBVEUgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRDsKKworICAgIHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+IHRhc2sKKyAgICAgICAgPSBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPihuZXcgU3luY2hTdGFydFRhc2sobW9uaXRvciwgc3RhdGUpKTsKKworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7CisKKyAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQpIHsKKworICAgICAgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkc7CisKKyAgICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICAgIHdoaWxlIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpIHsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHN0YXRlICE9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORyk7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgbW9uaXRvci53YWl0KDEwMCk7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7CisKKyAgICAgICAgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkc7CisKKyAgICAgICAgbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORykgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQRUQpOworCisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBvbmx5IGd1YXJhbnRlZSBhIG1vbml0b3IgdGltZW91dCBjYW4gZ2l2ZSB5b3UgaXMgdGhhdAorICAgKiBpdCB3aWxsIHRha2UgImF0IGxlYXN0IiBhcyBsb25nIGFzIHRoZSB0aW1lb3V0LCBubyBsZXNzLgorICAgKiBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGd1YXJhbnRlZSBhcm91bmQgcmVnYWluaW5nIGV4ZWN1dGlvbgorICAgKiBuZWFyIHRoZSB0aW1lb3V0LiAgT24gYSBidXN5IHN5c3RlbSAobGlrZSBpbnNpZGUgYSB0aGlyZCBwYXJ0eQorICAgKiBDSSBlbnZpcm9ubWVudCkgaXQgY291bGQgdGFrZSBxdWl0ZSBhIGJpdCBsb25nZXIgdGhhbiB0aGUKKyAgICogcmVxdWVzdGVkIHRpbWVvdXQsIGFuZCB0aGF0J3Mgb2suCisgICAqLworCisgIGJvb2wgbW9uaXRvclRpbWVvdXRUZXN0KGludDY0X3QgY291bnQgPSAxMDAwLCBpbnQ2NF90IHRpbWVvdXQgPSAyKSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBmb3IgKGludDY0X3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgICB0cnkgeworICAgICAgICAgIG1vbml0b3Iud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgIGJvb2wgc3VjY2VzcyA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSA+PSAoY291bnQgKiB0aW1lb3V0KTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIjogbWluaW11bSByZXF1aXJlZCB0aW1lIHRvIGVsYXBzZSAiIDw8IGNvdW50ICogdGltZW91dAorICAgICAgICAgICAgICA8PCAibXM7IGFjdHVhbCBlbGFwc2VkIHRpbWUgIiA8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworICBwdWJsaWM6CisgICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCwgTW9uaXRvciYgbW9uKSA6IF9pZChpZCksIF9tb24obW9uKSB7fQorICAgIH5GbG9vZFRhc2soKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgaWYgKF9pZCAlIDEwMDAwID09IDApIHsKKwkJU3luY2hyb25pemVkIHN5bmMoX21vbik7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdHRocmVhZCAiIDw8IF9pZCA8PCAiIHN0YXJ0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IF9pZDsKKyAgICBNb25pdG9yJiBfbW9uOworICB9OworCisgIHZvaWQgZm9vKFBsYXRmb3JtVGhyZWFkRmFjdG9yeSogdGYpIHsgKHZvaWQpdGY7IH0KKworICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3AgPSAxLCBzaXplX3QgY291bnQgPSAxMDAwMDApIHsKKworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIE1vbml0b3IgbW9uOworCQorICAgIGZvciAoc2l6ZV90IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CisKKyAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKHRydWUpOworCisgICAgICBmb3IgKHNpemVfdCB0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgc2hhcmVkX3B0cjxGbG9vZFRhc2s+IHRhc2sobmV3IEZsb29kVGFzayhsaXggKiBjb3VudCArIHRpeCwgbW9uKSk7CisgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOworICAgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKKworICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CisKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgU3luY2hyb25pemVkIHN5bmMobW9uKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmxvb2RlZCAiIDw8IChsaXggKyAxKSAqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOworICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMDkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApAQCAtMCwwICsxLDY4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdGF0aWMgc3RkOjpkZXF1ZTxzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+ID4gbV9leHBpcmVkOworc3RhdGljIHZvaWQgZXhwaXJlZE5vdGlmaWVyKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCit7CisgIG1fZXhwaXJlZC5wdXNoX2JhY2socnVubmFibGUpOworfQorCitzdGF0aWMgdm9pZCBzbGVlcF8oaW50NjRfdCBtaWxsaXNlYykgeworICBNb25pdG9yIF9zbGVlcDsKKyAgU3luY2hyb25pemVkIHMoX3NsZWVwKTsKKworICB0cnkgeworICAgIF9zbGVlcC53YWl0KG1pbGxpc2VjKTsKKyAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgOworICB9IGNhdGNoICguLi4pIHsKKyAgICBhc3NlcnQoMCk7CisgIH0KK30KKworY2xhc3MgVGhyZWFkTWFuYWdlclRlc3RzIHsKKworcHVibGljOgorICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIGNvdW50LCBpbnQ2NF90IHRpbWVvdXQpCisgICAgICA6IF9tb25pdG9yKG1vbml0b3IpLCBfY291bnQoY291bnQpLCBfdGltZW91dCh0aW1lb3V0KSwgX3N0YXJ0VGltZSgwKSwgX2VuZFRpbWUoMCksIF9kb25lKGZhbHNlKSB7fQorCisgICAgdm9pZCBydW4oKSB7CisKKyAgICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgICBzbGVlcF8oX3RpbWVvdXQpOworCisgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIF9kb25lID0gdHJ1ZTsKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJUaHJlYWQgIiA8PCBfY291bnQgPDwgIiBjb21wbGV0ZWQgIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgX2NvdW50LS07CisgICAgICAgIGlmIChfY291bnQgJSAxMDAwMCA9PSAwKSB7CisgICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICBzaXplX3QmIF9jb3VudDsKKyAgICBpbnQ2NF90IF90aW1lb3V0OworICAgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgICBpbnQ2NF90IF9lbmRUaW1lOworICAgIGJvb2wgX2RvbmU7CisgICAgTW9uaXRvciBfc2xlZXA7CisgIH07CisKKyAgLyoqCisgICAqIERpc3BhdGNoIGNvdW50IHRhc2tzLCBlYWNoIG9mIHdoaWNoIGJsb2NrcyBmb3IgdGltZW91dCBtaWxsaXNlY29uZHMgdGhlbgorICAgKiBjb21wbGV0ZXMuIFZlcmlmeSB0aGF0IGFsbCB0YXNrcyBjb21wbGV0ZWQgYW5kIHRoYXQgdGhyZWFkIG1hbmFnZXIgY2xlYW5zCisgICAqIHVwIHByb3Blcmx5IG9uIGRlbGV0ZS4KKyAgICovCisgIGJvb2wgbG9hZFRlc3Qoc2l6ZV90IGNvdW50ID0gMTAwLCBpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gNCkgeworCisgICAgTW9uaXRvciBtb25pdG9yOworCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gY291bnQ7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CisjZW5kaWYKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+IHRhc2tzOworCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisKKyAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4oCisgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhtb25pdG9yLCBhY3RpdmVDb3VudCwgdGltZW91dCkpKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKKworICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGxvYWRlZCAiIDw8IGNvdW50IDw8ICIgdGFza3MgdG8gZXhlY3V0ZSIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisKKyAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFjdGl2ZUNvdW50ID0gIiA8PCBhY3RpdmVDb3VudCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbGFzdFRpbWUgPSAwOworCisgICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKKyAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKKworICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gdGFzayA9ICppeDsKKworICAgICAgaW50NjRfdCBkZWx0YSA9IHRhc2stPl9lbmRUaW1lIC0gdGFzay0+X3N0YXJ0VGltZTsKKworICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7CisKKyAgICAgIGlmICh0YXNrLT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7CisgICAgICAgIGZpcnN0VGltZSA9IHRhc2stPl9zdGFydFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmICh0YXNrLT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7CisgICAgICAgIGxhc3RUaW1lID0gdGFzay0+X2VuZFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKKyAgICAgICAgbWluVGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7CisgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgYXZlcmFnZVRpbWUgKz0gZGVsdGE7CisgICAgfQorCisgICAgYXZlcmFnZVRpbWUgLz0gY291bnQ7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZpcnN0IHN0YXJ0OiAiIDw8IGZpcnN0VGltZSA8PCAiIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lCisgICAgICAgICAgICAgIDw8ICIgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgYm9vbCBzdWNjZXNzID0gKHRpbWUwMSAtIHRpbWUwMCkgPj0gKChpbnQ2NF90KWNvdW50ICogdGltZW91dCkgLyAoaW50NjRfdCl3b3JrZXJDb3VudDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBjbGFzcyBCbG9ja1Rhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBCbG9ja1Rhc2soTW9uaXRvciYgZW50cnlNb25pdG9yLCBNb25pdG9yJiBibG9ja01vbml0b3IsIGJvb2wmIGJsb2NrZWQsIE1vbml0b3ImIGRvbmVNb25pdG9yLCBzaXplX3QmIGNvdW50KQorICAgICAgOiBfZW50cnlNb25pdG9yKGVudHJ5TW9uaXRvciksIF9lbnRlcmVkKGZhbHNlKSwgX2Jsb2NrTW9uaXRvcihibG9ja01vbml0b3IpLCBfYmxvY2tlZChibG9ja2VkKSwgX2RvbmVNb25pdG9yKGRvbmVNb25pdG9yKSwgX2NvdW50KGNvdW50KSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9lbnRyeU1vbml0b3IpOworICAgICAgICBfZW50ZXJlZCA9IHRydWU7CisgICAgICAgIF9lbnRyeU1vbml0b3Iubm90aWZ5KCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2Jsb2NrTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChfYmxvY2tlZCkgeworICAgICAgICAgIF9ibG9ja01vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2RvbmVNb25pdG9yKTsKKyAgICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKKyAgICAgICAgICBfZG9uZU1vbml0b3Iubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfZW50cnlNb25pdG9yOworICAgIGJvb2wgX2VudGVyZWQ7CisgICAgTW9uaXRvciYgX2Jsb2NrTW9uaXRvcjsKKyAgICBib29sJiBfYmxvY2tlZDsKKyAgICBNb25pdG9yJiBfZG9uZU1vbml0b3I7CisgICAgc2l6ZV90JiBfY291bnQ7CisgIH07CisKKyAgLyoqCisgICAqIEJsb2NrIHRlc3QuICBDcmVhdGUgcGVuZGluZ1Rhc2tDb3VudE1heCB0YXNrcy4gIFZlcmlmeSB0aGF0IHdlIGJsb2NrIGFkZGluZyB0aGUKKyAgICogcGVuZGluZ1Rhc2tDb3VudE1heCArIDF0aCB0YXNrLiAgVmVyaWZ5IHRoYXQgd2UgdW5ibG9jayB3aGVuIGEgdGFzayBjb21wbGV0ZXMgKi8KKworICBib29sIGJsb2NrVGVzdChpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gMikgeworICAgICh2b2lkKXRpbWVvdXQ7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKyAgICB0cnkgeworCisgICAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBub3QgdXNlZCBieSB0aGlzIHRlc3QKKyAgICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOworICAgICAgYm9vbCBibG9ja2VkW10gPSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisgICAgICBNb25pdG9yIGRvbmVNb25pdG9yOworCisgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tNYXhDb3VudCA9IHdvcmtlckNvdW50OworCisgICAgICBzaXplX3QgYWN0aXZlQ291bnRzW10gPSB7d29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQsIDF9OworCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQpOworCisgICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CisjZW5kaWYKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICB0YXNrcy5yZXNlcnZlKHdvcmtlckNvdW50ICsgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CisKKyAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgeworCisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFswXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1swXSkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHBlbmRpbmdUYXNrTWF4Q291bnQ7IGl4KyspIHsKKworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMV0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMV0pKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgICAgaXgrKykgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKKyAgICAgIH0KKworICAgICAgaWYgKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzaygKKyAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMl0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMl0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgMSk7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAtMSk7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAorICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFswXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOworCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICAgIDw8ICJhZGQgdGltZWQgb3V0IHVuZXhwZWN0ZWRseSIgPDwgc3RkOjplbmRsOworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2siKTsKKworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgICA8PCAiYWRkIGVuY291bnRlcmVkIHRvbyBtYW55IHBlbmRpbmcgZXhlcGN0aW9ucyIgPDwgc3RkOjplbmRsOworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2siKTsKKyAgICAgIH0KKworICAgICAgLy8gV2FrZSB1cCB0YXNrcyB0aGF0IHdlcmUgcGVuZGluZyBiZWZvcmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzFdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMV0gIT0gMCkgeworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBXYWtlIHVwIHRoZSBleHRyYSB0YXNrIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMl0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1syXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0b3AoKTsKKworICAgICAgaWYgKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IDApKSkgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRvdGFsIHRhc2sgY291bnQiKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGUpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBzdWNjZXNzOworICB9CisKKworICBib29sIGFwaVRlc3QoKSB7CisKKyAgICAvLyBwcm92ZSBjdXJyZW50VGltZSBoYXMgbWlsbGlzZWNvbmRzIGdyYW51bGFyaXR5IHNpbmNlIG1hbnkgb3RoZXIgdGhpbmdzIGRlcGVuZCBvbiBpdAorICAgIGludDY0X3QgYSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgc2xlZXBfKDEwMCk7CisgICAgaW50NjRfdCBiID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZiAoYiAtIGEgPCA1MCB8fCBiIC0gYSA+IDE1MCkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRleHBlY3RlZCAxMDBtcyBnYXAsIGZvdW5kICIgPDwgKGItYSkgPDwgIm1zIGdhcCBpbnN0ZWFkLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIC8vIHRlc3Qgb25jZSB3aXRoIGEgZGV0YWNoZWQgdGhyZWFkIGZhY3RvcnkgYW5kIG9uY2Ugd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5CisKKyAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIGlmICghYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkRmFjdG9yeS5yZXNldChuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KHRydWUpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisjZWxzZQorICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworI2VuZGlmCisKKyAgfQorCisgIGJvb2wgYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KQorICB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKworICAgIC8vIHZlcmlmeSB3ZSBjYW5ub3QgY2hhbmdlIHRoZSB0aHJlYWQgZmFjdG9yeSB0byBvbmUgd2l0aCB0aGUgb3Bwb3NpdGUgZGV0YWNoZWQgc2V0dGluZworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5MgorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorICAgICAgICAgIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4sCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgMSwKKyAgICAgICAgICAhdGhyZWFkRmFjdG9yeS0+aXNEZXRhY2hlZCgpKSk7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeTIpOworICAgICAgLy8gaWYgdGhlIGNhbGwgc3VjY2VlZGVkIHdlIGNoYW5nZWQgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB0aGF0IGhhZCB0aGUgb3Bwb3NpdGUgc2V0dGluZyBmb3IgImlzRGV0YWNoZWQoKSIuCisgICAgICAvLyB0aGlzIGlzIGJhZCwgYmVjYXVzZSB0aGUgdGhyZWFkIG1hbmFnZXIgY2hlY2tzIHdpdGggdGhlIHRocmVhZCBmYWN0b3J5IHRvIHNlZSBpZiBpdCBzaG91bGQgam9pbiB0aHJlYWRzCisgICAgICAvLyBhcyB0aGV5IGFyZSBsZWF2aW5nIC0gc28gdGhlIGRldGFjaGVkIHN0YXR1cyBvZiBuZXcgdGhyZWFkcyBjYW5ub3QgY2hhbmdlIHdoaWxlIHRoZXJlIGFyZSBleGlzdGluZyB0aHJlYWRzLgorICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRTaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHN0YXJ0aW5nLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKGV4cGlyZWROb3RpZmllcik7IC8vIHN0ZDo6YmluZCgmVGhyZWFkTWFuYWdlclRlc3RzOjpleHBpcmVkTm90aWZpZXIsIHRoaXMpKTsKKworI2RlZmluZSBFWFBFQ1QoRlVOQywgQ09VTlQpIHsgc2l6ZV90IGMgPSBGVU5DOyBpZiAoYyAhPSBDT1VOVCkgeyBzdGQ6OmNlcnIgPDwgImV4cGVjdGVkICIgI0ZVTkMiIHRvIGJlICIgI0NPVU5UICIsIGJ1dCB3YXMgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAyKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAxc3Qgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byB0aHJvdyBhIGJsb2NraW5nIHRhc2sgaW50byB0aGUgbWl4CisgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gc2lnbmFsZWQgd2hlbiB0YXNrIGlzIHJ1bm5pbmcKKyAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsgICAvLyB0byBiZSBzaWduYWxlZCB0byB1bmJsb2NrIHRoZSB0YXNrCisgICAgYm9vbCBibG9ja2VkKHRydWUpOyAgICAgLy8gc2V0IHRvIGZhbHNlIGJlZm9yZSBub3RpZnlpbmcKKyAgICBNb25pdG9yIGRvbmVNb25pdG9yOyAgICAvLyBzaWduYWxlZCB3aGVuIGNvdW50IHJlYWNoZXMgemVybworICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDE7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gYmxvY2tpbmdUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnQpKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBvdGhlciB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gb3RoZXJUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChvdGhlclRhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGJsb2NraW5nIHRhc2sgc3BlY2lmaWNhbGx5Li4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrICE9IG90aGVyVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgcmVtb3ZlTmV4dFBlbmRpbmcgdG8gcmV0dXJuIG90aGVyVGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzayAobm9uZSBsZWZ0KS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gYW4gZW1wdHkgUnVubmFibGUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDIgZXhwaXJlZCB0YXNrcyBhbmQgMSBub3QuLiIgPDwgc3RkOjplbmRsOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IGV4cGlyZWRUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7CisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGJsb2NraW5nVGFzayk7ICAgICAgIC8vIGFkZCBvbmUgdGhhdCBoYXNuJ3QgZXhwaXJlZCB0byBtYWtlIHN1cmUgaXQgZ2V0cyBza2lwcGVkCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsgIC8vIGFkZCBhIHNlY29uZCBleHBpcmVkIHRvIGVuc3VyZSByZW1vdmVFeHBpcmVkVGFza3MgcmVtb3ZlcyBib3RoCisKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMSBtaWxsaXNlY29uZAorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMyk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGV4cGlyZWQgdGFza3MuLiIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCFtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIGVtcHR5IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisKKyAgICBpZiAobV9leHBpcmVkLnNpemUoKSAhPSAyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWRbMF0gdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2V4cGlyZWQucG9wX2Zyb250KCk7CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFsxXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9leHBpcmVkLmNsZWFyKCk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDIpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBleHBpcmVkIHRhc2sgKGFnYWluKS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gZXhwaXJlcyBpbiAxbXMKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMW1zCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlciB0byBjb25zdW1lIGV4cGlyZWQgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKyAgICBzbGVlcF8oMTAwKTsgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgdGltZSB0byBzcGluIHVwIGFuZCBleHBpcmUgdGhlIHRhc2sKKworICAgIGlmIChtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHNldCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHRyeSB0byByZW1vdmUgdG9vIG1hbnkgd29ya2VycyIgPDwgc3RkOjplbmRsOworICAgIHRyeSB7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoMik7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGNhdGNoIChjb25zdCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mKSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGVudHJ5TW9uaXRvcik7CisgICAgICB3aGlsZSAoIWJsb2NraW5nVGFzay0+X2VudGVyZWQpIHsKKyAgICAgICAgZW50cnlNb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHR1bmJsb2NrIHRhc2sgYW5kIHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICBibG9ja2VkID0gZmFsc2U7CisgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgfQorICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0Y2xlYW51cC4uICIgPDwgc3RkOjplbmRsOworCisgICAgYmxvY2tpbmdUYXNrLnJlc2V0KCk7CisgICAgdGhyZWFkTWFuYWdlci5yZXNldCgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzUyYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7CisKK3B1YmxpYzoKKyAgY2xhc3MgVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIHB1YmxpYzoKKyAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIGludDY0X3QgdGltZW91dCkKKyAgICAgIDogX3RpbWVvdXQodGltZW91dCksCisgICAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCisgICAgICAgIF9lbmRUaW1lKDApLAorICAgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAorICAgICAgICBfZG9uZShmYWxzZSkge30KKworICAgIH5UYXNrKCkgeyBzdGQ6OmNlcnIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7IH0KKworICAgIHZvaWQgcnVuKCkgeworCisgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICBfc3VjY2VzcyA9IChfZW5kVGltZSAtIF9zdGFydFRpbWUpID49IF90aW1lb3V0OworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgX2RvbmUgPSB0cnVlOworICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IF90aW1lb3V0OworICAgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgICBpbnQ2NF90IF9lbmRUaW1lOworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIGJvb2wgX3N1Y2Nlc3M7CisgICAgYm9vbCBfZG9uZTsKKyAgfTsKKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIGFuZCB3YWl0cyBmb3IgdGhlIGZpcnN0IHRvIGV4cGlyZSB3aXRoaW4gMTAlCisgICAqIG9mIHRoZSBleHBlY3RlZCBleHBpcmF0aW9uIHRpbWUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlcgorICAgKiBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlCisgICAqIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAwKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CisKKyAgICB7CisgICAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgICBpZiAodGltZXJNYW5hZ2VyLnN0YXRlKCkgIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGltZXJNYW5hZ2VyIGlzIG5vdCBpbiB0aGUgU1RBUlRFRCBzdGF0ZSwgYnV0IHNob3VsZCBiZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIERvbid0IGNyZWF0ZSB0YXNrIHlldCwgYmVjYXVzZSBpdHMgY29uc3RydWN0b3Igc2V0cyB0aGUgZXhwZWN0ZWQgY29tcGxldGlvbiB0aW1lLCBhbmQgd2UKKyAgICAgIC8vIG5lZWQgdG8gZGVsYXkgYmV0d2VlbiBpbnNlcnRpbmcgdGhlIHR3byB0YXNrcyBpbnRvIHRoZSBydW4gcXVldWUuCisgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrOworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOworCisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHRpbWVvdXQgKiAxMDAwKTsKKworICAgICAgICB0YXNrLnJlc2V0KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgICAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRpbWVvdXQpOworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CisKKyAgICAgIGlmICghdGFzay0+X2RvbmUpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0YXNrIGlzIG5vdCBkb25lLCBidXQgaXQgc2hvdWxkIGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHRhc2stPl9zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGlmIChvcnBoYW5UYXNrLT5fZG9uZSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJvcnBoYW4gdGFzayBpcyBkb25lLCBidXQgaXQgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAxKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcyB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrIGFuZCBhbm90aGVyIG9uZSwgdGhlbiByZW1vdmVzIHRoZSB0d28KKyAgICogZHVwbGljYXRlZCB0aGVuIHdhaXRzIGZvciB0aGUgbGFzdCBvbmUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseQorICAgKiBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUKKyAgICogYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAyKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIG9uZSB0YXNrcyBhbmQgYWRkIGl0IHR3aWNlCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDMpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQgKiAyKTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHRhc2sgKGUuZy4gdHdvIHRpbWVycykgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDMoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgcmVtb3ZlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgb25lIHRhc2tzLCBhbmQgdHJpZXMgdG8gcmVtb3ZlIGl0IGFmdGVyIGl0IGhhcyBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDQoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdGFzaworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMTApKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSB0YXNrIGhhcyBjb21wbGV0ZWQKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIGV4cGlyZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydCgwID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnJpZW5kIGNsYXNzIFRlc3RUYXNrOworCisgIE1vbml0b3IgX21vbml0b3I7Cit9OworCit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvTGlua1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvTGlua1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTE0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbnQgbWFpbihpbnQsIGNoYXIqKikgeworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcCBiL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE3OTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIHBhcnQgb2YgYSBsaW5rIHRlc3QgdGhhdCBtYWtlcyBzdXJlIGdlbmVyYXRlZAorICogdGVtcGxhdGVkIHNlcnZpY2UgaGVhZGVycyBjYW4gYmUgaW5jbHVkZWQgZnJvbSBtdWx0aXBsZQorICogaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKi8KKworI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBhIGxpbmsgdGVzdCB0aGF0IG1ha2VzIHN1cmUgZ2VuZXJhdGVkCisgKiB0ZW1wbGF0ZWQgc2VydmljZSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIG11bHRpcGxlCisgKiBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGRiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworbmFtZXNwYWNlIHsKKworLy8gRGVmaW5lIGVudmlyb25tZW50IHZhcmlhYmxlIERFQlVHX0VWRU5UTE9HIHRvIGVuYWJsZSBkZWJ1ZyBsb2dnaW5nCisvLyBleDogJCBERUJVR19FVkVOVExPRz0xIHByb2Nlc3Nvcl90ZXN0CitzdGF0aWMgY29uc3QgY2hhciAqIERFQlVHX0VWRU5UTE9HID0gZ2V0ZW52KCJERUJVR19FVkVOVExPRyIpOworCit2b2lkIGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChERUJVR19FVkVOVExPRykgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICB9Cit9Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VpbnQzMl90IEV2ZW50TG9nOjpuZXh0SWRfID0gMDsKKworI2RlZmluZSBFVkVOVF9UWVBFKHZhbHVlKSBFdmVudFR5cGUgRXZlbnRMb2c6OnZhbHVlID0gI3ZhbHVlCitFVkVOVF9UWVBFKEVUX0xPR19FTkQpOworRVZFTlRfVFlQRShFVF9DT05OX0NSRUFURUQpOworRVZFTlRfVFlQRShFVF9DT05OX0RFU1RST1lFRCk7CitFVkVOVF9UWVBFKEVUX0NBTExfU1RBUlRFRCk7CitFVkVOVF9UWVBFKEVUX0NBTExfRklOSVNIRUQpOworRVZFTlRfVFlQRShFVF9QUk9DRVNTKTsKK0VWRU5UX1RZUEUoRVRfUFJFX1JFQUQpOworRVZFTlRfVFlQRShFVF9QT1NUX1JFQUQpOworRVZFTlRfVFlQRShFVF9QUkVfV1JJVEUpOworRVZFTlRfVFlQRShFVF9QT1NUX1dSSVRFKTsKK0VWRU5UX1RZUEUoRVRfQVNZTkNfQ09NUExFVEUpOworRVZFTlRfVFlQRShFVF9IQU5ETEVSX0VSUk9SKTsKKworRVZFTlRfVFlQRShFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfR0VORVJBVElPTik7CitFVkVOVF9UWVBFKEVUX0NBTExfQUREX1NUUklORyk7CitFVkVOVF9UWVBFKEVUX0NBTExfR0VUX1NUUklOR1MpOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9EQVRBX1dBSVQpOworRVZFTlRfVFlQRShFVF9DQUxMX09ORVdBWV9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9FWENFUFRJT05fV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfU0VUX1ZBTFVFKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfVkFMVUUpOworRVZFTlRfVFlQRShFVF9XQUlUX1JFVFVSTik7CisKK0V2ZW50TG9nOjpFdmVudExvZygpIHsKKyAgaWRfID0gbmV4dElkXysrOworICBkZWJ1ZygiTmV3IGxvZzogJWQiLCBpZF8pOworfQorCit2b2lkIEV2ZW50TG9nOjphcHBlbmQoRXZlbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGRlYnVnKCIlZCA8LS0gJXUsICV1LCAlcyBcIiVzXCIiLCBpZF8sIGNvbm5lY3Rpb25JZCwgY2FsbElkLCB0eXBlLCBtZXNzYWdlLmNfc3RyKCkpOworCisgIEV2ZW50IGUodHlwZSwgY29ubmVjdGlvbklkLCBjYWxsSWQsIG1lc3NhZ2UpOworICBldmVudHNfLnB1c2hfYmFjayhlKTsKKworICBtb25pdG9yXy5ub3RpZnkoKTsKK30KKworRXZlbnQgRXZlbnRMb2c6OndhaXRGb3JFdmVudChpbnQ2NF90IHRpbWVvdXQpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworCisgIHRyeSB7CisgICAgd2hpbGUgKGV2ZW50c18uZW1wdHkoKSkgeworICAgICAgbW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICB9CisgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uIGV4KSB7CisgICAgcmV0dXJuIEV2ZW50KEVUX0xPR19FTkQsIDAsIDAsICIiKTsKKyAgfQorCisgIEV2ZW50IGV2ZW50ID0gZXZlbnRzXy5mcm9udCgpOworICBldmVudHNfLnBvcF9mcm9udCgpOworICByZXR1cm4gZXZlbnQ7Cit9CisKK0V2ZW50IEV2ZW50TG9nOjp3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0KSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKworICBFdmVudExpc3Q6Oml0ZXJhdG9yIGl0ID0gZXZlbnRzXy5iZWdpbigpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBuaWNlciB0byBob25vciB0aW1lb3V0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcworICAgICAgLy8gY2FsbCwgcmF0aGVyIHRoYW4gcmVzdGFydGluZyBpdCBmb3IgZWFjaCBjYWxsIHRvIHdhaXQoKS4gIEl0IHNob3VsZG4ndAorICAgICAgLy8gYmUgYSBiaWcgcHJvYmxlbSBpbiBwcmFjdGljZSwgdGhvdWdoLgorICAgICAgd2hpbGUgKGl0ID09IGV2ZW50c18uZW5kKCkpIHsKKyAgICAgICAgbW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiBleCkgeworICAgICAgcmV0dXJuIEV2ZW50KEVUX0xPR19FTkQsIDAsIDAsICIiKTsKKyAgICB9CisKKyAgICBpZiAoaXQtPmNvbm5lY3Rpb25JZCA9PSBjb25uSWQpIHsKKyAgICAgIEV2ZW50IGV2ZW50ID0gKml0OworICAgICAgZXZlbnRzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4Mjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXworI2RlZmluZSBfVEhSSUZUX1RFU1RfRVZFTlRMT0dfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLy8gSW5pdGlhbGx5IEkgbWFkZSBFdmVudFR5cGUgYW4gZW51bSwgYnV0IHVzaW5nIGNoYXIqIHJlc3VsdHMKKy8vIGluIG11Y2ggbW9yZSByZWFkYWJsZSBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisvLyBJdCBhbHNvIGxldHMgdXNlcnMgb2YgRXZlbnRMb2cgZWFzaWx5IGRlZmluZSB0aGVpciBvd24gbmV3IHR5cGVzLgorLy8gQ29tcGFyaW5nIHRoZSBsaXRlcmFsIHBvaW50ZXIgdmFsdWVzIHNob3VsZCBiZSBzYWZlLCBiYXJyaW5nIGFueSBzdHJhbmdlCisvLyBsaW5raW5nIHNldHVwIHRoYXQgcmVzdWx0cyBpbiBkdXBsaWNhdGUgc3ltYm9scy4KK3R5cGVkZWYgY29uc3QgY2hhciogRXZlbnRUeXBlOworCitzdHJ1Y3QgRXZlbnQgeworICBFdmVudChFdmVudFR5cGUgdHlwZSwgdWludDMyX3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBjYWxsSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogdHlwZSh0eXBlKSwgY29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIGNhbGxJZChjYWxsSWQpLCBtZXNzYWdlKG1lc3NhZ2UpIHt9CisKKyAgRXZlbnRUeXBlIHR5cGU7CisgIHVpbnQzMl90IGNvbm5lY3Rpb25JZDsKKyAgdWludDMyX3QgY2FsbElkOworICBzdGQ6OnN0cmluZyBtZXNzYWdlOworfTsKKworY2xhc3MgRXZlbnRMb2cgeworcHVibGljOgorICBzdGF0aWMgRXZlbnRUeXBlIEVUX0xPR19FTkQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ09OTl9DUkVBVEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NPTk5fREVTVFJPWUVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfU1RBUlRFRDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0ZJTklTSEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BST0NFU1M7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJFX1JFQUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUE9TVF9SRUFEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BSRV9XUklURTsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QT1NUX1dSSVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0FTWU5DX0NPTVBMRVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0hBTkRMRVJfRVJST1I7CisKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfR0VUX0dFTkVSQVRJT047CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9BRERfU1RSSU5HOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfR0VUX1NUUklOR1M7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfREFUQV9XQUlUOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfT05FV0FZX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlUOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfRVhDRVBUSU9OX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfV0FJVF9SRVRVUk47CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9TRVRfVkFMVUU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfVkFMVUU7CisKKyAgRXZlbnRMb2coKTsKKworICB2b2lkIGFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlID0gIiIpOworCisgIEV2ZW50IHdhaXRGb3JFdmVudChpbnQ2NF90IHRpbWVvdXQgPSA1MDApOworICBFdmVudCB3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0ID0gNTAwKTsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIHN0ZDo6bGlzdDxFdmVudD4gRXZlbnRMaXN0OworCisgIGNvbmN1cnJlbmN5OjpNb25pdG9yIG1vbml0b3JfOworICBFdmVudExpc3QgZXZlbnRzXzsKKyAgdWludDMyX3QgaWRfOworCisgIHN0YXRpYyB1aW50MzJfdCBuZXh0SWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Nzg0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfVEVTVF9IQU5ETEVSU19IXworI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9URVNUX0hBTkRMRVJTX0hfIDEKKworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworY2xhc3MgUGFyZW50SGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFBhcmVudFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIFBhcmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKQorICAgIDogdHJpZ2dlck1vbml0b3IoJm11dGV4XyksIGdlbmVyYXRpb25fKDApLCB3YWl0XyhmYWxzZSksIGxvZ18obG9nKSB7fQorCisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9JTkNSRU1FTlRfR0VORVJBVElPTiwgMCwgMCk7CisgICAgcmV0dXJuICsrZ2VuZXJhdGlvbl87CisgIH0KKworICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0dFTkVSQVRJT04sIDAsIDApOworICAgIHJldHVybiBnZW5lcmF0aW9uXzsKKyAgfQorCisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfQUREX1NUUklORywgMCwgMCk7CisgICAgc3RyaW5nc18ucHVzaF9iYWNrKHMpOworICB9CisKKyAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9TVFJJTkdTLCAwLCAwKTsKKyAgICBfcmV0dXJuID0gc3RyaW5nc187CisgIH0KKworICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBpbnQzMl90IGxlbmd0aCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9EQVRBX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworCisgICAgX3JldHVybi5hcHBlbmQobGVuZ3RoLCAnYScpOworICB9CisKKyAgdm9pZCBvbmV3YXlXYWl0KCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX09ORVdBWV9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKyAgfQorCisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0VYQ0VQVElPTl9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKworICAgIE15RXJyb3IgZTsKKyAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRocm93IGU7CisgIH0KKworICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgMCwgMCk7CisKKyAgICBibG9ja1VudGlsVHJpZ2dlcmVkKCk7CisKKyAgICBNeUVycm9yIGU7CisgICAgZS5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aHJvdyBlOworICB9CisKKyAgLyoqCisgICAqIEFmdGVyIHByZXBhcmVUcmlnZ2VyZWRDYWxsKCkgaXMgaW52b2tlZCwgY2FsbHMgdG8gYW55IG9mIHRoZSAqV2FpdCgpCisgICAqIGZ1bmN0aW9ucyB3b24ndCByZXR1cm4gdW50aWwgdHJpZ2dlclBlbmRpbmdDYWxscygpIGlzIGludm9rZWQKKyAgICoKKyAgICogVGhpcyBoYXMgdG8gYmUgYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbnZva2VkIGJ5IHRoZSBtYWluIHRlc3QgdGhyZWFkCisgICAqIGluIG9yZGVyIHRvIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4KKyAgICovCisgIHZvaWQgcHJlcGFyZVRyaWdnZXJlZENhbGwoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICB3YWl0XyA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogV2FrZSB1cCBhbGwgY2FsbHMgd2FpdGluZyBpbiBibG9ja1VudGlsVHJpZ2dlcmVkKCkKKyAgICovCisgIHZvaWQgdHJpZ2dlclBlbmRpbmdDYWxscygpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIHdhaXRfID0gZmFsc2U7CisgICAgdHJpZ2dlck1vbml0b3Iubm90aWZ5QWxsKCk7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogYmxvY2tVbnRpbFRyaWdnZXJlZCgpIHdvbid0IHJldHVybiB1bnRpbCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgaXMgaW52b2tlZAorICAgKiBpbiBhbm90aGVyIHRocmVhZC4KKyAgICoKKyAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBhbHJlYWR5IGhvbGRpbmcgbXV0ZXhfLgorICAgKi8KKyAgdm9pZCBibG9ja1VudGlsVHJpZ2dlcmVkKCkgeworICAgIHdoaWxlICh3YWl0XykgeworICAgICAgdHJpZ2dlck1vbml0b3Iud2FpdEZvcmV2ZXIoKTsKKyAgICB9CisKKyAgICAvLyBMb2cgYW4gZXZlbnQgd2hlbiB3ZSByZXR1cm4KKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCAwLCAwKTsKKyAgfQorCisgIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CisgIGNvbmN1cnJlbmN5OjpNb25pdG9yIHRyaWdnZXJNb25pdG9yOworICBpbnQzMl90IGdlbmVyYXRpb25fOworICBib29sIHdhaXRfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKK307CisKKyNpZmRlZiBfV0lOMzIKKyAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UKKyNlbmRpZgorCitjbGFzcyBDaGlsZEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50SGFuZGxlciwgdmlydHVhbCBwdWJsaWMgQ2hpbGRTZXJ2aWNlSWYgeworcHVibGljOgorICBDaGlsZEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IFBhcmVudEhhbmRsZXIobG9nKSwgdmFsdWVfKDApIHt9CisKKyAgaW50MzJfdCBzZXRWYWx1ZShjb25zdCBpbnQzMl90IHZhbHVlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLCAwLCAwKTsKKworICAgIGludDMyX3Qgb2xkVmFsdWUgPSB2YWx1ZV87CisgICAgdmFsdWVfID0gdmFsdWU7CisgICAgcmV0dXJuIG9sZFZhbHVlOworICB9CisKKyAgaW50MzJfdCBnZXRWYWx1ZSgpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsIDAsIDApOworCisgICAgcmV0dXJuIHZhbHVlXzsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGludDMyX3QgdmFsdWVfOworfTsKKworI2lmZGVmIF9XSU4zMgorICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworc3RydWN0IENvbm5Db250ZXh0IHsKK3B1YmxpYzoKKyAgQ29ubkNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICB1aW50MzJfdCBpZCkKKyAgICA6IGlucHV0KGluKSwgb3V0cHV0KG91dCksIGlkKGlkKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgdWludDMyX3QgaWQ7Cit9OworCitzdHJ1Y3QgQ2FsbENvbnRleHQgeworcHVibGljOgorICBDYWxsQ29udGV4dChDb25uQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgIDogY29ubkNvbnRleHQoY29udGV4dCksIG5hbWUobmFtZSksIGlkKGlkKSB7fQorCisgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dDsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgdWludDMyX3QgaWQ7Cit9OworCitjbGFzcyBTZXJ2ZXJFdmVudEhhbmRsZXIgOiBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgU2VydmVyRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKworICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQorCisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSBuZXcgQ29ubkNvbnRleHQoaW5wdXQsIG91dHB1dCwgbmV4dElkXyk7CisgICAgKytuZXh0SWRfOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBjb250ZXh0LT5pZCwgMCk7CisgICAgcmV0dXJuIGNvbnRleHQ7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKworICAgIGlmIChpbnB1dCAhPSBjb250ZXh0LT5pbnB1dCkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgaWYgKG91dHB1dCAhPSBjb250ZXh0LT5vdXRwdXQpIHsKKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgY29udGV4dC0+aWQsIDApOworCisgICAgZGVsZXRlIGNvbnRleHQ7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworLy8gVE9ETzogV2UgY3VycmVudGx5IGRvbid0IHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9jZXNzQ29udGV4dCgpCisvLyBjYWxscy4gIFRoZSB2YXJpb3VzIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGF0CisvLyBzbGlnaHRseSBkaWZmZXJlbnQgdGltZXMsIGFuZCBpdCBpcyB0b28gYW5ub3lpbmcgdG8gdHJ5IGFuZCBhY2NvdW50IGZvcgorLy8gdGhlaXIgdmFyaW91cyBkaWZmZXJlbmNlcy4KKy8vCisvLyBUVGhyZWFkZWRTZXJ2ZXIsIFRUaHJlYWRQb29sU2VydmVyLCBhbmQgVFNpbXBsZVNlcnZlciB1c3VhbGx5IHdhaXQgdW50aWwKKy8vIHRoZXkgc2VlIHRoZSBmaXJzdCBieXRlIG9mIGEgcmVxdWVzdCBiZWZvcmUgY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorLy8gSG93ZXZlciwgdGhleSBkb24ndCB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdmVyeSBmaXJzdCByZXF1ZXN0LAorLy8gYW5kIGluc3RlYWQgaW1tZWRpYXRlbHkgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGJlZm9yZSBhbnkgZGF0YSBpcworLy8gcmVjZWl2ZWQuCisvLworLy8gVE5vbmJsb2NraW5nU2VydmVyIGFsd2F5cyB3YWl0cyB1bnRpbCByZWNlaXZpbmcgdGhlIGZ1bGwgcmVxdWVzdCBiZWZvcmUKKy8vIGNhbGxpbmcgcHJvY2Vzc0NvbnRleHQoKS4KKyNpZiAwCisgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUk9DRVNTLCBjb250ZXh0LT5pZCwgMCk7CisjZWxzZQorICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoc2VydmVyQ29udGV4dCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0cmFuc3BvcnQpOworI2VuZGlmCisgIH0KKworcHJvdGVjdGVkOgorICB1aW50MzJfdCBuZXh0SWRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Cit9OworCitjbGFzcyBQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIFByb2Nlc3NvckV2ZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CisKKyAgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbk5hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKKyAgICBDb25uQ29udGV4dCogY29ubkNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CisKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IG5ldyBDYWxsQ29udGV4dChjb25uQ29udGV4dCwgbmV4dElkXywgZm5OYW1lKTsKKyAgICArK25leHRJZF87CisKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU1RBUlRFRCwgY29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCisgIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICBkZWxldGUgY29udGV4dDsKKyAgfQorCisgIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQVNZTkNfQ09NUExFVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9IQU5ETEVSX0VSUk9SLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBjaGVja05hbWUoY29uc3QgQ2FsbENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIC8vIE5vdGU6IHdlIGNhbid0IHVzZSBCT09TVF9DSEVDS19FUVVBTCBoZXJlLCBzaW5jZSB0aGUgaGFuZGxlciBydW5zIGluIGEKKyAgICAvLyBkaWZmZXJlbnQgdGhyZWFkIGZyb20gdGhlIHRlc3QgZnVuY3Rpb25zLiAgSnVzdCBhYm9ydCBpZiB0aGUgbmFtZXMgYXJlCisgICAgLy8gZGlmZmVyZW50CisgICAgaWYgKGNvbnRleHQtPm5hbWUgIT0gZm5OYW1lKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgImNhbGwgY29udGV4dCBuYW1lIG1pc21hdGNoOiBcIiVzXCIgIT0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICBjb250ZXh0LT5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgIGZuTmFtZSk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgbmV4dElkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfUFJPQ0VTU09SX1RFU1RfSEFORExFUlNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2UwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCkBAIC0wLDAgKzEsOTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgdGhhdCBlbnN1cmUgVFByb2Nlc3NvckV2ZW50SGFuZGxlciBhbmQKKyAqIFRTZXJ2ZXJFdmVudEhhbmRsZXIgYXJlIGludm9rZWQgcHJvcGVybHkgYnkgdGhlIHZhcmlvdXMgc2VydmVyCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisKKyNpbmNsdWRlICJFdmVudExvZy5oIgorI2luY2x1ZGUgIlNlcnZlclRocmVhZC5oIgorI2luY2x1ZGUgIkhhbmRsZXJzLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dGVzdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLyoKKyAqIFRyYWl0cyBjbGFzc2VzIHRoYXQgZW5jYXBzdWxhdGUgaG93IHRvIGNyZWF0ZSB2YXJpb3VzIHR5cGVzIG9mIHNlcnZlcnMuCisgKi8KKworY2xhc3MgVFNpbXBsZVNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFNpbXBsZVNlcnZlciBTZXJ2ZXJUeXBlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAorICAgICAgICBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgIH0KK307CisKK2NsYXNzIFRUaHJlYWRlZFNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFRocmVhZGVkU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+KAorICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfQorfTsKKworY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXJUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRUaHJlYWRQb29sU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAorICAgICAgICBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOworICB9Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhdXRvbWF0aWNhbGx5IHVzZXMgVEZyYW1lZFRyYW5zcG9ydC4KKyAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHN1cHBsaWVkIHRyYW5zcG9ydCBmYWN0b3J5IGlzIG5vdCBhCisgICAgLy8gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKKyAgICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSogZnJhbWVkRmFjdG9yeQorICAgICAgICA9IGR5bmFtaWNfY2FzdDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSo+KHRyYW5zcG9ydEZhY3RvcnkuZ2V0KCkpOworICAgIGlmIChmcmFtZWRGYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlciBtdXN0IHVzZSBURnJhbWVkVHJhbnNwb3J0Iik7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPigKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgc29ja2V0LCB0aHJlYWRNYW5hZ2VyKSk7CisgIH0KK307CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlck5vVGhyZWFkc1RyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgorICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKKyAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQorICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgLy8gVXNlIGEgTlVMTCBUaHJlYWRNYW5hZ2VyCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXI7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKKyAgfQorfTsKKworLyoKKyAqIFRyYWl0cyBjbGFzc2VzIGZvciBjb250cm9sbGluZyBpZiB3ZSBpbnN0YW50aWF0ZSB0ZW1wbGF0ZWQgb3IgZ2VuZXJpYworICogcHJvdG9jb2wgZmFjdG9yaWVzLCBwcm9jZXNzb3JzLCBjbGllbnRzLCBldGMuCisgKgorICogVGhlIGdvYWwgaXMgdG8gYWxsb3cgdGhlIG91dGVyIHRlc3QgY29kZSB0byBzZWxlY3Qgd2hpY2ggc2VydmVyIHR5cGUgaXMKKyAqIGJlaW5nIHRlc3RlZCwgYW5kIHdoZXRoZXIgb3Igbm90IHdlIGFyZSB0ZXN0aW5nIHRoZSB0ZW1wbGF0ZWQgY2xhc3Nlcywgb3IKKyAqIHRoZSBnZW5lcmljIGNsYXNzZXMuCisgKgorICogRWFjaCBzcGVjaWZpYyB0ZXN0IGNhc2UgY2FuIGNvbnRyb2wgd2hldGhlciB3ZSBjcmVhdGUgYSBjaGlsZCBvciBwYXJlbnQKKyAqIHNlcnZlciwgYW5kIHdoZXRoZXIgd2UgdXNlIFRGcmFtZWRUcmFuc3BvcnQgb3IgVEJ1ZmZlcmVkVHJhbnNwb3J0LgorICovCisKK2NsYXNzIFVudGVtcGxhdGVkVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeTsKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2wgUHJvdG9jb2w7CisKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yIFBhcmVudFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VQcm9jZXNzb3IgQ2hpbGRQcm9jZXNzb3I7CisgIHR5cGVkZWYgUGFyZW50U2VydmljZUNsaWVudCBQYXJlbnRDbGllbnQ7CisgIHR5cGVkZWYgQ2hpbGRTZXJ2aWNlQ2xpZW50IENoaWxkQ2xpZW50OworfTsKKworY2xhc3MgVGVtcGxhdGVkVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VEJ1ZmZlckJhc2U+IFByb3RvY29sOworCisgIHR5cGVkZWYgUGFyZW50U2VydmljZVByb2Nlc3NvclQ8UHJvdG9jb2w+IFBhcmVudFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VQcm9jZXNzb3JUPFByb3RvY29sPiBDaGlsZFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlQ2xpZW50VDxQcm90b2NvbD4gUGFyZW50Q2xpZW50OworICB0eXBlZGVmIENoaWxkU2VydmljZUNsaWVudFQ8UHJvdG9jb2w+IENoaWxkQ2xpZW50OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXz4KK2NsYXNzIFBhcmVudFNlcnZpY2VUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UGFyZW50UHJvY2Vzc29yIFByb2Nlc3NvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlBhcmVudENsaWVudCBDbGllbnQ7CisgIHR5cGVkZWYgUGFyZW50SGFuZGxlciBIYW5kbGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgorY2xhc3MgQ2hpbGRTZXJ2aWNlVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OkNoaWxkUHJvY2Vzc29yIFByb2Nlc3NvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OkNoaWxkQ2xpZW50IENsaWVudDsKKyAgdHlwZWRlZiBDaGlsZEhhbmRsZXIgSGFuZGxlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlByb3RvY29sIFByb3RvY29sOworfTsKKworLy8gVE9ETzogSXQgd291bGQgYmUgbmljZXIgaWYgdGhlIFRUcmFuc3BvcnRGYWN0b3J5IHR5cGVzIGRlZmluZWQgYSB0eXBlZGVmLAorLy8gdG8gYWxsb3cgdXMgdG8gZmlndXJlIG91dCB0aGUgZXhhY3QgdHJhbnNwb3J0IHR5cGUgd2l0aG91dCBoYXZpbmcgdG8gcGFzcyBpdAorLy8gaW4gYXMgYSBzZXBhcmF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KKy8vCisvLyBJdCB3b3VsZCBhbHNvIGJlIG5pZWMgaWYgdGhleSB1c2VkIGNvdmFyaWFudCByZXR1cm4gdHlwZXMuICBVbmZvcnR1bmF0ZWx5LAorLy8gc2luY2UgdGhleSByZXR1cm4gc2hhcmVkX3B0ciBpbnN0ZWFkIG9mIHJhdyBwb2ludGVycywgY292YXJpYW50IHJldHVybiB0eXBlcworLy8gd29uJ3Qgd29yay4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFRyYW5zcG9ydEZhY3RvcnlfID0gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0XyA9IFRGcmFtZWRUcmFuc3BvcnQ+CitjbGFzcyBTZXJ2aWNlU3RhdGUgOiBwdWJsaWMgU2VydmVyU3RhdGUgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpDbGllbnQgQ2xpZW50OworICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpIYW5kbGVyIEhhbmRsZXI7CisKKyAgU2VydmljZVN0YXRlKCkKKyAgICA6IHBvcnRfKDApLAorICAgICAgbG9nXyhuZXcgRXZlbnRMb2cpLAorICAgICAgaGFuZGxlcl8obmV3IEhhbmRsZXIobG9nXykpLAorICAgICAgcHJvY2Vzc29yXyhuZXcgUHJvY2Vzc29yKGhhbmRsZXJfKSksCisgICAgICB0cmFuc3BvcnRGYWN0b3J5XyhuZXcgVHJhbnNwb3J0RmFjdG9yeV8pLAorICAgICAgcHJvdG9jb2xGYWN0b3J5XyhuZXcgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb3RvY29sRmFjdG9yeSksCisgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfKG5ldyBTZXJ2ZXJFdmVudEhhbmRsZXIobG9nXykpLAorICAgICAgcHJvY2Vzc29yRXZlbnRIYW5kbGVyXyhuZXcgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGxvZ18pKSB7CisgICAgcHJvY2Vzc29yXy0+c2V0RXZlbnRIYW5kbGVyKHByb2Nlc3NvckV2ZW50SGFuZGxlcl8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSB7CisgICAgU2VydmVyVHJhaXRzXyBzZXJ2ZXJUcmFpdHM7CisgICAgcmV0dXJuIHNlcnZlclRyYWl0cy5jcmVhdGVTZXJ2ZXIocHJvY2Vzc29yXywgcG9ydCwgdHJhbnNwb3J0RmFjdG9yeV8sIHByb3RvY29sRmFjdG9yeV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KKworICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsgcG9ydF8gPSBwb3J0OyB9CisKKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgZ2V0TG9nKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY3JlYXRlQ2xpZW50KCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb3RvY29sIFByb3RvY29sOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm90b2NvbD4gcHJvdG9jb2wobmV3IFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIHRyYW5zcG9ydC0+b3BlbigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQocHJvdG9jb2wpKTsKKyAgICByZXR1cm4gY2xpZW50OworICB9CisKK3ByaXZhdGU6CisgIHVpbnQxNl90IHBvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKK307CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgaW4gdGhlIGxvZworICovCit2b2lkIGNoZWNrTm9FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CisgIC8vIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggYSB2ZXJ5IHNob3J0IHRpbWVvdXQgcGVyaW9kLiAgV2UgZG9uJ3QgZXhwZWN0CisgIC8vIGFueXRoaW5nIHRvIGJlIHByZXNlbnQsIHNvIHdlIHdpbGwgbm9ybWFsbHkgd2FpdCBmb3IgdGhlIGZ1bGwgdGltZW91dC4KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGEgbm9uLXplcm8gdGltZW91dCBpcyBuaWNlIHNpbmNlIGl0IGRvZXMgZ2l2ZSBhIHNob3J0CisgIC8vIHdpbmRvdyBmb3IgZXZlbnRzIHRvIGFycml2ZSBpbiBjYXNlIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9MT0dfRU5ELCBldmVudC50eXBlKTsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuCisgKgorICogUmV0dXJucyB0aGUgY29ubmVjdGlvbiBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgeworICAvLyBDaGVjayBmb3IgYW4gRVRfQ09OTl9DUkVBVEVEIGV2ZW50CisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoMjUwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGV2ZW50LnR5cGUpOworCisgIC8vIFNvbWUgc2VydmVycyBjYWxsIHRoZSBwcm9jZXNzQ29udGV4dCgpIGhvb2sgaW1tZWRpYXRlbHkuCisgIC8vIE90aGVycyAoVE5vbmJsb2NraW5nU2VydmVyKSBvbmx5IGNhbGwgaXQgb25jZSBhIGZ1bGwgcmVxdWVzdCBpcyByZWNlaXZlZC4KKyAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIGl0IHlldCwgdG8gYWxsb3cgZWl0aGVyIGJlaGF2aW9yLgorCisgIHJldHVybiBldmVudC5jb25uZWN0aW9uSWQ7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAqLwordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CisgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKworICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNhbGwgaXMgcmVjZWl2ZWQKKyAqIGFuZCB0aGUgaGFuZGxlciBpcyBpbnZva2VkLgorICoKKyAqIEl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnl0aGluZyBhZnRlciB0aGUgaGFuZGxlciBpbnZvY2F0aW9uLgorICoKKyAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3VpbnQzMl90IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsTmFtZSkgeworICAvLyBDYWxsIHN0YXJ0ZWQKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIHVpbnQzMl90IGNhbGxJZCA9IGV2ZW50LmNhbGxJZDsKKworICAvLyBQcmUtcmVhZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gUG9zdC1yZWFkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gSGFuZGxlciBpbnZvY2F0aW9uCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbFR5cGUsIGV2ZW50LnR5cGUpOworICAvLyBUaGUgaGFuZGxlciBkb2Vzbid0IGhhdmUgYW55IGNvbm5lY3Rpb24gb3IgY2FsbCBjb250ZXh0LAorICAvLyBzbyB0aGUgY29ubmVjdGlvbklkIGFuZCBjYWxsSWQgaW4gdGhpcyBldmVudCBhcmVuJ3QgdmFsaWQKKworICByZXR1cm4gY2FsbElkOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGFmdGVyIGEgaGFuZGxlciByZXR1cm5zLgorICovCit2b2lkIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKKyAgLy8gUHJlLXdyaXRlCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gUG9zdC13cml0ZQorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBDYWxsIGZpbmlzaGVkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIEl0IGlzIGFjY2VwdGFibGUgZm9yIHNlcnZlcnMgdG8gY2FsbCBwcm9jZXNzQ29udGV4dCgpIGFnYWluIGltbWVkaWF0ZWx5CisgIC8vIHRvIHN0YXJ0IHdhaXRpbmcgb24gdGhlIG5leHQgcmVxdWVzdC4gIEhvd2V2ZXIsIHNvbWUgc2VydmVycyB3YWl0IGJlZm9yZQorICAvLyBnZXR0aW5nIGVpdGhlciBhIHBhcnRpYWwgcmVxdWVzdCBvciB0aGUgZnVsbCByZXF1ZXN0IGJlZm9yZSBjYWxsaW5nCisgIC8vIHByb2Nlc3NDb250ZXh0KCkuICBXZSBkb24ndCBjaGVjayBmb3IgdGhlIG5leHQgY2FsbCB0byBwcm9jZXNzQ29udGV4dCgpCisgIC8vIHlldC4KK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNhbGwgaXMgbWFkZS4KKyAqCisgKiBUaGlzIGp1c3QgY2FsbHMgY2hlY2tDYWxsSGFuZGxlckV2ZW50cygpIGZvbGxvd2VkIGJ5CisgKiBjaGVja0NhbGxQb3N0SGFuZGxlckV2ZW50cygpLgorICoKKyAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CisgIHVpbnQzMl90IGNhbGxJZCA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxUeXBlLCBjYWxsTmFtZSk7CisgIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBjYWxsSWQsIGNhbGxOYW1lKTsKKworICByZXR1cm4gY2FsbElkOworfQorCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKyAgbmV3R2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisKKyAgY2xpZW50LT5hZGRTdHJpbmcoImZvbyIpOworICBjbGllbnQtPmFkZFN0cmluZygiYmFyIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJhc2RmIik7CisKKyAgdmVjdG9yPHN0cmluZz4gc3RyaW5nczsKKyAgY2xpZW50LT5nZXRTdHJpbmdzKHN0cmluZ3MpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKDMsIHN0cmluZ3Muc2l6ZSgpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgiZm9vIiwgc3RyaW5nc1swXSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoImJhciIsIHN0cmluZ3NbMV0pOworICBCT09TVF9SRVFVSVJFX0VRVUFMKCJhc2RmIiwgc3RyaW5nc1syXSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZV8+Cit2b2lkIHRlc3RDaGlsZFNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworCisgIC8vIFRlc3QgY2FsbGluZyBzb21lIG9mIHRoZSBwYXJlbnQgbWV0aGlkcyB2aWEgdGhlIGEgY2hpbGQgY2xpZW50CisgIGludDMyX3QgZ2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIGludDMyX3QgbmV3R2VuID0gY2xpZW50LT5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisgIG5ld0dlbiA9IGNsaWVudC0+Z2V0R2VuZXJhdGlvbigpOworICBCT09TVF9DSEVDS19FUVVBTChnZW4gKyAxLCBuZXdHZW4pOworCisgIC8vIFRlc3Qgc29tZSBvZiB0aGUgY2hpbGQgbWV0aG9kcworICBjbGllbnQtPnNldFZhbHVlKDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAsIGNsaWVudC0+Z2V0VmFsdWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwLCBjbGllbnQtPnNldFZhbHVlKDk5KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDk5LCBjbGllbnQtPmdldFZhbHVlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEJhc2ljU2VydmljZSgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICB0ZXN0UGFyZW50U2VydmljZShzdGF0ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0SW5oZXJpdGVkU2VydmljZSgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIHRlc3RQYXJlbnRTZXJ2aWNlKHN0YXRlKTsKKyAgdGVzdENoaWxkU2VydmljZShzdGF0ZSk7Cit9CisKKy8qKgorICogVGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgVFNlcnZlckV2ZW50SGFuZGxlciBhbmQgVFByb2Nlc3NvckV2ZW50SGFuZGxlcgorICogbWV0aG9kcyBhcmUgaW52b2tlZCBpbiB0aGUgY29ycmVjdCBvcmRlciB3aXRoIHRoZSBhY3R1YWwgZXZlbnRzLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEV2ZW50U2VxdWVuY2luZygpIHsKKyAgLy8gV2UgdXNlIFRCdWZmZXJlZFRyYW5zcG9ydCBmb3IgdGhpcyB0ZXN0LCBpbnN0ZWFkIG9mIFRGcmFtZWRUcmFuc3BvcnQuCisgIC8vIFRoaXMgd2F5IHRoZSBzZXJ2ZXIgd2lsbCBzdGFydCBwcm9jZXNzaW5nIGRhdGEgYXMgc29vbiBhcyBpdCBpcyByZWNlaXZlZCwKKyAgLy8gaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgZnVsbCByZXF1ZXN0LiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gd2UgY2FuCisgIC8vIHNlcGFyYXRlIHRoZSBwcmVSZWFkKCkgYW5kIHBvc3RSZWFkKCkgZXZlbnRzLgorICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgICAgIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4sCisgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydD4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBNYWtlIHN1cmUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbG9nCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworCisgIC8vIE1ha2Ugc3VyZSBjcmVhdGVDb250ZXh0KCkgaXMgY2FsbGVkIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbgorICAvLyBlc3RhYmxpc2hlZC4gIFdlIG9wZW4gYSBwbGFpbiBzb2NrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNsaWVudC4KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzb2NrZXQtPm9wZW4oKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBldmVudHMgb2NjdXJyZWQgYWZ0ZXIgYSBuZXcgY29ubmVjdGlvbgorICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIGEgbWVzc2FnZSBoZWFkZXIuICBXZSBtYW51YWxseSBjb25zdHJ1Y3QgdGhlIHJlcXVlc3Qgc28gdGhhdCB3ZQorICAvLyBjYW4gdGVzdCB0aGUgdGltaW5nIGZvciB0aGUgcHJlUmVhZCgpIGNhbGwuCisgIHN0cmluZyByZXF1ZXN0TmFtZSA9ICJnZXREYXRhV2FpdCI7CisgIHN0cmluZyBldmVudE5hbWUgPSAiUGFyZW50U2VydmljZS5nZXREYXRhV2FpdCI7CisgIGludDMyX3Qgc2VxaWQgPSBpbnQzMl90KHRpbWUoTlVMTCkpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc29ja2V0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4ocmVxdWVzdE5hbWUsIFRfQ0FMTCwgc2VxaWQpOworICBzb2NrZXQtPmZsdXNoKCk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIHNhdyB0aGUgY2FsbCBzdGFydGVkIGFuZCBwcmUtcmVhZCBldmVudHMKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICB1aW50MzJfdCBjYWxsSWQgPSBldmVudC5jYWxsSWQ7CisKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1JFQUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG5ldyBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QKKyAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiUGFyZW50U2VydmljZV9nZXREYXRhTm90aWZpZWRfcGFyZ3MiKTsKKyAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKCJsZW5ndGgiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAxKTsKKyAgcHJvdG9jb2wud3JpdGVJMzIoOCAqIDEwMjQgKiAxMDI0KTsKKyAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICBwcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgc29ja2V0LT53cml0ZUVuZCgpOworICBzb2NrZXQtPmZsdXNoKCk7CisKKyAgLy8gV2Ugc2hvdWxkIHRoZW4gc2VlIHBvc3RSZWFkKCkKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gVGhlbiB0aGUgaGFuZGxlciBzaG91bGQgYmUgaW52b2tlZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9EQVRBX1dBSVQsIGV2ZW50LnR5cGUpOworCisgIC8vIFRoZSBoYW5kbGVyIHdvbid0IHJlc3BvbmQgdW50aWwgd2Ugbm90aWZ5IGl0LgorICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzLgorICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gTm90aWZ5IHRoZSBoYW5kbGVyIHRoYXQgaXQgc2hvdWxkIHJldHVybgorICAvLyBXZSBqdXN0IHVzZSBhIGdsb2JhbCBsb2NrIGZvciBub3csIHNpbmNlIGl0IGlzIGVhc2llc3QKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+dHJpZ2dlclBlbmRpbmdDYWxscygpOworCisgIC8vIFRoZSBoYW5kbGVyIHdpbGwgbG9nIGEgc2VwYXJhdGUgZXZlbnQgYmVmb3JlIGl0IHJldHVybnMKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfV0FJVF9SRVRVUk4sIGV2ZW50LnR5cGUpOworCisgIC8vIFdlIHNob3VsZCB0aGVuIHNlZSBwcmVXcml0ZSgpCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV2ZW50TmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworCisgIC8vIFdlIHJlcXVlc3RlZCBtb3JlIGRhdGEgdGhhbiBjYW4gYmUgYnVmZmVyZWQsIGFuZCB3ZSBhcmVuJ3QgcmVhZGluZyBpdCwKKyAgLy8gc28gdGhlIHNlcnZlciBzaG91bGRuJ3QgYmUgYWJsZSB0byBmaW5pc2ggaXRzIHdyaXRlIHlldC4KKyAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cy4KKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGhlYWRlcgorICBzdHJpbmcgcmVzcG9uc2VOYW1lOworICBpbnQzMl90IHJlc3BvbnNlU2VxaWQgPSAwOworICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSByZXNwb25zZVR5cGU7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4ocmVzcG9uc2VOYW1lLCByZXNwb25zZVR5cGUsIHJlc3BvbnNlU2VxaWQpOworICBCT09TVF9DSEVDS19FUVVBTChyZXNwb25zZVNlcWlkLCBzZXFpZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlcXVlc3ROYW1lLCByZXNwb25zZU5hbWUpOworICBCT09TVF9DSEVDS19FUVVBTChyZXNwb25zZVR5cGUsIFRfUkVQTFkpOworICAvLyBSZWFkIHRoZSBib2R5LiAgV2UganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4KKyAgcHJvdG9jb2wuc2tpcChUX1NUUlVDVCk7CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSByZWFkLCB0aGUgc2VydmVyIHNob3VsZCBoYXZlIGZpbmlzaGVkIHNlbmRpbmcgdGhlIGRhdGEKKyAgLy8gYW5kIGNhbGxlZCB0aGUgcG9zdFdyaXRlKCkgaGFuZGxlcgorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gQ2FsbCBmaW5pc2hlZCBzaG91bGQgYmUgbGFzdAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYSBjb25uZWN0aW9uIGRlc3Ryb3llZCBldmVudAorICBzb2NrZXQtPmNsb3NlKCk7CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGV2ZW50cworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0U2VwYXJhdGVDb25uZWN0aW9ucygpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBDcmVhdGUgYSBjbGllbnQKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKKyAgdWludDMyX3QgY2xpZW50MUlkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CisKKyAgLy8gQ3JlYXRlIGEgc2Vjb25kIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAorICB1aW50MzJfdCBjbGllbnQySWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBUaGUgdHdvIGNvbm5lY3Rpb25zIHNob3VsZCBoYXZlIGRpZmZlcmVudCBJRHMKKyAgQk9PU1RfQ0hFQ0tfTkUoY2xpZW50MUlkLCBjbGllbnQySWQpOworCisgIC8vIE1ha2UgYSBjYWxsLCBhbmQgY2hlY2sgZm9yIHRoZSBwcm9wZXIgZXZlbnRzCisgIGludDMyX3QgdmFsdWUgPSA1OworICBjbGllbnQxLT5zZXRWYWx1ZSh2YWx1ZSk7CisgIHVpbnQzMl90IGNhbGwxCisgICAgICA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLCAiQ2hpbGRTZXJ2aWNlLnNldFZhbHVlIik7CisKKyAgLy8gTWFrZSBhIGNhbGwgd2l0aCBjbGllbnQyCisgIGludDMyX3QgdiA9IGNsaWVudDItPmdldFZhbHVlKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKKyAgY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MklkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKworICAvLyBNYWtlIGFub3RoZXIgY2FsbCB3aXRoIGNsaWVudDEKKyAgdiA9IGNsaWVudDEtPmdldFZhbHVlKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKKyAgdWludDMyX3QgY2FsbDIKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoY2FsbDEsIGNhbGwyKTsKKworICAvLyBDbG9zZSB0aGUgc2Vjb25kIGNsaWVudCwgYW5kIGNoZWNrIGZvciB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCisgIGNsaWVudDIucmVzZXQoKTsKKyAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNsaWVudDJJZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0T25ld2F5Q2FsbCgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBDcmVhdGUgYSBjbGllbnQKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CisKKyAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCisgIC8vIEl0IHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHksIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIncyBoYW5kbGVyCisgIC8vIHdvbid0IHJldHVybiByaWdodCBhd2F5CisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisgIGNsaWVudC0+b25ld2F5V2FpdCgpOworICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS5vbmV3YXlXYWl0IjsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGFzeW5jIGNvbXBsZXRlIGV2ZW50LCB0aGVuIGNhbGwgZmluaXNoZWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQVNZTkNfQ09NUExFVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RFeHBlY3RlZEVycm9yKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIHRoZSBleGNlcHRpb25XYWl0KCkgY2FsbAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworICBzdHJpbmcgbWVzc2FnZSA9ICJ0ZXN0IDEyMzQgdGVzdCI7CisgIGNsaWVudC0+c2VuZF9leGNlcHRpb25XYWl0KG1lc3NhZ2UpOworICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS5leGNlcHRpb25XYWl0IjsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHJlY2VpdmUgdGhlIHJlc3BvbnNlCisgIHRyeSB7CisgICAgY2xpZW50LT5yZWN2X2V4Y2VwdGlvbldhaXQoKTsKKyAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBNeUVycm9yIHRvIGJlIHRocm93biIpOworICB9IGNhdGNoIChjb25zdCBNeUVycm9yJiBlKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSwgZS5tZXNzYWdlKTsKKyAgICAvLyBDaGVjayBpZiBzdGQ6OmV4Y2VwdGlvbjo6d2hhdCgpIGlzIGhhbmRsZWQgcHJvcGVybHkKKyAgICBzaXplX3QgbWVzc2FnZV9wb3MgPSBzdHJpbmcoZS53aGF0KCkpLmZpbmQoIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IE15RXJyb3IiKTsKKyAgICBCT09TVF9DSEVDS19ORShtZXNzYWdlX3Bvcywgc3RyaW5nOjpucG9zKTsKKyAgfQorCisgIC8vIE5vdyB3ZSBzaG91bGQgc2VlIHRoZSBldmVudHMgZm9yIGEgbm9ybWFsIGNhbGwgZmluaXNoCisgIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBjYWxsSWQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBEZXN0cm95IHRoZSBjbGllbnQsIGFuZCBjaGVjayBmb3IgY29ubmVjdGlvbiBjbG9zZWQgZXZlbnRzCisgIGNsaWVudC5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY29ubklkKTsKKworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0VW5leHBlY3RlZEVycm9yKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIHRoZSB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCgpIGNhbGwKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKKyAgc3RyaW5nIG1lc3NhZ2UgPSAiMTIzNCB0ZXN0IDU2NzgiOworICBjbGllbnQtPnNlbmRfdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQobWVzc2FnZSk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLnVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0IjsKKyAgdWludDMyX3QgY2FsbElkCisgICAgICA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIEV2ZW50TG9nOjpFVF9DQUxMX1VORVhQRUNURURfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHJlY2VpdmUgdGhlIHJlc3BvbnNlCisgIHRyeSB7CisgICAgY2xpZW50LT5yZWN2X3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCk7CisgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXJyb3IgdG8gYmUgdGhyb3duIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYpIHsKKyAgfQorCisgIC8vIE5vdyB3ZSBzaG91bGQgc2VlIGEgaGFuZGxlciBlcnJvciBldmVudAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9IQU5ETEVSX0VSUk9SLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBwcmUtd3JpdGUgYW5kIHBvc3Qtd3JpdGUgZXZlbnRzIGFyZW4ndCBnZW5lcmF0ZWQgYWZ0ZXIgYSBoYW5kbGVyIGVycm9yCisgIC8vIChFdmVuIGZvciBub24tb25ld2F5IGNhbGxzIHdoZXJlIGEgcmVzcG9uc2UgaXMgd3JpdHRlbi4pCisgIC8vCisgIC8vIEEgY2FsbCBmaW5pc2hlZCBldmVudCBpcyBsb2dnZWQgd2hlbiB0aGUgY2FsbCBjb250ZXh0IGlzIGRlc3Ryb3llZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBEZXN0cm95IHRoZSBjbGllbnQsIGFuZCBjaGVjayBmb3IgY29ubmVjdGlvbiBjbG9zZWQgZXZlbnRzCisgIGNsaWVudC5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY29ubklkKTsKKworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKKy8vIE1hY3JvIHRvIGRlZmluZSBzaW1wbGUgdGVzdHMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGFsbCBzZXJ2ZXIgdHlwZXMKKyNkZWZpbmUgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2Jhc2ljU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2luaGVyaXRlZFNlcnZpY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0SW5oZXJpdGVkU2VydmljZTxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX29uZXdheSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0T25ld2F5Q2FsbDxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0VW5leHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBUZXN0cyB0aGF0IHJlcXVpcmUgdGhlIHNlcnZlciB0byBwcm9jZXNzIG11bHRpcGxlIGNvbm5lY3Rpb25zIGNvbmN1cnJlbnRseQorLy8gKGkuZS4sIG5vdCBUU2ltcGxlU2VydmVyKQorI2RlZmluZSBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfc2VwYXJhdGVDb25uZWN0aW9ucykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RTZXBhcmF0ZUNvbm5lY3Rpb25zPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFRoZSB0ZXN0RXZlbnRTZXF1ZW5jaW5nKCkgdGVzdCBtYW51YWxseSBnZW5lcmF0ZXMgYSByZXF1ZXN0IGZvciB0aGUgc2VydmVyLAorLy8gYW5kIGRvZXNuJ3Qgd29yayB3aXRoIFRGcmFtZWRUcmFuc3BvcnQuICBUaGVyZWZvcmUgd2UgY2FuJ3QgdGVzdCBpdCB3aXRoCisvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIuCisjZGVmaW5lIERFRklORV9OT0ZSQU1FX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19ldmVudFNlcXVlbmNpbmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdEV2ZW50U2VxdWVuY2luZzxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkKKworI2RlZmluZSBERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfTk9GUkFNRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKQorCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkZWRTZXJ2ZXIsIFRlbXBsYXRlZCkKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRlZFNlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkUG9vbFNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZFBvb2xTZXJ2ZXIsIFVudGVtcGxhdGVkKQorCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXIsIFVudGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHMsIFRlbXBsYXRlZCkKK0RFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzLCBVbnRlbXBsYXRlZCkKKworREVGSU5FX1NJTVBMRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfU0lNUExFX1RFU1RTKFRTaW1wbGVTZXJ2ZXIsIFVudGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpCisKKy8vIFRPRE86IFdlIHNob3VsZCB0ZXN0IFRFdmVudFNlcnZlciBpbiB0aGUgZnV0dXJlLgorLy8gRm9yIG5vdywgaXQgaXMga25vd24gbm90IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggVFByb2Nlc3NvckV2ZW50SGFuZGxlci4KKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFlYzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXworI2RlZmluZSBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX1RDQ18gMQorCisjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCit2b2lkIFNlcnZlclRocmVhZDo6c3RhcnQoKSB7CisgIGFzc2VydCghcnVubmluZ18pOworICBydW5uaW5nXyA9IHRydWU7CisKKyAgaGVscGVyXy5yZXNldChuZXcgSGVscGVyKHRoaXMpKTsKKworICAvLyBTdGFydCB0aGUgb3RoZXIgdGhyZWFkCisgIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKKyAgdGhyZWFkRmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisgIHRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChoZWxwZXJfKTsKKworICB0aHJlYWRfLT5zdGFydCgpOworCisgIC8vIFdhaXQgb24gdGhlIG90aGVyIHRocmVhZCB0byB0ZWxsIHVzIHRoYXQgaXQgaGFzIHN1Y2Nlc3NmdWxseQorICAvLyBib3VuZCB0byB0aGUgcG9ydCBhbmQgc3RhcnRlZCBsaXN0ZW5pbmcgKG9yIHVudGlsIGFuIGVycm9yIG9jY3VycykuCisgIGNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhzZXJ2ZXJNb25pdG9yXyk7CisgIHdoaWxlICghc2VydmluZ18gJiYgIWVycm9yXykgeworICAgIHNlcnZlck1vbml0b3JfLndhaXRGb3JldmVyKCk7CisgIH0KKworICBpZiAoZXJyb3JfKSB7CisgICAgdGhyb3cgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYmluZCBvbiBzZXJ2ZXIgc29ja2V0Iik7CisgIH0KK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnN0b3AoKSB7CisgIGlmICghcnVubmluZ18pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUZWxsIHRoZSBzZXJ2ZXIgdG8gc3RvcAorICBzZXJ2ZXJfLT5zdG9wKCk7CisgIHJ1bm5pbmdfID0gZmFsc2U7CisKKyAgLy8gV2FpdCBmb3IgdGhlIHNlcnZlciB0aHJlYWQgdG8gZXhpdAorICAvLworICAvLyBOb3RlOiB0aGlzIG9ubHkgd29ya3MgaWYgYWxsIGNsaWVudCBjb25uZWN0aW9ucyBoYXZlIGNsb3NlZC4gIFRoZSBzZXJ2ZXJzCisgIC8vIGdlbmVyYWxseSB3YWl0IGZvciBldmVyeXRoaW5nIHRvIGJlIGNsb3NlZCBiZWZvcmUgZXhpdGluZzsgdGhlcmUgY3VycmVudGx5CisgIC8vIGlzbid0IGEgd2F5IHRvIHRlbGwgdGhlbSB0byBqdXN0IGV4aXQgbm93LCBhbmQgc2h1dCBkb3duIGV4aXN0aW5nCisgIC8vIGNvbm5lY3Rpb25zLgorICB0aHJlYWRfLT5qb2luKCk7Cit9CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpydW4oKSB7CisgIC8qCisgICAqIFRyeSBiaW5kaW5nIHRvIHNldmVyYWwgcG9ydHMsIGluIGNhc2UgdGhlIG9uZSB3ZSB3YW50IGlzIGFscmVhZHkgaW4gdXNlLgorICAgKi8KKyAgcG9ydF8gPSAxMjM0NTsKKyAgdW5zaWduZWQgaW50IG1heFJldHJpZXMgPSAxMDsKKyAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBtYXhSZXRyaWVzOyArK24pIHsKKyAgICAvLyBDcmVhdGUgdGhlIHNlcnZlcgorICAgIHNlcnZlcl8gPSBzZXJ2ZXJTdGF0ZV8tPmNyZWF0ZVNlcnZlcihwb3J0Xyk7CisgICAgLy8gSW5zdGFsbCBvdXIgaGVscGVyIGFzIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlciwgc28gdGhhdCBvdXIKKyAgICAvLyBwcmVTZXJ2ZSgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbmNlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBib3VuZCB0bworICAgIC8vIHRoZSBwb3J0IGFuZCBhcmUgYWJvdXQgdG8gc3RhcnQgbGlzdGVuaW5nLgorICAgIHNlcnZlcl8tPnNldFNlcnZlckV2ZW50SGFuZGxlcihoZWxwZXJfKTsKKworICAgIHRyeSB7CisgICAgICAvLyBUcnkgdG8gc2VydmUgcmVxdWVzdHMKKyAgICAgIHNlcnZlcl8tPnNlcnZlKCk7CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd3MgYSBnZW5lcmljIFRFeGNlcHRpb24gaWYgaXQgZmFpbHMgdG8gYmluZC4KKyAgICAgIC8vIElmIHdlIGdldCBhIFRFeGNlcHRpb24sIHdlJ2xsIG9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGUgYmluZCBmYWlsZWQuCisgICAgICArK3BvcnRfOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gU2VyaW91c2x5PyAgc2VydmUoKSBpcyBwcmV0dHkgbGFtZS4gIElmIGl0IGZhaWxzIHRvIHN0YXJ0IHNlcnZpbmcgaXQKKyAgICAvLyBqdXN0IHJldHVybnMgcmF0aGVyIHRoYW4gdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgIC8vCisgICAgLy8gV2UgaGF2ZSB0byB1c2Ugb3VyIHByZVNlcnZlKCkgaG9vayB0byB0ZWxsIGlmIHNlcnZlKCkgc3VjY2Vzc2Z1bGx5CisgICAgLy8gc3RhcnRlZCBzZXJ2aW5nIGFuZCBpcyByZXR1cm5pbmcgYmVjYXVzZSBzdG9wKCkgaXMgY2FsbGVkLCBvciBpZiBpdCBqdXN0CisgICAgLy8gZmFpbGVkIHRvIHN0YXJ0IHNlcnZpbmcgaW4gdGhlIGZpcnN0IHBsYWNlLgorICAgIGNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhzZXJ2ZXJNb25pdG9yXyk7CisgICAgaWYgKHNlcnZpbmdfKSB7CisgICAgICAvLyBPaCBnb29kLCB3ZSBzdGFydGVkIHNlcnZpbmcgYW5kIGFyZSBleGl0aW5nIGJlY2F1c2UKKyAgICAgIC8vIHdlJ3JlIHRyeWluZyB0byBzdG9wLgorICAgICAgc2VydmluZ18gPSBmYWxzZTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgbmV2ZXIgc3RhcnRlZCBzZXJ2aW5nLCBwcm9iYWJseSBiZWNhdXNlIHdlIGZhaWxlZCB0byBiaW5kIHRvIHRoZQorICAgICAgLy8gcG9ydC4gIEluY3JlbWVudCB0aGUgcG9ydCBudW1iZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICsrcG9ydF87CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKworICAvLyBXZSBmYWlsZWQgdG8gYmluZCBvbiBhbnkgcG9ydC4KKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgZXJyb3JfID0gdHJ1ZTsKKyAgc2VydmVyTW9uaXRvcl8ubm90aWZ5KCk7Cit9CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpwcmVTZXJ2ZSgpIHsKKyAgLy8gV2UgYm91bmQgdG8gdGhlIHBvcnQgc3VjY2Vzc2Z1bGx5LCBhbmQgYXJlIGFib3V0IHRvIHN0YXJ0IHNlcnZpbmcgcmVxdWVzdHMKKyAgc2VydmVyU3RhdGVfLT5iaW5kU3VjY2Vzc2Z1bChwb3J0Xyk7CisKKyAgLy8gU2V0IHRoZSByZWFsIHNlcnZlciBldmVudCBoYW5kbGVyIChyZXBsYWNpbmcgb3Vyc2VsZikKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyCisgICAgICA9IHNlcnZlclN0YXRlXy0+Z2V0U2VydmVyRXZlbnRIYW5kbGVyKCk7CisgIHNlcnZlcl8tPnNldFNlcnZlckV2ZW50SGFuZGxlcihzZXJ2ZXJFdmVudEhhbmRsZXIpOworCisgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNlcnZpbmcgcmVxdWVzdHMKKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgc2VydmluZ18gPSB0cnVlOworICBzZXJ2ZXJNb25pdG9yXy5ub3RpZnkoKTsKKworICAvLyBJbnZva2UgcHJlU2VydmUoKSBvbiB0aGUgcmVhbCBldmVudCBoYW5kbGVyLCBzaW5jZSB3ZSBhdGUKKyAgLy8gdGhlIG9yaWdpbmFsIHByZVNlcnZlKCkgZXZlbnQuCisgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIpIHsKKyAgICBzZXJ2ZXJFdmVudEhhbmRsZXItPnByZVNlcnZlKCk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMzFhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9IXworI2RlZmluZSBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byB0ZWxsIFNlcnZlclRocmVhZCBob3cgdG8gY3JlYXRlIHRoZSBzZXJ2ZXIKKyAqLworY2xhc3MgU2VydmVyU3RhdGUgeworcHVibGljOgorICB2aXJ0dWFsIH5TZXJ2ZXJTdGF0ZSgpIHt9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHNlcnZlciB0byBsaXN0ZW4gb24gdGhlIHNwZWNpZmllZCBwb3J0LgorICAgKgorICAgKiBJZiB0aGUgc2VydmVyIHJldHVybmVkIGZhaWxzIHRvIGJpbmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IHdoZW4gc2VydmUoKSBpcworICAgKiBjYWxsZWQgb24gaXQsIGNyZWF0ZVNlcnZlcigpIG1heSBiZSBjYWxsZWQgYWdhaW4gb24gYSBkaWZmZXJlbnQgcG9ydC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpID0gMDsKKworICAvKioKKyAgICogR2V0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIHRvIHNldCBvbiB0aGUgc2VydmVyLgorICAgKgorICAgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgc3VjY2Vzc2Z1bGx5IGJpbmRzIGFuZCBpcyBhYm91dCB0bworICAgKiBzdGFydCBzZXJ2aW5nIHRyYWZmaWMuICBJdCBpcyBpbnZva2VkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQsIHJhdGhlciB0aGFuCisgICAqIHRoZSBtYWluIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPigpOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUgc2VydmVyIHRocmVhZCBhZnRlciBzZXJ2ZXIgYmluZGluZyBzdWNjZWVkcy4KKyAgICoKKyAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSB3aXNoIHRvIHJlY29yZCB0aGUgZmluYWwKKyAgICogcG9ydCB0aGF0IHdhcyB1c2VkIGZvciB0aGUgc2VydmVyLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IC8qcG9ydCovKSB7fQorfTsKKworLyoqCisgKiBTZXJ2ZXJUaHJlYWQgc3RhcnRzIGEgdGhyaWZ0IHNlcnZlciBydW5uaW5nIGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICovCitjbGFzcyBTZXJ2ZXJUaHJlYWQgeworcHVibGljOgorICBTZXJ2ZXJUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiYgc3RhdGUsIGJvb2wgYXV0b1N0YXJ0KQorICAgIDogcG9ydF8oMCksCisgICAgICBydW5uaW5nXyhmYWxzZSksCisgICAgICBzZXJ2aW5nXyhmYWxzZSksCisgICAgICBlcnJvcl8oZmFsc2UpLAorICAgICAgc2VydmVyU3RhdGVfKHN0YXRlKSB7CisgICAgaWYgKGF1dG9TdGFydCkgeworICAgICAgc3RhcnQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOworCisgIHVpbnQxNl90IGdldFBvcnQoKSBjb25zdCB7IHJldHVybiBwb3J0XzsgfQorCisgIH5TZXJ2ZXJUaHJlYWQoKSB7CisgICAgaWYgKHJ1bm5pbmdfKSB7CisgICAgICB0cnkgeworICAgICAgICBzdG9wKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZXJyb3Igc2h1dHRpbmcgZG93biBzZXJ2ZXIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBBbm5veWluZy4gIHRocmlmdCBmb3JjZXMgdXMgdG8gdXNlIHNoYXJlZF9wdHIsIHNvIHdlIGhhdmUgdG8gdXNlCisgIC8vIGEgaGVscGVyIGNsYXNzIHRoYXQgd2UgY2FuIGFsbG9jYXRlIG9uIHRoZSBoZWFwIGFuZCBnaXZlIHRvIHRocmlmdC4KKyAgLy8gSXQgd291bGQgYmUgc2ltcGxlciBpZiB3ZSBjb3VsZCBqdXN0IG1ha2UgUnVubmFibGUgYW5kIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgLy8gcHJpdmF0ZSBiYXNlIGNsYXNzZXMgb2YgU2VydmVyVGhyZWFkLgorICBjbGFzcyBIZWxwZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlLCBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgcHVibGljOgorICAgIEhlbHBlcihTZXJ2ZXJUaHJlYWQqIHNlcnZlclRocmVhZCkgOiBzZXJ2ZXJUaHJlYWRfKHNlcnZlclRocmVhZCkge30KKworICAgIHZvaWQgcnVuKCkgeyBzZXJ2ZXJUaHJlYWRfLT5ydW4oKTsgfQorCisgICAgdm9pZCBwcmVTZXJ2ZSgpIHsgc2VydmVyVGhyZWFkXy0+cHJlU2VydmUoKTsgfQorCisgIHByaXZhdGU6CisgICAgU2VydmVyVGhyZWFkKiBzZXJ2ZXJUaHJlYWRfOworICB9OworCisgIHZvaWQgcnVuKCk7CisgIHZvaWQgcHJlU2VydmUoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOworCisgIHVpbnQxNl90IHBvcnRfOworICBib29sIHJ1bm5pbmdfOworICBib29sIHNlcnZpbmdfOworICBib29sIGVycm9yXzsKKyAgY29uY3VycmVuY3k6Ok1vbml0b3Igc2VydmVyTW9uaXRvcl87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL3Byb2MudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2M1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL3Byb2MudGhyaWZ0CkBAIC0wLDAgKzEsMjIgQEAKK25hbWVzcGFjZSBjcHAgYXBhY2hlLnRocmlmdC50ZXN0CisKK2V4Y2VwdGlvbiBNeUVycm9yIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UKK30KKworc2VydmljZSBQYXJlbnRTZXJ2aWNlIHsKKyAgaTMyIGluY3JlbWVudEdlbmVyYXRpb24oKQorICBpMzIgZ2V0R2VuZXJhdGlvbigpCisgIHZvaWQgYWRkU3RyaW5nKDE6IHN0cmluZyBzKQorICBsaXN0PHN0cmluZz4gZ2V0U3RyaW5ncygpCisKKyAgYmluYXJ5IGdldERhdGFXYWl0KDE6IGkzMiBsZW5ndGgpCisgIG9uZXdheSB2b2lkIG9uZXdheVdhaXQoKQorICB2b2lkIGV4Y2VwdGlvbldhaXQoMTogc3RyaW5nIG1lc3NhZ2UpIHRocm93cyAoMjogTXlFcnJvciBlcnJvcikKKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKworc2VydmljZSBDaGlsZFNlcnZpY2UgZXh0ZW5kcyBQYXJlbnRTZXJ2aWNlIHsKKyAgaTMyIHNldFZhbHVlKDE6IGkzMiB2YWx1ZSkKKyAgaTMyIGdldFZhbHVlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM0MWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBUZXN0IE5ldHdvcmspCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1F0NV9TT1VSQ0VTCisgICAgVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0X1F0NSAke1RRVGNwU2VydmVyVGVzdF9RdDVfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0X1F0NSB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdHF0NSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUUVRjcFNlcnZlclRlc3RfUXQ1IFF0NTo6VGVzdCBRdDU6Ok5ldHdvcmspCisKK2FkZF90ZXN0KE5BTUUgVFFUY3BTZXJ2ZXJUZXN0X1F0NSBDT01NQU5EIFRRVGNwU2VydmVyVGVzdF9RdDUpCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRRVGNwU2VydmVyVGVzdAorI2luY2x1ZGUgPFFUZXN0PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8UVRjcFNlcnZlcj4KKyNpbmNsdWRlIDxRVGNwU29ja2V0PgorI2luY2x1ZGUgPFFIb3N0QWRkcmVzcz4KKyNpbmNsdWRlIDxRVGhyZWFkPgorCisjaWZuZGVmIFFfTU9DX1JVTgorICAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorICAjaW5jbHVkZSAidGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIgorCisgICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0cnVjdCBBc3luY0hhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUNvYlN2SWYgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgdmlydHVhbCB2b2lkIGFkZFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIHN0cmluZ3MucHVzaF9iYWNrKHMpOworICAgIGNvYigpOworICB9CisgIHZpcnR1YWwgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IpIHsKKyAgICBjb2Ioc3RyaW5ncyk7CisgIH0KKworICAvLyBPdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7fQorICB2aXJ0dWFsIHZvaWQgb25ld2F5V2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uV2FpdCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KKyAgdmlydHVhbCB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVFFUY3BTZXJ2ZXJUZXN0IDogcHVibGljIFFPYmplY3QgeworICBRX09CSkVDVAorCitwcml2YXRlIHNsb3RzOgorICB2b2lkIGluaXRUZXN0Q2FzZSgpOworICB2b2lkIGNsZWFudXBUZXN0Q2FzZSgpOworICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFFUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgc3RkOjpzaGFyZWRfcHRyPGFzeW5jOjpUUVRjcFNlcnZlcj4gc2VydmVyOworICBzdGQ6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZUNsaWVudD4gY2xpZW50OworfTsKKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmluaXRUZXN0Q2FzZSgpIHsKKyAgLy8gc2V0dXAgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJTb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTZXJ2ZXI+KCk7CisgIHNlcnZlci5yZXNldChuZXcgYXN5bmM6OlRRVGNwU2VydmVyKHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0ZXN0OjpQYXJlbnRTZXJ2aWNlQXN5bmNQcm9jZXNzb3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFzeW5jSGFuZGxlcj4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpKTsKKyAgUVZFUklGWShzZXJ2ZXJTb2NrZXQtPmxpc3RlbihRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCkpOworICBpbnQgcG9ydCA9IHNlcnZlclNvY2tldC0+c2VydmVyUG9ydCgpOworICBRVkVSSUZZKHBvcnQgPiAwKTsKKworICAvL3NldHVwIHNlcnZlciB0aHJlYWQgYW5kIG1vdmUgc2VydmVyIHRvIGl0CisgIHNlcnZlclRocmVhZC5yZXNldChuZXcgUVRocmVhZCgpKTsKKyAgc2VydmVyU29ja2V0LT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyLT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworCisgIC8vIHNldHVwIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0ID0gc3RkOjptYWtlX3NoYXJlZDxRVGNwU29ja2V0PigpOworICBjbGllbnQucmVzZXQobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0Pihzb2NrZXQpKSkpOworICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOworICBRVkVSSUZZKHNvY2tldC0+d2FpdEZvckNvbm5lY3RlZCgpKTsKK30KKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmNsZWFudXBUZXN0Q2FzZSgpIHsKKyAgLy9maXJzdCwgc3RvcCB0aGUgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBzZXJ2ZXIKKyAgc2VydmVyVGhyZWFkLT5xdWl0KCk7CisgIHNlcnZlclRocmVhZC0+d2FpdCgpOworICAvLyBub3csIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKKyAgc2VydmVyLnJlc2V0KCk7CisgIC8vIGRlbGV0ZSB0aHJlYWQgbm93CisgIHNlcnZlclRocmVhZC5yZXNldCgpOworCisgIC8vIGNsZWFudXAgY2xpZW50CisgIGNsaWVudC5yZXNldCgpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6dGVzdF9jb21tdW5pY2F0ZSgpIHsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImZvbyIpOworICBjbGllbnQtPmFkZFN0cmluZygiYmFyIik7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcGx5OworICBjbGllbnQtPmdldFN0cmluZ3MocmVwbHkpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzBdKSwgUVN0cmluZygiZm9vIikpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzFdKSwgUVN0cmluZygiYmFyIikpOworfQorCisKKyNpZiAoUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDUsIDAsIDApKQorUVRFU1RfR1VJTEVTU19NQUlOKFRRVGNwU2VydmVyVGVzdCk7CisjZWxzZQorI3VuZGVmIFFUX0dVSV9MSUIKK1FURVNUX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKKyNlbmRpZgorI2luY2x1ZGUgIlRRVGNwU2VydmVyVGVzdC5tb2MiCmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWUwNTE4OC4uMmM2YTk2OQotLS0gYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdG5iCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1xdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlNjBkODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC1xdC5wYy5pbgpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IFRocmlmdAorRGVzY3JpcHRpb246IFRocmlmdCBRdCBBUEkKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnRxdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXF0NS5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0NS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGIxNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogVGhyaWZ0CitEZXNjcmlwdGlvbjogVGhyaWZ0IFF0NSBBUEkKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnRxdDUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC16LnBjLmluIGIvbGliL2NwcC90aHJpZnQtei5wYy5pbgpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDcyZjQ2YmYuLjQ2N2QyZTEKLS0tIGEvbGliL2NwcC90aHJpZnQtei5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC16LnBjLmluCkBAIC0yNyw0ICsyNyw0IEBACiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0egotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vdGhyaWZ0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQucGMuaW4gYi9saWIvY3BwL3RocmlmdC5wYy5pbgpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDdhZWMwOWYuLmQxMWU2ZGIKLS0tIGEvbGliL2NwcC90aHJpZnQucGMuaW4KKysrIGIvbGliL2NwcC90aHJpZnQucGMuaW4KQEAgLTI2LDQgKzI2LDQgQEAKIERlc2NyaXB0aW9uOiBUaHJpZnQgQysrIEFQSQogVmVyc2lvbjogQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdAotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vdGhyaWZ0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQuc2xuIGIvbGliL2NwcC90aHJpZnQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGY0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC5zbG4KQEAgLTAsMCArMSw2MSBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlidGhyaWZ0bmIiLCAibGlidGhyaWZ0bmIudmN4cHJvaiIsICJ7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlidGhyaWZ0IiwgImxpYnRocmlmdC52Y3hwcm9qIiwgIntERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJkb2MiLCAiZG9jIiwgInswMDY5ODRFMC03Q0MxLTQ3RTItQUNEMi1BNDBGRTREMzg2OTN9IgorCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdAorCQlSRUFETUUubWQgPSBSRUFETUUubWQKKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWctbXR8V2luMzIgPSBEZWJ1Zy1tdHxXaW4zMgorCQlEZWJ1Zy1tdHx4NjQgPSBEZWJ1Zy1tdHx4NjQKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlLW10fFdpbjMyID0gUmVsZWFzZS1tdHxXaW4zMgorCQlSZWxlYXNlLW10fHg2NCA9IFJlbGVhc2UtbXR8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Zy1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5EZWJ1Zy1tdHx4NjQuQWN0aXZlQ2ZnID0gRGVidWctbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fHg2NC5CdWlsZC4wID0gRGVidWctbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NAorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZS1tdHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlLW10fHg2NAorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fHg2NC5CdWlsZC4wID0gUmVsZWFzZS1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWctbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8V2luMzIuQnVpbGQuMCA9IERlYnVnLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LkRlYnVnLW10fHg2NC5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8eDY0LkJ1aWxkLjAgPSBEZWJ1Zy1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0CisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlLW10fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8eDY0CisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlLW10fHg2NAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCmluZGV4IGQ4YTAwN2IuLjU2YThiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMTcsOSArMTcsMTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVENPREU9IFwKK1NVQkRJUlMgPSAuIHRlc3QvTXVsdGlwbGV4CisKK1RIUklGVENPREUgPSBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgXAorICAgICAgICAgICAgc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBcCisgICAgICAgICAgICBzcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCYXNlLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVExpc3QuY3MgXApAQCAtMjgsMTggKzM1LDI0IEBACiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFR5cGUuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RGaWVsZC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RTZXJ2ZXIuY3MgXAorICAgICAgICAgICAgc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgXApAQCAtNDcsMjYgKzYwLDU2IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MgXAogICAgICAgICAgICAgc3JjL1RQcm9jZXNzb3IuY3MgXAorICAgICAgICAgICAgc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MgXAorICAgICAgICAgICAgc3JjL1RFeGNlcHRpb24uY3MgXAogICAgICAgICAgICAgc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwogCi0KLUNTQz1nbWNzCi0KLWlmIE5FVF8yXzAKLU1PTk9fREVGSU5FUz0vZDpORVRfMl8wCitpZiBNT05PX01DUworZXhwb3J0IENTQyA9IG1jcworZWxzZQorZXhwb3J0IENTQyA9IGdtY3MKIGVuZGlmCiAKLWFsbC1sb2NhbDogVGhyaWZ0LmRsbAoraWYgTkVUXzJfMAorZXhwb3J0IENTQ19ERUZJTkVTID0gLWQ6TkVUXzJfMAorZW5kaWYKKworYWxsLWxvY2FsOiBUaHJpZnQuZGxsIFRocmlmdC40NS5kbGwKIAogVGhyaWZ0LmRsbDogJChUSFJJRlRDT0RFKQotCSQoQ1NDKSAkKFRIUklGVENPREUpIC9vdXQ6VGhyaWZ0LmRsbCAvdGFyZ2V0OmxpYnJhcnkgJChNT05PX0RFRklORVMpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCisKK1RocmlmdC40NS5kbGw6ICQoVEhSSUZUQ09ERSkKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtdGFyZ2V0OmxpYnJhcnkgLXJlZmVyZW5jZTpTeXN0ZW0uV2ViICQoVEhSSUZUQ09ERSkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgVGhyaWZ0LmRsbAorCSQoUk0pIFRocmlmdC5kbGwgIFwKKwkkKFJNKSBUaHJpZnQuNDUuZGxsCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgJChUSFJJRlRDT0RFKSBcCi0gICAgICAgICAgICAgVGhyaWZ0TVNCdWlsZFRhc2sgXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuY3Nwcm9qIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LnNsbgorCSQoVEhSSUZUQ09ERSkgXAorCVRocmlmdE1TQnVpbGRUYXNrIFwKKwlzcmMvVGhyaWZ0LmNzcHJvaiBcCisJc3JjL1RocmlmdC40NS5jc3Byb2ogXAorCXNyYy9UaHJpZnQuc2xuIFwKKwlzcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCisJc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgXAorCXNyYy9UQXN5bmNQcm9jZXNzb3IuY3MgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvUkVBRE1FIGIvbGliL2NzaGFycC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jc2hhcnAvUkVBRE1FCnJlbmFtZSB0byBsaWIvY3NoYXJwL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggZGVmNGMxYy4uYzc0MWI3MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yOSwxMyArMjksMTQgQEAKIC8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCiAvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdE1TQnVpbGRUYXNrIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJNU0J1aWxkIFRhc2sgdG8gZ2VuZXJhdGUgY3NoYXJwIGZyb20gLnRocmlmdCBmaWxlcywgYW5kIGNvbXBpbGUgdGhlIGNvZGUgaW50byBhIGxpYnJhcnk6IFRocmlmdEltcGwuZGxsIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0TVNCdWlsZFRhc2siKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKy8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/CiAKIC8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQogLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQpAQCAtNTUsNSArNTYsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLioiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCmluZGV4IDc1YmIzMzkuLjRlNmQzMDEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwpAQCAtMzMsMjE0ICszMywyMTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdE1TQnVpbGRUYXNrCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBNU0J1aWxkIFRhc2sgdG8gZ2VuZXJhdGUgY3NoYXJwIGZyb20gLnRocmlmdCBmaWxlcywgYW5kIGNvbXBpbGUgdGhlIGNvZGUgaW50byBhIGxpYnJhcnk6IFRocmlmdEltcGwuZGxsCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVGhyaWZ0QnVpbGQgOiBUYXNrCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aHJpZnQuZXhlIGNvbXBpbGVyCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnRFeGVjdXRhYmxlCi0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTVNCdWlsZCBUYXNrIHRvIGdlbmVyYXRlIGNzaGFycCBmcm9tIC50aHJpZnQgZmlsZXMsIGFuZCBjb21waWxlIHRoZSBjb2RlIGludG8gYSBsaWJyYXJ5OiBUaHJpZnRJbXBsLmRsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRocmlmdEJ1aWxkIDogVGFzaworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhyaWZ0LmV4ZSBjb21waWxlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RXhlY3V0YWJsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgZnVsbCBwYXRoIHRvIGEgdGhyaWZ0LmRsbCBDIyBsaWJyYXJ5Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnRMaWJyYXJ5Ci0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVsbCBwYXRoIHRvIGEgdGhyaWZ0LmRsbCBDIyBsaWJyYXJ5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtSZXF1aXJlZF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnRMaWJyYXJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEEgZGlyZWNvdHJ5IGNvbnRhaW5pbmcgLnRocmlmdCBmaWxlcwotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RGVmaW5pdGlvbkRpcgotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBkaXJlY290cnkgY29udGFpbmluZyAudGhyaWZ0IGZpbGVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtSZXF1aXJlZF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnREZWZpbml0aW9uRGlyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBuYW1lIG9mIHRoZSBhdXRvLWdlbiBhbmQgY29tcGlsZWQgdGhyaWZ0IGxpYnJhcnkuIEl0IHdpbGwgcGxhY2VkIGluCi0JCS8vLyB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgVGhyaWZ0TGlicmFyeQotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gT3V0cHV0TmFtZQotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGF1dG8tZ2VuIGFuZCBjb21waWxlZCB0aHJpZnQgbGlicmFyeS4gSXQgd2lsbCBwbGFjZWQgaW4KKyAgICAgICAgLy8vIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBUaHJpZnRMaWJyYXJ5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtSZXF1aXJlZF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBPdXRwdXROYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbXBpbGVkIFRocmlmdExpYnJhcnkuIFRoaXMgYWxsb3dzIG1zYnVpbGQgdGFza3MgdG8gdXNlIHRoaXMKLQkJLy8vIG91dHB1dCBhcyBhIHZhcmlhYmxlIGZvciB1c2UgZWxzZXdoZXJlLgotCQkvLy8gPC9zdW1tYXJ5PgotCQlbT3V0cHV0XQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEltcGxlbWVudGF0aW9uCi0JCXsKLQkJCWdldCB7IHJldHVybiB0aHJpZnRJbXBsOyB9Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZWQgVGhyaWZ0TGlicmFyeS4gVGhpcyBhbGxvd3MgbXNidWlsZCB0YXNrcyB0byB1c2UgdGhpcworICAgICAgICAvLy8gb3V0cHV0IGFzIGEgdmFyaWFibGUgZm9yIHVzZSBlbHNld2hlcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtPdXRwdXRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0SW1wbGVtZW50YXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRocmlmdEltcGw7IH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgSVRhc2tJdGVtIHRocmlmdEltcGw7Ci0JCXByaXZhdGUgY29uc3Qgc3RyaW5nIGxhc3RDb21waWxhdGlvbk5hbWUgPSAiTEFTVF9DT01QX1RJTUVTVEFNUCI7CisgICAgICAgIHByaXZhdGUgSVRhc2tJdGVtIHRocmlmdEltcGw7CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIGxhc3RDb21waWxhdGlvbk5hbWUgPSAiTEFTVF9DT01QX1RJTUVTVEFNUCI7CiAKLQkJLy91c2UgdGhlIE1lc3NhZ2UgQnVpbGQgVGFzayB0byB3cml0ZSBzb21ldGhpbmcgdG8gYnVpbGQgbG9nCi0JCXByaXZhdGUgdm9pZCBMb2dNZXNzYWdlKHN0cmluZyB0ZXh0LCBNZXNzYWdlSW1wb3J0YW5jZSBpbXBvcnRhbmNlKQotCQl7Ci0JCQlNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOwotCQkJbS5UZXh0ID0gdGV4dDsKLQkJCW0uSW1wb3J0YW5jZSA9IGltcG9ydGFuY2UuVG9TdHJpbmcoKTsKLQkJCW0uQnVpbGRFbmdpbmUgPSB0aGlzLkJ1aWxkRW5naW5lOwotCQkJbS5FeGVjdXRlKCk7Ci0JCX0KKyAgICAgICAgLy91c2UgdGhlIE1lc3NhZ2UgQnVpbGQgVGFzayB0byB3cml0ZSBzb21ldGhpbmcgdG8gYnVpbGQgbG9nCisgICAgICAgIHByaXZhdGUgdm9pZCBMb2dNZXNzYWdlKHN0cmluZyB0ZXh0LCBNZXNzYWdlSW1wb3J0YW5jZSBpbXBvcnRhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbS5UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG0uSW1wb3J0YW5jZSA9IGltcG9ydGFuY2UuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIG0uQnVpbGRFbmdpbmUgPSB0aGlzLkJ1aWxkRW5naW5lOworICAgICAgICAgICAgbS5FeGVjdXRlKCk7CisgICAgICAgIH0KIAotCQkvL3JlY3Vyc2l2ZWx5IGZpbmQgLmNzIGZpbGVzIGluIHNyY0RpciwgcGF0aHMgc2hvdWxkIGluaXRpYWxseSBiZSBub24tbnVsbCBhbmQgZW1wdHkKLQkJcHJpdmF0ZSB2b2lkIEZpbmRTb3VyY2VzSGVscGVyKHN0cmluZyBzcmNEaXIsIExpc3Q8c3RyaW5nPiBwYXRocykKLQkJewotCQkJc3RyaW5nW10gZmlsZXMgPSBEaXJlY3RvcnkuR2V0RmlsZXMoc3JjRGlyLCAiKi5jcyIpOwotCQkJZm9yZWFjaCAoc3RyaW5nIGYgaW4gZmlsZXMpCi0JCQl7Ci0JCQkJcGF0aHMuQWRkKGYpOwotCQkJfQotCQkJc3RyaW5nW10gZGlycyA9IERpcmVjdG9yeS5HZXREaXJlY3RvcmllcyhzcmNEaXIpOwotCQkJZm9yZWFjaCAoc3RyaW5nIGRpciBpbiBkaXJzKQotCQkJewotCQkJCUZpbmRTb3VyY2VzSGVscGVyKGRpciwgcGF0aHMpOwotCQkJfQotCQl9CisgICAgICAgIC8vcmVjdXJzaXZlbHkgZmluZCAuY3MgZmlsZXMgaW4gc3JjRGlyLCBwYXRocyBzaG91bGQgaW5pdGlhbGx5IGJlIG5vbi1udWxsIGFuZCBlbXB0eQorICAgICAgICBwcml2YXRlIHZvaWQgRmluZFNvdXJjZXNIZWxwZXIoc3RyaW5nIHNyY0RpciwgTGlzdDxzdHJpbmc+IHBhdGhzKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhzcmNEaXIsICIqLmNzIik7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZiBpbiBmaWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXRocy5BZGQoZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmdbXSBkaXJzID0gRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKHNyY0Rpcik7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZGlyIGluIGRpcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmluZFNvdXJjZXNIZWxwZXIoZGlyLCBwYXRocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBRdW90ZSBwYXRocyB3aXRoIHNwYWNlcwotCQkvLy8gPC9zdW1tYXJ5PgotCQlwcml2YXRlIHN0cmluZyBTYWZlUGF0aChzdHJpbmcgcGF0aCkKLQkJewotCQkJaWYgKHBhdGguQ29udGFpbnMoJyAnKSAmJiAhcGF0aC5TdGFydHNXaXRoKCJcIiIpKQotCQkJewotCQkJCXJldHVybiAiXCIiICsgcGF0aCArICJcIiI7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBRdW90ZSBwYXRocyB3aXRoIHNwYWNlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0cmluZyBTYWZlUGF0aChzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhdGguQ29udGFpbnMoJyAnKSAmJiAhcGF0aC5TdGFydHNXaXRoKCJcIiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiXCIiICsgcGF0aCArICJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgSVRhc2tJdGVtW10gRmluZFNvdXJjZXMoc3RyaW5nIHNyY0RpcikKLQkJewotCQkJTGlzdDxzdHJpbmc+IGZpbGVzID0gbmV3IExpc3Q8c3RyaW5nPigpOwotCQkJRmluZFNvdXJjZXNIZWxwZXIoc3JjRGlyLCBmaWxlcyk7Ci0JCQlJVGFza0l0ZW1bXSBpdGVtcyA9IG5ldyBJVGFza0l0ZW1bZmlsZXMuQ291bnRdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5MZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlpdGVtc1tpXSA9IG5ldyBUYXNrSXRlbShmaWxlc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBJVGFza0l0ZW1bXSBGaW5kU291cmNlcyhzdHJpbmcgc3JjRGlyKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PHN0cmluZz4gZmlsZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBGaW5kU291cmNlc0hlbHBlcihzcmNEaXIsIGZpbGVzKTsKKyAgICAgICAgICAgIElUYXNrSXRlbVtdIGl0ZW1zID0gbmV3IElUYXNrSXRlbVtmaWxlcy5Db3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZW1zW2ldID0gbmV3IFRhc2tJdGVtKGZpbGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpdGVtczsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgc3RyaW5nIExhc3RXcml0ZVRpbWUoc3RyaW5nIGRlZkRpcikKLQkJewotCQkJc3RyaW5nW10gZmlsZXMgPSBEaXJlY3RvcnkuR2V0RmlsZXMoZGVmRGlyLCAiKi50aHJpZnQiKTsKLQkJCURhdGVUaW1lIGQgPSAobmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKSkuTGFzdFdyaXRlVGltZTsKLQkJCWZvcmVhY2goc3RyaW5nIGZpbGUgaW4gZmlsZXMpCi0JCQl7Ci0JCQkJRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKLQkJCQlEYXRlVGltZSBjdXJyID0gZi5MYXN0V3JpdGVUaW1lOwotCQkJCWlmIChEYXRlVGltZS5Db21wYXJlKGN1cnIsIGQpID4gMCkKLQkJCQl7Ci0JCQkJCWQgPSBjdXJyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOwotCQl9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIExhc3RXcml0ZVRpbWUoc3RyaW5nIGRlZkRpcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nW10gZmlsZXMgPSBEaXJlY3RvcnkuR2V0RmlsZXMoZGVmRGlyLCAiKi50aHJpZnQiKTsKKyAgICAgICAgICAgIERhdGVUaW1lIGQgPSAobmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKSkuTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGZpbGUgaW4gZmlsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSBjdXJyID0gZi5MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgIGlmIChEYXRlVGltZS5Db21wYXJlKGN1cnIsIGQpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGQgPSBjdXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgRXhlY3V0ZSgpCi0JCXsKLQkJCXN0cmluZyBkZWZEaXIgPSBTYWZlUGF0aChUaHJpZnREZWZpbml0aW9uRGlyLkl0ZW1TcGVjKTsKLQkJCS8vbG9vayBmb3IgbGFzdCBjb21waWxhdGlvbiB0aW1lc3RhbXAKLQkJCXN0cmluZyBsYXN0QnVpbGRQYXRoID0gUGF0aC5Db21iaW5lKGRlZkRpciwgbGFzdENvbXBpbGF0aW9uTmFtZSk7Ci0JCQlEaXJlY3RvcnlJbmZvIGRlZkRpckluZm8gPSBuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpOwotCQkJc3RyaW5nIGxhc3RXcml0ZSA9IExhc3RXcml0ZVRpbWUoZGVmRGlyKTsKLQkJCWlmIChGaWxlLkV4aXN0cyhsYXN0QnVpbGRQYXRoKSkKLQkJCXsKLQkJCQlzdHJpbmcgbGFzdENvbXAgPSBGaWxlLlJlYWRBbGxUZXh0KGxhc3RCdWlsZFBhdGgpOwotCQkJCS8vZG9uJ3QgcmVjb21waWxlIGlmIHRoZSB0aHJpZnQgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHNpbmNlIGxhc3RDb21wCi0JCQkJRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKTsKLQkJCQlzdHJpbmcgdGhyaWZ0TGliVGltZSA9IGYuTGFzdFdyaXRlVGltZVV0Yy5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKLQkJCQlpZiAobGFzdENvbXAuQ29tcGFyZVRvKHRocmlmdExpYlRpbWUpIDwgMCkKLQkJCQl7Ci0JCQkJCS8vbmV3IHRocmlmdCBsaWJyYXJ5LCBkbyBhIGNvbXBpbGUKLQkJCQkJbGFzdFdyaXRlID0gdGhyaWZ0TGliVGltZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGFzdENvbXAgPT0gbGFzdFdyaXRlIHx8IChsYXN0Q29tcCA9PSB0aHJpZnRMaWJUaW1lICYmIGxhc3RDb21wLkNvbXBhcmVUbyhsYXN0V3JpdGUpID4gMCkpCi0JCQkJewotCQkJCQkvL3RoZSAudGhyaWZ0IGRpciBoYXNuJ3QgYmVlbiB3cml0dGVuIHRvIHNpbmNlIGxhc3QgY29tcGlsYXRpb24sIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJCQkJTG9nTWVzc2FnZSgiVGhyaWZ0SW1wbCB1cC10by1kYXRlIiwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXhlY3V0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBkZWZEaXIgPSBTYWZlUGF0aChUaHJpZnREZWZpbml0aW9uRGlyLkl0ZW1TcGVjKTsKKyAgICAgICAgICAgIC8vbG9vayBmb3IgbGFzdCBjb21waWxhdGlvbiB0aW1lc3RhbXAKKyAgICAgICAgICAgIHN0cmluZyBsYXN0QnVpbGRQYXRoID0gUGF0aC5Db21iaW5lKGRlZkRpciwgbGFzdENvbXBpbGF0aW9uTmFtZSk7CisgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIGRlZkRpckluZm8gPSBuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpOworICAgICAgICAgICAgc3RyaW5nIGxhc3RXcml0ZSA9IExhc3RXcml0ZVRpbWUoZGVmRGlyKTsKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhsYXN0QnVpbGRQYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbGFzdENvbXAgPSBGaWxlLlJlYWRBbGxUZXh0KGxhc3RCdWlsZFBhdGgpOworICAgICAgICAgICAgICAgIC8vZG9uJ3QgcmVjb21waWxlIGlmIHRoZSB0aHJpZnQgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHNpbmNlIGxhc3RDb21wCisgICAgICAgICAgICAgICAgRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdGhyaWZ0TGliVGltZSA9IGYuTGFzdFdyaXRlVGltZVV0Yy5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdENvbXAuQ29tcGFyZVRvKHRocmlmdExpYlRpbWUpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vbmV3IHRocmlmdCBsaWJyYXJ5LCBkbyBhIGNvbXBpbGUKKyAgICAgICAgICAgICAgICAgICAgbGFzdFdyaXRlID0gdGhyaWZ0TGliVGltZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFzdENvbXAgPT0gbGFzdFdyaXRlIHx8IChsYXN0Q29tcCA9PSB0aHJpZnRMaWJUaW1lICYmIGxhc3RDb21wLkNvbXBhcmVUbyhsYXN0V3JpdGUpID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3RoZSAudGhyaWZ0IGRpciBoYXNuJ3QgYmVlbiB3cml0dGVuIHRvIHNpbmNlIGxhc3QgY29tcGlsYXRpb24sIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgiVGhyaWZ0SW1wbCB1cC10by1kYXRlIiwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJLy9maW5kIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHRocmlmdGxpYnJhcnkgKHRoYXQncyB3aGVyZSBvdXRwdXQgd2lsbCBnbykKLQkJCUZpbGVJbmZvIHRocmlmdExpYkluZm8gPSBuZXcgRmlsZUluZm8oU2FmZVBhdGgoVGhyaWZ0TGlicmFyeS5JdGVtU3BlYykpOwotCQkJc3RyaW5nIHRocmlmdERpciA9IHRocmlmdExpYkluZm8uRGlyZWN0b3J5LkZ1bGxOYW1lOworICAgICAgICAgICAgLy9maW5kIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHRocmlmdGxpYnJhcnkgKHRoYXQncyB3aGVyZSBvdXRwdXQgd2lsbCBnbykKKyAgICAgICAgICAgIEZpbGVJbmZvIHRocmlmdExpYkluZm8gPSBuZXcgRmlsZUluZm8oU2FmZVBhdGgoVGhyaWZ0TGlicmFyeS5JdGVtU3BlYykpOworICAgICAgICAgICAgc3RyaW5nIHRocmlmdERpciA9IHRocmlmdExpYkluZm8uRGlyZWN0b3J5LkZ1bGxOYW1lOwogCi0JCQlzdHJpbmcgZ2VuRGlyID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgImdlbi1jc2hhcnAiKTsKLQkJCWlmIChEaXJlY3RvcnkuRXhpc3RzKGdlbkRpcikpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlEaXJlY3RvcnkuRGVsZXRlKGdlbkRpciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIHsgLyplaCBpIHRyaWVkLCBqdXN0IG92ZXItd3JpdGUgbm93Ki99Ci0JCQl9CisgICAgICAgICAgICBzdHJpbmcgZ2VuRGlyID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgImdlbi1jc2hhcnAiKTsKKyAgICAgICAgICAgIGlmIChEaXJlY3RvcnkuRXhpc3RzKGdlbkRpcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnkuRGVsZXRlKGdlbkRpciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIHsgLyplaCBpIHRyaWVkLCBqdXN0IG92ZXItd3JpdGUgbm93Ki99CisgICAgICAgICAgICB9CiAKLQkJCS8vcnVuIHRoZSB0aHJpZnQgZXhlY3V0YWJsZSB0byBnZW5lcmF0ZSBDIwotCQkJZm9yZWFjaCAoc3RyaW5nIHRocmlmdEZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0IikpCi0JCQl7Ci0JCQkJTG9nTWVzc2FnZSgiR2VuZXJhdGluZyBjb2RlIGZvcjogIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7Ci0JCQkJUHJvY2VzcyBwID0gbmV3IFByb2Nlc3MoKTsKLQkJCQlwLlN0YXJ0SW5mby5GaWxlTmFtZSA9IFNhZmVQYXRoKFRocmlmdEV4ZWN1dGFibGUuSXRlbVNwZWMpOwotCQkJCXAuU3RhcnRJbmZvLkFyZ3VtZW50cyA9ICItLWdlbiBjc2hhcnAgLW8gIiArIFNhZmVQYXRoKHRocmlmdERpcikgKyAiIC1yICIgKyB0aHJpZnRGaWxlOwotCQkJCXAuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOwotCQkJCXAuU3RhcnRJbmZvLkNyZWF0ZU5vV2luZG93ID0gdHJ1ZTsKLQkJCQlwLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gZmFsc2U7Ci0JCQkJcC5TdGFydCgpOwotCQkJCXAuV2FpdEZvckV4aXQoKTsKLQkJCQlpZiAocC5FeGl0Q29kZSAhPSAwKQotCQkJCXsKLQkJCQkJTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKHAuRXhpdENvZGUgIT0gMCkKLQkJCQl7Ci0JCQkJCUxvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgLy9ydW4gdGhlIHRocmlmdCBleGVjdXRhYmxlIHRvIGdlbmVyYXRlIEMjCisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgdGhyaWZ0RmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoZGVmRGlyLCAiKi50aHJpZnQiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJHZW5lcmF0aW5nIGNvZGUgZm9yOiAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKKyAgICAgICAgICAgICAgICBQcm9jZXNzIHAgPSBuZXcgUHJvY2VzcygpOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLkZpbGVOYW1lID0gU2FmZVBhdGgoVGhyaWZ0RXhlY3V0YWJsZS5JdGVtU3BlYyk7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uQXJndW1lbnRzID0gIi0tZ2VuIGNzaGFycCAtbyAiICsgU2FmZVBhdGgodGhyaWZ0RGlyKSArICIgLXIgIiArIHRocmlmdEZpbGU7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgcC5XYWl0Rm9yRXhpdCgpOworICAgICAgICAgICAgICAgIGlmIChwLkV4aXRDb2RlICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocC5FeGl0Q29kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCUNzYyBjc2MgPSBuZXcgQ3NjKCk7Ci0JCQljc2MuVGFyZ2V0VHlwZSA9ICJsaWJyYXJ5IjsKLQkJCWNzYy5SZWZlcmVuY2VzID0gbmV3IElUYXNrSXRlbVtdIHsgbmV3IFRhc2tJdGVtKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpIH07Ci0JCQljc2MuRW1pdERlYnVnSW5mb3JtYXRpb24gPSB0cnVlOwotCQkJc3RyaW5nIG91dHB1dFBhdGggPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCBPdXRwdXROYW1lLkl0ZW1TcGVjKTsKLQkJCWNzYy5PdXRwdXRBc3NlbWJseSA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKLQkJCWNzYy5Tb3VyY2VzID0gRmluZFNvdXJjZXMoUGF0aC5Db21iaW5lKHRocmlmdERpciwgImdlbi1jc2hhcnAiKSk7Ci0JCQljc2MuQnVpbGRFbmdpbmUgPSB0aGlzLkJ1aWxkRW5naW5lOwotCQkJTG9nTWVzc2FnZSgiQ29tcGlsaW5nIGdlbmVyYXRlZCBjcy4uLiIsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7Ci0JCQlpZiAoIWNzYy5FeGVjdXRlKCkpCi0JCQl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorICAgICAgICAgICAgQ3NjIGNzYyA9IG5ldyBDc2MoKTsKKyAgICAgICAgICAgIGNzYy5UYXJnZXRUeXBlID0gImxpYnJhcnkiOworICAgICAgICAgICAgY3NjLlJlZmVyZW5jZXMgPSBuZXcgSVRhc2tJdGVtW10geyBuZXcgVGFza0l0ZW0oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYykgfTsKKyAgICAgICAgICAgIGNzYy5FbWl0RGVidWdJbmZvcm1hdGlvbiA9IHRydWU7CisgICAgICAgICAgICBzdHJpbmcgb3V0cHV0UGF0aCA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsIE91dHB1dE5hbWUuSXRlbVNwZWMpOworICAgICAgICAgICAgY3NjLk91dHB1dEFzc2VtYmx5ID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOworICAgICAgICAgICAgY3NjLlNvdXJjZXMgPSBGaW5kU291cmNlcyhQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpKTsKKyAgICAgICAgICAgIGNzYy5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7CisgICAgICAgICAgICBMb2dNZXNzYWdlKCJDb21waWxpbmcgZ2VuZXJhdGVkIGNzLi4uIiwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKKyAgICAgICAgICAgIGlmICghY3NjLkV4ZWN1dGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJCS8vd3JpdGUgZmlsZSB0byBkZWZEaXIgdG8gaW5kaWNhdGUgYSBidWlsZCB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZAotCQkJRmlsZS5Xcml0ZUFsbFRleHQobGFzdEJ1aWxkUGF0aCwgbGFzdFdyaXRlKTsKKyAgICAgICAgICAgIC8vd3JpdGUgZmlsZSB0byBkZWZEaXIgdG8gaW5kaWNhdGUgYSBidWlsZCB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZAorICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQobGFzdEJ1aWxkUGF0aCwgbGFzdFdyaXRlKTsKIAotCQkJdGhyaWZ0SW1wbCA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKKyAgICAgICAgICAgIHRocmlmdEltcGwgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7CiAKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvaiBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCmluZGV4IDE1Y2NiN2YuLmEzMTlkZjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCkBAIC0xLDQgKzEsNSBAQAot77u/PCEtLSAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE2LDggKzE3LDcgQEAKICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxQcm9wZXJ0eUdyb3VwPgogICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgogICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KQEAgLTMwLDYgKzMwLDI1IEBACiAgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRNU0J1aWxkVGFzazwvQXNzZW1ibHlOYW1lPgogICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CiAgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KICAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KQEAgLTM5LDYgKzU4LDcgQEAKICAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgogICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgpAQCAtNDcsNiArNjcsNyBAQAogICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQnVpbGQuRnJhbWV3b3JrIiAvPgpAQCAtNjksNiArOTAsMjMgQEAKICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJpZnRCdWlsZC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KICAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CiAgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CiAgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCiAgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODcxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw2IEBACisjIyBDIyBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW01TRE4gQyMgQ29kaW5nIENvbnZlbnRpb25zXShodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY5MjYwNzQuYXNweCkKKyAqIFtDIyBDb2RpbmcgR3VpZGVsaW5lc10oaHR0cDovL2NzaGFycGd1aWRlbGluZXMuY29kZXBsZXguY29tLykKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVENvbGxlY3Rpb25zCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb25zIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFcXVhbHMgKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUVudW1lcmF0b3IgZml0ZXIgPSBmaXJzdC5HZXRFbnVtZXJhdG9yICgpOworICAgICAgICAgICAgSUVudW1lcmF0b3Igc2l0ZXIgPSBzZWNvbmQuR2V0RW51bWVyYXRvciAoKTsKKworICAgICAgICAgICAgYm9vbCBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0ICgpOworICAgICAgICAgICAgYm9vbCBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0ICgpOworICAgICAgICAgICAgd2hpbGUgKGZuZXh0ICYmIHNuZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBzZW51bSA9IHNpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHNuZXh0ID0gc2l0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZuZXh0ID09IHNuZXh0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZSAoSUVudW1lcmFibGUgZW51bWVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVudW1lcmFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGhhc2hjb2RlID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvYmogaW4gZW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBlbnVtMiA9IG9iaiBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgb2JqSGFzaCA9IGVudW0yID09IG51bGwgPyBvYmouR2V0SGFzaENvZGUgKCkgOiBHZXRIYXNoQ29kZSAoZW51bTIpOworICAgICAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKaW5kZXggYTk5NTc2OS4uZTI5MjcxYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKQEAgLTIxLDEyMiArMjEsMTQwIEBACiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIAorI2lmIFNJTFZFUkxJR0hUCit1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uOworI2VuZGlmCisKIG5hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKIHsKLQlwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgotCXsKLSNpZiBORVRfMl8wCi0JCVREaWN0U2V0PFQ+IHNldCA9IG5ldyBURGljdFNldDxUPigpOworI2lmIFNJTFZFUkxJR0hUCisgICAgW0RhdGFDb250cmFjdF0KICNlbHNlCi0JCUhhc2hTZXQ8VD4gc2V0ID0gbmV3IEhhc2hTZXQ8VD4oKTsKKyAgICBbU2VyaWFsaXphYmxlXQogI2VuZGlmCi0JCXB1YmxpYyBpbnQgQ291bnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHNldC5Db3VudDsgfQotCQl9Ci0KLQkJcHVibGljIGJvb2wgSXNSZWFkT25seQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gZmFsc2U7IH0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCi0JCXsKLQkJCXNldC5BZGQoaXRlbSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBDbGVhcigpCi0JCXsKLQkJCXNldC5DbGVhcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2wgQ29udGFpbnMoVCBpdGVtKQotCQl7Ci0JCQlyZXR1cm4gc2V0LkNvbnRhaW5zKGl0ZW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCi0JCXsKLQkJCXNldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQotCQl7Ci0JCQlyZXR1cm4gc2V0LkdldEVudW1lcmF0b3IoKTsKLQkJfQotCi0JCUlFbnVtZXJhdG9yPFQ+IElFbnVtZXJhYmxlPFQ+LkdldEVudW1lcmF0b3IoKQotCQl7Ci0JCQlyZXR1cm4gKChJRW51bWVyYWJsZTxUPilzZXQpLkdldEVudW1lcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCi0JCXsKLQkJCXJldHVybiBzZXQuUmVtb3ZlKGl0ZW0pOwotCQl9Ci0KLSNpZiBORVRfMl8wCi0JCXByaXZhdGUgY2xhc3MgVERpY3RTZXQ8Vj4gOiBJQ29sbGVjdGlvbjxWPgotCQl7Ci0JCQlEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PiBkaWN0ID0gbmV3IERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+KCk7Ci0KLQkJCXB1YmxpYyBpbnQgQ291bnQKLQkJCXsKLQkJCQlnZXQgeyByZXR1cm4gZGljdC5Db3VudDsgfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbCBJc1JlYWRPbmx5Ci0JCQl7Ci0JCQkJZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKLQkJCXsKLQkJCQlyZXR1cm4gKChJRW51bWVyYWJsZSlkaWN0LktleXMpLkdldEVudW1lcmF0b3IoKTsKLQkJCX0KLQotCQkJSUVudW1lcmF0b3I8Vj4gSUVudW1lcmFibGU8Vj4uR2V0RW51bWVyYXRvcigpCi0JCQl7Ci0JCQkJcmV0dXJuIGRpY3QuS2V5cy5HZXRFbnVtZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIEFkZChWIGl0ZW0pCi0JCQl7Ci0JCQkJaWYgKCFkaWN0LkNvbnRhaW5zS2V5KGl0ZW0pKQotCQkJCXsKLQkJCQkJZGljdFtpdGVtXSA9IHRoaXM7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJdm9pZCBJQ29sbGVjdGlvbjxWPi5BZGQoViBpdGVtKQotCQkJewotCQkJCUFkZChpdGVtKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgQ2xlYXIoKQotCQkJewotCQkJCWRpY3QuQ2xlYXIoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2wgQ29udGFpbnMoViBpdGVtKQotCQkJewotCQkJCXJldHVybiBkaWN0LkNvbnRhaW5zS2V5KGl0ZW0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBDb3B5VG8oVltdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKLQkJCXsKLQkJCQlkaWN0LktleXMuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2wgUmVtb3ZlKFYgaXRlbSkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5SZW1vdmUoaXRlbSk7Ci0JCQl9Ci0JCX0KKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKKyNpZiBORVRfMl8wIHx8IFNJTFZFUkxJR0hUCisjaWYgU0lMVkVSTElHSFQKKyAgICAgICAgW0RhdGFNZW1iZXJdCiAjZW5kaWYKLQl9CisgICAgICAgIFREaWN0U2V0PFQ+IHNldCA9IG5ldyBURGljdFNldDxUPigpOworI2Vsc2UKKyAgICAgICAgSGFzaFNldDxUPiBzZXQgPSBuZXcgSGFzaFNldDxUPigpOworI2VuZGlmCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHNldC5Db3VudDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldC5BZGQoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldC5DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIElFbnVtZXJhdG9yPFQ+IElFbnVtZXJhYmxlPFQ+LkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxUPilzZXQpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuUmVtb3ZlKGl0ZW0pOworICAgICAgICB9CisKKyNpZiBORVRfMl8wIHx8IFNJTFZFUkxJR0hUCisjaWYgU0lMVkVSTElHSFQKKyAgICAgICAgW0RhdGFDb250cmFjdF0KKyNlbmRpZgorICAgICAgICBwcml2YXRlIGNsYXNzIFREaWN0U2V0PFY+IDogSUNvbGxlY3Rpb248Vj4KKyAgICAgICAgeworI2lmIFNJTFZFUkxJR0hUCisgICAgICAgICAgICBbRGF0YU1lbWJlcl0KKyNlbmRpZgorICAgICAgICAgICAgRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4gZGljdCA9IG5ldyBEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PigpOworCisgICAgICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRpY3QuQ291bnQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGUpZGljdC5LZXlzKS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElFbnVtZXJhdG9yPFY+IElFbnVtZXJhYmxlPFY+LkdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LktleXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBBZGQoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZGljdC5Db250YWluc0tleShpdGVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpY3RbaXRlbV0gPSB0aGlzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgSUNvbGxlY3Rpb248Vj4uQWRkKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGQoaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWN0LkNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5Db250YWluc0tleShpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFZbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGljdC5LZXlzLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuUmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E0MjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworI2lmICghTkVUNDUpCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgc3RhdGljIGNsYXNzIFN0cmVhbUV4dGVuc2lvbnNOZXQzNQorICAgIHsKKyAgICAgICAgLy8gQ29weVRvKCkgaGFzIGJlZW4gYWRkZWQgaW4gNC4wCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBDb3B5VG8odGhpcyBTdHJlYW0gc291cmNlLCBTdHJlYW0gdGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07ICAvLyBtdWx0aXBsZSBvZiA0MDk2CisgICAgICAgICAgICBsb25nIG5Ub3RhbCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgblJlYWQgPSBzb3VyY2UuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChuUmVhZCA8PSAwKSAgLy8gZG9uZT8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5Ub3RhbDsKKworICAgICAgICAgICAgICAgIHRhcmdldC5Xcml0ZShidWZmZXIsIDAsIG5SZWFkKTsKKyAgICAgICAgICAgICAgICBuVG90YWwgKz0gblJlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODY3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKy8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/CisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImRmM2Y4ZWYwLWUwYTMtNGM4Ni1hNjViLThlYzg0ZTAxNmIxZCIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNjFjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgV3JpdGUoVFByb3RvY29sIHRQcm90b2NvbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcwppbmRleCAxOTY5YmIzLi40MTFlNGQ5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcwpAQCAtMTksMTYgKzE5LDExIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFRCYXNlCi0JewotCQkvLy8KLQkJLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotCQkvLy8KLQkJdm9pZCBSZWFkKFRQcm90b2NvbCB0UHJvdG9jb2wpOwotCi0JCS8vLwotCQkvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLQkJLy8vCi0JCXZvaWQgV3JpdGUoVFByb3RvY29sIHRQcm90b2NvbCk7Ci0JfQorICAgIHB1YmxpYyBpbnRlcmZhY2UgVEJhc2UgOiBUQWJzdHJhY3RCYXNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBSZWFkKFRQcm90b2NvbCB0UHJvdG9jb2wpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFhZWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNzCkBAIC0wLDAgKzEsMTAwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NFV0aWxzCisgICAgeworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRU5DT0RFX1RBQkxFID0KKyAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBlbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07CisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWworICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWworICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgLy8gbGVuID09IDEpIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBERUNPREVfVEFCTEUgPSB7CisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCisgICAgICAgICAgICA1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAorICAgICAgICAgICAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKKyAgICAgICAgICAgIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBkZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpCisgICAgICAgICAgICAgICAgKChERUNPREVfVEFCTEVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfAorICAgICAgICAgICAgICAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfAorICAgICAgICAgICAgICAgICAgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwppbmRleCA0YjM5ODBlLi5hNGZhYTk0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCkBAIC0yNywzNzAgKzI3LDM2OSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbCA6IFRQcm90b2NvbAotCXsKLQkJcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLQkJcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwogCi0JCXByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0JCXByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CisgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLQkJcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoXzsKLQkJcHJvdGVjdGVkIGJvb2wgY2hlY2tSZWFkTGVuZ3RoXyA9IGZhbHNlOworICAgICAgICAjcmVnaW9uIEJpbmFyeVByb3RvY29sIEZhY3RvcnkKIAorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLQkJI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5Ci0JCSAvKioKLQkJICAqIEZhY3RvcnkKLQkJICAqLwotCQkgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQogCi0JCQkgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0JCQkgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgICAgICAgICAgfQogCi0JCQkgIHB1YmxpYyBGYWN0b3J5KCkKLQkJCQkgIDp0aGlzKGZhbHNlLCB0cnVlKQotCQkJICB7Ci0JCQkgIH0KKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0JCQkgIHsKLQkJCQkgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLQkJCQkgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotCQkJICB9CisgICAgICAgICNlbmRyZWdpb24KIAotCQkJcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0JCQkgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKLQkJCX0KLQkJICB9CisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCSNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgICAgICB9CiAKLQkJcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQkJOiB0aGlzKHRyYW5zLCBmYWxzZSwgdHJ1ZSkKLQkJewotCQl9CisgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcwogCi0JCXB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQotCQkJOmJhc2UodHJhbnMpCi0JCXsKLQkJCXN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLQkJCXN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpY3RXcml0ZV8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgKHVpbnQpKG1lc3NhZ2UuVHlwZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMzIoKGludCl2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSltZXNzYWdlLlR5cGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJI3JlZ2lvbiBXcml0ZSBNZXRob2RzCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCi0JCXsKLQkJCWlmIChzdHJpY3RXcml0ZV8pCi0JCQl7Ci0JCQkJdWludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgKHVpbnQpKG1lc3NhZ2UuVHlwZSk7Ci0JCQkJV3JpdGVJMzIoKGludCl2ZXJzaW9uKTsKLQkJCQlXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOwotCQkJCVdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7Ci0JCQkJV3JpdGVCeXRlKChieXRlKW1lc3NhZ2UuVHlwZSk7Ci0JCQkJV3JpdGVJMzIobWVzc2FnZS5TZXFJRCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWMpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKWZpZWxkLlR5cGUpOworICAgICAgICAgICAgV3JpdGVJMTYoZmllbGQuSUQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlmaWVsZC5UeXBlKTsKLQkJCVdyaXRlSTE2KGZpZWxkLklEKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpVFR5cGUuU3RvcCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWFwLktleVR5cGUpOworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSltYXAuVmFsdWVUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTMyKG1hcC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlUVHlwZS5TdG9wKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSltYXAuS2V5VHlwZSk7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbWFwLlZhbHVlVHlwZSk7Ci0JCQlXcml0ZUkzMihtYXAuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihsaXN0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlsaXN0LkVsZW1lbnRUeXBlKTsKLQkJCVdyaXRlSTMyKGxpc3QuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpc2V0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTMyKHNldC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpc2V0LkVsZW1lbnRUeXBlKTsKLQkJCVdyaXRlSTMyKHNldC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKGIgPyAoc2J5dGUpMSA6IChzYnl0ZSkwKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvdXRbMF0gPSAoYnl0ZSliOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYm91dCwgMCwgMSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQotCQl7Ci0JCQlXcml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgcykKKyAgICAgICAgeworICAgICAgICAgICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAocyA+PiA4KSk7CisgICAgICAgICAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIHMpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKGJ5dGUgYikKLQkJewotCQkJYm91dFswXSA9IGI7Ci0JCQl0cmFucy5Xcml0ZShib3V0LCAwLCAxKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7CisgICAgICAgICAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgICAgICAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIGkzMik7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpMzJvdXQsIDAsIDQpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IHMpCi0JCXsKLQkJCWkxNm91dFswXSA9IChieXRlKSgweGZmICYgKHMgPj4gOCkpOwotCQkJaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiBzKTsKLQkJCXRyYW5zLldyaXRlKGkxNm91dCwgMCwgMik7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICBpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOworICAgICAgICAgICAgaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7CisgICAgICAgICAgICBpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOworICAgICAgICAgICAgaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7CisgICAgICAgICAgICBpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiBpNjQpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTY0b3V0LCAwLCA4KTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQotCQl7Ci0JCQlpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKLQkJCWkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOwotCQkJaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKLQkJCWkzMm91dFszXSA9IChieXRlKSgweGZmICYgaTMyKTsKLQkJCXRyYW5zLldyaXRlKGkzMm91dCwgMCwgNCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpCisgICAgICAgIHsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIFdyaXRlSTY0KEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSk7CisjZWxzZQorICAgICAgICAgICAgdmFyIGJ5dGVzID0gQml0Q29udmVydGVyLkdldEJ5dGVzKGQpOworICAgICAgICAgICAgV3JpdGVJNjQoQml0Q29udmVydGVyLlRvSW50NjQoYnl0ZXMsIDApKTsKKyNlbmRpZgorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQotCQl7Ci0JCQlpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKLQkJCWk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotCQkJaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0JCQlpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKLQkJCWk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotCQkJaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0JCQlpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOwotCQkJaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiBpNjQpOwotCQkJdHJhbnMuV3JpdGUoaTY0b3V0LCAwLCA4KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVJMzIoYi5MZW5ndGgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpCi0JCXsKLQkJCVdyaXRlSTY0KEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSk7Ci0JCX0KKyAgICAgICAgI2VuZHJlZ2lvbgogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKQotCQl7Ci0JCQlXcml0ZUkzMihiLkxlbmd0aCk7Ci0JCQl0cmFucy5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7Ci0JCX0KKyAgICAgICAgI3JlZ2lvbiBSZWFkTWV0aG9kcwogCi0JCSNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSAodWludClzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogIiArIHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzaXplICYgMHgwMDAwMDBmZik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZ0JvZHkoc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQogCi0JCSNyZWdpb24gUmVhZE1ldGhvZHMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCi0JCXsKLQkJCVRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJaWYgKHNpemUgPCAwKQotCQkJewotCQkJCXVpbnQgdmVyc2lvbiA9ICh1aW50KXNpemUgJiBWRVJTSU9OX01BU0s7Ci0JCQkJaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAiICsgdmVyc2lvbik7Ci0JCQkJfQotCQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpKHNpemUgJiAweDAwMDAwMGZmKTsKLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoc3RyaWN0UmVhZF8pCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOwotCQkJCX0KLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nQm9keShzaXplKTsKLQkJCQltZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRCeXRlKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCXJldHVybiBtZXNzYWdlOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCi0JCXsKLQkJCXJldHVybiBuZXcgVFN0cnVjdCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICBmaWVsZC5UeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IFJlYWRJMTYoKTsKKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKLQkJewotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOwotCQkJZmllbGQuVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CiAKLQkJCWlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCi0JCQl7Ci0JCQkJZmllbGQuSUQgPSBSZWFkSTE2KCk7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5Db3VudCA9IFJlYWRJMzIoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQotCQl7Ci0JCQlUTWFwIG1hcCA9IG5ldyBUTWFwKCk7Ci0JCQltYXAuS2V5VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLlZhbHVlVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBtYXA7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gUmVhZEkzMigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQotCQl7Ci0JCQlUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7Ci0JCQlsaXN0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7Ci0JCQlsaXN0LkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gbGlzdDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgICAgICAgICBzZXQuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IFJlYWRJMzIoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCi0JCXsKLQkJCVRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKLQkJCXNldC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJc2V0LkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBzZXQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZEJ5dGUoKSA9PSAxOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChiaW4sIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSliaW5bMF07CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCi0JCXsKLQkJCXJldHVybiBSZWFkQnl0ZSgpID09IDE7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTE2aW4gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGkxNmluLCAwLCAyKTsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpKCgoaTE2aW5bMF0gJiAweGZmKSA8PCA4KSB8ICgoaTE2aW5bMV0gJiAweGZmKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gYmluID0gbmV3IGJ5dGVbMV07Ci0JCXB1YmxpYyBvdmVycmlkZSBieXRlIFJlYWRCeXRlKCkKLQkJewotCQkJUmVhZEFsbChiaW4sIDAsIDEpOwotCQkJcmV0dXJuIGJpblswXTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGkzMmluLCAwLCA0KTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTE2aW4gPSBuZXcgYnl0ZVsyXTsKLQkJcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQotCQl7Ci0JCQlSZWFkQWxsKGkxNmluLCAwLCAyKTsKLQkJCXJldHVybiAoc2hvcnQpKCgoaTE2aW5bMF0gJiAweGZmKSA8PCA4KSB8ICgoaTE2aW5bMV0gJiAweGZmKSkpOwotCQl9CisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKIAotCQlwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOwotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQotCQl7Ci0JCQlSZWFkQWxsKGkzMmluLCAwLCA0KTsKLQkJCXJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGk2NGluID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGk2NGluLCAwLCA4KTsKKyAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobG9uZykoCisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMF0gJiAweGZmKSA8PCA1NikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bM10gJiAweGZmKSA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTY0aW4gPSBuZXcgYnl0ZVs4XTsKLQkJcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCi0JCXsKLQkJCVJlYWRBbGwoaTY0aW4sIDAsIDgpOwotCQkJcmV0dXJuIChsb25nKSgoKGxvbmcpKGk2NGluWzBdICYgMHhmZikgPDwgNTYpIHwgKChsb25nKShpNjRpblsxXSAmIDB4ZmYpIDw8IDQ4KSB8ICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfCAoKGxvbmcpKGk2NGluWzNdICYgMHhmZikgPDwgMzIpIHwKLQkJCQkoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8ICgobG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8ICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOwotCQl9CisjcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSA2NzUKIAotCQlwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQotCQl7Ci0JCQlyZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKFJlYWRJNjQoKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShSZWFkSTY0KCkpOworI2Vsc2UKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IFJlYWRJNjQoKTsKKyAgICAgICAgICAgIHZhciBieXRlcyA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvRG91YmxlKGJ5dGVzLCAwKTsKKyNlbmRpZgorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgU2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkKLQkJewotCQkJcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotCQkJY2hlY2tSZWFkTGVuZ3RoXyA9IHRydWU7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRTdHJpbmdCb2R5KGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCB2b2lkIENoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKQotCQl7Ci0JCQlpZiAoY2hlY2tSZWFkTGVuZ3RoXykKLQkJCXsKLQkJCQlyZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0JCQkJaWYgKHJlYWRMZW5ndGhfIDwgMCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnMuUmVhZEFsbChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCi0JCXsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJQ2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwcml2YXRlICBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCi0JCXsKLQkJCUNoZWNrUmVhZExlbmd0aChzaXplKTsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLQkJCXJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlDaGVja1JlYWRMZW5ndGgobGVuKTsKLQkJCXJldHVybiB0cmFucy5SZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0KLQkJI2VuZHJlZ2lvbgotCX0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjczOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsODQ5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHR0eXBlVG9Db21wYWN0VHlwZSA9IG5ldyBieXRlWzE2XTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgUFJPVE9DT0xfSUQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFRZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCT09MRUFOX1RSVUUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCWVRFID0gMHgwMzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkxNiA9IDB4MDQ7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMzIgPSAweDA1OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTY0ID0gMHgwNjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIERPVUJMRSA9IDB4MDc7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCSU5BUlkgPSAweDA4OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTElTVCA9IDB4MDk7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTRVQgPSAweDBBOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTUFQID0gMHgwQjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAgICAvLy8gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBTdGFjazxzaG9ydD4gbGFzdEZpZWxkXyA9IG5ldyBTdGFjazxzaG9ydD4oMTUpOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgbGFzdEZpZWxkSWRfID0gMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgICAgICAgLy8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxURmllbGQ+IGJvb2xlYW5GaWVsZF87CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICAgIC8vLyB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworCisKKyAgICAgICAgI3JlZ2lvbiBDb21wYWN0UHJvdG9jb2wgRmFjdG9yeQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpIHsgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdG9wXSA9IFR5cGVzLlNUT1A7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5Cb29sXSA9IFR5cGVzLkJPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkJ5dGVdID0gVHlwZXMuQllURTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JMzJdID0gVHlwZXMuSTMyOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTY0XSA9IFR5cGVzLkk2NDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkRvdWJsZV0gPSBUeXBlcy5ET1VCTEU7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdHJpbmddID0gVHlwZXMuQklOQVJZOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuTGlzdF0gPSBUeXBlcy5MSVNUOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU2V0XSA9IFR5cGVzLlNFVDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLk1hcF0gPSBUeXBlcy5NQVA7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdHJ1Y3RdID0gVHlwZXMuU1RSVUNUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLkNsZWFyKCk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBXcml0ZSBNZXRob2RzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDMyKHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyYnVmLCAwLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgoKCh1aW50KW1lc3NhZ2UuVHlwZSkgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSkpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludCltZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIFdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAgICAvLy8gc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJjdCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAgICAgICAgLy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAgICAvLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCisgICAgICAgIC8vLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoJmx0OyAxNSksCisgICAgICAgIC8vLyB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgICAgICAgIC8vLyBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICAgIC8vLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICAgICAgICAvLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICAgICAgYnl0ZSB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gZ2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfICYmIGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfIDw9IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTE2KGZpZWxkLklEKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuSUQ7CisgICAgICAgICAgICAvLyBsYXN0RmllbGRfLnB1c2goZmllbGQuaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChUeXBlcy5TVE9QKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgICAgICAgIC8vLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtYXAuQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludCltYXAuQ291bnQpOworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChnZXRDb21wYWN0VHlwZShtYXAuS2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgbGlzdCBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgLy8vIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgIC8vLyByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIFdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuCisgICAgICAgIC8vLyBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChCb29sZWFuIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5WYWx1ZSwgYiA/IFR5cGVzLkJPT0xFQU5fVFJVRSA6IFR5cGVzLkJPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChiID8gVHlwZXMuQk9PTEVBTl9UUlVFIDogVHlwZXMuQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpYik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTE2KSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKGludFRvWmlnWmFnKGkzMikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50NjQobG9uZ1RvWmlnemFnKGk2NCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgICAgICAgICAgZml4ZWRMb25nVG9CeXRlcyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSwgMCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBXcml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJpbmFyeShiaW4sIDAsIGJpbi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpbGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlCisgICAgICAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgorICAgICAgICAvLworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpIHsgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEludGVybmFsIHdyaXRpbmcgbWV0aG9kcworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAgICAgLy8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgV3JpdGVDb2xsZWN0aW9uQmVnaW4oVFR5cGUgZWxlbVR5cGUsIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3Qoc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludClzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDY0KHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfih1bG9uZykweDdGTCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChieXRlKW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnMuV3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdWxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh1bG9uZykobiA8PCAxKSBeICh1bG9uZykobiA+PiA2Myk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgICAgLy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1aW50IGludFRvWmlnWmFnKGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHVpbnQpKG4gPDwgMSkgXiAodWludCkobiA+PiAzMSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgICAgLy8vIHVudGlsIG9mZis3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkoKG4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAyXSA9IChieXRlKSgobiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAzXSA9IChieXRlKSgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSgobiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA1XSA9IChieXRlKSgobiA+PiA0MCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA2XSA9IChieXRlKSgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSgobiA+PiA1NikgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgcHJvdG9jb2xJZCA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBwcm90b2NvbCBpZCAiICsgUFJPVE9DT0xfSUQuVG9TdHJpbmcoIlgiKSArICIgYnV0IGdvdCAiICsgcHJvdG9jb2xJZC5Ub1N0cmluZygiWCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGUgdmVyc2lvbkFuZFR5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgYnl0ZSB2ZXJzaW9uID0gKGJ5dGUpKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlIHR5cGUgPSAoYnl0ZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgICAgICAgICBpbnQgc2VxaWQgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2VOYW1lID0gUmVhZFN0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgKFRNZXNzYWdlVHlwZSl0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgICAgLy8vIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbnRvIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAvLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuU1RPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFNUT1A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3J0IGZpZWxkSWQ7CisKKyAgICAgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgICAgIHNob3J0IG1vZGlmaWVyID0gKHNob3J0KSgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorICAgICAgICAgICAgICAgIGZpZWxkSWQgPSBSZWFkSTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICAgICAgICAgICAgICBmaWVsZElkID0gKHNob3J0KShsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoIiIsIGdldFRUeXBlKChieXRlKSh0eXBlICYgMHgwZikpLCBmaWVsZElkKTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICAgICAgICAgIGlmIChpc0Jvb2xUeXBlKHR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSAoYnl0ZSkodHlwZSAmIDB4MGYpID09IFR5cGVzLkJPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKyAgICAgICAgLy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgICAgICAgIC8vLyAiY29ycmVjdCIgdHlwZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplID0gKGludClSZWFkVmFyaW50MzIoKTsKKyAgICAgICAgICAgIGJ5dGUga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpMCA6IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAvLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAvLy8gdHJ1ZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgc2l6ZV9hbmRfdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IChzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgICAgICAgICAgIGlmIChzaXplID09IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGUgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChSZWFkTGlzdEJlZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAvLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgLy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCb29sZWFuIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIHJlc3VsdCA9IGJvb2xWYWx1ZV8uVmFsdWU7CisgICAgICAgICAgICAgICAgYm9vbFZhbHVlXyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZWFkQnl0ZSgpID09IFR5cGVzLkJPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBieXRlUmF3QnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYnl0ZVJhd0J1ZlswXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChsb25nQml0cywgMCwgOCk7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkobGVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBvZiBhIGtub3duIGxlbmd0aCBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkQmluYXJ5KGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBieXRlWzBdOworCisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKKyAgICAgICAgLy8gZW5jb2RpbmcuCisgICAgICAgIC8vCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKSB7IH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKyAgICAgICAgLy8KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgICAgLy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1aW50IFJlYWRWYXJpbnQzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodWludCkoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBSZWFkVmFyaW50NjQoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICAgICAgdWxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgemlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkobiA+PiAxKSBeICgtKGludCkobiAmIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgemlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykobiA+PiAxKSBeICgtKGxvbmcpKG4gJiAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgICAgLy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICAgIC8vLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgYnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgKChieXRlc1s3XSAmIDB4ZmZMKSA8PCA1NikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzZdICYgMHhmZkwpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgKChieXRlc1s0XSAmIDB4ZmZMKSA8PCAzMikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzNdICYgMHhmZkwpIDw8IDI0KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgKChieXRlc1sxXSAmIDB4ZmZMKSA8PCA4KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbMF0gJiAweGZmTCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nCisgICAgICAgIC8vCisKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGlzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgfHwgbG93ZXJOaWJibGUgPT0gVHlwZXMuQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAgICAvLy8gVFR5cGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSh0eXBlICYgMHgwZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TVE9QOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJPT0xFQU5fRkFMU0U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CT09MRUFOX1RSVUU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5Cb29sOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJ5dGU7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JMTY7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JMzI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5Eb3VibGU7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MSVNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTGlzdDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlNldDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cnVjdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIiArIChieXRlKSh0eXBlICYgMHgwZikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBieXRlIGdldENvbXBhY3RUeXBlKFRUeXBlIHR0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCmluZGV4IGZhMTA1ODQuLjgxNzk1NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKQEAgLTI3LDM2ICsyNywzNiBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBURmllbGQKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgVFR5cGUgdHlwZTsKLQkJcHJpdmF0ZSBzaG9ydCBpZDsKKyAgICBwdWJsaWMgc3RydWN0IFRGaWVsZAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIHNob3J0IGlkOwogCi0JCXB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQorICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgbmFtZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQkJc2V0IHsgdHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IHR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIHNob3J0IElECi0JCXsKLQkJCWdldCB7IHJldHVybiBpZDsgfQotCQkJc2V0IHsgaWQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc2hvcnQgSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGlkOyB9CisgICAgICAgICAgICBzZXQgeyBpZCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJkZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwpAQCAtMCwwICsxLDExMjQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAvLy8gcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geyAoYnl0ZSknLCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7IChieXRlKSc6JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTEJSQUNFID0gbmV3IGJ5dGVbXSB7IChieXRlKSd7JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7IChieXRlKSd9JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1snIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBSQlJBQ0tFVCA9IG5ldyBieXRlW10geyAoYnl0ZSknXScgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFFVT1RFID0gbmV3IGJ5dGVbXSB7IChieXRlKSciJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gQkFDS1NMQVNIID0gbmV3IGJ5dGVbXSB7IChieXRlKSdcXCcgfTsKKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBFU0NTRVEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1xcJywgKGJ5dGUpJ3UnLCAoYnl0ZSknMCcsIChieXRlKScwJyB9OworCisgICAgICAgIHByaXZhdGUgY29uc3QgbG9uZyBWRVJTSU9OID0gMTsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gSlNPTl9DSEFSX1RBQkxFID0geworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLChieXRlKSdiJywoYnl0ZSkndCcsKGJ5dGUpJ24nLCAgMCwoYnl0ZSknZicsKGJ5dGUpJ3InLCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwoYnl0ZSknIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICB9OworCisgICAgICAgIHByaXZhdGUgY2hhcltdIEVTQ0FQRV9DSEFSUyA9ICJcIlxcL2JmbnJ0Ii5Ub0NoYXJBcnJheSgpOworCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgKGJ5dGUpJyInLCAoYnl0ZSknXFwnLCAoYnl0ZSknLycsIChieXRlKSdcYicsIChieXRlKSdcZicsIChieXRlKSdcbicsIChieXRlKSdccicsIChieXRlKSdcdCcsCisgIH07CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGX1NUUklOR19TSVpFID0gMTY7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQk9PTCA9IG5ldyBieXRlW10geyAoYnl0ZSkndCcsIChieXRlKSdmJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzgnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kxNiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKScxJywgKGJ5dGUpJzYnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kzMiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSczJywgKGJ5dGUpJzInIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0k2NCA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc2JywgKGJ5dGUpJzQnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0RPVUJMRSA9IG5ldyBieXRlW10geyAoYnl0ZSknZCcsIChieXRlKSdiJywgKGJ5dGUpJ2wnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUlVDVCA9IG5ldyBieXRlW10geyAoYnl0ZSkncicsIChieXRlKSdlJywgKGJ5dGUpJ2MnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUklORyA9IG5ldyBieXRlW10geyAoYnl0ZSkncycsIChieXRlKSd0JywgKGJ5dGUpJ3InIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX01BUCA9IG5ldyBieXRlW10geyAoYnl0ZSknbScsIChieXRlKSdhJywgKGJ5dGUpJ3AnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0xJU1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2wnLCAoYnl0ZSkncycsIChieXRlKSd0JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSknZScsIChieXRlKSd0JyB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZUlEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0JZVEU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0kxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9JNjQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX01BUDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfTElTVDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUVHlwZSBHZXRUeXBlSURGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgVFR5cGUgcmVzdWx0ID0gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgIGlmIChuYW1lLkxlbmd0aCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5Eb3VibGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJ5dGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzEnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2wnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cnVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdzJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lWzFdID09IChieXRlKSd0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09IChieXRlKSdlJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkndCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5Cb29sOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgICAvLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCisgICAgICAgIC8vLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGUoKSB7IH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWFkKCkgeyB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgRXNjYXBlTnVtYmVycygpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAgICAgICAvLy8gZm9yIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05MaXN0Q29udGV4dCA6IEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5Xcml0ZShDT01NQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by5SZWFkSlNPTlN5bnRheENoYXIoQ09NTUEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAgICAgICAvLy8gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZQorICAgICAgICAvLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG8pCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBjb2xvbiA9IHRydWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnRyYW5zLldyaXRlKGNvbG9uID8gQ09MT04gOiBDT01NQSk7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by5SZWFkSlNPTlN5bnRheENoYXIoY29sb24gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29sb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIExvb2thaGVhZFJlYWRlcgorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKKworICAgICAgICAgICAgcHVibGljIExvb2thaGVhZFJlYWRlcihUSlNPTlByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7CisgICAgICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgICAgICAgICAgLy8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUGVlaygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuUmVhZEFsbChkYXRhLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWZhdWx0IGVuY29kaW5nCisgICAgICAgIHByb3RlY3RlZCBFbmNvZGluZyB1dGY4RW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcuVVRGODsKKworICAgICAgICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIFN0YWNrPEpTT05CYXNlQ29udGV4dD4gY29udGV4dFN0YWNrID0gbmV3IFN0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKworICAgICAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIEpTT05CYXNlQ29udGV4dCBjb250ZXh0OworCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgcmVhZGVyOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dFN0YWNrLlB1c2goY29udGV4dCk7CisgICAgICAgICAgICBjb250ZXh0ID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICAgICAgICBwcml2YXRlIGJ5dGVbXSB0ZW1wQnVmZmVyID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIGFuZCBKU09OUGFpckNvbnRleHQuUmVhZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBSZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgaWYgKGNoICE9IGJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiIgKyAoY2hhciljaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhDaGFyKGJ5dGUgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgJj0gMHgwRjsKKyAgICAgICAgICAgIGlmICh2YWwgPCAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsIC09IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYltpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiW2ldID09IEJBQ0tTTEFTSFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyWzBdID0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wQnVmZmVyWzBdID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMF0gPSBIZXhDaGFyKChieXRlKShiW2ldID4+IDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMV0gPSBIZXhDaGFyKGJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OSW50ZWdlcihsb25nIG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOworCisgICAgICAgICAgICBib29sIGVzY2FwZU51bSA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7IC8vIC1JbmZpbml0eQorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgICAgICAgIC8vLyBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgaW50IG9mZiA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICAgICAgICAgICAgb2ZmICs9IDM7CisgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgbGVuICsgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKExCUkFDRSk7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShSQlJBQ0UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShMQlJBQ0tFVCk7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFJCUkFDS0VUKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoYik7CisKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpbWVzc2FnZS5UeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5TZXFJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKSB7IH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLktleVR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChtYXAuVmFsdWVUeXBlKSk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKG1hcC5Db3VudCk7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobGlzdC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihsaXN0LkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoc2V0LkVsZW1lbnRUeXBlKSk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKHNldC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKGIgPyAobG9uZykxIDogKGxvbmcpMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZyliKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZylpMTYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZylpMzIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoaTY0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkRvdWJsZShkdWIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkJhc2U2NChiaW4pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCisgICAgICAgIC8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OU3RyaW5nKGJvb2wgc2tpcENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBidWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBMaXN0PGNoYXI+IGNvZGV1bml0cyA9IG5ldyBMaXN0PGNoYXI+KCk7CisKKworICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gUVVPVEVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBlc2NhcGVkPworICAgICAgICAgICAgICAgIGlmIChjaCAhPSBFU0NTRVFbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUobmV3IGJ5dGVbXSB7IChieXRlKWNoIH0sIDAsIDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoICE9IEVTQ1NFUVsxXSkgIC8vIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZiA9IEFycmF5LkluZGV4T2YoRVNDQVBFX0NIQVJTLCAoY2hhciljaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gRVNDQVBFX0NIQVJfVkFMU1tvZmZdOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUobmV3IGJ5dGVbXSB7IChieXRlKWNoIH0sIDAsIDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICAgICAgICAgICAgdHJhbnMuUmVhZEFsbCh0ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgICAgICB2YXIgd2NoID0gKHNob3J0KSgoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleFZhbCh0ZW1wQnVmZmVyWzNdKSk7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXcgY2hhcltdIHsgKGNoYXIpd2NoIH0pOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScrJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSctJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScuJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScwJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScyJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc0JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc1JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc3JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc5JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdFJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdlJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgICAgIC8vLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICAgICAgaWYgKCFJc0pTT05OdW1lcmljKGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKChjaGFyKXJlYWRlci5SZWFkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmJsZC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgUmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludDY0LlBhcnNlKHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgICAgICAgLy8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgZG91YmxlIFJlYWRKU09ORG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBpZiAocmVhZGVyLlBlZWsoKSA9PSBRVU9URVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYXJyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS5QYXJzZSh1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGFyciwgMCwgYXJyLkxlbmd0aCksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworCisgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LkVzY2FwZU51bWJlcnMoKSAmJiAhRG91YmxlLklzTmFOKGR1YikgJiYgIURvdWJsZS5Jc0luZmluaXR5KGR1YikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZHViOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBpbnQgb2ZmID0gMDsKKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKGJbbGVuIC0gMV0gPT0gJz0nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBvZmYgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgICAgICAgICBzaXplICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBBcnJheS5Db3B5KGIsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCk7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTkFycmF5RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICBtZXNzYWdlLlNlcUlEID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgaWYgKGNoID09IFJCUkFDRVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBtYXAuS2V5VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIG1hcC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgbGlzdC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBzZXQuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRKU09ORG91YmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkJhc2U2NCgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCmluZGV4IGE2NTFlYjEuLjBjOGYyMTQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCkBAIC0yNywyOCArMjcsMjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVExpc3QKLQl7Ci0JCXByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7Ci0JCXByaXZhdGUgaW50IGNvdW50OworICAgIHB1YmxpYyBzdHJ1Y3QgVExpc3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OwogCi0JCXB1YmxpYyBUTGlzdChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KLQkJCXNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKaW5kZXggNWM4ZDY1MC4uYWJhOWQzYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCkBAIC0yNywzNiArMjcsMzYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVE1hcAotCXsKLQkJcHJpdmF0ZSBUVHlwZSBrZXlUeXBlOwotCQlwcml2YXRlIFRUeXBlIHZhbHVlVHlwZTsKLQkJcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHVibGljIHN0cnVjdCBUTWFwCisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGtleVR5cGU7CisgICAgICAgIHByaXZhdGUgVFR5cGUgdmFsdWVUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKLQkJCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQl9CisgICAgICAgIHB1YmxpYyBUTWFwKFRUeXBlIGtleVR5cGUsIFRUeXBlIHZhbHVlVHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgS2V5VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4ga2V5VHlwZTsgfQotCQkJc2V0IHsga2V5VHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEtleVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGtleVR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IGtleVR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIFZhbHVlVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdmFsdWVUeXBlOyB9Ci0JCQlzZXQgeyB2YWx1ZVR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlVHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdmFsdWVUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgQ291bnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGNvdW50OyB9Ci0JCQlzZXQgeyBjb3VudCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNvdW50OyB9CisgICAgICAgICAgICBzZXQgeyBjb3VudCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCmluZGV4IDhlOTZkYTUuLjM0ODI2M2MgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCkBAIC0yNywzNiArMjcsMzYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgVE1lc3NhZ2VUeXBlIHR5cGU7Ci0JCXByaXZhdGUgaW50IHNlcUlEOworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgVE1lc3NhZ2VUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IHNlcUlEOwogCi0JCXB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnNlcUlEID0gc2VxaWQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRNZXNzYWdlKHN0cmluZyBuYW1lLCBUTWVzc2FnZVR5cGUgdHlwZSwgaW50IHNlcWlkKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuc2VxSUQgPSBzZXFpZDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgTmFtZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gbmFtZTsgfQotCQkJc2V0IHsgbmFtZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQkJc2V0IHsgdHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRNZXNzYWdlVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgICAgICBzZXQgeyB0eXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgU2VxSUQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHNlcUlEOyB9Ci0JCQlzZXQgeyBzZXFJRCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgU2VxSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHNlcUlEOyB9CisgICAgICAgICAgICBzZXQgeyBzZXFJRCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKaW5kZXggYWIwN2NmNi4uYzcwOTFmZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcwpAQCAtMjEsMTEgKzIxLDExIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKLQl7Ci0JCUNhbGwgPSAxLAotCQlSZXBseSA9IDIsCi0JCUV4Y2VwdGlvbiA9IDMsCi0JCU9uZXdheSA9IDQKLQl9CisgICAgcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlCisgICAgeworICAgICAgICBDYWxsID0gMSwKKyAgICAgICAgUmVwbHkgPSAyLAorICAgICAgICBFeGNlcHRpb24gPSAzLAorICAgICAgICBPbmV3YXkgPSA0CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTFjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUTXVsdGlwbGV4ZWRQcm9jZXNzb3IiLz4gaXMgYSA8c2VlIGNyZWY9IlRQcm9jZXNzb3IiLz4gYWxsb3dpbmcgYSBzaW5nbGUgPHNlZSBjcmVmPSJUaHJpZnQuU2VydmVyLlRTZXJ2ZXIiLz4KKyAgICAvLy8gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgICAgLy8vIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgIC8vLyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAvLy8gICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgIC8vLyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICAgIC8vLworICAgIC8vLyAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc29yPiBTZXJ2aWNlUHJvY2Vzc29yTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc29yPigpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAgICAvLy8gcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBBcmdzOgorICAgICAgICAvLy8gLSBzZXJ2aWNlTmFtZSAgICBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICAgIC8vLyAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihzdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsIHN0cmluZyBldHh0KQorICAgICAgICB7CisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIFRNZXNzYWdlIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3TWVzc2FnZSk7CisgICAgICAgICAgICBhcHBleC5Xcml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyAtIERpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICAgIC8vLyAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgICAgLy8vIDxwYXJhLz4KKyAgICAgICAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgICAgLy8vIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKKyAgICAgICAgLy8vIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLiAqLworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOworCisgICAgICAgICAgICAgICAgaWYgKChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNhbGwpICYmIChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9uZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UuTmFtZS5JbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5OYW1lICsgIi4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgICAgICAgICAgICAgc3RyaW5nIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5OYW1lLlN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgaWYgKCFTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgUmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIFRNZXNzYWdlIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKHNlcnZpY2VOYW1lLkxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5MZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG5ld01lc3NhZ2UpLCBvcHJvdCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBzaW1pbGFyIHRvIGFsbCBvdGhlciBwcm9jZXNzb3JzCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICAgICAgICAvLy8gIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAgICAgICAgLy8vICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNZXNzYWdlIE1zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLk1zZ0JlZ2luID0gbWVzc2FnZUJlZ2luOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1zZ0JlZ2luOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZDQyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgLy8vIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vLyB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgIC8vLyBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgLy8vIDxjb2RlPgorICAgIC8vLyAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgLy8vICAgICB0cmFuc3BvcnQub3BlbigpOworICAgIC8vLworICAgIC8vLyAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIC8vLworICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgLy8vICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAvLy8gICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgICAgLy8vCisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmljZU5hbWU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAgICAvLy8gbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8cGFyYW1yZWYgbmFtZT0ic2VydmljZU5hbWUiLz4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgLy8vIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgIC8vLyB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPllvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wiLz4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXJ2aWNlTmFtZSI+VGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIHN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idE1lc3NhZ2UiPlRoZSBvcmlnaW5hbCBtZXNzYWdlLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRNZXNzYWdlLlR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ2FsbDoKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PbmV3YXk6CisgICAgICAgICAgICAgICAgICAgIGJhc2UuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyB0TWVzc2FnZS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdE1lc3NhZ2UuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLlNlcUlEKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5Xcml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCmluZGV4IDI3YzdkYzEuLmRkN2E2ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKQEAgLTI3LDY1ICsyNywxMTYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKLQl7Ci0JCXByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9SRUNVUlNJT05fREVQVEggPSA2NDsKIAotCQlwcm90ZWN0ZWQgVFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCi0JCXsKLQkJCXRoaXMudHJhbnMgPSB0cmFuczsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgcHJvdGVjdGVkIGludCByZWN1cnNpb25MaW1pdDsKKyAgICAgICAgcHJvdGVjdGVkIGludCByZWN1cnNpb25EZXB0aDsKIAotCQlwdWJsaWMgVFRyYW5zcG9ydCBUcmFuc3BvcnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zOyB9Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgICAgICAgICB0aGlzLnJlY3Vyc2lvbkxpbWl0ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgICAgICAgICB0aGlzLnJlY3Vyc2lvbkRlcHRoID0gMDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZFN0b3AoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQm9vbChib29sIGIpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJ5dGUoYnl0ZSBiKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMzIoaW50IGkzMik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpOwotCQlwdWJsaWMgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykgewotCQkJV3JpdGVCaW5hcnkoRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKSk7Ci0JCX0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpOworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRyYW5zOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgYWJzdHJhY3QgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFN0cnVjdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRGaWVsZEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVE1hcCBSZWFkTWFwQmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1hcEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVExpc3QgUmVhZExpc3RCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTGlzdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVFNldCBSZWFkU2V0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFNldEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgYm9vbCBSZWFkQm9vbCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgYnl0ZSBSZWFkQnl0ZSgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgUmVhZEkxNigpOwotCQlwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKLQkJcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKLQkJcHVibGljIHN0cmluZyBSZWFkU3RyaW5nKCkgewotCQkgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkoKSk7Ci0JCX0KLQkJcHVibGljIGFic3RyYWN0IGJ5dGVbXSBSZWFkQmluYXJ5KCk7Ci0JfQorICAgICAgICBwdWJsaWMgaW50IFJlY3Vyc2lvbkxpbWl0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZWN1cnNpb25MaW1pdDsgfQorICAgICAgICAgICAgc2V0IHsgcmVjdXJzaW9uTGltaXQgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICAgICArK3JlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnMgaXMgSURpc3Bvc2FibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAodHJhbnMgYXMgSURpc3Bvc2FibGUpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQm9vbChib29sIGIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCaW5hcnkoRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBURmllbGQgUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZEZpZWxkRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTWFwIFJlYWRNYXBCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWFwRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTGlzdCBSZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRMaXN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUU2V0IFJlYWRTZXRCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU2V0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIFJlYWRCb29sKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzYnl0ZSBSZWFkQnl0ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgUmVhZEkxNigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gUmVhZEJpbmFyeSgpOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBSZWFkQmluYXJ5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDAwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKQEAgLTAsMCArMSwyNjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUUHJvdG9jb2xEZWNvcmF0b3IiLz4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+IGluc3RhbmNlLAorICAgIC8vLyBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcworICAgIC8vLyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUTXVsdGlwbGV4ZWRQcm90b2NvbCIvPgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFByb3RvY29sIFdyYXBwZWRQcm90b2NvbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sIj5BbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdFN0cnVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4odFN0cnVjdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCB0RmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW4odEZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCB0TWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbih0TWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWFwRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCB0TGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKHRMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCB0U2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbih0U2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVCb29sKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGUoYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMTYoaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTMyKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVJNjQobCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgdikKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKHYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRNYXBFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRCb29sKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEkxNigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkSTMyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkSTY0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQmluYXJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwppbmRleCBkNTcwYmI4Li5jMGYwMDdlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCkBAIC0yNSw0MSArMjUsNDMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKLQkJcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwotCQlwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOwotCQlwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOwotCQlwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgICBwdWJsaWMgY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKIAotCQlwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKyAgICAgICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbigpCi0JCQk6IGJhc2UoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbigpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQotCQkJOiBiYXNlKCkKLQkJewotCQkJdHlwZV8gPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0eXBlXyA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JCXsKLQkJCXJldHVybiB0eXBlXzsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBnZXRUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVfOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKaW5kZXggZWJjNzM2Ny4uNzEzNjBhMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCkBAIC0yNiw4ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkKLQl7Ci0JCVRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKTsKLQl9CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5CisgICAgeworICAgICAgICBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKaW5kZXggODJjZDNlMy4uZDk5NWM2YyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCkBAIC0yNSw3NCArMjUsODQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAotCXsKLQkJcHVibGljIHN0YXRpYyB2b2lkIFNraXAoVFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpCi0JCXsKLQkJCXN3aXRjaCAodHlwZSkKLQkJCXsKLQkJCQljYXNlIFRUeXBlLkJvb2w6Ci0JCQkJCXByb3QuUmVhZEJvb2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5CeXRlOgotCQkJCQlwcm90LlJlYWRCeXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuSTE2OgotCQkJCQlwcm90LlJlYWRJMTYoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5JMzI6Ci0JCQkJCXByb3QuUmVhZEkzMigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkk2NDoKLQkJCQkJcHJvdC5SZWFkSTY0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuRG91YmxlOgotCQkJCQlwcm90LlJlYWREb3VibGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TdHJpbmc6Ci0JCQkJCS8vIERvbid0IHRyeSB0byBkZWNvZGUgdGhlIHN0cmluZywganVzdCBza2lwIGl0LgotCQkJCQlwcm90LlJlYWRCaW5hcnkoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TdHJ1Y3Q6Ci0JCQkJCXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7Ci0JCQkJCXdoaWxlICh0cnVlKQotCQkJCQl7Ci0JCQkJCQlURmllbGQgZmllbGQgPSBwcm90LlJlYWRGaWVsZEJlZ2luKCk7Ci0JCQkJCQlpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQotCQkJCQkJewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJU2tpcChwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCXByb3QuUmVhZEZpZWxkRW5kKCk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkU3RydWN0RW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuTWFwOgotCQkJCQlUTWFwIG1hcCA9IHByb3QuUmVhZE1hcEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgbWFwLktleVR5cGUpOwotCQkJCQkJU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRNYXBFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TZXQ6Ci0JCQkJCVRTZXQgc2V0ID0gcHJvdC5SZWFkU2V0QmVnaW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuQ291bnQ7IGkrKykKLQkJCQkJewotCQkJCQkJU2tpcChwcm90LCBzZXQuRWxlbWVudFR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZFNldEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkxpc3Q6Ci0JCQkJCVRMaXN0IGxpc3QgPSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkTGlzdEVuZCgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRQcm90b2NvbFV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTa2lwKFRQcm90b2NvbCBwcm90LCBUVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCb29sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJpbmFyeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgVE1hcCBtYXAgPSBwcm90LlJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIG1hcC5WYWx1ZVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUU2V0IHNldCA9IHByb3QuUmVhZFNldEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgc2V0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFNldEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRMaXN0RW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwppbmRleCBhZmY3ZjY1Li5hOTE4YWI1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKQEAgLTI3LDI4ICsyNywzMyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUU2V0Ci0JewotCQlwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOwotCQlwcml2YXRlIGludCBjb3VudDsKKyAgICBwdWJsaWMgc3RydWN0IFRTZXQKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OwogCi0JCXB1YmxpYyBUU2V0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJfQorICAgICAgICBwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9Ci0JCQlzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXQoVExpc3QgbGlzdCkKKyAgICAgICAgICAgIDogdGhpcyhsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKaW5kZXggMzdkMTEwNi4uZjQ4NDRhNCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCkBAIC0yNywyMCArMjcsMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVFN0cnVjdAotCXsKLQkJcHJpdmF0ZSBzdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWU7CiAKLQkJcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0KKyAgICAgICAgICAgIHNldCB7IG5hbWUgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwppbmRleCBlZmM3YmVmLi45Y2U5MTVlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwpAQCAtMjUsMjAgKzI1LDIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKLQl7Ci0JCVN0b3AgPSAwLAotCQlWb2lkID0gMSwKLQkJQm9vbCA9IDIsCi0JCUJ5dGUgPSAzLAotCQlEb3VibGUgPSA0LAotCQlJMTYgPSA2LAotCQlJMzIgPSA4LAotCQlJNjQgPSAxMCwKLQkJU3RyaW5nID0gMTEsCi0JCVN0cnVjdCA9IDEyLAotCQlNYXAgPSAxMywKLQkJU2V0ID0gMTQsCi0JCUxpc3QgPSAxNQotCX0KKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKaW5kZXggN2JmMjc0Ny4uMmJjMDRmMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKQEAgLTI4LDExMiArMjgsMTI4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKLQl7Ci0JCS8qKgotCQkgKiBDb3JlIHByb2Nlc3NvcgotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm9jZXNzb3IgcHJvY2Vzc29yOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCisgICAgeworICAgICAgICAvL0F0dHJpYnV0ZXMKKyAgICAgICAgcHJvdGVjdGVkIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CiAKLQkJLyoqCi0JCSAqIFNlcnZlciB0cmFuc3BvcnQKLQkJICovCi0JCXByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgLy9NZXRob2RzCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIHNlaCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIC8vTG9nIGRlbGVnYXRpb24KKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgTG9nRGVsZWdhdGUoc3RyaW5nIHN0cik7CisgICAgICAgIHByaXZhdGUgTG9nRGVsZWdhdGUgX2xvZ0RlbGVnYXRlOworICAgICAgICBwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsgfQorICAgICAgICAgICAgc2V0IHsgX2xvZ0RlbGVnYXRlID0gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7IH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZShzKTsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAvL0NvbnN0cnVjdGlvbgorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBJbnB1dCBQcm90b2NvbCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotCQlwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKLQkJcHJvdGVjdGVkIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlOworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogRGVmYXVsdCBjb25zdHJ1Y3RvcnMuCi0JCSAqLworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0JCQk6dGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpOworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQlMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJewotCQkJdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0JCQl0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKLQkJCXRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotCQkJdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLQkJCXRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLQkJCXRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotCQkJdGhpcy5sb2dEZWxlZ2F0ZSA9IGxvZ0RlbGVnYXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBydW4gbWV0aG9kIGZpcmVzIHVwIHRoZSBzZXJ2ZXIgYW5kIGdldHMgdGhpbmdzIGdvaW5nLgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgU2VydmUoKTsKLQotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7Ci0KLQkJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIERlZmF1bHRMb2dEZWxlZ2F0ZShzdHJpbmcgcykKLQkJewotCQkJQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7Ci0JCX0KLQl9CisgICAgICAgIC8vQWJzdHJhY3QgSW50ZXJmYWNlCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKKyAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZWZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByZVNlcnZlKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIG9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgZGVsZXRlQ29udGV4dChvYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBwcm9jZXNzQ29udGV4dChvYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCk7CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKaW5kZXggYzZmZDk5ZS4uNGU3ZWE5NiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKQEAgLTI3LDEyNiArMjcsMTU0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOmJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJTG9nRGVsZWdhdGUgbG9nRGVsKQotCQkJOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbG9nRGVsKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLQkJCTpiYXNlKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLQkJCTpiYXNlKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOwotCQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCQlUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0JCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLQkJCQkJaWYgKGNsaWVudCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQkJCW91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJCQlpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotCQkJCQkJb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQkJCQkJCXdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsgfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCS8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KLQkJCQkJaWYgKHN0b3ApCi0JCQkJCXsKLQkJCQkJCWxvZ0RlbGVnYXRlKCJUU2ltcGxlU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eC5HZXRUeXBlKCkuTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKLQkJCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLQkJCQlpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWlucHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQorICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLQkJCQlpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQkJewotCQkJCQlvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCi0JCQlpZiAoc3RvcCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5wb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0JCXsKLQkJCXN0b3AgPSB0cnVlOwotCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKaW5kZXggY2Y4MzU0ZS4uYTQ5NGNlNyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwpAQCAtMjgsMTYzICsyOCwyNjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgYnVpbHQtaW4gVGhyZWFkUG9vbCB0byBzcGF3biB0aHJlYWRzIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IFRTZXJ2ZXIKLQl7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUlOX1RIUkVBRFMgPSAxMDsKLQkJcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKLQkJcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgYnVpbHQtaW4gVGhyZWFkUG9vbCB0byBzcGF3biB0aHJlYWRzIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAtMTsgIC8vIHVzZSAuTkVUIFRocmVhZFBvb2wgZGVmYXVsdHMKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKIAotCQlwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOnRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgc3RydWN0IENvbmZpZ3VyYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBNaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNaW5JT1RocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1heElPVGhyZWFkczsKIAotCQlwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW4gPSBERUZBVUxUX01JTl9USFJFQURTLCBpbnQgbWF4ID0gREVGQVVMVF9NQVhfVEhSRUFEUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heFdvcmtlclRocmVhZHMgPSBtYXg7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heElPVGhyZWFkcyA9IG1heDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24oaW50IG1pbldvcmssIGludCBtYXhXb3JrLCBpbnQgbWluSU8sIGludCBtYXhJTykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluV29yazsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4V29yazsKKyAgICAgICAgICAgICAgICBNaW5JT1RocmVhZHMgPSBtaW5JTzsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXhJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWluVGhyZWFkUG9vbFRocmVhZHMsIGludCBtYXhUaHJlYWRQb29sVGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24obWluVGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSwKKyAgICAgICAgICAgICBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiB0aHJlYWRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKHR5cGVvZihUVGhyZWFkUG9vbFNlcnZlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNYXhUaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNaW5UaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKIAotCQlwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJCSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLQkJCTp0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJCSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBpbnQgbWluVGhyZWFkUG9vbFRocmVhZHMsIGludCBtYXhUaHJlYWRQb29sVGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQotCQkJOmJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLQkJewotCQkJaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMobWluVGhyZWFkUG9vbFRocmVhZHMsIG1pblRocmVhZFBvb2xUaHJlYWRzKSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOwotCQkJfQotCQkJaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMobWF4VGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1heFRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOwotCQkJfQotCQl9CisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlpbnQgZmFpbHVyZUNvdW50ID0gMDsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOwotCQkJCQlUaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKHRoaXMuRXhlY3V0ZSwgY2xpZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJaWYgKHN0b3ApCi0JCQkJCXsKLQkJCQkJCWxvZ0RlbGVnYXRlKCJUVGhyZWFkUG9vbFNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICIgKyB0dHguR2V0VHlwZSgpLk5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJKytmYWlsdXJlQ291bnQ7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7Ci0JCQkJCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBpZiAoc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQlpZiAoc3RvcCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJfQotCQkJCXN0b3AgPSBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKKyAgICAgICAgLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZShvYmplY3QgdGhyZWFkQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpdGhyZWFkQ29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCi0JCS8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KLQkJcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoT2JqZWN0IHRocmVhZENvbnRleHQpCi0JCXsKLQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpdGhyZWFkQ29udGV4dDsKLQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCW91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLQkJCQlvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCQkJCXdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0JCQkJewotCQkJCQkvL2tlZXAgcHJvY2Vzc2luZyByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLQkJCXsKLQkJCQkvLyBBc3N1bWUgdGhlIGNsaWVudCBkaWVkIGFuZCBjb250aW51ZSBzaWxlbnRseQotCQkJCS8vQ29uc29sZS5Xcml0ZUxpbmUodHR4KTsKLQkJCX0KLQkJCQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwogCi0JCQlpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJfQotCQkJaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLQkJewotCQkJc3RvcCA9IHRydWU7Ci0JCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2xvc2UgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2FibGUgc3R1ZmYgc2hvdWxkIGJlIGRpc3Bvc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKaW5kZXggNzUyMDZmMS4uY2MwNTFhMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCkBAIC0yNiwyMDkgKzI2LDI1NyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlcgotCXsKLQkJcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKLQkJcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLQkJcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4VGhyZWFkczsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgdGhyZWFkcyAoYXMgb3Bwb3NlZCB0byB0aGUgVGhyZWFkUG9vbCkgd2hlbiBoYW5kbGluZyByZXF1ZXN0cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOwogCi0JCXByaXZhdGUgUXVldWU8VFRyYW5zcG9ydD4gY2xpZW50UXVldWU7Ci0JCXByaXZhdGUgVEhhc2hTZXQ8VGhyZWFkPiBjbGllbnRUaHJlYWRzOwotCQlwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOwotCQlwcml2YXRlIFRocmVhZCB3b3JrZXJUaHJlYWQ7CisgICAgICAgIHByaXZhdGUgUXVldWU8VFRyYW5zcG9ydD4gY2xpZW50UXVldWU7CisgICAgICAgIHByaXZhdGUgVEhhc2hTZXQ8VGhyZWFkPiBjbGllbnRUaHJlYWRzOworICAgICAgICBwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOworICAgICAgICBwcml2YXRlIFRocmVhZCB3b3JrZXJUaHJlYWQ7CiAKLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgaW50IENsaWVudFRocmVhZHNDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY2xpZW50VGhyZWFkcy5Db3VudDsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJCSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0JCQkJIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgaW50IG1heFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCSAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotCQl7Ci0JCQl0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOwotCQkJY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKLQkJCWNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7Ci0JCQljbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKLQkJfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgICAgICAgICAgY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgIGNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBjbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgPCBtYXhUSHJlYWRzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy9zdGFydCB3b3JrZXIgdGhyZWFkCi0JCQkJd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOwotCQkJCXdvcmtlclRocmVhZC5TdGFydCgpOwotCQkJCXNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgJmx0OyBtYXhUaHJlYWRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vc3RhcnQgd29ya2VyIHRocmVhZAorICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLQkJCQkJbG9jayAoY2xpZW50TG9jaykKLQkJCQkJewotCQkJCQkJY2xpZW50UXVldWUuRW5xdWV1ZShjbGllbnQpOwotCQkJCQkJTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlpZiAoc3RvcCkKLQkJCQkJewotCQkJCQkJbG9nRGVsZWdhdGUoIlRUaHJlYWRQb29sU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkrK2ZhaWx1cmVDb3VudDsKLQkJCQkJCWxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLQkJCQkJfQorICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UXVldWUuRW5xdWV1ZShjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQlpZiAoc3RvcCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlsb2dEZWxlZ2F0ZSgiVFNlcnZlVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotCQkvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBFeGVjdXRlKCkKLQkJewotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCVRUcmFuc3BvcnQgY2xpZW50OwotCQkJCVRocmVhZCB0OwotCQkJCWxvY2sgKGNsaWVudExvY2spCi0JCQkJewotCQkJCQkvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKLQkJCQkJd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKLQkJCQkJewotCQkJCQkJTW9uaXRvci5XYWl0KGNsaWVudExvY2spOwotCQkJCQl9CisgICAgICAgICAgICBpZiAoc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCQkJd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCi0JCQkJCXsKLQkJCQkJCU1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLQkJCQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7CisgICAgICAgICAgICAgICAgVGhyZWFkIHQ7CisgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgZGVxdWV1ZSBpZiB0b28gbWFueSBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xpZW50VGhyZWFkcy5Db3VudCA+PSBtYXhUaHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQljbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7Ci0JCQkJCXQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7Ci0JCQkJCWNsaWVudFRocmVhZHMuQWRkKHQpOwotCQkJCX0KLQkJCQkvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAotCQkJCXQuU3RhcnQoY2xpZW50KTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xpZW50UXVldWUuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihPYmplY3QgY29udGV4dCkKLQkJewotCQkJVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCljb250ZXh0OwotCQkJVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQlUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQlUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0JCQlUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotCQkJCW91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0JCQkJd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLQkJCQl7Ci0JCQkJCS8va2VlcCBwcm9jZXNzaW5nIHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQotCQkJewotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOwotCQkJfQorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuQWRkKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAorICAgICAgICAgICAgICAgIHQuU3RhcnQoY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQlpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJfQotCQkJaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgQ2xpZW50V29ya2VyKG9iamVjdCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCljb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKIAotCQkJbG9jayAoY2xpZW50TG9jaykKLQkJCXsKLQkJCQljbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7Ci0JCQkJTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCi0JCQl3b3JrZXJUaHJlYWQuQWJvcnQoKTsKLQkJCWZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCi0JCQl7Ci0JCQkJdC5BYm9ydCgpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCisgICAgICAgICAgICB3b3JrZXJUaHJlYWQuQWJvcnQoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdC5BYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCmluZGV4IGNjMjlmMGEuLjhkZDdhZTUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKQEAgLTI2LDExMCArMjYsMTIxIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQKIHsKLQlwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogRXhjZXB0aW9uCi0JewotCQlwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlOworICAgIHB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlOwogCi0JCXB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIG51bGwpIC8vIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBzZXJpYWxpemFibGUsIGJ1dCB3ZSBuZXZlciBzZXJpYWxpemUgSW5uZXJFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIFJlYWQoVFByb3RvY29sIGlwcm90KQotCQl7Ci0JCQlURmllbGQgZmllbGQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIFJlYWQoVFByb3RvY29sIGlwcm90KQorICAgICAgICB7CisgICAgICAgICAgICBURmllbGQgZmllbGQ7CiAKLQkJCXN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCUV4Y2VwdGlvblR5cGUgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKyAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgIEV4Y2VwdGlvblR5cGUgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKIAotCQkJd2hpbGUgKHRydWUpCi0JCQl7Ci0JCQkJZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOwotCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJc3dpdGNoIChmaWVsZC5JRCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKLQkJCQkJCXsKLQkJCQkJCQltZXNzYWdlID0gaXByb3QuUmVhZFN0cmluZygpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQotCQkJCQkJewotCQkJCQkJCXR5cGUgPSAoRXhjZXB0aW9uVHlwZSlpcHJvdC5SZWFkSTMyKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5SZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChFeGNlcHRpb25UeXBlKWlwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaXByb3QuUmVhZEZpZWxkRW5kKCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgaXByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CiAKLQkJCWlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKIAotCQkJcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KQotCQl7Ci0JCQlUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CiAKLQkJCW9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CiAKLQkJCWlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCi0JCQl7Ci0JCQkJZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKLQkJCQlmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOwotCQkJCWZpZWxkLklEID0gMTsKLQkJCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJCW9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOwotCQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCX0KKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gMTsKKyAgICAgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJZmllbGQuTmFtZSA9ICJ0eXBlIjsKLQkJCWZpZWxkLlR5cGUgPSBUVHlwZS5JMzI7Ci0JCQlmaWVsZC5JRCA9IDI7Ci0JCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJb3Byb3QuV3JpdGVJMzIoKGludCl0eXBlKTsKLQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCW9wcm90LldyaXRlRmllbGRTdG9wKCk7Ci0JCQlvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOwotCQl9CisgICAgICAgICAgICBmaWVsZC5OYW1lID0gInR5cGUiOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gMjsKKyAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUkzMigoaW50KXR5cGUpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlU3RydWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCi0JCXsKLQkJCVVua25vd24sCi0JCQlVbmtub3duTWV0aG9kLAotCQkJSW52YWxpZE1lc3NhZ2VUeXBlLAotCQkJV3JvbmdNZXRob2ROYW1lLAotCQkJQmFkU2VxdWVuY2VJRCwKLQkJCU1pc3NpbmdSZXN1bHQKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSUQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9jZXNzZXMgYSBtZXNzYWdlIGFzeW5jaHJvbm91c2x5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb2Nlc3NlcyB0aGUgbmV4dCBwYXJ0IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlwcm90Ij5UaGUgaW5wdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHJvdCI+VGhlIG91dHB1dCBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLjwvcmV0dXJucz4KKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMjkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVENvbnRyb2xsaW5nSGFuZGxlcgorICAgIHsKKyAgICAgICAgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWEyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCmluZGV4IGRjMWI3OTUuLjcxY2U3NTUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcwpAQCAtMjYsOCArMjYsOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yCi0JewotCQlib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY2MzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzMCBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ3MjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxQLCBIPiA6IFRQcm9jZXNzb3JGYWN0b3J5IHdoZXJlIFAgOiBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBvYmplY3RbXSBoYW5kbGVyQXJncyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlckFyZ3MgPSBuZXcgb2JqZWN0WzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KHBhcmFtcyBvYmplY3RbXSBoYW5kbGVyQXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyQXJncyA9IGhhbmRsZXJBcmdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSCBoYW5kbGVyID0gKEgpQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihIKSwgaGFuZGxlckFyZ3MpOworCisgICAgICAgICAgICBUQ29udHJvbGxpbmdIYW5kbGVyIGhhbmRsZXJTZXJ2ZXJSZWYgPSBoYW5kbGVyIGFzIFRDb250cm9sbGluZ0hhbmRsZXI7CisgICAgICAgICAgICBpZiAoaGFuZGxlclNlcnZlclJlZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJTZXJ2ZXJSZWYuc2VydmVyID0gc2VydmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSh0eXBlb2YoUCksIG5ldyBvYmplY3RbXSB7IGhhbmRsZXIgfSkgYXMgVFByb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyODk3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisKKyAgICAgICAgcHVibGljIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3Nvcl87CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI4YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpAQCAtMCwwICsxLDEyOSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPntFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ0NTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRztORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQWJzdHJhY3RCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlNjRVdGlscy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFzeW5jUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwVGFza0FzeW5jSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0VmVyc2lvbml6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTdHJlYW1UcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTZXJ2ZXJTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxDb2xsZWN0aW9uc1wiIC8+CisgICAgPEZvbGRlciBJbmNsdWRlPSJTZXJ2ZXJcUHJvdG9jb2xcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCBmMzgyZjQwLi5iZjY1NTY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTEsNCArMSw1IEBACi3vu788IS0tCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNiw3ICsxNyw3IEBACiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxQcm9wZXJ0eUdyb3VwPgogICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgogICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KQEAgLTI5LDY1ICszMCwxMjggQEAKICAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgogICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KICAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgogICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KICAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KICAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEZWZpbmVDb25zdGFudHM+CisgICAgPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgogICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CiAgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmV0MzVcRXh0ZW5zaW9uc05ldDM1LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xGYWN0b3J5LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXJFdmVudEhhbmRsZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CiAgIDwvSXRlbUdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU0hBUlAuVGFyZ2V0cyIgLz4KICAgPFByb2plY3RFeHRlbnNpb25zPgogICAgIDxWaXN1YWxTdHVkaW8gQWxsb3dFeGlzdGluZ0ZvbGRlcj0idHJ1ZSIgLz4KICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLTwvUHJvamVjdD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgppbmRleCAyOTU1Mzc5Li5hMjllNDY4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KQEAgLTEsMzMgKzEsMTYgQEAKLe+7vyMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwCi0jIFZpc3VhbCBTdHVkaW8gMjAwOAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIlRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCiBFbmRQcm9qZWN0Ci1Qcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiLi5cLi5cLi5cdGVzdFxjc2hhcnBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0LmNzcHJvaiIsICJ7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0KLQlFbmRQcm9qZWN0U2VjdGlvbgorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIi4uXHRlc3RcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0LmNzcHJvaiIsICJ7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfSIKIEVuZFByb2plY3QKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVNCdWlsZFRhc2siLCAiLi5cVGhyaWZ0TVNCdWlsZFRhc2tcVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIiwgIntFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9IgogRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQuNDUiLCAiVGhyaWZ0LjQ1LmNzcHJvaiIsICJ7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVZDVGVzdCIsICIuLlx0ZXN0XFRocmlmdE1WQ1Rlc3RcVGhyaWZ0TVZDVGVzdC5jc3Byb2oiLCAiezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0iCitFbmRQcm9qZWN0CiBHbG9iYWwKIAlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgogCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQpAQCAtNDYsOCArMjksMTkgQEAKIAkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQogCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCiAJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQogCUVuZEdsb2JhbFNlY3Rpb24KIAlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgogCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKIAlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJICAgICAgICBTdGFydHVwSXRlbSA9IFRocmlmdC5jc3Byb2oKKwlFbmRHbG9iYWxTZWN0aW9uCiBFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCmluZGV4IDI4YTg1NWEuLjg4NzA5ODggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcwpAQCAtMjIsNzkgKzIyLDE3MyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0Ci0JewotCQlwcml2YXRlIEJ1ZmZlcmVkU3RyZWFtIGlucHV0QnVmZmVyOwotCQlwcml2YXRlIEJ1ZmZlcmVkU3RyZWFtIG91dHB1dEJ1ZmZlcjsKLQkJcHJpdmF0ZSBpbnQgYnVmU2l6ZTsKLQkJcHJpdmF0ZSBUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGJ1ZlNpemU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGlucHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKIAotCQlwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0KQotCQkJOnRoaXModHJhbnNwb3J0LCAxMDI0KQotCQl7CisgICAgICAgIHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBidWZTaXplID0gMTAyNCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInRyYW5zcG9ydCIpOworICAgICAgICAgICAgaWYgKGJ1ZlNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImJ1ZlNpemUiLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgfQogCi0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBidWZTaXplKQotCQl7Ci0JCQl0aGlzLmJ1ZlNpemUgPSBidWZTaXplOwotCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCQlJbml0QnVmZmVycygpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBJbml0QnVmZmVycygpCi0JCXsKLQkJCWlmICh0cmFuc3BvcnQuSW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuSW5wdXRTdHJlYW0sIGJ1ZlNpemUpOwotCQkJfQotCQkJaWYgKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0Ci0JCXsKLQkJCWdldCB7IHJldHVybiB0cmFuc3BvcnQ7IH0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCi0JCXsKLQkJCWdldCB7IHJldHVybiB0cmFuc3BvcnQuSXNPcGVuOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJCUluaXRCdWZmZXJzKCk7Ci0JCX0KKyAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBidWZTaXplOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKGlucHV0QnVmZmVyICE9IG51bGwgJiYgaW5wdXRCdWZmZXIuQ2FuUmVhZCkKLQkJCXsKLQkJCQlpbnB1dEJ1ZmZlci5DbG9zZSgpOwotCQkJfQotCQkJaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsICYmIG91dHB1dEJ1ZmZlci5DYW5Xcml0ZSkKLQkJCXsKLQkJCQlvdXRwdXRCdWZmZXIuQ2xvc2UoKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGdvdCA9IGlucHV0QnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CiAKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCXJldHVybiBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoaW5wdXRCdWZmZXIuQ2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGludCBmaWxsZWQgPSB0cmFuc3BvcnQuUmVhZChpbnB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClpbnB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjYXBhID0gKGludCkob3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW50IHdyaXRlU2l6ZSA9IGNhcGEgPD0gbGVuID8gY2FwYSA6IGxlbjsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIHdyaXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHdyaXRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVTaXplID09IGNhcGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUob3V0cHV0QnVmZmVyLkdldEJ1ZmZlcigpLCAwLCAoaW50KW91dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChsZW4gLSBvZmZzZXQgPj0gYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCBvZmYgKyBvZmZzZXQsIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBidWZTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJlbWFpbiA9IGxlbiAtIG9mZnNldDsKKyAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgPCBidWZTaXplKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgPSBidWZTaXplOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgcmVtYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJb3V0cHV0QnVmZmVyLkZsdXNoKCk7Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbnRlcm5hbEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5CZWdpbkZsdXNoKCBjYWxsYmFjaywgc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEJ1ZmZlcmVkVHJhbnNwb3J0Iik7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByb3RlY3RlZCBib29sIF9Jc0Rpc3Bvc2VkIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcwppbmRleCBiN2FkNWYyLi5hNzQ2YTMyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcwpAQCAtMTYsOTkgKzE2LDE5MCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQordXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLklPOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKLQkJcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7Ci0JCXByb3RlY3RlZCBNZW1vcnlTdHJlYW0gcmVhZEJ1ZmZlciA9IG51bGw7CisgICAgcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKIAotCQlwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5Ci0JCXsKLQkJCXB1YmxpYyBvdmVycmlkZSBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQotCQkJewotCQkJCXJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIGhlYWRlckJ1ZiA9IG5ldyBieXRlW0hlYWRlclNpemVdOwogCi0JCXB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KQotCQl7Ci0JCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLQkJfQorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJfQorICAgICAgICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInRyYW5zcG9ydCIpOworICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWlmIChyZWFkQnVmZmVyICE9IG51bGwpCi0JCQl7Ci0JCQkJaW50IGdvdCA9IHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJCQlpZiAoZ290ID4gMCkKLQkJCQl7Ci0JCQkJCXJldHVybiBnb3Q7Ci0JCQkJfQotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CiAKLQkJCS8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCi0JCQlSZWFkRnJhbWUoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQorICAgICAgICAgICAgUmVhZEZyYW1lKCk7CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRGcmFtZSgpCi0JCXsKLQkJCWJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoaTMycmQsIDAsIDQpOwotCQkJaW50IHNpemUgPQotCQkJCSgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAotCQkJCSgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAotCQkJCSgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAotCQkJCSgoaTMycmRbM10gJiAweGZmKSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQl0cmFuc3BvcnQuUmVhZEFsbChidWZmLCAwLCBzaXplKTsKLQkJCXJlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKGJ1ZmYpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQl3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZXRMZW5ndGgoc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBieXRlW10gYnVmZiA9IHJlYWRCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChidWZmLCAwLCBzaXplKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyLkdldEJ1ZmZlcigpOwotCQkJaW50IGxlbiA9IChpbnQpd3JpdGVCdWZmZXIuTGVuZ3RoOwotCQkJd3JpdGVCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKHdyaXRlQnVmZmVyLkNhcGFjaXR5KTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyLkxlbmd0aCArIChsb25nKWxlbiA+IChsb25nKWludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgICAgICBGbHVzaCgpOworICAgICAgICAgICAgd3JpdGVCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQkJYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOwotCQkJaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAobGVuID4+IDI0KSk7Ci0JCQlpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChsZW4gPj4gMTYpKTsKLQkJCWkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGxlbiA+PiA4KSk7Ci0JCQlpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChsZW4pKTsKLQkJCXRyYW5zcG9ydC5Xcml0ZShpMzJvdXQsIDAsIDQpOwotCQkJdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKLQkJCXRyYW5zcG9ydC5GbHVzaCgpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgSW50ZXJuYWxGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlci5HZXRCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSAoaW50KXdyaXRlQnVmZmVyLkxlbmd0aDsKKyAgICAgICAgICAgIGludCBkYXRhX2xlbiA9IGxlbiAtIEhlYWRlclNpemU7CisgICAgICAgICAgICBpZiAoZGF0YV9sZW4gPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAvLyBsb2dpYyBlcnJvciBhY3R1YWxseQorCisgICAgICAgICAgICAvLyBJbmplY3QgbWVzc2FnZSBoZWFkZXIgaW50byB0aGUgcmVzZXJ2ZWQgYnVmZmVyIHNwYWNlCisgICAgICAgICAgICBFbmNvZGVGcmFtZVNpemUoZGF0YV9sZW4sIGJ1Zik7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGVudGlyZSBtZXNzYWdlIGF0IG9uY2UKKyAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIDAsIGxlbik7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5FbmRGbHVzaCggYXN5bmNSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRXcml0ZUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyLlNldExlbmd0aChIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5FbmQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBFbmNvZGVGcmFtZVNpemUoaW50IGZyYW1lU2l6ZSwgYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgYnVmWzBdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDI0KSk7CisgICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gMTYpKTsKKyAgICAgICAgICAgIGJ1ZlsyXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiA4KSk7CisgICAgICAgICAgICBidWZbM10gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBEZWNvZGVGcmFtZVNpemUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlszXSAmIDB4ZmYpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0lzRGlzcG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJURnJhbWVkVHJhbnNwb3J0Iik7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCmluZGV4IGJmNmNhNGQuLjY2N2ZjMjUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKQEAgLTcsNyArNyw3IEBACiAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKgkgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTE1LDE3NCArMTUsNDYxIEBACiAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqIAorICoKKyAqCiAgKi8KIAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPLkNvbXByZXNzaW9uOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgcmVhZG9ubHkgVXJpIHVyaTsKLQkJcHJpdmF0ZSBTdHJlYW0gaW5wdXRTdHJlYW07Ci0JCXByaXZhdGUgTWVtb3J5U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLQkJcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXQgPSAwOwotCQlwcml2YXRlIGludCByZWFkVGltZW91dCA9IDA7Ci0JCXByaXZhdGUgSURpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBVcmkgdXJpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlczsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKIAotCQlwdWJsaWMgVEh0dHBDbGllbnQoVXJpIHUpCi0JCXsKLQkJCXVyaSA9IHU7Ci0JCX0KKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0ID0gMzAwMDA7CiAKLQkJcHVibGljIGludCBDb25uZWN0VGltZW91dAotCQl7Ci0JCQlzZXQKLQkJCXsKLQkJCSAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXQgPSAzMDAwMDsKIAotCQlwdWJsaWMgaW50IFJlYWRUaW1lb3V0Ci0JCXsKLQkJCXNldAotCQkJewotCQkJCXJlYWRUaW1lb3V0ID0gdmFsdWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOwogCi0JCXB1YmxpYyBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gQ3VzdG9tSGVhZGVycwotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gY3VzdG9tSGVhZGVyczsKLQkJCX0KLQkJfQorI2lmICFTSUxWRVJMSUdIVAorICAgICAgICBwcml2YXRlIElXZWJQcm94eSBwcm94eSA9IFdlYlJlcXVlc3QuRGVmYXVsdFdlYlByb3h5OworI2VuZGlmCiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBUSHR0cENsaWVudChVcmkgdSkKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnQoVXJpIHUsIElFbnVtZXJhYmxlPFg1MDlDZXJ0aWZpY2F0ZT4gY2VydGlmaWNhdGVzKQorICAgICAgICB7CisgICAgICAgICAgICB1cmkgPSB1OworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCWlucHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJfQotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dFN0cmVhbS5DbG9zZSgpOwotCQkJCW91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIGludCBDb25uZWN0VGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0VGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBpbnQgUmVhZFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQl0cnkKLQkJCXsKLQkJCQlpbnQgcmV0ID0gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBDdXN0b21IZWFkZXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21IZWFkZXJzOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCQlpZiAocmV0ID09IC0xKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKLQkJCQl9CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHB1YmxpYyBJV2ViUHJveHkgUHJveHkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJveHkgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCiAKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKLQkJCXsgCi0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJdHJ5IAotCQkJewotCQkJCVNlbmRSZXF1ZXN0KCk7Ci0JCQl9Ci0JCQlmaW5hbGx5Ci0JCQl7Ci0JCQkJb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBTZW5kUmVxdWVzdCgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUh0dHBXZWJSZXF1ZXN0IGNvbm5lY3Rpb24gPSBDcmVhdGVSZXF1ZXN0KCk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQogCi0JCQkJYnl0ZVtdIGRhdGEgPSBvdXRwdXRTdHJlYW0uVG9BcnJheSgpOwotCQkJCWNvbm5lY3Rpb24uQ29udGVudExlbmd0aCA9IGRhdGEuTGVuZ3RoOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IGlucHV0U3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CiAKLQkJCQlTdHJlYW0gcmVxdWVzdFN0cmVhbSA9IGNvbm5lY3Rpb24uR2V0UmVxdWVzdFN0cmVhbSgpOwotCQkJCXJlcXVlc3RTdHJlYW0uV3JpdGUoZGF0YSwgMCwgZGF0YS5MZW5ndGgpOwotCQkJCWlucHV0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXNwb25zZSgpLkdldFJlc3BvbnNlU3RyZWFtKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW94KQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoV2ViRXhjZXB0aW9uIHd4KQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcHJpdmF0ZSBIdHRwV2ViUmVxdWVzdCBDcmVhdGVSZXF1ZXN0KCkKLQkJewotCQkJSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IChIdHRwV2ViUmVxdWVzdClXZWJSZXF1ZXN0LkNyZWF0ZSh1cmkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQlpZiAoY29ubmVjdFRpbWVvdXQgPiAwKQotCQkJewotCQkJCWNvbm5lY3Rpb24uVGltZW91dCA9IGNvbm5lY3RUaW1lb3V0OwotCQkJfQotCQkJaWYgKHJlYWRUaW1lb3V0ID4gMCkKLQkJCXsKLQkJCQljb25uZWN0aW9uLlJlYWRXcml0ZVRpbWVvdXQgPSByZWFkVGltZW91dDsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJCS8vIE1ha2UgdGhlIHJlcXVlc3QKLQkJCWNvbm5lY3Rpb24uQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOwotCQkJY29ubmVjdGlvbi5BY2NlcHQgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOwotCQkJY29ubmVjdGlvbi5Vc2VyQWdlbnQgPSAiQyMvVEh0dHBDbGllbnQiOwotCQkJY29ubmVjdGlvbi5NZXRob2QgPSAiUE9TVCI7Ci0JCQljb25uZWN0aW9uLlByb3RvY29sVmVyc2lvbiA9IEh0dHBWZXJzaW9uLlZlcnNpb24xMDsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZW5kUmVxdWVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQkvL2FkZCBjdXN0b20gaGVhZGVycyBoZXJlCi0JCQlmb3JlYWNoIChLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+IGl0ZW0gaW4gY3VzdG9tSGVhZGVycykKLQkJCXsKLQkJCQljb25uZWN0aW9uLkhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKLQkJCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNlbmRSZXF1ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnMuQWRkKCJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpOwogCi0JCQljb25uZWN0aW9uLlByb3h5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CiAKLQkJCXJldHVybiBjb25uZWN0aW9uOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gcmVxdWVzdFN0cmVhbSA9IGNvbm5lY3Rpb24uR2V0UmVxdWVzdFN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbS5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBIVFRQIGhhbmcgdGhhdCBjYW4gaGFwcGVucyBhZnRlciBzdWNjZXNzaXZlIGNhbGxzIGJ5IG1ha2luZyBzdXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgcmVsZWFzZSB0aGUgcmVzcG9uc2UgYW5kIHJlc3BvbnNlIHN0cmVhbS4gVG8gc3VwcG9ydCB0aGlzLCB3ZSBjb3B5CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNwb25zZSB0byBhIG1lbW9yeSBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcmVzcG9uc2UgPSBjb25uZWN0aW9uLkdldFJlc3BvbnNlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcmVzcG9uc2VTdHJlYW0gPSByZXNwb25zZS5HZXRSZXNwb25zZVN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbSBzbyB0aGF0IHdlIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFubHkgY2xvc2UgdGhlIHJlc3BvbnNlIGFuZCByZXNwb25zZSBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSByZXNwb25zZVN0cmVhbS5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLldyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5ncyA9IHJlc3BvbnNlLkhlYWRlcnMuR2V0VmFsdWVzKCJDb250ZW50LUVuY29kaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVuY29kaW5nIGluIGVuY29kaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImd6aXAiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NHWmlwcGVkKHJlZiBpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkZWZsYXRlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChXZWJFeGNlcHRpb24gd3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4LCB3eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0RlZmxhdGVkKHJlZiBTdHJlYW0gaW5wdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB1c2luZyAodmFyIGRlY29tcCA9IG5ldyBEZWZsYXRlU3RyZWFtKGlucHV0U3RyZWFtLCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVjb21wLkNvcHlUbyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0bXA7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlY29tcHJlc3NHWmlwcGVkKHJlZiBTdHJlYW0gaW5wdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB1c2luZyAodmFyIGRlY29tcCA9IG5ldyBHWmlwU3RyZWFtKGlucHV0U3RyZWFtLCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVjb21wLkNvcHlUbyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0bXA7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcHJpdmF0ZSBIdHRwV2ViUmVxdWVzdCBDcmVhdGVSZXF1ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IChIdHRwV2ViUmVxdWVzdClXZWJSZXF1ZXN0LkNyZWF0ZSh1cmkpOworCisKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIC8vIEFkZGluZyBjZXJ0aWZpY2F0ZXMgdGhyb3VnaCBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBXUDcgU2lsdmVybGlnaHQKKyAgICAgICAgICAgIC8vIHNlZSAiV2luZG93cyBQaG9uZSA3IGFuZCBDZXJ0aWZpY2F0ZXNfRklOQUxfMTIxNjEwLnBkZiIKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uQ2xpZW50Q2VydGlmaWNhdGVzLkFkZFJhbmdlKGNlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0VGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5UaW1lb3V0ID0gY29ubmVjdFRpbWVvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVhZFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uUmVhZFdyaXRlVGltZW91dCA9IHJlYWRUaW1lb3V0OworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0CisgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uQWNjZXB0ID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uVXNlckFnZW50ID0gIkMjL1RIdHRwQ2xpZW50IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uTWV0aG9kID0gIlBPU1QiOworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgY29ubmVjdGlvbi5Qcm90b2NvbFZlcnNpb24gPSBIdHRwVmVyc2lvbi5WZXJzaW9uMTA7CisjZW5kaWYKKworICAgICAgICAgICAgLy9hZGQgY3VzdG9tIGhlYWRlcnMgaGVyZQorICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPiBpdGVtIGluIGN1c3RvbUhlYWRlcnMpCisgICAgICAgICAgICB7CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5IZWFkZXJzLkFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7CisjZWxzZQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVyc1tpdGVtLktleV0gPSBpdGVtLlZhbHVlOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uUHJveHkgPSBwcm94eTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgcmVxdWVzdCBhbmQgcmVzZXQgYnVmZmVyCisgICAgICAgICAgICB2YXIgZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIC8vcmVxdWVzdEJ1ZmZlcl8gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIG9iamVjdAorICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gbmV3IEZsdXNoQXN5bmNSZXN1bHQoY2FsbGJhY2ssIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkNvbm5lY3Rpb24gPSBDcmVhdGVSZXF1ZXN0KCk7CisKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkRhdGEgPSBkYXRhOworCisKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkNvbm5lY3Rpb24uQmVnaW5HZXRSZXF1ZXN0U3RyZWFtKEdldFJlcXVlc3RTdHJlYW1DYWxsYmFjaywgZmx1c2hBc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsdXNoQXN5bmNSZXN1bHQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LlRvU3RyaW5nKCksIGlveCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNSZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWZsdXNoQXN5bmNSZXN1bHQuSXNDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdEhhbmRsZSA9IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNXYWl0SGFuZGxlOworICAgICAgICAgICAgICAgICAgICB3YWl0SGFuZGxlLldhaXRPbmUoKTsgIC8vIGJsb2NraW5nIElORklOSVRFbHkKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBHZXRSZXF1ZXN0U3RyZWFtQ2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jaHJvbm91c1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY2hyb25vdXNSZXN1bHQuQXN5bmNTdGF0ZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXFTdHJlYW0gPSBmbHVzaEFzeW5jUmVzdWx0LkNvbm5lY3Rpb24uRW5kR2V0UmVxdWVzdFN0cmVhbShhc3luY2hyb25vdXNSZXN1bHQpOworICAgICAgICAgICAgICAgIHJlcVN0cmVhbS5Xcml0ZShmbHVzaEFzeW5jUmVzdWx0LkRhdGEsIDAsIGZsdXNoQXN5bmNSZXN1bHQuRGF0YS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHJlcVN0cmVhbS5GbHVzaCgpOworICAgICAgICAgICAgICAgIHJlcVN0cmVhbS5DbG9zZSgpOworCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gZ2V0IHRoZSByZXNwb25zZQorICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5CZWdpbkdldFJlc3BvbnNlKEdldFJlc3BvbnNlQ2FsbGJhY2ssIGZsdXNoQXN5bmNSZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgR2V0UmVzcG9uc2VDYWxsYmFjayhJQXN5bmNSZXN1bHQgYXN5bmNocm9ub3VzUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jaHJvbm91c1Jlc3VsdC5Bc3luY1N0YXRlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBmbHVzaEFzeW5jUmVzdWx0LkNvbm5lY3Rpb24uRW5kR2V0UmVzcG9uc2UoYXN5bmNocm9ub3VzUmVzdWx0KS5HZXRSZXNwb25zZVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmFzZWQgb24gaHR0cDovL21zbXZwcy5jb20vYmxvZ3MvbHVpc2FicmV1L2FyY2hpdmUvMjAwOS8wNi8xNS9tdWx0aXRocmVhZGluZy1pbXBsZW1lbnRpbmctdGhlLWlhc3luY3Jlc3VsdC1pbnRlcmZhY2UuYXNweAorICAgICAgICBjbGFzcyBGbHVzaEFzeW5jUmVzdWx0IDogSUFzeW5jUmVzdWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQm9vbGVhbiBfaXNDb21wbGV0ZWQ7CisgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgX2V2dDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXN5bmNDYWxsYmFjayBfY2JNZXRob2Q7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfc3RhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2JNZXRob2QgPSBjYk1ldGhvZDsKKyAgICAgICAgICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIERhdGEgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgSHR0cFdlYlJlcXVlc3QgQ29ubmVjdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBUVHJhbnNwb3J0RXhjZXB0aW9uIEFzeW5jRXhjZXB0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBBc3luY1N0YXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zdGF0ZTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIFdhaXRIYW5kbGUgQXN5bmNXYWl0SGFuZGxlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEdldEV2dEhhbmRsZSgpOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDb21wbGV0ZWRTeW5jaHJvbm91c2x5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0NvbXBsZXRlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9sb2NrZXIgPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgR2V0RXZ0SGFuZGxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrIChfbG9ja2VyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9ldnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX2lzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZXZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBVcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaXNDb21wbGV0ZWQgPSB0cnVlOyAvLzEuIHNldCBfaXNjb21wbGV0ZWQgdG8gdHJ1ZQorICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOyAvLzIuIHNldCB0aGUgZXZlbnQsIHdoZW4gaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NiTWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2JNZXRob2QodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE1ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5XZWI7Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLklPOworCit1c2luZyBUaHJpZnQuUHJvdG9jb2w7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRIdHRwSGFuZGxlciA6IElIdHRwSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm9jZXNzb3IgcHJvY2Vzc29yOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByb3RlY3RlZCBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjg7CisKKyAgICAgICAgcHVibGljIFRIdHRwSGFuZGxlcihUUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cEhhbmRsZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwSGFuZGxlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBQcm9jZXNzUmVxdWVzdChIdHRwTGlzdGVuZXJDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICBQcm9jZXNzUmVxdWVzdChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFByb2Nlc3NSZXF1ZXN0KEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICBQcm9jZXNzUmVxdWVzdChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFByb2Nlc3NSZXF1ZXN0KFN0cmVhbSBpbnB1dCwgU3RyZWFtIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChpbnB1dCxvdXRwdXQpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JldXNhYmxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDkxZjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcwpAQCAtMCwwICsxLDk3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XZWI7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBbiBhc3luYyB0YXNrIGJhc2VkIEhUVFAgaGFuZGxlciBmb3IgcHJvY2Vzc2luZyB0aHJpZnQgc2VydmljZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBUYXNrQXN5bmNIYW5kbGVyIDogSHR0cFRhc2tBc3luY0hhbmRsZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVEFzeW5jUHJvY2Vzc29yIF9wcm9jZXNzb3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sRmFjdG9yeSBfaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sRmFjdG9yeSBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcworICAgICAgICAvLy8gdXNpbmcgdGhlIDxzZWUgY3JlZj0iVEJpbmFyeVByb3RvY29sLkZhY3RvcnkiLz4gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb2Nlc3NvciI+VGhlIGFzeW5jIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVEh0dHBUYXNrQXN5bmNIYW5kbGVyIi8+IGNsYXNzCisgICAgICAgIC8vLyB1c2luZyA8cGFyYW1yZWYgbmFtZT0icHJvdG9jb2xGYWN0b3J5Ii8+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbEZhY3RvcnkiPlRoZSBwcm90b2NvbCBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUSHR0cFRhc2tBc3luY0hhbmRsZXIoVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVEh0dHBUYXNrQXN5bmNIYW5kbGVyIi8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb2Nlc3NvciI+VGhlIGFzeW5jIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0UHJvdG9jb2xGYWN0b3J5Ij5UaGUgaW5wdXQgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dFByb3RvY29sRmFjdG9yeSI+VGhlIG91dHB1dCBwcm90b2NvbCBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUSHR0cFRhc2tBc3luY0hhbmRsZXIoVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBfcHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUHJvY2Vzc1JlcXVlc3RBc3luYyhIdHRwQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoY29udGV4dC5SZXF1ZXN0LklucHV0U3RyZWFtLCBjb250ZXh0LlJlc3BvbnNlLk91dHB1dFN0cmVhbSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IF9pbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgX3Byb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXQsIG91dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCkBAIC0wLDAgKzEsMTE3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IFRUcmFuc3BvcnQKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gYnl0ZVN0cmVhbTsKKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcihieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJ5dGVTdHJlYW0uVG9BcnJheSgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFNlcmlhbGl6ZShUQWJzdHJhY3RCYXNlIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0KTsKKworICAgICAgICAgICAgcy5Xcml0ZShwKTsKKworICAgICAgICAgICAgcmV0dXJuIHQuR2V0QnVmZmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRNZW1vcnlCdWZmZXIoYnVmKTsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBpZiAodHlwZW9mKFRCYXNlKS5Jc0Fzc2lnbmFibGVGcm9tKHR5cGVvZihUKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKKyAgICAgICAgICAgICAgICB2YXIgdCA9IEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZTxUPigpOworICAgICAgICAgICAgICAgIG1ldGhvZC5JbnZva2UodCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpbWV0aG9kLkludm9rZShudWxsLCBuZXcgb2JqZWN0W10geyBwIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlU3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTUwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDExMSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIE5hbWVkUGlwZUNsaWVudFN0cmVhbSBjbGllbnQ7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNlcnZlck5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFBpcGVOYW1lOworICAgICAgICBwcml2YXRlIGludCBDb25uZWN0VGltZW91dDsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgcGlwZSwgaW50IHRpbWVvdXQgPSBUaW1lb3V0LkluZmluaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJOYW1lID0gIi4iOworICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyTmFtZSA9IChzZXJ2ZXIgIT0gIiIpID8gc2VydmVyIDogIi4iOworICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjbGllbnQgIT0gbnVsbCAmJiBjbGllbnQuSXNDb25uZWN0ZWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgTmFtZWRQaXBlQ2xpZW50U3RyZWFtKFNlcnZlck5hbWUsIFBpcGVOYW1lLCBQaXBlRGlyZWN0aW9uLkluT3V0LCBQaXBlT3B0aW9ucy5Ob25lKTsKKyAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KENvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgICAgICAgICAgIHZhciBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIDE1ICogNDA5Nik7ICAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuV3JpdGUoYnVmLCBvZmYsIG5CeXRlcyk7CisKKyAgICAgICAgICAgICAgICBvZmYgKz0gbkJ5dGVzOworICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCBuQnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjk2IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWw7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBQaXBlIG9uIHRoZSBsb2NhbGhvc3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHBpcGVBZGRyZXNzOworICAgICAgICBwcml2YXRlIE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2wgYXN5bmNNb2RlID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChzdHJpbmcgcGlwZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGlwZUFkZHJlc3MgPSBwaXBlQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGlwZUluc3RhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBQaXBlRGlyZWN0aW9uLkluT3V0OworICAgICAgICAgICAgICAgIHZhciBtYXhjb25uID0gTmFtZWRQaXBlU2VydmVyU3RyZWFtLk1heEFsbG93ZWRTZXJ2ZXJJbnN0YW5jZXM7CisgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBQaXBlVHJhbnNtaXNzaW9uTW9kZS5CeXRlOworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXN5bmNNb2RlID8gUGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzIDogUGlwZU9wdGlvbnMuTm9uZTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgSU5CVUZfU0laRSA9IDQwOTY7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IE9VVEJVRl9TSVpFID0gNDA5NjsKKworICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5CisgICAgICAgICAgICAgICAgdmFyIHNlY3VyaXR5ID0gbmV3IFBpcGVTZWN1cml0eSgpOworICAgICAgICAgICAgICAgIHNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBQaXBlQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUlkZW50aWZpZXIoV2VsbEtub3duU2lkVHlwZS5Xb3JsZFNpZCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICBQaXBlQWNjZXNzUmlnaHRzLlJlYWQgfCBQaXBlQWNjZXNzUmlnaHRzLldyaXRlIHwgUGlwZUFjY2Vzc1JpZ2h0cy5TeW5jaHJvbml6ZSB8IFBpcGVBY2Nlc3NSaWdodHMuQ3JlYXRlTmV3SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZS5BbGxvdworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBJTkJVRl9TSVpFLCBPVVRCVUZfU0laRSwgc2VjdXJpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoTm90SW1wbGVtZW50ZWRFeGNlcHRpb24pICAvLyBNb25vIHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMsIGZhbGxiYWNrIHRvIHN5bmMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJj0gKH5QaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBJTkJVRl9TSVpFLCBPVVRCVUZfU0laRSwgc2VjdXJpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNNb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVuc3VyZVBpcGVJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldhaXRGb3JDb25uZWN0aW9uKGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdhaXRGb3JDb25uZWN0aW9uKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChzdHJlYW0sYXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBudWxsOyAgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUcmFuc3BvcnQgOiBUVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBhc3luY01vZGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSwgYm9vbCBhc3luY01vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICAgICAgdGhpcy5hc3luY01vZGUgPSBhc3luY01vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBzdHJlYW0gIT0gbnVsbCAmJiBzdHJlYW0uSXNDb25uZWN0ZWQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsID0gMDsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5SZWFkKGJ1Ziwgb2ZmLCBsZW4sIGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gc3RyZWFtLkVuZFJlYWQoYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdyaXRlKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKaW5kZXggMjE4MjkxYS4uZDhlYzYyYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKQEAgLTI3LDEzNSArMjcsMTUwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0Ci0JewotCQkvKioKLQkJKiBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAotCQkqLwotCQlwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOwogCi0JCS8qKgotCQkgKiBQb3J0IHRvIGxpc3RlbiBvbgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvcnQgdG8gbGlzdGVuIG9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKIAotCQkvKioKLQkJICogVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKLQkJICovCi0JCXByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CiAKLQkJLyoqCi0JCSAqIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycwotCQkgKi8KLQkJcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKIAotCQkvKioKLQkJICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQotCQkJOnRoaXMobGlzdGVuZXIsIDApCi0JCXsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgICAgICAgICA6IHRoaXMobGlzdGVuZXIsIDApCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQotCQl7Ci0JCQl0aGlzLnNlcnZlciA9IGxpc3RlbmVyOwotCQkJdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNlcnZlciA9IGxpc3RlbmVyOworICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCkKLQkJCTogdGhpcyhwb3J0LCAwKQotCQl7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKLQkJCTp0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQotCQl7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzKQotCQl7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OwotCQkJdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKLQkJCXRoaXMudXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy8gTWFrZSBzZXJ2ZXIgc29ja2V0Ci0JCQkJc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgdGhpcy5wb3J0KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24pCi0JCQl7Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCi0JCXsKLQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXIuU3RhcnQoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKLQkJewotCQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOwotCQkJfQotCQkJdHJ5Ci0JCQl7Ci0JCQkJVGNwQ2xpZW50IHJlc3VsdCA9IHNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKLQkJCQlUU29ja2V0IHJlc3VsdDIgPSBuZXcgVFNvY2tldChyZXN1bHQpOwotCQkJCXJlc3VsdDIuVGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCQkJaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKLQkJCQl7Ci0JCQkJCVRCdWZmZXJlZFRyYW5zcG9ydCByZXN1bHQzID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQyKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldHVybiByZXN1bHQyOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRTb2NrZXQgcmVzdWx0MiA9IG51bGw7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50IHJlc3VsdCA9IHNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDIgPSBuZXcgVFNvY2tldChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQyLlRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgICAgICAgICBpZiAodXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgcmVzdWx0MyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0MzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBUU29ja2V0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgdGhlbiBsZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgZG8gcHJvcGVyIGNsZWFudXAgb2YgdGhlIFRjcENsaWVudCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyAgT3RoZXJ3aXNlLCBjbGVhbiBpdCB1cCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXJlc3VsdCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKLQkJCQl9Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKaW5kZXggYzk5ZDA3Zi4uZTYzODgwYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTI1LDE5ICsyNSwyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci0JewotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKLQkJcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOwotCQkJaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0JCQkgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJhbnNwb3J0OwotCQkgfQotCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQWNjZXB0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBBY2NlcHRJbXBsKCk7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ2OWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpAQCAtMCwwICsxLDM5MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKy8qIG9ubHkgZm9yIHNpbHZlcmxpZ2h0ICovCisjaWYgU0lMVkVSTElHSFQKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRTaWx2ZXJsaWdodFNvY2tldCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBzdGF0aWMgTWFudWFsUmVzZXRFdmVudCByZWFkQXN5bmNDb21wbGV0ZSA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgcHVibGljIGV2ZW50IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4gY29ubmVjdEhhbmRsZXIgPSBudWxsOworCisgICAgICAgIC8vIG1lbW9yeSBzdHJlYW0gZm9yIHdyaXRlIGNhY2hlLgorICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBzdHJlYW0tYmFzZWQsIFRDUCBzb2NrZXQgdXNpbmcgdGhlIEludGVyTmV0d29yayBBZGRyZXNzIEZhbWlseS4KKyAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmssIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwKTsKKyAgICAgICAgICAgIHNvY2tldC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDEwMDAwOyAgLy8gc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGZvciBXUC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBEbnNFbmRQb2ludC4gVGhlIGhvc3ROYW1lIGFuZCBwb3J0IGFyZSBwYXNzZWQgaW4gdG8gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgICAgRG5zRW5kUG9pbnQgaG9zdEVudHJ5ID0gbmV3IERuc0VuZFBvaW50KHRoaXMuaG9zdCwgdGhpcy5wb3J0KTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFNvY2tldEFzeW5jRXZlbnRBcmdzIG9iamVjdCB0byBiZSB1c2VkIGluIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBTb2NrZXRBc3luY0V2ZW50QXJncyBzb2NrZXRFdmVudEFyZyA9IG5ldyBTb2NrZXRBc3luY0V2ZW50QXJncygpOworICAgICAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gaG9zdEVudHJ5OworCisgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBldmVudCBoYW5kbGVyIHdhcyBpbXBsZW1lbnRlZCBpbmxpbmUgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIG1ldGhvZCBzZWxmLWNvbnRhaW5lZC4KKyAgICAgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Db21wbGV0ZWQgKz0gbmV3IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4oZGVsZWdhdGUob2JqZWN0IHMsIFNvY2tldEFzeW5jRXZlbnRBcmdzIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdEhhbmRsZXIodGhpcywgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYW4gYXN5bmNocm9ub3VzIENvbm5lY3QgcmVxdWVzdCBvdmVyIHRoZSBzb2NrZXQKKyAgICAgICAgICAgICAgICBzb2NrZXQuQ29ubmVjdEFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIF90aW1lb3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyBfZXJyb3IgPSBudWxsOworICAgICAgICAgICAgaW50IF9yZWN2Qnl0ZXMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiU29ja2V0IGlzIG5vdCBvcGVuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBTb2NrZXRBc3luY0V2ZW50QXJncyBjb250ZXh0IG9iamVjdAorICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworCisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGRhdGEKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlNldEJ1ZmZlcihidWYsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGV2ZW4gaGFuZGxlciB3YXMgaW1wbGVtZW50ZWQgaW5saW5lIGluIG9yZGVyIHRvIG1ha2UKKyAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNlbGYtY29udGFpbmVkLgorICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IG5ldyBFdmVudEhhbmRsZXI8U29ja2V0QXN5bmNFdmVudEFyZ3M+KGRlbGVnYXRlKG9iamVjdCBzLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90aW1lb3V0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciA9PSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlY3ZCeXRlcyA9IGUuQnl0ZXNUcmFuc2ZlcnJlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yID0gZS5Tb2NrZXRFcnJvci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLlNldCgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBldmVudCB0byBub25zaWduYWxlZCwgY2F1c2luZyB0aHJlYWRzIHRvIGJsb2NrCisgICAgICAgICAgICByZWFkQXN5bmNDb21wbGV0ZS5SZXNldCgpOworCisgICAgICAgICAgICAvLyBNYWtlIGFuIGFzeW5jaHJvbm91cyBSZWNlaXZlIHJlcXVlc3Qgb3ZlciB0aGUgc29ja2V0CisgICAgICAgICAgICBzb2NrZXQuUmVjZWl2ZUFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKworICAgICAgICAgICAgLy8gQmxvY2sgdGhlIFVJIHRocmVhZCBmb3IgYSBtYXhpbXVtIG9mIFRJTUVPVVRfTUlMTElTRUNPTkRTIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICAgIC8vIElmIG5vIHJlc3BvbnNlIGNvbWVzIGJhY2sgd2l0aGluIHRoaXMgdGltZSB0aGVuIHByb2NlZWQKKyAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLldhaXRPbmUodGhpcy50aW1lb3V0KTsKKworICAgICAgICAgICAgaWYgKF90aW1lb3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5UaW1lZE91dCwgIlNvY2tldCByZWN2IHRpbWVvdXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9lcnJvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBfZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gX3JlY3ZCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBiZWdpbkZsdXNoX0NvbXBsZXRlZChvYmplY3Qgc2VuZGVyLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICBGbHVzaEFzeW5jUmVzdWx0IGZsdXNoQXN5bmNSZXN1bHQgPSBlLlVzZXJUb2tlbiBhcyBGbHVzaEFzeW5jUmVzdWx0OworICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOworCisgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciAhPSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBlLlNvY2tldEVycm9yLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgRmx1c2hBc3luY1Jlc3VsdCBmbHVzaEFzeW5jUmVzdWx0ID0gbmV3IEZsdXNoQXN5bmNSZXN1bHQoY2FsbGJhY2ssIHN0YXRlKTsKKworICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuVXNlclRva2VuID0gZmx1c2hBc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IGJlZ2luRmx1c2hfQ29tcGxldGVkOworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuU2V0QnVmZmVyKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgc29ja2V0LlNlbmRBc3luYyhzb2NrZXRFdmVudEFyZyk7CisKKyAgICAgICAgICAgIHJldHVybiBmbHVzaEFzeW5jUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdhaXRIYW5kbGUgPSBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jV2FpdEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBmcm9tIGltcGwgZnJvbSBUSHR0cENsaWVudC5jcworICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vbXNtdnBzLmNvbS9ibG9ncy9sdWlzYWJyZXUvYXJjaGl2ZS8yMDA5LzA2LzE1L211bHRpdGhyZWFkaW5nLWltcGxlbWVudGluZy10aGUtaWFzeW5jcmVzdWx0LWludGVyZmFjZS5hc3B4CisgICAgICAgIGNsYXNzIEZsdXNoQXN5bmNSZXN1bHQgOiBJQXN5bmNSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKKworICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBTb2NrZXQgQ29ubmVjdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBUVHJhbnNwb3J0RXhjZXB0aW9uIEFzeW5jRXhjZXB0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBBc3luY1N0YXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zdGF0ZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgV2FpdEhhbmRsZSBBc3luY1dhaXRIYW5kbGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0RXZ0SGFuZGxlKCk7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQ29tcGxldGVkU3luY2hyb25vdXNseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0NvbXBsZXRlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2V2dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBVcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaXNDb21wbGV0ZWQgPSB0cnVlOyAvLzEuIHNldCBfaXNjb21wbGV0ZWQgdG8gdHJ1ZQorICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOyAvLzIuIHNldCB0aGUgZXZlbnQsIHdoZW4gaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NiTWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2JNZXRob2QodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc29ja2V0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXNvY2tldCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisjZW5kcmVnaW9uCisgICAgfQorfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwppbmRleCA0YzY0YTM2Li5kOGZhMzM1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwpAQCAtMjYsMTIzICsyNiwyMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFNvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0JCXByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOwotCQlwcml2YXRlIGludCBwb3J0ID0gMDsKLQkJcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CisgICAgcHVibGljIGNsYXNzIFRTb2NrZXQgOiBUU3RyZWFtVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSAwOwogCi0JCXB1YmxpYyBUU29ja2V0KFRjcENsaWVudCBjbGllbnQpCi0JCXsKLQkJCXRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICBwdWJsaWMgVFNvY2tldChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKIAotCQkJaWYgKElzT3BlbikKLQkJCXsKLQkJCQlpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKLQkJCQlvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQotCQl7Ci0JCQl0aGlzLmhvc3QgPSBob3N0OwotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIHB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKIAotCQkJSW5pdFNvY2tldCgpOwotCQl9CisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCi0JCXsKLQkJCWNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKLQkJCWNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgVGltZW91dAotCQl7Ci0JCQlzZXQKLQkJCXsKLQkJCQljbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0ID0gdmFsdWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBjbGllbnQ7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgSG9zdAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gaG9zdDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFBvcnQKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHBvcnQ7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIGludCBQb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCi0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChjbGllbnQgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJcmV0dXJuIGNsaWVudC5Db25uZWN0ZWQ7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQotCQl7Ci0JCQlpZiAoSXNPcGVuKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7Ci0JCQl9CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHBvcnQgPD0gMCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOwotCQkJfQorICAgICAgICAgICAgaWYgKHBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQogCi0JCQlpZiAoY2xpZW50ID09IG51bGwpCi0JCQl7Ci0JCQkJSW5pdFNvY2tldCgpOwotCQkJfQorICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7Ci0JCQlpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKLQkJCW91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKLQkJfQorICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkgICAgICAgICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHRpbWVvdXQgLT4gdXNlIGl0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ubmVjdEhlbHBlciBobHAgPSBuZXcgQ29ubmVjdEhlbHBlcihjbGllbnQpOworICAgICAgICAgICAgICAgIElBc3luY1Jlc3VsdCBhc3luY3JlcyA9IGNsaWVudC5CZWdpbkNvbm5lY3QoaG9zdCwgcG9ydCwgbmV3IEFzeW5jQ2FsbGJhY2soQ29ubmVjdENhbGxiYWNrKSwgaGxwKTsKKyAgICAgICAgICAgICAgICBib29sIGJDb25uZWN0ZWQgPSBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuV2FpdE9uZSh0aW1lb3V0KSAmJiBjbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgICAgIGlmICghYkNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DYWxsYmFja0RvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwLkRvQ2xlYW51cCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVGltZWRPdXQsICJDb25uZWN0IHRpbWVkIG91dCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWJhc2UuQ2xvc2UoKTsKLQkJCWlmIChjbGllbnQgIT0gbnVsbCkKLQkJCXsKLQkJCQljbGllbnQuQ2xvc2UoKTsKLQkJCQljbGllbnQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHN0YXRpYyB2b2lkIENvbm5lY3RDYWxsYmFjayhJQXN5bmNSZXN1bHQgYXN5bmNyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbm5lY3RIZWxwZXIgaGxwID0gYXN5bmNyZXMuQXN5bmNTdGF0ZSBhcyBDb25uZWN0SGVscGVyOworICAgICAgICAgICAgbG9jayAoaGxwLk11dGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhscC5DYWxsYmFja0RvbmUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNsaWVudC5DbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhscC5DbGllbnQuRW5kQ29ubmVjdChhc3luY3Jlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCB0aGF0IGF3YXkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGxwLkRvQ2xlYW51cCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQgaXMgSURpc3Bvc2FibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlobHAuQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICAgICAgICAgIGhscC5DbGllbnQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdEhlbHBlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IE11dGV4ID0gbmV3IG9iamVjdCgpOworICAgICAgICAgICAgcHVibGljIGJvb2wgRG9DbGVhbnVwID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDYWxsYmFja0RvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgQ2xpZW50OworICAgICAgICAgICAgcHVibGljIENvbm5lY3RIZWxwZXIoVGNwQ2xpZW50IGNsaWVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSljbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRjMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpAQCAtMCwwICsxLDc4IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7CisjaWYgTkVUNDUKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisjZW5kaWYKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3BlcnR5SW5mbyBmb3IgdGhlIER1YWxNb2RlIHByb3BlcnR5IG9mIHRoZSBTeXN0ZW0uTmV0LlNvY2tldHMuU29ja2V0IGNsYXNzLiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgc29ja2V0cyBhcmUgY2FwYWJsZSBvZgorICAgIC8vLyBhdXRvbWF0aWMgSVB2NCBhbmQgSVB2NiBoYW5kbGluZy4gSWYgRHVhbE1vZGUgaXMgcHJlc2VudCB0aGUgc29ja2V0cyBhdXRvbWF0aWNhbGx5IGhhbmRsZSBJUHY0IGFuZCBJUHY2IGNvbm5lY3Rpb25zLgorICAgIC8vLyBJZiB0aGUgRHVhbE1vZGUgaXMgbm90IGF2YWlsYWJsZSB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIElQdjQgb3IgSVB2NiBpcyB1c2VkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRTb2NrZXRWZXJzaW9uaXplcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcENsaWVudCBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdGl0ZXMgb2YgdGhlIHVzZWQgZnJhbWV3b3JrCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BDbGllbnQgQ3JlYXRlVGNwQ2xpZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29ya1Y2KTsKKyAgICAgICAgICAgIGNsaWVudC5DbGllbnQuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmspOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVGNwTGlzdGVuZXIgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRjcExpc3RlbmVyIENyZWF0ZVRjcExpc3RlbmVyKEludDMyIHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKworI2lmIE5FVDQ1CisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5JUHY2QW55LCBwb3J0KTsKKyAgICAgICAgICAgIGxpc3RlbmVyLlNlcnZlci5EdWFsTW9kZSA9IHRydWU7CisjZWxzZQorCisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHBvcnQpOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKaW5kZXggNjBhODQxMi4uMzA0NTk5ZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKQEAgLTI2LDgyICsyNiwxMDMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKLQl7Ci0JCXByb3RlY3RlZCBTdHJlYW0gaW5wdXRTdHJlYW07Ci0JCXByb3RlY3RlZCBTdHJlYW0gb3V0cHV0U3RyZWFtOworICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBvdXRwdXRTdHJlYW07CiAKLQkJcHVibGljIFRTdHJlYW1UcmFuc3BvcnQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIFRTdHJlYW1UcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0JCXsKLQkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJCXRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotCQl9CisgICAgICAgIHB1YmxpYyBUU3RyZWFtVHJhbnNwb3J0KFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyZWFtIG91dHB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyZWFtIE91dHB1dFN0cmVhbQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gb3V0cHV0U3RyZWFtOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmVhbSBPdXRwdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG91dHB1dFN0cmVhbTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFN0cmVhbSBJbnB1dFN0cmVhbQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gaW5wdXRTdHJlYW07IH0KLQkJfQorICAgICAgICBwdWJsaWMgU3RyZWFtIElucHV0U3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBpbnB1dFN0cmVhbTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCi0JCXsKLQkJCWdldCB7IHJldHVybiB0cnVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCWlucHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJfQotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dFN0cmVhbS5DbG9zZSgpOwotCQkJCW91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIGlucHV0U3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAob3V0cHV0U3RyZWFtID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0iKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CiAKLQkJCW91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICAgICAgb3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlpZiAob3V0cHV0U3RyZWFtID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0iKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KIAotCQkJb3V0cHV0U3RyZWFtLkZsdXNoKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uRmx1c2goKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmE5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwpAQCAtMCwwICsxLDIyMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNTTCBTZXJ2ZXIgU29ja2V0IFdyYXBwZXIgQ2xhc3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVExTU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5kZXJseWluZyB0Y3Agc2VydmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcG9ydCB3aGVyZSB0aGUgc29ja2V0IGxpc3RlbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaW1lb3V0IGZvciB0aGUgY3JlYXRlZCBzZXJ2ZXIgc29ja2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGNsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgc2VydmVyY2VydGlmaWNhdGUgd2l0aCB0aGUgcHJpdmF0ZS0gYW5kIHB1YmxpYy1rZXkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgc2VydmVyQ2VydGlmaWNhdGU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBjbGllbnQgY2VydGlmaWNhdGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDAsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRUaW1lb3V0Ij5TZW5kL3JlY2VpdmUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSwgY2VydGlmaWNhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudFRpbWVvdXQiPlNlbmQvcmVjZWl2ZSB0aW1lb3V0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXNlQnVmZmVyZWRTb2NrZXRzIj5JZiBzZXQgdG8gPGM+dHJ1ZTwvYz4gW3VzZSBidWZmZXJlZCBzb2NrZXRzXS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50Q2VydFZhbGlkYXRvciI+VGhlIGNlcnRpZmljYXRlIHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgaW50IGNsaWVudFRpbWVvdXQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIllvdXIgc2VydmVyLWNlcnRpZmljYXRlIG5lZWRzIHRvIGhhdmUgYSBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIHRoaXMudXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgdGhpcy5jbGllbnRDZXJ0VmFsaWRhdG9yID0gY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0YXJ0cyB0aGUgc2VydmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWNjZXB0IGlzIG5vdCBibG9ja2luZworICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsYmFjayBmb3IgQWNjZXB0IEltcGxlbWVudGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vIFRUcmFuc3BvcnQtb2JqZWN0LgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSB0aGlzLnNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuU2VuZFRpbWVvdXQgPSBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSB0aGlzLmNsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgICAgICAgICAvL3dyYXAgdGhlIGNsaWVudCBpbiBhbiBTU0wgU29ja2V0IHBhc3NpbmcgaW4gdGhlIFNTTCBjZXJ0CisgICAgICAgICAgICAgICAgVFRMU1NvY2tldCBzb2NrZXQgPSBuZXcgVFRMU1NvY2tldCgKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyk7CisKKyAgICAgICAgICAgICAgICBzb2NrZXQuc2V0dXBUTFMoKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RvcHMgdGhlIFNlcnZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAxOWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKQEAgLTAsMCArMSwzNzEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTU0wgU29ja2V0IFdyYXBwZXIgY2xhc3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVExTU29ja2V0IDogVFN0cmVhbVRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZXJuYWwgVENQIENsaWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGhvc3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBwb3J0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEludGVybmFsIFNTTCBTdHJlYW0gZm9yIElPCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIHNlY3VyZVN0cmVhbTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZpbmVzIHdoZXRlciBvciBub3QgdGhpcyBzb2NrZXQgaXMgYSBzZXJ2ZXIgc29ja2V0PGJyLz4KKyAgICAgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgdGhlIFRMUy1hdXRoZW50aWNhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgaXNTZXJ2ZXI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNlcnRpZmljYXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZXIgZGVmaW5lZCBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi5TU0wgcHJvdG9jb2xzIHRvIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudCI+QW4gYWxyZWFkeSBjcmVhdGVkIFRDUC1jbGllbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1NlcnZlciI+aWYgc2V0IHRvIDxjPnRydWU8L2M+IFtpcyBzZXJ2ZXJdLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIGJvb2wgaXNTZXJ2ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICAvLyBUT0RPOiBFbmFibGUgVGxzMTEgYW5kIFRsczEyIChUTFMgMS4xIGFuZCAxLjIpIGJ5IGRlZmF1bHQgb25jZSB3ZSBzdGFydCB1c2luZyAuTkVUIDQuNSsuCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKyAgICAgICAgICAgIHRoaXMuaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKyAgICAgICAgICAgIGlmIChpc1NlcnZlciAmJiBjZXJ0aWZpY2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVFRMU1NvY2tldCBuZWVkcyBjZXJ0aWZpY2F0ZSB0byBiZSB1c2VkIGZvciBzZXJ2ZXIiLCAiY2VydGlmaWNhdGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLmlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJhc2Uub3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJob3N0Ij5UaGUgaG9zdCwgd2hlcmUgdGhlIHNvY2tldCBzaG91bGQgY29ubmVjdCB0by48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGVQYXRoIj5UaGUgY2VydGlmaWNhdGUgcGF0aC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIFg1MDlDZXJ0aWZpY2F0ZS5DcmVhdGVGcm9tQ2VydEZpbGUoY2VydGlmaWNhdGVQYXRoKSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gbnVsbCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBjZXJ0aWZpY2F0ZSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRpbWVvdXQiPlRoZSB0aW1lb3V0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBpbnQgdGltZW91dCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgdGhlIFRjcENsaWVudCBhbmQgc2V0cyB0aGUgdGltZW91dHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgU2VuZCAvIFJlY3YgVGltZW91dCBmb3IgSU8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gdGhpcy5jbGllbnQuU2VuZFRpbWVvdXQgPSB0aGlzLnRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIFRDUCBjbGllbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBwb3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIFRDUCBDbGllbnQgaXMgQ3BlbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRlcyB0aGUgY2VydGlmaWNhdGVzITxici8+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc2VuZGVyLW9iamVjdC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgdXNlZCBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYWluIj5UaGUgY2VydGlmaWNhdGUgY2hhaW4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xWYWxpZGF0aW9uRXJyb3JzIj5BbiBlbnVtLCB3aGljaCBsaXN0cyBhbGwgdGhlIGVycm9ycyBmcm9tIHRoZSAuTkVUIGNlcnRpZmljYXRlIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYm9vbCBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLCBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xWYWxpZGF0aW9uRXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNzbFZhbGlkYXRpb25FcnJvcnMgPT0gU3NsUG9saWN5RXJyb3JzLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29ubmVjdHMgdG8gdGhlIGhvc3QgYW5kIHN0YXJ0cyB0aGUgcm91dGluZSwgd2hpY2ggc2V0cyB1cCB0aGUgVExTCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAgICAgc2V0dXBUTFMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUTFMtc3RyZWFtIGFuZCBsYXlzIGl0IG92ZXIgdGhlIGV4aXN0aW5nIHNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cFRMUygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIHZhbGlkYXRvciA9IHRoaXMuY2VydFZhbGlkYXRvciA/PyBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3I7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyKHRoaXMuY2VydGlmaWNhdGUsIHRoaXMuY2VydFZhbGlkYXRvciAhPSBudWxsLCBzc2xQcm90b2NvbHMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7IGNlcnRpZmljYXRlIH0gOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudChob3N0LCBjZXJ0cywgc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0aGlzLnNlY3VyZVN0cmVhbTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IHRoaXMuc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2xvc2VzIHRoZSBTU0wgU29ja2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLnNlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwppbmRleCBkMjM5MWMyLi41ZTRhYzIyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwpAQCAtMjIsNDkgKzIyLDEyNSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydAotCXsKLQkJcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuCi0JCXsKLQkJCWdldDsKLQkJfQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbCBQZWVrKCkKLQkJewotCQkJcmV0dXJuIElzT3BlbjsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBfcGVla0J1ZmZlciA9IG5ldyBieXRlWzFdOworICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlOwogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIE9wZW4oKTsKKyAgICAgICAgcHVibGljIGJvb2wgUGVlaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSWYgd2UgYWxyZWFkeSBoYXZlIGEgYnl0ZSByZWFkIGJ1dCBub3QgY29uc3VtZWQsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisgICAgICAgICAgICAvL0lmIHRyYW5zcG9ydCBjbG9zZWQgd2UgY2FuJ3QgcGVlay4KKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotCQlwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CisgICAgICAgICAgICAvL1RyeSB0byByZWFkIG9uZSBieXRlLiBJZiBzdWNjZWVkcyB3ZSB3aWxsIG5lZWQgdG8gc3RvcmUgaXQgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXMgPSBSZWFkKF9wZWVrQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaW50IGdvdCA9IDA7Ci0JCQlpbnQgcmV0ID0gMDsKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCi0JCQl3aGlsZSAoZ290IDwgbGVuKQotCQkJewotCQkJCXJldCA9IFJlYWQoYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7Ci0JCQkJaWYgKHJldCA8PSAwKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkIik7Ci0JCQkJfQotCQkJCWdvdCArPSByZXQ7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIE9wZW4oKTsKIAotCQkJcmV0dXJuIGdvdDsKLQkJfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOwogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgVmFsaWRhdGVCdWZmZXJBcmdzKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJidWYiKTsKKyAgICAgICAgICAgIGlmIChvZmYgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkJ1ZmZlciBvZmZzZXQgaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKG9mZiArIGxlbiA+IGJ1Zi5MZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiTm90IGVub3VnaCBkYXRhLiIpOworICAgICAgICB9CiAKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpCi0JCXsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworCisgICAgICAgIHB1YmxpYyBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpbnQgZ290ID0gMDsKKworICAgICAgICAgICAgLy9JZiB3ZSBwcmV2aW91c2x5IHBlZWtlZCBhIGJ5dGUsIHdlIG5lZWQgdG8gdXNlIHRoYXQgZmlyc3QuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZltvZmYgKyBnb3QrK10gPSBfcGVla0J1ZmZlclswXTsKKyAgICAgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGdvdCA8IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gUmVhZChidWYsIG9mZiArIGdvdCwgbGVuIC0gZ290KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5FbmRPZkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290ICs9IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUFzeW5jUmVzdWx0IEJlZ2luRmx1c2goQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwKKyAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0cmFuc3BvcnQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LiIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIGNvZGUuICBQdXQgY2xlYW51cCBjb2RlIGluIERpc3Bvc2UoQnlWYWwgZGlzcG9zaW5nIEFzIEJvb2xlYW4pIGFib3ZlLgorICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKaW5kZXggYjk2ZjdlOC4uN2Y2Y2MxOCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKQEAgLTI1LDQ0ICsyNSw0NSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogRXhjZXB0aW9uCi0JewotCQlwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlOworICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCi0JCQk6IGJhc2UoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQotCQkJOiB0aGlzKCkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUpCisgICAgICAgICAgICA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHR5cGU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCi0JCXsKLQkJCVVua25vd24sCi0JCQlOb3RPcGVuLAotCQkJQWxyZWFkeU9wZW4sCi0JCQlUaW1lZE91dCwKLQkJCUVuZE9mRmlsZQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBOb3RPcGVuLAorICAgICAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgICAgIEludGVycnVwdGVkCisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKaW5kZXggOGY0ZjE1ZC4uNDdhMGM2MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMjUsMTggKzI1LDE4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBGcm9tIE1hcmsgU2xlZSAmIEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgotCS8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KLQkvLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCi0JLy8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQotCS8vLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKLQl7Ci0JCXB1YmxpYyB2aXJ0dWFsIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpCi0JCXsKLQkJCXJldHVybiB0cmFuczsKLQkJfQotCX0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZyb20gTWFyayBTbGVlICZhbXA7IEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgorICAgIC8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKyAgICAvLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICAgIC8vLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL0pTT05UZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL0pTT05UZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdkNDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vSlNPTlRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsODUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPng4NjwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC4zMDcwMzwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57RTM3QTAwMzQtRENCRi00ODg2LUEwREEtMjVBMDNEMTJEOTc1fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5KU09OVGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkpTT05UZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgICA8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8eDg2JyAiPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfHg4NicgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9ImFwcC5jb25maWciIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjEzODhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDk1IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgSlNPTlRlc3QKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RUaHJpZnQyMzY1KCk7ICAvLyBKU09OIGJpbmFyeSBkZWNvZGVzIHRvbyBtdWNoIGRhdGEKKyAgICAgICAgICAgIFRlc3RUaHJpZnQyMzM2KCk7ICAvLyBoZXggZW5jb2RpbmcgdXNpbmcgXHVYWFhYIHdoZXJlIDB4WFhYWCA+IDB4RkYKKyAgICAgICAgICAgIFRlc3RUaHJpZnQzNDAzKCk7IC8vIEpTT04gZXNjYXBlZCB1bmljb2RlIHN1cnJvZ2F0ZSBwYWlyIHN1cHBvcnQuCisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUZXN0VGhyaWZ0MjM2NSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBsZW4gPSAwOyBsZW4gPCAxMDsgKytsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGFXcml0dGVuID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgICAgICBybmQuTmV4dEJ5dGVzKGRhdGFXcml0dGVuKTsKKworICAgICAgICAgICAgICAgIFN0cmVhbSBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KG51bGwsIHN0bSk7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICAgICAgcHJvdC5Xcml0ZUJpbmFyeShkYXRhV3JpdHRlbik7CisKKyAgICAgICAgICAgICAgICBzdG0uUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgICAgICBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhUmVhZCA9IHByb3QuUmVhZEJpbmFyeSgpOworCisgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGRhdGFSZWFkLkxlbmd0aCA9PSBkYXRhV3JpdHRlbi5MZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVJlYWQuTGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChkYXRhUmVhZFtpXSA9PSBkYXRhV3JpdHRlbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUZXN0VGhyaWZ0MjMzNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBSVVNTSUFOX1RFWFQgPSAiXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM1IFx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgUlVTU0lBTl9KU09OID0gIlwiXFx1MDQyMFxcdTA0NDNcXHUwNDQxXFx1MDQ0MVxcdTA0M2FcXHUwNDNlXFx1MDQzNSBcXHUwNDFkXFx1MDQzMFxcdTA0MzdcXHUwNDMyXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzNVwiIjsKKworICAgICAgICAgICAgLy8gcHJlcGFyZSBidWZmZXIgd2l0aCBKU09OIGRhdGEKKyAgICAgICAgICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW1JVU1NJQU5fSlNPTi5MZW5ndGhdOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBSVVNTSUFOX0pTT04uTGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgcmF3Qnl0ZXNbaV0gPSAoYnl0ZSkoUlVTU0lBTl9KU09OW2ldICYgKGNoYXIpMHhGRik7ICAvLyBvbmx5IGxvdyBieXRlcworCisgICAgICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKHJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChwcm90LlJlYWRTdHJpbmcoKSA9PSBSVVNTSUFOX1RFWFQsICJyZWFkaW5nIEpTT04gd2l0aCBoZXgtZW5jb2RlZCBjaGFycyA+IDggYml0Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDM0MDMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgR0NMRUZfVEVYVCA9ICJcdWQ4MzRcdWRkMWUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIEdDTEVGX0pTT04gPSAiXCJcXHVkODM0XFx1ZGQxZVwiIjsKKworICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGNoZWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKEdDTEVGX0pTT04pKTsKKyAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChwcm90LlJlYWRTdHJpbmcoKSA9PSBHQ0xFRl9URVhULCAicmVhZGluZyBKU09OIHdpdGggc3Vycm9nYXRlIHBhaXIgaGV4LWVuY29kZWQgY2hhcnMiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmZjRhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gw7xiZXIgZWluZSBBc3NlbWJseSB3ZXJkZW4gw7xiZXIgZGllIGZvbGdlbmRlbgorLy8gQXR0cmlidXRlIGdlc3RldWVydC4gw4RuZGVybiBTaWUgZGllc2UgQXR0cmlidXR3ZXJ0ZSwgdW0gZGllIEluZm9ybWF0aW9uZW4genUgw6RuZGVybiwKKy8vIGRpZSBtaXQgZWluZXIgQXNzZW1ibHkgdmVya27DvHBmdCBzaW5kLgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJKU09OVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIER1cmNoIEZlc3RsZWdlbiB2b24gQ29tVmlzaWJsZSBhdWYgImZhbHNlIiB3ZXJkZW4gZGllIFR5cGVuIGluIGRpZXNlciBBc3NlbWJseSB1bnNpY2h0YmFyCisvLyBmw7xyIENPTS1Lb21wb25lbnRlbi4gV2VubiBTaWUgYXVmIGVpbmVuIFR5cCBpbiBkaWVzZXIgQXNzZW1ibHkgdm9uCisvLyBDT00genVncmVpZmVuIG3DvHNzZW4sIGxlZ2VuIFNpZSBkYXMgQ29tVmlzaWJsZS1BdHRyaWJ1dCBmw7xyIGRpZXNlbiBUeXAgYXVmICJ0cnVlIiBmZXN0LgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gRGllIGZvbGdlbmRlIEdVSUQgYmVzdGltbXQgZGllIElEIGRlciBUeXBiaWJsaW90aGVrLCB3ZW5uIGRpZXNlcyBQcm9qZWt0IGbDvHIgQ09NIHZlcmbDvGdiYXIgZ2VtYWNodCB3aXJkCitbYXNzZW1ibHk6IEd1aWQoIjJiMmU3ZDU2LTNlNjUtNDM2OC05MmQ3LWUzNGQ1NmI3MTA1ZSIpXQorCisvLyBWZXJzaW9uc2luZm9ybWF0aW9uZW4gZsO8ciBlaW5lIEFzc2VtYmx5IGJlc3RlaGVuIGF1cyBkZW4gZm9sZ2VuZGVuIHZpZXIgV2VydGVuOgorLy8KKy8vICAgICAgSGF1cHR2ZXJzaW9uCisvLyAgICAgIE5lYmVudmVyc2lvbgorLy8gICAgICBCdWlsZG51bW1lcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFNpZSBrw7ZubmVuIGFsbGUgV2VydGUgYW5nZWJlbiBvZGVyIGRpZSBzdGFuZGFyZG3DpMOfaWdlbiBCdWlsZC0gdW5kIFJldmlzaW9uc251bW1lcm4KKy8vIMO8YmVybmVobWVuLCBpbmRlbSBTaWUgIioiIGVpbmdlYmVuOgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9hcHAuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L0pTT04vYXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE5MTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vYXBwLmNvbmZpZwpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24+Cis8c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wIi8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODEwYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRlc3QuTXVsdGlwbGV4OworCituYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXguQ2xpZW50Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgdHJhbnMuT3BlbigpOworCisgICAgICAgICAgICAgICAgVFByb3RvY29sIFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtdWx0aXBsZXg7CisKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZS5DbGllbnQobXVsdGlwbGV4KTsKKworICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQUdHUik7CisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dyID0gbmV3IEFnZ3IuQ2xpZW50KG11bHRpcGxleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNieXRlIGkgPSAxOyAxMCA+PSBpOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKGJlbmNoLmZpYm9uYWNjaShpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsgaW4gYWdnci5nZXRWYWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoay5Ub1N0cmluZygpICsgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFucy5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVzaG9ydC5QYXJzZShhcmdzWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4ZWN1dGUocG9ydCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMWNlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwxNDggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NUU5MURBMTctRTU0OC00MTVGLThDOUYtOUU4NEVERjhFRTA2fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5NdWx0aXBsZXhDbGllbnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5NdWx0aXBsZXhDbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxNdWx0aXBsZXguVGVzdC5Db21tb24uY3MiPgorICAgICAgPExpbms+TXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEFnZ3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxCZW5jaG1hcmtTZXJ2aWNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcRXJyb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbnRyaWJcYXN5bmMtdGVzdFxhZ2dyLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cbGliXHJiXGJlbmNobWFya1xCZW5jaG1hcmsudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4NmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJNdWx0aXBsZXhDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCI2NkZDNjFFNS00MjBCLTRiNTYtODAxMi1ENkQ2Q0UyMjUzN0YiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbSBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyNTNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0dFTkVSQVRFRCA9IFwKKwlnZW4tY3NoYXJwL0FnZ3IuY3MgXAorCWdlbi1jc2hhcnAvQmVuY2htYXJrU2VydmljZS5jcyBcCisJZ2VuLWNzaGFycC9FcnJvci5jcworCitCVUlMVF9TT1VSQ0VTID0gJChHRU5FUkFURUQpCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1jc2hhcnAvQWdnci5jczogJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwICQ8CisKK2dlbi1jc2hhcnAvQmVuY2htYXJrU2VydmljZS5jcyBnZW4tY3NoYXJwL0Vycm9yLmNzOiAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgJDwKKworVGhyaWZ0SW1wbC5kbGw6IE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyAkKEdFTkVSQVRFRCkgLi4vLi4vVGhyaWZ0LmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtdDpsaWJyYXJ5IC1vdXQ6Li9UaHJpZnRJbXBsLmRsbCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgJChHRU5FUkFURUQpICQ8CisKK011bHRpcGxleENsaWVudC5leGU6IENsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkPAorCitNdWx0aXBsZXhTZXJ2ZXIuZXhlOiBTZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJDwKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jc2hhcnAgKi5leGUgKi5kbGwKKworVEVTVFBPUlQgPSA5NTAxCitjaGVjay1sb2NhbDogTXVsdGlwbGV4U2VydmVyLmV4ZSBNdWx0aXBsZXhDbGllbnQuZXhlCisJZWNobyAkKFRFU1RQT1JUKQorCU1PTk9fUEFUSD0uLi8uLi8gdGltZW91dCAxMCBtb25vIE11bHRpcGxleFNlcnZlci5leGUgJChURVNUUE9SVCkgJgorCXNsZWVwIDEKKwlNT05PX1BBVEg9Li4vLi4vIG1vbm8gTXVsdGlwbGV4Q2xpZW50LmV4ZSAkKFRFU1RQT1JUKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NdWx0aXBsZXguVGVzdC5Db21tb24uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L011bHRpcGxleC5UZXN0LkNvbW1vbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg3ODUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NdWx0aXBsZXguVGVzdC5Db21tb24uY3MKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKKy8vCisvLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6CisvLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKKworbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4Cit7CisgICAgcHVibGljIGNsYXNzIENvbnN0YW50cworICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAiQmVuY2htYXJrU2VydmljZSI7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTkFNRV9BR0dSICAgICAgICAgICAgID0gIkFnZ3IiOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NjE4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGVzdC5NdWx0aXBsZXg7CisKK25hbWVzcGFjZSBUZXN0Lk11bHRpcGxleC5TZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgY2xhc3MgQmVuY2htYXJrU2VydmljZUltcGwgOiBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZmlib25hY2NpKHNieXRlIG4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHByZXYsIG5leHQsIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBwcmV2ICAgPSAwOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKG4gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCAgID0gcmVzdWx0ICsgcHJldjsKKyAgICAgICAgICAgICAgICAgICAgcHJldiAgID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAtLW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBZ2dyU2VydmljZUltcGwgOiBBZ2dyLklmYWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8aW50PiB2YWx1ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKGludCB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiBnZXRWYWx1ZXMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKGludCBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAorICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KHRydWUsdHJ1ZSk7CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJ0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaEhhbmRsZXIgPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGJlbmNoUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2UuUHJvY2Vzc29yKGJlbmNoSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3JIYW5kbGVyID0gbmV3IEFnZ3JTZXJ2aWNlSW1wbCgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYWdnclByb2Nlc3NvciA9IG5ldyBBZ2dyLlByb2Nlc3NvcihhZ2dySGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFLCBiZW5jaFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgVFNlcnZlciBTZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcihtdWx0aXBsZXgsIHNlcnZlcnRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uIik7CisgICAgICAgICAgICAgICAgU2VydmVyRW5naW5lLlNlcnZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNDM5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwxNDggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57RDU5MkJERjMtMERDRS00OEZCLTg5MEYtRTRBRTFEOUNFN0NEfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5NdWx0aXBsZXhTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5NdWx0aXBsZXhTZXJ2ZXI8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxNdWx0aXBsZXguVGVzdC5Db21tb24uY3MiPgorICAgICAgPExpbms+TXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEFnZ3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxCZW5jaG1hcmtTZXJ2aWNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcRXJyb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbnRyaWJcYXN5bmMtdGVzdFxhZ2dyLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cbGliXHJiXGJlbmNobWFya1xCZW5jaG1hcmsudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MDU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJNdWx0aXBsZXhTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJGMkY0MzZDMS0zRDRGLTQxMWEtQURDMy1COTg4NDg0NzZBOEUiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9GaWx0ZXJDb25maWcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1MTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9GaWx0ZXJDb25maWcuY3MKQEAgLTAsMCArMSwzMSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3Rlckdsb2JhbEZpbHRlcnMoR2xvYmFsRmlsdGVyQ29sbGVjdGlvbiBmaWx0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJzLkFkZChuZXcgSGFuZGxlRXJyb3JBdHRyaWJ1dGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvUm91dGVDb25maWcuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvUm91dGVDb25maWcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNjAyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcwpAQCAtMCwwICsxLDM5IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFN5c3RlbS5XZWIuUm91dGluZzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlQ29uZmlnCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJSb3V0ZXMoUm91dGVDb2xsZWN0aW9uIHJvdXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgcm91dGVzLklnbm9yZVJvdXRlKCJ7cmVzb3VyY2V9LnRocmlmdCIpOworICAgICAgICAgICAgcm91dGVzLklnbm9yZVJvdXRlKCJ7cmVzb3VyY2V9LmF4ZC97KnBhdGhJbmZvfSIpOworCisgICAgICAgICAgICByb3V0ZXMuTWFwUm91dGUoCisgICAgICAgICAgICAgICAgbmFtZTogIkRlZmF1bHQiLAorICAgICAgICAgICAgICAgIHVybDogIntjb250cm9sbGVyfS97YWN0aW9ufS97aWR9IiwKKyAgICAgICAgICAgICAgICBkZWZhdWx0czogbmV3IHsgY29udHJvbGxlciA9ICJIb21lIiwgYWN0aW9uID0gIkluZGV4IiwgaWQgPSBVcmxQYXJhbWV0ZXIuT3B0aW9uYWwgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Bc3luY0h0dHBIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjYxODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Bc3luY0h0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIEFzeW5jSHR0cEhhbmRsZXIgOiBUSHR0cFRhc2tBc3luY0hhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBBc3luY0h0dHBIYW5kbGVyKCkKKyAgICAgICAgICAgIDogYmFzZSgKKyAgICAgICAgICAgICAgICBuZXcgVGhyaWZ0LlRlc3QuU2Vjb25kU2VydmljZS5Bc3luY1Byb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZUltcGwoKSkpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTFlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcwpAQCAtMCwwICsxLDcwIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVGVzdDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0LkNvbnRyb2xsZXJzCit7CisgICAgcHVibGljIGNsYXNzIEhvbWVDb250cm9sbGVyIDogQ29udHJvbGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIEFjdGlvblJlc3VsdCBJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWaWV3KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxBY3Rpb25SZXN1bHQ+IFRlc3RUaHJpZnRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiYXNlVXJpID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCJ7MH06Ly97MX17Mn0iLCBSZXF1ZXN0LlVybC5TY2hlbWUsIFJlcXVlc3QuVXJsLkF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICBVcmwuQ29udGVudCgifiIpKSk7CisKKyAgICAgICAgICAgIFNlY29uZFNlcnZpY2UuSUFzeW5jIGFzeW5jU2VydmljZSA9CisgICAgICAgICAgICAgICAgbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkoYmFzZVVyaSwgIkFzeW5jLnRocmlmdCIpKSkpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYXN5bmNTZXJ2aWNlLnNlY29uZHRlc3RTdHJpbmdBc3luYygiVGVzdFN0cmluZyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAidGVzdFN0cmluZyhcIlRlc3RTdHJpbmdcIikiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSB3cm9uZyByZXN1bHQgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvblJlc3VsdCBUZXN0VGhyaWZ0U3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiYXNlVXJpID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCJ7MH06Ly97MX17Mn0iLCBSZXF1ZXN0LlVybC5TY2hlbWUsIFJlcXVlc3QuVXJsLkF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICBVcmwuQ29udGVudCgifiIpKSk7CisKKyAgICAgICAgICAgIFNlY29uZFNlcnZpY2UuSVN5bmMgc2VydmljZSA9CisgICAgICAgICAgICAgICAgbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkoYmFzZVVyaSwgIlN5bmMudGhyaWZ0IikpKSk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBzZXJ2aWNlLnNlY29uZHRlc3RTdHJpbmcoIlRlc3RTdHJpbmciKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gInRlc3RTdHJpbmcoXCJUZXN0U3RyaW5nXCIpIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgd3JvbmcgcmVzdWx0IHdhcyByZXR1cm5lZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVkaXJlY3RUb0FjdGlvbigiSW5kZXgiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4IGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiNjg4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4CkBAIC0wLDAgKzEsMTkgQEAKK++7vzwlQCBBcHBsaWNhdGlvbiBDb2RlYmVoaW5kPSJHbG9iYWwuYXNheC5jcyIgSW5oZXJpdHM9IlRocmlmdE1WQ1Rlc3QuTXZjQXBwbGljYXRpb24iIExhbmd1YWdlPSJDIyIgJT4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4LmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3MzFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4LmNzCkBAIC0wLDAgKzEsMzQgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgU3lzdGVtLldlYi5Sb3V0aW5nOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBNdmNBcHBsaWNhdGlvbiA6IFN5c3RlbS5XZWIuSHR0cEFwcGxpY2F0aW9uCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBBcHBsaWNhdGlvbl9TdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFyZWFSZWdpc3RyYXRpb24uUmVnaXN0ZXJBbGxBcmVhcygpOworICAgICAgICAgICAgRmlsdGVyQ29uZmlnLlJlZ2lzdGVyR2xvYmFsRmlsdGVycyhHbG9iYWxGaWx0ZXJzLkZpbHRlcnMpOworICAgICAgICAgICAgUm91dGVDb25maWcuUmVnaXN0ZXJSb3V0ZXMoUm91dGVUYWJsZS5Sb3V0ZXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU4ODk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1MyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdE1WQ1Rlc3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQSB3ZWIgcHJvamVjdCBmb3IgdGVzdGluZyB0aGUgdGhyaWZ0IEFTUC5ORVQgZmVhdHVyZXMuIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCIzNjZmOWJkMC0zYzBlLTQ4YWEtYjJjYS02MWZkNGE5M2U0MjciKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMzAxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzCkBAIC0wLDAgKzEsMzcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVGVzdDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2Vjb25kU2VydmljZUltcGwgOiBTZWNvbmRTZXJ2aWNlLklBc3luYywgU2Vjb25kU2VydmljZS5JU3luYworICAgIHsKKyAgICAgICAgcHVibGljIFRhc2s8c3RyaW5nPiBzZWNvbmR0ZXN0U3RyaW5nQXN5bmMoc3RyaW5nIHRoaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgc2Vjb25kdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTI2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3luY0h0dHBIYW5kbGVyIDogVEh0dHBIYW5kbGVyCisgICAgeworICAgICAgICBwdWJsaWMgU3luY0h0dHBIYW5kbGVyKCkKKyAgICAgICAgICAgIDogYmFzZSgKKyAgICAgICAgICAgICAgICBuZXcgVGhyaWZ0LlRlc3QuU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VJbXBsKCkpKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI5NjlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2oKQEAgLTAsMCArMSwyMDAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjEyLjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMnKSIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj4KKyAgICA8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH08L1Byb2plY3RHdWlkPgorICAgIDxQcm9qZWN0VHlwZUd1aWRzPnszNDljNTg1MS02NWRmLTExZGEtOTM4NC0wMDA2NWI4NDZmMjF9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdE1WQ1Rlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRNVkNUZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8TXZjQnVpbGRWaWV3cz5mYWxzZTwvTXZjQnVpbGRWaWV3cz4KKyAgICA8VXNlSUlTRXhwcmVzcz50cnVlPC9Vc2VJSVNFeHByZXNzPgorICAgIDxJSVNFeHByZXNzU1NMUG9ydCAvPgorICAgIDxJSVNFeHByZXNzQW5vbnltb3VzQXV0aGVudGljYXRpb24gLz4KKyAgICA8SUlTRXhwcmVzc1dpbmRvd3NBdXRoZW50aWNhdGlvbiAvPgorICAgIDxJSVNFeHByZXNzVXNlQ2xhc3NpY1BpcGVsaW5lTW9kZSAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EcmF3aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5EeW5hbWljRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRW50aXR5IiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5BcHBsaWNhdGlvblNlcnZpY2VzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvbXBvbmVudE1vZGVsLkRhdGFBbm5vdGF0aW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5FeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5BYnN0cmFjdGlvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLlJvdXRpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvbmZpZ3VyYXRpb24iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLlNlcnZpY2VzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkVudGVycHJpc2VTZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUuMS4wLjAuMFxsaWJcbmV0NDBcTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwIj4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XZWJSZXF1ZXN0Ij4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuSGVscGVycywgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5IZWxwZXJzLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5NdmMuNS4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuTXZjLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LlJhem9yLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLlJhem9yLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLkRlcGxveW1lbnQsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuRGVwbG95bWVudC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCI+CisgICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcF9TdGFydFxGaWx0ZXJDb25maWcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwX1N0YXJ0XFJvdXRlQ29uZmlnLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN5bmNIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBc3luY0h0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbnRyb2xsZXJzXEhvbWVDb250cm9sbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ikdsb2JhbC5hc2F4LmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkdsb2JhbC5hc2F4PC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZWNvbmRTZXJ2aWNlSW1wbC5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iZmF2aWNvbi5pY28iIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iR2xvYmFsLmFzYXgiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLmNvbmZpZyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuRGVidWcuY29uZmlnIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPldlYi5jb25maWc8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db250ZW50PgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5SZWxlYXNlLmNvbmZpZyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5XZWIuY29uZmlnPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29udGVudD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xXZWIuY29uZmlnIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXF9WaWV3U3RhcnQuY3NodG1sIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXFNoYXJlZFxfTGF5b3V0LmNzaHRtbCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xIb21lXEluZGV4LmNzaHRtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZvbGRlciBJbmNsdWRlPSJBcHBfRGF0YVwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9InBhY2thZ2VzLmNvbmZpZyI+CisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4KKyAgICA8L0NvbnRlbnQ+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXHNyY1xUaHJpZnQuNDUuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PntlYmNlMzVkYS1jZjZhLTQyYmMtYTM1Ny1hOWMwOWI1MzQyOTl9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0LjQ1PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxWaXN1YWxTdHVkaW9WZXJzaW9uIENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICcnIj4xMC4wPC9WaXN1YWxTdHVkaW9WZXJzaW9uPgorICAgIDxWU1Rvb2xzUGF0aCBDb25kaXRpb249IickKFZTVG9vbHNQYXRoKScgPT0gJyciPiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cdiQoVmlzdWFsU3R1ZGlvVmVyc2lvbik8L1ZTVG9vbHNQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVlNUb29sc1BhdGgpXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknICE9ICcnIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cdjEwLjBcV2ViQXBwbGljYXRpb25zXE1pY3Jvc29mdC5XZWJBcHBsaWNhdGlvbi50YXJnZXRzIiBDb25kaXRpb249ImZhbHNlIiAvPgorICA8VGFyZ2V0IE5hbWU9Ik12Y0J1aWxkVmlld3MiIEFmdGVyVGFyZ2V0cz0iQWZ0ZXJCdWlsZCIgQ29uZGl0aW9uPSInJChNdmNCdWlsZFZpZXdzKSc9PSd0cnVlJyI+CisgICAgPEFzcE5ldENvbXBpbGVyIFZpcnR1YWxQYXRoPSJ0ZW1wIiBQaHlzaWNhbFBhdGg9IiQoV2ViUHJvamVjdE91dHB1dERpcikiIC8+CisgIDwvVGFyZ2V0PgorICA8UHJvamVjdEV4dGVuc2lvbnM+CisgICAgPFZpc3VhbFN0dWRpbz4KKyAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9InszNDljNTg1MS02NWRmLTExZGEtOTM4NC0wMDA2NWI4NDZmMjF9Ij4KKyAgICAgICAgPFdlYlByb2plY3RQcm9wZXJ0aWVzPgorICAgICAgICAgIDxVc2VJSVM+VHJ1ZTwvVXNlSUlTPgorICAgICAgICAgIDxBdXRvQXNzaWduUG9ydD5UcnVlPC9BdXRvQXNzaWduUG9ydD4KKyAgICAgICAgICA8RGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PjU3NDgyPC9EZXZlbG9wbWVudFNlcnZlclBvcnQ+CisgICAgICAgICAgPERldmVsb3BtZW50U2VydmVyVlBhdGg+LzwvRGV2ZWxvcG1lbnRTZXJ2ZXJWUGF0aD4KKyAgICAgICAgICA8SUlTVXJsPmh0dHA6Ly9sb2NhbGhvc3Q6NTc0ODIvPC9JSVNVcmw+CisgICAgICAgICAgPE5UTE1BdXRoZW50aWNhdGlvbj5GYWxzZTwvTlRMTUF1dGhlbnRpY2F0aW9uPgorICAgICAgICAgIDxVc2VDdXN0b21TZXJ2ZXI+RmFsc2U8L1VzZUN1c3RvbVNlcnZlcj4KKyAgICAgICAgICA8Q3VzdG9tU2VydmVyVXJsPgorICAgICAgICAgIDwvQ3VzdG9tU2VydmVyVXJsPgorICAgICAgICAgIDxTYXZlU2VydmVyU2V0dGluZ3NJblVzZXJGaWxlPkZhbHNlPC9TYXZlU2VydmVyU2V0dGluZ3NJblVzZXJGaWxlPgorICAgICAgICA8L1dlYlByb2plY3RQcm9wZXJ0aWVzPgorICAgICAgPC9GbGF2b3JQcm9wZXJ0aWVzPgorICAgIDwvVmlzdWFsU3R1ZGlvPgorICA8L1Byb2plY3RFeHRlbnNpb25zPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXHRlc3RcVGhyaWZ0VGVzdC50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXERlYnVnXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycDphc3luYz10cnVlIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKyIkKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUiIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXHNyY1xiaW5cRGVidWdcVGhyaWZ0NDUuZGxsIjwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4gLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNhN2RhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwKQEAgLTAsMCArMSwyNSBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKK0B7CisgICAgVmlld0JhZy5UaXRsZSA9ICJIb21lIFBhZ2UiOworfQorCis8cD5ASHRtbC5BY3Rpb25MaW5rKCJUZXN0IFRocmlmdCBBc3luYyBTZXJ2aWNlIiwgIlRlc3RUaHJpZnRBc3luYyIpPC9wPgorPHA+QEh0bWwuQWN0aW9uTGluaygiVGVzdCBUaHJpZnQgU3luYyBTZXJ2aWNlIiwgIlRlc3RUaHJpZnRTeW5jIik8L3A+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxYzk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbApAQCAtMCwwICsxLDMwIEBACivvu79AKgorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorKkAKKworPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KKyAgICA8dGl0bGU+VGhyaWZ0IEFTUC5ORVQgVGVzdDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICBAUmVuZGVyQm9keSgpCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzIxMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZwpAQCAtMCwwICsxLDYwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uPgorICA8Y29uZmlnU2VjdGlvbnM+CisgICAgPHNlY3Rpb25Hcm91cCBuYW1lPSJzeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yIiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uUmF6b3JXZWJTZWN0aW9uR3JvdXAsIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ij4KKyAgICAgIDxzZWN0aW9uIG5hbWU9Imhvc3QiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5Ib3N0U2VjdGlvbiwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgLz4KKyAgICAgIDxzZWN0aW9uIG5hbWU9InBhZ2VzIiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uUmF6b3JQYWdlc1NlY3Rpb24sIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIC8+CisgICAgPC9zZWN0aW9uR3JvdXA+CisgIDwvY29uZmlnU2VjdGlvbnM+CisKKyAgPHN5c3RlbS53ZWIud2ViUGFnZXMucmF6b3I+CisgICAgPGhvc3QgZmFjdG9yeVR5cGU9IlN5c3RlbS5XZWIuTXZjLk12Y1dlYlJhem9ySG9zdEZhY3RvcnksIFN5c3RlbS5XZWIuTXZjLCBWZXJzaW9uPTUuMi4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgLz4KKyAgICA8cGFnZXMgcGFnZUJhc2VUeXBlPSJTeXN0ZW0uV2ViLk12Yy5XZWJWaWV3UGFnZSI+CisgICAgICA8bmFtZXNwYWNlcz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMuQWpheCIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjLkh0bWwiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk9wdGltaXphdGlvbiIvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5Sb3V0aW5nIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iVGhyaWZ0TVZDVGVzdCIgLz4KKyAgICAgIDwvbmFtZXNwYWNlcz4KKyAgICA8L3BhZ2VzPgorICA8L3N5c3RlbS53ZWIud2ViUGFnZXMucmF6b3I+CisKKyAgPGFwcFNldHRpbmdzPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpFbmFibGVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYXBwU2V0dGluZ3M+CisKKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgPGhhbmRsZXJzPgorICAgICAgPHJlbW92ZSBuYW1lPSJCbG9ja1ZpZXdIYW5kbGVyIi8+CisgICAgICA8YWRkIG5hbWU9IkJsb2NrVmlld0hhbmRsZXIiIHBhdGg9IioiIHZlcmI9IioiIHByZUNvbmRpdGlvbj0iaW50ZWdyYXRlZE1vZGUiIHR5cGU9IlN5c3RlbS5XZWIuSHR0cE5vdEZvdW5kSGFuZGxlciIgLz4KKyAgICA8L2hhbmRsZXJzPgorICA8L3N5c3RlbS53ZWJTZXJ2ZXI+CisKKyAgPHN5c3RlbS53ZWI+CisgICAgPGNvbXBpbGF0aW9uPgorICAgICAgPGFzc2VtYmxpZXM+CisgICAgICAgIDxhZGQgYXNzZW1ibHk9IlN5c3RlbS5XZWIuTXZjLCBWZXJzaW9uPTUuMi4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgLz4KKyAgICAgIDwvYXNzZW1ibGllcz4KKyAgICA8L2NvbXBpbGF0aW9uPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZGUyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbApAQCAtMCwwICsxLDIyIEBACivvu79AKgorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorKkAKKworQHsKKyAgICBMYXlvdXQgPSAifi9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwiOworfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNTZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcKQEAgLTAsMCArMSw0NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiB4bWxuczp4ZHQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vWE1MLURvY3VtZW50LVRyYW5zZm9ybSI+CisgIDwhLS0KKyAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJTZXRBdHRyaWJ1dGVzIiB0cmFuc2Zvcm0gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlIG9mCisgICAgImNvbm5lY3Rpb25TdHJpbmciIHRvIHVzZSAiUmVsZWFzZVNRTFNlcnZlciIgb25seSB3aGVuIHRoZSAiTWF0Y2giIGxvY2F0b3IKKyAgICBmaW5kcyBhbiBhdHRyaWJ1dGUgIm5hbWUiIHRoYXQgaGFzIGEgdmFsdWUgb2YgIk15REIiLgorCisgICAgPGNvbm5lY3Rpb25TdHJpbmdzPgorICAgICAgPGFkZCBuYW1lPSJNeURCIgorICAgICAgICBjb25uZWN0aW9uU3RyaW5nPSJEYXRhIFNvdXJjZT1SZWxlYXNlU1FMU2VydmVyO0luaXRpYWwgQ2F0YWxvZz1NeVJlbGVhc2VEQjtJbnRlZ3JhdGVkIFNlY3VyaXR5PVRydWUiCisgICAgICAgIHhkdDpUcmFuc2Zvcm09IlNldEF0dHJpYnV0ZXMiIHhkdDpMb2NhdG9yPSJNYXRjaChuYW1lKSIvPgorICAgIDwvY29ubmVjdGlvblN0cmluZ3M+CisgIC0tPgorICA8c3lzdGVtLndlYj4KKyAgICA8IS0tCisgICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJSZXBsYWNlIiB0cmFuc2Zvcm0gd2lsbCByZXBsYWNlIHRoZSBlbnRpcmUKKyAgICAgIDxjdXN0b21FcnJvcnM+IHNlY3Rpb24gb2YgeW91ciBXZWIuY29uZmlnIGZpbGUuCisgICAgICBOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBjdXN0b21FcnJvcnMgc2VjdGlvbiB1bmRlciB0aGUKKyAgICAgIDxzeXN0ZW0ud2ViPiBub2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgInhkdDpMb2NhdG9yIiBhdHRyaWJ1dGUuCisKKyAgICAgIDxjdXN0b21FcnJvcnMgZGVmYXVsdFJlZGlyZWN0PSJHZW5lcmljRXJyb3IuaHRtIgorICAgICAgICBtb2RlPSJSZW1vdGVPbmx5IiB4ZHQ6VHJhbnNmb3JtPSJSZXBsYWNlIj4KKyAgICAgICAgPGVycm9yIHN0YXR1c0NvZGU9IjUwMCIgcmVkaXJlY3Q9IkludGVybmFsRXJyb3IuaHRtIi8+CisgICAgICA8L2N1c3RvbUVycm9ycz4KKyAgICAtLT4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2MzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcKQEAgLTAsMCArMSw0NiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiB4bWxuczp4ZHQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vWE1MLURvY3VtZW50LVRyYW5zZm9ybSI+CisgIDwhLS0KKyAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJTZXRBdHRyaWJ1dGVzIiB0cmFuc2Zvcm0gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlIG9mCisgICAgImNvbm5lY3Rpb25TdHJpbmciIHRvIHVzZSAiUmVsZWFzZVNRTFNlcnZlciIgb25seSB3aGVuIHRoZSAiTWF0Y2giIGxvY2F0b3IKKyAgICBmaW5kcyBhbiBhdHRyaWJ1dGUgIm5hbWUiIHRoYXQgaGFzIGEgdmFsdWUgb2YgIk15REIiLgorCisgICAgPGNvbm5lY3Rpb25TdHJpbmdzPgorICAgICAgPGFkZCBuYW1lPSJNeURCIgorICAgICAgICBjb25uZWN0aW9uU3RyaW5nPSJEYXRhIFNvdXJjZT1SZWxlYXNlU1FMU2VydmVyO0luaXRpYWwgQ2F0YWxvZz1NeVJlbGVhc2VEQjtJbnRlZ3JhdGVkIFNlY3VyaXR5PVRydWUiCisgICAgICAgIHhkdDpUcmFuc2Zvcm09IlNldEF0dHJpYnV0ZXMiIHhkdDpMb2NhdG9yPSJNYXRjaChuYW1lKSIvPgorICAgIDwvY29ubmVjdGlvblN0cmluZ3M+CisgIC0tPgorICA8c3lzdGVtLndlYj4KKyAgICA8Y29tcGlsYXRpb24geGR0OlRyYW5zZm9ybT0iUmVtb3ZlQXR0cmlidXRlcyhkZWJ1ZykiIC8+CisgICAgPCEtLQorICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiUmVwbGFjZSIgdHJhbnNmb3JtIHdpbGwgcmVwbGFjZSB0aGUgZW50aXJlCisgICAgICA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIG9mIHlvdXIgV2ViLmNvbmZpZyBmaWxlLgorICAgICAgTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY3VzdG9tRXJyb3JzIHNlY3Rpb24gdW5kZXIgdGhlCisgICAgICA8c3lzdGVtLndlYj4gbm9kZSwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlICJ4ZHQ6TG9jYXRvciIgYXR0cmlidXRlLgorCisgICAgICA8Y3VzdG9tRXJyb3JzIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yLmh0bSIKKyAgICAgICAgbW9kZT0iUmVtb3RlT25seSIgeGR0OlRyYW5zZm9ybT0iUmVwbGFjZSI+CisgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI1MDAiIHJlZGlyZWN0PSJJbnRlcm5hbEVycm9yLmh0bSIvPgorICAgICAgPC9jdXN0b21FcnJvcnM+CisgICAgLS0+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTdkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnCkBAIC0wLDAgKzEsOTIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgQVNQLk5FVCBhcHBsaWNhdGlvbiwgcGxlYXNlIHZpc2l0CisgIGh0dHA6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGluay8/TGlua0lkPTMwMTg4MAorICAtLT4KKzxjb25maWd1cmF0aW9uPgorICA8YXBwU2V0dGluZ3M+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOlZlcnNpb24iIHZhbHVlPSIzLjAuMC4wIiAvPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpFbmFibGVkIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPGFkZCBrZXk9IkNsaWVudFZhbGlkYXRpb25FbmFibGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8YWRkIGtleT0iVW5vYnRydXNpdmVKYXZhU2NyaXB0RW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPGFkZCBrZXk9Im93aW46QXV0b21hdGljQXBwU3RhcnR1cCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2FwcFNldHRpbmdzPgorICA8c3lzdGVtLndlYj4KKyAgICA8YXV0aGVudGljYXRpb24gbW9kZT0iTm9uZSIgLz4KKyAgICA8Y29tcGlsYXRpb24gZGVidWc9InRydWUiIHRhcmdldEZyYW1ld29yaz0iNC41IiAvPgorICAgIDxodHRwUnVudGltZSB0YXJnZXRGcmFtZXdvcms9IjQuNSIgLz4KKyAgPC9zeXN0ZW0ud2ViPgorICA8c3lzdGVtLndlYlNlcnZlcj4KKyAgICA8bW9kdWxlcz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iRm9ybXNBdXRoZW50aWNhdGlvbiIgLz4KKyAgICA8L21vZHVsZXM+CisgICAgPGhhbmRsZXJzPgorICAgICAgPGFkZCBuYW1lPSJBc3luY0h0dHBIYW5kbGVyIiB2ZXJiPSIqIiBwYXRoPSJBc3luYy50aHJpZnQiIHR5cGU9IlRocmlmdE1WQ1Rlc3QuQXN5bmNIdHRwSGFuZGxlciwgVGhyaWZ0TVZDVGVzdCIgLz4KKyAgICAgIDxhZGQgbmFtZT0iU3luY0h0dHBIYW5kbGVyIiB2ZXJiPSIqIiBwYXRoPSJTeW5jLnRocmlmdCIgdHlwZT0iVGhyaWZ0TVZDVGVzdC5TeW5jSHR0cEhhbmRsZXIsIFRocmlmdE1WQ1Rlc3QiIC8+CisgICAgPC9oYW5kbGVycz4KKyAgPC9zeXN0ZW0ud2ViU2VydmVyPgorICA8cnVudGltZT4KKyAgICA8YXNzZW1ibHlCaW5kaW5nIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSI+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5IiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eS5PQXV0aCIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkuQ29va2llcyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4iIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik5ld3RvbnNvZnQuSnNvbiIgY3VsdHVyZT0ibmV1dHJhbCIgcHVibGljS2V5VG9rZW49IjMwYWQ0ZmU2YjJhNmFlZWQiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC02LjAuMC4wIiBuZXdWZXJzaW9uPSI2LjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5PcHRpbWl6YXRpb24iIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMS4xLjAuMCIgbmV3VmVyc2lvbj0iMS4xLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IldlYkdyZWFzZSIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0xLjUuMi4xNDIzNCIgbmV3VmVyc2lvbj0iMS41LjIuMTQyMzQiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLkhlbHBlcnMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMy4wLjAuMCIgbmV3VmVyc2lvbj0iMy4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuTXZjIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTUuMi4zLjAiIG5ld1ZlcnNpb249IjUuMi4zLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLldlYlBhZ2VzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTMuMC4wLjAiIG5ld1ZlcnNpb249IjMuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgIDwvYXNzZW1ibHlCaW5kaW5nPgorICA8L3J1bnRpbWU+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28gYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E3OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Yzg0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcKQEAgLTAsMCArMSwyNSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwYWNrYWdlcz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuTXZjIiB2ZXJzaW9uPSI1LjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuUmF6b3IiIHZlcnNpb249IjMuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcyIgdmVyc2lvbj0iMy4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlIiB2ZXJzaW9uPSIxLjAuMC4wIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorPC9wYWNrYWdlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZC9NYWtlZmlsZS5hbSBiL2xpYi9kL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODEyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKKworU1VCRElSUyA9IC4KKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCisjCisjIEVudW1lcmF0aW9uIG9mIGFsbCB0aGUgcHVibGljIGFuZCBwcml2YXRlIG1vZHVsZXMuCisjCisjIFdlIHVuY29uZGl0aW9uYWxseSBpbnN0YWxsIGFsbCBvZiB0aGVtLCBldmVuIGlmIGxpYmV2ZW50IG9yIE9wZW5TU0wgYXJlCisjIG5vdCBhdmFpbGFibGUsIGJ1dCBidWlsZCB0aGUgcmVzcGVjdGl2ZSBsaWJyYXJpZXMgb25seSBpZiB0aGUgRGVpbW9zIGhlYWRlcnMKKyMgY291bGQgYmUgZm91bmQuCisjCitkX3RocmlmdG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvLCBiYXNlKQorZF90aHJpZnRkaXIgPSAkKERfSU1QT1JUX1BSRUZJWCkvdGhyaWZ0CitkX3RocmlmdF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF90aHJpZnRtb2R1bGVzKSkpCisKK2RfYXN5bmNtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2FzeW5jLywgYmFzZSBsaWJldmVudCBzb2NrZXQgc3NsKQorZF9hc3luY2RpciA9ICQoZF90aHJpZnRkaXIpL2FzeW5jCitkX2FzeW5jX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2FzeW5jbW9kdWxlcykpKQorCitkX2NvZGVnZW5tb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2NvZGVnZW4vLCBhc3luY19jbGllbnQgXAorCWFzeW5jX2NsaWVudF9wb29sIGJhc2UgY2xpZW50IGNsaWVudF9wb29sIHByb2Nlc3NvcikKKyNkX2NvZGVnZW5tb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2NvZGVnZW4vLCBhc3luY19jbGllbnQgXAorIwlhc3luY19jbGllbnRfcG9vbCBiYXNlIGNsaWVudCBjbGllbnRfcG9vbCBpZGxnZW4gcHJvY2Vzc29yKQorCitkX2NvZGVnZW5kaXIgPSAkKGRfdGhyaWZ0ZGlyKS9jb2RlZ2VuCitkX2NvZGVnZW5fREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfY29kZWdlbm1vZHVsZXMpKSkKKworZF9wcm90b2NvbG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvcHJvdG9jb2wvLCBiYXNlIGJpbmFyeSBjb21wYWN0IGpzb24gXAorCXByb2Nlc3NvcikKK2RfcHJvdG9jb2xkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9wcm90b2NvbAorZF9wcm90b2NvbF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9wcm90b2NvbG1vZHVsZXMpKSkKKworZF9zZXJ2ZXJtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3NlcnZlci8sIGJhc2Ugc2ltcGxlIG5vbmJsb2NraW5nIFwKKwl0YXNrcG9vbCB0aHJlYWRlZCkKK2Rfc2VydmVyZGlyID0gJChkX3RocmlmdGRpcikvc2VydmVyCitkX3NlcnZlcl9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9zZXJ2ZXJtb2R1bGVzKSkpCisKK2Rfc2VydmVydHJhbnNwb3J0bW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0LywgYmFzZSBzb2NrZXQgc3NsKQorZF9zZXJ2ZXJ0cmFuc3BvcnRkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9zZXJ2ZXIvdHJhbnNwb3J0CitkX3NlcnZlcnRyYW5zcG9ydF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsIFwKKwkkKGRfc2VydmVydHJhbnNwb3J0bW9kdWxlcykpKQorCitkX3RyYW5zcG9ydG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvdHJhbnNwb3J0LywgYmFzZSBidWZmZXJlZCBmaWxlIFwKKwlmcmFtZWQgaHR0cCBtZW1vcnkgcGlwZWQgcmFuZ2Ugc29ja2V0IHNzbCB6bGliKQorZF90cmFuc3BvcnRkaXIgPSAkKGRfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKK2RfdHJhbnNwb3J0X0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3RyYW5zcG9ydG1vZHVsZXMpKSkKKworZF91dGlsbW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC91dGlsLywgYXdhaXRhYmxlIGNhbmNlbGxhdGlvbiBmdXR1cmUgXAorCWhhc2hzZXQpCitkX3V0aWxkaXIgPSAkKGRfdGhyaWZ0ZGlyKS91dGlsCitkX3V0aWxfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdXRpbG1vZHVsZXMpKSkKKworZF9pbnRlcm5hbG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvaW50ZXJuYWwvLCBhbGdvcml0aG0gY29kZWdlbiBjdGZlIFwKKwllbmRpYW4gcmVzb3VyY2VfcG9vbCBzb2NrZXQgc3NsIHNzbF9iaW8gdHJhaXRzKQorZF9pbnRlcm5hbGRpciA9ICQoZF90aHJpZnRkaXIpL2ludGVybmFsCitkX2ludGVybmFsX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2ludGVybmFsbW9kdWxlcykpKQorCitkX3Rlc3Rtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2ludGVybmFsL3Rlc3QvLCBwcm90b2NvbCBzZXJ2ZXIpCitkX3Rlc3RkaXIgPSAkKGRfaW50ZXJuYWxkaXIpL3Rlc3QKK2RfdGVzdF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF90ZXN0bW9kdWxlcykpKQorCitkX3B1YmxpY21vZHVsZXMgPSAkKGRfdGhyaWZ0bW9kdWxlcykgJChkX2FzeW5jbW9kdWxlcykgXAorCSQoZF9jb2RlZ2VubW9kdWxlcykgJChkX3Byb3RvY29sbW9kdWxlcykgJChkX3NlcnZlcm1vZHVsZXMpIFwKKwkkKGRfc2VydmVydHJhbnNwb3J0bW9kdWxlcykgJChkX3RyYW5zcG9ydG1vZHVsZXMpICQoZF91dGlsbW9kdWxlcykKK2RfcHVibGljc291cmNlcyA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfcHVibGljbW9kdWxlcykpKQorCitkX21vZHVsZXMgPSAkKGRfcHVibGljbW9kdWxlcykgJChkX2ludGVybmFsbW9kdWxlcykgJChkX3Rlc3Rtb2R1bGVzKQorCisjIExpc3QgbW9kdWxlcyB3aXRoIGV4dGVybmFsIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFpbiBsaXN0CitkX2xpYmV2ZW50X2RlcGVuZGVudF9tb2R1bGVzID0gdGhyaWZ0L2FzeW5jL2xpYmV2ZW50IHRocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcKK2Rfb3BlbnNzbF9kZXBlbmRlbnRfbW9kdWxlcyA9IHRocmlmdC9hc3luYy9zc2wgdGhyaWZ0L2ludGVybmFsL3NzbCBcCisJdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8gdGhyaWZ0L3RyYW5zcG9ydC9zc2wgdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc3NsCitkX21haW5fbW9kdWxlcyA9ICQoZmlsdGVyLW91dCAkKGRfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMpIFwKKwkkKGRfb3BlbnNzbF9kZXBlbmRlbnRfbW9kdWxlcyksJChkX21vZHVsZXMpKQorCisKK2RfbGliX2ZsYWdzID0gLXcgLXdpIC1Jc3JjIC1saWIKK2FsbF90YXJnZXRzID0KKworIworIyBsaWJldmVudC1kZXBlbmRlbnQgbW9kdWxlcy4KKyMKK2lmIEhBVkVfREVJTU9TX0VWRU5UMgorJChEX0VWRU5UX0xJQl9OQU1FKTogJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9saWJldmVudF9kZXBlbmRlbnRfbW9kdWxlcykpKQorCSQoRE1EKSAtb2YkKERfRVZFTlRfTElCX05BTUUpICQoZF9saWJfZmxhZ3MpICReCithbGxfdGFyZ2V0cyArPSAkKERfRVZFTlRfTElCX05BTUUpCitlbmRpZgorCisjCisjIE9wZW5TU0wtZGVwZW5kZW50IG1vZHVsZXMuCisjCitpZiBIQVZFX0RFSU1PU19PUEVOU1NMCiskKERfU1NMX0xJQl9OQU1FKTogJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9vcGVuc3NsX2RlcGVuZGVudF9tb2R1bGVzKSkpCisJJChETUQpIC1vZiQoRF9TU0xfTElCX05BTUUpICQoZF9saWJfZmxhZ3MpICReCithbGxfdGFyZ2V0cyArPSAkKERfU1NMX0xJQl9OQU1FKQorZW5kaWYKKworIworIyBNYWluIGxpYnJhcnkgdGFyZ2V0LgorIworJChEX0xJQl9OQU1FKTogJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9tYWluX21vZHVsZXMpKSkKKwkkKERNRCkgLW9mJChEX0xJQl9OQU1FKSAkKGRfbGliX2ZsYWdzKSAkXgorYWxsX3RhcmdldHMgKz0gJChEX0xJQl9OQU1FKQorCisKKyMKKyMgRG9jdW1lbnRhdGlvbiB0YXJnZXQgKHJlcXVpcmVzIERpbCkuCisjCitkb2NzOiAkKGRfcHVibGljc291cmNlcykgc3JjL3RocmlmdC9pbmRleC5kCisJZGlsIGRkb2MgZG9jcyAtaGwgLS1rYW5kaWwgJF4KKworCisjCisjIEhvb2sgY3VzdG9tIGxpYnJhcnkgdGFyZ2V0cyBpbnRvIHRoZSBhdXRvbWFrZSBhbGwvaW5zdGFsbCB0YXJnZXRzLgorIworYWxsLWxvY2FsOiAkKGFsbF90YXJnZXRzKQorCitpbnN0YWxsLWV4ZWMtbG9jYWw6CisJJChJTlNUQUxMX1BST0dSQU0pICQoYWxsX3RhcmdldHMpICQoREVTVERJUikkKGxpYmRpcikKKworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZG9jcyAkKERfTElCX05BTUUpICQoRF9FVkVOVF9MSUJfTkFNRSkgJChEX1NTTF9MSUJfTkFNRSkgdW5pdHRlc3QKKworCisjCisjIFVuaXQgdGVzdHMgKGJ1aWx0IGJvdGggaW4gZGVidWcgYW5kIHJlbGVhc2UgbW9kZSkuCisjCitkX3Rlc3RfZmxhZ3MgPSAtdW5pdHRlc3QgLXcgLXdpIC1JJCh0b3Bfc3JjZGlyKS9saWIvZC9zcmMKKworIyBUaGVyZSBqdXN0IG11c3QgYmUgc29tZSB3YXkgdG8gcmVhc3NpZ24gYSB2YXJpYWJsZSB3aXRob3V0IHdhcm5pbmdzIGluCisjIEF1dG9tYWtlLi4uCitkX3Rlc3RfbW9kdWxlc19fID0gJChkX21vZHVsZXMpCisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX0xJQkVWRU5UX0ZMQUdTKQorZF90ZXN0X21vZHVsZXNfID0gJChkX3Rlc3RfbW9kdWxlc19fKQorZWxzZQorZF90ZXN0X21vZHVsZXNfID0gJChmaWx0ZXItb3V0ICQoZF9saWJldmVudF9kZXBlbmRlbnRfbW9kdWxlcyksICQoZF90ZXN0X21vZHVsZXNfXykpCitlbmRpZgorCitpZiBXSVRIX0RfU1NMX1RFU1RTCitkX3Rlc3RfZmxhZ3MgKz0gJChETURfT1BFTlNTTF9GTEFHUykKK2RfdGVzdF9tb2R1bGVzID0gJChkX3Rlc3RfbW9kdWxlc18pCitlbHNlCitkX3Rlc3RfbW9kdWxlcyA9ICQoZmlsdGVyLW91dCAkKGRfb3BlbnNzbF9kZXBlbmRlbnRfbW9kdWxlcyksICQoZF90ZXN0X21vZHVsZXNfKSkKK2VuZGlmCisKK3VuaXR0ZXN0L2VtcHR5bWFpbi5kOiB1bml0dGVzdC8uZGlyZWN0b3J5CisJQGVjaG8gJ3ZvaWQgbWFpbigpe30nID4kQAorCit1bml0dGVzdC8uZGlyZWN0b3J5OgorCW1rZGlyIC1wIHVuaXR0ZXN0IHx8IGV4aXN0cyB1bml0dGVzdAorCXRvdWNoICRACisKK3VuaXR0ZXN0L2RlYnVnLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKKwkkKERNRCkgLWcgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgorCit1bml0dGVzdC9yZWxlYXNlLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKKwkkKERNRCkgLU8gLXJlbGVhc2UgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgorCitURVNUUyA9ICQoYWRkcHJlZml4IHVuaXR0ZXN0L2RlYnVnLywgJChkX3Rlc3RfbW9kdWxlcykpIFwKKwkkKGFkZHByZWZpeCB1bml0dGVzdC9yZWxlYXNlLywgJChkX3Rlc3RfbW9kdWxlcykpCisKK3ByZWNyb3NzOiBhbGwtbG9jYWwKKwkkKE1BS0UpIC1DIHRlc3QgcHJlY3Jvc3MKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCXRlc3QgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2QvUkVBRE1FLm1kIGIvbGliL2QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzdlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9SRUFETUUubWQKQEAgLTAsMCArMSw1OCBAQAorVGhyaWZ0IEQgU29mdHdhcmUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaWNlbnNlCistLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitUZXN0aW5nCistLS0tLS0tCisKK0Qgc3VwcG9ydCBpbiBUaHJpZnQgaXMgY292ZXJlZCBieSB0d28gc2V0cyBvZiB0ZXN0czogZmlyc3QsCit0aGUgdW5pdCB0ZXN0IGJsb2NrcyBjb250YWluZWQgaW4gdGhlIEQgc291cmNlIGZpbGVzLCBhbmQKK3NlY29uZCwgdGhlIG1vcmUgZXh0ZW5zaXZlIHRlc3RpbmcgYXBwbGljYXRpb25zIGluIHRoZSB0ZXN0Lworc3ViZGlyZWN0b3J5LCB3aGljaCBhbHNvIG1ha2UgdXNlIG9mIHRoZSBUaHJpZnQgY29tcGlsZXIuCitCb3RoIGFyZSBidWlsdCB3aGVuIHJ1bm5pbmcgIm1ha2UgY2hlY2siLCBidXQgb25seSB0aGUKK3VuaXQgdGVzdHMgYXJlIGltbWVkaWF0ZWx5IHJ1biwgaG93ZXZlciDigJMgdGhlIHNlcGFyYXRlIHRlc3QKK2Nhc2VzIHR5cGljYWxseSBydW4gbG9uZ2VyIG9yIHJlcXVpcmUgbWFudWFsIGludGVydmVudGlvbi4KK0l0IG1pZ2h0IGFsc28gYmUgcHJ1ZGVudCB0byBydW4gdGhlIGluZGVwZW5kZW50IHRlc3RzLAord2hpY2ggdHlwaWNhbGx5IGNvbnNpc3Qgb2YgYSBzZXJ2ZXIgYW5kIGEgY2xpZW50IHBhcnQsCithZ2FpbnN0IHRoZSBvdGhlciBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMuCisKK1RvIGJ1aWxkIHRoZSB1bml0IHRlc3RzIG9uIFdpbmRvd3MsIHRoZSBlYXNpZXN0IHdheSBtaWdodAorYmUgdG8gbWFudWFsbHkgY3JlYXRlIGEgZmlsZSBjb250YWluaW5nIGFuIGVtcHR5IG1haW4oKSBhbmQKK2ludm9rZSB0aGUgY29tcGlsZXIgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGluIHRoZSBzcmMvCitkaXJlY3RvcnkgKFBvd2VyU2hlbGwgc3ludGF4KToKKworZG1kIC1vZnVuaXR0ZXN0IC11bml0dGVzdCAtdyAkKGRpciAtciAtZmlsdGVyICcqLmQnIC1uYW1lKQorCitJZiB5b3Ugd2FudCB0byBydW4gdGhlIHRlc3QgY2xpZW50cy9zZXJ2ZXJzIGluIE9wZW5TU0wKK21vZGUsIHlvdSBoYXZlIHRvIHByb3ZpZGUgwrtzZXJ2ZXItcHJpdmF0ZS1rZXkucGVtwqsgYW5kCivCu3NlcnZlci1jZXJ0aWZpY2F0ZS5wZW3CqyBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRoZSBzZXJ2ZXIKK2V4ZWN1dGFibGUgcmVzaWRlcyBpbiwgYW5kIGEgwrt0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbcKrCitmaWxlIGZvciB0aGUgY2xpZW50LiBUaGUgZWFzaWVzdCB3YXkgaXMgdG8gZ2VuZXJhdGUgYSBuZXcKK3NlbGYgc2lnbmVkIGNlcnRpZmljYXRlIHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWcgZmlsZQorKG9wZW5zc2wudGVzdC5jbmYpOgorCitvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAtY29uZmlnIG9wZW5zc2wudGVzdC5jbmYgXAorICAtb3V0IHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KK2NhdCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtID4gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0KKworVGhpcyBzdGVwcyBhcmUgYWxzbyBwZXJmb3JtZWQgYXV0b21hdGljYWxseSBieSB0aGUKK0F1dG90b29scyBidWlsZCBzeXN0ZW0gaWYgdGhlIGZpbGVzIGFyZSBub3QgcHJlc2VudC4KZGlmZiAtLWdpdCBhL2xpYi9kL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGViYzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9iYXNlLmQKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBmb3IgY2xpZW50LXNpZGUgaGFuZGxpbmcgb2YgYXN5bmNocm9ub3VzCisgKiBJL08gb3BlcmF0aW9ucywgYmFzZWQgb24gY29yb3V0aW5lcy4KKyAqCisgKiBUaGUgbWFpbiBwaWVjZSBvZiB0aGUgwrtjbGllbnQgc2lkZcKrIChlLmcuIGZvciBUQXN5bmNDbGllbnQgdXNlcnMpIG9mIHRoZQorICogQVBJIGlzIFRGdXR1cmUsIHdoaWNoIHJlcHJlc2VudHMgYW4gYXN5bmNocm9ub3VzbHkgZXhlY3V0ZWQgb3BlcmF0aW9uLAorICogd2hpY2ggY2FuIGhhdmUgYSByZXR1cm4gdmFsdWUsIHRocm93IGV4Y2VwdGlvbnMsIGFuZCB3aGljaCBjYW4gYmUgd2FpdGVkCisgKiB1cG9uLgorICoKKyAqIE9uIHRoZSDCu2ltcGxlbWVudGF0aW9uIHNpZGXCqywgdGhlIGlkZWEgaXMgdGhhdCBieSB1c2luZyBhIFRBc3luY1RyYW5zcG9ydAorICogaW5zdGVhZCBvZiBhIG5vcm1hbCBUVHJhbnNwb3J0IGFuZCBleGVjdXRpbmcgdGhlIHdvcmsgdGhyb3VnaCBhCisgKiBUQXN5bmNNYW5hZ2VyLCB0aGUgc2FtZSBjb2RlIGFzIGZvciBzeW5jaHJvbm91cyBJL08gY2FuIGJlIHVzZWQgZm9yCisgKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGFzIHdlbGwsIGZvciBleGFtcGxlOgorICoKKyAqIC0tLQorICogYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KHNvbWVUQXN5bmNTb2NrZXRNYW5hZ2VyKCksIGhvc3QsIHBvcnQpOworICogLy8g4oCmCisgKiBzb2NrZXQuYXN5bmNNYW5hZ2VyLmV4ZWN1dGUoc29ja2V0LCB7CisgKiAgIFNvbWVUaHJpZnRTdHJ1Y3QgczsKKyAqCisgKiAgIC8vIFdhaXRpbmcgZm9yIHNvY2tldCBJL08gd2lsbCBub3QgYmxvY2sgYW4gZW50aXJlIHRocmVhZCBidXQgY2F1c2UKKyAqICAgLy8gdGhlIGFzeW5jIG1hbmFnZXIgdG8gZXhlY3V0ZSBhbm90aGVyIHRhc2sgaW4gdGhlIG1lYW50aW1lLCBiZWNhdXNlCisgKiAgIC8vIHdlIGFyZSB1c2luZyBUQXN5bmNTb2NrZXQgaW5zdGVhZCBvZiBUU29ja2V0LgorICogICBzLnJlYWQoc29ja2V0KTsKKyAqCisgKiAgIC8vIERvIHNvbWV0aGluZyB3aXRoIHMsIGUuZy4gc2V0IGEgVFByb21pc2UgcmVzdWx0IHRvIGl0LgorICogICB3cml0ZWxuKHMpOworICogfSk7CisgKiAtLS0KKyAqLworbW9kdWxlIHRocmlmdC5hc3luYy5iYXNlOworCitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBzdGQuc29ja2V0LysgOiBTb2NrZXQrLzsgLy8gRE1EIEBAQlVHMzE0QEAKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIE1hbmFnZXMgb25lIG9yIG1vcmUgYXN5bmNocm9ub3VzIHRyYW5zcG9ydCByZXNvdXJjZXMgKGUuZy4gc29ja2V0cyBpbiB0aGUKKyAqIGNhc2Ugb2YgVEFzeW5jU29ja2V0TWFuYWdlcikgYW5kIGFsbG93cyB3b3JrIGl0ZW1zIHRvIGJlIHN1Ym1pdHRlZCBmb3IgdGhlbS4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbnMgd2lsbCB0eXBpY2FsbHkgcnVuIG9uZSBvciBtb3JlIGJhY2tncm91bmQgdGhyZWFkcyBmb3IKKyAqIGV4ZWN1dGluZyB0aGUgd29yaywgd2hpY2ggaXMgb25lIG9mIHRoZSByZWFzb25zIGZvciBhIFRBc3luY01hbmFnZXIgdG8gYmUKKyAqIHVzZWQuIEVhY2ggd29yayBpdGVtIGlzIHJ1biBpbiBpdHMgb3duIGZpYmVyIGFuZCBpcyBleHBlY3RlZCB0byB5aWVsZCgpIGF3YXkKKyAqIHdoaWxlIHdhaXRpbmcgZm9yIHRpbWUtY29uc3VtaW5nIG9wZXJhdGlvbnMuCisgKgorICogVGhlIHNlY29uZCBpbXBvcnRhbnQgcHVycG9zZSBvZiBUQXN5bmNNYW5hZ2VyIGlzIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8KKyAqIHRoZSB0cmFuc3BvcnQgcmVzb3VyY2VzIOKAkyB3aXRob3V0IHRha2luZyBjYXJlIG9mIHRoYXQsIGUuZy4gaXNzdWluZyBtdWx0aXBsZQorICogUlBDIGNhbGxzIG92ZXIgdGhlIHNhbWUgY29ubmVjdGlvbiBpbiByYXBpZCBzdWNjZXNzaW9uIHdvdWxkIGxpa2VseSBsZWFkIHRvCisgKiBtb3JlIHRoYW4gb25lIHJlcXVlc3QgYmVpbmcgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLCBjYXVzaW5nIG9ubHkgZ2FyYmFnZQorICogdG8gYXJyaXZlIGF0IHRoZSByZW1vdGUgZW5kLgorICoKKyAqIEFsbCBtZXRob2RzIGFyZSB0aHJlYWQtc2FmZS4KKyAqLworaW50ZXJmYWNlIFRBc3luY01hbmFnZXIgeworICAvKioKKyAgICogU3VibWl0cyBhIHdvcmsgaXRlbSB0byBiZSBleGVjdXRlZCBhc3luY2hyb25vdXNseS4KKyAgICoKKyAgICogQWNjZXNzIHRvIGFzbnljIHRyYW5zcG9ydHMgaXMgc2VyaWFsaXplZCDigJMgaWYgdHdvIHdvcmsgaXRlbXMgYXNzb2NpYXRlZAorICAgKiB3aXRoIHRoZSBzYW1lIHRyYW5zcG9ydCBhcmUgc3VibWl0dGVkLCB0aGUgc2Vjb25kIGRlbGVnYXRlIHdpbGwgbm90IGJlCisgICAqIGludm9rZWQgdW50aWwgdGhlIGZpcnN0IGhhcyByZXR1cm5lZCwgZXZlbiBpdCB0aGUgbGF0dGVyIGNvbnRleHQtc3dpdGNoZXMKKyAgICogYXdheSAoYmVjYXVzZSBpdCBpcyB3YWl0aW5nIGZvciBJL08pIGFuZCB0aGUgYXN5bmMgbWFuYWdlciBpcyBpZGxlCisgICAqIG90aGVyd2lzZS4KKyAgICoKKyAgICogT3B0aW9uYWxseSwgYSBUQ2FuY2VsbGF0aW9uIGluc3RhbmNlIGNhbiBiZSBzcGVjaWZpZWQuIElmIHByZXNlbnQsCisgICAqIHRyaWdnZXJpbmcgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIHdvcmsgaXRlbSwgaWYgaXQKKyAgICogaXMgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGFzc29jaWF0ZWQgdHJhbnNwb3J0IHRvIGJlY29tZSBhdmFpbGFibGUuCisgICAqIERlbGVnYXRlcyB3aGljaCBhcmUgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQgKGkuZS4gd2FpdGluZyBmb3IgSS9PKSBhcmUgbm90CisgICAqIGFmZmVjdGVkIGJlY2F1c2UgdGhpcyB3b3VsZCBicmluZyB0aGUgY29ubmVjdGlvbiBpbnRvIGFuIHVuZGVmaW5lZCBzdGF0ZQorICAgKiAoYXMgcHJvYmFibHkgaGFsZi13cml0dGVuIHJlcXVlc3Qgb3IgYSBoYWxmLXJlYWQgcmVzcG9uc2Ugd291bGQgYmUgbGVmdAorICAgKiBiZWhpbmQpLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIFRBc3luY1RyYW5zcG9ydCB0aGUgd29yayBkZWxlZ2F0ZSB3aWxsIG9wZXJhdGUgb24uIE11c3QKKyAgICogICAgIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRBc3luY01hbmFnZXIgaW5zdGFuY2UuCisgICAqICAgd29yayA9IFRoZSBvcGVyYXRpb25zIHRvIGV4ZWN1dGUgb24gdGhlIGdpdmVuIHRyYW5zcG9ydC4gTXVzdCBuZXZlcgorICAgKiAgICAgdGhyb3csIGVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBpbiBhbm90aGVyIHdheS4gbm90aHJvdyBzZW1hbnRpY3MgYXJlCisgICAqICAgICBkaWZmaWN1bHQgdG8gZW5mb3JjZSBpbiBjb21iaW5hdGlvbiB3aXRoIGZpYnJlcyB0aG91Z2gsIHNvIGN1cnJlbnRseQorICAgKiAgICAgZXhjZXB0aW9ucyBhcmUganVzdCBzd2FsbG93ZWQgYnkgVEFzeW5jTWFuYWdlciBpbXBsZW1lbnRhdGlvbnMuCisgICAqICAgY2FuY2VsbGF0aW9uID0gSWYgc2V0LCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlub24gb2YgdGhpcyB3b3JrCisgICAqICAgICBpdGVtIGlmIGl0IGlzIHN0aWxsIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgICAqCisgICAqIE5vdGU6IFRoZSB3b3JrIGl0ZW0gd2lsbCBsaWtlbHkgYmUgZXhlY3V0ZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLCBzbyBtYWtlCisgICAqICAgc3VyZSB0aGUgY29kZSBpdCByZWxpZXMgb24gaXMgdGhyZWFkLXNhZmUuIEFuIGV4Y2VwdGlvbiBhcmUgdGhlIGFzeW5jCisgICAqICAgdHJhbnNwb3J0cyB0aGVtc2VsdmVzLCB0byB3aGljaCBhY2Nlc3MgaXMgc2VyaWFsaXplZCBhcyBub3RlZCBhYm92ZS4KKyAgICovCisgIHZvaWQgZXhlY3V0ZShUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0LCB2b2lkIGRlbGVnYXRlKCkgd29yaywKKyAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwKKyAgKSBpbiB7CisgICAgYXNzZXJ0KHRyYW5zcG9ydC5hc3luY01hbmFnZXIgaXMgdGhpcywKKyAgICAgICJUaGUgZ2l2ZW4gdHJhbnNwb3J0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVEFzeW5jTWFuYWdlci4iKTsKKyAgfQorCisgIC8qKgorICAgKiBTdWJtaXRzIGEgZGVsZWdhdGUgdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIGhhcworICAgKiBwYXNzZWQuCisgICAqCisgICAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIHRpbWUgZWxhcHNlZCBjYW4gYmUgaGlnaGVyIGlmIHRoZSBhc3luYyBtYW5hZ2VyCisgICAqIGluc3RhbmNlIGlzIGJ1c3kgYW5kIHRodXMgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24uIFRoZQorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgZHVyYXRpb24gPSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgdG8gZXhlY3V0ZSB0aGUKKyAgICogICAgIHdvcmsgZGVsZWdhdGUuCisgICAqICAgd29yayA9IFRoZSBjb2RlIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBoYXMgcGFzc2VkLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKiAtLS0KKyAgICogLy8gQSB2ZXJ5IGJhc2ljIGV4YW1wbGUg4oCTIHVzdWFsbHksIHRoZSBhY3R1YWxsIHdvcmsgaXRlbSB3b3VsZCBlbnF1ZXVlCisgICAqIC8vIHNvbWUgYXN5bmMgdHJhbnNwb3J0IG9wZXJhdGlvbi4KKyAgICogYXV0byBhc3luY01hbmdhZ2VyID0gc29tZUFzeW5jTWFuYWdlcigpOworICAgKgorICAgKiBURnV0dXJlIWludCBjYWxjdWxhdGUoKSB7CisgICAqICAgLy8gQ3JlYXRlIGEgcHJvbWlzZSBhbmQgYXN5bmNocm9ub3VzbHkgc2V0IGl0cyB2YWx1ZSBhZnRlciB0aHJlZQorICAgKiAgIC8vIHNlY29uZHMgaGF2ZSBwYXNzZWQuCisgICAqICAgYXV0byBwcm9taXNlID0gbmV3IFRQcm9taXNlIWludDsKKyAgICogICBhc3luY01hbmFnZXIuZGVsYXkoZHVyISJzZWNvbmRzIigzKSwgeworICAgKiAgICAgcHJvbWlzZS5zdWNjZWVkKDQyKTsKKyAgICogICB9KTsKKyAgICoKKyAgICogICAvLyBJbW1lZGlhdGVseSByZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICogICByZXR1cm4gcHJvbWlzZTsKKyAgICogfQorICAgKgorICAgKiAvLyBUaGlzIHdpbGwgd2FpdCB1bnRpbCB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZSBhbmQgdGhlbiBwcmludCBpdC4KKyAgICogd3JpdGVsbihjYWxjdWxhdGUoKS53YWl0R2V0KCkpOworICAgKiAtLS0KKyAgICovCisgIHZvaWQgZGVsYXkoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZGVsZWdhdGUoKSB3b3JrKTsKKworICAvKioKKyAgICogU2h1dHMgZG93biBhbGwgYmFja2dyb3VuZCB0aHJlYWRzIG9yIG90aGVyIGZhY2lsaXRpZXMgdGhhdCBtaWdodCBoYXZlCisgICAqIGJlZW4gc3RhcnRlZCBpbiBvcmRlciB0byBleGVjdXRlIHdvcmsgaXRlbXMuIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5CisgICAqIGNhbGxlZCBkdXJpbmcgcHJvZ3JhbSBzaHV0ZG93bi4KKyAgICoKKyAgICogSWYgdGhlcmUgYXJlIHN0aWxsIHRhc2tzIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHRpbWVvdXQgZXhwaXJlcywgYW55CisgICAqIGN1cnJlbnRseSBleGVjdXRlZCB3b3JrIGl0ZW1zIHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbnkgbm90aWZpY2F0aW9ucworICAgKiBmb3IgYXN5bmMgdHJhbnNwb3J0cyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UsIHF1ZXVlZCB3b3JrIGl0ZW1zIHdpbGwKKyAgICogYmUgc2lsZW50bHkgZHJvcHBlZCwgYW5kIGltcGxlbWVudGF0aW9ucyBhcmUgYWxsb3dlZCB0byBsZWFrIHJlc291cmNlcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHdhaXRGaW5pc2hUaW1lb3V0ID0gSWYgcG9zaXRpdmUsIHdhaXRzIGZvciBhbGwgd29yayBpdGVtcyB0byBiZQorICAgKiAgICAgZmluaXNoZWQgZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUsIGlmIG5lZ2F0aXZlLCB3YWl0cyBmb3IKKyAgICogICAgIGNvbXBsZXRpb24gd2l0aG91dCBldmVyIHRpbWluZyBvdXQsIGlmIHplcm8sIGltbWVkaWF0ZWx5IHNodXRzIGRvd24KKyAgICogICAgIHRoZSBiYWNrZ3JvdW5kIGZhY2lsaXRpZXMuCisgICAqLworICBib29sIHN0b3AoRHVyYXRpb24gd2FpdEZpbmlzaFRpbWVvdXQgPSBkdXIhImhuc2VjcyIoLTEpKTsKK30KKworLyoqCisgKiBBIFRUcmFuc3BvcnQgd2hpY2ggdXNlcyBhIFRBc3luY01hbmFnZXIgdG8gc2NoZWR1bGUgbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMuCisgKgorICogVGhlIGFjdHVhbCB0eXBlIG9mIGRldmljZSBpcyBub3Qgc3BlY2lmaWVkOyB0eXBpY2FsbHksIGltcGxlbWVudGF0aW9ucyB3aWxsCisgKiBkZXBlbmQgb24gYW4gaW50ZXJmYWNlIGRlcml2ZWQgZnJvbSBUQXN5bmNNYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMKKyAqIGluIHRoZSB0cmFuc3BvcnQgc3RhdGUuCisgKgorICogVGhlIHBlZWtpbmcsIHJlYWRpbmcsIHdyaXRpbmcgYW5kIGZsdXNoaW5nIG1ldGhvZHMgbXVzdCBhbHdheXMgYmUgY2FsbGVkCisgKiBmcm9tIHdpdGhpbiB0aGUgYXNzb2NpYXRlZCBhc3luYyBtYW5hZ2VyLgorICovCitpbnRlcmZhY2UgVEFzeW5jVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBUaGUgVEFzeW5jTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc3BvcnQuCisgICAqLworICBUQXN5bmNNYW5hZ2VyIGFzeW5jTWFuYWdlcigpIEBwcm9wZXJ0eTsKK30KKworLyoqCisgKiBBIFRBc3luY01hbmFnZXIgcHJvdmlkaW5nIG5vdGlmaWNpYXRpb25zIGZvciBzb2NrZXQgZXZlbnRzLgorICovCitpbnRlcmZhY2UgVEFzeW5jU29ja2V0TWFuYWdlciA6IFRBc3luY01hbmFnZXIgeworICAvKioKKyAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgaXMgdHJpZ2dlcmVkIG9uY2Ugd2hlbiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgICogb2NjdXJzLCBhbmQgcmVtb3ZlZCBhZnRlcndhcmRzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgc29ja2V0ID0gVGhlIHNvY2tldCB0byBsaXN0ZW4gZm9yIGV2ZW50cyBhdC4KKyAgICogICBldmVudFR5cGUgPSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KKyAgICogICB0aW1lb3V0ID0gVGhlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIHdoaWNoIHRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZAorICAgKiAgICAgd2l0aCBUQXN5bmNFdmVudFJlYXNvbi5USU1FRF9PVVQgaWYgbm8gZXZlbnQgaGFwcGVuZWQuCisgICAqICAgbGlzdGVuZXIgPSBUaGUgZGVsZWdhdGUgdG8gY2FsbCB3aGVuIGFuIGV2ZW50IGhhcHBlbmVkLgorICAgKi8KKyAgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXIoU29ja2V0IHNvY2tldCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICBEdXJhdGlvbiB0aW1lb3V0LCBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgLy8vIERpdHRvCisgIHZvaWQgYWRkT25lc2hvdExpc3RlbmVyKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOworfQorCisvKioKKyAqIFR5cGVzIG9mIGV2ZW50cyB0aGF0IGNhbiBoYXBwZW4gZm9yIGFuIGFzeW5jaHJvbm91cyB0cmFuc3BvcnQuCisgKi8KK2VudW0gVEFzeW5jRXZlbnRUeXBlIHsKKyAgUkVBRCwgLy8vIE5ldyBkYXRhIGJlY2FtZSBhdmFpbGFibGUgdG8gcmVhZC4KKyAgV1JJVEUgLy8vIFRoZSB0cmFuc3BvcnQgYmVjYW1lIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8uCit9CisKKy8qKgorICogVGhlIHR5cGUgb2YgdGhlIGRlbGVnYXRlcyB1c2VkIHRvIHJlZ2lzdGVyIHNvY2tldCBldmVudCBoYW5kbGVycy4KKyAqLworYWxpYXMgdm9pZCBkZWxlZ2F0ZShUQXN5bmNFdmVudFJlYXNvbiBjYWxsUmVhc29uKSBUU29ja2V0RXZlbnRMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgcmVhc29uIGEgbGlzdGVuZXIgd2FzIGNhbGxlZC4KKyAqLworZW51bSBUQXN5bmNFdmVudFJlYXNvbiA6IGJ5dGUgeworICBOT1JNQUwsIC8vLyBUaGUgZXZlbnQgbGlzdGVuZWQgZm9yIHdhcyB0cmlnZ2VyZWQgbm9ybWFsbHkuCisgIFRJTUVEX09VVCAvLy8gQSB0aW1lb3V0IGZvciB0aGUgZXZlbnQgd2FzIHNldCwgYW5kIGl0IGV4cGlyZWQuCit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyZTRhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZApAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5hc3luYy5saWJldmVudDsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgY29yZS5leGNlcHRpb24gOiBvbk91dE9mTWVtb3J5RXJyb3I7CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IEZpYmVyLCBUaHJlYWQ7CitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS5zdGRjLnN0ZGxpYiA6IGZyZWUsIG1hbGxvYzsKK2ltcG9ydCBkZWltb3MuZXZlbnQyLmV2ZW50OworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udCwgcG9wRnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0IDogU29ja2V0LCBzb2NrZXRQYWlyOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRyYWl0czsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8vIFRvIGF2b2lkIERNRCBAQEJVRzYzOTVAQC4KK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtOworCisvKioKKyAqIEEgVEFzeW5jTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBsaWJldmVudC4KKyAqCisgKiBUaGUgbGliZXZlbnQgbG9vcCBmb3IgaGFuZGxpbmcgbm9uLWJsb2NraW5nIHNvY2tldHMgaXMgcnVuIGluIGEgYmFja2dyb3VuZAorICogdGhyZWFkLCB3aGljaCBpcyBsYXppbHkgc3Bhd25lZC4gVGhlIHRocmVhZCBpcyBub3QgZGFlbW9uaXplZCB0byBhdm9pZAorICogY3Jhc2hlcyBvbiBwcm9ncmFtIHNodXRkb3duLCBpdCBpcyBvbmx5IHN0b3BwZWQgd2hlbiB0aGUgbWFuYWdlciBpbnN0YW5jZQorICogaXMgZGVzdHJveWVkLiBTbywgdG8gZW5zdXJlIGEgY2xlYW4gcHJvZ3JhbSB0ZWFyZG93biwgZWl0aGVyIG1ha2Ugc3VyZSB0aGlzCisgKiBpbnN0YW5jZSBnZXRzIGRlc3Ryb3llZCAoZS5nLiBieSB1c2luZyBzY29wZSksIG9yIG1hbnVhbGx5IGNhbGwgc3RvcCgpIGF0CisgKiB0aGUgZW5kLgorICovCitjbGFzcyBUTGliZXZlbnRBc3luY01hbmFnZXIgOiBUQXN5bmNTb2NrZXRNYW5hZ2VyIHsKKyAgdGhpcygpIHsKKyAgICBldmVudEJhc2VfID0gZXZlbnRfYmFzZV9uZXcoKTsKKworICAgIC8vIFNldCB1cCB0aGUgc29ja2V0IHBhaXIgZm9yIHRyYW5zZmVycmluZyBjb250cm9sIG1lc3NhZ2VzIHRvIHRoZSBldmVudAorICAgIC8vIGxvb3AuCisgICAgYXV0byBwYWlyID0gc29ja2V0UGFpcigpOworICAgIGNvbnRyb2xTZW5kU29ja2V0XyA9IHBhaXJbMF07CisgICAgY29udHJvbFJlY2VpdmVTb2NrZXRfID0gcGFpclsxXTsKKyAgICBjb250cm9sUmVjZWl2ZVNvY2tldF8uYmxvY2tpbmcgPSBmYWxzZTsKKworICAgIC8vIFJlZ2lzdGVyIGFuIGV2ZW50IGZvciByZWNlaXZpbmcgY29udHJvbCBtZXNzYWdlcy4KKyAgICBjb250cm9sUmVjZWl2ZUV2ZW50XyA9IGV2ZW50X25ldyhldmVudEJhc2VfLCBjb250cm9sUmVjZWl2ZVNvY2tldF8uaGFuZGxlLAorICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QgfCBFVl9FVCwgYXNzdW1lTm90aHJvdygmY29udHJvbE1zZ1JlY2VpdmVDYWxsYmFjayksCisgICAgICBjYXN0KHZvaWQqKXRoaXMpOworICAgIGV2ZW50X2FkZChjb250cm9sUmVjZWl2ZUV2ZW50XywgbnVsbCk7CisKKyAgICBxdWV1ZWRDb3VudE11dGV4XyA9IG5ldyBNdXRleDsKKyAgICB6ZXJvUXVldWVkQ29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24ocXVldWVkQ291bnRNdXRleF8pOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgLy8gc3RvcCgpIHNob3VsZCBiZSBzYWZlIHRvIGNhbGwsIGJlY2F1c2UgZWl0aGVyIHdlIGRvbid0IGhhdmUgYSB3b3JrZXIKKyAgICAvLyB0aHJlYWQgcnVubmluZyBhbmQgaXQgaXMgYSBuby1vcCBhbnl3YXksIG9yIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKKyAgICAvLyBzdGlsbCBydW5uaW5nIChibG9ja2VkIGluIGV2ZW50X2Jhc2VfbG9vcCksIGFuZCB0aHVzIGd1YXJhbnRlZWQgbm90IHRvCisgICAgLy8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgeWV0LgorICAgIHN0b3AoZHVyISJobnNlY3MiKDApKTsKKworICAgIGV2ZW50X2ZyZWUoY29udHJvbFJlY2VpdmVFdmVudF8pOworICAgIGV2ZW50X2Jhc2VfZnJlZShldmVudEJhc2VfKTsKKyAgICBldmVudEJhc2VfID0gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZXhlY3V0ZShUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0LCBXb3JrIHdvcmssCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsCisgICkgeworICAgIGlmIChjYW5jZWxsYXRpb24gJiYgY2FuY2VsbGF0aW9uLnRyaWdnZXJlZCkgcmV0dXJuOworCisgICAgLy8gS2VlcCB0cmFjayB0aGF0IHRoZXJlIGlzIGEgbmV3IHdvcmsgaXRlbSB0byBiZSBwcm9jZXNzZWQuCisgICAgaW5jcmVtZW50UXVldWVkQ291bnQoKTsKKworICAgIGVuc3VyZVdvcmtlclRocmVhZFJ1bm5pbmcoKTsKKworICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIHNlbmQgdGhlIGNvbnRyb2wgbWVzc2FnZSBhcyBhIHdob2xlIOKAkyB3ZSBjdXJyZW50bHkKKyAgICAvLyBhc3N1bWUgdG8gYmUgYWJsZSB0byByZWNlaXZlIGl0IGF0IG9uY2UgYXMgd2VsbC4gSWYgdGhpcyBwcm92ZXMgdG8gYmUKKyAgICAvLyB1bnN0YWJsZSAoZS5nLiBzZW5kIGNvdWxkIHBvc3NpYmx5IHJldHVybiBlYXJseSBpZiB0aGUgcmVjZWl2aW5nIGJ1ZmZlcgorICAgIC8vIGlzIGZ1bGwgYW5kIHRoZSBibG9ja2luZyBjYWxsIGdldHMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwpLCBpdCBjb3VsZAorICAgIC8vIGJlIGNoYW5nZWQgdG8gYSBtb3JlIHNvcGhpc3RpY2F0ZWQgc2NoZW1lLgorCisgICAgLy8gTWFrZSBzdXJlIHRoZSBkZWxlZ2F0ZSBjb250ZXh0IGRvZXNuJ3QgZ2V0IEdDZCB3aGlsZSB0aGUgd29yayBpdGVtIGlzCisgICAgLy8gb24gdGhlIHdpcmUuCisgICAgR0MuYWRkUm9vdCh3b3JrLnB0cik7CisKKyAgICAvLyBTZW5kIHdvcmsgbWVzc2FnZS4KKyAgICBzZW5kQ29udHJvbE1zZyhDb250cm9sTXNnKE1zZ1R5cGUuV09SSywgd29yaywgdHJhbnNwb3J0KSk7CisKKyAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgIHNlbmRDb250cm9sTXNnKENvbnRyb2xNc2coTXNnVHlwZS5DQU5DRUwsIHdvcmssIHRyYW5zcG9ydCkpOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBkZWxheShEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBkZWxlZ2F0ZSgpIHdvcmspIHsKKyAgICBpbmNyZW1lbnRRdWV1ZWRDb3VudCgpOworCisgICAgZW5zdXJlV29ya2VyVGhyZWFkUnVubmluZygpOworCisgICAgY29uc3QgdHYgPSB0b1RpbWV2YWwoZHVyYXRpb24pOworCisgICAgLy8gRE1EIEBAQlVHQEA6IENhbm5vdCBkZWR1Y2UgVCB0byB2b2lkIGRlbGVnYXRlKCkgaGVyZS4KKyAgICByZWdpc3Rlck9uZXNob3RFdmVudCEodm9pZCBkZWxlZ2F0ZSgpKSgKKyAgICAgIC0xLCAwLCBhc3N1bWVOb3Rocm93KCZkZWxheUNhbGxiYWNrKSwgJnR2LAorICAgICAgeworICAgICAgICB3b3JrKCk7CisgICAgICAgIGRlY3JlbWVudFF1ZXVlZENvdW50KCk7CisgICAgICB9CisgICAgKTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgc3RvcChEdXJhdGlvbiB3YWl0RmluaXNoVGltZW91dCA9IGR1ciEiaG5zZWNzIigtMSkpIHsKKyAgICBib29sIGNsZWFuRXhpdCA9IHRydWU7CisKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgIGlmICh3b3JrZXJUaHJlYWRfKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocXVldWVkQ291bnRNdXRleF8pIHsKKyAgICAgICAgICBpZiAod2FpdEZpbmlzaFRpbWVvdXQgPiBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZWRDb3VudF8gPiAwKSB7CisgICAgICAgICAgICAgIHplcm9RdWV1ZWRDb25kaXRpb25fLndhaXQod2FpdEZpbmlzaFRpbWVvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAod2FpdEZpbmlzaFRpbWVvdXQgPCBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIHdoaWxlIChxdWV1ZWRDb3VudF8gPiAwKSB6ZXJvUXVldWVkQ29uZGl0aW9uXy53YWl0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdhaXRGaW5pc2hUaW1lb3V0IGlzIHplcm8sIGltbWVkaWF0ZWx5IGV4aXQgaW4gYWxsIGNhc2VzLgorICAgICAgICAgIH0KKyAgICAgICAgICBjbGVhbkV4aXQgPSAocXVldWVkQ291bnRfID09IDApOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CisgICAgICAgIHNlbmRDb250cm9sTXNnKENvbnRyb2xNc2coTXNnVHlwZS5TSFVURE9XTikpOworICAgICAgICB3b3JrZXJUaHJlYWRfLmpvaW4oKTsKKyAgICAgICAgd29ya1F1ZXVlc18gPSBudWxsOworICAgICAgICAvLyBXZSBoYXZlIG51a2VkIGFsbCBjdXJyZW50bHkgZW5xdWV1ZWQgaXRlbXMsIHNvIHNldCB0aGUgY291bnQgdG8KKyAgICAgICAgLy8gemVyby4gVGhpcyBpcyBzYWZlIHRvIGRvIHdpdGhvdXQgbG9ja2luZywgc2luY2UgdGhlIHdvcmtlciB0aHJlYWQKKyAgICAgICAgLy8gaXMgZG93bi4KKyAgICAgICAgcXVldWVkQ291bnRfID0gMDsKKyAgICAgICAgYXRvbWljU3RvcmUoKihjYXN0KHNoYXJlZCkmd29ya2VyVGhyZWFkXyksIGNhc3Qoc2hhcmVkKFRocmVhZCkpbnVsbCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsZWFuRXhpdDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgYWRkT25lc2hvdExpc3RlbmVyKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyCisgICkgeworICAgIGFkZE9uZXNob3RMaXN0ZW5lckltcGwoc29ja2V0LCBldmVudFR5cGUsIG51bGwsIGxpc3RlbmVyKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgYWRkT25lc2hvdExpc3RlbmVyKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgRHVyYXRpb24gdGltZW91dCwgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIKKyAgKSB7CisgICAgaWYgKHRpbWVvdXQgPD0gZHVyISJobnNlY3MiKDApKSB7CisgICAgICBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKHNvY2tldCwgZXZlbnRUeXBlLCBudWxsLCBsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgbm90IHJlYWxseSBkb2N1bWVudGVkIHdlbGwsIGJ1dCBsaWJldmVudCBkb2VzIG5vdCByZXF1aXJlIHRvCisgICAgICAvLyBrZWVwIHRoZSB0aW1ldmFsIGFyb3VuZCBhZnRlciB0aGUgZXZlbnQgd2FzIGFkZGVkLgorICAgICAgYXV0byB0diA9IHRvVGltZXZhbCh0aW1lb3V0KTsKKyAgICAgIGFkZE9uZXNob3RMaXN0ZW5lckltcGwoc29ja2V0LCBldmVudFR5cGUsICZ0diwgbGlzdGVuZXIpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBhbGlhcyB2b2lkIGRlbGVnYXRlKCkgV29yazsKKworICB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lckltcGwoU29ja2V0IHNvY2tldCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICAgY29uc3QodGltZXZhbCkqIHRpbWVvdXQsIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyCisgICkgeworICAgIHJlZ2lzdGVyT25lc2hvdEV2ZW50KHNvY2tldC5oYW5kbGUsIGxpYmV2ZW50RXZlbnRUeXBlKGV2ZW50VHlwZSksCisgICAgICBhc3N1bWVOb3Rocm93KCZzb2NrZXRDYWxsYmFjayksIHRpbWVvdXQsIGxpc3RlbmVyKTsKKyAgfQorCisgIHZvaWQgcmVnaXN0ZXJPbmVzaG90RXZlbnQoVCkoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB0eXBlLAorICAgIGV2ZW50X2NhbGxiYWNrX2ZuIGNhbGxiYWNrLCBjb25zdCh0aW1ldmFsKSogdGltZW91dCwgVCBwYXlsb2FkCisgICkgeworICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHBheWxvYWQgb24gdGhlIEMgaGVhcC4KKyAgICBhdXRvIHBheWxvYWRNZW0gPSBtYWxsb2MocGF5bG9hZC5zaXplb2YpOworICAgIGlmICghcGF5bG9hZE1lbSkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgICAgKGNhc3QoVCopcGF5bG9hZE1lbSlbMCAuLiAxXSA9IHBheWxvYWQ7CisgICAgR0MuYWRkUmFuZ2UocGF5bG9hZE1lbSwgcGF5bG9hZC5zaXplb2YpOworCisgICAgYXV0byByZXN1bHQgPSBldmVudF9iYXNlX29uY2UoZXZlbnRCYXNlXywgZmQsIHR5cGUsIGNhbGxiYWNrLAorICAgICAgcGF5bG9hZE1lbSwgdGltZW91dCk7CisKKyAgICAvLyBBc3N1bWluZyB0aGF0IHdlIGRpZG4ndCBnZXQgb3VyIGFyZ3VtZW50cyB3cm9uZyBhYm92ZSwgdGhlIG9ubHkgb3RoZXIKKyAgICAvLyBzaXR1YXRpb24gaW4gd2hpY2ggZXZlbnRfYmFzZV9vbmNlIGNhbiBmYWlsIGlzIHdoZW4gaXQgY2FuJ3QgYWxsb2NhdGUKKyAgICAvLyBtZW1vcnkuCisgICAgaWYgKHJlc3VsdCAhPSAwKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKyAgfQorCisgIGVudW0gTXNnVHlwZSA6IHVieXRlIHsKKyAgICBTSFVURE9XTiwKKyAgICBXT1JLLAorICAgIENBTkNFTAorICB9CisKKyAgc3RydWN0IENvbnRyb2xNc2cgeworICAgIE1zZ1R5cGUgdHlwZTsKKyAgICBXb3JrIHdvcms7CisgICAgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgfQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHdvcmtlciB0aHJlYWQgaWYgaXQgaXMgbm90IGFscmVhZHkgcnVubmluZy4KKyAgICovCisgIHZvaWQgZW5zdXJlV29ya2VyVGhyZWFkUnVubmluZygpIHsKKyAgICAvLyBUZWNobmljYWxseSwgb25seSBoYWxmIGJhcnJpZXJzIHdvdWxkIGJlIHJlcXVpcmVkIGhlcmUsIGJ1dCBhZGRpbmcgdGhlCisgICAgLy8gYXJndW1lbnQgc2VlbXMgdG8gdHJpZ2dlciBhIERNRCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gQEBCVUdAQC4KKyAgICBpZiAoIWF0b21pY0xvYWQoKihjYXN0KHNoYXJlZCkmd29ya2VyVGhyZWFkXykpKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgaWYgKCF3b3JrZXJUaHJlYWRfKSB7CisgICAgICAgICAgYXV0byB0aHJlYWQgPSBuZXcgVGhyZWFkKHsgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOyB9KTsKKyAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICBhdG9taWNTdG9yZSgqKGNhc3Qoc2hhcmVkKSZ3b3JrZXJUaHJlYWRfKSwgY2FzdChzaGFyZWQpdGhyZWFkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZW5kcyBhIGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgd29ya2VyIHRocmVhZC4KKyAgICovCisgIHZvaWQgc2VuZENvbnRyb2xNc2coY29uc3QoQ29udHJvbE1zZykgbXNnKSB7CisgICAgYXV0byByZXN1bHQgPSBjb250cm9sU2VuZFNvY2tldF8uc2VuZCgoJm1zZylbMCAuLiAxXSk7CisgICAgZW51bSBzaXplID0gbXNnLnNpemVvZjsKKyAgICBlbmZvcmNlKHJlc3VsdCA9PSBzaXplLCBuZXcgVEV4Y2VwdGlvbih0ZXh0KAorICAgICAgIlNlbmRpbmcgY29udHJvbCBtZXNzYWdlIG9mIHR5cGUgIiwgbXNnLnR5cGUsICIgZmFpbGVkICgiLCByZXN1bHQsCisgICAgICAiIGJ5dGVzIGluc3RlYWQgb2YgIiwgc2l6ZSwgIiB0cmFuc21pdHRlZCkuIikpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSBjb250cm9sIG1lc3NhZ2Ugc29ja2V0IGFuZCBhY3RzIG9uIHRoZW0uIENhbGxlZAorICAgKiBmcm9tIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgKi8KKyAgdm9pZCByZWNlaXZlQ29udHJvbE1zZygpIHsKKyAgICAvLyBSZWFkIGFzIG1hbnkgbmV3IHdvcmsgaXRlbXMgb2ZmIHRoZSBzb2NrZXQgYXMgcG9zc2libGUgKGF0IGxlYXN0IG9uZQorICAgIC8vIHNob3VsZCBiZSBhdmFpbGFibGUsIGFzIHdlIGdvdCBub3RpZmllZCBieSBsaWJldmVudCkuCisgICAgQ29udHJvbE1zZyBtc2c7CisgICAgcHRyZGlmZl90IGJ5dGVzUmVhZDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYnl0ZXNSZWFkID0gY29udHJvbFJlY2VpdmVTb2NrZXRfLnJlY2VpdmUoY2FzdCh1Ynl0ZVtdKSgoJm1zZylbMCAuLiAxXSkpOworCisgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICBhdXRvIGVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKyAgICAgICAgaWYgKGVycm5vICE9IFdPVUxEX0JMT0NLX0VSUk5PKSB7CisgICAgICAgICAgbG9nRXJyb3IoIlJlYWRpbmcgY29udHJvbCBtZXNzYWdlLCBzb21lIHdvcmsgaXRlbSB3aWxsIHBvc3NpYmx5ICIgfgorICAgICAgICAgICAgIm5ldmVyIGJlIGV4ZWN1dGVkOiAlcyIsIHNvY2tldEVycm5vU3RyaW5nKGVycm5vKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChieXRlc1JlYWQgIT0gbXNnLnNpemVvZikgYnJlYWs7CisKKyAgICAgIC8vIEV2ZXJ5dGhpbmcgd2VudCBmaW5lLCB3ZSByZWNlaXZlZCBhIG5ldyBjb250cm9sIG1lc3NhZ2UuCisgICAgICBmaW5hbCBzd2l0Y2ggKG1zZy50eXBlKSB7CisgICAgICAgIGNhc2UgTXNnVHlwZS5TSFVURE9XTjoKKyAgICAgICAgICAvLyBUaGUgbWVzc2FnZSB3YXMganVzdCBpbnRlbmRlZCB0byB3YWtlIHVzIHVwIGZvciBzaHV0ZG93bi4KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1zZ1R5cGUuQ0FOQ0VMOgorICAgICAgICAgIC8vIFdoZW4gcHJvY2Vzc2luZyBhIGNhbmNlbGxhdGlvbiwgd2UgbXVzdCBub3QgdG91Y2ggdGhlIGZpcnN0IGl0ZW0sCisgICAgICAgICAgLy8gc2luY2UgaXQgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQuCisgICAgICAgICAgYXV0byBxdWV1ZSA9IHdvcmtRdWV1ZXNfW21zZy50cmFuc3BvcnRdOworICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICB3b3JrUXVldWVzX1ttc2cudHJhbnNwb3J0XSA9IFtxdWV1ZVswXV0gfgorICAgICAgICAgICAgICByZW1vdmVFcXVhbChxdWV1ZVsxIC4uICRdLCBtc2cud29yayk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTXNnVHlwZS5XT1JLOgorICAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSB3b3JrIGl0ZW0gaXMgYmFjayBpbiB0aGUgRCB3b3JsZCwgd2UgZG9uJ3QgbmVlZCB0aGUKKyAgICAgICAgICAvLyBleHRyYSBHQyByb290IGZvciB0aGUgY29udGV4dCBwb2ludGVyIGFueW1vcmUgKHNlZSBleGVjdXRlKCkpLgorICAgICAgICAgIEdDLnJlbW92ZVJvb3QobXNnLndvcmsucHRyKTsKKworICAgICAgICAgIC8vIEFkZCB0aGUgd29yayBpdGVtIHRvIHRoZSBxdWV1ZSBhbmQgZXhlY3V0ZSBpdC4KKyAgICAgICAgICBhdXRvIHF1ZXVlID0gbXNnLnRyYW5zcG9ydCBpbiB3b3JrUXVldWVzXzsKKyAgICAgICAgICBpZiAocXVldWUgaXMgbnVsbCB8fCAoKnF1ZXVlKS5lbXB0eSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBhZGQgdGhlIG5ldyB3b3JrIGl0ZW0gdG8gdGhlIHF1ZXVlIGFzIHdlbGwsCisgICAgICAgICAgICAvLyBidXQgaW1tZWRpYXRlbHkgc3RhcnQgZXhlY3V0aW5nIGl0LgorICAgICAgICAgICAgd29ya1F1ZXVlc19bbXNnLnRyYW5zcG9ydF0gPSBbbXNnLndvcmtdOworICAgICAgICAgICAgZXhlY3V0ZVdvcmsobXNnLnRyYW5zcG9ydCwgbXNnLndvcmspOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKnF1ZXVlKSB+PSBtc2cud29yazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIGxhc3QgcmVhZCB3YXMgc3VjY2Vzc2Z1bCwgYnV0IGRpZG4ndCByZWFkIGVub3VnaCBieXRlcywgd2UgZ290CisgICAgLy8gYSBwcm9ibGVtLgorICAgIGlmIChieXRlc1JlYWQgPiAwKSB7CisgICAgICBsb2dFcnJvcigiVW5leHBlY3RlZCBwYXJ0aWFsIGNvbnRyb2wgbWVzc2FnZSByZWFkICglcyBieXRlKHMpICIgfgorICAgICAgICAiaW5zdGVhZCBvZiAlcyksIHNvbWUgd29yayBpdGVtIHdpbGwgcG9zc2libHkgbmV2ZXIgYmUgZXhlY3V0ZWQuIiwKKyAgICAgICAgYnl0ZXNSZWFkLCBtc2cuc2l6ZW9mKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIHdvcmsgaXRlbSBhbmQgYWxsIG90aGVycyBlbnF1ZXVlZCBmb3IgdGhlIHNhbWUKKyAgICogdHJhbnNwb3J0IGluIGEgbmV3IGZpYmVyLiBDYWxsZWQgZnJvbSB0aGUgd29ya2VyIHRocmVhZC4KKyAgICovCisgIHZvaWQgZXhlY3V0ZVdvcmsoVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCwgV29yayB3b3JrKSB7CisgICAgKG5ldyBGaWJlcih7CisgICAgICBhdXRvIGl0ZW0gPSB3b3JrOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhY3R1YWwgd29yay4gSXQgd2lsbCBwb3NzaWJseSBhZGQgbGlzdGVuZXJzIHRvIHRoZQorICAgICAgICAgIC8vIGV2ZW50IGxvb3AgYW5kIHlpZWxkIGF3YXkgaWYgaXQgaGFzIHRvIHdhaXQgZm9yIGJsb2NraW5nCisgICAgICAgICAgLy8gb3BlcmF0aW9ucy4gSXQgaXMgcXVpdGUgcG9zc2libGUgdGhhdCBhbm90aGVyIGZpYmVyIHdpbGwgbW9kaWZ5CisgICAgICAgICAgLy8gdGhlIHdvcmsgcXVldWUgZm9yIHRoZSBjdXJyZW50IHRyYW5zcG9ydC4KKyAgICAgICAgICBpdGVtKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBqdXN0IHRvIGJlIHN1cmUgdGhlIHdvcmtlciB0aHJlYWQKKyAgICAgICAgICAvLyBkb2Vzbid0IHN0b3Agd29ya2luZyBpbiBteXN0ZXJpb3VzIHdheXMgYmVjYXVzZSBvZiBhbiB1bmhhbmRsZWQKKyAgICAgICAgICAvLyBleGNlcHRpb24uCisgICAgICAgICAgbG9nRXJyb3IoIkV4Y2VwdGlvbiB0aHJvd24gYnkgd29yayBpdGVtOiAlcyIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHdvcmsgcXVldWUuCisgICAgICAgIC8vIE5vdGU6IER1ZSB0byB0aGUgdmFsdWUgc2VtYW50aWNzIG9mIGFycmF5IHNsaWNlcywgd2UgaGF2ZSB0bworICAgICAgICAvLyByZS1sb29rdXAgdGhpcyBvbiBldmVyeSBpdGVyYXRpb24uIFRoaXMgY291bGQgYmUgc29sdmVkLCBidXQgSSdkCisgICAgICAgIC8vIHJhdGhlciByZXBsYWNlIHRoaXMgZGlyZWN0bHkgd2l0aCBhIHF1ZXVlIHR5cGUgb25jZSBvbmUgYmVjb21lcworICAgICAgICAvLyBhdmFpbGFibGUgaW4gUGhvYm9zLgorICAgICAgICBhdXRvIHF1ZXVlID0gd29ya1F1ZXVlc19bdHJhbnNwb3J0XTsKKyAgICAgICAgYXNzZXJ0KHF1ZXVlLmZyb250ID09IGl0ZW0pOworICAgICAgICBxdWV1ZS5wb3BGcm9udCgpOworICAgICAgICB3b3JrUXVldWVzX1t0cmFuc3BvcnRdID0gcXVldWU7CisKKyAgICAgICAgLy8gTm93IHRoYXQgdGhlIHdvcmsgaXRlbSBpcyBkb25lLCBubyBsb25nZXIgY291bnQgaXQgYXMgcXVldWVkLgorICAgICAgICBkZWNyZW1lbnRRdWV1ZWRDb3VudCgpOworCisgICAgICAgIGlmIChxdWV1ZS5lbXB0eSkgYnJlYWs7CisKKyAgICAgICAgLy8gSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgZXhlY3V0ZSB0aGUgbmV4dCB3YWl0aW5nIGl0ZW0uCisgICAgICAgIGl0ZW0gPSBxdWV1ZS5mcm9udDsKKyAgICAgIH0KKyAgICB9KSkuY2FsbCgpOworICB9CisKKyAgLyoqCisgICAqIEluY3JlbWVudHMgdGhlIGFtb3VudCBvZiBxdWV1ZWQgaXRlbXMuCisgICAqLworICB2b2lkIGluY3JlbWVudFF1ZXVlZENvdW50KCkgeworICAgIHN5bmNocm9uaXplZCAocXVldWVkQ291bnRNdXRleF8pIHsKKyAgICAgICsrcXVldWVkQ291bnRfOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEZWNyZW1lbnRzIHRoZSBhbW91bnQgb2YgcXVldWVkIGl0ZW1zLgorICAgKi8KKyAgdm9pZCBkZWNyZW1lbnRRdWV1ZWRDb3VudCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlZENvdW50TXV0ZXhfKSB7CisgICAgICBhc3NlcnQocXVldWVkQ291bnRfID4gMCk7CisgICAgICAtLXF1ZXVlZENvdW50XzsKKyAgICAgIGlmIChxdWV1ZWRDb3VudF8gPT0gMCkgeworICAgICAgICB6ZXJvUXVldWVkQ29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHZvaWQgY29udHJvbE1zZ1JlY2VpdmVDYWxsYmFjayhldnV0aWxfc29ja2V0X3QsIHNob3J0LAorICAgIHZvaWQgKm1hbmFnZXJUaGlzCisgICkgeworICAgIChjYXN0KFRMaWJldmVudEFzeW5jTWFuYWdlciltYW5hZ2VyVGhpcykucmVjZWl2ZUNvbnRyb2xNc2coKTsKKyAgfQorCisgIHN0YXRpYyBleHRlcm4oQykgdm9pZCBzb2NrZXRDYWxsYmFjayhldnV0aWxfc29ja2V0X3QsIHNob3J0IGZsYWdzLAorICAgIHZvaWQgKmFyZworICApIHsKKyAgICBhdXRvIHJlYXNvbiA9IChmbGFncyAmIEVWX1RJTUVPVVQpID8gVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUIDoKKyAgICAgIFRBc3luY0V2ZW50UmVhc29uLk5PUk1BTDsKKyAgICAoKihjYXN0KFRTb2NrZXRFdmVudExpc3RlbmVyKilhcmcpKShyZWFzb24pOworICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7CisgICAgZGVzdHJveShhcmcpOworICAgIGZyZWUoYXJnKTsKKyAgfQorCisgIHN0YXRpYyBleHRlcm4oQykgdm9pZCBkZWxheUNhbGxiYWNrKGV2dXRpbF9zb2NrZXRfdCwgc2hvcnQgZmxhZ3MsCisgICAgdm9pZCAqYXJnCisgICkgeworICAgIGFzc2VydChmbGFncyAmIEVWX1RJTUVPVVQpOworICAgICgqKGNhc3Qodm9pZCBkZWxlZ2F0ZSgpKilhcmcpKSgpOworICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7CisgICAgZGVzdHJveShhcmcpOworICAgIGZyZWUoYXJnKTsKKyAgfQorCisgIFRocmVhZCB3b3JrZXJUaHJlYWRfOworCisgIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87CisKKyAgLy8vIFRoZSBzb2NrZXQgdXNlZCBmb3IgcmVjZWl2aW5nIG5ldyB3b3JrIGl0ZW1zIGluIHRoZSBldmVudCBsb29wLiBQYWlyZWQKKyAgLy8vIHdpdGggY29udHJvbFNlbmRTb2NrZXRfLiBJbnZhbGlkIChpLmUuIFRBc3luY1dvcmtJdGVtLmluaXQpIGl0ZW1zIGFyZQorICAvLy8gaWdub3JlZCBhbmQgY2FuIGJlIHVzZWQgdG8gd2FrZSB1cCB0aGUgd29ya2VyIHRocmVhZC4KKyAgU29ja2V0IGNvbnRyb2xSZWNlaXZlU29ja2V0XzsKKyAgZXZlbnQqIGNvbnRyb2xSZWNlaXZlRXZlbnRfOworCisgIC8vLyBUaGUgc29ja2V0IHVzZWQgdG8gc2VuZCBuZXcgd29yayBpdGVtcyB0byB0aGUgZXZlbnQgbG9vcC4gSXQgaXMKKyAgLy8vIGV4cGVjdGVkIHRoYXQgd29yayBpdGVtcyBjYW4gYWx3YXlzIGJlIHJlYWQgYXQgb25jZSBmcm9tIGl0LCBpLmUuIHRoYXQKKyAgLy8vIHRoZXJlIHdpbGwgbmV2ZXIgYmUgc2hvcnQgcmVhZHMuCisgIFNvY2tldCBjb250cm9sU2VuZFNvY2tldF87CisKKyAgLy8vIFF1ZXVlZCB1cCB3b3JrIGRlbGVnYXRlcyBmb3IgYXN5bmMgdHJhbnNwb3J0cy4gVGhpcyBhbHNvIGluY2x1ZGVzCisgIC8vLyBjdXJyZW50bHkgYWN0aXZlIG9uZXMsIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgb24gY29tcGxldGlvbiwKKyAgLy8vIHdoaWNoIGlzIHJlbGllZCBvbiBieSB0aGUgY29udHJvbCBtZXNzYWdlIHJlY2VpdmUgZmliZXIgKHRoZSBtYWluIG9uZSkKKyAgLy8vIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGV4ZWN1dGluZyBpdGVtcyBvciBub3QuCisgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHJlYWxseSBiZSBvZiBzb21lIHF1ZXVlIHR5cGUsIG5vdCBhbiBhcnJheSBzbGljZSwgYnV0CisgIC8vIHN0ZC5jb250YWluZXIgZG9lc24ndCBoYXZlIGFueXRoaW5nLgorICBXb3JrW11bVEFzeW5jVHJhbnNwb3J0XSB3b3JrUXVldWVzXzsKKworICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIGl0ZW1zIG5vdCB5ZXQgZmluaXNoZWQgKHF1ZXVlZCBhbmQgY3VycmVudGx5CisgIC8vLyBleGVjdXRlZCkgYW5kIGRlbGF5cyBub3QgeWV0IGV4ZWN1dGVkLgorICB1aW50IHF1ZXVlZENvdW50XzsKKworICAvLy8gUHJvdGVjdHMgcXVldWVkQ291bnRfLgorICBNdXRleCBxdWV1ZWRDb3VudE11dGV4XzsKKworICAvLy8gVHJpZ2dlcmVkIHdoZW4gcXVldWVkQ291bnRfIHJlYWNoZXMgemVybywgcHJvdGVjdGVkIGJ5IHF1ZXVlZENvdW50TXV0ZXhfLgorICBDb25kaXRpb24gemVyb1F1ZXVlZENvbmRpdGlvbl87Cit9CisKK3ByaXZhdGUgeworICB0aW1ldmFsIHRvVGltZXZhbChjb25zdChEdXJhdGlvbikgZHVyKSB7CisgICAgdGltZXZhbCB0djsKKyAgICBkdXIuc3BsaXQhKCJzZWNvbmRzIiwgInVzZWNzIikodHYudHZfc2VjLCB0di50dl91c2VjKTsKKyAgICByZXR1cm4gdHY7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbGliZXZlbnQgZmxhZ3MgY29tYmluYXRpb24gdG8gcmVwcmVzZW50IGEgZ2l2ZW4gVEFzeW5jRXZlbnRUeXBlLgorICAgKi8KKyAgc2hvcnQgbGliZXZlbnRFdmVudFR5cGUoVEFzeW5jRXZlbnRUeXBlIHR5cGUpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVEFzeW5jRXZlbnRUeXBlLlJFQUQ6CisgICAgICAgIHJldHVybiBFVl9SRUFEIHwgRVZfRVQ7CisgICAgICBjYXNlIFRBc3luY0V2ZW50VHlwZS5XUklURToKKyAgICAgICAgcmV0dXJuIEVWX1dSSVRFIHwgRVZfRVQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhmNTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5hc3luYy5zb2NrZXQ7CisKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CitpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlcjsKK2ltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQgOiBUU29ja2V0QmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CisKK3ZlcnNpb24gKFdpbmRvd3MpIHsKKyAgaW1wb3J0IHN0ZC5jLndpbmRvd3Mud2luc29jayA6IGNvbm5lY3Q7Cit9IGVsc2UgdmVyc2lvbiAoUG9zaXgpIHsKKyAgaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnN5cy5zb2NrZXQgOiBjb25uZWN0OworfSBlbHNlIHN0YXRpYyBhc3NlcnQoMCwgIkRvbid0IGtub3cgY29ubmVjdCBvbiB0aGlzIHBsYXRmb3JtLiIpOworCisvKioKKyAqIE5vbi1ibG9ja2luZyBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIFdoZW5ldmVyIGEgc29ja2V0IG9wZXJhdGlvbiB3b3VsZCBibG9jaywgVEFzeW5jU29ja2V0IHJlZ2lzdGVycyBhIGNhbGxiYWNrCisgKiB3aXRoIHRoZSBzcGVjaWZpZWQgVEFzeW5jU29ja2V0TWFuYWdlciBhbmQgeWllbGRzLgorICoKKyAqIEFzIGZvciB0aHJpZnQudHJhbnNwb3J0LnNvY2tldCwgZHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBzdGQuc29ja2V0LAorICogY3VycmVudGx5IG9ubHkgVENQL0lQIHNvY2tldHMgYXJlIHN1cHBvcnRlZCAoaS5lLiBVbml4IGRvbWFpbiBzb2NrZXRzIGFyZQorICogbm90KS4KKyAqLworY2xhc3MgVEFzeW5jU29ja2V0IDogVFNvY2tldEJhc2UsIFRBc3luY1RyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkICghKSBzb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBhc3luY01hbmFnZXIgPSBUaGUgVEFzeW5jU29ja2V0TWFuYWdlciB0byB1c2UgZm9yIG5vbi1ibG9ja2luZyBJL08uCisgICAqICAgc29ja2V0ID0gQWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgc29ja2V0IG9iamVjdC4gV2lsbCBiZSBzd2l0Y2hlZCB0bworICAgKiAgICAgbm9uLWJsb2NraW5nIG1vZGUgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KKyAgICovCisgIHRoaXMoVEFzeW5jU29ja2V0TWFuYWdlciBhc3luY01hbmFnZXIsIFNvY2tldCBzb2NrZXQpIHsKKyAgICBhc3luY01hbmFnZXJfID0gYXN5bmNNYW5hZ2VyOworICAgIHNvY2tldC5ibG9ja2luZyA9IGZhbHNlOworICAgIHN1cGVyKHNvY2tldCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKKyAgICogb24gdGhlIGdpdmVuIHBvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBhc3luY01hbmFnZXIgPSBUaGUgVEFzeW5jU29ja2V0TWFuYWdlciB0byB1c2UgZm9yIG5vbi1ibG9ja2luZyBJL08uCisgICAqICAgaG9zdCA9IFJlbW90ZSBob3N0LgorICAgKiAgIHBvcnQgPSBSZW1vdGUgcG9ydC4KKyAgICovCisgIHRoaXMoVEFzeW5jU29ja2V0TWFuYWdlciBhc3luY01hbmFnZXIsIHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIGFzeW5jTWFuYWdlcl8gPSBhc3luY01hbmFnZXI7CisgICAgc3VwZXIoaG9zdCwgcG9ydCk7CisgIH0KKworICBvdmVycmlkZSBUQXN5bmNNYW5hZ2VyIGFzeW5jTWFuYWdlcigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGFzeW5jTWFuYWdlcl87CisgIH0KKworICAvKioKKyAgICogQXN5bmNocm9ub3VzbHkgY29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICoKKyAgICogQ29tcGxldGVzIHdpdGhvdXQgYmxvY2tpbmcgYW5kIGRlZmVycyBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhlIHNvY2tldAorICAgKiB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4gSWYgY29ubmVjdGluZyBmYWlscywgdGhpcyBpcworICAgKiBjdXJyZW50bHkgbm90IGluZGljYXRlZCBpbiBhbnkgd2F5IG90aGVyIHRoYW4gZXZlcnkgY2FsbCB0byByZWFkL3dyaXRlCisgICAqIGZhaWxpbmcuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgZW5mb3JjZSghaG9zdF8uZW1wdHksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKyAgICBlbmZvcmNlKHBvcnRfICE9IDAsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBvcGVuIHdpdGggbnVsbCBwb3J0LiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisKKyAgICAvLyBDYW5ub3QgdXNlIHN0ZC5zb2NrZXQuU29ja2V0LmNvbm5lY3QgaGVyZSBiZWNhdXNlIGl0IGhpZGVzIGF3YXkKKyAgICAvLyBFSU5QUk9HUkVTUy9XU0FXT1VMREJMT0NLLgorICAgIEFkZHJlc3MgYWRkcjsKKyAgICB0cnkgeworICAgICAgLy8gQ3VycmVudGx5LCB3ZSBqdXN0IGdvIHdpdGggdGhlIGZpcnN0IGFkZHJlc3MgcmV0dXJuZWQsIGNvdWxkIGJlIG1hZGUKKyAgICAgIC8vIG1vcmUgaW50ZWxsaWdlbnQgdGhvdWdoIOKAkyBJUHY2PworICAgICAgYWRkciA9IGdldEFkZHJlc3MoaG9zdF8sIHBvcnRfKVswXTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oYFVuYWJsZSB0byByZXNvbHZlIGhvc3QgImAgfiBob3N0XyB+IGAiLmAsCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTiwgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgICB9CisKKyAgICBzb2NrZXRfID0gbmV3IFRjcFNvY2tldChhZGRyLmFkZHJlc3NGYW1pbHkpOworICAgIHNvY2tldF8uYmxvY2tpbmcgPSBmYWxzZTsKKyAgICBzZXRTb2NrZXRPcHRzKCk7CisKKyAgICBhdXRvIGVycm9yQ29kZSA9IGNvbm5lY3Qoc29ja2V0Xy5oYW5kbGUsIGFkZHIubmFtZSgpLCBhZGRyLm5hbWVMZW4oKSk7CisgICAgaWYgKGVycm9yQ29kZSA9PSAwKSB7CisgICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiBjb3VsZCBiZSBlc3RhYmxpc2hlZCBpbW1lZGlhdGVseSwganVzdCByZXR1cm4uIEkKKyAgICAgIC8vIGRvbid0IGtub3cgaWYgdGhpcyBldmVyIGhhcHBlbnMuCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgaWYgKGVycm5vICE9IENPTk5FQ1RfSU5QUk9HUkVTU19FUlJOTykgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oYENvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byAiYCB+CisgICAgICAgIGhvc3RfIH4gYCI6IGAgfiBzb2NrZXRFcnJub1N0cmluZyhlcnJubyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTik7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgY2FzZTogY29ubmVjdCgpIHNpZ25hbGxlZCB0aGF0IHRoZSBjb25uZWN0aW9uCisgICAgLy8gaXMgYmVpbmcgZXN0YWJsaXNoZWQgaW4gdGhlIGJhY2tncm91bmQuIFF1ZXVlIHVwIGEgd29yayBpdGVtIHdpdGggdGhlCisgICAgLy8gYXN5bmMgbWFuYWdlciB3aGljaCBqdXN0IGRlZmVycyBhbnkgb3RoZXIgb3BlcmF0aW9ucyBvbiB0aGlzCisgICAgLy8gVEFzeW5jU29ja2V0IGluc3RhbmNlIHVudGlsIHRoZSBzb2NrZXQgaXMgcmVhZHkuCisgICAgYXN5bmNNYW5hZ2VyXy5leGVjdXRlKHRoaXMsCisgICAgICB7CisgICAgICAgIGF1dG8gZmliZXIgPSBGaWJlci5nZXRUaGlzKCk7CisgICAgICAgIFRBc3luY0V2ZW50UmVhc29uIHJlYXNvbiA9IHZvaWQ7CisgICAgICAgIGFzeW5jTWFuYWdlcl8uYWRkT25lc2hvdExpc3RlbmVyKHNvY2tldF8sIFRBc3luY0V2ZW50VHlwZS5XUklURSwKKyAgICAgICAgICBjb25uZWN0VGltZW91dCwKKyAgICAgICAgICBzY29wZWREZWxlZ2F0ZSgoVEFzeW5jRXZlbnRSZWFzb24gcil7IHJlYXNvbiA9IHI7IGZpYmVyLmNhbGwoKTsgfSkKKyAgICAgICAgKTsKKyAgICAgICAgRmliZXIueWllbGQoKTsKKworICAgICAgICBpZiAocmVhc29uID09IFRBc3luY0V2ZW50UmVhc29uLlRJTUVEX09VVCkgeworICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uLCBzbyB0aGF0IHN1YnNlcXVlbnQgd29yayBpdGVtcyBmYWlsIGltbWVkaWF0ZWx5LgorICAgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgZXJyb3JDb2RlID0gdm9pZDsKKyAgICAgICAgc29ja2V0Xy5nZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VULCBjYXN0KFNvY2tldE9wdGlvbilTT19FUlJPUiwKKyAgICAgICAgICBlcnJvckNvZGUpOworCisgICAgICAgIGlmIChlcnJvckNvZGUpIHsKKyAgICAgICAgICBsb2dJbmZvKCJDb3VsZCBub3QgY29ubmVjdCBUQXN5bmNTb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGVycm9yQ29kZSkpOworCisgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24sIHNvIHRoYXQgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIGZhaWwgaW1tZWRpYXRlbHkuCisgICAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgKTsKKyAgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICoKKyAgICogV2lsbCBibG9jayB1bnRpbCBhbGwgY3VycmVudGx5IGFjdGl2ZSBvcGVyYXRpb25zIGFyZSBmaW5pc2hlZCBiZWZvcmUgdGhlCisgICAqIHNvY2tldCBpcyBjbG9zZWQuCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKKyAgICBpbXBvcnQgY29yZS5zeW5jLm11dGV4OworCisgICAgYXV0byBkb25lTXV0ZXggPSBuZXcgTXV0ZXg7CisgICAgYXV0byBkb25lQ29uZCA9IG5ldyBDb25kaXRpb24oZG9uZU11dGV4KTsKKyAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgeworICAgICAgYXN5bmNNYW5hZ2VyXy5leGVjdXRlKHRoaXMsCisgICAgICAgIHNjb3BlZERlbGVnYXRlKAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSBkb25lQ29uZC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICB9CisgICAgICAgICkKKyAgICAgICk7CisgICAgICBkb25lQ29uZC53YWl0KCk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm4gZmFsc2U7CisKKyAgICB1Ynl0ZSBidWY7CisgICAgYXV0byByID0gc29ja2V0Xy5yZWNlaXZlKCgmYnVmKVswLi4xXSwgU29ja2V0RmxhZ3MuUEVFSyk7CisgICAgaWYgKHIgPT0gU29ja2V0LkVSUk9SKSB7CisgICAgICBhdXRvIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgICBzdGF0aWMgaWYgKGNvbm5yZXNldE9uUGVlclNodXRkb3duKSB7CisgICAgICAgIGlmIChsYXN0RXJybm8gPT0gRUNPTk5SRVNFVCkgeworICAgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJQZWVraW5nIGludG8gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgICB9CisgICAgcmV0dXJuIChyID4gMCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgcmVhZCBpZiBzb2NrZXQgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICB0eXBlb2YoZ2V0U29ja2V0RXJybm8oKSkgbGFzdEVycm5vOworCisgICAgYXV0byByID0geWllbGRPbkJsb2NrKHNvY2tldF8ucmVjZWl2ZShjYXN0KHZvaWRbXSlidWYpLAorICAgICAgVEFzeW5jRXZlbnRUeXBlLlJFQUQpOworCisgICAgLy8gSWYgcmVjdiB3ZW50IGZpbmUsIGltbWVkaWF0ZWx5IHJldHVybi4KKyAgICBpZiAociA+PSAwKSByZXR1cm4gcjsKKworICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nLCBmaW5kIG91dCBob3cgdG8gaGFuZGxlIGl0LgorICAgIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICBzdGF0aWMgaWYgKGNvbm5yZXNldE9uUGVlclNodXRkb3duKSB7CisgICAgICAvLyBTZWUgdG9wIGNvbW1lbnQuCisgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlY2VpdmluZyBmcm9tIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHNpemVfdCBzZW50OworICAgIHdoaWxlIChzZW50IDwgYnVmLmxlbmd0aCkgeworICAgICAgc2VudCArPSB3cml0ZVNvbWUoYnVmW3NlbnQgLi4gJF0pOworICAgIH0KKyAgICBhc3NlcnQoc2VudCA9PSBidWYubGVuZ3RoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCB3cml0ZVNvbWUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHdyaXRlIGlmIHNvY2tldCBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGF1dG8gciA9IHlpZWxkT25CbG9jayhzb2NrZXRfLnNlbmQoYnVmKSwgVEFzeW5jRXZlbnRUeXBlLldSSVRFKTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgaWYgKHIgPiAwKSByZXR1cm4gcjsKKworICAgIC8vIEhhbmRsZSBlcnJvciBjb25kaXRpb25zLgorICAgIGlmIChyIDwgMCkgeworICAgICAgYXV0byBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgICBhdXRvIHR5cGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTjsKKyAgICAgIGlmIChpc1NvY2tldENsb3NlRXJybm8obGFzdEVycm5vKSkgeworICAgICAgICB0eXBlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOOworICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLyBzZW5kKCkgc2hvdWxkIG5ldmVyIHJldHVybiAwLgorICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQgKDAgYnl0ZXMgd3JpdHRlbikuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgfQorCisgIC8vLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gd2hpY2ggYSBjb25uY2V0aW9uIG11c3QgYmUgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZQorICAvLy8gb3BlbigpIGNhbGwgdGltZXMgb3V0LgorICBEdXJhdGlvbiBjb25uZWN0VGltZW91dCA9IGR1ciEic2Vjb25kcyIoNSk7CisKK3ByaXZhdGU6CisgIHZvaWQgY2xvc2VJbW1lZGlhdGVseSgpIHsKKyAgICBzb2NrZXRfLmNsb3NlKCk7CisgICAgc29ja2V0XyA9IG51bGw7CisgIH0KKworICBUIHlpZWxkT25CbG9jayhUKShsYXp5IFQgY2FsbCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIHJlc3VsdCA9IGNhbGwoKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gU29ja2V0LkVSUk9SIHx8IGdldFNvY2tldEVycm5vKCkgIT0gV09VTERfQkxPQ0tfRVJSTk8pIHJldHVybiByZXN1bHQ7CisKKyAgICAgIC8vIFdlIGdvdCBhbiBFQUdBSU4gcmVzdWx0LCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHVybiBoZXJlIG9uY2Ugc29tZQorICAgICAgLy8gZXZlbnQgaGFwcGVucyBhbmQgeWllbGQuCisKKyAgICAgIER1cmF0aW9uIHRpbWVvdXQgPSB2b2lkOworICAgICAgZmluYWwgc3dpdGNoIChldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuUkVBRDoKKyAgICAgICAgICB0aW1lb3V0ID0gcmVjdlRpbWVvdXRfOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRBc3luY0V2ZW50VHlwZS5XUklURToKKyAgICAgICAgICB0aW1lb3V0ID0gc2VuZFRpbWVvdXRfOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBhdXRvIGZpYmVyID0gRmliZXIuZ2V0VGhpcygpOworICAgICAgYXNzZXJ0KGZpYmVyLCAiQ3VycmVudCBmaWJlciBudWxsIOKAkyBub3QgcnVubmluZyBpbiBUQXN5bmNNYW5hZ2VyPyIpOworICAgICAgVEFzeW5jRXZlbnRSZWFzb24gZXZlbnRSZWFzb24gPSB2b2lkOworICAgICAgYXN5bmNNYW5hZ2VyXy5hZGRPbmVzaG90TGlzdGVuZXIoc29ja2V0XywgZXZlbnRUeXBlLCB0aW1lb3V0LAorICAgICAgICBzY29wZWREZWxlZ2F0ZSgoVEFzeW5jRXZlbnRSZWFzb24gcmVhc29uKSB7CisgICAgICAgICAgZXZlbnRSZWFzb24gPSByZWFzb247CisgICAgICAgICAgZmliZXIuY2FsbCgpOworICAgICAgICB9KQorICAgICAgKTsKKworICAgICAgLy8gWWllbGRzIGV4ZWN1dGlvbiBiYWNrIHRvIHRoZSBhc3luYyBtYW5hZ2VyLCB3aWxsIHJldHVybiBiYWNrIGhlcmUgb25jZQorICAgICAgLy8gdGhlIGFib3ZlIGxpc3RlbmVyIGlzIGNhbGxlZC4KKyAgICAgIEZpYmVyLnlpZWxkKCk7CisKKyAgICAgIGlmIChldmVudFJlYXNvbiA9PSBUQXN5bmNFdmVudFJlYXNvbi5USU1FRF9PVVQpIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGNhbmNlbGxpbmcgdGhlIHJlcXVlc3QgZHVlIHRvIGEgdGltZWQgb3V0IG9wZXJhdGlvbiwgdGhlCisgICAgICAgIC8vIGNvbm5lY3Rpb24gaXMgaW4gYW4gdW5kZWZpbmVkIHN0YXRlLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgY291bGQgZGVjaWRlCisgICAgICAgIC8vIHRvIHNlbmQgdGhlIHJlcXVlc3RlZCBkYXRhIGxhdGVyLCBvciB3ZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBoYWxmLQorICAgICAgICAvLyB3YXkgaW50byB3cml0aW5nIGEgcmVxdWVzdC4gVGh1cywgd2UgY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gbWFrZSBhbnkKKyAgICAgICAgLy8gcG9zc2libHkgcXVldWVkIHVwIHdvcmsgaXRlbXMgZmFpbCBpbW1lZGlhdGVseS4gQmVzaWRlcywgdGhlIHNlcnZlcgorICAgICAgICAvLyBpcyBub3QgdmVyeSBsaWtlbHkgdG8gaW1tZWRpYXRlbHkgcmVjb3ZlciBhZnRlciBhIHNvY2tldC1sZXZlbAorICAgICAgICAvLyB0aW1lb3V0IGhhcyBleHBpcmVkIGFueXdheS4KKyAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworCisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJUaW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3Igc29ja2V0ICIgfgorICAgICAgICAgICJ0byBnZXQgcmVhZHkgdG8gIiB+IHRvIXN0cmluZyhldmVudFR5cGUpIH4gIi4iLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5USU1FRF9PVVQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBUaGUgVEFzeW5jU29ja2V0TWFuYWdlciB0byB1c2UgZm9yIG5vbi1ibG9ja2luZyBJL08uCisgIFRBc3luY1NvY2tldE1hbmFnZXIgYXN5bmNNYW5hZ2VyXzsKK30KKworcHJpdmF0ZSB7CisgIC8vIHN0ZC5zb2NrZXQgZG9lc24ndCBpbmNsdWRlIFNPX0VSUk9SIGZvciByZWFzb25zIHVua25vd24uCisgIHZlcnNpb24gKGxpbnV4KSB7CisgICAgZW51bSBTT19FUlJPUiA9IDQ7CisgIH0gZWxzZSB2ZXJzaW9uIChPU1gpIHsKKyAgICBlbnVtIFNPX0VSUk9SID0gMHgxMDA3OworICB9IGVsc2UgdmVyc2lvbiAoRnJlZUJTRCkgeworICAgIGVudW0gU09fRVJST1IgPSAweDEwMDc7CisgIH0gZWxzZSB2ZXJzaW9uIChXaW4zMikgeworICAgIGltcG9ydCBzdGQuYy53aW5kb3dzLndpbnNvY2sgOiBTT19FUlJPUjsKKyAgfSBlbHNlIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJEb24ndCBrbm93IFNPX0VSUk9SIG9uIHRoaXMgcGxhdGZvcm0uIik7CisKKyAgLy8gVGhpcyBoYWNrIGZvcmNlcyBhIGRlbGVnYXRlIGxpdGVyYWwgdG8gYmUgc2NvcGVkLCBldmVuIGlmIGl0IGlzIHBhc3NlZCB0bworICAvLyBhIGZ1bmN0aW9uIGFjY2VwdGluZyBub3JtYWwgZGVsZWdhdGVzIGFzIHdlbGwuIERNRCBsaWtlcyB0byBhbGxvY2F0ZSB0aGUKKyAgLy8gY29udGV4dCBvbiB0aGUgaGVhcCBhbnl3YXksIGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZvciBMREMuCisgIGltcG9ydCBzdGQudHJhaXRzIDogaXNEZWxlZ2F0ZTsKKyAgYXV0byBzY29wZWREZWxlZ2F0ZShEKShzY29wZSBEIGQpIGlmIChpc0RlbGVnYXRlIUQpIHsKKyAgICByZXR1cm4gZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc3NsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2MjQyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc3NsLmQKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMuc3NsOworCitpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlcjsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuZXJyOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLnNzbDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc29ja2V0OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zc2w7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNzbF9iaW87CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworCisvKioKKyAqIFByb3ZpZGVzIFNTTC9UTFMgZW5jcnlwdGlvbiBmb3IgYXN5bmMgc29ja2V0cy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCwgYXMgaXQgY29udGV4dC1zd2l0Y2hlcworICogYmV0d2VlbiBmaWJlcnMgZnJvbSB3aXRoaW4gT3BlblNTTCBjYWxscywgYW5kIHRoZSBzYWZldHkgb2YgdGhpcyBoYXMgbm90IHlldAorICogYmVlbiB2ZXJpZmllZC4KKyAqCisgKiBGb3Igb2J2aW91cyByZWFzb25zICh0aGUgU1NMIGNvbm5lY3Rpb24gaXMgc3RhdGVmdWwpLCBtb3JlIHRoYW4gb25lIGluc3RhbmNlCisgKiBzaG91bGQgbmV2ZXIgYmUgdXNlZCBvbiBhIGdpdmVuIHNvY2tldCBhdCB0aGUgc2FtZSB0aW1lLgorICovCisvLyBOb3RlOiBUaGlzIGNvdWxkIGVhc2lseSBiZSBleHRlbmRlZCB0byBvdGhlciB0cmFuc3BvcnRzIGluIHRoZSBmdXR1cmUgYXMgd2VsbC4KKy8vIFRoZXJlIGFyZSBvbmx5IHR3byBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gd2hpY2ggZG9uJ3Qgd29yayB3aXRoIGEgZ2VuZXJpYworLy8gVFRyYW5zcG9ydDogMSkgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiwgZm9yIHdoaWNoIHBlZXIgbmFtZS9hZGRyZXNzIGFyZQorLy8gbmVlZGVkIGZyb20gdGhlIHNvY2tldCwgYW5kIDIpIHRoZSBjb25uZWN0aW9uIHNodXRkb3duLCB3aGVyZSB0aGUgYXNzb2NpYXRlZAorLy8gYXN5bmMgbWFuYWdlciBpcyBuZWVkZWQgYmVjYXVzZSBjbG9zZSgpIGlzIG5vdCB1c3VhbGx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhCisvLyB3b3JrIGl0ZW0uCitmaW5hbCBjbGFzcyBUQXN5bmNTU0xTb2NrZXQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNvbnRleHQgPSBUaGUgU1NMIHNvY2tldCBjb250ZXh0IHRvIHVzZS4gQSByZWZlcmVuY2UgdG8gaXQgaXMgc3RvcmVkIHNvCisgICAqICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjbGVhbmVkIHVwIHdoaWxlIHRoZSBzb2NrZXQgaXMgdXNlZC4KKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyBhc3luYyBuZXR3b3JrIHRyYW5zcG9ydCB0byB1c2UgZm9yCisgICAqICAgICBjb21tdW5pY2F0aW9uLgorICAgKi8KKyAgdGhpcyhUQXN5bmNTb2NrZXQgdW5kZXJseWluZ1NvY2tldCwgVFNTTENvbnRleHQgY29udGV4dCkgeworICAgIHNvY2tldF8gPSB1bmRlcmx5aW5nU29ja2V0OworICAgIGNvbnRleHRfID0gY29udGV4dDsKKyAgICBzZXJ2ZXJTaWRlXyA9IGNvbnRleHQuc2VydmVyU2lkZTsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IGNvbnRleHQuYWNjZXNzTWFuYWdlcjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICBpZiAoc3NsXyBpcyBudWxsIHx8ICFzb2NrZXRfLmlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byBzaHV0ZG93biA9IFNTTF9nZXRfc2h1dGRvd24oc3NsXyk7CisgICAgYm9vbCBzaHV0ZG93blJlY2VpdmVkID0gKHNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSAhPSAwOworICAgIGJvb2wgc2h1dGRvd25TZW50ID0gKHNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pICE9IDA7CisgICAgcmV0dXJuICEoc2h1dGRvd25SZWNlaXZlZCAmJiBzaHV0ZG93blNlbnQpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm4gZmFsc2U7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGJ5dGUgYnQgPSB2b2lkOworICAgIGF1dG8gcmMgPSBTU0xfcGVlayhzc2xfLCAmYnQsIGJ0LnNpemVvZik7CisgICAgc3NsRW5mb3JjZShyYyA+PSAwLCAiU1NMX3BlZWsiKTsKKworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIChyYyA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGVuZm9yY2UoIXNlcnZlclNpZGVfLCAiQ2Fubm90IG9wZW4gYSBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0LiIpOworICAgIGlmIChpc09wZW4pIHJldHVybjsKKworICAgIGlmIChzc2xfKSB7CisgICAgICAvLyBJZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgd2FzIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGJlY2F1c2Ugb2YgYW4gZXJyb3IKKyAgICAgIC8vIChpLmUuIGNsb3NlKCkgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIHNvY2tldCBtZXRob2QpLCB3ZSBjYW4gbGFuZAorICAgICAgLy8gaGVyZSB3aXRoIHRoZSBTU0wgb2JqZWN0IHN0aWxsIGFsbG9jYXRlZDsgZGVsZXRlIGl0IGhlcmUuCisgICAgICBjbGVhbnVwU1NMKCk7CisgICAgfQorCisgICAgc29ja2V0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgeworICAgICAgLy8gU1NMIG5lZWRzIHRvIHNlbmQvcmVjZWl2ZSBkYXRhIG92ZXIgdGhlIHNvY2tldCBhcyBwYXJ0IG9mIHRoZSBzaHV0ZG93bgorICAgICAgLy8gcHJvdG9jb2wsIHNvIHdlIG11c3QgZXhlY3V0ZSB0aGUgY2FsbHMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFzc29jaWF0ZWQKKyAgICAgIC8vIGFzeW5jIG1hbmFnZXIuIE9uIHRoZSBvdGhlciBoYW5kLCBUVHJhbnNwb3J0IGNsaWVudHMgZXhwZWN0IHRoZSBzb2NrZXQKKyAgICAgIC8vIHRvIGJlIGNsb3NlZCB3aGVuIGNsb3NlKCkgcmV0dXJucywgc28gd2UgaGF2ZSB0byBibG9jayB1bnRpbCB0aGUKKyAgICAgIC8vIHNodXRkb3duIHdvcmsgaXRlbSBoYXMgYmVlbiBleGVjdXRlZC4KKyAgICAgIGltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworICAgICAgaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKKworICAgICAgaW50IHJjID0gdm9pZDsKKyAgICAgIGF1dG8gZG9uZU11dGV4ID0gbmV3IE11dGV4OworICAgICAgYXV0byBkb25lQ29uZCA9IG5ldyBDb25kaXRpb24oZG9uZU11dGV4KTsKKyAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSB7CisgICAgICAgIHNvY2tldF8uYXN5bmNNYW5hZ2VyLmV4ZWN1dGUoc29ja2V0XywgeworICAgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIGRvbmVDb25kLm5vdGlmeUFsbCgpOworICAgICAgICB9KTsKKyAgICAgICAgZG9uZUNvbmQud2FpdCgpOworICAgICAgfQorCisgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIC8vIERvIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaGVyZSBhcyBsZWF2aW5nIHRoZSB0cmFuc3BvcnQgIm9wZW4iIHdpbGwKKyAgICAgICAgLy8gcHJvYmFibHkgcHJvZHVjZSBvbmx5IG1vcmUgZXJyb3JzLCBhbmQgdGhlIGNoYW5jZSB3ZSBjYW4gZG8KKyAgICAgICAgLy8gc29tZXRoaW5nIGFib3V0IHRoZSBlcnJvciBlLmcuIGJ5IHJldHJ5aW5nIGlzIHZlcnkgbG93LgorICAgICAgICBsb2dFcnJvcigiRXJyb3Igd2hpbGUgc2h1dHRpbmcgZG93biBTU0w6ICVzIiwgZ2V0U1NMRXhjZXB0aW9uKCkpOworICAgICAgfQorCisgICAgICBjbGVhbnVwU1NMKCk7CisgICAgfQorCisgICAgc29ja2V0Xy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworICAgIGF1dG8gcmMgPSBTU0xfcmVhZChzc2xfLCBidWYucHRyLCBjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICBzc2xFbmZvcmNlKHJjID49IDAsICJTU0xfcmVhZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgLy8gTG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICAgIHNpemVfdCB3cml0dGVuID0gMDsKKyAgICB3aGlsZSAod3JpdHRlbiA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIGF1dG8gYnl0ZXMgPSBTU0xfd3JpdGUoc3NsXywgYnVmLnB0ciArIHdyaXR0ZW4sCisgICAgICAgIGNhc3QoaW50KShidWYubGVuZ3RoIC0gd3JpdHRlbikpOworICAgICAgc3NsRW5mb3JjZShieXRlcyA+IDAsICJTU0xfd3JpdGUiKTsKKyAgICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgYXV0byBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgICAgZW5mb3JjZShiaW8gIWlzIG51bGwsIG5ldyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJuZWQgbnVsbCIpKTsKKworICAgIGF1dG8gcmMgPSBCSU9fZmx1c2goYmlvKTsKKyAgICBzc2xFbmZvcmNlKHJjID09IDEsICJCSU9fZmx1c2giKTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgICovCisgIGJvb2wgc2VydmVyU2lkZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHNlcnZlclNpZGVfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgc2VydmVyU2lkZShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlcnZlclNpZGVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGFjY2VzcyBtYW5hZ2VyIHRvIHVzZS4KKyAgICovCisgIHZvaWQgYWNjZXNzTWFuYWdlcihUQWNjZXNzTWFuYWdlciB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IHZhbHVlOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLCBjbGVhbnMgdXAgdGhlIFNTTCBjb25uZWN0aW9uIGFuZCB0aHJvd3MgdGhlCisgICAqIGV4Y2VwdGlvbiBmb3IgdGhlIGxhc3QgU1NMIGVycm9yLgorICAgKi8KKyAgdm9pZCBzc2xFbmZvcmNlKGJvb2wgY29uZGl0aW9uLCBzdHJpbmcgbG9jYXRpb24pIHsKKyAgICBpZiAoIWNvbmRpdGlvbikgeworICAgICAgLy8gV2UgbmVlZCB0byBmZXRjaCB0aGUgZXJyb3IgZmlyc3QsIGFzIHRoZSBlcnJvciBzdGFjayB3aWxsIGJlIGNsZWFuZWQKKyAgICAgIC8vIHdoZW4gc2h1dHRpbmcgZG93biBTU0wuCisgICAgICBhdXRvIGUgPSBnZXRTU0xFeGNlcHRpb24obG9jYXRpb24pOworICAgICAgY2xlYW51cFNTTCgpOworICAgICAgdGhyb3cgZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRnJlZXMgdGhlIFNTTCBjb25uZWN0aW9uIG9iamVjdCBhbmQgY2xlYXJzIHRoZSBTU0wgZXJyb3Igc3RhdGUuCisgICAqLworICB2b2lkIGNsZWFudXBTU0woKSB7CisgICAgU1NMX2ZyZWUoc3NsXyk7CisgICAgc3NsXyA9IG51bGw7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorCisgIC8qKgorICAgKiBNYWtlcyBzdXJlIHRoZSBTU0wgY29ubmVjdGlvbiBpcyB1cCBhbmQgcnVubmluZywgYW5kIGluaXRpYWxpemVzIGl0IGlmIG5vdC4KKyAgICovCisgIHZvaWQgY2hlY2tIYW5kc2hha2UoKSB7CisgICAgZW5mb3JjZShzb2NrZXRfLmlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGlmIChzc2xfICFpcyBudWxsKSByZXR1cm47CisgICAgc3NsXyA9IGNvbnRleHRfLmNyZWF0ZVNTTCgpOworCisgICAgYXV0byBiaW8gPSBjcmVhdGVUVHJhbnNwb3J0QklPKHNvY2tldF8sIGZhbHNlKTsKKyAgICBTU0xfc2V0X2Jpbyhzc2xfLCBiaW8sIGJpbyk7CisKKyAgICBpbnQgcmMgPSB2b2lkOworICAgIGlmIChzZXJ2ZXJTaWRlXykgeworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgIH0gZWxzZSB7CisgICAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgIH0KKyAgICBlbmZvcmNlKHJjID4gMCwgZ2V0U1NMRXhjZXB0aW9uKCkpOworCisgICAgYXV0byBhZGRyID0gc29ja2V0Xy5nZXRQZWVyQWRkcmVzcygpOworICAgIGF1dGhvcml6ZShzc2xfLCBhY2Nlc3NNYW5hZ2VyXywgYWRkciwKKyAgICAgIChzZXJ2ZXJTaWRlXyA/IGFkZHIudG9Ib3N0TmFtZVN0cmluZygpIDogc29ja2V0Xy5ob3N0KSk7CisgIH0KKworICBUQXN5bmNTb2NrZXQgc29ja2V0XzsKKyAgYm9vbCBzZXJ2ZXJTaWRlXzsKKyAgU1NMKiBzc2xfOworICBUU1NMQ29udGV4dCBjb250ZXh0XzsKKyAgVEFjY2Vzc01hbmFnZXIgYWNjZXNzTWFuYWdlcl87Cit9CisKKy8qKgorICogV3JhcHMgcGFzc2VkIFRBc3luY1NvY2tldCBpbnN0YW5jZXMgaW50byBUQXN5bmNTU0xTb2NrZXRzLgorICoKKyAqIFR5cGljYWxseSB1c2VkIHdpdGggVEFzeW5jQ2xpZW50LiBBcyBhbiB1bmZvcnR1bmF0ZSBjb25zZXF1ZW5jZSBvZiB0aGUKKyAqIGFzeW5jIGNsaWVudCBkZXNpZ24sIHRoZSBwYXNzZWQgdHJhbnNwb3J0cyBjYW5ub3QgYmUgc3RhdGljYWxseSB2ZXJpZmllZCB0bworICogYmUgb2YgdHlwZSBUQXN5bmNTb2NrZXQuIEluc3RlYWQsIHRoZSB0eXBlIGlzIHZlcmlmaWVkIGF0IHJ1bnRpbWUg4oCTIGlmIGEKKyAqIHRyYW5zcG9ydCBvZiBhbiB1bmV4cGVjdGVkIHR5cGUgaXMgcGFzc2VkIHRvIGdldFRyYW5zcG9ydCgpLCBpdCBmYWlscywKKyAqIHRocm93aW5nIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbi4KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiBhdXRvIGNvbnRleHQgPSBud2UgVFNTTENvbnRleHQoKTsKKyAqIC4uLiAvLyBDb25maWd1cmUgU1NMIGNvbnRleHQuCisgKiBhdXRvIGZhY3RvcnkgPSBuZXcgVEFzeW5jU1NMU29ja2V0RmFjdG9yeShjb250ZXh0KTsKKyAqCisgKiBhdXRvIHNvY2tldCA9IG5ldyBUQXN5bmNTb2NrZXQoc29tZUFzeW5jTWFuYWdlciwgaG9zdCwgcG9ydCk7CisgKiBzb2NrZXQub3BlbigpOworICoKKyAqIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFTZXJ2aWNlKHRyYW5zcG9ydCwgZmFjdG9yeSwKKyAqICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCkpOworICogLS0tCisgKi8KK2NsYXNzIFRBc3luY1NTTFNvY2tldEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIC8vLworICB0aGlzKFRTU0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgIH0KKworICBvdmVycmlkZSBUQXN5bmNTU0xTb2NrZXQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgYXV0byBzb2NrZXQgPSBjYXN0KFRBc3luY1NvY2tldCl0cmFuc3BvcnQ7CisgICAgZW5mb3JjZShzb2NrZXQsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIlRBc3luY1NTTFNvY2tldEZhY3RvcnkgcmVxdWlyZXMgYSBUQXN5bmNTb2NrZXQgdG8gd29yayBvbiwgbm90IGEgIiB+CisgICAgICB0byFzdHJpbmcodHlwZWlkKHRyYW5zcG9ydCkpIH4gIi4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLklOVEVSTkFMX0VSUk9SCisgICAgKSk7CisgICAgcmV0dXJuIG5ldyBUQXN5bmNTU0xTb2NrZXQoc29ja2V0LCBjb250ZXh0Xyk7CisgIH0KKworcHJpdmF0ZToKKyAgVFNTTENvbnRleHQgY29udGV4dF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWNlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5iYXNlOworCisvKioKKyAqIENvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMuCisgKi8KK2NsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnID0gIiIsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorfQorCisvKioKKyAqIEFuIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSBvbmUgb3IgbW9yZSBzdWItdGFza3MgZmFpbGVkLgorICovCitjbGFzcyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywKKyAgICBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHRoaXMuZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnM7CisgIH0KKworICAvLy8gVGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjaGlsZHJlbiBvZiB0aGUgb3BlcmF0aW9uLiBJZiBhcHBsaWNhYmxlLAorICAvLy8gdGhlIGxpc3QgaXMgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkgdGhlIGV4Y2VwdGlvbnMgb2NjdXJyZWQuCisgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnM7Cit9CisKKy8vLyBUaGUgVGhyaWZ0IHZlcnNpb24gc3RyaW5nLCB1c2VkIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3Nlcy4KKy8vIE5vdGU6IFRoaXMgaXMgY3VycmVudGx5IGhhcmRjb2RlZCwgYnV0IHdpbGwgbGlrZWx5IGJlIGZpbGxlZCBpbiBieSB0aGUgYnVpbGQKKy8vIHN5c3RlbSBpbiBmdXR1cmUgdmVyc2lvbnMuCitlbnVtIFZFUlNJT04gPSAiMS4wLjAiOworCisvKioKKyAqIEZ1bmN0aW9ucyB1c2VkIGZvciBsb2dnaW5nIGluc2lkZSBUaHJpZnQuCisgKgorICogQnkgZGVmYXVsdCwgdGhlIGZvcm1hdHRlZCBtZXNzYWdlcyBhcmUgd3JpdHRlbiB0byBzdGRvdXQvc3RkZXJyLCBidXQgdGhpcworICogYmVoYXZpb3IgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHByb3ZpZGluZyBjdXN0b20gZ197SW5mbywgRXJyb3J9TG9nU2luaworICogaGFuZGxlcnMuCisgKgorICogRXhhbXBsZXM6CisgKiAtLS0KKyAqIGxvZ0luZm8oIkFuIGluZm9ybWF0aXZlIG1lc3NhZ2UuIik7CisgKiBsb2dFcnJvcigiU29tZSBlcnJvciBvY2N1cnJlZDogJXMiLCBlKTsKKyAqIC0tLQorICovCithbGlhcyBsb2dGb3JtYXR0ZWQhZ19pbmZvTG9nU2luayBsb2dJbmZvOworYWxpYXMgbG9nRm9ybWF0dGVkIWdfZXJyb3JMb2dTaW5rIGxvZ0Vycm9yOyAvLy8gRGl0dG8KKworLyoqCisgKiBFcnJvciBhbmQgaW5mbyBsb2cgbWVzc2FnZSBzaW5rcy4KKyAqCisgKiBUaGVzZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aXRoIHRoZSBsb2cgbWVzc2FnZSBwYXNzZWQgYXMgY29uc3QoY2hhcilbXQorICogYXJndW1lbnQsIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4gdG8gaG9vayB0aGUgVGhyaWZ0IGxpYnJhcmllcyB1cCB3aXRoIGEKKyAqIGN1c3RvbSBsb2dnaW5nIHN5c3RlbS4gQnkgZGVmYXVsdCwgdGhleSBmb3J3YXJkIGFsbCBvdXRwdXQgdG8gc3Rkb3V0L3N0ZGVyci4KKyAqLworX19nc2hhcmVkIHZvaWQgZGVsZWdhdGUoY29uc3QoY2hhcilbXSkgZ19pbmZvTG9nU2luazsKK19fZ3NoYXJlZCB2b2lkIGRlbGVnYXRlKGNvbnN0KGNoYXIpW10pIGdfZXJyb3JMb2dTaW5rOyAvLy8gRGl0dG8KKworc2hhcmVkIHN0YXRpYyB0aGlzKCkgeworICBpbXBvcnQgc3RkLnN0ZGlvOworCisgIGdfaW5mb0xvZ1NpbmsgPSAoY29uc3QoY2hhcilbXSB0ZXh0KSB7CisgICAgc3Rkb3V0LndyaXRlbG4odGV4dCk7CisgIH07CisKKyAgZ19lcnJvckxvZ1NpbmsgPSAoY29uc3QoY2hhcilbXSB0ZXh0KSB7CisgICAgc3RkZXJyLndyaXRlbG4odGV4dCk7CisgIH07Cit9CisKKy8vIFRoaXMgc2hvdWxkIGJlIHByaXZhdGUsIGlmIGl0IGNvdWxkIHN0aWxsIGJlIHVzZWQgdGhyb3VnaCB0aGUgYWxpYXNlcyB0aGVuLgordGVtcGxhdGUgbG9nRm9ybWF0dGVkKGFsaWFzIHRhcmdldCkgeworICB2b2lkIGxvZ0Zvcm1hdHRlZChzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBpbnQgbGluZSA9IF9fTElORV9fLAorICAgIFQuLi4pKHN0cmluZyBmbXQsIFQgYXJncykgaWYgKAorICAgIF9fdHJhaXRzKGNvbXBpbGVzLCB7IHRhcmdldCgiIik7IH0pCisgICkgeworICAgIGltcG9ydCBzdGQuZm9ybWF0LCBzdGQuc3RkaW87CisgICAgaWYgKHRhcmdldCAhaXMgbnVsbCkgeworICAgICAgc2NvcGUoZXhpdCkgZ19mb3JtYXRCdWZmZXIuY2xlYXIoKTsKKworICAgICAgLy8gUGhvYm9zIEBAQlVHQEA6IElmIHRoZSBlbXB0eSBzdHJpbmcgcHV0KCkgaXMgcmVtb3ZlZCwgQXBwZW5kZXIuZGF0YQorICAgICAgLy8gc3RheXMgZW1wdHkuCisgICAgICBnX2Zvcm1hdEJ1ZmZlci5wdXQoIiIpOworCisgICAgICBmb3JtYXR0ZWRXcml0ZShnX2Zvcm1hdEJ1ZmZlciwgIiVzOiVzOiAiLCBmaWxlLCBsaW5lKTsKKworICAgICAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7CisgICAgICAgIGdfZm9ybWF0QnVmZmVyLnB1dChmbXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0dGVkV3JpdGUoZ19mb3JtYXRCdWZmZXIsIGZtdCwgYXJncyk7CisgICAgICB9CisgICAgICB0YXJnZXQoZ19mb3JtYXRCdWZmZXIuZGF0YSk7CisgICAgfQorICB9Cit9CisKK3ByaXZhdGUgeworICAvLyBVc2UgYSBnbG9iYWwsIGJ1dCB0aHJlYWQtbG9jYWwgYnVmZmVyIGZvciBjb25zdHJ1Y3RpbmcgbG9nIG1lc3NhZ2VzLgorICBpbXBvcnQgc3RkLmFycmF5IDogQXBwZW5kZXI7CisgIEFwcGVuZGVyIShjaGFyW10pIGdfZm9ybWF0QnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTZkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50LmQKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CisKK2ltcG9ydCBzdGQuY29udiA6IHRleHQsIHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3MsIFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlLAorICBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5mdXR1cmU7CisKKy8qKgorICogQXN5bmNocm9ub3VzIFRocmlmdCBzZXJ2aWNlIGNsaWVudCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIFRGdXR1cmVzIGFuCisgKiB1c2VzIGEgVEFzeW5jTWFuYWdlciB0byBwZXJmb3JtIHRoZSBhY3R1YWwgd29yay4KKyAqCisgKiBUQXN5bmNDbGllbnRCYXNlIHNlcnZlcyBhcyBhIHN1cGVydHlwZSBmb3IgYWxsIFRBc3luY0NsaWVudHMgZm9yIHRoZSBzYW1lCisgKiBzZXJ2aWNlLCB3aGljaCBtaWdodCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgY29uY3JldGUgcHJvdG9jb2wgdHlwZXMKKyAqICh0aGVyZSBpcyBubyBjb3ZhcmlhbmNlIGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlcnMpLCBhbmQgZXh0ZW5kcworICogVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UuIElmIEludGVyZmFjZSBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBzZXJ2aWNlCisgKiBCYXNlSW50ZXJmYWNlLCBpdCBhbHNvIGV4dGVuZHMgVEFzeW5jQ2xpZW50QmFzZSFCYXNlSW50ZXJmYWNlLgorICoKKyAqIFRBc3luY0NsaWVudCBpbXBsZW1lbnRzIFRBc3luY0NsaWVudEJhc2UgYW5kIG9mZmVycyB0d28gY29uc3RydWN0b3JzIHdpdGgKKyAqIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlczoKKyAqIC0tLQorICogdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IHRmLCBUUHJvdG9jb2xGYWN0b3J5IHBmKTsKKyAqIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSBpdGYsIFRUcmFuc3BvcnRGYWN0b3J5IG90ZiwKKyAqICAgVFByb3RvY29sRmFjdG9yeSBpcGYsIFRQcm90b2NvbEZhY3Rvcnkgb3BmKTsKKyAqIC0tLQorICoKKyAqIEFnYWluLCBpZiBJbnRlcmZhY2UgcmVwcmVzZW50cyBhIGRlcml2ZWQgVGhyaWZ0IHNlcnZpY2UsCisgKiBUQXN5bmNDbGllbnQhSW50ZXJmYWNlIGlzIGFsc28gZGVyaXZlZCBmcm9tIFRBc3luY0NsaWVudCFCYXNlSW50ZXJmYWNlLgorICoKKyAqIFRBc3luY0NsaWVudCBjYW4gZXhjbHVzaXZlbHkgYmUgdXNlZCB3aXRoIFRBc3luY1RyYW5zcG9ydHMsIGFzIGl0IG5lZWRzIHRvCisgKiBhY2Nlc3MgdGhlIGFzc29jaWF0ZWQgVEFzeW5jTWFuYWdlci4gVG8gc2V0IHVwIGFueSB3cmFwcGVyIHRyYW5zcG9ydHMKKyAqIChlLmcuIGJ1ZmZlcmVkLCBmcmFtZWQpIG9uIHRvcCBvZiBpdCBhbmQgdG8gaW5zdGFuY2lhdGUgdGhlIHByb3RvY29scyB0byB1c2UsCisgKiBUVHJhbnNwb3J0RmFjdG9yeSBhbmQgVFByb3RvY29sRmFjdG9yeSBpbnN0YW5jZXMgYXJlIHBhc3NlZCB0byB0aGUKKyAqIGNvbnN0cnVjdG9ycyDigJMgdGhlIHRocmVlIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGlzIGEgc2hvcnRjdXQgaWYgdGhlIHNhbWUKKyAqIHRyYW5zcG9ydCBhbmQgcHJvdG9jb2wgYXJlIHRvIGJlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCwgd2hpY2ggaXMKKyAqIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgorICoKKyAqIElmIHRoZSBzYW1lIHRyYW5zcG9ydCBmYWN0b3J5IGlzIHBhc3NlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMsCisgKiBvbmx5IGEgc2luZ2xlIHdyYXBwZXIgdHJhbnNwb3J0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdXNlZCBmb3IgYm90aCBkaXJlY3Rpb25zLgorICogVGhpcyBhbGxvd3MgZWFzeSBpbXBsZW1lbnRhdGlvbiBvZiBwcm90b2NvbHMgbGlrZSBTU0wuCisgKgorICogSnVzdCBhcyBUQ2xpZW50IGRvZXMsIFRBc3luY0NsaWVudCBhbHNvIHRha2VzIHR3byBvcHRpb25hbCB0ZW1wbGF0ZQorICogYXJndW1lbnRzIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBhY3R1YWwgVFByb3RvY29sCisgKiBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMsIGFzIHZpcnR1YWwgY2FsbHMgY2FuCisgKiBjb21wbGV0ZWx5IGJlIGVsaW1pbmF0ZWQgdGhlbi4gSWYgdGhlIGFjdHVhbCB0eXBlcyBvZiB0aGUgcHJvdG9jb2xzCisgKiBpbnN0YW50aWF0ZWQgYnkgdGhlIGZhY3RvcmllcyB1c2VkIGRvZXMgbm90IG1hdGNoIHRoZSBvbmVzIHN0YXRpY2FsbHkKKyAqIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycywgYSBURXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcKKyAqIGNvbnN0cnVjdGlvbi4KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiAvLyBBIHNpbXBsZSBUaHJpZnQgc2VydmljZS4KKyAqIGludGVyZmFjZSBGb28geyBpbnQgZm9vKCk7IH0KKyAqCisgKiAvLyBDcmVhdGUgYSBUQXN5bmNTb2NrZXRNYW5hZ2VyIOKAkyB0aHJpZnQuYXN5bmMubGliZXZlbnQgaXMgdXNlZCBmb3IgdGhpcworICogLy8gZXhhbXBsZS4KKyAqIGF1dG8gbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgKgorICogLy8gU2V0IHVwIGFuIGFzeW5jIHRyYW5zcG9ydCB0byB1c2UuCisgKiBhdXRvIHNvY2tldCA9IG5ldyBUQXN5bmNTb2NrZXQobWFuYWdlciwgaG9zdCwgcG9ydCk7CisgKgorICogLy8gQ3JlYXRlIGEgY2xpZW50IGluc3RhbmNlLgorICogYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IUZvbygKKyAqICAgc29ja2V0LAorICogICBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwgLy8gV3JhcCB0aGUgc29ja2V0IGluIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgorICogICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKSAvLyBVc2UgdGhlIEJpbmFyeSBwcm90b2NvbC4KKyAqICk7CisgKgorICogLy8gQ2FsbCBmb28gYW5kIHVzZSB0aGUgcmV0dXJuZWQgZnV0dXJlLgorICogYXV0byByZXN1bHQgPSBjbGllbnQuZm9vKCk7CisgKiBwcmFnbWEobXNnLCB0eXBlb2YocmVzdWx0KSk7IC8vIFRGdXR1cmUhaW50CisgKiBpbnQgcmVzdWx0VmFsdWUgPSByZXN1bHQud2FpdEdldCgpOyAvLyBXYWl0cyB1bnRpbCB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZS4KKyAqIC0tLQorICovCitpbnRlcmZhY2UgVEFzeW5jQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Jhc2VTZXJ2aWNlIUludGVyZmFjZSkgOgorICBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZQoreworICAvKioKKyAgICogVGhlIHVuZGVybHlpbmcgVEFzeW5jVHJhbnNwb3J0IHVzZWQgYnkgdGhpcyBjbGllbnQgaW5zdGFuY2UuCisgICAqLworICBUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5OworfQorCisvLy8gRGl0dG8KK2ludGVyZmFjZSBUQXN5bmNDbGllbnRCYXNlKEludGVyZmFjZSkgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0NsaWVudEJhc2UhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSksIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlCit7fQorCisvLy8gRGl0dG8KK3RlbXBsYXRlIFRBc3luY0NsaWVudChJbnRlcmZhY2UsIElucHV0UHJvdG9jb2wgPSBUUHJvdG9jb2wsIE91dHB1dFByb3RvY29sID0gdm9pZCkgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGlzVFByb3RvY29sIUlucHV0UHJvdG9jb2wgJiYKKyAgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sIHx8IGlzKE91dHB1dFByb3RvY29sID09IHZvaWQpKQorKSB7CisgIG1peGluKHsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQXN5bmNDbGllbnQgOiAiIH4KKyAgICAgICAgIlRBc3luY0NsaWVudCEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlLCBJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCksICIgfgorICAgICAgICAiVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2Uge1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IHRmLCBUUHJvdG9jb2xGYWN0b3J5IHBmKSB7CisgICAgICAgICAgdGhpcyh0cmFucywgdGYsIHRmLCBwZiwgcGYpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IGl0ZiwKKyAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdGYsIFRQcm90b2NvbEZhY3RvcnkgaXBmLCBUUHJvdG9jb2xGYWN0b3J5IG9wZgorICAgICAgICApIHsKKyAgICAgICAgICBzdXBlcih0cmFucywgaXRmLCBvdGYsIGlwZiwgb3BmKTsKKyAgICAgICAgICBjbGllbnRfID0gbmV3IHR5cGVvZihjbGllbnRfKShpcHJvdF8sIG9wcm90Xyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9Qcm90KSBjbGllbnRfOworICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVEFzeW5jQ2xpZW50IDogVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2UgeyI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGFsaWFzIElucHV0UHJvdG9jb2wgSVByb3Q7CisgICAgICAgIHN0YXRpYyBpZiAoaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wpIHsKKyAgICAgICAgICBhbGlhcyBPdXRwdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0aWMgYXNzZXJ0KGlzKE91dHB1dFByb3RvY29sID09IHZvaWQpKTsKKyAgICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIE9Qcm90OworICAgICAgICB9CisKKyAgICAgICAgdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IHRmLCBUUHJvdG9jb2xGYWN0b3J5IHBmKSB7CisgICAgICAgICAgdGhpcyh0cmFucywgdGYsIHRmLCBwZiwgcGYpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IGl0ZiwKKyAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdGYsIFRQcm90b2NvbEZhY3RvcnkgaXBmLCBUUHJvdG9jb2xGYWN0b3J5IG9wZgorICAgICAgICApIHsKKyAgICAgICAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICAgICAgICB0cmFuc3BvcnRfID0gdHJhbnM7CisKKyAgICAgICAgICBhdXRvIGlwID0gaXRmLmdldFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgVFRyYW5zcG9ydCBvcCA9IHZvaWQ7CisgICAgICAgICAgaWYgKGl0ZiA9PSBvdGYpIHsKKyAgICAgICAgICAgIG9wID0gaXA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wID0gb3RmLmdldFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXV0byBpcHJvdCA9IGlwZi5nZXRQcm90b2NvbChpcCk7CisgICAgICAgICAgaXByb3RfID0gY2FzdChJUHJvdClpcHJvdDsKKyAgICAgICAgICBlbmZvcmNlKGlwcm90XywgbmV3IFRFeGNlcHRpb24odGV4dCgiSW5wdXQgcHJvdG9jb2wgbm90IG9mIHRoZSAiIH4KKyAgICAgICAgICAgICJzcGVjaWZpZWQgY29uY3JldGUgdHlwZSAoIiwgSVByb3Quc3RyaW5nb2YsICIpLiIpKSk7CisKKyAgICAgICAgICBhdXRvIG9wcm90ID0gb3BmLmdldFByb3RvY29sKG9wKTsKKyAgICAgICAgICBvcHJvdF8gPSBjYXN0KE9Qcm90KW9wcm90OworICAgICAgICAgIGVuZm9yY2Uob3Byb3RfLCBuZXcgVEV4Y2VwdGlvbih0ZXh0KCJPdXRwdXQgcHJvdG9jb2wgbm90IG9mIHRoZSAiIH4KKyAgICAgICAgICAgICJzcGVjaWZpZWQgY29uY3JldGUgdHlwZSAoIiwgT1Byb3Quc3RyaW5nb2YsICIpLiIpKSk7CisKKyAgICAgICAgICBjbGllbnRfID0gbmV3IHR5cGVvZihjbGllbnRfKShpcHJvdF8sIG9wcm90Xyk7CisgICAgICAgIH0KKworICAgICAgICBvdmVycmlkZSBUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKyAgICAgICAgcHJvdGVjdGVkIElQcm90IGlwcm90XzsKKyAgICAgICAgcHJvdGVjdGVkIE9Qcm90IG9wcm90XzsKKyAgICAgICAgcHJpdmF0ZSBUQ2xpZW50IShJbnRlcmZhY2UsIElQcm90LCBPUHJvdCkgY2xpZW50XzsKKyAgICAgIH07CisgICAgfQorCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsKKyAgICAgIEZpbHRlck1ldGhvZE5hbWVzIShJbnRlcmZhY2UsIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBJbnRlcmZhY2UpKQorICAgICkgeworICAgICAgc3RyaW5nW10gcGFyYW1MaXN0OworICAgICAgc3RyaW5nW10gcGFyYW1OYW1lczsKKyAgICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAgIGltbXV0YWJsZSBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgaW1tdXRhYmxlIHN0b3JhZ2UgPSBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3NUdXBsZSEoCisgICAgICAgICAgbWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpW2ldOworCisgICAgICAgIHBhcmFtTGlzdCB+PSAoKHN0b3JhZ2UgJiBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3MucmVmXykgPyAicmVmICIgOiAiIikgfgorICAgICAgICAgICJQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpWyIgfgorICAgICAgICAgIHRvIXN0cmluZyhpKSB+ICJdICIgfiBwYXJhbU5hbWU7CisgICAgICAgIHBhcmFtTmFtZXMgfj0gcGFyYW1OYW1lOworICAgICAgfQorICAgICAgcGFyYW1MaXN0IH49ICJUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwiOworCisgICAgICBpbW11dGFibGUgcmV0dXJuVHlwZUNvZGUgPSAiUmV0dXJuVHlwZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIikiOworICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoIiB+IHJldHVyblR5cGVDb2RlIH4gIikgIiB+IG1ldGhvZE5hbWUgfiAiKCIgfgorICAgICAgICBjdGZlSm9pbihwYXJhbUxpc3QpIH4gIikge1xuIjsKKworICAgICAgLy8gQ3JlYXRlIHRoZSBmdXR1cmUgaW5zdGFuY2UgdGhhdCB3aWxsIHJlcGVzZW50IHRoZSByZXN1bHQuCisgICAgICBjb2RlIH49ICJhdXRvIHByb21pc2UgPSBuZXcgVFByb21pc2UhKCIgfiByZXR1cm5UeXBlQ29kZSB+ICIpO1xuIjsKKworICAgICAgLy8gUHJlcGFyZSBkZWxlZ2F0ZSB3aGljaCBleGVjdXRlcyB0aGUgVENsaWVudCBtZXRob2QgY2FsbC4KKyAgICAgIGNvZGUgfj0gImF1dG8gd29yayA9IHtcbiI7CisgICAgICBjb2RlIH49ICJ0cnkge1xuIjsKKyAgICAgIGNvZGUgfj0gInN0YXRpYyBpZiAoaXMoUmV0dXJuVHlwZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIikgPT0gdm9pZCkpIHtcbiI7CisgICAgICBjb2RlIH49ICJjbGllbnRfLiIgfiBtZXRob2ROYW1lIH4gIigiIH4gY3RmZUpvaW4ocGFyYW1OYW1lcykgfiAiKTtcbiI7CisgICAgICBjb2RlIH49ICJwcm9taXNlLnN1Y2NlZWQoKTtcbiI7CisgICAgICBjb2RlIH49ICJ9IGVsc2Uge1xuIjsKKyAgICAgIGNvZGUgfj0gImF1dG8gcmVzdWx0ID0gY2xpZW50Xy4iIH4gbWV0aG9kTmFtZSB+ICIoIiB+CisgICAgICAgIGN0ZmVKb2luKHBhcmFtTmFtZXMpIH4gIik7XG4iOworICAgICAgY29kZSB+PSAicHJvbWlzZS5zdWNjZWVkKHJlc3VsdCk7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIGNvZGUgfj0gIn0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4iOworICAgICAgY29kZSB+PSAicHJvbWlzZS5mYWlsKGUpO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ9O1xuIjsKKworICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgY2FuY2VsbGVkLCBzZXQgdGhlIHJlc3VsdCBwcm9taXNlIHRvIGNhbmNlbGxlZAorICAgICAgLy8gYXMgd2VsbC4gVGhpcyBjb3VsZCBiZSBtb3ZlZCBpbnRvIGFuIGFkZGl0aW9uYWwgVEFzeW5jV29ya0l0ZW0KKyAgICAgIC8vIGRlbGVnYXRlIHBhcmFtZXRlci4KKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgaWYgKGNhbmNlbGxhdGlvbikgeworICAgICAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nLmFkZENhbGxiYWNrKHsKKyAgICAgICAgICAgIHByb21pc2UuY2FuY2VsKCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIC8vIEVucXVldWUgdGhlIHdvcmsgaXRlbSBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBwcm9taXNlIChyZXNwLiBpdHMKKyAgICAgIC8vIGZ1dHVyZSBpbnRlcmZhY2UpLgorICAgICAgY29kZSB+PSAidHJhbnNwb3J0Xy5hc3luY01hbmFnZXIuZXhlY3V0ZSh0cmFuc3BvcnRfLCB3b3JrLCBjYW5jZWxsYXRpb24pO1xuIjsKKyAgICAgIGNvZGUgfj0gInJldHVybiBwcm9taXNlO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICB9CisKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudF9wb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50X3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNiOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudF9wb29sLmQKQEAgLTAsMCArMSw5MDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBVdGlsaXRpZXMgZm9yIGFzeW5jaHJvbm91c2x5IHF1ZXJ5aW5nIG11bHRpcGxlIHNlcnZlcnMsIGJ1aWxkaW5nIG9uCisgKiBUQXN5bmNDbGllbnQuCisgKgorICogVGVybWlub2xvZ3kgbm90ZTogVGhlIG5hbWVzIG9mIHRoZSBhcnRpZmFjdHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBhcmUKKyAqICAgZGVyaXZlZCBmcm9tIMK7Y2xpZW50IHBvb2zCqywgYmVjYXVzZSB0aGV5IG9wZXJhdGUgb24gYSBwb29sIG9mCisgKiAgIFRBc3luY0NsaWVudHMuIEhvd2V2ZXIsIGZyb20gYSBhcmNoaXRlY3R1cmFsIHBvaW50IG9mIHZpZXcsIHRoZXkgb2Z0ZW4KKyAqICAgcmVwcmVzZW50IGEgcG9vbCBvZiBob3N0cyBhIFRocmlmdCBjbGllbnQgYXBwbGljYXRpb24gY29tbXVuaWNhdGVzIHdpdGgKKyAqICAgdXNpbmcgUlBDIGNhbGxzLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50X3Bvb2w7CisKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWFwOworaW1wb3J0IHN0ZC5hcnJheSA6IGFycmF5LCBlbXB0eTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG07CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5mdXR1cmU7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnJlc291cmNlX3Bvb2w7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGdlbmVyaWMgY2xpZW50IHBvb2wgd2hpY2ggaW1wbGVtZW50cyBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZQorICogdXNpbmcgbXVsdGlwbGUgVEFzeW5jQ2xpZW50cy4KKyAqLworaW50ZXJmYWNlIFRBc3luY0NsaWVudFBvb2xCYXNlKEludGVyZmFjZSkgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKK3sKKyAgLy8vIFNob3J0aGFuZCBmb3IgdGhlIGNsaWVudCB0eXBlIHRoaXMgcG9vbCBvcGVyYXRlcyBvbi4KKyAgYWxpYXMgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8qKgorICAgKiBBZGRzIGEgY2xpZW50IHRvIHRoZSBwb29sLgorICAgKi8KKyAgdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBjbGllbnQgZnJvbSB0aGUgcG9vbC4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgY2xpZW50IHdhcyBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICovCisgIGJvb2wgcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpOworCisgIC8qKgorICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGNvbWVzIGZyb20gYSBjbGllbnQgZnJvbSB0aGUKKyAgICogcG9vbCBub3Qgd29ya2luZyBwcm9wZXJseSwgb3IgaWYgaXQgYW4gZXhjZXB0aW9uIHRocm93biBhdCB0aGUKKyAgICogYXBwbGljYXRpb24gbGV2ZWwuCisgICAqCisgICAqIElmIHRoZSBkZWxlZ2F0ZSByZXR1cm5zIHRydWUsIHRoZSBzZXJ2ZXIvY29ubmVjdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlCisgICAqIGF0IGZhdWx0LCBpZiBpdCByZXR1cm5zIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIGp1c3QgcGFzc2VkIG9uIHRvIHRoZQorICAgKiBjYWxsZXIuCisgICAqCisgICAqIEJ5IGRlZmF1bHQsIHJldHVybnMgdHJ1ZSBmb3IgaW5zdGFuY2VzIG9mIFRUcmFuc3BvcnRFeGNlcHRpb24gYW5kCisgICAqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyKCkgY29uc3QgQHByb3BlcnR5OworICB2b2lkIHJwY0ZhdWx0RmlsdGVyKGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSkgQHByb3BlcnR5OyAvLy8gRGl0dG8KKworICAvKioKKyAgICogV2hldGhlciB0byBvcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydHMgb2YgYSBjbGllbnQgYmVmb3JlIHRyeWluZyB0bworICAgKiBleGVjdXRlIGEgbWV0aG9kIGlmIHRoZXkgYXJlIG5vdCBvcGVuLiBUaGlzIGlzIHVzdWFsbHkgZGVzaXJhYmxlCisgICAqIGJlY2F1c2UgaXQgYWxsb3dzIGUuZy4gdG8gYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gYSByZW1vdGUgc2VydmVyCisgICAqIGlmIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgcmVvcGVuVHJhbnNwb3J0cygpIGNvbnN0IEBwcm9wZXJ0eTsKKyAgdm9pZCByZW9wZW5UcmFuc3BvcnRzKGJvb2wpIEBwcm9wZXJ0eTsgLy8vIERpdHRvCit9CisKK2ltbXV0YWJsZSBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgZGVmYXVsdFJwY0ZhdWx0RmlsdGVyOworc3RhdGljIHRoaXMoKSB7CisgIGRlZmF1bHRScGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKyAgICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworICAgIHJldHVybiAoCisgICAgICAoY2FzdChUVHJhbnNwb3J0RXhjZXB0aW9uKWUgIWlzIG51bGwpIHx8CisgICAgICAoY2FzdChUQXBwbGljYXRpb25FeGNlcHRpb24pZSAhaXMgbnVsbCkKKyAgICApOworICB9OworfQorCisvKioKKyAqIEEgVEFzeW5jQ2xpZW50UG9vbEJhc2UgaW1wbGVtZW50YXRpb24gd2hpY2ggcXVlcmllcyBtdWx0aXBsZSBzZXJ2ZXJzIGluIGEKKyAqIHJvdyB1bnRpbCBhIHJlcXVlc3Qgc3VjY2VlZHMsIHRoZSByZXN1bHQgb2Ygd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiDCu3N1Y2Nlc3PCqyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgcnBjRmF1bHRGaWx0ZXIoKQorICogZGVsZWdhdGUgcHJvcGVydHkuIElmIGl0IGlzIG5vbi1udWxsIGFuZCBjYWxsaW5nIGl0IGZvciBhbiBleGNlcHRpb24gc2V0IGJ5CisgKiBhIGZhaWxlZCBtZXRob2QgaW52b2NhdGlvbiByZXR1cm5zIHRydWUsIHRoZSBlcnJvciBpcyBjb25zaWRlcmVkIHRvIGJlCisgKiBjYXVzZWQgYnkgdGhlIFJQQyBsYXllciByYXRoZXIgdGhhbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIsIGFuZCB0aGUgbmV4dAorICogc2VydmVyIGluIHRoZSBwb29sIGlzIHRyaWVkLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBjbGllbnRzIHRvIHRyeSwgdGhlCisgKiBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGZhaWxlZCB3aXRoIGEgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uLgorICoKKyAqIElmIGEgVEFzeW5jQ2xpZW50IGluIHRoZSBwb29sIGZhaWxzIHdpdGggYW4gUlBDIGV4Y2VwdGlvbiBmb3IgYSBudW1iZXIgb2YKKyAqIGNvbnNlY3V0aXZlIHRyaWVzLCBpdCBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCAobm90IHRyaWVkIGFueSBsb25nZXIpIGZvcgorICogYSBjZXJ0YWluIGR1cmF0aW9uLiBCb3RoIHRoZSBsaW1pdCBhbmQgdGhlIHRpbWVvdXQgY2FuIGJlIGNvbmZpZ3VyZWQuIElmIGFsbAorICogY2xpZW50cyBmYWlsIChhbmQga2VlcFRyeWluZyBpcyBmYWxzZSksIHRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhCisgKiBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24gd2hpY2ggY29udGFpbnMgdGhlIGNvbGxlY3RlZCBSUEMgZXhjZXB0aW9ucy4KKyAqLworZmluYWwgY2xhc3MgVEFzeW5jQ2xpZW50UG9vbChJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0NsaWVudFBvb2xCYXNlIUludGVyZmFjZQoreworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgcG9vbF8gPSBuZXcgVFJlc291cmNlUG9vbCFDbGllbnQoY2xpZW50cyk7CisgICAgcnBjRmF1bHRGaWx0ZXJfID0gZGVmYXVsdFJwY0ZhdWx0RmlsdGVyOworICAgIHJlb3BlblRyYW5zcG9ydHNfID0gdHJ1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIGFkZENsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgcG9vbF8uYWRkKGNsaWVudCk7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCByZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIHJldHVybiBwb29sXy5yZW1vdmUoY2xpZW50KTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGtlZXAgdHJ5aW5nIHRvIGZpbmQgYSB3b3JraW5nIGNsaWVudCBpZiBhbGwgaGF2ZSBmYWlsZWQgaW4gYQorICAgKiByb3cuCisgICAqCisgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgKi8KKyAgYm9vbCBrZWVwVHJ5aW5nKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uY3ljbGU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBrZWVwVHJ5aW5nKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uY3ljbGUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBhIHJhbmRvbSBwZXJtdXRhdGlvbiBvZiB0aGUgY2xpZW50IHBvb2wgb24gZXZlcnkgY2FsbCB0bworICAgKiBleGVjdXRlKCkuIFRoaXMgY2FuIGJlIHVzZWQgZS5nLiBhcyBhIHNpbXBsZSBmb3JtIG9mIGxvYWQgYmFsYW5jaW5nLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgKi8KKyAgYm9vbCBwZXJtdXRlQ2xpZW50cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLnBlcm11dGU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBwZXJtdXRlQ2xpZW50cyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLnBlcm11dGUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhdWx0cyBhZnRlciB3aGljaCBhIGNsaWVudCBpcyBkaXNhYmxlZCB1bnRpbAorICAgKiBmYXVsdERpc2FibGVEdXJhdGlvbiBoYXMgcGFzc2VkLiAwIHRvIG5ldmVyIGRpc2FibGUgY2xpZW50cy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gMC4KKyAgICovCisgIHVzaG9ydCBmYXVsdERpc2FibGVDb3VudCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmZhdWx0RGlzYWJsZUNvdW50OworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgZmF1bHREaXNhYmxlQ291bnQodXNob3J0IHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmZhdWx0RGlzYWJsZUNvdW50ID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGR1cmF0aW9uIGZvciB3aGljaCBhIGNsaWVudCBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhZnRlciBpdCBoYXMKKyAgICogZmFpbGVkIHRvbyBvZnRlbi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gb25lIHNlY29uZC4KKyAgICovCisgIER1cmF0aW9uIGZhdWx0RGlzYWJsZUR1cmF0aW9uKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uZmF1bHREaXNhYmxlRHVyYXRpb247CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBmYXVsdERpc2FibGVEdXJhdGlvbihEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5mYXVsdERpc2FibGVEdXJhdGlvbiA9IHZhbHVlOworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcigpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJwY0ZhdWx0RmlsdGVyXzsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIHJwY0ZhdWx0RmlsdGVyKGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBycGNGYXVsdEZpbHRlcl8gPSB2YWx1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIHJlb3BlblRyYW5zcG9ydHMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiByZW9wZW5UcmFuc3BvcnRzXzsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIHJlb3BlblRyYW5zcG9ydHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHZhbHVlOworICB9CisKKyAgbWl4aW4oZmFsbGJhY2tQb29sRm9yd2FyZENvZGUhSW50ZXJmYWNlKCkpOworCitwcm90ZWN0ZWQ6CisgIC8vIFRoZSBhY3R1YWwgd29ya2VyIGltcGxlbWVudGF0aW9uIHRvIHdoaWNoIFJQQyBtZXRob2QgY2FsbHMgYXJlIGZvcndhcmRlZC4KKyAgYXV0byBleGVjdXRlT25Qb29sKHN0cmluZyBtZXRob2QsIEFyZ3MuLi4pKEFyZ3MgYXJncywKKyAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbgorICApIHsKKyAgICBhdXRvIGNsaWVudHMgPSBwb29sX1tdOworICAgIGlmIChjbGllbnRzLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm8gY2xpZW50cyBhdmFpbGFibGUgdG8gdHJ5LiIpOworICAgIH0KKworICAgIGF1dG8gcHJvbWlzZSA9IG5ldyBUUHJvbWlzZSEoUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoSW50ZXJmYWNlLCBtZXRob2QpKSk7CisgICAgRXhjZXB0aW9uW10gcnBjRXhjZXB0aW9uczsKKworICAgIHZvaWQgdHJ5TmV4dCgpIHsKKyAgICAgIHdoaWxlIChjbGllbnRzLmVtcHR5KSB7CisgICAgICAgIENsaWVudCBuZXh0OworICAgICAgICBEdXJhdGlvbiB3YWl0VGltZTsKKyAgICAgICAgaWYgKGNsaWVudHMud2lsbEJlY29tZU5vbmVtcHR5KG5leHQsIHdhaXRUaW1lKSkgeworICAgICAgICAgIGlmICh3YWl0VGltZSA+IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgaWYgKHdhaXRUaW1lIDwgZHVyISJ1c2VjcyIoMTApKSB7CisgICAgICAgICAgICAgIGltcG9ydCBjb3JlLnRocmVhZDsKKyAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5leHQudHJhbnNwb3J0LmFzeW5jTWFuYWdlci5kZWxheSh3YWl0VGltZSwgeyB0cnlOZXh0KCk7IH0pOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb21pc2UuZmFpbChuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKCJBbGwgY2xpZW50cyBmYWlsZWQuIiwKKyAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnMpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXV0byBjbGllbnQgPSBjbGllbnRzLmZyb250OworICAgICAgY2xpZW50cy5wb3BGcm9udDsKKworICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgaWYgKCFjbGllbnQudHJhbnNwb3J0LmlzT3BlbikgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcG9vbF8ucmVjb3JkRmF1bHQoY2xpZW50KTsKKyAgICAgICAgICAgIHRyeU5leHQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXV0byBmdXR1cmUgPSBtaXhpbigiY2xpZW50LiIgfiBtZXRob2QpKGFyZ3MsIGNhbmNlbGxhdGlvbik7CisgICAgICBmdXR1cmUuY29tcGxldGlvbi5hZGRDYWxsYmFjayh7CisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgcHJvbWlzZS5jYW5jZWwoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGUgPSBmdXR1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChlKSB7CisgICAgICAgICAgaWYgKHJwY0ZhdWx0RmlsdGVyXyAmJiBycGNGYXVsdEZpbHRlcl8oZSkpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZEZhdWx0KGNsaWVudCk7CisgICAgICAgICAgICBycGNFeGNlcHRpb25zIH49IGU7CisgICAgICAgICAgICB0cnlOZXh0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBvb2xfLnJlY29yZFN1Y2Nlc3MoY2xpZW50KTsKKyAgICAgICAgcHJvbWlzZS5jb21wbGV0ZShmdXR1cmUpOworICAgICAgfSk7CisgICAgfQorCisgICAgdHJ5TmV4dCgpOworICAgIHJldHVybiBwcm9taXNlOworICB9CisKK3ByaXZhdGU6CisgIFRSZXNvdXJjZVBvb2whQ2xpZW50IHBvb2xfOworICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXJfOworICBib29sIHJlb3BlblRyYW5zcG9ydHNfOworfQorCisvKioKKyAqIFRBc3luY0NsaWVudFBvb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgaW50ZXJmYWNlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZAorICogdXNpbmcgSUZUSSAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWVzdCA2MDgyKSkuCisgKi8KK1RBc3luY0NsaWVudFBvb2whSW50ZXJmYWNlIHRBc3luY0NsaWVudFBvb2woSW50ZXJmYWNlKSgKKyAgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2VbXSBjbGllbnRzCispIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoY2xpZW50cyk7Cit9CisKK3ByaXZhdGUgeworICAvLyBDYW5ub3QgdXNlIGFuIGFub255bW91cyBkZWxlZ2F0ZSBsaXRlcmFsIGZvciB0aGlzIGJlY2F1c2UgdGhleSBhcmVuJ3QKKyAgLy8gYWxsb3dlZCBpbiBjbGFzcyBzY29wZS4KKyAgc3RyaW5nIGZhbGxiYWNrUG9vbEZvcndhcmRDb2RlKEludGVyZmFjZSkoKSB7CisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEFsbE1lbWJlck1ldGhvZE5hbWVzIUludGVyZmFjZSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBjb2RlIH49ICJURnV0dXJlIShSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSkgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIikgYXJncywgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7XG4iOworICAgICAgY29kZSB+PSAicmV0dXJuIGV4ZWN1dGVPblBvb2whKGAiIH4gbWV0aG9kTmFtZSB+ICJgKShhcmdzLCBjYW5jZWxsYXRpb24pO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0KK30KKworLyoqCisgKiBBIFRBc3luY0NsaWVudFBvb2xCYXNlIGltcGxlbWVudGF0aW9uIHdoaWNoIHF1ZXJpZXMgbXVsdGlwbGUgc2VydmVycyBhdAorICogdGhlIHNhbWUgdGltZSBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgc3VjY2VzcyByZXNwb25zZS4KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiDCu3N1Y2Nlc3PCqyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgcnBjRmF1bHRGaWx0ZXIoKQorICogZGVsZWdhdGUgcHJvcGVydHkuIElmIGl0IGlzIG5vbi1udWxsIGFuZCBjYWxsaW5nIGl0IGZvciBhbiBleGNlcHRpb24gc2V0IGJ5CisgKiBhIGZhaWxlZCBtZXRob2QgaW52b2NhdGlvbiByZXR1cm5zIHRydWUsIHRoZSBlcnJvciBpcyBjb25zaWRlcmVkIHRvIGJlCisgKiBjYXVzZWQgYnkgdGhlIFJQQyBsYXllciByYXRoZXIgdGhhbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIsIGFuZCB0aGUgbmV4dAorICogc2VydmVyIGluIHRoZSBwb29sIGlzIHRyaWVkLiBJZiBhbGwgY2xpZW50cyBmYWlsLCB0aGUgb3BlcmF0aW9uIGlzIG1hcmtlZAorICogYXMgZmFpbGVkIHdpdGggYSBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIFRBc3luY0Zhc3Rlc3RDbGllbnRQb29sKEludGVyZmFjZSkgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEFzeW5jQ2xpZW50UG9vbEJhc2UhSW50ZXJmYWNlCit7CisgIC8vLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBjbGllbnRzXyA9IGNsaWVudHM7CisgICAgcnBjRmF1bHRGaWx0ZXJfID0gZGVmYXVsdFJwY0ZhdWx0RmlsdGVyOworICAgIHJlb3BlblRyYW5zcG9ydHNfID0gdHJ1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIGFkZENsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgY2xpZW50c18gfj0gY2xpZW50OworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICBhdXRvIG9sZExlbmd0aCA9IGNsaWVudHNfLmxlbmd0aDsKKyAgICBjbGllbnRzXyA9IHJlbW92ZUVxdWFsKGNsaWVudHNfLCBjbGllbnQpOworICAgIHJldHVybiBjbGllbnRzXy5sZW5ndGggPCBvbGRMZW5ndGg7CisgIH0KKworCisgIC8rb3ZlcnJpZGUrLyBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXIoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBycGNGYXVsdEZpbHRlcl87CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBycGNGYXVsdEZpbHRlcihib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcnBjRmF1bHRGaWx0ZXJfID0gdmFsdWU7CisgIH0KKworICAvK292ZXJyaWRlKy9ib29sIHJlb3BlblRyYW5zcG9ydHMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiByZW9wZW5UcmFuc3BvcnRzXzsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIHJlb3BlblRyYW5zcG9ydHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHZhbHVlOworICB9CisKKyAgbWl4aW4oZmFzdGVzdFBvb2xGb3J3YXJkQ29kZSFJbnRlcmZhY2UoKSk7CisKK3ByaXZhdGU6CisgIENsaWVudFtdIGNsaWVudHNfOworICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXJfOworICBib29sIHJlb3BlblRyYW5zcG9ydHNfOworfQorCisvKioKKyAqIFRBc3luY0Zhc3Rlc3RDbGllbnRQb29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUQXN5bmNGYXN0ZXN0Q2xpZW50UG9vbCFJbnRlcmZhY2UgdEFzeW5jRmFzdGVzdENsaWVudFBvb2woSW50ZXJmYWNlKSgKKyAgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2VbXSBjbGllbnRzCispIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoY2xpZW50cyk7Cit9CisKK3ByaXZhdGUgeworICAvLyBDYW5ub3QgdXNlIGFuIGFub255bW91cyBkZWxlZ2F0ZSBsaXRlcmFsIGZvciB0aGlzIGJlY2F1c2UgdGhleSBhcmVuJ3QKKyAgLy8gYWxsb3dlZCBpbiBjbGFzcyBzY29wZS4KKyAgc3RyaW5nIGZhc3Rlc3RQb29sRm9yd2FyZENvZGUoSW50ZXJmYWNlKSgpIHsKKyAgICBzdHJpbmcgY29kZSA9ICIiOworCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgQWxsTWVtYmVyTWV0aG9kTmFtZXMhSW50ZXJmYWNlKSB7CisgICAgICBlbnVtIHFuID0gIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZTsKKyAgICAgIGNvZGUgfj0gIlRGdXR1cmUhKFJldHVyblR5cGUhKCIgfiBxbiB+ICIpKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIoUGFyYW1ldGVyVHlwZVR1cGxlISgiIH4gcW4gfiAiKSBhcmdzLCAiIH4KKyAgICAgICAgIlRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkge1xuIjsKKyAgICAgIGNvZGUgfj0gImVudW0gbWV0aG9kTmFtZSA9IGAiIH4gbWV0aG9kTmFtZSB+ICJgO1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgYWxpYXMgUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoSW50ZXJmYWNlLCBtZXRob2ROYW1lKSkgUmVzdWx0VHlwZTsKKworICAgICAgICBhdXRvIGNoaWxkQ2FuY2VsbGF0aW9uID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisKKyAgICAgICAgVEZ1dHVyZSFSZXN1bHRUeXBlW10gZnV0dXJlczsKKyAgICAgICAgZnV0dXJlcy5yZXNlcnZlKGNsaWVudHNfLmxlbmd0aCk7CisKKyAgICAgICAgZm9yZWFjaCAoYzsgY2xpZW50c18pIHsKKyAgICAgICAgICBpZiAocmVvcGVuVHJhbnNwb3J0cykgeworICAgICAgICAgICAgaWYgKCFjLnRyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjLnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZnV0dXJlcyB+PSBtaXhpbigiYy4iIH4gbWV0aG9kTmFtZSkoYXJncywgY2hpbGRDYW5jZWxsYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBGYXN0ZXN0UG9vbEpvYiEoUmVzdWx0VHlwZSkoCisgICAgICAgICAgZnV0dXJlcywgcnBjRmF1bHRGaWx0ZXIsIGNhbmNlbGxhdGlvbiwgY2hpbGRDYW5jZWxsYXRpb24pOworICAgICAgfTsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0KKworICBmaW5hbCBjbGFzcyBGYXN0ZXN0UG9vbEpvYihSZXN1bHQpIDogVEZ1dHVyZSFSZXN1bHQgeworICAgIHRoaXMoVEZ1dHVyZSFSZXN1bHRbXSBwb29sRnV0dXJlcywgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyLAorICAgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24sIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb24KKyAgICApIHsKKyAgICAgIHJlc3VsdFByb21pc2VfID0gbmV3IFRQcm9taXNlIVJlc3VsdDsKKyAgICAgIHBvb2xGdXR1cmVzXyA9IHBvb2xGdXR1cmVzOworICAgICAgcnBjRmF1bHRGaWx0ZXJfID0gcnBjRmF1bHRGaWx0ZXI7CisgICAgICBjaGlsZENhbmNlbGxhdGlvbl8gPSBjaGlsZENhbmNlbGxhdGlvbjsKKworICAgICAgZm9yZWFjaCAoZnV0dXJlOyBwb29sRnV0dXJlcykgeworICAgICAgICBmdXR1cmUuY29tcGxldGlvbi5hZGRDYWxsYmFjayh7CisgICAgICAgICAgYXV0byBmID0gZnV0dXJlOworICAgICAgICAgIHJldHVybiB7IGNvbXBsZXRpb25DYWxsYmFjayhmKTsgfTsKKyAgICAgICAgfSgpKTsKKyAgICAgICAgaWYgKGZ1dHVyZS5zdGF0dXMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkLCB3ZSBhcmUgZG9uZSwgZG9uJ3QKKyAgICAgICAgICAvLyBib3RoZXIgYWRkaW5nIGNhbGxiYWNrcyBmb3IgdGhlIG90aGVycyAodGhleSB3b3VsZCBqdXN0IHJldHVybgorICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIGFjcXVpcmluZyB0aGUgbG9jaykuCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjYW5jZWxsYXRpb24pIHsKKyAgICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcuYWRkQ2FsbGJhY2soeworICAgICAgICAgIHJlc3VsdFByb21pc2VfLmNhbmNlbCgpOworICAgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uLnRyaWdnZXIoKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgVEZ1dHVyZVN0YXR1cyBzdGF0dXMoKSBjb25zdCBAcHJvcGVydHkgeworICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2VfLnN0YXR1czsKKyAgICB9CisKKyAgICBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHkgeworICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2VfLmNvbXBsZXRpb247CisgICAgfQorCisgICAgUmVzdWx0IGdldCgpIHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5nZXQoKTsKKyAgICB9CisKKyAgICBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2VfLmdldEV4Y2VwdGlvbigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgY29tcGxldGlvbkNhbGxiYWNrKFRGdXR1cmUhUmVzdWx0IGZ1dHVyZSkgeworICAgICAgc3luY2hyb25pemVkIHsKKyAgICAgICAgaWYgKGZ1dHVyZS5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHsKKyAgICAgICAgICBhc3NlcnQocmVzdWx0UHJvbWlzZV8uc3RhdHVzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdFByb21pc2VfLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpIHsKKyAgICAgICAgICAvLyBUaGUgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkLiBUaGlzIGNhbiBoYXBwZW4gaWYKKyAgICAgICAgICAvLyBhbm90aGVyIGNsaWVudCBjb21wbGV0ZWQgZmlyc3QsIGJ1dCB0aGlzIGNhbGxiYWNrIHdhcyBhbHJlYWR5CisgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGxvY2sgd2hlbiBpdCBjYWxsZWQgY2FuY2VsKCkuCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZ1dHVyZS5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQpIHsKKyAgICAgICAgICBhdXRvIGUgPSBmdXR1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgaWYgKHJwY0ZhdWx0RmlsdGVyXyAmJiBycGNGYXVsdEZpbHRlcl8oZSkpIHsKKyAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnNfIH49IGU7CisKKyAgICAgICAgICAgIGlmIChycGNFeGNlcHRpb25zXy5sZW5ndGggPT0gcG9vbEZ1dHVyZXNfLmxlbmd0aCkgeworICAgICAgICAgICAgICByZXN1bHRQcm9taXNlXy5mYWlsKG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkFsbCBjaGlsZCBvcGVyYXRpb25zIGZhaWxlZCwgdW5hYmxlIHRvIHJldHJpZXZlIGEgcmVzdWx0LiIsCisgICAgICAgICAgICAgICAgcnBjRXhjZXB0aW9uc18KKyAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0IHRvIHRoZSB0YXJnZXQgcHJvbWlzZS4KKyAgICAgICAgcmVzdWx0UHJvbWlzZV8uY29tcGxldGUoZnV0dXJlKTsKKworICAgICAgICAvLyBDYW5jZWwgdGhlIG90aGVyIGZ1dHVyZXMsIHdlIHdvdWxkIGp1c3QgZGlzY2FyZCB0aGVpciByZXN1bHRzLgorICAgICAgICAvLyBOb3RlOiBXZSBkbyB0aGlzIGFmdGVyIHdlIGhhdmUgc3RvcmVkIHRoZSByZXN1bHRzIHRvIG91ciBwcm9taXNlLAorICAgICAgICAvLyBzZWUgdGhlIGFzc2VydCBhdCB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgY2hpbGRDYW5jZWxsYXRpb25fLnRyaWdnZXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUUHJvbWlzZSFSZXN1bHQgcmVzdWx0UHJvbWlzZV87CisgICAgVEZ1dHVyZSFSZXN1bHRbXSBwb29sRnV0dXJlc187CisgICAgRXhjZXB0aW9uW10gcnBjRXhjZXB0aW9uc187CisgICAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyXzsKKyAgICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKyAgfQorfQorCisvKioKKyAqIEFsbG93cyBlYXNpbHkgYWdncmVnYXRpbmcgcmVzdWx0cyBmcm9tIGEgbnVtYmVyIG9mIFRBc3luY0NsaWVudHMuCisgKgorICogQ29udHJhcnkgdG8gVEFzeW5je0ZhbGxiYWNrLCBGYXN0ZXN0fUNsaWVudFBvb2wsIHRoaXMgY2xhc3MgZG9lcyBub3QKKyAqIHNpbXBseSBpbXBsZW1lbnQgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UuIEl0IG1hbmFnZXMgYSBwb29sIG9mIGNsaWVudHMsCisgKiBidXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBjdXN0b20gYWNjdW11bGF0b3IgZnVuY3Rpb24gdG8gdXNlIG9yIHRvCisgKiBpdGVyYXRlIG92ZXIgdGhlIHJlc3VsdHMgdXNpbmcgYSBURnV0dXJlQWdncmVnYXRvclJhbmdlLgorICoKKyAqIEZvciBlYWNoIHNlcnZpY2UgbWV0aG9kLCBUQXN5bmNBZ2dyZWdhdG9yIG9mZmVycyBhIG1ldGhvZAorICogYWNjZXB0aW5nIHRoZSBzYW1lIGFyZ3VtZW50cywgYW5kIGFuIG9wdGlvbmFsIFRDYW5jZWxsYXRpb24gaW5zdGFuY2UsIGp1c3QKKyAqIGxpa2Ugd2l0aCBURnV0dXJlSW50ZXJmYWNlLiBUaGUgcmV0dXJuIHR5cGUsIGhvd2V2ZXIsIGlzIGEgcHJveHkgb2JqZWN0CisgKiB0aGF0IG9mZmVycyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgKiAtLS0KKyAqIC8rKworICogICsgUmV0dXJucyBhIHRocmlmdC51dGlsLmZ1dHVyZS5URnV0dXJlQWdncmVnYXRvclJhbmdlIGZvciB0aGUgcmVzdWx0cyBvZgorICogICsgdGhlIGNsaWVudCBwb29sIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAqICArCisgKiAgKyBUaGUgW10gKHNsaWNpbmcpIG9wZXJhdG9yIGNhbiBhbHNvIGJlIHVzZWQgdG8gb2J0YWluIHRoZSByYW5nZS4KKyAqICArCisgKiAgKyBQYXJhbXM6CisgKiAgKyAgIHRpbWVvdXQgPSBBIHRpbWVvdXQgdG8gcGFzcyB0byB0aGUgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSBjb25zdHJ1Y3RvciwKKyAqICArICAgICBkZWZhdWx0cyB0byB6ZXJvIChubyB0aW1lb3V0KS4KKyAqICArLworICogVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSFSZXR1cm5UeXBlIHJhbmdlKER1cmF0aW9uIHRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCkpOworICogYXV0byBvcFNsaWNlKCkgeyByZXR1cm4gcmFuZ2UoKTsgfSAvLy8gRGl0dG8KKyAqCisgKiAvKysKKyAqICArIFJldHVybnMgYSBmdXR1cmUgdGhhdCBnYXRoZXJzIHRoZSByZXN1bHRzIGZyb20gdGhlIGNsaWVudHMgaW4gdGhlIHBvb2wKKyAqICArIGFuZCBpbnZva2VzIGEgdXNlci1zdXBwbGllZCBhY2N1bXVsYXRvciBmdW5jdGlvbiBvbiB0aGVtLCByZXR1cm5pbmcgaXRzCisgKiAgKyByZXR1cm4gdmFsdWUgdG8gdGhlIGNsaWVudC4KKyAqICArCisgKiAgKyBJbiBhZGRpdGlvbiB0byB0aGUgVEZ1dHVyZSFBY2N1bXVsYXRlZFR5cGUgaW50ZXJmYWNlICh3aGVyZQorICogICsgQWNjdW11bGF0ZWRUeXBlIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb24pLCB0aGUKKyAqICArIHJldHVybmVkIG9iamVjdCBhbHNvIG9mZmVycyB0d28gYWRkaXRpb25hbCBtZXRob2RzLCBmaW5pc2goKSBhbmQKKyAqICArIGZpbmlzaEdldCgpOiBCeSBkZWZhdWx0LCB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb25zIGlzIGNhbGxlZCBhZnRlciBhbGwKKyAqICArIHRoZSByZXN1bHRzIGZyb20gdGhlIHBvb2wgY2xpZW50cyBoYXZlIGJlY29tZSBhdmFpbGFibGUuIENhbGxpbmcgZmluaXNoKCkKKyAqICArIGNhdXNlcyB0aGUgYWNjdW11bGF0b3IgZnV0dXJlIHRvIHN0b3Agd2FpdGluZyBmb3Igb3RoZXIgcmVzdWx0cyBhbmQKKyAqICArIGltbWVkaWF0ZWx5IGludm9raW5nIHRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbiBvbiB0aGUgcmVzdWx0cyBjdXJyZW50bHkKKyAqICArIGF2YWlsYWJsZS4gSWYgYWxsIHJlc3VsdHMgYXJlIGFscmVhZHkgYXZhaWxhYmxlLCBmaW5pc2goKSBpcyBhIG5vLW9wLgorICogICsgZmluaXNoR2V0KCkgaXMgYSBjb252ZW5pZW5jZSBzaG9ydGN1dCBmb3IgY29tYmluaW5nIGl0IHdpdGgKKyAqICArIGEgY2FsbCB0byBnZXQoKSBpbW1lZGlhdGVseSBhZnRlcndhcmRzLCBsaWtlIHdhaXRHZXQoKSBpcyBmb3Igd2FpdCgpLgorICogICsKKyAqICArIFRoZSBhY2MgYWxpYXMgY2FuIHBvaW50IHRvIGFueSBjYWxsYWJsZSBhY2NlcHRpbmcgZWl0aGVyIGFuIGFycmF5IG9mCisgKiAgKyByZXR1cm4gdmFsdWVzIG9yIGFuIGFycmF5IG9mIHJldHVybiB2YWx1ZXMgYW5kIGFuIGFycmF5IG9mIGV4Y2VwdGlvbnM7CisgKiAgKyBzZWUgaXNBY2N1bXVsYXRvciEoKSBmb3IgZGV0YWlscy4gVGhlIGRlZmF1bHQgYWNjdW11bGF0b3IgY29uY2F0ZW5hdGVzCisgKiAgKyByZXR1cm4gdmFsdWVzIHRoYXQgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIGVhY2ggb3RoZXJzIChlLmcuIGFycmF5cyksCisgKiAgKyBhbmQgc2ltcGx5IHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzIG90aGVyd2lzZSwgZmFpbGluZyB3aXRoIGEKKyAqICArIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiBubyB2YWx1ZXMgd2VyZSByZXR1cm5lZC4KKyAqICArCisgKiAgKyBUaGUgYWNjdW11bGF0b3IgZnVuY3Rpb24gaXMgbm90IGV4ZWN1dGVkIGluIGFueSBvZiB0aGUgYXN5bmMgbWFuYWdlcgorICogICsgd29ya2VyIHRocmVhZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3luYyBjbGllbnRzLCBidXQgaW5zdGVhZCBpdCBpcworICogICsgaW52b2tlZCB3aGVuIHRoZSBhY3R1YWwgcmVzdWx0IGlzIHJlcXVlc3RlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYWZ0ZXIgdGhlCisgKiAgKyBvcGVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiBUaGlzIGFsc28gaW5jbHVkZXMgY2hlY2tpbmcgdGhlIHN0YXR1cworICogICsgb2YgdGhlIG9wZXJhdGlvbiBvbmNlIGl0IGlzIG5vIGxvbmdlciBydW5uaW5nLCBzaW5jZSB0aGUgYWNjdW11bGF0b3IKKyAqICArIGhhcyB0byBiZSBydW4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLgorICogICsvCisgKiBhdXRvIGFjY3VtdWxhdGUoYWxpYXMgYWNjID0gZGVmYXVsdEFjY3VtdWxhdG9yKSgpIGlmIChpc0FjY3VtdWxhdG9yIWFjYyk7CisgKiAtLS0KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiAvLyBTb21lIFRocmlmdCBzZXJ2aWNlLgorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBmb28oc3RyaW5nIG5hbWUpOworICogICBieXRlW10gYmFyKCk7CisgKiB9CisgKgorICogLy8gQ3JlYXRlIHRoZSBhZ2dyZWdhdG9yIHBvb2wg4oCTIGNsaWVudDAsIGNsaWVudDEsIGNsaWVudDIgYXJlIHNvbWUKKyAqIC8vIFRBc3luY0NsaWVudCFGb28gaW5zdGFuY2VzLCBidXQgaW4gdGhlb3J5IGNvdWxkIGFsc28gYmUgb3RoZXIKKyAqIC8vIFRGdXR1cmVJbnRlcmZhY2UhRm9vIGltcGxlbWVudGF0aW9ucyAoZS5nLiBzb21lIGFzeW5jIGNsaWVudCBwb29sKS4KKyAqIGF1dG8gcG9vbCA9IG5ldyBUQXN5bmNBZ2dyZWdhdG9yIUZvbyhbY2xpZW50MCwgY2xpZW50MSwgY2xpZW50Ml0pOworICoKKyAqIGZvcmVhY2ggKHZhbDsgcG9vbC5mb28oImJheiIpLnJhbmdlKGR1ciEic2Vjb25kcyIoMSkpKSB7CisgKiAgIC8vIFByb2Nlc3MgYWxsIHRoZSByZXN1bHRzIHRoYXQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgYSBzZWNvbmQgaGFzIHBhc3NlZCwKKyAqICAgLy8gaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLgorICogICB3cml0ZWxuKHZhbCk7CisgKiB9CisgKgorICogYXV0byBzdW1Sb290cyA9IHBvb2wuZm9vKCJiYXoiKS5hY2N1bXVsYXRlISgoaW50W10gdmFscywgRXhjZXB0aW9uc1tdIGV4cyl7CisgKiAgIGlmICh2YWxzLmVtcHR5KSB7CisgKiAgICAgdGhyb3cgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWxsIGNsaWVudHMgZmFpbGVkIiwgZXhzKTsKKyAqICAgfQorICoKKyAqICAgLy8gSnVzdCB0byBpbGx1c3RyYXRlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyBjYW4gY2hhbmdlLCBjb252ZXJ0IHRoZQorICogICAvLyBudW1iZXJzIHRvIGRvdWJsZSBhbmQgc3VtIHVwIHRoZWlyIHJvb3RzLgorICogICBkb3VibGUgcmVzdWx0ID0gMDsKKyAqICAgZm9yZWFjaCAodjsgdmFscykgcmVzdWx0ICs9IHNxcnQoY2FzdChkb3VibGUpdik7CisgKiAgIHJldHVybiByZXN1bHQ7CisgKiB9KSgpOworICoKKyAqIC8vIFdhaXQgdXAgdG8gdGhyZWUgc2Vjb25kcyBmb3IgdGhlIHJlc3VsdCwgYW5kIHRoZW4gYWNjdW11bGF0ZSB3aGF0IGhhcworICogLy8gYXJyaXZlZCBzbyBmYXIuCisgKiBzdW1Sb290cy5jb21wbGV0aW9uLndhaXQoZHVyISJzZWNvbmRzIigzKSk7CisgKiB3cml0ZWxuKHN1bVJvb3RzLmZpbmlzaEdldCgpKTsKKyAqCisgKiAvLyBGb3Igc2NhbGFycywgdGhlIGRlZmF1bHQgYWNjdW11bGF0b3IgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgdmFsdWVzLgorICogcHJhZ21hKG1zZywgdHlwZW9mKHBvb2wuZm9vKCIiKS5hY2N1bXVsYXRlKCkuZ2V0KCkpOyAvLyBpbnRbXS4KKyAqCisgKiAvLyBGb3IgbGlzdHMsIGV0Yy4sIGl0IGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0cyB0b2dldGhlci4KKyAqIHByYWdtYShtc2csIHR5cGVvZihwb29sLmJhcigpLmFjY3VtdWxhdGUoKS5nZXQoKSkpOyAvLyBieXRlW10uCisgKiAtLS0KKyAqCisgKiBOb3RlOiBGb3IgdGhlIGFjY3VtdWxhdGUhKCkgaW50ZXJmYWNlLCB5b3UgbWlnaHQgY3VycmVudGx5IGhpdCBhIMK7Y2Fubm90IHVzZQorICogbG9jYWwgJ+KApicgYXMgcGFyYW1ldGVyIHRvIG5vbi1nbG9iYWwgdGVtcGxhdGUgYWNjdW11bGF0ZcKrLWVycm9yLCBzZWUKKyAqICQoRE1EQlVHIDU3MTAsIERNRCBpc3N1ZSA1NzEwKS4gSWYgeW91ciBhY2N1bXVsYXRvciBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkCisgKiB0byBhY2Nlc3MgdGhlIHN1cnJvdW5kaW5nIHNjb3BlLCB5b3UgbWlnaHQgd2FudCB0byB1c2UgYSBmdW5jdGlvbiBsaXRlcmFsCisgKiBpbnN0ZWFkIG9mIGEgZGVsZWdhdGUgdG8gYXZvaWQgdGhlIGlzc3VlLgorICovCitjbGFzcyBUQXN5bmNBZ2dyZWdhdG9yKEludGVyZmFjZSkgaWYgKGlzQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSB7CisgIC8vLyBTaG9ydGhhbmQgZm9yIHRoZSBjbGllbnQgdHlwZSB0aGlzIGluc3RhbmNlIG9wZXJhdGVzIG9uLgorICBhbGlhcyBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZSBDbGllbnQ7CisKKyAgLy8vCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIGNsaWVudHNfID0gY2xpZW50czsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRvIG9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0cyBvZiBhIGNsaWVudCBiZWZvcmUgdHJ5aW5nIHRvCisgIC8vLyBleGVjdXRlIGEgbWV0aG9kIGlmIHRoZXkgYXJlIG5vdCBvcGVuLiBUaGlzIGlzIHVzdWFsbHkgZGVzaXJhYmxlCisgIC8vLyBiZWNhdXNlIGl0IGFsbG93cyBlLmcuIHRvIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IHRvIGEgcmVtb3RlIHNlcnZlcgorICAvLy8gaWYgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgorICAvLy8KKyAgLy8vIERlZmF1bHRzIHRvIHRydWUuCisgIGJvb2wgcmVvcGVuVHJhbnNwb3J0cyA9IHRydWU7CisKKyAgbWl4aW4gQWdncmVnYXRvck9wRGlzcGF0Y2ghKCk7CisKK3ByaXZhdGU6CisgIENsaWVudFtdIGNsaWVudHNfOworfQorCisvLy8gRGl0dG8KK2NsYXNzIFRBc3luY0FnZ3JlZ2F0b3IoSW50ZXJmYWNlKSBpZiAoaXNEZXJpdmVkU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEFzeW5jQWdncmVnYXRvciEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKQoreworICAvLy8gU2hvcnRoYW5kIGZvciB0aGUgY2xpZW50IHR5cGUgdGhpcyBpbnN0YW5jZSBvcGVyYXRlcyBvbi4KKyAgYWxpYXMgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8vLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBzdXBlcihjYXN0KFRBc3luY0NsaWVudEJhc2UhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSlbXSljbGllbnRzKTsKKyAgfQorCisgIG1peGluIEFnZ3JlZ2F0b3JPcERpc3BhdGNoISgpOworfQorCisvKioKKyAqIFdoZXRoZXIgZnVuIGlzIGEgdmFsaWQgYWNjdW11bGF0b3IgZnVuY3Rpb24gZm9yIHZhbHVlcyBvZiB0eXBlIFZhbHVlVHlwZS4KKyAqCisgKiBGb3IgdGhpcyB0byBiZSB0cnVlLCBmdW4gbXVzdCBiZSBhIGNhbGxhYmxlIG1hdGNoaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiBhcmd1bWVudCBsaXN0czoKKyAqIC0tLQorICogZnVuKFZhbHVlVHlwZVtdIHZhbHVlcyk7CisgKiBmdW4oVmFsdWVUeXBlW10gdmFsdWVzLCBFeGNlcHRpb25bXSBleGNlcHRpb25zKTsKKyAqIC0tLQorICoKKyAqIFRoZSBzZWNvbmQgdmVyc2lvbiBpcyBwYXNzZWQgdGhlIGNvbGxlY3RlZCBhcnJheSBleGNlcHRpb25zIGZyb20gYWxsIHRoZQorICogY2xpZW50cyBpbiB0aGUgcG9vbC4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNsaWVudCAodmlhCisgKiB0aGUgcmVzdWx0IGZ1dHVyZSkuIElmIGl0IHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBvcGVyYXRpb24gaXMgbWFya2VkIGFzCisgKiBmYWlsZWQgd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGluc3RlYWQuCisgKi8KK3RlbXBsYXRlIGlzQWNjdW11bGF0b3IoVmFsdWVUeXBlLCBhbGlhcyBmdW4pIHsKKyAgZW51bSBpc0FjY3VtdWxhdG9yID0gaXModHlwZW9mKGZ1bihjYXN0KFZhbHVlVHlwZVtdKVtdKSkpIHx8CisgICAgaXModHlwZW9mKGZ1bihjYXN0KFZhbHVlVHlwZVtdKVtdLCBjYXN0KEV4Y2VwdGlvbltdKVtdKSkpOworfQorCisvKioKKyAqIFRBc3luY0FnZ3JlZ2F0b3IgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgaW50ZXJmYWNlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZAorICogdXNpbmcgSUZUSSAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWVzdCA2MDgyKSkuCisgKi8KK1RBc3luY0FnZ3JlZ2F0b3IhSW50ZXJmYWNlIHRBc3luY0FnZ3JlZ2F0b3IoSW50ZXJmYWNlKSgKKyAgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2VbXSBjbGllbnRzCispIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoY2xpZW50cyk7Cit9CisKK3ByaXZhdGUgeworICBtaXhpbiB0ZW1wbGF0ZSBBZ2dyZWdhdG9yT3BEaXNwYXRjaCgpIHsKKyAgICBhdXRvIG9wRGlzcGF0Y2goc3RyaW5nIG5hbWUsIEFyZ3MuLi4pKEFyZ3MgYXJncykgaWYgKAorICAgICAgaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuaW5pdC4iIH4gbmFtZSkoYXJncykpKQorICAgICkgeworICAgICAgYWxpYXMgUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoSW50ZXJmYWNlLCBuYW1lKSkgUmVzdWx0VHlwZTsKKworICAgICAgYXV0byBjaGlsZENhbmNlbGxhdGlvbiA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworCisgICAgICBURnV0dXJlIVJlc3VsdFR5cGVbXSBmdXR1cmVzOworICAgICAgZnV0dXJlcy5yZXNlcnZlKGNsaWVudHNfLmxlbmd0aCk7CisKKyAgICAgIGZvcmVhY2ggKGM7IGNhc3QoQ2xpZW50W10pY2xpZW50c18pIHsKKyAgICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgICBpZiAoIWMudHJhbnNwb3J0LmlzT3BlbikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgYy50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZ1dHVyZXMgfj0gbWl4aW4oImMuIiB+IG5hbWUpKGFyZ3MsIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEFnZ3JlZ2F0aW9uUmVzdWx0IVJlc3VsdFR5cGUoZnV0dXJlcywgY2hpbGRDYW5jZWxsYXRpb24pOworICAgIH0KKyAgfQorCisgIHN0cnVjdCBBZ2dyZWdhdGlvblJlc3VsdChUKSB7CisgICAgYXV0byBvcFNsaWNlKCkgeworICAgICAgcmV0dXJuIHJhbmdlKCk7CisgICAgfQorCisgICAgYXV0byByYW5nZShEdXJhdGlvbiB0aW1lb3V0ID0gZHVyISJobnNlY3MiKDApKSB7CisgICAgICByZXR1cm4gdEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZShmdXR1cmVzXywgY2hpbGRDYW5jZWxsYXRpb25fLCB0aW1lb3V0KTsKKyAgICB9CisKKyAgICBhdXRvIGFjY3VtdWxhdGUoYWxpYXMgYWNjID0gZGVmYXVsdEFjY3VtdWxhdG9yKSgpIGlmIChpc0FjY3VtdWxhdG9yIShULCBhY2MpKSB7CisgICAgICByZXR1cm4gbmV3IEFjY3VtdWxhdG9ySm9iIShULCBhY2MpKGZ1dHVyZXNfLCBjaGlsZENhbmNlbGxhdGlvbl8pOworICAgIH0KKworICBwcml2YXRlOgorICAgIFRGdXR1cmUhVFtdIGZ1dHVyZXNfOworICAgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb25fOworICB9CisKKyAgYXV0byBkZWZhdWx0QWNjdW11bGF0b3IoVCkoVFtdIHZhbHVlcywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucykgeworICAgIGlmICh2YWx1ZXMuZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZCIsCisgICAgICAgIGV4Y2VwdGlvbnMpOworICAgIH0KKworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQuaW5pdCB+IFQuaW5pdCkpKSB7CisgICAgICBpbXBvcnQgc3RkLmFsZ29yaXRobTsKKyAgICAgIHJldHVybiByZWR1Y2UhImEgfiBiIih2YWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKyAgfQorCisgIGZpbmFsIGNsYXNzIEFjY3VtdWxhdG9ySm9iKFQsIGFsaWFzIGFjY3VtdWxhdG9yKSBpZiAoCisgICAgaXNBY2N1bXVsYXRvciEoVCwgYWNjdW11bGF0b3IpCisgICkgOiBURnV0dXJlIShBY2N1bXVsYXRvclJlc3VsdCEoVCwgYWNjdW11bGF0b3IpKSB7CisgICAgdGhpcyhURnV0dXJlIVRbXSBmdXR1cmVzLCBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uKSB7CisgICAgICBmdXR1cmVzXyA9IGZ1dHVyZXM7CisgICAgICBjaGlsZENhbmNlbGxhdGlvbl8gPSBjaGlsZENhbmNlbGxhdGlvbjsKKyAgICAgIHJlc3VsdE11dGV4XyA9IG5ldyBNdXRleDsKKyAgICAgIGNvbXBsZXRpb25FdmVudF8gPSBuZXcgVE9uZXNob3RFdmVudDsKKworICAgICAgZm9yZWFjaCAoZnV0dXJlOyBmdXR1cmVzKSB7CisgICAgICAgIGZ1dHVyZS5jb21wbGV0aW9uLmFkZENhbGxiYWNrKHsKKyAgICAgICAgICBhdXRvIGYgPSBmdXR1cmU7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVzdWx0TXV0ZXhfKSB7CisgICAgICAgICAgICAgIGlmIChmLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgeworICAgICAgICAgICAgICAgIGlmICghZmluaXNoZWRfKSB7CisgICAgICAgICAgICAgICAgICBzdGF0dXNfID0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQ7CisgICAgICAgICAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoZi5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zXyB+PSBmLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdHNfIH49IGYuZ2V0KCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAocmVzdWx0c18ubGVuZ3RoICsgZXhjZXB0aW9uc18ubGVuZ3RoID09IGZ1dHVyZXNfLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9KCkpOworICAgICAgfQorICAgIH0KKworICAgIFRGdXR1cmVTdGF0dXMgc3RhdHVzKCkgQHByb3BlcnR5IHsKKyAgICAgIHN5bmNocm9uaXplZCAocmVzdWx0TXV0ZXhfKSB7CisgICAgICAgIGlmICghZmluaXNoZWRfKSByZXR1cm4gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HOworICAgICAgICBpZiAoc3RhdHVzXyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpIHJldHVybiBzdGF0dXNfOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzdWx0XyA9IGludm9rZUFjY3VtdWxhdG9yIWFjY3VtdWxhdG9yKHJlc3VsdHNfLCBleGNlcHRpb25zXyk7CisgICAgICAgICAgc3RhdHVzXyA9IFRGdXR1cmVTdGF0dXMuU1VDQ0VFREVEOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGV4Y2VwdGlvbl8gPSBlOworICAgICAgICAgIHN0YXR1c18gPSBURnV0dXJlU3RhdHVzLkZBSUxFRDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGF0dXNfOworICAgICAgfQorICAgIH0KKworICAgIFRBd2FpdGFibGUgY29tcGxldGlvbigpIEBwcm9wZXJ0eSB7CisgICAgICByZXR1cm4gY29tcGxldGlvbkV2ZW50XzsKKyAgICB9CisKKyAgICBBY2N1bXVsYXRvclJlc3VsdCEoVCwgYWNjdW11bGF0b3IpIGdldCgpIHsKKyAgICAgIGF1dG8gcyA9IHN0YXR1czsKKworICAgICAgZW5mb3JjZShzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORywKKyAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICAgIGlmIChzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgICAgIGlmIChzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB0aHJvdyBleGNlcHRpb25fOworICAgICAgcmV0dXJuIHJlc3VsdF87CisgICAgfQorCisgICAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgIGF1dG8gcyA9IHN0YXR1czsKKyAgICAgIGVuZm9yY2UocyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcsCisgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisKKyAgICAgIGlmIChzID09IFRGdXR1cmVTdGF0dXMuU1VDQ0VFREVEKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIGV4Y2VwdGlvbl87CisgICAgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHJlc3VsdE11dGV4XykgeworICAgICAgICBpZiAoIWZpbmlzaGVkXykgeworICAgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgICAgY2hpbGRDYW5jZWxsYXRpb25fLnRyaWdnZXIoKTsKKyAgICAgICAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZmluaXNoR2V0KCkgeworICAgICAgZmluaXNoKCk7CisgICAgICByZXR1cm4gZ2V0KCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVEZ1dHVyZSFUW10gZnV0dXJlc187CisgICAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbl87CisKKyAgICBib29sIGZpbmlzaGVkXzsKKyAgICBUW10gcmVzdWx0c187CisgICAgRXhjZXB0aW9uW10gZXhjZXB0aW9uc187CisKKyAgICBURnV0dXJlU3RhdHVzIHN0YXR1c187CisgICAgTXV0ZXggcmVzdWx0TXV0ZXhfOworICAgIHVuaW9uIHsKKyAgICAgIEFjY3VtdWxhdG9yUmVzdWx0IShULCBhY2N1bXVsYXRvcikgcmVzdWx0XzsKKyAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb25fOworICAgIH0KKyAgICBUT25lc2hvdEV2ZW50IGNvbXBsZXRpb25FdmVudF87CisgIH0KKworICBhdXRvIGludm9rZUFjY3VtdWxhdG9yKGFsaWFzIGFjY3VtdWxhdG9yLCBUKSgKKyAgICBUW10gdmFsdWVzLCBFeGNlcHRpb25bXSBleGNlcHRpb25zCisgICkgaWYgKAorICAgIGlzQWNjdW11bGF0b3IhKFQsIGFjY3VtdWxhdG9yKQorICApIHsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihhY2N1bXVsYXRvcih2YWx1ZXMsIGV4Y2VwdGlvbnMpKSkpIHsKKyAgICAgIHJldHVybiBhY2N1bXVsYXRvcih2YWx1ZXMsIGV4Y2VwdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYWNjdW11bGF0b3IodmFsdWVzKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBBY2N1bXVsYXRvclJlc3VsdChULCBhbGlhcyBhY2MpIHsKKyAgICBhbGlhcyB0eXBlb2YoaW52b2tlQWNjdW11bGF0b3IhYWNjKGNhc3QoVFtdKVtdLCBjYXN0KEV4Y2VwdGlvbltdKVtdKSkKKyAgICAgIEFjY3VtdWxhdG9yUmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU0OTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZApAQCAtMCwwICsxLDEwMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gbWV0YWRhdGEgYW5kIHRlbXBsYXRlcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgc3RydWN0CisgKiBzZXJpYWxpemF0aW9uLgorICoKKyAqIE1hbnkgdGVtcGxhdGVzIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIGZpZWxkIG1ldGEgZGF0YSwgd2hpY2ggaXMgcmVhZCBmcm9tCisgKiBhIG1hbmlmZXN0IGNvbnN0YW50IG1lbWJlciBvZiB0aGUgZ2l2ZW4gdHlwZSBjYWxsZWQgZmllbGRNZXRhIChpZiBwcmVzZW50KSwKKyAqIGFuZCBpcyBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgb3B0aW9uYWwgZmllbGRNZXRhRGF0YQorICogdGVtcGxhdGUgYWxpYXMgcGFyYW1ldGVyLgorICoKKyAqIFNvbWUgY29kZSBnZW5lcmF0aW9uIHRlbXBsYXRlcyB0YWtlIGFjY291bnQgb2YgdGhlIG9wdGlvbmFsIFRWZXJib3NlQ29kZWdlbgorICogdmVyc2lvbiBkZWNsYXJhdGlvbiwgd2hpY2ggY2F1c2VzIHdhcm5pbmcgbWVzc2FnZXMgdG8gYmUgZW1pdHRlZCBpZiBubworICogbWV0YWRhdGEgZm9yIGEgZmllbGQvbWV0aG9kIGhhcyBiZWVuIGZvdW5kIGFuZCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcworICogdXNlZCBpbnN0ZWFkLiBJZiB0aGlzIHZlcnNpb24gaXMgbm90IGRlZmluZWQsIHRoZSB0ZW1wbGF0ZXMganVzdCBzaWxlbnRseQorICogYmVoYXZlIGxpa2UgdGhlIFRocmlmdCBjb21waWxlciBkb2VzIGluIHRoaXMgc2l0dWF0aW9uLCBpLmUuIGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbiBuZWdhdGl2ZSBpZHMgKHN0YXJ0aW5nIGF0IC0xKSBmb3IgZmllbGRzIGFuZCBhc3N1bWUgVFJlcS5BVVRPIGFzCisgKiByZXF1aXJlbWVudCBsZXZlbC4KKyAqLworLy8gSW1wbGVtZW50YXRpb24gbm90ZTogQWxsIHRoZSB0ZW1wbGF0ZXMgaW4gaGVyZSB0YWtpbmcgYSBmaWVsZCBtZXRhZGF0YQorLy8gcGFyYW1ldGVyIHNob3VsZCBpZGVhbGx5IGhhdmUgYSBjb25zdHJhaW50IHRoYXQgcmVzdHJpY3RzIHRoZSBhbGlhcyB0bworLy8gVEZpZWxkTWV0YVtdLXR5cGVkIHZhbHVlcywgYnV0IHRoZSBpcygpIGV4cHJlc3Npb25zIHNlZW1zIHRvIGFsd2F5cyBmYWlsLgorbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmJhc2U7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogZmluZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogQmFzZVR5cGVUdXBsZSwgaXNQb2ludGVyLCBpc1NvbWVGdW5jdGlvbiwgUG9pbnRlclRhcmdldCwKKyAgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworCisvKgorICogVGhyaWZ0IHN0cnVjdC9zZXJ2aWNlIG1ldGEgZGF0YSwgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBmcm9tCisgKiB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgbm90IHJlcHJlc2VudGFibGUgaW4gcGxhaW4gRCwgaS5lLiBmaWVsZAorICogcmVxdWlyZW1lbnQgbGV2ZWxzLCBUaHJpZnQgZmllbGQgSURzLCBldGMuCisgKi8KKworLyoqCisgKiBTdHJ1Y3QgZmllbGQgcmVxdWlyZW1lbnQgbGV2ZWxzLgorICovCitlbnVtIFRSZXEgeworICAvLy8gRGV0ZWN0IHRoZSByZXF1aXJlZG5lc3MgZnJvbSB0aGUgZmllbGQgdHlwZTogaWYgaXQgaXMgbnVsbGFibGUsIHRyZWF0CisgIC8vLyB0aGUgZmllbGQgYXMgb3B0aW9uYWwsIGlmIGl0IGlzIG5vbi1udWxsYWJsZSwgdHJlYXQgdGhlIGZpZWxkIGFzCisgIC8vLyByZXF1aXJlZC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB1c2VkIGZvciBoYW5kbGluZyBzdHJ1Y3RzIG5vdCBnZW5lcmF0ZWQKKyAgLy8vIGZyb20gYW4gSURMIGZpbGUsIGFuZCBuZXZlciBlbWl0dGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIuIFRSZXEuQVVUTworICAvLy8gc2hvdWxkbid0IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LgorICAvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiB0aHJpZnQuY29kZWdlbiB0ZW1wbGF0ZXMgdXNlCisgIC8vIHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuLm1lbWJlclJlcSB0byByZXNvbHZlIEFVVE8gdG8gUkVRVUlSRUQvT1BUSU9OQUwKKyAgLy8gaW5zdGVhZCBvZiBoYW5kbGluZyBpdCBkaXJlY3RseS4KKyAgQVVUTywKKworICAvLy8gVGhlIGZpZWxkIGlzIHRyZWF0ZWQgYXMgb3B0aW9uYWwgd2hlbiBkZXNlcmlhbGl6aW5nL3JlY2VpdmluZyB0aGUgc3RydWN0CisgIC8vLyBhbmQgYXMgcmVxdWlyZWQgd2hlbiBzZXJpYWxpemluZy9zZW5kaW5nLiBUaGlzIGlzIHRoZSBUaHJpZnQgZGVmYXVsdCBpZgorICAvLy8gbmVpdGhlciAicmVxdWlyZWQiIG5vciAib3B0aW9uYWwiIGFyZSBzcGVjaWZpZWQgaW4gdGhlIElETCBmaWxlLgorICBPUFRfSU5fUkVRX09VVCwKKworICAvLy8gVGhlIGZpZWxkIGlzIG9wdGlvbmFsLgorICBPUFRJT05BTCwKKworICAvLy8gVGhlIGZpZWxkIGlzIHJlcXVpcmVkLgorICBSRVFVSVJFRCwKKworICAvLy8gSWdub3JlIHRoZSBzdHJ1Y3QgZmllbGQgd2hlbiBzZXJpYWxpemluZy9kZXNlcmlhbGl6aW5nLgorICBJR05PUkUKK30KKworLyoqCisgKiBUaGUgd2F5IGhvdyBtZXRob2RzIGFyZSBjYWxsZWQuCisgKi8KK2VudW0gVE1ldGhvZFR5cGUgeworICAvLy8gQ2FsbGVkIGluIHRoZSBub3JtYWwgdHdvLXdheSBzY2hlbWUgY29uc2lzdGluZyBvZiBhIHJlcXVlc3QgYW5kIGEKKyAgLy8vIHJlc3BvbnNlLgorICBSRUdVTEFSLAorCisgIC8vLyBBIGZpcmUtYW5kLWZvcmdldCBvbmUtd2F5IG1ldGhvZCwgd2hlcmUgbm8gcmVzcG9uc2UgaXMgc2VudCBhbmQgdGhlCisgIC8vLyBjbGllbnQgaW1tZWRpYXRlbHkgcmV0dXJucy4KKyAgT05FV0FZCit9CisKKy8qKgorICogQ29tcGlsZS10aW1lIG1ldGFkYXRhIGZvciBhIHN0cnVjdCBmaWVsZC4KKyAqLworc3RydWN0IFRGaWVsZE1ldGEgeworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLiBVc2VkIGZvciBtYXRjaGluZyBhIFRGaWVsZE1ldGEgd2l0aCB0aGUgYWN0dWFsCisgIC8vLyBEIHN0cnVjdCBtZW1iZXIgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIFRoZSAoVGhyaWZ0KSBpZCBvZiB0aGUgZmllbGQuCisgIHNob3J0IGlkOworCisgIC8vLyBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1cmllZC4KKyAgVFJlcSByZXE7CisKKyAgLy8vIEEgY29kZSBzdHJpbmcgY29udGFpbmluZyBhIEQgZXhwcmVzc2lvbiBmb3IgdGhlIGRlZmF1bHQgdmFsdWUsIGlmIHRoZXJlCisgIC8vLyBpcyBvbmUuCisgIHN0cmluZyBkZWZhdWx0VmFsdWU7Cit9CisKKy8qKgorICogQ29tcGlsZS10aW1lIG1ldGFkYXRhIGZvciBhIHNlcnZpY2UgbWV0aG9kLgorICovCitzdHJ1Y3QgVE1ldGhvZE1ldGEgeworICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gVXNlZCBmb3IgbWF0Y2hpbmcgYSBUTWV0aG9kTWV0YSB3aXRoIHRoZSBhY3R1YWwKKyAgLy8vIG1ldGhvZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgorICBzdHJpbmcgbmFtZTsKKworICAvLy8gTWV0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhcmFtZXRlcmVzLgorICBUUGFyYW1NZXRhW10gcGFyYW1zOworCisgIC8vLyBTcGVjaWZpZXMgd2hpY2ggZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duIGJ5IHRoZSBtZXRob2QuIEFsbCBvdGhlcgorICAvLy8gZXhjZXB0aW9ucyBhcmUgY29udmVydGVkIHRvIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RlYWQuCisgIFRFeGNlcHRpb25NZXRhW10gZXhjZXB0aW9uczsKKworICAvLy8gVGhlIGZ1bmRhbWVudGFsIHR5cGUgb2YgdGhlIG1ldGhvZC4KKyAgVE1ldGhvZFR5cGUgdHlwZTsKK30KKworLyoqCisgKiBDb21waWxlLXRpbWUgbWV0YWRhdGEgZm9yIGEgc2VydmljZSBtZXRob2QgcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgVFBhcmFtTWV0YSB7CisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBDb250cmFyeSB0byBURmllbGRNZXRhLCBpdCBvbmx5IHNlcnZlcworICAvLy8gZGVjb3JhdGl2ZSBwdXJwb3NlcyBoZXJlLgorICBzdHJpbmcgbmFtZTsKKworICAvLy8gVGhlIFRocmlmdCBpZCBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBwYXJhbSBzdHJ1Y3QuCisgIHNob3J0IGlkOworCisgIC8vLyBBIGNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgYSBEIGV4cHJlc3Npb24gZm9yIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKyAgLy8vIHBhcmFtZXRlciwgaWYgYW55LgorICBzdHJpbmcgZGVmYXVsdFZhbHVlOworfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzZXJ2aWNlIG1ldGhvZCBleGNlcHRpb24gYW5ub3RhdGlvbi4KKyAqLworc3RydWN0IFRFeGNlcHRpb25NZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24gwrtyZXR1cm4gdmFsdWXCqy4gQ29udHJhcnkgdG8gVEZpZWxkTWV0YSwgaXQKKyAgLy8vIG9ubHkgc2VydmVzIGRlY29yYXRpdmUgcHVycG9zZXMgaGVyZSwgYXMgaXQgaXMgb25seSB1c2VkIGluIGNvZGUgbm90CisgIC8vLyB2aXNpYmxlIHRvIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMvc2VydmljZSBjbGllbnRzLgorICBzdHJpbmcgbmFtZTsKKworICAvLy8gVGhlIFRocmlmdCBpZCBvZiB0aGUgZXhjZXB0aW9uIGZpZWxkIGluIHRoZSByZXR1cm4gdmFsdWUgc3RydWN0LgorICBzaG9ydCBpZDsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlLgorICBzdHJpbmcgdHlwZTsKK30KKworLyoqCisgKiBBIHBhaXIgb2YgdHdvIFRQb3JvdG9jb2xzLiBUbyBiZSB1c2VkIGluIHBsYWNlcyB3aGVyZSBhIGxpc3Qgb2YgcHJvdG9jb2xzCisgKiBpcyBleHBlY3RlZCwgZm9yIHNwZWNpZnlpbmcgZGlmZmVyZW50IHByb3RvY29scyBmb3IgaW5wdXQgYW5kIG91dHB1dC4KKyAqLworc3RydWN0IFRQcm90b2NvbFBhaXIoSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpIGlmICgKKyAgaXNUUHJvdG9jb2whSW5wdXRQcm90b2NvbCAmJiBpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbAorKSB7fQorCisvKioKKyAqIHRydWUgaWYgVCBpcyBhIFRQcm90b2NvbFBhaXIuCisgKi8KK3RlbXBsYXRlIGlzVFByb3RvY29sUGFpcihUKSB7CisgIHN0YXRpYyBpZiAoaXMoVCBfID09IFRQcm90b2NvbFBhaXIhKEksIE8pLCBJLCBPKSkgeworICAgIGVudW0gaXNUUHJvdG9jb2xQYWlyID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzVFByb3RvY29sUGFpciA9IGZhbHNlOworICB9Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RhdGljIGFzc2VydChpc1RQcm90b2NvbFBhaXIhKFRQcm90b2NvbFBhaXIhKFRQcm90b2NvbCwgVFByb3RvY29sKSkpOworICBzdGF0aWMgYXNzZXJ0KCFpc1RQcm90b2NvbFBhaXIhVFByb3RvY29sKTsKK30KKworLyoqCisgKiB0cnVlIGlmIFQgaXMgYSBUUHJvdG9jb2wgb3IgYSBUUHJvdG9jb2xQYWlyLgorICovCit0ZW1wbGF0ZSBpc1RQcm90b2NvbE9yUGFpcihUKSB7CisgIGVudW0gaXNUUHJvdG9jb2xPclBhaXIgPSBpc1RQcm90b2NvbCFUIHx8IGlzVFByb3RvY29sUGFpciFUOworfQorCit1bml0dGVzdCB7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2xPclBhaXIhVFByb3RvY29sKTsKKyAgc3RhdGljIGFzc2VydChpc1RQcm90b2NvbE9yUGFpciEoVFByb3RvY29sUGFpciEoVFByb3RvY29sLCBUUHJvdG9jb2wpKSk7CisgIHN0YXRpYyBhc3NlcnQoIWlzVFByb3RvY29sT3JQYWlyIXZvaWQpOworfQorCisvKioKKyAqIHRydWUgaWYgVCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UuCisgKi8KK3RlbXBsYXRlIGlzU2VydmljZShUKSB7CisgIGVudW0gaXNTZXJ2aWNlID0gaXNCYXNlU2VydmljZSFUIHx8IGlzRGVyaXZlZFNlcnZpY2UhVDsKK30KKworLyoqCisgKiB0cnVlIGlmIFQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIG5vdCBkZXJpdmVkIGZyb20gYW5vdGhlciBzZXJ2aWNlLgorICovCit0ZW1wbGF0ZSBpc0Jhc2VTZXJ2aWNlKFQpIHsKKyAgc3RhdGljIGlmKGlzKFQgXyA9PSBpbnRlcmZhY2UpICYmCisgICAgKCFpcyhUIFRCYXNlcyA9PSBzdXBlcikgfHwgVEJhc2VzLmxlbmd0aCA9PSAwKQorICApIHsKKyAgICBlbnVtIGlzQmFzZVNlcnZpY2UgPSB0cnVlOworICB9IGVsc2UgeworICAgIGVudW0gaXNCYXNlU2VydmljZSA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBkZXJpdmVkIGZyb20gYW5vdGhlciBzZXJ2aWNlLgorICovCit0ZW1wbGF0ZSBpc0Rlcml2ZWRTZXJ2aWNlKFQpIHsKKyAgc3RhdGljIGlmKGlzKFQgXyA9PSBpbnRlcmZhY2UpICYmCisgICAgaXMoVCBUQmFzZXMgPT0gc3VwZXIpICYmIFRCYXNlcy5sZW5ndGggPT0gMQorICApIHsKKyAgICBlbnVtIGlzRGVyaXZlZFNlcnZpY2UgPSBpc1NlcnZpY2UhKFRCYXNlc1swXSk7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc0Rlcml2ZWRTZXJ2aWNlID0gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBGb3IgZGVyaXZlZCBzZXJ2aWNlcywgZ2V0cyB0aGUgYmFzZSBzZXJ2aWNlIGludGVyZmFjZS4KKyAqLwordGVtcGxhdGUgQmFzZVNlcnZpY2UoVCkgaWYgKGlzRGVyaXZlZFNlcnZpY2UhVCkgeworICBhbGlhcyBCYXNlVHlwZVR1cGxlIVRbMF0gQmFzZVNlcnZpY2U7Cit9CisKKworLyoKKyAqIENvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMuCisgKi8KKworLyoqCisgKiBNaXhpbiB0ZW1wbGF0ZSBkZWZpbmluZyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIGZvciB1c2luZyBhIHN0cnVjdCB3aXRoCisgKiBUaHJpZnQsIGFuZCBhIG1lbWJlciBjYWxsZWQgaXNTZXRGbGFncyBpZiB0aGUgc3RydWN0IGNvbnRhaW5zIGFueSBmaWVsZHMKKyAqIGZvciB3aGljaCBhbiDCu2lzIHNldMKrIGZsYWcgaXMgbmVlZGVkLgorICoKKyAqIEl0IGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHN0cnVjdHMgb3IgRXhjZXB0aW9uIGNsYXNzZXMuCisgKgorICogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0IGRlZmluaXRpb246CisgKiAtLS0KKyAqIHN0cnVjdCBGb28geworICogICBzdHJpbmcgYTsKKyAqICAgaW50IGI7CisgKiAgIGludCBjOworICoKKyAqICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAqICAgICBURmllbGRNZXRhKCJhIiwgMSksIC8vIEltcGxpY2l0bHkgb3B0aW9uYWwgKG51bGxhYmxlKS4KKyAqICAgICBURmllbGRNZXRhKCJiIiwgMiksIC8vIEltcGxpY2l0bHkgcmVxdWlyZWQgKG5vbi1udWxsYWJsZSkuCisgKiAgICAgVEZpZWxkTWV0YSgiYyIsIDMsIFRSZXEuUkVRVUlSRUQsICI0IikKKyAqICAgXSk7CisgKiB9CisgKiAtLS0KKyAqCisgKiBUU3RydWN0SGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIHRoZSBzdHJ1Y3Q6CisgKiAtLS0KKyAqIC8rKworICogICsgU2V0cyBtZW1iZXIgZmllbGROYW1lIHRvIHRoZSBnaXZlbiB2YWx1ZSBhbmQgbWFya3MgaXQgYXMgc2V0LgorICogICsKKyAqICArIEV4YW1wbGVzOgorICogICsgLS0tCisgKiAgKyBhdXRvIGYgPSBGb28oKTsKKyAqICArIGYuc2V0ISJiIigxMjM0NSk7CisgKiAgKyBhc3NlcnQoZi5pc1NldCEiYiIpOworICogICsgLS0tCisgKiAgKy8KKyAqIHZvaWQgc2V0KHN0cmluZyBmaWVsZE5hbWUpKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkgdmFsdWUpOworICoKKyAqIC8rKworICogICsgUmVzZXRzIG1lbWJlciBmaWVsZE5hbWUgdG8gdGhlIGluaXQgcHJvcGVydHkgb2YgaXRzIHR5cGUgYW5kIG1hcmtzIGl0IGFzCisgKiAgKyBub3Qgc2V0LgorICogICsKKyAqICArIEV4YW1wbGVzOgorICogICsgLS0tCisgKiAgKyAvLyBTZXQgZi5iIHRvIHNvbWUgdmFsdWUuCisgKiAgKyBhdXRvIGYgPSBGb28oKTsKKyAqICArIGYuc2V0ISJiIigxMjM0NSk7CisgKiAgKworICogICsgZi51bnNldCFiKCk7CisgKiAgKworICogICsgLy8gZi5iIGlzIG5vdyB1bnNldCBhZ2Fpbi4KKyAqICArIGFzc2VydCghZi5pc1NldCEiYiIpOworICogICsgLS0tCisgKiAgKy8KKyAqIHZvaWQgdW5zZXQoc3RyaW5nIGZpZWxkTmFtZSkoKTsKKyAqCisgKiAvKysKKyAqICArIFJldHVybnMgd2hldGhlciBtZW1iZXIgZmllbGROYW1lIGlzIHNldC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBhc3NlcnQoIWYuaXNTZXQhImIiKTsKKyAqICArIGYuc2V0ISJiIigxMjM0NSk7CisgKiAgKyBhc3NlcnQoZi5pc1NldCEiYiIpOworICogICsgLS0tCisgKiAgKy8KKyAqIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHk7CisgKgorICogLysrCisgKiAgKyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJ1Y3QuCisgKiAgKworICogICsgRXhhbXBsZXM6CisgKiAgKyAtLS0KKyAqICArIGF1dG8gZiA9IEZvbygpOworICogICsgZi5hID0gImEgc3RyaW5nIjsKKyAqICArIGFzc2VydChmLnRvU3RyaW5nKCkgPT0gYEZvbygiYSBzdHJpbmciLCAwICh1bnNldCksIDQpYCk7CisgKiAgKyAtLS0KKyAqICArLworICogc3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgKgorICogLysrCisgKiAgKyBEZXNlcmlhbGl6ZXMgdGhlIHN0cnVjdCwgc2V0dGluZyBpdHMgbWVtYmVycyB0byB0aGUgdmFsdWVzIHJlYWQgZnJvbSB0aGUKKyAqICArIHByb3RvY29sLiBGb3J3YXJkcyB0byByZWFkU3RydWN0KHRoaXMsIHByb3RvKTsKKyAqICArLworICogdm9pZCByZWFkKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKTsKKyAqCisgKiAvKysKKyAqICArIFNlcmlhbGl6ZXMgdGhlIHN0cnVjdCB0byB0aGUgdGFyZ2V0IHByb3RvY29sLiBGb3J3YXJkcyB0bworICogICsgd3JpdGVTdHJ1Y3QodGhpcywgcHJvdG8pOworICogICsvCisgKiB2b2lkIHdyaXRlKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgY29uc3QgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKTsKKyAqIC0tLQorICoKKyAqIEFkZGl0aW9uYWxseSwgYW4gb3BFcXVhbHMoKSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB3aGljaCBzaW1wbHkKKyAqIGNvbXBhcmVzIGFsbCBmaWVsZHMsIGJ1dCBkaXNyZWdhcmRzIHRoZSBpcyBzZXQgc3RydWN0LCBpZiBhbnkgKHRoZSBleGFjdAorICogc2lnbmF0dXJlIG9idmlvdXNseSBkaWZmZXJzIGJldHdlZW4gc3RydWN0cyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMpLiBUaGUKKyAqIG1ldGFkYXRhIGlzIHN0b3JlZCBpbiBhIG1hbmlmZXN0IGNvbnN0YW50IGNhbGxlZCBmaWVsZE1ldGEuCisgKgorICogTm90ZTogVG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgZmllbGRzIHdoZXJlIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQgaW4KKyAqIHRoZSBmaWVsZCBtZXRhZGF0YSwgYSBwYXJhbWV0ZXJsZXNzIHN0YXRpYyBvcENhbGwgaXMgZ2VuZXJhdGVkLCBiZWNhdXNlIEQKKyAqIGRvZXMgbm90IGFsbG93IHBhcmFtZXRlcmxlc3MgKGRlZmF1bHQpIGNvbnN0cnVjdG9ycyBmb3Igc3RydWN0cy4gVGh1cywgYmUKKyAqIGFsd2F5cyB0byB1c2UgdG8gaW5pdGlhbGl6ZSBzdHJ1Y3RzOgorICogLS0tCisgKiBGb28gZm9vOyAvLyBXcm9uZyEKKyAqIGF1dG8gZm9vID0gRm9vKCk7IC8vIENvcnJlY3QuCisgKiAtLS0KKyAqLworbWl4aW4gdGVtcGxhdGUgVFN0cnVjdEhlbHBlcnMoYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIGlmICgKKyAgaXModHlwZW9mKGZpZWxkTWV0YURhdGEpIDogVEZpZWxkTWV0YVtdKQorKSB7CisgIGltcG9ydCBzdGQuYWxnb3JpdGhtIDogYW55OworICBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuIDogaXNOdWxsYWJsZSwgTWVtYmVyVHlwZSwgbWVyZ2VGaWVsZE1ldGEsCisgICAgRmllbGROYW1lczsKKyAgaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlIDogVFByb3RvY29sLCBpc1RQcm90b2NvbDsKKworICBhbGlhcyB0eXBlb2YodGhpcykgVGhpczsKKyAgc3RhdGljIGFzc2VydChpcyhUaGlzID09IHN0cnVjdCkgfHwgaXMoVGhpcyA6IEV4Y2VwdGlvbiksCisgICAgIlRTdHJ1Y3RIZWxwZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIGEgc3RydWN0IG9yIGFuIEV4Y2VwdGlvbiBjbGFzcy4iKTsKKworICBzdGF0aWMgaWYgKFRJc1NldEZsYWdzIShUaGlzLCBmaWVsZE1ldGFEYXRhKS50dXBsZW9mLmxlbmd0aCA+IDApIHsKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIGtlZXAgaXNTZXQgZmxhZ3MgYXJvdW5kLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgLy8gY29udGFpbmVyIHN0cnVjdC4KKyAgICBUSXNTZXRGbGFncyEoVGhpcywgZmllbGRNZXRhRGF0YSkgaXNTZXRGbGFnczsKKyAgICBlbnVtIGZpZWxkTWV0YSA9IGZpZWxkTWV0YURhdGEgfiBbVEZpZWxkTWV0YSgiaXNTZXRGbGFncyIsIDAsIFRSZXEuSUdOT1JFKV07CisgIH0gZWxzZSB7CisgICAgZW51bSBmaWVsZE1ldGEgPSBmaWVsZE1ldGFEYXRhOworICB9CisKKyAgdm9pZCBzZXQoc3RyaW5nIGZpZWxkTmFtZSkoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSB2YWx1ZSkgaWYgKAorICAgIGlzKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkpCisgICkgeworICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcywgZmllbGROYW1lKSA9IHZhbHVlOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKG1peGluKCJ0aGlzLmlzU2V0RmxhZ3MuIiB+IGZpZWxkTmFtZSkpIDogYm9vbCkpIHsKKyAgICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcy5pc1NldEZsYWdzLCBmaWVsZE5hbWUpID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIHVuc2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgaWYgKGlzKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkpKSB7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YobWl4aW4oInRoaXMuaXNTZXRGbGFncy4iIH4gZmllbGROYW1lKSkgOiBib29sKSkgeworICAgICAgX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLmlzU2V0RmxhZ3MsIGZpZWxkTmFtZSkgPSBmYWxzZTsKKyAgICB9CisgICAgX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLCBmaWVsZE5hbWUpID0gTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKS5pbml0OworICB9CisKKyAgYm9vbCBpc1NldChzdHJpbmcgZmllbGROYW1lKSgpIGNvbnN0IEBwcm9wZXJ0eSBpZiAoCisgICAgaXMoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSkKKyAgKSB7CisgICAgc3RhdGljIGlmIChpc051bGxhYmxlIShNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKSkgeworICAgICAgcmV0dXJuIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcywgZmllbGROYW1lKSAhaXMgbnVsbDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyh0eXBlb2YobWl4aW4oInRoaXMuaXNTZXRGbGFncy4iIH4gZmllbGROYW1lKSkgOiBib29sKSkgeworICAgICAgcmV0dXJuIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcy5pc1NldEZsYWdzLCBmaWVsZE5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIGlzIGEgcmVxdWlyZWQgZmllbGQsIHdoaWNoIGlzIGFsd2F5cyBzZXQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaWYgKGlzKFRoaXMgXyA9PSBjbGFzcykpIHsKKyAgICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9TdHJpbmdJbXBsKCk7CisgICAgfQorCisgICAgb3ZlcnJpZGUgYm9vbCBvcEVxdWFscyhPYmplY3Qgb3RoZXIpIGNvbnN0IHsKKyAgICAgIGF1dG8gcmhzID0gY2FzdChUaGlzKW90aGVyOworICAgICAgaWYgKHJocykgeworICAgICAgICByZXR1cm4gdGhyaWZ0T3BFcXVhbHNJbXBsKHJocyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAoY2FzdCgpc3VwZXIpLm9wRXF1YWxzKG90aGVyKTsKKyAgICB9CisKKyAgICBvdmVycmlkZSBzaXplX3QgdG9IYXNoKCkgY29uc3QgeworICAgICAgcmV0dXJuIHRocmlmdFRvSGFzaEltcGwoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgcmV0dXJuIHRocmlmdFRvU3RyaW5nSW1wbCgpOworICAgIH0KKworICAgIGJvb2wgb3BFcXVhbHMocmVmIGNvbnN0IFRoaXMgb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRPcEVxdWFsc0ltcGwob3RoZXIpOworICAgIH0KKworICAgIHNpemVfdCB0b0hhc2goKSBjb25zdCBAc2FmZSBub3Rocm93IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb0hhc2hJbXBsKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgdGhyaWZ0VG9TdHJpbmdJbXBsKCkgY29uc3QgeworICAgIGltcG9ydCBzdGQuY29udiA6IHRvOworICAgIHN0cmluZyByZXN1bHQgPSBUaGlzLnN0cmluZ29mIH4gIigiOworICAgIG1peGluKHsKKyAgICAgIHN0cmluZyBjb2RlID0gIiI7CisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhKFRoaXMsIGZpZWxkTWV0YSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb2RlIH49ICJyZXN1bHQgfj0gYCwgYDtcbiI7CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSAicmVzdWx0IH49IGAiIH4gbmFtZSB+ICI6IGAgfiB0byFzdHJpbmcoY2FzdCgpdGhpcy4iIH4gbmFtZSB+ICIpO1xuIjsKKyAgICAgICAgY29kZSB+PSAiaWYgKCFpc1NldCFxeyIgfiBuYW1lIH4gIn0pIHtcbiI7CisgICAgICAgIGNvZGUgfj0gInJlc3VsdCB+PSBgICh1bnNldClgO1xuIjsKKyAgICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2RlOworICAgIH0oKSk7CisgICAgcmVzdWx0IH49ICIpIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBib29sIHRocmlmdE9wRXF1YWxzSW1wbChjb25zdCByZWYgVGhpcyByaHMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVRoaXMpIHsKKyAgICAgIGlmIChtaXhpbigidGhpcy4iIH4gbmFtZSkgIT0gbWl4aW4oInJocy4iIH4gbmFtZSkpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwcml2YXRlIHNpemVfdCB0aHJpZnRUb0hhc2hJbXBsKCkgY29uc3QgQHRydXN0ZWQgbm90aHJvdyB7CisgICAgc2l6ZV90IGhhc2ggPSAwOworICAgIGZvcmVhY2ggKGksIF87IHRoaXMudHVwbGVvZikgeworICAgICAgYXV0byB2YWwgPSB0aGlzLnR1cGxlb2ZbaV07CisgICAgICBoYXNoICs9IHR5cGVpZCh2YWwpLmdldEhhc2goJnZhbCk7CisgICAgfQorICAgIHJldHVybiBoYXNoOworICB9CisKKyAgc3RhdGljIGlmIChhbnkhYCFhLmRlZmF1bHRWYWx1ZS5lbXB0eWAobWVyZ2VGaWVsZE1ldGEhKFRoaXMsIGZpZWxkTWV0YURhdGEpKSkgeworICAgIHN0YXRpYyBpZiAoaXMoVGhpcyBfID09IGNsYXNzKSkgeworICAgICAgdGhpcygpIHsKKyAgICAgICAgbWl4aW4odGhyaWZ0RmllbGRJbml0Q29kZSEobWVyZ2VGaWVsZE1ldGEhKFRoaXMsIGZpZWxkTWV0YURhdGEpKSgidGhpcyIpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gRE1EIEBAQlVHQEA6IEhhdmUgdG8gdXNlIGF1dG8gaGVyZSB0byBhdm9pZCDCu25vIHNpemUgeWV0IGZvciBmb3J3YXJkCisgICAgICAvLyByZWZlcmVuY2XCqyBlcnJvcnMuCisgICAgICBzdGF0aWMgYXV0byBvcENhbGwoKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gVGhpcy5pbml0OworICAgICAgICBtaXhpbih0aHJpZnRGaWVsZEluaXRDb2RlIShtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKCJyZXN1bHQiKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKSB7CisgICAgLy8gTmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgZmllbGRNZXRhRGF0YSBoZXJlLCBzaW5jZSBpdCBpc24ndCBhbHJlYWR5CisgICAgLy8gcGlja2VkIHVwIGluIHNvbWUgc2l0dWF0aW9ucyAoZS5nLiB0aGUgVEFyZ3Mgc3RydWN0IGZvciBtZXRob2RzIHdpdGgKKyAgICAvLyBtdWx0aXBsZSBwYXJhbWV0ZXJzIGluIGFzeW5jX3Rlc3Rfc2VydmVycykgb3RoZXJ3aXNlLiBEdWUgdG8gYSBETUQKKyAgICAvLyBAQEJVR0BALCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgb3RoZXIgdGVtcGxhdGUgcGFyYW1ldGVycworICAgIC8vIGFzIHdlbGwuCisgICAgcmVhZFN0cnVjdCEoVGhpcywgUHJvdG9jb2wsIGZpZWxkTWV0YURhdGEsIGZhbHNlKSh0aGlzLCBwcm90byk7CisgIH0KKworICB2b2lkIHdyaXRlKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgY29uc3QgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKSB7CisgICAgd3JpdGVTdHJ1Y3QhKFRoaXMsIFByb3RvY29sLCBmaWVsZE1ldGFEYXRhLCBmYWxzZSkodGhpcywgcHJvdG8pOworICB9Cit9CisKKy8vIERNRCBAQEJVR0BAOiBIYXZpbmcgdGhpcyBpbnNpZGUgVFN0cnVjdEhlbHBlcnMgbGVhZHMgdG8gd2VpcmQgbG9va3VwIGVycm9ycworLy8gKGUuZy4gZm9yIHN0ZC5hcnJ5LmVtcHR5KS4KK3N0cmluZyB0aHJpZnRGaWVsZEluaXRDb2RlKGFsaWFzIGZpZWxkTWV0YSkoc3RyaW5nIHRoaXNOYW1lKSB7CisgIHN0cmluZyBjb2RlID0gIiI7CisgIGZvcmVhY2ggKGZpZWxkOyBmaWVsZE1ldGEpIHsKKyAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlLmVtcHR5KSBjb250aW51ZTsKKyAgICBjb2RlIH49IHRoaXNOYW1lIH4gIi4iIH4gZmllbGQubmFtZSB+ICIgPSAiIH4gZmllbGQuZGVmYXVsdFZhbHVlIH4gIjtcbiI7CisgIH0KKyAgcmV0dXJuIGNvZGU7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gQ2Fubm90IG1ha2UgdGhpcyBuZXN0ZWQgaW4gdGhlIHVuaXR0ZXN0IGJsb2NrIGR1ZSB0byBhIMK7bm8gc2l6ZSB5ZXQgZm9yCisgIC8vIGZvcndhcmQgcmVmZXJlbmNlwqsgZXJyb3IuCisgIHN0YXRpYyBzdHJ1Y3QgRm9vIHsKKyAgICBzdHJpbmcgYTsKKyAgICBpbnQgYjsKKyAgICBpbnQgYzsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKCJhIiwgMSksCisgICAgICBURmllbGRNZXRhKCJiIiwgMiwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgICBURmllbGRNZXRhKCJjIiwgMywgVFJlcS5SRVFVSVJFRCwgIjQiKQorICAgIF0pOworICB9CisKKyAgYXV0byBmID0gRm9vKCk7CisKKyAgZi5zZXQhImIiKDEyMzQ1KTsKKyAgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAgZi51bnNldCEiYiIoKTsKKyAgYXNzZXJ0KCFmLmlzU2V0ISJiIik7CisgIGYuc2V0ISJiIigxMjM0NSk7CisgIGFzc2VydChmLmlzU2V0ISJiIik7CisgIGYudW5zZXQhImIiKCk7CisKKyAgZi5hID0gImEgc3RyaW5nIjsKKyAgYXNzZXJ0KGYudG9TdHJpbmcoKSA9PSBgRm9vKGE6IGEgc3RyaW5nLCBiOiAwICh1bnNldCksIGM6IDQpYCk7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gZXBvbnltb3VzIHN0cnVjdCB3aXRoIGJvb2xlYW4gZmxhZ3MgZm9yIHRoZSBub24tcmVxdWlyZWQKKyAqIG5vbi1udWxsYWJsZSBmaWVsZHMgb2YgVC4KKyAqCisgKiBOdWxsYWJsZSBmaWVsZHMgYXJlIGp1c3Qgc2V0IHRvIG51bGwgdG8gc2lnbmFsIMK7bm90IHNldMKrLCBzbyBubyBmbGFnIGlzCisgKiBlbWl0dGVkIGZvciB0aGVtLCBldmVuIGlmIHRoZXkgYXJlIG9wdGlvbmFsLgorICoKKyAqIEluIG1vc3QgY2FzZXMsIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhpcyBkaXJlY3RseSwgYnV0IHZpYSBUU3RydWN0SGVscGVycworICogaW5zdGVhZC4KKyAqLwordGVtcGxhdGUgVElzU2V0RmxhZ3MoVCwgYWxpYXMgZmllbGRNZXRhRGF0YSkgeworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRJc1NldEZsYWdzIHtcbiI7CisgICAgZm9yZWFjaCAobWV0YTsgZmllbGRNZXRhRGF0YSkgeworICAgICAgY29kZSB+PSAic3RhdGljIGlmICghaXMoTWVtYmVyVHlwZSEoVCwgYCIgfiBtZXRhLm5hbWUgfiAiYCkpKSB7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiRmllbGQgJyIgfiBtZXRhLm5hbWUgfgorICAgICAgICAgICInIHJlZmVyZW5jZWQgaW4gbWV0YWRhdGEgbm90IHByZXNlbnQgaW4gc3RydWN0ICciIH4gVC5zdHJpbmdvZiB+ICInLiIpOworICAgICAgfTsKKyAgICAgIGNvZGUgfj0gIn0iOworICAgICAgaWYgKG1ldGEucmVxID09IFRSZXEuT1BUSU9OQUwgfHwgbWV0YS5yZXEgPT0gVFJlcS5PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBjb2RlIH49ICJlbHNlIHN0YXRpYyBpZiAoIWlzTnVsbGFibGUhKE1lbWJlclR5cGUhKFQsIGAiIH4gbWV0YS5uYW1lIH4gImApKSkge1xuIjsKKyAgICAgICAgY29kZSB+PSAiICBib29sICIgfiBtZXRhLm5hbWUgfiAiO1xuIjsKKyAgICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIH0KKyAgICB9CisgICAgY29kZSB+PSAifSI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgVGhyaWZ0IHN0cnVjdCBmcm9tIGEgcHJvdG9jb2wuCisgKgorICogVXNpbmcgdGhlIFByb3RvY29sIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlIGNvbmNyZXRlIFRQcm90b2NvbCB0byB1c2UgY2FuIGJlCisgKiBiZSBzcGVjaWZpZWQuIElmIHRoZSBwb2ludGVyU3RydWN0IHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHN0cnVjdAorICogZmllbGRzIGFyZSBleHBlY3RlZCB0byBiZSBwb2ludGVycyB0byB0aGUgYWN0dWFsIGRhdGEuIFRoaXMgaXMgdXNlZAorICogaW50ZXJuYWxseSAoY29tYmluZWQgd2l0aCBUUFJlc3VsdFN0cnVjdCkgYW5kIHVzdWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGluCisgKiB1c2VyIGNvZGUuCisgKgorICogVGhpcyBpcyBhIGZyZWUgZnVuY3Rpb24gdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWFkIGV4aXNpdGluZyBzdHJ1Y3RzIGZyb20KKyAqIHRoZSB3aXJlIHdpdGhvdXQgYWx0ZXJpbmcgdGhlaXIgZGVmaW5pdGlvbnMuCisgKi8KK3ZvaWQgcmVhZFN0cnVjdChULCBQcm90b2NvbCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwsCisgIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKShhdXRvIHJlZiBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKK3sKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlOworCisgICAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGZvciB3aGljaCB0aGVyZSBpcyBtZXRhIGluZm8gYXJlIGFjdHVhbGx5IGluIHRoZQorICAgIC8vIHBhc3NlZCBzdHJ1Y3QgdHlwZS4KKyAgICBmb3JlYWNoIChmaWVsZDsgbWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpKSB7CisgICAgICBjb2RlIH49ICJzdGF0aWMgYXNzZXJ0KGlzKE1lbWJlclR5cGUhKFQsIGAiIH4gZmllbGQubmFtZSB+ICJgKSkpO1xuIjsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBjb2RlIHN0cmluZyBmb3IgcmVhZGluZyBhIHZhbHVlIG9mIHR5cGUgRiBvZmYgdGhlIHdpcmUgYW5kCisgICAgLy8gYXNzaWduaW5nIGl0IHRvIHYuIFRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZQorICAgIC8vIGFyZSBubyBjb25mbGljdGluZyB2YXJpYWJsZSBuYW1lcyBvbiByZWN1cnNpdmUgY2FsbHMuCisgICAgc3RyaW5nIHJlYWRWYWx1ZUNvZGUoVmFsdWVUeXBlKShzdHJpbmcgdiwgc2l6ZV90IGxldmVsID0gMCkgeworICAgICAgLy8gU29tZSBub24tYW1iaWdvdXMgbmFtZXMgdG8gdXNlIChzaGFkb3dpbmcgaXMgbm90IGFsbG93ZWQgaW4gRCkuCisgICAgICBpbW11dGFibGUgaSA9ICJpIiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgZWxlbSA9ICJlbGVtIiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUga2V5ID0gImtleSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGxpc3QgPSAibGlzdCIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIG1hcCA9ICJtYXAiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBzZXQgPSAic2V0IiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgdmFsdWUgPSAidmFsdWUiIH4gdG8hc3RyaW5nKGxldmVsKTsKKworICAgICAgYWxpYXMgRnVsbHlVbnF1YWwhVmFsdWVUeXBlIEY7CisKKyAgICAgIHN0YXRpYyBpZiAoaXMoRiA9PSBib29sKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRCb29sKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gYnl0ZSkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkQnl0ZSgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGRvdWJsZSkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkRG91YmxlKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gc2hvcnQpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEkxNigpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGludCkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkSTMyKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gbG9uZykpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkSTY0KCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgOiBzdHJpbmcpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZFN0cmluZygpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGVudW0pKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IGNhc3QodHlwZW9mKCIgfiB2IH4gIikpcC5yZWFkSTMyKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IEVbXSwgRSkpIHsKKyAgICAgICAgcmV0dXJuICJ7XG4iIH4KKyAgICAgICAgICAiYXV0byAiIH4gbGlzdCB+ICIgPSBwLnJlYWRMaXN0QmVnaW4oKTtcbiIgfgorICAgICAgICAgIC8vIFRPRE86IENoZWNrIGVsZW1lbnQgdHlwZSBoZXJlPworICAgICAgICAgIHYgfiAiID0gbmV3IHR5cGVvZigiIH4gdiB+ICJbMF0pWyIgfiBsaXN0IH4gIi5zaXplXTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gaSB+ICI7IDAgLi4gIiB+IGxpc3QgfiAiLnNpemUpIHtcbiIgfgorICAgICAgICAgICAgcmVhZFZhbHVlQ29kZSFFKHYgfiAiWyIgfiBpIH4gIl0iLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLnJlYWRMaXN0RW5kKCk7XG4iIH4KKyAgICAgICAgIn0iOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogVltLXSwgSywgVikpIHsKKyAgICAgICAgcmV0dXJuICJ7XG4iIH4KKyAgICAgICAgICAiYXV0byAiIH4gbWFwIH4gIiA9IHAucmVhZE1hcEJlZ2luKCk7IiB+CisgICAgICAgICAgdiB+ICIgPSBudWxsO1xuIiB+CisgICAgICAgICAgLy8gVE9ETzogQ2hlY2sga2V5L3ZhbHVlIHR5cGVzIGhlcmU/CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBpIH4gIjsgMCAuLiAiIH4gbWFwIH4gIi5zaXplKSB7XG4iIH4KKyAgICAgICAgICAgICJGdWxseVVucXVhbCEodHlwZW9mKCIgfiB2IH4gIi5rZXlzWzBdKSkgIiB+IGtleSB+ICI7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhSyhrZXksIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAgICJ0eXBlb2YoIiB+IHYgfiAiLnZhbHVlc1swXSkgIiB+IHZhbHVlIH4gIjtcbiIgfgorICAgICAgICAgICAgcmVhZFZhbHVlQ29kZSFWKHZhbHVlLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICB2IH4gIltjYXN0KHR5cGVvZigiIH4gdiB+ICIua2V5c1swXSkpIiB+IGtleSB+ICJdID0gIiB+IHZhbHVlIH4gIjtcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC5yZWFkTWFwRW5kKCk7IiB+CisgICAgICAgICJ9IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IEhhc2hTZXQhKEUpLCBFKSkgeworICAgICAgICByZXR1cm4gIntcbiIgfgorICAgICAgICAgICJhdXRvICIgfiBzZXQgfiAiID0gcC5yZWFkU2V0QmVnaW4oKTsiIH4KKyAgICAgICAgICAvLyBUT0RPOiBDaGVjayBlbGVtZW50IHR5cGUgaGVyZT8KKyAgICAgICAgICB2IH4gIiA9IG5ldyB0eXBlb2YoIiB+IHYgfiAiKSgpO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBpIH4gIjsgMCAuLiAiIH4gc2V0IH4gIi5zaXplKSB7XG4iIH4KKyAgICAgICAgICAgICJ0eXBlb2YoIiB+IHYgfiAiW11bMF0pICIgfiBlbGVtIH4gIjtcbiIgfgorICAgICAgICAgICAgcmVhZFZhbHVlQ29kZSFFKGVsZW0sIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAgIHYgfiAiIH49ICIgfiBlbGVtIH4gIjtcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC5yZWFkU2V0RW5kKCk7IiB+CisgICAgICAgICJ9IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gc3RydWN0KSB8fCBpcyhGIDogVEV4Y2VwdGlvbikpIHsKKyAgICAgICAgc3RhdGljIGlmIChpcyhGID09IHN0cnVjdCkpIHsKKyAgICAgICAgICBhdXRvIHJlc3VsdCA9IHYgfiAiID0gdHlwZW9mKCIgfiB2IH4gIikoKTtcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXV0byByZXN1bHQgPSB2IH4gIiA9IG5ldyB0eXBlb2YoIiB+IHYgfiAiKSgpO1xuIjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIEYuaW5pdC5yZWFkKFRQcm90b2NvbC5pbml0KSkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gdiB+ICIucmVhZChwKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCB+PSAicmVhZFN0cnVjdCgiIH4gdiB+ICIsIHApOyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gRi5zdHJpbmdvZik7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIHJlYWRGaWVsZENvZGUoRmllbGRUeXBlKShzdHJpbmcgbmFtZSwgc2hvcnQgaWQsIFRSZXEgcmVxKSB7CisgICAgICBzdGF0aWMgaWYgKHBvaW50ZXJTdHJ1Y3QgJiYgaXNQb2ludGVyIUZpZWxkVHlwZSkgeworICAgICAgICBpbW11dGFibGUgdiA9ICIoKnMuIiB+IG5hbWUgfiAiKSI7CisgICAgICAgIGFsaWFzIFBvaW50ZXJUYXJnZXQhRmllbGRUeXBlIEY7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbW11dGFibGUgdiA9ICJzLiIgfiBuYW1lOworICAgICAgICBhbGlhcyBGaWVsZFR5cGUgRjsKKyAgICAgIH0KKworICAgICAgc3RyaW5nIGNvZGUgPSAiY2FzZSAiIH4gdG8hc3RyaW5nKGlkKSB+ICI6XG4iOworICAgICAgY29kZSB+PSAiaWYgKGYudHlwZSA9PSAiIH4gZFRvVFR5cGVTdHJpbmchRiB+ICIpIHtcbiI7CisgICAgICBjb2RlIH49IHJlYWRWYWx1ZUNvZGUhRih2KSB+ICJcbiI7CisgICAgICBpZiAocmVxID09IFRSZXEuUkVRVUlSRUQpIHsKKyAgICAgICAgLy8gRm9yIHJlcXVpcmVkIGZpZWxkcywgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGlzU2V0IHZhcmlhYmxlLgorICAgICAgICBjb2RlIH49ICJpc1NldF8iIH4gbmFtZSB+ICIgPSB0cnVlO1xuIjsKKyAgICAgIH0gZWxzZSBpZiAoIWlzTnVsbGFibGUhRil7CisgICAgICAgIGNvZGUgfj0gInMuaXNTZXRGbGFncy4iIH4gbmFtZSB+ICIgPSB0cnVlO1xuIjsKKyAgICAgIH0KKyAgICAgIGNvZGUgfj0gIn0gZWxzZSBza2lwKHAsIGYudHlwZSk7XG4iOworICAgICAgY29kZSB+PSAiYnJlYWs7XG4iOworICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgLy8gQ29kZSBmb3IgdGhlIGxvY2FsIGJvb2xlYW4gZmxhZ3MgdXNlZCB0byBtYWtlIHN1cmUgcmVxdWlyZWQgZmllbGRzIGhhdmUKKyAgICAvLyBiZWVuIGZvdW5kLgorICAgIHN0cmluZyBpc1NldEZsYWdDb2RlID0gIiI7CisKKyAgICAvLyBDb2RlIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBmbGFncyBmb3IgdGhlIHJlcXVpcmVkIGZpZWxkcyBhcmUgdHJ1ZS4KKyAgICBzdHJpbmcgaXNTZXRDaGVja0NvZGUgPSAiIjsKKworICAgIC8vLyBDb2RlIGZvciB0aGUgY2FzZSBzdGF0ZW1lbnRzIHN0b3JpbmcgdGhlIGZpZWxkcyB0byB0aGUgcmVzdWx0IHN0cnVjdC4KKyAgICBzdHJpbmcgcmVhZE1lbWJlcnNDb2RlID0gIiI7CisKKyAgICAvLyBUaGUgbGFzdCBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGlkIOKAkyBmaWVsZHMgd2l0aCBubyBtZXRhIGluZm9ybWF0aW9uCisgICAgLy8gYXJlIGFzc2lnbmVkIChpbiBsZXhpY2FsIG9yZGVyKSBkZXNjZW5kaW5nIG5lZ2F0aXZlIGlkcywgc3RhcnRpbmcgd2l0aAorICAgIC8vIC0xLCBqdXN0IGxpa2UgdGhlIFRocmlmdCBjb21waWxlciBkb2VzLgorICAgIHNob3J0IGxhc3RJZDsKKworICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVCkgeworICAgICAgZW51bSByZXEgPSBtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpOworICAgICAgaWYgKHJlcSA9PSBUUmVxLlJFUVVJUkVEKSB7CisgICAgICAgIC8vIEZvciByZXF1aXJlZCBmaWVsZHMsIGdlbmVyYXRlIGxvY2FsIGJvb2wgZmxhZ3MgdG8ga2VlcCB0cmFjaworICAgICAgICAvLyB3aGV0aGVyIHRoZSBmaWVsZCBoYXMgYmVlbiBlbmNvdW50ZXJlZC4KKyAgICAgICAgaW1tdXRhYmxlIG4gPSAiaXNTZXRfIiB+IG5hbWU7CisgICAgICAgIGlzU2V0RmxhZ0NvZGUgfj0gImJvb2wgIiB+IG4gfiAiO1xuIjsKKyAgICAgICAgaXNTZXRDaGVja0NvZGUgfj0gImVuZm9yY2UoIiB+IG4gfiAiLCBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCIgfgorICAgICAgICAgICJgUmVxdWlyZWQgZmllbGQgJyIgfiBuYW1lIH4gIicgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YWAsICIgfgorICAgICAgICAgICJUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpKTtcbiI7CisgICAgICB9CisKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSksIG5hbWUpOworICAgICAgc3RhdGljIGlmIChtZXRhLmVtcHR5KSB7CisgICAgICAgIC0tbGFzdElkOworICAgICAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLmJhc2UucmVhZFN0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgZmllbGQgJyIgfiBuYW1lIH4gIicgaW4gc3RydWN0ICciIH4KKyAgICAgICAgICAgIFQuc3RyaW5nb2YgfiAiJy4gQXNzaWduZWQgaWQ6ICIgfiB0byFzdHJpbmcobGFzdElkKSB+ICIuYCk7XG4iOworICAgICAgICB9CisgICAgICAgIHJlYWRNZW1iZXJzQ29kZSB+PSByZWFkRmllbGRDb2RlIShNZW1iZXJUeXBlIShULCBuYW1lKSkoCisgICAgICAgICAgbmFtZSwgbGFzdElkLCByZXEpOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAocmVxICE9IFRSZXEuSUdOT1JFKSB7CisgICAgICAgIHJlYWRNZW1iZXJzQ29kZSB+PSByZWFkRmllbGRDb2RlIShNZW1iZXJUeXBlIShULCBuYW1lKSkoCisgICAgICAgICAgbmFtZSwgbWV0YS5mcm9udC5pZCwgcmVxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlIH49IGlzU2V0RmxhZ0NvZGU7CisgICAgY29kZSB+PSAicC5yZWFkU3RydWN0QmVnaW4oKTtcbiI7CisgICAgY29kZSB+PSAid2hpbGUgKHRydWUpIHtcbiI7CisgICAgY29kZSB+PSAiYXV0byBmID0gcC5yZWFkRmllbGRCZWdpbigpO1xuIjsKKyAgICBjb2RlIH49ICJpZiAoZi50eXBlID09IFRUeXBlLlNUT1ApIGJyZWFrO1xuIjsKKyAgICBjb2RlIH49ICJzd2l0Y2goZi5pZCkge1xuIjsKKyAgICBjb2RlIH49IHJlYWRNZW1iZXJzQ29kZTsKKyAgICBjb2RlIH49ICJkZWZhdWx0OiBza2lwKHAsIGYudHlwZSk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAicC5yZWFkRmllbGRFbmQoKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICBjb2RlIH49ICJwLnJlYWRTdHJ1Y3RFbmQoKTtcbiI7CisgICAgY29kZSB+PSBpc1NldENoZWNrQ29kZTsKKworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBzdHJ1Y3QgdG8gdGhlIHRhcmdldCBwcm90b2NvbC4KKyAqCisgKiBVc2luZyB0aGUgUHJvdG9jb2wgdGVtcGxhdGUgcGFyYW1ldGVyLCB0aGUgY29uY3JldGUgVFByb3RvY29sIHRvIHVzZSBjYW4gYmUKKyAqIGJlIHNwZWNpZmllZC4gSWYgdGhlIHBvaW50ZXJTdHJ1Y3QgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGUgc3RydWN0CisgKiBmaWVsZHMgYXJlIGV4cGVjdGVkIHRvIGJlIHBvaW50ZXJzIHRvIHRoZSBhY3R1YWwgZGF0YS4gVGhpcyBpcyB1c2VkCisgKiBpbnRlcm5hbGx5IChjb21iaW5lZCB3aXRoIFRQYXJnc1N0cnVjdCkgYW5kIHVzdWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGluCisgKiB1c2VyIGNvZGUuCisgKgorICogVGhpcyBpcyBhIGZyZWUgZnVuY3Rpb24gdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWFkIGV4aXNpdGluZyBzdHJ1Y3RzIGZyb20KKyAqIHRoZSB3aXJlIHdpdGhvdXQgYWx0ZXJpbmcgdGhlaXIgZGVmaW5pdGlvbnMuCisgKi8KK3ZvaWQgd3JpdGVTdHJ1Y3QoVCwgUHJvdG9jb2wsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsLAorICBib29sIHBvaW50ZXJTdHJ1Y3QgPSBmYWxzZSkgKGNvbnN0IFQgcywgUHJvdG9jb2wgcCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKQoreworICBtaXhpbih7CisgICAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGZvciB3aGljaCB0aGVyZSBpcyBtZXRhIGluZm8gYXJlIGFjdHVhbGx5IGluIHRoZQorICAgIC8vIHBhc3NlZCBzdHJ1Y3QgdHlwZS4KKyAgICBzdHJpbmcgY29kZSA9ICIiOworICAgIGZvcmVhY2ggKGZpZWxkOyBtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSkpIHsKKyAgICAgIGNvZGUgfj0gInN0YXRpYyBhc3NlcnQoaXMoTWVtYmVyVHlwZSEoVCwgYCIgfiBmaWVsZC5uYW1lIH4gImApKSk7XG4iOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgcmVxdWlyZWQgbnVsbGFibGUgbWVtYmVycyBhcmUgbm9uLW51bGwuCisgICAgLy8gV09SS0FST1VORDogVG8gc3RvcCBMREMgZnJvbSBlbWl0dGluZyB0aGUgbWFuaWZlc3QgY29uc3RhbnQgwrttZXRhwqsgYmVsb3cKKyAgICAvLyBpbnRvIHRoZSB3cml0ZVN0cnVjdCBmdW5jdGlvbiBib2R5IHRoaXMgaXMgaW5zaWRlIHRoZSBzdHJpbmcgbWl4aW4KKyAgICAvLyBibG9jayDigJMgdGhlIGNvZGUgd291bGRuJ3QgZGVwZW5kIG9uIGl0ICh0aGlzIGlzIGFuIExEQyBidWcsIGFuZCBiZWNhdXNlCisgICAgLy8gb2YgaXQgYSBuZXcgYXJyYXkgd291bGQgYmUgYWxsb2NhdGVkIG9uIGVhY2ggbWV0aG9kIGludm9jYXRpb24gYXQgcnVudGltZSkuCisgICAgZm9yZWFjaCAobmFtZTsgU3RhdGljRmlsdGVyISgKKyAgICAgIENvbXBvc2UhKGlzTnVsbGFibGUsIFBBcHBseSEoTWVtYmVyVHlwZSwgVCkpLAorICAgICAgRmllbGROYW1lcyFUCisgICAgKSkgeworICAgICAgIHN0YXRpYyBpZiAobWVtYmVyUmVxIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKSA9PSBUUmVxLlJFUVVJUkVEKSB7CisgICAgICAgICBjb2RlIH49ICJlbmZvcmNlKF9fdHJhaXRzKGdldE1lbWJlciwgcywgYCIgfiBuYW1lIH4gImApICFpcyBudWxsLAorICAgICAgICAgICBuZXcgVEV4Y2VwdGlvbihgUmVxdWlyZWQgZmllbGQgJyIgfiBuYW1lIH4gIicgaXMgbnVsbC5gKSk7XG4iOworICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKKworICBwLndyaXRlU3RydWN0QmVnaW4oVFN0cnVjdChULnN0cmluZ29mKSk7CisgIG1peGluKHsKKyAgICBzdHJpbmcgd3JpdGVWYWx1ZUNvZGUoVmFsdWVUeXBlKShzdHJpbmcgdiwgc2l6ZV90IGxldmVsID0gMCkgeworICAgICAgLy8gU29tZSBub24tYW1iaWdvdXMgbmFtZXMgdG8gdXNlIChzaGFkb3dpbmcgaXMgbm90IGFsbG93ZWQgaW4gRCkuCisgICAgICBpbW11dGFibGUgZWxlbSA9ICJlbGVtIiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUga2V5ID0gImtleSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIHZhbHVlID0gInZhbHVlIiB+IHRvIXN0cmluZyhsZXZlbCk7CisKKyAgICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVZhbHVlVHlwZSBGOworICAgICAgc3RhdGljIGlmIChpcyhGID09IGJvb2wpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUJvb2woIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBieXRlKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVCeXRlKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gZG91YmxlKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVEb3VibGUoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBzaG9ydCkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTE2KCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gaW50KSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVJMzIoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBsb25nKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVJNjQoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA6IHN0cmluZykpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlU3RyaW5nKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gZW51bSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTMyKGNhc3QoaW50KSIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IEVbXSwgRSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlTGlzdEJlZ2luKFRMaXN0KCIgfiBkVG9UVHlwZVN0cmluZyFFIH4gIiwgIiB+IHYgfgorICAgICAgICAgICIubGVuZ3RoKSk7XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGVsZW0gfiAiOyAiIH4gdiB+ICIpIHtcbiIgfgorICAgICAgICAgICAgd3JpdGVWYWx1ZUNvZGUhRShlbGVtLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLndyaXRlTGlzdEVuZCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVNYXBCZWdpbihUTWFwKCIgfiBkVG9UVHlwZVN0cmluZyFLIH4gIiwgIiB+CisgICAgICAgICAgZFRvVFR5cGVTdHJpbmchViB+ICIsICIgfiB2IH4gIi5sZW5ndGgpKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4ga2V5IH4gIiwgIiB+IHZhbHVlIH4gIjsgIiB+IHYgfiAiKSB7XG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIUsoa2V5LCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICB3cml0ZVZhbHVlQ29kZSFWKHZhbHVlLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLndyaXRlTWFwRW5kKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IEhhc2hTZXQhRSwgRSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlU2V0QmVnaW4oVFNldCgiIH4gZFRvVFR5cGVTdHJpbmchRSB+ICIsICIgfiB2IH4KKyAgICAgICAgICAiLmxlbmd0aCkpO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBlbGVtIH4gIjsgIiB+IHYgfiAiW10pIHtcbiIgfgorICAgICAgICAgICAgd3JpdGVWYWx1ZUNvZGUhRShlbGVtLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLndyaXRlU2V0RW5kKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gc3RydWN0KSB8fCBpcyhGIDogVEV4Y2VwdGlvbikpIHsKKyAgICAgICAgc3RhdGljIGlmIChfX3RyYWl0cyhjb21waWxlcywgRi5pbml0LndyaXRlKFRQcm90b2NvbC5pbml0KSkpIHsKKyAgICAgICAgICByZXR1cm4gdiB+ICIud3JpdGUocCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gIndyaXRlU3RydWN0KCIgfiB2IH4gIiwgcCk7IjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBGLnN0cmluZ29mKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgd3JpdGVGaWVsZENvZGUoRmllbGRUeXBlKShzdHJpbmcgbmFtZSwgc2hvcnQgaWQsIFRSZXEgcmVxKSB7CisgICAgICBzdHJpbmcgY29kZTsKKyAgICAgIGlmICghcG9pbnRlclN0cnVjdCAmJiByZXEgPT0gVFJlcS5PUFRJT05BTCkgeworICAgICAgICBjb2RlIH49ICJpZiAocy5pc1NldCFgIiB+IG5hbWUgfiAiYCkge1xuIjsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGlmIChwb2ludGVyU3RydWN0ICYmIGlzUG9pbnRlciFGaWVsZFR5cGUpIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAiKCpzLiIgfiBuYW1lIH4gIikiOworICAgICAgICBhbGlhcyBQb2ludGVyVGFyZ2V0IUZpZWxkVHlwZSBGOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAicy4iIH4gbmFtZTsKKyAgICAgICAgYWxpYXMgRmllbGRUeXBlIEY7CisgICAgICB9CisKKyAgICAgIGNvZGUgfj0gInAud3JpdGVGaWVsZEJlZ2luKFRGaWVsZChgIiB+IG5hbWUgfiAiYCwgIiB+IGRUb1RUeXBlU3RyaW5nIUYgfgorICAgICAgICAiLCAiIH4gdG8hc3RyaW5nKGlkKSB+ICIpKTtcbiI7CisgICAgICBjb2RlIH49IHdyaXRlVmFsdWVDb2RlIUYodikgfiAiXG4iOworICAgICAgY29kZSB+PSAicC53cml0ZUZpZWxkRW5kKCk7XG4iOworCisgICAgICBpZiAoIXBvaW50ZXJTdHJ1Y3QgJiYgcmVxID09IFRSZXEuT1BUSU9OQUwpIHsKKyAgICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8vIFRoZSBsYXN0IGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWQg4oCTIGZpZWxkcyB3aXRoIG5vIG1ldGEgaW5mb3JtYXRpb24KKyAgICAvLyBhcmUgYXNzaWduZWQgKGluIGxleGljYWwgb3JkZXIpIGRlc2NlbmRpbmcgbmVnYXRpdmUgaWRzLCBzdGFydGluZyB3aXRoCisgICAgLy8gLTEsIGp1c3QgbGlrZSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGRvZXMuCisgICAgc2hvcnQgbGFzdElkOworCisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVQpIHsKKyAgICAgIGFsaWFzIE1lbWJlclR5cGUhKFQsIG5hbWUpIEY7CisgICAgICBlbnVtIHJlcSA9IG1lbWJlclJlcSEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSk7CisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAobWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpLCBuYW1lKTsKKyAgICAgIGlmIChtZXRhLmVtcHR5KSB7CisgICAgICAgIC0tbGFzdElkOworICAgICAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLmJhc2Uud3JpdGVTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIGZpZWxkICciIH4gbmFtZSB+ICInIGluIHN0cnVjdCAnIiB+CisgICAgICAgICAgICBULnN0cmluZ29mIH4gIicuIEFzc2lnbmVkIGlkOiAiIH4gdG8hc3RyaW5nKGxhc3RJZCkgfiAiLmApO1xuIjsKKyAgICAgICAgfQorICAgICAgICBjb2RlIH49IHdyaXRlRmllbGRDb2RlIUYobmFtZSwgbGFzdElkLCByZXEpOworICAgICAgfSBlbHNlIGlmIChyZXEgIT0gVFJlcS5JR05PUkUpIHsKKyAgICAgICAgY29kZSB+PSB3cml0ZUZpZWxkQ29kZSFGKG5hbWUsIG1ldGEuZnJvbnQuaWQsIHJlcSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7CisgIHAud3JpdGVGaWVsZFN0b3AoKTsKKyAgcC53cml0ZVN0cnVjdEVuZCgpOworfQorCit1bml0dGVzdCB7CisgIC8vIEVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBhdCBsZWFzdCBjb21waWxlcyBmb3IgdGhlIGJhc2ljIGZpZWxkIHR5cGUKKyAgLy8gY29tYmluYXRpb25zLiBGdW5jdGlvbmFsaXR5IGNoZWNrcyBhcmUgY292ZXJlZCBieSB0aGUgcmVzdCBvZiB0aGUgdGVzdAorICAvLyBzdWl0ZS4KKworICBzdGF0aWMgc3RydWN0IFRlc3QgeworICAgIC8vIE5vbi1udWxsYWJsZS4KKyAgICBpbnQgYTE7CisgICAgaW50IGEyOworICAgIGludCBhMzsKKyAgICBpbnQgYTQ7CisKKyAgICAvLyBOdWxsYWJsZS4KKyAgICBzdHJpbmcgYjE7CisgICAgc3RyaW5nIGIyOworICAgIHN0cmluZyBiMzsKKyAgICBzdHJpbmcgYjQ7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYTEiLCAxLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICAgIFRGaWVsZE1ldGEoImEyIiwgMiwgVFJlcS5PUFRJT05BTCksCisgICAgICBURmllbGRNZXRhKCJhMyIsIDMsIFRSZXEuUkVRVUlSRUQpLAorICAgICAgVEZpZWxkTWV0YSgiYTQiLCA0LCBUUmVxLklHTk9SRSksCisgICAgICBURmllbGRNZXRhKCJiMSIsIDUsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgICAgVEZpZWxkTWV0YSgiYjIiLCA2LCBUUmVxLk9QVElPTkFMKSwKKyAgICAgIFRGaWVsZE1ldGEoImIzIiwgNywgVFJlcS5SRVFVSVJFRCksCisgICAgICBURmllbGRNZXRhKCJiNCIsIDgsIFRSZXEuSUdOT1JFKSwKKyAgICBdKTsKKyAgfQorCisgIHN0YXRpYyBhc3NlcnQoX190cmFpdHMoY29tcGlsZXMsIHsgVGVzdCB0OyB0LnJlYWQoY2FzdChUUHJvdG9jb2wpbnVsbCk7IH0pKTsKKyAgc3RhdGljIGFzc2VydChfX3RyYWl0cyhjb21waWxlcywgeyBUZXN0IHQ7IHQud3JpdGUoY2FzdChUUHJvdG9jb2wpbnVsbCk7IH0pKTsKK30KKworLy8gRW5zdXJlIG9wRXF1YWxzIGFuZCB0b0hhc2ggY29uc2lzdGVuY3kuCit1bml0dGVzdCB7CisgIHN0cnVjdCBUZXN0RXF1YWxzIHsKKyAgICBpbnQgYTE7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYTEiLCAxLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICBdKTsKKyAgfQorCisgIFRlc3RFcXVhbHMgYSwgYjsKKyAgYXNzZXJ0KGEgPT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpID09IGIudG9IYXNoKCkpOworCisgIGEuYTEgPSA0MjsKKyAgYXNzZXJ0KGEgIT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpICE9IGIudG9IYXNoKCkpOworCisgIGIuYTEgPSA0MjsKKyAgYXNzZXJ0KGEgPT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpID09IGIudG9IYXNoKCkpOworfQorCitwcml2YXRlIHsKKyAgLyoKKyAgICogUmV0dXJucyBhIEQgY29kZSBzdHJpbmcgY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgVFR5cGUgdmFsdWUgZm9yIGEgcGFzc2VkCisgICAqIEQgdHlwZSwgZS5nLiBkVG9UVHlwZVN0cmluZyFieXRlID09ICJUVHlwZS5CWVRFIi4KKyAgICovCisgIHRlbXBsYXRlIGRUb1RUeXBlU3RyaW5nKFQpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuQk9PTCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBieXRlKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5CWVRFIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGRvdWJsZSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuRE9VQkxFIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHNob3J0KSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5JMTYiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gaW50KSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5JMzIiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gbG9uZykpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTY0IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogc3RyaW5nKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5TVFJJTkciOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTMyIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBVW10sIFUpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkxJU1QiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLk1BUCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5TRVQiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gc3RydWN0KSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5TVFJVQ1QiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5TVFJVQ1QiOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExN2IwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogZmluZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogaXNTb21lRnVuY3Rpb24sIFBhcmFtZXRlclN0b3JhZ2VDbGFzcywKKyAgUGFyYW1ldGVyU3RvcmFnZUNsYXNzVHVwbGUsIFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jdGZlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworCisvKioKKyAqIFRocmlmdCBzZXJ2aWNlIGNsaWVudCwgd2hpY2ggaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgYnkgc3luY2hyb25vdXNseQorICogY2FsbGluZyBhIHNlcnZlciBvdmVyIGEgVFByb3RvY29sLgorICoKKyAqIFRDbGllbnRCYXNlIHNpbXBseSBleHRlbmRzIEludGVyZmFjZSB3aXRoIGdlbmVyaWMgaW5wdXQvb3V0cHV0IHByb3RvY29sCisgKiBwcm9wZXJ0aWVzIHRvIHNlcnZlIGFzIGEgc3VwZXJ0eXBlIGZvciBhbGwgVENsaWVudHMgZm9yIHRoZSBzYW1lIHNlcnZpY2UsCisgKiB3aGljaCBtaWdodCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgY29uY3JldGUgcHJvdG9jb2wgdHlwZXMgKHRoZXJlCisgKiBpcyBubyBjb3ZhcmlhbmNlIGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlcnMpLiBJZiBJbnRlcmZhY2UgaXMgZGVyaXZlZAorICogZnJvbSBhbm90aGVyIGludGVyZmFjZSBCYXNlSW50ZXJmYWNlLCBpdCBhbHNvIGV4dGVuZHMKKyAqIFRDbGllbnRCYXNlIUJhc2VJbnRlcmZhY2UuCisgKgorICogVENsaWVudCBpcyB0aGUgY2xhc3MgdGhhdCBhY3R1YWxseSBpbXBsZW1lbnRzIFRDbGllbnRCYXNlLiBKdXN0IGFzCisgKiBUQ2xpZW50QmFzZSwgaXQgaXMgYWxzbyBkZXJpdmVkIGZyb20gVENsaWVudCFCYXNlSW50ZXJmYWNlIGZvciBpbmhlcml0aW5nCisgKiBzZXJ2aWNlcy4KKyAqCisgKiBUQ2xpZW50IHRha2VzIHR3byBvcHRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yCisgKiBzcGVjaWZ5aW5nIHRoZSBhY3R1YWwgVFByb3RvY29sIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIG9wdGltaXphdGlvbgorICogcHVycG9zZXMsIGFzIHZpcnR1YWwgY2FsbHMgY2FuIGNvbXBsZXRlbHkgYmUgZWxpbWluYXRlZCB0aGVuLiBJZgorICogT3V0cHV0UHJvdG9jb2wgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcworICogSW5wdXRQcm90b2NvbC4gVGhlIHByb3RvY29sIHByb3BlcnRpZXMgZGVmaW5lZCBieSBUQ2xpZW50QmFzZSBhcmUgZXhwb3NlZAorICogd2l0aCB0aGVpciBjb25jcmV0ZSB0eXBlIChyZXR1cm4gdHlwZSBjb3ZhcmlhbmNlKS4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBpbXBsZW1lbnRpbmcgVENsaWVudEJhc2UhSW50ZXJmYWNlLCBUQ2xpZW50IG9mZmVycyB0aGUKKyAqIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnM6CisgKiAtLS0KKyAqIHRoaXMoSW5wdXRQcm90b2NvbCBpcHJvdCwgT3V0cHV0UHJvdG9jb2wgb3Byb3QpOworICogLy8gT25seSBpZiBpcyhJbnB1dFByb3RvY29sID09IE91dHB1dFByb3RvY29sKSwgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29sCisgKiAvLyBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0OgorICogdGhpcyhJbnB1dFByb3RvY29sIHByb3QpOworICogLS0tCisgKgorICogVGhlIHNlcXVlbmNlIGlkIG9mIHRoZSBtZXRob2QgY2FsbHMgc3RhcnRzIGF0IHplcm8gYW5kIGlzIGF1dG9tYXRpY2FsbHkKKyAqIGluY3JlbWVudGVkLgorICovCitpbnRlcmZhY2UgVENsaWVudEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNCYXNlU2VydmljZSFJbnRlcmZhY2UpIDogSW50ZXJmYWNlIHsKKyAgLyoqCisgICAqIFRoZSBpbnB1dCBwcm90b2NvbCB1c2VkIGJ5IHRoZSBjbGllbnQuCisgICAqLworICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCgpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogVGhlIG91dHB1dCBwcm90b2NvbCB1c2VkIGJ5IHRoZSBjbGllbnQuCisgICAqLworICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2woKSBAcHJvcGVydHk7Cit9CisKKy8vLyBEaXR0bworaW50ZXJmYWNlIFRDbGllbnRCYXNlKEludGVyZmFjZSkgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRDbGllbnRCYXNlIShCYXNlU2VydmljZSFJbnRlcmZhY2UpLCBJbnRlcmZhY2Uge30KKworLy8vIERpdHRvCit0ZW1wbGF0ZSBUQ2xpZW50KEludGVyZmFjZSwgSW5wdXRQcm90b2NvbCA9IFRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wgPSB2b2lkKSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgaXNUUHJvdG9jb2whSW5wdXRQcm90b2NvbCAmJgorICAoaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wgfHwgaXMoT3V0cHV0UHJvdG9jb2wgPT0gdm9pZCkpCispIHsKKyAgbWl4aW4oeworICAgIHN0YXRpYyBpZiAoaXNEZXJpdmVkU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRDbGllbnQgOiBUQ2xpZW50IShCYXNlU2VydmljZSFJbnRlcmZhY2UsICIgfgorICAgICAgICAiSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpLCBUQ2xpZW50QmFzZSFJbnRlcmZhY2Uge1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgdGhpcyhJUHJvdCBpcHJvdCwgT1Byb3Qgb3Byb3QpIHsKKyAgICAgICAgICBzdXBlcihpcHJvdCwgb3Byb3QpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGlmIChpcyhJUHJvdCA9PSBPUHJvdCkpIHsKKyAgICAgICAgICB0aGlzKElQcm90IHByb3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERNRCBAQEJVR0BAOiBJZiB0aGVzZSBhcmUgbm90IHByZXNlbnQgaW4gdGhpcyBjbGFzcyAod291bGQgYmUpCisgICAgICAgIC8vIGluaGVyaXRlZCBhbnl3YXksIMK7bm90IGltcGxlbWVudGVkwqsgZXJyb3JzIGFyZSByYWlzZWQuCisgICAgICAgIG92ZXJyaWRlIElQcm90IGlucHV0UHJvdG9jb2woKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiBzdXBlci5pbnB1dFByb3RvY29sOworICAgICAgICB9CisgICAgICAgIG92ZXJyaWRlIE9Qcm90IG91dHB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gc3VwZXIub3V0cHV0UHJvdG9jb2w7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRDbGllbnQgOiBUQ2xpZW50QmFzZSFJbnRlcmZhY2UgeyI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGFsaWFzIElucHV0UHJvdG9jb2wgSVByb3Q7CisgICAgICAgIHN0YXRpYyBpZiAoaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wpIHsKKyAgICAgICAgICBhbGlhcyBPdXRwdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0aWMgYXNzZXJ0KGlzKE91dHB1dFByb3RvY29sID09IHZvaWQpKTsKKyAgICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIE9Qcm90OworICAgICAgICB9CisKKyAgICAgICAgdGhpcyhJUHJvdCBpcHJvdCwgT1Byb3Qgb3Byb3QpIHsKKyAgICAgICAgICBpcHJvdF8gPSBpcHJvdDsKKyAgICAgICAgICBvcHJvdF8gPSBvcHJvdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpZiAoaXMoSVByb3QgPT0gT1Byb3QpKSB7CisgICAgICAgICAgdGhpcyhJUHJvdCBwcm90KSB7CisgICAgICAgICAgICB0aGlzKHByb3QsIHByb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElQcm90IGlucHV0UHJvdG9jb2woKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiBpcHJvdF87CisgICAgICAgIH0KKworICAgICAgICBPUHJvdCBvdXRwdXRQcm90b2NvbCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIG9wcm90XzsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBJUHJvdCBpcHJvdF87CisgICAgICAgIHByb3RlY3RlZCBPUHJvdCBvcHJvdF87CisgICAgICAgIHByb3RlY3RlZCBpbnQgc2VxaWRfOworICAgICAgfTsKKyAgICB9CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgSW50ZXJmYWNlKSkgeworICAgICAgc3RhdGljIGlmIChpc1NvbWVGdW5jdGlvbiEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgICAgICBUTWV0aG9kTWV0YSBtZXRob2RNZXRhOworICAgICAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICAgICAgbWV0aG9kTWV0YSA9IG1ldGEuZnJvbnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGNvZGUgZm9yIHNlbmRpbmcuCisgICAgICAgIHN0cmluZ1tdIHBhcmFtTGlzdDsKKyAgICAgICAgc3RyaW5nIHBhcmFtQXNzaWduQ29kZTsKKyAgICAgICAgZm9yZWFjaCAoaSwgXzsgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgICAgICAvLyBVc2UgdGhlIHBhcmFtIG5hbWUgc3BlZmljaWVkIGluIHRoZSBtZXRhIGluZm9ybWF0aW9uIGlmIGFueSDigJMKKyAgICAgICAgICAvLyBqdXN0IGNvc21ldGljcyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgc3RyaW5nIHBhcmFtTmFtZTsKKyAgICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHBhcmFtTmFtZSA9IG1ldGhvZE1ldGEucGFyYW1zW2ldLm5hbWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgICAgIH0KKworICAgICAgICAgIGltbXV0YWJsZSBzdG9yYWdlID0gUGFyYW1ldGVyU3RvcmFnZUNsYXNzVHVwbGUhKAorICAgICAgICAgICAgbWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpW2ldOworICAgICAgICAgIHBhcmFtTGlzdCB+PSAoKHN0b3JhZ2UgJiBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3MucmVmXykgPyAicmVmICIgOiAiIikgfgorICAgICAgICAgICAgIlBhcmFtZXRlclR5cGVUdXBsZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIilbIiB+CisgICAgICAgICAgICB0byFzdHJpbmcoaSkgfiAiXSAiIH4gcGFyYW1OYW1lOworICAgICAgICAgIHBhcmFtQXNzaWduQ29kZSB+PSAiYXJncy4iIH4gcGFyYW1OYW1lIH4gIiA9ICYiIH4gcGFyYW1OYW1lIH4gIjtcbiI7CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSAiUmV0dXJuVHlwZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIikgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAgICIoIiB+IGN0ZmVKb2luKHBhcmFtTGlzdCkgfiAiKSB7XG4iOworCisgICAgICAgIGNvZGUgfj0gImltbXV0YWJsZSBtZXRob2ROYW1lID0gYCIgfiBtZXRob2ROYW1lIH4gImA7XG4iOworCisgICAgICAgIGltbXV0YWJsZSBwYXJhbVN0cnVjdFR5cGUgPQorICAgICAgICAgICJUUGFyZ3NTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIjsKKyAgICAgICAgY29kZSB+PSBwYXJhbVN0cnVjdFR5cGUgfiAiIGFyZ3MgPSAiIH4gcGFyYW1TdHJ1Y3RUeXBlIH4gIigpO1xuIjsKKyAgICAgICAgY29kZSB+PSBwYXJhbUFzc2lnbkNvZGU7CisgICAgICAgIGNvZGUgfj0gIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShgIiB+IG1ldGhvZE5hbWUgfiAiYCwgIjsKKyAgICAgICAgY29kZSB+PSAoKG1ldGhvZE1ldGFGb3VuZCAmJiBtZXRob2RNZXRhLnR5cGUgPT0gVE1ldGhvZFR5cGUuT05FV0FZKQorICAgICAgICAgICAgICAgICA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpOworICAgICAgICBjb2RlIH49ICIsICsrc2VxaWRfKSk7XG4iOworICAgICAgICBjb2RlIH49ICJhcmdzLndyaXRlKG9wcm90Xyk7XG4iOworICAgICAgICBjb2RlIH49ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7XG4iOworICAgICAgICBjb2RlIH49ICJvcHJvdF8udHJhbnNwb3J0LmZsdXNoKCk7XG4iOworCisgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2VpdmluZyBjb2RlLgorICAgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCB8fCBtZXRob2RNZXRhLnR5cGUgIT0gVE1ldGhvZFR5cGUuT05FV0FZKSB7CisgICAgICAgICAgY29kZSB+PSAiVFByZXN1bHRTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIHJlc3VsdDtcbiI7CisKKyAgICAgICAgICBpZiAoIWlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgICAgICAgY29kZSB+PSAiUmV0dXJuVHlwZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIikgX3JldHVybjtcbiI7CisgICAgICAgICAgICBjb2RlIH49ICJyZXN1bHQuc3VjY2VzcyA9ICZfcmV0dXJuO1xuIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBUT0RPOiBUaGUgQysrIGltcGxlbWVudGF0aW9uIGNoZWNrcyBmb3IgbWF0Y2hpbmcgbWV0aG9kIG5hbWUgaGVyZSwKKyAgICAgICAgICAvLyBzaG91bGQgd2UgZG8gYXMgd2VsbD8KKyAgICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgICBhdXRvIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgICAgICBzY29wZSAoZXhpdCkgeworICAgICAgICAgICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgaXByb3RfLnRyYW5zcG9ydC5yZWFkRW5kKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7CisgICAgICAgICAgICAgIGF1dG8geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24obnVsbCk7CisgICAgICAgICAgICAgIHgucmVhZChpcHJvdF8pOworICAgICAgICAgICAgICBpcHJvdF8udHJhbnNwb3J0LnJlYWRFbmQoKTsKKyAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc2cudHlwZSAhPSBUTWVzc2FnZVR5cGUuUkVQTFkpIHsKKyAgICAgICAgICAgICAgc2tpcChpcHJvdF8sIFRUeXBlLlNUUlVDVCk7CisgICAgICAgICAgICAgIGlwcm90Xy50cmFuc3BvcnQucmVhZEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lIH4gIiBmYWlsZWQ6IE91dCBvZiBzZXF1ZW5jZSByZXNwb25zZS4iLAorICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5UeXBlLkJBRF9TRVFVRU5DRV9JRAorICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnJlYWQoaXByb3RfKTsKKyAgICAgICAgICB9OworCisgICAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCkgeworICAgICAgICAgICAgZm9yZWFjaCAoZTsgbWV0aG9kTWV0YS5leGNlcHRpb25zKSB7CisgICAgICAgICAgICAgIGNvZGUgfj0gImlmIChyZXN1bHQuaXNTZXQhYCIgfiBlLm5hbWUgfiAiYCkgdGhyb3cgcmVzdWx0LiIgfgorICAgICAgICAgICAgICAgIGUubmFtZSB+ICI7XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghaXMoUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpID09IHZvaWQpKSB7CisgICAgICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTZXQhYHN1Y2Nlc3NgKSByZXR1cm4gX3JldHVybjsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lIH4gIiBmYWlsZWQ6IFVua25vd24gcmVzdWx0LiIsCisgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlR5cGUuTUlTU0lOR19SRVNVTFQKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBUQ2xpZW50IGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorICogdGhlIHByb3RvY29sIHR5cGVzLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RDbGllbnQhKEludGVyZmFjZSwgUHJvdCkgdENsaWVudChJbnRlcmZhY2UsIFByb3QpKFByb3QgcHJvdCkgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGlzVFByb3RvY29sIVByb3QKKykgeworICByZXR1cm4gbmV3IFRDbGllbnQhKEludGVyZmFjZSwgUHJvdCkocHJvdCk7Cit9CisKKy8vLyBEaXR0bworVENsaWVudCEoSW50ZXJmYWNlLCBJUHJvdCwgT3Byb3QpIHRDbGllbnQoSW50ZXJmYWNlLCBJUHJvdCwgT1Byb3QpCisgIChJUHJvdCBpcHJvdCwgT1Byb3Qgb3Byb3QpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFJUHJvdCAmJiBpc1RQcm90b2NvbCFPUHJvdAorKSB7CisgIHJldHVybiBuZXcgVENsaWVudCEoSW50ZXJmYWNlLCBJUHJvdCwgT1Byb3QpKGlwcm90LCBvcHJvdCk7Cit9CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgYXJndW1lbnRzIG9mIGEgVGhyaWZ0IG1ldGhvZCBjYWxsLCBhcyBwb2ludGVycyB0byB0aGUgKGNvbnN0KQorICogcGFyYW1ldGVyIHR5cGUgdG8gYXZvaWQgY29weWluZy4KKyAqCisgKiBUaGVyZSBzaG91bGQgdXN1YWxseSBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgc3RydWN0IGRpcmVjdGx5IHdpdGhvdXQgdGhlCisgKiBoZWxwIG9mIFRDbGllbnQsIGJ1dCBpdCBpcyBkb2N1bWVudGVkIHB1YmxpY2x5IHRvIGhlbHAgZGVidWdnaW5nIGluIGNhc2UKKyAqIG9mIENURkUgZXJyb3JzLgorICoKKyAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBiYXIoc3RyaW5nIGEsIGJvb2wgYik7CisgKgorICogICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgKiAgICAgVE1ldGhvZE1ldGEoImJhciIsIFtUUGFyYW1NZXRhKCJhIiwgMSksIFRQYXJhbU1ldGEoImIiLCAyKV0pCisgKiAgIF07CisgKiB9CisgKgorICogYWxpYXMgVFBhcmdzU3RydWN0IShGb28sICJiYXIiKSBGb29CYXJQYXJnczsKKyAqIC0tLQorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIEZvb0JhclBhcmdzIGlzIGVxdWl2YWxlbnQgdG8gKGlnbm9yaW5nIHRoZSBuZWNlc3NhcnkKKyAqIG1ldGFkYXRhIHRvIGFzc2lnbiB0aGUgZmllbGQgSURzKToKKyAqIC0tLQorICogc3RydWN0IEZvb0JhclBhcmdzIHsKKyAqICAgY29uc3Qoc3RyaW5nKSogYTsKKyAqICAgY29uc3QoYm9vbCkqIGI7CisgKgorICogICB2b2lkIHdyaXRlKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgY29uc3QgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKTsKKyAqIH0KKyAqIC0tLQorICovCit0ZW1wbGF0ZSBUUGFyZ3NTdHJ1Y3QoSW50ZXJmYWNlLCBzdHJpbmcgbWV0aG9kTmFtZSkgeworICBzdGF0aWMgYXNzZXJ0KGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpLAorICAgICJDb3VsZCBub3QgZmluZCBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gJyIgfiBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJy4iKTsKKyAgbWl4aW4oeworICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgIFRNZXRob2RNZXRhIG1ldGhvZE1ldGE7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgIGF1dG8gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgbWV0aG9kTWV0YSA9IG1ldGEuZnJvbnQ7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIG1lbWJlckNvZGU7CisgICAgc3RyaW5nW10gZmllbGRNZXRhQ29kZXM7CisgICAgZm9yZWFjaCAoaSwgXzsgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgbm8gbWV0YSBpbmZvcm1hdGlvbiwganVzdCB1c2UgcGFyYW0xLCBwYXJhbTIsIGV0Yy4gYXMKKyAgICAgIC8vIGZpZWxkIG5hbWVzLCBpdCBzaG91bGRuJ3QgcmVhbGx5IG1hdHRlciBhbnl3YXkuIDEtYmFzZWQgwrtpbmRleGluZ8KrCisgICAgICAvLyBpcyB1c2VkIHRvIG1hdGNoIHRoZSBjb21tb24gc2NoZW1lIGluIHRoZSBUaHJpZnQgd29ybGQuCisgICAgICBzdHJpbmcgbWVtYmVySWQ7CisgICAgICBzdHJpbmcgbWVtYmVyTmFtZTsKKyAgICAgIGlmIChtZXRob2RNZXRhRm91bmQgJiYgaSA8IG1ldGhvZE1ldGEucGFyYW1zLmxlbmd0aCkgeworICAgICAgICBtZW1iZXJJZCA9IHRvIXN0cmluZyhtZXRob2RNZXRhLnBhcmFtc1tpXS5pZCk7CisgICAgICAgIG1lbWJlck5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtYmVySWQgPSB0byFzdHJpbmcoaSArIDEpOworICAgICAgICBtZW1iZXJOYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICB9CisKKyAgICAgIC8vIFdvcmthcm91bmQgZm9yIERNRCBAQEJVR0BAIDYwNTY6IG1ha2UgYW4gaW50ZXJtZWRpYXJ5IGFsaWFzIGZvciB0aGUKKyAgICAgIC8vIHBhcmFtZXRlciB0eXBlLCBhbmQgZGVjbGFyZSB0aGUgbWVtYmVyIHVzaW5nIGNvbnN0KG1lbWJlck5hbWVUeXBlKSouCisgICAgICBtZW1iZXJDb2RlIH49ICJhbGlhcyBQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIpWyIgfiB0byFzdHJpbmcoaSkgfiAiXSAiIH4gbWVtYmVyTmFtZSB+ICJUeXBlO1xuIjsKKyAgICAgIG1lbWJlckNvZGUgfj0gImNvbnN0KCIgfiBtZW1iZXJOYW1lIH4gIlR5cGUpKiAiIH4gbWVtYmVyTmFtZSB+ICI7XG4iOworCisgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgIiB+IG1lbWJlck5hbWUgfiAiYCwgIiB+IG1lbWJlcklkIH4KKyAgICAgICAgIiwgVFJlcS5PUFRfSU5fUkVRX09VVCkiOworICAgIH0KKworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUUGFyZ3NTdHJ1Y3Qge1xuIjsKKyAgICBjb2RlIH49IG1lbWJlckNvZGU7CisgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCAmJgorICAgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKS5sZW5ndGggPiAwKQorICAgICAgeworICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLmJhc2UuVFBhcmdzU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluIHNlcnZpY2UgJyIgfgorICAgICAgICAgIEludGVyZmFjZS5zdHJpbmdvZiB+ICInIGZvdW5kLmApO1xuIjsKKyAgICAgIH0KKyAgICB9CisgICAgY29kZSB+PSAidm9pZCB3cml0ZShQKShQIHByb3RvKSBjb25zdCBpZiAoaXNUUHJvdG9jb2whUCkge1xuIjsKKyAgICBjb2RlIH49ICJ3cml0ZVN0cnVjdCEodHlwZW9mKHRoaXMpLCBQLCBbIiB+IGN0ZmVKb2luKGZpZWxkTWV0YUNvZGVzKSB+CisgICAgICAiXSwgdHJ1ZSkodGhpcywgcHJvdG8pO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgVGhyaWZ0IG1ldGhvZCBjYWxsLCB1c2luZyBhIHBvaW50ZXIgdG8gdGhlIHJldHVybgorICogdmFsdWUgdG8gYXZvaWQgY29weWluZy4KKyAqCisgKiBUaGVyZSBzaG91bGQgdXN1YWxseSBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgc3RydWN0IGRpcmVjdGx5IHdpdGhvdXQgdGhlCisgKiBoZWxwIG9mIFRDbGllbnQsIGJ1dCBpdCBpcyBkb2N1bWVudGVkIHB1YmxpY2x5IHRvIGhlbHAgZGVidWdnaW5nIGluIGNhc2UKKyAqIG9mIENURkUgZXJyb3JzLgorICoKKyAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBiYXIoc3RyaW5nIGEpOworICoKKyAqICAgYWxpYXMgLkZvb0V4Y2VwdGlvbiBGb29FeGNlcHRpb247CisgKgorICogICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgKiAgICAgVE1ldGhvZE1ldGEoImJhciIsCisgKiAgICAgICBbVFBhcmFtTWV0YSgiYSIsIDEpXSwKKyAqICAgICAgIFtURXhjZXB0aW9uTWV0YSgiZm9vZSIsIDEsICJGb29FeGNlcHRpb24iKV0KKyAqICAgICApCisgKiAgIF07CisgKiB9CisgKiBhbGlhcyBUUHJlc3VsdFN0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyUHJlc3VsdDsKKyAqIC0tLQorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIEZvb0JhclByZXN1bHQgaXMgZXF1aXZhbGVudCB0byAoaWdub3JpbmcgdGhlIG5lY2Vzc2FyeQorICogbWV0YWRhdGEgdG8gYXNzaWduIHRoZSBmaWVsZCBJRHMpOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vQmFyUHJlc3VsdCB7CisgKiAgIGludCogc3VjY2VzczsKKyAqICAgRm9vLkZvb0V4Y2VwdGlvbiBmb29lOworICoKKyAqICAgc3RydWN0IElzU2V0RmxhZ3MgeworICogICAgIGJvb2wgc3VjY2VzczsKKyAqICAgfQorICogICBJc1NldEZsYWdzIGlzU2V0RmxhZ3M7CisgKgorICogICBib29sIGlzU2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgY29uc3QgQHByb3BlcnR5OworICogICB2b2lkIHJlYWQoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpOworICogfQorICogLS0tCisgKi8KK3RlbXBsYXRlIFRQcmVzdWx0U3RydWN0KEludGVyZmFjZSwgc3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgc3RhdGljIGFzc2VydChpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSwKKyAgICAiQ291bGQgbm90IGZpbmQgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluICciIH4gSW50ZXJmYWNlLnN0cmluZ29mIH4gIicuIik7CisKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUUHJlc3VsdFN0cnVjdCB7XG4iOworCisgICAgc3RyaW5nW10gZmllbGRNZXRhQ29kZXM7CisKKyAgICBhbGlhcyBSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgUmVzdWx0VHlwZTsKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSogc3VjY2VzczsKKyAgICAgIH07CisgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgc3VjY2Vzc2AsIDAsIFRSZXEuT1BUSU9OQUwpIjsKKworICAgICAgc3RhdGljIGlmICghaXNOdWxsYWJsZSFSZXN1bHRUeXBlKSB7CisgICAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgICBzdHJ1Y3QgSXNTZXRGbGFncyB7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3M7CisgICAgICAgICAgfQorICAgICAgICAgIElzU2V0RmxhZ3MgaXNTZXRGbGFnczsKKyAgICAgICAgfTsKKyAgICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYGlzU2V0RmxhZ3NgLCAwLCBUUmVxLklHTk9SRSkiOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIGZvcmVhY2ggKGU7IG1ldGEuZnJvbnQuZXhjZXB0aW9ucykgeworICAgICAgICAgIGNvZGUgfj0gIkludGVyZmFjZS4iIH4gZS50eXBlIH4gIiAiIH4gZS5uYW1lIH4gIjtcbiI7CisgICAgICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBlLm5hbWUgfiAiYCwgIiB+IHRvIXN0cmluZyhlLmlkKSB+CisgICAgICAgICAgICAiLCBUUmVxLk9QVElPTkFMKSI7CisgICAgICAgIH0KKyAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4uYmFzZS5UUHJlc3VsdFN0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiBzZXJ2aWNlICciIH4KKyAgICAgICAgICBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJyBmb3VuZC5gKTtcbiI7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSBxeworICAgICAgYm9vbCBpc1NldChzdHJpbmcgZmllbGROYW1lKSgpIGNvbnN0IEBwcm9wZXJ0eSBpZiAoCisgICAgICAgIGlzKE1lbWJlclR5cGUhKHR5cGVvZih0aGlzKSwgZmllbGROYW1lKSkKKyAgICAgICkgeworICAgICAgICBzdGF0aWMgaWYgKGZpZWxkTmFtZSA9PSAic3VjY2VzcyIpIHsKKyAgICAgICAgICBzdGF0aWMgaWYgKGlzTnVsbGFibGUhKHR5cGVvZigqc3VjY2VzcykpKSB7CisgICAgICAgICAgICByZXR1cm4gKnN1Y2Nlc3MgIWlzIG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpc1NldEZsYWdzLnN1Y2Nlc3M7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGFyZSBkZWFsaW5nIHdpdGggYW4gZXhjZXB0aW9uIG1lbWJlciwgd2hpY2gsIGJlaW5nIGEgbnVsbGFibGUKKyAgICAgICAgICAvLyB0eXBlIChleGNlcHRpb25zIGFyZSBhbHdheXMgY2xhc3NlcyksIGhhcyBubyBpc1NldCBmbGFnLgorICAgICAgICAgIHJldHVybiBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgIWlzIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgY29kZSB+PSAidm9pZCByZWFkKFApKFAgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQKSB7XG4iOworICAgIGNvZGUgfj0gInJlYWRTdHJ1Y3QhKHR5cGVvZih0aGlzKSwgUCwgWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfgorICAgICAgIl0sIHRydWUpKHRoaXMsIHByb3RvKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50X3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDZiNzQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5jbGllbnRfcG9vbDsKKworaW1wb3J0IGNvcmUudGltZSA6IGR1ciwgRHVyYXRpb24sIFRpY2tEdXJhdGlvbjsKK2ltcG9ydCBzdGQudHJhaXRzIDogUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5yZXNvdXJjZV9wb29sOworCisvKioKKyAqIE1hbmFnZXMgYSBwb29sIG9mIFRDbGllbnRzIGZvciB0aGUgZ2l2ZW4gaW50ZXJmYWNlLCBmb3J3YXJkaW5nIFJQQyBjYWxscyB0bworICogbWVtYmVycyBvZiB0aGUgcG9vbC4KKyAqCisgKiBJZiBhIHJlcXVlc3QgZmFpbHMsIGFub3RoZXIgY2xpZW50IGZyb20gdGhlIHBvb2wgaXMgdHJpZWQsIGFuZCBvcHRpb25hbGx5LAorICogYSBjbGllbnQgaXMgZGlzYWJsZWQgZm9yIGEgY29uZmlndXJhYmxlIGFtb3VudCBvZiB0aW1lIGlmIGl0IGZhaWxzIHRvbworICogb2Z0ZW4uIElmIGFsbCBjbGllbnRzIGZhaWwgKGFuZCBrZWVwVHJ5aW5nIGlzIGZhbHNlKSwgYQorICogVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIGlzIHRocm93biwgY29udGFpbmluZyBhbGwgdGhlIGNvbGxlY3RlZCBSUEMKKyAqIGV4Y2VwdGlvbnMuCisgKi8KK2NsYXNzIFRDbGllbnRQb29sKEludGVyZmFjZSkgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIDogSW50ZXJmYWNlIHsKKyAgLy8vIFNob3J0aGFuZCBmb3IgVENsaWVudEJhc2UhSW50ZXJmYWNlLCB0aGUgY2xpZW50IHR5cGUgdGhpcyBpbnN0YW5jZQorICAvLy8gb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRDbGllbnRCYXNlIUludGVyZmFjZSBDbGllbnQ7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYW5kIGFkZHMgdGhlIGdpdmVuIGNsaWVudHMgdG8gdGhlIHBvb2wuCisgICAqLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBwb29sXyA9IG5ldyBUUmVzb3VyY2VQb29sIUNsaWVudChjbGllbnRzKTsKKworICAgIHJwY0ZhdWx0RmlsdGVyID0gKEV4Y2VwdGlvbiBlKSB7CisgICAgICBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisgICAgICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworICAgICAgcmV0dXJuICgKKyAgICAgICAgKGNhc3QoVFRyYW5zcG9ydEV4Y2VwdGlvbillICFpcyBudWxsKSB8fAorICAgICAgICAoY2FzdChUQXBwbGljYXRpb25FeGNlcHRpb24pZSAhaXMgbnVsbCkKKyAgICAgICk7CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBFeGVjdXRlcyBhbiBvcGVyYXRpb24gb24gdGhlIGZpcnN0IGN1cnJlbnRseSBhY3RpdmUgY2xpZW50LgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzICh0aHJvd3MgYW4gZXhjZXB0aW9uIGZvciB3aGljaCBycGNGYXVsdEZpbHRlciBpcworICAgKiB0cnVlKSwgdGhlIGZhaWx1cmUgaXMgcmVjb3JkZWQgYW5kIHRoZSBuZXh0IGNsaWVudCBpbiB0aGUgcG9vbCBpcyB0cmllZC4KKyAgICoKKyAgICogVGhyb3dzOiBBbnkgbm9uLXJwYyBleGNlcHRpb24gdGhhdCBvY2N1cnMsIGEgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uCisgICAqICAgaWYgYWxsIGNsaWVudHMgZmFpbGVkIHdpdGggYW4gcnBjIGV4Y2VwdGlvbiAoaWYga2VlcFRyeWluZyBpcyBmYWxzZSkuCisgICAqCisgICAqIEV4YW1wbGU6CisgICAqIC0tLQorICAgKiBpbnRlcmZhY2UgRm9vIHsgc3RyaW5nIGJhcigpOyB9CisgICAqIGF1dG8gcG9vbENsaWVudCA9IHRDbGllbnRQb29sKFt0Q2xpZW50IUZvbyhzb21lUHJvdG9jb2wpXSk7CisgICAqIGF1dG8gcmVzdWx0ID0gcG9vbENsaWVudC5leGVjdXRlKChjKXsgcmV0dXJuIGMuYmFyKCk7IH0pOworICAgKiAtLS0KKyAgICovCisgIFJlc3VsdFR5cGUgZXhlY3V0ZShSZXN1bHRUeXBlKShzY29wZSBSZXN1bHRUeXBlIGRlbGVnYXRlKENsaWVudCkgd29yaykgeworICAgIHJldHVybiBleGVjdXRlT25Qb29sIUNsaWVudCh3b3JrKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGEgY2xpZW50IHRvIHRoZSBwb29sLgorICAgKi8KKyAgdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIHBvb2xfLmFkZChjbGllbnQpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBjbGllbnQgZnJvbSB0aGUgcG9vbC4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgY2xpZW50IHdhcyBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICovCisgIGJvb2wgcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICByZXR1cm4gcG9vbF8ucmVtb3ZlKGNsaWVudCk7CisgIH0KKworICBtaXhpbihwb29sRm9yd2FyZENvZGUhSW50ZXJmYWNlKCkpOworCisgIC8vLyBXaGV0aGVyIHRvIG9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0cyBvZiBhIGNsaWVudCBiZWZvcmUgdHJ5aW5nIHRvCisgIC8vLyBleGVjdXRlIGEgbWV0aG9kIGlmIHRoZXkgYXJlIG5vdCBvcGVuLiBUaGlzIGlzIHVzdWFsbHkgZGVzaXJhYmxlCisgIC8vLyBiZWNhdXNlIGl0IGFsbG93cyBlLmcuIHRvIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IHRvIGEgcmVtb3RlIHNlcnZlcgorICAvLy8gaWYgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgorICAvLy8KKyAgLy8vIERlZmF1bHRzIHRvIHRydWUuCisgIGJvb2wgcmVvcGVuVHJhbnNwb3J0cyA9IHRydWU7CisKKyAgLy8vIENhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBleGNlcHRpb24gY29tZXMgZnJvbSBhIGNsaWVudCBmcm9tIHRoZQorICAvLy8gcG9vbCBub3Qgd29ya2luZyBwcm9wZXJseSwgb3IgaWYgaXQgYW4gZXhjZXB0aW9uIHRocm93biBhdCB0aGUKKyAgLy8vIGFwcGxpY2F0aW9uIGxldmVsLgorICAvLy8KKyAgLy8vIElmIHRoZSBkZWxlZ2F0ZSByZXR1cm5zIHRydWUsIHRoZSBzZXJ2ZXIvY29ubmVjdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlCisgIC8vLyBhdCBmYXVsdCwgaWYgaXQgcmV0dXJucyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyBqdXN0IHBhc3NlZCBvbiB0byB0aGUKKyAgLy8vIGNhbGxlci4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0LCByZXR1cm5zIHRydWUgZm9yIGluc3RhbmNlcyBvZiBUVHJhbnNwb3J0RXhjZXB0aW9uIGFuZAorICAvLy8gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcjsKKworICAvKioKKyAgICogV2hldGhlciB0byBrZWVwIHRyeWluZyB0byBmaW5kIGEgd29ya2luZyBjbGllbnQgaWYgYWxsIGhhdmUgZmFpbGVkIGluIGEKKyAgICogcm93LgorICAgKgorICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICovCisgIGJvb2wga2VlcFRyeWluZygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmN5Y2xlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQga2VlcFRyeWluZyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmN5Y2xlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgYSByYW5kb20gcGVybXV0YXRpb24gb2YgdGhlIGNsaWVudCBwb29sIG9uIGV2ZXJ5IGNhbGwgdG8KKyAgICogZXhlY3V0ZSgpLiBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gYXMgYSBzaW1wbGUgZm9ybSBvZiBsb2FkIGJhbGFuY2luZy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgcGVybXV0ZUNsaWVudHMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5wZXJtdXRlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgcGVybXV0ZUNsaWVudHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5wZXJtdXRlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmYXVsdHMgYWZ0ZXIgd2hpY2ggYSBjbGllbnQgaXMgZGlzYWJsZWQgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4gMCB0byBuZXZlciBkaXNhYmxlIGNsaWVudHMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDAuCisgICAqLworICB1c2hvcnQgZmF1bHREaXNhYmxlQ291bnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVDb3VudDsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUNvdW50KHVzaG9ydCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5mYXVsdERpc2FibGVDb3VudCA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBjbGllbnQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYWZ0ZXIgaXQgaGFzCisgICAqIGZhaWxlZCB0b28gb2Z0ZW4uCisgICAqCisgICAqIERlZmF1bHRzIHRvIG9uZSBzZWNvbmQuCisgICAqLworICBEdXJhdGlvbiBmYXVsdERpc2FibGVEdXJhdGlvbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgZmF1bHREaXNhYmxlRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlRHVyYXRpb24gPSB2YWx1ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFJlc3VsdFR5cGUgZXhlY3V0ZU9uUG9vbChSZXN1bHRUeXBlKShzY29wZSBSZXN1bHRUeXBlIGRlbGVnYXRlKENsaWVudCkgd29yaykgeworICAgIGF1dG8gY2xpZW50cyA9IHBvb2xfW107CisgICAgaWYgKGNsaWVudHMuZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJObyBjbGllbnRzIGF2YWlsYWJsZSB0byB0cnkuIik7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEV4Y2VwdGlvbltdIHJwY0V4Y2VwdGlvbnM7CisgICAgICB3aGlsZSAoIWNsaWVudHMuZW1wdHkpIHsKKyAgICAgICAgYXV0byBjID0gY2xpZW50cy5mcm9udDsKKyAgICAgICAgY2xpZW50cy5wb3BGcm9udDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzY29wZSAoc3VjY2VzcykgeworICAgICAgICAgICAgcG9vbF8ucmVjb3JkU3VjY2VzcyhjKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmVvcGVuVHJhbnNwb3J0cykgeworICAgICAgICAgICAgYy5pbnB1dFByb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgICBjLm91dHB1dFByb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHdvcmsoYyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgaWYgKHJwY0ZhdWx0RmlsdGVyICYmIHJwY0ZhdWx0RmlsdGVyKGUpKSB7CisgICAgICAgICAgICBwb29sXy5yZWNvcmRGYXVsdChjKTsKKyAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnMgfj0gZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgYXJlIGRlYWxpbmcgd2l0aCBhIG5vcm1hbCBleGNlcHRpb24gdGhyb3duIGJ5IHRoZQorICAgICAgICAgICAgLy8gc2VydmVyLXNpZGUgbWV0aG9kLCBqdXN0IHBhc3MgaXQgb24uIEFzIGZhciBhcyB3ZSBhcmUKKyAgICAgICAgICAgIC8vIGNvbmNlcm5lZCwgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRlZC4KKyAgICAgICAgICAgIHBvb2xfLnJlY29yZFN1Y2Nlc3MoYyk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgbm8gY2xpZW50IHN1Y2NlZWRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLgorICAgICAgRHVyYXRpb24gd2FpdFRpbWU7CisgICAgICBDbGllbnQgZHVtbXk7CisgICAgICBpZiAoY2xpZW50cy53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXksIHdhaXRUaW1lKSkgeworICAgICAgICBpZiAod2FpdFRpbWUgPiBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICBpbXBvcnQgY29yZS50aHJlYWQ7CisgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWxsIGNsaWVudHMgZmFpbGVkLiIsCisgICAgICAgICAgcnBjRXhjZXB0aW9ucyk7CisgICAgICB9CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIFRSZXNvdXJjZVBvb2whQ2xpZW50IHBvb2xfOworfQorCitwcml2YXRlIHsKKyAgLy8gQ2Fubm90IHVzZSBhbiBhbm9ueW1vdXMgZGVsZWdhdGUgbGl0ZXJhbCBmb3IgdGhpcyBiZWNhdXNlIHRoZXkgYXJlbid0CisgIC8vIGFsbG93ZWQgaW4gY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBwb29sRm9yd2FyZENvZGUoSW50ZXJmYWNlKSgpIHsKKyAgICBzdHJpbmcgY29kZSA9ICIiOworCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgQWxsTWVtYmVyTWV0aG9kTmFtZXMhSW50ZXJmYWNlKSB7CisgICAgICBlbnVtIHFuID0gIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZTsKKyAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKCIgfiBxbiB+ICIpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIihQYXJhbWV0ZXJUeXBlVHVwbGUhKCIgfiBxbiB+ICIpIGFyZ3MpIHtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm4gZXhlY3V0ZU9uUG9vbCgoQ2xpZW50IGMpeyByZXR1cm4gYy4iIH4KKyAgICAgICAgbWV0aG9kTmFtZSB+ICIoYXJncyk7IH0pO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0KK30KKworLyoqCisgKiBUQ2xpZW50UG9vbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSBpbnRlcmZhY2UgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUQ2xpZW50UG9vbCFJbnRlcmZhY2UgdENsaWVudFBvb2woSW50ZXJmYWNlKSgKKyAgVENsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODg5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKQEAgLTAsMCArMSw3NzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBDb250YWlucyA8Yj5leHBlcmltZW50YWw8L2I+IGZ1bmN0aW9uYWxpdHkgZm9yIGdlbmVyYXRpbmcgVGhyaWZ0IElETCBmaWxlcworICogKC50aHJpZnQpIGZyb20gZXhpc3RpbmcgRCBkYXRhIHN0cnVjdHVyZXMsIGkuZS4gdGhlIHJldmVyc2Ugb2Ygd2hhdCB0aGUKKyAqIFRocmlmdCBjb21waWxlciBkb2VzLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uaWRsZ2VuOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IEVudW1NZW1iZXJzLCBpc1NvbWVGdW5jdGlvbiwgT3JpZ2luYWxUeXBlLAorICBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIHN0YXRpY0luZGV4T2YsIHN0YXRpY01hcCwgTm9EdXBsaWNhdGVzLAorICBUeXBlVHVwbGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworCisvKioKKyAqIFRydWUgaWYgdGhlIHBhc3NlZCB0eXBlIGlzIGEgVGhyaWZ0IGVudGl0eSAoc3RydWN0LCBleGNlcHRpb24sIGVudW0sCisgKiBzZXJ2aWNlKS4KKyAqLworYWxpYXMgQW55IShpc1N0cnVjdCwgaXNFeGNlcHRpb24sIGlzRW51bSwgaXNTZXJ2aWNlKSBpc1RocmlmdEVudGl0eTsKKworLyoqCisgKiBSZXR1cm5zIGFuIElETCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGFzc2VkIMK7cm9vdMKrIGVudGl0aWVzIGFuZCBhbGwgdHlwZXMKKyAqIHRoZXkgZGVwZW5kIG9uLgorICovCit0ZW1wbGF0ZSBpZGxTdHJpbmcoUm9vdHMuLi4pIGlmIChhbGxTYXRpc2Z5IShpc1RocmlmdEVudGl0eSwgUm9vdHMpKSB7CisgIGVudW0gaWRsU3RyaW5nID0gaWRsU3RyaW5nSW1wbCFSb290cy5yZXN1bHQ7Cit9CisKK3ByaXZhdGUgeworICB0ZW1wbGF0ZSBpZGxTdHJpbmdJbXBsKFJvb3RzLi4uKSBpZiAoYWxsU2F0aXNmeSEoaXNUaHJpZnRFbnRpdHksIFJvb3RzKSkgeworICAgIGFsaWFzIEZvckFsbFdpdGhMaXN0ISgKKyAgICAgIENvbmZpbmVkVHVwbGUhKFN0YXRpY0ZpbHRlciEoaXNTZXJ2aWNlLCBSb290cykpLAorICAgICAgQWRkQmFzZVNlcnZpY2VzCisgICAgKSBTZXJ2aWNlczsKKworICAgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgICBTdGF0aWNGaWx0ZXIhKGlzRW51bSwgUm9vdHMpLAorICAgICAgRm9yQWxsV2l0aExpc3QhKAorICAgICAgICBDb25maW5lZFR1cGxlISgKKyAgICAgICAgICBTdGF0aWNGaWx0ZXIhKEFueSEoaXNFeGNlcHRpb24sIGlzU3RydWN0KSwgUm9vdHMpLAorICAgICAgICAgIHN0YXRpY01hcCEoQ29tcG9zaXRlVHlwZURlcHMsIHN0YXRpY01hcCEoU2VydmljZVR5cGVEZXBzLCBTZXJ2aWNlcykpCisgICAgICAgICksCisgICAgICAgIEFkZFN0cnVjdFdpdGhEZXBzCisgICAgICApCisgICAgKSBUeXBlczsKKworICAgIGVudW0gcmVzdWx0ID0gY3RmZUpvaW4oCisgICAgICBbCisgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgZW51bUlkbFN0cmluZywKKyAgICAgICAgICBTdGF0aWNGaWx0ZXIhKGlzRW51bSwgVHlwZXMpCisgICAgICAgICksCisgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgc3RydWN0SWRsU3RyaW5nLAorICAgICAgICAgIFN0YXRpY0ZpbHRlciEoQW55IShpc1N0cnVjdCwgaXNFeGNlcHRpb24pLCBUeXBlcykKKyAgICAgICAgKSwKKyAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICBzZXJ2aWNlSWRsU3RyaW5nLAorICAgICAgICAgIFNlcnZpY2VzCisgICAgICAgICkKKyAgICAgIF0sCisgICAgICAiXG4iCisgICAgKTsKKyAgfQorCisgIHRlbXBsYXRlIFNlcnZpY2VUeXBlRGVwcyhUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgICBhbGlhcyBzdGF0aWNNYXAhKAorICAgICAgUEFwcGx5IShNZXRob2RUeXBlRGVwcywgVCksCisgICAgICBGaWx0ZXJNZXRob2ROYW1lcyEoVCwgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKQorICAgICkgU2VydmljZVR5cGVEZXBzOworICB9CisKKyAgdGVtcGxhdGUgTWV0aG9kVHlwZURlcHMoVCwgc3RyaW5nIG5hbWUpIGlmICgKKyAgICBpc1NlcnZpY2UhVCAmJiBpc1NvbWVGdW5jdGlvbiEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpCisgICkgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgICBSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShULCBuYW1lKSksCisgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSwKKyAgICAgIEV4Y2VwdGlvblR5cGVzIShULCBuYW1lKQorICAgICkgTWV0aG9kVHlwZURlcHM7CisgIH0KKworICB0ZW1wbGF0ZSBFeGNlcHRpb25UeXBlcyhULCBzdHJpbmcgbmFtZSkgaWYgKAorICAgIGlzU2VydmljZSFUICYmIGlzU29tZUZ1bmN0aW9uIShNZW1iZXJUeXBlIShULCBuYW1lKSkKKyAgKSB7CisgICAgbWl4aW4oeworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKGdldE1ldGhvZE1ldGEhVCwgbmFtZSk7CisgICAgICBpZiAobWV0YS5lbXB0eSkgcmV0dXJuICJhbGlhcyBUeXBlVHVwbGUhKCkgRXhjZXB0aW9uVHlwZXM7IjsKKworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJhbGlhcyBUeXBlVHVwbGUhKCI7CisgICAgICBmb3JlYWNoIChpLCBlOyBtZXRhLmZyb250LmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgaWYgKGkgPiAwKSByZXN1bHQgfj0gIiwgIjsKKyAgICAgICAgcmVzdWx0IH49ICJtaXhpbihgVC4iIH4gZS50eXBlIH4gImApIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAiKSBFeGNlcHRpb25UeXBlczsiOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9KCkpOworICB9CisKKyAgdGVtcGxhdGUgQWRkQmFzZVNlcnZpY2VzKFQsIExpc3QuLi4pIHsKKyAgICBzdGF0aWMgaWYgKHN0YXRpY0luZGV4T2YhKFQsIExpc3QpID09IC0xKSB7CisgICAgICBhbGlhcyBOb0R1cGxpY2F0ZXMhKEJhc2VTZXJ2aWNlcyFULCBMaXN0KSBBZGRCYXNlU2VydmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIGFsaWFzIExpc3QgQWRkU3RydWN0V2l0aERlcHM7CisgICAgfQorICB9CisKKyAgdW5pdHRlc3QgeworICAgIGludGVyZmFjZSBBIHt9CisgICAgaW50ZXJmYWNlIEIgOiBBIHt9CisgICAgaW50ZXJmYWNlIEMgOiBCIHt9CisgICAgaW50ZXJmYWNlIEQgOiBBIHt9CisKKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEFkZEJhc2VTZXJ2aWNlcyEoQykgPT0gVHlwZVR1cGxlIShBLCBCLCBDKSkpOworICAgIHN0YXRpYyBhc3NlcnQoaXMoRm9yQWxsV2l0aExpc3QhKENvbmZpbmVkVHVwbGUhKEMsIEQpLCBBZGRCYXNlU2VydmljZXMpID09CisgICAgICBUeXBlVHVwbGUhKEEsIEQsIEIsIEMpKSk7CisgIH0KKworICB0ZW1wbGF0ZSBCYXNlU2VydmljZXMoVCwgUmVzdC4uLikgaWYgKGlzU2VydmljZSFUKSB7CisgICAgc3RhdGljIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIVQpIHsKKyAgICAgIGFsaWFzIEJhc2VTZXJ2aWNlcyEoQmFzZVNlcnZpY2UhVCwgVCwgUmVzdCkgQmFzZVNlcnZpY2VzOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKFQsIFJlc3QpIEJhc2VTZXJ2aWNlczsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBBZGRTdHJ1Y3RXaXRoRGVwcyhULCBMaXN0Li4uKSB7CisgICAgc3RhdGljIGlmIChzdGF0aWNJbmRleE9mIShULCBMaXN0KSA9PSAtMSkgeworICAgICAgLy8gVCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgTGlzdCwgc28gYWRkIFQgYW5kIHRoZSB0eXBlcyBpdCBkZXBlbmRzIG9uIGluCisgICAgICAvLyB0aGUgZnJvbnQuIEJlY2F1c2Ugd2l0aCB0aGUgVGhyaWZ0IGNvbXBpbGVyIHR5cGVzIGNhbiBvbmx5IGRlcGVuZCBvbgorICAgICAgLy8gb3RoZXIgdHlwZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLCB3ZSBjb2xsZWN0IGFsbCB0aGUKKyAgICAgIC8vIGRlcGVuZGVuY2llcywgcHJlcGVuZCB0aGVtIHRvIHRoZSBsaXN0LCBhbmQgdGhlbiBwcnVuZSB0aGUgZHVwbGljYXRlcworICAgICAgLy8gKGtlZXBpbmcgdGhlIGZpcnN0IG9jY3VycmVuY2VzKS4gSWYgdGhpcyByZXF1aXJlbWVudCBzaG91bGQgZXZlciBiZQorICAgICAgLy8gZHJvcHBlZCBmcm9tIFRocmlmdCwgdGhpcyBjb3VsZCBiZSBlYXNpbHkgYWRhcHRlZCB0byBoYW5kbGUgY2lyY3VsYXIKKyAgICAgIC8vIGRlcGVuZGVuY2llcyBieSBwYXNzaW5nIFR5cGVUdXBsZSEoVCwgTGlzdCkgdG8gRm9yQWxsV2l0aExpc3QgaW5zdGVhZAorICAgICAgLy8gb2YgYXBwZW5kaW5nIExpc3QgYWZ0ZXJ3YXJkcywgYW5kIHJlbW92aW5nIHRoZSBub3cgdW5uZWNlc3NhcnkKKyAgICAgIC8vIE5vRHVwbGljYXRlcy4KKyAgICAgIGFsaWFzIE5vRHVwbGljYXRlcyEoCisgICAgICAgIEZvckFsbFdpdGhMaXN0ISgKKyAgICAgICAgICBDb25maW5lZFR1cGxlISgKKyAgICAgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgICAgIENvbXBvc2l0ZVR5cGVEZXBzLAorICAgICAgICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgICAgICAgIFBBcHBseSEoTWVtYmVyVHlwZSwgVCksCisgICAgICAgICAgICAgICAgRmllbGROYW1lcyFUCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICApLAorICAgICAgICAgIC5BZGRTdHJ1Y3RXaXRoRGVwcywKKyAgICAgICAgICBUCisgICAgICAgICksCisgICAgICAgIExpc3QKKyAgICAgICkgQWRkU3RydWN0V2l0aERlcHM7CisgICAgfSBlbHNlIHsKKyAgICAgIGFsaWFzIExpc3QgQWRkU3RydWN0V2l0aERlcHM7CisgICAgfQorICB9CisKKyAgdmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgICBzdHJ1Y3QgQSB7fQorICAgIHN0cnVjdCBCIHsKKyAgICAgIEEgYTsKKyAgICAgIGludCBiOworICAgICAgQSBjOworICAgICAgc3RyaW5nIGQ7CisgICAgfQorICAgIHN0cnVjdCBDIHsKKyAgICAgIEIgYjsKKyAgICAgIEEgYTsKKyAgICB9CisKKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEFkZFN0cnVjdFdpdGhEZXBzIUMgPT0gVHlwZVR1cGxlIShBLCBCLCBDKSkpOworCisgICAgc3RydWN0IEQgeworICAgICAgQyBjOworICAgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFtURmllbGRNZXRhKCJjIiwgMCwgVFJlcS5JR05PUkUpXSk7CisgICAgfQorICAgIHN0YXRpYyBhc3NlcnQoaXMoQWRkU3RydWN0V2l0aERlcHMhRCA9PSBUeXBlVHVwbGUhKEQpKSk7CisgIH0KKworICB2ZXJzaW9uICh1bml0dGVzdCkgeworICAgIC8vIENpcmNsZXMgaW4gdGhlIHR5cGUgZGVwZW5kZW5jeSBncmFwaCBhcmUgbm90IGFsbG93ZWQgaW4gVGhyaWZ0LCBidXQgbWFrZQorICAgIC8vIHN1cmUgd2UgZmFpbCBpbiBhIHNhbmUgd2F5IGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGNvbXBpbGVyLgorCisgICAgc3RydWN0IFJlYzEgeworICAgICAgUmVjMltdIG90aGVyOworICAgIH0KKworICAgIHN0cnVjdCBSZWMyIHsKKyAgICAgIFJlYzFbXSBvdGhlcjsKKyAgICB9CisKKyAgICBzdGF0aWMgYXNzZXJ0KCFfX3RyYWl0cyhjb21waWxlcywgQWRkU3RydWN0V2l0aERlcHMhUmVjMSkpOworICB9CisKKyAgLyoKKyAgICogUmV0dXJucyB0aGUgbm9uLXByaW1pdGl2ZSB0eXBlcyBUIGRpcmVjdGx5IGRlcGVuZHMgb24uCisgICAqCisgICAqIEZvciBleGFtcGxlLCBDb21wb3NpdGVUeXBlRGVwcyFpbnQgd291bGQgeWllbGQgYW4gZW1wdHkgdHlwZSB0dXBsZSwKKyAgICogQ29tcG9zaXRlVHlwZURlcHMhU29tZVN0cnVjdCB3b3VsZCBnaXZlIFNvbWVTdHJ1Y3QsIGFuZAorICAgKiBDb21wb3NpdGVUeXBlRGVwcyEoQVtCXSkgYm90aCBDb21wb3NpdGVUeXBlRGVwcyFBIGFuZCBDb21wb3NpdGVUeXBlRGVwcyFCLgorICAgKi8KKyAgdGVtcGxhdGUgQ29tcG9zaXRlVHlwZURlcHMoVCkgeworICAgIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBib29sKSB8fCBpcyhGdWxseVVucXVhbCFUID09IGJ5dGUpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IHNob3J0KSB8fCBpcyhGdWxseVVucXVhbCFUID09IGludCkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gbG9uZykgfHwgaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gZG91YmxlKSB8fCBpcyhGdWxseVVucXVhbCFUID09IHZvaWQpCisgICAgKSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKCkgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSkgeworICAgICAgYWxpYXMgQ29tcG9zaXRlVHlwZURlcHMhVSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICBhbGlhcyBDb21wb3NpdGVUeXBlRGVwcyFFIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKENvbXBvc2l0ZVR5cGVEZXBzIUssIENvbXBvc2l0ZVR5cGVEZXBzIVYpIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBzdHJ1Y3QpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUIDogVEV4Y2VwdGlvbikKKyAgICApIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoRnVsbHlVbnF1YWwhVCkgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gVC5zdHJpbmdvZik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBJREwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCBzZXJ2aWNlLiBJREwgY29kZSBmb3IgYW55IHR5cGUKKyAqIGRlcGVuZGNpZXMgaXMgbm90IGluY2x1ZGVkLgorICovCit0ZW1wbGF0ZSBzZXJ2aWNlSWRsU3RyaW5nKFQpIGlmIChpc1NlcnZpY2UhVCkgeworICBlbnVtIHNlcnZpY2VJZGxTdHJpbmcgPSB7CisgICAgc3RyaW5nIHJlc3VsdCA9ICJzZXJ2aWNlICIgfiBULnN0cmluZ29mOworICAgIHN0YXRpYyBpZiAoaXNEZXJpdmVkU2VydmljZSFUKSB7CisgICAgICByZXN1bHQgfj0gIiBleHRlbmRzICIgfiBCYXNlU2VydmljZSFULnN0cmluZ29mOworICAgIH0KKyAgICByZXN1bHQgfj0gIiB7XG4iOworCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgRmlsdGVyTWV0aG9kTmFtZXMhKFQsIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkpIHsKKyAgICAgIHJlc3VsdCB+PSAiICAiOworCisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoVC5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKworICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSAmJiBtZXRhLmZyb250LnR5cGUgPT0gVE1ldGhvZFR5cGUuT05FV0FZKSB7CisgICAgICAgIHJlc3VsdCB+PSAib25ld2F5ICI7CisgICAgICB9CisKKyAgICAgIGFsaWFzIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKFQsIG1ldGhvZE5hbWUpKSBSVDsKKyAgICAgIHN0YXRpYyBpZiAoaXMoUlQgPT0gdm9pZCkpIHsKKyAgICAgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIHRoaXMgaGVyZSBpbnN0ZWFkIG9mIGFkZGluZyB2b2lkIHRvIGRUb0lkbFR5cGUgdG8KKyAgICAgICAgLy8gYXZvaWQgYWNjZXB0aW5nIHRoaW5ncyBsaWtlIHZvaWRbXS4KKyAgICAgICAgcmVzdWx0IH49ICJ2b2lkICI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgfj0gZFRvSWRsVHlwZSFSVCB+ICIgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSBtZXRob2ROYW1lIH4gIigiOworCisgICAgICBzaG9ydCBsYXN0SWQ7CisgICAgICBmb3JlYWNoIChpLCBQYXJhbVR5cGU7IFBhcmFtZXRlclR5cGVUdXBsZSEoTWVtYmVyVHlwZSEoVCwgbWV0aG9kTmFtZSkpKSB7CisgICAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkgJiYgaSA8IG1ldGEuZnJvbnQucGFyYW1zLmxlbmd0aCkgeworICAgICAgICAgIGVudW0gaGF2ZVBNID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnVtIGhhdmVQTSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc2hvcnQgaWQ7CisgICAgICAgIHN0YXRpYyBpZiAoaGF2ZVBNKSB7CisgICAgICAgICAgaWQgPSBtZXRhLmZyb250LnBhcmFtc1tpXS5pZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZCA9IC0tbGFzdElkOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIHBhcmFtTmFtZTsKKyAgICAgICAgc3RhdGljIGlmIChoYXZlUE0pIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSBtZXRhLmZyb250LnBhcmFtc1tpXS5uYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0IH49IHRvIXN0cmluZyhpZCkgfiAiOiAiIH4gZFRvSWRsVHlwZSFQYXJhbVR5cGUgfiAiICIgfiBwYXJhbU5hbWU7CisKKyAgICAgICAgc3RhdGljIGlmIChoYXZlUE0gJiYgIW1ldGEuZnJvbnQucGFyYW1zW2ldLmRlZmF1bHRWYWx1ZS5lbXB0eSkgeworICAgICAgICAgIHJlc3VsdCB+PSAiID0gIiB+IGRUb0lkbENvbnN0KG1peGluKG1ldGEuZnJvbnQucGFyYW1zW2ldLmRlZmF1bHRWYWx1ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGdldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHBhcmFtZXRlcnMgZnJvbSBhCisgICAgICAgICAgLy8gZnVuY3Rpb24gYWxpYXMgaXNuJ3QgcG9zc2libGUg4oCTIHdlIGNhbid0IHRyYW5zZmVyIHRoZSBkZWZhdWx0CisgICAgICAgICAgLy8gdmFsdWUgdG8gdGhlIElETCBlLmcuIGZvciBpbnRlcmZhY2UgRm9vIHsgdm9pZCBmb28oaW50IGEgPSA1KTsgfQorICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIHVzZXIgZXhwbGljaXRseSBkZWNsYXJpbmcgaXQgaW4gbWV0YWRhdGEuCisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IH49ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIikiOworCisgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmICFtZXRhLmZyb250LmV4Y2VwdGlvbnMuZW1wdHkpIHsKKyAgICAgICAgcmVzdWx0IH49ICIgdGhyb3dzICgiOworICAgICAgICBmb3JlYWNoIChlOyBtZXRhLmZyb250LmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICByZXN1bHQgfj0gdG8hc3RyaW5nKGUuaWQpIH4gIjogIiB+IGUudHlwZSB+ICIgIiB+IGUubmFtZSB+ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IH49ICIpIjsKKyAgICAgIH0KKworICAgICAgcmVzdWx0IH49ICIsXG4iOworICAgIH0KKworICAgIHJlc3VsdCB+PSAifVxuIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBJREwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCBlbnVtLiBJREwgY29kZSBmb3IgYW55IHR5cGUKKyAqIGRlcGVuZGNpZXMgaXMgbm90IGluY2x1ZGVkLgorICovCit0ZW1wbGF0ZSBlbnVtSWRsU3RyaW5nKFQpIGlmIChpc0VudW0hVCkgeworICBlbnVtIGVudW1JZGxTdHJpbmcgPSB7CisgICAgc3RhdGljIGFzc2VydChpcyhPcmlnaW5hbFR5cGUhVCA6IGxvbmcpLAorICAgICAgIkNhbiBvbmx5IGhhdmUgaW50ZWdlciBlbnVtcyBpbiBUaHJpZnQgKG5vdCAiIH4gT3JpZ2luYWxUeXBlIVQuc3RyaW5nb2YgfgorICAgICAgIiwgZm9yICIgfiBULnN0cmluZ29mIH4gIikuIik7CisKKyAgICBzdHJpbmcgcmVzdWx0ID0gImVudW0gIiB+IFQuc3RyaW5nb2YgfiAiIHtcbiI7CisKKyAgICBmb3JlYWNoIChuYW1lOyBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpIHsKKyAgICAgIHJlc3VsdCB+PSAiICAiIH4gbmFtZSB+ICIgPSAiIH4gZFRvSWRsQ29uc3QoR2V0TWVtYmVyIShULCBuYW1lKSkgfiAiLFxuIjsKKyAgICB9CisKKyAgICByZXN1bHQgfj0gIn1cbiI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSgpOworfQorCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgc3RydWN0LiBJREwgY29kZSBmb3IgYW55IHR5cGUKKyAqIGRlcGVuZGNpZXMgaXMgbm90IGluY2x1ZGVkLgorICovCit0ZW1wbGF0ZSBzdHJ1Y3RJZGxTdHJpbmcoVCkgaWYgKGlzU3RydWN0IVQgfHwgaXNFeGNlcHRpb24hVCkgeworICBlbnVtIHN0cnVjdElkbFN0cmluZyA9IHsKKyAgICBtaXhpbih7CisgICAgICBzdHJpbmcgY29kZSA9ICIiOworICAgICAgZm9yZWFjaCAoZmllbGQ7IGdldEZpZWxkTWV0YSFUKSB7CisgICAgICAgIGNvZGUgfj0gInN0YXRpYyBhc3NlcnQoaXMoTWVtYmVyVHlwZSEoVCwgYCIgfiBmaWVsZC5uYW1lIH4gImApKSk7XG4iOworICAgICAgfQorICAgICAgcmV0dXJuIGNvZGU7CisgICAgfSgpKTsKKworICAgIHN0cmluZyByZXN1bHQ7CisgICAgc3RhdGljIGlmIChpc0V4Y2VwdGlvbiFUKSB7CisgICAgICByZXN1bHQgPSAiZXhjZXB0aW9uICI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9ICJzdHJ1Y3QgIjsKKyAgICB9CisgICAgcmVzdWx0IH49IFQuc3RyaW5nb2YgfiAiIHtcbiI7CisKKyAgICAvLyBUaGUgbGFzdCBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGlkIOKAkyBmaWVsZHMgd2l0aCBubyBtZXRhIGluZm9ybWF0aW9uCisgICAgLy8gYXJlIGFzc2lnbmVkIChpbiBsZXhpY2FsIG9yZGVyKSBkZXNjZW5kaW5nIG5lZ2F0aXZlIGlkcywgc3RhcnRpbmcgd2l0aAorICAgIC8vIC0xLCBqdXN0IGxpa2UgdGhlIFRocmlmdCBjb21waWxlciBkb2VzLgorICAgIHNob3J0IGxhc3RJZDsKKworICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVCkgeworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKGdldEZpZWxkTWV0YSFULCBuYW1lKTsKKworICAgICAgc3RhdGljIGlmIChtZXRhLmVtcHR5IHx8IG1ldGEuZnJvbnQucmVxICE9IFRSZXEuSUdOT1JFKSB7CisgICAgICAgIHNob3J0IGlkOworICAgICAgICBzdGF0aWMgaWYgKG1ldGEuZW1wdHkpIHsKKyAgICAgICAgICBpZCA9IC0tbGFzdElkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlkID0gbWV0YS5mcm9udC5pZDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCB+PSAiICAiIH4gdG8hc3RyaW5nKGlkKSB+ICI6IjsKKyAgICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICAgIHJlc3VsdCB+PSBkVG9JZGxSZXEobWV0YS5mcm9udC5yZXEpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiICIgfiBkVG9JZGxUeXBlIShNZW1iZXJUeXBlIShULCBuYW1lKSkgfiAiICIgfiBuYW1lOworCisgICAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkgJiYgIW1ldGEuZnJvbnQuZGVmYXVsdFZhbHVlLmVtcHR5KSB7CisgICAgICAgICAgcmVzdWx0IH49ICIgPSAiIH4gZFRvSWRsQ29uc3QobWl4aW4obWV0YS5mcm9udC5kZWZhdWx0VmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIGZpZWxkSW5pdEEhKFQsIG5hbWUpKSkgeworICAgICAgICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKGZpZWxkSW5pdEEhKFQsIG5hbWUpKSkgJiYKKyAgICAgICAgICAgICFpcyh0eXBlb2YoZmllbGRJbml0QSEoVCwgbmFtZSkpID09IHZvaWQpCisgICAgICAgICAgKSB7CisgICAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChmaWVsZEluaXRBIShULCBuYW1lKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyh0eXBlb2YoZmllbGRJbml0QiEoVCwgbmFtZSkpKSAmJgorICAgICAgICAgICFpcyh0eXBlb2YoZmllbGRJbml0QiEoVCwgbmFtZSkpID09IHZvaWQpCisgICAgICAgICkgeworICAgICAgICAgIHJlc3VsdCB+PSAiID0gIiB+IGRUb0lkbENvbnN0KGZpZWxkSW5pdEIhKFQsIG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgfj0gIixcbiI7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0IH49ICJ9XG4iOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KKworcHJpdmF0ZSB7CisgIC8vIFRoaXMgdmVyeSBjb252b2x1dGVkIHdheSBvZiBkb2luZyB0aGluZ3Mgd2FzIGNob3NlbiBiZWNhdXNlIHB1dHRpbmcgdGhlCisgIC8vIHN0YXRpYyBpZiBkaXJlY3RseSBpbnRvIHN0cnVjdElkbFN0cmluZyBjYXVzZWQgwrtub3QgZXZhbHVhdGFibGUgYXQgY29tcGlsZQorICAvLyB0aW1lwqsgZXJyb3JzIHRvIHNsaXAgdGhyb3VnaCBldmVuIHRob3VnaCB0eXBlb2YoKSB3YXMgdXNlZCwgcmVzcC4gdGhlCisgIC8vIGNvbmRpdGlvbiB0byBiZSB0cnVlIGV2ZW4gdGhvdWdoIHRoZSB2YWx1ZSBjb3VsZG4ndCBhY3R1YWxseSBiZSByZWFkIGF0CisgIC8vIGNvbXBpbGUgdGltZSBkdWUgdG8gYSBAQEJVR0BAIGluIERNRCAyLjA1NS4KKyAgLy8gVGhlIGV4dHJhIMK7Y29tcGlsZWTCqyBmaWVsZCBpbiBmaWVsZEluaXRBIGlzIG5lZWRlZCBiZWNhdXNlIHdlIG11c3Qgbm90IHRyeQorICAvLyB0byB1c2UgIT0gaWYgIWlzIGNvbXBpbGVkIGFzIHdlbGwgKGJ1dCB3YXMgZmFsc2UpLCBlLmcuIGZvciBmbG9hdGluZyBwb2ludAorICAvLyB0eXBlcy4KKyAgdGVtcGxhdGUgZmllbGRJbml0QShULCBzdHJpbmcgbmFtZSkgeworICAgIHN0YXRpYyBpZiAobWl4aW4oIlQuaW5pdC4iIH4gbmFtZSkgIWlzIE1lbWJlclR5cGUhKFQsIG5hbWUpLmluaXQpIHsKKyAgICAgIGVudW0gZmllbGRJbml0QSA9IG1peGluKCJULmluaXQuIiB+IG5hbWUpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIGZpZWxkSW5pdEIoVCwgc3RyaW5nIG5hbWUpIHsKKyAgICBzdGF0aWMgaWYgKG1peGluKCJULmluaXQuIiB+IG5hbWUpICE9IE1lbWJlclR5cGUhKFQsIG5hbWUpLmluaXQpIHsKKyAgICAgIGVudW0gZmllbGRJbml0QiA9IG1peGluKCJULmluaXQuIiB+IG5hbWUpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIGRUb0lkbFR5cGUoVCkgeworICAgIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBib29sKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImJvb2wiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJieXRlIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGRvdWJsZSkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJkb3VibGUiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gc2hvcnQpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiaTE2IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGludCkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJpMzIiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gbG9uZykpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJpNjQiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgOiBzdHJpbmcpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAic3RyaW5nIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBVW10sIFUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAibGlzdDwiIH4gZFRvSWRsVHlwZSFVIH4gIj4iOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAibWFwPCIgfiBkVG9JZGxUeXBlIUsgfiAiLCAiIH4gZFRvSWRsVHlwZSFWIH4gIj4iOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IEhhc2hTZXQhRSwgRSkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJzZXQ8IiB+IGRUb0lkbFR5cGUhRSB+ICI+IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBlbnVtKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA6IFRFeGNlcHRpb24pCisgICAgKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSBGdWxseVVucXVhbCEoVCkuc3RyaW5nb2Y7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gVC5zdHJpbmdvZik7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGRUb0lkbFJlcShUUmVxIHJlcSkgeworICAgIHN3aXRjaCAocmVxKSB7CisgICAgICBjYXNlIFRSZXEuUkVRVUlSRUQ6IHJldHVybiAiIHJlcXVpcmVkIjsKKyAgICAgIGNhc2UgVFJlcS5PUFRJT05BTDogcmV0dXJuICIgb3B0aW9uYWwiOworICAgICAgZGVmYXVsdDogcmV0dXJuICIiOworICAgIH0KKyAgfQorCisgIHN0cmluZyBkVG9JZGxDb25zdChUKShUIHZhbHVlKSB7CisgICAgc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJvb2wpKSB7CisgICAgICByZXR1cm4gdmFsdWUgPyAiMSIgOiAiMCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBieXRlKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IGxvbmcpCisgICAgKSB7CisgICAgICByZXR1cm4gdG8hc3RyaW5nKHZhbHVlKTsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogc3RyaW5nKSkgeworICAgICAgcmV0dXJuIGAiYCB+IHRvIXN0cmluZyh2YWx1ZSkgfiBgImA7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpKSB7CisgICAgICByZXR1cm4gY3RmZVRvU3RyaW5nKHZhbHVlKTsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBVW10sIFUpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUIF8gOiBIYXNoU2V0IUUsIEUpCisgICAgKSB7CisgICAgICBzdHJpbmcgcmVzdWx0ID0gIlsiOworICAgICAgZm9yZWFjaCAoZTsgdmFsdWUpIHsKKyAgICAgICAgcmVzdWx0IH49IGRUb0lkbENvbnN0KGUpIH4gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAiXSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0ID0gInsiOworICAgICAgZm9yZWFjaCAoa2V5LCB2YWw7IHZhbHVlKSB7CisgICAgICAgIHJlc3VsdCB+PSBkVG9JZGxDb25zdChrZXkpIH4gIjogIiB+IGRUb0lkbENvbnN0KHZhbCkgfiAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0IH49ICJ9IjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBlbnVtKSkgeworICAgICAgaW1wb3J0IHN0ZC5jb252OworICAgICAgaW1wb3J0IHN0ZC50cmFpdHM7CisgICAgICByZXR1cm4gdG8hc3RyaW5nKGNhc3QoT3JpZ2luYWxUeXBlIVQpdmFsdWUpOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gc3RydWN0KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA6IFRFeGNlcHRpb24pCisgICAgKSB7CisgICAgICBzdHJpbmcgcmVzdWx0ID0gInsiOworICAgICAgZm9yZWFjaCAobmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSB7CisgICAgICAgIHN0YXRpYyBpZiAobWVtYmVyUmVxIShULCBuYW1lKSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICAgIHJlc3VsdCB+PSBuYW1lIH4gIjogIiB+IGRUb0lkbENvbnN0KG1peGluKCJ2YWx1ZS4iIH4gbmFtZSkpIH4gIiwgIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzdWx0IH49ICJ9IjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gVC5zdHJpbmdvZik7CisgICAgfQorICB9Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGVudW0gRm9vIHsKKyAgICBhID0gMSwKKyAgICBiID0gMTAsCisgICAgYyA9IDUKKyAgfQorCisgIHN0YXRpYyBhc3NlcnQoZW51bUlkbFN0cmluZyFGb28gPT0KK2BlbnVtIEZvbyB7CisgIGEgPSAxLAorICBiID0gMTAsCisgIGMgPSA1LAorfQorYCk7Cit9CisKKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgc3RydWN0IFdpdGhvdXRNZXRhIHsKKyAgICBzdHJpbmcgYTsKKyAgICBpbnQgYjsKKyAgfQorCisgIHN0cnVjdCBXaXRoRGVmYXVsdHMgeworICAgIHN0cmluZyBhID0gImFzZGYiOworICAgIGRvdWJsZSBiID0gMy4xNDE1OworICAgIFdpdGhvdXRNZXRhIGM7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYyIsIDEsIFRSZXEuaW5pdCwgYFdpdGhvdXRNZXRhKCJmb28iLCAzKWApCisgICAgXSk7CisgIH0KKworICAvLyBUaGVzZSBhcmUgZnJvbSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQuCisgIHN0cnVjdCBPbmVPZkVhY2ggeworICAgIGJvb2wgaW1fdHJ1ZTsKKyAgICBib29sIGltX2ZhbHNlOworICAgIGJ5dGUgYV9iaXRlOworICAgIHNob3J0IGludGVnZXIxNjsKKyAgICBpbnQgaW50ZWdlcjMyOworICAgIGxvbmcgaW50ZWdlcjY0OworICAgIGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uOworICAgIHN0cmluZyBzb21lX2NoYXJhY3RlcnM7CisgICAgc3RyaW5nIHpvbWdfdW5pY29kZTsKKyAgICBib29sIHdoYXRfd2hvOworICAgIHN0cmluZyBiYXNlNjQ7CisgICAgYnl0ZVtdIGJ5dGVfbGlzdDsKKyAgICBzaG9ydFtdIGkxNl9saXN0OworICAgIGxvbmdbXSBpNjRfbGlzdDsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKGBpbV90cnVlYCwgMSksCisgICAgICBURmllbGRNZXRhKGBpbV9mYWxzZWAsIDIpLAorICAgICAgVEZpZWxkTWV0YShgYV9iaXRlYCwgMywgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXtjYXN0KGJ5dGUpMTI3fSksCisgICAgICBURmllbGRNZXRhKGBpbnRlZ2VyMTZgLCA0LCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxe2Nhc3Qoc2hvcnQpMzI3Njd9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGludGVnZXIzMmAsIDUpLAorICAgICAgVEZpZWxkTWV0YShgaW50ZWdlcjY0YCwgNiwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXsxMDAwMDAwMDAwMEx9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGRvdWJsZV9wcmVjaXNpb25gLCA3KSwKKyAgICAgIFRGaWVsZE1ldGEoYHNvbWVfY2hhcmFjdGVyc2AsIDgpLAorICAgICAgVEZpZWxkTWV0YShgem9tZ191bmljb2RlYCwgOSksCisgICAgICBURmllbGRNZXRhKGB3aGF0X3dob2AsIDEwKSwKKyAgICAgIFRGaWVsZE1ldGEoYGJhc2U2NGAsIDExKSwKKyAgICAgIFRGaWVsZE1ldGEoYGJ5dGVfbGlzdGAsIDEyLCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxe3sKKyAgICAgICAgYnl0ZVtdIHY7CisgICAgICAgIHYgfj0gY2FzdChieXRlKTE7CisgICAgICAgIHYgfj0gY2FzdChieXRlKTI7CisgICAgICAgIHYgfj0gY2FzdChieXRlKTM7CisgICAgICAgIHJldHVybiB2OworICAgICAgfSgpfSksCisgICAgICBURmllbGRNZXRhKGBpMTZfbGlzdGAsIDEzLCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxe3sKKyAgICAgICAgc2hvcnRbXSB2OworICAgICAgICB2IH49IGNhc3Qoc2hvcnQpMTsKKyAgICAgICAgdiB+PSBjYXN0KHNob3J0KTI7CisgICAgICAgIHYgfj0gY2FzdChzaG9ydCkzOworICAgICAgICByZXR1cm4gdjsKKyAgICAgIH0oKX0pLAorICAgICAgVEZpZWxkTWV0YShgaTY0X2xpc3RgLCAxNCwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXt7CisgICAgICAgIGxvbmdbXSB2OworICAgICAgICB2IH49IDFMOworICAgICAgICB2IH49IDJMOworICAgICAgICB2IH49IDNMOworICAgICAgICByZXR1cm4gdjsKKyAgICAgIH0oKX0pCisgICAgXSk7CisgIH0KKworICBzdHJ1Y3QgQm9uayB7CisgICAgaW50IHR5cGU7CisgICAgc3RyaW5nIG1lc3NhZ2U7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgdHlwZWAsIDEpLAorICAgICAgVEZpZWxkTWV0YShgbWVzc2FnZWAsIDIpCisgICAgXSk7CisgIH0KKworICBzdHJ1Y3QgSG9seU1vbGV5IHsKKyAgICBPbmVPZkVhY2hbXSBiaWc7CisgICAgSGFzaFNldCEoc3RyaW5nW10pIGNvbnRhaW47CisgICAgQm9ua1tdW3N0cmluZ10gYm9ua3M7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgYmlnYCwgMSksCisgICAgICBURmllbGRNZXRhKGBjb250YWluYCwgMiksCisgICAgICBURmllbGRNZXRhKGBib25rc2AsIDMpCisgICAgXSk7CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRob3V0TWV0YSA9PQorYHN0cnVjdCBXaXRob3V0TWV0YSB7CisgIC0xOiBzdHJpbmcgYSwKKyAgLTI6IGkzMiBiLAorfQorYCk7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMuc3RhcnRzV2l0aCgKK2BzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKKyAgLTE6IHN0cmluZyBhID0gImFzZGYiLAorICAtMjogZG91YmxlIGIgPSAzLjE0MWApKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMuZW5kc1dpdGgoCitgMTogV2l0aG91dE1ldGEgYyA9IHthOiAiZm9vIiwgYjogMywgfSwKK30KK2ApKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFPbmVPZkVhY2ggPT0KK2BzdHJ1Y3QgT25lT2ZFYWNoIHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBieXRlIGFfYml0ZSA9IDEyNywKKyAgNDogaTE2IGludGVnZXIxNiA9IDMyNzY3LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0ID0gMTAwMDAwMDAwMDAsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKKyAgMTE6IHN0cmluZyBiYXNlNjQsCisgIDEyOiBsaXN0PGJ5dGU+IGJ5dGVfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxMzogbGlzdDxpMTY+IGkxNl9saXN0ID0gWzEsIDIsIDMsIF0sCisgIDE0OiBsaXN0PGk2ND4gaTY0X2xpc3QgPSBbMSwgMiwgMywgXSwKK30KK2ApOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIUJvbmsgPT0KK2BzdHJ1Y3QgQm9uayB7CisgIDE6IGkzMiB0eXBlLAorICAyOiBzdHJpbmcgbWVzc2FnZSwKK30KK2ApOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIUhvbHlNb2xleSA9PQorYHN0cnVjdCBIb2x5TW9sZXkgeworICAxOiBsaXN0PE9uZU9mRWFjaD4gYmlnLAorICAyOiBzZXQ8bGlzdDxzdHJpbmc+PiBjb250YWluLAorICAzOiBtYXA8c3RyaW5nLCBsaXN0PEJvbms+PiBib25rcywKK30KK2ApOworfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBjbGFzcyBFeGNlcHRpb25XaXRoQU1hcCA6IFRFeGNlcHRpb24geworICAgIHN0cmluZyBibGFoOworICAgIHN0cmluZ1tzdHJpbmddIG1hcF9maWVsZDsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKGBibGFoYCwgMSksCisgICAgICBURmllbGRNZXRhKGBtYXBfZmllbGRgLCAyKQorICAgIF0pOworICB9CisKKyAgaW50ZXJmYWNlIFNydiB7CisgICAgdm9pZCB2b2lkTWV0aG9kKCk7CisgICAgaW50IHByaW1pdGl2ZU1ldGhvZCgpOworICAgIE9uZU9mRWFjaCBzdHJ1Y3RNZXRob2QoKTsKKyAgICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncyhpbnQgc29tZXRoaW5nKTsKKyAgICB2b2lkIG9uZXdheU1ldGhvZCgpOworICAgIHZvaWQgZXhjZXB0aW9uTWV0aG9kKCk7CisKKyAgICBhbGlhcyAuRXhjZXB0aW9uV2l0aEFNYXAgRXhjZXB0aW9uV2l0aEFNYXA7CisKKyAgICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgICAgICBUTWV0aG9kTWV0YShgbWV0aG9kV2l0aERlZmF1bHRBcmdzYCwKKyAgICAgICAgW1RQYXJhbU1ldGEoYHNvbWV0aGluZ2AsIDEsIHF7Mn0pXQorICAgICAgKSwKKyAgICAgIFRNZXRob2RNZXRhKGBvbmV3YXlNZXRob2RgLAorICAgICAgICBbXSwKKyAgICAgICAgW10sCisgICAgICAgIFRNZXRob2RUeXBlLk9ORVdBWQorICAgICAgKSwKKyAgICAgIFRNZXRob2RNZXRhKGBleGNlcHRpb25NZXRob2RgLAorICAgICAgICBbXSwKKyAgICAgICAgWworICAgICAgICAgIFRFeGNlcHRpb25NZXRhKCJhIiwgMSwgIkV4Y2VwdGlvbldpdGhBTWFwIiksCisgICAgICAgICAgVEV4Y2VwdGlvbk1ldGEoImIiLCAyLCAiRXhjZXB0aW9uV2l0aEFNYXAiKQorICAgICAgICBdCisgICAgICApCisgICAgXTsKKyAgfQorCisgIGludGVyZmFjZSBDaGlsZFNydiA6IFNydiB7CisgICAgaW50IGNoaWxkTWV0aG9kKGludCBhcmcpOworICB9CisKKyAgc3RhdGljIGFzc2VydChpZGxTdHJpbmchQ2hpbGRTcnYgPT0KK2BleGNlcHRpb24gRXhjZXB0aW9uV2l0aEFNYXAgeworICAxOiBzdHJpbmcgYmxhaCwKKyAgMjogbWFwPHN0cmluZywgc3RyaW5nPiBtYXBfZmllbGQsCit9CisKK3N0cnVjdCBPbmVPZkVhY2ggeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlID0gMTI3LAorICA0OiBpMTYgaW50ZWdlcjE2ID0gMzI3NjcsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorICAxMTogc3RyaW5nIGJhc2U2NCwKKyAgMTI6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDMsIF0sCisgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwgMiwgMywgXSwKKyAgMTQ6IGxpc3Q8aTY0PiBpNjRfbGlzdCA9IFsxLCAyLCAzLCBdLAorfQorCitzZXJ2aWNlIFNydiB7CisgIHZvaWQgdm9pZE1ldGhvZCgpLAorICBpMzIgcHJpbWl0aXZlTWV0aG9kKCksCisgIE9uZU9mRWFjaCBzdHJ1Y3RNZXRob2QoKSwKKyAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoMTogaTMyIHNvbWV0aGluZyA9IDIsICksCisgIG9uZXdheSB2b2lkIG9uZXdheU1ldGhvZCgpLAorICB2b2lkIGV4Y2VwdGlvbk1ldGhvZCgpIHRocm93cyAoMTogRXhjZXB0aW9uV2l0aEFNYXAgYSwgMjogRXhjZXB0aW9uV2l0aEFNYXAgYiwgKSwKK30KKworc2VydmljZSBDaGlsZFNydiBleHRlbmRzIFNydiB7CisgIGkzMiBjaGlsZE1ldGhvZCgtMTogaTMyIHBhcmFtMSwgKSwKK30KK2ApOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTdhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogZmluZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlLCBVbnF1YWw7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworCisvKioKKyAqIFNlcnZpY2UgcHJvY2Vzc29yIGZvciBJbnRlcmZhY2UsIHdoaWNoIGltcGxlbWVudHMgVFByb2Nlc3NvciBieQorICogc3luY2hyb25vdXNseSBmb3J3YXJkaW5nIHJlcXVlc3RzIGZvciB0aGUgc2VydmljZSBtZXRob2RzIHRvIGEgaGFuZGxlcgorICogaW1wbGVtZW50aW5nIEludGVyZmFjZS4KKyAqCisgKiBUaGUgZ2VuZXJhdGVkIGNsYXNzIGltcGxlbWVudHMgVFByb2Nlc3NvciBhbmQgYWRkaXRpb25hbGx5IGFsbG93cyBhCisgKiBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlIHB1YmxpYyBldmVudEhhbmRsZXIgcHJvcGVydHkuCisgKiBUaGUgY29uc3RydWN0b3IgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgb2YgdHlwZSBJbnRlcmZhY2UsIHdoaWNoIGlzIHRoZQorICogaGFuZGxlciB0byBmb3J3YXJkIHRoZSByZXF1ZXN0cyB0bzoKKyAqIC0tLQorICogdGhpcyhJbnRlcmZhY2UgaWZhY2UpOworICogVFByb2Nlc3NvckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7CisgKiAtLS0KKyAqCisgKiBJZiBJbnRlcmZhY2UgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZSBCYXNlSW50ZXJmYWNlLCB0aGlzIGNsYXNzIGlzCisgKiBhbHNvIGRlcml2ZWQgZnJvbSBUU2VydmljZVByb2Nlc3NvciFCYXNlSW50ZXJmYWNlLgorICoKKyAqIFRoZSBvcHRpb25hbCBQcm90b2NvbHMgdGVtcGxhdGUgdHVwbGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAqIG9uZSBvciBtb3JlIFRQcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMgdG8gc3BlY2lmaWNhbGx5IGdlbmVyYXRlIGNvZGUgZm9yLiBJZgorICogdGhlIGFjdHVhbCB0eXBlcyBvZiB0aGUgcHJvdG9jb2xzIHBhc3NlZCB0byBwcm9jZXNzKCkgYXQgcnVudGltZSBtYXRjaCBvbmUKKyAqIG9mIHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0LCB0aGUgb3B0aW1pemVkIGNvZGUgcGF0aHMgYXJlIHRha2VuLCBvdGhlcndpc2UsCisgKiBhIGdlbmVyaWMgVFByb3RvY29sIHZlcnNpb24gaXMgdXNlZCBhcyBmYWxsYmFjay4gRm9yIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAorICogYW5kIG91dHB1dCBwcm90b2NvbHMgZGlmZmVyLCBUUHJvdG9jb2xQYWlyIShJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCkKKyAqIGNhbiBiZSB1c2VkIGluIHRoZSBQcm90b2NvbHMgbGlzdDoKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvb1NlcnZpY2UgeyB2b2lkIGZvbygpOyB9CisgKiBjbGFzcyBGb29JbXBsIHsgb3ZlcnJpZGUgdm9pZCBmb28ge30gfQorICoKKyAqIC8vIFByb3ZpZGVzIGZhc3QgcGF0aCBpZiBUQmluYXJ5UHJvdG9jb2whVEJ1ZmZlcmVkVHJhbnNwb3J0IGlzIHVzZWQgZm9yCisgKiAvLyBib3RoIGlucHV0IGFuZCBvdXRwdXQ6CisgKiBhbGlhcyBUU2VydmljZVByb2Nlc3NvciEoRm9vU2VydmljZSwgVEJpbmFyeVByb3RvY29sIVRCdWZmZXJlZFRyYW5zcG9ydCkKKyAqICAgQmluYXJ5UHJvY2Vzc29yOworICoKKyAqIGF1dG8gcHJvYyA9IG5ldyBCaW5hcnlQcm9jZXNzb3IobmV3IEZvb0ltcGwoKSk7CisgKgorICogLy8gTG93IG92ZXJoZWFkLgorICogcHJvYy5wcm9jZXNzKHRCaW5hcnlQcm90b2NvbCh0QnVmZmVyVHJhbnNwb3J0KHNvbWVTb2NrZXQpKSk7CisgKgorICogLy8gTm90IGluIHRoZSBzcGVjaWFsaXphdGlvbiBsaXN0IOKAkyBoaWdoZXIgb3ZlcmhlYWQuCisgKiBwcm9jLnByb2Nlc3ModEJpbmFyeVByb3RvY29sKHRGcmFtZWRUcmFuc3BvcnQoc29tZVNvY2tldCkpKTsKKyAqCisgKiAvLyBTYW1lIGFzIGFib3ZlLCBidXQgb3B0aW1pemVkIGZvciB0aGUgQ29tcGFjdCBwcm90b2NvbCBiYWNrZWQgYnkgYQorICogLy8gVFBpcGVkVHJhbnNwb3J0IGZvciBpbnB1dCBhbmQgYSBUQnVmZmVyZWRUcmFuc3BvcnQgZm9yIG91dHB1dC4KKyAqIGFsaWFzIFRTZXJ2aWNlUHJvY2Vzc29yIShGb29TZXJ2aWNlLCBUUHJvdG9jb2xQYWlyISgKKyAqICAgVENvbXBhY3RQcm90b2NvbCFUUGlwZWRUcmFuc3BvcnQsIFRDb21wYWN0UHJvdG9jb2whVEJ1ZmZlcmVkVHJhbnNwb3J0KQorICogKSBNaXhlZFByb2Nlc3NvcjsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBUU2VydmljZVByb2Nlc3NvcihJbnRlcmZhY2UsIFByb3RvY29scy4uLikgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGFsbFNhdGlzZnkhKGlzVFByb3RvY29sT3JQYWlyLCBQcm90b2NvbHMpCispIHsKKyAgbWl4aW4oeworICAgIHN0YXRpYyBpZiAoaXMoSW50ZXJmYWNlIEJhc2VJbnRlcmZhY2VzID09IHN1cGVyKSAmJiBCYXNlSW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KEJhc2VJbnRlcmZhY2VzLmxlbmd0aCA9PSAxLAorICAgICAgICAiU2VydmljZXMgY2Fubm90IGJlIGRlcml2ZWQgZnJvbSBtb3JlIHRoYW4gb25lIHBhcmVudC4iKTsKKworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVFNlcnZpY2VQcm9jZXNzb3IgOiAiIH4KKyAgICAgICAgIlRTZXJ2aWNlUHJvY2Vzc29yIShCYXNlU2VydmljZSFJbnRlcmZhY2UpIHtcbiI7CisgICAgICBjb2RlIH49ICJwcml2YXRlIEludGVyZmFjZSBpZmFjZV87XG4iOworCisgICAgICBzdHJpbmcgY29uc3RydWN0b3JDb2RlID0gInRoaXMoSW50ZXJmYWNlIGlmYWNlKSB7XG4iOworICAgICAgY29uc3RydWN0b3JDb2RlIH49ICJzdXBlcihpZmFjZSk7XG4iOworICAgICAgY29uc3RydWN0b3JDb2RlIH49ICJpZmFjZV8gPSBpZmFjZTtcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRTZXJ2aWNlUHJvY2Vzc29yIDogVFByb2Nlc3NvciB7IjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgb3ZlcnJpZGUgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LAorICAgICAgICAgIFZhcmlhbnQgY29udGV4dCA9IFZhcmlhbnQoKQorICAgICAgICApIHsKKyAgICAgICAgICBhdXRvIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgICAgIHZvaWQgd3JpdGVFeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLAorICAgICAgICAgICAgICBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgIGUud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC50cmFuc3BvcnQud3JpdGVFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChtc2cudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCAmJiBtc2cudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LnRyYW5zcG9ydC5yZWFkRW5kKCk7CisKKyAgICAgICAgICAgIHdyaXRlRXhjZXB0aW9uKG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5UeXBlLklOVkFMSURfTUVTU0FHRV9UWVBFKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXV0byBkZyA9IG1zZy5uYW1lIGluIHByb2Nlc3NNYXBfOworICAgICAgICAgIGlmICghZGcpIHsKKyAgICAgICAgICAgIHNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7CisgICAgICAgICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgaXByb3QudHJhbnNwb3J0LnJlYWRFbmQoKTsKKworICAgICAgICAgICAgd3JpdGVFeGNlcHRpb24obmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBtZXRob2QgbmFtZTogJyIgfgorICAgICAgICAgICAgICBtc2cubmFtZSB+ICInLiIsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5UeXBlLklOVkFMSURfTUVTU0FHRV9UWVBFKSk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAoKmRnKShtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCwgY29udGV4dCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcjsKKworICAgICAgICBhbGlhcyB2b2lkIGRlbGVnYXRlKGludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsIFZhcmlhbnQpIFByb2Nlc3NGdW5jOworICAgICAgICBwcm90ZWN0ZWQgUHJvY2Vzc0Z1bmNbc3RyaW5nXSBwcm9jZXNzTWFwXzsKKyAgICAgICAgcHJpdmF0ZSBJbnRlcmZhY2UgaWZhY2VfOworICAgICAgfTsKKworICAgICAgc3RyaW5nIGNvbnN0cnVjdG9yQ29kZSA9ICJ0aGlzKEludGVyZmFjZSBpZmFjZSkge1xuIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAiaWZhY2VfID0gaWZhY2U7XG4iOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGluZyBjb2RlIGZvciBlYWNoIG1ldGhvZCwgY29uc2lzdGluZyBvZiB0aGUgZGlzcGF0Y2gKKyAgICAvLyBmdW5jdGlvbiwgcmVnaXN0ZXJpbmcgaXQgaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgdGhlIGFjdHVhbCB0ZW1wbGF0ZWQKKyAgICAvLyBoYW5kbGVyIGZ1bmN0aW9uLgorICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7CisgICAgICBGaWx0ZXJNZXRob2ROYW1lcyEoSW50ZXJmYWNlLCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgSW50ZXJmYWNlKSkKKyAgICApIHsKKyAgICAgIC8vIFJlZ2lzdGVyIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgIGltbXV0YWJsZSBwcm9jRnVuY05hbWUgPSAicHJvY2Vzc18iIH4gbWV0aG9kTmFtZTsKKyAgICAgIGltbXV0YWJsZSBkaXNwYXRjaEZ1bmNOYW1lID0gcHJvY0Z1bmNOYW1lIH4gIl9wcm90b2NvbERpc3BhdGNoIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAicHJvY2Vzc01hcF9bYCIgfiBtZXRob2ROYW1lIH4gImBdID0gJiIgfgorICAgICAgICBkaXNwYXRjaEZ1bmNOYW1lIH4gIjtcbiI7CisKKyAgICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICAgICAgbWV0aG9kTWV0YSA9IG1ldGEuZnJvbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHRvIGNhbGwgdGhlIHNwZWNpYWxpemVkIGhhbmRsZXIgZnVuY3Rpb25zLiBXZQorICAgICAgLy8gdGVzdCB0aGUgcHJvdG9jb2xzIGlmIHRoZXkgY2FuIGJlIGNvbnZlcnRlZCB0byBvbmUgb2YgdGhlIHBhc3NlZAorICAgICAgLy8gcHJvdG9jb2wgdHlwZXMsIGFuZCBpZiBub3QsIGZhbGwgYmFjayB0byB0aGUgZ2VuZXJpYyBUUHJvdG9jb2wKKyAgICAgIC8vIHZlcnNpb24gb2YgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb24uCisgICAgICBjb2RlIH49ICJ2b2lkICIgfiBkaXNwYXRjaEZ1bmNOYW1lIH4KKyAgICAgICAgIihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBWYXJpYW50IGNvbnRleHQpIHtcbiI7CisgICAgICBjb2RlIH49ICJmb3JlYWNoIChQcm90b2NvbDsgVHlwZVR1cGxlIShQcm90b2NvbHMsIFRQcm90b2NvbCkpIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHN0YXRpYyBpZiAoaXMoUHJvdG9jb2wgXyA6IFRQcm90b2NvbFBhaXIhKEksIE8pLCBJLCBPKSkgeworICAgICAgICAgIGFsaWFzIEkgSVByb3Q7CisgICAgICAgICAgYWxpYXMgTyBPUHJvdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhbGlhcyBQcm90b2NvbCBJUHJvdDsKKyAgICAgICAgICBhbGlhcyBQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhc3RlZElQcm90ID0gY2FzdChJUHJvdClpcHJvdDsKKyAgICAgICAgYXV0byBjYXN0ZWRPUHJvdCA9IGNhc3QoT1Byb3Qpb3Byb3Q7CisgICAgICB9OworICAgICAgY29kZSB+PSAiaWYgKGNhc3RlZElQcm90ICYmIGNhc3RlZE9Qcm90KSB7XG4iOworICAgICAgY29kZSB+PSBwcm9jRnVuY05hbWUgfgorICAgICAgICAiIShJUHJvdCwgT1Byb3QpKHNlcWlkLCBjYXN0ZWRJUHJvdCwgY2FzdGVkT1Byb3QsIGNvbnRleHQpO1xuIjsKKyAgICAgIGNvZGUgfj0gInJldHVybjtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIGNvZGUgfj0gInRocm93IG5ldyBURXhjZXB0aW9uKGBJbnRlcm5hbCBlcnJvcjogTnVsbCBpcHJvdC9vcHJvdCAiIH4KKyAgICAgICAgInBhc3NlZCB0byBwcm9jZXNzb3IgcHJvdG9jb2wgZGlzcGF0Y2ggZnVuY3Rpb24uYCk7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKworICAgICAgLy8gVGhlIGFjdHVhbCBoYW5kbGVyIGZ1bmN0aW9uLCB0ZW1wbGF0ZWQgb24gdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAgICAgIC8vIHByb3RvY29sIHR5cGVzLgorICAgICAgY29kZSB+PSAidm9pZCAiIH4gcHJvY0Z1bmNOYW1lIH4gIihJUHJvdCwgT1Byb3QpKGludCBzZXFpZCwgSVByb3QgIiB+CisgICAgICAgICJpcHJvdCwgT1Byb3Qgb3Byb3QsIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQpICIgfgorICAgICAgICAiaWYgKGlzVFByb3RvY29sIUlQcm90ICYmIGlzVFByb3RvY29sIU9Qcm90KSB7XG4iOworICAgICAgY29kZSB+PSAiVEFyZ3NTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIGFyZ3M7XG4iOworCisgICAgICAvLyBTdG9yZSB0aGUgKHF1YWxpZmllZCkgbWV0aG9kIG5hbWUgaW4gYSBtYW5pZmVzdCBjb25zdGFudCB0byBhdm9pZAorICAgICAgLy8gaGF2aW5nIHRvIGxpdHRlciB0aGUgY29kZSBiZWxvdyB3aXRoIGxvdHMgb2Ygc3RyaW5nIG1hbmlwdWxhdGlvbi4KKyAgICAgIGNvZGUgfj0gImVudW0gbWV0aG9kTmFtZSA9IGAiIH4gbWV0aG9kTmFtZSB+ICJgO1xuIjsKKworICAgICAgY29kZSB+PSBxeworICAgICAgICBlbnVtIHFOYW1lID0gSW50ZXJmYWNlLnN0cmluZ29mIH4gIi4iIH4gbWV0aG9kTmFtZTsKKworICAgICAgICBWYXJpYW50IGNhbGxDb250ZXh0OworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgY2FsbENvbnRleHQgPSBldmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChxTmFtZSwgY29ubmVjdGlvbkNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjYWxsQ29udGV4dCwgcU5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVSZWFkKGNhbGxDb250ZXh0LCBxTmFtZSk7CisKKyAgICAgICAgYXJncy5yZWFkKGlwcm90KTsKKyAgICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgaXByb3QudHJhbnNwb3J0LnJlYWRFbmQoKTsKKworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucG9zdFJlYWQoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgIH07CisKKyAgICAgIGNvZGUgfj0gIlRSZXN1bHRTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIHJlc3VsdDtcbiI7CisgICAgICBjb2RlIH49ICJ0cnkge1xuIjsKKworICAgICAgLy8gR2VuZXJhdGUgdGhlIHBhcmFtZXRlciBsaXN0IHRvIHBhc3MgdG8gdGhlIGNhbGxlZCBpZmFjZSBmdW5jdGlvbi4KKyAgICAgIHN0cmluZ1tdIHBhcmFtTGlzdDsKKyAgICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAgIHN0cmluZyBwYXJhbU5hbWU7CisgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQgJiYgaSA8IG1ldGhvZE1ldGEucGFyYW1zLmxlbmd0aCkgeworICAgICAgICAgIHBhcmFtTmFtZSA9IG1ldGhvZE1ldGEucGFyYW1zW2ldLm5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyYW1OYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1MaXN0IH49ICJhcmdzLiIgfiBwYXJhbU5hbWU7CisgICAgICB9CisKKyAgICAgIGltbXV0YWJsZSBjYWxsID0gImlmYWNlXy4iIH4gbWV0aG9kTmFtZSB+ICIoIiB+IGN0ZmVKb2luKHBhcmFtTGlzdCkgfiAiKSI7CisgICAgICBpZiAoaXMoUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpID09IHZvaWQpKSB7CisgICAgICAgIGNvZGUgfj0gY2FsbCB+ICI7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSB+PSAicmVzdWx0LnNldCFgc3VjY2Vzc2AoIiB+IGNhbGwgfiAiKTtcbiI7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2VpdmluZyBjb2RlLgorICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgfHwgbWV0aG9kTWV0YS50eXBlICE9IFRNZXRob2RUeXBlLk9ORVdBWSkgeworICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kKSB7CisgICAgICAgICAgZm9yZWFjaCAoZTsgbWV0aG9kTWV0YS5leGNlcHRpb25zKSB7CisgICAgICAgICAgICBjb2RlIH49ICJ9IGNhdGNoIChJbnRlcmZhY2UuIiB+IGUudHlwZSB+ICIgIiB+IGUubmFtZSB+ICIpIHtcbiI7CisgICAgICAgICAgICBjb2RlIH49ICJyZXN1bHQuc2V0IWAiIH4gZS5uYW1lIH4gImAoIiB+IGUubmFtZSB+ICIpO1xuIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSAifVxuIjsKKworICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICAgIGV2ZW50SGFuZGxlci5oYW5kbGVyRXJyb3IoY2FsbENvbnRleHQsIHFOYW1lLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0byFzdHJpbmcoZSkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oCisgICAgICAgICAgICAgIFRNZXNzYWdlKG1ldGhvZE5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7CisgICAgICAgICAgICB4LndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LndyaXRlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlV3JpdGUoY2FsbENvbnRleHQsIHFOYW1lKTsKKworICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKG1ldGhvZE5hbWUsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7CisgICAgICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICBvcHJvdC50cmFuc3BvcnQud3JpdGVFbmQoKTsKKyAgICAgICAgICBvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wb3N0V3JpdGUoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvciBvbmV3YXkgbWV0aG9kcywgd2Ugb2J2aW91c2x5IGNhbm5vdCBub3RpZnkgdGhlIGNsaWVudCBvZiBhbnkKKyAgICAgICAgLy8gZXhjZXB0aW9ucywganVzdCBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIG9uZSBpcyBzZXQuCisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmhhbmRsZXJFcnJvcihjYWxsQ29udGV4dCwgcU5hbWUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5vbmV3YXlDb21wbGV0ZShjYWxsQ29udGV4dCwgcU5hbWUpOworICAgICAgICB9OworICAgICAgfQorICAgICAgY29kZSB+PSAifVxuIjsKKworICAgIH0KKworICAgIGNvZGUgfj0gY29uc3RydWN0b3JDb2RlIH4gIn1cbiI7CisgICAgY29kZSB+PSAifVxuIjsKKworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIEEgc3RydWN0IHJlcHJlc2VudGluZyB0aGUgYXJndW1lbnRzIG9mIGEgVGhyaWZ0IG1ldGhvZCBjYWxsLgorICoKKyAqIFRoZXJlIHNob3VsZCB1c3VhbGx5IGJlIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBkaXJlY3RseSB3aXRob3V0IHRoZSBoZWxwIG9mCisgKiBUU2VydmljZVByb2Nlc3NvciwgYnV0IGl0IGlzIGRvY3VtZW50ZWQgcHVibGljbHkgdG8gaGVscCBkZWJ1Z2dpbmcgaW4gY2FzZQorICogb2YgQ1RGRSBlcnJvcnMuCisgKgorICogQ29uc2lkZXIgdGhpcyBleGFtcGxlOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgaW50IGJhcihzdHJpbmcgYSwgYm9vbCBiKTsKKyAqCisgKiAgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAqICAgICBUTWV0aG9kTWV0YSgiYmFyIiwgW1RQYXJhbU1ldGEoImEiLCAxKSwgVFBhcmFtTWV0YSgiYiIsIDIpXSkKKyAqICAgXTsKKyAqIH0KKyAqCisgKiBhbGlhcyBUQXJnc1N0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyQXJnczsKKyAqIC0tLQorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIEZvb0JhckFyZ3MgaXMgZXF1aXZhbGVudCB0bzoKKyAqIC0tLQorICogc3RydWN0IEZvb0JhckFyZ3MgeworICogICBzdHJpbmcgYTsKKyAqICAgYm9vbCBiOworICoKKyAqICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFtURmllbGRNZXRhKCJhIiwgMSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgKiAgICAgVEZpZWxkTWV0YSgiYiIsIDIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpXSk7CisgKiB9CisgKiAtLS0KKyAqCisgKiBJZiB0aGUgVFZlcmJvc2VDb2RlZ2VuIHZlcnNpb24gaXMgZGVmaW5lZCwgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgaXNzdWVkIGF0CisgKiBjb21waWxhdGlvbiBpZiBubyBUTWV0aG9kTWV0YSBmb3IgSW50ZXJmYWNlLm1ldGhvZE5hbWUgaXMgZm91bmQuCisgKi8KK3RlbXBsYXRlIFRBcmdzU3RydWN0KEludGVyZmFjZSwgc3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgc3RhdGljIGFzc2VydChpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSwKKyAgICAiQ291bGQgbm90IGZpbmQgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluICciIH4gSW50ZXJmYWNlLnN0cmluZ29mIH4gIicuIik7CisgIG1peGluKHsKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBUTWV0aG9kTWV0YSBtZXRob2RNZXRhOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJDb2RlOworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1ldGEgaW5mb3JtYXRpb24sIGp1c3QgdXNlIHBhcmFtMSwgcGFyYW0yLCBldGMuIGFzCisgICAgICAvLyBmaWVsZCBuYW1lcywgaXQgc2hvdWxkbid0IHJlYWxseSBtYXR0ZXIgYW55d2F5LiAxLWJhc2VkIMK7aW5kZXhpbmfCqworICAgICAgLy8gaXMgdXNlZCB0byBtYXRjaCB0aGUgY29tbW9uIHNjaGVtZSBpbiB0aGUgVGhyaWZ0IHdvcmxkLgorICAgICAgc3RyaW5nIG1lbWJlcklkOworICAgICAgc3RyaW5nIG1lbWJlck5hbWU7CisgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgbWVtYmVySWQgPSB0byFzdHJpbmcobWV0aG9kTWV0YS5wYXJhbXNbaV0uaWQpOworICAgICAgICBtZW1iZXJOYW1lID0gbWV0aG9kTWV0YS5wYXJhbXNbaV0ubmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgfQorCisgICAgICAvLyBVbnF1YWwhKCkgaXMgbmVlZGVkIHRvIGdlbmVyYXRlIG11dGFibGUgZmllbGRzIGZvciByZWYgY29uc3QoKQorICAgICAgLy8gc3RydWN0IHBhcmFtZXRlcnMuCisgICAgICBtZW1iZXJDb2RlIH49ICJVbnF1YWwhKFBhcmFtZXRlclR5cGVUdXBsZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIilbIiB+IHRvIXN0cmluZyhpKSB+ICJdKSIgfiBtZW1iZXJOYW1lIH4gIjtcbiI7CisKKyAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGAiIH4gbWVtYmVyTmFtZSB+ICJgLCAiIH4gbWVtYmVySWQgfgorICAgICAgICAiLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSI7CisgICAgfQorCisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRBcmdzU3RydWN0IHtcbiI7CisgICAgY29kZSB+PSBtZW1iZXJDb2RlOworICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgJiYKKyAgICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkubGVuZ3RoID4gMCkKKyAgICAgIHsKKyAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3IuVEFyZ3NTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKyAgICBpbW11dGFibGUgZmllbGRNZXRhQ29kZSA9CisgICAgICBmaWVsZE1ldGFDb2Rlcy5lbXB0eSA/ICIiIDogIlsiIH4gY3RmZUpvaW4oZmllbGRNZXRhQ29kZXMpIH4gIl0iOworICAgIGNvZGUgfj0gIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiIH4gZmllbGRNZXRhQ29kZSAgfiAiKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBBIHN0cnVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIFRocmlmdCBtZXRob2QgY2FsbC4KKyAqCisgKiBJdCBjb250YWlucyBhIGZpZWxkIGNhbGxlZCAic3VjY2VzcyIgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uCisgKiAod2l0aCBpZCAwKSwgYW5kIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgZXhjZXB0aW9ucyBkZWNsYXJlZCBmb3IgdGhlCisgKiBtZXRob2QsIGlmIGFueS4KKyAqCisgKiBUaGVyZSBzaG91bGQgdXN1YWxseSBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgZGlyZWN0bHkgd2l0aG91dCB0aGUgaGVscCBvZgorICogVFNlcnZpY2VQcm9jZXNzb3IsIGJ1dCBpdCBpcyBkb2N1bWVudGVkIHB1YmxpY2x5IHRvIGhlbHAgZGVidWdnaW5nIGluIGNhc2UKKyAqIG9mIENURkUgZXJyb3JzLgorICoKKyAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBiYXIoc3RyaW5nIGEpOworICoKKyAqICAgYWxpYXMgLkZvb0V4Y2VwdGlvbiBGb29FeGNlcHRpb247CisgKgorICogICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgKiAgICAgVE1ldGhvZE1ldGEoImJhciIsCisgKiAgICAgICBbVFBhcmFtTWV0YSgiYSIsIDEpXSwKKyAqICAgICAgIFtURXhjZXB0aW9uTWV0YSgiZm9vZSIsIDEsICJGb29FeGNlcHRpb24iKV0KKyAqICAgICApCisgKiAgIF07CisgKiB9CisgKiBhbGlhcyBUUmVzdWx0U3RydWN0IShGb28sICJiYXIiKSBGb29CYXJSZXN1bHQ7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJSZXN1bHQgaXMgZXF1aXZhbGVudCB0bzoKKyAqIC0tLQorICogc3RydWN0IEZvb0JhclJlc3VsdCB7CisgKiAgIGludCBzdWNjZXNzOworICogICBGb29FeGNlcHRpb24gZm9vZTsKKyAqCisgKiAgIG1peGluKFRTdHJ1Y3RIZWxwZXJzIShbVEZpZWxkTWV0YSgic3VjY2VzcyIsIDAsIFRSZXEuT1BUSU9OQUwpLAorICogICAgIFRGaWVsZE1ldGEoImZvb2UiLCAxLCBUUmVxLk9QVElPTkFMKV0pKTsKKyAqIH0KKyAqIC0tLQorICoKKyAqIElmIHRoZSBUVmVyYm9zZUNvZGVnZW4gdmVyc2lvbiBpcyBkZWZpbmVkLCBhIHdhcm5pbmcgbWVzc2FnZSBpcyBpc3N1ZWQgYXQKKyAqIGNvbXBpbGF0aW9uIGlmIG5vIFRNZXRob2RNZXRhIGZvciBJbnRlcmZhY2UubWV0aG9kTmFtZSBpcyBmb3VuZC4KKyAqLwordGVtcGxhdGUgVFJlc3VsdFN0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworCisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVFJlc3VsdFN0cnVjdCB7XG4iOworCisgICAgc3RyaW5nW10gZmllbGRNZXRhQ29kZXM7CisKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgPT0gdm9pZCkpIHsKKyAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpIHN1Y2Nlc3M7XG4iOworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYHN1Y2Nlc3NgLCAwLCBUUmVxLk9QVElPTkFMKSI7CisgICAgfQorCisgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgIGF1dG8gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgZm9yZWFjaCAoZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgICAgY29kZSB+PSAiSW50ZXJmYWNlLiIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiO1xuIjsKKyAgICAgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgIiB+IGUubmFtZSB+ICJgLCAiIH4gdG8hc3RyaW5nKGUuaWQpIH4KKyAgICAgICAgICAgICIsIFRSZXEuT1BUSU9OQUwpIjsKKyAgICAgICAgfQorICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgJiYKKyAgICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkubGVuZ3RoID4gMCkKKyAgICAgIHsKKyAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3IuVFJlc3VsdFN0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiBzZXJ2aWNlICciIH4KKyAgICAgICAgICBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJyBmb3VuZC5gKTtcbiI7CisgICAgICB9CisgICAgfQorCisgICAgaW1tdXRhYmxlIGZpZWxkTWV0YUNvZGUgPQorICAgICAgZmllbGRNZXRhQ29kZXMuZW1wdHkgPyAiIiA6ICJbIiB+IGN0ZmVKb2luKGZpZWxkTWV0YUNvZGVzKSB+ICJdIjsKKyAgICBjb2RlIH49ICJtaXhpbiBUU3RydWN0SGVscGVycyEoIiB+IGZpZWxkTWV0YUNvZGUgIH4gIik7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MTRiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW5kZXguZApAQCAtMCwwICsxLDMzIEBACitEZG9jCisKKzxoMj5QYWNrYWdlIG92ZXJ2aWV3PC9oMj4KKworPGRsPgorICA8ZHQ+JChEX0NPREUgdGhyaWZ0LmFzeW5jKTwvZHQ+CisgIDxkZD5TdXBwb3J0IGluZnJhc3RydWN0dXJlIGZvciBoYW5kbGluZyBjbGllbnQtc2lkZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB1c2luZyBub24tYmxvY2tpbmcgSS9PIGFuZCBjb3JvdXRpbmVzLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5jb2RlZ2VuKTwvZHQ+CisgIDxkZD4KKyAgICA8cD5UZW1wbGF0ZXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBUaHJpZnQgY2xpZW50cy9wcm9jZXNzb3JzIGZyb20gcmVndWxhciBEIHN0cnVjdCBhbmQgaW50ZXJmYWNlIGRlZmluaXRpb25zLjwvcD4KKyAgICA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFNldmVyYWwgYXJ0aWZhY3RzIGluIHRoZXNlIG1vZHVsZXMgaGF2ZSBvcHRpb25zIGZvciBzcGVjaWZ5aW5nIHRoZSBleGFjdCBwcm90b2NvbCB0eXBlcyB1c2VkLiBJbiB0aGlzIGNhc2UsIHRoZSBhbW91bnQgb2YgdmlydHVhbCBjYWxscyBjYW4gYmUgZ3JlYXRseSByZWR1Y2VkIGFuZCBhcyBhIHJlc3VsdCwgdGhlIGNvZGUgYWxzbyBjYW4gYmUgb3B0aW1pemVkIGJldHRlci4gSWYgcGVyZm9ybWFuY2UgaXMgbm90IGEgY29uY2VybiBvciB0aGUgYWN0dWFsIHByb3RvY29sIHR5cGUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSwgdGhlc2UgcGFyYW1ldGVycyBjYW4ganVzdCBiZSBsZWZ0IGF0IHRoZWlyIGRlZmF1bHRzLgorICAgIDwvcD4KKyAgPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LmludGVybmFsKTwvZHQ+CisgIDxkZD5JbnRlcm5hbCBoZWxwZXIgbW9kdWxlcyB1c2VkIGJ5IHRoZSBUaHJpZnQgbGlicmFyeS4gVGhpcyBwYWNrYWdlIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLCBhbmQgbm8gc3RhYmlsaXR5IGd1YXJhbnRlZXMgYXJlIGdpdmVuIHdoYXRzb2V2ZXIuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnByb3RvY29sKTwvZHQ+CisgIDxkZD5UaGUgVGhyaWZ0IHByb3RvY29sIGltcGxlbXRhdGlvbnMgd2hpY2ggc3BlY2lmeSBob3cgdG8gcGFzcyBtZXNzYWdlcyBvdmVyIGEgVFRyYW5zcG9ydC48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQuc2VydmVyKTwvZHQ+CisgIDxkZD5HZW5lcmljIFRocmlmdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGhhbmRsaW5nIGNsaWVudHMgb3ZlciBhIFRUcmFuc3BvcnQgaW50ZXJmYWNlIGFuZCBmb3J3YXJkaW5nIHJlcXVlc3RzIHRvIGEgVFByb2Nlc3NvciAod2hpY2ggaXMgaW4gdHVybiB1c3VhbGx5IHByb3ZpZGVkIGJ5IHRocmlmdC5jb2RlZ2VuKS48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQudHJhbnNwb3J0KTwvZHQ+CisgIDxkZD5UaGUgVFRyYW5zcG9ydCBkYXRhIHNvdXJjZS9zaW5rIGludGVyZmFjZSB1c2VkIGluIHRoZSBUaHJpZnQgbGlicmFyeSBhbmQgaXRzIGltaXBsZW1lbnRhdGlvbnMuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnV0aWwpPC9kdD4KKyAgPGRkPkdlbmVyYWwtcHVycG9zZSB1dGlsaXR5IG1vZHVsZXMgbm90IHNwZWNpZmljIHRvIFRocmlmdCwgcGFydCBvZiB0aGUgcHVibGljIEFQSS48L2RkPgorPC9kbD4KKworTWFjcm9zOgorICBUSVRMRSA9IFRocmlmdCBEIFNvZnR3YXJlIExpYnJhcnkKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvYWxnb3JpdGhtLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2FsZ29yaXRobS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzhhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2FsZ29yaXRobS5kCkBAIC0wLDAgKzEsNTUgQEAKKy8qKgorICogQ29udGFpbnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHN0ZC5hbGdvcml0aG0ucmVtb3ZlIHRoYXQgZG9lc24ndCB0YWtlIGFuCisgKiBhbGlhcyBwYXJhbWV0ZXIgdG8gYXZvaWQgRE1EIEBAQlVHNjM5NUBALgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtb3ZlOworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgc3RkLmZ1bmN0aW9uYWw7CitpbXBvcnQgc3RkLnJhbmdlOworaW1wb3J0IHN0ZC50cmFpdHM7CisKK2VudW0gU3dhcFN0cmF0ZWd5Cit7CisgICAgdW5zdGFibGUsCisgICAgc2VtaXN0YWJsZSwKKyAgICBzdGFibGUsCit9CisKK1JhbmdlIHJlbW92ZUVxdWFsKFN3YXBTdHJhdGVneSBzID0gU3dhcFN0cmF0ZWd5LnN0YWJsZSwgUmFuZ2UsIEUpKFJhbmdlIHJhbmdlLCBFIGUpCitpZiAoaXNCaWRpcmVjdGlvbmFsUmFuZ2UhUmFuZ2UpCit7CisgICAgYXV0byByZXN1bHQgPSByYW5nZTsKKyAgICBzdGF0aWMgaWYgKHMgIT0gU3dhcFN0cmF0ZWd5LnN0YWJsZSkKKyAgICB7CisgICAgICAgIGZvciAoOyFyYW5nZS5lbXB0eTspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYW5nZS5mcm9udCAhaXMgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYW5nZS5wb3BGcm9udDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmUocmFuZ2UuYmFjaywgcmFuZ2UuZnJvbnQpOworICAgICAgICAgICAgcmFuZ2UucG9wQmFjazsKKyAgICAgICAgICAgIHJlc3VsdC5wb3BCYWNrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGF1dG8gdGd0ID0gcmFuZ2U7CisgICAgICAgIGZvciAoOyAhcmFuZ2UuZW1wdHk7IHJhbmdlLnBvcEZyb250KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbnQgaXMgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5YW5rIHRoaXMgZ3V5CisgICAgICAgICAgICAgICAgcmVzdWx0LnBvcEJhY2s7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBrZWVwIHRoaXMgZ3V5CisgICAgICAgICAgICBtb3ZlKHJhbmdlLmZyb250LCB0Z3QuZnJvbnQpOworICAgICAgICAgICAgdGd0LnBvcEZyb250OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2NvZGVnZW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjlkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2NvZGVnZW4uZApAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogY2FuRmluZDsKK2ltcG9ydCBzdGQudHJhaXRzIDogSW50ZXJmYWNlc1R1cGxlLCBpc1NvbWVGdW5jdGlvbiwgaXNTb21lU3RyaW5nOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBzdGF0aWNJbmRleE9mLCBzdGF0aWNNYXAsIE5vRHVwbGljYXRlcywgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CisKKy8qKgorICogUmVtb3ZlcyBhbGwgdHlwZSBxdWFsaWZpZXJzIGZyb20gVC4KKyAqCisgKiBJbiBjb250cmFzdCB0byBzdGQudHJhaXRzLlVucXVhbCwgRnVsbHlVbnF1YWwgYWxzbyByZW1vdmVzIHF1YWxpZmllcnMgZnJvbQorICogYXJyYXkgZWxlbWVudHMgKGUuZy4gaW1tdXRhYmxlKGJ5dGVbXSkgLT4gYnl0ZVtdLCBub3QgaW1tdXRhYmxlKGJ5dGUpW10pLAorICogZXhjbHVkaW5nIHN0cmluZ3MgKHN0cmluZyBpc24ndCByZWR1Y2VkIHRvIGNoYXJbXSkuCisgKi8KK3RlbXBsYXRlIEZ1bGx5VW5xdWFsKFQpIHsKKyAgc3RhdGljIGlmIChpcyhUIF8gPT0gY29uc3QoVSksIFUpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhVSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IGltbXV0YWJsZShVKSwgVSkpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCFVIEZ1bGx5VW5xdWFsOworICB9IGVsc2Ugc3RhdGljIGlmIChpcyhUIF8gPT0gc2hhcmVkKFUpLCBVKSkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVUgRnVsbHlVbnF1YWw7CisgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKFQgXyA9PSBVW10sIFUpICYmICFpc1NvbWVTdHJpbmchVCkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIShVKVtdIEZ1bGx5VW5xdWFsOworICB9IGVsc2Ugc3RhdGljIGlmIChpcyhUIF8gPT0gVltLXSwgSywgVikpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCEoVilbRnVsbHlVbnF1YWwhS10gRnVsbHlVbnF1YWw7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgVCBGdWxseVVucXVhbDsKKyAgfQorfQorCisvKioKKyAqIHRydWUgaWYgbnVsbCBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIHBhc3NlZCB0eXBlLCBmYWxzZSBpZiBub3QuCisgKi8KK3RlbXBsYXRlIGlzTnVsbGFibGUoVCkgeworICBlbnVtIGlzTnVsbGFibGUgPSBfX3RyYWl0cyhjb21waWxlcywgeyBUIHQgPSBudWxsOyB9KTsKK30KKwordGVtcGxhdGUgaXNTdHJ1Y3QoVCkgeworICBlbnVtIGlzU3RydWN0ID0gaXMoVCA9PSBzdHJ1Y3QpOworfQorCit0ZW1wbGF0ZSBpc0V4Y2VwdGlvbihUKSB7CisgZW51bSBpc0V4Y2VwdGlvbiA9IGlzKFQgOiBFeGNlcHRpb24pOworfQorCit0ZW1wbGF0ZSBpc0VudW0oVCkgeworICBlbnVtIGlzRW51bSA9IGlzKFQgPT0gZW51bSk7Cit9CisKKy8qKgorICogQWxpYXNlcyBpdHNlbGYgdG8gVC5uYW1lLgorICovCit0ZW1wbGF0ZSBHZXRNZW1iZXIoVCwgc3RyaW5nIG5hbWUpIHsKKyAgbWl4aW4oImFsaWFzIFQuIiB+IG5hbWUgfiAiIEdldE1lbWJlcjsiKTsKK30KKworLyoqCisgKiBBbGlhc2VzIGl0c2VsZiB0byB0eXBlb2Yoc3ltYm9sKS4KKyAqLwordGVtcGxhdGUgVHlwZU9mKGFsaWFzIHN5bWJvbCkgeworICBhbGlhcyB0eXBlb2Yoc3ltYm9sKSBUeXBlT2Y7Cit9CisKKy8qKgorICogQWxpYXNlcyBpdHNlbGYgdG8gdGhlIHR5cGUgb2YgdGhlIFQgbWVtYmVyIGNhbGxlZCBuYW1lLgorICovCithbGlhcyBDb21wb3NlIShUeXBlT2YsIEdldE1lbWJlcikgTWVtYmVyVHlwZTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBmaWVsZCBtZXRhZGF0YSBhcnJheSBmb3IgVCBpZiBhbnksIG9yIGFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgZ2V0RmllbGRNZXRhKFQpIGlmIChpc1N0cnVjdCFUIHx8IGlzRXhjZXB0aW9uIVQpIHsKKyAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5maWVsZE1ldGEpID09IFRGaWVsZE1ldGFbXSkpIHsKKyAgICBlbnVtIGdldEZpZWxkTWV0YSA9IFQuZmllbGRNZXRhOworICB9IGVsc2UgeworICAgIGVudW0gVEZpZWxkTWV0YVtdIGdldEZpZWxkTWV0YSA9IFtdOworICB9Cit9CisKKy8qKgorICogTWVyZ2VzIHRoZSBmaWVsZCBtZXRhZGF0YSBhcnJheSBmb3IgRCB3aXRoIHRoZSBwYXNzZWQgYXJyYXkuCisgKi8KK3RlbXBsYXRlIG1lcmdlRmllbGRNZXRhKFQsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSB7CisgIC8vIE5vdGU6IFdlIGRvbid0IHVzZSBnZXRGaWVsZE1ldGEgaGVyZSB0byBhdm9pZCBidWcgaWYgaXQgaXMgaW5zdGFudGlhdGVkCisgIC8vIGZyb20gVElzU2V0RmxhZ3MsIHNlZSBjb21tZW50IHRoZXJlLgorICBzdGF0aWMgaWYgKGlzKHR5cGVvZihULmZpZWxkTWV0YSkgPT0gVEZpZWxkTWV0YVtdKSkgeworICAgIGVudW0gbWVyZ2VGaWVsZE1ldGEgPSBULmZpZWxkTWV0YSB+IGZpZWxkTWV0YURhdGE7CisgIH0gZWxzZSB7CisgICAgZW51bSBURmllbGRNZXRhW10gbWVyZ2VGaWVsZE1ldGEgPSBmaWVsZE1ldGFEYXRhOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgZmllbGQgcmVxdWlyZW1lbnQgbGV2ZWwgZm9yIFQubmFtZS4KKyAqLwordGVtcGxhdGUgbWVtYmVyUmVxKFQsIHN0cmluZyBuYW1lLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICBlbnVtIG1lbWJlclJlcSA9IG1lbWJlclJlcUltcGwhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpLnJlc3VsdDsKK30KKworcHJpdmF0ZSB7CisgIGltcG9ydCBzdGQuYWxnb3JpdGhtIDogZmluZDsKKyAgLy8gRE1EIEBAQlVHQEA6IE1pc3NpbmcgaW1wb3J0IGxlYWRzIHRvIGZhaWxpbmcgYnVpbGQgd2l0aG91dCBlcnJvcgorICAvLyBtZXNzYWdlIGluIHVuaXR0ZXN0L2RlYnVnL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudC4KKyAgaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKKworICB0ZW1wbGF0ZSBtZW1iZXJSZXFJbXBsKFQsIHN0cmluZyBuYW1lLCBhbGlhcyBmaWVsZE1ldGFEYXRhKSB7CisgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSwgbmFtZSk7CisgICAgc3RhdGljIGlmIChtZXRhLmVtcHR5IHx8IG1ldGEuZnJvbnQucmVxID09IFRSZXEuQVVUTykgeworICAgICAgc3RhdGljIGlmIChpc051bGxhYmxlIShNZW1iZXJUeXBlIShULCBuYW1lKSkpIHsKKyAgICAgICAgZW51bSByZXN1bHQgPSBUUmVxLk9QVElPTkFMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bSByZXN1bHQgPSBUUmVxLlJFUVVJUkVEOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnVtIHJlc3VsdCA9IG1ldGEuZnJvbnQucmVxOworICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIG5vdElnbm9yZWQoVCwgc3RyaW5nIG5hbWUsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSB7CisgIGVudW0gbm90SWdub3JlZCA9IG1lbWJlclJlcSEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSkgIT0gVFJlcS5JR05PUkU7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbWV0aG9kIG1ldGFkYXRhIGFycmF5IGZvciBUIGlmIGFueSwgb3IgYW4gZW1wdHkgYXJyYXkgb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSBnZXRNZXRob2RNZXRhKFQpIGlmIChpc1NlcnZpY2UhVCkgeworICBzdGF0aWMgaWYgKGlzKHR5cGVvZihULm1ldGhvZE1ldGEpID09IFRNZXRob2RNZXRhW10pKSB7CisgICAgZW51bSBnZXRNZXRob2RNZXRhID0gVC5tZXRob2RNZXRhOworICB9IGVsc2UgeworICAgIGVudW0gVE1ldGhvZE1ldGFbXSBnZXRNZXRob2RNZXRhID0gW107CisgIH0KK30KKworCisvKioKKyAqIHRydWUgaWYgVC5uYW1lIGlzIGEgbWVtYmVyIHZhcmlhYmxlLiBFeGNlcHRpb25zIGluY2x1ZGUgbWV0aG9kcywgc3RhdGljCisgKiBtZW1iZXJzLCBhcnRpZmFjdHMgbGlrZSBwYWNrYWdlIGFsaWFzZXMsIOKApgorICovCit0ZW1wbGF0ZSBpc1ZhbHVlTWVtYmVyKFQsIHN0cmluZyBuYW1lKSB7CisgIHN0YXRpYyBpZiAoIWlzKE1lbWJlclR5cGUhKFQsIG5hbWUpKSkgeworICAgIGVudW0gaXNWYWx1ZU1lbWJlciA9IGZhbHNlOworICB9IGVsc2Ugc3RhdGljIGlmICgKKyAgICBpcyhNZW1iZXJUeXBlIShULCBuYW1lKSA9PSB2b2lkKSB8fAorICAgIGlzU29tZUZ1bmN0aW9uIShNZW1iZXJUeXBlIShULCBuYW1lKSkgfHwKKyAgICBfX3RyYWl0cyhjb21waWxlcywgeyByZXR1cm4gbWl4aW4oIlQuIiB+IG5hbWUpOyB9KCkpCisgICkgeworICAgIGVudW0gaXNWYWx1ZU1lbWJlciA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGVudW0gaXNWYWx1ZU1lbWJlciA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBvZiBULCBub3QgaW5jbHVkaW5nCisgKiBpbmhlcml0ZWQgZmllbGRzLiBJZiBhIG1lbWJlciBpcyBtYXJrZWQgYXMgVFJlcS5JR05PUkUsIGl0IGlzIG5vdCBpbmNsdWRlZAorICogYXMgd2VsbC4KKyAqLwordGVtcGxhdGUgRmllbGROYW1lcyhULCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICBhbGlhcyBTdGF0aWNGaWx0ZXIhKAorICAgIEFsbCEoCisgICAgICBkb2VzTm90UmVhZE1lbWJlcnMsCisgICAgICBQQXBwbHkhKGlzVmFsdWVNZW1iZXIsIFQpLAorICAgICAgUEFwcGx5IShub3RJZ25vcmVkLCBULCBQQXBwbHlTa2lwLCBmaWVsZE1ldGFEYXRhKQorICAgICksCisgICAgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpCisgICkgRmllbGROYW1lczsKK30KKworLyoKKyAqIHRydWUgaWYgdGhlIHBhc3NlZCBtZW1iZXIgbmFtZSBpcyBub3QgYSBtZXRob2QgZ2VuZXJhdGVkIGJ5IHRoZQorICogVFN0cnVjdEhlbHBlcnMgdGVtcGxhdGUgdGhhdCBpbiBpdHMgaW1wbGVtZW50YXRpb25zIHF1ZXJpZXMgdGhlIHN0cnVjdAorICogbWVtYmVycy4KKyAqCisgKiBLbHVkZ2UgdXNlZCBpbnRlcm5hbGx5IHRvIGJyZWFrIGEgY3ljbGUgY2F1c2VkIGEgRE1EIGZvcndhcmQgcmVmZXJlbmNlCisgKiByZWdyZXNzaW9uLCBzZWUgVEhSSUZULTIxMzAuCisgKi8KK2VudW0gZG9lc05vdFJlYWRNZW1iZXJzKHN0cmluZyBuYW1lKSA9ICFbIm9wRXF1YWxzIiwgInRocmlmdE9wRXF1YWxzSW1wbCIsCisgICJ0b1N0cmluZyIsICJ0aHJpZnRUb1N0cmluZ0ltcGwiXS5jYW5GaW5kKG5hbWUpOworCit0ZW1wbGF0ZSBkZXJpdmVkTWVtYmVycyhUKSB7CisgIGFsaWFzIFR5cGVUdXBsZSEoX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSBkZXJpdmVkTWVtYmVyczsKK30KKwordGVtcGxhdGUgQWxsTWVtYmVyTWV0aG9kTmFtZXMoVCkgaWYgKGlzU2VydmljZSFUKSB7CisgIGFsaWFzIE5vRHVwbGljYXRlcyEoCisgICAgRmlsdGVyTWV0aG9kTmFtZXMhKAorICAgICAgVCwKKyAgICAgIHN0YXRpY01hcCEoCisgICAgICAgIGRlcml2ZWRNZW1iZXJzLAorICAgICAgICBUeXBlVHVwbGUhKFQsIEludGVyZmFjZXNUdXBsZSFUKQorICAgICAgKQorICAgICkKKyAgKSBBbGxNZW1iZXJNZXRob2ROYW1lczsKK30KKwordGVtcGxhdGUgRmlsdGVyTWV0aG9kTmFtZXMoVCwgTWVtYmVyTmFtZXMuLi4pIHsKKyAgYWxpYXMgU3RhdGljRmlsdGVyISgKKyAgICBDb21waWxlc0FuZFRydWUhKAorICAgICAgQ29tcG9zZSEoaXNTb21lRnVuY3Rpb24sIFR5cGVPZiwgUEFwcGx5IShHZXRNZW1iZXIsIFQpKQorICAgICksCisgICAgTWVtYmVyTmFtZXMKKyAgKSBGaWx0ZXJNZXRob2ROYW1lczsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgdHlwZSB0dXBsZSBjb250YWluaW5nIG9ubHkgdGhlIGVsZW1lbnRzIG9mIFQgZm9yIHdoaWNoIHRoZQorICogZXBvbnltb3VzIHRlbXBsYXRlIHByZWRpY2F0ZSBwcmVkIGlzIHRydWUuCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogYWxpYXMgU3RhdGljRmlsdGVyIShpc0ludGVncmFsLCBpbnQsIHN0cmluZywgbG9uZywgZmxvYXRbXSkgRmlsdGVyZWQ7CisgKiBzdGF0aWMgYXNzZXJ0KGlzKEZpbHRlcmVkID09IFR5cGVUdXBsZSEoaW50LCBsb25nKSkpOworICogLS0tCisgKi8KK3RlbXBsYXRlIFN0YXRpY0ZpbHRlcihhbGlhcyBwcmVkLCBULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBTdGF0aWNGaWx0ZXI7CisgIH0gZWxzZSBzdGF0aWMgaWYgKHByZWQhKFRbMF0pKSB7CisgICAgYWxpYXMgVHlwZVR1cGxlIShUWzBdLCBTdGF0aWNGaWx0ZXIhKHByZWQsIFRbMSAuLiAkXSkpIFN0YXRpY0ZpbHRlcjsKKyAgfSBlbHNlIHsKKyAgICBhbGlhcyBTdGF0aWNGaWx0ZXIhKHByZWQsIFRbMSAuLiAkXSkgU3RhdGljRmlsdGVyOworICB9Cit9CisKKy8qKgorICogQmluZHMgdGhlIGZpcnN0IG4gYXJndW1lbnRzIG9mIGEgdGVtcGxhdGUgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlICh3aGVyZSBuIGlzCisgKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gUEFwcGx5KS4KKyAqCisgKiBUaGUgcGFzc2VkIGFyZ3VtZW50cyBhcmUgYWx3YXlzIGFwcGxpZWQgc3RhcnRpbmcgZnJvbSB0aGUgbGVmdC4gSG93ZXZlciwKKyAqIHRoZSBzcGVjaWFsIFBBcHBseVNraXAgbWFya2VyIHRlbXBsYXRlIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4KKyAqIGFyZ3VtZW50IHNob3VsZCBiZSBza2lwcGVkLCBzbyB0aGF0IGUuZy4gdGhlIGZpcnN0IGFuZCB0aGlyZCBhcmd1bWVudAorICogdG8gYSB0ZW1wbGF0ZSBjYW4gYmUgZml4ZWQsIGJ1dCB0aGUgc2Vjb25kIGFuZCByZW1haW5pbmcgYXJndW1lbnRzIHdvdWxkCisgKiBzdGlsbCBiZSBsZWZ0IHVuZGVmaW5lZC4KKyAqCisgKiBTa2lwcGluZyBhIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBidXQgbm90IHByb3ZpZGluZyBlbm91Z2ggYXJndW1lbnRzIHRvCisgKiBhc3NpZ24gYWxsIG9mIHRoZW0gZHVyaW5nIGluc3RhbnRpYXRpb24gb2YgdGhlIHJlc3VsdGluZyB0ZW1wbGF0ZSBpcyBhbgorICogZXJyb3IuCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogc3RydWN0IEZvbyhULCBVLCBWKSB7fQorICogYWxpYXMgUEFwcGx5IShGb28sIGludCwgbG9uZykgUGFydGlhbEZvbzsKKyAqIHN0YXRpYyBhc3NlcnQoaXMoUGFydGlhbEZvbyFmbG9hdCA9PSBGb28hKGludCwgbG9uZywgZmxvYXQpKSk7CisgKgorICogYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIFBBcHBseVNraXAsIGZsb2F0KSBTa2lwcGVkVGVzdDsKKyAqIHN0YXRpYyBhc3NlcnQoaXMoU2tpcHBlZFRlc3QhbG9uZyA9PSBUZXN0IShpbnQsIGxvbmcsIGZsb2F0KSkpOworICogLS0tCisgKi8KK3RlbXBsYXRlIFBBcHBseShhbGlhcyBUYXJnZXQsIFQuLi4pIHsKKyAgdGVtcGxhdGUgUEFwcGx5KFUuLi4pIHsKKyAgICBhbGlhcyBUYXJnZXQhKFBBcHBseU1lcmdlQXJncyEoQ29uZmluZWRUdXBsZSFULCBVKS5SZXN1bHQpIFBBcHBseTsKKyAgfQorfQorCisvLy8gRGl0dG8uCit0ZW1wbGF0ZSBQQXBwbHlTa2lwKCkge30KKworcHJpdmF0ZSB0ZW1wbGF0ZSBQQXBwbHlNZXJnZUFyZ3MoYWxpYXMgUHJlc2V0LCBBcmdzLi4uKSB7CisgIHN0YXRpYyBpZiAoUHJlc2V0Lmxlbmd0aCA9PSAwKSB7CisgICAgYWxpYXMgQXJncyBSZXN1bHQ7CisgIH0gZWxzZSB7CisgICAgZW51bSBuZXh0U2tpcCA9IHN0YXRpY0luZGV4T2YhKFBBcHBseVNraXAsIFByZXNldC5UdXBsZSk7CisgICAgc3RhdGljIGlmIChuZXh0U2tpcCA9PSAtMSkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShQcmVzZXQuVHVwbGUsIEFyZ3MpIFJlc3VsdDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChBcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAvLyBIYXZlIHRvIHVzZSBhIHN0YXRpYyBpZiBjbGF1c2UgaW5zdGVhZCBvZiBwdXR0aW5nIHRoZSBjb25kaXRpb24KKyAgICAgIC8vIGRpcmVjdGx5IGludG8gdGhlIGFzc2VydCB0byBhdm9pZCBETUQgdHJ5aW5nIHRvIGFjY2VzcyBBcmdzWzBdCisgICAgICAvLyBuZXZlcnRoZWxlc3MgYmVsb3cuCisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLAorICAgICAgICAiUEFyZ3NTa2lwIGVuY291bnRlcmVkLCBidXQgbm8gYXJndW1lbnQgbGVmdCB0byBiaW5kLiIpOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgICBQcmVzZXQuVHVwbGVbMCAuLiBuZXh0U2tpcF0sCisgICAgICAgIEFyZ3NbMF0sCisgICAgICAgIFBBcHBseU1lcmdlQXJncyEoCisgICAgICAgICAgQ29uZmluZWRUdXBsZSEoUHJlc2V0LlR1cGxlW25leHRTa2lwICsgMSAuLiAkXSksCisgICAgICAgICAgQXJnc1sxIC4uICRdCisgICAgICAgICkuUmVzdWx0CisgICAgICApIFJlc3VsdDsKKyAgICB9CisgIH0KK30KKwordW5pdHRlc3QgeworICBzdHJ1Y3QgVGVzdChULCBVLCBWKSB7fQorICBhbGlhcyBQQXBwbHkhKFRlc3QsIGludCwgbG9uZykgUGFydGlhbFRlc3Q7CisgIHN0YXRpYyBhc3NlcnQoaXMoUGFydGlhbFRlc3QhZmxvYXQgPT0gVGVzdCEoaW50LCBsb25nLCBmbG9hdCkpKTsKKworICBhbGlhcyBQQXBwbHkhKFRlc3QsIGludCwgUEFwcGx5U2tpcCwgZmxvYXQpIFNraXBwZWRUZXN0OworICBzdGF0aWMgYXNzZXJ0KGlzKFNraXBwZWRUZXN0IWxvbmcgPT0gVGVzdCEoaW50LCBsb25nLCBmbG9hdCkpKTsKKworICBhbGlhcyBQQXBwbHkhKFRlc3QsIGludCwgUEFwcGx5U2tpcCwgUEFwcGx5U2tpcCkgVHdvU2tpcHBlZDsKKyAgc3RhdGljIGFzc2VydCghX190cmFpdHMoY29tcGlsZXMsIFR3b1NraXBwZWQhbG9uZykpOworfQorCisKKy8qKgorICogQ29tcG9zZXMgYSBudW1iZXIgb2YgdGVtcGxhdGVzLiBUaGUgcmVzdWx0IGlzIGEgdGVtcGxhdGUgZXF1aXZhbGVudCB0bworICogYWxsIHRoZSBwYXNzZWQgdGVtcGxhdGVzIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIGFraW4gdG8gdGhlCisgKiBtYXRoZW1hdGljYWwgZnVuY3Rpb24gY29tcG9zaXRpb24gbm90YXRpb246IEluc3RhbnRpYXRpbmcgQ29tcG9zZSEoQSwgQiwgQykKKyAqIGlzIHRoZSBzYW1lIGFzIGluc3RhbnRpYXRpbmcgQSEoQiEoQyEo4oCmKSkpLgorICoKKyAqIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGNyZWF0aW5nIGEgdGVtcGxhdGUgdG8gdXNlIHdpdGggc3RhdGljTWFwLworICogU3RhdGljRmlsdGVyLCBhcyBkZW1vbnN0cmF0ZWQgYmVsb3cuCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogdGVtcGxhdGUgQWxsTWV0aG9kTmFtZXMoVCkgeworICogICBhbGlhcyBTdGF0aWNGaWx0ZXIhKAorICogICAgIENvbXBpbGVzQW5kVHJ1ZSEoCisgKiAgICAgICBDb21wb3NlIShpc1NvbWVGdW5jdGlvbiwgVHlwZU9mLCBQQXBwbHkhKEdldE1lbWJlciwgVCkpCisgKiAgICAgKSwKKyAqICAgICBfX3RyYWl0cyhhbGxNZW1iZXJzLCBUKQorICogICApIEFsbE1ldGhvZE5hbWVzOworICogfQorICoKKyAqIHByYWdtYShtc2csIEFsbE1ldGhvZE5hbWVzIU9iamVjdCk7CisgKiAtLS0KKyAqLwordGVtcGxhdGUgQ29tcG9zZShULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIHRlbXBsYXRlIENvbXBvc2UoVS4uLikgeworICAgICAgYWxpYXMgVSBDb21wb3NlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0ZW1wbGF0ZSBDb21wb3NlKFUuLi4pIHsKKyAgICAgIGFsaWFzIEluc3RhbnRpYXRlIShUWzBdLCBJbnN0YW50aWF0ZSEoLkNvbXBvc2UhKFRbMSAuLiAkXSksIFUpKSBDb21wb3NlOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEluc3RhbnRpYXRlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzLgorICoKKyAqIFVzZWQgdG8gd29yayBhcm91bmQgc3ludGFjdGljIGxpbWlhdGlvbnMgb2YgRCB3aXRoIHJlZ2FyZCB0byBpbnN0YW50aWF0aW5nCisgKiBhIHRlbXBsYXRlIGZyb20gYSB0eXBlIHR1cGxlIChlLmcuIFRbMF0hKC4uLikgaXMgbm90IHZhbGlkKSBvciBhIHRlbXBsYXRlCisgKiByZXR1cm5pbmcgYW5vdGhlciB0ZW1wbGF0ZSAoZS5nLiBGb28hKEJhcikhKEJheikgaXMgbm90IGFsbG93ZWQpLgorICovCit0ZW1wbGF0ZSBJbnN0YW50aWF0ZShhbGlhcyBUZW1wbGF0ZSwgUGFyYW1zLi4uKSB7CisgIGFsaWFzIFRlbXBsYXRlIVBhcmFtcyBJbnN0YW50aWF0ZTsKK30KKworLyoqCisgKiBDb21iaW5lcyBzZXZlcmFsIHRlbXBsYXRlIHByZWRpY2F0ZXMgdXNpbmcgbG9naWNhbCBBTkQsIGkuZS4gaW5zdGFudGlhdGluZworICogQWxsIShhLCBiLCBjKSB3aXRoIHBhcmFtZXRlcnMgUCBmb3Igc29tZSB0ZW1wbGF0ZXMgYSwgYiwgYyBpcyBlcXVpdmFsZW50IHRvCisgKiBhIVAgJiYgYiFQICYmIGMhUC4KKyAqCisgKiBUaGUgdGVtcGxhdGVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBhYm9ydGluZyBldmFsdWF0aW9uIGluIGEKKyAqIHNodXJ0LWN1dCBtYW5uZXIgaWYgYSBmYWxzZSByZXN1bHQgaXMgZW5jb3VudGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlIGxhdHRlcgorICogaW5zdGFudGlhdGlvbnMgZG8gbm90IG5lZWQgdG8gY29tcGlsZS4KKyAqLwordGVtcGxhdGUgQWxsKFQuLi4pIHsKKyAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7CisgICAgdGVtcGxhdGUgQWxsKFUuLi4pIHsKKyAgICAgIGVudW0gQWxsID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGVtcGxhdGUgQWxsKFUuLi4pIHsKKyAgICAgIHN0YXRpYyBpZiAoSW5zdGFudGlhdGUhKFRbMF0sIFUpKSB7CisgICAgICAgIGFsaWFzIEluc3RhbnRpYXRlISguQWxsIShUWzEgLi4gJF0pLCBVKSBBbGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnVtIEFsbCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIENvbWJpbmVzIHNldmVyYWwgdGVtcGxhdGUgcHJlZGljYXRlcyB1c2luZyBsb2dpY2FsIE9SLCBpLmUuIGluc3RhbnRpYXRpbmcKKyAqIEFueSEoYSwgYiwgYykgd2l0aCBwYXJhbWV0ZXJzIFAgZm9yIHNvbWUgdGVtcGxhdGVzIGEsIGIsIGMgaXMgZXF1aXZhbGVudCB0bworICogYSFQIHx8IGIhUCB8fCBjIVAuCisgKgorICogVGhlIHRlbXBsYXRlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCwgYWJvcnRpbmcgZXZhbHVhdGlvbiBpbiBhCisgKiBzaHVydC1jdXQgbWFubmVyIGlmIGEgdHJ1ZSByZXN1bHQgaXMgZW5jb3VudGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlIGxhdHRlcgorICogaW5zdGFudGlhdGlvbnMgZG8gbm90IG5lZWQgdG8gY29tcGlsZS4KKyAqLwordGVtcGxhdGUgQW55KFQuLi4pIHsKKyAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7CisgICAgdGVtcGxhdGUgQW55KFUuLi4pIHsKKyAgICAgIGVudW0gQW55ID0gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHRlbXBsYXRlIEFueShVLi4uKSB7CisgICAgICBzdGF0aWMgaWYgKEluc3RhbnRpYXRlIShUWzBdLCBVKSkgeworICAgICAgICBlbnVtIEFueSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbGlhcyBJbnN0YW50aWF0ZSEoLkFueSEoVFsxIC4uICRdKSwgVSkgQW55OworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSBDb25maW5lZFR1cGxlKFQuLi4pIHsKKyAgYWxpYXMgVCBUdXBsZTsKKyAgZW51bSBsZW5ndGggPSBULmxlbmd0aDsKK30KKworLyoKKyAqIGZvcmVhY2ggKEl0ZW07IEl0ZW1zKSB7CisgKiAgIExpc3QgPSBPcGVyYXRvciEoSXRlbSwgTGlzdCk7CisgKiB9CisgKiB3aGVyZSBJdGVtcyBpcyBhIENvbmZpbmVkVHVwbGUgYW5kIExpc3QgaXMgYSB0eXBlIHR1cGxlLgorICovCit0ZW1wbGF0ZSBGb3JBbGxXaXRoTGlzdChhbGlhcyBJdGVtcywgYWxpYXMgT3BlcmF0b3IsIExpc3QuLi4pIGlmICgKKyAgaXModHlwZW9mKEl0ZW1zLmxlbmd0aCkgOiBzaXplX3QpCispeworICBzdGF0aWMgaWYgKEl0ZW1zLmxlbmd0aCA9PSAwKSB7CisgICAgYWxpYXMgTGlzdCBGb3JBbGxXaXRoTGlzdDsKKyAgfSBlbHNlIHsKKyAgICBhbGlhcyAuRm9yQWxsV2l0aExpc3QhKAorICAgICAgQ29uZmluZWRUdXBsZSEoSXRlbXMuVHVwbGVbMSAuLiAkXSksCisgICAgICBPcGVyYXRvciwKKyAgICAgIE9wZXJhdG9yIShJdGVtcy5UdXBsZVswXSwgTGlzdCkKKyAgICApIEZvckFsbFdpdGhMaXN0OworICB9Cit9CisKKy8qKgorICogV3JhcHMgdGhlIHBhc3NlZCB0ZW1wbGF0ZSBwcmVkaWNhdGUgc28gaXQgcmV0dXJucyB0cnVlIGlmIGl0IGNvbXBpbGVzIGFuZAorICogZXZhbHVhdGVzIHRvIHRydWUsIGZhbHNlIGl0IGl0IGRvZXNuJ3QgY29tcGlsZSBvciBldmFsdWF0ZXMgdG8gZmFsc2UuCisgKi8KK3RlbXBsYXRlIENvbXBpbGVzQW5kVHJ1ZShhbGlhcyBUKSB7CisgIHRlbXBsYXRlIENvbXBpbGVzQW5kVHJ1ZShVLi4uKSB7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoVCFVKSA6IGJvb2wpKSB7CisgICAgICBlbnVtIGJvb2wgQ29tcGlsZXNBbmRUcnVlID0gVCFVOworICAgIH0gZWxzZSB7CisgICAgICBlbnVtIGJvb2wgQ29tcGlsZXNBbmRUcnVlID0gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2N0ZmUuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGRiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2N0ZmUuZApAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKKworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0czsKKworLyoKKyAqIFNpbXBsZSBlYWdlciBqb2luKCkgZm9yIHN0cmluZ3MsIHN0ZC5hbGdvcml0aG0uam9pbiBpc24ndCBDVEZFYWJsZSB5ZXQuCisgKi8KK3N0cmluZyBjdGZlSm9pbihzdHJpbmdbXSBzdHJpbmdzLCBzdHJpbmcgc2VwYXJhdG9yID0gIiwgIikgeworICBzdHJpbmcgcmVzdWx0OworICBpZiAoc3RyaW5ncy5sZW5ndGggPiAwKSB7CisgICAgcmVzdWx0IH49IHN0cmluZ3NbMF07CisgICAgZm9yZWFjaCAoczsgc3RyaW5nc1sxLi4kXSkgeworICAgICAgcmVzdWx0IH49IHNlcGFyYXRvciB+IHM7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBBIHZlcnkgcHJpbWl0aXZlIHRvIXN0cmluZygpIGltcGxlbWVudGF0aW9uIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIHRoYXQKKyAqIGlzIGV2YWx1YXRhYmxlIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBUaGVyZSBpcyBhIHdlYWx0aCBvZiBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFsZ29yaXRobSB1c2VkIChlLmcuIDUuMAorICogcHJpbnRzIGFzIDQuOTk54oCmLCBpbmNvcnJlY3Qgcm91bmRpbmcsIGV0Yy4pLCBidXQgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUgc2hvdWxkCisgKiBiZSBpbmNsdWRlZCB3aXRoIHRoZSBEIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgaXQgaGVyZS4KKyAqLworc3RyaW5nIGN0ZmVUb1N0cmluZyhUKShUIHZhbCkgaWYgKGlzRmxvYXRpbmdQb2ludCFUKSB7CisgIGlmICh2YWwgaXMgVC5uYW4pIHJldHVybiAibmFuIjsKKyAgaWYgKHZhbCBpcyBULmluZmluaXR5KSByZXR1cm4gImluZiI7CisgIGlmICh2YWwgaXMgLVQuaW5maW5pdHkpIHJldHVybiAiLWluZiI7CisgIGlmICh2YWwgaXMgMC4wKSByZXR1cm4gIjAiOworICBpZiAodmFsIGlzIC0wLjApIHJldHVybiAiLTAiOworCisgIGF1dG8gYiA9IHZhbDsKKworICBzdHJpbmcgcmVzdWx0OworICBpZiAoYiA8IDApIHsKKyAgICByZXN1bHQgfj0gJy0nOworICAgIGIgKj0gLTE7CisgIH0KKworICBzaG9ydCBtYWduaXR1ZGU7CisgIHdoaWxlIChiID49IDEwKSB7CisgICAgKyttYWduaXR1ZGU7CisgICAgYiAvPSAxMDsKKyAgfQorICB3aGlsZSAoYiA8IDEpIHsKKyAgICAtLW1hZ25pdHVkZTsKKyAgICBiICo9IDEwOworICB9CisKKyAgZm9yZWFjaCAoaTsgMCAuLiBULmRpZykgeworICAgIGlmIChpID09IDEpIHJlc3VsdCB+PSAnLic7CisKKyAgICBhdXRvIGZpcnN0ID0gY2FzdCh1Ynl0ZSliOworICAgIHJlc3VsdCB+PSB0byFzdHJpbmcoZmlyc3QpOworCisgICAgYiAtPSBmaXJzdDsKKyAgICBpbXBvcnQgc3RkLm1hdGg7CisgICAgaWYgKGIgPCBwb3coMTAuMCwgaSAtIFQuZGlnKSkgYnJlYWs7CisgICAgYiAqPSAxMDsKKyAgfQorCisgIGlmIChtYWduaXR1ZGUgIT0gMCkgcmVzdWx0IH49ICJlIiB+IHRvIXN0cmluZyhtYWduaXR1ZGUpOworICByZXR1cm4gcmVzdWx0OworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuYWxnb3JpdGhtOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZyhkb3VibGUuaW5maW5pdHkpID09ICJpbmYiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoLWRvdWJsZS5pbmZpbml0eSkgPT0gIi1pbmYiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoZG91YmxlLm5hbikgPT0gIm5hbiIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygwLjApID09ICIwIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKC0wLjApID09ICItMCIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygyLjUpID09ICIyLjUiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMy4xNDE1KS5zdGFydHNXaXRoKCIzLjE0MSIpKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMmUtMjAwKSA9PSAiMmUtMjAwIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2VuZGlhbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9lbmRpYW4uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI5ODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9lbmRpYW4uZApAQCAtMCwwICsxLDc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBTaW1wbGUgaGVscGVycyBmb3IgaGFuZGxpbmcgdHlwaWNhbCBieXRlIG9yZGVyLXJlbGF0ZWQgaXNzdWVzLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKKworaW1wb3J0IGNvcmUuYml0b3AgOiBic3dhcDsKK2ltcG9ydCBzdGQudHJhaXRzIDogaXNJbnRlZ3JhbDsKKwordW5pb24gSW50QnVmKFQpIHsKKyAgdWJ5dGVbVC5zaXplb2ZdIGJ5dGVzOworICBUIHZhbHVlOworfQorCitUIGJ5dGVTd2FwKFQpKFQgdCkgcHVyZSBub3Rocm93IEB0cnVzdGVkIGlmIChpc0ludGVncmFsIVQpIHsKKyAgc3RhdGljIGlmIChULnNpemVvZiA9PSAyKSB7CisgICAgcmV0dXJuIGNhc3QoVCkoKHQgJiAweGZmKSA8PCA4KSB8IGNhc3QoVCkoKHQgJiAweGZmMDApID4+IDgpOworICB9IGVsc2Ugc3RhdGljIGlmIChULnNpemVvZiA9PSA0KSB7CisgICAgcmV0dXJuIGNhc3QoVClic3dhcChjYXN0KHVpbnQpdCk7CisgIH0gZWxzZSBzdGF0aWMgaWYgKFQuc2l6ZW9mID09IDgpIHsKKyAgICByZXR1cm4gY2FzdChUKWJ5dGVTd2FwKGNhc3QodWludCkodCAmIDB4ZmZmZmZmZmYpKSA8PCAzMiB8CisgICAgICBjYXN0KFQpYnN3YXAoY2FzdCh1aW50KSh0ID4+IDMyKSk7CisgIH0gZWxzZSBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiVHlwZSBvZiBzaXplICIgfiB0byFzdHJpbmcoVC5zaXplb2YpIH4gIiBub3Qgc3VwcG9ydGVkLiIpOworfQorCitUIGRvTm90aGluZyhUKShUIHZhbCkgeyByZXR1cm4gdmFsOyB9CisKK3ZlcnNpb24gKEJpZ0VuZGlhbikgeworICBhbGlhcyBkb05vdGhpbmcgaG9zdFRvTmV0OworICBhbGlhcyBkb05vdGhpbmcgbmV0VG9Ib3N0OworICBhbGlhcyBieXRlU3dhcCBob3N0VG9MZTsKKyAgYWxpYXMgYnl0ZVN3YXAgbGVUb0hvc3Q7Cit9IGVsc2UgeworICBhbGlhcyBieXRlU3dhcCBob3N0VG9OZXQ7CisgIGFsaWFzIGJ5dGVTd2FwIG5ldFRvSG9zdDsKKyAgYWxpYXMgZG9Ob3RoaW5nIGhvc3RUb0xlOworICBhbGlhcyBkb05vdGhpbmcgbGVUb0hvc3Q7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisKKyAgSW50QnVmIXNob3J0IHM7CisgIHMuYnl0ZXMgPSBbMSwgMl07CisgIHMudmFsdWUgPSBieXRlU3dhcChzLnZhbHVlKTsKKyAgZW5mb3JjZShzLmJ5dGVzID09IFsyLCAxXSk7CisKKyAgSW50QnVmIWludCBpOworICBpLmJ5dGVzID0gWzEsIDIsIDMsIDRdOworICBpLnZhbHVlID0gYnl0ZVN3YXAoaS52YWx1ZSk7CisgIGVuZm9yY2UoaS5ieXRlcyA9PSBbNCwgMywgMiwgMV0pOworCisgIEludEJ1ZiFsb25nIGw7CisgIGwuYnl0ZXMgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOF07CisgIGwudmFsdWUgPSBieXRlU3dhcChsLnZhbHVlKTsKKyAgZW5mb3JjZShsLmJ5dGVzID09IFs4LCA3LCA2LCA1LCA0LCAzLCAyLCAxXSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Jlc291cmNlX3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvcmVzb3VyY2VfcG9vbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODIwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Jlc291cmNlX3Bvb2wuZApAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5yZXNvdXJjZV9wb29sOworCitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1ciwgVGlja0R1cmF0aW9uOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW5Qb3MsIHJlZHVjZSwgcmVtb3ZlOworaW1wb3J0IHN0ZC5hcnJheSA6IGFycmF5LCBlbXB0eTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5yYW5kb20gOiByYW5kb21Db3Zlciwgcm5kR2VuOworaW1wb3J0IHN0ZC5yYW5nZSA6IHppcDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtIDogcmVtb3ZlRXF1YWw7CisKKy8qKgorICogQSBwb29sIG9mIHJlc291cmNlcywgd2hpY2ggY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB3aGVyZSByZXNvdXJjZXMgdGhhdAorICogaGF2ZSBmYWlsZWQgdG9vIG9mdGVuIGNhbiBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIG9ibGl2aW91cyB0byB0aGUgYWN0dWFsIHJlc291cmNlIHR5cGUgbWFuYWdlZC4KKyAqLworZmluYWwgY2xhc3MgVFJlc291cmNlUG9vbChSZXNvdXJjZSkgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHJlc291cmNlcyA9IFRoZSBpbml0aWFsIG1lbWJlcnMgb2YgdGhlIHBvb2wuCisgICAqLworICB0aGlzKFJlc291cmNlW10gcmVzb3VyY2VzKSB7CisgICAgcmVzb3VyY2VzXyA9IHJlc291cmNlczsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIGEgcmVzb3VyY2UgdG8gdGhlIHBvb2wuCisgICAqLworICB2b2lkIGFkZChSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIHJlc291cmNlc18gfj0gcmVzb3VyY2U7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyBhIHJlc291cmNlIGZyb20gdGhlIHBvb2wuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIHJlc291cmNlIGNvdWxkIGJlIGZvdW5kIGluIHRoZSBwb29sLgorICAgKi8KKyAgYm9vbCByZW1vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBhdXRvIG9sZExlbmd0aCA9IHJlc291cmNlc18ubGVuZ3RoOworICAgIHJlc291cmNlc18gPSByZW1vdmVFcXVhbChyZXNvdXJjZXNfLCByZXNvdXJjZSk7CisgICAgcmV0dXJuIHJlc291cmNlc18ubGVuZ3RoIDwgb2xkTGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYW4gwrtlbnJpY2hlZMKrIGlucHV0IHJhbmdlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgcG9vbCBtZW1iZXJzLgorICAgKi8KKyAgc3RhdGljIHN0cnVjdCBSYW5nZSB7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBjYXNlIGlmIGFsbCBtZW1iZXJzIG9mIHRoZSBwb29sIGhhdmUgYmVlbiBwb3BwZWQgKG9yIHNraXBwZWQKKyAgICAgKiBiZWNhdXNlIHRoZXkgd2VyZSBkaXNhYmxlZCkgYW5kIFRSZXNvdXJjZVBvb2wuY3ljbGUgaXMgZmFsc2UsIG9yIHRoZXJlCisgICAgICogaXMgbm8gZWxlbWVudCB0byByZXR1cm4gaW4gY3ljbGUgbW9kZSBiZWNhdXNlIGFsbCBoYXZlIGJlZW4gdGVtcG9yYXJpbHkKKyAgICAgKiBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBib29sIGVtcHR5KCkgQHByb3BlcnR5IHsKKyAgICAgIC8vIElmIG5vIHJlc291cmNlcyBhcmUgaW4gdGhlIHBvb2wsIHRoZSByYW5nZSB3aWxsIG5ldmVyIGJlY29tZSBub24tZW1wdHkuCisgICAgICBpZiAocmVzb3VyY2VzXy5lbXB0eSkgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIElmIHdlIGFscmVhZHkgZ290IHRoZSBuZXh0IHJlc291cmNlIGluIHRoZSBjYWNoZSwgaXQgZG9lc24ndCBtYXR0ZXIKKyAgICAgIC8vIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUuCisgICAgICBpZiAoY2FjaGVkXykgcmV0dXJuIGZhbHNlOworCisgICAgICBzaXplX3QgZXhhbWluZUNvdW50OworICAgICAgaWYgKHBhcmVudF8uY3ljbGUpIHsKKyAgICAgICAgLy8gV2Ugd2FudCB0byBjaGVjayBhbGwgdGhlIHJlc291cmNlcywgYnV0IG5vdCBpdGVyYXRlIG1vcmUgdGhhbiBvbmNlCisgICAgICAgIC8vIHRvIGF2b2lkIHNwaW5uaW5nIGluIGEgbG9vcCBpZiBub3RoaW5nIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgZXhhbWluZUNvdW50ID0gcmVzb3VyY2VzXy5sZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGVuIG5vdCBpbiBjeWNsZSBtb2RlLCB3ZSBqdXN0IGl0ZXJhdGUgdGhlIGxpc3QgZXhhY3RseSBvbmNlLiBJZiBhbGwKKyAgICAgICAgLy8gaXRlbXMgaGF2ZSBiZWVuIGNvbnN1bWVkLCB0aGUgaW50ZXJ2YWwgYmVsb3cgaXMgZW1wdHkuCisgICAgICAgIGV4YW1pbmVDb3VudCA9IHJlc291cmNlc18ubGVuZ3RoIC0gbmV4dEluZGV4XzsKKyAgICAgIH0KKworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBleGFtaW5lQ291bnQpIHsKKyAgICAgICAgYXV0byByID0gcmVzb3VyY2VzX1sobmV4dEluZGV4XyArIGkpICUgcmVzb3VyY2VzXy5sZW5ndGhdOworICAgICAgICBhdXRvIGZpID0gciBpbiBwYXJlbnRfLmZhdWx0SW5mb3NfOworCisgICAgICAgIGlmIChmaSAmJiBmaS5yZXNldFRpbWUgIT0gZmkucmVzZXRUaW1lLmluaXQpIHsKKyAgICAgICAgICBpZiAoZmkucmVzZXRUaW1lIDwgcGFyZW50Xy5nZXRDdXJyZW50VGlja18oKSkgeworICAgICAgICAgICAgLy8gVGhlIHRpbWVvdXQgZXhwaXJlZCwgcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBsaXN0IGFuZCBnbworICAgICAgICAgICAgLy8gYWhlYWQgdHJ5aW5nIGl0LgorICAgICAgICAgICAgcGFyZW50Xy5mYXVsdEluZm9zXy5yZW1vdmUocik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSB0aW1lb3V0IGRpZG4ndCBleHBpcmUgeWV0LCB0cnkgdGhlIG5leHQgcmVzb3VyY2UuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYWNoZV8gPSByOworICAgICAgICBjYWNoZWRfID0gdHJ1ZTsKKyAgICAgICAgbmV4dEluZGV4XyA9IG5leHRJbmRleF8gKyBpICsgMTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIHJlc291cmNlcyBhcmUgY3VycmVudGx5IGluYWN0aXZlIG9yIHRoZSBub24tY3ljbGUKKyAgICAgIC8vIHBvb2wgaGFzIGJlZW4gZXhoYXVzdGVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkby4KKyAgICAgIG5leHRJbmRleF8gPSBuZXh0SW5kZXhfICsgZXhhbWluZUNvdW50OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgcmVzb3VyY2UgaW4gdGhlIHJhbmdlLgorICAgICAqLworICAgIFJlc291cmNlIGZyb250KCkgQHByb3BlcnR5IHsKKyAgICAgIGVuZm9yY2UoIWVtcHR5KTsKKyAgICAgIHJldHVybiBjYWNoZV87CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgZmlyc3QgcmVzb3VyY2UgZnJvbSB0aGUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBVc3VhbGx5LCB0aGlzIGlzIGNvbWJpbmVkIHdpdGggYSBjYWxsIHRvIFRSZXNvdXJjZVBvb2wucmVjb3JkU3VjY2VzcygpCisgICAgICogb3IgcmVjb3JkRmF1bHQoKS4KKyAgICAgKi8KKyAgICB2b2lkIHBvcEZyb250KCkgeworICAgICAgZW5mb3JjZSghZW1wdHkpOworICAgICAgY2FjaGVkXyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmFuZ2Ugd2lsbCBiZWNvbWUgbm9uLWVtcHR5IGF0IHNvbWUgcG9pbnQgaW4gdGhlCisgICAgICogZnV0dXJlLCBhbmQgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aGVuIHRoaXMgd2lsbCBoYXBwZW4gYW5kCisgICAgICogd2hhdCB3aWxsIGJlIHRoZSBuZXh0IHJlc291cmNlLgorICAgICAqCisgICAgICogTWFrZXMgb25seSBzZW5zZSB0byBjYWxsIG9uIGVtcHR5IHJhbmdlcy4KKyAgICAgKgorICAgICAqIFBhcmFtczoKKyAgICAgKiAgIG5leHQgPSBUaGUgbmV4dCByZXNvdXJjZSB0aGF0IHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KKyAgICAgKiAgIHdhaXRUaW1lID0gVGhlIGR1cmF0aW9uIHVudGlsIHRoYXQgcmVzb3VyY2Ugd2lsbCBiZWNvbWUgYXZhaWxhYmxlLgorICAgICAqLworICAgIGJvb2wgd2lsbEJlY29tZU5vbmVtcHR5KG91dCBSZXNvdXJjZSBuZXh0LCBvdXQgRHVyYXRpb24gd2FpdFRpbWUpIHsKKyAgICAgIC8vIElmIG5vIHJlc291cmNlcyBhcmUgaW4gdGhlIHBvb2wsIHRoZSByYW5nZSB3aWxsIG5ldmVyIGJlY29tZSBub24tZW1wdHkuCisgICAgICBpZiAocmVzb3VyY2VzXy5lbXB0eSkgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBJZiBjeWNsZSBtb2RlIGlzIG5vdCBlbmFibGVkLCBhIHJhbmdlIG5ldmVyIGJlY29tZXMgbm9uLWVtcHR5IGFmdGVyCisgICAgICAvLyBiZWluZyBlbXB0eSBvbmNlLCBiZWNhdXNlIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgICAgIC8vIHVzZWQvc2tpcHBlZCBpbiBvcmRlciB0byBiZWNvbWUgZW1wdHkuCisgICAgICBpZiAoIXBhcmVudF8uY3ljbGUpIHJldHVybiBmYWxzZTsKKworICAgICAgYXV0byBmaSA9IHBhcmVudF8uZmF1bHRJbmZvc187CisgICAgICBhdXRvIG5leHRQYWlyID0gbWluUG9zISJhWzFdLnJlc2V0VGltZSA8IGJbMV0ucmVzZXRUaW1lIigKKyAgICAgICAgemlwKGZpLmtleXMsIGZpLnZhbHVlcykKKyAgICAgICkuZnJvbnQ7CisKKyAgICAgIG5leHQgPSBuZXh0UGFpclswXTsKKyAgICAgIHdhaXRUaW1lID0gdG8hRHVyYXRpb24obmV4dFBhaXJbMV0ucmVzZXRUaW1lIC0gcGFyZW50Xy5nZXRDdXJyZW50VGlja18oKSk7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIHRoaXMoVFJlc291cmNlUG9vbCBwYXJlbnQsIFJlc291cmNlW10gcmVzb3VyY2VzKSB7CisgICAgICBwYXJlbnRfID0gcGFyZW50OworICAgICAgcmVzb3VyY2VzXyA9IHJlc291cmNlczsKKyAgICB9CisKKyAgICBUUmVzb3VyY2VQb29sIHBhcmVudF87CisKKyAgICAvLy8gQWxsIGF2YWlsYWJsZSByZXNvdXJjZXMuIFdlIGtlZXAgYSBjb3B5IG9mIGl0IGFzIHRvIG5vdCBnZXQgY29uZnVzZWQKKyAgICAvLy8gd2hlbiByZXNvdXJjZXMgYXJlIGFkZGVkIHRvL3JlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHBvb2wuCisgICAgUmVzb3VyY2VbXSByZXNvdXJjZXNfOworCisgICAgLy8vIEFmdGVyIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGUgbmV4dCBlbGVtZW50IGluIGVtcHR5KCksIHdlIHN0b3JlIGl0IGhlcmUuCisgICAgUmVzb3VyY2UgY2FjaGVfOworCisgICAgLy8vIFdoZXRoZXIgdGhlcmUgaXMgY3VycmVudGx5IHNvbWV0aGluZyBpbiB0aGUgY2FjaGUuCisgICAgYm9vbCBjYWNoZWRfOworCisgICAgLy8vIFRoZSBpbmRleCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSBhdCB0aGUgbmV4dCBjYWxsIHRvIGVtcHR5KCkuCisgICAgc2l6ZV90IG5leHRJbmRleF87CisgIH0KKworICAvLy8gRGl0dG8KKyAgUmFuZ2Ugb3BTbGljZSgpIHsKKyAgICBhdXRvIHJlcyA9IHJlc291cmNlc187CisgICAgaWYgKHBlcm11dGUpIHsKKyAgICAgIHJlcyA9IGFycmF5KHJhbmRvbUNvdmVyKHJlcywgcm5kR2VuKSk7CisgICAgfQorICAgIHJldHVybiBSYW5nZSh0aGlzLCByZXMpOworICB9CisKKyAgLyoqCisgICAqIFJlY29yZHMgYSBzdWNjZXNzIGZvciBhbiBvcGVyYXRpb24gb24gdGhlIGdpdmVuIHJlc291cmNlLCBjYW5jZWxsaW5nIGEKKyAgICogZmF1bHQgc3RyZWFrLCBpZiBhbnkuCisgICAqLworICB2b2lkIHJlY29yZFN1Y2Nlc3MoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBpZiAocmVzb3VyY2UgaW4gZmF1bHRJbmZvc18pIHsKKyAgICAgIGZhdWx0SW5mb3NfLnJlbW92ZShyZXNvdXJjZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlY29yZHMgYSBmYXVsdCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgorICAgKgorICAgKiBJZiBhIHJlc291cmNlIGZhaWxzIGNvbnNlY3V0aXZlbHkgZm9yIG1vcmUgdGhhbiBmYXVsdERpc2FibGVDb3VudCB0aW1lcywKKyAgICogaXQgaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQgKG5vIGxvbmdlciBjb25zaWRlcmVkKSB1bnRpbAorICAgKiBmYXVsdERpc2FibGVEdXJhdGlvbiBoYXMgcGFzc2VkLgorICAgKi8KKyAgdm9pZCByZWNvcmRGYXVsdChSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIGF1dG8gZmkgPSByZXNvdXJjZSBpbiBmYXVsdEluZm9zXzsKKworICAgIGlmICghZmkpIHsKKyAgICAgIGZhdWx0SW5mb3NfW3Jlc291cmNlXSA9IEZhdWx0SW5mbygpOworICAgICAgZmkgPSByZXNvdXJjZSBpbiBmYXVsdEluZm9zXzsKKyAgICB9CisKKyAgICArK2ZpLmNvdW50OworICAgIGlmIChmaS5jb3VudCA+PSBmYXVsdERpc2FibGVDb3VudCkgeworICAgICAgLy8gSWYgdGhlIHJlc291cmNlIGhhcyBoaXQgdGhlIGZhdWx0IGNvdW50IGxpbWl0LCBkaXNhYmxlIGl0IGZvcgorICAgICAgLy8gc3BlY2lmaWVkIGR1cmF0aW9uLgorICAgICAgZmkucmVzZXRUaW1lID0gZ2V0Q3VycmVudFRpY2tfKCkgKyBjYXN0KFRpY2tEdXJhdGlvbilmYXVsdERpc2FibGVEdXJhdGlvbjsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byByYW5kb21seSBwZXJtdXRlIHRoZSBvcmRlciBvZiB0aGUgcmVzb3VyY2VzIGluIHRoZSBwb29sIHdoZW4KKyAgICogdGFraW5nIGEgcmFuZ2UgdXNpbmcgb3BTbGljZSgpLgorICAgKgorICAgKiBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gYXMgYSBzaW1wbGUgZm9ybSBvZiBsb2FkIGJhbGFuY2luZy4KKyAgICovCisgIGJvb2wgcGVybXV0ZSA9IHRydWU7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8ga2VlcCBpdGVyYXRpbmcgb3ZlciB0aGUgcG9vbCBtZW1iZXJzIGFmdGVyIGFsbCBoYXZlIGJlZW4KKyAgICogcmV0dXJuZWQvaGF2ZSBmYWlsZWQgb25jZS4KKyAgICovCisgIGJvb2wgY3ljbGUgPSBmYWxzZTsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmYXVsdHMgYWZ0ZXIgd2hpY2ggYSByZXNvdXJjZSBpcyBkaXNhYmxlZCB1bnRpbAorICAgKiBmYXVsdERpc2FibGVEdXJhdGlvbiBoYXMgcGFzc2VkLiBaZXJvIHRvIG5ldmVyIGRpc2FibGUgcmVzb3VyY2VzLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvLgorICAgKi8KKyAgdXNob3J0IGZhdWx0RGlzYWJsZUNvdW50ID0gMDsKKworICAvKioKKyAgICogVGhlIGR1cmF0aW9uIGZvciB3aGljaCBhIHJlc291cmNlIGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFmdGVyIGl0IGhhcworICAgKiBmYWlsZWQgdG9vIG9mdGVuLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gZmF1bHREaXNhYmxlRHVyYXRpb24gPSBkdXIhInNlY29uZHMiKDEpOworCitwcml2YXRlOgorICBSZXNvdXJjZVtdIHJlc291cmNlc187CisgIEZhdWx0SW5mb1tSZXNvdXJjZV0gZmF1bHRJbmZvc187CisKKyAgLy8vIEZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZnJvbSBzb21lIG1vbm90b25pYyBzeXN0ZW0gY2xvY2suCisgIC8vLworICAvLy8gVGhpcyBpcyBvdmVycmlkYWJsZSB0byBiZSBhYmxlIHRvIHdyaXRlIHRpbWluZy1pbnNlbnNpdGl2ZSB1bml0IHRlc3RzLgorICAvLy8gVGhlIGV4dHJhIGluZGlyZWN0aW9uIHNob3VsZCBub3QgbWF0dGVyIG11Y2ggcGVyZm9ybWFuY2Utd2lzZSBjb21wYXJlZCB0bworICAvLy8gdGhlIGFjdHVhbCBzeXN0ZW0gY2FsbCwgYW5kIGJ5IGl0cyB2ZXJ5IG5hdHVyZSB0aGlzc2hvdWxkIG5vdCBiZSBvbiBhIGhvdAorICAvLy8gcGF0aCBhbnl3YXkuCisgIHR5cGVvZigmVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrKSBnZXRDdXJyZW50VGlja18gPQorICAgICZUaWNrRHVyYXRpb24uY3VyclN5c3RlbVRpY2s7Cit9CisKK3ByaXZhdGUgeworICBzdHJ1Y3QgRmF1bHRJbmZvIHsKKyAgICB1c2hvcnQgY291bnQ7CisgICAgVGlja0R1cmF0aW9uIHJlc2V0VGltZTsKKyAgfQorfQorCit1bml0dGVzdCB7CisgIGF1dG8gcG9vbCA9IG5ldyBUUmVzb3VyY2VQb29sIU9iamVjdChbXSk7CisgIGVuZm9yY2UocG9vbFtdLmVtcHR5KTsKKyAgT2JqZWN0IGR1bW15UmVzOworICBEdXJhdGlvbiBkdW1teUR1cjsKKyAgZW5mb3JjZSghcG9vbFtdLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmRhdGV0aW1lOworICBpbXBvcnQgdGhyaWZ0LmJhc2U7CisKKyAgYXV0byBhID0gbmV3IE9iamVjdDsKKyAgYXV0byBiID0gbmV3IE9iamVjdDsKKyAgYXV0byBjID0gbmV3IE9iamVjdDsKKyAgYXV0byBvYmpzID0gW2EsIGIsIGNdOworICBhdXRvIHBvb2wgPSBuZXcgVFJlc291cmNlUG9vbCFPYmplY3Qob2Jqcyk7CisgIHBvb2wucGVybXV0ZSA9IGZhbHNlOworCisgIHN0YXRpYyBEdXJhdGlvbiBmYWtlQ2xvY2s7CisgIHBvb2wuZ2V0Q3VycmVudFRpY2tfID0gKCkgPT4gY2FzdChUaWNrRHVyYXRpb24pZmFrZUNsb2NrOworCisgIE9iamVjdCBkdW1teVJlcyA9IHZvaWQ7CisgIER1cmF0aW9uIGR1bW15RHVyID0gdm9pZDsKKworICB7CisgICAgYXV0byByID0gcG9vbFtdOworCisgICAgZm9yZWFjaCAoaSwgbzsgb2JqcykgeworICAgICAgZW5mb3JjZSghci5lbXB0eSk7CisgICAgICBlbmZvcmNlKHIuZnJvbnQgPT0gbyk7CisgICAgICByLnBvcEZyb250KCk7CisgICAgfQorCisgICAgZW5mb3JjZShyLmVtcHR5KTsKKyAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMjsKKworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRTdWNjZXNzKGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYik7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBjKTsKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmVtcHR5KTsKKyAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKworICAgIGZha2VDbG9jayArPSAyLnNlY29uZHM7CisgICAgLy8gTm90IGluIGN5Y2xlIG1vZGUsIGhhcyB0byBiZSBzdGlsbCBlbXB0eSBhZnRlciB0aGUgdGltZW91dHMgZXhwaXJlZC4KKyAgICBlbmZvcmNlKHIuZW1wdHkpOworICAgIGVuZm9yY2UoIXIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworCisgICAgZm9yZWFjaCAobzsgb2JqcykgcG9vbC5yZWNvcmRTdWNjZXNzKG8pOworICB9CisKKyAgeworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAxOworCisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGIpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYyk7CisKKyAgICBhdXRvIHIgPSBwb29sW107CisgICAgZW5mb3JjZShyLmVtcHR5KTsKKyAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKworICAgIGZvcmVhY2ggKG87IG9ianMpIHBvb2wucmVjb3JkU3VjY2VzcyhvKTsKKyAgfQorCisgIHBvb2wuY3ljbGUgPSB0cnVlOworCisgIHsKKyAgICBhdXRvIHIgPSBwb29sW107CisKKyAgICBmb3JlYWNoIChvOyBvYmpzIH4gb2JqcykgeworICAgICAgZW5mb3JjZSghci5lbXB0eSk7CisgICAgICBlbmZvcmNlKHIuZnJvbnQgPT0gbyk7CisgICAgICByLnBvcEZyb250KCk7CisgICAgfQorICB9CisKKyAgeworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAyOworCisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZFN1Y2Nlc3MoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworCisgICAgYXV0byByID0gcG9vbFtdOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBiKTsKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGMpOworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYik7CisKKyAgICBmYWtlQ2xvY2sgKz0gMi5zZWNvbmRzOworCisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBjKTsKKworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYSk7CisKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKworICAgIGZvcmVhY2ggKG87IG9ianMpIHBvb2wucmVjb3JkU3VjY2VzcyhvKTsKKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZmFrZUNsb2NrICs9IDEubXNlY3M7CisgICAgcG9vbC5yZWNvcmRGYXVsdChiKTsKKyAgICBmYWtlQ2xvY2sgKz0gMS5tc2VjczsKKyAgICBwb29sLnJlY29yZEZhdWx0KGMpOworCisgICAgYXV0byByID0gcG9vbFtdOworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2lsbEJlY29tZU5vbmVtcHR5IGdldHMgdGhlIG9yZGVyIHJpZ2h0LgorICAgIGVuZm9yY2Uoci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisgICAgZW5mb3JjZShkdW1teVJlcyA9PSBhKTsKKyAgICBlbmZvcmNlKGR1bW15RHVyID4gRHVyYXRpb24uemVybyk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NvY2tldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYTBhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NvY2tldC5kCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBBYnN0cmFjdGlvbnMgb3ZlciBPUy1kZXBlbmRlbnQgc29ja2V0IGZ1bmN0aW9uYWxpdHkuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworCitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKKworLy8gRnJlZUJTRCBhbmQgT1MgWCByZXR1cm4gLTEgYW5kIHNldCBFQ09OTlJFU0VUIGlmIHNvY2tldCB3YXMgY2xvc2VkIGJ5CisvLyB0aGUgb3RoZXIgc2lkZSwgd2UgbmVlZCB0byBjaGVjayBmb3IgdGhhdCBiZWZvcmUgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgordmVyc2lvbiAoRnJlZUJTRCkgeworICBlbnVtIGNvbm5yZXNldE9uUGVlclNodXRkb3duID0gdHJ1ZTsKK30gZWxzZSB2ZXJzaW9uIChPU1gpIHsKKyAgZW51bSBjb25ucmVzZXRPblBlZXJTaHV0ZG93biA9IHRydWU7Cit9IGVsc2UgeworICBlbnVtIGNvbm5yZXNldE9uUGVlclNodXRkb3duID0gZmFsc2U7Cit9CisKK3ZlcnNpb24gKFdpbjMyKSB7CisgIGltcG9ydCBzdGQuYy53aW5kb3dzLndpbnNvY2sgOiBXU0FHZXRMYXN0RXJyb3IsIFdTQUVJTlRSLCBXU0FFV09VTERCTE9DSzsKKyAgaW1wb3J0IHN0ZC53aW5kb3dzLnN5c2Vycm9yIDogc3lzRXJyb3JTdHJpbmc7CisKKyAgLy8gVGhlc2UgYXJlIHVuZm9ydHVuYXRlbHkgbm90IGRlZmluZWQgaW4gc3RkLmMud2luZG93cy53aW5zb2NrLCBzZWUKKyAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNzQwNjY4LmFzcHguCisgIGVudW0gV1NBRUNPTk5SRVNFVCA9IDEwMDU0OworICBlbnVtIFdTQUVOT1RDT05OID0gMTAwNTc7CisgIGVudW0gV1NBRVRJTUVET1VUID0gMTAwNjA7Cit9IGVsc2UgeworICBpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm8sIEVBR0FJTiwgRUNPTk5SRVNFVCwgRUlOUFJPR1JFU1MsIEVJTlRSLAorICAgIEVOT1RDT05OLCBFUElQRTsKKyAgaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJlcnJvcjsKK30KKworLyoKKyAqIENPTk5FQ1RfSU5QUk9HUkVTU19FUlJOTzogc2V0IGJ5IGNvbm5lY3QoKSBmb3Igbm9uLWJsb2NraW5nIHNvY2tldHMgaWYgdGhlCisgKiAgIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGltbWVkaWF0ZWx5IGVzdGFibGlzaGVkLgorICogSU5URVJSVVBURURfRVJSTk86IHNldCB3aGVuIGJsb2NraW5nIHN5c3RlbSBjYWxscyBhcmUgaW50ZXJydXB0ZWQgYnkKKyAqICAgc2lnbmFscyBvciBzaW1pbGFyLgorICogVElNRU9VVF9FUlJOTzogc2V0IHdoZW4gYSBzb2NrZXQgdGltZW91dCBoYXMgYmVlbiBleGNlZWRlZC4KKyAqIFdPVUxEX0JMT0NLX0VSUk5POiBzZXQgd2hlbiBzZW5kL3JlY3Ygd291bGQgYmxvY2sgb24gbm9uLWJsb2NraW5nIHNvY2tldHMuCisgKgorICogaXNTb2NldENsb3NlRXJybm8oZXJybm8pOiByZXR1cm5zIHRydWUgaWYgZXJybm8gaW5kaWNhdGVzIHRoYXQgdGhlIHNvY2tldAorICogICBpcyBsb2dpY2FsbHkgaW4gY2xvc2VkIHN0YXRlIG5vdy4KKyAqLwordmVyc2lvbiAoV2luMzIpIHsKKyAgYWxpYXMgV1NBR2V0TGFzdEVycm9yIGdldFNvY2tldEVycm5vOworICBlbnVtIENPTk5FQ1RfSU5QUk9HUkVTU19FUlJOTyA9IFdTQUVXT1VMREJMT0NLOworICBlbnVtIElOVEVSUlVQVEVEX0VSUk5PID0gV1NBRUlOVFI7CisgIGVudW0gVElNRU9VVF9FUlJOTyA9IFdTQUVUSU1FRE9VVDsKKyAgZW51bSBXT1VMRF9CTE9DS19FUlJOTyA9IFdTQUVXT1VMREJMT0NLOworCisgIGJvb2wgaXNTb2NrZXRDbG9zZUVycm5vKHR5cGVvZihnZXRTb2NrZXRFcnJubygpKSBlcnJubykgeworICAgIHJldHVybiAoZXJybm8gPT0gV1NBRUNPTk5SRVNFVCB8fCBlcnJubyA9PSBXU0FFTk9UQ09OTik7CisgIH0KK30gZWxzZSB7CisgIGFsaWFzIGVycm5vIGdldFNvY2tldEVycm5vOworICBlbnVtIENPTk5FQ1RfSU5QUk9HUkVTU19FUlJOTyA9IEVJTlBST0dSRVNTOworICBlbnVtIElOVEVSUlVQVEVEX0VSUk5PID0gRUlOVFI7CisgIGVudW0gV09VTERfQkxPQ0tfRVJSTk8gPSBFQUdBSU47CisKKyAgLy8gVE9ETzogVGhlIEMrKyBUU29ja2V0IGltcGxlbWVudGF0aW9uIG1lbnRpb25zIHRoYXQgRUFHQUlOIGNhbiBhbHNvIGJlCisgIC8vIHNldCAodW5kb2N1bWVudGVkbHkpIGluIG91dCBvZiByZXNvdXJjZSBjb25kaXRpb25zOyBpdCB3b3VsZCBiZSBhIGdvb2QKKyAgLy8gaWRlYSB0byBjb250YWN0IHRoZSBvcmlnaW5hbCBhdXRob3JzIG9mIHRoZSBDKysgY29kZSBmb3IgZGV0YWlscyBhbmQgYWRhcHQKKyAgLy8gdGhlIGNvZGUgYWNjb3JkaW5nbHkuCisgIGVudW0gVElNRU9VVF9FUlJOTyA9IEVBR0FJTjsKKworICBib29sIGlzU29ja2V0Q2xvc2VFcnJubyh0eXBlb2YoZ2V0U29ja2V0RXJybm8oKSkgZXJybm8pIHsKKyAgICByZXR1cm4gKGVycm5vID09IEVQSVBFIHx8IGVycm5vID09IEVDT05OUkVTRVQgfHwgZXJybm8gPT0gRU5PVENPTk4pOworICB9Cit9CisKK3N0cmluZyBzb2NrZXRFcnJub1N0cmluZyh1aW50IGVycm5vKSB7CisgIHZlcnNpb24gKFdpbjMyKSB7CisgICAgcmV0dXJuIHN5c0Vycm9yU3RyaW5nKGVycm5vKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdG8hc3RyaW5nKHN0cmVycm9yKGVycm5vKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZjU0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnNzbDsKKworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgY29yZS5zdGRjLmNvbmZpZzsKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubzsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuZXJyOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLnNzbDsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC54NTA5djM7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGFwcGVuZGVyOworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnNvY2tldCA6IEFkZHJlc3M7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKKy8qKgorICogQ2hlY2tzIGlmIHRoZSBwZWVyIGlzIGF1dGhvcml6ZWQgYWZ0ZXIgdGhlIFNTTCBoYW5kc2hha2UgaGFzIGJlZW4KKyAqIGNvbXBsZXRlZCBvbiB0aGUgZ2l2ZW4gY29ubmNldGlvbiBhbmQgdGhyb3dzIGFuIFRTU0xFeGNlcHRpb24gaWYgbm90LgorICoKKyAqIFBhcmFtczoKKyAqICAgc3NsID0gVGhlIFNTTCBjb25uZWN0aW9uIHRvIGNoZWNrLgorICogICBhY2Nlc3NNYW5hZ2VyID0gVGhlIGFjY2VzcyBtYW5hZ2VyIHRvIGNoZWNrIHRoZSBwZWVyIGFnYWludHMuCisgKiAgIHBlZXJBZGRyZXNzID0gVGhlIChJUCkgYWRkcmVzcyBvZiB0aGUgcGVlci4KKyAqICAgaG9zdE5hbWUgPSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBwZWVyLgorICovCit2b2lkIGF1dGhvcml6ZShTU0wqIHNzbCwgVEFjY2Vzc01hbmFnZXIgYWNjZXNzTWFuYWdlciwKKyAgQWRkcmVzcyBwZWVyQWRkcmVzcywgbGF6eSBzdHJpbmcgaG9zdE5hbWUKKykgeworICBhbGlhcyBUQWNjZXNzTWFuYWdlci5EZWNpc2lvbiBEZWNpc2lvbjsKKworICBhdXRvIHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbCk7CisgIGlmIChyYyAhPSBYNTA5X1ZfT0spIHsKKyAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF92ZXJpZnlfcmVzdWx0KCk6ICIgfgorICAgICAgdG8hc3RyaW5nKFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSkpOworICB9CisKKyAgYXV0byBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbCk7CisgIGlmIChjZXJ0IGlzIG51bGwpIHsKKyAgICAvLyBDZXJ0aWZpY2F0ZSBpcyBub3QgcHJlc2VudC4KKyAgICBpZiAoU1NMX2dldF92ZXJpZnlfbW9kZShzc2wpICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oCisgICAgICAgICJBdXRob3JpemU6IFJlcXVpcmVkIGNlcnRpZmljYXRlIG5vdCBwcmVzZW50LiIpOworICAgIH0KKworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gYWNjZXNzIG1hbmFnZXIgc2V0LCB3ZSBkb24ndCBpbnRlbmQgdG8gYXV0aG9yaXplCisgICAgLy8gdGhlIGNsaWVudCwgc28gZXZlcnl0aGluZydzIGZpbmUuCisgICAgaWYgKGFjY2Vzc01hbmFnZXIpIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKAorICAgICAgICAiQXV0aG9yaXplOiBDZXJ0aWZpY2F0ZSByZXF1aXJlZCBmb3IgYXV0aG9yaXphdGlvbi4iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFjY2Vzc01hbmFnZXIgaXMgbnVsbCkgeworICAgIC8vIE5vIGFjY2VzcyBtYW5hZ2VyIHNldCwgY2FuIHJldHVybiBpbW1lZGlhdGVseSBhcyB0aGUgY2VydCBpcyB2YWxpZAorICAgIC8vIGFuZCBhbGwgcGVlcnMgYXJlIGF1dGhvcml6ZWQuCisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGJvdGggY2VydGlmaWNhdGUgYW5kIGFjY2VzcyBtYW5hZ2VyIGFyZSBwcmVzZW50CisgIGF1dG8gZGVjaXNpb24gPSBhY2Nlc3NNYW5hZ2VyLnZlcmlmeShwZWVyQWRkcmVzcyk7CisKKyAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLlNLSVApIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLkFMTE9XKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiQXV0aG9yaXplOiBBY2Nlc3MgZGVuaWVkIGJhc2VkIG9uIHJlbW90ZSBJUC4iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2hlY2sgc3ViamVjdEFsdE5hbWUocyksIGlmIHByZXNlbnQuCisgIGF1dG8gYWx0ZXJuYXRpdmVzID0gY2FzdChTVEFDS19PRiEoR0VORVJBTF9OQU1FKSopCisgICAgWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgbnVsbCwgbnVsbCk7CisgIGlmIChhbHRlcm5hdGl2ZXMgIT0gbnVsbCkgeworICAgIGF1dG8gY291bnQgPSBza19HRU5FUkFMX05BTUVfbnVtKGFsdGVybmF0aXZlcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGRlY2lzaW9uID09IERlY2lzaW9uLlNLSVAgJiYgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGF1dG8gbmFtZSA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShhbHRlcm5hdGl2ZXMsIGkpOworICAgICAgaWYgKG5hbWUgaXMgbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGF1dG8gZGF0YSA9IEFTTjFfU1RSSU5HX2RhdGEobmFtZS5kLmlhNSk7CisgICAgICBhdXRvIGxlbmd0aCA9IEFTTjFfU1RSSU5HX2xlbmd0aChuYW1lLmQuaWE1KTsKKyAgICAgIHN3aXRjaCAobmFtZS50eXBlKSB7CisgICAgICAgIGNhc2UgR0VORVJBTF9OQU1FLkdFTl9ETlM6CisgICAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NNYW5hZ2VyLnZlcmlmeShob3N0TmFtZSwgY2FzdChjaGFyW10pZGF0YVswIC4uIGxlbmd0aF0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdFTkVSQUxfTkFNRS5HRU5fSVBBREQ6CisgICAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NNYW5hZ2VyLnZlcmlmeShwZWVyQWRkcmVzcywgZGF0YVswIC4uIGxlbmd0aF0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICB9CisgICAgfQorCisgICAgLy8gRE1EIEBAQlVHQEA6IEVtcHR5IHRlbXBsYXRlIGFyZ3VtZW50cyBwYXJlbnMgc2hvdWxkIG5vdCBiZSBuZWVkZWQuCisgICAgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlISgpKGFsdGVybmF0aXZlcywgJkdFTkVSQUxfTkFNRV9mcmVlKTsKKyAgfQorCisgIC8vIElmIHdlIGFyZSBhbHJlZHkgZG9uZSwgcmV0dXJuLgorICBpZiAoZGVjaXNpb24gIT0gRGVjaXNpb24uU0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gRGVjaXNpb24uQUxMT1cpIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJBdXRob3JpemU6IEFjY2VzcyBkZW5pZWQuIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIENoZWNrIGNvbW1vbk5hbWUuCisgIGF1dG8gbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KTsKKyAgaWYgKG5hbWUgIWlzIG51bGwpIHsKKyAgICBYNTA5X05BTUVfRU5UUlkqIGVudHJ5OworICAgIGNoYXIqIHV0Zjg7CisgICAgaW50IGxhc3QgPSAtMTsKKyAgICB3aGlsZSAoZGVjaXNpb24gPT0gRGVjaXNpb24uU0tJUCkgeworICAgICAgbGFzdCA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCBsYXN0KTsKKyAgICAgIGlmIChsYXN0ID09IC0xKQorICAgICAgICBicmVhazsKKyAgICAgIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBsYXN0KTsKKyAgICAgIGlmIChlbnRyeSBpcyBudWxsKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGF1dG8gY29tbW9uID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGF1dG8gc2l6ZSA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnV0ZjgsIGNvbW1vbik7CisgICAgICBkZWNpc2lvbiA9IGFjY2Vzc01hbmFnZXIudmVyaWZ5KGhvc3ROYW1lLCB1dGY4WzAgLi4gc2l6ZV0pOworICAgICAgQ1JZUFRPX2ZyZWUodXRmOCk7CisgICAgfQorICB9CisgIFg1MDlfZnJlZShjZXJ0KTsKKyAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLkFMTE9XKSB7CisgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIkF1dGhvcml6ZTogQ291bGQgbm90IGF1dGhvcml6ZSBwZWVyLiIpOworICB9Cit9CisKKy8qCisgKiBPcGVuU1NMIGVycm9yIGluZm9ybWF0aW9uIHVzZWQgZm9yIHN0b3JpbmcgRCBleGNlcHRpb25zIG9uIHRoZSBPcGVuU1NMCisgKiBlcnJvciBzdGFjay4KKyAqLworZW51bSBFUlJfTElCX0RfRVhDRVBUSU9OID0gRVJSX0xJQl9VU0VSOworZW51bSBFUlJfRl9EX0VYQ0VQVElPTiA9IDA7IC8vIGZ1bmN0aW9uIGlkIC0gd2hhdCB0byB1c2UgaGVyZT8KK2VudW0gRVJSX1JfRF9FWENFUFRJT04gPSAxMjM0OyAvLyA5OSBhbmQgYWJvdmUgYXJlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbnMKK2VudW0gRVJSX0ZJTEVfRF9FWENFUFRJT04gPSAiZF9leGNlcHRpb24iOworZW51bSBFUlJfTElORV9EX0VYQ0VQVElPTiA9IDA7CitlbnVtIEVSUl9GTEFHU19EX0VYQ0VQVElPTiA9IDA7CisKKy8qKgorICogUmV0dXJucyBhbiBleGNlcHRpb24gZm9yIHRoZSBsYXN0LgorICoKKyAqIFBhcmFtczoKKyAqICAgbG9jYXRpb24gPSBBbiBvcHRpb25hbCAibG9jYXRpb24iIHRvIGFkZCB0byB0aGUgZXJyb3IgbWVzc2FnZSAodHlwaWNhbGx5CisgKiAgICAgdGhlIGxhc3QgU1NMIEFQSSBjYWxsKS4KKyAqLworRXhjZXB0aW9uIGdldFNTTEV4Y2VwdGlvbihzdHJpbmcgbG9jYXRpb24gPSBudWxsLCBzdHJpbmcgY2xpZW50RmlsZSA9IF9fRklMRV9fLAorICBzaXplX3QgY2xpZW50TGluZSA9IF9fTElORV9fCispIHsKKyAgLy8gV2UgY2FuIHJldHVybiBlaXRoZXIgYW4gZXhjZXB0aW9uIHNhdmVkIGZyb20gRCBCSU8gY29kZSwgb3IgYSAidHJ1ZSIKKyAgLy8gT3BlblNTTCBlcnJvci4gQmVjYXVzZSB0aGVyZSBjYW4gcG9zc2libHkgYmUgbW9yZSB0aGFuIG9uZSBlcnJvciBvbiB0aGUKKyAgLy8gZXJyb3Igc3RhY2ssIHdlIGhhdmUgdG8gZmV0Y2ggYWxsIG9mIHRoZW0sIGFuZCBwaWNrIHRoZSBsYXN0LCBpLmUuIG5ld2VzdAorICAvLyBvbmUuIFdlIGNvbmNhdGVuYXRlIG11bHRpcGxlIHN1Y2Nlc3NpdmUgT3BlblNTTCBlcnJvciBtZXNzYWdlcyBpbnRvIGEKKyAgLy8gc2luZ2xlIG9uZSwgYnV0IGFsd2F5cyBqdXN0IHJldHVybiB0aGUgbGFzdCBEIGV4cGNldGlvbi4KKyAgc3RyaW5nIG1lc3NhZ2U7IC8vIFByb2JhYmx5IGJldHRlciB1c2UgYW4gQXBwZW5kZXIgaGVyZS4KKyAgYm9vbCBoYWRNZXNzYWdlOworICBFeGNlcHRpb24gZXhjZXB0aW9uOworCisgIHZvaWQgaW5pdE1lc3NhZ2UoKSB7CisgICAgbWVzc2FnZS5kZXN0cm95KCk7CisgICAgaGFkTWVzc2FnZSA9IGZhbHNlOworICAgIGlmICghbG9jYXRpb24uZW1wdHkpIHsKKyAgICAgIG1lc3NhZ2Ugfj0gbG9jYXRpb247CisgICAgICBtZXNzYWdlIH49ICI6ICI7CisgICAgfQorICB9CisgIGluaXRNZXNzYWdlKCk7CisKKyAgYXV0byBlcnJuID0gZXJybm87CisKKyAgY29uc3QoY2hhcikqIGZpbGUgPSB2b2lkOworICBpbnQgbGluZSA9IHZvaWQ7CisgIGNvbnN0KGNoYXIpKiBkYXRhID0gdm9pZDsKKyAgaW50IGZsYWdzID0gdm9pZDsKKyAgY191bG9uZyBjb2RlID0gdm9pZDsKKyAgd2hpbGUgKChjb2RlID0gRVJSX2dldF9lcnJvcl9saW5lX2RhdGEoJmZpbGUsICZsaW5lLCAmZGF0YSwgJmZsYWdzKSkgIT0gMCkgeworICAgIGlmIChFUlJfR0VUX1JFQVNPTihjb2RlKSA9PSBFUlJfUl9EX0VYQ0VQVElPTikgeworICAgICAgaW5pdE1lc3NhZ2UoKTsKKyAgICAgIEdDLnJlbW92ZVJvb3QoY2FzdCh2b2lkKilkYXRhKTsKKyAgICAgIGV4Y2VwdGlvbiA9IGNhc3QoRXhjZXB0aW9uKWRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAgIGlmIChoYWRNZXNzYWdlKSB7CisgICAgICAgIG1lc3NhZ2Ugfj0gIiwgIjsKKyAgICAgIH0KKworICAgICAgYXV0byByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhjb2RlKTsKKyAgICAgIGlmIChyZWFzb24pIHsKKyAgICAgICAgbWVzc2FnZSB+PSAiU1NMIGVycm9yOiAiIH4gdG8hc3RyaW5nKHJlYXNvbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXNzYWdlIH49ICJTU0wgZXJyb3IgIyIgfiB0byFzdHJpbmcoY29kZSk7CisgICAgICB9CisKKyAgICAgIGhhZE1lc3NhZ2UgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBsYXN0IGl0ZW0gZnJvbSB0aGUgc3RhY2sgd2FzIGEgRCBleGNlcHRpb24sIHRocm93IGl0LgorICBpZiAoZXhjZXB0aW9uKSByZXR1cm4gZXhjZXB0aW9uOworCisgIC8vIFdlIGFyZSBkZWFsaW5nIHdpdGggYW4gT3BlblNTTCBlcnJvciB0aGF0IGRvZXNuJ3Qgcm9vdCBpbiBhIEQgZXhjZXB0aW9uLgorICBpZiAoIWhhZE1lc3NhZ2UpIHsKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgZ2V0IGFuIGFjdHVhbCBlcnJvciBmcm9tIHRoZSBzdGFjayB5ZXQsIHRyeSBlcnJuby4KKyAgICBzdHJpbmcgZXJyblN0cmluZzsKKyAgICBpZiAoZXJybiAhPSAwKSB7CisgICAgICBlcnJuU3RyaW5nID0gdG8hc3RyaW5nKHN0cmVycm9yKGVycm4pKTsKKyAgICB9CisgICAgaWYgKGVycm5TdHJpbmcuZW1wdHkpIHsKKyAgICAgIG1lc3NhZ2Ugfj0gIlVua25vd24gZXJyb3IiOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlIH49IGVycm5TdHJpbmc7CisgICAgfQorICB9CisKKyAgbWVzc2FnZSB+PSAiLiI7CisgIHJldHVybiBuZXcgVFNTTEV4Y2VwdGlvbihtZXNzYWdlLCBjbGllbnRGaWxlLCBjbGllbnRMaW5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4NTAyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUHJvdmlkZXMgYSBTU0wgQklPIGltcGxlbWVudGF0aW9uIHdyYXBwaW5nIGEgVGhyaWZ0IHRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIHdheSwgU1NMIEkvTyBjYW4gYmUgcmVsYXllZCBvdmVyIFRocmlmdCB0cmFuc3BvcnQgd2l0aG91dCBpbnRyb2R1Y2luZworICogYW4gYWRkaXRpb25hbCBsYXllciBvZiBidWZmZXJpbmcsIGVzcGVjaWFsbHkgZm9yIHRoZSBub24tYmxvY2tpbmcKKyAqIHRyYW5zcG9ydHMuCisgKgorICogRm9yIHRoZSBUaHJpZnQgdHJhbnNwb3J0IGluY2FybmF0aW9ucyBvZiB0aGUgU1NMIGVudGl0aWVzLCAidHQiIGlzIHVzZWQgYXMKKyAqIHByZWZpeCBmb3IgY2xhcml0eS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5zc2xfYmlvOworCitpbXBvcnQgY29yZS5zdGRjLmNvbmZpZzsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RybGVuOworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuYmlvOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBDcmVhdGVzIGFuIFNTTCBCSU8gb2JqZWN0IHdyYXBwaW5nIHRoZSBnaXZlbiB0cmFuc3BvcnQuCisgKgorICogRXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHRyYW5zcG9ydCBhcmUgcHVzaGVkIG9udG8gdGhlIE9wZW5TU0wgZXJyb3Igc3RhY2ssCisgKiB1c2luZyB0aGUgbG9jYXRpb24vcmVhc29uIHZhbHVlcyBmcm9tIHRocmlmdC5pbnRlcm5hbC5zc2wuRVJSXypfRF9FWENFUFRJT04uCisgKgorICogVGhlIHRyYW5zcG9ydCBpcyBhc3N1bWVkIHRvIGJlIHJlYWR5IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHdoZW4gdGhlIEJJTworICogZnVuY3Rpb25zIGFyZSBjYWxsZWQsIGl0IGlzIG5vdCBvcGVuZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFBhcmFtczoKKyAqICAgdHJhbnNwb3J0ID0gVGhlIHRyYW5zcG9ydCB0byB3cmFwLgorICogICBjbG9zZVRyYW5zcG9ydCA9IFdoZXRoZXIgdGhlIGNsb3NlIHRoZSB0cmFuc3BvcnQgd2hlbiB0aGUgU1NMIEJJTyBpcworICogICAgIGNsb3NlZC4KKyAqLworQklPKiBjcmVhdGVUVHJhbnNwb3J0QklPKFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBib29sIGNsb3NlVHJhbnNwb3J0KSB7CisgIGF1dG8gcmVzdWx0ID0gQklPX25ldyhjYXN0KEJJT19NRVRIT0QqKSZ0dEJpb01ldGhvZCk7CisgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDsKKworICBHQy5hZGRSb290KGNhc3Qodm9pZCopdHJhbnNwb3J0KTsKKyAgQklPX3NldF9mZChyZXN1bHQsIGNsb3NlVHJhbnNwb3J0LCBjYXN0KGNfbG9uZyljYXN0KHZvaWQqKXRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworcHJpdmF0ZSB7CisgIC8vIEhlbHBlciB0byBnZXQgdGhlIFRocmlmdCB0cmFuc3BvcnQgYXNzaWduZWQgd2l0aCB0aGUgZ2l2ZW4gQklPLgorICBUVHJhbnNwb3J0IHRyYW5zKEJJTyogYikgbm90aHJvdyB7CisgICAgYXV0byByZXN1bHQgPSBjYXN0KFRUcmFuc3BvcnQpYi5wdHI7CisgICAgYXNzZXJ0KHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHZvaWQgc2V0RXJyb3IoRXhjZXB0aW9uIGUpIG5vdGhyb3cgeworICAgIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl9EX0VYQ0VQVElPTiwgRVJSX0ZfRF9FWENFUFRJT04sIEVSUl9SX0RfRVhDRVBUSU9OLAorICAgICAgRVJSX0ZJTEVfRF9FWENFUFRJT04sIEVSUl9MSU5FX0RfRVhDRVBUSU9OKTsKKyAgICB0cnkgeyBHQy5hZGRSb290KGNhc3Qodm9pZCopZSk7IH0gY2F0Y2ggKFRocm93YWJsZSkge30KKyAgICBFUlJfc2V0X2Vycm9yX2RhdGEoY2FzdChjaGFyKillLCBFUlJfRkxBR1NfRF9FWENFUFRJT04pOworICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dFdyaXRlKEJJTyogYiwgY29uc3QoY2hhcikqIGRhdGEsIGludCBsZW5ndGgpIG5vdGhyb3cgeworICAgIGFzc2VydChiKTsKKyAgICBpZiAoIWRhdGEgfHwgbGVuZ3RoIDw9IDApIHJldHVybiAwOworICAgIHRyeSB7CisgICAgICB0cmFucyhiKS53cml0ZSgoY2FzdCh1Ynl0ZSopZGF0YSlbMCAuLiBsZW5ndGhdKTsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHNldEVycm9yKGUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHRSZWFkKEJJTyogYiwgY2hhciogZGF0YSwgaW50IGxlbmd0aCkgbm90aHJvdyB7CisgICAgYXNzZXJ0KGIpOworICAgIGlmICghZGF0YSB8fCBsZW5ndGggPD0gMCkgcmV0dXJuIDA7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBjYXN0KGludCl0cmFucyhiKS5yZWFkKChjYXN0KHVieXRlKilkYXRhKVswIC4uIGxlbmd0aF0pOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzZXRFcnJvcihlKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBleHRlcm4oQykgaW50IHR0UHV0cyhCSU8qIGIsIGNvbnN0KGNoYXIpKiBzdHIpIG5vdGhyb3cgeworICAgIHJldHVybiB0dFdyaXRlKGIsIHN0ciwgY2FzdChpbnQpc3RybGVuKHN0cikpOworICB9CisKKyAgZXh0ZXJuKEMpIGNfbG9uZyB0dEN0cmwoQklPKiBiLCBpbnQgY21kLCBjX2xvbmcgbnVtLCB2b2lkKiBwdHIpIG5vdGhyb3cgeworICAgIGFzc2VydChiKTsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICBjYXNlIEJJT19DX1NFVF9GRDoKKyAgICAgICAgLy8gTm90ZSB0aGF0IGNsb3NlIGZsYWcgYW5kICJmZCIgYXJlIGFjdHVhbGx5IHJldmVyc2VkIGhlcmUgYmVjYXVzZSB3ZQorICAgICAgICAvLyBuZWVkIDY0IGJpdCB3aWR0aCBmb3IgdGhlIHBvaW50ZXIg4oCTIHNob3VsZCBwcm9iYWJseSBkcm9wIEJJT19zZXRfZmQKKyAgICAgICAgLy8gYWx0b2dldGhlci4KKyAgICAgICAgdHREZXN0cm95KGIpOworICAgICAgICBiLnB0ciA9IGNhc3Qodm9pZCopbnVtOworICAgICAgICBiLnNodXRkb3duID0gY2FzdChpbnQpcHRyOworICAgICAgICBiLmluaXRfID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBjYXNlIEJJT19DX0dFVF9GRDoKKyAgICAgICAgaWYgKCFiLmluaXRfKSByZXR1cm4gLTE7CisgICAgICAgICooY2FzdCh2b2lkKiopcHRyKSA9IGIucHRyOworICAgICAgICByZXR1cm4gY2FzdChjX2xvbmcpYi5wdHI7CisgICAgICBjYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKyAgICAgICAgcmV0dXJuIGIuc2h1dGRvd247CisgICAgICBjYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKyAgICAgICAgYi5zaHV0ZG93biA9IGNhc3QoaW50KW51bTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBjYXNlIEJJT19DVFJMX0ZMVVNIOgorICAgICAgICB0cnkgeworICAgICAgICAgIHRyYW5zKGIpLmZsdXNoKCk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgc2V0RXJyb3IoZSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBjYXNlIEJJT19DVFJMX0RVUDoKKyAgICAgICAgLy8gU2VlbXMgbGlrZSB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gb24gZHVwbGljYXRpb24sIGJ1dCBjb3VsZG4ndCBmaW5kCisgICAgICAgIC8vIGFueSBkb2N1bWVudGF0aW9uIGlmIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW5zIGR1cmluZyBub3JtYWwgU1NMCisgICAgICAgIC8vIHVzYWdlLgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHRDcmVhdGUoQklPKiBiKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisgICAgYi5pbml0XyA9IDA7CisgICAgYi5udW0gPSAwOyAvLyBVc2VyLWRlZmluZWQgbnVtYmVyIGZpZWxkLCB1bnVzZWQgaGVyZS4KKyAgICBiLnB0ciA9IG51bGw7CisgICAgYi5mbGFncyA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBleHRlcm4oQykgaW50IHR0RGVzdHJveShCSU8qIGIpIG5vdGhyb3cgeworICAgIGlmICghYikgcmV0dXJuIDA7CisKKyAgICBpbnQgcmMgPSAxOworICAgIGlmIChiLnNodXRkb3duKSB7CisgICAgICBpZiAoYi5pbml0XykgeworICAgICAgICB0cnkgeworICAgICAgICAgIHRyYW5zKGIpLmNsb3NlKCk7CisgICAgICAgICAgR0MucmVtb3ZlUm9vdChjYXN0KHZvaWQqKXRyYW5zKGIpKTsKKyAgICAgICAgICBiLnB0ciA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgc2V0RXJyb3IoZSk7CisgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYi5pbml0XyA9IDA7CisgICAgICBiLmZsYWdzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBpbW11dGFibGUgQklPX01FVEhPRCB0dEJpb01ldGhvZCA9IHsKKyAgICBCSU9fVFlQRV9TT1VSQ0VfU0lOSywKKyAgICAiVFRyYW5zcG9ydCIsCisgICAgJnR0V3JpdGUsCisgICAgJnR0UmVhZCwKKyAgICAmdHRQdXRzLAorICAgIG51bGwsIC8vIGdldHMKKyAgICAmdHRDdHJsLAorICAgICZ0dENyZWF0ZSwKKyAgICAmdHREZXN0cm95LAorICAgIG51bGwgLy8gY2FsbGJhY2tfY3RybAorICB9OworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3Byb3RvY29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3QvcHJvdG9jb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI1MTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3Byb3RvY29sLmQKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKKworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisKK3ZlcnNpb24gKHVuaXR0ZXN0KToKKwordm9pZCB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0KFByb3RvY29sKSgpIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICBhdXRvIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHByb3QgPSBuZXcgUHJvdG9jb2woYnVmZmVyKTsKKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyBmYWlscyBpZiBhIGNvbnRhaW5lciBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBsaW1pdCBpcyByZWFkLgorICBwcm90LmNvbnRhaW5lclNpemVMaW1pdCA9IDM7CisKKyAgeworICAgIHByb3Qud3JpdGVMaXN0QmVnaW4oVExpc3QoVFR5cGUuSTMyLCA0KSk7CisgICAgcHJvdC53cml0ZUkzMigwKTsgLy8gTWFrZSBzdXJlIHNpemUgY2FuIGJlIHJlYWQgZS5nLiBmb3IgSlNPTiBwcm90b2NvbC4KKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZExpc3RCZWdpbigpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIHsKKyAgICBwcm90LndyaXRlTWFwQmVnaW4oVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgNCkpOworICAgIHByb3Qud3JpdGVJMzIoMCk7IC8vIE1ha2Ugc3VyZSBzaXplIGNhbiBiZSByZWFkIGUuZy4gZm9yIEpTT04gcHJvdG9jb2wuCisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRNYXBCZWdpbigpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIHsKKyAgICBwcm90LndyaXRlU2V0QmVnaW4oVFNldChUVHlwZS5JMzIsIDQpKTsKKyAgICBwcm90LndyaXRlSTMyKDApOyAvLyBNYWtlIHN1cmUgc2l6ZSBjYW4gYmUgcmVhZCBlLmcuIGZvciBKU09OIHByb3RvY29sLgorICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkU2V0QmVnaW4oKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyB3b3JrcyBpZiB0aGUgY29udGFpbmVycyBhcmUgc21hbGxlciB0aGFuIHRoZSBsaW1pdCBvcgorICAvLyBubyBsaW1pdCBpcyBzZXQuCisgIGZvcmVhY2ggKGxpbWl0OyBbMywgMCwgLTFdKSB7CisgICAgcHJvdC5jb250YWluZXJTaXplTGltaXQgPSBsaW1pdDsKKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVMaXN0QmVnaW4oVExpc3QoVFR5cGUuSTMyLCAyKSk7CisgICAgICBwcm90LndyaXRlSTMyKDApOworICAgICAgcHJvdC53cml0ZUkzMigxKTsKKyAgICAgIHByb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGF1dG8gbGlzdCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgZW5mb3JjZShsaXN0LmVsZW1UeXBlID09IFRUeXBlLkkzMik7CisgICAgICBlbmZvcmNlKGxpc3Quc2l6ZSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMCk7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDEpOworICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworCisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBwcm90LndyaXRlTWFwQmVnaW4oVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMikpOworICAgICAgcHJvdC53cml0ZUkzMigwKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMSk7CisgICAgICBwcm90LndyaXRlSTMyKDIpOworICAgICAgcHJvdC53cml0ZUkzMigzKTsKKyAgICAgIHByb3Qud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgYXV0byBtYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgZW5mb3JjZShtYXAua2V5VHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShtYXAudmFsdWVUeXBlID09IFRUeXBlLkkzMik7CisgICAgICBlbmZvcmNlKG1hcC5zaXplID09IDIpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAwKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMSk7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDIpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAzKTsKKyAgICAgIHByb3QucmVhZE1hcEVuZCgpOworCisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBwcm90LndyaXRlU2V0QmVnaW4oVFNldChUVHlwZS5JMzIsIDIpKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMCk7CisgICAgICBwcm90LndyaXRlSTMyKDEpOworICAgICAgcHJvdC53cml0ZVNldEVuZCgpOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBhdXRvIHNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICBlbmZvcmNlKHNldC5lbGVtVHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShzZXQuc2l6ZSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMCk7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDEpOworICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RTdHJpbmdTaXplTGltaXQoUHJvdG9jb2wpKCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKSB7CisgIGF1dG8gYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gcHJvdCA9IG5ldyBQcm90b2NvbChidWZmZXIpOworCisgIC8vIE1ha2Ugc3VyZSByZWFkaW5nIGZhaWxzIGlmIGEgc3RyaW5nIGxhcmdlciB0aGFuIHRoZSBzaXplIGxpbWl0IGlzIHJlYWQuCisgIHByb3Quc3RyaW5nU2l6ZUxpbWl0ID0gMzsKKworICB7CisgICAgcHJvdC53cml0ZVN0cmluZygiYXNkZiIpOworICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkU3RyaW5nKCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgeworICAgIHByb3Qud3JpdGVCaW5hcnkoWzEsIDIsIDMsIDRdKTsKKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZEJpbmFyeSgpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSByZWFkaW5nIHdvcmtzIGlmIHRoZSBjb250YWluZXJzIGFyZSBzbWFsbGVyIHRoYW4gdGhlIGxpbWl0IG9yCisgIC8vIG5vIGxpbWl0IGlzIHNldC4KKyAgZm9yZWFjaCAobGltaXQ7IFszLCAwLCAtMV0pIHsKKyAgICBwcm90LmNvbnRhaW5lclNpemVMaW1pdCA9IGxpbWl0OworCisgICAgeworICAgICAgcHJvdC53cml0ZVN0cmluZygiYXMiKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgZW5mb3JjZShwcm90LnJlYWRTdHJpbmcoKSA9PSAiYXMiKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVCaW5hcnkoWzEsIDJdKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgZW5mb3JjZShwcm90LnJlYWRCaW5hcnkoKSA9PSBbMSwgMl0pOworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ZTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5kYXRldGltZTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQudHlwZWNvbnMgOiBXaGl0ZUhvbGU7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKK3ZlcnNpb24odW5pdHRlc3QpOgorCisvKioKKyAqIFRlc3RzIGlmIHNlcnZpbmcgaXMgc3RvcHBlZCBjb3JyZWN0bHkgaWYgdGhlIGNhbmNlbGxhdGlvbiBwYXNzZWQgdG8gc2VydmUoKQorICogaXMgdHJpZ2dlcmVkLgorICoKKyAqIEJlY2F1c2UgdGhlIHRlc3RzIGFyZSBydW4gbWFueSB0aW1lcyBpbiBhIGxvb3AsIHRoaXMgaXMgaW5kaXJlY3RseSBhbHNvIGEKKyAqIHRlc3Qgd2hldGhlciBzb2NrZXQsIGV0Yy4gaGFuZGxlcyBhcmUgY2xlYW5lZCB1cCBjb3JyZWN0bHksIGJlY2F1c2UgdGhlCisgKiBhcHBsaWNhdGlvbiB3aWxsIGxpa2VseSBydW4gb3V0IG9mIGhhbmRsZXMgb3RoZXJ3aXNlLgorICovCit2b2lkIHRlc3RTZXJ2ZUNhbmNlbChTZXJ2ZXIpKHZvaWQgZGVsZWdhdGUoU2VydmVyKSBzZXJ2ZXJTZXR1cCA9IG51bGwpIGlmICgKKyAgaXMoU2VydmVyIDogVFNlcnZlcikKKykgeworICBhdXRvIHByb2MgPSBuZXcgV2hpdGVIb2xlIVRQcm9jZXNzb3I7CisgIGF1dG8gdGYgPSBuZXcgVFRyYW5zcG9ydEZhY3Rvcnk7CisgIGF1dG8gcGYgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsKKworICAvLyBOZWVkIGEgc3BlY2lhbCBjYXNlIGZvciBUTm9uYmxvY2tpbmdTZXJ2ZXIgd2hpY2ggZG9lc24ndCB1c2UKKyAgLy8gVFNlcnZlclRyYW5zcG9ydC4KKyAgc3RhdGljIGlmIChfX3RyYWl0cyhjb21waWxlcywgbmV3IFNlcnZlcihwcm9jLCAwLCB0ZiwgcGYpKSkgeworICAgIGF1dG8gc2VydmVyID0gbmV3IFNlcnZlcihwcm9jLCAwLCB0ZiwgcGYpOworICB9IGVsc2UgeworICAgIGF1dG8gc2VydmVyID0gbmV3IFNlcnZlcihwcm9jLCBuZXcgVFNlcnZlclNvY2tldCgwKSwgdGYsIHBmKTsKKyAgfQorCisgIC8vIE9uIFdpbmRvd3MsIHdlIHVzZSBUQ1Agc29ja2V0cyB0byByZXBsYWNlIHNvY2tldHBhaXIoKS4gU2luY2UgdGhleSBzdGF5CisgIC8vIGluIFRJTUVfV0FJVCBmb3Igc29tZSB0aW1lIGV2ZW4gaWYgdGhleSBhcmUgcHJvcGVybHkgY2xvc2VkLCB3ZSBoYXZlIHRvIHVzZQorICAvLyBhIGxvd2VyIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHBvcnRzL2J1ZmZlciBzcGFjZS4KKyAgdmVyc2lvbiAoV2luZG93cykgeworICAgIGVudW0gSVRFUkFUSU9OUyA9IDEwMDsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIElURVJBVElPTlMgPSAxMDAwMDsKKyAgfQorCisgIGlmIChzZXJ2ZXJTZXR1cCkgc2VydmVyU2V0dXAoc2VydmVyKTsKKworICBhdXRvIHNlcnZpbmdNdXRleCA9IG5ldyBNdXRleDsKKyAgYXV0byBzZXJ2aW5nQ29uZGl0aW9uID0gbmV3IENvbmRpdGlvbihzZXJ2aW5nTXV0ZXgpOworICBhdXRvIGRvbmVNdXRleCA9IG5ldyBNdXRleDsKKyAgYXV0byBkb25lQ29uZGl0aW9uID0gbmV3IENvbmRpdGlvbihkb25lTXV0ZXgpOworCisgIGNsYXNzIENhbmNlbGxpbmdIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgICAgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc2VydmluZ011dGV4KSB7CisgICAgICAgIHNlcnZpbmdDb25kaXRpb24ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorICAgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsgcmV0dXJuIFZhcmlhbnQuaW5pdDsgfQorICAgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkge30KKyAgICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKyAgfQorICBzZXJ2ZXIuZXZlbnRIYW5kbGVyID0gbmV3IENhbmNlbGxpbmdIYW5kbGVyOworCisgIGZvcmVhY2ggKGk7IDAgLi4gSVRFUkFUSU9OUykgeworICAgIHN5bmNocm9uaXplZCAoc2VydmluZ011dGV4KSB7CisgICAgICBhdXRvIGNhbmNlbCA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgICAgYXV0byBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKHsKKyAgICAgICAgICBzZXJ2ZXIuc2VydmUoY2FuY2VsKTsKKyAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgeworICAgICAgICAgICAgZG9uZUNvbmRpdGlvbi5ub3RpZnlBbGwoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZXJ2ZXJUaHJlYWQuaXNEYWVtb24gPSB0cnVlOworICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgICAgICBzZXJ2aW5nQ29uZGl0aW9uLndhaXQoKTsKKworICAgICAgICBjYW5jZWwudHJpZ2dlcigpOworICAgICAgICBlbmZvcmNlKGRvbmVDb25kaXRpb24ud2FpdChkdXIhIm1zZWNzIigzKjEwMDApKSk7CisgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3RyYWl0cy5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnRyYWl0czsKKworaW1wb3J0IHN0ZC50cmFpdHM7CisKKy8qKgorICogQWRkcyDCu25vdGhyb3fCqyB0byB0aGUgdHlwZSBvZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHBvaW50ZXIvZGVsZWdhdGUsIGlmIGl0CisgKiBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgorICoKKyAqIFRlY2huaWNhbGx5LCBhc3N1bWVOb3Rocm93IGp1c3QgcGVyZm9ybXMgYSBjYXN0LCBidXQgdXNpbmcgaXQgaGFzIHRoZQorICogYWR2YW50YWdlIG9mIGJlaW5nIGV4cGxpY2l0bHkgYWJvdXQgdGhlIG9wZXJhdGlvbiB0aGF0IGlzIHBlcmZvcm1lZC4KKyAqLworYXV0byBhc3N1bWVOb3Rocm93KFQpKFQgdCkgaWYgKGlzRnVuY3Rpb25Qb2ludGVyIVQgfHwgaXNEZWxlZ2F0ZSFUKSB7CisgIGVudW0gYXR0cnMgPSBmdW5jdGlvbkF0dHJpYnV0ZXMhVCB8IEZ1bmN0aW9uQXR0cmlidXRlLm5vdGhyb3dfOworICByZXR1cm4gY2FzdChTZXRGdW5jdGlvbkF0dHJpYnV0ZXMhKFQsIGZ1bmN0aW9uTGlua2FnZSFULCBhdHRycykpIHQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjQ4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2Jhc2UuZApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIERlZmluZXMgdGhlIGJhc2ljIGludGVyZmFjZSBmb3IgYSBUaHJpZnQgcHJvdG9jb2wgYW5kIGFzc29jaWF0ZWQgZXhjZXB0aW9uCisgKiB0eXBlcy4KKyAqCisgKiBNb3N0IHBhcnRzIG9mIHRoZSBwcm90b2NvbCBBUEkgYXJlIHR5cGljYWxseSBub3QgdXNlZCBpbiBjbGllbnQgY29kZSwgYXMKKyAqIHRoZSBhY3R1YWwgc2VyaWFsaXphdGlvbiBjb2RlIGlzIGdlbmVyYXRlZCBieSB0aHJpZnQuY29kZWdlbi4qIOKAkyB0aGUgb25seQorICogaW50ZXJlc3RpbmcgdGhpbmcgdXN1YWxseSBpcyB0aGF0IHRoZXJlIGFyZSBwcm90b2NvbHMgd2hpY2ggY2FuIGJlIGNyZWF0ZWQKKyAqIGZyb20gdHJhbnNwb3J0cyBhbmQgcGFzc2VkIGFyb3VuZC4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5iYXNlOworCitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIFRoZSBmaWVsZCB0eXBlcyBUaHJpZnQgcHJvdG9jb2xzIHN1cHBvcnQuCisgKi8KK2VudW0gVFR5cGUgOiBieXRlIHsKKyAgU1RPUCAgID0gMCwgLy8vIFVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgorICBWT0lEICAgPSAxLCAvLy8KKyAgQk9PTCAgID0gMiwgLy8vCisgIEJZVEUgICA9IDMsIC8vLworICBET1VCTEUgPSA0LCAvLy8KKyAgSTE2ICAgID0gNiwgLy8vCisgIEkzMiAgICA9IDgsIC8vLworICBJNjQgICAgPSAxMCwgLy8vCisgIFNUUklORyA9IDExLCAvLy8KKyAgU1RSVUNUID0gMTIsIC8vLworICBNQVAgICAgPSAxMywgLy8vCisgIFNFVCAgICA9IDE0LCAvLy8KKyAgTElTVCAgID0gMTUgLy8vCit9CisKKy8qKgorICogVHlwZXMgb2YgVGhyaWZ0IFJQQyBtZXNzYWdlcy4KKyAqLworZW51bSBUTWVzc2FnZVR5cGUgOiBieXRlIHsKKyAgQ0FMTCA9IDEsIC8vLyBDYWxsIG9mIGEgbm9ybWFsLCB0d28td2F5IFJQQyBtZXRob2QuCisgIFJFUExZID0gMiwgLy8vIFJlcGx5IHRvIGEgbm9ybWFsIG1ldGhvZCBjYWxsLgorICBFWENFUFRJT04gPSAzLCAvLy8gUmVwbHkgdG8gYSBtZXRob2QgY2FsbCBpZiB0YXJnZXQgcmFpc2VkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICBPTkVXQVkgPSA0IC8vLyBDYWxsIG9mIGEgb25lLXdheSBSUEMgbWV0aG9kIHdoaWNoIGlzIG5vdCBmb2xsb3dlZCBieSBhIHJlcGx5LgorfQorCisvKioKKyAqIERlc2NyaXB0aW9ucyBvZiBUaHJpZnQgZW50aXRpZXMuCisgKi8KK3N0cnVjdCBURmllbGQgeworICBzdHJpbmcgbmFtZTsKKyAgVFR5cGUgdHlwZTsKKyAgc2hvcnQgaWQ7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRMaXN0IHsKKyAgVFR5cGUgZWxlbVR5cGU7CisgIHNpemVfdCBzaXplOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUTWFwIHsKKyAgVFR5cGUga2V5VHlwZTsKKyAgVFR5cGUgdmFsdWVUeXBlOworICBzaXplX3Qgc2l6ZTsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVE1lc3NhZ2UgeworICBzdHJpbmcgbmFtZTsKKyAgVE1lc3NhZ2VUeXBlIHR5cGU7CisgIGludCBzZXFpZDsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVFNldCB7CisgIFRUeXBlIGVsZW1UeXBlOworICBzaXplX3Qgc2l6ZTsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVFN0cnVjdCB7CisgIHN0cmluZyBuYW1lOworfQorCisvKioKKyAqIEludGVyZmFjZSBmb3IgYSBUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uIEVzc2VudGlhbGx5LCBpdCBkZWZpbmVzCisgKiBhIHdheSBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGFsbCB0aGUgYmFzZSB0eXBlcywgcGx1cyBhIG1lY2hhbmlzbSBmb3IKKyAqIHdyaXRpbmcgb3V0IHN0cnVjdHMgd2l0aCBpbmRleGVkIGZpZWxkcy4KKyAqCisgKiBUUHJvdG9jb2wgb2JqZWN0cyBzaG91bGQgbm90IGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgZW5jb2RpbmcgY29udGV4dHMsCisgKiBhcyB0aGV5IG1heSBuZWVkIHRvIG1haW50YWluIGludGVybmFsIHN0YXRlIGluIHNvbWUgcHJvdG9jb2xzIChlLmcuIEpTT04pLgorICogTm90ZSB0aGF0IGlzIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBUUHJvdG9jb2wgbW9kdWxlIHRvIGRvIGl0cyBvd24gaW50ZXJuYWwKKyAqIGJ1ZmZlcmVkIHJlYWRzL3dyaXRlcyB0byB0aGUgdW5kZXJseWluZyBUVHJhbnNwb3J0IHdoZXJlIGFwcHJvcHJpYXRlIChpLmUuCisgKiB3aGVuIHBhcnNpbmcgYW4gaW5wdXQgWE1MIHN0cmVhbSwgcmVhZGluZyBjb3VsZCBiZSBiYXRjaGVkIHJhdGhlciB0aGFuCisgKiBsb29raW5nIGFoZWFkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgZm9yIGEgY2xvc2UgdGFnKS4KKyAqLworaW50ZXJmYWNlIFRQcm90b2NvbCB7CisgIC8vLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBieSB0aGUgcHJvdG9jb2wuCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5OworCisgIC8qCisgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKTsgLy8vCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYik7IC8vLworICB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNik7IC8vLworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpOyAvLy8KKyAgdm9pZCB3cml0ZUk2NChsb25nIGk2NCk7IC8vLworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpOyAvLy8KKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKTsgLy8vCisgIHZvaWQgd3JpdGVCaW5hcnkodWJ5dGVbXSBidWYpOyAvLy8KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOyAvLy8KKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRzdHJ1Y3QpOyAvLy8KKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKTsgLy8vCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpOyAvLy8KKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsgLy8vCisgIHZvaWQgd3JpdGVMaXN0RW5kKCk7IC8vLworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOyAvLy8KKyAgdm9pZCB3cml0ZU1hcEVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KTsgLy8vCisgIHZvaWQgd3JpdGVTZXRFbmQoKTsgLy8vCisKKyAgLyoKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBib29sIHJlYWRCb29sKCk7IC8vLworICBieXRlIHJlYWRCeXRlKCk7IC8vLworICBzaG9ydCByZWFkSTE2KCk7IC8vLworICBpbnQgcmVhZEkzMigpOyAvLy8KKyAgbG9uZyByZWFkSTY0KCk7IC8vLworICBkb3VibGUgcmVhZERvdWJsZSgpOyAvLy8KKyAgc3RyaW5nIHJlYWRTdHJpbmcoKTsgLy8vCisgIHVieXRlW10gcmVhZEJpbmFyeSgpOyAvLy8KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCk7IC8vLworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkU3RydWN0RW5kKCk7IC8vLworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZEZpZWxkRW5kKCk7IC8vLworICBUTGlzdCByZWFkTGlzdEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRMaXN0RW5kKCk7IC8vLworICBUTWFwIHJlYWRNYXBCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkTWFwRW5kKCk7IC8vLworICBUU2V0IHJlYWRTZXRCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkU2V0RW5kKCk7IC8vLworCisgIC8qKgorICAgKiBSZXNldCBhbnkgaW50ZXJuYWwgc3RhdGUgYmFjayB0byBhIGJsYW5rIHNsYXRlLCBpZiB0aGUgcHJvdG9jb2wgaXMKKyAgICogc3RhdGVmdWwuCisgICAqLworICB2b2lkIHJlc2V0KCk7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIGlzIGEgVFByb3RvY29sLgorICovCit0ZW1wbGF0ZSBpc1RQcm90b2NvbChUKSB7CisgIGVudW0gaXNUUHJvdG9jb2wgPSBpcyhUIDogVFByb3RvY29sKTsKK30KKwordW5pdHRlc3QgeworICBzdGF0aWMgYXNzZXJ0KGlzVFByb3RvY29sIVRQcm90b2NvbCk7CisgIHN0YXRpYyBhc3NlcnQoIWlzVFByb3RvY29sIXZvaWQpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBwcm90b2NvbCBvcGVyYXRpbmcgb24gYSBnaXZlbiB0cmFuc3BvcnQuCisgKi8KK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgLy8vCisgIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKTsKK30KKworLyoqCisgKiBBIHByb3RvY29sLWxldmVsIGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLyBUaGUgcG9zc2libGUgZXhjZXB0aW9uIHR5cGVzLgorICBlbnVtIFR5cGUgeworICAgIFVOS05PV04sIC8vLworICAgIElOVkFMSURfREFUQSwgLy8vCisgICAgTkVHQVRJVkVfU0laRSwgLy8vCisgICAgU0laRV9MSU1JVCwgLy8vCisgICAgQkFEX1ZFUlNJT04sIC8vLworICAgIE5PVF9JTVBMRU1FTlRFRCwgLy8vCisgICAgREVQVEhfTElNSVQgLy8vCisgIH0KKworICAvLy8KKyAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgeworICAgIHN0YXRpYyBzdHJpbmcgbXNnRm9yVHlwZShUeXBlIHR5cGUpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogcmV0dXJuICJVbmtub3duIHByb3RvY29sIGV4Y2VwdGlvbiI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX0RBVEE6IHJldHVybiAiSW52YWxpZCBkYXRhIjsKKyAgICAgICAgY2FzZSBUeXBlLk5FR0FUSVZFX1NJWkU6IHJldHVybiAiTmVnYXRpdmUgc2l6ZSI7CisgICAgICAgIGNhc2UgVHlwZS5TSVpFX0xJTUlUOiByZXR1cm4gIkV4Y2VlZGVkIHNpemUgbGltaXQiOworICAgICAgICBjYXNlIFR5cGUuQkFEX1ZFUlNJT046IHJldHVybiAiSW52YWxpZCB2ZXJzaW9uIjsKKyAgICAgICAgY2FzZSBUeXBlLk5PVF9JTVBMRU1FTlRFRDogcmV0dXJuICJOb3QgaW1wbGVtZW50ZWQiOworICAgICAgICBjYXNlIFR5cGUuREVQVEhfTElNSVQ6IHJldHVybiAiRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcyhtc2dGb3JUeXBlKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgdGhpcyhtc2csIFR5cGUuVU5LTk9XTiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICAvLy8KKyAgVHlwZSB0eXBlKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworcHJvdGVjdGVkOgorICBUeXBlIHR5cGVfOworfQorCisvKioKKyAqIFNraXBzIGEgZmllbGQgb2YgdGhlIGdpdmVuIHR5cGUgb24gdGhlIHByb3RvY29sLgorICoKKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2Ygc2tpcCgpIGlzIHRvIGFsbG93IHRyZWF0aW5nIHN0cnVjdCBhbmQgY29udGFpbmVyIHR5cGVzLAorICogKHdoZXJlIG11bHRpcGxlIHByaW1pdGl2ZSB0eXBlcyBoYXZlIHRvIGJlIHNraXBwZWQpIHRoZSBzYW1lIGFzIHNjYWxhciB0eXBlcworICogaW4gZ2VuZXJhdGVkIGNvZGUuCisgKi8KK3ZvaWQgc2tpcChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdCwgVFR5cGUgdHlwZSkgaWYgKGlzKFByb3RvY29sIDogVFByb3RvY29sKSkgeworICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICBwcm90LnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgIHByb3QucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICBwcm90LnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICBwcm90LnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICBwcm90LnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICBwcm90LnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYXV0byBmID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZi50eXBlID09IFRUeXBlLlNUT1ApIGJyZWFrOworICAgICAgICBza2lwKHByb3QsIGYudHlwZSk7CisgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgYXV0byBsID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3JlYWNoIChpOyAwIC4uIGwuc2l6ZSkgeworICAgICAgICBza2lwKHByb3QsIGwuZWxlbVR5cGUpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgIGF1dG8gbSA9IHByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3JlYWNoIChpOyAwIC4uIG0uc2l6ZSkgeworICAgICAgICBza2lwKHByb3QsIG0ua2V5VHlwZSk7CisgICAgICAgIHNraXAocHJvdCwgbS52YWx1ZVR5cGUpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgYXV0byBzID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gcy5zaXplKSB7CisgICAgICAgIHNraXAocHJvdCwgcy5lbGVtVHlwZSk7CisgICAgICB9CisgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFR5cGUuU1RPUDogZ290byBjYXNlOworICAgIGNhc2UgVFR5cGUuVk9JRDoKKyAgICAgIGFzc2VydChmYWxzZSwgIkludmFsaWQgZmllbGQgdHlwZSBwYXNzZWQuIik7CisgIH0KK30KKworLyoqCisgKiBBcHBsaWNhdGlvbi1sZXZlbCBleGNlcHRpb24uCisgKgorICogSXQgaXMgdGhyb3duIGlmIGFuIFJQQyBjYWxsIHdlbnQgd3Jvbmcgb24gdGhlIGFwcGxpY2F0aW9uIGxheWVyLCBlLmcuIGlmCisgKiB0aGUgcmVjZWl2ZXIgZG9lcyBub3Qga25vdyB0aGUgbWV0aG9kIG5hbWUgcmVxdWVzdGVkIG9yIGEgbWV0aG9kIGludm9rZWQgYnkKKyAqIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0aHJvd3MgYW4gZXhjZXB0aW9uIG5vdCBwYXJ0IG9mIHRoZSBUaHJpZnQgQVBJLgorICovCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLy8vIFRoZSBwb3NzaWJsZSBleGNlcHRpb24gdHlwZXMuCisgIGVudW0gVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsIC8vLworICAgIFVOS05PV05fTUVUSE9EID0gMSwgLy8vCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLCAvLy8KKyAgICBXUk9OR19NRVRIT0RfTkFNRSA9IDMsIC8vLworICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQsIC8vLworICAgIE1JU1NJTkdfUkVTVUxUID0gNSwgLy8vCisgICAgSU5URVJOQUxfRVJST1IgPSA2LCAvLy8KKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcsIC8vLworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOCwgLy8vCisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDksIC8vLworICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAgLy8vCisgIH0KKworICAvLy8KKyAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgeworICAgIHN0YXRpYyBzdHJpbmcgbXNnRm9yVHlwZShUeXBlIHR5cGUpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogcmV0dXJuICJVbmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiI7CisgICAgICAgIGNhc2UgVHlwZS5VTktOT1dOX01FVEhPRDogcmV0dXJuICJVbmtub3duIG1ldGhvZCI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX01FU1NBR0VfVFlQRTogcmV0dXJuICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7CisgICAgICAgIGNhc2UgVHlwZS5XUk9OR19NRVRIT0RfTkFNRTogcmV0dXJuICJXcm9uZyBtZXRob2QgbmFtZSI7CisgICAgICAgIGNhc2UgVHlwZS5CQURfU0VRVUVOQ0VfSUQ6IHJldHVybiAiQmFkIHNlcXVlbmNlIGlkZW50aWZpZXIiOworICAgICAgICBjYXNlIFR5cGUuTUlTU0lOR19SRVNVTFQ6IHJldHVybiAiTWlzc2luZyByZXN1bHQiOworICAgICAgICBjYXNlIFR5cGUuSU5URVJOQUxfRVJST1I6IHJldHVybiAiSW50ZXJuYWwgZXJyb3IiOworICAgICAgICBjYXNlIFR5cGUuUFJPVE9DT0xfRVJST1I6IHJldHVybiAiUHJvdG9jb2wgZXJyb3IiOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9UUkFOU0ZPUk06IHJldHVybiAiSW52YWxpZCB0cmFuc2Zvcm0iOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9QUk9UT0NPTDogcmV0dXJuICJJbnZhbGlkIHByb3RvY29sIjsKKyAgICAgICAgY2FzZSBUeXBlLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiByZXR1cm4gIlVuc3VwcG9ydGVkIGNsaWVudCB0eXBlIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0KKyAgICB0aGlzKG1zZ0ZvclR5cGUodHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCisgIC8vIFRPRE86IFJlcGxhY2UgaGFuZC13cml0dGVuIHJlYWQoKS93cml0ZSgpIHdpdGggdGhyaWZ0LmNvZGVnZW4gdGVtcGxhdGVzLgorCisgIC8vLworICB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gZiA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpZiAoZi50eXBlID09IFRUeXBlLlNUT1ApIGJyZWFrOworCisgICAgICBzd2l0Y2ggKGYuaWQpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtc2cgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAoaXByb3QsIGYudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHR5cGVfID0gY2FzdChUeXBlKWlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2tpcChpcHJvdCwgZi50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc2tpcChpcHJvdCwgZi50eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICB9CisKKyAgLy8vCisgIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSBjb25zdCB7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKSk7CisKKyAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIDEpKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKG1zZyk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRGaWVsZCgidHlwZSIsIFRUeXBlLkkzMiwgMikpOworICAgIG9wcm90LndyaXRlSTMyKHR5cGVfKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworcHJpdmF0ZToKKyAgVHlwZSB0eXBlXzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmluYXJ5LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDhmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeS5kCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKKworaW1wb3J0IHN0ZC5hcnJheSA6IHVuaW5pdGlhbGl6ZWRBcnJheTsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworCisvKioKKyAqIFRQcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQmluYXJ5IFRocmlmdCBwcm90b2NvbC4KKyAqLworZmluYWwgY2xhc3MgVEJpbmFyeVByb3RvY29sKFRyYW5zcG9ydCA9IFRUcmFuc3BvcnQpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVRyYW5zcG9ydAorKSA6IFRQcm90b2NvbCB7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFucyA9IFRoZSB0cmFuc3BvcnQgdG8gdXNlLgorICAgKiAgIGNvbnRhaW5lclNpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgY29udGFpbmVyIHNpemUgaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBpdGVtcy4KKyAgICogICBzdHJpbmdTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIHN0cmluZyBsZW5ndGggaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICogICBzdHJpY3RSZWFkID0gSWYgZmFsc2UsIG9sZCBwZWVycyB3aGljaCBkbyBub3QgaW5jbHVkZSB0aGUgcHJvdG9jb2wKKyAgICogICAgIHZlcnNpb24gYXJlIHRvbGVyYXRlZC4KKyAgICogICBzdHJpY3RXcml0ZSA9IFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUgaGVhZGVyLgorICAgKi8KKyAgdGhpcyhUcmFuc3BvcnQgdHJhbnMsIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCwKKyAgICBib29sIHN0cmljdFJlYWQgPSBmYWxzZSwgYm9vbCBzdHJpY3RXcml0ZSA9IHRydWUKKyAgKSB7CisgICAgdHJhbnNfID0gdHJhbnM7CisgICAgdGhpcy5jb250YWluZXJTaXplTGltaXQgPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgdGhpcy5zdHJpbmdTaXplTGltaXQgPSBzdHJpbmdTaXplTGltaXQ7CisgICAgdGhpcy5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICB0aGlzLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIH0KKworICBUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNfOworICB9CisKKyAgdm9pZCByZXNldCgpIHt9CisKKyAgLyoqCisgICAqIElmIGZhbHNlLCBvbGQgcGVlcnMgd2hpY2ggZG8gbm90IGluY2x1ZGUgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlCisgICAqIG1lc3NhZ2UgaGVhZGVyIGFyZSB0b2xlcmF0ZWQuCisgICAqCisgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgKi8KKyAgYm9vbCBzdHJpY3RSZWFkOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIChvbGRlcgorICAgKiB2ZXJzaW9ucyBkaWRuJ3QpLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgKi8KKyAgYm9vbCBzdHJpY3RXcml0ZTsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGRlc2VyaWFsaXplZCBjb250YWluZXJzIHRvIHRoZQorICAgKiBnaXZlbiBhbW91bnQuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdDsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGRlc2VyaWFsaXplZCBzdHJpbmdzL2JpbmFyeSBkYXRhIHRvIHRoZQorICAgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IHN0cmluZ1NpemVMaW1pdDsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIHdyaXRlQnl0ZShiID8gMSA6IDApOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmYilbMCAuLiAxXSk7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgeworICAgIHNob3J0IG5ldCA9IGhvc3RUb05ldChpMTYpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJm5ldClbMCAuLiAyXSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpbnQgbmV0ID0gaG9zdFRvTmV0KGkzMik7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmbmV0KVswIC4uIDRdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHsKKyAgICBsb25nIG5ldCA9IGhvc3RUb05ldChpNjQpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJm5ldClbMCAuLiA4XSk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICBzdGF0aWMgYXNzZXJ0KGRvdWJsZS5zaXplb2YgPT0gdWxvbmcuc2l6ZW9mKTsKKyAgICBhdXRvIGJpdHMgPSBob3N0VG9OZXQoKmNhc3QodWxvbmcqKSgmZHViKSk7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmYml0cylbMCAuLiA4XSk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKHN0cmluZyBzdHIpIHsKKyAgICB3cml0ZUJpbmFyeShjYXN0KHVieXRlW10pc3RyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkodWJ5dGVbXSBidWYpIHsKKyAgICBhc3NlcnQoYnVmLmxlbmd0aCA8PSBpbnQubWF4KTsKKyAgICB3cml0ZUkzMihjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChzdHJpY3RXcml0ZSkgeworICAgICAgaW50IHZlcnNuID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgd3JpdGVJMzIodmVyc24pOworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVCeXRlKG1lc3NhZ2UudHlwZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9CisgIH0KKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRzdHJ1Y3QpIHt9CisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIHdyaXRlQnl0ZShmaWVsZC50eXBlKTsKKyAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgIH0KKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIGFzc2VydChsaXN0LnNpemUgPD0gaW50Lm1heCk7CisgICAgd3JpdGVCeXRlKGxpc3QuZWxlbVR5cGUpOworICAgIHdyaXRlSTMyKGNhc3QoaW50KWxpc3Quc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIGFzc2VydChtYXAuc2l6ZSA8PSBpbnQubWF4KTsKKyAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICB3cml0ZUkzMihjYXN0KGludCltYXAuc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgYXNzZXJ0KHNldC5zaXplIDw9IGludC5tYXgpOworICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOworICAgIHdyaXRlSTMyKGNhc3QoaW50KXNldC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICByZXR1cm4gcmVhZEJ5dGUoKSAhPSAwOworICB9CisKKyAgYnl0ZSByZWFkQnl0ZSgpIHsKKyAgICB1Ynl0ZVsxXSBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiKTsKKyAgICByZXR1cm4gY2FzdChieXRlKWJbMF07CisgIH0KKworICBzaG9ydCByZWFkSTE2KCkgeworICAgIEludEJ1ZiFzaG9ydCBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICByZXR1cm4gbmV0VG9Ib3N0KGIudmFsdWUpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgSW50QnVmIWludCBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICByZXR1cm4gbmV0VG9Ib3N0KGIudmFsdWUpOworICB9CisKKyAgbG9uZyByZWFkSTY0KCkgeworICAgIEludEJ1ZiFsb25nIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIuYnl0ZXMpOworICAgIHJldHVybiBuZXRUb0hvc3QoYi52YWx1ZSk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICBJbnRCdWYhbG9uZyBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICBiLnZhbHVlID0gbmV0VG9Ib3N0KGIudmFsdWUpOworICAgIHJldHVybiAqY2FzdChkb3VibGUqKSgmYi52YWx1ZSk7CisgIH0KKworICBzdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gY2FzdChzdHJpbmcpcmVhZEJpbmFyeSgpOworICB9CisKKyAgdWJ5dGVbXSByZWFkQmluYXJ5KCkgeworICAgIHJldHVybiByZWFkQmluYXJ5Qm9keShyZWFkU2l6ZShzdHJpbmdTaXplTGltaXQpKTsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgVE1lc3NhZ2UgbXNnID0gdm9pZDsKKworICAgIGludCBzaXplID0gcmVhZEkzMigpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgaW50IHZlcnNuID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgIGlmICh2ZXJzbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQmFkIHByb3RvY29sIHZlcnNpb24uIiwKKyAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgICB9CisKKyAgICAgIG1zZy50eXBlID0gY2FzdChUTWVzc2FnZVR5cGUpKHNpemUgJiBNRVNTQUdFX1RZUEVfTUFTSyk7CisgICAgICBtc2cubmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgIG1zZy5zZXFpZCA9IHJlYWRJMzIoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0cmljdFJlYWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAiUHJvdG9jb2wgdmVyc2lvbiBtaXNzaW5nLCBvbGQgY2xpZW50PyIsCisgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5ORUdBVElWRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBtc2cubmFtZSA9IGNhc3Qoc3RyaW5nKXJlYWRCaW5hcnlCb2R5KHNpemUpOworICAgICAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKShyZWFkQnl0ZSgpKTsKKyAgICAgICAgbXNnLnNlcWlkID0gcmVhZEkzMigpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtc2c7CisgIH0KKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmV0dXJuIFRTdHJ1Y3QoKTsKKyAgfQorICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBURmllbGQgZiA9IHZvaWQ7CisgICAgZi5uYW1lID0gbnVsbDsKKyAgICBmLnR5cGUgPSBjYXN0KFRUeXBlKXJlYWRCeXRlKCk7CisgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSByZXR1cm4gZjsKKyAgICBmLmlkID0gcmVhZEkxNigpOworICAgIHJldHVybiBmOworICB9CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIHJldHVybiBUTGlzdChjYXN0KFRUeXBlKXJlYWRCeXRlKCksIHJlYWRTaXplKGNvbnRhaW5lclNpemVMaW1pdCkpOworICB9CisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIHJldHVybiBUTWFwKGNhc3QoVFR5cGUpcmVhZEJ5dGUoKSwgY2FzdChUVHlwZSlyZWFkQnl0ZSgpLAorICAgICAgcmVhZFNpemUoY29udGFpbmVyU2l6ZUxpbWl0KSk7CisgIH0KKyAgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICByZXR1cm4gVFNldChjYXN0KFRUeXBlKXJlYWRCeXRlKCksIHJlYWRTaXplKGNvbnRhaW5lclNpemVMaW1pdCkpOworICB9CisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKK3ByaXZhdGU6CisgIHVieXRlW10gcmVhZEJpbmFyeUJvZHkoaW50IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBhdXRvIGJ1ZiA9IHVuaW5pdGlhbGl6ZWRBcnJheSEodWJ5dGVbXSkoc2l6ZSk7CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmKTsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgaW50IHJlYWRTaXplKGludCBsaW1pdCkgeworICAgIGF1dG8gc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgfSBlbHNlIGlmIChsaW1pdCA+IDAgJiYgc2l6ZSA+IGxpbWl0KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIGVudW0gTUVTU0FHRV9UWVBFX01BU0sgPSAweDAwMDAwMGZmOworICBlbnVtIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgIGVudW0gVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKworICBUcmFuc3BvcnQgdHJhbnNfOworfQorCisvKioKKyAqIFRCaW5hcnlQcm90b2NvbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSB0cmFuc3BvcnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRCBCdWd6aWxsYQorICogZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVEJpbmFyeVByb3RvY29sIVRyYW5zcG9ydCB0QmluYXJ5UHJvdG9jb2woVHJhbnNwb3J0KShUcmFuc3BvcnQgdHJhbnMsCisgIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCwKKyAgYm9vbCBzdHJpY3RSZWFkID0gZmFsc2UsIGJvb2wgc3RyaWN0V3JpdGUgPSB0cnVlCispIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KSB7CisgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sIVRyYW5zcG9ydCh0cmFucywgY29udGFpbmVyU2l6ZUxpbWl0LAorICAgIHN0cmluZ1NpemVMaW1pdCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgLy8gQ2hlY2sgdGhlIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdC4KKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBiaW5hcnkgPSB0QmluYXJ5UHJvdG9jb2woYnVmKTsKKyAgYmluYXJ5LndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKCJmb28iLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMCkpOworCisgIGF1dG8gaGVhZGVyID0gbmV3IHVieXRlWzE1XTsKKyAgYnVmLnJlYWRBbGwoaGVhZGVyKTsKKyAgZW5mb3JjZShoZWFkZXIgPT0gWworICAgIDEyOCwgMSwgMCwgMSwgLy8gVmVyc2lvbiAxLCBUTWVzc2FnZVR5cGUuQ0FMTAorICAgIDAsIDAsIDAsIDMsIC8vIE1ldGhvZCBuYW1lIGxlbmd0aAorICAgIDEwMiwgMTExLCAxMTEsIC8vIE1ldGhvZCBuYW1lICgiZm9vIikKKyAgICAwLCAwLCAwLCAwLCAvLyBTZXF1ZW5jZSBpZAorICBdKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisgIHRlc3RDb250YWluZXJTaXplTGltaXQhKFRCaW5hcnlQcm90b2NvbCEoKSkoKTsKKyAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVEJpbmFyeVByb3RvY29sISgpKSgpOworfQorCisvKioKKyAqIFRQcm90b2NvbEZhY3RvcnkgY3JlYXRpbmcgYSBUQmluYXJ5UHJvdG9jb2wgaW5zdGFuY2UgZm9yIHBhc3NlZCBpbgorICogdHJhbnNwb3J0cy4KKyAqCisgKiBUaGUgb3B0aW9uYWwgVHJhbnNwb3J0cyB0ZW1wbGF0ZSB0dXBsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICogb25lIG9yIG1vcmUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdG8gc3BlY2lmaWNhbGx5IGluc3RhbnRpYXRlCisgKiBUQmluYXJ5UHJvdG9jb2wgZm9yLiBJZiB0aGUgYWN0dWFsIHRyYW5zcG9ydCB0eXBlcyBlbmNvdW50ZXJlZCBhdAorICogcnVudGltZSBtYXRjaCBvbmUgb2YgdGhlIHRyYW5zcG9ydHMgaW4gdGhlIGxpc3QsIGEgc3BlY2lhbGl6ZWQgcHJvdG9jb2wKKyAqIGluc3RhbmNlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYSBnZW5lcmljIFRUcmFuc3BvcnQgdmVyc2lvbiBpcyB1c2VkLgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KFRyYW5zcG9ydHMuLi4pIGlmICgKKyAgYWxsU2F0aXNmeSEoaXNUVHJhbnNwb3J0LCBUcmFuc3BvcnRzKQorKSA6IFRQcm90b2NvbEZhY3RvcnkgeworICAvLy8KKyAgdGhpcyAoaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwLAorICAgIGJvb2wgc3RyaWN0UmVhZCA9IGZhbHNlLCBib29sIHN0cmljdFdyaXRlID0gdHJ1ZQorICApIHsKKyAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CisgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgY29udGFpbmVyU2l6ZUxpbWl0XyA9IGNvbnRhaW5lclNpemVMaW1pdDsKKyAgICBzdHJpbmdTaXplTGltaXRfID0gc3RyaW5nU2l6ZUxpbWl0OworICB9CisKKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChUcmFuc3BvcnQ7IFR5cGVUdXBsZSEoVHJhbnNwb3J0cywgVFRyYW5zcG9ydCkpIHsKKyAgICAgIGF1dG8gY29uY3JldGVUcmFucyA9IGNhc3QoVHJhbnNwb3J0KXRyYW5zOworICAgICAgaWYgKGNvbmNyZXRlVHJhbnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2whVHJhbnNwb3J0KGNvbmNyZXRlVHJhbnMsCisgICAgICAgICAgY29udGFpbmVyU2l6ZUxpbWl0Xywgc3RyaW5nU2l6ZUxpbWl0Xywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAiUGFzc2VkIG51bGwgdHJhbnNwb3J0IHRvIFRCaW5hcnlQcm90b2NvbEZhY3RveS4iKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgc3RyaWN0UmVhZF87CisgIGJvb2wgc3RyaWN0V3JpdGVfOworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0XzsKKyAgaW50IHN0cmluZ1NpemVMaW1pdF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvY29tcGFjdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTVjODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZApAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5jb21wYWN0OworCitpbXBvcnQgc3RkLmFycmF5IDogdW5pbml0aWFsaXplZEFycmF5OworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CisKKy8qKgorICogRCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBwcm90b2NvbC4KKyAqCisgKiBTZWUgVEhSSUZULTExMCBmb3IgYSBwcm90b2NvbCBkZXNjcmlwdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbgorICogdGhlIEMrKyBvbmUuCisgKi8KK2ZpbmFsIGNsYXNzIFRDb21wYWN0UHJvdG9jb2woVHJhbnNwb3J0ID0gVFRyYW5zcG9ydCkgaWYgKAorICBpc1RUcmFuc3BvcnQhVHJhbnNwb3J0CispIDogVFByb3RvY29sIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFucyA9IFRoZSB0cmFuc3BvcnQgdG8gdXNlLgorICAgKiAgIGNvbnRhaW5lclNpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgY29udGFpbmVyIHNpemUgaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBpdGVtcy4KKyAgICogICBzdHJpbmdTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIHN0cmluZyBsZW5ndGggaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICovCisgIHRoaXMoVHJhbnNwb3J0IHRyYW5zLCBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDApIHsKKyAgICB0cmFuc18gPSB0cmFuczsKKyAgICB0aGlzLmNvbnRhaW5lclNpemVMaW1pdCA9IGNvbnRhaW5lclNpemVMaW1pdDsKKyAgICB0aGlzLnN0cmluZ1NpemVMaW1pdCA9IHN0cmluZ1NpemVMaW1pdDsKKyAgfQorCisgIFRyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc187CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgZmllbGRJZFN0YWNrXyA9IG51bGw7CisgICAgYm9vbGVhbkZpZWxkXyA9IFRGaWVsZC5pbml0OworICAgIGhhc0Jvb2xWYWx1ZV8gPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgZGVzZXJpYWxpemVkIGNvbnRhaW5lcnMgdG8gdGhlCisgICAqIGdpdmVuIGFtb3VudC4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0OworCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBsZW5ndGggb2YgZGVzZXJpYWxpemVkIHN0cmluZ3MvYmluYXJ5IGRhdGEgdG8gdGhlCisgICAqIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgc3RyaW5nU2l6ZUxpbWl0OworCisgIC8qCisgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGJvb2xlYW5GaWVsZF8ubmFtZSAhaXMgbnVsbCkgeworICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChib29sZWFuRmllbGRfLAorICAgICAgICBiID8gQ1R5cGUuQk9PTEVBTl9UUlVFIDogQ1R5cGUuQk9PTEVBTl9GQUxTRSk7CisgICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgICAgd3JpdGVCeXRlKGIgPyBDVHlwZS5CT09MRUFOX1RSVUUgOiBDVHlwZS5CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZiKVswLi4xXSk7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgeworICAgIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTE2KSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkzMikpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgeworICAgIHdyaXRlVmFyaW50NjQoaTY0VG9aaWd6YWcoaTY0KSk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICB1bG9uZyBiaXRzID0gaG9zdFRvTGUoKmNhc3QodWxvbmcqKSgmZHViKSk7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmYml0cylbMCAuLiA4XSk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKHN0cmluZyBzdHIpIHsKKyAgICB3cml0ZUJpbmFyeShjYXN0KHVieXRlW10pc3RyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkodWJ5dGVbXSBidWYpIHsKKyAgICBhc3NlcnQoYnVmLmxlbmd0aCA8PSBpbnQubWF4KTsKKyAgICB3cml0ZVZhcmludDMyKGNhc3QoaW50KWJ1Zi5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShidWYpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtc2cpIHsKKyAgICB3cml0ZUJ5dGUoY2FzdChieXRlKVBST1RPQ09MX0lEKTsKKyAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgoVkVSU0lPTl9OICYgVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChjYXN0KGludCltc2cudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKSk7CisgICAgd3JpdGVWYXJpbnQzMihtc2cuc2VxaWQpOworICAgIHdyaXRlU3RyaW5nKG1zZy5uYW1lKTsKKyAgfQorICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdHN0cnVjdCkgeworICAgIGZpZWxkSWRTdGFja18gfj0gbGFzdEZpZWxkSWRfOworICAgIGxhc3RGaWVsZElkXyA9IDA7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWRTdGFja19bJCAtIDFdOworICAgIGZpZWxkSWRTdGFja18gPSBmaWVsZElkU3RhY2tfWzAgLi4gJCAtIDFdOworICAgIGZpZWxkSWRTdGFja18uYXNzdW1lU2FmZUFwcGVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgeworICAgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gZmllbGQubmFtZTsKKyAgICAgIGJvb2xlYW5GaWVsZF8udHlwZSA9IGZpZWxkLnR5cGU7CisgICAgICBib29sZWFuRmllbGRfLmlkID0gZmllbGQuaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChmaWVsZCk7CisgICAgfQorICB9CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICB3cml0ZUNvbGxlY3Rpb25CZWdpbihsaXN0LmVsZW1UeXBlLCBsaXN0LnNpemUpOworICB9CisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBpZiAobWFwLnNpemUgPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQobWFwLnNpemUgPD0gaW50Lm1heCk7CisgICAgICB3cml0ZVZhcmludDMyKGNhc3QoaW50KW1hcC5zaXplKTsKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKHRvQ1R5cGUobWFwLmtleVR5cGUpIDw8IDQgfCB0b0NUeXBlKG1hcC52YWx1ZVR5cGUpKSk7CisgICAgfQorICB9CisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNldC5lbGVtVHlwZSwgc2V0LnNpemUpOworICB9CisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisKKyAgLyoKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBib29sIHJlYWRCb29sKCkgeworICAgIGlmIChoYXNCb29sVmFsdWVfID09IHRydWUpIHsKKyAgICAgIGhhc0Jvb2xWYWx1ZV8gPSBmYWxzZTsKKyAgICAgIHJldHVybiBib29sVmFsdWVfOworICAgIH0KKworICAgIHJldHVybiByZWFkQnl0ZSgpID09IENUeXBlLkJPT0xFQU5fVFJVRTsKKyAgfQorCisgIGJ5dGUgcmVhZEJ5dGUoKSB7CisgICAgdWJ5dGVbMV0gYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYik7CisgICAgcmV0dXJuIGNhc3QoYnl0ZSliWzBdOworICB9CisKKyAgc2hvcnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gY2FzdChzaG9ydCl6aWd6YWdUb0kzMihyZWFkVmFyaW50MzIoKSk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gemlnemFnVG9JMzIocmVhZFZhcmludDMyKCkpOworICB9CisKKyAgbG9uZyByZWFkSTY0KCkgeworICAgIHJldHVybiB6aWd6YWdUb0k2NChyZWFkVmFyaW50NjQoKSk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICBJbnRCdWYhbG9uZyBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICBiLnZhbHVlID0gbGVUb0hvc3QoYi52YWx1ZSk7CisgICAgcmV0dXJuICpjYXN0KGRvdWJsZSopKCZiLnZhbHVlKTsKKyAgfQorCisgIHN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiBjYXN0KHN0cmluZylyZWFkQmluYXJ5KCk7CisgIH0KKworICB1Ynl0ZVtdIHJlYWRCaW5hcnkoKSB7CisgICAgYXV0byBzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgY2hlY2tTaXplKHNpemUsIHN0cmluZ1NpemVMaW1pdCk7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBhdXRvIGJ1ZiA9IHVuaW5pdGlhbGl6ZWRBcnJheSEodWJ5dGVbXSkoc2l6ZSk7CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmKTsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBUTWVzc2FnZSBtc2cgPSB2b2lkOworCisgICAgYXV0byBwcm90b2NvbElkID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAocHJvdG9jb2xJZCAhPSBjYXN0KGJ5dGUpUFJPVE9DT0xfSUQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyIiwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgIH0KKworICAgIGF1dG8gdmVyc2lvbkFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGF1dG8gdmVyID0gdmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlciAhPSBWRVJTSU9OX04pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkJhZCBwcm90b2NvbCB2ZXJzaW9uIiwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgIH0KKworICAgIG1zZy50eXBlID0gY2FzdChUTWVzc2FnZVR5cGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworICAgIG1zZy5zZXFpZCA9IHJlYWRWYXJpbnQzMigpOworICAgIG1zZy5uYW1lID0gcmVhZFN0cmluZygpOworCisgICAgcmV0dXJuIG1zZzsKKyAgfQorICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICBmaWVsZElkU3RhY2tfIH49IGxhc3RGaWVsZElkXzsKKyAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIHJldHVybiBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgbGFzdEZpZWxkSWRfID0gZmllbGRJZFN0YWNrX1skIC0gMV07CisgICAgZmllbGRJZFN0YWNrXyA9IGZpZWxkSWRTdGFja19bMCAuLiAkIC0gMV07CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgVEZpZWxkIGYgPSB2b2lkOworICAgIGYubmFtZSA9IG51bGw7CisKKyAgICBhdXRvIGJpdGUgPSByZWFkQnl0ZSgpOworICAgIGF1dG8gdHlwZSA9IGNhc3QoQ1R5cGUpKGJpdGUgJiAweDBmKTsKKworICAgIGlmICh0eXBlID09IENUeXBlLlNUT1ApIHsKKyAgICAgIC8vIFN0cnVjdCBzdG9wIGJ5dGUsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgIGYuaWQgPSAwOworICAgICAgZi50eXBlID0gVFR5cGUuU1RPUDsKKyAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIC8vIE1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIsIHdoaWNoIGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZAorICAgIC8vIGRlbHRhLgorICAgIGF1dG8gbW9kaWZpZXIgPSBjYXN0KHNob3J0KSgoYml0ZSAmIDB4ZjApID4+IDQpOworICAgIGlmIChtb2RpZmllciA+IDApIHsKKyAgICAgIGYuaWQgPSBjYXN0KHNob3J0KShsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERlbHRhIGVuY29kaW5nIG5vdCB1c2VkLCBqdXN0IHJlYWQgdGhlIGlkIGFzIHVzdWFsLgorICAgICAgZi5pZCA9IHJlYWRJMTYoKTsKKyAgICB9CisgICAgZi50eXBlID0gZ2V0VFR5cGUodHlwZSk7CisKKyAgICBpZiAodHlwZSA9PSBDVHlwZS5CT09MRUFOX1RSVUUgfHwgdHlwZSA9PSBDVHlwZS5CT09MRUFOX0ZBTFNFKSB7CisgICAgICAvLyBGb3IgYm9vbGVhbiBmaWVsZHMsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlIOKAkyBrZWVwIGl0IGFyb3VuZAorICAgICAgLy8gZm9yIHRoZSByZWFkQm9vbCgpIGNhbGwuCisgICAgICBoYXNCb29sVmFsdWVfID0gdHJ1ZTsKKyAgICAgIGJvb2xWYWx1ZV8gPSAodHlwZSA9PSBDVHlwZS5CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICAgIH0KKworICAgIGxhc3RGaWVsZElkXyA9IGYuaWQ7CisgICAgcmV0dXJuIGY7CisgIH0KKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgYXV0byBzaXplQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisKKyAgICBhdXRvIGxzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHhmOworICAgIGlmIChsc2l6ZSA9PSAweGYpIHsKKyAgICAgIGxzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgfQorICAgIGNoZWNrU2l6ZShsc2l6ZSwgY29udGFpbmVyU2l6ZUxpbWl0KTsKKworICAgIFRMaXN0IGwgPSB2b2lkOworICAgIGwuZWxlbVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShzaXplQW5kVHlwZSAmIDB4MGYpKTsKKyAgICBsLnNpemUgPSBjYXN0KHNpemVfdClsc2l6ZTsKKworICAgIHJldHVybiBsOworICB9CisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIFRNYXAgbSA9IHZvaWQ7CisKKyAgICBhdXRvIHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICB1Ynl0ZSBrdlR5cGU7CisgICAgaWYgKHNpemUgIT0gMCkgeworICAgICAga3ZUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICB9CisgICAgY2hlY2tTaXplKHNpemUsIGNvbnRhaW5lclNpemVMaW1pdCk7CisKKyAgICBtLnNpemUgPSBzaXplOworICAgIG0ua2V5VHlwZSA9IGdldFRUeXBlKGNhc3QoQ1R5cGUpKGt2VHlwZSA+PiA0KSk7CisgICAgbS52YWx1ZVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShrdlR5cGUgJiAweGYpKTsKKworICAgIHJldHVybiBtOworICB9CisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgYXV0byBzaXplQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisKKyAgICBhdXRvIGxzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHhmOworICAgIGlmIChsc2l6ZSA9PSAweGYpIHsKKyAgICAgIGxzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgfQorICAgIGNoZWNrU2l6ZShsc2l6ZSwgY29udGFpbmVyU2l6ZUxpbWl0KTsKKworICAgIFRTZXQgcyA9IHZvaWQ7CisgICAgcy5lbGVtVHlwZSA9IGdldFRUeXBlKGNhc3QoQ1R5cGUpKHNpemVBbmRUeXBlICYgMHhmKSk7CisgICAgcy5zaXplID0gY2FzdChzaXplX3QpbHNpemU7CisKKyAgICByZXR1cm4gczsKKyAgfQorICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCitwcml2YXRlOgorICB2b2lkIHdyaXRlRmllbGRCZWdpbkludGVybmFsKFRGaWVsZCBmaWVsZCwgYnl0ZSB0eXBlT3ZlcnJpZGUgPSAtMSkgeworICAgIC8vIElmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICBhdXRvIHR5cGVUb1dyaXRlID0gKHR5cGVPdmVycmlkZSA9PSAtMSA/IHRvQ1R5cGUoZmllbGQudHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworCisgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgaWYgKGZpZWxkLmlkID4gbGFzdEZpZWxkSWRfICYmIChmaWVsZC5pZCAtIGxhc3RGaWVsZElkXykgPD0gMTUpIHsKKyAgICAgIC8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKChmaWVsZC5pZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpdHlwZVRvV3JpdGUpOworICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgIH0KKworICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLmlkOworICB9CisKKworICB2b2lkIHdyaXRlQ29sbGVjdGlvbkJlZ2luKFRUeXBlIGVsZW1UeXBlLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDw9IDE0KSB7CisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKShzaXplIDw8IDQgfCB0b0NUeXBlKGVsZW1UeXBlKSkpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoc2l6ZSA8PSBpbnQubWF4KTsKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKDB4ZjAgfCB0b0NUeXBlKGVsZW1UeXBlKSkpOworICAgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludClzaXplKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlVmFyaW50MzIodWludCBuKSB7CisgICAgdWJ5dGVbNV0gYnVmID0gdm9pZDsKKyAgICB1Ynl0ZSB3c2l6ZTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgICBidWZbd3NpemUrK10gPSBjYXN0KHVieXRlKW47CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICBuID4+PSA3OworICAgICAgfQorICAgIH0KKworICAgIHRyYW5zXy53cml0ZShidWZbMCAuLiB3c2l6ZV0pOworICB9CisKKyAgLyoKKyAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB2b2lkIHdyaXRlVmFyaW50NjQodWxvbmcgbikgeworICAgIHVieXRlWzEwXSBidWYgPSB2b2lkOworICAgIHVieXRlIHdzaXplOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgICBidWZbd3NpemUrK10gPSBjYXN0KHVieXRlKW47CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICBuID4+PSA3OworICAgICAgfQorICAgIH0KKworICAgIHRyYW5zXy53cml0ZShidWZbMCAuLiB3c2l6ZV0pOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAqLworICB1bG9uZyBpNjRUb1ppZ3phZyhsb25nIGwpIHsKKyAgICByZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2Myk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgKi8KKyAgdWludCBpMzJUb1ppZ3phZyhpbnQgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgfQorCisgIENUeXBlIHRvQ1R5cGUoVFR5cGUgdHlwZSkgeworICAgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gQ1R5cGUuU1RPUDsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuIENUeXBlLkJPT0xFQU5fVFJVRTsKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcmV0dXJuIENUeXBlLkJZVEU7CisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuIENUeXBlLkRPVUJMRTsKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICByZXR1cm4gQ1R5cGUuSTE2OworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHJldHVybiBDVHlwZS5JMzI7CisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIENUeXBlLkk2NDsKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gQ1R5cGUuQklOQVJZOworICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIHJldHVybiBDVHlwZS5TVFJVQ1Q7CisgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgcmV0dXJuIENUeXBlLk1BUDsKKyAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICByZXR1cm4gQ1R5cGUuU0VUOworICAgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgICByZXR1cm4gQ1R5cGUuTElTVDsKKyAgICAgIGNhc2UgVFR5cGUuVk9JRDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlLCAiSW52YWxpZCB0eXBlIHBhc3NlZC4iKTsKKyAgICB9CisgIH0KKworICBpbnQgcmVhZFZhcmludDMyKCkgeworICAgIHJldHVybiBjYXN0KGludClyZWFkVmFyaW50NjQoKTsKKyAgfQorCisgIGxvbmcgcmVhZFZhcmludDY0KCkgeworICAgIHVsb25nIHZhbDsKKyAgICB1Ynl0ZSBzaGlmdDsKKyAgICB1Ynl0ZVsxMF0gYnVmID0gdm9pZDsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCisgICAgYXV0byBidWZTaXplID0gYnVmLnNpemVvZjsKKyAgICBhdXRvIGJvcnJvd2VkID0gdHJhbnNfLmJvcnJvdyhidWYucHRyLCBidWZTaXplKTsKKworICAgIHVieXRlIHJzaXplOworCisgICAgaWYgKGJvcnJvd2VkKSB7CisgICAgICAvLyBGYXN0IHBhdGguCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBhdXRvIGJpdGUgPSBib3Jyb3dlZFtyc2l6ZV07CisgICAgICAgIHJzaXplKys7CisgICAgICAgIHZhbCB8PSBjYXN0KHVsb25nKShiaXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIGlmICghKGJpdGUgJiAweDgwKSkgeworICAgICAgICAgIHRyYW5zXy5jb25zdW1lKHJzaXplKTsKKyAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KKyAgICAgICAgaWYgKHJzaXplID09IGJ1Zi5zaXplb2YpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gU2xvdyBwYXRoLgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdWJ5dGVbMV0gYml0ZTsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoYml0ZSk7CisgICAgICAgICsrcnNpemU7CisKKyAgICAgICAgdmFsIHw9IGNhc3QodWxvbmcpKGJpdGVbMF0gJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgaWYgKCEoYml0ZVswXSAmIDB4ODApKSB7CisgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1pZ2h0IGFzIHdlbGwgY2hlY2sgZm9yIGludmFsaWQgZGF0YSBvbiB0aGUgc2xvdyBwYXRoIHRvby4KKyAgICAgICAgaWYgKHJzaXplID49IGJ1Zi5zaXplb2YpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAqLworICBpbnQgemlnemFnVG9JMzIodWludCBuKSB7CisgICAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICovCisgIGxvbmcgemlnemFnVG9JNjQodWxvbmcgbikgeworICAgIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOworICB9CisKKyAgVFR5cGUgZ2V0VFR5cGUoQ1R5cGUgdHlwZSkgeworICAgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBDVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RPUDsKKyAgICAgIGNhc2UgQ1R5cGUuQk9PTEVBTl9GQUxTRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIENUeXBlLkJPT0xFQU5fVFJVRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIENUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBUVHlwZS5CWVRFOworICAgICAgY2FzZSBDVHlwZS5JMTY6CisgICAgICAgIHJldHVybiBUVHlwZS5JMTY7CisgICAgICBjYXNlIENUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgIGNhc2UgQ1R5cGUuSTY0OgorICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgY2FzZSBDVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiBUVHlwZS5ET1VCTEU7CisgICAgICBjYXNlIENUeXBlLkJJTkFSWToKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUklORzsKKyAgICAgIGNhc2UgQ1R5cGUuTElTVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkxJU1Q7CisgICAgICBjYXNlIENUeXBlLlNFVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNFVDsKKyAgICAgIGNhc2UgQ1R5cGUuTUFQOgorICAgICAgICByZXR1cm4gVFR5cGUuTUFQOworICAgICAgY2FzZSBDVHlwZS5TVFJVQ1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5TVFJVQ1Q7CisgICAgfQorICB9CisKKyAgdm9pZCBjaGVja1NpemUoaW50IHNpemUsIGludCBsaW1pdCkgeworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5ORUdBVElWRV9TSVpFKTsKKyAgICB9IGVsc2UgaWYgKGxpbWl0ID4gMCAmJiBzaXplID4gbGltaXQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgfQorICB9CisKKyAgZW51bSBQUk9UT0NPTF9JRCA9IDB4ODI7CisgIGVudW0gVkVSU0lPTl9OID0gMTsKKyAgZW51bSBWRVJTSU9OX01BU0sgPSAwYjAwMDFfMTExMTsKKyAgZW51bSBUWVBFX01BU0sgPSAwYjExMTBfMDAwMDsKKyAgZW51bSBUWVBFX0JJVFMgPSAwYjAwMDBfMDExMTsKKyAgZW51bSBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgLy8gUHJvYmFibHkgbmVlZCB0byBpbXBsZW1lbnQgYSBiZXR0ZXIgc3RhY2sgYXQgc29tZSBwb2ludC4KKyAgc2hvcnRbXSBmaWVsZElkU3RhY2tfOworICBzaG9ydCBsYXN0RmllbGRJZF87CisKKyAgVEZpZWxkIGJvb2xlYW5GaWVsZF87CisKKyAgYm9vbCBoYXNCb29sVmFsdWVfOworICBib29sIGJvb2xWYWx1ZV87CisKKyAgVHJhbnNwb3J0IHRyYW5zXzsKK30KKworLyoqCisgKiBUQ29tcGFjdFByb3RvY29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorICogdGhlIHRyYW5zcG9ydCB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKExJTksyIGh0dHA6Ly9kLnB1cmVtYWdpYy5jb20vaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD02MDgyLCBEIEJ1Z3ppbGxhCisgKiBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUQ29tcGFjdFByb3RvY29sIVRyYW5zcG9ydCB0Q29tcGFjdFByb3RvY29sKFRyYW5zcG9ydCkoVHJhbnNwb3J0IHRyYW5zLAorICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAKKykgaWYgKGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQpCit7CisgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCFUcmFuc3BvcnQodHJhbnMsCisgICAgY29udGFpbmVyU2l6ZUxpbWl0LCBzdHJpbmdTaXplTGltaXQpOworfQorCitwcml2YXRlIHsKKyAgZW51bSBDVHlwZSA6IHVieXRlIHsKKyAgICBTVE9QID0gMHgwLAorICAgIEJPT0xFQU5fVFJVRSA9IDB4MSwKKyAgICBCT09MRUFOX0ZBTFNFID0gMHgyLAorICAgIEJZVEUgPSAweDMsCisgICAgSTE2ID0gMHg0LAorICAgIEkzMiA9IDB4NSwKKyAgICBJNjQgPSAweDYsCisgICAgRE9VQkxFID0gMHg3LAorICAgIEJJTkFSWSA9IDB4OCwKKyAgICBMSVNUID0gMHg5LAorICAgIFNFVCA9IDB4YSwKKyAgICBNQVAgPSAweGIsCisgICAgU1RSVUNUID0gMHhjCisgIH0KKyAgc3RhdGljIGFzc2VydChDVHlwZS5tYXggPD0gMHhmLAorICAgICJDb21wYWN0IHByb3RvY29sIHdpcmUgdHlwZSByZXByZXNlbnRhdGlvbiBtdXN0IGZpdCBpbnRvIDQgYml0cy4iKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoZSBtZXNzYWdlIGhlYWRlciBmb3JtYXQuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gY29tcGFjdCA9IHRDb21wYWN0UHJvdG9jb2woYnVmKTsKKyAgY29tcGFjdC53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSgiZm9vIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKworICBhdXRvIGhlYWRlciA9IG5ldyB1Ynl0ZVs3XTsKKyAgYnVmLnJlYWRBbGwoaGVhZGVyKTsKKyAgZW5mb3JjZShoZWFkZXIgPT0gWworICAgIDEzMCwgLy8gUHJvdG9jb2wgaWQuCisgICAgMzMsIC8vIFZlcnNpb24vdHlwZSBieXRlLgorICAgIDAsIC8vIFNlcXVlbmNlIGlkLgorICAgIDMsIDEwMiwgMTExLCAxMTEgLy8gTWV0aG9kIG5hbWUuCisgIF0pOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKKyAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVENvbXBhY3RQcm90b2NvbCEoKSkoKTsKKyAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVENvbXBhY3RQcm90b2NvbCEoKSkoKTsKK30KKworLyoqCisgKiBUUHJvdG9jb2xGYWN0b3J5IGNyZWF0aW5nIGEgVENvbXBhY3RQcm90b2NvbCBpbnN0YW5jZSBmb3IgcGFzc2VkIGluCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIFRoZSBvcHRpb25hbCBUcmFuc3BvcnRzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0byBzcGVjaWZpY2FsbHkgaW5zdGFudGlhdGUKKyAqIFRDb21wYWN0UHJvdG9jb2wgZm9yLiBJZiB0aGUgYWN0dWFsIHRyYW5zcG9ydCB0eXBlcyBlbmNvdW50ZXJlZCBhdAorICogcnVudGltZSBtYXRjaCBvbmUgb2YgdGhlIHRyYW5zcG9ydHMgaW4gdGhlIGxpc3QsIGEgc3BlY2lhbGl6ZWQgcHJvdG9jb2wKKyAqIGluc3RhbmNlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYSBnZW5lcmljIFRUcmFuc3BvcnQgdmVyc2lvbiBpcyB1c2VkLgorICovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeShUcmFuc3BvcnRzLi4uKSBpZiAoCisgIGFsbFNhdGlzZnkhKGlzVFRyYW5zcG9ydCwgVHJhbnNwb3J0cykKKykgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgLy8vCisgIHRoaXMoaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwKSB7CisgICAgY29udGFpbmVyU2l6ZUxpbWl0XyA9IDA7CisgICAgc3RyaW5nU2l6ZUxpbWl0XyA9IDA7CisgIH0KKworICBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgY29uc3QgeworICAgIGZvcmVhY2ggKFRyYW5zcG9ydDsgVHlwZVR1cGxlIShUcmFuc3BvcnRzLCBUVHJhbnNwb3J0KSkgeworICAgICAgYXV0byBjb25jcmV0ZVRyYW5zID0gY2FzdChUcmFuc3BvcnQpdHJhbnM7CisgICAgICBpZiAoY29uY3JldGVUcmFucykgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2whVHJhbnNwb3J0KGNvbmNyZXRlVHJhbnMpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgIlBhc3NlZCBudWxsIHRyYW5zcG9ydCB0byBUQ29tcGFjdFByb3RvY29sRmFjdG9yeS4iKTsKKyAgfQorCisgIGludCBjb250YWluZXJTaXplTGltaXRfOworICBpbnQgc3RyaW5nU2l6ZUxpbWl0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCkBAIC0wLDAgKzEsMTAzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5qc29uOworCitpbXBvcnQgc3RkLmFsZ29yaXRobTsKK2ltcG9ydCBzdGQuYXJyYXk7CitpbXBvcnQgc3RkLmJhc2U2NDsKK2ltcG9ydCBzdGQuY29udjsKK2ltcG9ydCBzdGQucmFuZ2U7CitpbXBvcnQgc3RkLnN0cmluZyA6IGZvcm1hdDsKK2ltcG9ydCBzdGQudHJhaXRzIDogaXNJbnRlZ3JhbDsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHN0ZC51dGYgOiB0b1VURjg7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCithbGlhcyBCYXNlNjRJbXBsISgnKycsICcvJywgQmFzZTY0Lk5vUGFkZGluZykgQmFzZTY0Tm9QYWQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBKU09OIHByb3RvY29sLgorICovCitmaW5hbCBjbGFzcyBUSnNvblByb3RvY29sKFRyYW5zcG9ydCA9IFRUcmFuc3BvcnQpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVRyYW5zcG9ydAorKSA6IFRQcm90b2NvbCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KKyAgICogICBjb250YWluZXJTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIGNvbnRhaW5lciBzaXplIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgaXRlbXMuCisgICAqICAgc3RyaW5nU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqLworICB0aGlzKFRyYW5zcG9ydCB0cmFucywgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwKSB7CisgICAgdHJhbnNfID0gdHJhbnM7CisgICAgdGhpcy5jb250YWluZXJTaXplTGltaXQgPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgdGhpcy5zdHJpbmdTaXplTGltaXQgPSBzdHJpbmdTaXplTGltaXQ7CisKKyAgICBjb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgcmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIodHJhbnMpOworICB9CisKKyAgVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zXzsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgZGVzdHJveShjb250ZXh0U3RhY2tfKTsKKyAgICBjb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgcmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIodHJhbnNfKTsKKyAgfQorCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgZGVzZXJpYWxpemVkIGNvbnRhaW5lcnMgdG8gdGhlCisgICAqIGdpdmVuIGFtb3VudC4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0OworCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBsZW5ndGggb2YgZGVzZXJpYWxpemVkIHN0cmluZ3MvYmluYXJ5IGRhdGEgdG8gdGhlCisgICAqIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBOb3RlOiBGb3IgYmluYXJ5IGRhdGEsIHRoZSBsaW1pdCBhcHBsaWVzIHRvIHRoZSBsZW5ndGggb2YgdGhlCisgICAqIEJhc2U2NC1lbmNvZGVkIHN0cmluZyBkYXRhLCBub3QgdGhlIHJlc3VsdGluZyBieXRlIGFycmF5LgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgc3RyaW5nU2l6ZUxpbWl0OworCisgIC8qCisgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihiID8gMSA6IDApOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgeworICAgIHdyaXRlSnNvbkludGVnZXIoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisKKyAgICBzdHJpbmcgdmFsdWU7CisgICAgaWYgKGR1YiBpcyBkb3VibGUubmFuKSB7CisgICAgICB2YWx1ZSA9IE5BTl9TVFJJTkc7CisgICAgfSBlbHNlIGlmIChkdWIgaXMgZG91YmxlLmluZmluaXR5KSB7CisgICAgICB2YWx1ZSA9IElORklOSVRZX1NUUklORzsKKyAgICB9IGVsc2UgaWYgKGR1YiBpcyAtZG91YmxlLmluZmluaXR5KSB7CisgICAgICB2YWx1ZSA9IE5FR19JTkZJTklUWV9TVFJJTkc7CisgICAgfQorCisgICAgYm9vbCBlc2NhcGVOdW0gPSB2YWx1ZSAhaXMgbnVsbCB8fCBjb250ZXh0Xy5lc2NhcGVOdW07CisKKyAgICBpZiAodmFsdWUgaXMgbnVsbCkgeworICAgICAgLyogcHJlY2lzaW9uIGlzIDE3ICovCisgICAgICB2YWx1ZSA9IGZvcm1hdCgiJS4xN2ciLCBkdWIpOworICAgIH0KKworICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB0cmFuc18ud3JpdGUoY2FzdCh1Ynl0ZVtdKXZhbHVlKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKHN0cmluZyBzdHIpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworICAgIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgICBmb3JlYWNoIChjOyBzdHIpIHsKKyAgICAgIHdyaXRlSnNvbkNoYXIoYyk7CisgICAgfQorICAgIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkodWJ5dGVbXSBidWYpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworCisgICAgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICAgIHVieXRlWzRdIGI7CisgICAgd2hpbGUgKCFidWYuZW1wdHkpIHsKKyAgICAgIGF1dG8gdG9Xcml0ZSA9IHRha2UoYnVmLCAzKTsKKyAgICAgIEJhc2U2NE5vUGFkLmVuY29kZSh0b1dyaXRlLCBiW10pOworICAgICAgdHJhbnNfLndyaXRlKGJbMCAuLiB0b1dyaXRlLmxlbmd0aCArIDFdKTsKKyAgICAgIGJ1Zi5wb3BGcm9udE4odG9Xcml0ZS5sZW5ndGgpOworICAgIH0KKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1zZykgeworICAgIHdyaXRlSnNvbkFycmF5QmVnaW4oKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKFRIUklGVF9KU09OX1ZFUlNJT04pOworICAgIHdyaXRlU3RyaW5nKG1zZy5uYW1lKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGNhc3QoYnl0ZSltc2cudHlwZSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihtc2cuc2VxaWQpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRzdHJ1Y3QpIHsKKyAgICB3cml0ZUpzb25PYmplY3RCZWdpbigpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICB3cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIHdyaXRlSnNvbkludGVnZXIoZmllbGQuaWQpOworICAgIHdyaXRlSnNvbk9iamVjdEJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShmaWVsZC50eXBlKSk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShsaXN0LmVsZW1UeXBlKSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihsaXN0LnNpemUpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIHdyaXRlSnNvbkFycmF5QmVnaW4oKTsKKyAgICB3cml0ZVN0cmluZyhnZXROYW1lRnJvbVRUeXBlKG1hcC5rZXlUeXBlKSk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShtYXAudmFsdWVUeXBlKSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihtYXAuc2l6ZSk7CisgICAgd3JpdGVKc29uT2JqZWN0QmVnaW4oKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgICAgd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIHdyaXRlSnNvbkFycmF5QmVnaW4oKTsKKyAgICB3cml0ZVN0cmluZyhnZXROYW1lRnJvbVRUeXBlKHNldC5lbGVtVHlwZSkpOworICAgIHdyaXRlSnNvbkludGVnZXIoc2V0LnNpemUpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICB3cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKworICAvKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFieXRlKCkgPyB0cnVlIDogZmFsc2U7CisgIH0KKworICBieXRlIHJlYWRCeXRlKCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhYnl0ZSgpOworICB9CisKKyAgc2hvcnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIXNob3J0KCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWludCgpOworICB9CisKKyAgbG9uZyByZWFkSTY0KCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhbG9uZygpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKworICAgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBTVFJJTkdfREVMSU1JVEVSKSB7CisgICAgICBhdXRvIHN0ciA9IHJlYWRKc29uU3RyaW5nKHRydWUpOworICAgICAgaWYgKHN0ciA9PSBOQU5fU1RSSU5HKSB7CisgICAgICAgIHJldHVybiBkb3VibGUubmFuOworICAgICAgfQorICAgICAgaWYgKHN0ciA9PSBJTkZJTklUWV9TVFJJTkcpIHsKKyAgICAgICAgcmV0dXJuIGRvdWJsZS5pbmZpbml0eTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHIgPT0gTkVHX0lORklOSVRZX1NUUklORykgeworICAgICAgICByZXR1cm4gLWRvdWJsZS5pbmZpbml0eTsKKyAgICAgIH0KKworICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0pIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIiwKKyAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHRvIWRvdWJsZShzdHIpOworICAgICAgfSBjYXRjaCAoQ29udkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oYEV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCAiYCB+IHN0ciB+CisgICAgICAgICAgYCIuYCwgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICAgIH0KKworICAgICAgYXV0byBzdHIgPSByZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHRvIWRvdWJsZShzdHIpOworICAgICAgfSBjYXRjaCAoQ29udkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oYEV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCAiYCB+IHN0ciB+CisgICAgICAgICAgYCIuYCwgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gcmVhZEpzb25TdHJpbmcoZmFsc2UpOworICB9CisKKyAgdWJ5dGVbXSByZWFkQmluYXJ5KCkgeworICAgIHJldHVybiBCYXNlNjROb1BhZC5kZWNvZGUocmVhZFN0cmluZygpKTsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgVE1lc3NhZ2UgbXNnID0gdm9pZDsKKworICAgIHJlYWRKc29uQXJyYXlCZWdpbigpOworCisgICAgYXV0byB2ZXIgPSByZWFkSnNvbkludGVnZXIhc2hvcnQoKTsKKyAgICBpZiAodmVyICE9IFRIUklGVF9KU09OX1ZFUlNJT04pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBtc2cubmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKXJlYWRKc29uSW50ZWdlciFieXRlKCk7CisgICAgbXNnLnNlcWlkID0gcmVhZEpzb25JbnRlZ2VyIXNob3J0KCk7CisKKyAgICByZXR1cm4gbXNnOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICByZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZWFkSnNvbk9iamVjdEJlZ2luKCk7CisgICAgcmV0dXJuIFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICByZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFRGaWVsZCBmID0gdm9pZDsKKyAgICBmLm5hbWUgPSBudWxsOworCisgICAgYXV0byBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgIGlmIChjaCA9PSBPQkpFQ1RfRU5EKSB7CisgICAgICBmLnR5cGUgPSBUVHlwZS5TVE9QOworICAgIH0gZWxzZSB7CisgICAgICBmLmlkID0gcmVhZEpzb25JbnRlZ2VyIXNob3J0KCk7CisgICAgICByZWFkSnNvbk9iamVjdEJlZ2luKCk7CisgICAgICBmLnR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGY7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHsKKyAgICByZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKyAgICBhdXRvIHR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byBzaXplID0gcmVhZENvbnRhaW5lclNpemUoKTsKKyAgICByZXR1cm4gVExpc3QodHlwZSwgc2l6ZSk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkgeworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIHJlYWRKc29uQXJyYXlCZWdpbigpOworICAgIGF1dG8ga2V5VHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICBhdXRvIHZhbHVlVHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICBhdXRvIHNpemUgPSByZWFkQ29udGFpbmVyU2l6ZSgpOworICAgIHJlYWRKc29uT2JqZWN0QmVnaW4oKTsKKyAgICByZXR1cm4gVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkgeworICAgIHJlYWRKc29uT2JqZWN0RW5kKCk7CisgICAgcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgcmVhZEpzb25BcnJheUJlZ2luKCk7CisgICAgYXV0byB0eXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIGF1dG8gc2l6ZSA9IHJlYWRDb250YWluZXJTaXplKCk7CisgICAgcmV0dXJuIFRTZXQodHlwZSwgc2l6ZSk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7CisgICAgcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgcHVzaENvbnRleHQoQ29udGV4dCBjKSB7CisgICAgY29udGV4dFN0YWNrXyB+PSBjb250ZXh0XzsKKyAgICBjb250ZXh0XyA9IGM7CisgIH0KKworICB2b2lkIHBvcENvbnRleHQoKSB7CisgICAgY29udGV4dF8gPSBjb250ZXh0U3RhY2tfLmJhY2s7CisgICAgY29udGV4dFN0YWNrXy5wb3BCYWNrKCk7CisgICAgY29udGV4dFN0YWNrXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisgIH0KKworICAvKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucworICAgKi8KKworICAvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSnNvbiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQorICB2b2lkIHdyaXRlSnNvbkVzY2FwZUNoYXIodWJ5dGUgY2gpIHsKKyAgICB0cmFuc18ud3JpdGUoRVNDQVBFX1BSRUZJWCk7CisgICAgdHJhbnNfLndyaXRlKEVTQ0FQRV9QUkVGSVgpOworICAgIGF1dG8gb3V0Q2ggPSBoZXhDaGFyKGNhc3QodWJ5dGUpKGNoID4+IDQpKTsKKyAgICB0cmFuc18ud3JpdGUoKCZvdXRDaClbMCAuLiAxXSk7CisgICAgb3V0Q2ggPSBoZXhDaGFyKGNoKTsKKyAgICB0cmFuc18ud3JpdGUoKCZvdXRDaClbMCAuLiAxXSk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIHBhcnQgb2YgYSBKc29uIHN0cmluZywgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCisgIHZvaWQgd3JpdGVKc29uQ2hhcih1Ynl0ZSBjaCkgeworICAgIGlmIChjaCA+PSAweDMwKSB7CisgICAgICBpZiAoY2ggPT0gJ1xcJykgeyAvLyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCisgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZSgoJmNoKVswIC4uIDFdKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBhdXRvIG91dENoID0ga0pzb25DaGFyVGFibGVbY2hdOworICAgICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKc29uIGVzY2FwZWQKKyAgICAgIGlmIChvdXRDaCA9PSAxKSB7CisgICAgICAgIHRyYW5zXy53cml0ZSgoJmNoKVswIC4uIDFdKTsKKyAgICAgIH0gZWxzZSBpZiAob3V0Q2ggPiAxKSB7CisgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICB0cmFuc18ud3JpdGUoKCZvdXRDaClbMCAuLiAxXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUpzb25Fc2NhcGVDaGFyKGNoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0IHRoZSBnaXZlbiBpbnRlZ2VyIHR5cGUgdG8gYSBKc29uIG51bWJlciwgb3IgYSBzdHJpbmcKKyAgLy8gaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCisgIHZvaWQgd3JpdGVKc29uSW50ZWdlcihUKShUIG51bSkgaWYgKGlzSW50ZWdyYWwhVCkgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisKKyAgICBhdXRvIGVzY2FwZU51bSA9IGNvbnRleHRfLmVzY2FwZU51bSgpOworICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB0cmFuc18ud3JpdGUoY2FzdCh1Ynl0ZVtdKXRvIXN0cmluZyhudW0pKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgIH0KKworICB2b2lkIHdyaXRlSnNvbk9iamVjdEJlZ2luKCkgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisgICAgdHJhbnNfLndyaXRlKE9CSkVDVF9CRUdJTik7CisgICAgcHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCkpOworICB9CisKKyAgdm9pZCB3cml0ZUpzb25PYmplY3RFbmQoKSB7CisgICAgcG9wQ29udGV4dCgpOworICAgIHRyYW5zXy53cml0ZShPQkpFQ1RfRU5EKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uQXJyYXlCZWdpbigpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworICAgIHRyYW5zXy53cml0ZShBUlJBWV9CRUdJTik7CisgICAgcHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOworICB9CisKKyAgdm9pZCB3cml0ZUpzb25BcnJheUVuZCgpIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKEFSUkFZX0VORCk7CisgIH0KKworICAvKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBpbnQgcmVhZENvbnRhaW5lclNpemUoKSB7CisgICAgYXV0byBzaXplID0gcmVhZEpzb25JbnRlZ2VyIWludCgpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5ORUdBVElWRV9TSVpFKTsKKyAgICB9IGVsc2UgaWYgKGNvbnRhaW5lclNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IGNvbnRhaW5lclNpemVMaW1pdCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICB2b2lkIHJlYWRKc29uU3ludGF4Q2hhcih1Ynl0ZVsxXSBjaCkgeworICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXJfLCBjaCk7CisgIH0KKworICB3Y2hhciByZWFkSnNvbkVzY2FwZUNoYXIoKSB7CisgICAgYXV0byBhID0gcmVhZGVyXy5yZWFkKCk7CisgICAgYXV0byBiID0gcmVhZGVyXy5yZWFkKCk7CisgICAgYXV0byBjID0gcmVhZGVyXy5yZWFkKCk7CisgICAgYXV0byBkID0gcmVhZGVyXy5yZWFkKCk7CisgICAgcmV0dXJuIGNhc3QodXNob3J0KSgKKyAgICAgICAgICAoaGV4VmFsKGFbMF0pIDw8IDEyKSArIChoZXhWYWwoYlswXSkgPDwgOCkgKworICAgICAgICAgIChoZXhWYWwoY1swXSkgPDwgNCkgKyBoZXhWYWwoZFswXSkKKyAgICAgICAgKTsKKyAgfQorCisgIHN0cmluZyByZWFkSnNvblN0cmluZyhib29sIHNraXBDb250ZXh0ID0gZmFsc2UpIHsKKyAgICBpZiAoIXNraXBDb250ZXh0KSBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworCisgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOworICAgIGF1dG8gYnVmZmVyID0gYXBwZW5kZXIhc3RyaW5nKCk7CisKKyAgICB3Y2hhcltdIHdjaHM7CisgICAgaW50IGJ5dGVzUmVhZDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICAgaWYgKGNoID09IFNUUklOR19ERUxJTUlURVIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICsrYnl0ZXNSZWFkOworICAgICAgaWYgKHN0cmluZ1NpemVMaW1pdCA+IDAgJiYgYnl0ZXNSZWFkID4gc3RyaW5nU2l6ZUxpbWl0KSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgICB9CisKKyAgICAgIGlmIChjaCA9PSBCQUNLU0xBU0gpIHsKKyAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgICAgaWYgKGNoID09IEVTQ0FQRV9DSEFSKSB7CisgICAgICAgICAgYXV0byB3Y2ggPSByZWFkSnNvbkVzY2FwZUNoYXIoKTsKKyAgICAgICAgICBpZiAod2NoID49IDB4RDgwMCAmJiB3Y2ggPD0gMHhEQkZGKSB7CisgICAgICAgICAgICB3Y2hzIH49IHdjaDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdjaCA+PSAweERDMDAgJiYgd2NoIDw9IDB4REZGRiAmJiB3Y2hzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBoaWdoIHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3Y2hzIH49IHdjaDsKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQod2Nocy50b1VURjgpOworICAgICAgICAgICAgd2NocyA9IFtdOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhdXRvIHBvcyA9IGNvdW50VW50aWwoa0VzY2FwZUNoYXJzW10sIGNoWzBdKTsKKyAgICAgICAgICBpZiAocG9zID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAnIiB+CisgICAgICAgICAgICAgIGNhc3QoY2hhciljaFswXSB+ICInLiIsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNoID0ga0VzY2FwZUNoYXJWYWxzW3Bvc107CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYnVmZmVyLnB1dChjaFswXSk7CisgICAgfQorCisgICAgaWYgKHdjaHMubGVuZ3RoICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci5kYXRhOworICB9CisKKyAgLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90CisgIC8vIGEgdmFsaWQgSnNvbiBudW1lcmljIGNoYXJhY3Rlci4KKyAgc3RyaW5nIHJlYWRKc29uTnVtZXJpY0NoYXJzKCkgeworICAgIHN0cmluZyBzdHI7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICAgIGlmICghaXNKc29uTnVtZXJpYyhjaFswXSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZWFkZXJfLnJlYWQoKTsKKyAgICAgIHN0ciB+PSBjaDsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKKyAgLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQorICBUIHJlYWRKc29uSW50ZWdlcihUKSgpIGlmIChpc0ludGVncmFsIVQpIHsKKyAgICBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOworICAgIH0KKyAgICBhdXRvIHN0ciA9IHJlYWRKc29uTnVtZXJpY0NoYXJzKCk7CisgICAgVCBudW07CisgICAgdHJ5IHsKKyAgICAgIG51bSA9IHRvIVQoc3RyKTsKKyAgICB9IGNhdGNoIChDb252RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oYEV4cGVjdGVkIG51bWVyaWMgdmFsdWUsIGdvdCAiYCB+IHN0ciB+IGAiLmAsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgfQorICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOworICAgIH0KKyAgICByZXR1cm4gbnVtOworICB9CisKKyAgdm9pZCByZWFkSnNvbk9iamVjdEJlZ2luKCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKE9CSkVDVF9CRUdJTik7CisgICAgcHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCkpOworICB9CisKKyAgdm9pZCByZWFkSnNvbk9iamVjdEVuZCgpIHsKKyAgICByZWFkSnNvblN5bnRheENoYXIoT0JKRUNUX0VORCk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgdm9pZCByZWFkSnNvbkFycmF5QmVnaW4oKSB7CisgICAgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKyAgICByZWFkSnNvblN5bnRheENoYXIoQVJSQVlfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25BcnJheUVuZCgpIHsKKyAgICByZWFkSnNvblN5bnRheENoYXIoQVJSQVlfRU5EKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICBzdGF0aWMgeworICAgIGZpbmFsIGNsYXNzIExvb2thaGVhZFJlYWRlciB7CisgICAgICB0aGlzKFRyYW5zcG9ydCB0cmFucykgeworICAgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIH0KKworICAgICAgdWJ5dGVbMV0gcmVhZCgpIHsKKyAgICAgICAgaWYgKGhhc0RhdGFfKSB7CisgICAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbChkYXRhXyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFfOworICAgICAgfQorCisgICAgICB1Ynl0ZVsxXSBwZWVrKCkgeworICAgICAgICBpZiAoIWhhc0RhdGFfKSB7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8pOworICAgICAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YV87CisgICAgICB9CisKKyAgICAgcHJpdmF0ZToKKyAgICAgIFRyYW5zcG9ydCB0cmFuc187CisgICAgICBib29sIGhhc0RhdGFfOworICAgICAgdWJ5dGVbMV0gZGF0YV87CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpzb24gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAorICAgICAqIGltcGxlbWVudGF0aW9ucworICAgICAqLworICAgIGNsYXNzIENvbnRleHQgeworICAgICAgLyoqCisgICAgICAgKiBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgICAgICovCisgICAgICB2b2lkIHdyaXRlKFRyYW5zcG9ydCB0cmFucykge30KKworICAgICAgLyoqCisgICAgICAgKiBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAgICAqLworICAgICAgdm9pZCByZWFkKExvb2thaGVhZFJlYWRlciByZWFkZXIpIHt9CisKKyAgICAgIC8qKgorICAgICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCisgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KKyAgICAgICAqLworICAgICAgYm9vbCBlc2NhcGVOdW0oKSBAcHJvcGVydHkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKKyAgICBjbGFzcyBQYWlyQ29udGV4dCA6IENvbnRleHQgeworICAgICAgdGhpcygpIHsKKyAgICAgICAgZmlyc3RfID0gdHJ1ZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCB3cml0ZShUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnMud3JpdGUoY29sb25fID8gUEFJUl9TRVAgOiBFTEVNX1NFUCk7CisgICAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdmVycmlkZSB2b2lkIHJlYWQoTG9va2FoZWFkUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhdXRvIGNoID0gKGNvbG9uXyA/IFBBSVJfU0VQIDogRUxFTV9TRVApOworICAgICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwgY2gpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKKyAgICAgIG92ZXJyaWRlIGJvb2wgZXNjYXBlTnVtKCkgQHByb3BlcnR5IHsKKyAgICAgICAgcmV0dXJuIGNvbG9uXzsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBib29sIGZpcnN0XzsKKyAgICAgIGJvb2wgY29sb25fOworICAgIH0KKworICAgIGNsYXNzIExpc3RDb250ZXh0IDogQ29udGV4dCB7CisgICAgICB0aGlzKCkgeworICAgICAgICBmaXJzdF8gPSB0cnVlOworICAgICAgfQorCisgICAgICBvdmVycmlkZSB2b2lkIHdyaXRlKFRyYW5zcG9ydCB0cmFucykgeworICAgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnMud3JpdGUoRUxFTV9TRVApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG92ZXJyaWRlIHZvaWQgcmVhZChMb29rYWhlYWRSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZWFkU3ludGF4Q2hhcihyZWFkZXIsIEVMRU1fU0VQKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGJvb2wgZmlyc3RfOworICAgIH0KKworICAgIC8vIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0IHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUKKyAgICAvLyBleHBlY3RlZCBjaGFyYWN0ZXIgY2guCisgICAgLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90LgorICAgIHZvaWQgcmVhZFN5bnRheENoYXIoTG9va2FoZWFkUmVhZGVyIHJlYWRlciwgdWJ5dGVbMV0gY2gpIHsKKyAgICAgIGF1dG8gY2gyID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgIGlmIChjaDIgIT0gY2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgJyIgfiBjYXN0KGNoYXIpY2hbMF0gfiAiJywgZ290ICciIH4KKyAgICAgICAgICBjYXN0KGNoYXIpY2gyWzBdIH4gIicuIiwgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBQcm9iYWJseSBuZWVkIHRvIGltcGxlbWVudCBhIGJldHRlciBzdGFjayBhdCBzb21lIHBvaW50LgorICBDb250ZXh0W10gY29udGV4dFN0YWNrXzsKKyAgQ29udGV4dCBjb250ZXh0XzsKKworICBUcmFuc3BvcnQgdHJhbnNfOworICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKK30KKworLyoqCisgKiBUSnNvblByb3RvY29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorICogdGhlIHRyYW5zcG9ydCB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKExJTksyIGh0dHA6Ly9kLnB1cmVtYWdpYy5jb20vaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD02MDgyLCBEIEJ1Z3ppbGxhCisgKiBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUSnNvblByb3RvY29sIVRyYW5zcG9ydCB0SnNvblByb3RvY29sKFRyYW5zcG9ydCkoVHJhbnNwb3J0IHRyYW5zLAorICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAKKykgaWYgKGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQpIHsKKyAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sIVRyYW5zcG9ydCh0cmFucywgY29udGFpbmVyU2l6ZUxpbWl0LCBzdHJpbmdTaXplTGltaXQpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgLy8gQ2hlY2sgdGhlIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdC4KKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBqc29uLndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKCJmb28iLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMCkpOworICBqc29uLndyaXRlTWVzc2FnZUVuZCgpOworCisgIGF1dG8gaGVhZGVyID0gbmV3IHVieXRlWzEzXTsKKyAgYnVmLnJlYWRBbGwoaGVhZGVyKTsKKyAgZW5mb3JjZShjYXN0KGNoYXJbXSloZWFkZXIgPT0gYFsxLCJmb28iLDEsMF1gKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoYXQgc2hvcnQgYmluYXJ5IGRhdGEgaXMgcmVhZCBjb3JyZWN0bHkgKHRoZSBUaHJpZnQgSlNPTiBmb3JtYXQKKyAgLy8gZG9lcyBub3QgaW5jbHVkZSBwYWRkaW5nIGNoYXJzIGluIHRoZSBCYXNlNjQgZW5jb2RlZCBkYXRhKS4KKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBqc29uLndyaXRlQmluYXJ5KFsxLCAyXSk7CisgIGpzb24ucmVzZXQoKTsKKyAgZW5mb3JjZShqc29uLnJlYWRCaW5hcnkoKSA9PSBbMSwgMl0pOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXV0byBzdHIgPSBqc29uLnJlYWRTdHJpbmcoKTsKKyAgZW5mb3JjZShzdHIgPT0gIuC4gSDwnZS+Iik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gVGhyb3duIGlmIGxvdyBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWQ4MzVcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBoaWdoIHN1cnJvZ2F0ZSBpcyBtaXNzaW5nLgorICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZGQzZVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXNzZXJ0VGhyb3duIVRQcm90b2NvbEV4Y2VwdGlvbihqc29uLnJlYWRTdHJpbmcoKSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOworICB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0IShUSnNvblByb3RvY29sISgpKSgpOworICB0ZXN0U3RyaW5nU2l6ZUxpbWl0IShUSnNvblByb3RvY29sISgpKSgpOworfQorCisvKioKKyAqIFRQcm90b2NvbEZhY3RvcnkgY3JlYXRpbmcgYSBUSnNvblByb3RvY29sIGluc3RhbmNlIGZvciBwYXNzZWQgaW4KKyAqIHRyYW5zcG9ydHMuCisgKgorICogVGhlIG9wdGlvbmFsIFRyYW5zcG9ydHMgdGVtcGxhdGUgdHVwbGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAqIG9uZSBvciBtb3JlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBpbnN0YW50aWF0ZQorICogVEpzb25Qcm90b2NvbCBmb3IuIElmIHRoZSBhY3R1YWwgdHJhbnNwb3J0IHR5cGVzIGVuY291bnRlcmVkIGF0CisgKiBydW50aW1lIG1hdGNoIG9uZSBvZiB0aGUgdHJhbnNwb3J0cyBpbiB0aGUgbGlzdCwgYSBzcGVjaWFsaXplZCBwcm90b2NvbAorICogaW5zdGFuY2UgaXMgY3JlYXRlZC4gT3RoZXJ3aXNlLCBhIGdlbmVyaWMgVFRyYW5zcG9ydCB2ZXJzaW9uIGlzIHVzZWQuCisgKi8KK2NsYXNzIFRKc29uUHJvdG9jb2xGYWN0b3J5KFRyYW5zcG9ydHMuLi4pIGlmICgKKyAgYWxsU2F0aXNmeSEoaXNUVHJhbnNwb3J0LCBUcmFuc3BvcnRzKQorKSA6IFRQcm90b2NvbEZhY3RvcnkgeworICBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgY29uc3QgeworICAgIGZvcmVhY2ggKFRyYW5zcG9ydDsgVHlwZVR1cGxlIShUcmFuc3BvcnRzLCBUVHJhbnNwb3J0KSkgeworICAgICAgYXV0byBjb25jcmV0ZVRyYW5zID0gY2FzdChUcmFuc3BvcnQpdHJhbnM7CisgICAgICBpZiAoY29uY3JldGVUcmFucykgeworICAgICAgICBhdXRvIHAgPSBuZXcgVEpzb25Qcm90b2NvbCFUcmFuc3BvcnQoY29uY3JldGVUcmFucyk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgIlBhc3NlZCBudWxsIHRyYW5zcG9ydCB0byBUSnNvblByb3RvY29sRmFjdG95LiIpOworICB9Cit9CisKK3ByaXZhdGUgeworICBpbW11dGFibGUgdWJ5dGVbMV0gT0JKRUNUX0JFR0lOID0gJ3snOworICBpbW11dGFibGUgdWJ5dGVbMV0gT0JKRUNUX0VORCA9ICd9JzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEFSUkFZX0JFR0lOID0gJ1snOworICBpbW11dGFibGUgdWJ5dGVbMV0gQVJSQVlfRU5EID0gJ10nOworICBpbW11dGFibGUgdWJ5dGVbMV0gTkVXTElORSA9ICdcbic7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBQQUlSX1NFUCA9ICc6JzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEVMRU1fU0VQID0gJywnOworICBpbW11dGFibGUgdWJ5dGVbMV0gQkFDS1NMQVNIID0gJ1xcJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIFNUUklOR19ERUxJTUlURVIgPSAnIic7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBaRVJPX0NIQVIgPSAnMCc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBFU0NBUEVfQ0hBUiA9ICd1JzsKKyAgaW1tdXRhYmxlIHVieXRlWzRdIEVTQ0FQRV9QUkVGSVggPSBjYXN0KHVieXRlWzRdKXIiXHUwMCI7CisKKyAgZW51bSBUSFJJRlRfSlNPTl9WRVJTSU9OID0gMTsKKworICBpbW11dGFibGUgTkFOX1NUUklORyA9ICJOYU4iOworICBpbW11dGFibGUgSU5GSU5JVFlfU1RSSU5HID0gIkluZmluaXR5IjsKKyAgaW1tdXRhYmxlIE5FR19JTkZJTklUWV9TVFJJTkcgPSAiLUluZmluaXR5IjsKKworICBzdHJpbmcgZ2V0TmFtZUZyb21UVHlwZShUVHlwZSB0eXBlSUQpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGVJRCkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICByZXR1cm4gInRmIjsKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcmV0dXJuICJpOCI7CisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuICJpMTYiOworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHJldHVybiAiaTMyIjsKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICByZXR1cm4gImk2NCI7CisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuICJkYmwiOworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHJldHVybiAic3RyIjsKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICByZXR1cm4gInJlYyI7CisgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgcmV0dXJuICJtYXAiOworICAgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgICByZXR1cm4gImxzdCI7CisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgcmV0dXJuICJzZXQiOworICAgICAgY2FzZSBUVHlwZS5TVE9QOiBnb3RvIGNhc2U7CisgICAgICBjYXNlIFRUeXBlLlZPSUQ6CisgICAgICAgIGFzc2VydChmYWxzZSwgIkludmFsaWQgdHlwZSBwYXNzZWQuIik7CisgICAgfQorICB9CisKKyAgVFR5cGUgZ2V0VFR5cGVGcm9tTmFtZShzdHJpbmcgbmFtZSkgeworICAgIFRUeXBlIHJlc3VsdDsKKyAgICBpZiAobmFtZS5sZW5ndGggPiAxKSB7CisgICAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuRE9VQkxFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CWVRFOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMTY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MSVNUOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5NQVA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUlVDVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TVFJJTkc7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CT09MOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICB9CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU1RPUCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCisgIC8vICAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCisgIC8vICAxIDoganVzdCBvdXRwdXQgaW5kZXgKKyAgLy8gPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCisgIGltbXV0YWJsZSB1Ynl0ZVsweDMwXSBrSnNvbkNoYXJUYWJsZSA9IFsKKyAgLy8gIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYKKyAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCdiJywndCcsJ24nLCAgMCwnZicsJ3InLCAgMCwgIDAsIC8vIDAKKyAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8vIDEKKyAgICAgIDEsICAxLCciJywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIC8vIDIKKyAgXTsKKworICAvLyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBrRXNjYXBlQ2hhclZhbHMuCisgIC8vIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCisgIC8vIGl0IGlzIG5vdCBpbiB0aGUgUkZDCisgIGltbXV0YWJsZSBrRXNjYXBlQ2hhcnMgPSBjYXN0KHVieXRlWzddKSBgIlxcYmZucnRgOworCisgIC8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgorICAvLyBrRXNjYXBlQ2hhcnMKKyAgaW1tdXRhYmxlIHVieXRlWzddIGtFc2NhcGVDaGFyVmFscyA9IFsKKyAgICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgIF07CisKKyAgLy8gUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4IGNoYXJhY3RlciBjaC4KKyAgLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgdGhlIGNoYXJhY3RlciBpcyBub3QgWzAtOWEtZl0uCisgIHVieXRlIGhleFZhbCh1Ynl0ZSBjaCkgeworICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgeworICAgICAgcmV0dXJuIGNhc3QodWJ5dGUpKGNoIC0gJzAnKTsKKyAgICB9IGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgICByZXR1cm4gY2FzdCh1Ynl0ZSkoY2ggLSAnYScgKyAxMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pLCBnb3QgJyIgfgorICAgICAgICBjaCB+ICInLiIsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIHRoZSBoZXggY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciB2YWwuIFRoZSB2YWx1ZSBpcyBtYXNrZWQKKyAgLy8gdG8gbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlLgorICB1Ynl0ZSBoZXhDaGFyKHVieXRlIHZhbCkgeworICAgIHZhbCAmPSAweDBGOworICAgIGlmICh2YWwgPCAxMCkgeworICAgICAgcmV0dXJuIGNhc3QodWJ5dGUpKHZhbCArICcwJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKSh2YWwgLSAxMCArICdhJyk7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjaCBpcyBpbiBbLSswLTkuRWVdOyBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBpc0pzb25OdW1lcmljKHVieXRlIGNoKSB7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnKyc6CisgICAgICBjYXNlICctJzoKKyAgICAgIGNhc2UgJy4nOgorICAgICAgY2FzZSAnMCc6CisgICAgICBjYXNlICcxJzoKKyAgICAgIGNhc2UgJzInOgorICAgICAgY2FzZSAnMyc6CisgICAgICBjYXNlICc0JzoKKyAgICAgIGNhc2UgJzUnOgorICAgICAgY2FzZSAnNic6CisgICAgICBjYXNlICc3JzoKKyAgICAgIGNhc2UgJzgnOgorICAgICAgY2FzZSAnOSc6CisgICAgICBjYXNlICdFJzoKKyAgICAgIGNhc2UgJ2UnOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvcHJvY2Vzc29yLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL3Byb2Nlc3Nvci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzQyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL3Byb2Nlc3Nvci5kCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKKworLy8gVXNlIHNlbGVjdGl2ZSBpbXBvcnQgb25jZSBETUQgQEBCVUczMTRAQCBpcyBmaXhlZC4KK2ltcG9ydCBzdGQudmFyaWFudCAvKyA6IFZhcmlhbnQgKy87CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0IGlzIGxvb3NlLCB0aG91Z2ggdGhlIHR5cGljYWwgY2FzZSBpcyBmb3Igc29tZQorICogc29ydCBvZiBzZXJ2ZXIgdGhhdCBlaXRoZXIgZ2VuZXJhdGVzIHJlc3BvbnNlcyB0byBhbiBpbnB1dCBzdHJlYW0gb3IKKyAqIGZvcndhcmRzIGRhdGEgZnJvbSBvbmUgcGlwZSBvbnRvIGFub3RoZXIuCisgKgorICogQW4gaW1wbGVtZW50YXRpb24gY2FuIG9wdGlvbmFsbHkgYWxsb3cgb25lIG9yIG1vcmUgVFByb2Nlc3NvckV2ZW50SGFuZGxlcnMKKyAqIHRvIGJlIGF0dGFjaGVkLCBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIGhvb2sgY3VzdG9tIGNvZGUgaW50byB0aGUKKyAqIGhhbmRsaW5nIHByb2Nlc3MsIHdoaWNoIGNhbiBiZSB1c2VkIGUuZy4gZm9yIGdhdGhlcmluZyBzdGF0aXN0aWNzLgorICovCitpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgIC8vLworICBib29sIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsCisgICAgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dCA9IFZhcmlhbnQoKQorICApIGluIHsKKyAgICBhc3NlcnQoaXByb3QpOworICAgIGFzc2VydChvcHJvdCk7CisgIH0KKworICAvLy8KKyAgZmluYWwgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBwcm90LCBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0ID0gVmFyaWFudCgpKSB7CisgICAgcmV0dXJuIHByb2Nlc3MocHJvdCwgcHJvdCwgY29ubmVjdGlvbkNvbnRleHQpOworICB9Cit9CisKKy8qKgorICogSGFuZGxlcyBldmVudHMgZnJvbSBhIHByb2Nlc3Nvci4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgeworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSBjYWxsaW5nIG90aGVyIGNhbGxiYWNrIG1ldGhvZHMuCisgICAqCisgICAqIEV4cGVjdGVkIHRvIHJldHVybiBzb21lIHNvcnQgb2YgwrtjYWxsIGNvbnRleHTCqywgd2hpY2ggaXMgcGFzc2VkIHRvIGFsbAorICAgKiBvdGhlciBjYWxsYmFja3MgZm9yIHRoYXQgZnVuY3Rpb24gaW52b2NhdGlvbi4KKyAgICovCisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChzdHJpbmcgbWV0aG9kTmFtZSwgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGhhbmRsaW5nIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIGEgY29udGV4dCBoYXMgYmVlbgorICAgKiBmaW5pc2hlZCDigJMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBjbGVhbiB1cCB3b3JrLgorICAgKi8KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSByZWFkaW5nIGFyZ3VtZW50cy4KKyAgICovCisgIHZvaWQgcHJlUmVhZChWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgorICAgKi8KKyAgdm9pZCBwb3N0UmVhZChWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZXR3ZWVuIGNhbGxpbmcgdGhlIGhhbmRsZXIgYW5kIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgKi8KKyAgdm9pZCBwcmVXcml0ZShWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICovCisgIHZvaWQgcG9zdFdyaXRlKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gaGFuZGxpbmcgYSBvbmUtd2F5IGZ1bmN0aW9uIGNhbGwgaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICovCisgIHZvaWQgb25ld2F5Q29tcGxldGUoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uLgorICAgKi8KKyAgdm9pZCBoYW5kbGVyRXJyb3IoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUsIEV4Y2VwdGlvbiBlKTsKK30KKworc3RydWN0IFRDb25uZWN0aW9uSW5mbyB7CisgIC8vLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMuCisgIFRQcm90b2NvbCBpbnB1dDsKKyAgVFByb3RvY29sIG91dHB1dDsgLy8vIERpdHRvLgorCisgIC8vLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgLy8vIFRoaXMgaXMgdGhlIHRyYW5zcG9ydCB0aGF0IHdhcyByZXR1cm5lZCBieSBUU2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpLAorICAvLy8gYW5kIGl0IG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgdHJhbnNwb3J0IHBvaW50ZWQgdG8gYnkgdGhlIGlucHV0IGFuZAorICAvLy8gb3V0cHV0IHByb3RvY29scy4KKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7Cit9CisKK2ludGVyZmFjZSBUUHJvY2Vzc29yRmFjdG9yeSB7CisgIC8qKgorICAgKiBHZXQgdGhlIFRQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgYWx3YXlzIGludm9rZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzCisgICAqIGFjY2VwdGVkIG9uLCB3aGljaCBpcyBhbHdheXMgdGhlIHNhbWUgdGhyZWFkIGZvciBhbGwgY3VycmVudCBzZXJ2ZXIKKyAgICogaW1wbGVtZW50YXRpb25zLgorICAgKi8KKyAgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IocmVmIGNvbnN0KFRDb25uZWN0aW9uSW5mbykgY29ubkluZm8pOworfQorCisvKioKKyAqIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IHdoaWNoIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGluc3RhbmNlLgorICovCitjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IFRQcm9jZXNzb3JGYWN0b3J5IHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwcm9jZXNzb3IgPSBUaGUgcHJvY2Vzc29yIG9iamVjdCB0byByZXR1cm4gZnJvbSBnZXRQcm9jZXNzb3IoKS4KKyAgICovCisgIHRoaXMoVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICB9CisKKyAgb3ZlcnJpZGUgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IocmVmIGNvbnN0KFRDb25uZWN0aW9uSW5mbykgY29ubkluZm8pIHsKKyAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgfQorCitwcml2YXRlOgorICBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzYjFjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIuYmFzZTsKKworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBUaHJpZnQgc2VydmVycy4KKyAqCisgKiBCeSBzZXR0aW5nIHRoZSBldmVudEhhbmRsZXIgcHJvcGVydHkgdG8gYSBUU2VydmVyRXZlbnRIYW5kbGVyCisgKiBpbXBsZW1lbnRhdGlvbiwgY3VzdG9tIGNvZGUgY2FuIGJlIGludGVncmF0ZWQgaW50byB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZSwKKyAqIHdoaWNoIGNhbiBiZSB1c2VkIGUuZy4gZm9yIGdhdGhlcmluZyBzdGF0aXN0aWNzLgorICovCitjbGFzcyBUU2VydmVyIHsKKyAgLyoqCisgICAqIFN0YXJ0cyBzZXJ2aW5nLgorICAgKgorICAgKiBCbG9ja3MgdW50aWwgdGhlIHNlcnZlciBmaW5pc2hlcywgaS5lLiBhIHNlcmlvdXMgcHJvYmxlbSBvY2N1cnJlZCBvciB0aGUKKyAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gdHJpZ2dlcmVkLgorICAgKgorICAgKiBTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBpbXBsZW1lbnQgY2FuY2VsbGF0aW9uIGluIGEgYmVzdC0KKyAgICogZWZmb3J0IHdheSDigJMgdXN1YWxseSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGltbWVkaWF0ZWx5IHN0b3AgYWNjZXB0aW5nCisgICAqIGNvbm5lY3Rpb25zIGFuZCByZXR1cm4gYWZ0ZXIgYWxsIGN1cnJlbnRseSBhY3RpdmUgY2xpZW50cyBoYXZlIGJlZW4KKyAgICogcHJvY2Vzc2VkLCBidXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGNhc2UgZm9yIGV2ZXJ5IGNvbmNlaXZhYmxlCisgICAqIGltcGxlbWVudGF0aW9uLgorICAgKi8KKyAgYWJzdHJhY3Qgdm9pZCBzZXJ2ZShUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpOworCisgIC8vLyBUaGUgc2VydmVyIGV2ZW50IGhhbmRsZXIgdG8gbm90aWZ5LiBOdWxsIGJ5IGRlZmF1bHQuCisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyOworCitwcm90ZWN0ZWQ6CisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICBpbXBvcnQgdGhyaWZ0LmJhc2U7CisgICAgZW5mb3JjZShpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBuZXcgVEV4Y2VwdGlvbigiSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbC4iKSk7CisgICAgZW5mb3JjZShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIk91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsLiIpKTsKKyAgICBlbmZvcmNlKGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIklucHV0IHByb3RvY29sIGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbC4iKSk7CisgICAgZW5mb3JjZShvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBuZXcgVEV4Y2VwdGlvbigiT3V0cHV0IHByb3RvY29sIGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbC4iKSk7CisKKyAgICBwcm9jZXNzb3JGYWN0b3J5XyA9IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgc2VydmVyVHJhbnNwb3J0XyA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICB9CisKKyAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeV87CisgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0XzsKKyAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKK3B1YmxpYzoKKworICBAcHJvcGVydHkgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQoKQorICB7CisgICAgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87CisgIH0KKworICBAcHJvcGVydHkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgfQorfQorCisvKioKKyAqIEhhbmRsZXMgZXZlbnRzIGZyb20gYSBUU2VydmVyIGNvcmUuCisgKi8KK2ludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgdm9pZCBwcmVTZXJ2ZSgpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgcHJvY2Vzc2luZyBpcyBhYm91dCB0byBiZWdpbi4KKyAgICovCisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiByZXF1ZXN0IGhhbmRsaW5nIGZvciBhIGNsaWVudCBoYXMgYmVlbiBmaW5pc2hlZCDigJMgY2FuIGJlIHVzZWQKKyAgICogdG8gcGVyZm9ybSBjbGVhbiB1cCB3b3JrLgorICAgKi8KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gdGhlIHByb2Nlc3NvciBmb3IgYSBjbGllbnQgY2FsbCBpcyBhYm91dCB0byBiZSBpbnZva2VkLgorICAgKi8KKyAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2MGMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKQEAgLTAsMCArMSwxMzk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQSBub24tYmxvY2tpbmcgc2VydmVyIGltcGxlbWVudGF0aW9uIHRoYXQgb3BlcmF0ZXMgYSBzZXQgb2YgSS9PIHRocmVhZHMgKGJ5CisgKiBkZWZhdWx0IG9ubHkgb25lKSBhbmQgZWl0aGVyIGRvZXMgcHJvY2Vzc2luZyDCu2luLWxpbmXCqyBvciBvZmYtbG9hZHMgaXQgdG8gYQorICogdGFzayBwb29sLgorICoKKyAqIEl0ICpyZXF1aXJlcyogVEZyYW1lZFRyYW5zcG9ydCB0byBiZSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSwgYXMgaXQgZXhwZWN0cworICogYSA0IGJ5dGUgbGVuZ3RoIGluZGljYXRvciBhbmQgd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KKyAqCisgKiBCZWNhdXNlIEkvTyBpcyBkb25lIGFzeW5jaHJvbm91cy9ldmVudCBiYXNlZCwgdW5mb3J0dW5hdGVseQorICogVFNlcnZlclRyYW5zcG9ydCBjYW4ndCBiZSB1c2VkLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIEMrKyBvbmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiByZXF1ZXN0CisgKiB0aW1lb3V0cyBhbmQgdGhlIGRyYWluIHRhc2sgcXVldWUgb3ZlcmxvYWQgaGFuZGxpbmcgc3RyYXRlZ3kgbm90IGJlaW5nCisgKiBpbXBsZW1lbnRlZCB5ZXQuCisgKi8KKy8vIFRoaXMgcmVhbGx5IHNob3VsZCB1c2UgYSBEIG5vbi1ibG9ja2luZyBJL08gbGlicmFyeSwgb25jZSBvbmUgYmVjb21lcworLy8gYXZhaWxhYmxlLgorbW9kdWxlIHRocmlmdC5zZXJ2ZXIubm9uYmxvY2tpbmc7CisKK2ltcG9ydCBjb3JlLmF0b21pYyA6IGF0b21pY0xvYWQsIGF0b21pY1N0b3JlLCBhdG9taWNPcDsKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RkbGliIDogZnJlZSwgcmVhbGxvYzsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkLCBUaHJlYWRHcm91cDsKK2ltcG9ydCBkZWltb3MuZXZlbnQyLmV2ZW50OworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogZW1wbGFjZSwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtIDogVGFza1Bvb2wsIHRhc2s7CitpbXBvcnQgc3RkLnNvY2tldCA6IFNvY2tldCwgc29ja2V0UGFpciwgU29ja2V0QWNjZXB0RXhjZXB0aW9uLAorICBTb2NrZXRFeGNlcHRpb24sIFRjcFNvY2tldDsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQucmFuZ2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFBvc3NpYmxlIGFjdGlvbnMgdGFrZW4gb24gbmV3IGluY29taW5nIGNvbm5lY3Rpb25zIHdoZW4gdGhlIHNlcnZlciBpcworICogb3ZlcmxvYWRlZC4KKyAqLworZW51bSBUT3ZlcmxvYWRBY3Rpb24geworICAvLy8gRG8gbm90IHRha2UgYW55IHNwZWNpYWwgYWN0aW9ucyB3aGlsZSB0aGUgc2VydmVyIGlzIG92ZXJsb2FkZWQsIGp1c3QKKyAgLy8vIGNvbnRpbnVlIGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgTk9ORSwKKworICAvLy8gSW1tZWRpYXRlbHkgZHJvcCBuZXcgY29ubmVjdGlvbnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQgaWYgdGhlCisgIC8vLyBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZC4KKyAgQ0xPU0VfT05fQUNDRVBUCit9CisKKy8vLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCB1c2hvcnQgcG9ydCwgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwgdXNob3J0IHBvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICB1c2hvcnQgcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBwb3J0LAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICB1c2hvcnQgcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBudWxsLCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBwb3J0XyA9IHBvcnQ7CisKKyAgICB0aGlzLnRhc2tQb29sID0gdGFza1Bvb2w7CisKKyAgICBjb25uZWN0aW9uTXV0ZXhfID0gbmV3IE11dGV4OworCisgICAgY29ubmVjdGlvblN0YWNrTGltaXQgPSBERUZBVUxUX0NPTk5FQ1RJT05fU1RBQ0tfTElNSVQ7CisgICAgbWF4QWN0aXZlUHJvY2Vzc29ycyA9IERFRkFVTFRfTUFYX0FDVElWRV9QUk9DRVNTT1JTOworICAgIG1heENvbm5lY3Rpb25zID0gREVGQVVMVF9NQVhfQ09OTkVDVElPTlM7CisgICAgb3ZlcmxvYWRIeXN0ZXJlc2lzID0gREVGQVVMVF9PVkVSTE9BRF9IWVNURVJFU0lTOworICAgIG92ZXJsb2FkQWN0aW9uID0gREVGQVVMVF9PVkVSTE9BRF9BQ1RJT047CisgICAgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSA9IERFRkFVTFRfV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRTsKKyAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0ID0gREVGQVVMVF9JRExFX1JFQURfQlVGRkVSX0xJTUlUOworICAgIGlkbGVXcml0ZUJ1ZmZlckxpbWl0ID0gREVGQVVMVF9JRExFX1dSSVRFX0JVRkZFUl9MSU1JVDsKKyAgICByZXNpemVCdWZmZXJFdmVyeU4gPSBERUZBVUxUX1JFU0laRV9CVUZGRVJfRVZFUllfTjsKKyAgICBtYXhGcmFtZVNpemUgPSBERUZBVUxUX01BWF9GUkFNRV9TSVpFOworICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX05VTV9JT19USFJFQURTOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBzZXJ2ZShUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICBpZiAoY2FuY2VsbGF0aW9uICYmIGNhbmNlbGxhdGlvbi50cmlnZ2VyZWQpIHJldHVybjsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIGxpc3RlbmluZyBzb2NrZXQuCisgICAgLy8gVE9ETzogU09fS0VFUEFMSVZFLCBUQ1BfTE9XX01JTl9SVE8sIGV0Yy4KKyAgICBsaXN0ZW5Tb2NrZXRfID0gbWFrZVNvY2tldEFuZExpc3Rlbihwb3J0XywgVFNlcnZlclNvY2tldC5BQ0NFUFRfQkFDS0xPRywKKyAgICAgIEJJTkRfUkVUUllfTElNSVQsIEJJTkRfUkVUUllfREVMQVksIDAsIDAsIGlwdjZPbmx5Xyk7CisgICAgbGlzdGVuU29ja2V0Xy5ibG9ja2luZyA9IGZhbHNlOworCisgICAgbG9nSW5mbygiVXNpbmcgJXMgSS9PIHRocmVhZChzKS4iLCBudW1JT1RocmVhZHNfKTsKKyAgICBpZiAodGFza1Bvb2xfKSB7CisgICAgICBsb2dJbmZvKCJVc2luZyB0YXNrIHBvb2wgd2l0aCBzaXplOiAlcy4iLCBudW1JT1RocmVhZHNfLCB0YXNrUG9vbF8uc2l6ZSk7CisgICAgfQorCisgICAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPiAwKTsKKyAgICBhc3NlcnQoaW9Mb29wc18uZW1wdHkpOworICAgIGZvcmVhY2ggKGlkOyAwIC4uIG51bUlPVGhyZWFkc18pIHsKKyAgICAgIC8vIFRoZSBJTyBsb29wIG9uIHRoZSBmaXJzdCBJTyB0aHJlYWQgKHRoaXMgdGhyZWFkLCBpLmUuIHRoZSBvbmUgc2VydmUoKQorICAgICAgLy8gaXMgY2FsbGVkIGZyb20pIGFsc28gYWNjZXB0cyBuZXcgY29ubmVjdGlvbnMuCisgICAgICBhdXRvIGxpc3RlblNvY2tldCA9IChpZCA9PSAwID8gbGlzdGVuU29ja2V0XyA6IG51bGwpOworICAgICAgaW9Mb29wc18gfj0gbmV3IElPTG9vcCh0aGlzLCBsaXN0ZW5Tb2NrZXQpOworICAgIH0KKworICAgIGlmIChjYW5jZWxsYXRpb24pIHsKKyAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nLmFkZENhbGxiYWNrKHsKKyAgICAgICAgZm9yZWFjaCAoaSwgbG9vcDsgaW9Mb29wc18pIGxvb3Auc3RvcCgpOworCisgICAgICAgIC8vIFN0b3AgYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyByaWdodCBhd2F5LgorICAgICAgICBsaXN0ZW5Tb2NrZXRfLmNsb3NlKCk7CisgICAgICAgIGxpc3RlblNvY2tldF8gPSBudWxsOworICAgICAgfSk7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGhlIElPIGhlbHBlciB0aHJlYWRzIGZvciBhbGwgYnV0IHRoZSBmaXJzdCBsb29wLCB3aGljaCB3ZSB3aWxsIHJ1bgorICAgIC8vIG91cnNlbHZlcy4gTm90ZSB0aGF0IHRoZSB0aHJlYWRzIHJ1biBmb3JldmVyLCBvbmx5IHRlcm1pbmF0aW5nIGlmIHN0b3AoKQorICAgIC8vIGlzIGNhbGxlZC4KKyAgICBhdXRvIHRocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXAoKTsKKyAgICBmb3JlYWNoIChsb29wOyBpb0xvb3BzX1sxIC4uICRdKSB7CisgICAgICBhdXRvIHQgPSBuZXcgVGhyZWFkKCZsb29wLnJ1bik7CisgICAgICB0aHJlYWRzLmFkZCh0KTsKKyAgICAgIHQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgIC8vIFJ1biB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZCBsb29wIGluIG91ciBtYWluIHRocmVhZDsgdGhpcyB3aWxsCisgICAgLy8gYmxvY2sgdW50aWwgdGhlIHNlcnZlciBpcyBzaHV0dGluZyBkb3duLgorICAgIGlvTG9vcHNfWzBdLnJ1bigpOworCisgICAgLy8gRW5zdXJlIGFsbCB0aHJlYWRzIGFyZSBmaW5pc2hlZCBiZWZvcmUgbGVhdmluZyBzZXJ2ZSgpLgorICAgIHRocmVhZHMuam9pbkFsbCgpOworCisgICAgaW9Mb29wc18gPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGNvbm5lY3Rpb25zLCBpLmUuIG9wZW4gc29ja2V0cy4KKyAgICovCisgIHNpemVfdCBudW1Db25uZWN0aW9ucygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG51bUNvbm5lY3Rpb25zXzsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbiBvYmplY3RzIGFsbG9jYXRlZCwgYnV0IG5vdCBpbiB1c2UuCisgICAqLworICBzaXplX3QgbnVtSWRsZUNvbm5lY3Rpb25zKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gY29ubmVjdGlvblN0YWNrXy5sZW5ndGg7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBjb25uZWN0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgICAqCisgICAqIFRoaXMgaXMgZGVmaW5lZCBhcyBhIGNvbm5lY3Rpb24gd2hlcmUgYWxsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIGFuZCB0aGUKKyAgICogcHJvY2Vzc29yIHdhcyBpbnZva2VkIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQuCisgICAqLworICBzaXplX3QgbnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG51bUFjdGl2ZVByb2Nlc3NvcnNfOworICB9CisKKyAgLy8vIE51bWJlciBvZiBiaW5kKCkgcmV0cmllcy4KKyAgZW51bSBCSU5EX1JFVFJZX0xJTUlUID0gMDsKKworICAvLy8gRHVyYXRpb24gYmV0d2VlbiBiaW5kKCkgcmV0cmllcy4KKyAgZW51bSBCSU5EX1JFVFJZX0RFTEFZID0gZHVyISJobnNlY3MiKDApOworCisgIC8vLyBXaGV0aGVyIHRvIGxpc3RlbiBvbiBJUHY2IG9ubHksIGlmIElQdjYgc3VwcG9ydCBpcyBkZXRlY3RlZAorICAvLyAoZGVmYXVsdDogZmFsc2UpLgorICB2b2lkIGlwdjZPbmx5KGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaXB2Nk9ubHlfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIHRhc2sgcG9vbCB0byB1c2UgZm9yIHByb2Nlc3NpbmcgcmVxdWVzdHMuIElmIG51bGwsIG5vIGFkZGl0aW9uYWwKKyAgICogdGhyZWFkcyBhcmUgdXNlZCBhbmQgcmVxdWVzdCBhcmUgcHJvY2Vzc2VkIMK7aW5saW5lwqsuCisgICAqCisgICAqIENhbiBzYWZlbHkgYmUgc2V0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZy4KKyAgICovCisgIFRhc2tQb29sIHRhc2tQb29sKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdGFza1Bvb2xfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgdGFza1Bvb2woVGFza1Bvb2wgcG9vbCkgQHByb3BlcnR5IHsKKyAgICB0YXNrUG9vbF8gPSBwb29sOworICB9CisKKyAgLyoqCisgICAqIEh5c3RlcmVzaXMgZm9yIG92ZXJsb2FkIHN0YXRlLgorICAgKgorICAgKiBUaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmxvYWQgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSByZWFjaGVkCisgICAqIGJlZm9yZSB0aGUgb3ZlcmxvYWQgc3RhdGUgaXMgY2xlYXJlZC4gSXQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEsCisgICAqIHByYWN0aWNhbCBjaG9pY2VzIHByb2JhYmx5IGxpZSBiZXR3ZWVuIDAuNSBhbmQgMC45LgorICAgKi8KKyAgZG91YmxlIG92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBvdmVybG9hZEh5c3RlcmVzaXMoZG91YmxlIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UoMCA8IHZhbHVlICYmIHZhbHVlIDw9IDEsCisgICAgICAiSW52YWxpZCB2YWx1ZSBmb3Igb3ZlcmxvYWQgaHlzdGVyZXNpczogIiB+IHRvIXN0cmluZyh2YWx1ZSkpOworICAgIG92ZXJsb2FkSHlzdGVyZXNpc18gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBEaXR0bworICBlbnVtIERFRkFVTFRfT1ZFUkxPQURfSFlTVEVSRVNJUyA9IDAuODsKKworICAvKioKKyAgICogVGhlIGFjdGlvbiB3aGljaCB3aWxsIGJlIHRha2VuIG9uIG92ZXJsb2FkLgorICAgKi8KKyAgVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uOworCisgIC8vLyBEaXR0bworICBlbnVtIERFRkFVTFRfT1ZFUkxPQURfQUNUSU9OID0gVE92ZXJsb2FkQWN0aW9uLk5PTkU7CisKKyAgLyoqCisgICAqIFRoZSB3cml0ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgKGFuZCB3aGVuIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyBpcyBjaGVja2VkCisgICAqIGFuZCBmb3VuZCB0byBiZSBleGNlZWRlZCwgcmVpbml0aWFsaXplZCkgdG8gdGhpcyBzaXplLgorICAgKi8KKyAgc2l6ZV90IHdyaXRlQnVmZmVyRGVmYXVsdFNpemU7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRSA9IDEwMjQ7CisKKyAgLyoqCisgICAqIE1heCByZWFkIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIENvbm5lY3Rpb24uIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAorICAgKiB3ZSB3aWxsIGZyZWUgdGhlIGJ1ZmZlciAoc3VjaCB0aGF0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZCBieSB0aGUgbmV4dAorICAgKiByZWNlaXZlZCBmcmFtZSkgaWYgaXQgaGFzIGV4Y2VlZGVkIHRoaXMgbGltaXQuIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KKyAgICovCisgIHNpemVfdCBpZGxlUmVhZEJ1ZmZlckxpbWl0OworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX0lETEVfUkVBRF9CVUZGRVJfTElNSVQgPSAxMDI0OworCisgIC8qKgorICAgKiBNYXggd3JpdGUgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgY29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAorICAgKiB3ZSBlbnN1cmUgdGhhdCBpdHMgd3JpdGUgYnVmZmVyIGlzIDw9IHRvIHRoaXMgc2l6ZTsgb3RoZXJ3aXNlIHdlCisgICAqIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUgb2Ygd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gYnl0ZXMgdG8gZW5zdXJlIHRoYXQKKyAgICogaWRsZSBjb25uZWN0aW9ucyBkb24ndCBob2cgbWVtb3J5LiAwIGRpc2FibGVzIHRoaXMgY2hlY2suCisgICAqLworICBzaXplX3QgaWRsZVdyaXRlQnVmZmVyTGltaXQ7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfSURMRV9XUklURV9CVUZGRVJfTElNSVQgPSAxMDI0OworCisgIC8qKgorICAgKiBFdmVyeSBOIGNhbGxzIHdlIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSBsaW1pdHMgb24gYSBjb25uZWN0ZWQgQ29ubmVjdGlvbi4KKyAgICogMCBkaXNhYmxlcyAoaS5lLiB0aGUgY2hlY2tzIGFyZSBvbmx5IGRvbmUgd2hlbiBhIGNvbm5lY3Rpb24gY2xvc2VzKS4KKyAgICovCisgIHVpbnQgcmVzaXplQnVmZmVyRXZlcnlOOworCisgIC8vLyBEaXR0bworICBlbnVtIHVpbnQgREVGQVVMVF9SRVNJWkVfQlVGRkVSX0VWRVJZX04gPSA1MTI7CisKKyAgLy8vIExpbWl0IGZvciBob3cgbWFueSBDb25uZWN0aW9uIG9iamVjdHMgdG8gY2FjaGUuCisgIHNpemVfdCBjb25uZWN0aW9uU3RhY2tMaW1pdDsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9DT05ORUNUSU9OX1NUQUNLX0xJTUlUID0gMTAyNDsKKworICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zIGJlZm9yZSBzZXJ2ZXIgZ29lcyBpbnRvIG92ZXJsb2FkCisgIC8vLyBzdGF0ZS4KKyAgc2l6ZV90IG1heENvbm5lY3Rpb25zOworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX01BWF9DT05ORUNUSU9OUyA9IGludC5tYXg7CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2YgY29ubmVjdGlvbnMgcHJvY2Vzc2luZyBvciB3YWl0aW5nIHRvIHByb2Nlc3MKKyAgc2l6ZV90IG1heEFjdGl2ZVByb2Nlc3NvcnM7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfTUFYX0FDVElWRV9QUk9DRVNTT1JTID0gaW50Lm1heDsKKworICAvLy8gTWF4aW11bSBmcmFtZSBzaXplLCBpbiBieXRlcy4KKyAgLy8vCisgIC8vLyBJZiBhIGNsaWVudCB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSBsYXJnZXIgdGhhbiB0aGlzIGxpbWl0LCBpdHMKKyAgLy8vIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQuIFRoaXMgaGVscHMgdG8gYXZvaWQgYWxsb2NhdGluZyBodWdlIGJ1ZmZlcnMKKyAgLy8vIG9uIGJvZ291cyBpbnB1dC4KKyAgdWludCBtYXhGcmFtZVNpemU7CisKKyAgLy8vIERpdHRvCisgIGVudW0gdWludCBERUZBVUxUX01BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CisKKworICBzaXplX3QgbnVtSU9UaHJlYWRzKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbnVtSU9UaHJlYWRzXzsKKyAgfQorCisgIHZvaWQgbnVtSU9UaHJlYWRzKHNpemVfdCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKHZhbHVlID49IDEsIG5ldyBURXhjZXB0aW9uKCJNdXN0IHVzZSBhdCBsZWFzdCBvbmUgSS9PIHRocmVhZC4iKSk7CisgICAgbnVtSU9UaHJlYWRzXyA9IHZhbHVlOworICB9CisKKyAgZW51bSBERUZBVUxUX05VTV9JT19USFJFQURTID0gMTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEMgY2FsbGJhY2sgd3JhcHBlciBhcm91bmQgYWNjZXB0Q29ubmVjdGlvbnMoKS4gRXhwZWN0cyB0aGUgY3VzdG9tIGFyZ3VtZW50CisgICAqIHRvIGJlIHRoZSB0aGlzIHBvaW50ZXIgb2YgdGhlIGFzc29jaWF0ZWQgc2VydmVyIGluc3RhbmNlLgorICAgKi8KKyAgZXh0ZXJuKEMpIHN0YXRpYyB2b2lkIGFjY2VwdENvbm5lY3Rpb25zQ2FsbGJhY2soaW50IGZkLCBzaG9ydCB3aGljaCwKKyAgICB2b2lkKiBzZXJ2ZXJUaGlzCisgICkgeworICAgIChjYXN0KFROb25ibG9ja2luZ1NlcnZlcilzZXJ2ZXJUaGlzKS5hY2NlcHRDb25uZWN0aW9ucyhmZCwgd2hpY2gpOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBieSBsaWJldmVudCAoSU8gbG9vcCAwL3NlcnZlKCkgdGhyZWFkIG9ubHkpIHdoZW4gc29tZXRoaW5nCisgICAqIGhhcHBlbmVkIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorICAgKi8KKyAgdm9pZCBhY2NlcHRDb25uZWN0aW9ucyhpbnQgZmQsIHNob3J0IGV2ZW50RmxhZ3MpIHsKKyAgICBpZiAoYXRvbWljTG9hZChpb0xvb3BzX1swXS5zaHV0dGluZ0Rvd25fKSkgcmV0dXJuOworCisgICAgYXNzZXJ0KCEhbGlzdGVuU29ja2V0XywKKyAgICAgICJTZXJ2ZXIgc2hvdWxkIGJlIHNodXR0aW5nIGRvd24gaWYgbGlzdGVuIHNvY2tldCBpcyBudWxsLiIpOworICAgIGFzc2VydChmZCA9PSBsaXN0ZW5Tb2NrZXRfLmhhbmRsZSk7CisgICAgYXNzZXJ0KGV2ZW50RmxhZ3MgJiBFVl9SRUFEKTsKKworICAgIC8vIEFjY2VwdCBhcyBtYW55IG5ldyBjbGllbnRzIGFzIHBvc3NpYmxlLCBldmVuIHRob3VnaCBsaWJldmVudCBzaWduYWxlZAorICAgIC8vIG9ubHkgb25lLiBUaGlzIGhlbHBzIHRoZSBudW1iZXIgb2YgY2FsbHMgaW50byBsaWJldmVudCBzcGFjZS4KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgLy8gSXQgaXMgbGFtZSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgcmVndWxhciBjb250cm9sIGZsb3cgKGZhaWxpbmcgaXMKKyAgICAgIC8vIGV4Y2VwdGVkIGR1ZSB0byBub24tYmxvY2tpbmcgbW9kZSBvZiBvcGVyYXRpb24pLCBidXQgdGhhdCdzIHRoZQorICAgICAgLy8gaW50ZXJmYWNlIHN0ZC5zb2NrZXQgb2ZmZXJz4oCmCisgICAgICBTb2NrZXQgY2xpZW50U29ja2V0OworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50U29ja2V0ID0gbGlzdGVuU29ja2V0Xy5hY2NlcHQoKTsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEFjY2VwdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlLmVycm9yQ29kZSAhPSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAgIGxvZ0Vycm9yKCJFcnJvciBhY2NlcHRpbmcgY29ubmVjdGlvbjogJXMiLCBlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkLCB0aGlzIGlzIHRoZSBwb2ludCB0byB0YWtlIHRoZSBzcGVjaWZpZWQKKyAgICAgIC8vIGFjdGlvbi4KKyAgICAgIGlmIChvdmVybG9hZEFjdGlvbiAhPSBUT3ZlcmxvYWRBY3Rpb24uTk9ORSAmJiBjaGVja092ZXJsb2FkZWQoKSkgeworICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7CisgICAgICAgIGlmIChvdmVybG9hZEFjdGlvbiA9PSBUT3ZlcmxvYWRBY3Rpb24uQ0xPU0VfT05fQUNDRVBUKSB7CisgICAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudFNvY2tldC5ibG9ja2luZyA9IGZhbHNlOworICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNvdWxkbid0IHNldCBjbGllbnQgc29ja2V0IHRvIG5vbi1ibG9ja2luZyBtb2RlOiAlcyIsIGUpOworICAgICAgICBjbGllbnRTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgYSBuZXcgQ29ubmVjdGlvbiBmb3IgdGhpcyBjbGllbnQgc29ja2V0LgorICAgICAgQ29ubmVjdGlvbiBjb25uID0gdm9pZDsKKyAgICAgIElPTG9vcCBsb29wID0gdm9pZDsKKyAgICAgIGJvb2wgdGhpc1RocmVhZCA9IHZvaWQ7CisgICAgICBzeW5jaHJvbml6ZWQgKGNvbm5lY3Rpb25NdXRleF8pIHsKKyAgICAgICAgLy8gQXNzaWduIGFuIEkvTyBsb29wIHRvIHRoZSBjb25uZWN0aW9uIChyb3VuZC1yb2JpbikuCisgICAgICAgIGFzc2VydChuZXh0SU9Mb29wXyA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KG5leHRJT0xvb3BfIDwgaW9Mb29wc18ubGVuZ3RoKTsKKyAgICAgICAgYXV0byBzZWxlY3RlZFRocmVhZElkeCA9IG5leHRJT0xvb3BfOworICAgICAgICBuZXh0SU9Mb29wXyA9IChuZXh0SU9Mb29wXyArIDEpICUgaW9Mb29wc18ubGVuZ3RoOworCisgICAgICAgIGxvb3AgPSBpb0xvb3BzX1tzZWxlY3RlZFRocmVhZElkeF07CisgICAgICAgIHRoaXNUaHJlYWQgPSAoc2VsZWN0ZWRUaHJlYWRJZHggPT0gMCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gc3RhY2sgdG8gc2VlIGlmIHdlIGNhbiByZS11c2UgYW4gZXhpc3Rpbmcgb25lLgorICAgICAgICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSkgeworICAgICAgICAgICsrbnVtQ29ubmVjdGlvbnNfOworICAgICAgICAgIGNvbm4gPSBuZXcgQ29ubmVjdGlvbihjbGllbnRTb2NrZXQsIGxvb3ApOworCisgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIGRvZXMgbm90IGdldCBjb2xsZWN0ZWQgd2hpbGUgaXQgaXMgYWN0aXZlLAorICAgICAgICAgIC8vIGkuZS4gaG9va2VkIHVwIHdpdGggbGliZXZlbnQuCisgICAgICAgICAgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWNvbm4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbm4gPSBjb25uZWN0aW9uU3RhY2tfWyQgLSAxXTsKKyAgICAgICAgICBjb25uZWN0aW9uU3RhY2tfID0gY29ubmVjdGlvblN0YWNrX1swIC4uICQgLSAxXTsKKyAgICAgICAgICBjb25uZWN0aW9uU3RhY2tfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgICAgICAgICBjb25uLmluaXQoY2xpZW50U29ja2V0LCBsb29wKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBsb29wLmFkZENvbm5lY3Rpb24oKTsKKworICAgICAgLy8gRWl0aGVyIG5vdGlmeSB0aGUgaW9UaHJlYWQgdGhhdCBpcyBhc3NpZ25lZCB0aGlzIGNvbm5lY3Rpb24gdG8KKyAgICAgIC8vIHN0YXJ0IHByb2Nlc3NpbmcsIG9yIGlmIGl0IGlzIHVzLCB3ZSdsbCBqdXN0IGFzayB0aGlzCisgICAgICAvLyBjb25uZWN0aW9uIHRvIGRvIGl0cyBpbml0aWFsIHN0YXRlIGNoYW5nZSBoZXJlLgorICAgICAgLy8KKyAgICAgIC8vIChXZSBuZWVkIHRvIGF2b2lkIHdyaXRpbmcgdG8gb3VyIG93biBub3RpZmljYXRpb24gcGlwZSwgdG8KKyAgICAgIC8vIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrcyBpZiB0aGUgcGlwZSBpcyBmdWxsLikKKyAgICAgIGlmICh0aGlzVGhyZWFkKSB7CisgICAgICAgIGNvbm4udHJhbnNpdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9vcC5ub3RpZnlDb21wbGV0ZWQoY29ubik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIEluY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgIHZvaWQgaW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKKyAgICBhdG9taWNPcCEiKz0iKG51bUFjdGl2ZVByb2Nlc3NvcnNfLCAxKTsKKyAgfQorCisgIC8vLyBEZWNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICB2b2lkIGRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CisgICAgYXNzZXJ0KG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gMCk7CisgICAgYXRvbWljT3AhIi09IihudW1BY3RpdmVQcm9jZXNzb3JzXywgMSk7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lcyBpZiB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICAgKgorICAgKiBJZiB0aGUgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnMgb3Igwrtwcm9jZXNzaW5nwqsgY29ubmVjdGlvbnMgaXMgb3ZlciB0aGUKKyAgICogcmVzcGVjdGl2ZSBsaW1pdCwgdGhlIHNlcnZlciB3aWxsIGVudGVyIG92ZXJsb2FkIGhhbmRsaW5nIG1vZGUgYW5kIGEKKyAgICogd2FybmluZyB3aWxsIGJlIGxvZ2dlZC4gSWYgYmVsb3cgdmFsdWVzIGFyZSBiZWxvdyB0aGUgaHlzdGVyZXNpcyBjdXJ2ZSwKKyAgICogdGhpcyB3aWxsIGNhdXNlIHRoZSBzZXJ2ZXIgdG8gZXhpdCBpdCBhZ2Fpbi4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICAgKi8KKyAgYm9vbCBjaGVja092ZXJsb2FkZWQoKSB7CisgICAgYXV0byBhY3RpdmVDb25uZWN0aW9ucyA9IG51bUNvbm5lY3Rpb25zXyAtIGNvbm5lY3Rpb25TdGFja18ubGVuZ3RoOworICAgIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnMgfHwKKyAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnMgPiBtYXhDb25uZWN0aW9ucykgeworICAgICAgaWYgKCFvdmVybG9hZGVkXykgeworICAgICAgICBsb2dJbmZvKCJFbnRlcmluZyBvdmVybG9hZGVkIHN0YXRlLiIpOworICAgICAgICBvdmVybG9hZGVkXyA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvdmVybG9hZGVkXyAmJgorICAgICAgICAobnVtQWN0aXZlUHJvY2Vzc29yc18gPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heEFjdGl2ZVByb2Nlc3NvcnMpICYmCisgICAgICAgIChhY3RpdmVDb25uZWN0aW9ucyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4Q29ubmVjdGlvbnMpKQorICAgICAgeworICAgICAgICBsb2dJbmZvKCJFeGl0aW5nIG92ZXJsb2FkZWQgc3RhdGUsICVzIGNvbm5lY3Rpb24ocykgZHJvcHBlZCAoJSB0b3RhbCkuIiwKKyAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyk7CisgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKKyAgICAgICAgb3ZlcmxvYWRlZF8gPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3ZlcmxvYWRlZF87CisgIH0KKworICAvKioKKyAgICogTWFya3MgYSBjb25uZWN0aW9uIGFzIGluYWN0aXZlIGFuZCBlaXRoZXIgcHV0cyBpdCBiYWNrIGludG8gdGhlCisgICAqIGNvbm5lY3Rpb24gcG9vbCBvciBsZWF2ZXMgaXQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICovCisgIHZvaWQgZGlzcG9zZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9uTXV0ZXhfKSB7CisgICAgICBpZiAoIWNvbm5lY3Rpb25TdGFja0xpbWl0IHx8CisgICAgICAgIChjb25uZWN0aW9uU3RhY2tfLmxlbmd0aCA8IGNvbm5lY3Rpb25TdGFja0xpbWl0KSkKKyAgICAgIHsKKyAgICAgICAgY29ubmVjdGlvbi5jaGVja0lkbGVCdWZmZXJMaW1pdChpZGxlUmVhZEJ1ZmZlckxpbWl0LAorICAgICAgICAgIGlkbGVXcml0ZUJ1ZmZlckxpbWl0KTsKKyAgICAgICAgY29ubmVjdGlvblN0YWNrXyB+PSBjb25uZWN0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KG51bUNvbm5lY3Rpb25zXyA+IDApOworICAgICAgICAtLW51bUNvbm5lY3Rpb25zXzsKKworICAgICAgICAvLyBMZWF2ZSB0aGUgY29ubmVjdGlvbiBvYmplY3QgZm9yIGNvbGxlY3Rpb24gbm93LgorICAgICAgICBHQy5yZW1vdmVSb290KGNhc3Qodm9pZCopY29ubmVjdGlvbik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIFNvY2tldCB1c2VkIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgYW5kIGFjY2VwdGluZyB0aGVtLgorICBTb2NrZXQgbGlzdGVuU29ja2V0XzsKKworICAvLy8gUG9ydCB0byBsaXN0ZW4gb24uCisgIHVzaG9ydCBwb3J0XzsKKworICAvLy8gV2hldGhlciB0byBsaXN0ZW4gb24gSVB2NiBvbmx5LgorICBib29sIGlwdjZPbmx5XzsKKworICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBjb25uZWN0aW9ucyBleGlzdGluZywgYm90aCBhY3RpdmUgYW5kIGlkbGUuCisgIHNpemVfdCBudW1Db25uZWN0aW9uc187CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUgcHJvY2Vzc29yCisgIC8vLyB0byByZXR1cm4uCisgIHNoYXJlZCBzaXplX3QgbnVtQWN0aXZlUHJvY2Vzc29yc187CisKKyAgLy8vIEh5c3RlcmVzaXMgZm9yIGxlYXZpbmcgb3ZlcmxvYWQgc3RhdGUuCisgIGRvdWJsZSBvdmVybG9hZEh5c3RlcmVzaXNfOworCisgIC8vLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCisgIGJvb2wgb3ZlcmxvYWRlZF87CisKKyAgLy8vIE51bWJlciBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzZXJ2ZXIgZW50ZXJlZCB0aGUgY3VycmVudAorICAvLy8gb3ZlcmxvYWRlZCBzdGF0ZS4KKyAgdWludCBuQ29ubmVjdGlvbnNEcm9wcGVkXzsKKworICAvLy8gTnVtYmVyIG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgZHVlIHRvIG92ZXJsb2FkIHNpbmNlIHRoZSBzZXJ2ZXIgc3RhcnRlZC4KKyAgdWxvbmcgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXzsKKworICAvLy8gVGhlIHRhc2sgcG9vbCB1c2VkIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzLgorICBUYXNrUG9vbCB0YXNrUG9vbF87CisKKyAgLy8vIE51bWJlciBvZiBJTyB0aHJlYWRzIHRoaXMgc2VydmVyIHdpbGwgdXNlICg+PSAxKS4KKyAgc2l6ZV90IG51bUlPVGhyZWFkc187CisKKyAgLy8vIFRoZSBJT0xvb3BzIGFtb25nIHdoaWNoIHNvY2tldCBoYW5kbGluZyB3b3JrIGlzIGRpc3RyaWJ1dGVkLgorICBJT0xvb3BbXSBpb0xvb3BzXzsKKworICAvLy8gVGhlIGluZGV4IG9mIHRoZSBsb29wIGluIGlvTG9vcHNfIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBuZXh0IGFjY2VwdGVkCisgIC8vLyBjb25uZWN0aW9uLgorICBzaXplX3QgbmV4dElPTG9vcF87CisKKyAgLy8vIEFsbCB0aGUgY29ubmVjdGlvbiBvYmplY3RzIHdoaWNoIGhhdmUgYmVlbiBjcmVhdGVkIGJ1dCBhcmUgbm90IGN1cnJlbnRseQorICAvLy8gaW4gdXNlLiBXaGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGl0IGl0IHBsYWNlZCBoZXJlIHRvIGVuYWJsZSBvYmplY3QKKyAgLy8vIChyZXNwLiBidWZmZXIpIHJldXNlLgorICBDb25uZWN0aW9uW10gY29ubmVjdGlvblN0YWNrXzsKKworICAvLy8gVGhpcyBtdXRleCBwcm90ZWN0cyB0aGUgY29ubmVjdGlvbiBzdGFjay4KKyAgTXV0ZXggY29ubmVjdGlvbk11dGV4XzsKK30KKworcHJpdmF0ZSB7CisgIC8qCisgICAqIEVuY2Fwc3VsYXRlcyBhIGxpYmV2ZW50IGV2ZW50IGxvb3AuCisgICAqCisgICAqIFRoZSBkZXNpZ24gaXMgYSBiaXQgb2YgYSBtZXNzLCBzaW5jZSB0aGUgZmlyc3QgbG9vcCBpcyBhY3R1YWxseSBydW4gb24gdGhlCisgICAqIHNlcnZlciB0aHJlYWQgaXRzZWxmIGFuZCBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgaW5zdGFuY2UgZm9yCisgICAqIHdoaWNoIGxpc3RlblNvY2tldF8gaXMgbm90IG51bGwuCisgICAqLworICBmaW5hbCBjbGFzcyBJT0xvb3AgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgZXZlbnQgYmFzZS4KKyAgICAgKgorICAgICAqIElmIGxpc3RlblNvY2tldCBpcyBub3QgbnVsbCwgdGhlIHRocmVhZCB3aWxsIGFsc28gYWNjZXB0IG5ldworICAgICAqIGNvbm5lY3Rpb25zIGl0c2VsZi4KKyAgICAgKi8KKyAgICB0aGlzKFROb25ibG9ja2luZ1NlcnZlciBzZXJ2ZXIsIFNvY2tldCBsaXN0ZW5Tb2NrZXQpIHsKKyAgICAgIHNlcnZlcl8gPSBzZXJ2ZXI7CisgICAgICBsaXN0ZW5Tb2NrZXRfID0gbGlzdGVuU29ja2V0OworICAgICAgaW5pdE11dGV4XyA9IG5ldyBNdXRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBldmVudCBsb29wOyBvbmx5IHJldHVybnMgYWZ0ZXIgYSBjYWxsIHRvIHN0b3AoKS4KKyAgICAgKi8KKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIGFzc2VydCghYXRvbWljTG9hZChpbml0aWFsaXplZF8pLCAiSU9Mb29wIGFscmVhZHkgcnVubmluZz8hIik7CisKKyAgICAgIHN5bmNocm9uaXplZCAoaW5pdE11dGV4XykgeworICAgICAgICBpZiAoYXRvbWljTG9hZChzaHV0dGluZ0Rvd25fKSkgcmV0dXJuOworICAgICAgICBhdG9taWNTdG9yZShpbml0aWFsaXplZF8sIHRydWUpOworCisgICAgICAgIGFzc2VydCghZXZlbnRCYXNlXyk7CisgICAgICAgIGV2ZW50QmFzZV8gPSBldmVudF9iYXNlX25ldygpOworCisgICAgICAgIGlmIChsaXN0ZW5Tb2NrZXRfKSB7CisgICAgICAgICAgLy8gTG9nIHRoZSBsaWJldmVudCB2ZXJzaW9uIGFuZCBiYWNrZW5kLgorICAgICAgICAgIGxvZ0luZm8oImxpYmV2ZW50IHZlcnNpb24gJXMsIHVzaW5nIG1ldGhvZCAlcy4iLAorICAgICAgICAgICAgdG8hc3RyaW5nKGV2ZW50X2dldF92ZXJzaW9uKCkpLCB0byFzdHJpbmcoZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGV2ZW50QmFzZV8pKSk7CisKKyAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnQgZm9yIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorICAgICAgICAgIGxpc3RlbkV2ZW50XyA9IGV2ZW50X25ldyhldmVudEJhc2VfLCBsaXN0ZW5Tb2NrZXRfLmhhbmRsZSwKKyAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNUIHwgRVZfRVQsCisgICAgICAgICAgICBhc3N1bWVOb3Rocm93KCZUTm9uYmxvY2tpbmdTZXJ2ZXIuYWNjZXB0Q29ubmVjdGlvbnNDYWxsYmFjayksCisgICAgICAgICAgICBjYXN0KHZvaWQqKXNlcnZlcl8pOworICAgICAgICAgIGlmIChldmVudF9hZGQobGlzdGVuRXZlbnRfLCBudWxsKSA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oImV2ZW50X2FkZCBmb3IgdGhlIGxpc3RlbmluZyBzb2NrZXQgZXZlbnQgZmFpbGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcGFpciA9IHNvY2tldFBhaXIoKTsKKyAgICAgICAgZm9yZWFjaCAoczsgcGFpcikgcy5ibG9ja2luZyA9IGZhbHNlOworICAgICAgICBjb21wbGV0aW9uU2VuZFNvY2tldF8gPSBwYWlyWzBdOworICAgICAgICBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8gPSBwYWlyWzFdOworCisgICAgICAgIC8vIFJlZ2lzdGVyIGFuIGV2ZW50IGZvciB0aGUgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBzb2NrZXQuCisgICAgICAgIGNvbXBsZXRpb25FdmVudF8gPSBldmVudF9uZXcoZXZlbnRCYXNlXywgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLmhhbmRsZSwKKyAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCB8IEVWX0VULCBhc3N1bWVOb3Rocm93KCZjb21wbGV0ZWRDYWxsYmFjayksCisgICAgICAgICAgY2FzdCh2b2lkKil0aGlzKTsKKworICAgICAgICBpZiAoZXZlbnRfYWRkKGNvbXBsZXRpb25FdmVudF8sIG51bGwpID09IC0xKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oImV2ZW50X2FkZCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBzb2NrZXQgZmFpbGVkLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFJ1biBsaWJldmVudCBlbmdpbmUsIHJldHVybnMgb25seSBhZnRlciBzdG9wKCkuCisgICAgICBldmVudF9iYXNlX2Rpc3BhdGNoKGV2ZW50QmFzZV8pOworCisgICAgICBpZiAobGlzdGVuRXZlbnRfKSB7CisgICAgICAgIGV2ZW50X2ZyZWUobGlzdGVuRXZlbnRfKTsKKyAgICAgICAgbGlzdGVuRXZlbnRfID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgZXZlbnRfZnJlZShjb21wbGV0aW9uRXZlbnRfKTsKKyAgICAgIGNvbXBsZXRpb25FdmVudF8gPSBudWxsOworCisgICAgICBjb21wbGV0aW9uU2VuZFNvY2tldF8uY2xvc2UoKTsKKyAgICAgIGNvbXBsZXRpb25TZW5kU29ja2V0XyA9IG51bGw7CisKKyAgICAgIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5jbG9zZSgpOworICAgICAgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfID0gbnVsbDsKKworICAgICAgZXZlbnRfYmFzZV9mcmVlKGV2ZW50QmFzZV8pOworICAgICAgZXZlbnRCYXNlXyA9IG51bGw7CisKKyAgICAgIGF0b21pY1N0b3JlKHNodXR0aW5nRG93bl8sIGZhbHNlKTsKKworICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBjb25uZWN0aW9uIGhhbmRsZWQgYnkgdGhpcyBsb29wLgorICAgICAqLworICAgIHZvaWQgYWRkQ29ubmVjdGlvbigpIHsKKyAgICAgICsrbnVtQWN0aXZlQ29ubmVjdGlvbnNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3Bvc2VzIGEgY29ubmVjdGlvbiBvYmplY3QgKHR5cGljYWxseSBhZnRlciBpdCBoYXMgYmVlbiBjbG9zZWQpLgorICAgICAqLworICAgIHZvaWQgZGlzcG9zZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICBzZXJ2ZXJfLmRpc3Bvc2VDb25uZWN0aW9uKGNvbm4pOworICAgICAgYXNzZXJ0KG51bUFjdGl2ZUNvbm5lY3Rpb25zXyA+IDApOworICAgICAgLS1udW1BY3RpdmVDb25uZWN0aW9uc187CisgICAgICBpZiAobnVtQWN0aXZlQ29ubmVjdGlvbnNfID09IDApIHsKKyAgICAgICAgaWYgKGF0b21pY0xvYWQoc2h1dHRpbmdEb3duXykpIHsKKyAgICAgICAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBldmVudCBsb29wIHRoYXQgdGhlIGN1cnJlbnQgc3RlcCAoaW5pdGlhbGl6YXRpb24sCisgICAgICogcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QpIG9uIGEgY2VydGFpbiBjb25uZWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUsIGJ1dCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZyb20gdGhlCisgICAgICogdGhyZWFkIHJ1bm5pbmcgdGhlIGxvb3AgaXRzZWxmLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5Q29tcGxldGVkKENvbm5lY3Rpb24gY29ubikgeworICAgICAgYXNzZXJ0KCEhY29tcGxldGlvblNlbmRTb2NrZXRfKTsKKyAgICAgIGF1dG8gYnl0ZXNTZW50ID0gY29tcGxldGlvblNlbmRTb2NrZXRfLnNlbmQoY2FzdCh1Ynl0ZVtdKSgoJmNvbm4pWzAgLi4gMV0pKTsKKworICAgICAgaWYgKGJ5dGVzU2VudCAhPSBDb25uZWN0aW9uLnNpemVvZikgeworICAgICAgICBsb2dFcnJvcigiU2VuZGluZyBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmYWlsZWQsIGNvbm5lY3Rpb24gd2lsbCAiIH4KKyAgICAgICAgICAibm90IGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhpdHMgdGhlIGV2ZW50IGxvb3AgYWZ0ZXIgYWxsIGN1cnJlbnRseSBhY3RpdmUgY29ubmVjdGlvbnMgaGF2ZSBiZWVuCisgICAgICogY2xvc2VkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKSB7CisgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBlaXRoZXIgbGliZXZlbnQgb3IgaXRzIGRvY3VtZW50YXRpb24sIGhhdmluZyBubworICAgICAgLy8gZXZlbnRzIHJlZ2lzdGVyZWQgZG9lc24ndCBhY3R1YWxseSB0ZXJtaW5hdGUgdGhlIGxvb3AsIGJlY2F1c2UKKyAgICAgIC8vIGV2ZW50X2Jhc2VfbmV3KCkgcmVnaXN0ZXJzIHNvbWUgaW50ZXJuYWwgb25lIGJ5IGNhbGxpbmcKKyAgICAgIC8vIGV2dGhyZWFkX21ha2VfYmFzZV9ub3RpZmlhYmxlKCkuCisgICAgICAvLyBEdWUgdG8gdGhpcywgd2UgY2FuJ3Qgc2ltcGx5IHJlbW92ZSBhbGwgZXZlbnRzIGFuZCBleHBlY3QgdGhlIGV2ZW50CisgICAgICAvLyBsb29wIHRvIHRlcm1pbmF0ZS4gSW5zdGVhZCwgd2UgcGluZyB0aGUgZXZlbnQgbG9vcCB1c2luZyBhIG51bGwKKyAgICAgIC8vIGNvbXBsZXRpb24gbWVzc2FnZS4gVGhpcyB3YXksIHdlIG1ha2Ugc3VyZSB0byB3YWtlIHVwIHRoZSBsaWJldmVudAorICAgICAgLy8gdGhyZWFkIGlmIGl0IG5vdCBjdXJyZW50bHkgcHJvY2Vzc2luZyBhbnkgY29ubmVjdGlvbnMuIEl0IHdpbGwgYnJlYWsKKyAgICAgIC8vIG91dCBvZiB0aGUgbG9vcCBpbiBkaXNwb3NlQ29ubmVjdGlvbigpIGFmdGVyIHRoZSBsYXN0IGFjdGl2ZQorICAgICAgLy8gY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuCisgICAgICBzeW5jaHJvbml6ZWQgKGluaXRNdXRleF8pIHsKKyAgICAgICAgYXRvbWljU3RvcmUoc2h1dHRpbmdEb3duXywgdHJ1ZSk7CisgICAgICAgIGlmIChhdG9taWNMb2FkKGluaXRpYWxpemVkXykpIG5vdGlmeUNvbXBsZXRlZChudWxsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDIGNhbGxiYWNrIHRvIGNhbGwgY29tcGxldGVkKCkgZnJvbSBsaWJldmVudC4KKyAgICAgKgorICAgICAqIEV4cGVjdHMgdGhlIGN1c3RvbSBhcmd1bWVudCB0byBiZSB0aGUgdGhpcyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkCisgICAgICogSU9Mb29wIGluc3RhbmNlLgorICAgICAqLworICAgIGV4dGVybihDKSBzdGF0aWMgdm9pZCBjb21wbGV0ZWRDYWxsYmFjayhpbnQgZmQsIHNob3J0IHdoYXQsIHZvaWQqIGxvb3BUaGlzKSB7CisgICAgICBhc3NlcnQod2hhdCAmIEVWX1JFQUQpOworICAgICAgYXV0byBsb29wID0gY2FzdChJT0xvb3ApbG9vcFRoaXM7CisgICAgICBhc3NlcnQoZmQgPT0gbG9vcC5jb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8uaGFuZGxlKTsKKyAgICAgIGxvb3AuY29tcGxldGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgZnJvbSB0aGUgY29tcGxldGlvbiByZWNlaXZlIHNvY2tldCBhbmQgYXBwcm9wcmlhdGVseSB0cmFuc2l0aW9ucworICAgICAqIHRoZSBjb25uZWN0aW9ucyBhbmQgc2h1dHMgZG93biB0aGUgbG9vcCBpZiByZXF1ZXN0ZWQuCisgICAgICovCisgICAgdm9pZCBjb21wbGV0ZWQoKSB7CisgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb247CisgICAgICBwdHJkaWZmX3QgYnl0ZXNSZWFkOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYnl0ZXNSZWFkID0gY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLnJlY2VpdmUoCisgICAgICAgICAgY2FzdCh1Ynl0ZVtdKSgoJmNvbm5lY3Rpb24pWzAgLi4gMV0pKTsKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICBhdXRvIGVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgICAgIGlmIChlcnJubyAhPSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAgICAgbG9nRXJyb3IoIlJlYWRpbmcgZnJvbSBjb21wbGV0aW9uIHNvY2tldCBmYWlsZWQsIHNvbWUgY29ubmVjdGlvbiAiIH4KKyAgICAgICAgICAgICAgIndpbGwgbmV2ZXIgYmUgcHJvcGVybHkgdGVybWluYXRlZDogJXMiLCBzb2NrZXRFcnJub1N0cmluZyhlcnJubykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChieXRlc1JlYWQgIT0gQ29ubmVjdGlvbi5zaXplb2YpIGJyZWFrOworCisgICAgICAgIGlmICghY29ubmVjdGlvbikgeworICAgICAgICAgIGFzc2VydChhdG9taWNMb2FkKHNodXR0aW5nRG93bl8pKTsKKyAgICAgICAgICBpZiAobnVtQWN0aXZlQ29ubmVjdGlvbnNfID09IDApIHsKKyAgICAgICAgICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbm5lY3Rpb24udHJhbnNpdGlvbigpOworICAgICAgfQorCisgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICBsb2dFcnJvcigiVW5leHBlY3RlZCBwYXJ0aWFsIHJlYWQgZnJvbSBjb21wbGV0aW9uIHNvY2tldCAiIH4KKyAgICAgICAgICAiKCVzIGJ5dGVzIGluc3RlYWQgb2YgJXMpLiIsIGJ5dGVzUmVhZCwgQ29ubmVjdGlvbi5zaXplb2YpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBhc3NvY2lhdGVkIHNlcnZlcgorICAgIFROb25ibG9ja2luZ1NlcnZlciBzZXJ2ZXJfOworCisgICAgLy8vIFRoZSBtYW5hZ2VkIGxpc3RlbmluZyBzb2NrZXQsIGlmIGFueS4KKyAgICBTb2NrZXQgbGlzdGVuU29ja2V0XzsKKworICAgIC8vLyBUaGUgbGliZXZlbnQgZXZlbnQgYmFzZSBmb3IgdGhlIGxvb3AuCisgICAgZXZlbnRfYmFzZSogZXZlbnRCYXNlXzsKKworICAgIC8vLyBUcmlnZ2VyZWQgb24gbGlzdGVuIHNvY2tldCBldmVudHMuCisgICAgZXZlbnQqIGxpc3RlbkV2ZW50XzsKKworICAgIC8vLyBUcmlnZ2VyZWQgb24gY29tcGxldGlvbiByZWNlaXZlIHNvY2tldCBldmVudHMuCisgICAgZXZlbnQqIGNvbXBsZXRpb25FdmVudF87CisKKyAgICAvLy8gU29ja2V0IHVzZWQgdG8gc2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBtZXNzYWdlcy4gUGFpcmVkIHdpdGgKKyAgICAvLy8gY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLgorICAgIFNvY2tldCBjb21wbGV0aW9uU2VuZFNvY2tldF87CisKKyAgICAvLy8gU29ja2V0IHVzZWQgdG8gc2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBtZXNzYWdlcy4gUGFpcmVkIHdpdGgKKyAgICAvLy8gY29tcGxldGlvblNlbmRTb2NrZXRfLgorICAgIFNvY2tldCBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF87CisKKyAgICAvLy8gV2hldGhlciB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBzaHV0dGluZyBkb3duIChpLmUuIHRoZSBjYW5jZWxsYXRpb24gaGFzCisgICAgLy8vIGJlZW4gdHJpZ2dlcmVkLCBidXQgbm90IGFsbCBjbGllbnQgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIGNsb3NlZCB5ZXQpLgorICAgIHNoYXJlZCBib29sIHNodXR0aW5nRG93bl87CisKKyAgICAvLy8gVGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGNsaWVudCBjb25uZWN0aW9ucy4KKyAgICBzaXplX3QgbnVtQWN0aXZlQ29ubmVjdGlvbnNfOworCisgICAgLy8vIEd1YXJkcyBsb29wIHN0YXJ0dXAgc28gdGhhdCB0aGUgbG9vcCBjYW4gYmUgcmVsaWFibHkgc2h1dCBkb3duIGV2ZW4gaWYKKyAgICAvLy8gYW5vdGhlciB0aHJlYWQgaGFzIGp1c3Qgc3RhcnRlZCB0byBleGVjdXRlIHJ1bigpLiBMb2NrZWQgZHVyaW5nCisgICAgLy8vIGluaXRpYWxpemF0aW9uIGluIHJ1bigpLiBXaGVuIHVubG9ja2VkLCB0aGUgY29tcGxldGlvbiBtZWNoYW5pc20gaXMKKyAgICAvLy8gZXhwZWN0ZWQgdG8gYmUgZnVsbHkgc2V0IHVwLgorICAgIE11dGV4IGluaXRNdXRleF87CisgICAgc2hhcmVkIGJvb2wgaW5pdGlhbGl6ZWRfOyAvLy8gRGl0dG8KKyAgfQorCisgIC8qCisgICAqIEkvTyBzdGF0ZXMgYSBzb2NrZXQgY2FuIGJlIGluLgorICAgKi8KKyAgZW51bSBTb2NrZXRTdGF0ZSB7CisgICAgUkVDVl9GUkFNRV9TSVpFLCAvLy8gVGhlIGZyYW1lIHNpemUgaXMgcmVjZWl2ZWQuCisgICAgUkVDViwgLy8vIFRoZSBwYXlsb2FkIGlzIHJlY2VpdmVkLgorICAgIFNFTkQgLy8vIFRoZSByZXNwb25zZSBpcyB3cml0dGVuIGJhY2sgb3V0LgorICB9CisKKyAgLyoKKyAgICogU3RhdGVzIGEgY29ubmVjdGlvbiBjYW4gYmUgaW4uCisgICAqLworICBlbnVtIENvbm5lY3Rpb25TdGF0ZSB7CisgICAgSU5JVCwgLy8vIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgUkVBRF9GUkFNRV9TSVpFLCAvLy8gVGhlIGZvdXIgZnJhbWUgc2l6ZSBieXRlcyBhcmUgYmVpbmcgcmVhZC4KKyAgICBSRUFEX1JFUVVFU1QsIC8vLyBUaGUgcmVxdWVzdCBwYXlsb2FkIGl0c2VsZiBpcyBiZWluZyByZWFkLgorICAgIFdBSVRfUFJPQ0VTU09SLCAvLy8gVGhlIGNvbm5lY3Rpb24gd2FpdHMgZm9yIHRoZSBwcm9jZXNzb3IgdG8gZmluaXNoLgorICAgIFNFTkRfUkVTVUxUIC8vLyBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gYmFjayBvdXQuCisgIH0KKworICAvKgorICAgKiBBIGNvbm5lY3Rpb24gdGhhdCBpcyBoYW5kbGVkIHZpYSBsaWJldmVudC4KKyAgICoKKyAgICogRGF0YSByZWNlaXZlZCBpcyBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZSAocmV0dXJuaW5nIGJhY2sgdG8KKyAgICogbGliZXZlbnQgaWYgbm90KSwgYXQgd2hpY2ggcG9pbnQgdGhlIHByb2Nlc3NvciBpcyBpbnZva2VkLgorICAgKi8KKyAgZmluYWwgY2xhc3MgQ29ubmVjdGlvbiB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRvIHJldXNlIGEgY29ubmVjdGlvbiBvYmplY3QgbGF0ZXIgb24sIHRoZSBpbml0KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQKKyAgICAgKiB0byB0aGUgc2FtZSBlZmZlY3Qgb24gdGhlIGludGVybmFsIHN0YXRlLgorICAgICAqLworICAgIHRoaXMoU29ja2V0IHNvY2tldCwgSU9Mb29wIGxvb3ApIHsKKyAgICAgIC8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydCBvYmplY3RzIGFyZSByZXVzZWQgYmV0d2VlbiBjbGllbnRzCisgICAgICAvLyBjb25uZWN0aW9ucywgc28gaW5pdGlhbGl6ZSB0aGVtIGhlcmUgcmF0aGVyIHRoYW4gaW4gaW5pdCgpLgorICAgICAgaW5wdXRUcmFuc3BvcnRfID0gbmV3IFRJbnB1dFJhbmdlVHJhbnNwb3J0ISh1Ynl0ZVtdKShbXSk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfID0gbmV3IFRNZW1vcnlCdWZmZXIobG9vcC5zZXJ2ZXJfLndyaXRlQnVmZmVyRGVmYXVsdFNpemUpOworCisgICAgICBpbml0KHNvY2tldCwgbG9vcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBQYXJhbXM6CisgICAgICogICBzb2NrZXQgPSBUaGUgc29ja2V0IHRvIHdvcmsgb24uCisgICAgICogICBldmVudEZsYWdzID0gQW55IGZsYWdzIHRvIHBhc3MgdG8gbGliZXZlbnQuCisgICAgICogICBzID0gVGhlIHNlcnZlciB0aGlzIGNvbm5lY3Rpb24gaXMgcGFydCBvZi4KKyAgICAgKi8KKyAgICB2b2lkIGluaXQoU29ja2V0IHNvY2tldCwgSU9Mb29wIGxvb3ApIHsKKyAgICAgIC8vIFRPRE86IFRoaXMgYWxsb2NhdGlvbiBjb3VsZCBiZSBhdm9pZGVkLgorICAgICAgc29ja2V0XyA9IG5ldyBUU29ja2V0KHNvY2tldCk7CisKKyAgICAgIGxvb3BfID0gbG9vcDsKKyAgICAgIHNlcnZlcl8gPSBsb29wXy5zZXJ2ZXJfOworICAgICAgY29ublN0YXRlXyA9IENvbm5lY3Rpb25TdGF0ZS5JTklUOworICAgICAgZXZlbnRGbGFnc18gPSAwOworCisgICAgICByZWFkQnVmZmVyUG9zXyA9IDA7CisgICAgICByZWFkV2FudF8gPSAwOworCisgICAgICB3cml0ZUJ1ZmZlcl8gPSBudWxsOworICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKKworICAgICAgc29ja2V0U3RhdGVfID0gU29ja2V0U3RhdGUuUkVDVl9GUkFNRV9TSVpFOworICAgICAgY2FsbHNTaW5jZVJlc2l6ZV8gPSAwOworCisgICAgICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0KKyAgICAgICAgc2VydmVyXy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7CisgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9CisgICAgICAgIHNlcnZlcl8ub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgICAgIGlucHV0UHJvdG9jb2xfID0KKyAgICAgICAgc2VydmVyXy5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKKyAgICAgIG91dHB1dFByb3RvY29sXyA9CisgICAgICAgIHNlcnZlcl8ub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKworICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CisgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9CisgICAgICAgICAgc2VydmVyXy5ldmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICAgIH0KKworICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHNvY2tldF8pOworICAgICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8ucHJvY2Vzc29yRmFjdG9yeS5nZXRQcm9jZXNzb3IoaW5mbyk7CisgICAgfQorCisgICAgfnRoaXMoKSB7CisgICAgICBmcmVlKHJlYWRCdWZmZXJfKTsKKyAgICAgIGlmIChldmVudF8pIHsKKyAgICAgICAgZXZlbnRfZnJlZShldmVudF8pOworICAgICAgICBldmVudF8gPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGJ1ZmZlcnMgYWdhaW5zdCB0aGUgc2l6ZSBsaW1pdHMgYW5kIHNocmluayB0aGVtIGlmIGV4Y2VlZGVkLgorICAgICAqCisgICAgICogUGFyYW1zOgorICAgICAqICAgcmVhZExpbWl0ID0gUmVhZCBidWZmZXIgc2l6ZSBsaW1pdCAoaW4gYnl0ZXMsIDAgdG8gaWdub3JlKS4KKyAgICAgKiAgIHdyaXRlTGltaXQgPSBXcml0ZSBidWZmZXIgc2l6ZSBsaW1pdCAoaW4gYnl0ZXMsIDAgdG8gaWdub3JlKS4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrSWRsZUJ1ZmZlckxpbWl0KHNpemVfdCByZWFkTGltaXQsIHNpemVfdCB3cml0ZUxpbWl0KSB7CisgICAgICBpZiAocmVhZExpbWl0ID4gMCAmJiByZWFkQnVmZmVyU2l6ZV8gPiByZWFkTGltaXQpIHsKKyAgICAgICAgZnJlZShyZWFkQnVmZmVyXyk7CisgICAgICAgIHJlYWRCdWZmZXJfID0gbnVsbDsKKyAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHdyaXRlTGltaXQgPiAwICYmIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID4gd3JpdGVMaW1pdCkgeworICAgICAgICAvLyBqdXN0IHN0YXJ0IG92ZXIKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldChzZXJ2ZXJfLndyaXRlQnVmZmVyRGVmYXVsdFNpemUpOworICAgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNpdGlvbnMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIG5leHQgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBlLmcuIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5IG9yIGFsbAorICAgICAqIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gYmFjay4KKyAgICAgKi8KKyAgICB2b2lkIHRyYW5zaXRpb24oKSB7CisgICAgICBhc3NlcnQoISFsb29wXyk7CisgICAgICBhc3NlcnQoISFzZXJ2ZXJfKTsKKworICAgICAgLy8gU3dpdGNoIHVwb24gdGhlIHN0YXRlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBpbiBhbmQgbW92ZSB0byBhIG5ldyBzdGF0ZQorICAgICAgZmluYWwgc3dpdGNoIChjb25uU3RhdGVfKSB7CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLlJFQURfUkVRVUVTVDoKKyAgICAgICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nIHRoZSByZXF1ZXN0LCBwYWNrYWdlIHRoZSByZWFkIGJ1ZmZlciBpbnRvIHRyYW5zcG9ydAorICAgICAgICAgIC8vIGFuZCBnZXQgYmFjayBzb21lIGRhdGEgZnJvbSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24KKyAgICAgICAgICBpbnB1dFRyYW5zcG9ydF8ucmVzZXQocmVhZEJ1ZmZlcl9bMCAuLiByZWFkQnVmZmVyUG9zX10pOworICAgICAgICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoKTsKKworICAgICAgICAgIC8vIFByZXBlbmQgZm91ciBieXRlcyBvZiBibGFuayBzcGFjZSB0byB0aGUgYnVmZmVyIHNvIHdlIGNhbgorICAgICAgICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgorICAgICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCB3ZSB3b3VsZG4ndCBoYXZlIHRvIHdyaXRlIGFueXRoaW5nLCBqdXN0CisgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBUTWVtb3J5QnVmZmVyIHdyaXRlT2Zmc2V0Xy4gVGhpcyB3b3VsZCB5aWVsZCBhIHRpbnkKKyAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBnYWluLgorICAgICAgICAgIHVieXRlWzRdIHNwYWNlID0gdm9pZDsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRfLndyaXRlKHNwYWNlKTsKKworICAgICAgICAgIHNlcnZlcl8uaW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworCisgICAgICAgICAgdGFza1Bvb2xfID0gc2VydmVyXy50YXNrUG9vbDsKKyAgICAgICAgICBpZiAodGFza1Bvb2xfKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdGFzayBhbmQgYWRkIGl0IHRvIHRoZSB0YXNrIHBvb2wgcXVldWUuCisgICAgICAgICAgICBhdXRvIHByb2Nlc3NpbmdUYXNrID0gdGFzayFwcm9jZXNzUmVxdWVzdCh0aGlzKTsKKyAgICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuV0FJVF9QUk9DRVNTT1I7CisgICAgICAgICAgICB0YXNrUG9vbF8ucHV0KHByb2Nlc3NpbmdUYXNrKTsKKworICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGFueSBtb3JlIGRhdGEgd2hpbGUgdGhlIHRhc2sgaXMgYWN0aXZlLgorICAgICAgICAgICAgdW5yZWdpc3RlckV2ZW50KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSnVzdCBwcm9jZXNzIGl0IHJpZ2h0IG5vdyBpZiB0aGVyZSBpcyBubyB0YXNrIHBvb2wgc2V0LgorICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KHRoaXMpOworICAgICAgICAgIGdvdG8gY2FzZTsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuV0FJVF9QUk9DRVNTT1I6CisgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCwgc2V0IHRoZSBmcmFtZSBzaXplCisgICAgICAgICAgLy8gZm9yIHRoZSBvdXRwdXRUcmFuc3BvcnRfIGNvbnRlbnRzIGFuZCBzZXQgZXZlcnl0aGluZyB1cCB0byB3cml0ZQorICAgICAgICAgIC8vIGl0IG91dCB2aWEgbGliZXZlbnQuCisgICAgICAgICAgc2VydmVyXy5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisKKyAgICAgICAgICAvLyBBY3F1aXJlIHRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIHRyYW5zcG9ydC4KKyAgICAgICAgICAvLyBLTFVER0U6IFRvIGF2b2lkIGNvcHlpbmcsIHdlIHNpbXBseSBjYXN0IHRoZSBjb25zdCBhd2F5IGFuZAorICAgICAgICAgIC8vIG1vZGlmeSB0aGUgaW50ZXJuYWwgYnVmZmVyIG9mIHRoZSBUTWVtb3J5QnVmZmVyIOKAkyB3b3JrcyB3aXRoIHRoZQorICAgICAgICAgIC8vIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGJ1dCBpc24ndCBleGFjdGx5IGJlYXV0aWZ1bC4KKyAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBjYXN0KHVieXRlW10pb3V0cHV0VHJhbnNwb3J0Xy5nZXRDb250ZW50cygpOworCisgICAgICAgICAgYXNzZXJ0KHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gNCwgIlRoZSB3cml0ZSBidWZmZXIgc2hvdWxkIGhhdmUgIiB+CisgICAgICAgICAgICAibGVhc3QgdGhlIGluaXRpYWxseSBhZGRlZCBkdW1teSBsZW5ndGggYnl0ZXMuIik7CisgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyXy5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgd2FzIG9uZS13YXksIG5vIHJlc3BvbnNlIHRvIHdyaXRlLgorICAgICAgICAgICAgZ290byBjYXNlIENvbm5lY3Rpb25TdGF0ZS5JTklUOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFdyaXRlIHRoZSBmcmFtZSBzaXplIGludG8gdGhlIGZvdXIgYnl0ZXMgcmVzZXJ2ZWQgZm9yIGl0LgorICAgICAgICAgIGF1dG8gc2l6ZSA9IGhvc3RUb05ldChjYXN0KHVpbnQpKHdyaXRlQnVmZmVyXy5sZW5ndGggLSA0KSk7CisgICAgICAgICAgd3JpdGVCdWZmZXJfWzAgLi4gNF0gPSBjYXN0KHVieXRlW10pKCgmc2l6ZSlbMCAuLiAxXSk7CisKKyAgICAgICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICAgICAgICAgIHNvY2tldFN0YXRlXyA9IFNvY2tldFN0YXRlLlNFTkQ7CisgICAgICAgICAgY29ublN0YXRlXyA9IENvbm5lY3Rpb25TdGF0ZS5TRU5EX1JFU1VMVDsKKyAgICAgICAgICByZWdpc3RlckV2ZW50KEVWX1dSSVRFIHwgRVZfUEVSU0lTVCk7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLlNFTkRfUkVTVUxUOgorICAgICAgICAgIC8vIFRoZSByZXN1bHQgaGFzIGJlZW4gc2VudCBiYWNrIHRvIHRoZSBjbGllbnQsIHdlIGRvbid0IG5lZWQgdGhlCisgICAgICAgICAgLy8gYnVmZmVycyBhbnltb3JlLgorICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID4gbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8pIHsKKyAgICAgICAgICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gd3JpdGVCdWZmZXJfLmxlbmd0aDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VydmVyXy5yZXNpemVCdWZmZXJFdmVyeU4gPiAwICYmCisgICAgICAgICAgICAgICsrY2FsbHNTaW5jZVJlc2l6ZV8gPj0gc2VydmVyXy5yZXNpemVCdWZmZXJFdmVyeU4KKyAgICAgICAgICApIHsKKyAgICAgICAgICAgIGNoZWNrSWRsZUJ1ZmZlckxpbWl0KHNlcnZlcl8uaWRsZVJlYWRCdWZmZXJMaW1pdCwKKyAgICAgICAgICAgICAgc2VydmVyXy5pZGxlV3JpdGVCdWZmZXJMaW1pdCk7CisgICAgICAgICAgICBjYWxsc1NpbmNlUmVzaXplXyA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ290byBjYXNlOworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5JTklUOgorICAgICAgICAgIHdyaXRlQnVmZmVyXyA9IG51bGw7CisgICAgICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5SRUNWX0ZSQU1FX1NJWkU7CisgICAgICAgICAgY29ublN0YXRlXyA9IENvbm5lY3Rpb25TdGF0ZS5SRUFEX0ZSQU1FX1NJWkU7CisgICAgICAgICAgcmVhZEJ1ZmZlclBvc18gPSAwOworICAgICAgICAgIHJlZ2lzdGVyRXZlbnQoRVZfUkVBRCB8IEVWX1BFUlNJU1QpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5SRUFEX0ZSQU1FX1NJWkU6CisgICAgICAgICAgLy8gV2UganVzdCByZWFkIHRoZSByZXF1ZXN0IGxlbmd0aCwgc2V0IHVwIHRoZSBidWZmZXJzIGZvciByZWFkaW5nCisgICAgICAgICAgLy8gdGhlIHBheWxvYWQuCisgICAgICAgICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgeworICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgYnVmZmVyIGlzIHRvbyBzbWFsbCwgZXhwb25lbnRpYWxseSBncm93IHRoZSBidWZmZXIKKyAgICAgICAgICAgIC8vIHVudGlsIGl0IGlzIGJpZyBlbm91Z2guCisKKyAgICAgICAgICAgIGlmIChyZWFkQnVmZmVyU2l6ZV8gPT0gMCkgeworICAgICAgICAgICAgICByZWFkQnVmZmVyU2l6ZV8gPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIG5ld1NpemUgPSByZWFkQnVmZmVyU2l6ZV87CisgICAgICAgICAgICB3aGlsZSAocmVhZFdhbnRfID4gbmV3U2l6ZSkgeworICAgICAgICAgICAgICBuZXdTaXplICo9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gbmV3QnVmZmVyID0gY2FzdCh1Ynl0ZSopcmVhbGxvYyhyZWFkQnVmZmVyXywgbmV3U2l6ZSk7CisgICAgICAgICAgICBpZiAoIW5ld0J1ZmZlcikgb25PdXRPZk1lbW9yeUVycm9yKCk7CisKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfID0gbmV3QnVmZmVyOworICAgICAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gbmV3U2l6ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWFkQnVmZmVyUG9zXz0gMDsKKworICAgICAgICAgIHNvY2tldFN0YXRlXyA9IFNvY2tldFN0YXRlLlJFQ1Y7CisgICAgICAgICAgY29ublN0YXRlXyA9IENvbm5lY3Rpb25TdGF0ZS5SRUFEX1JFUVVFU1Q7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyoqCisgICAgICogQyBjYWxsYmFjayB0byBjYWxsIHdvcmtTb2NrZXQoKSBmcm9tIGxpYmV2ZW50LgorICAgICAqCisgICAgICogRXhwZWN0cyB0aGUgY3VzdG9tIGFyZ3VtZW50IHRvIGJlIHRoZSB0aGlzIHBvaW50ZXIgb2YgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiBjb25uZWN0aW9uLgorICAgICAqLworICAgIGV4dGVybihDKSBzdGF0aWMgdm9pZCB3b3JrU29ja2V0Q2FsbGJhY2soaW50IGZkLCBzaG9ydCBmbGFncywgdm9pZCogY29ublRoaXMpIHsKKyAgICAgIGF1dG8gY29ubiA9IGNhc3QoQ29ubmVjdGlvbiljb25uVGhpczsKKyAgICAgIGFzc2VydChmZCA9PSBjb25uLnNvY2tldF8uc29ja2V0SGFuZGxlKTsKKyAgICAgIGNvbm4ud29ya1NvY2tldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgbGliZXZlbnQgd2hlbiBzb21ldGhpbmcgaGFwcGVucyBvbiB0aGUgc29ja2V0LgorICAgICAqLworICAgIHZvaWQgd29ya1NvY2tldCgpIHsKKyAgICAgIGZpbmFsIHN3aXRjaCAoc29ja2V0U3RhdGVfKSB7CisgICAgICAgIGNhc2UgU29ja2V0U3RhdGUuUkVDVl9GUkFNRV9TSVpFOgorICAgICAgICAgIC8vIElmIHNvbWUgYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCwgdGhleSBoYXZlIGJlZW4ga2VwdCBpbgorICAgICAgICAgIC8vIHJlYWRXYW50Xy4KKyAgICAgICAgICBhdXRvIGZyYW1lU2l6ZSA9IHJlYWRXYW50XzsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICAgICAgICAgICAgYXV0byBieXRlc1JlYWQgPSBzb2NrZXRfLnJlYWQoCisgICAgICAgICAgICAgIChjYXN0KHVieXRlW10pKCgmZnJhbWVTaXplKVswIC4uIDFdKSlbcmVhZEJ1ZmZlclBvc18gLi4gJF0pOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgIC8vIENvdWxkbid0IHJlYWQgYW55dGhpbmcsIGJ1dCB3ZSBoYXZlIGJlZW4gbm90aWZpZWQg4oCTIGNsaWVudAorICAgICAgICAgICAgICAvLyBoYXMgZGlzY29ubmVjdGVkLgorICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiRmFpbGVkIHRvIHJlYWQgZnJhbWUgc2l6ZSBmcm9tIGNsaWVudCBjb25uZWN0aW9uOiAlcyIsIHRlKTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfIDwgZnJhbWVTaXplLnNpemVvZikgeworICAgICAgICAgICAgLy8gRnJhbWUgc2l6ZSBub3QgY29tcGxldGUgeWV0LCBzYXZlIHRoZSBjdXJyZW50IGJ1ZmZlciBpbgorICAgICAgICAgICAgLy8gcmVhZFdhbnRfIHNvIHRoYXQgdGhlIHJlbWFpbmluZyBieXRlcyBjYW4gYmUgcmVhZCBsYXRlci4KKyAgICAgICAgICAgIHJlYWRXYW50XyA9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRvIHNpemUgPSBuZXRUb0hvc3QoZnJhbWVTaXplKTsKKyAgICAgICAgICBpZiAoc2l6ZSA+IHNlcnZlcl8ubWF4RnJhbWVTaXplKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiRnJhbWUgc2l6ZSB0b28gbGFyZ2UgKCVzID4gJXMpLCBjbGllbnQgJXMgbm90IHVzaW5nICIgfgorICAgICAgICAgICAgICAiVEZyYW1lZFRyYW5zcG9ydD8iLCBzaXplLCBzZXJ2ZXJfLm1heEZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgc29ja2V0Xy5nZXRQZWVyQWRkcmVzcygpLnRvSG9zdE5hbWVTdHJpbmcoKSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICByZWFkV2FudF8gPSBzaXplOworCisgICAgICAgICAgLy8gTm93IHdlIGtub3cgdGhlIGZyYW1lIHNpemUsIHNldCBldmVyeXRoaW5nIHVwIGZvciByZWFkaW5nIHRoZQorICAgICAgICAgIC8vIHBheWxvYWQuCisgICAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYXNlIFNvY2tldFN0YXRlLlJFQ1Y6CisgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBnb3QgYWxsIHRoZSBkYXRhLCB3ZSBzaG91bGQgYmUgaW4gdGhlIFNFTkQgc3RhdGUuCisgICAgICAgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDwgcmVhZFdhbnRfKTsKKworICAgICAgICAgIHNpemVfdCBieXRlc1JlYWQ7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBzb2NrZXQuCisgICAgICAgICAgICBieXRlc1JlYWQgPSBzb2NrZXRfLnJlYWQocmVhZEJ1ZmZlcl9bcmVhZEJ1ZmZlclBvc18gLi4gcmVhZFdhbnRfXSk7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZhaWxlZCB0byByZWFkIGZyb20gY2xpZW50IHNvY2tldDogJXMiLCB0ZSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgICAgICAgLy8gV2Ugd2VyZSBub3RpZmllZCwgYnV0IG5vIGJ5dGVzIGNvdWxkIGJlIHJlYWQgLT4gdGhlIGNsaWVudAorICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkLgorICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWFkQnVmZmVyUG9zXyArPSBieXRlc1JlYWQ7CisgICAgICAgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDw9IHJlYWRXYW50Xyk7CisKKyAgICAgICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPT0gcmVhZFdhbnRfKSB7CisgICAgICAgICAgICAvLyBUaGUgcGF5bG9hZCBoYXMgYmVlbiByZWFkIGNvbXBsZXRlbHksIG1vdmUgb24uCisgICAgICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIFNvY2tldFN0YXRlLlNFTkQ6CisgICAgICAgICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKTsKKworICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJfLmxlbmd0aCkgeworICAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIHNlbmQg4oCTIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwganVzdCBtb3ZlIG9uLgorICAgICAgICAgICAgbG9nSW5mbygiV0FSTklORzogSW4gc2VuZCBzdGF0ZSwgYnV0IG5vIGRhdGEgdG8gc2VuZC5cbiIpOworICAgICAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHNpemVfdCBieXRlc1NlbnQ7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVzU2VudCA9IHNvY2tldF8ud3JpdGVTb21lKHdyaXRlQnVmZmVyX1t3cml0ZUJ1ZmZlclBvc18gLi4gJF0pOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgdG8gY2xpZW50IHNvY2tldDogJXMiLCB0ZSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHdyaXRlQnVmZmVyUG9zXyArPSBieXRlc1NlbnQ7CisgICAgICAgICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKTsKKworICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJfLmxlbmd0aCkgeworICAgICAgICAgICAgLy8gVGhlIHdob2xlIHJlc3BvbnNlIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LCB3ZSBhcmUgZG9uZS4KKyAgICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbGliZXZlbnQgZXZlbnQgZm9yIHdvcmtTb2NrZXQoKSB3aXRoIHRoZSBwYXNzZWQgZmxhZ3MsCisgICAgICogdW5yZWdpc3RlcmluZyB0aGUgcHJldmlvdXMgb25lIChpZiBhbnkpLgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJFdmVudChzaG9ydCBldmVudEZsYWdzKSB7CisgICAgICBpZiAoZXZlbnRGbGFnc18gPT0gZXZlbnRGbGFncykgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIGZsYWdzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBEZWxldGUgdGhlIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQuCisgICAgICB1bnJlZ2lzdGVyRXZlbnQoKTsKKworICAgICAgZXZlbnRGbGFnc18gPSBldmVudEZsYWdzOworCisgICAgICBpZiAoZXZlbnRGbGFncyA9PSAwKSByZXR1cm47CisKKyAgICAgIGlmICghZXZlbnRfKSB7CisgICAgICAgIC8vIElmIHRoZSBldmVudCB3YXMgbm90IGFscmVhZHkgYWxsb2NhdGVkLCBkbyBpdCBub3cuCisgICAgICAgIGV2ZW50XyA9IGV2ZW50X25ldyhsb29wXy5ldmVudEJhc2VfLCBzb2NrZXRfLnNvY2tldEhhbmRsZSwKKyAgICAgICAgICBldmVudEZsYWdzXywgYXNzdW1lTm90aHJvdygmd29ya1NvY2tldENhbGxiYWNrKSwgY2FzdCh2b2lkKil0aGlzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV2ZW50X2Fzc2lnbihldmVudF8sIGxvb3BfLmV2ZW50QmFzZV8sIHNvY2tldF8uc29ja2V0SGFuZGxlLAorICAgICAgICAgIGV2ZW50RmxhZ3NfLCBhc3N1bWVOb3Rocm93KCZ3b3JrU29ja2V0Q2FsbGJhY2spLCBjYXN0KHZvaWQqKXRoaXMpOworICAgICAgfQorCisgICAgICAvLyBBZGQgdGhlIGV2ZW50CisgICAgICBpZiAoZXZlbnRfYWRkKGV2ZW50XywgbnVsbCkgPT0gLTEpIHsKKyAgICAgICAgbG9nRXJyb3IoImV2ZW50X2FkZCgpIGZvciBjbGllbnQgc29ja2V0IGZhaWxlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyB0aGUgY3VycmVudCBsaWJldmVudCBldmVudCwgaWYgYW55LgorICAgICAqLworICAgIHZvaWQgdW5yZWdpc3RlckV2ZW50KCkgeworICAgICAgaWYgKGV2ZW50XyAmJiBldmVudEZsYWdzXyAhPSAwKSB7CisgICAgICAgIGV2ZW50RmxhZ3NfID0gMDsKKyAgICAgICAgaWYgKGV2ZW50X2RlbChldmVudF8pID09IC0xKSB7CisgICAgICAgICAgbG9nRXJyb3IoImV2ZW50X2RlbCgpIGZvciBjbGllbnQgc29ja2V0IGZhaWxlZC4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBjb25uZWN0aW9uIGFuZCByZXR1cm5zIGl0IGJhY2sgdG8gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlKCkgeworICAgICAgdW5yZWdpc3RlckV2ZW50KCk7CisKKyAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgeworICAgICAgICBzZXJ2ZXJfLmV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0XywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXQKKyAgICAgIHNvY2tldF8uY2xvc2UoKTsKKworICAgICAgLy8gY2xvc2UgYW55IGZhY3RvcnkgcHJvZHVjZWQgdHJhbnNwb3J0cy4KKyAgICAgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfLmNsb3NlKCk7CisKKyAgICAgIC8vIFRoaXMgY29ubmVjdGlvbiBvYmplY3QgY2FuIG5vdyBiZSByZXVzZWQuCisgICAgICBsb29wXy5kaXNwb3NlQ29ubmVjdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICAvLy8gVGhlIHNlcnZlciB0aGlzIGNvbm5lY3Rpb24gYmVsb25ncyB0by4KKyAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgc2VydmVyXzsKKworICAgIC8vLyBUaGUgdGFzayBwb29sIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbi4gVGhpcyBpcyBjYWNoZWQgaW5zdGVhZCBvZgorICAgIC8vLyBkaXJlY3RseSB1c2luZyBzZXJ2ZXJfLnRhc2tQb29sIHRvIGF2b2lkIGNvbmZ1c2lvbiBpZiBpdCBpcyBjaGFuZ2VkIGluCisgICAgLy8vIGFub3RoZXIgdGhyZWFkIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZC4KKyAgICBUYXNrUG9vbCB0YXNrUG9vbF87CisKKyAgICAvLy8gVGhlIEkvTyB0aHJlYWQgaGFuZGxpbmcgdGhpcyBjb25uZWN0aW9uLgorICAgIElPTG9vcCBsb29wXzsKKworICAgIC8vLyBUaGUgc29ja2V0IG1hbmFnZWQgYnkgdGhpcyBjb25uZWN0aW9uLgorICAgIFRTb2NrZXQgc29ja2V0XzsKKworICAgIC8vLyBUaGUgbGliZXZlbnQgb2JqZWN0IHVzZWQgZm9yIHJlZ2lzdGVyaW5nIHRoZSB3b3JrU29ja2V0Q2FsbGJhY2suCisgICAgZXZlbnQqIGV2ZW50XzsKKworICAgIC8vLyBMaWJldmVudCBmbGFncworICAgIHNob3J0IGV2ZW50RmxhZ3NfOworCisgICAgLy8vIFNvY2tldCBtb2RlCisgICAgU29ja2V0U3RhdGUgc29ja2V0U3RhdGVfOworCisgICAgLy8vIEFwcGxpY2F0aW9uIHN0YXRlCisgICAgQ29ubmVjdGlvblN0YXRlIGNvbm5TdGF0ZV87CisKKyAgICAvLy8gVGhlIHNpemUgb2YgdGhlIGZyYW1lIHRvIHJlYWQuIElmIHN0aWxsIGluIFJFQURfRlJBTUVfU0laRSBzdGF0ZSwgc29tZQorICAgIC8vLyBvZiB0aGUgYnl0ZXMgbWlnaHQgbm90IGhhdmUgYmVlbiB3cml0dGVuLCBhbmQgdGhlIHZhbHVlIG1pZ2h0IHN0aWxsIGJlCisgICAgLy8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gQW4gdWludCAobm90IGEgc2l6ZV90KSBiZWNhdXNlIHRoZSBmcmFtZSBzaXplIG9uCisgICAgLy8vIHRoZSB3aXJlIGlzIHNwZWNpZmllZCBhcyBvbmUuCisgICAgdWludCByZWFkV2FudF87CisKKyAgICAvLy8gVGhlIHBvc2l0aW9uIGluIHRoZSByZWFkIGJ1ZmZlciwgaS5lLiB0aGUgbnVtYmVyIG9mIHBheWxvYWQgYnl0ZXMKKyAgICAvLy8gYWxyZWFkeSByZWNlaXZlZCBmcm9tIHRoZSBzb2NrZXQgaW4gUkVBRF9SRVFVRVNUIHN0YXRlLCByZXNwLiB0aGUKKyAgICAvLy8gbnVtYmVyIG9mIHNpemUgYnl0ZXMgaW4gUkVBRF9GUkFNRV9TSVpFIHN0YXRlLgorICAgIHVpbnQgcmVhZEJ1ZmZlclBvc187CisKKyAgICAvLy8gUmVhZCBidWZmZXIKKyAgICB1Ynl0ZSogcmVhZEJ1ZmZlcl87CisKKyAgICAvLy8gUmVhZCBidWZmZXIgc2l6ZQorICAgIHNpemVfdCByZWFkQnVmZmVyU2l6ZV87CisKKyAgICAvLy8gV3JpdGUgYnVmZmVyCisgICAgdWJ5dGVbXSB3cml0ZUJ1ZmZlcl87CisKKyAgICAvLy8gSG93IGZhciB0aHJvdWdoIHdyaXRpbmcgYXJlIHdlPworICAgIHNpemVfdCB3cml0ZUJ1ZmZlclBvc187CisKKyAgICAvLy8gTGFyZ2VzdCBzaXplIG9mIHdyaXRlIGJ1ZmZlciBzZWVuIHNpbmNlIGJ1ZmZlciB3YXMgY29uc3RydWN0ZWQKKyAgICBzaXplX3QgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV87CisKKyAgICAvLy8gTnVtYmVyIG9mIGNhbGxzIHNpbmNlIHRoZSBsYXN0IHRpbWUgY2hlY2tJZGxlQnVmZmVyTGltaXQgaGFzIGJlZW4KKyAgICAvLy8gaW52b2tlZCAoc2VlIFRTZXJ2ZXIucmVzaXplQnVmZmVyRXZlcnlOKS4KKyAgICB1aW50IGNhbGxzU2luY2VSZXNpemVfOworCisgICAgLy8vIEJhc2UgdHJhbnNwb3J0cyB0aGUgcHJvY2Vzc29yIHJlYWRzIGZyb20vd3JpdGVzIHRvLgorICAgIFRJbnB1dFJhbmdlVHJhbnNwb3J0ISh1Ynl0ZVtdKSBpbnB1dFRyYW5zcG9ydF87CisgICAgVE1lbW9yeUJ1ZmZlciBvdXRwdXRUcmFuc3BvcnRfOworCisgICAgLy8vIFRoZSBhY3R1YWwgdHJhbnNwb3J0cyBwYXNzZWQgdG8gdGhlIHByb2Nlc3NvciBvYnRhaW5lZCB2aWEgdGhlCisgICAgLy8vIHRyYW5zcG9ydCBmYWN0b3J5LgorICAgIFRUcmFuc3BvcnQgZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKKyAgICBUVHJhbnNwb3J0IGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfOyAvLy8gRGl0dG8KKworICAgIC8vLyBJbnB1dC9vdXRwdXQgcHJvdG9jb2xzLCBjb25uZWN0ZWQgdG8gZmFjdG9yeXtJbnB1dCwgT3V0cHV0fVRyYW5zcG9ydC4KKyAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbF87CisgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sXzsgLy8vIERpdHRvLgorCisgICAgLy8vIENvbm5lY3Rpb24gY29udGV4dCBvcHRpb25hbGx5IGNyZWF0ZWQgYnkgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyLgorICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHRfOworCisgICAgLy8vIFRoZSBwcm9jZXNzb3IgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLgorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKyAgfQorfQorCisvKgorICogVGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBmdW5jdGlvbiwgd2hpY2ggaW52b2tlcyB0aGUgcHJvY2Vzc29yIGZvciB0aGUgc2VydmVyCisgKiBmb3IgYWxsIHRoZSBSUEMgbWVzc2FnZXMgcmVjZWl2ZWQgb3ZlciBhIGNvbm5lY3Rpb24uCisgKgorICogTXVzdCBiZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyBwYXNzZWQgYXMgYWxpYXMgdG8gc3RkLnBhcmFsbGVsaXNtLnRhc2soKS4KKyAqLwordm9pZCBwcm9jZXNzUmVxdWVzdChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgdHJ5IHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgd2l0aCAoY29ubmVjdGlvbikgeworICAgICAgICBpZiAoc2VydmVyXy5ldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICBzZXJ2ZXJfLmV2ZW50SGFuZGxlci5wcmVQcm9jZXNzKGNvbm5lY3Rpb25Db250ZXh0Xywgc29ja2V0Xyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2Nlc3Nvcl8ucHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0XykgfHwgIWlucHV0UHJvdG9jb2xfLnRyYW5zcG9ydC5wZWVrKCkKKyAgICAgICAgKSB7CisgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgZnVuZGFtZW50YWxseSB3cm9uZyBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8KKyAgICAgICAgICAvLyBwcm9jZXNzLCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOworICB9CisKKyAgaWYgKGNvbm5lY3Rpb24udGFza1Bvb2xfKSBjb25uZWN0aW9uLmxvb3BfLm5vdGlmeUNvbXBsZXRlZChjb25uZWN0aW9uKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3Quc2VydmVyOworCisgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGUgaW5mbyBsb2cgb3V0cHV0IGluIG9yZGVyIG5vdCB0byBzcGFtIHRoZSB0ZXN0IHJlc3VsdHMKKyAgLy8gd2l0aCBzdGFydHVwIGluZm8gbWVzc2FnZXMuCisgIGF1dG8gb2xkSW5mb0xvZ1NpbmsgPSBnX2luZm9Mb2dTaW5rOworICBnX2luZm9Mb2dTaW5rID0gbnVsbDsKKyAgc2NvcGUgKGV4aXQpIGdfaW5mb0xvZ1NpbmsgPSBvbGRJbmZvTG9nU2luazsKKworICAvLyBUZXN0IGluLWxpbmUgcHJvY2Vzc2luZyBzaHV0ZG93biB3aXRoIG9uZSBhcyB3ZWxsIGFzIHNldmVyYWwgSS9PIHRocmVhZHMuCisgIHRlc3RTZXJ2ZUNhbmNlbCEoVE5vbmJsb2NraW5nU2VydmVyKSgpOworICB0ZXN0U2VydmVDYW5jZWwhKFROb25ibG9ja2luZ1NlcnZlcikoKFROb25ibG9ja2luZ1NlcnZlciBzKSB7CisgICAgcy5udW1JT1RocmVhZHMgPSA0OworICB9KTsKKworICAvLyBUZXN0IHRhc2sgcG9vbCBwcm9jZXNzaW5nIHNodXRkb3duIHdpdGggb25lIGFzIHdlbGwgYXMgc2V2ZXJhbCBJL08gdGhyZWFkcy4KKyAgYXV0byB0cCA9IG5ldyBUYXNrUG9vbCg0KTsKKyAgdHAuaXNEYWVtb24gPSB0cnVlOworICB0ZXN0U2VydmVDYW5jZWwhKFROb25ibG9ja2luZ1NlcnZlcikoKFROb25ibG9ja2luZ1NlcnZlciBzKSB7CisgICAgcy50YXNrUG9vbCA9IHRwOworICB9KTsKKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKChUTm9uYmxvY2tpbmdTZXJ2ZXIgcykgeworICAgIHMudGFza1Bvb2wgPSB0cDsKKyAgICBzLm51bUlPVGhyZWFkcyA9IDQ7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJhNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnNpbXBsZTsKKworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogVGhlIG1vc3QgYmFzaWMgc2VydmVyLgorICoKKyAqIEl0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgYWZ0ZXIgaXQgYWNjZXB0cyBhIGNvbm5lY3Rpb25zLCBpdCBwcm9jZXNzZXMKKyAqIHJlcXVlc3RzIG9uIGl0IHVudGlsIGl0IGNsb3NlcywgdGhlbiB3YWl0aW5nIGZvciB0aGUgbmV4dCBjb25uZWN0aW9uLgorICoKKyAqIEl0IGlzIG5vdCBzbyBtdWNoIG9mIHVzZSBpbiBwcm9kdWN0aW9uIHRoYW4gaXQgaXMgZm9yIHdyaXRpbmcgdW5pdHRlc3RzLCBvcgorICogYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gcHJvdmlkZSBhIGN1c3RvbSBUU2VydmVyIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBzZXJ2ZShUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7CisgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0OworICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQ7CisgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbDsKKyAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy5hY2NlcHQoY2FuY2VsbGF0aW9uKTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9IGNhdGNoIChUQ2FuY2VsbGVkRXhjZXB0aW9uIHRjeCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBhY2NlcHQ6ICVzIiwgdHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJDYXVnaHQgVEV4Y2VwdGlvbiBvbiBhY2NlcHQ6ICVzIiwgdHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpOworICAgICAgYXV0byBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5mbyk7CisKKyAgICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQ7CisgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0KKyAgICAgICAgICBldmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgZXZlbnRIYW5kbGVyLnByZVByb2Nlc3MoY29ubmVjdGlvbkNvbnRleHQsIGNsaWVudCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KSB8fCAhaW5wdXRQcm90b2NvbC50cmFuc3BvcnQucGVlaygpCisgICAgICAgICAgKSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCBmdW5kYW1lbnRsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgICAvLyBwcm9jZXNzLCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOworICAgICAgfQorCisgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLAorICAgICAgICAgIG91dHB1dFByb3RvY29sKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJJbnB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIk91dHB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlNlcnZlciB0cmFuc3BvcnQgZmFpbGVkIHRvIGNsb3NlKCk6ICVzIiwgZSk7CisgICAgfQorICB9Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKyAgdGVzdFNlcnZlQ2FuY2VsIVRTaW1wbGVTZXJ2ZXIoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGU3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci50YXNrcG9vbDsKKworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbTsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIEEgc2VydmVyIHdoaWNoIGRpc3BhdGNoZXMgY2xpZW50IHJlcXVlc3RzIHRvIGEgc3RkLnBhcmFsbGVsaXNtIFRhc2tQb29sLgorICovCitjbGFzcyBUVGFza1Bvb2xTZXJ2ZXIgOiBUU2VydmVyIHsKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgICAgaWYgKHRhc2tQb29sKSB7CisgICAgICB0aGlzLnRhc2tQb29sID0gdGFza1Bvb2w7CisgICAgfSBlbHNlIHsKKyAgICAgIGF1dG8gcHRwID0gc3RkLnBhcmFsbGVsaXNtLnRhc2tQb29sOworICAgICAgaWYgKHB0cC5zaXplID4gMCkgeworICAgICAgICB0YXNrUG9vbF8gPSBwdHA7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgZ2xvYmFsIHRhc2sgcG9vbCBpcyBlbXB0eSAoZGVmYXVsdCBvbiBhIHNpbmdsZS1jb3JlIG1hY2hpbmUpLAorICAgICAgICAvLyBjcmVhdGUgYSBuZXcgb25lIHdpdGggYSBzaW5nbGUgd29ya2VyIHRocmVhZC4gVGhlIHJhdGlvbmFsZSBmb3IgdGhpcworICAgICAgICAvLyBpcyB0byBhdm9pZCB0aGF0IGFuIGFwcGxpY2F0aW9uIHdoaWNoIHdvcmtlZCBmaW5lIHdpdGggbm8gdGFzayBwb29sCisgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0IG9uIHRoZSBtdWx0aS1jb3JlIGRldmVsb3BlciBib3hlcyBzdWRkZW5seSBmYWlscyBvbiBhCisgICAgICAgIC8vIHNpbmdsZS1jb3JlIHVzZXIgbWFjaGluZS4KKyAgICAgICAgdGFza1Bvb2xfID0gbmV3IFRhc2tQb29sKDEpOworICAgICAgICB0YXNrUG9vbF8uaXNEYWVtb24gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKKworICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgYXV0byBxdWV1ZVN0YXRlID0gUXVldWVTdGF0ZSgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBzdGlsbCBoYW5kbGUgbW9yZSBjb25uZWN0aW9ucy4KKyAgICAgIGlmIChtYXhBY3RpdmVDb25ucykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlU3RhdGUubXV0ZXgpIHsKKyAgICAgICAgICB3aGlsZSAocXVldWVTdGF0ZS5hY3RpdmVDb25ucyA+PSBtYXhBY3RpdmVDb25ucykgeworICAgICAgICAgICAgcXVldWVTdGF0ZS5jb25uQ2xvc2VkLndhaXQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7CisgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0OworICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQ7CisgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbDsKKyAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy5hY2NlcHQoY2FuY2VsbGF0aW9uKTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9IGNhdGNoIChUQ2FuY2VsbGVkRXhjZXB0aW9uIHRjZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBhY2NlcHQ6ICVzIiwgdHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJDYXVnaHQgVEV4Y2VwdGlvbiBvbiBhY2NlcHQ6ICVzIiwgdHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpOworICAgICAgYXV0byBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5mbyk7CisKKyAgICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgICArK3F1ZXVlU3RhdGUuYWN0aXZlQ29ubnM7CisgICAgICB9CisgICAgICB0YXNrUG9vbF8ucHV0KHRhc2shd29ya2VyKHF1ZXVlU3RhdGUsIGNsaWVudCwgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wsIHByb2Nlc3NvciwgZXZlbnRIYW5kbGVyKSk7CisgICAgfQorCisgICAgLy8gRmlyc3QsIHN0b3AgYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucy4KKyAgICB0cnkgeworICAgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlNlcnZlciB0cmFuc3BvcnQgZmFpbGVkIHRvIGNsb3NlOiAlcyIsIGUpOworICAgIH0KKworICAgIC8vIFRoZW4sIHdhaXQgdW50aWwgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucyBhcmUgZmluaXNoZWQuCisgICAgc3luY2hyb25pemVkIChxdWV1ZVN0YXRlLm11dGV4KSB7CisgICAgICB3aGlsZSAocXVldWVTdGF0ZS5hY3RpdmVDb25ucyA+IDApIHsKKyAgICAgICAgcXVldWVTdGF0ZS5jb25uQ2xvc2VkLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgdGFzayBwb29sIHRvIHVzZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGdsb2JhbCBzdGQucGFyYWxsZWxpc20gdGFza1Bvb2wgaW5zdGFuY2UgaXMgdXNlZCwgd2hpY2gKKyAgICogbWlnaHQgbm90IGJlIGFwcHJvcHJpYXRlIGZvciBtYW55IGFwcGxpY2F0aW9ucywgZS5nLiB3aGVyZSB0dW5pbmcgdGhlCisgICAqIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBpcyBkZXNpcmVkLiAoT24gc2luZ2xlLWNvcmUgc3lzdGVtcywgYSBwcml2YXRlCisgICAqIHRhc2sgcG9vbCB3aXRoIGEgc2luZ2xlIHRocmVhZCBpcyB1c2VkIGJ5IGRlZmF1bHQsIHNpbmNlIHRoZSBnbG9iYWwKKyAgICogdGFza1Bvb2wgaW5zdGFuY2UgaGFzIG5vIHdvcmtlciB0aHJlYWRzIHRoZW4uKQorICAgKgorICAgKiBOb3RlOiBUVGFza1Bvb2xTZXJ2ZXIgZXhwZWN0cyB0aGF0IHRhc2tzIGFyZSBuZXZlciBkcm9wcGVkIGZyb20gdGhlIHBvb2wsCisgICAqIGUuZy4gYnkgY2FsbGluZyBUYXNrUG9vbC5jbG9zZSgpIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCB0YXNrcyBpbiB0aGUKKyAgICogcXVldWUuIElmIHRoaXMgaGFwcGVucywgc2VydmUoKSB3aWxsIG5ldmVyIHJldHVybi4KKyAgICovCisgIHZvaWQgdGFza1Bvb2woVGFza1Bvb2wgcG9vbCkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKHBvb2wgIWlzIG51bGwsICJDYW5ub3QgdXNlIGEgbnVsbCB0YXNrIHBvb2wuIik7CisgICAgZW5mb3JjZShwb29sLnNpemUgPiAwLCAiQ2Fubm90IHVzZSBhIHRhc2sgcG9vbCB3aXRoIG5vIHdvcmtlciB0aHJlYWRzLiIpOworICAgIHRhc2tQb29sXyA9IHBvb2w7CisgIH0KKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNsaWVudCBjb25uZWN0aW9ucyBvcGVuIGF0IHRoZSBzYW1lIHRpbWUuIFplcm8gZm9yCisgICAqIG5vIGxpbWl0LCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKyAgICoKKyAgICogSWYgdGhpcyBsaW1pdCBpcyByZWFjaGVkLCBubyBjbGllbnRzIGFyZSBhY2NlcHQoKWVkIGZyb20gdGhlIHNlcnZlcgorICAgKiB0cmFuc3BvcnQgYW55IGxvbmdlciB1bnRpbCBhbm90aGVyIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGFnYWluLgorICAgKi8KKyAgc2l6ZV90IG1heEFjdGl2ZUNvbm5zOworCitwcm90ZWN0ZWQ6CisgIFRhc2tQb29sIHRhc2tQb29sXzsKK30KKworLy8gQ2Fubm90IGJlIHByaXZhdGUgYXMgd29ya2VyIGhhcyB0byBiZSBwYXNzZWQgYXMgYWxpYXMgcGFyYW1ldGVyIHRvCisvLyBhbm90aGVyIG1vZHVsZS4KKy8vIHByaXZhdGUgeworICAvKgorICAgKiBUaGUgc3RhdGUgb2YgdGhlIMK7Y29ubmVjdGlvbiBxdWV1ZcKrLCBpLmUuIHVzZWQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgaG93CisgICAqIG1hbnkgY2xpZW50IGNvbm5lY3Rpb25zIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2VkLgorICAgKi8KKyAgc3RydWN0IFF1ZXVlU3RhdGUgeworICAgIC8vLyBQcm90ZWN0cyB0aGUgcXVldWUgc3RhdGUuCisgICAgTXV0ZXggbXV0ZXg7CisKKyAgICAvLy8gVGhlIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKGZyb20gdGhlIHRpbWUgdGhleSBhcmUgYWNjZXB0KCllZAorICAgIC8vLyB1bnRpbCB0aGV5IGFyZSBjbG9zZWQgd2hlbiB0aGUgd29ya2VkIHRhc2sgZmluaXNoZXMpLgorICAgIHNpemVfdCBhY3RpdmVDb25uczsKKworICAgIC8vLyBTaWduYWxzIHRoYXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgaGFzIGJlZW4gZGVjcmVhc2VkLCBpLmUuCisgICAgLy8vIHRoYXQgYSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4KKyAgICBDb25kaXRpb24gY29ubkNsb3NlZDsKKworICAgIC8vLyBSZXR1cm5zIGFuIGluaXRpYWxpemVkIGluc3RhbmNlLgorICAgIHN0YXRpYyBRdWV1ZVN0YXRlIG9wQ2FsbCgpIHsKKyAgICAgIFF1ZXVlU3RhdGUgcTsKKyAgICAgIHEubXV0ZXggPSBuZXcgTXV0ZXg7CisgICAgICBxLmNvbm5DbG9zZWQgPSBuZXcgQ29uZGl0aW9uKHEubXV0ZXgpOworICAgICAgcmV0dXJuIHE7CisgICAgfQorICB9CisKKyAgdm9pZCB3b3JrZXIocmVmIFF1ZXVlU3RhdGUgcXVldWVTdGF0ZSwgVFRyYW5zcG9ydCBjbGllbnQsCisgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpCisgIHsKKyAgICBzY29wZSAoZXhpdCkgeworICAgICAgc3luY2hyb25pemVkIChxdWV1ZVN0YXRlLm11dGV4KSB7CisgICAgICAgIGFzc2VydChxdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zID4gMCk7CisgICAgICAgIC0tcXVldWVTdGF0ZS5hY3RpdmVDb25uczsKKyAgICAgICAgcXVldWVTdGF0ZS5jb25uQ2xvc2VkLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKworICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQ7CisgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgY29ubmVjdGlvbkNvbnRleHQgPQorICAgICAgICBldmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXIucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpIHx8ICFpbnB1dFByb3RvY29sLnRyYW5zcG9ydC5wZWVrKCkKKyAgICAgICAgKSB7CisgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgZnVuZGFtZW50bGx5IHdyb25nIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0bworICAgICAgICAgIC8vIHByb2Nlc3MsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsCisgICAgICAgIG91dHB1dFByb3RvY29sKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaW5wdXRQcm90b2NvbC50cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIklucHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgb3V0cHV0UHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJPdXRwdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIkNsaWVudCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgIH0KKy8vIH0KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3Quc2VydmVyOworICB0ZXN0U2VydmVDYW5jZWwhVFRhc2tQb29sU2VydmVyKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBjYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudGhyZWFkZWQ7CisKK2ltcG9ydCBjb3JlLnRocmVhZDsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIEEgc2ltcGxlIHRocmVhZGVkIHNlcnZlciB3aGljaCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBjb25uZWN0aW9uLgorICovCitjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyIHsKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBzZXJ2ZShUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICB0cnkgeworICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJsaXN0ZW4oKSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgIGF1dG8gd29ya2VyVGhyZWFkcyA9IG5ldyBUaHJlYWRHcm91cCgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydDsKKyAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0OworICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2w7CisgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KGNhbmNlbGxhdGlvbik7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfSBjYXRjaCAoVENhbmNlbGxlZEV4Y2VwdGlvbiB0Y2UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gYWNjZXB0OiAlcyIsIHR0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2F1Z2h0IFRFeGNlcHRpb24gb24gYWNjZXB0OiAlcyIsIHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworICAgICAgYXV0byB3b3JrZXIgPSBuZXcgV29ya2VyVGhyZWFkKGNsaWVudCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgIHByb2Nlc3NvciwgZXZlbnRIYW5kbGVyKTsKKyAgICAgIHdvcmtlclRocmVhZHMuYWRkKHdvcmtlcik7CisgICAgICB3b3JrZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlNlcnZlciB0cmFuc3BvcnQgZmFpbGVkIHRvIGNsb3NlOiAlcyIsIGUpOworICAgIH0KKyAgICB3b3JrZXJUaHJlYWRzLmpvaW5BbGwoKTsKKyAgfQorfQorCisvLyBUaGUgd29ya2VyIHRocmVhZCBoYW5kbGluZyBhIGNsaWVudCBjb25uZWN0aW9uLgorcHJpdmF0ZSBjbGFzcyBXb3JrZXJUaHJlYWQgOiBUaHJlYWQgeworICB0aGlzKFRUcmFuc3BvcnQgY2xpZW50LCBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sLAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcikKKyAgeworICAgIGNsaWVudF8gPSBjbGllbnQ7CisgICAgaW5wdXRQcm90b2NvbF8gPSBpbnB1dFByb3RvY29sOworICAgIG91dHB1dFByb3RvY29sXyA9IG91dHB1dFByb3RvY29sOworICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKworICAgIHN1cGVyKCZydW4pOworICB9CisKKyAgdm9pZCBydW4oKSB7CisgICAgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dDsKKyAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgY29ubmVjdGlvbkNvbnRleHQgPQorICAgICAgICBldmVudEhhbmRsZXJfLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVQcm9jZXNzKGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnRfKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJvY2Vzc29yXy5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sCisgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpIHx8ICFpbnB1dFByb3RvY29sXy50cmFuc3BvcnQucGVlaygpCisgICAgICAgICkgeworICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGxseSB3cm9uZyBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8KKyAgICAgICAgICAvLyBwcm9jZXNzLCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOworICAgIH0KKworICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICBldmVudEhhbmRsZXJfLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2xfLAorICAgICAgICBvdXRwdXRQcm90b2NvbF8pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpbnB1dFByb3RvY29sXy50cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIklucHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgb3V0cHV0UHJvdG9jb2xfLnRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiT3V0cHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgY2xpZW50Xy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiQ2xpZW50IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBUVHJhbnNwb3J0IGNsaWVudF87CisgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sXzsKKyAgVFByb3RvY29sIG91dHB1dFByb3RvY29sXzsKKyAgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworICBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKyAgdGVzdFNlcnZlQ2FuY2VsIVRUaHJlYWRlZFNlcnZlcigpOworfQorCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRlMTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CisKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFNvbWUga2luZCBvZiBJL08gZGV2aWNlIGVuYWJsaW5nIHNlcnZlcnMgdG8gbGlzdGVuIGZvciBpbmNvbWluZyBjbGllbnQKKyAqIGNvbm5lY3Rpb25zIGFuZCBjb21tdW5pY2F0ZSB3aXRoIHRoZW0gdmlhIGEgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKi8KK2ludGVyZmFjZSBUU2VydmVyVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIFN0YXJ0cyBsaXN0ZW5pbmcgZm9yIHNlcnZlciBjb25uZWN0aW9ucy4KKyAgICoKKyAgICogSnVzdCBhcyBzaW1saWFyIGZ1bmN0aW9ucyBjb21tb25seSBmb3VuZCBpbiBzb2NrZXQgbGlicmFyaWVzLCB0aGlzCisgICAqIGZ1bmN0aW9uIGRvZXMgbm90IGJsb2NrLgorICAgKgorICAgKiBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBub3RoaW5nIGhhcHBlbnMuCisgICAqCisgICAqIFRocm93czogVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBsaXN0ZW5pbmcgZmFpbGVkIG9yIHRoZSB0cmFuc3BvcnQKKyAgICogICB3YXMgYWxyZWFkeSBsaXN0ZW5pbmcuCisgICAqLworICB2b2lkIGxpc3RlbigpOworCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHNlcnZlciB0cmFuc3BvcnQsIGNhdXNpbmcgaXQgdG8gc3RvcCBsaXN0ZW5pbmcuCisgICAqCisgICAqIFRocm93czogVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNwb3J0IHdhcyBub3QgbGlzdGVuaW5nLgorICAgKi8KKyAgdm9pZCBjbG9zZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNlcnZlciB0cmFuc3BvcnQgaXMgY3VycmVudGx5IGxpc3RlbmluZy4KKyAgICovCisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIEFjY2VwdHMgYSBjbGllbnQgY29ubmVjdGlvbiBhbmQgcmV0dXJucyBhbiBvcGVuZWQgVFRyYW5zcG9ydCBmb3IgaXQsCisgICAqIG5ldmVyIHJldHVybmluZyBudWxsLgorICAgKgorICAgKiBCbG9ja3MgdW50aWwgYSBjbGllbnQgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjYW5jZWxsYXRpb24gPSBJZiB0cmlnZ2VyZWQsIHJlcXVlc3RzIHRoZSBjYWxsIHRvIHN0b3AgYmxvY2tpbmcgYW5kCisgICAqICAgICByZXR1cm4gd2l0aCBhIFRDYW5jZWxsZWRFeGNlcHRpb24uIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0bworICAgKiAgICAgaWdub3JlIHRoaXMgaWYgdGhleSBjYW5ub3QgcHJvdmlkZSBhIHJlYXNvbmFibGUuCisgICAqCisgICAqIFRocm93czogVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhY2NlcHRpbmcgZmFpbGVkLAorICAgKiAgIFRDYW5jZWxsZWRFeGNlcHRpb24gaWYgaXQgd2FzIGNhbmNlbGxlZC4KKyAgICovCisgIFRUcmFuc3BvcnQgYWNjZXB0KFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgb3V0IChyZXN1bHQpIHsKKyAgICBhc3NlcnQocmVzdWx0ICFpcyBudWxsKTsKKyAgfQorfQorCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uLgorICovCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVHlwZSB7CisgICAgLy8vCisgICAgVU5LTk9XTiwKKworICAgIC8vLyBUaGUgc2VydmVyIHNvY2tldCBpcyBub3QgbGlzdGVuaW5nLCBidXQgZXhjZXB0ZWQgdG8gYmUuCisgICAgTk9UX0xJU1RFTklORywKKworICAgIC8vLyBUaGUgc2VydmVyIHNvY2tldCBpcyBhbHJlYWR5IGxpc3RlbmluZywgYnV0IGV4cGVjdGVkIG5vdCB0byBiZS4KKyAgICBBTFJFQURZX0xJU1RFTklORywKKworICAgIC8vLyBBbiBvcGVyYXRpb24gb24gdGhlIHByaW1hcnkgdW5kZXJseWluZyByZXNvdXJjZSwgZS5nLiBhIHNvY2tldCB1c2VkCisgICAgLy8vIGZvciBhY2NlcHRpbmcgY29ubmVjdGlvbnMsIGZhaWxlZC4KKyAgICBSRVNPVVJDRV9GQUlMRUQKKyAgfQorCisgIC8vLworICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7CisgICAgdGhpcyhlcnJvck1zZyh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHRoaXMobXNnLCBUeXBlLlVOS05PV04sIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgLy8vCisgIFR5cGUgdHlwZSgpIGNvbnN0IG5vdGhyb3cgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworcHJvdGVjdGVkOgorICBUeXBlIHR5cGVfOworCitwcml2YXRlOgorICBzdHJpbmcgZXJyb3JNc2coVHlwZSB0eXBlKSB7CisgICAgc3RyaW5nIG1zZyA9ICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAiOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUeXBlLlVOS05PV046IG1zZyB+PSAiVW5rbm93biBzZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbiI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLk5PVF9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBub3QgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuQUxSRUFEWV9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBhbHJlYWR5IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLlJFU09VUkNFX0ZBSUxFRDogbXNnIH49ICJBbiB1bmRlcmx5aW5nIHJlc291cmNlIGZhaWxlZCI7IGJyZWFrOworICAgICAgZGVmYXVsdDogbXNnIH49ICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG1zZzsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2ZDgwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zb2NrZXQuZApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKKworaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBEdXJhdGlvbiwgVGhyZWFkOworaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJlcnJvcjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudXRpbC5hd2FpdGFibGU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCitwcml2YXRlIGFsaWFzIFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gU1RFOworCisvKioKKyAqIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4KKyAqCisgKiBNYXBzIHRvIHN0ZC5zb2NrZXQgbGlzdGVuKCkvYWNjZXB0KCk7IG9ubHkgcHJvdmlkZXMgVENQL0lQIHNvY2tldHMgKGkuZS4gbm8KKyAqIFVuaXggc29ja2V0cykgZm9yIG5vdywgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIGluIHN0ZC5zb2NrZXQuCisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwb3J0ID0gVGhlIFRDUCBwb3J0IHRvIGxpc3RlbiBhdCAoaG9zdCBpcyBhbHdheXMgMC4wLjAuMCkuCisgICAqICAgc2VuZFRpbWVvdXQgPSBUaGUgc29ja2V0IHNlbmRpbmcgdGltZW91dC4KKyAgICogICByZWN2VGltb3V0ID0gVGhlIHNvY2tldCByZWNlaXZpbmcgdGltZW91dC4KKyAgICovCisgIHRoaXModXNob3J0IHBvcnQsIER1cmF0aW9uIHNlbmRUaW1lb3V0ID0gZHVyISJobnNlY3MiKDApLAorICAgIER1cmF0aW9uIHJlY3ZUaW1lb3V0ID0gZHVyISJobnNlY3MiKDApKQorICB7CisgICAgcG9ydF8gPSBwb3J0OworICAgIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OworICAgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworCisgICAgY2FuY2VsbGF0aW9uTm90aWZpZXJfID0gbmV3IFRTb2NrZXROb3RpZmllcjsKKworICAgIHNvY2tldFNldF8gPSBuZXcgU29ja2V0U2V0OworICB9CisKKyAgLy8vIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgc29ja2V0IGxpc3RlbnMgYXQuCisgIHVzaG9ydCBwb3J0KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9ydF87CisgIH0KKworICAvLy8gVGhlIHNvY2tldCBzZW5kaW5nIHRpbWVvdXQsIHplcm8gdG8gYmxvY2sgaW5maW5pdGVseS4KKyAgdm9pZCBzZW5kVGltZW91dChEdXJhdGlvbiBzZW5kVGltZW91dCkgQHByb3BlcnR5IHsKKyAgICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKKyAgfQorCisgIC8vLyBUaGUgc29ja2V0IHJlY2VpdmluZyB0aW1lb3V0LCB6ZXJvIHRvIGJsb2NrIGluZmluaXRlbHkuCisgIHZvaWQgcmVjdlRpbWVvdXQoRHVyYXRpb24gcmVjdlRpbWVvdXQpIEBwcm9wZXJ0eSB7CisgICAgcmVjdlRpbWVvdXRfID0gcmVjdlRpbWVvdXQ7CisgIH0KKworICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmluZyByZXRyaWVzIGlmIGl0IGZhaWxzLgorICB2b2lkIHJldHJ5TGltaXQodXNob3J0IHJldHJ5TGltaXQpIEBwcm9wZXJ0eSB7CisgICAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OworICB9CisKKyAgLy8vIFRoZSBkZWxheSBiZXR3ZWVuIGEgbGlzdGVuaW5nIGF0dGVtcHQgZmFpbGluZyBhbmQgcmV0cnlpbmcgaXQuCisgIHZvaWQgcmV0cnlEZWxheShEdXJhdGlvbiByZXRyeURlbGF5KSBAcHJvcGVydHkgeworICAgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKKyAgfQorCisgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgVENQIHNlbmQgYnVmZmVyLCBpbiBieXRlcy4KKyAgdm9pZCB0Y3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSBAcHJvcGVydHkgeworICAgIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKKyAgfQorCisgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgVENQIHJlY2VpdmluZyBidWZmZXIsIGluIGJ5dGVzLgorICB2b2lkIHRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIEBwcm9wZXJ0eSB7CisgICAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOworICB9CisKKyAgLy8vIFdoZXRoZXIgdG8gbGlzdGVuIG9uIElQdjYgb25seSwgaWYgSVB2NiBzdXBwb3J0IGlzIGRldGVjdGVkCisgIC8vLyAoZGVmYXVsdDogZmFsc2UpLgorICB2b2lkIGlwdjZPbmx5KGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaXB2Nk9ubHlfID0gdmFsdWU7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGxpc3RlbigpIHsKKyAgICBlbmZvcmNlKCFpc0xpc3RlbmluZywgbmV3IFNURShTVEUuVHlwZS5BTFJFQURZX0xJU1RFTklORykpOworCisgICAgc2VydmVyU29ja2V0XyA9IG1ha2VTb2NrZXRBbmRMaXN0ZW4ocG9ydF8sIEFDQ0VQVF9CQUNLTE9HLCByZXRyeUxpbWl0XywKKyAgICAgIHJldHJ5RGVsYXlfLCB0Y3BTZW5kQnVmZmVyXywgdGNwUmVjdkJ1ZmZlcl8sIGlwdjZPbmx5Xyk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGVuZm9yY2UoaXNMaXN0ZW5pbmcsIG5ldyBTVEUoU1RFLlR5cGUuTk9UX0xJU1RFTklORykpOworCisgICAgc2VydmVyU29ja2V0Xy5zaHV0ZG93bihTb2NrZXRTaHV0ZG93bi5CT1RIKTsKKyAgICBzZXJ2ZXJTb2NrZXRfLmNsb3NlKCk7CisgICAgc2VydmVyU29ja2V0XyA9IG51bGw7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzTGlzdGVuaW5nKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gc2VydmVyU29ja2V0XyAhaXMgbnVsbDsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgY29ubmVjdGlvbnMgbGlzdGVuKCkgYmFja2xvZ3MuCisgIGVudW0gQUNDRVBUX0JBQ0tMT0cgPSAxMDI0OworCisgIG92ZXJyaWRlIFRUcmFuc3BvcnQgYWNjZXB0KFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIGVuZm9yY2UoaXNMaXN0ZW5pbmcsIG5ldyBTVEUoU1RFLlR5cGUuTk9UX0xJU1RFTklORykpOworCisgICAgaWYgKGNhbmNlbGxhdGlvbikgY2FuY2VsbGF0aW9uTm90aWZpZXJfLmF0dGFjaChjYW5jZWxsYXRpb24udHJpZ2dlcmluZyk7CisgICAgc2NvcGUgKGV4aXQpIGlmIChjYW5jZWxsYXRpb24pIGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5kZXRhY2goKTsKKworCisgICAgLy8gVG9vIG1hbnkgRUlOVFJzIGlzIGEgZmF1bHQgY29uZGl0aW9uIGFuZCB3b3VsZCBuZWVkIHRvIGJlIGhhbmRsZWQKKyAgICAvLyBtYW51YWxseSBieSBvdXIgY2FsbGVyLCBidXQgd2UgY2FuIHRvbGVyYXRlIGEgY2VydGFpbiBudW1iZXIuCisgICAgZW51bSBNQVhfRUlOVFJTID0gMTA7CisgICAgdWludCBudW1FaW50cnM7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc29ja2V0U2V0Xy5yZXNldCgpOworICAgICAgc29ja2V0U2V0Xy5hZGQoc2VydmVyU29ja2V0Xyk7CisgICAgICBzb2NrZXRTZXRfLmFkZChjYW5jZWxsYXRpb25Ob3RpZmllcl8uc29ja2V0KTsKKworICAgICAgYXV0byByZXQgPSBTb2NrZXQuc2VsZWN0KHNvY2tldFNldF8sIG51bGwsIG51bGwpOworICAgICAgZW5mb3JjZShyZXQgIT0gMCwgbmV3IFNURSgiU29ja2V0LnNlbGVjdCgpIHJldHVybmVkIDAuIiwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKSk7CisKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIC8vIFNlbGVjdCBpdHNlbGYgZmFpbGVkLCBjaGVjayBpZiBpdCB3YXMganVzdCBkdWUgdG8gYW4gaW50ZXJydXB0ZWQKKyAgICAgICAgLy8gc3lzY2FsbC4KKyAgICAgICAgaWYgKGdldFNvY2tldEVycm5vKCkgPT0gSU5URVJSVVBURURfRVJSTk8pIHsKKyAgICAgICAgICBpZiAobnVtRWludHJzKysgPCBNQVhfRUlOVFJTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNURSgiU29ja2V0LnNlbGVjdCgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAoRUlOVFIpICIgfgorICAgICAgICAgICAgICAibW9yZSB0aGFuICIgfiB0byFzdHJpbmcoTUFYX0VJTlRSUykgfiAiIHRpbWVzLiIsCisgICAgICAgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRAorICAgICAgICAgICAgKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFNURSgiVW5rbm93biBlcnJvciBvbiBTb2NrZXQuc2VsZWN0KCk6ICIgfgorICAgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGdldFNvY2tldEVycm5vKCkpLCBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgcGluZyBvbiB0aGUgaW50ZXJydXB0IHNvY2tldC4KKyAgICAgICAgaWYgKHNvY2tldFNldF8uaXNTZXQoY2FuY2VsbGF0aW9uTm90aWZpZXJfLnNvY2tldCkpIHsKKyAgICAgICAgICBjYW5jZWxsYXRpb24udGhyb3dJZlRyaWdnZXJlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBoYXZpbmcgYSBjb25uZWN0aW9uIHdhaXRpbmcuCisgICAgICAgIGlmIChzb2NrZXRTZXRfLmlzU2V0KHNlcnZlclNvY2tldF8pKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgYXV0byBjbGllbnQgPSBjcmVhdGVUU29ja2V0KHNlcnZlclNvY2tldF8uYWNjZXB0KCkpOworICAgICAgY2xpZW50LnNlbmRUaW1lb3V0ID0gc2VuZFRpbWVvdXRfOworICAgICAgY2xpZW50LnJlY3ZUaW1lb3V0ID0gcmVjdlRpbWVvdXRfOworICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNURSgiVW5rbm93biBlcnJvciBvbiBhY2NlcHRpbmc6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEFsbG93cyBkZXJpdmVkIGNsYXNzZXMgdG8gY3JlYXRlIGEgZGlmZmVyZW50IFRTb2NrZXQgdHlwZS4KKyAgICovCisgIFRTb2NrZXQgY3JlYXRlVFNvY2tldChTb2NrZXQgc29ja2V0KSB7CisgICAgcmV0dXJuIG5ldyBUU29ja2V0KHNvY2tldCk7CisgIH0KKworcHJpdmF0ZToKKyAgdXNob3J0IHBvcnRfOworICBEdXJhdGlvbiBzZW5kVGltZW91dF87CisgIER1cmF0aW9uIHJlY3ZUaW1lb3V0XzsKKyAgdXNob3J0IHJldHJ5TGltaXRfOworICBEdXJhdGlvbiByZXRyeURlbGF5XzsKKyAgdWludCB0Y3BTZW5kQnVmZmVyXzsKKyAgdWludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBpcHY2T25seV87CisKKyAgU29ja2V0IHNlcnZlclNvY2tldF87CisgIFRTb2NrZXROb3RpZmllciBjYW5jZWxsYXRpb25Ob3RpZmllcl87CisKKyAgLy8gS2VlcCBzb2NrZXQgc2V0IGJldHdlZW4gYWNjZXB0KCkgY2FsbHMgdG8gYXZvaWQgcmVhbGxvY2F0aW5nLgorICBTb2NrZXRTZXQgc29ja2V0U2V0XzsKK30KKworU29ja2V0IG1ha2VTb2NrZXRBbmRMaXN0ZW4odXNob3J0IHBvcnQsIGludCBiYWNrbG9nLCB1c2hvcnQgcmV0cnlMaW1pdCwKKyAgRHVyYXRpb24gcmV0cnlEZWxheSwgdWludCB0Y3BTZW5kQnVmZmVyID0gMCwgdWludCB0Y3BSZWN2QnVmZmVyID0gMCwKKyAgYm9vbCBpcHY2T25seSA9IGZhbHNlCispIHsKKyAgQWRkcmVzcyBsb2NhbEFkZHI7CisgIHRyeSB7CisgICAgLy8gbnVsbCByZXByZXNlbnRzIHRoZSB3aWxkY2FyZCBhZGRyZXNzLgorICAgIGF1dG8gYWRkckluZm9zID0gZ2V0QWRkcmVzc0luZm8obnVsbCwgdG8hc3RyaW5nKHBvcnQpLAorICAgICAgQWRkcmVzc0luZm9GbGFncy5QQVNTSVZFLCBTb2NrZXRUeXBlLlNUUkVBTSwgUHJvdG9jb2xUeXBlLlRDUCk7CisgICAgZm9yZWFjaCAoaSwgYWk7IGFkZHJJbmZvcykgeworICAgICAgLy8gUHJlZmVyIHRvIGJpbmQgdG8gSVB2NiBhZGRyZXNzZXMsIGJlY2F1c2UgdGhlbiBJUHY0IGlzIGxpc3RlbmVkIHRvIGFzCisgICAgICAvLyB3ZWxsLCBidXQgbm90IHRoZSBvdGhlciB3YXkgcm91bmQuCisgICAgICBpZiAoYWkuZmFtaWx5ID09IEFkZHJlc3NGYW1pbHkuSU5FVDYgfHwgaSA9PSAoYWRkckluZm9zLmxlbmd0aCAtIDEpKSB7CisgICAgICAgIGxvY2FsQWRkciA9IGFpLmFkZHJlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIGFkZHJlc3MgdG8gbGlzdGVuIG9uLiIsCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQsIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgIH0KKworICBTb2NrZXQgc29ja2V0OworICB0cnkgeworICAgIHNvY2tldCA9IG5ldyBTb2NrZXQobG9jYWxBZGRyLmFkZHJlc3NGYW1pbHksIFNvY2tldFR5cGUuU1RSRUFNLAorICAgICAgUHJvdG9jb2xUeXBlLlRDUCk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGNyZWF0ZSBhY2NlcHRpbmcgc29ja2V0OiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgfQorCisgIHRyeSB7CisgICAgc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5JUFY2LCBTb2NrZXRPcHRpb24uSVBWNl9WNk9OTFksIGlwdjZPbmx5KTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAvLyBUaGlzIGlzIHNvbWV3aGF0IGV4cGVjdGVkIG9uIG9sZGVyIHN5c3RlbXMgKGUuZy4gcHJlLVZpc3RhIFdpbmRvd3MpLAorICAgIC8vIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZSBJUFY2X1Y2T05MWSBmbGFnIHlldC4gUmFjeSBmbGFnIGp1c3QgdG8gYXZvaWQKKyAgICAvLyBsb2cgc3BldyBpbiB1bml0IHRlc3RzLgorICAgIHNoYXJlZCBzdGF0aWMgd2FybmVkID0gZmFsc2U7CisgICAgaWYgKCF3YXJuZWQpIHsKKyAgICAgIGxvZ0Vycm9yKCJDb3VsZCBub3Qgc2V0IElQVjZfVjZPTkxZIHNvY2tldCBvcHRpb246ICVzIiwgZSk7CisgICAgICB3YXJuZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGFsaWFzIFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCBsdmxTb2NrOworCisgIC8vIFByZXZlbnQgMiBtYXhpbXVtIHNlZ2VtZW50IGxpZmV0aW1lIGRlbGF5IG9uIGFjY2VwdC4KKyAgdHJ5IHsKKyAgICBzb2NrZXQuc2V0T3B0aW9uKGx2bFNvY2ssIFNvY2tldE9wdGlvbi5SRVVTRUFERFIsIHRydWUpOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBzZXQgUkVVU0VBRERSIHNvY2tldCBvcHRpb246ICIgfiB0byFzdHJpbmcoZSksCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICB9CisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMuCisgIGlmICh0Y3BTZW5kQnVmZmVyID4gMCkgeworICAgIHRyeSB7CisgICAgICBzb2NrZXQuc2V0T3B0aW9uKGx2bFNvY2ssIFNvY2tldE9wdGlvbi5TTkRCVUYsIHRjcFNlbmRCdWZmZXIpOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3Qgc2V0IHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgIH0KKyAgfQorCisgIGlmICh0Y3BSZWN2QnVmZmVyID4gMCkgeworICAgIHRyeSB7CisgICAgICBzb2NrZXQuc2V0T3B0aW9uKGx2bFNvY2ssIFNvY2tldE9wdGlvbi5SQ1ZCVUYsIHRjcFJlY3ZCdWZmZXIpOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3Qgc2V0IHJlY2VpdmUgc2VuZCBidWZmZXIgc2l6ZTogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICB9CisgIH0KKworICAvLyBUdXJuIGxpbmdlciBvZmYgdG8gYXZvaWQgYmxvY2tpbmcgb24gc29ja2V0IGNsb3NlLgorICB0cnkgeworICAgIExpbmdlciBsOworICAgIGwub24gPSAwOworICAgIGwudGltZSA9IDA7CisgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uTElOR0VSLCBsKTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3QgZGlzYWJsZSBzb2NrZXQgbGluZ2VyOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgfQorCisgIC8vIFNldCBUQ1BfTk9ERUxBWS4KKyAgdHJ5IHsKKyAgICBzb2NrZXQuc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlRDUCwgU29ja2V0T3B0aW9uLlRDUF9OT0RFTEFZLCB0cnVlKTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3QgZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobTogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICB1c2hvcnQgcmV0cmllczsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB0cnkgeworICAgICAgc29ja2V0LmJpbmQobG9jYWxBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbikge30KKworICAgIC8vIElmIGJpbmQoKSB3b3JrZWQsIHdlIGJyZWFrZWQgb3V0c2lkZSB0aGUgbG9vcCBhYm92ZS4KKyAgICByZXRyaWVzKys7CisgICAgaWYgKHJldHJpZXMgPCByZXRyeUxpbWl0KSB7CisgICAgICBUaHJlYWQuc2xlZXAocmV0cnlEZWxheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBTVEUodGV4dCgiQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzczogIiwgbG9jYWxBZGRyKSwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICB9CisgIH0KKworICBzb2NrZXQubGlzdGVuKGJhY2tsb2cpOworICByZXR1cm4gc29ja2V0OworfQorCit1bml0dGVzdCB7CisgIC8vIFRlc3QgaW50ZXJydXB0KCkuCisgIHsKKyAgICBhdXRvIHNvY2sgPSBuZXcgVFNlcnZlclNvY2tldCgwKTsKKyAgICBzb2NrLmxpc3RlbigpOworICAgIHNjb3BlIChleGl0KSBzb2NrLmNsb3NlKCk7CisKKyAgICBhdXRvIGNhbmNlbGxhdGlvbiA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworCisgICAgYXV0byBpbnRUaHJlYWQgPSBuZXcgVGhyZWFkKHsKKyAgICAgIC8vIFNsZWVwIGZvciBhIGJpdCB1bnRpbCB0aGUgc29ja2V0IGlzIGFjY2VwdGluZy4KKyAgICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1MCkpOworICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXIoKTsKKyAgICB9KTsKKyAgICBpbnRUaHJlYWQuc3RhcnQoKTsKKworICAgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICAgIGFzc2VydFRocm93biFUQ2FuY2VsbGVkRXhjZXB0aW9uKHNvY2suYWNjZXB0KGNhbmNlbGxhdGlvbikpOworICB9CisKKyAgLy8gVGVzdCByZWNlaXZlKCkgdGltZW91dCBvbiBhY2NlcHRlZCBjbGllbnQgc29ja2V0cy4KKyAgeworICAgIGltbXV0YWJsZSBwb3J0ID0gMTExMjI7CisgICAgYXV0byB0aW1lb3V0ID0gZHVyISJtc2VjcyIoNTAwKTsKKyAgICBhdXRvIHNlcnZlclNvY2sgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCB0aW1lb3V0LCB0aW1lb3V0KTsKKyAgICBzZXJ2ZXJTb2NrLmxpc3RlbigpOworICAgIHNjb3BlIChleGl0KSBzZXJ2ZXJTb2NrLmNsb3NlKCk7CisKKyAgICBhdXRvIGNsaWVudFNvY2sgPSBuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCk7CisgICAgY2xpZW50U29jay5vcGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIGNsaWVudFNvY2suY2xvc2UoKTsKKworICAgIHNoYXJlZCBib29sIGhhc1RpbWVkT3V0OworICAgIGF1dG8gcmVjdlRocmVhZCA9IG5ldyBUaHJlYWQoeworICAgICAgYXV0byBzb2NrID0gc2VydmVyU29jay5hY2NlcHQoKTsKKyAgICAgIHVieXRlWzFdIGRhdGE7CisgICAgICB0cnkgeworICAgICAgICBzb2NrLnJlYWQoZGF0YSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKSB7CisgICAgICAgICAgaGFzVGltZWRPdXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGltcG9ydCBzdGQuc3RkaW87CisgICAgICAgICAgc3RkZXJyLndyaXRlbG4oZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICByZWN2VGhyZWFkLmlzRGFlbW9uID0gdHJ1ZTsKKyAgICByZWN2VGhyZWFkLnN0YXJ0KCk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgdGltZW91dCwgd2l0aCBhIGxpdHRsZSBiaXQgb2Ygc3BhcmUgdGltZS4KKyAgICBUaHJlYWQuc2xlZXAodGltZW91dCArIGR1ciEibXNlY3MiKDUwKSk7CisgICAgZW5mb3JjZShoYXNUaW1lZE91dCwKKyAgICAgICJDbGllbnQgc29ja2V0IHJlY2VpdmUoKSBibG9ja2VkIGZvciBsb25nZXIgdGhhbiByZWN2VGltZW91dC4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDlkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc3NsLmQKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNzbDsKKworaW1wb3J0IHN0ZC5kYXRldGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBTb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKKworLyoqCisgKiBBIHNlcnZlciB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdXNpbmcgU1NMLWVuY3J5cHRlZCBzb2NrZXRzLgorICoKKyAqIE5vdGU6CisgKiBPbiBQb3NpeCBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBCU0Qtc3BlY2lmaWMgU09fTk9TSUdQSVBFIGZsYWcsIHlvdQorICogbWlnaHQgd2FudCB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLCBhcyBPcGVuU1NMIG1pZ2h0IHRyeSB0byB3cml0ZSB0bworICogYSBjbG9zZWQgc29ja2V0IGlmIHRoZSBwZWVyIGRpc2Nvbm5lY3RzIGFicnVwdGx5OgorICogLS0tCisgKiBpbXBvcnQgY29yZS5zdGRjLnNpZ25hbDsKKyAqIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zaWduYWw7CisgKiBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgKiAtLS0KKyAqCisgKiBTZWU6IHRocmlmdC50cmFuc3BvcnQuc3NsLgorICovCitjbGFzcyBUU1NMU2VydmVyU29ja2V0IDogVFNlcnZlclNvY2tldCB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRTU0xTZXJ2ZXJTb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwb3J0ID0gVGhlIHBvcnQgb24gd2hpY2ggdG8gbGlzdGVuLgorICAgKiAgIHNzbENvbnRleHQgPSBUaGUgVFNTTENvbnRleHQgdG8gdXNlIGZvciBjcmVhdGluZyBjbGllbnQKKyAgICogICAgIHNvY2tldHMuIE11c3QgYmUgaW4gc2VydmVyLXNpZGUgbW9kZS4KKyAgICovCisgIHRoaXModXNob3J0IHBvcnQsIFRTU0xDb250ZXh0IHNzbENvbnRleHQpIHsKKyAgICBzdXBlcihwb3J0KTsKKyAgICBzZXRTU0xDb250ZXh0KHNzbENvbnRleHQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgVFNTTFNlcnZlclNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBvcnQgPSBUaGUgcG9ydCBvbiB3aGljaCB0byBsaXN0ZW4uCisgICAqICAgc2VuZFRpbWVvdXQgPSBUaGUgc2VuZCB0aW1lb3V0IHRvIHNldCBvbiB0aGUgY2xpZW50IHNvY2tldHMuCisgICAqICAgcmVjdlRpbWVvdXQgPSBUaGUgcmVjZWl2ZSB0aW1lb3V0IHRvIHNldCBvbiB0aGUgY2xpZW50IHNvY2tldHMuCisgICAqICAgc3NsQ29udGV4dCA9IFRoZSBUU1NMQ29udGV4dCB0byB1c2UgZm9yIGNyZWF0aW5nIGNsaWVudAorICAgKiAgICAgc29ja2V0cy4gTXVzdCBiZSBpbiBzZXJ2ZXItc2lkZSBtb2RlLgorICAgKi8KKyAgdGhpcyh1c2hvcnQgcG9ydCwgRHVyYXRpb24gc2VuZFRpbWVvdXQsIER1cmF0aW9uIHJlY3ZUaW1lb3V0LAorICAgIFRTU0xDb250ZXh0IHNzbENvbnRleHQpCisgIHsKKyAgICBzdXBlcihwb3J0LCBzZW5kVGltZW91dCwgcmVjdlRpbWVvdXQpOworICAgIHNldFNTTENvbnRleHQoc3NsQ29udGV4dCk7CisgIH0KKworcHJvdGVjdGVkOgorICBvdmVycmlkZSBUU29ja2V0IGNyZWF0ZVRTb2NrZXQoU29ja2V0IHNvY2tldCkgeworICAgIHJldHVybiBuZXcgVFNTTFNvY2tldChzc2xDb250ZXh0Xywgc29ja2V0KTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHNldFNTTENvbnRleHQoVFNTTENvbnRleHQgc3NsQ29udGV4dCkgeworICAgIGVuZm9yY2Uoc3NsQ29udGV4dC5zZXJ2ZXJTaWRlLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJOZWVkIHNlcnZlci1zaWRlIFNTTCBzb2NrZXQgZmFjdG9yeSBmb3IgVFNTTFNlcnZlclNvY2tldCIpKTsKKyAgICBzc2xDb250ZXh0XyA9IHNzbENvbnRleHQ7CisgIH0KKworICBUU1NMQ29udGV4dCBzc2xDb250ZXh0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc2YTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYmFzZS5kCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmVycm9yOworaW1wb3J0IHN0ZC5jb252IDogdGV4dDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKKworLyoqCisgKiBBbiBlbnRpdHkgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIGFuZC9vciB3cml0dGVuIHRvLgorICoKKyAqIEEgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBtYXkgY2FwYWJsZSBvZiBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nLCBidXQKKyAqIG5vdCBuZWNlc3NhcmlseSBib3RoLgorICovCitpbnRlcmZhY2UgVFRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqCisgICAqIElmIGEgdHJhbnNwb3J0IGlzIGNsb3NlZCwgaXQgY2FuIGJlIG9wZW5lZCBieSBjYWxsaW5nIG9wZW4oKSwgYW5kIHZpY2UKKyAgICogdmVyc2EgZm9yIGNsb3NlKCkuCisgICAqCisgICAqIFdoaWxlIGEgdHJhbnNwb3J0IHNob3VsZCBhbHdheXMgYmUgb3BlbiB3aGVuIHRyeWluZyB0byByZWFkL3dyaXRlIGRhdGEsCisgICAqIHRoZSByZWxhdGVkIGZ1bmN0aW9ucyBkbyBub3QgbmVjZXNzYXJpbHkgZmFpbCB3aGVuIGNhbGxlZCBmb3IgYSBjbG9zZWQKKyAgICogdHJhbnNwb3J0LiBTaXR1YXRpb25zIGxpa2UgdGhpcyBjb3VsZCBvY2N1ciBlLmcuIHdpdGggYSB3cmFwcGVyCisgICAqIHRyYW5zcG9ydCB3aGljaCBidWZmZXJzIGRhdGEgd2hlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaGFzIGFscmVhZHkKKyAgICogYmVlbiBjbG9zZWQgKHBvc3NpYmx5IGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gd2FzIGFicnVwdGx5IGNsb3NlZCksIGJ1dAorICAgKiB0aGVyZSBpcyBzdGlsbCBkYXRhIGxlZnQgdG8gYmUgcmVhZCBpbiB0aGUgYnVmZmVycy4gVGhpcyBjaG9pY2UgaGFzIGJlZW4KKyAgICogbWFkZSB0byBzaW1wbGlmeSB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb25zLCBpbiB0ZXJtcyBvZiBib3RoICBjb2RlCisgICAqIGNvbXBsZXhpdHkgYW5kIHJ1bnRpbWUgb3ZlcmhlYWQuCisgICAqLworICBib29sIGlzT3BlbigpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogVGVzdHMgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCBvciBpZiB0aGUgcmVtb3RlIHNpZGUgaXMKKyAgICogc3RpbGwgb3Blbi4KKyAgICoKKyAgICogQSB0eXBpY2FsIHVzZSBjYXNlIHdvdWxkIGJlIGEgc2VydmVyIGNoZWNraW5nIGlmIGl0IHNob3VsZCBwcm9jZXNzCisgICAqIGFub3RoZXIgcmVxdWVzdCBvbiB0aGUgdHJhbnNwb3J0LgorICAgKi8KKyAgYm9vbCBwZWVrKCk7CisKKyAgLyoqCisgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb25zLgorICAgKgorICAgKiBJZiB0aGUgdHJhbnNwb3J0IGlzIGFscmVhZHkgb3Blbiwgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgb3BlbmluZyBmYWlscy4KKyAgICovCisgIHZvaWQgb3BlbigpOworCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgICoKKyAgICogSWYgdGhlIHRyYW5zcG9ydCBpcyBub3Qgb3Blbiwgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2xvc2luZyBmYWlscy4KKyAgICovCisgIHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gZmlsbCB0aGUgZ2l2ZW4gYnVmZmVyIGJ5IHJlYWRpbmcgZGF0YS4KKyAgICoKKyAgICogRm9yIHBvdGVudGlhbGx5IGJsb2NraW5nIGRhdGEgc291cmNlcyAoZS5nLiBzb2NrZXRzKSwgcmVhZCgpIHdpbGwgb25seQorICAgKiBibG9jayBpZiBubyBkYXRhIGlzIGF2YWlsYWJsZSBhdCBhbGwuIElmIHRoZXJlIGlzIHNvbWUgZGF0YSBhdmFpbGFibGUsCisgICAqIGJ1dCB3YWl0aW5nIGZvciBuZXcgZGF0YSB0byBhcnJpdmUgd291bGQgYmUgcmVxdWlyZWQgdG8gZmlsbCB0aGUgd2hvbGUKKyAgICogYnVmZmVyLCB0aGUgcmVhZGlseSBhdmFpbGFibGUgZGF0YSB3aWxsIGJlIGltbWVkaWF0ZWx5IHJldHVybmVkIOKAkyB1c2UKKyAgICogcmVhZEFsbCgpIGlmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIHdob2xlIGJ1ZmZlciBpcyBmaWxsZWQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSB0byB1c2UgYXMgYnVmZmVyLgorICAgKgorICAgKiBSZXR1cm5zOiBIb3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHJlYWQKKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHNpemVfdCByZWFkKHVieXRlW10gYnVmKTsKKworICAvKioKKyAgICogRmlsbHMgdGhlIGdpdmVuIGJ1ZmZlciBieSByZWFkaW5nIGRhdGEgaW50byBpdCwgZmFpbGluZyBpZiBub3QgZW5vdWdoCisgICAqIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2UgdG8gdXNlIGFzIGJ1ZmZlci4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGluc3VmZmljaWVudCBkYXRhIGlzIGF2YWlsYWJsZSBvciByZWFkaW5nCisgICAqICAgZmFpbHMgYWx0b2dldGhlci4KKyAgICovCisgIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1Zik7CisKKyAgLyoqCisgICAqIE11c3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KKyAgICoKKyAgICogSW1wbGVtZW50YXRpb25zIGNhbiBjaG9vc2UgdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24sIGUuZy4KKyAgICogbG9nZ2luZyB0aGUgcmVxdWVzdCB0byBhIGZpbGUuCisgICAqCisgICAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlLgorICAgKi8KKyAgc2l6ZV90IHJlYWRFbmQoKTsKKworICAvKioKKyAgICogV3JpdGVzIHRoZSBwYXNzZWQgc2xpY2Ugb2YgZGF0YS4KKyAgICoKKyAgICogTm90ZTogWW91IG11c3QgY2FsbCBmbHVzaCgpIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLAorICAgKiBhbmQgYXZhaWxhYmxlIHRvIGJlIHJlYWQgYmFjayBpbiB0aGUgZnV0dXJlLiAgRGVzdHJveWluZyBhIFRUcmFuc3BvcnQKKyAgICogb2JqZWN0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZmx1c2ggcGVuZGluZyBkYXRhIOKAkyBpZiB5b3UgZGVzdHJveSBhCisgICAqIFRUcmFuc3BvcnQgb2JqZWN0IHdpdGggd3JpdHRlbiBidXQgdW5mbHVzaGVkIGRhdGEsIHRoYXQgZGF0YSBtYXkgYmUKKyAgICogZGlzY2FyZGVkLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2Ugb2YgZGF0YSB0byB3cml0ZS4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpOworCisgIC8qKgorICAgKiBNdXN0IGJlIGNhbGxlZCBieSBjbGllbnRzIHdoZW4gd3JpdGUgaXMgY29tcGxldGVkLgorICAgKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgY2FuIGNob29zZSB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbiwgZS5nLgorICAgKiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZS4KKyAgICoKKyAgICogUmV0dXJuczogVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCisgICAqLworICBzaXplX3Qgd3JpdGVFbmQoKTsKKworICAvKioKKyAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAqCisgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cnVjdGlvbiB0byBlbnN1cmUgd3JpdGVzIGFyZSBhY3R1YWxseSBjb21wbGV0ZSwKKyAgICogb3RoZXJ3aXNlIHBlbmRpbmcgZGF0YSBtYXkgYmUgZGlzY2FyZGVkLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCisgICAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgdm9pZCBmbHVzaCgpOworCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byByZXR1cm4gYSBzbGljZSBvZiA8Y29kZT5sZW48L2NvZGU+IGJ5dGVzIG9mIGluY29taW5nIGRhdGEsCisgICAqIHBvc3NpYmx5IGNvcGllZCBpbnRvIGJ1Ziwgbm90IGNvbnN1bWluZyB0aGVtIChpLmUuOiBhIGxhdGVyIHJlYWQgd2lsbAorICAgKiByZXR1cm4gdGhlIHNhbWUgZGF0YSkuCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIHN1cHBvcnQgcHJvdG9jb2xzIHRoYXQgbmVlZCB0byByZWFkIHZhcmlhYmxlLQorICAgKiBsZW5ndGggZmllbGRzLiBUaGV5IGNhbiBhdHRlbXB0IHRvIGJvcnJvdyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0aGF0CisgICAqIHRoZXkgd2lsbCBuZWVkLCB0aGVuIDxjb2RlPmNvbnN1bWUoKTwvY29kZT4gd2hhdCB0aGV5IGFjdHVhbGx5IHVzZS4gU29tZQorICAgKiB0cmFuc3BvcnRzIHdpbGwgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QgYW5kIG90aGVycyB3aWxsIGZhaWwgb2NjYXNpb25hbGx5LAorICAgKiBzbyBwcm90b2NvbHMgbXVzdCBiZSBwcmVwYXJlZCB0byBmYWxsIGJhY2sgdG8gPGNvZGU+cmVhZCgpPC9jb2RlPiBpZgorICAgKiBib3Jyb3cgZmFpbHMuCisgICAqCisgICAqIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gQSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgY2FuIGJlIHN0b3JlZCBpZiBuZWVkZWQsIG9yIG51bGwgdG8KKyAgICogICAgIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBpcyBub3Qgc3VwcGx5aW5nIHN0b3JhZ2UsIGJ1dCB3b3VsZCBsaWtlIGEKKyAgICogICAgIHNsaWNlIG9mIGFuIGludGVybmFsIGJ1ZmZlciwgaWYgYXZhaWxhYmxlLgorICAgKiAgIGxlbiA9IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYm9ycm93LgorICAgKgorICAgKiBSZXR1cm5zOiBJZiB0aGUgYm9ycm93IHN1Y2NlZWRzLCBhIHNsaWNlIGNvbnRhaW5pbmcgdGhlIGJvcnJvd2VkIGRhdGEsCisgICAqICAgbnVsbCBvdGhlcndpc2UuIFRoZSBzbGljZSB3aWxsIGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgcmVxdWVzdGVkLCBidXQKKyAgICogICBtYXkgYmUgbG9uZ2VyIGlmIHRoZSByZXR1cm5lZCBzbGljZSBwb2ludHMgaW50byBhbiBpbnRlcm5hbCBidWZmZXIKKyAgICogICByYXRoZXIgdGhhbiBidWYuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgb3V0IChyZXN1bHQpIHsKKyAgICAvLyBGSVhNRTogQ29tbWVudGVkIG91dCBiZWNhdXNlIGxlbiBnZXRzIGNvcnJ1cHRlZCBpbgorICAgIC8vIHRocmlmdC50cmFuc3BvcnQubWVtb3J5IGJvcnJvdygpIHVuaXR0ZXN0LgorICAgIHZlcnNpb24obm9uZSkgYXNzZXJ0KHJlc3VsdCBpcyBudWxsIHx8IHJlc3VsdC5sZW5ndGggPj0gbGVuLAorICAgICAgICJCdWZmZXIgcmV0dXJuZWQgYnkgYm9ycm93KCkgdG9vIHNob3J0LiIpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiBUaGlzIG11c3QgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdworICAgKiBvZiBhdCBsZWFzdCBsZW4gYnl0ZXMsIGFuZCBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCisgICAqCisgICAqIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgbGVuID0gTnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWUuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbik7Cit9CisKKy8qKgorICogUHJvdmlkZXMgYmFzaWMgZmFsbC1iYWNrIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIFRCYXNlVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIGlzT3BlbjsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IG9wZW4gVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCByZWFkIGZyb20gYSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpIHsKKyAgICBzaXplX3QgaGF2ZTsKKyAgICB3aGlsZSAoaGF2ZSA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIHNpemVfdCBnZXQgPSByZWFkKGJ1ZltoYXZlLi4kXSk7CisgICAgICBpZiAoZ2V0IDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24odGV4dCgiQ291bGQgbm90IHJlYWRBbGwoKSAiLCBidWYubGVuZ3RoLAorICAgICAgICAgICIgYnl0ZXMgYXMgbm8gbW9yZSBkYXRhIHdhcyBhdmFpbGFibGUgYWZ0ZXIgIiwgaGF2ZSwgIiBieXRlcy4iKSwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpOworICAgICAgfQorICAgICAgaGF2ZSArPSBnZXQ7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWRFbmQoKSB7CisgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LCBub3QgbmVlZGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgcmV0dXJuIDA7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBhIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCB3cml0ZUVuZCgpIHsKKyAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQsIG5vdCBuZWVkZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LCBub3QgbmVlZGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIC8vIGJvcnJvdygpIGlzIGFsbG93ZWQgdG8gZmFpbCBhbnl3YXksIHNvIGp1c3QgcmV0dXJuIG51bGwuCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgY29uc3VtZSBmcm9tIGEgVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdGhpcygpIHt9Cit9CisKKy8qKgorICogTWFrZXMgYSBUVHJhbnNwb3J0IHdoaWNoIHdyYXBzIGEgZ2l2ZW4gc291cmNlIHRyYW5zcG9ydCBpbiBzb21lIHdheS4KKyAqCisgKiBBIGNvbW1vbiB1c2UgY2FzZSBpcyBpbnNpZGUgc2VydmVyIGltcGxlbWVudGF0aW9ucywgd2hlcmUgdGhlIHJhdyBjbGllbnQKKyAqIGNvbm5lY3Rpb25zIGFjY2VwdGVkIGZyb20gZS5nLiBUU2VydmVyU29ja2V0IG5lZWQgdG8gYmUgd3JhcHBlZCBpbnRvCisgKiBidWZmZXJlZCBvciBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgLyoqCisgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KKyAgICovCisgIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICByZXR1cm4gdHJhbnM7CisgIH0KK30KKworLyoqCisgKiBUcmFuc3BvcnQgZmFjdG9yeSBmb3IgdHJhbnNwb3J0cyB3aGljaCBzaW1wbHkgd3JhcCBhbiB1bmRlcmx5aW5nIFRUcmFuc3BvcnQKKyAqIHdpdGhvdXQgcmVxdWlyaW5nIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbi4KKyAqLworY2xhc3MgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5KFQpIGlmICgKKyAgaXMoVCA6IFRUcmFuc3BvcnQpICYmIF9fdHJhaXRzKGNvbXBpbGVzLCBuZXcgVChUVHJhbnNwb3J0LmluaXQpKQorKSAgOiBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIG92ZXJyaWRlIFQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICByZXR1cm4gbmV3IFQodHJhbnMpOworICB9Cit9CisKKy8qKgorICogVHJhbnNwb3J0LWxldmVsIGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFR5cGUgeworICAgIFVOS05PV04sIC8vLworICAgIE5PVF9PUEVOLCAvLy8KKyAgICBUSU1FRF9PVVQsIC8vLworICAgIEVORF9PRl9GSUxFLCAvLy8KKyAgICBJTlRFUlJVUFRFRCwgLy8vCisgICAgQkFEX0FSR1MsIC8vLworICAgIENPUlJVUFRFRF9EQVRBLCAvLy8KKyAgICBJTlRFUk5BTF9FUlJPUiwgLy8vCisgICAgTk9UX0lNUExFTUVOVEVEIC8vLworICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICBzdGF0aWMgc3RyaW5nIG1zZ0ZvclR5cGUoVHlwZSB0eXBlKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV046IHJldHVybiAiVW5rbm93biB0cmFuc3BvcnQgZXhjZXB0aW9uIjsKKyAgICAgICAgY2FzZSBUeXBlLk5PVF9PUEVOOiByZXR1cm4gIlRyYW5zcG9ydCBub3Qgb3BlbiI7CisgICAgICAgIGNhc2UgVHlwZS5USU1FRF9PVVQ6IHJldHVybiAiVGltZWQgb3V0IjsKKyAgICAgICAgY2FzZSBUeXBlLkVORF9PRl9GSUxFOiByZXR1cm4gIkVuZCBvZiBmaWxlIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVEVSUlVQVEVEOiByZXR1cm4gIkludGVycnVwdGVkIjsKKyAgICAgICAgY2FzZSBUeXBlLkJBRF9BUkdTOiByZXR1cm4gIkludmFsaWQgYXJndW1lbnRzIjsKKyAgICAgICAgY2FzZSBUeXBlLkNPUlJVUFRFRF9EQVRBOiByZXR1cm4gIkNvcnJ1cHRlZCBEYXRhIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVEVSTkFMX0VSUk9SOiByZXR1cm4gIkludGVybmFsIGVycm9yIjsKKyAgICAgICAgY2FzZSBUeXBlLk5PVF9JTVBMRU1FTlRFRDogcmV0dXJuICJOb3QgaW1wbGVtZW50ZWQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9CisgICAgfQorICAgIHRoaXMobXNnRm9yVHlwZSh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHRoaXMobXNnLCBUeXBlLlVOS05PV04sIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgLy8vCisgIFR5cGUgdHlwZSgpIGNvbnN0IG5vdGhyb3cgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworcHJvdGVjdGVkOgorICBUeXBlIHR5cGVfOworfQorCisvKioKKyAqIE1ldGEtcHJvZ3JhbW1pbmcgaGVscGVyIHJldHVybmluZyB3aGV0aGVyIHRoZSBwYXNzZWQgdHlwZSBpcyBhIFRUcmFuc3BvcnQKKyAqIGltcGxlbWVudGF0aW9uLgorICovCit0ZW1wbGF0ZSBpc1RUcmFuc3BvcnQoVCkgeworICBlbnVtIGlzVFRyYW5zcG9ydCA9IGlzKFQgOiBUVHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmZiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZC5kCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW47CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIFdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBidWZmZXJzIHJlYWRzIGFuZCB3cml0ZXMgdW50aWwgdGhlIGludGVybmFsCisgKiBidWZmZXJzIGFyZSBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IG5ldyBkYXRhIGlzIGZldGNoZWQgcmVzcC4gdGhlCisgKiBhY2N1bXVsYXRlZCBkYXRhIGlzIHdyaXR0ZW4gb3V0IGF0IG9uY2UuCisgKi8KK2ZpbmFsIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UsIHVzaW5nIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHRoaXModHJhbnNwb3J0LCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBzaXplLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHdyYXAuCisgICAqICAgYnVmZmVyU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzIHRvIHVzZSwgaW4gYnl0ZXMuCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHRoaXModHJhbnNwb3J0LCBidWZmZXJTaXplLCBidWZmZXJTaXplKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLCB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBzaXplLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHdyYXAuCisgICAqICAgcmVhZEJ1ZmZlclNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgcmVhZCBidWZmZXIgdG8gdXNlLCBpbiBieXRlcy4KKyAgICogICB3cml0ZUJ1ZmZlclNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgd3JpdGUgYnVmZmVyIHRvIHVzZSwgaW4gYnl0ZXMuCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3QgcmVhZEJ1ZmZlclNpemUsIHNpemVfdCB3cml0ZUJ1ZmZlclNpemUpIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICAgIHJlYWRCdWZmZXJfID0gbmV3IHVieXRlW3JlYWRCdWZmZXJTaXplXTsKKyAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgdWJ5dGVbd3JpdGVCdWZmZXJTaXplXTsKKyAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyXzsKKyAgfQorCisgIC8vLyBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMsIGluIGJ5dGVzLgorICBlbnVtIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOworCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAocmVhZEF2YWlsXy5lbXB0eSkgeworICAgICAgLy8gSWYgdGhlcmUgaXMgbm90aGluZyBhdmFpbGFibGUgdG8gcmVhZCwgc2VlIGlmIHdlIGNhbiBnZXQgc29tZXRoaW5nCisgICAgICAvLyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgIGF1dG8gYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy5yZWFkKHJlYWRCdWZmZXJfKTsKKyAgICAgIHJlYWRBdmFpbF8gPSByZWFkQnVmZmVyX1swIC4uIGJ5dGVzUmVhZF07CisgICAgfQorCisgICAgcmV0dXJuICFyZWFkQXZhaWxfLmVtcHR5OworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBpZiAocmVhZEF2YWlsXy5lbXB0eSkgeworICAgICAgLy8gTm8gZGF0YSBsZWZ0IGluIG91ciBidWZmZXIsIGZldGNoIHNvbWUgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisKKyAgICAgIGlmIChidWYubGVuZ3RoID4gcmVhZEJ1ZmZlcl8ubGVuZ3RoKSB7CisgICAgICAgIC8vIElmIHRoZSBhbW91bnQgb2YgZGF0YSByZXF1ZXN0ZWQgaXMgbGFyZ2VyIHRoYW4gb3VyIHJlYWRpbmcgYnVmZmVyLAorICAgICAgICAvLyBkaXJlY3RseSByZWFkIHRvIHRoZSBwYXNzZWQgYnVmZmVyLiBUaGlzIHByb2JhYmx5IGRvZXNuJ3Qgb2NjdXIgdG9vCisgICAgICAgIC8vIG9mdGVuIGluIHByYWN0aWNlIChhbmQgZXZlbiBpZiBpdCBkb2VzLCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgLy8gcHJvYmFibHkgY2Fubm90IGZ1bGZpbGwgdGhlIHJlcXVlc3QgYXQgb25jZSBhbnl3YXkpLCBidXQgaXQgY2FuJ3QKKyAgICAgICAgLy8gaGFybSB0byB0cnnigKYKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8ucmVhZChidWYpOworICAgICAgfQorCisgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydF8ucmVhZChyZWFkQnVmZmVyXyk7CisgICAgICByZWFkQXZhaWxfID0gcmVhZEJ1ZmZlcl9bMCAuLiBieXRlc1JlYWRdOworICAgIH0KKworICAgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgorICAgIGF1dG8gZ2l2ZSA9IG1pbihyZWFkQXZhaWxfLmxlbmd0aCwgYnVmLmxlbmd0aCk7CisgICAgYnVmWzAgLi4gZ2l2ZV0gPSByZWFkQXZhaWxfWzAgLi4gZ2l2ZV07CisgICAgcmVhZEF2YWlsXyA9IHJlYWRBdmFpbF9bZ2l2ZSAuLiAkXTsKKyAgICByZXR1cm4gZ2l2ZTsKKyAgfQorCisgIC8qKgorICAgKiBTaG9ydGN1dCB2ZXJzaW9uIG9mIHJlYWRBbGwuCisgICAqLworICBvdmVycmlkZSB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpIHsKKyAgICBpZiAocmVhZEF2YWlsXy5sZW5ndGggPj0gYnVmLmxlbmd0aCkgeworICAgICAgYnVmW10gPSByZWFkQXZhaWxfWzAgLi4gYnVmLmxlbmd0aF07CisgICAgICByZWFkQXZhaWxfID0gcmVhZEF2YWlsX1tidWYubGVuZ3RoIC4uICRdOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN1cGVyLnJlYWRBbGwoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBpZiAod3JpdGVBdmFpbF8ubGVuZ3RoID49IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIC8vIElmIHRoZSBkYXRhIGZpdHMgaW4gdGhlIGJ1ZmZlciwganVzdCBzYXZlIGl0IHRoZXJlLgorICAgICAgd3JpdGVBdmFpbF9bMCAuLiBidWYubGVuZ3RoXSA9IGJ1ZjsKKyAgICAgIHdyaXRlQXZhaWxfID0gd3JpdGVBdmFpbF9bYnVmLmxlbmd0aCAuLiAkXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIHRvIGRlY2lkZSBpZiB3ZSBjb3B5IGRhdGEgZnJvbSBidWYgdG8gb3VyIGludGVybmFsIGJ1ZmZlciwgb3IKKyAgICAvLyBqdXN0IGRpcmVjdGx5IHdyaXRlIHRoZW0gb3V0LiBUaGUgc2FtZSBjb25zaWRlcmF0aW9ucyBhYm91dCBhdm9pZGluZworICAgIC8vIHN5c2NhbGxzIGFzIGZvciBDKysgYXBwbHkgaGVyZS4KKyAgICBhdXRvIGJ5dGVzQXZhaWwgPSB3cml0ZUF2YWlsXy5wdHIgLSB3cml0ZUJ1ZmZlcl8ucHRyOworICAgIGlmICgoYnl0ZXNBdmFpbCArIGJ1Zi5sZW5ndGggPj0gMiAqIHdyaXRlQnVmZmVyXy5sZW5ndGgpIHx8IChieXRlc0F2YWlsID09IDApKSB7CisgICAgICAvLyBXZSB3b3VsZCBpbW1lZGlhdGVseSBuZWVkIHR3byBzeXNjYWxscyBhbnl3YXkgKG9yIHdlIGRvbid0IGhhdmUKKyAgICAgIC8vIGFueXRoaW5nKSBpbiBvdXIgYnVmZmVyIHRvIHdyaXRlLCBzbyBqdXN0IHdyaXRlIG91dCBib3RoIGJ1ZmZlcnMuCisgICAgICBpZiAoYnl0ZXNBdmFpbCA+IDApIHsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZSh3cml0ZUJ1ZmZlcl9bMCAuLiBieXRlc0F2YWlsXSk7CisgICAgICAgIHdyaXRlQXZhaWxfID0gd3JpdGVCdWZmZXJfOworICAgICAgfQorCisgICAgICB0cmFuc3BvcnRfLndyaXRlKGJ1Zik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRmlsbCB1cCBvdXIgaW50ZXJuYWwgYnVmZmVyIGZvciBhIHdyaXRlLgorICAgIHdyaXRlQXZhaWxfW10gPSBidWZbMCAuLiB3cml0ZUF2YWlsXy5sZW5ndGhdOworICAgIGF1dG8gbGVmdCA9IGJ1Zlt3cml0ZUF2YWlsXy5sZW5ndGggLi4gJF07CisgICAgdHJhbnNwb3J0Xy53cml0ZSh3cml0ZUJ1ZmZlcl8pOworCisgICAgLy8gQ29weSB0aGUgcmVzdCBpbnRvIG91ciBidWZmZXIuCisgICAgd3JpdGVCdWZmZXJfWzAgLi4gbGVmdC5sZW5ndGhdID0gbGVmdFtdOworICAgIHdyaXRlQXZhaWxfID0gd3JpdGVCdWZmZXJfW2xlZnQubGVuZ3RoIC4uICRdOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLgorICAgIGF1dG8gYnl0ZXNBdmFpbCA9IHdyaXRlQXZhaWxfLnB0ciAtIHdyaXRlQnVmZmVyXy5wdHI7CisgICAgaWYgKGJ5dGVzQXZhaWwgPiAwKSB7CisgICAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd3JpdGVBdmFpbF8gcHJpb3IgdG8gY2FsbGluZyB0aGUgdW5kZXJseWluZyBwcm90b2NvbAorICAgICAgLy8gdG8gbWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgY2xlYXJlZCBldmVuIGlmIHRoZSB0cmFuc3BvcnQgdGhyb3dzIGFuCisgICAgICAvLyBleGNlcHRpb24uCisgICAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyXzsKKyAgICAgIHRyYW5zcG9ydF8ud3JpdGUod3JpdGVCdWZmZXJfWzAgLi4gYnl0ZXNBdmFpbF0pOworICAgIH0KKworICAgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIGlmIChsZW4gPD0gcmVhZEF2YWlsXy5sZW5ndGgpIHsKKyAgICAgIHJldHVybiByZWFkQXZhaWxfOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgZW5mb3JjZShsZW4gPD0gcmVhZEJ1ZmZlcl8ubGVuZ3RoLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJJbnZhbGlkIGNvbnN1bWUgbGVuZ3RoLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworICAgIHJlYWRBdmFpbF8gPSByZWFkQXZhaWxfW2xlbiAuLiAkXTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgd3JhcHBlZCB0cmFuc3BvcnQuCisgICAqLworICBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc3BvcnRfOworICB9CisKK3ByaXZhdGU6CisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKworICB1Ynl0ZVtdIHJlYWRCdWZmZXJfOworICB1Ynl0ZVtdIHdyaXRlQnVmZmVyXzsKKworICB1Ynl0ZVtdIHJlYWRBdmFpbF87CisgIHVieXRlW10gd3JpdGVBdmFpbF87Cit9CisKKy8qKgorICogV3JhcHMgZ2l2ZW4gdHJhbnNwb3J0cyBpbnRvIFRCdWZmZXJlZFRyYW5zcG9ydHMuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFUQnVmZmVyZWRUcmFuc3BvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTg4ZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCkBAIC0wLDAgKzEsMTEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRyYW5zcG9ydHMgZm9yIHJlYWRpbmcgZnJvbS93cml0aW5nIHRvIFRocmlmdCDCu2xvZyBmaWxlc8KrLgorICoKKyAqIFRoZXNlIHRyYW5zcG9ydHMgYXJlIG5vdCDCu3N0dXBpZMKrIHNvdXJjZXMgYW5kIHNpbmtzIGp1c3QgcmVhZGluZyBhbmQKKyAqIHdyaXRpbmcgYnl0ZXMgZnJvbSBhIGZpbGUgdmVyYmF0aW0sIGJ1dCBvcmdhbml6ZSB0aGUgY29udGVudHMgaW4gdGhlIGZvcm0KKyAqIG9mIHNvLWNhbGxlZCDCu2V2ZW50c8KrLCB3aGljaCByZWZlcnMgdG8gdGhlIGRhdGEgd3JpdHRlbiBiZXR3ZWVuIHR3byBmbHVzaCgpCisgKiBjYWxscy4KKyAqCisgKiBDaHVua2luZyBpcyBzdXBwb3J0ZWQsIGV2ZW50cyBhcmUgZ3VhcmFudGVlZCB0byBuZXZlciBzcGFuIGNodW5rIGJvdW5kYXJpZXMuCisgKiBBcyBhIGNvbnNlcXVlbmNlLCBhbiBldmVudCBjYW4gbmV2ZXIgYmUgbGFyZ2VyIHRoYW4gdGhlIGNodW5rIHNpemUuIFRoZQorICogY2h1bmsgc2l6ZSB1c2VkIGlzIG5vdCBzYXZlZCB3aXRoIHRoZSBmaWxlLCBzbyBjYXJlIGhhcyB0byBiZSB0YWtlbiB0byBtYWtlCisgKiBzdXJlIHRoZSBzYW1lIGNodW5rIHNpemUgaXMgdXNlZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuZmlsZTsKKworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW4sIG1heDsKK2ltcG9ydCBzdGQuY29uY3VycmVuY3k7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBkdXIsIER1cmF0aW9uOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHN0ZC5zdGRpbyA6IEZpbGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvLy8gVGhlIGRlZmF1bHQgY2h1bmsgc2l6ZSwgaW4gYnl0ZXMuCitlbnVtIERFRkFVTFRfQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7CisKKy8vLyBUaGUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBldmVudCBzaXplcyBpbiB0aGUgZmlsZS4KK2FsaWFzIHVpbnQgRXZlbnRTaXplOworCit2ZXJzaW9uIChCaWdFbmRpYW4pIHsKKyAgc3RhdGljIGFzc2VydChmYWxzZSwKKyAgICAiTGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIGlzIGFzc3VtZWQgaW4gdGhyaWZ0LnRyYW5zcG9ydC5maWxlLiIpOworfQorCisvKioKKyAqIEEgdHJhbnNwb3J0IHVzZWQgdG8gcmVhZCBsb2cgZmlsZXMuIEl0IGNhbiBuZXZlciBiZSB3cml0dGVuIHRvLCBjYWxsaW5nCisgKiB3cml0ZSgpIHRocm93cy4KKyAqCisgKiBDb250cmFyeSB0byB0aGUgQysrIGRlc2lnbiwgZXhwbGljaXRseSBvcGVuaW5nIHRoZSB0cmFuc3BvcnQvZmlsZSBiZWZvcmUKKyAqIHVzaW5nIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBtYW51YWxseSBjbG9zaW5nIHRoZSBmaWxlIHdpdGhvdXQgcmVseWluZyBvbiB0aGUKKyAqIG9iamVjdCBsaWZldGltZS4gT3RoZXJ3aXNlLCBpdCdzIGEgc3RyYWlnaHQgcG9ydCBvZiB0aGUgQysrIGltcGxlbWVudGF0aW9uLgorICovCitmaW5hbCBjbGFzcyBURmlsZVJlYWRlclRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSB3cml0ZXIgdHJhbnNwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcGF0aCA9IFBhdGggb2YgdGhlIGZpbGUgdG8gb3BwZXJhdGUgb24uCisgICAqLworICB0aGlzKHN0cmluZyBwYXRoKSB7CisgICAgcGF0aF8gPSBwYXRoOworICAgIGNodW5rU2l6ZV8gPSBERUZBVUxUX0NIVU5LX1NJWkU7CisgICAgcmVhZEJ1ZmZlclNpemVfID0gREVGQVVMVF9SRUFEX0JVRkZFUl9TSVpFOworICAgIHJlYWRUaW1lb3V0XyA9IERFRkFVTFRfUkVBRF9USU1FT1VUOworICAgIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl8gPSBERUZBVUxUX0NPUlJVUFRFRF9FVkVOVF9TTEVFUF9EVVJBVElPTjsKKyAgICBtYXhFdmVudFNpemUgPSBERUZBVUxUX01BWF9FVkVOVF9TSVpFOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBpc09wZW5fOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBldmVudCBjdXJyZW50bHkgcHJvY2Vzc2VkLCB0cnkgZmV0Y2hpbmcgb25lIGZyb20gdGhlCisgICAgLy8gZmlsZS4KKyAgICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKKworICAgICAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgICAgIC8vIFN0aWxsIG5vdGhpbmcgdGhlcmUsIGNvdWxkbid0IHJlYWQgYSBuZXcgZXZlbnQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gcmVhZAorICAgIHJldHVybiAoY3VycmVudEV2ZW50Xy5sZW5ndGggLSBjdXJyZW50RXZlbnRQb3NfKSA+IDA7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworICAgIHRyeSB7CisgICAgICBmaWxlXyA9IEZpbGUocGF0aF8sICJyYiIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3Igb24gb3BlbmluZyBpbnB1dCBmaWxlLiIsCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTiwgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgICB9CisgICAgaXNPcGVuXyA9IHRydWU7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBmaWxlXy5jbG9zZSgpOworICAgIGlzT3Blbl8gPSBmYWxzZTsKKyAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgcmVhZCBpZiBmaWxlIGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXZlbnQgY3VycmVudGx5IHByb2Nlc3NlZCwgdHJ5IGZldGNoaW5nIG9uZSBmcm9tIHRoZQorICAgIC8vIGZpbGUuCisgICAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisKKyAgICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgICAvLyBTdGlsbCBub3RoaW5nIHRoZXJlLCBjb3VsZG4ndCByZWFkIGEgbmV3IGV2ZW50LgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGxlbiA9IGJ1Zi5sZW5ndGg7CisgICAgYXV0byByZW1haW5pbmcgPSBjdXJyZW50RXZlbnRfLmxlbmd0aCAtIGN1cnJlbnRFdmVudFBvc187CisKKyAgICBpZiAocmVtYWluaW5nIDw9IGxlbikgeworICAgICAgLy8gSWYgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGF2YWlsYWJsZSwgcmVhZCBhcyBtdWNoIGFzCisgICAgICAvLyBwb3NzaWJsZS4KKyAgICAgIGJ1ZlswIC4uIHJlbWFpbmluZ10gPSBjdXJyZW50RXZlbnRfW2N1cnJlbnRFdmVudFBvc18gLi4gJF07CisgICAgICBjdXJyZW50RXZlbnRfID0gbnVsbDsKKyAgICAgIGN1cnJlbnRFdmVudFBvc18gPSAwOworICAgICAgcmV0dXJuIHJlbWFpbmluZzsKKyAgICB9CisKKyAgICAvLyBUaGVyZSB3aWxsIHN0aWxsIGJlIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyIGFmdGVyIHJlYWRpbmcsIHBhc3Mgb3V0IGxlbgorICAgIC8vIGJ5dGVzLgorICAgIGJ1ZltdID0gY3VycmVudEV2ZW50X1tjdXJyZW50RXZlbnRQb3NfIC4uIGN1cnJlbnRFdmVudFBvc18gKyBsZW5dOworICAgIGN1cnJlbnRFdmVudFBvc18gKz0gbGVuOworICAgIHJldHVybiBsZW47CisgIH0KKworICB1bG9uZyBnZXROdW1DaHVua3MoKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBnZXQgbnVtYmVyIG9mIGNodW5rcyBpZiBmaWxlIG5vdCBvcGVuLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIHRyeSB7CisgICAgICBhdXRvIGZpbGVTaXplID0gZmlsZV8uc2l6ZSgpOworICAgICAgaWYgKGZpbGVTaXplID09IDApIHsKKyAgICAgICAgLy8gRW1wdHkgZmlsZXMgaGF2ZSBubyBjaHVua3MuCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuICgoZmlsZVNpemUpL2NodW5rU2l6ZV8pICsgMTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgZmlsZSBzaXplLiIsIF9fRklMRV9fLAorICAgICAgICBfX0xJTkVfXywgZSk7CisgICAgfQorICB9CisKKyAgdWxvbmcgZ2V0Q3VyQ2h1bmsoKSB7CisgICAgcmV0dXJuIG9mZnNldF8gLyBjaHVua1NpemVfOworICB9CisKKyAgdm9pZCBzZWVrVG9DaHVuayhsb25nIGNodW5rKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBnZXQgbnVtYmVyIG9mIGNodW5rcyBpZiBmaWxlIG5vdCBvcGVuLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGF1dG8gbnVtQ2h1bmtzID0gZ2V0TnVtQ2h1bmtzKCk7CisKKyAgICBpZiAoY2h1bmsgPCAwKSB7CisgICAgICAvLyBDb3VudCBuZWdhdGl2ZSBpbmRpY2VzIGZyb20gdGhlIGVuZC4KKyAgICAgIGNodW5rICs9IG51bUNodW5rczsKKyAgICB9CisKKyAgICBpZiAoY2h1bmsgPCAwKSB7CisgICAgICBsb2dFcnJvcigiSW5jb3JyZWN0IGNodW5rIG51bWJlciBmb3IgcmV2ZXJzZSBzZWVrLCBzZWVraW5nIHRvICIgfgorICAgICAgICJiZWdpbm5pbmcgaW5zdGVhZDogJXMiLCBjaHVuayk7CisgICAgICBjaHVuayA9IDA7CisgICAgfQorCisgICAgYm9vbCBzZWVrVG9FbmQ7CisgICAgbG9uZyBtaW5FbmRPZmZzZXQ7CisgICAgaWYgKGNodW5rID49IG51bUNodW5rcykgeworICAgICAgbG9nRXJyb3IoIlRyeWluZyB0byBzZWVrIHRvIG5vbi1leGlzdGluZyBjaHVuaywgc2Vla2luZyB0byAiIH4KKyAgICAgICAiZW5kIG9mIGZpbGUgaW5zdGVhZDogJXMiLCBjaHVuayk7CisgICAgICBzZWVrVG9FbmQgPSB0cnVlOworICAgICAgY2h1bmsgPSBudW1DaHVua3MgLSAxOworICAgICAgLy8gdGhpcyBpcyB0aGUgbWluIG9mZnNldCB0byBwcm9jZXNzIGV2ZW50cyB0aWxsCisgICAgICBtaW5FbmRPZmZzZXQgPSBmaWxlXy5zaXplKCk7CisgICAgfQorCisgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgIGN1cnJlbnRFdmVudF8gPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGZpbGVfLnNlZWsoY2h1bmsgKiBjaHVua1NpemVfKTsKKyAgICAgIG9mZnNldF8gPSBjaHVuayAqIGNodW5rU2l6ZV87CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBzZWVraW5nIHRvIGNodW5rIiwgX19GSUxFX18sCisgICAgICAgIF9fTElORV9fLCBlKTsKKyAgICB9CisKKyAgICBpZiAoc2Vla1RvRW5kKSB7CisgICAgICAvLyBOZXZlciB3YWl0IG9uIHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yIG5ldyBjb250ZW50LCB3ZSBqdXN0IHdhbnQgdG8KKyAgICAgIC8vIGZpbmQgdGhlIGxhc3Qgb25lLgorICAgICAgYXV0byBvbGRSZWFkVGltZW91dCA9IHJlYWRUaW1lb3V0XzsKKyAgICAgIHNjb3BlIChleGl0KSByZWFkVGltZW91dF8gPSBvbGRSZWFkVGltZW91dDsKKyAgICAgIHJlYWRUaW1lb3V0XyA9IGR1ciEiaG5zZWNzIigwKTsKKworICAgICAgLy8gS2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla1RvQ2h1bmsgY2FsbC4KKyAgICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXykgPCBtaW5FbmRPZmZzZXQpIHsKKyAgICAgICAgaWYgKHJlYWRFdmVudCgpIGlzIG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgc2Vla1RvRW5kKCkgeworICAgIHNlZWtUb0NodW5rKGdldE51bUNodW5rcygpKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoZSBmaWxlIGlzIGRpdmlkZWQgaW50bywgaW4gYnl0ZXMuCisgICAqLworICB1bG9uZyBjaHVua1NpemUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBjaHVua1NpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgY2h1bmtTaXplKHVsb25nIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UoIWlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHNldCBjaHVuayBzaXplIGFmdGVyIFRGaWxlUmVhZGVyVHJhbnNwb3J0IGhhcyBiZWVuIG9wZW5lZC4iKSk7CisgICAgZW5mb3JjZSh2YWx1ZSA+IEV2ZW50U2l6ZS5zaXplb2YsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDaHVua3MgbXVzdCAiIH4KKyAgICAgICJiZSBsYXJnZSBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYXQgbGVhc3QgYSBzaW5nbGUgYnl0ZSBvZiBwYXlsb2FkIGRhdGEuIikpOworICAgIGNodW5rU2l6ZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgd2FpdCB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIGZvciBuZXcgZGF0YSB3aGVuIGFycml2aW5nIGF0CisgICAqIGVuZCBvZiBmaWxlLiBJZiBuZWdhdGl2ZSwgd2FpdCBmb3JldmVyICh0YWlsaW5nIG1vZGUpLCB3YWtpbmcgdXAgdG8gY2hlY2sKKyAgICogaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4gSWYgemVybywgZG8gbm90IHdhaXQgYXQgYWxsLgorICAgKgorICAgKiBEZWZhdWx0cyB0byA1MDAgbXMuCisgICAqLworICBEdXJhdGlvbiByZWFkVGltZW91dCgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWRUaW1lb3V0XzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIHJlYWRUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJlYWRUaW1lb3V0XyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9SRUFEX1RJTUVPVVQgPSBkdXIhIm1zZWNzIig1MDApOworCisgIC8qKgorICAgKiBSZWFkIGJ1ZmZlciBzaXplLCBpbiBieXRlcy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gMSBNaUIuCisgICAqLworICBzaXplX3QgcmVhZEJ1ZmZlclNpemUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiByZWFkQnVmZmVyU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCByZWFkQnVmZmVyU2l6ZShzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaWYgKHJlYWRCdWZmZXJfKSB7CisgICAgICBlbmZvcmNlKHZhbHVlIDw9IHJlYWRCdWZmZXJTaXplXywKKyAgICAgICAgIkNhbm5vdCBzaHJpbmsgcmVhZCBidWZmZXIgYWZ0ZXIgZmlyc3QgcmVhZC4iKTsKKyAgICAgIHJlYWRCdWZmZXJfLmxlbmd0aCA9IHZhbHVlOworICAgIH0KKyAgICByZWFkQnVmZmVyU2l6ZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfUkVBRF9CVUZGRVJfU0laRSA9IDEgKiAxMDI0ICogMTAyNDsKKworICAvKioKKyAgICogQXJiaXRyYXJ5IGV2ZW50IHNpemUgbGltaXQsIGluIGJ5dGVzLiBNdXN0IGJlIHNtYWxsZXIgdGhhbiBjaHVuayBzaXplLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBzaXplX3QgbWF4RXZlbnRTaXplKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gbWF4RXZlbnRTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIG1heEV2ZW50U2l6ZShzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSh2YWx1ZSA8PSBjaHVua1NpemVfIC0gRXZlbnRTaXplLnNpemVvZiwgIkV2ZW50cyBjYW5ub3Qgc3BhbiAiIH4KKyAgICAgICJtdXRpcGxlIGNodW5rcywgbWF4RXZlbnRTaXplIG11c3QgYmUgc21hbGxlciB0aGFuIGNodW5rIHNpemUuIik7CisgICAgbWF4RXZlbnRTaXplXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfRVZFTlRfU0laRSA9IDA7CisKKyAgLyoqCisgICAqIFRoZSBpbnRlcnZhbCBhdCB3aGljaCB0aGUgdGhyZWFkIHdha2VzIHVwIHRvIGNoZWNrIGZvciB0aGUgbmV4dCBjaHVuaworICAgKiBpbiB0YWlsaW5nIG1vZGUuCisgICAqCisgICAqIERlZmF1bHRzIHRvIG9uZSBzZWNvbmQuCisgICAqLworICBEdXJhdGlvbiBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIHsKKyAgICBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX0NPUlJVUFRFRF9FVkVOVF9TTEVFUF9EVVJBVElPTiA9IGR1ciEic2Vjb25kcyIoMSk7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb3JydXB0ZWQgZXZlbnRzIHRvbGVyYXRlZCBiZWZvcmUgdGhlIHdob2xlIGNodW5rCisgICAqIGlzIHNraXBwZWQuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8uCisgICAqLworICB1aW50IG1heENvcnJ1cHRlZEV2ZW50cygpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIG1heENvcnJ1cHRlZEV2ZW50c187CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhDb3JydXB0ZWRFdmVudHModWludCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBtYXhDb3JydXB0ZWRFdmVudHNfID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTID0gMDsKKworcHJpdmF0ZToKKyAgdWJ5dGVbXSByZWFkRXZlbnQoKSB7CisgICAgaWYgKCFyZWFkQnVmZmVyXykgeworICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgdWJ5dGVbcmVhZEJ1ZmZlclNpemVfXTsKKyAgICB9CisKKyAgICBib29sIHRpbWVvdXRFeHBpcmVkOworICAgIHdoaWxlICgxKSB7CisgICAgICAvLyByZWFkIGZyb20gdGhlIGZpbGUgaWYgcmVhZCBidWZmZXIgaXMgZXhoYXVzdGVkCisgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQb3NfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgICAvLyBhZHZhbmNlIHRoZSBvZmZzZXQgcG9pbnRlcgorICAgICAgICBvZmZzZXRfICs9IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXzsKKworICAgICAgICB0cnkgeworICAgICAgICAgIC8vIE5lZWQgdG8gY2xlYXIgZW9mIGZsYWcgYmVmb3JlIHJlYWRpbmcsIG90aGVyd2lzZSB0YWlsaW5nIGEgZmlsZQorICAgICAgICAgIC8vIGRvZXMgbm90IHdvcmsuCisgICAgICAgICAgZmlsZV8uY2xlYXJlcnIoKTsKKworICAgICAgICAgIGF1dG8gdXNlZEJ1ZiA9IGZpbGVfLnJhd1JlYWQocmVhZEJ1ZmZlcl8pOworICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9IHVzZWRCdWYubGVuZ3RoOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiLAorICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyA9IDA7CisgICAgICAgIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUG9zXyA9IDA7CisKKyAgICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAwKSB7CisgICAgICAgICAgLy8gUmVhY2hlZCBlbmQgb2YgZmlsZS4KKyAgICAgICAgICBpZiAocmVhZFRpbWVvdXRfIDwgZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICAvLyBUYWlsaW5nIG1vZGUsIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoLXJlYWRUaW1lb3V0Xyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBkdXIhImhuc2VjcyIoMCkgfHwgdGltZW91dEV4cGlyZWQpIHsKKyAgICAgICAgICAgIC8vIEVpdGhlciBubyB0aW1lb3V0IHNldCwgb3IgaXQgaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaW1lb3V0IG1vZGUsIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGFuZCByZXRyeS4KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChyZWFkVGltZW91dF8pOworICAgICAgICAgICAgdGltZW91dEV4cGlyZWQgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEF0dGVtcHQgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIuCisgICAgICB3aGlsZSAocmVhZFN0YXRlXy5idWZmZXJQb3NfIDwgcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CisgICAgICAgIGlmIChyZWFkU3RhdGVfLnJlYWRpbmdTaXplXykgeworICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDApIHsKKyAgICAgICAgICAgIGlmICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXykvY2h1bmtTaXplXyAhPQorICAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKyAzKS9jaHVua1NpemVfKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQb3NfKys7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl9bcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXysrXSA9CisgICAgICAgICAgICByZWFkQnVmZmVyX1tyZWFkU3RhdGVfLmJ1ZmZlclBvc18rK107CisKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSA0KSB7CisgICAgICAgICAgICBhdXRvIHNpemUgPSAoY2FzdCh1aW50W10pcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmXylbMF07CisKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwYXJ0IG9mIHRoZSB6ZXJvIHBhZGRpbmcgYmV0d2VlbiBjaHVua3MuCisgICAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFBvc18pOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ290IGEgdmFsaWQgZXZlbnQKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50TGVuXyA9IHNpemU7CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50UG9zXyA9IDA7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBpcyBjb3JydXB0ZWQgYW5kIHBlcmZvcm0gcmVjb3ZlcnkgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgIGlmIChpc0V2ZW50Q29ycnVwdGVkKCkpIHsKKyAgICAgICAgICAgICAgcGVyZm9ybVJlY292ZXJ5KCk7CisgICAgICAgICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIHRvcAorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFyZWFkU3RhdGVfLmV2ZW50XykgeworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgdWJ5dGVbcmVhZFN0YXRlXy5ldmVudExlbl9dOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIHRha2UgZWl0aGVyIHRoZSBlbnRpcmUgZXZlbnQgb3IgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgYXV0byByZWNsYWltQnVmZmVyID0gbWluKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXywKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRMZW5fIC0gcmVhZFN0YXRlXy5ldmVudFBvc18pOworCisgICAgICAgICAgLy8gY29weSBkYXRhIGZyb20gcmVhZCBidWZmZXIgaW50byBldmVudCBidWZmZXIKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50X1sKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRQb3NfIC4uIHJlYWRTdGF0ZV8uZXZlbnRQb3NfICsgcmVjbGFpbUJ1ZmZlcgorICAgICAgICAgIF0gPSByZWFkQnVmZmVyX1sKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyAuLiByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKyByZWNsYWltQnVmZmVyCisgICAgICAgICAgXTsKKworICAgICAgICAgIC8vIGluY3JlbWVudCBwb3NpdGlvbiBwdHJzCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudFBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKKyAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKKworICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBoYXMgYmVlbiByZWFkIGluIGZ1bGwKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFBvc18gPT0gcmVhZFN0YXRlXy5ldmVudExlbl8pIHsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSByZWFkIHN0YXRlIGFuZCByZXR1cm4gdGhlIGNvbXBsZXRlZCBldmVudC4KKyAgICAgICAgICAgIGF1dG8gY29tcGxldGVFdmVudCA9IHJlYWRTdGF0ZV8uZXZlbnRfOworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBudWxsOworICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyk7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVFdmVudDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib29sIGlzRXZlbnRDb3JydXB0ZWQoKSB7CisgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKHJlYWRTdGF0ZV8uZXZlbnRMZW5fID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICAgIC8vIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gdXNlci1zcGVmaWNpZWQgbWF4LWV2ZW50IHNpemUKKyAgICAgIGxvZ0Vycm9yKCJDb3JydXB0IGV2ZW50IHJlYWQ6IEV2ZW50IHNpemUgKCVzKSBncmVhdGVyIHRoYW4gbWF4ICIgfgorICAgICAgICAiZXZlbnQgc2l6ZSAoJXMpIiwgcmVhZFN0YXRlXy5ldmVudExlbl8sIG1heEV2ZW50U2l6ZV8pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmV2ZW50TGVuXyA+IGNodW5rU2l6ZV8pIHsKKyAgICAgIC8vIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQorICAgICAgbG9nRXJyb3IoIkNvcnJ1cHQgZXZlbnQgcmVhZDogRXZlbnQgc2l6ZSAoJXMpIGdyZWF0ZXIgdGhhbiBjaHVuayAiIH4KKyAgICAgICAgInNpemUgKCVzKSIsIHJlYWRTdGF0ZV8uZXZlbnRMZW5fLCBjaHVua1NpemVfKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfIC0gRXZlbnRTaXplLnNpemVvZikgLyBjaHVua1NpemVfKSAhPQorICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgcmVhZFN0YXRlXy5ldmVudExlbl8gLSBFdmVudFNpemUuc2l6ZW9mKSAvIGNodW5rU2l6ZV8pKQorICAgIHsKKyAgICAgIC8vIFNpemUgaW5kaWNhdGVzIHRoYXQgZXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeQorICAgICAgbG9nRXJyb3IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeS4gIiB+CisgICAgICAgICJFdmVudCBzaXplOiAlcy4gT2Zmc2V0OiAlcyIsIHJlYWRTdGF0ZV8uZXZlbnRMZW5fLAorICAgICAgICAob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArIEV2ZW50U2l6ZS5zaXplb2YpCisgICAgICApOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIHBlcmZvcm1SZWNvdmVyeSgpIHsKKyAgICAvLyBwZXJmb3JtIHNvbWUga2lja2FzcyByZWNvdmVyeQorICAgIGF1dG8gY3VyQ2h1bmsgPSBnZXRDdXJDaHVuaygpOworICAgIGlmIChsYXN0QmFkQ2h1bmtfID09IGN1ckNodW5rKSB7CisgICAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXysrOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0QmFkQ2h1bmtfID0gY3VyQ2h1bms7CisgICAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA9IDE7CisgICAgfQorCisgICAgaWYgKG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfIDwgbWF4Q29ycnVwdGVkRXZlbnRzXykgeworICAgICAgLy8gbWF5YmUgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlYWRpbmcgdGhlIGZpbGUgZnJvbSBkaXNrCisgICAgICAvLyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgY2h1bmsgYW5kIHRyeSBhZ2FpbgorICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmspOworICAgIH0gZWxzZSB7CisgICAgICAvLyBKdXN0IHNraXAgYWhlYWQgdG8gdGhlIG5leHQgY2h1bmsgaWYgd2Ugbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgY2h1bmsuCisgICAgICBpZiAoY3VyQ2h1bmsgIT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKKyAgICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfIDwgZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgIC8vIFdlIGFyZSBpbiB0YWlsaW5nIG1vZGUsIHdhaXQgdW50aWwgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gc3RhcnQKKyAgICAgICAgLy8gdGhlIG5leHQgY2h1bmsuCisgICAgICAgIHdoaWxlKGN1ckNodW5rID09IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CisgICAgICAgICAgVGhyZWFkLnNsZWVwKGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl8pOworICAgICAgICB9CisgICAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBQcmV0dHkgaG9zZWQgYXQgdGhpcyBzdGFnZSwgcmV3aW5kIHRoZSBmaWxlIGJhY2sgdG8gdGhlIGxhc3QKKyAgICAgICAgLy8gc3VjY2Vzc2Z1bCBwb2ludCBhbmQgcHVudCBvbiB0aGUgZXJyb3IuCisgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFBvc18pOworICAgICAgICBjdXJyZW50RXZlbnRfID0gbnVsbDsKKyAgICAgICAgY3VycmVudEV2ZW50UG9zXyA9IDA7CisKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZpbGUgY29ycnVwdGVkIGF0IG9mZnNldDogIiB+CisgICAgICAgICAgdG8hc3RyaW5nKG9mZnNldF8gKyByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFBvc18pLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyaW5nIHBhdGhfOworICBGaWxlIGZpbGVfOworICBib29sIGlzT3Blbl87CisgIGxvbmcgb2Zmc2V0XzsKKyAgdWJ5dGVbXSBjdXJyZW50RXZlbnRfOworICBzaXplX3QgY3VycmVudEV2ZW50UG9zXzsKKyAgdWxvbmcgY2h1bmtTaXplXzsKKyAgRHVyYXRpb24gcmVhZFRpbWVvdXRfOworICBzaXplX3QgbWF4RXZlbnRTaXplXzsKKworICAvLyBSZWFkIGJ1ZmZlciDigJMgbGF6aWx5IGFsbG9jYXRlZCBvbiB0aGUgZmlyc3QgcmVhZCgpLgorICB1Ynl0ZVtdIHJlYWRCdWZmZXJfOworICBzaXplX3QgcmVhZEJ1ZmZlclNpemVfOworCisgIHN0YXRpYyBzdHJ1Y3QgUmVhZFN0YXRlIHsKKyAgICB1Ynl0ZVtdIGV2ZW50XzsKKyAgICBzaXplX3QgZXZlbnRMZW5fOworICAgIHNpemVfdCBldmVudFBvc187CisKKyAgICAvLyBrZWVwIHRyYWNrIG9mIGV2ZW50IHNpemUKKyAgICB1Ynl0ZVs0XSBldmVudFNpemVCdWZmXzsKKyAgICB1Ynl0ZSBldmVudFNpemVCdWZmUG9zXzsKKyAgICBib29sIHJlYWRpbmdTaXplXyA9IHRydWU7CisKKyAgICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKKyAgICBzaXplX3QgYnVmZmVyUG9zXzsKKyAgICBzaXplX3QgYnVmZmVyTGVuXzsKKworICAgIC8vIGxhc3Qgc3VjY2Vzc2Z1bCBkaXNwYXRjaCBwb2ludAorICAgIHNpemVfdCBsYXN0RGlzcGF0Y2hQb3NfOworCisgICAgdm9pZCByZXNldFN0YXRlKHNpemVfdCBsYXN0RGlzcGF0Y2hQb3MpIHsKKyAgICAgIHJlYWRpbmdTaXplXyA9IHRydWU7CisgICAgICBldmVudFNpemVCdWZmUG9zXyA9IDA7CisgICAgICBsYXN0RGlzcGF0Y2hQb3NfID0gbGFzdERpc3BhdGNoUG9zOworICAgIH0KKworICAgIHZvaWQgcmVzZXRBbGxWYWx1ZXMoKSB7CisgICAgICByZXNldFN0YXRlKDApOworICAgICAgYnVmZmVyUG9zXyA9IDA7CisgICAgICBidWZmZXJMZW5fID0gMDsKKyAgICAgIGV2ZW50XyA9IG51bGw7CisgICAgfQorICB9CisgIFJlYWRTdGF0ZSByZWFkU3RhdGVfOworCisgIHVsb25nIGxhc3RCYWRDaHVua187CisgIHVpbnQgbWF4Q29ycnVwdGVkRXZlbnRzXzsKKyAgdWludCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXzsKKyAgRHVyYXRpb24gY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXzsKK30KKworLyoqCisgKiBBIHRyYW5zcG9ydCB1c2VkIHRvIHdyaXRlIGxvZyBmaWxlcy4gSXQgY2FuIG5ldmVyIGJlIHJlYWQgZnJvbSwgY2FsbGluZworICogcmVhZCgpIHRocm93cy4KKyAqCisgKiBDb250cmFyeSB0byB0aGUgQysrIGRlc2lnbiwgZXhwbGljaXRseSBvcGVuaW5nIHRoZSB0cmFuc3BvcnQvZmlsZSBiZWZvcmUKKyAqIHVzaW5nIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBtYW51YWxseSBjbG9zaW5nIHRoZSBmaWxlIHdpdGhvdXQgcmVseWluZyBvbiB0aGUKKyAqIG9iamVjdCBsaWZldGltZS4KKyAqLworZmluYWwgY2xhc3MgVEZpbGVXcml0ZXJUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgd3JpdGVyIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIG9mIHRoZSBmaWxlIHRvIG9wcGVyYXRlIG9uLgorICAgKi8KKyAgdGhpcyhzdHJpbmcgcGF0aCkgeworICAgIHBhdGhfID0gcGF0aDsKKworICAgIGNodW5rU2l6ZV8gPSBERUZBVUxUX0NIVU5LX1NJWkU7CisgICAgZXZlbnRCdWZmZXJTaXplXyA9IERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkU7CisgICAgaW9FcnJvclNsZWVwRHVyYXRpb24gPSBERUZBVUxUX0lPX0VSUk9SX1NMRUVQX0RVUkFUSU9OOworICAgIG1heEZsdXNoQnl0ZXNfID0gREVGQVVMVF9NQVhfRkxVU0hfQllURVM7CisgICAgbWF4Rmx1c2hJbnRlcnZhbF8gPSBERUZBVUxUX01BWF9GTFVTSF9JTlRFUlZBTDsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaXNPcGVuXzsKKyAgfQorCisgIC8qKgorICAgKiBBIGZpbGUgd3JpdGVyIHRyYW5zcG9ydCBjYW4gbmV2ZXIgYmUgcmVhZCBmcm9tLgorICAgKi8KKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisKKyAgICB3cml0ZXJUaHJlYWRfID0gc3Bhd24oCisgICAgICAmd3JpdGVyVGhyZWFkLAorICAgICAgcGF0aF8sCisgICAgICBjaHVua1NpemVfLAorICAgICAgbWF4Rmx1c2hCeXRlc18sCisgICAgICBtYXhGbHVzaEludGVydmFsXywKKyAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uXworICAgICk7CisgICAgc2V0TWF4TWFpbGJveFNpemUod3JpdGVyVGhyZWFkXywgZXZlbnRCdWZmZXJTaXplXywgT25Dcm93ZGluZy5ibG9jayk7CisgICAgaXNPcGVuXyA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQsIGkuZS4gdGhlIHVuZGVybHlpbmcgZmlsZSBhbmQgdGhlIHdyaXRlciB0aHJlYWQuCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBzZW5kKHdyaXRlclRocmVhZF8sIFNodXRkb3duTWVzc2FnZSgpLCB0aGlzVGlkKTsKKyAgICByZWNlaXZlKChTaHV0ZG93bk1lc3NhZ2UgbXNnLCBUaWQgdGlkKXt9KTsKKyAgICBpc09wZW5fID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogRW5xdWV1ZXMgdGhlIHBhc3NlZCBzbGljZSBvZiBkYXRhIGZvciB3cml0aW5nIGFuZCBpbW1lZGlhdGVseSByZXR1cm5zLgorICAgKiB3cml0ZSgpIG9ubHkgYmxvY2tzIGlmIHRoZSBldmVudCBidWZmZXIgaGFzIGJlZW4gZXhoYXVzdGVkLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIG9mIGRhdGEgdG8gd3JpdGUuCisgICAqLworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSB0byBub24tb3BlbiBmaWxlLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgaWYgKGJ1Zi5lbXB0eSkgeworICAgICAgbG9nRXJyb3IoIkNhbm5vdCB3cml0ZSBlbXB0eSBldmVudCwgc2tpcHBpbmcuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBtYXhTaXplID0gY2h1bmtTaXplIC0gRXZlbnRTaXplLnNpemVvZjsKKyAgICBlbmZvcmNlKGJ1Zi5sZW5ndGggPD0gbWF4U2l6ZSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHdyaXRlIG1vcmUgdGhhbiAiIH4gdG8hc3RyaW5nKG1heFNpemUpIH4KKyAgICAgICJieXRlcyBhdCBvbmNlIGR1ZSB0byBjaHVuayBzaXplLiIpKTsKKworICAgIHNlbmQod3JpdGVyVGhyZWFkXywgYnVmLmlkdXApOworICB9CisKKyAgLyoqCisgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBmbHVzaCBmaWxlIGlmIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaE1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgcmVjZWl2ZSgoRmx1c2hNZXNzYWdlIG1zZywgVGlkIHRpZCl7fSk7CisgIH0KKworICAvKioKKyAgICogVGhlIHNpemUgb2YgdGhlIGNodW5rcyB0aGUgZmlsZSBpcyBkaXZpZGVkIGludG8sIGluIGJ5dGVzLgorICAgKgorICAgKiBBIHNpbmdsZSBldmVudCAod3JpdGUgY2FsbCkgbmV2ZXIgc3BhbnMgbXVsdGlwbGUgY2h1bmtzIOKAkyB0aGlzCisgICAqIGVmZmVjdGl2ZWx5IGxpbWl0cyB0aGUgZXZlbnQgc2l6ZSB0byBjaHVua1NpemUgLSBFdmVudFNpemUuc2l6ZW9mLgorICAgKi8KKyAgdWxvbmcgY2h1bmtTaXplKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gY2h1bmtTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGNodW5rU2l6ZSh1bG9uZyB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKCFpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBzZXQgY2h1bmsgc2l6ZSBhZnRlciBURmlsZVdyaXRlclRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQuIikpOworICAgIGNodW5rU2l6ZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd3JpdGUoKSBjYWxscyBidWZmZXJlZCwgb3IgemVybyBmb3Igbm8gbGltaXQuCisgICAqCisgICAqIElmIHRoZSBidWZmZXIgaXMgZXhoYXVzdGVkLCB3cml0ZSgpIHdpbGwgYmxvY2sgdW50aWwgc3BhY2UgYmVjb21lcworICAgKiBhdmFpbGFibGUuCisgICAqLworICBzaXplX3QgZXZlbnRCdWZmZXJTaXplKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGV2ZW50QnVmZmVyU2l6ZShzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZXZlbnRCdWZmZXJTaXplXyA9IHZhbHVlOworICAgIGlmIChpc09wZW4pIHsKKyAgICAgIHNldE1heE1haWxib3hTaXplKHdyaXRlclRocmVhZF8sIHZhbHVlLCBPbkNyb3dkaW5nLnRocm93RXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFID0gMTBfMDAwOworCisgIC8qKgorICAgKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBidWZmZXJlZCBiZWZvcmUgd3JpdGluZyBhbmQgZmx1c2hpbmcgdGhlIGZpbGUKKyAgICogdG8gZGlzay4KKyAgICoKKyAgICogQ3VycmVudGx5IGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gd3JpdGUoKS4KKyAgICovCisgIHNpemVfdCBtYXhGbHVzaEJ5dGVzKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWF4Rmx1c2hCeXRlc187CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhGbHVzaEJ5dGVzKHNpemVfdCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBtYXhGbHVzaEJ5dGVzXyA9IHZhbHVlOworICAgIGlmIChpc09wZW4pIHsKKyAgICAgIHNlbmQod3JpdGVyVGhyZWFkXywgRmx1c2hCeXRlc01lc3NhZ2UodmFsdWUpKTsKKyAgICB9CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9GTFVTSF9CWVRFUyA9IDEwMDAgKiAxMDI0OworCisgIC8qKgorICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gZmx1c2hpbmcgdGhlIGZpbGUgdG8gZGlzay4KKyAgICoKKyAgICogQ3VycmVubHR5IGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gd3JpdGUoKS4KKyAgICovCisgIER1cmF0aW9uIG1heEZsdXNoSW50ZXJ2YWwoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBtYXhGbHVzaEludGVydmFsXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIG1heEZsdXNoSW50ZXJ2YWwoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4Rmx1c2hJbnRlcnZhbF8gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZW5kKHdyaXRlclRocmVhZF8sIEZsdXNoSW50ZXJ2YWxNZXNzYWdlKHZhbHVlKSk7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfRkxVU0hfSU5URVJWQUwgPSBkdXIhInNlY29uZHMiKDMpOworCisgIC8qKgorICAgKiBXaGVuIHRoZSB3cml0ZXIgdGhyZWFkIGVuY291bnRlcmVzIGFuIEkvTyBlcnJvciwgaXQgZ29lcyBwYXVzZXMgZm9yIGEKKyAgICogc2hvcnQgdGltZSBiZWZvcmUgdHJ5aW5nIHRvIHJlb3BlbiB0aGUgb3V0cHV0IGZpbGUuIFRoaXMgY29udHJvbHMgdGhlCisgICAqIHNsZWVwIGR1cmF0aW9uLgorICAgKi8KKyAgRHVyYXRpb24gaW9FcnJvclNsZWVwRHVyYXRpb24oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBpb0Vycm9yU2xlZXBEdXJhdGlvbl87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBpb0Vycm9yU2xlZXBEdXJhdGlvbihEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbl8gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZW5kKHdyaXRlclRocmVhZF8sIEZsdXNoSW50ZXJ2YWxNZXNzYWdlKHZhbHVlKSk7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9JT19FUlJPUl9TTEVFUF9EVVJBVElPTiA9IGR1ciEibXNlY3MiKDUwMCk7CisKK3ByaXZhdGU6CisgIHN0cmluZyBwYXRoXzsKKyAgdWxvbmcgY2h1bmtTaXplXzsKKyAgc2l6ZV90IGV2ZW50QnVmZmVyU2l6ZV87CisgIER1cmF0aW9uIGlvRXJyb3JTbGVlcER1cmF0aW9uXzsKKyAgc2l6ZV90IG1heEZsdXNoQnl0ZXNfOworICBEdXJhdGlvbiBtYXhGbHVzaEludGVydmFsXzsKKyAgYm9vbCBpc09wZW5fOworICBUaWQgd3JpdGVyVGhyZWFkXzsKK30KKworcHJpdmF0ZSB7CisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgZmlsZSBzaG91bGQgYmUgZmx1c2hlZCBvbiBkaXNrLiBTZW50IHRvIHRoZSB3cml0ZXIKKyAgLy8gdGhyZWFkIGFuZCBzZW50IGJhY2sgYWxvbmcgd2l0aCB0aGUgdGlkIGZvciBjb25maXJtYXRpb24uCisgIHN0cnVjdCBGbHVzaE1lc3NhZ2Uge30KKworICAvLyBTaWduYWxzIHRoYXQgdGhlIHdyaXRlciB0aHJlYWQgc2hvdWxkIGNsb3NlIHRoZSBmaWxlIGFuZCBzaHV0IGRvd24uIFNlbnQKKyAgLy8gdG8gdGhlIHdyaXRlciB0aHJlYWQgYW5kIHNlbnQgYmFjayBhbG9uZyB3aXRoIHRoZSB0aWQgZm9yIGNvbmZpcm1hdGlvbi4KKyAgc3RydWN0IFNodXRkb3duTWVzc2FnZSB7fQorCisgIHN0cnVjdCBGbHVzaEJ5dGVzTWVzc2FnZSB7CisgICAgc2l6ZV90IHZhbHVlOworICB9CisKKyAgc3RydWN0IEZsdXNoSW50ZXJ2YWxNZXNzYWdlIHsKKyAgICBEdXJhdGlvbiB2YWx1ZTsKKyAgfQorCisgIHN0cnVjdCBJb0Vycm9yU2xlZXBEdXJhdGlvbk1lc3NhZ2UgeworICAgIER1cmF0aW9uIHZhbHVlOworICB9CisKKyAgdm9pZCB3cml0ZXJUaHJlYWQoCisgICAgc3RyaW5nIHBhdGgsCisgICAgdWxvbmcgY2h1bmtTaXplLAorICAgIHNpemVfdCBtYXhGbHVzaEJ5dGVzLAorICAgIER1cmF0aW9uIG1heEZsdXNoSW50ZXJ2YWwsCisgICAgRHVyYXRpb24gaW9FcnJvclNsZWVwRHVyYXRpb24KKyAgKSB7CisgICAgYm9vbCBlcnJvck9wZW5pbmc7CisgICAgRmlsZSBmaWxlOworICAgIHVsb25nIG9mZnNldDsKKyAgICB0cnkgeworICAgICAgLy8gT3BlbiBmaWxlIGluIGFwcGVuZGluZyBhbmQgYmluYXJ5IG1vZGUuCisgICAgICBmaWxlID0gRmlsZShwYXRoLCAiYWIiKTsKKyAgICAgIG9mZnNldCA9IGZpbGUudGVsbCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiRXJyb3Igb24gb3BlbmluZyBvdXRwdXQgZmlsZSBpbiB3cml0ZXIgdGhyZWFkOiAlcyIsIGUpOworICAgICAgZXJyb3JPcGVuaW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvIGZsdXNoVGltZXIgPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgc2l6ZV90IHVuZmx1c2hlZEJ5dGVDb3VudDsKKworICAgIFRpZCBzaHV0ZG93blJlcXVlc3RUaWQ7CisgICAgYm9vbCBzaHV0ZG93blJlcXVlc3RlZDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKHNodXRkb3duUmVxdWVzdGVkKSBicmVhazsKKworICAgICAgYm9vbCBmb3JjZUZsdXNoOworICAgICAgVGlkIGZsdXNoUmVxdWVzdFRpZDsKKyAgICAgIHJlY2VpdmVUaW1lb3V0KG1heChkdXIhImhuc2VjcyIoMCksIG1heEZsdXNoSW50ZXJ2YWwgLSBmbHVzaFRpbWVyLnBlZWsoKSksCisgICAgICAgIChpbW11dGFibGUodWJ5dGUpW10gZGF0YSkgeworICAgICAgICAgIHdoaWxlIChlcnJvck9wZW5pbmcpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJXcml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAlcyDCtXMgZHVlIHRvIElPIGVycm9ycyIsCisgICAgICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uLnRvdGFsISJ1c2VjcyIpOworCisgICAgICAgICAgICAvLyBTbGVlcCBmb3IgaW9FcnJvclNsZWVwRHVyYXRpb24sIGJlaW5nIHJlYWR5IHRvIGJlIGludGVycnVwdGVkCisgICAgICAgICAgICAvLyBieSBzaHV0ZG93biByZXF1ZXN0cy4KKyAgICAgICAgICAgIGF1dG8gdGltZWRPdXQgPSByZWNlaXZlVGltZW91dChpb0Vycm9yU2xlZXBEdXJhdGlvbiwKKyAgICAgICAgICAgICAgKFNodXRkb3duTWVzc2FnZSBtc2csIFRpZCB0aWQpeyBzaHV0ZG93blJlcXVlc3RUaWQgPSB0aWQ7IH0pOworICAgICAgICAgICAgaWYgKCF0aW1lZE91dCkgeworICAgICAgICAgICAgICAvLyBXZSBnb3QgYSBzaHV0ZG93biByZXF1ZXN0LCBqdXN0IGRyb3AgYWxsIGV2ZW50cyBhbmQgZXhpdCB0aGUKKyAgICAgICAgICAgICAgLy8gbWFpbiBsb29wIGFzIHRvIG5vdCBibG9jayBhcHBsaWNhdGlvbiBzaHV0ZG93biB3aXRoIG91ciB0cmllcworICAgICAgICAgICAgICAvLyB3aGljaCB3ZSBtdXN0IGFzc3VtZSB0byBmYWlsLgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZmlsZSA9IEZpbGUocGF0aCwgImFiIik7CisgICAgICAgICAgICAgIHVuZmx1c2hlZEJ5dGVDb3VudCA9IDA7CisgICAgICAgICAgICAgIGVycm9yT3BlbmluZyA9IGZhbHNlOworICAgICAgICAgICAgICBsb2dFcnJvcigiT3V0cHV0IGZpbGUgJXMgcmVvcGVuZWQgZHVyaW5nIHdyaXRlciB0aHJlYWQgZXJyb3IgIiB+CisgICAgICAgICAgICAgICAgInJlY292ZXJ5IiwgcGF0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBsb2dFcnJvcigiVW5hYmxlIHRvIHJlb3BlbiBvdXRwdXQgZmlsZSAlcyBkdXJpbmcgd3JpdGVyICIgfgorICAgICAgICAgICAgICAgICJ0aHJlYWQgZXJyb3IgcmVjb3ZlcnkiLCBwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV2ZW50IGRvZXMgbm90IGNyb3NzIHRoZSBjaHVuayBib3VuZGFyeSBieSB3cml0aW5nCisgICAgICAgICAgLy8gYSBwYWRkaW5nIGNvbnNpc3Rpbmcgb2YgemVyb2VzIGlmIGl0IHdvdWxkLgorICAgICAgICAgIGF1dG8gY2h1bmsxID0gb2Zmc2V0IC8gY2h1bmtTaXplOworICAgICAgICAgIGF1dG8gY2h1bmsyID0gKG9mZnNldCArIEV2ZW50U2l6ZS5zaXplb2YgKyBkYXRhLmxlbmd0aCAtIDEpIC8gY2h1bmtTaXplOworCisgICAgICAgICAgaWYgKGNodW5rMSAhPSBjaHVuazIpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBDKysgaW1wbGVtZW50YXRpb24gcmVmZXRjaGVzIHRoZSBvZmZzZXQgaGVyZSB0byDCu2tlZXAKKyAgICAgICAgICAgIC8vIGluIHN5bmPCqyDigJMgd2h5IHdvdWxkIHRoaXMgYmUgbmVlZGVkPworICAgICAgICAgICAgYXV0byBwYWRkaW5nID0gY2FzdChzaXplX3QpCisgICAgICAgICAgICAgICgoKChvZmZzZXQgLyBjaHVua1NpemUpICsgMSkgKiBjaHVua1NpemUpIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgIGF1dG8gemVyb2VzID0gbmV3IHVieXRlW3BhZGRpbmddOworICAgICAgICAgICAgZmlsZS5yYXdXcml0ZSh6ZXJvZXMpOworICAgICAgICAgICAgdW5mbHVzaGVkQnl0ZUNvdW50ICs9IHBhZGRpbmc7CisgICAgICAgICAgICBvZmZzZXQgKz0gcGFkZGluZzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBUT0RPOiAyIHN5c2NhbGxzIGhlcmUsIGlzIHRoaXMgYSBwcm9ibGVtIHBlcmZvcm1hbmNlLXdpc2U/CisgICAgICAgICAgLy8gUHJvYmFibHkgYWJ5c21hbCBwZXJmb3JtYW5jZSBvbiBXaW5kb3dzIGR1ZSB0byByYXdXcml0ZQorICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgIHVpbnQgbGVuID0gY2FzdCh1aW50KWRhdGEubGVuZ3RoOworICAgICAgICAgIGZpbGUucmF3V3JpdGUoY2FzdCh1Ynl0ZVtdKSgmbGVuKVswLi4xXSk7CisgICAgICAgICAgZmlsZS5yYXdXcml0ZShkYXRhKTsKKworICAgICAgICAgIGF1dG8gYnl0ZXNXcml0dGVuID0gRXZlbnRTaXplLnNpemVvZiArIGRhdGEubGVuZ3RoOworICAgICAgICAgIHVuZmx1c2hlZEJ5dGVDb3VudCArPSBieXRlc1dyaXR0ZW47CisgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzV3JpdHRlbjsKKyAgICAgICAgfSwgKEZsdXNoQnl0ZXNNZXNzYWdlIG1zZykgeworICAgICAgICAgIG1heEZsdXNoQnl0ZXMgPSBtc2cudmFsdWU7CisgICAgICAgIH0sIChGbHVzaEludGVydmFsTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICBtYXhGbHVzaEludGVydmFsID0gbXNnLnZhbHVlOworICAgICAgICB9LCAoSW9FcnJvclNsZWVwRHVyYXRpb25NZXNzYWdlIG1zZykgeworICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uID0gbXNnLnZhbHVlOworICAgICAgICB9LCAoRmx1c2hNZXNzYWdlIG1zZywgVGlkIHRpZCkgeworICAgICAgICAgIGZvcmNlRmx1c2ggPSB0cnVlOworICAgICAgICAgIGZsdXNoUmVxdWVzdFRpZCA9IHRpZDsKKyAgICAgICAgfSwgKE93bmVyVGVybWluYXRlZCBtc2cpIHsKKyAgICAgICAgICBzaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgIH0sIChTaHV0ZG93bk1lc3NhZ2UgbXNnLCBUaWQgdGlkKSB7CisgICAgICAgICAgc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICAgIHNodXRkb3duUmVxdWVzdFRpZCA9IHRpZDsKKyAgICAgICAgfQorICAgICAgKTsKKworICAgICAgaWYgKGVycm9yT3BlbmluZykgY29udGludWU7CisKKyAgICAgIGJvb2wgZmx1c2g7CisgICAgICBpZiAoZm9yY2VGbHVzaCB8fCBzaHV0ZG93blJlcXVlc3RlZCB8fCB1bmZsdXNoZWRCeXRlQ291bnQgPiBtYXhGbHVzaEJ5dGVzKSB7CisgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoY2FzdChEdXJhdGlvbilmbHVzaFRpbWVyLnBlZWsoKSA+IG1heEZsdXNoSW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKHVuZmx1c2hlZEJ5dGVDb3VudCA9PSAwKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGZsdXNoIHRpbWVyIGlzIGR1ZSwgYnV0IG5vIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiwgZG9uJ3QKKyAgICAgICAgICAvLyBuZWVkbGVzc2x5IGZzeW5jLCBidXQgZG8gcmVzZXQgdGhlIHRpbWVyLgorICAgICAgICAgIGZsdXNoVGltZXIucmVzZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIGZpbGUuZmx1c2goKTsKKyAgICAgICAgZmx1c2hUaW1lci5yZXNldCgpOworICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgPSAwOworICAgICAgICBpZiAoZm9yY2VGbHVzaCkgc2VuZChmbHVzaFJlcXVlc3RUaWQsIEZsdXNoTWVzc2FnZSgpLCB0aGlzVGlkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaWxlLmNsb3NlKCk7CisKKyAgICBpZiAoc2h1dGRvd25SZXF1ZXN0VGlkICE9IFRpZC5pbml0KSB7CisgICAgICBzZW5kKHNodXRkb3duUmVxdWVzdFRpZCwgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOworICAgIH0KKyAgfQorfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKKyAgaW1wb3J0IHN0ZC5maWxlOworfQorCit1bml0dGVzdCB7CisgIHZvaWQgdHJ5UmVtb3ZlKHN0cmluZyBmaWxlTmFtZSkgeworICAgIHRyeSB7CisgICAgICByZW1vdmUoZmlsZU5hbWUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbikge30KKyAgfQorCisgIGltbXV0YWJsZSBmaWxlTmFtZSA9ICJ1bml0dGVzdC5kYXQudG1wIjsKKyAgZW5mb3JjZSghZXhpc3RzKGZpbGVOYW1lKSwgIlVuaXQgdGVzdCBvdXRwdXQgZmlsZSAiIH4gZmlsZU5hbWUgfgorICAgICIgYWxyZWFkeSBleGlzdHMuIik7CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG1vc3QgYmFzaWMgcmVhZGluZy93cml0aW5nIG9wZXJhdGlvbnMuCisgICAqLworICB7CisgICAgc2NvcGUgKGV4aXQpIHRyeVJlbW92ZShmaWxlTmFtZSk7CisKKyAgICBhdXRvIHdyaXRlciA9IG5ldyBURmlsZVdyaXRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgd3JpdGVyLm9wZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgd3JpdGVyLmNsb3NlKCk7CisKKyAgICB3cml0ZXIud3JpdGUoWzEsIDJdKTsKKyAgICB3cml0ZXIud3JpdGUoWzMsIDRdKTsKKyAgICB3cml0ZXIud3JpdGUoWzUsIDYsIDddKTsKKyAgICB3cml0ZXIuZmx1c2goKTsKKworICAgIGF1dG8gcmVhZGVyID0gbmV3IFRGaWxlUmVhZGVyVHJhbnNwb3J0KGZpbGVOYW1lKTsKKyAgICByZWFkZXIub3BlbigpOworICAgIHNjb3BlIChleGl0KSByZWFkZXIuY2xvc2UoKTsKKworICAgIGF1dG8gYnVmID0gbmV3IHVieXRlWzddOworICAgIHJlYWRlci5yZWFkQWxsKGJ1Zik7CisgICAgZW5mb3JjZShidWYgPT0gWzEsIDIsIDMsIDQsIDUsIDYsIDddKTsKKyAgfQorCisgIC8qCisgICAqIENoZWNrIHRoYXQgY2h1bmtpbmcgd29ya3MgYXMgZXhwZWN0ZWQuCisgICAqLworICB7CisgICAgc2NvcGUgKGV4aXQpIHRyeVJlbW92ZShmaWxlTmFtZSk7CisKKyAgICBzdGF0aWMgYXNzZXJ0KEV2ZW50U2l6ZS5zaXplb2YgPT0gNCk7CisgICAgZW51bSBDSFVOS19TSVpFID0gMTA7CisKKyAgICAvLyBXcml0ZSBzb21lIGNvbnRlbnRzIHRvIHRoZSBmaWxlLgorICAgIHsKKyAgICAgIGF1dG8gd3JpdGVyID0gbmV3IFRGaWxlV3JpdGVyVHJhbnNwb3J0KGZpbGVOYW1lKTsKKyAgICAgIHdyaXRlci5jaHVua1NpemUgPSBDSFVOS19TSVpFOworICAgICAgd3JpdGVyLm9wZW4oKTsKKyAgICAgIHNjb3BlIChleGl0KSB3cml0ZXIuY2xvc2UoKTsKKworICAgICAgd3JpdGVyLndyaXRlKFsweGRlXSk7CisgICAgICB3cml0ZXIud3JpdGUoWzB4YWRdKTsKKyAgICAgIC8vIENodW5rIGJvdW5kYXJ5IGhlcmUuCisgICAgICB3cml0ZXIud3JpdGUoWzB4YmVdKTsKKyAgICAgIC8vIFRoZSBuZXh0IHdyaXRlIGRvZXNuJ3QgZml0IGluIHRoZSBmaXZlIGJ5dGVzIHJlbWFpbmluZywgc28gd2UgZXhwZWN0CisgICAgICAvLyBwYWRkaW5nIHplcm8gYnl0ZXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgIHdyaXRlci53cml0ZShbMHhlZiwgMHgxMl0pOworCisgICAgICB0cnkgeworICAgICAgICB3cml0ZXIud3JpdGUobmV3IHVieXRlW0NIVU5LX1NJWkVdKTsKKyAgICAgICAgZW5mb3JjZShmYWxzZSwgIkNvdWxkIHdyaXRlIGV2ZW50IG5vdCBmaXR0aW5nIGluIGEgc2luZ2xlIGNodW5rLiIpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7fQorCisgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGUgcmF3IGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvIHNlZSBpZiBjaHVuayBwYWRkaW5nIHdhcyB3cml0dGVuCisgICAgLy8gYXMgZXhwZWN0ZWQuCisgICAgYXV0byBmaWxlID0gRmlsZShmaWxlTmFtZSwgInIiKTsKKyAgICBlbmZvcmNlKGZpbGUuc2l6ZSA9PSAyNik7CisgICAgYXV0byB3cml0dGVuID0gbmV3IHVieXRlWzI2XTsKKyAgICBmaWxlLnJhd1JlYWQod3JpdHRlbik7CisgICAgZW5mb3JjZSh3cml0dGVuID09IFsKKyAgICAgIDEsIDAsIDAsIDAsIDB4ZGUsCisgICAgICAxLCAwLCAwLCAwLCAweGFkLAorICAgICAgMSwgMCwgMCwgMCwgMHhiZSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAyLCAwLCAwLCAwLCAweGVmLCAweDEyCisgICAgXSk7CisKKyAgICAvLyBSZWFkIHRoZSBkYXRhIGJhY2sgaW4sIGdldHRpbmcgYWxsIHRoZSBldmVudHMgYXQgb25jZS4KKyAgICB7CisgICAgICBhdXRvIHJlYWRlciA9IG5ldyBURmlsZVJlYWRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgICByZWFkZXIuY2h1bmtTaXplID0gQ0hVTktfU0laRTsKKyAgICAgIHJlYWRlci5vcGVuKCk7CisgICAgICBzY29wZSAoZXhpdCkgcmVhZGVyLmNsb3NlKCk7CisKKyAgICAgIGF1dG8gYnVmID0gbmV3IHVieXRlWzVdOworICAgICAgcmVhZGVyLnJlYWRBbGwoYnVmKTsKKyAgICAgIGVuZm9yY2UoYnVmID09IFsweGRlLCAweGFkLCAweGJlLCAweGVmLCAweDEyXSk7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoYXQgY2xvc2UoKSBleGl0cyAicXVpY2tseSIsIGkuZS4gdGhhdCB0aGVyZSBpcyBubyBwcm9ibGVtCisgICAqIHdpdGggdGhlIHdvcmtlciB0aHJlYWQgd2FraW5nIHVwLgorICAgKi8KKyAgeworICAgIGltcG9ydCBzdGQuY29udiA6IHRleHQ7CisgICAgZW51bSBOVU1fSVRFUkFUSU9OUyA9IDEwMDA7CisKKyAgICB1aW50IG51bU92ZXIgPSAwOworICAgIGZvcmVhY2ggKG47IDAgLi4gTlVNX0lURVJBVElPTlMpIHsKKyAgICAgIHNjb3BlIChleGl0KSB0cnlSZW1vdmUoZmlsZU5hbWUpOworCisgICAgICBhdXRvIHRyYW5zcG9ydCA9IG5ldyBURmlsZVdyaXRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgICB0cmFuc3BvcnQub3BlbigpOworCisgICAgICAvLyBXcml0ZSBzb21ldGhpbmcgc28gdGhhdCB0aGUgd3JpdGVyIHRocmVhZCBnZXRzIHN0YXJ0ZWQuCisgICAgICB0cmFuc3BvcnQud3JpdGUoY2FzdCh1Ynl0ZVtdKSJmb28iKTsKKworICAgICAgLy8gRXZlcnkgb3RoZXIgaXRlcmF0aW9uLCBhbHNvIGNhbGwgZmx1c2goKSwganVzdCBpbiBjYXNlIHRoYXQgcG90ZW50aWFsbHkKKyAgICAgIC8vIGhhcyBhbnkgZWZmZWN0IG9uIGhvdyB0aGUgd3JpdGVyIHRocmVhZCB3YWtlcyB1cC4KKyAgICAgIGlmIChuICYgMHgxKSB7CisgICAgICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgfQorCisgICAgICAvLyBUaW1lIHRoZSBjYWxsIHRvIGNsb3NlKCkuCisgICAgICBhdXRvIHN3ID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICBzdy5zdG9wKCk7CisKKyAgICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhdGFsIGZhaWx1cmUgdG8KKyAgICAgIC8vIGF2b2lkIGxvb3Bpbmcgb3ZlciBhIHBvdGVudGlhbGx5IHZlcnkgc2xvdyBvcGVyYXRpb24uCisgICAgICBlbmZvcmNlKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiIDwgMTUwMCwKKyAgICAgICAgdGV4dCgiY2xvc2UoKSB0b29rICIsIHN3LnBlZWsoKS50b3RhbCEibXNlY3MiLCAibXMuIikpOworCisgICAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDVtcyBvbiBteSBkZXYgYm94LgorICAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zIGNhbiB0YWtlCisgICAgICAvLyBsb25nZXIuIEFkZGl0aW9uYWxseSwgb24gYSBXaW5kb3dzIFNlcnZlciAyMDA4IGluc3RhbmNlIHJ1bm5pbmcgaW4KKyAgICAgIC8vIGEgVmlydHVhbEJveCBWTSwgaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCBhYm91dCBhIHF1YXJ0ZXIgb2YgdGhlIHJ1bnMKKyAgICAgIC8vIHRha2VzICgyMTcgwrEgMSkgbXMsIGZvciByZWFzb25zIG5vdCB5ZXQga25vd24uCisgICAgICBpZiAoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPiA1MCkgeworICAgICAgICArK251bU92ZXI7CisgICAgICB9CisKKyAgICAgIC8vIEZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBydW5zIGV2ZXJ5IG5vdyBhbmQgdGhlbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgIC8vIGRvbid0IHJ1biBvdXQgb2YgT1MgdGhyZWFkIGhhbmRsZXMuCisgICAgICBpZiAoIShuICUgMTAwKSkgR0MuY29sbGVjdCgpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBmZXdlciB0aGFuIGEgdGhpcmQgb2YgdGhlIHJ1bnMgdG9vayBsb25nZXIgdGhhbiA1bXMuCisgICAgZW5mb3JjZShudW1PdmVyIDwgTlVNX0lURVJBVElPTlMgLyAzLAorICAgICAgdGV4dChudW1PdmVyLCAiIGl0ZXJhdGlvbnMgdG9vayBtb3JlIHRoYW4gMTAgbXMuIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWZmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWQuZApAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CisKK2ltcG9ydCBjb3JlLmJpdG9wIDogYnN3YXA7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogRnJhbWVkIHRyYW5zcG9ydC4KKyAqCisgKiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcyBjYWxsZWQsIGF0IHdoaWNoIHBvaW50CisgKiB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZQorICogZGF0YSBwYXlsb2FkLiBUaGUgcmVjZWl2ZXIgb24gdGhlIG90aGVyIGVuZCB0aGVuIHBlcmZvcm1zIGEgc2luZ2xlCisgKiDCu2ZpeGVkLWxlbmd0aMKrIHJlYWQgdG8gZ2V0IHRoZSB3aG9sZSBtZXNzYWdlIG9mZiB0aGUgd2lyZS4KKyAqLworZmluYWwgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgZnJhbWVkIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgd3JhcHBlZCB0cmFuc3BvcnQuCisgICAqLworICBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc3BvcnRfOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLmlzT3BlbjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gckJ1Zl8ubGVuZ3RoID4gMCB8fCB0cmFuc3BvcnRfLnBlZWsoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgZmx1c2goKTsKKyAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcmVhZCBkYXRhIGludG8gdGhlIGdpdmVuIGJ1ZmZlciwgc3RvcHBpbmcgd2hlbiB0aGUgYnVmZmVyIGlzCisgICAqIGV4aGF1c3RlZCBvciB0aGUgZnJhbWUgZW5kIGlzIHJlYWNoZWQuCisgICAqCisgICAqIFRPRE86IENvbnRyYXJ5IHRvIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHRoaXMgbmV2ZXIgZG9lcyBjcm9zcy1mcmFtZQorICAgKiByZWFkcyDigJMgaXMgdGhlcmUgYWN0dWFsbHkgYSB2YWxpZCB1c2UgY2FzZSBmb3IgdGhhdD8KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIHRvIHVzZSBhcyBidWZmZXIuCisgICAqCisgICAqIFJldHVybnM6IEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZC4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgLy8gSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSwgcmVhZCBhIG5ldyBmcmFtZSBvZmYgdGhlIHdpcmUuCisgICAgaWYgKHJCdWZfLmVtcHR5KSB7CisgICAgICBib29sIGdvdEZyYW1lID0gcmVhZEZyYW1lKCk7CisgICAgICBpZiAoIWdvdEZyYW1lKSByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdXRvIHNpemUgPSBtaW4ockJ1Zl8ubGVuZ3RoLCBidWYubGVuZ3RoKTsKKyAgICBidWZbMC4uc2l6ZV0gPSByQnVmX1swLi5zaXplXTsKKyAgICByQnVmXyA9IHJCdWZfW3NpemUuLiRdOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHdCdWZfIH49IGJ1ZjsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgaWYgKHdCdWZfLmVtcHR5KSByZXR1cm47CisKKyAgICAvLyBQcm9wZXJseSByZXNldCB0aGUgd3JpdGUgYnVmZmVyIGV2ZW4gc29tZSBvZiB0aGUgcHJvdG9jb2wgb3BlcmF0aW9ucyBnbworICAgIC8vIHdyb25nLgorICAgIHNjb3BlIChleGl0KSB7CisgICAgICB3QnVmXy5sZW5ndGggPSAwOworICAgICAgd0J1Zl8uYXNzdW1lU2FmZUFwcGVuZCgpOworICAgIH0KKworICAgIGludCBsZW4gPSBic3dhcChjYXN0KGludCl3QnVmXy5sZW5ndGgpOworICAgIHRyYW5zcG9ydF8ud3JpdGUoY2FzdCh1Ynl0ZVtdKSgmbGVuKVswLi4xXSk7CisgICAgdHJhbnNwb3J0Xy53cml0ZSh3QnVmXyk7CisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHJCdWZfLmxlbmd0aCkgeworICAgICAgcmV0dXJuIHJCdWZfOworICAgIH0gZWxzZSB7CisgICAgICAvLyBEb24ndCB0cnkgYXR0ZW1wdGluZyBjcm9zcy1mcmFtZSBib3Jyb3dzLCB0cnlpbmcgdGhhdCBkb2VzIG5vdCBtYWtlCisgICAgICAvLyBtdWNoIHNlbnNlIGFueXdheS4KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgZW5mb3JjZShsZW4gPD0gckJ1Zl8ubGVuZ3RoLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJJbnZhbGlkIGNvbnN1bWUgbGVuZ3RoIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisgICAgckJ1Zl8gPSByQnVmX1tsZW4gLi4gJF07CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCByZWFkRnJhbWUoKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4gV2UgY2FuJ3QgdXNlIHJlYWRBbGwoKSBzaW5jZSB0aGF0CisgICAgLy8gYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24gb24gRU9GLCBidXQgd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gb25seQorICAgIC8vIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgcGFydGlhbCBzaXplIGRhdGEuCisgICAgaW50IHNpemU7CisgICAgc2l6ZV90IHNpemVfcmVhZDsKKyAgICB3aGlsZSAoc2l6ZV9yZWFkIDwgc2l6ZS5zaXplb2YpIHsKKyAgICAgIGF1dG8gZGF0YSA9IChjYXN0KHVieXRlKikmc2l6ZSlbc2l6ZV9yZWFkLi5zaXplLnNpemVvZl07CisgICAgICBhdXRvIHJlYWQgPSB0cmFuc3BvcnRfLnJlYWQoZGF0YSk7CisgICAgICBpZiAocmVhZCA9PSAwKSB7CisgICAgICAgIGlmIChzaXplX3JlYWQgPT0gMCkgeworICAgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyIOKAkyBpbGxlZ2FsLgorICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgIk5vIG1vcmUgZGF0YSB0byByZWFkIGFmdGVyIHBhcnRpYWwgZnJhbWUgaGVhZGVyIiwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRQorICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNpemVfcmVhZCArPSByZWFkOworICAgIH0KKworICAgIHNpemUgPSBic3dhcChzaXplKTsKKyAgICBlbmZvcmNlKHNpemUgPj0gMCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgaGFzIG5lZ2F0aXZlIHZhbHVlIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSkpOworCisgICAgLy8gVE9ETzogQmVuY2htYXJrIHRoaXMuCisgICAgckJ1Zl8ubGVuZ3RoID0gc2l6ZTsKKyAgICByQnVmXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisKKyAgICB0cmFuc3BvcnRfLnJlYWRBbGwockJ1Zl8pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnRfOworICB1Ynl0ZVtdIHJCdWZfOworICB1Ynl0ZVtdIHdCdWZfOworfQorCisvKioKKyAqIFdyYXBzIGdpdmVuIHRyYW5zcG9ydHMgaW50byBURnJhbWVkVHJhbnNwb3J0cy4KKyAqLworYWxpYXMgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5IVRGcmFtZWRUcmFuc3BvcnQgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGltcG9ydCBzdGQucmFuZG9tIDogTXQxOTkzNywgdW5pZm9ybTsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworfQorCisvLyBTb21lIGJhc2ljIHJhbmRvbSB0ZXN0aW5nLCBhbHdheXMgc3RhcnRpbmcgd2l0aCB0aGUgc2FtZSBzZWVkIGZvcgorLy8gZGV0ZXJtaW5pc3RpYyB1bml0IHRlc3QgcmVzdWx0cyDigJMgbW9yZSB0ZXN0cyBpbiB0cmFuc3BvcnRfdGVzdC4KK3VuaXR0ZXN0IHsKKyAgYXV0byByYW5kR2VuID0gTXQxOTkzNyg0Mik7CisKKyAgLy8gMzIga2lCIG9mIGRhdGEgdG8gd29yayB3aXRoLgorICBhdXRvIGRhdGEgPSBuZXcgdWJ5dGVbMSA8PCAxNV07CisgIGZvcmVhY2ggKHJlZiBiOyBkYXRhKSB7CisgICAgYiA9IHVuaWZvcm0hIltdIihjYXN0KHVieXRlKTAsIGNhc3QodWJ5dGUpMjU1LCByYW5kR2VuKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGEgbGlzdCBvZiBjaHVuayBzaXplcyB0byBzcGxpdCB0aGUgZGF0YSBpbnRvLiBBIHVuaWZvcm0KKyAgLy8gZGlzdHJpYnV0aW9uIGlzIG5vdCBxdWl0ZSByZWFsaXN0aWMsIGJ1dCBzdGQucmFuZG9tIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZworICAvLyBlbHNlIHlldC4KKyAgZW51bSBNQVhfRlJBTUVfTEVOR1RIID0gNTEyOworICBhdXRvIGNodW5rU2l6ZXNMaXN0ID0gbmV3IHNpemVfdFtdWzJdOworICBmb3JlYWNoIChyZWYgY2h1bmtTaXplczsgY2h1bmtTaXplc0xpc3QpIHsKKyAgICBzaXplX3Qgc3VtOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGN1ckxlbiA9IHVuaWZvcm0oMCwgTUFYX0ZSQU1FX0xFTkdUSCwgcmFuZEdlbik7CisgICAgICBzdW0gKz0gY3VyTGVuOworICAgICAgaWYgKHN1bSA+IGRhdGEubGVuZ3RoKSBicmVhazsKKyAgICAgIGNodW5rU2l6ZXMgfj0gY3VyTGVuOworICAgIH0KKyAgfQorICBjaHVua1NpemVzTGlzdCB+PSBbZGF0YS5sZW5ndGhdOyAvLyBBbHNvIHRlc3Qgd2hvbGUgY2h1bmsgYXQgb25jZS4KKworICAvLyBUZXN0IHdyaXRpbmcgZGF0YS4KKyAgeworICAgIGZvcmVhY2ggKGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgICAgYXV0byBmcmFtZWQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChidWYpOworCisgICAgICBhdXRvIHJlbWFpbmluZ0RhdGEgPSBkYXRhOworICAgICAgZm9yZWFjaCAoY2h1bmtTaXplOyBjaHVua1NpemVzKSB7CisgICAgICAgIGZyYW1lZC53cml0ZShyZW1haW5pbmdEYXRhWzAuLmNodW5rU2l6ZV0pOworICAgICAgICByZW1haW5pbmdEYXRhID0gcmVtYWluaW5nRGF0YVtjaHVua1NpemUuLiRdOworICAgICAgfQorICAgICAgZnJhbWVkLmZsdXNoKCk7CisKKyAgICAgIGF1dG8gd3JpdHRlbkRhdGEgPSBkYXRhWzAuLigkIC0gcmVtYWluaW5nRGF0YS5sZW5ndGgpXTsKKyAgICAgIGF1dG8gYWN0dWFsRGF0YSA9IGJ1Zi5nZXRDb250ZW50cygpOworCisgICAgICAvLyBDaGVjayBmcmFtZSBzaXplLgorICAgICAgaW50IGZyYW1lU2l6ZSA9IGJzd2FwKChjYXN0KGludFtdKShhY3R1YWxEYXRhWzAuLmludC5zaXplb2ZdKSlbMF0pOworICAgICAgZW5mb3JjZShmcmFtZVNpemUgPT0gd3JpdHRlbkRhdGEubGVuZ3RoKTsKKworICAgICAgLy8gQ2hlY2sgYWN0dWFsIGRhdGEuCisgICAgICBlbmZvcmNlKGFjdHVhbERhdGFbaW50LnNpemVvZi4uJF0gPT0gd3JpdHRlbkRhdGEpOworICAgIH0KKyAgfQorCisgIC8vIFRlc3QgcmVhZGluZyBkYXRhLgorICB7CisgICAgZm9yZWFjaCAoY2h1bmtTaXplczsgY2h1bmtTaXplc0xpc3QpIHsKKyAgICAgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisKKyAgICAgIGF1dG8gc2l6ZSA9IGJzd2FwKGNhc3QoaW50KWRhdGEubGVuZ3RoKTsKKyAgICAgIGJ1Zi53cml0ZShjYXN0KHVieXRlW10pKCZzaXplKVswLi4xXSk7CisgICAgICBidWYud3JpdGUoZGF0YSk7CisKKyAgICAgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKyAgICAgIHVieXRlW10gcmVhZERhdGE7CisgICAgICByZWFkRGF0YS5yZXNlcnZlKGRhdGEubGVuZ3RoKTsKKyAgICAgIGZvcmVhY2ggKGNodW5rU2l6ZTsgY2h1bmtTaXplcykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCB3b3JrIHdpdGggcmVhZCBiZWNhdXNlIHdlIGhhdmUgb25lIGh1Z2UgZnJhbWUuCisgICAgICAgIGF1dG8gb2xkUmVhZExlbiA9IHJlYWREYXRhLmxlbmd0aDsKKyAgICAgICAgcmVhZERhdGEubGVuZ3RoICs9IGNodW5rU2l6ZTsKKyAgICAgICAgZnJhbWVkLnJlYWQocmVhZERhdGFbb2xkUmVhZExlbi4uJF0pOworICAgICAgfQorCisgICAgICBlbmZvcmNlKHJlYWREYXRhID09IGRhdGFbMC4ucmVhZERhdGEubGVuZ3RoXSk7CisgICAgfQorICB9CisKKyAgLy8gVGVzdCBjb21iaW5lZCByZWFkaW5nL3dyaXRpbmcgb2YgbXVsdGlwbGUgZnJhbWVzLgorICBmb3JlYWNoIChmbHVzaFByb2JhYmlsaXR5OyBbMSwgMiwgNCwgOCwgMTYsIDMyXSkgeworICAgIGZvcmVhY2ggKGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgICAgYXV0byBmcmFtZWQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChidWYpOworCisgICAgICBzaXplX3RbXSBmcmFtZVNpemVzOworCisgICAgICAvLyBXcml0ZSB0aGUgZGF0YS4KKyAgICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgICBhdXRvIHJlbWFpbmluZ0RhdGEgPSBkYXRhOworICAgICAgZm9yZWFjaCAoY2h1bmtTaXplOyBjaHVua1NpemVzKSB7CisgICAgICAgIGZyYW1lZC53cml0ZShyZW1haW5pbmdEYXRhWzAuLmNodW5rU2l6ZV0pOworICAgICAgICByZW1haW5pbmdEYXRhID0gcmVtYWluaW5nRGF0YVtjaHVua1NpemUuLiRdOworCisgICAgICAgIGZyYW1lU2l6ZSArPSBjaHVua1NpemU7CisgICAgICAgIGlmIChmcmFtZVNpemUgPiAwICYmIHVuaWZvcm0oMCwgZmx1c2hQcm9iYWJpbGl0eSwgcmFuZEdlbikgPT0gMCkgeworICAgICAgICAgIGZyYW1lU2l6ZXMgfj0gZnJhbWVTaXplOworICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgZnJhbWVkLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmcmFtZVNpemUgPiAwKSB7CisgICAgICAgIGZyYW1lU2l6ZXMgfj0gZnJhbWVTaXplOworICAgICAgICBmcmFtZVNpemUgPSAwOworICAgICAgICBmcmFtZWQuZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVhZCBpdCBiYWNrLgorICAgICAgYXV0byByZWFkRGF0YSA9IG5ldyB1Ynl0ZVtkYXRhLmxlbmd0aCAtIHJlbWFpbmluZ0RhdGEubGVuZ3RoXTsKKyAgICAgIGF1dG8gcmVtYWluVG9SZWFkID0gcmVhZERhdGE7CisgICAgICBmb3JlYWNoIChmU2l6ZTsgZnJhbWVTaXplcykgeworICAgICAgICAvLyBXZSBhcmUgZXhwbG9pdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgVEZyYW1lZFRyYW5zcG9ydDoKKyAgICAgICAgLy8gVGhlIHJlYWQgYnVmZmVyIHN0YXJ0cyBlbXB0eSBhbmQgaXQgd2lsbCBuZXZlciByZXR1cm4gbW9yZSB0aGFuIG9uZQorICAgICAgICAvLyBmcmFtZSBwZXIgcmVhZCwgc28gYnkganVzdCByZXF1ZXN0aW5nIGFsbCBvZiB0aGUgZGF0YSwgd2Ugc2hvdWxkCisgICAgICAgIC8vIGFsd2F5cyBnZXQgZXhhY3RseSBvbmUgZnJhbWUuCisgICAgICAgIGF1dG8gZ290ID0gZnJhbWVkLnJlYWQocmVtYWluVG9SZWFkKTsKKyAgICAgICAgZW5mb3JjZShnb3QgPT0gZlNpemUpOworICAgICAgICByZW1haW5Ub1JlYWQgPSByZW1haW5Ub1JlYWRbZlNpemUuLiRdOworICAgICAgfQorCisgICAgICBlbmZvcmNlKHJlbWFpblRvUmVhZC5lbXB0eSk7CisgICAgICBlbmZvcmNlKHJlYWREYXRhID09IGRhdGFbMC4ucmVhZERhdGEubGVuZ3RoXSk7CisgICAgfQorICB9Cit9CisKKy8vIFRlc3QgZmx1c2goKWluZyBhbiBlbXB0eSBidWZmZXIuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgYXV0byBmcmFtZWQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChidWYpOworICBpbW11dGFibGUgb3V0MSA9IFswLCAwLCAwLCAxLCAnYSddOworICBpbW11dGFibGUgb3V0MiA9IFswLCAwLCAwLCAxLCAnYScsIDAsIDAsIDAsIDIsICdiJywgJ2MnXTsKKworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBbXSk7CisgIGZyYW1lZC5mbHVzaCgpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBbXSk7CisgIGZyYW1lZC53cml0ZShjYXN0KHVieXRlW10pImEiKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBbXSk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDEpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gb3V0MSk7CisgIGZyYW1lZC53cml0ZShjYXN0KHVieXRlW10pImJjIik7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gb3V0MSk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDIpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gb3V0Mik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1OGRlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZApAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEhUVFAgdHJhbnBzb3J0IGltcGxlbWVudGF0aW9uLCBtb2RlbGxlZCBhZnRlciB0aGUgQysrIG9uZS4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCBsaWJjdXJsIGlzIHF1aXRlIGhlYXZ5d2VpZ2h0IGFuZCBzdXBwb3J0cyBvbmx5IGNsaWVudC1zaWRlCisgKiBhcHBsaWNhdGlvbnMuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2ljIEhUVFAvMS4xIHBhcnRzCisgKiBzdXBwb3J0aW5nIEhUVFAgMTAwIENvbnRpbnVlLCBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLCBrZWVwYWxpdmUsIGV0Yy4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuaHR0cDsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBjYW5GaW5kLCBjb3VudFVudGlsLCBlbmRzV2l0aCwgZmluZFNwbGl0LCBtaW4sIHN0YXJ0c1dpdGg7CitpbXBvcnQgc3RkLmFzY2lpIDogdG9Mb3dlcjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHBhcnNlLCB0bzsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBDbG9jaywgVVRDOworaW1wb3J0IHN0ZC5zdHJpbmcgOiBzdHJpcExlZnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2UgOiBWRVJTSU9OOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBib3RoIGNsaWVudC0gYW5kIHNlcnZlci1zaWRlIEhUVFAgdHJhbnNwb3J0cy4KKyAqLworYWJzdHJhY3QgY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICAgIHJlYWRIZWFkZXJzXyA9IHRydWU7CisgICAgaHR0cEJ1Zl8gPSBuZXcgdWJ5dGVbSFRUUF9CVUZGRVJfU0laRV07CisgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmX1swIC4uIDBdOworICAgIHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgICAgd3JpdGVCdWZmZXJfID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgaWYgKCFyZWFkQnVmZmVyXy5wZWVrKCkpIHsKKyAgICAgIHJlYWRCdWZmZXJfLnJlc2V0KCk7CisKKyAgICAgIGlmICghcmVmaWxsKCkpIHJldHVybiAwOworCisgICAgICBpZiAocmVhZEhlYWRlcnNfKSB7CisgICAgICAgIHJlYWRIZWFkZXJzKCk7CisgICAgICB9CisKKyAgICAgIHNpemVfdCBnb3Q7CisgICAgICBpZiAoY2h1bmtlZF8pIHsKKyAgICAgICAgZ290ID0gcmVhZENodW5rZWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdCA9IHJlYWRDb250ZW50KGNvbnRlbnRMZW5ndGhfKTsKKyAgICAgIH0KKyAgICAgIHJlYWRIZWFkZXJzXyA9IHRydWU7CisKKyAgICAgIGlmIChnb3QgPT0gMCkgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiByZWFkQnVmZmVyXy5yZWFkKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZEVuZCgpIHsKKyAgICAvLyBSZWFkIGFueSBwZW5kaW5nIGNodW5rZWQgZGF0YSAoZm9vdGVycyBldGMuKQorICAgIGlmIChjaHVua2VkXykgeworICAgICAgd2hpbGUgKCFjaHVua2VkRG9uZV8pIHsKKyAgICAgICAgcmVhZENodW5rZWQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGF1dG8gZGF0YSA9IHdyaXRlQnVmZmVyXy5nZXRDb250ZW50cygpOworICAgIHN0cmluZyBoZWFkZXIgPSBnZXRIZWFkZXIoZGF0YS5sZW5ndGgpOworCisgICAgdHJhbnNwb3J0Xy53cml0ZShjYXN0KGNvbnN0KHVieXRlKVtdKSBoZWFkZXIpOworICAgIHRyYW5zcG9ydF8ud3JpdGUoZGF0YSk7CisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworCisgICAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcy4KKyAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gcmVhZCBIVFRQIHJlcXVlc3RzIGludG8sIGluIGJ5dGVzLiBXaWxsIGV4cGFuZAorICAgKiBhcyByZXF1aXJlZC4KKyAgICovCisgIGVudW0gSFRUUF9CVUZGRVJfU0laRSA9IDEwMjQ7CisKK3Byb3RlY3RlZDoKKyAgYWJzdHJhY3Qgc3RyaW5nIGdldEhlYWRlcihzaXplX3QgZGF0YUxlbmd0aCk7CisgIGFic3RyYWN0IGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNvbnN0KHVieXRlKVtdIHN0YXR1cyk7CisKKyAgdm9pZCBwYXJzZUhlYWRlcihjb25zdCh1Ynl0ZSlbXSBoZWFkZXIpIHsKKyAgICBhdXRvIHNwbGl0ID0gZmluZFNwbGl0KGhlYWRlciwgWyc6J10pOworICAgIGlmIChzcGxpdFsxXS5lbXB0eSkgeworICAgICAgLy8gTm8gY29sb24gZm91bmQuCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY29tcFRvTG93ZXIodWJ5dGUgYSwgdWJ5dGUgYikgeworICAgICAgcmV0dXJuIHRvTG93ZXIoY2FzdChjaGFyKWEpID09IHRvTG93ZXIoY2FzdChjaGFyKWIpOworICAgIH0KKworICAgIGlmIChzdGFydHNXaXRoIWNvbXBUb0xvd2VyKHNwbGl0WzBdLCBjYXN0KHVieXRlW10pInRyYW5zZmVyLWVuY29kaW5nIikpIHsKKyAgICAgIGlmIChlbmRzV2l0aCFjb21wVG9Mb3dlcihzcGxpdFsyXSwgY2FzdCh1Ynl0ZVtdKSJjaHVua2VkIikpIHsKKyAgICAgICAgY2h1bmtlZF8gPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aCFjb21wVG9Mb3dlcihzcGxpdFswXSwgY2FzdCh1Ynl0ZVtdKSJjb250ZW50LWxlbmd0aCIpKSB7CisgICAgICBjaHVua2VkXyA9IGZhbHNlOworICAgICAgYXV0byBsZW5ndGhTdHJpbmcgPSBzdHJpcExlZnQoY2FzdChjb25zdChjaGFyKVtdKXNwbGl0WzJdKTsKKyAgICAgIGNvbnRlbnRMZW5ndGhfID0gcGFyc2Uhc2l6ZV90KGxlbmd0aFN0cmluZyk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHVieXRlW10gcmVhZExpbmUoKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gc3BsaXQgPSBmaW5kU3BsaXQoaHR0cEJ1ZlJlbWFpbmluZ18sIGNhc3QodWJ5dGVbXSkiXHJcbiIpOworCisgICAgICBpZiAoc3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgICAgLy8gTm8gQ1JMRiB5ZXQsIG1vdmUgd2hhdGV2ZXIgd2UgaGF2ZSBub3cgdG8gZnJvbnQgYW5kIHJlZmlsbC4KKyAgICAgICAgaWYgKGh0dHBCdWZSZW1haW5pbmdfLmVtcHR5KSB7CisgICAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmX1swIC4uIDBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGh0dHBCdWZfWzAgLi4gaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoXSA9IGh0dHBCdWZSZW1haW5pbmdfOworICAgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiBodHRwQnVmUmVtYWluaW5nXy5sZW5ndGhdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWZpbGwoKSkgeworICAgICAgICAgIGF1dG8gYnVmID0gaHR0cEJ1ZlJlbWFpbmluZ187CisgICAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmUmVtYWluaW5nX1skIC0gMSAuLiAkIC0gMV07CisgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2V0IHRoZSByZW1haW5pbmcgYnVmZmVyIHRvIHRoZSBwYXJ0IGFmdGVyIFxyXG4gYW5kIHJldHVybiB0aGUgcGFydAorICAgICAgICAvLyAobGluZSkgYmVmb3JlIGl0LgorICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IHNwbGl0WzJdOworICAgICAgICByZXR1cm4gc3BsaXRbMF07CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkSGVhZGVycygpIHsKKyAgICAvLyBJbml0aWFsaXplIGhlYWRlcnMgc3RhdGUgdmFyaWFibGVzCisgICAgY29udGVudExlbmd0aF8gPSAwOworICAgIGNodW5rZWRfID0gZmFsc2U7CisgICAgY2h1bmtlZERvbmVfID0gZmFsc2U7CisgICAgY2h1bmtTaXplXyA9IDA7CisKKyAgICAvLyBDb250cm9sIHN0YXRlIGZsb3cKKyAgICBib29sIHN0YXR1c0xpbmUgPSB0cnVlOworICAgIGJvb2wgZmluaXNoZWQ7CisKKyAgICAvLyBMb29wIHVudGlsIGhlYWRlcnMgYXJlIGZpbmlzaGVkCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gbGluZSA9IHJlYWRMaW5lKCk7CisKKyAgICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIGlmIChmaW5pc2hlZCkgeworICAgICAgICAgIHJlYWRIZWFkZXJzXyA9IGZhbHNlOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBNdXN0IGhhdmUgYmVlbiBhbiBIVFRQIDEwMCwga2VlcCBnb2luZyBmb3IgYW5vdGhlciBzdGF0dXMgbGluZQorICAgICAgICAgIHN0YXR1c0xpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RhdHVzTGluZSkgeworICAgICAgICAgIHN0YXR1c0xpbmUgPSBmYWxzZTsKKyAgICAgICAgICBmaW5pc2hlZCA9IHBhcnNlU3RhdHVzTGluZShsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJzZUhlYWRlcihsaW5lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNpemVfdCByZWFkQ2h1bmtlZCgpIHsKKyAgICBzaXplX3QgbGVuZ3RoOworCisgICAgYXV0byBsaW5lID0gcmVhZExpbmUoKTsKKyAgICBzaXplX3QgY2h1bmtTaXplOworICAgIHRyeSB7CisgICAgICBhdXRvIGNoYXJMaW5lID0gY2FzdChjaGFyW10pbGluZTsKKyAgICAgIGNodW5rU2l6ZSA9IHBhcnNlIXNpemVfdChjaGFyTGluZSwgMTYpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjaHVuayBzaXplOiAiIH4gdG8hc3RyaW5nKGxpbmUpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGlmIChjaHVua1NpemUgPT0gMCkgeworICAgICAgcmVhZENodW5rZWRGb290ZXJzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlYWQgZGF0YSBjb250ZW50CisgICAgICBsZW5ndGggKz0gcmVhZENvbnRlbnQoY2h1bmtTaXplKTsKKyAgICAgIC8vIFJlYWQgdHJhaWxpbmcgQ1JMRiBhZnRlciBjb250ZW50CisgICAgICByZWFkTGluZSgpOworICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKyAgdm9pZCByZWFkQ2h1bmtlZEZvb3RlcnMoKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gbGluZSA9IHJlYWRMaW5lKCk7CisgICAgICBpZiAobGluZS5sZW5ndGggPT0gMCkgeworICAgICAgICBjaHVua2VkRG9uZV8gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzaXplX3QgcmVhZENvbnRlbnQoc2l6ZV90IHNpemUpIHsKKyAgICBhdXRvIG5lZWQgPSBzaXplOworICAgIHdoaWxlIChuZWVkID4gMCkgeworICAgICAgaWYgKGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIuCisgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiAwXTsKKyAgICAgICAgaWYgKCFyZWZpbGwoKSkgcmV0dXJuIHNpemUgLSBuZWVkOworICAgICAgfQorCisgICAgICBhdXRvIGdpdmUgPSBtaW4oaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoLCBuZWVkKTsKKyAgICAgIHJlYWRCdWZmZXJfLndyaXRlKGNhc3QodWJ5dGVbXSlodHRwQnVmUmVtYWluaW5nX1swIC4uIGdpdmVdKTsKKyAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1ZlJlbWFpbmluZ19bZ2l2ZSAuLiAkXTsKKyAgICAgIG5lZWQgLT0gZ2l2ZTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBib29sIHJlZmlsbCgpIHsKKyAgICAvLyBJcyB0aGVyZSBhIG5pY2VyIHdheSB0byBkbyB0aGlzPworICAgIGF1dG8gaW5kZXhCZWdpbiA9IGh0dHBCdWZSZW1haW5pbmdfLnB0ciAtIGh0dHBCdWZfLnB0cjsKKyAgICBhdXRvIGluZGV4RW5kID0gaW5kZXhCZWdpbiArIGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aDsKKworICAgIGlmIChodHRwQnVmXy5sZW5ndGggLSBpbmRleEVuZCA8PSAoaHR0cEJ1Zl8ubGVuZ3RoIC8gNCkpIHsKKyAgICAgIGh0dHBCdWZfLmxlbmd0aCAqPSAyOworICAgIH0KKworICAgIC8vIFJlYWQgbW9yZSBkYXRhLgorICAgIGF1dG8gZ290ID0gdHJhbnNwb3J0Xy5yZWFkKGNhc3QodWJ5dGVbXSlodHRwQnVmX1tpbmRleEVuZCAuLiAkXSk7CisgICAgaWYgKGdvdCA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmX1tpbmRleEJlZ2luIC4uIGluZGV4RW5kICsgZ290XTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKworICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKKyAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKKworICBib29sIHJlYWRIZWFkZXJzXzsKKyAgYm9vbCBjaHVua2VkXzsKKyAgYm9vbCBjaHVua2VkRG9uZV87CisgIHNpemVfdCBjaHVua1NpemVfOworICBzaXplX3QgY29udGVudExlbmd0aF87CisKKyAgdWJ5dGVbXSBodHRwQnVmXzsKKyAgdWJ5dGVbXSBodHRwQnVmUmVtYWluaW5nXzsKK30KKworLyoqCisgKiBIVFRQIGNsaWVudCB0cmFuc3BvcnQuCisgKi8KK2ZpbmFsIGNsYXNzIFRDbGllbnRIdHRwVHJhbnNwb3J0IDogVEh0dHBUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNsaWVudCBodHRwIHRyYW5zcG9ydCBvcGVyYXRpbmcgb24gdGhlIHBhc3NlZCB1bmRlcmx5aW5nCisgICAqIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgYWN0dWFsIEkvTy4KKyAgICogICBob3N0ID0gVGhlIEhUVFAgaG9zdCBzdHJpbmcuCisgICAqICAgcGF0aCA9IFRoZSBIVFRQIHBhdGggc3RyaW5nLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc3RyaW5nIGhvc3QsIHN0cmluZyBwYXRoKSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICBob3N0XyA9IGhvc3Q7CisgICAgcGF0aF8gPSBwYXRoOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIGZvciBjb25zdHJ1Y3RpbmcgYSBjbGllbnQgSFRUUCB0cmFuc3BvcnQgdXNpbmcgYQorICAgKiBUU29ja2V0IGNvbm5lY3RpbmcgdG8gdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgaG9zdCA9IFRoZSBzZXJ2ZXIgdG8gY29ubmVjdCB0bywgYWxzbyB1c2VkIGFzIEhUVFAgaG9zdCBzdHJpbmcuCisgICAqICAgcG9ydCA9IFRoZSBwb3J0IHRvIGNvbm5lY3QgdG8uCisgICAqICAgcGF0aCA9IFRoZSBIVFRQIHBhdGggc3RyaW5nLgorICAgKi8KKyAgdGhpcyhzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQsIHN0cmluZyBwYXRoKSB7CisgICAgdGhpcyhuZXcgVFNvY2tldChob3N0LCBwb3J0KSwgaG9zdCwgcGF0aCk7CisgIH0KKworcHJvdGVjdGVkOgorICBvdmVycmlkZSBzdHJpbmcgZ2V0SGVhZGVyKHNpemVfdCBkYXRhTGVuZ3RoKSB7CisgICAgcmV0dXJuICJQT1NUICIgfiBwYXRoXyB+ICIgSFRUUC8xLjFcclxuIiB+CisgICAgICAiSG9zdDogIiB+IGhvc3RfIH4gIlxyXG4iIH4KKyAgICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgorICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiIH4gdG8hc3RyaW5nKGRhdGFMZW5ndGgpIH4gIlxyXG4iIH4KKyAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgorICAgICAgIlVzZXItQWdlbnQ6IFRocmlmdC8iIH4gVkVSU0lPTiB+ICIgKEQvVENsaWVudEh0dHBUcmFuc3BvcnQpXHJcbiIgfgorICAgICAgIlxyXG4iOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY29uc3QodWJ5dGUpW10gc3RhdHVzKSB7CisgICAgLy8gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgorICAgIGF1dG8gZmlyc3RTcGxpdCA9IGZpbmRTcGxpdChzdGF0dXMsIFsnICddKTsKKyAgICBpZiAoZmlyc3RTcGxpdFsxXS5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXM6ICIgfiB0byFzdHJpbmcoc3RhdHVzKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBhdXRvIGNvZGVSZWFzb24gPSBmaXJzdFNwbGl0WzJdW2NvdW50VW50aWwhImEgIT0gYiIoZmlyc3RTcGxpdFsyXSwgJyAnKSAuLiAkXTsKKyAgICBhdXRvIHNlY29uZFNwbGl0ID0gZmluZFNwbGl0KGNvZGVSZWFzb24sIFsnICddKTsKKyAgICBpZiAoc2Vjb25kU3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzOiAiIH4gdG8hc3RyaW5nKHN0YXR1cyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgaWYgKHNlY29uZFNwbGl0WzBdID09ICIyMDAiKSB7CisgICAgICAvLyBIVFRQIDIwMCA9IE9LLCB3ZSBnb3QgdGhlIHJlc3BvbnNlCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHNlY29uZFNwbGl0WzBdID09ICIxMDAiKSB7CisgICAgICAvLyBIVFRQIDEwMCA9IGNvbnRpbnVlLCBqdXN0IGtlZXAgcmVhZGluZworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzICh1bmhhbmRsZWQgc3RhdHVzIGNvZGUpOiAiIH4KKyAgICAgIHRvIXN0cmluZyhjYXN0KGNvbnN0KGNoYXJbXSkpc3RhdHVzKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgfQorCitwcml2YXRlOgorICBzdHJpbmcgaG9zdF87CisgIHN0cmluZyBwYXRoXzsKK30KKworLyoqCisgKiBIVFRQIHNlcnZlciB0cmFuc3BvcnQuCisgKi8KK2ZpbmFsIGNsYXNzIFRTZXJ2ZXJIdHRwVHJhbnNwb3J0IDogVEh0dHBUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW06CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBhY3R1YWwgSS9PLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgIH0KKworcHJvdGVjdGVkOgorICBvdmVycmlkZSBzdHJpbmcgZ2V0SGVhZGVyKHNpemVfdCBkYXRhTGVuZ3RoKSB7CisgICAgcmV0dXJuICJIVFRQLzEuMSAyMDAgT0tcclxuIiB+CisgICAgICAiRGF0ZTogIiB+IGdldFJGQzExMjNUaW1lKCkgfiAiXHJcbiIgfgorICAgICAgIlNlcnZlcjogVGhyaWZ0LyIgfiBWRVJTSU9OIH4gIlxyXG4iIH4KKyAgICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgorICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiIH4gdG8hc3RyaW5nKGRhdGFMZW5ndGgpIH4gIlxyXG4iIH4KKyAgICAgICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcbiIgfgorICAgICAgIlxyXG4iOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY29uc3QodWJ5dGUpW10gc3RhdHVzKSB7CisgICAgLy8gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGLgorICAgIGF1dG8gc3BsaXQgPSBmaW5kU3BsaXQoc3RhdHVzLCBbJyAnXSk7CisgICAgaWYgKHNwbGl0WzFdLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGF1dG8gdXJpVmVyc2lvbiA9IHNwbGl0WzJdW2NvdW50VW50aWwhImEgIT0gYiIoc3BsaXRbMl0sICcgJykgLi4gJF07CisgICAgaWYgKCFjYW5GaW5kKHVyaVZlcnNpb24sICcgJykpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzOiAiIH4gdG8hc3RyaW5nKHN0YXR1cyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgaWYgKHNwbGl0WzBdID09ICJQT1NUIikgeworICAgICAgLy8gUE9TVCBtZXRob2Qgb2ssIGxvb2tpbmcgZm9yIGNvbnRlbnQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1cyAodW5zdXBwb3J0ZWQgbWV0aG9kKTogIiB+CisgICAgICB0byFzdHJpbmcoc3RhdHVzKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgfQorfQorCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBIVFRQIHNlcnZlciBwcm90b2NvbC4KKyAqLworYWxpYXMgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5IVRTZXJ2ZXJIdHRwVHJhbnNwb3J0IFRTZXJ2ZXJIdHRwVHJhbnNwb3J0RmFjdG9yeTsKKworcHJpdmF0ZSB7CisgIGltcG9ydCBzdGQuc3RyaW5nIDogZm9ybWF0OworICBzdHJpbmcgZ2V0UkZDMTEyM1RpbWUoKSB7CisgICAgYXV0byBzeXNUaW1lID0gQ2xvY2suY3VyclRpbWUoVVRDKCkpOworCisgICAgYXV0byBkYXlOYW1lID0gY2FwTWVtYmVyTmFtZShzeXNUaW1lLmRheU9mV2Vlayk7CisgICAgYXV0byBtb250aE5hbWUgPSBjYXBNZW1iZXJOYW1lKHN5c1RpbWUubW9udGgpOworCisgICAgcmV0dXJuIGZvcm1hdCgiJXMsICVzICVzICVzICVzOiVzOiVzIEdNVCIsIGRheU5hbWUsIHN5c1RpbWUuZGF5LAorICAgICAgbW9udGhOYW1lLCBzeXNUaW1lLnllYXIsIHN5c1RpbWUuaG91ciwgc3lzVGltZS5taW51dGUsIHN5c1RpbWUuc2Vjb25kKTsKKyAgfQorCisgIGltcG9ydCBzdGQuYXNjaWkgOiB0b1VwcGVyOworICBpbXBvcnQgc3RkLnRyYWl0cyA6IEVudW1NZW1iZXJzOworICBzdHJpbmcgY2FwTWVtYmVyTmFtZShUKShUIHZhbCkgaWYgKGlzKFQgPT0gZW51bSkpIHsKKyAgICBmb3JlYWNoIChpLCBlOyBFbnVtTWVtYmVycyFUKSB7CisgICAgICBlbnVtIG5hbWUgPSBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVClbaV07CisgICAgICBlbnVtIGNhcE5hbWUgPSBjYXN0KGNoYXIpIHRvVXBwZXIobmFtZVswXSkgfiBuYW1lIFsxIC4uICRdOworICAgICAgaWYgKHZhbCA9PSBlKSB7CisgICAgICAgIHJldHVybiBjYXBOYW1lOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOb3QgYSBtZW1iZXIgb2YgIiB+IFQuc3RyaW5nb2YgfiAiOiAiIH4gdG8hc3RyaW5nKHZhbCkpOworICB9CisKKyAgdW5pdHRlc3QgeworICAgIGVudW0gRm9vIHsKKyAgICAgIGJhciwKKyAgICAgIGJBWgorICAgIH0KKworICAgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICAgIGVuZm9yY2UoY2FwTWVtYmVyTmFtZShGb28uYmFyKSA9PSAiQmFyIik7CisgICAgZW5mb3JjZShjYXBNZW1iZXJOYW1lKEZvby5iQVopID09ICJCQVoiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnkuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYwODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5LmQKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworaW1wb3J0IGNvcmUuZXhjZXB0aW9uIDogb25PdXRPZk1lbW9yeUVycm9yOworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCByZWFsbG9jOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW47CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBBIHRyYW5zcG9ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlci4gRXZlcnkKKyAqIHRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseSBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kCisgKiBldmVyeSB0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgY29uc3VtZWQgZnJvbSB0aGF0IGJ1ZmZlci4KKyAqCisgKiBDdXJyZW50bHksIHRoZSBzdG9yYWdlIGZvciB3cml0dGVuIGRhdGEgaXMgbmV2ZXIgcmVjbGFpbWVkLCBldmVuIGlmIHRoZQorICogYnVmZmVyIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQgb3V0IGFnYWluLgorICovCitmaW5hbCBjbGFzcyBUTWVtb3J5QnVmZmVyIDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBtZW1vcnkgdHJhbnNwb3J0IHdpdGggYW4gZW1wdHkgaW50ZXJuYWwgYnVmZmVyLgorICAgKi8KKyAgdGhpcygpIHt9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgbWVtb3J5IHRyYW5zcG9ydCB3aXRoIGFuIGVtcHR5IGludGVybmFsIGJ1ZmZlciwKKyAgICogcmVzZXJ2aW5nIHNwYWNlIGZvciBjYXBhY2l0eSBieXRlcyBpbiBhZHZhbmNlLgorICAgKgorICAgKiBJZiB0aGUgYW1vdW50IG9mIGRhdGEgd2hpY2ggd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIgaXMgYWxyZWFkeQorICAgKiBrbm93biBvbiBjb25zdHJ1Y3Rpb24sIHRoaXMgY2FuIGJldHRlciBwZXJmb3JtYW5jZSBvdmVyIHRoZSBkZWZhdWx0CisgICAqIGNvbnN0cnVjdG9yIGJlY2F1c2UgcmVhbGxvY2F0aW9ucyBjYW4gYmUgYXZvaWRlZC4KKyAgICoKKyAgICogSWYgdGhlIHByZWFsbG9jYXRlZCBidWZmZXIgaXMgZXhoYXVzdGVkLCBkYXRhIGNhbiBzdGlsbCBiZSB3cml0dGVuIHRvIHRoZQorICAgKiB0cmFuc3BvcnQsIGJ1dCByZWFsbG9jYXRpb25zIHdpbGwgaGFwcGVuLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY2FwYWNpdHkgPSBTaXplIG9mIHRoZSBpbml0aWFsbHkgcmVzZXJ2ZWQgYnVmZmVyIChpbiBieXRlcykuCisgICAqLworICB0aGlzKHNpemVfdCBjYXBhY2l0eSkgeworICAgIHJlc2V0KGNhcGFjaXR5KTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbW9yeSB0cmFuc3BvcnQgaW5pdGlhbGx5IGNvbnRhaW5pbmcgdGhlIHBhc3NlZCBkYXRhLgorICAgKgorICAgKiBGb3Igbm93LCB0aGUgcGFzc2VkIGJ1ZmZlciBpcyBub3QgaW50ZWxsaWdlbnRseSB1c2VkLCB0aGUgZGF0YSBpcyBqdXN0CisgICAqIGNvcGllZCB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmZmVyID0gSW5pdGlhbCBjb250ZW50cyBhdmFpbGFibGUgdG8gYmUgcmVhZC4KKyAgICovCisgIHRoaXMoaW4gdWJ5dGVbXSBjb250ZW50cykgeworICAgIGF1dG8gc2l6ZSA9IGNvbnRlbnRzLmxlbmd0aDsKKyAgICByZXNldChzaXplKTsKKyAgICBidWZmZXJfWzAgLi4gc2l6ZV0gPSBjb250ZW50c1tdOworICAgIHdyaXRlT2Zmc2V0XyA9IHNpemU7CisgIH0KKworICAvKioKKyAgICogRGVzdHJ1Y3RvciwgZnJlZXMgdGhlIGludGVybmFsbHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICovCisgIH50aGlzKCkgeworICAgIGZyZWUoYnVmZmVyXyk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cy4KKyAgICoKKyAgICogTm90ZTogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSByZXR1cm5lZCBzbGljZSBpcyBvbmx5IHZhbGlkIGZvciB0aGUKKyAgICogbGlmZSBvZiB0aGlzIG9iamVjdCwgYW5kIG1heSBiZSBpbnZhbGlkYXRlZCBvbiB0aGUgbmV4dCB3cml0ZSgpIGNhbGwgYXQKKyAgICogd2lsbCDigJMgeW91IG1pZ2h0IHdhbnQgdG8gaW1tZWRpYXRlbHkgLmR1cCBpdCBpZiB5b3UgaW50ZW5kIHRvIGtlZXAgaXQKKyAgICogYXJvdW5kLgorICAgKi8KKyAgY29uc3QodWJ5dGUpW10gZ2V0Q29udGVudHMoKSB7CisgICAgcmV0dXJuIGJ1ZmZlcl9bcmVhZE9mZnNldF8gLi4gd3JpdGVPZmZzZXRfXTsKKyAgfQorCisgIC8qKgorICAgKiBBIG1lbW9yeSB0cmFuc3BvcnQgaXMgYWx3YXlzIG9wZW4uCisgICAqLworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHdyaXRlT2Zmc2V0XyAtIHJlYWRPZmZzZXRfID4gMDsKKyAgfQorCisgIC8qKgorICAgKiBPcGVuaW5nIGlzIGEgbm8tb3AoKSBmb3IgYSBtZW1vcnkgYnVmZmVyLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkge30KKworICAvKioKKyAgICogQ2xvc2luZyBpcyBhIG5vLW9wKCkgZm9yIGEgbWVtb3J5IGJ1ZmZlciwgaXQgaXMgYWx3YXlzIG9wZW4uCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkge30KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gc2l6ZSA9IG1pbihidWYubGVuZ3RoLCB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0Xyk7CisgICAgYnVmWzAgLi4gc2l6ZV0gPSBidWZmZXJfW3JlYWRPZmZzZXRfIC4uIHJlYWRPZmZzZXRfICsgc2l6ZV07CisgICAgcmVhZE9mZnNldF8gKz0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIC8qKgorICAgKiBTaG9ydGN1dCB2ZXJzaW9uIG9mIHJlYWRBbGwoKSDigJMgdXNpbmcgdGhpcyBvdmVyIFRCYXNlVHJhbnNwb3J0LnJlYWRBbGwoKQorICAgKiBjYW4gZ2l2ZSB1cyBhIG5pY2Ugc3BlZWQgaW5jcmVhc2UgYmVjYXVzZSBnaXZlcyB1cyBhIG5pY2Ugc3BlZWQgaW5jcmVhc2UKKyAgICogYmVjYXVzZSBpdCBpcyB0eXBpY2FsbHkgYSB2ZXJ5IGhvdCBwYXRoIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCisgICAqLworICBvdmVycmlkZSB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIGF2YWlsYWJsZSA9IHdyaXRlT2Zmc2V0XyAtIHJlYWRPZmZzZXRfOworICAgIGlmIChidWYubGVuZ3RoID4gYXZhaWxhYmxlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbih0ZXh0KCJDYW5ub3QgcmVhZEFsbCgpICIsIGJ1Zi5sZW5ndGgsCisgICAgICAgICIgYnl0ZXMgb2YgZGF0YSBiZWNhdXNlIG9ubHkgIiwgYXZhaWxhYmxlLCAiIGJ5dGVzIGFyZSBhdmFpbGFibGUuIiksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSk7CisgICAgfQorCisgICAgYnVmW10gPSBidWZmZXJfW3JlYWRPZmZzZXRfIC4uIHJlYWRPZmZzZXRfICsgYnVmLmxlbmd0aF07CisgICAgcmVhZE9mZnNldF8gKz0gYnVmLmxlbmd0aDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIG5lZWQgPSBidWYubGVuZ3RoOworICAgIGlmIChidWZmZXJMZW5fIC0gd3JpdGVPZmZzZXRfIDwgbmVlZCkgeworICAgICAgLy8gRXhwb25lbnRpYWwgZ3Jvd3RoLgorICAgICAgYXV0byBuZXdMZW4gPSBidWZmZXJMZW5fICsgMTsKKyAgICAgIHdoaWxlIChuZXdMZW4gLSB3cml0ZU9mZnNldF8gPCBuZWVkKSBuZXdMZW4gKj0gMjsKKyAgICAgIGNSZWFsbG9jKGJ1ZmZlcl8sIG5ld0xlbik7CisgICAgICBidWZmZXJMZW5fID0gbmV3TGVuOworICAgIH0KKworICAgIGJ1ZmZlcl9bd3JpdGVPZmZzZXRfIC4uIHdyaXRlT2Zmc2V0XyArIG5lZWRdID0gYnVmW107CisgICAgd3JpdGVPZmZzZXRfICs9IG5lZWQ7CisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIGlmIChsZW4gPD0gd3JpdGVPZmZzZXRfIC0gcmVhZE9mZnNldF8pIHsKKyAgICAgIHJldHVybiBidWZmZXJfW3JlYWRPZmZzZXRfIC4uIHdyaXRlT2Zmc2V0X107CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgcmVhZE9mZnNldF8gKz0gbGVuOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICByZWFkT2Zmc2V0XyA9IDA7CisgICAgd3JpdGVPZmZzZXRfID0gMDsKKyAgfQorCisgIHZvaWQgcmVzZXQoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgcmVhZE9mZnNldF8gPSAwOworICAgIHdyaXRlT2Zmc2V0XyA9IDA7CisgICAgaWYgKGJ1ZmZlckxlbl8gPCBjYXBhY2l0eSkgeworICAgICAgY1JlYWxsb2MoYnVmZmVyXywgY2FwYWNpdHkpOworICAgICAgYnVmZmVyTGVuXyA9IGNhcGFjaXR5OworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB1Ynl0ZSogYnVmZmVyXzsKKyAgc2l6ZV90IGJ1ZmZlckxlbl87CisgIHNpemVfdCByZWFkT2Zmc2V0XzsKKyAgc2l6ZV90IHdyaXRlT2Zmc2V0XzsKK30KKworcHJpdmF0ZSB7CisgIHZvaWQgY1JlYWxsb2MocmVmIHVieXRlKiBkYXRhLCBzaXplX3QgbmV3U2l6ZSkgeworICAgIGF1dG8gcmVzdWx0ID0gcmVhbGxvYyhkYXRhLCBuZXdTaXplKTsKKyAgICBpZiAocmVzdWx0IGlzIG51bGwpIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworICAgIGRhdGEgPSBjYXN0KHVieXRlKilyZXN1bHQ7CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247Cit9CisKK3VuaXR0ZXN0IHsKKyAgYXV0byBhID0gbmV3IFRNZW1vcnlCdWZmZXIoNSk7CisgIGltbXV0YWJsZSh1Ynl0ZVtdKSB0ZXN0RGF0YSA9IFsxLCAyLCAzLCA0XTsKKyAgYXV0byBidWYgPSBuZXcgdWJ5dGVbdGVzdERhdGEubGVuZ3RoXTsKKyAgZW5mb3JjZShhLmlzT3Blbik7CisKKyAgLy8gYSBzaG91bGQgYmUgZW1wdHkuCisgIGVuZm9yY2UoIWEucGVlaygpKTsKKyAgZW5mb3JjZShhLnJlYWQoYnVmKSA9PSAwKTsKKyAgYXNzZXJ0VGhyb3duIVRUcmFuc3BvcnRFeGNlcHRpb24oYS5yZWFkQWxsKGJ1ZikpOworCisgIC8vIFdyaXRlIHNvbWUgZGF0YSBhbmQgcmVhZCBpdCBiYWNrIGFnYWluLgorICBhLndyaXRlKHRlc3REYXRhKTsKKyAgZW5mb3JjZShhLnBlZWsoKSk7CisgIGVuZm9yY2UoYS5nZXRDb250ZW50cygpID09IHRlc3REYXRhKTsKKyAgZW5mb3JjZShhLnJlYWQoYnVmKSA9PSB0ZXN0RGF0YS5sZW5ndGgpOworICBlbmZvcmNlKGJ1ZiA9PSB0ZXN0RGF0YSk7CisKKyAgLy8gYSBzaG91bGQgYmUgZW1wdHkgYWdhaW4uCisgIGVuZm9yY2UoIWEucGVlaygpKTsKKyAgZW5mb3JjZShhLnJlYWQoYnVmKSA9PSAwKTsKKyAgYXNzZXJ0VGhyb3duIVRUcmFuc3BvcnRFeGNlcHRpb24oYS5yZWFkQWxsKGJ1ZikpOworCisgIC8vIFRlc3QgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIGRpcmVjdGx5IGFjY2VwdHMgaW5pdGlhbCBkYXRhLgorICBhdXRvIGIgPSBuZXcgVE1lbW9yeUJ1ZmZlcih0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYi5pc09wZW4pOworICBlbmZvcmNlKGIucGVlaygpKTsKKyAgZW5mb3JjZShiLmdldENvbnRlbnRzKCkgPT0gdGVzdERhdGEpOworCisgIC8vIFRlc3QgYm9ycm93KCkuCisgIGF1dG8gYm9ycm93ZWQgPSBiLmJvcnJvdyhudWxsLCB0ZXN0RGF0YS5sZW5ndGgpOworICBlbmZvcmNlKGJvcnJvd2VkID09IHRlc3REYXRhKTsKKyAgZW5mb3JjZShiLnBlZWsoKSk7CisgIGIuY29uc3VtZSh0ZXN0RGF0YS5sZW5ndGgpOworICBlbmZvcmNlKCFiLnBlZWsoKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9waXBlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcGlwZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmUxNDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcGlwZWQuZApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQucGlwZWQ7CisKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKy8qKgorICogUGlwZXMgZGF0YSByZXF1ZXN0IGZyb20gb25lIHRyYW5zcG9ydCB0byBhbm90aGVyIHdoZW4gcmVhZEVuZCgpCisgKiBvciB3cml0ZUVuZCgpIGlzIGNhbGxlZC4KKyAqCisgKiBBIHR5cGljYWwgdXNlIGNhc2Ugd291bGQgYmUgdG8gbG9nIHJlcXVlc3RzIG9uIGUuZy4gYSBzb2NrZXQgdG8KKyAqIGRpc2sgKGkuIGUuIHBpcGUgdGhlbSB0byBhIFRGaWxlV3JpdGVyVHJhbnNwb3J0KS4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24ga2VlcHMgYW4gaW50ZXJuYWwgYnVmZmVyIHdoaWNoIGV4cGFuZHMgdG8KKyAqIGhvbGQgdGhlIHdob2xlIGFtb3VudCBvZiBkYXRhIHJlYWQvd3JpdHRlbiB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyAqRW5kKCkKKyAqIG1ldGhvZCBpcyBjYWxsZWQuCisgKgorICogQ29udHJhcnkgdG8gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBkb2Vzbid0IGludHJvZHVjZSB5ZXQgYW5vdGhlciBsYXllcgorICogb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlcmluZywgYWxsIGNhbGxzIGFyZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcgc291cmNlCisgKiB0cmFuc3BvcnQgdmVyYmF0aW0uCisgKi8KK2ZpbmFsIGNsYXNzIFRQaXBlZFRyYW5zcG9ydChTb3VyY2UgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFTb3VyY2UKKykgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8vLyBUaGUgZGVmYXVsdCBpbml0aWFsIGJ1ZmZlciBzaXplIGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgaW4gYnl0ZXMuCisgIGVudW0gREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gNTEyOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCBvbmx5IHJlYWRzIGFyZSBwaXBlZCAocGlwZVJlYWRzID0gdHJ1ZSwgcGlwZVdyaXRlcyA9IGZhbHNlKS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNyY1RyYW5zID0gVGhlIHRyYW5zcG9ydCB0byB3aGljaCBhbGwgcmVxdWVzdHMgYXJlIGZvcndhcmRlZC4KKyAgICogICBkc3RUcmFucyA9IFRoZSB0cmFuc3BvcnQgdGhlIHJlYWQvd3JpdHRlbiBkYXRhIGlzIGNvcGllZCB0by4KKyAgICogICBpbml0aWFsQnVmZmVyU2l6ZSA9IFRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIHJlYWQvd3JpdGUgYnVmZmVycywgZm9yCisgICAqICAgICBwZXJmb3JtYW5jZSB0dW5pbmcuCisgICAqLworICB0aGlzKFNvdXJjZSBzcmNUcmFucywgVFRyYW5zcG9ydCBkc3RUcmFucywKKyAgICBzaXplX3QgaW5pdGlhbEJ1ZmZlclNpemUgPSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUKKyAgKSB7CisgICAgc3JjVHJhbnNfID0gc3JjVHJhbnM7CisgICAgZHN0VHJhbnNfID0gZHN0VHJhbnM7CisKKyAgICByZWFkQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyKGluaXRpYWxCdWZmZXJTaXplKTsKKyAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUJ1ZmZlcihpbml0aWFsQnVmZmVyU2l6ZSk7CisKKyAgICBwaXBlUmVhZHNfID0gdHJ1ZTsKKyAgICBwaXBlV3JpdGVzXyA9IGZhbHNlOworICB9CisKKyAgYm9vbCBwaXBlUmVhZHMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBwaXBlUmVhZHNfOworICB9CisKKyAgdm9pZCBwaXBlUmVhZHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICByZWFkQnVmZmVyXy5yZXNldCgpOworICAgIH0KKyAgICBwaXBlUmVhZHNfID0gdmFsdWU7CisgIH0KKworICBib29sIHBpcGVXcml0ZXMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBwaXBlV3JpdGVzXzsKKyAgfQorCisgIHZvaWQgcGlwZVdyaXRlcyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworICAgIH0KKyAgICBwaXBlV3JpdGVzXyA9IHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSB7CisgICAgcmV0dXJuIHNyY1RyYW5zXy5pc09wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gc3JjVHJhbnNfLnBlZWsoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBzcmNUcmFuc18ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBzcmNUcmFuc18uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgYXV0byBieXRlc1JlYWQgPSBzcmNUcmFuc18ucmVhZChidWYpOworCisgICAgaWYgKHBpcGVSZWFkc18pIHsKKyAgICAgIHJlYWRCdWZmZXJfLndyaXRlKGJ1ZlswIC4uIGJ5dGVzUmVhZF0pOworICAgIH0KKworICAgIHJldHVybiBieXRlc1JlYWQ7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZEVuZCgpIHsKKyAgICBpZiAocGlwZVJlYWRzXykgeworICAgICAgYXV0byBkYXRhID0gcmVhZEJ1ZmZlcl8uZ2V0Q29udGVudHMoKTsKKyAgICAgIGRzdFRyYW5zXy53cml0ZShkYXRhKTsKKyAgICAgIGRzdFRyYW5zXy5mbHVzaCgpOworICAgICAgcmVhZEJ1ZmZlcl8ucmVzZXQoKTsKKworICAgICAgc3JjVHJhbnNfLnJlYWRFbmQoKTsKKworICAgICAgLy8gUmV0dXJuIGRhdGEubGVuZ3RoIGluc3RlYWQgb2YgdGhlIHJlYWRFbmQoKSByZXN1bHQgb2YgdGhlIHNvdXJjZQorICAgICAgLy8gdHJhbnNwb3J0cyBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgZnJvbSBpdC4KKyAgICAgIHJldHVybiBkYXRhLmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjVHJhbnNfLnJlYWRFbmQoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBpZiAocGlwZVdyaXRlc18pIHsKKyAgICAgIHdyaXRlQnVmZmVyXy53cml0ZShidWYpOworICAgIH0KKworICAgIHNyY1RyYW5zXy53cml0ZShidWYpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHdyaXRlRW5kKCkgeworICAgIGlmIChwaXBlV3JpdGVzXykgeworICAgICAgYXV0byBkYXRhID0gd3JpdGVCdWZmZXJfLmdldENvbnRlbnRzKCk7CisgICAgICBkc3RUcmFuc18ud3JpdGUoZGF0YSk7CisgICAgICBkc3RUcmFuc18uZmx1c2goKTsKKyAgICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworCisgICAgICBzcmNUcmFuc18ud3JpdGVFbmQoKTsKKworICAgICAgLy8gUmV0dXJuIGRhdGEubGVuZ3RoIGluc3RlYWQgb2YgdGhlIHJlYWRFbmQoKSByZXN1bHQgb2YgdGhlIHNvdXJjZQorICAgICAgLy8gdHJhbnNwb3J0cyBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgZnJvbSBpdC4KKyAgICAgIHJldHVybiBkYXRhLmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gc3JjVHJhbnNfLndyaXRlRW5kKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIHNyY1RyYW5zXy5mbHVzaCgpOworICB9CisKK3ByaXZhdGU6CisgIFNvdXJjZSBzcmNUcmFuc187CisgIFRUcmFuc3BvcnQgZHN0VHJhbnNfOworCisgIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87CisgIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOworCisgIGJvb2wgcGlwZVJlYWRzXzsKKyAgYm9vbCBwaXBlV3JpdGVzXzsKK30KKworLyoqCisgKiBUUGlwZWRUcmFuc3BvcnQgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgdHJhbnNwb3J0IHR5cGVzLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUUGlwZWRUcmFuc3BvcnQhU291cmNlIHRQaXBlZFRyYW5zcG9ydChTb3VyY2UpKAorICBTb3VyY2Ugc3JjVHJhbnMsIFRUcmFuc3BvcnQgZHN0VHJhbnMKKykgaWYgKGlzVFRyYW5zcG9ydCFTb3VyY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShzcmNUcmFucywgZHN0VHJhbnMpOworfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICAvLyBETUQgQEBCVUdAQDogVUZDUyBmb3Igc3RkLmFycmF5LmVtcHR5IGRvZXNuJ3Qgd29yayB3aGVuIGltcG9ydCBpcyBtb3ZlZAorICAvLyBpbnRvIHVuaXR0ZXN0IGJsb2NrLgorICBpbXBvcnQgc3RkLmFycmF5OworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7Cit9CisKK3VuaXR0ZXN0IHsKKyAgYXV0byB1bmRlcmx5aW5nID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gcGlwZVRhcmdldCA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHRyYW5zID0gdFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGVUYXJnZXQpOworCisgIHVuZGVybHlpbmcud3JpdGUoY2FzdCh1Ynl0ZVtdKSJhYmNkIik7CisKKyAgdWJ5dGVbNF0gYnVmZmVyOworICB0cmFucy5yZWFkQWxsKGJ1ZmZlclswIC4uIDJdKTsKKyAgZW5mb3JjZShidWZmZXJbMCAuLiAyXSA9PSAiYWIiKTsKKyAgZW5mb3JjZShwaXBlVGFyZ2V0LmdldENvbnRlbnRzKCkuZW1wdHkpOworCisgIHRyYW5zLnJlYWRFbmQoKTsKKyAgZW5mb3JjZShwaXBlVGFyZ2V0LmdldENvbnRlbnRzKCkgPT0gImFiIik7CisgIHBpcGVUYXJnZXQucmVzZXQoKTsKKworICB1bmRlcmx5aW5nLndyaXRlKGNhc3QodWJ5dGVbXSkiZWYiKTsKKyAgdHJhbnMucmVhZEFsbChidWZmZXJbMCAuLiAyXSk7CisgIGVuZm9yY2UoYnVmZmVyWzAgLi4gMl0gPT0gImNkIik7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpLmVtcHR5KTsKKworICB0cmFucy5yZWFkQWxsKGJ1ZmZlclswIC4uIDJdKTsKKyAgZW5mb3JjZShidWZmZXJbMCAuLiAyXSA9PSAiZWYiKTsKKyAgZW5mb3JjZShwaXBlVGFyZ2V0LmdldENvbnRlbnRzKCkuZW1wdHkpOworCisgIHRyYW5zLnJlYWRFbmQoKTsKKyAgZW5mb3JjZShwaXBlVGFyZ2V0LmdldENvbnRlbnRzKCkgPT0gImNkZWYiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3JhbmdlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9yYW5nZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWNlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9yYW5nZS5kCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVHJhbnNwb3J0cyB3aGljaCBvcGVyYXRlIG9uIGdlbmVyaWMgRCByYW5nZXMuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnJhbmdlOworCitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLnJhbmdlOworaW1wb3J0IHN0ZC50cmFpdHMgOiBVbnF1YWw7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIEFkYXB0cyBhbiB1Ynl0ZSBpbnB1dCByYW5nZSBmb3IgcmVhZGluZyB2aWEgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBjYXNlIHdoZXJlIFIgaXMgYSBwbGFpbiB1Ynl0ZVtdIGlzIHJlYXNvbmFibHkgb3B0aW1pemVkLCBzbyBhIHBvc3NpYmxlCisgKiB1c2UgY2FzZSBmb3IgVElucHV0UmFuZ2VUcmFuc3BvcnQgd291bGQgYmUgdG8gZGVzZXJpYWxpemUgc29tZSBkYXRhIGhlbGQgaW4KKyAqIGEgbWVtb3J5IGJ1ZmZlci4KKyAqLworZmluYWwgY2xhc3MgVElucHV0UmFuZ2VUcmFuc3BvcnQoUikgaWYgKAorICBpc0lucHV0UmFuZ2UhKFVucXVhbCFSKSAmJiBpcyhFbGVtZW50VHlwZSFSIDogY29uc3QodWJ5dGUpKQorKSA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBkYXRhID0gVGhlIGlucHV0IHJhbmdlIHRvIHVzZSBhcyBkYXRhLgorICAgKi8KKyAgdGhpcyhSIGRhdGEpIHsKKyAgICBkYXRhXyA9IGRhdGE7CisgIH0KKworICAvKioKKyAgICogQW4gaW5wdXQgcmFuZ2UgdHJhbnNwb3J0IGlzIGFsd2F5cyBvcGVuLgorICAgKi8KKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiAhZGF0YV8uZW1wdHk7CisgIH0KKworICAvKioKKyAgICogT3BlbmluZyBpcyBhIG5vLW9wKCkgZm9yIGFuIGlucHV0IHJhbmdlIHRyYW5zcG9ydC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHt9CisKKyAgLyoqCisgICAqIENsb3NpbmcgaXMgYSBuby1vcCgpIGZvciBhIG1lbW9yeSBidWZmZXIuCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkge30KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gZGF0YSA9IGRhdGFfLnRha2UoYnVmLmxlbmd0aCk7CisgICAgYXV0byBieXRlcyA9IGRhdGEubGVuZ3RoOworCisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoUi5pbml0WzEgLi4gMl0pIDogY29uc3QodWJ5dGUpW10pKSB7CisgICAgICAvLyBwdXQoKSBpcyBjdXJyZW50bHkgdW5uZWNlc3NhcmlseSBzbG93IGlmIGJvdGggcmFuZ2VzIGFyZSBzbGljZWFibGUuCisgICAgICBidWZbMCAuLiBieXRlc10gPSBkYXRhW107CisgICAgICBkYXRhXyA9IGRhdGFfW2J5dGVzIC4uICRdOworICAgIH0gZWxzZSB7CisgICAgICBidWYucHV0KGRhdGEpOworICAgIH0KKworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIC8qKgorICAgKiBTaG9ydGN1dCB2ZXJzaW9uIG9mIHJlYWRBbGwoKSBmb3Igc2xpY2FibGUgcmFuZ2VzLgorICAgKgorICAgKiBCZWNhdXNlIHJlYWRBbGwoKSBpcyB0eXBpY2FsbHkgYSB2ZXJ5IGhvdCBwYXRoIGR1cmluZyBkZXNlcmlhbGl6YXRpb24sCisgICAqIHVzaW5nIHRoaXMgb3ZlciBUQmFzZVRyYW5zcG9ydC5yZWFkQWxsKCkgZ2l2ZXMgdXMgYSBuaWNlIGluY3JlYXNlIGluCisgICAqIHNwZWVkIGR1ZSB0byB0aGUgcmVkdWNlZCBhbW91bnQgb2YgaW5kaXJlY3Rpb25zLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoUi5pbml0WzEgLi4gMl0pIDogY29uc3QodWJ5dGUpW10pKSB7CisgICAgICBpZiAoYnVmLmxlbmd0aCA8PSBkYXRhXy5sZW5ndGgpIHsKKyAgICAgICAgYnVmW10gPSBkYXRhX1swIC4uIGJ1Zi5sZW5ndGhdOworICAgICAgICBkYXRhXyA9IGRhdGFfW2J1Zi5sZW5ndGggLi4gJF07CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc3VwZXIucmVhZEFsbChidWYpOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBzdGF0aWMgaWYgKGlzKFIgOiBjb25zdCh1Ynl0ZSlbXSkpIHsKKyAgICAgIC8vIENhbiBvbmx5IGJvcnJvdyBpZiBvdXIgZGF0YSB0eXBlIGlzIGFjdHVhbGx5IGFuIHVieXRlIGFycmF5LgorICAgICAgaWYgKGxlbiA8PSBkYXRhXy5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFfOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgc3RhdGljIGlmIChpcyhSIDogY29uc3QodWJ5dGUpW10pKSB7CisgICAgICBpZiAobGVuID4gZGF0YV8ubGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnZhbGlkIGNvbnN1bWUgbGVuZ3RoIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpOworICAgICAgfQorICAgICAgZGF0YV8gPSBkYXRhX1tsZW4gLi4gJF07CisgICAgfSBlbHNlIHsKKyAgICAgIHN1cGVyLmNvbnN1bWUobGVuKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0cyBhIG5ldyBkYXRhIHJhbmdlIHRvIHVzZS4KKyAgICovCisgIHZvaWQgcmVzZXQoUiBkYXRhKSB7CisgICAgZGF0YV8gPSBkYXRhOworICB9CisKK3ByaXZhdGU6CisgIFIgZGF0YV87Cit9CisKKy8qKgorICogVElucHV0UmFuZ2VUcmFuc3BvcnQgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nCisgKiBJRlRJIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRAorICogQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVElucHV0UmFuZ2VUcmFuc3BvcnQhUiB0SW5wdXRSYW5nZVRyYW5zcG9ydChSKShSIGRhdGEpIGlmICgKKyAgaXMgKFRJbnB1dFJhbmdlVHJhbnNwb3J0IVIpCispIHsKKyAgcmV0dXJuIG5ldyBUSW5wdXRSYW5nZVRyYW5zcG9ydCFSKGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IzOGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKKworaW1wb3J0IGNvcmUuc3RkYy5lcnJubzogRUNPTk5SRVNFVDsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdGV4dCwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKKworLyoqCisgKiBDb21tb24gcGFydHMgb2YgYSBzb2NrZXQgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiwgcmVnYXJkbGVzcyBvZiBob3cgdGhlCisgKiBhY3R1YWwgSS9PIGlzIHBlcmZvcm1lZCAoc3luYy9hc3luYykuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTb2NrZXRCYXNlIDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCAoISkgc29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgc29ja2V0ID0gQWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgc29ja2V0IG9iamVjdC4KKyAgICovCisgIHRoaXMoU29ja2V0IHNvY2tldCkgeworICAgIHNvY2tldF8gPSBzb2NrZXQ7CisgICAgc2V0U29ja2V0T3B0cygpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgd2lsbCBjb25uZWN0IHRvIHRoZSBnaXZlbiBob3N0CisgICAqIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgaG9zdCA9IFJlbW90ZSBob3N0LgorICAgKiAgIHBvcnQgPSBSZW1vdGUgcG9ydC4KKyAgICovCisgIHRoaXMoc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0KSB7CisgICAgaG9zdF8gPSBob3N0OworICAgIHBvcnRfID0gcG9ydDsKKyAgfQorCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gc29ja2V0XyAhaXMgbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgYXMgbXVjaCBkYXRhIHRvIHRoZSBzb2NrZXQgYXMgdGhlcmUgY2FuIGJlIGluIGEgc2luZ2xlIE9TIGNhbGwuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBEYXRhIHRvIHdyaXRlLgorICAgKgorICAgKiBSZXR1cm5zOiBUaGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBOZXZlciBtb3JlIHRoYW4gYnVmLmxlbmd0aC4KKyAgICovCisgIGFic3RyYWN0IHNpemVfdCB3cml0ZVNvbWUoaW4gdWJ5dGVbXSBidWYpIG91dCAod3JpdHRlbikgeworICAgIC8vIERNRCBAQEJVR0BAOiBFbmFibGluZyB0aGlzIGUuZy4gZmFpbHMgdGhlIGNvbnRyYWN0IGluIHRoZQorICAgIC8vIGFzeW5jX3Rlc3Rfc2VydmVyLCBiZWNhdXNlIGJ1Zi5sZW5ndGggZXZhbHVhdGVzIHRvIDAgaGVyZSwgZXZlbiB0aG91Z2gKKyAgICAvLyBpbiB0aGUgbWV0aG9kIGJvZHkgaXQgY29ycmVjdGx5IGlzIDI3IChlcXVhbCB0byB0aGUgcmV0dXJuIHZhbHVlKS4KKyAgICB2ZXJzaW9uIChub25lKSBhc3NlcnQod3JpdHRlbiA8PSBidWYubGVuZ3RoLCB0ZXh0KCJJbXBsZW1lbnRhdGlvbiB3cm90ZSAiIH4KKyAgICAgICJtb3JlIGRhdGEgdGhhbiByZXF1ZXN0ZWQgdG8/ISAoIiwgd3JpdHRlbiwgIiB2cy4gIiwgYnVmLmxlbmd0aCwgIikiKSk7CisgIH0gYm9keSB7CisgICAgYXNzZXJ0KDAsICJETUQgYnVnPyDigJMgV2h5IHdvdWxkIGNvbnRyYWN0cyB3b3JrIGZvciBpbnRlcmZhY2VzLCBidXQgbm90ICIgfgorICAgICAgImZvciBhYnN0cmFjdCBtZXRob2RzPyAiIH4KKyAgICAgICIoRXJyb3I6IGZ1bmN0aW9uIFvigKZdIGluIGFuZCBvdXQgY29udHJhY3RzIHJlcXVpcmUgZnVuY3Rpb24gYm9keSIpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBwZWVyIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvLgorICAgKgorICAgKiBJbiBjb250cmFzdCwgdGhlIGhvc3QgYW5kIHBvcnQgcHJvcGVydGllcyBjb250YWluIHRoZSBhZGRyZXNzIHVzZWQgdG8KKyAgICogZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uLCBhbmQgYXJlIG5vdCB1cGRhdGVkIGFmdGVyIHRoZSBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGUgc29ja2V0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICovCisgIEFkZHJlc3MgZ2V0UGVlckFkZHJlc3MoKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgZ2V0IHBlZXIgaG9zdCBmb3IgIiB+CisgICAgICAiY2xvc2VkIHNvY2tldC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGlmICghcGVlckFkZHJlc3NfKSB7CisgICAgICBwZWVyQWRkcmVzc18gPSBzb2NrZXRfLnJlbW90ZUFkZHJlc3MoKTsKKyAgICAgIGFzc2VydChwZWVyQWRkcmVzc18pOworICAgIH0KKworICAgIHJldHVybiBwZWVyQWRkcmVzc187CisgIH0KKworICAvKioKKyAgICogVGhlIGhvc3QgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8gb3Igd2lsbCBjb25uZWN0IHRvLiBOdWxsIGlmIGFuCisgICAqIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldCB3YXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIG9iamVjdC4KKyAgICovCisgIHN0cmluZyBob3N0KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaG9zdF87CisgIH0KKworICAvKioKKyAgICogVGhlIHBvcnQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8gb3Igd2lsbCBjb25uZWN0IHRvLiBaZXJvIGlmIGFuCisgICAqIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldCB3YXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIG9iamVjdC4KKyAgICovCisgIHVzaG9ydCBwb3J0KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9ydF87CisgIH0KKworICAvLy8gVGhlIHNvY2tldCBzZW5kIHRpbWVvdXQuCisgIER1cmF0aW9uIHNlbmRUaW1lb3V0KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gc2VuZFRpbWVvdXRfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgc2VuZFRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc2VuZFRpbWVvdXRfID0gdmFsdWU7CisgIH0KKworICAvLy8gVGhlIHNvY2tldCByZWNlaXZpbmcgdGltZW91dC4gVmFsdWVzIHNtYWxsZXIgdGhhbiA1MDAgbXMgYXJlIG5vdAorICAvLy8gc3VwcG9ydGVkIG9uIFdpbmRvd3MuCisgIER1cmF0aW9uIHJlY3ZUaW1lb3V0KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVjdlRpbWVvdXRfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgcmVjdlRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVjdlRpbWVvdXRfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgT1MgaGFuZGxlIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICoKKyAgICogU2hvdWxkIG5vdCB1c3VhbGx5IGJlIHVzZWQgZGlyZWN0bHksIGJ1dCBhY2Nlc3MgdG8gaXQgY2FuIGJlIG5lY2Vzc2FyeQorICAgKiB0byBpbnRlcmZhY2Ugd2l0aCBDIGxpYnJhcmllcy4KKyAgICovCisgIHR5cGVvZihzb2NrZXRfLmhhbmRsZSgpKSBzb2NrZXRIYW5kbGUoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBzb2NrZXRfLmhhbmRsZSgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFNldHMgdGhlIG5lZWRlZCBzb2NrZXQgb3B0aW9ucy4KKyAgICovCisgIHZvaWQgc2V0U29ja2V0T3B0cygpIHsKKyAgICB0cnkgeworICAgICAgYWxpYXMgU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VUIGx2bFNvY2s7CisgICAgICBMaW5nZXIgbDsKKyAgICAgIGwub24gPSAwOworICAgICAgbC50aW1lID0gMDsKKyAgICAgIHNvY2tldF8uc2V0T3B0aW9uKGx2bFNvY2ssIFNvY2tldE9wdGlvbi5MSU5HRVIsIGwpOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiQ291bGQgbm90IHNldCBzb2NrZXQgb3B0aW9uOiAlcyIsIGUpOworICAgIH0KKworICAgIC8vIEp1c3QgdHJ5IHRvIGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG0g4oCTIHRoaXMgd2lsbCBmYWlsIGlmIHdlIGFyZSBwYXNzZWQKKyAgICAvLyBpbiBhIG5vbi1UQ1Agc29ja2V0IHZpYSB0aGUgU29ja2V0LWFjY2VwdGluZyBjb25zdHJ1Y3Rvci4KKyAgICB0cnkgeworICAgICAgc29ja2V0Xy5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuVENQLCBTb2NrZXRPcHRpb24uVENQX05PREVMQVksIHRydWUpOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7fQorICB9CisKKyAgLy8vIFJlbW90ZSBob3N0LgorICBzdHJpbmcgaG9zdF87CisKKyAgLy8vIFJlbW90ZSBwb3J0LgorICB1c2hvcnQgcG9ydF87CisKKyAgLy8vIFRpbWVvdXQgZm9yIHNlbmRpbmcuCisgIER1cmF0aW9uIHNlbmRUaW1lb3V0XzsKKworICAvLy8gVGltZW91dCBmb3IgcmVjZWl2aW5nLgorICBEdXJhdGlvbiByZWN2VGltZW91dF87CisKKyAgLy8vIENhY2hlZCBwZWVyIGFkZHJlc3MuCisgIEFkZHJlc3MgcGVlckFkZHJlc3NfOworCisgIC8vLyBDYWNoZWQgcGVlciBob3N0IG5hbWUuCisgIHN0cmluZyBwZWVySG9zdF87CisKKyAgLy8vIENhY2hlZCBwZWVyIHBvcnQuCisgIHVzaG9ydCBwZWVyUG9ydF87CisKKyAgLy8vIFdyYXBwZWQgc29ja2V0IG9iamVjdC4KKyAgU29ja2V0IHNvY2tldF87Cit9CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBEdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIHN0ZC5zb2NrZXQsIGN1cnJlbnRseSBvbmx5IFRDUC9JUCBzb2NrZXRzIGFyZQorICogc3VwcG9ydGVkIChpLmUuIFVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCkuCisgKi8KK2NsYXNzIFRTb2NrZXQgOiBUU29ja2V0QmFzZSB7CisgIC8vLworICB0aGlzKFNvY2tldCBzb2NrZXQpIHsKKyAgICBzdXBlcihzb2NrZXQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0KSB7CisgICAgc3VwZXIoaG9zdCwgcG9ydCk7CisgIH0KKworICAvKioKKyAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisKKyAgICBlbmZvcmNlKCFob3N0Xy5lbXB0eSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IG9wZW4gc29ja2V0IHRvIG51bGwgaG9zdC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKyAgICBlbmZvcmNlKHBvcnRfICE9IDAsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBvcGVuIHNvY2tldCB0byBwb3J0IHplcm8uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBBZGRyZXNzW10gYWRkcnM7CisgICAgdHJ5IHsKKyAgICAgIGFkZHJzID0gZ2V0QWRkcmVzcyhob3N0XywgcG9ydF8pOworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IHJlc29sdmUgZ2l2ZW4gaG9zdCBzdHJpbmcuIiwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOLCBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICAgIH0KKworICAgIEV4Y2VwdGlvbltdIGVycm9yczsKKyAgICBmb3JlYWNoIChhZGRyOyBhZGRycykgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0XyA9IG5ldyBUY3BTb2NrZXQoYWRkci5hZGRyZXNzRmFtaWx5KTsKKyAgICAgICAgc2V0U29ja2V0T3B0cygpOworICAgICAgICBzb2NrZXRfLmNvbm5lY3QoYWRkcik7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZXJyb3JzIH49IGU7CisgICAgICB9CisgICAgfQorICAgIGlmIChlcnJvcnMubGVuZ3RoID09IGFkZHJzLmxlbmd0aCkgeworICAgICAgc29ja2V0XyA9IG51bGw7CisgICAgICAvLyBOZWVkIHRvIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0byBhYmlkZSB0aGUgVFRyYW5zcG9ydCBBUEkuCisgICAgICBpbXBvcnQgc3RkLmFsZ29yaXRobSwgc3RkLnJhbmdlOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgIHRleHQoIkZhaWxlZCB0byBjb25uZWN0IHRvICIsIGhvc3RfLCAiOiIsIHBvcnRfLCAiLiIpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sCisgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywKKyAgICAgICAgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICB0ZXh0KAorICAgICAgICAgICAgIkFsbCBhZGRyZXNzZXMgdHJpZWQgZmFpbGVkICgiLAorICAgICAgICAgICAgam9pbmVyKG1hcCFxe3RleHQoYVswXSwgYDogImAsIGFbMV0ubXNnLCBgImApfSh6aXAoYWRkcnMsIGVycm9ycykpLCAiLCAiKSwKKyAgICAgICAgICAgICIpLiIKKyAgICAgICAgICApLAorICAgICAgICAgIGVycm9ycworICAgICAgICApCisgICAgICApOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIHNvY2tldF8uY2xvc2UoKTsKKyAgICBzb2NrZXRfID0gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgdWJ5dGUgYnVmOworICAgIGF1dG8gciA9IHNvY2tldF8ucmVjZWl2ZSgoJmJ1ZilbMCAuLiAxXSwgU29ja2V0RmxhZ3MuUEVFSyk7CisgICAgaWYgKHIgPT0gLTEpIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKyAgICAgIHN0YXRpYyBpZiAoY29ubnJlc2V0T25QZWVyU2h1dGRvd24pIHsKKyAgICAgICAgaWYgKGxhc3RFcnJubyA9PSBFQ09OTlJFU0VUKSB7CisgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJQZWVraW5nIGludG8gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgICB9CisgICAgcmV0dXJuIChyID4gMCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgcmVhZCBpZiBzb2NrZXQgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICB0eXBlb2YoZ2V0U29ja2V0RXJybm8oKSkgbGFzdEVycm5vOworICAgIHVzaG9ydCB0cmllczsKKyAgICB3aGlsZSAodHJpZXMrKyA8PSBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgIGF1dG8gciA9IHNvY2tldF8ucmVjZWl2ZShjYXN0KHZvaWRbXSlidWYpOworCisgICAgICAvLyBJZiByZWN2IHdlbnQgZmluZSwgaW1tZWRpYXRlbHkgcmV0dXJuLgorICAgICAgaWYgKHIgPj0gMCkgcmV0dXJuIHI7CisKKyAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nLCBmaW5kIG91dCBob3cgdG8gaGFuZGxlIGl0LgorICAgICAgbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgaWYgKGxhc3RFcnJubyA9PSBJTlRFUlJVUFRFRF9FUlJOTykgeworICAgICAgICAvLyBJZiB0aGUgc3lzY2FsbCB3YXMgaW50ZXJydXB0ZWQsIGp1c3QgdHJ5IGFnYWluLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgICAvLyBTZWUgdG9wIGNvbW1lbnQuCisgICAgICAgIGlmIChsYXN0RXJybm8gPT0gRUNPTk5SRVNFVCkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE5vdCBhbiBlcnJvciB3aGljaCBpcyBoYW5kbGVkIGluIGEgc3BlY2lhbCB3YXksIGp1c3QgbGVhdmUgdGhlIGxvb3AuCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaXNTb2NrZXRDbG9zZUVycm5vKGxhc3RFcnJubykpIHsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVjZWl2aW5nIGZhaWxlZCwgY2xvc2luZyBzb2NrZXQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pOworICAgIH0gZWxzZSBpZiAobGFzdEVycm5vID09IFRJTUVPVVRfRVJSTk8pIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5USU1FRF9PVVQpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVjZWl2aW5nIGZyb20gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgc2l6ZV90IHNlbnQ7CisgICAgd2hpbGUgKHNlbnQgPCBidWYubGVuZ3RoKSB7CisgICAgICBhdXRvIGIgPSB3cml0ZVNvbWUoYnVmW3NlbnQgLi4gJF0pOworICAgICAgaWYgKGIgPT0gMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGltZW91dCBzZXQgd2l0aCBTT19TTkRUSU1FTyBleHBpcmVkLgorICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigic2VuZCgpIHRpbWVvdXQgZXhwaXJlZC4iLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5USU1FRF9PVVQpOworICAgICAgfQorICAgICAgc2VudCArPSBiOworICAgIH0KKyAgICBhc3NlcnQoc2VudCA9PSBidWYubGVuZ3RoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCB3cml0ZVNvbWUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHdyaXRlIGlmIGZpbGUgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBhdXRvIHIgPSBzb2NrZXRfLnNlbmQoYnVmKTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgaWYgKHIgPiAwKSByZXR1cm4gcjsKKworICAgIC8vIEhhbmRsZSBlcnJvciBjb25kaXRpb25zLgorICAgIGlmIChyIDwgMCkgeworICAgICAgYXV0byBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgICBpZiAobGFzdEVycm5vID09IFdPVUxEX0JMT0NLX0VSUk5PKSB7CisgICAgICAgIC8vIE5vdCBhbiBleGNlcHRpb25hbCBlcnJvciBwZXIgc2Ug4oCTIGV2ZW4gd2l0aCBibG9ja2luZyBzb2NrZXRzLAorICAgICAgICAvLyBFQUdBSU4gYXBwYXJlbnRseSBpcyByZXR1cm5lZCBzb21ldGltZXMgb24gb3V0LW9mLXJlc291cmNlCisgICAgICAgIC8vIGNvbmRpdGlvbnMgKHNlZSB0aGUgQysrIGltcGxlbWVudGF0aW9uIGZvciBkZXRhaWxzKS4gQWxzbywgdGhpcworICAgICAgICAvLyBhbGxvd3MgdXNpbmcgVFNvY2tldCB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzIGUuZy4gaW4KKyAgICAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgYXV0byB0eXBlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV047CisgICAgICBpZiAoaXNTb2NrZXRDbG9zZUVycm5vKGxhc3RFcnJubykpIHsKKyAgICAgICAgdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTjsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlbmRpbmcgdG8gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIHR5cGUpOworICAgIH0KKworICAgIC8vIHNlbmQoKSBzaG91bGQgbmV2ZXIgcmV0dXJuIDAuCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlbmRpbmcgdG8gc29ja2V0IGZhaWxlZCAoMCBieXRlcyB3cml0dGVuKS4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBzZW5kVGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzdXBlci5zZW5kVGltZW91dCh2YWx1ZSk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uU05EVElNRU8sIHZhbHVlKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgcmVjdlRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc3VwZXIucmVjdlRpbWVvdXQodmFsdWUpOworICAgIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uLlJDVlRJTUVPLCB2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgcmVjZWl2aW5nIGZyb20gc29ja2V0IG9uIHJlYWQoKSBpbiBjYXNlIG9mCisgICAqIEVBR0FJTi9FSU5UUi4KKyAgICovCisgIHVzaG9ydCBtYXhSZWN2UmV0cmllcygpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIG1heFJlY3ZSZXRyaWVzXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIG1heFJlY3ZSZXRyaWVzKHVzaG9ydCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBtYXhSZWN2UmV0cmllc18gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBEaXR0bworICBlbnVtIERFRkFVTFRfTUFYX1JFQ1ZfUkVUUklFUyA9IDU7CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgdm9pZCBzZXRTb2NrZXRPcHRzKCkgeworICAgIHN1cGVyLnNldFNvY2tldE9wdHMoKTsKKyAgICBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbi5TTkRUSU1FTywgc2VuZFRpbWVvdXRfKTsKKyAgICBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbi5SQ1ZUSU1FTywgcmVjdlRpbWVvdXRfKTsKKyAgfQorCisgIHZvaWQgc2V0VGltZW91dChTb2NrZXRPcHRpb24gdHlwZSwgRHVyYXRpb24gdmFsdWUpIHsKKyAgICBhc3NlcnQodHlwZSA9PSBTb2NrZXRPcHRpb24uU05EVElNRU8gfHwgdHlwZSA9PSBTb2NrZXRPcHRpb24uUkNWVElNRU8pOworICAgIHZlcnNpb24gKFdpbjMyKSB7CisgICAgICBpZiAodmFsdWUgPiBkdXIhImhuc2VjcyIoMCkgJiYgdmFsdWUgPCBkdXIhIm1zZWNzIig1MDApKSB7CisgICAgICAgIGxvZ0Vycm9yKAorICAgICAgICAgICJTb2NrZXQgJXMgdGltZW91dCBvZiAlcyBtcyBtaWdodCBiZSByYWlzZWQgdG8gNTAwIG1zIG9uIFdpbmRvd3MuIiwKKyAgICAgICAgICAodHlwZSA9PSBTb2NrZXRPcHRpb24uU05EVElNRU8pID8gInNlbmQiIDogInJlY2VpdmUiLAorICAgICAgICAgIHZhbHVlLnRvdGFsISJtc2VjcyIKKyAgICAgICAgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc29ja2V0XykgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0Xy5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VULCB0eXBlLCB2YWx1ZSk7CisgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAiQ291bGQgbm90IHNldCB0aW1lb3V0LiIsCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04sCisgICAgICAgICAgX19GSUxFX18sCisgICAgICAgICAgX19MSU5FX18sCisgICAgICAgICAgZQorICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBNYXhpbXVtIG51bWJlciBvZiByZWN2KCkgcmV0cmllcy4KKyAgdXNob3J0IG1heFJlY3ZSZXRyaWVzXyAgPSBERUZBVUxUX01BWF9SRUNWX1JFVFJJRVM7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Y2U0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZApAQCAtMCwwICsxLDY5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIE9wZW5TU0wgc29ja2V0IGltcGxlbWVudGF0aW9uLCBpbiBsYXJnZSBwYXJ0cyBwb3J0ZWQgZnJvbSBDKysuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnNzbDsKKworaW1wb3J0IGNvcmUuZXhjZXB0aW9uIDogb25PdXRPZk1lbW9yeUVycm9yOworaW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vLCBFSU5UUjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXggOiBNdXRleDsKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGNvcmUuc3RkYy5jb25maWc7CitpbXBvcnQgY29yZS5zdGRjLnN0ZGxpYiA6IGZyZWUsIG1hbGxvYzsKK2ltcG9ydCBzdGQuYXNjaWkgOiB0b1VwcGVyOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udCwgcG9wRnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiBlbXBsYWNlLCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0IDogQWRkcmVzcywgSW50ZXJuZXRBZGRyZXNzLCBJbnRlcm5ldDZBZGRyZXNzLCBTb2NrZXQ7CitpbXBvcnQgc3RkLnN0cmluZyA6IHRvU3RyaW5nejsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5lcnI7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wucmFuZDsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5zc2w7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wueDUwOXYzOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zc2w7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworCisvKioKKyAqIFNTTCBlbmNyeXB0ZWQgc29ja2V0IGltcGxlbWVudGF0aW9uIHVzaW5nIE9wZW5TU0wuCisgKgorICogTm90ZToKKyAqIE9uIFBvc2l4IHN5c3RlbXMgd2hpY2ggZG8gbm90IGhhdmUgdGhlIEJTRC1zcGVjaWZpYyBTT19OT1NJR1BJUEUgZmxhZywgeW91CisgKiBtaWdodCB3YW50IHRvIGlnbm9yZSB0aGUgU0lHUElQRSBzaWduYWwsIGFzIE9wZW5TU0wgbWlnaHQgdHJ5IHRvIHdyaXRlIHRvCisgKiBhIGNsb3NlZCBzb2NrZXQgaWYgdGhlIHBlZXIgZGlzY29ubmVjdHMgYWJydXB0bHk6CisgKiAtLS0KKyAqIGltcG9ydCBjb3JlLnN0ZGMuc2lnbmFsOworICogaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnNpZ25hbDsKKyAqIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAqIC0tLQorICovCitmaW5hbCBjbGFzcyBUU1NMU29ja2V0IDogVFNvY2tldCB7CisgIC8qKgorICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHRoYXQgd3JhcHMgYW4gYWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgKCEpIHNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNvbnRleHQgPSBUaGUgU1NMIHNvY2tldCBjb250ZXh0IHRvIHVzZS4gQSByZWZlcmVuY2UgdG8gaXQgaXMgc3RvcmVkIHNvCisgICAqICAgICB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGNsZWFuZWQgdXAgd2hpbGUgdGhlIHNvY2tldCBpcyB1c2VkLgorICAgKiAgIHNvY2tldCA9IEFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkIHNvY2tldCBvYmplY3QuCisgICAqLworICB0aGlzKFRTU0xDb250ZXh0IGNvbnRleHQsIFNvY2tldCBzb2NrZXQpIHsKKyAgICBzdXBlcihzb2NrZXQpOworICAgIGNvbnRleHRfID0gY29udGV4dDsKKyAgICBzZXJ2ZXJTaWRlXyA9IGNvbnRleHQuc2VydmVyU2lkZTsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IGNvbnRleHQuYWNjZXNzTWFuYWdlcjsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNvbnRleHQgPSBUaGUgU1NMIHNvY2tldCBjb250ZXh0IHRvIHVzZS4gQSByZWZlcmVuY2UgdG8gaXQgaXMgc3RvcmVkIHNvCisgICAgKiAgICAgdGhhdCBpdCBkb2Vzbid0IGdldCBjbGVhbmVkIHVwIHdoaWxlIHRoZSBzb2NrZXQgaXMgdXNlZC4KKyAgICogICBob3N0ID0gUmVtb3RlIGhvc3QuCisgICAqICAgcG9ydCA9IFJlbW90ZSBwb3J0LgorICAgKi8KKyAgdGhpcyhUU1NMQ29udGV4dCBjb250ZXh0LCBzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQpIHsKKyAgICBzdXBlcihob3N0LCBwb3J0KTsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgICAgc2VydmVyU2lkZV8gPSBjb250ZXh0LnNlcnZlclNpZGU7CisgICAgYWNjZXNzTWFuYWdlcl8gPSBjb250ZXh0LmFjY2Vzc01hbmFnZXI7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgaWYgKHNzbF8gaXMgbnVsbCB8fCAhc3VwZXIuaXNPcGVuKCkpIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOworICAgIGJvb2wgc2h1dGRvd25SZWNlaXZlZCA9IChzaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgIT0gMDsKKyAgICBib29sIHNodXRkb3duU2VudCA9IChzaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSAhPSAwOworICAgIHJldHVybiAhKHNodXRkb3duUmVjZWl2ZWQgJiYgc2h1dGRvd25TZW50KTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBieXRlIGJ0OworICAgIGF1dG8gcmMgPSBTU0xfcGVlayhzc2xfLCAmYnQsIGJ0LnNpemVvZik7CisgICAgZW5mb3JjZShyYyA+PSAwLCBnZXRTU0xFeGNlcHRpb24oIlNTTF9wZWVrIikpOworCisgICAgaWYgKHJjID09IDApIHsKKyAgICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIH0KKyAgICByZXR1cm4gKHJjID4gMCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgZW5mb3JjZSghc2VydmVyU2lkZV8sICJDYW5ub3Qgb3BlbiBhIHNlcnZlci1zaWRlIFNTTCBzb2NrZXQuIik7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworICAgIHN1cGVyLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIGlmIChzc2xfICFpcyBudWxsKSB7CisgICAgICAvLyBUd28tc3RlcCBTU0wgc2h1dGRvd24uCisgICAgICBhdXRvIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICB9CisgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIC8vIERvIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaGVyZSBhcyBsZWF2aW5nIHRoZSB0cmFuc3BvcnQgIm9wZW4iIHdpbGwKKyAgICAgICAgLy8gcHJvYmFibHkgcHJvZHVjZSBvbmx5IG1vcmUgZXJyb3JzLCBhbmQgdGhlIGNoYW5jZSB3ZSBjYW4gZG8KKyAgICAgICAgLy8gc29tZXRoaW5nIGFib3V0IHRoZSBlcnJvciBlLmcuIGJ5IHJldHJ5aW5nIGlzIHZlcnkgbG93LgorICAgICAgICBsb2dFcnJvcigiRXJyb3Igc2h1dHRpbmcgZG93biBTU0w6ICVzIiwgZ2V0U1NMRXhjZXB0aW9uKCkpOworICAgICAgfQorCisgICAgICBTU0xfZnJlZShzc2xfKTsKKyAgICAgIHNzbF8gPSBudWxsOworICAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgICB9CisgICAgc3VwZXIuY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGludCBieXRlczsKKyAgICBmb3JlYWNoIChfOyAwIC4uIG1heFJlY3ZSZXRyaWVzKSB7CisgICAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF8sIGJ1Zi5wdHIsIGNhc3QoaW50KWJ1Zi5sZW5ndGgpOworICAgICAgaWYgKGJ5dGVzID49IDApIGJyZWFrOworCisgICAgICBhdXRvIGVycm5vQ29weSA9IGVycm5vOworICAgICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisgICAgICAgIGlmIChFUlJfZ2V0X2Vycm9yKCkgPT0gMCAmJiBlcnJub0NvcHkgPT0gRUlOVFIpIHsKKyAgICAgICAgICAvLyBGSVhNRTogV2luZG93cy4KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhyb3cgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfcmVhZCIpOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIC8vIExvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgICBzaXplX3Qgd3JpdHRlbiA9IDA7CisgICAgd2hpbGUgKHdyaXR0ZW4gPCBidWYubGVuZ3RoKSB7CisgICAgICBhdXRvIGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sIGJ1Zi5wdHIgKyB3cml0dGVuLAorICAgICAgICBjYXN0KGludCkoYnVmLmxlbmd0aCAtIHdyaXR0ZW4pKTsKKyAgICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICAgIHRocm93IGdldFNTTEV4Y2VwdGlvbigiU1NMX3dyaXRlIik7CisgICAgICB9CisgICAgICB3cml0dGVuICs9IGJ5dGVzOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGF1dG8gYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICAgIGVuZm9yY2UoYmlvICFpcyBudWxsLCBuZXcgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF93YmlvIHJldHVybmVkIG51bGwiKSk7CisKKyAgICBhdXRvIHJjID0gQklPX2ZsdXNoKGJpbyk7CisgICAgZW5mb3JjZShyYyA9PSAxLCBnZXRTU0xFeGNlcHRpb24oIkJJT19mbHVzaCIpKTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgICovCisgIGJvb2wgc2VydmVyU2lkZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHNlcnZlclNpZGVfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgc2VydmVyU2lkZShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlcnZlclNpZGVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGFjY2VzcyBtYW5hZ2VyIHRvIHVzZS4KKyAgICovCisgIHZvaWQgYWNjZXNzTWFuYWdlcihUQWNjZXNzTWFuYWdlciB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IHZhbHVlOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgY2hlY2tIYW5kc2hha2UoKSB7CisgICAgZW5mb3JjZShzdXBlci5pc09wZW4oKSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGlmIChzc2xfICFpcyBudWxsKSByZXR1cm47CisgICAgc3NsXyA9IGNvbnRleHRfLmNyZWF0ZVNTTCgpOworCisgICAgU1NMX3NldF9mZChzc2xfLCBzb2NrZXRIYW5kbGUpOworICAgIGludCByYzsKKyAgICBpZiAoc2VydmVyU2lkZV8pIHsKKyAgICAgIHJjID0gU1NMX2FjY2VwdChzc2xfKTsKKyAgICB9IGVsc2UgeworICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKKyAgICB9CisgICAgZW5mb3JjZShyYyA+IDAsIGdldFNTTEV4Y2VwdGlvbigpKTsKKyAgICBhdXRob3JpemUoc3NsXywgYWNjZXNzTWFuYWdlcl8sIGdldFBlZXJBZGRyZXNzKCksCisgICAgICAoc2VydmVyU2lkZV8gPyBnZXRQZWVyQWRkcmVzcygpLnRvSG9zdE5hbWVTdHJpbmcoKSA6IGhvc3QpKTsKKyAgfQorCisgIGJvb2wgc2VydmVyU2lkZV87CisgIFNTTCogc3NsXzsKKyAgVFNTTENvbnRleHQgY29udGV4dF87CisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXJfOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgYW4gT3BlblNTTCBjb250ZXh0IHdpdGggY2VydGlmaWNhdGlvbiBzZXR0aW5ncywgZXRjLiBhbmQgaGFuZGxlcworICogaW5pdGlhbGl6YXRpb24vdGVhcmRvd24uCisgKgorICogT3BlblNTTCBpcyBpbml0aWFsaXplZCB3aGVuIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQKKyAqIGFuZCBzaHV0IGRvd24gd2hlbiB0aGUgbGFzdCBvbmUgaXMgZGVzdHJveWVkICh0aHJlYWQtc2FmZSkuCisgKi8KK2NsYXNzIFRTU0xDb250ZXh0IHsKKyAgdGhpcygpIHsKKyAgICBpbml0TXV0ZXhfLmxvY2soKTsKKyAgICBzY29wZShleGl0KSBpbml0TXV0ZXhfLnVubG9jaygpOworCisgICAgaWYgKGNvdW50XyA9PSAwKSB7CisgICAgICBpbml0aWFsaXplT3BlblNTTCgpOworICAgICAgcmFuZG9taXplKCk7CisgICAgfQorICAgIGNvdW50XysrOworCisgICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0FUX0xFQVNUKDEsIDEpKSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFNfbWV0aG9kKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Mik7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYzKTsgICAvLyBUSFJJRlQtMzE2NAorICAgIGVuZm9yY2UoY3R4XywgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldyIpKTsKKyAgICBTU0xfQ1RYX3NldF9tb2RlKGN0eF8sIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgaW5pdE11dGV4Xy5sb2NrKCk7CisgICAgc2NvcGUoZXhpdCkgaW5pdE11dGV4Xy51bmxvY2soKTsKKworICAgIGlmIChjdHhfICFpcyBudWxsKSB7CisgICAgICBTU0xfQ1RYX2ZyZWUoY3R4Xyk7CisgICAgICBjdHhfID0gbnVsbDsKKyAgICB9CisKKyAgICBjb3VudF8tLTsKKyAgICBpZiAoY291bnRfID09IDApIHsKKyAgICAgIGNsZWFudXBPcGVuU1NMKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENpcGhlcnMgdG8gYmUgdXNlZCBpbiBTU0wgaGFuZHNoYWtlIHByb2Nlc3MuCisgICAqCisgICAqIFRoZSBzdHJpbmcgbXVzdCBiZSBpbiB0aGUgY29sb24tZGVsaW1pdGVkIE9wZW5TU0wgbm90YXRpb24gZGVzY3JpYmVkIGluCisgICAqIGNpcGhlcnMoMSksIGZvciBleGFtcGxlOiAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIi4KKyAgICovCisgIHZvaWQgY2lwaGVycyhzdHJpbmcgZW5hYmxlKSBAcHJvcGVydHkgeworICAgIGF1dG8gcmMgPSBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHhfLCB0b1N0cmluZ3ooZW5hYmxlKSk7CisKKyAgICBlbmZvcmNlKEVSUl9wZWVrX2Vycm9yKCkgPT0gMCwgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdCIpKTsKKyAgICBlbmZvcmNlKHJjID4gMCwgbmV3IFRTU0xFeGNlcHRpb24oIk5vbmUgb2Ygc3BlY2lmaWVkIGNpcGhlcnMgYXJlIHN1cHBvcnRlZCIpKTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHBlZXIgaXMgcmVxdWlyZWQgdG8gcHJlc2VudCBhIHZhbGlkIGNlcnRpZmljYXRlLgorICAgKi8KKyAgdm9pZCBhdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCkgQHByb3BlcnR5IHsKKyAgICBpbnQgbW9kZTsKKyAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgIG1vZGUgPSBTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwKKyAgICAgICAgU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKyAgICB9IGVsc2UgeworICAgICAgbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKKyAgICB9CisgICAgU1NMX0NUWF9zZXRfdmVyaWZ5KGN0eF8sIG1vZGUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIExvYWQgc2VydmVyIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcGF0aCA9IFBhdGggdG8gdGhlIGNlcnRpZmljYXRlIGZpbGUuCisgICAqICAgZm9ybWF0ID0gQ2VydGlmaWNhdGUgZmlsZSBmb3JtYXQuIERlZmF1bHRzIHRvIFBFTSwgd2hpY2ggaXMgY3VycmVudGx5CisgICAqICAgICB0aGUgb25seSBvbmUgc3VwcG9ydGVkLgorICAgKi8KKyAgdm9pZCBsb2FkQ2VydGlmaWNhdGUoc3RyaW5nIHBhdGgsIHN0cmluZyBmb3JtYXQgPSAiUEVNIikgeworICAgIGVuZm9yY2UocGF0aCAhaXMgbnVsbCAmJiBmb3JtYXQgIWlzIG51bGwsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImxvYWRDZXJ0aWZpY2F0ZUNoYWluOiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIG51bGwiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICBpZiAoZm9ybWF0ID09ICJQRU0iKSB7CisgICAgICBlbmZvcmNlKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4XywgdG9TdHJpbmd6KHBhdGgpKSwKKyAgICAgICAgZ2V0U1NMRXhjZXB0aW9uKAorICAgICAgICAgIGBDb3VsZCBub3QgbG9hZCBTU0wgc2VydmVyIGNlcnRpZmljYXRlIGZyb20gZmlsZSAiYCB+IHBhdGggfiBgImAKKyAgICAgICAgKQorICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIGZvcm1hdDogIiB+IGZvcm1hdCk7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogTG9hZCBwcml2YXRlIGtleS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAgKiAgIGZvcm1hdCA9IFByaXZhdGUga2V5IGZpbGUgZm9ybWF0LiBEZWZhdWx0cyB0byBQRU0sIHdoaWNoIGlzIGN1cnJlbnRseQorICAgKiAgICAgdGhlIG9ubHkgb25lIHN1cHBvcnRlZC4KKyAgICovCisgIHZvaWQgbG9hZFByaXZhdGVLZXkoc3RyaW5nIHBhdGgsIHN0cmluZyBmb3JtYXQgPSAiUEVNIikgeworICAgIGVuZm9yY2UocGF0aCAhaXMgbnVsbCAmJiBmb3JtYXQgIWlzIG51bGwsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImxvYWRQcml2YXRlS2V5OiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICBpZiAoZm9ybWF0ID09ICJQRU0iKSB7CisgICAgICBlbmZvcmNlKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHhfLCB0b1N0cmluZ3oocGF0aCksIFNTTF9GSUxFVFlQRV9QRU0pLAorICAgICAgICBnZXRTU0xFeGNlcHRpb24oCisgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIFNTTCBwcml2YXRlIGtleSBmcm9tIGZpbGUgImAgfiBwYXRoIH4gYCJgCisgICAgICAgICkKKyAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSBmb3JtYXQ6ICIgfiBmb3JtYXQpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBMb2FkIHRydXN0ZWQgY2VydGlmaWNhdGVzIGZyb20gc3BlY2lmaWVkIGZpbGUgKGluIFBFTSBmb3JtYXQpLgorICAgKgorICAgKiBQYXJhbXMuCisgICAqICAgcGF0aCA9IFBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuCisgICAqLworICB2b2lkIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKHN0cmluZyBwYXRoKSB7CisgICAgZW5mb3JjZShwYXRoICFpcyBudWxsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJsb2FkVHJ1c3RlZENlcnRpZmljYXRlczogPHBhdGg+IGlzIE5VTEwiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICBlbmZvcmNlKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8sIHRvU3RyaW5neihwYXRoKSwgbnVsbCksCisgICAgICBnZXRTU0xFeGNlcHRpb24oCisgICAgICAgIGBDb3VsZCBub3QgbG9hZCBTU0wgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBsaXN0IGZyb20gZmlsZSAiYCB+IHBhdGggfiBgImAKKyAgICAgICkKKyAgICApOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBkdXJpbmcgT3BlblNTTCBpbml0aWFsaXphdGlvbiB0byBzZWVkIHRoZSBPcGVuU1NMIGVudHJvcHkgcG9vbC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gc2ltcGx5IGNhbGxpbmcgUkFORF9wb2xsKCksIGJ1dCBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4gaWYgYQorICAgKiBkaWZmZXJlbnQsIHBlcmhhcHMgbW9yZSBzZWN1cmUgaW1wbGVtZW50YXRpb24gaXMgZGVzaXJlZC4KKyAgICovCisgIHZvaWQgcmFuZG9taXplKCkgeworICAgIFJBTkRfcG9sbCgpOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgorICAgKi8KKyAgYm9vbCBzZXJ2ZXJTaWRlKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gc2VydmVyU2lkZV87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBzZXJ2ZXJTaWRlKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc2VydmVyU2lkZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgYWNjZXNzIG1hbmFnZXIgdG8gdXNlLgorICAgKi8KKyAgVEFjY2Vzc01hbmFnZXIgYWNjZXNzTWFuYWdlcigpIEBwcm9wZXJ0eSB7CisgICAgaWYgKCFzZXJ2ZXJTaWRlXyAmJiAhYWNjZXNzTWFuYWdlcl8pIHsKKyAgICAgIGFjY2Vzc01hbmFnZXJfID0gbmV3IFREZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjsKKyAgICB9CisgICAgcmV0dXJuIGFjY2Vzc01hbmFnZXJfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgYWNjZXNzTWFuYWdlcihUQWNjZXNzTWFuYWdlciB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IHZhbHVlOworICB9CisKKyAgU1NMKiBjcmVhdGVTU0woKSBvdXQgKHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQpOworICB9IGJvZHkgeworICAgIGF1dG8gcmVzdWx0ID0gU1NMX25ldyhjdHhfKTsKKyAgICBlbmZvcmNlKHJlc3VsdCwgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfbmV3IikpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZAorICAgKiBtdWx0aXBsZSB0aW1lcyBhdCBhbnkgdGltZSBkdXJpbmcgYSBzZXNzaW9uIGFzIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNpemUgPSBNYXhpbXVtIGxlbmd0aCBvZiBwYXNzd29yZCwgaW5jbHVkaW5nIG51bGwgYnl0ZS4KKyAgICovCisgIHN0cmluZyBnZXRQYXNzd29yZChpbnQgc2l6ZSkgbm90aHJvdyBvdXQocmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdC5sZW5ndGggPCBzaXplKTsKKyAgfSBib2R5IHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvKioKKyAgICogTm90aWZpZXMgT3BlblNTTCB0byB1c2UgZ2V0UGFzc3dvcmQoKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHBhc3N3b3JkCisgICAqIGNhbGxiYWNrIHdpdGggZ2V0UGFzc3dvcmQoKS4KKyAgICovCisgIHZvaWQgb3ZlcnJpZGVEZWZhdWx0UGFzc3dvcmRDYWxsYmFjaygpIHsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihjdHhfLCAmcGFzc3dvcmRDYWxsYmFjayk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoY3R4XywgY2FzdCh2b2lkKil0aGlzKTsKKyAgfQorCisgIFNTTF9DVFgqIGN0eF87CisKK3ByaXZhdGU6CisgIGJvb2wgc2VydmVyU2lkZV87CisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXJfOworCisgIHNoYXJlZCBzdGF0aWMgdGhpcygpIHsKKyAgICBpbml0TXV0ZXhfID0gbmV3IE11dGV4KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBpbml0aWFsaXplT3BlblNTTCgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGluaXRpYWxpemVkXyA9IHRydWU7CisKKyAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0JFRk9SRSgxLCAxKSkgeworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisKKyAgICBtdXRleGVzXyA9IG5ldyBNdXRleFtDUllQVE9fbnVtX2xvY2tzKCldOworICAgIGZvcmVhY2ggKHJlZiBtOyBtdXRleGVzXykgeworICAgICAgbSA9IG5ldyBNdXRleDsKKyAgICB9CisKKyAgICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRyYWl0czsKKyAgICAvLyBBcyBwZXIgdGhlIE9wZW5TU0wgdGhyZWFkcyBtYW5wYWdlLCB0aGlzIGlzbid0IG5lZWRlZCBvbiBXaW5kb3dzLgorICAgIHZlcnNpb24gKFBvc2l4KSB7CisgICAgICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJnRocmVhZElkQ2FsbGJhY2spKTsKKyAgICB9CisgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmxvY2tpbmdDYWxsYmFjaykpOworICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0NyZWF0ZUNhbGxiYWNrKSk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0xvY2tDYWxsYmFjaykpOworICAgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tEZXN0cm95Q2FsbGJhY2spKTsKKyAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIGNsZWFudXBPcGVuU1NMKCkgeworICAgIGlmICghaW5pdGlhbGl6ZWRfKSByZXR1cm47CisKKyAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0JFRk9SRSgxLCAxKSkgeworICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKG51bGwpOworICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKG51bGwpOworICAgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKG51bGwpOworICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgICAgRVJSX2ZyZWVfc3RyaW5ncygpOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgICB9CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHsKKyAgICB2ZXJzaW9uIChQb3NpeCkgeworICAgICAgaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnB0aHJlYWQgOiBwdGhyZWFkX3NlbGY7CisgICAgICBjX3Vsb25nIHRocmVhZElkQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBjYXN0KGNfdWxvbmcpcHRocmVhZF9zZWxmKCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsb2NraW5nQ2FsbGJhY2soaW50IG1vZGUsIGludCBuLCBjb25zdChjaGFyKSogZmlsZSwgaW50IGxpbmUpIHsKKyAgICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgICAgbXV0ZXhlc19bbl0ubG9jaygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXV0ZXhlc19bbl0udW5sb2NrKCk7CisgICAgICB9CisgICAgfQorCisgICAgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGR5bmxvY2tDcmVhdGVDYWxsYmFjayhjb25zdChjaGFyKSogZmlsZSwgaW50IGxpbmUpIHsKKyAgICAgIGVudW0gc2l6ZSA9ICBfX3RyYWl0cyhjbGFzc0luc3RhbmNlU2l6ZSwgTXV0ZXgpOworICAgICAgYXV0byBtZW0gPSBtYWxsb2Moc2l6ZSlbMCAuLiBzaXplXTsKKyAgICAgIGlmICghbWVtKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKyAgICAgIEdDLmFkZFJhbmdlKG1lbS5wdHIsIHNpemUpOworICAgICAgYXV0byBtdXRleCA9IGVtcGxhY2UhTXV0ZXgobWVtKTsKKyAgICAgIHJldHVybiBjYXN0KENSWVBUT19keW5sb2NrX3ZhbHVlKiltdXRleDsKKyAgICB9CisKKyAgICB2b2lkIGR5bmxvY2tMb2NrQ2FsbGJhY2soaW50IG1vZGUsIENSWVBUT19keW5sb2NrX3ZhbHVlKiBsLAorICAgICAgY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKQorICAgIHsKKyAgICAgIGlmIChsIGlzIG51bGwpIHJldHVybjsKKyAgICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgICAgKGNhc3QoTXV0ZXgpbCkubG9jaygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKGNhc3QoTXV0ZXgpbCkudW5sb2NrKCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBkeW5sb2NrRGVzdHJveUNhbGxiYWNrKENSWVBUT19keW5sb2NrX3ZhbHVlKiBsLAorICAgICAgY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKQorICAgIHsKKyAgICAgIEdDLnJlbW92ZVJhbmdlKGwpOworICAgICAgZGVzdHJveShjYXN0KE11dGV4KWwpOworICAgICAgZnJlZShsKTsKKyAgICB9CisKKyAgICBpbnQgcGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwgaW50IHNpemUsIGludCwgdm9pZCogZGF0YSkgbm90aHJvdyB7CisgICAgICBhdXRvIGNvbnRleHQgPSBjYXN0KFRTU0xDb250ZXh0KSBkYXRhOworICAgICAgYXV0byB1c2VyUGFzc3dvcmQgPSBjb250ZXh0LmdldFBhc3N3b3JkKHNpemUpOworICAgICAgYXV0byBsZW4gPSB1c2VyUGFzc3dvcmQubGVuZ3RoOworICAgICAgaWYgKGxlbiA+IHNpemUpIHsKKyAgICAgICAgbGVuID0gc2l6ZTsKKyAgICAgIH0KKyAgICAgIHBhc3N3b3JkWzAgLi4gbGVuXSA9IHVzZXJQYXNzd29yZFswIC4uIGxlbl07IC8vIFRPRE86IFwwIGhhbmRsaW5nIGNvcnJlY3Q/CisgICAgICByZXR1cm4gY2FzdChpbnQpbGVuOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBfX2dzaGFyZWQgYm9vbCBpbml0aWFsaXplZF87CisgIHN0YXRpYyBfX2dzaGFyZWQgTXV0ZXggaW5pdE11dGV4XzsKKyAgc3RhdGljIF9fZ3NoYXJlZCBNdXRleFtdIG11dGV4ZXNfOworICBzdGF0aWMgX19nc2hhcmVkIHVpbnQgY291bnRfOworfQorCisvKioKKyAqIERlY2lkZXMgd2hldGhlciBhIHJlbW90ZSBob3N0IGlzIGxlZ2l0aW1hdGUgb3Igbm90LgorICoKKyAqIEl0IGlzIHVzdWFsbHkgc2V0IGF0IGEgVFNTTENvbnRleHQsIHdoaWNoIHRoZW4gcGFzc2VzIGl0IHRvIGFsbCB0aGUgY3JlYXRlZAorICogVFNTTFNvY2tldHMuCisgKi8KK2NsYXNzIFRBY2Nlc3NNYW5hZ2VyIHsKKyAgLy8vCisgIGVudW0gRGVjaXNpb24geworICAgIERFTlkgPSAtMSwgLy8vIERlbnkgYWNjZXNzLgorICAgIFNLSVAgPSAgMCwgLy8vIENhbm5vdCBkZWNpZGUsIG1vdmUgb24gdG8gbmV4dCBjaGVjayAoZGVueSBpZiBsYXN0KS4KKyAgICBBTExPVyA9IDEgIC8vLyBBbGxvdyBhY2Nlc3MuCisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90IGJhc2VkIG9uIGl0cworICAgKiBJUCBhZGRyZXNzLgorICAgKgorICAgKiBDYWxsZWQgb25jZSBhZnRlciBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgYW5kIGJlZm9yZSBwZWVyCisgICAqIGNlcnRpZmljYXRlIGlzIGV4YW1pbmVkLgorICAgKgorICAgKiBJZiBhIHZhbGlkIGRlY2lzaW9uIChBTExPVyBvciBERU5ZKSBpcyByZXR1cm5lZCwgdGhlIHBlZXIgY2VydGlmaWNhdGUKKyAgICogd2lsbCBub3QgYmUgdmVyaWZpZWQuCisgICAqLworICBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIERlY2lzaW9uLkRFTlk7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90IGJhc2VkIG9uIGEKKyAgICogbmFtZSBmcm9tIGl0cyBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogQ2FsbGVkIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlCisgICAqIHBlZXIncyBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBUaGUgYWN0dWFsIGhvc3QgbmFtZSBzdHJpbmcgZnJvbSB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAqICAgY2VydEhvc3QgPSBBIGhvc3QgbmFtZSBzdHJpbmcgZnJvbSB0aGUgY2VydGlmaWNhdGUuCisgICAqLworICBEZWNpc2lvbiB2ZXJpZnkoc3RyaW5nIGhvc3QsIGNvbnN0KGNoYXIpW10gY2VydEhvc3QpIHsKKyAgICByZXR1cm4gRGVjaXNpb24uREVOWTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QgYmFzZWQgb24gYW4gSVAKKyAgICogYWRkcmVzcyBmcm9tIGl0cyBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogQ2FsbGVkIGV2ZXJ5IHRpbWUgYW4gSVAgc3ViamVjdEFsdE5hbWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHBlZXIncworICAgKiBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGFkZHJlc3MgPSBUaGUgYWN0dWFsIGFkZHJlc3MgZnJvbSB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAqICAgY2VydEhvc3QgPSBBIGhvc3QgbmFtZSBzdHJpbmcgZnJvbSB0aGUgY2VydGlmaWNhdGUuCisgICAqLworICBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzLCB1Ynl0ZVtdIGNlcnRBZGRyZXNzKSB7CisgICAgcmV0dXJuIERlY2lzaW9uLkRFTlk7CisgIH0KK30KKworLyoqCisgKiBEZWZhdWx0IGFjY2VzcyBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLCB3aGljaCBqdXN0IGNoZWNrcyB0aGUgaG9zdCBuYW1lCisgKiByZXNwLiBJUCBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uIGFnYWluc3QgdGhlIGNlcnRpZmljYXRlLgorICovCitjbGFzcyBURGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIgOiBUQWNjZXNzTWFuYWdlciB7CisgIG92ZXJyaWRlIERlY2lzaW9uIHZlcmlmeShBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gRGVjaXNpb24uU0tJUDsKKyAgfQorCisgIG92ZXJyaWRlIERlY2lzaW9uIHZlcmlmeShzdHJpbmcgaG9zdCwgY29uc3QoY2hhcilbXSBjZXJ0SG9zdCkgeworICAgIGlmIChob3N0LmVtcHR5IHx8IGNlcnRIb3N0LmVtcHR5KSB7CisgICAgICByZXR1cm4gRGVjaXNpb24uU0tJUDsKKyAgICB9CisgICAgcmV0dXJuIChtYXRjaE5hbWUoaG9zdCwgY2VydEhvc3QpID8gRGVjaXNpb24uQUxMT1cgOiBEZWNpc2lvbi5TS0lQKTsKKyAgfQorCisgIG92ZXJyaWRlIERlY2lzaW9uIHZlcmlmeShBZGRyZXNzIGFkZHJlc3MsIHVieXRlW10gY2VydEFkZHJlc3MpIHsKKyAgICBib29sIG1hdGNoOworICAgIGlmIChjZXJ0QWRkcmVzcy5sZW5ndGggPT0gNCkgeworICAgICAgaWYgKGF1dG8gaWEgPSBjYXN0KEludGVybmV0QWRkcmVzcylhZGRyZXNzKSB7CisgICAgICAgIG1hdGNoID0gKChjYXN0KHVieXRlKilpYS5hZGRyKCkpWzAgLi4gNF0gPT0gY2VydEFkZHJlc3NbXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjZXJ0QWRkcmVzcy5sZW5ndGggPT0gMTYpIHsKKyAgICAgIGlmIChhdXRvIGlhID0gY2FzdChJbnRlcm5ldDZBZGRyZXNzKWFkZHJlc3MpIHsKKyAgICAgICAgbWF0Y2ggPSAoaWEuYWRkcigpID09IGNlcnRBZGRyZXNzW10pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKG1hdGNoID8gRGVjaXNpb24uQUxMT1cgOiBEZWNpc2lvbi5TS0lQKTsKKyAgfQorfQorCitwcml2YXRlIHsKKyAgLyoqCisgICAqIE1hdGNoZXMgYSBuYW1lIHdpdGggYSBwYXR0ZXJuLiBUaGUgcGF0dGVybiBtYXkgaW5jbHVkZSB3aWxkY2FyZC4gQSBzaW5nbGUKKyAgICogd2lsZGNhcmQgIioiIGNhbiBtYXRjaCB1cCB0byBvbmUgY29tcG9uZW50IGluIHRoZSBkb21haW4gbmFtZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBIb3N0IG5hbWUgdG8gbWF0Y2gsIHR5cGljYWxseSB0aGUgU1NMIHJlbW90ZSBwZWVyLgorICAgKiAgIHBhdHRlcm4gPSBIb3N0IG5hbWUgcGF0dGVybiwgdHlwaWNhbGx5IGZyb20gdGhlIFNTTCBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogUmV0dXJuczogdHJ1ZSBpZiBob3N0IG1hdGNoZXMgcGF0dGVybiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgYm9vbCBtYXRjaE5hbWUoY29uc3QoY2hhcilbXSBob3N0LCBjb25zdChjaGFyKVtdIHBhdHRlcm4pIHsKKyAgICB3aGlsZSAoIWhvc3QuZW1wdHkgJiYgIXBhdHRlcm4uZW1wdHkpIHsKKyAgICAgIGlmICh0b1VwcGVyKHBhdHRlcm4uZnJvbnQpID09IHRvVXBwZXIoaG9zdC5mcm9udCkpIHsKKyAgICAgICAgaG9zdC5wb3BGcm9udDsKKyAgICAgICAgcGF0dGVybi5wb3BGcm9udDsKKyAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5mcm9udCA9PSAnKicpIHsKKyAgICAgICAgd2hpbGUgKCFob3N0LmVtcHR5ICYmIGhvc3QuZnJvbnQgIT0gJy4nKSB7CisgICAgICAgICAgaG9zdC5wb3BGcm9udDsKKyAgICAgICAgfQorICAgICAgICBwYXR0ZXJuLnBvcEZyb250OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAoaG9zdC5lbXB0eSAmJiBwYXR0ZXJuLmVtcHR5KTsKKyAgfQorCisgIHVuaXR0ZXN0IHsKKyAgICBlbmZvcmNlKG1hdGNoTmFtZSgidGhyaWZ0LmFwYWNoZS5vcmciLCAiKi5hcGFjaGUub3JnIikpOworICAgIGVuZm9yY2UoIW1hdGNoTmFtZSgidGhyaWZ0LmFwYWNoZS5vcmciLCAiYXBhY2hlLm9yZyIpKTsKKyAgICBlbmZvcmNlKG1hdGNoTmFtZSgidGhyaWZ0LmFwYWNoZS5vcmciLCAidGhyaWZ0LiouKiIpKTsKKyAgICBlbmZvcmNlKG1hdGNoTmFtZSgiIiwgIiIpKTsKKyAgICBlbmZvcmNlKCFtYXRjaE5hbWUoIiIsICIqIikpOworICB9Cit9CisKKy8qKgorICogU1NMLWxldmVsIGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFNTTEV4Y2VwdGlvbiA6IFRUcmFuc3BvcnRFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLklOVEVSTkFMX0VSUk9SLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvemxpYi5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvemxpYi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC96bGliLmQKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuemxpYjsKKworaW1wb3J0IGNvcmUuYml0b3AgOiBic3dhcDsKK2ltcG9ydCBldGMuYy56bGliOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW47CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogemxpYiB0cmFuc3BvcnQuIENvbXByZXNzZXMgKGRlZmxhdGVzKSBkYXRhIGJlZm9yZSB3cml0aW5nIGl0IHRvIHRoZQorICogdW5kZXJseWluZyB0cmFuc3BvcnQsIGFuZCBkZWNvbXByZXNzZXMgKGluZmxhdGVzKSBpdCBhZnRlciByZWFkaW5nLgorICovCitmaW5hbCBjbGFzcyBUWmxpYlRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLy8gVGhlc2UgZGVmYXVsdHMgaGF2ZSB5ZXQgdG8gYmUgb3B0aW1pemVkLgorICBlbnVtIERFRkFVTFRfVVJCVUZfU0laRSA9IDEyODsKKyAgZW51bSBERUZBVUxUX0NSQlVGX1NJWkUgPSAxMDI0OworICBlbnVtIERFRkFVTFRfVVdCVUZfU0laRSA9IDEyODsKKyAgZW51bSBERUZBVUxUX0NXQlVGX1NJWkUgPSAxMDI0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHpsaWIgdHJhbnNwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHdyYXAuCisgICAqICAgdXJidWZTaXplID0gVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCByZWFkaW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgICAqICAgY3JidWZTaXplID0gVGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgcmVhZGluZyBidWZmZXIsIGluIGJ5dGVzLgorICAgKiAgIHV3YnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgd3JpdGluZyBidWZmZXIsIGluIGJ5dGVzLgorICAgKiAgIGN3YnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHdyaXRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICovCisgIHRoaXMoCisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgc2l6ZV90IHVyYnVmU2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKKyAgICBzaXplX3QgY3JidWZTaXplID0gREVGQVVMVF9DUkJVRl9TSVpFLAorICAgIHNpemVfdCB1d2J1ZlNpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCisgICAgc2l6ZV90IGN3YnVmU2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRQorICApIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworCisgICAgZW5mb3JjZSh1d2J1ZlNpemUgPj0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIlRaTGliVHJhbnNwb3J0OiB1bmNvbXByZXNzZWQgd3JpdGUgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QgIiB+CisgICAgICB0byFzdHJpbmcoTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIH4gImJ5dGVzIGluIHNpemUuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgdXJidWZfID0gbmV3IHVieXRlW3VyYnVmU2l6ZV07CisgICAgY3JidWZfID0gbmV3IHVieXRlW2NyYnVmU2l6ZV07CisgICAgdXdidWZfID0gbmV3IHVieXRlW3V3YnVmU2l6ZV07CisgICAgY3didWZfID0gbmV3IHVieXRlW2N3YnVmU2l6ZV07CisKKyAgICByc3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKyAgICByc3RyZWFtXy5uZXh0X2luID0gY3JidWZfLnB0cjsKKyAgICByc3RyZWFtXy5hdmFpbF9pbiAgPSAwOworICAgIHJzdHJlYW1fLm5leHRfb3V0ID0gdXJidWZfLnB0cjsKKyAgICByc3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KHVyYnVmXy5sZW5ndGgpOworCisgICAgd3N0cmVhbV8gPSBuZXcgel9zdHJlYW07CisgICAgd3N0cmVhbV8ubmV4dF9pbiA9IHV3YnVmXy5wdHI7CisgICAgd3N0cmVhbV8uYXZhaWxfaW4gPSAwOworICAgIHdzdHJlYW1fLm5leHRfb3V0ID0gY3didWZfLnB0cjsKKyAgICB3c3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KGNyYnVmXy5sZW5ndGgpOworCisgICAgemxpYkVuZm9yY2UoaW5mbGF0ZUluaXQocnN0cmVhbV8pLCByc3RyZWFtXyk7CisgICAgc2NvcGUgKGZhaWx1cmUpIHsKKyAgICAgIHpsaWJMb2dFcnJvcihpbmZsYXRlRW5kKHJzdHJlYW1fKSwgcnN0cmVhbV8pOworICAgIH0KKworICAgIHpsaWJFbmZvcmNlKGRlZmxhdGVJbml0KHdzdHJlYW1fLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pLCB3c3RyZWFtXyk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICB6bGliTG9nRXJyb3IoaW5mbGF0ZUVuZChyc3RyZWFtXyksIHJzdHJlYW1fKTsKKworICAgIGF1dG8gcmVzdWx0ID0gZGVmbGF0ZUVuZCh3c3RyZWFtXyk7CisgICAgLy8gWl9EQVRBX0VSUk9SIG1heSBpbmRpY2F0ZSB1bmZsdXNoZWQgZGF0YSwgc28ganVzdCBpZ25vcmUgaXQuCisgICAgaWYgKHJlc3VsdCAhPSBaX0RBVEFfRVJST1IpIHsKKyAgICAgIHpsaWJMb2dFcnJvcihyZXN1bHQsIHdzdHJlYW1fKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgd3JhcHBlZCB0cmFuc3BvcnQuCisgICAqLworICBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc3BvcnRfOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiByZWFkQXZhaWwgPiAwIHx8IHRyYW5zcG9ydF8uaXNPcGVuOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiByZWFkQXZhaWwgPiAwIHx8IHRyYW5zcG9ydF8ucGVlaygpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIC8vIFRoZSBDKysgaW1wbGVtZW50YXRpb24gc3VnZ2VzdHMgdG8gc2tpcCB1cmJ1ZiBvbiBiaWcgcmVhZHMgaW4gZnV0dXJlCisgICAgLy8gdmVyc2lvbnMsIHdlIHdvdWxkIGJlbmVmaXQgZnJvbSBpdCBhcyB3ZWxsLgorICAgIGF1dG8gb3JpZ0xlbiA9IGJ1Zi5sZW5ndGg7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gZ2l2ZSA9IG1pbihyZWFkQXZhaWwsIGJ1Zi5sZW5ndGgpOworCisgICAgICAvLyBJZiBzdGQucmFuZ2UucHV0IHdhcyBvcHRpbWl6ZWQgZm9yIHNsaWNhYmxlIHJhbmdlcywgaXQgY291bGQgYmUgdXNlZAorICAgICAgLy8gaGVyZSBhcyB3ZWxsLgorICAgICAgYnVmWzAgLi4gZ2l2ZV0gPSB1cmJ1Zl9bdXJwb3NfIC4uIHVycG9zXyArIGdpdmVdOworICAgICAgYnVmID0gYnVmW2dpdmUgLi4gJF07CisgICAgICB1cnBvc18gKz0gZ2l2ZTsKKworICAgICAgYXV0byBuZWVkID0gYnVmLmxlbmd0aDsKKyAgICAgIGlmIChuZWVkID09IDApIHsKKyAgICAgICAgLy8gV2UgY291bGQgbWFuYWdlIHRvIGdldCB0aGUgYWxsIHRoZSBkYXRhIHJlcXVlc3RlZC4KKyAgICAgICAgcmV0dXJuIG9yaWdMZW47CisgICAgICB9CisKKyAgICAgIGlmIChpbnB1dEVuZGVkXyB8fCAobmVlZCA8IG9yaWdMZW4gJiYgcnN0cmVhbV8uYXZhaWxfaW4gPT0gMCkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGZpbGwgYnVmIGNvbXBsZXRlbHksIGJ1dCB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgICAgICByZXR1cm4gb3JpZ0xlbiAtIG5lZWQ7CisgICAgICB9CisKKyAgICAgIC8vIFJlZmlsbCBvdXIgYnVmZmVyIGJ5IHJlYWRpbmcgbW9yZSBkYXRhIHRocm91Z2ggemxpYi4KKyAgICAgIHJzdHJlYW1fLm5leHRfb3V0ID0gdXJidWZfLnB0cjsKKyAgICAgIHJzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQodXJidWZfLmxlbmd0aCk7CisgICAgICB1cnBvc18gPSAwOworCisgICAgICBpZiAoIXJlYWRGcm9tWmxpYigpKSB7CisgICAgICAgIC8vIENvdWxkbid0IGdldCBtb3JlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICAgIHJldHVybiBvcmlnTGVuIC0gbmVlZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZSghb3V0cHV0RmluaXNoZWRfLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgYXV0byBsZW4gPSBidWYubGVuZ3RoOworICAgIGlmIChsZW4gPiBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgeworICAgICAgZmx1c2hUb1psaWIodXdidWZfWzAgLi4gdXdwb3NfXSwgWl9OT19GTFVTSCk7CisgICAgICB1d3Bvc18gPSAwOworICAgICAgZmx1c2hUb1psaWIoYnVmLCBaX05PX0ZMVVNIKTsKKyAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKKyAgICAgIGlmICh1d2J1Zl8ubGVuZ3RoIC0gdXdwb3NfIDwgbGVuKSB7CisgICAgICAgIGZsdXNoVG9abGliKHV3YnVmX1swIC4uIHV3cG9zX10sIFpfTk9fRkxVU0gpOworICAgICAgICB1d3Bvc18gPSAwOworICAgICAgfQorICAgICAgdXdidWZfW3V3cG9zXyAuLiB1d3Bvc18gKyBsZW5dID0gYnVmW107CisgICAgICB1d3Bvc18gKz0gbGVuOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgZW5mb3JjZSghb3V0cHV0RmluaXNoZWRfLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJmbHVzaCgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgZmx1c2hUb1RyYW5zcG9ydChaX1NZTkNfRkxVU0gpOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHJlYWRBdmFpbCkgeworICAgICAgcmV0dXJuIHVyYnVmX1t1cnBvc18gLi4gJF07CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICBlbmZvcmNlKHJlYWRBdmFpbCA+PSBsZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImNvbnN1bWUoKSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdygpLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworICAgIHVycG9zXyArPSBsZW47CisgIH0KKworICAvKioKKyAgICogRmluYWxpemUgdGhlIHpsaWIgc3RyZWFtLgorICAgKgorICAgKiBUaGlzIGNhdXNlcyB6bGliIHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlIGRhdGEgYW5kIHdyaXRlIGVuZC1vZi1zdHJlYW0KKyAgICogaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgY2hlY2tzdW0uICBPbmNlIGZpbmlzaCgpIGhhcyBiZWVuIGNhbGxlZCwgbm8KKyAgICogbmV3IGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4KKyAgICovCisgIHZvaWQgZmluaXNoKCkgeworICAgIGVuZm9yY2UoIW91dHB1dEZpbmlzaGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiZmx1c2goKSBjYWxsZWQgb24gYWxyZWFkeSBmaW5pc2hlZCBUWmxpYlRyYW5zcG9ydCIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICBmbHVzaFRvVHJhbnNwb3J0KFpfRklOSVNIKTsKKyAgfQorCisgIC8qKgorICAgKiBWZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHpsaWIgc3RyZWFtIChieSBmaW5pc2goKSkuCisgICAqCisgICAqIE1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiB0aGUgY2hlY2tzdW0gaXMgY29ycnVwdGVkIG9yIHRoZXJlIGlzCisgICAqICAgc3RpbGwgdW5yZWFkIGRhdGEgbGVmdC4KKyAgICovCisgIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKSB7CisgICAgLy8gSWYgemxpYiBoYXMgYWxyZWFkeSByZXBvcnRlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIHRoZSBjaGVja3N1bSBoYXMKKyAgICAvLyBiZWVuIHZlcmlmaWVkLCBuby4KKyAgICBpZiAoaW5wdXRFbmRlZF8pIHJldHVybjsKKworICAgIGVuZm9yY2UoIXJlYWRBdmFpbCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIHJzdHJlYW1fLm5leHRfb3V0ID0gdXJidWZfLnB0cjsKKyAgICByc3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KHVyYnVmXy5sZW5ndGgpOworICAgIHVycG9zXyA9IDA7CisKKyAgICAvLyByZWFkRnJvbVpsaWIoKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgYmFkLgorICAgIGVuZm9yY2UocmVhZEZyb21abGliKCksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImNoZWNrc3VtIG5vdCBhdmFpbGFibGUgeWV0IGluIHZlcmlmeUNoZWNrc3VtKCkiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKSk7CisKKyAgICBlbmZvcmNlKGlucHV0RW5kZWRfLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mIHpsaWIgc3RyZWFtIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSkpOworCisgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW5kIHRodXMgemxpYiBoYXMKKyAgICAvLyBzdWNjZXNzZnVsbHkgdmVyaWZpZWQgdGhlIGNoZWNrc3VtLgorICB9CisKK3ByaXZhdGU6CisgIHNpemVfdCByZWFkQXZhaWwoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiB1cmJ1Zl8ubGVuZ3RoIC0gcnN0cmVhbV8uYXZhaWxfb3V0IC0gdXJwb3NfOworICB9CisKKyAgYm9vbCByZWFkRnJvbVpsaWIoKSB7CisgICAgYXNzZXJ0KCFpbnB1dEVuZGVkXyk7CisKKyAgICBpZiAocnN0cmVhbV8uYXZhaWxfaW4gPT0gMCkgeworICAgICAgLy8gemxpYiBoYXMgdXNlZCB1cCBhbGwgdGhlIGNvbXByZXNzZWQgZGF0YSB3ZSBwcm92aWRlZCBpbiBjcmJ1ZiwgcmVhZAorICAgICAgLy8gc29tZSBtb3JlIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgYXV0byBnb3QgPSB0cmFuc3BvcnRfLnJlYWQoY3JidWZfKTsKKyAgICAgIGlmIChnb3QgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgcnN0cmVhbV8ubmV4dF9pbiA9IGNyYnVmXy5wdHI7CisgICAgICByc3RyZWFtXy5hdmFpbF9pbiA9IHRvIXVpbnQoZ290KTsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIHNvbWUgY29tcHJlc3NlZCBkYXRhIG5vdywgdW5jb21wcmVzcyBpdC4KKyAgICBhdXRvIHpsaWJfcmVzdWx0ID0gaW5mbGF0ZShyc3RyZWFtXywgWl9TWU5DX0ZMVVNIKTsKKyAgICBpZiAoemxpYl9yZXN1bHQgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICBpbnB1dEVuZGVkXyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHpsaWJFbmZvcmNlKHpsaWJfcmVzdWx0LCByc3RyZWFtXyk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIGZsdXNoVG9UcmFuc3BvcnQoaW50IHR5cGUpICB7CisgICAgLy8gQ29tcHJlc3MgcmVtYWluaW5nIGRhdGEgaW4gdXdidWZfIHRvIGN3YnVmXy4KKyAgICBmbHVzaFRvWmxpYih1d2J1Zl9bMCAuLiB1d3Bvc19dLCB0eXBlKTsKKyAgICB1d3Bvc18gPSAwOworCisgICAgLy8gV3JpdGUgYWxsIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LgorICAgIHRyYW5zcG9ydF8ud3JpdGUoY3didWZfWzAgLi4gJCAtIHdzdHJlYW1fLmF2YWlsX291dF0pOworICAgIHdzdHJlYW1fLm5leHRfb3V0ID0gY3didWZfLnB0cjsKKyAgICB3c3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KGN3YnVmXy5sZW5ndGgpOworCisgICAgLy8gRmx1c2ggdGhlIHRyYW5zcG9ydC4KKyAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CisgIH0KKworICB2b2lkIGZsdXNoVG9abGliKGluIHVieXRlW10gYnVmLCBpbnQgdHlwZSkgeworICAgIHdzdHJlYW1fLm5leHRfaW4gPSBjYXN0KHVieXRlKilidWYucHRyOyAvLyB6bGliIG9ubHkgcmVhZHMsIGNhc3QgaXMgc2FmZS4KKyAgICB3c3RyZWFtXy5hdmFpbF9pbiA9IHRvIXVpbnQoYnVmLmxlbmd0aCk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKHR5cGUgPT0gWl9OT19GTFVTSCAmJiB3c3RyZWFtXy5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAod3N0cmVhbV8uYXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgLy8gY3didWYgaGFzIGJlZW4gZXhoYXVzdGVkIGJ5IHpsaWIsIGZsdXNoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShjd2J1Zl8pOworICAgICAgICB3c3RyZWFtXy5uZXh0X291dCA9IGN3YnVmXy5wdHI7CisgICAgICAgIHdzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQoY3didWZfLmxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGF1dG8gemxpYl9yZXN1bHQgPSBkZWZsYXRlKHdzdHJlYW1fLCB0eXBlKTsKKworICAgICAgaWYgKHR5cGUgPT0gWl9GSU5JU0ggJiYgemxpYl9yZXN1bHQgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGFzc2VydCh3c3RyZWFtXy5hdmFpbF9pbiA9PSAwKTsKKyAgICAgICAgb3V0cHV0RmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHpsaWJFbmZvcmNlKHpsaWJfcmVzdWx0LCB3c3RyZWFtXyk7CisKKyAgICAgIGlmICgodHlwZSA9PSBaX1NZTkNfRkxVU0ggfHwgdHlwZSA9PSBaX0ZVTExfRkxVU0gpICYmCisgICAgICAgICAgd3N0cmVhbV8uYXZhaWxfaW4gPT0gMCAmJiB3c3RyZWFtXy5hdmFpbF9vdXQgIT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB6bGliRW5mb3JjZShpbnQgc3RhdHVzLCB6X3N0cmVhbSogc3RyZWFtKSB7CisgICAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgICB0aHJvdyBuZXcgVFpsaWJFeGNlcHRpb24oc3RhdHVzLCBzdHJlYW0ubXNnKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB6bGliTG9nRXJyb3IoaW50IHN0YXR1cywgel9zdHJlYW0qIHN0cmVhbSkgeworICAgIGlmIChzdGF0dXMgIT0gWl9PSykgeworICAgICAgbG9nRXJyb3IoIlRabGliVHJhbnNwb3J0OiB6bGliIGZhaWx1cmUgaW4gZGVzdHJ1Y3RvcjogJXMiLAorICAgICAgICBUWmxpYkV4Y2VwdGlvbi5lcnJvck1lc3NhZ2Uoc3RhdHVzLCBzdHJlYW0ubXNnKSk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGVzIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBidWZmZXJlZCB1cCAoZHVlIHRvIHpsaWIgaGFuZGxpbmcgb3ZlcmhlYWQpLgorICAvLyBMYXJnZXIgKG9yIGVxdWFsKSB3cml0ZXMgYXJlIGR1bXBlZCBzdHJhaWdodCB0byB6bGliLgorICBlbnVtIE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7CisKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnRfOworICB6X3N0cmVhbSogcnN0cmVhbV87CisgIHpfc3RyZWFtKiB3c3RyZWFtXzsKKworICAvLy8gV2hldGhlciB6bGliIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgYm9vbCBpbnB1dEVuZGVkXzsKKworICAvLy8gV2hldGhlciB0aGUgb3V0cHV0IHN0cmVhbSB3YXMgYWxyZWFkeSBmaW5pc2goKWVkLgorICBib29sIG91dHB1dEZpbmlzaGVkXzsKKworICAvLy8gQ29tcHJlc3NlZCBpbnB1dCBkYXRhIGJ1ZmZlci4KKyAgdWJ5dGVbXSBjcmJ1Zl87CisKKyAgLy8vIFVuY29tcHJlc3NlZCBpbnB1dCBkYXRhIGJ1ZmZlci4KKyAgdWJ5dGVbXSB1cmJ1Zl87CisgIHNpemVfdCB1cnBvc187CisKKyAgLy8vIFVuY29tcHJlc3NlZCBvdXRwdXQgZGF0YSBidWZmZXIgKHdoZXJlIHNtYWxsIHdyaXRlcyBhcmUgYWNjdW11bGF0ZWQKKyAgLy8vIGJlZm9yZSBoYW5kaW5nIG92ZXIgdG8gemxpYikuCisgIHVieXRlW10gdXdidWZfOworICBzaXplX3QgdXdwb3NfOworCisgIC8vLyBDb21wcmVzc2VkIG91dHB1dCBkYXRhIGJ1ZmZlciAoZmlsbGVkIGJ5IHpsaWIsIHdlIGZsdXNoIGl0IHRvIHRoZQorICAvLy8gdW5kZXJseWluZyB0cmFuc3BvcnQpLgorICB1Ynl0ZVtdIGN3YnVmXzsKK30KKworLyoqCisgKiBXcmFwcyBnaXZlbiB0cmFuc3BvcnRzIGludG8gVFpsaWJUcmFuc3BvcnRzLgorICovCithbGlhcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkhVFpsaWJUcmFuc3BvcnQgVFpsaWJUcmFuc3BvcnRGYWN0b3J5OworCisvKioKKyAqIEFuIElOVEVSTkFMX0VSUk9SLXR5cGUgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGVycm9yCisgKiBzaWduYWxlZCBieSB6bGliLgorICovCitjbGFzcyBUWmxpYkV4Y2VwdGlvbiA6IFRUcmFuc3BvcnRFeGNlcHRpb24geworICB0aGlzKGludCBzdGF0dXNDb2RlLCBjb25zdChjaGFyKSogbXNnKSB7CisgICAgc3VwZXIoZXJyb3JNZXNzYWdlKHN0YXR1c0NvZGUsIG1zZyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5JTlRFUk5BTF9FUlJPUik7CisgICAgemxpYlN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOworICAgIHpsaWJNc2cgPSBtc2cgPyB0byFzdHJpbmcobXNnKSA6ICIobnVsbCkiOworICB9CisKKyAgaW50IHpsaWJTdGF0dXNDb2RlOworICBzdHJpbmcgemxpYk1zZzsKKworICBzdGF0aWMgc3RyaW5nIGVycm9yTWVzc2FnZShpbnQgc3RhdHVzQ29kZSwgY29uc3QoY2hhcikqIG1zZykgeworICAgIHN0cmluZyByZXN1bHQgPSAiemxpYiBlcnJvcjogIjsKKworICAgIGlmIChtc2cpIHsKKyAgICAgIHJlc3VsdCB+PSB0byFzdHJpbmcobXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0IH49ICIobm8gbWVzc2FnZSkiOworICAgIH0KKworICAgIHJlc3VsdCB+PSAiIChzdGF0dXMgY29kZSA9ICIgfiB0byFzdHJpbmcoc3RhdHVzQ29kZSkgfiAiKSI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGNvbGxlY3RFeGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK30KKworLy8gTWFrZSBzdXJlIGJhc2ljIHJlYWRpbmcvd3JpdGluZyB3b3Jrcy4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisKKyAgaW1tdXRhYmxlIHVieXRlW10gZGF0YSA9IFsxLCAyLCAzLCA0LCA1XTsKKyAgemxpYi53cml0ZShkYXRhKTsKKyAgemxpYi5maW5pc2goKTsKKworICBhdXRvIHJlc3VsdCA9IG5ldyB1Ynl0ZVtkYXRhLmxlbmd0aF07CisgIHpsaWIucmVhZEFsbChyZXN1bHQpOworICBlbmZvcmNlKGRhdGEgPT0gcmVzdWx0KTsKKyAgemxpYi52ZXJpZnlDaGVja3N1bSgpOworfQorCisvLyBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gZGF0YSBpcyB3cml0dGVuIGlmIHdyaXRlKCkgaXMgbmV2ZXIgY2FsbGVkLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICB7CisgICAgc2NvcGUgemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworICB9CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkubGVuZ3RoID09IDApOworfQorCisvLyBNYWtlIHN1cmUgY2FsbGluZyB3cml0ZSgpL2ZsdXNoKCkvZmluaXNoKCkgYWdhaW4gYWZ0ZXIgZmluaXNoKCkgdGhyb3dzLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICB6bGliLndyaXRlKFsxLCAyLCAzLCA0LCA1XSk7CisgIHpsaWIuZmluaXNoKCk7CisKKyAgYXV0byBleCA9IGNvbGxlY3RFeGNlcHRpb24hVFRyYW5zcG9ydEV4Y2VwdGlvbih6bGliLndyaXRlKFs2XSkpOworICBlbmZvcmNlKGV4ICYmIGV4LnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKTsKKworICBleCA9IGNvbGxlY3RFeGNlcHRpb24hVFRyYW5zcG9ydEV4Y2VwdGlvbih6bGliLmZsdXNoKCkpOworICBlbmZvcmNlKGV4ICYmIGV4LnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKTsKKworICBleCA9IGNvbGxlY3RFeGNlcHRpb24hVFRyYW5zcG9ydEV4Y2VwdGlvbih6bGliLmZpbmlzaCgpKTsKKyAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7Cit9CisKKy8vIE1ha2Ugc3VyZSB2ZXJpZnlpbmcgdGhlIGNoZWNrc3VtIHdvcmtzIGV2ZW4gaWYgaXQgcmVxdWlyZXMgc3RhcnRpbmcgYSBuZXcKKy8vIHJlYWRpbmcgYnVmZmVyIGFmdGVyIHJlYWRpbmcgdGhlIHBheWxvYWQgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworCisgIGltbXV0YWJsZSB1Ynl0ZVtdIGRhdGEgPSBbMSwgMiwgMywgNCwgNV07CisgIHpsaWIud3JpdGUoZGF0YSk7CisgIHpsaWIuZmluaXNoKCk7CisKKyAgemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYsIFRabGliVHJhbnNwb3J0LkRFRkFVTFRfVVJCVUZfU0laRSwKKyAgICBidWYuZ2V0Q29udGVudHMoKS5sZW5ndGggLSAxKTsgLy8gVGhlIGxhc3QgYnl0ZSBiZWxvbmdzIHRvIHRoZSBjaGVja3N1bS4KKworICBhdXRvIHJlc3VsdCA9IG5ldyB1Ynl0ZVtkYXRhLmxlbmd0aF07CisgIHpsaWIucmVhZEFsbChyZXN1bHQpOworICBlbmZvcmNlKGRhdGEgPT0gcmVzdWx0KTsKKworICB6bGliLnZlcmlmeUNoZWNrc3VtKCk7Cit9CisKKy8vIE1ha2Ugc3VyZSB2ZXJpZnlDaGVja3N1bSgpIHRocm93cyBpZiB3ZSBtZXNzZWQgd2l0aCB0aGUgY2hlY2tzdW0uCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuc3RkaW87CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnJhbmdlOworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworCisgIGltbXV0YWJsZSB1Ynl0ZVtdIGRhdGEgPSBbMSwgMiwgMywgNCwgNV07CisgIHpsaWIud3JpdGUoZGF0YSk7CisgIHpsaWIuZmluaXNoKCk7CisKKyAgdm9pZCB0ZXN0Q29ycnVwdGVkKGNvbnN0KHVieXRlKVtdIGNvcnJ1cHRlZERhdGEpIHsKKyAgICBhdXRvIHJlYWRlciA9IG5ldyBUWmxpYlRyYW5zcG9ydCh0SW5wdXRSYW5nZVRyYW5zcG9ydChjb3JydXB0ZWREYXRhKSk7CisgICAgYXV0byByZXN1bHQgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGhdOworICAgIHRyeSB7CisgICAgICByZWFkZXIucmVhZEFsbChyZXN1bHQpOworCisgICAgICAvLyBJZiBpdCBkb2VzIHJlYWQgd2l0aG91dCBjb21wbGFpbmluZywgdGhlIHJlc3VsdCBzaG91bGQgYmUgY29ycmVjdC4KKyAgICAgIGVuZm9yY2UocmVzdWx0ID09IGRhdGEpOworICAgIH0gY2F0Y2ggKFRabGliRXhjZXB0aW9uIGUpIHt9CisKKyAgICBhdXRvIGV4ID0gY29sbGVjdEV4Y2VwdGlvbiFUVHJhbnNwb3J0RXhjZXB0aW9uKHJlYWRlci52ZXJpZnlDaGVja3N1bSgpKTsKKyAgICBlbmZvcmNlKGV4ICYmIGV4LnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgfQorCisgIHRlc3RDb3JydXB0ZWQoYnVmLmdldENvbnRlbnRzKClbMCAuLiAkIC0gMV0pOworCisgIGF1dG8gbW9kaWZpZWQgPSBidWYuZ2V0Q29udGVudHMoKS5kdXA7CisgICsrbW9kaWZpZWRbJCAtIDFdOworICB0ZXN0Q29ycnVwdGVkKG1vZGlmaWVkKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9hd2FpdGFibGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9hd2FpdGFibGUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQzNmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2F3YWl0YWJsZS5kCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworCitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb247CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldC8rIDogU29ja2V0LCBzb2NrZXRQYWlyKy87IC8vIERNRCBAQEJVRzMxNEBACitpbXBvcnQgdGhyaWZ0LmJhc2U7CisKKy8vIFRvIGF2b2lkIERNRCBAQEJVRzYzOTVAQC4KK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtOworCisvKioKKyAqIEFuIGV2ZW50IHRoYXQgY2FuIG9jY3VyIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBhbmQgd2hpY2ggY2FuIGJlCisgKiBhd2FpdGVkLCBlaXRoZXIgYnkgYmxvY2tpbmcgdW50aWwgaXQgb2NjdXJzLCBvciBieSByZWdpc3RlcmluZyBhIGNhbGxiYWNrCisgKiBkZWxlZ2F0ZS4KKyAqLworaW50ZXJmYWNlIFRBd2FpdGFibGUgeworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGV2ZW50IG9jY3Vycy4KKyAgICoKKyAgICogQ2FsbGluZyB3YWl0KCkgZm9yIGFuIGV2ZW50IHRoYXQgaGFzIGFscmVhZHkgb2NjdXJyZWQgaXMgYSBuby1vcC4KKyAgICovCisgIHZvaWQgd2FpdCgpOworCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgZXZlbnQgb2NjdXJzIG9yIHRoZSBzcGVjaWZpZWQgdGltZW91dCBleHBpcmVzLgorICAgKgorICAgKiBDYWxsaW5nIHdhaXQoKSBmb3IgYW4gZXZlbnQgdGhhdCBoYXMgYWxyZWFkeSBvY2N1cnJlZCBpcyBhIG5vLW9wLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB3YWl0KER1cmF0aW9uIHRpbWVvdXQpOworCisgIC8qKgorICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgZXZlbnQgb2NjdXJzLgorICAgKgorICAgKiBUaGUgZGVsZWdhdGUgd2lsbCBsaWtlbHkgYmUgaW52b2tlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwgYW5kIGlzCisgICAqIGV4cGVjdGVkIG5vdCB0byBwZXJmb3JtIGV4cGVuc2l2ZSB3b3JrIGFzIGl0IHdpbGwgdXN1YWxseSBiZSBpbnZva2VkCisgICAqIHN5bmNocm9ub3VzbHkgYnkgdGhlIG5vdGlmeWluZyB0aHJlYWQuIFRoZSBvcmRlciBpbiB3aGljaCByZWdpc3RlcmVkCisgICAqIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBpcyBub3Qgc3BlY2lmaWVkLgorICAgKgorICAgKiBUaGUgY2FsbGJhY2sgbXVzdCBuZXZlciB0aHJvdywgYnV0IG5vdGhyb3cgc2VtYW50aWNzIGFyZSBkaWZmaWN1bHQgdG8KKyAgICogZW5mb3JjZSwgc28gY3VycmVudGx5IGV4Y2VwdGlvbnMgYXJlIGp1c3Qgc3dhbGxvd2VkIGJ5CisgICAqIFRBd2FpdGFibGUgaW1wbGVtZW50YXRpb25zLgorICAgKgorICAgKiBJZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQsIHRoZSBkZWxlZ2F0ZSBpcyBpbW1lZGlhdGVseSBleGVjdXRlZAorICAgKiBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisgICAqLworICB2b2lkIGFkZENhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZyk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIGNhbGxiYWNrLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSBjYWxsYmFjayBjb3VsZCBiZSBmb3VuZCBpbiB0aGUgbGlzdCwgaS5lLiB3aGV0aGVyIGl0CisgICAqICAgd2FzIHByZXZpb3VzbHkgYWRkZWQuCisgICAqLworICBib29sIHJlbW92ZUNhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZyk7Cit9CisKKy8qKgorICogQSBzaW1wbGUgVEF3YWl0YWJsZSBldmVudCB0cmlnZ2VyZWQgYnkganVzdCBjYWxsaW5nIGEgdHJpZ2dlcigpIG1ldGhvZC4KKyAqLworY2xhc3MgVE9uZXNob3RFdmVudCA6IFRBd2FpdGFibGUgeworICB0aGlzKCkgeworICAgIG11dGV4XyA9IG5ldyBNdXRleDsKKyAgICBjb25kaXRpb25fID0gbmV3IENvbmRpdGlvbihtdXRleF8pOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3YWl0KCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICB3aGlsZSAoIXRyaWdnZXJlZF8pIGNvbmRpdGlvbl8ud2FpdCgpOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgd2FpdChEdXJhdGlvbiB0aW1lb3V0KSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIGlmICh0cmlnZ2VyZWRfKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGNvbmRpdGlvbl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIHJldHVybiB0cmlnZ2VyZWRfOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgYWRkQ2FsbGJhY2sodm9pZCBkZWxlZ2F0ZSgpIGRnKSB7CisgICAgbXV0ZXhfLmxvY2soKTsKKyAgICBzY29wZSAoZmFpbHVyZSkgbXV0ZXhfLnVubG9jaygpOworCisgICAgY2FsbGJhY2tzXyB+PSBkZzsKKworICAgIGlmICh0cmlnZ2VyZWRfKSB7CisgICAgICBtdXRleF8udW5sb2NrKCk7CisgICAgICBkZygpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG11dGV4Xy51bmxvY2soKTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcmVtb3ZlQ2FsbGJhY2sodm9pZCBkZWxlZ2F0ZSgpIGRnKSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIGF1dG8gb2xkTGVuZ3RoID0gY2FsbGJhY2tzXy5sZW5ndGg7CisgICAgICBjYWxsYmFja3NfID0gcmVtb3ZlRXF1YWwoY2FsbGJhY2tzXywgZGcpOworICAgICAgcmV0dXJuIGNhbGxiYWNrc18ubGVuZ3RoIDwgb2xkTGVuZ3RoOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUcmlnZ2VycyB0aGUgZXZlbnQuCisgICAqCisgICAqIEFueSByZWdpc3RlcmVkIGV2ZW50IGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlCisgICAqIGZ1bmN0aW9uIHJldHVybnMuCisgICAqLworICB2b2lkIHRyaWdnZXIoKSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIGlmICghdHJpZ2dlcmVkXykgeworICAgICAgICB0cmlnZ2VyZWRfID0gdHJ1ZTsKKyAgICAgICAgY29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICAgICAgZm9yZWFjaCAoYzsgY2FsbGJhY2tzXykgYygpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcml2YXRlOgorICBib29sIHRyaWdnZXJlZF87CisgIE11dGV4IG11dGV4XzsKKyAgQ29uZGl0aW9uIGNvbmRpdGlvbl87CisgIHZvaWQgZGVsZWdhdGUoKVtdIGNhbGxiYWNrc187Cit9CisKKy8qKgorICogVHJhbnNsYXRlcyBUQXdhaXRhYmxlIGV2ZW50cyBpbnRvIGR1bW15IG1lc3NhZ2VzIG9uIGEgc29ja2V0IHRoYXQgY2FuIGJlCisgKiB1c2VkIGUuZy4gdG8gd2FrZSB1cCBmcm9tIGEgc2VsZWN0KCkgY2FsbC4KKyAqLworZmluYWwgY2xhc3MgVFNvY2tldE5vdGlmaWVyIHsKKyAgdGhpcygpIHsKKyAgICBhdXRvIHNvY2tzID0gc29ja2V0UGFpcigpOworICAgIGZvcmVhY2ggKHM7IHNvY2tzKSBzLmJsb2NraW5nID0gZmFsc2U7CisgICAgc2VuZFNvY2tldF8gPSBzb2Nrc1swXTsKKyAgICByZWN2U29ja2V0XyA9IHNvY2tzWzFdOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzb2NrZXQgdGhlIG1lc3NhZ2VzIHdpbGwgYmUgc2VudCB0by4KKyAgICovCisgIFNvY2tldCBzb2NrZXQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiByZWN2U29ja2V0XzsKKyAgfQorCisgIC8qKgorICAgKiBBdGF0Y2hlcyB0aGUgc29ja2V0IG5vdGlmaWVyIHRvIHRoZSBzcGVjaWZpZWQgYXdhaXRhYmxlLCBjYXVzaW5nIGl0IHRvCisgICAqIHdyaXRlIGEgYnl0ZSB0byB0aGUgbm90aWZpY2F0aW9uIHNvY2tldCB3aGVuIHRoZSBhd2FpdGFibGUgY2FsbGJhY2tzIGFyZQorICAgKiBpbnZva2VkLgorICAgKgorICAgKiBJZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiB0cmlnZ2VyZWQsIHRoZSBkdW1teSBieXRlIGlzIHdyaXR0ZW4KKyAgICogaW1tZWRpYXRlbHkgdG8gdGhlIHNvY2tldC4KKyAgICoKKyAgICogQSBzb2NrZXQgbm90aWZpZXIgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gYSBzaW5nbGUgYXdhaXRhYmxlIGF0IGEgdGltZS4KKyAgICoKKyAgICogVGhyb3dzOiBURXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgbm90aWZpZXIgaXMgYWxyZWFkeSBhdHRhY2hlZC4KKyAgICovCisgIHZvaWQgYXR0YWNoKFRBd2FpdGFibGUgYXdhaXRhYmxlKSB7CisgICAgZW5mb3JjZSghYXdhaXRhYmxlXywgbmV3IFRFeGNlcHRpb24oIkFscmVhZHkgYXR0YWNoZWQuIikpOworICAgIGF3YWl0YWJsZS5hZGRDYWxsYmFjaygmbm90aWZ5KTsKKyAgICBhd2FpdGFibGVfID0gYXdhaXRhYmxlOworICB9CisKKyAgLyoqCisgICAqIERldGFjaGVzIHRoZSBzb2NrZXQgbm90aWZpZXIgZnJvbSB0aGUgYXdhaXRhYmxlIGl0IGlzIGN1cnJlbnRseSBhdHRhY2hlZAorICAgKiB0by4KKyAgICoKKyAgICogVGhyb3dzOiBURXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgbm90aWZpZXIgaXMgbm90IGN1cnJlbnRseSBhdHRhY2hlZC4KKyAgICovCisgIHZvaWQgZGV0YWNoKCkgeworICAgIGVuZm9yY2UoYXdhaXRhYmxlXywgbmV3IFRFeGNlcHRpb24oIk5vdCBhdHRhY2hlZC4iKSk7CisKKyAgICAvLyBTb2FrIHVwIGFueSBub3QgY3VycmVudGx5IHJlYWQgbm90aWZpY2F0aW9uIGJ5dGVzLgorICAgIHVieXRlWzFdIGR1bW15ID0gdm9pZDsKKyAgICB3aGlsZSAocmVjdlNvY2tldF8ucmVjZWl2ZShkdW1teSkgIT0gU29ja2V0LkVSUk9SKSB7fQorCisgICAgYXV0byBjb3VsZFJlbW92ZSA9IGF3YWl0YWJsZV8ucmVtb3ZlQ2FsbGJhY2soJm5vdGlmeSk7CisgICAgYXNzZXJ0KGNvdWxkUmVtb3ZlKTsKKyAgICBhd2FpdGFibGVfID0gbnVsbDsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIG5vdGlmeSgpIHsKKyAgICB1Ynl0ZVsxXSB6ZXJvOworICAgIHNlbmRTb2NrZXRfLnNlbmQoemVybyk7CisgIH0KKworICBUQXdhaXRhYmxlIGF3YWl0YWJsZV87CisgIFNvY2tldCBzZW5kU29ja2V0XzsKKyAgU29ja2V0IHJlY3ZTb2NrZXRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2NhbmNlbGxhdGlvbi5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2NhbmNlbGxhdGlvbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTUyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvY2FuY2VsbGF0aW9uLmQKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5hd2FpdGFibGU7CisKKy8qKgorICogQSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmb3IgYXN5bmNocm9ub3VzIG9yIGJsb2NraW5nIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisgKgorICogSXQgaXMgcGFzc2VkIHRvIHRoZSBlbnRpdHkgY3JlYXRpbmcgYW4gb3BlcmF0aW9uLCB3aGljaCB3aWxsIHVzdWFsbHkgbW9uaXRvcgorICogaXQgZWl0aGVyIGJ5IHBvbGxpbmcgb3IgYnkgYWRkaW5nIGV2ZW50IGhhbmRsZXJzLCBhbmQgY2FuY2VsIHRoZSBvcGVyYXRpb24KKyAqIGlmIGl0IGlzIHRyaWdnZXJlZC4KKyAqCisgKiBGb3Igc3luY2hyb25vdXMgb3BlcmF0aW9ucywgdGhpcyB1c3VhbGx5IG1lYW5zIGVpdGhlciB0aHJvd2luZyBhCisgKiBUQ2FuY2VsbGVkRXhjZXB0aW9uIG9yIGltbWVkaWF0ZWx5IHJldHVybmluZywgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIGNhbmNlbGxhdGlvbiBpcyBhbiBleHBlY3RlZCBwYXJ0IG9mIHRoZSB0YXNrIG91dGNvbWUgb3Igbm90LiBGb3IKKyAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLCBjYW5jZWxsYXRpb24gdHlwaWNhbGx5IGVudGFpbHMgc3RvcHBpbmcgYmFja2dyb3VuZAorICogd29yayBhbmQgY2FuY2VsbGluZyBhIHJlc3VsdCBmdXR1cmUsIGlmIG5vdCBhbHJlYWR5IGNvbXBsZXRlZC4KKyAqCisgKiBBbiBvcGVyYXRpb24gYWNjZXB0aW5nIGEgVENhbmNlbGxhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGl0CisgKiB3aWxsIGFjdHVhbGx5IGJlIGFibGUgdG8gcmVhY3QgdG8gdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LgorICovCitpbnRlcmZhY2UgVENhbmNlbGxhdGlvbiB7CisgIC8qKgorICAgKiBXaGV0aGVyIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiB0cmlnZ2VyZWQuCisgICAqLworICBib29sIHRyaWdnZXJlZCgpIGNvbnN0IEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogVGhyb3dzIGEgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbgorICAgKiB0cmlnZ2VyZWQuCisgICAqLworICB2b2lkIHRocm93SWZUcmlnZ2VyZWQoKSBjb25zdDsKKworICAvKioKKyAgICogQSBUQXdhaXRhYmxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgY2FuY2VsbGF0aW9uIHRyaWdnZXJpbmcuCisgICAqLworICBUQXdhaXRhYmxlIHRyaWdnZXJpbmcoKSBAcHJvcGVydHk7Cit9CisKKy8qKgorICogVGhlIG9yaWdpbiBvZiBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCB3aGljaCBwcm92aWRlcyBhIHdheSB0byBhY3R1YWxseQorICogdHJpZ2dlciBpdC4KKyAqCisgKiBUaGlzIGRlc2lnbiBhbGxvd3Mgb3BlcmF0aW9ucyB0byBwYXNzIHRoZSBUQ2FuY2VsbGF0aW9uIG9uIHRvIHN1Yi10YXNrcywKKyAqIHdoaWxlIG1ha2luZyBzdXJlIHRoYXQgdGhlIGNhbmNlbGxhdGlvbiBjYW4gb25seSBiZSB0cmlnZ2VyZWQgYnkgdGhlCisgKiDCu291dGVybW9zdMKrIGluc3RhbmNlIHdhaXRpbmcgZm9yIHRoZSByZXN1bHQuCisgKi8KK2ZpbmFsIGNsYXNzIFRDYW5jZWxsYXRpb25PcmlnaW4gOiBUQ2FuY2VsbGF0aW9uIHsKKyAgdGhpcygpIHsKKyAgICBldmVudF8gPSBuZXcgVE9uZXNob3RFdmVudDsKKyAgfQorCisgIC8qKgorICAgKiBUcmlnZ2VycyB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuCisgICAqLworICB2b2lkIHRyaWdnZXIoKSB7CisgICAgYXRvbWljU3RvcmUodHJpZ2dlcmVkXywgdHJ1ZSk7CisgICAgZXZlbnRfLnRyaWdnZXIoKTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIHRyaWdnZXJlZCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGF0b21pY0xvYWQodHJpZ2dlcmVkXyk7CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCB0aHJvd0lmVHJpZ2dlcmVkKCkgY29uc3QgeworICAgIGlmICh0cmlnZ2VyZWQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICB9CisKKyAgLytvdmVycmlkZSsvIFRBd2FpdGFibGUgdHJpZ2dlcmluZygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGV2ZW50XzsKKyAgfQorCitwcml2YXRlOgorICBzaGFyZWQgYm9vbCB0cmlnZ2VyZWRfOworICBUT25lc2hvdEV2ZW50IGV2ZW50XzsKK30KKworLy8vCitjbGFzcyBUQ2FuY2VsbGVkRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2cgPSBudWxsLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbAorICApIHsKKyAgICBzdXBlcihtc2cgPyBtc2cgOiAiVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuIiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMyYTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuZnV0dXJlOworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb247CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250LCBwb3BGcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC50cmFpdHMgOiBCYXNlVHlwZVR1cGxlLCBpc1NvbWVGdW5jdGlvbiwgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmF3YWl0YWJsZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24gd2hpY2ggaXMgZXhlY3V0ZWQgYXN5bmNocm9ub3VzbHkgYW5kIHRoZSByZXN1bHQgb2YKKyAqIHdoaWNoIHdpbGwgYmVjb21lIGF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgKgorICogT25jZSBhIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZmV0Y2hlZAorICogdmlhIHRoZSBnZXQoKSBmYW1pbHkgb2YgbWV0aG9kcy4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOiBFaXRoZXIgdGhlCisgKiBvcGVyYXRpb24gc3VjY2VlZGVkLCB0aGVuIGl0cyByZXR1cm4gdmFsdWUgaXMgcmV0dXJuZWQsIG9yIGl0IGZhaWxlZCBieQorICogdGhyb3dpbmcsIGluIHdoaWNoIGNhc2UgdGhlIGV4Y2VwdGlvbiBpcyByZXRocm93biwgb3IgaXQgd2FzIGNhbmNlbGxlZAorICogYmVmb3JlLCB0aGVuIGEgVENhbmNlbGxlZEV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZXJlIG1pZ2h0IGJlIFRGdXR1cmUKKyAqIGltcGxlbWVudGF0aW9ucyB3aGljaCBuZXZlciBwb3NzaWJseSBlbnRlciB0aGUgY2FuY2VsbGVkIHN0YXRlLgorICoKKyAqIEFsbCBtZXRob2RzIGFyZSB0aHJlYWQtc2FmZSwgYnV0IGtlZXAgaW4gbWluZCB0aGF0IGFueSBleGNlcHRpb24gb2JqZWN0IG9yCisgKiByZXN1bHQgKGlmIGl0IGlzIGEgcmVmZXJlbmNlIHR5cGUsIG9mIGNvdXJzZSkgaXMgc2hhcmVkIGJldHdlZW4gYWxsCisgKiBnZXQoKS1mYW1pbHkgaW52b2NhdGlvbnMuCisgKi8KK2ludGVyZmFjZSBURnV0dXJlKFJlc3VsdFR5cGUpIHsKKyAgLyoqCisgICAqIFRoZSBzdGF0dXMgdGhlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgaW4uCisgICAqCisgICAqIEFuIG9wZXJhdGlvbiBzdGFydHMgb3V0IGluIFJVTk5JTkcgc3RhdHVzLCBhbmQgY2hhbmdlcyBzdGF0ZSB0byBvbmUgb2YgdGhlCisgICAqIG90aGVycyBhdCBtb3N0IG9uY2UgYWZ0ZXJ3YXJkcy4KKyAgICovCisgIFRGdXR1cmVTdGF0dXMgc3RhdHVzKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBBIFRBd2FpdGFibGUgdHJpZ2dlcmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBsZWF2ZXMgdGhlIFJVTk5JTkcgc3RhdHVzLgorICAgKi8KKyAgVEF3YWl0YWJsZSBjb21wbGV0aW9uKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHdhaXRpbmcgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUgYW5kIHRoZW4KKyAgICogZ2V0KClpbmcgaXQuCisgICAqCisgICAqIElmIHRoZSBvcGVyYXRpb24gaGFzIGFscmVhZHkgY29tcGxldGVkLCB0aGUgcmVzdWx0IGlzIGltbWVkaWF0ZWx5CisgICAqIHJldHVybmVkLgorICAgKgorICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIMK7YWxpYXMgdGhpc8KrJ2QgdG8gdGhlIGludGVyZmFjZSwgc28gdGhhdAorICAgKiBURnV0dXJlIGNhbiBiZSB1c2VkIGFzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYSBzaW1wbGUgdmFsdWUgaW4KKyAgICogc3luY2hyb25vdXMgY29kZS4KKyAgICovCisgIGZpbmFsIFJlc3VsdFR5cGUgd2FpdEdldCgpIHsKKyAgICBjb21wbGV0aW9uLndhaXQoKTsKKyAgICByZXR1cm4gZ2V0KCk7CisgIH0KKyAgZmluYWwgQHByb3BlcnR5IGF1dG8gd2FpdEdldFByb3BlcnR5KCkgeyByZXR1cm4gd2FpdEdldCgpOyB9CisgIGFsaWFzIHdhaXRHZXRQcm9wZXJ0eSB0aGlzOworCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHdhaXRpbmcgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUgYW5kIHRoZW4KKyAgICogZ2V0KClpbmcgaXQuCisgICAqCisgICAqIElmIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIGluIHRpbWUsIHJldHVybnMgaXRzIHJlc3VsdCAocmVzcC4gdGhyb3dzIGFuCisgICAqIGV4Y2VwdGlvbiBmb3IgdGhlIGZhaWxlZC9jYW5jZWxsZWQgY2FzZXMpLiBJZiBub3QsIHRocm93cyBhCisgICAqIFRGdXR1cmVFeGNlcHRpb24uCisgICAqLworICBmaW5hbCBSZXN1bHRUeXBlIHdhaXRHZXQoRHVyYXRpb24gdGltZW91dCkgeworICAgIGVuZm9yY2UoY29tcGxldGlvbi53YWl0KHRpbWVvdXQpLCBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigKKyAgICAgICJPcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZSBpbiB0aW1lLiIpKTsKKyAgICByZXR1cm4gZ2V0KCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAqCisgICAqIFRocm93czogVEZ1dHVyZUV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCwKKyAgICogICBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlmIGl0IGlzIG5vdCB5ZXQgZG9uZTsgdGhlIHNldCBleGNlcHRpb24gaWYgaXQKKyAgICogICBmYWlsZWQuCisgICAqLworICBSZXN1bHRUeXBlIGdldCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBleGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgbm90IHlldCBkb25lLCBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlmIHRoZQorICAgKiAgIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuCisgICAqLworICBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCk7Cit9CisKKy8qKgorICogVGhlIHN0YXRlcyB0aGUgb3BlcmF0aW9uIG9mZmVyaW5nIGEgZnV0dXJlIGludGVyZmFjZSBjYW4gYmUgaW4uCisgKi8KK2VudW0gVEZ1dHVyZVN0YXR1cyA6IGJ5dGUgeworICBSVU5OSU5HLCAvLy8gVGhlIG9wZXJhdGlvbiBpcyBzdGlsbCBydW5uaW5nLgorICBTVUNDRUVERUQsIC8vLyBUaGUgb3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgRkFJTEVELCAvLy8gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICBDQU5DRUxMRUQgLy8vIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZC4KK30KKworLyoqCisgKiBBIFRGdXR1cmUgY292ZXJpbmcgdGhlIHNpbXBsZSBidXQgY29tbW9uIGNhc2Ugd2hlcmUgdGhlIHJlc3VsdCBpcyBzaW1wbHkKKyAqIHNldCBieSBhIGNhbGwgdG8gc3VjY2VlZCgpL2ZhaWwoKS4KKyAqCisgKiBBbGwgbWV0aG9kcyBhcmUgdGhyZWFkLXNhZmUsIGJ1dCB1c3VhbGx5LCBzdWNjZWVkKCkvZmFpbCgpIGFyZSBvbmx5IGNhbGxlZAorICogZnJvbSBhIHNpbmdsZSB0aHJlYWQgKGRpZmZlcmVudCBmcm9tIHRoZSB0aHJlYWQocykgd2FpdGluZyBmb3IgdGhlIHJlc3VsdAorICogdXNpbmcgdGhlIFRGdXR1cmUgaW50ZXJmYWNlLCB0aG91Z2gpLgorICovCitjbGFzcyBUUHJvbWlzZShSZXN1bHRUeXBlKSA6IFRGdXR1cmUhUmVzdWx0VHlwZSB7CisgIHRoaXMoKSB7CisgICAgc3RhdHVzTXV0ZXhfID0gbmV3IE11dGV4OworICAgIGNvbXBsZXRpb25FdmVudF8gPSBuZXcgVE9uZXNob3RFdmVudDsKKyAgfQorCisgIG92ZXJyaWRlIFMgc3RhdHVzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgfQorCisgIG92ZXJyaWRlIFRBd2FpdGFibGUgY29tcGxldGlvbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGNvbXBsZXRpb25FdmVudF87CisgIH0KKworICBvdmVycmlkZSBSZXN1bHRUeXBlIGdldCgpIHsKKyAgICBhdXRvIHMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgIGVuZm9yY2UocyAhPSBTLlJVTk5JTkcsCisgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgIGlmIChzID09IFMuQ0FOQ0VMTEVEKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgICBpZiAocyA9PSBTLkZBSUxFRCkgdGhyb3cgZXhjZXB0aW9uXzsKKworICAgIHN0YXRpYyBpZiAoIWlzKFJlc3VsdFR5cGUgPT0gdm9pZCkpIHsKKyAgICAgIHJldHVybiByZXN1bHRfOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICBlbmZvcmNlKHMgIT0gUy5SVU5OSU5HLAorICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgaWYgKHMgPT0gUy5TVUNDRUVERUQpIHJldHVybiBudWxsOworCisgICAgcmV0dXJuIGV4Y2VwdGlvbl87CisgIH0KKworICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24sIG1hcmtzIGl0IGFzIGRvbmUsIGFuZCBub3RpZmllcyBhbnkKKyAgICAgKiB3YWl0ZXJzLgorICAgICAqCisgICAgICogSWYgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYmVmb3JlLCBub3RoaW5nIGhhcHBlbnMuCisgICAgICoKKyAgICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN1Y2NlZWQoUmVzdWx0VHlwZSByZXN1bHQpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc3RhdHVzTXV0ZXhfKSB7CisgICAgICAgIGF1dG8gcyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgICAgIGlmIChzID09IFMuQ0FOQ0VMTEVEKSByZXR1cm47CisKKyAgICAgICAgZW5mb3JjZShzID09IFMuUlVOTklORywKKyAgICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKyAgICAgICAgcmVzdWx0XyA9IHJlc3VsdDsKKworICAgICAgICBhdG9taWNTdG9yZShzdGF0dXNfLCBTLlNVQ0NFRURFRCk7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2b2lkIHN1Y2NlZWQoKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgICBhdXRvIHMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworCisgICAgICAgIGVuZm9yY2UocyA9PSBTLlJVTk5JTkcsCisgICAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC4iKSk7CisKKyAgICAgICAgYXRvbWljU3RvcmUoc3RhdHVzXywgUy5TVUNDRUVERUQpOworICAgICAgfQorCisgICAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTWFya3MgdGhlIG9wZXJhdGlvbiBhcyBmYWlsZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBhbmQgbm90aWZpZXMKKyAgICogYW55IHdhaXRlcnMuCisgICAqCisgICAqIElmIHRoZSBvcGVyYXRpb24gd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBub3RoaW5nIGhhcHBlbnMuCisgICAqCisgICAqIFRocm93czogVEZ1dHVyZUV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGVkLgorICAgKi8KKyAgdm9pZCBmYWlsKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgYXV0byBzdGF0dXMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgaWYgKHN0YXR1cyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworCisgICAgICBlbmZvcmNlKHN0YXR1cyA9PSBTLlJVTk5JTkcsCisgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQuIikpOworICAgICAgZXhjZXB0aW9uXyA9IGV4Y2VwdGlvbjsKKworICAgICAgYXRvbWljU3RvcmUoc3RhdHVzXywgUy5GQUlMRUQpOworICAgIH0KKworICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICB9CisKKworICAvKioKKyAgICogTWFya3MgdGhpcyBvcGVyYXRpb24gYXMgY29tcGxldGVkIGFuZCB0YWtlcyBvdmVyIHRoZSBvdXRjb21lIG9mIGFub3RoZXIKKyAgICogVEZ1dHVyZSBvZiB0aGUgc2FtZSB0eXBlLgorICAgKgorICAgKiBJZiB0aGlzIG9wZXJhdGlvbiB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIG5vdGhpbmcgaGFwcGVucy4gSWYgdGhlIG90aGVyCisgICAqIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLCB0aGlzIG9wZXJhdGlvbiBpcyBtYXJrZWQgYXMgZmFpbGVkIHdpdGggYQorICAgKiBUQ2FuY2VsbGVkRXhjZXB0aW9uLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmdXR1cmUgd2FzIG5vdCBjb21wbGV0ZWQgb3IKKyAgICogICB0aGlzIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZC4KKyAgICovCisgIHZvaWQgY29tcGxldGUoVEZ1dHVyZSFSZXN1bHRUeXBlIGZ1dHVyZSkgeworICAgIHN5bmNocm9uaXplZCAoc3RhdHVzTXV0ZXhfKSB7CisgICAgICBhdXRvIHN0YXR1cyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgICBpZiAoc3RhdHVzID09IFMuQ0FOQ0VMTEVEKSByZXR1cm47CisgICAgICBlbmZvcmNlKHN0YXR1cyA9PSBTLlJVTk5JTkcsCisgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQuIikpOworCisgICAgICBlbmZvcmNlKGZ1dHVyZS5zdGF0dXMgIT0gUy5SVU5OSU5HLCBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigKKyAgICAgICAgIlRoZSBwYXNzZWQgVEZ1dHVyZSBpcyBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICAgIHN0YXR1cyA9IGZ1dHVyZS5zdGF0dXM7CisgICAgICBpZiAoc3RhdHVzID09IFMuQ0FOQ0VMTEVEKSB7CisgICAgICAgIHN0YXR1cyA9IFMuRkFJTEVEOworICAgICAgICBleGNlcHRpb25fID0gbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBTLkZBSUxFRCkgeworICAgICAgICBleGNlcHRpb25fID0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoIWlzKFJlc3VsdFR5cGUgPT0gdm9pZCkpIHsKKyAgICAgICAgcmVzdWx0XyA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgIH0KKworICAgICAgYXRvbWljU3RvcmUoc3RhdHVzXywgc3RhdHVzKTsKKyAgICB9CisKKyAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBNYXJrcyB0aGlzIG9wZXJhdGlvbiBhcyBjYW5jZWxsZWQgYW5kIG5vdGlmaWVzIGFueSB3YWl0ZXJzLgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGVkLCBub3RoaW5nIGhhcHBlbnMuCisgICAqLworICB2b2lkIGNhbmNlbCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgYXV0byBzdGF0dXMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgaWYgKHN0YXR1cyA9PSBTLlJVTk5JTkcpIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuQ0FOQ0VMTEVEKTsKKyAgICB9CisKKyAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBDb252ZW5pZW5jZSBhbGlhcyBiZWNhdXNlIFRGdXR1cmVTdGF0dXMgaXMgdWJpcXVpdG91cyBpbiB0aGlzIGNsYXNzLgorICBhbGlhcyBURnV0dXJlU3RhdHVzIFM7CisKKyAgLy8gVGhlIHN0YXR1cyB0aGUgcHJvbWlzZSBpcyBjdXJyZW50bHkgaW4uCisgIHNoYXJlZCBTIHN0YXR1c187CisKKyAgdW5pb24geworICAgIHN0YXRpYyBpZiAoIWlzKFJlc3VsdFR5cGUgPT0gdm9pZCkpIHsKKyAgICAgIC8vIFNldCBpZiBzdGF0dXNfIGlzIFNVQ0NFRURFRC4KKyAgICAgIFJlc3VsdFR5cGUgcmVzdWx0XzsKKyAgICB9CisgICAgLy8gU2V0IGlmIHN0YXR1c18gaXMgRkFJTEVELgorICAgIEV4Y2VwdGlvbiBleGNlcHRpb25fOworICB9CisKKyAgLy8gUHJvdGVjdHMgc3RhdHVzXy4KKyAgLy8gQXMgZm9yIHJlc3VsdF8gYW5kIGV4Y2VwdGlvbl86IFRoZXkgYXJlIG9ubHkgc2V0IG9uY2UsIHdoaWxlIHN0YXR1c18gaXMKKyAgLy8gc3RpbGwgUlVOTklORywgc28gZ2l2ZW4gdGhhdCB0aGUgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgcmVhZGluZworICAvLyB0aGVtIGlzIHNhZmUgd2l0aG91dCBob2xkaW5nIHNvbWUga2luZCBvZiBsb2NrLgorICBNdXRleCBzdGF0dXNNdXRleF87CisKKyAgLy8gVHJpZ2dlcmVkIHdoZW4gdGhlIGV2ZW50IGNvbXBsZXRlcy4KKyAgVE9uZXNob3RFdmVudCBjb21wbGV0aW9uRXZlbnRfOworfQorCisvLy8KK2NsYXNzIFRGdXR1cmVFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZyA9ICIiLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KKworLyoqCisgKiBDcmVhdGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIHNpbWlsYXIgdG8gYSBnaXZlbiBvbmUsIGJ1dCBhY2NlcHRzIGFuCisgKiBhZGRpdGlvbmFsLCBvcHRpb25hbCBUQ2FuY2VsbGF0aW9uIHBhcmFtZXRlciBlYWNoIG1ldGhvZCwgYW5kIHJldHVybnMKKyAqIFRGdXR1cmVzIGluc3RlYWQgb2YgcGxhaW4gcmV0dXJuIHZhbHVlcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnM6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICB2b2lkIGJhcigpOworICogICBzdHJpbmcgYmF6KGludCBhKTsKKyAqIH0KKyAqIGFsaWFzIFRGdXR1cmVJbnRlcmZhY2UhRm9vIEZ1dHVyZUZvbzsKKyAqIC0tLQorICoKKyAqIEZ1dHVyZUZvbyB3b3VsZCBiZSBlcXVpdmFsZW50IHRvOgorICogLS0tCisgKiBpbnRlcmZhY2UgRnV0dXJlRm9vIHsKKyAqICAgVEZ1dHVyZSF2b2lkIGJhcihUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpOworICogICBURnV0dXJlIXN0cmluZyBiYXooaW50IGEsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCk7CisgKiB9CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVEZ1dHVyZUludGVyZmFjZShJbnRlcmZhY2UpIGlmIChpcyhJbnRlcmZhY2UgXyA9PSBpbnRlcmZhY2UpKSB7CisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZSA9ICJpbnRlcmZhY2UgVEZ1dHVyZUludGVyZmFjZSBcbiI7CisKKyAgICBzdGF0aWMgaWYgKGlzKEludGVyZmFjZSBCYXNlcyA9PSBzdXBlcikgJiYgQmFzZXMubGVuZ3RoID4gMCkgeworICAgICAgY29kZSB+PSAiOiAiOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBCYXNlcy5sZW5ndGgpIHsKKyAgICAgICAgaWYgKGkgPiAwKSBjb2RlIH49ICIsICI7CisgICAgICAgIGNvZGUgfj0gIlRGdXR1cmVJbnRlcmZhY2UhKEJhc2VUeXBlVHVwbGUhSW50ZXJmYWNlWyIgfiB0byFzdHJpbmcoaSkgfiAiXSkgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlIH49ICJ7XG4iOworCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpIHsKKyAgICAgIGVudW0gcW4gPSAiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lOworICAgICAgc3RhdGljIGlmIChpc1NvbWVGdW5jdGlvbiEobWl4aW4ocW4pKSkgeworICAgICAgICBjb2RlIH49ICJURnV0dXJlIShSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSkgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAgICIoUGFyYW1ldGVyVHlwZVR1cGxlISgiIH4gcW4gfiAiKSwgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTtcbiI7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBBbiBpbnB1dCByYW5nZSB0aGF0IGFnZ3JlZ2F0ZXMgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLAorICogcmV0dXJuaW5nIHRoZW0gaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLgorICoKKyAqIEFkZGl0aW9uYWxseSwgYSB0aW1lb3V0IGNhbiBiZSBzZXQgYWZ0ZXIgd2hpY2ggcmVzdWx0cyBmcm9tIG5vdCB5ZXQgZmluaXNoZWQKKyAqIGZ1dHVyZXMgd2lsbCBubyBsb25nZXIgYmUgd2FpdGVkIGZvciwgZS5nLiB0byBlbnN1cmUgdGhlIHRpbWUgaXQgdGFrZXMgdG8KKyAqIGl0ZXJhdGUgb3ZlciBhIHNldCBvZiByZXN1bHRzIGlzIGxpbWl0ZWQuCisgKi8KK2ZpbmFsIGNsYXNzIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UoVCkgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGZ1dHVyZXMgPSBUaGUgc2V0IG9mIGZ1dHVyZXMgdG8gY29sbGVjdCByZXN1bHRzIGZyb20uCisgICAqICAgdGltZW91dCA9IElmIHBvc2l0aXZlLCBub3QgeWV0IGZpbmlzaGVkIGZ1dHVyZXMgd2lsbCBiZSBjYW5jZWxsZWQgYW5kCisgICAqICAgICB0aGVpciByZXN1bHRzIHdpbGwgbm90IGJlIHRha2VuIGludG8gYWNjb3VudC4KKyAgICovCisgIHRoaXMoVEZ1dHVyZSFUW10gZnV0dXJlcywgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbiwKKyAgICBEdXJhdGlvbiB0aW1lb3V0ID0gZHVyISJobnNlY3MiKDApCisgICkgeworICAgIGlmICh0aW1lb3V0ID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICB0aW1lb3V0U3lzVGlja18gPSBUaWNrRHVyYXRpb24uY3VyclN5c3RlbVRpY2sgKworICAgICAgICBUaWNrRHVyYXRpb24uZnJvbSEiaG5zZWNzIih0aW1lb3V0LnRvdGFsISJobnNlY3MiKTsKKyAgICB9IGVsc2UgeworICAgICAgdGltZW91dFN5c1RpY2tfID0gVGlja0R1cmF0aW9uKDApOworICAgIH0KKworICAgIHF1ZXVlTXV0ZXhfID0gbmV3IE11dGV4OworICAgIHF1ZXVlTm9uRW1wdHlDb25kaXRpb25fID0gbmV3IENvbmRpdGlvbihxdWV1ZU11dGV4Xyk7CisgICAgZnV0dXJlc18gPSBmdXR1cmVzOworICAgIGNoaWxkQ2FuY2VsbGF0aW9uXyA9IGNoaWxkQ2FuY2VsbGF0aW9uOworCisgICAgZm9yZWFjaCAoZnV0dXJlOyBmdXR1cmVzXykgeworICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICBhdXRvIGYgPSBmdXR1cmU7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgaWYgKGYuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSByZXR1cm47CisgICAgICAgICAgYXNzZXJ0KGYuc3RhdHVzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORyk7CisKKyAgICAgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlTXV0ZXhfKSB7CisgICAgICAgICAgICBjb21wbGV0ZWRRdWV1ZV8gfj0gZjsKKworICAgICAgICAgICAgaWYgKGNvbXBsZXRlZFF1ZXVlXy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgICoKKyAgICogVGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBjb21wbGV0ZWQgZnV0dXJlcyBub3QgaGF2aW5nCisgICAqIGZhaWxlZCBoYXZlIGFscmVhZHkgYmVlbiBwb3BwZWQgYW5kIGVpdGhlciBhbGwgZnV0dXJlIGhhdmUgYmVlbiBmaW5pc2hlZAorICAgKiBvciB0aGUgdGltZW91dCBoYXMgZXhwaXJlZC4KKyAgICoKKyAgICogUG90ZW50aWFsbHkgYmxvY2tzIHVudGlsIGEgbmV3IHJlc3VsdCBpcyBhdmFpbGFibGUgb3IgdGhlIHRpbWVvdXQgaGFzCisgICAqIGV4cGlyZWQuCisgICAqLworICBib29sIGVtcHR5KCkgQHByb3BlcnR5IHsKKyAgICBpZiAoZmluaXNoZWRfKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoYnVmZmVyRmlsbGVkXykgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFRGdXR1cmUhVCBmdXR1cmU7CisgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlTXV0ZXhfKSB7CisgICAgICAgIC8vIFRoZSB3aGlsZSBsb29wIGlzIGp1c3QgYmVpbmcgY2F1dGlvdXMgYWJvdXQgc3B1cmlvdXMgd2FrZXVwcywgaW4KKyAgICAgICAgLy8gY2FzZSB0aGV5IHNob3VsZCBiZSBwb3NzaWJsZS4KKyAgICAgICAgd2hpbGUgKGNvbXBsZXRlZFF1ZXVlXy5lbXB0eSkgeworICAgICAgICAgIGF1dG8gcmVtYWluaW5nID0gdG8hRHVyYXRpb24odGltZW91dFN5c1RpY2tfIC0KKyAgICAgICAgICAgIFRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljayk7CisKKyAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgLy8gTm8gdGltZSBsZWZ0LCBidXQgc3RpbGwgbm8gZWxlbWVudCByZWNlaXZlZCDigJMgd2UgYXJlIGVtcHR5IG5vdy4KKyAgICAgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgICAgICBjaGlsZENhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcXVldWVOb25FbXB0eUNvbmRpdGlvbl8ud2FpdChyZW1haW5pbmcpOworICAgICAgICB9CisKKyAgICAgICAgZnV0dXJlID0gY29tcGxldGVkUXVldWVfLmZyb250OworICAgICAgICBjb21wbGV0ZWRRdWV1ZV8ucG9wRnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgKytjb21wbGV0ZWRDb3VudF87CisgICAgICBpZiAoY29tcGxldGVkQ291bnRfID09IGZ1dHVyZXNfLmxlbmd0aCkgeworICAgICAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBmdXR1cmUgaW4gdGhlIGxpc3QsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5CisgICAgICAgIC8vIGFub3RoZXIgcmVzdWx0IGNvdWxkIGV2ZXIgYmVjb21lIGF2YWlsYWJsZS4KKyAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZ1dHVyZS5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQpIHsKKyAgICAgICAgLy8gVGhpcyBvbmUgZmFpbGVkLCBsb29wIGFnYWluIGFuZCB0cnkgZ2V0dGluZyBhbm90aGVyIGl0ZW0gZnJvbQorICAgICAgICAvLyB0aGUgcXVldWUuCisgICAgICAgIGV4Y2VwdGlvbnNfIH49IGZ1dHVyZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdEJ1ZmZlcl8gPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgIGJ1ZmZlckZpbGxlZF8gPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcmFuZ2UuCisgICAqCisgICAqIFBvdGVudGlhbGx5IGJsb2NrcyB1bnRpbCBhIG5ldyByZXN1bHQgaXMgYXZhaWxhYmxlIG9yIHRoZSB0aW1lb3V0IGhhcworICAgKiBleHBpcmVkLgorICAgKgorICAgKiBUaHJvd3M6IFRFeGNlcHRpb24gaWYgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgKi8KKyAgVCBmcm9udCgpIHsKKyAgICBlbmZvcmNlKCFlbXB0eSwgbmV3IFRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IGdldCBmcm9udCBvZiBhbiBlbXB0eSBmdXR1cmUgYWdncmVnYXRvciByYW5nZS4iKSk7CisgICAgcmV0dXJuIHJlc3VsdEJ1ZmZlcl87CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSByYW5nZS4KKyAgICoKKyAgICogUG90ZW50aWFsbHkgYmxvY2tzIHVudGlsIGEgbmV3IHJlc3VsdCBpcyBhdmFpbGFibGUgb3IgdGhlIHRpbWVvdXQgaGFzCisgICAqIGV4cGlyZWQuCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAqLworICB2b2lkIHBvcEZyb250KCkgeworICAgIGVuZm9yY2UoIWVtcHR5LCBuZXcgVEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgcG9wIGZyb250IG9mIGFuIGVtcHR5IGZ1dHVyZSBhZ2dyZWdhdG9yIHJhbmdlLiIpKTsKKyAgICBidWZmZXJGaWxsZWRfID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBmdXR1cmVzIHRoZSByZXN1bHQgb2Ygd2hpY2ggaGFzIGJlZW4gcmV0dXJuZWQgb3Igd2hpY2ggaGF2ZQorICAgKiBmYWlsZWQgc28gZmFyLgorICAgKi8KKyAgc2l6ZV90IGNvbXBsZXRlZENvdW50KCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGxldGVkQ291bnRfOworICB9CisKKyAgLyoqCisgICAqIFRoZSBleGNlcHRpb25zIGNvbGxlY3RlZCBmcm9tIGZhaWxlZCBURnV0dXJlcyBzbyBmYXIuCisgICAqLworICBFeGNlcHRpb25bXSBleGNlcHRpb25zKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gZXhjZXB0aW9uc187CisgIH0KKworcHJpdmF0ZToKKyAgVEZ1dHVyZSFUW10gZnV0dXJlc187CisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb25fOworCisgIC8vIFRoZSBzeXN0ZW0gdGljayB0aGlzIG9wZXJhdGlvbiB3aWxsIHRpbWUgb3V0LCBvciB6ZXJvIGlmIG5vIHRpbWVvdXQgaGFzCisgIC8vIGJlZW4gc2V0LgorICBUaWNrRHVyYXRpb24gdGltZW91dFN5c1RpY2tfOworCisgIGJvb2wgZmluaXNoZWRfOworCisgIGJvb2wgYnVmZmVyRmlsbGVkXzsKKyAgVCByZXN1bHRCdWZmZXJfOworCisgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnNfOworICBzaXplX3QgY29tcGxldGVkQ291bnRfOworCisgIC8vIFRoZSBxdWV1ZSBvZiBjb21wbGV0ZWQgZnV0dXJlcy4gVGhpcyAoYW5kIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbikgYXJlCisgIC8vIHRoZSBvbmx5IHBhcnRzIG9mIHRoaXMgY2xhc3MgdGhhdCBhcmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KKyAgVEZ1dHVyZSFUW10gY29tcGxldGVkUXVldWVfOworICBNdXRleCBxdWV1ZU11dGV4XzsKKyAgQ29uZGl0aW9uIHF1ZXVlTm9uRW1wdHlDb25kaXRpb25fOworfQorCisvKioKKyAqIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgdmFsdWUgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitURnV0dXJlQWdncmVnYXRvclJhbmdlIVQgdEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZShUKShURnV0dXJlIVRbXSBmdXR1cmVzLAorICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uLCBEdXJhdGlvbiB0aW1lb3V0ID0gZHVyISJobnNlY3MiKDApCispIHsKKyAgcmV0dXJuIG5ldyBURnV0dXJlQWdncmVnYXRvclJhbmdlIVQoZnV0dXJlcywgY2hpbGRDYW5jZWxsYXRpb24sIHRpbWVvdXQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMTIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudXRpbC5oYXNoc2V0OworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGpvaW5lciwgbWFwOworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW1wbGljaXRseUNvbnZlcnRpYmxlLCBQYXJhbWV0ZXJUeXBlVHVwbGU7CitpbXBvcnQgc3RkLnJhbmdlIDogRWxlbWVudFR5cGUsIGlzSW5wdXRSYW5nZTsKKworc3RydWN0IFZvaWQge30KKworLyoqCisgKiBBIHF1aWNrbHkgaGFja2VkIHRvZ2V0aGVyIGhhc2ggc2V0IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBidWlsdC1pbgorICogYXNzb2NpYXRpdmUgYXJyYXlzIHRvIGhhdmUgc29tZXRoaW5nIHRvIGNvbXBpbGUgVGhyaWZ0J3Mgc2V0PD4gdG8gdW50aWwKKyAqIHN0ZC5jb250YWluZXIgZ2FpbnMgc29tZXRoaW5nIHN1aXRhYmxlLgorICovCisvLyBOb3RlOiBUaGUgZnVua3kgcG9pbnRlciBjYXN0cyAoaS5lLiAqKGNhc3QoaW1tdXRhYmxlKEUpKikmZSkgaW5zdGVhZCBvZgorLy8ganVzdCBjYXN0KGltbXV0YWJsZShFKSllKSBhcmUgYSB3b3JrYXJvdW5kIGZvciBMREMgMiBjb21wYXRpYmlsaXR5LgorZmluYWwgY2xhc3MgSGFzaFNldChFKSB7CisgIC8vLworICB0aGlzKCkge30KKworICAvLy8KKyAgdGhpcyhFW10gZWxlbXMuLi4pIHsKKyAgICBpbnNlcnQoZWxlbXMpOworICB9CisKKyAgLy8vCisgIHZvaWQgaW5zZXJ0KFN0dWZmKShTdHVmZiBzdHVmZikgaWYgKGlzSW1wbGljaXRseUNvbnZlcnRpYmxlIShTdHVmZiwgRSkpIHsKKyAgICBhYV9bKihjYXN0KGltbXV0YWJsZShFKSopJnN0dWZmKV0gPSBWb2lkLmluaXQ7CisgIH0KKworICAvLy8KKyAgdm9pZCBpbnNlcnQoU3R1ZmYpKFN0dWZmIHN0dWZmKSBpZiAoCisgICAgaXNJbnB1dFJhbmdlIVN0dWZmICYmIGlzSW1wbGljaXRseUNvbnZlcnRpYmxlIShFbGVtZW50VHlwZSFTdHVmZiwgRSkKKyAgKSB7CisgICAgZm9yZWFjaCAoZTsgc3R1ZmYpIHsKKyAgICAgIGFhX1sqKGNhc3QoaW1tdXRhYmxlKEUpKikmZSldID0gVm9pZC5pbml0OworICAgIH0KKyAgfQorCisgIC8vLworICB2b2lkIG9wT3BBc3NpZ24oc3RyaW5nIG9wIDogIn4iLCBTdHVmZikoU3R1ZmYgc3R1ZmYpIHsKKyAgICBpbnNlcnQoc3R1ZmYpOworICB9CisKKyAgLy8vCisgIHZvaWQgcmVtb3ZlKEUgZSkgeworICAgIGFhXy5yZW1vdmUoKihjYXN0KGltbXV0YWJsZShFKSopJmUpKTsKKyAgfQorICBhbGlhcyByZW1vdmUgcmVtb3ZlS2V5OworCisgIC8vLworICB2b2lkIHJlbW92ZUFsbCgpIHsKKyAgICBhYV8gPSBudWxsOworICB9CisKKyAgLy8vCisgIHNpemVfdCBsZW5ndGgoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBhYV8ubGVuZ3RoOworICB9CisKKyAgLy8vCisgIHNpemVfdCBlbXB0eSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuICFhYV8ubGVuZ3RoOworICB9CisKKyAgLy8vCisgIGJvb2wgb3BCaW5hcnlSaWdodChzdHJpbmcgb3AgOiAiaW4iKShFIGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKGUgaW4gYWFfKSAhaXMgbnVsbDsKKyAgfQorCisgIC8vLworICBhdXRvIG9wU2xpY2UoKSBjb25zdCB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHVzaW5nIEFBIGtleSByYW5nZSBvbmNlIGF2YWlsYWJsZSBpbiByZWxlYXNlIERNRC9kcnVudGltZQorICAgIC8vIHRvIGF2b2lkIGFsbG9jYXRpb24uCisgICAgcmV0dXJuIGNhc3QoRVtdKShhYV8ua2V5cyk7CisgIH0KKworICAvLy8KKyAgb3ZlcnJpZGUgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIC8vIE9ubHkgcHJvdmlkZSB0b1N0cmluZygpIGlmIHRvIXN0cmluZygpIGlzIGF2YWlsYWJsZSBmb3IgRSAoZXhjZXB0aW9ucyBhcmUKKyAgICAvLyBlLmcuIGRlbGVnYXRlcykuCisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YodG8hc3RyaW5nKEUuaW5pdCkpIDogc3RyaW5nKSkgeworICAgICAgcmV0dXJuICJ7IiB+IHRvIXN0cmluZyhqb2luZXIobWFwIWB0byFzdHJpbmcoYSlgKGFhXy5rZXlzKSwgIiwgIikpIH4gIn0iOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDYXN0IHRvIHdvcmsgYXJvdW5kIE9iamVjdCBub3QgYmVpbmcgY29uc3QtY29ycmVjdC4KKyAgICAgIHJldHVybiAoY2FzdCgpc3VwZXIpLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgLy8vCisgIG92ZXJyaWRlIGJvb2wgb3BFcXVhbHMoT2JqZWN0IG90aGVyKSBjb25zdCB7CisgICAgYXV0byByaHMgPSBjYXN0KGNvbnN0KEhhc2hTZXQpKW90aGVyOworICAgIGlmIChyaHMpIHsKKyAgICAgIHJldHVybiBhYV8gPT0gcmhzLmFhXzsKKyAgICB9CisKKyAgICAvLyBDYXN0IHRvIHdvcmsgYXJvdW5kIE9iamVjdCBub3QgYmVpbmcgY29uc3QtY29ycmVjdC4KKyAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CisgIH0KKworcHJpdmF0ZToKKyAgVm9pZFtpbW11dGFibGUoRSldIGFhXzsKK30KKworLy8vIERpdHRvCithdXRvIGhhc2hTZXQoRSkoRVtdIGVsZW1zLi4uKSB7CisgIHJldHVybiBuZXcgSGFzaFNldCFFKGVsZW1zKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKworICBhdXRvIGEgPSBoYXNoU2V0KDEsIDIsIDIsIDMpOworICBlbmZvcmNlKGEubGVuZ3RoID09IDMpOworICBlbmZvcmNlKDIgaW4gYSk7CisgIGVuZm9yY2UoNSAhaW4gYSk7CisgIGVuZm9yY2UoYS50b1N0cmluZygpLmxlbmd0aCA9PSA5KTsKKyAgYS5yZW1vdmUoMik7CisgIGVuZm9yY2UoYS5sZW5ndGggPT0gMik7CisgIGVuZm9yY2UoMiAhaW4gYSk7CisgIGEucmVtb3ZlQWxsKCk7CisgIGVuZm9yY2UoYS5lbXB0eSk7CisgIGVuZm9yY2UoYS50b1N0cmluZygpID09ICJ7fSIpOworCisgIHZvaWQgZGVsZWdhdGUoKSBkZzsKKyAgYXV0byBiID0gaGFzaFNldChkZyk7CisgIHN0YXRpYyBhc3NlcnQoX190cmFpdHMoY29tcGlsZXMsIGIudG9TdHJpbmcoKSkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2I2YTZmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCisKKworIyBUaHJpZnQgY29tcGlsZXIgcnVsZXMKKworZGVidWdfcHJvdG9fZ2VuID0gJChhZGRwcmVmaXggZ2VuLWQvLCBEZWJ1Z1Byb3RvVGVzdF90eXBlcy5kKQorCiskKGRlYnVnX3Byb3RvX2dlbik6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZCAtbm93YXJuICQ8CisKK3N0cmVzc190ZXN0X2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kL3RocmlmdC90ZXN0L3N0cmVzcy8sIFNlcnZpY2UuZCBcCisJU3RyZXNzVGVzdF90eXBlcy5kKQorCiskKHN0cmVzc190ZXN0X2dlbik6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkICQ8CisKK3RocmlmdF90ZXN0X2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kL3RocmlmdC90ZXN0LywgU2Vjb25kU2VydmljZS5kIFwKKwlUaHJpZnRUZXN0LmQgVGhyaWZ0VGVzdF9jb25zdGFudHMuZCBUaHJpZnRUZXN0X3R5cGVzLmQpCisKKyQodGhyaWZ0X3Rlc3RfZ2VuKTogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGQgJDwKKworCisjIFRoZSBhY3R1YWwgdGVzdCB0YXJnZXRzLgorIyBUaGVyZSBqdXN0IG11c3QgYmUgc29tZSB3YXkgdG8gcmVhc3NpZ24gYSB2YXJpYWJsZSB3aXRob3V0IHdhcm5pbmdzIGluCisjIEF1dG9tYWtlLi4uCit0YXJnZXRzX18gPSBhc3luY190ZXN0IGNsaWVudF9wb29sX3Rlc3Qgc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsgXAorCXN0cmVzc190ZXN0X3NlcnZlciB0aHJpZnRfdGVzdF9jbGllbnQgdGhyaWZ0X3Rlc3Rfc2VydmVyIHRyYW5zcG9ydF90ZXN0CityYW5fdGVzdHNfXyA9IGNsaWVudF9wb29sX3Rlc3QgXAorCXRyYW5zcG9ydF90ZXN0IFwKKwlhc3luY190ZXN0X3J1bm5lci5zaCBcCisJdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisKK2xpYmV2ZW50X2RlcGVuZGVudF90YXJnZXRzID0gYXN5bmNfdGVzdF9jbGllbnQgY2xpZW50X3Bvb2xfdGVzdCBcCisJc3RyZXNzX3Rlc3Rfc2VydmVyIHRocmlmdF90ZXN0X3NlcnZlcgorbGliZXZlbnRfZGVwZW5kZW50X3Jhbl90ZXN0cyA9IGNsaWVudF9wb29sX3Rlc3QgYXN5bmNfdGVzdF9ydW5uZXIuc2ggdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisKK29wZW5zc2xfZGVwZW5kZW50X3RhcmdldHMgPSBhc3luY190ZXN0IHRocmlmdF90ZXN0X2NsaWVudCB0aHJpZnRfdGVzdF9zZXJ2ZXIKK29wZW5zc2xfZGVwZW5kZW50X3Jhbl90ZXN0cyA9IGFzeW5jX3Rlc3RfcnVubmVyLnNoIHRocmlmdF90ZXN0X3J1bm5lci5zaAorCitkX3Rlc3RfZmxhZ3MgPQorCitpZiBXSVRIX0RfRVZFTlRfVEVTVFMKK2RfdGVzdF9mbGFncyArPSAkKERNRF9MSUJFVkVOVF9GTEFHUykgLi4vJChEX0VWRU5UX0xJQl9OQU1FKQordGFyZ2V0c18gPSAkKHRhcmdldHNfXykKK3Jhbl90ZXN0c18gPSAkKHJhbl90ZXN0c19fKQorZWxzZQordGFyZ2V0c18gPSAkKGZpbHRlci1vdXQgJChsaWJldmVudF9kZXBlbmRlbnRfdGFyZ2V0cyksICQodGFyZ2V0c19fKSkKK3Jhbl90ZXN0c18gPSAkKGZpbHRlci1vdXQgJChsaWJldmVudF9kZXBlbmRlbnRfcmFuX3Rlc3RzKSwgJChyYW5fdGVzdHNfXykpCitlbmRpZgorCitpZiBXSVRIX0RfU1NMX1RFU1RTCitkX3Rlc3RfZmxhZ3MgKz0gJChETURfT1BFTlNTTF9GTEFHUykgLi4vJChEX1NTTF9MSUJfTkFNRSkKK3RhcmdldHMgPSAkKHRhcmdldHNfKQorcmFuX3Rlc3RzID0gJChyYW5fdGVzdHNfKQorZWxzZQordGFyZ2V0cyA9ICQoZmlsdGVyLW91dCAkKG9wZW5zc2xfZGVwZW5kZW50X3RhcmdldHMpLCAkKHRhcmdldHNfKSkKK3Jhbl90ZXN0cyA9ICQoZmlsdGVyLW91dCAkKG9wZW5zc2xfZGVwZW5kZW50X3Jhbl90ZXN0cyksICQocmFuX3Rlc3RzXykpCitlbmRpZgorCitkX3Rlc3RfZmxhZ3MgKz0gLXcgLXdpIC1PIC1yZWxlYXNlIC1pbmxpbmUgLUkkKHRvcF9zcmNkaXIpL2xpYi9kL3NyYyAtSWdlbi1kIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2QvJChEX0xJQl9OQU1FKQorCisKK2FzeW5jX3Rlc3QgY2xpZW50X3Bvb2xfdGVzdCB0cmFuc3BvcnRfdGVzdDogJTogJS5kCisJJChETUQpICQoZF90ZXN0X2ZsYWdzKSAtb2YkQCAkXgorCitzZXJpYWxpemF0aW9uX2JlbmNobWFyazogJTogJS5kICQoZGVidWdfcHJvdG9fZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKworc3RyZXNzX3Rlc3Rfc2VydmVyOiAlOiAlLmQgdGVzdF91dGlscy5kICQoc3RyZXNzX3Rlc3RfZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKwordGhyaWZ0X3Rlc3RfY2xpZW50OiAlOiAlLmQgdGhyaWZ0X3Rlc3RfY29tbW9uLmQgJCh0aHJpZnRfdGVzdF9nZW4pCisJJChETUQpICQoZF90ZXN0X2ZsYWdzKSAtb2YkQCAkXgorCit0aHJpZnRfdGVzdF9zZXJ2ZXI6ICU6ICUuZCB0aHJpZnRfdGVzdF9jb21tb24uZCB0ZXN0X3V0aWxzLmQgJCh0aHJpZnRfdGVzdF9nZW4pCisJJChETUQpICQoZF90ZXN0X2ZsYWdzKSAtb2YkQCAkXgorCisKKyMgQ2VydGlmaWNhdGUgZ2VuZXJhdGlvbiB0YXJnZXRzIChmb3IgdGhlIFNTTCB0ZXN0cykuCisjIEN1cnJlbnRseSwgd2UganVzdCBhc3N1bWUgdGhhdCB0aGUgIm9wZW5zc2wiIHRvb2wgaXMgb24gdGhlIHBhdGgsIGNvdWxkIGJlCisjIHJlcGxhY2VkIGJ5IGEgbW9yZSBlbGFib3JhdGUgbWVjaGFuaXNtLgorCitzZXJ2ZXItY2VydGlmaWNhdGUucGVtOiBvcGVuc3NsLnRlc3QuY25mCisJb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtbm9kZXMgLWNvbmZpZyBvcGVuc3NsLnRlc3QuY25mIFwKKwkJLW91dCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCisKK3RydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtOiBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCisJY2F0IHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0gPiAkQAorCitjaGVjay1sb2NhbDogJCh0YXJnZXRzKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWQgJCh0YXJnZXRzKSAkKGFkZHN1ZmZpeCAubywgJCh0YXJnZXRzKSkKKworCisjIFRlc3RzIHJhbiBhcyBwYXJ0IG9mIG1ha2UgY2hlY2suCisKK2FzeW5jX3Rlc3RfcnVubmVyLnNoOiBhc3luY190ZXN0IHRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KK3RocmlmdF90ZXN0X3J1bm5lci5zaDogdGhyaWZ0X3Rlc3RfY2xpZW50IHRocmlmdF90ZXN0X3NlcnZlciBcCisJdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCitURVNUUyA9ICQocmFuX3Rlc3RzKQorCitwcmVjcm9zczogJCh0YXJnZXRzKQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9hc3luY190ZXN0LmQgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjc2NWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9hc3luY190ZXN0LmQKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgZW5mb3JjZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBhc3luY190ZXN0OworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbiA6IENvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXggOiBNdXRleDsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IGR1ciwgVGhyZWFkLCBUaHJlYWRHcm91cDsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQ7CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGNvbGxlY3RFeGNlcHRpb24sIGVuZm9yY2U7CitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtIDogVGFza1Bvb2w7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5saWJldmVudDsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc29ja2V0OworaW1wb3J0IHRocmlmdC5hc3luYy5zc2w7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudF9wb29sOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCit2ZXJzaW9uIChQb3NpeCkgeworICBpbXBvcnQgY29yZS5zdGRjLnNpZ25hbDsKKyAgaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnNpZ25hbDsKKworICAvLyBEaXNhYmxlIFNJR1BJUEUgYmVjYXVzZSBTU0wgc2VydmVyIHdpbGwgd3JpdGUgdG8gYnJva2VuIHNvY2tldCBhZnRlcgorICAvLyBjbGllbnQgZGlzY29ubmVjdGVkIChzZWUgVFNTTFNvY2tldCBkb2NzKS4KKyAgc2hhcmVkIHN0YXRpYyB0aGlzKCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgfQorfQorCitpbnRlcmZhY2UgQXN5bmNUZXN0IHsKKyAgc3RyaW5nIGVjaG8oc3RyaW5nIHZhbHVlKTsKKyAgc3RyaW5nIGRlbGF5ZWRFY2hvKHN0cmluZyB2YWx1ZSwgbG9uZyBtaWxsaXNlY29uZHMpOworCisgIHZvaWQgZmFpbChzdHJpbmcgcmVhc29uKTsKKyAgdm9pZCBkZWxheWVkRmFpbChzdHJpbmcgcmVhc29uLCBsb25nIG1pbGxpc2Vjb25kcyk7CisKKyAgZW51bSBtZXRob2RNZXRhID0gWworICAgIFRNZXRob2RNZXRhKCJmYWlsIiwgW10sIFtURXhjZXB0aW9uTWV0YSgiYXRlIiwgMSwgIkFzeW5jVGVzdEV4Y2VwdGlvbiIpXSksCisgICAgVE1ldGhvZE1ldGEoImRlbGF5ZWRGYWlsIiwgW10sIFtURXhjZXB0aW9uTWV0YSgiYXRlIiwgMSwgIkFzeW5jVGVzdEV4Y2VwdGlvbiIpXSkKKyAgXTsKKyAgYWxpYXMgLkFzeW5jVGVzdEV4Y2VwdGlvbiBBc3luY1Rlc3RFeGNlcHRpb247Cit9CisKK2NsYXNzIEFzeW5jVGVzdEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICBzdHJpbmcgcmVhc29uOworICBtaXhpbiBUU3RydWN0SGVscGVycyEoKTsKK30KKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgdXNob3J0IHBvcnQgPSA5MDkwOworICB1c2hvcnQgbWFuYWdlckNvdW50ID0gMjsKKyAgdXNob3J0IHNlcnZlcnNQZXJNYW5hZ2VyID0gNTsKKyAgdXNob3J0IHRocmVhZHNQZXJTZXJ2ZXIgPSAxMDsKKyAgdWludCBpdGVyYXRpb25zID0gMTA7CisgIGJvb2wgc3NsOworICBib29sIHRyYWNlOworCisgIGdldG9wdChhcmdzLAorICAgICJpdGVyYXRpb25zIiwgJml0ZXJhdGlvbnMsCisgICAgIm1hbmFnZXJzIiwgJm1hbmFnZXJDb3VudCwKKyAgICAicG9ydCIsICZwb3J0LAorICAgICJzZXJ2ZXJzLXBlci1tYW5hZ2VyIiwgJnNlcnZlcnNQZXJNYW5hZ2VyLAorICAgICJzc2wiLCAmc3NsLAorICAgICJ0aHJlYWRzLXBlci1zZXJ2ZXIiLCAmdGhyZWFkc1BlclNlcnZlciwKKyAgICAidHJhY2UiLCAmdHJhY2UsCisgICk7CisKKyAgVFRyYW5zcG9ydEZhY3RvcnkgY2xpZW50VHJhbnNwb3J0RmFjdG9yeTsKKyAgVFNTTENvbnRleHQgc2VydmVyU1NMQ29udGV4dDsKKyAgaWYgKHNzbCkgeworICAgIGF1dG8gY2xpZW50U1NMQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHdpdGggKGNsaWVudFNTTENvbnRleHQpIHsKKyAgICAgIGNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICAgIGF1dGhlbnRpY2F0ZSA9IHRydWU7CisgICAgICBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygiLi90cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSIpOworICAgIH0KKyAgICBjbGllbnRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRBc3luY1NTTFNvY2tldEZhY3RvcnkoY2xpZW50U1NMQ29udGV4dCk7CisKKyAgICBzZXJ2ZXJTU0xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CisgICAgd2l0aCAoc2VydmVyU1NMQ29udGV4dCkgeworICAgICAgc2VydmVyU2lkZSA9IHRydWU7CisgICAgICBsb2FkQ2VydGlmaWNhdGUoIi4vc2VydmVyLWNlcnRpZmljYXRlLnBlbSIpOworICAgICAgbG9hZFByaXZhdGVLZXkoIi4vc2VydmVyLXByaXZhdGUta2V5LnBlbSIpOworICAgICAgY2lwaGVycyA9ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjbGllbnRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisgIH0KKworCisgIGF1dG8gc2VydmVyQ2FuY2VsID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisgIHNjb3BlKGV4aXQpIHsKKyAgICB3cml0ZWxuKCJUcmlnZ2VyaW5nIHNlcnZlciBzaHV0ZG93bi4uLiIpOworICAgIHNlcnZlckNhbmNlbC50cmlnZ2VyKCk7CisgICAgd3JpdGVsbigiZG9uZS4iKTsKKyAgfQorCisgIGF1dG8gbWFuYWdlcnMgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyW21hbmFnZXJDb3VudF07CisgIHNjb3BlIChleGl0KSBmb3JlYWNoIChyZWYgbTsgbWFuYWdlcnMpIGRlc3Ryb3kobSk7CisKKyAgYXV0byBjbGllbnRzVGhyZWFkcyA9IG5ldyBUaHJlYWRHcm91cDsKKyAgZm9yZWFjaCAobWFuYWdlckluZGV4LCByZWYgbWFuYWdlcjsgbWFuYWdlcnMpIHsKKyAgICBtYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKyAgICBmb3JlYWNoIChzZXJ2ZXJJbmRleDsgMCAuLiBzZXJ2ZXJzUGVyTWFuYWdlcikgeworICAgICAgYXV0byBjdXJyZW50UG9ydCA9IGNhc3QodXNob3J0KQorICAgICAgICAocG9ydCArIG1hbmFnZXJJbmRleCAqIHNlcnZlcnNQZXJNYW5hZ2VyICsgc2VydmVySW5kZXgpOworCisgICAgICAvLyBTdGFydCB0aGUgc2VydmVyIGFuZCB3YWl0IHVudGlsIGl0IGlzIHVwIGFuZCBydW5uaW5nLgorICAgICAgYXV0byBzZXJ2aW5nTXV0ZXggPSBuZXcgTXV0ZXg7CisgICAgICBhdXRvIHNlcnZpbmdDb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKHNlcnZpbmdNdXRleCk7CisgICAgICBhdXRvIGhhbmRsZXIgPSBuZXcgUHJlU2VydmVOb3RpZnlIYW5kbGVyKHNlcnZpbmdNdXRleCwgc2VydmluZ0NvbmRpdGlvbik7CisgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleCkgeworICAgICAgICAobmV3IFNlcnZlclRocmVhZCFUU2ltcGxlU2VydmVyKGN1cnJlbnRQb3J0LCBzZXJ2ZXJTU0xDb250ZXh0LCB0cmFjZSwKKyAgICAgICAgICBzZXJ2ZXJDYW5jZWwsIGhhbmRsZXIpKS5zdGFydCgpOworICAgICAgICBzZXJ2aW5nQ29uZGl0aW9uLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgLy8gV2Ugb25seSBydW4gdGhlIHRpbWluZyB0ZXN0cyBmb3IgdGhlIGZpcnN0IHNlcnZlciBvbiBlYWNoIGFzeW5jCisgICAgICAvLyBtYW5hZ2VyLCBzbyB0aGF0IHdlIGRvbid0IGdldCBzcHVyaW91cyB0aW1pbmcgZXJyb3JzIGJlY2F1ZSBvZgorICAgICAgLy8gb3JkZXJpbmcgaXNzdWVzLgorICAgICAgYXV0byBydW5UaW1pbmdUZXN0cyA9IChzZXJ2ZXJJbmRleCA9PSAwKTsKKworICAgICAgYXV0byBjID0gbmV3IENsaWVudHNUaHJlYWQobWFuYWdlciwgY3VycmVudFBvcnQsIGNsaWVudFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIHRocmVhZHNQZXJTZXJ2ZXIsIGl0ZXJhdGlvbnMsIHJ1blRpbWluZ1Rlc3RzLCB0cmFjZSk7CisgICAgICBjbGllbnRzVGhyZWFkcy5hZGQoYyk7CisgICAgICBjLnN0YXJ0KCk7CisgICAgfQorICB9CisgIGNsaWVudHNUaHJlYWRzLmpvaW5BbGwoKTsKK30KKworY2xhc3MgQXN5bmNUZXN0SGFuZGxlciA6IEFzeW5jVGVzdCB7CisgIHRoaXMoYm9vbCB0cmFjZSkgeworICAgIHRyYWNlXyA9IHRyYWNlOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIGVjaG8oc3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYGVjaG8oIiVzIilgLCB2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIGRlbGF5ZWRFY2hvKHN0cmluZyB2YWx1ZSwgbG9uZyBtaWxsaXNlY29uZHMpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWYoYGRlbGF5ZWRFY2hvKCIlcyIsICVzIG1zKS4uLiBgLCB2YWx1ZSwgbWlsbGlzZWNvbmRzKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIobWlsbGlzZWNvbmRzKSk7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigicmV0dXJuaW5nLiIpOworCisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmYWlsKHN0cmluZyByZWFzb24pIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgZmFpbCgiJXMiKWAsIHJlYXNvbik7CisgICAgYXV0byBhdGUgPSBuZXcgQXN5bmNUZXN0RXhjZXB0aW9uOworICAgIGF0ZS5yZWFzb24gPSByZWFzb247CisgICAgdGhyb3cgYXRlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBkZWxheWVkRmFpbChzdHJpbmcgcmVhc29uLCBsb25nIG1pbGxpc2Vjb25kcykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZihgZGVsYXllZEZhaWwoIiVzIiwgJXMgbXMpLi4uIGAsIHJlYXNvbiwgbWlsbGlzZWNvbmRzKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIobWlsbGlzZWNvbmRzKSk7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigicmV0dXJuaW5nLiIpOworCisgICAgYXV0byBhdGUgPSBuZXcgQXN5bmNUZXN0RXhjZXB0aW9uOworICAgIGF0ZS5yZWFzb24gPSByZWFzb247CisgICAgdGhyb3cgYXRlOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgdHJhY2VfOworICBBc3luY1Rlc3RFeGNlcHRpb24gYXRlXzsKK30KKworY2xhc3MgUHJlU2VydmVOb3RpZnlIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHRoaXMoTXV0ZXggc2VydmluZ011dGV4LCBDb25kaXRpb24gc2VydmluZ0NvbmRpdGlvbikgeworICAgIHNlcnZpbmdNdXRleF8gPSBzZXJ2aW5nTXV0ZXg7CisgICAgc2VydmluZ0NvbmRpdGlvbl8gPSBzZXJ2aW5nQ29uZGl0aW9uOworICB9CisKKyAgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleF8pIHsKKyAgICAgIHNlcnZpbmdDb25kaXRpb25fLm5vdGlmeUFsbCgpOworICAgIH0KKyAgfQorICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKworcHJpdmF0ZToKKyAgTXV0ZXggc2VydmluZ011dGV4XzsKKyAgQ29uZGl0aW9uIHNlcnZpbmdDb25kaXRpb25fOworfQorCitjbGFzcyBTZXJ2ZXJUaHJlYWQoU2VydmVyVHlwZSkgOiBUaHJlYWQgeworICB0aGlzKHVzaG9ydCBwb3J0LCBUU1NMQ29udGV4dCBzc2xDb250ZXh0LCBib29sIHRyYWNlLAorICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uLCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcgorICApIHsKKyAgICBwb3J0XyA9IHBvcnQ7CisgICAgc3NsQ29udGV4dF8gPSBzc2xDb250ZXh0OworICAgIHRyYWNlXyA9IHRyYWNlOworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKworICAgIHN1cGVyKCZydW4pOworICB9CisKKyAgdm9pZCBydW4oKSB7CisgICAgVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisgICAgaWYgKHNzbENvbnRleHRfKSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0Xywgc3NsQ29udGV4dF8pOworICAgIH0gZWxzZSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0Xyk7CisgICAgfQorICAgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisgICAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhQXN5bmNUZXN0KG5ldyBBc3luY1Rlc3RIYW5kbGVyKHRyYWNlXykpOworCisgICAgYXV0byBzZXJ2ZXIgPSBuZXcgU2VydmVyVHlwZShwcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSk7CisgICAgc2VydmVyLmV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcl87CisKKyAgICB3cml0ZWZsbigiU3RhcnRpbmcgc2VydmVyIG9uIHBvcnQgJXMuLi4iLCBwb3J0Xyk7CisgICAgc2VydmVyLnNlcnZlKGNhbmNlbGxhdGlvbl8pOworICAgIHdyaXRlZmxuKCJTZXJ2ZXIgdGhyZWFkIG9uIHBvcnQgJXMgZG9uZS4iLCBwb3J0Xyk7CisgIH0KKworcHJpdmF0ZToKKyAgdXNob3J0IHBvcnRfOworICBib29sIHRyYWNlXzsKKyAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOworICBUU1NMQ29udGV4dCBzc2xDb250ZXh0XzsKKyAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXJfOworfQorCitjbGFzcyBDbGllbnRzVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUQXN5bmNTb2NrZXRNYW5hZ2VyIG1hbmFnZXIsIHVzaG9ydCBwb3J0LCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwKKyAgICB1c2hvcnQgdGhyZWFkcywgdWludCBpdGVyYXRpb25zLCBib29sIHJ1blRpbWluZ1Rlc3RzLCBib29sIHRyYWNlCisgICkgeworICAgIG1hbmFnZXJfID0gbWFuYWdlcjsKKyAgICBwb3J0XyA9IHBvcnQ7CisgICAgdHJhbnNwb3J0RmFjdG9yeV8gPSB0ZjsKKyAgICB0aHJlYWRzXyA9IHRocmVhZHM7CisgICAgaXRlcmF0aW9uc18gPSBpdGVyYXRpb25zOworICAgIHJ1blRpbWluZ1Rlc3RzXyA9IHJ1blRpbWluZ1Rlc3RzOworICAgIHRyYWNlXyA9IHRyYWNlOworICAgIHN1cGVyKCZydW4pOworICB9CisKKyAgdm9pZCBydW4oKSB7CisgICAgYXV0byB0cmFuc3BvcnQgPSBuZXcgVEFzeW5jU29ja2V0KG1hbmFnZXJfLCAibG9jYWxob3N0IiwgcG9ydF8pOworCisgICAgeworICAgICAgYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IUFzeW5jVGVzdCgKKyAgICAgICAgdHJhbnNwb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5XywKKyAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCkKKyAgICAgICk7CisgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgYXV0byBjbGllbnRUaHJlYWRzID0gbmV3IFRocmVhZEdyb3VwOworICAgICAgZm9yZWFjaCAoY2xpZW50SWQ7IDAgLi4gdGhyZWFkc18pIHsKKyAgICAgICAgY2xpZW50VGhyZWFkcy5jcmVhdGUoeworICAgICAgICAgIGF1dG8gYyA9IGNsaWVudElkOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBmb3JlYWNoIChpOyAwIC4uIGl0ZXJhdGlvbnNfKSB7CisgICAgICAgICAgICAgIGltbXV0YWJsZSBpZCA9IHRleHQocG9ydF8sICI6IiwgYywgIjoiLCBpKTsKKworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZWNobygiJXMiKS4uLiBgLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBhID0gY2xpZW50LmVjaG8oaWQpOworICAgICAgICAgICAgICAgIGVuZm9yY2UoYSA9PSBpZCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYGVjaG8oIiVzIikgZG9uZS5gLCBpZCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZmFpbCgiJXMiKS4uLiBgLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBhID0gY2FzdChBc3luY1Rlc3RFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihjbGllbnQuZmFpbChpZCkud2FpdEdldCgpKTsKKyAgICAgICAgICAgICAgICBlbmZvcmNlKGEgJiYgYS5yZWFzb24gPT0gaWQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBmYWlsKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKTsKKyAgICAgIH0KKyAgICAgIGNsaWVudFRocmVhZHMuam9pbkFsbCgpOworICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfQorCisgICAgaWYgKHJ1blRpbWluZ1Rlc3RzXykgeworICAgICAgYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IUFzeW5jVGVzdCgKKyAgICAgICAgdHJhbnNwb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5XywKKyAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhVEJ1ZmZlcmVkVHJhbnNwb3J0CisgICAgICApOworCisgICAgICAvLyBUZW1wb3JhcmlseSByZWRpcmVjdCBlcnJvciBsb2dzIHRvIHN0ZG91dCwgYXMgU1NMIGVycm9ycyBvbiB0aGUgc2VydmVyCisgICAgICAvLyBzaWRlIGFyZSBleHBlY3RlZCB3aGVuIHRoZSBjbGllbnQgdGVybWluYXRlcyBhYnVycHRseSAoYXMgaXMgdGhlIGNhc2UKKyAgICAgIC8vIGluIHRoZSB0aW1lb3V0IHRlc3QpLgorICAgICAgYXV0byBvbGRFcnJvckxvZ1NpbmsgPSBnX2Vycm9yTG9nU2luazsKKyAgICAgIGdfZXJyb3JMb2dTaW5rID0gZ19pbmZvTG9nU2luazsKKyAgICAgIHNjb3BlIChleGl0KSBnX2Vycm9yTG9nU2luayA9IG9sZEVycm9yTG9nU2luazsKKworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBpdGVyYXRpb25zXykgeworICAgICAgICB0cmFuc3BvcnQub3BlbigpOworCisgICAgICAgIGltbXV0YWJsZSBpZCA9IHRleHQocG9ydF8sICI6IiwgaSk7CisKKyAgICAgICAgeworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGRlbGF5ZWRFY2hvKCIlcyIsIDEwMCBtcykuLi5gLCBpZCk7CisgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRFY2hvKGlkLCAxMDApOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgYS5nZXQoKSwgIiwgIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGEuY29tcGxldGlvbi53YWl0KGR1ciEibXNlY3MiKDIwMCkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIGRpZG4ndCBzdWNjZWVkIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoYS5nZXQoKSA9PSBpZCk7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYC4uLiBkZWxheWVkRWNobygiJXMiKSBkb25lLmAsIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBkZWxheWVkRmFpbCgiJXMiLCAxMDAgbXMpLi4uIGAsIGlkKTsKKyAgICAgICAgICBhdXRvIGEgPSBjbGllbnQuZGVsYXllZEZhaWwoaWQsIDEwMCk7CisgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBpZCwgIiwgIiwgY29sbGVjdEV4Y2VwdGlvbihhLmdldCgpKSwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoYS5jb21wbGV0aW9uLndhaXQoZHVyISJtc2VjcyIoMjAwKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgZGlkbid0IHN1Y2NlZWQgYXMgZXhwZWN0ZWQgKCIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgYXV0byBlID0gY2FzdChBc3luY1Rlc3RFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihhLmdldCgpKTsKKyAgICAgICAgICBlbmZvcmNlKGUgJiYgZS5yZWFzb24gPT0gaWQpOworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGAuLi4gZGVsYXllZEZhaWwoIiVzIikgZG9uZS5gLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgdHJhbnNwb3J0LnJlY3ZUaW1lb3V0ID0gZHVyISJtc2VjcyIoNTApOworCisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGUoYENhbGxpbmcgZGVsYXllZEVjaG8oInNvY2tldFRpbWVvdXQiLCAxMDAgbXMpLi4uIGApOworICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRWNobygic29ja2V0VGltZW91dCIsIDEwMCk7CisgICAgICAgICAgYXV0byBlID0gY2FzdChUVHJhbnNwb3J0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oYS53YWl0R2V0KCkpOworICAgICAgICAgIGVuZm9yY2UoZSwgdGV4dCgiT3BlcmF0aW9uIGRpZG4ndCBmYWlsIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoZS50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5USU1FRF9PVVQsCisgICAgICAgICAgICB0ZXh0KCJXcm9uZyB0aW1lb3V0IGV4Y2VwdGlvbiB0eXBlICgiLCBpZCwgIik6ICIsIGUpKTsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWxuKGB0aW1lZCBvdXQgYXMgZXhwZWN0ZWQuYCk7CisKKyAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBzZXJ2ZXIgdGhyZWFkIHJlc2V0IGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDUwKSk7CisgICAgICAgICAgdHJhbnNwb3J0LnJlY3ZUaW1lb3V0ID0gZHVyISJobnNlY3MiKDApOworICAgICAgICB9CisKKyAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICB9CisgICAgfQorCisgICAgd3JpdGVmbG4oIkNsaWVudHMgdGhyZWFkIGZvciBwb3J0ICVzIGRvbmUuIiwgcG9ydF8pOworICB9CisKKyAgVEFzeW5jU29ja2V0TWFuYWdlciBtYW5hZ2VyXzsKKyAgdXNob3J0IHBvcnRfOworICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgdXNob3J0IHRocmVhZHNfOworICB1aW50IGl0ZXJhdGlvbnNfOworICBib29sIHJ1blRpbWluZ1Rlc3RzXzsKKyAgYm9vbCB0cmFjZV87Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDUwN2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKKyMgUnVucyB0aGUgYXN5bmMgdGVzdCBpbiBib3RoIFNTTCBhbmQgbm9uLVNTTCBtb2RlLgorJHtDVVJ9L2FzeW5jX3Rlc3QgPiAvZGV2L251bGwgfHwgZXhpdCAxCitlY2hvICJOb24tU1NMIHRlc3RzIGRvbmUuIgorJHtDVVJ9L2FzeW5jX3Rlc3QgLS1zc2wgPiAvZGV2L251bGwgfHwgZXhpdCAxCitlY2hvICJTU0wgdGVzdHMgZG9uZS4iCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGM5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZApAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIGNsaWVudF9wb29sX3Rlc3Q7CisKK2ltcG9ydCBjb3JlLnN5bmMuc2VtYXBob3JlIDogU2VtYXBob3JlOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgc3RkLmFsZ29yaXRobTsKK2ltcG9ydCBzdGQuYXJyYXk7CitpbXBvcnQgc3RkLmNvbnY7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnR5cGVjb25zOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnRfcG9vbDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50X3Bvb2w7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuZnV0dXJlOworCisvLyBXZSB1c2UgdGhpcyBhcyBvdXIgUlBDLWxheWVyIGV4Y2VwdGlvbiBoZXJlIHRvIG1ha2Ugc3VyZSBzb2NrZXQv4oCmIHByb2JsZW1zCisvLyAodGhhdCB3b3VsZCB1c3VhbGx5IGNvbnNpZGVyZWQgdG8gYmUgUlBDIGxheWVyIGZhdWx0cykgY2F1c2UgdGhlIHRlc3RzIHRvCisvLyBmYWlsLCBldmVuIHRob3VnaCB3ZSBhcmUgdGVzdGluZyB0aGUgUlBDIGV4Y2VwdGlvbiBoYW5kbGluZy4KK2NsYXNzIFRlc3RTZXJ2aWNlRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIGludCBwb3J0OworfQorCitpbnRlcmZhY2UgVGVzdFNlcnZpY2UgeworICBpbnQgZ2V0UG9ydCgpOworICBhbGlhcyAuVGVzdFNlcnZpY2VFeGNlcHRpb24gVGVzdFNlcnZpY2VFeGNlcHRpb247CisgIGVudW0gbWV0aG9kTWV0YSA9IFtUTWV0aG9kTWV0YSgiZ2V0UG9ydCIsIFtdLAorICAgIFtURXhjZXB0aW9uTWV0YSgiYSIsIDEsICJUZXN0U2VydmljZUV4Y2VwdGlvbiIpXSldOworfQorCisvLyBVc2Ugc29tZSBkZXJpdmVkIHNlcnZpY2UsIGp1c3QgdG8gY2hlY2sgdGhhdCB0aGUgcG9vbHMgaGFuZGxlIGluaGVyaXRhbmNlCisvLyBjb3JyZWN0bHkuCitpbnRlcmZhY2UgRXhUZXN0U2VydmljZSA6IFRlc3RTZXJ2aWNlIHsKKyAgaW50W10gZ2V0UG9ydEluQXJyYXkoKTsKKyAgZW51bSBtZXRob2RNZXRhID0gW1RNZXRob2RNZXRhKCJnZXRQb3J0SW5BcnJheSIsIFtdLAorICAgIFtURXhjZXB0aW9uTWV0YSgiYSIsIDEsICJUZXN0U2VydmljZUV4Y2VwdGlvbiIpXSldOworfQorCitjbGFzcyBFeFRlc3RIYW5kbGVyIDogRXhUZXN0U2VydmljZSB7CisgIHRoaXModXNob3J0IHBvcnQsIER1cmF0aW9uIGRlbGF5LCBib29sIGZhaWxpbmcsIGJvb2wgdHJhY2UpIHsKKyAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKKyAgICB0aGlzLmZhaWxpbmcgPSBmYWlsaW5nOworICAgIHRoaXMudHJhY2UgPSB0cmFjZTsKKyAgfQorCisgIG92ZXJyaWRlIGludCBnZXRQb3J0KCkgeworICAgIGlmICh0cmFjZSkgeworICAgICAgc3RkZXJyLndyaXRlZmxuKCJnZXRQb3J0KCkgY2FsbGVkIG9uICVzIChkZWxheTogJXMsIGZhaWxpbmc6ICVzKSIsIHBvcnQsCisgICAgICAgIGRlbGF5LCBmYWlsaW5nKTsKKyAgICB9CisgICAgc2xlZXAoKTsKKyAgICBmYWlsSWZFbmFibGVkKCk7CisgICAgcmV0dXJuIHBvcnQ7CisgIH0KKworICBvdmVycmlkZSBpbnRbXSBnZXRQb3J0SW5BcnJheSgpIHsKKyAgICByZXR1cm4gW2dldFBvcnQoKV07CisgIH0KKworICB1c2hvcnQgcG9ydDsKKyAgRHVyYXRpb24gZGVsYXk7CisgIGJvb2wgZmFpbGluZzsKKyAgYm9vbCB0cmFjZTsKKworcHJpdmF0ZToKKyAgdm9pZCBzbGVlcCgpIHsKKyAgICBpZiAoZGVsYXkgPiBkdXIhImhuc2VjcyIoMCkpIFRocmVhZC5zbGVlcChkZWxheSk7CisgIH0KKworICB2b2lkIGZhaWxJZkVuYWJsZWQoKSB7CisgICAgaWYgKCFmYWlsaW5nKSByZXR1cm47CisKKyAgICBhdXRvIGUgPSBuZXcgVGVzdFNlcnZpY2VFeGNlcHRpb247CisgICAgZS5wb3J0ID0gcG9ydDsKKyAgICB0aHJvdyBlOworICB9Cit9CisKK2NsYXNzIFNlcnZlclByZVNlcnZlSGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICB0aGlzKFNlbWFwaG9yZSBzZW0pIHsKKyAgICBzZW1fID0gc2VtOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBzZW1fLm5vdGlmeSgpOworICB9CisKKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeyByZXR1cm4gVmFyaWFudC5pbml0OyB9CisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkge30KKyAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisKK3ByaXZhdGU6CisgIFNlbWFwaG9yZSBzZW1fOworfQorCitjbGFzcyBTZXJ2ZXJUaHJlYWQgOiBUaHJlYWQgeworICB0aGlzKEV4VGVzdEhhbmRsZXIgaGFuZGxlciwgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXIsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uKSB7CisgICAgc3VwZXIoJnJ1bik7CisgICAgaGFuZGxlcl8gPSBoYW5kbGVyOworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc2VydmVySGFuZGxlcl8gPSBzZXJ2ZXJIYW5kbGVyOworICB9Citwcml2YXRlOgorICB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIUV4VGVzdFNlcnZpY2UoaGFuZGxlcl8pOworICAgICAgYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldChoYW5kbGVyXy5wb3J0KTsKKyAgICAgIHNlcnZlclRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEic2Vjb25kcyIoMyk7CisgICAgICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKworICAgICAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBzZXJ2ZXJIYW5kbGVyXzsKKyAgICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgd3JpdGVmbG4oIlNlcnZlciB0aHJlYWQgb24gcG9ydCAlcyBmYWlsZWQ6ICVzIiwgaGFuZGxlcl8ucG9ydCwgZSk7CisgICAgfQorICB9CisKKyAgRXhUZXN0SGFuZGxlciBoYW5kbGVyXzsKKyAgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXJfOworICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbl87Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIGJvb2wgdHJhY2U7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgZ2V0b3B0KGFyZ3MsICJwb3J0IiwgJnBvcnQsICJ0cmFjZSIsICZ0cmFjZSk7CisKKyAgYXV0byBzZXJ2ZXJDYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKyAgc2NvcGUgKGV4aXQpIHNlcnZlckNhbmNlbGxhdGlvbi50cmlnZ2VyKCk7CisKKyAgaW1tdXRhYmxlIHBvcnRzID0gY2FzdChpbW11dGFibGUpYXJyYXkobWFwISJjYXN0KHVzaG9ydClhIihpb3RhKHBvcnQsIHBvcnQgKyA2KSkpOworCisgIC8vIHNlbWFwaG9yZSB0aGF0IHdpbGwgYmUgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgZWFjaCBzZXJ2ZXIgdGhyZWFkIGhhcyBib3VuZCBhbmQgc3RhcnRlZCBsaXN0ZW5pbmcKKyAgU2VtYXBob3JlIHNlbSA9IG5ldyBTZW1hcGhvcmUoMCk7CisKK3ZlcnNpb24gKG5vbmUpIHsKKyAgLy8gQ2Fubm90IHVzZSB0aGlzIGR1ZSB0byBtdWx0aXBsZSBETUQgQEBCVUdAQHM6CisgIC8vIDEuIMK7ZnVuY3Rpb24gRCBtYWluIGlzIGEgbmVzdGVkIGZ1bmN0aW9uIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSBhcnJhecKrCisgIC8vICAgIHdoZW4gY2FsbGluZyBhcnJheSgpIG9uIHRoZSByZXN1bHQgb2YgdGhlIG91dGVyIG1hcCgpIOKAkyB3b3VsZCBoYXZlIHRvCisgIC8vICAgIG1hbnVhbGx5IGRvIHRoZSBlYWdlciBldmFsdWF0aW9uL2FycmF5IGNvbnZlcnNpb24uCisgIC8vIDIuIMK7WmlwLm9wU2xpY2UgY2Fubm90IGdldCBmcmFtZSBwb2ludGVyIHRvIG1hcMKrIGZvciB0aGUgZGVsYXkgYXJndW1lbnQsCisgIC8vICAgIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGJ5IGNhbGxpbmcgYXJyYXkoKSBvbiB0aGUgbWFwIHJlc3VsdCBmaXJzdC4KKyAgLy8gMy4gRXZlbiB3aGVuIHVzaW5nIHRoZSB3b3JrYXJvdW5kcyBmb3IgdGhlIGxhc3QgdHdvIHBvaW50cywgdGhlIERNRC1idWlsdAorICAvLyAgICBleGVjdXRhYmxlIGNyYXNoZXMgd2hlbiBidWlsZGluZyB3aXRob3V0IChzaWMhKSBpbmxpbmluZyBlbmFibGVkLAorICAvLyAgICB0aGUgYmFja3RyYWNlIHBvaW50cyBpbnRvIHRoZSBmaXJzdCBkZWxlZ2F0ZSBsaXRlcmFsLgorICBhdXRvIGhhbmRsZXJzID0gYXJyYXkobWFwISgoYXJncyl7CisgICAgcmV0dXJuIG5ldyBFeFRlc3RIYW5kbGVyKGFyZ3MuXzAsIGFyZ3MuXzEsIGFyZ3MuXzIsIHRyYWNlKTsKKyAgfSkoemlwKAorICAgIHBvcnRzLAorICAgIG1hcCEoKGEpeyByZXR1cm4gZHVyIWBtc2Vjc2AoYSk7IH0pKFsxLCAxMCwgMTAwLCAxLCAxMCwgMTAwXSksCisgICAgW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWVdCisgICkpKTsKK30gZWxzZSB7CisgIGF1dG8gaGFuZGxlcnMgPSBbCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyAwKSwgZHVyISJtc2VjcyIoMSksIGZhbHNlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyAxKSwgZHVyISJtc2VjcyIoMTApLCBmYWxzZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMiksIGR1ciEibXNlY3MiKDEwMCksIGZhbHNlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyAzKSwgZHVyISJtc2VjcyIoMSksIHRydWUsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDQpLCBkdXIhIm1zZWNzIigxMCksIHRydWUsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDUpLCBkdXIhIm1zZWNzIigxMDApLCB0cnVlLCB0cmFjZSkKKyAgXTsKK30KKworICAvLyBGaXJlIHVwIHRoZSBzZXJ2ZXIgdGhyZWFkcy4KKyAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChuZXcgU2VydmVyVGhyZWFkKGgsIG5ldyBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIoc2VtKSwgc2VydmVyQ2FuY2VsbGF0aW9uKSkuc3RhcnQoKTsKKworICAvLyB3YWl0IHVudGlsIGFsbCB0aGUgaGFuZGxlcnMgc2lnbmFsIHRoYXQgdGhleSdyZSByZWFkeSB0byBzZXJ2ZQorICBmb3JlYWNoIChoOyBoYW5kbGVycykgKHNlbS53YWl0KGR1ciFgc2Vjb25kc2AoMSkpKTsKKworICBzeW5jQ2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKKyAgYXN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOworICBhc3luY0Zhc3Rlc3RDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOworICBhc3luY0FnZ3JlZ2F0b3JUZXN0KHBvcnRzLCBoYW5kbGVycyk7Cit9CisKKwordm9pZCBzeW5jQ2xpZW50UG9vbFRlc3QoY29uc3QodXNob3J0KVtdIHBvcnRzLCBFeFRlc3RIYW5kbGVyW10gaGFuZGxlcnMpIHsKKyAgYXV0byBjbGllbnRzID0gYXJyYXkobWFwISgoYSl7CisgICAgcmV0dXJuIGNhc3QoVENsaWVudEJhc2UhRXhUZXN0U2VydmljZSl0Q2xpZW50IUV4VGVzdFNlcnZpY2UoCisgICAgICB0QmluYXJ5UHJvdG9jb2wobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIGEpKQorICAgICk7CisgIH0pKHBvcnRzKSk7CisKKyAgc2NvcGUoZXhpdCkgZm9yZWFjaCAoYzsgY2xpZW50cykgYy5vdXRwdXRQcm90b2NvbC50cmFuc3BvcnQuY2xvc2UoKTsKKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudCBzdWNjZWVkcy4KKyAgeworICAgIGVuZm9yY2UobWFrZVBvb2woY2xpZW50cykuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSBhbGwgY2xpZW50cyBmYWlsLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZVBvb2woY2xpZW50c1szIC4uICRdKTsKKyAgICBhdXRvIGUgPSBjYXN0KFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHBvb2wuZ2V0UG9ydCgpKTsKKyAgICBlbmZvcmNlKGUpOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSllLmV4Y2VwdGlvbnMpLAorICAgICAgcG9ydHNbMyAuLiAkXSkpOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnRzIGZhaWwsIGJ1dCBhIGxhdGVyIG9uZSBzdWNjZWVkcy4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VQb29sKGNsaWVudHNbMyAuLiAkXSB+IGNsaWVudHNbMCAuLiAzXSk7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnRJbkFycmF5KCkgPT0gW3BvcnRzWzBdXSk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgYSBjbGllbnQgaXMgcHJvcGVybHkgZGVhY3RpdmF0ZWQgd2hlbiBpdCBoYXMgZmFpbGVkIHRvbyBvZnRlbi4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VQb29sKGNsaWVudHMpOworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAxOworICAgIHBvb2wuZmF1bHREaXNhYmxlRHVyYXRpb24gPSBkdXIhIm1zZWNzIig1MCk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gdHJ1ZTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzFdKTsKKworICAgIGhhbmRsZXJzWzBdLmZhaWxpbmcgPSBmYWxzZTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzFdKTsKKworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1MCkpOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMF0pOworICB9Cit9CisKK2F1dG8gbWFrZVBvb2woVENsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdIGNsaWVudHMpIHsKKyAgYXV0byBwID0gdENsaWVudFBvb2woY2xpZW50cyk7CisgIHAucGVybXV0ZUNsaWVudHMgPSBmYWxzZTsKKyAgcC5ycGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgIHJldHVybiAoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbillICFpcyBudWxsKTsKKyAgfTsKKyAgcmV0dXJuIHA7Cit9CisKKwordm9pZCBhc3luY0NsaWVudFBvb2xUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgIHNjb3BlIChleGl0KSBtYW5hZ2VyLnN0b3AoZHVyISJobnNlY3MiKDApKTsKKworICBhdXRvIGNsaWVudHMgPSBtYWtlQXN5bmNDbGllbnRzKG1hbmFnZXIsIHBvcnRzKTsKKyAgc2NvcGUoZXhpdCkgZm9yZWFjaCAoYzsgY2xpZW50cykgYy50cmFuc3BvcnQuY2xvc2UoKTsKKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudCBzdWNjZWVkcy4KKyAgeworICAgIGVuZm9yY2UobWFrZUFzeW5jUG9vbChjbGllbnRzKS5nZXRQb3J0KCkgPT0gcG9ydHNbMF0pOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIGFsbCBjbGllbnRzIGZhaWwuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlQXN5bmNQb29sKGNsaWVudHNbMyAuLiAkXSk7CisgICAgYXV0byBlID0gY2FzdChUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwb29sLmdldFBvcnQoKS53YWl0R2V0KCkpOworICAgIGVuZm9yY2UoZSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKWUuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICRdKSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudHMgZmFpbCwgYnV0IGEgbGF0ZXIgb25lIHN1Y2NlZWRzLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jUG9vbChjbGllbnRzWzMgLi4gJF0gfiBjbGllbnRzWzAgLi4gM10pOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0SW5BcnJheSgpID09IFtwb3J0c1swXV0pOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGEgY2xpZW50IGlzIHByb3Blcmx5IGRlYWN0aXZhdGVkIHdoZW4gaXQgaGFzIGZhaWxlZCB0b28gb2Z0ZW4uCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlQXN5bmNQb29sKGNsaWVudHMpOworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAxOworICAgIHBvb2wuZmF1bHREaXNhYmxlRHVyYXRpb24gPSBkdXIhIm1zZWNzIig1MCk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gdHJ1ZTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzFdKTsKKworICAgIGhhbmRsZXJzWzBdLmZhaWxpbmcgPSBmYWxzZTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzFdKTsKKworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1MCkpOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMF0pOworICB9Cit9CisKK2F1dG8gbWFrZUFzeW5jUG9vbChUQXN5bmNDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzKSB7CisgIGF1dG8gcCA9IHRBc3luY0NsaWVudFBvb2woY2xpZW50cyk7CisgIHAucGVybXV0ZUNsaWVudHMgPSBmYWxzZTsKKyAgcC5ycGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgIHJldHVybiAoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbillICFpcyBudWxsKTsKKyAgfTsKKyAgcmV0dXJuIHA7Cit9CisKK2F1dG8gbWFrZUFzeW5jQ2xpZW50cyhUTGliZXZlbnRBc3luY01hbmFnZXIgbWFuYWdlciwgaW4gdXNob3J0W10gcG9ydHMpIHsKKyAgLy8gRE1EIEBAQlVHQEAgd29ya2Fyb3VuZDogVXNpbmcgYXJyYXkgb24gdGhlIGxhenlIYW5kbGVycyBtYXAgcmVzdWx0IGxlYWRzCisgIC8vIHRvIMK7ZnVuY3Rpb24gRCBtYWluIGlzIGEgbmVzdGVkIGZ1bmN0aW9uIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSBhcnJhecKrLgorICAvLyBUaHVzLCB3ZSBtYW51YWxseSBkbyB0aGUgYXJyYXkgY29udmVyc2lvbi4KKyAgYXV0byBsYXp5Q2xpZW50cyA9IG1hcCEoKGEpeworICAgIHJldHVybiBuZXcgVEFzeW5jQ2xpZW50IUV4VGVzdFNlcnZpY2UoCisgICAgICBuZXcgVEFzeW5jU29ja2V0KG1hbmFnZXIsICIxMjcuMC4wLjEiLCBhKSwKKyAgICAgIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKFRCdWZmZXJlZFRyYW5zcG9ydCkKKyAgICApOworICB9KShwb3J0cyk7CisgIFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdIGNsaWVudHM7CisgIGZvcmVhY2ggKGM7IGxhenlDbGllbnRzKSBjbGllbnRzIH49IGM7CisgIHJldHVybiBjbGllbnRzOworfQorCisKK3ZvaWQgYXN5bmNGYXN0ZXN0Q2xpZW50UG9vbFRlc3QoY29uc3QodXNob3J0KVtdIHBvcnRzLCBFeFRlc3RIYW5kbGVyW10gaGFuZGxlcnMpIHsKKyAgYXV0byBtYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKyAgc2NvcGUgKGV4aXQpIG1hbmFnZXIuc3RvcChkdXIhImhuc2VjcyIoMCkpOworCisgIGF1dG8gY2xpZW50cyA9IG1ha2VBc3luY0NsaWVudHMobWFuYWdlciwgcG9ydHMpOworICBzY29wZShleGl0KSBmb3JlYWNoIChjOyBjbGllbnRzKSBjLnRyYW5zcG9ydC5jbG9zZSgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZmFzdGVzdCBjbGllbnQgd2lucywgZXZlbiBpZiB0aGV5IGFyZSBjYWxsZWQgaW4gc29tZSBvdGhlcgorICAvLyBvcmRlci4KKyAgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZUFzeW5jRmFzdGVzdFBvb2woYXJyYXkocmV0cm8oY2xpZW50cykpKS5nZXRQb3J0KCkud2FpdEdldCgpOworICAgIGVuZm9yY2UocmVzdWx0ID09IHBvcnRzWzBdKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSBhbGwgY2xpZW50cyBmYWlsLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jRmFzdGVzdFBvb2woY2xpZW50c1szIC4uICRdKTsKKyAgICBhdXRvIGUgPSBjYXN0KFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHBvb2wuZ2V0UG9ydCgpLndhaXRHZXQoKSk7CisgICAgZW5mb3JjZShlKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pZS5leGNlcHRpb25zKSwKKyAgICAgIHBvcnRzWzMgLi4gJF0pKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50cyBmYWlsLCBidXQgYSBsYXRlciBvbmUgc3VjY2VlZHMuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlQXN5bmNGYXN0ZXN0UG9vbChjbGllbnRzWzEgLi4gJF0pOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0SW5BcnJheSgpID09IFtwb3J0c1sxXV0pOworICB9Cit9CisKK2F1dG8gbWFrZUFzeW5jRmFzdGVzdFBvb2woVEFzeW5jQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10gY2xpZW50cykgeworICBhdXRvIHAgPSB0QXN5bmNGYXN0ZXN0Q2xpZW50UG9vbChjbGllbnRzKTsKKyAgcC5ycGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgIHJldHVybiAoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbillICFpcyBudWxsKTsKKyAgfTsKKyAgcmV0dXJuIHA7Cit9CisKKwordm9pZCBhc3luY0FnZ3JlZ2F0b3JUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgIHNjb3BlIChleGl0KSBtYW5hZ2VyLnN0b3AoZHVyISJobnNlY3MiKDApKTsKKworICBhdXRvIGNsaWVudHMgPSBtYWtlQXN5bmNDbGllbnRzKG1hbmFnZXIsIHBvcnRzKTsKKyAgc2NvcGUoZXhpdCkgZm9yZWFjaCAoYzsgY2xpZW50cykgYy50cmFuc3BvcnQuY2xvc2UoKTsKKworICBhdXRvIGFnZ3JlZ2F0b3IgPSB0QXN5bmNBZ2dyZWdhdG9yKAorICAgIGNhc3QoVEFzeW5jQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10pY2xpZW50cyk7CisKKyAgLy8gVGVzdCBhZ2dyZWdhdG9yIHJhbmdlIGludGVyZmFjZS4KKyAgeworICAgIGF1dG8gcmFuZ2UgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5yYW5nZShkdXIhIm1zZWNzIig1MCkpOworICAgIGVuZm9yY2UoZXF1YWwocmFuZ2UsIHBvcnRzWzAgLi4gMl1bXSkpOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSlyYW5nZS5leGNlcHRpb25zKSwKKyAgICAgIHBvcnRzWzMgLi4gJCAtIDFdKSk7CisgICAgZW5mb3JjZShyYW5nZS5jb21wbGV0ZWRDb3VudCA9PSA0KTsKKyAgfQorCisgIC8vIFRlc3QgZGVmYXVsdCBhY2N1bXVsYXRvciBmb3Igc2NhbGFycy4KKyAgeworICAgIGF1dG8gZnVsbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUoKTsKKyAgICBlbmZvcmNlKGZ1bGxSZXN1bHQud2FpdEdldCgpID09IHBvcnRzWzAgLi4gM10pOworCisgICAgYXV0byBwYXJ0aWFsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0KCkuYWNjdW11bGF0ZSgpOworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIigyMCkpOworICAgIGVuZm9yY2UocGFydGlhbFJlc3VsdC5maW5pc2hHZXQoKSA9PSBwb3J0c1swIC4uIDJdKTsKKworICB9CisKKyAgLy8gVGVzdCBkZWZhdWx0IGFjY3VtdWxhdG9yIGZvciBhcnJheXMuCisgIHsKKyAgICBhdXRvIGZ1bGxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnRJbkFycmF5KCkuYWNjdW11bGF0ZSgpOworICAgIGVuZm9yY2UoZnVsbFJlc3VsdC53YWl0R2V0KCkgPT0gcG9ydHNbMCAuLiAzXSk7CisKKyAgICBhdXRvIHBhcnRpYWxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnRJbkFycmF5KCkuYWNjdW11bGF0ZSgpOworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIigyMCkpOworICAgIGVuZm9yY2UocGFydGlhbFJlc3VsdC5maW5pc2hHZXQoKSA9PSBwb3J0c1swIC4uIDJdKTsKKyAgfQorCisgIC8vIFRlc3QgY3VzdG9tIGFjY3VtdWxhdG9yLgorICB7CisgICAgYXV0byBmdWxsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0KCkuYWNjdW11bGF0ZSEoZnVuY3Rpb24oaW50W10gcmVzdWx0cyl7CisgICAgICByZXR1cm4gcmVkdWNlISJhICsgYiIocmVzdWx0cyk7CisgICAgfSkoKTsKKyAgICBlbmZvcmNlKGZ1bGxSZXN1bHQud2FpdEdldCgpID09IHBvcnRzWzBdICsgcG9ydHNbMV0gKyBwb3J0c1syXSk7CisKKyAgICBhdXRvIHBhcnRpYWxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5hY2N1bXVsYXRlISgKKyAgICAgIGZ1bmN0aW9uKGludFtdIHJlc3VsdHMsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMpIHsKKyAgICAgICAgLy8gUmV0dXJuIGEgdHVwbGUgb2YgdGhlIHBhcmFtZXRlcnMgc28gd2UgY2FuIGNoZWNrIHRoZW0gb3V0c2lkZSBvZgorICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uICh0byB2ZXJpZnkgdGhlIHZhbHVlcywgd2UgbmVlZCBhY2Nlc3MgdG8gwrtwb3J0c8KrLCBidXQKKyAgICAgICAgLy8gZHVlIHRvIERNRCBAQEJVRzU3MTBAQCwgd2UgY2FuJ3QgdXNlIGEgZGVsZWdhdGUgbGl0ZXJhbCkuZgorICAgICAgICByZXR1cm4gdHVwbGUocmVzdWx0cywgZXhjZXB0aW9ucyk7CisgICAgICB9CisgICAgKSgpOworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIigyMCkpOworICAgIGF1dG8gcmVzdWx0VHVwbGUgPSBwYXJ0aWFsUmVzdWx0LmZpbmlzaEdldCgpOworICAgIGVuZm9yY2UocmVzdWx0VHVwbGVbMF0gPT0gcG9ydHNbMCAuLiAyXSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJlc3VsdFR1cGxlWzFdKSwKKyAgICAgIHBvcnRzWzMgLi4gJCAtIDFdKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvb3BlbnNzbC50ZXN0LmNuZiBiL2xpYi9kL3Rlc3Qvb3BlbnNzbC50ZXN0LmNuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRhMzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9vcGVuc3NsLnRlc3QuY25mCkBAIC0wLDAgKzEsMTQgQEAKK1sgcmVxIF0KK2RlZmF1bHRfYml0cyA9IDIwNDgKK2RlZmF1bHRfa2V5ZmlsZSA9IHNlcnZlci1wcml2YXRlLWtleS5wZW0KK2Rpc3Rpbmd1aXNoZWRfbmFtZSA9IHJlcV9kaXN0aW5ndWlzaGVkX25hbWUKK3g1MDlfZXh0ZW5zaW9ucyA9IHYzX2NhCitwcm9tcHQgPSBubworCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorQ04gPSBsb2NhbGhvc3QKKworWyB2M19jYSBdCisjIEFkZCA6OjEgdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBJUHMgc28gd2UgY2FuIHVzZSA6OjEgdG8gZXhwbGljaXRseSBjb25uZWN0CisjIHRvIGxvY2FsaG9zdCB2aWEgSVB2Ni4KK3N1YmplY3RBbHROYW1lID0gSVA6OjoxCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQgYi9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMDQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZApAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtaW5pIHNlcmlhbGl6YXRpb24gYmVuY2htYXJrIGFsc28gYXZhaWxhYmxlIGZvcgorICogQysrIGFuZCBKYXZhLgorICoKKyAqIEZvciBtZWFuaW5nZnVsIHJlc3VsdHMsIHlvdSBtaWdodCB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0CisgKiB0aGUgVGhyaWZ0IGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCByZWxlYXNlIGJ1aWxkIGZsYWdzLAorICogZS5nLiBieSBpbmNsdWRpbmcgdGhlIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBidWlsZCBpbnN0ZWFkCisgKiBvZiBsaW5raW5nIGxpYnRocmlmdGQ6CisgKgorICAgZG1kIC13IC1PIC1yZWxlYXNlIC1pbmxpbmUgLUkuLi9zcmMgLUlnZW4tZCAtb2ZzZXJpYWxpemF0aW9uX2JlbmNobWFyayBcCisgICAkKGZpbmQgLi4vc3JjL3RocmlmdCAtbmFtZSAnKi5kJyAtbm90IC1uYW1lIGluZGV4LmQpIFwKKyAgIGdlbi1kL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmQgc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZAorICovCittb2R1bGUgc2VyaWFsaXphdGlvbl9iZW5jaG1hcms7CisKK2ltcG9ydCBzdGQuZGF0ZXRpbWUuc3RvcHdhdGNoIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CitpbXBvcnQgc3RkLm1hdGggOiBQSTsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnJhbmdlOworaW1wb3J0IERlYnVnUHJvdG9UZXN0X3R5cGVzOworCit2b2lkIG1haW4oKSB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGVudW0gSVRFUkFUSU9OUyA9IDEwXzAwMF8wMDA7CisKKyAgeworICAgIGF1dG8gb29lID0gT25lT2ZFYWNoKCk7CisgICAgb29lLmltX3RydWUgICA9IHRydWU7CisgICAgb29lLmltX2ZhbHNlICA9IGZhbHNlOworICAgIG9vZS5hX2JpdGUgICAgPSAweDdmOworICAgIG9vZS5pbnRlZ2VyMTYgPSAyN18wMDA7CisgICAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CisgICAgb29lLmludGVnZXI2NCA9IDZfMDAwXzAwMF8wMDA7CisgICAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBQSTsKKyAgICBvb2Uuc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgICAgb29lLnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOworCisgICAgYXV0byBwcm90ID0gdEJpbmFyeVByb3RvY29sKGJ1Zik7CisgICAgYXV0byBzdyA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICBmb3JlYWNoIChpOyAwIC4uIElURVJBVElPTlMpIHsKKyAgICAgIGJ1Zi5yZXNldCgxMjApOworICAgICAgb29lLndyaXRlKHByb3QpOworICAgIH0KKyAgICBzdy5zdG9wKCk7CisKKyAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLnRvdGFsISJtc2VjcyI7CisgICAgd3JpdGVmbG4oIldyaXRlOiAlcyBtcyAoJXMga0h6KSIsIG1zZWNzLCBJVEVSQVRJT05TIC8gbXNlY3MpOworICB9CisKKyAgYXV0byBkYXRhID0gYnVmLmdldENvbnRlbnRzKCkuZHVwOworCisgIHsKKyAgICBhdXRvIHJlYWRCdWYgPSB0SW5wdXRSYW5nZVRyYW5zcG9ydChkYXRhKTsKKyAgICBhdXRvIHByb3QgPSB0QmluYXJ5UHJvdG9jb2wocmVhZEJ1Zik7CisgICAgYXV0byBvb2UgPSBPbmVPZkVhY2goKTsKKworICAgIGF1dG8gc3cgPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgZm9yZWFjaCAoaTsgMCAuLiBJVEVSQVRJT05TKSB7CisgICAgICByZWFkQnVmLnJlc2V0KGRhdGEpOworICAgICAgb29lLnJlYWQocHJvdCk7CisgICAgfQorICAgIHN3LnN0b3AoKTsKKworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKKyAgICB3cml0ZWZsbigiIFJlYWQ6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvc3RyZXNzX3Rlc3Rfc2VydmVyLmQgYi9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGEwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlci5kCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBzdHJlc3NfdGVzdF9zZXJ2ZXI7CisKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IHRvdGFsQ1BVczsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnR5cGV0dXBsZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKK2ltcG9ydCB0ZXN0X3V0aWxzOworCitpbXBvcnQgdGhyaWZ0LnRlc3Quc3RyZXNzLlNlcnZpY2U7CisKK2NsYXNzIFNlcnZpY2VIYW5kbGVyIDogU2VydmljZSB7CisgIHZvaWQgZWNob1ZvaWQoKSB7IHJldHVybjsgfQorICBieXRlIGVjaG9CeXRlKGJ5dGUgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50IGVjaG9JMzIoaW50IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGxvbmcgZWNob0k2NChsb25nIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGJ5dGVbXSBlY2hvTGlzdChieXRlW10gYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgSGFzaFNldCFieXRlIGVjaG9TZXQoSGFzaFNldCFieXRlIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGJ5dGVbYnl0ZV0gZWNob01hcChieXRlW2J5dGVdIGFyZykgeyByZXR1cm4gYXJnOyB9CisKKyAgc3RyaW5nIGVjaG9TdHJpbmcoc3RyaW5nIGFyZykgeworICAgIGlmIChhcmcgIT0gImhlbGxvIikgeworICAgICAgc3RkZXJyLndyaXRlZmxuKGBXcm9uZyBzdHJpbmcgcmVjZWl2ZWQ6ICVzIGluc3RlYWQgb2YgImhlbGxvImAsIGFyZyk7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJXcm9uZyBzdHJpbmcgcmVjZWl2ZWQuIik7CisgICAgfQorICAgIHJldHVybiBhcmc7CisgIH0KK30KKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgdXNob3J0IHBvcnQgPSA5MDkxOworICBhdXRvIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLnRocmVhZGVkOworICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisgIHNpemVfdCBudW1JT1RocmVhZHMgPSAxOworICBzaXplX3QgdGFza1Bvb2xTaXplID0gdG90YWxDUFVzOworCisgIGdldG9wdChhcmdzLCAicG9ydCIsICZwb3J0LCAic2VydmVyLXR5cGUiLCAmc2VydmVyVHlwZSwKKyAgICAidHJhbnNwb3J0LXR5cGUiLCAmdHJhbnNwb3J0VHlwZSwgInRhc2stcG9vbC1zaXplIiwgJnRhc2tQb29sU2l6ZSwKKyAgICAibnVtLWlvLXRocmVhZHMiLCAmbnVtSU9UaHJlYWRzKTsKKworICBhbGlhcyBUeXBlVHVwbGUhKFRCdWZmZXJlZFRyYW5zcG9ydCwgVE1lbW9yeUJ1ZmZlcikgQXZhaWxhYmxlVHJhbnNwb3J0czsKKworICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEoU2VydmljZSwKKyAgICBzdGF0aWNNYXAhKFRCaW5hcnlQcm90b2NvbCwgQXZhaWxhYmxlVHJhbnNwb3J0cykpKG5ldyBTZXJ2aWNlSGFuZGxlcigpKTsKKyAgYXV0byBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0KTsKKyAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gY3JlYXRlVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRUeXBlKTsKKyAgYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworCisgIGF1dG8gc2VydmVyID0gY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIHRhc2tQb29sU2l6ZSwgbnVtSU9UaHJlYWRzLAorICAgIHByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworCisgIHdyaXRlZmxuKCJTdGFydGluZyAlcyAlcyBTdHJlc3NUZXN0IHNlcnZlciBvbiBwb3J0ICVzLi4uIiwgdHJhbnNwb3J0VHlwZSwKKyAgICBzZXJ2ZXJUeXBlLCBwb3J0KTsKKyAgc2VydmVyLnNlcnZlKCk7CisgIHdyaXRlbG4oImRvbmUuIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3Rlc3RfdXRpbHMuZCBiL2xpYi9kL3Rlc3QvdGVzdF91dGlscy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDEwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3Rlc3RfdXRpbHMuZApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVmFyaW91cyBoZWxwZXJzIHVzZWQgYnkgbW9yZSB0aGFuIGEgc2luZ2xlIHRlc3QuCisgKi8KK21vZHVsZSB0ZXN0X3V0aWxzOworCitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtIDogVGFza1Bvb2w7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5ub25ibG9ja2luZzsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRhc2twb29sOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudGhyZWFkZWQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuaHR0cDsKKworLy8gVGhpcyBpcyBhIGxpa2VseSB2aWN0aW0gb2YgQEBCVUc0NzQ0QEAgd2hlbiB1c2VkIHdpdGggY29tbWFuZCBhcmd1bWVudAorLy8gcGFyc2luZy4KK2VudW0gU2VydmVyVHlwZSB7CisgIHNpbXBsZSwKKyAgbm9uYmxvY2tpbmcsCisgIHBvb2xlZE5vbmJsb2NraW5nLAorICB0YXNrcG9vbCwKKyAgdGhyZWFkZWQKK30KKworVFNlcnZlciBjcmVhdGVTZXJ2ZXIoU2VydmVyVHlwZSB0eXBlLCBzaXplX3QgdGFza1Bvb2xTaXplLCBzaXplX3QgbnVtSU9UaHJlYWRzLAorICBUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclNvY2tldCBzZXJ2ZXJUcmFuc3BvcnQsCisgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQoreworICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFNlcnZlclR5cGUuc2ltcGxlOgorICAgICAgcmV0dXJuIG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgIGNhc2UgU2VydmVyVHlwZS5ub25ibG9ja2luZzoKKyAgICAgIGF1dG8gbmIgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LnBvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBuYi5udW1JT1RocmVhZHMgPSBudW1JT1RocmVhZHM7CisgICAgICByZXR1cm4gbmI7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLnBvb2xlZE5vbmJsb2NraW5nOgorICAgICAgYXV0byBuYiA9IG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQucG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXcgVGFza1Bvb2wodGFza1Bvb2xTaXplKSk7CisgICAgICBuYi5udW1JT1RocmVhZHMgPSBudW1JT1RocmVhZHM7CisgICAgICByZXR1cm4gbmI7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLnRhc2twb29sOgorICAgICAgYXV0byB0cHMgPSBuZXcgVFRhc2tQb29sU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgdHBzLnRhc2tQb29sID0gbmV3IFRhc2tQb29sKHRhc2tQb29sU2l6ZSk7CisgICAgICByZXR1cm4gdHBzOworICAgIGNhc2UgU2VydmVyVHlwZS50aHJlYWRlZDoKKyAgICAgIHJldHVybiBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9Cit9CisKK2VudW0gVHJhbnNwb3J0VHlwZSB7CisgIGJ1ZmZlcmVkLAorICBmcmFtZWQsCisgIGh0dHAsCisgIHJhdworfQorCitUVHJhbnNwb3J0RmFjdG9yeSBjcmVhdGVUcmFuc3BvcnRGYWN0b3J5KFRyYW5zcG9ydFR5cGUgdHlwZSkgeworICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuYnVmZmVyZWQ6CisgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmZyYW1lZDoKKyAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmh0dHA6CisgICAgICByZXR1cm4gbmV3IFRTZXJ2ZXJIdHRwVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUucmF3OgorICAgICAgcmV0dXJuIG5ldyBUVHJhbnNwb3J0RmFjdG9yeTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZCBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MTlmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnRfdGVzdF9jbGllbnQ7CisKK2ltcG9ydCBzdGQuY29udjsKK2ltcG9ydCBzdGQuZGF0ZXRpbWU7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnN0cmluZzsKK2ltcG9ydCBzdGQudHJhaXRzOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5jb21wYWN0OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5qc29uOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuaHR0cDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworCitpbXBvcnQgdGhyaWZ0X3Rlc3RfY29tbW9uOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdF90eXBlczsKKworZW51bSBUcmFuc3BvcnRUeXBlIHsKKyAgYnVmZmVyZWQsCisgIGZyYW1lZCwKKyAgaHR0cCwKKyAgcmF3Cit9CisKK1RQcm90b2NvbCBjcmVhdGVQcm90b2NvbChUKShUIHRyYW5zLCBQcm90b2NvbFR5cGUgdHlwZSkgeworICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5iaW5hcnk6CisgICAgICByZXR1cm4gdEJpbmFyeVByb3RvY29sKHRyYW5zKTsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5jb21wYWN0OgorICAgICAgcmV0dXJuIHRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmpzb246CisgICAgICByZXR1cm4gdEpzb25Qcm90b2NvbCh0cmFucyk7CisgIH0KK30KKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgdXNob3J0IHBvcnQgPSA5MDkwOworICB1aW50IG51bVRlc3RzID0gMTsKKyAgYm9vbCBzc2w7CisgIFByb3RvY29sVHlwZSBwcm90b2NvbFR5cGU7CisgIFRyYW5zcG9ydFR5cGUgdHJhbnNwb3J0VHlwZTsKKyAgYm9vbCB0cmFjZTsKKworICBnZXRvcHQoYXJncywKKyAgICAibnVtVGVzdHN8biIsICZudW1UZXN0cywKKyAgICAicHJvdG9jb2wiLCAmcHJvdG9jb2xUeXBlLAorICAgICJzc2wiLCAmc3NsLAorICAgICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0VHlwZSwKKyAgICAidHJhY2UiLCAmdHJhY2UsCisgICAgInBvcnQiLCAmcG9ydCwKKyAgICAiaG9zdCIsIChzdHJpbmcgXywgc3RyaW5nIHZhbHVlKSB7CisgICAgICBhdXRvIHBhcnRzID0gc3BsaXQodmFsdWUsICI6Iik7CisgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgeworICAgICAgICAvLyBJUHY2IGFkZHJlc3NlcyBjYW4gY29udGFpbiBjb2xvbnMsIHNvIHRha2UgdGhlIGxhc3QgcGFydCBmb3IgdGhlCisgICAgICAgIC8vIHBvcnQuCisgICAgICAgIGhvc3QgPSBqb2luKHBhcnRzWzAgLi4gJCAtIDFdLCAiOiIpOworICAgICAgICBwb3J0ID0gdG8hdXNob3J0KHBhcnRzWyQgLSAxXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBob3N0ID0gdmFsdWU7CisgICAgICB9CisgICAgfQorICApOworICBwb3J0ID0gdG8hdXNob3J0KHBvcnQpOworCisgIFRTb2NrZXQgc29ja2V0OworICBpZiAoc3NsKSB7CisgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CisgICAgc3NsQ29udGV4dC5jaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CisgICAgc3NsQ29udGV4dC5hdXRoZW50aWNhdGUgPSB0cnVlOworICAgIHNzbENvbnRleHQubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9DQS5wZW0iKTsKKyAgICBzb2NrZXQgPSBuZXcgVFNTTFNvY2tldChzc2xDb250ZXh0LCBob3N0LCBwb3J0KTsKKyAgfSBlbHNlIHsKKyAgICBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgfQorCisgIFRQcm90b2NvbCBwcm90b2NvbDsKKyAgZmluYWwgc3dpdGNoICh0cmFuc3BvcnRUeXBlKSB7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmJ1ZmZlcmVkOgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCksIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuZnJhbWVkOgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpLCBwcm90b2NvbFR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmh0dHA6CisgICAgICBwcm90b2NvbCA9IGNyZWF0ZVByb3RvY29sKAorICAgICAgICBuZXcgVENsaWVudEh0dHBUcmFuc3BvcnQoc29ja2V0LCBob3N0LCAiL3NlcnZpY2UiKSwgcHJvdG9jb2xUeXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5yYXc6CisgICAgICBwcm90b2NvbCA9IGNyZWF0ZVByb3RvY29sKHNvY2tldCwgcHJvdG9jb2xUeXBlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYXV0byBjbGllbnQgPSB0Q2xpZW50IVRocmlmdFRlc3QocHJvdG9jb2wpOworCisgIHVsb25nIHRpbWVfbWluOworICB1bG9uZyB0aW1lX21heDsKKyAgdWxvbmcgdGltZV90b3Q7CisKKyAgU3RvcFdhdGNoIHN3OworICBmb3JlYWNoKHRlc3Q7IDAgLi4gbnVtVGVzdHMpIHsKKyAgICBzdy5zdGFydCgpOworCisgICAgcHJvdG9jb2wudHJhbnNwb3J0Lm9wZW4oKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIlRlc3QgIyVzLCBjb25uZWN0ICVzOiVzIiwgdGVzdCArIDEsIGhvc3QsIHBvcnQpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdFZvaWQoKSIpOworICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgIGlmICh0cmFjZSkgd3JpdGVsbigiID0gdm9pZCIpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBzdHJpbmcgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gXCIlc1wiIiwgcyk7CisgICAgZW5mb3JjZShzID09ICJUZXN0Iik7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0Qnl0ZSgxKSIpOworICAgIGJ5dGUgdTggPSBjbGllbnQudGVzdEJ5dGUoMSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCB1OCk7CisgICAgZW5mb3JjZSh1OCA9PSAxKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgaW50IGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGkzMik7CisgICAgZW5mb3JjZShpMzIgPT0gLTEpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgbG9uZyBpNjQgPSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjhMKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGk2NCk7CisgICAgZW5mb3JjZShpNjQgPT0gLTM0MzU5NzM4MzY4TCk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RG91YmxlKC01LjIwOTg1MjMpIik7CisgICAgZG91YmxlIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgZHViKTsKKyAgICBlbmZvcmNlKGR1YiA9PSAtNS4yMDk4NTIzKTsKKworCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCQorICAgIFh0cnVjdCBvdXQxOworICAgIG91dDEuc3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgIG91dDEuYnl0ZV90aGluZyA9IDE7CisgICAgb3V0MS5pMzJfdGhpbmcgPSAtMzsKKyAgICBvdXQxLmk2NF90aGluZyA9IC01OworICAgIGlmICh0cmFjZSkgd3JpdGVmKCJ0ZXN0U3RydWN0KCVzKSIsIG91dDEpOworICAgIGF1dG8gaW4xID0gY2xpZW50LnRlc3RTdHJ1Y3Qob3V0MSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpbjEpOworICAgIGVuZm9yY2UoaW4xID09IG91dDEpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7CisgICAgWHRydWN0MiBvdXQyOworICAgIG91dDIuYnl0ZV90aGluZyA9IDE7CisgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQxOworICAgIG91dDIuaTMyX3RoaW5nID0gNTsKKyAgICBhdXRvIGluMiA9IGNsaWVudC50ZXN0TmVzdChvdXQyKTsKKyAgICBpbjEgPSBpbjIuc3RydWN0X3RoaW5nOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IHslcywge1wiJXNcIiwgJXMsICVzLCAlc30sICVzfSIsIGluMi5ieXRlX3RoaW5nLAorICAgICAgaW4xLnN0cmluZ190aGluZywgaW4xLmJ5dGVfdGhpbmcsIGluMS5pMzJfdGhpbmcsIGluMS5pNjRfdGhpbmcsCisgICAgICBpbjIuaTMyX3RoaW5nKTsKKyAgICBlbmZvcmNlKGluMiA9PSBvdXQyKTsKKworICAgIGludFtpbnRdIG1hcG91dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgbWFwb3V0W2ldID0gaSAtIDEwOworICAgIH0KKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdE1hcCh7JXN9KSIsIG1hcG91dCk7CisgICAgYXV0byBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0geyVzfSIsIG1hcGluKTsKKyAgICBlbmZvcmNlKG1hcGluID09IG1hcG91dCk7CisKKyAgICBhdXRvIHNldG91dCA9IG5ldyBIYXNoU2V0IWludDsKKyAgICBmb3IgKGludCBpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgIHNldG91dCB+PSBpOworICAgIH0KKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdFNldCglcykiLCBzZXRvdXQpOworICAgIGF1dG8gc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgc2V0aW4pOworICAgIGVuZm9yY2Uoc2V0aW4gPT0gc2V0b3V0KTsKKworICAgIGludFtdIGxpc3RvdXQ7CisgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICBsaXN0b3V0IH49IGk7CisgICAgfQorICAgIGlmICh0cmFjZSkgd3JpdGVmKCJ0ZXN0TGlzdCglcykiLCBsaXN0b3V0KTsKKyAgICBhdXRvIGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGxpc3Rpbik7CisgICAgZW5mb3JjZShsaXN0aW4gPT0gbGlzdG91dCk7CisKKyAgICB7CisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICBhdXRvIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6Lk9ORSk7CisKKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6LlRXTyk7CisKKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5USFJFRSk7CisKKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouRklWRSk7CisKKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5FSUdIVCk7CisgICAgfQorCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgIFVzZXJJZCB1aWQgPSBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCB1aWQpOworICAgIGVuZm9yY2UodWlkID09IDMwOTg1ODIzNTA4MjUyM0wpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgIGF1dG8gbW0gPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSB7JXN9IiwgbW0pOworICAgIC8vIFNpbXBseSBkb2luZyA9PSBkb2Vzbid0IHNlZW0gdG8gd29yayBmb3IgbmVzdGVkIEFBcy4KKyAgICBmb3JlYWNoIChrZXksIHZhbHVlOyBtbSkgeworICAgICAgZW5mb3JjZSh0ZXN0TWFwTWFwUmV0dXJuW2tleV0gPT0gdmFsdWUpOworICAgIH0KKyAgICBmb3JlYWNoIChrZXksIHZhbHVlOyB0ZXN0TWFwTWFwUmV0dXJuKSB7CisgICAgICBlbmZvcmNlKG1tW2tleV0gPT0gdmFsdWUpOworICAgIH0KKworICAgIEluc2FuaXR5IGluc2FuZTsKKyAgICBpbnNhbmUudXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMDsKKyAgICBYdHJ1Y3QgdHJ1Y2s7CisgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICB0cnVjay5ieXRlX3RoaW5nID0gODsKKyAgICB0cnVjay5pMzJfdGhpbmcgPSA4OworICAgIHRydWNrLmk2NF90aGluZyA9IDg7CisgICAgaW5zYW5lLnh0cnVjdHMgfj0gdHJ1Y2s7CisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICBhdXRvIHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCB3aG9hKTsKKworICAgIC8vIENvbW1lbnRlZCBmb3Igbm93LCB0aGlzIGlzIGN1bWJlcnNvbWUgdG8gd3JpdGUgd2l0aG91dCBvcEVxdWFsIGdldHRpbmcKKyAgICAvLyBjYWxsZWQgb24gQUEgY29tcGFyaXNvbi4KKyAgICAvLyBlbmZvcmNlKHdob2EgPT0gdGVzdEluc2FuaXR5UmV0dXJuKTsKKworICAgIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICB2b2lkXG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfSBjYXRjaCAoWGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslcywgXCIlc1wifSIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICB2b2lkXG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiAgeyVzfSIsIGUubXNnKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICB2b2lkIik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgZXhjZXB0aW9uXG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgcmVzdWx0XG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RNdWx0aUV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChYY2VwdGlvbiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiAgeyVzLCBcIiVzXCJ9IiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICByZXN1bHRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdE11bHRpRXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFhjZXB0aW9uMiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiAgeyVzLCB7XCIlc1wifX0iLAorICAgICAgICAgIGUuZXJyb3JDb2RlLCBlLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZigiY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgInRlc3QgMyIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHt7XCIlc1wifX0iLCByZXN1bHQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICBleGNlcHRpb25cbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdE11bHRpRXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEbyBub3QgcnVuIG9uZXdheSB0ZXN0IHdoZW4gZG9pbmcgbXVsdGlwbGUgaXRlcmF0aW9ucywgYXMgaXQgYmxvY2tzIHRoZQorICAgIC8vIHNlcnZlciBmb3IgdGhyZWUgc2Vjb25kcy4KKyAgICBpZiAobnVtVGVzdHMgPT0gMSkgeworICAgICAgaWYgKHRyYWNlKSB3cml0ZWYoImNsaWVudC50ZXN0T25ld2F5KDMpID0+Iik7CisgICAgICBhdXRvIG9uZXdheVdhdGNoID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMyk7CisgICAgICBvbmV3YXlXYXRjaC5zdG9wKCk7CisgICAgICBpZiAob25ld2F5V2F0Y2gucGVlaygpLm1zZWNzID4gMjAwKSB7CisgICAgICAgIGlmICh0cmFjZSkgeworICAgICAgICAgIHdyaXRlZmxuKCIgIEZBSUxVUkUgLSB0b29rICVzIG1zIiwgb25ld2F5V2F0Y2gucGVlaygpLnVzZWNzIC8gMTAwMC4wKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0T25ld2F5IGZhaWxlZC4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0cmFjZSkgeworICAgICAgICAgIHdyaXRlZmxuKCIgIHN1Y2Nlc3MgLSB0b29rICVzIG1zIiwgb25ld2F5V2F0Y2gucGVlaygpLnVzZWNzIC8gMTAwMC4wKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBSZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkKKyAgICAgIC8vIG9uZSIsIHdoaWNoIHdvdWxkIGJlIHRoZSBjYXNlIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgbWV0aG9kcworICAgICAgLy8gbGlrZSBub3JtYWwgb25lcy4KKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInJlLXRlc3QgdGVzdEkzMigtMSkiKTsKKyAgICAgIGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgaTMyKTsKKyAgICB9CisKKyAgICAvLyBUaW1lIG1ldGVyaW5nLgorICAgIHN3LnN0b3AoKTsKKworICAgIGltbXV0YWJsZSB0b3QgPSBzdy5wZWVrKCkudXNlY3M7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiVG90YWwgdGltZTogJXMgdXNcbiIsIHRvdCk7CisKKyAgICB0aW1lX3RvdCArPSB0b3Q7CisgICAgaWYgKHRpbWVfbWluID09IDAgfHwgdG90IDwgdGltZV9taW4pIHsKKyAgICAgIHRpbWVfbWluID0gdG90OworICAgIH0KKyAgICBpZiAodG90ID4gdGltZV9tYXgpIHsKKyAgICAgIHRpbWVfbWF4ID0gdG90OworICAgIH0KKyAgICBwcm90b2NvbC50cmFuc3BvcnQuY2xvc2UoKTsKKworICAgIHN3LnJlc2V0KCk7CisgIH0KKworICB3cml0ZWxuKCJBbGwgdGVzdHMgZG9uZS4iKTsKKworICBpZiAobnVtVGVzdHMgPiAxKSB7CisgICAgYXV0byB0aW1lX2F2ZyA9IHRpbWVfdG90IC8gbnVtVGVzdHM7CisgICAgd3JpdGVmbG4oIk1pbiB0aW1lOiAlcyB1cyIsIHRpbWVfbWluKTsKKyAgICB3cml0ZWZsbigiTWF4IHRpbWU6ICVzIHVzIiwgdGltZV9tYXgpOworICAgIHdyaXRlZmxuKCJBdmcgdGltZTogJXMgdXMiLCB0aW1lX2F2Zyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY29tbW9uLmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NvbW1vbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTU2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NvbW1vbi5kCkBAIC0wLDAgKzEsOTIgQEAKK21vZHVsZSB0aHJpZnRfdGVzdF9jb21tb247CisKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdF90eXBlczsKKworZW51bSBQcm90b2NvbFR5cGUgeworICBiaW5hcnksCisgIGNvbXBhY3QsCisgIGpzb24KK30KKwordm9pZCB3cml0ZUluc2FuaXR5UmV0dXJuKGluIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gaW5zYW5lKSB7CisgIHdyaXRlKCJ7Iik7CisgIGZvcmVhY2goa2V5MSwgdmFsdWUxOyBpbnNhbmUpIHsKKyAgICB3cml0ZWYoIiVzID0+IHsiLCBrZXkxKTsKKyAgICBmb3JlYWNoKGtleTIsIHZhbHVlMjsgdmFsdWUxKSB7CisgICAgICB3cml0ZWYoIiVzID0+IHsiLCBrZXkyKTsKKyAgICAgIHdyaXRlKCJ7Iik7CisgICAgICBmb3JlYWNoKGtleTMsIHZhbHVlMzsgdmFsdWUyLnVzZXJNYXApIHsKKyAgICAgICAgd3JpdGVmKCIlcyA9PiAlcywgIiwga2V5MywgdmFsdWUzKTsKKyAgICAgIH0KKyAgICAgIHdyaXRlKCJ9LCAiKTsKKworICAgICAgd3JpdGUoInsiKTsKKyAgICAgIGZvcmVhY2ggKHg7IHZhbHVlMi54dHJ1Y3RzKSB7CisgICAgICAgIHdyaXRlZigie1wiJXNcIiwgJXMsICVzLCAlc30sICIsCisgICAgICAgICAgeC5zdHJpbmdfdGhpbmcsIHguYnl0ZV90aGluZywgeC5pMzJfdGhpbmcsIHguaTY0X3RoaW5nKTsKKyAgICAgIH0KKyAgICAgIHdyaXRlKCJ9Iik7CisKKyAgICAgIHdyaXRlKCJ9LCAiKTsKKyAgICB9CisgICAgd3JpdGUoIn0sICIpOworICB9CisgIHdyaXRlKCJ9Iik7Cit9CisKK0luc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gdGVzdEluc2FuaXR5UmV0dXJuOworaW50W2ludF1baW50XSB0ZXN0TWFwTWFwUmV0dXJuOworCitzdGF0aWMgdGhpcygpIHsKKyAgdGVzdEluc2FuaXR5UmV0dXJuID0geworICAgIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gaW5zYW5lOworCisgICAgWHRydWN0IGhlbGxvOworICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOworICAgIGhlbGxvLmkzMl90aGluZyA9IDI7CisgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKKworICAgIFh0cnVjdCBnb29kYnllOworICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKKyAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7CisKKyAgICBJbnNhbml0eSBjcmF6eTsKKyAgICBjcmF6eS51c2VyTWFwW051bWJlcnouRUlHSFRdID0gODsKKyAgICBjcmF6eS54dHJ1Y3RzIH49IGdvb2RieWU7CisKKyAgICBJbnNhbml0eSBsb29uZXk7CisgICAgLy8gVGhlIEMrKyBUZXN0U2VydmVyIGFsc28gYXNzaWducyB0aGVzZSB0byBjcmF6eSwgYnV0IHRoYXQgaXMgcHJvYmFibHkKKyAgICAvLyBhbiBvdmVyc2lnaHQuCisgICAgbG9vbmV5LnVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDU7CisgICAgbG9vbmV5Lnh0cnVjdHMgfj0gaGVsbG87CisKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBmaXJzdF9tYXA7CisgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OworICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKworICAgIEluc2FuaXR5W051bWJlcnpdIHNlY29uZF9tYXA7CisgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKyAgICByZXR1cm4gaW5zYW5lOworICB9KCk7CisKKyAgdGVzdE1hcE1hcFJldHVybiA9IHsKKyAgICBpbnRbaW50XSBwb3M7CisgICAgaW50W2ludF0gbmVnOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorCisgICAgaW50W2ludF1baW50XSByZXN1bHQ7CisgICAgcmVzdWx0WzRdID0gcG9zOworICAgIHJlc3VsdFstNF0gPSBuZWc7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2ggYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MWJmZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKQEAgLTAsMCArMSw5MyBAQAorIyEvYmluL2Jhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgUnVucyB0aGUgRCBUaHJpZnRUZXN0IGNsaWVudCBhbmQgc2VydmVycyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0cmFuc3BvcnQsCisjIHByb3RvY29sLCBTU0wtbW9kZSBhbmQgc2VydmVyIHR5cGUuCisjIFBhc3MgLWsgdG8ga2VlcCBnb2luZyBhZnRlciBmYWlsZWQgdGVzdHMuCisKK0NVUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorCitwcm90b2NvbHM9ImJpbmFyeSBjb21wYWN0IGpzb24iCisjIFRPRE86IGZpeCBhbmQgZW5hYmxlIGh0dHAKKyMgdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIHJhdyBodHRwIgordHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIHJhdyIKK3NlcnZlcnM9InNpbXBsZSB0YXNrcG9vbCB0aHJlYWRlZCIKK2ZyYW1lZF9vbmx5X3NlcnZlcnM9Im5vbmJsb2NraW5nIHBvb2xlZE5vbmJsb2NraW5nIgorCisjIERvbid0IGxlYXZlIGFueSBzZXJ2ZXIgaW5zdGFuY2VzIGJlaGluZCB3aGVuIGludGVycnVwdGVkIChlLmcuIGJ5IEN0cmwrQykKKyMgb3IgdGVybWluYXRlZC4KK3RyYXAgImtpbGwgJChqb2JzIC1wKSAyPi9kZXYvbnVsbCIgSU5UIFRFUk0KKworZm9yIHByb3RvY29sIGluICRwcm90b2NvbHM7IGRvCisgIGZvciBzc2wgaW4gIiIgIiAtLXNzbCI7IGRvCisgICAgZm9yIHRyYW5zcG9ydCBpbiAkdHJhbnNwb3J0czsgZG8KKyAgICAgIGZvciBzZXJ2ZXIgaW4gJHNlcnZlcnMgJGZyYW1lZF9vbmx5X3NlcnZlcnM7IGRvCisgICAgICAgIGNhc2UgJGZyYW1lZF9vbmx5X3NlcnZlcnMgaW4KKyAgICAgICAgICAqJHNlcnZlciopIGlmIFsgJHRyYW5zcG9ydCAhPSAiZnJhbWVkIiBdIHx8IFsgJHNzbCAhPSAiIiBdOyB0aGVuIGNvbnRpbnVlOyBmaTs7CisgICAgICAgIGVzYWMKKworICAgICAgICBhcmdzPSItLXRyYW5zcG9ydD0kdHJhbnNwb3J0IC0tcHJvdG9jb2w9JHByb3RvY29sJHNzbCIKKyAgICAgICAgJHtDVVJ9L3RocmlmdF90ZXN0X3NlcnZlciAkYXJncyAtLXNlcnZlci10eXBlPSRzZXJ2ZXIgPiAvZGV2L251bGwgJgorICAgICAgICBzZXJ2ZXJfcGlkPSQhCisKKyAgICAgICAgIyBHaXZlIHRoZSBzZXJ2ZXIgc29tZSB0aW1lIHRvIGdldCB1cCBhbmQgY2hlY2sgaWYgaXQgcnVucyAoeWVzLCB0aGlzCisgICAgICAgICMgaXMgYSBodWdlIGtsdWRnZSwgc2hvdWxkIGFkZCBhIGNvbm5lY3QgdGltZW91dCB0byB0ZXN0IGNsaWVudCkuCisgICAgICAgIGNsaWVudF9yYz0tMQorICAgICAgICBpZiBbICIkc2VydmVyIiA9ICJ0YXNrcG9vbCIgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDAuNQorICAgICAgICBlbHNlCisgICAgICAgICAgc2xlZXAgMC4wMgorICAgICAgICBmaQorICAgICAgICBraWxsIC0wICRzZXJ2ZXJfcGlkIDI+L2Rldi9udWxsCisgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgorICAgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9jbGllbnQgJGFyZ3MgLS1udW1UZXN0cz0xMCA+IC9kZXYvbnVsbAorICAgICAgICAgIGNsaWVudF9yYz0kPworCisgICAgICAgICAgIyBUZW1wb3JhcmlseSByZWRpcmVjdCBzdGRlcnIgdG8gbnVsbCB0byBhdm9pZCBqb2IgY29udHJvbCBtZXNzYWdlcywKKyAgICAgICAgICAjIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgICBleGVjIDM+JjIKKyAgICAgICAgICBleGVjIDI+L2Rldi9udWxsCisgICAgICAgICAga2lsbCAkc2VydmVyX3BpZAorICAgICAgICAgIGV4ZWMgMz4mMgorICAgICAgICBmaQorCisgICAgICAgICMgR2V0IHRoZSBzZXJ2ZXIgZXhpdCBjb2RlICh3YWl0IHNob3VsZCBpbW1lZGlhdGVseSByZXR1cm4pLgorICAgICAgICB3YWl0ICRzZXJ2ZXJfcGlkCisgICAgICAgIHNlcnZlcl9yYz0kPworCisgICAgICAgIGlmIFsgJGNsaWVudF9yYyAtbmUgMCAtbyAkc2VydmVyX3JjIC1lcSAxIF07IHRoZW4KKyAgICAgICAgICBlY2hvIC1lICJcblRlc3RzIGZhaWxlZCBmb3I6ICRhcmdzIC0tc2VydmVyLXR5cGU9JHNlcnZlciIKKyAgICAgICAgICBmYWlsZWQ9InRydWUiCisgICAgICAgICAgaWYgWyAiJDEiICE9ICItayIgXTsgdGhlbgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICBlY2hvIC1uICIuIgorICAgICAgICBmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorCitlY2hvCitpZiBbIC16ICIkZmFpbGVkIiBdOyB0aGVuCisgIGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuIgorZmkKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODIyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnRfdGVzdF9zZXJ2ZXI7CisKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubzsKK2ltcG9ydCBjb3JlLnN0ZGMuc2lnbmFsIDogc2lnbmFsLCBzaWdmbl90LCBTSUdJTlQsIFNJR19ERkwsIFNJR19FUlI7CitpbXBvcnQgY29yZS50aHJlYWQgOiBkdXIsIFRocmVhZDsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtIDogdG90YWxDUFVzOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBUeXBlVHVwbGUsIHN0YXRpY01hcDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuY29tcGFjdDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuanNvbjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CitpbXBvcnQgdGVzdF91dGlsczsKKworaW1wb3J0IHRocmlmdF90ZXN0X2NvbW1vbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0X3R5cGVzOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CisKK2NsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdCB7CisgIHRoaXMoYm9vbCB0cmFjZSkgeworICAgIHRyYWNlXyA9IHRyYWNlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB0ZXN0Vm9pZCgpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0Vm9pZCgpIik7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGJ5dGUgdGVzdEJ5dGUoYnl0ZSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0Qnl0ZSglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgaW50IHRlc3RJMzIoaW50IHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RJMzIoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RJNjQoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0RG91YmxlKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdGVzdEJpbmFyeShzdHJpbmcgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJpbmFyeShcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgdGVzdEJvb2woYm9vbCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0Qm9vbChcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0U3RydWN0KHJlZiBjb25zdChYdHJ1Y3QpIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJXMsICVzLCAlc30pIiwKKyAgICAgIHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIFh0cnVjdDIgdGVzdE5lc3QocmVmIGNvbnN0KFh0cnVjdDIpIG5lc3QpIHsKKyAgICBhdXRvIHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3ROZXN0KHslcywge1wiJXNcIiwgJXMsICVzLCAlc30sICVzfSkiLAorICAgICAgbmVzdC5ieXRlX3RoaW5nLCB0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywKKyAgICAgIHRoaW5nLmk2NF90aGluZywgbmVzdC5pMzJfdGhpbmcpOworICAgIHJldHVybiBuZXN0OworICB9CisKKyAgb3ZlcnJpZGUgaW50W2ludF0gdGVzdE1hcChpbnRbaW50XSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TWFwKHslc30pIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIEhhc2hTZXQhaW50IHRlc3RTZXQoSGFzaFNldCFpbnQgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdFNldCh7JXN9KSIsCisgICAgICBqb2luKG1hcCFgdG8hc3RyaW5nKGEpYCh0aGluZ1tdKSwgIiwgIikpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGludFtdIHRlc3RMaXN0KGludFtdIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RMaXN0KCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEVudW0oJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIFVzZXJJZCB0ZXN0VHlwZWRlZihVc2VySWQgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdFR5cGVkZWYoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZ1tzdHJpbmddIHRlc3RTdHJpbmdNYXAoc3RyaW5nW3N0cmluZ10gdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdFN0cmluZ01hcCglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgaW50W2ludF1baW50XSB0ZXN0TWFwTWFwKGludCBoZWxsbykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TWFwTWFwKCVzKSIsIGhlbGxvKTsKKyAgICByZXR1cm4gdGVzdE1hcE1hcFJldHVybjsKKyAgfQorCisgIG92ZXJyaWRlIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gdGVzdEluc2FuaXR5KHJlZiBjb25zdChJbnNhbml0eSkgYXJndW1lbnQpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gcmV0OworICAgIEluc2FuaXR5W051bWJlcnpdIG0xOworICAgIEluc2FuaXR5W051bWJlcnpdIG0yOworICAgIEluc2FuaXR5IHRtcDsKKyAgICB0bXAgPSBjYXN0KEluc2FuaXR5KWFyZ3VtZW50OworICAgIG0xW051bWJlcnouVFdPXSA9IHRtcDsKKyAgICBtMVtOdW1iZXJ6LlRIUkVFXSA9IHRtcDsKKyAgICBtMltOdW1iZXJ6LlNJWF0gPSBJbnNhbml0eSgpOworICAgIHJldFsxXSA9IG0xOworICAgIHJldFsyXSA9IG0yOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgc3RyaW5nW3Nob3J0XSBhcmczLAorICAgIE51bWJlcnogYXJnNCwgVXNlcklkIGFyZzUpCisgIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0TXVsdGkoKSIpOworICAgIHJldHVybiBYdHJ1Y3QoIkhlbGxvMiIsIGFyZzAsIGFyZzEsIGFyZzIpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEV4Y2VwdGlvbiglcykiLCBhcmcpOworICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikgeworICAgICAgYXV0byBlID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CisgICAgICBlLm1lc3NhZ2UgPSBhcmc7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnID09ICJURXhjZXB0aW9uIikgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PSAiQXBwbGljYXRpb25FeGNlcHRpb24iKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpIiwgYXJnMCwgYXJnMSk7CisKKyAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKSB7CisgICAgICBhdXRvIGUgPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIGUubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKSB7CisgICAgICBhdXRvIGUgPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICBlLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICBlLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgdGhyb3cgZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFh0cnVjdChhcmcxKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RPbmV3YXkoJXMpOiBTbGVlcGluZy4uLiIsIHNsZWVwRm9yKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJzZWNvbmRzIihzbGVlcEZvcikpOworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0T25ld2F5KCVzKTogZG9uZSBzbGVlcGluZyEiLCBzbGVlcEZvcik7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCB0cmFjZV87Cit9CisKK3NoYXJlZChib29sKSBnU2h1dGRvd24gPSBmYWxzZTsKKworbm90aHJvdyBAbm9nYyBleHRlcm4oQykgdm9pZCBoYW5kbGVTaWduYWwoaW50IHNpZykgeworICBnU2h1dGRvd24gPSB0cnVlOworfQorCisvLyBSdW5zIGEgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIHNodXRkb3duIHRvIGJlCisvLyBzaWduYWxlZCBhbmQgdGhlbiB0cmlnZ2VycyBjYW5jZWxsYXRpb24sCisvLyBjYXVzaW5nIHRoZSBzZXJ2ZXIgdG8gc3RvcC4gIFdoaWxlIHdlIGNvdWxkCisvLyB1c2UgYSBzaWduYWxmZCBmb3IgdGhpcyBwdXJwb3NlLCB3ZSBhcmUgaW5zdGVhZAorLy8gb3B0aW5nIGZvciBhIGJ1c3kgd2FpdGluZyBzY2hlbWUgZm9yIG1heGltdW0KKy8vIHBvcnRhYmlsaXR5IHNpbmNlIHNpZ25hbGZkIGlzIGEgbGludXggdGhpbmcuCisKK2NsYXNzIFNodXRkb3duVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbikgeworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc3VwZXIoJnJ1bik7CisgIH0KKyAgCitwcml2YXRlOgorICB2b2lkIHJ1bigpIHsKKyAgICB3aGlsZSAoIWdTaHV0ZG93bikgeworICAgICAgVGhyZWFkLnNsZWVwKGR1ciEoIm1zZWNzIikoMjUpKTsKKyAgICB9CisgICAgY2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgIH0KKyAgCisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2FuY2VsbGF0aW9uXzsKK30KKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgdXNob3J0IHBvcnQgPSA5MDkwOworICBTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7CisgIFByb3RvY29sVHlwZSBwcm90b2NvbFR5cGU7CisgIHNpemVfdCBudW1JT1RocmVhZHMgPSAxOworICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgdHJhY2UgPSB0cnVlOworICBzaXplX3QgdGFza1Bvb2xTaXplID0gdG90YWxDUFVzOworCisgIGdldG9wdChhcmdzLCAicG9ydCIsICZwb3J0LCAicHJvdG9jb2wiLCAmcHJvdG9jb2xUeXBlLCAic2VydmVyLXR5cGUiLAorICAgICZzZXJ2ZXJUeXBlLCAic3NsIiwgJnNzbCwgIm51bS1pby10aHJlYWRzIiwgJm51bUlPVGhyZWFkcywKKyAgICAidGFzay1wb29sLXNpemUiLCAmdGFza1Bvb2xTaXplLCAidHJhY2UiLCAmdHJhY2UsCisgICAgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnRUeXBlKTsKKworICBpZiAoc2VydmVyVHlwZSA9PSBTZXJ2ZXJUeXBlLm5vbmJsb2NraW5nIHx8CisgICAgc2VydmVyVHlwZSA9PSBTZXJ2ZXJUeXBlLnBvb2xlZE5vbmJsb2NraW5nCisgICkgeworICAgIGVuZm9yY2UodHJhbnNwb3J0VHlwZSA9PSBUcmFuc3BvcnRUeXBlLmZyYW1lZCwKKyAgICAgICJOZWVkIHRvIHVzZSBmcmFtZWQgdHJhbnNwb3J0IHdpdGggbm9uLWJsb2NraW5nIHNlcnZlci4iKTsKKyAgICBlbmZvcmNlKCFzc2wsICJUaGUgbm9uLWJsb2NraW5nIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFNTTCB5ZXQuIik7CisKKyAgICAvLyBEb24ndCB3cmFwIHRoZSBjb250ZW50cyBpbnRvIGFub3RoZXIgbGF5ZXIgb2YgZnJhbWluZy4KKyAgICB0cmFuc3BvcnRUeXBlID0gVHJhbnNwb3J0VHlwZS5yYXc7CisgIH0KKworICB2ZXJzaW9uIChUaHJpZnRUZXN0VGVtcGxhdGVzKSB7CisgICAgLy8gT25seSBleGVyY2lzZSB0aGUgc3BlY2lhbGl6ZWQgdGVtcGxhdGUgY29kZSBwYXRocyBpZiBleHBsaWNpdGx5IGVuYWJsZWQKKyAgICAvLyB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uIG9uIHJlZ3VsYXIgdGVzdCBzdWl0ZSBydW5zIOKAkyB0aGVyZSBzaG91bGQKKyAgICAvLyBub3QgYmUgbXVjaCB0aGF0IGNhbiBnbyB3cm9uZyB3aXRoIHRoYXQgc3BlY2lmaWNhbGx5IGFueXdheS4KKyAgICBhbGlhcyBUeXBlVHVwbGUhKFRCdWZmZXJlZFRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydCwgVFNlcnZlckh0dHBUcmFuc3BvcnQpCisgICAgICBBdmFpbGFibGVUcmFuc3BvcnRzOworICAgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgICBzdGF0aWNNYXAhKFRCaW5hcnlQcm90b2NvbCwgQXZhaWxhYmxlVHJhbnNwb3J0cyksCisgICAgICBzdGF0aWNNYXAhKFRDb21wYWN0UHJvdG9jb2wsIEF2YWlsYWJsZVRyYW5zcG9ydHMpCisgICAgKSBBdmFpbGFibGVQcm90b2NvbHM7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgVHlwZVR1cGxlISgpIEF2YWlsYWJsZVRyYW5zcG9ydHM7CisgICAgYWxpYXMgVHlwZVR1cGxlISgpIEF2YWlsYWJsZVByb3RvY29sczsKKyAgfQorCisgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworICBmaW5hbCBzd2l0Y2ggKHByb3RvY29sVHlwZSkgeworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmJpbmFyeToKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IUF2YWlsYWJsZVRyYW5zcG9ydHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5jb21wYWN0OgorICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IUF2YWlsYWJsZVRyYW5zcG9ydHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5qc29uOgorICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2xGYWN0b3J5IUF2YWlsYWJsZVRyYW5zcG9ydHM7CisgICAgICBicmVhazsKKyAgfQorCisgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIShUaHJpZnRUZXN0LCBBdmFpbGFibGVQcm90b2NvbHMpKAorICAgIG5ldyBUZXN0SGFuZGxlcih0cmFjZSkpOworCisgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OworICBpZiAoc3NsKSB7CisgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CisgICAgc3NsQ29udGV4dC5zZXJ2ZXJTaWRlID0gdHJ1ZTsKKyAgICBzc2xDb250ZXh0LmxvYWRDZXJ0aWZpY2F0ZSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQiKTsKKyAgICBzc2xDb250ZXh0LmxvYWRQcml2YXRlS2V5KCIuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleSIpOworICAgIHNzbENvbnRleHQuY2lwaGVycyA9ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiOworICAgIHNlcnZlclNvY2tldCA9IG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbENvbnRleHQpOworICB9IGVsc2UgeworICAgIHNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQpOworICB9CisKKyAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gY3JlYXRlVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRUeXBlKTsKKworICBhdXRvIHNlcnZlciA9IGNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlLCBudW1JT1RocmVhZHMsIHRhc2tQb29sU2l6ZSwKKyAgICBwcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKworICAvLyBTZXQgdXAgU0lHSU5UIHNpZ25hbCBoYW5kbGluZworICBzaWdmbl90IG9sZEhhbmRsZXIgPSBzaWduYWwoU0lHSU5ULCAmaGFuZGxlU2lnbmFsKTsKKyAgZW5mb3JjZShvbGRIYW5kbGVyICE9IFNJR19FUlIsCisgICAgIkNvdWxkIG5vdCByZXBsYWNlIHRoZSBTSUdJTlQgc2lnbmFsIGhhbmRsZXI6IGVycm5vIHswfSIuZm9ybWF0KGVycm5vKCkpKTsKKyAgCisgIC8vIFNldCB1cCBhIHNlcnZlciBjYW5jZWxsYXRpb24gdHJpZ2dlcgorICBhdXRvIGNhbmNlbCA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luKCk7CisKKyAgLy8gU2V0IHVwIGEgbGlzdGVuZXIgZm9yIHRoZSBzaHV0ZG93biBjb25kaXRpb24gLSB0aGlzIHdpbGwKKyAgLy8gd2FrZSB1cCB3aGVuIHRoZSBzaWduYWwgb2NjdXJzIGFuZCB0cmlnZ2VyIGNhbmNlbGxhdGlvbi4KKyAgYXV0byBzaHV0ZG93biA9IG5ldyBTaHV0ZG93blRocmVhZChjYW5jZWwpOworICBzaHV0ZG93bi5zdGFydCgpOworICAKKyAgLy8gU2VydmUgZnJvbSB0aGlzIHRocmVhZDsgdGhlIHNpZ25hbCB3aWxsIHN0b3AgdGhlIHNlcnZlcgorICAvLyBhbmQgY29udHJvbCB3aWxsIHJldHVybiBoZXJlCisgIHdyaXRlZmxuKCJTdGFydGluZyAlcy8lcyAlcyBUaHJpZnRUZXN0IHNlcnZlciAlc29uIHBvcnQgJXMuLi4iLCBwcm90b2NvbFR5cGUsCisgICAgdHJhbnNwb3J0VHlwZSwgc2VydmVyVHlwZSwgc3NsID8gIih1c2luZyBTU0wpICI6ICIiLCBwb3J0KTsKKyAgc2VydmVyLnNlcnZlKGNhbmNlbCk7CisgIHNodXRkb3duLmpvaW4oKTsKKyAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisgICAgCisgIHdyaXRlbG4oImRvbmUuIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQgYi9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzZTAzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZApAQCAtMCwwICsxLDgwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEV4ZXJjaXNlcyB2YXJpb3VzIHRyYW5zcG9ydHMsIGNvbWJpbmVkIHdpdGggdGhlIGJ1ZmZlcmVkL2ZyYW1lZCB3cmFwcGVycy4KKyAqCisgKiBPcmlnaW5hbGx5IHBvcnRlZCBmcm9tIHRoZSBDKysgdmVyc2lvbiwgd2l0aCBXaW5kb3dzIHN1cHBvcnQgY29kZSBhZGRlZC4KKyAqLworbW9kdWxlIHRyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb247CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZGF0ZXRpbWU7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitzdGF0aWMgaW1wb3J0IHN0ZC5maWxlOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnJhbmRvbSA6IHJuZEdlbiwgdW5pZm9ybSwgdW5wcmVkaWN0YWJsZVNlZWQ7CitpbXBvcnQgc3RkLnNvY2tldDsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnN0cmluZzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZmlsZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC56bGliOworCisvKgorICogU2l6ZSBnZW5lcmF0aW9uIGhlbHBlcnMg4oCTIHVzZWQgdG8gYmUgYWJsZSB0byBydW4gdGhlIHNhbWUgdGVzdGluZyBjb2RlCisgKiB3aXRoIGJvdGggY29uc3RhbnQgYW5kIHJhbmRvbSB0b3RhbC9jaHVuayBzaXplcy4KKyAqLworCitpbnRlcmZhY2UgU2l6ZUdlbmVyYXRvciB7CisgIHNpemVfdCBuZXh0U2l6ZSgpOworICBzdHJpbmcgdG9TdHJpbmcoKTsKK30KKworY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogU2l6ZUdlbmVyYXRvciB7CisgIHRoaXMoc2l6ZV90IHZhbHVlKSB7CisgICAgdmFsdWVfID0gdmFsdWU7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgbmV4dFNpemUoKSB7CisgICAgcmV0dXJuIHZhbHVlXzsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gdG8hc3RyaW5nKHZhbHVlXyk7CisgIH0KKworcHJpdmF0ZToKKyAgc2l6ZV90IHZhbHVlXzsKK30KKworY2xhc3MgUmFuZG9tU2l6ZUdlbmVyYXRvciA6IFNpemVHZW5lcmF0b3IgeworICB0aGlzKHNpemVfdCBtaW4sIHNpemVfdCBtYXgpIHsKKyAgICBtaW5fID0gbWluOworICAgIG1heF8gPSBtYXg7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgbmV4dFNpemUoKSB7CisgICAgcmV0dXJuIHVuaWZvcm0hIltdIihtaW5fLCBtYXhfKTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZm9ybWF0KCJyYW5kKCVzLCAlcykiLCBtaW5fLCBtYXhfKTsKKyAgfQorCisgIHNpemVfdCBtaW4oKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBtaW5fOworICB9CisKKyAgc2l6ZV90IG1heCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG1heF87CisgIH0KKworcHJpdmF0ZToKKyAgc2l6ZV90IG1pbl87CisgIHNpemVfdCBtYXhfOworfQorCisKKy8qCisgKiBDbGFzc2VzIHRvIHNldCB1cCBjb3VwbGVkIHRyYW5zcG9ydHMKKyAqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byByZXByZXNlbnQgYSBjb3VwbGVkIHBhaXIgb2YgdHJhbnNwb3J0cy4KKyAqCisgKiBEYXRhIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCB0cmFuc3BvcnQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgaW5wdXQgdHJhbnNwb3J0LgorICoKKyAqIFRoaXMgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIHZhcmlvdXMgY291cGxlZCB0cmFuc3BvcnQKKyAqIGltcGxlbWVudGF0aW9ucy4gSXQgc2hvdWxkbid0IGJlIHVzZWQgZGlyZWN0bHkuCisgKi8KK2NsYXNzIENvdXBsZWRUcmFuc3BvcnRzKFRyYW5zcG9ydCkgaWYgKGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQpIHsKKyAgVHJhbnNwb3J0IGlucHV0OworICBUcmFuc3BvcnQgb3V0cHV0OworfQorCit0ZW1wbGF0ZSBpc0NvdXBsZWRUcmFuc3BvcnRzKFQpIHsKKyAgc3RhdGljIGlmIChpcyhUIF8gOiBDb3VwbGVkVHJhbnNwb3J0cyFVLCBVKSkgeworICAgIGVudW0gaXNDb3VwbGVkVHJhbnNwb3J0cyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc0NvdXBsZWRUcmFuc3BvcnRzID0gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgY2xhc3MgZm9yIGNyZWF0aW5nIGNvdXBsZWQgdHJhbnNwb3J0cyB0aGF0IHdyYXAKKyAqIGFub3RoZXIgdHJhbnNwb3J0LgorICovCitjbGFzcyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHMoV3JhcHBlclRyYW5zcG9ydCwgSW5uZXJDb3VwbGVkVHJhbnNwb3J0cykgaWYgKAorICBpc1RUcmFuc3BvcnQhV3JhcHBlclRyYW5zcG9ydCAmJiBpc0NvdXBsZWRUcmFuc3BvcnRzIUlubmVyQ291cGxlZFRyYW5zcG9ydHMKKykgOiBDb3VwbGVkVHJhbnNwb3J0cyFXcmFwcGVyVHJhbnNwb3J0IHsKKyAgdGhpcygpIHsKKyAgICBpbm5lcl8gPSBuZXcgSW5uZXJDb3VwbGVkVHJhbnNwb3J0cygpOworICAgIGlmIChpbm5lcl8uaW5wdXQpIHsKKyAgICAgIGlucHV0ID0gbmV3IFdyYXBwZXJUcmFuc3BvcnQoaW5uZXJfLmlucHV0KTsKKyAgICB9CisgICAgaWYgKGlubmVyXy5vdXRwdXQpIHsKKyAgICAgIG91dHB1dCA9IG5ldyBXcmFwcGVyVHJhbnNwb3J0KGlubmVyXy5vdXRwdXQpOworICAgIH0KKyAgfQorCisgIH50aGlzKCkgeworICAgIGRlc3Ryb3koaW5uZXJfKTsKKyAgfQorCitwcml2YXRlOgorICBJbm5lckNvdXBsZWRUcmFuc3BvcnRzIGlubmVyXzsKK30KKworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuIDogUEFwcGx5OworYWxpYXMgUEFwcGx5IShDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHMsIFRCdWZmZXJlZFRyYW5zcG9ydCkgQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0czsKK2FsaWFzIFBBcHBseSEoQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzLCBURnJhbWVkVHJhbnNwb3J0KSBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0czsKK2FsaWFzIFBBcHBseSEoQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzLCBUWmxpYlRyYW5zcG9ydCkgQ291cGxlZFpsaWJUcmFuc3BvcnRzOworCisvKioKKyAqIENvdXBsZWQgVE1lbW9yeUJ1ZmZlcnMuCisgKi8KK2NsYXNzIENvdXBsZWRNZW1vcnlCdWZmZXJzIDogQ291cGxlZFRyYW5zcG9ydHMhVE1lbW9yeUJ1ZmZlciB7CisgIHRoaXMoKSB7CisgICAgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgICAgaW5wdXQgPSBidWY7CisgICAgb3V0cHV0ID0gYnVmOworICB9CisKKyAgVE1lbW9yeUJ1ZmZlciBidWY7Cit9CisKKy8qKgorICogQ291cGxlZCBUU29ja2V0cy4KKyAqLworY2xhc3MgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMgOiBDb3VwbGVkVHJhbnNwb3J0cyFUU29ja2V0IHsKKyAgdGhpcygpIHsKKyAgICBhdXRvIHNvY2tldHMgPSBzb2NrZXRQYWlyKCk7CisgICAgaW5wdXQgPSBuZXcgVFNvY2tldChzb2NrZXRzWzBdKTsKKyAgICBvdXRwdXQgPSBuZXcgVFNvY2tldChzb2NrZXRzWzFdKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIGlucHV0LmNsb3NlKCk7CisgICAgb3V0cHV0LmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBDb3VwbGVkIFRGaWxlVHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkRmlsZVRyYW5zcG9ydHMgOiBDb3VwbGVkVHJhbnNwb3J0cyFUVHJhbnNwb3J0IHsKKyAgdGhpcygpIHsKKyAgICAvLyBXZSBhY3R1YWxseSBuZWVkIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHRlbXAgZmlsZSBoZXJlLCBzbyB3ZSBjYW4ndCBqdXN0CisgICAgLy8gdXNlIHRoZSB1c3VhbCB0ZW1wZmlsZSBmYWNpbGl0aWVzLgorICAgIGRvIHsKKyAgICAgIGZpbGVOYW1lXyA9IHRtcERpciB+ICIvdGhyaWZ0LnRyYW5zcG9ydF90ZXN0LiIgfiB0byFzdHJpbmcocm5kR2VuKCkuZnJvbnQpOworICAgICAgcm5kR2VuKCkucG9wRnJvbnQoKTsKKyAgICB9IHdoaWxlIChzdGQuZmlsZS5leGlzdHMoZmlsZU5hbWVfKSk7CisKKyAgICB3cml0ZWZsbigiVXNpbmcgdGVtcCBmaWxlOiAlcyIsIGZpbGVOYW1lXyk7CisKKyAgICBhdXRvIHdyaXRlciA9IG5ldyBURmlsZVdyaXRlclRyYW5zcG9ydChmaWxlTmFtZV8pOworICAgIHdyaXRlci5vcGVuKCk7CisgICAgb3V0cHV0ID0gd3JpdGVyOworCisgICAgLy8gV2FpdCB1bnRpbCB0aGUgZmlsZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgIHdyaXRlci5mbHVzaCgpOworCisgICAgYXV0byByZWFkZXIgPSBuZXcgVEZpbGVSZWFkZXJUcmFuc3BvcnQoZmlsZU5hbWVfKTsKKyAgICByZWFkZXIub3BlbigpOworICAgIHJlYWRlci5yZWFkVGltZW91dChkdXIhIm1zZWNzIigtMSkpOworICAgIGlucHV0ID0gcmVhZGVyOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgaW5wdXQuY2xvc2UoKTsKKyAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICBzdGQuZmlsZS5yZW1vdmUoZmlsZU5hbWVfKTsKKyAgfQorCisgIHN0YXRpYyBzdHJpbmcgdG1wRGlyOworCitwcml2YXRlOgorICBzdHJpbmcgZmlsZU5hbWVfOworfQorCisKKy8qCisgKiBUZXN0IGZ1bmN0aW9ucworICovCisKKy8qKgorICogVGVzdCBpbnRlcmxlYXZlZCB3cml0ZSBhbmQgcmVhZCBjYWxscy4KKyAqCisgKiBHZW5lcmF0ZXMgYSBidWZmZXIgdG90YWxTaXplIGJ5dGVzIGxvbmcsIHRoZW4gd3JpdGVzIGl0IHRvIHRoZSB0cmFuc3BvcnQsCisgKiBhbmQgdmVyaWZpZXMgdGhlIHdyaXR0ZW4gZGF0YSBjYW4gYmUgcmVhZCBiYWNrIGNvcnJlY3RseS4KKyAqCisgKiBNb2RlIG9mIG9wZXJhdGlvbjoKKyAqIC0gY2FsbCB3Q2h1bmtHZW5lcmF0b3IgdG8gZmlndXJlIG91dCBob3cgbGFyZ2Ugb2YgYSBjaHVuayB0byB3cml0ZQorICogICAtIGNhbGwgd1NpemVHZW5lcmF0b3IgdG8gZ2V0IHRoZSBzaXplIGZvciBpbmRpdmlkdWFsIHdyaXRlKCkgY2FsbHMsCisgKiAgICAgYW5kIGRvIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW50aXJlIGNodW5rIGlzIHdyaXR0ZW4uCisgKiAtIGNhbGwgckNodW5rR2VuZXJhdG9yIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIG9mIGEgY2h1bmsgdG8gcmVhZAorICogICAtIGNhbGwgclNpemVHZW5lcmF0b3IgdG8gZ2V0IHRoZSBzaXplIGZvciBpbmRpdmlkdWFsIHJlYWQoKSBjYWxscywKKyAqICAgICBhbmQgZG8gdGhpcyByZXBlYXRlZGx5IHVudGlsIHRoZSBlbnRpcmUgY2h1bmsgaXMgcmVhZC4KKyAqIC0gcmVwZWF0IHVudGlsIHRoZSBmdWxsIGJ1ZmZlciBpcyB3cml0dGVuIGFuZCByZWFkIGJhY2ssCisgKiAgIHRoZW4gY29tcGFyZSB0aGUgZGF0YSByZWFkIGJhY2sgYWdhaW5zdCB0aGUgb3JpZ2luYWwgYnVmZmVyCisgKgorICoKKyAqIC0gSWYgYW55IG9mIHRoZSBzaXplIGdlbmVyYXRvcnMgcmV0dXJuIDAsIHRoaXMgbWVhbnMgdG8gdXNlIHRoZSBtYXhpbXVtCisgKiAgIHBvc3NpYmxlIHNpemUuCisgKgorICogLSBJZiBtYXhPdXRzdGFuZGluZyBpcyBub24temVybywgd3JpdGUgY2h1bmsgc2l6ZXMgd2lsbCBiZSBjaG9zZW4gc3VjaCB0aGF0CisgKiAgIHRoZXJlIGFyZSBuZXZlciBtb3JlIHRoYW4gbWF4T3V0c3RhbmRpbmcgYnl0ZXMgd2FpdGluZyB0byBiZSByZWFkIGJhY2suCisgKi8KK3ZvaWQgdGVzdFJlYWRXcml0ZShDb3VwbGVkVHJhbnNwb3J0cykoCisgIHNpemVfdCB0b3RhbFNpemUsCisgIFNpemVHZW5lcmF0b3Igd1NpemVHZW5lcmF0b3IsCisgIFNpemVHZW5lcmF0b3IgclNpemVHZW5lcmF0b3IsCisgIFNpemVHZW5lcmF0b3Igd0NodW5rR2VuZXJhdG9yLAorICBTaXplR2VuZXJhdG9yIHJDaHVua0dlbmVyYXRvciwKKyAgc2l6ZV90IG1heE91dHN0YW5kaW5nCispIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICBhdXRvIHdidWYgPSBuZXcgdWJ5dGVbdG90YWxTaXplXTsKKyAgYXV0byByYnVmID0gbmV3IHVieXRlW3RvdGFsU2l6ZV07CisKKyAgLy8gU3RvcmUgc29tZSBkYXRhIGluIHdidWYuCisgIGZvcmVhY2ggKGksIHJlZiBiOyB3YnVmKSB7CisgICAgYiA9IGkgJiAweGZmOworICB9CisKKyAgc2l6ZV90IHRvdGFsV3JpdHRlbjsKKyAgc2l6ZV90IHRvdGFsUmVhZDsKKyAgd2hpbGUgKHRvdGFsUmVhZCA8IHRvdGFsU2l6ZSkgeworICAgIC8vIERldGVybWluZSBob3cgbGFyZ2UgYSBjaHVuayBvZiBkYXRhIHRvIHdyaXRlLgorICAgIGF1dG8gd0NodW5rU2l6ZSA9IHdDaHVua0dlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgIGlmICh3Q2h1bmtTaXplID09IDAgfHwgd0NodW5rU2l6ZSA+IHRvdGFsU2l6ZSAtIHRvdGFsV3JpdHRlbikgeworICAgICAgd0NodW5rU2l6ZSA9IHRvdGFsU2l6ZSAtIHRvdGFsV3JpdHRlbjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgKHRvdGFsV3JpdHRlbiAtIHRvdGFsUmVhZCkgKyB3Q2h1bmtTaXplIGlzIGxlc3MgdGhhbgorICAgIC8vIG1heE91dHN0YW5kaW5nLgorICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYKKyAgICAgICAgd0NodW5rU2l6ZSA+IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsV3JpdHRlbiAtIHRvdGFsUmVhZCkpIHsKKyAgICAgIHdDaHVua1NpemUgPSBtYXhPdXRzdGFuZGluZyAtICh0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBjaHVuay4KKyAgICBzaXplX3QgY2h1bmtXcml0dGVuID0gMDsKKyAgICB3aGlsZSAoY2h1bmtXcml0dGVuIDwgd0NodW5rU2l6ZSkgeworICAgICAgYXV0byB3cml0ZVNpemUgPSB3U2l6ZUdlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgICAgaWYgKHdyaXRlU2l6ZSA9PSAwIHx8IHdyaXRlU2l6ZSA+IHdDaHVua1NpemUgLSBjaHVua1dyaXR0ZW4pIHsKKyAgICAgICAgd3JpdGVTaXplID0gd0NodW5rU2l6ZSAtIGNodW5rV3JpdHRlbjsKKyAgICAgIH0KKworICAgICAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod2J1Zlt0b3RhbFdyaXR0ZW4gLi4gdG90YWxXcml0dGVuICsgd3JpdGVTaXplXSk7CisgICAgICBjaHVua1dyaXR0ZW4gKz0gd3JpdGVTaXplOworICAgICAgdG90YWxXcml0dGVuICs9IHdyaXRlU2l6ZTsKKyAgICB9CisKKyAgICAvLyBGbHVzaCB0aGUgZGF0YSwgc28gaXQgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIHJlYWQgdHJhbnNwb3J0CisgICAgLy8gRG9uJ3QgZmx1c2ggaWYgd0NodW5rU2l6ZSBpcyAwLiAoVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYKKyAgICAvLyB0b3RhbFdyaXR0ZW4gPT0gdG90YWxTaXplIGFscmVhZHksIGFuZCB3ZSdyZSBvbmx5IHJlYWRpbmcgbm93LikKKyAgICBpZiAod0NodW5rU2l6ZSA+IDApIHsKKyAgICAgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGhvdyBsYXJnZSBhIGNodW5rIG9mIGRhdGEgdG8gcmVhZCBiYWNrLgorICAgIGF1dG8gckNodW5rU2l6ZSA9IHJDaHVua0dlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgIGlmIChyQ2h1bmtTaXplID09IDAgfHwgckNodW5rU2l6ZSA+IHRvdGFsV3JpdHRlbiAtIHRvdGFsUmVhZCkgeworICAgICAgckNodW5rU2l6ZSA9IHRvdGFsV3JpdHRlbiAtIHRvdGFsUmVhZDsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBjaHVuay4KKyAgICBzaXplX3QgY2h1bmtSZWFkOworICAgIHdoaWxlIChjaHVua1JlYWQgPCByQ2h1bmtTaXplKSB7CisgICAgICBhdXRvIHJlYWRTaXplID0gclNpemVHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICAgIGlmIChyZWFkU2l6ZSA9PSAwIHx8IHJlYWRTaXplID4gckNodW5rU2l6ZSAtIGNodW5rUmVhZCkgeworICAgICAgICByZWFkU2l6ZSA9IHJDaHVua1NpemUgLSBjaHVua1JlYWQ7CisgICAgICB9CisKKyAgICAgIHNpemVfdCBieXRlc1JlYWQ7CisgICAgICB0cnkgeworICAgICAgICBieXRlc1JlYWQgPSB0cmFuc3BvcnRzLmlucHV0LnJlYWQoCisgICAgICAgICAgcmJ1Zlt0b3RhbFJlYWQgLi4gdG90YWxSZWFkICsgcmVhZFNpemVdKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGZvcm1hdChgcmVhZChwb3MgPSAlcywgc2l6ZSA9ICVzKSB0aHJldyBgIH4KKyAgICAgICAgICBgZXhjZXB0aW9uICIlcyI7IHdyaXR0ZW4gc28gZmFyOiAlcy8lcyBieXRlc2AsIHRvdGFsUmVhZCwgcmVhZFNpemUsCisgICAgICAgICAgZS5tc2csIHRvdGFsV3JpdHRlbiwgdG90YWxTaXplKSk7CisgICAgICB9CisKKyAgICAgIGVuZm9yY2UoYnl0ZXNSZWFkID4gMCwgZm9ybWF0KGByZWFkKHBvcyA9ICVzLCBzaXplID0gJXMpIHJldHVybmVkICVzOyBgIH4KKyAgICAgICAgYHdyaXR0ZW4gc28gZmFyOiAlcy8lcyBieXRlc2AsIHRvdGFsUmVhZCwgcmVhZFNpemUsIGJ5dGVzUmVhZCwKKyAgICAgICAgdG90YWxXcml0dGVuLCB0b3RhbFNpemUpKTsKKworICAgICAgY2h1bmtSZWFkICs9IGJ5dGVzUmVhZDsKKyAgICAgIHRvdGFsUmVhZCArPSBieXRlc1JlYWQ7CisgICAgfQorICB9CisKKyAgLy8gbWFrZSBzdXJlIHRoZSBkYXRhIHJlYWQgYmFjayBpcyBpZGVudGljYWwgdG8gdGhlIGRhdGEgd3JpdHRlbgorICBpZiAocmJ1ZiAhPSB3YnVmKSB7CisgICAgc3RkZXJyLndyaXRlZmxuKCIlcyB2cy4gJXMiLCB3YnVmWyQgLSA0IC4uICRdLCByYnVmWyQgLSA0IC4uICRdKTsKKyAgICBzdGRlcnIud3JpdGVmbG4oInJidWY6ICVzIHZzLiB3YnVmOiAlcyIsIHJidWYubGVuZ3RoLCB3YnVmLmxlbmd0aCk7CisgIH0KKyAgZW5mb3JjZShyYnVmID09IHdidWYpOworfQorCit2b2lkIHRlc3RSZWFkUGFydEF2YWlsYWJsZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgdWJ5dGVbMTBdIHdyaXRlQnVmID0gJ2EnOworICB1Ynl0ZVsxMF0gcmVhZEJ1ZjsKKworICAvLyBBdHRlbXBpbmcgdG8gcmVhZCAxMCBieXRlcyB3aGVuIG9ubHkgOSBhcmUgYXZhaWxhYmxlIHNob3VsZCByZXR1cm4gOQorICAvLyBpbW1lZGlhdGVseS4KKyAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod3JpdGVCdWZbMCAuLiA5XSk7CisgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDMpLCB0cmFuc3BvcnRzLm91dHB1dCwgMSk7CisgIGF1dG8gYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKHJlYWRCdWYpOworICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7CisgIGVuZm9yY2UoYnl0ZXNSZWFkID09IDkpOworfQorCit2b2lkIHRlc3RSZWFkUGFydGlhbE1pZGZyYW1lKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICB1Ynl0ZVsxM10gd3JpdGVCdWYgPSAnYSc7CisgIHVieXRlWzE0XSByZWFkQnVmOworCisgIC8vIEF0dGVtcHQgdG8gcmVhZCAxMCBieXRlcywgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSwgYnV0IGFmdGVyIHdlIGhhdmUKKyAgLy8gYWxyZWFkeSByZWFkIHBhcnQgb2YgdGhlIGRhdGEgdGhhdCBpcyBhdmFpbGFibGUuICBUaGlzIGV4ZXJjaXNlcyBhCisgIC8vIGRpZmZlcmVudCBjb2RlIHBhdGggZm9yIHNldmVyYWwgb2YgdGhlIHRyYW5zcG9ydHMuCisgIC8vCisgIC8vIEZvciB0cmFuc3BvcnRzIHRoYXQgYWRkIHRoZWlyIG93biBmcmFtaW5nIChlLmcuLCBURnJhbWVkVHJhbnNwb3J0IGFuZAorICAvLyBURmlsZVRyYW5zcG9ydCksIHRoZSB0d28gZmx1c2ggY2FsbHMgYnJlYWsgdXAgdGhlIGRhdGEgaW4gdG8gYSAxMCBieXRlCisgIC8vIGZyYW1lIGFuZCBhIDMgYnl0ZSBmcmFtZS4gIFRoZSBmaXJzdCByZWFkIHRoZW4gcHV0cyB1cyBwYXJ0d2F5IHRocm91Z2ggdGhlCisgIC8vIGZpcnN0IGZyYW1lLCBhbmQgdGhlbiB3ZSBhdHRlbXB0IHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoYXQgZnJhbWUsIGFuZAorICAvLyB0aHJvdWdoIHRoZSBuZXh0IGZyYW1lLCB0b28uCisgIC8vCisgIC8vIEZvciBidWZmZXJlZCB0cmFuc3BvcnRzIHRoYXQgcGVyZm9ybSByZWFkLWFoZWFkIChlLmcuLAorICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQpLCB0aGUgcmVhZC1haGVhZCB3aWxsIG1vc3QgbGlrZWx5IHNlZSBhbGwgMTMgYnl0ZXMKKyAgLy8gd3JpdHRlbiBvbiB0aGUgZmlyc3QgcmVhZC4gIFRoZSBuZXh0IHJlYWQgd2lsbCB0aGVuIGF0dGVtcHQgdG8gcmVhZCBwYXN0CisgIC8vIHRoZSBlbmQgb2YgdGhlIHJlYWQtYWhlYWQgYnVmZmVyLgorICAvLworICAvLyBGbHVzaCAxMCBieXRlcywgdGhlbiAzIGJ5dGVzLiAgVGhpcyBjcmVhdGVzIDIgc2VwYXJhdGUgZnJhbWVzIGZvcgorICAvLyB0cmFuc3BvcnRzIHRoYXQgdHJhY2sgZnJhbWluZyBpbnRlcm5hbGx5LgorICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1ZlswIC4uIDEwXSk7CisgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdyaXRlQnVmWzEwIC4uIDEzXSk7CisgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisKKyAgLy8gTm93IHJlYWQgNCBieXRlcywgc28gdGhhdCB3ZSBhcmUgcGFydHdheSB0aHJvdWdoIHRoZSB3cml0dGVuIGRhdGEuCisgIGF1dG8gYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKHJlYWRCdWZbMCAuLiA0XSk7CisgIGVuZm9yY2UoYnl0ZXNSZWFkID09IDQpOworCisgIC8vIE5vdyBhdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMuICBPbmx5IDkgbW9yZSBhcmUgYXZhaWxhYmxlLgorICAvLworICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIDkgYnl0ZXMsIGJ1dCBpdCBtaWdodCB0YWtlIG11bHRpcGxlIHJlYWQKKyAgLy8gY2FsbHMsIHNpbmNlIGl0IGlzIHZhbGlkIGZvciByZWFkKCkgdG8gcmV0dXJuIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkLgorICAvLyAoTW9zdCB0cmFuc3BvcnRzIGRvIGltbWVkaWF0ZWx5IHJldHVybiA5IGJ5dGVzLCBidXQgdGhlIGZyYW1pbmcgdHJhbnNwb3J0cworICAvLyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGlzIDYgYnl0ZXMgaW4KKyAgLy8gdGhpcyBjYXNlLikKKyAgc2l6ZV90IHRvdGFsUmVhZCA9IDA7CisgIHdoaWxlICh0b3RhbFJlYWQgPCA5KSB7CisgICAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDMpLCB0cmFuc3BvcnRzLm91dHB1dCwgMSk7CisgICAgYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKHJlYWRCdWZbNCArIHRvdGFsUmVhZCAuLiAxNF0pOworICAgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKKyAgICBlbmZvcmNlKGJ5dGVzUmVhZCA+IDApOworICAgIHRvdGFsUmVhZCArPSBieXRlc1JlYWQ7CisgICAgZW5mb3JjZSh0b3RhbFJlYWQgPD0gOSk7CisgIH0KKworICBlbmZvcmNlKHRvdGFsUmVhZCA9PSA5KTsKK30KKwordm9pZCB0ZXN0Qm9ycm93UGFydEF2YWlsYWJsZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgdWJ5dGVbOV0gd3JpdGVCdWYgPSAnYSc7CisgIHVieXRlWzEwXSByZWFkQnVmOworCisgIC8vIEF0dGVtcGluZyB0byBib3Jyb3cgMTAgYnl0ZXMgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSBzaG91bGQgcmV0dXJuIE5VTEwKKyAgLy8gaW1tZWRpYXRlbHkuCisgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdyaXRlQnVmKTsKKyAgdHJhbnNwb3J0cy5vdXRwdXQuZmx1c2goKTsKKworICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMyksIHRyYW5zcG9ydHMub3V0cHV0LCAxKTsKKyAgYXV0byBib3Jyb3dMZW4gPSByZWFkQnVmLmxlbmd0aDsKKyAgYXV0byBib3Jyb3dlZEJ1ZiA9IHRyYW5zcG9ydHMuaW5wdXQuYm9ycm93KHJlYWRCdWYucHRyLCBib3Jyb3dMZW4pOworICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7CisgIGVuZm9yY2UoYm9ycm93ZWRCdWYgaXMgbnVsbCk7Cit9CisKK3ZvaWQgdGVzdFJlYWROb25lQXZhaWxhYmxlKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICAvLyBBdHRlbXB0aW5nIHRvIHJlYWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZWl0aGVyIGJsb2NrIHVudGlsCisgIC8vIHNvbWUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIGZhaWwgaW1tZWRpYXRlbHkuICAoZS5nLiwgVFNvY2tldCBibG9ja3MsCisgIC8vIFRNZW1vcnlCdWZmZXIganVzdCBmYWlscy4pCisgIC8vCisgIC8vIElmIHRoZSB0cmFuc3BvcnQgYmxvY2tzLCBpdCBzaG91bGQgc3VjY2VlZCBvbmNlIHNvbWUgZGF0YSBpcyBhdmFpbGFibGUsCisgIC8vIGV2ZW4gaWYgbGVzcyB0aGFuIHRoZSBhbW91bnQgcmVxdWVzdGVkIGJlY29tZXMgYXZhaWxhYmxlLgorICB1Ynl0ZVsxMF0gcmVhZEJ1ZjsKKworICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMSksIHRyYW5zcG9ydHMub3V0cHV0LCAyKTsKKyAgdC5hZGQoZHVyISJzZWNvbmRzIigxKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDgpOworCisgIGF1dG8gYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKHJlYWRCdWYpOworICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7CisgIH0gZWxzZSB7CisgICAgZW5mb3JjZSh0LmZpcmVkID09IDEpOworICAgIGVuZm9yY2UoYnl0ZXNSZWFkID09IDIpOworICB9Cit9CisKK3ZvaWQgdGVzdEJvcnJvd05vbmVBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzE2XSB3cml0ZUJ1ZiA9ICdhJzsKKworICAvLyBBdHRlbXB0aW5nIHRvIGJvcnJvdyB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHNob3VsZCBmYWlsIGltbWVkaWF0ZWx5CisgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigxKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEwKTsKKworICBhdXRvIGJvcnJvd0xlbiA9IDEwOworICBhdXRvIGJvcnJvd2VkQnVmID0gdHJhbnNwb3J0cy5pbnB1dC5ib3Jyb3cobnVsbCwgYm9ycm93TGVuKTsKKyAgZW5mb3JjZShib3Jyb3dlZEJ1ZiBpcyBudWxsKTsKKyAgZW5mb3JjZSh0LmZpcmVkID09IDApOworfQorCisKK3ZvaWQgZG9Sd1Rlc3QoQ291cGxlZFRyYW5zcG9ydHMpKAorICBzaXplX3QgdG90YWxTaXplLAorICBTaXplR2VuZXJhdG9yIHdTaXplR2VuLAorICBTaXplR2VuZXJhdG9yIHJTaXplR2VuLAorICBTaXplR2VuZXJhdG9yIHdDaHVua1NpemVHZW4gPSBuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDApLAorICBTaXplR2VuZXJhdG9yIHJDaHVua1NpemVHZW4gPSBuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDApLAorICBzaXplX3QgbWF4T3V0c3RhbmRpbmcgPSAwCispIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHRvdGFsU2l6ZSA9IGNhc3Qoc2l6ZV90KSh0b3RhbFNpemUgKiBnX3NpemVNdWx0aXBsaWVyKTsKKworICBzY29wZShmYWlsdXJlKSB7CisgICAgd3JpdGVmbG4oIlRlc3QgZmFpbGVkIGZvciAlczogdGVzdFJlYWRXcml0ZSglcywgJXMsICVzLCAlcywgJXMsICVzKSIsCisgICAgICBDb3VwbGVkVHJhbnNwb3J0cy5zdHJpbmdvZiwgdG90YWxTaXplLCB3U2l6ZUdlbiwgclNpemVHZW4sCisgICAgICB3Q2h1bmtTaXplR2VuLCByQ2h1bmtTaXplR2VuLCBtYXhPdXRzdGFuZGluZyk7CisgIH0KKworICB0ZXN0UmVhZFdyaXRlIUNvdXBsZWRUcmFuc3BvcnRzKHRvdGFsU2l6ZSwgd1NpemVHZW4sIHJTaXplR2VuLAorICAgIHdDaHVua1NpemVHZW4sIHJDaHVua1NpemVHZW4sIG1heE91dHN0YW5kaW5nKTsKK30KKwordm9pZCBkb0Jsb2NraW5nVGVzdChDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICB2b2lkIHdyaXRlRmFpbHVyZShzdHJpbmcgbmFtZSkgeworICAgIHdyaXRlZmxuKCJUZXN0IGZhaWxlZCBmb3IgJXM6ICVzKCkiLCBDb3VwbGVkVHJhbnNwb3J0cy5zdHJpbmdvZiwgbmFtZSk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0UmVhZFBhcnRBdmFpbGFibGUiKTsKKyAgICB0ZXN0UmVhZFBhcnRBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RSZWFkUGFydGlhbE1pZGZyYW1lIik7CisgICAgdGVzdFJlYWRQYXJ0aWFsTWlkZnJhbWUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RSZWFkTm9uZUF2YWxpYWJsZSIpOworICAgIHRlc3RSZWFkTm9uZUF2YWlsYWJsZSFDb3VwbGVkVHJhbnNwb3J0cygpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdEJvcnJvd1BhcnRBdmFpbGFibGUiKTsKKyAgICB0ZXN0Qm9ycm93UGFydEF2YWlsYWJsZSFDb3VwbGVkVHJhbnNwb3J0cygpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdEJvcnJvd05vbmVBdmFpbGFibGUiKTsKKyAgICB0ZXN0Qm9ycm93Tm9uZUF2YWlsYWJsZSFDb3VwbGVkVHJhbnNwb3J0cygpOworICB9Cit9CisKK1NpemVHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKFQpKFQgdCkgeworICBzdGF0aWMgaWYgKGlzKFQgOiBTaXplR2VuZXJhdG9yKSkgeworICAgIHJldHVybiB0OworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHQpOworICB9Cit9CisKK3RlbXBsYXRlIFdyYXBwZWRUcmFuc3BvcnRzKFQpIGlmIChpc0NvdXBsZWRUcmFuc3BvcnRzIVQpIHsKKyAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICBULAorICAgIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHMhVCwKKyAgICBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cyFULAorICAgIENvdXBsZWRabGliVHJhbnNwb3J0cyFUCisgICkgV3JhcHBlZFRyYW5zcG9ydHM7Cit9CisKK3ZvaWQgdGVzdFJ3KEMsIFIsIFMpKAorICBzaXplX3QgdG90YWxTaXplLAorICBSIHdTaXplLAorICBTIHJTaXplCispIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDICYmIGlzKHR5cGVvZihnZXRHZW5lcmF0b3Iod1NpemUpKSkgJiYKKyAgaXModHlwZW9mKGdldEdlbmVyYXRvcihyU2l6ZSkpKQorKSB7CisgIHRlc3RSdyFDKHRvdGFsU2l6ZSwgd1NpemUsIHJTaXplLCAwLCAwLCAwKTsKK30KKwordm9pZCB0ZXN0UncoQywgUiwgUywgVCwgVSkoCisgIHNpemVfdCB0b3RhbFNpemUsCisgIFIgd1NpemUsCisgIFMgclNpemUsCisgIFQgd0NodW5rU2l6ZSwKKyAgVSByQ2h1bmtTaXplLAorICBzaXplX3QgbWF4T3V0c3RhbmRpbmcgPSAwCispIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDICYmIGlzKHR5cGVvZihnZXRHZW5lcmF0b3Iod1NpemUpKSkgJiYKKyAgaXModHlwZW9mKGdldEdlbmVyYXRvcihyU2l6ZSkpKSAmJiBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHdDaHVua1NpemUpKSkgJiYKKyAgaXModHlwZW9mKGdldEdlbmVyYXRvcihyQ2h1bmtTaXplKSkpCispIHsKKyAgZm9yZWFjaCAoVDsgV3JhcHBlZFRyYW5zcG9ydHMhQykgeworICAgIGRvUndUZXN0IVQoCisgICAgICB0b3RhbFNpemUsCisgICAgICBnZXRHZW5lcmF0b3Iod1NpemUpLAorICAgICAgZ2V0R2VuZXJhdG9yKHJTaXplKSwKKyAgICAgIGdldEdlbmVyYXRvcih3Q2h1bmtTaXplKSwKKyAgICAgIGdldEdlbmVyYXRvcihyQ2h1bmtTaXplKSwKKyAgICAgIG1heE91dHN0YW5kaW5nCisgICAgKTsKKyAgfQorfQorCit2b2lkIHRlc3RCbG9ja2luZyhDKSgpIGlmIChpc0NvdXBsZWRUcmFuc3BvcnRzIUMpIHsKKyAgZm9yZWFjaCAoVDsgV3JhcHBlZFRyYW5zcG9ydHMhQykgeworICAgIGRvQmxvY2tpbmdUZXN0IVQoKTsKKyAgfQorfQorCisvLyBBIHF1aWNrIGhhY2ssIGZvciB0aGUgc2FrZSBvZiBicmV2aXR54oCmCitmbG9hdCBnX3NpemVNdWx0aXBsaWVyID0gMTsKKwordmVyc2lvbiAoUG9zaXgpIHsKKyAgaW1tdXRhYmxlIGRlZmF1bHRUZW1wRGlyID0gIi90bXAiOworfSBlbHNlIHZlcnNpb24gKFdpbmRvd3MpIHsKKyAgaW1wb3J0IGNvcmUuc3lzLndpbmRvd3Mud2luZG93czsKKyAgZXh0ZXJuKFdpbmRvd3MpIERXT1JEIEdldFRlbXBQYXRoQShEV09SRCBuQnVmZmVyTGVuZ3RoLCBMUFRTVFIgbHBCdWZmZXIpOworCisgIHN0cmluZyBkZWZhdWx0VGVtcERpcigpIEBwcm9wZXJ0eSB7CisgICAgY2hhcltNQVhfUEFUSCArIDFdIGRpcjsKKyAgICBlbmZvcmNlKEdldFRlbXBQYXRoQShkaXIubGVuZ3RoLCBkaXIucHRyKSk7CisgICAgcmV0dXJuIHRvIXN0cmluZyhkaXIucHRyKVswIC4uICQgLSAxXTsKKyAgfQorfSBlbHNlIHN0YXRpYyBhc3NlcnQoZmFsc2UpOworCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICBpbnQgc2VlZCA9IHVucHJlZGljdGFibGVTZWVkKCk7CisgIHN0cmluZyB0bXBEaXIgPSBkZWZhdWx0VGVtcERpcjsKKworICBnZXRvcHQoYXJncywgInNlZWQiLCAmc2VlZCwgInNpemUtbXVsdGlwbGllciIsICZnX3NpemVNdWx0aXBsaWVyLAorICAgICJ0bXAtZGlyIiwgJnRtcERpcik7CisgIGVuZm9yY2UoZ19zaXplTXVsdGlwbGllciA+PSAwLCAiU2l6ZSBtdWx0aXBsaWVyIG11c3Qgbm90IGJlIG5lZ2F0aXZlLiIpOworCisgIHdyaXRlZmxuKCJVc2luZyBzZWVkOiAlcyIsIHNlZWQpOworICBybmRHZW4oKS5zZWVkKHNlZWQpOworICBDb3VwbGVkRmlsZVRyYW5zcG9ydHMudG1wRGlyID0gdG1wRGlyOworCisgIGF1dG8gcmFuZDRrID0gbmV3IFJhbmRvbVNpemVHZW5lcmF0b3IoMSwgNDA5Nik7CisKKyAgLyoKKyAgICogV2UgZG8gdGhlIGJhc2ljYWxseSB0aGUgc2FtZSBzZXQgb2YgdGVzdHMgZm9yIGVhY2ggdHJhbnNwb3J0IHR5cGUsCisgICAqIGFsdGhvdWdoIHdlIHR3ZWFrIHRoZSBwYXJhbWV0ZXJzIGluIHNvbWUgcGxhY2VzLgorICAgKi8KKworICAvLyBUTWVtb3J5QnVmZmVyIHRlc3RzCisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMTAyNCwgMCwgMCk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMTYsIDEsIDEpOworCisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgIHRlc3RCbG9ja2luZyFDb3VwbGVkTWVtb3J5QnVmZmVycygpOworCisgIC8vIFRTb2NrZXQgdGVzdHMKKyAgZW51bSBzb2NrZXRNYXhPdXRzdGFuZGluZyA9IDQwOTY7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMTAyNCwgMCwgMCwKKyAgICAgICAgICAwLCAwLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywKKyAgICAgICAgICAwLCAwLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCAxNjcsIDE2MywKKyAgICAgICAgICAwLCAwLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIC8vIERvaC4gIEFwcGFyZW50bHkgd3JpdGluZyB0byBhIHNvY2tldCBoYXMgc29tZSBhZGRpdGlvbmFsIG92ZXJoZWFkIGZvcgorICAvLyBlYWNoIHNlbmQoKSBjYWxsLiAgSWYgd2UgaGF2ZSBtb3JlIHRoYW4gfjQwMCBvdXRzdGFuZGluZyAxLWJ5dGUgd3JpdGUKKyAgLy8gcmVxdWVzdHMsIGFkZGl0aW9uYWwgc2VuZCgpIGNhbGxzIHN0YXJ0IGJsb2NraW5nLgorICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxLAorICAgICAgICAgIDAsIDAsIDI1MCk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCAwLCAwLAorICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgMjUwKTsKKworICB0ZXN0QmxvY2tpbmchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKTsKKworICAvLyBGaWxlIHRyYW5zcG9ydCB0ZXN0cy4KKworICAvLyBDYW5ub3Qgd3JpdGUgbW9yZSB0aGFuIHRoZSBmcmFtZSBzaXplIGF0IG9uY2UuCisgIGVudW0gbWF4V3JpdGVBdE9uY2UgPSAxMDI0ICogMTAyNCAqIDE2IC0gNDsKKworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAxMDI0LCBtYXhXcml0ZUF0T25jZSwgMCk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMTYsIDEsIDEpOworCisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICB0ZXN0QmxvY2tpbmchQ291cGxlZEZpbGVUcmFuc3BvcnRzKCk7Cit9CisKKworLyoKKyAqIFRpbWVyIGhhbmRsaW5nIGNvZGUgZm9yIHVzZSBpbiB0ZXN0cyB0aGF0IGNoZWNrIHRoZSB0cmFuc3BvcnQgYmxvY2tpbmcKKyAqIHNlbWFudGljcy4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gaGFja2VkIHRvZ2V0aGVyIGluIGEgaHVycnkgYW5kIHdhc3RlcyBhIGxvdCBvZgorICogdGhyZWFkcywgYnV0IHNwZWVkIHNob3VsZCBub3QgYmUgdGhlIGNvbmNlcm4gaGVyZS4KKyAqLworCitzdHJ1Y3QgVHJpZ2dlciB7CisgIHRoaXMoRHVyYXRpb24gdGltZW91dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHNpemVfdCB3cml0ZUxlbmd0aCkgeworICAgIG11dGV4XyA9IG5ldyBNdXRleDsKKyAgICBjYW5jZWxDb25kaXRpb25fID0gbmV3IENvbmRpdGlvbihtdXRleF8pOworICAgIGluZm9fID0gbmV3IEluZm8odGltZW91dCwgdHJhbnNwb3J0LCB3cml0ZUxlbmd0aCk7CisgICAgc3RhcnRUaHJlYWQoKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBpbmZvXyA9IG51bGw7CisgICAgICBjYW5jZWxDb25kaXRpb25fLm5vdGlmeUFsbCgpOworICAgIH0KKyAgICBpZiAodGhyZWFkXykgdGhyZWFkXy5qb2luKCk7CisgIH0KKworICBAZGlzYWJsZSB0aGlzKHRoaXMpIHsgYXNzZXJ0KDApOyB9CisKKyAgdm9pZCBhZGQoRHVyYXRpb24gdGltZW91dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHNpemVfdCB3cml0ZUxlbmd0aCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBhdXRvIGluZm8gPSBuZXcgSW5mbyh0aW1lb3V0LCB0cmFuc3BvcnQsIHdyaXRlTGVuZ3RoKTsKKyAgICAgIGlmIChpbmZvXykgeworICAgICAgICBhdXRvIHByZXYgPSBpbmZvXzsKKyAgICAgICAgd2hpbGUgKHByZXYubmV4dCkgcHJldiA9IHByZXYubmV4dDsKKyAgICAgICAgcHJldi5uZXh0ID0gaW5mbzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZm9fID0gaW5mbzsKKyAgICAgICAgc3RhcnRUaHJlYWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAcHJvcGVydHkgc2hvcnQgZmlyZWQoKSB7CisgICAgcmV0dXJuIGF0b21pY0xvYWQoZmlyZWRfKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHRpbWVyVGhyZWFkKCkgeworICAgIC8vIEtMVURHRTogTWFrZSBzdXJlIHRoZSBzdGQuY29uY3VycmVuY3kgbWJveCBpcyBpbml0aWFsaXplZCBvbiB0aGUgdGltZXIKKyAgICAvLyB0aHJlYWQgdG8gYmUgYWJsZSB0byB1bmJsb2NrIHRoZSBmaWxlIHRyYW5zcG9ydC4KKyAgICBpbXBvcnQgc3RkLmNvbmN1cnJlbmN5OworICAgIHRoaXNUaWQ7CisKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgd2hpbGUgKGluZm9fKSB7CisgICAgICAgIGF1dG8gY2FuY2VsbGVkID0gY2FuY2VsQ29uZGl0aW9uXy53YWl0KGluZm9fLnRpbWVvdXQpOworICAgICAgICBpZiAoY2FuY2VsbGVkKSB7CisgICAgICAgICAgaW5mb18gPSBudWxsOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXRvbWljT3AhIis9IihmaXJlZF8sIDEpOworCisgICAgICAgIC8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgdHJhbnNwb3J0IHRvIHVuYmxvY2sgaXQuCisgICAgICAgIGF1dG8gYnVmID0gbmV3IHVieXRlW2luZm9fLndyaXRlTGVuZ3RoXTsKKyAgICAgICAgYnVmW10gPSAnYic7CisgICAgICAgIGluZm9fLnRyYW5zcG9ydC53cml0ZShidWYpOworICAgICAgICBpbmZvXy50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgICBpbmZvXyA9IGluZm9fLm5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgdGhyZWFkXyA9IG51bGw7CisgIH0KKworICB2b2lkIHN0YXJ0VGhyZWFkKCkgeworICAgIHRocmVhZF8gPSBuZXcgVGhyZWFkKCZ0aW1lclRocmVhZCk7CisgICAgdGhyZWFkXy5zdGFydCgpOworICB9CisKKyAgc3RydWN0IEluZm8geworICAgIHRoaXMoRHVyYXRpb24gdGltZW91dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHNpemVfdCB3cml0ZUxlbmd0aCkgeworICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgdGhpcy53cml0ZUxlbmd0aCA9IHdyaXRlTGVuZ3RoOworICAgIH0KKworICAgIER1cmF0aW9uIHRpbWVvdXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgc2l6ZV90IHdyaXRlTGVuZ3RoOworICAgIEluZm8qIG5leHQ7CisgIH0KKworICBJbmZvKiBpbmZvXzsKKyAgVGhyZWFkIHRocmVhZF87CisgIHNoYXJlZCBzaG9ydCBmaXJlZF87CisKKyAgaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKKyAgTXV0ZXggbXV0ZXhfOworICBpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKKyAgQ29uZGl0aW9uIGNhbmNlbENvbmRpdGlvbl87Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucyBiL2xpYi9kYXJ0Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTElDRU5TRSBiL2xpYi9kYXJ0L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhY2I2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L0xJQ0VOU0UKQEAgLTAsMCArMSwxNiBAQAorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTWFrZWZpbGUuYW0gYi9saWIvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjZkZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2FsbC1sb2NhbDoKKwkkKERBUlRQVUIpIGdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciAucHViCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworY2hlY2stbG9jYWw6IGFsbAorCitFWFRSQV9ESVNUID0gXAorCS5hbmFseXNpc19vcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L1JFQURNRS5tZCBiL2xpYi9kYXJ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUxNjhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjYgQEAKK1RocmlmdCBEYXJ0IExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVXNpbmcgVGhyaWZ0IHdpdGggRGFydAorPT09PT09PT09PT09PT09PT09PT0KKworRGFydCAxLjEyLjAgb3IgbmV3ZXIgaXMgcmVxdWlyZWQKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjYwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNiBAQAorIyBEYXJ0IENvZGluZyBTdGFuZGFyZHMKKworIyMjIFBsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1VzZSBkYXJ0Zm10XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvdG9vbHMvZGFydGZtdC8pIGFuZCBmb2xsb3cgdGhlIAorICAgW0RhcnQgU3R5bGUgR3VpZGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9hcnRpY2xlcy9zdHlsZS1ndWlkZS8pCmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2OTNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDEzMCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnNyYy5icm93c2VyOworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgQkFTRTY0OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgQ2xvc2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IEV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgTWVzc2FnZUV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgV2ViU29ja2V0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtXZWJTb2NrZXRdIGZyb20gZGFydDpodG1sCitjbGFzcyBUV2ViU29ja2V0IGltcGxlbWVudHMgVFNvY2tldCB7CisgIGZpbmFsIFVyaSB1cmw7CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgTGlzdDxVaW50OExpc3Q+IF9yZXF1ZXN0cyA9IFtdOworCisgIFRXZWJTb2NrZXQodGhpcy51cmwpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHVybCA9PSBudWxsIHx8ICF1cmwuaGFzQXV0aG9yaXR5IHx8ICF1cmwuaGFzUG9ydCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdXJsJyk7CisgICAgfQorICB9CisKKyAgV2ViU29ja2V0IF9zb2NrZXQ7CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9zb2NrZXQgIT0gbnVsbCAmJiBfc29ja2V0LnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0Lk9QRU47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4KKyAgICAgIF9zb2NrZXQgPT0gbnVsbCB8fCBfc29ja2V0LnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0LkNMT1NFRDsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBpZiAoIWlzQ2xvc2VkKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuQUxSRUFEWV9PUEVOLCAnU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsLnRvU3RyaW5nKCkpOworICAgIF9zb2NrZXQub25FcnJvci5saXN0ZW4oX29uRXJyb3IpOworICAgIF9zb2NrZXQub25PcGVuLmxpc3Rlbihfb25PcGVuKTsKKyAgICBfc29ja2V0Lm9uQ2xvc2UubGlzdGVuKF9vbkNsb3NlKTsKKyAgICBfc29ja2V0Lm9uTWVzc2FnZS5saXN0ZW4oX29uTWVzc2FnZSk7CisKKyAgICByZXR1cm4gX3NvY2tldC5vbk9wZW4uZmlyc3Q7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgeworICAgICAgX3NvY2tldC5jbG9zZSgpOworICAgICAgcmV0dXJuIF9zb2NrZXQub25DbG9zZS5maXJzdDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfcmVxdWVzdHMuYWRkKGRhdGEpOworICAgIF9zZW5kUmVxdWVzdHMoKTsKKyAgfQorCisgIHZvaWQgX3NlbmRSZXF1ZXN0cygpIHsKKyAgICB3aGlsZSAoaXNPcGVuICYmIF9yZXF1ZXN0cy5pc05vdEVtcHR5KSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9IF9yZXF1ZXN0cy5yZW1vdmVBdCgwKTsKKyAgICAgIF9zb2NrZXQuc2VuZFN0cmluZyhCQVNFNjQuZW5jb2RlKGRhdGEpKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbk9wZW4oRXZlbnQgZXZlbnQpIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgICBfc2VuZFJlcXVlc3RzKCk7CisgIH0KKworICB2b2lkIF9vbkNsb3NlKENsb3NlRXZlbnQgZXZlbnQpIHsKKyAgICBfc29ja2V0ID0gbnVsbDsKKworICAgIGlmIChfcmVxdWVzdHMuaXNOb3RFbXB0eSkgeworICAgICAgX29uRXJyb3JDb250cm9sbGVyCisgICAgICAgICAgLmFkZChuZXcgU3RhdGVFcnJvcignU29ja2V0IHdhcyBjbG9zZWQgd2l0aCBwZW5kaW5nIHJlcXVlc3RzJykpOworICAgIH0KKyAgICBfcmVxdWVzdHMuY2xlYXIoKTsKKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoTWVzc2FnZUV2ZW50IG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgVWludDhMaXN0IGRhdGEgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShtZXNzYWdlLmRhdGEpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoRXZlbnQgZXZlbnQpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXZlbnQudG9TdHJpbmcoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE0ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3RjcF9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtTb2NrZXRdIGZyb20gZGFydDppbworY2xhc3MgVFRjcFNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUVGNwU29ja2V0KFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gc29ja2V0OworICAgIF9zb2NrZXQubGlzdGVuKF9vbk1lc3NhZ2UsIG9uRXJyb3I6IF9vbkVycm9yLCBvbkRvbmU6IGNsb3NlKTsKKyAgfQorCisgIFNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGw7CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX3NvY2tldCA9PSBudWxsOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIGF3YWl0IF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIF9zb2NrZXQgPSBudWxsOworICAgIH0KKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfc29ja2V0LmFkZChkYXRhKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShMaXN0PGludD4gbWVzc2FnZSkgeworICAgIFVpbnQ4TGlzdCBkYXRhID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChtZXNzYWdlKTsKKyAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ3Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3dlYl9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtXZWJTb2NrZXRdIGZyb20gZGFydDppbworY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUV2ViU29ja2V0KFdlYlNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gc29ja2V0OworICAgIF9zb2NrZXQubGlzdGVuKF9vbk1lc3NhZ2UsIG9uRXJyb3I6IF9vbkVycm9yLCBvbkRvbmU6IGNsb3NlKTsKKyAgfQorCisgIFdlYlNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGw7CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX3NvY2tldCA9PSBudWxsOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIGF3YWl0IF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIF9zb2NrZXQgPSBudWxsOworICAgIH0KKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfc29ja2V0LmFkZChCQVNFNjQuZW5jb2RlKGRhdGEpKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKG1lc3NhZ2UpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoT2JqZWN0IGVycm9yKSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKCckZXJyb3InKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODVkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSwyODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VEJpbmFyeVByb3RvY29sPiB7CisgIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkoe3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0LAorICAgICAgICBzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGUpOworICB9Cit9CisKKy8vLyBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGZpbmFsIGJvb2wgc3RyaWN0UmVhZDsKKyAgZmluYWwgYm9vbCBzdHJpY3RXcml0ZTsKKworICBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICB7dGhpcy5zdHJpY3RSZWFkOiBmYWxzZSwgdGhpcy5zdHJpY3RXcml0ZTogdHJ1ZX0pCisgICAgICA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIHdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChzdHJpY3RXcml0ZSkgeworICAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CisgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CisgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgIHdyaXRlSTMyKG1hcC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVCeXRlKGxpc3QuZWxlbWVudFR5cGUpOworICAgIHdyaXRlSTMyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUJ5dGUoc2V0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9ieXRlT3V0ID0gbmV3IEJ5dGVEYXRhKDEpOworICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgeworICAgIGlmIChieXRlID09IG51bGwpIGJ5dGUgPSAwOworICAgIF9ieXRlT3V0LnNldFVpbnQ4KDAsIGJ5dGUpOworICAgIHRyYW5zcG9ydC53cml0ZShfYnl0ZU91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMSk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTE2T3V0ID0gbmV3IEJ5dGVEYXRhKDIpOworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBpZiAoaTE2ID09IG51bGwpIGkxNiA9IDA7CisgICAgX2kxNk91dC5zZXRJbnQxNigwLCBpMTYpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTE2T3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCAyKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9pMzJPdXQgPSBuZXcgQnl0ZURhdGEoNCk7CisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIGlmIChpMzIgPT0gbnVsbCkgaTMyID0gMDsKKyAgICBfaTMyT3V0LnNldEludDMyKDAsIGkzMik7CisgICAgdHJhbnNwb3J0LndyaXRlKF9pMzJPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDQpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRPdXQgPSBuZXcgVWludDhMaXN0KDgpOworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgdmFyIGkgPSBuZXcgSW50NjQoaTY0KTsKKyAgICB2YXIgYnRzID0gaS50b0J5dGVzKCk7CisgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgIF9pNjRPdXRbal0gPSBidHNbOCAtIGogLSAxXTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKF9pNjRPdXQsIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgd3JpdGVJMzIoYnl0ZXMubGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfZG91YmxlT3V0ID0gbmV3IEJ5dGVEYXRhKDgpOworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKyAgICBfZG91YmxlT3V0LnNldEZsb2F0NjQoMCwgZCk7CisgICAgdHJhbnNwb3J0LndyaXRlKF9kb3VibGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIHdyaXRlSTMyKGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBsZW5ndGgpOworICB9CisKKyAgLy8vIHJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgc2VxaWQ7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICR2ZXJzaW9uIik7CisgICAgICB9CisgICAgICB0eXBlID0gc2l6ZSAmIDB4MDAwMDAwZmY7CisgICAgICBuYW1lID0gcmVhZFN0cmluZygpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJpY3RSZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iKTsKKyAgICAgIH0KKyAgICAgIG5hbWUgPSBfcmVhZFN0cmluZyhzaXplKTsKKyAgICAgIHR5cGUgPSByZWFkQnl0ZSgpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfQorICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgaWQgPSB0eXBlICE9IFRUeXBlLlNUT1AgPyByZWFkSTE2KCkgOiAwOworCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIGludCBrZXlUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworICBib29sIHJlYWRCb29sKCkgPT4gcmVhZEJ5dGUoKSA9PSAxOworCisgIGZpbmFsIFVpbnQ4TGlzdCBfYnl0ZUluID0gbmV3IFVpbnQ4TGlzdCgxKTsKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9ieXRlSW4sIDAsIDEpOworICAgIHJldHVybiBfYnl0ZUluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kxNkluID0gbmV3IFVpbnQ4TGlzdCgyKTsKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kxNkluLCAwLCAyKTsKKyAgICByZXR1cm4gX2kxNkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MTYoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kzMkluID0gbmV3IFVpbnQ4TGlzdCg0KTsKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kzMkluLCAwLCA0KTsKKyAgICByZXR1cm4gX2kzMkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MzIoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2k2NEluID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2k2NEluLCAwLCA4KTsKKyAgICB2YXIgaSA9IG5ldyBJbnQ2NC5mcm9tQnl0ZXNCaWdFbmRpYW4oX2k2NEluKTsKKyAgICByZXR1cm4gaS50b0ludCgpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9kb3VibGVJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9kb3VibGVJbiwgMCwgOCk7CisgICAgcmV0dXJuIF9kb3VibGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEZsb2F0NjQoMCk7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gX3JlYWRTdHJpbmcoc2l6ZSk7CisgIH0KKworICBTdHJpbmcgX3JlYWRTdHJpbmcoaW50IHNpemUpIHsKKyAgICBVaW50OExpc3Qgc3RyaW5nSW4gPSBuZXcgVWludDhMaXN0KHNpemUpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHN0cmluZ0luLCAwLCBzaXplKTsKKyAgICByZXR1cm4gX3V0ZjhDb2RlYy5kZWNvZGUoc3RyaW5nSW4pOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKyAgICBVaW50OExpc3QgYmluYXJ5SW4gPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYmluYXJ5SW4sIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJpbmFyeUluOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ3NjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDQ3MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VENvbXBhY3RQcm90b2NvbD4geworICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworCisgIFRDb21wYWN0UHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gVXNlIG9mIGZpeG51bSBsaWJyYXJ5IGlzIHJlcXVpcmVkIGR1ZSB0byBidWdzIGxpa2UKKy8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMTUzNjEKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfSUQgPSAweDgyOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT04gPSAxOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9NQVNLID0gMHhFMDsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JJVFMgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBUU1RPUCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CT09MRUFOX1RSVUUgPSAweDAxOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CWVRFID0gMHgwMzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0kxNiA9IDB4MDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMzIgPSAweDA1OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTY0ID0gMHgwNjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0RPVUJMRSA9IDB4MDc7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSU5BUlkgPSAweDA4OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTElTVCA9IDB4MDk7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TRVQgPSAweDBBOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFQID0gMHgwQjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NUUlVDVCA9IDB4MEM7CisKKyAgc3RhdGljIGZpbmFsIExpc3Q8aW50PiBfdHlwZU1hcCA9IG5ldyBMaXN0LnVubW9kaWZpYWJsZShuZXcgTGlzdCgxNikKKyAgICAuLltUVHlwZS5TVE9QXSA9IFRUeXBlLlNUT1AKKyAgICAuLltUVHlwZS5CT09MXSA9IFRZUEVfQk9PTEVBTl9UUlVFCisgICAgLi5bVFR5cGUuQllURV0gPSBUWVBFX0JZVEUKKyAgICAuLltUVHlwZS5JMTZdID0gVFlQRV9JMTYKKyAgICAuLltUVHlwZS5JMzJdID0gVFlQRV9JMzIKKyAgICAuLltUVHlwZS5JNjRdID0gVFlQRV9JNjQKKyAgICAuLltUVHlwZS5ET1VCTEVdID0gVFlQRV9ET1VCTEUKKyAgICAuLltUVHlwZS5TVFJJTkddID0gVFlQRV9CSU5BUlkKKyAgICAuLltUVHlwZS5MSVNUXSA9IFRZUEVfTElTVAorICAgIC4uW1RUeXBlLlNFVF0gPSBUWVBFX1NFVAorICAgIC4uW1RUeXBlLk1BUF0gPSBUWVBFX01BUAorICAgIC4uW1RUeXBlLlNUUlVDVF0gPSBUWVBFX1NUUlVDVCk7CisKKyAgc3RhdGljIGNvbnN0IFV0ZjhDb2RlYyBfdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgLy8gUHJldGVuZCB0aGlzIGlzIGEgc3RhY2sKKyAgRG91YmxlTGlua2VkUXVldWU8aW50PiBfbGFzdEZpZWxkID0gbmV3IERvdWJsZUxpbmtlZFF1ZXVlPGludD4oKTsKKyAgaW50IF9sYXN0RmllbGRJZCA9IDA7CisKKyAgVEZpZWxkIF9ib29sZWFuRmllbGQgPSBudWxsOworICBib29sIF9ib29sVmFsdWUgPSBudWxsOworCisgIGZpbmFsIFVpbnQ4TGlzdCB0ZW1wTGlzdCA9IG5ldyBVaW50OExpc3QoMTApOworICBmaW5hbCBCeXRlRGF0YSB0ZW1wQkQgPSBuZXcgQnl0ZURhdGEoMTApOworCisgIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogc3VwZXIodHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKKyAgICB3cml0ZUJ5dGUoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwKKyAgICAgICAgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7CisgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKG1lc3NhZ2Uuc2VxaWQpKTsKKyAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9sYXN0RmllbGQuYWRkTGFzdChfbGFzdEZpZWxkSWQpOworICAgIF9sYXN0RmllbGRJZCA9IDA7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgeworICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKGZpZWxkLCAtMSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCwgaW50IHR5cGVPdmVycmlkZSkgeworICAgIGludCB0eXBlVG9Xcml0ZSA9CisgICAgICAgIHR5cGVPdmVycmlkZSA9PSAtMSA/IF9nZXRDb21wYWN0VHlwZShmaWVsZC50eXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgIGlmIChmaWVsZC5pZCA+IF9sYXN0RmllbGRJZCAmJiBmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKChmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBpZiAobWFwLmxlbmd0aCA9PSAwKSB7CisgICAgICB3cml0ZUJ5dGUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtYXAubGVuZ3RoKSk7CisgICAgICB3cml0ZUJ5dGUoCisgICAgICAgICAgX2dldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgX2dldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5lbGVtZW50VHlwZSwgbGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuZWxlbWVudFR5cGUsIHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IGZhbHNlOworICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpIHsKKyAgICAgIF93cml0ZUZpZWxkQmVnaW4oCisgICAgICAgICAgX2Jvb2xlYW5GaWVsZCwgYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSAwOworICAgIHRlbXBMaXN0WzBdID0gYjsKKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIDEpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMTYpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX3dyaXRlVmFySW50MzIoX2ludDMyVG9aaWdaYWcobmV3IEludDMyKGkzMikpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIGlmIChpNjQgPT0gbnVsbCkgaTY0ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQ2NChfaW50NjRUb1ppZ1phZyhuZXcgSW50NjQoaTY0KSkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgdGVtcEJELnNldEZsb2F0NjQoMCwgZCwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOKTsKKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcEJELmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9CisgICAgICAgIHN0ciAhPSBudWxsID8gX3V0ZjhDb2RlYy5lbmNvZGUoc3RyKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIHdyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKGJ5dGVzLmxlbmd0aCkpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlVmFySW50MzIoSW50MzIgbikgeworICAgIGludCBpZHggPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAobiAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKCgobiAmIDB4N0YpIHwgMHg4MCkgJiAweEZGKS50b0ludCgpOworICAgICAgICBuID0gbi5zaGlmdFJpZ2h0VW5zaWduZWQoNyk7CisgICAgICB9CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wTGlzdCwgMCwgaWR4KTsKKyAgfQorCisgIHZvaWQgX3dyaXRlVmFySW50NjQoSW50NjQgbikgeworICAgIGludCBpZHggPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAobiAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKCgobiAmIDB4N0YpIHwgMHg4MCkgJiAweEZGKS50b0ludCgpOworICAgICAgICBuID0gbi5zaGlmdFJpZ2h0VW5zaWduZWQoNyk7CisgICAgICB9CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wTGlzdCwgMCwgaWR4KTsKKyAgfQorCisgIHZvaWQgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKGludCBlbGVtVHlwZSwgaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShsZW5ndGggPDwgNCB8IF9nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoMHhGMCB8IF9nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKGxlbmd0aCkpOworICAgIH0KKyAgfQorCisgIEludDMyIF9pbnQzMlRvWmlnWmFnKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIH0KKworICBJbnQ2NCBfaW50NjRUb1ppZ1phZyhJbnQ2NCBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gNjMpOworICB9CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBpbnQgcHJvdG9jb2xJZCA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgJ0V4cGVjdGVkIHByb3RvY29sIGlkICRQUk9UT0NPTF9JRCBidXQgZ290ICRwcm90b2NvbElkJyk7CisgICAgfQorICAgIGludCB2ZXJzaW9uQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICdFeHBlY3RlZCB2ZXJzaW9uICRWRVJTSU9OIGJ1dCBnb3QgJHZlcnNpb24nKTsKKyAgICB9CisgICAgaW50IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTOworICAgIGludCBzZXFJZCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFJZCk7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICBfbGFzdEZpZWxkLmFkZExhc3QoX2xhc3RGaWVsZElkKTsKKyAgICBfbGFzdEZpZWxkSWQgPSAwOworICAgIC8vIFRPRE8gbWFrZSB0aGlzIGEgY29uc3RhbnQ/CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5yZW1vdmVMYXN0KCk7CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgaW50IHR5cGUgPSByZWFkQnl0ZSgpOworICAgIGlmICh0eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHJldHVybiBUU1RPUDsKKyAgICB9CisKKyAgICBpbnQgZmllbGRJZDsKKyAgICBpbnQgbW9kaWZpZXIgPSAodHlwZSAmIDB4RjApID4+IDQ7CisgICAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAgIGZpZWxkSWQgPSByZWFkSTE2KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkSWQgPSBfbGFzdEZpZWxkSWQgKyBtb2RpZmllcjsKKyAgICB9CisKKyAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCcnLCBfZ2V0VFR5cGUodHlwZSAmIDB4MEYpLCBmaWVsZElkKTsKKyAgICBpZiAoX2lzQm9vbFR5cGUodHlwZSkpIHsKKyAgICAgIF9ib29sVmFsdWUgPSAodHlwZSAmIDB4MEYpID09IFRZUEVfQk9PTEVBTl9UUlVFOworICAgIH0KKworICAgIF9sYXN0RmllbGRJZCA9IGZpZWxkLmlkOworICAgIHJldHVybiBmaWVsZDsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgaW50IGtleUFuZFZhbHVlVHlwZSA9IGxlbmd0aCA9PSAwID8gMCA6IHJlYWRCeXRlKCk7CisgICAgaW50IGtleVR5cGUgPSBfZ2V0VFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpOworICAgIGludCB2YWx1ZVR5cGUgPSBfZ2V0VFR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHgwRik7CisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBpbnQgbGVuZ3RoQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IChsZW5ndGhBbmRUeXBlID4+IDQpICYgMHgwRjsKKyAgICBpZiAobGVuZ3RoID09IDE1KSB7CisgICAgICBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICB9CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworICAgIGludCB0eXBlID0gX2dldFRUeXBlKGxlbmd0aEFuZFR5cGUpOworICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIFRMaXN0IHRsaXN0ID0gcmVhZExpc3RCZWdpbigpOworICAgIHJldHVybiBuZXcgVFNldCh0bGlzdC5lbGVtZW50VHlwZSwgdGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICBpZiAoX2Jvb2xWYWx1ZSAhPSBudWxsKSB7CisgICAgICBib29sIHJlc3VsdCA9IF9ib29sVmFsdWU7CisgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZWFkQnl0ZSgpID09IFRZUEVfQk9PTEVBTl9UUlVFOworICB9CisKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHRlbXBMaXN0LCAwLCAxKTsKKyAgICByZXR1cm4gdGVtcExpc3QuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50OCgwKTsKKyAgfQorCisgIGludCByZWFkSTE2KCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQzMihfcmVhZFZhckludDMyKCkpLnRvSW50KCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50MzIoX3JlYWRWYXJJbnQzMigpKS50b0ludCgpOworICB9CisKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDY0KF9yZWFkVmFySW50NjQoKSkudG9JbnQoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHRlbXBMaXN0LCAwLCA4KTsKKyAgICByZXR1cm4gdGVtcExpc3QuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRGbG9hdDY0KDAsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTik7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgLy8gVE9ETyBsb29rIGF0IHVzaW5nIHRlbXAgZm9yIHNtYWxsIHN0cmluZ3M/CisgICAgVWludDhMaXN0IGJ1ZmYgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZiwgMCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3V0ZjhDb2RlYy5kZWNvZGUoYnVmZik7CisgIH0KKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgVWludDhMaXN0IGJ1ZmYgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZiwgMCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gYnVmZjsKKyAgfQorCisgIEludDMyIF9yZWFkVmFySW50MzIoKSB7CisgICAgSW50MzIgcmVzdWx0ID0gSW50MzIuWkVSTzsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBJbnQzMiBiID0gbmV3IEludDMyKHJlYWRCeXRlKCkpOworICAgICAgcmVzdWx0IHw9IChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsKKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBJbnQ2NCBfcmVhZFZhckludDY0KCkgeworICAgIEludDY0IHJlc3VsdCA9IEludDY0LlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50NjQgYiA9IG5ldyBJbnQ2NChyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50MzIgX3ppZ3phZ1RvSW50MzIoSW50MzIgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICBJbnQ2NCBfemlnemFnVG9JbnQ2NChJbnQ2NCBuKSB7CisgICAgcmV0dXJuIChuLnNoaWZ0UmlnaHRVbnNpZ25lZCgxKSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIHZvaWQgX2NoZWNrTmVnUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTkVHQVRJVkVfU0laRSwgJ05lZ2F0aXZlIGxlbmd0aDogJGxlbmd0aCcpOworICAgIH0KKyAgfQorCisgIGludCBfZ2V0Q29tcGFjdFR5cGUoaW50IHR0eXBlKSB7CisgICAgcmV0dXJuIF90eXBlTWFwW3R0eXBlXTsKKyAgfQorCisgIGludCBfZ2V0VFR5cGUoaW50IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUgJiAweDBGKSB7CisgICAgICBjYXNlIFRUeXBlLlNUT1A6CisgICAgICAgIHJldHVybiBUVHlwZS5TVE9QOworICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fRkFMU0U6CisgICAgICBjYXNlIFRZUEVfQk9PTEVBTl9UUlVFOgorICAgICAgICByZXR1cm4gVFR5cGUuQk9PTDsKKyAgICAgIGNhc2UgVFlQRV9CWVRFOgorICAgICAgICByZXR1cm4gVFR5cGUuQllURTsKKyAgICAgIGNhc2UgVFlQRV9JMTY6CisgICAgICAgIHJldHVybiBUVHlwZS5JMTY7CisgICAgICBjYXNlIFRZUEVfSTMyOgorICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgY2FzZSBUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgIGNhc2UgVFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiBUVHlwZS5ET1VCTEU7CisgICAgICBjYXNlIFRZUEVfQklOQVJZOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSSU5HOworICAgICAgY2FzZSBUWVBFX0xJU1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5MSVNUOworICAgICAgY2FzZSBUWVBFX1NFVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNFVDsKKyAgICAgIGNhc2UgVFlQRV9NQVA6CisgICAgICAgIHJldHVybiBUVHlwZS5NQVA7CisgICAgICBjYXNlIFRZUEVfU1RSVUNUOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSVUNUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIlVua25vd24gdHlwZTogJHt0eXBlICYgMHgwRn0iKTsKKyAgICB9CisgIH0KKworICBib29sIF9pc0Jvb2xUeXBlKGludCBiKSB7CisgICAgaW50IGxvd2VyTmliYmxlID0gYiAmIDB4MEY7CisgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFRZUEVfQk9PTEVBTl9UUlVFIHx8CisgICAgICAgIGxvd2VyTmliYmxlID09IFRZUEVfQk9PTEVBTl9GQUxTRTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfZmllbGQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRiNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURmllbGQgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgaW50IHR5cGU7CisgIGZpbmFsIGludCBpZDsKKworICBURmllbGQodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuaWQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiYjdjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw3ODQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEpzb25Qcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRKc29uUHJvdG9jb2w+IHsKKyAgVEpzb25Qcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworICB9Cit9CisKKy8vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUSnNvblByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OXzEgPSAxOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgX0Jhc2VDb250ZXh0IF9jb250ZXh0OworICBfQmFzZUNvbnRleHQgX3Jvb3RDb250ZXh0OworICBfTG9va2FoZWFkUmVhZGVyIF9yZWFkZXI7CisKKyAgZmluYWwgTGlzdDxfQmFzZUNvbnRleHQ+IF9jb250ZXh0U3RhY2sgPSBbXTsKKyAgZmluYWwgVWludDhMaXN0IF90ZW1wQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCg0KTsKKworICBUSnNvblByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHN1cGVyKHRyYW5zcG9ydCkgeworICAgIF9yb290Q29udGV4dCA9IG5ldyBfQmFzZUNvbnRleHQodGhpcyk7CisgICAgX3JlYWRlciA9IG5ldyBfTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgIF9yZXNldENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgX3B1c2hDb250ZXh0KF9CYXNlQ29udGV4dCBjKSB7CisgICAgX2NvbnRleHRTdGFjay5hZGQoYyk7CisgICAgX2NvbnRleHQgPSBjOworICB9CisKKyAgdm9pZCBfcG9wQ29udGV4dCgpIHsKKyAgICBfY29udGV4dFN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICBfY29udGV4dCA9IF9jb250ZXh0U3RhY2suaXNFbXB0eSA/IF9yb290Q29udGV4dCA6IF9jb250ZXh0U3RhY2subGFzdDsKKyAgfQorCisgIHZvaWQgX3Jlc2V0Q29udGV4dCgpIHsKKyAgICBfY29udGV4dFN0YWNrLmNsZWFyKCk7CisgICAgX2NvbnRleHQgPSBfcm9vdENvbnRleHQ7CisgIH0KKworICAvLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIFtjaGFyXTsgb3RoZXJ3aXNlIHRocm93IGEgW1RQcm90b2NvbEVycm9yXS4KKyAgdm9pZCBfcmVhZEpzb25TeW50YXhDaGFyKGludCBjaGFyQnl0ZSkgeworICAgIGludCBieXRlID0gX3JlYWRlci5yZWFkKCk7CisgICAgaWYgKGJ5dGUgIT0gY2hhckJ5dGUpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBjaGFyYWN0ZXIgJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQnl0ZSl9IGJ1dCBmb3VuZDogJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKX0iKTsKKyAgICB9CisgIH0KKworICBpbnQgX2hleFZhbChpbnQgYnl0ZSkgeworICAgIGlmIChieXRlID49IF9Db25zdGFudHMuSEVYXzBfQllURVNbMF0gJiYKKyAgICAgICAgYnl0ZSA8PSBfQ29uc3RhbnRzLkhFWF85X0JZVEVTWzBdKSB7CisgICAgICByZXR1cm4gYnl0ZSAtIF9Db25zdGFudHMuSEVYXzBfQllURVNbMF07CisgICAgfSBlbHNlIGlmIChieXRlID49IF9Db25zdGFudHMuSEVYX0FfQllURVNbMF0gJiYKKyAgICAgICAgYnl0ZSA8PSBfQ29uc3RhbnRzLkhFWF9GX0JZVEVTWzBdKSB7CisgICAgICBieXRlICs9IDEwOworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICB9CisgIH0KKworICBpbnQgX2hleENoYXIoaW50IGJ5dGUpID0+IGJ5dGUudG9SYWRpeFN0cmluZygxNikuY29kZVVuaXRBdCgwKTsKKworICAvLy8gd3JpdGUKKworICAvLy8gV3JpdGUgdGhlIFtieXRlc10gYXMgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQuCisgIHZvaWQgX3dyaXRlSnNvblN0cmluZyhVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKworICAgIGludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKKyAgICAgIGlmICgoYnl0ZSAmIDB4MDBGRikgPj0gMHgzMCkgeworICAgICAgICBpZiAoYnl0ZSA9PSBfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFU1swXSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IF9Db25zdGFudHMuSlNPTl9DSEFSX1RBQkxFW2J5dGVdOworICAgICAgICBpZiAoX3RlbXBCdWZmZXJbMF0gPT0gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgaSwgMSk7CisgICAgICAgIH0gZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTKTsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoX3RlbXBCdWZmZXIsIDAsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFUyk7CisgICAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfaGV4Q2hhcihieXRlID4+IDQpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzFdID0gX2hleENoYXIoYnl0ZSk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkludGVnZXIoaW50IGkpIHsKKyAgICBpZiAoaSA9PSBudWxsKSBpID0gMDsKKworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IGkudG9TdHJpbmcoKTsKKworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IGQudG9TdHJpbmcoKTsKKyAgICBib29sIGVzY2FwZU51bWJlcnMgPSBkLmlzTmFOIHx8IGQuaXNJbmZpbml0ZSB8fCBfY29udGV4dC5lc2NhcGVOdW1iZXJzOworCisgICAgaWYgKGVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoc3RyKSk7CisgICAgaWYgKGVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgIH0KKworICB2b2lkIF93cml0ZUpzb25CYXNlNjQoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBTdHJpbmcgYmFzZTY0ID0gQkFTRTY0LmVuY29kZShieXRlcyk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoYmFzZTY0KSk7CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkxCUkFDRV9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0tFVF9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfTGlzdENvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQXJyYXlFbmQoKSB7CisgICAgX3BvcENvbnRleHQoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFUyk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKFZFUlNJT05fMSk7CisKKyAgICBfd3JpdGVKc29uU3RyaW5nKHV0ZjhDb2RlYy5lbmNvZGUobWVzc2FnZS5uYW1lKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS50eXBlKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChmaWVsZC50eXBlKSk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAua2V5VHlwZSkpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKG1hcC52YWx1ZVR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtYXAubGVuZ3RoKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChsaXN0LmVsZW1lbnRUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKHNldC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiID8gMSA6IDApOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfd3JpdGVKc29uRG91YmxlKGQpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IHV0ZjhDb2RlYy5lbmNvZGUocykgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKGJ5dGVzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3dyaXRlSnNvbkJhc2U2NChieXRlcyk7CisgIH0KKworICBib29sIF9pc0hpZ2hTdXJyb2dhdGUoaW50IGIpID0+IGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGOworCisgIGJvb2wgX2lzTG93U3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4REMwMCAmJiBiIDw9IDB4REZGRjsKKworICAvLy8gcmVhZAorCisgIFVpbnQ4TGlzdCBfcmVhZEpzb25TdHJpbmcoe2Jvb2wgc2tpcENvbnRleHQ6IGZhbHNlfSkgeworICAgIExpc3Q8aW50PiBieXRlcyA9IFtdOworICAgIExpc3Q8aW50PiBjb2RldW5pdHMgPSBbXTsKKworICAgIGlmICghc2tpcENvbnRleHQpIHsKKyAgICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICB9CisKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gZXNjYXBlZD8KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzBdKSB7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKworICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgaWYgKGJ5dGUgIT0gX0NvbnN0YW50cy5FU0NTRVFfQllURVNbMV0pIHsKKyAgICAgICAgU3RyaW5nIGNoYXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJTLmluZGV4T2YoY2hhcik7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgfQorICAgICAgICBieXRlID0gX0NvbnN0YW50cy5FU0NBUEVfQ0hBUl9WQUxTLmNvZGVVbml0QXQob2Zmc2V0KTsKKyAgICAgICAgYnl0ZXMuYWRkKGJ5dGUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKF90ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgIGJ5dGUgPSAoX2hleFZhbChfdGVtcEJ1ZmZlclswXSkgPDwgMTIpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpCisgICAgICAgICsgX2hleFZhbChfdGVtcEJ1ZmZlclszXSk7CisgICAgICBpZiAoX2lzSGlnaFN1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzTm90RW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgY29kZXVuaXRzLmFkZChieXRlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9pc0xvd1N1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzRW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RldW5pdHMpKSk7CisgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CisgIH0KKworICBTdHJpbmcgX3JlYWRKc29uTnVtZXJpY0NoYXJzKCkgeworICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICghX0NvbnN0YW50cy5pc0pzb25OdW1lcmljKF9yZWFkZXIucGVlaygpKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci53cml0ZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShfcmVhZGVyLnJlYWQoKSkpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KKworICBpbnQgX3JlYWRKc29uSW50ZWdlcigpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IF9yZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICByZXR1cm4gaW50LnBhcnNlKHN0cik7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgZG91YmxlIF9yZWFkSnNvbkRvdWJsZSgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX3JlYWRlci5wZWVrKCkgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgVWludDhMaXN0IGJ5dGVzID0gX3JlYWRKc29uU3RyaW5nKHNraXBDb250ZXh0OiB0cnVlKTsKKyAgICAgIGRvdWJsZSBkID0gZG91YmxlLnBhcnNlKHV0ZjhDb2RlYy5kZWNvZGUoYnl0ZXMpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICAgIGlmICghX2NvbnRleHQuZXNjYXBlTnVtYmVycyAmJiAhZC5pc05hTiAmJiAhZC5pc0luZmluaXRlKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICB9CisgICAgICByZXR1cm4gZDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtYmVycyA9PSB0cnVlCisgICAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgICB9CisgICAgICByZXR1cm4gZG91YmxlLnBhcnNlKF9yZWFkSnNvbk51bWVyaWNDaGFycygpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBVaW50OExpc3QgX3JlYWRKc29uQmFzZTY0KCkgeworICAgIC8vIGNvbnZlcnQgVVRGLTggYnl0ZXMgb2YgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nIHRvIGJpbmFyeSBieXRlcworICAgIFVpbnQ4TGlzdCBiYXNlNjRCeXRlcyA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBiYXNlNjQgPSB1dGY4Q29kZWMuZGVjb2RlKGJhc2U2NEJ5dGVzKTsKKworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUoYmFzZTY0KSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuTEJSQUNFX0JZVEVTWzBdKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9QYWlyQ29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbk9iamVjdEVuZCgpIHsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUkJSQUNFX0JZVEVTWzBdKTsKKyAgICBfcG9wQ29udGV4dCgpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25BcnJheVN0YXJ0KCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuTEJSQUNLRVRfQllURVNbMF0pOworICAgIF9wdXNoQ29udGV4dChuZXcgX0xpc3RDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uQXJyYXlFbmQoKSB7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlJCUkFDS0VUX0JZVEVTWzBdKTsKKyAgICBfcG9wQ29udGV4dCgpOworICB9CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaWYgKF9yZWFkSnNvbkludGVnZXIoKSAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICB9CisKKyAgICBVaW50OExpc3QgYnVmZmVyID0gX3JlYWRKc29uU3RyaW5nKCk7CisgICAgU3RyaW5nIG5hbWUgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgaW50IHR5cGUgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgaW50IHNlcWlkID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFN0cmluZyBuYW1lID0gIiI7CisgICAgaW50IHR5cGUgPSBUVHlwZS5TVE9QOworICAgIGludCBpZCA9IDA7CisKKyAgICBpZiAoX3JlYWRlci5wZWVrKCkgIT0gX0NvbnN0YW50cy5SQlJBQ0VfQllURVNbMF0pIHsKKyAgICAgIGlkID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKyAgICAgIHR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFRGaWVsZChuYW1lLCB0eXBlLCBpZCk7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQga2V5VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCB2YWx1ZVR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBib29sIHJlYWRCb29sKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKyAgfQorCisgIGludCByZWFkQnl0ZSgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkRvdWJsZSgpOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIHV0ZjhDb2RlYy5kZWNvZGUoX3JlYWRKc29uU3RyaW5nKCkpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX3JlYWRKc29uQmFzZTY0KCkpOworICB9Cit9CisKK2NsYXNzIF9Db25zdGFudHMgeworICBzdGF0aWMgY29uc3QgdXRmOGNvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfMF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzAnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYXzlfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCc5Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF9BX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnYScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfRl9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ2YnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQ09NTUFfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCcsJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IENPTE9OX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnOicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBMQlJBQ0VfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCd7Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFJCUkFDRV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ30nLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgTEJSQUNLRVRfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdbJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFJCUkFDS0VUX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnXScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBRVU9URV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJyInLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQkFDS1NMQVNIX0JZVEVTID0KKyAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QocidcJy5jb2RlVW5pdHMpOworCisgIHN0YXRpYyBmaW5hbCBFU0NTRVFfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHInXHUwMCcuY29kZVVuaXRzKTsKKworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEpTT05fQ0hBUl9UQUJMRSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAnYicuY29kZVVuaXRBdCgwKSwgJ3QnLmNvZGVVbml0QXQoMCksICduJy5jb2RlVW5pdEF0KDApLCAwLCAvLyA0IGJ5dGVzCisgICAgJ2YnLmNvZGVVbml0QXQoMCksICdyJy5jb2RlVW5pdEF0KDApLCAwLCAwLCAvLyA0IGJ5dGVzCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAxLCAxLCAnIicuY29kZVVuaXRBdCgwKSwgMSwgMSwgMSwgMSwgMSwgLy8gOCBieXRlcworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgLy8gOCBieXRlcworICBdKTsKKworICBzdGF0aWMgY29uc3QgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9IHInIlwvYmZucnQnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIEVTQ0FQRV9DSEFSX1ZBTFMgPSAnIlxcL1xiXGZcblxyXHQnOworCisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9CT09MID0gJ3RmJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0JZVEUgPSAnaTgnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTE2ID0gJ2kxNic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JMzIgPSAnaTMyJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0k2NCA9ICdpNjQnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NUUklORyA9ICdzdHInOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfTUFQID0gJ21hcCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9MSVNUID0gJ2xzdCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TRVQgPSAnc2V0JzsKKworICBzdGF0aWMgZmluYWwgTWFwPGludCwgVWludDhMaXN0PiBfVFlQRV9JRF9UT19OQU1FX0JZVEVTID0KKyAgICAgIG5ldyBNYXAudW5tb2RpZmlhYmxlKHsKKyAgICBUVHlwZS5CT09MOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfQk9PTC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkJZVEU6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9CWVRFLmNvZGVVbml0cyksCisgICAgVFR5cGUuSTE2OiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTE2LmNvZGVVbml0cyksCisgICAgVFR5cGUuSTMyOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTMyLmNvZGVVbml0cyksCisgICAgVFR5cGUuSTY0OiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTY0LmNvZGVVbml0cyksCisgICAgVFR5cGUuRE9VQkxFOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfRE9VQkxFLmNvZGVVbml0cyksCisgICAgVFR5cGUuU1RSSU5HOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU1RSSU5HLmNvZGVVbml0cyksCisgICAgVFR5cGUuU1RSVUNUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU1RSVUNULmNvZGVVbml0cyksCisgICAgVFR5cGUuTUFQOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfTUFQLmNvZGVVbml0cyksCisgICAgVFR5cGUuU0VUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU0VULmNvZGVVbml0cyksCisgICAgVFR5cGUuTElTVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0xJU1QuY29kZVVuaXRzKQorICB9KTsKKworICBzdGF0aWMgVWludDhMaXN0IGdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoaW50IHR5cGVJZCkgeworICAgIGlmICghX1RZUEVfSURfVE9fTkFNRV9CWVRFUy5jb250YWluc0tleSh0eXBlSWQpKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcmV0dXJuIF9UWVBFX0lEX1RPX05BTUVfQllURVNbdHlwZUlkXTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBpbnQ+IF9OQU1FX1RPX1RZUEVfSUQgPSBuZXcgTWFwLnVubW9kaWZpYWJsZSh7CisgICAgTkFNRV9CT09MOiBUVHlwZS5CT09MLAorICAgIE5BTUVfQllURTogVFR5cGUuQllURSwKKyAgICBOQU1FX0kxNjogVFR5cGUuSTE2LAorICAgIE5BTUVfSTMyOiBUVHlwZS5JMzIsCisgICAgTkFNRV9JNjQ6IFRUeXBlLkk2NCwKKyAgICBOQU1FX0RPVUJMRTogVFR5cGUuRE9VQkxFLAorICAgIE5BTUVfU1RSSU5HOiBUVHlwZS5TVFJJTkcsCisgICAgTkFNRV9TVFJVQ1Q6IFRUeXBlLlNUUlVDVCwKKyAgICBOQU1FX01BUDogVFR5cGUuTUFQLAorICAgIE5BTUVfU0VUOiBUVHlwZS5TRVQsCisgICAgTkFNRV9MSVNUOiBUVHlwZS5MSVNUCisgIH0pOworCisgIHN0YXRpYyBpbnQgZ2V0VHlwZUlkRm9yVHlwZU5hbWUoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgU3RyaW5nIG5hbWUgPSB1dGY4Y29kZWMuZGVjb2RlKGJ5dGVzKTsKKyAgICBpZiAoIV9OQU1FX1RPX1RZUEVfSUQuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gX05BTUVfVE9fVFlQRV9JRFtuYW1lXTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBTZXQ8aW50PiBfSlNPTl9OVU1FUklDUyA9IG5ldyBTZXQuZnJvbShbCisgICAgJysnLmNvZGVVbml0QXQoMCksCisgICAgJy0nLmNvZGVVbml0QXQoMCksCisgICAgJy4nLmNvZGVVbml0QXQoMCksCisgICAgJzAnLmNvZGVVbml0QXQoMCksCisgICAgJzEnLmNvZGVVbml0QXQoMCksCisgICAgJzInLmNvZGVVbml0QXQoMCksCisgICAgJzMnLmNvZGVVbml0QXQoMCksCisgICAgJzQnLmNvZGVVbml0QXQoMCksCisgICAgJzUnLmNvZGVVbml0QXQoMCksCisgICAgJzYnLmNvZGVVbml0QXQoMCksCisgICAgJzcnLmNvZGVVbml0QXQoMCksCisgICAgJzgnLmNvZGVVbml0QXQoMCksCisgICAgJzknLmNvZGVVbml0QXQoMCksCisgICAgJ0UnLmNvZGVVbml0QXQoMCksCisgICAgJ2UnLmNvZGVVbml0QXQoMCkKKyAgXSk7CisKKyAgc3RhdGljIGJvb2wgaXNKc29uTnVtZXJpYyhpbnQgYnl0ZSkgeworICAgIHJldHVybiBfSlNPTl9OVU1FUklDUy5jb250YWlucyhieXRlKTsKKyAgfQorfQorCitjbGFzcyBfTG9va2FoZWFkUmVhZGVyIHsKKyAgZmluYWwgVEpzb25Qcm90b2NvbCBwcm90b2NvbDsKKworICBfTG9va2FoZWFkUmVhZGVyKHRoaXMucHJvdG9jb2wpOworCisgIGJvb2wgX2hhc0RhdGEgPSBmYWxzZTsKKyAgZmluYWwgVWludDhMaXN0IF9kYXRhID0gbmV3IFVpbnQ4TGlzdCgxKTsKKworICBpbnQgcmVhZCgpIHsKKyAgICBpZiAoX2hhc0RhdGEpIHsKKyAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC5yZWFkQWxsKF9kYXRhLCAwLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gX2RhdGFbMF07CisgIH0KKworICBpbnQgcGVlaygpIHsKKyAgICBpZiAoIV9oYXNEYXRhKSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQucmVhZEFsbChfZGF0YSwgMCwgMSk7CisgICAgfQorICAgIF9oYXNEYXRhID0gdHJ1ZTsKKworICAgIHJldHVybiBfZGF0YVswXTsKKyAgfQorfQorCitjbGFzcyBfQmFzZUNvbnRleHQgeworICBmaW5hbCBUSnNvblByb3RvY29sIHByb3RvY29sOworCisgIF9CYXNlQ29udGV4dCh0aGlzLnByb3RvY29sKTsKKworICB2b2lkIHdyaXRlKCkge30KKworICB2b2lkIHJlYWQoKSB7fQorCisgIGJvb2wgZ2V0IGVzY2FwZU51bWJlcnMgPT4gZmFsc2U7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Jhc2VDb250ZXh0JzsKK30KKworY2xhc3MgX0xpc3RDb250ZXh0IGV4dGVuZHMgX0Jhc2VDb250ZXh0IHsKKyAgX0xpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpIDogc3VwZXIocHJvdG9jb2wpOworCisgIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICB2b2lkIHdyaXRlKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5DT01NQV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC5fcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuQ09NTUFfQllURVNbMF0pOworICAgIH0KKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdMaXN0Q29udGV4dCc7Cit9CisKK2NsYXNzIF9QYWlyQ29udGV4dCBleHRlbmRzIF9CYXNlQ29udGV4dCB7CisgIF9QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvY29sKSA6IHN1cGVyKHByb3RvY29sKTsKKworICBib29sIF9maXJzdCA9IHRydWU7CisgIGJvb2wgX2NvbG9uID0gdHJ1ZTsKKworICBVaW50OExpc3QgZ2V0IHN5bWJvbEJ5dGVzID0+CisgICAgICBfY29sb24gPyBfQ29uc3RhbnRzLkNPTE9OX0JZVEVTIDogX0NvbnN0YW50cy5DT01NQV9CWVRFUzsKKworICB2b2lkIHdyaXRlKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LndyaXRlQWxsKHN5bWJvbEJ5dGVzKTsKKyAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wuX3JlYWRKc29uU3ludGF4Q2hhcihzeW1ib2xCeXRlc1swXSk7CisgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2V0IGVzY2FwZU51bWJlcnMgPT4gX2NvbG9uOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdQYWlyQ29udGV4dCc7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0NjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRMaXN0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRMaXN0KHRoaXMuZWxlbWVudFR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRmNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVE1hcCB7CisgIGZpbmFsIGludCBrZXlUeXBlOworICBmaW5hbCBpbnQgdmFsdWVUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRNYXAodGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3Yjg4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQKQEAgLTAsMCArMSwzNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTWVzc2FnZVR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IENBTEwgPSAxOworICBzdGF0aWMgY29uc3QgaW50IFJFUExZID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBFWENFUFRJT04gPSAzOworICBzdGF0aWMgY29uc3QgaW50IE9ORVdBWSA9IDQ7Cit9CisKK2NsYXNzIFRNZXNzYWdlIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgc2VxaWQ7CisKKyAgVE1lc3NhZ2UodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuc2VxaWQpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICI8VE1lc3NhZ2UgbmFtZTogJyRuYW1lJyB0eXBlOiAkdHlwZSBzZXFpZDogJHNlcWlkPiI7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OGE2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDQzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisgIHN0YXRpYyBjb25zdCBTRVBBUkFUT1IgPSAnOic7CisKKyAgZmluYWwgU3RyaW5nIF9zZXJ2aWNlTmFtZTsKKworICBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgIDogX3NlcnZpY2VOYW1lID0gc2VydmljZU5hbWUsCisgICAgICAgIHN1cGVyKHByb3RvY29sKSB7CisgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInNlcnZpY2VOYW1lIik7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCB8fAorICAgICAgICBtZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgU3RyaW5nIG5hbWUgPSBfc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWU7CisgICAgICBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKG5hbWUsIG1lc3NhZ2UudHlwZSwgbWVzc2FnZS5zZXFpZCk7CisgICAgfQorCisgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YzAzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsOTUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIHsKKyAgZmluYWwgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgVFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpOworICB2b2lkIHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKTsKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCk7CisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKTsKKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOworICB2b2lkIHdyaXRlTWFwRW5kKCk7CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKTsKKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOworICB2b2lkIHdyaXRlU2V0RW5kKCk7CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKTsKKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYik7CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KTsKKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpOworCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCk7CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCk7CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKTsKKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcyk7CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpOworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKTsKKyAgdm9pZCByZWFkU3RydWN0RW5kKCk7CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCk7CisgIHZvaWQgcmVhZEZpZWxkRW5kKCk7CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKTsKKyAgdm9pZCByZWFkTWFwRW5kKCk7CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpOworICB2b2lkIHJlYWRMaXN0RW5kKCk7CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKTsKKyAgdm9pZCByZWFkU2V0RW5kKCk7CisKKyAgYm9vbCByZWFkQm9vbCgpOworCisgIGludCByZWFkQnl0ZSgpOworCisgIGludCByZWFkSTE2KCk7CisKKyAgaW50IHJlYWRJMzIoKTsKKworICBpbnQgcmVhZEk2NCgpOworCisgIGRvdWJsZSByZWFkRG91YmxlKCk7CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKTsKKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDAyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQKQEAgLTAsMCArMSwxNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZvcndhcmQgYWxsIG9wZXJhdGlvbnMgdG8gdGhlIHdyYXBwZWQgcHJvdG9jb2wuICBVc2VkIGFzIGEgYmFzZSBjbGFzcy4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbCB7CisgIGZpbmFsIFRQcm90b2NvbCBfcHJvdG9jb2w7CisKKyAgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkKKyAgICAgIDogX3Byb3RvY29sID0gcHJvdG9jb2wsCisgICAgICAgIHN1cGVyKHByb3RvY29sLnRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RydWN0QmVnaW4oc3RydWN0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIF9wcm90b2NvbC53cml0ZU1hcEJlZ2luKG1hcCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZU1hcEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGxpc3QpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3Byb3RvY29sLndyaXRlU2V0QmVnaW4oc2V0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlU2V0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCb29sKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCeXRlKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgX3Byb3RvY29sLndyaXRlSTE2KGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJMzIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIF9wcm90b2NvbC53cml0ZUk2NChpNjQpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIF9wcm90b2NvbC53cml0ZURvdWJsZShkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgIF9wcm90b2NvbC53cml0ZVN0cmluZyhzdHIpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCaW5hcnkoYnl0ZXMpOworICB9CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSA9PiBfcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKyAgdm9pZCByZWFkRmllbGRFbmQoKSA9PiBfcHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZE1hcEJlZ2luKCk7CisgIHZvaWQgcmVhZE1hcEVuZCgpID0+IF9wcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisgIHZvaWQgcmVhZExpc3RFbmQoKSA9PiBfcHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKworICBUU2V0IHJlYWRTZXRCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkU2V0QmVnaW4oKTsKKyAgdm9pZCByZWFkU2V0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRTZXRFbmQoKTsKKworICBib29sIHJlYWRCb29sKCkgPT4gX3Byb3RvY29sLnJlYWRCb29sKCk7CisKKyAgaW50IHJlYWRCeXRlKCkgPT4gX3Byb3RvY29sLnJlYWRCeXRlKCk7CisKKyAgaW50IHJlYWRJMTYoKSA9PiBfcHJvdG9jb2wucmVhZEkxNigpOworCisgIGludCByZWFkSTMyKCkgPT4gX3Byb3RvY29sLnJlYWRJMzIoKTsKKworICBpbnQgcmVhZEk2NCgpID0+IF9wcm90b2NvbC5yZWFkSTY0KCk7CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSA9PiBfcHJvdG9jb2wucmVhZERvdWJsZSgpOworCisgIFN0cmluZyByZWFkU3RyaW5nKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJpbmcoKTsKKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpID0+IF9wcm90b2NvbC5yZWFkQmluYXJ5KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmJhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydApAQCAtMCwwICsxLDMzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRQcm90b2NvbEVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgc3RhdGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7Cit9CisKK2NsYXNzIFRQcm90b2NvbEVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgVFByb3RvY29sRXJyb3IoW2ludCB0eXBlID0gVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmM2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRmFjdG9yeTxUIGV4dGVuZHMgVFByb3RvY29sPiB7CisgIFQgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyMDA2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQKQEAgLTAsMCArMSwxMDcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFByb3RvY29sVXRpbCB7CisgIC8vIGVxdWFsIHRvIEphdmFTY3JpcHQgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIDJeNTMgLSAxCisgIHN0YXRpYyBjb25zdCBpbnQgZGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gOTAwNzE5OTI1NDc0MDk5MTsKKworICBzdGF0aWMgaW50IG1heFJlY3Vyc2lvbkxpbWl0ID0gZGVmYXVsdFJlY3Vyc2lvbkxpbWl0OworCisgIHN0YXRpYyBza2lwKFRQcm90b2NvbCBwcm90LCBpbnQgdHlwZSkgeworICAgIF9za2lwKHByb3QsIHR5cGUsIG1heFJlY3Vyc2lvbkxpbWl0KTsKKyAgfQorCisgIHN0YXRpYyBfc2tpcChUUHJvdG9jb2wgcHJvdCwgaW50IHR5cGUsIGludCByZWN1cnNpb25MaW1pdCkgeworICAgIGlmIChyZWN1cnNpb25MaW1pdCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICBwcm90LnJlYWRCeXRlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcHJvdC5yZWFkSTY0KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBURmllbGQgZmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIF9za2lwKHByb3QsIGZpZWxkLnR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICBUTWFwIG1hcCA9IHByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgbWFwLmtleVR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgICAgX3NraXAocHJvdCwgbWFwLnZhbHVlVHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICBUU2V0IHNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgc2V0LmVsZW1lbnRUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZFNldEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIGxpc3QuZWxlbWVudFR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MjUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zZXQuZGFydApAQCAtMCwwICsxLDI1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTZXQgeworICBmaW5hbCBpbnQgZWxlbWVudFR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVFNldCh0aGlzLmVsZW1lbnRUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwM2Y2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTdHJ1Y3QgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKworICBUU3RydWN0KFt0aGlzLm5hbWUgPSAiIl0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3R5cGUuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxOWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQKQEAgLTAsMCArMSwzNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RPUCA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVk9JRCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgQk9PTCA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgQllURSA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgRE9VQkxFID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBJMTYgPSA2OworICBzdGF0aWMgY29uc3QgaW50IEkzMiA9IDg7CisgIHN0YXRpYyBjb25zdCBpbnQgSTY0ID0gMTA7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RSSU5HID0gMTE7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RSVUNUID0gMTI7CisgIHN0YXRpYyBjb25zdCBpbnQgTUFQID0gMTM7CisgIHN0YXRpYyBjb25zdCBpbnQgU0VUID0gMTQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTElTVCA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFkMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKQEAgLTAsMCArMSw1MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURGVzZXJpYWxpemVyIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnRGVzZXJpYWxpemVyJywgVE1lc3NhZ2VUeXBlLk9ORVdBWSwgMSk7CisgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBURGVzZXJpYWxpemVyKHtUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeX0pIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAKKyAgICBpZiAocHJvdG9jb2xGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB9CisgICAgCisgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisgIH0KKworICB2b2lkIHJlYWQoVEJhc2UgYmFzZSwgVWludDhMaXN0IGRhdGEpIHsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoZGF0YSk7CisgICAgCisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgCisgICAgYmFzZS5yZWFkKHByb3RvY29sKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cmluZyhUQmFzZSBiYXNlLCBTdHJpbmcgZGF0YSkgeworICAgIHRyYW5zcG9ydC53cml0ZUFsbChCQVNFNjQuZGVjb2RlKGRhdGEpKTsKKyAgICAKKyAgICB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgIGJhc2UucmVhZChwcm90b2NvbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGRkYjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNDggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFNlcmlhbGl6ZXIgeworICBmaW5hbCBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdTZXJpYWxpemVyJywgVE1lc3NhZ2VUeXBlLk9ORVdBWSwgMSk7CisgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBUU2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgIH0KKworICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworICB9CisKKyAgVWludDhMaXN0IHdyaXRlKFRCYXNlIGJhc2UpIHsKKyAgICBiYXNlLndyaXRlKHByb3RvY29sKTsKKyAgICAKKyAgICByZXR1cm4gdHJhbnNwb3J0LmNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICB9CisKKyAgU3RyaW5nIHdyaXRlU3RyaW5nKFRCYXNlIGJhc2UpIHsKKyAgICBiYXNlLndyaXRlKHByb3RvY29sKTsKKyAgICAKKyAgICBVaW50OExpc3QgYnl0ZXMgPSB0cmFuc3BvcnQuY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgCisgICAgcmV0dXJuIEJBU0U2NC5lbmNvZGUoYnl0ZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGFiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydApAQCAtMCwwICsxLDEwNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQXBwbGljYXRpb25FcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV05fTUVUSE9EID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgV1JPTkdfTUVUSE9EX05BTUUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEJBRF9TRVFVRU5DRV9JRCA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OworICBzdGF0aWMgY29uc3QgaW50IElOVEVSTkFMX0VSUk9SID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBQUk9UT0NPTF9FUlJPUiA9IDc7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4OworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBzdGF0aWMgY29uc3QgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7Cit9CisKK2NsYXNzIFRBcHBsaWNhdGlvbkVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgX3N0cnVjdCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FcnJvciIpOworICBzdGF0aWMgY29uc3QgaW50IE1FU1NBR0UgPSAxOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9tZXNzYWdlRmllbGQgPQorICAgICAgbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgTUVTU0FHRSk7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRSA9IDI7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX3R5cGVGaWVsZCA9IG5ldyBURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIFRZUEUpOworCisgIFRBcHBsaWNhdGlvbkVycm9yKAorICAgICAgW2ludCB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKKworICBzdGF0aWMgVEFwcGxpY2F0aW9uRXJyb3IgcmVhZChUUHJvdG9jb2wgaXByb3QpIHsKKyAgICBURmllbGQgZmllbGQ7CisKKyAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgaW50IHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuVU5LTk9XTjsKKworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgbWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXJyb3IodHlwZSwgbWVzc2FnZSk7CisgIH0KKworICB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9zdHJ1Y3QpOworCisgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAhbWVzc2FnZS5pc0VtcHR5KSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX21lc3NhZ2VGaWVsZCk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhtZXNzYWdlKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX3R5cGVGaWVsZCk7CisgICAgb3Byb3Qud3JpdGVJMzIodHlwZSk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydApAQCAtMCwwICsxLDM3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRCYXNlIHsKKyAgLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KTsKKworICAvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgW29wcm90XSBwcm90b2NvbC4KKyAgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpOworCisgIC8vLyBDaGVjayBpZiBhIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQgb3IgdW5zZXQsIHVzaW5nIHRoZSBbZmllbGRJZF0uCisgIGJvb2wgaXNTZXQoaW50IGZpZWxkSWQpOworCisgIC8vLyBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IFtmaWVsZElkXS4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCisgIGdldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQpOworCisgIC8vLyBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IFtmaWVsZElkXS4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCisgIHNldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQsIE9iamVjdCB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWI3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydApAQCAtMCwwICsxLDI3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisgIGZpbmFsIGludCB0eXBlOworCisgIFRFcnJvcih0aGlzLnR5cGUsIHRoaXMubWVzc2FnZSk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIjxURXJyb3IgdHlwZTogJHR5cGUgbWVzc2FnZTogJyRtZXNzYWdlJz4iOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBvcGVyYXRlcyB1cG9uIGFuIGlucHV0IHN0cmVhbSBhbmQKKy8vLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorYWJzdHJhY3QgY2xhc3MgVFByb2Nlc3NvciB7CisgIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczYTMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSw5OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQnVmZmVyZWQgaW1wbGVtZW50YXRpb24gb2YgW1RUcmFuc3BvcnRdLgorY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIGZpbmFsIExpc3Q8aW50PiBfd3JpdGVCdWZmZXIgPSBbXTsKKyAgSXRlcmF0b3I8aW50PiBfcmVhZEl0ZXJhdG9yOworCisgIFVpbnQ4TGlzdCBjb25zdW1lV3JpdGVCdWZmZXIoKSB7CisgICAgVWludDhMaXN0IGJ1ZmZlciA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX3dyaXRlQnVmZmVyKTsKKyAgICBfd3JpdGVCdWZmZXIuY2xlYXIoKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgdm9pZCBfc2V0UmVhZEJ1ZmZlcihVaW50OExpc3QgcmVhZEJ1ZmZlcikgeworICAgIF9yZWFkSXRlcmF0b3IgPSByZWFkQnVmZmVyICE9IG51bGwgPyByZWFkQnVmZmVyLml0ZXJhdG9yIDogbnVsbDsKKyAgfQorCisgIHZvaWQgX3Jlc2V0KHtib29sIGlzT3BlbjogZmFsc2V9KSB7CisgICAgX2lzT3BlbiA9IGlzT3BlbjsKKyAgICBfd3JpdGVCdWZmZXIuY2xlYXIoKTsKKyAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgfQorCisgIGJvb2wgZ2V0IGhhc1JlYWREYXRhID0+IF9yZWFkSXRlcmF0b3IgIT0gbnVsbDsKKworICBib29sIF9pc09wZW47CisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgfQorCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBpZiAoX3JlYWRJdGVyYXRvciA9PSBudWxsIHx8IGxlbmd0aCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CisgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBfcmVhZEl0ZXJhdG9yLmN1cnJlbnQ7CisgICAgICBpKys7CisgICAgfQorCisgICAgLy8gY2xlYW51cCBpdGVyYXRvciB3aGVuIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZAorICAgIGlmIChfcmVhZEl0ZXJhdG9yLmN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGk7CisgIH0KKworICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBfd3JpdGVCdWZmZXIuYWRkQWxsKGJ1ZmZlci5zdWJsaXN0KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgX3JlYWRJdGVyYXRvciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpLml0ZXJhdG9yOworCisgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWYwM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxNjkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZyYW1lZCBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgRnJhbWVkIHRyYW5zcG9ydC4KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUQnVmZmVyZWRUcmFuc3BvcnQgeworICBzdGF0aWMgY29uc3QgaW50IGhlYWRlckJ5dGVDb3VudCA9IDQ7CisKKyAgZmluYWwgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworCisgIGZpbmFsIFVpbnQ4TGlzdCBfaGVhZGVyQnl0ZXMgPSBuZXcgVWludDhMaXN0KGhlYWRlckJ5dGVDb3VudCk7CisgIGludCBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisKKyAgaW50IF9ib2R5U2l6ZSA9IDA7CisgIFVpbnQ4TGlzdCBfYm9keSA9IG51bGw7CisgIGludCBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgIENvbXBsZXRlcjxVaW50OExpc3Q+IF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisKKyAgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0IHsKKyAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInRyYW5zcG9ydCIpOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfdHJhbnNwb3J0LmlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgICByZXR1cm4gX3RyYW5zcG9ydC5vcGVuKCk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIHJldHVybiBfdHJhbnNwb3J0LmNsb3NlKCk7CisgIH0KKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGhhc1JlYWREYXRhKSB7CisgICAgICBpbnQgZ290ID0gc3VwZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgIGlmIChnb3QgPiAwKSByZXR1cm4gZ290OworICAgIH0KKworICAgIC8vIElNUE9SVEFOVDogYnkgdGhlIHRpbWUgeW91J3ZlIGdvdCBoZXJlLAorICAgIC8vIGFuIGVudGlyZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKworICAgIHJldHVybiBzdXBlci5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgdm9pZCBfcmVhZEZyYW1lKCkgeworICAgIGlmIChfYm9keSA9PSBudWxsKSB7CisgICAgICBib29sIGdvdEZ1bGxIZWFkZXIgPSBfcmVhZEZyYW1lSGVhZGVyKCk7CisgICAgICBpZiAoIWdvdEZ1bGxIZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIF9yZWFkRnJhbWVCb2R5KCk7CisgIH0KKworICBib29sIF9yZWFkRnJhbWVIZWFkZXIoKSB7CisgICAgdmFyIHJlbWFpbmluZ0hlYWRlckJ5dGVzID0gaGVhZGVyQnl0ZUNvdW50IC0gX3JlY2VpdmVkSGVhZGVyQnl0ZXM7CisKKyAgICBpbnQgZ290ID0gX3RyYW5zcG9ydC5yZWFkKF9oZWFkZXJCeXRlcywgX3JlY2VpdmVkSGVhZGVyQnl0ZXMsIHJlbWFpbmluZ0hlYWRlckJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBoZWFkZXIgcmVhZCIpOworICAgIH0KKworICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzICs9IGdvdDsKKworICAgIGlmIChfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9PSBoZWFkZXJCeXRlQ291bnQpIHsKKyAgICAgIGludCBzaXplID0gX2hlYWRlckJ5dGVzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDMyKDApOworCisgICAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisKKyAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemU6ICRzaXplIik7CisgICAgICB9CisKKyAgICAgIF9ib2R5U2l6ZSA9IHNpemU7CisgICAgICBfYm9keSA9IG5ldyBVaW50OExpc3QoX2JvZHlTaXplKTsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgdm9pZCBfcmVhZEZyYW1lQm9keSgpIHsKKyAgICB2YXIgcmVtYWluaW5nQm9keUJ5dGVzID0gX2JvZHlTaXplIC0gX3JlY2VpdmVkQm9keUJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfYm9keSwgX3JlY2VpdmVkQm9keUJ5dGVzLCByZW1haW5pbmdCb2R5Qnl0ZXMpOworICAgIGlmIChnb3QgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlNvY2tldCBjbG9zZWQgZHVyaW5nIGZyYW1lIGJvZHkgcmVhZCIpOworICAgIH0KKworICAgIF9yZWNlaXZlZEJvZHlCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkQm9keUJ5dGVzID09IF9ib2R5U2l6ZSkgeworICAgICAgdmFyIGJvZHkgPSBfYm9keTsKKworICAgICAgX2JvZHlTaXplID0gMDsKKyAgICAgIF9ib2R5ID0gbnVsbDsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgICAgIF9zZXRSZWFkQnVmZmVyKGJvZHkpOworCisgICAgICB2YXIgY29tcGxldGVyID0gX2ZyYW1lQ29tcGxldGVyOworICAgICAgX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShuZXcgVWludDhMaXN0KDApKTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBpZiAoX2ZyYW1lQ29tcGxldGVyID09IG51bGwpIHsKKyAgICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICAgIGludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoOworCisgICAgICBfaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRVaW50MzIoMCwgbGVuZ3RoKTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoX2hlYWRlckJ5dGVzLCAwLCBoZWFkZXJCeXRlQ291bnQpOworICAgICAgX3RyYW5zcG9ydC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisKKyAgICAgIF9mcmFtZUNvbXBsZXRlciAgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4oKTsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gX2ZyYW1lQ29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpIHsKKyAgICBfdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgX3JlYWRGcmFtZSgpOworICAgIH0pLmNhdGNoRXJyb3IoKGUpIHsKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfZnJhbWVDb21wbGV0ZXI7CisKKyAgICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworICAgICAgX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKworICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZSk7CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc4ZTljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTAwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBIVFRQIGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQobmV3IEJyb3dzZXJDbGllbnQoKSwKKy8vLyAgICAgICAgIG5ldyBUSHR0cENvbmZpZyh1cmwsIHsnWC1NeS1DdXN0b20tSGVhZGVyJzogJ215IHZhbHVlJ30pKTsKKy8vLyAgICAgdmFyIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKy8vLyAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFNlcnZpY2VDbGllbnQocHJvdG9jb2wpOworLy8vICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lm15TWV0aG9kKCk7CisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEpTIFhIUiBIVFRQIHRyYW5zcG9ydC4KK2NsYXNzIFRIdHRwQ2xpZW50VHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgZmluYWwgQ2xpZW50IGh0dHBDbGllbnQ7CisgIGZpbmFsIFRIdHRwQ29uZmlnIGNvbmZpZzsKKworICBUSHR0cENsaWVudFRyYW5zcG9ydCh0aGlzLmh0dHBDbGllbnQsIHRoaXMuY29uZmlnKSB7CisgICAgaWYgKGh0dHBDbGllbnQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiaHR0cENsaWVudCIpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgaHR0cENsaWVudC5jbG9zZSgpOworICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIHZhciByZXF1ZXN0Qm9keSA9IEJBU0U2NC5lbmNvZGUoY29uc3VtZVdyaXRlQnVmZmVyKCkpOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyLnN5bmMoKTsKKworICAgIGh0dHBDbGllbnQKKyAgICAgICAgLnBvc3QoY29uZmlnLnVybCwgaGVhZGVyczogY29uZmlnLmhlYWRlcnMsIGJvZHk6IHJlcXVlc3RCb2R5KQorICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhOworICAgICAgdHJ5IHsKKyAgICAgICAgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCisgICAgICAgICAgICBCQVNFNjQuZGVjb2RlKHJlc3BvbnNlLmJvZHkpKTsKKyAgICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIH0KKworICAgICAgX3NldFJlYWRCdWZmZXIoZGF0YSk7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9KTsKKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9Cit9CisKK2NsYXNzIFRIdHRwQ29uZmlnIHsKKyAgZmluYWwgVXJpIHVybDsKKworICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9oZWFkZXJzOworICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBoZWFkZXJzID0+IF9oZWFkZXJzOworCisgIFRIdHRwQ29uZmlnKHRoaXMudXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKKyAgICBpZiAodXJsID09IG51bGwgfHwgIXVybC5oYXNBdXRob3JpdHkpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIHVybCIpOworICAgIH0KKworICAgIF9pbml0SGVhZGVycyhoZWFkZXJzKTsKKyAgfQorCisgIHZvaWQgX2luaXRIZWFkZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdGlhbCkgeworICAgIHZhciBoID0ge307CisKKyAgICBpZiAoaW5pdGlhbCAhPSBudWxsKSB7CisgICAgICBoLmFkZEFsbChpbml0aWFsKTsKKyAgICB9CisKKyAgICBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXRocmlmdCc7CisgICAgaFsnQWNjZXB0J10gPSAnYXBwbGljYXRpb24veC10aHJpZnQnOworCisgICAgX2hlYWRlcnMgPSBuZXcgTWFwLnVubW9kaWZpYWJsZShoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTA3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQKQEAgLTAsMCArMSw5OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gW1RNZXNzYWdlUmVhZGVyXSBleHRyYWN0cyBhIFtUTWVzc2FnZV0gZnJvbSBieXRlcy4gIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBhCisvLy8gdHJhbnNwb3J0IHRvIGluc3BlY3QgdGhlIG1lc3NhZ2Ugc2VxaWQgYW5kIG1hcCByZXNwb25zZXMgdG8gcmVxdWVzdHMuCitjbGFzcyBUTWVzc2FnZVJlYWRlciB7CisgIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworCisgIGZpbmFsIGludCBieXRlT2Zmc2V0OworICBmaW5hbCBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKworICAvLy8gQ29uc3RydWN0IGEgW01lc3NhZ2VSZWFkZXJdLiAgVGhlIG9wdGlvbmFsIFtieXRlT2Zmc2V0XSBzcGVjaWZpZXMgdGhlCisgIC8vLyBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgcmVhZGluZyB0aGUgW1RNZXNzYWdlXS4KKyAgVE1lc3NhZ2VSZWFkZXIodGhpcy5wcm90b2NvbEZhY3RvcnksIHtpbnQgYnl0ZU9mZnNldDogMH0pCisgICAgICA6IF90cmFuc3BvcnQgPSBuZXcgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0KCksCisgICAgICAgIHRoaXMuYnl0ZU9mZnNldCA9IGJ5dGVPZmZzZXQ7CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2UoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3RyYW5zcG9ydC5yZXNldChieXRlcywgYnl0ZU9mZnNldCk7CisgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKF90cmFuc3BvcnQpOworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgX3RyYW5zcG9ydC5yZXNldChudWxsKTsKKworICAgIHJldHVybiBtZXNzYWdlOworICB9Cit9CisKKy8vLyBBbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHN1cHBvcnQgW1RNZXNzYWdlUmVhZGVyXS4KK2NsYXNzIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworICBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQoKTsKKworICBJdGVyYXRvcjxpbnQ+IF9yZWFkSXRlcmF0b3I7CisKKyAgdm9pZCByZXNldChVaW50OExpc3QgYnl0ZXMsIFtpbnQgb2Zmc2V0ID0gMF0pIHsKKyAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgeworICAgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG9mZnNldCA+IGJ5dGVzLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBvZmZzZXQgZXhjZWVkcyB0aGUgYnl0ZXMgbGVuZ3RoIik7CisgICAgfQorCisgICAgX3JlYWRJdGVyYXRvciA9IGJ5dGVzLml0ZXJhdG9yOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgeworICAgICAgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpOworICAgIH0KKyAgfQorCisgIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBGdXR1cmUgb3BlbigpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgRnV0dXJlIGNsb3NlKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgaWYgKF9yZWFkSXRlcmF0b3IgPT0gbnVsbCB8fCBsZW5ndGggPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKSkgeworICAgICAgYnVmZmVyW29mZnNldCArIGldID0gX3JlYWRJdGVyYXRvci5jdXJyZW50OworICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA9PgorICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBGdXR1cmUgZmx1c2goKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYjZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwzOCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitlbnVtIFRTb2NrZXRTdGF0ZSB7IENMT1NFRCwgT1BFTiB9CisKK2Fic3RyYWN0IGNsYXNzIFRTb2NrZXQgeworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZTsKKworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvcjsKKworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlOworCisgIGJvb2wgZ2V0IGlzT3BlbjsKKworICBib29sIGdldCBpc0Nsb3NlZDsKKworICBGdXR1cmUgb3BlbigpOworCisgIEZ1dHVyZSBjbG9zZSgpOworCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTM3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDE3NyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChuZXcgVFdlYlNvY2tldCh1cmwpKTsKKy8vLyAgICAgdmFyIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworLy8vICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U2VydmljZUNsaWVudChwcm90b2NvbCk7CisvLy8gICAgIHZhciByZXN1bHQgPSBjbGllbnQubXlNZXRob2QoKTsKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSlMgV2ViU29ja2V0IHRyYW5zcG9ydC4KK2Fic3RyYWN0IGNsYXNzIFRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUQnVmZmVyZWRUcmFuc3BvcnQgeworICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IExvZ2dlcigndGhyaWZ0LlRTb2NrZXRUcmFuc3BvcnQnKTsKKworICBmaW5hbCBUU29ja2V0IHNvY2tldDsKKworICAvLy8gQSB0cmFuc3BvcnQgdXNpbmcgdGhlIHByb3ZpZGVkIFtzb2NrZXRdLgorICBUU29ja2V0VHJhbnNwb3J0KHRoaXMuc29ja2V0KSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBzb2NrZXQub25FcnJvci5saXN0ZW4oKGUpID0+IGxvZ2dlci53YXJuaW5nKGUpKTsKKyAgICBzb2NrZXQub25NZXNzYWdlLmxpc3RlbihoYW5kbGVJbmNvbWluZ01lc3NhZ2UpOworICB9CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IHNvY2tldC5pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgICAgcmV0dXJuIHNvY2tldC5vcGVuKCk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIHJldHVybiBzb2NrZXQuY2xvc2UoKTsKKyAgfQorCisgIC8vLyBNYWtlIGFuIGluY29taW5nIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0LgorICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgX3NldFJlYWRCdWZmZXIobWVzc2FnZUJ5dGVzKTsKKyAgfQorfQorCisvLy8gW1RDbGllbnRTb2NrZXRUcmFuc3BvcnRdIGlzIGEgYmFzaWMgY2xpZW50IHNvY2tldCB0cmFuc3BvcnQuICBJdCBzZW5kcworLy8vIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBleHBlY3RzIGEgcmVzcG9uc2UuCisvLy8KKy8vLyBOT1RFOiBUaGlzIHRyYW5zcG9ydCBleHBlY3RzIGEgc2luZ2xlIHRocmVhZGVkIHNlcnZlciwgYXMgaXQgd2lsbCBwcm9jZXNzCisvLy8gcmVzcG9uc2VzIGluIEZJRk8gb3JkZXIuCitjbGFzcyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIGZpbmFsIExpc3Q8Q29tcGxldGVyPFVpbnQ4TGlzdD4+IF9jb21wbGV0ZXJzID0gW107CisKKyAgVENsaWVudFNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCkgOiBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+LnN5bmMoKTsKKyAgICBfY29tcGxldGVycy5hZGQoY29tcGxldGVyKTsKKworICAgIGlmIChieXRlcy5sZW5ndGhJbkJ5dGVzID4gMCkgeworICAgICAgc29ja2V0LnNlbmQoYnl0ZXMpOworICAgIH0KKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgaWYgKF9jb21wbGV0ZXJzLmlzTm90RW1wdHkpIHsKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmVBdCgwKTsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0KKyAgfQorfQorCisvLy8gW1RBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydF0gc2VuZHMgb3V0Z29pbmcgbWVzc2FnZXMgYW5kIGV4cGVjdHMgYW4KKy8vLyBhc3luY2hyb25vdXMgcmVzcG9uc2UuCisvLy8KKy8vLyBOT1RFOiBUaGlzIHRyYW5zcG9ydCB1c2VzIGEgW01lc3NhZ2VSZWFkZXJdIHRvIHJlYWQgYSBbVE1lc3NhZ2VdIHdoZW4gYW4KKy8vLyBpbmNvbWluZyBtZXNzYWdlIGFycml2ZXMgdG8gY29ycmVsYXRlIGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0LCB1c2luZyB0aGUKKy8vLyBzZXFpZC4KK2NsYXNzIFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBzdGF0aWMgY29uc3QgZGVmYXVsdFRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAzMCk7CisKKyAgZmluYWwgTWFwPGludCwgQ29tcGxldGVyPFVpbnQ4TGlzdD4+IF9jb21wbGV0ZXJzID0ge307CisKKyAgZmluYWwgVE1lc3NhZ2VSZWFkZXIgbWVzc2FnZVJlYWRlcjsKKworICBmaW5hbCBEdXJhdGlvbiByZXNwb25zZVRpbWVvdXQ7CisKKyAgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0LCBUTWVzc2FnZVJlYWRlciBtZXNzYWdlUmVhZGVyLAorICAgICAge0R1cmF0aW9uIHJlc3BvbnNlVGltZW91dDogZGVmYXVsdFRpbWVvdXR9KQorICAgICAgOiB0aGlzLm1lc3NhZ2VSZWFkZXIgPSBtZXNzYWdlUmVhZGVyLAorICAgICAgICB0aGlzLnJlc3BvbnNlVGltZW91dCA9IHJlc3BvbnNlVGltZW91dCwKKyAgICAgICAgc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VSZWFkZXIucmVhZE1lc3NhZ2UoYnl0ZXMpOworICAgIGludCBzZXFpZCA9IG1lc3NhZ2Uuc2VxaWQ7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0Pi5zeW5jKCk7CisgICAgX2NvbXBsZXRlcnNbc2VxaWRdID0gY29tcGxldGVyOworCisgICAgaWYgKHJlc3BvbnNlVGltZW91dCAhPSBudWxsKSB7CisgICAgICBuZXcgRnV0dXJlLmRlbGF5ZWQocmVzcG9uc2VUaW1lb3V0LCAoKSB7CisgICAgICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmUoc2VxaWQpOworICAgICAgICBpZiAoY29tcGxldGVyICE9IG51bGwpIHsKKyAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcigKKyAgICAgICAgICAgICAgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlJlc3BvbnNlIHRpbWVkIG91dC4iLCByZXNwb25zZVRpbWVvdXQpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgICAgc29ja2V0LnNlbmQoYnl0ZXMpOworCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVJlYWRlci5yZWFkTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmUobWVzc2FnZS5zZXFpZCk7CisgICAgaWYgKGNvbXBsZXRlciAhPSBudWxsKSB7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9CisgIH0KK30KKworLy8vIFtUU2VydmVyU29ja2V0VHJhbnNwb3J0XSBsaXN0ZW5zIGZvciBpbmNvbWluZyBtZXNzYWdlcy4gIFdoZW4gaXQgc2VuZHMgYQorLy8vIHJlc3BvbnNlLCBpdCBkb2VzIG5vdCBleHBlY3QgYW4gYWNrbm93bGVkZ2VtZW50LgorY2xhc3MgVFNlcnZlclNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyIF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbSBnZXQgb25JbmNvbWluZ01lc3NhZ2UgPT4gX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCkKKyAgICAgIDogX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIGFzeW5jIHsKKyAgICBVaW50OExpc3QgbWVzc2FnZSA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIHNvY2tldC5zZW5kKG1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlci5hZGQobnVsbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2Q1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsNzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCB7CisgIC8vLyBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICBib29sIGdldCBpc09wZW47CisKKyAgLy8vIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZy4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGUgdHJhbnNwb3J0IGNvdWxkIG5vdCBiZSBvcGVuZWQuCisgIEZ1dHVyZSBvcGVuKCk7CisKKyAgLy8vIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICBGdXR1cmUgY2xvc2UoKTsKKworICAvLy8gUmVhZHMgdXAgdG8gW2xlbmd0aF0gYnl0ZXMgaW50byBbYnVmZmVyXSwgc3RhcnRpbmcgYXQgW29mZnNldF0uCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgIC8vLyBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIFtsZW5ndGhdIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgorICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8KKyAgLy8vIFtsZW5ndGhdLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgaW50IHJlYWRBbGwoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGludCBnb3QgPSAwOworICAgIGludCByZXQgPSAwOworICAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKKyAgICAgIHJldCA9IHJlYWQoYnVmZmVyLCBvZmZzZXQgKyBnb3QsIGxlbmd0aCAtIGdvdCk7CisgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAkbGVuZ3RoICIKKyAgICAgICAgICAgICJieXRlcywgYnV0IG9ubHkgZ290ICRnb3QgYnl0ZXMuIik7CisgICAgICB9CisgICAgICBnb3QgKz0gcmV0OworICAgIH0KKyAgICByZXR1cm4gZ290OworICB9CisKKyAgLy8vIFdyaXRlcyB1cCB0byBbbGVuXSBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgIC8vLyBXcml0ZXMgdGhlIFtieXRlc10gdG8gdGhlIG91dHB1dC4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBkYXRhCisgIHZvaWQgd3JpdGVBbGwoVWludDhMaXN0IGJ1ZmZlcikgeworICAgIHdyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgIH0KKworICAvLy8gRmx1c2ggYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSB0cmFuc3BvcnQgYnVmZmVyLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIG91dCBkYXRhLgorICBGdXR1cmUgZmx1c2goKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTA4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMzEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFRyYW5zcG9ydEVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgTk9UX09QRU4gPSAxOworICBzdGF0aWMgY29uc3QgaW50IEFMUkVBRFlfT1BFTiA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgVElNRURfT1VUID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBFTkRfT0ZfRklMRSA9IDQ7Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRFcnJvciBleHRlbmRzIFRFcnJvciB7CisgIFRUcmFuc3BvcnRFcnJvcihbaW50IHR5cGUgPSBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEwNDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0CkBAIC0wLDAgKzEsMjcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBhIFtUVHJhbnNwb3J0XS4gVGhpcyBpcworLy8vIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgRnV0dXJlPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgPT4KKyAgICAgIG5ldyBGdXR1cmUudmFsdWUodHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDliYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0CkBAIC0wLDAgKzEsNjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFV0ZjhDb2RlYywgQkFTRTY0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgQnl0ZURhdGE7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBFbmRpYW5uZXNzOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6Zml4bnVtL2ZpeG51bS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBDbGllbnQ7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworCitwYXJ0ICdzcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90X2Jhc2UuZGFydCc7CitwYXJ0ICdzcmMvdF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90X3Byb2Nlc3Nvci5kYXJ0JzsKKworcGFydCAnc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2xpc3QuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9tYXAuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9zZXQuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQnOworCitwYXJ0ICdzcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0JzsKK3BhcnQgJ3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0JzsKKworcGFydCAnc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydCc7CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfYnJvd3Nlci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmMyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApAQCAtMCwwICsxLDIyIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnRfYnJvd3NlcjsKKworLy8vIENsYXNzZXMgdGhhdCBhcmUgb25seSBzdXBwb3J0ZWQgaW4gYnJvd3NlciBhcHBsaWNhdGlvbnMgZ28gaGVyZQorCitleHBvcnQgJ3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0JyBzaG93IFRXZWJTb2NrZXQ7CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfY29uc29sZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTgzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApAQCAtMCwwICsxLDIzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnRfY29uc29sZTsKKworLy8vIENsYXNzZXMgdGhhdCBhcmUgb25seSBzdXBwb3J0ZWQgaW4gY29uc29sZSBhcHBsaWNhdGlvbnMgZ28gaGVyZQorCitleHBvcnQgJ3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0JyBzaG93IFRUY3BTb2NrZXQ7CitleHBvcnQgJ3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0JyBzaG93IFRXZWJTb2NrZXQ7CmRpZmYgLS1naXQgYS9saWIvZGFydC9wdWJzcGVjLnlhbWwgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjNGEwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDQzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBsaWJyYXJ5IGZvciBBcGFjaGUgVGhyaWZ0CithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworZG9jdW1lbnRhdGlvbjogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgZml4bnVtOiBeMC4xMC4yCisgIGh0dHA6IF4wLjExLjMKKyAgbG9nZ2luZzogXjAuMTEuMAorCitkZXZfZGVwZW5kZW5jaWVzOgorICAjIHRlc3QKKyAgbW9ja2l0bzogXjEuMC4wCisgIHRlc3Q6IF4wLjEyLjAKKworICAjIGRhcnRfZGV2IC0gaHR0cHM6Ly9naXRodWIuY29tL1dvcmtpdmEvZGFydF9kZXYKKyAgZGFydF9kZXY6IF4xLjUuMAorICBjb3ZlcmFnZTogXjAuNy4zCisgIGRhcnRfc3R5bGU6ICI+PTAuMi40IDwwLjMuMCIKKyAgZGFydGRvYzogXjAuOS4wCmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3Byb3RvY29sL3RfcHJvdG9jb2xfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZjZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydApAQCAtMCwwICsxLDQwNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9qc29uX3Byb3RvY29sX3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVVEY4OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnbXkgbWVzc2FnZScsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEyMyk7CisKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHRUeXBlKSB7CisgICAgc3dpdGNoICh0VHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkQm9vbCwgcHJvdG9jb2wud3JpdGVCb29sLCBmYWxzZSk7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJ5dGUsIHByb3RvY29sLndyaXRlQnl0ZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTE2LCBwcm90b2NvbC53cml0ZUkxNiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTMyLCBwcm90b2NvbC53cml0ZUkzMiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTY0LCBwcm90b2NvbC53cml0ZUk2NCwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkRG91YmxlLCBwcm90b2NvbC53cml0ZURvdWJsZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkU3RyaW5nLCBwcm90b2NvbC53cml0ZVN0cmluZywgJycpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgVFR5cGUgJHRUeXBlIik7CisgICAgfQorICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZVRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSwgaW5wdXQpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUoaW5wdXQpOworICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgdmFyIG91dHB1dCA9IHByaW1pdGl2ZS5yZWFkKCk7CisKKyAgICBleHBlY3Qob3V0cHV0LCBpbnB1dCk7CisgIH0KKworICBGdXR1cmUgcHJpbWl0aXZlTnVsbFRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSkgYXN5bmMgeworICAgIHByaW1pdGl2ZS53cml0ZShudWxsKTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgcHJpbWl0aXZlLmRlZmF1bHRWYWx1ZSk7CisgIH0KKworICB2YXIgc2hhcmVkVGVzdHMgPSAoKSB7CisgICAgdGVzdCgnVGVzdCBtZXNzYWdlJywgKCkgYXN5bmMgeworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgZXhwZWN0KHN1YmplY3QubmFtZSwgbWVzc2FnZS5uYW1lKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIG1lc3NhZ2UudHlwZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC5zZXFpZCwgbWVzc2FnZS5zZXFpZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU3RydWN0KCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAvLyBuYW1lIGlzIG5vdCBzZXJpYWxpemVkLCBzZWUgQyMgdmVyc2lvbiBmb3IgcmVmZXJlbmNlCisgICAgICBleHBlY3Qob3V0cHV0LCBpc05vdE51bGwpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBmaWVsZCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBURmllbGQoJ215IGZpZWxkJywgVFR5cGUuTUFQLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dC50eXBlLCBpbnB1dC50eXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQuaWQsIGlucHV0LmlkKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbWFwJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRNYXAoVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRNYXBCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmtleVR5cGUsIGlucHV0LmtleVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC52YWx1ZVR5cGUsIGlucHV0LnZhbHVlVHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbGlzdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTGlzdChUVHlwZS5TVFJJTkcsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRTZXQoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZVNldEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU2V0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQuZWxlbWVudFR5cGUsIGlucHV0LmVsZW1lbnRUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCksIHRydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBieXRlJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQllURSksIDY0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSwgMzI3NjcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMTYgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMTYpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTMyJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTMyKSwgMjE0NzQ4MzY0Nyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMiBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJNjQnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JNjQpLCA5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSksIDMuMTQxNTkyNik7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJpbmcnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSAnVGhlcmUgYXJlIG9ubHkgdHdvIGhhcmQgdGhpbmdzIGluIGNvbXB1dGVyIHNjaWVuY2U6ICcKKyAgICAgICAgICAnY2FjaGUgaW52YWxpZGF0aW9uLCBuYW1pbmcgdGhpbmdzLCBhbmQgb2ZmLWJ5LW9uZSBlcnJvcnMuJzsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORyksIGlucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuU1RSSU5HKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJpbmFyeScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobmV3IExpc3QuZmlsbGVkKDEwMCwgMTIzKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlQmluYXJ5KGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRCaW5hcnkoKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3Qob3V0cHV0LmV2ZXJ5KChpKSA9PiBpID09IDEyMyksIGlzVHJ1ZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNvbXBsZXggc3RydWN0JywgKCkgYXN5bmMgeworICAgICAgLy8gezE6IHsxMDogMjB9LCAyOiB7MzA6IDQwfX0KKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmV3IFRTdHJ1Y3QoKSk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmV3IFRGaWVsZCgnc3VjY2VzcycsIFRUeXBlLk1BUCwgMCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLk1BUCwgMikpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigxKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigxMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKS50eXBlLCBUVHlwZS5NQVApOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMik7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAzMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG5lc3RlZCBtYXBzIGFuZCBsaXN0cycsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiBbezEwOiAyMH1dLCAyOiBbezMwOiA0MH1dfQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkxJU1QsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ0pTT04nLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGVzY2FwZWQgdW5pY29kZScsICgpIGFzeW5jIHsKKyAgICAgIC8qCisgICAgICAgICBLT1JfS0FJCisgICAgICAgICAgIFVURi04OiAgMHhFMCAweEI4IDB4ODEKKyAgICAgICAgICAgVVRGLTE2OiAweDBFMDEKKyAgICAgICAgIEcgY2xlZjoKKyAgICAgICAgICAgVVRGLTg6ICAweEYwIDB4OUQgMHg4NCAweDlFCisgICAgICAgICAgIFVURi0xNjogMHhEODM0IDB4REQxRQorICAgICAgICovCisgICAgICB2YXIgYnVmZmVyID0gVVRGOC5lbmNvZGUociciXHUwMDAxXHUwZTAxIFx1ZDgzNFx1ZGQxZSInKTsKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoYnVmZmVyKTsKKworICAgICAgdmFyIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHZhciBzdWJqZWN0ID0gcHJvdG9jb2wucmVhZFN0cmluZygpOworICAgICAgZXhwZWN0KHN1YmplY3QsCisgICAgICAgICAgVVRGOC5kZWNvZGUoWzB4MDEsIDB4RTAsIDB4QjgsIDB4ODEsIDB4MjAsIDB4RjAsIDB4OUQsIDB4ODQsIDB4OUVdKSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnYmluYXJ5JywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnY29tcGFjdCcsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICB9KTsKKworICAgIGdyb3VwKCdzaGFyZWQgdGVzdHMnLCBzaGFyZWRUZXN0cyk7CisgIH0pOworfQorCitjbGFzcyBQcmltaXRpdmUgeworICBmaW5hbCBGdW5jdGlvbiByZWFkOworICBmaW5hbCBGdW5jdGlvbiB3cml0ZTsKKyAgZmluYWwgZGVmYXVsdFZhbHVlOworCisgIFByaW1pdGl2ZSh0aGlzLnJlYWQsIHRoaXMud3JpdGUsIHRoaXMuZGVmYXVsdFZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc2NTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAnc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIHNlcmlhbGl6ZXIgPSAoKSB7CisgICAgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXI7CisgICAgVFNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICBUZXN0VE9iamVjdCB0ZXN0VE9iamVjdDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisgICAgICAKKyAgICAgIHRlc3RUT2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICB0ZXN0VE9iamVjdC5iID0gdHJ1ZTsKKyAgICAgIHRlc3RUT2JqZWN0LnMgPSAiVEVTVCI7CisgICAgICB0ZXN0VE9iamVjdC5kID0gMTUuMjU7CisgICAgICB0ZXN0VE9iamVjdC5pID0gMTA7CisgICAgICAKKyAgICAgIHZhciB0ZXN0TGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKKyAgICAgIHRlc3RMaXN0LmFkZCgiVEVTVCAxIik7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMiIpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdC5sID0gdGVzdExpc3Q7CisgICAgfSk7CisgICAgCisgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChUZXN0VE9iamVjdCBuZXdPYmplY3QpIHsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QubCwgZXF1YWxzKHRlc3RUT2JqZWN0LmwpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuYiwgZXF1YWxzKHRlc3RUT2JqZWN0LmIpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuaSwgZXF1YWxzKHRlc3RUT2JqZWN0LmkpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuZCwgZXF1YWxzKHRlc3RUT2JqZWN0LmQpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QucywgZXF1YWxzKHRlc3RUT2JqZWN0LnMpKTsKKyAgICB9CisgICAgCisgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlU3RyaW5nKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWRTdHJpbmcobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICBydW5Xcml0ZVRlc3QoKSB7CisgICAgICB2YXIgcyA9IHNlcmlhbGl6ZXIud3JpdGUodGVzdFRPYmplY3QpOworCisgICAgICB2YXIgbmV3T2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICBkZXNlcmlhbGl6ZXIucmVhZChuZXdPYmplY3QsIHMpOworCisgICAgICBhc3NlcnROZXdPYmplY3RFcXVhbHNUT2JqZWN0KG5ld09iamVjdCk7CisgICAgfTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wgU3RyaW5nJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKyAgfTsKKworICBncm91cCgnU2VyaWFsaXplcicsIHNlcmlhbGl6ZXIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg2ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbGlicmFyeSB0aHJpZnQudGVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZXJfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBUZXN0VE9iamVjdCBpcyBhIHNpbXBsZSB0ZXN0IHN0cnVjdAorY2xhc3MgVGVzdFRPYmplY3QgaW1wbGVtZW50cyBUQmFzZSB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KCJUZXN0VE9iamVjdCIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9JX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJpIiwgVFR5cGUuSTMyLCAxKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfRF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiZCIsIFRUeXBlLkRPVUJMRSwgMik7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX1NfRklFTERfREVTQyA9IG5ldyBURmllbGQoInMiLCBUVHlwZS5TVFJJTkcsIDMpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9MX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJsIiwgVFR5cGUuTElTVCwgNCk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0JfRklFTERfREVTQyA9IG5ldyBURmllbGQoImIiLCBUVHlwZS5CT09MLCA1KTsKKworICBpbnQgX2k7CisgIHN0YXRpYyBjb25zdCBpbnQgSSA9IDE7CisgIGRvdWJsZSBfZDsKKyAgc3RhdGljIGNvbnN0IGludCBEID0gMjsKKyAgU3RyaW5nIF9zOworICBzdGF0aWMgY29uc3QgaW50IFMgPSAzOworICBMaXN0PFN0cmluZz4gX2w7CisgIHN0YXRpYyBjb25zdCBpbnQgTCA9IDQ7CisgIGJvb2wgX2I7CisgIHN0YXRpYyBjb25zdCBpbnQgQiA9IDU7CisKKyAgYm9vbCBfX2lzc2V0X2kgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2QgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2IgPSBmYWxzZTsKKworICBUZXN0VE9iamVjdCgpIHsKKyAgfQorCisgIC8vIGkKKyAgaW50IGdldCBpID0+IHRoaXMuX2k7CisKKyAgc2V0IGkoaW50IGkpIHsKKyAgICB0aGlzLl9pID0gaTsKKyAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0SSgpID0+IHRoaXMuX19pc3NldF9pOworCisgIHVuc2V0SSgpIHsKKyAgICB0aGlzLl9faXNzZXRfaSA9IGZhbHNlOworICB9CisKKyAgLy8gZAorICBkb3VibGUgZ2V0IGQgPT4gdGhpcy5fZDsKKworICBzZXQgZChkb3VibGUgZCkgeworICAgIHRoaXMuX2QgPSBkOworICAgIHRoaXMuX19pc3NldF9kID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXREKCkgPT4gdGhpcy5fX2lzc2V0X2Q7CisKKyAgdW5zZXREKCkgeworICAgIHRoaXMuX19pc3NldF9kID0gZmFsc2U7CisgIH0KKworICAvLyBzCisgIFN0cmluZyBnZXQgcyA9PiB0aGlzLl9zOworCisgIHNldCBzKFN0cmluZyBzKSB7CisgICAgdGhpcy5fcyA9IHM7CisgIH0KKworICBib29sIGlzU2V0UygpID0+IHRoaXMucyAhPSBudWxsOworCisgIHVuc2V0UygpIHsKKyAgICB0aGlzLnMgPSBudWxsOworICB9CisKKyAgLy8gbAorICBMaXN0PFN0cmluZz4gZ2V0IGwgPT4gdGhpcy5fbDsKKworICBzZXQgbChMaXN0PFN0cmluZz4gbCkgeworICAgIHRoaXMuX2wgPSBsOworICB9CisKKyAgYm9vbCBpc1NldEwoKSA9PiB0aGlzLmwgIT0gbnVsbDsKKworICB1bnNldEwoKSB7CisgICAgdGhpcy5sID0gbnVsbDsKKyAgfQorCisgIC8vIGIKKyAgYm9vbCBnZXQgYiA9PiB0aGlzLl9iOworCisgIHNldCBiKGJvb2wgYikgeworICAgIHRoaXMuX2IgPSBiOworICAgIHRoaXMuX19pc3NldF9iID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXRCKCkgPT4gdGhpcy5fX2lzc2V0X2I7CisKKyAgdW5zZXRCKCkgeworICAgIHRoaXMuX19pc3NldF9iID0gZmFsc2U7CisgIH0KKworICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIHJldHVybiB0aGlzLmk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiB0aGlzLmQ7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiB0aGlzLnM7CisgICAgICBjYXNlIEw6CisgICAgICAgIHJldHVybiB0aGlzLmw7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiB0aGlzLmI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElELCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmkgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0RCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuZCA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFM6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRTKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmwgPSB2YWx1ZSBhcyBMaXN0PFN0cmluZz47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQjoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmIgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBpc1NldChpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gaXNTZXRJKCk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiBpc1NldEQoKTsKKyAgICAgIGNhc2UgUzoKKyAgICAgICAgcmV0dXJuIGlzU2V0UygpOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gaXNTZXRMKCk7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiBpc1NldEIoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICBjYXNlIEk6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0aGlzLmkgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEQ6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICB0aGlzLmQgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFM6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICB0aGlzLnMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEw6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuTElTVCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICBUTGlzdCBfbGlzdDc0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICB0aGlzLmwgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgIGZvciAoaW50IF9pNzUgPSAwOyBfaTc1IDwgX2xpc3Q3NC5sZW5ndGg7ICsrX2k3NSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTc2OworICAgICAgICAgICAgICAgIF9lbGVtNzYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGhpcy5sLmFkZChfZWxlbTc2KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgICAgICAgIHRoaXMuYiA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kCisgICAgdmFsaWRhdGUoKTsKKyAgfQorCisgIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeworICAgIHZhbGlkYXRlKCk7CisKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9JX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlSTMyKHRoaXMuaSk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfRF9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZURvdWJsZSh0aGlzLmQpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBpZiAodGhpcy5zICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfU19GSUVMRF9ERVNDKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHRoaXMucyk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorICAgIGlmICh0aGlzLmwgIT0gbnVsbCkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9MX0ZJRUxEX0RFU0MpOworICAgICAgeworICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCB0aGlzLmwubGVuZ3RoKSk7CisgICAgICAgIGZvciAodmFyIGVsZW03NyBpbiB0aGlzLmwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlbGVtNzcpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0JfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVCb29sKHRoaXMuYik7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdFRPYmplY3QoIik7CisKKyAgICByZXQud3JpdGUoImk6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuaSk7CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJkOiIpOworICAgIHJldC53cml0ZSh0aGlzLmQpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiczoiKTsKKyAgICBpZiAodGhpcy5zID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5zKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJsOiIpOworICAgIGlmICh0aGlzLmwgPT0gbnVsbCkgeworICAgICAgcmV0LndyaXRlKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldC53cml0ZSh0aGlzLmwpOworICAgIH0KKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoImI6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuYik7CisKKyAgICByZXQud3JpdGUoIikiKTsKKworICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgfQorCisgIHZhbGlkYXRlKCkgeworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RfYXBwbGljYXRpb25fZXJyb3JfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFkOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRfYXBwbGljYXRpb25fZXJyb3JfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBzZXRVcCgoKSB7CisgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgIH0pOworCisgIHRlc3QoJ1dyaXRlIGFuZCByZWFkIGFuIGFwcGxpY2F0aW9uIGVycm9yJywgKCkgeworICAgIHZhciBleHBlY3RlZFR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1I7CisgICAgdmFyIGV4cGVjdGVkTWVzc2FnZSA9ICd0ZXN0IGVycm9yIG1lc3NhZ2UnOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3IgZXJyb3IgPQorICAgICAgICBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoZXhwZWN0ZWRUeXBlLCBleHBlY3RlZE1lc3NhZ2UpOworICAgIGVycm9yLndyaXRlKHByb3RvY29sKTsKKworICAgIHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3Igc3ViamVjdCA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQocHJvdG9jb2wpOworCisgICAgZXhwZWN0KHN1YmplY3QsIGlzTm90TnVsbCk7CisgICAgZXhwZWN0KHN1YmplY3QudHlwZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICBleHBlY3Qoc3ViamVjdC5tZXNzYWdlLCBleHBlY3RlZE1lc3NhZ2UpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzJlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTc1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X2ZyYW1lZF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdURnJhbWVkVHJhbnNwb3J0IHBhcnRpYWwgcmVhZHMnLCAoKSB7CisgICAgZmluYWwgZmx1c2hBd2FpdER1cmF0aW9uID0gbmV3IER1cmF0aW9uKHNlY29uZHM6IDEwKTsKKworICAgIEZha2VSZWFkT25seVNvY2tldCBzb2NrZXQ7CisgICAgVFNvY2tldFRyYW5zcG9ydCBzb2NrZXRUcmFuc3BvcnQ7CisgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgdmFyIG1lc3NhZ2VBdmFpbGFibGU7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVJlYWRPbmx5U29ja2V0KCk7CisgICAgICBzb2NrZXRUcmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0VHJhbnNwb3J0KTsKKyAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9KTsKKworICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpIHsKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMjgpOworICAgICAgdmFyIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAwKTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCBmYWxzZSk7CisgICAgfQorCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGFuZCBib2R5IGFyZSBzZW50IHNlcGFyYXRlbHknLCAoKSBhc3luYyB7CisgICAgICAvLyBidWZmZXIgaW50byB3aGljaCB3ZSdsbCByZWFkCisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTApOworICAgICAgdmFyIHJlYWRCeXRlczsKKworICAgICAgLy8gcmVnaXN0ZXJzIGZvciByZWFkYWJsZSBieXRlcworICAgICAgdmFyIGZsdXNoRnV0dXJlID0gdHJhbnNwb3J0LmZsdXNoKCkudGltZW91dChmbHVzaEF3YWl0RHVyYXRpb24pOworICAgICAgZmx1c2hGdXR1cmUudGhlbigoXykgeworICAgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIH0pOworCisgICAgICAvLyB3cml0ZSBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGhlYWRlciBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJIZSIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgibGxvISIpKSk7CisKKyAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlLAorICAgICAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdGhlbiB0aGF0IHRoZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAgICAgIGF3YWl0IGZsdXNoRnV0dXJlOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIHRydWUpOworCisgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyBjb21wbGV0ZSwgc28gd2UgZXhwZWN0IHRoZSByZWFkIHRvIGNvbXBsZXRlCisgICAgICByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgNik7CisgICAgICBleHBlY3QocmVhZEJ1ZmZlci5zdWJsaXN0KDAsIDYpLCBVVEY4LmVuY29kZSgiSGVsbG8hIikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGlzIHNlbnQgaW4gcGllY2VzICcKKyAgICAgICAgICdhbmQgYm9keSBpcyBhbHNvIHNlbnQgaW4gcGllY2VzJywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMF0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZAorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBwYXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAzXSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkIGFnYWluCisgICAgICAvLyBiZWNhdXNlIG9ubHkgdGhlIGhlYWRlciB3YXMgcmVhZCwgYW5kIHRoZXJlJ3Mgbm8gZnJhbWUgYm9keQorICAgICAgcmVhZEJ5dGVzID0gZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSCIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiaSEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDMpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCAzKSwgVVRGOC5lbmNvZGUoIkhpISIpKTsKKyAgICB9KTsKKyAgfSk7Cit9CisKKworCitjbGFzcyBGYWtlUmVhZE9ubHlTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKworICBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gbWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+KHN5bmM6IHRydWUpOworICBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gZXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PigpOworICBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gc3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPigpOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgY2xvc2UoKSB7CisgICAgLy8gbm9vcAorICB9CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IGZhbHNlOworCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gZXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBtZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IHN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICAvLyBub29wCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYzZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgRW5jb2Rpbmc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IEJhc2VSZXF1ZXN0OworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IENsaWVudDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBTdHJlYW1lZFJlc3BvbnNlOworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGNvbnN0IHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGdyb3VwKCdUSHR0cENsaWVudFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IGZhbHNlKTsKKyAgICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcoVXJpLnBhcnNlKCdodHRwOi8vbG9jYWxob3N0JyksIHt9KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChjbGllbnQsIGNvbmZpZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCBzZW5kcyBib2R5JywgKCkgYXN5bmMgeworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdteSByZXF1ZXN0JzsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCkpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc0VtcHR5KTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdChjbGllbnQucG9zdFJlcXVlc3QsIGlzTm90RW1wdHkpOworCisgICAgICB2YXIgcmVxdWVzdFRleHQgPQorICAgICAgICAgIHV0ZjhDb2RlYy5kZWNvZGUoQkFTRTY0LmRlY29kZShjbGllbnQucG9zdFJlcXVlc3QpKTsKKyAgICAgIGV4cGVjdChyZXF1ZXN0VGV4dCwgZXhwZWN0ZWRUZXh0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlY2VpdmVzIHJlc3BvbnNlJywgKCkgYXN5bmMgeworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdteSByZXNwb25zZSc7CisgICAgICB2YXIgZXhwZWN0ZWRCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoZXhwZWN0ZWRUZXh0KTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKGV4cGVjdGVkQnl0ZXMpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZSgnbXkgcmVxdWVzdCcpKTsKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzRmFsc2UpOworCisgICAgICBhd2FpdCB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNUcnVlKTsKKworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisKKyAgICAgIHZhciBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworCisgIGdyb3VwKCdUSHR0cENsaWVudFRyYW5zcG9ydCB3aXRoIG11bHRpcGxlIG1lc3NhZ2VzJywgKCkgeworICAgIEZha2VIdHRwQ2xpZW50IGNsaWVudDsKKyAgICBUSHR0cENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBjbGllbnQgPSBuZXcgRmFrZUh0dHBDbGllbnQoc3luYzogdHJ1ZSk7CisgICAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKFVyaS5wYXJzZSgnaHR0cDovL2xvY2FsaG9zdCcpLCB7fSk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBjb25maWcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZWFkIGNvcnJlY3QgYnVmZmVyIGFmdGVyIGZsdXNoJywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisgICAgICB2YXIgZXhwZWN0ZWRUZXh0ID0gJ3Jlc3BvbnNlIDEnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisKKyAgICAgIC8vIHByZXBhcmUgYSByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMScpKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKGV4cGVjdGVkQnl0ZXMpOworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBwcmVwYXJlIGEgc2Vjb25kIHJlc3BvbnNlCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZSgncmVxdWVzdCAyJykpOworICAgICAgdmFyIHJlc3BvbnNlMkJ5dGVzID0gdXRmOENvZGVjLmVuY29kZSgncmVzcG9uc2UgMicpOworICAgICAgY2xpZW50LnBvc3RSZXNwb25zZSA9IEJBU0U2NC5lbmNvZGUocmVzcG9uc2UyQnl0ZXMpOworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgZXhwZWN0ZWRUZXh0KTsKKyAgICB9KTsKKyAgfSk7Cit9CisKK2NsYXNzIEZha2VIdHRwQ2xpZW50IGltcGxlbWVudHMgQ2xpZW50IHsKKyAgU3RyaW5nIHBvc3RSZXNwb25zZSA9ICcnOworICBTdHJpbmcgcG9zdFJlcXVlc3QgPSAnJzsKKworICBmaW5hbCBib29sIHN5bmM7CisKKyAgRmFrZUh0dHBDbGllbnQoe3RoaXMuc3luYzogZmFsc2V9KTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHBvc3QodXJsLAorICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSB7CisgICAgcG9zdFJlcXVlc3QgPSBib2R5OworICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShwb3N0UmVzcG9uc2UsIDIwMCk7CisKKyAgICBpZiAoc3luYykgeworICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuc3luYygoKSA9PiByZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHJlc3BvbnNlKTsKKyAgICB9CisgIH0KKworICBGdXR1cmU8UmVzcG9uc2U+IGhlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGdldCh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcHV0KHVybCwKKyAgICAgICAgICB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBib2R5LCBFbmNvZGluZyBlbmNvZGluZ30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwYXRjaCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gZGVsZXRlKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFN0cmluZz4gcmVhZCh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxVaW50OExpc3Q+IHJlYWRCeXRlcyh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJlYW1lZFJlc3BvbnNlPiBzZW5kKEJhc2VSZXF1ZXN0IHJlcXVlc3QpID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgdm9pZCBjbG9zZSgpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOWFiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzExIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFV0ZjhDb2RlYywgQkFTRTY0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6bW9ja2l0by9tb2NraXRvLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGNvbnN0IHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGZpbmFsIHJlcXVlc3RUZXh0ID0gJ215IHRlc3QgcmVxdWVzdCc7CisgIGZpbmFsIHJlcXVlc3RCeXRlcyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXF1ZXN0VGV4dCkpOworICBmaW5hbCByZXF1ZXN0QmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXF1ZXN0Qnl0ZXMpOworCisgIGZpbmFsIHJlc3BvbnNlVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgZmluYWwgcmVzcG9uc2VCeXRlcyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXNwb25zZVRleHQpKTsKKyAgZmluYWwgcmVzcG9uc2VCYXNlNjQgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlQnl0ZXMpOworCisgIGZpbmFsIGZyYW1lZFJlc3BvbnNlQmFzZTY0ID0KKyAgICAgIEJBU0U2NC5lbmNvZGUoX2dldEZyYW1lZFJlc3BvbnNlKHJlc3BvbnNlQnl0ZXMpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IGZhbHNlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOdWxsKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOb3ROdWxsKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIHJlcXVlc3RCeXRlcyk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQ2xpZW50U29ja2V0VHJhbnNwb3J0IHdpdGggRnJhbWVkVHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIGZyYW1lZCB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShmcmFtZWRSZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBGYWtlUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMTIzKTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgc29ja2V0LCBuZXcgVE1lc3NhZ2VSZWFkZXIocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgICAgICByZXNwb25zZVRpbWVvdXQ6IER1cmF0aW9uLlpFUk8pOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSBjb3JyZWxhdGVzIHRvIGNvcnJlY3QgcmVxdWVzdCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgc2Vjb25kIHJlc3BvbnNlCisgICAgICB2YXIgcmVzcG9uc2UyVGV4dCA9ICdyZXNwb25zZSAyJzsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlc3BvbnNlMlRleHQpKTsKKyAgICAgIHZhciByZXNwb25zZTJCYXNlNjQgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28yJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjQpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZTJCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHJlc3BvbnNlIHRpbWVvdXQnLCAoKSBhc3luYyB7CisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgZXhwZWN0KHJlc3BvbnNlUmVhZHksIHRocm93c0EobmV3IGlzSW5zdGFuY2VPZjxUaW1lb3V0RXhjZXB0aW9uPigpKSk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgd2l0aCBURnJhbWVkVHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIEZha2VQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgRmFrZVByb3RvY29sRmFjdG9yeSgpOworICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5DQUxMLCAxMjMpOworICAgICAgdmFyIG1lc3NhZ2VSZWFkZXIgPSBuZXcgVE1lc3NhZ2VSZWFkZXIocHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGJ5dGVPZmZzZXQ6IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50KTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICBzb2NrZXQsIG1lc3NhZ2VSZWFkZXIsCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBEdXJhdGlvbi5aRVJPKSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGFzeW5jIGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuUkVQTFksIDEyMyk7CisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKGZyYW1lZFJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVFNlcnZlclRyYW5zcG9ydCcsICgpIHsKKyAgICB0ZXN0KCdUZXN0IHNlcnZlciB0cmFuc3BvcnQgbGlzdGVucyB0byBzb2NrZXQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisgICAgICBleHBlY3Qoc29ja2V0LmlzT3BlbiwgaXNUcnVlKTsKKworICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXF1ZXN0QmFzZTY0KTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNUcnVlKTsKKworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVxdWVzdEJ5dGVzLmxlbmd0aCk7CisgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlcXVlc3RCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXF1ZXN0VGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHNlcnZlciBzZW5kaW5nIGRhdGEgb3ZlciB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVzcG9uc2VCeXRlcyk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOb3ROdWxsKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIHJlc3BvbnNlQnl0ZXMpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKK30KKworY2xhc3MgRmFrZVNvY2tldCBleHRlbmRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBGYWtlU29ja2V0KHtib29sIHN5bmM6IGZhbHNlfSkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpOworCisgIGJvb2wgX2lzT3BlbjsKKworICBib29sIGdldCBpc09wZW4gPT4gX2lzT3BlbjsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PiAhaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9pc09wZW4gPSB0cnVlOworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIF9pc09wZW4gPSBmYWxzZTsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgVWludDhMaXN0IF9zZW5kUGF5bG9hZDsKKyAgVWludDhMaXN0IGdldCBzZW5kUGF5bG9hZCA9PiBfc2VuZFBheWxvYWQ7CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgaWYgKCFpc09wZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCdUaGUgc29ja2V0IGlzIG5vdCBvcGVuJyk7CisKKyAgICBfc2VuZFBheWxvYWQgPSBkYXRhOworICB9CisKKyAgdm9pZCByZWNlaXZlRmFrZU1lc3NhZ2UoU3RyaW5nIGJhc2U2NCkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgdmFyIG1lc3NhZ2UgPQorICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUoYmFzZTY0KSk7CisgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKG1lc3NhZ2UpOworICB9Cit9CisKK2NsYXNzIEZha2VQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgRmFrZVByb3RvY29sRmFjdG9yeSgpOworCisgIFRNZXNzYWdlIG1lc3NhZ2U7CisKKyAgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpID0+IG5ldyBGYWtlUHJvdG9jb2wobWVzc2FnZSk7Cit9CisKK2NsYXNzIEZha2VQcm90b2NvbCBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworICBGYWtlUHJvdG9jb2wodGhpcy5fbWVzc2FnZSk7CisKKyAgVE1lc3NhZ2UgX21lc3NhZ2U7CisKKyAgcmVhZE1lc3NhZ2VCZWdpbigpID0+IF9tZXNzYWdlOworfQorCitVaW50OExpc3QgX2dldEZyYW1lZFJlc3BvbnNlKFVpbnQ4TGlzdCByZXNwb25zZUJ5dGVzKSB7CisgIHZhciBieXRlT2Zmc2V0ID0gVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJCeXRlQ291bnQ7CisgIHZhciByZXNwb25zZSA9IG5ldyBVaW50OExpc3QoYnl0ZU9mZnNldCArIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKworICByZXNwb25zZS5idWZmZXIuYXNCeXRlRGF0YSgpLnNldEludDMyKDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgcmVzcG9uc2Uuc2V0QWxsKGJ5dGVPZmZzZXQsIHJlc3BvbnNlQnl0ZXMpOworCisgIHJldHVybiByZXNwb25zZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBDb21tb24gdHJhbnNwb3J0IHRlc3RzCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdUVHJhbnNwb3J0RmFjdG9yeScsICgpIHsKKyAgICB0ZXN0KCd0cmFuc3BvcnQgaXMgcmV0dXJuZWQgZnJvbSBiYXNlIGZhY3RvcnknLCAoKSBhc3luYyB7CisgICAgICBUVHJhbnNwb3J0IHJlc3VsdDsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgcmVzdWx0ID0gYXdhaXQgZmFjdG9yeS5nZXRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgIGV4cGVjdChyZXN1bHQsIGlzTnVsbCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisKKyAgICAgIGV4cGVjdChyZXN1bHQsIHRyYW5zcG9ydCk7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdG9vbC9kZXYuZGFydCBiL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmOGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0b29sLmRldjsKKworaW1wb3J0ICdwYWNrYWdlOmRhcnRfZGV2L2RhcnRfZGV2LmRhcnQnIHNob3cgZGV2LCBjb25maWc7CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dvcmtpdmEvZGFydF9kZXYKKworICB2YXIgZGlyZWN0b3JpZXMgPSBbJ2xpYi8nLCAndGVzdC8nLCAndG9vbC8nXTsKKyAgY29uZmlnLmFuYWx5emUuZW50cnlQb2ludHMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmZvcm1hdC5kaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzOworICBjb25maWcuY29weUxpY2Vuc2UKKyAgICAuLmxpY2Vuc2VQYXRoID0gJ0xJQ0VOU0VfSEVBREVSJworICAgIC4uZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKworICBhd2FpdCBkZXYoYXJncyk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2ogYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvRGVscGhpVGhyaWZ0Lmdyb3VwcHJvagpAQCAtMCwwICsxLDE1NiBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57NkJEMzI3QTUtNzY4OC00MjYzLUI2QTgtQjE1MjA3Q0Y0RUM1fTwvUHJvamVjdEd1aWQ+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XGNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2VydmVyLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCTwvSXRlbUdyb3VwPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWZhdWx0LlBlcnNvbmFsaXR5Lz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJjbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJjbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJzZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJzZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9DbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0U2VyaWFsaXplcjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0U2VyaWFsaXplcjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjEiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0VHlwZVJlZ2lzdHJ5OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iUmVzZXJ2ZWRLZXl3b3JkcyI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iUmVzZXJ2ZWRLZXl3b3JkczpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iQnVpbGQiPgorCQkJPENhbGxUYXJnZXQgVGFyZ2V0cz0iY2xpZW50O3NlcnZlcjtNdWx0aXBsZXhfVGVzdF9DbGllbnQ7TXVsdGlwbGV4X1Rlc3RfU2VydmVyO1Rlc3RTZXJpYWxpemVyO3NraXB0ZXN0X3ZlcnNpb24xO3NraXB0ZXN0X3ZlcnNpb24yO1Rlc3RUeXBlUmVnaXN0cnk7RGVscGhpU2VydmVyO0RlbHBoaUNsaWVudDtSZXNlcnZlZEtleXdvcmRzIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkNsZWFuIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDpDbGVhbjtzZXJ2ZXI6Q2xlYW47TXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuO011bHRpcGxleF9UZXN0X1NlcnZlcjpDbGVhbjtUZXN0U2VyaWFsaXplcjpDbGVhbjtza2lwdGVzdF92ZXJzaW9uMTpDbGVhbjtza2lwdGVzdF92ZXJzaW9uMjpDbGVhbjtUZXN0VHlwZVJlZ2lzdHJ5OkNsZWFuO0RlbHBoaVNlcnZlcjpDbGVhbjtEZWxwaGlDbGllbnQ6Q2xlYW47UmVzZXJ2ZWRLZXl3b3JkczpDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNYWtlIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDpNYWtlO3NlcnZlcjpNYWtlO011bHRpcGxleF9UZXN0X0NsaWVudDpNYWtlO011bHRpcGxleF9UZXN0X1NlcnZlcjpNYWtlO1Rlc3RTZXJpYWxpemVyOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjE6TWFrZTtza2lwdGVzdF92ZXJzaW9uMjpNYWtlO1Rlc3RUeXBlUmVnaXN0cnk6TWFrZTtEZWxwaGlTZXJ2ZXI6TWFrZTtEZWxwaGlDbGllbnQ6TWFrZTtSZXNlcnZlZEtleXdvcmRzOk1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMiLz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL1JFQURNRS5tZCBiL2xpYi9kZWxwaGkvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzk5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL1JFQURNRS5tZApAQCAtMCwwICsxLDMwIEBACitUaHJpZnQgRGVscGhpIFNvZnR3YXJlIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVXNpbmcgVGhyaWZ0IHdpdGggRGVscGhpCis9PT09PT09PT09PT09PT09PT09PQorCitUaGUgVGhyaWZ0IERlbHBoaSBMaWJyYXJ5IHJlcXVpcmVzIGF0IGxlYXN0IERlbHBoaSAyMDEwLgorCitCZWNhdXNlIHRoZSBMaWJyYXJ5IGhlYXZpbHkgcmVsaWVzIG9uIGdlbmVyaWNzLCB1c2luZyBpdAord2l0aCBlYXJsaWVyIHZlcnNpb25zIChzdWNoIGFzIERlbHBoaSA3KSB3aWxsICpub3QqIHdvcmsuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMDZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMKQEAgLTAsMCArMSw2MTkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK2ludGVyZmFjZQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBHZW5lcmljcy5EZWZhdWx0cywgVGhyaWZ0LlV0aWxzOworCit0eXBlCisKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0KKyAgVEFycmF5PFQ+ID0gYXJyYXkgb2YgVDsKK3skSUZFTkR9CisKKyAgSVRocmlmdENvbnRhaW5lciA9IGludGVyZmFjZQorICAgIFsnezkzREVGNUEwLUQxNjItNDYxQS1BQjIyLTVCNEVFMDczNDA1MH0nXQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7CisgIGVuZDsKKworICBJVGhyaWZ0RGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4gPSBpbnRlcmZhY2UoSVRocmlmdENvbnRhaW5lcikKKyAgICBbJ3syNUVERDUwNi1GOUQxLTQwMDgtQTQwRi01OTQwMzY0QjdFNDZ9J10KKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgcHJvcGVydHkgSXRlbXNbY29uc3QgS2V5OiBUS2V5XTogVFZhbHVlIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsKKyAgICBwcm9wZXJ0eSBWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uIHJlYWQgR2V0VmFsdWVzOworICBlbmQ7CisKKyAgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksVFZhbHVlPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdERpY3Rpb25hcnk8VEtleSxUVmFsdWU+KQorICBwcml2YXRlCisgICAgRkRpY3Rpb25hbHkgOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRQYWlyPFRLZXksVFZhbHVlPj47CisKKyAgICBmdW5jdGlvbiBHZXRLZXlzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVEtleUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0VmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIEFkZChjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBSZW1vdmUoY29uc3QgS2V5OiBUS2V5KTsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgZnVuY3Rpb24gRXh0cmFjdFBhaXIoY29uc3QgS2V5OiBUS2V5KTogVFBhaXI8VEtleSxUVmFsdWU+OworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIEFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBDb250YWluc0tleShjb25zdCBLZXk6IFRLZXkpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIENvbnRhaW5zVmFsdWUoY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksVFZhbHVlPj47CisgICAgcHJvcGVydHkgSXRlbXNbY29uc3QgS2V5OiBUS2V5XTogVFZhbHVlIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsKKyAgICBwcm9wZXJ0eSBWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uIHJlYWQgR2V0VmFsdWVzOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUNhcGFjaXR5OiBJbnRlZ2VyID0gMCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElUaHJpZnRMaXN0PFQ+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MjlCRUVFMzEtOUNCNC00MDFCLUFBMDQtNTE0OEE3NUY0NzNCfSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CisgICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydChJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBEZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIHByb2NlZHVyZSBFeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIE1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBGaXJzdDogVDsKKyAgICBmdW5jdGlvbiBMYXN0OiBUOworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoY29uc3QgVmFsdWU6IFQpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIExhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmV2ZXJzZTsKKyAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VD47CisgICAgcHJvcGVydHkgQ2FwYWNpdHk6IEludGVnZXIgcmVhZCBHZXRDYXBhY2l0eSB3cml0ZSBTZXRDYXBhY2l0eTsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OworICAgIHByb3BlcnR5IEl0ZW1zW0luZGV4OiBJbnRlZ2VyXTogVCByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0SW1wbDxUPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdExpc3Q8VD4pCisgIHByaXZhdGUKKyAgICBGTGlzdCA6IFRMaXN0PFQ+OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsKKyAgICBmdW5jdGlvbiBHZXRDYXBhY2l0eTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2FwYWNpdHkoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBmdW5jdGlvbiBBZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIERlbGV0ZShJbmRleDogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIERlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBFeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgcHJvY2VkdXJlIEV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgTW92ZShDdXJJbmRleCwgTmV3SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEZpcnN0OiBUOworICAgIGZ1bmN0aW9uIExhc3Q6IFQ7Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBSZXZlcnNlOworICAgIHByb2NlZHVyZSBTb3J0OyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgU29ydChjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUPjsKKyAgICBwcm9wZXJ0eSBDYXBhY2l0eTogSW50ZWdlciByZWFkIEdldENhcGFjaXR5IHdyaXRlIFNldENhcGFjaXR5OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXRlbXNbSW5kZXg6IEludGVnZXJdOiBUIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElIYXNoU2V0PFRWYWx1ZT4gPSBpbnRlcmZhY2UoSVRocmlmdENvbnRhaW5lcikKKyAgICBbJ3swOTIzQTNCNS1ENEQ0LTQ4QTgtOTFBRC00MDIzOEUyRUFENjZ9J10KKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworICAgIGZ1bmN0aW9uIEdldElzUmVhZE9ubHk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJc1JlYWRPbmx5OiBCb29sZWFuIHJlYWQgR2V0SXNSZWFkT25seTsKKyAgICBwcm9jZWR1cmUgQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUgKTogQm9vbGVhbjsKKyAgZW5kOworCisgIFRIYXNoU2V0SW1wbDxUVmFsdWU+ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJSGFzaFNldDxUVmFsdWU+KQorICBwcml2YXRlCisgICAgRkRpY3Rpb25hcnkgOiBJVGhyaWZ0RGljdGlvbmFyeTxUVmFsdWUsSW50ZWdlcj47CisgICAgRklzUmVhZE9ubHk6IEJvb2xlYW47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRWYWx1ZT47CisgICAgZnVuY3Rpb24gR2V0SXNSZWFkT25seTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IElzUmVhZE9ubHk6IEJvb2xlYW4gcmVhZCBGSXNSZWFkT25seTsKKyAgICBwcm9jZWR1cmUgQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUgKTogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEhhc2hTZXRJbXBsPFRWYWx1ZT4gfQorCitwcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworYmVnaW4KKyAgaWYgbm90IEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KGl0ZW0pIHRoZW4KKyAgYmVnaW4KKyAgICBGRGljdGlvbmFyeS5BZGQoIGl0ZW0sIDApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSGFzaFNldEltcGw8VFZhbHVlPi5DbGVhcjsKK2JlZ2luCisgIEZEaWN0aW9uYXJ5LkNsZWFyOworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5Db250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db250YWluc0tleShpdGVtKTsKK2VuZDsKKworcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOwordmFyCisgIGkgOiBJbnRlZ2VyOworICBFbnVtbGF0b3IgOiBURW51bWVyYXRvcjxUVmFsdWU+OworYmVnaW4KKyAgRW51bWxhdG9yIDo9IEdldEVudW1lcmF0b3I7CisgIHdoaWxlIEVudW1sYXRvci5Nb3ZlTmV4dCBkbworICBiZWdpbgorICAgIEFbYXJyYXlJbmRleF0gOj0gRW51bWxhdG9yLkN1cnJlbnQ7CisgICAgSW5jKGFycmF5SW5kZXgpOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgRkRpY3Rpb25hcnkgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRWYWx1ZSxJbnRlZ2VyPi5DcmVhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkdldENvdW50OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LkNvdW50OworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LktleXMuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uR2V0SXNSZWFkT25seTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSXNSZWFkT25seTsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZhbHNlOworICBpZiBGRGljdGlvbmFyeS5Db250YWluc0tleSggaXRlbSApIHRoZW4KKyAgYmVnaW4KKyAgICBGRGljdGlvbmFyeS5SZW1vdmUoIGl0ZW0gKTsKKyAgICBSZXN1bHQgOj0gbm90IEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KCBpdGVtICk7CisgIGVuZDsKK2VuZDsKKworeyBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPiB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5BZGQoY29uc3QgS2V5OiBUS2V5OworICBjb25zdCBWYWx1ZTogVFZhbHVlKTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkFkZCggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5BZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGRPclNldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNsZWFyOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQ2xlYXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNvbnRhaW5zS2V5KAorICBjb25zdCBLZXk6IFRLZXkpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvbnRhaW5zS2V5KCBLZXkgKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ29udGFpbnNWYWx1ZSgKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ29udGFpbnNWYWx1ZSggVmFsdWUgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ3JlYXRlKEFDYXBhY2l0eTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGRGljdGlvbmFseSA6PSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uQ3JlYXRlKCBBQ2FwYWNpdHkgKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5EZXN0cm95OworYmVnaW4KKyAgRkRpY3Rpb25hbHkuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uRXh0cmFjdFBhaXIoIGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksIFRWYWx1ZT47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuRXh0cmFjdFBhaXIoIEtleSk7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSwgVFZhbHVlPj47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuSXRlbXNbS2V5XTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5LZXlzOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5WYWx1ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5SZW1vdmUoY29uc3QgS2V5OiBUS2V5KTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LlJlbW92ZSggS2V5ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5TZXRJdGVtKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGRPclNldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksIFRWYWx1ZT4+OworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQordmFyCisgIHggOiBUUGFpcjxUS2V5LCBUVmFsdWU+OworICBpIDogSW50ZWdlcjsKK3skSUZFTkR9CitiZWdpbgoreyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQorICBTZXRMZW5ndGgoUmVzdWx0LCBDb3VudCk7CisgIGkgOj0gMDsKKyAgZm9yIHggaW4gRkRpY3Rpb25hbHkgZG8KKyAgYmVnaW4KKyAgICBSZXN1bHRbaV0gOj0geDsKKyAgICBJbmMoIGkgKTsKKyAgZW5kOworeyRFTFNFfQorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVG9BcnJheTsKK3skSUZFTkR9CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5UcmltRXhjZXNzOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuVHJpbUV4Y2VzczsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OworICBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVHJ5R2V0VmFsdWUoIEtleSwgVmFsdWUpOworZW5kOworCit7IFRUaHJpZnRMaXN0SW1wbDxUPiB9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkFkZCggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0LkFkZFJhbmdlKCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsKK2JlZ2luCisgIEZMaXN0LkFkZFJhbmdlKCBWYWx1ZXMgKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOworICBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkJpbmFyeVNlYXJjaCggSXRlbSwgSW5kZXgpOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkJpbmFyeVNlYXJjaCggSXRlbSwgSW5kZXgsIEFDb21wYXJlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQ2xlYXI7CitiZWdpbgorICBGTGlzdC5DbGVhcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkNvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5Db250YWlucyggVmFsdWUgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdExpc3RJbXBsPFQ+LkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgRkxpc3QgOj0gVExpc3Q8VD4uQ3JlYXRlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkRlbGV0ZShJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5EZWxldGUoIEluZGV4ICkKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5EZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5EZWxldGVSYW5nZSggQUluZGV4LCBBQ291bnQpCitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdExpc3RJbXBsPFQ+LkRlc3Ryb3k7CitiZWdpbgorICBGTGlzdC5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9Citwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkV4Y2hhbmdlKCBJbmRleDEsIEluZGV4MiApCitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuRXh0cmFjdCggVmFsdWUgKQorZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkZpcnN0OiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkZpcnN0OworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldENhcGFjaXR5OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkNhcGFjaXR5OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5HZXRFbnVtZXJhdG9yOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3RbSW5kZXhdOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuSW5kZXhPZiggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydCggSW5kZXgsIFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7CitiZWdpbgorICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIFZhbHVlcyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgQ29sbGVjdGlvbiApOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+Lkxhc3Q6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuTGFzdDsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5MYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuTGFzdEluZGV4T2YoIFZhbHVlICk7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9Citwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lk1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0Lk1vdmUoIEN1ckluZGV4LCAgTmV3SW5kZXgpOworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LlJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuUmVtb3ZlKCBWYWx1ZSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlJldmVyc2U7CitiZWdpbgorICBGTGlzdC5SZXZlcnNlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkNhcGFjaXR5IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkNvdW50IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKK2JlZ2luCisgIEZMaXN0W0luZGV4XSA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Tb3J0OworYmVnaW4KKyAgRkxpc3QuU29ydDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Tb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsKK2JlZ2luCisgIEZMaXN0LlNvcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5Ub0FycmF5OiBUQXJyYXk8VD47Cit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9Cit2YXIKKyAgeCA6IFQ7CisgIGkgOiBJbnRlZ2VyOworeyRJRkVORH0KK2JlZ2luCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9CisgIFNldExlbmd0aChSZXN1bHQsIENvdW50KTsKKyAgaSA6PSAwOworICBmb3IgeCBpbiBGTGlzdCBkbworICBiZWdpbgorICAgIFJlc3VsdFtpXSA6PSB4OworICAgIEluYyggaSApOworICBlbmQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGTGlzdC5Ub0FycmF5OworeyRJRkVORH0KK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5UcmltRXhjZXNzOworYmVnaW4KKyAgRkxpc3QuVHJpbUV4Y2VzczsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWNjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmMKQEAgLTAsMCArMSw1MCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisKKy8vIEdvb2QgbGlzdHMgb2YgRGVscGhpIHZlcnNpb24gbnVtYmVycworLy8gaHR0cHM6Ly9naXRodWIuY29tL3Byb2plY3QtamVkaS9qZWRpL2Jsb2IvbWFzdGVyL2plZGkuaW5jCisvLyBodHRwOi8vZG9jd2lraS5lbWJhcmNhZGVyby5jb20vUkFEU3R1ZGlvL1NlYXR0bGUvZW4vQ29tcGlsZXJfVmVyc2lvbnMKKworCisvLyBzdGFydCB3aXRoIG1vc3QgYmFja3dhcmRzIGNvbXBhdGlibGUgZGVmYXVsdHMKKworeyRERUZJTkUgT0xEX1VOSVRfTkFNRVN9Cit7JERFRklORSBPTERfU09DS0VUU30gICAgICAvLyBUT0RPOiBhZGQgc29ja2V0IHN1cHBvcnQgZm9yIENvbXBpbGVyVmVyc2lvbiA+PSAyOC4wCit7JFVOREVGIEhBVkVfQ0xBU1NfQ1RPUn0KKworCisvLyBlbmFibGUgZmVhdHVyZXMgYXMgdGhleSBhcmUgYXZhaWxhYmxlCisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9ICAgLy8gRGVscGhpIDIwMTAKKyAgeyRERUZJTkUgSEFWRV9DTEFTU19DVE9SfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjMuMH0gICAvLyBEZWxwaGkgWEUyCisgIHskVU5ERUYgT0xEX1VOSVRfTkFNRVN9Cit7JElGRU5EfQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyOC4wfSAgIC8vIERlbHBoaSBYRTcKKyAgeyRVTkRFRiBPTERfU09DS0VUU30KK3skSUZFTkR9CisKKworLy8gRU9GCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE1YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKQEAgLTAsMCArMSw2MiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit7JFNDT1BFREVOVU1TIE9OfQorCit1bml0IFRocmlmdC5FeGNlcHRpb247CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsIFN5c1V0aWxzOworCit0eXBlCisgIC8vIGJhc2UgY2xhc3MgZm9yIGFsbCBUaHJpZnQgZXhjZXB0aW9ucworICBURXhjZXB0aW9uID0gY2xhc3MoIFN5c1V0aWxzLkV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgZnVuY3Rpb24gTWVzc2FnZSA6IHN0cmluZzsgICAgICAgIC8vIGhpZGUgaW5oZXJpdGVkIHByb3BlcnR5OiBhbGxvdyByZWFkLCBidXQgcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcworICAgIHByb2NlZHVyZSBVcGRhdGVNZXNzYWdlUHJvcGVydHk7ICAvLyB1cGRhdGUgaW5oZXJpdGVkIG1lc3NhZ2UgcHJvcGVydHkgd2l0aCB0b1N0cmluZygpCisgIGVuZDsKKworCisKKworaW1wbGVtZW50YXRpb24KKworeyBURXhjZXB0aW9uIH0KKworZnVuY3Rpb24gVEV4Y2VwdGlvbi5NZXNzYWdlOworLy8gYWxsb3cgcmVhZCAoZXhjZXB0aW9uIHN1bW1hcnkpLCBidXQgcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcworLy8gcmVhZCB3aWxsIHJldHVybiB0aGUgZXhjZXB0aW9uIHN1bW1hcnkKK2JlZ2luCisgIHJlc3VsdCA6PSBTZWxmLlRvU3RyaW5nOworZW5kOworCitwcm9jZWR1cmUgVEV4Y2VwdGlvbi5VcGRhdGVNZXNzYWdlUHJvcGVydHk7CisvLyBVcGRhdGUgdGhlIGluaGVyaXRlZCBNZXNzYWdlIHByb3BlcnR5IHRvIGJldHRlciBjb25mb3JtIHRvIHN0YW5kYXJkIGJlaGF2aW91ci4KKy8vIE5pY2UgYmVuZWZpdDogVGhlIElERSBpcyBub3cgYWJsZSB0byBzaG93IHRoZSBleGNlcHRpb24gbWVzc2FnZSBhZ2Fpbi4KK2JlZ2luCisgIGluaGVyaXRlZCBNZXNzYWdlIDo9IFNlbGYuVG9TdHJpbmc7ICAvLyBwcm9kdWNlcyBhIHN1bW1hcnkgdGV4dAorZW5kOworCisKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2YyM2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCkBAIC0wLDAgKzEsMjMxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXg7CisKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleDsKKworeyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaXMgYSBUUHJvY2Vzc29yIGFsbG93aW5nIGEgc2luZ2xlIFRTZXJ2ZXIgdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKworICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworCisgICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworCisgICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworCisgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisKKyAgICAgc2VydmVyLnNlcnZlKCk7Cit9CisKKwordHlwZQorICBJTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBpbnRlcmZhY2UoIElQcm9jZXNzb3IpCisgICAgWyd7ODA3RjlEMTktNkNGNC00Nzg5LTg0MEUtOTNFODdBMTJFQjYzfSddCisgICAgLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuICBUaGlzIGFsbG93cyB1cworICAgIC8vIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLyB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbiA9IEZBTFNFKTsKKyAgZW5kOworCisKKyAgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSU11bHRpcGxleGVkUHJvY2Vzc29yLCBJUHJvY2Vzc29yKQorICBwcml2YXRlIHR5cGUKKyAgICAvLyBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICAgIC8vIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAgICAvLyB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgICAgVFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA9IGNsYXNzKCBUUHJvdG9jb2xEZWNvcmF0b3IpCisgICAgcHJpdmF0ZQorICAgICAgRk1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOworICAgIHB1YmxpYworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOworICAgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIGVuZDsKKworICBwcml2YXRlCisgICAgRlNlcnZpY2VQcm9jZXNzb3JNYXAgOiBURGljdGlvbmFyeTxTdHJpbmcsIElQcm9jZXNzb3I+OworICAgIEZEZWZhdWx0UHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKKworICAgIHByb2NlZHVyZSBFcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IFRUaHJpZnRNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsgY29uc3QgZXR4dCA6IHN0cmluZyk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLiAgVGhpcyBhbGxvd3MgdXMKKyAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCisgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CisKKyAgICB7IFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAgLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAgLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKworICAgICAgQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWQorICAgICAgb3IgaWYgdGhlIHNlcnZpY2UgaXMgdW5rbm93biAob3Igbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQpLgorICAgIH0KKyAgICBmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdCwgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCitjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggcHJvdG9jb2wpOworICBGTWVzc2FnZUJlZ2luIDo9IGFNc2dCZWdpbjsKK2VuZDsKKworCitmdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICByZXN1bHQgOj0gRk1lc3NhZ2VCZWdpbjsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDo9IFREaWN0aW9uYXJ5PHN0cmluZyxJUHJvY2Vzc29yPi5DcmVhdGU7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGU2VydmljZVByb2Nlc3Nvck1hcCk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbik7CitiZWdpbgorICBGU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoIHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworCisgIGlmIGFzRGVmYXVsdCB0aGVuIGJlZ2luCisgICAgaWYgRkRlZmF1bHRQcm9jZXNzb3IgPSBuaWwKKyAgICB0aGVuIEZEZWZhdWx0UHJvY2Vzc29yIDo9IHByb2Nlc3NvcgorICAgIGVsc2UgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoJ09ubHkgb25lIGRlZmF1bHQgc2VydmljZSBhbGxvd2VkJyk7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5FcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IFRUaHJpZnRNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXR4dCA6IHN0cmluZyk7Cit2YXIgYXBwZXggIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworICAgIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgYXBwZXggOj0gZXh0eXBlLkNyZWF0ZShldHh0KTsKKyAgdHJ5CisgICAgSW5pdCggbmV3TXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsKKworICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01zZyk7CisgICAgYXBwZXguV3JpdGUob3Byb3QpOworICAgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOworICAgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOworCisgIGZpbmFsbHkKKyAgICBhcHBleC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5Qcm9jZXNzKGNvbnN0IGlwcm90LCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47Cit2YXIgbXNnLCBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICBpZHggICAgICAgICA6IEludGVnZXI7CisgICAgc1NlcnZpY2UgICAgOiBzdHJpbmc7CisgICAgcHJvY2Vzc29yICAgOiBJUHJvY2Vzc29yOworICAgIHByb3RvY29sICAgIDogSVByb3RvY29sOworY29uc3QKKyAgRVJST1JfSU5WQUxJRF9NU0dUWVBFICAgPSAnTWVzc2FnZSBtdXN0IGJlICJjYWxsIiBvciAib25ld2F5Iic7CisgIEVSUk9SX0lOQ09NUEFUSUJMRV9QUk9UID0gJ05vIHNlcnZpY2UgbmFtZSBmb3VuZCBpbiAiJXMiLiBDbGllbnQgaXMgZXhwZWN0ZWQgdG8gdXNlIFRNdWx0aXBsZXhQcm90b2NvbC4nOworICBFUlJPUl9VTktOT1dOX1NFUlZJQ0UgICA9ICdTZXJ2aWNlICIlcyIgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBNdWx0aXBsZXhlZFByb2Nlc3Nvcic7CitiZWdpbgorICAvLyBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUgbWVzc2FnZSBoZWFkZXIuCisgIC8vIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICBtc2cgOj0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOworICBpZiBub3QgKG1zZy5UeXBlXyBpbiBbVE1lc3NhZ2VUeXBlLkNhbGwsIFRNZXNzYWdlVHlwZS5PbmV3YXldKSB0aGVuIGJlZ2luCisgICAgRXJyb3IoIG9wcm90LCBtc2csCisgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgRVJST1JfSU5WQUxJRF9NU0dUWVBFKTsKKyAgICBFeGl0KCBGQUxTRSk7CisgIGVuZDsKKworICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgLy8gdXNlIEZEZWZhdWx0UHJvY2Vzc29yIGFzIGZhbGxiYWNrIGlmIHRoZXJlIGlzIG5vIHNlcGFyYXRvcgorICBpZHggOj0gUG9zKCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IsIG1zZy5OYW1lKTsKKyAgaWYgaWR4ID4gMCB0aGVuIGJlZ2luCisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgc1NlcnZpY2UgOj0gQ29weSggbXNnLk5hbWUsIDEsIGlkeC0xKTsKKyAgICBpZiBub3QgRlNlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoIHNTZXJ2aWNlLCBwcm9jZXNzb3IpCisgICAgdGhlbiBiZWdpbgorICAgICAgRXJyb3IoIG9wcm90LCBtc2csCisgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICBGb3JtYXQoRVJST1JfVU5LTk9XTl9TRVJWSUNFLFtzU2VydmljZV0pKTsKKyAgICAgIEV4aXQoIEZBTFNFKTsKKyAgICBlbmQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICBJbmMoIGlkeCwgTGVuZ3RoKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikpOworICAgIEluaXQoIG5ld01zZywgQ29weSggbXNnLk5hbWUsIGlkeCwgTUFYSU5UKSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOworCisgIGVuZAorICBlbHNlIGlmIEZEZWZhdWx0UHJvY2Vzc29yIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgcHJvY2Vzc29yIDo9IEZEZWZhdWx0UHJvY2Vzc29yOworICAgIG5ld01zZyAgICA6PSBtc2c7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQorCisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRXJyb3IoIG9wcm90LCBtc2csCisgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgRm9ybWF0KEVSUk9SX0lOQ09NUEFUSUJMRV9QUk9ULFttc2cuTmFtZV0pKTsKKyAgICBFeGl0KCBGQUxTRSk7CisgIGVuZDsKKworICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgIHByb3RvY29sIDo9IFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBpcHJvdCwgbmV3TXNnKTsKKyAgcmVzdWx0ICAgOj0gcHJvY2Vzc29yLnByb2Nlc3MoIHByb3RvY29sLCBvcHJvdCwgZXZlbnRzKTsKK2VuZDsKKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYjNkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcwpAQCAtMCwwICsxLDExMTcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIE1hdGgsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5VdGlsczsKKwordHlwZQorICBJQ29tcGFjdFByb3RvY29sID0gaW50ZXJmYWNlKCBJUHJvdG9jb2wpCisgICAgWyd7QzAxOTI3RUMtMDIxQS00NUY3LTkzQjEtMjNENkE1NDIwRUREfSddCisgIGVuZDsKKworICAvLyBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgIC8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KKyAgVENvbXBhY3RQcm90b2NvbEltcGwgPSBjbGFzcyggVFByb3RvY29sSW1wbCwgSUNvbXBhY3RQcm90b2NvbCkKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbEZhY3RvcnkpCisgICAgICBwdWJsaWMKKyAgICAgICAgZnVuY3Rpb24gR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworICAgICAgZW5kOworCisgIHByaXZhdGUgY29uc3QKKworICAgIHsgVE9ETworICAgIHN0YXRpYyBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgiIik7CisgICAgc3RhdGljIFRGaWVsZCBUU1RPUCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlN0b3AsIChzaG9ydCkwKTsKKyAgICB9CisKKyAgICBQUk9UT0NPTF9JRCAgICAgICA9IEJ5dGUoICQ4Mik7CisgICAgVkVSU0lPTiAgICAgICAgICAgPSBCeXRlKCAxKTsKKyAgICBWRVJTSU9OX01BU0sgICAgICA9IEJ5dGUoICQxRik7IC8vIDAwMDEgMTExMQorICAgIFRZUEVfTUFTSyAgICAgICAgID0gQnl0ZSggJEUwKTsgLy8gMTExMCAwMDAwCisgICAgVFlQRV9CSVRTICAgICAgICAgPSBCeXRlKCAkMDcpOyAvLyAwMDAwIDAxMTEKKyAgICBUWVBFX1NISUZUX0FNT1VOVCA9IEJ5dGUoIDUpOworCisgIHByaXZhdGUgdHlwZQorICAgIC8vIEFsbCBvZiB0aGUgb24td2lyZSB0eXBlIGNvZGVzLgorICAgIFR5cGVzID0gKAorICAgICAgU1RPUCAgICAgICAgICA9ICQwMCwKKyAgICAgIEJPT0xFQU5fVFJVRSAgPSAkMDEsCisgICAgICBCT09MRUFOX0ZBTFNFID0gJDAyLAorICAgICAgQllURV8gICAgICAgICA9ICQwMywKKyAgICAgIEkxNiAgICAgICAgICAgPSAkMDQsCisgICAgICBJMzIgICAgICAgICAgID0gJDA1LAorICAgICAgSTY0ICAgICAgICAgICA9ICQwNiwKKyAgICAgIERPVUJMRV8gICAgICAgPSAkMDcsCisgICAgICBCSU5BUlkgICAgICAgID0gJDA4LAorICAgICAgTElTVCAgICAgICAgICA9ICQwOSwKKyAgICAgIFNFVF8gICAgICAgICAgPSAkMEEsCisgICAgICBNQVAgICAgICAgICAgID0gJDBCLAorICAgICAgU1RSVUNUICAgICAgICA9ICQwQworICAgICk7CisKKyAgcHJpdmF0ZSBjb25zdAorICAgIHR0eXBlVG9Db21wYWN0VHlwZSA6IGFycmF5W1RUeXBlXSBvZiBUeXBlcyA9ICgKKyAgICAgIFR5cGVzLlNUT1AsICAgICAgICAgICAvLyBTdG9wICAgID0gMCwKKyAgICAgIFR5cGVzKC0xKSwgICAgICAgICAgICAvLyBWb2lkICAgID0gMSwKKyAgICAgIFR5cGVzLkJPT0xFQU5fVFJVRSwgICAvLyBCb29sXyAgID0gMiwKKyAgICAgIFR5cGVzLkJZVEVfLCAgICAgICAgICAvLyBCeXRlXyAgID0gMywKKyAgICAgIFR5cGVzLkRPVUJMRV8sICAgICAgICAvLyBEb3VibGVfID0gNCwKKyAgICAgIFR5cGVzKC01KSwgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgIFR5cGVzLkkxNiwgICAgICAgICAgICAvLyBJMTYgICAgID0gNiwKKyAgICAgIFR5cGVzKC03KSwgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgIFR5cGVzLkkzMiwgICAgICAgICAgICAvLyBJMzIgICAgID0gOCwKKyAgICAgIFR5cGVzKC05KSwgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgIFR5cGVzLkk2NCwgICAgICAgICAgICAvLyBJNjQgICAgID0gMTAsCisgICAgICBUeXBlcy5CSU5BUlksICAgICAgICAgLy8gU3RyaW5nXyA9IDExLAorICAgICAgVHlwZXMuU1RSVUNULCAgICAgICAgIC8vIFN0cnVjdCAgPSAxMiwKKyAgICAgIFR5cGVzLk1BUCwgICAgICAgICAgICAvLyBNYXAgICAgID0gMTMsCisgICAgICBUeXBlcy5TRVRfLCAgICAgICAgICAgLy8gU2V0XyAgICA9IDE0LAorICAgICAgVHlwZXMuTElTVCAgICAgICAgICAgIC8vIExpc3QgICAgPSAxNSwKKyAgICApOworCisgICAgdGNvbXBhY3RUeXBlVG9UeXBlIDogYXJyYXlbVHlwZXNdIG9mIFRUeXBlID0gKAorICAgICAgVFR5cGUuU3RvcCwgICAgICAgLy8gU1RPUAorICAgICAgVFR5cGUuQm9vbF8sICAgICAgLy8gQk9PTEVBTl9UUlVFCisgICAgICBUVHlwZS5Cb29sXywgICAgICAvLyBCT09MRUFOX0ZBTFNFCisgICAgICBUVHlwZS5CeXRlXywgICAgICAvLyBCWVRFXworICAgICAgVFR5cGUuSTE2LCAgICAgICAgLy8gSTE2CisgICAgICBUVHlwZS5JMzIsICAgICAgICAvLyBJMzIKKyAgICAgIFRUeXBlLkk2NCwgICAgICAgIC8vIEk2NAorICAgICAgVFR5cGUuRG91YmxlXywgICAgLy8gRE9VQkxFXworICAgICAgVFR5cGUuU3RyaW5nXywgICAgLy8gQklOQVJZCisgICAgICBUVHlwZS5MaXN0LCAgICAgICAvLyBMSVNUCisgICAgICBUVHlwZS5TZXRfLCAgICAgICAvLyBTRVRfCisgICAgICBUVHlwZS5NYXAsICAgICAgICAvLyBNQVAKKyAgICAgIFRUeXBlLlN0cnVjdCAgICAgIC8vIFNUUlVDVAorICAgICk7CisKKyAgcHJpdmF0ZQorICAgIC8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgLy8gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICBsYXN0RmllbGRfIDogVFN0YWNrPEludGVnZXI+OworICAgIGxhc3RGaWVsZElkXyA6IEludGVnZXI7CisKKyAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgICAvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgcHJpdmF0ZSBib29sZWFuRmllbGRfIDogVFRocmlmdEZpZWxkOworCisgICAgLy8gSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgLy8gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgcHJpdmF0ZSAgYm9vbFZhbHVlXyAgOiAoIHVudXNlZCwgYm9vbF90cnVlLCBib29sX2ZhbHNlKTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgdHJhbnMgOiBJVHJhbnNwb3J0KTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBSZXNldDsKKworICBwcml2YXRlCisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZURpcmVjdCggY29uc3QgYiA6IEJ5dGUpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBuIDogSW50ZWdlcik7ICBvdmVybG9hZDsKKworICAgIC8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgLy8gVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSBXcml0ZVZhcmludDY0PworICAgIHByb2NlZHVyZSBXcml0ZVZhcmludDMyKCBuIDogQ2FyZGluYWwpOworCisgIHByaXZhdGUKKyAgICAvLyBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYSAndHlwZSBvdmVycmlkZScKKyAgICAvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKKworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGR1YjogRG91YmxlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVybG9hZDsgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZQorICAgIGNsYXNzIGZ1bmN0aW9uICBEb3VibGVUb0ludDY0Qml0cyggY29uc3QgZGIgOiBEb3VibGUpIDogSW50NjQ7CisgICAgY2xhc3MgZnVuY3Rpb24gIEludDY0Qml0c1RvRG91YmxlKCBjb25zdCBpNjQgOiBJbnQ2NCkgOiBEb3VibGU7CisKKyAgICAvLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgIHByb2NlZHVyZSBXcml0ZUNvbGxlY3Rpb25CZWdpbiggY29uc3QgZWxlbVR5cGUgOiBUVHlwZTsgc2l6ZSA6IEludGVnZXIpOworCisgICAgcHJvY2VkdXJlIFdyaXRlVmFyaW50NjQoIG4gOiBVSW50NjQpOworCisgICAgLy8gQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgIC8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICBjbGFzcyBmdW5jdGlvbiAgbG9uZ1RvWmlnemFnKCBjb25zdCBuIDogSW50NjQpIDogVUludDY0OworCisgICAgLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgIGNsYXNzIGZ1bmN0aW9uIGludFRvWmlnWmFnKCBjb25zdCBuIDogSW50ZWdlcikgOiBDYXJkaW5hbDsKKworICAgIC8vQ29udmVydCBhIEludDY0IGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZyB1bnRpbCBvZmYrNy4KKyAgICBjbGFzcyBwcm9jZWR1cmUgZml4ZWRMb25nVG9CeXRlcyggY29uc3QgbiA6IEludDY0OyB2YXIgYnVmIDogVEJ5dGVzKTsKKworICBwdWJsaWMKKyAgICBmdW5jdGlvbiAgUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEk2NDogSW50NjQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworCisgIHByaXZhdGUKKyAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKworICAgIC8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgIC8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICBmdW5jdGlvbiBSZWFkVmFyaW50MzIgOiBDYXJkaW5hbDsKKworICAgIC8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgIGZ1bmN0aW9uIFJlYWRWYXJpbnQ2NCA6IFVJbnQ2NDsKKworCisgICAgLy8gZW5jb2RpbmcgaGVscGVycworCisgICAgLy8gQ29udmVydCBmcm9tIHppZ3phZyBJbnRlZ2VyIHRvIEludGVnZXIuCisgICAgY2xhc3MgZnVuY3Rpb24gemlnemFnVG9JbnQoIGNvbnN0IG4gOiBDYXJkaW5hbCApIDogSW50ZWdlcjsKKworICAgIC8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50NjQgdG8gSW50NjQuCisgICAgY2xhc3MgZnVuY3Rpb24gemlnemFnVG9Mb25nKCBjb25zdCBuIDogVUludDY0KSA6IEludDY0OworCisgICAgLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIEludDY0IGxpdGVyYWxzLAorICAgIC8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIEludGVnZXIgbGVmdCA1NiBiaXRzLAorICAgIC8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBJbnRlZ2VyLgorICAgIGNsYXNzIGZ1bmN0aW9uIGJ5dGVzVG9Mb25nKCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBJbnQ2NDsKKworICAgIC8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworICAgIGNsYXNzIGZ1bmN0aW9uIGlzQm9vbFR5cGUoIGNvbnN0IGIgOiBieXRlKSA6IEJvb2xlYW47CisKKyAgICAvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCisgICAgY2xhc3MgZnVuY3Rpb24gZ2V0VFR5cGUoIGNvbnN0IHR5cGVfIDogYnl0ZSkgOiBUVHlwZTsKKworICAgIC8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gZ2V0Q29tcGFjdFR5cGUoIGNvbnN0IHR0eXBlIDogVFR5cGUpIDogQnl0ZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworCisvLy0tLSBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkuR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworYmVnaW4KKyAgcmVzdWx0IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMpOworZW5kOworCisKKy8vLS0tIFRDb21wYWN0UHJvdG9jb2xJbXBsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjb25zdHJ1Y3RvciBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggdHJhbnMpOworCisgIGxhc3RGaWVsZElkXyA6PSAwOworICBsYXN0RmllbGRfIDo9IFRTdGFjazxJbnRlZ2VyPi5DcmVhdGU7CisKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOworICBib29sVmFsdWVfIDo9IHVudXNlZDsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBsYXN0RmllbGRfKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVzZXQ7CitiZWdpbgorICBsYXN0RmllbGRfLkNsZWFyKCk7CisgIGxhc3RGaWVsZElkXyA6PSAwOworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CisgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworZW5kOworCisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIFdyaXRlIGEgYnl0ZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IGIgOiBCeXRlKTsKK2JlZ2luCisgIFRyYW5zcG9ydC5Xcml0ZSggQGIsIFNpemVPZihiKSk7CitlbmQ7CisKKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBuIDogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUobikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVWYXJpbnQzMiggbiA6IENhcmRpbmFsKTsKK3ZhciBpMzJidWYgOiBUQnl0ZXM7CisgICAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIFNldExlbmd0aCggaTMyYnVmLCA1KTsKKyAgaWR4IDo9IDA7CisgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICBBU1NFUlQoIGlkeCA8IExlbmd0aChpMzJidWYpKTsKKworICAgIC8vIGxhc3QgcGFydD8KKyAgICBpZiAoKG4gYW5kIG5vdCAkN0YpID0gMCkgdGhlbiBiZWdpbgorICAgICAgaTMyYnVmW2lkeF0gOj0gQnl0ZShuKTsKKyAgICAgIEluYyhpZHgpOworICAgICAgQnJlYWs7CisgICAgZW5kOworCisgICAgaTMyYnVmW2lkeF0gOj0gQnl0ZSgobiBhbmQgJDdGKSBvciAkODApOworICAgIEluYyhpZHgpOworICAgIG4gOj0gbiBzaHIgNzsKKyAgZW5kOworCisgIFRyYW5zcG9ydC5Xcml0ZSggaTMyYnVmLCAwLCBpZHgpOworZW5kOworCisKKy8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKKy8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKK3ZhciB2ZXJzaW9uQW5kVHlwZSA6IEJ5dGU7CitiZWdpbgorICBSZXNldDsKKworICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBWRVJTSU9OIGFuZCBWRVJTSU9OX01BU0spCisgICAgICAgICAgICAgICAgIG9yIEJ5dGUoIChDYXJkaW5hbChtc2cuVHlwZV8pIHNobCBUWVBFX1NISUZUX0FNT1VOVCkgYW5kIFRZUEVfTUFTSyk7CisKKyAgV3JpdGVCeXRlRGlyZWN0KCBQUk9UT0NPTF9JRCk7CisgIFdyaXRlQnl0ZURpcmVjdCggdmVyc2lvbkFuZFR5cGUpOworICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChtc2cuU2VxSUQpKTsKKyAgV3JpdGVTdHJpbmcoIG1zZy5OYW1lKTsKK2VuZDsKKworCisvLyBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlIGl0IGFzIGFuCisvLyBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZQorLy8gZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworYmVnaW4KKyAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CisgIGxhc3RGaWVsZElkXyA6PSAwOworZW5kOworCisKKy8vIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlIHRoaXMgYXMgYW4KKy8vIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYgb2YgdGhlIGZpZWxkIHN0YWNrLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0RW5kOworYmVnaW4KKyAgbGFzdEZpZWxkSWRfIDo9IGxhc3RGaWVsZF8uUG9wKCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCisvLyBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKDwgMTUpLCB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4KKy8vIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZSBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBjYXNlIGZpZWxkLlR5cGVfIG9mCisgICAgVFR5cGUuQm9vbF8gOiBib29sZWFuRmllbGRfIDo9IGZpZWxkOyAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgorICBlbHNlCisgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsICRGRik7CisgIGVuZDsKK2VuZDsKKworCisvLyBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYSAndHlwZSBvdmVycmlkZScKKy8vIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUgYm9vbGVhbiBmaWVsZCBjYXNlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7Cit2YXIgdHlwZVRvV3JpdGUgOiBCeXRlOworYmVnaW4KKyAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICBpZiB0eXBlT3ZlcnJpZGUgPSAkRkYKKyAgdGhlbiB0eXBlVG9Xcml0ZSA6PSBnZXRDb21wYWN0VHlwZSggZmllbGQuVHlwZV8pCisgIGVsc2UgdHlwZVRvV3JpdGUgOj0gdHlwZU92ZXJyaWRlOworCisgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICBpZiAoZmllbGQuSUQgPiBsYXN0RmllbGRJZF8pIGFuZCAoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSA8PSAxNSkKKyAgdGhlbiBiZWdpbgorICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICBXcml0ZUJ5dGVEaXJlY3QoICgoZmllbGQuSUQgLSBsYXN0RmllbGRJZF8pIHNobCA0KSBvciB0eXBlVG9Xcml0ZSk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgIFdyaXRlQnl0ZURpcmVjdCggdHlwZVRvV3JpdGUpOworICAgIFdyaXRlSTE2KCBmaWVsZC5JRCk7CisgIGVuZDsKKworICBsYXN0RmllbGRJZF8gOj0gZmllbGQuSUQ7CitlbmQ7CisKKworLy8gV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRTdG9wOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKCBUeXBlcy5TVE9QKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwordmFyIGtleSwgdmFsIDogQnl0ZTsKK2JlZ2luCisgIGlmIChtYXAuQ291bnQgPSAwKQorICB0aGVuIFdyaXRlQnl0ZURpcmVjdCggMCkKKyAgZWxzZSBiZWdpbgorICAgIFdyaXRlVmFyaW50MzIoIENhcmRpbmFsKCBtYXAuQ291bnQpKTsKKyAgICBrZXkgOj0gZ2V0Q29tcGFjdFR5cGUobWFwLktleVR5cGUpOworICAgIHZhbCA6PSBnZXRDb21wYWN0VHlwZShtYXAuVmFsdWVUeXBlKTsKKyAgICBXcml0ZUJ5dGVEaXJlY3QoIChrZXkgc2hsIDQpIG9yIHZhbCk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhIGxpc3QgaGVhZGVyLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CitiZWdpbgorICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKK2JlZ2luCisgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBzZXRfLkVsZW1lbnRUeXBlLCBzZXRfLkNvdW50KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKy8vIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisvLyByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIFdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuCisvLyBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKK3ZhciBidCA6IFR5cGVzOworYmVnaW4KKyAgaWYgYgorICB0aGVuIGJ0IDo9IFR5cGVzLkJPT0xFQU5fVFJVRQorICBlbHNlIGJ0IDo9IFR5cGVzLkJPT0xFQU5fRkFMU0U7CisKKyAgaWYgYm9vbGVhbkZpZWxkXy5UeXBlXyA9IFRUeXBlLkJvb2xfIHRoZW4gYmVnaW4KKyAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggYm9vbGVhbkZpZWxkXywgQnl0ZShidCkpOworICAgIGJvb2xlYW5GaWVsZF8uVHlwZV8gOj0gVFR5cGUuU3RvcDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoYnQpKTsKKyAgZW5kOworZW5kOworCisKKy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZShiKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUkxNiggaTE2OiBTbWFsbEludCk7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBpbnRUb1ppZ1phZyggaTE2KSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFdyaXRlVmFyaW50MzIoIGludFRvWmlnWmFnKCBpMzIpKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKK2JlZ2luCisgIFdyaXRlVmFyaW50NjQoIGxvbmdUb1ppZ3phZyggaTY0KSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoIGNvbnN0IGRiIDogRG91YmxlKSA6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YoZGIpID0gU2l6ZU9mKHJlc3VsdCkpOworICBNb3ZlKCBkYiwgcmVzdWx0LCBTaXplT2YocmVzdWx0KSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoIGNvbnN0IGk2NCA6IEludDY0KSA6IERvdWJsZTsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGk2NCkgPSBTaXplT2YocmVzdWx0KSk7CisgIE1vdmUoIGk2NCwgcmVzdWx0LCBTaXplT2YocmVzdWx0KSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZHViOiBEb3VibGUpOwordmFyIGRhdGEgOiBUQnl0ZXM7CitiZWdpbgorICBmaXhlZExvbmdUb0J5dGVzKCBEb3VibGVUb0ludDY0Qml0cyhkdWIpLCBkYXRhKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBkYXRhKTsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK2JlZ2luCisgIFdyaXRlVmFyaW50MzIoIENhcmRpbmFsKExlbmd0aChiKSkpOworICBUcmFuc3BvcnQuV3JpdGUoIGIpOworZW5kOworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1hcEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVMaXN0RW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCisvLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisvLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGNvbnN0IGVsZW1UeXBlIDogVFR5cGU7IHNpemUgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIHNpemUgPD0gMTQKKyAgdGhlbiBXcml0ZUJ5dGVEaXJlY3QoIChzaXplIHNobCA0KSBvciBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZUJ5dGVEaXJlY3QoICRGMCBvciBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIFdyaXRlVmFyaW50MzIoIENhcmRpbmFsKHNpemUpKTsKKyAgZW5kOworZW5kOworCisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlVmFyaW50NjQoIG4gOiBVSW50NjQpOwordmFyIHZhcmludDY0b3V0IDogVEJ5dGVzOworICAgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoIHZhcmludDY0b3V0LCAxMCk7CisgIGlkeCA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgQVNTRVJUKCBpZHggPCBMZW5ndGgodmFyaW50NjRvdXQpKTsKKworICAgIC8vIGxhc3Qgb25lPworICAgIGlmIChuIGFuZCBub3QgVUludDY0KCQ3RikpID0gMCB0aGVuIGJlZ2luCisgICAgICB2YXJpbnQ2NG91dFtpZHhdIDo9IEJ5dGUobik7CisgICAgICBJbmMoaWR4KTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIHZhcmludDY0b3V0W2lkeF0gOj0gQnl0ZSgobiBhbmQgJDdGKSBvciAkODApOworICAgIEluYyhpZHgpOworICAgIG4gOj0gbiBzaHIgNzsKKyAgZW5kOworCisgIFRyYW5zcG9ydC5Xcml0ZSggdmFyaW50NjRvdXQsIDAsIGlkeCk7CitlbmQ7CisKKworLy8gQ29udmVydCBsIGludG8gYSB6aWd6YWcgSW50NjQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmxvbmdUb1ppZ3phZyggY29uc3QgbiA6IEludDY0KSA6IFVJbnQ2NDsKK2JlZ2luCisgIC8vIHRoZXJlIGlzIG5vIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgaW4gRGVscGhpCisgIGlmIG4gPj0gMAorICB0aGVuIHJlc3VsdCA6PSBVSW50NjQobiBzaGwgMSkKKyAgZWxzZSByZXN1bHQgOj0gVUludDY0KG4gc2hsIDEpIHhvciAkRkZGRkZGRkZGRkZGRkZGRjsKK2VuZDsKKworCisvLyBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBJbnRlZ2VyLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZyggY29uc3QgbiA6IEludGVnZXIpIDogQ2FyZGluYWw7CitiZWdpbgorICAvLyB0aGVyZSBpcyBubyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGluIERlbHBoaQorICBpZiBuID49IDAKKyAgdGhlbiByZXN1bHQgOj0gQ2FyZGluYWwobiBzaGwgMSkKKyAgZWxzZSByZXN1bHQgOj0gQ2FyZGluYWwobiBzaGwgMSkgeG9yICRGRkZGRkZGRjsKK2VuZDsKKworCisvLyBDb252ZXJ0IGEgSW50NjQgaW50byA4IGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmCitjbGFzcyBwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuZml4ZWRMb25nVG9CeXRlcyggY29uc3QgbiA6IEludDY0OyB2YXIgYnVmIDogVEJ5dGVzKTsKK2JlZ2luCisgIFNldExlbmd0aCggYnVmLCA4KTsKKyAgYnVmWzBdIDo9IEJ5dGUoIG4gICAgICAgICBhbmQgJEZGKTsKKyAgYnVmWzFdIDo9IEJ5dGUoKG4gc2hyIDgpICBhbmQgJEZGKTsKKyAgYnVmWzJdIDo9IEJ5dGUoKG4gc2hyIDE2KSBhbmQgJEZGKTsKKyAgYnVmWzNdIDo9IEJ5dGUoKG4gc2hyIDI0KSBhbmQgJEZGKTsKKyAgYnVmWzRdIDo9IEJ5dGUoKG4gc2hyIDMyKSBhbmQgJEZGKTsKKyAgYnVmWzVdIDo9IEJ5dGUoKG4gc2hyIDQwKSBhbmQgJEZGKTsKKyAgYnVmWzZdIDo9IEJ5dGUoKG4gc2hyIDQ4KSBhbmQgJEZGKTsKKyAgYnVmWzddIDo9IEJ5dGUoKG4gc2hyIDU2KSBhbmQgJEZGKTsKK2VuZDsKKworCisKKy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKK3ZhciBwcm90b2NvbElkLCB2ZXJzaW9uQW5kVHlwZSwgdmVyc2lvbiwgdHlwZV8gOiBCeXRlOworICAgIHNlcWlkIDogSW50ZWdlcjsKKyAgICBtc2dObSA6IFN0cmluZzsKK2JlZ2luCisgIFJlc2V0OworCisgIHByb3RvY29sSWQgOj0gQnl0ZSggUmVhZEJ5dGUpOworICBpZiAocHJvdG9jb2xJZCA8PiBQUk9UT0NPTF9JRCkKKyAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSggJ0V4cGVjdGVkIHByb3RvY29sIGlkICcgKyBJbnRUb0hleChQUk9UT0NPTF9JRCwyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGJ1dCBnb3QgJyArIEludFRvSGV4KHByb3RvY29sSWQsMikpOworCisgIHZlcnNpb25BbmRUeXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgdmVyc2lvbiAgICAgICAgOj0gQnl0ZSggdmVyc2lvbkFuZFR5cGUgYW5kIFZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uIDw+IFZFUlNJT04pCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCB2ZXJzaW9uICcgK0ludFRvU3RyKFZFUlNJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9TdHIodmVyc2lvbikpOworCisgIHR5cGVfIDo9IEJ5dGUoICh2ZXJzaW9uQW5kVHlwZSBzaHIgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX0JJVFMpOworICBzZXFpZCA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBtc2dObSA6PSBSZWFkU3RyaW5nOworICBJbml0KCByZXN1bHQsIG1zZ05tLCBUTWVzc2FnZVR5cGUodHlwZV8pLCBzZXFpZCk7CitlbmQ7CisKKworLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisvLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CitiZWdpbgorICBsYXN0RmllbGRfLlB1c2goIGxhc3RGaWVsZElkXyk7CisgIGxhc3RGaWVsZElkXyA6PSAwOworICBJbml0KCByZXN1bHQpOworZW5kOworCisKKy8vIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisvLyB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOworYmVnaW4KKyAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KKyAgbGFzdEZpZWxkSWRfIDo9IGxhc3RGaWVsZF8uUG9wKCk7CitlbmQ7CisKKworLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwordmFyIHR5cGVfIDogQnl0ZTsKKyAgICBmaWVsZElkLCBtb2RpZmllciA6IFNob3J0SW50OworYmVnaW4KKyAgdHlwZV8gOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgaWYgdHlwZV8gPSBCeXRlKFR5cGVzLlNUT1ApIHRoZW4gYmVnaW4KKyAgICBJbml0KCByZXN1bHQsICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBtb2RpZmllciA6PSBTaG9ydEludCggKHR5cGVfIGFuZCAkRjApIHNociA0KTsKKyAgaWYgKG1vZGlmaWVyID0gMCkKKyAgdGhlbiBmaWVsZElkIDo9IFJlYWRJMTYgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorICBlbHNlIGZpZWxkSWQgOj0gU2hvcnRJbnQoIGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorCisgIEluaXQoIHJlc3VsdCwgJycsIGdldFRUeXBlKEJ5dGUodHlwZV8gYW5kICQwRikpLCBmaWVsZElkKTsKKworICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgIGlmIGlzQm9vbFR5cGUodHlwZV8pIHRoZW4gYmVnaW4KKyAgICBpZiBCeXRlKHR5cGVfIGFuZCAkMEYpID0gQnl0ZShUeXBlcy5CT09MRUFOX1RSVUUpCisgICAgdGhlbiBib29sVmFsdWVfIDo9IGJvb2xfdHJ1ZQorICAgIGVsc2UgYm9vbFZhbHVlXyA6PSBib29sX2ZhbHNlOworICBlbmQ7CisKKyAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgIGxhc3RGaWVsZElkXyA6PSByZXN1bHQuSUQ7CitlbmQ7CisKKworLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKy8vICJjb3JyZWN0IiB0eXBlcy4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKK3ZhciBzaXplIDogSW50ZWdlcjsKKyAgICBrZXlBbmRWYWx1ZVR5cGUgOiBCeXRlOworICAgIGtleSwgdmFsIDogVFR5cGU7CitiZWdpbgorICBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIGlmIHNpemUgPSAwCisgIHRoZW4ga2V5QW5kVmFsdWVUeXBlIDo9IDAKKyAgZWxzZSBrZXlBbmRWYWx1ZVR5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIGtleSA6PSBnZXRUVHlwZSggQnl0ZSgga2V5QW5kVmFsdWVUeXBlIHNociA0KSk7CisgIHZhbCA6PSBnZXRUVHlwZSggQnl0ZSgga2V5QW5kVmFsdWVUeXBlIGFuZCAkRikpOworICBJbml0KCByZXN1bHQsIGtleSwgdmFsLCBzaXplKTsKKyAgQVNTRVJUKCAocmVzdWx0LktleVR5cGUgPSBrZXkpIGFuZCAocmVzdWx0LlZhbHVlVHlwZSA9IHZhbCkpOworZW5kOworCisKKy8vIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlICRGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OwordmFyIHNpemVfYW5kX3R5cGUgOiBCeXRlOworICAgIHNpemUgOiBJbnRlZ2VyOworICAgIHR5cGVfIDogVFR5cGU7CitiZWdpbgorICBzaXplX2FuZF90eXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBzaXplIDo9IChzaXplX2FuZF90eXBlIHNociA0KSBhbmQgJDBGOworICBpZiAoc2l6ZSA9IDE1KQorICB0aGVuIHNpemUgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKworICB0eXBlXyA6PSBnZXRUVHlwZSggc2l6ZV9hbmRfdHlwZSk7CisgIEluaXQoIHJlc3VsdCwgdHlwZV8sIHNpemUpOworZW5kOworCisKKy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlICRGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKK3ZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKKyAgICBzaXplIDogSW50ZWdlcjsKKyAgICB0eXBlXyA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZV9hbmRfdHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgc2l6ZSA6PSAoc2l6ZV9hbmRfdHlwZSBzaHIgNCkgYW5kICQwRjsKKyAgaWYgKHNpemUgPSAxNSkKKyAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisKKyAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKK2VuZDsKKworCisvLyBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisvLyBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorLy8gcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOworYmVnaW4KKyAgaWYgYm9vbFZhbHVlXyA8PiB1bnVzZWQgdGhlbiBiZWdpbgorICAgIHJlc3VsdCA6PSAoYm9vbFZhbHVlXyA9IGJvb2xfdHJ1ZSk7CisgICAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CisgICAgRXhpdDsKKyAgZW5kOworCisgIHJlc3VsdCA6PSAoQnl0ZShSZWFkQnl0ZSkgPSBCeXRlKFR5cGVzLkJPT0xFQU5fVFJVRSkpOworZW5kOworCisKKy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKK2JlZ2luCisgIFRyYW5zcG9ydC5SZWFkQWxsKCBAcmVzdWx0LCBTaXplT2YocmVzdWx0KSwgMCwgMSk7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTE2OiBTbWFsbEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBTbWFsbEludCggemlnemFnVG9JbnQoIFJlYWRWYXJpbnQzMikpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSB6aWd6YWdUb0ludCggUmVhZFZhcmludDMyKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IHppZ3phZ1RvTG9uZyggUmVhZFZhcmludDY0KTsKK2VuZDsKKworCisvLyBObyBtYWdpYyBoZXJlIC0ganVzdCBSZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWREb3VibGU6RG91YmxlOwordmFyIGxvbmdCaXRzIDogVEJ5dGVzOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBsb25nQml0cywgOCk7CisgIFRyYW5zcG9ydC5SZWFkQWxsKCBsb25nQml0cywgMCwgOCk7CisgIHJlc3VsdCA6PSBJbnQ2NEJpdHNUb0RvdWJsZSggYnl0ZXNUb0xvbmcoIGxvbmdCaXRzKSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEJpbmFyeTogVEJ5dGVzOwordmFyIGxlbmd0aCA6IEludGVnZXI7CitiZWdpbgorICBsZW5ndGggOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgU2V0TGVuZ3RoKCByZXN1bHQsIGxlbmd0aCk7CisgIGlmIChsZW5ndGggPiAwKQorICB0aGVuIFRyYW5zcG9ydC5SZWFkQWxsKCByZXN1bHQsIDAsIGxlbmd0aCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRMaXN0RW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU2V0RW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkVmFyaW50MzIgOiBDYXJkaW5hbDsKK3ZhciBzaGlmdCA6IEludGVnZXI7CisgICAgYiA6IEJ5dGU7CitiZWdpbgorICByZXN1bHQgOj0gMDsKKyAgc2hpZnQgIDo9IDA7CisgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICBiIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgICByZXN1bHQgOj0gcmVzdWx0IG9yIChDYXJkaW5hbChiIGFuZCAkN0YpIHNobCBzaGlmdCk7CisgICAgaWYgKChiIGFuZCAkODApIDw+ICQ4MCkKKyAgICB0aGVuIEJyZWFrOworICAgIEluYyggc2hpZnQsIDcpOworICBlbmQ7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRWYXJpbnQ2NCA6IFVJbnQ2NDsKK3ZhciBzaGlmdCA6IEludGVnZXI7CisgICAgYiA6IEJ5dGU7CitiZWdpbgorICByZXN1bHQgOj0gMDsKKyAgc2hpZnQgIDo9IDA7CisgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICBiIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgICByZXN1bHQgOj0gcmVzdWx0IG9yIChVSW50NjQoYiBhbmQgJDdGKSBzaGwgc2hpZnQpOworICAgIGlmICgoYiBhbmQgJDgwKSA8PiAkODApCisgICAgdGhlbiBCcmVhazsKKyAgICBJbmMoIHNoaWZ0LCA3KTsKKyAgZW5kOworZW5kOworCisKKy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50ZWdlciB0byBJbnRlZ2VyLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoIGNvbnN0IG4gOiBDYXJkaW5hbCApIDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBJbnRlZ2VyKG4gc2hyIDEpIHhvciAoLUludGVnZXIobiBhbmQgMSkpOworZW5kOworCisKKy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50NjQgdG8gSW50NjQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0xvbmcoIGNvbnN0IG4gOiBVSW50NjQpIDogSW50NjQ7CitiZWdpbgorICByZXN1bHQgOj0gSW50NjQobiBzaHIgMSkgeG9yICgtSW50NjQobiBhbmQgMSkpOworZW5kOworCisKKy8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBJbnQ2NCBsaXRlcmFscywKKy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIEludGVnZXIgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIEludGVnZXIuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5ieXRlc1RvTG9uZyggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogSW50NjQ7CitiZWdpbgorICBBU1NFUlQoIExlbmd0aChieXRlcykgPj0gOCk7CisgIHJlc3VsdCA6PSAoSW50NjQoYnl0ZXNbN10gYW5kICRGRikgc2hsIDU2KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzZdIGFuZCAkRkYpIHNobCA0OCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s1XSBhbmQgJEZGKSBzaGwgNDApIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNF0gYW5kICRGRikgc2hsIDMyKSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzNdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1syXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMV0gYW5kICRGRikgc2hsICA4KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzBdIGFuZCAkRkYpKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5pc0Jvb2xUeXBlKCBjb25zdCBiIDogYnl0ZSkgOiBCb29sZWFuOwordmFyIGxvd2VyTmliYmxlIDogQnl0ZTsKK2JlZ2luCisgIGxvd2VyTmliYmxlIDo9IGIgYW5kICQwZjsKKyAgcmVzdWx0IDo9IChUeXBlcyhsb3dlck5pYmJsZSkgaW4gW1R5cGVzLkJPT0xFQU5fVFJVRSwgVHlwZXMuQk9PTEVBTl9GQUxTRV0pOworZW5kOworCisKKy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBUVHlwZSB2YWx1ZS4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmdldFRUeXBlKCBjb25zdCB0eXBlXyA6IGJ5dGUpIDogVFR5cGU7Cit2YXIgdGN0IDogVHlwZXM7CitiZWdpbgorICB0Y3QgOj0gVHlwZXMoIHR5cGVfIGFuZCAkMEYpOworICBpZiB0Y3QgaW4gW0xvdyhUeXBlcykuLkhpZ2goVHlwZXMpXQorICB0aGVuIHJlc3VsdCA6PSB0Y29tcGFjdFR5cGVUb1R5cGVbdGN0XQorICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnZG9uJyd0IGtub3cgd2hhdCB0eXBlOiAnK0ludFRvU3RyKE9yZCh0Y3QpKSk7CitlbmQ7CisKKworLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmdldENvbXBhY3RUeXBlKCBjb25zdCB0dHlwZSA6IFRUeXBlKSA6IEJ5dGU7CitiZWdpbgorICBpZiB0dHlwZSBpbiBWQUxJRF9UVFlQRVMKKyAgdGhlbiByZXN1bHQgOj0gQnl0ZSggdHR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXSkKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodHR5cGUpKSk7CitlbmQ7CisKKworLy8tLS0gdW5pdCB0ZXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3skSUZERUYgRGVidWd9Citwcm9jZWR1cmUgVGVzdERvdWJsZVRvSW50NjRCaXRzOworCisgIHByb2NlZHVyZSBUZXN0UGFpciggY29uc3QgYSA6IERvdWJsZTsgY29uc3QgYiA6IEludDY0KTsKKyAgYmVnaW4KKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKGEpID0gYik7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZShiKSA9IGEpOworICBlbmQ7CisKK2JlZ2luCisgIFRlc3RQYWlyKCAxLjAwMDAwMDAwMDAwMDAwMDBFKzAwMCwgIEludDY0KCQzRkYwMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCAxLjUwMDAwMDAwMDAwMDAwMDBFKzAwMSwgIEludDY0KCQ0MDJFMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCAyLjU1MDAwMDAwMDAwMDAwMDBFKzAwMiwgIEludDY0KCQ0MDZGRTAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCA0LjI5NDk2NzI5NTAwMDAwMDBFKzAwOSwgIEludDY0KCQ0MUVGRkZGRkZGRTAwMDAwKSk7CisgIFRlc3RQYWlyKCAzLjkwNjI1MDAwMDAwMDAwMDBFLTAwMywgIEludDY0KCQzRjcwMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCAyLjMyODMwNjQzNjUzODY5NjNFLTAxMCwgIEludDY0KCQzREYwMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzAwMDBFLTMwMCwgIEludDY0KCQwMUFBNzRGRTFDMUU3RTQ1KSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1MDBFLTE1MCwgIEludDY0KCQyMEQwMkEzNjU4NkRCNEJCKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjVFKzAwMCwgIEludDY0KCQzRkYzQzBDQTQyOEM1OUZBKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjdFKzAwMCwgIEludDY0KCQzRkYzQzBDQTQyOEM1OUZCKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzAwMCwgIEludDY0KCQzRkYzQzBDQTQyOEM1OUZDKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzE1MCwgIEludDY0KCQ1RjE4MjM0NENEM0NERjlGKSk7CisgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzMwMCwgIEludDY0KCQ3RTNEN0VFOEJDQkJEMzUyKSk7CisgIFRlc3RQYWlyKCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIEludDY0KCRGRkVGRkZGRkZGRkZGRkZGKSk7CisgIFRlc3RQYWlyKCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgIEludDY0KCQ3RkVGRkZGRkZGRkZGRkZGKSk7CisgIFRlc3RQYWlyKCA0Ljk0MDY1NjQ1ODQxMjQ2NTRFLTMyNCwgIEludDY0KCQwMDAwMDAwMDAwMDAwMDAxKSk7CisgIFRlc3RQYWlyKCAwLjAwMDAwMDAwMDAwMDAwMDBFKzAwMCwgIEludDY0KCQwMDAwMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCA0Ljk0MDY1NjQ1ODQxMjQ3RS0zMjQsICAgIEludDY0KCQwMDAwMDAwMDAwMDAwMDAxKSk7CisgIFRlc3RQYWlyKCAzLjIzNzg1OTIxMDAyMDYwOTJFLTMxOSwgIEludDY0KCQwMDAwMDAwMDAwMDBGRkZGKSk7CisgIFRlc3RQYWlyKCAxLjM5MDY3MTE2MTU2Njk5NTlFLTMwOSwgIEludDY0KCQwMDAwRkZGRkZGRkZGRkZGKSk7CisgIFRlc3RQYWlyKCBOZWdJbmZpbml0eSwgICAgICAgICAgICAgIEludDY0KCRGRkYwMDAwMDAwMDAwMDAwKSk7CisgIFRlc3RQYWlyKCBJbmZpbml0eSwgICAgICAgICAgICAgICAgIEludDY0KCQ3RkYwMDAwMDAwMDAwMDAwKSk7CisKKyAgLy8gTmFOIGlzIHNwZWNpYWwKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyggTmFOKSA9IEludDY0KCRGRkY4MDAwMDAwMDAwMDAwKSk7CisgIEFTU0VSVCggSXNOYW4oIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKCBJbnQ2NCgkRkZGODAwMDAwMDAwMDAwMCkpKSk7CitlbmQ7Cit7JEVORElGfQorCisKK3skSUZERUYgRGVidWd9Citwcm9jZWR1cmUgVGVzdFppZ1phZzsKKworICBwcm9jZWR1cmUgVGVzdDMyKCBjb25zdCB0ZXN0IDogSW50ZWdlcik7CisgIHZhciB6eiA6IENhcmRpbmFsOworICBiZWdpbgorICAgIHp6IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKHRlc3QpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoenopID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKKyAgcHJvY2VkdXJlIFRlc3Q2NCggY29uc3QgdGVzdCA6IEludDY0KTsKKyAgdmFyIHp6IDogVUludDY0OworICBiZWdpbgorICAgIHp6IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLmxvbmdUb1ppZ3phZyh0ZXN0KTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvTG9uZyh6eikgPSB0ZXN0LCBJbnRUb1N0cih0ZXN0KSk7CisgIGVuZDsKKwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gcHJvdG9idWYgdGVzdGNhc2VzCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoMCkgID0gMCwgJ3BiICMxIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0xKSA9IDEsICdwYiAjMiB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygxKSAgPSAyLCAncGIgIzMgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTIpID0gMywgJ3BiICM0IHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKCsyMTQ3NDgzNjQ3KSA9IDQyOTQ5NjcyOTQsICdwYiAjNSB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMjE0NzQ4MzY0OCkgPSA0Mjk0OTY3Mjk1LCAncGIgIzYgdG8gWmlnWmFnJyk7CisKKyAgLy8gcHJvdG9idWYgdGVzdGNhc2VzCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoMCkgID0gMCwgJ3BiICMxIGZyb20gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoMSkgPSAtMSwgJ3BiICMyIGZyb20gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoMikgID0gMSwgJ3BiICMzIGZyb20gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoMykgPSAtMiwgJ3BiICM0IGZyb20gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoNDI5NDk2NzI5NCkgPSArMjE0NzQ4MzY0NywgJ3BiICM1IGZyb20gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9JbnQoNDI5NDk2NzI5NSkgPSAtMjE0NzQ4MzY0OCwgJ3BiICM2IGZyb20gWmlnWmFnJyk7CisKKyAgLy8gYmFjayBhbmQgZm9ydGggMzIKKyAgVGVzdDMyKCAwKTsKKyAgZm9yIGkgOj0gMCB0byAzMCBkbyBiZWdpbgorICAgIFRlc3QzMiggKyhJbnRlZ2VyKDEpIHNobCBpKSk7CisgICAgVGVzdDMyKCAtKEludGVnZXIoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0MzIoIEludGVnZXIoJDdGRkZGRkZGKSk7CisgIFRlc3QzMiggSW50ZWdlcigkODAwMDAwMDApKTsKKworICAvLyBiYWNrIGFuZCBmb3J0aCA2NAorICBUZXN0NjQoIDApOworICBmb3IgaSA6PSAwIHRvIDYyIGRvIGJlZ2luCisgICAgVGVzdDY0KCArKEludDY0KDEpIHNobCBpKSk7CisgICAgVGVzdDY0KCAtKEludDY0KDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdDY0KCBJbnQ2NCgkN0ZGRkZGRkZGRkZGRkZGRikpOworICBUZXN0NjQoIEludDY0KCQ4MDAwMDAwMDAwMDAwMDAwKSk7CitlbmQ7Cit7JEVORElGfQorCisKK3skSUZERUYgRGVidWd9Citwcm9jZWR1cmUgVGVzdExvbmdCeXRlczsKKworICBwcm9jZWR1cmUgVGVzdCggY29uc3QgdGVzdCA6IEludDY0KTsKKyAgdmFyIGJ1ZiA6IFRCeXRlczsKKyAgYmVnaW4KKyAgICBUQ29tcGFjdFByb3RvY29sSW1wbC5maXhlZExvbmdUb0J5dGVzKCB0ZXN0LCBidWYpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuYnl0ZXNUb0xvbmcoIGJ1ZikgPSB0ZXN0LCBJbnRUb1N0cih0ZXN0KSk7CisgIGVuZDsKKwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgVGVzdCggMCk7CisgIGZvciBpIDo9IDAgdG8gNjIgZG8gYmVnaW4KKyAgICBUZXN0KCArKEludDY0KDEpIHNobCBpKSk7CisgICAgVGVzdCggLShJbnQ2NCgxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3QoIEludDY0KCQ3RkZGRkZGRkZGRkZGRkZGKSk7CisgIFRlc3QoIEludDY0KCQ4MDAwMDAwMDAwMDAwMDAwKSk7CitlbmQ7Cit7JEVORElGfQorCisKK3skSUZERUYgRGVidWd9Citwcm9jZWR1cmUgVW5pdFRlc3Q7Cit2YXIgdyA6IFdPUkQ7Citjb25zdCBGUFVfQ1dfREVOT1JNQUxJWkVEID0gJDAwMDI7CitiZWdpbgorICB3IDo9IEdldDgwODdDVzsKKyAgdHJ5CisgICAgU2V0ODA4N0NXKCB3IG9yIEZQVV9DV19ERU5PUk1BTElaRUQpOworCisgICAgVGVzdERvdWJsZVRvSW50NjRCaXRzOworICAgIFRlc3RaaWdaYWc7CisgICAgVGVzdExvbmdCeXRlczsKKworICBmaW5hbGx5CisgICAgU2V0ODA4N0NXKCB3KTsKKyAgZW5kOworZW5kOworeyRFTkRJRn0KKworCitpbml0aWFsaXphdGlvbgorICB7JElGREVGIERlYnVnfQorICBVbml0VGVzdDsKKyAgeyRFTkRJRn0KKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MDBhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcwpAQCAtMCwwICsxLDEyMzcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuUHJvdG9jb2wuSlNPTjsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2hhcmFjdGVyLAorICBDbGFzc2VzLAorICBTeXNVdGlscywKKyAgTWF0aCwKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlV0aWxzOworCit0eXBlCisgIElKU09OUHJvdG9jb2wgPSBpbnRlcmZhY2UoIElQcm90b2NvbCkKKyAgICBbJ3tGMERBRkRCRC02OTJBLTRCNzEtOTczNi1GNUQ0ODVBMjE3OEZ9J10KKyAgICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYjsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgcHJvY2VkdXJlIFJlYWRKU09OU3ludGF4Q2hhciggYiA6IEJ5dGUpOworICBlbmQ7CisKKyAgLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAvLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorICAvLyBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICAvLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCisgIFRKU09OUHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwsIElKU09OUHJvdG9jb2wpCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgIGVuZDsKKworICBwcml2YXRlCisgICAgY2xhc3MgZnVuY3Rpb24gR2V0VHlwZU5hbWVGb3JUeXBlSUQodHlwZUlEIDogVFR5cGUpIDogc3RyaW5nOworICAgIGNsYXNzIGZ1bmN0aW9uIEdldFR5cGVJREZvclR5cGVOYW1lKCBjb25zdCBuYW1lIDogc3RyaW5nKSA6IFRUeXBlOworCisgIHByb3RlY3RlZAorICAgIHR5cGUKKyAgICAgIC8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzLgorICAgICAgLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorICAgICAgVEpTT05CYXNlQ29udGV4dCA9IGNsYXNzCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgRlByb3RvIDogUG9pbnRlcjsgIC8vIHdlYWsgSUpTT05Qcm90b2NvbDsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworICAgICAgICBwcm9jZWR1cmUgV3JpdGU7ICB2aXJ0dWFsOworICAgICAgICBwcm9jZWR1cmUgUmVhZDsgIHZpcnR1YWw7CisgICAgICAgIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMgOiBCb29sZWFuOyAgdmlydHVhbDsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4KKyAgICAgIC8vIFdpbGwgaW5zZXJ0L1JlYWQgY29tbWFzIGJlZm9yZSBlYWNoIGl0ZW0gZXhjZXB0IGZvciB0aGUgZmlyc3Qgb25lLgorICAgICAgVEpTT05MaXN0Q29udGV4dCA9IGNsYXNzKCBUSlNPTkJhc2VDb250ZXh0KQorICAgICAgcHJpdmF0ZQorICAgICAgICBGRmlyc3QgOiBCb29sZWFuOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisgICAgICAgIHByb2NlZHVyZSBXcml0ZTsgIG92ZXJyaWRlOworICAgICAgICBwcm9jZWR1cmUgUmVhZDsgIG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgICAvLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbiBvZiBlYWNoIHJlY29yZAorICAgICAgLy8gcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzCisgICAgICAvLyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgVEpTT05QYWlyQ29udGV4dCA9IGNsYXNzKCBUSlNPTkJhc2VDb250ZXh0KQorICAgICAgcHJpdmF0ZQorICAgICAgICBGRmlyc3QsIEZDb2xvbiA6IEJvb2xlYW47CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKKyAgICAgICAgcHJvY2VkdXJlIFdyaXRlOyAgb3ZlcnJpZGU7CisgICAgICAgIHByb2NlZHVyZSBSZWFkOyAgb3ZlcnJpZGU7CisgICAgICAgIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMgOiBCb29sZWFuOyAgb3ZlcnJpZGU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgVExvb2thaGVhZFJlYWRlciA9IGNsYXNzCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgRlByb3RvIDogUG9pbnRlcjsgIC8vIHdlYWsgSUpTT05Qcm90b2NvbDsKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKKworICAgICAgcHJpdmF0ZQorICAgICAgICBGSGFzRGF0YSA6IEJvb2xlYW47CisgICAgICAgIEZEYXRhICAgIDogQnl0ZTsKKworICAgICAgcHVibGljCisgICAgICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAgICAgLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgIGZ1bmN0aW9uIFJlYWQgOiBCeXRlOworCisgICAgICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAgICAgLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KKyAgICAgICAgZnVuY3Rpb24gUGVlayA6IEJ5dGU7CisgICAgICBlbmQ7CisKKyAgcHJvdGVjdGVkCisgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgRkNvbnRleHRTdGFjayA6IFRTdGFjazxUSlNPTkJhc2VDb250ZXh0PjsKKworICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgIEZDb250ZXh0IDogVEpTT05CYXNlQ29udGV4dDsKKworICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgRlJlYWRlciA6IFRMb29rYWhlYWRSZWFkZXI7CisKKyAgICAvLyBQdXNoL3BvcCBhIG5ldyBKU09OIGNvbnRleHQgb250by9mcm9tIHRoZSBzdGFjay4KKyAgICBwcm9jZWR1cmUgUmVzZXRDb250ZXh0U3RhY2s7CisgICAgcHJvY2VkdXJlIFB1c2hDb250ZXh0KCBjb25zdCBhQ3R4IDogVEpTT05CYXNlQ29udGV4dCk7CisgICAgcHJvY2VkdXJlIFBvcENvbnRleHQ7CisKKyAgcHVibGljCisgICAgLy8gVEpTT05Qcm90b2NvbEltcGwgQ29uc3RydWN0b3IKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFUcmFucyA6IElUcmFuc3BvcnQpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgICBvdmVycmlkZTsKKworICBwcm90ZWN0ZWQKKyAgICAvLyBJSlNPTlByb3RvY29sCisgICAgLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGI7IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIHByb2NlZHVyZSBSZWFkSlNPTlN5bnRheENoYXIoIGIgOiBCeXRlKTsKKworICBwcml2YXRlCisgICAgLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgY2xhc3MgZnVuY3Rpb24gSGV4VmFsKCBjaCA6IEJ5dGUpIDogQnl0ZTsKKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICAgIGNsYXNzIGZ1bmN0aW9uIEhleENoYXIoIHZhbCA6IEJ5dGUpIDogQnl0ZTsKKworICAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgIHByb2NlZHVyZSBXcml0ZUpTT05TdHJpbmcoIGNvbnN0IGIgOiBUQnl0ZXMpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTlN0cmluZyggY29uc3Qgc3RyIDogc3RyaW5nKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgICAgLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkludGVnZXIoIGNvbnN0IG51bSA6IEludDY0KTsKKworICAgIC8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkRvdWJsZSggY29uc3QgbnVtIDogRG91YmxlKTsKKworICAgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZCBkYXRhCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkJhc2U2NCggY29uc3QgYiA6IFRCeXRlcyk7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTk9iamVjdEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OQXJyYXlFbmQ7CisKKyAgcHVibGljCisgICAgLy8gSVByb3RvY29sCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7ICAgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKKyAgICAvLworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nIDogc3RyaW5nOyAgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVycmlkZTsKKworCisgIHByaXZhdGUKKyAgICAvLyBSZWFkaW5nIG1ldGhvZHMuCisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCisgICAgLy8gU2tpcCBSZWFkaW5nIGZyb20gdGhlIGNvbnRleHQgaWYgc2tpcENvbnRleHQgaXMgdHJ1ZS4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTlN0cmluZyggc2tpcENvbnRleHQgOiBCb29sZWFuKSA6IFRCeXRlczsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICAgIGZ1bmN0aW9uIElzSlNPTk51bWVyaWMoIGIgOiBCeXRlKSA6IEJvb2xlYW47CisKKyAgICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICAgIGZ1bmN0aW9uIFJlYWRKU09OTnVtZXJpY0NoYXJzIDogU3RyaW5nOworCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIGZ1bmN0aW9uIFJlYWRKU09OSW50ZWdlciA6IEludDY0OworCisgICAgLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTkRvdWJsZSA6IERvdWJsZTsKKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgZnVuY3Rpb24gUmVhZEpTT05CYXNlNjQgOiBUQnl0ZXM7CisKKyAgICBwcm9jZWR1cmUgUmVhZEpTT05PYmplY3RTdGFydDsKKyAgICBwcm9jZWR1cmUgUmVhZEpTT05PYmplY3RFbmQ7CisgICAgcHJvY2VkdXJlIFJlYWRKU09OQXJyYXlTdGFydDsKKyAgICBwcm9jZWR1cmUgUmVhZEpTT05BcnJheUVuZDsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK3ZhcgorICBDT01NQSAgICAgOiBUQnl0ZXM7CisgIENPTE9OICAgICA6IFRCeXRlczsKKyAgTEJSQUNFICAgIDogVEJ5dGVzOworICBSQlJBQ0UgICAgOiBUQnl0ZXM7CisgIExCUkFDS0VUICA6IFRCeXRlczsKKyAgUkJSQUNLRVQgIDogVEJ5dGVzOworICBRVU9URSAgICAgOiBUQnl0ZXM7CisgIEJBQ0tTTEFTSCA6IFRCeXRlczsKKyAgRVNDU0VRICAgIDogVEJ5dGVzOworCitjb25zdAorICBWRVJTSU9OID0gMTsKKyAgSlNPTl9DSEFSX1RBQkxFIDogYXJyYXlbMC4uJDJGXSBvZiBCeXRlCisgICAgICAgICAgICAgICAgICA9ICgwLDAsMCwwLCAwLDAsMCwwLCBCeXRlKCdiJyksQnl0ZSgndCcpLEJ5dGUoJ24nKSwwLCBCeXRlKCdmJyksQnl0ZSgncicpLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsICAwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgMSwxLEJ5dGUoJyInKSwxLCAgMSwxLDEsMSwgMSwxLDEsMSwgMSwxLDEsMSk7CisKKyAgRVNDQVBFX0NIQVJTICAgICA9ICciXC9idG5mcic7CisgIEVTQ0FQRV9DSEFSX1ZBTFMgPSAnIlwvJyM4IzkjMTAjMTIjMTM7CisKKyAgREVGX1NUUklOR19TSVpFID0gMTY7CisKKyAgTkFNRV9CT09MICAgPSAndGYnOworICBOQU1FX0JZVEUgICA9ICdpOCc7CisgIE5BTUVfSTE2ICAgID0gJ2kxNic7CisgIE5BTUVfSTMyICAgID0gJ2kzMic7CisgIE5BTUVfSTY0ICAgID0gJ2k2NCc7CisgIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgIE5BTUVfU1RSVUNUID0gJ3JlYyc7CisgIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgIE5BTUVfTUFQICAgID0gJ21hcCc7CisgIE5BTUVfTElTVCAgID0gJ2xzdCc7CisgIE5BTUVfU0VUICAgID0gJ3NldCc7CisKKyAgSU5WQVJJQU5UX0NVTFRVUkUgOiBURm9ybWF0U2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgPSAoIFRob3VzYW5kU2VwYXJhdG9yOiAnLCc7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsU2VwYXJhdG9yOiAnLicpOworCisKKworLy8tLS0gVEpTT05Qcm90b2NvbEltcGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIHJlc3VsdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUodHJhbnMpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5HZXRUeXBlTmFtZUZvclR5cGVJRCh0eXBlSUQgOiBUVHlwZSkgOiBzdHJpbmc7CitiZWdpbgorICBjYXNlIHR5cGVJRCBvZgorICAgIFRUeXBlLkJvb2xfOiAgICByZXN1bHQgOj0gTkFNRV9CT09MOworICAgIFRUeXBlLkJ5dGVfOiAgICByZXN1bHQgOj0gTkFNRV9CWVRFOworICAgIFRUeXBlLkkxNjogICAgICByZXN1bHQgOj0gTkFNRV9JMTY7CisgICAgVFR5cGUuSTMyOiAgICAgIHJlc3VsdCA6PSBOQU1FX0kzMjsKKyAgICBUVHlwZS5JNjQ6ICAgICAgcmVzdWx0IDo9IE5BTUVfSTY0OworICAgIFRUeXBlLkRvdWJsZV86ICByZXN1bHQgOj0gTkFNRV9ET1VCTEU7CisgICAgVFR5cGUuU3RyaW5nXzogIHJlc3VsdCA6PSBOQU1FX1NUUklORzsKKyAgICBUVHlwZS5TdHJ1Y3Q6ICAgcmVzdWx0IDo9IE5BTUVfU1RSVUNUOworICAgIFRUeXBlLk1hcDogICAgICByZXN1bHQgOj0gTkFNRV9NQVA7CisgICAgVFR5cGUuU2V0XzogICAgIHJlc3VsdCA6PSBOQU1FX1NFVDsKKyAgICBUVHlwZS5MaXN0OiAgICAgcmVzdWx0IDo9IE5BTUVfTElTVDsKKyAgZWxzZQorICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZSgnVW5yZWNvZ25pemVkIHR5cGUgKCcrSW50VG9TdHIoT3JkKHR5cGVJRCkpKycpJyk7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5HZXRUeXBlSURGb3JUeXBlTmFtZSggY29uc3QgbmFtZSA6IHN0cmluZykgOiBUVHlwZTsKK2JlZ2luCisgIGlmICAgICAgbmFtZSA9IE5BTUVfQk9PTCAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkJvb2xfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfQllURSAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkJ5dGVfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfSTE2ICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkkxNgorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0kzMiAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5JMzIKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9JNjQgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuSTY0CisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfRE9VQkxFIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkRvdWJsZV8KKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9TVFJVQ1QgdGhlbiByZXN1bHQgOj0gVFR5cGUuU3RydWN0CisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU1RSSU5HIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlN0cmluZ18KKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9NQVAgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuTWFwCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfTElTVCAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkxpc3QKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9TRVQgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuU2V0XworICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZSgnVW5yZWNvZ25pemVkIHR5cGUgKCcrbmFtZSsnKScpOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OQmFzZUNvbnRleHQuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZQcm90byA6PSBQb2ludGVyKGFQcm90byk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OQmFzZUNvbnRleHQuV3JpdGU7CitiZWdpbgorICAvLyBub3RoaW5nCitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OQmFzZUNvbnRleHQuUmVhZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LkVzY2FwZU51bWJlcnMgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IEZBTFNFOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OTGlzdENvbnRleHQuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFQcm90byk7CisgIEZGaXJzdCA6PSBUUlVFOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkxpc3RDb250ZXh0LldyaXRlOworYmVnaW4KKyAgaWYgRkZpcnN0CisgIHRoZW4gRkZpcnN0IDo9IEZBTFNFCisgIGVsc2UgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5Xcml0ZSggQ09NTUEpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkxpc3RDb250ZXh0LlJlYWQ7CitiZWdpbgorICBpZiBGRmlyc3QKKyAgdGhlbiBGRmlyc3QgOj0gRkFMU0UKKyAgZWxzZSBJSlNPTlByb3RvY29sKEZQcm90bykuUmVhZEpTT05TeW50YXhDaGFyKCBDT01NQVswXSk7CitlbmQ7CisKKworY29uc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5DcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYVByb3RvKTsKKyAgRkZpcnN0IDo9IFRSVUU7CisgIEZDb2xvbiA6PSBUUlVFOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTlBhaXJDb250ZXh0LldyaXRlOworYmVnaW4KKyAgaWYgRkZpcnN0IHRoZW4gYmVnaW4KKyAgICBGRmlyc3QgOj0gRkFMU0U7CisgICAgRkNvbG9uIDo9IFRSVUU7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgRkNvbG9uCisgICAgdGhlbiBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LldyaXRlKCBDT0xPTikKKyAgICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuV3JpdGUoIENPTU1BKTsKKyAgICBGQ29sb24gOj0gbm90IEZDb2xvbjsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTlBhaXJDb250ZXh0LlJlYWQ7CitiZWdpbgorICBpZiBGRmlyc3QgdGhlbiBiZWdpbgorICAgIEZGaXJzdCA6PSBGQUxTRTsKKyAgICBGQ29sb24gOj0gVFJVRTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGQ29sb24KKyAgICB0aGVuIElKU09OUHJvdG9jb2woRlByb3RvKS5SZWFkSlNPTlN5bnRheENoYXIoIENPTE9OWzBdKQorICAgIGVsc2UgSUpTT05Qcm90b2NvbChGUHJvdG8pLlJlYWRKU09OU3ludGF4Q2hhciggQ09NTUFbMF0pOworICAgIEZDb2xvbiA6PSBub3QgRkNvbG9uOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5Fc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQ29sb247CitlbmQ7CisKKworY29uc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5DcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb3RvICAgOj0gUG9pbnRlcihhUHJvdG8pOworICBGSGFzRGF0YSA6PSBGQUxTRTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5UTG9va2FoZWFkUmVhZGVyLlJlYWQgOiBCeXRlOworYmVnaW4KKyAgaWYgRkhhc0RhdGEKKyAgdGhlbiBGSGFzRGF0YSA6PSBGQUxTRQorICBlbHNlIGJlZ2luCisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOworICBlbmQ7CisgIHJlc3VsdCA6PSBGRGF0YTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5UTG9va2FoZWFkUmVhZGVyLlBlZWsgOiBCeXRlOworYmVnaW4KKyAgaWYgbm90IEZIYXNEYXRhIHRoZW4gYmVnaW4KKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CisgICAgRkhhc0RhdGEgOj0gVFJVRTsKKyAgZW5kOworICByZXN1bHQgOj0gRkRhdGE7CitlbmQ7CisKKworY29uc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKCBjb25zdCBhVHJhbnMgOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFUcmFucyk7CisKKyAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgIEZDb250ZXh0U3RhY2sgOj0gVFN0YWNrPFRKU09OQmFzZUNvbnRleHQ+LkNyZWF0ZTsKKworICBGQ29udGV4dCA6PSBUSlNPTkJhc2VDb250ZXh0LkNyZWF0ZSggU2VsZik7CisgIEZSZWFkZXIgIDo9IFRMb29rYWhlYWRSZWFkZXIuQ3JlYXRlKCBTZWxmKTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBSZXNldENvbnRleHRTdGFjazsgIC8vIGZyZWUgYW55IGNvbnRlbnRzCisgICAgRnJlZUFuZE5pbCggRlJlYWRlcik7CisgICAgRnJlZUFuZE5pbCggRkNvbnRleHQpOworICAgIEZyZWVBbmROaWwoIEZDb250ZXh0U3RhY2spOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVzZXRDb250ZXh0U3RhY2s7CitiZWdpbgorICB3aGlsZSBGQ29udGV4dFN0YWNrLkNvdW50ID4gMAorICBkbyBQb3BDb250ZXh0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5QdXNoQ29udGV4dCggY29uc3QgYUN0eCA6IFRKU09OQmFzZUNvbnRleHQpOworYmVnaW4KKyAgRkNvbnRleHRTdGFjay5QdXNoKCBGQ29udGV4dCk7CisgIEZDb250ZXh0IDo9IGFDdHg7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlBvcENvbnRleHQ7CitiZWdpbgorICBGcmVlQW5kTmlsKEZDb250ZXh0KTsKKyAgRkNvbnRleHQgOj0gRkNvbnRleHRTdGFjay5Qb3A7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OU3ludGF4Q2hhciggYiA6IEJ5dGUpOwordmFyIGNoIDogQnl0ZTsKK2JlZ2luCisgIGNoIDo9IEZSZWFkZXIuUmVhZDsKKyAgaWYgKGNoIDw+IGIpCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLkhleFZhbCggY2ggOiBCeXRlKSA6IEJ5dGU7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICBpIDo9IFN0clRvSW50RGVmKCAnJDAnK0NoYXIoY2gpLCAtMSk7CisgIGlmICgwIDw9IGkpIGFuZCAoaSA8ICQxMCkKKyAgdGhlbiByZXN1bHQgOj0gaQorICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLkhleENoYXIoIHZhbCA6IEJ5dGUpIDogQnl0ZTsKK2NvbnN0IEhFWENIQVJTID0gJzAxMjM0NTY3ODlBQkNERUYnOworYmVnaW4KKyAgcmVzdWx0IDo9IEJ5dGUoIFBDaGFyKEhFWENIQVJTKVt2YWwgYW5kICQwRl0pOworICBBU1NFUlQoIFBvcyggQ2hhcihyZXN1bHQpLCBIRVhDSEFSUykgPiAwKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OU3RyaW5nKCBjb25zdCBzdHIgOiBzdHJpbmcpOworYmVnaW4KKyAgV3JpdGVKU09OU3RyaW5nKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggc3RyKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTlN0cmluZyggY29uc3QgYiA6IFRCeXRlcyk7Cit2YXIgaSA6IEludGVnZXI7CisgICAgdG1wIDogVEJ5dGVzOworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworICBmb3IgaSA6PSAwIHRvIExlbmd0aChiKS0xIGRvIGJlZ2luCisKKyAgICBpZiAoYltpXSBhbmQgJDAwRkYpID49ICQzMCB0aGVuIGJlZ2luCisKKyAgICAgIGlmIChiW2ldID0gQkFDS1NMQVNIWzBdKSB0aGVuIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggQkFDS1NMQVNIKTsKKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBCQUNLU0xBU0gpOworICAgICAgZW5kCisgICAgICBlbHNlIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggYiwgaSwgMSk7CisgICAgICBlbmQ7CisKKyAgICBlbmQKKyAgICBlbHNlIGJlZ2luCisgICAgICBTZXRMZW5ndGgoIHRtcCwgMik7CisgICAgICB0bXBbMF0gOj0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOworICAgICAgaWYgKHRtcFswXSA9IDEpIHRoZW4gYmVnaW4KKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBiLCBpLCAxKQorICAgICAgZW5kCisgICAgICBlbHNlIGlmICh0bXBbMF0gPiAxKSB0aGVuIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggQkFDS1NMQVNIKTsKKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCB0bXAsIDAsIDEpOworICAgICAgZW5kCisgICAgICBlbHNlIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggRVNDU0VRKTsKKyAgICAgICAgdG1wWzBdIDo9IEhleENoYXIoIGJbaV0gZGl2ICQxMCk7CisgICAgICAgIHRtcFsxXSA6PSBIZXhDaGFyKCBiW2ldKTsKKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCB0bXAsIDAsIDIpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OSW50ZWdlciggY29uc3QgbnVtIDogSW50NjQpOwordmFyIHN0ciA6IFN0cmluZzsKKyAgICBlc2NhcGVOdW0gOiBCb29sZWFuOworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIHN0ciA6PSBJbnRUb1N0cihudW0pOworCisgIGVzY2FwZU51bSA6PSBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzOworICBpZiBlc2NhcGVOdW0KKyAgdGhlbiBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKworICBUcmFuc3BvcnQuV3JpdGUoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBzdHIpKTsKKworICBpZiBlc2NhcGVOdW0KKyAgdGhlbiBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09ORG91YmxlKCBjb25zdCBudW0gOiBEb3VibGUpOwordmFyIHN0ciA6IHN0cmluZzsKKyAgICBzcGVjaWFsIDogQm9vbGVhbjsKKyAgICBlc2NhcGVOdW0gOiBCb29sZWFuOworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisKKyAgc3RyIDo9IEZsb2F0VG9TdHIoIG51bSwgSU5WQVJJQU5UX0NVTFRVUkUpOworICBzcGVjaWFsIDo9IEZBTFNFOworCisgIGNhc2UgVXBDYXNlKHN0clsxXSkgb2YKKyAgICAnTicgOiBzcGVjaWFsIDo9IFRSVUU7ICAvLyBOYU4KKyAgICAnSScgOiBzcGVjaWFsIDo9IFRSVUU7ICAvLyBJbmZpbml0eQorICAgICctJyA6IHNwZWNpYWwgOj0gKFVwQ2FzZShzdHJbMl0pID0gJ0knKTsgLy8gLUluZmluaXR5CisgIGVuZDsKKworICBlc2NhcGVOdW0gOj0gc3BlY2lhbCBvciBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzOworCisKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CisKKyAgVHJhbnNwb3J0LldyaXRlKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggc3RyKSk7CisKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkJhc2U2NCggY29uc3QgYiA6IFRCeXRlcyk7Cit2YXIgbGVuLCBvZmYsIGNudCA6IEludGVnZXI7CisgICAgdG1wQnVmIDogVEJ5dGVzOworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworCisgIGxlbiA6PSBMZW5ndGgoYik7CisgIG9mZiA6PSAwOworICBTZXRMZW5ndGgoIHRtcEJ1ZiwgNCk7CisKKyAgd2hpbGUgbGVuID49IDMgZG8gYmVnaW4KKyAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBCYXNlNjRVdGlscy5FbmNvZGUoIGIsIG9mZiwgMywgdG1wQnVmLCAwKTsKKyAgICBUcmFuc3BvcnQuV3JpdGUoIHRtcEJ1ZiwgMCwgNCk7CisgICAgSW5jKCBvZmYsIDMpOworICAgIERlYyggbGVuLCAzKTsKKyAgZW5kOworCisgIC8vIEVuY29kZSByZW1haW5kZXIsIGlmIGFueQorICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBjbnQgOj0gQmFzZTY0VXRpbHMuRW5jb2RlKCBiLCBvZmYsIGxlbiwgdG1wQnVmLCAwKTsKKyAgICBUcmFuc3BvcnQuV3JpdGUoIHRtcEJ1ZiwgMCwgY250KTsKKyAgZW5kOworCisgIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05PYmplY3RTdGFydDsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIExCUkFDRSk7CisgIFB1c2hDb250ZXh0KCBUSlNPTlBhaXJDb250ZXh0LkNyZWF0ZSggU2VsZikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05PYmplY3RFbmQ7CitiZWdpbgorICBQb3BDb250ZXh0OworICBUcmFuc3BvcnQuV3JpdGUoIFJCUkFDRSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkFycmF5U3RhcnQ7CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgVHJhbnNwb3J0LldyaXRlKCBMQlJBQ0tFVCk7CisgIFB1c2hDb250ZXh0KCBUSlNPTkxpc3RDb250ZXh0LkNyZWF0ZSggU2VsZikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05BcnJheUVuZDsKK2JlZ2luCisgIFBvcENvbnRleHQ7CisgIFRyYW5zcG9ydC5Xcml0ZSggUkJSQUNLRVQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKKworICBXcml0ZUpTT05BcnJheVN0YXJ0OworICBXcml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOworCisgIFdyaXRlSlNPTlN0cmluZyggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIGFNc2cuTmFtZSkpOworCisgIFdyaXRlSlNPTkludGVnZXIoIExvbmdJbnQoIGFNc2cuVHlwZV8pKTsKKyAgV3JpdGVKU09OSW50ZWdlciggYU1zZy5TZXFJRCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VFbmQ7CitiZWdpbgorICBXcml0ZUpTT05BcnJheUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworYmVnaW4KKyAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0RW5kOworYmVnaW4KKyAgV3JpdGVKU09OT2JqZWN0RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkKTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOworICBXcml0ZUpTT05PYmplY3RTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC5UeXBlXykpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKyAgV3JpdGVKU09OT2JqZWN0RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CitiZWdpbgorICBXcml0ZUpTT05BcnJheVN0YXJ0OworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAuS2V5VHlwZSkpOworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAuVmFsdWVUeXBlKSk7CisgIFdyaXRlSlNPTkludGVnZXIoIG1hcC5Db3VudCk7CisgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdEVuZDsKKyAgV3JpdGVKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CitiZWdpbgorICBXcml0ZUpTT05BcnJheVN0YXJ0OworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBsaXN0LkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSlNPTkludGVnZXIobGlzdC5Db3VudCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldF8uRWxlbWVudFR5cGUpKTsKKyAgV3JpdGVKU09OSW50ZWdlciggc2V0Xy5Db3VudCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU2V0RW5kOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlFbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUJvb2woIGI6IEJvb2xlYW4pOworYmVnaW4KKyAgaWYgYgorICB0aGVuIFdyaXRlSlNPTkludGVnZXIoIDEpCisgIGVsc2UgV3JpdGVKU09OSW50ZWdlciggMCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoIGIpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgV3JpdGVKU09OSW50ZWdlciggaTE2KTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSTMyKCBpMzI6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVKU09OSW50ZWdlciggaTMyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoaTY0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworYmVnaW4KKyAgV3JpdGVKU09ORG91YmxlKCBkKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsKK2JlZ2luCisgIFdyaXRlSlNPTlN0cmluZyggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHMpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworYmVnaW4KKyAgV3JpdGVKU09OQmFzZTY0KCBiKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTlN0cmluZyggc2tpcENvbnRleHQgOiBCb29sZWFuKSA6IFRCeXRlczsKK3ZhciBidWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICAgIGNoICA6IEJ5dGU7CisgICAgd2NoIDogV29yZDsKKyAgICBoaWdoU3Vyb2dhdGU6IENoYXI7CisgICAgc3Vycm9nYXRlUGFpcnM6IEFycmF5WzAuLjFdIG9mIENoYXI7CisgICAgb2ZmIDogSW50ZWdlcjsKKyAgICB0bXAgOiBUQnl0ZXM7CitiZWdpbgorICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgIGJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgdHJ5CisgICAgaWYgbm90IHNraXBDb250ZXh0CisgICAgdGhlbiBGQ29udGV4dC5SZWFkOworCisgICAgUmVhZEpTT05TeW50YXhDaGFyKCBRVU9URVswXSk7CisKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICBjaCA6PSBGUmVhZGVyLlJlYWQ7CisKKyAgICAgIGlmIChjaCA9IFFVT1RFWzBdKQorICAgICAgdGhlbiBCcmVhazsKKworICAgICAgLy8gY2hlY2sgZm9yIGVzY2FwZXMKKyAgICAgIGlmIChjaCA8PiBFU0NTRVFbMF0pIHRoZW4gYmVnaW4KKyAgICAgICAgYnVmZmVyLldyaXRlKCBjaCwgMSk7CisgICAgICAgIENvbnRpbnVlOworICAgICAgZW5kOworCisgICAgICAvLyBkaXN0dWluZ3Vpc2ggYmV0d2VlbiBcdU5OTk4gYW5kIFw/CisgICAgICBjaCA6PSBGUmVhZGVyLlJlYWQ7CisgICAgICBpZiAoY2ggPD4gRVNDU0VRWzFdKQorICAgICAgdGhlbiBiZWdpbgorICAgICAgICBvZmYgOj0gUG9zKCBDaGFyKGNoKSwgRVNDQVBFX0NIQVJTKTsKKyAgICAgICAgaWYgb2ZmIDwgMQorICAgICAgICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgY29udHJvbCBjaGFyJyk7CisgICAgICAgIGNoIDo9IEJ5dGUoIEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggY2gsIDEpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gaXQgaXMgXHVYWFhYCisgICAgICBTZXRMZW5ndGgoIHRtcCwgNCk7CisgICAgICBUcmFuc3BvcnQuUmVhZEFsbCggdG1wLCAwLCA0KTsKKyAgICAgIHdjaCA6PSAoSGV4VmFsKHRtcFswXSkgc2hsIDEyKQorICAgICAgICAgICArIChIZXhWYWwodG1wWzFdKSBzaGwgOCkKKyAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsyXSkgc2hsIDQpCisgICAgICAgICAgICsgIEhleFZhbCh0bXBbM10pOworCisgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2UgVVRGOCBieXRlcyBmcm9tIGl0LCB0byBiZSBkZWNvZGVkIGxhdGVyCisgICAgICBpZiBDaGFyVXRpbHMuSXNIaWdoU3Vycm9nYXRlKGNoYXIod2NoKSkgdGhlbiBiZWdpbgorICAgICAgICBpZiBoaWdoU3Vyb2dhdGUgPD4gIzAKKyAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gY2hhcih3Y2gpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIENoYXJVdGlscy5Jc0xvd1N1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlID0gIzAKKyAgICAgICAgdGhlbiBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMF0gOj0gaGlnaFN1cm9nYXRlOworICAgICAgICBzdXJyb2dhdGVQYWlyc1sxXSA6PSBjaGFyKHdjaCk7CisgICAgICAgIHRtcCA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdXJyb2dhdGVQYWlycyk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICAgIGhpZ2hTdXJvZ2F0ZSA6PSAjMDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICB0bXAgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoQ2hhcih3Y2gpKTsKKyAgICAgICAgYnVmZmVyLldyaXRlKCB0bXBbMF0sIExlbmd0aCh0bXApKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBpZiBoaWdoU3Vyb2dhdGUgPD4gIzAKKyAgICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyJyk7CisKKyAgICBTZXRMZW5ndGgoIHJlc3VsdCwgYnVmZmVyLlNpemUpOworICAgIGlmIGJ1ZmZlci5TaXplID4gMCB0aGVuIE1vdmUoIGJ1ZmZlci5NZW1vcnleLCByZXN1bHRbMF0sIExlbmd0aChyZXN1bHQpKTsKKworICBmaW5hbGx5CisgICAgYnVmZmVyLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5Jc0pTT05OdW1lcmljKCBiIDogQnl0ZSkgOiBCb29sZWFuOworY29uc3QgTlVNQ0hBUlMgPSBbJysnLCctJywnLicsJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdFJywnZSddOworYmVnaW4KKyAgcmVzdWx0IDo9IENoYXJJblNldCggQ2hhcihiKSwgTlVNQ0hBUlMpOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OTnVtZXJpY0NoYXJzIDogc3RyaW5nOwordmFyIHN0cmJsZCA6IFRUaHJpZnRTdHJpbmdCdWlsZGVyOworICAgIGNoIDogQnl0ZTsKK2JlZ2luCisgIHN0cmJsZCA6PSBUVGhyaWZ0U3RyaW5nQnVpbGRlci5DcmVhdGU7CisgIHRyeQorICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIGNoIDo9IEZSZWFkZXIuUGVlazsKKyAgICAgIGlmIElzSlNPTk51bWVyaWMoY2gpCisgICAgICB0aGVuIHN0cmJsZC5BcHBlbmQoIENoYXIoRlJlYWRlci5SZWFkKSkKKyAgICAgIGVsc2UgQnJlYWs7CisgICAgZW5kOworICAgIHJlc3VsdCA6PSBzdHJibGQuVG9TdHJpbmc7CisKKyAgZmluYWxseQorICAgIHN0cmJsZC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05JbnRlZ2VyIDogSW50NjQ7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgRkNvbnRleHQuUmVhZDsKKyAgaWYgRkNvbnRleHQuRXNjYXBlTnVtYmVycworICB0aGVuIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgIHN0ciA6PSBSZWFkSlNPTk51bWVyaWNDaGFyczsKKworICBpZiBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzCisgIHRoZW4gUmVhZEpTT05TeW50YXhDaGFyKCBRVU9URVswXSk7CisKKyAgdHJ5CisgICAgcmVzdWx0IDo9IFN0clRvSW50NjQoc3RyKTsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSAoJytzdHIrJykgKCcrZS5NZXNzYWdlKycpJyk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05Eb3VibGUgOiBEb3VibGU7Cit2YXIgZHViIDogRG91YmxlOworICAgIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisKKyAgaWYgRlJlYWRlci5QZWVrID0gUVVPVEVbMF0KKyAgdGhlbiBiZWdpbgorICAgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBUUlVFKSk7CisgICAgZHViIDo9IFN0clRvRmxvYXQoIHN0ciwgSU5WQVJJQU5UX0NVTFRVUkUpOworCisgICAgaWYgbm90IEZDb250ZXh0LkVzY2FwZU51bWJlcnMoKQorICAgIGFuZCBub3QgTWF0aC5Jc05hTihkdWIpCisgICAgYW5kIG5vdCBNYXRoLklzSW5maW5pdGUoZHViKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluICBTZWxmIGNhc2UKKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKKyAgICBlbmQ7CisgICAgcmVzdWx0IDo9IGR1YjsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgLy8gd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgIGlmIEZDb250ZXh0LkVzY2FwZU51bWJlcnMKKyAgdGhlbiBSZWFkSlNPTlN5bnRheENoYXIoIFFVT1RFWzBdKTsKKworICB0cnkKKyAgICBzdHIgOj0gUmVhZEpTT05OdW1lcmljQ2hhcnM7CisgICAgcmVzdWx0IDo9IFN0clRvRmxvYXQoIHN0ciwgSU5WQVJJQU5UX0NVTFRVUkUpOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSAoJytzdHIrJykgKCcrZS5NZXNzYWdlKycpJyk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTkJhc2U2NCA6IFRCeXRlczsKK3ZhciBiIDogVEJ5dGVzOworICAgIGxlbiwgb2ZmLCBzaXplIDogSW50ZWdlcjsKK2JlZ2luCisgIGIgOj0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgIGxlbiA6PSBMZW5ndGgoYik7CisgIG9mZiA6PSAwOworICBzaXplIDo9IDA7CisKKyAgLy8gcmVkdWNlIGxlbiB0byBpZ25vcmUgZmlsbCBieXRlcworICBEZWMobGVuKTsKKyAgd2hpbGUgKGxlbiA+PSAwKSBhbmQgKGJbbGVuXSA9IEJ5dGUoJz0nKSkgZG8gRGVjKGxlbik7CisgIEluYyhsZW4pOworCisgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgd2hpbGUgKGxlbiA+PSA0KSBkbyBiZWdpbgorICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgIEluYyggc2l6ZSwgQmFzZTY0VXRpbHMuRGVjb2RlKCBiLCBvZmYsIDQsIGIsIHNpemUpKTsgLy8gZGVjb2RlZCBpbiBwbGFjZQorICAgIEluYyggb2ZmLCA0KTsKKyAgICBEZWMoIGxlbiwgNCk7CisgIGVuZDsKKworICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyB0eXBlKQorICBpZiBsZW4gPiAxIHRoZW4gYmVnaW4KKyAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgSW5jKCBzaXplLCBCYXNlNjRVdGlscy5EZWNvZGUoIGIsIG9mZiwgbGVuLCBiLCBzaXplKSk7IC8vIGRlY29kZWQgaW4gcGxhY2UKKyAgZW5kOworCisgIC8vIHJlc2l6ZSB0byBmaW5hbCBzaXplIGFuZCByZXR1cm4gdGhlIGRhdGEKKyAgU2V0TGVuZ3RoKCBiLCBzaXplKTsKKyAgcmVzdWx0IDo9IGI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OT2JqZWN0U3RhcnQ7CitiZWdpbgorICBGQ29udGV4dC5SZWFkOworICBSZWFkSlNPTlN5bnRheENoYXIoIExCUkFDRVswXSk7CisgIFB1c2hDb250ZXh0KCBUSlNPTlBhaXJDb250ZXh0LkNyZWF0ZSggU2VsZikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTk9iamVjdEVuZDsKK2JlZ2luCisgIFJlYWRKU09OU3ludGF4Q2hhciggUkJSQUNFWzBdKTsKKyAgUG9wQ29udGV4dDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05BcnJheVN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuUmVhZDsKKyAgUmVhZEpTT05TeW50YXhDaGFyKCBMQlJBQ0tFVFswXSk7CisgIFB1c2hDb250ZXh0KCBUSlNPTkxpc3RDb250ZXh0LkNyZWF0ZSggU2VsZikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTkFycmF5RW5kOworYmVnaW4KKyAgUmVhZEpTT05TeW50YXhDaGFyKCBSQlJBQ0tFVFswXSk7CisgIFBvcENvbnRleHQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCisKKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIGlmIFJlYWRKU09OSW50ZWdlciA8PiBWRVJTSU9OCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpOworCisgIHJlc3VsdC5OYW1lICA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOworICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkSlNPTkludGVnZXIpOworICByZXN1bHQuU2VxSUQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIFJlYWRKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luIDogVFRocmlmdFN0cnVjdCA7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdFN0YXJ0OworICBJbml0KCByZXN1bHQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOworYmVnaW4KKyAgUmVhZEpTT05PYmplY3RFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBUVGhyaWZ0RmllbGQ7Cit2YXIgY2ggOiBCeXRlOworICAgIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIGNoIDo9IEZSZWFkZXIuUGVlazsKKyAgaWYgY2ggPSBSQlJBQ0VbMF0KKyAgdGhlbiByZXN1bHQuVHlwZV8gOj0gVFR5cGUuU3RvcAorICBlbHNlIGJlZ2luCisgICAgcmVzdWx0LklEIDo9IFJlYWRKU09OSW50ZWdlcjsKKyAgICBSZWFkSlNPTk9iamVjdFN0YXJ0OworCisgICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoIEZBTFNFKSk7CisgICAgcmVzdWx0LlR5cGVfIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKK2JlZ2luCisgIFJlYWRKU09OT2JqZWN0RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbiA6IFRUaHJpZnRNYXA7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5LZXlUeXBlIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gR2V0VHlwZUlERm9yVHlwZU5hbWUoIHN0cik7CisKKyAgcmVzdWx0LkNvdW50IDo9IFJlYWRKU09OSW50ZWdlcjsKKyAgUmVhZEpTT05PYmplY3RTdGFydDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEVuZDsKK2JlZ2luCisgIFJlYWRKU09OT2JqZWN0RW5kOworICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW4gOiBUVGhyaWZ0TGlzdDsKK3ZhciBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBSZWFkSlNPTkFycmF5U3RhcnQ7CisKKyAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworICByZXN1bHQuQ291bnQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisgIFJlYWRKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFNldEJlZ2luIDogVFRocmlmdFNldDsKK3ZhciBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBSZWFkSlNPTkFycmF5U3RhcnQ7CisKKyAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworICByZXN1bHQuQ291bnQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0RW5kOworYmVnaW4KKyAgUmVhZEpTT05BcnJheUVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkQm9vbCA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKFJlYWRKU09OSW50ZWdlciA8PiAwKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkQnl0ZSA6IFNob3J0SW50OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSTE2IDogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRJMzIgOiBMb25nSW50OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSTY0IDogSW50NjQ7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWREb3VibGUgOiBEb3VibGU7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05Eb3VibGU7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cmluZyA6IHN0cmluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRCaW5hcnkgOiBUQnl0ZXM7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05CYXNlNjQ7CitlbmQ7CisKKworLy8tLS0gaW5pdCBjb2RlIC0tLQorCitwcm9jZWR1cmUgSW5pdEJ5dGVzKCB2YXIgYiA6IFRCeXRlczsgYURhdGEgOiBhcnJheSBvZiBCeXRlKTsKK2JlZ2luCisgIFNldExlbmd0aCggYiwgTGVuZ3RoKGFEYXRhKSk7CisgIE1vdmUoIGFEYXRhLCBiWzBdLCBMZW5ndGgoYikpOworZW5kOworCitpbml0aWFsaXphdGlvbgorICBJbml0Qnl0ZXMoIENPTU1BLCAgICAgW0J5dGUoJywnKV0pOworICBJbml0Qnl0ZXMoIENPTE9OLCAgICAgW0J5dGUoJzonKV0pOworICBJbml0Qnl0ZXMoIExCUkFDRSwgICAgW0J5dGUoJ3snKV0pOworICBJbml0Qnl0ZXMoIFJCUkFDRSwgICAgW0J5dGUoJ30nKV0pOworICBJbml0Qnl0ZXMoIExCUkFDS0VULCAgW0J5dGUoJ1snKV0pOworICBJbml0Qnl0ZXMoIFJCUkFDS0VULCAgW0J5dGUoJ10nKV0pOworICBJbml0Qnl0ZXMoIFFVT1RFLCAgICAgW0J5dGUoJyInKV0pOworICBJbml0Qnl0ZXMoIEJBQ0tTTEFTSCwgW0J5dGUoJ1wnKV0pOworICBJbml0Qnl0ZXMoIEVTQ1NFUSwgICAgW0J5dGUoJ1wnKSxCeXRlKCd1JyksQnl0ZSgnMCcpLEJ5dGUoJzAnKV0pOworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EzODM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKQEAgLTAsMCArMSwxMDcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4OworCitpbnRlcmZhY2UKKwordXNlcyBUaHJpZnQuUHJvdG9jb2w7CisKK3sgVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAgdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKworICBOT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuCisgIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3RzIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorCisgIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKworICAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICB0cmFuc3BvcnQub3BlbigpOworCisgICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisKKyAgICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKworfQorCit0eXBlCisgIFRNdWx0aXBsZXhlZFByb3RvY29sID0gY2xhc3MoIFRQcm90b2NvbERlY29yYXRvcikKKyAgcHVibGljIGNvbnN0CisgICAgeyAgVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSB9CisgICAgU0VQQVJBVE9SID0gJzonOworCisgIHByaXZhdGUKKyAgICAgRlNlcnZpY2VOYW1lIDogU3RyaW5nOworCisgIHB1YmxpYworICAgIHsgV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgc2VydmVyLgorICAgICAgVGhlIHNlcnZpY2VOYW1lIGlzIHJlcXVpcmVkIGFzIGl0IGlzIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nCisgICAgICBzZXJ2ZXIgY2FuIGJyb2tlciB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisKKyAgICAgIEFyZ3M6CisgICAgICAgIHByb3RvY29sIC4uLi4uLi4gWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiBUQmluYXJ5UHJvdG9jb2wuCisgICAgICAgIHNlcnZpY2VOYW1lIC4uLi4gVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgIH0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYVNlcnZpY2VOYW1lIDogc3RyaW5nKTsKKworICAgIHsgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFNFUEFSQVRPUi4KKyAgICAgIEFyZ3M6IFRoZSBvcmlnaW5hbCBtZXNzYWdlLgorICAgIH0KKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvdG9jb2wuQ3JlYXRlKGNvbnN0IGFQcm90b2NvbDogSVByb3RvY29sOyBjb25zdCBhU2VydmljZU5hbWU6IHN0cmluZyk7CitiZWdpbgorICBBU1NFUlQoIGFTZXJ2aWNlTmFtZSA8PiAnJyk7CisgIGluaGVyaXRlZCBDcmVhdGUoYVByb3RvY29sKTsKKyAgRlNlcnZpY2VOYW1lIDo9IGFTZXJ2aWNlTmFtZTsKK2VuZDsKKworCitwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOworLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KK3ZhciBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIGNhc2UgbXNnLlR5cGVfIG9mCisgICAgVE1lc3NhZ2VUeXBlLkNhbGwsCisgICAgVE1lc3NhZ2VUeXBlLk9uZXdheSA6IGJlZ2luCisgICAgICBJbml0KCBuZXdNc2csIEZTZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG1zZy5OYW1lLCBtc2cuVHlwZV8sIG1zZy5TZXFJRCk7CisgICAgICBpbmhlcml0ZWQgV3JpdGVNZXNzYWdlQmVnaW4oIG5ld01zZyk7CisgICAgZW5kOworCisgIGVsc2UKKyAgICBpbmhlcml0ZWQgV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTA5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCkBAIC0wLDAgKzEsMTM4OSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit7JFNDT1BFREVOVU1TIE9OfQorCit1bml0IFRocmlmdC5Qcm90b2NvbDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIENvbnRucnMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5TdHJlYW0sCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydDsKKwordHlwZQorCisgIFRUeXBlID0gKAorICAgIFN0b3AgPSAwLAorICAgIFZvaWQgPSAxLAorICAgIEJvb2xfID0gMiwKKyAgICBCeXRlXyA9IDMsCisgICAgRG91YmxlXyA9IDQsCisgICAgSTE2ID0gNiwKKyAgICBJMzIgPSA4LAorICAgIEk2NCA9IDEwLAorICAgIFN0cmluZ18gPSAxMSwKKyAgICBTdHJ1Y3QgPSAxMiwKKyAgICBNYXAgPSAxMywKKyAgICBTZXRfID0gMTQsCisgICAgTGlzdCA9IDE1CisgICk7CisKKyAgVE1lc3NhZ2VUeXBlID0gKAorICAgIENhbGwgPSAxLAorICAgIFJlcGx5ID0gMiwKKyAgICBFeGNlcHRpb24gPSAzLAorICAgIE9uZXdheSA9IDQKKyAgKTsKKworY29uc3QKKyAgVkFMSURfVFRZUEVTID0gWworICAgIFRUeXBlLlN0b3AsIFRUeXBlLlZvaWQsCisgICAgVFR5cGUuQm9vbF8sIFRUeXBlLkJ5dGVfLCBUVHlwZS5Eb3VibGVfLCBUVHlwZS5JMTYsIFRUeXBlLkkzMiwgVFR5cGUuSTY0LCBUVHlwZS5TdHJpbmdfLAorICAgIFRUeXBlLlN0cnVjdCwgVFR5cGUuTWFwLCBUVHlwZS5TZXRfLCBUVHlwZS5MaXN0CisgIF07CisKKyAgVkFMSURfTUVTU0FHRVRZUEVTID0gW0xvdyhUTWVzc2FnZVR5cGUpLi5IaWdoKFRNZXNzYWdlVHlwZSldOworCitjb25zdAorICBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCA9IDY0OworCit0eXBlCisgIElQcm90b2NvbCA9IGludGVyZmFjZTsKKworICBUVGhyaWZ0TWVzc2FnZSA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgICBUeXBlXzogVE1lc3NhZ2VUeXBlOworICAgIFNlcUlEOiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdFN0cnVjdCA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgZW5kOworCisgIFRUaHJpZnRGaWVsZCA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgICBUeXBlXzogVFR5cGU7CisgICAgSWQ6IFNtYWxsSW50OworICBlbmQ7CisKKyAgVFRocmlmdExpc3QgPSByZWNvcmQKKyAgICBFbGVtZW50VHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0TWFwID0gcmVjb3JkCisgICAgS2V5VHlwZTogVFR5cGU7CisgICAgVmFsdWVUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTZXQgPSByZWNvcmQKKyAgICBFbGVtZW50VHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworCisKKyAgSVByb3RvY29sRmFjdG9yeSA9IGludGVyZmFjZQorICAgIFsnezdDRDY0QTEwLTRFOUYtNEU5OS05M0JGLTcwOEEzMUY0QTY3Qn0nXQorICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJpbmdCdWlsZGVyID0gY2xhc3MoIFRTdHJpbmdCdWlsZGVyKQorICBwdWJsaWMKKyAgICBmdW5jdGlvbiBBcHBlbmQoY29uc3QgVmFsdWU6IFRCeXRlcyk6IFRTdHJpbmdCdWlsZGVyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBBcHBlbmQoY29uc3QgVmFsdWU6IElUaHJpZnRDb250YWluZXIpOiBUU3RyaW5nQnVpbGRlcjsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICBUUHJvdG9jb2xFeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3QgLy8gVE9ETyhqZW5zZyk6IGNoYW5nZSBpbnRvIGVudW0KKyAgICAgIFVOS05PV04gPSAwOworICAgICAgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgIE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgU0laRV9MSU1JVCA9IDM7CisgICAgICBCQURfVkVSU0lPTiA9IDQ7CisgICAgICBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgREVQVEhfTElNSVQgPSA2OworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBwdWJsaWMKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgZW5kOworCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCA9IGNsYXNzIGFic3RyYWN0IChUUHJvdG9jb2xFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25TaXplTGltaXQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKworCisgIFRQcm90b2NvbFV0aWwgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOworICBlbmQ7CisKKyAgSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlciA9IGludGVyZmFjZQorICAgIFsnezI5Q0EwMzNGLUJCNTYtNDlCMS05RUUzLTMxQjFFODJGQzdBNX0nXQorICAgIC8vIG5vIG1lbWJlcnMgeWV0CisgIGVuZDsKKworICBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcikKKyAgcHJvdGVjdGVkCisgICAgRlByb3RvY29sIDogSVByb3RvY29sOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3QgOiBJUHJvdG9jb2wpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJUHJvdG9jb2wgPSBpbnRlcmZhY2UKKyAgICBbJ3s2MDJBN0ZGQi0wRDlFLTRDRDgtOEQ3Ri1FNTA3NjY2MDU4OEF9J10KKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7CisKKyAgICBwcm9jZWR1cmUgU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIEdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKKyAgICBwcm9jZWR1cmUgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgcHJvY2VkdXJlIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworCisgICAgcHJvcGVydHkgVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VHJhbnNwb3J0OworICAgIHByb3BlcnR5IFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlciByZWFkIEdldFJlY3Vyc2lvbkxpbWl0IHdyaXRlIFNldFJlY3Vyc2lvbkxpbWl0OworICBlbmQ7CisKKyAgVFByb3RvY29sSW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sKQorICBwcm90ZWN0ZWQKKyAgICBGVHJhbnMgOiBJVHJhbnNwb3J0OworICAgIEZSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgRlJlY3Vyc2lvbkRlcHRoIDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBTZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiAgR2V0UmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uICBOZXh0UmVjdXJzaW9uTGV2ZWwgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworICAgIHByb2NlZHVyZSBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgICBwcm9jZWR1cmUgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CisKKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IHZpcnR1YWw7IGFic3RyYWN0OworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOyB2aXJ0dWFsOworCisgICAgcHJvcGVydHkgVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VHJhbnNwb3J0OworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCB0cmFuczogSVRyYW5zcG9ydCApOworICBlbmQ7CisKKyAgSUJhc2UgPSBpbnRlcmZhY2UKKyAgICBbJ3swOEQ5QkFBOC01RUFBLTQxMEYtQjUwQi1BQzJFNkU1RTQxNTV9J10KKyAgICBmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOworICAgIHByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOworICBlbmQ7CisKKworICBUQmluYXJ5UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwgKQorICBwcm90ZWN0ZWQKKyAgICBjb25zdAorICAgICAgVkVSU0lPTl9NQVNLIDogQ2FyZGluYWwgPSAkZmZmZjAwMDA7CisgICAgICBWRVJTSU9OXzEgOiBDYXJkaW5hbCA9ICQ4MDAxMDAwMDsKKyAgcHJvdGVjdGVkCisgICAgRlN0cmljdFJlYWQgOiBCb29sZWFuOworICAgIEZTdHJpY3RXcml0ZSA6IEJvb2xlYW47CisKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIFJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOyAgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOworCisgIHB1YmxpYworCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbEZhY3RvcnkpCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgRlN0cmljdFJlYWQgOiBCb29sZWFuOworICAgICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOworICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBU3RyaWN0UmVhZCwgQVN0cmljdFdyaXRlOiBCb29sZWFuICk7IG92ZXJsb2FkOworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgICAgZW5kOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQ7IHN0cmljdFJlYWQ6IEJvb2xlYW47IHN0cmljdFdyaXRlOiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVycmlkZTsKKworICBlbmQ7CisKKworICB7IFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAorICAgIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gVGhlIGRlY29yYXRvcgorICAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbAorCisgICAgU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICB9CisgIFRQcm90b2NvbERlY29yYXRvciA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsKQorICBwcml2YXRlCisgICAgRldyYXBwZWRQcm90b2NvbCA6IElQcm90b2NvbDsKKworICBwdWJsaWMKKyAgICAvLyBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgIC8vIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sKTsKKworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisKK3R5cGUKKyAgSVJlcXVlc3RFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3tGOTI2QTI2QS01QjAwLTQ1NjAtODZGQS0yQ0FFM0JBNzNEQUZ9J10KKyAgICAvLyBDYWxsZWQgYmVmb3JlIHJlYWRpbmcgYXJndW1lbnRzLgorICAgIHByb2NlZHVyZSBQcmVSZWFkOworICAgIC8vIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgorICAgIHByb2NlZHVyZSBQb3N0UmVhZDsKKyAgICAvLyBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICBwcm9jZWR1cmUgUHJlV3JpdGU7CisgICAgLy8gQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgIHByb2NlZHVyZSBQb3N0V3JpdGU7CisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gb25ld2F5IChhc3luYykgZnVuY3Rpb24gY2FsbCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorICAgIHByb2NlZHVyZSBPbmV3YXlDb21wbGV0ZTsKKyAgICAvLyBDYWxsZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uLgorICAgIHByb2NlZHVyZSBVbmhhbmRsZWRFcnJvciggY29uc3QgZSA6IEV4Y2VwdGlvbik7CisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gY2xlYW4gdXAKKyAgICBwcm9jZWR1cmUgQ2xlYW51cENvbnRleHQ7CisgIGVuZDsKKworCisgIElQcm9jZXNzb3JFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3tBODY2MTExOS02NTdDLTQ0N0QtOTNDNS01MTJFMzYxNjJBNDV9J10KKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAgcHJvY2VkdXJlIFByb2Nlc3NpbmcoIGNvbnN0IHRyYW5zcG9ydCA6IElUcmFuc3BvcnQpOworICAgIC8vIENhbGxlZCBvbiBhbnkgc2VydmljZSBmdW5jdGlvbiBpbnZvY2F0aW9uCisgICAgZnVuY3Rpb24gIENyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lIDogc3RyaW5nKSA6IElSZXF1ZXN0RXZlbnRzOworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGNsZWFuIHVwCisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBlbmQ7CisKKworICBJUHJvY2Vzc29yID0gaW50ZXJmYWNlCisgICAgWyd7N0JBRTkyQTUtNDZEQS00RjEzLUI2RUEtMEVBQkUyMzNFRTVGfSddCisgICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QgOklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47CisgIGVuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlID0gTG93KFRNZXNzYWdlVHlwZSk7IGNvbnN0IEFTZXFJRDogSW50ZWdlciA9IDApOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7ICBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgICBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFJRDogU21hbGxJbnQgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyAgICAgY29uc3QgQUtleVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQVZhbHVlVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7ICAgICBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKKworCitpbXBsZW1lbnRhdGlvbgorCitmdW5jdGlvbiBDb252ZXJ0SW50NjRUb0RvdWJsZSggY29uc3QgbjogSW50NjQpOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihuKSA9IFNpemVPZihSZXN1bHQpKTsKKyAgU3lzdGVtLk1vdmUoIG4sIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOworZW5kOworCitmdW5jdGlvbiBDb252ZXJ0RG91YmxlVG9JbnQ2NCggY29uc3QgZDogRG91YmxlKTogSW50NjQ7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihkKSA9IFNpemVPZihSZXN1bHQpKTsKKyAgU3lzdGVtLk1vdmUoIGQsIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOworZW5kOworCisKKworeyBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsLkNyZWF0ZSggcHJvdCA6IElQcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworCisgIC8vIHN0b3JpbmcgdGhlIHBvaW50ZXIgKmFmdGVyKiB0aGUgKHN1Y2Nlc3NmdWwpIGluY3JlbWVudCBpcyBpbXBvcnRhbnQgaGVyZQorICBwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICBGUHJvdG9jb2wgOj0gcHJvdDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgLy8gd2UgaGF2ZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgaWZmIHRoZSBwb2ludGVyIGhhcyBiZWVuIHN0b3JlZAorICAgIGlmIEZQcm90b2NvbCA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgICAgRlByb3RvY29sIDo9IG5pbDsKKyAgICBlbmQ7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCit7IFRQcm90b2NvbEltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xJbXBsLkNyZWF0ZSh0cmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVHJhbnMgOj0gdHJhbnM7CisgIEZSZWN1cnNpb25MaW1pdCA6PSBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVDsKKyAgRlJlY3Vyc2lvbkRlcHRoIDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLlNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworYmVnaW4KKyAgRlJlY3Vyc2lvbkxpbWl0IDo9IHZhbHVlOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLkdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGUmVjdXJzaW9uTGltaXQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5DcmVhdGUoU2VsZik7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworYmVnaW4KKyAgaWYgRlJlY3Vyc2lvbkRlcHRoIDwgRlJlY3Vyc2lvbkxpbWl0CisgIHRoZW4gSW5jKEZSZWN1cnNpb25EZXB0aCkKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZSgnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CitiZWdpbgorICBEZWMoRlJlY3Vyc2lvbkRlcHRoKQorZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLkdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7Cit2YXIKKyAgYiA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAnJzsKKyAgYiA6PSBSZWFkQmluYXJ5OworICBsZW4gOj0gTGVuZ3RoKCBiICk7CisgIGlmIGxlbiA+IDAgdGhlbgorICBiZWdpbgorICAgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOworICAgIFN5c3RlbS5Nb3ZlKCBiWzBdLCBQb2ludGVyKFJlc3VsdCleLCBsZW4gKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLlJlYWRTdHJpbmc6IHN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRCaW5hcnkgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuV3JpdGVBbnNpU3RyaW5nKGNvbnN0IHM6IEFuc2lTdHJpbmcpOwordmFyCisgIGIgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gTGVuZ3RoKHMpOworICBTZXRMZW5ndGgoIGIsIGxlbik7CisgIGlmIGxlbiA+IDAgdGhlbgorICBiZWdpbgorICAgIFN5c3RlbS5Nb3ZlKCBQb2ludGVyKHMpXiwgYlswXSwgbGVuICk7CisgIGVuZDsKKyAgV3JpdGVCaW5hcnkoIGIgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuV3JpdGVTdHJpbmcoY29uc3Qgczogc3RyaW5nKTsKK3ZhcgorICBiIDogVEJ5dGVzOworYmVnaW4KKyAgYiA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgV3JpdGVCaW5hcnkoIGIgKTsKK2VuZDsKKworeyBUUHJvdG9jb2xVdGlsIH0KKworY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwordmFyIGZpZWxkIDogVFRocmlmdEZpZWxkOworICAgIG1hcCAgIDogVFRocmlmdE1hcDsKKyAgICBzZXRfICA6IFRUaHJpZnRTZXQ7CisgICAgbGlzdCAgOiBUVGhyaWZ0TGlzdDsKKyAgICBpICAgICA6IEludGVnZXI7CisgICAgdHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CitiZWdpbgorICB0cmFja2VyIDo9IHByb3QuTmV4dFJlY3Vyc2lvbkxldmVsOworICBjYXNlIHR5cGVfIG9mCisgICAgLy8gc2ltcGxlIHR5cGVzCisgICAgVFR5cGUuQm9vbF8gICA6ICBwcm90LlJlYWRCb29sKCk7CisgICAgVFR5cGUuQnl0ZV8gICA6ICBwcm90LlJlYWRCeXRlKCk7CisgICAgVFR5cGUuSTE2ICAgICA6ICBwcm90LlJlYWRJMTYoKTsKKyAgICBUVHlwZS5JMzIgICAgIDogIHByb3QuUmVhZEkzMigpOworICAgIFRUeXBlLkk2NCAgICAgOiAgcHJvdC5SZWFkSTY0KCk7CisgICAgVFR5cGUuRG91YmxlXyA6ICBwcm90LlJlYWREb3VibGUoKTsKKyAgICBUVHlwZS5TdHJpbmdfIDogIHByb3QuUmVhZEJpbmFyeSgpOy8vIERvbid0IHRyeSB0byBkZWNvZGUgdGhlIHN0cmluZywganVzdCBza2lwIGl0LgorCisgICAgLy8gc3RydWN0dXJlZCB0eXBlcworICAgIFRUeXBlLlN0cnVjdCA6ICBiZWdpbgorICAgICAgcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgICAgZmllbGQgOj0gcHJvdC5SZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZmllbGQuVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuIEJyZWFrOworICAgICAgICBTa2lwKHByb3QsIGZpZWxkLlR5cGVfKTsKKyAgICAgICAgcHJvdC5SZWFkRmllbGRFbmQoKTsKKyAgICAgIGVuZDsKKyAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLk1hcCA6ICBiZWdpbgorICAgICAgbWFwIDo9IHByb3QuUmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgaSA6PSAwIHRvIG1hcC5Db3VudC0xIGRvIGJlZ2luCisgICAgICAgIFNraXAocHJvdCwgbWFwLktleVR5cGUpOworICAgICAgICBTa2lwKHByb3QsIG1hcC5WYWx1ZVR5cGUpOworICAgICAgZW5kOworICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7CisgICAgZW5kOworCisgICAgVFR5cGUuU2V0XyA6ICBiZWdpbgorICAgICAgc2V0XyA6PSBwcm90LlJlYWRTZXRCZWdpbigpOworICAgICAgZm9yIGkgOj0gMCB0byBzZXRfLkNvdW50LTEKKyAgICAgIGRvIFNraXAoIHByb3QsIHNldF8uRWxlbWVudFR5cGUpOworICAgICAgcHJvdC5SZWFkU2V0RW5kKCk7CisgICAgZW5kOworCisgICAgVFR5cGUuTGlzdCA6ICBiZWdpbgorICAgICAgbGlzdCA6PSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciBpIDo9IDAgdG8gbGlzdC5Db3VudC0xCisgICAgICBkbyBTa2lwKCBwcm90LCBsaXN0LkVsZW1lbnRUeXBlKTsKKyAgICAgIHByb3QuUmVhZExpc3RFbmQoKTsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCB0eXBlICcrSW50VG9TdHIoT3JkKHR5cGVfKSkpOworICBlbmQ7CitlbmQ7CisKKworeyBUQmluYXJ5UHJvdG9jb2xJbXBsIH0KKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkCisgIENyZWF0ZSggdHJhbnMsIEZhbHNlLCBUcnVlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkLAorICBzdHJpY3RXcml0ZTogQm9vbGVhbik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCB0cmFucyApOworICBGU3RyaWN0UmVhZCA6PSBzdHJpY3RSZWFkOworICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zLlJlYWRBbGwoIHBCdWYsIGJ1Zmxlbiwgb2ZmLCBsZW4gKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQmluYXJ5OiBUQnl0ZXM7Cit2YXIKKyAgc2l6ZSA6IEludGVnZXI7CisgIGJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIHNpemUgOj0gUmVhZEkzMjsKKyAgU2V0TGVuZ3RoKCBidWYsIHNpemUgKTsKKyAgRlRyYW5zLlJlYWRBbGwoIGJ1ZiwgMCwgc2l6ZSk7CisgIFJlc3VsdCA6PSBidWY7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJvb2w6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gKFJlYWRCeXRlID0gMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJ5dGU6IFNob3J0SW50OworYmVnaW4KKyAgUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWREb3VibGU6IERvdWJsZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBDb252ZXJ0SW50NjRUb0RvdWJsZSggUmVhZEk2NCApCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCwgJycsIFRUeXBlKCBSZWFkQnl0ZSksIDApOworICBpZiAoIHJlc3VsdC5UeXBlXyA8PiBUVHlwZS5TdG9wICkgdGhlbiBiZWdpbgorICAgIHJlc3VsdC5JZCA6PSBSZWFkSTE2OworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkSTE2OiBTbWFsbEludDsKK3ZhciBpMTZpbiA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOworYmVnaW4KKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKKyAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOworYmVnaW4KKyAgUmVhZEFsbCggQGkzMmluLCBTaXplT2YoaTMyaW4pLCAwLCA0KTsKKworICBSZXN1bHQgOj0gSW50ZWdlcigKKyAgICAoKGkzMmluWzBdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAoKGkzMmluWzFdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAoKGkzMmluWzJdIGFuZCAkRkYpIHNobCA4KSBvcgorICAgICAoaTMyaW5bM10gYW5kICRGRikpOworCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEk2NDogSW50NjQ7Cit2YXIgaTY0aW4gOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpNjRpbiwgU2l6ZU9mKGk2NGluKSwgMCwgOCk7CisgIFJlc3VsdCA6PQorICAgIChJbnQ2NCggaTY0aW5bMF0gYW5kICRGRikgc2hsIDU2KSBvcgorICAgIChJbnQ2NCggaTY0aW5bMV0gYW5kICRGRikgc2hsIDQ4KSBvcgorICAgIChJbnQ2NCggaTY0aW5bMl0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgIChJbnQ2NCggaTY0aW5bM10gYW5kICRGRikgc2hsIDMyKSBvcgorICAgIChJbnQ2NCggaTY0aW5bNF0gYW5kICRGRikgc2hsIDI0KSBvcgorICAgIChJbnQ2NCggaTY0aW5bNV0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgIChJbnQ2NCggaTY0aW5bNl0gYW5kICRGRikgc2hsIDgpIG9yCisgICAgKEludDY0KCBpNjRpbls3XSBhbmQgJEZGKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CitiZWdpbgorICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOworYmVnaW4KKyAgcmVzdWx0LktleVR5cGUgICA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgIDo9IFJlYWRJMzI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7Cit2YXIKKyAgc2l6ZSA6IEludGVnZXI7CisgIHZlcnNpb24gOiBJbnRlZ2VyOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgc2l6ZSA6PSBSZWFkSTMyOworICBpZiAoc2l6ZSA8IDApIHRoZW4gYmVnaW4KKyAgICB2ZXJzaW9uIDo9IHNpemUgYW5kIEludGVnZXIoIFZFUlNJT05fTUFTSyk7CisgICAgaWYgKCB2ZXJzaW9uIDw+IEludGVnZXIoIFZFUlNJT05fMSkpIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAnICsgSW50VG9TdHIodmVyc2lvbikgKTsKKyAgICBlbmQ7CisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8nICk7CisgICAgZW5kOworICAgIHJlc3VsdC5OYW1lIDo9IFJlYWRTdHJpbmdCb2R5KCBzaXplICk7CisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEJ5dGUgKTsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKK2JlZ2luCisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0RW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOwordmFyCisgIGJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggYnVmLCBzaXplICk7CisgIEZUcmFucy5SZWFkQWxsKCBidWYsIDAsIHNpemUgKTsKKyAgUmVzdWx0IDo9IFRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggYnVmKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CitiZWdpbgorICBJbml0KCBSZXN1bHQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOworYmVnaW4KKyAgaW5oZXJpdGVkOworCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwordmFyIGlMZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgaUxlbiA6PSBMZW5ndGgoYik7CisgIFdyaXRlSTMyKCBpTGVuKTsKKyAgaWYgaUxlbiA+IDAgdGhlbiBGVHJhbnMuV3JpdGUoYiwgMCwgaUxlbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQm9vbChiOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIGIgdGhlbiBiZWdpbgorICAgIFdyaXRlQnl0ZSggMSApOworICBlbmQgZWxzZSBiZWdpbgorICAgIFdyaXRlQnl0ZSggMCApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQnl0ZShiOiBTaG9ydEludCk7CitiZWdpbgorICBGVHJhbnMuV3JpdGUoIEBiLCAwLCAxKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CitiZWdpbgorICBXcml0ZUk2NChDb252ZXJ0RG91YmxlVG9JbnQ2NChkKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoZmllbGQuVHlwZV8pKTsKKyAgV3JpdGVJMTYoZmllbGQuSUQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChUVHlwZS5TdG9wKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTE2KGkxNjogU21hbGxJbnQpOwordmFyIGkxNm91dCA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOworYmVnaW4KKyAgaTE2b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTE2IHNociA4KSk7CisgIGkxNm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgaTE2KTsKKyAgRlRyYW5zLldyaXRlKCBAaTE2b3V0LCAwLCAyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMzIoaTMyOiBJbnRlZ2VyKTsKK3ZhciBpMzJvdXQgOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKK2JlZ2luCisgIGkzMm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMjQpKTsKKyAgaTMyb3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAxNikpOworICBpMzJvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDgpKTsKKyAgaTMyb3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCBpMzIpOworICBGVHJhbnMuV3JpdGUoIEBpMzJvdXQsIDAsIDQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7Cit2YXIgaTY0b3V0IDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CitiZWdpbgorICBpNjRvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDU2KSk7CisgIGk2NG91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDgpKTsKKyAgaTY0b3V0WzJdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA0MCkpOworICBpNjRvdXRbM10gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDMyKSk7CisgIGk2NG91dFs0XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMjQpKTsKKyAgaTY0b3V0WzVdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAxNikpOworICBpNjRvdXRbNl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDgpKTsKKyAgaTY0b3V0WzddIDo9IEJ5dGUoJEZGIGFuZCBpNjQpOworICBGVHJhbnMuV3JpdGUoIEBpNjRvdXQsIDAsIDgpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KGxpc3QuRWxlbWVudFR5cGUpKTsKKyAgV3JpdGVJMzIobGlzdC5Db3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChtYXAuS2V5VHlwZSkpOworICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLlZhbHVlVHlwZSkpOworICBXcml0ZUkzMihtYXAuQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwordmFyCisgIHZlcnNpb24gOiBDYXJkaW5hbDsKK2JlZ2luCisgIGlmIEZTdHJpY3RXcml0ZSB0aGVuCisgIGJlZ2luCisgICAgdmVyc2lvbiA6PSBWRVJTSU9OXzEgb3IgQ2FyZGluYWwoIG1zZy5UeXBlXyk7CisgICAgV3JpdGVJMzIoIEludGVnZXIoIHZlcnNpb24pICk7CisgICAgV3JpdGVTdHJpbmcoIG1zZy5OYW1lKTsKKyAgICBXcml0ZUkzMiggbXNnLlNlcUlEKTsKKyAgZW5kIGVsc2UKKyAgYmVnaW4KKyAgICBXcml0ZVN0cmluZyggbXNnLk5hbWUpOworICAgIFdyaXRlQnl0ZShTaG9ydEludCggbXNnLlR5cGVfKSk7CisgICAgV3JpdGVJMzIoIG1zZy5TZXFJRCk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChzZXRfLkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSTMyKHNldF8uQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisKK2VuZDsKKworeyBUUHJvdG9jb2xFeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUodHlwZV8sICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIGNhc2UgdHlwZV8gb2YKKyAgICBJTlZBTElEX0RBVEE6ICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUobXNnKTsKKyAgICBORUdBVElWRV9TSVpFOiAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUuQ3JlYXRlKG1zZyk7CisgICAgU0laRV9MSU1JVDogICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0LkNyZWF0ZShtc2cpOworICAgIEJBRF9WRVJTSU9OOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKG1zZyk7CisgICAgTk9UX0lNUExFTUVOVEVEOiBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKG1zZyk7CisgICAgREVQVEhfTElNSVQ6ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShtc2cpOworICBlbmQ7CitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOworZW5kOworCit7IFRUaHJpZnRTdHJpbmdCdWlsZGVyIH0KKworZnVuY3Rpb24gVFRocmlmdFN0cmluZ0J1aWxkZXIuQXBwZW5kKGNvbnN0IFZhbHVlOiBUQnl0ZXMpOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBBcHBlbmQoIHN0cmluZyggUmF3Qnl0ZVN0cmluZyhWYWx1ZSkpICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZCgKKyAgY29uc3QgVmFsdWU6IElUaHJpZnRDb250YWluZXIpOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBBcHBlbmQoIFZhbHVlLlRvU3RyaW5nICk7CitlbmQ7CisKK3sgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeSB9CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKEFTdHJpY3RSZWFkLCBBU3RyaWN0V3JpdGU6IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmljdFJlYWQgOj0gQVN0cmljdFJlYWQ7CisgIEZTdHJpY3RXcml0ZSA6PSBBU3RyaWN0V3JpdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggRmFsc2UsIFRydWUgKQorZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMsIEZTdHJpY3RSZWFkLCBGU3RyaWN0V3JpdGUpOworZW5kOworCisKK3sgVFByb3RvY29sRGVjb3JhdG9yIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRGVjb3JhdG9yLkNyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sKTsKK2JlZ2luCisgIEFTU0VSVCggYVByb3RvY29sIDw+IG5pbCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFQcm90b2NvbC5UcmFuc3BvcnQpOworICBGV3JhcHBlZFByb3RvY29sIDo9IGFQcm90b2NvbDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKCBmaWVsZCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRTdG9wOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbiggbWFwKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmQoKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbiggc2V0Xyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEVuZCgpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVCb29sKCBiKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGUoIGIpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUkxNiggaTE2KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTMyKCBpMzI6IEludGVnZXIpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMiggaTMyKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJNjQoIGk2NCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVEb3VibGUoIGQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyggcyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUFuc2lTdHJpbmcoIHMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5KCBiKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRNYXBFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCb29sOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEJvb2w7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCeXRlOiBTaG9ydEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCeXRlOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTE2OiBTbWFsbEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRJMTY7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTMyOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRJNjQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWREb3VibGU6RG91YmxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEJpbmFyeTogVEJ5dGVzOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cmluZzogc3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZzsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQW5zaVN0cmluZzsKK2VuZDsKKworCit7IEluaXQgaGVscGVyIGZ1bmN0aW9ucyB9CisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1lc3NhZ2U7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBjb25zdCBBU2VxSUQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBTWVzc2FnZVR5cGU7CisgIHJlYy5TZXFJRCA6PSBBU2VxSUQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsgY29uc3QgQUlEOiBTbWFsbEludCk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFUeXBlOworICByZWMuSWQgOj0gQUlkOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgY29uc3QgQUtleVR5cGUsIEFWYWx1ZVR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLlZhbHVlVHlwZSA6PSBBVmFsdWVUeXBlOworICByZWMuS2V5VHlwZSA6PSBBS2V5VHlwZTsKKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjkwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKQEAgLTAsMCArMSwyMzAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlNlcmlhbGl6ZXI7CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK2ludGVyZmFjZQorCit1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFN5c3RlbS5DbGFzc2VzLCBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLAorICB7JEVORElGfQorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5TdHJlYW07CisKKwordHlwZQorICAvLyBHZW5lcmljIHV0aWxpdHkgZm9yIGVhc2lseSBzZXJpYWxpemluZyBvYmplY3RzIGludG8gYSBieXRlIGFycmF5IG9yIFN0cmVhbS4KKyAgVFNlcmlhbGl6ZXIgPSBjbGFzcworICBwcml2YXRlCisgICAgRlN0cmVhbSAgICA6IFRNZW1vcnlTdHJlYW07CisgICAgRlRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgRlByb3RvY29sICA6IElQcm90b2NvbDsKKworICBwdWJsaWMKKyAgICAvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7ICBvdmVybG9hZDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplci4KKyAgICAvLyBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOworCisgICAgLy8gRFRPUgorICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgLy8gU2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0LgorICAgIGZ1bmN0aW9uICBTZXJpYWxpemUoIGNvbnN0IGlucHV0IDogSUJhc2UpIDogVEJ5dGVzOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgYVN0bSA6IFRTdHJlYW0pOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIC8vIEdlbmVyaWMgdXRpbGl0eSBmb3IgZWFzaWx5IGRlc2VyaWFsaXppbmcgb2JqZWN0cyBmcm9tIGJ5dGUgYXJyYXkgb3IgU3RyZWFtLgorICBURGVzZXJpYWxpemVyID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gICAgOiBUTWVtb3J5U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZQcm90b2NvbCAgOiBJUHJvdG9jb2w7CisKKyAgcHVibGljCisgICAgLy8gQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7ICBvdmVybG9hZDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyLgorICAgIC8vIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBEVE9SCisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBkYXRhLgorICAgIHByb2NlZHVyZSBEZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBEZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7ICBvdmVybG9hZDsKKyAgZW5kOworCisKKworaW1wbGVtZW50YXRpb24KKworCit7IFRTZXJpYWxpemVyIH0KKworCitjb25zdHJ1Y3RvciBUU2VyaWFsaXplci5DcmVhdGUoKTsKKy8vIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRTZXJpYWxpemVyLkNyZWF0ZSggY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOworLy8gQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyLgorLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCit2YXIgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtICAgIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBhZGFwdGVyICAgIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggRlN0cmVhbSwgRkFMU0UpOworICBGVHJhbnNwb3J0IDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggbmlsLCBhZGFwdGVyKTsKKyAgRlByb3RvY29sICA6PSBmYWN0b3J5LkdldFByb3RvY29sKCBGVHJhbnNwb3J0KTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTZXJpYWxpemVyLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGUHJvdG9jb2wgIDo9IG5pbDsKKyAgICBGVHJhbnNwb3J0IDo9IG5pbDsKKyAgICBGcmVlQW5kTmlsKCBGU3RyZWFtKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFNlcmlhbGl6ZXIuU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlKSA6IFRCeXRlczsKKy8vIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBpbnRvIGEgYnl0ZSBhcnJheS4gVGhlIHByb2Nlc3MgaXMgc2ltcGxlLAorLy8ganVzdCBjbGVhciB0aGUgYnl0ZSBhcnJheSBvdXRwdXQsIHdyaXRlIHRoZSBvYmplY3QgaW50byBpdCwgYW5kIGdyYWIgdGhlCisvLyByYXcgYnl0ZXMuCit2YXIgaUJ5dGVzIDogSW50NjQ7CitiZWdpbgorICB0cnkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsKKyAgICBpbnB1dC5Xcml0ZSggRlByb3RvY29sKTsKKyAgICBTZXRMZW5ndGgoIHJlc3VsdCwgRlN0cmVhbS5TaXplKTsKKyAgICBpQnl0ZXMgOj0gTGVuZ3RoKHJlc3VsdCk7CisgICAgaWYgaUJ5dGVzID4gMAorICAgIHRoZW4gTW92ZSggRlN0cmVhbS5NZW1vcnleLCByZXN1bHRbMF0sIGlCeXRlcyk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUU2VyaWFsaXplci5TZXJpYWxpemUoIGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGFTdG0gOiBUU3RyZWFtKTsKKy8vIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBpbnRvIGEgYnl0ZSBhcnJheS4gVGhlIHByb2Nlc3MgaXMgc2ltcGxlLAorLy8ganVzdCBjbGVhciB0aGUgYnl0ZSBhcnJheSBvdXRwdXQsIHdyaXRlIHRoZSBvYmplY3QgaW50byBpdCwgYW5kIGdyYWIgdGhlCisvLyByYXcgYnl0ZXMuCitjb25zdCBDT1BZX0VOVElSRV9TVFJFQU0gPSAwOworYmVnaW4KKyAgdHJ5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7CisgICAgaW5wdXQuV3JpdGUoIEZQcm90b2NvbCk7CisgICAgYVN0bS5Db3B5RnJvbSggRlN0cmVhbSwgQ09QWV9FTlRJUkVfU1RSRUFNKTsKKyAgZmluYWxseQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOyAgLy8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeQorICBlbmQ7CitlbmQ7CisKKworeyBURGVzZXJpYWxpemVyIH0KKworCitjb25zdHJ1Y3RvciBURGVzZXJpYWxpemVyLkNyZWF0ZSgpOworLy8gQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBURGVzZXJpYWxpemVyLkNyZWF0ZSggY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOworLy8gQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIuCisvLyBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gICAgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIGFkYXB0ZXIgICAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGU3RyZWFtLCBGQUxTRSk7CisgIEZUcmFuc3BvcnQgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdGVyLCBuaWwpOworICBGUHJvdG9jb2wgIDo9IGZhY3RvcnkuR2V0UHJvdG9jb2woIEZUcmFuc3BvcnQpOworZW5kOworCisKK2Rlc3RydWN0b3IgVERlc2VyaWFsaXplci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sICA6PSBuaWw7CisgICAgRlRyYW5zcG9ydCA6PSBuaWw7CisgICAgRnJlZUFuZE5pbCggRlN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBURGVzZXJpYWxpemVyLkRlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRCeXRlczsgY29uc3QgdGFyZ2V0IDogSUJhc2UpOworLy8gRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZGF0YSBmcm9tIHRoZSBieXRlIGFycmF5LgordmFyIGlCeXRlcyA6IEludDY0OworYmVnaW4KKyAgdHJ5CisgICAgaUJ5dGVzIDo9IExlbmd0aChpbnB1dCk7CisgICAgRlN0cmVhbS5TaXplIDo9IGlCeXRlczsKKyAgICBpZiBpQnl0ZXMgPiAwCisgICAgdGhlbiBNb3ZlKCBpbnB1dFswXSwgRlN0cmVhbS5NZW1vcnleLCBpQnl0ZXMpOworCisgICAgdGFyZ2V0LlJlYWQoIEZQcm90b2NvbCk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBURGVzZXJpYWxpemVyLkRlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRTdHJlYW07IGNvbnN0IHRhcmdldCA6IElCYXNlKTsKKy8vIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheS4KK2NvbnN0IENPUFlfRU5USVJFX1NUUkVBTSA9IDA7Cit2YXIgYmVmb3JlIDogSW50NjQ7CitiZWdpbgorICB0cnkKKyAgICBiZWZvcmUgOj0gRlN0cmVhbS5Qb3NpdGlvbjsKKyAgICBGU3RyZWFtLkNvcHlGcm9tKCBpbnB1dCwgQ09QWV9FTlRJUkVfU1RSRUFNKTsKKyAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IGJlZm9yZTsKKyAgICB0YXJnZXQuUmVhZCggRlByb3RvY29sKTsKKyAgZmluYWxseQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOyAgLy8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeQorICBlbmQ7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzU3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcwpAQCAtMCwwICsxLDQyMyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisgdW5pdCBUaHJpZnQuU2VydmVyOworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgV2luZG93cywgU3lzVXRpbHMsCisgIHskRUxTRX0KKyAgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5UcmFuc3BvcnQ7CisKK3R5cGUKKyAgSVNlcnZlckV2ZW50cyA9IGludGVyZmFjZQorICAgIFsnezlFMkE5OUM1LUVFODUtNDBCMi05QTUyLTJEMTcyMkIxODE3Nn0nXQorICAgIC8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAgcHJvY2VkdXJlIFByZVNlcnZlOworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGlzIHJlYWR5IHRvIGFjY2VwdCByZXF1ZXN0cworICAgIHByb2NlZHVyZSBQcmVBY2NlcHQ7CisgICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIHRoZSBzZXJ2ZXIgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICBmdW5jdGlvbiAgQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoIGNvbnN0IGlucHV0LCBvdXRwdXQgOiBJUHJvdG9jb2wpIDogSVByb2Nlc3NvckV2ZW50czsKKyAgZW5kOworCisKKyAgSVNlcnZlciA9IGludGVyZmFjZQorICAgIFsne0FEQzQ2RjJELTgxOTktNEQxQy05NkQyLTg3RkQ1NDM1MTcyM30nXQorICAgIHByb2NlZHVyZSBTZXJ2ZTsKKyAgICBwcm9jZWR1cmUgU3RvcDsKKworICAgIGZ1bmN0aW9uIEdldFNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CisgICAgcHJvY2VkdXJlIFNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKKworICAgIHByb3BlcnR5IFNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHMgcmVhZCBHZXRTZXJ2ZXJFdmVudHMgd3JpdGUgU2V0U2VydmVyRXZlbnRzOworICBlbmQ7CisKKyAgVFNlcnZlckltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElTZXJ2ZXIgKQorICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBUTG9nRGVsZWdhdGUgPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBjb25zdCBzdHI6IHN0cmluZyk7CisgIHByb3RlY3RlZAorICAgIEZQcm9jZXNzb3IgOiBJUHJvY2Vzc29yOworICAgIEZTZXJ2ZXJUcmFuc3BvcnQgOiBJU2VydmVyVHJhbnNwb3J0OworICAgIEZJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBGT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgIEZJbnB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgRk91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgRkxvZ0RlbGVnYXRlIDogVExvZ0RlbGVnYXRlOworICAgIEZTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworCisgICAgY2xhc3MgcHJvY2VkdXJlIERlZmF1bHRMb2dEZWxlZ2F0ZSggY29uc3Qgc3RyOiBzdHJpbmcpOworCisgICAgZnVuY3Rpb24gR2V0U2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50czsKKyAgICBwcm9jZWR1cmUgU2V0U2VydmVyRXZlbnRzKCBjb25zdCB2YWx1ZSA6IElTZXJ2ZXJFdmVudHMpOworCisgICAgcHJvY2VkdXJlIFNlcnZlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgU3RvcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKKyAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CisgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQUlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgICAgY29uc3QgQU91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIGNvbnN0IEFJbnB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgICBjb25zdCBBT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgICAgIGNvbnN0IEFMb2dEZWxlZ2F0ZSA6IFRMb2dEZWxlZ2F0ZQorICAgICAgKTsgb3ZlcmxvYWQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydAorICAgICAgKTsgb3ZlcmxvYWQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlCisgICAgICApOyBvdmVybG9hZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKKyAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CisgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeQorICAgICAgKTsgb3ZlcmxvYWQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICBjb25zdCBBUHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeQorICAgICAgKTsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICBUU2ltcGxlU2VydmVyID0gY2xhc3MoIFRTZXJ2ZXJJbXBsKQorICBwcml2YXRlCisgICAgRlN0b3AgOiBCb29sZWFuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7IGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7IGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBBTG9nRGVsOiBUU2VydmVySW1wbC5UTG9nRGVsZWdhdGUpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7IGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3RvcnkpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7IGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3Rvcnk7IGNvbnN0IEFQcm90b2NvbEZhY3Rvcnk6IElQcm90b2NvbEZhY3RvcnkpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBTZXJ2ZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFN0b3A7IG92ZXJyaWRlOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworeyBUU2VydmVySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOwordmFyCisgIElucHV0RmFjdG9yeSwgT3V0cHV0RmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIElucHV0VHJhbnNGYWN0b3J5LCBPdXRwdXRUcmFuc0ZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKworYmVnaW4KKyAgSW5wdXRGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBJbnB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKworICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKAorICAgIEFQcm9jZXNzb3IsCisgICAgQVNlcnZlclRyYW5zcG9ydCwKKyAgICBJbnB1dFRyYW5zRmFjdG9yeSwKKyAgICBPdXRwdXRUcmFuc0ZhY3RvcnksCisgICAgSW5wdXRGYWN0b3J5LAorICAgIE91dHB1dEZhY3RvcnksCisgICAgQUxvZ0RlbGVnYXRlCisgICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZShjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0KTsKK3ZhcgorICBJbnB1dEZhY3RvcnksIE91dHB1dEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBJbnB1dFRyYW5zRmFjdG9yeSwgT3V0cHV0VHJhbnNGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisKK2JlZ2luCisgIElucHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgT3V0cHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSgKKyAgICBBUHJvY2Vzc29yLAorICAgIEFTZXJ2ZXJUcmFuc3BvcnQsCisgICAgSW5wdXRUcmFuc0ZhY3RvcnksCisgICAgT3V0cHV0VHJhbnNGYWN0b3J5LAorICAgIElucHV0RmFjdG9yeSwKKyAgICBPdXRwdXRGYWN0b3J5LAorICAgIERlZmF1bHRMb2dEZWxlZ2F0ZQorICApOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5KTsKK3ZhcgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CitiZWdpbgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIEFUcmFuc3BvcnRGYWN0b3J5LCBBVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBJbnB1dFByb3RvY29sRmFjdG9yeSwgT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBEZWZhdWx0TG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgY29uc3QgQUlucHV0VHJhbnNwb3J0RmFjdG9yeSwgQU91dHB1dFRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OworICBjb25zdCBBSW5wdXRQcm90b2NvbEZhY3RvcnksIEFPdXRwdXRQcm90b2NvbEZhY3Rvcnk6IElQcm90b2NvbEZhY3Rvcnk7CisgIGNvbnN0IEFMb2dEZWxlZ2F0ZSA6IFRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUHJvY2Vzc29yIDo9IEFQcm9jZXNzb3I7CisgIEZTZXJ2ZXJUcmFuc3BvcnQgOj0gQVNlcnZlclRyYW5zcG9ydDsKKyAgRklucHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBBSW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICBGT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBBT3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgRklucHV0UHJvdG9jb2xGYWN0b3J5IDo9IEFJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgRk91dHB1dFByb3RvY29sRmFjdG9yeSA6PSBBT3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFNlcnZlckltcGwuRGVmYXVsdExvZ0RlbGVnYXRlKCBjb25zdCBzdHI6IHN0cmluZyk7CitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCBzdHIpOworICAgIGlmIElvUmVzdWx0IDw+IDAgdGhlbiBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihzdHIpKTsKKyAgZXhjZXB0CisgICAgT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoc3RyKSk7CisgIGVuZDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIGNvbnN0IEFQcm90b2NvbEZhY3Rvcnk6IElQcm90b2NvbEZhY3RvcnkpOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBBVHJhbnNwb3J0RmFjdG9yeSwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgQVByb3RvY29sRmFjdG9yeSwgQVByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpOworZW5kOworCisKK2Z1bmN0aW9uIFRTZXJ2ZXJJbXBsLkdldFNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CitiZWdpbgorICByZXN1bHQgOj0gRlNlcnZlckV2ZW50czsKK2VuZDsKKworCitwcm9jZWR1cmUgVFNlcnZlckltcGwuU2V0U2VydmVyRXZlbnRzKCBjb25zdCB2YWx1ZSA6IElTZXJ2ZXJFdmVudHMpOworYmVnaW4KKyAgLy8gaWYgeW91IG5lZWQgbW9yZSB0aGFuIG9uZSwgcHJvdmlkZSBhIHNwZWNpYWxpemVkIElTZXJ2ZXJFdmVudHMgaW1wbGVtZW50YXRpb24KKyAgRlNlcnZlckV2ZW50cyA6PSB2YWx1ZTsKK2VuZDsKKworCit7IFRTaW1wbGVTZXJ2ZXIgfQorCitjb25zdHJ1Y3RvciBUU2ltcGxlU2VydmVyLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydCk7Cit2YXIKKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworYmVnaW4KKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKworICBpbmhlcml0ZWQgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBJbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgSW5wdXRQcm90b2NvbEZhY3RvcnksIE91dHB1dFByb3RvY29sRmFjdG9yeSwgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IEFMb2dEZWw6IFRTZXJ2ZXJJbXBsLlRMb2dEZWxlZ2F0ZSk7Cit2YXIKKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworYmVnaW4KKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKworICBpbmhlcml0ZWQgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBJbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgSW5wdXRQcm90b2NvbEZhY3RvcnksIE91dHB1dFByb3RvY29sRmFjdG9yeSwgQUxvZ0RlbCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3RvcnkpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgQVRyYW5zcG9ydEZhY3RvcnksIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgY29uc3QgQVByb3RvY29sRmFjdG9yeTogSVByb3RvY29sRmFjdG9yeSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBBVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBBVHJhbnNwb3J0RmFjdG9yeSwgQVByb3RvY29sRmFjdG9yeSwgQVByb3RvY29sRmFjdG9yeSwgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTaW1wbGVTZXJ2ZXIuU2VydmU7Cit2YXIKKyAgY2xpZW50IDogSVRyYW5zcG9ydDsKKyAgSW5wdXRUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICBPdXRwdXRUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICBJbnB1dFByb3RvY29sIDogSVByb3RvY29sOworICBPdXRwdXRQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgY29udGV4dCA6IElQcm9jZXNzb3JFdmVudHM7CitiZWdpbgorICB0cnkKKyAgICBGU2VydmVyVHJhbnNwb3J0Lkxpc3RlbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgYmVnaW4KKyAgICAgIEZMb2dEZWxlZ2F0ZSggRS5Ub1N0cmluZyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgaWYgRlNlcnZlckV2ZW50cyA8PiBuaWwKKyAgdGhlbiBGU2VydmVyRXZlbnRzLlByZVNlcnZlOworCisgIGNsaWVudCA6PSBuaWw7CisgIHdoaWxlIChub3QgRlN0b3ApIGRvCisgIGJlZ2luCisgICAgdHJ5CisgICAgICAvLyBjbGVhbiB1cCBhbnkgb2xkIGluc3RhbmNlcyBiZWZvcmUgd2FpdGluZyBmb3IgY2xpZW50cworICAgICAgSW5wdXRUcmFuc3BvcnQgOj0gbmlsOworICAgICAgT3V0cHV0VHJhbnNwb3J0IDo9IG5pbDsKKyAgICAgIElucHV0UHJvdG9jb2wgOj0gbmlsOworICAgICAgT3V0cHV0UHJvdG9jb2wgOj0gbmlsOworCisgICAgICAvLyBjbG9zZSBhbnkgb2xkIGNvbm5lY3Rpb25zIGJlZm9yZSBiZWZvcmUgd2FpdGluZyBmb3IgbmV3IGNsaWVudHMKKyAgICAgIGlmIGNsaWVudCA8PiBuaWwgdGhlbiB0cnkKKyAgICAgICAgdHJ5CisgICAgICAgICAgY2xpZW50LkNsb3NlOworICAgICAgICBmaW5hbGx5CisgICAgICAgICAgY2xpZW50IDo9IG5pbDsKKyAgICAgICAgZW5kOworICAgICAgZXhjZXB0CisgICAgICAgIC8vIGNhdGNoIGFsbCwgd2UgY2FuJ3QgZG8gbXVjaCBhYm91dCBpdCBhdCB0aGlzIHBvaW50CisgICAgICBlbmQ7CisKKyAgICAgIGNsaWVudCA6PSBGU2VydmVyVHJhbnNwb3J0LkFjY2VwdCggcHJvY2VkdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgRlNlcnZlckV2ZW50cyA8PiBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIEZTZXJ2ZXJFdmVudHMuUHJlQWNjZXB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOworCisgICAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgICBpZiBGU3RvcAorICAgICAgICB0aGVuIEFib3J0ICAvLyBzaWxlbnQgZXhjZXB0aW9uCisgICAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCcpOworICAgICAgZW5kOworCisgICAgICBGTG9nRGVsZWdhdGUoICdDbGllbnQgQ29ubmVjdGVkIScpOworCisgICAgICBJbnB1dFRyYW5zcG9ydCA6PSBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCggY2xpZW50ICk7CisgICAgICBPdXRwdXRUcmFuc3BvcnQgOj0gRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KCBjbGllbnQgKTsKKyAgICAgIElucHV0UHJvdG9jb2wgOj0gRklucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKCBJbnB1dFRyYW5zcG9ydCApOworICAgICAgT3V0cHV0UHJvdG9jb2wgOj0gRk91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCggT3V0cHV0VHJhbnNwb3J0ICk7CisKKyAgICAgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgICAgICB0aGVuIGNvbnRleHQgOj0gRlNlcnZlckV2ZW50cy5DcmVhdGVQcm9jZXNzaW5nQ29udGV4dCggSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpCisgICAgICBlbHNlIGNvbnRleHQgOj0gbmlsOworCisgICAgICB3aGlsZSBub3QgRlN0b3AgZG8gYmVnaW4KKyAgICAgICAgaWYgY29udGV4dCA8PiBuaWwKKyAgICAgICAgdGhlbiBjb250ZXh0LlByb2Nlc3NpbmcoIGNsaWVudCk7CisgICAgICAgIGlmIG5vdCBGUHJvY2Vzc29yLlByb2Nlc3MoIElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sLCBjb250ZXh0KQorICAgICAgICB0aGVuIEJyZWFrOworICAgICAgZW5kOworCisgICAgZXhjZXB0CisgICAgICBvbiBFOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBpZiBGU3RvcAorICAgICAgICB0aGVuIEZMb2dEZWxlZ2F0ZSgnVFNpbXBsZVNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICcgKyBFLlRvU3RyaW5nKQorICAgICAgICBlbHNlIEZMb2dEZWxlZ2F0ZSggRS5Ub1N0cmluZyk7CisgICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIGJlZ2luCisgICAgICAgIEZMb2dEZWxlZ2F0ZSggRS5Ub1N0cmluZyk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgaWYgY29udGV4dCA8PiBuaWwKKyAgICB0aGVuIGJlZ2luCisgICAgICBjb250ZXh0LkNsZWFudXBDb250ZXh0OworICAgICAgY29udGV4dCA6PSBuaWw7CisgICAgZW5kOworCisgICAgaWYgSW5wdXRUcmFuc3BvcnQgPD4gbmlsIHRoZW4KKyAgICBiZWdpbgorICAgICAgSW5wdXRUcmFuc3BvcnQuQ2xvc2U7CisgICAgZW5kOworICAgIGlmIE91dHB1dFRyYW5zcG9ydCA8PiBuaWwgdGhlbgorICAgIGJlZ2luCisgICAgICBPdXRwdXRUcmFuc3BvcnQuQ2xvc2U7CisgICAgZW5kOworICBlbmQ7CisKKyAgaWYgRlN0b3AgdGhlbgorICBiZWdpbgorICAgIHRyeQorICAgICAgRlNlcnZlclRyYW5zcG9ydC5DbG9zZTsKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IFRUcmFuc3BvcnRFeGNlcHRpb24gZG8KKyAgICAgIGJlZ2luCisgICAgICAgIEZMb2dEZWxlZ2F0ZSgnVFNlcnZlclRyYW5wb3J0IGZhaWxlZCBvbiBjbG9zZTogJyArIEUuTWVzc2FnZSk7CisgICAgICBlbmQ7CisgICAgZW5kOworICAgIEZTdG9wIDo9IEZhbHNlOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2ltcGxlU2VydmVyLlN0b3A7CitiZWdpbgorICBGU3RvcCA6PSBUcnVlOworICBGU2VydmVyVHJhbnNwb3J0LkNsb3NlOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2FiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpAQCAtMCwwICsxLDE2MTcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuU29ja2V0OworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKKworaW50ZXJmYWNlCit7JElGTkRFRiBPTERfU09DS0VUU30gLy8gbm90IGZvciBPTERfU09DS0VUUworCit1c2VzCisgIFdpbmFwaS5XaW5kb3dzLCBXaW5hcGkuV2luc29jazI7CisKK2NvbnN0CisgIEFJX1BBU1NJVkUgICAgICAgICAgICAgICAgPSAkMDAwMDAwMDE7ICAvLyBTb2NrZXQgYWRkcmVzcyB3aWxsIGJlIHVzZWQgaW4gYmluZCgpIGNhbGwKKyAgQUlfQ0FOT05OQU1FICAgICAgICAgICAgICA9ICQwMDAwMDAwMjsgIC8vIFJldHVybiBjYW5vbmljYWwgbmFtZSBpbiBmaXJzdCBhaV9jYW5vbm5hbWUKKyAgQUlfTlVNRVJJQ0hPU1QgICAgICAgICAgICA9ICQwMDAwMDAwNDsgIC8vIE5vZGVuYW1lIG11c3QgYmUgYSBudW1lcmljIGFkZHJlc3Mgc3RyaW5nCisgIEFJX05VTUVSSUNTRVJWICAgICAgICAgICAgPSAkMDAwMDAwMDg7ICAvLyBTZXJ2aWNlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBwb3J0IG51bWJlcgorCisgIEFJX0FMTCAgICAgICAgICAgICAgICAgICAgPSAkMDAwMDAxMDA7ICAvLyBRdWVyeSBib3RoIElQNiBhbmQgSVA0IHdpdGggQUlfVjRNQVBQRUQKKyAgQUlfQUREUkNPTkZJRyAgICAgICAgICAgICA9ICQwMDAwMDQwMDsgIC8vIFJlc29sdXRpb24gb25seSBpZiBnbG9iYWwgYWRkcmVzcyBjb25maWd1cmVkCisgIEFJX1Y0TUFQUEVEICAgICAgICAgICAgICAgPSAkMDAwMDA4MDA7ICAvLyBPbiB2NiBmYWlsdXJlLCBxdWVyeSB2NCBhbmQgY29udmVydCB0byBWNE1BUFBFRCBmb3JtYXQKKworICBBSV9OT05fQVVUSE9SSVRBVElWRSAgICAgID0gJDAwMDA0MDAwOyAgLy8gTFVQX05PTl9BVVRIT1JJVEFUSVZFCisgIEFJX1NFQ1VSRSAgICAgICAgICAgICAgICAgPSAkMDAwMDgwMDA7ICAvLyBMVVBfU0VDVVJFCisgIEFJX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMgPSAkMDAwMTAwMDA7ICAvLyBMVVBfUkVUVVJOX1BSRUZFUlJFRF9OQU1FUworCisgIEFJX0ZRRE4gICAgICAgICAgICAgICAgICAgPSAkMDAwMjAwMDA7ICAvLyBSZXR1cm4gdGhlIEZRRE4gaW4gYWlfY2Fub25uYW1lCisgIEFJX0ZJTEVTRVJWRVIgICAgICAgICAgICAgPSAkMDAwNDAwMDA7ICAvLyBSZXNvbHZpbmcgZmlsZXNlcnZlciBuYW1lIHJlc29sdXRpb24KKwordHlwZQorICBQQWRkckluZm9BID0gXlRBZGRySW5mb0E7CisgIFRBZGRySW5mb0EgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBBbnNpQ2hhcjsKKyAgICBhaV9hZGRyOiBQU29ja0FkZHI7CisgICAgYWlfbmV4dDogUEFkZHJJbmZvQTsKKyAgZW5kOworCisgIFBBZGRySW5mb1cgPSBeVEFkZHJJbmZvVzsKKyAgVEFkZHJJbmZvVyA9IHJlY29yZAorICAgIGFpX2ZsYWdzOiBJbnRlZ2VyOworICAgIGFpX2ZhbWlseTogSW50ZWdlcjsKKyAgICBhaV9zb2NrdHlwZTogSW50ZWdlcjsKKyAgICBhaV9wcm90b2NvbDogSW50ZWdlcjsKKyAgICBhaV9hZGRybGVuOiBOYXRpdmVVSW50OworICAgIGFpX2Nhbm9ubmFtZTogUENoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb1c7CisgIGVuZDsKKworICBUQWRkcmVzc0ZhbWlseSA9IFVTSE9SVDsKKworICBUSW42QWRkciA9IHJlY29yZAorICBjYXNlIEludGVnZXIgb2YKKyAgICAwOiAoX0J5dGU6IGFycmF5WzAuLjE1XSBvZiBVQ0hBUik7CisgICAgMTogKF9Xb3JkOiBhcnJheVswLi43XSBvZiBVU0hPUlQpOworICBlbmQ7CisKKyAgVFNjb3BlSWQgPSByZWNvcmQKKyAgcHVibGljCisgICAgVmFsdWU6IFVMT05HOworICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsgaW5saW5lOworICAgIHByb2NlZHVyZSBTZXRCaXRGaWVsZChMb2M6IEludGVnZXI7IGNvbnN0IGFWYWx1ZTogSW50ZWdlcik7IGlubGluZTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgWm9uZTogSW50ZWdlciBpbmRleCAkMDAyOCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICAgIHByb3BlcnR5IExldmVsOiBJbnRlZ2VyIGluZGV4ICQyODA0IHJlYWQgR2V0Qml0RmllbGQgd3JpdGUgU2V0Qml0RmllbGQ7CisgIGVuZDsKKworICBUU29ja0FkZHJJbjYgPSByZWNvcmQKKyAgICBzaW42X2ZhbWlseTogVEFkZHJlc3NGYW1pbHk7CisgICAgc2luNl9wb3J0OiBVU0hPUlQ7CisgICAgc2luNl9mbG93aW5mbzogVUxPTkc7CisgICAgc2luNl9hZGRyOiBUSW42QWRkcjsKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKHNpbjZfc2NvcGVfaWQ6IFVMT05HKTsKKyAgICAxOiAoc2luNl9zY29wZV9zdHJ1Y3Q6IFRTY29wZUlkKTsKKyAgZW5kOworICBQU29ja0FkZHJJbjYgPSBeVFNvY2tBZGRySW42OworCitjb25zdAorICBOSV9OT0ZRRE4gICAgICA9ICQwMTsgIC8vIE9ubHkgcmV0dXJuIG5vZGVuYW1lIHBvcnRpb24gZm9yIGxvY2FsIGhvc3RzCisgIE5JX05VTUVSSUNIT1NUID0gJDAyOyAgLy8gUmV0dXJuIG51bWVyaWMgZm9ybSBvZiB0aGUgaG9zdCdzIGFkZHJlc3MKKyAgTklfTkFNRVJFUUQgICAgPSAkMDQ7ICAvLyBFcnJvciBpZiB0aGUgaG9zdCdzIG5hbWUgbm90IGluIEROUworICBOSV9OVU1FUklDU0VSViA9ICQwODsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIHNlcnZpY2UgKHBvcnQgIykKKyAgTklfREdSQU0gICAgICAgPSAkMTA7ICAvLyBTZXJ2aWNlIGlzIGEgZGF0YWdyYW0gc2VydmljZQorCisgIE5JX01BWEhPU1QgICAgID0gMTAyNTsgIC8vIE1heCBzaXplIG9mIGEgZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lCisgIE5JX01BWFNFUlYgICAgID0gMzI7ICAgIC8vIE1heCBzaXplIG9mIGEgc2VydmljZSBuYW1lCisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvKHBOb2RlTmFtZSwgcFNlcnZpY2VOYW1lOiBQQW5zaUNoYXI7IGNvbnN0IHBIaW50czogVEFkZHJJbmZvQTsgdmFyIHBwUmVzdWx0OiBQQWRkckluZm9BKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldEFkZHJJbmZvVyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUFdpZGVDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb1c7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvVyk6IEludGVnZXI7IHN0ZGNhbGw7Citwcm9jZWR1cmUgZnJlZWFkZHJpbmZvKHBBZGRySW5mbzogUEFkZHJJbmZvQSk7IHN0ZGNhbGw7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVyhwQWRkckluZm86IFBBZGRySW5mb1cpOyBzdGRjYWxsOworZnVuY3Rpb24gZ2V0bmFtZWluZm8oY29uc3QgcFNvY2thZGRyOiBUU29ja0FkZHI7IFNvY2thZGRyTGVuZ3RoOiBJbnRlZ2VyOyBwTm9kZUJ1ZmZlcjogUEFuc2lDaGFyOyBOb2RlQnVmZmVyU2l6ZTogRFdPUkQ7IHBTZXJ2aWNlQnVmZmVyOiBQQW5zaUNoYXI7CisgIFNlcnZpY2VCdWZmZXJTaXplOiBEV09SRDsgRmxhZ3M6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGRjYWxsOworZnVuY3Rpb24gR2V0TmFtZUluZm9XKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBXaWRlQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUFdpZGVDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKKwordHlwZQorICBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+ID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShWYWx1ZTogVCk7CisKKyAgSVNtYXJ0UG9pbnRlcjxUPiA9IHJlZmVyZW5jZSB0byBmdW5jdGlvbjogVDsKKworICBUU21hcnRQb2ludGVyPFQ+ID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElTbWFydFBvaW50ZXI8VD4pCisgIHByaXZhdGUKKyAgICBGVmFsdWU6IFQ7CisgICAgRkRlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFWYWx1ZTogVDsgQURlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJbnZva2U6IFQ7CisgIGVuZDsKKworICBUQmFzZVNvY2tldCA9IGNsYXNzIGFic3RyYWN0CisgIHB1YmxpYyB0eXBlCisgICAgVExvZ0RlbGVnYXRlID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggY29uc3Qgc3RyOiBzdHJpbmcpOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQb3J0OiBJbnRlZ2VyOworICAgIEZTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIEZTZW5kVGltZW91dCwKKyAgICBGUmVjdlRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZLZWVwQWxpdmU6IEJvb2xlYW47CisgICAgRkxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGU7CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKKyAgcHJvdGVjdGVkIHR5cGUKKyAgICBJR2V0QWRkckluZm9XcmFwcGVyID0gaW50ZXJmYWNlCisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgICBUR2V0QWRkckluZm9XcmFwcGVyID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElHZXRBZGRySW5mb1dyYXBwZXIpCisgICAgc3RyaWN0IHByaXZhdGUKKyAgICAgIEZOb2RlOiBzdHJpbmc7CisgICAgICBGU2VydmljZTogc3RyaW5nOworICAgICAgRkhpbnRzLAorICAgICAgRlJlczogUEFkZHJJbmZvVzsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKKyAgICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb3BlcnR5IExvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgcmVhZCBGTG9nRGVsZWdhdGU7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBEZXN0cm95cyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAgLy8KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsKKworICAgIC8vIFRoZSBwb3J0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBQb3J0OiBJbnRlZ2VyIHJlYWQgRlBvcnQgd3JpdGUgRlBvcnQ7CisKKyAgICAvLyBUaGUgcmVjZWl2ZSB0aW1lb3V0CisgICAgcHJvcGVydHkgUmVjdlRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRlJlY3ZUaW1lb3V0IHdyaXRlIFNldFJlY3ZUaW1lb3V0OworCisgICAgLy8gVGhlIHNlbmQgdGltZW91dAorICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKKworICAgIC8vIFNldCBTT19LRUVQQUxJVkUKKyAgICBwcm9wZXJ0eSBLZWVwQWxpdmU6IEJvb2xlYW4gcmVhZCBGS2VlcEFsaXZlIHdyaXRlIFNldEtlZXBBbGl2ZTsKKworICAgIC8vIFRoZSB1bmRlcmx5aW5nIHNvY2tldCBkZXNjcmlwdG9yCisgICAgcHJvcGVydHkgU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCByZWFkIEZTb2NrZXQgd3JpdGUgU2V0U29ja2V0OworICBlbmQ7CisKKyAgVFNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZSB0eXBlCisgICAgVENhY2hlZFBlZXJBZGRyID0gcmVjb3JkCisgICAgY2FzZSBJbnRlZ2VyIG9mCisgICAgICAwOiAoaXB2NDogVFNvY2tBZGRySW4pOworICAgICAgMTogKGlwdjY6IFRTb2NrQWRkckluNik7CisgICAgZW5kOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgRlBlZXJQb3J0OiBJbnRlZ2VyOworICAgIEZJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgICAgRkNvbm5UaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGluZ2VyT246IEJvb2xlYW47CisgICAgRkxpbmdlclZhbDogSW50ZWdlcjsKKyAgICBGTm9EZWxheTogQm9vbGVhbjsKKyAgICBGTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkOworICAgIEZDYWNoZWRQZWVyQWRkcjogVENhY2hlZFBlZXJBZGRyOworICAgIHByb2NlZHVyZSBJbml0UGVlckluZm87CisgICAgcHJvY2VkdXJlIE9wZW5Db25uZWN0aW9uKFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcik7CisgICAgcHJvY2VkdXJlIExvY2FsT3BlbjsKKyAgICBwcm9jZWR1cmUgU2V0R2VuZXJpY1RpbWVvdXQoUzogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IFRpbWVvdXQ6IExvbmd3b3JkOyBPcHROYW1lOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIFNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOworICAgIGZ1bmN0aW9uIEdldFNvY2tldEluZm86IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVySG9zdDogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlclBvcnQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0T3JpZ2luOiBzdHJpbmc7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KKyAgICAvLyBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvci4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHNvY2tldCBkZXNjcmlwdG9yIHRoYXQKKyAgICAvLyBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgICAgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIHNvY2tldAorICAgIC8vCisgICAgLy8gQHRocm93cyBFVHJhbnNwb3J0YXRpb25FeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAorICAgIC8vCisgICAgcHJvY2VkdXJlIE9wZW47CisKKyAgICAvLworICAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldAorICAgIC8vCisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAgLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW5kaWNhdGVzIEVPRgorICAgIC8vIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICAvLyAgICAgICAgICBJbnRlcnJ1cHRlZCBtZWFucyB0aGUgc29ja2V0IHdhcyBpbnRlcnJ1cHRlZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIG91dCBvZiBhIGJsb2NraW5nIGNhbGwKKyAgICAvLyAgICAgICAgICBOb3RPcGVuIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAgLy8gICAgICAgICAgVGltZWRPdXQgbWVhbnMgdGhlIHJlY2VpdmUgdGltZW91dCBleHBpcmVkCisgICAgLy8gICAgICAgICAgVW5rbm93biBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgIC8vCisgICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgTG9vcHMgdW50aWwgZG9uZSBvciBmYWlsLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFdyaXRlKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCisgICAgLy8KKyAgICBmdW5jdGlvbiBXcml0ZVBhcnRpYWwoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHBlZXIgYWRkcmVzcy4KKyAgICAvLworICAgIGZ1bmN0aW9uIEdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKKworICAgIC8vCisgICAgLy8gU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KKyAgICAvLyBhY2NlcHQoKSBvciBjb25uZWN0KCkpLiBPbmx5IGNhY2hlcyBJUFY0IGFuZCBJUFY2OyB1bnNldCBmb3Igb3RoZXJzLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldENhY2hlZEFkZHJlc3MoY29uc3QgQWRkcjogVFNvY2tBZGRyOyBMZW46IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIG9uICAgICAgV2hldGhlciBTT19MSU5HRVIgaXMgb24KKyAgICAvLyBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ2FsbHMgc2VsZWN0KCkgb24gdGhlIHNvY2tldCB0byBzZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAvLworICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47CisKKyAgICAvLyBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisKKyAgICAvLyBUaGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgSG9zdDogc3RyaW5nIHJlYWQgRkhvc3Qgd3JpdGUgRkhvc3Q7CisKKyAgICAvLyBXaGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtCisgICAgcHJvcGVydHkgTm9EZWxheTogQm9vbGVhbiByZWFkIEZOb0RlbGF5IHdyaXRlIFNldE5vRGVsYXk7CisKKyAgICAvLyBDb25uZWN0IHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBDb25uVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQ29ublRpbWVvdXQgd3JpdGUgRkNvbm5UaW1lb3V0OworCisgICAgLy8gVGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIHRoZSBjYXNlIG9mIGEgV1NBRVdPVUxEQkxPQ0sKKyAgICBwcm9wZXJ0eSBNYXhSZWN2UmV0cmllczogTG9uZ3dvcmQgcmVhZCBGTWF4UmVjdlJldHJpZXMgd3JpdGUgRk1heFJlY3ZSZXRyaWVzOworCisgICAgLy8gU29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdHRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgorICAgIHByb3BlcnR5IFNvY2tldEluZm86IHN0cmluZyByZWFkIEdldFNvY2tldEluZm87CisKKyAgICAvLyBUaGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVySG9zdDogc3RyaW5nIHJlYWQgR2V0UGVlckhvc3Q7CisKKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJBZGRyZXNzOiBzdHJpbmcgcmVhZCBHZXRQZWVyQWRkcmVzczsKKworICAgIC8vIFRoZSBwb3J0IG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlclBvcnQ6IEludGVnZXIgcmVhZCBHZXRQZWVyUG9ydDsKKworICAgIC8vIFRoZSBvcmlnaW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBPcmlnaW46IHN0cmluZyByZWFkIEdldE9yaWdpbjsKKyAgZW5kOworCisgIFRTZXJ2ZXJTb2NrZXRGdW5jID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisKKyAgVFNlcnZlclNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZBZGRyZXNzOiBzdHJpbmc7CisgICAgRkFjY2VwdEJhY2tsb2csCisgICAgRlJldHJ5TGltaXQsCisgICAgRlJldHJ5RGVsYXksCisgICAgRlRjcFNlbmRCdWZmZXIsCisgICAgRlRjcFJlY3ZCdWZmZXI6IEludGVnZXI7CisgICAgRkFjY2VwdFRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZMaXN0ZW5pbmcsCisgICAgRkludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbjsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdCgpCisgICAgRkludGVycnVwdFNvY2tSZWFkZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdCB3aXRoIEZTb2NrZXQgZm9yIGludGVycnVwdGFiaWxpdHkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdENoaWxkcmVuKCkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsgIC8vIGlmIEZudGVycnVwdGFibGVDaGlsZHJlbiB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisgICAgRkxpc3RlbkNhbGxiYWNrLAorICAgIEZBY2NlcHRDYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmM7CisgICAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworICAgIHByb2NlZHVyZSBOb3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisgICAgcHJvY2VkdXJlIFNldEludGVycnVwdGFibGVDaGlsZHJlbihBVmFsdWU6IEJvb2xlYW4pOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICBwdWJsaWMgY29uc3QKKyAgICBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICAvLyBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIExpc3RlbjsKKyAgICBmdW5jdGlvbiBBY2NlcHQ6IFRTb2NrZXQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdDsKKyAgICBwcm9jZWR1cmUgSW50ZXJydXB0Q2hpbGRyZW47CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIHByb3BlcnR5IEFjY2VwdEJhY2tsb2c6IEludGVnZXIgcmVhZCBGQWNjZXB0QmFja2xvZyB3cml0ZSBGQWNjZXB0QmFja2xvZzsKKyAgICBwcm9wZXJ0eSBBY2NlcHRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZBY2NlcHRUaW1lb3V0IHdyaXRlIEZBY2NlcHRUaW1lb3V0OworICAgIHByb3BlcnR5IFJldHJ5TGltaXQ6IEludGVnZXIgcmVhZCBGUmV0cnlMaW1pdCB3cml0ZSBGUmV0cnlMaW1pdDsKKyAgICBwcm9wZXJ0eSBSZXRyeURlbGF5OiBJbnRlZ2VyIHJlYWQgRlJldHJ5RGVsYXkgd3JpdGUgRlJldHJ5RGVsYXk7CisgICAgcHJvcGVydHkgVGNwU2VuZEJ1ZmZlcjogSW50ZWdlciByZWFkIEZUY3BTZW5kQnVmZmVyIHdyaXRlIEZUY3BTZW5kQnVmZmVyOworICAgIHByb3BlcnR5IFRjcFJlY3ZCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwUmVjdkJ1ZmZlciB3cml0ZSBGVGNwUmVjdkJ1ZmZlcjsKKworICAgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAgIC8vIHRoZXkgY2FuIGJlIGludGVycnVwdGVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0Q2hpbGRyZW4oKS4KKyAgICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgICAvLyBlbnN1cmVzIGEgY29ubmVjdGVkIGNsaWVudCBjYW5ub3QgaW50ZXJmZXJlIHdpdGggVFNlcnZlci5TdG9wKCkuCisgICAgLy8KKyAgICAvLyBXaGVuIGRpc2FibGVkLCBUU29ja2V0IGNoaWxkcmVuIGRvIG5vdCBpbmN1ciBhbiBhZGRpdGlvbmFsIHBvbGwoKSBjYWxsLgorICAgIC8vIFNlcnZlci1zaWRlIHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCwgaG93ZXZlciBhIGNsaWVudCBjYW4gaW50ZXJmZXJlIHdpdGgKKyAgICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgICAvLworICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsaXN0ZW4oKTsgbW9kZSBjYW5ub3QgYmUgc3dpdGNoZWQgYWZ0ZXIgdGhhdC4KKyAgICAvLyBcdGhyb3dzIEVQcm9wZXJ0eUVycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAorICAgIHByb3BlcnR5IEludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbiByZWFkIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gd3JpdGUgU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuOworCisgICAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgICBwcm9wZXJ0eSBMaXN0ZW5DYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmMgcmVhZCBGTGlzdGVuQ2FsbGJhY2sgd3JpdGUgRkxpc3RlbkNhbGxiYWNrOworCisgICAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkFjY2VwdENhbGxiYWNrIHdyaXRlIEZBY2NlcHRDYWxsYmFjazsKKyAgZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitpbXBsZW1lbnRhdGlvbgoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBTeXN0ZW0uRGF0ZVV0aWxzLCBUaHJpZnQuVHJhbnNwb3J0OworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkNyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZOb2RlIDo9IEFOb2RlOworICBGU2VydmljZSA6PSBBU2VydmljZTsKKyAgRkhpbnRzIDo9IEFIaW50czsKKyAgRlJlcyA6PSBuaWw7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5EZXN0cm95OworYmVnaW4KKyAgaWYgQXNzaWduZWQoRlJlcykgdGhlbgorICAgIEZyZWVBZGRySW5mb1coRlJlcyk7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkluaXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBGUmVzID0gbmlsIHRoZW4KKyAgICBFeGl0KEdldEFkZHJJbmZvVyhARk5vZGVbMV0sIEBGU2VydmljZVsxXSwgRkhpbnRzXiwgRlJlcykpOworICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5HZXRSZXM6IFBBZGRySW5mb1c7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlczsKK2VuZDsKKworcHJvY2VkdXJlIERlc3Ryb3llck9mRmluZVNvY2tldHMoc3NvY2s6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK2JlZ2luCisgIGNsb3Nlc29ja2V0KHNzb2NrKTsKK2VuZDsKKworZnVuY3Rpb24gVFNjb3BlSWQuR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVmFsdWUgc2hyIChMb2Mgc2hyIDgpKSBhbmQgKCgxIHNobCAoTG9jIGFuZCAkRkYpKSAtIDEpOworZW5kOworCitwcm9jZWR1cmUgVFNjb3BlSWQuU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgVmFsdWUgOj0gKFZhbHVlIGFuZCBVTE9ORygobm90ICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKSkpKSBvciBVTE9ORyhhVmFsdWUgc2hsIChMb2Mgc2hyIDgpKTsKK2VuZDsKKworZnVuY3Rpb24gZ2V0YWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRhZGRyaW5mbyc7CitmdW5jdGlvbiBHZXRBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXRBZGRySW5mb1cnOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2ZyZWVhZGRyaW5mbyc7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0ZyZWVBZGRySW5mb1cnOworZnVuY3Rpb24gZ2V0bmFtZWluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRuYW1laW5mbyc7CitmdW5jdGlvbiBHZXROYW1lSW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXROYW1lSW5mb1cnOworCitjb25zdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkNyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlZhbHVlIDo9IEFWYWx1ZTsKKyAgRkRlc3Ryb3llciA6PSBBRGVzdHJveWVyOworZW5kOworCitkZXN0cnVjdG9yIFRTbWFydFBvaW50ZXI8VD4uRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZEZXN0cm95ZXIpIHRoZW4gRkRlc3Ryb3llcihGVmFsdWUpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVFNtYXJ0UG9pbnRlcjxUPi5JbnZva2U6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlZhbHVlOworZW5kOworCitjbGFzcyBjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGU7Cit2YXIKKyAgVmVyc2lvbjogV09SRDsKKyAgRGF0YTogV1NBRGF0YTsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBWZXJzaW9uIDo9ICQwMjAyOworICBGaWxsQ2hhcihEYXRhLCBTaXplT2YoRGF0YSksIDApOworICBFcnJvciA6PSBXU0FTdGFydHVwKFZlcnNpb24sIERhdGEpOworICBpZiBFcnJvciA8PiAwIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXaW5zb2NrLicpOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBXU0FDbGVhbnVwOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVEJhc2VTb2NrZXQuRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKK3ZhcgorICBPdXRTdHI6IHN0cmluZzsKK2JlZ2luCisgIE91dFN0ciA6PSBGb3JtYXQoJ1RocmlmdDogJXMgJXMnLCBbRGF0ZVRpbWVUb1N0cihOb3csIFRGb3JtYXRTZXR0aW5ncy5DcmVhdGUpLCBTdHJdKTsKKyAgdHJ5CisgICAgV3JpdGVsbihPdXRTdHIpOworICAgIGlmIElvUmVzdWx0IDw+IDAgdGhlbiBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihPdXRTdHIpKTsKKyAgZXhjZXB0CisgICAgT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworICBGUG9ydCA6PSAwOworICBGU2VuZFRpbWVvdXQgOj0gMDsKKyAgRlJlY3ZUaW1lb3V0IDo9IDA7CisgIEZLZWVwQWxpdmUgOj0gRmFsc2U7CisgIEZMb2dEZWxlZ2F0ZSA6PSBEZWZhdWx0TG9nRGVsZWdhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LkNyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7Cit2YXIKKyAgSGludHM6IFRBZGRySW5mb1c7CisgIFJlczogUEFkZHJJbmZvVzsKKyAgVGhlUG9ydDogYXJyYXlbMC4uNV0gb2YgQ2hhcjsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBGaWxsQ2hhcihIaW50cywgU2l6ZU9mKEhpbnRzKSwgMCk7CisgIEhpbnRzLmFpX2ZhbWlseSA6PSBQRl9VTlNQRUM7CisgIEhpbnRzLmFpX3NvY2t0eXBlIDo9IFNPQ0tfU1RSRUFNOworICBIaW50cy5haV9mbGFncyA6PSBBSV9QQVNTSVZFIG9yIEFJX0FERFJDT05GSUc7CisgIFN0ckZtdChUaGVQb3J0LCAnJWQnLCBbRlBvcnRdKTsKKworICBSZXN1bHQgOj0gVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQUFkZHJlc3MsIFRoZVBvcnQsIEBIaW50cyk7CisgIEVycm9yIDo9IFJlc3VsdC5Jbml0OworICBpZiBFcnJvciA8PiAwIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ0dldEFkZHJJbmZvVyAlZDogJXMnLCBbRXJyb3IsIFN5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LicpOworICBlbmQ7CisKKyAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKKyAgLy8gaW50byBpcHY2IHNwYWNlLgorICBSZXMgOj0gUmVzdWx0LlJlczsKKyAgd2hpbGUgQXNzaWduZWQoUmVzKSBkbyBiZWdpbgorICAgIGlmIChSZXNeLmFpX2ZhbWlseSA9IEFGX0lORVQ2KSBvciAobm90IEFzc2lnbmVkKFJlc14uYWlfbmV4dCkpIHRoZW4KKyAgICAgIEJyZWFrOworICAgIFJlcyA6PSBSZXNeLmFpX25leHQ7CisgIGVuZDsKKworICBGU29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoUmVzXi5haV9mYW1pbHksIFJlc14uYWlfc29ja3R5cGUsIFJlc14uYWlfcHJvdG9jb2wpOworICBpZiBGU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RCYXNlU29ja2V0LkNyZWF0ZVNvY2tldCgpIHNvY2tldCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlJlY3ZUaW1lb3V0IDo9IEFSZWN2VGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsKK2JlZ2luCisgIEZLZWVwQWxpdmUgOj0gQUtlZXBBbGl2ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNvY2tldChBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBDbG9zZTsKKyAgRlNvY2tldCA6PSBBU29ja2V0OworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgaWYgQXNzaWduZWQoQUxvZ0RlbGVnYXRlKSB0aGVuIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGlmIEZTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIHNodXRkb3duKEZTb2NrZXQsIFNEX0JPVEgpOworICAgIGNsb3Nlc29ja2V0KEZTb2NrZXQpOworICBlbmQ7CisgIEZTb2NrZXQgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkluaXRQZWVySW5mbzsKK2JlZ2luCisgIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgOj0gQUZfVU5TUEVDOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyQWRkcmVzcyA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBpbmhlcml0ZWQgQ29tbW9uSW5pdDsKKyAgRkhvc3QgOj0gJyc7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBuaWw7CisgIEZDb25uVGltZW91dCA6PSAwOworICBGTGluZ2VyT24gOj0gVHJ1ZTsKKyAgRkxpbmdlclZhbCA6PSAwOworICBGTm9EZWxheSA6PSBUcnVlOworICBGTWF4UmVjdlJldHJpZXMgOj0gNTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworbGFiZWwKKyAgRG9uZTsKK3ZhcgorICBFcnJub0NvcHk6IEludGVnZXI7CisgIFJldCwKKyAgUmV0MjogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFZhbCwKKyAgTG9uOiBJbnRlZ2VyOworICBPbmUsCisgIFplcm86IENhcmRpbmFsOworYmVnaW4KKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4gU2V0U2VuZFRpbWVvdXQoU2VuZFRpbWVvdXQpOworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBTZXRSZWN2VGltZW91dChSZWN2VGltZW91dCk7CisgIGlmIEtlZXBBbGl2ZSB0aGVuIFNldEtlZXBBbGl2ZShLZWVwQWxpdmUpOworICBTZXRMaW5nZXIoRkxpbmdlck9uLCBGTGluZ2VyVmFsKTsKKyAgU2V0Tm9EZWxheShGTm9EZWxheSk7CisKKyAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uIGJsb2NraW5nIGZvciBjb25uZWN0IGlmIGEgdGltZW91dCBleGlzdHMKKyAgWmVybyA6PSAwOworICBpZiBGQ29ublRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICBPbmUgOj0gMTsKKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmV0IDo9IGNvbm5lY3QoU29ja2V0LCBSZXMuUmVzXi5haV9hZGRyXiwgUmVzLlJlc14uYWlfYWRkcmxlbik7CisgIGlmIFJldCA9IDAgdGhlbiBnb3RvIERvbmU7CisKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgaWYgKEVycm5vQ29weSA8PiBXU0FFSU5QUk9HUkVTUykgYW5kIChFcnJub0NvcHkgPD4gV1NBRVdPVUxEQkxPQ0spIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBjb25uZWN0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2Nvbm5lY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgRkRfWkVSTyhGZHMpOworICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgVFZhbC50dl9zZWMgOj0gRkNvbm5UaW1lb3V0IGRpdiAxMDAwOworICAgIFRWYWwudHZfdXNlYyA6PSAoRkNvbm5UaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgUFRWYWwgOj0gQFRWYWw7CisgIGVuZAorICBlbHNlCisgICAgUFRWYWwgOj0gbmlsOworICBSZXQgOj0gc2VsZWN0KDEsIG5pbCwgQEZkcywgbmlsLCBQVFZhbCk7CisKKyAgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgLy8gRW5zdXJlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBlcnJvcnMgc2V0CisgICAgTG9uIDo9IFNpemVPZihWYWwpOworICAgIFJldDIgOj0gZ2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBAVmFsLCBMb24pOworICAgIGlmIFJldDIgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGdldHNvY2tvcHQoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdnZXRzb2Nrb3B0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCisgICAgaWYgVmFsID0gMCB0aGVuIGdvdG8gRG9uZTsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHNlbGVjdCgpKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0IE9wZW5Db25uZWN0aW9uKCkgZXJyb3I6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShWYWwpXSkpOworICBlbmQKKyAgZWxzZSBpZiBSZXQgPSAwIHRoZW4gYmVnaW4KKyAgICAvLyBzb2NrZXQgdGltZWQgb3V0CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0ICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ09wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0Jyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gZXJyb3Igb24gc2VsZWN0KCkKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHNlbGVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzZWxlY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKK0RvbmU6CisgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCisgIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybyk7CisgIFNldENhY2hlZEFkZHJlc3MoUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Mb2NhbE9wZW47Cit2YXIKKyAgUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBSZXMgOj0gQ3JlYXRlU29ja2V0KEhvc3QsIFBvcnQpOworCisgIE9wZW5Db25uZWN0aW9uKFJlcyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7Cit2YXIKKyAgVGltZTogRFdPUkQ7CitiZWdpbgorICBpZiBTID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgVGltZSA6PSBUaW1lb3V0OworCisgIGlmIHNldHNvY2tvcHQoUywgU09MX1NPQ0tFVCwgT3B0TmFtZSwgQFRpbWUsIFNpemVPZihUaW1lKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnU2V0R2VuZXJpY1RpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Tm9EZWxheShBTm9EZWxheTogQm9vbGVhbik7Cit2YXIKKyAgVjogSW50ZWdlcjsKK2JlZ2luCisgIEZOb0RlbGF5IDo9IEFOb0RlbGF5OworICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBWIDo9IElmVGhlbihGTm9EZWxheSwgMSwgMCk7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIEBWLCBTaXplT2YoVikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRTb2NrZXRJbmZvOiBzdHJpbmc7CitiZWdpbgorICBpZiAoRkhvc3QgPSAnJykgb3IgKFBvcnQgPSAwKSB0aGVuCisgICAgUmVzdWx0IDo9ICc8SG9zdDogJyArIEdldFBlZXJBZGRyZXNzICsgJyBQb3J0OiAnICsgR2V0UGVlclBvcnQuVG9TdHJpbmcgKyAnPicKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBGSG9zdCArICcgUG9ydDogJyArIFBvcnQuVG9TdHJpbmcgKyAnPic7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckhvc3Q6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgMCk7CisgICAgRlBlZXJIb3N0IDo9IENsaWVudEhvc3Q7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVySG9zdDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVyQWRkcmVzczogc3RyaW5nOwordmFyCisgIEFkZHI6IFRTb2NrQWRkclN0b3JhZ2U7CisgIEFkZHJQdHI6IFBTb2NrQWRkcjsKKyAgQWRkckxlbjogSW50ZWdlcjsKKyAgQ2xpZW50SG9zdDogYXJyYXlbMC4uTklfTUFYSE9TVC0xXSBvZiBDaGFyOworICBDbGllbnRTZXJ2aWNlOiBhcnJheVswLi5OSV9NQVhTRVJWLTFdIG9mIENoYXI7CitiZWdpbgorICBpZiBGUGVlckFkZHJlc3MgPSAnJyB0aGVuIGJlZ2luCisgICAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChGUGVlckFkZHJlc3MpOworCisgICAgQWRkclB0ciA6PSBHZXRDYWNoZWRBZGRyZXNzKEFkZHJMZW4pOworICAgIGlmIEFkZHJQdHIgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgQWRkckxlbiA6PSBTaXplT2YoQWRkcik7CisgICAgICBpZiBnZXRwZWVybmFtZShTb2NrZXQsIFBTb2NrQWRkcihAQWRkcileLCBBZGRyTGVuKSA8PiAwIHRoZW4KKyAgICAgICAgRXhpdChGUGVlckhvc3QpOworICAgICAgQWRkclB0ciA6PSBQU29ja0FkZHIoQEFkZHIpOworICAgICAgU2V0Q2FjaGVkQWRkcmVzcyhBZGRyUHRyXiwgQWRkckxlbik7CisgICAgZW5kOworCisgICAgR2V0TmFtZUluZm9XKEFkZHJQdHJeLCBBZGRyTGVuLCBDbGllbnRIb3N0LCBOSV9NQVhIT1NULCBDbGllbnRTZXJ2aWNlLCBOSV9NQVhTRVJWLCBOSV9OVU1FUklDSE9TVCBvciBOSV9OVU1FUklDU0VSVik7CisgICAgRlBlZXJBZGRyZXNzIDo9IENsaWVudEhvc3Q7CisgICAgVHJ5U3RyVG9JbnQoQ2xpZW50U2VydmljZSwgRlBlZXJQb3J0KTsKKyAgZW5kOworICBSZXN1bHQgOj0gRlBlZXJBZGRyZXNzCitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlclBvcnQ6IEludGVnZXI7CitiZWdpbgorICBHZXRQZWVyQWRkcmVzczsKKyAgUmVzdWx0IDo9IEZQZWVyUG9ydDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRPcmlnaW46IHN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRQZWVySG9zdCArICc6JyArIEdldFBlZXJQb3J0LlRvU3RyaW5nOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFSZWN2VGltZW91dCwgU09fUkNWVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFTZW5kVGltZW91dCwgU09fU05EVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7Cit2YXIKKyAgVmFsdWU6IEludGVnZXI7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmUpOworCisgIFZhbHVlIDo9IElmVGhlbihLZWVwQWxpdmUsIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBAVmFsdWUsIFNpemVPZihWYWx1ZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBOb3QgbmVlZGVkLCBidXQganVzdCBhIHBsYWNlaG9sZGVyCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIEZIb3N0IDo9IEFIb3N0OworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworICBTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBBSW50ZXJydXB0TGlzdGVuZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0Lk9wZW47CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworICBMb2NhbE9wZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBJbml0UGVlckluZm87CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworbGFiZWwKKyAgVHJ5QWdhaW47Cit2YXIKKyAgUmV0cmllczogTG9uZ3dvcmQ7CisgIEVBZ2FpblRocmVzaG9sZCwKKyAgUmVhZEVsYXBzZWQ6IFVJbnQ2NDsKKyAgU3RhcnQ6IFREYXRlVGltZTsKKyAgR290OiBJbnRlZ2VyOworICBGZHM6IFRGZFNldDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQnKTsKKworICBSZXRyaWVzIDo9IDA7CisKKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCisgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAorICAvLyBUSFJJRlRfRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCisgIEVBZ2FpblRocmVzaG9sZCA6PSAwOworICBpZiBSZWN2VGltZW91dCA8PiAwIHRoZW4KKyAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KKyAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKKyAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycworICAgIEVBZ2FpblRocmVzaG9sZCA6PSBSZWN2VGltZW91dCBkaXYgSWZUaGVuKEZNYXhSZWN2UmV0cmllcyA+IDAsIEZNYXhSZWN2UmV0cmllcywgMik7CisKK1RyeUFnYWluOgorICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIFN0YXJ0IDo9IE5vdworICBlbHNlCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgIC8vIGFuIFRIUklGVF9FQUdBSU4gaXMgZHVlIHRvIGEgdGltZW91dCBvciBhbiBvdXQtb2YtcmVzb3VyY2UgY29uZGl0aW9uLgorICAgIFN0YXJ0IDo9IDA7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpOworICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgIFRWYWwudHZfdXNlYyA6PSAoUmVjdlRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgIGVuZDsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdJbnRlcnJ1cHRlZCcpOworICAgIGVuZAorICAgIGVsc2UgLy8gUmV0ID0gMAorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIGVuZDsKKworICBHb3QgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKKyAgaWYgR290IDwgMCB0aGVuIGJlZ2luCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbiBiZWdpbgorICAgICAgLy8gaWYgbm8gdGltZW91dCB3ZSBjYW4gYXNzdW1lIHRoYXQgcmVzb3VyY2UgZXhoYXVzdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICBpZiBSZWN2VGltZW91dCA9IDAgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCisgICAgICBSZWFkRWxhcHNlZCA6PSBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgU3RhcnQpOworICAgICAgaWYgKEVBZ2FpblRocmVzaG9sZCA9IDApIG9yIChSZWFkRWxhcHNlZCA8IEVBZ2FpblRocmVzaG9sZCkgdGhlbiBiZWdpbgorICAgICAgICBpZiBSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKyAgICBlbmQ7CisKKyAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgZW5kOworCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuCisgICAgICBFeGl0KDApOworCisgICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVOT1RDT05OIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRU5PVENPTk4nKTsKKworICAgIC8vIFRpbWVkIG91dCEKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFVElNRURPVVQgdGhlbgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXU0FFVElNRURPVVQnKTsKKworICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlJlYWQoKSByZWN2KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gR290OworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Xcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7Cit2YXIKKyAgU2VudCwgQjogSW50ZWdlcjsKK2JlZ2luCisgIFNlbnQgOj0gMDsKKyAgd2hpbGUgU2VudCA8IExlbiBkbyBiZWdpbgorICAgIEIgOj0gV3JpdGVQYXJ0aWFsKChQQnl0ZShAQnVmKSArIFNlbnQpXiwgTGVuIC0gU2VudCk7CisgICAgaWYgQiA9IDAgdGhlbgorICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ3NlbmQgdGltZW91dCBleHBpcmVkJyk7CisgICAgSW5jKFNlbnQsIEIpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBCOiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgQiA6PSBzZW5kKFNvY2tldCwgQnVmLCBMZW4sIDApOworCisgIGlmIEIgPCAwIHRoZW4gYmVnaW4KKyAgICAvLyBGYWlsIG9uIGEgc2VuZCBlcnJvcgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5Xcml0ZVBhcnRpYWwoKSBzZW5kKCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCkgb3IgKEVycm5vQ29weSA9IFdTQUVOT1RDT05OKSB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3dyaXRlKCkgc2VuZCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAorICBpZiBCID0gMCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdTb2NrZXQgc2VuZCByZXR1cm5lZCAwLicpOworCisgIFJlc3VsdCA6PSBCOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKK2JlZ2luCisgIGNhc2UgRkNhY2hlZFBlZXJBZGRyLmlwdjQuc2luX2ZhbWlseSBvZgorICAgIEFGX0lORVQ6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluKTsKKyAgICAgIFJlc3VsdCA6PSBQU29ja0FkZHIoQEZDYWNoZWRQZWVyQWRkci5pcHY0KTsKKyAgICBlbmQ7CisgICAgQUZfSU5FVDY6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluNik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2Nik7CisgICAgZW5kOworICBlbHNlCisgICAgTGVuIDo9IDA7CisgICAgUmVzdWx0IDo9IG5pbDsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGNhc2UgQWRkci5zYV9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBpZiBMZW4gPSBTaXplT2YoVFNvY2tBZGRySW4pIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjQgOj0gUFNvY2tBZGRySW4oQEFkZHIpXjsKKyAgICBBRl9JTkVUNjogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluNikgdGhlbiBGQ2FjaGVkUGVlckFkZHIuaXB2NiA6PSBQU29ja0FkZHJJbjYoQEFkZHIpXjsKKyAgZW5kOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVySG9zdCA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKK3ZhcgorICBMOiBUTGluZ2VyOworYmVnaW4KKyAgRkxpbmdlck9uIDo9IExpbmdlck9uOworICBGTGluZ2VyVmFsIDo9IExpbmdlclZhbDsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgTC5sX29ub2ZmIDo9IElmVGhlbihGTGluZ2VyT24sIDEsIDApOworICBMLmxfbGluZ2VyIDo9IExpbmdlclZhbDsKKworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATCwgU2l6ZU9mKEwpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldExpbmdlcigpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5QZWVrOiBCb29sZWFuOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBGZHM6IFRGZFNldDsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIEJ1ZjogQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4gdGhlbiBFeGl0KEZhbHNlKTsKKworICBpZiBBc3NpZ25lZChGSW50ZXJydXB0TGlzdGVuZXIpIHRoZW4gYmVnaW4KKyAgICBSZXRyaWVzIDo9IDA7CisgICAgd2hpbGUgdHJ1ZSBkbyBiZWdpbgorICAgICAgRkRfWkVSTyhGZHMpOworICAgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIFRWYWwudHZfc2VjIDo9IFJlY3ZUaW1lb3V0IGRpdiAxMDAwOworICAgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgICBDb250aW51ZTsKKyAgICAgICAgZW5kOworICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICAgIGlmIEZEX0lTU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKSB0aGVuCisgICAgICAgICAgRXhpdChGYWxzZSk7CisgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZGF0YSBvciBhIGRpc2Nvbm5lY3Rpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgUEVFSworICAgICAgICBCcmVhazsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyB0aW1lb3V0CisgICAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvciBpZiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkCisgIFJldCA6PSByZWN2KFNvY2tldCwgQnVmLCAxLCBNU0dfUEVFSyk7CisgIGlmIFJldCA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUIHRoZW4gYmVnaW4KKyAgICAgIENsb3NlOworICAgICAgRXhpdChGYWxzZSk7CisgICAgZW5kOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5QZWVrKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ3JlY3YoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IFJldCA+IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworYmVnaW4KKyAgaWYgRkludGVycnVwdGFibGVDaGlsZHJlbiB0aGVuCisgICAgUmVzdWx0IDo9IFRTb2NrZXQuQ3JlYXRlKENsaWVudCwgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcikKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Ob3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7Cit2YXIKKyAgQnl0OiBCeXRlOworYmVnaW4KKyAgaWYgTm90aWZ5U29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBCeXQgOj0gMDsKKyAgICBpZiBzZW5kKE5vdGlmeVNvY2tldCwgQnl0LCBTaXplT2YoQnl0KSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lk5vdGlmeSgpIHNlbmQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5TZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIEZMaXN0ZW5pbmcgdGhlbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0ludGVycnVwdGFibGVDaGlsZHJlbiBjYW5ub3QgYmUgc2V0IGFmdGVyIGxpc3RlbigpJyk7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gQVZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gVHJ1ZTsKKyAgRkFjY2VwdEJhY2tsb2cgOj0gREVGQVVMVF9CQUNLTE9HOworICBGQWNjZXB0VGltZW91dCA6PSAwOworICBGUmV0cnlMaW1pdCA6PSAwOworICBGUmV0cnlEZWxheSA6PSAwOworICBGVGNwU2VuZEJ1ZmZlciA6PSAwOworICBGVGNwUmVjdkJ1ZmZlciA6PSAwOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBVbm5lY2Vzc2FyeSwgYnV0IGhlcmUgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMKKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFTZW5kVGltZW91dCwgQVJlY3ZUaW1lb3V0OiBMb25nd29yZDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgU2VuZFRpbWVvdXQgOj0gQVNlbmRUaW1lb3V0OworICBSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGQWRkcmVzcyA6PSBBQWRkcmVzczsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTGlzdGVuOworCisgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldFBhaXIodmFyIFJlYWRlciwgV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IEludGVnZXI7CisgIGxhYmVsCisgICAgRXJyb3I7CisgIHR5cGUKKyAgICBUU0FVbmlvbiA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGluYWRkcjogVFNvY2tBZGRySW4pOworICAgICAgMTogKGFkZHI6IFRTb2NrQWRkcik7CisgICAgZW5kOworICB2YXIKKyAgICBhOiBUU0FVbmlvbjsKKyAgICBsaXN0ZW5lcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgICAgZTogSW50ZWdlcjsKKyAgICBhZGRybGVuOiBJbnRlZ2VyOworICAgIGZsYWdzOiBEV09SRDsKKyAgICByZXVzZTogSW50ZWdlcjsKKyAgYmVnaW4KKyAgICBhZGRybGVuIDo9IFNpemVPZihhLmluYWRkcik7CisgICAgZmxhZ3MgOj0gMDsKKyAgICByZXVzZSA6PSAxOworCisgICAgbGlzdGVuZXIgOj0gV2luYXBpLldpbnNvY2syLnNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICAgIGlmIGxpc3RlbmVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChTT0NLRVRfRVJST1IpOworCisgICAgRmlsbENoYXIoYSwgU2l6ZU9mKGEpLCAwKTsKKyAgICBhLmluYWRkci5zaW5fZmFtaWx5IDo9IEFGX0lORVQ7CisgICAgYS5pbmFkZHIuc2luX2FkZHIuc19hZGRyIDo9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisgICAgYS5pbmFkZHIuc2luX3BvcnQgOj0gMDsKKyAgICBSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgICAgV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworCisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgSW50ZWdlcihTT19FWENMVVNJVkVBRERSVVNFKSwgQHJldXNlLCBTaXplT2YocmV1c2UpKTsKKyAgICBpZiBiaW5kKGxpc3RlbmVyLCBhLmFkZHIsIFNpemVPZihhLmluYWRkcikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBnZXRzb2NrbmFtZShsaXN0ZW5lciwgYS5hZGRyLCBhZGRybGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgV2luYXBpLldpbnNvY2syLmxpc3RlbihsaXN0ZW5lciwgMSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFJlYWRlciA6PSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIG5pbCwgMCwgZmxhZ3MpOworICAgIGlmIFJlYWRlciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBjb25uZWN0KFJlYWRlciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgV3JpdGVyIDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQobGlzdGVuZXIsIG5pbCwgbmlsKTsKKyAgICBpZiBXcml0ZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIEV4aXQoMCk7CisKKyAgRXJyb3I6CisgICAgZSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIGNsb3Nlc29ja2V0KFJlYWRlcik7CisgICAgY2xvc2Vzb2NrZXQoV3JpdGVyKTsKKyAgICBXU0FTZXRMYXN0RXJyb3IoZSk7CisgICAgUmVzdWx0IDo9IFNPQ0tFVF9FUlJPUjsKKyAgZW5kOworCit2YXIKKyAgVGVtcEludFJlYWRlciwKKyAgVGVtcEludFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIE9uZTogQ2FyZGluYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgTGluZzogVExpbmdlcjsKKyAgUmV0cmllczogSW50ZWdlcjsKKyAgQWRkckluZm86IElHZXRBZGRySW5mb1dyYXBwZXI7CisgIFNBOiBUU29ja0FkZHJTdG9yYWdlOworICBMZW46IEludGVnZXI7CitiZWdpbgorICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0CisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgSW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRlbXBJbnRSZWFkZXI7CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQgYWxsIGNsaWVudHMKKyAgaWYgQ3JlYXRlU29ja2V0UGFpcihUZW1wSW50UmVhZGVyLCBUZW1wSW50V3JpdGVyKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIENyZWF0ZVNvY2tldFBhaXIoKSBDaGlsZEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShJTlZBTElEX1NPQ0tFVCwgbmlsKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKFRlbXBJbnRSZWFkZXIsIERlc3Ryb3llck9mRmluZVNvY2tldHMpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIGlmIChQb3J0IDwgMCkgb3IgKFBvcnQgPiAkRkZGRikgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZSgnU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCcpOworCisgIEFkZHJJbmZvIDo9IENyZWF0ZVNvY2tldChGQWRkcmVzcywgUG9ydCk7CisKKyAgLy8gU2V0IFNPX0VYQ0xVU0lWRUFERFJVU0UgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBPbmUgOj0gMTsKKyAgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEBvbmUsIFNpemVPZihPbmUpKTsKKyAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgIC8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiBGVGNwU2VuZEJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIEBGVGNwU2VuZEJ1ZmZlciwgU2l6ZU9mKEZUY3BTZW5kQnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19TTkRCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZUY3BSZWN2QnVmZmVyID4gMCB0aGVuIGJlZ2luCisgICAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgQEZUY3BSZWN2QnVmZmVyLCBTaXplT2YoRlRjcFJlY3ZCdWZmZXIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIExpbmcubF9vbm9mZiA6PSAwOworICBMaW5nLmxfbGluZ2VyIDo9IDA7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIEBMaW5nLCBTaXplT2YoTGluZykpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fTElOR0VSOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAT25lLCBTaXplT2YoT25lKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIEZJT05CSU86ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIFJldHJpZXMgOj0gMDsKKyAgd2hpbGUgVHJ1ZSBkbyBiZWdpbgorICAgIGlmIGJpbmQoU29ja2V0LCBBZGRySW5mby5SZXNeLmFpX2FkZHJeLCBBZGRySW5mby5SZXNeLmFpX2FkZHJsZW4pID0gMCB0aGVuCisgICAgICBCcmVhazsKKyAgICBJbmMoUmV0cmllcyk7CisgICAgaWYgUmV0cmllcyA+IEZSZXRyeUxpbWl0IHRoZW4KKyAgICAgIEJyZWFrOworICAgIFNsZWVwKEZSZXRyeURlbGF5ICogMTAwMCk7CisgIGVuZDsKKworICAvLyByZXRyaWV2ZSBiaW5kIGluZm8KKyAgaWYgKFBvcnQgPSAwKSBhbmQgKFJldHJpZXMgPCBGUmV0cnlMaW1pdCkgdGhlbiBiZWdpbgorICAgIExlbiA6PSBTaXplT2YoU0EpOworICAgIEZpbGxDaGFyKFNBLCBMZW4sIDApOworICAgIGlmIGdldHNvY2tuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBTQSleLCBMZW4pID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBnZXRzb2NrbmFtZSgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpCisgICAgZWxzZSBiZWdpbgorICAgICAgaWYgU0Euc3NfZmFtaWx5ID0gQUZfSU5FVDYgdGhlbgorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluNihAU0EpXi5zaW42X3BvcnQpCisgICAgICBlbHNlCisgICAgICAgIFBvcnQgOj0gbnRvaHMoUFNvY2tBZGRySW4oQFNBKV4uc2luX3BvcnQpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChSZXRyaWVzID4gRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQklORCAlZCcsIFtQb3J0XSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBiaW5kOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKEZMaXN0ZW5DYWxsYmFjaykgdGhlbgorICAgIEZMaXN0ZW5DYWxsYmFjayhTb2NrZXQpOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4oU29ja2V0LCBGQWNjZXB0QmFja2xvZykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGxpc3RlbigpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBsaXN0ZW46ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkFjY2VwdDogVFNvY2tldDsKK3ZhcgorICBGZHM6IFRGZFNldDsKKyAgTWF4RUludGVycywKKyAgTnVtRUludGVyczogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CisgIENsaWVudEFkZHJlc3M6IFRTb2NrQWRkclN0b3JhZ2U7CisgIFNpemU6IEludGVnZXI7CisgIENsaWVudFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIFplcm86IENhcmRpbmFsOworICBDbGllbnQ6IFRTb2NrZXQ7CisgIFJldDogSW50ZWdlcjsKK2JlZ2luCisgIE1heEVJbnRlcnMgOj0gNTsKKyAgTnVtRUludGVycyA6PSAwOworCisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBGRF9aRVJPKEZkcyk7CisgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgX0ZEX1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKTsKKyAgICBpZiBGQWNjZXB0VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gRkFjY2VwdFRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKEZBY2NlcHRUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAvLyBUT0RPOiBpZiBXU0FFSU5UUiBpcyByZWNlaXZlZCwgd2UnbGwgcmVzdGFydCB0aGUgdGltZW91dC4KKyAgICAvLyBUbyBiZSBhY2N1cmF0ZSwgd2UgbmVlZCB0byBmaXggdGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChXU0FHZXRMYXN0RXJyb3IgPSBXU0FFSU5UUikgYW5kIChOdW1FSW50ZXJzIDwgTWF4RUludGVycykgdGhlbiBiZWdpbgorICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgSW5jKE51bUVJbnRlcnMpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKKyAgICAgIGlmIChGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCkgYW5kIEZEX0lTU0VUKEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBGZHMpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgcmVjdihGSW50ZXJydXB0U29ja1JlYWRlciwgQnVmLCBTaXplT2YoQnVmKSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSByZWN2KCkgaW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdpbnRlcnJ1cHRlZCcpOworICAgICAgZW5kOworCisgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGJlaW5nIHJlYWR5CisgICAgICBpZiBGRF9JU1NFVChTb2NrZXQsIEZkcykgdGhlbgorICAgICAgICBCcmVhazsKKyAgICBlbmQKKyAgICBlbHNlIGJlZ2luCisgICAgICBMb2dEZWxlZ2F0ZSgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBzZWxlY3QoKSAwJyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ3Vua25vd24gZXJyb3InKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBTaXplIDo9IFNpemVPZihDbGllbnRBZGRyZXNzKTsKKyAgQ2xpZW50U29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQoU29ja2V0LCBAQ2xpZW50QWRkcmVzcywgQFNpemUpOworICBpZiBDbGllbnRTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgYWNjZXB0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnYWNjZXB0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKKyAgWmVybyA6PSAwOworICBpZiBpb2N0bHNvY2tldChDbGllbnRTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KENsaWVudFNvY2tldCk7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIENsaWVudCA6PSBDcmVhdGVTb2NrZXRPYmooQ2xpZW50U29ja2V0KTsKKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4KKyAgICBDbGllbnQuU2VuZFRpbWVvdXQgOj0gU2VuZFRpbWVvdXQ7CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFJlY3ZUaW1lb3V0OworICBpZiBLZWVwQWxpdmUgdGhlbgorICAgIENsaWVudC5LZWVwQWxpdmUgOj0gS2VlcEFsaXZlOworICBDbGllbnQuU2V0Q2FjaGVkQWRkcmVzcyhQU29ja0FkZHIoQENsaWVudEFkZHJlc3MpXiwgU2l6ZSk7CisKKyAgaWYgQXNzaWduZWQoRkFjY2VwdENhbGxiYWNrKSB0aGVuCisgICAgRkFjY2VwdENhbGxiYWNrKENsaWVudFNvY2tldCk7CisKKyAgUmVzdWx0IDo9IENsaWVudDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0OworYmVnaW4KKyAgTm90aWZ5KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0Q2hpbGRyZW47CitiZWdpbgorICBOb3RpZnkoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBpZiBGSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tXcml0ZXIpOworICBpZiBGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tSZWFkZXIpOworICBpZiBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgIEZMaXN0ZW5pbmcgOj0gRmFsc2U7CitlbmQ7CisKK3skRU5ESUZ9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwOGM1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCkBAIC0wLDAgKzEsMzE5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlN0cmVhbTsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIFN5c0NvbnN0LAorICBSVExDb25zdHMsCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIEFjdGl2ZVgsCisgIHskRUxTRX0KKyAgV2luYXBpLkFjdGl2ZVgsCisgIHskRU5ESUZ9CisgIFRocmlmdC5VdGlsczsKKwordHlwZQorCisgIElUaHJpZnRTdHJlYW0gPSBpbnRlcmZhY2UKKyAgICBbJ3syQTc3RDkxNi03NDQ2LTQ2QzEtODU0NS0wQUVDMDAwOERCQ0F9J10KKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBPcGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJlYW1JbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0U3RyZWFtKQorICBwcml2YXRlCisgICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBPcGVuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IHZpcnR1YWw7IGFic3RyYWN0OworICBlbmQ7CisKKyAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwgKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IFRTdHJlYW07CisgICAgRk93bnNTdHJlYW0gOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBUU3RyZWFtOyBBT3duc1N0cmVhbSA6IEJvb2xlYW4pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCkKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gOiBJU3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJU3RyZWFtKTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit7IFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNsb3NlOworYmVnaW4KKyAgRlN0cmVhbSA6PSBuaWw7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtIDo9IEFTdHJlYW07CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5GbHVzaDsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlN0cmVhbS5Db21taXQoIFNUR0NfREVGQVVMVCApOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlN0cmVhbSA8PiBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5PcGVuOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIFJlc3VsdCA6PSAwOworICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZTdHJlYW0uUmVhZCggcFRtcCwgY291bnQsIEBSZXN1bHQpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIKKyAgc3RhdHN0ZzogVFN0YXRTdGc7CisgIGxlbiA6IEludGVnZXI7CisgIE5ld1BvcyA6IHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDI5LjB9IFVJbnQ2NCB7JEVMU0V9IEludDY0ICB7JElGRU5EfTsKKyAgY2JSZWFkIDogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKCBzdGF0c3RnLCBTaXplT2YoIHN0YXRzdGcpLCAwKTsKKyAgbGVuIDo9IDA7CisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlN0YXQoIHN0YXRzdGcsIFNUQVRGTEFHX05PTkFNRSApKSB0aGVuIGJlZ2luCisgICAgICBsZW4gOj0gc3RhdHN0Zy5jYlNpemU7CisgICAgZW5kOworICBlbmQ7CisKKyAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TZWVrKCAwLCBTVFJFQU1fU0VFS19TRVQsIE5ld1BvcykgKSB0aGVuIGJlZ2luCisgICAgICBGU3RyZWFtLlJlYWQoIEBSZXN1bHRbMF0sIGxlbiwgQGNiUmVhZCk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgcEJ1ZjogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgbldyaXR0ZW4gOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5Xcml0ZSggcFRtcCwgY291bnQsIEBuV3JpdHRlbik7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3sgVFRocmlmdFN0cmVhbUltcGwgfQorCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CitiZWdpbgorICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIChvZmZzZXQgPCAwKSBvciAoIG9mZnNldCA+PSBidWZsZW4pIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CisgICAgZW5kOworICAgIGlmIGNvdW50ID4gYnVmbGVuIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQodmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWZmZXIpID4gMAorICB0aGVuIFJlc3VsdCA6PSBSZWFkKCBAYnVmZmVyWzBdLCBMZW5ndGgoYnVmZmVyKSwgb2Zmc2V0LCBjb3VudCkKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZmZlclswXSwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBwQnVmLCBvZmZzZXQrY291bnQsIG9mZnNldCwgY291bnQpOworZW5kOworCit7IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNsb3NlOworYmVnaW4KKyAgRlN0cmVhbS5GcmVlOworICBGU3RyZWFtIDo9IG5pbDsKKyAgRk93bnNTdHJlYW0gOj0gRmFsc2U7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW06IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworICBGT3duc1N0cmVhbSA6PSBBT3duc1N0cmVhbTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNTdHJlYW0gCisgIHRoZW4gQ2xvc2U7CisgIAorICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5GbHVzaDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdHJlYW0gPD4gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuT3BlbjsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBwVG1wXiwgY291bnQpCisgIGVuZAorICBlbHNlIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIKKyAgT3JnUG9zIDogSW50ZWdlcjsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuCisgIGJlZ2luCisgICAgbGVuIDo9IEZTdHJlYW0uU2l6ZTsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKKworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBPcmdQb3MgOj0gRlN0cmVhbS5Qb3NpdGlvbjsKKyAgICB0cnkKKyAgICAgIEZTdHJlYW0uUG9zaXRpb24gOj0gMDsKKyAgICAgIEZTdHJlYW0uUmVhZEJ1ZmZlciggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOworICAgIGZpbmFsbHkKKyAgICAgIEZTdHJlYW0uUG9zaXRpb24gOj0gT3JnUG9zOworICAgIGVuZDsKKyAgZW5kCitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgRlN0cmVhbS5Xcml0ZSggcFRtcF4sIGNvdW50KQorICBlbmQ7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhMzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCkBAIC0wLDAgKzEsMTA0NCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQordW5pdCBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzOworCit7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK2ludGVyZmFjZQorCit1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIFdpbmRvd3MsIFN5c1V0aWxzLCBNYXRoLCBBY2NDdHJsLCBBY2xBUEksIFN5bmNPYmpzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBXaW5hcGkuQWNjQ3RybCwgV2luYXBpLkFjbEFQSSwgU3lzdGVtLlN5bmNPYmpzLAorICB7JEVORElGfQorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdC5TdHJlYW07CisKK2NvbnN0CisgIERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUID0gMTA7ICAvLyBkZWZhdWx0OiBmYWlsIGZhc3Qgb24gb3BlbgorCisKK3R5cGUKKyAgLy8tLS0gUGlwZSBTdHJlYW1zIC0tLQorCisKKyAgVFBpcGVTdHJlYW1CYXNlID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRlBpcGUgICAgOiBUSGFuZGxlOworICAgIEZUaW1lb3V0IDogRFdPUkQ7CisgICAgRk9wZW5UaW1lT3V0IDogRFdPUkQ7ICAvLyBzZXBhcmF0ZSB2YWx1ZSB0byBhbGxvdyBmb3IgZmFpbC1mYXN0LW9uLW9wZW4gc2NlbmFyaW9zCisgICAgRk92ZXJsYXBwZWQgOiBCb29sZWFuOworCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICAvL3Byb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsgLSBzZWUgZGVyaXZlZCBjbGFzc2VzCisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gIFJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVTdHJlYW1JbXBsID0gY2xhc3Mgc2VhbGVkKCBUUGlwZVN0cmVhbUJhc2UpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlBpcGVOYW1lICA6IHN0cmluZzsKKyAgICBGU2hhcmVNb2RlIDogRFdPUkQ7CisgICAgRlNlY3VyaXR5QXR0cmlicyA6IFBTZWN1cml0eUF0dHJpYnV0ZXM7CisKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIFRIYW5kbGVQaXBlU3RyZWFtSW1wbCA9IGNsYXNzIHNlYWxlZCggVFBpcGVTdHJlYW1CYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTcmNIYW5kbGUgOiBUSGFuZGxlOworCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3duc0hhbmRsZSwgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIC8vLS0tIFBpcGUgVHJhbnNwb3J0cyAtLS0KKworCisgIElQaXBlVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJU3RyZWFtVHJhbnNwb3J0KQorICAgIFsnezVFMDVDQzg1LTQzNEYtNDI4Ri1CRkIyLTg1NkExNjhCNTU1OH0nXQorICBlbmQ7CisKKworICBUUGlwZVRyYW5zcG9ydEJhc2UgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwsIElQaXBlVHJhbnNwb3J0KQorICBwdWJsaWMKKyAgICAvLyBJVHJhbnNwb3J0CisgICAgZnVuY3Rpb24gIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsID0gY2xhc3MoIFRQaXBlVHJhbnNwb3J0QmFzZSkKKyAgcHVibGljCisgICAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlcyA9IG5pbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgZW5kOworCisKKyAgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwgPSBjbGFzcyggVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkhhbmRsZSA6IFRIYW5kbGU7CisgIHB1YmxpYworICAgIC8vIElUcmFuc3BvcnQKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZSA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7IHJlaW50cm9kdWNlOworICBlbmQ7CisKKworICBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVUcmFuc3BvcnRCYXNlKQorICBwdWJsaWMKKyAgICAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7IG92ZXJsb2FkOworICBlbmQ7CisKKworICAvLy0tLSBTZXJ2ZXIgVHJhbnNwb3J0cyAtLS0KKworCisgIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJU2VydmVyVHJhbnNwb3J0KQorICAgIFsnezdBRUU2NzkzLTQ3QjktNEU0OS05ODFBLUMzOUU5MTA4RTlBRH0nXQorICAgIC8vIFNlcnZlciBzaWRlIGFub255bW91cyBwaXBlIGVuZHMKKyAgICBmdW5jdGlvbiBSZWFkSGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXcml0ZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgLy8gQ2xpZW50IHNpZGUgYW5vbnltb3VzIHBpcGUgZW5kcworICAgIGZ1bmN0aW9uIENsaWVudEFub25SZWFkIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKKyAgZW5kOworCisKKyAgSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCA9IGludGVyZmFjZSggSVNlcnZlclRyYW5zcG9ydCkKKyAgICBbJ3s5REY5RUU0OC1EMDY1LTQwQUYtOEY2Ny1EMzMwMzdEM0Q5NjB9J10KKyAgICBmdW5jdGlvbiBIYW5kbGUgOiBUSGFuZGxlOworICBlbmQ7CisKKworICBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UgPSBjbGFzcyggVFNlcnZlclRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBGU3RvcFNlcnZlciA6IFRFdmVudDsKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUXVlcnlTdG9wU2VydmVyIDogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBMaXN0ZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UsIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZCdWZTaXplICAgICAgOiBEV09SRDsKKworICAgIC8vIFNlcnZlciBzaWRlIGFub255bW91cyBwaXBlIGhhbmRsZXMKKyAgICBGUmVhZEhhbmRsZSwKKyAgICBGV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworCisgICAgLy9DbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgICAgRkNsaWVudEFub25SZWFkLAorICAgIEZDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKKworICAgIEZUaW1lT3V0OiBEV09SRDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gQ3JlYXRlQW5vblBpcGUgOiBCb29sZWFuOworCisgICAgLy8gSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQKKyAgICBmdW5jdGlvbiBSZWFkSGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXcml0ZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIENsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOworCisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5NjsgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UsIElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlBpcGVOYW1lICAgICA6IHN0cmluZzsKKyAgICBGTWF4Q29ubnMgICAgIDogRFdPUkQ7CisgICAgRkJ1ZlNpemUgICAgICA6IERXT1JEOworICAgIEZUaW1lb3V0ICAgICAgOiBEV09SRDsKKyAgICBGSGFuZGxlICAgICAgIDogVEhhbmRsZTsKKyAgICBGQ29ubmVjdGVkICAgIDogQm9vbGVhbjsKKworCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBBY2NlcHQoY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gQ3JlYXRlTmFtZWRQaXBlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBDcmVhdGVUcmFuc3BvcnRJbnN0YW5jZSA6IElUcmFuc3BvcnQ7CisKKyAgICAvLyBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0CisgICAgZnVuY3Rpb24gSGFuZGxlIDogVEhhbmRsZTsKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZW5hbWUgOiBzdHJpbmc7IGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2OworICAgICAgICAgICAgICAgICAgICAgICAgYU1heENvbm5zIDogQ2FyZGluYWwgPSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVM7CisgICAgICAgICAgICAgICAgICAgICAgICBhVGltZU91dCA6IENhcmRpbmFsID0gSU5GSU5JVEUpOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCitwcm9jZWR1cmUgQ2xvc2VQaXBlSGFuZGxlKCB2YXIgaFBpcGUgOiBUSGFuZGxlKTsKK2JlZ2luCisgIGlmIGhQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFCisgIHRoZW4gdHJ5CisgICAgQ2xvc2VIYW5kbGUoIGhQaXBlKTsKKyAgZmluYWxseQorICAgIGhQaXBlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gRHVwbGljYXRlUGlwZUhhbmRsZSggY29uc3QgaFNvdXJjZSA6IFRIYW5kbGUpIDogVEhhbmRsZTsKK2JlZ2luCisgIGlmIG5vdCBEdXBsaWNhdGVIYW5kbGUoIEdldEN1cnJlbnRQcm9jZXNzLCBoU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcywgQHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUykKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0R1cGxpY2F0ZUhhbmRsZTogJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CitlbmQ7CisKKworCit7IFRQaXBlU3RyZWFtQmFzZSB9CisKKworY29uc3RydWN0b3IgVFBpcGVTdHJlYW1CYXNlLkNyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsgIC8vIGFPcGVuVGltZW91dCBtYXkgYmUgMAorICBGUGlwZSAgICAgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgICA6PSBhVGltZU91dDsKKyAgRk9wZW5UaW1lT3V0IDo9IGFPcGVuVGltZU91dDsKKyAgRk92ZXJsYXBwZWQgIDo9IGFFbmFibGVPdmVybGFwcGVkOworZW5kOworCisKK2Rlc3RydWN0b3IgVFBpcGVTdHJlYW1CYXNlLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBDbG9zZTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5DbG9zZTsKK2JlZ2luCisgIENsb3NlUGlwZUhhbmRsZSggRlBpcGUpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuRmx1c2g7CitiZWdpbgorICBGbHVzaEZpbGVCdWZmZXJzKCBGUGlwZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSAoRlBpcGUgPD4gSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50IDogSW50ZWdlcik7CitiZWdpbgorICBpZiBGT3ZlcmxhcHBlZAorICB0aGVuIFdyaXRlT3ZlcmxhcHBlZCggcEJ1Ziwgb2Zmc2V0LCBjb3VudCkKKyAgZWxzZSBXcml0ZURpcmVjdCggcEJ1Ziwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZPdmVybGFwcGVkCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpCisgIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZURpcmVjdCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIGNiV3JpdHRlbiwgbkJ5dGVzIDogRFdPUkQ7CisgICAgcERhdGEgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBuaWwpCisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dyaXRlIHRvIHBpcGUgZmFpbGVkJyk7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIGNiV3JpdHRlbiwgZHdXYWl0LCBkd0Vycm9yLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgcERhdGEgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKyAgICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgcERhdGFeLCBuQnl0ZXMsIGNiV3JpdHRlbiwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOworICAgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgorICAgICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOworCisgICAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkgdGhlbiBiZWdpbgorICAgICAgICAgICAgQ2FuY2VsSW8oIEZQaXBlKTsgIC8vIHByZXZlbnRzIHBvc3NpYmxlIEFWIG9uIGludmFsaWQgb3ZlcmxhcHBlZCBwdHIKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgd3JpdGUgdGltZWQgb3V0Jyk7CisgICAgICAgICAgZW5kOworCisgICAgICAgICAgaWYgKGR3V2FpdCA8PiBXQUlUX09CSkVDVF8wKQorICAgICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYldyaXR0ZW4sIFRSVUUpCisgICAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1BpcGUgd3JpdGUgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIEFTU0VSVCggRFdPUkQobkJ5dGVzKSA9IGNiV3JpdHRlbik7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZERpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3RXJyLCBuUmVtYWluaW5nICA6IERXT1JEOworICAgIGJ5dGVzLCByZXRyaWVzICA6IExvbmdJbnQ7CisgICAgYk9rICAgICA6IEJvb2xlYW47CisgICAgcERhdGEgICA6IFBCeXRlOworY29uc3QgSU5URVJWQUwgPSAxMDsgIC8vIG1zCitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgLy8gTVNETjogSGFuZGxlIGNhbiBiZSBhIGhhbmRsZSB0byBhIG5hbWVkIHBpcGUgaW5zdGFuY2UsCisgIC8vIG9yIGl0IGNhbiBiZSBhIGhhbmRsZSB0byB0aGUgcmVhZCBlbmQgb2YgYW4gYW5vbnltb3VzIHBpcGUsCisgIC8vIFRoZSBoYW5kbGUgbXVzdCBoYXZlIEdFTkVSSUNfUkVBRCBhY2Nlc3MgdG8gdGhlIHBpcGUuCisgIGlmIEZUaW1lT3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZUaW1lT3V0IC8gSU5URVJWQUwpKTsKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICBpZiBub3QgUGVla05hbWVkUGlwZSggRlBpcGUsIG5pbCwgMCwgbmlsLCBAYnl0ZXMsIG5pbCkgdGhlbiBiZWdpbgorICAgICAgICBkd0VyciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICAgIGlmIChkd0VyciA9IEVSUk9SX0lOVkFMSURfSEFORExFKQorICAgICAgICBvciAoZHdFcnIgPSBFUlJPUl9CUk9LRU5fUElQRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfUElQRV9OT1RfQ09OTkVDVEVEKQorICAgICAgICB0aGVuIGJlZ2luCisgICAgICAgICAgcmVzdWx0IDo9IDA7ICAvLyBvdGhlciBzaWRlIGNsb3NlZCB0aGUgcGlwZQorICAgICAgICAgIEV4aXQ7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBieXRlcyA+IDAgdGhlbiBiZWdpbgorICAgICAgICBCcmVhazsgIC8vIHRoZXJlIGFyZSBkYXRhCisgICAgICBlbmQ7CisKKyAgICAgIERlYyggcmV0cmllcyk7CisgICAgICBpZiByZXRyaWVzID4gMAorICAgICAgdGhlbiBTbGVlcCggSU5URVJWQUwpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICByZXN1bHQgOj0gMDsKKyAgblJlbWFpbmluZyA6PSBjb3VudDsKKyAgcERhdGEgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgblJlbWFpbmluZyA+IDAgZG8gYmVnaW4KKyAgICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgbmlsKTsKKyAgICBpZiAobm90IGJPaykgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgICAgdGhlbiBCcmVhazsgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCisKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIGNiUmVhZCwgZHdXYWl0LCBkd0Vycm9yLCBuUmVtYWluaW5nIDogRFdPUkQ7CisgICAgYk9rICAgICA6IEJvb2xlYW47CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhICAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKKworICByZXN1bHQgOj0gMDsKKyAgblJlbWFpbmluZyA6PSBjb3VudDsKKyAgcERhdGEgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgblJlbWFpbmluZyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisKKyAgICAgLy8gcmVhZCB0aGUgZGF0YQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOworICAgIGlmIG5vdCBiT2sgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CisKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JSZWFkLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHJlYWQgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIEFTU0VSVCggY2JSZWFkID4gMCk7ICAvLyBzZWUgVFRyYW5zcG9ydEltcGwuUmVhZEFsbCgpCisgICAgQVNTRVJUKCBjYlJlYWQgPD0gRFdPUkQoblJlbWFpbmluZykpOworICAgIERlYyggblJlbWFpbmluZywgY2JSZWFkKTsKKyAgICBJbmMoIHBEYXRhLCBjYlJlYWQpOworICAgIEluYyggcmVzdWx0LCBjYlJlYWQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlRvQXJyYXk6IFRCeXRlczsKK3ZhciBieXRlcyA6IExvbmdJbnQ7CitiZWdpbgorICBTZXRMZW5ndGgoIHJlc3VsdCwgMCk7CisgIGJ5dGVzIDo9IDA7CisKKyAgaWYgIElzT3BlbgorICBhbmQgUGVla05hbWVkUGlwZSggRlBpcGUsIG5pbCwgMCwgbmlsLCBAYnl0ZXMsIG5pbCkKKyAgYW5kIChieXRlcyA+IDApCisgIHRoZW4gYmVnaW4KKyAgICBTZXRMZW5ndGgoIHJlc3VsdCwgYnl0ZXMpOworICAgIFJlYWQoIHJlc3VsdCwgMCwgYnl0ZXMpOworICBlbmQ7CitlbmQ7CisKKworeyBUTmFtZWRQaXBlU3RyZWFtSW1wbCB9CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCwgYVRpbWVvdXQsIGFPcGVuVGltZU91dCk7CisKKyAgRlBpcGVOYW1lICAgICAgICA6PSBhUGlwZU5hbWU7CisgIEZTaGFyZU1vZGUgICAgICAgOj0gYVNoYXJlTW9kZTsKKyAgRlNlY3VyaXR5QXR0cmlicyA6PSBhU2VjdXJpdHlBdHRyaWJ1dGVzOworCisgIGlmIENvcHkoRlBpcGVOYW1lLDEsMikgPD4gJ1xcJworICB0aGVuIEZQaXBlTmFtZSA6PSAnXFwuXHBpcGVcJyArIEZQaXBlTmFtZTsgIC8vIGFzc3VtZSBsb2NhbGhvc3QKK2VuZDsKKworCitwcm9jZWR1cmUgVE5hbWVkUGlwZVN0cmVhbUltcGwuT3BlbjsKK3ZhciBoUGlwZSAgICA6IFRIYW5kbGU7CisgICAgcmV0cmllcywgdGltZW91dCwgZHdFcnIgOiBEV09SRDsKK2NvbnN0IElOVEVSVkFMID0gMTA7IC8vIG1zCitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworCisgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRk9wZW5UaW1lT3V0IC8gSU5URVJWQUwpKTsKKyAgdGltZW91dCA6PSBGT3BlblRpbWVPdXQ7CisKKyAgLy8gaWYgdGhlIHNlcnZlciBoYXNuJ3QgZ290dGVuIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgcGlwZSBoYXMgYmVlbiBjcmVhdGVkLCBhdCBsZWFzdCB3YWl0IHRoZSB0aW1lb3V0CisgIC8vIEFjY29yZGluZyB0byBNU0ROLCBpZiBubyBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBuYW1lZCBwaXBlIGV4aXN0LCB0aGUgV2FpdE5hbWVkUGlwZSBmdW5jdGlvbgorICAvLyByZXR1cm5zIElNTUVESUFURUxZLCByZWdhcmRsZXNzIG9mIHRoZSB0aW1lLW91dCB2YWx1ZS4KKyAgLy8gQWx3YXlzIHVzZSBJTlRFUlZBTCwgc2luY2UgV2FpdE5hbWVkUGlwZSgwKSBkZWZhdWx0cyB0byBzb21lIG90aGVyIHZhbHVlCisgIHdoaWxlIG5vdCBXYWl0TmFtZWRQaXBlKCBQQ2hhcihGUGlwZU5hbWUpLCBJTlRFUlZBTCkgZG8gYmVnaW4KKyAgICBkd0VyciA6PSBHZXRMYXN0RXJyb3I7CisgICAgaWYgZHdFcnIgPD4gRVJST1JfRklMRV9OT1RfRk9VTkQKKyAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoZHdFcnIpKTsKKworICAgIGlmIHRpbWVvdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgorICAgICAgaWYgKHJldHJpZXMgPiAwKQorICAgICAgdGhlbiBEZWMocmV0cmllcykKKyAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdVbmFibGUgdG8gb3BlbiBwaXBlLCB0aW1lZCBvdXQnKTsKKyAgICBlbmQ7CisKKyAgICBTbGVlcChJTlRFUlZBTCkKKyAgZW5kOworCisgIC8vIG9wZW4gdGhhdCB0aGluZ3kKKyAgaFBpcGUgOj0gQ3JlYXRlRmlsZSggUENoYXIoIEZQaXBlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCBvciBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICBGU2hhcmVNb2RlLCAgICAgICAgLy8gc2hhcmluZworICAgICAgICAgICAgICAgICAgICAgICBGU2VjdXJpdHlBdHRyaWJzLCAgLy8gc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAgICAgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCBvciBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwgLy8gYXN5bmMrZmFzdCwgcGxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAvLyBubyB0ZW1wbGF0ZSBmaWxlCisKKyAgaWYgaFBpcGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisKKyAgLy8gZXZlcnl0aGluZyBmaW5lCisgIEZQaXBlIDo9IGhQaXBlOworZW5kOworCisKK3sgVEhhbmRsZVBpcGVTdHJlYW1JbXBsIH0KKworCitjb25zdHJ1Y3RvciBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3duc0hhbmRsZSwgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCwgYVRpbWVPdXQpOworCisgIGlmIGFPd25zSGFuZGxlCisgIHRoZW4gRlNyY0hhbmRsZSA6PSBhUGlwZUhhbmRsZQorICBlbHNlIEZTcmNIYW5kbGUgOj0gRHVwbGljYXRlUGlwZUhhbmRsZSggYVBpcGVIYW5kbGUpOworCisgIE9wZW47CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUSGFuZGxlUGlwZVN0cmVhbUltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIENsb3NlUGlwZUhhbmRsZSggRlNyY0hhbmRsZSk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiBGUGlwZSA6PSBEdXBsaWNhdGVQaXBlSGFuZGxlKCBGU3JjSGFuZGxlKTsKK2VuZDsKKworCit7IFRQaXBlVHJhbnNwb3J0QmFzZSB9CisKKworZnVuY3Rpb24gVFBpcGVUcmFuc3BvcnRCYXNlLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSAoRklucHV0U3RyZWFtIDw+IG5pbCkgIGFuZCAoRklucHV0U3RyZWFtLklzT3BlbikKKyAgICAgICAgYW5kIChGT3V0cHV0U3RyZWFtIDw+IG5pbCkgYW5kIChGT3V0cHV0U3RyZWFtLklzT3Blbik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlVHJhbnNwb3J0QmFzZS5PcGVuOworYmVnaW4KKyAgRklucHV0U3RyZWFtLk9wZW47CisgIEZPdXRwdXRTdHJlYW0uT3BlbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVUcmFuc3BvcnRCYXNlLkNsb3NlOworYmVnaW4KKyAgRklucHV0U3RyZWFtLkNsb3NlOworICBGT3V0cHV0U3RyZWFtLkNsb3NlOworZW5kOworCisKK3sgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOyBjb25zdCBhU2hhcmVNb2RlOiBEV09SRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgRklucHV0U3RyZWFtICA6PSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgVFJVRSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQsIGFPcGVuVGltZU91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOyAgLy8gdHJ1ZSBmb3IgbmFtZWQgcGlwZXMKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZSwgVFJVRSwgYU93bnNIYW5kbGUsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcworZW5kOworCisKK3sgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsLkNyZWF0ZSggYVBpcGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZSA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOworLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcgorYmVnaW4KKyAgRkhhbmRsZSA6PSBEdXBsaWNhdGVQaXBlSGFuZGxlKCBhUGlwZSk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFQaXBlLCBhT3duc0hhbmRsZSwgYVRpbWVPdXQpOworZW5kOworCisKK3Byb2NlZHVyZSBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZsdXNoRmlsZUJ1ZmZlcnMoIEZIYW5kbGUpOworICBEaXNjb25uZWN0TmFtZWRQaXBlKCBGSGFuZGxlKTsgIC8vIGZvcmNlIGNsaWVudCBvZmYgdGhlIHBpcGUKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGSGFuZGxlKTsKKworICBpbmhlcml0ZWQgQ2xvc2U7CitlbmQ7CisKKworeyBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOworLy8gQW5vbnltb3VzIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgLy8gb3ZlcmxhcHBlZCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQW5vblBpcGVzLCBzZWUgTVNETgorICBGSW5wdXRTdHJlYW0gIDo9IFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlUmVhZCwgYU93bnNIYW5kbGVzLCBGQUxTRSwgYVRpbWVPdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlV3JpdGUsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKK2VuZDsKKworCit7IFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZSB9CisKKworY29uc3RydWN0b3IgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdG9wU2VydmVyIDo9IFRFdmVudC5DcmVhdGUobmlsLFRSVUUsRkFMU0UsJycpOyAgLy8gbWFudWFsIHJlc2V0CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZTdG9wU2VydmVyKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLlF1ZXJ5U3RvcFNlcnZlciA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9wU2VydmVyID0gbmlsKQorICAgICAgICAgb3IgKEZTdG9wU2VydmVyLldhaXRGb3IoMCkgPD4gd3JUaW1lb3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkxpc3RlbjsKK2JlZ2luCisgIEZTdG9wU2VydmVyLlJlc2V0RXZlbnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5DbG9zZTsKK2JlZ2luCisgIEZTdG9wU2VydmVyLlNldEV2ZW50OworICBJbnRlcm5hbENsb3NlOworZW5kOworCisKK3sgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWw7IGFUaW1lT3V0IDogRFdPUkQpOworLy8gQW5vbnltb3VzIHBpcGUgQ1RPUgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkJ1ZnNpemUgIDo9IGFCdWZTaXplOworICBGUmVhZEhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRldyaXRlSGFuZGxlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGQ2xpZW50QW5vblJlYWQgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZDbGllbnRBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lT3V0IDo9IGFUaW1lT3V0OworCisgIC8vIFRoZSBhbm9ueW1vdXMgcGlwZSBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4KKyAgLy8gcGFzcyB0aGUgaGFuZGxlcyBvbiB0byB0aGUgY2xpZW50IGJlZm9yZSB0aGUgc2VydmUgKGFjY2VwdEltcGwpCisgIC8vIGJsb2NraW5nIGNhbGwuCisgIGlmIG5vdCBDcmVhdGVBbm9uUGlwZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShDbGFzc05hbWUrJy5DcmVhdGUoKSBmYWlsZWQnKTsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7Cit2YXIgYnVmICAgIDogQnl0ZTsKKyAgICBiciAgICAgOiBEV09SRDsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICB0aGVuIGZuQWNjZXB0aW5nKCk7CisKKyAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KKyAgaWYgbm90IFJlYWRGaWxlKCBGUmVhZEhhbmRsZSwgYnVmLCAwLCBiciwgbmlsKQorICBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW11bmljYXRpb24nKTsKKworICAvLyBjcmVhdGUgdGhlIHRyYW5zcG9ydCBpbXBsCisgIHJlc3VsdCA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGUmVhZEhhbmRsZSwgRldyaXRlSGFuZGxlLCBGQUxTRSwgRlRpbWVPdXQpOworZW5kOworCisKK3Byb2NlZHVyZSBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuSW50ZXJuYWxDbG9zZTsKK2JlZ2luCisgIENsb3NlUGlwZUhhbmRsZSggRlJlYWRIYW5kbGUpOworICBDbG9zZVBpcGVIYW5kbGUoIEZXcml0ZUhhbmRsZSk7CisgIENsb3NlUGlwZUhhbmRsZSggRkNsaWVudEFub25SZWFkKTsKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGQ2xpZW50QW5vbldyaXRlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuUmVhZEhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRlJlYWRIYW5kbGU7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLldyaXRlSGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JpdGVIYW5kbGU7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNsaWVudEFub25SZWFkIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQ2xpZW50QW5vblJlYWQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZDbGllbnRBbm9uV3JpdGU7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZUFub25QaXBlIDogQm9vbGVhbjsKK3ZhciBzZCAgICAgICAgICAgOiBQU0VDVVJJVFlfREVTQ1JJUFRPUjsKKyAgICBzYSAgICAgICAgICAgOiBTRUNVUklUWV9BVFRSSUJVVEVTOyAvL1RTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgaENBUiwgaFBpcGVXLCBoQ0FXLCBoUGlwZSA6IFRIYW5kbGU7CitiZWdpbgorICBzZCA6PSBQU0VDVVJJVFlfREVTQ1JJUFRPUiggTG9jYWxBbGxvYyggTFBUUixTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpKTsKKyAgdHJ5CisgICAgV2luMzJDaGVjayggSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pKTsKKyAgICBXaW4zMkNoZWNrKCBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCBzZCwgVFJVRSwgbmlsLCBGQUxTRSkpOworCisgICAgc2Eubkxlbmd0aCA6PSBzaXplb2YoIHNhKTsKKyAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKKyAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBUUlVFOyAvL2FsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCisKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworCisgICAgUmVzdWx0IDo9IENyZWF0ZVBpcGUoIGhQaXBlLCBoQ0FXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3Rkb3V0IHBpcGUKKyAgICBpZiBub3QgUmVzdWx0IHRoZW4gYmVnaW4gIC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgICBDbG9zZUhhbmRsZSggaENBUik7CisgICAgICBDbG9zZUhhbmRsZSggaFBpcGVXKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworCisgICAgRkNsaWVudEFub25SZWFkICA6PSBoQ0FSOworICAgIEZDbGllbnRBbm9uV3JpdGUgOj0gaENBVzsKKyAgICBGUmVhZEhhbmRsZSAgICAgIDo9IGhQaXBlOworICAgIEZXcml0ZUhhbmRsZSAgICAgOj0gaFBpcGVXOworICBmaW5hbGx5CisgICAgaWYgc2QgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbChzZCkpOworICBlbmQ7CitlbmQ7CisKKworeyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhUGlwZW5hbWUgOiBzdHJpbmc7IGFCdWZzaXplLCBhTWF4Q29ubnMsIGFUaW1lT3V0IDogQ2FyZGluYWwpOworLy8gTmFtZWQgUGlwZSBDVE9SCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7CisgIEZQaXBlTmFtZSAgOj0gYVBpcGVuYW1lOworICBGQnVmc2l6ZSAgIDo9IGFCdWZTaXplOworICBGTWF4Q29ubnMgIDo9IE1heCggMSwgTWluKCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMsIGFNYXhDb25ucykpOworICBGSGFuZGxlICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZW91dCAgIDo9IGFUaW1lT3V0OworICBGQ29ubmVjdGVkIDo9IEZBTFNFOworCisgIGlmIENvcHkoRlBpcGVOYW1lLDEsMikgPD4gJ1xcJworICB0aGVuIEZQaXBlTmFtZSA6PSAnXFwuXHBpcGVcJyArIEZQaXBlTmFtZTsgIC8vIGFzc3VtZSBsb2NhbGhvc3QKK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5BY2NlcHQoY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBkd0Vycm9yLCBkd1dhaXQsIGR3RHVtbXkgOiBEV09SRDsKKyAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgaGFuZGxlcyA6IGFycmF5WzAuLjFdIG9mIFRIYW5kbGU7CitiZWdpbgorICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisKKyAgQVNTRVJUKCBub3QgRkNvbm5lY3RlZCk7CisgIENyZWF0ZU5hbWVkUGlwZTsKKyAgd2hpbGUgbm90IEZDb25uZWN0ZWQgZG8gYmVnaW4KKworICAgIGlmIFF1ZXJ5U3RvcFNlcnZlciB0aGVuIGJlZ2luCisgICAgICBJbnRlcm5hbENsb3NlOworICAgICAgQWJvcnQ7CisgICAgZW5kOworCisgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgICAgdGhlbiBmbkFjY2VwdGluZygpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIGNsaWVudCB0byBjb25uZWN0OyBpZiBpdCBzdWNjZWVkcywgdGhlCisgICAgLy8gZnVuY3Rpb24gcmV0dXJucyBhIG5vbnplcm8gdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAgLy8gemVybywgR2V0TGFzdEVycm9yIHNob3VsZCByZXR1cm4gRVJST1JfUElQRV9DT05ORUNURUQuCisgICAgaWYgQ29ubmVjdE5hbWVkUGlwZSggSGFuZGxlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpIHRoZW4gYmVnaW4KKyAgICAgIEZDb25uZWN0ZWQgOj0gVFJVRTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIC8vIENvbm5lY3ROYW1lZFBpcGUoKSByZXR1cm5zIEZBTFNFIGZvciBPdmVybGFwcGVkSU8sIGV2ZW4gaWYgY29ubmVjdGVkLgorICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgR2V0TGFzdEVycm9yKCkgZXhwbGljaXRseSB0byBmaW5kIG91dAorICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOworICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgRVJST1JfUElQRV9DT05ORUNURUQgOiBiZWdpbgorICAgICAgICBGQ29ubmVjdGVkIDo9IG5vdCBRdWVyeVN0b3BTZXJ2ZXI7ICAvLyBzcGVjaWFsIGNhc2U6IHBpcGUgaW1tZWRpYXRlbHkgY29ubmVjdGVkCisgICAgICBlbmQ7CisKKyAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgorICAgICAgICBoYW5kbGVzWzBdIDo9IG92ZXJsYXBwZWQuV2FpdEhhbmRsZTsKKyAgICAgICAgaGFuZGxlc1sxXSA6PSBGU3RvcFNlcnZlci5IYW5kbGU7CisgICAgICAgIGR3V2FpdCA6PSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCAyLCBAaGFuZGxlcywgRkFMU0UsIEZUaW1lb3V0KTsKKyAgICAgICAgRkNvbm5lY3RlZCA6PSAoZHdXYWl0ID0gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICAgICAgICAgIGFuZCBHZXRPdmVybGFwcGVkUmVzdWx0KCBIYW5kbGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgZHdEdW1teSwgVFJVRSkKKyAgICAgICAgICAgICAgICAgIGFuZCBub3QgUXVlcnlTdG9wU2VydmVyOworICAgICAgZW5kOworCisgICAgZWxzZQorICAgICAgSW50ZXJuYWxDbG9zZTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2xpZW50IGNvbm5lY3Rpb24gZmFpbGVkJyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHRoZSB0cmFuc3BvcnQgaW1wbAorICByZXN1bHQgOj0gQ3JlYXRlVHJhbnNwb3J0SW5zdGFuY2U7CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlVHJhbnNwb3J0SW5zdGFuY2UgOiBJVHJhbnNwb3J0OworLy8gY3JlYXRlIHRoZSB0cmFuc3BvcnQgaW1wbAordmFyIGhQaXBlIDogVEhhbmRsZTsKK2JlZ2luCisgIGhQaXBlIDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICB0cnkKKyAgICBGQ29ubmVjdGVkIDo9IEZBTFNFOworICAgIHJlc3VsdCA6PSBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbC5DcmVhdGUoIGhQaXBlLCBUUlVFLCBGVGltZW91dCk7CisgIGV4Y2VwdAorICAgIENsb3NlUGlwZUhhbmRsZShoUGlwZSk7CisgICAgcmFpc2U7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuSW50ZXJuYWxDbG9zZTsKK3ZhciBoUGlwZSA6IFRIYW5kbGU7CitiZWdpbgorICBoUGlwZSA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgaWYgaFBpcGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRSB0aGVuIEV4aXQ7CisKKyAgdHJ5CisgICAgaWYgRkNvbm5lY3RlZAorICAgIHRoZW4gRmx1c2hGaWxlQnVmZmVycyggaFBpcGUpCisgICAgZWxzZSBDYW5jZWxJbyggaFBpcGUpOworICAgIERpc2Nvbm5lY3ROYW1lZFBpcGUoIGhQaXBlKTsKKyAgZmluYWxseQorICAgIENsb3NlUGlwZUhhbmRsZSggaFBpcGUpOworICAgIEZDb25uZWN0ZWQgOj0gRkFMU0U7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5IYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgeyRJRkRFRiBXSU42NH0KKyAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggSW50NjQoRkhhbmRsZSksIDApKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggSW50ZWdlcihGSGFuZGxlKSwgMCkpOworICB7JEVORElGfQorZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZU5hbWVkUGlwZSA6IFRIYW5kbGU7Cit2YXIgU0lEQXV0aFdvcmxkIDogU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIDsKKyAgICBldmVyeW9uZV9zaWQgOiBQU0lEOworICAgIGVhICAgICAgICAgICA6IEVYUExJQ0lUX0FDQ0VTUzsKKyAgICBhY2wgICAgICAgICAgOiBQQUNMOworICAgIHNkICAgICAgICAgICA6IFBTRUNVUklUWV9ERVNDUklQVE9SOworICAgIHNhICAgICAgICAgICA6IFNFQ1VSSVRZX0FUVFJJQlVURVM7Citjb25zdAorICBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZICA6IFRTSURJZGVudGlmaWVyQXV0aG9yaXR5ID0gKFZhbHVlIDogKDAsMCwwLDAsMCwxKSk7CisgIFNFQ1VSSVRZX1dPUkxEX1JJRCA9ICQwMDAwMDAwMDsKK2JlZ2luCisgIHNkIDo9IG5pbDsKKyAgZXZlcnlvbmVfc2lkIDo9IG5pbDsKKyAgdHJ5CisgICAgQVNTRVJUKCAoRkhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFKSBhbmQgbm90IEZDb25uZWN0ZWQpOworCisgICAgLy8gV2luZG93cyAtIHNldCBzZWN1cml0eSB0byBhbGxvdyBub24tZWxldmF0ZWQgYXBwcworICAgIC8vIHRvIGFjY2VzcyBwaXBlcyBjcmVhdGVkIGJ5IGVsZXZhdGVkIGFwcHMuCisgICAgU0lEQXV0aFdvcmxkIDo9IFNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFk7CisgICAgQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKCBTSURBdXRoV29ybGQsIDEsIFNFQ1VSSVRZX1dPUkxEX1JJRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZXZlcnlvbmVfc2lkKTsKKworICAgIFplcm9NZW1vcnkoIEBlYSwgU2l6ZU9mKGVhKSk7CisgICAgZWEuZ3JmQWNjZXNzUGVybWlzc2lvbnMgOj0gR0VORVJJQ19BTEw7IC8vU1BFQ0lGSUNfUklHSFRTX0FMTCBvciBTVEFOREFSRF9SSUdIVFNfQUxMOworICAgIGVhLmdyZkFjY2Vzc01vZGUgICAgICAgIDo9IFNFVF9BQ0NFU1M7CisgICAgZWEuZ3JmSW5oZXJpdGFuY2UgICAgICAgOj0gTk9fSU5IRVJJVEFOQ0U7CisgICAgZWEuVHJ1c3RlZS5UcnVzdGVlRm9ybSAgOj0gVFJVU1RFRV9JU19TSUQ7CisgICAgZWEuVHJ1c3RlZS5UcnVzdGVlVHlwZSAgOj0gVFJVU1RFRV9JU19XRUxMX0tOT1dOX0dST1VQOworICAgIGVhLlRydXN0ZWUucHRzdHJOYW1lICAgIDo9IFBDaGFyKGV2ZXJ5b25lX3NpZCk7CisKKyAgICBhY2wgOj0gbmlsOworICAgIFNldEVudHJpZXNJbkFjbCggMSwgQGVhLCBuaWwsIGFjbCk7CisKKyAgICBzZCA6PSBQU0VDVVJJVFlfREVTQ1JJUFRPUiggTG9jYWxBbGxvYyggTFBUUixTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpKTsKKyAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOworICAgIFdpbjMyQ2hlY2soIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woIHNkLCBUUlVFLCBhY2wsIEZBTFNFKSk7CisKKyAgICBzYS5uTGVuZ3RoIDo9IFNpemVPZihzYSk7CisgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7CisgICAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gRkFMU0U7CisKKyAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5hbWVkIHBpcGUKKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBXaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFdpbmFwaS5XaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVORElGfQorICAgICAgICBQQ2hhciggRlBpcGVOYW1lKSwgICAgICAgIC8vIHBpcGUgbmFtZQorICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVggb3IgICAgIC8vIHJlYWQvd3JpdGUgYWNjZXNzCisgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAgICAgLy8gYXN5bmMgbW9kZQorICAgICAgICBQSVBFX1RZUEVfQllURSBvciAgICAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgIFBJUEVfUkVBRE1PREVfQllURSwgICAgICAgLy8gYnl0ZSByZWFkIG1vZGUKKyAgICAgICAgRk1heENvbm5zLCAgICAgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcworICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplCisgICAgICAgIEZUaW1lb3V0LCAgICAgICAgICAgICAgICAgLy8gdGltZS1vdXQsIHNlZSBNU0ROCisgICAgICAgIEBzYSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICApOworCisgICAgaWYoIHJlc3VsdCA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB0aGVuIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKHJlc3VsdCkpCisgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NyZWF0ZU5hbWVkUGlwZSgpIGZhaWxlZCAnICsgSW50VG9TdHIoR2V0TGFzdEVycm9yKSk7CisKKyAgZmluYWxseQorICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoIHNkKSk7CisgICAgaWYgYWNsIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoIGFjbCkpOworICAgIGlmIGV2ZXJ5b25lX3NpZCA8PiBuaWwgdGhlbiBGcmVlU2lkKGV2ZXJ5b25lX3NpZCk7CisgIGVuZDsKK2VuZDsKKworCisKK2VuZC4KKworCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkOWFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzCkBAIC0wLDAgKzEsMTcxNSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQordW5pdCBUaHJpZnQuVHJhbnNwb3J0OworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRTQ09QRURFTlVNUyBPTn0KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIE1hdGgsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIEFjdGl2ZVgsIG1zeG1sLCBXaW5Tb2NrLCBTb2NrZXRzLAorICB7JEVMU0V9CisgICAgV2luYXBpLkFjdGl2ZVgsIFdpbmFwaS5tc3htbCwgV2luYXBpLldpblNvY2ssCisgICAgeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICAgIFdlYi5XaW4uU29ja2V0cywKKyAgICB7JEVMU0V9CisgICAgICBUaHJpZnQuU29ja2V0LAorICAgIHskRU5ESUZ9CisgIHskRU5ESUZ9CisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuU3RyZWFtOworCit0eXBlCisgIElUcmFuc3BvcnQgPSBpbnRlcmZhY2UKKyAgICBbJ3tEQjg0OTYxRS04QkIzLTQ1MzItOTlFMS1BOEM3QUMyMzAwRjd9J10KKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47CisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIE9wZW47CisgICAgcHJvY2VkdXJlIENsb3NlOworICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZEFsbChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEZsdXNoOworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUcmFuc3BvcnQpCisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIE9wZW4oKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZEFsbChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRFeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEV4Y2VwdGlvblR5cGUgPSAoCisgICAgICAgIFVua25vd24sCisgICAgICAgIE5vdE9wZW4sCisgICAgICAgIEFscmVhZHlPcGVuLAorICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICBCYWRBcmdzLAorICAgICAgICBJbnRlcnJ1cHRlZAorICAgICAgKTsKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgcHJvcGVydHkgVHlwZV86IFRFeGNlcHRpb25UeXBlIHJlYWQgR2V0VHlwZTsKKyAgZW5kOworCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkVuZE9mRmlsZSA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKworICBJSFRUUENsaWVudCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCisgICAgWyd7QkExNDJEMTItOEFFNi00QjUwLTlFMzMtNkI3ODQzQjIxRDczfSddCisgICAgcHJvY2VkdXJlIFNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKyAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisKKyAgICBwcm9wZXJ0eSBEbnNSZXNvbHZlVGltZW91dDogSW50ZWdlciByZWFkIEdldERuc1Jlc29sdmVUaW1lb3V0IHdyaXRlIFNldERuc1Jlc29sdmVUaW1lb3V0OworICAgIHByb3BlcnR5IENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0Q29ubmVjdGlvblRpbWVvdXQgd3JpdGUgU2V0Q29ubmVjdGlvblRpbWVvdXQ7CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKKyAgICBwcm9wZXJ0eSBSZWFkVGltZW91dDogSW50ZWdlciByZWFkIEdldFJlYWRUaW1lb3V0IHdyaXRlIFNldFJlYWRUaW1lb3V0OworICAgIHByb3BlcnR5IEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+IHJlYWQgR2V0Q3VzdG9tSGVhZGVyczsKKyAgZW5kOworCisgIFRIVFRQQ2xpZW50SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCwgSUhUVFBDbGllbnQpCisgIHByaXZhdGUKKyAgICBGVXJpIDogc3RyaW5nOworICAgIEZJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRk91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRkRuc1Jlc29sdmVUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGQ29ubmVjdGlvblRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZTZW5kVGltZW91dCA6IEludGVnZXI7CisgICAgRlJlYWRUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGQ3VzdG9tSGVhZGVycyA6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworCisgICAgZnVuY3Rpb24gQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisKKyAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKyAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVVyaTogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgSVNlcnZlclRyYW5zcG9ydCA9IGludGVyZmFjZQorICAgIFsne0M0M0I4N0VELTY5RUEtNDdDNC1CNzdDLTE1RTI4ODI1MjkwMH0nXQorICAgIHByb2NlZHVyZSBMaXN0ZW47CisgICAgcHJvY2VkdXJlIENsb3NlOworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKKyAgZW5kOworCisgIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyVHJhbnNwb3J0KQorICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgIHZpcnR1YWw7IGFic3RyYWN0OworICBlbmQ7CisKKyAgSVRyYW5zcG9ydEZhY3RvcnkgPSBpbnRlcmZhY2UKKyAgICBbJ3tERDgwOTQ0Ni0wMDBGLTQ5RTEtOUJGRi1FMEQwREM3NkE5RDd9J10KKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RmFjdG9yeUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUcmFuc3BvcnRGYWN0b3J5KQorICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsgdmlydHVhbDsKKyAgZW5kOworCisgIFRUY3BTb2NrZXRTdHJlYW1JbXBsID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsICkKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIHByaXZhdGUgdHlwZQorICAgIFRXYWl0Rm9yRGF0YSA9ICggd2ZkX0hhdmVEYXRhLCB3ZmRfVGltZW91dCwgd2ZkX0Vycm9yKTsKKyAgcHJpdmF0ZQorICAgIEZUY3BDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7CisgICAgRlRpbWVvdXQgOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFNlbGVjdCggUmVhZFJlYWR5LCBXcml0ZVJlYWR5LCBFeGNlcHRGbGFnOiBQQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgIFRpbWVPdXQ6IEludGVnZXI7IHZhciB3c2FFcnJvciA6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFdhaXRGb3JEYXRhKCBUaW1lT3V0IDogSW50ZWdlcjsgcEJ1ZiA6IFBvaW50ZXI7IERlc2lyZWRCeXRlczogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3skRUxTRX0KKyAgICBGVGNwQ2xpZW50OiBUU29ja2V0OworICBwcm90ZWN0ZWQgY29uc3QKKyAgICBTTEVFUF9USU1FID0gMjAwOworeyRFTkRJRn0KKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50OyBjb25zdCBhVGltZW91dCA6IEludGVnZXIgPSAwKTsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRTb2NrZXQ7IGNvbnN0IGFUaW1lb3V0IDogTG9uZ3dvcmQgPSAwKTsKK3skRU5ESUZ9CisgIGVuZDsKKworICBJU3RyZWFtVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJVHJhbnNwb3J0ICkKKyAgICBbJ3tBODQ3OUI0Ny0yQTNFLTQ0MjEtQTlBMC1ENUE5RURDQzYzNEF9J10KKyAgICBmdW5jdGlvbiBHZXRJbnB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgICBmdW5jdGlvbiBHZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgICAgcHJvcGVydHkgSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0SW5wdXRTdHJlYW07CisgICAgcHJvcGVydHkgT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldE91dHB1dFN0cmVhbTsKKyAgZW5kOworCisgIFRTdHJlYW1UcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRUcmFuc3BvcnRJbXBsLCBJU3RyZWFtVHJhbnNwb3J0KQorICBwcm90ZWN0ZWQKKyAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgICAgZnVuY3Rpb24gR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICBwdWJsaWMKKyAgICBwcm9wZXJ0eSBJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRJbnB1dFN0cmVhbTsKKyAgICBwcm9wZXJ0eSBPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0T3V0cHV0U3RyZWFtOworCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOyBjb25zdCBBT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRCdWZmZXJlZFN0cmVhbUltcGwgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpCisgIHByaXZhdGUKKyAgICBGU3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGQnVmU2l6ZSA6IEludGVnZXI7CisgICAgRlJlYWRCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICAgIEZXcml0ZUJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJVGhyaWZ0U3RyZWFtOyBBQnVmU2l6ZTogSW50ZWdlcik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRTZXJ2ZXJTb2NrZXRJbXBsID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBwcml2YXRlCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIEZTZXJ2ZXIgOiBUVGNwU2VydmVyOworICAgIEZQb3J0IDogSW50ZWdlcjsKKyAgICBGQ2xpZW50VGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlNlcnZlcjogVFNlcnZlclNvY2tldDsKK3skRU5ESUZ9CisgICAgRlVzZUJ1ZmZlcmVkU29ja2V0IDogQm9vbGVhbjsKKyAgICBGT3duc1NlcnZlciA6IEJvb2xlYW47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKSA6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICBwdWJsaWMKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU2VydmVyOiBUVGNwU2VydmVyOyBBQ2xpZW50VGltZW91dDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogSW50ZWdlciA9IDA7IEFVc2VCdWZmZXJlZFNvY2tldHM6IEJvb2xlYW4gPSBGQUxTRSk7IG92ZXJsb2FkOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFNlcnZlclNvY2tldDsgQUNsaWVudFRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDA7IEFVc2VCdWZmZXJlZFNvY2tldHM6IEJvb2xlYW4gPSBGQUxTRSk7IG92ZXJsb2FkOworeyRFTkRJRn0KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBMaXN0ZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRUcmFuc3BvcnRJbXBsICkKKyAgcHJpdmF0ZQorICAgIEZJbnB1dEJ1ZmZlciA6IElUaHJpZnRTdHJlYW07CisgICAgRk91dHB1dEJ1ZmZlciA6IElUaHJpZnRTdHJlYW07CisgICAgRlRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7CisgICAgRkJ1ZlNpemUgOiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIEluaXRCdWZmZXJzOworICAgIGZ1bmN0aW9uIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIE9wZW4oKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0ICk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvcGVydHkgVW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ7CisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworICBlbmQ7CisKKyAgVFNvY2tldEltcGwgPSBjbGFzcyhUU3RyZWFtVHJhbnNwb3J0SW1wbCkKKyAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworeyRFTFNFfQorICAgIEZDbGllbnQ6IFRTb2NrZXQ7Cit7JEVORElGfQorICAgIEZPd25zQ2xpZW50IDogQm9vbGVhbjsKKyAgICBGSG9zdCA6IHN0cmluZzsKKyAgICBGUG9ydCA6IEludGVnZXI7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIEZUaW1lb3V0IDogSW50ZWdlcjsKK3skRUxTRX0KKyAgICBGVGltZW91dCA6IExvbmd3b3JkOworeyRFTkRJRn0KKworICAgIHByb2NlZHVyZSBJbml0U29ja2V0OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudDsgYU93bnNDbGllbnQgOiBCb29sZWFuOyBBVGltZW91dDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBVGltZW91dDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUNsaWVudDogVFNvY2tldDsgYU93bnNDbGllbnQ6IEJvb2xlYW4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBVGltZW91dDogTG9uZ3dvcmQgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVORElGfQorICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgcHJvcGVydHkgVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQgcmVhZCBGQ2xpZW50OworeyRFTFNFfQorICAgIHByb3BlcnR5IFRjcENsaWVudDogVFNvY2tldCByZWFkIEZDbGllbnQ7Cit7JEVORElGfQorICAgIHByb3BlcnR5IEhvc3QgOiBzdHJpbmcgcmVhZCBGSG9zdDsKKyAgICBwcm9wZXJ0eSBQb3J0OiBJbnRlZ2VyIHJlYWQgRlBvcnQ7CisgIGVuZDsKKworICBURnJhbWVkVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCkKKyAgcHJpdmF0ZSBjb25zdAorICAgIEZIZWFkZXJTaXplIDogSW50ZWdlciA9IDQ7CisgIHByaXZhdGUgY2xhc3MgdmFyCisgICAgRkhlYWRlcl9EdW1teSA6IGFycmF5IG9mIEJ5dGU7CisgIHByb3RlY3RlZAorICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZXcml0ZUJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CisgICAgRlJlYWRCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworCisgICAgcHJvY2VkdXJlIEluaXRXcml0ZUJ1ZmZlcjsKKyAgICBwcm9jZWR1cmUgUmVhZEZyYW1lOworICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBURmFjdG9yeSA9IGNsYXNzKCBUVHJhbnNwb3J0RmFjdG9yeUltcGwgKQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgICAgICBlbmQ7CisKKyAgICB7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KKyAgICBjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgeyRFTkRJRn0KKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworCisgICAgcHJvY2VkdXJlIE9wZW4oKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgZW5kOworCit7JElGTkRFRiBIQVZFX0NMQVNTX0NUT1J9Citwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKK3skRU5ESUZ9CisKK2NvbnN0CisgIERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgPSA1ICogMTAwMDsgLy8gbXMKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRUcmFuc3BvcnRJbXBsIH0KKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLkZsdXNoOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5QZWVrOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IElzT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIHJlc3VsdCA6PSBSZWFkKCBAYnVmWzBdLCBMZW5ndGgoYnVmKSwgb2ZmLCBsZW4pCisgIGVsc2UgcmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZEFsbCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCAwLCBMZW5ndGgoYnVmKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCBvZmYsIGxlbik7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciByZXQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHdoaWxlIHJlc3VsdCA8IGxlbiBkbyBiZWdpbgorICAgIHJldCA6PSBSZWFkKCBwQnVmLCBidWZsZW4sIG9mZiArIHJlc3VsdCwgbGVuIC0gcmVzdWx0KTsKKyAgICBpZiByZXQgPiAwCisgICAgdGhlbiBJbmMoIHJlc3VsdCwgcmV0KQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCAnQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQnICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBTZWxmLldyaXRlKCBwQnVmLCAwLCBsZW4pOworZW5kOworCit7IFRIVFRQQ2xpZW50SW1wbCB9CisKK2NvbnN0cnVjdG9yIFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoY29uc3QgQVVyaTogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZVcmkgOj0gQVVyaTsKKworICAvLyBkZWZhdWx0cyBhY2NvcmRpbmcgdG8gTVNETgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gMDsgLy8gbm8gdGltZW91dAorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gNjAgKiAxMDAwOworICBGU2VuZFRpbWVvdXQgICAgICAgOj0gMzAgKiAxMDAwOworICBGUmVhZFRpbWVvdXQgICAgICAgOj0gMzAgKiAxMDAwOworCisgIEZDdXN0b21IZWFkZXJzIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsc3RyaW5nPi5DcmVhdGU7CisgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5DcmVhdGVSZXF1ZXN0OiBJWE1MSFRUUFJlcXVlc3Q7Cit2YXIKKyAgcGFpciA6IFRQYWlyPHN0cmluZyxzdHJpbmc+OworICBzcnZIdHRwIDogSVNlcnZlclhNTEhUVFBSZXF1ZXN0OworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgUmVzdWx0IDo9IENvU2VydmVyWE1MSFRUUC5DcmVhdGU7CisgIHskRUxTRX0KKyAgUmVzdWx0IDo9IENvWE1MSFRUUFJlcXVlc3QuQ3JlYXRlOworICB7JElGRU5EfQorCisgIC8vIHNldHRpbmcgYSB0aW1lb3V0IHZhbHVlIHRvIDAgKHplcm8pIG1lYW5zICJubyB0aW1lb3V0IiBmb3IgdGhhdCBzZXR0aW5nCisgIGlmIFN1cHBvcnRzKCByZXN1bHQsIElTZXJ2ZXJYTUxIVFRQUmVxdWVzdCwgc3J2SHR0cCkKKyAgdGhlbiBzcnZIdHRwLnNldFRpbWVvdXRzKCBEbnNSZXNvbHZlVGltZW91dCwgQ29ubmVjdGlvblRpbWVvdXQsIFNlbmRUaW1lb3V0LCBSZWFkVGltZW91dCk7CisKKyAgUmVzdWx0Lm9wZW4oJ1BPU1QnLCBGVXJpLCBGYWxzZSwgJycsICcnKTsKKyAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKKyAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdBY2NlcHQnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKKyAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdVc2VyLUFnZW50JywgJ0RlbHBoaS9JSFRUUENsaWVudCcpOworCisgIGZvciBwYWlyIGluIEZDdXN0b21IZWFkZXJzIGRvIGJlZ2luCisgICAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoIHBhaXIuS2V5LCBwYWlyLlZhbHVlICk7CisgIGVuZDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuRGVzdHJveTsKK2JlZ2luCisgIENsb3NlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRG5zUmVzb2x2ZVRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkRuc1Jlc29sdmVUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkNvbm5lY3Rpb25UaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDb25uZWN0aW9uVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTZW5kVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU2VuZFRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRSZWFkVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CitiZWdpbgorICBSZXN1bHQgOj0gRkN1c3RvbUhlYWRlcnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gVHJ1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5PcGVuOworYmVnaW4KKyAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLkZsdXNoOworYmVnaW4KKyAgdHJ5CisgICAgU2VuZFJlcXVlc3Q7CisgIGZpbmFsbHkKKyAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKyAgICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworICAgIEFTU0VSVCggRk91dHB1dFN0cmVhbSA8PiBuaWwpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ05vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCcpOworICBlbmQ7CisKKyAgdHJ5CisgICAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuKQorICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24KKyAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNlbmRSZXF1ZXN0OwordmFyCisgIHhtbGh0dHAgOiBJWE1MSFRUUFJlcXVlc3Q7CisgIG1zIDogVE1lbW9yeVN0cmVhbTsKKyAgYSA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIHhtbGh0dHAgOj0gQ3JlYXRlUmVxdWVzdDsKKworICBtcyA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgdHJ5CisgICAgYSA6PSBGT3V0cHV0U3RyZWFtLlRvQXJyYXk7CisgICAgbGVuIDo9IExlbmd0aChhKTsKKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICAgIG1zLldyaXRlQnVmZmVyKCBQb2ludGVyKEBhWzBdKV4sIGxlbik7CisgICAgZW5kOworICAgIG1zLlBvc2l0aW9uIDo9IDA7CisgICAgeG1saHR0cC5zZW5kKCBJVW5rbm93biggVFN0cmVhbUFkYXB0ZXIuQ3JlYXRlKCBtcywgc29SZWZlcmVuY2UgKSkpOworICAgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgICAgRklucHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNyZWF0ZSggSVVua25vd24oIHhtbGh0dHAucmVzcG9uc2VTdHJlYW0pIGFzIElTdHJlYW0pOworICBmaW5hbGx5CisgICAgbXMuRnJlZTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZPdXRwdXRTdHJlYW0uV3JpdGUoIHBCdWYsIG9mZiwgbGVuKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RXhjZXB0aW9uIH0KKworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKK2JlZ2luCisgIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTm90T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRBcmdzCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKEFUeXBlLCAnJykKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGU7CisgIGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2JlZ2luCisgIGNhc2UgQVR5cGUgb2YKKyAgICBURXhjZXB0aW9uVHlwZS5Ob3RPcGVuOiAgICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShtc2cpOworICAgIFRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuOiBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuLkNyZWF0ZShtc2cpOworICAgIFRFeGNlcHRpb25UeXBlLlRpbWVkT3V0OiAgICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZShtc2cpOworICAgIFRFeGNlcHRpb25UeXBlLkVuZE9mRmlsZTogICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvbkVuZE9mRmlsZS5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5CYWRBcmdzOiAgICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZShtc2cpOworICAgIFRFeGNlcHRpb25UeXBlLkludGVycnVwdGVkOiBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZShtc2cpOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShtc2cpOworICBlbmQ7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RmFjdG9yeUltcGwgfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0RmFjdG9yeUltcGwuR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IEFUcmFuczsKK2VuZDsKKworeyBUU2VydmVyU29ja2V0IH0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciA6PSBBU2VydmVyOworICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKK2VuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFNlcnZlclNvY2tldDsgQUNsaWVudFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKKyAgRlNlcnZlci5SZWN2VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKKyAgRlNlcnZlci5TZW5kVGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IExvbmd3b3JkOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuKTsKK3skRU5ESUZ9CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgRlBvcnQgOj0gQVBvcnQ7CisgIEZDbGllbnRUaW1lb3V0IDo9IEFDbGllbnRUaW1lb3V0OworICBGU2VydmVyIDo9IFRUY3BTZXJ2ZXIuQ3JlYXRlKCBuaWwgKTsKKyAgRlNlcnZlci5CbG9ja01vZGUgOj0gYm1CbG9ja2luZzsKKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gQW5zaVN0cmluZyggSW50VG9TdHIoIEZQb3J0KSk7CisgIHskRUxTRX0KKyAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gSW50VG9TdHIoIEZQb3J0KTsKKyAgeyRJRkVORH0KK3skRUxTRX0KKyAgRlNlcnZlciA6PSBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydCwgQUNsaWVudFRpbWVvdXQsIEFDbGllbnRUaW1lb3V0KTsKK3skRU5ESUZ9CisgIEZVc2VCdWZmZXJlZFNvY2tldCA6PSBBVXNlQnVmZmVyZWRTb2NrZXRzOworICBGT3duc1NlcnZlciA6PSBUcnVlOworZW5kOworCitkZXN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBpZiBGT3duc1NlcnZlciB0aGVuIGJlZ2luCisgICAgRlNlcnZlci5GcmVlOworICAgIEZTZXJ2ZXIgOj0gbmlsOworICBlbmQ7CisgIGluaGVyaXRlZDsKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldEltcGwuQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwordmFyCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBjbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7Cit7JEVMU0V9CisgIGNsaWVudDogVFNvY2tldDsKK3skRU5ESUZ9CisgIHRyYW5zICA6IElTdHJlYW1UcmFuc3BvcnQ7CitiZWdpbgorICBpZiBGU2VydmVyID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ05vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4nKTsKKyAgZW5kOworCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBjbGllbnQgOj0gbmlsOworICB0cnkKKyAgICBjbGllbnQgOj0gVEN1c3RvbUlwQ2xpZW50LkNyZWF0ZShuaWwpOworCisgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgICAgdGhlbiBmbkFjY2VwdGluZygpOworCisgICAgaWYgbm90IEZTZXJ2ZXIuQWNjZXB0KCBjbGllbnQpIHRoZW4gYmVnaW4KKyAgICAgIGNsaWVudC5GcmVlOworICAgICAgUmVzdWx0IDo9IG5pbDsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworCisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIFJlc3VsdCA6PSBuaWw7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZSggY2xpZW50LCBUUlVFLCBGQ2xpZW50VGltZW91dCk7CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIHRyYW5zIG93bnMgaXQgbm93CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQKKyAgICB0aGVuIHJlc3VsdCA6PSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggdHJhbnMpCisgICAgZWxzZSByZXN1bHQgOj0gdHJhbnM7CisKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBjbGllbnQuRnJlZTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShFLlRvU3RyaW5nKTsKKyAgICBlbmQ7CisgIGVuZDsKK3skRUxTRX0KKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpIHRoZW4KKyAgICBmbkFjY2VwdGluZygpOworCisgIGNsaWVudCA6PSBGU2VydmVyLkFjY2VwdDsKKyAgdHJ5CisgICAgdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKGNsaWVudCwgVHJ1ZSk7CisgICAgY2xpZW50IDo9IG5pbDsKKworICAgIGlmIEZVc2VCdWZmZXJlZFNvY2tldCB0aGVuCisgICAgICBSZXN1bHQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUodHJhbnMpCisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9IHRyYW5zOworICBleGNlcHQKKyAgICBjbGllbnQuRnJlZTsKKyAgICByYWlzZTsKKyAgZW5kOworeyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXRJbXBsLkxpc3RlbjsKK2JlZ2luCisgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KKyAgYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgdHJ5CisgICAgICBGU2VydmVyLkFjdGl2ZSA6PSBUcnVlOworICAgIGV4Y2VwdAorICAgICAgb24gRTogRXhjZXB0aW9uCisgICAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ0NvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogJyArIEUuTWVzc2FnZSk7CisgICAgZW5kOworeyRFTFNFfQorICAgIEZTZXJ2ZXIuTGlzdGVuOworeyRFTkRJRn0KKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldEltcGwuQ2xvc2U7CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHRyeQorICAgICAgRlNlcnZlci5BY3RpdmUgOj0gRmFsc2U7CisgICAgZXhjZXB0CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnRXJyb3Igb24gY2xvc2luZyBzb2NrZXQgOiAnICsgRS5NZXNzYWdlKTsKKyAgICBlbmQ7Cit7JEVMU0V9CisgICAgRlNlcnZlci5DbG9zZTsKK3skRU5ESUZ9CitlbmQ7CisKK3sgVFNvY2tldCB9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsKK3ZhciBzdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgRkNsaWVudCA6PSBBQ2xpZW50OworICBGVGltZW91dCA6PSBBVGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgaW5oZXJpdGVkIENyZWF0ZSggc3RyZWFtLCBzdHJlYW0pOworZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsKK3ZhciBzdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgRkNsaWVudCA6PSBBQ2xpZW50OworICBGVGltZW91dCA6PSBBQ2xpZW50LlJlY3ZUaW1lb3V0OworICBGT3duc0NsaWVudCA6PSBhT3duc0NsaWVudDsKKyAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZShGQ2xpZW50LCBGVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoc3RyZWFtLCBzdHJlYW0pOworZW5kOworeyRFTkRJRn0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydCwgQVRpbWVvdXQ6IEludGVnZXIpOworeyRFTFNFfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKGNvbnN0IEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBVGltZW91dDogTG9uZ3dvcmQpOworeyRFTkRJRn0KK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUobmlsLG5pbCk7CisgIEZIb3N0IDo9IEFIb3N0OworICBGUG9ydCA6PSBBUG9ydDsKKyAgRlRpbWVvdXQgOj0gQVRpbWVvdXQ7CisgIEluaXRTb2NrZXQ7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFNvY2tldEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGlmIEZPd25zQ2xpZW50CisgIHRoZW4gRnJlZUFuZE5pbCggRkNsaWVudCk7CisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXRJbXBsLkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworCisgIGlmIEZPd25zQ2xpZW50CisgIHRoZW4gRnJlZUFuZE5pbCggRkNsaWVudCkKKyAgZWxzZSBGQ2xpZW50IDo9IG5pbDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIFJlc3VsdCA6PSAoRkNsaWVudCA8PiBuaWwpIGFuZCBGQ2xpZW50LkNvbm5lY3RlZDsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IChGQ2xpZW50IDw+IG5pbCkgYW5kIEZDbGllbnQuSXNPcGVuCit7JEVORElGfQorZW5kOworCitwcm9jZWR1cmUgVFNvY2tldEltcGwuSW5pdFNvY2tldDsKK3ZhcgorICBzdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgaWYgRk93bnNDbGllbnQKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOworCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBGQ2xpZW50IDo9IFRUY3BDbGllbnQuQ3JlYXRlKCBuaWwpOworeyRFTFNFfQorICBGQ2xpZW50IDo9IFRTb2NrZXQuQ3JlYXRlKEZIb3N0LCBGUG9ydCk7Cit7JEVORElGfQorICBGT3duc0NsaWVudCA6PSBUcnVlOworCisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgRklucHV0U3RyZWFtIDo9IHN0cmVhbTsKKyAgRk91dHB1dFN0cmVhbSA6PSBzdHJlYW07CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0SW1wbC5PcGVuOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4uQ3JlYXRlKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnKTsKKyAgZW5kOworCisgIGlmIEZIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CisgIGVuZDsKKworICBpZiBQb3J0IDw9IDAgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Jyk7CisgIGVuZDsKKworICBpZiBGQ2xpZW50ID0gbmlsCisgIHRoZW4gSW5pdFNvY2tldDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgRkNsaWVudC5SZW1vdGVIb3N0IDo9IFRTb2NrZXRIb3N0KCBIb3N0KTsKKyAgRkNsaWVudC5SZW1vdGVQb3J0IDo9IFRTb2NrZXRQb3J0KCBJbnRUb1N0ciggUG9ydCkpOworICBGQ2xpZW50LkNvbm5lY3Q7Cit7JEVMU0V9CisgIEZDbGllbnQuT3BlbjsKK3skRU5ESUZ9CisKKyAgRklucHV0U3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IEZJbnB1dFN0cmVhbTsKK2VuZDsKKworeyBUQnVmZmVyZWRTdHJlYW0gfQorCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZsdXNoOworICBGU3RyZWFtIDo9IG5pbDsKKworICBGUmVhZEJ1ZmZlci5GcmVlOworICBGUmVhZEJ1ZmZlciA6PSBuaWw7CisKKyAgRldyaXRlQnVmZmVyLkZyZWU7CisgIEZXcml0ZUJ1ZmZlciA6PSBuaWw7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCdWZmZXJlZFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJVGhyaWZ0U3RyZWFtOyBBQnVmU2l6ZTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtIDo9IEFTdHJlYW07CisgIEZCdWZTaXplIDo9IEFCdWZTaXplOworICBGUmVhZEJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgRldyaXRlQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworZW5kOworCitkZXN0cnVjdG9yIFRCdWZmZXJlZFN0cmVhbUltcGwuRGVzdHJveTsKK2JlZ2luCisgIENsb3NlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLkZsdXNoOwordmFyCisgIGJ1ZiA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOworICAgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgICAgU2V0TGVuZ3RoKCBidWYsIGxlbiApOworICAgICAgRldyaXRlQnVmZmVyLlBvc2l0aW9uIDo9IDA7CisgICAgICBGV3JpdGVCdWZmZXIuUmVhZCggUG9pbnRlcihAYnVmWzBdKV4sIGxlbiApOworICAgICAgRlN0cmVhbS5Xcml0ZSggYnVmLCAwLCBsZW4gKTsKKyAgICBlbmQ7CisgICAgRldyaXRlQnVmZmVyLkNsZWFyOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFN0cmVhbUltcGwuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IChGV3JpdGVCdWZmZXIgPD4gbmlsKQorICAgICAgICBhbmQgKEZSZWFkQnVmZmVyIDw+IG5pbCkKKyAgICAgICAgYW5kIChGU3RyZWFtIDw+IG5pbCkKKyAgICAgICAgYW5kIEZTdHJlYW0uSXNPcGVuOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5PcGVuOworYmVnaW4KKyAgRlN0cmVhbS5PcGVuOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBuUmVhZCA6IEludGVnZXI7CisgIHRlbXBidWYgOiBUQnl0ZXM7CisgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgUmVzdWx0IDo9IDA7CisKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKworICAgICAgaWYgRlJlYWRCdWZmZXIuUG9zaXRpb24gPj0gRlJlYWRCdWZmZXIuU2l6ZSB0aGVuIGJlZ2luCisgICAgICAgIEZSZWFkQnVmZmVyLkNsZWFyOworICAgICAgICBTZXRMZW5ndGgoIHRlbXBidWYsIEZCdWZTaXplKTsKKyAgICAgICAgblJlYWQgOj0gRlN0cmVhbS5SZWFkKCB0ZW1wYnVmLCAwLCBGQnVmU2l6ZSApOworICAgICAgICBpZiBuUmVhZCA9IDAgdGhlbiBCcmVhazsgLy8gYXZvaWQgaW5maW5pdGUgbG9vcAorCisgICAgICAgIEZSZWFkQnVmZmVyLldyaXRlQnVmZmVyKCBQb2ludGVyKEB0ZW1wYnVmWzBdKV4sIG5SZWFkICk7CisgICAgICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CisgICAgICBlbmQ7CisKKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDwgRlJlYWRCdWZmZXIuU2l6ZSB0aGVuIGJlZ2luCisgICAgICAgIG5SZWFkIDo9IE1pbiggRlJlYWRCdWZmZXIuU2l6ZSAtIEZSZWFkQnVmZmVyLlBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgIHBUbXAgIDo9IHBCdWY7CisgICAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgICAgSW5jKCBSZXN1bHQsIEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBuUmVhZCkpOworICAgICAgICBEZWMoIGNvdW50LCBuUmVhZCk7CisgICAgICAgIEluYyggb2Zmc2V0LCBuUmVhZCk7CisgICAgICBlbmQ7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOwordmFyIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gMDsKKworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGUmVhZEJ1ZmZlci5TaXplOworICBlbmQ7CisKKyAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbik7CisKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgRlJlYWRCdWZmZXIuUG9zaXRpb24gOj0gMDsKKyAgICBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGNvdW50ICk7CisgICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4gYmVnaW4KKyAgICAgICAgRmx1c2g7CisgICAgICBlbmQ7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3sgVFN0cmVhbVRyYW5zcG9ydEltcGwgfQorCitjb25zdHJ1Y3RvciBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZJbnB1dFN0cmVhbSA6PSBBSW5wdXRTdHJlYW07CisgIEZPdXRwdXRTdHJlYW0gOj0gQU91dHB1dFN0cmVhbTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU3RyZWFtVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5GbHVzaDsKK2JlZ2luCisgIGlmIEZPdXRwdXRTdHJlYW0gPSBuaWwgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0c3RyZWFtJyApOworICBlbmQ7CisKKyAgRk91dHB1dFN0cmVhbS5GbHVzaDsKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0U3RyZWFtOworZW5kOworCitmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gVHJ1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZPdXRwdXRTdHJlYW07CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5PcGVuOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgZW5kOworCisgIEZPdXRwdXRTdHJlYW0uV3JpdGUoIHBCdWYsIG9mZiwgbGVuICk7CitlbmQ7CisKK3sgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCB9CisKK2NvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0KTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEFUcmFuc3BvcnQsIDEwMjQgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElTdHJlYW1UcmFuc3BvcnQ7ICBBQnVmU2l6ZTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVHJhbnNwb3J0IDo9IEFUcmFuc3BvcnQ7CisgIEZCdWZTaXplIDo9IEFCdWZTaXplOworICBJbml0QnVmZmVyczsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGVHJhbnNwb3J0LkNsb3NlOworICBGSW5wdXRCdWZmZXIgOj0gbmlsOworICBGT3V0cHV0QnVmZmVyIDo9IG5pbDsgIAorZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKK2JlZ2luCisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLkZsdXNoOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuc3BvcnQuSXNPcGVuOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkdldFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zcG9ydDsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuSW5pdEJ1ZmZlcnM7CitiZWdpbgorICBpZiBGVHJhbnNwb3J0LklucHV0U3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRklucHV0QnVmZmVyIDo9IFRCdWZmZXJlZFN0cmVhbUltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0LklucHV0U3RyZWFtLCBGQnVmU2l6ZSApOworICBlbmQ7CisgIGlmIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRk91dHB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5PdXRwdXRTdHJlYW0sIEZCdWZTaXplICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIEZUcmFuc3BvcnQuT3BlbjsKKyAgSW5pdEJ1ZmZlcnM7ICAvLyB3ZSBuZWVkIHRvIGdldCB0aGUgYnVmZmVycyB0byBtYXRjaCBGVHJhbnNwb3J0IHN1YnN0cmVhbXMgYWdhaW4KK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIGlmIEZJbnB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZPdXRwdXRCdWZmZXIuV3JpdGUoIHBCdWYsIG9mZiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworeyBURnJhbWVkVHJhbnNwb3J0SW1wbCB9CisKK3skSUZERUYgSEFWRV9DTEFTU19DVE9SfQorY2xhc3MgY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBGSGVhZGVyX0R1bW15LCBGSGVhZGVyU2l6ZSk7CisgIEZpbGxDaGFyKCBGSGVhZGVyX0R1bW15WzBdLCBMZW5ndGgoIEZIZWFkZXJfRHVtbXkpICogU2l6ZU9mKCBCeXRlICksIDApOworZW5kOworeyRFTFNFfQorcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7CitiZWdpbgorICBTZXRMZW5ndGgoIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZIZWFkZXJfRHVtbXksIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZIZWFkZXJTaXplKTsKKyAgRmlsbENoYXIoIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZIZWFkZXJfRHVtbXlbMF0sCisgICAgTGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRU5ESUZ9CisKK2NvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEluaXRXcml0ZUJ1ZmZlcjsKK2VuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlRyYW5zcG9ydC5DbG9zZTsKK2VuZDsKKworY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgSW5pdFdyaXRlQnVmZmVyOworICBGVHJhbnNwb3J0IDo9IEFUcmFuczsKK2VuZDsKKworZGVzdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgRldyaXRlQnVmZmVyLkZyZWU7CisgIEZSZWFkQnVmZmVyLkZyZWU7CisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZsdXNoOwordmFyCisgIGJ1ZiA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKKyAgZGF0YV9sZW4gOiBJbnRlZ2VyOworCitiZWdpbgorICBsZW4gOj0gRldyaXRlQnVmZmVyLlNpemU7CisgIFNldExlbmd0aCggYnVmLCBsZW4pOworICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBTeXN0ZW0uTW92ZSggRldyaXRlQnVmZmVyLk1lbW9yeV4sIGJ1ZlswXSwgbGVuICk7CisgIGVuZDsKKworICBkYXRhX2xlbiA6PSBsZW4gLSBGSGVhZGVyU2l6ZTsKKyAgaWYgKGRhdGFfbGVuIDwgMCkgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnVEZyYW1lZFRyYW5zcG9ydC5GbHVzaDogZGF0YV9sZW4gPCAwJyApOworICBlbmQ7CisKKyAgSW5pdFdyaXRlQnVmZmVyOworCisgIGJ1ZlswXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociAyNCkpOworICBidWZbMV0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgMTYpKTsKKyAgYnVmWzJdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDgpKTsKKyAgYnVmWzNdIDo9IEJ5dGUoJEZGIGFuZCBkYXRhX2xlbik7CisKKyAgRlRyYW5zcG9ydC5Xcml0ZSggYnVmLCAwLCBsZW4gKTsKKyAgRlRyYW5zcG9ydC5GbHVzaDsKK2VuZDsKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuc3BvcnQuSXNPcGVuOworZW5kOworCit0eXBlCisgIFRBY2Nlc3NNZW1vcnlTdHJlYW0gPSBjbGFzcyhUTWVtb3J5U3RyZWFtKQorICBlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Jbml0V3JpdGVCdWZmZXI7CitiZWdpbgorICBGV3JpdGVCdWZmZXIuRnJlZTsKKyAgRldyaXRlQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBUQWNjZXNzTWVtb3J5U3RyZWFtKEZXcml0ZUJ1ZmZlcikuQ2FwYWNpdHkgOj0gMTAyNDsKKyAgRldyaXRlQnVmZmVyLldyaXRlKCBQb2ludGVyKEBGSGVhZGVyX0R1bW15WzBdKV4sIEZIZWFkZXJTaXplKTsKK2VuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorICBGVHJhbnNwb3J0Lk9wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaWYgbGVuID4gKGJ1Zmxlbi1vZmYpCisgIHRoZW4gbGVuIDo9IGJ1Zmxlbi1vZmY7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZik7CisKKyAgaWYgKEZSZWFkQnVmZmVyIDw+IG5pbCkgYW5kIChsZW4gPiAwKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pOworICAgIGlmIHJlc3VsdCA+IDAgdGhlbiBiZWdpbgorICAgICAgRXhpdDsKKyAgICBlbmQ7CisgIGVuZDsKKworICBSZWFkRnJhbWU7CisgIGlmIGxlbiA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIGxlbikKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLlJlYWRGcmFtZTsKK3ZhcgorICBpMzJyZCA6IFRCeXRlczsKKyAgc2l6ZSA6IEludGVnZXI7CisgIGJ1ZmYgOiBUQnl0ZXM7CitiZWdpbgorICBTZXRMZW5ndGgoIGkzMnJkLCBGSGVhZGVyU2l6ZSApOworICBGVHJhbnNwb3J0LlJlYWRBbGwoIGkzMnJkLCAwLCBGSGVhZGVyU2l6ZSk7CisgIHNpemUgOj0KKyAgICAoKGkzMnJkWzBdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAoKGkzMnJkWzFdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAoKGkzMnJkWzJdIGFuZCAkRkYpIHNobCA4KSBvcgorICAgICAoaTMycmRbM10gYW5kICRGRik7CisgIFNldExlbmd0aCggYnVmZiwgc2l6ZSApOworICBGVHJhbnNwb3J0LlJlYWRBbGwoIGJ1ZmYsIDAsIHNpemUgKTsKKyAgRlJlYWRCdWZmZXIuRnJlZTsKKyAgRlJlYWRCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIGlmIExlbmd0aChidWZmKSA+IDAKKyAgdGhlbiBGUmVhZEJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmZlswXSleLCBzaXplICk7CisgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2ZmKTsKKworICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3sgVEZyYW1lZFRyYW5zcG9ydC5URmFjdG9yeSB9CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEFUcmFucyApOworZW5kOworCit7IFRUY3BTb2NrZXRTdHJlYW1JbXBsIH0KKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNsb3NlOworYmVnaW4KKyAgRlRjcENsaWVudC5DbG9zZTsKK2VuZDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KK2NvbnN0cnVjdG9yIFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50OyBjb25zdCBhVGltZW91dCA6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRjcENsaWVudCA6PSBBVGNwQ2xpZW50OworICBGVGltZW91dCA6PSBhVGltZW91dDsKK2VuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVFNvY2tldDsgY29uc3QgYVRpbWVvdXQgOiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7CisgIGlmIGFUaW1lb3V0ID0gMCB0aGVuCisgICAgRlRjcENsaWVudC5SZWN2VGltZW91dCA6PSBTTEVFUF9USU1FCisgIGVsc2UKKyAgICBGVGNwQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IGFUaW1lb3V0OworICBGVGNwQ2xpZW50LlNlbmRUaW1lb3V0IDo9IGFUaW1lb3V0OworZW5kOworeyRFTkRJRn0KKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLkZsdXNoOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Jc09wZW46IEJvb2xlYW47CitiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgUmVzdWx0IDo9IEZUY3BDbGllbnQuQWN0aXZlOworeyRFTFNFfQorICBSZXN1bHQgOj0gRlRjcENsaWVudC5Jc09wZW47Cit7JEVORElGfQorZW5kOworCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIEZUY3BDbGllbnQuT3BlbjsKK2VuZDsKKworCit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuU2VsZWN0KCBSZWFkUmVhZHksIFdyaXRlUmVhZHksIEV4Y2VwdEZsYWc6IFBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBSZWFkRmRzOiBURkRzZXQ7CisgIFJlYWRGZHNwdHI6IFBGRHNldDsKKyAgV3JpdGVGZHM6IFRGRHNldDsKKyAgV3JpdGVGZHNwdHI6IFBGRHNldDsKKyAgRXhjZXB0RmRzOiBURkRzZXQ7CisgIEV4Y2VwdEZkc3B0cjogUEZEc2V0OworICB0djogdGltZXZhbDsKKyAgVGltZXB0cjogUFRpbWV2YWw7CisgIHNvY2tldCA6IFRTb2NrZXQ7CitiZWdpbgorICBpZiBub3QgRlRjcENsaWVudC5BY3RpdmUgdGhlbiBiZWdpbgorICAgIHdzYUVycm9yIDo9IFdTQUVJTlZBTDsKKyAgICBFeGl0KCBTT0NLRVRfRVJST1IpOworICBlbmQ7CisKKyAgc29ja2V0IDo9IEZUY3BDbGllbnQuSGFuZGxlOworCisgIGlmIEFzc2lnbmVkKFJlYWRSZWFkeSkgdGhlbiBiZWdpbgorICAgIFJlYWRGZHNwdHIgOj0gQFJlYWRGZHM7CisgICAgRkRfWkVSTyhSZWFkRmRzKTsKKyAgICBGRF9TRVQoc29ja2V0LCBSZWFkRmRzKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBSZWFkRmRzcHRyIDo9IG5pbDsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKFdyaXRlUmVhZHkpIHRoZW4gYmVnaW4KKyAgICBXcml0ZUZkc3B0ciA6PSBAV3JpdGVGZHM7CisgICAgRkRfWkVSTyhXcml0ZUZkcyk7CisgICAgRkRfU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIFdyaXRlRmRzcHRyIDo9IG5pbDsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKEV4Y2VwdEZsYWcpIHRoZW4gYmVnaW4KKyAgICBFeGNlcHRGZHNwdHIgOj0gQEV4Y2VwdEZkczsKKyAgICBGRF9aRVJPKEV4Y2VwdEZkcyk7CisgICAgRkRfU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBFeGNlcHRGZHNwdHIgOj0gbmlsOworICBlbmQ7CisKKyAgaWYgVGltZU91dCA+PSAwIHRoZW4gYmVnaW4KKyAgICB0di50dl9zZWMgOj0gVGltZU91dCBkaXYgMTAwMDsKKyAgICB0di50dl91c2VjIDo9ICAxMDAwICogKFRpbWVPdXQgbW9kIDEwMDApOworICAgIFRpbWVwdHIgOj0gQHR2OworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIFRpbWVwdHIgOj0gbmlsOyAgLy8gd2FpdCBmb3JldmVyCisgIGVuZDsKKworICB3c2FFcnJvciA6PSAwOworICB0cnkKKyAgICB7JElGREVGIE1TV0lORE9XU30KKyAgICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgICByZXN1bHQgOj0gV2luU29jay5zZWxlY3QoICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRUxTRX0KKyAgICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luU29jay5zZWxlY3QoIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgICAgeyRFTkRJRn0KKyAgICB7JEVORElGfQorICAgIHskSUZERUYgTElOVVh9CisgICAgICByZXN1bHQgOj0gTGliYy5zZWxlY3QoICAgICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICB7JEVORElGfQorCQorICAgIGlmIHJlc3VsdCA9IFNPQ0tFVF9FUlJPUgorICAgIHRoZW4gd3NhRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOworCisgIGV4Y2VwdAorICAgIHJlc3VsdCA6PSBTT0NLRVRfRVJST1I7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KKyAgIFJlYWRSZWFkeV4gOj0gRkRfSVNTRVQoc29ja2V0LCBSZWFkRmRzKTsKKyAgIAorICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuCisgICAgV3JpdGVSZWFkeV4gOj0gRkRfSVNTRVQoc29ja2V0LCBXcml0ZUZkcyk7CisgIAorICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuCisgICAgRXhjZXB0RmxhZ14gOj0gRkRfSVNTRVQoc29ja2V0LCBFeGNlcHRGZHMpOworZW5kOworeyRFTkRJRn0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldhaXRGb3JEYXRhKCBUaW1lT3V0IDogSW50ZWdlcjsgcEJ1ZiA6IFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzaXJlZEJ5dGVzIDogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3NhRXJyb3IsIGJ5dGVzUmVhZHkgOiBJbnRlZ2VyKTogVFdhaXRGb3JEYXRhOwordmFyIGJDYW5SZWFkLCBiRXJyb3IgOiBCb29sZWFuOworICAgIHJldHZhbCA6IEludGVnZXI7Citjb25zdCAKKyAgTVNHX1BFRUsgPSB7JElGREVGIE9MRF9VTklUX05BTUVTfSBXaW5Tb2NrLk1TR19QRUVLICB7JEVMU0V9IFdpbmFwaS5XaW5Tb2NrLk1TR19QRUVLICB7JEVORElGfTsKK2JlZ2luCisgIGJ5dGVzUmVhZHkgOj0gMDsKKworICAvLyBUaGUgc2VsZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzb2NrZXQgaGFuZGxlcyB0aGF0IGFyZSByZWFkeQorICAvLyBhbmQgY29udGFpbmVkIGluIHRoZSBmZF9zZXQgc3RydWN0dXJlcywgemVybyBpZiB0aGUgdGltZSBsaW1pdCBleHBpcmVkLAorICAvLyBvciBTT0NLRVRfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgU09DS0VUX0VSUk9SLAorICAvLyBXU0FHZXRMYXN0RXJyb3IgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBlcnJvciBjb2RlLgorICByZXR2YWwgOj0gU2VsZi5TZWxlY3QoIEBiQ2FuUmVhZCwgbmlsLCBAYkVycm9yLCBUaW1lT3V0LCB3c2FFcnJvcik7CisgIGlmIHJldHZhbCA9IFNPQ0tFVF9FUlJPUgorICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IpOworICBpZiAocmV0dmFsID0gMCkgb3Igbm90IGJDYW5SZWFkCisgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9UaW1lb3V0KTsKKworICAvLyByZWN2KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgLy8gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIDAgd2hlbiB0aGUgcGVlciBoYXMgcGVyZm9ybWVkIGFuIG9yZGVybHkgc2h1dGRvd24uCisgIAorICByZXR2YWwgOj0gcmVjdiggRlRjcENsaWVudC5IYW5kbGUsIHBCdWZeLCBEZXNpcmVkQnl0ZXMsIE1TR19QRUVLKTsKKyAgaWYgcmV0dmFsIDw9IDAKKyAgdGhlbiBFeGl0KCBUV2FpdEZvckRhdGEud2ZkX0Vycm9yKTsKKworICAvLyBhdCBsZWFzdCB3ZSBoYXZlIHNvbWUgZGF0YQorICBieXRlc1JlYWR5IDo9IE1pbiggcmV0dmFsLCBEZXNpcmVkQnl0ZXMpOworICByZXN1bHQgOj0gVFdhaXRGb3JEYXRhLndmZF9IYXZlRGF0YTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgd2ZkIDogVFdhaXRGb3JEYXRhOworICAgIHdzYUVycm9yLAorICAgIG1zZWNzIDogSW50ZWdlcjsKKyAgICBuQnl0ZXMgOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBGVGltZW91dCA+IDAKKyAgdGhlbiBtc2VjcyA6PSBGVGltZW91dAorICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisKKyAgcmVzdWx0IDo9IDA7CisgIHBUbXAgICA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgorCisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgd2ZkIDo9IFdhaXRGb3JEYXRhKCBtc2VjcywgcFRtcCwgY291bnQsIHdzYUVycm9yLCBuQnl0ZXMpOworICAgICAgY2FzZSB3ZmQgb2YKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9FcnJvciAgICA6ICBFeGl0OworICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhIDogIEJyZWFrOworICAgICAgICBUV2FpdEZvckRhdGEud2ZkX1RpbWVvdXQgIDogIGJlZ2luCisgICAgICAgICAgaWYgKEZUaW1lb3V0ID0gMCkKKyAgICAgICAgICB0aGVuIEV4aXQKKyAgICAgICAgICBlbHNlIGJlZ2luCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKworICAgICAgICAgIGVuZDsKKyAgICAgICAgZW5kOworICAgICAgZWxzZQorICAgICAgICBBU1NFUlQoIEZBTFNFKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICAvLyByZWR1Y2UgdGhlIHRpbWVvdXQgb25jZSB3ZSBnb3QgZGF0YQorICAgIGlmIEZUaW1lb3V0ID4gMAorICAgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQgZGl2IDEwCisgICAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUIGRpdiAxMDsKKyAgICBtc2VjcyA6PSBNYXgoIG1zZWNzLCAyMDApOworCisgICAgQVNTRVJUKCBuQnl0ZXMgPD0gY291bnQpOworICAgIG5CeXRlcyA6PSBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIHBUbXBeLCBuQnl0ZXMpOworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG9sZCBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgbGVuIDo9IEZUY3BDbGllbnQuQnl0ZXNSZWNlaXZlZDsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKKworICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIFBvaW50ZXIoQFJlc3VsdFswXSleLCBsZW4pOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgordmFyIGJDYW5Xcml0ZSwgYkVycm9yIDogQm9vbGVhbjsKKyAgICByZXR2YWwsIHdzYUVycm9yIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOworCisgIC8vIFRoZSBzZWxlY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNvY2tldCBoYW5kbGVzIHRoYXQgYXJlIHJlYWR5CisgIC8vIGFuZCBjb250YWluZWQgaW4gdGhlIGZkX3NldCBzdHJ1Y3R1cmVzLCB6ZXJvIGlmIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQsCisgIC8vIG9yIFNPQ0tFVF9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBTT0NLRVRfRVJST1IsCisgIC8vIFdTQUdldExhc3RFcnJvciBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIGVycm9yIGNvZGUuCisgIHJldHZhbCA6PSBTZWxmLlNlbGVjdCggbmlsLCBAYkNhbldyaXRlLCBAYkVycm9yLCBGVGltZU91dCwgd3NhRXJyb3IpOworICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOworCisgIGlmIChyZXR2YWwgPSAwKQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ3RpbWVkIG91dCcpOworCisgIGlmIGJFcnJvciBvciBub3QgYkNhbldyaXRlCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCd1bmtub3duIGVycm9yJyk7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIEZUY3BDbGllbnQuU2VuZEJ1ZiggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTFNFfQorCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgcmVzdWx0IDo9IDA7CisgIHBUbXAgICA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgorICAgIG5CeXRlcyA6PSBGVGNwQ2xpZW50LlJlYWQoIHBUbXBeLCBjb3VudCk7CisgICAgaWYgbkJ5dGVzID0gMCB0aGVuIEV4aXQ7CisgICAgSW5jKCBwVG1wLCBuQnl0ZXMpOworICAgIERlYyggY291bnQsIG5CeXRlcyk7CisgICAgSW5jKCByZXN1bHQsIG5CeXRlcyk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gMDsKKyAgdHJ5CisgICAgaWYgRlRjcENsaWVudC5QZWVrIHRoZW4KKyAgICAgIHJlcGVhdAorICAgICAgICBTZXRMZW5ndGgoUmVzdWx0LCBMZW5ndGgoUmVzdWx0KSArIDEwMjQpOworICAgICAgICBsZW4gOj0gRlRjcENsaWVudC5SZWFkKFJlc3VsdFtMZW5ndGgoUmVzdWx0KSAtIDEwMjRdLCAxMDI0KTsKKyAgICAgIHVudGlsIGxlbiA8IDEwMjQ7CisgIGV4Y2VwdAorICAgIG9uIFRUcmFuc3BvcnRFeGNlcHRpb24gZG8gYmVnaW4geyBkb24ndCBhbGxvdyBkZWZhdWx0IGV4Y2VwdGlvbnMgfSBlbmQ7CisgICAgZWxzZSByYWlzZTsKKyAgZW5kOworICBpZiBsZW4gPiAwIHRoZW4KKyAgICBTZXRMZW5ndGgoUmVzdWx0LCBMZW5ndGgoUmVzdWx0KSAtIDEwMjQgKyBsZW4pOworZW5kOworCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgbm90IEZUY3BDbGllbnQuSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LldyaXRlKCBwVG1wXiwgY291bnQpOworZW5kOworCit7JEVORElGfQorCisKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0KK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOworZW5kOworeyRJRkVORH0KKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UeXBlUmVnaXN0cnkucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGU5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcwpAQCAtMCwwICsxLDk1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlR5cGVSZWdpc3RyeTsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFR5cEluZm8sCisgIFRocmlmdC5Qcm90b2NvbDsKKwordHlwZQorICBURmFjdG9yeU1ldGhvZDxUPiA9IGZ1bmN0aW9uOlQ7CisKKyAgVHlwZVJlZ2lzdHJ5ID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIGNsYXNzIHZhciBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAgOiBURGljdGlvbmFyeTxQb2ludGVyLCBQb2ludGVyPjsKKyAgcHVibGljCisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsKKyAgICBjbGFzcyBwcm9jZWR1cmUgUmVnaXN0ZXJUeXBlRmFjdG9yeTxGPihjb25zdCBhRmFjdG9yeU1ldGhvZDogVEZhY3RvcnlNZXRob2Q8Rj4pOworICAgIGNsYXNzIGZ1bmN0aW9uICBDb25zdHJ1Y3Q8Rj46IEY7CisgICAgY2xhc3MgZnVuY3Rpb24gIENvbnN0cnVjdEZyb21UeXBlSW5mbyhjb25zdCBhVHlwZUluZm86IFBUeXBlSW5mbyk6IElCYXNlOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKKworeyBUeXBlUmVnaXN0cmF0aW9uIH0KKworY2xhc3MgY29uc3RydWN0b3IgVHlwZVJlZ2lzdHJ5LkNyZWF0ZTsKK2JlZ2luCisgIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cCA6PSBURGljdGlvbmFyeTxQb2ludGVyLCBQb2ludGVyPi5DcmVhdGU7CitlbmQ7CisKK2NsYXNzIGRlc3RydWN0b3IgVHlwZVJlZ2lzdHJ5LkRlc3Ryb3k7CitiZWdpbgorICBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuRnJlZTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFR5cGVSZWdpc3RyeS5SZWdpc3RlclR5cGVGYWN0b3J5PEY+KGNvbnN0IGFGYWN0b3J5TWV0aG9kOiBURmFjdG9yeU1ldGhvZDxGPik7Cit2YXIKKyAgVHlwZUluZm8gICAgIDogUG9pbnRlcjsKK2JlZ2luCisgIFR5cGVJbmZvIDo9IFN5c3RlbS5UeXBlSW5mbyhGKTsKKworICBpZiAoVHlwZUluZm8gPD4gbmlsKSBhbmQgKFBUeXBlSW5mbyhUeXBlSW5mbykuS2luZCA9IHRrSW50ZXJmYWNlKQorICB0aGVuIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cC5BZGRPclNldFZhbHVlKFR5cGVJbmZvLCBAYUZhY3RvcnlNZXRob2QpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUeXBlUmVnaXN0cnkuQ29uc3RydWN0PEY+OiBGOwordmFyCisgIFR5cGVJbmZvICAgICA6IFBUeXBlSW5mbzsKKyAgRmFjdG9yeSAgICAgIDogUG9pbnRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBkZWZhdWx0KEYpOworCisgIFR5cGVJbmZvIDo9IFN5c3RlbS5UeXBlSW5mbyhGKTsKKworICBpZiBBc3NpZ25lZChUeXBlSW5mbykgYW5kIChUeXBlSW5mby5LaW5kID0gdGtJbnRlcmZhY2UpCisgIHRoZW4gYmVnaW4KKyAgICBpZiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuVHJ5R2V0VmFsdWUoVHlwZUluZm8sIEZhY3RvcnkpCisgICAgdGhlbiBSZXN1bHQgOj0gVEZhY3RvcnlNZXRob2Q8Rj4oRmFjdG9yeSkoKTsKKyAgZW5kOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUeXBlUmVnaXN0cnkuQ29uc3RydWN0RnJvbVR5cGVJbmZvKGNvbnN0IGFUeXBlSW5mbzogUFR5cGVJbmZvKTogSUJhc2U7Cit2YXIKKyAgRmFjdG9yeSAgICAgIDogUG9pbnRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBuaWw7CisgIGlmIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cC5UcnlHZXRWYWx1ZShhVHlwZUluZm8sIEZhY3RvcnkpCisgIHRoZW4gUmVzdWx0IDo9IElCYXNlKFRGYWN0b3J5TWV0aG9kPElCYXNlPihGYWN0b3J5KSgpKTsKK2VuZDsKKworCisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1Nzg2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKQEAgLTAsMCArMSwyNTkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuVXRpbHM7CisKK2ludGVyZmFjZQorCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCit1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBDaGFyYWN0ZXIsIFN5bmNPYmpzOworICB7JEVMU0V9CisgIFN5c3RlbS5DbGFzc2VzLCBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uQ2hhcmFjdGVyLCBTeXN0ZW0uU3luY09ianM7CisgIHskRU5ESUZ9CisKK3R5cGUKKyAgSU92ZXJsYXBwZWRIZWxwZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3tBMTgzMkVGQS0yRTAyLTQ4ODQtOEYwOS1GMEEwMjc3MTU3RkF9J10KKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZFB0ciA6IFBPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIFdhaXRIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIFdhaXRGb3IoZHdUaW1lb3V0OiBEV09SRCkgOiBEV09SRDsKKyAgZW5kOworCisgIFRPdmVybGFwcGVkSGVscGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSU92ZXJsYXBwZWRIZWxwZXIpCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBGT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworICAgIEZFdmVudCAgICAgIDogVEV2ZW50OworCisgICAgLy8gSU92ZXJsYXBwZWRIZWxwZXIKKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZFB0ciA6IFBPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIFdhaXRIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIFdhaXRGb3IoZHdUaW1lb3V0OiBEV09SRCkgOiBEV09SRDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBCYXNlNjRVdGlscyA9IGNsYXNzIHNlYWxlZAorICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBFbmNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsgc3RhdGljOworICAgIGNsYXNzIGZ1bmN0aW9uIERlY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOyBzdGF0aWM7CisgIGVuZDsKKworCisgIENoYXJVdGlscyA9IGNsYXNzIHNlYWxlZAorICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47IHN0YXRpYzsgaW5saW5lOworICAgIGNsYXNzIGZ1bmN0aW9uIElzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgZW5kOworCisKK3skSUZERUYgV2luNjR9CitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsgIAoreyRFTkRJRn0KKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRPdmVybGFwcGVkSGVscGVySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGaWxsQ2hhciggRk92ZXJsYXBwZWQsIFNpemVPZihGT3ZlcmxhcHBlZCksIDApOworICBGRXZlbnQgOj0gVEV2ZW50LkNyZWF0ZSggbmlsLCBUUlVFLCBGQUxTRSwgJycpOyAgLy8gYWx3YXlzIE1hbnVhbFJlc2V0LCBzZWUgTVNETgorICBGT3ZlcmxhcHBlZC5oRXZlbnQgOj0gRkV2ZW50LkhhbmRsZTsKK2VuZDsKKworCisKK2Rlc3RydWN0b3IgVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGT3ZlcmxhcHBlZC5oRXZlbnQgOj0gMDsKKyAgICBGcmVlQW5kTmlsKCBGRXZlbnQpOworCisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworCitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLk92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGT3ZlcmxhcHBlZDsKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuT3ZlcmxhcHBlZFB0ciA6IFBPdmVybGFwcGVkOworYmVnaW4KKyAgcmVzdWx0IDo9IEBGT3ZlcmxhcHBlZDsKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuV2FpdEhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRk92ZXJsYXBwZWQuaEV2ZW50OworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5XYWl0Rm9yKCBkd1RpbWVvdXQgOiBEV09SRCkgOiBEV09SRDsKK2JlZ2luCisgIHJlc3VsdCA6PSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBGT3ZlcmxhcHBlZC5oRXZlbnQsIGR3VGltZW91dCk7CitlbmQ7CisKKworeyBCYXNlNjRVdGlscyB9CisKK2NsYXNzIGZ1bmN0aW9uIEJhc2U2NFV0aWxzLkVuY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOworY29uc3QgRU5DT0RFX1RBQkxFIDogUEFuc2lDaGFyID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nOworYmVnaW4KKyAgQVNTRVJUKCBsZW4gaW4gWzEuLjNdKTsKKyAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoc3JjW3NyY09mZl0gc2hyIDIpIGFuZCAkM0ZdKTsKKyAgY2FzZSBsZW4gb2YKKyAgICAzIDogYmVnaW4KKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwKSBvciAoKHNyY1tzcmNPZmYgKyAxXSBzaHIgNCkgYW5kICQwRildKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoKHNyY1tzcmNPZmYgKyAxXSBzaGwgMikgYW5kICQzQykgb3IgKChzcmNbc3JjT2ZmICsgMl0gc2hyIDYpIGFuZCAkMDMpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgc3JjW3NyY09mZiArIDJdIGFuZCAkM0ZdKTsKKyAgICAgIHJlc3VsdCA6PSA0OworICAgIGVuZDsKKworICAgIDIgOiBiZWdpbgorICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzApIG9yICgoc3JjW3NyY09mZiArIDFdIHNociA0KSBhbmQgJDBGKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIChzcmNbc3JjT2ZmICsgMV0gc2hsIDIpIGFuZCAkM0NdKTsKKyAgICAgIHJlc3VsdCA6PSAzOworICAgIGVuZDsKKworICAgIDEgOiBiZWdpbgorICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMF0pOworICAgICAgcmVzdWx0IDo9IDI7CisgICAgZW5kOworCisgIGVsc2UKKyAgICBBU1NFUlQoIEZBTFNFKTsKKyAgICByZXN1bHQgOj0gMDsgIC8vIGJlY2F1c2UgaW52YWxpZCBjYWxsCisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBCYXNlNjRVdGlscy5EZWNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsKK2NvbnN0IERFQ09ERV9UQUJMRSA6IGFycmF5WzAuLiRGRl0gb2YgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgID0gKCAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAorICAgICAgICAgICAgICAgICAgICAgICA1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEsMTIsMTMsMTQsCisgICAgICAgICAgICAgICAgICAgICAgIDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSAgKTsKK2JlZ2luCisgIEFTU0VSVCggbGVuIGluIFsxLi40XSk7CisgIHJlc3VsdCA6PSAxOworICBkc3RbZHN0T2ZmXSA6PSAoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmXSAgICAgYW5kICQwRkZdIHNobCAyKQorICAgICAgICAgICAgICBvciAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gYW5kICQwRkZdIHNociA0KSk7CisKKyAgaWYgKGxlbiA+IDIpIHRoZW4gYmVnaW4KKyAgICBJbmMoIHJlc3VsdCk7CisgICAgSW5jKCBkc3RPZmYpOworICAgIGRzdFtkc3RPZmZdIDo9ICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gYW5kICQwRkZdIHNobCA0KSBhbmQgJEYwKQorICAgICAgICAgICAgICAgIG9yICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gYW5kICQwRkZdIHNociAyKSk7CisKKyAgICBpZiAobGVuID4gMykgdGhlbiBiZWdpbgorICAgICAgSW5jKCByZXN1bHQpOworICAgICAgSW5jKCBkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSBhbmQgJDBGRl0gc2hsIDYpIGFuZCAkQzApCisgICAgICAgICAgICAgICAgICBvciAgICBERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDNdIGFuZCAkMEZGXSk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjUuMH0KKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBDaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRUxTRX0KKyAgICByZXN1bHQgOj0gU3lzdGVtLkNoYXJhY3Rlci5Jc0hpZ2hTdXJyb2dhdGUoYyk7CisgICAgeyRFTkRJRn0KKyAgeyRFTFNFfQorICByZXN1bHQgOj0gYy5Jc0hpZ2hTdXJyb2dhdGUoKTsKKyAgeyRJRkVORH0KK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzTG93U3Vycm9nYXRlKGMpOworICAgIHskRUxTRX0KKyAgICByZXN1bHQgOj0gU3lzdGVtLkNoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVORElGfQorICB7JEVMU0V9CisgIHJlc3VsdCA6PSBjLklzTG93U3Vycm9nYXRlKCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworeyRJRkRFRiBXaW42NH0KKworZnVuY3Rpb24gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggdmFyIFRhcmdldCA6IEludDY0OyBFeGNoYW5nZSwgQ29tcGFyYW5kIDogSW50NjQpIDogSW50NjQ7ICBpbmxpbmU7CitiZWdpbgorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICByZXN1bHQgOj0gV2luZG93cy5JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBUYXJnZXQsIEV4Y2hhbmdlLCBDb21wYXJhbmQpOworICB7JEVMU0V9CisgIHJlc3VsdCA6PSBXaW5BcGkuV2luZG93cy5JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBUYXJnZXQsIEV4Y2hhbmdlLCBDb21wYXJhbmQpOworICB7JEVORElGfQorZW5kOworCisKK2Z1bmN0aW9uIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggdmFyIEFkZGVuZCA6IEludDY0OyBWYWx1ZSA6IEludDY0KSA6IEludDY0OwordmFyIG9sZCA6IEludDY0OworYmVnaW4KKyAgcmVwZWF0CisgICAgT2xkIDo9IEFkZGVuZDsKKyAgdW50aWwgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIEFkZGVuZCwgT2xkICsgVmFsdWUsIE9sZCkgPSBPbGQpOworICByZXN1bHQgOj0gT2xkOworZW5kOworCit7JEVORElGfQorCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDgxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCkBAIC0wLDAgKzEsMjM5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0OworCitpbnRlcmZhY2UKKwordXNlcworICBTeXNVdGlscywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKKyAgVGhyaWZ0LlByb3RvY29sOworCitjb25zdAorICBWZXJzaW9uID0gJzEuMC4wJzsKKwordHlwZQorICBURXhjZXB0aW9uID0gVGhyaWZ0LkV4Y2VwdGlvbi5URXhjZXB0aW9uOyAvLyBjb21wYXRpYmlsaXR5IGFsaWFzCisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzcyA9IGNsYXNzIG9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkOworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICB0eXBlCit7JFNDT1BFREVOVU1TIE9OfQorICAgICAgVEV4Y2VwdGlvblR5cGUgPSAoCisgICAgICAgIFVua25vd24sCisgICAgICAgIFVua25vd25NZXRob2QsCisgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgV3JvbmdNZXRob2ROYW1lLAorICAgICAgICBCYWRTZXF1ZW5jZUlELAorICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICBJbnRlcm5hbEVycm9yLAorICAgICAgICBQcm90b2NvbEVycm9yLAorICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCisgICAgICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgICAgKTsKK3skU0NPUEVERU5VTVMgT0ZGfQorICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIEhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIHB1YmxpYworICAgIC8vIHB1cnBvc2VmdWxseSBoaWRlIGluaGVyaXRlZCBjb25zdHJ1Y3RvcgorICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisKKyAgICBjbGFzcyBmdW5jdGlvbiBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKKworICAgIGNsYXNzIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sICk7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBlbmQ7CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKworaW1wbGVtZW50YXRpb24KKworeyBUQXBwbGljYXRpb25FeGNlcHRpb24gfQorCitmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CitiZWdpbgorICBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlECisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm0KKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5VbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKK2VuZDsKKworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCcnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZSkuQ3JlYXRlKG1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5HZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKK2JlZ2luCisgIGNhc2UgQVR5cGUgb2YKKyAgICBURXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZTogICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZTsKKyAgICBURXhjZXB0aW9uVHlwZS5Xcm9uZ01ldGhvZE5hbWU6ICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWU7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkU2VxdWVuY2VJRDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRDsKKyAgICBURXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0OiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0OworICAgIFRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3I6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3I7CisgICAgVEV4Y2VwdGlvblR5cGUuUHJvdG9jb2xFcnJvcjogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvcjsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkVHJhbnNmb3JtOiAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbDogICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbDsKKyAgICBURXhjZXB0aW9uVHlwZS5VbnN1cHBvcnRlZENsaWVudFR5cGU6IFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGU7CisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bjsKKyAgZW5kOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK3ZhcgorICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgbXNnIDogc3RyaW5nOworICB0eXAgOiBURXhjZXB0aW9uVHlwZTsKKyAgc3RydWMgOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgbXNnIDo9ICcnOworICB0eXAgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKyAgc3RydWMgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luOworICB3aGlsZSAoIFRydWUgKSBkbworICBiZWdpbgorICAgIGZpZWxkIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luOworICAgIGlmICggZmllbGQuVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIGNhc2UgZmllbGQuSWQgb2YKKyAgICAgIDEgOiBiZWdpbgorICAgICAgICBpZiAoIGZpZWxkLlR5cGVfID0gVFR5cGUuU3RyaW5nXykgdGhlbgorICAgICAgICBiZWdpbgorICAgICAgICAgIG1zZyA6PSBpcHJvdC5SZWFkU3RyaW5nOworICAgICAgICBlbmQgZWxzZQorICAgICAgICBiZWdpbgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcCggaXByb3QsIGZpZWxkLlR5cGVfICk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZDsKKworICAgICAgMiA6IGJlZ2luCisgICAgICAgIGlmICggZmllbGQuVHlwZV8gPSBUVHlwZS5JMzIpIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICB0eXAgOj0gVEV4Y2VwdGlvblR5cGUoIGlwcm90LlJlYWRJMzIgKTsKKyAgICAgICAgZW5kIGVsc2UKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoIGlwcm90LCBmaWVsZC5UeXBlXyApOworICAgICAgICBlbmQ7CisgICAgICBlbmQgZWxzZQorICAgICAgYmVnaW4KKyAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKCBpcHJvdCwgZmllbGQuVHlwZV8pOworICAgICAgZW5kOworICAgIGVuZDsKKyAgICBpcHJvdC5SZWFkRmllbGRFbmQ7CisgIGVuZDsKKyAgaXByb3QuUmVhZFN0cnVjdEVuZDsKKyAgUmVzdWx0IDo9IEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZSh0eXApLkNyZWF0ZShtc2cpOworZW5kOworCitwcm9jZWR1cmUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsKK3ZhcgorICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CisgIGZpZWxkIDogVFRocmlmdEZpZWxkOworYmVnaW4KKyAgSW5pdChzdHJ1YywgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICBJbml0KGZpZWxkKTsKKworICBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCBzdHJ1YyApOworICBpZiBNZXNzYWdlIDw+ICcnIHRoZW4KKyAgYmVnaW4KKyAgICBmaWVsZC5OYW1lIDo9ICdtZXNzYWdlJzsKKyAgICBmaWVsZC5UeXBlXyA6PSBUVHlwZS5TdHJpbmdfOworICAgIGZpZWxkLklkIDo9IDE7CisgICAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCBmaWVsZCApOworICAgIG9wcm90LldyaXRlU3RyaW5nKCBNZXNzYWdlICk7CisgICAgb3Byb3QuV3JpdGVGaWVsZEVuZDsKKyAgZW5kOworCisgIGZpZWxkLk5hbWUgOj0gJ3R5cGUnOworICBmaWVsZC5UeXBlXyA6PSBUVHlwZS5JMzI7CisgIGZpZWxkLklkIDo9IDI7CisgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgIG9wcm90LldyaXRlSTMyKEludGVnZXIoR2V0VHlwZSkpOworICBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7CisgIG9wcm90LldyaXRlRmllbGRTdG9wKCk7CisgIG9wcm90LldyaXRlU3RydWN0RW5kKCk7CitlbmQ7CisKK3sgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcwpAQCAtMCwwICsxLDEzMiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IENvbnNvbGVIZWxwZXI7CisKK2ludGVyZmFjZQorCit1c2VzIENsYXNzZXM7CisKK3R5cGUKKyAgVFRocmlmdENvbnNvbGUgPSBjbGFzcworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKKyAgZW5kOworCisgIFRHVUlDb25zb2xlID0gY2xhc3MoIFRUaHJpZnRDb25zb2xlICkKKyAgcHJpdmF0ZQorICAgIEZMaW5lQnJlYWsgOiBCb29sZWFuOworICAgIEZNZW1vIDogVFN0cmluZ3M7CisKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxXcml0ZSggY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFNZW1vOiBUU3RyaW5ncyk7CisgIGVuZDsKKworZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7Citwcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7Citwcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3ZhcgorICBGRGVmYXVsdENvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKKyAgRkNvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKKworZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7CitiZWdpbgorICBSZXN1bHQgOj0gRkNvbnNvbGU7CitlbmQ7CisKK3sgVFRocmlmdENvbnNvbGUgfQorCitwcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIFN5c3RlbS5Xcml0ZSggUyApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGVsbiggUyApOworZW5kOworCitwcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7CitiZWdpbgorICBGQ29uc29sZSA6PSBBQ29uc29sZTsKK2VuZDsKKworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworYmVnaW4KKyAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOworZW5kOworCit7IFRHVUlDb25zb2xlIH0KKworY29uc3RydWN0b3IgVEdVSUNvbnNvbGUuQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRk1lbW8gOj0gQU1lbW87CisgIEZMaW5lQnJlYWsgOj0gVHJ1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLkludGVybmFsV3JpdGUoY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKK3ZhcgorICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRkxpbmVCcmVhayB0aGVuCisgIGJlZ2luCisgICAgRk1lbW8uQWRkKCBTICk7CisgIGVuZCBlbHNlCisgIGJlZ2luCisgICAgaWR4IDo9IEZNZW1vLkNvdW50IC0gMTsKKyAgICBpZiBpZHggPCAwIHRoZW4KKyAgICAgIEZNZW1vLkFkZCggUyApCisgICAgZWxzZQorICAgICAgRk1lbW9baWR4XSA6PSBGTWVtb1tpZHhdICsgUzsKKyAgZW5kOworICBGTGluZUJyZWFrIDo9IGJXcml0ZUxpbmU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgRmFsc2UpOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBJbnRlcm5hbFdyaXRlKCBTLCBUcnVlKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KK2JlZ2luCisgIEZEZWZhdWx0Q29uc29sZSA6PSBUVGhyaWZ0Q29uc29sZS5DcmVhdGU7CisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworZmluYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUuRnJlZTsKK2VuZDsKKworZW5kLgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmE0M2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCkBAIC0wLDAgKzEsMTQ1NSBAQAor77u/KCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RDbGllbnQ7CisKK3skSSAuLi9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jfQorCit7LiRERUZJTkUgU3RyZXNzVGVzdH0gICAvLyBhY3RpdmF0ZSB0byBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHdpdGggZnJlcXVlbnQgY29ubmVjdHMvZGlzY29ubmVjdHMKK3suJERFRklORSBQZXJmVGVzdH0gICAgIC8vIGFjdGl2YXRlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0Cit7JERFRklORSBFeGNlcHRpb25zfSAgICAvLyBhY3RpdmF0ZSB0aGUgZXhjZXB0aW9ucyB0ZXN0IChvciBkaXNhYmxlIHdoaWxlIGRlYnVnZ2luZykKKworeyRpZiBDb21waWxlclZlcnNpb24gPj0gMjh9Cit7JERFRklORSBTdXBwb3J0c0FzeW5jfQoreyRpZmVuZH0KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsIE1hdGgsIENvbU9iaiwgQWN0aXZlWCwKKyAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfSBTeXN0ZW0uVGhyZWFkaW5nLCB7JEVORElGfQorICBEYXRlVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUZXN0Q29uc3RhbnRzLAorICBDb25zb2xlSGVscGVyLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU3RyZWFtLAorICBUaHJpZnQuVGVzdCwKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK3R5cGUKKyAgVFRocmVhZENvbnNvbGUgPSBjbGFzcworICBwcml2YXRlCisgICAgRlRocmVhZCA6IFRUaHJlYWQ7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUyA6IHN0cmluZyk7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUyA6IHN0cmluZyk7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVGhyZWFkOiBUVGhyZWFkKTsKKyAgZW5kOworCisgIFRUZXN0U2V0dXAgPSByZWNvcmQKKyAgICBwcm90VHlwZSAgOiBUS25vd25Qcm90b2NvbDsKKyAgICBlbmRwb2ludCAgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgICAgbGF5ZXJlZCAgIDogVExheWVyZWRUcmFuc3BvcnRzOworICAgIHVzZVNTTCAgICA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKKyAgICBob3N0ICAgICAgOiBzdHJpbmc7CisgICAgcG9ydCAgICAgIDogSW50ZWdlcjsKKyAgICBzUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgZW5kOworCisgIFRDbGllbnRUaHJlYWQgPSBjbGFzcyggVFRocmVhZCApCisgIHByaXZhdGUgdHlwZQorICAgIFRUZXN0R3JvdXAgPSAoCisgICAgICB0ZXN0X1Vua25vd24sCisgICAgICB0ZXN0X0Jhc2VUeXBlcywKKyAgICAgIHRlc3RfU3RydWN0cywKKyAgICAgIHRlc3RfQ29udGFpbmVycywKKyAgICAgIHRlc3RfRXhjZXB0aW9ucworICAgICAgLy8gbmV3IHZhbHVlcyBoZXJlCisgICAgKTsKKyAgICBUVGVzdEdyb3VwcyA9IHNldCBvZiBUVGVzdEdyb3VwOworCisgICAgVFRlc3RTaXplID0gKAorICAgICAgRW1wdHksICAgICAgICAgICAvLyBFZGdlIGNhc2U6IHRoZSB6ZXJvLWxlbmd0aCBlbXB0eSBiaW5hcnkKKyAgICAgIE5vcm1hbCwgICAgICAgICAgLy8gRmFpcmx5IHNtYWxsIGFycmF5IG9mIHVzdWFsIHNpemUgKDI1NiBieXRlcykKKyAgICAgIEJ5dGVBcnJheVRlc3QsICAgLy8gVEhSSUZULTQ0NTQgTGFyZ2Ugd3JpdGVzL3JlYWRzIG1heSBjYXVzZSByYW5nZSBjaGVjayBlcnJvcnMgaW4gZGVidWcgbW9kZQorICAgICAgUGlwZVdyaXRlTGltaXQgICAvLyBUSFJJRlQtNDM3MiBQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLgorICAgICk7CisKKyAgcHJpdmF0ZQorICAgIEZTZXR1cCA6IFRUZXN0U2V0dXA7CisgICAgRlRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgRlByb3RvY29sIDogSVByb3RvY29sOworICAgIEZOdW1JdGVyYXRpb24gOiBJbnRlZ2VyOworICAgIEZDb25zb2xlIDogVFRocmVhZENvbnNvbGU7CisKKyAgICAvLyB0ZXN0IHJlcG9ydGluZywgd2lsbCBiZSByZWZhY3RvcmVkIG91dCBpbnRvIHNlcGFyYXRlIGNsYXNzIGxhdGVyCisgICAgRlRlc3RHcm91cCA6IHN0cmluZzsKKyAgICBGQ3VycmVudFRlc3QgOiBUVGVzdEdyb3VwOworICAgIEZTdWNjZXNzZXMgOiBJbnRlZ2VyOworICAgIEZFcnJvcnMgOiBUU3RyaW5nTGlzdDsKKyAgICBGRmFpbGVkIDogVFRlc3RHcm91cHM7CisgICAgRkV4ZWN1dGVkIDogVFRlc3RHcm91cHM7CisgICAgcHJvY2VkdXJlIFN0YXJ0VGVzdEdyb3VwKCBjb25zdCBhR3JvdXAgOiBzdHJpbmc7IGNvbnN0IGFUZXN0IDogVFRlc3RHcm91cCk7CisgICAgcHJvY2VkdXJlIEV4cGVjdCggYVRlc3RSZXN1bHQgOiBCb29sZWFuOyBjb25zdCBhVGVzdEluZm8gOiBzdHJpbmcpOworICAgIHByb2NlZHVyZSBSZXBvcnRSZXN1bHRzOworICAgIGZ1bmN0aW9uICBDYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7CisKKyAgICBwcm9jZWR1cmUgQ2xpZW50VGVzdDsKKyAgICB7JElGREVGIFN1cHBvcnRzQXN5bmN9CisgICAgcHJvY2VkdXJlIENsaWVudEFzeW5jVGVzdDsKKyAgICB7JEVORElGfQorCisgICAgcHJvY2VkdXJlIEluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIHByb2NlZHVyZSBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisKKyAgICBwcm9jZWR1cmUgSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKyAgICBmdW5jdGlvbiAgUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOworICAgIHskSUZERUYgU3RyZXNzVGVzdH0KKyAgICBwcm9jZWR1cmUgU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CisgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIFdpbjY0fQorICAgIHByb2NlZHVyZSBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIEV4ZWN1dGU7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFTZXR1cCA6IFRUZXN0U2V0dXA7IGNvbnN0IGFOdW1JdGVyYXRpb246IEludGVnZXIpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUVGVzdENsaWVudCA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBjbGFzcyB2YXIKKyAgICAgIEZOdW1JdGVyYXRpb24gOiBJbnRlZ2VyOworICAgICAgRk51bVRocmVhZCA6IEludGVnZXI7CisKKyAgICBjbGFzcyBwcm9jZWR1cmUgUHJpbnRDbWRMaW5lSGVscDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgSW52YWxpZEFyZ3M7CisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZykgOiBCeXRlOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworY29uc3QKKyAgIEVYSVRDT0RFX1NVQ0NFU1MgICAgICAgICAgID0gJDAwOyAgLy8gbm8gZXJyb3JzIGJpdHMgc2V0CisgICAvLworICAgRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMgID0gJDAxOworICAgRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTICAgID0gJDAyOworICAgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTID0gJDA0OworICAgRVhJVENPREVfRkFJTEJJVF9FWENFUFRJT05TID0gJDA4OworCisgICBNQVBfRkFJTFVSRVNfVE9fRVhJVENPREVfQklUUyA6IGFycmF5W1RDbGllbnRUaHJlYWQuVFRlc3RHcm91cF0gb2YgQnl0ZSA9ICgKKyAgICAgRVhJVENPREVfU1VDQ0VTUywgIC8vIG5vIGJpdHMgaGVyZQorICAgICBFWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUywKKyAgICAgRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTLAorICAgICBFWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMsCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUworICAgKTsKKworCisKK2Z1bmN0aW9uIEJvb2xUb1N0cmluZyggYiA6IEJvb2xlYW4pIDogc3RyaW5nOworLy8gb3ZlcnJpZGVzIGdsb2JhbCBCb29sVG9TdHJpbmcoKQorYmVnaW4KKyAgaWYgYgorICB0aGVuIHJlc3VsdCA6PSAndHJ1ZScKKyAgZWxzZSByZXN1bHQgOj0gJ2ZhbHNlJzsKK2VuZDsKKworLy8gbm90IGF2YWlsYWJsZSBpbiBhbGwgdmVyc2lvbnMsIHNvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoaXMgb25lIGltcG9ydGVkCitmdW5jdGlvbiBJc0RlYnVnZ2VyUHJlc2VudDogQk9PTDsgc3RkY2FsbDsgZXh0ZXJuYWwgS0VSTkVMMzIgbmFtZSAnSXNEZWJ1Z2dlclByZXNlbnQnOworCit7IFRUZXN0Q2xpZW50IH0KKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LlByaW50Q21kTGluZUhlbHA7Citjb25zdCBIRUxQVEVYVCA9ICcgW29wdGlvbnNdJyMxMAorICAgICAgICAgICAgICAgKyAjMTAKKyAgICAgICAgICAgICAgICsgJ0FsbG93ZWQgb3B0aW9uczonIzEwCisgICAgICAgICAgICAgICArICcgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QnIzEwCisgICAgICAgICAgICAgICArICcgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcyknIzEwCisgICAgICAgICAgICAgICArICcgIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24nIzEwCisgICAgICAgICAgICAgICArICcgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cycjMTAKKyAgICAgICAgICAgICAgICsgJyAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMnIzEwCisgICAgICAgICAgICAgICA7CitiZWdpbgorICBXcml0ZWxuKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgSEVMUFRFWFQpOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RDbGllbnQuSW52YWxpZEFyZ3M7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgYXJncy4nKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIENoYW5nZUZpbGVFeHQoRXh0cmFjdEZpbGVOYW1lKFBhcmFtU3RyKDApKSwnJykgKyAnIC1oIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7CisgIEFib3J0OworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVGVzdENsaWVudC5FeGVjdXRlKGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZykgOiBCeXRlOwordmFyCisgIGkgOiBJbnRlZ2VyOworICB0aHJlYWRFeGl0Q29kZSA6IEJ5dGU7CisgIHMgOiBzdHJpbmc7CisgIHRocmVhZHMgOiBhcnJheSBvZiBUVGhyZWFkOworICBkdFN0YXJ0IDogVERhdGVUaW1lOworICB0ZXN0IDogSW50ZWdlcjsKKyAgdGhyZWFkIDogVFRocmVhZDsKKyAgc2V0dXAgOiBUVGVzdFNldHVwOworYmVnaW4KKyAgLy8gaW5pdCByZWNvcmQKKyAgd2l0aCBzZXR1cCBkbyBiZWdpbgorICAgIHByb3RUeXBlICAgOj0gcHJvdF9CaW5hcnk7CisgICAgZW5kcG9pbnQgICA6PSB0cm5zX1NvY2tldHM7CisgICAgbGF5ZXJlZCAgICA6PSBbXTsKKyAgICB1c2VTU0wgICAgIDo9IEZBTFNFOworICAgIGhvc3QgICAgICAgOj0gJ2xvY2FsaG9zdCc7CisgICAgcG9ydCAgICAgICA6PSA5MDkwOworICAgIHNQaXBlTmFtZSAgOj0gJyc7CisgICAgaEFub25SZWFkICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBoQW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBlbmQ7CisKKyAgdHJ5CisgICAgaSA6PSAwOworICAgIHdoaWxlICggaSA8IExlbmd0aChhcmdzKSApIGRvIGJlZ2luCisgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICBJbmMoIGkpOworCisgICAgICBpZiAocyA9ICctaCcpIG9yIChzID0gJy0taGVscCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAgIFByaW50Q21kTGluZUhlbHA7CisgICAgICAgIHJlc3VsdCA6PSAkRkY7ICAgLy8gYWxsIHRlc3RzIGZhaWxlZAorICAgICAgICBFeGl0OworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1ob3N0JyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKKyAgICAgICAgc2V0dXAuaG9zdCA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1wb3J0JyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0CisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgc2V0dXAucG9ydCA6PSBTdHJUb0ludERlZihzLDApOworICAgICAgICBpZiBzZXR1cC5wb3J0IDw9IDAgdGhlbiBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tZG9tYWluLXNvY2tldCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ2RvbWFpbi1zb2NrZXQgbm90IHN1cHBvcnRlZCcpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1uYW1lZC1waXBlJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgICBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX05hbWVkUGlwZXM7CisgICAgICAgIHNldHVwLnNQaXBlTmFtZSA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgbmFtZWQgcGlwZSAoJytzZXR1cC5zUGlwZU5hbWUrJyknKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tYW5vbi1waXBlcycgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcykKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19Bbm9uUGlwZXM7CisgICAgICAgIHNldHVwLmhBbm9uUmVhZCA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgc2V0dXAuaEFub25Xcml0ZSA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGFub255bW91cyBwaXBlcyAoJytJbnRUb1N0cihJbnRlZ2VyKHNldHVwLmhBbm9uUmVhZCkpKycgYW5kICcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vbldyaXRlKSkrJyknKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tdHJhbnNwb3J0JyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisKKyAgICAgICAgaWYgICAgICBzID0gJ2J1ZmZlcmVkJyB0aGVuIEluY2x1ZGUoIHNldHVwLmxheWVyZWQsIHRybnNfQnVmZmVyZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdmcmFtZWQnICAgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0ZyYW1lZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2h0dHAnICAgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfSHR0cAorICAgICAgICBlbHNlIGlmIHMgPSAnZXZodHRwJyAgIHRoZW4gc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19Fdkh0dHAKKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tcHJvdG9jb2wnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tc3NsJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgICBzZXR1cC51c2VTU0wgOj0gVFJVRTsKKworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS10ZXN0bG9vcHMnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMKKyAgICAgICAgRk51bUl0ZXJhdGlvbiA6PSBTdHJUb0ludERlZiggYXJnc1tpXSwgMCk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIGlmIEZOdW1JdGVyYXRpb24gPD0gMAorICAgICAgICB0aGVuIEludmFsaWRBcmdzOworCisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLXQnKSBvciAocyA9ICctLXRocmVhZHMnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisgICAgICAgIEZOdW1UaHJlYWQgOj0gU3RyVG9JbnREZWYoIGFyZ3NbaV0sIDApOworICAgICAgICBJbmMoIGkpOworICAgICAgICBpZiBGTnVtVGhyZWFkIDw9IDAKKyAgICAgICAgdGhlbiBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBJbnZhbGlkQXJnczsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKworICAgIC8vIEluIHRoZSBhbm9ueW1vdXMgcGlwZXMgbW9kZSB0aGUgY2xpZW50IGlzIGxhdW5jaGVkIGJ5IHRoZSB0ZXN0IHNlcnZlcgorICAgIC8vIC0+IGJlaGF2ZSBuaWNlbHkgYW5kIGFsbG93IGZvciBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byB0aGlzIHByb2Nlc3MKKyAgICBpZiAoc2V0dXAuZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcykgYW5kIG5vdCBJc0RlYnVnZ2VyUHJlc2VudAorICAgIHRoZW4gTWVzc2FnZUJveCggMCwgJ0F0dGFjaCBEZWJ1Z2dlciBhbmQvb3IgY2xpY2sgT0sgdG8gY29udGludWUuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdUaHJpZnQgVGVzdENsaWVudCAoRGVscGhpKScsCisgICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyBvciBNQl9JQ09ORVhDTEFNQVRJT04pOworCisgICAgU2V0TGVuZ3RoKCB0aHJlYWRzLCBGTnVtVGhyZWFkKTsKKyAgICBkdFN0YXJ0IDo9IE5vdzsKKworICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0cyBhcmUgbm90IHJlYWxseSBtZWFudCB0byBiZSBzdGFja2VkIHVwb24gZWFjaCBvdGhlcgorICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBzZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCcpOworICAgIGVuZAorICAgIGVsc2UgaWYgKHRybnNfQnVmZmVyZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGJ1ZmZlcmVkIHRyYW5zcG9ydCcpOworICAgIGVuZDsKKworICAgIENvbnNvbGUuV3JpdGVMaW5lKFRIUklGVF9QUk9UT0NPTFNbc2V0dXAucHJvdFR5cGVdKycgcHJvdG9jb2wnKTsKKworICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KKyAgICAgIHRocmVhZCA6PSBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggc2V0dXAsIEZOdW1JdGVyYXRpb24pOworICAgICAgdGhyZWFkc1t0ZXN0XSA6PSB0aHJlYWQ7CisgICAgICB0aHJlYWQuU3RhcnQ7CisgICAgZW5kOworCisgICAgcmVzdWx0IDo9IDA7CisgICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMSBkbyBiZWdpbgorICAgICAgdGhyZWFkRXhpdENvZGUgOj0gdGhyZWFkc1t0ZXN0XS5XYWl0Rm9yOworICAgICAgcmVzdWx0IDo9IHJlc3VsdCBvciB0aHJlYWRFeGl0Q29kZTsKKyAgICAgIHRocmVhZHNbdGVzdF0uRnJlZTsKKyAgICAgIHRocmVhZHNbdGVzdF0gOj0gbmlsOworICAgIGVuZDsKKworICAgIENvbnNvbGUuV3JpdGUoJ1RvdGFsIHRpbWU6ICcgKyBJbnRUb1N0ciggTWlsbGlTZWNvbmRzQmV0d2VlbihOb3csIGR0U3RhcnQpKSk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIHJhaXNlOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEUuTWVzc2FnZSArICMxMCArIEUuU3RhY2tUcmFjZSk7CisgICAgICByYWlzZTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdkb25lIScpOworZW5kOworCit7IFRDbGllbnRUaHJlYWQgfQorCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5DbGllbnRUZXN0OwordmFyCisgIGNsaWVudCA6IFRUaHJpZnRUZXN0LklmYWNlOworICBzIDogc3RyaW5nOworICBpOCA6IFNob3J0SW50OworICBpMzIgOiBJbnRlZ2VyOworICBpNjQgOiBJbnQ2NDsKKyAgYmluT3V0LGJpbkluIDogVEJ5dGVzOworICBkdWIgOiBEb3VibGU7CisgIG8gOiBJWHRydWN0OworICBvMiA6IElYdHJ1Y3QyOworICBpIDogSVh0cnVjdDsKKyAgaTIgOiBJWHRydWN0MjsKKyAgbWFwb3V0IDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlcixJbnRlZ2VyPjsKKyAgbWFwaW4gOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLEludGVnZXI+OworICBzdHJtYXBvdXQgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKyAgc3RybWFwaW4gOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKyAgaiA6IEludGVnZXI7CisgIGZpcnN0IDogQm9vbGVhbjsKKyAga2V5IDogSW50ZWdlcjsKKyAgc3Rya2V5IDogc3RyaW5nOworICBsaXN0b3V0IDogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgIGxpc3RpbiA6IElUaHJpZnRMaXN0PEludGVnZXI+OworICBzZXRvdXQgOiBJSGFzaFNldDxJbnRlZ2VyPjsKKyAgc2V0aW4gOiBJSGFzaFNldDxJbnRlZ2VyPjsKKyAgcmV0IDogVE51bWJlcno7CisgIHVpZCA6IEludDY0OworICBtbSA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKKyAgcG9zIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIG5lZyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBtMiA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBrMiA6IEludGVnZXI7CisgIGluc2FuZSA6IElJbnNhbml0eTsKKyAgdHJ1Y2sgOiBJWHRydWN0OworICB3aG9hIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKKyAga2V5NjQgOiBJbnQ2NDsKKyAgdmFsIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIGsyXzIgOiBUTnVtYmVyejsKKyAgazMgOiBUTnVtYmVyejsKKyAgdjIgOiBJSW5zYW5pdHk7CisgIHVzZXJNYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSW50NjQ+OworICB4dHJ1Y3RzIDogSVRocmlmdExpc3Q8SVh0cnVjdD47CisgIHggOiBJWHRydWN0OworICBhcmcwIDogU2hvcnRJbnQ7CisgIGFyZzEgOiBJbnRlZ2VyOworICBhcmcyIDogSW50NjQ7CisgIGFyZzMgOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsKKyAgYXJnNCA6IFROdW1iZXJ6OworICBhcmc1IDogSW50NjQ7CisgIHskSUZERUYgUGVyZlRlc3R9CisgIFN0YXJ0VGljayA6IENhcmRpbmFsOworICBrIDogSW50ZWdlcjsKKyAgeyRFTkRJRn0KKyAgaGVsbG8sIGdvb2RieWUgOiBJWHRydWN0OworICBjcmF6eSA6IElJbnNhbml0eTsKKyAgbG9vbmV5IDogSUluc2FuaXR5OworICBmaXJzdF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgc2Vjb25kX21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBwYWlyIDogVFBhaXI8VE51bWJlcnosIFRVc2VySWQ+OworICB0ZXN0c2l6ZSA6IFRUZXN0U2l6ZTsKK2JlZ2luCisgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKKyAgRlRyYW5zcG9ydC5PcGVuOworCisgIHskSUZERUYgU3RyZXNzVGVzdH0KKyAgU3RyZXNzVGVzdCggY2xpZW50KTsKKyAgeyRFTkRJRiBTdHJlc3NUZXN0fQorCisgIHskSUZERUYgRXhjZXB0aW9uc30KKyAgLy8gaW4tZGVwdGggZXhjZXB0aW9uIHRlc3QKKyAgLy8gKDEpIGRvIHdlIGdldCBhbiBleGNlcHRpb24gYXQgYWxsPworICAvLyAoMikgZG8gd2UgZ2V0IHRoZSByaWdodCBleGNlcHRpb24/CisgIC8vICgzKSBkb2VzIHRoZSBleGNlcHRpb24gY29udGFpbiB0aGUgZXhwZWN0ZWQgZGF0YT8KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0RXhjZXB0aW9uJywgdGVzdF9FeGNlcHRpb25zKTsKKyAgLy8gY2FzZSAxOiBleGNlcHRpb24gdHlwZSBkZWNsYXJlZCBpbiBJREwgYXQgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdHJ5CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RFeGNlcHRpb24oJydYY2VwdGlvbicnKTogbXVzdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiBlOlRYY2VwdGlvbiBkbyBiZWdpbgorICAgICAgRXhwZWN0KCBlLkVycm9yQ29kZSA9IDEwMDEsICAgICAgICdlcnJvciBjb2RlJyk7CisgICAgICBFeHBlY3QoIGUuTWVzc2FnZV8gID0gJ1hjZXB0aW9uJywgJ2Vycm9yIG1lc3NhZ2UnKTsKKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnID0gJyArIEludFRvU3RyKGUuRXJyb3JDb2RlKSArICcsICcgKyBlLk1lc3NhZ2VfICk7CisgICAgZW5kOworICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCA6ICInK2UuVG9TdHJpbmcrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisgIC8vIGNhc2UgMjogZXhjZXB0aW9uIHR5cGUgTk9UIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbAorICAvLyB0aGlzIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24KKyAgdHJ5CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKTsKKyAgICBFeHBlY3QoIEZBTFNFLCAndGVzdEV4Y2VwdGlvbignJ1RFeGNlcHRpb24nJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAorICAgIGVuZDsKKyAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKycgPSAnK2UuTWVzc2FnZSk7IC8vIHRoaXMgaXMgd2hhdCB3ZSBnZXQKKyAgICBlbmQ7CisgICAgb24gZTpURXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKworICBpZiBGVHJhbnNwb3J0LklzT3BlbiB0aGVuIEZUcmFuc3BvcnQuQ2xvc2U7CisgIEZUcmFuc3BvcnQuT3BlbjsgICAvLyByZS1vcGVuIGNvbm5lY3Rpb24sIHNlcnZlciBoYXMgYWxyZWFkeSBjbG9zZWQKKworCisgIC8vIGNhc2UgMzogbm8gZXhjZXB0aW9uCisgIHRyeQorICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdzb21ldGhpbmcnKTsKKyAgICBFeHBlY3QoIFRSVUUsICd0ZXN0RXhjZXB0aW9uKCcnc29tZXRoaW5nJycpOiBtdXN0IG5vdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKyAgeyRFTkRJRiBFeGNlcHRpb25zfQorCisKKyAgLy8gc2ltcGxlIHRoaW5ncworICBTdGFydFRlc3RHcm91cCggJ3NpbXBsZSBUaHJpZnQgY2FsbHMnLCB0ZXN0X0Jhc2VUeXBlcyk7CisgIGNsaWVudC50ZXN0Vm9pZCgpOworICBFeHBlY3QoIFRSVUUsICd0ZXN0Vm9pZCgpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgorCisgIHMgOj0gQm9vbFRvU3RyaW5nKCBjbGllbnQudGVzdEJvb2woVFJVRSkpOworICBFeHBlY3QoIHMgPSBCb29sVG9TdHJpbmcoVFJVRSksICAndGVzdEJvb2woVFJVRSkgPSAnK3MpOworICBzIDo9IEJvb2xUb1N0cmluZyggY2xpZW50LnRlc3RCb29sKEZBTFNFKSk7CisgIEV4cGVjdCggcyA9IEJvb2xUb1N0cmluZyhGQUxTRSksICAndGVzdEJvb2woRkFMU0UpID0gJytzKTsKKworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CisgIEV4cGVjdCggcyA9ICdUZXN0JywgJ3Rlc3RTdHJpbmcoJydUZXN0JycpID0gIicrcysnIicpOworCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgIEV4cGVjdCggcyA9ICcnLCAndGVzdFN0cmluZygnJycnKSA9ICInK3MrJyInKTsKKworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKEhVR0VfVEVTVF9TVFJJTkcpOworICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKKyAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKKyAgICAgICAgICsnPT4gbGVuZ3RoKHJlc3VsdCkgPSAnK0ludFRvU3RyKExlbmd0aChzKSkpOworCisgIGk4IDo9IGNsaWVudC50ZXN0Qnl0ZSgxKTsKKyAgRXhwZWN0KCBpOCA9IDEsICd0ZXN0Qnl0ZSgxKSA9ICcgKyBJbnRUb1N0ciggaTggKSk7CisKKyAgaTMyIDo9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgRXhwZWN0KCBpMzIgPSAtMSwgJ3Rlc3RJMzIoLTEpID0gJyArIEludFRvU3RyKGkzMikpOworCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKKyAgaTY0IDo9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7CisgIEV4cGVjdCggaTY0ID0gLTM0MzU5NzM4MzY4LCAndGVzdEk2NCgtMzQzNTk3MzgzNjgpID0gJyArIEludFRvU3RyKCBpNjQpKTsKKworICAvLyByYW5kb20gYmluYXJ5IHNtYWxsCisgIGZvciB0ZXN0c2l6ZSA6PSBMb3coVFRlc3RTaXplKSB0byBIaWdoKFRUZXN0U2l6ZSkgZG8gYmVnaW4KKyAgICBiaW5PdXQgOj0gUHJlcGFyZUJpbmFyeURhdGEoIFRSVUUsIHRlc3RzaXplKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKScpOworICAgIHRyeQorICAgICAgYmluSW4gOj0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKKyAgICAgIEV4cGVjdCggTGVuZ3RoKGJpbk91dCkgPSBMZW5ndGgoYmluSW4pLCAndGVzdEJpbmFyeSgpOiBsZW5ndGggJytJbnRUb1N0cihMZW5ndGgoYmluT3V0KSkrJyA9ICcrSW50VG9TdHIoTGVuZ3RoKGJpbkluKSkpOworICAgICAgaTMyIDo9IE1pbiggTGVuZ3RoKGJpbk91dCksIExlbmd0aChiaW5JbikpOworICAgICAgRXhwZWN0KCBDb21wYXJlTWVtKCBiaW5PdXQsIGJpbkluLCBpMzIpLCAndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKSA9ICcrQnl0ZXNUb0hleChiaW5JbikpOworICAgIGV4Y2VwdAorICAgICAgb24gZTpUQXBwbGljYXRpb25FeGNlcHRpb24gZG8gQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoKTogJytlLk1lc3NhZ2UpOworICAgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3Rlc3RCaW5hcnkoKTogVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBDb25zb2xlLldyaXRlTGluZSgndGVzdERvdWJsZSg1LjMyNTA5ODIzNSknKTsKKyAgZHViIDo9IGNsaWVudC50ZXN0RG91YmxlKDUuMzI1MDk4MjM1KTsKKyAgRXhwZWN0KCBhYnMoZHViLTUuMzI1MDk4MjM1KSA8IDFlLTE0LCAndGVzdERvdWJsZSg1LjMyNTA5ODIzNSkgPSAnICsgRmxvYXRUb1N0ciggZHViKSk7CisKKyAgLy8gc3RydWN0cworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RTdHJ1Y3QnLCB0ZXN0X1N0cnVjdHMpOworICBDb25zb2xlLldyaXRlTGluZSgndGVzdFN0cnVjdCh7JydaZXJvJycsIDEsIC0zLCAtNX0pJyk7CisgIG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICBvLlN0cmluZ190aGluZyA6PSAnWmVybyc7CisgIG8uQnl0ZV90aGluZyA6PSAxOworICBvLkkzMl90aGluZyA6PSAtMzsKKyAgby5JNjRfdGhpbmcgOj0gLTU7CisgIGkgOj0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7CisgIEV4cGVjdCggaS5TdHJpbmdfdGhpbmcgPSAnWmVybycsICdpLlN0cmluZ190aGluZyA9ICInK2kuU3RyaW5nX3RoaW5nKyciJyk7CisgIEV4cGVjdCggaS5CeXRlX3RoaW5nID0gMSwgJ2kuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaS5CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JMzJfdGhpbmcgPSAtMywgJ2kuSTMyX3RoaW5nID0gJytJbnRUb1N0cihpLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuSTY0X3RoaW5nID0gLTUsICdpLkk2NF90aGluZyA9ICcrSW50VG9TdHIoaS5JNjRfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfQnl0ZV90aGluZywgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTMyX3RoaW5nLCAnaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKworICAvLyBuZXN0ZWQgc3RydWN0cworICBTdGFydFRlc3RHcm91cCggJ3Rlc3ROZXN0JywgdGVzdF9TdHJ1Y3RzKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3ROZXN0KHsxLCB7JydaZXJvJycsIDEsIC0zLCAtNX0sIDV9KScpOworICBvMiA6PSBUWHRydWN0MkltcGwuQ3JlYXRlOworICBvMi5CeXRlX3RoaW5nIDo9IDE7CisgIG8yLlN0cnVjdF90aGluZyA6PSBvOworICBvMi5JMzJfdGhpbmcgOj0gNTsKKyAgaTIgOj0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgaSA6PSBpMi5TdHJ1Y3RfdGhpbmc7CisgIEV4cGVjdCggaS5TdHJpbmdfdGhpbmcgPSAnWmVybycsICdpLlN0cmluZ190aGluZyA9ICInK2kuU3RyaW5nX3RoaW5nKyciJyk7CisgIEV4cGVjdCggaS5CeXRlX3RoaW5nID0gMSwgICdpLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuSTMyX3RoaW5nID0gLTMsICAnaS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JNjRfdGhpbmcgPSAtNSwgICdpLkk2NF90aGluZyA9ICcrSW50VG9TdHIoaS5JNjRfdGhpbmcpKTsKKyAgRXhwZWN0KCBpMi5CeXRlX3RoaW5nID0gMSwgJ2kyLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkyLkJ5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpMi5JMzJfdGhpbmcgPSA1LCAgJ2kyLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaTIuSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X1N0cmluZ190aGluZywgJ2kuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0J5dGVfdGhpbmcsICAnaS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JMzJfdGhpbmcsICAnaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTY0X3RoaW5nLCAgJ2kuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaTIuX19pc3NldF9CeXRlX3RoaW5nLCAnaTIuX19pc3NldF9CeXRlX3RoaW5nJyk7CisgIEV4cGVjdCggaTIuX19pc3NldF9JMzJfdGhpbmcsICAnaTIuX19pc3NldF9JMzJfdGhpbmcnKTsKKworICAvLyBtYXA8dHlwZTEsdHlwZTI+OiBBIG1hcCBvZiBzdHJpY3RseSB1bmlxdWUga2V5cyB0byB2YWx1ZXMuCisgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIG1hcCwgSmF2YSBIYXNoTWFwLCBQSFAgYXNzb2NpYXRpdmUgYXJyYXksIFB5dGhvbi9SdWJ5IGRpY3Rpb25hcnksIGV0Yy4KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TWFwJywgdGVzdF9Db250YWluZXJzKTsKKyAgbWFwb3V0IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLEludGVnZXI+LkNyZWF0ZTsKKyAgZm9yIGogOj0gMCB0byA0IGRvCisgIGJlZ2luCisgICAgbWFwb3V0LkFkZE9yU2V0VmFsdWUoIGosIGogLSAxMCk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZSgndGVzdE1hcCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBrZXkgaW4gbWFwb3V0LktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdAorICAgIHRoZW4gZmlyc3QgOj0gRmFsc2UKKyAgICBlbHNlIENvbnNvbGUuV3JpdGUoICcsICcgKTsKKyAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0cigga2V5KSArICcgPT4gJyArIEludFRvU3RyKCBtYXBvdXRba2V5XSkpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworCisgIG1hcGluIDo9IGNsaWVudC50ZXN0TWFwKCBtYXBvdXQgKTsKKyAgRXhwZWN0KCBtYXBpbi5Db3VudCA9IG1hcG91dC5Db3VudCwgJ3Rlc3RNYXA6IG1hcGluLkNvdW50ID0gbWFwb3V0LkNvdW50Jyk7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIEV4cGVjdCggbWFwb3V0LkNvbnRhaW5zS2V5KGopLCAndGVzdE1hcDogbWFwb3V0LkNvbnRhaW5zS2V5KCcrSW50VG9TdHIoaikrJykgPSAnK0Jvb2xUb1N0cmluZyhtYXBvdXQuQ29udGFpbnNLZXkoaikpKTsKKyAgZW5kOworICBmb3Iga2V5IGluIG1hcGluLktleXMgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIG1hcGluW2tleV0gPSBtYXBvdXRba2V5XSwgJ3Rlc3RNYXA6ICcrSW50VG9TdHIoa2V5KSArICcgPT4gJyArIEludFRvU3RyKCBtYXBpbltrZXldKSk7CisgICAgRXhwZWN0KCBtYXBpbltrZXldID0ga2V5IC0gMTAsICd0ZXN0TWFwOiBtYXBpblsnK0ludFRvU3RyKGtleSkrJ10gPSAnK0ludFRvU3RyKCBtYXBpbltrZXldKSk7CisgIGVuZDsKKworCisgIC8vIG1hcDx0eXBlMSx0eXBlMj46IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcy4KKyAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgbWFwLCBKYXZhIEhhc2hNYXAsIFBIUCBhc3NvY2lhdGl2ZSBhcnJheSwgUHl0aG9uL1J1YnkgZGljdGlvbmFyeSwgZXRjLgorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RTdHJpbmdNYXAnLCB0ZXN0X0NvbnRhaW5lcnMpOworICBzdHJtYXBvdXQgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZyxzdHJpbmc+LkNyZWF0ZTsKKyAgZm9yIGogOj0gMCB0byA0IGRvCisgIGJlZ2luCisgICAgc3RybWFwb3V0LkFkZE9yU2V0VmFsdWUoIEludFRvU3RyKGopLCBJbnRUb1N0cihqIC0gMTApKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIHN0cmtleSBpbiBzdHJtYXBvdXQuS2V5cyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0CisgICAgdGhlbiBmaXJzdCA6PSBGYWxzZQorICAgIGVsc2UgQ29uc29sZS5Xcml0ZSggJywgJyApOworICAgIENvbnNvbGUuV3JpdGUoIHN0cmtleSArICcgPT4gJyArIHN0cm1hcG91dFtzdHJrZXldKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBzdHJtYXBpbiA6PSBjbGllbnQudGVzdFN0cmluZ01hcCggc3RybWFwb3V0ICk7CisgIEV4cGVjdCggc3RybWFwaW4uQ291bnQgPSBzdHJtYXBvdXQuQ291bnQsICd0ZXN0U3RyaW5nTWFwOiBzdHJtYXBpbi5Db3VudCA9IHN0cm1hcG91dC5Db3VudCcpOworICBmb3IgaiA6PSAwIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIHN0cm1hcG91dC5Db250YWluc0tleShJbnRUb1N0cihqKSksCisgICAgICAgICAgICAndGVzdFN0cmluZ01hcDogc3RybWFwb3V0LkNvbnRhaW5zS2V5KCcrSW50VG9TdHIoaikrJykgPSAnCisgICAgICAgICAgICArIEJvb2xUb1N0cmluZyhzdHJtYXBvdXQuQ29udGFpbnNLZXkoSW50VG9TdHIoaikpKSk7CisgIGVuZDsKKyAgZm9yIHN0cmtleSBpbiBzdHJtYXBpbi5LZXlzIGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBzdHJtYXBpbltzdHJrZXldID0gc3RybWFwb3V0W3N0cmtleV0sICd0ZXN0U3RyaW5nTWFwOiAnK3N0cmtleSArICcgPT4gJyArIHN0cm1hcGluW3N0cmtleV0pOworICAgIEV4cGVjdCggc3RybWFwaW5bc3Rya2V5XSA9IEludFRvU3RyKCBTdHJUb0ludChzdHJrZXkpIC0gMTApLCAndGVzdFN0cmluZ01hcDogc3RybWFwaW5bJytzdHJrZXkrJ10gPSAnK3N0cm1hcGluW3N0cmtleV0pOworICBlbmQ7CisKKworICAvLyBzZXQ8dHlwZT46IEFuIHVub3JkZXJlZCBzZXQgb2YgdW5pcXVlIGVsZW1lbnRzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCBzZXQsIEphdmEgSGFzaFNldCwgc2V0IGluIFB5dGhvbiwgZXRjLgorICAvLyBOb3RlOiBQSFAgZG9lcyBub3Qgc3VwcG9ydCBzZXRzLCBzbyBpdCBpcyB0cmVhdGVkIHNpbWlsYXIgdG8gYSBMaXN0CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdFNldCcsIHRlc3RfQ29udGFpbmVycyk7CisgIHNldG91dCA6PSBUSGFzaFNldEltcGw8SW50ZWdlcj4uQ3JlYXRlOworICBmb3IgaiA6PSAtMiB0byAyIGRvCisgIGJlZ2luCisgICAgc2V0b3V0LkFkZCggaiApOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RTZXQoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3IgaiBpbiBzZXRvdXQgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdAorICAgIHRoZW4gZmlyc3QgOj0gRmFsc2UKKyAgICBlbHNlIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgQ29uc29sZS5Xcml0ZShJbnRUb1N0ciggaikpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworCisgIHNldGluIDo9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisgIEV4cGVjdCggc2V0aW4uQ291bnQgPSBzZXRvdXQuQ291bnQsICd0ZXN0U2V0OiBzZXRpbi5Db3VudCA9IHNldG91dC5Db3VudCcpOworICBFeHBlY3QoIHNldGluLkNvdW50ID0gNSwgJ3Rlc3RTZXQ6IHNldGluLkNvdW50ID0gJytJbnRUb1N0cihzZXRpbi5Db3VudCkpOworICBmb3IgaiA6PSAtMiB0byAyIGRvIC8vIHVub3JkZXJlZCwgd2UgY2FuJ3QgcmVseSBvbiB0aGUgb3JkZXIgPT4gdGVzdCBmb3Iga25vd24gZWxlbWVudHMgb25seQorICBiZWdpbgorICAgIEV4cGVjdCggc2V0aW4uQ29udGFpbnMoaiksICd0ZXN0U2V0OiBzZXRpbi5Db250YWlucygnK0ludFRvU3RyKGopKycpID0+ICcrQm9vbFRvU3RyaW5nKHNldGluLkNvbnRhaW5zKGopKSk7CisgIGVuZDsKKworICAvLyBsaXN0PHR5cGU+OiBBbiBvcmRlcmVkIGxpc3Qgb2YgZWxlbWVudHMuCisgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIHZlY3RvciwgSmF2YSBBcnJheUxpc3QsIG5hdGl2ZSBhcnJheXMgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcywgZXRjLgorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RMaXN0JywgdGVzdF9Db250YWluZXJzKTsKKyAgbGlzdG91dCA6PSBUVGhyaWZ0TGlzdEltcGw8SW50ZWdlcj4uQ3JlYXRlOworICBsaXN0b3V0LkFkZCggKzEpOworICBsaXN0b3V0LkFkZCggLTIpOworICBsaXN0b3V0LkFkZCggKzMpOworICBsaXN0b3V0LkFkZCggLTQpOworICBsaXN0b3V0LkFkZCggMCk7CisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RMaXN0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGogaW4gbGlzdG91dCBkbworICAgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCcsICcpOworICAgIENvbnNvbGUuV3JpdGUoSW50VG9TdHIoIGopKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBsaXN0aW4gOj0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworICBFeHBlY3QoIGxpc3Rpbi5Db3VudCA9IGxpc3RvdXQuQ291bnQsICd0ZXN0TGlzdDogbGlzdGluLkNvdW50ID0gbGlzdG91dC5Db3VudCcpOworICBFeHBlY3QoIGxpc3Rpbi5Db3VudCA9IDUsICd0ZXN0TGlzdDogbGlzdGluLkNvdW50ID0gJytJbnRUb1N0cihsaXN0aW4uQ291bnQpKTsKKyAgRXhwZWN0KCBsaXN0aW5bMF0gPSArMSwgJ2xpc3RpblswXSA9ICcrSW50VG9TdHIoIGxpc3RpblswXSkpOworICBFeHBlY3QoIGxpc3RpblsxXSA9IC0yLCAnbGlzdGluWzFdID0gJytJbnRUb1N0ciggbGlzdGluWzFdKSk7CisgIEV4cGVjdCggbGlzdGluWzJdID0gKzMsICdsaXN0aW5bMl0gPSAnK0ludFRvU3RyKCBsaXN0aW5bMl0pKTsKKyAgRXhwZWN0KCBsaXN0aW5bM10gPSAtNCwgJ2xpc3RpblszXSA9ICcrSW50VG9TdHIoIGxpc3RpblszXSkpOworICBFeHBlY3QoIGxpc3Rpbls0XSA9IDAsICAnbGlzdGluWzRdID0gJytJbnRUb1N0ciggbGlzdGluWzRdKSk7CisKKyAgLy8gZW51bXMKKyAgcmV0IDo9IGNsaWVudC50ZXN0RW51bShUTnVtYmVyei5PTkUpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6Lk9ORSwgJ3Rlc3RFbnVtKE9ORSkgPSAnK0ludFRvU3RyKE9yZChyZXQpKSk7CisKKyAgcmV0IDo9IGNsaWVudC50ZXN0RW51bShUTnVtYmVyei5UV08pOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LlRXTywgJ3Rlc3RFbnVtKFRXTykgPSAnK0ludFRvU3RyKE9yZChyZXQpKSk7CisKKyAgcmV0IDo9IGNsaWVudC50ZXN0RW51bShUTnVtYmVyei5USFJFRSk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouVEhSRUUsICd0ZXN0RW51bShUSFJFRSkgPSAnK0ludFRvU3RyKE9yZChyZXQpKSk7CisKKyAgcmV0IDo9IGNsaWVudC50ZXN0RW51bShUTnVtYmVyei5GSVZFKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5GSVZFLCAndGVzdEVudW0oRklWRSkgPSAnK0ludFRvU3RyKE9yZChyZXQpKSk7CisKKyAgcmV0IDo9IGNsaWVudC50ZXN0RW51bShUTnVtYmVyei5FSUdIVCk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouRUlHSFQsICd0ZXN0RW51bShFSUdIVCkgPSAnK0ludFRvU3RyKE9yZChyZXQpKSk7CisKKworICAvLyB0eXBlZGVmCisgIHVpZCA6PSBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKKyAgRXhwZWN0KCB1aWQgPSAzMDk4NTgyMzUwODI1MjMsICd0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpID0gJytJbnRUb1N0cih1aWQpKTsKKworCisgIC8vIG1hcHMgb2YgbWFwcworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNYXBNYXAoMSknLCB0ZXN0X0NvbnRhaW5lcnMpOworICBtbSA6PSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgQ29uc29sZS5Xcml0ZSgnID0geycpOworICBmb3Iga2V5IGluIG1tLktleXMgZG8KKyAgYmVnaW4KKyAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0cigga2V5KSArICcgPT4geycpOworICAgIG0yIDo9IG1tW2tleV07CisgICAgZm9yICBrMiBpbiBtMi5LZXlzIGRvCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBrMikgKyAnID0+ICcgKyBJbnRUb1N0ciggbTJbazJdKSArICcsICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfScpOworCisgIC8vIHZlcmlmeSByZXN1bHQgZGF0YQorICBFeHBlY3QoIG1tLkNvdW50ID0gMiwgJ21tLkNvdW50ID0gJytJbnRUb1N0cihtbS5Db3VudCkpOworICBwb3MgOj0gbW1bNF07CisgIG5lZyA6PSBtbVstNF07CisgIGZvciBqIDo9IDEgdG8gNCBkbworICBiZWdpbgorICAgIEV4cGVjdCggcG9zW2pdICA9IGosICAncG9zW2pdICA9ICcrSW50VG9TdHIocG9zW2pdKSk7CisgICAgRXhwZWN0KCBuZWdbLWpdID0gLWosICduZWdbLWpdID0gJytJbnRUb1N0cihuZWdbLWpdKSk7CisgIGVuZDsKKworCisKKyAgLy8gaW5zYW5pdHkKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0SW5zYW5pdHknLCB0ZXN0X1N0cnVjdHMpOworICBpbnNhbmUgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CisgIGluc2FuZS5Vc2VyTWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSW50NjQ+LkNyZWF0ZTsKKyAgaW5zYW5lLlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRklWRSwgNTAwMCk7CisgIHRydWNrIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgdHJ1Y2suU3RyaW5nX3RoaW5nIDo9ICdUcnVjayc7CisgIHRydWNrLkJ5dGVfdGhpbmcgOj0gLTg7ICAvLyBieXRlIGlzIHNpZ25lZAorICB0cnVjay5JMzJfdGhpbmcgOj0gMzI7CisgIHRydWNrLkk2NF90aGluZyA6PSA2NDsKKyAgaW5zYW5lLlh0cnVjdHMgOj0gVFRocmlmdExpc3RJbXBsPElYdHJ1Y3Q+LkNyZWF0ZTsKKyAgaW5zYW5lLlh0cnVjdHMuQWRkKCB0cnVjayApOworICB3aG9hIDo9IGNsaWVudC50ZXN0SW5zYW5pdHkoIGluc2FuZSApOworICBDb25zb2xlLldyaXRlKCcgPSB7Jyk7CisgIGZvciBrZXk2NCBpbiB3aG9hLktleXMgZG8KKyAgYmVnaW4KKyAgICB2YWwgOj0gd2hvYVtrZXk2NF07CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGtleTY0KSArICcgPT4geycpOworICAgIGZvciBrMl8yIGluIHZhbC5LZXlzIGRvCisgICAgYmVnaW4KKyAgICAgIHYyIDo9IHZhbFtrMl8yXTsKKyAgICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBJbnRlZ2VyKCBrMl8yKSkgKyAnID0+IHsnKTsKKyAgICAgIHVzZXJNYXAgOj0gdjIuVXNlck1hcDsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ3snKTsKKyAgICAgIGlmIHVzZXJNYXAgPD4gbmlsIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIGZvciBrMyBpbiB1c2VyTWFwLktleXMgZG8KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggSW50ZWdlciggazMpKSArICcgPT4gJyArIEludFRvU3RyKCB1c2VyTWFwW2szXSkgKyAnLCAnKTsKKyAgICAgICAgZW5kOworICAgICAgZW5kIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGUoJ251bGwnKTsKKyAgICAgIGVuZDsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ30sICcpOworICAgICAgeHRydWN0cyA6PSB2Mi5YdHJ1Y3RzOworICAgICAgQ29uc29sZS5Xcml0ZSgneycpOworCisgICAgICBpZiB4dHJ1Y3RzIDw+IG5pbCB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBmb3IgeCBpbiB4dHJ1Y3RzIGRvCisgICAgICAgIGJlZ2luCisgICAgICAgICAgQ29uc29sZS5Xcml0ZSgneyInICsgeC5TdHJpbmdfdGhpbmcgKyAnIiwgJyArCisgICAgICAgICAgICBJbnRUb1N0ciggeC5CeXRlX3RoaW5nKSArICcsICcgKworICAgICAgICAgICAgSW50VG9TdHIoIHguSTMyX3RoaW5nKSArICcsICcgKworICAgICAgICAgICAgSW50VG9TdHIoIHguSTMyX3RoaW5nKSArICd9LCAnKTsKKyAgICAgICAgZW5kOworICAgICAgZW5kIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGUoJ251bGwnKTsKKyAgICAgIGVuZDsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ30nKTsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ30sICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfScpOworCisgICgqKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICopCisKKyAgLy8gdmVyaWZ5IHJlc3VsdCBkYXRhCisgIEV4cGVjdCggd2hvYS5Db3VudCA9IDIsICd3aG9hLkNvdW50ID0gJytJbnRUb1N0cih3aG9hLkNvdW50KSk7CisgIC8vCisgIGZpcnN0X21hcCAgOj0gd2hvYVsxXTsKKyAgc2Vjb25kX21hcCA6PSB3aG9hWzJdOworICBFeHBlY3QoIGZpcnN0X21hcC5Db3VudCA9IDIsICdmaXJzdF9tYXAuQ291bnQgPSAnK0ludFRvU3RyKGZpcnN0X21hcC5Db3VudCkpOworICBFeHBlY3QoIHNlY29uZF9tYXAuQ291bnQgPSAxLCAnc2Vjb25kX21hcC5Db3VudCA9ICcrSW50VG9TdHIoc2Vjb25kX21hcC5Db3VudCkpOworICAvLworICBsb29uZXkgOj0gc2Vjb25kX21hcFtUTnVtYmVyei5TSVhdOworICBFeHBlY3QoIEFzc2lnbmVkKGxvb25leSksICdBc3NpZ25lZChsb29uZXkpID0gJytCb29sVG9TdHJpbmcoQXNzaWduZWQobG9vbmV5KSkpOworICBFeHBlY3QoIG5vdCBsb29uZXkuX19pc3NldF9Vc2VyTWFwLCAnbG9vbmV5Ll9faXNzZXRfVXNlck1hcCA9ICcrQm9vbFRvU3RyaW5nKGxvb25leS5fX2lzc2V0X1VzZXJNYXApKTsKKyAgRXhwZWN0KCBub3QgbG9vbmV5Ll9faXNzZXRfWHRydWN0cywgJ2xvb25leS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhsb29uZXkuX19pc3NldF9YdHJ1Y3RzKSk7CisgIC8vCisgIGZvciByZXQgaW4gW1ROdW1iZXJ6LlRXTywgVE51bWJlcnouVEhSRUVdIGRvIGJlZ2luCisgICAgY3JhenkgOj0gZmlyc3RfbWFwW3JldF07CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ2ZpcnN0X21hcFsnK2ludFRvU3RyKE9yZChyZXQpKSsnXScpOworCisgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1VzZXJNYXAsICdjcmF6eS5fX2lzc2V0X1VzZXJNYXAgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1VzZXJNYXApKTsKKyAgICBFeHBlY3QoIGNyYXp5Ll9faXNzZXRfWHRydWN0cywgJ2NyYXp5Ll9faXNzZXRfWHRydWN0cyA9ICcrQm9vbFRvU3RyaW5nKGNyYXp5Ll9faXNzZXRfWHRydWN0cykpOworCisgICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwLkNvdW50ID0gaW5zYW5lLlVzZXJNYXAuQ291bnQsICdjcmF6eS5Vc2VyTWFwLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwLkNvdW50KSk7CisgICAgZm9yIHBhaXIgaW4gaW5zYW5lLlVzZXJNYXAgZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggY3JhenkuVXNlck1hcFtwYWlyLktleV0gPSBwYWlyLlZhbHVlLCAnY3JhenkuVXNlck1hcFsnK0ludFRvU3RyKE9yZChwYWlyLmtleSkpKyddID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW3BhaXIuS2V5XSkpOworICAgIGVuZDsKKworICAgIEV4cGVjdCggY3JhenkuWHRydWN0cy5Db3VudCA9IGluc2FuZS5YdHJ1Y3RzLkNvdW50LCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOworICAgIGZvciBhcmcwIDo9IDAgdG8gaW5zYW5lLlh0cnVjdHMuQ291bnQtMSBkbyBiZWdpbgorICAgICAgaGVsbG8gICA6PSBpbnNhbmUuWHRydWN0c1thcmcwXTsKKyAgICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1thcmcwXTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSBoZWxsby5TdHJpbmdfdGhpbmcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICcrZ29vZGJ5ZS5TdHJpbmdfdGhpbmcpOworICAgICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSBoZWxsby5CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JMzJfdGhpbmcgPSBoZWxsby5JMzJfdGhpbmcsICdnb29kYnllLkkzMl90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JMzJfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSBoZWxsby5JNjRfdGhpbmcsICdnb29kYnllLkk2NF90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JNjRfdGhpbmcpKTsKKyAgICBlbmQ7CisgIGVuZDsKKworCisgIC8vIG11bHRpIGFyZ3MKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGknLCB0ZXN0X0Jhc2VUeXBlcyk7CisgIGFyZzAgOj0gMTsKKyAgYXJnMSA6PSAyOworICBhcmcyIDo9IEhpZ2goSW50NjQpOworICBhcmczIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxTbWFsbEludCwgc3RyaW5nPi5DcmVhdGU7CisgIGFyZzMuQWRkT3JTZXRWYWx1ZSggMSwgJ29uZScpOworICBhcmc0IDo9IFROdW1iZXJ6LkZJVkU7CisgIGFyZzUgOj0gNTAwMDAwMDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1Rlc3QgTXVsdGkoJyArIEludFRvU3RyKCBhcmcwKSArICcsJyArCisgICAgSW50VG9TdHIoIGFyZzEpICsgJywnICsgSW50VG9TdHIoIGFyZzIpICsgJywnICsKKyAgICBhcmczLlRvU3RyaW5nICsgJywnICsgSW50VG9TdHIoIEludGVnZXIoIGFyZzQpKSArICcsJyArCisgICAgICBJbnRUb1N0ciggYXJnNSkgKyAnKScpOworCisgIGkgOj0gY2xpZW50LnRlc3RNdWx0aSggYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIEV4cGVjdCggaS5TdHJpbmdfdGhpbmcgPSAnSGVsbG8yJywgJ3Rlc3RNdWx0aTogaS5TdHJpbmdfdGhpbmcgPSAiJytpLlN0cmluZ190aGluZysnIicpOworICBFeHBlY3QoIGkuQnl0ZV90aGluZyA9IGFyZzAsICd0ZXN0TXVsdGk6IGkuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaS5CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JMzJfdGhpbmcgPSBhcmcxLCAndGVzdE11bHRpOiBpLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaS5JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkk2NF90aGluZyA9IGFyZzIsICd0ZXN0TXVsdGk6IGkuSTY0X3RoaW5nID0gJytJbnRUb1N0cihpLkk2NF90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICd0ZXN0TXVsdGk6IGkuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0J5dGVfdGhpbmcsICd0ZXN0TXVsdGk6IGkuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTMyX3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0kzMl90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JNjRfdGhpbmcsICd0ZXN0TXVsdGk6IGkuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CisKKyAgLy8gbXVsdGkgZXhjZXB0aW9uCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKDEpJywgdGVzdF9FeGNlcHRpb25zKTsKKyAgdHJ5CisgICAgaSA6PSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCAnbmVlZCBtb3JlIHBpenphJywgJ3J1biBvdXQgb2YgYmVlcicpOworICAgIEV4cGVjdCggaS5TdHJpbmdfdGhpbmcgPSAncnVuIG91dCBvZiBiZWVyJywgJ2kuU3RyaW5nX3RoaW5nID0gIicgK2kuU3RyaW5nX3RoaW5nKyAnIicpOworICAgIEV4cGVjdCggaS5fX2lzc2V0X1N0cmluZ190aGluZywgJ2kuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgICAgeyB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlLCB0aGVzZSBmaWVsZHMgYXJlIGRlZmF1bHQtc2VyaWFsaXplZAorICAgIEV4cGVjdCggbm90IGkuX19pc3NldF9CeXRlX3RoaW5nLCAnaS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfQnl0ZV90aGluZykpOworICAgIEV4cGVjdCggbm90IGkuX19pc3NldF9JMzJfdGhpbmcsICdpLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0kzMl90aGluZykpOworICAgIEV4cGVjdCggbm90IGkuX19pc3NldF9JNjRfdGhpbmcsICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworICAgIH0KKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbiknLCB0ZXN0X0V4Y2VwdGlvbnMpOworICB0cnkKKyAgICBpIDo9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oICdYY2VwdGlvbicsICdzZWNvbmQgdGVzdCcpOworICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0TXVsdGlFeGNlcHRpb24oJydYY2VwdGlvbicnKTogbXVzdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiB4OlRYY2VwdGlvbiBkbyBiZWdpbgorICAgICAgRXhwZWN0KCB4Ll9faXNzZXRfRXJyb3JDb2RlLCAneC5fX2lzc2V0X0Vycm9yQ29kZSA9ICcrQm9vbFRvU3RyaW5nKHguX19pc3NldF9FcnJvckNvZGUpKTsKKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X01lc3NhZ2VfLCAgJ3guX19pc3NldF9NZXNzYWdlXyA9ICcrQm9vbFRvU3RyaW5nKHguX19pc3NldF9NZXNzYWdlXykpOworICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDEwMDEsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKKyAgICAgIEV4cGVjdCggeC5NZXNzYWdlXyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJywgJ3guTWVzc2FnZSA9ICInK3guTWVzc2FnZV8rJyInKTsKKyAgICBlbmQ7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbjIpJywgdGVzdF9FeGNlcHRpb25zKTsKKyAgdHJ5CisgICAgaSA6PSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCAnWGNlcHRpb24yJywgJ3RoaXJkIHRlc3QnKTsKKyAgICBFeHBlY3QoIEZBTFNFLCAndGVzdE11bHRpRXhjZXB0aW9uKCcnWGNlcHRpb24yJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIHg6VFhjZXB0aW9uMiBkbyBiZWdpbgorICAgICAgRXhwZWN0KCB4Ll9faXNzZXRfRXJyb3JDb2RlLCAneC5fX2lzc2V0X0Vycm9yQ29kZSA9ICcrQm9vbFRvU3RyaW5nKHguX19pc3NldF9FcnJvckNvZGUpKTsKKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X1N0cnVjdF90aGluZywgICd4Ll9faXNzZXRfU3RydWN0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5fX2lzc2V0X1N0cnVjdF90aGluZykpOworICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDIwMDIsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKKyAgICAgIEV4cGVjdCggeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJywgJ3guU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICInK3guU3RydWN0X3RoaW5nLlN0cmluZ190aGluZysnIicpOworICAgICAgRXhwZWN0KCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X1N0cmluZ190aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgICAgIHsgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgdGhlc2UgZmllbGRzIGFyZSBkZWZhdWx0LXNlcmlhbGl6ZWQKKyAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZykpOworICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JMzJfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICAgIH0KKyAgICBlbmQ7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworCisgIC8vIG9uZXdheSBmdW5jdGlvbnMKKyAgU3RhcnRUZXN0R3JvdXAoICdUZXN0IE9uZXdheSgxKScsIHRlc3RfVW5rbm93bik7CisgIGNsaWVudC50ZXN0T25ld2F5KDEpOworICBFeHBlY3QoIFRSVUUsICdUZXN0IE9uZXdheSgxKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KKworICAvLyBjYWxsIHRpbWUKKyAgeyRJRkRFRiBQZXJmVGVzdH0KKyAgU3RhcnRUZXN0R3JvdXAoICdUZXN0IENhbGx0aW1lKCknKTsKKyAgU3RhcnRUaWNrIDo9IEdldFRpY2tDb3VudDsKKyAgZm9yIGsgOj0gMCB0byAxMDAwIC0gMSBkbworICBiZWdpbgorICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCcgPSAnICsgRmxvYXRUb1N0ciggKEdldFRpY2tDb3VudCAtIFN0YXJ0VGljaykgLyAxMDAwICkgKyAnIG1zIGEgdGVzdFZvaWQoKSBjYWxsJyApOworICB7JEVORElGIFBlcmZUZXN0fQorCisgIC8vIG5vIG1vcmUgdGVzdHMgaGVyZQorICBTdGFydFRlc3RHcm91cCggJycsIHRlc3RfVW5rbm93bik7CitlbmQ7CisKKworeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuQ2xpZW50QXN5bmNUZXN0OwordmFyCisgIGNsaWVudCA6IFRUaHJpZnRUZXN0LklBc3luYzsKKyAgcyA6IHN0cmluZzsKKyAgaTggOiBTaG9ydEludDsKK2JlZ2luCisgIFN0YXJ0VGVzdEdyb3VwKCAnQXN5bmMgVGVzdHMnLCB0ZXN0X1Vua25vd24pOworICBjbGllbnQgOj0gVFRocmlmdFRlc3QuVENsaWVudC5DcmVhdGUoIEZQcm90b2NvbCk7CisgIEZUcmFuc3BvcnQuT3BlbjsKKworICAvLyBvbmV3YXkgdm9pZCBmdW5jdGlvbnMKKyAgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxKS5XYWl0OworICBFeHBlY3QoIFRSVUUsICdUZXN0IE9uZXdheSgxKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KKworICAvLyBub3JtYWwgZnVuY3Rpb25zCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmdBc3luYyhIVUdFX1RFU1RfU1RSSU5HKS5WYWx1ZTsKKyAgRXhwZWN0KCBsZW5ndGgocykgPSBsZW5ndGgoSFVHRV9URVNUX1NUUklORyksCisgICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCisgICAgICAgICArJz0+IGxlbmd0aChyZXN1bHQpID0gJytJbnRUb1N0cihMZW5ndGgocykpKTsKKworICBpOCA6PSBjbGllbnQudGVzdEJ5dGUoMSkuVmFsdWU7CisgIEV4cGVjdCggaTggPSAxLCAndGVzdEJ5dGUoMSkgPSAnICsgSW50VG9TdHIoIGk4ICkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIFN0cmVzc1Rlc3R9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5TdHJlc3NUZXN0KGNvbnN0IGNsaWVudCA6IFRUaHJpZnRUZXN0LklmYWNlKTsKK2JlZ2luCisgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICB0cnkKKyAgICAgIGlmIG5vdCBGVHJhbnNwb3J0LklzT3BlbiB0aGVuIEZUcmFuc3BvcnQuT3BlbjsgICAvLyByZS1vcGVuIGNvbm5lY3Rpb24sIHNlcnZlciBoYXMgYWxyZWFkeSBjbG9zZWQKKyAgICAgIHRyeQorICAgICAgICBjbGllbnQudGVzdFN0cmluZygnVGVzdCcpOworICAgICAgICBXcml0ZSgnLicpOworICAgICAgZmluYWxseQorICAgICAgICBpZiBGVHJhbnNwb3J0LklzT3BlbiB0aGVuIEZUcmFuc3BvcnQuQ2xvc2U7CisgICAgICBlbmQ7CisgICAgZXhjZXB0CisgICAgICBvbiBlOkV4Y2VwdGlvbiBkbyBXcml0ZWxuKCMxMCtlLm1lc3NhZ2UpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworeyRFTkRJRn0KKworCitmdW5jdGlvbiBUQ2xpZW50VGhyZWFkLlByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIGNhc2UgYVNpemUgb2YKKyAgICBFbXB0eSAgICAgICAgICA6IFNldExlbmd0aCggcmVzdWx0LCAwKTsKKyAgICBOb3JtYWwgICAgICAgICA6IFNldExlbmd0aCggcmVzdWx0LCAkMTAwKTsKKyAgICBCeXRlQXJyYXlUZXN0ICA6IFNldExlbmd0aCggcmVzdWx0LCBTaXplT2YoVEJ5dGVBcnJheSkgKyAxMjgpOworICAgIFBpcGVXcml0ZUxpbWl0IDogU2V0TGVuZ3RoKCByZXN1bHQsIDY1NTM1ICsgMTI4KTsKKyAgZWxzZQorICAgIHJhaXNlIEVBcmd1bWVudEV4Y2VwdGlvbi5DcmVhdGUoJ2FTaXplJyk7CisgIGVuZDsKKworICBBU1NFUlQoIExvdyhyZXN1bHQpID0gMCk7CisgIGlmIExlbmd0aChyZXN1bHQpID0gMCB0aGVuIEV4aXQ7CisKKyAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgaWYgbm90IGFSYW5kb21EaXN0IHRoZW4gYmVnaW4KKyAgICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KKyAgICAgIHJlc3VsdFtpXSA6PSBpIG1vZCAkMTAwOworICAgIGVuZDsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbiBvZiBhbGwgMjU2IHZhbHVlcworICBGaWxsQ2hhciggcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSAqIFNpemVPZihyZXN1bHRbMF0pLCAkMCk7CisgIGZvciBpIDo9IExvdyhyZXN1bHQpIHRvIEhpZ2gocmVzdWx0KSBkbyBiZWdpbgorICAgIHJlc3VsdFtpXSA6PSBCeXRlKCBSYW5kb20oJDEwMCkpOworICBlbmQ7CitlbmQ7CisKKworeyRJRkRFRiBXaW42NH0KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKK3ZhciBhLGIgOiBJbnQ2NDsKK2JlZ2luCisgIGEgOj0gMTsKKyAgYiA6PSAyOworICBUaHJpZnQuVXRpbHMuSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBhLGIpOworICBFeHBlY3QoIGEgPSAzLCAnSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0Jyk7CitlbmQ7Cit7JEVORElGfQorCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CisvLyBUZXN0cyBvbmx5IHRoZW4gcmVhZC93cml0ZSBwcm9jZWR1cmVzIG9mIHRoZSBKU09OIHByb3RvY29sCisvLyBBbGwgdGVzdHMgc3VjY2VlZCwgaWYgd2UgY2FuIHJlYWQgd2hhdCB3ZSB3cm90ZSBiZWZvcmUKKy8vIE5vdGUgdGhhdCBwYXNzaW5nIHRoaXMgdGVzdCBkb2VzIG5vdCBpbXBseSwgdGhhdCBvdXIgSlNPTiBpcyByZWFsbHkgY29tcGF0aWJsZSB0byB3aGF0CisvLyBvdGhlciBjbGllbnRzIG9yIHNlcnZlcnMgZXhwZWN0IGFzIHRoZSByZWFsIEpTT04uIFRoaXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIHRlc3QuCit2YXIgcHJvdCAgIDogSVByb3RvY29sOworICAgIHN0bSAgICA6IFRTdHJpbmdTdHJlYW07CisgICAgbGlzdCAgIDogVFRocmlmdExpc3Q7CisgICAgYmluYXJ5LCBiaW5SZWFkLCBlbXB0eUJpbmFyeSA6IFRCeXRlczsKKyAgICBpLGlFcnIgOiBJbnRlZ2VyOworY29uc3QKKyAgVEVTVF9TSE9SVCAgID0gU2hvcnRJbnQoICRGRSk7CisgIFRFU1RfU01BTEwgICA9IFNtYWxsSW50KCAkRkVEQyk7CisgIFRFU1RfTE9ORyAgICA9IExvbmdJbnQoICRGRURDQkE5OCk7CisgIFRFU1RfSTY0ICAgICA9IEludDY0KCAkRkVEQ0JBOTg3NjU0MzIxMCk7CisgIFRFU1RfRE9VQkxFICA9IC0xLjIzNGUtNTY7CisgIERFTFRBX0RPVUJMRSA9IFRFU1RfRE9VQkxFICogMWUtMTQ7CisgIFRFU1RfU1RSSU5HICA9ICdhYmMtJyMkMDBFNCMkMDBmNiMkMDBmYzsgLy8gZ2VybWFuIHVtbGF1dHMgKGVuLXVzOiAiZnVubnkgY2hhcnMiKQorICAvLyBUZXN0IFRIUklGVC0yMzM2IGFuZCBUSFJJRlQtMzQwNCB3aXRoIFUrMUQxMUUgKEcgQ2xlZiBzeW1ib2wpIGFuZCAn0KDRg9GB0YHQutC+0LUg0J3QsNC30LLQsNC90LjQtSc7CisgIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCA9ICMkMWQxMWUnICcjJDA0MjAjJDA0NDMjJDA0NDEjJDA0NDEjJDA0M2EjJDA0M2UjJDA0MzUnICcjJDA0MWQjJDA0MzAjJDA0MzcjJDA0MzIjJDA0MzAjJDA0M2QjJDA0MzgjJDA0MzU7CisgIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfSlNPTiA9ICciXHVkODM0XHVkZDFlIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzNSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUiJzsKKyAgLy8gdGVzdCBib3RoIHBvc3NpYmxlIHNvbGlkdXMgZW5jb2RpbmdzCisgIFNPTElEVVNfSlNPTl9EQVRBID0gJyJvbmUvdHdvXC90aHJlZSInOworICBTT0xJRFVTX0VYQ1BFQ1RFRCA9ICdvbmUvdHdvL3RocmVlJzsKK2JlZ2luCisgIHN0bSAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIFN0YXJ0VGVzdEdyb3VwKCAnSnNvblByb3RvY29sVGVzdCcsIHRlc3RfVW5rbm93bik7CisKKyAgICAvLyBwcmVwYXJlIGJpbmFyeSBkYXRhCisgICAgYmluYXJ5IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBGQUxTRSwgTm9ybWFsKTsKKyAgICBTZXRMZW5ndGgoIGVtcHR5QmluYXJ5LCAwKTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKKworICAgIC8vIG91dHB1dCBzZXR1cAorICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CisKKyAgICAvLyB3cml0ZQorICAgIEluaXQoIGxpc3QsIFRUeXBlLlN0cmluZ18sIDkpOworICAgIHByb3QuV3JpdGVMaXN0QmVnaW4oIGxpc3QpOworICAgIHByb3QuV3JpdGVCb29sKCBUUlVFKTsKKyAgICBwcm90LldyaXRlQm9vbCggRkFMU0UpOworICAgIHByb3QuV3JpdGVCeXRlKCBURVNUX1NIT1JUKTsKKyAgICBwcm90LldyaXRlSTE2KCBURVNUX1NNQUxMKTsKKyAgICBwcm90LldyaXRlSTMyKCBURVNUX0xPTkcpOworICAgIHByb3QuV3JpdGVJNjQoIFRFU1RfSTY0KTsKKyAgICBwcm90LldyaXRlRG91YmxlKCBURVNUX0RPVUJMRSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggVEVTVF9TVFJJTkcpOworICAgIHByb3QuV3JpdGVCaW5hcnkoIGJpbmFyeSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgICAgcHJvdC5Xcml0ZUJpbmFyeSggZW1wdHlCaW5hcnkpOyAvLyBlbXB0eSBiaW5hcnkgZGF0YSBibG9jaworICAgIHByb3QuV3JpdGVMaXN0RW5kOworCisgICAgLy8gaW5wdXQgc2V0dXAKKyAgICBFeHBlY3QoIHN0bS5Qb3NpdGlvbiA9IHN0bS5TaXplLCAnU3RyZWFtIHBvc2l0aW9uL2xlbmd0aCBhZnRlciB3cml0ZScpOworICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7CisKKyAgICAvLyByZWFkIGFuZCBjb21wYXJlCisgICAgbGlzdCA6PSBwcm90LlJlYWRMaXN0QmVnaW47CisgICAgRXhwZWN0KCBsaXN0LkVsZW1lbnRUeXBlID0gVFR5cGUuU3RyaW5nXywgJ2xpc3QgZWxlbWVudCB0eXBlJyk7CisgICAgRXhwZWN0KCBsaXN0LkNvdW50ID0gOSwgJ2xpc3QgZWxlbWVudCBjb3VudCcpOworICAgIEV4cGVjdCggcHJvdC5SZWFkQm9vbCwgJ1dyaXRlQm9vbC9SZWFkQm9vbDogVFJVRScpOworICAgIEV4cGVjdCggbm90IHByb3QuUmVhZEJvb2wsICdXcml0ZUJvb2wvUmVhZEJvb2w6IEZBTFNFJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRCeXRlICAgPSBURVNUX1NIT1JULCAgJ1dyaXRlQnl0ZS9SZWFkQnl0ZScpOworICAgIEV4cGVjdCggcHJvdC5SZWFkSTE2ICAgID0gVEVTVF9TTUFMTCwgICdXcml0ZUkxNi9SZWFkSTE2Jyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRJMzIgICAgPSBURVNUX0xPTkcsICAgJ1dyaXRlSTMyL1JlYWRJMzInKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEk2NCAgICA9IFRFU1RfSTY0LCAgICAnV3JpdGVJNjQvUmVhZEk2NCcpOworICAgIEV4cGVjdCggYWJzKHByb3QuUmVhZERvdWJsZS1URVNUX0RPVUJMRSkgPCBhYnMoREVMVEFfRE9VQkxFKSwgJ1dyaXRlRG91YmxlL1JlYWREb3VibGUnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFRFU1RfU1RSSU5HLCAnV3JpdGVTdHJpbmcvUmVhZFN0cmluZycpOworICAgIGJpblJlYWQgOj0gcHJvdC5SZWFkQmluYXJ5OworICAgIEV4cGVjdCggTGVuZ3RoKHByb3QuUmVhZFN0cmluZykgPSAwLCAnV3JpdGVTdHJpbmcvUmVhZFN0cmluZyAoZW1wdHkgc3RyaW5nKScpOworICAgIEV4cGVjdCggTGVuZ3RoKHByb3QuUmVhZEJpbmFyeSkgPSAwLCAnZW1wdHkgV3JpdGVCaW5hcnkvUmVhZEJpbmFyeSAoZW1wdHkgZGF0YSBibG9jayknKTsKKyAgICBwcm90LlJlYWRMaXN0RW5kOworCisgICAgLy8gdGVzdCBiaW5hcnkgZGF0YQorICAgIEV4cGVjdCggTGVuZ3RoKGJpbmFyeSkgPSBMZW5ndGgoYmluUmVhZCksICdCaW5hcnkgZGF0YSBsZW5ndGggY2hlY2snKTsKKyAgICBpRXJyIDo9IC0xOworICAgIGZvciBpIDo9IExvdyhiaW5hcnkpIHRvIEhpZ2goYmluYXJ5KSBkbyBiZWdpbgorICAgICAgaWYgYmluYXJ5W2ldIDw+IGJpblJlYWRbaV0gdGhlbiBiZWdpbgorICAgICAgICBpRXJyIDo9IGk7CisgICAgICAgIEJyZWFrOworICAgICAgZW5kOworICAgIGVuZDsKKyAgICBpZiBpRXJyIDwgMAorICAgIHRoZW4gRXhwZWN0KCBUUlVFLCAgJ0JpbmFyeSBkYXRhIGNoZWNrICgnK0ludFRvU3RyKExlbmd0aChiaW5hcnkpKSsnIEJ5dGVzKScpCisgICAgZWxzZSBFeHBlY3QoIEZBTFNFLCAnQmluYXJ5IGRhdGEgY2hlY2sgYXQgb2Zmc2V0ICcrSW50VG9TdHIoaUVycikpOworCisgICAgRXhwZWN0KCBzdG0uUG9zaXRpb24gPSBzdG0uU2l6ZSwgJ1N0cmVhbSBwb3NpdGlvbiBhZnRlciByZWFkJyk7CisKKworICAgIC8vIFNvbGlkdXMgY2FuIGJlIGVuY29kZWQgaW4gdHdvIHdheXMuIE1ha2Ugc3VyZSB3ZSBjYW4gcmVhZCBib3RoCisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgc3RtLlNpemUgICAgIDo9IDA7CisgICAgc3RtLldyaXRlU3RyaW5nKFNPTElEVVNfSlNPTl9EQVRBKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gU09MSURVU19FWENQRUNURUQsICdTb2xpZHVzIGVuY29kaW5nJyk7CisKKworICAgIC8vIFdpZGVjaGFycyBzaG91bGQgd29yayB0b28uIERvIHRoZXk/CisgICAgLy8gQWZ0ZXIgd3JpdGluZywgd2UgZW5zdXJlIHRoYXQgd2UgYXJlIGFibGUgdG8gcmVhZCBpdCBiYWNrCisgICAgLy8gV2UgY2FuJ3QgYXNzdW1lIGhleC1lbmNvZGluZywgc2luY2UgKG5lYXJseSkgYW55IFVuaWNvZGUgY2hhciBpcyB2YWxpZCBKU09OCisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgc3RtLlNpemUgICAgIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBuaWwsIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSkpKTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQpOworICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQsICdXcml0aW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CisKKyAgICAvLyBXaWRlY2hhcnMgc2hvdWxkIHdvcmsgd2l0aCBoZXgtZW5jb2RpbmcgdG9vLiBEbyB0aGV5PworICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHN0bS5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19KU09OKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnUmVhZGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworCisKKyAgZmluYWxseQorICAgIHN0bS5GcmVlOworICAgIHByb3QgOj0gbmlsOyAgLy8tPiBSZWxlYXNlCisgICAgU3RhcnRUZXN0R3JvdXAoICcnLCB0ZXN0X1Vua25vd24pOyAgLy8gbm8gbW9yZSB0ZXN0cyBoZXJlCisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5TdGFydFRlc3RHcm91cCggY29uc3QgYUdyb3VwIDogc3RyaW5nOyBjb25zdCBhVGVzdCA6IFRUZXN0R3JvdXApOworYmVnaW4KKyAgRlRlc3RHcm91cCA6PSBhR3JvdXA7CisgIEZDdXJyZW50VGVzdCA6PSBhVGVzdDsKKworICBJbmNsdWRlKCBGRXhlY3V0ZWQsIGFUZXN0KTsKKworICBpZiBGVGVzdEdyb3VwIDw+ICcnIHRoZW4gYmVnaW4KKyAgICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGFHcm91cCsnIHRlc3RzJyk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIFN0cmluZ09mQ2hhcignLScsNjApKTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4cGVjdCggYVRlc3RSZXN1bHQgOiBCb29sZWFuOyBjb25zdCBhVGVzdEluZm8gOiBzdHJpbmcpOworYmVnaW4KKyAgaWYgYVRlc3RSZXN1bHQgIHRoZW4gYmVnaW4KKyAgICBJbmMoRlN1Y2Nlc3Nlcyk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGFUZXN0SW5mbysnOiBwYXNzZWQnKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGRXJyb3JzLkFkZCggRlRlc3RHcm91cCsnOiAnK2FUZXN0SW5mbyk7CisgICAgSW5jbHVkZSggRkZhaWxlZCwgRkN1cnJlbnRUZXN0KTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggYVRlc3RJbmZvKyc6ICoqKiBGQUlMRUQgKioqJyk7CisKKyAgICAvLyBXZSBoYXZlIGEgZmFpbGVkIHRlc3QhCisgICAgLy8gLT4gaXNzdWUgRGVidWdCcmVhayBPTkxZIGlmIGEgZGVidWdnZXIgaXMgYXR0YWNoZWQsCisgICAgLy8gLT4gdW5oYW5kbGVkIERlYnVnQnJlYWtzIHdvdWxkIGNhdXNlIFdpbmRvd3MgdG8gdGVybWluYXRlIHRoZSBhcHAgb3RoZXJ3aXNlCisgICAgaWYgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICB0aGVuIHskSUZERUYgQ1BVWDY0fSBEZWJ1Z0JyZWFrIHskRUxTRX0gYXNtIGludCAzIGVuZCB7JEVORElGfTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlJlcG9ydFJlc3VsdHM7Cit2YXIgblRvdGFsIDogSW50ZWdlcjsKKyAgICBzTGluZSA6IHN0cmluZzsKK2JlZ2luCisgIC8vIHByZXZlbnQgdXMgZnJvbSBzdHVwaWQgRElWLzAgZXJyb3JzCisgIG5Ub3RhbCA6PSBGU3VjY2Vzc2VzICsgRkVycm9ycy5Db3VudDsKKyAgaWYgblRvdGFsID0gMCB0aGVuIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ05vIHJlc3VsdHMgbG9nZ2VkJyk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIENvbnNvbGUuV3JpdGVMaW5lKCcnKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIFN0cmluZ09mQ2hhcignPScsNjApKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIEludFRvU3RyKG5Ub3RhbCkrJyB0ZXN0cyBwZXJmb3JtZWQnKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIEludFRvU3RyKEZTdWNjZXNzZXMpKycgdGVzdHMgc3VjY2VlZGVkICgnK0ludFRvU3RyKHJvdW5kKDEwMCpGU3VjY2Vzc2VzL25Ub3RhbCkpKyclKScpOworICBDb25zb2xlLldyaXRlTGluZSggSW50VG9TdHIoRkVycm9ycy5Db3VudCkrJyB0ZXN0cyBmYWlsZWQgKCcrSW50VG9TdHIocm91bmQoMTAwKkZFcnJvcnMuQ291bnQvblRvdGFsKSkrJyUpJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJz0nLDYwKSk7CisgIGlmIEZFcnJvcnMuQ291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBDb25zb2xlLldyaXRlTGluZSgnRkFJTEVEIFRFU1RTOicpOworICAgIGZvciBzTGluZSBpbiBGRXJyb3JzIGRvIENvbnNvbGUuV3JpdGVMaW5lKCctICcrc0xpbmUpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJz0nLDYwKSk7CisgICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoIEV4aXRDb2RlKTsgIC8vIHJldHVybiA8PiAwIG9uIGVycm9ycworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCcnKTsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2xpZW50VGhyZWFkLkNhbGN1bGF0ZUV4aXRDb2RlIDogQnl0ZTsKK3ZhciB0ZXN0IDogVFRlc3RHcm91cDsKK2JlZ2luCisgIHJlc3VsdCA6PSBFWElUQ09ERV9TVUNDRVNTOworICBmb3IgdGVzdCA6PSBMb3coVFRlc3RHcm91cCkgdG8gSGlnaChUVGVzdEdyb3VwKSBkbyBiZWdpbgorICAgIGlmICh0ZXN0IGluIEZGYWlsZWQpIG9yIG5vdCAodGVzdCBpbiBGRXhlY3V0ZWQpCisgICAgdGhlbiByZXN1bHQgOj0gcmVzdWx0IG9yIE1BUF9GQUlMVVJFU19UT19FWElUQ09ERV9CSVRTW3Rlc3RdOworICBlbmQ7CitlbmQ7CisKKworY29uc3RydWN0b3IgVENsaWVudFRocmVhZC5DcmVhdGUoIGNvbnN0IGFTZXR1cCA6IFRUZXN0U2V0dXA7IGNvbnN0IGFOdW1JdGVyYXRpb246IEludGVnZXIpOworYmVnaW4KKyAgRlNldHVwIDo9IGFTZXR1cDsKKyAgRk51bUl0ZXJhdGlvbiA6PSBBTnVtSXRlcmF0aW9uOworCisgIEZDb25zb2xlIDo9IFRUaHJlYWRDb25zb2xlLkNyZWF0ZSggU2VsZiApOworICBGQ3VycmVudFRlc3QgOj0gdGVzdF9Vbmtub3duOworCisgIC8vIGVycm9yIGxpc3Q6IGtlZXAgY29ycmVjdCBvcmRlciwgYWxsb3cgZm9yIGR1cGxpY2F0ZXMKKyAgRkVycm9ycyA6PSBUU3RyaW5nTGlzdC5DcmVhdGU7CisgIEZFcnJvcnMuU29ydGVkIDo9IEZBTFNFOworICBGRXJyb3JzLkR1cGxpY2F0ZXMgOj0gZHVwQWNjZXB0OworCisgIGluaGVyaXRlZCBDcmVhdGUoIFRSVUUpOworZW5kOworCitkZXN0cnVjdG9yIFRDbGllbnRUaHJlYWQuRGVzdHJveTsKK2JlZ2luCisgIEZyZWVBbmROaWwoIEZDb25zb2xlKTsKKyAgRnJlZUFuZE5pbCggRkVycm9ycyk7CisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuRXhlY3V0ZTsKK3ZhcgorICBpIDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHBlcmZvcm0gYWxsIHRlc3RzCisgIHRyeQorICAgIHskSUZERUYgV2luNjR9CisgICAgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CisgICAgSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKworICAgIC8vIG11c3QgYmUgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAgICBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICB0cnkKKyAgICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8gYmVnaW4KKyAgICAgICAgQ2xpZW50VGVzdDsKKyAgICAgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgICAgICBDbGllbnRBc3luY1Rlc3Q7CisgICAgICAgIHskRU5ESUZ9CisgICAgICBlbmQ7CisKKyAgICAgIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQorICAgICAgUmVwb3J0UmVzdWx0czsKKyAgICAgIFNldFJldHVyblZhbHVlKCBDYWxjdWxhdGVFeGl0Q29kZSk7CisKKyAgICBmaW5hbGx5CisgICAgICBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisgICAgZW5kOworCisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIicrZS5tZXNzYWdlKyciJyk7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Jbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKK3ZhcgorICBzdHJlYW10cmFucyA6IElTdHJlYW1UcmFuc3BvcnQ7CisgIGh0dHAgOiBJSFRUUENsaWVudDsKKyAgc1VybCA6IHN0cmluZzsKK2NvbnN0CisgIERFQlVHX1RJTUVPVVQgICA9IDMwICogMTAwMDsKKyAgUkVMRUFTRV9USU1FT1VUID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgUElQRV9USU1FT1VUICAgID0gUkVMRUFTRV9USU1FT1VUOworICBIVFRQX1RJTUVPVVRTICAgPSAxMCAqIDEwMDA7CitiZWdpbgorICAvLyBuZWVkZWQgZm9yIEhUVFAgY2xpZW50cyBhcyB0aGV5IHV0aWxpemUgdGhlIE1TWE1MIENPTSBjb21wb25lbnRzCisgIE9sZUNoZWNrKCBDb0luaXRpYWxpemUoIG5pbCkpOworCisgIGNhc2UgRlNldHVwLmVuZHBvaW50IG9mCisgICAgdHJuc19Tb2NrZXRzOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIHNvY2tldHMgKCcrRlNldHVwLmhvc3QrJyBwb3J0ICcrSW50VG9TdHIoRlNldHVwLnBvcnQpKycpJyk7CisgICAgICBzdHJlYW10cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIEZTZXR1cC5ob3N0LCBGU2V0dXAucG9ydCApOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgICB0cm5zX0h0dHA6IGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgSFRUUENsaWVudCcpOworICAgICAgaWYgRlNldHVwLnVzZVNTTAorICAgICAgdGhlbiBzVXJsIDo9ICdodHRwOi8vJworICAgICAgZWxzZSBzVXJsIDo9ICdodHRwczovLyc7CisgICAgICBzVXJsIDo9IHNVcmwgKyBGU2V0dXAuaG9zdDsKKyAgICAgIGNhc2UgRlNldHVwLnBvcnQgb2YKKyAgICAgICAgODAgIDogaWYgRlNldHVwLnVzZVNTTCB0aGVuIHNVcmwgOj0gc1VybCArICc6JysgSW50VG9TdHIoRlNldHVwLnBvcnQpOworICAgICAgICA0NDMgOiBpZiBub3QgRlNldHVwLnVzZVNTTCB0aGVuIHNVcmwgOj0gc1VybCArICc6JysgSW50VG9TdHIoRlNldHVwLnBvcnQpOworICAgICAgZWxzZQorICAgICAgICBpZiBGU2V0dXAucG9ydCA+IDAgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVuZDsKKyAgICAgIGh0dHAgOj0gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZSggc1VybCk7CisgICAgICBodHRwLkRuc1Jlc29sdmVUaW1lb3V0IDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLkNvbm5lY3Rpb25UaW1lb3V0IDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLlNlbmRUaW1lb3V0ICAgICAgIDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLlJlYWRUaW1lb3V0ICAgICAgIDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBGVHJhbnNwb3J0IDo9IGh0dHA7CisgICAgZW5kOworCisgICAgdHJuc19Fdkh0dHA6IGJlZ2luCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbRlNldHVwLmVuZHBvaW50XSsnIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICBlbmQ7CisKKyAgICB0cm5zX05hbWVkUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIEZTZXR1cC5zUGlwZU5hbWUsIDAsIG5pbCwgUElQRV9USU1FT1VULCBQSVBFX1RJTUVPVVQpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgICB0cm5zX0Fub25QaXBlczogYmVnaW4KKyAgICAgIHN0cmVhbXRyYW5zIDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZTZXR1cC5oQW5vblJlYWQsIEZTZXR1cC5oQW5vbldyaXRlLCBGQUxTRSk7CisgICAgICBGVHJhbnNwb3J0IDo9IHN0cmVhbXRyYW5zOworICAgIGVuZDsKKworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIGVuZHBvaW50IHRyYW5zcG9ydCcpOworICBlbmQ7CisgIEFTU0VSVCggRlRyYW5zcG9ydCA8PiBuaWwpOworCisgIC8vIGxheWVyZWQgdHJhbnNwb3J0cyBhcmUgbm90IHJlYWxseSBtZWFudCB0byBiZSBzdGFja2VkIHVwb24gZWFjaCBvdGhlcgorICBpZiAodHJuc19GcmFtZWQgaW4gRlNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgIGVuZAorICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIEZTZXR1cC5sYXllcmVkKSBhbmQgKHN0cmVhbXRyYW5zIDw+IG5pbCkgdGhlbiBiZWdpbgorICAgIEZUcmFuc3BvcnQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHN0cmVhbXRyYW5zLCAzMik7ICAvLyBzbWFsbCBidWZmZXIgdG8gdGVzdCByZWFkKCkKKyAgZW5kOworCisgIGlmIEZTZXR1cC51c2VTU0wgdGhlbiBiZWdpbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1NTTC9UTFMgbm90IGltcGxlbWVudGVkJyk7CisgIGVuZDsKKworICAvLyBjcmVhdGUgcHJvdG9jb2wgaW5zdGFuY2UsIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgY2FzZSBGU2V0dXAucHJvdFR5cGUgb2YKKyAgICBwcm90X0JpbmFyeSAgOiAgRlByb3RvY29sIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0LCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOworICAgIHByb3RfSlNPTiAgICA6ICBGUHJvdG9jb2wgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0KTsKKyAgICBwcm90X0NvbXBhY3QgOiAgRlByb3RvY29sIDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgIGVsc2UKKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKKyAgZW5kOworCisgIEFTU0VSVCggKEZUcmFuc3BvcnQgPD4gbmlsKSBhbmQgKEZQcm90b2NvbCA8PiBuaWwpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5TaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CitiZWdpbgorICB0cnkKKyAgICBGUHJvdG9jb2wgOj0gbmlsOworCisgICAgaWYgRlRyYW5zcG9ydCA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlRyYW5zcG9ydC5DbG9zZTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gbmlsOworICAgIGVuZDsKKworICBmaW5hbGx5CisgICAgQ29VbmluaXRpYWxpemU7CisgIGVuZDsKK2VuZDsKKworCit7IFRUaHJlYWRDb25zb2xlIH0KKworY29uc3RydWN0b3IgVFRocmVhZENvbnNvbGUuQ3JlYXRlKEFUaHJlYWQ6IFRUaHJlYWQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRocmVhZCA6PSBBVGhyZWFkOworZW5kOworCitwcm9jZWR1cmUgVFRocmVhZENvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK3ZhcgorICBwcm9jIDogVFRocmVhZFByb2NlZHVyZTsKK2JlZ2luCisgIHByb2MgOj0gcHJvY2VkdXJlCisgIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZSggUyApOworICBlbmQ7CisgIFRUaHJlYWQuU3luY2hyb25pemUoIEZUaHJlYWQsIHByb2MpOworZW5kOworCitwcm9jZWR1cmUgVFRocmVhZENvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7Cit2YXIKKyAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CitiZWdpbgorICBwcm9jIDo9IHByb2NlZHVyZQorICBiZWdpbgorICAgIENvbnNvbGUuV3JpdGVMaW5lKCBTICk7CisgIGVuZDsKKyAgVFRocmVhZC5TeW5jaHJvbml6ZSggRlRocmVhZCwgcHJvYyk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBUVGVzdENsaWVudC5GTnVtSXRlcmF0aW9uIDo9IDE7CisgIFRUZXN0Q2xpZW50LkZOdW1UaHJlYWQgOj0gMTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTY5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMKQEAgLTAsMCArMSwxNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0Q29uc3RhbnRzOworCitpbnRlcmZhY2UKKwordXNlcyBTeXNVdGlsczsKKwordHlwZQorICBUS25vd25Qcm90b2NvbCA9ICgKKyAgICBwcm90X0JpbmFyeSwgIC8vIGRlZmF1bHQgYmluYXJ5IHByb3RvY29sCisgICAgcHJvdF9KU09OLCAgICAvLyBKU09OIHByb3RvY29sCisgICAgcHJvdF9Db21wYWN0CisgICk7CisKKyAgVFNlcnZlclR5cGUgPSAoCisgICAgc3J2X1NpbXBsZSwKKyAgICBzcnZfTm9uYmxvY2tpbmcsCisgICAgc3J2X1RocmVhZHBvb2wsCisgICAgc3J2X1RocmVhZGVkCisgICk7CisKKyAgVEVuZHBvaW50VHJhbnNwb3J0ID0gKAorICAgIHRybnNfU29ja2V0cywKKyAgICB0cm5zX0h0dHAsCisgICAgdHJuc19OYW1lZFBpcGVzLAorICAgIHRybnNfQW5vblBpcGVzLAorICAgIHRybnNfRXZIdHRwICAvLyBhcyBsaXN0ZWQgb24gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3Rlc3QKKyAgKTsKKworICBUTGF5ZXJlZFRyYW5zcG9ydCA9ICgKKyAgICB0cm5zX0J1ZmZlcmVkLAorICAgIHRybnNfRnJhbWVkCisgICk7CisKKyAgVExheWVyZWRUcmFuc3BvcnRzID0gc2V0IG9mIFRMYXllcmVkVHJhbnNwb3J0OworCitjb25zdAorICBTRVJWRVJfVFlQRVMgOiBhcnJheVtUU2VydmVyVHlwZV0gb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICA9ICgnU2ltcGxlJywgJ05vbmJsb2NraW5nJywgJ1RocmVhZHBvb2wnLCAnVGhyZWFkZWQnKTsKKworICBUSFJJRlRfUFJPVE9DT0xTIDogYXJyYXlbVEtub3duUHJvdG9jb2xdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ0JpbmFyeScsICdKU09OJywgJ0NvbXBhY3QnKTsKKworICBMQVlFUkVEX1RSQU5TUE9SVFMgOiBhcnJheVtUTGF5ZXJlZFRyYW5zcG9ydF0gb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICA9ICgnQnVmZmVyZWQnLCAnRnJhbWVkJyk7CisKKyAgRU5EUE9JTlRfVFJBTlNQT1JUUyA6IGFycmF5W1RFbmRwb2ludFRyYW5zcG9ydF0gb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICA9ICgnU29ja2V0cycsICdIdHRwJywgJ05hbWVkIFBpcGVzJywnQW5vbiBQaXBlcycsICdFdkh0dHAnKTsKKworICAvLyBkZWZhdWx0cyBhcmU6IHJlYWQ9ZmFsc2UsIHdyaXRlPXRydWUKKyAgQklOQVJZX1NUUklDVF9SRUFEICA9IEZBTFNFOworICBCSU5BUllfU1RSSUNUX1dSSVRFID0gRkFMU0U7CisKKyAgSFVHRV9URVNUX1NUUklORyA9ICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICcKKyAgICAgICAgICAgICAgICAgICArICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgJworICAgICAgICAgICAgICAgICAgICsgJ2Vpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAndm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0ICcKKyAgICAgICAgICAgICAgICAgICArICdhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSAnCisgICAgICAgICAgICAgICAgICAgKyAnbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgJworICAgICAgICAgICAgICAgICAgICsgJ2RpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgJworICAgICAgICAgICAgICAgICAgICsgJ2NsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICc7CisKKworZnVuY3Rpb24gQnl0ZXNUb0hleCggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogc3RyaW5nOworCisKK2ltcGxlbWVudGF0aW9uCisKKworZnVuY3Rpb24gQnl0ZXNUb0hleCggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogc3RyaW5nOwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9ICcnOworICBmb3IgaSA6PSBMb3coYnl0ZXMpIHRvIEhpZ2goYnl0ZXMpIGRvIGJlZ2luCisgICAgcmVzdWx0IDo9IHJlc3VsdCArIEludFRvSGV4KGJ5dGVzW2ldLDIpOworICBlbmQ7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Y2IxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKQEAgLTAsMCArMSw3NDUgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0U2VydmVyOworCit7JEkgLi4vc3JjL1RocmlmdC5EZWZpbmVzLmluY30KK3skV0FSTiBTWU1CT0xfUExBVEZPUk0gT0ZGfQorCit7LiRERUZJTkUgUnVuRW5kbGVzc30gICAvLyBhY3RpdmF0ZSB0byBpbnRlcmFjdGl2ZWx5IHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgc3RvcCByb3V0aW5lcyB2aWEgQ3RybCtDCisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlNlcnZlciwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKKyAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuVGVzdCwKKyAgVGhyaWZ0LAorICBUZXN0Q29uc3RhbnRzLAorICBUZXN0U2VydmVyRXZlbnRzLAorICBDb25zb2xlSGVscGVyLAorICBDb250bnJzOworCit0eXBlCisgIFRUZXN0U2VydmVyID0gY2xhc3MKKyAgcHVibGljCisgICAgdHlwZQorCisgICAgICBJVGVzdEhhbmRsZXIgPSBpbnRlcmZhY2UoIFRUaHJpZnRUZXN0LklmYWNlICkKKyAgICAgICAgcHJvY2VkdXJlIFNldFNlcnZlciggY29uc3QgQVNlcnZlciA6IElTZXJ2ZXIgKTsKKyAgICAgICAgcHJvY2VkdXJlIFRlc3RTdG9wOworICAgICAgZW5kOworCisgICAgICBUVGVzdEhhbmRsZXJJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGVzdEhhbmRsZXIgKQorICAgICAgcHJpdmF0ZQorICAgICAgICBGU2VydmVyIDogSVNlcnZlcjsKKyAgICAgIHByb3RlY3RlZAorICAgICAgICBwcm9jZWR1cmUgdGVzdFZvaWQoKTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJvb2wodGhpbmc6IEJvb2xlYW4pOiBCb29sZWFuOworICAgICAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nKGNvbnN0IHRoaW5nOiBzdHJpbmcpOiBzdHJpbmc7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RCeXRlKHRoaW5nOiBTaG9ydEludCk6IFNob3J0SW50OworICAgICAgICBmdW5jdGlvbiB0ZXN0STMyKHRoaW5nOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEk2NChjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdERvdWJsZShjb25zdCB0aGluZzogRG91YmxlKTogRG91YmxlOworICAgICAgICBmdW5jdGlvbiB0ZXN0QmluYXJ5KGNvbnN0IHRoaW5nOiBUQnl0ZXMpOiBUQnl0ZXM7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJ1Y3QoY29uc3QgdGhpbmc6IElYdHJ1Y3QpOiBJWHRydWN0OworICAgICAgICBmdW5jdGlvbiB0ZXN0TmVzdChjb25zdCB0aGluZzogSVh0cnVjdDIpOiBJWHRydWN0MjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE1hcChjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4pOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFN0cmluZ01hcChjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KTogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+OworICAgICAgICBmdW5jdGlvbiB0ZXN0U2V0KGNvbnN0IHRoaW5nOiBJSGFzaFNldDxJbnRlZ2VyPik6IElIYXNoU2V0PEludGVnZXI+OworICAgICAgICBmdW5jdGlvbiB0ZXN0TGlzdChjb25zdCB0aGluZzogSVRocmlmdExpc3Q8SW50ZWdlcj4pOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEVudW0odGhpbmc6IFROdW1iZXJ6KTogVE51bWJlcno7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RUeXBlZGVmKGNvbnN0IHRoaW5nOiBJbnQ2NCk6IEludDY0OworICAgICAgICBmdW5jdGlvbiB0ZXN0TWFwTWFwKGhlbGxvOiBJbnRlZ2VyKTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+OworICAgICAgICBmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoY29uc3QgYXJndW1lbnQ6IElJbnNhbml0eSk6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RNdWx0aShhcmcwOiBTaG9ydEludDsgYXJnMTogSW50ZWdlcjsgY29uc3QgYXJnMjogSW50NjQ7IGNvbnN0IGFyZzM6IElUaHJpZnREaWN0aW9uYXJ5PFNtYWxsSW50LCBzdHJpbmc+OyBhcmc0OiBUTnVtYmVyejsgY29uc3QgYXJnNTogSW50NjQpOiBJWHRydWN0OworICAgICAgICBwcm9jZWR1cmUgdGVzdEV4Y2VwdGlvbihjb25zdCBhcmc6IHN0cmluZyk7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihjb25zdCBhcmcwOiBzdHJpbmc7IGNvbnN0IGFyZzE6IHN0cmluZyk6IElYdHJ1Y3Q7CisgICAgICAgIHByb2NlZHVyZSB0ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwOiBJbnRlZ2VyKTsKKworICAgICAgICBwcm9jZWR1cmUgVGVzdFN0b3A7CisgICAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgICBlbmQ7CisKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBQcmludENtZExpbmVIZWxwOworICAgICAgY2xhc3MgcHJvY2VkdXJlIEludmFsaWRBcmdzOworCisgICAgICBjbGFzcyBwcm9jZWR1cmUgTGF1bmNoQW5vblBpcGVDaGlsZCggY29uc3QgYXBwIDogc3RyaW5nOyBjb25zdCB0cmFuc3BvcnQgOiBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCk7CisgICAgICBjbGFzcyBwcm9jZWR1cmUgRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCisKK3ZhciBnX0hhbmRsZXIgOiBUVGVzdFNlcnZlci5JVGVzdEhhbmRsZXIgPSBuaWw7CisKKworZnVuY3Rpb24gTXlDb25zb2xlRXZlbnRIYW5kbGVyKCBkd0N0cmxUeXBlIDogRFdPUkQpIDogQk9PTDsgIHN0ZGNhbGw7CisvLyBOb3RlIHRoYXQgdGhpcyBIYW5kbGVyIHByb2NlZHVyZSBpcyBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZAordmFyIGhhbmRsZXIgOiBUVGVzdFNlcnZlci5JVGVzdEhhbmRsZXI7CitiZWdpbgorICByZXN1bHQgOj0gVFJVRTsKKyAgdHJ5CisgICAgY2FzZSBkd0N0cmxUeXBlIG9mCisgICAgICBDVFJMX0NfRVZFTlQgICAgICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnQ3RybCtDIHByZXNzZWQnKTsKKyAgICAgIENUUkxfQlJFQUtfRVZFTlQgICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdDdHJsK0JyZWFrIHByZXNzZWQnKTsKKyAgICAgIENUUkxfQ0xPU0VfRVZFTlQgICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBDbG9zZVRhc2sgc2lnbmFsJyk7CisgICAgICBDVFJMX0xPR09GRl9FVkVOVCAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgTG9nT2ZmIHNpZ25hbCcpOworICAgICAgQ1RSTF9TSFVURE9XTl9FVkVOVCA6ICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIFNodXRkb3duIHNpZ25hbCcpOworICAgIGVsc2UKKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgY29uc29sZSBldmVudCAjJytJbnRUb1N0cihJbnRlZ2VyKGR3Q3RybFR5cGUpKSk7CisgICAgZW5kOworCisgICAgaGFuZGxlciA6PSBnX0hhbmRsZXI7CisgICAgaWYgaGFuZGxlciA8PiBuaWwgdGhlbiBoYW5kbGVyLlRlc3RTdG9wOworCisgIGV4Y2VwdAorICAgIC8vIGNhdGNoIGFsbAorICBlbmQ7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsIH0KKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuU2V0U2VydmVyKCBjb25zdCBBU2VydmVyOiBJU2VydmVyKTsKK2JlZ2luCisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0Qnl0ZSh0aGluZzogU2hvcnRJbnQpOiBTaG9ydEludDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0Qnl0ZSgiJyArIEludFRvU3RyKCB0aGluZykgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3REb3VibGUoIGNvbnN0IHRoaW5nOiBEb3VibGUpOiBEb3VibGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdERvdWJsZSgiJyArIEZsb2F0VG9TdHIoIHRoaW5nICkgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RCaW5hcnkoY29uc3QgdGhpbmc6IFRCeXRlcyk6IFRCeXRlczsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCInICsgQnl0ZXNUb0hleCggdGhpbmcgKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEVudW0odGhpbmc6IFROdW1iZXJ6KTogVE51bWJlcno7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEVudW0oJyArIEludFRvU3RyKCBJbnRlZ2VyKCB0aGluZykpICsgJyknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0RXhjZXB0aW9uKGNvbnN0IGFyZzogc3RyaW5nKTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0RXhjZXB0aW9uKCcgKyBhcmcgKyAnKScpOworICBpZiAoIGFyZyA9ICdYY2VwdGlvbicpIHRoZW4KKyAgYmVnaW4KKyAgICByYWlzZSBUWGNlcHRpb24uQ3JlYXRlKCAxMDAxLCBhcmcpOworICBlbmQ7CisKKyAgaWYgKGFyZyA9ICdURXhjZXB0aW9uJykgdGhlbgorICBiZWdpbgorICAgIHJhaXNlIFRFeGNlcHRpb24uQ3JlYXRlKCdURXhjZXB0aW9uJyk7CisgIGVuZDsKKworICAvLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RJMzIodGhpbmc6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RJMzIoIicgKyBJbnRUb1N0ciggdGhpbmcpICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0STY0KCBjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0STY0KCInICsgSW50VG9TdHIoIHRoaW5nKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEluc2FuaXR5KAorICBjb25zdCBhcmd1bWVudDogSUluc2FuaXR5KTogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKK3ZhcgorICBsb29uZXkgOiBJSW5zYW5pdHk7CisgIGZpcnN0X21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBzZWNvbmRfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIGluc2FuZSA6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47CisKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0SW5zYW5pdHkoKScpOworCisgICgqKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICopCisKKyAgZmlyc3RfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CisgIHNlY29uZF9tYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFROdW1iZXJ6LCBJSW5zYW5pdHk+LkNyZWF0ZTsKKworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgIGZpcnN0X21hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOworCisgIGxvb25leSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKKyAgc2Vjb25kX21hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5TSVgsIGxvb25leSk7CisKKyAgaW5zYW5lIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+LkNyZWF0ZTsKKworICBpbnNhbmUuQWRkT3JTZXRWYWx1ZSggMSwgZmlyc3RfbWFwKTsKKyAgaW5zYW5lLkFkZE9yU2V0VmFsdWUoIDIsIHNlY29uZF9tYXApOworCisgIFJlc3VsdCA6PSBpbnNhbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdExpc3QoCisgIGNvbnN0IHRoaW5nOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPik6IElUaHJpZnRMaXN0PEludGVnZXI+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAgZWxlbSA6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0TGlzdCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBlbGVtIGluIHRoaW5nIGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QgdGhlbgorICAgIGJlZ2luCisgICAgICBmaXJzdCA6PSBGYWxzZTsKKyAgICBlbmQgZWxzZQorICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCcsICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggZWxlbSkpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE1hcCgKKyAgY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+KTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47Cit2YXIKKyAgZmlyc3QgOiBCb29sZWFuOworICBrZXkgOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZSgndGVzdE1hcCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBrZXkgaW4gdGhpbmcuS2V5cyBkbworICBiZWdpbgorICAgIGlmIChmaXJzdCkgdGhlbgorICAgIGJlZ2luCisgICAgICBmaXJzdCA6PSBmYWxzZTsKKyAgICBlbmQgZWxzZQorICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCcsICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKEludFRvU3RyKGtleSkgKyAnID0+ICcgKyBJbnRUb1N0ciggdGhpbmdba2V5XSkpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuVGVzdE1hcE1hcCgKKyAgaGVsbG86IEludGVnZXIpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj47Cit2YXIKKyAgbWFwbWFwIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+OworICBwb3MgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgbmVnIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RNYXBNYXAoJyArIEludFRvU3RyKCBoZWxsbykgKyAnKScpOworICBtYXBtYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+Pi5DcmVhdGU7CisgIHBvcyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50ZWdlciwgSW50ZWdlcj4uQ3JlYXRlOworICBuZWcgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsIEludGVnZXI+LkNyZWF0ZTsKKworICBmb3IgaSA6PSAxIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBwb3MuQWRkT3JTZXRWYWx1ZSggaSwgaSk7CisgICAgbmVnLkFkZE9yU2V0VmFsdWUoIC1pLCAtaSk7CisgIGVuZDsKKworICBtYXBtYXAuQWRkT3JTZXRWYWx1ZSg0LCBwb3MpOworICBtYXBtYXAuQWRkT3JTZXRWYWx1ZSggLTQsIG5lZyk7CisKKyAgUmVzdWx0IDo9IG1hcG1hcDsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0TXVsdGkoYXJnMDogU2hvcnRJbnQ7IGFyZzE6IEludGVnZXI7CisgIGNvbnN0IGFyZzI6IEludDY0OyBjb25zdCBhcmczOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsKKyAgYXJnNDogVE51bWJlcno7IGNvbnN0IGFyZzU6IEludDY0KTogSVh0cnVjdDsKK3ZhcgorICBoZWxsbyA6IElYdHJ1Y3Q7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdE11bHRpKCknKTsKKyAgaGVsbG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICBoZWxsby5TdHJpbmdfdGhpbmcgOj0gJ0hlbGxvMic7CisgIGhlbGxvLkJ5dGVfdGhpbmcgOj0gYXJnMDsKKyAgaGVsbG8uSTMyX3RoaW5nIDo9IGFyZzE7CisgIGhlbGxvLkk2NF90aGluZyA6PSBhcmcyOworICBSZXN1bHQgOj0gaGVsbG87CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE11bHRpRXhjZXB0aW9uKCBjb25zdCBhcmcwLCBhcmcxOiBzdHJpbmcpOiBJWHRydWN0OwordmFyCisgIHgyIDogVFhjZXB0aW9uMjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7CisgIGlmICggYXJnMCA9ICdYY2VwdGlvbicpIHRoZW4KKyAgYmVnaW4KKyAgICByYWlzZSBUWGNlcHRpb24uQ3JlYXRlKCAxMDAxLCAnVGhpcyBpcyBhbiBYY2VwdGlvbicpOyAgLy8gdGVzdCB0aGUgbmV3IHJpY2ggQ1RPUgorICBlbmQgZWxzZQorICBpZiAoIGFyZzAgPSAnWGNlcHRpb24yJykgdGhlbgorICBiZWdpbgorICAgIHgyIDo9IFRYY2VwdGlvbjIuQ3JlYXRlOyAgLy8gdGhlIG9sZCB3YXkgc3RpbGwgd29ya3MgdG9vPworICAgIHgyLkVycm9yQ29kZSA6PSAyMDAyOworICAgIHgyLlN0cnVjdF90aGluZyA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgICAgeDIuU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA6PSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgIHgyLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKKyAgICByYWlzZSB4MjsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgIFJlc3VsdC5TdHJpbmdfdGhpbmcgOj0gYXJnMTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0TmVzdCggY29uc3QgdGhpbmc6IElYdHJ1Y3QyKTogSVh0cnVjdDI7Cit2YXIKKyAgdGVtcCA6IElYdHJ1Y3Q7CitiZWdpbgorICB0ZW1wIDo9IHRoaW5nLlN0cnVjdF90aGluZzsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3ROZXN0KHsnICsKKyAgICAgICAgIEludFRvU3RyKCB0aGluZy5CeXRlX3RoaW5nKSArICcsIHsnICsKKyAgICAgICAgICciJyArIHRlbXAuU3RyaW5nX3RoaW5nICsgJyIsICcgKworICAgICAgICAgSW50VG9TdHIoIHRlbXAuQnl0ZV90aGluZykgKyAnLCAnICsKKyAgICAgICAgIEludFRvU3RyKCB0ZW1wLkkzMl90aGluZykgKyAnLCAnICsKKyAgICAgICAgIEludFRvU3RyKCB0ZW1wLkk2NF90aGluZykgKyAnfSwgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5JMzJfdGhpbmcpICsgJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDogSW50ZWdlcik7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdE9uZXdheSgnICsgSW50VG9TdHIoIHNlY29uZHNUb1NsZWVwICkrICcpLCBzbGVlcGluZy4uLicpOworICBTbGVlcChzZWNvbmRzVG9TbGVlcCAqIDEwMDApOworICBDb25zb2xlLldyaXRlTGluZSgndGVzdE9uZXdheSBmaW5pc2hlZCcpOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTZXQoCisgIGNvbnN0IHRoaW5nOiBJSGFzaFNldDxJbnRlZ2VyPik6SUhhc2hTZXQ8SW50ZWdlcj47Cit2YXIKKyAgZmlyc3QgOiBCb29sZWFuOworICBlbGVtIDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RTZXQoeycpOworICBmaXJzdCA6PSBUcnVlOworCisgIGZvciBlbGVtIGluIHRoaW5nIGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QgdGhlbgorICAgIGJlZ2luCisgICAgICBmaXJzdCA6PSBGYWxzZTsKKyAgICBlbmQgZWxzZQorICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCAnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGVsZW0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RvcDsKK2JlZ2luCisgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KKyAgYmVnaW4KKyAgICBGU2VydmVyLlN0b3A7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0Qm9vbCh0aGluZzogQm9vbGVhbik6IEJvb2xlYW47CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJvb2woJyArIEJvb2xUb1N0cih0aGluZyx0cnVlKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RyaW5nKCBjb25zdCB0aGluZzogc3RyaW5nKTogc3RyaW5nOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RzdHJpbmcoIicgKyB0aGluZyArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0cmluZ01hcCgKKyAgY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPik6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPjsKK3ZhcgorICBmaXJzdCA6IEJvb2xlYW47CisgIGtleSA6IHN0cmluZzsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RTdHJpbmdNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Iga2V5IGluIHRoaW5nLktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiAoZmlyc3QpIHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gZmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAnID0+ICcgKyB0aGluZ1trZXldKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RUeXBlZGVmKCBjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0VHlwZWRlZignICsgSW50VG9TdHIoIHRoaW5nKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuVGVzdFZvaWQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdFZvaWQoKScpOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTdHJ1Y3QoIGNvbnN0IHRoaW5nOiBJWHRydWN0KTogSVh0cnVjdDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0U3RydWN0KHsnICsKKyAgICAnIicgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAnIiwgJyArCisgICAgICBJbnRUb1N0ciggdGhpbmcuQnl0ZV90aGluZykgKyAnLCAnICsKKyAgICAgIEludFRvU3RyKCB0aGluZy5JMzJfdGhpbmcpICsgJywgJyArCisgICAgICBJbnRUb1N0ciggdGhpbmcuSTY0X3RoaW5nKSk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyIH0KKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuUHJpbnRDbWRMaW5lSGVscDsKK2NvbnN0IEhFTFBURVhUID0gJyBbb3B0aW9uc10nIzEwCisgICAgICAgICAgICAgICArICMxMAorICAgICAgICAgICAgICAgKyAnQWxsb3dlZCBvcHRpb25zOicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSknIzEwCisgICAgICAgICAgICAgICArICcgIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwgInNpbXBsZSIsICJ0aHJlYWQtcG9vbCIsJyMxMAorICAgICAgICAgICAgICAgKyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZGVkIiwgb3IgIm5vbmJsb2NraW5nIicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0KSAgIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgYW5vbnBpcGUnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzJyMxMAorICAgICAgICAgICAgICAgKyAnICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvcicjMTAKKyAgICAgICAgICAgICAgICsgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlJyMxMAorICAgICAgICAgICAgICAgOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoIENoYW5nZUZpbGVFeHQoRXh0cmFjdEZpbGVOYW1lKFBhcmFtU3RyKDApKSwnJykgKyBIRUxQVEVYVCk7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5JbnZhbGlkQXJnczsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBhcmdzLicpOworICBDb25zb2xlLldyaXRlTGluZSggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArICcgLWggZm9yIG1vcmUgaW5mb3JtYXRpb24nKTsKKyAgQWJvcnQ7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5MYXVuY2hBbm9uUGlwZUNoaWxkKCBjb25zdCBhcHAgOiBzdHJpbmc7IGNvbnN0IHRyYW5zcG9ydCA6IElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0KTsKKy8vTGF1bmNoIGNoaWxkIHByb2Nlc3MgYW5kIHBhc3MgUi9XIGFub255bW91cyBwaXBlIGhhbmRsZXMgb24gY21kIGxpbmUuCisvL1RoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlbGV2YXRpb24gb3Igb3RoZXIKKy8vYWR2YW5jZWQgZmVhdHVyZXMuCit2YXIgcGkgOiBQUk9DRVNTX0lORk9STUFUSU9OOworICAgICAgICBzaSA6IFNUQVJUVVBJTkZPOworICAgICAgICBzQXJnLCBzSGFuZGxlcywgc0NtZExpbmUgOiBzdHJpbmc7CisgICAgaSA6IEludGVnZXI7CitiZWdpbgorICBHZXRTdGFydHVwSW5mbyggc2kpOyAgLy9zZXQgc3RhcnR1cGluZm8gZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3MKKworICAvLyBwcmVmb3JtYXQgaGFuZGxlcyBhcmdzCisgIHNIYW5kbGVzIDo9IEZvcm1hdCggJyVkICVkJywKKyAgICAgICAgICAgICAgICAgICAgWyBJbnRlZ2VyKHRyYW5zcG9ydC5DbGllbnRBbm9uUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcih0cmFuc3BvcnQuQ2xpZW50QW5vbldyaXRlKV0pOworCisgIC8vIHBhc3MgYWxsIHNldHRpbmdzIHRvIGNsaWVudAorICBzQ21kTGluZSA6PSBhcHA7CisgIGZvciBpIDo9IDEgdG8gUGFyYW1Db3VudCBkbyBiZWdpbgorICAgIHNBcmcgOj0gUGFyYW1TdHIoaSk7CisKKyAgICAvLyBhZGQgYW5vbnltb3VzIGhhbmRsZXMgYW5kIHF1b3RlIHN0cmluZ3Mgd2hlcmUgYXBwcm9wcmlhdGUKKyAgICBpZiBzQXJnID0gJy1hbm9uJworICAgIHRoZW4gc0FyZyA6PSBzQXJnICsnICcrIHNIYW5kbGVzCisgICAgZWxzZSBiZWdpbgorICAgICAgaWYgUG9zKCcgJyxzQXJnKSA+IDAKKyAgICAgIHRoZW4gc0FyZyA6PSAnIicrc0FyZysnIic7CisgICAgZW5kOzsKKworICAgIHNDbWRMaW5lIDo9IHNDbWRMaW5lICsnICcrIHNBcmc7CisgIGVuZDsKKworICAvLyBzcGF3biB0aGUgY2hpbGQgcHJvY2VzcworICBDb25zb2xlLldyaXRlTGluZSgnU3RhcnRpbmcgY2xpZW50ICcrc0NtZExpbmUpOworICBXaW4zMkNoZWNrKCBDcmVhdGVQcm9jZXNzKCBuaWwsIFBDaGFyKHNDbWRMaW5lKSwgbmlsLG5pbCxUUlVFLDAsbmlsLG5pbCxzaSxwaSkpOworCisgIENsb3NlSGFuZGxlKCBwaS5oVGhyZWFkKTsKKyAgICBDbG9zZUhhbmRsZSggcGkuaFByb2Nlc3MpOworZW5kOworCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5FeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwordmFyCisgIFBvcnQgOiBJbnRlZ2VyOworICBTZXJ2ZXJFdmVudHMgOiBCb29sZWFuOworICBzUGlwZU5hbWUgOiBzdHJpbmc7CisgIHRlc3RIYW5kbGVyIDogSVRlc3RIYW5kbGVyOworICB0ZXN0UHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKKyAgU2VydmVyVHJhbnMgOiBJU2VydmVyVHJhbnNwb3J0OworICBTZXJ2ZXJFbmdpbmUgOiBJU2VydmVyOworICBhbm9ueW1vdXNwaXBlIDogSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQ7CisgIG5hbWVkcGlwZSA6IElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQ7CisgIFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgUHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgaSwgbnVtV29ya2VyIDogSW50ZWdlcjsKKyAgcyA6IHN0cmluZzsKKyAgcHJvdFR5cGUgOiBUS25vd25Qcm90b2NvbDsKKyAgc2VydmVydHlwZSA6IFRTZXJ2ZXJUeXBlOworICBlbmRwb2ludCA6IFRFbmRwb2ludFRyYW5zcG9ydDsKKyAgbGF5ZXJlZCA6IFRMYXllcmVkVHJhbnNwb3J0czsKKyAgVXNlU1NMIDogQm9vbGVhbjsgLy8gaW5jbHVkZSB3aGVyZSBhcHByb3ByaWF0ZSAoVExheWVyZWRUcmFuc3BvcnQ/KQorYmVnaW4KKyAgdHJ5CisgICAgU2VydmVyRXZlbnRzIDo9IEZBTFNFOworICAgIHByb3RUeXBlIDo9IHByb3RfQmluYXJ5OworICAgIHNlcnZlcnR5cGUgOj0gc3J2X1NpbXBsZTsKKyAgICBlbmRwb2ludCA6PSB0cm5zX1NvY2tldHM7CisgICAgbGF5ZXJlZCA6PSBbXTsKKyAgICBVc2VTU0wgOj0gRkFMU0U7CisgICAgUG9ydCA6PSA5MDkwOworICAgIHNQaXBlTmFtZSA6PSAnJzsKKyAgICBudW1Xb3JrZXIgOj0gNDsKKworICAgIGkgOj0gMDsKKyAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbyBiZWdpbgorICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgSW5jKGkpOworCisgICAgICAvLyBBbGxvd2VkIG9wdGlvbnM6CisgICAgICBpZiAocyA9ICctaCcpIG9yIChzID0gJy0taGVscCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAgIFByaW50Q21kTGluZUhlbHA7CisgICAgICAgIEV4aXQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1wb3J0JykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworICAgICAgICBQb3J0IDo9IFN0clRvSW50RGVmKCBzLCBQb3J0KTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLWRvbWFpbi1zb2NrZXQnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnZG9tYWluLXNvY2tldCBub3Qgc3VwcG9ydGVkJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1uYW1lZC1waXBlJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgICAgZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOworICAgICAgICBzUGlwZU5hbWUgOj0gYXJnc1tpXTsgIC8vIC1waXBlIDxuYW1lPgorICAgICAgICBJbmMoIGkgKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXNlcnZlci10eXBlJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsCisgICAgICAgIC8vIGFyZyA9ICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdzaW1wbGUnICAgICAgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9TaW1wbGUKKyAgICAgICAgZWxzZSBpZiBzID0gJ3RocmVhZC1wb29sJyB0aGVuIHNlcnZlcnR5cGUgOj0gc3J2X1RocmVhZHBvb2wKKyAgICAgICAgZWxzZSBpZiBzID0gJ3RocmVhZGVkJyAgICB0aGVuIHNlcnZlcnR5cGUgOj0gc3J2X1RocmVhZGVkCisgICAgICAgIGVsc2UgaWYgcyA9ICdub25ibG9ja2luZycgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9Ob25ibG9ja2luZworICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tdHJhbnNwb3J0JykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBsYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19GcmFtZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0h0dHAKKyAgICAgICAgZWxzZSBpZiBzID0gJ2Fub25waXBlJyB0aGVuIGVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1wcm90b2NvbCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoaSk7CisKKyAgICAgICAgaWYgICAgICBzID0gJ2JpbmFyeScgICB0aGVuIHByb3RUeXBlIDo9IHByb3RfQmluYXJ5CisgICAgICAgIGVsc2UgaWYgcyA9ICdjb21wYWN0JyAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0NvbXBhY3QKKyAgICAgICAgZWxzZSBpZiBzID0gJ2pzb24nICAgICB0aGVuIHByb3RUeXBlIDo9IHByb3RfSlNPTgorICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tc3NsJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXNzbCAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgICAgVXNlU1NMIDo9IFRSVUU7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1wcm9jZXNzb3ItZXZlbnRzJykgdGhlbiBiZWdpbgorICAgICAgICAgLy8gLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMKKyAgICAgICAgU2VydmVyRXZlbnRzIDo9IFRSVUU7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLW4nKSBvciAocyA9ICctLXdvcmtlcnMnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuCisgICAgICAgIC8vIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgbnVtV29ya2VyIDo9IFN0clRvSW50RGVmKHMsMCk7CisgICAgICAgIGlmIG51bVdvcmtlciA+IDAKKyAgICAgICAgdGhlbiBJbmMoaSkKKyAgICAgICAgZWxzZSBudW1Xb3JrZXIgOj0gNDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBJbnZhbGlkQXJnczsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKworICAgIENvbnNvbGUuV3JpdGVMaW5lKCdTZXJ2ZXIgY29uZmlndXJhdGlvbjogJyk7CisKKyAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAorICAgIGNhc2UgcHJvdFR5cGUgb2YKKyAgICAgIHByb3RfQmluYXJ5ICA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUoIEJJTkFSWV9TVFJJQ1RfUkVBRCwgQklOQVJZX1NUUklDVF9XUklURSk7CisgICAgICBwcm90X0pTT04gICAgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgICAgIHByb3RfQ29tcGFjdCA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICAgIGVsc2UKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBwcm90b2NvbCcpOworICAgIGVuZDsKKyAgICBBU1NFUlQoIFByb3RvY29sRmFjdG9yeSA8PiBuaWwpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCctICcrVEhSSUZUX1BST1RPQ09MU1twcm90VHlwZV0rJyBwcm90b2NvbCcpOworCisgICAgY2FzZSBlbmRwb2ludCBvZgorCisgICAgICB0cm5zX1NvY2tldHMgOiBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBzb2NrZXRzIChwb3J0ICcrSW50VG9TdHIocG9ydCkrJyknKTsKKyAgICAgICAgaWYgKHRybnNfQnVmZmVyZWQgaW4gbGF5ZXJlZCkgdGhlbiBDb25zb2xlLldyaXRlTGluZSgnLSBidWZmZXJlZCcpOworICAgICAgICBzZXJ2ZXJ0cmFucyA6PSBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIFBvcnQsIDAsICh0cm5zX0J1ZmZlcmVkIGluIGxheWVyZWQpKTsKKyAgICAgIGVuZDsKKworICAgICAgdHJuc19IdHRwIDogYmVnaW4KKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW2VuZHBvaW50XSsnIHNlcnZlciB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgICBlbmQ7CisKKyAgICAgIHRybnNfTmFtZWRQaXBlcyA6IGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIG5hbWVkIHBpcGUgKCcrc1BpcGVOYW1lKycpJyk7CisgICAgICAgIG5hbWVkcGlwZSAgIDo9IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggc1BpcGVOYW1lLCA0MDk2LCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpOworICAgICAgICBzZXJ2ZXJ0cmFucyA6PSBuYW1lZHBpcGU7CisgICAgICBlbmQ7CisKKyAgICAgIHRybnNfQW5vblBpcGVzIDogYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gYW5vbnltb3VzIHBpcGVzJyk7CisgICAgICAgIGFub255bW91c3BpcGUgOj0gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKKyAgICAgICAgc2VydmVydHJhbnMgICA6PSBhbm9ueW1vdXNwaXBlOworICAgICAgZW5kCisKKyAgICBlbHNlCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgZW5kcG9pbnQgdHJhbnNwb3J0Jyk7CisgICAgZW5kOworICAgIEFTU0VSVCggc2VydmVydHJhbnMgPD4gbmlsKTsKKworICAgIGlmIFVzZVNTTCB0aGVuIGJlZ2luCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgaWYgKHRybnNfRnJhbWVkIGluIGxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIGZyYW1lZCB0cmFuc3BvcnQnKTsKKyAgICAgIFRyYW5zcG9ydEZhY3RvcnkgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuVEZhY3RvcnkuQ3JlYXRlCisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgVHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICAgIGVuZDsKKyAgICBBU1NFUlQoIFRyYW5zcG9ydEZhY3RvcnkgPD4gbmlsKTsKKworICAgIHRlc3RIYW5kbGVyICAgOj0gVFRlc3RIYW5kbGVySW1wbC5DcmVhdGU7CisgICAgdGVzdFByb2Nlc3NvciA6PSBUVGhyaWZ0VGVzdC5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIHRlc3RIYW5kbGVyICk7CisKKyAgICBjYXNlIHNlcnZlcnR5cGUgb2YKKyAgICAgIHNydl9TaW1wbGUgICAgICA6IGJlZ2luCisgICAgICAgIFNlcnZlckVuZ2luZSA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggdGVzdFByb2Nlc3NvciwgU2VydmVyVHJhbnMsIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvY29sRmFjdG9yeSk7CisgICAgICBlbmQ7CisKKyAgICAgIHNydl9Ob25ibG9ja2luZyA6IGJlZ2luCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoU0VSVkVSX1RZUEVTW3NlcnZlcnR5cGVdKycgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgICBzcnZfVGhyZWFkcG9vbCwKKyAgICAgIHNydl9UaHJlYWRlZDogYmVnaW4KKyAgICAgICAgaWYgbnVtV29ya2VyID4gMSB0aGVuIHt1c2UgaGVyZX07CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoU0VSVkVSX1RZUEVTW3NlcnZlcnR5cGVdKycgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgZWxzZQorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHNlcnZlciB0eXBlJyk7CisgICAgZW5kOworICAgIEFTU0VSVCggU2VydmVyRW5naW5lIDw+IG5pbCk7CisKKyAgICB0ZXN0SGFuZGxlci5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CisKKyAgICAvLyB0ZXN0IGV2ZW50cz8KKyAgICBpZiBTZXJ2ZXJFdmVudHMgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gc2VydmVyIGV2ZW50cyB0ZXN0IGVuYWJsZWQnKTsKKyAgICAgIFNlcnZlckVuZ2luZS5TZXJ2ZXJFdmVudHMgOj0gVFNlcnZlckV2ZW50c0ltcGwuQ3JlYXRlOworICAgIGVuZDsKKworICAgIC8vIHN0YXJ0IHRoZSBjbGllbnQgbm93IHdoZW4gd2UgaGF2ZSB0aGUgYW5vbiBoYW5kbGVzLCBidXQgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzCisgICAgaWYgZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcworICAgIHRoZW4gTGF1bmNoQW5vblBpcGVDaGlsZCggRXh0cmFjdEZpbGVQYXRoKFBhcmFtU3RyKDApKSsnY2xpZW50LmV4ZScsIGFub255bW91c3BpcGUpOworCisgICAgLy8gaW5zdGFsbCBDdHJsK0MgaGFuZGxlciBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMKKyAgICBnX0hhbmRsZXIgOj0gdGVzdEhhbmRsZXI7CisgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKCBATXlDb25zb2xlRXZlbnRIYW5kbGVyLCBUUlVFKTsKKworICAgIENvbnNvbGUuV3JpdGVMaW5lKCcnKTsKKyAgICByZXBlYXQKKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdTdGFydGluZyB0aGUgc2VydmVyIC4uLicpOworICAgICAgc2VydmVyRW5naW5lLlNlcnZlOworICAgIHVudGlsIHskSUZERUYgUnVuRW5kbGVzc30gRkFMU0UgeyRFTFNFfSBUUlVFIHskRU5ESUZ9OworCisgICAgdGVzdEhhbmRsZXIuU2V0U2VydmVyKCBuaWwpOworICAgIGdfSGFuZGxlciA6PSBuaWw7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIHJhaXNlOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEUuTWVzc2FnZSArICMxMCArIEUuU3RhY2tUcmFjZSApOworICAgIGVuZDsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSggJ2RvbmUuJyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDhjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKQEAgLTAsMCArMSwxNzQgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0U2VydmVyRXZlbnRzOworCitpbnRlcmZhY2UKKwordXNlcworICBTeXNVdGlscywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5TZXJ2ZXIsCisgIENvbnNvbGVIZWxwZXI7CisKK3R5cGUKKyAgVFJlcXVlc3RFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUmVxdWVzdEV2ZW50cykKKyAgcHJvdGVjdGVkCisgICAgRlN0YXJ0IDogVERhdGVUaW1lOworICAgIC8vIElSZXF1ZXN0UHJvY2Vzc2luZ0V2ZW50cworICAgIHByb2NlZHVyZSBQcmVSZWFkOworICAgIHByb2NlZHVyZSBQb3N0UmVhZDsKKyAgICBwcm9jZWR1cmUgUHJlV3JpdGU7CisgICAgcHJvY2VkdXJlIFBvc3RXcml0ZTsKKyAgICBwcm9jZWR1cmUgT25ld2F5Q29tcGxldGU7CisgICAgcHJvY2VkdXJlIFVuaGFuZGxlZEVycm9yKCBjb25zdCBlIDogRXhjZXB0aW9uKTsKKyAgICBwcm9jZWR1cmUgQ2xlYW51cENvbnRleHQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgZW5kOworCisKKyAgVFByb2Nlc3NvckV2ZW50c0ltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm9jZXNzb3JFdmVudHMpCisgIHByb3RlY3RlZAorICAgIEZSZXFzIDogSW50ZWdlcjsKKyAgICAvLyBJUHJvY2Vzc29yRXZlbnRzCisgICAgcHJvY2VkdXJlIFByb2Nlc3NpbmcoIGNvbnN0IHRyYW5zcG9ydCA6IElUcmFuc3BvcnQpOworICAgIGZ1bmN0aW9uICBDcmVhdGVSZXF1ZXN0Q29udGV4dCggY29uc3QgYUZ1bmN0aW9uTmFtZSA6IHN0cmluZykgOiBJUmVxdWVzdEV2ZW50czsKKyAgICBwcm9jZWR1cmUgQ2xlYW51cENvbnRleHQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgZW5kOworCisKKyAgVFNlcnZlckV2ZW50c0ltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTZXJ2ZXJFdmVudHMpCisgIHByb3RlY3RlZAorICAgIC8vIElTZXJ2ZXJFdmVudHMKKyAgICBwcm9jZWR1cmUgUHJlU2VydmU7CisgICAgcHJvY2VkdXJlIFByZUFjY2VwdDsKKyAgICBmdW5jdGlvbiAgQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoIGNvbnN0IGlucHV0LCBvdXRwdXQgOiBJUHJvdG9jb2wpIDogSVByb2Nlc3NvckV2ZW50czsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVFNlcnZlckV2ZW50c0ltcGwgfQorCitwcm9jZWR1cmUgVFNlcnZlckV2ZW50c0ltcGwuUHJlU2VydmU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnU2VydmVyRXZlbnRzOiBTZXJ2ZXIgc3RhcnRpbmcgdG8gc2VydmUgcmVxdWVzdHMnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFNlcnZlckV2ZW50c0ltcGwuUHJlQWNjZXB0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1NlcnZlckV2ZW50czogU2VydmVyIHRyYW5zcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgaW5jb21pbmcgY2FsbHMnKTsKK2VuZDsKKworCitmdW5jdGlvbiBUU2VydmVyRXZlbnRzSW1wbC5DcmVhdGVQcm9jZXNzaW5nQ29udGV4dChjb25zdCBpbnB1dCwgb3V0cHV0OiBJUHJvdG9jb2wpOiBJUHJvY2Vzc29yRXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IFRQcm9jZXNzb3JFdmVudHNJbXBsLkNyZWF0ZTsKK2VuZDsKKworCit7IFRQcm9jZXNzb3JFdmVudHNJbXBsIH0KKworY29uc3RydWN0b3IgVFByb2Nlc3NvckV2ZW50c0ltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlJlcXMgOj0gMDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1Byb2Nlc3NvckV2ZW50czogQ2xpZW50IGNvbm5lY3RlZCwgcHJvY2Vzc2luZyBiZWdpbnMnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm9jZXNzb3JFdmVudHNJbXBsLlByb2Nlc3NpbmcoY29uc3QgdHJhbnNwb3J0OiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdQcm9jZXNzb3JFdmVudHM6IFByb2Nlc3Npbmcgb2YgaW5jb21pbmcgcmVxdWVzdCBiZWdpbnMnKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DcmVhdGVSZXF1ZXN0Q29udGV4dCggY29uc3QgYUZ1bmN0aW9uTmFtZTogc3RyaW5nKTogSVJlcXVlc3RFdmVudHM7CitiZWdpbgorICByZXN1bHQgOj0gVFJlcXVlc3RFdmVudHNJbXBsLkNyZWF0ZTsKKyAgSW5jKCBGUmVxcyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm9jZXNzb3JFdmVudHNJbXBsLkNsZWFudXBDb250ZXh0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdQcm9jZXNzb3JFdmVudHM6IGNvbXBsZXRlZCBhZnRlciBoYW5kbGluZyAnK0ludFRvU3RyKEZSZXFzKSsnIHJlcXVlc3RzLicpOworZW5kOworCisKK3sgVFJlcXVlc3RFdmVudHNJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUUmVxdWVzdEV2ZW50c0ltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0YXJ0IDo9IE5vdzsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IE5ldyByZXF1ZXN0Jyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5QcmVSZWFkOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFJlYWRpbmcgcmVxdWVzdCBtZXNzYWdlIC4uLicpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuUG9zdFJlYWQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogUmVhZGluZyByZXF1ZXN0IG1lc3NhZ2UgY29tcGxldGVkJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuUHJlV3JpdGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogV3JpdGluZyByZXNwb25zZSBtZXNzYWdlIC4uLicpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuUG9zdFdyaXRlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFdyaXRpbmcgcmVzcG9uc2UgbWVzc2FnZSBjb21wbGV0ZWQnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLk9uZXdheUNvbXBsZXRlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IE9uZXdheSBtZXNzYWdlIHByb2Nlc3NlZCcpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuVW5oYW5kbGVkRXJyb3IoY29uc3QgZTogRXhjZXB0aW9uKTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBVbmhhbmRsZWQgZXhjZXB0aW9uIG9mIHR5cGUgJytlLmNsYXNzbmFtZSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5DbGVhbnVwQ29udGV4dDsKK3ZhciBtaWxsaXMgOiBEb3VibGU7CitiZWdpbgorICBtaWxsaXMgOj0gKE5vdyAtIEZTdGFydCkgKiAoMjQqNjAqNjAqMTAwMCk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVxdWVzdCBwcm9jZXNzaW5nIGNvbXBsZXRlZCBpbiAnK0ludFRvU3RyKFJvdW5kKG1pbGxpcykpKycgbXMnKTsKK2VuZDsKKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwciBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZGJkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgpAQCAtMCwwICsxLDcyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKworcHJvZ3JhbSBjbGllbnQ7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUZXN0Q2xpZW50IGluICdUZXN0Q2xpZW50LnBhcycsCisgIFRocmlmdC5UZXN0LCAvLyBpbiAnZ2VuLWRlbHBoaVxUaHJpZnQuVGVzdC5wYXMnLAorICBUaHJpZnQgaW4gJy4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgVGVzdENsaWVudCAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8gYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisKKyAgICBFeGl0Q29kZSA6PSBUVGVzdENsaWVudC5FeGVjdXRlKCBhcmdzKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SRUFETUUubWQgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNDU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS5tZApAQCAtMCwwICsxLDI4IEBACitIb3cgdG8gdXNlIHRoZSB0ZXN0IGNhc2U6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistIGNvcHkgYW5kIHRoZSB0ZW1wbGF0ZSBiYXRjaCBmaWxlCistIG9wZW4gdGhlIGJhdGNoIGZpbGUgYW5kIGFkanVzdCBjb25maWd1cmF0aW9uIGFzIG5lY2Vzc2FyeQorLSBydW4gdGhlIGJhdGNoCisKKworQ29uZmlndXJhdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NWTldPUktESVIKK3Nob3VsZCBwb2ludCB0byB0aGUgVGhyaWZ0IHdvcmtpbmcgY29weSByb290CisKK01ZX1RIUklGVF9GSUxFUworY2FuIGJlIHNldCB0byBwb2ludCB0byBhIGZvbGRlciB3aXRoIG1vcmUgdGhyaWZ0IElETCBmaWxlcy4KK0lmIHlvdSBkb24ndCBoYXZlIGFueSBzdWNoIGZpbGVzLCBqdXN0IGxlYXZlIHRoZSBzZXR0aW5nIGJsYW5rLgorCitCSU4KK0xvY2FsIE1TWVMgYmluYXJ5IGZvbGRlci4gWW91ciBUSFJJRlQuRVhFIGlzIGluc3RhbGxlZCBoZXJlLgorCitNSU5HV19CSU4KK0xvY2FsIE1pbkdXIGJpbiBmb2xkZXIuIENvbnRhaW5zIERMTCBmaWxlcyByZXF1aXJlZCBieSBUSFJJRlQuRVhFCisKK0RDQworSWRlbnRpZmllcyB0aGUgRGVscGhpIENvbW1hbmQgTGluZSBjb21waWxlciAoZGNjMzIuZXhlKQorVG8gYmUgY29uZmlndWlyZWQgb25seSwgaWYgdGhlIGRlZmF1bHQgaXMgbm90IHN1aXRhYmxlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqRU9GKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbCBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmFiMGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsCkBAIC0wLDAgKzEsMTczIEBACitSRU0gLyoKK1JFTSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK1JFTSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitSRU0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorUkVNICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitSRU0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCitSRU0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCitSRU0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK1JFTSAqCitSRU0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorUkVNICoKK1JFTSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK1JFTSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCitSRU0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK1JFTSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitSRU0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCitSRU0gKiB1bmRlciB0aGUgTGljZW5zZS4KK1JFTSAqLworQGVjaG8gb2ZmCitpZiAiIj09IiUxIiBnb3RvIENPTkZJRworZ290byBIQU5ETEVESVIKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6Q09ORklHCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtICogQ09ORklHVVJBVElPTiBCRUdJTgorcmVtICogY29uZmlndXJhdGlvbiBzZXR0aW5ncywgYWRqdXN0IGFzIG5lY2Vzc2FyeSB0byBtZWV0IHlvdXIgc3lzdGVtIHNldHVwCitzZXQgU1ZOV09SS0RJUj0KK3NldCBNWV9USFJJRlRfRklMRVM9CitzZXQgQklOPUM6XE1TeXMxMFxsb2NhbFxiaW4KK3NldCBNSU5HV19CSU49QzpcTWluR1dcYmluCitzZXQgRENDPQorc2V0IFNVQkRJUj1nZW4tZGVscGhpCityZW0gKiBDT05GSUdVUkFUSU9OIEVORAorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOlNUQVJUCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtICogY29uZmlndXJlZD8KK2lmICIlU1ZOV09SS0RJUiUiPT0iIiBnb3RvIENPTkZJR19FUlJPUgorCityZW0gKiB0cnkgdG8gZmluZCBkY2MzMi5leGUKK2VjaG8gTG9va2luZyBmb3IgZGNjMzIuZXhlIC4uLgoraWYgbm90IGV4aXN0ICIlRENDJSIgc2V0IERDQz0lUHJvZ3JhbUZpbGVzJVxFbWJhcmNhZGVyb1xSQUQgU3R1ZGlvXDguMFxiaW5cZGNjMzIuZXhlCitpZiBub3QgZXhpc3QgIiVEQ0MlIiBzZXQgRENDPSVQcm9ncmFtRmlsZXMoeDg2KSVcRW1iYXJjYWRlcm9cUkFEIFN0dWRpb1w4LjBcYmluXGRjYzMyLmV4ZQoraWYgbm90IGV4aXN0ICIlRENDJSIgZ290byBDT05GSUdfRVJST1IKK2VjaG8gRm91bmQgJURDQyUKK2VjaG8uCisKK3JlbSAqIHNvbWUgaGVscGVycworc2V0IFBBVEg9JUJJTiU7JU1JTkdXX0JJTiU7JVBBVEglCitzZXQgVEFSR0VUPSVTVk5XT1JLRElSJVwuLlx0aHJpZnQtdGVzdGluZworc2V0IFNPVVJDRT0lU1ZOV09SS0RJUiUKK3NldCBURVNUQVBQPVRlc3RQcm9qZWN0CitzZXQgVU5JVFNFQVJDSD0lU09VUkNFJVxsaWJccGFzXHNyYzslU09VUkNFJVxsaWJcZGVscGhpXHNyYworc2V0IE9VVERDVT0iJVRBUkdFVCVcZGN1Igorc2V0IExPR0ZJTEU9JVRBUkdFVCVcJVNVQkRJUiVcY29kZWdlbi5sb2cKKworcmVtICogY3JlYXRlIGFuZC9vciBlbXB0eSB0YXJnZXQgZGlycworaWYgbm90IGV4aXN0ICIlVEFSR0VUJSIgICAgICAgICAgIG1kICIlVEFSR0VUJSIKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiUiICBtZCAiJVRBUkdFVCVcJVNVQkRJUiUiCitpZiBub3QgZXhpc3QgIiVPVVREQ1UlIiAgICAgICAgICAgbWQgIiVPVVREQ1UlIgoraWYgZXhpc3QgIiVUQVJHRVQlXCoudGhyaWZ0IiAgICAgIGRlbCAiJVRBUkdFVCVcKi50aHJpZnQiICAgICAgIC9RCitpZiBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcKi4qIiAgZGVsICIlVEFSR0VUJVwlU1VCRElSJVwqLioiICAgL1EKK2lmIGV4aXN0ICIlT1VURENVJVwqLioiICAgICAgICAgICBkZWwgIiVPVVREQ1UlXCouKiIgICAgICAgICAgICAvUQorCityZW0gKiByZWN1cnNlIHRocm91Z2ggdGhyaWZ0IFdDIGFuZCAibXkgdGhyaWZ0IGZpbGVzIiBmb2xkZXIKK3JlbSAqIGNvcGllcyBhbGwgLnRocmlmdCBmaWxlcyBpbnRvIHRocmlmdC10ZXN0aW5nCitjYWxsICUwICVTT1VSQ0UlCitpZiBub3QgIiVNWV9USFJJRlRfRklMRVMlIj09IiIgY2FsbCAlMCAlTVlfVEhSSUZUX0ZJTEVTJQorCityZW0gKiBjb21waWxlIGFsbCB0aHJpZnQgZmlsZXMsIGdlbmVyYXRlIFBBUyBhbmQgQysrIGNvZGUKK2VjaG8uCitlY2hvIEdlbmVyYXRpbmcgY29kZSwgcGxlYXNlIHdhaXQgLi4uCitjZCAiJVRBUkdFVCUiCitmb3IgJSVhIGluICgqLnRocmlmdCkgZG8gIiVCSU4lXHRocmlmdC5leGUiIC12IC0tZ2VuIGRlbHBoaTpyZWdpc3Rlcl90eXBlcyxjb25zdHByZWZpeCxldmVudHMseG1sZG9jICIlJWEiIDI+PiAiJUxPR0ZJTEUlIgorUkVNICogZm9yICUlYSBpbiAoKi50aHJpZnQpIGRvICIlQklOJVx0aHJpZnQuZXhlIiAtdiAtLWdlbiBjcHAgIiUlYSIgPj4gTlVMOgorY21kIC9jIHN0YXJ0IG5vdGVwYWQgIiVMT0dGSUxFJSIKK2NkIC4uCisKK3JlbSAqIGNoZWNrIGZvciBzcGVjaWFsIERlbHBoaSB0ZXN0Y2FzZXMgYmVpbmcgcHJvY2Vzc2VkCitpZiBub3QgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlXFJlc2VydmVkS2V5d29yZHMucGFzIiBnb3RvIFRFU1RDQVNFX01JU1NJTkcKKworCityZW0gKiBnZW5lcmF0ZSBhIG1pbmltYWwgRFBSIGZpbGUgdGhhdCB1c2VzIGFsbCBnZW5lcmF0ZWQgcGFzY2FsIHVuaXRzCitjZCAiJVRBUkdFVCVcJVNVQkRJUiVcIgoraWYgZXhpc3QgaW5oZXJpdGVkLiogIHJlbiBpbmhlcml0ZWQuKiAgX2luaGVyaXRlZC4qCitlY2hvIHByb2dyYW0gJVRFU1RBUFAlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICVURVNUQVBQJS5kcHIKK2VjaG8geyRBUFBUWVBFIENPTlNPTEV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNoby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvIHVzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2ZvciAlJWEgaW4gKCoucGFzKSBkbyBlY2hvICAgJSV+bmEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyAgIFdpbmRvd3MsIENsYXNzZXMsIFN5c1V0aWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyAgIFdyaXRlbG4oJ1N1Y2Nlc3NmdWxseSBjb21waWxlZCEnKTsgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV3JpdGVsbignTGlzdCBvZiB1bml0czonKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2ZvciAlJWEgaW4gKCoucGFzKSBkbyBlY2hvICAgV3JpdGUoJyUlfm5hJzozMCwnJzoxMCk7ICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyAgIFdyaXRlbG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvIGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorY2QgLi5cLi4KKworcmVtICogdHJ5IHRvIGNvbXBpbGUgdGhlIERQUgorcmVtICogdGhpcyBzaG91bGQgbm90IHRocm93IGFueSBlcnJvcnMsIHdhcm5pbmdzIG9yIGhpbnRzCisiJURDQyUiICAtQiAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlIiAtVSIlVU5JVFNFQVJDSCUiIC1JIiVVTklUU0VBUkNIJSIgLU4iJU9VVERDVSUiIC1FIiVUQVJHRVQlXCVTVUJESVIlIgorZGlyICIlVEFSR0VUJVwlU1VCRElSJVwlVEVTVEFQUCUuZXhlIgoraWYgbm90IGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJVwlVEVTVEFQUCUuZXhlIiAgZ290byBDT0RFR0VOX0ZBSUxFRAorZWNoby4KK2VjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gVGhlIGNvbXBpbGVkIHByb2dyYW0gaXMgbm93IGV4ZWN1dGVkLiBJZiBpdCBoYW5ncyBvciBjcmFzaGVzLCB3ZQorZWNobyBoYXZlIGEgc2VyaW91cyBwcm9ibGVtIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlLiBFeHBlY3RlZCBvdXRwdXQKK2VjaG8gaXMgIlN1Y2Nlc3NmdWxseSBjb21waWxlZDoiIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBnZW5lcmF0ZWQgdW5pdHMuCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIKK2VjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8uCitwYXVzZQorR09UTyBFT0YKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6RFhFX05PVF9GT1VORAorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIERlbHBoaSBDb21waWxlciAoZGNjMzIuZXhlKSBub3QgZm91bmQuCitlY2hvIFBsZWFzZSBjaGVjayB0aGUgIkRDQyIgc2V0dGluZyBpbiB0aGlzIGJhdGNoLgorZWNoby4KK2NtZCAvYyBzdGFydCBub3RlcGFkIFJFQURNRS5NRAorY21kIC9jIHN0YXJ0IG5vdGVwYWQgJTAKK3BhdXNlCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkNPTkZJR19FUlJPUgorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIE1pc3NpbmcsIGluY29tcGxldGUgb3Igd3JvbmcgY29uZmlndXJhdGlvbiBzZXR0aW5ncyEKK2NtZCAvYyBzdGFydCBub3RlcGFkIFJFQURNRS5NRAorY21kIC9jIHN0YXJ0IG5vdGVwYWQgJTAKK3BhdXNlCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOlRFU1RDQVNFX01JU1NJTkcKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBNaXNzaW5nIGFuIGV4cGVjdGVkIERlbHBoaSB0ZXN0Y2FzZSEKK3BhdXNlCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkNPREVHRU5fRkFJTEVECitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gQ29kZSBnZW5lcmF0aW9uIEZBSUxFRCEKK3BhdXNlCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkhBTkRMRURJUgorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRU0gZWNobyAlMQorZm9yIC9EICUlYSBpbiAoJTFcKikgZG8gY2FsbCAlMCAlJWEKK2lmIGV4aXN0ICIlMVwqLnRocmlmdCIgICBjb3B5IC9iICIlMVwqLnRocmlmdCIgIiVUQVJHRVQlXCouKiIKK0dPVE8gRU9GCisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6RU9GCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ3YTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcworbmFtZXNwYWNlIGRlbHBoaSBTeXNVdGlscworCitjb25zdCBpMzIgaW50ZWdlciA9IDQyCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIKQEAgLTAsMCArMSwxNSBAQAorcHJvZ3JhbSBSZXNlcnZlZEtleXdvcmRzOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywgU3lzdGVtXzsKKworYmVnaW4KKyAgdHJ5CisgICAgeyBUT0RPIC1vVXNlciAtY0NvbnNvbGUgTWFpbiA6IENvZGUgaGllciBlaW5m/GdlbiB9CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2ogYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKQEAgLTAsMCArMSwxMTIgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+e0YyRTlCNkZDLUE5MzEtNDI3MS04RTMwLTVBNEU0MDI0ODFCNH08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+UmVzZXJ2ZWRLZXl3b3Jkcy5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRTZWFyY2hQYXRoPmdlbi1kZWxwaGk7Li5cLi5cc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcmVCdWlsZEV2ZW50PjwhW0NEQVRBW3RocmlmdCAtciAgLWdlbiBkZWxwaGkgUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnRdXT48L1ByZUJ1aWxkRXZlbnQ+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMxPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPlJlc2VydmVkS2V5d29yZHMuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCituYW1lc3BhY2UgZGVscGhpIFN5c3RlbQorCitpbmNsdWRlICJSZXNlcnZlZEluY2x1ZGVkLnRocmlmdCIKKworCit0eXBlZGVmIGkzMiBDYXJkaW5hbAordHlwZWRlZiBzdHJpbmcgbWVzc2FnZQordHlwZWRlZiBsaXN0PCBtYXA8IENhcmRpbmFsLCBtZXNzYWdlPj4gcHJvZ3JhbQorCitzdHJ1Y3QgdW5pdCB7CisgIDE6IENhcmRpbmFsIGRvd250bzsKKyAgMjogcHJvZ3JhbSBwcm9jZWR1cmU7Cit9CisKK3R5cGVkZWYgc2V0PCB1bml0PiB1bml0cworCitleGNlcHRpb24gZXhjZXB0aW9uMSB7CisgIDE6IHByb2dyYW0gbWVzc2FnZTsKKyAgMjogdW5pdCBhcnJheTsKK30KKworc2VydmljZSBjb25zdHJ1Y3RvciB7CisgIHVuaXQgQ3JlYXRlKDE6IENhcmRpbmFsIGFzbTsgMjogbWVzc2FnZSBpbmhlcml0ZWQpIHRocm93cyAoMTogZXhjZXB0aW9uMSBsYWJlbCk7CisgIHVuaXRzIERlc3Ryb3koKTsKK30KKworY29uc3QgQ2FyZGluYWwgZG93bnRvID0gKzEKK2NvbnN0IENhcmRpbmFsIHB1Ymxpc2hlZCA9IC0xCisKK2VudW0ga2V5d29yZHMgeworICByZWNvcmQgPSAxLAorICByZXBlYXQgPSAyLAorICBkZXByZWNhdGVkID0gMworfQorCisKK3N0cnVjdCBTdHJ1Y3RfbGlzdHMgeworICAxOiBsaXN0PFN0cnVjdF9zaW1wbGU+IGluaXQ7CisgIDI6IGxpc3Q8U3RydWN0X3NpbXBsZT4gc3RydWM7CisgIDM6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGQ7CisgIDQ6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGRfOworICA1OiBsaXN0PFN0cnVjdF9zaW1wbGU+IHRyYWNrZXI7CisgIDY6IGxpc3Q8U3RydWN0X3NpbXBsZT4gU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zdHJ1Y3RzIHsKKyAgMTogU3RydWN0X3NpbXBsZSBpbml0OworICAyOiBTdHJ1Y3Rfc2ltcGxlIHN0cnVjOworICAzOiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkOworICA0OiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkXzsKKyAgNTogU3RydWN0X3NpbXBsZSB0cmFja2VyOworICA2OiBTdHJ1Y3Rfc2ltcGxlIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc2ltcGxlIHsKKyAgMTogYm9vbCBpbml0OworICAyOiBib29sIHN0cnVjOworICAzOiBib29sIGZpZWxkOworICA0OiBib29sIGZpZWxkXzsKKyAgNTogYm9vbCB0cmFja2VyOworICA2OiBib29sIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RyaW5ncyB7CisgIDE6IHN0cmluZyBpbml0OworICAyOiBzdHJpbmcgc3RydWM7CisgIDM6IHN0cmluZyBmaWVsZDsKKyAgNDogc3RyaW5nIGZpZWxkXzsKKyAgNTogc3RyaW5nIHRyYWNrZXI7CisgIDY6IHN0cmluZyBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X2JpbmFyeSB7CisgIDE6IGJpbmFyeSBpbml0OworICAyOiBiaW5hcnkgc3RydWM7CisgIDM6IGJpbmFyeSBmaWVsZDsKKyAgNDogYmluYXJ5IGZpZWxkXzsKKyAgNTogYmluYXJ5IHRyYWNrZXI7CisgIDY6IGJpbmFyeSBTZWxmOworfQorCisKK3R5cGVkZWYgaTMyIElQcm90b2NvbCAKK3R5cGVkZWYgaTMyIElUcmFuc3BvcnQKK3R5cGVkZWYgaTMyIElGYWNlCit0eXBlZGVmIGkzMiBJQXN5bmMKK3R5cGVkZWYgaTMyIFN5c3RlbQordHlwZWRlZiBpMzIgU3lzVXRpbHMKK3R5cGVkZWYgaTMyIEdlbmVyaWNzCit0eXBlZGVmIGkzMiBUaHJpZnQKKworc3RydWN0IFN0cnVjdF9UaHJpZnRfTmFtZXMgeworICAxOiBJUHJvdG9jb2wgICBJUHJvdG9jb2wKKyAgMjogSVRyYW5zcG9ydCAgSVRyYW5zcG9ydAorICAzOiBJRmFjZSAgICAgICBJRmFjZQorICA0OiBJQXN5bmMgICAgICBJQXN5bmMKKyAgNTogU3lzdGVtICAgICAgU3lzdGVtCisgIDY6IFN5c1V0aWxzICAgIFN5c1V0aWxzCisgIDc6IEdlbmVyaWNzICAgIEdlbmVyaWNzCisgIDg6IFRocmlmdCAgICAgIFRocmlmdAorfQorCisKK2VudW0gVGhyaWZ0NDU1NF9FbnVtIHsKKyAgRm9vID0gMCwKKyAgQmFyID0gMSwKKyAgQmF6ID0gMiwKK30KKworc3RydWN0IFRocmlmdDQ1NTRfU3RydWN0IHsKKyAgMSA6IG9wdGlvbmFsIGRvdWJsZSBNaW5WYWx1ZQorICAyIDogb3B0aW9uYWwgZG91YmxlIE1heFZhbHVlCisgIDMgOiBvcHRpb25hbCBib29sIEludGVnZXIgIC8vIGNhdXNlcyBpc3N1ZQorICA0IDogb3B0aW9uYWwgVGhyaWZ0NDU1NF9FbnVtIEZvbworfQorCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L21ha2V0ZXN0LnNoIGIvbGliL2RlbHBoaS90ZXN0L21ha2V0ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmMDYzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbWFrZXRlc3Quc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGRlbHBoaSAtbyAuIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZkZjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKQEAgLTAsMCArMSwxMzEgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBNdWx0aXBsZXguQ2xpZW50Lk1haW47CisKK3suJERFRklORSBTdHJlc3NUZXN0fSAgIC8vIGFjdGl2YXRlIHRvIHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgd2l0aCBmcmVxdWVudCBjb25uZWN0cy9kaXNjb25uZWN0cworey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdG8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsCisgIERhdGVVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU3RyZWFtLAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIEJlbmNobWFyaywgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIEFnZ3IsICAgICAgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIE11bHRpcGxleC5UZXN0LkNvbW1vbjsKKwordHlwZQorICBUVGVzdENsaWVudCA9IGNsYXNzCisgIHByb3RlY3RlZAorICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKworICAgIHByb2NlZHVyZSBQYXJzZUFyZ3MoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgICAgcHJvY2VkdXJlIFNldHVwOworICAgIHByb2NlZHVyZSBSdW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCisKK3R5cGUKKyAgSVNlcnZpY2VDbGllbnQgPSBpbnRlcmZhY2UKKyAgICBbJ3s3NzQ1QzFDMi1BQjIwLTQzQkEtQjZGMC0wOEJGOTJERTBCQUN9J10KKyAgICBwcm9jZWR1cmUgVGVzdDsKKyAgZW5kOworCisvLy0tLSBUVGVzdENsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7Cit2YXIgY2xpZW50IDogVFRlc3RDbGllbnQ7CitiZWdpbgorICBjbGllbnQgOj0gVFRlc3RDbGllbnQuQ3JlYXRlKGFyZ3MpOworICB0cnkKKyAgICBjbGllbnQuUnVuOworICBmaW5hbGx5CisgICAgY2xpZW50LkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUVGVzdENsaWVudC5DcmVhdGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBQYXJzZUFyZ3MoYXJncyk7CisgIFNldHVwOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdENsaWVudC5QYXJzZUFyZ3MoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CitiZWdpbgorICBpZiBMZW5ndGgoYXJncykgPD4gMAorICB0aGVuIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ05vIGFyZ3MgYWNjZXB0ZWQgc28gZmFyJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0Q2xpZW50LlNldHVwOwordmFyIHRyYW5zIDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZSggJ2xvY2FsaG9zdCcsIDkwOTApOworICB0cmFucyA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zKTsKKyAgdHJhbnMuT3BlbjsKKyAgRlByb3RvY29sIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucywgVFJVRSwgVFJVRSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0Q2xpZW50LlJ1bjsKK3ZhciBiZW5jaCA6IFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlOworICAgIGFnZ3IgIDogVEFnZ3IuSWZhY2U7CisgICAgbXVsdGlwbGV4IDogSVByb3RvY29sOworICAgIGkgICAgICAgICA6IEludGVnZXI7CitiZWdpbgorICB0cnkKKyAgICBtdWx0aXBsZXggOj0gVE11bHRpcGxleGVkUHJvdG9jb2wuQ3JlYXRlKCBGUHJvdG9jb2wsIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgYmVuY2ggICAgIDo9IFRCZW5jaG1hcmtTZXJ2aWNlLlRDbGllbnQuQ3JlYXRlKCBtdWx0aXBsZXgpOworCisgICAgbXVsdGlwbGV4IDo9IFRNdWx0aXBsZXhlZFByb3RvY29sLkNyZWF0ZSggRlByb3RvY29sLCBOQU1FX0FHR1IpOworICAgIGFnZ3IgICAgICA6PSBUQWdnci5UQ2xpZW50LkNyZWF0ZSggbXVsdGlwbGV4KTsKKworICAgIGZvciBpIDo9IDEgdG8gMTAKKyAgICBkbyBhZ2dyLmFkZFZhbHVlKCBiZW5jaC5maWJvbmFjY2koaSkpOworCisgICAgZm9yIGkgaW4gYWdnci5nZXRWYWx1ZXMKKyAgICBkbyBXcml0ZShJbnRUb1N0cihpKSsnICcpOworICAgIFdyaXRlTG47CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIFdyaXRlbG4oIzEwK2UuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODYwZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMKQEAgLTAsMCArMSwyMDEgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBNdWx0aXBsZXguU2VydmVyLk1haW47CisKK3skV0FSTiBTWU1CT0xfUExBVEZPUk0gT0ZGfQorCit7LiRERUZJTkUgUnVuRW5kbGVzc30gICAvLyBhY3RpdmF0ZSB0byBpbnRlcmFjdGl2ZWx5IHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgc3RvcCByb3V0aW5lcyB2aWEgQ3RybCtDCisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlNlcnZlciwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LAorICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCwKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdCwKKyAgQmVuY2htYXJrLCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgQWdnciwgICAgICAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgTXVsdGlwbGV4LlRlc3QuQ29tbW9uLAorICBDb25zb2xlSGVscGVyLAorICBDb250bnJzOworCit0eXBlCisgIFRUZXN0U2VydmVyID0gY2xhc3MKKyAgcHVibGljIHR5cGUKKyAgICBJVGVzdEhhbmRsZXIgPSBpbnRlcmZhY2UKKyAgICAgIFsne0NBRTA5QUFCLTgwRkItNDhFOS1CM0E4LTdGOUI5NkY1NDE5QX0nXQorICAgICAgcHJvY2VkdXJlIFNldFNlcnZlciggY29uc3QgQVNlcnZlciA6IElTZXJ2ZXIgKTsKKyAgICBlbmQ7CisKKyAgcHJvdGVjdGVkIHR5cGUKKyAgICBUVGVzdEhhbmRsZXJJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGVzdEhhbmRsZXIpCisgICAgcHJpdmF0ZQorICAgICAgRlNlcnZlciA6IElTZXJ2ZXI7CisgICAgcHJvdGVjdGVkCisgICAgICAvLyBJVGVzdEhhbmRsZXIKKyAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisKKyAgICAgIHByb3BlcnR5IFNlcnZlciA6IElTZXJ2ZXIgcmVhZCBGU2VydmVyIHdyaXRlIFNldFNlcnZlcjsKKyAgICBlbmQ7CisKKyAgICBUQmVuY2htYXJrU2VydmljZUltcGwgPSBjbGFzcyggVFRlc3RIYW5kbGVySW1wbCwgVEJlbmNobWFya1NlcnZpY2UuSWZhY2UpCisgICAgcHJvdGVjdGVkCisgICAgICAvLyBUQmVuY2htYXJrU2VydmljZS5JZmFjZQorICAgICAgZnVuY3Rpb24gZmlib25hY2NpKG46IFNob3J0SW50KTogSW50ZWdlcjsKKyAgICBlbmQ7CisKKworICAgIFRBZ2dySW1wbCA9IGNsYXNzKCBUVGVzdEhhbmRsZXJJbXBsLCBUQWdnci5JZmFjZSkKKyAgICBwcm90ZWN0ZWQKKyAgICAgIEZMaXN0IDogSVRocmlmdExpc3Q8SW50ZWdlcj47CisKKyAgICAgIC8vIFRBZ2dyLklmYWNlCisgICAgICBwcm9jZWR1cmUgYWRkVmFsdWUodmFsdWU6IEludGVnZXIpOworICAgICAgZnVuY3Rpb24gZ2V0VmFsdWVzKCk6IElUaHJpZnRMaXN0PEludGVnZXI+OworICAgIHB1YmxpYworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgICAgZW5kOworCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCit7IFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwgfQorCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC5TZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXI6IElTZXJ2ZXIpOworYmVnaW4KKyAgRlNlcnZlciA6PSBBU2VydmVyOworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIuVEJlbmNobWFya1NlcnZpY2VJbXBsIH0KKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVEJlbmNobWFya1NlcnZpY2VJbXBsLmZpYm9uYWNjaShuOiBTaG9ydEludCk6IEludGVnZXI7Cit2YXIgcHJldiwgbmV4dCA6IEludGVnZXI7CitiZWdpbgorICBwcmV2ICAgOj0gMDsKKyAgcmVzdWx0IDo9IDE7CisgIHdoaWxlIG4gPiAwIGRvIGJlZ2luCisgICAgbmV4dCAgIDo9IHJlc3VsdCArIHByZXY7CisgICAgcHJldiAgIDo9IHJlc3VsdDsKKyAgICByZXN1bHQgOj0gbmV4dDsKKyAgICBEZWMobik7CisgIGVuZDsKK2VuZDsKKworeyBUVGVzdFNlcnZlci5UQWdnckltcGwgfQorCitjb25zdHJ1Y3RvciBUVGVzdFNlcnZlci5UQWdnckltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkxpc3QgOj0gVFRocmlmdExpc3RJbXBsPEludGVnZXI+LkNyZWF0ZTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRkxpc3QpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLmFkZFZhbHVlKHZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkFkZCggdmFsdWUpOworZW5kOworCisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5nZXRWYWx1ZXMoKTogSVRocmlmdExpc3Q8SW50ZWdlcj47CitiZWdpbgorICByZXN1bHQgOj0gRkxpc3Q7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlciB9CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5FeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwordmFyCisgIFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgUHJvdG9jb2xGYWN0b3J5ICA6IElQcm90b2NvbEZhY3Rvcnk7CisgIFNlcnZlclRyYW5zICAgICAgOiBJU2VydmVyVHJhbnNwb3J0OworICBiZW5jaEhhbmRsZXIgICAgIDogVEJlbmNobWFya1NlcnZpY2UuSWZhY2U7CisgIGFnZ3JIYW5kbGVyICAgICAgOiBUQWdnci5JZmFjZTsKKyAgYmVuY2hQcm9jZXNzb3IgICA6IElQcm9jZXNzb3I7CisgIGFnZ3JQcm9jZXNzb3IgICAgOiBJUHJvY2Vzc29yOworICBtdWx0aXBsZXggICAgICAgIDogSU11bHRpcGxleGVkUHJvY2Vzc29yOworICBTZXJ2ZXJFbmdpbmUgICAgIDogSVNlcnZlcjsKK2JlZ2luCisgIHRyeQorICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgUHJvdG9jb2xGYWN0b3J5ICA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSggVFJVRSwgVFJVRSk7CisgICAgc2VydmVydHJhbnMgICAgICA6PSBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIDkwOTAsIDAsIEZBTFNFKTsKKyAgICBUcmFuc3BvcnRGYWN0b3J5IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKworICAgIGJlbmNoSGFuZGxlciAgICAgOj0gVEJlbmNobWFya1NlcnZpY2VJbXBsLkNyZWF0ZTsKKyAgICBiZW5jaFByb2Nlc3NvciAgIDo9IFRCZW5jaG1hcmtTZXJ2aWNlLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggYmVuY2hIYW5kbGVyKTsKKworICAgIGFnZ3JIYW5kbGVyICAgICAgOj0gVEFnZ3JJbXBsLkNyZWF0ZTsKKyAgICBhZ2dyUHJvY2Vzc29yICAgIDo9IFRBZ2dyLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggYWdnckhhbmRsZXIpOworCisgICAgbXVsdGlwbGV4ICAgICAgICA6PSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkNyZWF0ZTsKKyAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IpOworICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9BR0dSLCAgYWdnclByb2Nlc3Nvcik7CisKKyAgICBTZXJ2ZXJFbmdpbmUgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIG11bHRpcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlclRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sRmFjdG9yeSk7CisKKyAgICAoYmVuY2hIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKworICAgIENvbnNvbGUuV3JpdGVMaW5lKCdTdGFydGluZyB0aGUgc2VydmVyIC4uLicpOworICAgIFNlcnZlckVuZ2luZS5zZXJ2ZSgpOworCisgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggbmlsKTsKKyAgICAoYWdnckhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIG5pbCk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoIEUuTWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCAnZG9uZS4nKTsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3OGQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByCkBAIC0wLDAgKzEsNjcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCitwcm9ncmFtIE11bHRpcGxleC5UZXN0LkNsaWVudDsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIE11bHRpcGxleC5DbGllbnQuTWFpbiBpbiAnTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcycsCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworICBzIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnTXVsdGlwbGV4IFRlc3RDbGllbnQgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCisgICAgYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisgICAgVFRlc3RDbGllbnQuRXhlY3V0ZSggYXJncyApOworICAgIFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICAgICAgRXhpdENvZGUgOj0gJEZGRkY7CisgICAgZW5kOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5Db21tb24ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNvbW1vbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhZjA4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5Db21tb24ucGFzCkBAIC0wLDAgKzEsMzUgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBNdWx0aXBsZXguVGVzdC5Db21tb247CisKK2ludGVyZmFjZQorCitjb25zdAorICBOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAnQmVuY2htYXJrU2VydmljZSc7CisgIE5BTUVfQUdHUiAgICAgICAgICAgICA9ICdBZ2dyJzsKKworCitpbXBsZW1lbnRhdGlvbgorCisvLyBuaXgKKworZW5kLgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwNDYyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByCkBAIC0wLDAgKzEsNjggQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBNdWx0aXBsZXguVGVzdC5TZXJ2ZXI7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBNdWx0aXBsZXguU2VydmVyLk1haW4gaW4gJ011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMnLAorICBDb25zb2xlSGVscGVyIGluICcuLlxDb25zb2xlSGVscGVyLnBhcycsCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisgIHMgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdNdWx0aXBsZXggVGVzdFNlcnZlciAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8KKyAgICBiZWdpbgorICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CisgICAgICBhcmdzW2ktMV0gOj0gYXJnOworICAgIGVuZDsKKyAgICBUVGVzdFNlcnZlci5FeGVjdXRlKCBhcmdzICk7CisgICAgV3JpdGVsbignUHJlc3MgRU5URVIgdG8gY2xvc2UgLi4uICcpOyBSZWFkbG47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmMwMDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKQEAgLTAsMCArMSwzNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0U2VyaWFsaXplci5EYXRhOworCitpbnRlcmZhY2UKKwordXNlcworICBTeXNVdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBEZWJ1Z1Byb3RvVGVzdDsKKworCit0eXBlCisgIEZpeHR1cmVzID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlT25lT2ZFYWNoIDogSU9uZU9mRWFjaDsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGVOZXN0aW5nIDogSU5lc3Rpbmc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlSG9seU1vbGV5IDogSUhvbHlNb2xleTsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGVDb21wYWN0UHJvdG9UZXN0U3RydWN0IDogSUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CisKKyAgLy8gVGhlc2UgYnl0ZSBhcnJheXMgYXJlIHNlcmlhbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHN0cnVjdHMuCisgIC8vIFRoZXkgd2VyZSBzZXJpYWxpemVkIGluIGJpbmFyeSBwcm90b2NvbCB1c2luZyB0aHJpZnQgMC42LnggYW5kIGFyZSB1c2VkIHRvCisgIC8vIHRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFuZGFyZCBzY2hlbWUuCisgICgqCisgICAgICAgICAgYWxsIGRhdGEgY29waWVkIGZyb20gSkFWQSB2ZXJzaW9uLAorICAgICAgICAgIHRvIGJlIHVzZWQgbGF0ZXIKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2ggPSBuZXcgYnl0ZVtdIHsKKyAgICAkMDIsICQwMCwgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMDAsCisgICAgJDAzLCAkRDYsICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsICQwMCwgJDA1LAorICAgICQwMSwgJDAwLCAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDEsICQ2NSwgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywgJDQwLCAkMDksCisgICAgJDIxLCAkRkIsICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsICQwOCwgJDAwLAorICAgICQwMCwgJDAwLCAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLCAkNTQsICQ0OCwKKyAgICAkNDksICQ1MywgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwgJDA5LCAkMDAsCisgICAgJDAwLCAkMDAsICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsICRDRSwgJDlELAorICAgICQyMCwgJEQwLCAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLCAkRDAsICRCRSwKKyAgICAkQzksICRBMSwgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwgJEUyLCAkODQsCisgICAgJDhFLCAkMjAsICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsICRFMiwgJDg1LAorICAgICRCRCwgJENFLCAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLCAkQkMsICQwMiwKKyAgICAkMDAsICQwQSwgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDYsCisgICAgJDYyLCAkNjEsICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsICQwQywgJDAzLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLCAkMDAsICQwRCwKKyAgICAkMDYsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwgJDAyLCAkMDAsCisgICAgJDAzLCAkMEYsICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwIH07CisKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNOZXN0aW5nID0gbmV3IGJ5dGVbXSB7CisgICAgJDBDLCAkMDAsICQwMSwgJDA4LCAkMDAsICQwMSwgJDAwLCAkMDAsICQ3QSwgJDY5LAorICAgICQwQiwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQxMywgJDQ5LCAkMjAsICQ2MSwKKyAgICAkNkQsICQyMCwgJDYxLCAkMjAsICQ2MiwgJDZGLCAkNkUsICQ2QiwgJDJFLCAkMkUsCisgICAgJDJFLCAkMjAsICQ3OCwgJDZGLCAkNzIsICQyMSwgJDAwLCAkMEMsICQwMCwgJDAyLAorICAgICQwMiwgJDAwLCAkMDEsICQwMSwgJDAyLCAkMDAsICQwMiwgJDAwLCAkMDMsICQwMCwKKyAgICAkMDMsICRENiwgJDA2LCAkMDAsICQwNCwgJDY5LCAkNzgsICQwOCwgJDAwLCAkMDUsCisgICAgJDAxLCAkMDAsICQwMCwgJDAwLCAkMEEsICQwMCwgJDA2LCAkMDAsICQwMCwgJDAwLAorICAgICQwMSwgJDY1LCAkQTAsICRCQywgJDAwLCAkMDQsICQwMCwgJDA3LCAkNDAsICQwOSwKKyAgICAkMjEsICRGQiwgJDU0LCAkNDQsICQyRCwgJDE4LCAkMEIsICQwMCwgJDA4LCAkMDAsCisgICAgJDAwLCAkMDAsICQwRCwgJDRBLCAkNTMsICQ0RiwgJDRFLCAkMjAsICQ1NCwgJDQ4LAorICAgICQ0OSwgJDUzLCAkMjEsICQyMCwgJDIyLCAkMDEsICQwQiwgJDAwLCAkMDksICQwMCwKKyAgICAkMDAsICQwMCwgJDJFLCAkRDMsICQ4MCwgJEUyLCAkODUsICRBRSwgJENFLCAkOUQsCisgICAgJDIwLCAkRDAsICQ5RCwgJENFLCAkQkYsICRFMiwgJDg1LCAkQkYsICREMCwgJEJFLAorICAgICRDOSwgJEExLCAkRDAsICRCMywgJEQwLCAkQjAsICRDRiwgJDgxLCAkRTIsICQ4NCwKKyAgICAkOEUsICQyMCwgJENFLCAkOTEsICQ3NCwgJDc0LCAkQ0UsICRCMSwgJEUyLCAkODUsCisgICAgJEJELCAkQ0UsICRCQSwgJEVGLCAkQkYsICRCRCwgJEUyLCAkODAsICRCQywgJDAyLAorICAgICQwMCwgJDBBLCAkMDAsICQwQiwgJDAwLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwNiwKKyAgICAkNjIsICQ2MSwgJDczLCAkNjUsICQzNiwgJDM0LCAkMEYsICQwMCwgJDBDLCAkMDMsCisgICAgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDEsICQwMiwgJDAzLCAkMEYsICQwMCwgJDBELAorICAgICQwNiwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwMSwgJDAwLCAkMDIsICQwMCwKKyAgICAkMDMsICQwRiwgJDAwLCAkMEUsICQwQSwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAxLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAzLCAkMDAsICQwMCB9OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSA9IG5ldyBieXRlW10geworICAgICQwRiwgJDAwLCAkMDEsICQwQywgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDIsICQwMCwKKyAgICAkMDEsICQwMSwgJDAyLCAkMDAsICQwMiwgJDAwLCAkMDMsICQwMCwgJDAzLCAkMjMsCisgICAgJDA2LCAkMDAsICQwNCwgJDY5LCAkNzgsICQwOCwgJDAwLCAkMDUsICQwMSwgJDAwLAorICAgICQwMCwgJDAwLCAkMEEsICQwMCwgJDA2LCAkMDAsICQwMCwgJDAwLCAkMDEsICQ2NSwKKyAgICAkQTAsICRCQywgJDAwLCAkMDQsICQwMCwgJDA3LCAkNDAsICQwOSwgJDIxLCAkRkIsCisgICAgJDU0LCAkNDQsICQyRCwgJDE4LCAkMEIsICQwMCwgJDA4LCAkMDAsICQwMCwgJDAwLAorICAgICQwRCwgJDRBLCAkNTMsICQ0RiwgJDRFLCAkMjAsICQ1NCwgJDQ4LCAkNDksICQ1MywKKyAgICAkMjEsICQyMCwgJDIyLCAkMDEsICQwQiwgJDAwLCAkMDksICQwMCwgJDAwLCAkMDAsCisgICAgJDJFLCAkRDMsICQ4MCwgJEUyLCAkODUsICRBRSwgJENFLCAkOUQsICQyMCwgJEQwLAorICAgICQ5RCwgJENFLCAkQkYsICRFMiwgJDg1LCAkQkYsICREMCwgJEJFLCAkQzksICRBMSwKKyAgICAkRDAsICRCMywgJEQwLCAkQjAsICRDRiwgJDgxLCAkRTIsICQ4NCwgJDhFLCAkMjAsCisgICAgJENFLCAkOTEsICQ3NCwgJDc0LCAkQ0UsICRCMSwgJEUyLCAkODUsICRCRCwgJENFLAorICAgICRCQSwgJEVGLCAkQkYsICRCRCwgJEUyLCAkODAsICRCQywgJDAyLCAkMDAsICQwQSwKKyAgICAkMDAsICQwQiwgJDAwLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwNiwgJDYyLCAkNjEsCisgICAgJDczLCAkNjUsICQzNiwgJDM0LCAkMEYsICQwMCwgJDBDLCAkMDMsICQwMCwgJDAwLAorICAgICQwMCwgJDAzLCAkMDEsICQwMiwgJDAzLCAkMEYsICQwMCwgJDBELCAkMDYsICQwMCwKKyAgICAkMDAsICQwMCwgJDAzLCAkMDAsICQwMSwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMEYsCisgICAgJDAwLCAkMEUsICQwQSwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAxLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAzLCAkMDAsICQwMiwgJDAwLCAkMDEsICQwMSwgJDAyLCAkMDAsICQwMiwgJDAwLAorICAgICQwMywgJDAwLCAkMDMsICRENiwgJDA2LCAkMDAsICQwNCwgJDY5LCAkNzgsICQwOCwKKyAgICAkMDAsICQwNSwgJDAxLCAkMDAsICQwMCwgJDAwLCAkMEEsICQwMCwgJDA2LCAkMDAsCisgICAgJDAwLCAkMDAsICQwMSwgJDY1LCAkQTAsICRCQywgJDAwLCAkMDQsICQwMCwgJDA3LAorICAgICQ0MCwgJDA5LCAkMjEsICRGQiwgJDU0LCAkNDQsICQyRCwgJDE4LCAkMEIsICQwMCwKKyAgICAkMDgsICQwMCwgJDAwLCAkMDAsICQwRCwgJDRBLCAkNTMsICQ0RiwgJDRFLCAkMjAsCisgICAgJDU0LCAkNDgsICQ0OSwgJDUzLCAkMjEsICQyMCwgJDIyLCAkMDEsICQwQiwgJDAwLAorICAgICQwOSwgJDAwLCAkMDAsICQwMCwgJDJFLCAkRDMsICQ4MCwgJEUyLCAkODUsICRBRSwKKyAgICAkQ0UsICQ5RCwgJDIwLCAkRDAsICQ5RCwgJENFLCAkQkYsICRFMiwgJDg1LCAkQkYsCisgICAgJEQwLCAkQkUsICRDOSwgJEExLCAkRDAsICRCMywgJEQwLCAkQjAsICRDRiwgJDgxLAorICAgICRFMiwgJDg0LCAkOEUsICQyMCwgJENFLCAkOTEsICQ3NCwgJDc0LCAkQ0UsICRCMSwKKyAgICAkRTIsICQ4NSwgJEJELCAkQ0UsICRCQSwgJEVGLCAkQkYsICRCRCwgJEUyLCAkODAsCisgICAgJEJDLCAkMDIsICQwMCwgJDBBLCAkMDAsICQwQiwgJDAwLCAkMEIsICQwMCwgJDAwLAorICAgICQwMCwgJDA2LCAkNjIsICQ2MSwgJDczLCAkNjUsICQzNiwgJDM0LCAkMEYsICQwMCwKKyAgICAkMEMsICQwMywgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDEsICQwMiwgJDAzLCAkMEYsCisgICAgJDAwLCAkMEQsICQwNiwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwMSwgJDAwLAorICAgICQwMiwgJDAwLCAkMDMsICQwRiwgJDAwLCAkMEUsICQwQSwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDMsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAxLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwRSwgJDAwLCAkMDIsICQwRiwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDMsICQwQiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMEIsCisgICAgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwMCwgJDAwLCAkMEYsICQ3NCwgJDY4LAorICAgICQ2NSwgJDZFLCAkMjAsICQ2MSwgJDIwLCAkNkYsICQ2RSwgJDY1LCAkMkMsICQyMCwKKyAgICAkNzQsICQ3NywgJDZGLCAkMDAsICQwMCwgJDAwLCAkMDYsICQ3NCwgJDY4LCAkNzIsCisgICAgJDY1LCAkNjUsICQyMSwgJDAwLCAkMDAsICQwMCwgJDA2LCAkNDYsICQ0RiwgJDU1LAorICAgICQ1MiwgJDIxLCAkMjEsICQwQiwgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDAsICQwMCwKKyAgICAkMDAsICQwOSwgJDYxLCAkNkUsICQ2NCwgJDIwLCAkNjEsICQyMCwgJDZGLCAkNkUsCisgICAgJDY1LCAkMDAsICQwMCwgJDAwLCAkMDksICQ2MSwgJDZFLCAkNjQsICQyMCwgJDYxLAorICAgICQyMCwgJDc0LCAkNzcsICQ2RiwgJDBELCAkMDAsICQwMywgJDBCLCAkMEYsICQwMCwKKyAgICAkMDAsICQwMCwgJDAzLCAkMDAsICQwMCwgJDAwLCAkMDMsICQ3NCwgJDc3LCAkNkYsCisgICAgJDBDLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwOCwgJDAwLCAkMDEsICQwMCwgJDAwLAorICAgICQwMCwgJDAxLCAkMEIsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDUsICQ1NywKKyAgICAkNjEsICQ2OSwgJDc0LCAkMkUsICQwMCwgJDA4LCAkMDAsICQwMSwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDIsICQwQiwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwNSwgJDU3LAorICAgICQ2OCwgJDYxLCAkNzQsICQzRiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDUsICQ3NCwKKyAgICAkNjgsICQ3MiwgJDY1LCAkNjUsICQwQywgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwNCwgJDdBLCAkNjUsICQ3MiwgJDZGLCAkMEMsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAgfTsKKworCisqKQorCisgIHByaXZhdGUKKyAgICBjb25zdAorICAgICAga1VuaWNvZGVCeXRlcyA6IHBhY2tlZCBhcnJheVswLi40M10gb2YgQnl0ZQorICAgICAgICAgICAgICAgICAgICA9ICggJGQzLCAkODAsICRlMiwgJDg1LCAkYWUsICRjZSwgJDlkLCAkMjAsICRkMCwgJDlkLAorICAgICAgICAgICAgICAgICAgICAgICAgJGNlLCAkYmYsICRlMiwgJDg1LCAkYmYsICRkMCwgJGJlLCAkYzksICRhMSwgJGQwLAorICAgICAgICAgICAgICAgICAgICAgICAgJGIzLCAkZDAsICRiMCwgJGNmLCAkODEsICRlMiwgJDg0LCAkOGUsICQyMCwgJGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgJDkxLCAkNzQsICQ3NCwgJGNlLCAkYjEsICRlMiwgJDg1LCAkYmQsICRjZSwgJGJhLAorICAgICAgICAgICAgICAgICAgICAgICAgJDgzLCAkZTIsICQ4MCwgJGJjKTsKKworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCitjbGFzcyBmdW5jdGlvbiBGaXh0dXJlcy5DcmVhdGVPbmVPZkVhY2ggOiBJT25lT2ZFYWNoOwordmFyIGRiIDogRG91YmxlOworICAgIHVzIDogVXRmOFN0cmluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBUT25lT2ZFYWNoSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5zZXRJbV90cnVlKCBUUlVFKTsKKyAgcmVzdWx0LnNldEltX2ZhbHNlKCBGQUxTRSk7CisgIHJlc3VsdC5zZXRBX2JpdGUoIFNob3J0SW50KCRENikpOworICByZXN1bHQuc2V0SW50ZWdlcjE2KCAyNzAwMCk7CisgIHJlc3VsdC5zZXRJbnRlZ2VyMzIoIDEgc2hsIDI0KTsKKyAgcmVzdWx0LnNldEludGVnZXI2NCggSW50NjQoNjAwMCkgKiBJbnQ2NCgxMDAwKSAqIEludDY0KDEwMDApKTsKKyAgZGIgOj0gUGk7CisgIHJlc3VsdC5zZXREb3VibGVfcHJlY2lzaW9uKCBkYik7CisgIHJlc3VsdC5zZXRTb21lX2NoYXJhY3RlcnMoICdKU09OIFRISVMhIFwiXDEnKTsKKworICAvLyA/PworICBTZXRMZW5ndGgoIHVzLCBMZW5ndGgoa1VuaWNvZGVCeXRlcykpOworICBNb3ZlKCBrVW5pY29kZUJ5dGVzWzBdLCB1c1sxXSwgTGVuZ3RoKGtVbmljb2RlQnl0ZXMpKTsKKyAgLy8gPz8KKyAgU2V0U3RyaW5nKCB1cywgUENoYXIoQGtVbmljb2RlQnl0ZXNbMF0pLCBMZW5ndGgoa1VuaWNvZGVCeXRlcykpOworICAvLyAhIQorICByZXN1bHQuc2V0Wm9tZ191bmljb2RlKCBVbmljb2RlU3RyaW5nKCB1cykpOworCisgIHskSUYgY0RlYnVnUHJvdG9UZXN0X09wdGlvbl9BbnNpU3RyX0JpbmFyeX0KKyAgcmVzdWx0LlNldEJhc2U2NCgnYmFzZTY0Jyk7CisgIHskRUxTRX0KKyAgcmVzdWx0LlNldEJhc2U2NCggVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoJ2Jhc2U2NCcpKTsKKyAgeyRJRkVORH0KKworICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlTmVzdGluZyA6IElOZXN0aW5nOwordmFyIGJvbmsgOiBJQm9uazsKK2JlZ2luCisgIGJvbmsgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYm9uay5UeXBlXyAgIDo9IDMxMzM3OworICBib25rLk1lc3NhZ2UgOj0gJ0kgYW0gYSBib25rLi4uIHhvciEnOworCisgIHJlc3VsdCA6PSBUTmVzdGluZ0ltcGwuQ3JlYXRlOworICByZXN1bHQuTXlfYm9uayA6PSBib25rOworICByZXN1bHQuTXlfb29lIDo9IENyZWF0ZU9uZU9mRWFjaDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBGaXh0dXJlcy5DcmVhdGVIb2x5TW9sZXkgOiBJSG9seU1vbGV5OwordmFyIGJpZyA6IElUaHJpZnRMaXN0PElPbmVPZkVhY2g+OworICAgIHN0YWdlMSA6IElUaHJpZnRMaXN0PFN0cmluZz47CisgICAgc3RhZ2UyIDogSVRocmlmdExpc3Q8SUJvbms+OworICAgIGIgICAgICA6IElCb25rOworYmVnaW4KKyAgcmVzdWx0IDo9IFRIb2x5TW9sZXlJbXBsLkNyZWF0ZTsKKworICBiaWcgOj0gVFRocmlmdExpc3RJbXBsPElPbmVPZkVhY2g+LkNyZWF0ZTsKKyAgYmlnLmFkZCggQ3JlYXRlT25lT2ZFYWNoKTsKKyAgYmlnLmFkZCggQ3JlYXRlTmVzdGluZy5teV9vb2UpOworICByZXN1bHQuQmlnIDo9IGJpZzsKKyAgcmVzdWx0LkJpZ1swXS5zZXRBX2JpdGUoICQyMik7CisgIHJlc3VsdC5CaWdbMF0uc2V0QV9iaXRlKCAkMjMpOworCisgIHJlc3VsdC5Db250YWluIDo9IFRIYXNoU2V0SW1wbDwgSVRocmlmdExpc3Q8c3RyaW5nPj4uQ3JlYXRlOworICBzdGFnZTEgOj0gVFRocmlmdExpc3RJbXBsPFN0cmluZz4uQ3JlYXRlOworICBzdGFnZTEuYWRkKCAnYW5kIGEgb25lJyk7CisgIHN0YWdlMS5hZGQoICdhbmQgYSB0d28nKTsKKyAgcmVzdWx0LkNvbnRhaW4uYWRkKCBzdGFnZTEpOworCisgIHN0YWdlMSA6PSBUVGhyaWZ0TGlzdEltcGw8U3RyaW5nPi5DcmVhdGU7CisgIHN0YWdlMS5hZGQoICd0aGVuIGEgb25lLCB0d28nKTsKKyAgc3RhZ2UxLmFkZCggJ3RocmVlIScpOworICBzdGFnZTEuYWRkKCAnRk9VUiEhJyk7CisgIHJlc3VsdC5Db250YWluLmFkZCggc3RhZ2UxKTsKKworICBzdGFnZTEgOj0gVFRocmlmdExpc3RJbXBsPFN0cmluZz4uQ3JlYXRlOworICByZXN1bHQuQ29udGFpbi5hZGQoIHN0YWdlMSk7CisKKyAgc3RhZ2UyIDo9IFRUaHJpZnRMaXN0SW1wbDxJQm9uaz4uQ3JlYXRlOworICByZXN1bHQuQm9ua3MgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPCBTdHJpbmcsIElUaHJpZnRMaXN0PCBJQm9uaz4+LkNyZWF0ZTsKKyAgLy8gb25lIGVtcHR5CisgIHJlc3VsdC5Cb25rcy5BZGQoICd6ZXJvJywgc3RhZ2UyKTsKKworICAvLyBvbmUgd2l0aCB0d28KKyAgc3RhZ2UyIDo9IFRUaHJpZnRMaXN0SW1wbDxJQm9uaz4uQ3JlYXRlOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gMTsKKyAgYi5tZXNzYWdlIDo9ICdXYWl0Lic7CisgIHN0YWdlMi5BZGQoIGIpOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gMjsKKyAgYi5tZXNzYWdlIDo9ICdXaGF0Pyc7CisgIHN0YWdlMi5BZGQoIGIpOworICByZXN1bHQuQm9ua3MuQWRkKCAndHdvJywgc3RhZ2UyKTsKKworICAvLyBvbmUgd2l0aCB0aHJlZQorICBzdGFnZTIgOj0gVFRocmlmdExpc3RJbXBsPElCb25rPi5DcmVhdGU7CisgIGIgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYi50eXBlXyA6PSAzOworICBiLm1lc3NhZ2UgOj0gJ3F1b3RoJzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIGIgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYi50eXBlXyA6PSA0OworICBiLm1lc3NhZ2UgOj0gJ3RoZSByYXZlbic7CisgIHN0YWdlMi5BZGQoIGIpOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gNTsKKyAgYi5tZXNzYWdlIDo9ICduZXZlcm1vcmUnOworICBzdGFnZTIuQWRkKCBiKTsKKyAgcmVzdWx0LmJvbmtzLkFkZCggJ3RocmVlJywgc3RhZ2UyKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBGaXh0dXJlcy5DcmVhdGVDb21wYWN0UHJvdG9UZXN0U3RydWN0IDogSUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CisvLyBzdXBlcmh1Z2UgY29tcGFjdCBwcm90byB0ZXN0IHN0cnVjdAorYmVnaW4KKyAgcmVzdWx0IDo9IFRDb21wYWN0UHJvdG9UZXN0U3RydWN0SW1wbC5DcmVhdGU7CisgIHJlc3VsdC5BX2J5dGUgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2J5dGU7CisgIHJlc3VsdC5BX2kxNiA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTE2OworICByZXN1bHQuQV9pMzIgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2kzMjsKKyAgcmVzdWx0LkFfaTY0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pNjQ7CisgIHJlc3VsdC5BX2RvdWJsZSA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfZG91YmxlOworICByZXN1bHQuQV9zdHJpbmcgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX3N0cmluZzsKKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9iaW5hcnk7CisgIHJlc3VsdC5UcnVlX2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuVHJ1ZV9maWVsZDsKKyAgcmVzdWx0LkZhbHNlX2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRmFsc2VfZmllbGQ7CisgIHJlc3VsdC5FbXB0eV9zdHJ1Y3RfZmllbGQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5FbXB0eV9zdHJ1Y3RfZmllbGQ7CisgIHJlc3VsdC5CeXRlX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2xpc3Q7CisgIHJlc3VsdC5JMTZfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9saXN0OworICByZXN1bHQuSTMyX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfbGlzdDsKKyAgcmVzdWx0Lkk2NF9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTY0X2xpc3Q7CisgIHJlc3VsdC5Eb3VibGVfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9saXN0OworICByZXN1bHQuU3RyaW5nX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfbGlzdDsKKyAgcmVzdWx0LkJpbmFyeV9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQmluYXJ5X2xpc3Q7CisgIHJlc3VsdC5Cb29sZWFuX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX2xpc3Q7CisgIHJlc3VsdC5TdHJ1Y3RfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cnVjdF9saXN0OworICByZXN1bHQuQnl0ZV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3NldDsKKyAgcmVzdWx0LkkxNl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfc2V0OworICByZXN1bHQuSTMyX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9zZXQ7CisgIHJlc3VsdC5JNjRfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTY0X3NldDsKKyAgcmVzdWx0LkRvdWJsZV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfc2V0OworICByZXN1bHQuU3RyaW5nX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7CisgIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX3NldDsKKyAgcmVzdWx0LlN0cmluZ19zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfc2V0OworICByZXN1bHQuQmluYXJ5X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9zZXQ7CisgIHJlc3VsdC5Cb29sZWFuX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJvb2xlYW5fc2V0OworICByZXN1bHQuU3RydWN0X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cnVjdF9zZXQ7CisgIHJlc3VsdC5CeXRlX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9ieXRlX21hcDsKKyAgcmVzdWx0LkkxNl9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9ieXRlX21hcDsKKyAgcmVzdWx0LkkzMl9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9ieXRlX21hcDsKKyAgcmVzdWx0Lkk2NF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9ieXRlX21hcDsKKyAgcmVzdWx0LkRvdWJsZV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9ieXRlX21hcDsKKyAgcmVzdWx0LlN0cmluZ19ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19ieXRlX21hcDsKKyAgcmVzdWx0LkJpbmFyeV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9ieXRlX21hcDsKKyAgcmVzdWx0LkJvb2xlYW5fYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX2J5dGVfbWFwOworICByZXN1bHQuQnl0ZV9pMTZfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pMTZfbWFwOworICByZXN1bHQuQnl0ZV9pMzJfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pMzJfbWFwOworICByZXN1bHQuQnl0ZV9pNjRfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pNjRfbWFwOworICByZXN1bHQuQnl0ZV9kb3VibGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9kb3VibGVfbWFwOworICByZXN1bHQuQnl0ZV9zdHJpbmdfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zdHJpbmdfbWFwOworICByZXN1bHQuQnl0ZV9iaW5hcnlfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9iaW5hcnlfbWFwOworICByZXN1bHQuQnl0ZV9ib29sZWFuX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYm9vbGVhbl9tYXA7CisgIHJlc3VsdC5MaXN0X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuTGlzdF9ieXRlX21hcDsKKyAgcmVzdWx0LlNldF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlNldF9ieXRlX21hcDsKKyAgcmVzdWx0Lk1hcF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULk1hcF9ieXRlX21hcDsKKyAgcmVzdWx0LkJ5dGVfbWFwX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbWFwX21hcDsKKyAgcmVzdWx0LkJ5dGVfc2V0X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfc2V0X21hcDsKKyAgcmVzdWx0LkJ5dGVfbGlzdF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2xpc3RfbWFwOworCisgIHskSUYgY0RlYnVnUHJvdG9UZXN0X09wdGlvbl9BbnNpU3RyX0JpbmFyeX0KKyAgcmVzdWx0LkFfYmluYXJ5IDo9IEFuc2lTdHJpbmcoICMwIzEjMiMzIzQjNSM2IzcjOCk7CisgIHskRUxTRX0KKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCAjMCMxIzIjMyM0IzUjNiM3IzgpOworICB7JElGRU5EfQorZW5kOworCisKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUyMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCkBAIC0wLDAgKzEsMjMxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gVGVzdFNlcmlhbGl6ZXI7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlNlcmlhbGl6ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VyaWFsaXplci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBTeXN0ZW1fLAorICBEZWJ1Z1Byb3RvVGVzdCwKKyAgVGVzdFNlcmlhbGl6ZXIuRGF0YTsKKworCisKK3R5cGUKKyAgVFRlc3RTZXJpYWxpemVyID0gY2xhc3MgLy9leHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZQorICAgIEZQcm90b2NvbHMgOiBUTGlzdDwgSVByb3RvY29sRmFjdG9yeT47CisKKyAgICBjbGFzcyBmdW5jdGlvbiAgU2VyaWFsaXplKGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KSA6IFRCeXRlczsgIG92ZXJsb2FkOworICAgIGNsYXNzIHByb2NlZHVyZSBTZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7IGNvbnN0IGFTdHJlYW0gOiBUU3RyZWFtKTsgIG92ZXJsb2FkOworICAgIGNsYXNzIHByb2NlZHVyZSBEZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIFRlc3RfU2VyaWFsaXplcl9EZXNlcmlhbGl6ZXI7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgcHJvY2VkdXJlIFJ1blRlc3RzOworICBlbmQ7CisKKworCit7IFRUZXN0U2VyaWFsaXplciB9CisKK2NvbnN0cnVjdG9yIFRUZXN0U2VyaWFsaXplci5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUHJvdG9jb2xzIDo9IFRMaXN0PCBJUHJvdG9jb2xGYWN0b3J5Pi5DcmVhdGU7CisgIEZQcm90b2NvbHMuQWRkKCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CisgIC8vRlByb3RvY29scy5BZGQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CisgIEZQcm90b2NvbHMuQWRkKCBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworZW5kOworCisKK2Rlc3RydWN0b3IgVFRlc3RTZXJpYWxpemVyLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGUHJvdG9jb2xzKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKK3R5cGUgVE1ldGhvZCA9IChtdF9CeXRlcywgbXRfU3RyZWFtKTsKKworCitwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLlRlc3RfU2VyaWFsaXplcl9EZXNlcmlhbGl6ZXI7Cit2YXIgbGV2ZWwzb29lLCBjb3JyZWN0IDogSU9uZU9mRWFjaDsKKyAgICBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgICBieXRlcyAgIDogVEJ5dGVzOworICAgIHN0cmVhbSAgOiBURmlsZVN0cmVhbTsKKyAgICBpICAgICAgIDogSW50ZWdlcjsKKyAgICBtZXRob2QgIDogVE1ldGhvZDsKK2JlZ2luCisgIGNvcnJlY3QgOj0gRml4dHVyZXMuQ3JlYXRlT25lT2ZFYWNoOworICBzdHJlYW0gIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggJ1Rlc3RTZXJpYWxpemVyLmRhdCcsIGZtQ3JlYXRlKTsKKyAgdHJ5CisKKyAgICBmb3IgbWV0aG9kIGluIFtMb3coVE1ldGhvZCkuLkhpZ2goVE1ldGhvZCldIGRvIGJlZ2luCisgICAgICBmb3IgZmFjdG9yeSBpbiBGUHJvdG9jb2xzIGRvIGJlZ2luCisKKyAgICAgICAgLy8gd3JpdGUKKyAgICAgICAgbGV2ZWwzb29lIDo9IEZpeHR1cmVzLkNyZWF0ZU9uZU9mRWFjaDsKKyAgICAgICAgY2FzZSBtZXRob2Qgb2YKKyAgICAgICAgICBtdF9CeXRlczogIGJ5dGVzIDo9IFNlcmlhbGl6ZSggbGV2ZWwzb29lLCBmYWN0b3J5KTsKKyAgICAgICAgICBtdF9TdHJlYW06IGJlZ2luCisgICAgICAgICAgICBzdHJlYW0uU2l6ZSA6PSAwOworICAgICAgICAgICAgU2VyaWFsaXplKCBsZXZlbDNvb2UsIGZhY3RvcnksIHN0cmVhbSk7CisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBU1NFUlQoIEZBTFNFKTsKKyAgICAgICAgZW5kOworCisgICAgICAgIC8vIGluaXQgKyByZWFkCisgICAgICAgIGxldmVsM29vZSA6PSBUT25lT2ZFYWNoSW1wbC5DcmVhdGU7CisgICAgICAgIGNhc2UgbWV0aG9kIG9mCisgICAgICAgICAgbXRfQnl0ZXM6ICBEZXNlcmlhbGl6ZSggYnl0ZXMsIGxldmVsM29vZSwgZmFjdG9yeSk7CisgICAgICAgICAgbXRfU3RyZWFtOiBiZWdpbgorICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uIDo9IDA7CisgICAgICAgICAgICBEZXNlcmlhbGl6ZSggc3RyZWFtLCBsZXZlbDNvb2UsIGZhY3RvcnkpOworICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICAgIGVuZDsKKworCisgICAgICAgIC8vIGNoZWNrCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkltX3RydWUgPSBjb3JyZWN0LkltX3RydWUpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbV9mYWxzZSA9IGNvcnJlY3QuSW1fZmFsc2UpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5BX2JpdGUgPSBjb3JyZWN0LkFfYml0ZSk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkludGVnZXIxNiA9IGNvcnJlY3QuSW50ZWdlcjE2KTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW50ZWdlcjMyID0gY29ycmVjdC5JbnRlZ2VyMzIpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbnRlZ2VyNjQgPSBjb3JyZWN0LkludGVnZXI2NCk7CisgICAgICAgIEFTU0VSVCggQWJzKCBsZXZlbDNvb2UuRG91YmxlX3ByZWNpc2lvbiAtIGNvcnJlY3QuRG91YmxlX3ByZWNpc2lvbikgPCAxRS0xMik7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLlNvbWVfY2hhcmFjdGVycyA9IGNvcnJlY3QuU29tZV9jaGFyYWN0ZXJzKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuWm9tZ191bmljb2RlID0gY29ycmVjdC5ab21nX3VuaWNvZGUpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5XaGF0X3dobyA9IGNvcnJlY3QuV2hhdF93aG8pOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5CYXNlNjQgPSBjb3JyZWN0LkJhc2U2NCk7CisKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuQnl0ZV9saXN0LkNvdW50ID0gY29ycmVjdC5CeXRlX2xpc3QuQ291bnQpOworICAgICAgICBmb3IgaSA6PSAwIHRvIGxldmVsM29vZS5CeXRlX2xpc3QuQ291bnQtMQorICAgICAgICBkbyBBU1NFUlQoIGxldmVsM29vZS5CeXRlX2xpc3RbaV0gPSBjb3JyZWN0LkJ5dGVfbGlzdFtpXSk7CisKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSTE2X2xpc3QuQ291bnQgPSBjb3JyZWN0LkkxNl9saXN0LkNvdW50KTsKKyAgICAgICAgZm9yIGkgOj0gMCB0byBsZXZlbDNvb2UuSTE2X2xpc3QuQ291bnQtMQorICAgICAgICBkbyBBU1NFUlQoIGxldmVsM29vZS5JMTZfbGlzdFtpXSA9IGNvcnJlY3QuSTE2X2xpc3RbaV0pOworCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkk2NF9saXN0LkNvdW50ID0gY29ycmVjdC5JNjRfbGlzdC5Db3VudCk7CisgICAgICAgIGZvciBpIDo9IDAgdG8gbGV2ZWwzb29lLkk2NF9saXN0LkNvdW50LTEKKyAgICAgICAgZG8gQVNTRVJUKCBsZXZlbDNvb2UuSTY0X2xpc3RbaV0gPSBjb3JyZWN0Lkk2NF9saXN0W2ldKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgZmluYWxseQorICAgIHN0cmVhbS5GcmVlOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5SdW5UZXN0czsKK2JlZ2luCisgIHRyeQorICAgIFRlc3RfU2VyaWFsaXplcl9EZXNlcmlhbGl6ZXI7CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBXcml0ZWxuKCBlLk1lc3NhZ2UpOworICAgICAgV3JpdGUoJ0hpdCBFTlRFUiB0byBjbG9zZSAuLi4gJyk7IFJlYWRsbjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUVGVzdFNlcmlhbGl6ZXIuU2VyaWFsaXplKGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KSA6IFRCeXRlczsKK3ZhciBzZXJpYWwgOiBUU2VyaWFsaXplcjsKK2JlZ2luCisgIHNlcmlhbCA6PSBUU2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICByZXN1bHQgOj0gc2VyaWFsLlNlcmlhbGl6ZSggaW5wdXQpOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLlNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsgY29uc3QgYVN0cmVhbSA6IFRTdHJlYW0pOwordmFyIHNlcmlhbCA6IFRTZXJpYWxpemVyOworYmVnaW4KKyAgc2VyaWFsIDo9IFRTZXJpYWxpemVyLkNyZWF0ZSggZmFjdG9yeSk7CisgIHRyeQorICAgIHNlcmlhbC5TZXJpYWxpemUoIGlucHV0LCBhU3RyZWFtKTsKKyAgZmluYWxseQorICAgIHNlcmlhbC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7Cit2YXIgc2VyaWFsIDogVERlc2VyaWFsaXplcjsKK2JlZ2luCisgIHNlcmlhbCA6PSBURGVzZXJpYWxpemVyLkNyZWF0ZSggZmFjdG9yeSk7CisgIHRyeQorICAgIHNlcmlhbC5EZXNlcmlhbGl6ZSggaW5wdXQsIHRhcmdldCk7CisgIGZpbmFsbHkKKyAgICBzZXJpYWwuRnJlZTsKKyAgZW5kOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLkRlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRTdHJlYW07IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7Cit2YXIgc2VyaWFsIDogVERlc2VyaWFsaXplcjsKK2JlZ2luCisgIHNlcmlhbCA6PSBURGVzZXJpYWxpemVyLkNyZWF0ZSggZmFjdG9yeSk7CisgIHRyeQorICAgIHNlcmlhbC5EZXNlcmlhbGl6ZSggaW5wdXQsIHRhcmdldCk7CisgIGZpbmFsbHkKKyAgICBzZXJpYWwuRnJlZTsKKyAgZW5kOworZW5kOworCisKK3ZhciB0ZXN0IDogVFRlc3RTZXJpYWxpemVyOworYmVnaW4KKyAgdGVzdCA6PSBUVGVzdFNlcmlhbGl6ZXIuQ3JlYXRlOworICB0cnkKKyAgICB0ZXN0LlJ1blRlc3RzOworICBmaW5hbGx5CisgICAgdGVzdC5GcmVlOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNDhhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCkBAIC0wLDAgKzEsNzMgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBzZXJ2ZXI7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUZXN0U2VydmVyIGluICdUZXN0U2VydmVyLnBhcycsCisgIFRlc3RTZXJ2ZXJFdmVudHMgaW4gJ1Rlc3RTZXJ2ZXJFdmVudHMucGFzJywKKyAgVGhyaWZ0LlRlc3QsICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBUaHJpZnQgaW4gJy4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ0RlbHBoaSBUZXN0U2VydmVyICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbyBiZWdpbgorICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CisgICAgICBhcmdzW2ktMV0gOj0gYXJnOworICAgIGVuZDsKKworICAgIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGFyZ3MgKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0OTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZApAQCAtMCwwICsxLDExIEBACitUaGVzZSB0d28gcHJvamVjdHMgYmVsb25nIHRvZ2V0aGVyLiBCb3RoIHByb2dyYW1zCitzaW11bGF0ZSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgZGlmZmVyZW50IHZlcnNpb25zCitvZiB0aGUgc2FtZSBwcm90b2NvbC4KKworVGhlIGludGVudGlvbiBvZiB0aGlzIHRlc3QgaXMgdG8gZW5zdXJlIGZ1bGx5Cit3b3JraW5nIGNvbXBhdGliaWxpdHkgZmVhdHVyZXMgb2YgdGhlIERlbHBoaSBUaHJpZnQKK2ltcGxlbWVudGF0aW9uLgorCitUaGUgZXhwZWN0ZWQgdGVzdCByZXN1bHQgaXMsIHRoYXQgbm8gZXJyb3JzIG9jY3VyCit3aXRoIGJvdGggcHJvZ3JhbXMsIHJlZ2FyZGxlc3MgaW4gd2hpY2ggb3JkZXIgdGhleQorbWlnaHQgYmUgc3RhcnRlZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzEudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1M2M1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzEudGhyaWZ0CkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvLyB2ZXJzaW9uIDEgb2YgdGhlIGludGVyZmFjZQorCituYW1lc3BhY2UgKiBTa2lwdGVzdC5PbmUKKworY29uc3QgaTMyIFNLSVBURVNUU0VSVklDRV9WRVJTSU9OID0gMQorCitzdHJ1Y3QgUG9uZyB7CisgIDEgOiBvcHRpb25hbCBpMzIgdmVyc2lvbjEKK30KKworc3RydWN0IFBpbmcgeworICAxIDogb3B0aW9uYWwgaTMyIHZlcnNpb24xCit9CisKK2V4Y2VwdGlvbiBQb25nRmFpbGVkIHsKKyAgMjIyIDogb3B0aW9uYWwgaTMyIHBvbmdFcnJvckNvZGUKK30KKworCitzZXJ2aWNlIFNraXBUZXN0U2VydmljZSB7CisgIHZvaWQgUGluZ1BvbmcoIDE6IFBpbmcgcG9uZykgdGhyb3dzICg0NDQ6IFBvbmdGYWlsZWQgcG9mKTsKK30KKworCisvLyBFT0YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8yLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8yLnRocmlmdApAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8gdmVyc2lvbiAyIG9mIHRoZSBpbnRlcmZhY2UKKworbmFtZXNwYWNlICogU2tpcHRlc3QuVHdvCisKK2NvbnN0IGkzMiBTS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTiA9IDIKKworc3RydWN0IFBvbmcgeworICAxIDogb3B0aW9uYWwgaTMyIHZlcnNpb24xCisgIDIgOiBvcHRpb25hbCBpMTYgdmVyc2lvbjIKK30KKworc3RydWN0IFBpbmcgeworICAxIDogb3B0aW9uYWwgaTMyIHZlcnNpb24xCisgIDEwIDogb3B0aW9uYWwgYm9vbCBib29sVmFsCisgIDExIDogb3B0aW9uYWwgYnl0ZSBieXRlVmFsCisgIDEyIDogb3B0aW9uYWwgZG91YmxlIGRiVmFsCisgIDEzIDogb3B0aW9uYWwgaTE2IGkxNlZhbAorICAxNCA6IG9wdGlvbmFsIGkzMiBpMzJWYWwKKyAgMTUgOiBvcHRpb25hbCBpNjQgaTY0VmFsCisgIDE2IDogb3B0aW9uYWwgc3RyaW5nIHN0clZhbAorICAxNyA6IG9wdGlvbmFsIFBvbmcgc3RydWN0VmFsCisgIDE4IDogb3B0aW9uYWwgbWFwPCBsaXN0PCBQb25nPiwgc2V0PCBzdHJpbmc+PiBtYXBWYWwKK30KKworZXhjZXB0aW9uIFBpbmdGYWlsZWQgeworICAxIDogb3B0aW9uYWwgaTMyIHBpbmdFcnJvckNvZGUKK30KKworZXhjZXB0aW9uIFBvbmdGYWlsZWQgeworICAyMjIgOiBvcHRpb25hbCBpMzIgcG9uZ0Vycm9yQ29kZQorICAxMCA6IG9wdGlvbmFsIGJvb2wgYm9vbFZhbAorICAxMSA6IG9wdGlvbmFsIGJ5dGUgYnl0ZVZhbAorICAxMiA6IG9wdGlvbmFsIGRvdWJsZSBkYlZhbAorICAxMyA6IG9wdGlvbmFsIGkxNiBpMTZWYWwKKyAgMTQgOiBvcHRpb25hbCBpMzIgaTMyVmFsCisgIDE1IDogb3B0aW9uYWwgaTY0IGk2NFZhbAorICAxNiA6IG9wdGlvbmFsIHN0cmluZyBzdHJWYWwKKyAgMTcgOiBvcHRpb25hbCBQb25nIHN0cnVjdFZhbAorICAxOCA6IG9wdGlvbmFsIG1hcDwgbGlzdDwgUG9uZz4sIHNldDwgc3RyaW5nPj4gbWFwVmFsCit9CisKKworc2VydmljZSBTa2lwVGVzdFNlcnZpY2UgeworICBQaW5nIFBpbmdQb25nKCAxOiBQaW5nIHBpbmcsIDM6IFBvbmcgcG9uZykgdGhyb3dzICgxOiBQaW5nRmFpbGVkIHBpZiwgNDQ0OiBQb25nRmFpbGVkIHBvZik7Cit9CisKKworLy8gRU9GCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNkNmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCkBAIC0wLDAgKzEsMjAxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gc2tpcHRlc3RfdmVyc2lvbjE7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICBTa2lwdGVzdC5PbmUsCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK2NvbnN0CisgIFJFUVVFU1RfRVhUICA9ICcucmVxdWVzdCc7CisgIFJFU1BPTlNFX0VYVCA9ICcucmVzcG9uc2UnOworCisKK2Z1bmN0aW9uIENyZWF0ZVBpbmcgOiBJUGluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzFDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CitlbmQ7CisKKwordHlwZQorICBURHVtbXlTZXJ2ZXIgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UpCisgIHByb3RlY3RlZAorICAgIC8vIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UKKyAgICBwcm9jZWR1cmUgUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmcpOworICBlbmQ7CisKKworcHJvY2VkdXJlIFREdW1teVNlcnZlci5QaW5nUG9uZyhjb25zdCBwaW5nOiBJUGluZyk7CisvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCitiZWdpbgorICBXcml0ZWxuKCctIHBlcmZvcm1pbmcgcmVxdWVzdCBmcm9tIHZlcnNpb24gJytJbnRUb1N0cihwaW5nLlZlcnNpb24xKSsnIGNsaWVudCcpOworZW5kOworCisKK2Z1bmN0aW9uIENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IHN0bSA6IFRTdHJlYW07IGFGb3JJbnB1dCA6IEJvb2xlYW4pIDogSVByb3RvY29sOwordmFyIGFkYXB0ICA6IElUaHJpZnRTdHJlYW07CisgICAgdHJhbnMgIDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIGFkYXB0ICA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpOworICBpZiBhRm9ySW5wdXQKKyAgdGhlbiB0cmFucyA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGFkYXB0LCBuaWwpCisgIGVsc2UgdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBuaWwsIGFkYXB0KTsKKyAgcmVzdWx0IDo9IHByb3RmYWN0LkdldFByb3RvY29sKCB0cmFucyk7CitlbmQ7CisKKworcHJvY2VkdXJlIENyZWF0ZVJlcXVlc3QoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bSAgICA6IFRGaWxlU3RyZWFtOworICAgIHBpbmcgICA6IElQaW5nOworICAgIHByb3RvICA6IElQcm90b2NvbDsKKyAgICBjbGllbnQgOiBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQ7ICAgLy8gd2UgbmVlZCBhY2Nlc3MgdG8gc2VuZC9yZWN2X3Bpbmdwb25nKCkKKyAgICBjbGlSZWYgOiBJVW5rbm93bjsgICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIHJlZmNvdW50CitiZWdpbgorICBXcml0ZWxuKCctIGNyZWF0aW5nIG5ldyByZXF1ZXN0Jyk7CisgIHN0bSA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFUVVFU1RfRVhUKycudG1wJywgZm1DcmVhdGUpOworICB0cnkKKyAgICBwaW5nIDo9IENyZWF0ZVBpbmc7CisKKyAgICAvLyBzYXZlIHJlcXVlc3QgZGF0YQorICAgIHByb3RvICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bSwgRkFMU0UpOworICAgIGNsaWVudCA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQuQ3JlYXRlKCBuaWwsIHByb3RvKTsKKyAgICBjbGlSZWYgOj0gY2xpZW50IGFzIElVbmtub3duOworICAgIGNsaWVudC5zZW5kX1BpbmdQb25nKCBwaW5nKTsKKworICBmaW5hbGx5CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIGNsaVJlZiA6PSBuaWw7CisgICAgc3RtLkZyZWU7CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKKworICBEZWxldGVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCk7CisgIFJlbmFtZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKycudG1wJywgZm5hbWUrUkVRVUVTVF9FWFQpOworZW5kOworCisKK3Byb2NlZHVyZSBSZWFkUmVzcG9uc2UoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bSAgICA6IFRGaWxlU3RyZWFtOworICAgIHByb3RvICA6IElQcm90b2NvbDsKKyAgICBjbGllbnQgOiBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQ7ICAgLy8gd2UgbmVlZCBhY2Nlc3MgdG8gc2VuZC9yZWN2X3Bpbmdwb25nKCkKKyAgICBjbGlSZWYgOiBJVW5rbm93bjsgICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIHJlZmNvdW50CitiZWdpbgorICBXcml0ZWxuKCctIHJlYWRpbmcgcmVzcG9uc2UnKTsKKyAgc3RtIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVTUE9OU0VfRVhULCBmbU9wZW5SZWFkKTsKKyAgdHJ5CisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIFRSVUUpOworICAgIGNsaWVudCA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQuQ3JlYXRlKCBwcm90bywgbmlsKTsKKyAgICBjbGlSZWYgOj0gY2xpZW50IGFzIElVbmtub3duOworICAgIGNsaWVudC5yZWN2X1BpbmdQb25nOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBQcm9jZXNzRmlsZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtSW4sIHN0bU91dCAgIDogVEZpbGVTdHJlYW07CisgICAgcHJvdEluLCBwcm90T3V0IDogSVByb3RvY29sOworICAgIHNlcnZlciA6IElQcm9jZXNzb3I7CitiZWdpbgorICBXcml0ZWxuKCctIHByb2Nlc3NpbmcgcmVxdWVzdCcpOworICBzdG1PdXQgOj0gbmlsOworICBzdG1JbiAgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIHN0bU91dCA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKworICAgIC8vIHByb2Nlc3MgcmVxdWVzdCBhbmQgd3JpdGUgcmVzcG9uc2UgZGF0YQorICAgIHByb3RJbiAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1JbiwgIFRSVUUpOworICAgIHByb3RPdXQgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1PdXQsIEZBTFNFKTsKKworICAgIHNlcnZlciA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggVER1bW15U2VydmVyLkNyZWF0ZSk7CisgICAgc2VydmVyLlByb2Nlc3MoIHByb3RJbiwgcHJvdE91dCk7CisKKyAgZmluYWxseQorICAgIHNlcnZlciA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBzdG1Jbi5GcmVlOworICAgIHN0bU91dC5GcmVlOworICAgIGlmIHNlcnZlciA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKycudG1wJywgZm5hbWUrUkVTUE9OU0VfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVGVzdCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7CitiZWdpbgorICAvLyB0cnkgdG8gcmVhZCBhbiBleGlzdGluZyByZXF1ZXN0CisgIGlmIEZpbGVFeGlzdHMoIGZuYW1lICsgUkVRVUVTVF9FWFQpIHRoZW4gYmVnaW4KKyAgICBQcm9jZXNzRmlsZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CisgIGVuZDsKKworICAvLyBjcmVhdGUgYSBuZXcgcmVxdWVzdCBhbmQgdHJ5IHRvIHByb2Nlc3MKKyAgQ3JlYXRlUmVxdWVzdCggcHJvdGZhY3QsIGZuYW1lKTsKKyAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgIFJlYWRSZXNwb25zZSggcHJvdGZhY3QsIGZuYW1lKTsKK2VuZDsKKworCitjb25zdAorICBGSUxFX0JJTkFSWSA9ICdwaW5ncG9uZy5iaW4nOworICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8xQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKKyAgICBUZXN0KCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgRklMRV9CSU5BUlkpOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdKU09OIHByb3RvY29sJyk7CisgICAgVGVzdCggVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCAgIEZJTEVfSlNPTik7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ1Rlc3QgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzLicpOworICAgIFdyaXRlbG47CisgICAgV3JpdGUoJ1ByZXNzIEVOVEVSIHRvIGNsb3NlIC4uLicpOyAgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2IyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKQEAgLTAsMCArMSwyMjggQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBza2lwdGVzdF92ZXJzaW9uMjsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCisgIFNraXB0ZXN0LlR3bywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKKworY29uc3QKKyAgUkVRVUVTVF9FWFQgID0gJy5yZXF1ZXN0JzsKKyAgUkVTUE9OU0VfRVhUID0gJy5yZXNwb25zZSc7CisKK2Z1bmN0aW9uIENyZWF0ZVBpbmcgOiBJUGluZzsKK3ZhciBsaXN0IDogSVRocmlmdExpc3Q8SVBvbmc+OworICAgIHNldF8gOiBJSGFzaFNldDxzdHJpbmc+OworYmVnaW4KKyAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKKyAgcmVzdWx0LkJvb2xWYWwgICA6PSBUUlVFOworICByZXN1bHQuQnl0ZVZhbCAgIDo9IDI7CisgIHJlc3VsdC5EYlZhbCAgICAgOj0gMzsKKyAgcmVzdWx0LkkxNlZhbCAgICA6PSA0OworICByZXN1bHQuSTMyVmFsICAgIDo9IDU7CisgIHJlc3VsdC5JNjRWYWwgICAgOj0gNjsKKyAgcmVzdWx0LlN0clZhbCAgICA6PSAnc2V2ZW4nOworCisgIHJlc3VsdC5TdHJ1Y3RWYWwgOj0gVFBvbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LlN0cnVjdFZhbC5WZXJzaW9uMSA6PSAtMTsKKyAgcmVzdWx0LlN0cnVjdFZhbC5WZXJzaW9uMiA6PSAtMjsKKworICBsaXN0IDo9IFRUaHJpZnRMaXN0SW1wbDxJUG9uZz4uQ3JlYXRlOworICBsaXN0LkFkZCggcmVzdWx0LlN0cnVjdFZhbCk7CisgIGxpc3QuQWRkKCByZXN1bHQuU3RydWN0VmFsKTsKKworICBzZXRfIDo9IFRIYXNoU2V0SW1wbDxzdHJpbmc+LkNyZWF0ZTsKKyAgc2V0Xy5BZGQoICdvbmUnKTsKKyAgc2V0Xy5BZGQoICd1bm8nKTsKKyAgc2V0Xy5BZGQoICdlaW5zJyk7CisgIHNldF8uQWRkKCAnZWVuJyk7CisKKyAgcmVzdWx0Lk1hcFZhbCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8IElUaHJpZnRMaXN0PElQb25nPiwgSUhhc2hTZXQ8c3RyaW5nPj4uQ3JlYXRlOworICByZXN1bHQuTWFwVmFsLkFkZCggbGlzdCwgc2V0Xyk7CitlbmQ7CisKKwordHlwZQorICBURHVtbXlTZXJ2ZXIgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UpCisgIHByb3RlY3RlZAorICAgIC8vIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UKKyAgICBmdW5jdGlvbiBQaW5nUG9uZyhjb25zdCBwaW5nOiBJUGluZzsgY29uc3QgcG9uZzogSVBvbmcpOiBJUGluZzsKKyAgZW5kOworCisKK2Z1bmN0aW9uIFREdW1teVNlcnZlci5QaW5nUG9uZyhjb25zdCBwaW5nOiBJUGluZzsgY29uc3QgcG9uZzogSVBvbmcpOiBJUGluZzsKKy8vIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UKK2JlZ2luCisgIFdyaXRlbG4oJy0gcGVyZm9ybWluZyByZXF1ZXN0IGZyb20gdmVyc2lvbiAnK0ludFRvU3RyKHBpbmcuVmVyc2lvbjEpKycgY2xpZW50Jyk7CisgIHJlc3VsdCA6PSBDcmVhdGVQaW5nOworZW5kOworCisKK2Z1bmN0aW9uIENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IHN0bSA6IFRTdHJlYW07IGFGb3JJbnB1dCA6IEJvb2xlYW4pIDogSVByb3RvY29sOwordmFyIGFkYXB0ICA6IElUaHJpZnRTdHJlYW07CisgICAgdHJhbnMgIDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIGFkYXB0ICA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpOworICBpZiBhRm9ySW5wdXQKKyAgdGhlbiB0cmFucyA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGFkYXB0LCBuaWwpCisgIGVsc2UgdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBuaWwsIGFkYXB0KTsKKyAgcmVzdWx0IDo9IHByb3RmYWN0LkdldFByb3RvY29sKCB0cmFucyk7CitlbmQ7CisKKworcHJvY2VkdXJlIENyZWF0ZVJlcXVlc3QoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bSAgICA6IFRGaWxlU3RyZWFtOworICAgIHBpbmcgICA6IElQaW5nOworICAgIHByb3RvICA6IElQcm90b2NvbDsKKyAgICBjbGllbnQgOiBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQ7ICAgLy8gd2UgbmVlZCBhY2Nlc3MgdG8gc2VuZC9yZWN2X3Bpbmdwb25nKCkKKyAgICBjbGlSZWYgOiBJVW5rbm93bjsgICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIHJlZmNvdW50CitiZWdpbgorICBXcml0ZWxuKCctIGNyZWF0aW5nIG5ldyByZXF1ZXN0Jyk7CisgIHN0bSA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFUVVFU1RfRVhUKycudG1wJywgZm1DcmVhdGUpOworICB0cnkKKyAgICBwaW5nIDo9IENyZWF0ZVBpbmc7CisKKyAgICAvLyBzYXZlIHJlcXVlc3QgZGF0YQorICAgIHByb3RvICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bSwgRkFMU0UpOworICAgIGNsaWVudCA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQuQ3JlYXRlKCBuaWwsIHByb3RvKTsKKyAgICBjbGlSZWYgOj0gY2xpZW50IGFzIElVbmtub3duOworICAgIGNsaWVudC5zZW5kX1BpbmdQb25nKCBwaW5nLCBwaW5nLlN0cnVjdFZhbCk7CisKKyAgZmluYWxseQorICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBjbGlSZWYgOj0gbmlsOworICAgIHN0bS5GcmVlOworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQpOworICBSZW5hbWVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZuYW1lK1JFUVVFU1RfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwaW5nICAgOiBJUGluZzsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSByZWFkaW5nIHJlc3BvbnNlJyk7CisgIHN0bSA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIC8vIHNhdmUgcmVxdWVzdCBkYXRhCisgICAgcHJvdG8gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtLCBUUlVFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggcHJvdG8sIG5pbCk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBwaW5nICAgOj0gY2xpZW50LnJlY3ZfUGluZ1Bvbmc7CisKKyAgZmluYWxseQorICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBjbGlSZWYgOj0gbmlsOworICAgIHN0bS5GcmVlOworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG1Jbiwgc3RtT3V0ICAgOiBURmlsZVN0cmVhbTsKKyAgICBwcm90SW4sIHByb3RPdXQgOiBJUHJvdG9jb2w7CisgICAgc2VydmVyIDogSVByb2Nlc3NvcjsKK2JlZ2luCisgIFdyaXRlbG4oJy0gcHJvY2Vzc2luZyByZXF1ZXN0Jyk7CisgIHN0bU91dCA6PSBuaWw7CisgIHN0bUluICA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFUVVFU1RfRVhULCBmbU9wZW5SZWFkKTsKKyAgdHJ5CisgICAgc3RtT3V0IDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVTUE9OU0VfRVhUKycudG1wJywgZm1DcmVhdGUpOworCisgICAgLy8gcHJvY2VzcyByZXF1ZXN0IGFuZCB3cml0ZSByZXNwb25zZSBkYXRhCisgICAgcHJvdEluICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bUluLCAgVFJVRSk7CisgICAgcHJvdE91dCA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bU91dCwgRkFMU0UpOworCisgICAgc2VydmVyIDo9IFRTa2lwVGVzdFNlcnZpY2UuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBURHVtbXlTZXJ2ZXIuQ3JlYXRlKTsKKyAgICBzZXJ2ZXIuUHJvY2VzcyggcHJvdEluLCBwcm90T3V0KTsKKworICBmaW5hbGx5CisgICAgc2VydmVyIDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIHN0bUluLkZyZWU7CisgICAgc3RtT3V0LkZyZWU7CisgICAgaWYgc2VydmVyID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKKworICBEZWxldGVGaWxlKCBmbmFtZStSRVNQT05TRV9FWFQpOworICBSZW5hbWVGaWxlKCBmbmFtZStSRVNQT05TRV9FWFQrJy50bXAnLCBmbmFtZStSRVNQT05TRV9FWFQpOworZW5kOworCisKK3Byb2NlZHVyZSBUZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK2JlZ2luCisgIC8vIHRyeSB0byByZWFkIGFuIGV4aXN0aW5nIHJlcXVlc3QKKyAgaWYgRmlsZUV4aXN0cyggZm5hbWUgKyBSRVFVRVNUX0VYVCkgdGhlbiBiZWdpbgorICAgIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCwgZm5hbWUpOworICAgIFJlYWRSZXNwb25zZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgZW5kOworCisgIC8vIGNyZWF0ZSBhIG5ldyByZXF1ZXN0IGFuZCB0cnkgdG8gcHJvY2VzcworICBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCwgZm5hbWUpOworICBQcm9jZXNzRmlsZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCwgZm5hbWUpOworZW5kOworCisKK2NvbnN0CisgIEZJTEVfQklOQVJZID0gJ3Bpbmdwb25nLmJpbic7CisgIEZJTEVfSlNPTiAgID0gJ3Bpbmdwb25nLmpzb24nOworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ0RlbHBoaSBTa2lwVGVzdCAnK0ludFRvU3RyKFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04pKycgdXNpbmcgJytUaHJpZnQuVmVyc2lvbik7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ0JpbmFyeSBwcm90b2NvbCcpOworICAgIFRlc3QoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCBGSUxFX0JJTkFSWSk7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ0pTT04gcHJvdG9jb2wnKTsKKyAgICBUZXN0KCBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsICAgRklMRV9KU09OKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignVGVzdCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvcnMuJyk7CisgICAgV3JpdGVsbjsKKyAgICBXcml0ZSgnUHJlc3MgRU5URVIgdG8gY2xvc2UgLi4uJyk7ICBSZWFkbG47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpAQCAtMCwwICsxLDkwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gVGVzdFR5cGVSZWdpc3RyeTsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUeXBJbmZvLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIERlYnVnUHJvdG9UZXN0OworCit0eXBlCisgIFRlc3RlcjxUIDogSUludGVyZmFjZT4gPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgVGVzdDsKKyAgZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVGVzdGVyPFQ+LlRlc3Q7Cit2YXIgaW5zdGFuY2UgOiBUOworICAgIG5hbWUgOiBzdHJpbmc7CitiZWdpbgorICBpbnN0YW5jZSA6PSBUeXBlUmVnaXN0cnkuQ29uc3RydWN0PFQ+OworICBuYW1lIDo9IEdldFR5cGVOYW1lKFR5cGVJbmZvKFQpKTsKKyAgaWYgaW5zdGFuY2UgPD4gbmlsCisgIHRoZW4gV3JpdGVsbiggbmFtZSwgJyA9IG9rJykKKyAgZWxzZSBiZWdpbgorICAgIFdyaXRlbG4oIG5hbWUsICcgPSBmYWlsZWQnKTsKKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCAnVGVzdCB3aXRoICcrbmFtZSsnIGZhaWxlZCEnKTsKKyAgZW5kOworZW5kOworCitiZWdpbgorICBXcml0ZWxuKCdUZXN0aW5nIC4uLicpOworICBUZXN0ZXI8SURvdWJsZXM+LlRlc3Q7CisgIFRlc3RlcjxJT25lT2ZFYWNoPi5UZXN0OworICBUZXN0ZXI8SUJvbms+LlRlc3Q7CisgIFRlc3RlcjxJTmVzdGluZz4uVGVzdDsKKyAgVGVzdGVyPElIb2x5TW9sZXk+LlRlc3Q7CisgIFRlc3RlcjxJQmFja3dhcmRzPi5UZXN0OworICBUZXN0ZXI8SUVtcHR5Pi5UZXN0OworICBUZXN0ZXI8SVdyYXBwZXI+LlRlc3Q7CisgIFRlc3RlcjxJUmFuZG9tU3R1ZmY+LlRlc3Q7CisgIFRlc3RlcjxJQmFzZTY0Pi5UZXN0OworICBUZXN0ZXI8SUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJU2luZ2xlTWFwVGVzdFN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElCbG93VXA+LlRlc3Q7CisgIFRlc3RlcjxJUmV2ZXJzZU9yZGVyU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhTb21lRW51bT4uVGVzdDsKKyAgVGVzdGVyPElUZXN0VW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJVGVzdFVuaW9uTWludXNTdHJpbmdGaWVsZD4uVGVzdDsKKyAgVGVzdGVyPElDb21wYXJhYmxlVW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJU3RydWN0V2l0aEFVbmlvbj4uVGVzdDsKKyAgVGVzdGVyPElQcmltaXRpdmVUaGVuU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhBU29tZW1hcD4uVGVzdDsKKyAgVGVzdGVyPElCaWdGaWVsZElkU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SUJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2w+LlRlc3Q7CisgIFRlc3RlcjxJVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFdyaXRlbG4oJ0NvbXBsZXRlZC4nKTsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvTWFrZWZpbGUuYW0gYi9saWIvZXJsL01ha2VmaWxlLmFtCmluZGV4IDMzNzYxYTEuLjA2MzIzYjQgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvTWFrZWZpbGUuYW0KKysrIGIvbGliL2VybC9NYWtlZmlsZS5hbQpAQCAtMTcsMTMgKzE3LDQ1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1NT0RVTEVTID0gXAotCXNyYworVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX09NSVRfRklMRSA9IHRlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKK1RIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgdGVzdC8qLnRocmlmdCkgXAorCQkgICQoVEhSSUZUX09NSVRfRklMRSkgXAorCQkgIC4uLy4uL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAotYWxsIGNsZWFuIGRvY3M6Ci0JZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCi0JCShjZCAkJGRpcjsgJHtNQUtFfSAkQCk7IFwKK2lmIEVSTEFOR19PVFAxNgorRVJMX0ZMQUcgPSBlcmw6b3RwMTYKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpvdHAxNixsZWdhY3luYW1lcworIyBvdHAxNiArIG1hcHMgZG9lcyBub3QgbWFrZSBzZW5zZS4gV2UgbmVlZCB0byBnZW5lcmF0ZSBpdCBhbnl3YXkgdG8gYXZvaWQgaW5jbHVkZSBlcnJvci4KK0VSTF9GTEFHX01BUFMgPSBlcmw6b3RwMTYKK2Vsc2UKK0VSTF9GTEFHID0gZXJsCitFUkxfRkxBR19MRUdBQ1kgPSBlcmw6bGVnYWN5bmFtZXMKK0VSTF9GTEFHX01BUFMgPSBlcmw6bWFwcworZW5kaWYKKworJChUSFJJRlRfT01JVF9GSUxFKTogdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdAorCWdyZXAgLXYgb21pdCAkPCA+JEAKKworLmdlbmVyYXRlZDogJChUSFJJRlQpICQoVEhSSUZUX0ZJTEVTKQorCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKKwkJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHRlc3QgJCRmIDsgXAogCWRvbmUKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19MRUdBQ1kpIC1vIHRlc3QgdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19NQVBTKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKKwl0b3VjaCAuZ2VuZXJhdGVkCisKK2FsbDogLmdlbmVyYXRlZAorCSQoUkVCQVIpIGdldC1kZXBzCisJJChSRUJBUikgY29tcGlsZQorCitjaGVjazogLmdlbmVyYXRlZAorCSQoUkVCQVIpIC1DIHJlYmFyLnRlc3QuY29uZmlnIGdldC1kZXBzCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgY29tcGlsZQorCSQoUkVCQVIpIC1DIHJlYmFyLnRlc3QuY29uZmlnIHNraXBfZGVwcz10cnVlIGV1bml0CiAKIGluc3RhbGw6IGFsbAogCW1rZGlyIC1wICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KSA7IFwKQEAgLTM3LDggKzY5LDIzIEBACiB1bmluc3RhbGw6CiAJcm0gLXJmICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KQogCitjbGVhbjoKKwlybSAtZiAuZ2VuZXJhdGVkCisJcm0gLXJmIHRlc3QvZ2VuLWVybC8KKwlybSAtZiAkKFRIUklGVF9PTUlUX0ZJTEUpCisJJChSRUJBUikgY2xlYW4KIAogbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKIAlybSAtcmYgZWJpbgogCitFWFRSQV9ESVNUID0gXAorCWluY2x1ZGUgXAorCXNyYyBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJcmViYXIuY29uZmlnIFwKKwlyZWJhci5jb25maWcuc2NyaXB0IFwKKwlyZWJhci50ZXN0LmNvbmZpZyBcCisJdGVzdCBcCisJUkVBRE1FLm1kCisKIE1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvUkVBRE1FIGIvbGliL2VybC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYjY5NDYuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1UaHJpZnQgRXJsYW5nIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotRXhhbXBsZQotPT09PT09PQotCi1FeGFtcGxlIHNlc3Npb24gdXNpbmcgdGhyaWZ0X2NsaWVudDoKLQotMTE4PiBmKCksIHtvaywgQ30gPSB0aHJpZnRfY2xpZW50OnN0YXJ0X2xpbmsoImxvY2FsaG9zdCIsIDkwOTAsIHRocmlmdFRlc3RfdGhyaWYKLXQpLgote29rLDwwLjI3MS4wPn0KLTExOT4gdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RWb2lkLCBbXSkuCi17b2ssb2t9Ci0xMjA+IHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0Vm9pZCwgW2FzZGZdKS4KLXtlcnJvcix7YmFkX2FyZ3MsdGVzdFZvaWQsW2FzZGZdfX0KLTEyMT4gdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RJMzIsIFsxMjNdKS4KLXtvaywxMjN9Ci0xMjI+IHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0T25ld2F5LCBbMV0pLgote29rLG9rfQotMTIzPiBjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoQywgdGVzdFhjZXB0aW9uLCBbImZvbyJdKS4KLXtlcnJvcix7bm9fZnVuY3Rpb24sdGVzdFhjZXB0aW9ufX0KLTEyND4gY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RFeGNlcHRpb24sIFsiZm9vIl0pLgote29rLG9rfQotMTI1PiBjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoQywgdGVzdEV4Y2VwdGlvbiwgWyJYY2VwdGlvbiJdKS4KLXt4Y2VwdGlvbiwxMDAxLCJUaGlzIGlzIGFuIFhjZXB0aW9uIn0KLTEyNj4gdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RFeGNlcHRpb24sIFsiWGNlcHRpb24iXSkuCi0KLT1FUlJPUiBSRVBPUlQ9PT09IDI0LUZlYi0yMDA4OjoyMzowMDoyMyA9PT0KLUVycm9yIGluIHByb2Nlc3MgPDAuMjY5LjA+IHdpdGggZXhpdCB2YWx1ZToge3tub2NhdGNoLHt4Y2VwdGlvbiwxMDAxLCJUaGlzIGlzIGFuCi0gWGNlcHRpb24ifX0sW3t0aHJpZnRfY2xpZW50LGNhbGwsM30se2VybF9ldmFsLGRvX2FwcGx5LDV9LHtzaGVsbCxleHBycyw2fSx7c2hlbAotbCxldmFsX2xvb3AsM31dfQotCi0qKiBleGl0ZWQ6IHt7bm9jYXRjaCx7eGNlcHRpb24sMTAwMSwiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9fSwKLSAgICAgICAgICAgIFt7dGhyaWZ0X2NsaWVudCxjYWxsLDN9LAotICAgICAgICAgICAgIHtlcmxfZXZhbCxkb19hcHBseSw1fSwKLSAgICAgICAgICAgICB7c2hlbGwsZXhwcnMsNn0sCi0gICAgICAgICAgICAge3NoZWxsLGV2YWxfbG9vcCwzfV19ICoqCmRpZmYgLS1naXQgYS9saWIvZXJsL1JFQURNRS5tZCBiL2xpYi9lcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2QwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL1JFQURNRS5tZApAQCAtMCwwICsxLDUxIEBACisjIFRocmlmdCBFcmxhbmcgU29mdHdhcmUgTGlicmFyeSAjCisKKyMjIExpY2Vuc2UgIyMKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIFJlbGVhc2UgTm90ZXMgIyMKKworIyMjIDAuOS4yICMjIworCithcyBvZiAwLjkuMiBzdHJ1Y3QgYW5kIGZ1bmN0aW9uIG5hbWluZyBjb252ZW50aW9ucyBoYXZlIGNoYW5nZWQuIHRvIHJldGFpbiB0aGUKK29sZCBuYW1pbmcgY29udmVudGlvbnMgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgdXNlIHRoZSBjb21waWxlciBvcHRpb24KK2BsZWdhY3luYW1lc2AKKworIyMgRXhhbXBsZSAjIworCitFeGFtcGxlIHNlc3Npb24gdXNpbmcgdGhyaWZ0X2NsaWVudDoKKworYGBgZXJsCisxPiB7b2ssIEMwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoImxvY2FsaG9zdCIsIDkwOTAsIHRocmlmdF90ZXN0X3RocmlmdCwgW10pLCBvay4KK29rCisyPiB7QzEsIFIxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMCwgdGVzdFZvaWQsIFtdKSwgUjEuCit7b2ssb2t9CiszPiB7QzIsIFIyfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMSwgdGVzdFZvaWQsIFthc2RmXSksIFIyLgore2Vycm9yLHtiYWRfYXJncyx0ZXN0Vm9pZCxbYXNkZl19fQorND4ge0MzLCBSM30gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzIsIHRlc3RJMzIsIFsxMjNdKSwgUjMuCit7b2ssMTIzfQorNT4ge0M0LCBSNH0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzMsIHRlc3RPbmV3YXksIFsxXSksIFI0Lgore29rLG9rfQorNj4ge0M1LCBSNX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzQsIHRlc3RYY2VwdGlvbiwgWyJmb28iXSksIFI1Lgore2Vycm9yLHtub19mdW5jdGlvbix0ZXN0WGNlcHRpb259fQorNz4ge0M2LCBSNn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzUsIHRlc3RFeGNlcHRpb24sIFsiZm9vIl0pLCBSNi4KK3tvayxva30KKzg+IHtDNywgUjd9ID0gKGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbChDNiwgdGVzdEV4Y2VwdGlvbiwgWyJYY2VwdGlvbiJdKSksIFI3Lgore2V4Y2VwdGlvbix7eGNlcHRpb24sMTAwMSw8PCJYY2VwdGlvbiI+Pn19CitgYGAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvYnVpbGQvYmVhbXZlciBiL2xpYi9lcmwvYnVpbGQvYmVhbXZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1Zjc3Yi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL2JlYW12ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBlcmx3YXJlU3lzOiBvdHAvYnVpbGQvYmVhbXZlcix2IDEuMSAyMDAyLzAyLzE0IDExOjQ1OjIwIGhhbCBFeHAgJAotCi0jIHVzYWdlOiBiZWFtdmVyIDxiZWFtX2ZpbGU+Ci0jCi0jIGlmIHRoZXJlJ3MgYSB1c2FibGUgLXZzbigpIGF0dHJpYnV0ZSwgcHJpbnQgaXQgYW5kIGV4aXQgd2l0aCBzdGF0dXMgMAotIyBvdGhlcndpc2UsIHByaW50IG5vdGhpbmcgYW5kIGV4aXQgd2l0aCBzdGF0dXMgMQotCi0jIEZyb20gdGhlIEVybGFuZyBzaGVsbDoKLSMKLSMgNT4gY29kZTp3aGljaChhY2NhX2luZXRzKS4KLSMgIi9ob21lL21hcnRpbi93b3JrL290cC9yZWxlYXNlcy88YXBwPi8uLi8uLi9hY2NhL2ViaW4vPGFwcD4uYmVhbSIKLSMKLSMgOD4gYmVhbV9saWI6dmVyc2lvbihjb2RlOndoaWNoKDxhcHA+KSkuCi0jIHtvayx7PGFwcD4sWyckSWQ6IGJlYW12ZXIsdiAxLjEuMS4xIDIwMDMvMDYvMTMgMjE6NDM6MjEgbWxvZ2FuIEV4cCAkICddfX0KLQotIyBUTVBGSUxFIGxvb2tzIGxpa2UgdGhpczoKLSMKLSMgaW86Zm9ybWF0KCJoZWxsbyB+cH5uIiwKLSMgICBiZWFtX2xpYjp2ZXJzaW9uKCIvaG9tZS9oYWwvd29yay9vdHAvYWNjYS9lYmluL2FjY2FfaW5ldHMuYmVhbSIpXSkuCi0KLVRNUEZJTEU9L3RtcC9iZWFtdmVyLiQkCi0KLSMgZXhpdCB3aXRoIGZhaWx1cmUgaWYgd2UgY2FuJ3QgcmVhZCB0aGUgZmlsZQotdGVzdCAtZiAiJDEiIHx8IGV4aXQgMQotQkVBTUZJTEU9XCIkMVwiCi0KLWNhdCA+ICRUTVBGSUxFIDw8X0VPRgotaW86Zm9ybWF0KCJ+cH5uIiwKLSAgW2JlYW1fbGliOnZlcnNpb24oJEJFQU1GSUxFKV0pLgotX0VPRgotCi0jIGJlYW1fcmVzdWx0IGlzIHtvayx7TW9kdWxlX25hbWUsIEJlYW1fdmVyc2lvbn0gb3Ige2Vycm9yLGJlYW1fbGliLHtSZWFzb259fQotYmVhbV9yZXN1bHQ9YGVybCAtbm9zaGVsbCBcCi0gIC1zIGZpbGUgZXZhbCAkVE1QRklMRSBcCi0gIC1zIGVybGFuZyBoYWx0YAotCi1ybSAtZiAkVE1QRklMRQotCi0jIHNlZCByZWdleGVzOgotIyAgIHJlbW92ZSBicmFja2V0cyBhbmQgYW55dGhpbmcgb3V0c2lkZSB0aGVtCi0jICAgcmVtb3ZlIHF1b3RlcyBhbmQgYW55dGhpbmcgb3V0c2lkZSB0aGVtCi0jICAgcmVtb3ZlIGFwb3N0cm9waGVzIGFuZCBhbnl0aGluZyBvdXRzaWRlIHRoZW0KLSMgICByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzCi0KLWNhc2UgJGJlYW1fcmVzdWx0IGluCi1ce29rKikKLSAgZWNobyAkYmVhbV9yZXN1bHQgfCBzZWQgLWUgJ3MvLipcW1woLipcKV0uKi9cMS8nICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzLy4qXCJcKC4qXClcIi4qL1wxLycgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAtZSAicy8uKlwnXCguKlwpXCcuKi9cMS8iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvICokLy8nIC1lICdzL14gKi8vJwotICBleGl0IDAKLSAgOzsKLSopCi0gIGV4aXQgMQotICA7OwotZXNhYwotCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL2J1aWxkdGFyZ2V0cy5tayBiL2xpYi9lcmwvYnVpbGQvYnVpbGR0YXJnZXRzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjUyYjc4Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvYnVpbGQvYnVpbGR0YXJnZXRzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotRUJJTiA/PSAuLi9lYmluCi1FU1JDID89IC4KLUVNVUxBVE9SID0gYmVhbQotCi1FUkxDX1dGTEFHUyA9IC1XCi1FUkxDID0gZXJsYyAkKEVSTENfV0ZMQUdTKSAkKEVSTENfRkxBR1MpCi1FUkwgPSBlcmwgLWJvb3Qgc3RhcnRfY2xlYW4KLQotJChFQklOKS8lLmJlYW06ICQoRVNSQykvJS5lcmwKLQlAZWNobyAiICAgRVJMQyAgJDwiCi0JQCQoRVJMQykgJChFUkxfRkxBR1MpICQoRVJMX0NPTVBJTEVfRkxBR1MpIC1vJChFQklOKSAkPAotCi0uZXJsLmJlYW06Ci0JJChFUkxDKSAkKEVSTF9GTEFHUykgJChFUkxfQ09NUElMRV9GTEFHUykgLW8kKGRpciAkQCkgJDwKLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9jb2xvcnMubWsgYi9saWIvZXJsL2J1aWxkL2NvbG9ycy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2OWM0MS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL2NvbG9ycy5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgQ29sb3JzIHRvIGFzc2lzdCB2aXN1YWwgaW5zcGVjdGlvbiBvZiBtYWtlIG91dHB1dC4KLQotIyBDb2xvcnMKLUxHUkFZPSQkJ1xlWzA7MzdtJwotREdSQVk9JCQnXGVbMTszMG0nCi1MR1JFRU49JCQnXGVbMTszMm0nCi1MQkxVRT0kJCdcZVsxOzM0bScKLUxDWUFOPSQkJ1xlWzE7MzZtJwotTFBVUlBMRT0kJCdcZVsxOzM1bScKLUxSRUQ9JCQnXGVbMTszMW0nCi1OT19DT0xPUj0kJCdcZVswbScKLURFRkFVTFQ9JCQnXGVbMG0nCi1CTEFDSz0kJCdcZVswOzMwbScKLUJMVUU9JCQnXGVbMDszNG0nCi1HUkVFTj0kJCdcZVswOzMybScKLUNZQU49JCQnXGVbMDszNm0nCi1SRUQ9JCQnXGVbMDszMW0nCi1QVVJQTEU9JCQnXGVbMDszNW0nCi1CUk9XTj0kJCdcZVswOzMzbScKLVlFTExPVz0kJCdcZVsxOzMzbScKLVdISVRFPSQkJ1xlWzE7MzdtJwotCi1CT0xEPSQkJ1xlWzE7MzdtJwotT0ZGPSQkJ1xlWzBtJwpkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9kb2NzLm1rIGIvbGliL2VybC9idWlsZC9kb2NzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI3Mzc3Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvYnVpbGQvZG9jcy5taworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLUVET0NfUEFUSD0uLi8uLi8uLi90b29scy91dGlsaXRpZXMKLQotI3NpbmdsZSBwbGFjZSB0byBpbmNsdWRlIGRvY3MgZnJvbS4KLWRvY3M6Ci0JQG1rZGlyIC1wIC4uL2RvYwotCUBlY2hvIC1uICQke01ZX0JMVUU6LSQoQkxVRSl9OyBcCi0JJChFRE9DX1BBVEgpL2Vkb2MgJChBUFBfTkFNRSk7IFwKLQlpZiBbICQkPyAtZXEgMCBdOyB0aGVuIFwKLQkJZWNobyAkJHtNWV9MUkVEOi0kKExSRUQpfSIkJGQgRG9jIEZhaWxlZCI7IFwKLQlmaTsgXAotCWVjaG8gLW4gJChPRkYpJChOT19DT0xPUikJCi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvYnVpbGQvbWltZS50eXBlcyBiL2xpYi9lcmwvYnVpbGQvbWltZS50eXBlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlM2MwZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL21pbWUudHlwZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0KLWFwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2UKLWFwcGxpY2F0aW9uL2FuZHJldy1pbnNldAotYXBwbGljYXRpb24vYXBwbGVmaWxlCi1hcHBsaWNhdGlvbi9hdG9taWNtYWlsCi1hcHBsaWNhdGlvbi9kY2EtcmZ0Ci1hcHBsaWNhdGlvbi9kZWMtZHgKLWFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MAlocXgKLWFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvCWNwdAotYXBwbGljYXRpb24vbWFjd3JpdGVpaQotYXBwbGljYXRpb24vbXN3b3JkCQlkb2MKLWFwcGxpY2F0aW9uL25ld3MtbWVzc2FnZS1pZAotYXBwbGljYXRpb24vbmV3cy10cmFuc21pc3Npb24KLWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQliaW4gZG1zIGxoYSBsemggZXhlIGNsYXNzCi1hcHBsaWNhdGlvbi9vZGEJCQlvZGEKLWFwcGxpY2F0aW9uL3BkZgkJCXBkZgotYXBwbGljYXRpb24vcG9zdHNjcmlwdAkJYWkgZXBzIHBzCi1hcHBsaWNhdGlvbi9wb3dlcnBvaW50CQlwcHQKLWFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZwotYXBwbGljYXRpb24vcnRmCQkJcnRmCi1hcHBsaWNhdGlvbi9zbGF0ZQotYXBwbGljYXRpb24vd2l0YQotYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjEKLWFwcGxpY2F0aW9uL3gtYmNwaW8JCWJjcGlvCi1hcHBsaWNhdGlvbi94LWNkbGluawkJdmNkCi1hcHBsaWNhdGlvbi94LWNvbXByZXNzCQlaCi1hcHBsaWNhdGlvbi94LWNwaW8JCWNwaW8KLWFwcGxpY2F0aW9uL3gtY3NoCQljc2gKLWFwcGxpY2F0aW9uL3gtZGlyZWN0b3IJCWRjciBkaXIgZHhyCi1hcHBsaWNhdGlvbi94LWR2aQkJZHZpCi1hcHBsaWNhdGlvbi94LWd0YXIJCWd0YXIKLWFwcGxpY2F0aW9uL3gtZ3ppcAkJZ3oKLWFwcGxpY2F0aW9uL3gtaGRmCQloZGYKLWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpCQljZ2kKLWFwcGxpY2F0aW9uL3gta29hbgkJc2twIHNrZCBza3Qgc2ttCi1hcHBsaWNhdGlvbi94LWxhdGV4CQlsYXRleAotYXBwbGljYXRpb24veC1taWYJCW1pZgotYXBwbGljYXRpb24veC1uZXRjZGYJCW5jIGNkZgotYXBwbGljYXRpb24veC1zaAkJc2gKLWFwcGxpY2F0aW9uL3gtc2hhcgkJc2hhcgotYXBwbGljYXRpb24veC1zdHVmZml0CQlzaXQKLWFwcGxpY2F0aW9uL3gtc3Y0Y3BpbwkJc3Y0Y3BpbwotYXBwbGljYXRpb24veC1zdjRjcmMJCXN2NGNyYwotYXBwbGljYXRpb24veC10YXIJCXRhcgotYXBwbGljYXRpb24veC10Y2wJCXRjbAotYXBwbGljYXRpb24veC10ZXgJCXRleAotYXBwbGljYXRpb24veC10ZXhpbmZvCQl0ZXhpbmZvIHRleGkKLWFwcGxpY2F0aW9uL3gtdHJvZmYJCXQgdHIgcm9mZgotYXBwbGljYXRpb24veC10cm9mZi1tYW4JCW1hbgotYXBwbGljYXRpb24veC10cm9mZi1tZQkJbWUKLWFwcGxpY2F0aW9uL3gtdHJvZmYtbXMJCW1zCi1hcHBsaWNhdGlvbi94LXVzdGFyCQl1c3RhcgotYXBwbGljYXRpb24veC13YWlzLXNvdXJjZQlzcmMKLWFwcGxpY2F0aW9uL3ppcAkJCXppcAotYXVkaW8vYmFzaWMJCQlhdSBzbmQKLWF1ZGlvL21wZWcJCQltcGdhIG1wMgotYXVkaW8veC1haWZmCQkJYWlmIGFpZmYgYWlmYwotYXVkaW8veC1wbi1yZWFsYXVkaW8JCXJhbQotYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luCXJwbQotYXVkaW8veC1yZWFsYXVkaW8JCXJhCi1hdWRpby94LXdhdgkJCXdhdgotY2hlbWljYWwveC1wZGIJCQlwZGIgeHl6Ci1pbWFnZS9naWYJCQlnaWYKLWltYWdlL2llZgkJCWllZgotaW1hZ2UvanBlZwkJCWpwZWcganBnIGpwZQotaW1hZ2UvcG5nCQkJcG5nCi1pbWFnZS90aWZmCQkJdGlmZiB0aWYKLWltYWdlL3gtY211LXJhc3RlcgkJcmFzCi1pbWFnZS94LXBvcnRhYmxlLWFueW1hcAkJcG5tCi1pbWFnZS94LXBvcnRhYmxlLWJpdG1hcAkJcGJtCi1pbWFnZS94LXBvcnRhYmxlLWdyYXltYXAJcGdtCi1pbWFnZS94LXBvcnRhYmxlLXBpeG1hcAkJcHBtCi1pbWFnZS94LXJnYgkJCXJnYgotaW1hZ2UveC14Yml0bWFwCQkJeGJtCi1pbWFnZS94LXhwaXhtYXAJCQl4cG0KLWltYWdlL3gteHdpbmRvd2R1bXAJCXh3ZAotbWVzc2FnZS9leHRlcm5hbC1ib2R5Ci1tZXNzYWdlL25ld3MKLW1lc3NhZ2UvcGFydGlhbAotbWVzc2FnZS9yZmM4MjIKLW11bHRpcGFydC9hbHRlcm5hdGl2ZQotbXVsdGlwYXJ0L2FwcGxlZG91YmxlCi1tdWx0aXBhcnQvZGlnZXN0Ci1tdWx0aXBhcnQvbWl4ZWQKLW11bHRpcGFydC9wYXJhbGxlbAotdGV4dC9odG1sCQkJaHRtbCBodG0KLXRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwJc2h0bWwKLXRleHQvcGxhaW4JCQl0eHQKLXRleHQvcmljaHRleHQJCQlydHgKLXRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMJdHN2Ci10ZXh0L3gtc2V0ZXh0CQkJZXR4Ci10ZXh0L3gtc2dtbAkJCXNnbWwgc2dtCi12aWRlby9tcGVnCQkJbXBlZyBtcGcgbXBlCi12aWRlby9xdWlja3RpbWUJCQlxdCBtb3YKLXZpZGVvL3gtbXN2aWRlbwkJCWF2aQotdmlkZW8veC1zZ2ktbW92aWUJCW1vdmllCi14LWNvbmZlcmVuY2UveC1jb29sdGFsawkJaWNlCi14LXdvcmxkL3gtdnJtbAkJCXdybCB2cm1sCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL290cC5tayBiL2xpYi9lcmwvYnVpbGQvb3RwLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDE2ZTJjLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvYnVpbGQvb3RwLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0jICRJZDogb3RwLm1rLHYgMS40IDIwMDQvMDcvMDEgMTQ6NTc6MTAgdGZlZSBFeHAgJAotIyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQotIyBvdHAubWsKLSMgLSB0byBiZSBpbmNsdWRlZCBpbiBhbGwgT1RQIE1ha2VmaWxlcwotIyBpbnN0YWxsZWQgdG8gL3Vzci9sb2NhbC9pbmNsdWRlL2VybGFuZy9vdHAubWsKLQotIyBnbWFrZSBsb29rcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgLSB0aGF0J3MgaGFyZC1jb2RlZAotIyB1c2VycyBvZiB0aGlzIGZpbGUgd2lsbCB1c2UKLSMgaW5jbHVkZSBlcmxhbmcvdG9wLm1rCi0KLSMgbW9zdCBpbnRlcmZhY2UgZmlsZXMgd2lsbCBiZSBpbnN0YWxsZWQgdG8gJEVSTF9SVU5fVE9QL2FwcC12c24vaW5jbHVkZS8qLmhybAotCi0jIGdyb3VwIG93bmVyIGZvciBsaWJyYXJ5L2luY2x1ZGUgZGlyZWN0b3JpZXMKLUVSTEFOR0RFVl9HUk9VUD1lcmxhbmdkZXYKLQotIyBFUkxfVE9QIGlzIHJvb3Qgb2YgRXJsYW5nIHNvdXJjZSB0cmVlCi0jIEVSTF9SVU5fVE9QIGlzIHJvb3Qgb2YgRXJsYW5nIHRhcmdldCB0cmVlIChzb21lIEVyaWNzc29uIE1ha2VmaWxlcyB1c2UgJFJPT1QpCi0jIEVSTEFOR19PVFAgaXMgdGFyZ2V0IHJvb3QgZm9yIEVybGFuZyBjb2RlCi0jIC0gc2VlIHNhc2wvc3lzdG9vbHMgcmVmZXJlbmNlIG1hbnVhbCBwYWdlOyBncmVwICJURVNUIgotCi0jIE9TX1RZUEUgaXMgRnJlZUJTRCwgTmV0QlNELCBPcGVuQlNELCBMaW51eCwgU0NPX1NWLCBTdW5PUy4KLU9TX1RZUEU9JHtzaGVsbCB1bmFtZX0KLQotIyBNSE9TVCBpcyB0aGUgaG9zdCB3aGVyZSB0aGlzIE1ha2VmaWxlIHJ1bnMuCi1NSE9TVD0ke3NoZWxsIGhvc3RuYW1lIC1zfQotRVJMX0NPTVBJTEVfRkxBR1MrPS1XMAotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgZXJsYW5nIHJ1bnRpbWUgc3lzdGVtLgotaWZuZGVmIEVSTF9SVU5fVE9QCi1FUkxfUlVOX1RPUD0vdXNyL2xvY2FsL2xpYi9lcmxhbmcKLWVuZGlmCi0KLQotIyBFZGl0IHRvIHJlZmxlY3QgbG9jYWwgZW52aXJvbm1lbnQuCi0jIGlmZXEgKCR7T1NfVFlQRX0sTGludXgpCi0jIEVSTF9SVU5fVE9QPS91c3IvbG9jYWwvbGliL2VybGFuZwotIyAgTm90ZSogRVJMX1JVTl9UT1AgY2FuIGJlIGRldGVybWluZWQgYnkgc3RhcnRpbmcgYW4KLSMgICAgICAgIGVybGFuZyBzaGVsbCBhbmQgdHlwaW5nIGNvZGU6cm9vdF9kaXIoKS4KLSMgRVJMX1RPUD1hIHN5bWJvbGljIGxpbmsgdG8gdGhlIGFjdHVhbCBzb3VyY2UgdG9wLCB3aGljaCBjaGFuZ2VzIGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uCi0jICBOb3RlKiBFUkxfVE9QIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGVybGFuZwotIyAgICAgICAgc291cmNlIGZpbGVzIHJlc2lkZS4gTWFrZSBzdXJlIHRvIHJ1biAuL2NvbmZpZ3VyZSB0aGVyZS4KLSMgVEFSR0VUPWk2ODYtcGMtbGludXgtZ251Ci0jICBOb3RlKiBUYXJnZXQgY2FuIGJlIGZvdW5kIGluICRFUkxfVE9QL2VydHMKLSMgZW5kaWYKLQotIyBTZWUgYWJvdmUgZm9yIGRpcmVjdGlvbnMuCi1pZmVxICgke09TX1RZUEV9LExpbnV4KQotRVJMX1RPUD0vb3B0L09UUF9TUkMKLVRBUkdFVD1pNjg2LXBjLWxpbnV4LWdudQotZW5kaWYKLQotRVJMQU5HX09UUD0vdXNyL2xvY2FsL2VybGFuZy9vdHAKLVZBUl9PVFA9L3Zhci9vdHAKLQotCi0jIEFsaWFzZXMgZm9yIGNvbW1vbiBiaW5hcmllcwotIyBOb3RlIC0gQ0ZMQUdTIGlzIG1vZGlmaWVkIGluIGVybGFuZy5jb25mCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU3VuT1MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmVxICgke09TX1RZUEV9LFN1bk9TKQotCi0gICAgQ0M9Z2NjCi0gICAgQ1hYPWcrKwotICAgIEFSPS91c3IvY2NzL2Jpbi9hcgotICAgIEFSRkxBR1M9LXJ2Ci0gICAgQ1hYRkxBR1MrPSR7Q0ZMQUdTfSAtSS91c3IvaW5jbHVkZS9nKysKLSAgICBMRD0vdXNyL2Njcy9iaW4vbGQKLSAgICBSQU5MSUI9L3Vzci9jY3MvYmluL3JhbmxpYgotCi1DRkxBR1MrPS1XYWxsIC1wZWRhbnRpYyAtYW5zaSAtTwotQ09SRT0qLmNvcmUKLWVuZGlmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRnJlZUJTRAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWlmZXEgKCR7T1NfVFlQRX0sRnJlZUJTRCkKLQotICBpZmRlZiBMSU5VWEJJTgotICAgIENPTVBBVF9MSU5VWD0vY29tcGF0L2xpbnV4Ci0gICAgQ0M9JHtDT01QQVRfTElOVVh9L3Vzci9iaW4vZ2NjCi0gICAgQ1hYPSR7Q09NUEFUX0xJTlVYfS91c3IvYmluL2crKwotICAgIEFSPSR7Q09NUEFUX0xJTlVYfS91c3IvYmluL2FyCi0gICAgQVJGTEFHUz0tcnYKLSAgICBDWFhGTEFHUys9LWZoYW5kbGUtZXhjZXB0aW9ucyAke0NGTEFHU30gLUkke0NPTVBBVF9MSU5VWH0vdXNyL2luY2x1ZGUvZysrCi0gICAgTEQ9JHtDT01QQVRfTElOVVh9L3Vzci9iaW4vbGQKLSAgICBSQU5MSUI9JHtDT01QQVRfTElOVVh9L3Vzci9iaW4vcmFubGliCi0JQlJBTkRFTEY9YnJhbmRlbGYgLXQgTGludXgKLSAgZWxzZQotICAgIENDPWdjYwotICAgIENYWD1nKysKLSAgICBBUj0vdXNyL2Jpbi9hcgotICAgIEFSRkxBR1M9LXJ2Ci0gICAgQ1hYRkxBR1MrPS1maGFuZGxlLWV4Y2VwdGlvbnMgJHtDRkxBR1N9IC1JL3Vzci9pbmNsdWRlL2crKwotICAgIExEPS91c3IvYmluL2xkCi0gICAgUkFOTElCPS91c3IvYmluL3JhbmxpYgotCUJSQU5ERUxGPUB0cnVlCi0KLSAgICBpZmRlZiBVU0VTX1BUSFJFQURTCi0gICAgICBDRkxBR1MrPS1EX1RIUkVBRF9TQUZFCi0gICAgICBMREZMQUdTKz0tbGNfcgotCi0JICAjIC1wdGhyZWFkIGZsYWcgZm9yIDMuMCsKLQkgIGlmbmVxICgke3NoZWxsIHVuYW1lIC1yIHwgY3V0IC1kLiAtZjF9LDIpCi0JCUNGTEFHUys9LXB0aHJlYWQKLQkgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotQ0ZMQUdTKz0tV2FsbCAtcGVkYW50aWMgLWFuc2kgLU8gLURGUkVFQlNECi1DT1JFPSouY29yZQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkJTRAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWlmZXEgKCR7T1NfVFlQRX0sT3BlbkJTRCkKLQotICAgIENDPWdjYwotICAgIENYWD1nKysKLSAgICBBUj0vdXNyL2Jpbi9hcgotICAgIEFSRkxBR1M9LXJ2Ci0gICAgQ1hYRkxBR1MrPSR7Q0ZMQUdTfSAtSS91c3IvaW5jbHVkZS9nKysKLSAgICBMRD0vdXNyL2Jpbi9sZAotICAgIFJBTkxJQj0vdXNyL2Jpbi9yYW5saWIKLQotICAgIGlmZGVmIFVTRVNfUFRIUkVBRFMKLSAgICAgIENGTEFHUys9LURfVEhSRUFEX1NBRkUKLSAgICAgIExERkxBR1MrPS1sY19yCi0KLQkgICMgLXB0aHJlYWQgZmxhZyBmb3IgMy4wKwotCSAgaWZuZXEgKCR7c2hlbGwgdW5hbWUgLXIgfCBjdXQgLWQuIC1mMX0sMikKLQkJQ0ZMQUdTKz0tcHRocmVhZAotCSAgZW5kaWYKLSAgICBlbmRpZgotCi1DRkxBR1MrPS1XYWxsIC1wZWRhbnRpYyAtYW5zaSAtTyAtRE9QRU5CU0QKLUNPUkU9Ki5jb3JlCi1lbmRpZgotCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL290cF9zdWJkaXIubWsgYi9saWIvZXJsL2J1aWxkL290cF9zdWJkaXIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzZjNjUuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9idWlsZC9vdHBfc3ViZGlyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotIyBDb21tZW50IGJ5IHRmZWUgMjAwNC0wNy0wMQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGlzIGZpbGUgaXMgYSBtb2Qgb2YgdGhlIHN0b2NrIE9UUCBvbmUuCi0jIFRoZSBjaGFuZ2UgYWxsb3dzIG1ha2UgdG8gc3RvcCB3aGVuIGEgY29tcGlsZSBlcnJvciBvY2N1cnMuCi0jIFRoaXMgZmlsZSBuZWVkcyB0byBnbyBpbnRvIHR3byBwbGFjZXM6Ci0jICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvZXJsYW5nCi0jICAgICAvb3B0L09UUF9TUkMvbWFrZQotIwotIyB3aGVyZSBPVFBfU1JDIGlzIGEgc3ltYm9saWMgbGluayB0byBhIHBlZXIgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLSMgdGhlIG90cCBzb3VyY2UsIGUuZy4gb3RwX3NyY19SOUMtMi4KLSMKLSMgQWZ0ZXIgaW5zdGFsbGluZyBPVFAsIHJ1bm5pbmcgc3VkbyBtYWtlIGluc3RhbGwgaW4gb3RwL2J1aWxkCi0jIHdpbGwgcHVzaCB0aGlzIGZpbGUgb3V0IHRvIHRoZSB0d28gcGxhY2VzIGxpc3RlZCBhYm92ZS4KLSMKLSMgVGhlIG1vZCBpbnZvbHZlcyBzZXR0aW5nIHRoZSBzaGVsbCB2YXJpYWJsZSAkc2hvcnRfY2lyY3VpdCwgd2hpY2ggd2UKLSMgaW50cm9kdWNlIC0gaWUgaXQgaXMgbm90IGluIHRoZSBzdG9jayBmaWxlLiBUaGlzIHZhcmlhYmxlIGlzIHRlc3RlZAotIyB0byBhZmZlY3QgZXhlY3V0aW9uIGZsb3cgYW5kIGlzIGFsc28gcmV0dXJuZWQgdG8gYWZmZWN0IHRoZSBmbG93IGluCi0jIHRoZSBjYWxsaW5nIHNjcmlwdCAodGhpcyBvbmUpLiBUaGUgbGF0dGVyIHN0ZXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLSMgb2YgdGhlIHJlY3Vyc2lvbiBpbnZvbHZlZC4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotIyBgYFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIEVybGFuZyBQdWJsaWMgTGljZW5zZSwKLSMgVmVyc2lvbiAxLjEsICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLSMgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZQotIyBFcmxhbmcgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlLiBJZiBub3QsIGl0IGNhbiBiZQotIyByZXRyaWV2ZWQgdmlhIHRoZSB3b3JsZCB3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmVybGFuZy5vcmcvLgotIwotIyBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi0jIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKLSMgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEVyaWNzc29uIFV0dmVja2xpbmdzIEFCLgotIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IEVyaWNzc29uIGFyZSBDb3B5cmlnaHQgMTk5OSwgRXJpY3Nzb24gVXR2ZWNrbGluZ3MKLSMgQUIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJycKLSMKLSMgICAgICRJZDogb3RwX3N1YmRpci5tayx2IDEuNSAyMDA0LzA3LzEyIDE1OjEyOjIzIGplaW5ob3JuIEV4cCAkCi0jCi0jCi0jIE1ha2UgaW5jbHVkZSBmaWxlIGZvciBvdHAKLQotLlBIT05ZOiBkZWJ1ZyBvcHQgcmVsZWFzZSBkb2NzIHJlbGVhc2VfZG9jcyB0ZXN0cyByZWxlYXNlX3Rlc3RzIFwKLQljbGVhbiBkZXBlbmQKLQotIwotIyBUYXJnZXRzIHRoYXQgZG9uJ3QgYWZmZWN0IGRvY3VtZW50YXRpb24gZGlyZWN0b3JpZXMKLSMKLWRlYnVnIG9wdCByZWxlYXNlIGRvY3MgcmVsZWFzZV9kb2NzIHRlc3RzIHJlbGVhc2VfdGVzdHMgY2xlYW4gZGVwZW5kOiBwcmVwYXJlCi0JQHNldCAtZSA7CQkJCQkJCVwKLQlhcHBfcHdkPWBwd2RgIDsJCQkJCQkJXAotCWlmIHRlc3QgLWYgdnNuLm1rOyB0aGVuCQkJCQkJXAotCSAgICBlY2hvICI9PT0gRW50ZXJpbmcgYXBwbGljYXRpb24iIGBiYXNlbmFtZSAkJGFwcF9wd2RgIDsJXAotCWZpIDsJCQkJCQkJCVwKLQljYXNlICIkKE1BS0UpIiBpbiAqY2xlYXJtYWtlKikgdGZsYWc9Ii1UIjs7ICopIHRmbGFnPSIiOzsgZXNhYzsJXAotCXNob3J0X2NpcmN1aXQ9MCA7CQkJCQkJXAotCWZvciBkIGluICQoU1VCX0RJUkVDVE9SSUVTKTsgZG8JCQkJCVwKLQkgICAgaWYgW1sgJCRzaG9ydF9jaXJjdWl0ID0gMCBdXTsgdGhlbgkJCQlcCi0JCWlmIHRlc3QgLWYgJCRkL1NLSVAgOyB0aGVuCQkJCVwKLQkJICAgIGVjaG8gIj09PSBTa2lwcGluZyBzdWJkaXIgJCRkLCByZWFzb246IiA7CQlcCi0JCSAgICBjYXQgJCRkL1NLSVAgOwkJCQkJXAotCQkgICAgZWNobyAiPT09IiA7CQkJCQlcCi0JCWVsc2UJCQkJCQkJXAotCQkgICAgaWYgdGVzdCAhIC1kICQkZCA7IHRoZW4JCQkJXAotCQkJZWNobyAiPT09IFNraXBwaW5nIHN1YmRpciAkJGQsIGl0IGlzIG1pc3NpbmciIDsJXAotCQkgICAgZWxzZQkJCQkJCVwKLQkJCXhmbGFnPSIiIDsJCQkJCVwKLQkJCWlmIHRlc3QgLWYgJCRkL2lnbm9yZV9jb25maWdfcmVjb3JkLmluZjsgdGhlbglcCi0JCQkgICAgeGZsYWc9JCR0ZmxhZyA7CQkJCVwKLQkJCWZpIDsJCQkJCQlcCi0JCQkoY2QgJCRkICYmICQoTUFLRSkgJCR4ZmxhZyAkQCkgOwkJXAotCQkJaWYgW1sgJCQ/ICE9IDAgXV07IHRoZW4JCQkJXAotCQkJICAgIHNob3J0X2NpcmN1aXQ9MSA7CQkJCVwKLQkJCWZpIDsJCQkJCQlcCi0JCSAgICBmaSA7CQkJCQkJXAotCQlmaSA7CQkJCQkJCVwKLQkgICAgZmkgOwkJCQkJCQlcCi0JZG9uZSA7CQkJCQkJCQlcCi0JaWYgdGVzdCAtZiB2c24ubWs7IHRoZW4JCQkJCQlcCi0JICAgIGVjaG8gIj09PSBMZWF2aW5nIGFwcGxpY2F0aW9uIiBgYmFzZW5hbWUgJCRhcHBfcHdkYCA7CVwKLQlmaSA7CQkJCQkJCQlcCi0JZXhpdCAkJHNob3J0X2NpcmN1aXQKLQotcHJlcGFyZToKLQllY2hvCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL3Jhd190ZXN0Lm1rIGIvbGliL2VybC9idWlsZC9yYXdfdGVzdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NTM1ZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL3Jhd190ZXN0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBmb3IgdGVzdGluZyBlcmxhbmcgZmlsZXMgZGlyZWN0bHkuIFRoZSBzZXQgdXAgZm9yIGEKLSMgdGhpcyB0eXBlIG9mIHRlc3Qgd291bGQgYmUKLSMgZmlsZXMgdG8gdGVzdCByZXNpZGUgaW4gbGliLzxhcHBfbmFtZT4vc3JjIGFuZCB0aGUgdGVzdCBmaWxlcyB3aGljaCBhcmUKLSMganVzdCBwbGFpbiBlcmxhbmcgY29kZSByZXNpZGUgaW4gbGliLzxhcHBfbmFtZT4vdGVzdAotIwotIyBUaGlzIGNvbG9yIGNvZGVzIGVtaXR0ZWQgd2hpbGUgdGhlIHRlc3RzIHJ1biBhc3N1bWUgdGhhdCB5b3UgYXJlIHVzaW5nCi0jIGEgd2hpdGUtb24tYmxhY2sgZGlzcGxheSBzY2hlbWEuIElmIG5vdCwgZS5nLiBpZiB5b3UgdXNlIGEgd2hpdGUKLSMgYmFja2dyb3VuZCwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgIldISVRFIiB0ZXh0LgotIyBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgc3VwcGx5aW5nIHlvdXIgb3duICJ3aGl0ZSIgY29sb3IsCi0jIHdoaWNoIG1heSBpbiBmYWN0IGJlIGJsYWNrISBZb3UgZG8gdGhpcyBieSBkZWZpbmluZyBhbiBlbnZpcm9ubWVudAotIyB2YXJpYWJsZSBuYW1lZCAiTVlfV0hJVEUiIGFuZCBzZXR0aW5nIGl0IHRvICQnXGVbMDszMG0nICh3aGljaCBpcwotIyBzaW1wbHkgYmFzaCdzIHdheSBvZiBzcGVjaWZ5aW5nICJFc2NhcGUgWyAwIDsgMyAwIG0iKS4KLSMgU2ltaWxhcmx5LCB5b3UgY2FuIHNldCB5b3VyIHZlcnNpb25zIG9mIHRoZSBzdGFuZGFyZCBjb2xvcnMKLSMgZm91bmQgaW4gY29sb3JzLm1rLgotCi10ZXN0OgotCUBURVNUX01PRFVMRVM9YGxzICpfdGVzdC5lcmxgOyBcCi0JdHJhcCAiZWNobyAkKE9GRikkKE5PX0NPTE9SKTsgZXhpdCAxOyIgMSAyIDMgNjsgXAotCWZvciBkIGluICQkVEVTVF9NT0RVTEVTOyBkbyBcCi0JCWVjaG8gJCR7TVlfR1JFRU46LSQoR1JFRU4pfSJUZXN0aW5nIEZpbGUgJCRkIiAkJHtNWV9XSElURTotJChXSElURSl9OyBcCi0JCWVjaG8gLW4gJCR7TVlfQkxVRTotJChCTFVFKX07IFwKLQkJZXJsIC1uYW1lICQoQVBQX05BTUUpICQoVEVTVF9MSUJTKSBcCi0JCS1zIGBiYXNlbmFtZSAkJGQgLmVybGAgYWxsIC1zIGluaXQgc3RvcCAtbm9zaGVsbDsgXAotCQlpZiBbICQkPyAtbmUgMCBdOyB0aGVuIFwKLQkJCWVjaG8gJCR7TVlfTFJFRDotJChMUkVEKX0iJCRkIFRlc3QgRmFpbGVkIjsgXAotCQlmaTsgXAotCQllY2hvIC1uICQoT0ZGKSQoTk9fQ09MT1IpOyBcCi0JZG9uZQotCmRpZmYgLS1naXQgYS9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzN2RiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDMgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorCitQYXJ0aWN1bGFybHkgZm9yIEVybGFuZyBwbGVhc2UgZm9sbG93IHRoZSBFcmxhbmcgW1Byb2dyYW1taW5nIFJ1bGVzIGFuZCBDb252ZW50aW9uc10oaHR0cDovL3d3dy5lcmxhbmcuc2UvZG9jL3Byb2dyYW1taW5nX3J1bGVzLnNodG1sKS4gCmRpZmYgLS1naXQgYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKaW5kZXggMzZlYjQ5Yi4uN2NiMjllYiAxMDA2NDQKLS0tIGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCisrKyBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybApAQCAtMjIsNiArMjIsNyBAQAogLWRlZmluZSh0VHlwZV9WT0lELCAxKS4KIC1kZWZpbmUodFR5cGVfQk9PTCwgMikuCiAtZGVmaW5lKHRUeXBlX0JZVEUsIDMpLgorLWRlZmluZSh0VHlwZV9JOCwgMykuCiAtZGVmaW5lKHRUeXBlX0RPVUJMRSwgNCkuCiAtZGVmaW5lKHRUeXBlX0kxNiwgNikuCiAtZGVmaW5lKHRUeXBlX0kzMiwgOCkuCkBAIC01MSw0ICs1MiwxMSBAQAogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUUsIDMpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lELCA0KS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxULCA1KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVEVSTkFMX0VSUk9SLCA2KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SLCA3KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfVFJBTlNGT1JNLCA4KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfUFJPVE9DT0wsIDkpLgorLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUsIDEwKS4KIAorLWRlZmluZSAoTVVMVElQTEVYRURfU0VSVklDRV9TRVBBUkFUT1IsICI6IikuCistZGVmaW5lIChNVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgImVycm9yX2hhbmRsZXIiKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKaW5kZXggZjRlMTkwMS4uYmMwYWNjOCAxMDA2NDQKLS0tIGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKQEAgLTE4LDE0ICsxOCw0OSBAQAogJSUKIAogLWlmbmRlZihUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQpLgotLWRlZmluZShUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQsIHllYSkuCistZGVmaW5lKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCwgdHJ1ZSkuCiAKLS1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUsIHR5cGUsIHNlcWlkfSkuCi0tcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWV9KS4KLS1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lLCB0eXBlLCBpZH0pLgotLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSwgdnR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCistcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgc2VxaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlIDo6IGludGVnZXIoKSwgdnR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCisKKy10eXBlIHRwcm90X2hlYWRlcl92YWwoKSA6OiAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjcHJvdG9jb2xfbWFwX2JlZ2lue30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjcHJvdG9jb2xfbGlzdF9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX3NldF9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKy10eXBlIHRwcm90X2VtcHR5X3RhZygpIDo6IG1lc3NhZ2VfZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3RfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnVjdF9lbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpZWxkX2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwX2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGlzdF9lbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IHNldF9lbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAuCistdHlwZSB0cHJvdF9oZWFkZXJfdGFnKCkgOjogbWVzc2FnZV9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpZWxkX2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwX2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGlzdF9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNldF9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAuCistdHlwZSB0cHJvdF9kYXRhX3RhZygpIDo6IHVpMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgYm9vbAorICAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICB8IGkxNgorICAgICAgICAgICAgICAgICAgICAgICAgfCBpMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaTY0CisgICAgICAgICAgICAgICAgICAgICAgICB8IGRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC4KKy10eXBlIHRwcm90X2NvbnRfdGFnKCkgOjoge2xpc3QsIF9UeXBlfQorICAgICAgICAgICAgICAgICAgICAgICAgfCB7bWFwLCBfS1R5cGUsIF9WVHlwZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwge3NldCwgX1R5cGV9CisgICAgICAgICAgICAgICAgICAgICAgICAuCiAKIAogLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTMwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwKQEAgLTAsMCArMSwzNyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKyUlIFNpZ25hdHVyZSBzcGVjaWZpY2F0aW9ucyBmb3IgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLgorCistaWZuZGVmKFRIUklGVF9QUk9UT0NPTF9CRUhBVklPVVJfSU5DTFVERUQpLgorLWRlZmluZShUSFJJRlRfUFJPVE9DT0xfQkVIQVZJT1VSX0lOQ0xVREVELCB0cnVlKS4KKworLXNwZWMgZmx1c2hfdHJhbnNwb3J0KHN0YXRlKCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorLXNwZWMgY2xvc2VfdHJhbnNwb3J0KHN0YXRlKCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorCistc3BlYyB3cml0ZShzdGF0ZSgpLCBhbnkoKSkgLT4ge3N0YXRlKCksIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCisKKyUlIE5PVEU6IEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdGhyaWZ0X3Byb3RvY29sOnJlYWQgYW5kIHJlYWRfc3BlY2lmaWMuCistc3BlYyByZWFkCisgICAgICAgIChzdGF0ZSgpLCB0cHJvdF9lbXB0eV90YWcoKSkgLT4gIHtzdGF0ZSgpLCAgb2sgICAgICAgICAgICAgICAgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKHN0YXRlKCksIHRwcm90X2hlYWRlcl90YWcoKSkgLT4ge3N0YXRlKCksIHRwcm90X2hlYWRlcl92YWwoKSB8IHtlcnJvciwgX1JlYXNvbn19OworICAgICAgICAoc3RhdGUoKSwgdHByb3RfZGF0YV90YWcoKSkgLT4gICB7c3RhdGUoKSwge29rLCBhbnkoKX0gICAgICAgIHwge2Vycm9yLCBfUmVhc29ufX0uCisKKworLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMDVhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwKQEAgLTAsMCArMSwzMSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKyUlIFNpZ25hdHVyZSBzcGVjaWZpY2F0aW9ucyBmb3IgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucy4KKworLWlmbmRlZihUSFJJRlRfVFJBTlNQT1JUX0JFSEFWSU9VUl9JTkNMVURFRCkuCistZGVmaW5lKFRIUklGVF9UUkFOU1BPUlRfQkVIQVZJT1VSX0lOQ0xVREVELCB0cnVlKS4KKworLXNwZWMgd3JpdGUoc3RhdGUoKSwgaW9saXN0KCkgfCBiaW5hcnkoKSkgLT4ge3N0YXRlKCksIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCistc3BlYyByZWFkKHN0YXRlKCksIG5vbl9uZWdfaW50ZWdlcigpKSAtPiB7c3RhdGUoKSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KKy1zcGVjIGZsdXNoKHN0YXRlKCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorLXNwZWMgY2xvc2Uoc3RhdGUoKSkgLT4ge3N0YXRlKCksIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCisKKworLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcgYi9saWIvZXJsL3JlYmFyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWExOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcKQEAgLTAsMCArMSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0IGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLmNvbmZpZy5zY3JpcHQKQEAgLTAsMCArMSw3IEBACitEZWYwID0gY2FzZSBub3QgZXJsYW5nOmlzX2J1aWx0aW4oZXJsYW5nLCBtb25vdG9uaWNfdGltZSwgMCkgb2YKKyAgICAgICAgICAgdHJ1ZSAtPiBbXTsKKyAgICAgICAgICAgZmFsc2UgLT4gW3tkLCB0aW1lX2NvcnJlY3Rpb259XQorICAgICAgIGVuZCwKK0RlZnMgPSBEZWYwLAorbGlzdHM6a2V5c3RvcmUoZXJsX29wdHMsIDEsIENPTkZJRywKKyAgICAgICAgICAgICAgIHtlcmxfb3B0cywgcHJvcGxpc3RzOmdldF92YWx1ZShlcmxfb3B0cywgQ09ORklHLCBbXSkgKysgRGVmc30pLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci50ZXN0LmNvbmZpZyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKQEAgLTAsMCArMSw1IEBACit7ZXJsX29wdHMsIFt7cGxhdGZvcm1fZGVmaW5lLCAiXlIuKiIsIG90cDE2X29yX2xlc3N9LCBkZWJ1Z19pbmZvXX0uCisKK3tkZXBzLCBbCisgIHttZWNrLCAiIiwge2dpdCwgImh0dHBzOi8vZ2l0aHViLmNvbS9lcHJveHVzL21lY2suZ2l0Iiwge3RhZywgIjAuOC45In19fQorXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy9NYWtlZmlsZSBiL2xpYi9lcmwvc3JjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODBhZjgxLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvc3JjL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLSMgJElkOiBNYWtlZmlsZSx2IDEuMyAyMDA0LzA4LzEzIDE2OjM1OjU5IG1sb2dhbiBFeHAgJAotIwotaW5jbHVkZSAuLi9idWlsZC9vdHAubWsKLWluY2x1ZGUgLi4vYnVpbGQvY29sb3JzLm1rCi1pbmNsdWRlIC4uL2J1aWxkL2J1aWxkdGFyZ2V0cy5tawotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXBwbGljYXRpb24gdmVyc2lvbgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWluY2x1ZGUgLi4vdnNuLm1rCi1BUFBfTkFNRT10aHJpZnQKLVBGWD10aHJpZnQKLVZTTj0kKFRIUklGVF9WU04pCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbnN0YWxsIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uCi0jIFdBUk5JTkc6IElOU1RBTExfRElSIHRoZSBjb21tYW5kIHRvIGluc3RhbGwgYSBkaXJlY3RvcnkuCi0jICAgICAgICAgIElOU1RBTExfRFNUIGlzIHRoZSB0YXJnZXQgZGlyZWN0b3J5Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlOU1RBTExfRFNUID0gJChFUkxBTkdfT1RQKS9saWIvJChBUFBfTkFNRSktJChWU04pCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUYXJnZXQgU3BlY3MKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLU1PRFVMRVMgPSAkKHNoZWxsIGZpbmQgLiAtbmFtZSBcKi5lcmwgfCBzZWQgJ3M6XlwuLzo6JyB8IHNlZCAncy9cLmVybC8vJykKLU1PRFVMRVNfU1RSSU5HX0xJU1QgPSAkKHNoZWxsIGZpbmQgLiAtbmFtZSBcKi5lcmwgfCBzZWQgJ3M6XlwuLzoiOicgfCBzZWQgJ3MvXC5lcmwvIiwvJykKLQotSFJMX0ZJTEVTPQotSU5URVJOQUxfSFJMX0ZJTEVTPSAkKEFQUF9OQU1FKS5ocmwKLUVSTF9GSUxFUz0gJChNT0RVTEVTOiU9JS5lcmwpCi1ET0NfRklMRVM9JChFUkxfRklMRVMpCi0KLUFQUF9GSUxFPSAkKEFQUF9OQU1FKS5hcHAKLUFQUFVQX0ZJTEU9ICQoQVBQX05BTUUpLmFwcHVwCi0KLUFQUF9TUkM9ICQoQVBQX0ZJTEUpLnNyYwotQVBQVVBfU1JDPSAkKEFQUFVQX0ZJTEUpLnNyYwotCi1BUFBfVEFSR0VUPSAkKEVCSU4pLyQoQVBQX0ZJTEUpCi1BUFBVUF9UQVJHRVQ9ICQoRUJJTikvJChBUFBVUF9GSUxFKQotCi1CRUFNUz0gJChNT0RVTEVTOiU9JChFQklOKS8lLiQoRU1VTEFUT1IpKQotVEFSR0VUX0ZJTEVTPSAkKEJFQU1TKSAkKEFQUF9UQVJHRVQpICQoQVBQVVBfVEFSR0VUKQotCi1XRUJfVEFSR0VUPS92YXIveWF3cy93d3cvJChBUFBfTkFNRSkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZMQUdTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRVJMX0ZMQUdTICs9Ci1FUkxfSU5DTFVERSA9IC1JLi4vaW5jbHVkZSAtSS4uLy4uL2ZzbGliL2luY2x1ZGUgLUkuLi8uLi9zeXN0ZW1fc3RhdHVzL2luY2x1ZGUKLUVSTF9DT01QSUxFX0ZMQUdTICs9ICQoRVJMX0lOQ0xVREUpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUYXJnZXRzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsIGRlYnVnIG9wdDogJChFQklOKSAkKFRBUkdFVF9GSUxFUykKLQotIyQoRUJJTikvcm1fbG9nZ2VyLmJlYW06ICQoQVBQX05BTUUpLmhybAotaW5jbHVkZSAuLi9idWlsZC9kb2NzLm1rCi0KLSMgTm90ZTogSW4gdGhlIG9wZW4tc291cmNlIGJ1aWxkIGNsZWFuIG11c3Qgbm90IGRlc3Ryb3kgdGhlIHByZWxvYWRlZAotIyBiZWFtIGZpbGVzLgotY2xlYW46Ci0Jcm0gLWYgJChUQVJHRVRfRklMRVMpCi0Jcm0gLWYgKn4KLQlybSAtZiBjb3JlCi0Jcm0gLXJmICQoRUJJTikKLQlybSAtcmYgKmh0bWwKLQotJChFQklOKToKLQlta2RpciAkKEVCSU4pCi0KLWRpYWx5emVyOiAkKFRBUkdFVF9GSUxFUykKLQlkaWFseXplciAtLXNyYyAtciAuICQoRVJMX0lOQ0xVREUpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTcGVjaWFsIEJ1aWxkIFRhcmdldHMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0kKEFQUF9UQVJHRVQpOiAkKEFQUF9TUkMpIC4uL3Zzbi5tayAkKEJFQU1TKQotCXNlZCAtZSAnczslVlNOJTskKFZTTik7JyBcCi0JCS1lICdzOyVQRlglOyQoUEZYKTsnIFwKLQkJLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKLQkJLWUgJ3M7JU1PRFVMRVMlOyVNT0RVTEVTJSQoTU9EVUxFU19TVFJJTkdfTElTVCk7JyBcCi0JCSQ8ID4gJDwiLnRtcCIKLQlzZWQgLWUgJ3MvJU1PRFVMRVMlXCguKlwpLC9cMS8nIFwKLQkJJDwiLnRtcCIgPiAkQAotCXJtICQ8Ii50bXAiCi0KLSQoQVBQVVBfVEFSR0VUKTogJChBUFBVUF9TUkMpIC4uL3Zzbi5tawotCXNlZCAtZSAnczslVlNOJTskKFZTTik7JyAkPCA+ICRACi0KLSQoV0VCX1RBUkdFVCk6IC4uL21hcmt1cC8qCi0Jcm0gLXJmICQoV0VCX1RBUkdFVCkKLQlta2RpciAkKFdFQl9UQVJHRVQpCi0JY3AgLXIgLi4vbWFya3VwLyAkKFdFQl9UQVJHRVQpCi0JY3AgLXIgLi4vc2tpbnMvICQoV0VCX1RBUkdFVCkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEluc3RhbGwgVGFyZ2V0Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5zdGFsbDogYWxsICQoV0VCX1RBUkdFVCkKLSMJJChJTlNUQUxMX0RJUikgJChJTlNUQUxMX0RTVCkvc3JjCi0jCSQoSU5TVEFMTF9EQVRBKSAkKEVSTF9GSUxFUykgJChJTlNUQUxMX0RTVCkvc3JjCi0jCSQoSU5TVEFMTF9EQVRBKSAkKElOVEVSTkFMX0hSTF9GSUxFUykgJChJTlNUQUxMX0RTVCkvc3JjCi0jCSQoSU5TVEFMTF9ESVIpICQoSU5TVEFMTF9EU1QpL2luY2x1ZGUKLSMJJChJTlNUQUxMX0RBVEEpICQoSFJMX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9pbmNsdWRlCi0jCSQoSU5TVEFMTF9ESVIpICQoSU5TVEFMTF9EU1QpL2ViaW4KLSMJJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9lYmluCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90ZXN0X2hhbmRsZXIuZXJsIGIvbGliL2VybC9zcmMvdGVzdF9oYW5kbGVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhM2FjZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy90ZXN0X2hhbmRsZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9oYW5kbGVyKS4KLQotLWV4cG9ydChbaGFuZGxlX2Z1bmN0aW9uLzJdKS4KLQotaGFuZGxlX2Z1bmN0aW9uKGFkZCwgUGFyYW1zID0ge0EsIEJ9KSAtPgotICAgIGlvOmZvcm1hdCgiR290IHBhcmFtczogfnB+biIsIFtQYXJhbXNdKSwKLSAgICB7cmVwbHksIEEgKyBCfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3Rlc3Rfc2VydmljZS5lcmwgYi9saWIvZXJsL3NyYy90ZXN0X3NlcnZpY2UuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWE0ODI3Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvc3JjL3Rlc3Rfc2VydmljZS5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X3NlcnZpY2UpLgotJQotJSBUZXN0IHNlcnZpY2UgZGVmaW5pdGlvbgotCi0tZXhwb3J0KFtmdW5jdGlvbl9pbmZvLzJdKS4KLQotZnVuY3Rpb25faW5mbyhhZGQsIHBhcmFtc190eXBlKSAtPgotICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfSwKLSAgICAgICAgICAgICAgezIsIGkzMn1dfTsKLWZ1bmN0aW9uX2luZm8oYWRkLCByZXBseV90eXBlKSAtPiBpMzIuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCmluZGV4IGY1NDcyYmYuLmIzYjIyNWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCkBAIC0xNywxOCArMTcsMzggQEAKICUlIHVuZGVyIHRoZSBMaWNlbnNlLgogJSUKICUlJSAtKi0gbW9kZTplcmxhbmcgLSotCi17YXBwbGljYXRpb24sICVBUFBfTkFNRSUsCi0gWwore2FwcGxpY2F0aW9uLCB0aHJpZnQsIFsKICAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KICAge2Rlc2NyaXB0aW9uLCAiVGhyaWZ0IGJpbmRpbmdzIn0sCiAKICAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgotICB7dnNuLCAiJVZTTiUifSwKKyAge3ZzbiwgIjEuMC4wIn0sCiAKICAgJSBBbGwgbW9kdWxlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAge21vZHVsZXMsIFsKLSAgICAgICAlTU9EVUxFUyUKLSAgIF19LAorICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0LAorICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wsCisgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfY2xpZW50X3V0aWwsCisgICAgdGhyaWZ0X2NsaWVudCwKKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LAorICAgIHRocmlmdF9maWxlX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfaHR0cF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2pzb25fcGFyc2VyLAorICAgIHRocmlmdF9qc29uX3Byb3RvY29sLAorICAgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LAorICAgIHRocmlmdF9tZW1vcnlfYnVmZmVyLAorICAgIHRocmlmdF9wcm9jZXNzb3IsCisgICAgdGhyaWZ0X3Byb3RvY29sLAorICAgIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LAorICAgIHRocmlmdF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NlcnZpY2UsCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LAorICAgIHRocmlmdF90cmFuc3BvcnQKKyAgXX0sCiAKICAgJSBBbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbmFtZXMgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIFRoaXMgY2FuIGJlIGlnbm9yZWQuCiAgIHtyZWdpc3RlcmVkLCBbXX0sCkBAIC0zNiwxMSArNTYsNyBAQAogICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCiAgICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbgogICAlIHlvdXIgcmVsZWFzZSBoYW5kbGUgdGhpcy4KLSAge2FwcGxpY2F0aW9ucywKLSAgIFsKLSAgICBrZXJuZWwsCi0gICAgc3RkbGliCi0gICBdfSwKKyAge2FwcGxpY2F0aW9ucywgW2tlcm5lbCwgc3RkbGliXX0sCiAKICAgJSBPVFAgYXBwbGljYXRpb24gbG9hZGVyIHdpbGwgbG9hZCwgYnV0IG5vdCBzdGFydCwgaW5jbHVkZWQgYXBwcy4gQWdhaW4KICAgJSB0aGlzIGNhbiBiZSBpZ25vcmVkIGFzIHdlbGwuICBUbyBsb2FkIGJ1dCBub3Qgc3RhcnQgYW4gYXBwbGljYXRpb24gaXQKQEAgLTUwLDEzICs2Niw5IEBACiAgICUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIGNvbmZpZyBmaWxlIHNwZWNpZmllZAogICAlIG9uIHRoZSBjb21tYW5kIGxpbmUuIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2FzOmdldF9lbnYKICAge2VudiwgWwotICAgICAgICAgJSBJZiBhbiBlcnJvci9jcmFzaCBvY2N1cnMgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYSBmdW5jdGlvbiwKLSAgICAgICAgICUgc2hvdWxkIHRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gc2VyaWFsaXplZCBiYWNrIHRvIHRoZSBjbGllbnQKLSAgICAgICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KLSAgICAgICAgIHtleGNlcHRpb25zX2luY2x1ZGVfdHJhY2VzLCB0cnVlfQotICBdfSwKLQotICAlIFRoZSBNb2R1bGUgYW5kIEFyZ3MgdXNlZCB0byBzdGFydCB0aGlzIGFwcGxpY2F0aW9uLgotICB7bW9kLCB7dGhyaWZ0X2FwcCwgW119fQotIF0KLX0uCisgICAgJSBJZiBhbiBlcnJvci9jcmFzaCBvY2N1cnMgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYSBmdW5jdGlvbiwKKyAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50CisgICAgJSBpbmNsdWRlIHRoZSBlcmxhbmcgYmFja3RyYWNlPworICAgIHtleGNlcHRpb25zX2luY2x1ZGVfdHJhY2VzLCB0cnVlfQorICBdfQorXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwdXAuc3JjIGIvbGliL2VybC9zcmMvdGhyaWZ0LmFwcHVwLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNjM4My4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwdXAuc3JjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteyIlVlNOJSIsW10sW119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQuZXJsCmluZGV4IDlkMTMxNTEuLmQzMWYyYmEgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9iYXNlNjRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYmFzZTY0X3RyYW5zcG9ydC5lcmwKQEAgLTI5LDMwICsyOSwzNSBAQAogCiAlJSBTdGF0ZQogLXJlY29yZChiNjRfdHJhbnNwb3J0LCB7d3JhcHBlZH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjYjY0X3RyYW5zcG9ydHt9LgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCiBuZXcoV3JhcHBlZCkgLT4KICAgICBTdGF0ZSA9ICNiNjRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkfSwKICAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKIAotd3JpdGUoI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9LCBEYXRhKSAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgYmFzZTY0OmVuY29kZShpb2xpc3RfdG9fYmluYXJ5KERhdGEpKSkuCit3cml0ZShUaGlzID0gI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9LCBEYXRhKSAtPgorICAgIHtOZXdXcmFwcGVkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBiYXNlNjQ6ZW5jb2RlKGlvbGlzdF90b19iaW5hcnkoRGF0YSkpKSwKKyAgICB7VGhpcyNiNjRfdHJhbnNwb3J0e3dyYXBwZWQgPSBOZXdXcmFwcGVkfSwgUmVzdWx0fS4KIAogCiAlJSBiYXNlNjQgZG9lc24ndCBzdXBwb3J0IHJlYWRpbmcgcXVpdGUgeWV0IHNpbmNlIGl0IHdvdWxkIGludm9sdmUKICUlIG5hc3R5IGJ1ZmZlcmluZyBhbmQgc3VjaAotcmVhZCgjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZH0sIERhdGEpIC0+Ci0gICAge2Vycm9yLCBub19yZWFkc19hbGxvd2VkfS4KK3JlYWQoVGhpcyA9ICNiNjRfdHJhbnNwb3J0e30sIF9EYXRhKSAtPgorICAgIHtUaGlzLCB7ZXJyb3IsIG5vX3JlYWRzX2FsbG93ZWR9fS4KIAogCi1mbHVzaCgjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCA8PCJcbiI+PiksCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkKS4KK2ZsdXNoKFRoaXMgPSAjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgorICAgIHtXcmFwcGVkMSwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkMCwgPDwiXG4iPj4pLAorICAgIHtXcmFwcGVkMiwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkMSksCisgICAge1RoaXMjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDJ9LCBva30uCiAKIAotY2xvc2UoTWUgPSAjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+Ci0gICAgZmx1c2goTWUpLAotICAgIHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCkuCitjbG9zZShUaGlzMCkgLT4KKyAgICB7VGhpczEgPSAjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZH0sIG9rfSA9IGZsdXNoKFRoaXMwKSwKKyAgICB7TmV3V3JhcHBlZCwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAgICB7VGhpczEjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gTmV3V3JhcHBlZH0sIG9rfS4KIAogCiAlJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCmluZGV4IGFkNTMzODQuLjg1YWJiNjIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCkBAIC0xOSw3ICsxOSw3IEBACiAKIC1tb2R1bGUodGhyaWZ0X2JpbmFyeV9wcm90b2NvbCkuCiAKLS1iZWhhdmlvcih0aHJpZnRfcHJvdG9jb2wpLgorLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgogCiAtaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KIC1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCkBAIC0zNyw2ICszNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkPXRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZT10cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNiaW5hcnlfcHJvdG9jb2x7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgogCiAtZGVmaW5lKFZFUlNJT05fTUFTSywgMTYjRkZGRjAwMDApLgogLWRlZmluZShWRVJTSU9OXzEsIDE2IzgwMDEwMDAwKS4KQEAgLTU4LDc5ICs2MCw4MSBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjYmluYXJ5X3Byb3RvY29se3N0cmljdF93cml0ZT1Cb29sfSkuCiAKIAotZmx1c2hfdHJhbnNwb3J0KCNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCitmbHVzaF90cmFuc3BvcnQoVGhpcyA9ICNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICAgIHtUaGlzI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgogCi1jbG9zZV90cmFuc3BvcnQoI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KK2Nsb3NlX3RyYW5zcG9ydChUaGlzID0gI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgICAge1RoaXMjYmluYXJ5X3Byb3RvY29se3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCiAKICUlJQogJSUlIGluc3RhbmNlIG1ldGhvZHMKICUlJQogCi13cml0ZShUaGlzLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKICAgICAgICAgbmFtZSA9IE5hbWUsCiAgICAgICAgIHR5cGUgPSBUeXBlLAogICAgICAgICBzZXFpZCA9IFNlcWlkfSkgLT4KLSAgICBjYXNlIFRoaXMjYmluYXJ5X3Byb3RvY29sLnN0cmljdF93cml0ZSBvZgorICAgIGNhc2UgVGhpczAjYmluYXJ5X3Byb3RvY29sLnN0cmljdF93cml0ZSBvZgogICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICB3cml0ZShUaGlzLCB7aTMyLCA/VkVSU0lPTl8xIGJvciBUeXBlfSksCi0gICAgICAgICAgICB3cml0ZShUaGlzLCB7c3RyaW5nLCBOYW1lfSksCi0gICAgICAgICAgICB3cml0ZShUaGlzLCB7aTMyLCBTZXFpZH0pOworICAgICAgICAgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2kzMiwgP1ZFUlNJT05fMSBib3IgVHlwZX0pLAorICAgICAgICAgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge3N0cmluZywgTmFtZX0pLAorICAgICAgICAgICAge1RoaXMzLCBva30gPSB3cml0ZShUaGlzMiwge2kzMiwgU2VxaWR9KSwKKyAgICAgICAgICAgIHtUaGlzMywgb2t9OwogICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgd3JpdGUoVGhpcywge3N0cmluZywgTmFtZX0pLAotICAgICAgICAgICAgd3JpdGUoVGhpcywge2J5dGUsIFR5cGV9KSwKLSAgICAgICAgICAgIHdyaXRlKFRoaXMsIHtpMzIsIFNlcWlkfSkKLSAgICBlbmQsCi0gICAgb2s7CisgICAgICAgICAgICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBOYW1lfSksCisgICAgICAgICAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgVHlwZX0pLAorICAgICAgICAgICAge1RoaXMzLCBva30gPSB3cml0ZShUaGlzMiwge2kzMiwgU2VxaWR9KSwKKyAgICAgICAgICAgIHtUaGlzMywgb2t9CisgICAgZW5kOwogCi13cml0ZShUaGlzLCBtZXNzYWdlX2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCBtZXNzYWdlX2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotd3JpdGUoVGhpcywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueword3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKICAgICAgICBuYW1lID0gX05hbWUsCiAgICAgICAgdHlwZSA9IFR5cGUsCiAgICAgICAgaWQgPSBJZH0pIC0+Ci0gICAgd3JpdGUoVGhpcywge2J5dGUsIFR5cGV9KSwKLSAgICB3cml0ZShUaGlzLCB7aTE2LCBJZH0pLAotICAgIG9rOworICAgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCBUeXBlfSksCisgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2kxNiwgSWR9KSwKKyAgICB7VGhpczIsIG9rfTsKIAogd3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4KLSAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgP3RUeXBlX1NUT1B9KSwKLSAgICBvazsKKyAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgP3RUeXBlX1NUT1B9KTsKIAotd3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiBvazsKK3dyaXRlKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotd3JpdGUoVGhpcywgI3Byb3RvY29sX21hcF9iZWdpbnsKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2luewogICAgICAgIGt0eXBlID0gS3R5cGUsCiAgICAgICAgdnR5cGUgPSBWdHlwZSwKICAgICAgICBzaXplID0gU2l6ZX0pIC0+Ci0gICAgd3JpdGUoVGhpcywge2J5dGUsIEt0eXBlfSksCi0gICAgd3JpdGUoVGhpcywge2J5dGUsIFZ0eXBlfSksCi0gICAgd3JpdGUoVGhpcywge2kzMiwgU2l6ZX0pLAotICAgIG9rOworICAgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCBLdHlwZX0pLAorICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtieXRlLCBWdHlwZX0pLAorICAgIHtUaGlzMywgb2t9ID0gd3JpdGUoVGhpczIsIHtpMzIsIFNpemV9KSwKKyAgICB7VGhpczMsIG9rfTsKIAotd3JpdGUoVGhpcywgbWFwX2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiB7VGhpcywgb2t9OwogCi13cml0ZShUaGlzLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKICAgICAgICAgZXR5cGUgPSBFdHlwZSwKICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgotICAgIHdyaXRlKFRoaXMsIHtieXRlLCBFdHlwZX0pLAotICAgIHdyaXRlKFRoaXMsIHtpMzIsIFNpemV9KSwKLSAgICBvazsKKyAgICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgRXR5cGV9KSwKKyAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7aTMyLCBTaXplfSksCisgICAge1RoaXMyLCBva307CiAKLXdyaXRlKFRoaXMsIGxpc3RfZW5kKSAtPiBvazsKK3dyaXRlKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OwogCi13cml0ZShUaGlzLCAjcHJvdG9jb2xfc2V0X2JlZ2lueword3JpdGUoVGhpczAsICNwcm90b2NvbF9zZXRfYmVnaW57CiAgICAgICAgIGV0eXBlID0gRXR5cGUsCiAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KLSAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgRXR5cGV9KSwKLSAgICB3cml0ZShUaGlzLCB7aTMyLCBTaXplfSksCi0gICAgb2s7CisgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsIEV0eXBlfSksCisgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2kzMiwgU2l6ZX0pLAorICAgIHtUaGlzMiwgb2t9OwogCi13cml0ZShUaGlzLCBzZXRfZW5kKSAtPiBvazsKK3dyaXRlKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXdyaXRlKFRoaXMsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSkgLT4gb2s7Ci13cml0ZShUaGlzLCBzdHJ1Y3RfZW5kKSAtPiBvazsKK3dyaXRlKFRoaXMsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSkgLT4ge1RoaXMsIG9rfTsKK3dyaXRlKFRoaXMsIHN0cnVjdF9lbmQpIC0+IHtUaGlzLCBva307CiAKIHdyaXRlKFRoaXMsIHtib29sLCB0cnVlfSkgIC0+IHdyaXRlKFRoaXMsIHtieXRlLCAxfSk7CiB3cml0ZShUaGlzLCB7Ym9vbCwgZmFsc2V9KSAtPiB3cml0ZShUaGlzLCB7Ynl0ZSwgMH0pOwpAQCAtMTUwLDE1MiArMTU0LDE2NiBAQAogd3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4KICAgICB3cml0ZShUaGlzLCA8PERvdWJsZTo2NC9iaWctc2lnbmVkLWZsb2F0Pj4pOwogCi13cml0ZShUaGlzLCB7c3RyaW5nLCBTdHJ9KSB3aGVuIGlzX2xpc3QoU3RyKSAtPgotICAgIHdyaXRlKFRoaXMsIHtpMzIsIGxlbmd0aChTdHIpfSksCi0gICAgd3JpdGUoVGhpcywgbGlzdF90b19iaW5hcnkoU3RyKSk7Cit3cml0ZShUaGlzMCwge3N0cmluZywgU3RyfSkgd2hlbiBpc19saXN0KFN0cikgLT4KKyAgICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7aTMyLCBsZW5ndGgoU3RyKX0pLAorICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIGxpc3RfdG9fYmluYXJ5KFN0cikpLAorICAgIHtUaGlzMiwgb2t9OwogCi13cml0ZShUaGlzLCB7c3RyaW5nLCBCaW59KSB3aGVuIGlzX2JpbmFyeShCaW4pIC0+Ci0gICAgd3JpdGUoVGhpcywge2kzMiwgc2l6ZShCaW4pfSksCi0gICAgd3JpdGUoVGhpcywgQmluKTsKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBCaW59KSB3aGVuIGlzX2JpbmFyeShCaW4pIC0+CisgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2kzMiwgc2l6ZShCaW4pfSksCisgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgQmluKSwKKyAgICB7VGhpczIsIG9rfTsKIAogJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVGhpcywgRGF0YSkgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRoaXMjYmluYXJ5X3Byb3RvY29sLnRyYW5zcG9ydCwgRGF0YSkuCit3cml0ZShUaGlzID0gI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc30sIERhdGEpIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoVHJhbnMsIERhdGEpLAorICAgIHtUaGlzI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgogCiAlJQogCi1yZWFkKFRoaXMsIG1lc3NhZ2VfYmVnaW4pIC0+Ci0gICAgY2FzZSByZWFkKFRoaXMsIHVpMzIpIG9mCityZWFkKFRoaXMwLCBtZXNzYWdlX2JlZ2luKSAtPgorICAgIHtUaGlzMSwgSW5pdGlhbH0gPSByZWFkKFRoaXMwLCB1aTMyKSwKKyAgICBjYXNlIEluaXRpYWwgb2YKICAgICAgICAge29rLCBTen0gd2hlbiBTeiBiYW5kID9WRVJTSU9OX01BU0sgPTo9ID9WRVJTSU9OXzEgLT4KICAgICAgICAgICAgICUlIHdlJ3JlIGF0IHZlcnNpb24gMQotICAgICAgICAgICAge29rLCBOYW1lfSAgPSByZWFkKFRoaXMsIHN0cmluZyksCi0gICAgICAgICAgICBUeXBlICAgICAgICA9IFN6IGJhbmQgP1RZUEVfTUFTSywKLSAgICAgICAgICAgIHtvaywgU2VxSWR9ID0gcmVhZChUaGlzLCBpMzIpLAotICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgID0gVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9OworICAgICAgICAgICAge1RoaXMyLCB7b2ssIE5hbWV9fSAgPSByZWFkKFRoaXMxLCBzdHJpbmcpLAorICAgICAgICAgICAge1RoaXMzLCB7b2ssIFNlcUlkfX0gPSByZWFkKFRoaXMyLCBpMzIpLAorICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgPSBTeiBiYW5kID9UWVBFX01BU0ssCisgICAgICAgICAgICB7VGhpczMsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gYmluYXJ5X3RvX2xpc3QoTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgID0gVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OwogCiAgICAgICAgIHtvaywgU3p9IHdoZW4gU3ogPCAwIC0+CiAgICAgICAgICAgICAlJSB0aGVyZSdzIGEgdmVyc2lvbiBudW1iZXIgYnV0IGl0J3MgdW5leHBlY3RlZAotICAgICAgICAgICAge2Vycm9yLCB7YmFkX2JpbmFyeV9wcm90b2NvbF92ZXJzaW9uLCBTen19OworICAgICAgICAgICAge1RoaXMxLCB7ZXJyb3IsIHtiYWRfYmluYXJ5X3Byb3RvY29sX3ZlcnNpb24sIFN6fX19OwogCi0gICAgICAgIHtvaywgU3p9IHdoZW4gVGhpcyNiaW5hcnlfcHJvdG9jb2wuc3RyaWN0X3JlYWQgPTo9IHRydWUgLT4KKyAgICAgICAge29rLCBfU3p9IHdoZW4gVGhpczEjYmluYXJ5X3Byb3RvY29sLnN0cmljdF9yZWFkID06PSB0cnVlIC0+CiAgICAgICAgICAgICAlJSBzdHJpY3RfcmVhZCBpcyB0cnVlIGFuZCB0aGVyZSdzIG5vIHZlcnNpb24gaGVhZGVyOyB0aGF0J3MgYW4gZXJyb3IKLSAgICAgICAgICAgIHtlcnJvciwgbm9fYmluYXJ5X3Byb3RvY29sX3ZlcnNpb259OworICAgICAgICAgICAge1RoaXMxLCB7ZXJyb3IsIG5vX2JpbmFyeV9wcm90b2NvbF92ZXJzaW9ufX07CiAKLSAgICAgICAge29rLCBTen0gd2hlbiBUaGlzI2JpbmFyeV9wcm90b2NvbC5zdHJpY3RfcmVhZCA9Oj0gZmFsc2UgLT4KKyAgICAgICAge29rLCBTen0gd2hlbiBUaGlzMSNiaW5hcnlfcHJvdG9jb2wuc3RyaWN0X3JlYWQgPTo9IGZhbHNlIC0+CiAgICAgICAgICAgICAlJSBzdHJpY3RfcmVhZCBpcyBmYWxzZSwgc28ganVzdCByZWFkIHRoZSBvbGQgd2F5Ci0gICAgICAgICAgICB7b2ssIE5hbWV9ICA9IHJlYWQoVGhpcywgU3opLAotICAgICAgICAgICAge29rLCBUeXBlfSAgPSByZWFkKFRoaXMsIGJ5dGUpLAotICAgICAgICAgICAge29rLCBTZXFJZH0gPSByZWFkKFRoaXMsIGkzMiksCi0gICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lICA9IGJpbmFyeV90b19saXN0KE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgPSBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH07CisgICAgICAgICAgICB7VGhpczIsIHtvaywgTmFtZX19ICA9IHJlYWRfZGF0YShUaGlzMSwgU3opLAorICAgICAgICAgICAge1RoaXMzLCB7b2ssIFR5cGV9fSAgPSByZWFkKFRoaXMyLCBieXRlKSwKKyAgICAgICAgICAgIHtUaGlzNCwge29rLCBTZXFJZH19ID0gcmVhZChUaGlzMywgaTMyKSwKKyAgICAgICAgICAgIHtUaGlzNCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgPSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfX07CiAKLSAgICAgICAgRXJyID0ge2Vycm9yLCBjbG9zZWR9IC0+IEVycjsKLSAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fS0+IEVycjsKLSAgICAgICAgRXJyID0ge2Vycm9yLCBlYmFkZn0gIC0+IEVycgorICAgICAgICBFbHNlIC0+CisgICAgICAgICAgICB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCi1yZWFkKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiBvazsKK3JlYWQoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CiAKLXJlYWQoVGhpcywgc3RydWN0X2JlZ2luKSAtPiBvazsKLXJlYWQoVGhpcywgc3RydWN0X2VuZCkgLT4gb2s7CityZWFkKFRoaXMsIHN0cnVjdF9iZWdpbikgLT4ge1RoaXMsIG9rfTsKK3JlYWQoVGhpcywgc3RydWN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotcmVhZChUaGlzLCBmaWVsZF9iZWdpbikgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgYnl0ZSkgb2YKK3JlYWQoVGhpczAsIGZpZWxkX2JlZ2luKSAtPgorICAgIHtUaGlzMSwgUmVzdWx0fSA9IHJlYWQoVGhpczAsIGJ5dGUpLAorICAgIGNhc2UgUmVzdWx0IG9mCiAgICAgICAgIHtvaywgVHlwZSA9ID90VHlwZV9TVE9QfSAtPgotICAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlfTsKKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlfX07CiAgICAgICAgIHtvaywgVHlwZX0gLT4KLSAgICAgICAgICAgIHtvaywgSWR9ID0gcmVhZChUaGlzLCBpMTYpLAotICAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gSWR9CisgICAgICAgICAgICB7VGhpczIsIHtvaywgSWR9fSA9IHJlYWQoVGhpczEsIGkxNiksCisgICAgICAgICAgICB7VGhpczIsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gSWR9fQogICAgIGVuZDsKIAotcmVhZChUaGlzLCBmaWVsZF9lbmQpIC0+IG9rOworcmVhZChUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXJlYWQoVGhpcywgbWFwX2JlZ2luKSAtPgotICAgIHtvaywgS3R5cGV9ID0gcmVhZChUaGlzLCBieXRlKSwKLSAgICB7b2ssIFZ0eXBlfSA9IHJlYWQoVGhpcywgYnl0ZSksCi0gICAge29rLCBTaXplfSAgPSByZWFkKFRoaXMsIGkzMiksCi0gICAgI3Byb3RvY29sX21hcF9iZWdpbntrdHlwZSA9IEt0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBWdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfTsKLXJlYWQoVGhpcywgbWFwX2VuZCkgLT4gb2s7CityZWFkKFRoaXMwLCBtYXBfYmVnaW4pIC0+CisgICAge1RoaXMxLCB7b2ssIEt0eXBlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICB7VGhpczIsIHtvaywgVnR5cGV9fSA9IHJlYWQoVGhpczEsIGJ5dGUpLAorICAgIHtUaGlzMywge29rLCBTaXplfX0gID0gcmVhZChUaGlzMiwgaTMyKSwKKyAgICB7VGhpczMsICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBLdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotcmVhZChUaGlzLCBsaXN0X2JlZ2luKSAtPgotICAgIHtvaywgRXR5cGV9ID0gcmVhZChUaGlzLCBieXRlKSwKLSAgICB7b2ssIFNpemV9ICA9IHJlYWQoVGhpcywgaTMyKSwKLSAgICAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfTsKLXJlYWQoVGhpcywgbGlzdF9lbmQpIC0+IG9rOworcmVhZChUaGlzMCwgbGlzdF9iZWdpbikgLT4KKyAgICB7VGhpczEsIHtvaywgRXR5cGV9fSA9IHJlYWQoVGhpczAsIGJ5dGUpLAorICAgIHtUaGlzMiwge29rLCBTaXplfX0gID0gcmVhZChUaGlzMSwgaTMyKSwKKyAgICB7VGhpczIsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworcmVhZChUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotcmVhZChUaGlzLCBzZXRfYmVnaW4pIC0+Ci0gICAge29rLCBFdHlwZX0gPSByZWFkKFRoaXMsIGJ5dGUpLAotICAgIHtvaywgU2l6ZX0gID0gcmVhZChUaGlzLCBpMzIpLAotICAgICNwcm90b2NvbF9zZXRfYmVnaW57ZXR5cGUgPSBFdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfTsKLXJlYWQoVGhpcywgc2V0X2VuZCkgLT4gb2s7CityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgICAge1RoaXMxLCB7b2ssIEV0eXBlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICB7VGhpczIsIHtvaywgU2l6ZX19ICA9IHJlYWQoVGhpczEsIGkzMiksCisgICAge1RoaXMyLCAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gRXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OwogCi1yZWFkKFRoaXMsIGZpZWxkX3N0b3ApIC0+Ci0gICAge29rLCA/dFR5cGVfU1RPUH0gPSAgcmVhZChUaGlzLCBieXRlKSwKLSAgICBvazsKK3JlYWQoVGhpczAsIGZpZWxkX3N0b3ApIC0+CisgICAge1RoaXMxLCB7b2ssID90VHlwZV9TVE9QfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICB7VGhpczEsIG9rfTsKIAogJSUKIAotcmVhZChUaGlzLCBib29sKSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCBieXRlKSBvZgotICAgICAgICB7b2ssIEJ5dGV9IC0+IHtvaywgQnl0ZSAvPSAwfTsKLSAgICAgICAgRWxzZSAtPiBFbHNlCityZWFkKFRoaXMwLCBib29sKSAtPgorICAgIHtUaGlzMSwgUmVzdWx0fSA9IHJlYWQoVGhpczAsIGJ5dGUpLAorICAgIGNhc2UgUmVzdWx0IG9mCisgICAgICAgIHtvaywgQnl0ZX0gLT4ge1RoaXMxLCB7b2ssIEJ5dGUgLz0gMH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgYnl0ZSkgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgMSkgb2YKLSAgICAgICAge29rLCA8PFZhbDo4L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIGJ5dGUpIC0+CisgICAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICAgIGNhc2UgQnl0ZXMgb2YKKyAgICAgICAge29rLCA8PFZhbDo4L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgaTE2KSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCAyKSBvZgotICAgICAgICB7b2ssIDw8VmFsOjE2L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAgICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgMiksCisgICAgY2FzZSBCeXRlcyBvZgorICAgICAgICB7b2ssIDw8VmFsOjE2L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgaTMyKSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCA0KSBvZgotICAgICAgICB7b2ssIDw8VmFsOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIGkzMikgLT4KKyAgICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgNCksCisgICAgY2FzZSBCeXRlcyBvZgorICAgICAgICB7b2ssIDw8VmFsOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKICUlIHVuc2lnbmVkIGludHMgYXJlbid0IHVzZWQgYnkgdGhyaWZ0IGl0c2VsZiwgYnV0IGl0J3MgdXNlZCBmb3IgdGhlIHBhcnNpbmcKICUlIG9mIHRoZSBwYWNrZXQgdmVyc2lvbiBoZWFkZXIuIFdpdGhvdXQgdGhpcyBzcGVjaWFsIGZ1bmN0aW9uIEJFQU0gd29ya3MgZmluZQogJSUgYnV0IGhpcGUgdGhpbmtzIGl0IHJlY2VpdmVkIGEgYmFkIHZlcnNpb24gaGVhZGVyLgotcmVhZChUaGlzLCB1aTMyKSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCA0KSBvZgotICAgICAgICB7b2ssIDw8VmFsOjMyL2ludGVnZXItdW5zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7b2ssIFZhbH07Ci0gICAgICAgIEVsc2UgLT4gRWxzZQorcmVhZChUaGlzMCwgdWkzMikgLT4KKyAgICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgNCksCisgICAgY2FzZSBCeXRlcyBvZgorICAgICAgICB7b2ssIDw8VmFsOjMyL2ludGVnZXItdW5zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQogICAgIGVuZDsKIAotcmVhZChUaGlzLCBpNjQpIC0+Ci0gICAgY2FzZSByZWFkKFRoaXMsIDgpIG9mCi0gICAgICAgIHtvaywgPDxWYWw6NjQvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7b2ssIFZhbH07Ci0gICAgICAgIEVsc2UgLT4gRWxzZQorcmVhZChUaGlzMCwgaTY0KSAtPgorICAgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCA4KSwKKyAgICBjYXNlIEJ5dGVzIG9mCisgICAgICAgIHtvaywgPDxWYWw6NjQvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQogICAgIGVuZDsKIAotcmVhZChUaGlzLCBkb3VibGUpIC0+Ci0gICAgY2FzZSByZWFkKFRoaXMsIDgpIG9mCi0gICAgICAgIHtvaywgPDxWYWw6NjQvZmxvYXQtc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAgICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgOCksCisgICAgY2FzZSBCeXRlcyBvZgorICAgICAgICB7b2ssIDw8VmFsOjY0L2Zsb2F0LXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICAgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCiAlIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5Ci1yZWFkKFRoaXMsIHN0cmluZykgLT4KLSAgICB7b2ssIFN6fSAgPSByZWFkKFRoaXMsIGkzMiksCi0gICAge29rLCBCaW59ID0gcmVhZChUaGlzLCBTeik7CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgICAge1RoaXMxLCB7b2ssIFN6fX0gID0gcmVhZChUaGlzMCwgaTMyKSwKKyAgICByZWFkX2RhdGEoVGhpczEsIFN6KS4KIAotcmVhZChUaGlzLCAwKSAtPiB7b2ssIDw8Pj59OwotcmVhZChUaGlzLCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6cmVhZChUaGlzI2JpbmFyeV9wcm90b2NvbC50cmFuc3BvcnQsIExlbikuCistc3BlYyByZWFkX2RhdGEoI2JpbmFyeV9wcm90b2NvbHt9LCBub25fbmVnX2ludGVnZXIoKSkgLT4KKyAgICB7I2JpbmFyeV9wcm90b2NvbHt9LCB7b2ssIGJpbmFyeSgpfSB8IHtlcnJvciwgX1JlYXNvbn19LgorcmVhZF9kYXRhKFRoaXMsIDApIC0+IHtUaGlzLCB7b2ssIDw8Pj59fTsKK3JlYWRfZGF0YShUaGlzID0gI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc30sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgYW5kYWxzbyBMZW4gPiAwIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChUcmFucywgTGVuKSwKKyAgICB7VGhpcyNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KIAogCiAlJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCkBAIC0zMTUsMTEgKzMzMywxNSBAQAogbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgT3B0aW9ucykgLT4KICAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICN0YnBfb3B0c3t9KSwKICAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSBUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoCi0gICAgICAgICAgICAgICAgICBUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBbe3N0cmljdF9yZWFkLCAgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3RfcmVhZH0sCi0gICAgICAgICAgICAgICAgICAge3N0cmljdF93cml0ZSwgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3Rfd3JpdGV9XSkKKyAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0RmFjdG9yeSgpIG9mCisgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7c3RyaWN0X3JlYWQsICBQYXJzZWRPcHRzI3RicF9vcHRzLnN0cmljdF9yZWFkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmljdF93cml0ZSwgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3Rfd3JpdGV9XSk7CisgICAgICAgICAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgICAgICAgICAgICAgIGVuZAogICAgICAgICBlbmQsCiAgICAge29rLCBGfS4KIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybAppbmRleCBlYmMxNmJkLi5lOWQzZmZmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybApAQCAtMTksMTYyICsxOSw4MCBAQAogCiAtbW9kdWxlKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgogCi0tYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMSwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KLQotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLS1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgaGFuZGxlX2luZm8vMiwKLSAgICAgICAgIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuCi0KLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KLQotLXJlY29yZChidWZmZXJlZF90cmFuc3BvcnQsIHt3cmFwcGVkLCAlIGEgdGhyaWZ0X3RyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBBUEkKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBzdGFydF9saW5rKCkgLT4ge29rLFBpZH0gfCBpZ25vcmUgfCB7ZXJyb3IsRXJyb3J9Ci0lJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIGNhc2UgZ2VuX3NlcnZlcjpzdGFydF9saW5rKD9NT0RVTEUsIFtXcmFwcGVkVHJhbnNwb3J0XSwgW10pIG9mCi0gICAgICAgIHtvaywgUGlkfSAtPgotICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgUGlkKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KKyUlIGNvbnN0cnVjdG9yCistZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KIAogCistcmVjb3JkKHRfYnVmZmVyZWQsIHsKKyAgd3JhcHBlZCwKKyAgd3JpdGVfYnVmZmVyCit9KS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4gb2sKLSUlCi0lJSBEYXRhID0gaW9saXN0KCkKLSUlCi0lJSBEZXNjcmlwdGlvbjogV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3dyaXRlLCBEYXRhfSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2J1ZmZlcmVke30uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBmbHVzaChUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZmx1c2goVHJhbnNwb3J0KSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIGZsdXNoKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGNsb3NlKFRyYW5zcG9ydCkgLT4gb2sKLSUlCi0lJSBEZXNjcmlwdGlvbjogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgYW5kIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xvc2UoVHJhbnNwb3J0KSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FzdChUcmFuc3BvcnQsIGNsb3NlKS4KKy1zcGVjIG5ldyhUcmFuc3BvcnQ6OnRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogUmVhZChUcmFuc3BvcnQsIExlbikgLT4ge29rLCBEYXRhfQotJSUKLSUlIERhdGEgPSBiaW5hcnkoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc29wcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3JlYWQsIExlbn0sIF9UaW1lb3V0PTEwMDAwKS4KK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2J1ZmZlcmVkeworICAgIHdyYXBwZWQgPSBXcmFwcGVkLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGluaXQoQXJncykgLT4ge29rLCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbn0KLSUlIERlc2NyaXB0aW9uOiBJbml0aWF0ZXMgdGhlIHNlcnZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW5pdChbV3JhcHBlZF0pIC0+Ci0gICAge29rLCAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgPSBbXX19LgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogJSUgaGFuZGxlX2NhbGwoUmVxdWVzdCwgRnJvbSwgU3RhdGUpIC0+IHtyZXBseSwgUmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JlcGx5LCBSZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBSZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfY2FsbCh7d3JpdGUsIERhdGF9LCBfRnJvbSwgU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9KSAtPgotICAgIHtyZXBseSwgb2ssIFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19fTsKIAotaGFuZGxlX2NhbGwoe3JlYWQsIExlbn0sIF9Gcm9tLCBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIFJlc3BvbnNlID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQsIExlbiksCi0gICAge3JlcGx5LCBSZXNwb25zZSwgU3RhdGV9OworJSUgcmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0CityZWFkKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZCwgTGVuKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgUmVzcG9uc2V9LgogCi1oYW5kbGVfY2FsbChmbHVzaCwgX0Zyb20sIFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIFJlc3BvbnNlID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBXQnVmKSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQpLAotICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbXX19LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2Nhc3QoY2xvc2UsIFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZH0pIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBXQnVmKSwKLSAgICAlJSBXcmFwcGVkIGlzIGNsb3NlZCBieSB0ZXJtaW5hdGUvMgotICAgICUlICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQgfnA6IGNsb3NpbmciLCBbc2VsZigpXSksCi0gICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9OwotaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZT0jYnVmZmVyZWRfdHJhbnNwb3J0e30pIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KKyUlIHJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFdyYXBwZWQsIExlbiksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIFJlc3BvbnNlfS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfaW5mbyhfSW5mbywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiB2b2lkKCkKLSUlIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIGdlbl9zZXJ2ZXIgd2hlbiBpdCBpcyBhYm91dCB0bwotJSUgdGVybWluYXRlLiBJdCBzaG91bGQgYmUgdGhlIG9wcG9zaXRlIG9mIE1vZHVsZTppbml0LzEgYW5kIGRvIGFueSBuZWNlc3NhcnkKLSUlIGNsZWFuaW5nIHVwLiBXaGVuIGl0IHJldHVybnMsIHRoZSBnZW5fc2VydmVyIHRlcm1pbmF0ZXMgd2l0aCBSZWFzb24uCi0lJSBUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi10ZXJtaW5hdGUoX1JlYXNvbiwgU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQ9V3JhcHBlZH0pIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKLSAgICBvay4KK3dyaXRlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmM6IGNvZGVfY2hhbmdlKE9sZFZzbiwgU3RhdGUsIEV4dHJhKSAtPiB7b2ssIE5ld1N0YXRlfQotJSUgRGVzY3JpcHRpb246IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY29kZV9jaGFuZ2UoX09sZFZzbiwgU3RhdGUsIF9FeHRyYSkgLT4KLSAgICB7b2ssIFN0YXRlfS4KKworZmx1c2goU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZCwgd3JpdGVfYnVmZmVyID0gQnVmZmVyfSkgLT4KKyAgY2FzZSBpb2xpc3Rfc2l6ZShCdWZmZXIpIG9mCisgICAgJSUgaWYgd3JpdGUgYnVmZmVyIGlzIGVtcHR5LCBkbyBub3RoaW5nCisgICAgMCAtPiB7U3RhdGUsIG9rfTsKKyAgICBfIC0+CisgICAgICB7V3JpdHRlbiwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBCdWZmZXIpLAorICAgICAge0ZsdXNoZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JpdHRlbiksCisgICAgICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gRmx1c2hlZCwgd3JpdGVfYnVmZmVyID0gW119LCBSZXNwb25zZX0KKyAgZW5kLgorCisKK2Nsb3NlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICB7Q2xvc2VkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IENsb3NlZH0sIFJlc3VsdH0uCisKIAogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJSUlIEludGVybmFsIGZ1bmN0aW9ucwogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQogbmV3X3RyYW5zcG9ydF9mYWN0b3J5KFdyYXBGYWN0b3J5KSAtPgotICAgIEYgPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIG5ldyhXcmFwcGVkKQotICAgICAgICBlbmQsCi0gICAge29rLCBGfS4KKyAgRiA9IGZ1bigpIC0+CisgICAge29rLCBXcmFwcGVkfSA9IFdyYXBGYWN0b3J5KCksCisgICAgbmV3KFdyYXBwZWQpCisgIGVuZCwKKyAge29rLCBGfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybAppbmRleCBkNWJiMTQ2Li4xYTljYjUwIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybApAQCAtMTksMzY2ICsxOSwxNDQgQEAKIAogLW1vZHVsZSh0aHJpZnRfY2xpZW50KS4KIAotLWJlaGF2aW91cihnZW5fc2VydmVyKS4KLQogJSUgQVBJCi0tZXhwb3J0KFtzdGFydF9saW5rLzIsIHN0YXJ0X2xpbmsvMywgc3RhcnRfbGluay80LAotICAgICAgICAgc3RhcnQvMywgc3RhcnQvNCwKLSAgICAgICAgIGNhbGwvMywgc2VuZF9jYWxsLzMsIGNsb3NlLzFdKS4KLQotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLS1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgaGFuZGxlX2luZm8vMiwKLSAgICAgICAgIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuCi0KKy1leHBvcnQoW25ldy8yLCBjYWxsLzMsIHNlbmRfY2FsbC8zLCBjbG9zZS8xXSkuCiAKIC1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KIAotLXJlY29yZChzdGF0ZSwge3NlcnZpY2UsIHByb3RvY29sLCBzZXFpZH0pLgotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBBUEkKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBzdGFydF9saW5rKCkgLT4ge29rLFBpZH0gfCBpZ25vcmUgfCB7ZXJyb3IsRXJyb3J9Ci0lJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIgYXMgYSBsaW5rZWQgcHJvY2Vzcy4KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXJ0X2xpbmsoSG9zdCwgUG9ydCwgU2VydmljZSkgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLCBpc19hdG9tKFNlcnZpY2UpIC0+Ci0gICAgc3RhcnRfbGluayhIb3N0LCBQb3J0LCBTZXJ2aWNlLCBbXSkuCi0KLXN0YXJ0X2xpbmsoSG9zdCwgUG9ydCwgU2VydmljZSwgT3B0aW9ucykgLT4KLSAgICBzdGFydChIb3N0LCBQb3J0LCBTZXJ2aWNlLCBbe21vbml0b3IsIGxpbmt9IHwgT3B0aW9uc10pLgotCi1zdGFydF9saW5rKFByb3RvY29sRmFjdG9yeSwgU2VydmljZSkgLT4KLSAgICBzdGFydChQcm90b2NvbEZhY3RvcnksIFNlcnZpY2UsIFt7bW9uaXRvciwgbGlua31dKS4KLQotJSUKLSUlIFNwbGl0cyBjbGllbnQgb3B0aW9ucyBpbnRvIHByb3RvY29sIG9wdGlvbnMgYW5kIHRyYW5zcG9ydCBvcHRpb25zCi0lJQotJSUgc3BsaXRfb3B0aW9ucyhbT3B0aW9ucy4uLl0pIC0+IHtQcm90b2NvbE9wdGlvbnMsIFRyYW5zcG9ydE9wdGlvbnN9Ci0lJQotc3BsaXRfb3B0aW9ucyhPcHRpb25zKSAtPgotICAgIHNwbGl0X29wdGlvbnMoT3B0aW9ucywgW10sIFtdLCBbXSkuCi0KLXNwbGl0X29wdGlvbnMoW10sIENsaWVudEluLCBQcm90b0luLCBUcmFuc0luKSAtPgotICAgIHtDbGllbnRJbiwgUHJvdG9JbiwgVHJhbnNJbn07Ci0KLXNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIENsaWVudEluLCBQcm90b0luLCBUcmFuc0luKQotICB3aGVuIE9wdEtleSA9Oj0gbW9uaXRvciAtPgotICAgIHNwbGl0X29wdGlvbnMoUmVzdCwgW09wdCB8IENsaWVudEluXSwgUHJvdG9JbiwgVHJhbnNJbik7Ci0KLXNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIENsaWVudEluLCBQcm90b0luLCBUcmFuc0luKQotICB3aGVuIE9wdEtleSA9Oj0gc3RyaWN0X3JlYWQ7Ci0gICAgICAgT3B0S2V5ID06PSBzdHJpY3Rfd3JpdGUgLT4KLSAgICBzcGxpdF9vcHRpb25zKFJlc3QsIENsaWVudEluLCBbT3B0IHwgUHJvdG9Jbl0sIFRyYW5zSW4pOwotCi1zcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBDbGllbnRJbiwgUHJvdG9JbiwgVHJhbnNJbikKLSAgd2hlbiBPcHRLZXkgPTo9IGZyYW1lZDsKLSAgICAgICBPcHRLZXkgPTo9IGNvbm5lY3RfdGltZW91dDsKLSAgICAgICBPcHRLZXkgPTo9IHNvY2tvcHRzIC0+Ci0gICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBDbGllbnRJbiwgUHJvdG9JbiwgW09wdCB8IFRyYW5zSW5dKS4KKy1yZWNvcmQodGNsaWVudCwge3NlcnZpY2UsIHByb3RvY29sLCBzZXFpZH0pLgogCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBzdGFydCgpIC0+IHtvayxQaWR9IHwgaWdub3JlIHwge2Vycm9yLEVycm9yfQotJSUgRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgc2VydmVyIGFzIGFuIHVubGlua2VkIHByb2Nlc3MuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituZXcoUHJvdG9jb2wsIFNlcnZpY2UpCisgIHdoZW4gaXNfYXRvbShTZXJ2aWNlKSAtPgorICAgIHtvaywgI3RjbGllbnR7cHJvdG9jb2wgPSBQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgc2VxaWQgPSAwfX0uCiAKLSUlIEJhY2t3YXJkcy1jb21wYXRpYmxlIHN0YXJ0ZXIgZm9yIHRoZSBjb21tb24tY2FzZSBvZiBzb2NrZXQgdHJhbnNwb3J0cwotc3RhcnQoSG9zdCwgUG9ydCwgU2VydmljZSwgT3B0aW9ucykKLSAgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLCBpc19hdG9tKFNlcnZpY2UpLCBpc19saXN0KE9wdGlvbnMpIC0+Ci0gICAge0NsaWVudE9wdHMsIFByb3RvT3B0cywgVHJhbnNPcHRzfSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCistc3BlYyBjYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCitjYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQord2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgorICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgorICAgIHtvaywgQ2xpZW50MX0gLT4gcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOworICAgIHt7ZXJyb3IsIFh9LCBDbGllbnQxfSAtPiB7Q2xpZW50MSwge2Vycm9yLCBYfX07CisgICAgRWxzZSAtPiBFbHNlCisgIGVuZC4KIAotICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzKSwKLQotICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMpLAotCi0gICAgc3RhcnQoUHJvdG9jb2xGYWN0b3J5LCBTZXJ2aWNlLCBDbGllbnRPcHRzKS4KLQotCi0lJSBQcm90b2NvbEZhY3RvcnkgOjogZnVuKCkgLT4gdGhyaWZ0X3Byb3RvY29sKCkKLXN0YXJ0KFByb3RvY29sRmFjdG9yeSwgU2VydmljZSwgQ2xpZW50T3B0cykKLSAgd2hlbiBpc19mdW5jdGlvbihQcm90b2NvbEZhY3RvcnkpLCBpc19hdG9tKFNlcnZpY2UpIC0+Ci0gICAge1N0YXJ0ZXIsIE9wdHN9ID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gobW9uaXRvciwgMSwgQ2xpZW50T3B0cykgb2YKLSAgICAgICAgICAgIHt2YWx1ZSwge21vbml0b3IsIGxpbmt9fSAtPgotICAgICAgICAgICAgICAgIHtzdGFydF9saW5rLCBbXX07Ci0gICAgICAgICAgICB7dmFsdWUsIHttb25pdG9yLCB0ZXRoZXJ9fSAtPgotICAgICAgICAgICAgICAgIHtzdGFydCwgW3t0ZXRoZXIsIHNlbGYoKX1dfTsKLSAgICAgICAgICAgIF8gLT4KLSAgICAgICAgICAgICAgICB7c3RhcnQsIFtdfQotICAgICAgICBlbmQsCi0KLSAgICBDb25uZWN0ID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2goY29ubmVjdCwgMSwgQ2xpZW50T3B0cykgb2YKLSAgICAgICAgICAgIHt2YWx1ZSwge2Nvbm5lY3QsIENob2ljZX19IC0+Ci0gICAgICAgICAgICAgICAgQ2hvaWNlOwotICAgICAgICAgICAgXyAtPgotICAgICAgICAgICAgICAgICUlIEJ5IGRlZmF1bHQsIGNvbm5lY3QgYXQgY3JlYXRpb24tdGltZS4KLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgIGVuZCwKLQotCi0gICAgU3RhcnRlZCA9IGdlbl9zZXJ2ZXI6U3RhcnRlcig/TU9EVUxFLCBbU2VydmljZSwgT3B0c10sIFtdKSwKLQotICAgIGlmCi0gICAgICAgIENvbm5lY3QgLT4KLSAgICAgICAgICAgIGNhc2UgU3RhcnRlZCBvZgotICAgICAgICAgICAgICAgIHtvaywgUGlkfSAtPgotICAgICAgICAgICAgICAgICAgICBjYXNlIGdlbl9zZXJ2ZXI6Y2FsbChQaWQsIHtjb25uZWN0LCBQcm90b2NvbEZhY3Rvcnl9KSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgb2sgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFBpZH07Ci0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yCi0gICAgICAgICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgIEVsc2UKLSAgICAgICAgICAgIGVuZDsKLSAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAgU3RhcnRlZAotICAgIGVuZC4KLQotY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX3BpZChDbGllbnQpLCBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIGNhc2UgZ2VuX3NlcnZlcjpjYWxsKENsaWVudCwge2NhbGwsIEZ1bmN0aW9uLCBBcmdzfSkgb2YKLSAgICAgICAgUiA9IHtvaywgX30gLT4gUjsKLSAgICAgICAgUiA9IHtlcnJvciwgX30gLT4gUjsKLSAgICAgICAge2V4Y2VwdGlvbiwgRXhjZXB0aW9ufSAtPiB0aHJvdyhFeGNlcHRpb24pCi0gICAgZW5kLgotCi1jYXN0KENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpCi0gIHdoZW4gaXNfcGlkKENsaWVudCksIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYXN0KENsaWVudCwge2NhbGwsIEZ1bmN0aW9uLCBBcmdzfSkuCiAKICUlIFNlbmRzIGEgZnVuY3Rpb24gY2FsbCBidXQgZG9lcyBub3QgcmVhZCB0aGUgcmVzdWx0LiBUaGlzIGlzIHVzZWZ1bAogJSUgaWYgeW91J3JlIHRyeWluZyB0byBsb2cgbm9uLW9uZXdheSBmdW5jdGlvbiBjYWxscyB0byB3cml0ZS1vbmx5CiAlJSB0cmFuc3BvcnRzIGxpa2UgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydC4KLXNlbmRfY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX3BpZChDbGllbnQpLCBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChDbGllbnQsIHtzZW5kX2NhbGwsIEZ1bmN0aW9uLCBBcmdzfSkuCi0KLWNsb3NlKENsaWVudCkgd2hlbiBpc19waWQoQ2xpZW50KSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FzdChDbGllbnQsIGNsb3NlKS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGluaXQoQXJncykgLT4ge29rLCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbn0KLSUlIERlc2NyaXB0aW9uOiBJbml0aWF0ZXMgdGhlIHNlcnZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW5pdChbU2VydmljZSwgT3B0c10pIC0+Ci0gICAgY2FzZSBsaXN0czprZXlzZWFyY2godGV0aGVyLCAxLCBPcHRzKSBvZgotICAgICAgICB7dmFsdWUsIHt0ZXRoZXIsIFBpZH19IC0+Ci0gICAgICAgICAgICBlcmxhbmc6bW9uaXRvcihwcm9jZXNzLCBQaWQpOwotICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQsCi0gICAge29rLCAjc3RhdGV7c2VydmljZSA9IFNlcnZpY2V9fS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2NhbGwoe2Nvbm5lY3QsIFByb3RvY29sRmFjdG9yeX0sIF9Gcm9tLAotICAgICAgICAgICAgU3RhdGUgPSAjc3RhdGV7c2VydmljZSA9IFNlcnZpY2V9KSAtPgotICAgIGNhc2UgUHJvdG9jb2xGYWN0b3J5KCkgb2YKLSAgICAgICAge29rLCBQcm90b2NvbH0gLT4KLSAgICAgICAgICAgIHtyZXBseSwgb2ssIFN0YXRlI3N0YXRle3Byb3RvY29sID0gUHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IDB9fTsKLSAgICAgICAgRXJyb3IgLT4KLSAgICAgICAgICAgIHtzdG9wLCBub3JtYWwsIEVycm9yLCBTdGF0ZX0KLSAgICBlbmQ7Ci0KLWhhbmRsZV9jYWxsKHtjYWxsLCBGdW5jdGlvbiwgQXJnc30sIF9Gcm9tLCBTdGF0ZSA9ICNzdGF0ZXtzZXJ2aWNlID0gU2VydmljZX0pIC0+Ci0gICAgUmVzdWx0ID0gY2F0Y2hfZnVuY3Rpb25fZXhjZXB0aW9ucygKLSAgICAgICAgICAgICAgIGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgIG9rID0gc2VuZF9mdW5jdGlvbl9jYWxsKFN0YXRlLCBGdW5jdGlvbiwgQXJncyksCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KFN0YXRlLCBGdW5jdGlvbikKLSAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgIFNlcnZpY2UpLAotICAgIHtyZXBseSwgUmVzdWx0LCBTdGF0ZX07Ci0KLQotaGFuZGxlX2NhbGwoe3NlbmRfY2FsbCwgRnVuY3Rpb24sIEFyZ3N9LCBfRnJvbSwgU3RhdGUgPSAjc3RhdGV7c2VydmljZSA9IFNlcnZpY2V9KSAtPgotICAgIFJlc3VsdCA9IGNhdGNoX2Z1bmN0aW9uX2V4Y2VwdGlvbnMoCi0gICAgICAgICAgICAgICBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2Z1bmN0aW9uX2NhbGwoU3RhdGUsIEZ1bmN0aW9uLCBBcmdzKQotICAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICAgU2VydmljZSksCi0gICAge3JlcGx5LCBSZXN1bHQsIFN0YXRlfS4KLQotCi0lJSBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjYXRjaGVzIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHNlbmRpbmcgb3IgcmVjZWl2aW5nCi0lJSBhIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3BvbnNlIGZvciBjYWxsIG9yIHNlbmRfb25seSBhYm92ZS4KLWNhdGNoX2Z1bmN0aW9uX2V4Y2VwdGlvbnMoRnVuLCBTZXJ2aWNlKSAtPgotICAgIHRyeQotICAgICAgICBGdW4oKQotICAgIGNhdGNoCi0gICAgICAgIHRocm93OntyZXR1cm4sIFJldHVybn0gLT4KLSAgICAgICAgICAgIFJldHVybjsKLSAgICAgICAgICBlcnJvcjpmdW5jdGlvbl9jbGF1c2UgLT4KLSAgICAgICAgICAgIFNUID0gZXJsYW5nOmdldF9zdGFja3RyYWNlKCksCi0gICAgICAgICAgICBjYXNlIGhkKFNUKSBvZgotICAgICAgICAgICAgICAgIHtTZXJ2aWNlLCBmdW5jdGlvbl9pbmZvLCBbRnVuY3Rpb24sIF9dfSAtPgotICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fTsKLSAgICAgICAgICAgICAgICBfIC0+IHRocm93KHtlcnJvciwge2Z1bmN0aW9uX2NsYXVzZSwgU1R9fSkKLSAgICAgICAgICAgIGVuZAorLXNwZWMgc2VuZF9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwgb2t9Lgorc2VuZF9jYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQorICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+CisgICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICAgIHtvaywgQ2xpZW50MX0gLT4ge0NsaWVudDEsIG9rfTsKKyAgICAgIEVsc2UgLT4gRWxzZQogICAgIGVuZC4KIAorLXNwZWMgY2xvc2UoI3RjbGllbnR7fSkgLT4gb2suCitjbG9zZSgjdGNsaWVudHtwcm90b2NvbD1Qcm90b2NvbH0pIC0+CisgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90b2NvbCkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FzdChNc2csIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfY2FzdCh7Y2FsbCwgRnVuY3Rpb24sIEFyZ3N9LCBTdGF0ZSA9ICNzdGF0ZXtzZXJ2aWNlID0gU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfSkgLT4KLSAgICBfUmVzdWx0ID0KLSAgICAgICAgdHJ5Ci0gICAgICAgICAgICBvayA9IHNlbmRfZnVuY3Rpb25fY2FsbChTdGF0ZSwgRnVuY3Rpb24sIEFyZ3MpLAotICAgICAgICAgICAgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoU3RhdGUsIEZ1bmN0aW9uKQotICAgICAgICBjYXRjaAotICAgICAgICAgICAgQ2xhc3M6UmVhc29uIC0+Ci0gICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX21zZygiZXJyb3IgaWdub3JlZCBpbiBoYW5kbGVfY2FzdCh7Y2FzdCwuLi59LC4uLik6IH5wOn5wfm4iLCBbQ2xhc3MsIFJlYXNvbl0pCi0gICAgICAgIGVuZCwKLQotICAgIHtub3JlcGx5LCBTdGF0ZX07Ci0KLWhhbmRsZV9jYXN0KGNsb3NlLCBTdGF0ZT0jc3RhdGV7cHJvdG9jb2wgPSBQcm90b2NvbH0pIC0+Ci0lJSAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0aHJpZnRfY2xpZW50IH5wIHJlY2VpdmVkIGNsb3NlIiwgW3NlbGYoKV0pLAotICAgIHtzdG9wLG5vcm1hbCxTdGF0ZX07Ci1oYW5kbGVfY2FzdChfTXNnLCBTdGF0ZSkgLT4KLSAgICB7bm9yZXBseSwgU3RhdGV9LgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaGFuZGxlX2luZm8oSW5mbywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgYWxsIG5vbiBjYWxsL2Nhc3QgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9pbmZvKHsnRE9XTicsIE1vbml0b3JSZWYsIHByb2Nlc3MsIFBpZCwgX0luZm99LCBTdGF0ZSkKLSAgd2hlbiBpc19yZWZlcmVuY2UoTW9uaXRvclJlZiksIGlzX3BpZChQaWQpIC0+Ci0gICAgJSUgV2UgZG9uJ3QgYWN0dWFsbHkgdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgRE9XTiBtZXNzYWdlLgotICAgIHtzdG9wLCBwYXJlbnRfZGllZCwgU3RhdGV9OwotCi1oYW5kbGVfaW5mbyhfSW5mbywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiB2b2lkKCkKLSUlIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIGdlbl9zZXJ2ZXIgd2hlbiBpdCBpcyBhYm91dCB0bwotJSUgdGVybWluYXRlLiBJdCBzaG91bGQgYmUgdGhlIG9wcG9zaXRlIG9mIE1vZHVsZTppbml0LzEgYW5kIGRvIGFueSBuZWNlc3NhcnkKLSUlIGNsZWFuaW5nIHVwLiBXaGVuIGl0IHJldHVybnMsIHRoZSBnZW5fc2VydmVyIHRlcm1pbmF0ZXMgd2l0aCBSZWFzb24uCi0lJSBUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi10ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSA9ICNzdGF0ZXtwcm90b2NvbD11bmRlZmluZWR9KSAtPgotICAgIG9rOwotdGVybWluYXRlKFJlYXNvbiwgU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2w9UHJvdG9jb2x9KSAtPgotICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG9jb2wpLAotICAgIG9rLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4ge29rLCBOZXdTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvZGVfY2hhbmdlKF9PbGRWc24sIFN0YXRlLCBfRXh0cmEpIC0+Ci0gICAge29rLCBTdGF0ZX0uCiAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNlbmRfZnVuY3Rpb25fY2FsbCgjc3RhdGV7cHJvdG9jb2wgPSBQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSAgPSBTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKLSAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICBBcmdzKSAtPgotICAgIFBhcmFtcyA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLAotICAgIHtzdHJ1Y3QsIFBMaXN0fSA9IFBhcmFtcywKLSAgICBpZgotICAgICAgICBsZW5ndGgoUExpc3QpID0vPSBsZW5ndGgoQXJncykgLT4KLSAgICAgICAgICAgIHRocm93KHtyZXR1cm4sIHtlcnJvciwge2JhZF9hcmdzLCBGdW5jdGlvbiwgQXJnc319fSk7Ci0gICAgICAgIHRydWUgLT4gb2sKLSAgICBlbmQsCistc3BlYyBzZW5kX2Z1bmN0aW9uX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHtvayB8IHtlcnJvciwgYW55KCl9LCAjdGNsaWVudHt9fS4KK3NlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQgPSAjdGNsaWVudHtzZXJ2aWNlID0gU2VydmljZX0sIEZ1bmN0aW9uLCBBcmdzKSAtPgorICB7UGFyYW1zLCBSZXBseX0gPSB0cnkKKyAgICB7U2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSksIFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSl9CisgIGNhdGNoIGVycm9yOmZ1bmN0aW9uX2NsYXVzZSAtPiB7bm9fZnVuY3Rpb24sIDB9CisgIGVuZCwKKyAgTXNnVHlwZSA9IGNhc2UgUmVwbHkgb2YKKyAgICBvbmV3YXlfdm9pZCAtPiA/dE1lc3NhZ2VUeXBlX09ORVdBWTsKKyAgICBfIC0+ID90TWVzc2FnZVR5cGVfQ0FMTAorICBlbmQsCisgIGNhc2UgUGFyYW1zIG9mCisgICAgbm9fZnVuY3Rpb24gLT4KKyAgICAgIHt7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBQTGlzdH0gd2hlbiBsZW5ndGgoUExpc3QpID0vPSBsZW5ndGgoQXJncykgLT4KKyAgICAgIHt7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBfUExpc3R9IC0+IHdyaXRlX21lc3NhZ2UoQ2xpZW50LCBGdW5jdGlvbiwgQXJncywgUGFyYW1zLCBNc2dUeXBlKQorICBlbmQuCiAKLSAgICBCZWdpbiA9ICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9LAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvLCBCZWdpbiksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8sIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9uIHwgQXJnc10pfSksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8sIG1lc3NhZ2VfZW5kKSwKLSAgICB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFByb3RvKSwKLSAgICBvay4KKy1zcGVjIHdyaXRlX21lc3NhZ2UoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCksIHtzdHJ1Y3QsIGxpc3QoKX0sIGludGVnZXIoKSkgLT4KKyAge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgord3JpdGVfbWVzc2FnZShDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFAwLCBzZXFpZCA9IFNlcX0sIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpIC0+CisgIHRyeQorICAgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAorICAgICAgdHlwZSA9IE1zZ1R5cGUsCisgICAgICBzZXFpZCA9IFNlcQorICAgIH0pLAorICAgIHtQMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAxLCB7UGFyYW1zLCBsaXN0X3RvX3R1cGxlKFtGdW5jdGlvbnxBcmdzXSl9KSwKKyAgICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwgbWVzc2FnZV9lbmQpLAorICAgIHtQNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQMyksCisgICAge29rLCBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFA0fX0KKyAgY2F0Y2gKKyAgICBlcnJvcjp7YmFkbWF0Y2gsIHtfLCB7ZXJyb3IsIF99ID0gRXJyb3J9fSAtPiB7RXJyb3IsIENsaWVudH0KKyAgZW5kLgogCi1yZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChTdGF0ZSA9ICNzdGF0ZXtwcm90b2NvbCA9IFByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAotICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24pIC0+Cistc3BlYyByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdCgjdGNsaWVudHt9LCBhdG9tKCkpIC0+IHsjdGNsaWVudHt9LCB7b2ssIGFueSgpfSB8IHtlcnJvciwgYW55KCl9fS4KK3JlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24pIC0+CiAgICAgUmVzdWx0VHlwZSA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSksCi0gICAgcmVhZF9yZXN1bHQoU3RhdGUsIEZ1bmN0aW9uLCBSZXN1bHRUeXBlKS4KKyAgICByZWFkX3Jlc3VsdChDbGllbnQsIEZ1bmN0aW9uLCBSZXN1bHRUeXBlKS4KIAotcmVhZF9yZXN1bHQoX1N0YXRlLAotICAgICAgICAgICAgX0Z1bmN0aW9uLAotICAgICAgICAgICAgb25ld2F5X3ZvaWQpIC0+Ci0gICAge29rLCBva307CityZWFkX3Jlc3VsdChDbGllbnQsIF9GdW5jdGlvbiwgb25ld2F5X3ZvaWQpIC0+CisgICAge0NsaWVudCwge29rLCBva319OwogCi1yZWFkX3Jlc3VsdChTdGF0ZSA9ICNzdGF0ZXtwcm90b2NvbCA9IFByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgICAgPSBTZXFJZH0sCityZWFkX3Jlc3VsdChDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkICAgID0gU2VxSWR9LAogICAgICAgICAgICAgRnVuY3Rpb24sCiAgICAgICAgICAgICBSZXBseVR5cGUpIC0+Ci0gICAgY2FzZSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bywgbWVzc2FnZV9iZWdpbikgb2YKLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57c2VxaWQgPSBSZXRTZXFJZH0gd2hlbiBSZXRTZXFJZCA9Lz0gU2VxSWQgLT4KLSAgICAgICAgICAgIHtlcnJvciwge2JhZF9zZXFfaWQsIFNlcUlkfX07Ci0KLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OfSAtPgotICAgICAgICAgICAgaGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihTdGF0ZSk7Ci0KLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfUkVQTFl9IC0+Ci0gICAgICAgICAgICBoYW5kbGVfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCBSZXBseVR5cGUpCisgICAgY2FzZSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIG1lc3NhZ2VfYmVnaW4pIG9mCisgICAgICAgICB7UHJvdG8xLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisgICAgICAgICAgICAgTmV3Q2xpZW50ID0gQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzF9LAorICAgICAgICAgICAgIHtOZXdDbGllbnQsIHtlcnJvciwgUmVhc29ufX07CisgICAgICAgICB7UHJvdG8xLCBNZXNzYWdlQmVnaW59IC0+CisgICAgICAgICAgICAgTmV3Q2xpZW50ID0gQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzF9LAorICAgICAgICAgICAgIGNhc2UgTWVzc2FnZUJlZ2luIG9mCisgICAgICAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3NlcWlkID0gUmV0U2VxSWR9IHdoZW4gUmV0U2VxSWQgPS89IFNlcUlkIC0+CisgICAgICAgICAgICAgICAgICAgICB7TmV3Q2xpZW50LCB7ZXJyb3IsIHtiYWRfc2VxX2lkLCBTZXFJZH19fTsKKyAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OfSAtPgorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihOZXdDbGllbnQpOworICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt0eXBlID0gP3RNZXNzYWdlVHlwZV9SRVBMWX0gLT4KKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9yZXBseShOZXdDbGllbnQsIEZ1bmN0aW9uLCBSZXBseVR5cGUpCisgICAgICAgICAgICAgZW5kCiAgICAgZW5kLgogCi1oYW5kbGVfcmVwbHkoU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2wgPSBQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0sCisKK2hhbmRsZV9yZXBseShDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0sCiAgICAgICAgICAgICAgRnVuY3Rpb24sCiAgICAgICAgICAgICAgUmVwbHlUeXBlKSAtPgogICAgIHtzdHJ1Y3QsIEV4Y2VwdGlvbkZpZWxkc30gPSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIGV4Y2VwdGlvbnMpLAogICAgIFJlcGx5U3RydWN0RGVmID0ge3N0cnVjdCwgW3swLCBSZXBseVR5cGV9XSArKyBFeGNlcHRpb25GaWVsZHN9LAotICAgIHtvaywgUmVwbHl9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8sIFJlcGx5U3RydWN0RGVmKSwKKyAgICB7UHJvdG8xLCB7b2ssIFJlcGx5fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIFJlcGx5U3RydWN0RGVmKSwKKyAgICB7UHJvdG8yLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzEsIG1lc3NhZ2VfZW5kKSwKKyAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMn0sCiAgICAgUmVwbHlMaXN0ID0gdHVwbGVfdG9fbGlzdChSZXBseSksCiAgICAgdHJ1ZSA9IGxlbmd0aChSZXBseUxpc3QpID09IGxlbmd0aChFeGNlcHRpb25GaWVsZHMpICsgMSwKICAgICBFeGNlcHRpb25WYWxzID0gdGwoUmVwbHlMaXN0KSwKICAgICBUaHJvd24gPSBbWCB8fCBYIDwtIEV4Y2VwdGlvblZhbHMsCiAgICAgICAgICAgICAgICAgICAgWCA9Lz0gdW5kZWZpbmVkXSwKLSAgICBSZXN1bHQgPQotICAgICAgICBjYXNlIFRocm93biBvZgotICAgICAgICAgICAgW10gd2hlbiBSZXBseVR5cGUgPT0ge3N0cnVjdCwgW119IC0+Ci0gICAgICAgICAgICAgICAge29rLCBva307Ci0gICAgICAgICAgICBbXSAtPgotICAgICAgICAgICAgICAgIHtvaywgaGQoUmVwbHlMaXN0KX07Ci0gICAgICAgICAgICBbRXhjZXB0aW9uXSAtPgotICAgICAgICAgICAgICAgIHtleGNlcHRpb24sIEV4Y2VwdGlvbn0KLSAgICAgICAgZW5kLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8sIG1lc3NhZ2VfZW5kKSwKLSAgICBSZXN1bHQuCisgICAgY2FzZSBUaHJvd24gb2YKKyAgICAgICAgW10gd2hlbiBSZXBseVR5cGUgPT0ge3N0cnVjdCwgW119IC0+CisgICAgICAgICAgICB7TmV3Q2xpZW50LCB7b2ssIG9rfX07CisgICAgICAgIFtdIC0+CisgICAgICAgICAgICB7TmV3Q2xpZW50LCB7b2ssIGhkKFJlcGx5TGlzdCl9fTsKKyAgICAgICAgW0V4Y2VwdGlvbl0gLT4KKyAgICAgICAgICAgIHRocm93KHtOZXdDbGllbnQsIHtleGNlcHRpb24sIEV4Y2VwdGlvbn19KQorICAgIGVuZC4KIAotaGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihTdGF0ZSA9ICNzdGF0ZXtwcm90b2NvbCA9IFByb3RvfSkgLT4KLSAgICB7b2ssIEV4Y2VwdGlvbn0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/VEFwcGxpY2F0aW9uRXhjZXB0aW9uX1N0cnVjdHVyZSksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bywgbWVzc2FnZV9lbmQpLAoraGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMH0pIC0+CisgICAge1Byb3RvMSwge29rLCBFeGNlcHRpb259fSA9CisgICAgICAgIHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgP1RBcHBsaWNhdGlvbkV4Y2VwdGlvbl9TdHJ1Y3R1cmUpLAorICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMSwgbWVzc2FnZV9lbmQpLAogICAgIFhSZWNvcmQgPSBsaXN0X3RvX3R1cGxlKAogICAgICAgICAgICAgICAgIFsnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyB8IHR1cGxlX3RvX2xpc3QoRXhjZXB0aW9uKV0pLAogICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coIlg6IH5wfm4iLCBbWFJlY29yZF0pLAogICAgIHRydWUgPSBpc19yZWNvcmQoWFJlY29yZCwgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpLAotICAgIHtleGNlcHRpb24sIFhSZWNvcmR9LgorICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8yfSwKKyAgICB0aHJvdyh7TmV3Q2xpZW50LCB7ZXhjZXB0aW9uLCBYUmVjb3JkfX0pLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiZTUxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKQEAgLTAsMCArMSwxMTIgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9jbGllbnRfdXRpbCkuCisKKy1leHBvcnQoW25ldy80XSkuCistZXhwb3J0KFtuZXdfbXVsdGlwbGV4ZWQvMywgbmV3X211bHRpcGxleGVkLzRdKS4KKworLXR5cGUgc2VydmljZV9uYW1lKCkgICAgICAgICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIHNlcnZpY2VfbW9kdWxlKCkgICAgICAgICAgOjogYXRvbSgpLgorLXR5cGUgbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSA6OiBbe1NlcnZpY2VOYW1lOjpzZXJ2aWNlX25hbWUoKSwgU2VydmljZU1vZHVsZTo6c2VydmljZV9tb2R1bGUoKX1dLgorCislJQorJSUgU3BsaXRzIGNsaWVudCBvcHRpb25zIGludG8gY2xpZW50LCBwcm90b2NvbCwgYW5kIHRyYW5zcG9ydCBvcHRpb25zCislJQorJSUgc3BsaXRfb3B0aW9ucyhbT3B0aW9ucy4uLl0pIC0+IHtQcm90b2NvbE9wdGlvbnMsIFRyYW5zcG9ydE9wdGlvbnN9CislJQorc3BsaXRfb3B0aW9ucyhPcHRpb25zKSAtPgorICAgIHNwbGl0X29wdGlvbnMoT3B0aW9ucywgW10sIFtdKS4KKworc3BsaXRfb3B0aW9ucyhbXSwgUHJvdG9JbiwgVHJhbnNJbikgLT4KKyAgICB7UHJvdG9JbiwgVHJhbnNJbn07CisKK3NwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCisgIHdoZW4gT3B0S2V5ID06PSBzdHJpY3RfcmVhZDsKKyAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZTsKKyAgICAgICBPcHRLZXkgPTo9IHByb3RvY29sIC0+CisgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBbT3B0IHwgUHJvdG9Jbl0sIFRyYW5zSW4pOworCitzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQorICB3aGVuIE9wdEtleSA9Oj0gZnJhbWVkOworICAgICAgIE9wdEtleSA9Oj0gY29ubmVjdF90aW1lb3V0OworICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OworICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHM7CisgICAgICAgT3B0S2V5ID06PSBzc2x0cmFuc3BvcnQ7CisgICAgICAgT3B0S2V5ID06PSBzc2xvcHRpb25zLT4KKyAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFByb3RvSW4sIFtPcHQgfCBUcmFuc0luXSkuCisKKworJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKK25ldyhIb3N0LCBQb3J0LCBTZXJ2aWNlLCBPcHRpb25zKQorICB3aGVuIGlzX2ludGVnZXIoUG9ydCksIGlzX2F0b20oU2VydmljZSksIGlzX2xpc3QoT3B0aW9ucykgLT4KKyAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHMwfSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCisKKyAgICB7VHJhbnNwb3J0TW9kdWxlLCBUcmFuc09wdHMyfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShzc2x0cmFuc3BvcnQsIDEsIFRyYW5zT3B0czApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgdHJ1ZX0sIFRyYW5zT3B0czF9IC0+IHt0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydCwgVHJhbnNPcHRzMX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4ge3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorCisgICAge1Byb3RvY29sTW9kdWxlLCBQcm90b09wdHMxfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShwcm90b2NvbCwgMSwgUHJvdG9PcHRzKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGNvbXBhY3R9LCBPcHRzfSAtPiB7dGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGpzb259LCBPcHRzfSAtPiB7dGhyaWZ0X2pzb25fcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGJpbmFyeX0sIE9wdHN9IC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgUHJvdG9PcHRzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9CisgICAgICAgIFRyYW5zcG9ydE1vZHVsZTpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzMiksCisKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSBQcm90b2NvbE1vZHVsZTpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0czEpLAorCisgICAgY2FzZSBQcm90b2NvbEZhY3RvcnkoKSBvZgorICAgICAgICB7b2ssIFByb3RvY29sfSAtPgorICAgICAgICAgICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpOworICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICBlbmQuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgLT4ge29rLCBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdH0gd2hlbgorICAgIEhvc3QgICAgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLAorICAgIFBvcnQgICAgICAgIDo6IG5vbl9uZWdfaW50ZWdlcigpLAorICAgIFNlcnZpY2VzICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6Omxpc3QoKSwgVGhyaWZ0Q2xpZW50Ojp0ZXJtKCl9XS4KK25ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoU2VydmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucykgLT4KKyAgICBuZXdfbXVsdGlwbGV4ZWQodGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpLCBTZXJ2aWNlcywgT3B0aW9ucykuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChUcmFuc3BvcnRGYWN0b3J5VHVwbGUsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgVHJhbnNwb3J0RmFjdG9yeVR1cGxlICAgOjoge29rLCBUcmFuc3BvcnRGYWN0b3J5Ojp0ZXJtKCl9LAorICAgIFNlcnZpY2VzICAgICAgICAgICAgICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgICAgICAgICAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6OnNlcnZpY2VfbmFtZSgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIHdoZW4gaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KE9wdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHVwbGUoVHJhbnNwb3J0RmFjdG9yeVR1cGxlKSAtPgorICAgIHtQcm90b09wdHMsIF99ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKKworICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPSBUcmFuc3BvcnRGYWN0b3J5VHVwbGUsCisKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0cyksCisKKyAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAorCisgICAge29rLCBbe1NlcnZpY2VOYW1lLCBlbGVtZW50KDIsIHRocmlmdF9jbGllbnQ6bmV3KGVsZW1lbnQoMiwgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sOm5ldyhQcm90b2NvbCwgU2VydmljZU5hbWUpKSwgU2VydmljZSkpfSB8fCB7U2VydmljZU5hbWUsIFNlcnZpY2V9IDwtIFNlcnZpY2VzXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNDIyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApAQCAtMCwwICsxLDM5MCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wpLgorCistYmVoYXZpb3VyKHRocmlmdF9wcm90b2NvbCkuCisKKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworLWV4cG9ydChbbmV3LzEsIG5ldy8yLAorICAgICAgICAgcmVhZC8yLAorICAgICAgICAgd3JpdGUvMiwKKyAgICAgICAgIGZsdXNoX3RyYW5zcG9ydC8xLAorICAgICAgICAgY2xvc2VfdHJhbnNwb3J0LzEsCisgICAgICAgICBuZXdfcHJvdG9jb2xfZmFjdG9yeS8yCisgICAgICAgIF0pLgorCistZGVmaW5lKElEX05PTkUsIDE2IzEwMDAwKS4KKy1kZWZpbmUoQ0JPT0xfTk9ORSwgMCkuCistZGVmaW5lKENCT09MX1RSVUUsIDEpLgorLWRlZmluZShDQk9PTF9GQUxTRSwgMikuCisKKy1yZWNvcmQodF9jb21wYWN0LCB7dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBzdGF0ZSBmb3IgcGVuZGluZyBib29sZWFuIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zdGFjaz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdmFsdWU9P0NCT09MX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9zdGFjaz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2lkPT9JRF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9jb21wYWN0e30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWRlZmluZShQUk9UT0NPTF9JRCwgMTYjODIpLgorLWRlZmluZShWRVJTSU9OX01BU0ssIDE2IzFmKS4KKy1kZWZpbmUoVkVSU0lPTl8xLCAxNiMwMSkuCistZGVmaW5lKFRZUEVfTUFTSywgMTYjRTApLgorLWRlZmluZShUWVBFX0JJVFMsIDE2IzA3KS4KKy1kZWZpbmUoVFlQRV9TSElGVF9BTU9VTlQsIDUpLgorCit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RPUCkgLT4gMTYjMDsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9CT09MKSAtPiAxNiMyOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0k4KSAtPiAxNiMzOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0kxNikgLT4gMTYjNDsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JMzIpIC0+IDE2IzU7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTY0KSAtPiAxNiM2OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0RPVUJMRSkgLT4gMTYjNzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVFJJTkcpIC0+IDE2Izg7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RSVUNUKSAtPiAxNiNDOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX01BUCkgLT4gMTYjQjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TRVQpIC0+IDE2I0E7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfTElTVCkgLT4gMTYjOS4KKworY29tcGFjdF90b190eXBlaWQoMTYjMCkgLT4gID90VHlwZV9TVE9QOworY29tcGFjdF90b190eXBlaWQoP0NCT09MX0ZBTFNFKSAtPiAgP3RUeXBlX0JPT0w7Citjb21wYWN0X3RvX3R5cGVpZCg/Q0JPT0xfVFJVRSkgLT4gID90VHlwZV9CT09MOworY29tcGFjdF90b190eXBlaWQoMTYjNykgLT4gID90VHlwZV9ET1VCTEU7Citjb21wYWN0X3RvX3R5cGVpZCgxNiMzKSAtPiAgP3RUeXBlX0k4OworY29tcGFjdF90b190eXBlaWQoMTYjNCkgLT4gID90VHlwZV9JMTY7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM1KSAtPiAgP3RUeXBlX0kzMjsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzYpIC0+ICA/dFR5cGVfSTY0OworY29tcGFjdF90b190eXBlaWQoMTYjOCkgLT4gID90VHlwZV9TVFJJTkc7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNDKSAtPiAgP3RUeXBlX1NUUlVDVDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0IpIC0+ICA/dFR5cGVfTUFQOworY29tcGFjdF90b190eXBlaWQoMTYjQSkgLT4gID90VHlwZV9TRVQ7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM5KSAtPiAgP3RUeXBlX0xJU1QuCisKK2Jvb2xfdG9fY2Jvb2woVmFsdWUpIHdoZW4gVmFsdWUgLT4gP0NCT09MX1RSVUU7Citib29sX3RvX2Nib29sKF8pIC0+ID9DQk9PTF9GQUxTRS4KK2Nib29sX3RvX2Jvb2woVmFsdWUpIC0+IFZhbHVlID06PSA/Q0JPT0xfVFJVRS4KKworbmV3KFRyYW5zcG9ydCkgLT4gbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMgPSBbXSkuCisKK25ldyhUcmFuc3BvcnQsIF9PcHRpb25zKSAtPgorICBTdGF0ZSAgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0sCisgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKK2Nsb3NlX3RyYW5zcG9ydChUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworJSUlCislJSUgaW5zdGFuY2UgbWV0aG9kcworJSUlCisKK3dyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjaz1bTGFzdElkfFRdfSwgQ29tcGFjdFR5cGUsIElkKSAtPgorICBJZERpZmYgPSBJZCAtIExhc3RJZCwKKyAgVGhpczEgPSBUaGlzMCN0X2NvbXBhY3R7d3JpdGVfc3RhY2s9W0lkfFRdfSwKKyAgY2FzZSAoSWREaWZmID4gMCkgYW5kIChJZERpZmYgPCAxNikgb2YKKyAgICB0cnVlIC0+IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKElkRGlmZiBic2wgNCkgYm9yIENvbXBhY3RUeXBlfSk7CisgICAgZmFsc2UgLT4KKyAgICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtieXRlLCBDb21wYWN0VHlwZX0pLAorICAgICAgd3JpdGUoVGhpczIsIHtpMTYsIElkfSkKKyAgZW5kLgorCistc3BlYyB0b196aWd6YWcoaW50ZWdlcigpKSAtPiBub25fbmVnX2ludGVnZXIoKS4KK3RvX3ppZ3phZyhWYWx1ZSkgLT4gMTYjRkZGRkZGRkZGRkZGRkZGRiBiYW5kICgoVmFsdWUgYnNsIDEpIGJ4b3IgKFZhbHVlIGJzciA2MykpLgorCistc3BlYyBmcm9tX3ppZ3phZyhub25fbmVnX2ludGVnZXIoKSkgLT4gaW50ZWdlcigpLgorZnJvbV96aWd6YWcoVmFsdWUpIC0+IChWYWx1ZSBic3IgMSkgYnhvciAtKFZhbHVlIGJhbmQgMSkuCisKKy1zcGVjIHRvX3ZhcmludChub25fbmVnX2ludGVnZXIoKSwgaW9saXN0KCkpIC0+IGlvbGlzdCgpLgordG9fdmFyaW50KFZhbHVlLCBBY2MpIHdoZW4gKFZhbHVlIDwgMTYjODApIC0+IFtBY2MsIFZhbHVlXTsKK3RvX3ZhcmludChWYWx1ZSwgQWNjKSAtPgorICB0b192YXJpbnQoVmFsdWUgYnNyIDcsIFtBY2MsICgoVmFsdWUgYmFuZCAxNiM3RikgYm9yIDE2IzgwKV0pLgorCistc3BlYyByZWFkX3ZhcmludCgjdF9jb21wYWN0e30sIG5vbl9uZWdfaW50ZWdlcigpLCBub25fbmVnX2ludGVnZXIoKSkgLT4gbm9uX25lZ19pbnRlZ2VyKCkuCityZWFkX3ZhcmludChUaGlzMCwgQWNjLCBDb3VudCkgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIGJ5dGUpLAorICBjYXNlIChCeXRlIGJhbmQgMTYjODApIG9mCisgICAgMCAtPiB7VGhpczEsIHtvaywgKEJ5dGUgYnNsICg3ICogQ291bnQpKSArIEFjY319OworICAgIF8gLT4gcmVhZF92YXJpbnQoVGhpczEsICgoQnl0ZSBiYW5kIDE2IzdmKSBic2wgKDcgKiBDb3VudCkpICsgQWNjLCBDb3VudCArIDEpCisgIGVuZC4KKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgICBuYW1lID0gTmFtZSwKKyAgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgIHNlcWlkID0gU2VxaWR9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgP1BST1RPQ09MX0lEfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtieXRlLCAoP1ZFUlNJT05fMSBiYW5kID9WRVJTSU9OX01BU0spIGJvciAoVHlwZSBic2wgP1RZUEVfU0hJRlRfQU1PVU5UKX0pLAorICB7VGhpczMsIG9rfSA9IHdyaXRlKFRoaXMyLCB7dWkzMiwgU2VxaWR9KSwKKyAge1RoaXM0LCBva30gPSB3cml0ZShUaGlzMywge3N0cmluZywgTmFtZX0pLAorICB7VGhpczQsIG9rfTsKKword3JpdGUoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgbmFtZSA9IF9OYW1lLAorICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgIGlkID0gSWR9KQord2hlbiAoVHlwZSA9Oj0gP3RUeXBlX0JPT0wpIC0+IHtUaGlzMCN0X2NvbXBhY3R7d3JpdGVfaWQgPSBJZH0sIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pIC0+CisgIHdyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwLCB0eXBlaWRfdG9fY29tcGFjdChUeXBlKSwgSWQpOworCit3cml0ZShUaGlzLCBmaWVsZF9zdG9wKSAtPiB3cml0ZShUaGlzLCB7Ynl0ZSwgP3RUeXBlX1NUT1B9KTsKKword3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgIGt0eXBlID0gX0t0eXBlLAorICAgICAgdnR5cGUgPSBfVnR5cGUsCisgICAgICBzaXplID0gU2l6ZX0pCit3aGVuIFNpemUgPTo9IDAgLT4KKyAgd3JpdGUoVGhpczAsIHtieXRlLCAwfSk7CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgIGt0eXBlID0gS3R5cGUsCisgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBTaXplfSksCisgIHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKHR5cGVpZF90b19jb21wYWN0KEt0eXBlKSBic2wgNCkgYm9yIHR5cGVpZF90b19jb21wYWN0KFZ0eXBlKX0pOworCit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkKK3doZW4gU2l6ZSA8IDE2I2YgLT4KKyAgd3JpdGUoVGhpczAsIHtieXRlLCAoU2l6ZSBic2wgNCkgYm9yIHR5cGVpZF90b19jb21wYWN0KEV0eXBlKX0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsIDE2I2YwIGJvciB0eXBlaWRfdG9fY29tcGFjdChFdHlwZSl9KSwKKyAgd3JpdGUoVGhpczEsIHt1aTMyLCBTaXplfSk7CisKK3dyaXRlKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFdHlwZSwgc2l6ZSA9ICBTaXplfSk7CisKK3dyaXRlKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gU3RhY2t9LCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+CisgIHtUaGlzI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFswfFN0YWNrXX0sIG9rfTsKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gW198VF19LCBzdHJ1Y3RfZW5kKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBUfSwgb2t9OworCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9pZCA9ID9JRF9OT05FfSwge2Jvb2wsIFZhbHVlfSkgLT4KKyAgd3JpdGUoVGhpcywge2J5dGUsIGJvb2xfdG9fY2Jvb2woVmFsdWUpfSk7CisKK3dyaXRlKFRoaXMwID0gI3RfY29tcGFjdHt3cml0ZV9pZCA9IElkfSwge2Jvb2wsIFZhbHVlfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZV9maWVsZF9iZWdpbihUaGlzMCwgYm9vbF90b19jYm9vbChWYWx1ZSksIElkKSwKKyAge1RoaXMxI3RfY29tcGFjdHt3cml0ZV9pZCA9ID9JRF9OT05FfSwgb2t9OworCit3cml0ZShUaGlzLCB7Ynl0ZSwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+CisgIHdyaXRlKFRoaXMsIDw8VmFsdWU6OC9iaWctc2lnbmVkPj4pOworCit3cml0ZShUaGlzLCB7aTE2LCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7Cit3cml0ZShUaGlzLCB7dWkzMiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludChWYWx1ZSwgW10pKTsKK3dyaXRlKFRoaXMsIHtpMzIsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPgorICB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKK3dyaXRlKFRoaXMsIHtpNjQsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKKword3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4KKyAgd3JpdGUoVGhpcywgPDxEb3VibGU6NjQvZmxvYXQtc2lnbmVkLWxpdHRsZT4+KTsKKword3JpdGUoVGhpczAsIHtzdHJpbmcsIFN0cn0pIHdoZW4gaXNfbGlzdChTdHIpIC0+CisgICUgVE9ETzogbGltaXQgbGVuZ3RoCisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBsZW5ndGgoU3RyKX0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCBsaXN0X3RvX2JpbmFyeShTdHIpKSwKKyAge1RoaXMyLCBva307CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBCaW59KSB3aGVuIGlzX2JpbmFyeShCaW4pIC0+CisgICUgVE9ETzogbGltaXQgbGVuZ3RoCisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBzaXplKEJpbil9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgQmluKSwKKyAge1RoaXMyLCBva307CisKKyUlIERhdGEgOjogaW9saXN0KCkKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zfSwgRGF0YSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoVHJhbnMsIERhdGEpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworJSUKKyUlCisKK3JlYWQoVGhpczAsIG1lc3NhZ2VfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCA/UFJPVE9DT0xfSUR9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFZlckFuZFR5cGV9fSA9IHJlYWQoVGhpczEsIHVieXRlKSwKKyAgP1ZFUlNJT05fMSA9IFZlckFuZFR5cGUgYmFuZCA/VkVSU0lPTl9NQVNLLAorICB7VGhpczMsIHtvaywgU2VxSWR9fSA9IHJlYWQoVGhpczIsIHVpMzIpLAorICB7VGhpczQsIHtvaywgTmFtZX19ID0gcmVhZChUaGlzMywgc3RyaW5nKSwKKyAge1RoaXM0LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgICAgICBuYW1lICA9IGJpbmFyeV90b19saXN0KE5hbWUpLAorICAgICAgICAgICAgIHR5cGUgID0gKFZlckFuZFR5cGUgYnNyID9UWVBFX1NISUZUX0FNT1VOVCkgYmFuZCA/VFlQRV9CSVRTLAorICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9fTsKKworcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gU3RhY2t9LCBzdHJ1Y3RfYmVnaW4pIC0+CisgIHtUaGlzI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gWzB8U3RhY2tdfSwgb2t9OworcmVhZChUaGlzID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW19IfFRdfSwgc3RydWN0X2VuZCkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBUfSwgb2t9OworCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0xhc3RJZHxUXX0sIGZpZWxkX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICBjYXNlIEJ5dGUgYmFuZCAxNiNmIG9mCisgICAgQ29tcGFjdFR5cGUgPSA/dFR5cGVfU1RPUCAtPgorICAgICAge1RoaXMxLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IENvbXBhY3RUeXBlfX07CisgICAgQ29tcGFjdFR5cGUgLT4KKyAgICAgIHtUaGlzMiwge29rLCBJZH19ID0gY2FzZSBCeXRlIGJzciA0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtPiByZWFkKFRoaXMxLCBpMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkRGlmZiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1RoaXMxLCB7b2ssIExhc3RJZCArIElkRGlmZn19CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgIGNhc2UgY29tcGFjdF90b190eXBlaWQoQ29tcGFjdFR5cGUpIG9mCisgICAgICAgID90VHlwZV9CT09MIC0+CisgICAgICAgICAge1RoaXMyI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0lkfFRdLCByZWFkX3ZhbHVlID0gY2Jvb2xfdG9fYm9vbChDb21wYWN0VHlwZSl9LAorICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IElkfX07CisgICAgICAgIFR5cGUgLT4KKyAgICAgICAgICB7VGhpczIjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbSWR8VF19LAorICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IFR5cGUsIGlkID0gSWR9fQorICAgICAgZW5kCisgIGVuZDsKKworcmVhZChUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIG1hcF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemV9fSAgPSByZWFkKFRoaXMwLCB1aTMyKSwKKyAge1RoaXMyLCB7b2ssIEtWfX0gPSBjYXNlIFNpemUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4ge1RoaXMxLCB7b2ssIDB9fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcmVhZChUaGlzMSwgdWJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChLViBic3IgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKEtWIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworcmVhZChUaGlzLCBtYXBfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBsaXN0X2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZUFuZFR5cGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFNpemV9fSA9IGNhc2UgKFNpemVBbmRUeXBlIGJzciA0KSBiYW5kIDE2I2Ygb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTYjZiAtPiByZWFkKFRoaXMxLCB1aTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxzZSAtPiB7VGhpczEsIHtvaywgRWxzZX19CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChTaXplQW5kVHlwZSBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisKK3JlYWQoVGhpcywgbGlzdF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIHNldF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemVBbmRUeXBlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBTaXplfX0gPSBjYXNlIChTaXplQW5kVHlwZSBic3IgNCkgYmFuZCAxNiNmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE2I2YgLT4gcmVhZChUaGlzMSwgdWkzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsc2UgLT4ge1RoaXMxLCB7b2ssIEVsc2V9fQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9zZXRfYmVnaW57ZXR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChTaXplQW5kVHlwZSBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisKK3JlYWQoVGhpcywgc2V0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgZmllbGRfc3RvcCkgLT4KKyAge1RoaXMxLCB7b2ssID90VHlwZV9TVE9QfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMSwgb2t9OworCislJQorCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gP0NCT09MX05PTkV9LCBib29sKSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczEsIHtvaywgY2Jvb2xfdG9fYm9vbChCeXRlKX19OworCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gQm9vbH0sIGJvb2wpIC0+CisgIHtUaGlzMCN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9ID9DQk9PTF9OT05FfSwge29rLCBCb29sfX07CisKK3JlYWQoVGhpczAsIHVieXRlKSAtPgorICB7VGhpczEsIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXVuc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn19ID0gcmVhZF9kYXRhKFRoaXMwLCAxKSwKKyAge1RoaXMxLCB7b2ssIFZhbH19OworCityZWFkKFRoaXMwLCBieXRlKSAtPgorICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgMSksCisgIGNhc2UgQnl0ZXMgb2YKKyAgICB7b2ssIDw8VmFsOjgvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CisgIGVuZDsKKworcmVhZChUaGlzMCwgaTE2KSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIHVpMzIpIC0+IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKTsKKworcmVhZChUaGlzMCwgaTMyKSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIGk2NCkgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCBkb3VibGUpIC0+CisgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCA4KSwKKyAgY2FzZSBCeXRlcyBvZgorICAgIHtvaywgPDxWYWw6NjQvZmxvYXQtc2lnbmVkLWxpdHRsZSwgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQorICBlbmQ7CisKKyUgcmV0dXJucyBhIGJpbmFyeSBkaXJlY3RseSwgY2FsbCBiaW5hcnlfdG9fbGlzdCBpZiBuZWNlc3NhcnkKK3JlYWQoVGhpczAsIHN0cmluZykgLT4KKyAge1RoaXMxLCB7b2ssIFN6fX0gID0gcmVhZChUaGlzMCwgdWkzMiksCisgIHJlYWRfZGF0YShUaGlzMSwgU3opLgorCistc3BlYyByZWFkX2RhdGEoI3RfY29tcGFjdHt9LCBub25fbmVnX2ludGVnZXIoKSkgLT4KKyAgICB7I3RfY29tcGFjdHt9LCB7b2ssIGJpbmFyeSgpfSB8IHtlcnJvciwgX1JlYXNvbn19LgorcmVhZF9kYXRhKFRoaXMsIDApIC0+IHtUaGlzLCB7b2ssIDw8Pj59fTsKK3JlYWRfZGF0YShUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc30sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgYW5kYWxzbyBMZW4gPiAwIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChUcmFucywgTGVuKSwKKyAgICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworCislJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUlIHJldHVybnMgYSAoZnVuKCkgLT4gdGhyaWZ0X3Byb3RvY29sKCkpCituZXdfcHJvdG9jb2xfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5LCBfT3B0aW9ucykgLT4KKyAgRiA9IGZ1bigpIC0+CisgICAgICAgICAgY2FzZSBUcmFuc3BvcnRGYWN0b3J5KCkgb2YKKyAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAtPgorICAgICAgICAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoCisgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIFtdKTsKKyAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9CisgICAgICAgICAgZW5kCisgICAgICBlbmQsCisgIHtvaywgRn0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQuZXJsCmluZGV4IDc2MWZhMzAuLmRlOGVlNDEgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQuZXJsCkBAIC0zNSw2ICszNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX29uX2Nsb3NlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlcnkgPSBpbmZpbml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgc3luY190cmVmfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNkbF90cmFuc3BvcnR7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCiAlJSBDcmVhdGUgYSB0cmFuc3BvcnQgYXR0YWNoZWQgdG8gYW4gYWxyZWFkeSBvcGVuIGxvZy4KQEAgLTQ3LDcgKzQ5LDcgQEAKICAgICBTdGF0ZTIgPQogICAgICAgICBjYXNlIFN0YXRlI2RsX3RyYW5zcG9ydC5zeW5jX2V2ZXJ5IG9mCiAgICAgICAgICAgICBOIHdoZW4gaXNfaW50ZWdlcihOKSwgTiA+IDAgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFRSZWZ9ID0gdGltZXI6YXBwbHlfaW50ZXJ2YWwoTiwgP01PRFVMRSwgZm9yY2VfZmx1c2gsIFN0YXRlKSwKKyAgICAgICAgICAgICAgICB7b2ssIFRSZWZ9ID0gdGltZXI6YXBwbHlfaW50ZXJ2YWwoTiwgP01PRFVMRSwgZm9yY2VfZmx1c2gsIFtTdGF0ZV0pLAogICAgICAgICAgICAgICAgIFN0YXRlI2RsX3RyYW5zcG9ydHtzeW5jX3RyZWYgPSBUUmVmfTsKICAgICAgICAgICAgIF8gLT4gU3RhdGUKICAgICAgICAgZW5kLApAQCAtNTgsMzggKzYwLDQxIEBACiBwYXJzZV9vcHRzKFtdLCBTdGF0ZSkgLT4KICAgICBTdGF0ZTsKIHBhcnNlX29wdHMoW3tjbG9zZV9vbl9jbG9zZSwgQm9vbH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgotICAgIFN0YXRlI2RsX3RyYW5zcG9ydHtjbG9zZV9vbl9jbG9zZSA9IEJvb2x9OworICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjZGxfdHJhbnNwb3J0e2Nsb3NlX29uX2Nsb3NlID0gQm9vbH0pOwogcGFyc2Vfb3B0cyhbe3N5bmNfZXZlcnksIEludH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfaW50ZWdlcihJbnQpLCBJbnQgPiAwIC0+Ci0gICAgU3RhdGUjZGxfdHJhbnNwb3J0e3N5bmNfZXZlcnkgPSBJbnR9LgorICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjZGxfdHJhbnNwb3J0e3N5bmNfZXZlcnkgPSBJbnR9KS4KIAogCiAlJSUlIFRSQU5TUE9SVCBJTVBMRU5UQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiAKICUlIGRpc2tfbG9nX3RyYW5zcG9ydCBpcyB3cml0ZS1vbmx5Ci1yZWFkKF9TdGF0ZSwgTGVuKSAtPgotICAgIHtlcnJvciwgbm9fcmVhZF9mcm9tX2Rpc2tfbG9nfS4KK3JlYWQoU3RhdGUsIF9MZW4pIC0+CisgICAge1N0YXRlLCB7ZXJyb3IsIG5vX3JlYWRfZnJvbV9kaXNrX2xvZ319LgogCi13cml0ZSgjZGxfdHJhbnNwb3J0e2xvZyA9IExvZ30sIERhdGEpIC0+Ci0gICAgZGlza19sb2c6YmFsb2coTG9nLCBlcmxhbmc6aW9saXN0X3RvX2JpbmFyeShEYXRhKSkuCit3cml0ZShUaGlzID0gI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2d9LCBEYXRhKSAtPgorICAgIHtUaGlzLCBkaXNrX2xvZzpiYWxvZyhMb2csIGVybGFuZzppb2xpc3RfdG9fYmluYXJ5KERhdGEpKX0uCiAKIGZvcmNlX2ZsdXNoKCNkbF90cmFuc3BvcnR7bG9nID0gTG9nfSkgLT4KICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coIn5wIHN5bmNpbmd+biIsIFs/TU9EVUxFXSksCiAgICAgZGlza19sb2c6c3luYyhMb2cpLgogCi1mbHVzaCgjZGxfdHJhbnNwb3J0e2xvZyA9IExvZywgc3luY19ldmVyeSA9IFNFfSkgLT4KK2ZsdXNoKFRoaXMgPSAjZGxfdHJhbnNwb3J0e2xvZyA9IExvZywgc3luY19ldmVyeSA9IFNFfSkgLT4KICAgICBjYXNlIFNFIG9mCiAgICAgICAgIHVuZGVmaW5lZCAtPiAlIG5vIHRpbWUtYmFzZWQgc3luYwogICAgICAgICAgICAgZGlza19sb2c6c3luYyhMb2cpOwogICAgICAgICBfRWxzZSAtPiAgICAgJSBzeW5jIHdpbGwgaGFwcGVuIGF1dG9tYWdpY2FsbHkKICAgICAgICAgICAgIG9rCi0gICAgZW5kLgorICAgIGVuZCwKKyAgICB7VGhpcywgb2t9LgorCisKIAogCiAlJSBPbiBjbG9zZSwgY2xvc2UgdGhlIHVuZGVybHlpbmcgbG9nIGlmIHdlJ3JlIGNvbmZpZ3VyZWQgdG8gZG8gc28uCi1jbG9zZSgjZGxfdHJhbnNwb3J0e2Nsb3NlX29uX2Nsb3NlID0gZmFsc2V9KSAtPgotICAgIG9rOwotY2xvc2UoI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2d9KSAtPgotICAgIGRpc2tfbG9nOmxjbG9zZShMb2cpLgorY2xvc2UoVGhpcyA9ICNkbF90cmFuc3BvcnR7Y2xvc2Vfb25fY2xvc2UgPSBmYWxzZX0pIC0+CisgICAge1RoaXMsIG9rfTsKK2Nsb3NlKFRoaXMgPSAjZGxfdHJhbnNwb3J0e2xvZyA9IExvZ30pIC0+CisgICAge1RoaXMsIGRpc2tfbG9nOmxjbG9zZShMb2cpfS4KIAogCiAlJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCkBAIC0xMDksMTAgKzExNCwxMCBAQAogICAgICAgICAgICAgICAgRXh0cmFMb2dPcHRzXSwKICAgICBMb2cgPQogICAgICAgICBjYXNlIGRpc2tfbG9nOm9wZW4oTG9nT3B0cykgb2YKLSAgICAgICAgICAgIHtvaywgTG9nfSAtPgotICAgICAgICAgICAgICAgIExvZzsKLSAgICAgICAgICAgIHtyZXBhaXJlZCwgTG9nLCBJbmZvMSwgSW5mbzJ9IC0+Ci0gICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJEaXNrIGxvZyB+cCByZXBhaXJlZDogfnAsIH5wfm4iLCBbTG9nLCBJbmZvMSwgSW5mbzJdKSwKLSAgICAgICAgICAgICAgICBMb2cKKyAgICAgICAgICAgIHtvaywgTG9nU30gLT4KKyAgICAgICAgICAgICAgICBMb2dTOworICAgICAgICAgICAge3JlcGFpcmVkLCBMb2dTLCBJbmZvMSwgSW5mbzJ9IC0+CisgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJEaXNrIGxvZyB+cCByZXBhaXJlZDogfnAsIH5wfm4iLCBbTG9nUywgSW5mbzEsIEluZm8yXSksCisgICAgICAgICAgICAgICAgTG9nUwogICAgICAgICBlbmQsCiAgICAgbmV3KExvZywgVHJhbnNwb3J0T3B0cykuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybAppbmRleCA1YWMyZGJlLi4wNzExNTJiIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDY3ICsyMSw5NSBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0tZXhwb3J0KFtuZXdfcmVhZGVyLzEsCi0gICAgICAgICBuZXcvMSwKLSAgICAgICAgIG5ldy8yLAotICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3JlYWRlci8xXSkuCiAKLS1yZWNvcmQodF9maWxlX3RyYW5zcG9ydCwge2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9jbG9zZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gd3JpdGV9KS4KIAotJSUlJSBDT05TVFJVQ1RJT04gICAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCistcmVjb3JkKHRfZmlsZSwgeworICBkZXZpY2UsCisgIHNob3VsZF9jbG9zZSA9IHRydWUsCisgIG1vZGUgPSB3cml0ZQorfSkuCiAKLW5ld19yZWFkZXIoRmlsZW5hbWUpIC0+Ci0gICAgY2FzZSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyZWFkLCBiaW5hcnksIHtyZWFkX2FoZWFkLCAxMDI0KjEwMjR9XSkgb2YKLSAgICAgICAge29rLCBJT0RldmljZX0gLT4KLSAgICAgICAgICAgIG5ldyhJT0RldmljZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9LCB7bW9kZSwgcmVhZH1dKTsKLSAgICAgICAgRXJyb3IgLT4gRXJyb3IKLSAgICBlbmQuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2ZpbGV7fS4KIAotbmV3KERldmljZSkgLT4KLSAgICBuZXcoRGV2aWNlLCBbXSkuCiAKLSUlIERldmljZSA6OiBpb19kZXZpY2UoKQotJSUKKy1zcGVjIG5ldyhEZXZpY2U6OmZpbGU6aW9fZGV2aWNlKCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KERldmljZSkgLT4gbmV3KERldmljZSwgW10pLgorCistc3BlYyBuZXcoRGV2aWNlOjpmaWxlOmlvX2RldmljZSgpLCBPcHRzOjpsaXN0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKwogJSUgRGV2aWNlIHNob3VsZCBiZSBvcGVuZWQgaW4gcmF3IGFuZCBiaW5hcnkgbW9kZS4KIG5ldyhEZXZpY2UsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2V9KSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9maWxle2RldmljZSA9IERldmljZX0pLAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKIAotJSUgUGFyc2Ugb3B0aW9ucwotcGFyc2Vfb3B0cyhbe3Nob3VsZF9jbG9zZSwgQm9vbH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgotICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxlX3RyYW5zcG9ydHtzaG91bGRfY2xvc2UgPSBCb29sfSk7Ci1wYXJzZV9vcHRzKFt7bW9kZSwgTW9kZX0gfCBSZXN0XSwgU3RhdGUpCi0gIHdoZW4gTW9kZSA9Oj0gd3JpdGU7Ci0gICAgICAgTW9kZSA9Oj0gcmVhZCAtPgotICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxlX3RyYW5zcG9ydHttb2RlID0gTW9kZX0pOworcGFyc2Vfb3B0cyhbe3Nob3VsZF9jbG9zZSwgQm9vbH18UmVzdF0sIFN0YXRlKQord2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxle3Nob3VsZF9jbG9zZSA9IEJvb2x9KTsKK3BhcnNlX29wdHMoW3ttb2RlLCBNb2RlfXxSZXN0XSwgU3RhdGUpCit3aGVuIE1vZGUgPTo9IHdyaXRlOyBNb2RlID06PSByZWFkIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxle21vZGUgPSBNb2RlfSk7CiBwYXJzZV9vcHRzKFtdLCBTdGF0ZSkgLT4KLSAgICAgU3RhdGUuCisgIFN0YXRlLgogCiAKLSUlJSUgVFJBTlNQT1JUIElNUEwgJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotCi13cml0ZSgjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0sIERhdGEpIC0+Ci0gICAgZmlsZTp3cml0ZShEZXZpY2UsIERhdGEpOwotd3JpdGUoX1QsIF9EKSAtPgotICAgIHtlcnJvciwgcmVhZF9tb2RlfS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1yZWFkKCN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIGZpbGU6cmVhZChEZXZpY2UsIExlbik7Ci1yZWFkKF9ULCBfRCkgLT4KLSAgICB7ZXJyb3IsIHJlYWRfbW9kZX0uCityZWFkKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICBlbmQ7CityZWFkKFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgd3JpdGVfbW9kZX19LgogCi1mbHVzaCgjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0pIC0+Ci0gICAgZmlsZTpzeW5jKERldmljZSkuCiAKLWNsb3NlKCN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgc2hvdWxkX2Nsb3NlID0gU0N9KSAtPgotICAgIGNhc2UgU0Mgb2YKLSAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAgZmlsZTpjbG9zZShEZXZpY2UpOwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQuCityZWFkX2V4YWN0KFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+CisgICAgICBjYXNlIGlvbGlzdF9zaXplKFJlc3VsdCkgb2YKKyAgICAgICAgWCB3aGVuIFggPCBMZW4gLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgICAgICBfIC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICAgICAgZW5kCisgIGVuZDsKK3JlYWRfZXhhY3QoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCB3cml0ZV9tb2RlfX0uCisKKword3JpdGUoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSwgRGF0YSkgLT4KKyAge1N0YXRlLCBmaWxlOndyaXRlKERldmljZSwgRGF0YSl9Oword3JpdGUoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCByZWFkX21vZGV9fS4KKworCitmbHVzaChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgorICB7U3RhdGUsIGZpbGU6c3luYyhEZXZpY2UpfS4KKworCitjbG9zZShTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBzaG91bGRfY2xvc2UgPSBTQ30pIC0+CisgIGNhc2UgU0Mgb2YKKyAgICB0cnVlIC0+IHtTdGF0ZSwgZmlsZTpjbG9zZShEZXZpY2UpfTsKKyAgICBmYWxzZSAtPiB7U3RhdGUsIG9rfQorICBlbmQuCisKKworJSUgbGVnYWN5IGFwaS4gbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorbmV3X3JlYWRlcihGaWxlbmFtZSkgLT4KKyAgY2FzZSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyZWFkLCBiaW5hcnksIHtyZWFkX2FoZWFkLCAxMDI0KjEwMjR9XSkgb2YKKyAgICB7b2ssIElPRGV2aWNlfSAtPiBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7CisgICAgRXJyb3IgLT4gRXJyb3IKKyAgZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKaW5kZXggMDFiYWI3MC4uOWE1ZDZhZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApAQCAtMTksMTkwICsxOSwxMDggQEAKIAogLW1vZHVsZSh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCkuCiAKLS1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKKyUlIGNvbnN0cnVjdG9yCiAtZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCBoYW5kbGVfaW5mby8yLAotICAgICAgICAgdGVybWluYXRlLzIsIGNvZGVfY2hhbmdlLzNdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorLXJlY29yZCh0X2ZyYW1lZCwgeworICB3cmFwcGVkLAorICByZWFkX2J1ZmZlciwKKyAgd3JpdGVfYnVmZmVyCit9KS4KIAotLXJlY29yZChmcmFtZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyLCAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KKy10eXBlIHN0YXRlKCkgOjogI3RfZnJhbWVke30uCiAKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIEFQSQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHN0YXJ0X2xpbmsoKSAtPiB7b2ssUGlkfSB8IGlnbm9yZSB8IHtlcnJvcixFcnJvcn0KLSUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHNlcnZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmV3KFdyYXBwZWRUcmFuc3BvcnQpIC0+Ci0gICAgY2FzZSBnZW5fc2VydmVyOnN0YXJ0X2xpbmsoP01PRFVMRSwgW1dyYXBwZWRUcmFuc3BvcnRdLCBbXSkgb2YKLSAgICAgICAge29rLCBQaWR9IC0+Ci0gICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBQaWQpOwotICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICBFbHNlCi0gICAgZW5kLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPiBvawotJSUKLSUlIERhdGEgPSBpb2xpc3QoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCB7d3JpdGUsIERhdGF9KS4KKy1zcGVjIG5ldyhUcmFuc3BvcnQ6OnRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogZmx1c2goVHJhbnNwb3J0KSAtPiBvawotJSUKLSUlIERlc2NyaXB0aW9uOiBGbHVzaGVzIHRoZSBidWZmZXIgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZsdXNoKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCBmbHVzaCkuCituZXcoV3JhcHBlZCkgLT4KKyAgU3RhdGUgPSAjdF9mcmFtZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgcmVhZF9idWZmZXIgPSBbXSwKKyAgICB3cml0ZV9idWZmZXIgPSBbXQorICB9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBjbG9zZShUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsb3NlKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoVHJhbnNwb3J0LCBjbG9zZSkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBSZWFkKFRyYW5zcG9ydCwgTGVuKSAtPiB7b2ssIERhdGF9Ci0lJQotJSUgRGF0YSA9IGJpbmFyeSgpCi0lJQotJSUgRGVzY3JpcHRpb246IFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zb3BydAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVhZChUcmFuc3BvcnQsIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCB7cmVhZCwgTGVufSkuCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBpbml0KEFyZ3MpIC0+IHtvaywgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb259Ci0lJSBEZXNjcmlwdGlvbjogSW5pdGlhdGVzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluaXQoW1dyYXBwZWRdKSAtPgotICAgIHtvaywgI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119fS4KK3JlYWQoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBCaW5hcnkgb2YKKyAgICA8PD4+IHdoZW4gTGVuID4gMCAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgTmV3QmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQmluYXJ5LCBGcmFtZV0pLAorICAgICAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoTmV3QmluYXJ5KSwgTGVuKSwKKyAgICAgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KE5ld0JpbmFyeSwgR2l2ZSksCisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICAgICB7TmV3U3RhdGUsIEVycm9yfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBFcnJvcn0KKyAgICAgIGVuZDsKKyAgICAlJSByZWFkIG9mIHplcm8gYnl0ZXMKKyAgICA8PD4+IC0+IHtTdGF0ZSwge29rLCA8PD4+fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgbm9uZW1wdHkKKyAgICBfIC0+CisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2NhbGwoe3dyaXRlLCBEYXRhfSwgX0Zyb20sIFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0pIC0+Ci0gICAge3JlcGx5LCBvaywgU3RhdGUjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19fTsKIAotaGFuZGxlX2NhbGwoe3JlYWQsIExlbn0sIF9Gcm9tLCBTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyID0gUkJ1Zn0pIC0+Ci0gICAge1JCdWYxLCBSQnVmMVNpemV9ID0KLSAgICAgICAgJSUgaWYgdGhlIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCByZWFkIGFub3RoZXIgZnJhbWUKLSAgICAgICAgJSUgb3RoZXJ3aXNlLCBqdXN0IHJlYWQgZnJvbSB3aGF0J3MgbGVmdCBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGNhc2UgaW9saXN0X3NpemUoUkJ1Zikgb2YKLSAgICAgICAgICAgIDAgLT4KLSAgICAgICAgICAgICAgICAlJSByZWFkIHRoZSBmcmFtZSBsZW5ndGgKLSAgICAgICAgICAgICAgICB7b2ssIDw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSA9Ci0gICAgICAgICAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkLCA0KSwKLSAgICAgICAgICAgICAgICAlJSB0aGVuIHJlYWQgdGhlIGRhdGEKLSAgICAgICAgICAgICAgICB7b2ssIEJpbn0gPQotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZCwgRnJhbWVMZW4pLAotICAgICAgICAgICAgICAgIHtCaW4sIGVybGFuZzpieXRlX3NpemUoQmluKX07Ci0gICAgICAgICAgICBTeiAtPgotICAgICAgICAgICAgICAgIHtSQnVmLCBTen0KLSAgICAgICAgZW5kLAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZCwgcmVhZF9idWZmZXIgPSBCdWZmZXJ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWZmZXIpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHtyZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgaW5zdWZmaWNpZW50IGZvciByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgXyAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAgICAgIFN0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBbQnVmZmVyLCBGcmFtZV19LAorICAgICAgICAgICAgTGVuCisgICAgICAgICAgKTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQKKyAgZW5kLgogCi0gICAgJSUgcHVsbCBvZmYgR2l2ZSBieXRlcywgcmV0dXJuIHRoZW0gdG8gdGhlIHVzZXIsIGxlYXZlIHRoZSByZXN0IGluIHRoZSBidWZmZXIKLSAgICBHaXZlID0gbWluKFJCdWYxU2l6ZSwgTGVuKSwKLSAgICA8PERhdGE6R2l2ZS9iaW5hcnksIFJCdWYyL2JpbmFyeT4+ID0gaW9saXN0X3RvX2JpbmFyeShSQnVmMSksCituZXh0X2ZyYW1lKFRyYW5zcG9ydCkgLT4KKyAgY2FzZSB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoVHJhbnNwb3J0LCA0KSBvZgorICAgIHtOZXdTdGF0ZSwge29rLCA8PEZyYW1lTGVuZ3RoOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+fX0gLT4KKyAgICAgIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChOZXdTdGF0ZSwgRnJhbWVMZW5ndGgpOworICAgIEVycm9yIC0+IEVycm9yCisgIGVuZC4KIAotICAgIFJlc3BvbnNlID0ge29rLCBEYXRhfSwKLSAgICBTdGF0ZTEgPSBTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3JlYWRfYnVmZmVyPVJCdWYyfSwKIAotICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlMX07Cit3cml0ZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXJ9LCBEYXRhKSAtPgorICB7U3RhdGUjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLWhhbmRsZV9jYWxsKGZsdXNoLCBfRnJvbSwgU3RhdGUpIC0+Ci0gICAge1Jlc3BvbnNlLCBTdGF0ZTF9ID0gZG9fZmx1c2goU3RhdGUpLAotICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlMX0uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FzdChNc2csIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfY2FzdChjbG9zZSwgU3RhdGUpIC0+Ci0gICAge18sIFN0YXRlMX0gPSBkb19mbHVzaChTdGF0ZSksCi0gICAgJSUgV3JhcHBlZCBpcyBjbG9zZWQgYnkgdGVybWluYXRlLzIKLSAgICAlJSAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCB+cDogY2xvc2luZyIsIFtzZWxmKCldKSwKLSAgICB7c3RvcCwgbm9ybWFsLCBTdGF0ZX07Ci1oYW5kbGVfY2FzdChNc2csIFN0YXRlPSNmcmFtZWRfdHJhbnNwb3J0e30pIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KK2ZsdXNoKFN0YXRlID0gI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlciwgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICBjYXNlIGlvbGlzdF9zaXplKEJ1ZmZlcikgb2YKKyAgICAlJSBpZiB3cml0ZSBidWZmZXIgaXMgZW1wdHksIGRvIG5vdGhpbmcKKyAgICAwIC0+IHtTdGF0ZSwgb2t9OworICAgIEZyYW1lTGVuIC0+CisgICAgICBEYXRhID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCisgICAgICB7V3JpdHRlbiwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBEYXRhKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBGbHVzaGVkLCB3cml0ZV9idWZmZXIgPSBbXX0sIFJlc3BvbnNlfQorICBlbmQuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2luZm8oX0luZm8sIFN0YXRlKSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4gdm9pZCgpCi0lJSBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBnZW5fc2VydmVyIHdoZW4gaXQgaXMgYWJvdXQgdG8KLSUlIHRlcm1pbmF0ZS4gSXQgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZSBvZiBNb2R1bGU6aW5pdC8xIGFuZCBkbyBhbnkgbmVjZXNzYXJ5Ci0lJSBjbGVhbmluZyB1cC4gV2hlbiBpdCByZXR1cm5zLCB0aGUgZ2VuX3NlcnZlciB0ZXJtaW5hdGVzIHdpdGggUmVhc29uLgotJSUgVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVybWluYXRlKF9SZWFzb24sIFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZD1XcmFwcGVkfSkgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLAotICAgIG9rLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4ge29rLCBOZXdTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvZGVfY2hhbmdlKF9PbGRWc24sIFN0YXRlLCBfRXh0cmEpIC0+Ci0gICAge29rLCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWRvX2ZsdXNoKFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZH0pIC0+Ci0gICAgRnJhbWVMZW4gPSBpb2xpc3Rfc2l6ZShCdWZmZXIpLAotICAgIERhdGEgICAgID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCi0KLSAgICBSZXNwb25zZSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgRGF0YSksCi0KLSAgICB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQpLAotCi0gICAgU3RhdGUxID0gU3RhdGUjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAge1Jlc3BvbnNlLCBTdGF0ZTF9LgotCi1taW4oQSxCKSB3aGVuIEE8QiAtPiBBOwotbWluKF8sQikgICAgICAgICAgLT4gQi4KK2Nsb3NlKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gQ2xvc2VkfSwgUmVzdWx0fS4KIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9odHRwX3RyYW5zcG9ydC5lcmwKaW5kZXggZjhjMTgyNy4uNDZiY2VkZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsCkBAIC0xOSwyMCArMTksMTEgQEAKIAogLW1vZHVsZSh0aHJpZnRfaHR0cF90cmFuc3BvcnQpLgogCi0tYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAogJSUgQVBJCiAtZXhwb3J0KFtuZXcvMiwgbmV3LzNdKS4KIAotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLS1leHBvcnQoW2luaXQvMSwKLSAgICAgICAgIGhhbmRsZV9jYWxsLzMsCi0gICAgICAgICBoYW5kbGVfY2FzdC8yLAotICAgICAgICAgaGFuZGxlX2luZm8vMiwKLSAgICAgICAgIHRlcm1pbmF0ZS8yLAotICAgICAgICAgY29kZV9jaGFuZ2UvM10pLgotCiAlJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwogLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKQEAgLTQzLDE0ICszNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9vcHRpb25zLCAlIHNlZSBodHRwKDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfaGVhZGVycyAlIFt7c3RyKCksIHN0cigpfSwgLi4uXQogICAgICAgICAgICAgICAgICAgICAgICAgfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNodHRwX3RyYW5zcG9ydHt9LgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBBUEkKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBuZXcoKSAtPiB7b2ssIFRyYW5zcG9ydH0gfCBpZ25vcmUgfCB7ZXJyb3IsRXJyb3J9Ci0lJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5ldyhIb3N0LCBQYXRoKSAtPgogICAgIG5ldyhIb3N0LCBQYXRoLCBfT3B0aW9ucyA9IFtdKS4KIApAQCAtNjAsNTQgKzQ2LDYgQEAKICUlICAge2V4dHJhX2hlYWRlcnMsIEV4dHJhSGVhZGVyc30gID0gTGlzdCBvZiBleHRyYSBIVFRQIGhlYWRlcnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5ldyhIb3N0LCBQYXRoLCBPcHRpb25zKSAtPgotICAgIGNhc2UgZ2VuX3NlcnZlcjpzdGFydF9saW5rKD9NT0RVTEUsIHtIb3N0LCBQYXRoLCBPcHRpb25zfSwgW10pIG9mCi0gICAgICAgIHtvaywgUGlkfSAtPgotICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgUGlkKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4gb2sKLSUlCi0lJSBEYXRhID0gaW9saXN0KCkKLSUlCi0lJSBEZXNjcmlwdGlvbjogV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3dyaXRlLCBEYXRhfSkuCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBmbHVzaChUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IEZsdXNoZXMgdGhlIGJ1ZmZlciwgbWFraW5nIGEgcmVxdWVzdAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZmx1c2goVHJhbnNwb3J0KSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIGZsdXNoKS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGNsb3NlKFRyYW5zcG9ydCkgLT4gb2sKLSUlCi0lJSBEZXNjcmlwdGlvbjogQ2xvc2VzIHRoZSB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsb3NlKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoVHJhbnNwb3J0LCBjbG9zZSkuCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBSZWFkKFRyYW5zcG9ydCwgTGVuKSAtPiB7b2ssIERhdGF9Ci0lJQotJSUgRGF0YSA9IGJpbmFyeSgpCi0lJQotJSUgRGVzY3JpcHRpb246IFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zb3BydAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVhZChUcmFuc3BvcnQsIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCB7cmVhZCwgTGVufSkuCi0KLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWluaXQoe0hvc3QsIFBhdGgsIE9wdGlvbnN9KSAtPgogICAgIFN0YXRlMSA9ICNodHRwX3RyYW5zcG9ydHtob3N0ID0gSG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyID0gW10sCkBAIC0xMjcsNTAgKzY1LDE3IEBACiAgICAgICAgIGVuZCwKICAgICBjYXNlIGxpc3RzOmZvbGRsKEFwcGx5T3B0aW9uLCBTdGF0ZTEsIE9wdGlvbnMpIG9mCiAgICAgICAgIFN0YXRlMiA9ICNodHRwX3RyYW5zcG9ydHt9IC0+Ci0gICAgICAgICAgICB7b2ssIFN0YXRlMn07CisgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZTIpOwogICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICB7c3RvcCwgRWxzZX0KKyAgICAgICAgICAgIHtlcnJvciwgRWxzZX0KICAgICBlbmQuCiAKLWhhbmRsZV9jYWxsKHt3cml0ZSwgRGF0YX0sIF9Gcm9tLCBTdGF0ZSA9ICNodHRwX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmfSkgLT4KLSAgICB7cmVwbHksIG9rLCBTdGF0ZSNodHRwX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19fTsKKyUlIFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgord3JpdGUoU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0sIERhdGEpIC0+CisgICAge1N0YXRlI2h0dHBfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtXQnVmLCBEYXRhXX0sIG9rfS4KIAotaGFuZGxlX2NhbGwoe3JlYWQsIExlbn0sIF9Gcm9tLCBTdGF0ZSA9ICNodHRwX3RyYW5zcG9ydHtyZWFkX2J1ZmZlciA9IFJCdWZ9KSAtPgotICAgICUlIFB1bGwgb2ZmIEdpdmUgYnl0ZXMsIHJldHVybiB0aGVtIHRvIHRoZSB1c2VyLCBsZWF2ZSB0aGUgcmVzdCBpbiB0aGUgYnVmZmVyLgotICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoUkJ1ZiksIExlbiksCi0gICAgY2FzZSBpb2xpc3RfdG9fYmluYXJ5KFJCdWYpIG9mCi0gICAgICAgIDw8RGF0YTpHaXZlL2JpbmFyeSwgUkJ1ZjEvYmluYXJ5Pj4gLT4KLSAgICAgICAgICAgIFJlc3BvbnNlID0ge29rLCBEYXRhfSwKLSAgICAgICAgICAgIFN0YXRlMSA9IFN0YXRlI2h0dHBfdHJhbnNwb3J0e3JlYWRfYnVmZmVyPVJCdWYxfSwKLSAgICAgICAgICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlMX07Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIHtyZXBseSwge2Vycm9yLCAnRU9GJ30sIFN0YXRlfQotICAgIGVuZDsKLQotaGFuZGxlX2NhbGwoZmx1c2gsIF9Gcm9tLCBTdGF0ZSkgLT4KLSAgICB7UmVzcG9uc2UsIFN0YXRlMX0gPSBkb19mbHVzaChTdGF0ZSksCi0gICAge3JlcGx5LCBSZXNwb25zZSwgU3RhdGUxfS4KLQotaGFuZGxlX2Nhc3QoY2xvc2UsIFN0YXRlKSAtPgotICAgIHtfLCBTdGF0ZTF9ID0gZG9fZmx1c2goU3RhdGUpLAotICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlMX07Ci0KLWhhbmRsZV9jYXN0KF9Nc2csIFN0YXRlPSNodHRwX3RyYW5zcG9ydHt9KSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCi0KLWhhbmRsZV9pbmZvKF9JbmZvLCBTdGF0ZSkgLT4KLSAgICB7bm9yZXBseSwgU3RhdGV9LgotCi10ZXJtaW5hdGUoX1JlYXNvbiwgX1N0YXRlKSAtPgotICAgIG9rLgotCi1jb2RlX2NoYW5nZShfT2xkVnNuLCBTdGF0ZSwgX0V4dHJhKSAtPgotICAgIHtvaywgU3RhdGV9LgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1kb19mbHVzaChTdGF0ZSA9ICNodHRwX3RyYW5zcG9ydHtob3N0ID0gSG9zdCwKKyUlIEZsdXNoZXMgdGhlIGJ1ZmZlciwgbWFraW5nIGEgcmVxdWVzdAorZmx1c2goU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7aG9zdCA9IEhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyID0gUmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFdidWYsCkBAIC0xNzksMTAgKzg0LDEwIEBACiAgICAgY2FzZSBpb2xpc3RfdG9fYmluYXJ5KFdidWYpIG9mCiAgICAgICAgIDw8Pj4gLT4KICAgICAgICAgICAgICUlIERvbid0IGJvdGhlciBmbHVzaGluZyBlbXB0eSBidWZmZXJzLgotICAgICAgICAgICAge29rLCBTdGF0ZX07CisgICAgICAgICAgICB7U3RhdGUsIG9rfTsKICAgICAgICAgV0JpbmFyeSAtPgogICAgICAgICAgICAge29rLCB7e19WZXJzaW9uLCAyMDAsIF9SZWFzb25QaHJhc2V9LCBfSGVhZGVycywgQm9keX19ID0KLSAgICAgICAgICAgICAgaHR0cDpyZXF1ZXN0KHBvc3QsCisgICAgICAgICAgICAgIGh0dHBjOnJlcXVlc3QocG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiaHR0cDovLyIgKysgSG9zdCArKyBQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7IlVzZXItQWdlbnQiLCAiRXJsYW5nL3RocmlmdF9odHRwX3RyYW5zcG9ydCJ9IHwgRXh0cmFIZWFkZXJzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veC10aHJpZnQiLApAQCAtMTkyLDggKzk3LDIwIEBACiAKICAgICAgICAgICAgIFN0YXRlMSA9IFN0YXRlI2h0dHBfdHJhbnNwb3J0e3JlYWRfYnVmZmVyID0gW1JidWYsIEJvZHldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119LAotICAgICAgICAgICAge29rLCBTdGF0ZTF9CisgICAgICAgICAgICB7U3RhdGUxLCBva30KICAgICBlbmQuCiAKLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgorY2xvc2UoU3RhdGUpIC0+CisgICAge1N0YXRlLCBva30uCisKK3JlYWQoU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7cmVhZF9idWZmZXIgPSBSQnVmfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgorICAgICUlIFB1bGwgb2ZmIEdpdmUgYnl0ZXMsIHJldHVybiB0aGVtIHRvIHRoZSB1c2VyLCBsZWF2ZSB0aGUgcmVzdCBpbiB0aGUgYnVmZmVyLgorICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoUkJ1ZiksIExlbiksCisgICAgY2FzZSBpb2xpc3RfdG9fYmluYXJ5KFJCdWYpIG9mCisgICAgICAgIDw8RGF0YTpHaXZlL2JpbmFyeSwgUkJ1ZjEvYmluYXJ5Pj4gLT4KKyAgICAgICAgICAgIFJlc3BvbnNlID0ge29rLCBEYXRhfSwKKyAgICAgICAgICAgIFN0YXRlMSA9IFN0YXRlI2h0dHBfdHJhbnNwb3J0e3JlYWRfYnVmZmVyPVJCdWYxfSwKKyAgICAgICAgICAgIHtTdGF0ZTEsIFJlc3BvbnNlfTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsICdFT0YnfX0KKyAgICBlbmQuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wYXJzZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ3ZjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybApAQCAtMCwwICsxLDQxOSBAQAorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKyUlIFRoZSBqc29uIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB3YXMgY3JlYXRlZCBieQorJSUgYWxpc2RhaXIgc3VsbGl2YW4gPGFsaXNkYWlyQGhhcnRicmFrZS5jb20+IGJhc2VkIG9uCislJSB0aGUganN4IGpzb24gbGlicmFyeQorCistbW9kdWxlKHRocmlmdF9qc29uX3BhcnNlcikuCistZXhwb3J0KFtwYXJzZXIvMCwgaGFuZGxlX2V2ZW50LzJdKS4KKworCistcmVjb3JkKGNvbmZpZywge3N0cmljdF91dGY4ID0gZmFsc2UgOjogYm9vbGVhbigpfSkuCisKKworcGFyc2VyKCkgLT4gZnVuKEpTT04pIC0+IHN0YXJ0KEpTT04sIHs/TU9EVUxFLCBbXX0sIFtdLCAjY29uZmlne30pIGVuZC4KKworCitoYW5kbGVfZXZlbnQoRXZlbnQsIHtIYW5kbGVyLCBTdGF0ZX0sIF9Db25maWcpIC0+IHtIYW5kbGVyLCBIYW5kbGVyOmhhbmRsZV9ldmVudChFdmVudCwgU3RhdGUpfS4KKworaGFuZGxlX2V2ZW50KGVuZF9qc29uLCBTdGF0ZSkgLT4gbGlzdHM6cmV2ZXJzZShbZW5kX2pzb25dICsrIFN0YXRlKTsKK2hhbmRsZV9ldmVudChFdmVudCwgU3RhdGUpIC0+IFtFdmVudF0gKysgU3RhdGUuCisKKworJSUgd2hpdGVzcGFjZQorLWRlZmluZShzcGFjZSwgMTYjMjApLgorLWRlZmluZSh0YWIsIDE2IzA5KS4KKy1kZWZpbmUoY3IsIDE2IzBEKS4KKy1kZWZpbmUobmV3bGluZSwgMTYjMEEpLgorCislJSBvYmplY3QgZGVsaW1pdGVycworLWRlZmluZShzdGFydF9vYmplY3QsIDE2IzdCKS4KKy1kZWZpbmUoZW5kX29iamVjdCwgMTYjN0QpLgorCislJSBhcnJheSBkZWxpbWl0ZXJzCistZGVmaW5lKHN0YXJ0X2FycmF5LCAxNiM1QikuCistZGVmaW5lKGVuZF9hcnJheSwgMTYjNUQpLgorCislJSBrdiBzZXBlcmF0b3IKKy1kZWZpbmUoY29tbWEsIDE2IzJDKS4KKy1kZWZpbmUoZG91YmxlcXVvdGUsIDE2IzIyKS4KKy1kZWZpbmUoc2luZ2xlcXVvdGUsIDE2IzI3KS4KKy1kZWZpbmUoY29sb24sIDE2IzNBKS4KKworJSUgc3RyaW5nIGVzY2FwZSBzZXF1ZW5jZXMKKy1kZWZpbmUocnNvbGlkdXMsIDE2IzVDKS4KKy1kZWZpbmUoc29saWR1cywgMTYjMkYpLgorCislJSBtYXRoCistZGVmaW5lKHplcm8sIDE2IzMwKS4KKy1kZWZpbmUoZGVjaW1hbHBvaW50LCAxNiMyRSkuCistZGVmaW5lKG5lZ2F0aXZlLCAxNiMyRCkuCistZGVmaW5lKHBvc2l0aXZlLCAxNiMyQikuCisKKyUlIGNvbW1lbnRzCistZGVmaW5lKHN0YXIsIDE2IzJBKS4KKworCislJSBzb21lIHVzZWZ1bCBndWFyZHMKKy1kZWZpbmUoaXNfaGV4KFN5bWJvbCksCisgICAgKFN5bWJvbCA+PSAkYSBhbmRhbHNvIFN5bWJvbCA9PCAkZikgb3JlbHNlCisgICAgKFN5bWJvbCA+PSAkQSBhbmRhbHNvIFN5bWJvbCA9PCAkRikgb3JlbHNlCisgICAgKFN5bWJvbCA+PSAkMCBhbmRhbHNvIFN5bWJvbCA9PCAkOSkKKykuCisKKy1kZWZpbmUoaXNfbm9uemVybyhTeW1ib2wpLAorICAgIFN5bWJvbCA+PSAkMSBhbmRhbHNvIFN5bWJvbCA9PCAkOQorKS4KKworLWRlZmluZShpc193aGl0ZXNwYWNlKFN5bWJvbCksCisgICAgU3ltYm9sID06PSA/c3BhY2U7IFN5bWJvbCA9Oj0gP3RhYjsgU3ltYm9sID06PSA/Y3I7IFN5bWJvbCA9Oj0gP25ld2xpbmUKKykuCisKKworJSUgbGlzdHMgYXJlIGJlbmNobWFya2VkIHRvIGJlIGZhc3RlciAodGhvIGhpZ2hlciBpbiBtZW1vcnkgdXNhZ2UpIHRoYW4gYmluYXJpZXMKK25ld19zZXEoKSAtPiBbXS4KK25ld19zZXEoQykgLT4gW0NdLgorCithY2Nfc2VxKFNlcSwgQykgd2hlbiBpc19saXN0KEMpIC0+IGxpc3RzOnJldmVyc2UoQykgKysgU2VxOworYWNjX3NlcShTZXEsIEMpIC0+IFtDXSArKyBTZXEuCisKK2VuZF9zZXEoU2VxKSAtPiB1bmljb2RlOmNoYXJhY3RlcnNfdG9fYmluYXJ5KGxpc3RzOnJldmVyc2UoU2VxKSkuCisKK2VuZF9zZXEoU2VxLCBfKSAtPiBlbmRfc2VxKFNlcSkuCisKKworc3RhcnQoPDwxNiNlZiwgMTYjYmIsIDE2I2JmLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworc3RhcnQoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHZhbHVlKEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykuCisKKwordmFsdWUoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PCR0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHRydWUoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PCRmLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZhbHNlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBudWxsKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDw/bmVnYXRpdmUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbmVnYXRpdmUoUmVzdCwgSGFuZGxlciwgbmV3X3NlcSgkLSksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDw/emVybywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB6ZXJvKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoJDApLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfbm9uemVybyhTKSAtPgorICAgIGludGVnZXIoUmVzdCwgSGFuZGxlciwgbmV3X3NlcShTKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PD9zdGFydF9vYmplY3QsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgb2JqZWN0KFJlc3QsIGhhbmRsZV9ldmVudChzdGFydF9vYmplY3QsIEhhbmRsZXIsIENvbmZpZyksIFtrZXl8U3RhY2tdLCBDb25maWcpOwordmFsdWUoPDw/c3RhcnRfYXJyYXksIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgYXJyYXkoUmVzdCwgaGFuZGxlX2V2ZW50KHN0YXJ0X2FycmF5LCBIYW5kbGVyLCBDb25maWcpLCBbYXJyYXl8U3RhY2tdLCBDb25maWcpOwordmFsdWUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgdmFsdWUoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK29iamVjdCg8PD9kb3VibGVxdW90ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgbmV3X3NlcSgpLCBTdGFjaywgQ29uZmlnKTsKK29iamVjdCg8PD9lbmRfb2JqZWN0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBba2V5fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9vYmplY3QsIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworb2JqZWN0KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIG9iamVjdChSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK29iamVjdChfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2FycmF5KDw8P2VuZF9hcnJheSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2FycmF5fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9hcnJheSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CithcnJheSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBhcnJheShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK2FycmF5KEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpLgorCisKK2NvbG9uKDw8P2NvbG9uLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBba2V5fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFtvYmplY3R8U3RhY2tdLCBDb25maWcpOworY29sb24oPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgY29sb24oUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7Citjb2xvbihfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2tleSg8PD9kb3VibGVxdW90ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgbmV3X3NlcSgpLCBTdGFjaywgQ29uZmlnKTsKK2tleSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBrZXkoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CitrZXkoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCislJSBub3RlIHRoYXQgaWYgeW91IGVuY291bnRlciBhbiBlcnJvciBmcm9tIHN0cmluZyBhbmQgeW91IGNhbid0IGZpbmQgdGhlIGNsYXVzZSB0aGF0CislJSAgY2F1c2VkIGl0IGhlcmUsIGl0IG1pZ2h0IGJlIGluIHVuZXNjYXBlIGJlbG93CitzdHJpbmcoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBkb3VibGVxdW90ZShSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8P3NvbGlkdXMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsID9zb2xpZHVzKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDw/cnNvbGlkdXMvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHVuZXNjYXBlKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzIwLCBYIDwgMTYjMjAyOCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA9PSAxNiMyMDI4OyBYID09IDE2IzIwMjkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPiAxNiMyMDI5LCBYIDwgMTYjZDgwMCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+IDE2I2RmZmYsIFggPCAxNiNmZGQwIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID4gMTYjZmRlZiwgWCA8IDE2I2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMTAwMDAsIFggPCAxNiMxZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMyMDAwMCwgWCA8IDE2IzJmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzMwMDAwLCBYIDwgMTYjM2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNDAwMDAsIFggPCAxNiM0ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM1MDAwMCwgWCA8IDE2IzVmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzYwMDAwLCBYIDwgMTYjNmZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNzAwMDAsIFggPCAxNiM3ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM4MDAwMCwgWCA8IDE2IzhmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzkwMDAwLCBYIDwgMTYjOWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjYTAwMDAsIFggPCAxNiNhZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNiMDAwMCwgWCA8IDE2I2JmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2MwMDAwLCBYIDwgMTYjY2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjZDAwMDAsIFggPCAxNiNkZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNlMDAwMCwgWCA8IDE2I2VmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2YwMDAwLCBYIDwgMTYjZmZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMTAwMDAwLCBYIDwgMTYjMTBmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CislJSBzdXJyb2dhdGVzCitzdHJpbmcoPDwyMzcsIFgsIF8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDE2MCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworJSUgdSt4ZmZmZSwgdSt4ZmZmZiwgY29udHJvbCBjb2RlcyBhbmQgb3RoZXIgbm9uY2hhcmFjdGVycworc3RyaW5nKDw8Xy91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CislJSB1K2ZmZmUgYW5kIHUrZmZmZiBmb3IgUjE0QlhYIChzdWJzZXF1ZW50IHJ1bnRpbWVzIHdpbGwgaGFwcGlseSBtYXRjaCB0aGUKKyUlICBwcmVjZWRpbmcgY2xhdXNlCitzdHJpbmcoPDwyMzksIDE5MSwgWCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPT0gMTkwOyBYID09IDE5MSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworJSUgb3ZlcmxvbmcgZW5jb2RpbmdzIGFuZCBtaXNzaW5nIGNvbnRpbnVhdGlvbnMgb2YgYSAyIGJ5dGUgc2VxdWVuY2UKK3N0cmluZyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDE5MiwgWCA9PCAyMjMgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMSk7CislJSBvdmVybG9uZyBlbmNvZGluZ3MgYW5kIG1pc3NpbmcgY29udGludWF0aW9ucyBvZiBhIDMgYnl0ZSBzZXF1ZW5jZQorc3RyaW5nKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMjI0LCBYID08IDIzOSAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAyKTsKKyUlIG92ZXJsb25nIGVuY29kaW5ncyBhbmQgbWlzc2luZyBjb250aW51YXRpb25zIG9mIGEgNCBieXRlIHNlcXVlbmNlCitzdHJpbmcoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAyNDAsIFggPTwgMjQ3IC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDMpOworJSUgaW5jb21wbGV0ZXMgYW5kIHVuZXhwZWN0ZWQgYnl0ZXMsIGluY2x1ZGluZyBvcnBoYW4gY29udGludWF0aW9ucworc3RyaW5nKDw8XywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2RvdWJsZXF1b3RlKFJlc3QsIEhhbmRsZXIsIEFjYywgW2tleXxfXSA9IFN0YWNrLCBDb25maWcpIC0+CisgICAgY29sb24oUmVzdCwgaGFuZGxlX2V2ZW50KHtrZXksIGVuZF9zZXEoQWNjLCBDb25maWcpfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7Citkb3VibGVxdW90ZShSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe3N0cmluZywgZW5kX3NlcShBY2MsIENvbmZpZyl9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKS4KKworCislJSBzdHJpcHMgY29udGludWF0aW9uIGJ5dGVzIGFmdGVyIGJhZCB1dGYgYnl0ZXMsIGd1YXJkcyBhZ2FpbnN0IGJvdGggdG9vIHNob3J0CislJSAgYW5kIG92ZXJsb25nIHNlcXVlbmNlcy4gTiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RyaXAKK3N0cmlwX2NvbnRpbnVhdGlvbnMoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDApIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpcF9jb250aW51YXRpb25zKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCBOKSB3aGVuIFggPj0gMTI4LCBYID08IDE5MSAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCBOIC0gMSk7CislJSBub3QgYSBjb250aW51YXRpb24gYnl0ZSwgaW5zZXJ0IGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGZvciBzZXF1ZW5jZSB0aHVzCislJSAgZmFyIGFuZCBkaXNwYXRjaCBiYWNrIHRvIHN0cmluZworc3RyaXBfY29udGludWF0aW9ucyg8PFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgXykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKS4KKworCislJSB0aGlzIGFsbCBnZXRzIHJlYWxseSBncm9zcyBhbmQgc2hvdWxkIHByb2JhYmx5IGV2ZW50dWFsbHkgYmUgZm9sZGVkIGludG8KKyUlICBidXQgZm9yIG5vdyBpdCBmYWtlcyBiZWluZyBwYXJ0IG9mIHN0cmluZyBvbiBpbmNvbXBsZXRlcyBhbmQgZXJyb3JzCit1bmVzY2FwZSg8PCRiLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXGIpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JGYsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcZiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxuKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCRyLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXHIpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcdCksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcIiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDw/cnNvbGlkdXMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcXCksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDw/c29saWR1cywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJC8pLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHUsICRkLCBBLCBCLCBDLCA/cnNvbGlkdXMsICR1LCAkZCwgWCwgWSwgWiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKQorICAgICAgICB3aGVuIChBID09ICQ4IG9yZWxzZSBBID09ICQ5IG9yZWxzZSBBID09ICRhIG9yZWxzZSBBID09ICRiKSwKKyAgICAgICAgICAgICAoWCA9PSAkYyBvcmVsc2UgWCA9PSAkZCBvcmVsc2UgWCA9PSAkZSBvcmVsc2UgWCA9PSAkZiksCisgICAgICAgICAgICAgP2lzX2hleChCKSwgP2lzX2hleChDKSwgP2lzX2hleChZKSwgP2lzX2hleChaKQorICAgICAgICAtPgorICAgIEhpZ2ggPSBlcmxhbmc6bGlzdF90b19pbnRlZ2VyKFskZCwgQSwgQiwgQ10sIDE2KSwKKyAgICBMb3cgPSBlcmxhbmc6bGlzdF90b19pbnRlZ2VyKFskZCwgWCwgWSwgWl0sIDE2KSwKKyAgICBDb2RlcG9pbnQgPSAoSGlnaCAtIDE2I2Q4MDApICogMTYjNDAwICsgKExvdyAtIDE2I2RjMDApICsgMTYjMTAwMDAsCisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBDb2RlcG9pbnQpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHUsICRkLCBBLCBCLCBDLCA/cnNvbGlkdXMsICR1LCBXLCBYLCBZLCBaLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpCisgICAgICAgIHdoZW4gKEEgPT0gJDggb3JlbHNlIEEgPT0gJDkgb3JlbHNlIEEgPT0gJGEgb3JlbHNlIEEgPT0gJGIpLAorICAgICAgICAgICAgID9pc19oZXgoQiksID9pc19oZXgoQyksID9pc19oZXgoVyksID9pc19oZXgoWCksID9pc19oZXgoWSksID9pc19oZXgoWikKKyAgICAgICAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFsxNiNmZmZkLCAxNiNmZmZkXSksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkdSwgQSwgQiwgQywgRCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKQorICAgICAgICB3aGVuID9pc19oZXgoQSksID9pc19oZXgoQiksID9pc19oZXgoQyksID9pc19oZXgoRCkgLT4KKyAgICBjYXNlIGVybGFuZzpsaXN0X3RvX2ludGVnZXIoW0EsIEIsIEMsIERdLCAxNikgb2YKKyAgICAgICAgQ29kZXBvaW50IHdoZW4gQ29kZXBvaW50IDwgMTYjZDgwMDsgQ29kZXBvaW50ID4gMTYjZGZmZiAtPgorICAgICAgICAgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBDb2RlcG9pbnQpLCBTdGFjaywgQ29uZmlnKTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZykKKyAgICBlbmQ7Cit1bmVzY2FwZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKKyUlIGxpa2UgaW4gc3RyaW5ncywgdGhlcmUncyBzb21lIHBzZXVkbyBzdGF0ZXMgaW4gaGVyZSB0aGF0IHdpbGwgbmV2ZXIKKyUlICBzaG93IHVwIGluIGVycm9ycyBvciBpbmNvbXBsZXRlcy4gc29tZSBzaG93IHVwIGluIHZhbHVlLCBzb21lIHNob3cKKyUlICB1cCBpbiBpbnRlZ2VyLCBkZWNpbWFsIG9yIGV4cAorbmVnYXRpdmUoPDwkMCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHplcm8oUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICQwKSwgU3RhY2ssIENvbmZpZyk7CituZWdhdGl2ZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfbm9uemVybyhTKSAtPgorICAgIGludGVnZXIoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK25lZ2F0aXZlKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworemVybyg8PD9kZWNpbWFscG9pbnQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCA/ZGVjaW1hbHBvaW50KSwgU3RhY2ssIENvbmZpZyk7Cit6ZXJvKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ICRlOyBTID06PSAkRSAtPgorICAgIGUoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICIuMGUiKSwgU3RhY2ssIENvbmZpZyk7Cit6ZXJvKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7emVybywgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworaW50ZWdlcig8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitpbnRlZ2VyKDw8P2RlY2ltYWxwb2ludCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGluaXRpYWxkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCA/ZGVjaW1hbHBvaW50KSwgU3RhY2ssIENvbmZpZyk7CitpbnRlZ2VyKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ICRlOyBTID06PSAkRSAtPgorICAgIGUoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICIuMGUiKSwgU3RhY2ssIENvbmZpZyk7CitpbnRlZ2VyKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7aW50ZWdlciwgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworaW5pdGlhbGRlY2ltYWwoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworaW5pdGlhbGRlY2ltYWwoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2RlY2ltYWwoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gJGU7IFMgPTo9ICRFIC0+CisgICAgZShSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJGUpLCBTdGFjaywgQ29uZmlnKTsKK2RlY2ltYWwoQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHtkZWNpbWFsLCBBY2N9LCBTdGFjaywgQ29uZmlnKS4KKworCitlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGV4cChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZSg8PFNpZ24sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTaWduID06PSA/cG9zaXRpdmU7IFNpZ24gPTo9ID9uZWdhdGl2ZSAtPgorICAgIGV4KFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTaWduKSwgU3RhY2ssIENvbmZpZyk7CitlKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZXgoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZXhwKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitleChfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2V4cCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBleHAoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2V4cChCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge2V4cCwgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworZmluaXNoX251bWJlcihSZXN0LCBIYW5kbGVyLCBBY2MsIFtdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZm9ybWF0X251bWJlcihBY2MpLCBIYW5kbGVyLCBDb25maWcpLCBbXSwgQ29uZmlnKTsKK2ZpbmlzaF9udW1iZXIoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGZvcm1hdF9udW1iZXIoQWNjKSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZykuCisKKworZm9ybWF0X251bWJlcih7emVybywgQWNjfSkgLT4ge2ludGVnZXIsIGxpc3RfdG9faW50ZWdlcihsaXN0czpyZXZlcnNlKEFjYykpfTsKK2Zvcm1hdF9udW1iZXIoe2ludGVnZXIsIEFjY30pIC0+IHtpbnRlZ2VyLCBsaXN0X3RvX2ludGVnZXIobGlzdHM6cmV2ZXJzZShBY2MpKX07Citmb3JtYXRfbnVtYmVyKHtkZWNpbWFsLCBBY2N9KSAtPiB7ZmxvYXQsIGxpc3RfdG9fZmxvYXQobGlzdHM6cmV2ZXJzZShBY2MpKX07Citmb3JtYXRfbnVtYmVyKHtleHAsIEFjY30pIC0+IHtmbG9hdCwgbGlzdF90b19mbG9hdChsaXN0czpyZXZlcnNlKEFjYykpfS4KKworCit0cnVlKDw8JHIsICR1LCAkZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7bGl0ZXJhbCwgdHJ1ZX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOwordHJ1ZShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2ZhbHNlKDw8JGEsICRsLCAkcywgJGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe2xpdGVyYWwsIGZhbHNlfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CitmYWxzZShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK251bGwoPDwkdSwgJGwsICRsLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtsaXRlcmFsLCBudWxsfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CitudWxsKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworbWF5YmVfZG9uZSg8PFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtdLCBDb25maWcpIC0+CisgICAgZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX2pzb24sIEhhbmRsZXIsIENvbmZpZyksIFtdLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9lbmRfb2JqZWN0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbb2JqZWN0fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9vYmplY3QsIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9lbmRfYXJyYXksIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFthcnJheXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfYXJyYXksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9jb21tYSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW29iamVjdHxTdGFja10sIENvbmZpZykgLT4KKyAgICBrZXkoUmVzdCwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZyk7CittYXliZV9kb25lKDw8P2NvbW1hLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbYXJyYXl8X10gPSBTdGFjaywgQ29uZmlnKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworbWF5YmVfZG9uZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworbWF5YmVfZG9uZShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2RvbmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbXSwgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgZG9uZShSZXN0LCBIYW5kbGVyLCBbXSwgQ29uZmlnKTsKK2RvbmUoPDw+Piwge19IYW5kbGVyLCBTdGF0ZX0sIFtdLCBfQ29uZmlnKSAtPiBTdGF0ZTsKK2RvbmUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4gZXJsYW5nOmVycm9yKGJhZGFyZykuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmM2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybApAQCAtMCwwICsxLDU2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSBUaGUgSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB3YXMgY3JlYXRlZCBieQorJSUgUGV0ZXIgTmV1bWFyayA8bmV1bWFyay5wZXRlckBnbWFpbC5jb20+IGJhc2VkIG9uCislJSB0aGUgYmluYXJ5IHByb3RvY29sIGltcGxlbWVudGF0aW9uLgorCistbW9kdWxlKHRocmlmdF9qc29uX3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1leHBvcnQoW25ldy8xLCBuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xLAorICAgICAgICAgbmV3X3Byb3RvY29sX2ZhY3RvcnkvMgorICAgICAgICBdKS4KKworLXJlY29yZChqc29uX2NvbnRleHQsIHsKKyAgICAlIHRoZSB0eXBlIG9mIGpzb25fY29udGV4dDogYXJyYXkgb3Igb2JqZWN0CisgICAgdHlwZSwKKyAgICAlIGZpZWxkcyByZWFkIG9yIHdyaXR0ZW4KKyAgICBmaWVsZHNfcHJvY2Vzc2VkID0gMAorfSkuCisKKy1yZWNvcmQoanNvbl9wcm90b2NvbCwgeworICAgIHRyYW5zcG9ydCwKKyAgICBjb250ZXh0X3N0YWNrID0gW10sCisgICAganN4Cit9KS4KKy10eXBlIHN0YXRlKCkgOjogI2pzb25fcHJvdG9jb2x7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgorCistZGVmaW5lKFZFUlNJT05fMSwgMSkuCistZGVmaW5lKEpTT05fRE9VQkxFX1BSRUNJU0lPTiwgMTYpLgorCit0eXBlaWRfdG9fanNvbig/dFR5cGVfQk9PTCkgLT4gInRmIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9CWVRFKSAtPiAiaTgiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0RPVUJMRSkgLT4gImRibCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTgpIC0+ICJpOCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTE2KSAtPiAiaTE2IjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JMzIpIC0+ICJpMzIiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0k2NCkgLT4gImk2NCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfU1RSSU5HKSAtPiAic3RyIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9TVFJVQ1QpIC0+ICJyZWMiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX01BUCkgLT4gIm1hcCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfU0VUKSAtPiAic2V0IjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9MSVNUKSAtPiAibHN0Ii4KKworanNvbl90b190eXBlaWQoInRmIikgLT4gP3RUeXBlX0JPT0w7Citqc29uX3RvX3R5cGVpZCgiZGJsIikgLT4gP3RUeXBlX0RPVUJMRTsKK2pzb25fdG9fdHlwZWlkKCJpOCIpIC0+ID90VHlwZV9JODsKK2pzb25fdG9fdHlwZWlkKCJpMTYiKSAtPiA/dFR5cGVfSTE2OworanNvbl90b190eXBlaWQoImkzMiIpIC0+ID90VHlwZV9JMzI7Citqc29uX3RvX3R5cGVpZCgiaTY0IikgLT4gP3RUeXBlX0k2NDsKK2pzb25fdG9fdHlwZWlkKCJzdHIiKSAtPiA/dFR5cGVfU1RSSU5HOworanNvbl90b190eXBlaWQoInJlYyIpIC0+ID90VHlwZV9TVFJVQ1Q7Citqc29uX3RvX3R5cGVpZCgibWFwIikgLT4gP3RUeXBlX01BUDsKK2pzb25fdG9fdHlwZWlkKCJzZXQiKSAtPiA/dFR5cGVfU0VUOworanNvbl90b190eXBlaWQoImxzdCIpIC0+ID90VHlwZV9MSVNULgorCitzdGFydF9jb250ZXh0KG9iamVjdCkgLT4gInsiOworc3RhcnRfY29udGV4dChhcnJheSkgLT4gIlsiLgorCitlbmRfY29udGV4dChvYmplY3QpIC0+ICJ9IjsKK2VuZF9jb250ZXh0KGFycmF5KSAtPiAiXSIuCisKKworbmV3KFRyYW5zcG9ydCkgLT4KKyAgICBuZXcoVHJhbnNwb3J0LCBfT3B0aW9ucyA9IFtdKS4KKworbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMpIC0+CisgICAgU3RhdGUgID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSwKKyAgICB0aHJpZnRfcHJvdG9jb2w6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworZmx1c2hfdHJhbnNwb3J0KFRoaXMgPSAjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydCwKKyAgICAgICAgICAgIGNvbnRleHRfc3RhY2sgPSBbXQorICAgICAgICB9LCBSZXN1bHR9LgorCitjbG9zZV90cmFuc3BvcnQoVGhpcyA9ICNqc29uX3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KSwKKyAgICB7VGhpcyNqc29uX3Byb3RvY29seworICAgICAgICAgICAgdHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0LAorICAgICAgICAgICAgY29udGV4dF9zdGFjayA9IFtdLAorICAgICAgICAgICAganN4ID0gdW5kZWZpbmVkCisgICAgICAgIH0sIFJlc3VsdH0uCisKKyUlJQorJSUlIGluc3RhbmNlIG1ldGhvZHMKKyUlJQorJSBwbGFjZXMgYSBuZXcgY29udGV4dCBvbiB0aGUgc3RhY2s6Cit3cml0ZSgjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrID0gU3RhY2t9ID0gU3RhdGUwLCB7ZW50ZXJfY29udGV4dCwgVHlwZX0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gd3JpdGVfdmFsdWVzKFN0YXRlMCwgW3tjb250ZXh0X3ByZV9pdGVtLCBmYWxzZX1dKSwKKyAgICBTdGF0ZTIgPSBTdGF0ZTEjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrID0gWworICAgICAgICAjanNvbl9jb250ZXh0e3R5cGU9VHlwZX18U3RhY2tdfSwKKyAgICB3cml0ZV92YWx1ZXMoU3RhdGUyLCAgW2xpc3RfdG9fYmluYXJ5KHN0YXJ0X2NvbnRleHQoVHlwZSkpXSk7CisKKyUgcmVtb3ZlcyB0aGUgdG9wbW9zdCBjb250ZXh0IGZyb20gc3RhY2sgICAgCit3cml0ZSgjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrID0gW0N1cnJDdHh0fFN0YWNrXX0gPSBTdGF0ZTAsIHtleGl0X2NvbnRleHR9KSAtPgorICAgIFR5cGUgPSBDdXJyQ3R4dCNqc29uX2NvbnRleHQudHlwZSwKKyAgICBTdGF0ZTEgPSBTdGF0ZTAjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrID0gU3RhY2t9LAorICAgIHdyaXRlX3ZhbHVlcyhTdGF0ZTEsIFsKKyAgICAgICAgICAgIGxpc3RfdG9fYmluYXJ5KGVuZF9jb250ZXh0KFR5cGUpKSwKKyAgICAgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgZmFsc2V9CisgICAgICAgIF0pOworCislIHdyaXRlcyBuZWNlc3NhcnkgcHJlbHVkZSB0byBmaWVsZCBvciBjb250YWluZXIgZGVwZW5kaW5nIG9uIGN1cnJlbnQgY29udGV4dCAgIAord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtdfSA9IFRoaXMwLAorICAgIHtjb250ZXh0X3ByZV9pdGVtLCBffSkgLT4ge1RoaXMwLCBva307Cit3cml0ZSgjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrID0gW0NvbnRleHR8X0N0eHRUYWlsXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wcmVfaXRlbSwgTWF5TmVlZFF1b3Rlc30pIC0+CisgICAgRmllbGRObyA9IENvbnRleHQjanNvbl9jb250ZXh0LmZpZWxkc19wcm9jZXNzZWQsCisgICAgQ3R4dFR5cGUgPSBDb250ZXh0I2pzb25fY29udGV4dC50eXBlLAorICAgIFJlbSA9IEZpZWxkTm8gcmVtIDIsCisgICAgY2FzZSB7Q3R4dFR5cGUsIEZpZWxkTm8sIFJlbSwgTWF5TmVlZFF1b3Rlc30gb2YKKyAgICAgICAge2FycmF5LCBOLCBfLCBffSB3aGVuIE4gPiAwIC0+ICAlIGFycmF5IGVsZW1lbnQgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsIj4+KTsKKyAgICAgICAge29iamVjdCwgMCwgXywgdHJ1ZX0gLT4gJSBub24tc3RyaW5nIG9iamVjdCBrZXkgKGZpcnN0KQorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IlwiIj4+KTsKKyAgICAgICAge29iamVjdCwgTiwgMCwgdHJ1ZX0gd2hlbiBOID4gMCAtPiAlIG5vbi1zdHJpbmcgb2JqZWN0IGtleSAobm90IGZpcnN0KQorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IixcIiI+Pik7CisgICAgICAgIHtvYmplY3QsIE4sIDAsIGZhbHNlfSB3aGVuIE4gPiAwLT4gJSBzdHJpbmcgb2JqZWN0IGtleSAobm90IGZpcnN0KQorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IiwiPj4pOworICAgICAgICBfIC0+ICUgbm8gcHJlLWZpZWxkIG5lY2Vzc2FyeQorICAgICAgICAgICAge1RoaXMwLCBva30KKyAgICBlbmQ7CisKKyUgd3JpdGVzIG5lY2Vzc2FyeSBwb3N0bHVkZSB0byBmaWVsZCBvciBjb250YWluZXIgZGVwZW5kaW5nIG9uIGN1cnJlbnQgY29udGV4dCAgIAord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtdfSA9IFRoaXMwLAorICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgX30pIC0+IHtUaGlzMCwgb2t9Oword3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDb250ZXh0fEN0eHRUYWlsXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIE1heU5lZWRRdW90ZXN9KSAtPgorICAgIEZpZWxkTm8gPSBDb250ZXh0I2pzb25fY29udGV4dC5maWVsZHNfcHJvY2Vzc2VkLAorICAgIEN0eHRUeXBlID0gQ29udGV4dCNqc29uX2NvbnRleHQudHlwZSwKKyAgICBSZW0gPSBGaWVsZE5vIHJlbSAyLAorICAgIHtUaGlzMSwgb2t9ID0gY2FzZSB7Q3R4dFR5cGUsIFJlbSwgTWF5TmVlZFF1b3Rlc30gb2YKKyAgICAgICAge29iamVjdCwgMCwgdHJ1ZX0gLT4gJSBub24tc3RyaW5nIG9iamVjdCBrZXkgCisgICAgICAgICAgICB3cml0ZShUaGlzMCwgPDwiXCI6Ij4+KTsKKyAgICAgICAge29iamVjdCwgMCwgZmFsc2V9IC0+ICUgc3RyaW5nIG9iamVjdCBrZXkgCisgICAgICAgICAgICB3cml0ZShUaGlzMCwgPDwiOiI+Pik7CisgICAgICAgIF8gLT4gJSBubyBwcmUtZmllbGQgbmVjZXNzYXJ5CisgICAgICAgICAgICB7VGhpczAsIG9rfQorICAgIGVuZCwKKyAgICBOZXdDb250ZXh0ID0gQ29udGV4dCNqc29uX2NvbnRleHR7ZmllbGRzX3Byb2Nlc3NlZCA9IEZpZWxkTm8gKyAxfSwKKyAgICB7VGhpczEjanNvbl9wcm90b2NvbHtjb250ZXh0X3N0YWNrPVtOZXdDb250ZXh0fEN0eHRUYWlsXX0sIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgIG5hbWUgPSBOYW1lLAorICAgIHR5cGUgPSBUeXBlLAorICAgIHNlcWlkID0gU2VxaWR9KSAtPgorICAgIHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7ZW50ZXJfY29udGV4dCwgYXJyYXl9LAorICAgICAgICB7aTMyLCA/VkVSU0lPTl8xfSwKKyAgICAgICAge3N0cmluZywgTmFtZX0sCisgICAgICAgIHtpMzIsIFR5cGV9LAorICAgICAgICB7aTMyLCBTZXFpZH0KKyAgICBdKTsKKword3JpdGUoVGhpcywgbWVzc2FnZV9lbmQpIC0+ICAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcywgW3tleGl0X2NvbnRleHR9XSk7CisKKyUgRXhhbXBsZSBmaWVsZCBleHByZXNzaW9uOiAiMSI6eyJkYmwiOjMuMTR9Cit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAgJSBlbnRlcmluZyAnb3V0ZXInIG9iamVjdAorICAgICAgICB7aTE2LCBJZH0sCisgICAgICAgICUgZW50ZXJpbmcgJ291dGVyJyBvYmplY3QKKyAgICAgICAge2VudGVyX2NvbnRleHQsIG9iamVjdH0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKFR5cGUpfQorICAgIF0pOworCit3cml0ZShUaGlzLCBmaWVsZF9zdG9wKSAtPiAKKyAgICB7VGhpcywgb2t9OworCit3cml0ZShUaGlzLCBmaWVsZF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFt7ZXhpdF9jb250ZXh0fV0pOworCislIEV4YW1wbGUgbWVzc2FnZSB3aXRoIG1hcDogWzEsInRlc3RNYXAiLDEsMCx7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19XQord3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICAga3R5cGUgPSBLdHlwZSwKKyAgICAgICB2dHlwZSA9IFZ0eXBlLAorICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge3N0cmluZywgdHlwZWlkX3RvX2pzb24oS3R5cGUpfSwKKyAgICAgICAge3N0cmluZywgdHlwZWlkX3RvX2pzb24oVnR5cGUpfSwKKyAgICAgICAge2kzMiwgU2l6ZX0sCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIG1hcF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0sCisgICAgICAgIHtleGl0X2NvbnRleHR9CisgICAgXSk7CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICAgIHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7ZW50ZXJfY29udGV4dCwgYXJyYXl9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihFdHlwZSl9LAorICAgICAgICB7aTMyLCBTaXplfQorICAgIF0pOworCit3cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4gCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsWworICAgICAgICB7ZXhpdF9jb250ZXh0fQorICAgIF0pOworCislIGV4YW1wbGUgbWVzc2FnZSB3aXRoIHNldDogWzEsInRlc3RTZXQiLDEsMCx7IjEiOnsic2V0IjpbImkzMiIsMywxLDIsM119fV0KK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfc2V0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBhcnJheX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKEV0eXBlKX0sCisgICAgICAgIHtpMzIsIFNpemV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHNldF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKyUgZXhhbXBsZSBtZXNzYWdlIHdpdGggc3RydWN0OiBbMSwidGVzdFN0cnVjdCIsMSwwLHsiMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19fV0KK3dyaXRlKFRoaXMsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSkgLT4gCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIG9iamVjdH0KKyAgICBdKTsKKword3JpdGUoVGhpcywgc3RydWN0X2VuZCkgLT4gCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsWworICAgICAgICB7ZXhpdF9jb250ZXh0fQorICAgIF0pOworCit3cml0ZShUaGlzLCB7Ym9vbCwgdHJ1ZX0pICAtPiB3cml0ZV92YWx1ZXMoVGhpcywgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgdHJ1ZX0sCisgICAgICAgIDw8InRydWUiPj4sCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2Jvb2wsIGZhbHNlfSkgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICA8PCJmYWxzZSI+PiwKKyAgICAgICAge2NvbnRleHRfcG9zdF9pdGVtLCB0cnVlfQorICAgIF0pOworCit3cml0ZShUaGlzLCB7Ynl0ZSwgQnl0ZX0pIC0+IHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtjb250ZXh0X3ByZV9pdGVtLCB0cnVlfSwKKyAgICAgICAgbGlzdF90b19iaW5hcnkoaW50ZWdlcl90b19saXN0KEJ5dGUpKSwKKyAgICAgICAge2NvbnRleHRfcG9zdF9pdGVtLCB0cnVlfQorICAgIF0pOworCit3cml0ZShUaGlzLCB7aTE2LCBJMTZ9KSAtPgorICAgIHdyaXRlKFRoaXMsIHtieXRlLCBJMTZ9KTsKKword3JpdGUoVGhpcywge2kzMiwgSTMyfSkgLT4KKyAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgSTMyfSk7CisKK3dyaXRlKFRoaXMsIHtpNjQsIEk2NH0pIC0+CisgICAgd3JpdGUoVGhpcywge2J5dGUsIEk2NH0pOworCit3cml0ZShUaGlzLCB7ZG91YmxlLCBEb3VibGV9KSAtPiB3cml0ZV92YWx1ZXMoVGhpcywgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgdHJ1ZX0sCisgICAgICAgIGxpc3RfdG9fYmluYXJ5KGlvX2xpYjpmb3JtYXQoIn4uKmYiLCBbP0pTT05fRE9VQkxFX1BSRUNJU0lPTixEb3VibGVdKSksCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpczAsIHtzdHJpbmcsIFN0cn0pIC0+IHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgZmFsc2V9LAorICAgICAgICBjYXNlIGlzX2JpbmFyeShTdHIpIG9mCisgICAgICAgICAgICB0cnVlIC0+IFN0cjsKKyAgICAgICAgICAgIGZhbHNlIC0+IDw8IlwiIiwgKGxpc3RfdG9fYmluYXJ5KFN0cikpL2JpbmFyeSwgIlwiIj4+CisgICAgICAgIGVuZCwKKyAgICAgICAge2NvbnRleHRfcG9zdF9pdGVtLCBmYWxzZX0KKyAgICBdKTsKKworJSUgVE9ETzogYmluYXJ5IGZpZWxkcyBzaG91bGQgYmUgYmFzZTY0IGVuY29kZWQ/CisKKyUlIERhdGEgOjogaW9saXN0KCkKK3dyaXRlKFRoaXMgPSAjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc30sIERhdGEpIC0+CisgICAgJWlvOmZvcm1hdCgiRGF0YSB+cCBDdHh0IH5wfm5+biIsIFtEYXRhLCBUaGlzI2pzb25fcHJvdG9jb2wuY29udGV4dF9zdGFja10pLAorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRyYW5zLCBEYXRhKSwKKyAgICB7VGhpcyNqc29uX3Byb3RvY29se3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKK3dyaXRlX3ZhbHVlcyhUaGlzMCwgVmFsdWVMaXN0KSAtPgorICAgIEZpbmFsU3RhdGUgPSBsaXN0czpmb2xkbCgKKyAgICAgICAgZnVuKFZhbCwgVGhpc0luKSAtPgorICAgICAgICAgICAge1RoaXNPdXQsIG9rfSA9IHdyaXRlKFRoaXNJbiwgVmFsKSwKKyAgICAgICAgICAgIFRoaXNPdXQKKyAgICAgICAgZW5kLAorICAgICAgICBUaGlzMCwKKyAgICAgICAgVmFsdWVMaXN0KSwKKyAgICB7RmluYWxTdGF0ZSwgb2t9LgorCislJSBJIHdpc2ggdGhlIGVybGFuZyB2ZXJzaW9uIG9mIHRoZSB0cmFuc3BvcnQgaW50ZXJmYWNlIGluY2x1ZGVkIGEgCislJSByZWFkX2FsbCBmdW5jdGlvbiAobGlrZSBlZy4gdGhlIGphdmEgaW1wbGVtZW50YXRpb24pLiBTaW5jZSBpdCBkb2Vzbid0LAorJSUgaGVyZSdzIG15IHZlcnNpb24gKGV2ZW4gdGhvdWdoIGl0IHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGlzIGZpbGUpLgorJSUKKyUlIFRoZSByZXN1bHRpbmcgYmluYXJ5IGlzIGltbWVkaWF0ZWx5IHNlbmQgdG8gdGhlIEpTWCBzdHJlYW0gcGFyc2VyLgorJSUgU3Vic2VxdWVudCBjYWxscyB0byByZWFkIGFjdHVhbGx5IG9wZXJhdGUgb24gdGhlIGV2ZW50cyByZXR1cm5lZCBieSBKU1guCityZWFkX2FsbCgjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnQwfSA9IFN0YXRlKSAtPgorICAgIHtUcmFuc3BvcnQxLCBCaW59ID0gcmVhZF9hbGxfMShUcmFuc3BvcnQwLCBbXSksCisgICAgUCA9IHRocmlmdF9qc29uX3BhcnNlcjpwYXJzZXIoKSwKKyAgICBbRmlyc3R8UmVzdF0gPSBQKEJpbiksCisgICAgU3RhdGUjanNvbl9wcm90b2NvbHsKKyAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0MSwKKyAgICAgICAganN4ID0ge2V2ZW50LCBGaXJzdCwgUmVzdH0KKyAgICB9LgorCityZWFkX2FsbF8xKFRyYW5zcG9ydDAsIElvTGlzdCkgLT4KKyAgICB7VHJhbnNwb3J0MSwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChUcmFuc3BvcnQwLCAxKSwKKyAgICBjYXNlIFJlc3VsdCBvZgorICAgICAgICB7b2ssIDw8Pj59IC0+ICUgbm90aGluZyByZWFkOiBhc3N1bWUgd2UncmUgZG9uZQorICAgICAgICAgICAge1RyYW5zcG9ydDEsIGlvbGlzdF90b19iaW5hcnkobGlzdHM6cmV2ZXJzZShJb0xpc3QpKX07CisgICAgICAgIHtvaywgRGF0YX0gLT4gJSBjaGFyYWN0ZXIgc3VjY2Vzc2Z1bGx5IHJlYWQ7IHJlYWQgbW9yZQorICAgICAgICAgICAgcmVhZF9hbGxfMShUcmFuc3BvcnQxLCBbRGF0YXxJb0xpc3RdKTsKKyAgICAgICAge2Vycm9yLCAnRU9GJ30gLT4gJSB3ZSdyZSBkb25lCisgICAgICAgICAgICB7VHJhbnNwb3J0MSwgaW9saXN0X3RvX2JpbmFyeShsaXN0czpyZXZlcnNlKElvTGlzdCkpfQorICAgIGVuZC4KKworJSBFeHBlY3QgcmVhZHMgYW4gZXZlbnQgZnJvbSB0aGUgSlNYIGV2ZW50IHN0cmVhbS4gSXQgcmVjZWl2ZXMgYW4gZXZlbnQgb3IgZGF0YQorJSB0eXBlIGFzIGlucHV0LiBDb21wYXJpbmcgdGhlIHJlYWQgZXZlbnQgZnJvbSB0aGUgb25lIGlzIHdhcyBwYXNzZWQsIGl0CislIHJldHVybnMgYW4gZXJyb3IgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGVuY291bnRlcmVkLgorJSBFeHBlY3QgYWxzbyBtYWludGFpbnMgdGhlIGNvbnRleHQgc3RhY2sgaW4gI2pzb25fcHJvdG9jb2wuCitleHBlY3QoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwge1R5cGUsIERhdGF9PUV2LCBbTmV4dHxSZXN0XX19PVN0YXRlLCBFeHBlY3RlZFR5cGUpIC0+CisgICAgTmV4dFN0YXRlID0gU3RhdGUjanNvbl9wcm90b2NvbHtqc3g9e2V2ZW50LCBOZXh0LCBSZXN0fX0sCisgICAgY2FzZSBUeXBlID09IEV4cGVjdGVkVHlwZSBvZgorICAgICAgICB0cnVlIC0+IAorICAgICAgICAgICAge05leHRTdGF0ZSwge29rLCBjb252ZXJ0X2RhdGEoVHlwZSwgRGF0YSl9fTsKKyAgICAgICAgZmFsc2UgLT4KKyAgICAgICAgICAgIHtOZXh0U3RhdGUsIHtlcnJvciwge3VuZXhwZWN0ZWRfanNvbl9ldmVudCwgRXZ9fX0KKyAgICBlbmQ7CisKK2V4cGVjdCgjanNvbl9wcm90b2NvbHtqc3g9e2V2ZW50LCBFdmVudCwgTmV4dH19PVN0YXRlLCBFeHBlY3RlZEV2ZW50KSAtPgorICAgICBleHBlY3QoU3RhdGUjanNvbl9wcm90b2NvbHtqc3g9e2V2ZW50LCB7RXZlbnQsIG5vbmV9LCBOZXh0fX0sIEV4cGVjdGVkRXZlbnQpLgorCitjb252ZXJ0X2RhdGEoaW50ZWdlciwgSSkgLT4gbGlzdF90b19pbnRlZ2VyKEkpOworY29udmVydF9kYXRhKGZsb2F0LCBGKSAtPiBsaXN0X3RvX2Zsb2F0KEYpOworY29udmVydF9kYXRhKF8sIEQpIC0+IEQuCisKK2V4cGVjdF9tYW55KFN0YXRlLCBFeHBlY3RlZExpc3QpIC0+CisgICAgZXhwZWN0X21hbnlfMShTdGF0ZSwgRXhwZWN0ZWRMaXN0LCBbXSwgb2spLgorCitleHBlY3RfbWFueV8xKFN0YXRlLCBbXSwgUmVzdWx0TGlzdCwgU3RhdHVzKSAtPgorICAgIHtTdGF0ZSwge1N0YXR1cywgbGlzdHM6cmV2ZXJzZShSZXN1bHRMaXN0KX19OworZXhwZWN0X21hbnlfMShTdGF0ZSwgW0V4cGVjdGVkfEV4cFRhaWxdLCBSZXN1bHRMaXN0LCBfUHJldlN0YXR1cykgLT4KKyAgICB7U3RhdGUxLCB7U3RhdHVzLCBEYXRhfX0gPSBleHBlY3QoU3RhdGUsIEV4cGVjdGVkKSwKKyAgICBOZXdSZXN1bHRMaXN0ID0gW0RhdGF8UmVzdWx0TGlzdF0sCisgICAgY2FzZSBTdGF0dXMgb2YKKyAgICAgICAgJSBpbiBjYXNlIG9mIGVycm9yLCBlbmQgcHJlbWF0dXJlbHkKKyAgICAgICAgZXJyb3IgLT4gZXhwZWN0X21hbnlfMShTdGF0ZTEsIFtdLCBOZXdSZXN1bHRMaXN0LCBTdGF0dXMpOworICAgICAgICBvayAtPiBleHBlY3RfbWFueV8xKFN0YXRlMSwgRXhwVGFpbCwgTmV3UmVzdWx0TGlzdCwgU3RhdHVzKQorICAgIGVuZC4KKworJSB3cmFwcGVyIGFyb3VuZCBleHBlY3QgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgY29udGFpbmVyIG9wZW5pbmcvY2xvc2luZyBmdW5jdGlvbnMKK2V4cGVjdF9ub2RhdGEoVGhpcywgRXhwZWN0ZWRMaXN0KSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpcywgRXhwZWN0ZWRMaXN0KSBvZgorICAgICAgICB7U3RhdGUsIHtvaywgX319IC0+IAorICAgICAgICAgICAge1N0YXRlLCBva307CisgICAgICAgIEVycm9yIC0+IAorICAgICAgICAgICAgRXJyb3IKKyAgICBlbmQuCisKK3JlYWRfZmllbGQoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgRmllbGQsIFtOZXh0fFJlc3RdfX0gPSBTdGF0ZSkgLT4KKyAgICBOZXdTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgTmV4dCwgUmVzdH19LAorICAgIHtOZXdTdGF0ZSwgRmllbGR9LgorCityZWFkKFRoaXMwLCBtZXNzYWdlX2JlZ2luKSAtPgorICAgICUgY2FsbCByZWFkX2FsbCB0byBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc3BvcnQgYnVmZmVyIGludG8gSlNYLgorICAgIFRoaXMxID0gcmVhZF9hbGwoVGhpczApLAorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczEsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LCBpbnRlZ2VyLCBzdHJpbmcsIGludGVnZXIsIGludGVnZXJdKSBvZgorICAgICAgICB7VGhpczIsIHtvaywgW18sIFZlcnNpb24sIE5hbWUsIFR5cGUsIFNlcUlkXX19IC0+CisgICAgICAgICAgICBjYXNlIFZlcnNpb24gPTo9ID9WRVJTSU9OXzEgb2YKKyAgICAgICAgICAgICAgICB0cnVlIC0+CisgICAgICAgICAgICAgICAgICAgIHtUaGlzMiwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSAgPSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgID0gVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfX07CisgICAgICAgICAgICAgICAgZmFsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAge1RoaXMyLCB7ZXJyb3IsIG5vX2pzb25fcHJvdG9jb2xfdmVyc2lvbn19CisgICAgICAgICAgICBlbmQ7CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworcmVhZChUaGlzLCBzdHJ1Y3RfYmVnaW4pIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW3N0YXJ0X29iamVjdF0pOworCityZWFkKFRoaXMsIHN0cnVjdF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9vYmplY3RdKTsKKworcmVhZChUaGlzMCwgZmllbGRfYmVnaW4pIC0+CisgICAge1RoaXMxLCBSZWFkfSA9IGV4cGVjdF9tYW55KFRoaXMwLCAKKyAgICAgICAgICAgIFslZmllbGQgaWQKKyAgICAgICAgICAgICBrZXksIAorICAgICAgICAgICAgICUge30gc3Vycm91bmRpbmcgZmllbGQKKyAgICAgICAgICAgICBzdGFydF9vYmplY3QsIAorICAgICAgICAgICAgICUgdHlwZSBvZiBmaWVsZAorICAgICAgICAgICAgIGtleV0pLAorICAgIGNhc2UgUmVhZCBvZgorICAgICAgICB7b2ssIFtGaWVsZElkU3RyLCBfLCBGaWVsZFR5cGVdfSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgICAgICAgICAgdHlwZSA9IGpzb25fdG9fdHlwZWlkKEZpZWxkVHlwZSksIAorICAgICAgICAgICAgICAgIGlkID0gbGlzdF90b19pbnRlZ2VyKEZpZWxkSWRTdHIpfX07ICUgVE9ETzogZG8gd2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gYSB0cnkvY2F0Y2g/CisgICAgICAgIHtlcnJvcixbe3VuZXhwZWN0ZWRfanNvbl9ldmVudCwge2VuZF9vYmplY3Qsbm9uZX19XX0gLT4KKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSA/dFR5cGVfU1RPUH19OworICAgICAgICBPdGhlciAtPiAKKyAgICAgICAgICAgIGlvOmZvcm1hdCgiKioqKiBPVEhFUiBicmFuY2ggc2VsZWN0ZWQgKioqKiIpLAorICAgICAgICAgICAge1RoaXMxLCBPdGhlcn0KKyAgICBlbmQ7CisKK3JlYWQoVGhpcywgZmllbGRfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfb2JqZWN0XSk7CisKKyUgRXhhbXBsZSBtZXNzYWdlIHdpdGggbWFwOiBbMSwidGVzdE1hcCIsMSwwLHsiMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX1dCityZWFkKFRoaXMwLCBtYXBfYmVnaW4pIC0+CisgICAgY2FzZSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgJSBrZXkgdHlwZQorICAgICAgICAgICAgIHN0cmluZywgCisgICAgICAgICAgICAgJSB2YWx1ZSB0eXBlCisgICAgICAgICAgICAgc3RyaW5nLCAKKyAgICAgICAgICAgICAlIHNpemUKKyAgICAgICAgICAgICBpbnRlZ2VyLAorICAgICAgICAgICAgICUgdGhlIGZvbGxvd2luZyBvYmplY3QgY29udGFpbnMgdGhlIG1hcAorICAgICAgICAgICAgIHN0YXJ0X29iamVjdF0pIG9mCisgICAgICAgIHtUaGlzMSwge29rLCBbXywgS3R5cGUsIFZ0eXBlLCBTaXplLCBfXX19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBLdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKyAgICAgICAgT3RoZXIgLT4gT3RoZXIKKyAgICBlbmQ7CisKK3JlYWQoVGhpcywgbWFwX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX29iamVjdCwgZW5kX2FycmF5XSk7CisKK3JlYWQoVGhpczAsIGxpc3RfYmVnaW4pIC0+CisgICAgY2FzZSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgJSBlbGVtZW50IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgc2l6ZQorICAgICAgICAgICAgIGludGVnZXJdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEV0eXBlLCBTaXplXX19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICAgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKyAgICAgICAgT3RoZXIgLT4gT3RoZXIKKyAgICBlbmQ7CisKK3JlYWQoVGhpcywgbGlzdF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9hcnJheV0pOworCislIGV4YW1wbGUgbWVzc2FnZSB3aXRoIHNldDogWzEsInRlc3RTZXQiLDEsMCx7IjEiOnsic2V0IjpbImkzMiIsMywxLDIsM119fV0KK3JlYWQoVGhpczAsIHNldF9iZWdpbikgLT4KKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMwLCAKKyAgICAgICAgICAgIFtzdGFydF9hcnJheSwKKyAgICAgICAgICAgICAlIGVsZW1lbnQgdHlwZQorICAgICAgICAgICAgIHN0cmluZywgCisgICAgICAgICAgICAgJSBzaXplCisgICAgICAgICAgICAgaW50ZWdlcl0pIG9mCisgICAgICAgIHtUaGlzMSwge29rLCBbXywgRXR5cGUsIFNpemVdfX0gLT4KKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIHNldF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9hcnJheV0pOworCityZWFkKFRoaXMwLCBmaWVsZF9zdG9wKSAtPgorICAgIHtUaGlzMCwgb2t9OworJSUKKworcmVhZChUaGlzMCwgYm9vbCkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7bGl0ZXJhbCwgSX0gLT4gCisgICAgICAgICAgICB7b2ssIEl9OyAKKyAgICAgICAgX090aGVyIC0+CisgICAgICAgICAgICB7ZXJyb3IsIHVuZXhwZWN0ZWRfZXZlbnRfZm9yX2Jvb2xlYW59CisgICAgZW5kLAorICAgIHtUaGlzMSwgVmFsdWV9OworCityZWFkKFRoaXMwLCBieXRlKSAtPgorICAgIHtUaGlzMSwgRmllbGR9ID0gcmVhZF9maWVsZChUaGlzMCksCisgICAgVmFsdWUgPSBjYXNlIEZpZWxkIG9mCisgICAgICAgIHtrZXksIEt9IC0+CisgICAgICAgICAgICB7b2ssIGxpc3RfdG9faW50ZWdlcihLKX07CisgICAgICAgIHtpbnRlZ2VyLCBJfSAtPiAKKyAgICAgICAgICAgIHtvaywgbGlzdF90b19pbnRlZ2VyKEkpfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9pbnRlZ2VyfQorICAgIGVuZCwKKyAgICB7VGhpczEsIFZhbHVlfTsKKworcmVhZChUaGlzMCwgaTE2KSAtPgorICAgIHJlYWQoVGhpczAsIGJ5dGUpOworCityZWFkKFRoaXMwLCBpMzIpIC0+CisgICAgcmVhZChUaGlzMCwgYnl0ZSk7CisKK3JlYWQoVGhpczAsIGk2NCkgLT4KKyAgICByZWFkKFRoaXMwLCBieXRlKTsKKworcmVhZChUaGlzMCwgZG91YmxlKSAtPgorICAgIHtUaGlzMSwgRmllbGR9ID0gcmVhZF9maWVsZChUaGlzMCksCisgICAgVmFsdWUgPSBjYXNlIEZpZWxkIG9mCisgICAgICAgIHtmbG9hdCwgSX0gLT4gCisgICAgICAgICAgICB7b2ssIGxpc3RfdG9fZmxvYXQoSSl9OyAKKyAgICAgICAgX090aGVyIC0+CisgICAgICAgICAgICB7ZXJyb3IsIHVuZXhwZWN0ZWRfZXZlbnRfZm9yX2RvdWJsZX0KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX07CisKKyUgcmV0dXJucyBhIGJpbmFyeSBkaXJlY3RseSwgY2FsbCBiaW5hcnlfdG9fbGlzdCBpZiBuZWNlc3NhcnkKK3JlYWQoVGhpczAsIHN0cmluZykgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7c3RyaW5nLCBJfSAtPiAKKyAgICAgICAgICAgIHtvaywgSX07IAorICAgICAgICB7a2V5LCBKfSAtPiAKKyAgICAgICAgICAgIHtvaywgSn07IAorICAgICAgICBfT3RoZXIgLT4KKyAgICAgICAgICAgIHtlcnJvciwgdW5leHBlY3RlZF9ldmVudF9mb3Jfc3RyaW5nfQorICAgIGVuZCwKKyAgICB7VGhpczEsIFZhbHVlfS4KKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJSByZXR1cm5zIGEgKGZ1bigpIC0+IHRocmlmdF9wcm90b2NvbCgpKQorbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgX09wdGlvbnMpIC0+CisgICAgJSBPbmx5IHN0cmljZSByZWFkL3dyaXRlIGFyZSBpbXBsZW1lbnRlZAorICAgIEYgPSBmdW4oKSAtPgorICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICB0aHJpZnRfanNvbl9wcm90b2NvbDpuZXcoVHJhbnNwb3J0LCBbXSkKKyAgICAgICAgZW5kLAorICAgIHtvaywgRn0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5YWNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDgzIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzAsIG5ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCisKKworLXJlY29yZCh0X21lbWJ1ZmZlciwgeworICBidWZmZXIgPSBbXQorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfbWVtYnVmZmVye30uCisKKworLXNwZWMgbmV3KCkgLT4gdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoKSAtPiBuZXcoW10pLgorCistc3BlYyBuZXcoQnVmOjppb2RhdGEoKSkgLT4gdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoQnVmKSB3aGVuIGlzX2xpc3QoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSk7CituZXcoQnVmKSB3aGVuIGlzX2JpbmFyeShCdWYpIC0+CisgIFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWZdfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKKyAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fS4KKworCityZWFkX2V4YWN0KFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICBfIC0+CisgICAgICB7U3RhdGUsIHtlcnJvciwgZW9mfX0KKyAgZW5kLgorCisKK3dyaXRlKFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpCit3aGVuIGlzX2xpc3QoRGF0YSk7IGlzX2JpbmFyeShEYXRhKSAtPgorICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCisKKworZmx1c2goU3RhdGUpIC0+IHtTdGF0ZSwgb2t9LgorCisKK2Nsb3NlKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCmluZGV4IGI0ZjYwN2EuLjZhNTllYTUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKQEAgLTE5LDE0NiArMTksMjkgQEAKIAogLW1vZHVsZSh0aHJpZnRfbWVtb3J5X2J1ZmZlcikuCiAKLS1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKLS1leHBvcnQoW25ldy8wLCBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMF0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMCwgbmV3LzFdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMF0pLgogCi0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCBoYW5kbGVfaW5mby8yLAotICAgICAgICAgdGVybWluYXRlLzIsIGNvZGVfY2hhbmdlLzNdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgd3JhcHBlciBhcm91bmQgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQgZm9yIGxlZ2FjeSByZWFzb25zCiAKLS1yZWNvcmQobWVtb3J5X2J1ZmZlciwge2J1ZmZlcn0pLgorbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCiAKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIEFQSQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotbmV3KCkgLT4KLSAgICBjYXNlIGdlbl9zZXJ2ZXI6c3RhcnRfbGluayg/TU9EVUxFLCBbXSwgW10pIG9mCi0gICAgICAgIHtvaywgUGlkfSAtPgotICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgUGlkKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KK25ldyhTdGF0ZSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KFN0YXRlKS4KIAotbmV3X3RyYW5zcG9ydF9mYWN0b3J5KCkgLT4KLSAgICB7b2ssIGZ1bigpIC0+IG5ldygpIGVuZH0uCituZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPiB7b2ssIGZ1bigpIC0+IG5ldygpIGVuZH0uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB3cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+IG9rCi0lJQotJSUgRGF0YSA9IGlvbGlzdCgpCi0lJQotJSUgRGVzY3JpcHRpb246IFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIHt3cml0ZSwgRGF0YX0pLgord3JpdGUoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OndyaXRlKFN0YXRlLCBEYXRhKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGZsdXNoKFRyYW5zcG9ydCkgLT4gb2sKLSUlCi0lJSBEZXNjcmlwdGlvbjogRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1mbHVzaChUcmFuc3BvcnQpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwgZmx1c2gpLgorcmVhZChTdGF0ZSwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChTdGF0ZSwgRGF0YSkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBjbG9zZShUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsb3NlKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoVHJhbnNwb3J0LCBjbG9zZSkuCitmbHVzaChTdGF0ZSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goU3RhdGUpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogUmVhZChUcmFuc3BvcnQsIExlbikgLT4ge29rLCBEYXRhfQotJSUKLSUlIERhdGEgPSBiaW5hcnkoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc29wcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3JlYWQsIExlbn0pLgotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaW5pdChBcmdzKSAtPiB7b2ssIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29ufQotJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbml0KFtdKSAtPgotICAgIHtvaywgI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW119fS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2NhbGwoe3dyaXRlLCBEYXRhfSwgX0Zyb20sIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gQnVmfSkgLT4KLSAgICB7cmVwbHksIG9rLCBTdGF0ZSNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfX07Ci0KLWhhbmRsZV9jYWxsKHtyZWFkLCBMZW59LCBfRnJvbSwgU3RhdGUgPSAjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBCdWZ9KSAtPgotICAgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmKSwKLSAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCi0gICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAotICAgIHtyZXBseSwge29rLCBSZXN1bHR9LCBTdGF0ZSNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ319OwotCi1oYW5kbGVfY2FsbChmbHVzaCwgX0Zyb20sIFN0YXRlKSAtPgotICAgIHtyZXBseSwgb2ssIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYXN0KGNsb3NlLCBTdGF0ZSkgLT4KLSAgICB7c3RvcCwgbm9ybWFsLCBTdGF0ZX07Ci1oYW5kbGVfY2FzdChNc2csIFN0YXRlPSNtZW1vcnlfYnVmZmVye30pIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfaW5mbyhfSW5mbywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiB2b2lkKCkKLSUlIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIGdlbl9zZXJ2ZXIgd2hlbiBpdCBpcyBhYm91dCB0bwotJSUgdGVybWluYXRlLiBJdCBzaG91bGQgYmUgdGhlIG9wcG9zaXRlIG9mIE1vZHVsZTppbml0LzEgYW5kIGRvIGFueSBuZWNlc3NhcnkKLSUlIGNsZWFuaW5nIHVwLiBXaGVuIGl0IHJldHVybnMsIHRoZSBnZW5fc2VydmVyIHRlcm1pbmF0ZXMgd2l0aCBSZWFzb24uCi0lJSBUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi10ZXJtaW5hdGUoX1JlYXNvbiwgX1N0YXRlKSAtPgotICAgIG9rLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4ge29rLCBOZXdTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvZGVfY2hhbmdlKF9PbGRWc24sIFN0YXRlLCBfRXh0cmEpIC0+Ci0gICAge29rLCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgorY2xvc2UoU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmNsb3NlKFN0YXRlKS4KIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNWU5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwKQEAgLTAsMCArMSw1NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyKS4KKworLWV4cG9ydChbCisgICAgICAgICAgbmV3LzAKKyAgICAgICAgICxzdG9yZS8zCisgICAgICAgICAsZmluZC8yCisgICAgICAgICAsZmV0Y2gvMgorICAgICAgICBdKS4KKworLXR5cGUgc2VydmljZV9oYW5kbGVyKCkgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLgorLXR5cGUgbW9kdWxlXygpICAgICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIHNlcnZpY2VfaGFuZGxlcl9tYXAoKSA6OiBbe1NlcnZpY2VIYW5kbGVyOjpzZXJ2aWNlX2hhbmRsZXIoKSwgTW9kdWxlOjptb2R1bGVfKCl9XS4KKworLXNwZWMgbmV3KCkgLT4gc2VydmljZV9oYW5kbGVyX21hcCgpLgorbmV3KCkgLT4KKyAgICBvcmRkaWN0Om5ldygpLgorCistc3BlYyBzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApIC0+IE5ld01hcCB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKSwKKyAgICBOZXdNYXAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkuCitzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApIC0+CisgICAgb3JkZGljdDpzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApLgorCistc3BlYyBmaW5kKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IHtvaywgTW9kdWxlfSB8IGVycm9yIHdoZW4KKyAgICBTZXJ2aWNlSGFuZGxlciA6OiBzZXJ2aWNlX2hhbmRsZXIoKSwKKyAgICBNb2R1bGUgICAgICAgICA6OiBtb2R1bGVfKCksCisgICAgTWFwICAgICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPgorICAgIG9yZGRpY3Q6ZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KKworLXNwZWMgZmV0Y2goU2VydmljZUhhbmRsZXIsIE1hcCkgLT4gTW9kdWxlIHdoZW4KKyAgICBTZXJ2aWNlSGFuZGxlciA6OiBzZXJ2aWNlX2hhbmRsZXIoKSwKKyAgICBNb2R1bGUgICAgICAgICA6OiBtb2R1bGVfKCksCisgICAgTWFwICAgICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorZmV0Y2goU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YjcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgorCistZXhwb3J0KFtuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xCisgICAgICAgIF0pLgorCistcmVjb3JkKHByb3RvY29sLCB7bW9kdWxlLCBkYXRhfSkuCistdHlwZSBwcm90b2NvbCgpIDo6ICNwcm90b2NvbHt9LgorCistcmVjb3JkIChtdWx0aXBsZXhlZF9wcm90b2NvbCwge3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZTo6YXRvbSgpLAorCQkJCQkJCQlwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlOjp0ZXJtKCksCisJCQkJCQkJCXNlcnZpY2VfbmFtZTo6bm9uZW1wdHlfc3RyaW5nKCl9KS4KKworLXR5cGUgc3RhdGUoKSA6OiAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7fS4KKworLXNwZWMgbmV3KFByb3RvY29sVG9EZWNvcmF0ZTo6cHJvdG9jb2woKSwgU2VydmljZU5hbWU6Om5vbmVtcHR5X3N0cmluZygpKSAtPiB7b2ssIFByb3RvY29sOjpwcm90b2NvbCgpfS4KK25ldyhQcm90b2NvbFRvRGVjb3JhdGUsIFNlcnZpY2VOYW1lKSB3aGVuIGlzX3JlY29yZChQcm90b2NvbFRvRGVjb3JhdGUsIHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoU2VydmljZU5hbWUpIC0+CisgICAgU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLm1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBQcm90b2NvbFRvRGVjb3JhdGUjcHJvdG9jb2wuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSkgLT4KKyAgICB7U3RhdGUxLCBva30gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6Zmx1c2hfdHJhbnNwb3J0KFN0YXRlMCksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK2Nsb3NlX3RyYW5zcG9ydChTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSkgLT4KKyAgICB7U3RhdGUxLCBva30gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6Y2xvc2VfdHJhbnNwb3J0KFN0YXRlMCksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSA9IFNlcnZpY2VOYW1lfSwKKyAgICAgIE1lc3NhZ2UgPSAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gTmFtZX0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOndyaXRlKFN0YXRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWU9U2VydmljZU5hbWUgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWV9KSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIG9rfTsKKword3JpdGUoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgIE1lc3NhZ2UpIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOndyaXRlKFN0YXRlMCwgTWVzc2FnZSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK3JlYWQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTB9LAorICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIFJlc3VsdH0gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6cmVhZChTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgUmVzdWx0fS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKaW5kZXggZTI2ZmIzMy4uNWM5ZjI2ZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKQEAgLTI0LDU4ICsyNCw4OSBAQAogLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCiAtaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgogCi0tcmVjb3JkKHRocmlmdF9wcm9jZXNzb3IsIHtoYW5kbGVyLCBpbl9wcm90b2NvbCwgb3V0X3Byb3RvY29sLCBzZXJ2aWNlfSkuCistcmVjb3JkKHRocmlmdF9wcm9jZXNzb3IsIHtoYW5kbGVyLCBwcm90b2NvbCwgc2VydmljZX0pLgogCi1pbml0KHtTZXJ2ZXIsIFByb3RvR2VuLCBTZXJ2aWNlLCBIYW5kbGVyfSkgd2hlbiBpc19mdW5jdGlvbihQcm90b0dlbiwgMCkgLT4KLSAgICB7b2ssIElQcm90LCBPUHJvdH0gPSBQcm90b0dlbigpLAotICAgIGxvb3AoI3RocmlmdF9wcm9jZXNzb3J7aW5fcHJvdG9jb2wgPSBJUHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wcm90b2NvbCA9IE9Qcm90LAoraW5pdCh7X1NlcnZlciwgUHJvdG9HZW4sIFNlcnZpY2UsIEhhbmRsZXJ9KSB3aGVuIGlzX2Z1bmN0aW9uKFByb3RvR2VuLCAwKSAtPgorICAgIHtvaywgUHJvdG99ID0gUHJvdG9HZW4oKSwKKyAgICBsb29wKCN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyfSkuCiAKLWxvb3AoU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntpbl9wcm90b2NvbCAgPSBJUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3Byb3RvY29sID0gT1Byb3RvfSkgLT4KLSAgICBjYXNlIHRocmlmdF9wcm90b2NvbDpyZWFkKElQcm90bywgbWVzc2FnZV9iZWdpbikgb2YKK2xvb3AoU3RhdGUwID0gI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgID0gUHJvdG8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9KSAtPgorCisgICAge1Byb3RvMSwgTWVzc2FnZUJlZ2lufSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgbWVzc2FnZV9iZWdpbiksCisgICAgU3RhdGUxID0gU3RhdGUwI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgPSBQcm90bzF9LAorCisgICAgRXJyb3JIYW5kbGVyID0gZnVuCisgICAgICAgIChIYW5kbGVyTW9kdWxlcykgd2hlbiBpc19saXN0KEhhbmRsZXJNb2R1bGVzKSAtPiB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmV0Y2goP01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCBIYW5kbGVyTW9kdWxlcyk7CisgICAgICAgIChIYW5kbGVyTW9kdWxlKSAtPiBIYW5kbGVyTW9kdWxlCisgICAgZW5kLAorCisgICAgY2FzZSBNZXNzYWdlQmVnaW4gb2YKKwogICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX0NBTEx9IC0+Ci0gICAgICAgICAgICBvayA9IGhhbmRsZV9mdW5jdGlvbihTdGF0ZSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSksCi0gICAgICAgICAgICBsb29wKFN0YXRlKTsKLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9PTkVXQVl9IC0+Ci0gICAgICAgICAgICBvayA9IGhhbmRsZV9mdW5jdGlvbihTdGF0ZSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSksCi0gICAgICAgICAgICBsb29wKFN0YXRlKTsKLSAgICAgICAge2Vycm9yLCB0aW1lb3V0fSAtPgotICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChPUHJvdG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gd2hlbiBUeXBlID06PSA/dE1lc3NhZ2VUeXBlX0NBTEw7IFR5cGUgPTo9ID90TWVzc2FnZVR5cGVfT05FV0FZIC0+CisgICAgICAgICAgICBjYXNlIHN0cmluZzp0b2tlbnMoRnVuY3Rpb24sID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUikgb2YKKyAgICAgICAgICAgICAgICBbU2VydmljZU5hbWUsIEZ1bmN0aW9uTmFtZV0gLT4KKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1vZHVsZSAgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmV0Y2goU2VydmljZU5hbWUsIFNlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSGFuZGxlciA9IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaChTZXJ2aWNlTmFtZSwgSGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSN0aHJpZnRfcHJvY2Vzc29ye3NlcnZpY2U9U2VydmljZU1vZHVsZSwgaGFuZGxlcj1TZXJ2aWNlSGFuZGxlcn0sIGxpc3RfdG9fYXRvbShGdW5jdGlvbk5hbWUpLCBTZXFpZCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSAtPiBsb29wKFN0YXRlMiN0aHJpZnRfcHJvY2Vzc29ye3NlcnZpY2U9U2VydmljZSwgaGFuZGxlcj1IYW5kbGVyfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgorCQkJCQkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgUmVhc29uXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICAgICBfIC0+CisgICAgICAgICAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICB7U3RhdGUyLCBva30gLT4gbG9vcChTdGF0ZTIpOworICAgICAgICAgICAgICAgICAgICAgICAge19TdGF0ZTIsIHtlcnJvciwgUmVhc29ufX0gLT4KKwkJCQkJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW2xpc3RfdG9fYXRvbShGdW5jdGlvbiksIFJlYXNvbl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaworICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZDsKKyAgICAgICAge2Vycm9yLCB0aW1lb3V0ID0gUmVhc29ufSAtPgorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgb2s7Ci0gICAgICAgIHtlcnJvciwgY2xvc2VkfSAtPgorICAgICAgICB7ZXJyb3IsIGNsb3NlZCA9IFJlYXNvbn0gLT4KICAgICAgICAgICAgICUlIGVycm9yX2xvZ2dlcjppbmZvX21zZygiQ2xpZW50IGRpc2Nvbm5lY3RlZH5uIiksCi0gICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KE9Qcm90byksCisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICBleGl0KHNodXRkb3duKTsKKyAgICAgICAge2Vycm9yLCBSZWFzb259IC0+CisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBleGl0KHNodXRkb3duKQogICAgIGVuZC4KIAotaGFuZGxlX2Z1bmN0aW9uKFN0YXRlPSN0aHJpZnRfcHJvY2Vzc29ye2luX3Byb3RvY29sID0gSVByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wcm90b2NvbCA9IE9Qcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0sCi0gICAgICAgICAgICAgICAgRnVuY3Rpb24pIC0+CitoYW5kbGVfZnVuY3Rpb24oU3RhdGUwPSN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAorICAgICAgICAgICAgICAgIEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgIFNlcWlkKSAtPgogICAgIEluUGFyYW1zID0gU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSksCiAKLSAgICB7b2ssIFBhcmFtc30gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8sIEluUGFyYW1zKSwKKyAgICB7UHJvdG8xLCB7b2ssIFBhcmFtc319ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBJblBhcmFtcyksCisgICAgU3RhdGUxID0gU3RhdGUwI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgPSBQcm90bzF9LAogCiAgICAgdHJ5CiAgICAgICAgIFJlc3VsdCA9IEhhbmRsZXI6aGFuZGxlX2Z1bmN0aW9uKEZ1bmN0aW9uLCBQYXJhbXMpLAogICAgICAgICAlJSB7TWljcm8sIFJlc3VsdH0gPSBiZXR0ZXJfdGltZXIoSGFuZGxlciwgaGFuZGxlX2Z1bmN0aW9uLCBbRnVuY3Rpb24sIFBhcmFtc10pLAogICAgICAgICAlJSBlcnJvcl9sb2dnZXI6aW5mb19tc2coIlByb2Nlc3NlZCB+cCh+cCkgaW4gfi40Zm1zfm4iLAogICAgICAgICAlJSAgICAgICAgICAgICAgICAgICAgICAgW0Z1bmN0aW9uLCBQYXJhbXMsIE1pY3JvLzEwMDAuMF0pLAotICAgICAgICBoYW5kbGVfc3VjY2VzcyhTdGF0ZSwgRnVuY3Rpb24sIFJlc3VsdCkKKyAgICAgICAgaGFuZGxlX3N1Y2Nlc3MoU3RhdGUxLCBGdW5jdGlvbiwgUmVzdWx0LCBTZXFpZCkKICAgICBjYXRjaAotICAgICAgICBUeXBlOkRhdGEgLT4KLSAgICAgICAgICAgIGhhbmRsZV9mdW5jdGlvbl9jYXRjaChTdGF0ZSwgRnVuY3Rpb24sIFR5cGUsIERhdGEpCi0gICAgZW5kLAotICAgIGFmdGVyX3JlcGx5KE9Qcm90bykuCisgICAgICAgIFR5cGU6RGF0YSB3aGVuIFR5cGUgPTo9IHRocm93IG9yZWxzZSBUeXBlID06PSBlcnJvciAtPgorICAgICAgICAgICAgaGFuZGxlX2Z1bmN0aW9uX2NhdGNoKFN0YXRlMSwgRnVuY3Rpb24sIFR5cGUsIERhdGEsIFNlcWlkKQorICAgIGVuZC4KIAogaGFuZGxlX2Z1bmN0aW9uX2NhdGNoKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAotICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLCBFcnJUeXBlLCBFcnJEYXRhKSAtPgorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLCBFcnJUeXBlLCBFcnJEYXRhLCBTZXFpZCkgLT4KICAgICBJc09uZXdheSA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSkgPTo9IG9uZXdheV92b2lkLAogCiAgICAgY2FzZSB7RXJyVHlwZSwgRXJyRGF0YX0gb2YKQEAgLTg0LDQxICsxMTUsNDEgQEAKICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjp3YXJuaW5nX21zZygKICAgICAgICAgICAgICAgIm9uZXdheSB2b2lkIH5wIHRocmV3IGVycm9yIHdoaWNoIG11c3QgYmUgaWdub3JlZDogfnAiLAogICAgICAgICAgICAgICBbRnVuY3Rpb24sIHtFcnJUeXBlLCBFcnJEYXRhLCBTdGFja31dKSwKLSAgICAgICAgICAgIG9rOworICAgICAgICAgICAge1N0YXRlLCBva307CiAKICAgICAgICAge3Rocm93LCBFeGNlcHRpb259IHdoZW4gaXNfdHVwbGUoRXhjZXB0aW9uKSwgc2l6ZShFeGNlcHRpb24pID4gMCAtPgotICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOndhcm5pbmdfbXNnKCJ+cCB0aHJldyBleGNlcHRpb246IH5wfm4iLCBbRnVuY3Rpb24sIEV4Y2VwdGlvbl0pLAotICAgICAgICAgICAgaGFuZGxlX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbiksCi0gICAgICAgICAgICBvazsgICAlIHdlIHN0aWxsIHdhbnQgdG8gYWNjZXB0IG1vcmUgcmVxdWVzdHMgZnJvbSB0aGlzIGNsaWVudAorICAgICAgICAgICAgJWVycm9yX2xvZ2dlcjp3YXJuaW5nX21zZygifnAgdGhyZXcgZXhjZXB0aW9uOiB+cH5uIiwgW0Z1bmN0aW9uLCBFeGNlcHRpb25dKSwKKyAgICAgICAgICAgIGhhbmRsZV9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24sIFNlcWlkKTsKKyAgICAgICAgICAgICUgd2Ugc3RpbGwgd2FudCB0byBhY2NlcHQgbW9yZSByZXF1ZXN0cyBmcm9tIHRoaXMgY2xpZW50CiAKICAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KLSAgICAgICAgICAgIG9rID0gaGFuZGxlX2Vycm9yKFN0YXRlLCBGdW5jdGlvbiwgRXJyb3IpCisgICAgICAgICAgICBoYW5kbGVfZXJyb3IoU3RhdGUsIEZ1bmN0aW9uLCBFcnJvciwgU2VxaWQpCiAgICAgZW5kLgogCi1oYW5kbGVfc3VjY2VzcyhTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye291dF9wcm90b2NvbCA9IE9Qcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAoraGFuZGxlX3N1Y2Nlc3MoU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlID0gU2VydmljZX0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgIFJlc3VsdCkgLT4KKyAgICAgICAgICAgICAgIFJlc3VsdCwKKyAgICAgICAgICAgICAgIFNlcWlkKSAtPgogICAgIFJlcGx5VHlwZSAgPSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpLAogICAgIFN0cnVjdE5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pICsrICJfcmVzdWx0IiwKIAotICAgIG9rID0gY2FzZSBSZXN1bHQgb2YKLSAgICAgICAgICAgICB7cmVwbHksIFJlcGx5RGF0YX0gLT4KLSAgICAgICAgICAgICAgICAgUmVwbHkgPSB7e3N0cnVjdCwgW3swLCBSZXBseVR5cGV9XX0sIHtTdHJ1Y3ROYW1lLCBSZXBseURhdGF9fSwKLSAgICAgICAgICAgICAgICAgc2VuZF9yZXBseShPUHJvdG8sIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX1JFUExZLCBSZXBseSk7CisgICAgY2FzZSBSZXN1bHQgb2YKKyAgICAgICAge3JlcGx5LCBSZXBseURhdGF9IC0+CisgICAgICAgICAgICBSZXBseSA9IHt7c3RydWN0LCBbezAsIFJlcGx5VHlwZX1dfSwge1N0cnVjdE5hbWUsIFJlcGx5RGF0YX19LAorICAgICAgICAgICAgc2VuZF9yZXBseShTdGF0ZSwgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfUkVQTFksIFJlcGx5LCBTZXFpZCk7CiAKLSAgICAgICAgICAgICBvayB3aGVuIFJlcGx5VHlwZSA9PSB7c3RydWN0LCBbXX0gLT4KLSAgICAgICAgICAgICAgICAgc2VuZF9yZXBseShPUHJvdG8sIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX1JFUExZLCB7UmVwbHlUeXBlLCB7U3RydWN0TmFtZX19KTsKKyAgICAgICAgb2sgd2hlbiBSZXBseVR5cGUgPT0ge3N0cnVjdCwgW119IC0+CisgICAgICAgICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5VHlwZSwge1N0cnVjdE5hbWV9fSwgU2VxaWQpOwogCi0gICAgICAgICAgICAgb2sgd2hlbiBSZXBseVR5cGUgPT0gb25ld2F5X3ZvaWQgLT4KLSAgICAgICAgICAgICAgICAgJSUgbm8gcmVwbHkgZm9yIG9uZXdheSB2b2lkCi0gICAgICAgICAgICAgICAgIG9rCi0gICAgICAgICBlbmQuCisgICAgICAgIG9rIHdoZW4gUmVwbHlUeXBlID09IG9uZXdheV92b2lkIC0+CisgICAgICAgICAgICAlJSBubyByZXBseSBmb3Igb25ld2F5IHZvaWQKKyAgICAgICAgICAgIHtTdGF0ZSwgb2t9CisgICAgZW5kLgogCi1oYW5kbGVfZXhjZXB0aW9uKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7b3V0X3Byb3RvY29sID0gT1Byb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSwKK2hhbmRsZV9leGNlcHRpb24oU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlID0gU2VydmljZX0sCiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICBFeGNlcHRpb24pIC0+CisgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgU2VxaWQpIC0+CiAgICAgRXhjZXB0aW9uVHlwZSA9IGVsZW1lbnQoMSwgRXhjZXB0aW9uKSwKICAgICAlJSBGZXRjaCBhIHN0cnVjdHVyZSBsaWtlIHtzdHJ1Y3QsIFt7LTIsIHtzdHJ1Y3QsIHtNb2R1bGUsIFR5cGV9fX0sCiAgICAgJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0zLCB7c3RydWN0LCB7TW9kdWxlLCBUeXBlfX19XX0KQEAgLTE0MSwyMCArMTcyLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIE1ha2Ugc3VyZSB3ZSBnb3QgYXQgbGVhc3Qgb25lIGRlZmluZWQKICAgICBjYXNlIGxpc3RzOmFsbChmdW4oWCkgLT4gWCA9Oj0gdW5kZWZpbmVkIGVuZCwgRXhjZXB0aW9uTGlzdCkgb2YKICAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAgb2sgPSBoYW5kbGVfdW5rbm93bl9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24pOworICAgICAgICAgICAgaGFuZGxlX3Vua25vd25fZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uLCBTZXFpZCk7CiAgICAgICAgIGZhbHNlIC0+Ci0gICAgICAgICAgICBvayA9IHNlbmRfcmVwbHkoT1Byb3RvLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5U3BlYywgRXhjZXB0aW9uVHVwbGV9KQorICAgICAgICAgICAgc2VuZF9yZXBseShTdGF0ZSwgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfUkVQTFksIHtSZXBseVNwZWMsIEV4Y2VwdGlvblR1cGxlfSwgU2VxaWQpCiAgICAgZW5kLgogCiAlJQogJSUgQ2FsbGVkIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgdGhyb3duIGJ5IHRoZSBzZXJ2aWNlLCBidXQgaXQgd2FzCiAlJSBub3Qgb25lIG9mIHRoZSBleGNlcHRpb25zIHRoYXQgd2FzIGRlZmluZWQgZm9yIHRoZSBmdW5jdGlvbi4KICUlCi1oYW5kbGVfdW5rbm93bl9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24pIC0+CitoYW5kbGVfdW5rbm93bl9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24sIFNlcWlkKSAtPgogICAgIGhhbmRsZV9lcnJvcihTdGF0ZSwgRnVuY3Rpb24sIHtleGNlcHRpb25fbm90X2RlY2xhcmVkX2FzX3Rocm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ufSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbn0sIFNlcWlkKS4KIAotaGFuZGxlX2Vycm9yKCN0aHJpZnRfcHJvY2Vzc29ye291dF9wcm90b2NvbCA9IE9Qcm90b30sIEZ1bmN0aW9uLCBFcnJvcikgLT4KK2hhbmRsZV9lcnJvcihTdGF0ZSwgRnVuY3Rpb24sIEVycm9yLCBTZXFpZCkgLT4KICAgICBTdGFjayA9IGVybGFuZzpnZXRfc3RhY2t0cmFjZSgpLAogICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coIn5wIGhhZCBhbiBlcnJvcjogfnB+biIsIFtGdW5jdGlvbiwge0Vycm9yLCBTdGFja31dKSwKIApAQCAtMTcwLDE5ICsyMDEsMTkgQEAKICAgICAgICAgICAgICAjJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbid7CiAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgdHlwZSA9ID9UQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTn19LAotICAgIHNlbmRfcmVwbHkoT1Byb3RvLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9FWENFUFRJT04sIFJlcGx5KS4KKyAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9FWENFUFRJT04sIFJlcGx5LCBTZXFpZCkuCiAKLXNlbmRfcmVwbHkoT1Byb3RvLCBGdW5jdGlvbiwgUmVwbHlNZXNzYWdlVHlwZSwgUmVwbHkpIC0+Ci0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoT1Byb3RvLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFJlcGx5TWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IDB9KSwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShPUHJvdG8sIFJlcGx5KSwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShPUHJvdG8sIG1lc3NhZ2VfZW5kKSwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoT1Byb3RvKSwKLSAgICBvay4KLQotYWZ0ZXJfcmVwbHkoT1Byb3RvKSAtPgotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChPUHJvdG8pCi0gICAgJSUgICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChPUHJvdG8pCi0gICAgLgorc2VuZF9yZXBseShTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8wfSwgRnVuY3Rpb24sIFJlcGx5TWVzc2FnZVR5cGUsIFJlcGx5LCBTZXFpZCkgLT4KKyAgICB0cnkKKyAgICAgICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUmVwbHlNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0pLAorICAgICAgICB7UHJvdG8yLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8xLCBSZXBseSksCisgICAgICAgIHtQcm90bzMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzIsIG1lc3NhZ2VfZW5kKSwKKyAgICAgICAge1Byb3RvNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90bzMpLAorICAgICAgICB7U3RhdGUjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvNH0sIG9rfQorICAgIGNhdGNoCisgICAgICAgIGVycm9yOntiYWRtYXRjaCwge18sIHtlcnJvciwgX30gPSBFcnJvcn19IC0+CisgICAgICAgICAgICB7U3RhdGUsIEVycm9yfQorICAgIGVuZC4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCmluZGV4IDFiZmIwYTQuLjJmZTEwZDYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybApAQCAtNDksMTAgKzQ5LDEzIEBACiAgICAge29rLCAjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBEYXRhfX0uCiAKLWZsdXNoX3RyYW5zcG9ydCgjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRGF0YX0pIC0+Ci0gICAgTW9kdWxlOmZsdXNoX3RyYW5zcG9ydChEYXRhKS4KKy1zcGVjIGZsdXNoX3RyYW5zcG9ydCgjcHJvdG9jb2x7fSkgLT4geyNwcm90b2NvbHt9LCBva30uCitmbHVzaF90cmFuc3BvcnQoUHJvdG8gPSAjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBEYXRhfSkgLT4KKyAgICB7TmV3RGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaF90cmFuc3BvcnQoRGF0YSksCisgICAge1Byb3RvI3Byb3RvY29se2RhdGEgPSBOZXdEYXRhfSwgUmVzdWx0fS4KIAorLXNwZWMgY2xvc2VfdHJhbnNwb3J0KCNwcm90b2NvbHt9KSAtPiBvay4KIGNsb3NlX3RyYW5zcG9ydCgjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRGF0YX0pIC0+CiAgICAgTW9kdWxlOmNsb3NlX3RyYW5zcG9ydChEYXRhKS4KQEAgLTYwLDggKzYzLDggQEAKIHR5cGVpZF90b19hdG9tKD90VHlwZV9TVE9QKSAtPiBmaWVsZF9zdG9wOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1ZPSUQpIC0+IHZvaWQ7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfQk9PTCkgLT4gYm9vbDsKLXR5cGVpZF90b19hdG9tKD90VHlwZV9CWVRFKSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0RPVUJMRSkgLT4gZG91YmxlOwordHlwZWlkX3RvX2F0b20oP3RUeXBlX0k4KSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kxNikgLT4gaTE2OwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kzMikgLT4gaTMyOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0k2NCkgLT4gaTY0OwpAQCAtNzMsOCArNzYsOSBAQAogCiB0ZXJtX3RvX3R5cGVpZCh2b2lkKSAtPiA/dFR5cGVfVk9JRDsKIHRlcm1fdG9fdHlwZWlkKGJvb2wpIC0+ID90VHlwZV9CT09MOwotdGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0JZVEU7Cit0ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChkb3VibGUpIC0+ID90VHlwZV9ET1VCTEU7Cit0ZXJtX3RvX3R5cGVpZChpOCkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoaTE2KSAtPiA/dFR5cGVfSTE2OwogdGVybV90b190eXBlaWQoaTMyKSAtPiA/dFR5cGVfSTMyOwogdGVybV90b190eXBlaWQoaTY0KSAtPiA/dFR5cGVfSTY0OwpAQCAtODYsNyArOTAsOCBAQAogCiAlJSBTdHJ1Y3R1cmUgaXMgbGlrZToKICUlICAgIFt7RmlkLCBUeXBlfSwgLi4uXQotcmVhZChJUHJvdG8sIHtzdHJ1Y3QsIFN0cnVjdHVyZX0sIFRhZykKKy1zcGVjIHJlYWQoI3Byb3RvY29se30sIHtzdHJ1Y3QsIF9TdHJ1Y3REZWZ9LCBhdG9tKCkpIC0+IHsjcHJvdG9jb2x7fSwge29rLCB0dXBsZSgpfX0uCityZWFkKElQcm90bzAsIHtzdHJ1Y3QsIFN0cnVjdHVyZX0sIFRhZykKICAgd2hlbiBpc19saXN0KFN0cnVjdHVyZSksIGlzX2F0b20oVGFnKSAtPgogCiAgICAgJSBJZiB3ZSB3YW50IGEgdGFnZ2VkIHR1cGxlLCB3ZSBuZWVkIHRvIG9mZnNldCBhbGwgdGhlIHR1cGxlIGluZGljZXMKQEAgLTEwMywxNCArMTA4LDIzIEBACiAgICAgJSBGaWQgLT4ge1R5cGUsIEluZGV4fQogICAgIFNEaWN0ID0gZGljdDpmcm9tX2xpc3QoU1dpdGhJbmRpY2VzKSwKIAotICAgIG9rID0gcmVhZChJUHJvdG8sIHN0cnVjdF9iZWdpbiksCisgICAge0lQcm90bzEsIG9rfSA9IHJlYWQoSVByb3RvMCwgc3RydWN0X2JlZ2luKSwKICAgICBSVHVwbGUwID0gZXJsYW5nOm1ha2VfdHVwbGUobGVuZ3RoKFN0cnVjdHVyZSkgKyBPZmZzZXQsIHVuZGVmaW5lZCksCiAgICAgUlR1cGxlMSA9IGlmIFRhZyA9Lz0gdW5kZWZpbmVkIC0+IHNldGVsZW1lbnQoMSwgUlR1cGxlMCwgVGFnKTsKICAgICAgICAgICAgICAgICAgdHJ1ZSAgICAgICAgICAgICAgLT4gUlR1cGxlMAogICAgICAgICAgICAgICBlbmQsCiAKLSAgICBSVHVwbGUyID0gcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8sIFNEaWN0LCBSVHVwbGUxKSwKLSAgICB7b2ssIFJUdXBsZTJ9LgorICAgIHtJUHJvdG8yLCBSVHVwbGUyfSA9IHJlYWRfc3RydWN0X2xvb3AoSVByb3RvMSwgU0RpY3QsIFJUdXBsZTEpLAorICAgIHtJUHJvdG8yLCB7b2ssIFJUdXBsZTJ9fS4KKworCislJSBOT1RFOiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHRocmlmdF9wcm90b2NvbF9iZWhhdmlvdXI6cmVhZAorLXNwZWMgcmVhZAorICAgICAgICAoI3Byb3RvY29se30sIHtzdHJ1Y3QsIF9JbmZvfSkgLT4gICAgeyNwcm90b2NvbHt9LCB7b2ssIHR1cGxlKCl9ICAgICAgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKCNwcm90b2NvbHt9LCB0cHJvdF9jb250X3RhZygpKSAtPiAgIHsjcHJvdG9jb2x7fSwge29rLCBhbnkoKX0gICAgICAgIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgICgjcHJvdG9jb2x7fSwgdHByb3RfZW1wdHlfdGFnKCkpIC0+ICB7I3Byb3RvY29se30sICBvayAgICAgICAgICAgICAgICB8IHtlcnJvciwgX1JlYXNvbn19OworICAgICAgICAoI3Byb3RvY29se30sIHRwcm90X2hlYWRlcl90YWcoKSkgLT4geyNwcm90b2NvbHt9LCB0cHJvdF9oZWFkZXJfdmFsKCkgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKCNwcm90b2NvbHt9LCB0cHJvdF9kYXRhX3RhZygpKSAtPiAgIHsjcHJvdG9jb2x7fSwge29rLCBhbnkoKX0gICAgICAgIHwge2Vycm9yLCBfUmVhc29ufX0uCiAKIHJlYWQoSVByb3RvLCB7c3RydWN0LCB7TW9kdWxlLCBTdHJ1Y3R1cmVOYW1lfX0pIHdoZW4gaXNfYXRvbShNb2R1bGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hdG9tKFN0cnVjdHVyZU5hbWUpIC0+CkBAIC0xMTksMTM3ICsxMzMsMTY4IEBACiByZWFkKElQcm90bywgUz17c3RydWN0LCBTdHJ1Y3R1cmV9KSB3aGVuIGlzX2xpc3QoU3RydWN0dXJlKSAtPgogICAgIHJlYWQoSVByb3RvLCBTLCB1bmRlZmluZWQpOwogCi1yZWFkKElQcm90bywge2xpc3QsIFR5cGV9KSAtPgotICAgICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRVR5cGUsIHNpemUgPSBTaXplfSA9Ci0gICAgICAgIHJlYWQoSVByb3RvLCBsaXN0X2JlZ2luKSwKLSAgICBMaXN0ID0gW1Jlc3VsdCB8fCB7b2ssIFJlc3VsdH0gPC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWQoSVByb3RvLCBUeXBlKSB8fCBfWCA8LSBsaXN0czpkdXBsaWNhdGUoU2l6ZSwgMCldXSwKLSAgICBvayA9IHJlYWQoSVByb3RvLCBsaXN0X2VuZCksCi0gICAge29rLCBMaXN0fTsKK3JlYWQoSVByb3RvMCwge2xpc3QsIFR5cGV9KSAtPgorICAgIHtJUHJvdG8xLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEVUeXBlLCBzaXplID0gU2l6ZX19ID0KKyAgICAgICAgcmVhZChJUHJvdG8wLCBsaXN0X2JlZ2luKSwKKyAgICB7RVR5cGUsIEVUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChUeXBlKSwgRVR5cGV9LAorICAgIHtMaXN0LCBJUHJvdG8yfSA9IGxpc3RzOm1hcGZvbGRsKGZ1bihfLCBQcm90b1MwKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzEsIHtvaywgSXRlbX19ID0gcmVhZChQcm90b1MwLCBUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJdGVtLCBQcm90b1MxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvdG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RzOmR1cGxpY2F0ZShTaXplLCAwKSksCisgICAge0lQcm90bzMsIG9rfSA9IHJlYWQoSVByb3RvMiwgbGlzdF9lbmQpLAorICAgIHtJUHJvdG8zLCB7b2ssIExpc3R9fTsKIAotcmVhZChJUHJvdG8sIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9KSAtPgotICAgICNwcm90b2NvbF9tYXBfYmVnaW57c2l6ZSA9IFNpemV9ID0KLSAgICAgICAgcmVhZChJUHJvdG8sIG1hcF9iZWdpbiksCityZWFkKElQcm90bzAsIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9KSAtPgorICAgIHtJUHJvdG8xLCAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplLCBrdHlwZSA9IEtUeXBlLCB2dHlwZSA9IFZUeXBlfX0gPQorICAgICAgICByZWFkKElQcm90bzAsIG1hcF9iZWdpbiksCisgICAgXyA9IGNhc2UgU2l6ZSBvZgorICAgICAgMCAtPiAwOworICAgICAgXyAtPgorICAgICAgICB7S1R5cGUsIEtUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChLZXlUeXBlKSwgS1R5cGV9LAorICAgICAgICB7VlR5cGUsIFZUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChWYWxUeXBlKSwgVlR5cGV9CisgICAgZW5kLAorICAgIHtMaXN0LCBJUHJvdG8yfSA9IGxpc3RzOm1hcGZvbGRsKGZ1bihfLCBQcm90b1MwKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzEsIHtvaywgS2V5fX0gPSByZWFkKFByb3RvUzAsIEtleVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzIsIHtvaywgVmFsfX0gPSByZWFkKFByb3RvUzEsIFZhbFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tLZXksIFZhbH0sIFByb3RvUzJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm90bzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdHM6ZHVwbGljYXRlKFNpemUsIDApKSwKKyAgICB7SVByb3RvMywgb2t9ID0gcmVhZChJUHJvdG8yLCBtYXBfZW5kKSwKKyAgICB7SVByb3RvMywge29rLCBkaWN0OmZyb21fbGlzdChMaXN0KX19OwogCi0gICAgTGlzdCA9IFt7S2V5LCBWYWx9IHx8IHt7b2ssIEtleX0sIHtvaywgVmFsfX0gPC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7cmVhZChJUHJvdG8sIEtleVR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkKElQcm90bywgVmFsVHlwZSl9IHx8IF9YIDwtIGxpc3RzOmR1cGxpY2F0ZShTaXplLCAwKV1dLAotICAgIG9rID0gcmVhZChJUHJvdG8sIG1hcF9lbmQpLAotICAgIHtvaywgZGljdDpmcm9tX2xpc3QoTGlzdCl9OworcmVhZChJUHJvdG8wLCB7c2V0LCBUeXBlfSkgLT4KKyAgICB7SVByb3RvMSwgI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IEVUeXBlLCBzaXplID0gU2l6ZX19ID0KKyAgICAgICAgcmVhZChJUHJvdG8wLCBzZXRfYmVnaW4pLAorICAgIHtFVHlwZSwgRVR5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKFR5cGUpLCBFVHlwZX0sCisgICAge0xpc3QsIElQcm90bzJ9ID0gbGlzdHM6bWFwZm9sZGwoZnVuKF8sIFByb3RvUzApIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMSwge29rLCBJdGVtfX0gPSByZWFkKFByb3RvUzAsIFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0l0ZW0sIFByb3RvUzF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm90bzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdHM6ZHVwbGljYXRlKFNpemUsIDApKSwKKyAgICB7SVByb3RvMywgb2t9ID0gcmVhZChJUHJvdG8yLCBzZXRfZW5kKSwKKyAgICB7SVByb3RvMywge29rLCBzZXRzOmZyb21fbGlzdChMaXN0KX19OwogCi1yZWFkKElQcm90bywge3NldCwgVHlwZX0pIC0+Ci0gICAgI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IF9FVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSA9Ci0gICAgICAgIHJlYWQoSVByb3RvLCBzZXRfYmVnaW4pLAotICAgIExpc3QgPSBbUmVzdWx0IHx8IHtvaywgUmVzdWx0fSA8LQotICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZChJUHJvdG8sIFR5cGUpIHx8IF9YIDwtIGxpc3RzOmR1cGxpY2F0ZShTaXplLCAwKV1dLAotICAgIG9rID0gcmVhZChJUHJvdG8sIHNldF9lbmQpLAotICAgIHtvaywgc2V0czpmcm9tX2xpc3QoTGlzdCl9OworcmVhZChQcm90b2NvbCwgUHJvdG9jb2xUeXBlKSAtPgorICAgIHJlYWRfc3BlY2lmaWMoUHJvdG9jb2wsIFByb3RvY29sVHlwZSkuCiAKLXJlYWQoI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKLSAgICAgICAgICAgICAgIGRhdGEgPSBNb2R1bGVEYXRhfSwgUHJvdG9jb2xUeXBlKSAtPgotICAgIE1vZHVsZTpyZWFkKE1vZHVsZURhdGEsIFByb3RvY29sVHlwZSkuCislJSBOT1RFOiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHRocmlmdF9wcm90b2NvbF9iZWhhdmlvdXI6cmVhZAorLXNwZWMgcmVhZF9zcGVjaWZpYworICAgICAgICAoI3Byb3RvY29se30sIHRwcm90X2VtcHR5X3RhZygpKSAtPiAgeyNwcm90b2NvbHt9LCAgb2sgICAgICAgICAgICAgICAgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKCNwcm90b2NvbHt9LCB0cHJvdF9oZWFkZXJfdGFnKCkpIC0+IHsjcHJvdG9jb2x7fSwgdHByb3RfaGVhZGVyX3ZhbCgpIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgICgjcHJvdG9jb2x7fSwgdHByb3RfZGF0YV90YWcoKSkgLT4gICB7I3Byb3RvY29se30sIHtvaywgYW55KCl9ICAgICAgICB8IHtlcnJvciwgX1JlYXNvbn19LgorcmVhZF9zcGVjaWZpYyhQcm90byA9ICNwcm90b2NvbHttb2R1bGUgPSBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBNb2R1bGVEYXRhfSwgUHJvdG9jb2xUeXBlKSAtPgorICAgIHtOZXdEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWQoTW9kdWxlRGF0YSwgUHJvdG9jb2xUeXBlKSwKKyAgICB7UHJvdG8jcHJvdG9jb2x7ZGF0YSA9IE5ld0RhdGF9LCBSZXN1bHR9LgogCi1yZWFkX3N0cnVjdF9sb29wKElQcm90bywgU0RpY3QsIFJUdXBsZSkgLT4KLSAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IEZUeXBlLCBpZCA9IEZpZCwgbmFtZSA9IE5hbWV9ID0KLSAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvLCBmaWVsZF9iZWdpbiksCityZWFkX3N0cnVjdF9sb29wKElQcm90bzAsIFNEaWN0LCBSVHVwbGUpIC0+CisgICAge0lQcm90bzEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gRlR5cGUsIGlkID0gRmlkfX0gPQorICAgICAgICB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8wLCBmaWVsZF9iZWdpbiksCiAgICAgY2FzZSB7RlR5cGUsIEZpZH0gb2YKICAgICAgICAgez90VHlwZV9TVE9QLCBffSAtPgotICAgICAgICAgICAgUlR1cGxlOworICAgICAgICAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgc3RydWN0X2VuZCksCisgICAgICAgICAgICB7SVByb3RvMiwgUlR1cGxlfTsKICAgICAgICAgX0Vsc2UgLT4KICAgICAgICAgICAgIGNhc2UgZGljdDpmaW5kKEZpZCwgU0RpY3QpIG9mCiAgICAgICAgICAgICAgICAge29rLCB7VHlwZSwgSW5kZXh9fSAtPgogICAgICAgICAgICAgICAgICAgICBjYXNlIHRlcm1fdG9fdHlwZWlkKFR5cGUpIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICBGVHlwZSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVmFsfSA9IHJlYWQoSVByb3RvLCBUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8sIGZpZWxkX2VuZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lQcm90bzIsIHtvaywgVmFsfX0gPSByZWFkKElQcm90bzEsIFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJUHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8yLCBmaWVsZF9lbmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1JUdXBsZSA9IHNldGVsZW1lbnQoSW5kZXgsIFJUdXBsZSwgVmFsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bywgU0RpY3QsIE5ld1JUdXBsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8zLCBTRGljdCwgTmV3UlR1cGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGZpZWxkIH5wIHdpdGggd3JvbmcgdHlwZSAofnAgIT0gfnApfm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZpZCwgRlR5cGUsIEV4cGVjdGVkXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9maWVsZChGVHlwZSwgSVByb3RvLCBTRGljdCwgUlR1cGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzEsIFNEaWN0LCBSVHVwbGUpCiAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICBfRWxzZTIgLT4KLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJTa2lwcGluZyBmaWVsZCB+cCB3aXRoIHVua25vd24gZmlkfm4iLCBbRmlkXSksCi0gICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bywgU0RpY3QsIFJUdXBsZSkKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMSwgU0RpY3QsIFJUdXBsZSkKICAgICAgICAgICAgIGVuZAogICAgIGVuZC4KIAotc2tpcF9maWVsZChGVHlwZSwgSVByb3RvLCBTRGljdCwgUlR1cGxlKSAtPgotICAgIEZUeXBlQXRvbSA9IHRocmlmdF9wcm90b2NvbDp0eXBlaWRfdG9fYXRvbShGVHlwZSksCi0gICAgdGhyaWZ0X3Byb3RvY29sOnNraXAoSVByb3RvLCBGVHlwZUF0b20pLAotICAgIHJlYWQoSVByb3RvLCBmaWVsZF9lbmQpLAotICAgIHJlYWRfc3RydWN0X2xvb3AoSVByb3RvLCBTRGljdCwgUlR1cGxlKS4KK3NraXBfZmllbGQoRlR5cGUsIElQcm90bzAsIFNEaWN0LCBSVHVwbGUpIC0+CisgICAge0lQcm90bzEsIG9rfSA9IHNraXAoSVByb3RvMCwgdHlwZWlkX3RvX2F0b20oRlR5cGUpKSwKKyAgICB7SVByb3RvMiwgb2t9ID0gcmVhZChJUHJvdG8xLCBmaWVsZF9lbmQpLAorICAgIHJlYWRfc3RydWN0X2xvb3AoSVByb3RvMiwgU0RpY3QsIFJUdXBsZSkuCisKKy1zcGVjIHNraXAoI3Byb3RvY29se30sIGF0b20oKSkgLT4geyNwcm90b2NvbHt9LCBva30uCisKK3NraXAoUHJvdG8wLCBzdHJ1Y3QpIC0+CisgICAge1Byb3RvMSwgb2t9ID0gcmVhZChQcm90bzAsIHN0cnVjdF9iZWdpbiksCisgICAge1Byb3RvMiwgb2t9ID0gc2tpcF9zdHJ1Y3RfbG9vcChQcm90bzEpLAorICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBzdHJ1Y3RfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CisKK3NraXAoUHJvdG8wLCBtYXApIC0+CisgICAge1Byb3RvMSwgTWFwfSA9IHJlYWQoUHJvdG8wLCBtYXBfYmVnaW4pLAorICAgIHtQcm90bzIsIG9rfSA9IHNraXBfbWFwX2xvb3AoUHJvdG8xLCBNYXApLAorICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBtYXBfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CisKK3NraXAoUHJvdG8wLCBzZXQpIC0+CisgICAge1Byb3RvMSwgU2V0fSA9IHJlYWQoUHJvdG8wLCBzZXRfYmVnaW4pLAorICAgIHtQcm90bzIsIG9rfSA9IHNraXBfc2V0X2xvb3AoUHJvdG8xLCBTZXQpLAorICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBzZXRfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CisKK3NraXAoUHJvdG8wLCBsaXN0KSAtPgorICAgIHtQcm90bzEsIExpc3R9ID0gcmVhZChQcm90bzAsIGxpc3RfYmVnaW4pLAorICAgIHtQcm90bzIsIG9rfSA9IHNraXBfbGlzdF9sb29wKFByb3RvMSwgTGlzdCksCisgICAge1Byb3RvMywgb2t9ID0gcmVhZChQcm90bzIsIGxpc3RfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CisKK3NraXAoUHJvdG8wLCBUeXBlKSB3aGVuIGlzX2F0b20oVHlwZSkgLT4KKyAgICB7UHJvdG8xLCBfSWdub3JlfSA9IHJlYWQoUHJvdG8wLCBUeXBlKSwKKyAgICB7UHJvdG8xLCBva30uCiAKIAotc2tpcChQcm90bywgc3RydWN0KSAtPgotICAgIG9rID0gcmVhZChQcm90bywgc3RydWN0X2JlZ2luKSwKLSAgICBvayA9IHNraXBfc3RydWN0X2xvb3AoUHJvdG8pLAotICAgIG9rID0gcmVhZChQcm90bywgc3RydWN0X2VuZCk7Ci0KLXNraXAoUHJvdG8sIG1hcCkgLT4KLSAgICBNYXAgPSByZWFkKFByb3RvLCBtYXBfYmVnaW4pLAotICAgIG9rID0gc2tpcF9tYXBfbG9vcChQcm90bywgTWFwKSwKLSAgICBvayA9IHJlYWQoUHJvdG8sIG1hcF9lbmQpOwotCi1za2lwKFByb3RvLCBzZXQpIC0+Ci0gICAgU2V0ID0gcmVhZChQcm90bywgc2V0X2JlZ2luKSwKLSAgICBvayA9IHNraXBfc2V0X2xvb3AoUHJvdG8sIFNldCksCi0gICAgb2sgPSByZWFkKFByb3RvLCBzZXRfZW5kKTsKLQotc2tpcChQcm90bywgbGlzdCkgLT4KLSAgICBMaXN0ID0gcmVhZChQcm90bywgbGlzdF9iZWdpbiksCi0gICAgb2sgPSBza2lwX2xpc3RfbG9vcChQcm90bywgTGlzdCksCi0gICAgb2sgPSByZWFkKFByb3RvLCBsaXN0X2VuZCk7Ci0KLXNraXAoUHJvdG8sIFR5cGUpIHdoZW4gaXNfYXRvbShUeXBlKSAtPgotICAgIF9JZ25vcmUgPSByZWFkKFByb3RvLCBUeXBlKSwKLSAgICBvay4KLQotCi1za2lwX3N0cnVjdF9sb29wKFByb3RvKSAtPgotICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZX0gPSByZWFkKFByb3RvLCBmaWVsZF9iZWdpbiksCitza2lwX3N0cnVjdF9sb29wKFByb3RvMCkgLT4KKyAgICB7UHJvdG8xLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IFR5cGV9fSA9IHJlYWQoUHJvdG8wLCBmaWVsZF9iZWdpbiksCiAgICAgY2FzZSBUeXBlIG9mCiAgICAgICAgID90VHlwZV9TVE9QIC0+Ci0gICAgICAgICAgICBvazsKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfTsKICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgIHNraXAoUHJvdG8sIFR5cGUpLAotICAgICAgICAgICAgb2sgPSByZWFkKFByb3RvLCBmaWVsZF9lbmQpLAotICAgICAgICAgICAgc2tpcF9zdHJ1Y3RfbG9vcChQcm90bykKKyAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCB0eXBlaWRfdG9fYXRvbShUeXBlKSksCisgICAgICAgICAgICB7UHJvdG8zLCBva30gPSByZWFkKFByb3RvMiwgZmllbGRfZW5kKSwKKyAgICAgICAgICAgIHNraXBfc3RydWN0X2xvb3AoUHJvdG8zKQogICAgIGVuZC4KIAotc2tpcF9tYXBfbG9vcChQcm90bywgTWFwID0gI3Byb3RvY29sX21hcF9iZWdpbntrdHlwZSA9IEt0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHlwZSA9IFZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+Citza2lwX21hcF9sb29wKFByb3RvMCwgTWFwID0gI3Byb3RvY29sX21hcF9iZWdpbntrdHlwZSA9IEt0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICBza2lwKFByb3RvLCBLdHlwZSksCi0gICAgICAgICAgICBza2lwKFByb3RvLCBWdHlwZSksCi0gICAgICAgICAgICBza2lwX21hcF9sb29wKFByb3RvLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEt0eXBlKSksCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVnR5cGUpKSwKKyAgICAgICAgICAgIHNraXBfbWFwX2xvb3AoUHJvdG8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwotICAgICAgICAwIC0+IG9rCisgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CiAgICAgZW5kLgogCi1za2lwX3NldF9sb29wKFByb3RvLCBNYXAgPSAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gRXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KK3NraXBfc2V0X2xvb3AoUHJvdG8wLCBNYXAgPSAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gRXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAgc2tpcChQcm90bywgRXR5cGUpLAotICAgICAgICAgICAgc2tpcF9zZXRfbG9vcChQcm90bywKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAorICAgICAgICAgICAgc2tpcF9zZXRfbG9vcChQcm90bzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9zZXRfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7Ci0gICAgICAgIDAgLT4gb2sKKyAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KICAgICBlbmQuCiAKLXNraXBfbGlzdF9sb29wKFByb3RvLCBNYXAgPSAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KK3NraXBfbGlzdF9sb29wKFByb3RvMCwgTWFwID0gI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHNraXAoUHJvdG8sIEV0eXBlKSwKLSAgICAgICAgICAgIHNraXBfbGlzdF9sb29wKFByb3RvLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCisgICAgICAgICAgICBza2lwX2xpc3RfbG9vcChQcm90bzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfbGlzdF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKLSAgICAgICAgMCAtPiBvaworICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQogICAgIGVuZC4KIAogCkBAIC0yNjcsOTAgKzMxMiwxMDEgQEAKICUlICAgICAgIHwgbGlzdCgpICAgLS0gZm9yIGxpc3QKICUlICAgICAgIHwgZGljdGlvbmFyeSgpICAgLS0gZm9yIG1hcAogJSUgICAgICAgfCBzZXQoKSAgICAtLSBmb3Igc2V0Ci0lJSAgICAgICB8IHRlcm0oKSAgIC0tIGZvciBiYXNlIHR5cGVzCislJSAgICAgICB8IGFueSgpICAgIC0tIGZvciBiYXNlIHR5cGVzCiAlJQogJSUgRGVzY3JpcHRpb246CiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13cml0ZShQcm90bywge3tzdHJ1Y3QsIFN0cnVjdERlZn0sIERhdGF9KQorLXNwZWMgd3JpdGUoI3Byb3RvY29se30sIGFueSgpKSAtPiB7I3Byb3RvY29se30sIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCisKK3dyaXRlKFByb3RvMCwge3tzdHJ1Y3QsIFN0cnVjdERlZn0sIERhdGF9KQogICB3aGVuIGlzX2xpc3QoU3RydWN0RGVmKSwgaXNfdHVwbGUoRGF0YSksIGxlbmd0aChTdHJ1Y3REZWYpID09IHNpemUoRGF0YSkgLSAxIC0+CiAKICAgICBbU3RydWN0TmFtZSB8IEVsZW1zXSA9IHR1cGxlX3RvX2xpc3QoRGF0YSksCi0gICAgb2sgPSB3cml0ZShQcm90bywgI3Byb3RvY29sX3N0cnVjdF9iZWdpbntuYW1lID0gU3RydWN0TmFtZX0pLAotICAgIG9rID0gc3RydWN0X3dyaXRlX2xvb3AoUHJvdG8sIFN0cnVjdERlZiwgRWxlbXMpLAotICAgIG9rID0gd3JpdGUoUHJvdG8sIHN0cnVjdF9lbmQpLAotICAgIG9rOworICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbntuYW1lID0gU3RydWN0TmFtZX0pLAorICAgIHtQcm90bzIsIG9rfSA9IHN0cnVjdF93cml0ZV9sb29wKFByb3RvMSwgU3RydWN0RGVmLCBFbGVtcyksCisgICAge1Byb3RvMywgb2t9ID0gd3JpdGUoUHJvdG8yLCBzdHJ1Y3RfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CiAKIHdyaXRlKFByb3RvLCB7e3N0cnVjdCwge01vZHVsZSwgU3RydWN0dXJlTmFtZX19LCBEYXRhfSkKICAgd2hlbiBpc19hdG9tKE1vZHVsZSksCiAgICAgICAgaXNfYXRvbShTdHJ1Y3R1cmVOYW1lKSwKICAgICAgICBlbGVtZW50KDEsIERhdGEpID06PSBTdHJ1Y3R1cmVOYW1lIC0+Ci0gICAgU3RydWN0VHlwZSA9IE1vZHVsZTpzdHJ1Y3RfaW5mbyhTdHJ1Y3R1cmVOYW1lKSwKICAgICB3cml0ZShQcm90bywge01vZHVsZTpzdHJ1Y3RfaW5mbyhTdHJ1Y3R1cmVOYW1lKSwgRGF0YX0pOwogCi13cml0ZShQcm90bywge3tsaXN0LCBUeXBlfSwgRGF0YX0pCit3cml0ZShfLCB7e3N0cnVjdCwge01vZHVsZSwgU3RydWN0dXJlTmFtZX19LCBEYXRhfSkKKyAgd2hlbiBpc19hdG9tKE1vZHVsZSksCisgICAgICAgaXNfYXRvbShTdHJ1Y3R1cmVOYW1lKSAtPgorICAgIGVybGFuZzplcnJvcihzdHJ1Y3RfdW5tYXRjaGVkLCB7e3Byb3ZpZGVkLCBlbGVtZW50KDEsIERhdGEpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2V4cGVjdGVkLCBTdHJ1Y3R1cmVOYW1lfX0pOworCit3cml0ZShQcm90bzAsIHt7bGlzdCwgVHlwZX0sIERhdGF9KQogICB3aGVuIGlzX2xpc3QoRGF0YSkgLT4KLSAgICBvayA9IHdyaXRlKFByb3RvLAorICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwKICAgICAgICAgICAgICAgICNwcm90b2NvbF9saXN0X2JlZ2luewogICAgICAgICAgICAgICAgICBldHlwZSA9IHRlcm1fdG9fdHlwZWlkKFR5cGUpLAogICAgICAgICAgICAgICAgICBzaXplID0gbGVuZ3RoKERhdGEpCiAgICAgICAgICAgICAgICAgfSksCi0gICAgbGlzdHM6Zm9yZWFjaChmdW4oRWxlbSkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB3cml0ZShQcm90bywge1R5cGUsIEVsZW19KQotICAgICAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICAgICAgRGF0YSksCi0gICAgb2sgPSB3cml0ZShQcm90bywgbGlzdF9lbmQpLAotICAgIG9rOworICAgIFByb3RvMiA9IGxpc3RzOmZvbGRsKGZ1bihFbGVtLCBQcm90b0luKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvT3V0LCBva30gPSB3cml0ZShQcm90b0luLCB7VHlwZSwgRWxlbX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEpLAorICAgIHtQcm90bzMsIG9rfSA9IHdyaXRlKFByb3RvMiwgbGlzdF9lbmQpLAorICAgIHtQcm90bzMsIG9rfTsKIAotd3JpdGUoUHJvdG8sIHt7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSwgRGF0YX0pIC0+Ci0gICAgb2sgPSB3cml0ZShQcm90bywKLSAgICAgICAgICAgICAgICNwcm90b2NvbF9tYXBfYmVnaW57Ci0gICAgICAgICAgICAgICAgIGt0eXBlID0gdGVybV90b190eXBlaWQoS2V5VHlwZSksCi0gICAgICAgICAgICAgICAgIHZ0eXBlID0gdGVybV90b190eXBlaWQoVmFsVHlwZSksCi0gICAgICAgICAgICAgICAgIHNpemUgID0gZGljdDpzaXplKERhdGEpCi0gICAgICAgICAgICAgICAgfSksCi0gICAgZGljdDpmb2xkKGZ1bihLZXlEYXRhLCBWYWxEYXRhLCBfQWNjKSAtPgotICAgICAgICAgICAgICAgICAgICAgIG9rID0gd3JpdGUoUHJvdG8sIHtLZXlUeXBlLCBLZXlEYXRhfSksCi0gICAgICAgICAgICAgICAgICAgICAgb2sgPSB3cml0ZShQcm90bywge1ZhbFR5cGUsIFZhbERhdGF9KQotICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgIF9BY2NPID0gb2ssCi0gICAgICAgICAgICAgIERhdGEpLAotICAgIG9rID0gd3JpdGUoUHJvdG8sIG1hcF9lbmQpLAotICAgIG9rOword3JpdGUoUHJvdG8wLCB7e21hcCwgS2V5VHlwZSwgVmFsVHlwZX0sIERhdGF9KSAtPgorICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgICAgICAgICAgICAgICAgICAgICAga3R5cGUgPSB0ZXJtX3RvX3R5cGVpZChLZXlUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gdGVybV90b190eXBlaWQoVmFsVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICA9IGRpY3Q6c2l6ZShEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICBQcm90bzIgPSBkaWN0OmZvbGQoZnVuKEtleURhdGEsIFZhbERhdGEsIFByb3RvUzApIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzEsIG9rfSA9IHdyaXRlKFByb3RvUzAsIHtLZXlUeXBlLCBLZXlEYXRhfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzIsIG9rfSA9IHdyaXRlKFByb3RvUzEsIHtWYWxUeXBlLCBWYWxEYXRhfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9TMgorICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgIFByb3RvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YSksCisgICAge1Byb3RvMywgb2t9ID0gd3JpdGUoUHJvdG8yLCBtYXBfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CiAKLXdyaXRlKFByb3RvLCB7e3NldCwgVHlwZX0sIERhdGF9KSAtPgord3JpdGUoUHJvdG8wLCB7e3NldCwgVHlwZX0sIERhdGF9KSAtPgogICAgIHRydWUgPSBzZXRzOmlzX3NldChEYXRhKSwKLSAgICBvayA9IHdyaXRlKFByb3RvLAotICAgICAgICAgICAgICAgI3Byb3RvY29sX3NldF9iZWdpbnsKLSAgICAgICAgICAgICAgICAgZXR5cGUgPSB0ZXJtX3RvX3R5cGVpZChUeXBlKSwKLSAgICAgICAgICAgICAgICAgc2l6ZSAgPSBzZXRzOnNpemUoRGF0YSkKLSAgICAgICAgICAgICAgICB9KSwKLSAgICBzZXRzOmZvbGQoZnVuKEVsZW0sIF9BY2MpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgb2sgPSB3cml0ZShQcm90bywge1R5cGUsIEVsZW19KQotICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgIF9BY2MwID0gb2ssCi0gICAgICAgICAgICAgIERhdGEpLAotICAgIG9rID0gd3JpdGUoUHJvdG8sIHNldF9lbmQpLAotICAgIG9rOworICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfc2V0X2JlZ2lueworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXR5cGUgPSB0ZXJtX3RvX3R5cGVpZChUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgID0gc2V0czpzaXplKERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgIFByb3RvMiA9IHNldHM6Zm9sZChmdW4oRWxlbSwgUHJvdG9JbikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9PdXQsIG9rfSA9IHdyaXRlKFByb3RvSW4sIHtUeXBlLCBFbGVtfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXQKKyAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICBQcm90bzEsCisgICAgICAgICAgICAgICAgICAgICAgIERhdGEpLAorICAgIHtQcm90bzMsIG9rfSA9IHdyaXRlKFByb3RvMiwgc2V0X2VuZCksCisgICAge1Byb3RvMywgb2t9OwogCi13cml0ZSgjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAotICAgICAgICAgICAgICAgIGRhdGEgPSBNb2R1bGVEYXRhfSwgRGF0YSkgLT4KLSAgICBNb2R1bGU6d3JpdGUoTW9kdWxlRGF0YSwgRGF0YSkuCit3cml0ZShQcm90byA9ICNwcm90b2NvbHttb2R1bGUgPSBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gTW9kdWxlRGF0YX0sIERhdGEpIC0+CisgICAge05ld0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6d3JpdGUoTW9kdWxlRGF0YSwgRGF0YSksCisgICAge1Byb3RvI3Byb3RvY29se2RhdGEgPSBOZXdEYXRhfSwgUmVzdWx0fS4KIAotc3RydWN0X3dyaXRlX2xvb3AoUHJvdG8sIFt7RmlkLCBUeXBlfSB8IFJlc3RTdHJ1Y3REZWZdLCBbRGF0YSB8IFJlc3REYXRhXSkgLT4KLSAgICBjYXNlIERhdGEgb2YKLSAgICAgICAgdW5kZWZpbmVkIC0+Ci0gICAgICAgICAgICAlIG51bGwgZmllbGRzIGFyZSBza2lwcGVkIGluIHJlc3BvbnNlCi0gICAgICAgICAgICBza2lwOwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICBvayA9IHdyaXRlKFByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRlcm1fdG9fdHlwZWlkKFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gRmlkCi0gICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgIG9rID0gd3JpdGUoUHJvdG8sIHtUeXBlLCBEYXRhfSksCi0gICAgICAgICAgICBvayA9IHdyaXRlKFByb3RvLCBmaWVsZF9lbmQpCi0gICAgZW5kLAotICAgIHN0cnVjdF93cml0ZV9sb29wKFByb3RvLCBSZXN0U3RydWN0RGVmLCBSZXN0RGF0YSk7CitzdHJ1Y3Rfd3JpdGVfbG9vcChQcm90bzAsIFt7RmlkLCBUeXBlfSB8IFJlc3RTdHJ1Y3REZWZdLCBbRGF0YSB8IFJlc3REYXRhXSkgLT4KKyAgICBOZXdQcm90byA9IGNhc2UgRGF0YSBvZgorICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCAtPgorICAgICAgICAgICAgICAgICAgICAgICBQcm90bzA7ICUgbnVsbCBmaWVsZHMgYXJlIHNraXBwZWQgaW4gcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICBfIC0+CisgICAgICAgICAgICAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGVybV90b190eXBlaWQoVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IEZpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gd3JpdGUoUHJvdG8xLCB7VHlwZSwgRGF0YX0pLAorICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG8zLCBva30gPSB3cml0ZShQcm90bzIsIGZpZWxkX2VuZCksCisgICAgICAgICAgICAgICAgICAgICAgIFByb3RvMworICAgICAgICAgICAgICAgZW5kLAorICAgIHN0cnVjdF93cml0ZV9sb29wKE5ld1Byb3RvLCBSZXN0U3RydWN0RGVmLCBSZXN0RGF0YSk7CiBzdHJ1Y3Rfd3JpdGVfbG9vcChQcm90bywgW10sIFtdKSAtPgotICAgIG9rID0gd3JpdGUoUHJvdG8sIGZpZWxkX3N0b3ApLAotICAgIG9rLgorICAgIHdyaXRlKFByb3RvLCBmaWVsZF9zdG9wKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhmZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCkBAIC0wLDAgKzEsMjU4IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCkuCisKKy1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCisKKyUlIEFQSQorLWV4cG9ydChbIGNhbGwvMywKKyAgICAgICAgICBnZXRfc3RhdHMvMSwKKyAgICAgICAgICBnZXRfYW5kX3Jlc2V0X3N0YXRzLzEgXSkuCisKKy1leHBvcnQoWyBzdGFydF9saW5rLzYgXSkuCisKKyUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCistZXhwb3J0KFsgaW5pdC8xLAorICAgICAgICAgIGhhbmRsZV9jYWxsLzMsCisgICAgICAgICAgaGFuZGxlX2Nhc3QvMiwKKyAgICAgICAgICBoYW5kbGVfaW5mby8yLAorICAgICAgICAgIHRlcm1pbmF0ZS8yLAorICAgICAgICAgIGNvZGVfY2hhbmdlLzMgXSkuCisKKy1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwKKyAgICAgICAgICAgICAgICAgIGhvc3QsCisgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YywKKyAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzLAorICAgICAgICAgICAgICAgICAgcmVjb25uX21pbiwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXgsCisgICAgICAgICAgICAgICAgICByZWNvbm5fdGltZSA9IDAsCisgICAgICAgICAgICAgICAgICBvcF9jbnRfZGljdCwKKyAgICAgICAgICAgICAgICAgIG9wX3RpbWVfZGljdCB9ICkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIEFQSQorJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IHN0YXJ0X2xpbmsoKSAtPiB7b2ssUGlkfSB8IGlnbm9yZSB8IHtlcnJvcixFcnJvcn0KKyUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHNlcnZlcgorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhcnRfbGluayggSG9zdCwgUG9ydCwKKyAgICAgICAgICAgIFRocmlmdFN2YywgVGhyaWZ0T3B0cywKKyAgICAgICAgICAgIFJlY29ubk1pbiwgUmVjb25uTWF4ICkgLT4KKyAgZ2VuX3NlcnZlcjpzdGFydF9saW5rKCA/TU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsgSG9zdCwgUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFN2YywgVGhyaWZ0T3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29ubk1pbiwgUmVjb25uTWF4IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW10gKS4KKworY2FsbCggUGlkLCBPcCwgQXJncyApIC0+CisgIGdlbl9zZXJ2ZXI6Y2FsbCggUGlkLCB7IGNhbGwsIE9wLCBBcmdzIH0gKS4KKworZ2V0X3N0YXRzKCBQaWQgKSAtPgorICBnZW5fc2VydmVyOmNhbGwoIFBpZCwgZ2V0X3N0YXRzICkuCisKK2dldF9hbmRfcmVzZXRfc3RhdHMoIFBpZCApIC0+CisgIGdlbl9zZXJ2ZXI6Y2FsbCggUGlkLCBnZXRfYW5kX3Jlc2V0X3N0YXRzICkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiBpbml0KEFyZ3MpIC0+IHtvaywgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb259CislJSBEZXNjcmlwdGlvbjogU3RhcnQgdGhlIHNlcnZlci4KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luaXQoIFsgSG9zdCwgUG9ydCwgVFN2YywgVE9wdHMsIFJlY29ubk1pbiwgUmVjb25uTWF4IF0gKSAtPgorICBwcm9jZXNzX2ZsYWcoIHRyYXBfZXhpdCwgdHJ1ZSApLAorCisgIFN0YXRlID0gI3N0YXRleyBob3N0ICAgICAgICAgPSBIb3N0LAorICAgICAgICAgICAgICAgICAgcG9ydCAgICAgICAgID0gUG9ydCwKKyAgICAgICAgICAgICAgICAgIHRocmlmdF9zdmMgICA9IFRTdmMsCisgICAgICAgICAgICAgICAgICB0aHJpZnRfb3B0cyAgPSBUT3B0cywKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9taW4gICA9IFJlY29ubk1pbiwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXggICA9IFJlY29ubk1heCwKKyAgICAgICAgICAgICAgICAgIG9wX2NudF9kaWN0ICA9IGRpY3Q6bmV3KCksCisgICAgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBkaWN0Om5ldygpIH0sCisKKyAgeyBvaywgdHJ5X2Nvbm5lY3QoIFN0YXRlICkgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfY2FsbCggeyBjYWxsLCBPcCwgXyB9LAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRleyBjbGllbnQgPSBuaWwgfSApIC0+CisgIHsgcmVwbHksIHsgZXJyb3IsIG5vY29ubiB9LCBpbmNyX3N0YXRzKCBPcCwgImZhaWxmYXN0IiwgMSwgU3RhdGUgKSB9OworCitoYW5kbGVfY2FsbCggeyBjYWxsLCBPcCwgQXJncyB9LAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlPSNzdGF0ZXsgY2xpZW50ID0gQ2xpZW50IH0gKSAtPgorCisgIFRpbWVyID0gdGltZXJfZnVuKCksCisgIFJlc3VsdCA9ICggY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKCBDbGllbnQsIE9wLCBBcmdzKSApLAorICBUaW1lID0gVGltZXIoKSwKKworICBjYXNlIFJlc3VsdCBvZgorICAgIHsgQywgeyBvaywgUmVwbHkgfSB9IC0+CisgICAgICBTID0gaW5jcl9zdGF0cyggT3AsICJzdWNjZXNzIiwgVGltZSwgU3RhdGUjc3RhdGV7IGNsaWVudCA9IEMgfSApLAorICAgICAgeyByZXBseSwge29rLCBSZXBseSB9LCBTIH07CisgICAgeyBfLCB7IEUsIE1zZyB9IH0gd2hlbiBFID09IGVycm9yOyBFID09IGV4Y2VwdGlvbiAtPgorICAgICAgUyA9IGluY3Jfc3RhdHMoIE9wLCAiZXJyb3IiLCBUaW1lLCB0cnlfY29ubmVjdCggU3RhdGUgKSApLAorICAgICAgeyByZXBseSwgeyBFLCBNc2cgfSwgUyB9OworICAgIE90aGVyIC0+CisgICAgICBTID0gaW5jcl9zdGF0cyggT3AsICJlcnJvciIsIFRpbWUsIHRyeV9jb25uZWN0KCBTdGF0ZSApICksCisgICAgICB7IHJlcGx5LCBPdGhlciwgUyB9CisgIGVuZDsKKworaGFuZGxlX2NhbGwoIGdldF9zdGF0cywKKyAgICAgICAgICAgICBfRnJvbSwKKyAgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXt9ICkgLT4KKyAgeyByZXBseSwgc3RhdHMoIFN0YXRlICksIFN0YXRlIH07CisKK2hhbmRsZV9jYWxsKCBnZXRfYW5kX3Jlc2V0X3N0YXRzLAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRle30gKSAtPgorICB7IHJlcGx5LCBzdGF0cyggU3RhdGUgKSwgcmVzZXRfc3RhdHMoIFN0YXRlICkgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQorJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hhbmRsZV9jYXN0KCBfTXNnLCBTdGF0ZSApIC0+CisgIHsgbm9yZXBseSwgU3RhdGUgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQorJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfaW5mbyggdHJ5X2Nvbm5lY3QsIFN0YXRlICkgLT4KKyAgeyBub3JlcGx5LCB0cnlfY29ubmVjdCggU3RhdGUgKSB9OworCitoYW5kbGVfaW5mbyggX0luZm8sIFN0YXRlICkgLT4KKyAgeyBub3JlcGx5LCBTdGF0ZSB9LgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBGdW5jdGlvbjogdGVybWluYXRlKFJlYXNvbiwgU3RhdGUpIC0+IHZvaWQoKQorJSUgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgZ2VuX3NlcnZlciB3aGVuIGl0IGlzIGFib3V0IHRvCislJSB0ZXJtaW5hdGUuIEl0IHNob3VsZCBiZSB0aGUgb3Bwb3NpdGUgb2YgTW9kdWxlOmluaXQvMSBhbmQgZG8gYW55IG5lY2Vzc2FyeQorJSUgY2xlYW5pbmcgdXAuIFdoZW4gaXQgcmV0dXJucywgdGhlIGdlbl9zZXJ2ZXIgdGVybWluYXRlcyB3aXRoIFJlYXNvbi4KKyUlIFRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Rlcm1pbmF0ZSggX1JlYXNvbiwgI3N0YXRleyBjbGllbnQgPSBDbGllbnQgfSApIC0+CisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoIENsaWVudCApLAorICBvay4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuYzogY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IHtvaywgTmV3U3RhdGV9CislJSBEZXNjcmlwdGlvbjogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb2RlX2NoYW5nZSggX09sZFZzbiwgU3RhdGUsIF9FeHRyYSApIC0+CisgIHsgb2ssIFN0YXRlIH0uCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RyeV9jb25uZWN0KCBTdGF0ZSA9ICNzdGF0ZXsgY2xpZW50ICAgICAgPSBPbGRDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgICAgICAgID0gSG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAgICAgICAgPSBQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc3ZjICA9IFRTdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzID0gVE9wdHMgfSApIC0+CisKKyAgY2FzZSBPbGRDbGllbnQgb2YKKyAgICBuaWwgLT4gb2s7CisgICAgXyAgIC0+ICggY2F0Y2ggdGhyaWZ0X2NsaWVudDpjbG9zZSggT2xkQ2xpZW50ICkgKQorICBlbmQsCisKKyAgY2FzZSBjYXRjaCB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCBIb3N0LCBQb3J0LCBUU3ZjLCBUT3B0cyApIG9mCisgICAgeyBvaywgQ2xpZW50IH0gLT4KKyAgICAgIFN0YXRlI3N0YXRleyBjbGllbnQgPSBDbGllbnQsIHJlY29ubl90aW1lID0gMCB9OworICAgIHsgRSwgTXNnIH0gd2hlbiBFID09IGVycm9yOyBFID09IGV4Y2VwdGlvbiAtPgorICAgICAgUmVjb25uVGltZSA9IHJlY29ubl90aW1lKCBTdGF0ZSApLAorICAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX21zZyggIlt+d10gfncgY29ubmVjdCBmYWlsZWQgKH53KSwgdHJ5aW5nIGFnYWluIGluIH53IG1zfm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzZWxmKCksIFRTdmMsIE1zZywgUmVjb25uVGltZSBdICksCisgICAgICBlcmxhbmc6c2VuZF9hZnRlciggUmVjb25uVGltZSwgc2VsZigpLCB0cnlfY29ubmVjdCApLAorICAgICAgU3RhdGUjc3RhdGV7IGNsaWVudCA9IG5pbCwgcmVjb25uX3RpbWUgPSBSZWNvbm5UaW1lIH0KKyAgZW5kLgorCisKK3JlY29ubl90aW1lKCAjc3RhdGV7IHJlY29ubl9taW4gPSBSZWNvbm5NaW4sIHJlY29ubl90aW1lID0gMCB9ICkgLT4KKyAgUmVjb25uTWluOworcmVjb25uX3RpbWUoICNzdGF0ZXsgcmVjb25uX21heCA9IFJlY29ubk1heCwgcmVjb25uX3RpbWUgPSBSZWNvbm5NYXggfSApIC0+CisgIFJlY29ubk1heDsKK3JlY29ubl90aW1lKCAjc3RhdGV7IHJlY29ubl9tYXggPSBSZWNvbm5NYXgsIHJlY29ubl90aW1lID0gUiB9ICkgLT4KKyAgQmFja29mZiA9IDIgKiBSLAorICBjYXNlIEJhY2tvZmYgPiBSZWNvbm5NYXggb2YKKyAgICB0cnVlICAtPiBSZWNvbm5NYXg7CisgICAgZmFsc2UgLT4gQmFja29mZgorICBlbmQuCisKKy1pZmRlZih0aW1lX2NvcnJlY3Rpb24pLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICAgIGVybGFuZzpjb252ZXJ0X3RpbWVfdW5pdChUMiAtIFQxLCBuYXRpdmUsIG1pY3JvX3NlY29uZHMpCisgIGVuZC4KKy1lbHNlLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGZ1bigpIC0+CisgICAgVDIgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgICAgdGltZXI6bm93X2RpZmYoVDIsIFQxKQorICBlbmQuCistZW5kaWYuCisKK2luY3Jfc3RhdHMoIE9wLCBSZXN1bHQsIFRpbWUsCisgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXsgb3BfY250X2RpY3QgID0gT3BDbnREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3RpbWVfZGljdCA9IE9wVGltZURpY3QgfSApIC0+CisgIEtleSA9IGxpc3RzOmZsYXR0ZW4oIFsgYXRvbV90b19saXN0KCBPcCApLCBbICJfIiB8IFJlc3VsdCBdIF0gKSwKKyAgU3RhdGUjc3RhdGV7IG9wX2NudF9kaWN0ICA9IGRpY3Q6dXBkYXRlX2NvdW50ZXIoIEtleSwgMSwgT3BDbnREaWN0ICksCisgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBkaWN0OnVwZGF0ZV9jb3VudGVyKCBLZXksIFRpbWUsIE9wVGltZURpY3QgKSB9LgorCisKK3N0YXRzKCAjc3RhdGV7IHRocmlmdF9zdmMgICA9IFRTdmMsCisgICAgICAgICAgICAgICBvcF9jbnRfZGljdCAgPSBPcENudERpY3QsCisgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBPcFRpbWVEaWN0IH0gKSAtPgorICBTdmMgPSBhdG9tX3RvX2xpc3QoVFN2YyksCisKKyAgRiA9IGZ1biggS2V5LCBDb3VudCwgU3RhdHMgKSAtPgorICAgICAgICBOYW1lID0gbGlzdHM6ZmxhdHRlbiggWyBTdmMsIFsgIl8iIHwgS2V5IF0gXSApLAorICAgICAgICBNaWNyb3MgPSBkaWN0OmZldGNoKCBLZXksIE9wVGltZURpY3QgKSwKKyAgICAgICAgWyB7IE5hbWUsIENvdW50LCBNaWNyb3MgfSB8IFN0YXRzIF0KKyAgICAgIGVuZCwKKworICBkaWN0OmZvbGQoIEYsIFtdLCBPcENudERpY3QgKS4KKworcmVzZXRfc3RhdHMoIFN0YXRlID0gI3N0YXRle30gKSAtPgorICBTdGF0ZSNzdGF0ZXsgb3BfY250X2RpY3QgPSBkaWN0Om5ldygpLCBvcF90aW1lX2RpY3QgPSBkaWN0Om5ldygpIH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc2VydmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zZXJ2ZXIuZXJsCmluZGV4IDVkMDAxMmIuLjUwMTJlMTYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zZXJ2ZXIuZXJsCkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQogICAgIGVuZDsKIAotaGFuZGxlX2luZm8oe2luZXRfYXN5bmMsIExpc3RlblNvY2tldCwgUmVmLCBFcnJvcn0sIFN0YXRlKSAtPgoraGFuZGxlX2luZm8oe2luZXRfYXN5bmMsIF9MaXN0ZW5Tb2NrZXQsIF9SZWYsIEVycm9yfSwgU3RhdGUpIC0+CiAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX21zZygiRXJyb3IgaW4gYWNjZXB0b3I6IH5wfm4iLCBbRXJyb3JdKSwKICAgICB7c3RvcCwgRXJyb3IsIFN0YXRlfTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQpLAogICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZmZlcmVkVHJhbnNwb3J0fSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCksCiAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoQnVmZmVyZWRUcmFuc3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sLCBQcm90b2NvbH0KKyAgICAgICAgICAgICAgICAgICAgICAge29rLCBQcm90b2NvbH0KICAgICAgICAgICAgICAgIGVuZCwKIAogICAgIHNwYXduKHRocmlmdF9wcm9jZXNzb3IsIGluaXQsIFt7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn1dKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybAppbmRleCA2Nzk0ZTYzLi40ZTNjMDUyIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCkBAIC0yMSwxMiArMjEsMTkgQEAKIAogLWJlaGF2aW91cihnZW5fc2VydmVyKS4KIAotLWV4cG9ydChbc3RhcnQvMSwgc3RvcC8xXSkuCistaW5jbHVkZSAoInRocmlmdF9jb25zdGFudHMuaHJsIikuCiAKLS1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgdGVybWluYXRlLzIsIGNvZGVfY2hhbmdlLzMsCi0gICAgICAgICBoYW5kbGVfaW5mby8yXSkuCistaWZkZWYoVEVTVCkuCisgICAgLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisgICAgLWV4cG9ydF9yZWNvcmRzKFt0aHJpZnRfc29ja2V0X3NlcnZlcl0pLgorLWVsc2UuCisgICAgLWV4cG9ydChbc3RhcnQvMSwgc3RvcC8xXSkuCiAKLS1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorICAgIC1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgdGVybWluYXRlLzIsIGNvZGVfY2hhbmdlLzMsCisgICAgICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorCisgICAgLWV4cG9ydChbYWNjZXB0b3JfbG9vcC8xXSkuCistZW5kaWYuCiAKIC1yZWNvcmQodGhyaWZ0X3NvY2tldF9zZXJ2ZXIsCiAgICAgICAgIHtwb3J0LApAQCAtMzgsNyArNDUsMTAgQEAKICAgICAgICAgIGxpc3Rlbj1udWxsLAogICAgICAgICAgYWNjZXB0b3I9bnVsbCwKICAgICAgICAgIHNvY2tldF9vcHRzPVt7cmVjdl90aW1lb3V0LCA1MDB9XSwKLSAgICAgICAgIGZyYW1lZD1mYWxzZQorICAgICAgICAgcHJvdG9jb2w9YmluYXJ5LAorICAgICAgICAgZnJhbWVkPWZhbHNlLAorICAgICAgICAgc3NsdHJhbnNwb3J0PWZhbHNlLAorICAgICAgICAgc3Nsb3B0aW9ucz1bXQogICAgICAgICB9KS4KIAogc3RhcnQoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye30pIC0+CkBAIC05MSwxMCArMTAxLDQ2IEBACiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntpcD1QYXJzZWRJcH0pOwogcGFyc2Vfb3B0aW9ucyhbe3NvY2tldF9vcHRzLCBMfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KEwpLCBsZW5ndGgoTCkgPiAwIC0+CiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzb2NrZXRfb3B0cz1MfSk7Ci1wYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIC0+CisKK3BhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBbXX0gfCBfUmVzdF0sIF9TdGF0ZSkgLT4KKyAgICB0aHJvdygiQXQgbGVhc3QgYW4gZXJyb3IgaGFuZGxlciBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3R9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpIC0+CisgICAgU2VydmljZUhhbmRsZXJNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlSGFuZGxlcn0sIEFjYykgd2hlbiBpc19saXN0KFNlcnZpY2VOYW1lKSwgaXNfYXRvbShTZXJ2aWNlSGFuZGxlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpzdG9yZShTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXIsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBoYW5kbGVyIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tcImVycm9yX2hhbmRsZXJcIiwgTW9kdWxlOjphdG9tKCl9LCB7U2VyaWNlTmFtZTo6bGlzdCgpLCBNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlSGFuZGxlclByb3BlcnR5TGlzdCk7CisgICAgICAgIF8gLT4gdGhyb3coIkVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGhhbmRsZXIgb3B0aW9uLiIpCisgICAgZW5kLAorICAgIGNhc2UgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZpbmQoP01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCBTZXJ2aWNlSGFuZGxlck1hcCkgb2YKKyAgICAgICAge29rLCBfRXJyb3JIYW5kbGVyfSAtPiBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9U2VydmljZUhhbmRsZXJNYXB9KTsKKyAgICAgICAgZXJyb3IgLT4gdGhyb3coIlRoZSBoYW5kbGVyIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tcImVycm9yX2hhbmRsZXJcIiwgTW9kdWxlOjphdG9tKCl9LCB7U2VyaWNlTmFtZTo6bGlzdCgpLCBNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgIGVuZDsKK3BhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBIYW5kbGVyfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5oYW5kbGVyID09IHVuZGVmaW5lZCwgaXNfYXRvbShIYW5kbGVyKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aGFuZGxlcj1IYW5kbGVyfSk7Ci1wYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZX0gfCBSZXN0XSwgU3RhdGUpIC0+CisKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBbXX0gfCBfUmVzdF0sIF9TdGF0ZSkgLT4KKyAgICB0aHJvdygiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbW9kdWxlIG11c3QgYmUgZGVmaW5lZC4iKTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VNb2R1bGVQcm9wZXJ0eUxpc3QpIC0+CisgICAgU2VydmljZU1vZHVsZU1hcCA9CisgICAgY2FzZSBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlIG9mCisgICAgICAgIHVuZGVmaW5lZCAtPgorICAgICAgICAgICAgbGlzdHM6Zm9sZGwoCisgICAgICAgICAgICAgICAgZnVuICh7U2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGV9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZU1vZHVsZSkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpzdG9yZShTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZSwgQWNjKTsKKyAgICAgICAgICAgICAgICAgICAgKF8sIF9BY2MpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdygiVGhlIHNlcnZpY2Ugb3B0aW9uIGlzIG5vdCBwcm9wZXJseSBjb25maWd1cmVkIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcy4gSXQgc2hvdWxkIGJlIGEga2luZCBvZiBbe1NlcmljZU5hbWU6Omxpc3QoKSwgU2VydmljZU1vZHVsZTo6YXRvbSgpfSwgLi4uXSIpCisgICAgICAgICAgICAgICAgZW5kLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6bmV3KCksIFNlcnZpY2VNb2R1bGVQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBzZXJ2aWNlIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NlcnZpY2U9U2VydmljZU1vZHVsZU1hcH0pOworcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLnNlcnZpY2UgPT0gdW5kZWZpbmVkLCBpc19hdG9tKFNlcnZpY2UpIC0+CiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2V9KTsKKwogcGFyc2Vfb3B0aW9ucyhbe21heCwgTWF4fSB8IFJlc3RdLCBTdGF0ZSkgLT4KICAgICBNYXhJbnQgPSBjYXNlIE1heCBvZgogICAgICAgICAgICAgICAgICBNYXggd2hlbiBpc19saXN0KE1heCkgLT4KQEAgLTEwMyw4ICsxNDksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgIE1heAogICAgICAgICAgICAgIGVuZCwKICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye21heD1NYXhJbnR9KTsKKworcGFyc2Vfb3B0aW9ucyhbe3Byb3RvY29sLCBQcm90b30gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYXRvbShQcm90bykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3Byb3RvY29sPVByb3RvfSk7CisKIHBhcnNlX29wdGlvbnMoW3tmcmFtZWQsIEZyYW1lZH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYm9vbGVhbihGcmFtZWQpIC0+Ci0gICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntmcmFtZWQ9RnJhbWVkfSkuCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntmcmFtZWQ9RnJhbWVkfSk7CisKK3BhcnNlX29wdGlvbnMoW3tzc2x0cmFuc3BvcnQsIFNTTFRyYW5zcG9ydH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYm9vbGVhbihTU0xUcmFuc3BvcnQpIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzc2x0cmFuc3BvcnQ9U1NMVHJhbnNwb3J0fSk7CitwYXJzZV9vcHRpb25zKFt7c3Nsb3B0aW9ucywgU1NMT3B0aW9uc30gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTU0xPcHRpb25zKSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3Nsb3B0aW9ucz1TU0xPcHRpb25zfSkuCiAKIHN0YXJ0X3NlcnZlcihTdGF0ZT0jdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bmFtZT1OYW1lfSkgLT4KICAgICBjYXNlIE5hbWUgb2YKQEAgLTE2NiwyOSArMjIxLDM1IEBACiBuZXdfYWNjZXB0b3IoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye21heD0wfSkgLT4KICAgICBlcnJvcl9sb2dnZXI6ZXJyb3JfbXNnKCJOb3QgYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyIpLAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPW51bGx9OwotbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnthY2NlcHRvcj1PbGRQaWQsIGxpc3Rlbj1MaXN0ZW4sCituZXdfYWNjZXB0b3IoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U9U2VydmljZSwgaGFuZGxlcj1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9vcHRzPU9wdHMsIGZyYW1lZD1GcmFtZWQsIHByb3RvY29sPVByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2x0cmFuc3BvcnQ9U3NsVHJhbnNwb3J0LCBzc2xvcHRpb25zPVNzbE9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAtPgogICAgIFBpZCA9IHByb2NfbGliOnNwYXduX2xpbmsoP01PRFVMRSwgYWNjZXB0b3JfbG9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7c2VsZigpLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIE9wdHMsIEZyYW1lZH1dKSwKLSUlICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coIlNwYXduaW5nIG5ldyBhY2NlcHRvcjogfnAgPT4gfnAiLCBbT2xkUGlkLCBQaWRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7c2VsZigpLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIE9wdHMsIEZyYW1lZCwgU3NsVHJhbnNwb3J0LCBTc2xPcHRpb25zLCBQcm90b31dKSwKICAgICBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnthY2NlcHRvcj1QaWR9LgogCi1hY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkfSkKK2FjY2VwdG9yX2xvb3Aoe1NlcnZlciwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBTb2NrZXRPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99KQogICB3aGVuIGlzX3BpZChTZXJ2ZXIpLCBpc19saXN0KFNvY2tldE9wdHMpIC0+CiAgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmFjY2VwdChMaXN0ZW4pIG9mICUgaW5maW5pdGUgdGltZW91dAogICAgICAgICB7b2ssIFNvY2tldH0gLT4KICAgICAgICAgICAgIGdlbl9zZXJ2ZXI6Y2FzdChTZXJ2ZXIsIHthY2NlcHRlZCwgc2VsZigpfSksCiAgICAgICAgICAgICBQcm90b0dlbiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ICAgPSB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBTb2NrZXRPcHRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoU29ja2V0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICAgID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIElQcm90PVByb3RvY29sLCBPUHJvdD1Qcm90b2NvbH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2tldFRyYW5zcG9ydH0gPSBjYXNlIFNzbFRyYW5zcG9ydCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBTb2NrZXRPcHRzLCBTc2xPcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgID0gY2FzZSBGcmFtZWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBQcm90b2NvbH0gICAgICAgID0gY2FzZSBQcm90byBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdCAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gLT4gdGhyaWZ0X2pzb25fcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBQcm90b2NvbH0KICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgdGhyaWZ0X3Byb2Nlc3Nvcjppbml0KHtTZXJ2ZXIsIFByb3RvR2VuLCBTZXJ2aWNlLCBIYW5kbGVyfSk7CiAgICAgICAgIHtlcnJvciwgY2xvc2VkfSAtPgpAQCAtMjE1LDggKzI3NiwxMSBAQAogaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+CiAgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgogCi10ZXJtaW5hdGUoX1JlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+Cit0ZXJtaW5hdGUoUmVhc29uLCAjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwgcG9ydD1Qb3J0fSkgLT4KICAgICBnZW5fdGNwOmNsb3NlKExpc3RlbiksCisgICAge2JhY2t0cmFjZSwgQnR9ID0gZXJsYW5nOnByb2Nlc3NfaW5mbyhzZWxmKCksIGJhY2t0cmFjZSksCisgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCh7P01PRFVMRSwgP0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NoaWxkX2Vycm9yLCBSZWFzb24sIEJ0fX0pLAogICAgIGNhc2UgUG9ydCA8IDEwMjQgb2YKICAgICAgICAgdHJ1ZSAtPgogICAgICAgICAgICAgY2F0Y2ggZmRzcnY6c3RvcCgpLApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCmluZGV4IGZjZDY5NDQuLmZhMTBlZDAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTIxLDk5ICsyMSwxNTYgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotLWV4cG9ydChbbmV3LzEsCi0gICAgICAgICBuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMSwKKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzEsIG5ldy8yXSkuCislJSB0cmFuc3BvcnQgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzNdKS4KIAotICAgICAgICAgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzNdKS4KIAotLXJlY29yZChkYXRhLCB7c29ja2V0LAotICAgICAgICAgICAgICAgcmVjdl90aW1lb3V0PWluZmluaXR5fSkuCistcmVjb3JkKHRfc29ja2V0LCB7CisgIHNvY2tldCwKKyAgcmVjdl90aW1lb3V0PTYwMDAwLAorICBidWZmZXIgPSBbXQorfSkuCiAKLW5ldyhTb2NrZXQpIC0+Ci0gICAgbmV3KFNvY2tldCwgW10pLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9zb2NrZXR7fS4KKworCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoU29ja2V0KSAtPiBuZXcoU29ja2V0LCBbXSkuCisKKy1zcGVjIG5ldyhTb2NrZXQ6OmFueSgpLCBPcHRzOjpsaXN0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KIAogbmV3KFNvY2tldCwgT3B0cykgd2hlbiBpc19saXN0KE9wdHMpIC0+Ci0gICAgU3RhdGUgPQotICAgICAgICBjYXNlIGxpc3RzOmtleXNlYXJjaChyZWN2X3RpbWVvdXQsIDEsIE9wdHMpIG9mCi0gICAgICAgICAgICB7dmFsdWUsIHtyZWN2X3RpbWVvdXQsIFRpbWVvdXR9fQotICAgICAgICAgICAgd2hlbiBpc19pbnRlZ2VyKFRpbWVvdXQpLCBUaW1lb3V0ID4gMCAtPgotICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fTsKLSAgICAgICAgICAgIF8gLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0fQotICAgICAgICBlbmQsCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgotCi0lJSBEYXRhIDo6IGlvbGlzdCgpCi13cml0ZSgjZGF0YXtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgotICAgIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpLgotCi1yZWFkKCNkYXRhe3NvY2tldD1Tb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fSwgTGVuKQotICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICBjYXNlIGdlbl90Y3A6cmVjdihTb2NrZXQsIExlbiwgVGltZW91dCkgb2YKLSAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fSAtPgotICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJyZWFkIHRpbWVvdXQ6IHBlZXIgY29ubiB+cCIsIFtpbmV0OnBlZXJuYW1lKFNvY2tldCldKSwKLSAgICAgICAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKLSAgICAgICAgICAgIEVycjsKLSAgICAgICAgRGF0YSAtPiBEYXRhCi0gICAgZW5kLgotCi0lJSBXZSBjYW4ndCByZWFsbHkgZmx1c2ggLSBldmVyeXRoaW5nIGlzIGZsdXNoZWQgd2hlbiB3ZSB3cml0ZQotZmx1c2goXykgLT4KLSAgICBvay4KLQotY2xvc2UoI2RhdGF7c29ja2V0ID0gU29ja2V0fSkgLT4KLSAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCkuCisgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSksCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAogCi0lJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitwYXJzZV9vcHRzKFt7cmVjdl90aW1lb3V0LCBUaW1lb3V0fXxSZXN0XSwgU3RhdGUpCit3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9zb2NrZXR7cmVjdl90aW1lb3V0ID0gVGltZW91dH0pOworcGFyc2Vfb3B0cyhbe3JlY3ZfdGltZW91dCwgaW5maW5pdHl9fFJlc3RdLCBTdGF0ZSkgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X3NvY2tldHtyZWN2X3RpbWVvdXQgPSBpbmZpbml0eX0pOworcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+CisgIFN0YXRlLgogCiAKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFN0YXRlID0gI3Rfc29ja2V0e2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICBfIC0+IHJlY3YoU3RhdGUsIExlbikKKyAgZW5kLgorCityZWN2KFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldCwgYnVmZmVyID0gQnVmfSwgTGVuKSAtPgorICBjYXNlIGdlbl90Y3A6cmVjdihTb2NrZXQsIDAsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAge29rLCBEYXRhfSAtPgorICAgICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQnVmLCBEYXRhXSksCisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X3NvY2tldHtidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4gcmVhZChTdGF0ZSwgTGVuKTsKKyAgICBYIC0+CisgICAgICBjYXNlIGdlbl90Y3A6cmVjdihTdGF0ZSN0X3NvY2tldC5zb2NrZXQsIExlbiAtIFgsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICBnZW5fdGNwOmNsb3NlKFN0YXRlI3Rfc29ja2V0LnNvY2tldCksCisgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgICAgIHtvaywgRGF0YX0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCB7b2ssIDw8QmluYXJ5L2JpbmFyeSwgRGF0YS9iaW5hcnk+Pn19CisgICAgICBlbmQKKyAgZW5kLgorCisKK3dyaXRlKFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgIGNhc2UgZ2VuX3RjcDpzZW5kKFNvY2tldCwgRGF0YSkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgb2sgLT4ge1N0YXRlLCBva30KKyAgZW5kLgorCisKK2ZsdXNoKFN0YXRlKSAtPgorICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCBva30uCisKKworY2xvc2UoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSkgLT4KKyAge1N0YXRlLCBnZW5fdGNwOmNsb3NlKFNvY2tldCl9LgorCisKKyUlIGxlZ2FjeSBhcGkuIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKKwogJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKICUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCiAlJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCiAlJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKLS1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCi0gICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlfSkuCistcmVjb3JkKGZhY3Rvcnlfb3B0cywgeworICBjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKKyAgc29ja29wdHMgPSBbXSwKKyAgZnJhbWVkID0gZmFsc2UKK30pLgogCi1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIE9wdHMpIC0+Ci0gICAgT3B0czsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZD1Cb29sfSk7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KE9wdExpc3QpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzPU9wdExpc3R9KTsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99IHwgUmVzdF0sIE9wdHMpIHdoZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQ9VE99KS4KK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykgLT4ge0ZhY3RvcnlPcHRzLCBUcmFuc09wdHN9OworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZCA9IEJvb2x9LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBpc19saXN0KE9wdExpc3QpIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHMgPSBPcHRMaXN0fSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0ID0gVE99LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7cmVjdl90aW1lb3V0LCBUT318UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzLCBbe3JlY3ZfdGltZW91dCwgVE99XSArKyBUcmFuc09wdHMpLgogCiAKLSUlCiAlJSBHZW5lcmF0ZXMgYSAidHJhbnNwb3J0IGZhY3RvcnkiIGZ1bmN0aW9uIC0gYSBmdW4gd2hpY2ggcmV0dXJucyBhIHRocmlmdF90cmFuc3BvcnQoKQogJSUgaW5zdGFuY2UuCi0lJSBUaGlzIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKKyUlIFN0YXRlIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKICUlIHRocmlmdCBzZXJ2ZXIgb3ZlciBhIHNvY2tldC4KLSUlCiBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucykgLT4KLSAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSksCi0KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICBTb2NrT3B0cyA9IFtiaW5hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhY2tldCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGl2ZSwgZmFsc2V9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlbGF5LCB0cnVlfSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHNdLAotICAgICAgICAgICAgICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KEhvc3QsIFBvcnQsIFNvY2tPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKLSAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrfSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2spLAotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKLSAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgotICAgICAgICAgICAgICAgIGVuZAorICB7RmFjdG9yeU9wdHMsIFRyYW5zT3B0c30gPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9LCBbXSksCisgIHtvaywgZnVuKCkgLT4gU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAge3BhY2tldCwgMH0sCisgICAgICB7YWN0aXZlLCBmYWxzZX0sCisgICAgICB7bm9kZWxheSwgdHJ1ZX18RmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzCisgICAgXSwKKyAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdCgKKyAgICAgIEhvc3QsCisgICAgICBQb3J0LAorICAgICAgU29ja09wdHMsCisgICAgICBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0CisgICAgKSBvZgorICAgICAge29rLCBTb2NrfSAtPgorICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29jaywgVHJhbnNPcHRzKSwKKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0gY2FzZSBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCisgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQogICAgICAgICBlbmQsCi0gICAge29rLCBGfS4KKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OworICAgICAgRXJyb3IgIC0+IEVycm9yCisgICAgZW5kCisgIGVuZH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTExNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMTQ3IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKy1tb2R1bGUodGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQpLgorCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKy1leHBvcnQoW25ldy8zLAorICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xLAorCisgICAgICAgICBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvM10pLgorCislJSBFeHBvcnQgb25seSBmb3IgdGhlIHRyYW5zcG9ydCBmYWN0b3J5CistZXhwb3J0KFtuZXcvMl0pLgorCistcmVjb3JkKGRhdGEsIHtzb2NrZXQsCisgICAgICAgICAgICAgICByZWN2X3RpbWVvdXQ9aW5maW5pdHl9KS4KKy10eXBlIHN0YXRlKCkgOjogI2RhdGF7fS4KKworJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKKyUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCislJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCislJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKKy1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBzc2xvcHRpb25zID0gW119KS4KKworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBPcHRzKSAtPgorICAgIE9wdHM7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQ9Qm9vbH0pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRMaXN0KSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cz1PcHRMaXN0fSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfSB8IFJlc3RdLCBPcHRzKSB3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0PVRPfSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzc2xvcHRpb25zLCBTc2xPcHRpb25zfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoU3NsT3B0aW9ucykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c3Nsb3B0aW9ucz1Tc2xPcHRpb25zfSkuCisKK25ldyhTb2NrZXQsIFNvY2tPcHRzLCBTc2xPcHRpb25zKSB3aGVuIGlzX2xpc3QoU29ja09wdHMpLCBpc19saXN0KFNzbE9wdGlvbnMpIC0+CisgICAgaW5ldDpzZXRvcHRzKFNvY2tldCwgW3thY3RpdmUsIGZhbHNlfV0pLCAlJSA9PiBwcmV2ZW50IHRoZSBzc2wgaGFuZHNoYWtlIG1lc3NhZ2VzIGdldCBsb3N0CisKKyAgICAlJSB1cGdyYWRlIHRvIGFuIHNzbCBzb2NrZXQKKyAgICBjYXNlIGNhdGNoIHNzbDpzc2xfYWNjZXB0KFNvY2tldCwgU3NsT3B0aW9ucykgb2YgJSBpbmZpbml0ZSB0aW1lb3V0CisgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgbmV3KFNzbFNvY2tldCwgU29ja09wdHMpOworICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gLT4KKyAgICAgICAgICAgIGV4aXQoe2Vycm9yLCBSZWFzb259KTsKKyAgICAgICAgT3RoZXIgLT4KKyAgICAgICAgICAgIGVycm9yX2xvZ2dlcjplcnJvcl9yZXBvcnQoCisgICAgICAgICAgICAgIFt7YXBwbGljYXRpb24sIHRocmlmdH0sCisgICAgICAgICAgICAgICAiU1NMIGFjY2VwdCBmYWlsZWQgZXJyb3IiLAorICAgICAgICAgICAgICAgbGlzdHM6ZmxhdHRlbihpb19saWI6Zm9ybWF0KCJ+cCIsIFtPdGhlcl0pKV0pLAorICAgICAgICAgICAgZXhpdCh7ZXJyb3IsIHNzbF9hY2NlcHRfZmFpbGVkfSkKKyAgICBlbmQuCisKK25ldyhTc2xTb2NrZXQsIFNvY2tPcHRzKSAtPgorICAgIFN0YXRlID0KKyAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBTb2NrT3B0cykgb2YKKyAgICAgICAgICAgIHt2YWx1ZSwge3JlY3ZfdGltZW91dCwgVGltZW91dH19CisgICAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KKyAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U3NsU29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07CisgICAgICAgICAgICBfIC0+CisgICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNzbFNvY2tldH0KKyAgICAgICAgZW5kLAorICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworJSUgRGF0YSA6OiBpb2xpc3QoKQord3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgICAge1RoaXMsIHNzbDpzZW5kKFNvY2tldCwgRGF0YSl9LgorCityZWFkKFRoaXMgPSAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH0sIExlbikKKyAgd2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgICAgY2FzZSBzc2w6cmVjdihTb2NrZXQsIExlbiwgVGltZW91dCkgb2YKKyAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fSAtPgorICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJyZWFkIHRpbWVvdXQ6IHBlZXIgY29ubiB+cCIsIFtpbmV0OnBlZXJuYW1lKFNvY2tldCldKSwKKyAgICAgICAgICAgIHNzbDpjbG9zZShTb2NrZXQpLAorICAgICAgICAgICAge1RoaXMsIEVycn07CisgICAgICAgIERhdGEgLT4KKyAgICAgICAgICAgIHtUaGlzLCBEYXRhfQorICAgIGVuZC4KKworJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKK2ZsdXNoKFRoaXMpIC0+CisgICAge1RoaXMsIG9rfS4KKworY2xvc2UoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+CisgICAge1RoaXMsIHNzbDpjbG9zZShTb2NrZXQpfS4KKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJQorJSUgR2VuZXJhdGVzIGEgInRyYW5zcG9ydCBmYWN0b3J5IiBmdW5jdGlvbiAtIGEgZnVuIHdoaWNoIHJldHVybnMgYSB0aHJpZnRfdHJhbnNwb3J0KCkKKyUlIGluc3RhbmNlLgorJSUgVGhpcyBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCislJSB0aHJpZnQgc2VydmVyIG92ZXIgYSBzb2NrZXQuCislJQorbmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpIC0+CisgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30pLAorCisgICAgRiA9IGZ1bigpIC0+CisgICAgICAgICAgICAgICAgU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYWNrZXQsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmUsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9kZWxheSwgdHJ1ZX0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzXSwKKyAgICAgICAgICAgICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdChIb3N0LCBQb3J0LCBTb2NrT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja30gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNzbFNvY2sgPSBjYXNlIGNhdGNoIHNzbDpjb25uZWN0KFNvY2ssIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNzbG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsU29ja2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJlcnJvciB3aGlsZSBjb25uZWN0aW5nIG92ZXIgc3NsIC0gcmVhc29uOiB+cH5uIiwgW090aGVyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCBnZW5fdGNwOmNsb3NlKFNvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydDpuZXcoU3NsU29jaywgU29ja09wdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQsCisgICAge29rLCBGfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCmluZGV4IDIwYzRiNWQuLjI0MTRiZGUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCkBAIC0yMCwzOCArMjAsMTA3IEBACiAtbW9kdWxlKHRocmlmdF90cmFuc3BvcnQpLgogCiAtZXhwb3J0KFtiZWhhdmlvdXJfaW5mby8xXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLWV4cG9ydChbbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLAotICAgICAgICAgcmVhZC8yLAotICAgICAgICAgZmx1c2gvMSwKLSAgICAgICAgIGNsb3NlLzEKLSAgICAgICAgXSkuCistZXhwb3J0X3R5cGUoW3RfdHJhbnNwb3J0LzBdKS4KKwogCiBiZWhhdmlvdXJfaW5mbyhjYWxsYmFja3MpIC0+Ci0gICAgW3tyZWFkLCAyfSwKLSAgICAge3dyaXRlLCAyfSwKLSAgICAge2ZsdXNoLCAxfSwKLSAgICAge2Nsb3NlLCAxfQotICAgIF0uCisgIFt7cmVhZCwgMn0sIHt3cml0ZSwgMn0sIHtmbHVzaCwgMX0sIHtjbG9zZSwgMX1dLgogCi0tcmVjb3JkKHRyYW5zcG9ydCwge21vZHVsZSwgZGF0YX0pLgogCi1uZXcoTW9kdWxlLCBEYXRhKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgotICAgIHtvaywgI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBEYXRhfX0uCistcmVjb3JkKHRfdHJhbnNwb3J0LCB7CisgIG1vZHVsZSwKKyAgc3RhdGUKK30pLgogCi0lJSBEYXRhIDo6IGlvbGlzdCgpCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAgTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0cmFuc3BvcnQuZGF0YSwgRGF0YSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X3RyYW5zcG9ydHt9LgorLXR5cGUgdF90cmFuc3BvcnQoKSA6OiAjdF90cmFuc3BvcnR7fS4KIAotcmVhZChUcmFuc3BvcnQsIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBNb2R1bGUgPSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSwKLSAgICBNb2R1bGU6cmVhZChUcmFuc3BvcnQjdHJhbnNwb3J0LmRhdGEsIExlbikuCiAKLWZsdXNoKCN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAgTW9kdWxlOmZsdXNoKERhdGEpLgorLWlmZGVmKHRyYW5zcG9ydF93cmFwcGVyX21vZHVsZSkuCistZGVmaW5lKGRlYnVnX3dyYXAoVHJhbnNwb3J0KSwKKyAgY2FzZSBUcmFuc3BvcnQjdF90cmFuc3BvcnQubW9kdWxlIG9mCisgICAgP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZSAtPiBUcmFuc3BvcnQ7CisgICAgX0Vsc2UgLT4KKyAgICAgIHtvaywgUmVzdWx0fSA9ID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGU6bmV3KFRyYW5zcG9ydCksCisgICAgICBSZXN1bHQKKyAgZW5kCispLgorLWVsc2UuCistZGVmaW5lKGRlYnVnX3dyYXAoVHJhbnNwb3J0KSwgVHJhbnNwb3J0KS4KKy1lbmRpZi4KIAotY2xvc2UoI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSkgLT4KLSAgICBNb2R1bGU6Y2xvc2UoRGF0YSkuCisKKy10eXBlIHdyYXBwYWJsZSgpIDo6CisgIGJpbmFyeSgpIHwKKyAgbGlzdCgpIHwKKyAge21lbWJ1ZmZlciwgYmluYXJ5KCkgfCBsaXN0KCl9IHwKKyAge3RjcCwgcG9ydCgpfSB8CisgIHt0Y3AsIHBvcnQoKSwgbGlzdCgpfSB8CisgIHtmaWxlLCBmaWxlOmlvX2RldmljZSgpfSB8CisgIHtmaWxlLCBmaWxlOmlvX2RldmljZSgpLCBsaXN0KCl9IHwKKyAge2ZpbGUsIGZpbGU6ZmlsZW5hbWUoKX0gfAorICB7ZmlsZSwgZmlsZTpmaWxlbmFtZSgpLCBsaXN0KCl9LgorCistc3BlYyBuZXcod3JhcHBhYmxlKCkpIC0+IHtvaywgI3RfdHJhbnNwb3J0e319LgorCituZXcoe21lbWJ1ZmZlciwgTWVtYnVmZmVyfSkgd2hlbiBpc19iaW5hcnkoTWVtYnVmZmVyKTsgaXNfbGlzdChNZW1idWZmZXIpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhNZW1idWZmZXIpOworbmV3KHttZW1idWZmZXIsIE1lbWJ1ZmZlciwgW119KSB3aGVuIGlzX2JpbmFyeShNZW1idWZmZXIpOyBpc19saXN0KE1lbWJ1ZmZlcikgLT4KKyAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KE1lbWJ1ZmZlcik7CituZXcoe3RjcCwgU29ja2V0fSkgd2hlbiBpc19wb3J0KFNvY2tldCkgLT4KKyAgbmV3KHt0Y3AsIFNvY2tldCwgW119KTsKK25ldyh7dGNwLCBTb2NrZXQsIE9wdHN9KSB3aGVuIGlzX3BvcnQoU29ja2V0KSAtPgorICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBPcHRzKTsKK25ldyh7ZmlsZSwgRmlsZW5hbWV9KSB3aGVuIGlzX2xpc3QoRmlsZW5hbWUpOyBpc19iaW5hcnkoRmlsZW5hbWUpIC0+CisgIG5ldyh7ZmlsZSwgRmlsZW5hbWUsIFtdfSk7CituZXcoe2ZpbGUsIEZpbGVuYW1lLCBPcHRzfSkgd2hlbiBpc19saXN0KEZpbGVuYW1lKTsgaXNfYmluYXJ5KEZpbGVuYW1lKSAtPgorICB7b2ssIEZpbGV9ID0gZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmF3LCBiaW5hcnldKSwKKyAgbmV3KHtmaWxlLCBGaWxlLCBPcHRzfSk7CituZXcoe2ZpbGUsIEZpbGUsIE9wdHN9KSAtPgorICB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUsIE9wdHMpLgorCistc3BlYyBuZXcoTW9kdWxlOjptb2R1bGUoKSwgU3RhdGU6OmFueSgpKSAtPiB7b2ssICN0X3RyYW5zcG9ydHt9fS4KKworbmV3KE1vZHVsZSwgU3RhdGUpIHdoZW4gaXNfYXRvbShNb2R1bGUpIC0+CisgIHtvaywgP2RlYnVnX3dyYXAoI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgc3RhdGUgPSBTdGF0ZX0pfS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgTGVuKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCityZWFkX2V4YWN0KFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgY2FzZSBsaXN0czprZXlmaW5kKHJlYWRfZXhhY3QsIDEsIE1vZHVsZTptb2R1bGVfaW5mbyhleHBvcnRzKSkgb2YKKyAgICB7cmVhZF9leGFjdCwgMn0gLT4KKyAgICAgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkX2V4YWN0KFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgTGVuKSwKKyAgICAgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH07CisgICAgXyAtPgorICAgICAgcmVhZChUcmFuc3BvcnQsIExlbikKKyAgZW5kLgorCisKK3dyaXRlKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBEYXRhKSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6d3JpdGUoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBEYXRhKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCitmbHVzaChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOmZsdXNoKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworY2xvc2UoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0pIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpjbG9zZShUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0X3N0YXRlX3Rlc3QuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNhNDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LmVybApAQCAtMCwwICsxLDExNyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0KS4KKworLWJlaGF2aW91cihnZW5fc2VydmVyKS4KKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKyUlIEFQSQorLWV4cG9ydChbbmV3LzFdKS4KKworJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKKy1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgaGFuZGxlX2luZm8vMiwKKyAgICAgICAgIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuCisKKyUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCistZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKworLXJlY29yZCh0cmFucywge3dyYXBwZWQsICUgI3RocmlmdF90cmFuc3BvcnR7fQorICAgICAgICAgICAgICAgIHZlcnNpb24gOjogaW50ZWdlcigpLAorICAgICAgICAgICAgICAgIGNvdW50ZXIgOjogcGlkKCkKKyAgICAgICAgICAgICAgIH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjdHJhbnN7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworLXJlY29yZChzdGF0ZSwge2N2ZXJzaW9uIDo6IGludGVnZXIoKX0pLgorCisKK25ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgorICAgIGNhc2UgZ2VuX3NlcnZlcjpzdGFydF9saW5rKD9NT0RVTEUsIFtdLCBbXSkgb2YKKyAgICAgICAge29rLCBQaWR9IC0+CisgICAgICAgICAgICBUcmFucyA9ICN0cmFuc3t3cmFwcGVkID0gV3JhcHBlZFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciA9IFBpZH0sCisgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBUcmFucyk7CisgICAgICAgIEVsc2UgLT4KKyAgICAgICAgICAgIEVsc2UKKyAgICBlbmQuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3dyaXRlKFRyYW5zcG9ydDAgPSAjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQwfSwgRGF0YSkgLT4KKyAgICBUcmFuc3BvcnQxID0gY2hlY2tfdmVyc2lvbihUcmFuc3BvcnQwKSwKKyAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQwLCBEYXRhKSwKKyAgICBUcmFuc3BvcnQyID0gVHJhbnNwb3J0MSN0cmFuc3t3cmFwcGVkID0gV3JhcHBlZDF9LAorICAgIHtUcmFuc3BvcnQyLCBSZXN1bHR9LgorCitmbHVzaChUcmFuc3BvcnQwID0gI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMH0pIC0+CisgICAgVHJhbnNwb3J0MSA9IGNoZWNrX3ZlcnNpb24oVHJhbnNwb3J0MCksCisgICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkMCksCisgICAgVHJhbnNwb3J0MiA9IFRyYW5zcG9ydDEjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQxfSwKKyAgICB7VHJhbnNwb3J0MiwgUmVzdWx0fS4KKworY2xvc2UoVHJhbnNwb3J0MCA9ICN0cmFuc3t3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgorICAgIFRyYW5zcG9ydDEgPSBjaGVja192ZXJzaW9uKFRyYW5zcG9ydDApLAorICAgIHNodXRkb3duX2NvdW50ZXIoVHJhbnNwb3J0MSksCisgICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkMCksCisgICAgVHJhbnNwb3J0MiA9IFRyYW5zcG9ydDEjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQxfSwKKyAgICB7VHJhbnNwb3J0MiwgUmVzdWx0fS4KKworcmVhZChUcmFuc3BvcnQwID0gI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMH0sIExlbikgLT4KKyAgICBUcmFuc3BvcnQxID0gY2hlY2tfdmVyc2lvbihUcmFuc3BvcnQwKSwKKyAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZDAsIExlbiksCisgICAgVHJhbnNwb3J0MiA9IFRyYW5zcG9ydDEjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQxfSwKKyAgICB7VHJhbnNwb3J0MiwgUmVzdWx0fS4KKworCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSBnZW5fc2VydmVyIGNhbGxiYWNrcworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbml0KFtdKSAtPgorICAgIHtvaywgI3N0YXRle2N2ZXJzaW9uID0gMH19LgorCitoYW5kbGVfY2FsbChjaGVja192ZXJzaW9uLCBfRnJvbSwgU3RhdGUgPSAjc3RhdGV7Y3ZlcnNpb24gPSBWZXJzaW9ufSkgLT4KKyAgICB7cmVwbHksIFZlcnNpb24sIFN0YXRlI3N0YXRle2N2ZXJzaW9uID0gVmVyc2lvbisxfX0uCisKK2hhbmRsZV9jYXN0KHNodXRkb3duLCBTdGF0ZSkgLT4KKyAgICB7c3RvcCwgbm9ybWFsLCBTdGF0ZX0uCisKK2hhbmRsZV9pbmZvKF9JbmZvLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfS4KK2NvZGVfY2hhbmdlKF9PbGRWc24sIFN0YXRlLCBfRXh0cmEpIC0+IHtvaywgU3RhdGV9LgordGVybWluYXRlKF9SZWFzb24sIF9TdGF0ZSkgLT4gb2suCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEludGVybmFsIGZ1bmN0aW9ucworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjaGVja192ZXJzaW9uKFRyYW5zcG9ydCA9ICN0cmFuc3t2ZXJzaW9uID0gVmVyc2lvbiwgY291bnRlciA9IENvdW50ZXJ9KSAtPgorICAgIGNhc2UgZ2VuX3NlcnZlcjpjYWxsKENvdW50ZXIsIGNoZWNrX3ZlcnNpb24pIG9mCisgICAgICAgIFZlcnNpb24gLT4KKyAgICAgICAgICAgIFRyYW5zcG9ydCN0cmFuc3t2ZXJzaW9uID0gVmVyc2lvbisxfTsKKyAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICUgU3RhdGUgd2Fzbid0IHByb3BhZ2F0ZWQgcHJvcGVybHkuICBEaWUuCisgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioc3RhdGVfbm90X3Byb3BhZ2F0ZWQpCisgICAgZW5kLgorCitzaHV0ZG93bl9jb3VudGVyKCN0cmFuc3tjb3VudGVyID0gQ291bnRlcn0pIC0+CisgICAgZ2VuX3NlcnZlcjpjYXN0KENvdW50ZXIsIHNodXRkb3duKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9UaHJpZnQxMTUxLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxMTUxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjkzNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L1RocmlmdDExNTEudGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IFN0cnVjdEEgeyAxOiBpMTYgeDsgfQorc3RydWN0IFN0cnVjdEIgeyAxOiBpMzIgeDsgfQorc3RydWN0IFN0cnVjdEMgeyAxOiBTdHJ1Y3RBIHg7IH0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdCBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRlYjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L1RocmlmdDE0NzUudGhyaWZ0CkBAIC0wLDAgKzEsMzQgQEAKK3N0cnVjdCBTdHJ1Y3RCCit7CisgIDE6IHN0cmluZyB4Cit9CisKK3N0cnVjdCBTdHJ1Y3RBCit7CisgIDE6IHN0cmluZyBhLAorICAyOiBiaW5hcnkgYiwKKyAgMzogb3B0aW9uYWwgc3RyaW5nIGMsCisgIDQ6IG9wdGlvbmFsIGJpbmFyeSBkLAorICA1OiByZXF1aXJlZCBzdHJpbmcgZSwKKyAgNjogcmVxdWlyZWQgYmluYXJ5IGYsCisgIDc6IHN0cmluZyBnID0gImZvbyIsCisgIDg6IGkzMiBoLAorICA5OiBvcHRpb25hbCBpMzIgaSwKKyAgMTA6IHJlcXVpcmVkIGkzMiBqLAorICAxMTogcmVxdWlyZWQgaTMyIGsgPSA1LAorICAxMjogZG91YmxlIGwsCisgIDEzOiBvcHRpb25hbCBkb3VibGUgbSwKKyAgMTQ6IHJlcXVpcmVkIGRvdWJsZSBuLAorICAxNTogZG91YmxlIG8gPSAzLjE0MTU5LAorICAxNjogbGlzdDxzdHJpbmc+IHN0cmluZ19saXN0LAorICAxNzogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDE4OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gcnNsLAorICAxOTogb3B0aW9uYWwgbGlzdDxzdHJpbmc+IG9zbCwKKyAgMjA6IHNldDxzdHJpbmc+IHN0cmluZ19zZXQsCisgIDIxOiByZXF1aXJlZCBzZXQ8c3RyaW5nPiByc3MsCisgIDIyOiBvcHRpb25hbCBzZXQ8c3RyaW5nPiBvc3MsCisgIDIzOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ19tYXAsCisgIDI0OiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IHJzbSwKKyAgMjU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gb3NtLAorICAyNjogU3RydWN0QiBzdHJ1Y3RiCit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdApAQCAtMCwwICsxLDIyIEBACitzdHJ1Y3QgdGVzdDEgeworICAxOiBpMzIgb25lCisgIDI6IGkzMiB0d28gICAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MiB7CisgIDE6IGkzMiBvbmUKKyAgMjogdGVzdDIgdHdvICAgICAgICAgICAgICAgICAgLy8gb21pdAorICAzOiBpMzIgdGhyZWUKK30KKworc3RydWN0IHRlc3QzIHsKKyAgMTogaTMyIG9uZQorICAyOiBsaXN0PHRlc3QxPiB0d28gICAgICAgICAgICAvLyBvbWl0Cit9CisKK3N0cnVjdCB0ZXN0NCB7CisgIDE6IGkzMiBvbmUKKyAgMjogbWFwPGkzMix0ZXN0MT4gdHdvICAgICAgICAgLy8gb21pdAorfQorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYyNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApAQCAtMCwwICsxLDMzIEBACitlbnVtIE51bWJlcnoKK3sKKyAgT05FID0gMSwKKyAgVFdPLAorICBUSFJFRSwKKyAgRklWRSA9IDUsCisgIFNJWCwKKyAgRUlHSFQgPSA4Cit9CisKK2NvbnN0IE51bWJlcnogbXlOdW1iZXJ6ID0gTnVtYmVyei5PTkU7CisKK3N0cnVjdCBDYXBpdGFsaXplZFN0cnVjdAoreworICAxOiBpMzIgSWQsCisgIDI6IGJpbmFyeSBtZXNzYWdlCit9CisKK3N0cnVjdCBMaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzCit7CisgIDE6IGxpc3Q8Q2FwaXRhbGl6ZWRTdHJ1Y3Q+IHN0cnVjdHMKK30KKworZXhjZXB0aW9uIFhjZXB0aW9uIHsKKyAgMTogaTMyIGVycm9yQ29kZSwKKyAgMjogYmluYXJ5IG1lc3NhZ2UKK30KKworc2VydmljZSBMZWdhY3lOYW1lcworeworICBMaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIE5hbWVzKDE6IENhcGl0YWxpemVkU3RydWN0IGZvbywgMjogQ2FwaXRhbGl6ZWRTdHJ1Y3QgYmFyKQorICAgIHRocm93cygxOiBYY2VwdGlvbiBlcnIpCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTEwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzdHJ1Y3QgU3RyaW5nTWFwCit7CisgIDE6IG1hcDxpMzIsIHN0cmluZz4gZGF0YSA9IHsxOiAiYSIsIDI6ICJiIn07Cit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApAQCAtMCwwICsxLDY5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9sZWdhY3lOYW1lc19jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtjYXBpdGFsaXplZFN0cnVjdCwgXywgX30sCisgICAgICAjY2FwaXRhbGl6ZWRTdHJ1Y3R7aWQ9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJjYXBpdGFsaXplZFN0cnVjdCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCAnaWQnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsICdtZXNzYWdlJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQoY2FwaXRhbGl6ZWRTdHJ1Y3QpCisgICAgKX0sCisgICAgeyJsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sICdzdHJ1Y3RzJywgW119CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3R5cGVzOnN0cnVjdF9pbmZvX2V4dChsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5hbWVzIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnbGlzdENhcGl0YWxpemVkU3RydWN0cyd9fSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsibmFtZXMgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAneGNlcHRpb24nfX19XX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc5OTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIE11bHRpcGxleGluZ19DYWxjdWxhdG9yIHsKKyAgICBpMzIgYWRkKDE6IGkzMiB4LCAyOiBpMzIgeSkKK30KKworc2VydmljZSBNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCB7CisgICAgZG91YmxlIGdldFRlbXBlcmF0dXJlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKy1tb2R1bGUobXVsdGlwbGV4aW5nX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1leHBvcnQoWworICAgICBoYW5kbGVfZnVuY3Rpb24vMgorICAgICxoYW5kbGVfZXJyb3IvMgorXSkuCisKK3N0YXJ0X211bHRpcGxleGVkX3NlcnZlcl90ZXN0KCkgLT4KKworICAgIFBvcnQgPSA5MDkwLAorICAgIFNlcnZpY2VzID0gWworICAgICAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCAgICBtdWx0aXBsZXhpbmdfX2NhbGN1bGF0b3JfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgbXVsdGlwbGV4aW5nX193ZWF0aGVyX3JlcG9ydF90aHJpZnR9CisgICAgICAgICAgICAgICBdLAorCisgICAge29rLCBQaWR9ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoWworICAgICAgICB7aXAsICIxMjcuMC4wLjEifSwKKyAgICAgICAge3BvcnQsIFBvcnR9LAorICAgICAgICB7bmFtZSwgP01PRFVMRX0sCisgICAgICAgIHtzZXJ2aWNlLCBTZXJ2aWNlc30sCisgICAgICAgIHtoYW5kbGVyLCBbCisgICAgICAgICAgICB7ImVycm9yX2hhbmRsZXIiLCAgICAgICAgICAgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgP01PRFVMRX0KKyAgICAgICAgXX0KKyAgICAgXSksCisKKyAgICB7b2ssIFt7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgQ2FsY3VsYXRvckNsaWVudDB9LAorICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCBXZWF0aGVyUmVwb3J0Q2xpZW50MH1dfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXdfbXVsdGlwbGV4ZWQoIjEyNy4wLjAuMSIsIFBvcnQsIFNlcnZpY2VzLCBbXSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxLDEsMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mn19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzQxLCAxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mi4wfX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisKKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdG9wKFBpZCkuCisKKyUlIEhBTkRMRSBGVU5DVElPTlMKKworJSUgQ2FsY3VsYXRvciBoYW5kbGVzCitoYW5kbGVfZnVuY3Rpb24oYWRkLCB7WCwgWX0pIC0+CisgICAge3JlcGx5LCBYICsgWX07CisKKyUlIFdlYXRoZXJSZXBvcnQgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGdldFRlbXBlcmF0dXJlLCB7fSkgLT4KKyAgICB7cmVwbHksIDQyLjB9LgorCitoYW5kbGVfZXJyb3IoX0YsIF9SZWFzb24pIC0+CislJSAgICAgP2RlYnVnSGVyZSwgP2RlYnVnVmFsKHtfRiwgX1JlYXNvbn0pLAorICAgIG9rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsMjk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShuYW1lX2NvbmZsaWN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3VzaW5nLCBfLCBffSwKKyAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9CisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2RlbGVnYXRlLCBfLCBffSwKKyAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KKyAgICApfSwKKyAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2dldCwgX30sCisgICAgICAjZ2V0e3NieXRlPW51bGx9CisgICAgKX0sCisgICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7cGFydGlhbCwgXywgXywgX30sCisgICAgICAjcGFydGlhbHt1c2luZz1udWxsfQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAorICAgICAgIydDbGFzc0FuZFByb3AneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKKyAgICAgICNzZWNvbmRfY2hhbmNleworICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnTk9XX0VBVF9USElTJ3sKKyAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ1RoZUVkZ2VDYXNlJ3sKKyAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKKyAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUcmlja3lfJywgXywgX30sCisgICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ05lc3RlZCd7CisgICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCisgICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKKyAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKKyAgICAgICAgJ05lc3RlZCc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKKyAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHN0cmluZ30sCisgICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAorICAgICAgICB7MiwgYm9vbH0sCisgICAgICAgIHszLCBib29sfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKKyAgICApfSwKKyAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKKyAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAorICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKKyAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKKyAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQorICAgICl9LAorICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQorICAgICl9LAorICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdDbGFzc0FuZFByb3AnCisgICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgIHNlY29uZF9jaGFuY2UKKyAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOT1dfRUFUX1RISVMnCisgICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUaGVFZGdlQ2FzZScKKyAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUcmlja3lfJworICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOZXN0ZWQnCisgICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3N0cmVzc19zZXJ2ZXIuZXJsIGIvbGliL2VybC90ZXN0L3N0cmVzc19zZXJ2ZXIuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2VybC9zcmMvc3RyZXNzX3NlcnZlci5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvdGVzdC9zdHJlc3Nfc2VydmVyLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I2ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwKQEAgLTAsMCArMSw5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9kaXNrbG9nKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCitkaXNrbG9nX3Rlc3QoKSAtPgorICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKKyAgICAgIHRlc3RfZGlza2xvZywKKyAgICAgIFt7ZmlsZSwgIi4vdGVzdF9sb2cifSwKKyAgICAgICB7c2l6ZSwgezEwMjQqMTAyNCwgMTB9fV0pLAorICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPQorICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoIFRyYW5zcG9ydEZhY3RvcnksIFtdKSwKKyAge29rLCBQcm90b30gPSBQcm90b2NvbEZhY3RvcnkoKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAorCisgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAorCisgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlIGl0CisgICUgd2lsbCB0cnkgdG8gcmVhZCBmcm9tIHRoZSBkaXNrbG9nIGFuZCBnbyBib29tLgorICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAorICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCisKKyAgJSBVc2UgdGhlIHNlbmRfY2FsbCBtZXRob2QgdG8gd3JpdGUgYSBub24tb25ld2F5IGNhbGwgaW50byB0aGUgbG9nCisgIHtDbGllbnQyLCBva30gPQorICAgIHRocmlmdF9jbGllbnQ6c2VuZF9jYWxsKENsaWVudDEsIHRlc3RTdHJpbmcsIFs8PCJoZWxsbyB3b3JsZCI+Pl0pLAorICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKKworICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCisgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCisgIAorICBsaXN0czpmb3JlYWNoKGZ1bihGaWxlKSAtPiBmaWxlOmRlbGV0ZShGaWxlKSBlbmQsIFsKKyAgICAiLi90ZXN0X2xvZy4xIiwKKyAgICAiLi90ZXN0X2xvZy5pZHgiLAorICAgICIuL3Rlc3RfbG9nLnNpeiIKKyAgXSksCisgIGlvOmZvcm1hdCgiQ2xlYW5pbmcgdXAgdGVzdCBmaWxlc35uIiksCisKKyAgb2suCisKK2Rpc2tsb2dfYmFzZTY0X3Rlc3QoKSAtPgorICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKKyAgICAgIHRlc3RfZGlza2xvZywKKyAgICAgIFt7ZmlsZSwgIi4vdGVzdF9iNjRfbG9nIn0sCisgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKKyAge29rLCBCNjRGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnkpLAorICB7b2ssIEJ1ZkZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShCNjRGYWN0b3J5KSwKKyAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KEJ1ZkZhY3RvcnksIFtdKSwKKyAge29rLCBQcm90b30gPSBQcm90b2NvbEZhY3RvcnkoKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAorCisgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAorCisgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlCisgICUgaXQgd2lsbCB0cnkgdG8gcmVhZCBmcm9tIHRoZSBkaXNrbG9nIGFuZCBnbyBib29tLgorICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAorICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCisKKyAgJSBVc2UgdGhlIHNlbmRfY2FsbCBtZXRob2QgdG8gd3JpdGUgYSBub24tb25ld2F5IGNhbGwgaW50byB0aGUgbG9nCisgIHtDbGllbnQyLCBva30gPQorICAgIHRocmlmdF9jbGllbnQ6c2VuZF9jYWxsKENsaWVudDEsIHRlc3RTdHJpbmcsIFs8PCJoZWxsbyB3b3JsZCI+Pl0pLAorICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKKworICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCisgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCisKKyAgbGlzdHM6Zm9yZWFjaChmdW4oRmlsZSkgLT4gZmlsZTpkZWxldGUoRmlsZSkgZW5kLCBbCisgICAgIi4vdGVzdF9iNjRfbG9nLjEiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5pZHgiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5zaXoiCisgIF0pLAorICBpbzpmb3JtYXQoIkNsZWFuaW5nIHVwIHRlc3QgZmlsZXN+biIpLAorCisgIG9rLgorCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X29taXQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODQxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApAQCAtMCwwICsxLDc5IEBACistbW9kdWxlKHRlc3Rfb21pdCkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF9vbWl0X3dpdGhfdHlwZXMuaHJsIikuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworb21pdF9zdHJ1Y3QxX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBiYXNpYyB0eXBlIChhbiBpMzIpLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9zdHJ1Y3QyX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBzdHJ1Y3QuCisgIEEgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0MntvbmUgPSAxLCB0d28gPSAjdGVzdDJ7b25lID0gMTAsIHR3byA9ICN0ZXN0MntvbmUgPSAxMDB9LCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSwgQX0pLAorICB7UDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzApKSwKKworICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QNCwge29rLCBPMX19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDMsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMSkpLAorCisgIG9rLgorCitvbWl0X2xpc3RfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIGxpc3QuCisgIEEgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0M3tvbmUgPSAxLCB0d28gPSBbIEEgXX0sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEIpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBCKSwgZWxlbWVudCgyLCBPMCkpLAorCisgIG9rLgorCitvbWl0X21hcF90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgbWFwLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDR7b25lID0gMSwgdHdvID0gZGljdDpmcm9tX2xpc3QoWyB7MiwgQX0gXSl9LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworLWVuZGlmLiAlJSBURVNUCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApAQCAtMCwwICsxLDY4IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL2RvdWJsZV9jb25zdGFudHNfdGVzdF9jb25zdGFudHMuaHJsIikuCisKKy1kZWZpbmUoRVBTSUxPTiwgMC4wMDAwMDAxKS4KKworcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50c190ZXN0KCkgLT4KKyAgP2Fzc2VydChhYnMoMS4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgxNi40MyAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKS4KKworcmVuZGVyZWRfZG91YmxlX2xpc3RfdGVzdCgpIC0+CisgID9hc3NlcnRFcXVhbCgxMiwgbGVuZ3RoKD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpLAorICA/YXNzZXJ0KGFicygxLjAgLSBsaXN0czpudGgoMSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwLjAgLSBsaXN0czpudGgoMiwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAuMCAtIGxpc3RzOm50aCgzLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtIGxpc3RzOm50aCg0LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygzLjE0MTU5MjY1MzU5IC0gbGlzdHM6bnRoKDYsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gbGlzdHM6bnRoKDcsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMDAwMDAuMSAtIGxpc3RzOm50aCg4LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gbGlzdHM6bnRoKDksID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gbGlzdHM6bnRoKDEwLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKS4KKworLWVuZGlmLiAlJSBURVNUClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTkxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMTE1MS5lcmwKQEAgLTAsMCArMSwzNCBAQAorLW1vZHVsZSh0ZXN0X3RocmlmdF8xMTUxKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MTE1MV90eXBlcy5ocmwiKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCit1bm1hdGNoZWRfc3RydWN0X3Rlc3QoKSAtPgorICBTMSA9ICMnU3RydWN0Qyd7eD0jJ1N0cnVjdEIne3g9MX19LAorICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKKyAge29rLCBQcm90b2NvbH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorICA/YXNzZXJ0RXhjZXB0aW9uKAorICAgIGVycm9yLAorICAgIHN0cnVjdF91bm1hdGNoZWQsCisgICAgdGhyaWZ0X3Byb3RvY29sOndyaXRlKAorICAgICAgUHJvdG9jb2wsCisgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdTdHJ1Y3RDJykpfSwgUzF9CisgICAgKQorICApLgorCitiYWRhcmdfdGVzdCgpIC0+CisgIFMyID0gIydTdHJ1Y3RDJ3t4PSMnU3RydWN0QSd7eD0iMSJ9fSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCisgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKyAgP2Fzc2VydEV4Y2VwdGlvbigKKyAgICBlcnJvciwKKyAgICBiYWRhcmcsCisgICAgdGhyaWZ0X3Byb3RvY29sOndyaXRlKAorICAgICAgUHJvdG9jb2wsCisgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdTdHJ1Y3RDJykpfSwgUzJ9CisgICAgKQorICApLgorCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5NTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8zMjE0LmVybApAQCAtMCwwICsxLDYwIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF8zMjE0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnQzMjE0X3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaWZuZGVmKG90cDE2X29yX2xlc3MpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IlN0cmluZ01hcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydTdHJpbmdNYXAnLCBffSwKKyAgICAgICMnU3RyaW5nTWFwJ3tkYXRhPSN7NTAgPT4gImZvbyJ9fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkZWZhdWx0cyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsICN7MSA9PiAiYSIsIDIgPT4gImIifX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkaWN0IGZyb20gbGlzdCIsID9fYXNzZXJ0Tm90RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsIGRpY3Q6ZnJvbV9saXN0KFt7MSwgImEifSwgezIsICJiIn1dKX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBtYXAgZnJvbSBsaXN0IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHsnU3RyaW5nTWFwJywgbWFwczpmcm9tX2xpc3QoW3sxLCAiYSJ9LCB7MiwgImIifV0pfSwKKyAgICAgICMnU3RyaW5nTWFwJ3t9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgc3RyaW5nfSwgJ2RhdGEnLCAjezEgPT4gImEiLCAyID0+ICJiIn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdDMyMTRfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdTdHJpbmdNYXAnKQorICAgICl9CisgIF0uCisKKy1lbmRpZi4KKy1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMzU5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZChGcmFtZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpyZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCit3cml0ZShGcmFtZWQsIERhdGEpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCA8PCJoYWxsbyB3b3JsZCI+Pl0KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0sCisgICAgICBvaworICAgIH0sCisgICAgY2xvc2Uoe3RfYnVmZmVyZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdCisgICAgfSkKKyAgKX0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMjE5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KK25ldygpIC0+CisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3QoKSAtPgorICBuZXcodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkpLgorCit3cml0ZShUaGlzLCBWYWx1ZSkgLT4gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFRoaXMsIFZhbHVlKS4KK3JlYWQoVGhpcywgVHlwZSkgLT4gdGhyaWZ0X3Byb3RvY29sOnJlYWQoVGhpcywgVHlwZSkuCisKK3N0cihUaGlzMCwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBWYWx1ZTB9KSwKKyAge1RoaXMyLCB7b2ssIFZhbHVlMX19ID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgYmluYXJ5X3RvX2xpc3QoVmFsdWUxKSksCisgIHtUaGlzMiwgb2t9Lgorc3RyaW5nX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IHN0cihUaGlzMCwgImFhYSIpLAorICB7VGhpczIsIG9rfSA9IHN0cihUaGlzMSwgIiIpLAorICB7VGhpczIsIG9rfS4KKworcm91bmRfdHJpcChUaGlzMCwgVHlwZSwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7VHlwZSwgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIFR5cGUpLAorICA/YXNzZXJ0RXF1YWwoVmFsdWUwLCBWYWx1ZTEpLAorICB7VGhpczIsIG9rfS4KKworYm9vbF90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSByb3VuZF90cmlwKFRoaXMwLCBib29sLCB0cnVlKSwKKyAge1RoaXMyLCBva30gPSByb3VuZF90cmlwKFRoaXMxLCBib29sLCBmYWxzZSksCisgIHtUaGlzMiwgb2t9LgorCitieXRlKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGJ5dGUsIFZhbHVlMCkuCitieXRlX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGJ5dGUoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGJ5dGUoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBieXRlKFRoaXMyLCAtMSksCisgIHtUaGlzNCwgb2t9ID0gYnl0ZShUaGlzMywgLTEyOCksCisgIHtUaGlzNCwgb2t9LgorCitpMTYoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTE2LCBWYWx1ZTApLgoraTE2X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkxNihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTE2KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTE2KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTE2KFRoaXMzLCAtMSksCisgIHtUaGlzNSwgb2t9ID0gaTE2KFRoaXM0LCAtMTI4KSwKKyAge1RoaXM2LCBva30gPSBpMTYoVGhpczUsIC0zMDAwMCksCisgIHtUaGlzNiwgb2t9LgorCitpMzIoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTMyLCBWYWx1ZTApLgoraTMyX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkzMihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTMyKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTMyKFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTMyKFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpMzIoVGhpczQsIC0xKSwKKyAge1RoaXM2LCBva30gPSBpMzIoVGhpczUsIC0xMjgpLAorICB7VGhpczcsIG9rfSA9IGkzMihUaGlzNiwgLTMwMDAwKSwKKyAge1RoaXM4LCBva30gPSBpMzIoVGhpczcsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXM4LCBva30uCisKK2k2NChUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBpNjQsIFZhbHVlMCkuCitpNjRfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gaTY0KFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBpNjQoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBpNjQoVGhpczIsIDMwMDAwKSwKKyAge1RoaXM0LCBva30gPSBpNjQoVGhpczMsIDIwMDAwMDAwMDIpLAorICB7VGhpczUsIG9rfSA9IGk2NChUaGlzNCwgMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXM2LCBva30gPSBpNjQoVGhpczUsIC0xKSwKKyAge1RoaXM3LCBva30gPSBpNjQoVGhpczYsIC0xMjgpLAorICB7VGhpczgsIG9rfSA9IGk2NChUaGlzNywgLTMwMDAwKSwKKyAge1RoaXM5LCBva30gPSBpNjQoVGhpczgsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXMxMCwgb2t9ID0gaTY0KFRoaXM5LCAtMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXMxMCwgb2t9LgorCitzdHJ1Y3RfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2J5dGUsIDQyfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisgIHtQNiwgb2t9ID0gd3JpdGUoUDUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDIiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtieXRlLCAzfSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsIGZpZWxkX2VuZCksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ynl0ZSwgOH0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgNDJ9fSA9IHJlYWQoUDE3LCBieXRlKSwKKyAge1AxOSwgb2t9ID0gcmVhZChQMTgsIGZpZWxkX2VuZCksCisgIHtQMjAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgM319ID0gcmVhZChQMjAsIGJ5dGUpLAorICB7UDIyLCBva30gPSByZWFkKFAyMSwgZmllbGRfZW5kKSwKKyAge1AyMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCA4fX0gPSByZWFkKFAyMywgYnl0ZSksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK2Jvb2xfZmllbGRfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMX0pLAorICB7UDQsIG9rfSA9IHdyaXRlKFAzLCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtib29sLCBmYWxzZX0pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxIH19ID0gcmVhZChQMTYsIGZpZWxkX2JlZ2luKSwKKyAge1AxOCwge29rLCB0cnVlfX0gPSByZWFkKFAxNywgYm9vbCksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgZmFsc2V9fSA9IHJlYWQoUDIwLCBib29sKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCB0cnVlfX0gPSByZWFkKFAyMywgYm9vbCksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK25lc3RpbmdfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTR9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKworICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjh9KSwKKyAge1A3LCBva30gPSB3cml0ZShQNiwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMl8xIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwfSksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsIHtib29sLCBmYWxzZX0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwgZmllbGRfZW5kKSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9zdG9wKSwKKyAge1AxMiwgb2t9ID0gd3JpdGUoUDExLCBzdHJ1Y3RfZW5kKSwKKyAge1AxMywgb2t9ID0gd3JpdGUoUDEyLCBmaWVsZF9lbmQpLAorCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDE1LCBva30gPSB3cml0ZShQMTQsIHtib29sLCB0cnVlfSksCisgIHtQMTYsIG9rfSA9IHdyaXRlKFAxNSwgZmllbGRfZW5kKSwKKyAge1AxNywgb2t9ID0gd3JpdGUoUDE2LCBmaWVsZF9zdG9wKSwKKyAge1AxOCwgb2t9ID0gd3JpdGUoUDE3LCBzdHJ1Y3RfZW5kKSwKKyAge1AxOSwgb2t9ID0gd3JpdGUoUDE4LCBtZXNzYWdlX2VuZCksCisKKyAge1AyMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57IG5hbWUgPSAiTWVzc2FnZTEiLCB0eXBlID0gP3RUeXBlX0k4LCBzZXFpZCA9IDN9fSA9IHJlYWQoUDE5LCBtZXNzYWdlX2JlZ2luKSwKKyAge1AyMSwgb2t9ID0gcmVhZChQMjAsIHN0cnVjdF9iZWdpbiksCisgIHtQMjIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0IH19ID0gcmVhZChQMjEsIGZpZWxkX2JlZ2luKSwKKyAge1AyMywge29rLCB0cnVlfX0gPSByZWFkKFAyMiwgYm9vbCksCisgIHtQMjQsIG9rfSA9IHJlYWQoUDIzLCBmaWVsZF9lbmQpLAorCisgIHtQMjUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjggfX0gPSByZWFkKFAyNCwgZmllbGRfYmVnaW4pLAorICB7UDI2LCBva30gPSByZWFkKFAyNSwgc3RydWN0X2JlZ2luKSwKKyAge1AyNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMzAwMDAgfX0gPSByZWFkKFAyNiwgZmllbGRfYmVnaW4pLAorICB7UDI4LCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyNywgYm9vbCksCisgIHtQMjksIG9rfSA9IHJlYWQoUDI4LCBmaWVsZF9lbmQpLAorICB7UDMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDI5LCBmaWVsZF9iZWdpbiksCisgIHtQMzEsIG9rfSA9IHJlYWQoUDMwLCBzdHJ1Y3RfZW5kKSwKKyAge1AzMiwgb2t9ID0gcmVhZChQMzEsIGZpZWxkX2VuZCksCisKKyAge1AzMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDIgfX0gPSByZWFkKFAzMiwgZmllbGRfYmVnaW4pLAorICB7UDM0LCB7b2ssIHRydWV9fSA9IHJlYWQoUDMzLCBib29sKSwKKyAge1AzNSwgb2t9ID0gcmVhZChQMzQsIGZpZWxkX2VuZCksCisgIHtQMzYsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVE9QIH19ID0gcmVhZChQMzUsIGZpZWxkX2JlZ2luKSwKKyAge1AzNywgb2t9ID0gcmVhZChQMzYsIHN0cnVjdF9lbmQpLAorICB7UDM4LCBva30gPSByZWFkKFAzNywgbWVzc2FnZV9lbmQpLAorICB7UDM4LCBva30uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDIxMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhGaWxlKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUpLgorbmV3KEZpbGUsIE9wdHMpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gcmVhZCBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgcmVhZH1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3ttb2RlLCB3cml0ZX1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gc2hvdWxkX2Nsb3NlIHRydWUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSBmYWxzZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIGZhbHNlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIGZhbHNlfV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZChGaWxlLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZF9leGFjdChGaWxlLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKEZpbGUsIERhdGEpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDp3cml0ZShGaWxlLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgd3JpdGUsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIHdyaXRlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZmlsZSwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChmaWxlLCBzeW5jLCBmdW4oX0ZpbGUpIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7ImZsdXNoIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICBmbHVzaCh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsNDA0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCB7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sPDwiaGFsbG8gd29ybGQiPj5dLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtlcnJvciwgZW9mfQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDp3cml0ZShGcmFtZWQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIFsKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCBbPDwwLCAwLCAwLCAxMT4+LCA8PCJoYWxsbyB3b3JsZCI+Pl1dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICBbXSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICB7e3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2ZyYW1lZCwKKyAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgW10sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCituZXcoRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KERhdGEpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgW119fX0sCisgICAgICBuZXcoKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8Pj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDw+Pl19fX0sCisgICAgICBuZXcoPDw+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBbXSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KFtdKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8XCJoYWxsbyB3b3JsZFwiPj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfX19LAorICAgICAgbmV3KDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIFwiaGFsbG8gd29ybGRcIiIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9fX0sCisgICAgICBuZXcoImhhbGxvIHdvcmxkIikKKyAgICApfQorICBdLgorCisKK3JlYWQoTWVtYnVmZmVyLCBCeXRlcykgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChNZW1idWZmZXIsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCA2NTUzNikKKyAgICApfQorICBdLgorCisKK3dyaXRlKE1lbWJ1ZmZlciwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoTWVtYnVmZmVyLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIFtdXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFsiaGFsbG8gd29ybGQiLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PD4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sICJoYWxsbyB3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgIndvcmxkIikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIDw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sIDw8IndvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgWyJoYWxsbyIsICIgIl19LCA8PCJ3b3JsZCI+PikKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9tZW1idWZmZXIsIFtdfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X21lbWJ1ZmZlciwgX30sIG9rfSwKKyAgICBjbG9zZSh7dF9tZW1idWZmZXIsIFtdfSkKKyAgKX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzBmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxOTkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhTb2NrZXQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQpLgorbmV3KFNvY2tldCwgT3B0cykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQpCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggbm8gb3B0aW9ucyIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW10pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW50ZWdlciB0aW1lb3V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDUwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFt7cmVjdl90aW1lb3V0LCA1MDAwfV0pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW5maW5pdHkgdGltZW91dCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCBpbmZpbml0eSwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW3tyZWN2X3RpbWVvdXQsIGluZmluaXR5fV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWQoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgMCwgXykgLT4ge29rLCBCaW59IGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIF99LCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PD4+fSwge29rLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCA2IGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8IndvcmxkIj4+fSwge29rLCA8PCJoYWxsbyAiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNjU1MzYpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgTiwgXykgLT4KKyAgICAgICAgY2FzZSBOIG9mCisgICAgICAgICAgMCAtPiB7b2ssIEJpbn07CisgICAgICAgICAgMSAtPiB7b2ssIDw8ImgiPj59OworICAgICAgICAgIE4gd2hlbiBOID4gMiAtPiB7ZXJyb3IsIHRpbWVvdXR9CisgICAgICAgIGVuZAorICAgICAgZW5kKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsicmVhZF9leGFjdCB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBffSwge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCAxIGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8iPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDYgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7b2ssIDw8Im1vcmUgaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8iPj4sIDYwMDAwLCA8PCJtb3JlICI+Pn0sIDYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCBhIHppbGxpb24gYnl0ZXMgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImhhbGxvIj4+fSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDY1NTM2KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKword3JpdGUoU29ja2V0LCBEYXRhKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDp3cml0ZShTb2NrZXQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBzZW5kLCBmdW4oXywgXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgW10pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCA8PD4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgImhhbGxvIHdvcmxkIikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgIGZsdXNoKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIGNsb3NlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE4Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNDkgQEAKKy1tb2R1bGUgKHRocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlICgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKworcGFyc2VfaGFuZGxlcl9vcHRpb25zX3Rlc3RfKCkgLT4KKyAgICBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0ID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgTWlzc2luZ0Vycm9ySGFuZGxlck9wdGlvbkxpc3QgICA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgV3JvbmdTZXJ2aWNlMkhhbmRsZXJPcHRpb25MaXN0ICA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgIk1vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7J3NlcnZpY2UxJywgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgQ29ycmVjdEhhbmRsZXJUZXN0RnVuY3Rpb24gPSBmdW4oKSAtPgorICAgICAgICA/YXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSksCisgICAgICAgIHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sIEhhbmRsZXJMaXN0LF8sXyxfLF8sXyxfLF8sXyxfLF99ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBIYW5kbGVyTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBIYW5kbGVyTW9kdWxlfSB3aGVuIGlzX2F0b20oSGFuZGxlck1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBIYW5kbGVyTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdCkKKyAgICBlbmQsCisgICAgWworICAgICB7IkJhZCBhcmd1bWVudCBmb3IgdGhlIGhhbmRsZXIgb3B0aW9uIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIHR3aWNlIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX0sIHtoYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiUGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIGFzIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UgaGFuZGxlciIsID9fYXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyw/TU9EVUxFLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX1dKSl9LAorICAgICB7Ik5vIGVycm9yIGhhbmRsZXIgd2FzIGRlZmluZWQiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBNaXNzaW5nRXJyb3JIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBoYW5kbGVyIG1vZHVsZSBmb3IgU2VydmljZTIiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBXcm9uZ1NlcnZpY2UySGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3QgaGFuZGxlciBvcHRpb24gbGlzdCIsIENvcnJlY3RIYW5kbGVyVGVzdEZ1bmN0aW9ufQorICAgIF0uCisKK3BhcnNlX3NlcnZpY2Vfb3B0aW9uc190ZXN0XygpIC0+CisgICAgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0ID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBXcm9uZ1NlcnZpY2UyTW9kdWxlT3B0aW9uTGlzdCAgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgInRocmlmdF9zZXJ2aWNlX21vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3snc2VydmljZTEnLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBDb3JyZWN0U2VydmljZU1vZHVsZVRlc3RGdW5jdGlvbiA9IGZ1bigpIC0+CisgICAgICAgID9hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSkpLAorICAgICAgICB7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXywgU2VydmljZU1vZHVsZUxpc3QsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBTZXJ2aWNlTW9kdWxlfSB3aGVuIGlzX2F0b20oU2VydmljZU1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0KQorICAgIGVuZCwKKyAgICBbCisgICAgIHsiQmFkIGFyZ3VtZW50IGZvciB0aGUgc2VydmljZSBvcHRpb24iLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBbXX1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSB0aGUgc2VydmljZSBvcHRpb24gdHdpY2UiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCA/TU9EVUxFfSwge3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlBhcnNlIGEgc2VydmljZSBtb2R1bGUgZm9yIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UiLCA/X2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLD9NT0RVTEUsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsID9NT0RVTEV9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBtb2R1bGUgZm9yIFNlcnZpY2UyIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlMk1vZHVsZU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3Qgc2VydmljZSBvcHRpb24gbGlzdCIsIENvcnJlY3RTZXJ2aWNlTW9kdWxlVGVzdEZ1bmN0aW9ufQorICAgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybApAQCAtMCwwICsxLDY0MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKyUgZG9uJ3QgcmVuYW1lIHRoaXMgdGhyaWZ0X3Rlc3QsIGl0IGNsb2JiZXJzIGdlbmVyYXRlZCBmaWxlcworLW1vZHVsZSh0aHJpZnRfdGVzdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworY29uc3RhbnRfdGVzdF8oKSAtPgorICBbCisgICAgeyJteU51bWJlcnogZXF1YWxzIDEiLCA/X2Fzc2VydEVxdWFsKDEsID9USFJJRlRfVEVTVF9NWU5VTUJFUlopfQorICBdLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IkJvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9uaycsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb25rJ3ttZXNzYWdlPW51bGwsdHlwZT1udWxsfQorICAgICl9LAorICAgIHsiQm9vbHMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9vbHMnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9vbHMne2ltX3RydWU9bnVsbCxpbV9mYWxzZT1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdCcsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZz1udWxsLGJ5dGVfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0MicsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3tieXRlX3RoaW5nPW51bGwsc3RydWN0X3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdDMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0Myd7c3RyaW5nX3RoaW5nPW51bGwsY2hhbmdlZD1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiSW5zYW5pdHkgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuSW5zYW5pdHknLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkne3VzZXJNYXA9bnVsbCx4dHJ1Y3RzPW51bGx9CisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZyd7CisgICAgICAgIHN0cmluZ19maWVsZD1udWxsLAorICAgICAgICBzZXRfZmllbGQ9bnVsbCwKKyAgICAgICAgbGlzdF9maWVsZD1udWxsLAorICAgICAgICBiaW5hcnlfZmllbGQ9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiWGNlcHRpb24gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWGNlcHRpb24nLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZT1udWxsLG1lc3NhZ2U9bnVsbH0KKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YY2VwdGlvbjInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGU9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkVtcHR5U3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd9LCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9KX0sCisgICAgeyJPbmVGaWVsZCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuT25lRmllbGQnLCBffSwgIyd0aHJpZnQudGVzdC5PbmVGaWVsZCd7ZmllbGQ9bnVsbH0pfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMScsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJ3tiZWdpbl9pbl9ib3RoPW51bGwsb2xkX3N0cmluZz1udWxsLGVuZF9pbl9ib3RoPW51bGx9CisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7CisgICAgICAgIGJlZ2luX2luX2JvdGg9bnVsbCwKKyAgICAgICAgbmV3aW50PW51bGwsCisgICAgICAgIG5ld2J5dGU9bnVsbCwKKyAgICAgICAgbmV3c2hvcnQ9bnVsbCwKKyAgICAgICAgbmV3bG9uZz1udWxsLAorICAgICAgICBuZXdkb3VibGU9bnVsbCwKKyAgICAgICAgbmV3c3RydWN0PW51bGwsCisgICAgICAgIG5ld2xpc3Q9bnVsbCwKKyAgICAgICAgbmV3c2V0PW51bGwsCisgICAgICAgIG5ld21hcD1udWxsLAorICAgICAgICBuZXdzdHJpbmc9bnVsbCwKKyAgICAgICAgZW5kX2luX2JvdGg9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEne215aW50cz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMid7c3RyaW5ncz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3QnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCd7bWFwX2ZpZWxkPW51bGx9CisgICAgKX0sCisgICAgeyJMYXJnZURlbHRhcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcycsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcyd7CisgICAgICAgIGIxPW51bGwsCisgICAgICAgIGIxMD1udWxsLAorICAgICAgICBiMTAwPW51bGwsCisgICAgICAgIGNoZWNrX3RydWU9bnVsbCwKKyAgICAgICAgYjEwMDA9bnVsbCwKKyAgICAgICAgY2hlY2tfZmFsc2U9bnVsbCwKKyAgICAgICAgdmVydHdvMjAwMD1udWxsLAorICAgICAgICBhX3NldDI1MDA9bnVsbCwKKyAgICAgICAgdmVydHdvMzAwMD1udWxsLAorICAgICAgICBiaWdfbnVtYmVycz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDInLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4Mid7aW50ZWdlcmxpc3Q9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJ3tpbnRlZ2VybGlzdD1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDIneworICAgICAgICBpbnRfc2V0X2xpc3Q9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXQ9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXRfbGlzdD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJMaXN0Qm9ua3MgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0Lkxpc3RCb25rcycsIF99LCAjJ3RocmlmdC50ZXN0Lkxpc3RCb25rcyd7Ym9uaz1udWxsfSl9LAorICAgIHsiTmVzdGVkTGlzdHNCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0Jvbmsne2Jvbms9bnVsbH0KKyAgICApfSwKKyAgICB7IkJvb2xUZXN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvb2xUZXN0JywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvb2xUZXN0J3tiPW51bGwscz1udWxsfQorICAgICl9LAorICAgIHsiU3RydWN0QSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuU3RydWN0QScsIF99LCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne3M9bnVsbH0pfSwKKyAgICB7IlN0cnVjdEIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuU3RydWN0QicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5TdHJ1Y3RCJ3thYT1udWxsLGFiPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJCb25rIGRlZmluaXRpb24gKHNob3J0IHZlcnNpb24pIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd0aHJpZnQudGVzdC5Cb25rJykKKyAgICApfSwKKyAgICB7IkJvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCB0eXBlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9uaycpCisgICAgKX0sCisgICAgeyJCb29scyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgaW1fdHJ1ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgaW1fZmFsc2UsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29scycpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0JykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QyJykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMzIsIGNoYW5nZWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QzJykKKyAgICApfSwKKyAgICB7Ikluc2FuaXR5IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGk2NH0sIHVzZXJNYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX19LCB4dHJ1Y3RzLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5JbnNhbml0eScpCisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX2ZpZWxkLCB1bmRlZmluZWR9LAorICAgICAgICB7Miwgb3B0aW9uYWwsIHtzZXQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19LCBzZXRfZmllbGQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MywgcmVxdWlyZWQsIHtsaXN0LCB7bWFwLAorICAgICAgICAgIHtzZXQsIGkzMn0sCisgICAgICAgICAge21hcCwgaTMyLCB7c2V0LCB7bGlzdCwge21hcCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fSwgc3RyaW5nfX19fQorICAgICAgICB9fSwgbGlzdF9maWVsZCwgW119LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBzdHJpbmcsIGJpbmFyeV9maWVsZCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZycpCisgICAgKX0sCisgICAgeyJYY2VwdGlvbiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uJykKKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uMicpCisgICAgKX0sCisgICAgeyJFbXB0eVN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnKQorICAgICl9LAorICAgIHsiT25lRmllbGQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnfX0sIGZpZWxkLCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk9uZUZpZWxkJykKKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgc3RyaW5nLCBvbGRfc3RyaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEnKQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBpMzIsIG5ld2ludCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYnl0ZSwgbmV3Ynl0ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgaTE2LCBuZXdzaG9ydCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgaTY0LCBuZXdsb25nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBkb3VibGUsIG5ld2RvdWJsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezcsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fSwgbmV3c3RydWN0LCAjJ3RocmlmdC50ZXN0LkJvbmsne319LAorICAgICAgICB7OCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbmV3bGlzdCwgW119LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCB7c2V0LCBpMzJ9LCBuZXdzZXQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpMzJ9LCBuZXdtYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgc3RyaW5nLCBuZXdzdHJpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMicpCisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG15aW50cywgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnKQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBzdHJpbmd9LCBzdHJpbmdzLCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicpCisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7NywgdW5kZWZpbmVkLCB7bWFwLCBzdHJpbmcsIHN0cmluZ30sIG1hcF9maWVsZCwgZGljdDpuZXcoKX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0JykKKyAgICApfSwKKyAgICB7IkxhcmdlRGVsdGFzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMDAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7NTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX3RydWUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAwMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxNTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX2ZhbHNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MjAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28yMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7MjUwMCwgdW5kZWZpbmVkLCB7c2V0LCBzdHJpbmd9LCBhX3NldDI1MDAsIHNldHM6bmV3KCl9LAorICAgICAgICB7MzAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28zMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7NDAwMCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgYmlnX251bWJlcnMsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwgaTMyfX0sIGludGVnZXJsaXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIGkzMn19fSwgaW50ZWdlcmxpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMnKQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzZXQsIGkzMn19LCBpbnRfc2V0X2xpc3QsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fSwgbWFwX2ludF9zdHJzZXQsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7bGlzdCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fX0sIG1hcF9pbnRfc3Ryc2V0X2xpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDInKQorICAgICl9LAorICAgIHsiTGlzdEJvbmtzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RCb25rcycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0JvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX19fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycpCisgICAgKX0sCisgICAgeyJCb29sVGVzdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCBib29sLCBiLCB0cnVlfSwKKyAgICAgICAgezIsIG9wdGlvbmFsLCBzdHJpbmcsIHMsICJ0cnVlIn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29sVGVzdCcpCisgICAgKX0sCisgICAgeyJTdHJ1Y3RBIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCByZXF1aXJlZCwgc3RyaW5nLCBzLCB1bmRlZmluZWR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEEnKQorICAgICl9LAorICAgIHsiU3RydWN0QiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYSwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fSwKKyAgICAgICAgezIsIHJlcXVpcmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYiwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEInKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InRlc3RWb2lkIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Vm9pZCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RWb2lkIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBieXRlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgYnl0ZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJMzIgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGkzMiwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJNjQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGk2NCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGRvdWJsZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgaTMyLCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgc3RyaW5nLCBzdHJpbmd9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgc3RyaW5nLCBzdHJpbmd9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFNldCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3NldCwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzZXQsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFNldCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge2xpc3QsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtsaXN0LCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGkzMn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTMyLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTY0LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgaTMyfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCB7bWFwLCBpMzIsaTMyfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGk2NCwge21hcCwgaTMyLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGJ5dGV9LAorICAgICAgICB7MiwgaTMyfSwKKyAgICAgICAgezMsIGk2NH0sCisgICAgICAgIHs0LCB7bWFwLCBpMTYsIHN0cmluZ319LAorICAgICAgICB7NSwgaTMyfSwKKyAgICAgICAgezYsIGk2NH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgb25ld2F5X3ZvaWQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdnNuLm1rIGIvbGliL2VybC92c24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjQwMDEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC92c24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1USFJJRlRfVlNOPTAuMQpkaWZmIC0tZ2l0IGEvbGliL2dvL01ha2VmaWxlLmFtIGIvbGliL2dvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmE1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaW5zdGFsbDoKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICdUaGUgR28gY2xpZW50IGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCB2aWEgImdvIGdldCIsIHBsZWFzZSBzZWUgL2xpYi9nby9SRUFETUUubWQnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKworY2hlY2stbG9jYWw6CisJR09QQVRIPWBwd2RgICQoR08pIHRlc3QgLXJhY2UgLi90aHJpZnQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIHBrZworCithbGwtbG9jYWw6CisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vdGhyaWZ0CisKK0VYVFJBX0RJU1QgPSBcCisJdGhyaWZ0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9nby9SRUFETUUubWQgYi9saWIvZ28vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmQ1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vUkVBRE1FLm1kCkBAIC0wLDAgKzEsODMgQEAKK1RocmlmdCBHbyBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworVXNpbmcgVGhyaWZ0IHdpdGggR28KKz09PT09PT09PT09PT09PT09PT09CisKK1RocmlmdCBzdXBwb3J0cyBHbyAxLjcrCisKK0luIGZvbGxvd2luZyBHbyBjb252ZW50aW9ucywgd2UgcmVjb21tZW5kIHlvdSB1c2UgdGhlICdnbycgdG9vbCB0byBpbnN0YWxsCitUaHJpZnQgZm9yIGdvLgorCisgICAgJCBnbyBnZXQgZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQvLi4uCisKK1dpbGwgcmV0cmlldmUgYW5kIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuCisKKworQSBub3RlIGFib3V0IG9wdGlvbmFsIGZpZWxkcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgdGhyaWZ0LXRvLUdvIGNvbXBpbGVyIHRyaWVzIHRvIHJlcHJlc2VudCB0aHJpZnQgSURMIHN0cnVjdHMgYXMgR28gc3RydWN0cy4KK1dlIG11c3QgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBzZXQgdG8gdGhlaXIKK2RlZmF1bHQgdmFsdWUgYW5kIG9wdGlvbmFsIHZhbHVlcyB3aGljaCBhcmUgYWN0dWFsbHkgdW5zZXQsIHNvIHRoZSBnZW5lcmF0ZWQKK2NvZGUgcmVwcmVzZW50cyBvcHRpb25hbCBmaWVsZHMgdmlhIHBvaW50ZXJzLgorCitUaGlzIGlzIGdlbmVyYWxseSBpbnR1aXRpdmUgYW5kIHdvcmtzIHdlbGwgbXVjaCBvZiB0aGUgdGltZSwgYnV0IEdvIGRvZXMgbm90CitoYXZlIGEgc3ludGF4IGZvciBjcmVhdGluZyBhIHBvaW50ZXIgdG8gYSBjb25zdGFudCBpbiBhIHNpbmdsZSBleHByZXNzaW9uLiBUaGF0CitpcywgZ2l2ZW4gYSBzdHJ1Y3QgbGlrZQorCisgICAgc3RydWN0IFNvbWVJRExUeXBlIHsKKyAgICAJT3B0aW9uYWxGaWVsZCAqaW50MzIKKyAgICB9CisKKywgdGhlIGZvbGxvd2luZyB3aWxsIG5vdCBjb21waWxlOgorCisgICAgeCA6PSAmU29tZUlETFR5cGV7CisgICAgCU9wdGlvbmFsRmllbGQ6ICYoMyksCisgICAgfQorCisoTm9yIGlzIHRoZXJlIGFueSBvdGhlciBzeW50YXggdGhhdCdzIGJ1aWx0IGluIHRvIHRoZSBsYW5ndWFnZSkKKworQXMgc3VjaCwgd2UgcHJvdmlkZSBzb21lIGhlbHBlcnMgdGhhdCBkbyBqdXN0IHRoaXMgdW5kZXIgbGliL2dvL3RocmlmdC8uIEUuZy4sCisKKyAgICB4IDo9ICZTb21lSURMVHlwZXsKKyAgICAJT3B0aW9uYWxGaWVsZDogdGhyaWZ0LkludDMyUHRyKDMpLAorICAgIH0KKworQW5kIHNvIG9uLiBUaGUgY29kZSBnZW5lcmF0b3IgYWxzbyBjcmVhdGVzIGFuYWxvZ291cyBoZWxwZXJzIGZvciB1c2VyLWRlZmluZWQKK3R5cGVkZWZzIGFuZCBlbnVtcy4KKworQWRkaW5nIGN1c3RvbSB0YWdzIHRvIGdlbmVyYXRlZCBUaHJpZnQgc3RydWN0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgY2FuIGFkZCB0YWdzIHRvIHRoZSBhdXRvLWdlbmVyYXRlZCB0aHJpZnQgc3RydWN0cyB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgIHN0cnVjdCBmb28geworICAgICAgMTogcmVxdWlyZWQgc3RyaW5nIEJhciAoZ28udGFnID0gInNvbWVfdGFnOlwic29tZV90YWdfdmFsdWVcIiIpCisgICAgfQorICAgIAord2hpY2ggd2lsbCBnZW5lcmF0ZToKKworICAgIHR5cGUgRm9vIHN0cnVjdCB7CisgICAgICBCYXIgc3RyaW5nIGB0aHJpZnQ6ImJhciwxLHJlcXVpcmVkIiBzb21lX3RhZzoic29tZV90YWdfdmFsdWUiYAorICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9CaW5hcnlLZXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNiNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhyaWZ0IHByb2R1Y2UgY29tcGlsYWJsZSBjb2RlIGZvciBiaW5hcnkga2V5CitzdHJ1Y3QgdGVzdFN0cnVjdCB7CisgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBiaW5fdG9fc3RyaW5nCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvRG9udEV4cG9ydFJXVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQKK30KKworc3RydWN0IFRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQKKyAgMjogcmVxdWlyZWQgSW5uZXJTdHJ1Y3QgaW5uZXIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0Vycm9yVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjY2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCitzdHJ1Y3QgVGVzdFN0cnVjdCAKK3sKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiBtLAorICAyOiBsaXN0PHN0cmluZz4gbCwKKyAgMzogc2V0PHN0cmluZz4gcywKKyAgNDogaTMyIGkKK30KKworc2VydmljZSBFcnJvclRlc3QgCit7CisgIFRlc3RTdHJ1Y3QgICAgICAgICB0ZXN0U3RydWN0KDE6IFRlc3RTdHJ1Y3QgdGhpbmcpCisgIHN0cmluZyAgICAgICAgICAgICB0ZXN0U3RyaW5nKDE6IHN0cmluZyBzKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4YjNiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCB0YWdnZWQgeworICAgIDE6IHN0cmluZyBzdHJpbmdfdGhpbmcsCisgICAgMjogaTY0IGludF90aGluZyAoZ28udGFnID0gImpzb246XCJpbnRfdGhpbmcsc3RyaW5nXCIiKSwKKyAgICAzOiBvcHRpb25hbCBpNjQgb3B0aW9uYWxfaW50X3RoaW5nCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMwZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IElnbm9yZUluaXRpYWxpc21zVGVzdCB7CisgICAgMTogaTY0IGlkLAorICAgIDI6IGk2NCBteV9pZCwKKyAgICAzOiBpNjQgbnVtX2NwdSwKKyAgICA0OiBpNjQgbnVtX2dwdSwKKyAgICA1OiBpNjQgbXlfSUQsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9JbmNsdWRlc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjYwMzIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCitpbmNsdWRlICJOYW1lc3BhY2VkVGVzdC50aHJpZnQiCisKK2NvbnN0IFRocmlmdFRlc3QuVXNlcklkIFVTRVJJRCA9IDQyCitjb25zdCBOYW1lc3BhY2VkVGVzdC5Vc2VySWQgVVNFUklEMSA9IDQxCitjb25zdCBUaHJpZnRUZXN0Lk1hcFR5cGUgTUFQQ09OU1RBTlQgPSB7J2hlbGxvJzp7fSwgJ2dvb2RuaWdodCc6e319CisKK2NvbnN0IGkzMiBUV08gPSBOYW1lc3BhY2VkVGVzdC5TdHVmZi5UV08KK2NvbnN0IGkzMiBUSFJFRSA9IE5hbWVzcGFjZWRUZXN0LlRIUkVFCisKK3N0cnVjdCB0ZXN0U3RydWN0IHsKKyAgMTogbGlzdDxUaHJpZnRUZXN0Lk51bWJlcno+IGxpc3ROdW1iZXJzCit9CisKK3N0cnVjdCBUZXN0U3RydWN0MiB7CisgIDE6IHRlc3RTdHJ1Y3QgYmxhaCwKKyAgMjogVGhyaWZ0VGVzdC5Vc2VySWQgaWQsCisgIDM6IE5hbWVzcGFjZWRUZXN0LlN0dWZmIHN0dWZmLAorfQorCitzZXJ2aWNlIHRlc3RTZXJ2aWNlIGV4dGVuZHMgVGhyaWZ0VGVzdC5TZWNvbmRTZXJ2aWNlIHsKKyAgVGhyaWZ0VGVzdC5DcmF6eU5lc3RpbmcgZ2V0Q3JhenlOZXN0aW5nKAorICAgIDE6IFRocmlmdFRlc3QuU3RydWN0QSBhLAorICAgIDI6IFRocmlmdFRlc3QuTnVtYmVyeiBudW1iZXJzCisgICkgdGhyb3dzKDE6IFRocmlmdFRlc3QuWGNlcHRpb24gZXJyMSksCisKKyAgdm9pZCBnZXRTb21lVmFsdWVfRE9fTk9UX0NBTEwoKSwKK30KKworc2VydmljZSBFeHRlbmRlZFNlcnZpY2UgZXh0ZW5kcyB0ZXN0U2VydmljZSB7CisgIHZvaWQgZXh0ZW5kZWRNZXRob2QoKSwKKyAgTmFtZXNwYWNlZFRlc3QuU3R1ZmZTdHJ1Y3QgZXh0ZW5kZWRNZXRob2QyKCksCit9CisKK3NlcnZpY2UgRXh0ZW5kZWQyU2VydmljZSBleHRlbmRzIE5hbWVzcGFjZWRUZXN0Lk5hbWVzcGFjZWRTZXJ2aWNlIHsKKyAgdm9pZCBleHRlbmRlZE1ldGhvZDMoKSwKK30KKwordHlwZWRlZiBtYXA8VGhyaWZ0VGVzdC5Vc2VySWQsIG1hcDxOYW1lc3BhY2VkVGVzdC5Vc2VySWQsIGxpc3Q8VGVzdFN0cnVjdDI+ID4gPiBDb21wbGV4TWFwVHlwZQorCitzdHJ1Y3QgQ29tcGxleE1hcFN0cnVjdCB7CisgIDE6IENvbXBsZXhNYXBUeXBlIGNvbXBsZXgsCit9CisKK3NlcnZpY2UgQ29tcGxleE1hcFNlcnZpY2UgeworICBDb21wbGV4TWFwU3RydWN0IHRyYW5zZm9ybU1hcCgxOiBDb21wbGV4TWFwU3RydWN0IGlucHV0KSwKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NmFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBJbml0aWFsaXNtc1Rlc3QgeworICAgIDE6IHN0cmluZyB1c2VyX2lkLAorICAgIDI6IHN0cmluZyBzZXJ2ZXJfdXJsLAorICAgIDM6IHN0cmluZyBpZCwgCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDQ2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVEFSR1MgPSAtb3V0IGdvcGF0aC9zcmMvIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0JChDT01QSUxFUl9FWFRSQUZMQUcpCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKKyMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MworZ29wYXRoOiAkKFRIUklGVCkgJChUSFJJRlRURVNUKSBcCisJCQkJSW5jbHVkZXNUZXN0LnRocmlmdCBcCisJCQkJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKKwkJCQlNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQgXAorCQkJCU9uZXdheVRlc3QudGhyaWZ0IFwKKwkJCQlPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IFwKKwkJCQlSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgXAorCQkJCVNlcnZpY2VzVGVzdC50aHJpZnQgXAorCQkJCUdvVGFnVGVzdC50aHJpZnQgXAorCQkJCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKKwkJCQlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAorCQkJCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCQkJCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAorCQkJCUVycm9yVGVzdC50aHJpZnQgXAorCQkJCU5hbWVzVGVzdC50aHJpZnQgXAorCQkJCUluaXRpYWxpc21zVGVzdC50aHJpZnQgXAorCQkJCURvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0IFwKKwkJCQlkb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBcCisJCQkJSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCW1rZGlyIC1wIGdvcGF0aC9zcmMKKwlncmVwIC12IGxpc3QuKm1hcC4qbGlzdC4qbWFwICQoVEhSSUZUVEVTVCkgfCBncmVwIC12ICdzZXQ8SW5zYW5pdHk+JyA+IFRocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgLXIgSW5jbHVkZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEJpbmFyeUtleVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT25ld2F5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgU2VydmljZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEdvVGFnVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBUeXBlZGVmRmllbGRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkJpbmFyeVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgRXJyb3JUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE5hbWVzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykscmVhZF93cml0ZV9wcml2YXRlIERvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUyksaWdub3JlX2luaXRpYWxpc21zIElnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgZ29wYXRoL3NyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jaworCWxuIC1uZnMgLi4vLi4vLi4vdGhyaWZ0IGdvcGF0aC9zcmMvdGhyaWZ0CisJbG4gLW5mcyAuLi8uLi90ZXN0cyBnb3BhdGgvc3JjL3Rlc3RzCisJY3AgLXIgLi9kb250ZXhwb3J0cnd0ZXN0IGdvcGF0aC9zcmMKKwl0b3VjaCBnb3BhdGgKKworY2hlY2s6IGdvcGF0aAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgYnVpbGQgXAorCQkJCWluY2x1ZGVzdGVzdCBcCisJCQkJYmluYXJ5a2V5dGVzdCBcCisJCQkJc2VydmljZXN0ZXN0IFwKKwkJCQl0eXBlZGVmZmllbGR0ZXN0IFwKKwkJCQlyZWZhbm5vdGF0aW9uZmllbGRzdGVzdCBcCisJCQkJZXJyb3J0ZXN0CVwKKwkJCQluYW1lc3Rlc3QgXAorCQkJCWluaXRpYWxpc21zdGVzdCBcCisJCQkJZG9udGV4cG9ydHJ3dGVzdCBcCisJCQkJaWdub3JlaW5pdGlhbGlzbXN0ZXN0IFwKKwkJCQl1bmlvbmJpbmFyeXRlc3QKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIHRlc3QgdGhyaWZ0IHRlc3RzIGRvbnRleHBvcnRyd3Rlc3QKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ29wYXRoIFRocmlmdFRlc3QudGhyaWZ0IGdlbi1nbworCitjbGllbnQ6IHN0dWJzCisJJChHTykgcnVuIFRlc3RDbGllbnQuZ28KKworRVhUUkFfRElTVCA9IFwKKwlkb250ZXhwb3J0cnd0ZXN0IFwKKwl0ZXN0cyBcCisJQmluYXJ5S2V5VGVzdC50aHJpZnQgXAorCUdvVGFnVGVzdC50aHJpZnQgXAorCUluY2x1ZGVzVGVzdC50aHJpZnQgXAorCU11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBcCisJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKKwlPbmV3YXlUZXN0LnRocmlmdCBcCisJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKKwlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAorCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAorCVNlcnZpY2VzVGVzdC50aHJpZnQgXAorCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKKwlFcnJvclRlc3QudGhyaWZ0IFwKKwlOYW1lc1Rlc3QudGhyaWZ0IFwKKwlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKKwlEb250RXhwb3J0UldUZXN0LnRocmlmdCBcCisJSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjNmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9NdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NlcnZpY2UgRmlyc3QgeworICAgIGk2NCByZXR1cm5PbmUoKTsKK30KKworc2VydmljZSBTZWNvbmQgeworICAgIGk2NCByZXR1cm5Ud28oKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTmFtZXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlOTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBOYW1lc1Rlc3QgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB0eXBlCit9CisKK3NlcnZpY2UgTmFtZUNvbGxpc2lvbk9uZQoreworICAgIHZvaWQgYmxhaEJsYWgoKQorfQorCitzZXJ2aWNlIE5hbWVDb2xsaXNpb25Ud28KK3sKKyAgICB2b2lkIGJsYWhCbGFoKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEwMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTmFtZXNwYWNlZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKKworbmFtZXNwYWNlIGdvIGxpYi5nby50ZXN0Lm5hbWVzcGFjZWR0ZXN0CisKK2VudW0gU3R1ZmYgeworICBPTkUgPSAxLAorICBUV08gPSAyLAorfQorCitjb25zdCBpMzIgVEhSRUUgPSAzOworCit0eXBlZGVmIGk2NCBVc2VySWQKKworc3RydWN0IFN0dWZmU3RydWN0IHsKKyAgMjogU3R1ZmYgc3R1ZmYsCit9CisKK3NlcnZpY2UgTmFtZXNwYWNlZFNlcnZpY2UgeworICBUaHJpZnRUZXN0LlVzZXJJZCBnZXRVc2VySUQoKSwKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9PbmV3YXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQyZjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NlcnZpY2UgT25lV2F5IHsKKyAgICBvbmV3YXkgdm9pZCBoaSgxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgdm9pZCBlbXB0eWZ1bmMoKQorICAgIGk2NCBlY2hvX2ludCgxOiBpNjQgcGFyYW0pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZjMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IHN0cnVjdEEgeworIDE6IHJlcXVpcmVkIGk2NCBzYV9pCit9CisKK3N0cnVjdCBhbGxfb3B0aW9uYWwgeworIDE6IG9wdGlvbmFsIHN0cmluZyBzID0gIkRFRkFVTFQiLAorIDI6IG9wdGlvbmFsIGk2NCBpID0gNDIsCisgMzogb3B0aW9uYWwgYm9vbCBiID0gZmFsc2UsCisgNDogb3B0aW9uYWwgc3RyaW5nIHMyLAorIDU6IG9wdGlvbmFsIGk2NCBpMiwKKyA2OiBvcHRpb25hbCBib29sIGIyLAorIDc6IG9wdGlvbmFsIHN0cnVjdEEgYWEsCisgOTogb3B0aW9uYWwgbGlzdDxpNjQ+IGwsCisgMTA6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsMiA9IFsxLCAyXSwKKyAxMTogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtLAorIDEyOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0yID0gezE6MiwgMzo0fSwKKyAxMzogb3B0aW9uYWwgYmluYXJ5IGJpbiwKKyAxNDogb3B0aW9uYWwgYmluYXJ5IGJpbjIgPSAiYXNkZiIsCit9CisKK3N0cnVjdCBzdHJ1Y3RCIHsKKyAxOiByZXF1aXJlZCBzdHJ1Y3RBIHJlcXVpcmVkX3N0cnVjdF90aGluZworIDI6IG9wdGlvbmFsIHN0cnVjdEEgb3B0aW9uYWxfc3RydWN0X3RoaW5nCit9CisKK3N0cnVjdCBzdHJ1Y3RDIHsKKyAxOiBzdHJpbmcgcywKKyAyOiByZXF1aXJlZCBpMzIgaSwKKyAzOiBvcHRpb25hbCBib29sIGIsCisgNDogcmVxdWlyZWQgc3RyaW5nIHMyLAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjI4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9SZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw1OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBzdHJ1Y3RBIHsKKyAxOiByZXF1aXJlZCBpNjQgc2FfaQorfQorCitzdHJ1Y3QgYWxsX3JlZmVyZW5jZWQgeworIDE6IG9wdGlvbmFsIHN0cmluZyBzID0gIkRFRkFVTFQiIChjcHAucmVmID0gIiIpLAorIDI6IG9wdGlvbmFsIGk2NCBpID0gNDIgKGNwcC5yZWYgPSAiIiksCisgMzogb3B0aW9uYWwgYm9vbCBiID0gZmFsc2UgKGNwcC5yZWYgPSAiIiksCisgNDogb3B0aW9uYWwgc3RyaW5nIHMyIChjcHAucmVmID0gIiIpLAorIDU6IG9wdGlvbmFsIGk2NCBpMiAoY3BwLnJlZiA9ICIiKSwKKyA2OiBvcHRpb25hbCBib29sIGIyIChjcHAucmVmID0gIiIpLAorIDc6IG9wdGlvbmFsIHN0cnVjdEEgYWEgKGNwcC5yZWYgPSAiIiksCisgOTogb3B0aW9uYWwgbGlzdDxpNjQ+IGwgKGNwcC5yZWYgPSAiIiksCisgMTA6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsMiA9IFsxLCAyXSAoY3BwLnJlZiA9ICIiKSwKKyAxMTogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtIChjcHAucmVmID0gIiIpLAorIDEyOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0yID0gezE6MiwgMzo0fSAoY3BwLnJlZiA9ICIiKSwKKyAxMzogb3B0aW9uYWwgYmluYXJ5IGJpbiAoY3BwLnJlZiA9ICIiKSwKKyAxNDogb3B0aW9uYWwgYmluYXJ5IGJpbjIgPSAiYXNkZiIgKGNwcC5yZWYgPSAiIiksCisKKyAxNTogcmVxdWlyZWQgc3RyaW5nIHJlZl9zID0gIkRFRkFVTFQiIChjcHAucmVmID0gIiIpLAorIDE2OiByZXF1aXJlZCBpNjQgcmVmX2kgPSA0MiAoY3BwLnJlZiA9ICIiKSwKKyAxNzogcmVxdWlyZWQgYm9vbCByZWZfYiA9IGZhbHNlIChjcHAucmVmID0gIiIpLAorIDE4OiByZXF1aXJlZCBzdHJpbmcgcmVmX3MyIChjcHAucmVmID0gIiIpLAorIDE5OiByZXF1aXJlZCBpNjQgcmVmX2kyIChjcHAucmVmID0gIiIpLAorIDIwOiByZXF1aXJlZCBib29sIHJlZl9iMiAoY3BwLnJlZiA9ICIiKSwKKyAyMTogcmVxdWlyZWQgc3RydWN0QSByZWZfYWEgKGNwcC5yZWYgPSAiIiksCisgMjI6IHJlcXVpcmVkIGxpc3Q8aTY0PiByZWZfbCAoY3BwLnJlZiA9ICIiKSwKKyAyMzogcmVxdWlyZWQgbGlzdDxpNjQ+IHJlZl9sMiA9IFsxLCAyXSAoY3BwLnJlZiA9ICIiKSwKKyAyNDogcmVxdWlyZWQgbWFwPGk2NCwgaTY0PiByZWZfbSAoY3BwLnJlZiA9ICIiKSwKKyAyNTogcmVxdWlyZWQgbWFwPGk2NCwgaTY0PiByZWZfbTIgPSB7MToyLCAzOjR9IChjcHAucmVmID0gIiIpLAorIDI2OiByZXF1aXJlZCBiaW5hcnkgcmVmX2JpbiAoY3BwLnJlZiA9ICIiKSwKKyAyNzogcmVxdWlyZWQgYmluYXJ5IHJlZl9iaW4yID0gImFzZGYiIChjcHAucmVmID0gIiIpLAorCit9CisKK3N0cnVjdCBzdHJ1Y3RCIHsKKyAxOiByZXF1aXJlZCBzdHJ1Y3RBIHJlcXVpcmVkX3N0cnVjdF90aGluZworIDI6IG9wdGlvbmFsIHN0cnVjdEEgb3B0aW9uYWxfc3RydWN0X3RoaW5nCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApAQCAtMCwwICsxLDcgQEAKK3N0cnVjdCBSZXF1aXJlZEZpZWxkIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKK30KKworc3RydWN0IE90aGVyVGhpbmcgeworICAxOiByZXF1aXJlZCBpMTYgdmFsdWUKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1NlcnZpY2VzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTExIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBXZSBhcmUgb25seSB0ZXN0aW5nIHRoYXQgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIG5vIGNvcnJlY3RuZXNzIGNoZWNraW5nIGlzIGRvbmUKKworZXhjZXB0aW9uIG1vZGVyYXRlX2Rpc2FzdGVyIHsKKyAgMTogaTMyIGVycm9yQ29kZSwKKyAgMjogc3RyaW5nIG1lc3NhZ2UKK30KKworZXhjZXB0aW9uIHRvdGFsX2Rpc2FzdGVyIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UKKyAgMjogb3B0aW9uYWwgYm9vbCBwcmVzaWRlbnRfd2FzX3dva2VuX3VwID0gZmFsc2UKK30KKworc3RydWN0IHN0cnVjdF9hIHsKKyAgMTogcmVxdWlyZWQgaTY0IHdoYXRldmVyCit9CisKK3NlcnZpY2UgYV9zZXJ2IHsKKyAgICB2b2lkIHZvaWRmdW5jKCksCisgICAgdm9pZCB2b2lkX3dpdGhfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgdm9pZCB2b2lkX3dpdGhfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jKCkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmMoKQorICAgIGk2NCBpNjRmdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGk2NCBpNjRmdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmMoKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuYygpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuYygpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICB2b2lkIHZvaWRmdW5jXzFpbnQoMTogaTY0IGkpLAorICAgIHZvaWQgdm9pZF93aXRoXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICB2b2lkIHZvaWRfd2l0aF8yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jXzFpbnQoMTogaTY0IGkpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmNfMWludCgxOiBpNjQgaSkKKyAgICBpNjQgaTY0ZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgaTY0IGk2NGZ1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xaW50KDE6IGk2NCBpKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xaW50KDE6IGk2NCBpKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICB2b2lkIHZvaWRmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSwKKyAgICB2b2lkIHZvaWRfd2l0aF8xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHZvaWQgdm9pZF93aXRoXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgaTY0IGk2NGZ1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBpNjQgaTY0ZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFzdHJ1Y3RfYSgxOiBzdHJ1Y3RfYSBzdCkKKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9UeXBlZGVmRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBlOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgV2UgYXJlIG9ubHkgdGVzdGluZyB0aGF0IGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBubyBjb3JyZWN0bmVzcyBjaGVja2luZyBpcyBkb25lCisKK2VudW0gRGV0YWlscyB7CisgIEV2ZXJ5dGhpbmcgPSAwCisgIFN0YXRlT25seSA9IDEKKyAgU3RhdGVBbmRPcHRpb25zID0gMgorICBTb21ldGhpbmdFbHNlID0gMworfQorCit0eXBlZGVmIGxpc3Q8IERldGFpbHM+ICBEZXRhaWxzV2FudGVkCisKK3N0cnVjdCBCYXNlUmVxdWVzdCB7CisgIDEgOiBvcHRpb25hbCBzdHJpbmcgUmVxdWVzdElECit9CisKK3N0cnVjdCBHZXRNeURldGFpbHMgeworICAxIDogcmVxdWlyZWQgQmFzZVJlcXVlc3QgYmFzZV8KKyAgMiA6IHJlcXVpcmVkIHN0cmluZyBPYmplY3RJRAorICAzIDogb3B0aW9uYWwgRGV0YWlsc1dhbnRlZCBEZXRhaWxzV2FudGVkCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzcxMTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdApAQCAtMCwwICsxLDI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MwordW5pb24gU2FtcGxlIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB1MSwKKyAgMjogYmluYXJ5IHUyLAorICAzOiBsaXN0PHN0cmluZz4gdTMKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1VuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTM0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgT3B0aW9uMSB7Cit9CisKK3N0cnVjdCBPcHRpb24yIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIG5hbWUKK30KKwordW5pb24gRGVzY2VuZGFudCB7CisgIDE6IE9wdGlvbjEgb3B0aW9uMQorICAyOiBPcHRpb24yIG9wdGlvbjIKK30KKworc3RydWN0IFRlc3RTdHJ1Y3QgeworICAxOiBvcHRpb25hbCBEZXNjZW5kYW50IGRlc2NlbmRhbnQgPSB7ICJvcHRpb24xIjoge319Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjc2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZG9udGV4cG9ydHJ3dGVzdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCisvLyBNYWtlIHN1cmUgdGhhdCB0aHJpZnQgZ2VuZXJhdGVzIG5vbi1leHBvcnRlZCByZWFkL3dyaXRlIG1ldGhvZHMgaWYKKy8vIHJlYWRfd3JpdGVfcHJpdmF0ZSBvcHRpb24gaXMgc3BlY2lmaWVkCitmdW5jIFRlc3RSZWFkV3JpdGVNZXRob2RzQXJlUHJpdmF0ZSh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBUaGlzIHdpbGwgb25seSBjb21waWxlIGlmIHJlYWQvd3JpdGUgbWV0aG9kcyBleGlzdAorCXMgOj0gTmV3VGVzdFN0cnVjdCgpCisJXyA9IHMucmVhZAorCV8gPSBzLndyaXRlCisKKwlpcyA6PSBOZXdJbm5lclN0cnVjdCgpCisJXyA9IGlzLnJlYWQKKwlfID0gaXMud3JpdGUKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk2MTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvYmluYXJ5X2tleV90ZXN0LmdvCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJiaW5hcnlrZXl0ZXN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCaW5hcnlNYXBLZXlHZW5lcmF0ZXNTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBiaW5hcnlrZXl0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCS8vVGhpcyB3aWxsIG9ubHkgY29tcGlsZSBpZiBCaW5Ub1N0cmluZyBoYXMgdHlwZSBvZiBtYXBbc3RyaW5nXXN0cmluZworCXMuQmluVG9TdHJpbmcgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVjNGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28KQEAgLTAsMCArMSw4NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImVycm9ydGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorKQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2V0dXAgbW9jayB0byBmYWlsIGF0IGEgY2VydGFpbiBwb3NpdGlvbi4gUmV0dXJuIHRydWUgaWYgcG9zaXRpb24gZXhpc3RzIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmMgcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCAqTW9ja1RQcm90b2NvbCwgZmFpbEF0IGludCwgZmFpbFdpdGggZXJyb3IpIGJvb2wgeworCXZhciBlcnIgZXJyb3IgPSBuaWwKKworCWlmIGZhaWxBdCA9PSAwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA6PSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cnVjdCIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSkuUmV0dXJuKGVycikKKwlpZiBmYWlsQXQgPT0gMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJ1Y3RfYXJncyIpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInRoaW5nIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJVQ1QpLCBpbnQxNigxKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oIlRlc3RTdHJ1Y3QiKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJtIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5NQVApLCBpbnQxNigxKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWFwQmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1hcEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDIpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVMaXN0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTGlzdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDExIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU0VUKSwgaW50MTYoMykpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU2V0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVNldEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDQpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUkzMihpbnQzMigzKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RydWN0IiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oInRlc3RTdHJ1Y3RfYXJncyIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUlVDVCksIGludDE2KDApLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiVGVzdFN0cnVjdCIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIm0iLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lk1BUCksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNYXBCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWFwRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTGlzdEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTGlzdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TRVQpLCBpbnQxNigzKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU2V0QmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTZXRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoNCksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigzKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDUpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0OCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0OSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1MCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJcmV0dXJuIGZhbHNlCit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNldHVwIG1vY2sgdG8gZmFpbCBhdCBhIGNlcnRhaW4gcG9zaXRpb24uIFJldHVybiB0cnVlIGlmIHBvc2l0aW9uIGV4aXN0cyBvdGhlcndpc2UgZmFsc2UuCitmdW5jIHByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sICpNb2NrVFByb3RvY29sLCBmYWlsQXQgaW50LCBmYWlsV2l0aCBlcnJvcikgYm9vbCB7CisJdmFyIGVyciBlcnJvciA9IG5pbAorCisJLy8gTm8gbmVlZCB0byB0ZXN0IGZhaWx1cmUgaW4gdGhpcyBibG9jaywgYmVjYXVzZSBpdCBpcyBjb3ZlcmVkIGluIG90aGVyIHRlc3QgY2FzZXMKKwlsYXN0IDo9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLkFmdGVyKGxhc3QpCisKKwkvLyBSZWFkaW5nIHRoZSBleGNlcHRpb24sIG1pZ2h0IGZhaWwuCisJaWYgZmFpbEF0ID09IDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5FWENFUFRJT04sIGludDMyKDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJtZXNzYWdlIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cmluZygpLlJldHVybigidGVzdCIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigidHlwZSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIodGhyaWZ0LlBST1RPQ09MX0VSUk9SKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKworCXJldHVybiBmYWxzZQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb24odCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb25MZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJCWlmICF3aWxsQ29tcGxldGUgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuUFJPVE9DT0xfRVJST1IgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFBST1RPQ09MX0VSUk9SIGVycm9yIikKKwkJCX0KKwkJCWJyZWFrCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2hMZWdlYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigyKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LkJBRF9TRVFVRU5DRV9JRCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIEJBRF9TRVFVRU5DRV9JRCBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInVua25vd24iLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5XUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFdST05HX01FVEhPRF9OQU1FIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXRob2QgbmFtZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZUxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidW5rbm93biIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5XUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFdST05HX01FVEhPRF9OQU1FIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXNzYWdlIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LklOVkFMSURfVE1FU1NBR0VfVFlQRSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuSU5WQUxJRF9UTUVTU0FHRV9UWVBFLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiBlcnJvciIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzYTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28KQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJlbmNvZGluZyIKKwkiZW5jb2RpbmcvanNvbiIKKwkidGVzdGluZyIKKwkidGhyaWZ0dGVzdCIKKykKKworZnVuYyBUZXN0RW51bUlzVGV4dE1hcnNoYWxsZXIodCAqdGVzdGluZy5UKSB7CisJb25lIDo9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUKKwl2YXIgdG0gZW5jb2RpbmcuVGV4dE1hcnNoYWxlciA9IG9uZQorCWIsIGVyciA6PSB0bS5NYXJzaGFsVGV4dCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20gTWFyc2hhbFRleHQ6ICVzIiwgZXJyKQorCX0KKwlpZiBzdHJpbmcoYikgIT0gb25lLlN0cmluZygpIHsKKwkJdC5FcnJvcmYoIk1hcnNoYWxUZXh0KCVzKSA9ICVzLCBleHBlY3RlZCA9ICVzIiwgb25lLCBiLCBvbmUpCisJfQorfQorCitmdW5jIFRlc3RFbnVtSXNUZXh0VW5tYXJzaGFsbGVyKHQgKnRlc3RpbmcuVCkgeworCXZhciB0bSBlbmNvZGluZy5UZXh0VW5tYXJzaGFsZXIgPSB0aHJpZnR0ZXN0Lk51bWJlcnpQdHIodGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKKwllcnIgOj0gdG0uVW5tYXJzaGFsVGV4dChbXWJ5dGUoIlRXTyIpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIFVubWFyc2hhbFRleHQoVFdPKTogJXMiLCBlcnIpCisJfQorCWlmICoodG0uKCp0aHJpZnR0ZXN0Lk51bWJlcnopKSAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5FcnJvcmYoIlVubWFyc2hhbFRleHQoVFdPKSA9ICVzIiwgdG0pCisJfQorCisJZXJyID0gdG0uVW5tYXJzaGFsVGV4dChbXWJ5dGUoIk5BTiIpKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXJyb3IgZnJvbSBVbm1hcnNoYWxUZXh0KE5BTikiKQorCX0KK30KKworZnVuYyBUZXN0SlNPTk1hcnNoYWxVbm1hcnNoYWwodCAqdGVzdGluZy5UKSB7CisJczEgOj0gdGhyaWZ0dGVzdC5TdHJ1Y3RCeworCQlBYTogJnRocmlmdHRlc3QuU3RydWN0QXtTOiAiQWEifSwKKwkJQWI6ICZ0aHJpZnR0ZXN0LlN0cnVjdEF7UzogIkFiIn0sCisJfQorCisJYiwgZXJyIDo9IGpzb24uTWFyc2hhbChzMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBqc29uLk1hcnNoYWw6ICVzIiwgZXJyKQorCX0KKworCXMyIDo9IHRocmlmdHRlc3QuU3RydWN0Qnt9CisJZXJyID0ganNvbi5Vbm1hcnNoYWwoYiwgJnMyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIGpzb24uVW5tYXJzaGFsOiAlcyIsIGVycikKKwl9CisKKwlpZiAqczEuQWEgIT0gKnMyLkFhIHx8ICpzMS5BYiAhPSAqczIuQWIgeworCQl0LkxvZ2YoInMxID0gJSt2IiwgczEpCisJCXQuTG9nZigiczIgPSAlK3YiLCBzMikKKwkJdC5FcnJvcmYoImpzb246IFVubWFyc2hhbChNYXJzaGFsKHMpKSAhPSBzIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYwNTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiZ290YWd0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3REZWZhdWx0VGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlN0cmluZ1RoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJzdHJpbmdfdGhpbmciIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBkZWZhdWx0IHRhZyB2YWx1ZSIpCisJfQorfQorCitmdW5jIFRlc3RDdXN0b21UYWcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBnb3RhZ3Rlc3QuVGFnZ2Vke30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCWZpZWxkLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiSW50VGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gImludF90aGluZyxzdHJpbmciIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBjdXN0b20gdGFnIHZhbHVlIikKKwl9Cit9CisKK2Z1bmMgVGVzdE9wdGlvbmFsVGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIk9wdGlvbmFsSW50VGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gIm9wdGlvbmFsX2ludF90aGluZyxvbWl0ZW1wdHkiIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBkZWZhdWx0IHRhZyB2YWx1ZSBmb3Igb3B0aW9uYWwgZmllbGQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2lnbm9yZWluaXRpYWxpc21zX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJpZ25vcmVpbml0aWFsaXNtc3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdElnbm9yZUluaXRpYWxpc21zRmxhZ0lzSG9ub3VyZWQodCAqdGVzdGluZy5UKSB7CisJcyA6PSBpZ25vcmVpbml0aWFsaXNtc3Rlc3QuSWdub3JlSW5pdGlhbGlzbXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiSWQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTXlJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlJZCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1DcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUNwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1HcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUdwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJNeV9JRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlfSUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9pbml0aWFsaXNtc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDkyM2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiaW5pdGlhbGlzbXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0Q29tbW9uSW5pdGlhbGlzbXNBcmVGaXhlZCh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGluaXRpYWxpc21zdGVzdC5Jbml0aWFsaXNtc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlVzZXJJRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVXNlcklEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIlNlcnZlclVSTCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiU2VydmVyVVJMIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIklEIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJJRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWM2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QiCisJIm5ldCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCitmdW5jIEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkgbmV0LkFkZHIgeworCWlmIGwsIGVyciA6PSBuZXQuTGlzdGVuKCJ0Y3AiLCAiMTI3LjAuMC4xOjAiKTsgZXJyICE9IG5pbCB7CisJCXBhbmljKCJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorCX0gZWxzZSB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCQlyZXR1cm4gbC5BZGRyKCkKKwl9Cit9CisKK3R5cGUgRmlyc3RJbXBsIHN0cnVjdHt9CisKK2Z1bmMgKGYgKkZpcnN0SW1wbCkgUmV0dXJuT25lKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gMSwgbmlsCit9CisKK3R5cGUgU2Vjb25kSW1wbCBzdHJ1Y3R7fQorCitmdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiAyLCBuaWwKK30KKworZnVuYyBjcmVhdGVUcmFuc3BvcnQoYWRkciBuZXQuQWRkcikgKHRocmlmdC5UVHJhbnNwb3J0LCBlcnJvcikgeworCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiB0cmFuc3BvcnQsIG5pbAorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sRmlyc3QodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiRmlyc3RTZXJ2aWNlIikKKworCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuT25lKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGZpcnN0IHNlcnZlcjoiLCBlcnIpCisJfSBlbHNlIGlmIHJldCAhPSAxIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CisKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xTZWNvbmQodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiU2Vjb25kU2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgc2Vjb25kIHNlcnZlcjoiLCBlcnIpCisJfSBlbHNlIGlmIHJldCAhPSAyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CisKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwkvL2V4cGVjdCBlcnJvciBzaW5jZSBkZWZhdWx0IHByb2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZAorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RpbmcgZXJyb3IiKQorCX0KKworCS8vcmVnaXN0ZXIgZGVmYXVsdCBwcm9jZXNzb3IgYW5kIGNhbGwgYWdhaW4KKwlwcm9jZXNzb3IuUmVnaXN0ZXJEZWZhdWx0KG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KSkKKwl0cmFuc3BvcnQsIGVyciA9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgbGVnYWN5IHNlcnZlcjoiLCBlcnIpCisJfQorCWlmIHJldCAhPSAyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9uYW1lc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI2M2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkibmFtZXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0QXR0cmlidXRlTmFtZVN1YnN0aXR1aW9uRG9lc05vdE9jY3VyKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gbmFtZXN0ZXN0Lk5hbWVzVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiVHlwZSIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVHlwZSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQwYmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbXQiCisJIm5ldCIKKwkib25ld2F5dGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCitmdW5jIGZpbmRQb3J0KCkgbmV0LkFkZHIgeworCWlmIGwsIGVyciA6PSBuZXQuTGlzdGVuKCJ0Y3AiLCAiMTI3LjAuMC4xOjAiKTsgZXJyICE9IG5pbCB7CisJCXBhbmljKCJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorCX0gZWxzZSB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCQlyZXR1cm4gbC5BZGRyKCkKKwl9Cit9CisKK3R5cGUgaW1wbCBzdHJ1Y3R7fQorCitmdW5jIChpICppbXBsKSBIaShjdHggY29udGV4dC5Db250ZXh0LCBpbiBpbnQ2NCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpICAgICAgICB7IGZtdC5QcmludGxuKCJIaSEiKTsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVtcHR5ZnVuYyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVjaG9JbnQoY3R4IGNvbnRleHQuQ29udGV4dCwgcGFyYW0gaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsgcmV0dXJuIHBhcmFtLCBuaWwgfQorCitjb25zdCBUSU1FT1VUID0gdGltZS5TZWNvbmQKKwordmFyIGFkZHIgbmV0LkFkZHIKK3ZhciBzZXJ2ZXIgKnRocmlmdC5UU2ltcGxlU2VydmVyCit2YXIgY2xpZW50ICpvbmV3YXl0ZXN0Lk9uZVdheUNsaWVudAorCitmdW5jIFRlc3RJbml0T25ld2F5KHQgKnRlc3RpbmcuVCkgeworCXZhciBlcnIgZXJyb3IKKwlhZGRyID0gZmluZFBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXByb2Nlc3NvciA6PSBvbmV3YXl0ZXN0Lk5ld09uZVdheVByb2Nlc3NvcigmaW1wbHt9KQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKworCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCit9CisKK2Z1bmMgVGVzdEluaXRPbmV3YXlDbGllbnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50ID0gb25ld2F5dGVzdC5OZXdPbmVXYXlDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RDYWxsT25ld2F5U2VydmVyKHQgKnRlc3RpbmcuVCkgeworCS8vY2FsbCBvbmV3YXkgZnVuY3Rpb24KKwllcnIgOj0gY2xpZW50LkhpKGRlZmF1bHRDdHgsIDEsICIiKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCisJfQorCS8vVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBwcm90b2NvbCBwcm9ibGVtcyB3aXRoIHNpbmdsZSBvbmV3YXkgY2FsbCBzbyB3ZSBjYWxsIGl0IHNlY29uZCB0aW1lCisJaSwgZXJyIDo9IGNsaWVudC5FY2hvSW50KGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCisJfQorCWlmIGkgIT0gNDIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJldHVybmVkIHZhbHVlOiAiLCBpKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZDY2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKwkib3B0aW9uYWxmaWVsZHN0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCispCisKK2Z1bmMgVGVzdElzU2V0UmV0dXJuRmFsc2VPbkNyZWF0aW9uKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJaWYgYW8uSXNTZXRTKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgUyBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEkoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBJIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRTMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIFMyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0STIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBJMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEIyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQjIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRBYSgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEFhIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TCgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEwgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRMMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEwyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TSgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIE0gaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRNMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIE0yIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QmluKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQmluIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QmluMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEJpbjIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9Cit9CisKK2Z1bmMgVGVzdERlZmF1bHRWYWx1ZXNPbkNyZWF0aW9uKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJaWYgYW8uR2V0UygpICE9ICJERUZBVUxUIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBTIiwgYW8uR2V0UygpKQorCX0KKwlpZiBhby5HZXRJKCkgIT0gNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgSSIsIGFvLkdldEkoKSkKKwl9CisJaWYgYW8uR2V0QigpICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIiLCBhby5HZXRCKCkpCisJfQorCWlmIGFvLkdldFMyKCkgIT0gIiIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgUzIiLCBhby5HZXRTMigpKQorCX0KKwlpZiBhby5HZXRJMigpICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgSTIiLCBhby5HZXRJMigpKQorCX0KKwlpZiBhby5HZXRCMigpICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIyIiwgYW8uR2V0QjIoKSkKKwl9CisJaWYgbCA6PSBhby5HZXRMKCk7IGxlbihsKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwiLCBsKQorCX0KKwlpZiBsIDo9IGFvLkdldEwyKCk7IGxlbihsKSAhPSAyIHx8IGxbMF0gIT0gMSB8fCBsWzFdICE9IDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTDIiLCBsKQorCX0KKwkvL0ZJWE1FOiBzaG91bGQgd2UgcmV0dXJuIGVtcHR5IG1hcCBoZXJlPworCWlmIG0gOj0gYW8uR2V0TSgpOyBtICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBNIiwgbSkKKwl9CisJaWYgbSA6PSBhby5HZXRNMigpOyBsZW4obSkgIT0gMiB8fCBtWzFdICE9IDIgfHwgbVszXSAhPSA0IHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0yIiwgbSkKKwl9CisJaWYgYnYgOj0gYW8uR2V0QmluKCk7IGJ2ICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4iLCBidikKKwl9CisJaWYgYnYgOj0gYW8uR2V0QmluMigpOyAhYnl0ZXMuRXF1YWwoYnYsIFtdYnl0ZSgiYXNkZiIpKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4yIiwgYnYpCisJfQorfQorCitmdW5jIFRlc3RJbml0aWFsVmFsdWVzT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLlMgIT0gIkRFRkFVTFQiIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMiLCBhby5TKQorCX0KKwlpZiBhby5JICE9IDQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkiLCBhby5JKQorCX0KKwlpZiBhby5CICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIiLCBhby5CKQorCX0KKwlpZiBhby5TMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgUzIiLCBhby5TMikKKwl9CisJaWYgYW8uSTIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkyIiwgYW8uSTIpCisJfQorCWlmIGFvLkIyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCMiIsIGFvLkIyKQorCX0KKwlpZiBhby5MICE9IG5pbCB8fCBsZW4oYW8uTCkgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBMIiwgYW8uTCkKKwl9CisJaWYgYW8uTDIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwyIiwgYW8uTDIpCisJfQorCWlmIGFvLk0gIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0iLCBhby5NKQorCX0KKwlpZiBhby5NMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTTIiLCBhby5NMikKKwl9CisJaWYgYW8uQmluICE9IG5pbCB8fCBsZW4oYW8uQmluKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEJpbiIsIGFvLkJpbikKKwl9CisJaWYgIWJ5dGVzLkVxdWFsKGFvLkJpbjIsIFtdYnl0ZSgiYXNkZiIpKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4yIiwgYW8uQmluMikKKwl9Cit9CisKK2Z1bmMgVGVzdElzU2V0UmV0dXJuVHJ1ZUFmdGVyVXBkYXRlKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uUyA9ICJzb21ldmFsdWUiCisJYW8uSSA9IDEyMworCWFvLkIgPSB0cnVlCisJYW8uQWEgPSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3U3RydWN0QSgpCisJaWYgIWFvLklzU2V0UygpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIFMgc2hvdWxkIGJlIHNldCIpCisJfQorCWlmICFhby5Jc1NldEkoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBJIHNob3VsZCBiZSBzZXQiKQorCX0KKwlpZiAhYW8uSXNTZXRCKCkgeworCQl0LkVycm9yZigiRmllbGQgQiBzaG91bGQgYmUgc2V0IikKKwl9CisJaWYgIWFvLklzU2V0QWEoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBhYSBzaG91bGQgYmUgc2V0IikKKwl9Cit9CisKK2Z1bmMgVGVzdExpc3ROb3RFbXB0eSh0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkwgPSBbXWludDY0ezEsIDIsIDN9CisJaWYgIWFvLklzU2V0TCgpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIEwgc2hvdWxkIGJlIHNldCIpCisJfQorfQorCisvL01ha2Ugc3VyZSB0aGF0IG9wdGlvbmFsIGZpZWxkcyBhcmUgbm90IGJlaW5nIHNlcmlhbGl6ZWQKK2Z1bmMgVGVzdE5vT3B0aW9uYWxVbnNldEZpZWxkc09uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE5vU2V0VG9EZWZhdWx0RmllbGRzT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5JID0gNDIKKwlhby5Xcml0ZShwcm90bykKK30KKworLy9NYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBmaWVsZCBpcyBiZWluZyBzZXJpYWxpemVkIHdoZW4gc2V0IHRvIG5vbi1kZWZhdWx0CitmdW5jIFRlc3RPbmVJU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lkk2NCksIGludDE2KDIpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMTIzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5JID0gMTIzCisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE9uZUxTZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDkpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVMaXN0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5JNjQpLCAyKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMSkpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUk2NChpbnQ2NCgyKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlTGlzdEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uTCA9IFtdaW50NjR7MSwgMn0KKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0T25lQmluU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImJpbiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMTMpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVCaW5hcnkoW11ieXRlKCJzb21lYnl0ZXN0cmluZyIpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkJpbiA9IFtdYnl0ZSgic29tZWJ5dGVzdHJpbmciKQorCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3RPbmVFbXB0eUJpblNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlQmluYXJ5KFtdYnl0ZXt9KS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkJpbiA9IFtdYnl0ZXt9CisJYW8uV3JpdGUocHJvdG8pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ3YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKKy8vIFNvdXJjZTogdGhyaWZ0IChpbnRlcmZhY2VzOiBUUHJvdG9jb2wpCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwl0aHJpZnQgInRocmlmdCIKKworCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKKy8vIE1vY2sgb2YgVFByb3RvY29sIGludGVyZmFjZQordHlwZSBNb2NrVFByb3RvY29sIHN0cnVjdCB7CisJY3RybCAgICAgKmdvbW9jay5Db250cm9sbGVyCisJcmVjb3JkZXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIKK30KKworLy8gUmVjb3JkZXIgZm9yIE1vY2tUUHJvdG9jb2wgKG5vdCBleHBvcnRlZCkKK3R5cGUgX01vY2tUUHJvdG9jb2xSZWNvcmRlciBzdHJ1Y3QgeworCW1vY2sgKk1vY2tUUHJvdG9jb2wKK30KKworZnVuYyBOZXdNb2NrVFByb3RvY29sKGN0cmwgKmdvbW9jay5Db250cm9sbGVyKSAqTW9ja1RQcm90b2NvbCB7CisJbW9jayA6PSAmTW9ja1RQcm90b2NvbHtjdHJsOiBjdHJsfQorCW1vY2sucmVjb3JkZXIgPSAmX01vY2tUUHJvdG9jb2xSZWNvcmRlcnttb2NrfQorCXJldHVybiBtb2NrCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBFWFBFQ1QoKSAqX01vY2tUUHJvdG9jb2xSZWNvcmRlciB7CisJcmV0dXJuIF9tLnJlY29yZGVyCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIkZsdXNoIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJGbHVzaCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJpbmFyeSIpCisJcmV0MCwgXyA6PSByZXRbMF0uKFtdYnl0ZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkQmluYXJ5KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJpbmFyeSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkQm9vbCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGJvb2wpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJvb2woKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQm9vbCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkQnl0ZSIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDgpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJ5dGUoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQnl0ZSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRG91YmxlKCkgKGZsb2F0NjQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWREb3VibGUiKQorCXJldDAsIF8gOj0gcmV0WzBdLihmbG9hdDY0KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWREb3VibGUoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkRG91YmxlIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgdGhyaWZ0LlRUeXBlLCBpbnQxNiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEZpZWxkQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50MTYpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEZpZWxkQmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkRmllbGRCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRGaWVsZEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEZpZWxkRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEZpZWxkRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRJMTYiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQxNikKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkSTE2KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEkxNiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkSTMyIikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50MzIpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEkzMigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRJMzIiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEk2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEk2NCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDY0KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRJNjQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkSTY0IikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAodGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRMaXN0QmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFR5cGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKGludCkKKwlyZXQyLCBfIDo9IHJldFsyXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTGlzdEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZExpc3RCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZExpc3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRMaXN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZExpc3RFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKHRocmlmdC5UVHlwZSwgdGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNYXBCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHlwZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4odGhyaWZ0LlRUeXBlKQorCXJldDIsIF8gOj0gcmV0WzJdLihpbnQpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1hcEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1hcEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNYXBFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNYXBFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWFwRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAoc3RyaW5nLCB0aHJpZnQuVE1lc3NhZ2VUeXBlLCBpbnQzMiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZE1lc3NhZ2VCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4odGhyaWZ0LlRNZXNzYWdlVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50MzIpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1lc3NhZ2VCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNZXNzYWdlQmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNZXNzYWdlRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWVzc2FnZUVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNZXNzYWdlRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpICh0aHJpZnQuVFR5cGUsIGludCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFNldEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUeXBlKQorCXJldDEsIF8gOj0gcmV0WzFdLihpbnQpCisJcmV0MiwgXyA6PSByZXRbMl0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFNldEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFNldEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTZXRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTZXRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU2V0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU3RyaW5nIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTdHJpbmcoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RyaW5nIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChzdHJpbmcsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTdHJ1Y3RCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU3RydWN0QmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RydWN0QmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFN0cnVjdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFN0cnVjdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTdHJ1Y3RFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgU2tpcChfcGFyYW0wIHRocmlmdC5UVHlwZSkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJTa2lwIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBTa2lwKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlNraXAiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgVHJhbnNwb3J0KCkgdGhyaWZ0LlRUcmFuc3BvcnQgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUcmFuc3BvcnQiKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFRyYW5zcG9ydCkKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFRyYW5zcG9ydCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRyYW5zcG9ydCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUJpbmFyeShfcGFyYW0wIFtdYnl0ZSkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJpbmFyeSIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVCaW5hcnkoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCaW5hcnkiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCb29sKF9wYXJhbTAgYm9vbCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJvb2wiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQm9vbChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJvb2wiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCeXRlKF9wYXJhbTAgaW50OCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJ5dGUiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQnl0ZShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJ5dGUiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVEb3VibGUoX3BhcmFtMCBmbG9hdDY0KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRG91YmxlIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZURvdWJsZShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZURvdWJsZSIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4oX3BhcmFtMCBzdHJpbmcsIF9wYXJhbTEgdGhyaWZ0LlRUeXBlLCBfcGFyYW0yIGludDE2KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRmllbGRCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEsIF9wYXJhbTIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVGaWVsZEJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRCZWdpbiIsIGFyZzAsIGFyZzEsIGFyZzIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUZpZWxkRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUZpZWxkRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVGaWVsZEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVGaWVsZFN0b3AiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRmllbGRTdG9wKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVGaWVsZFN0b3AiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJMTYoX3BhcmFtMCBpbnQxNikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUkxNiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJMTYoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJMTYiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJMzIoX3BhcmFtMCBpbnQzMikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUkzMiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJMzIoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJMzIiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJNjQoX3BhcmFtMCBpbnQ2NCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUk2NCIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJNjQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJNjQiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgaW50KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTGlzdEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUxpc3RCZWdpbihhcmcwLCBhcmcxIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUxpc3RCZWdpbiIsIGFyZzAsIGFyZzEpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTGlzdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVMaXN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVMaXN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgdGhyaWZ0LlRUeXBlLCBfcGFyYW0yIGludCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1hcEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1hcEJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWFwQmVnaW4iLCBhcmcwLCBhcmcxLCBhcmcyKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWFwRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1hcEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWFwRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKF9wYXJhbTAgc3RyaW5nLCBfcGFyYW0xIHRocmlmdC5UTWVzc2FnZVR5cGUsIF9wYXJhbTIgaW50MzIpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNZXNzYWdlQmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTWVzc2FnZUJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWVzc2FnZUJlZ2luIiwgYXJnMCwgYXJnMSwgYXJnMikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNZXNzYWdlRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1lc3NhZ2VFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1lc3NhZ2VFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihfcGFyYW0wIHRocmlmdC5UVHlwZSwgX3BhcmFtMSBpbnQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTZXRCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTZXRCZWdpbihhcmcwLCBhcmcxIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVNldEJlZ2luIiwgYXJnMCwgYXJnMSkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVNldEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTZXRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVNldEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVN0cmluZyhfcGFyYW0wIHN0cmluZykgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cmluZyIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJpbmcoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTdHJpbmciLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihfcGFyYW0wIHN0cmluZykgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cnVjdEJlZ2luIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVN0cnVjdEJlZ2luKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RydWN0QmVnaW4iLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU3RydWN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVN0cnVjdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RydWN0RW5kIikKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmZDljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRocmlmdHRlc3QiCispCisKK2Z1bmMgUnVuU29ja2V0VGVzdFN1aXRlKHQgKnRlc3RpbmcuVCwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LAorCXRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5KSB7CisJLy8gc2VydmVyCisJdmFyIGVyciBlcnJvcgorCWFkZHIgPSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJcHJvY2Vzc29yIDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdFByb2Nlc3NvcihOZXdUaHJpZnRUZXN0SGFuZGxlcigpKQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCXNlcnZlci5MaXN0ZW4oKQorCisJZ28gc2VydmVyLlNlcnZlKCkKKworCS8vIGNsaWVudAorCXZhciB0cmFuc3BvcnQgdGhyaWZ0LlRUcmFuc3BvcnQgPSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCwgZXJyID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXRocmlmdFRlc3RDbGllbnQgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwllcnIgPSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCisJfQorCisJZHJpdmVyIDo9IE5ld1RocmlmdFRlc3REcml2ZXIodCwgdGhyaWZ0VGVzdENsaWVudCkKKwlkcml2ZXIuU3RhcnQoKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUSlNPTlByb3RvY29sCitmdW5jIFRlc3RUSlNPTlByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRCaW5hcnlQcm90b2NvbAorZnVuYyBUZXN0VEJpbmFyeVByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRDb21wYWN0QmluYXJ5UHJvdG9jb2wKK2Z1bmMgVGVzdFRDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDg5MTIpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNDE0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJIm9wdGlvbmFsZmllbGRzdGVzdCIKKwkicmVxdWlyZWRmaWVsZHRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKykKKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9TdWNlY3NzV2hlblNldCh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBjcmVhdGUgYSBuZXcgUmVxdWlyZWRGaWVsZCBpbnN0YW5jZSB3aXRoIHRoZSByZXF1aXJlZCBmaWVsZCBzZXQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7TmFtZTogInRoaXMgaXMgYSB0ZXN0In0KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJEaWQgbm90IGV4cGVjdCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSB0aGUgcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZDogJXYiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RSZXF1aXJlZEZpZWxkX0Vycm9yV2hlbk1pc3NpbmcodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IE90aGVyVGhpbmcgaW5zdGFuY2UsIHdpdGhvdXQgc2V0dGluZyB0aGUgcmVxdWlyZWQgZmllbGQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0Lk90aGVyVGhpbmd7fQorCXNvdXJjZURhdGEsIGVyciA6PSB0aHJpZnQuTmV3VFNlcmlhbGl6ZXIoKS5Xcml0ZShjb250ZXh0LkJhY2tncm91bmQoKSwgc291cmNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiZmFpbGVkIHRvIHNlcmlhbGl6ZSAlVDogJXYiLCBzb3VyY2UsIGVycikKKwl9CisKKwkvLyBhdHRlbXB0IHRvIGRlc2VyaWFsaXplIGludG8gYSBkaWZmZXJlbnQgdHlwZSAod2hpY2ggc2hvdWxkIGZhaWwpCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGRlc2VyaWFsaXplIGFuIG9iamVjdCB3aGljaCBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgZmllbGQiKQorCX0KK30KKworZnVuYyBUZXN0U3RydWN0UmVhZFJlcXVpcmVkRmllbGRzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwl0ZXN0U3RydWN0IDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdTdHJ1Y3RDKCkKKworCS8vIE5vbmUgb2YgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA6PSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gZmFpbCIpCisJfQorCWVycjIsIG9rIDo9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIE9uZSBvZiB0aGUgcmVxdWlyZWQgZmllbGRzIGlzIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiSSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCisJZXJyID0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQorCX0KKwllcnIyLCBvayA9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIEJvdGggb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJzMiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoNCksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJpbmcoKS5SZXR1cm4oInRlc3QiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIHN1Y2NlZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU5YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCXN0ICJzZXJ2aWNlc3Rlc3QiCispCisKKy8vdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQsIGl0IHdpbGwgZmFpbCB0byBjb21waWxlIGlmIGNoZWNrIGlzIGZhaWxlZAorZnVuYyBzdGF0aWNDaGVja1N0cnVjdEFyZ3NSZXN1bHRzKCkgeworCS8vQ2hlY2sgdGhhdCBzdHJ1Y3QgYXJncyBhbmQgcmVzdWx0cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQorCXZhciBzYSAqc3QuU3RydWN0QSA9ICZzdC5TdHJ1Y3RBe30KKwl2YXIgaWZhY2Ugc3QuQVNlcnYKKwl2YXIgZXJyIGVycm9yCisKKwlzYSwgZXJyID0gaWZhY2UuU3RydWN0QUZ1bmNfMXN0cnVjdEEoZGVmYXVsdEN0eCwgc2EpCisJXyA9IGVycgorCV8gPSBzYQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnR0ZXN0IgorKQorCit0eXBlIFRocmlmdFRlc3REcml2ZXIgc3RydWN0IHsKKwljbGllbnQgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0CisJdCAgICAgICp0ZXN0aW5nLlQKK30KKworZnVuYyBOZXdUaHJpZnRUZXN0RHJpdmVyKHQgKnRlc3RpbmcuVCwgY2xpZW50IHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKlRocmlmdFRlc3REcml2ZXIgeworCXJldHVybiAmVGhyaWZ0VGVzdERyaXZlcntjbGllbnQsIHR9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3REcml2ZXIpIFN0YXJ0KCkgeworCWNsaWVudCA6PSBwLmNsaWVudAorCXQgOj0gcC50CisKKwlpZiBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCkgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFZvaWQgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIlRlc3QiKTsgciAhPSAiVGVzdCIgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBzaW1wbGUgdGV4dCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiIik7IHIgIT0gIiIgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBlbXB0eSB0ZXh0IGZhaWxlZCIpCisJfQorCisJc3RyaW5nVGVzdCA6PSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworCQkiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworCQki0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKwkJIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisJCSJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworCQkiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKwkJIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisJCSJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworCQkiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisJCSJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKwkJIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisJCSLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworCQkiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKwkJIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworCQkiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworCQkiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisJCSJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworCQkiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworCQkiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworCQki0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKwkJIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisJCSJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworCQkiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisJCSJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKwkJIkLDom4tbMOibS1nw7osIOeyteiqniIKKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCBzdHJpbmdUZXN0KTsgciAhPSBzdHJpbmdUZXN0IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggYWxsIGxhbmd1YWdlcyBmYWlsZWQiKQorCX0KKworCXNwZWNpYWxDaGFyYWN0ZXJzIDo9ICJxdW90ZTogXCIgYmFja3NsYXNoOiIgKworCQkiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiICsKKwkJIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICdcXFxiXG5cclx0JyIgKworCQkiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKKwkJIiBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcXCIgfX19eyBbW1sgIgorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHNwZWNpYWxDaGFyYWN0ZXJzKTsgciAhPSBzcGVjaWFsQ2hhcmFjdGVycyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNwZWNpYWxDaGFyYWN0ZXJzIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgxKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDApOyByICE9IDAgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKDApIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgtMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMTI3KTsgciAhPSAtMTI3IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgtMTI3KSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCAtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJMzIoLTEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STMyKDEpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC01KTsgciAhPSAtNSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCgtNSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoNSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC0zNDM1OTczODM2OCk7IHIgIT0gLTM0MzU5NzM4MzY4IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KC0zNDM1OTczODM2OCkgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgLTUuMjA5ODUyMyk7IHIgIT0gLTUuMjA5ODUyMyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNS4yMDk4NTIzKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgLTcuMDEyMDUyMTc1MjE1MDQ0KTsgciAhPSAtNy4wMTIwNTIxNzUyMTUwNDQgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3REb3VibGUoLTcuMDEyMDUyMTc1MjE1MDQ0KSBmYWlsZWQiKQorCX0KKworCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCisJb3V0IDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlvdXQuU3RyaW5nVGhpbmcgPSAiWmVybyIKKwlvdXQuQnl0ZVRoaW5nID0gMQorCW91dC5JMzJUaGluZyA9IC0zCisJb3V0Lkk2NFRoaW5nID0gMTAwMDAwMAorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCBvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cnVjdCBmYWlsZWQiKQorCX0KKworCW91dDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QyKCkKKwlvdXQyLkJ5dGVUaGluZyA9IDEKKwlvdXQyLlN0cnVjdFRoaW5nID0gb3V0CisJb3V0Mi5JMzJUaGluZyA9IDUKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIG91dDIpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0MikgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3ROZXN0IGZhaWxlZCIpCisJfQorCisJbWFwb3V0IDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCWZvciBpIDo9IGludDMyKDApOyBpIDwgNTsgaSsrIHsKKwkJbWFwb3V0W2ldID0gaSAtIDEwCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtYXBvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE1hcCBmYWlsZWQiKQorCX0KKworCW1hcFRlc3RJbnB1dCA6PSBtYXBbc3RyaW5nXXN0cmluZ3sKKwkJImEiOiAiMTIzIiwgImEgYiI6ICJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6ICJzYW1lIiwgIjAiOiAibnVtZXJpYyBrZXkiLAorCQkibG9uZ1ZhbHVlIjogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogImxvbmcga2V5IiwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIG1hcFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nTWFwIGZhaWxlZCIpCisJfQorCisJc2V0VGVzdElucHV0IDo9IFtdaW50MzJ7MSwgMiwgM30KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgc2V0VGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIHNldFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTZXQgZmFpbGVkIikKKwl9CisKKwlsaXN0VGVzdCA6PSBbXWludDMyezEsIDIsIDN9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsaXN0VGVzdCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBsaXN0VGVzdCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RMaXN0IGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FKTsgciAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RW51bSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0VHlwZWRlZiBmYWlsZWQiKQorCX0KKworCW1hcE1hcFRlc3QgOj0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwkJNDogIHsxOiAxLCAyOiAyLCAzOiAzLCA0OiA0fSwKKwkJLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgMSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBNYXBUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE1hcE1hcCBmYWlsZWQiKQorCX0KKworCWNyYXp5WDEgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWNyYXp5WDEuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJY3JhenlYMS5CeXRlVGhpbmcgPSA0CisJY3JhenlYMS5JMzJUaGluZyA9IDQKKwljcmF6eVgxLkk2NFRoaW5nID0gNAorCisJY3JhenlYMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJY3JhenlYMi5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJY3JhenlYMi5CeXRlVGhpbmcgPSAyCisJY3JhenlYMi5JMzJUaGluZyA9IDIKKwljcmF6eVgyLkk2NFRoaW5nID0gMgorCisJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7NTogNSwgODogOH0KKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7Y3JhenlYMSwgY3JhenlYMn0KKworCWNyYXp5RW1wdHkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenlFbXB0eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHt9CisJY3JhenlFbXB0eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7fQorCisJaW5zYW5pdHkgOj0gbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHl7CisJCTE6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPOiBjcmF6eSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFOiBjcmF6eX0sCisJCTI6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYOiBjcmF6eUVtcHR5fSwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoZGVmYXVsdEN0eCwgY3JhenkpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgaW5zYW5pdHkpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0SW5zYW5pdHkgZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKTsgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gVEV4Y2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciwgb2sgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIikuKCp0aHJpZnR0ZXN0LlhjZXB0aW9uKTsgb2sgPT0gZmFsc2UgfHwgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gWGNlcHRpb24gZmFpbGVkIikKKwl9IGVsc2UgaWYgZXJyLkVycm9yQ29kZSAhPSAxMDAxIHx8IGVyci5NZXNzYWdlICE9ICJYY2VwdGlvbiIgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJubyBFeGNlcHRpb24iKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gbm8gRXhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDApOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE9uZXdheSBmYWlsZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI5ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJ0aHJpZnQiCisJInRocmlmdHRlc3QiCisJInRpbWUiCispCisKK3R5cGUgU2Vjb25kU2VydmljZUhhbmRsZXIgc3RydWN0IHsKK30KKworZnVuYyBOZXdTZWNvbmRTZXJ2aWNlSGFuZGxlcigpICpTZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisJcmV0dXJuICZTZWNvbmRTZXJ2aWNlSGFuZGxlcnt9Cit9CisKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKwordHlwZSBUaHJpZnRUZXN0SGFuZGxlciBzdHJ1Y3QgeworfQorCitmdW5jIE5ld1RocmlmdFRlc3RIYW5kbGVyKCkgKlRocmlmdFRlc3RIYW5kbGVyIHsKKwlyZXR1cm4gJlRocmlmdFRlc3RIYW5kbGVye30KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RWb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJvb2woY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgYm9vbCkgKHIgYm9vbCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STMyKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdERvdWJsZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJpbmFyeShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKnRocmlmdHRlc3QuWHRydWN0KSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TmVzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QyKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHRocmlmdHRlc3QuTnVtYmVyeikgKHIgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5Vc2VySWQpIChyIHRocmlmdHRlc3QuVXNlcklkLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJciA9IG1ha2UobWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKKwlwb3MgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisJbmVnIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCisJZm9yIGkgOj0gaW50MzIoMSk7IGkgPCA1OyBpKysgeworCQlwb3NbaV0gPSBpCisJCW5lZ1staV0gPSAtaQorCX0KKwlyWzRdID0gcG9zCisJclstNF0gPSBuZWcKKworCXJldHVybiByLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKHIgbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHksIGVyciBlcnJvcikgeworCWhlbGxvIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwloZWxsby5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJaGVsbG8uQnl0ZVRoaW5nID0gMgorCWhlbGxvLkkzMlRoaW5nID0gMgorCWhlbGxvLkk2NFRoaW5nID0gMgorCisJZ29vZGJ5ZSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJZ29vZGJ5ZS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKKwlnb29kYnllLkJ5dGVUaGluZyA9IDQKKwlnb29kYnllLkkzMlRoaW5nID0gNAorCWdvb2RieWUuSTY0VGhpbmcgPSA0CisKKwljcmF6eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eS5Vc2VyTWFwID0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkKQorCWNyYXp5LlVzZXJNYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hUXSA9IDgKKwljcmF6eS5Vc2VyTWFwW3RocmlmdHRlc3QuTnVtYmVyel9GSVZFXSA9IDUKKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7Z29vZGJ5ZSwgaGVsbG99CisKKwlmaXJzdF9tYXAgOj0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCXNlY29uZF9tYXAgOj0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCisJZmlyc3RfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9UV09dID0gY3JhenkKKwlmaXJzdF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFXSA9IGNyYXp5CisKKwlsb29uZXkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJc2Vjb25kX21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYXSA9IGxvb25leQorCisJdmFyIGluc2FuZSA9IG1ha2UobWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisJaW5zYW5lWzFdID0gZmlyc3RfbWFwCisJaW5zYW5lWzJdID0gc2Vjb25kX21hcAorCisJcmV0dXJuIGluc2FuZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBhcmc1IHRocmlmdHRlc3QuVXNlcklkKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCXIgPSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybiByLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworCWlmIGFyZyA9PSAiWGNlcHRpb24iIHsKKwkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKKwkJeC5FcnJvckNvZGUgPSAxMDAxCisJCXguTWVzc2FnZSA9IGFyZworCQlyZXR1cm4geAorCX0gZWxzZSBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHsKKwkJcmV0dXJuIHRocmlmdC5URXhjZXB0aW9uKGVycm9ycy5OZXcoYXJnKSkKKwl9IGVsc2UgeworCQlyZXR1cm4gbmlsCisJfQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlpZiBhcmcwID09ICJYY2VwdGlvbiIgeworCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQorCQl4LkVycm9yQ29kZSA9IDEwMDEKKwkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisJCXJldHVybiBuaWwsIHgKKwl9IGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB7CisJCXgyIDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24yKCkKKwkJeDIuRXJyb3JDb2RlID0gMjAwMgorCQl4Mi5TdHJ1Y3RUaGluZyA9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwkJeDIuU3RydWN0VGhpbmcuU3RyaW5nVGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisJCXJldHVybiBuaWwsIHgyCisJfQorCisJcmVzIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlyZXMuU3RyaW5nVGhpbmcgPSBhcmcxCisJcmV0dXJuIHJlcywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CisJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZTJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ1bmlvbmJpbmFyeXRlc3QiCispCisKKworLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK2Z1bmMgVGVzdFVuaW9uQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXMgOj0gdW5pb25iaW5hcnl0ZXN0Lk5ld1NhbXBsZSgpCisJcy5VMSA9IG1hcFtzdHJpbmddc3RyaW5ne30KKwlzLlUyID0gW11ieXRle30KKwlpZiBuIDo9IHMuQ291bnRTZXRGaWVsZHNTYW1wbGUoKTsgbiAhPSAyIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGVkIDIgc2V0IGZpZWxkcywgZ290ICVkISIsIG4pCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2JmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28KQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uZGVmYXVsdHZhbHVldGVzdCIKKykKKworZnVuYyBUZXN0VW5pb25EZWZhdWx0VmFsdWUodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmRlZmF1bHR2YWx1ZXRlc3QuTmV3VGVzdFN0cnVjdCgpCisJZCA6PSBzLkdldERlc2NlbmRhbnQoKQorCWlmIGQgPT0gbmlsIHsKKwkJdC5FcnJvcigiRGVmYXVsdCBVbmlvbiB2YWx1ZSBub3Qgc2V0ISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ3ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28KQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworY29uc3QgKAorCVVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OICA9IDAKKwlVTktOT1dOX01FVEhPRCAgICAgICAgICAgICAgICAgPSAxCisJSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OID0gMgorCVdST05HX01FVEhPRF9OQU1FICAgICAgICAgICAgICA9IDMKKwlCQURfU0VRVUVOQ0VfSUQgICAgICAgICAgICAgICAgPSA0CisJTUlTU0lOR19SRVNVTFQgICAgICAgICAgICAgICAgID0gNQorCUlOVEVSTkFMX0VSUk9SICAgICAgICAgICAgICAgICA9IDYKKwlQUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA3CispCisKK3ZhciBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlID0gbWFwW2ludDMyXXN0cmluZ3sKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTjogICJ1bmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiIsCisJVU5LTk9XTl9NRVRIT0Q6ICAgICAgICAgICAgICAgICAidW5rbm93biBtZXRob2QiLAorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTjogImludmFsaWQgbWVzc2FnZSB0eXBlIiwKKwlXUk9OR19NRVRIT0RfTkFNRTogICAgICAgICAgICAgICJ3cm9uZyBtZXRob2QgbmFtZSIsCisJQkFEX1NFUVVFTkNFX0lEOiAgICAgICAgICAgICAgICAiYmFkIHNlcXVlbmNlIElEIiwKKwlNSVNTSU5HX1JFU1VMVDogICAgICAgICAgICAgICAgICJtaXNzaW5nIHJlc3VsdCIsCisJSU5URVJOQUxfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBpbnRlcm5hbCBlcnJvciIsCisJUFJPVE9DT0xfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCBlcnJvciIsCit9CisKKy8vIEFwcGxpY2F0aW9uIGxldmVsIFRocmlmdCBleGNlcHRpb24KK3R5cGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGludGVyZmFjZSB7CisJVEV4Y2VwdGlvbgorCVR5cGVJZCgpIGludDMyCisJUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yCisJV3JpdGUob3Byb3QgVFByb3RvY29sKSBlcnJvcgorfQorCit0eXBlIHRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzdHJ1Y3QgeworCW1lc3NhZ2Ugc3RyaW5nCisJdHlwZV8gICBpbnQzMgorfQorCitmdW5jIChlIHRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgRXJyb3IoKSBzdHJpbmcgeworCWlmIGUubWVzc2FnZSAhPSAiIiB7CisJCXJldHVybiBlLm1lc3NhZ2UKKwl9CisJcmV0dXJuIGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbZS50eXBlX10KK30KKworZnVuYyBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8gaW50MzIsIG1lc3NhZ2Ugc3RyaW5nKSBUQXBwbGljYXRpb25FeGNlcHRpb24geworCXJldHVybiAmdEFwcGxpY2F0aW9uRXhjZXB0aW9ue21lc3NhZ2UsIHR5cGVffQorfQorCitmdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFR5cGVJZCgpIGludDMyIHsKKwlyZXR1cm4gcC50eXBlXworfQorCitmdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJLy8gVE9ETzogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKKwlfLCBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCW1lc3NhZ2UgOj0gIiIKKwl0eXBlXyA6PSBpbnQzMihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikKKworCWZvciB7CisJCV8sIHR0eXBlLCBpZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJaWYgdHR5cGUgPT0gU1RPUCB7CisJCQlicmVhaworCQl9CisJCXN3aXRjaCBpZCB7CisJCWNhc2UgMToKKwkJCWlmIHR0eXBlID09IFNUUklORyB7CisJCQkJaWYgbWVzc2FnZSwgZXJyID0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIGVycgorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIGVycgorCQkJCX0KKwkJCX0KKwkJY2FzZSAyOgorCQkJaWYgdHR5cGUgPT0gSTMyIHsKKwkJCQlpZiB0eXBlXywgZXJyID0gaXByb3QuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIGVycgorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIGVycgorCQkJCX0KKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJCWlmIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCXAubWVzc2FnZSA9IG1lc3NhZ2UKKwlwLnR5cGVfID0gdHlwZV8KKworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCWlmIGxlbihwLkVycm9yKCkpID4gMCB7CisJCWVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigibWVzc2FnZSIsIFNUUklORywgMSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCQllcnIgPSBvcHJvdC5Xcml0ZVN0cmluZyhwLkVycm9yKCkpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9CisJZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJ0eXBlIiwgSTMyLCAyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJZXJyID0gb3Byb3QuV3JpdGVJMzIocC50eXBlXykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0MzM1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUQXBwbGljYXRpb25FeGNlcHRpb24odCAqdGVzdGluZy5UKSB7CisJZXhjIDo9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgIiIpCisJaWYgZXhjLkVycm9yKCkgIT0gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl0geworCQl0LkZhdGFsZigiRXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKKwl9CisJaWYgZXhjLlR5cGVJZCgpICE9IFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgVU5LTk9XTiBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQorCX0KKwlleGMgPSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oV1JPTkdfTUVUSE9EX05BTUUsICJqdW5rX21ldGhvZCIpCisJaWYgZXhjLkVycm9yKCkgIT0gImp1bmtfbWV0aG9kIiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCAnanVua19tZXRob2QnIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKKwl9CisJaWYgZXhjLlR5cGVJZCgpICE9IFdST05HX01FVEhPRF9OQU1FIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgV1JPTkdfTUVUSE9EX05BTUUgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyV2JyIsIGV4Yy5UeXBlSWQoKSkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTBiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmluYXJ5IgorCSJlcnJvcnMiCisJImZtdCIKKwkiaW8iCisJIm1hdGgiCispCisKK3R5cGUgVEJpbmFyeVByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgICAgICAgICBUUmljaFRyYW5zcG9ydAorCW9yaWdUcmFuc3BvcnQgVFRyYW5zcG9ydAorCXJlYWRlciAgICAgICAgaW8uUmVhZGVyCisJd3JpdGVyICAgICAgICBpby5Xcml0ZXIKKwlzdHJpY3RSZWFkICAgIGJvb2wKKwlzdHJpY3RXcml0ZSAgIGJvb2wKKwlidWZmZXIgICAgICAgIFs2NF1ieXRlCit9CisKK3R5cGUgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBzdHJ1Y3QgeworCXN0cmljdFJlYWQgIGJvb2wKKwlzdHJpY3RXcml0ZSBib29sCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHQgVFRyYW5zcG9ydCkgKlRCaW5hcnlQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RCaW5hcnlQcm90b2NvbCh0LCBmYWxzZSwgdHJ1ZSkKK30KKworZnVuYyBOZXdUQmluYXJ5UHJvdG9jb2wodCBUVHJhbnNwb3J0LCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSBib29sKSAqVEJpbmFyeVByb3RvY29sIHsKKwlwIDo9ICZUQmluYXJ5UHJvdG9jb2x7b3JpZ1RyYW5zcG9ydDogdCwgc3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlfQorCWlmIGV0LCBvayA6PSB0LihUUmljaFRyYW5zcG9ydCk7IG9rIHsKKwkJcC50cmFucyA9IGV0CisJfSBlbHNlIHsKKwkJcC50cmFucyA9IE5ld1RSaWNoVHJhbnNwb3J0KHQpCisJfQorCXAucmVhZGVyID0gcC50cmFucworCXAud3JpdGVyID0gcC50cmFucworCXJldHVybiBwCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnkoZmFsc2UsIHRydWUpCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeShzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSBib29sKSAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuICZUQmluYXJ5UHJvdG9jb2xGYWN0b3J5e3N0cmljdFJlYWQ6IHN0cmljdFJlYWQsIHN0cmljdFdyaXRlOiBzdHJpY3RXcml0ZX0KK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodCBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2wodCwgcC5zdHJpY3RSZWFkLCBwLnN0cmljdFdyaXRlKQorfQorCisvKioKKyAqIFdyaXRpbmcgTWV0aG9kcworICovCisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJaWYgcC5zdHJpY3RXcml0ZSB7CisJCXZlcnNpb24gOj0gdWludDMyKFZFUlNJT05fMSkgfCB1aW50MzIodHlwZUlkKQorCQllIDo9IHAuV3JpdGVJMzIoaW50MzIodmVyc2lvbikpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVTdHJpbmcobmFtZSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZUkzMihzZXFJZCkKKwkJcmV0dXJuIGUKKwl9IGVsc2UgeworCQllIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZUJ5dGUoaW50OCh0eXBlSWQpKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlSTMyKHNlcUlkKQorCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTE2KGlkKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShTVE9QKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGtleVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVCeXRlKGludDgodmFsdWVUeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChlbGVtVHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCb29sKHZhbHVlIGJvb2wpIGVycm9yIHsKKwlpZiB2YWx1ZSB7CisJCXJldHVybiBwLldyaXRlQnl0ZSgxKQorCX0KKwlyZXR1cm4gcC5Xcml0ZUJ5dGUoMCkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IgeworCWUgOj0gcC50cmFucy5Xcml0ZUJ5dGUoYnl0ZSh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvciB7CisJdiA6PSBwLmJ1ZmZlclswOjJdCisJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50MTYodiwgdWludDE2KHZhbHVlKSkKKwlfLCBlIDo9IHAud3JpdGVyLldyaXRlKHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvciB7CisJdiA6PSBwLmJ1ZmZlclswOjRdCisJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50MzIodiwgdWludDMyKHZhbHVlKSkKKwlfLCBlIDo9IHAud3JpdGVyLldyaXRlKHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJdiA6PSBwLmJ1ZmZlclswOjhdCisJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50NjQodiwgdWludDY0KHZhbHVlKSkKKwlfLCBlcnIgOj0gcC53cml0ZXIuV3JpdGUodikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJcmV0dXJuIHAuV3JpdGVJNjQoaW50NjQobWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU3RyaW5nKHZhbHVlIHN0cmluZykgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUkzMihpbnQzMihsZW4odmFsdWUpKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCV8sIGVyciA6PSBwLnRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUkzMihpbnQzMihsZW4odmFsdWUpKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCV8sIGVyciA6PSBwLndyaXRlci5Xcml0ZSh2YWx1ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLyoqCisgKiBSZWFkaW5nIG1ldGhvZHMKKyAqLworCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlzaXplLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIHR5cGVJZCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIHNpemUgPCAwIHsKKwkJdHlwZUlkID0gVE1lc3NhZ2VUeXBlKHNpemUgJiAweDBmZikKKwkJdmVyc2lvbiA6PSBpbnQ2NChpbnQ2NChzaXplKSAmIFZFUlNJT05fTUFTSykKKwkJaWYgdmVyc2lvbiAhPSBWRVJTSU9OXzEgeworCQkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBmbXQuRXJyb3JmKCJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikpCisJCX0KKwkJbmFtZSwgZSA9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJfQorCQlzZXFJZCwgZSA9IHAuUmVhZEkzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJfQorCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCisJfQorCWlmIHAuc3RyaWN0UmVhZCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZm10LkVycm9yZigiTWlzc2luZyB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4iKSkKKwl9CisJbmFtZSwgZTIgOj0gcC5yZWFkU3RyaW5nQm9keShzaXplKQorCWlmIGUyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlMgorCX0KKwliLCBlMyA6PSBwLlJlYWRCeXRlKCkKKwlpZiBlMyAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTMKKwl9CisJdHlwZUlkID0gVE1lc3NhZ2VUeXBlKGIpCisJc2VxSWQsIGU0IDo9IHAuUmVhZEkzMigpCisJaWYgZTQgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGU0CisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4KK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBzZXFJZCBpbnQxNiwgZXJyIGVycm9yKSB7CisJdCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCXR5cGVJZCA9IFRUeXBlKHQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJaWYgdCAhPSBTVE9QIHsKKwkJc2VxSWQsIGVyciA9IHAuUmVhZEkxNigpCisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCit2YXIgaW52YWxpZERhdGFMZW5ndGggPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoIkludmFsaWQgZGF0YSBsZW5ndGgiKSkKKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa1R5cGUsIHZUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJaywgZSA6PSBwLlJlYWRCeXRlKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJa1R5cGUgPSBUVHlwZShrKQorCXYsIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCXZUeXBlID0gVFR5cGUodikKKwlzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKwlyZXR1cm4ga1R5cGUsIHZUeXBlLCBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJYiwgZSA6PSBwLlJlYWRCeXRlKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJZWxlbVR5cGUgPSBUVHlwZShiKQorCXNpemUzMiwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlpZiBzaXplMzIgPCAwIHsKKwkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoc2l6ZTMyKQorCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWVsZW1UeXBlID0gVFR5cGUoYikKKwlzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKwlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7CisJYiwgZSA6PSBwLlJlYWRCeXRlKCkKKwl2IDo9IHRydWUKKwlpZiBiICE9IDEgeworCQl2ID0gZmFsc2UKKwl9CisJcmV0dXJuIHYsIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXYsIGVyciA6PSBwLnRyYW5zLlJlYWRCeXRlKCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6Ml0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gaW50MTYoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MTYoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJMzIoKSAodmFsdWUgaW50MzIsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjRdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IGludDMyKGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDo4XQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBpbnQ2NChiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDo4XQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBtYXRoLkZsb2F0NjRmcm9tYml0cyhiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCXNpemUsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAiIiwgZQorCX0KKwlpZiBzaXplIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKworCXJldHVybiBwLnJlYWRTdHJpbmdCb2R5KHNpemUpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIGVycm9yKSB7CisJc2l6ZSwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZQorCX0KKwlpZiBzaXplIDwgMCB7CisJCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCisJfQorCisJaXNpemUgOj0gaW50KHNpemUpCisJYnVmIDo9IG1ha2UoW11ieXRlLCBpc2l6ZSkKKwlfLCBlcnIgOj0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQorCXJldHVybiBidWYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgeworCXJldHVybiBwLm9yaWdUcmFuc3BvcnQKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSByZWFkQWxsKGJ1ZiBbXWJ5dGUpIGVycm9yIHsKKwlfLCBlcnIgOj0gaW8uUmVhZEZ1bGwocC5yZWFkZXIsIGJ1ZikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworY29uc3QgcmVhZExpbWl0ID0gMzI3NjgKKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSByZWFkU3RyaW5nQm9keShzaXplIGludDMyKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlpZiBzaXplIDwgMCB7CisJCXJldHVybiAiIiwgbmlsCisJfQorCisJdmFyICgKKwkJYnVmIGJ5dGVzLkJ1ZmZlcgorCQllICAgZXJyb3IKKwkJYiAgIFtdYnl0ZQorCSkKKworCXN3aXRjaCB7CisJY2FzZSBpbnQoc2l6ZSkgPD0gbGVuKHAuYnVmZmVyKToKKwkJYiA9IHAuYnVmZmVyWzpzaXplXSAvLyBhdm9pZHMgYWxsb2NhdGlvbiBmb3Igc21hbGwgcmVhZHMKKwljYXNlIGludChzaXplKSA8IHJlYWRMaW1pdDoKKwkJYiA9IG1ha2UoW11ieXRlLCBzaXplKQorCWRlZmF1bHQ6CisJCWIgPSBtYWtlKFtdYnl0ZSwgcmVhZExpbWl0KQorCX0KKworCWZvciBzaXplID4gMCB7CisJCV8sIGUgPSBpby5SZWFkRnVsbChwLnRyYW5zLCBiKQorCQlidWYuV3JpdGUoYikKKwkJaWYgZSAhPSBuaWwgeworCQkJYnJlYWsKKwkJfQorCQlzaXplIC09IHJlYWRMaW1pdAorCQlpZiBzaXplIDwgcmVhZExpbWl0ICYmIHNpemUgPiAwIHsKKwkJCWIgPSBiWzpzaXplXQorCQl9CisJfQorCXJldHVybiBidWYuU3RyaW5nKCksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MmNjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RSZWFkV3JpdGVCaW5hcnlQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MDIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImNvbnRleHQiCispCisKK3R5cGUgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCXNpemUgaW50Cit9CisKK3R5cGUgVEJ1ZmZlcmVkVHJhbnNwb3J0IHN0cnVjdCB7CisJYnVmaW8uUmVhZFdyaXRlcgorCXRwIFRUcmFuc3BvcnQKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIHAuc2l6ZSksIG5pbAorfQorCitmdW5jIE5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoYnVmZmVyU2l6ZSBpbnQpICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnl7c2l6ZTogYnVmZmVyU2l6ZX0KK30KKworZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCwgYnVmZmVyU2l6ZSBpbnQpICpUQnVmZmVyZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEJ1ZmZlcmVkVHJhbnNwb3J0eworCQlSZWFkV3JpdGVyOiBidWZpby5SZWFkV3JpdGVyeworCQkJUmVhZGVyOiBidWZpby5OZXdSZWFkZXJTaXplKHRyYW5zLCBidWZmZXJTaXplKSwKKwkJCVdyaXRlcjogYnVmaW8uTmV3V3JpdGVyU2l6ZSh0cmFucywgYnVmZmVyU2l6ZSksCisJCX0sCisJCXRwOiB0cmFucywKKwl9Cit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHAudHAuSXNPcGVuKCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBPcGVuKCkgKGVyciBlcnJvcikgeworCXJldHVybiBwLnRwLk9wZW4oKQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIENsb3NlKCkgKGVyciBlcnJvcikgeworCXJldHVybiBwLnRwLkNsb3NlKCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBSZWFkKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLlJlYWRXcml0ZXIuUmVhZChiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuUmVhZGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBXcml0ZShiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLldyaXRlKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAuUmVhZFdyaXRlci5Xcml0ZXIuUmVzZXQocC50cCkKKwl9CisJcmV0dXJuIG4sIGVycgorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlpZiBlcnIgOj0gcC5SZWFkV3JpdGVyLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJCXJldHVybiBlcnIKKwl9CisJcmV0dXJuIHAudHAuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gcC50cC5SZW1haW5pbmdCeXRlcygpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWVjMGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEJ1ZmZlcmVkVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1RCdWZmZXJlZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDEwMjQwKQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2NsaWVudC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc5MWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorKQorCit0eXBlIFRDbGllbnQgaW50ZXJmYWNlIHsKKwlDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvcgorfQorCit0eXBlIFRTdGFuZGFyZENsaWVudCBzdHJ1Y3QgeworCXNlcUlkICAgICAgICBpbnQzMgorCWlwcm90LCBvcHJvdCBUUHJvdG9jb2wKK30KKworLy8gVFN0YW5kYXJkQ2xpZW50IGltcGxlbWVudHMgVENsaWVudCwgYW5kIHVzZXMgdGhlIHN0YW5kYXJkIG1lc3NhZ2UgZm9ybWF0IGZvciBUaHJpZnQuCisvLyBJdCBpcyBub3Qgc2FmZSBmb3IgY29uY3VycmVudCB1c2UuCitmdW5jIE5ld1RTdGFuZGFyZENsaWVudChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCBUUHJvdG9jb2wpICpUU3RhbmRhcmRDbGllbnQgeworCXJldHVybiAmVFN0YW5kYXJkQ2xpZW50eworCQlpcHJvdDogaW5wdXRQcm90b2NvbCwKKwkJb3Byb3Q6IG91dHB1dFByb3RvY29sLAorCX0KK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBTZW5kKGN0eCBjb250ZXh0LkNvbnRleHQsIG9wcm90IFRQcm90b2NvbCwgc2VxSWQgaW50MzIsIG1ldGhvZCBzdHJpbmcsIGFyZ3MgVFN0cnVjdCkgZXJyb3IgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihtZXRob2QsIENBTEwsIHNlcUlkKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IGFyZ3MuV3JpdGUob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBvcHJvdC5GbHVzaChjdHgpCit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgUmVjdihpcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IgeworCXJNZXRob2QsIHJUeXBlSWQsIHJTZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJaWYgbWV0aG9kICE9IHJNZXRob2QgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCBmbXQuU3ByaW50ZigiJXM6IHdyb25nIG1ldGhvZCBuYW1lIiwgbWV0aG9kKSkKKwl9IGVsc2UgaWYgc2VxSWQgIT0gclNlcUlkIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihCQURfU0VRVUVOQ0VfSUQsIGZtdC5TcHJpbnRmKCIlczogb3V0IG9mIG9yZGVyIHNlcXVlbmNlIHJlc3BvbnNlIiwgbWV0aG9kKSkKKwl9IGVsc2UgaWYgclR5cGVJZCA9PSBFWENFUFRJT04geworCQl2YXIgZXhjZXB0aW9uIHRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorCQlpZiBlcnIgOj0gZXhjZXB0aW9uLlJlYWQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCisJCWlmIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCisJCXJldHVybiAmZXhjZXB0aW9uCisJfSBlbHNlIGlmIHJUeXBlSWQgIT0gUkVQTFkgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiwgZm10LlNwcmludGYoIiVzOiBpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsIG1ldGhvZCkpCisJfQorCisJaWYgZXJyIDo9IHJlc3VsdC5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlyZXR1cm4gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIENhbGwoY3R4IGNvbnRleHQuQ29udGV4dCwgbWV0aG9kIHN0cmluZywgYXJncywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlwLnNlcUlkKysKKwlzZXFJZCA6PSBwLnNlcUlkCisKKwlpZiBlcnIgOj0gcC5TZW5kKGN0eCwgcC5vcHJvdCwgc2VxSWQsIG1ldGhvZCwgYXJncyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJLy8gbWV0aG9kIGlzIG9uZXdheQorCWlmIHJlc3VsdCA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCisJcmV0dXJuIHAuUmVjdihwLmlwcm90LCBzZXFJZCwgbWV0aG9kLCByZXN1bHQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbW1vbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU5N2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbwpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKwordHlwZSBtb2NrUHJvY2Vzc29yIHN0cnVjdCB7CisJUHJvY2Vzc0Z1bmMgZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK2Z1bmMgKG0gKm1vY2tQcm9jZXNzb3IpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJcmV0dXJuIG0uUHJvY2Vzc0Z1bmMoaW4sIG91dCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTAwZDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsODEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2JpbmFyeSIKKwkiZm10IgorCSJpbyIKKwkibWF0aCIKKykKKworY29uc3QgKAorCUNPTVBBQ1RfUFJPVE9DT0xfSUQgICAgICAgPSAweDA4MgorCUNPTVBBQ1RfVkVSU0lPTiAgICAgICAgICAgPSAxCisJQ09NUEFDVF9WRVJTSU9OX01BU0sgICAgICA9IDB4MWYKKwlDT01QQUNUX1RZUEVfTUFTSyAgICAgICAgID0gMHgwRTAKKwlDT01QQUNUX1RZUEVfQklUUyAgICAgICAgID0gMHgwNworCUNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1CispCisKK3R5cGUgdENvbXBhY3RUeXBlIGJ5dGUKKworY29uc3QgKAorCUNPTVBBQ1RfQk9PTEVBTl9UUlVFICA9IDB4MDEKKwlDT01QQUNUX0JPT0xFQU5fRkFMU0UgPSAweDAyCisJQ09NUEFDVF9CWVRFICAgICAgICAgID0gMHgwMworCUNPTVBBQ1RfSTE2ICAgICAgICAgICA9IDB4MDQKKwlDT01QQUNUX0kzMiAgICAgICAgICAgPSAweDA1CisJQ09NUEFDVF9JNjQgICAgICAgICAgID0gMHgwNgorCUNPTVBBQ1RfRE9VQkxFICAgICAgICA9IDB4MDcKKwlDT01QQUNUX0JJTkFSWSAgICAgICAgPSAweDA4CisJQ09NUEFDVF9MSVNUICAgICAgICAgID0gMHgwOQorCUNPTVBBQ1RfU0VUICAgICAgICAgICA9IDB4MEEKKwlDT01QQUNUX01BUCAgICAgICAgICAgPSAweDBCCisJQ09NUEFDVF9TVFJVQ1QgICAgICAgID0gMHgwQworKQorCit2YXIgKAorCXR0eXBlVG9Db21wYWN0VHlwZSBtYXBbVFR5cGVddENvbXBhY3RUeXBlCispCisKK2Z1bmMgaW5pdCgpIHsKKwl0dHlwZVRvQ29tcGFjdFR5cGUgPSBtYXBbVFR5cGVddENvbXBhY3RUeXBleworCQlTVE9QOiAgIFNUT1AsCisJCUJPT0w6ICAgQ09NUEFDVF9CT09MRUFOX1RSVUUsCisJCUJZVEU6ICAgQ09NUEFDVF9CWVRFLAorCQlJMTY6ICAgIENPTVBBQ1RfSTE2LAorCQlJMzI6ICAgIENPTVBBQ1RfSTMyLAorCQlJNjQ6ICAgIENPTVBBQ1RfSTY0LAorCQlET1VCTEU6IENPTVBBQ1RfRE9VQkxFLAorCQlTVFJJTkc6IENPTVBBQ1RfQklOQVJZLAorCQlMSVNUOiAgIENPTVBBQ1RfTElTVCwKKwkJU0VUOiAgICBDT01QQUNUX1NFVCwKKwkJTUFQOiAgICBDT01QQUNUX01BUCwKKwkJU1RSVUNUOiBDT01QQUNUX1NUUlVDVCwKKwl9Cit9CisKK3R5cGUgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KKworZnVuYyBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuICZUQ29tcGFjdFByb3RvY29sRmFjdG9yeXt9Cit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorfQorCit0eXBlIFRDb21wYWN0UHJvdG9jb2wgc3RydWN0IHsKKwl0cmFucyAgICAgICAgIFRSaWNoVHJhbnNwb3J0CisJb3JpZ1RyYW5zcG9ydCBUVHJhbnNwb3J0CisKKwkvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorCS8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisJbGFzdEZpZWxkICAgW11pbnQKKwlsYXN0RmllbGRJZCBpbnQKKworCS8vIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorCS8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKwlib29sZWFuRmllbGROYW1lICAgIHN0cmluZworCWJvb2xlYW5GaWVsZElkICAgICAgaW50MTYKKwlib29sZWFuRmllbGRQZW5kaW5nIGJvb2wKKworCS8vIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorCS8vIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorCWJvb2xWYWx1ZSAgICAgICAgICBib29sCisJYm9vbFZhbHVlSXNOb3ROdWxsIGJvb2wKKwlidWZmZXIgICAgICAgICAgICAgWzY0XWJ5dGUKK30KKworLy8gQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbCBnaXZlbiBhIFRUcmFuc3BvcnQKK2Z1bmMgTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSAqVENvbXBhY3RQcm90b2NvbCB7CisJcCA6PSAmVENvbXBhY3RQcm90b2NvbHtvcmlnVHJhbnNwb3J0OiB0cmFucywgbGFzdEZpZWxkOiBbXWludHt9fQorCWlmIGV0LCBvayA6PSB0cmFucy4oVFJpY2hUcmFuc3BvcnQpOyBvayB7CisJCXAudHJhbnMgPSBldAorCX0gZWxzZSB7CisJCXAudHJhbnMgPSBOZXdUUmljaFRyYW5zcG9ydCh0cmFucykKKwl9CisKKwlyZXR1cm4gcAorCit9CisKKy8vCisvLyBQdWJsaWMgV3JpdGluZyBtZXRob2RzLgorLy8KKworLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yIHsKKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoQ09NUEFDVF9QUk9UT0NPTF9JRCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWVyciA9IHAud3JpdGVCeXRlRGlyZWN0KChDT01QQUNUX1ZFUlNJT04gJiBDT01QQUNUX1ZFUlNJT05fTUFTSykgfCAoKGJ5dGUodHlwZUlkKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCV8sIGVyciA9IHAud3JpdGVWYXJpbnQzMihzZXFpZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKQorCXJldHVybiBlCisKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisvLyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKy8vIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCXAubGFzdEZpZWxkID0gYXBwZW5kKHAubGFzdEZpZWxkLCBwLmxhc3RGaWVsZElkKQorCXAubGFzdEZpZWxkSWQgPSAwCisJcmV0dXJuIG5pbAorfQorCisvLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorLy8gdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisvLyBvZiB0aGUgZmllbGQgc3RhY2suCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlwLmxhc3RGaWVsZElkID0gcC5sYXN0RmllbGRbbGVuKHAubGFzdEZpZWxkKS0xXQorCXAubGFzdEZpZWxkID0gcC5sYXN0RmllbGRbOmxlbihwLmxhc3RGaWVsZCktMV0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgeworCWlmIHR5cGVJZCA9PSBCT09MIHsKKwkJLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKwkJcC5ib29sZWFuRmllbGROYW1lLCBwLmJvb2xlYW5GaWVsZElkLCBwLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBuYW1lLCBpZCwgdHJ1ZQorCQlyZXR1cm4gbmlsCisJfQorCV8sIGVyciA6PSBwLndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR5cGVJZCwgaWQsIDB4RkYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFRoZSB3b3JraG9yc2Ugb2Ygd3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisvLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIHR5cGVPdmVycmlkZSBieXRlKSAoaW50LCBlcnJvcikgeworCS8vIHNob3J0IGxhc3RGaWVsZCA9IGxhc3RGaWVsZF8ucG9wKCk7CisKKwkvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisJdmFyIHR5cGVUb1dyaXRlIGJ5dGUKKwlpZiB0eXBlT3ZlcnJpZGUgPT0gMHhGRiB7CisJCXR5cGVUb1dyaXRlID0gYnl0ZShwLmdldENvbXBhY3RUeXBlKHR5cGVJZCkpCisJfSBlbHNlIHsKKwkJdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUKKwl9CisJLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisJZmllbGRJZCA6PSBpbnQoaWQpCisJd3JpdHRlbiA6PSAwCisJaWYgZmllbGRJZCA+IHAubGFzdEZpZWxkSWQgJiYgZmllbGRJZC1wLmxhc3RGaWVsZElkIDw9IDE1IHsKKwkJLy8gd3JpdGUgdGhlbSB0b2dldGhlcgorCQllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSgoZmllbGRJZC1wLmxhc3RGaWVsZElkKTw8NCkgfCB0eXBlVG9Xcml0ZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgZXJyCisJCX0KKwl9IGVsc2UgeworCQkvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCisJCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgZXJyCisJCX0KKwkJZXJyID0gcC5Xcml0ZUkxNihpZCkKKwkJd3JpdHRlbiA9IDEgKyAyCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJfQorCisJcC5sYXN0RmllbGRJZCA9IGZpZWxkSWQKKwkvLyBwLmxhc3RGaWVsZC5QdXNoKGZpZWxkLmlkKTsKKwlyZXR1cm4gd3JpdHRlbiwgbmlsCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsKKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoU1RPUCkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgc2l6ZSA9PSAwIHsKKwkJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDApCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJZXJyID0gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShwLmdldENvbXBhY3RUeXBlKGtleVR5cGUpKTw8NCB8IGJ5dGUocC5nZXRDb21wYWN0VHlwZSh2YWx1ZVR5cGUpKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBXcml0ZSBhIGxpc3QgaGVhZGVyLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJXywgZXJyIDo9IHAud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJXywgZXJyIDo9IHAud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVCb29sKHZhbHVlIGJvb2wpIGVycm9yIHsKKwl2IDo9IGJ5dGUoQ09NUEFDVF9CT09MRUFOX0ZBTFNFKQorCWlmIHZhbHVlIHsKKwkJdiA9IGJ5dGUoQ09NUEFDVF9CT09MRUFOX1RSVUUpCisJfQorCWlmIHAuYm9vbGVhbkZpZWxkUGVuZGluZyB7CisJCS8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorCQlfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChwLmJvb2xlYW5GaWVsZE5hbWUsIEJPT0wsIHAuYm9vbGVhbkZpZWxkSWQsIHYpCisJCXAuYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwkvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZS4KKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlVmFyaW50MzIocC5pbnQzMlRvWmlnemFnKGludDMyKHZhbHVlKSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlVmFyaW50MzIocC5pbnQzMlRvWmlnemFnKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQ2NChwLmludDY0VG9aaWd6YWcodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjhdCisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBtYXRoLkZsb2F0NjRiaXRzKHZhbHVlKSkKKwlfLCBlcnIgOj0gcC50cmFucy5Xcml0ZShidWYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwlfLCBlIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihsZW4odmFsdWUpKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgbGVuKHZhbHVlKSA+IDAgeworCX0KKwlfLCBlID0gcC50cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwlyZXR1cm4gZQorfQorCisvLyBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQmluYXJ5KGJpbiBbXWJ5dGUpIGVycm9yIHsKKwlfLCBlIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihsZW4oYmluKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbihiaW4pID4gMCB7CisJCV8sIGUgPSBwLnRyYW5zLldyaXRlKGJpbikKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vCisvLyBSZWFkaW5nIG1ldGhvZHMuCisvLworCisvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisKKwlwcm90b2NvbElkLCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIHByb3RvY29sSWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1BST1RPQ09MX0lELCBwcm90b2NvbElkKQorCQlyZXR1cm4gIiIsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBlKQorCX0KKworCXZlcnNpb25BbmRUeXBlLCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXZlcnNpb24gOj0gdmVyc2lvbkFuZFR5cGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSworCXR5cGVJZCA9IFRNZXNzYWdlVHlwZSgodmVyc2lvbkFuZFR5cGUgPj4gQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfQklUUykKKwlpZiB2ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTiB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdmVyc2lvbiAlMDJ4IGJ1dCBnb3QgJTAyeCIsIENPTVBBQ1RfVkVSU0lPTiwgdmVyc2lvbikKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGUpCisJCXJldHVybgorCX0KKwlzZXFJZCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCW5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisvLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCXAubGFzdEZpZWxkID0gYXBwZW5kKHAubGFzdEZpZWxkLCBwLmxhc3RGaWVsZElkKQorCXAubGFzdEZpZWxkSWQgPSAwCisJcmV0dXJuCit9CisKKy8vIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisvLyB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSByZWFkIG9mZiB0aGUgd2lyZS4KKwlwLmxhc3RGaWVsZElkID0gcC5sYXN0RmllbGRbbGVuKHAubGFzdEZpZWxkKS0xXQorCXAubGFzdEZpZWxkID0gcC5sYXN0RmllbGRbOmxlbihwLmxhc3RGaWVsZCktMV0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBlcnJvcikgeworCXQsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorCWlmICh0ICYgMHgwZikgPT0gU1RPUCB7CisJCXJldHVybiAiIiwgU1RPUCwgMCwgbmlsCisJfQorCisJLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorCW1vZGlmaWVyIDo9IGludDE2KCh0ICYgMHhmMCkgPj4gNCkKKwlpZiBtb2RpZmllciA9PSAwIHsKKwkJLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorCQlpZCwgZXJyID0gcC5SZWFkSTE2KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0gZWxzZSB7CisJCS8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IHJlYWQgZmllbGQgaWQuCisJCWlkID0gaW50MTYocC5sYXN0RmllbGRJZCkgKyBtb2RpZmllcgorCX0KKwl0eXBlSWQsIGUgOj0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUodCAmIDB4MGYpKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKworCS8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisJaWYgcC5pc0Jvb2xUeXBlKHQpIHsKKwkJLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisJCXAuYm9vbFZhbHVlID0gKGJ5dGUodCkmMHgwZiA9PSBDT01QQUNUX0JPT0xFQU5fVFJVRSkKKwkJcC5ib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisJfQorCisJLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisJcC5sYXN0RmllbGRJZCA9IGludChpZCkKKwlyZXR1cm4KK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQorLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKy8vICJjb3JyZWN0IiB0eXBlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwlzaXplMzIsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlpZiBzaXplMzIgPCAwIHsKKwkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoc2l6ZTMyKQorCisJa2V5QW5kVmFsdWVUeXBlIDo9IGJ5dGUoU1RPUCkKKwlpZiBzaXplICE9IDAgeworCQlrZXlBbmRWYWx1ZVR5cGUsIGVyciA9IHAucmVhZEJ5dGVEaXJlY3QoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWtleVR5cGUsIF8gPSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpCisJdmFsdWVUeXBlLCBfID0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSkKKwlyZXR1cm4KK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJc2l6ZV9hbmRfdHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludCgoc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGYpCisJaWYgc2l6ZSA9PSAxNSB7CisJCXNpemUyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQlyZXR1cm4KKwkJfQorCQlpZiBzaXplMiA8IDAgeworCQkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJCXJldHVybgorCQl9CisJCXNpemUgPSBpbnQoc2l6ZTIpCisJfQorCWVsZW1UeXBlLCBlIDo9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKHNpemVfYW5kX3R5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHAuUmVhZExpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisvLyBhbHJlYWR5IGhhdmUgYmVlbiByZWFkIGR1cmluZyByZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorLy8gcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCByZWFkIGEgYnl0ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCb29sKCkgKHZhbHVlIGJvb2wsIGVyciBlcnJvcikgeworCWlmIHAuYm9vbFZhbHVlSXNOb3ROdWxsIHsKKwkJcC5ib29sVmFsdWVJc05vdE51bGwgPSBmYWxzZQorCQlyZXR1cm4gcC5ib29sVmFsdWUsIG5pbAorCX0KKwl2LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJcmV0dXJuIHYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUsIGVycgorfQorCisvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXYsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCXJldHVybiBpbnQ4KHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlyZXR1cm4gaW50MTYodiksIGVycgorfQorCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJMzIoKSAodmFsdWUgaW50MzIsIGVyciBlcnJvcikgeworCXYsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl2YWx1ZSA9IHAuemlnemFnVG9JbnQzMih2KQorCXJldHVybiB2YWx1ZSwgbmlsCit9CisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKSB7CisJdiwgZSA6PSBwLnJlYWRWYXJpbnQ2NCgpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXZhbHVlID0gcC56aWd6YWdUb0ludDY0KHYpCisJcmV0dXJuIHZhbHVlLCBuaWwKK30KKworLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBlcnJvcikgeworCWxvbmdCaXRzIDo9IHAuYnVmZmVyWzA6OF0KKwlfLCBlIDo9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGxvbmdCaXRzKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIDAuMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBtYXRoLkZsb2F0NjRmcm9tYml0cyhwLmJ5dGVzVG9VaW50NjQobG9uZ0JpdHMpKSwgbmlsCit9CisKKy8vIFJlYWRzIGEgW11ieXRlICh2aWEgcmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJbGVuZ3RoLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbmd0aCA8IDAgeworCQlyZXR1cm4gIiIsIGludmFsaWREYXRhTGVuZ3RoCisJfQorCisJaWYgbGVuZ3RoID09IDAgeworCQlyZXR1cm4gIiIsIG5pbAorCX0KKwl2YXIgYnVmIFtdYnl0ZQorCWlmIGxlbmd0aCA8PSBpbnQzMihsZW4ocC5idWZmZXIpKSB7CisJCWJ1ZiA9IHAuYnVmZmVyWzA6bGVuZ3RoXQorCX0gZWxzZSB7CisJCWJ1ZiA9IG1ha2UoW11ieXRlLCBsZW5ndGgpCisJfQorCV8sIGUgPSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCisJcmV0dXJuIHN0cmluZyhidWYpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworLy8gUmVhZCBhIFtdYnl0ZSBmcm9tIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBlcnJvcikgeworCWxlbmd0aCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgbGVuZ3RoID09IDAgeworCQlyZXR1cm4gW11ieXRle30sIG5pbAorCX0KKwlpZiBsZW5ndGggPCAwIHsKKwkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKKwl9CisKKwlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbmd0aCkKKwlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQorCXJldHVybiBidWYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKGN0eCkpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5vcmlnVHJhbnNwb3J0Cit9CisKKy8vCisvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKKy8vCisKKy8vIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKy8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgKGludCwgZXJyb3IpIHsKKwlpZiBzaXplIDw9IDE0IHsKKwkJcmV0dXJuIDEsIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoaW50MzIoc2l6ZTw8NCkgfCBpbnQzMihwLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpKQorCX0KKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoMHhmMCB8IGJ5dGUocC5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCW0sIGVyciA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIDEgKyBtLCBlcnIKK30KKworLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKy8vIFRPRE8ocG9tYWNrKTogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSB3cml0ZVZhcmludDY0PworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVWYXJpbnQzMihuIGludDMyKSAoaW50LCBlcnJvcikgeworCWkzMmJ1ZiA6PSBwLmJ1ZmZlclswOjVdCisJaWR4IDo9IDAKKwlmb3IgeworCQlpZiAobiAmIF4weDdGKSA9PSAwIHsKKwkJCWkzMmJ1ZltpZHhdID0gYnl0ZShuKQorCQkJaWR4KysKKwkJCS8vIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUobikpOworCQkJYnJlYWsKKwkJCS8vIHJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWkzMmJ1ZltpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKKwkJCWlkeCsrCisJCQkvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKCgobiAmIDB4N0YpIHwgMHg4MCkpKTsKKwkJCXUgOj0gdWludDMyKG4pCisJCQluID0gaW50MzIodSA+PiA3KQorCQl9CisJfQorCXJldHVybiBwLnRyYW5zLldyaXRlKGkzMmJ1ZlswOmlkeF0pCit9CisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVWYXJpbnQ2NChuIGludDY0KSAoaW50LCBlcnJvcikgeworCXZhcmludDY0b3V0IDo9IHAuYnVmZmVyWzA6MTBdCisJaWR4IDo9IDAKKwlmb3IgeworCQlpZiAobiAmIF4weDdGKSA9PSAwIHsKKwkJCXZhcmludDY0b3V0W2lkeF0gPSBieXRlKG4pCisJCQlpZHgrKworCQkJYnJlYWsKKwkJfSBlbHNlIHsKKwkJCXZhcmludDY0b3V0W2lkeF0gPSBieXRlKChuICYgMHg3RikgfCAweDgwKQorCQkJaWR4KysKKwkJCXUgOj0gdWludDY0KG4pCisJCQluID0gaW50NjQodSA+PiA3KQorCQl9CisJfQorCXJldHVybiBwLnRyYW5zLldyaXRlKHZhcmludDY0b3V0WzA6aWR4XSkKK30KKworLy8gQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgaW50NjRUb1ppZ3phZyhsIGludDY0KSBpbnQ2NCB7CisJcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpCit9CisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGludDMyVG9aaWd6YWcobiBpbnQzMikgaW50MzIgeworCXJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZFVpbnQ2NFRvQnl0ZXMobiB1aW50NjQsIGJ1ZiBbXWJ5dGUpIHsKKwliaW5hcnkuTGl0dGxlRW5kaWFuLlB1dFVpbnQ2NChidWYsIG4pCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGZpeGVkSW50NjRUb0J5dGVzKG4gaW50NjQsIGJ1ZiBbXWJ5dGUpIHsKKwliaW5hcnkuTGl0dGxlRW5kaWFuLlB1dFVpbnQ2NChidWYsIHVpbnQ2NChuKSkKK30KKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisvLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVCeXRlRGlyZWN0KGIgYnl0ZSkgZXJyb3IgeworCXJldHVybiBwLnRyYW5zLldyaXRlQnl0ZShiKQorfQorCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlSW50QXNCeXRlRGlyZWN0KG4gaW50KSAoaW50LCBlcnJvcikgeworCXJldHVybiAxLCBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKQorfQorCisvLworLy8gSW50ZXJuYWwgcmVhZGluZyBtZXRob2RzCisvLworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQzMigpIChpbnQzMiwgZXJyb3IpIHsKKwkvLyBpZiB0aGUgd2lyZSBjb250YWlucyB0aGUgcmlnaHQgc3R1ZmYsIHRoaXMgd2lsbCBqdXN0IHRydW5jYXRlIHRoZSBpNjQgd2UKKwkvLyByZWFkIGFuZCBnZXQgdXMgdGhlIHJpZ2h0IHNpZ24uCisJdiwgZXJyIDo9IHAucmVhZFZhcmludDY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgcmVhZFZhcmludDY0KCkgKGludDY0LCBlcnJvcikgeworCXNoaWZ0IDo9IHVpbnQoMCkKKwlyZXN1bHQgOj0gaW50NjQoMCkKKwlmb3IgeworCQliLCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJCXJlc3VsdCB8PSBpbnQ2NChiJjB4N2YpIDw8IHNoaWZ0CisJCWlmIChiICYgMHg4MCkgIT0gMHg4MCB7CisJCQlicmVhaworCQl9CisJCXNoaWZ0ICs9IDcKKwl9CisJcmV0dXJuIHJlc3VsdCwgbmlsCit9CisKKy8vIFJlYWQgYSBieXRlLCB1bmxpa2UgUmVhZEJ5dGUgdGhhdCByZWFkcyBUaHJpZnQtYnl0ZSB0aGF0IGlzIGk4LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgcmVhZEJ5dGVEaXJlY3QoKSAoYnl0ZSwgZXJyb3IpIHsKKwlyZXR1cm4gcC50cmFucy5SZWFkQnl0ZSgpCit9CisKKy8vCisvLyBlbmNvZGluZyBoZWxwZXJzCisvLworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB6aWd6YWdUb0ludDMyKG4gaW50MzIpIGludDMyIHsKKwl1IDo9IHVpbnQzMihuKQorCXJldHVybiBpbnQzMih1Pj4xKSBeIC0obiAmIDEpCit9CisKKy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgemlnemFnVG9JbnQ2NChuIGludDY0KSBpbnQ2NCB7CisJdSA6PSB1aW50NjQobikKKwlyZXR1cm4gaW50NjQodT4+MSkgXiAtKG4gJiAxKQorfQorCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgYnl0ZXNUb0ludDY0KGIgW11ieXRlKSBpbnQ2NCB7CisJcmV0dXJuIGludDY0KGJpbmFyeS5MaXR0bGVFbmRpYW4uVWludDY0KGIpKQorfQorCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgYnl0ZXNUb1VpbnQ2NChiIFtdYnl0ZSkgdWludDY0IHsKKwlyZXR1cm4gYmluYXJ5LkxpdHRsZUVuZGlhbi5VaW50NjQoYikKK30KKworLy8KKy8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworLy8KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgaXNCb29sVHlwZShiIGJ5dGUpIGJvb2wgeworCXJldHVybiAoYiYweDBmKSA9PSBDT01QQUNUX0JPT0xFQU5fVFJVRSB8fCAoYiYweDBmKSA9PSBDT01QQUNUX0JPT0xFQU5fRkFMU0UKK30KKworLy8gR2l2ZW4gYSB0Q29tcGFjdFR5cGUgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKy8vIFRUeXBlIHZhbHVlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZ2V0VFR5cGUodCB0Q29tcGFjdFR5cGUpIChUVHlwZSwgZXJyb3IpIHsKKwlzd2l0Y2ggYnl0ZSh0KSAmIDB4MGYgeworCWNhc2UgU1RPUDoKKwkJcmV0dXJuIFNUT1AsIG5pbAorCWNhc2UgQ09NUEFDVF9CT09MRUFOX0ZBTFNFLCBDT01QQUNUX0JPT0xFQU5fVFJVRToKKwkJcmV0dXJuIEJPT0wsIG5pbAorCWNhc2UgQ09NUEFDVF9CWVRFOgorCQlyZXR1cm4gQllURSwgbmlsCisJY2FzZSBDT01QQUNUX0kxNjoKKwkJcmV0dXJuIEkxNiwgbmlsCisJY2FzZSBDT01QQUNUX0kzMjoKKwkJcmV0dXJuIEkzMiwgbmlsCisJY2FzZSBDT01QQUNUX0k2NDoKKwkJcmV0dXJuIEk2NCwgbmlsCisJY2FzZSBDT01QQUNUX0RPVUJMRToKKwkJcmV0dXJuIERPVUJMRSwgbmlsCisJY2FzZSBDT01QQUNUX0JJTkFSWToKKwkJcmV0dXJuIFNUUklORywgbmlsCisJY2FzZSBDT01QQUNUX0xJU1Q6CisJCXJldHVybiBMSVNULCBuaWwKKwljYXNlIENPTVBBQ1RfU0VUOgorCQlyZXR1cm4gU0VULCBuaWwKKwljYXNlIENPTVBBQ1RfTUFQOgorCQlyZXR1cm4gTUFQLCBuaWwKKwljYXNlIENPTVBBQ1RfU1RSVUNUOgorCQlyZXR1cm4gU1RSVUNULCBuaWwKKwl9CisJcmV0dXJuIFNUT1AsIFRFeGNlcHRpb24oZm10LkVycm9yZigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICV2IiwgdCYweDBmKSkKK30KKworLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGdldENvbXBhY3RUeXBlKHQgVFR5cGUpIHRDb21wYWN0VHlwZSB7CisJcmV0dXJuIHR0eXBlVG9Db21wYWN0VHlwZVt0XQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY3N2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UmVhZFdyaXRlQ29tcGFjdFByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJlYWRXcml0ZVByb3RvY29sVGVzdCh0LCBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7CisJCU5ld1RNZW1vcnlCdWZmZXIoKSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxNjM4NCkpKSwKKwkJTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAorCX0KKworCXpsaWIwLCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgMCkKKwl6bGliNiwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDYpCisJemxpYjksIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLCA5KQorCXRyYW5zcG9ydHMgPSBhcHBlbmQodHJhbnNwb3J0cywgemxpYjAsIHpsaWI2LCB6bGliOSkKKworCWZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJcCA6PSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29udGV4dC5nbyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVjMWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJjb250ZXh0IgorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJsb2ciCispCisKK3R5cGUgVERlYnVnUHJvdG9jb2wgc3RydWN0IHsKKwlEZWxlZ2F0ZSAgVFByb3RvY29sCisJTG9nUHJlZml4IHN0cmluZworfQorCit0eXBlIFREZWJ1Z1Byb3RvY29sRmFjdG9yeSBzdHJ1Y3QgeworCVVuZGVybHlpbmcgVFByb3RvY29sRmFjdG9yeQorCUxvZ1ByZWZpeCAgc3RyaW5nCit9CisKK2Z1bmMgTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHVuZGVybHlpbmcgVFByb3RvY29sRmFjdG9yeSwgbG9nUHJlZml4IHN0cmluZykgKlREZWJ1Z1Byb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuICZURGVidWdQcm90b2NvbEZhY3Rvcnl7CisJCVVuZGVybHlpbmc6IHVuZGVybHlpbmcsCisJCUxvZ1ByZWZpeDogIGxvZ1ByZWZpeCwKKwl9Cit9CisKK2Z1bmMgKHQgKlREZWJ1Z1Byb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gJlREZWJ1Z1Byb3RvY29seworCQlEZWxlZ2F0ZTogIHQuVW5kZXJseWluZy5HZXRQcm90b2NvbCh0cmFucyksCisJCUxvZ1ByZWZpeDogdC5Mb2dQcmVmaXgsCisJfQorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGVJZCwgc2VxaWQpCisJbG9nLlByaW50ZigiJXNXcml0ZU1lc3NhZ2VCZWdpbihuYW1lPSUjdiwgdHlwZUlkPSUjdiwgc2VxaWQ9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVNZXNzYWdlRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWVzc2FnZUVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVN0cnVjdEJlZ2luKG5hbWUpCisJbG9nLlByaW50ZigiJXNXcml0ZVN0cnVjdEJlZ2luKG5hbWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVN0cnVjdEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZVN0cnVjdEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlRmllbGRCZWdpbihuYW1lLCB0eXBlSWQsIGlkKQorCWxvZy5QcmludGYoIiVzV3JpdGVGaWVsZEJlZ2luKG5hbWU9JSN2LCB0eXBlSWQ9JSN2LCBpZCUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBpZCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUZpZWxkRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRmllbGRFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUZpZWxkU3RvcCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUZpZWxkU3RvcCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorCWxvZy5QcmludGYoIiVzV3JpdGVNYXBCZWdpbihrZXlUeXBlPSUjdiwgdmFsdWVUeXBlPSUjdiwgc2l6ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVNYXBFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVNYXBFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTGlzdEJlZ2luKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVMaXN0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTGlzdEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlU2V0QmVnaW4oZWxlbVR5cGU9JSN2LCBzaXplPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU2V0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlU2V0RW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUJvb2wodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUJvb2wodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUJ5dGUodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUJ5dGUodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUkxNih2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlSTE2KHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVJMzIodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUkzMih2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlSTY0KHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVJNjQodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlRG91YmxlKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVEb3VibGUodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU3RyaW5nKHZhbHVlIHN0cmluZykgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJpbmcodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZVN0cmluZyh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVCaW5hcnkodmFsdWUgW11ieXRlKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUJpbmFyeSh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlQmluYXJ5KHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1lc3NhZ2VCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWU9JSN2LCB0eXBlSWQ9JSN2LCBzZXFpZD0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNZXNzYWdlRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRNZXNzYWdlRW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJbmFtZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTdHJ1Y3RCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkU3RydWN0QmVnaW4oKSAobmFtZSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RydWN0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTdHJ1Y3RFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBlcnJvcikgeworCW5hbWUsIHR5cGVJZCwgaWQsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkRmllbGRCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkRmllbGRCZWdpbigpIChuYW1lPSUjdiwgdHlwZUlkPSUjdiwgaWQ9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgaWQsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEZpZWxkRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRGaWVsZEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1hcEJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRNYXBCZWdpbigpIChrZXlUeXBlPSUjdiwgdmFsdWVUeXBlPSUjdiwgc2l6ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWFwRW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWFwRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRNYXBFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWVsZW1UeXBlLCBzaXplLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZExpc3RCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTGlzdEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTGlzdEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwllbGVtVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTZXRCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGU9JSN2LCBzaXplPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFNldEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFNldEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkU2V0RW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRCb29sKCkgKHZhbHVlIGJvb2wsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEJvb2woKQorCWxvZy5QcmludGYoIiVzUmVhZEJvb2woKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQnl0ZSgpICh2YWx1ZSBpbnQ4LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRCeXRlKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCeXRlKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkSTE2KCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRJMTYoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRJMzIoKQorCWxvZy5QcmludGYoIiVzUmVhZEkzMigpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEk2NCgpCisJbG9nLlByaW50ZigiJXNSZWFkSTY0KCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWREb3VibGUoKQorCWxvZy5QcmludGYoIiVzUmVhZERvdWJsZSgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTdHJpbmcoKQorCWxvZy5QcmludGYoIiVzUmVhZFN0cmluZygpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRCaW5hcnkoKQorCWxvZy5QcmludGYoIiVzUmVhZEJpbmFyeSgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlNraXAoZmllbGRUeXBlKQorCWxvZy5QcmludGYoIiVzU2tpcChmaWVsZFR5cGU9JSN2KSAoZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBmaWVsZFR5cGUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuRmx1c2goY3R4KQorCWxvZy5QcmludGYoIiVzRmx1c2goKSAoZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CisKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgeworCXJldHVybiB0ZHAuRGVsZWdhdGUuVHJhbnNwb3J0KCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZGVzZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9kZXNlcmlhbGl6ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhMDk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZGVzZXJpYWxpemVyLmdvCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKwordHlwZSBURGVzZXJpYWxpemVyIHN0cnVjdCB7CisJVHJhbnNwb3J0IFRUcmFuc3BvcnQKKwlQcm90b2NvbCAgVFByb3RvY29sCit9CisKK2Z1bmMgTmV3VERlc2VyaWFsaXplcigpICpURGVzZXJpYWxpemVyIHsKKwl2YXIgdHJhbnNwb3J0IFRUcmFuc3BvcnQKKwl0cmFuc3BvcnQgPSBOZXdUTWVtb3J5QnVmZmVyTGVuKDEwMjQpCisKKwlwcm90b2NvbCA6PSBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLkdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCXJldHVybiAmVERlc2VyaWFsaXplcnsKKwkJdHJhbnNwb3J0LAorCQlwcm90b2NvbH0KK30KKworZnVuYyAodCAqVERlc2VyaWFsaXplcikgUmVhZFN0cmluZyhtc2cgVFN0cnVjdCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBuaWwKKwlpZiBfLCBlcnIgPSB0LlRyYW5zcG9ydC5Xcml0ZShbXWJ5dGUocykpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWlmIGVyciA9IG1zZy5SZWFkKHQuUHJvdG9jb2wpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXJldHVybgorfQorCitmdW5jICh0ICpURGVzZXJpYWxpemVyKSBSZWFkKG1zZyBUU3RydWN0LCBiIFtdYnl0ZSkgKGVyciBlcnJvcikgeworCWVyciA9IG5pbAorCWlmIF8sIGVyciA9IHQuVHJhbnNwb3J0LldyaXRlKGIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWlmIGVyciA9IG1zZy5SZWFkKHQuUHJvdG9jb2wpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThkNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJlcnJvcnMiCispCisKKy8vIEdlbmVyaWMgVGhyaWZ0IGV4Y2VwdGlvbgordHlwZSBURXhjZXB0aW9uIGludGVyZmFjZSB7CisJZXJyb3IKK30KKworLy8gUHJlcGVuZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBhbiBlcnJvciB3aXRob3V0IGxvc2luZyB0aGUgVGhyaWZ0IGV4Y2VwdGlvbiBpbnRlcmZhY2UKK2Z1bmMgUHJlcGVuZEVycm9yKHByZXBlbmQgc3RyaW5nLCBlcnIgZXJyb3IpIGVycm9yIHsKKwlpZiB0LCBvayA6PSBlcnIuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHQuVHlwZUlkKCksIHByZXBlbmQrdC5FcnJvcigpKQorCX0KKwlpZiB0LCBvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHQuVHlwZUlkKCksIGVycm9ycy5OZXcocHJlcGVuZCtlcnIuRXJyb3IoKSkpCisJfQorCWlmIHQsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHQuVHlwZUlkKCksIHByZXBlbmQrdC5FcnJvcigpKQorCX0KKworCXJldHVybiBlcnJvcnMuTmV3KHByZXBlbmQgKyBlcnIuRXJyb3IoKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjVlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZXJyb3JzIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RQcmVwZW5kRXJyb3IodCAqdGVzdGluZy5UKSB7CisJZXJyIDo9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlRFUk5BTF9FUlJPUiwgIm9yaWdpbmFsIGVycm9yIikKKwllcnIyLCBvayA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycikuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJDb3VsZG4ndCBjYXN0IGVycm9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KKwlpZiBlcnIyLlR5cGVJZCgpICE9IElOVEVSTkFMX0VSUk9SIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnIzIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldygib3JpZ2luYWwgZXJyb3IiKSkKKwllcnI0LCBvayA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycjMpLihUUHJvdG9jb2xFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKwlpZiBlcnI0LkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9CisJaWYgZXJyNC5UeXBlSWQoKSAhPSBJTlZBTElEX0RBVEEgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHR5cGUgZXJyb3IiKQorCX0KKworCWVycjUgOj0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihUSU1FRF9PVVQsICJvcmlnaW5hbCBlcnJvciIpCisJZXJyNiwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnI1KS4oVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJDb3VsZG4ndCBjYXN0IGVycm9yIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCX0KKwlpZiBlcnI2LkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9CisJaWYgZXJyNi5UeXBlSWQoKSAhPSBUSU1FRF9PVVQgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHR5cGUgZXJyb3IiKQorCX0KKworCWVycjcgOj0gZXJyb3JzLk5ldygib3JpZ2luYWwgZXJyb3IiKQorCWVycjggOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnI3KQorCWlmIGVycjguRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZmllbGQuZ28gYi9saWIvZ28vdGhyaWZ0L2ZpZWxkLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjY1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2ZpZWxkLmdvCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGZpZWxkIG1ldGFkYXRhLgordHlwZSBmaWVsZCBzdHJ1Y3QgeworCW5hbWUgICBzdHJpbmcKKwl0eXBlSWQgVFR5cGUKKwlpZCAgICAgaW50Cit9CisKK2Z1bmMgbmV3RmllbGQobiBzdHJpbmcsIHQgVFR5cGUsIGkgaW50KSAqZmllbGQgeworCXJldHVybiAmZmllbGR7bmFtZTogbiwgdHlwZUlkOiB0LCBpZDogaX0KK30KKworZnVuYyAocCAqZmllbGQpIE5hbWUoKSBzdHJpbmcgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuICIiCisJfQorCXJldHVybiBwLm5hbWUKK30KKworZnVuYyAocCAqZmllbGQpIFR5cGVJZCgpIFRUeXBlIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiBUVHlwZShWT0lEKQorCX0KKwlyZXR1cm4gcC50eXBlSWQKK30KKworZnVuYyAocCAqZmllbGQpIElkKCkgaW50IHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAtMQorCX0KKwlyZXR1cm4gcC5pZAorfQorCitmdW5jIChwICpmaWVsZCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAiPG5pbD4iCisJfQorCXJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgcC5uYW1lICsgIicgdHlwZToiICsgc3RyaW5nKHAudHlwZUlkKSArICIgZmllbGQtaWQ6IiArIHN0cmluZyhwLmlkKSArICI+IgorfQorCit2YXIgQU5PTllNT1VTX0ZJRUxEICpmaWVsZAorCit0eXBlIGZpZWxkU2xpY2UgW11maWVsZAorCitmdW5jIChwIGZpZWxkU2xpY2UpIExlbigpIGludCB7CisJcmV0dXJuIGxlbihwKQorfQorCitmdW5jIChwIGZpZWxkU2xpY2UpIExlc3MoaSwgaiBpbnQpIGJvb2wgeworCXJldHVybiBwW2ldLklkKCkgPCBwW2pdLklkKCkKK30KKworZnVuYyAocCBmaWVsZFNsaWNlKSBTd2FwKGksIGogaW50KSB7CisJcFtpXSwgcFtqXSA9IHBbal0sIHBbaV0KK30KKworZnVuYyBpbml0KCkgeworCUFOT05ZTU9VU19GSUVMRCA9IG5ld0ZpZWxkKCIiLCBTVE9QLCAwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmE2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iaW5hcnkiCisJImZtdCIKKwkiaW8iCispCisKK2NvbnN0IERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwCisKK3R5cGUgVEZyYW1lZFRyYW5zcG9ydCBzdHJ1Y3QgeworCXRyYW5zcG9ydCBUVHJhbnNwb3J0CisJYnVmICAgICAgIGJ5dGVzLkJ1ZmZlcgorCXJlYWRlciAgICAqYnVmaW8uUmVhZGVyCisJZnJhbWVTaXplIHVpbnQzMiAvL0N1cnJlbnQgcmVtYWluaW5nIHNpemUgb2YgdGhlIGZyYW1lLiBpZiA9PTAgcmVhZCBuZXh0IGZyYW1lIGhlYWRlcgorCWJ1ZmZlciAgICBbNF1ieXRlCisJbWF4TGVuZ3RoIHVpbnQzMgorfQorCit0eXBlIHRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CisJZmFjdG9yeSAgIFRUcmFuc3BvcnRGYWN0b3J5CisJbWF4TGVuZ3RoIHVpbnQzMgorfQorCitmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5e2ZhY3Rvcnk6IGZhY3RvcnksIG1heExlbmd0aDogREVGQVVMVF9NQVhfTEVOR1RIfQorfQorCitmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5TWF4TGVuZ3RoKGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG1heExlbmd0aCB1aW50MzIpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5e2ZhY3Rvcnk6IGZhY3RvcnksIG1heExlbmd0aDogbWF4TGVuZ3RofQorfQorCitmdW5jIChwICp0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KGJhc2UgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJdHQsIGVyciA6PSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KGJhc2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0dCwgcC5tYXhMZW5ndGgpLCBuaWwKK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCBUVHJhbnNwb3J0KSAqVEZyYW1lZFRyYW5zcG9ydCB7CisJcmV0dXJuICZURnJhbWVkVHJhbnNwb3J0e3RyYW5zcG9ydDogdHJhbnNwb3J0LCByZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0cmFuc3BvcnQpLCBtYXhMZW5ndGg6IERFRkFVTFRfTUFYX0xFTkdUSH0KK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0TWF4TGVuZ3RoKHRyYW5zcG9ydCBUVHJhbnNwb3J0LCBtYXhMZW5ndGggdWludDMyKSAqVEZyYW1lZFRyYW5zcG9ydCB7CisJcmV0dXJuICZURnJhbWVkVHJhbnNwb3J0e3RyYW5zcG9ydDogdHJhbnNwb3J0LCByZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0cmFuc3BvcnQpLCBtYXhMZW5ndGg6IG1heExlbmd0aH0KK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgT3BlbigpIGVycm9yIHsKKwlyZXR1cm4gcC50cmFuc3BvcnQuT3BlbigpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiBwLnRyYW5zcG9ydC5Jc09wZW4oKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gcC50cmFuc3BvcnQuQ2xvc2UoKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZWFkKGJ1ZiBbXWJ5dGUpIChsIGludCwgZXJyIGVycm9yKSB7CisJaWYgcC5mcmFtZVNpemUgPT0gMCB7CisJCXAuZnJhbWVTaXplLCBlcnIgPSBwLnJlYWRGcmFtZUhlYWRlcigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9CisJaWYgcC5mcmFtZVNpemUgPCB1aW50MzIobGVuKGJ1ZikpIHsKKwkJZnJhbWVTaXplIDo9IHAuZnJhbWVTaXplCisJCXRtcCA6PSBtYWtlKFtdYnl0ZSwgcC5mcmFtZVNpemUpCisJCWwsIGVyciA9IHAuUmVhZCh0bXApCisJCWNvcHkoYnVmLCB0bXApCisJCWlmIGVyciA9PSBuaWwgeworCQkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihmbXQuRXJyb3JmKCJOb3QgZW5vdWdoIGZyYW1lIHNpemUgJWQgdG8gcmVhZCAlZCBieXRlcyIsIGZyYW1lU2l6ZSwgbGVuKGJ1ZikpKQorCQkJcmV0dXJuCisJCX0KKwl9CisJZ290LCBlcnIgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJcC5mcmFtZVNpemUgPSBwLmZyYW1lU2l6ZSAtIHVpbnQzMihnb3QpCisJLy9zYW5pdHkgY2hlY2sKKwlpZiBwLmZyYW1lU2l6ZSA8IDAgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJOZWdhdGl2ZSBmcmFtZSBzaXplIikKKwl9CisJcmV0dXJuIGdvdCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJaWYgcC5mcmFtZVNpemUgPT0gMCB7CisJCXAuZnJhbWVTaXplLCBlcnIgPSBwLnJlYWRGcmFtZUhlYWRlcigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9CisJaWYgcC5mcmFtZVNpemUgPCAxIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZm10LkVycm9yZigiTm90IGVub3VnaCBmcmFtZSBzaXplICVkIHRvIHJlYWQgJWQgYnl0ZXMiLCBwLmZyYW1lU2l6ZSwgMSkpCisJfQorCWMsIGVyciA9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcC5mcmFtZVNpemUtLQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5idWYuV3JpdGUoYnVmKQorCXJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgV3JpdGVCeXRlKGMgYnl0ZSkgZXJyb3IgeworCXJldHVybiBwLmJ1Zi5Xcml0ZUJ5dGUoYykKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHAuYnVmLldyaXRlU3RyaW5nKHMpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlzaXplIDo9IHAuYnVmLkxlbigpCisJYnVmIDo9IHAuYnVmZmVyWzo0XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKGJ1ZiwgdWludDMyKHNpemUpKQorCV8sIGVyciA6PSBwLnRyYW5zcG9ydC5Xcml0ZShidWYpCisJaWYgZXJyICE9IG5pbCB7CisJCXAuYnVmLlRydW5jYXRlKDApCisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJaWYgc2l6ZSA+IDAgeworCQlpZiBuLCBlcnIgOj0gcC5idWYuV3JpdGVUbyhwLnRyYW5zcG9ydCk7IGVyciAhPSBuaWwgeworCQkJcHJpbnQoIkVycm9yIHdoaWxlIGZsdXNoaW5nIHdyaXRlIGJ1ZmZlciBvZiBzaXplICIsIHNpemUsICIgdG8gdHJhbnNwb3J0LCBvbmx5IHdyb3RlICIsIG4sICIgYnl0ZXM6ICIsIGVyci5FcnJvcigpLCAiXG4iKQorCQkJcC5idWYuVHJ1bmNhdGUoMCkKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwkJfQorCX0KKwllcnIgPSBwLnRyYW5zcG9ydC5GbHVzaChjdHgpCisJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSByZWFkRnJhbWVIZWFkZXIoKSAodWludDMyLCBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KKwlpZiBfLCBlcnIgOj0gaW8uUmVhZEZ1bGwocC5yZWFkZXIsIGJ1Zik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCXNpemUgOj0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoYnVmKQorCWlmIHNpemUgPCAwIHx8IHNpemUgPiBwLm1heExlbmd0aCB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgZm10LlNwcmludGYoIkluY29ycmVjdCBmcmFtZSBzaXplICglZCkiLCBzaXplKSkKKwl9CisJcmV0dXJuIHNpemUsIG5pbAorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHVpbnQ2NChwLmZyYW1lU2l6ZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2ODNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0RnJhbWVkVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MmJmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImlvIgorCSJpby9pb3V0aWwiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJzdHJjb252IgorKQorCisvLyBEZWZhdWx0IHRvIHVzaW5nIHRoZSBzaGFyZWQgaHR0cCBjbGllbnQuIExpYnJhcnkgdXNlcnMgYXJlCisvLyBmcmVlIHRvIGNoYW5nZSB0aGlzIGdsb2JhbCBjbGllbnQgb3Igc3BlY2lmeSBvbmUgdGhyb3VnaAorLy8gVEh0dHBDbGllbnRPcHRpb25zLgordmFyIERlZmF1bHRIdHRwQ2xpZW50ICpodHRwLkNsaWVudCA9IGh0dHAuRGVmYXVsdENsaWVudAorCit0eXBlIFRIdHRwQ2xpZW50IHN0cnVjdCB7CisJY2xpZW50ICAgICAgICAgICAgICpodHRwLkNsaWVudAorCXJlc3BvbnNlICAgICAgICAgICAqaHR0cC5SZXNwb25zZQorCXVybCAgICAgICAgICAgICAgICAqdXJsLlVSTAorCXJlcXVlc3RCdWZmZXIgICAgICAqYnl0ZXMuQnVmZmVyCisJaGVhZGVyICAgICAgICAgICAgIGh0dHAuSGVhZGVyCisJbnNlY0Nvbm5lY3RUaW1lb3V0IGludDY0CisJbnNlY1JlYWRUaW1lb3V0ICAgIGludDY0Cit9CisKK3R5cGUgVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CisJb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMKKwl1cmwgICAgIHN0cmluZworfQorCitmdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiB0cmFucyAhPSBuaWwgeworCQl0LCBvayA6PSB0cmFucy4oKlRIdHRwQ2xpZW50KQorCQlpZiBvayAmJiB0LnVybCAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModC51cmwuU3RyaW5nKCksIHAub3B0aW9ucykKKwkJfQorCX0KKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyhwLnVybCwgcC5vcHRpb25zKQorfQorCit0eXBlIFRIdHRwQ2xpZW50T3B0aW9ucyBzdHJ1Y3QgeworCS8vIElmIG5pbCwgRGVmYXVsdEh0dHBDbGllbnQgaXMgdXNlZAorCUNsaWVudCAqaHR0cC5DbGllbnQKK30KKworZnVuYyBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBvcHRpb25zOiBvcHRpb25zfQorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXBhcnNlZFVSTCwgZXJyIDo9IHVybC5QYXJzZSh1cmxzdHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlidWYgOj0gbWFrZShbXWJ5dGUsIDAsIDEwMjQpCisJY2xpZW50IDo9IG9wdGlvbnMuQ2xpZW50CisJaWYgY2xpZW50ID09IG5pbCB7CisJCWNsaWVudCA9IERlZmF1bHRIdHRwQ2xpZW50CisJfQorCWh0dHBIZWFkZXIgOj0gbWFwW3N0cmluZ11bXXN0cmluZ3siQ29udGVudC1UeXBlIjogeyJhcHBsaWNhdGlvbi94LXRocmlmdCJ9fQorCXJldHVybiAmVEh0dHBDbGllbnR7Y2xpZW50OiBjbGllbnQsIHVybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgaGVhZGVyOiBodHRwSGVhZGVyfSwgbmlsCit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworLy8gU2V0IHRoZSBIVFRQIEhlYWRlciBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CisvLyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZmlyc3QgYXNzZXJ0IHRoZSBUVHJhbnNwb3J0IGFzIGEgVEh0dHBDbGllbnQgdHlwZQorLy8gbGlrZSBzbzoKKy8vCisvLyBodHRwVHJhbnMgOj0gdHJhbnMuKFRIdHRwQ2xpZW50KQorLy8gaHR0cFRyYW5zLlNldEhlYWRlcigiVXNlci1BZ2VudCIsIlRocmlmdCBDbGllbnQgMS4wIikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBTZXRIZWFkZXIoa2V5IHN0cmluZywgdmFsdWUgc3RyaW5nKSB7CisJcC5oZWFkZXIuQWRkKGtleSwgdmFsdWUpCit9CisKKy8vIEdldCB0aGUgSFRUUCBIZWFkZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN1cHBsaWVkIEhlYWRlciBLZXkgZm9yIHRoaXMgc3BlY2lmaWMgVGhyaWZ0IFRyYW5zcG9ydAorLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGFzc2VydCB0aGUgVFRyYW5zcG9ydCBhcyBhIFRIdHRwQ2xpZW50IHR5cGUKKy8vIGxpa2Ugc286CisvLworLy8gaHR0cFRyYW5zIDo9IHRyYW5zLihUSHR0cENsaWVudCkKKy8vIGhkclZhbHVlIDo9IGh0dHBUcmFucy5HZXRIZWFkZXIoIlVzZXItQWdlbnQiKQorZnVuYyAocCAqVEh0dHBDbGllbnQpIEdldEhlYWRlcihrZXkgc3RyaW5nKSBzdHJpbmcgeworCXJldHVybiBwLmhlYWRlci5HZXQoa2V5KQorfQorCisvLyBEZWxldGVzIHRoZSBIVFRQIEhlYWRlciBnaXZlbiBhIEhlYWRlciBLZXkgZm9yIHRoaXMgc3BlY2lmaWMgVGhyaWZ0IFRyYW5zcG9ydAorLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGFzc2VydCB0aGUgVFRyYW5zcG9ydCBhcyBhIFRIdHRwQ2xpZW50IHR5cGUKKy8vIGxpa2Ugc286CisvLworLy8gaHR0cFRyYW5zIDo9IHRyYW5zLihUSHR0cENsaWVudCkKKy8vIGh0dHBUcmFucy5EZWxIZWFkZXIoIlVzZXItQWdlbnQiKQorZnVuYyAocCAqVEh0dHBDbGllbnQpIERlbEhlYWRlcihrZXkgc3RyaW5nKSB7CisJcC5oZWFkZXIuRGVsKGtleSkKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIE9wZW4oKSBlcnJvciB7CisJLy8gZG8gbm90aGluZworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiBwLnJlc3BvbnNlICE9IG5pbCB8fCBwLnJlcXVlc3RCdWZmZXIgIT0gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBjbG9zZVJlc3BvbnNlKCkgZXJyb3IgeworCXZhciBlcnIgZXJyb3IKKwlpZiBwLnJlc3BvbnNlICE9IG5pbCAmJiBwLnJlc3BvbnNlLkJvZHkgIT0gbmlsIHsKKwkJLy8gVGhlIGRvY3Mgc3BlY2lmeSB0aGF0IGlmIGtlZXBhbGl2ZSBpcyBlbmFibGVkIGFuZCB0aGUgcmVzcG9uc2UgYm9keSBpcyBub3QKKwkJLy8gcmVhZCB0byBjb21wbGV0aW9uIHRoZSBjb25uZWN0aW9uIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgdG8gdGhlIHBvb2wgYW5kCisJCS8vIHJldXNlZC4gRXJyb3JzIGFyZSBiZWluZyBpZ25vcmVkIGhlcmUgYmVjYXVzZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisJCS8vIGFuZCB0aGlzIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgdGhlIENsb3NlKCkgbWV0aG9kIHdpbGwgZG8gYW55IHJlbWFpbmluZworCQkvLyBjbGVhbnVwLgorCQlpby5Db3B5KGlvdXRpbC5EaXNjYXJkLCBwLnJlc3BvbnNlLkJvZHkpCisKKwkJZXJyID0gcC5yZXNwb25zZS5Cb2R5LkNsb3NlKCkKKwl9CisKKwlwLnJlc3BvbnNlID0gbmlsCisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgQ2xvc2UoKSBlcnJvciB7CisJaWYgcC5yZXF1ZXN0QnVmZmVyICE9IG5pbCB7CisJCXAucmVxdWVzdEJ1ZmZlci5SZXNldCgpCisJCXAucmVxdWVzdEJ1ZmZlciA9IG5pbAorCX0KKwlyZXR1cm4gcC5jbG9zZVJlc3BvbnNlKCkKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiBwLnJlc3BvbnNlID09IG5pbCB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LiIpCisJfQorCW4sIGVyciA6PSBwLnJlc3BvbnNlLkJvZHkuUmVhZChidWYpCisJaWYgbiA+IDAgJiYgKGVyciA9PSBuaWwgfHwgZXJyID09IGlvLkVPRikgeworCQlyZXR1cm4gbiwgbmlsCisJfQorCXJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHJlYWRCeXRlKHAucmVzcG9uc2UuQm9keSkKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAucmVxdWVzdEJ1ZmZlci5Xcml0ZShidWYpCisJcmV0dXJuIG4sIGVycgorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGVCeXRlKGMgYnl0ZSkgZXJyb3IgeworCXJldHVybiBwLnJlcXVlc3RCdWZmZXIuV3JpdGVCeXRlKGMpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC5yZXF1ZXN0QnVmZmVyLldyaXRlU3RyaW5nKHMpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJLy8gQ2xvc2UgYW55IHByZXZpb3VzIHJlc3BvbnNlIGJvZHkgdG8gYXZvaWQgbGVha2luZyBjb25uZWN0aW9ucy4KKwlwLmNsb3NlUmVzcG9uc2UoKQorCisJcmVxLCBlcnIgOj0gaHR0cC5OZXdSZXF1ZXN0KCJQT1NUIiwgcC51cmwuU3RyaW5nKCksIHAucmVxdWVzdEJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXEuSGVhZGVyID0gcC5oZWFkZXIKKwlpZiBjdHggIT0gbmlsIHsKKwkJcmVxID0gcmVxLldpdGhDb250ZXh0KGN0eCkKKwl9CisJcmVzcG9uc2UsIGVyciA6PSBwLmNsaWVudC5EbyhyZXEpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJaWYgcmVzcG9uc2UuU3RhdHVzQ29kZSAhPSBodHRwLlN0YXR1c09LIHsKKwkJLy8gQ2xvc2UgdGhlIHJlc3BvbnNlIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBkZXNjcmlwdG9ycy4gY2xvc2VSZXNwb25zZSBkb2VzCisJCS8vIG1vcmUgdGhhbiBqdXN0IGNhbGwgQ2xvc2UoKSwgc28gdGVtcG9yYXJpbHkgYXNzaWduIGl0IGFuZCByZXVzZSB0aGUgbG9naWMuCisJCXAucmVzcG9uc2UgPSByZXNwb25zZQorCQlwLmNsb3NlUmVzcG9uc2UoKQorCisJCS8vIFRPRE8ocG9tYWNrKSBsb2cgYmFkIHJlc3BvbnNlCisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIkhUVFAgUmVzcG9uc2UgY29kZTogIitzdHJjb252Lkl0b2EocmVzcG9uc2UuU3RhdHVzQ29kZSkpCisJfQorCXAucmVzcG9uc2UgPSByZXNwb25zZQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlsZW4gOj0gcC5yZXNwb25zZS5Db250ZW50TGVuZ3RoCisJaWYgbGVuID49IDAgeworCQlyZXR1cm4gdWludDY0KGxlbikKKwl9CisKKwljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnQgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNjgwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJuZXQvaHR0cCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0SHR0cENsaWVudCh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK2Z1bmMgVGVzdEh0dHBDbGllbnRIZWFkZXJzKHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0SHR0cEN1c3RvbUNsaWVudCh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKworCWh0dHBUcmFuc3BvcnQgOj0gJmN1c3RvbUh0dHBUcmFuc3BvcnR7fQorCisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucygiaHR0cDovLyIrYWRkci5TdHJpbmcoKSwgVEh0dHBDbGllbnRPcHRpb25zeworCQlDbGllbnQ6ICZodHRwLkNsaWVudHsKKwkJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwkJfSwKKwl9KQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKworZnVuYyBUZXN0SHR0cEN1c3RvbUNsaWVudFBhY2thZ2VTY29wZSh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKwlEZWZhdWx0SHR0cENsaWVudCA9ICZodHRwLkNsaWVudHsKKwkJVHJhbnNwb3J0OiBodHRwVHJhbnNwb3J0LAorCX0KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKKworCWlmICFodHRwVHJhbnNwb3J0LmhpdCB7CisJCXQuRmF0YWxmKCJDdXN0b20gY2xpZW50IHdhcyBub3QgdXNlZCIpCisJfQorfQorCit0eXBlIGN1c3RvbUh0dHBUcmFuc3BvcnQgc3RydWN0IHsKKwloaXQgYm9vbAorfQorCitmdW5jIChjICpjdXN0b21IdHRwVHJhbnNwb3J0KSBSb3VuZFRyaXAocmVxICpodHRwLlJlcXVlc3QpICgqaHR0cC5SZXNwb25zZSwgZXJyb3IpIHsKKwljLmhpdCA9IHRydWUKKwlyZXR1cm4gaHR0cC5EZWZhdWx0VHJhbnNwb3J0LlJvdW5kVHJpcChyZXEpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYwZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL2d6aXAiCisJImlvIgorCSJuZXQvaHR0cCIKKwkic3RyaW5ncyIKKykKKworLy8gTmV3VGhyaWZ0SGFuZGxlckZ1bmMgaXMgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZSBhIHJlYWR5IHRvIHVzZSBBcGFjaGUgVGhyaWZ0IEhhbmRsZXIgZnVuY3Rpb24KK2Z1bmMgTmV3VGhyaWZ0SGFuZGxlckZ1bmMocHJvY2Vzc29yIFRQcm9jZXNzb3IsCisJaW5QZmFjdG9yeSwgb3V0UGZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCisJcmV0dXJuIGd6KGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwkJdy5IZWFkZXIoKS5BZGQoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisKKwkJdHJhbnNwb3J0IDo9IE5ld1N0cmVhbVRyYW5zcG9ydChyLkJvZHksIHcpCisJCXByb2Nlc3Nvci5Qcm9jZXNzKHIuQ29udGV4dCgpLCBpblBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCksIG91dFBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkpCisJfSkKK30KKworLy8gZ3ogdHJhbnNwYXJlbnRseSBjb21wcmVzc2VzIHRoZSBIVFRQIHJlc3BvbnNlIGlmIHRoZSBjbGllbnQgc3VwcG9ydHMgaXQuCitmdW5jIGd6KGhhbmRsZXIgaHR0cC5IYW5kbGVyRnVuYykgaHR0cC5IYW5kbGVyRnVuYyB7CisJcmV0dXJuIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwkJaWYgIXN0cmluZ3MuQ29udGFpbnMoci5IZWFkZXIuR2V0KCJBY2NlcHQtRW5jb2RpbmciKSwgImd6aXAiKSB7CisJCQloYW5kbGVyKHcsIHIpCisJCQlyZXR1cm4KKwkJfQorCQl3LkhlYWRlcigpLlNldCgiQ29udGVudC1FbmNvZGluZyIsICJnemlwIikKKwkJZ3ogOj0gZ3ppcC5OZXdXcml0ZXIodykKKwkJZGVmZXIgZ3ouQ2xvc2UoKQorCQlnencgOj0gZ3ppcFJlc3BvbnNlV3JpdGVye1dyaXRlcjogZ3osIFJlc3BvbnNlV3JpdGVyOiB3fQorCQloYW5kbGVyKGd6dywgcikKKwl9Cit9CisKK3R5cGUgZ3ppcFJlc3BvbnNlV3JpdGVyIHN0cnVjdCB7CisJaW8uV3JpdGVyCisJaHR0cC5SZXNwb25zZVdyaXRlcgorfQorCitmdW5jICh3IGd6aXBSZXNwb25zZVdyaXRlcikgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHcuV3JpdGVyLldyaXRlKGIpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTkzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJidWZpbyIKKwkiY29udGV4dCIKKwkiaW8iCispCisKKy8vIFN0cmVhbVRyYW5zcG9ydCBpcyBhIFRyYW5zcG9ydCBtYWRlIG9mIGFuIGlvLlJlYWRlciBhbmQvb3IgYW4gaW8uV3JpdGVyCit0eXBlIFN0cmVhbVRyYW5zcG9ydCBzdHJ1Y3QgeworCWlvLlJlYWRlcgorCWlvLldyaXRlcgorCWlzUmVhZFdyaXRlciBib29sCisJY2xvc2VkICAgICAgIGJvb2wKK30KKwordHlwZSBTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CisJUmVhZGVyICAgICAgIGlvLlJlYWRlcgorCVdyaXRlciAgICAgICBpby5Xcml0ZXIKKwlpc1JlYWRXcml0ZXIgYm9vbAorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpTdHJlYW1UcmFuc3BvcnQpCisJCWlmIG9rIHsKKwkJCWlmIHQuaXNSZWFkV3JpdGVyIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcodC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCisJCQl9CisJCQlpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHQuUmVhZGVyLCB0LldyaXRlciksIG5pbAorCQkJfQorCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyID09IG5pbCB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIodC5SZWFkZXIpLCBuaWwKKwkJCX0KKwkJCWlmIHQuUmVhZGVyID09IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHQuV3JpdGVyKSwgbmlsCisJCQl9CisJCQlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9LCBuaWwKKwkJfQorCX0KKwlpZiBwLmlzUmVhZFdyaXRlciB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyhwLlJlYWRlci4oaW8uUmVhZFdyaXRlcikpLCBuaWwKKwl9CisJaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQocC5SZWFkZXIsIHAuV3JpdGVyKSwgbmlsCisJfQorCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciA9PSBuaWwgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UihwLlJlYWRlciksIG5pbAorCX0KKwlpZiBwLlJlYWRlciA9PSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcocC5Xcml0ZXIpLCBuaWwKKwl9CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShyZWFkZXIgaW8uUmVhZGVyLCB3cml0ZXIgaW8uV3JpdGVyLCBpc1JlYWRXcml0ZXIgYm9vbCkgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0RmFjdG9yeXtSZWFkZXI6IHJlYWRlciwgV3JpdGVyOiB3cml0ZXIsIGlzUmVhZFdyaXRlcjogaXNSZWFkV3JpdGVyfQorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydChyIGlvLlJlYWRlciwgdyBpby5Xcml0ZXIpICpTdHJlYW1UcmFuc3BvcnQgeworCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHIpLCBXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlcih3KX0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnRSKHIgaW8uUmVhZGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcihyKX0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnRXKHcgaW8uV3JpdGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlcih3KX0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnRSVyhydyBpby5SZWFkV3JpdGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlidWZydyA6PSBidWZpby5OZXdSZWFkV3JpdGVyKGJ1ZmlvLk5ld1JlYWRlcihydyksIGJ1ZmlvLk5ld1dyaXRlcihydykpCisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZydywgV3JpdGVyOiBidWZydywgaXNSZWFkV3JpdGVyOiB0cnVlfQorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiAhcC5jbG9zZWQKK30KKworLy8gaW1wbGljaXRseSBvcGVuZWQgb24gY3JlYXRpb24sIGNhbid0IGJlIHJlb3BlbmVkIG9uY2UgY2xvc2VkCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJaWYgIXAuY2xvc2VkIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU3RyZWFtVHJhbnNwb3J0IGFscmVhZHkgb3Blbi4iKQorCX0gZWxzZSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiY2Fubm90IHJlb3BlbiBTdHJlYW1UcmFuc3BvcnQuIikKKwl9Cit9CisKKy8vIENsb3NlcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCWlmIHAuY2xvc2VkIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJTdHJlYW1UcmFuc3BvcnQgYWxyZWFkeSBjbG9zZWQuIikKKwl9CisJcC5jbG9zZWQgPSB0cnVlCisJY2xvc2VkUmVhZGVyIDo9IGZhbHNlCisJaWYgcC5SZWFkZXIgIT0gbmlsIHsKKwkJYywgb2sgOj0gcC5SZWFkZXIuKGlvLkNsb3NlcikKKwkJaWYgb2sgeworCQkJZSA6PSBjLkNsb3NlKCkKKwkJCWNsb3NlZFJlYWRlciA9IHRydWUKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZQorCQkJfQorCQl9CisJCXAuUmVhZGVyID0gbmlsCisJfQorCWlmIHAuV3JpdGVyICE9IG5pbCAmJiAoIWNsb3NlZFJlYWRlciB8fCAhcC5pc1JlYWRXcml0ZXIpIHsKKwkJYywgb2sgOj0gcC5Xcml0ZXIuKGlvLkNsb3NlcikKKwkJaWYgb2sgeworCQkJZSA6PSBjLkNsb3NlKCkKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZQorCQkJfQorCQl9CisJCXAuV3JpdGVyID0gbmlsCisJfQorCXJldHVybiBuaWwKK30KKworLy8gRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgcC5Xcml0ZXIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRTdHJlYW0iKQorCX0KKwlmLCBvayA6PSBwLldyaXRlci4oRmx1c2hlcikKKwlpZiBvayB7CisJCWVyciA6PSBmLkZsdXNoKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlYWQoYyBbXWJ5dGUpIChuIGludCwgZXJyIGVycm9yKSB7CisJbiwgZXJyID0gcC5SZWFkZXIuUmVhZChjKQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlmLCBvayA6PSBwLlJlYWRlci4oaW8uQnl0ZVJlYWRlcikKKwlpZiBvayB7CisJCWMsIGVyciA9IGYuUmVhZEJ5dGUoKQorCX0gZWxzZSB7CisJCWMsIGVyciA9IHJlYWRCeXRlKHAuUmVhZGVyKQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFdyaXRlKGMgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCW4sIGVyciA9IHAuV3JpdGVyLldyaXRlKGMpCisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBXcml0ZUJ5dGUoYyBieXRlKSAoZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5Xcml0ZXIuKGlvLkJ5dGVXcml0ZXIpCisJaWYgb2sgeworCQllcnIgPSBmLldyaXRlQnl0ZShjKQorCX0gZWxzZSB7CisJCWVyciA9IHdyaXRlQnl0ZShwLldyaXRlciwgYykKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlmLCBvayA6PSBwLldyaXRlci4oc3RyaW5nV3JpdGVyKQorCWlmIG9rIHsKKwkJbiwgZXJyID0gZi5Xcml0ZVN0cmluZyhzKQorCX0gZWxzZSB7CisJCW4sIGVyciA9IHAuV3JpdGVyLldyaXRlKFtdYnl0ZShzKSkKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE2MTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RTdHJlYW1UcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkpCisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK2Z1bmMgVGVzdFN0cmVhbVRyYW5zcG9ydE9wZW5DbG9zZSh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKSkKKwlpZiAhdHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIGJlIGFscmVhZHkgb3BlbiIpCisJfQorCWlmIHRyYW5zLk9wZW4oKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIHJldHVybiBlcnJvciB3aGVuIG9wZW4gdHdpY2UiKQorCX0KKwlpZiB0cmFucy5DbG9zZSgpICE9IG5pbCB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgbm90IHJldHVybiBlcnJvciB3aGVuIGNsb3Npbmcgb3BlbiB0cmFuc3BvcnQiKQorCX0KKwlpZiB0cmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgbm90IGJlIG9wZW4gYWZ0ZXIgY2xvc2UiKQorCX0KKwlpZiB0cmFucy5DbG9zZSgpID09IG5pbCB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgcmV0dXJuIGVycm9yIHdoZW4gY2xvc2luZyBhIG5vbiBvcGVuIHRyYW5zcG9ydCIpCisJfQorCWlmIHRyYW5zLk9wZW4oKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlb3BlbiIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTY4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJmbXQiCispCisKK2NvbnN0ICgKKwlUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMQorKQorCisvLyBmb3IgcmVmZXJlbmNlcyB0byBfUGFyc2VDb250ZXh0IHNlZSB0c2ltcGxlanNvbl9wcm90b2NvbC5nbworCisvLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisvLworLy8gVGhpcyBwcm90b2NvbCBwcm9kdWNlcy9jb25zdW1lcyBhIHNpbXBsZSBvdXRwdXQgZm9ybWF0CisvLyBzdWl0YWJsZSBmb3IgcGFyc2luZyBieSBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgSXQgc2hvdWxkIG5vdCBiZQorLy8gY29uZnVzZWQgd2l0aCB0aGUgZnVsbC1mZWF0dXJlZCBUSlNPTlByb3RvY29sLgorLy8KK3R5cGUgVEpTT05Qcm90b2NvbCBzdHJ1Y3QgeworCSpUU2ltcGxlSlNPTlByb3RvY29sCit9CisKKy8vIENvbnN0cnVjdG9yCitmdW5jIE5ld1RKU09OUHJvdG9jb2wodCBUVHJhbnNwb3J0KSAqVEpTT05Qcm90b2NvbCB7CisJdiA6PSAmVEpTT05Qcm90b2NvbHtUU2ltcGxlSlNPTlByb3RvY29sOiBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQpfQorCXYucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQodi5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwl2LmR1bXBDb250ZXh0ID0gYXBwZW5kKHYuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJcmV0dXJuIHYKK30KKworLy8gRmFjdG9yeQordHlwZSBUSlNPTlByb3RvY29sRmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpUSlNPTlByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKK30KKworZnVuYyBOZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpICpUSlNPTlByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuICZUSlNPTlByb3RvY29sRmFjdG9yeXt9Cit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQorCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJMzIoVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTik7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OCh0eXBlSWQpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJMzIoc2VxSWQpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dE9iamVjdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwlpZiBlIDo9IHAuV3JpdGVJMTYoaWQpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcodHlwZUlkKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dE9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcoa2V5VHlwZSkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxID0gcC5UeXBlSWRUb1N0cmluZyh2YWx1ZVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dE9iamVjdEJlZ2luKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dE9iamVjdEVuZCgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIGVycm9yIHsKKwlpZiBiIHsKKwkJcmV0dXJuIHAuV3JpdGVJMzIoMSkKKwl9CisJcmV0dXJuIHAuV3JpdGVJMzIoMCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCeXRlKGIgaW50OCkgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKGIpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUkxNih2IGludDE2KSBlcnJvciB7CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIodikpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlSTMyKHYgaW50MzIpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlSTY0KHYgaW50NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRG91YmxlKHYgZmxvYXQ2NCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEY2NCh2KQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cmluZyh2IHN0cmluZykgZXJyb3IgeworCXJldHVybiBwLk91dHB1dFN0cmluZyh2KQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJpbmFyeSh2IFtdYnl0ZSkgZXJyb3IgeworCS8vIEpTT04gbGlicmFyeSBvbmx5IHRha2VzIGluIGEgc3RyaW5nLAorCS8vIG5vdCBhbiBhcmJpdHJhcnkgYnl0ZSBhcnJheSwgdG8gZW5zdXJlIGJ5dGVzIGFyZSB0cmFuc21pdHRlZAorCS8vIGVmZmljaWVudGx5IHdlIG11c3QgY29udmVydCB0aGlzIGludG8gYSB2YWxpZCBKU09OIHN0cmluZworCS8vIHRoZXJlZm9yZSB3ZSB1c2UgYmFzZTY0IGVuY29kaW5nIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBlc2NhcGluZy9xdW90aW5nCisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJd3JpdGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKGJhc2U2NC5TdGRFbmNvZGluZywgcC53cml0ZXIpCisJaWYgXywgZSA6PSB3cml0ZXIuV3JpdGUodik7IGUgIT0gbmlsIHsKKwkJcC53cml0ZXIuUmVzZXQocC50cmFucykgLy8gVEhSSUZULTM3MzUKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBlIDo9IHdyaXRlci5DbG9zZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworLy8gUmVhZGluZyBtZXRob2RzLgorZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQorCWlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCXZlcnNpb24sIGVyciA6PSBwLlJlYWRJMzIoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHZlcnNpb24gIT0gVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiB7CisJCWUgOj0gZm10LkVycm9yZigiVW5rbm93biBQcm90b2NvbCB2ZXJzaW9uICVkLCBleHBlY3RlZCB2ZXJzaW9uICVkIiwgdmVyc2lvbiwgVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTikKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKworCX0KKwlpZiBuYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwllcnIgOj0gcC5QYXJzZUxpc3RFbmQoKQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQorCXJldHVybiAiIiwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIFRUeXBlLCBpbnQxNiwgZXJyb3IpIHsKKwliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPCAxIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0VbMF0gfHwgYlswXSA9PSBKU09OX1JCUkFDS0VUWzBdIHsKKwkJcmV0dXJuICIiLCBTVE9QLCAtMSwgbmlsCisJfQorCWZpZWxkSWQsIGVyciA6PSBwLlJlYWRJMTYoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIGZpZWxkSWQsIGVycgorCX0KKwlpZiBfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCisJfQorCXNUeXBlLCBlcnIgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKKwl9CisJZlR5cGUsIGVyciA6PSBwLlN0cmluZ1RvVHlwZUlkKHNUeXBlKQorCXJldHVybiAiIiwgZlR5cGUsIGZpZWxkSWQsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBWT0lELCAwLCBlCisJfQorCisJLy8gcmVhZCBrZXlUeXBlCisJc0tleVR5cGUsIGUgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisJa2V5VHlwZSwgZSA9IHAuU3RyaW5nVG9UeXBlSWQoc0tleVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCB2YWx1ZVR5cGUKKwlzVmFsdWVUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCXZhbHVlVHlwZSwgZSA9IHAuU3RyaW5nVG9UeXBlSWQoc1ZhbHVlVHlwZSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisKKwkvLyByZWFkIHNpemUKKwlpU2l6ZSwgZSA6PSBwLlJlYWRJNjQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKwlzaXplID0gaW50KGlTaXplKQorCisJXywgZSA9IHAuUGFyc2VPYmplY3RTdGFydCgpCisJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCWUgOj0gcC5QYXJzZU9iamVjdEVuZCgpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7CisJdmFsdWUsIGVyciA6PSBwLlJlYWRJMzIoKQorCXJldHVybiAodmFsdWUgIT0gMCksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQ4KHYpLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkxNigpIChpbnQxNiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MTYodiksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQzMih2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIGVycm9yKSB7CisJdiwgXywgZXJyIDo9IHAuUGFyc2VJNjQoKQorCXJldHVybiB2LCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlRjY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBlcnJvcikgeworCXZhciB2IHN0cmluZworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiB2LCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgeworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIGVycm9yKSB7CisJdmFyIHYgW11ieXRlCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpCisJCXYgPSB2YWx1ZQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBlcnIKKwkJfQorCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJaWYgc3RyaW5nKGIpICE9IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoYikpCisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfSBlbHNlIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhmKSkKKwkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisKKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBwLndyaXRlci5GbHVzaCgpCisJaWYgZXJyID09IG5pbCB7CisJCWVyciA9IHAudHJhbnMuRmx1c2goY3R4KQorCX0KKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgeworCXJldHVybiBwLnRyYW5zCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIE91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcoZWxlbVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUGFyc2VFbGVtTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCAwLCBlCisJfQorCXNFbGVtVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBzaXplLCBlcnIKKwl9CisJZWxlbVR5cGUsIGVyciA9IHAuU3RyaW5nVG9UeXBlSWQoc0VsZW1UeXBlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycgorCX0KKwluU2l6ZSwgZXJyMiA6PSBwLlJlYWRJNjQoKQorCXNpemUgPSBpbnQoblNpemUpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIHJlYWRFbGVtTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCAwLCBlCisJfQorCXNFbGVtVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBzaXplLCBlcnIKKwl9CisJZWxlbVR5cGUsIGVyciA9IHAuU3RyaW5nVG9UeXBlSWQoc0VsZW1UeXBlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycgorCX0KKwluU2l6ZSwgZXJyMiA6PSBwLlJlYWRJNjQoKQorCXNpemUgPSBpbnQoblNpemUpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIHdyaXRlRWxlbUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcywgZTEgOj0gcC5UeXBlSWRUb1N0cmluZyhlbGVtVHlwZSkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLk91dHB1dFN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0STY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFR5cGVJZFRvU3RyaW5nKGZpZWxkVHlwZSBUVHlwZSkgKHN0cmluZywgZXJyb3IpIHsKKwlzd2l0Y2ggYnl0ZShmaWVsZFR5cGUpIHsKKwljYXNlIEJPT0w6CisJCXJldHVybiAidGYiLCBuaWwKKwljYXNlIEJZVEU6CisJCXJldHVybiAiaTgiLCBuaWwKKwljYXNlIEkxNjoKKwkJcmV0dXJuICJpMTYiLCBuaWwKKwljYXNlIEkzMjoKKwkJcmV0dXJuICJpMzIiLCBuaWwKKwljYXNlIEk2NDoKKwkJcmV0dXJuICJpNjQiLCBuaWwKKwljYXNlIERPVUJMRToKKwkJcmV0dXJuICJkYmwiLCBuaWwKKwljYXNlIFNUUklORzoKKwkJcmV0dXJuICJzdHIiLCBuaWwKKwljYXNlIFNUUlVDVDoKKwkJcmV0dXJuICJyZWMiLCBuaWwKKwljYXNlIE1BUDoKKwkJcmV0dXJuICJtYXAiLCBuaWwKKwljYXNlIFNFVDoKKwkJcmV0dXJuICJzZXQiLCBuaWwKKwljYXNlIExJU1Q6CisJCXJldHVybiAibHN0IiwgbmlsCisJfQorCisJZSA6PSBmbXQuRXJyb3JmKCJVbmtub3duIGZpZWxkVHlwZTogJWQiLCBpbnQoZmllbGRUeXBlKSkKKwlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgU3RyaW5nVG9UeXBlSWQoZmllbGRUeXBlIHN0cmluZykgKFRUeXBlLCBlcnJvcikgeworCXN3aXRjaCBmaWVsZFR5cGUgeworCWNhc2UgInRmIjoKKwkJcmV0dXJuIFRUeXBlKEJPT0wpLCBuaWwKKwljYXNlICJpOCI6CisJCXJldHVybiBUVHlwZShCWVRFKSwgbmlsCisJY2FzZSAiaTE2IjoKKwkJcmV0dXJuIFRUeXBlKEkxNiksIG5pbAorCWNhc2UgImkzMiI6CisJCXJldHVybiBUVHlwZShJMzIpLCBuaWwKKwljYXNlICJpNjQiOgorCQlyZXR1cm4gVFR5cGUoSTY0KSwgbmlsCisJY2FzZSAiZGJsIjoKKwkJcmV0dXJuIFRUeXBlKERPVUJMRSksIG5pbAorCWNhc2UgInN0ciI6CisJCXJldHVybiBUVHlwZShTVFJJTkcpLCBuaWwKKwljYXNlICJyZWMiOgorCQlyZXR1cm4gVFR5cGUoU1RSVUNUKSwgbmlsCisJY2FzZSAibWFwIjoKKwkJcmV0dXJuIFRUeXBlKE1BUCksIG5pbAorCWNhc2UgInNldCI6CisJCXJldHVybiBUVHlwZShTRVQpLCBuaWwKKwljYXNlICJsc3QiOgorCQlyZXR1cm4gVFR5cGUoTElTVCksIG5pbAorCX0KKworCWUgOj0gZm10LkVycm9yZigiVW5rbm93biB0eXBlIGlkZW50aWZpZXI6ICVzIiwgZmllbGRUeXBlKQorCXJldHVybiBUVHlwZShTVE9QKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM0ZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisJIm1hdGgiCisJInN0cmNvbnYiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJib29sZWFuIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVCb29sKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJZXhwZWN0ZWQgOj0gIiIKKwkJaWYgdmFsdWUgeworCQkJZXhwZWN0ZWQgPSAiMSIKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkID0gIjAiCisJCX0KKwkJaWYgcyAhPSBleHBlY3RlZCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMgZXhwZWN0ZWQiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IC0xCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCAodiAhPSAwKSAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJib29sZWFuIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCWlmIHZhbHVlIHsKKwkJCXRyYW5zLldyaXRlKFtdYnl0ZXsnMSd9KSAvLyBub3QgSlNPTl9UUlVFCisJCX0gZWxzZSB7CisJCQl0cmFucy5Xcml0ZShbXWJ5dGV7JzAnfSkgLy8gbm90IEpTT05fRkFMU0UKKwkJfQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJvb2woKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl2diA6PSAtMQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdnYpOyBlcnIgIT0gbmlsIHx8ICh2diAhPSAwKSAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2dikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJieXRlIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDgoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQnl0ZSgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQxNigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDE2IgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTE2KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDMyKDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJMzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJNjQodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50NjQoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQ2NCIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJNjQoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9OQU4pIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSkKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJkb3VibGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQorCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZERvdWJsZSgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiAhbWF0aC5Jc0luZih2LCAxKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgLTEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmICFtYXRoLklzTmFOKHYpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgc1swXSAhPSAnIicgfHwgc1tsZW4ocyktMV0gIT0gJyInIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICcldicsIHdyb3RlICcldicsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBmbXQuU3ByaW50KCJcIiIsIHZhbHVlLCAiXCIiKSkKKwkJfQorCQl2IDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYpOyBlcnIgIT0gbmlsIHx8ICp2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZSh2YWx1ZSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdjEgOj0gbmV3KHN0cmluZykKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJaWYgZSA6PSBwLldyaXRlQmluYXJ5KHZhbHVlKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwlleHBlY3RlZFN0cmluZyA6PSBmbXQuU3ByaW50KCJcIiIsIGI2NFN0cmluZywgIlwiIikKKwlpZiBzICE9IGV4cGVjdGVkU3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXZcbiAgd3JvdGU6ICBcIiV2XCJcbmV4cGVjdGVkOiBcIiV2XCIiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZXhwZWN0ZWRTdHJpbmcpCisJfQorCXYxLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkIGJpbmFyeTogJXMiLCBlcnIuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYxKSAhPSBsZW4odmFsdWUpIHsKKwkJdC5GYXRhbGYoIkludmFsaWQgdmFsdWUgZm9yIGJpbmFyeVxuZXhwZWN0ZWQ6IFwiJXZcIlxuICAgcmVhZDogXCIldlwiIiwgdmFsdWUsIHYxKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSB2YWx1ZSB7CisJCWlmIHYxW2tdICE9IHYgeworCQkJdC5GYXRhbGYoIkludmFsaWQgdmFsdWUgZm9yIGJpbmFyeSBhdCAldlxuZXhwZWN0ZWQ6IFwiJXZcIlxuICAgcmVhZDogXCIldlwiIiwgaywgdiwgdjFba10pCisJCX0KKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBsZW4odikgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQorCX0KKwlmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgeworCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICVkIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIGksIHZhbHVlW2ldLCBzLCB2W2ldKQorCQl9CisJfQorCXYxIDo9IG5ldyhzdHJpbmcpCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sTGlzdCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJsaXN0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlTGlzdEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiTGlzdCBtdXN0IGJlIGF0IGxlYXN0IG9mIGxlbmd0aCB0d28gdG8gaW5jbHVkZSBtZXRhZGF0YSIpCisJfQorCWlmIGxbMF0gIT0gImRibCIgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBTVFJJTkcsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJcyA6PSBsW2srMl0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xTZXQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic2V0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlU2V0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlU2V0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIlNldCBtdXN0IGJlIGF0IGxlYXN0IG9mIGxlbmd0aCB0d28gdG8gaW5jbHVkZSBtZXRhZGF0YSIpCisJfQorCWlmIGxbMF0gIT0gImRibCIgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3Igc2V0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gIm1hcCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVNYXBFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJfQorCWV4cGVjdGVkS2V5VHlwZSwgZXhwZWN0ZWRWYWx1ZVR5cGUsIGV4cGVjdGVkU2l6ZSwgZXJyIDo9IHAuUmVhZE1hcEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkVycm9yIHdoaWxlIHJlYWRpbmcgbWFwIGJlZ2luOiAlcyIsIGVyci5FcnJvcigpKQorCX0KKwlpZiBleHBlY3RlZEtleVR5cGUgIT0gSTMyIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIGtleSB0eXBlICIsIEkzMiwgIiwgYnV0IHdhcyAiLCBleHBlY3RlZEtleVR5cGUpCisJfQorCWlmIGV4cGVjdGVkVmFsdWVUeXBlICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCB2YWx1ZSB0eXBlICIsIERPVUJMRSwgIiwgYnV0IHdhcyAiLCBleHBlY3RlZFZhbHVlVHlwZSkKKwl9CisJaWYgZXhwZWN0ZWRTaXplICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBzaXplIG9mICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhcyAiLCBleHBlY3RlZFNpemUpCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWssIGVyciA6PSBwLlJlYWRJMzIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJCYWQga2V5IGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGlrLCBzdHJpbmcoayksIGVyci5FcnJvcigpKQorCQl9CisJCWlmIGludChpaykgIT0gayB7CisJCQl0LkZhdGFsZigiQmFkIGtleSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgaWssIGspCisJCX0KKwkJZHYsIGVyciA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiwgZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZHYsIHZhbHVlLCBlcnIuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHN0cmNvbnYuRm9ybWF0RmxvYXQoZHYsICdnJywgMTAsIDY0KQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiAhbWF0aC5Jc0luZihkdiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiAhbWF0aC5Jc0luZihkdiwgMCkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTihkdikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSkKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkIDo9IHN0cmNvbnYuRm9ybWF0RmxvYXQodmFsdWUsICdnJywgMTAsIDY0KQorCQkJaWYgcyAhPSBleHBlY3RlZCB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQgJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgZXhwZWN0ZWQpCisJCQl9CisJCQl2IDo9IGZsb2F0NjQoMCkKKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJfQorCWVyciA9IHAuUmVhZE1hcEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBlbmQ6ICVzIiwgZXJyLkVycm9yKCkpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3MzY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCkBAIC0wLDAgKzEsNTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJ0ZXN0aW5nIgorKQorCit2YXIgYmluYXJ5UHJvdG9GID0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQordmFyIGNvbXBhY3RQcm90b0YgPSBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisKK3ZhciBidWYgPSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKQorCit2YXIgdGZ2ID0gW11UVHJhbnNwb3J0RmFjdG9yeXsKKwlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwlOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KGJ1ZiwgYnVmLCB0cnVlKSwKKwlOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STE2XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STMyXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5STY0XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCeXRlXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUwKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCeXRlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUxKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCeXRlXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUyKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28gYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzNmQyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorKQorCisvLyBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KK3R5cGUgVE1lbW9yeUJ1ZmZlciBzdHJ1Y3QgeworCSpieXRlcy5CdWZmZXIKKwlzaXplIGludAorfQorCit0eXBlIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CisJc2l6ZSBpbnQKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiB0cmFucyAhPSBuaWwgeworCQl0LCBvayA6PSB0cmFucy4oKlRNZW1vcnlCdWZmZXIpCisJCWlmIG9rICYmIHQuc2l6ZSA+IDAgeworCQkJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4odC5zaXplKSwgbmlsCisJCX0KKwl9CisJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4ocC5zaXplKSwgbmlsCit9CisKK2Z1bmMgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkoc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeXtzaXplOiBzaXplfQorfQorCitmdW5jIE5ld1RNZW1vcnlCdWZmZXIoKSAqVE1lbW9yeUJ1ZmZlciB7CisJcmV0dXJuICZUTWVtb3J5QnVmZmVye0J1ZmZlcjogJmJ5dGVzLkJ1ZmZlcnt9LCBzaXplOiAwfQorfQorCitmdW5jIE5ld1RNZW1vcnlCdWZmZXJMZW4oc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIDAsIHNpemUpCisJcmV0dXJuICZUTWVtb3J5QnVmZmVye0J1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIHNpemU6IHNpemV9Cit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIElzT3BlbigpIGJvb2wgeworCXJldHVybiB0cnVlCit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBDbG9zZSgpIGVycm9yIHsKKwlwLkJ1ZmZlci5SZXNldCgpCisJcmV0dXJuIG5pbAorfQorCisvLyBGbHVzaGluZyBhIG1lbW9yeSBidWZmZXIgaXMgYSBuby1vcAorZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiB1aW50NjQocC5CdWZmZXIuTGVuKCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMmU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXJfdGVzdC5nbwpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdE1lbW9yeUJ1ZmZlcih0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyTGVuKDEwMjQpCisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L21lc3NhZ2V0eXBlLmdvIGIvbGliL2dvL3RocmlmdC9tZXNzYWdldHlwZS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFiMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tZXNzYWdldHlwZS5nbwpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIE1lc3NhZ2UgdHlwZSBjb25zdGFudHMgaW4gdGhlIFRocmlmdCBwcm90b2NvbC4KK3R5cGUgVE1lc3NhZ2VUeXBlIGludDMyCisKK2NvbnN0ICgKKwlJTlZBTElEX1RNRVNTQUdFX1RZUEUgVE1lc3NhZ2VUeXBlID0gMAorCUNBTEwgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSAxCisJUkVQTFkgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDIKKwlFWENFUFRJT04gICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMworCU9ORVdBWSAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSA0CispCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI4YTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbXQiCisJInN0cmluZ3MiCispCisKKy8qCitUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgordGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKK2J5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisKK05PVEU6IFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3QKK2Zyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorCitUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisKK3NvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQordHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKK3Byb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCittcCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIikKK3NlcnZpY2UgOj0gQ2FsY3VsYXRvci5OZXdDYWxjdWxhdG9yQ2xpZW50KG1wKQorCittcDIgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpCitzZXJ2aWNlMiA6PSBXZWF0aGVyUmVwb3J0Lk5ld1dlYXRoZXJSZXBvcnRDbGllbnQobXAyKQorCitlcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQoraWYgZXJyICE9IG5pbCB7CisJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKK30KKworZm10LlByaW50bG4oc2VydmljZS5BZGQoMiwyKSkKK2ZtdC5QcmludGxuKHNlcnZpY2UyLkdldFRlbXBlcmF0dXJlKCkpCisqLworCit0eXBlIFRNdWx0aXBsZXhlZFByb3RvY29sIHN0cnVjdCB7CisJVFByb3RvY29sCisJc2VydmljZU5hbWUgc3RyaW5nCit9CisKK2NvbnN0IE1VTFRJUExFWEVEX1NFUEFSQVRPUiA9ICI6IgorCitmdW5jIE5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sIFRQcm90b2NvbCwgc2VydmljZU5hbWUgc3RyaW5nKSAqVE11bHRpcGxleGVkUHJvdG9jb2wgeworCXJldHVybiAmVE11bHRpcGxleGVkUHJvdG9jb2x7CisJCVRQcm90b2NvbDogICBwcm90b2NvbCwKKwkJc2VydmljZU5hbWU6IHNlcnZpY2VOYW1lLAorCX0KK30KKworZnVuYyAodCAqVE11bHRpcGxleGVkUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgZXJyb3IgeworCWlmIHR5cGVJZCA9PSBDQUxMIHx8IHR5cGVJZCA9PSBPTkVXQVkgeworCQlyZXR1cm4gdC5UUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4odC5zZXJ2aWNlTmFtZStNVUxUSVBMRVhFRF9TRVBBUkFUT1IrbmFtZSwgdHlwZUlkLCBzZXFpZCkKKwl9IGVsc2UgeworCQlyZXR1cm4gdC5UUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZUlkLCBzZXFpZCkKKwl9Cit9CisKKy8qCitUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaXMgYSBUUHJvY2Vzc29yIGFsbG93aW5nCithIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisKK1RvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCitwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKwordmFyIHByb2Nlc3NvciA9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCitmaXJzdFByb2Nlc3NvciA6PQorcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAiQ2FsY3VsYXRvciIsCisgIENhbGN1bGF0b3IuTmV3Q2FsY3VsYXRvclByb2Nlc3NvcigmQ2FsY3VsYXRvckhhbmRsZXJ7fSksCispCisKK3Byb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgIldlYXRoZXJSZXBvcnQiLAorICBXZWF0aGVyUmVwb3J0Lk5ld1dlYXRoZXJSZXBvcnRQcm9jZXNzb3IoJldlYXRoZXJSZXBvcnRIYW5kbGVye30pLAorKQorCitzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkciwgVElNRU9VVCkKK2lmIGVyciAhPSBuaWwgeworICB0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCit9CitzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorc2VydmVyLlNlcnZlKCk7CisqLworCit0eXBlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBzdHJ1Y3QgeworCXNlcnZpY2VQcm9jZXNzb3JNYXAgbWFwW3N0cmluZ11UUHJvY2Vzc29yCisJRGVmYXVsdFByb2Nlc3NvciAgICBUUHJvY2Vzc29yCit9CisKK2Z1bmMgTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkgKlRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisJcmV0dXJuICZUTXVsdGlwbGV4ZWRQcm9jZXNzb3J7CisJCXNlcnZpY2VQcm9jZXNzb3JNYXA6IG1ha2UobWFwW3N0cmluZ11UUHJvY2Vzc29yKSwKKwl9Cit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUmVnaXN0ZXJEZWZhdWx0KHByb2Nlc3NvciBUUHJvY2Vzc29yKSB7CisJdC5EZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yCit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUmVnaXN0ZXJQcm9jZXNzb3IobmFtZSBzdHJpbmcsIHByb2Nlc3NvciBUUHJvY2Vzc29yKSB7CisJaWYgdC5zZXJ2aWNlUHJvY2Vzc29yTWFwID09IG5pbCB7CisJCXQuc2VydmljZVByb2Nlc3Nvck1hcCA9IG1ha2UobWFwW3N0cmluZ11UUHJvY2Vzc29yKQorCX0KKwl0LnNlcnZpY2VQcm9jZXNzb3JNYXBbbmFtZV0gPSBwcm9jZXNzb3IKK30KKworZnVuYyAodCAqVE11bHRpcGxleGVkUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCW5hbWUsIHR5cGVJZCwgc2VxaWQsIGVyciA6PSBpbi5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJaWYgdHlwZUlkICE9IENBTEwgJiYgdHlwZUlkICE9IE9ORVdBWSB7CisJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUgJXYiLCB0eXBlSWQpCisJfQorCS8vZXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisJdiA6PSBzdHJpbmdzLlNwbGl0TihuYW1lLCBNVUxUSVBMRVhFRF9TRVBBUkFUT1IsIDIpCisJaWYgbGVuKHYpICE9IDIgeworCQlpZiB0LkRlZmF1bHRQcm9jZXNzb3IgIT0gbmlsIHsKKwkJCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIG5hbWUsIHR5cGVJZCwgc2VxaWQpCisJCQlyZXR1cm4gdC5EZWZhdWx0UHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzbWIsIG91dCkKKwkJfQorCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAlcy4gIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iLCBuYW1lKQorCX0KKwlhY3R1YWxQcm9jZXNzb3IsIG9rIDo9IHQuc2VydmljZVByb2Nlc3Nvck1hcFt2WzBdXQorCWlmICFvayB7CisJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogJXMuICBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwgdlswXSkKKwl9CisJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdlsxXSwgdHlwZUlkLCBzZXFpZCkKKwlyZXR1cm4gYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzbWIsIG91dCkKK30KKworLy9Qcm90b2NvbCB0aGF0IHVzZSBzdG9yZWQgbWVzc2FnZSBmb3IgUmVhZE1lc3NhZ2VCZWdpbgordHlwZSBzdG9yZWRNZXNzYWdlUHJvdG9jb2wgc3RydWN0IHsKKwlUUHJvdG9jb2wKKwluYW1lICAgc3RyaW5nCisJdHlwZUlkIFRNZXNzYWdlVHlwZQorCXNlcWlkICBpbnQzMgorfQorCitmdW5jIE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChwcm90b2NvbCBUUHJvdG9jb2wsIG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgKnN0b3JlZE1lc3NhZ2VQcm90b2NvbCB7CisJcmV0dXJuICZzdG9yZWRNZXNzYWdlUHJvdG9jb2x7cHJvdG9jb2wsIG5hbWUsIHR5cGVJZCwgc2VxaWR9Cit9CisKK2Z1bmMgKHMgKnN0b3JlZE1lc3NhZ2VQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiBzLm5hbWUsIHMudHlwZUlkLCBzLnNlcWlkLCBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbnVtZXJpYy5nbyBiL2xpYi9nby90aHJpZnQvbnVtZXJpYy5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThkYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9udW1lcmljLmdvCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJIm1hdGgiCisJInN0cmNvbnYiCispCisKK3R5cGUgTnVtZXJpYyBpbnRlcmZhY2UgeworCUludDY0KCkgaW50NjQKKwlJbnQzMigpIGludDMyCisJSW50MTYoKSBpbnQxNgorCUJ5dGUoKSBieXRlCisJSW50KCkgaW50CisJRmxvYXQ2NCgpIGZsb2F0NjQKKwlGbG9hdDMyKCkgZmxvYXQzMgorCVN0cmluZygpIHN0cmluZworCWlzTnVsbCgpIGJvb2wKK30KKwordHlwZSBudW1lcmljIHN0cnVjdCB7CisJaVZhbHVlIGludDY0CisJZFZhbHVlIGZsb2F0NjQKKwlzVmFsdWUgc3RyaW5nCisJaXNOaWwgIGJvb2wKK30KKwordmFyICgKKwlJTkZJTklUWSAgICAgICAgICBOdW1lcmljCisJTkVHQVRJVkVfSU5GSU5JVFkgTnVtZXJpYworCU5BTiAgICAgICAgICAgICAgIE51bWVyaWMKKwlaRVJPICAgICAgICAgICAgICBOdW1lcmljCisJTlVNRVJJQ19OVUxMICAgICAgTnVtZXJpYworKQorCitmdW5jIE5ld051bWVyaWNGcm9tRG91YmxlKGRWYWx1ZSBmbG9hdDY0KSBOdW1lcmljIHsKKwlpZiBtYXRoLklzSW5mKGRWYWx1ZSwgMSkgeworCQlyZXR1cm4gSU5GSU5JVFkKKwl9CisJaWYgbWF0aC5Jc0luZihkVmFsdWUsIC0xKSB7CisJCXJldHVybiBORUdBVElWRV9JTkZJTklUWQorCX0KKwlpZiBtYXRoLklzTmFOKGRWYWx1ZSkgeworCQlyZXR1cm4gTkFOCisJfQorCWlWYWx1ZSA6PSBpbnQ2NChkVmFsdWUpCisJc1ZhbHVlIDo9IHN0cmNvbnYuRm9ybWF0RmxvYXQoZFZhbHVlLCAnZycsIDEwLCA2NCkKKwlpc05pbCA6PSBmYWxzZQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Cit9CisKK2Z1bmMgTmV3TnVtZXJpY0Zyb21JNjQoaVZhbHVlIGludDY0KSBOdW1lcmljIHsKKwlkVmFsdWUgOj0gZmxvYXQ2NChpVmFsdWUpCisJc1ZhbHVlIDo9IHN0cmluZyhpVmFsdWUpCisJaXNOaWwgOj0gZmFsc2UKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSTMyKGlWYWx1ZSBpbnQzMikgTnVtZXJpYyB7CisJZFZhbHVlIDo9IGZsb2F0NjQoaVZhbHVlKQorCXNWYWx1ZSA6PSBzdHJpbmcoaVZhbHVlKQorCWlzTmlsIDo9IGZhbHNlCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaW50NjQoaVZhbHVlKSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Cit9CisKK2Z1bmMgTmV3TnVtZXJpY0Zyb21TdHJpbmcoc1ZhbHVlIHN0cmluZykgTnVtZXJpYyB7CisJaWYgc1ZhbHVlID09IElORklOSVRZLlN0cmluZygpIHsKKwkJcmV0dXJuIElORklOSVRZCisJfQorCWlmIHNWYWx1ZSA9PSBORUdBVElWRV9JTkZJTklUWS5TdHJpbmcoKSB7CisJCXJldHVybiBORUdBVElWRV9JTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gTkFOLlN0cmluZygpIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUludChzVmFsdWUsIDEwLCA2NCkKKwlkVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUZsb2F0KHNWYWx1ZSwgNjQpCisJaXNOaWwgOj0gbGVuKHNWYWx1ZSkgPT0gMAorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Cit9CisKK2Z1bmMgTmV3TnVtZXJpY0Zyb21KU09OU3RyaW5nKHNWYWx1ZSBzdHJpbmcsIGlzTnVsbCBib29sKSBOdW1lcmljIHsKKwlpZiBpc051bGwgeworCQlyZXR1cm4gTmV3TnVsbE51bWVyaWMoKQorCX0KKwlpZiBzVmFsdWUgPT0gSlNPTl9JTkZJTklUWSB7CisJCXJldHVybiBJTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCXJldHVybiBORUdBVElWRV9JTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gSlNPTl9OQU4geworCQlyZXR1cm4gTkFOCisJfQorCWlWYWx1ZSwgXyA6PSBzdHJjb252LlBhcnNlSW50KHNWYWx1ZSwgMTAsIDY0KQorCWRWYWx1ZSwgXyA6PSBzdHJjb252LlBhcnNlRmxvYXQoc1ZhbHVlLCA2NCkKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTnVsbH0KK30KKworZnVuYyBOZXdOdWxsTnVtZXJpYygpIE51bWVyaWMgeworCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMC4wLCBzVmFsdWU6ICIiLCBpc05pbDogdHJ1ZX0KK30KKworZnVuYyAocCAqbnVtZXJpYykgSW50NjQoKSBpbnQ2NCB7CisJcmV0dXJuIHAuaVZhbHVlCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDMyKCkgaW50MzIgeworCXJldHVybiBpbnQzMihwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgSW50MTYoKSBpbnQxNiB7CisJcmV0dXJuIGludDE2KHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBCeXRlKCkgYnl0ZSB7CisJcmV0dXJuIGJ5dGUocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludCgpIGludCB7CisJcmV0dXJuIGludChwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgRmxvYXQ2NCgpIGZsb2F0NjQgeworCXJldHVybiBwLmRWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBGbG9hdDMyKCkgZmxvYXQzMiB7CisJcmV0dXJuIGZsb2F0MzIocC5kVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHAuc1ZhbHVlCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIGlzTnVsbCgpIGJvb2wgeworCXJldHVybiBwLmlzTmlsCit9CisKK2Z1bmMgaW5pdCgpIHsKKwlJTkZJTklUWSA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLkluZigxKSwgc1ZhbHVlOiAiSW5maW5pdHkiLCBpc05pbDogZmFsc2V9CisJTkVHQVRJVkVfSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoLTEpLCBzVmFsdWU6ICItSW5maW5pdHkiLCBpc05pbDogZmFsc2V9CisJTkFOID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguTmFOKCksIHNWYWx1ZTogIk5hTiIsIGlzTmlsOiBmYWxzZX0KKwlaRVJPID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAsIHNWYWx1ZTogIjAiLCBpc05pbDogZmFsc2V9CisJTlVNRVJJQ19OVUxMID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAsIHNWYWx1ZTogIjAiLCBpc05pbDogdHJ1ZX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcG9pbnRlcml6ZS5nbyBiL2xpYi9nby90aHJpZnQvcG9pbnRlcml6ZS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZiMmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wb2ludGVyaXplLmdvCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhpcyBmaWxlIGlzIGhvbWUgdG8gaGVscGVycyB0aGF0IGNvbnZlcnQgZnJvbSB2YXJpb3VzIGJhc2UgdHlwZXMgdG8KKy8vIHJlc3BlY3RpdmUgcG9pbnRlciB0eXBlcy4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHbyBkb2VzIG5vdCBwZXJtaXQKKy8vIHJlZmVyZW5jZXMgdG8gY29uc3RhbnRzLCBub3IgY2FuIGEgcG9pbnRlciB0eXBlIHRvIGJhc2UgdHlwZSBiZSBhbGxvY2F0ZWQKKy8vIGFuZCBpbml0aWFsaXplZCBpbiBhIHNpbmdsZSBleHByZXNzaW9uLgorLy8KKy8vIEUuZy4sIHRoaXMgaXMgbm90IGFsbG93ZWQ6CisvLworLy8gICAgdmFyIGlwICppbnQgPSAmNQorLy8KKy8vIEJ1dCB0aGlzICppcyogYWxsb3dlZDoKKy8vCisvLyAgICBmdW5jIEludFB0cihpIGludCkgKmludCB7IHJldHVybiAmaSB9CisvLyAgICB2YXIgaXAgKmludCA9IEludFB0cig1KQorLy8KKy8vIFNpbmNlIHBvaW50ZXJzIHRvIGJhc2UgdHlwZXMgYXJlIGNvbW1vbnBsYWNlIGFzIFtvcHRpb25hbF0gZmllbGRzIGluCisvLyBleHBvcnRlZCB0aHJpZnQgc3RydWN0cywgd2UgZmFjdG9yIHN1Y2ggaGVscGVycyBoZXJlLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitmdW5jIEZsb2F0MzJQdHIodiBmbG9hdDMyKSAqZmxvYXQzMiB7IHJldHVybiAmdiB9CitmdW5jIEZsb2F0NjRQdHIodiBmbG9hdDY0KSAqZmxvYXQ2NCB7IHJldHVybiAmdiB9CitmdW5jIEludFB0cih2IGludCkgKmludCAgICAgICAgICAgICB7IHJldHVybiAmdiB9CitmdW5jIEludDMyUHRyKHYgaW50MzIpICppbnQzMiAgICAgICB7IHJldHVybiAmdiB9CitmdW5jIEludDY0UHRyKHYgaW50NjQpICppbnQ2NCAgICAgICB7IHJldHVybiAmdiB9CitmdW5jIFN0cmluZ1B0cih2IHN0cmluZykgKnN0cmluZyAgICB7IHJldHVybiAmdiB9CitmdW5jIFVpbnQzMlB0cih2IHVpbnQzMikgKnVpbnQzMiAgICB7IHJldHVybiAmdiB9CitmdW5jIFVpbnQ2NFB0cih2IHVpbnQ2NCkgKnVpbnQ2NCAgICB7IHJldHVybiAmdiB9CitmdW5jIEJvb2xQdHIodiBib29sKSAqYm9vbCAgICAgICAgICB7IHJldHVybiAmdiB9CitmdW5jIEJ5dGVTbGljZVB0cih2IFtdYnl0ZSkgKltdYnl0ZSB7IHJldHVybiAmdiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIxMzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbwpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKworLy8gQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBvcGVyYXRlcyB1cG9uIGFuIGlucHV0IHN0cmVhbSBhbmQKKy8vIHdyaXRlcyB0byBzb21lIG91dHB1dCBzdHJlYW0uCit0eXBlIFRQcm9jZXNzb3IgaW50ZXJmYWNlIHsKKwlQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKK30KKwordHlwZSBUUHJvY2Vzc29yRnVuY3Rpb24gaW50ZXJmYWNlIHsKKwlQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIHNlcUlkIGludDMyLCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKKy8vIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IGp1c3QgcmV0dXJucyBhIHNpbmdsZXRvbgorLy8gaW5zdGFuY2UuCit0eXBlIFRQcm9jZXNzb3JGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0UHJvY2Vzc29yKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3IKK30KKwordHlwZSB0UHJvY2Vzc29yRmFjdG9yeSBzdHJ1Y3QgeworCXByb2Nlc3NvciBUUHJvY2Vzc29yCit9CisKK2Z1bmMgTmV3VFByb2Nlc3NvckZhY3RvcnkocCBUUHJvY2Vzc29yKSBUUHJvY2Vzc29yRmFjdG9yeSB7CisJcmV0dXJuICZ0UHJvY2Vzc29yRmFjdG9yeXtwcm9jZXNzb3I6IHB9Cit9CisKK2Z1bmMgKHAgKnRQcm9jZXNzb3JGYWN0b3J5KSBHZXRQcm9jZXNzb3IodHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvciB7CisJcmV0dXJuIHAucHJvY2Vzc29yCit9CisKKy8qKgorICogVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3RvcnkganVzdCByZXR1cm5zIGEgc2luZ2xldG9uCisgKiBpbnN0YW5jZS4KKyAqLwordHlwZSBUUHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5IGludGVyZmFjZSB7CisJR2V0UHJvY2Vzc29yRnVuY3Rpb24odHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvckZ1bmN0aW9uCit9CisKK3R5cGUgdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSBzdHJ1Y3QgeworCXByb2Nlc3NvciBUUHJvY2Vzc29yRnVuY3Rpb24KK30KKworZnVuYyBOZXdUUHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5KHAgVFByb2Nlc3NvckZ1bmN0aW9uKSBUUHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5IHsKKwlyZXR1cm4gJnRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnl7cHJvY2Vzc29yOiBwfQorfQorCitmdW5jIChwICp0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5KSBHZXRQcm9jZXNzb3JGdW5jdGlvbih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yRnVuY3Rpb24geworCXJldHVybiBwLnByb2Nlc3NvcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1YjdhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJmbXQiCispCisKK2NvbnN0ICgKKwlWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCisJVkVSU0lPTl8xICAgID0gMHg4MDAxMDAwMAorKQorCit0eXBlIFRQcm90b2NvbCBpbnRlcmZhY2UgeworCVdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgZXJyb3IKKwlXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvcgorCVdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yCisJV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvcgorCVdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IKKwlXcml0ZUZpZWxkRW5kKCkgZXJyb3IKKwlXcml0ZUZpZWxkU3RvcCgpIGVycm9yCisJV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvcgorCVdyaXRlTWFwRW5kKCkgZXJyb3IKKwlXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCisJV3JpdGVMaXN0RW5kKCkgZXJyb3IKKwlXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IKKwlXcml0ZVNldEVuZCgpIGVycm9yCisJV3JpdGVCb29sKHZhbHVlIGJvb2wpIGVycm9yCisJV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yCisJV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yCisJV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yCisJV3JpdGVJNjQodmFsdWUgaW50NjQpIGVycm9yCisJV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IKKwlXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yCisJV3JpdGVCaW5hcnkodmFsdWUgW11ieXRlKSBlcnJvcgorCisJUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIsIGVyciBlcnJvcikKKwlSZWFkTWVzc2FnZUVuZCgpIGVycm9yCisJUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpCisJUmVhZFN0cnVjdEVuZCgpIGVycm9yCisJUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBlcnJvcikKKwlSZWFkRmllbGRFbmQoKSBlcnJvcgorCVJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpCisJUmVhZE1hcEVuZCgpIGVycm9yCisJUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKKwlSZWFkTGlzdEVuZCgpIGVycm9yCisJUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKQorCVJlYWRTZXRFbmQoKSBlcnJvcgorCVJlYWRCb29sKCkgKHZhbHVlIGJvb2wsIGVyciBlcnJvcikKKwlSZWFkQnl0ZSgpICh2YWx1ZSBpbnQ4LCBlcnIgZXJyb3IpCisJUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKQorCVJlYWRJMzIoKSAodmFsdWUgaW50MzIsIGVyciBlcnJvcikKKwlSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpCisJUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpCisJUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikKKwlSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKQorCisJU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpCisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKKworCVRyYW5zcG9ydCgpIFRUcmFuc3BvcnQKK30KKworLy8gVGhlIG1heGltdW0gcmVjdXJzaXZlIGRlcHRoIHRoZSBza2lwKCkgZnVuY3Rpb24gd2lsbCB0cmF2ZXJzZQorY29uc3QgREVGQVVMVF9SRUNVUlNJT05fREVQVEggPSA2NAorCisvLyBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorZnVuYyBTa2lwRGVmYXVsdERlcHRoKHByb3QgVFByb3RvY29sLCB0eXBlSWQgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gU2tpcChwcm90LCB0eXBlSWQsIERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIKQorfQorCisvLyBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorZnVuYyBTa2lwKHNlbGYgVFByb3RvY29sLCBmaWVsZFR5cGUgVFR5cGUsIG1heERlcHRoIGludCkgKGVyciBlcnJvcikgeworCisJaWYgbWF4RGVwdGggPD0gMCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShERVBUSF9MSU1JVCwgZXJyb3JzLk5ldygiRGVwdGggbGltaXQgZXhjZWVkZWQiKSkKKwl9CisKKwlzd2l0Y2ggZmllbGRUeXBlIHsKKwljYXNlIFNUT1A6CisJCXJldHVybgorCWNhc2UgQk9PTDoKKwkJXywgZXJyID0gc2VsZi5SZWFkQm9vbCgpCisJCXJldHVybgorCWNhc2UgQllURToKKwkJXywgZXJyID0gc2VsZi5SZWFkQnl0ZSgpCisJCXJldHVybgorCWNhc2UgSTE2OgorCQlfLCBlcnIgPSBzZWxmLlJlYWRJMTYoKQorCQlyZXR1cm4KKwljYXNlIEkzMjoKKwkJXywgZXJyID0gc2VsZi5SZWFkSTMyKCkKKwkJcmV0dXJuCisJY2FzZSBJNjQ6CisJCV8sIGVyciA9IHNlbGYuUmVhZEk2NCgpCisJCXJldHVybgorCWNhc2UgRE9VQkxFOgorCQlfLCBlcnIgPSBzZWxmLlJlYWREb3VibGUoKQorCQlyZXR1cm4KKwljYXNlIFNUUklORzoKKwkJXywgZXJyID0gc2VsZi5SZWFkU3RyaW5nKCkKKwkJcmV0dXJuCisJY2FzZSBTVFJVQ1Q6CisJCWlmIF8sIGVyciA9IHNlbGYuUmVhZFN0cnVjdEJlZ2luKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciB7CisJCQlfLCB0eXBlSWQsIF8sIF8gOj0gc2VsZi5SZWFkRmllbGRCZWdpbigpCisJCQlpZiB0eXBlSWQgPT0gU1RPUCB7CisJCQkJYnJlYWsKKwkJCX0KKwkJCWVyciA6PSBTa2lwKHNlbGYsIHR5cGVJZCwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJCXNlbGYuUmVhZEZpZWxkRW5kKCkKKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkU3RydWN0RW5kKCkKKwljYXNlIE1BUDoKKwkJa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIgOj0gc2VsZi5SZWFkTWFwQmVnaW4oKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJCWVyciA6PSBTa2lwKHNlbGYsIGtleVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCQlzZWxmLlNraXAodmFsdWVUeXBlKQorCQl9CisJCXJldHVybiBzZWxmLlJlYWRNYXBFbmQoKQorCWNhc2UgU0VUOgorCQllbGVtVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZFNldEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCQllcnIgOj0gU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkU2V0RW5kKCkKKwljYXNlIExJU1Q6CisJCWVsZW1UeXBlLCBzaXplLCBlcnIgOj0gc2VsZi5SZWFkTGlzdEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCQllcnIgOj0gU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkTGlzdEVuZCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5rbm93biBkYXRhIHR5cGUgJWQiLCBmaWVsZFR5cGUpKSkKKwl9CisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWFiNzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28KQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJlbmNvZGluZy9iYXNlNjQiCispCisKKy8vIFRocmlmdCBQcm90b2NvbCBleGNlcHRpb24KK3R5cGUgVFByb3RvY29sRXhjZXB0aW9uIGludGVyZmFjZSB7CisJVEV4Y2VwdGlvbgorCVR5cGVJZCgpIGludAorfQorCitjb25zdCAoCisJVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04gPSAwCisJSU5WQUxJRF9EQVRBICAgICAgICAgICAgICAgPSAxCisJTkVHQVRJVkVfU0laRSAgICAgICAgICAgICAgPSAyCisJU0laRV9MSU1JVCAgICAgICAgICAgICAgICAgPSAzCisJQkFEX1ZFUlNJT04gICAgICAgICAgICAgICAgPSA0CisJTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgPSA1CisJREVQVEhfTElNSVQgICAgICAgICAgICAgICAgPSA2CispCisKK3R5cGUgdFByb3RvY29sRXhjZXB0aW9uIHN0cnVjdCB7CisJdHlwZUlkICBpbnQKKwltZXNzYWdlIHN0cmluZworfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKnRQcm90b2NvbEV4Y2VwdGlvbikgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5tZXNzYWdlCit9CisKK2Z1bmMgKHAgKnRQcm90b2NvbEV4Y2VwdGlvbikgRXJyb3IoKSBzdHJpbmcgeworCXJldHVybiBwLm1lc3NhZ2UKK30KKworZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyIGVycm9yKSBUUHJvdG9jb2xFeGNlcHRpb24geworCWlmIGVyciA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCWlmIGUsIG9rIDo9IGVyci4oVFByb3RvY29sRXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBvayA6PSBlcnIuKGJhc2U2NC5Db3JydXB0SW5wdXRFcnJvcik7IG9rIHsKKwkJcmV0dXJuICZ0UHJvdG9jb2xFeGNlcHRpb257SU5WQUxJRF9EQVRBLCBlcnIuRXJyb3IoKX0KKwl9CisJcmV0dXJuICZ0UHJvdG9jb2xFeGNlcHRpb257VU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04sIGVyci5FcnJvcigpfQorfQorCitmdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKGVyclR5cGUgaW50LCBlcnIgZXJyb3IpIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisJaWYgZXJyID09IG5pbCB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuICZ0UHJvdG9jb2xFeGNlcHRpb257ZXJyVHlwZSwgZXJyLkVycm9yKCl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwZjc5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZmFjdG9yeS5nbwpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBjb25zdHJ1Y3RpbmcgcHJvdG9jb2wgaW5zdGFuY2VzLgordHlwZSBUUHJvdG9jb2xGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0MDU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiaW8vaW91dGlsIgorCSJtYXRoIgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJ0ZXN0aW5nIgorKQorCitjb25zdCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFID0gMTU1CisKK3ZhciAoCisJcHJvdG9jb2xfYmRhdGEgW11ieXRlIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZzsgc2FtZSBhcyBkYXRhCisJQk9PTF9WQUxVRVMgICAgW11ib29sCisJQllURV9WQUxVRVMgICAgW11pbnQ4CisJSU5UMTZfVkFMVUVTICAgW11pbnQxNgorCUlOVDMyX1ZBTFVFUyAgIFtdaW50MzIKKwlJTlQ2NF9WQUxVRVMgICBbXWludDY0CisJRE9VQkxFX1ZBTFVFUyAgW11mbG9hdDY0CisJU1RSSU5HX1ZBTFVFUyAgW11zdHJpbmcKKykKKworZnVuYyBpbml0KCkgeworCXByb3RvY29sX2JkYXRhID0gbWFrZShbXWJ5dGUsIFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkUpCisJZm9yIGkgOj0gMDsgaSA8IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkU7IGkrKyB7CisJCXByb3RvY29sX2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCisJfQorCUJPT0xfVkFMVUVTID0gW11ib29se2ZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWV9CisJQllURV9WQUxVRVMgPSBbXWludDh7MTE3LCAwLCAxLCAzMiwgMTI3LCAtMTI4LCAtMX0KKwlJTlQxNl9WQUxVRVMgPSBbXWludDE2ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIC0zMjc2OH0KKwlJTlQzMl9WQUxVRVMgPSBbXWludDMyezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNTM1fQorCUlOVDY0X1ZBTFVFUyA9IFtdaW50NjR7NDU5LCAwLCAxLCAtMSwgLTEyOCwgMTI3LCAzMjc2NywgMjE0NzQ4MzY0NywgLTIxNDc0ODM1MzUsIDM0MzU5NzM4NDgxLCAtMzUxODQzNzIwODg3MTksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCA5MjIzMzcyMDM2ODU0Nzc1ODA3fQorCURPVUJMRV9WQUxVRVMgPSBbXWZsb2F0NjR7NDU5LjMsIDAuMCwgLTEuMCwgMS4wLCAwLjUsIDAuMzMzMywgMy4xNDE1OSwgMS41MzdlLTM4LCAxLjY3M2UyNSwgNi4wMjIxNDE3OWUyMywgLTYuMDIyMTQxNzllMjMsIElORklOSVRZLkZsb2F0NjQoKSwgTkVHQVRJVkVfSU5GSU5JVFkuRmxvYXQ2NCgpLCBOQU4uRmxvYXQ2NCgpfQorCVNUUklOR19WQUxVRVMgPSBbXXN0cmluZ3siIiwgImEiLCAic3RbdWZdZiIsICJzdCx1OmZmIHdpdGggc3BhY2VzIiwgInN0dWZmXHR3aXRoXG5lc2NhcGVcXGNoYXJhY3RlcnMnLi4uXCJsb3Rze29mfWZ1bjwveG1sPiJ9Cit9CisKK3R5cGUgSFRUUEVjaG9TZXJ2ZXIgc3RydWN0e30KK3R5cGUgSFRUUEhlYWRlckVjaG9TZXJ2ZXIgc3RydWN0e30KKworZnVuYyAocCAqSFRUUEVjaG9TZXJ2ZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHJlcSAqaHR0cC5SZXF1ZXN0KSB7CisJYnVmLCBlcnIgOj0gaW91dGlsLlJlYWRBbGwocmVxLkJvZHkpCisJaWYgZXJyICE9IG5pbCB7CisJCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQorCQl3LldyaXRlKGJ1ZikKKwl9IGVsc2UgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCisJCXcuV3JpdGUoYnVmKQorCX0KK30KKworZnVuYyAocCAqSFRUUEhlYWRlckVjaG9TZXJ2ZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHJlcSAqaHR0cC5SZXF1ZXN0KSB7CisJYnVmLCBlcnIgOj0gaW91dGlsLlJlYWRBbGwocmVxLkJvZHkpCisJaWYgZXJyICE9IG5pbCB7CisJCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQorCQl3LldyaXRlKGJ1ZikKKwl9IGVsc2UgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCisJCXcuV3JpdGUoYnVmKQorCX0KK30KKworZnVuYyBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQgKnRlc3RpbmcuVCkgKG5ldC5MaXN0ZW5lciwgbmV0LkFkZHIpIHsKKwlhZGRyLCBlcnIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoNDAwMDApCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZmluZCBhdmFpbGFibGUgdGNwIHBvcnQgYWRkcjogJXMiLCBlcnIpCisJCXJldHVybiBuaWwsIGFkZHIKKwl9CisJbCwgZXJyIDo9IG5ldC5MaXN0ZW4oYWRkci5OZXR3b3JrKCksIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgdGNwIGxpc3RlbmVyIG9uICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwkJcmV0dXJuIGwsIGFkZHIKKwl9CisJZ28gaHR0cC5TZXJ2ZShsLCAmSFRUUEVjaG9TZXJ2ZXJ7fSkKKwlyZXR1cm4gbCwgYWRkcgorfQorCitmdW5jIEh0dHBDbGllbnRTZXR1cEZvckhlYWRlclRlc3QodCAqdGVzdGluZy5UKSAobmV0Lkxpc3RlbmVyLCBuZXQuQWRkcikgeworCWFkZHIsIGVyciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCg0MDAwMCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBmaW5kIGF2YWlsYWJsZSB0Y3AgcG9ydCBhZGRyOiAlcyIsIGVycikKKwkJcmV0dXJuIG5pbCwgYWRkcgorCX0KKwlsLCBlcnIgOj0gbmV0Lkxpc3RlbihhZGRyLk5ldHdvcmsoKSwgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCB0Y3AgbGlzdGVuZXIgb24gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCQlyZXR1cm4gbCwgYWRkcgorCX0KKwlnbyBodHRwLlNlcnZlKGwsICZIVFRQSGVhZGVyRWNob1NlcnZlcnt9KQorCXJldHVybiBsLCBhZGRyCit9CisKK2Z1bmMgUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQgKnRlc3RpbmcuVCwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIHsKKwlidWYgOj0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlkZWZlciBsLkNsb3NlKCkKKwl0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7CisJCU5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAorCQlOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KGJ1ZiwgYnVmLCB0cnVlKSwKKwkJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSgwLCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDYsIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoOSwgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpKSwKKwkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKSwKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKKwkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlQm9vbCh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShCT09MKQorCXRoZWxlbiA6PSBsZW4oQk9PTF9WQUxVRVMpCisJZXJyIDo9IHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIHRoZXR5cGUpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJZXJyID0gcC5Xcml0ZUJvb2wodikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgYm9vbCBpbiBsaXN0IGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3Igd3JpdGluZyBsaXN0IGVuZDogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCX0KKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciByZWFkaW5nIGxpc3Q6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkQm9vbCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciByZWFkaW5nIGJvb2wgYXQgaW5kZXggJXY6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiBpbmRleCAldiAldiAldiAldiAhPSAldiIsICJSZWFkV3JpdGVCb29sIiwgaywgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlQnl0ZSh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShCWVRFKQorCXRoZWxlbiA6PSBsZW4oQllURV9WQUxVRVMpCisJZXJyIDo9IHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIHRoZXR5cGUpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJZXJyID0gcC5Xcml0ZUJ5dGUodikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgYnl0ZSBpbiBsaXN0IGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCX0KKwllcnIgPSBwLldyaXRlTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQorCX0KKwllcnIgPSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIGZsdXNoaW5nIGxpc3Qgb2YgYnl0ZXM6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgYnl0ZSBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVJMTYodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoSTE2KQorCXRoZWxlbiA6PSBsZW4oSU5UMTZfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCXAuV3JpdGVJMTYodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgSU5UMTZfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEkxNigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDE2IGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUkzMih0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShJMzIpCisJdGhlbGVuIDo9IGxlbihJTlQzMl9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJcC5Xcml0ZUkzMih2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBJTlQzMl9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50MzIgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlSTY0KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEk2NCkKKwl0aGVsZW4gOj0gbGVuKElOVDY0X1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQlwLldyaXRlSTY0KHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIsIElOVDY0X1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRJNjQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQ2NCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgIT0gJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVEb3VibGUodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoRE9VQkxFKQorCXRoZWxlbiA6PSBsZW4oRE9VQkxFX1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJcC5Xcml0ZURvdWJsZSh2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTKQorCX0KKwlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCX0KKwlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBkb3VibGUgYXQgaW5kZXggJWQ6ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgbWF0aC5Jc05hTih2KSB7CisJCQlpZiAhbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbWF0aC5Jc05hTigldikgIT0gbWF0aC5Jc05hTigldikiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJfQorCQl9IGVsc2UgaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2ICE9ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlU3RyaW5nKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKFNUUklORykKKwl0aGVsZW4gOj0gbGVuKFNUUklOR19WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCXAuV3JpdGVTdHJpbmcodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgU1RSSU5HX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkU3RyaW5nKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgc3RyaW5nIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJpbmFyeSh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdiA6PSBwcm90b2NvbF9iZGF0YQorCXAuV3JpdGVCaW5hcnkodikKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXZhbHVlLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBlcnIuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgeworCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbih2KSAhPSBsZW4odmFsdWUpLi4uICVkICE9ICVkIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBsZW4odiksIGxlbih2YWx1ZSkpCisJfSBlbHNlIHsKKwkJZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKKwkJCWlmIHZbaV0gIT0gdmFsdWVbaV0geworCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXMgIT0gJXMiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyNWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImlvIgorCit0eXBlIFJpY2hUcmFuc3BvcnQgc3RydWN0IHsKKwlUVHJhbnNwb3J0Cit9CisKKy8vIFdyYXBzIFRyYW5zcG9ydCB0byBwcm92aWRlIFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZQorZnVuYyBOZXdUUmljaFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAqUmljaFRyYW5zcG9ydCB7CisJcmV0dXJuICZSaWNoVHJhbnNwb3J0e3RyYW5zfQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiByZWFkQnl0ZShyLlRUcmFuc3BvcnQpCit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gd3JpdGVCeXRlKHIuVFRyYW5zcG9ydCwgYykKK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHIuV3JpdGUoW11ieXRlKHMpKQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHIuVFRyYW5zcG9ydC5SZW1haW5pbmdCeXRlcygpCit9CisKK2Z1bmMgcmVhZEJ5dGUociBpby5SZWFkZXIpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCXYgOj0gWzFdYnl0ZXswfQorCW4sIGVyciA6PSByLlJlYWQodlswOjFdKQorCWlmIG4gPiAwICYmIChlcnIgPT0gbmlsIHx8IGVyciA9PSBpby5FT0YpIHsKKwkJcmV0dXJuIHZbMF0sIG5pbAorCX0KKwlpZiBuID4gMCAmJiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHZbMF0sIGVycgorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlyZXR1cm4gdlswXSwgbmlsCit9CisKK2Z1bmMgd3JpdGVCeXRlKHcgaW8uV3JpdGVyLCBjIGJ5dGUpIGVycm9yIHsKKwl2IDo9IFsxXWJ5dGV7Y30KKwlfLCBlcnIgOj0gdy5Xcml0ZSh2WzA6MV0pCisJcmV0dXJuIGVycgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzNmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiZXJyb3JzIgorCSJpbyIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0RW5zdXJlVHJhbnNwb3J0c0FyZVJpY2godCAqdGVzdGluZy5UKSB7CisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCisKKwl0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7CisJCU5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAorCQlOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KGJ1ZiwgYnVmLCB0cnVlKSwKKwkJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vMTI3LjAuMC4xIiksCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlfLCBvayA6PSB0cmFucy4oVFJpY2hUcmFuc3BvcnQpCisJCWlmICFvayB7CisJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVzIGRvZXMgbm90IGltcGxlbWVudCBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UiLCByZWZsZWN0LlZhbHVlT2YodHJhbnMpKQorCQl9CisJfQorfQorCisvLyBUZXN0UmVhZEJ5dGUgdGVzdHMgd2hldGhlciByZWFkQnl0ZSBoYW5kbGVzIGVycm9yIGNhc2VzIGNvcnJlY3RseS4KK2Z1bmMgVGVzdFJlYWRCeXRlKHQgKnRlc3RpbmcuVCkgeworCWZvciBpLCB0ZXN0IDo9IHJhbmdlIHJlYWRCeXRlVGVzdHMgeworCQl2LCBlcnIgOj0gcmVhZEJ5dGUodGVzdC5yKQorCQlpZiB2ICE9IHRlc3QudiB7CisJCQl0LkZhdGFsZigiVGVzdFJlYWRCeXRlICVkOiB2YWx1ZSBkaWZmZXJzLiBFeHBlY3RlZCAlZCwgZ290ICVkIiwgaSwgdGVzdC52LCB0ZXN0LnIudikKKwkJfQorCQlpZiBlcnIgIT0gdGVzdC5lcnIgeworCQkJdC5GYXRhbGYoIlRlc3RSZWFkQnl0ZSAlZDogZXJyb3IgZGlmZmVycy4gRXhwZWN0ZWQgJXMsIGdvdCAlcyIsIGksIHRlc3QuZXJyLCB0ZXN0LnIuZXJyKQorCQl9CisJfQorfQorCit2YXIgc29tZUVycm9yID0gZXJyb3JzLk5ldygiU29tZSBlcnJvciIpCit2YXIgcmVhZEJ5dGVUZXN0cyA9IFtdc3RydWN0IHsKKwlyICAgKm1vY2tSZWFkZXIKKwl2ICAgYnl0ZQorCWVyciBlcnJvcgorfXsKKwl7Jm1vY2tSZWFkZXJ7MCwgNTUsIGlvLkVPRn0sIDAsIGlvLkVPRn0sICAgICAgICAvLyByZWFkZXIgc2VuZHMgRU9GIHcvbyBkYXRhCisJeyZtb2NrUmVhZGVyezAsIDU1LCBzb21lRXJyb3J9LCAwLCBzb21lRXJyb3J9LCAgLy8gcmVhZGVyIHNlbmRzIHNvbWUgb3RoZXIgZXJyb3IKKwl7Jm1vY2tSZWFkZXJ7MSwgNTUsIG5pbH0sIDU1LCBuaWx9LCAgICAgICAgICAgICAvLyByZWFkZXIgc2VuZHMgZGF0YSB3L28gZXJyb3IKKwl7Jm1vY2tSZWFkZXJ7MSwgNTUsIGlvLkVPRn0sIDU1LCBuaWx9LCAgICAgICAgICAvLyByZWFkZXIgc2VuZHMgZGF0YSB3aXRoIEVPRgorCXsmbW9ja1JlYWRlcnsxLCA1NSwgc29tZUVycm9yfSwgNTUsIHNvbWVFcnJvcn0sIC8vIHJlYWRlciBzZW5kcyBkYXRhIHdpdGhzb21lIGVycm9yCit9CisKK3R5cGUgbW9ja1JlYWRlciBzdHJ1Y3QgeworCW4gICBpbnQKKwl2ICAgYnl0ZQorCWVyciBlcnJvcgorfQorCitmdW5jIChyICptb2NrUmVhZGVyKSBSZWFkKHAgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCWlmIHIubiA+IDAgeworCQlwWzBdID0gci52CisJfQorCXJldHVybiByLm4sIHIuZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmNGQzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKK3R5cGUgVFNlcmlhbGl6ZXIgc3RydWN0IHsKKwlUcmFuc3BvcnQgKlRNZW1vcnlCdWZmZXIKKwlQcm90b2NvbCAgVFByb3RvY29sCit9CisKK3R5cGUgVFN0cnVjdCBpbnRlcmZhY2UgeworCVdyaXRlKHAgVFByb3RvY29sKSBlcnJvcgorCVJlYWQocCBUUHJvdG9jb2wpIGVycm9yCit9CisKK2Z1bmMgTmV3VFNlcmlhbGl6ZXIoKSAqVFNlcmlhbGl6ZXIgeworCXRyYW5zcG9ydCA6PSBOZXdUTWVtb3J5QnVmZmVyTGVuKDEwMjQpCisJcHJvdG9jb2wgOj0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKwlyZXR1cm4gJlRTZXJpYWxpemVyeworCQl0cmFuc3BvcnQsCisJCXByb3RvY29sfQorfQorCitmdW5jICh0ICpUU2VyaWFsaXplcikgV3JpdGVTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgbXNnIFRTdHJ1Y3QpIChzIHN0cmluZywgZXJyIGVycm9yKSB7CisJdC5UcmFuc3BvcnQuUmVzZXQoKQorCisJaWYgZXJyID0gbXNnLldyaXRlKHQuUHJvdG9jb2wpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4gdC5UcmFuc3BvcnQuU3RyaW5nKCksIG5pbAorfQorCitmdW5jICh0ICpUU2VyaWFsaXplcikgV3JpdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbXNnIFRTdHJ1Y3QpIChiIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJdC5UcmFuc3BvcnQuUmVzZXQoKQorCisJaWYgZXJyID0gbXNnLldyaXRlKHQuUHJvdG9jb2wpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWIgPSBhcHBlbmQoYiwgdC5UcmFuc3BvcnQuQnl0ZXMoKS4uLikKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMjdlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZm10IgorCSJ0ZXN0aW5nIgorKQorCit0eXBlIFByb3RvY29sRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb3RvY29sKHQgVFRyYW5zcG9ydCkgVFByb3RvY29sCit9CisKK2Z1bmMgY29tcGFyZVN0cnVjdHMobSwgbTEgTXlUZXN0U3RydWN0KSAoYm9vbCwgZXJyb3IpIHsKKwlzd2l0Y2ggeworCWNhc2UgbS5PbiAhPSBtMS5PbjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJCb29sZWFuIG5vdCBlcXVhbCIpCisJY2FzZSBtLkIgIT0gbTEuQjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJCeXRlIG5vdCBlcXVhbCIpCisJY2FzZSBtLkludDE2ICE9IG0xLkludDE2OgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkludDE2IG5vdCBlcXVhbCIpCisJY2FzZSBtLkludDMyICE9IG0xLkludDMyOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkludDMyIG5vdCBlcXVhbCIpCisJY2FzZSBtLkludDY0ICE9IG0xLkludDY0OgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkludDY0IG5vdCBlcXVhbCIpCisJY2FzZSBtLkQgIT0gbTEuRDoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJEb3VibGUgbm90IGVxdWFsIikKKwljYXNlIG0uU3QgIT0gbTEuU3Q6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nIG5vdCBlcXVhbCIpCisKKwljYXNlIGxlbihtLkJpbikgIT0gbGVuKG0xLkJpbik6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQmluYXJ5IHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLkJpbikgPT0gbGVuKG0xLkJpbik6CisJCWZvciBpIDo9IHJhbmdlIG0uQmluIHsKKwkJCWlmIG0uQmluW2ldICE9IG0xLkJpbltpXSB7CisJCQkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJCaW5hcnkgbm90IGVxdWFsIikKKwkJCX0KKwkJfQorCWNhc2UgbGVuKG0uU3RyaW5nTWFwKSAhPSBsZW4obTEuU3RyaW5nTWFwKToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmdNYXAgc2l6ZSBub3QgZXF1YWwiKQorCWNhc2UgbGVuKG0uU3RyaW5nTGlzdCkgIT0gbGVuKG0xLlN0cmluZ0xpc3QpOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZ0xpc3Qgc2l6ZSBub3QgZXF1YWwiKQorCWNhc2UgbGVuKG0uU3RyaW5nU2V0KSAhPSBsZW4obTEuU3RyaW5nU2V0KToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmdTZXQgc2l6ZSBub3QgZXF1YWwiKQorCisJY2FzZSBtLkUgIT0gbTEuRToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJNeVRlc3RFbnVtIG5vdCBlcXVhbCIpCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gdHJ1ZSwgbmlsCisKKwl9CisJcmV0dXJuIHRydWUsIG5pbAorfQorCitmdW5jIFByb3RvY29sVGVzdDEodGVzdCAqdGVzdGluZy5ULCBwZiBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikgeworCXQgOj0gTmV3VFNlcmlhbGl6ZXIoKQorCXQuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0LlRyYW5zcG9ydCkKKwl2YXIgbSA9IE15VGVzdFN0cnVjdHt9CisJbS5PbiA9IHRydWUKKwltLkIgPSBpbnQ4KDApCisJbS5JbnQxNiA9IDEKKwltLkludDMyID0gMgorCW0uSW50NjQgPSAzCisJbS5EID0gNC4xCisJbS5TdCA9ICJUZXN0IgorCW0uQmluID0gbWFrZShbXWJ5dGUsIDEwKQorCW0uU3RyaW5nTWFwID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgNSkKKwltLlN0cmluZ0xpc3QgPSBtYWtlKFtdc3RyaW5nLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQorCW0uRSA9IDIKKworCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCX0KKworCXQxIDo9IE5ld1REZXNlcmlhbGl6ZXIoKQorCXQxLlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodDEuVHJhbnNwb3J0KQorCXZhciBtMSA9IE15VGVzdFN0cnVjdHt9CisJaWYgZXJyID0gdDEuUmVhZFN0cmluZygmbTEsIHMpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gRGVzZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCisKKwl9CisKKwlyZXR1cm4gY29tcGFyZVN0cnVjdHMobSwgbTEpCisKK30KKworZnVuYyBQcm90b2NvbFRlc3QyKHRlc3QgKnRlc3RpbmcuVCwgcGYgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpIHsKKwl0IDo9IE5ld1RTZXJpYWxpemVyKCkKKwl0LlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodC5UcmFuc3BvcnQpCisJdmFyIG0gPSBNeVRlc3RTdHJ1Y3R7fQorCW0uT24gPSBmYWxzZQorCW0uQiA9IGludDgoMCkKKwltLkludDE2ID0gMQorCW0uSW50MzIgPSAyCisJbS5JbnQ2NCA9IDMKKwltLkQgPSA0LjEKKwltLlN0ID0gIlRlc3QiCisJbS5CaW4gPSBtYWtlKFtdYnl0ZSwgMTApCisJbS5TdHJpbmdNYXAgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCA1KQorCW0uU3RyaW5nTGlzdCA9IG1ha2UoW11zdHJpbmcsIDUpCisJbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIDUpCisJbS5FID0gMgorCisJcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoY29udGV4dC5CYWNrZ3JvdW5kKCksICZtKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBTZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCisKKwl9CisKKwl0MSA6PSBOZXdURGVzZXJpYWxpemVyKCkKKwl0MS5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQxLlRyYW5zcG9ydCkKKwl2YXIgbTEgPSBNeVRlc3RTdHJ1Y3R7fQorCWlmIGVyciA9IHQxLlJlYWRTdHJpbmcoJm0xLCBzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIERlc2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJcmV0dXJuIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xKQorCit9CisKK2Z1bmMgVGVzdFNlcmlhbGl6ZXIodCAqdGVzdGluZy5UKSB7CisKKwl2YXIgcHJvdG9jb2xfZmFjdG9yaWVzIG1hcFtzdHJpbmddUHJvdG9jb2xGYWN0b3J5CisJcHJvdG9jb2xfZmFjdG9yaWVzID0gbWFrZShtYXBbc3RyaW5nXVByb3RvY29sRmFjdG9yeSkKKwlwcm90b2NvbF9mYWN0b3JpZXNbIkJpbmFyeSJdID0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXByb3RvY29sX2ZhY3Rvcmllc1siQ29tcGFjdCJdID0gTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCS8vcHJvdG9jb2xfZmFjdG9yaWVzWyJTaW1wbGVKU09OIl0gPSBOZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIC0gd3JpdGUgb25seSwgY2FuJ3QgYmUgcmVhZCBiYWNrIGJ5IGRlc2lnbgorCXByb3RvY29sX2ZhY3Rvcmllc1siSlNPTiJdID0gTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCisJdmFyIHRlc3RzIG1hcFtzdHJpbmddZnVuYygqdGVzdGluZy5ULCBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikKKwl0ZXN0cyA9IG1ha2UobWFwW3N0cmluZ11mdW5jKCp0ZXN0aW5nLlQsIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSkKKwl0ZXN0c1siVGVzdCAxIl0gPSBQcm90b2NvbFRlc3QxCisJdGVzdHNbIlRlc3QgMiJdID0gUHJvdG9jb2xUZXN0MgorCS8vdGVzdHNbIlRlc3QgMyJdID0gUHJvdG9jb2xUZXN0MyAvLyBFeGFtcGxlIG9mIGhvdyB0byBhZGQgYWRkaXRpb25hbCB0ZXN0cworCisJZm9yIG5hbWUsIHBmIDo9IHJhbmdlIHByb3RvY29sX2ZhY3RvcmllcyB7CisKKwkJZm9yIHRlc3QsIGYgOj0gcmFuZ2UgdGVzdHMgeworCisJCQlpZiBzLCBlcnIgOj0gZih0LCBwZik7ICFzIHx8IGVyciAhPSBuaWwgeworCQkJCXQuRXJyb3JmKCIlcyBGYWlsZWQgZm9yICVzIHByb3RvY29sXG5cdCAlcyIsIHRlc3QsIG5hbWUsIGVycikKKwkJCX0KKworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDcyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoRklYTUUpCisvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisKKy8qIFRIRSBGT0xMT1dJTkcgVEhSSUZUIEZJTEUgV0FTIFVTRUQgVE8gQ1JFQVRFIFRISVMKKworZW51bSBNeVRlc3RFbnVtIHsKKwlGSVJTVCA9IDEsCisJU0VDT05EID0gMiwKKwlUSElSRCA9IDMsCisJRk9VUlRIID0gNCwKK30KKworc3RydWN0IE15VGVzdFN0cnVjdCB7CisJMTogYm9vbCBvbiwKKwkyOiBieXRlIGIsCisJMzogaTE2IGludDE2LAorCTQ6IGkzMiBpbnQzMiwKKwk1OiBpNjQgaW50NjQsCisJNjogZG91YmxlIGQsCisJNzogc3RyaW5nIHN0LAorCTg6IGJpbmFyeSBiaW4sCisJOTogbWFwPHN0cmluZywgc3RyaW5nPiBzdHJpbmdNYXAsCisJMTA6IGxpc3Q8c3RyaW5nPiBzdHJpbmdMaXN0LAorCTExOiBzZXQ8c3RyaW5nPiBzdHJpbmdTZXQsCisJMTI6IE15VGVzdEVudW0gZSwKK30KKyovCisKK2ltcG9ydCAoCisJImZtdCIKKykKKworLy8gKG5lZWRlZCB0byBlbnN1cmUgc2FmZXR5IGJlY2F1c2Ugb2YgbmFpdmUgaW1wb3J0IGxpc3QgY29uc3RydWN0aW9uLikKK3ZhciBfID0gWkVSTwordmFyIF8gPSBmbXQuUHJpbnRmCisKK3ZhciBHb1VudXNlZFByb3RlY3Rpb25fXyBpbnQKKwordHlwZSBNeVRlc3RFbnVtIGludDY0CisKK2NvbnN0ICgKKwlNeVRlc3RFbnVtX0ZJUlNUICBNeVRlc3RFbnVtID0gMQorCU15VGVzdEVudW1fU0VDT05EIE15VGVzdEVudW0gPSAyCisJTXlUZXN0RW51bV9USElSRCAgTXlUZXN0RW51bSA9IDMKKwlNeVRlc3RFbnVtX0ZPVVJUSCBNeVRlc3RFbnVtID0gNAorKQorCitmdW5jIChwIE15VGVzdEVudW0pIFN0cmluZygpIHN0cmluZyB7CisJc3dpdGNoIHAgeworCWNhc2UgTXlUZXN0RW51bV9GSVJTVDoKKwkJcmV0dXJuICJGSVJTVCIKKwljYXNlIE15VGVzdEVudW1fU0VDT05EOgorCQlyZXR1cm4gIlNFQ09ORCIKKwljYXNlIE15VGVzdEVudW1fVEhJUkQ6CisJCXJldHVybiAiVEhJUkQiCisJY2FzZSBNeVRlc3RFbnVtX0ZPVVJUSDoKKwkJcmV0dXJuICJGT1VSVEgiCisJfQorCXJldHVybiAiPFVOU0VUPiIKK30KKworZnVuYyBNeVRlc3RFbnVtRnJvbVN0cmluZyhzIHN0cmluZykgKE15VGVzdEVudW0sIGVycm9yKSB7CisJc3dpdGNoIHMgeworCWNhc2UgIkZJUlNUIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fRklSU1QsIG5pbAorCWNhc2UgIlNFQ09ORCI6CisJCXJldHVybiBNeVRlc3RFbnVtX1NFQ09ORCwgbmlsCisJY2FzZSAiVEhJUkQiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9USElSRCwgbmlsCisJY2FzZSAiRk9VUlRIIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fRk9VUlRILCBuaWwKKwl9CisJcmV0dXJuIE15VGVzdEVudW0oMCksIGZtdC5FcnJvcmYoIm5vdCBhIHZhbGlkIE15VGVzdEVudW0gc3RyaW5nIikKK30KKworZnVuYyBNeVRlc3RFbnVtUHRyKHYgTXlUZXN0RW51bSkgKk15VGVzdEVudW0geyByZXR1cm4gJnYgfQorCit0eXBlIE15VGVzdFN0cnVjdCBzdHJ1Y3QgeworCU9uICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBgdGhyaWZ0OiJvbiwxIiBqc29uOiJvbiJgCisJQiAgICAgICAgICBpbnQ4ICAgICAgICAgICAgICAgIGB0aHJpZnQ6ImIsMiIganNvbjoiYiJgCisJSW50MTYgICAgICBpbnQxNiAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDE2LDMiIGpzb246ImludDE2ImAKKwlJbnQzMiAgICAgIGludDMyICAgICAgICAgICAgICAgYHRocmlmdDoiaW50MzIsNCIganNvbjoiaW50MzIiYAorCUludDY0ICAgICAgaW50NjQgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQ2NCw1IiBqc29uOiJpbnQ2NCJgCisJRCAgICAgICAgICBmbG9hdDY0ICAgICAgICAgICAgIGB0aHJpZnQ6ImQsNiIganNvbjoiZCJgCisJU3QgICAgICAgICBzdHJpbmcgICAgICAgICAgICAgIGB0aHJpZnQ6InN0LDciIGpzb246InN0ImAKKwlCaW4gICAgICAgIFtdYnl0ZSAgICAgICAgICAgICAgYHRocmlmdDoiYmluLDgiIGpzb246ImJpbiJgCisJU3RyaW5nTWFwICBtYXBbc3RyaW5nXXN0cmluZyAgIGB0aHJpZnQ6InN0cmluZ01hcCw5IiBqc29uOiJzdHJpbmdNYXAiYAorCVN0cmluZ0xpc3QgW11zdHJpbmcgICAgICAgICAgICBgdGhyaWZ0OiJzdHJpbmdMaXN0LDEwIiBqc29uOiJzdHJpbmdMaXN0ImAKKwlTdHJpbmdTZXQgIG1hcFtzdHJpbmddc3RydWN0e30gYHRocmlmdDoic3RyaW5nU2V0LDExIiBqc29uOiJzdHJpbmdTZXQiYAorCUUgICAgICAgICAgTXlUZXN0RW51bSAgICAgICAgICBgdGhyaWZ0OiJlLDEyIiBqc29uOiJlImAKK30KKworZnVuYyBOZXdNeVRlc3RTdHJ1Y3QoKSAqTXlUZXN0U3RydWN0IHsKKwlyZXR1cm4gJk15VGVzdFN0cnVjdHt9Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0T24oKSBib29sIHsKKwlyZXR1cm4gcC5PbgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEIoKSBpbnQ4IHsKKwlyZXR1cm4gcC5CCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50MTYoKSBpbnQxNiB7CisJcmV0dXJuIHAuSW50MTYKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQzMigpIGludDMyIHsKKwlyZXR1cm4gcC5JbnQzMgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDY0KCkgaW50NjQgeworCXJldHVybiBwLkludDY0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0RCgpIGZsb2F0NjQgeworCXJldHVybiBwLkQKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdCgpIHN0cmluZyB7CisJcmV0dXJuIHAuU3QKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRCaW4oKSBbXWJ5dGUgeworCXJldHVybiBwLkJpbgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ01hcCgpIG1hcFtzdHJpbmddc3RyaW5nIHsKKwlyZXR1cm4gcC5TdHJpbmdNYXAKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdHJpbmdMaXN0KCkgW11zdHJpbmcgeworCXJldHVybiBwLlN0cmluZ0xpc3QKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdHJpbmdTZXQoKSBtYXBbc3RyaW5nXXN0cnVjdHt9IHsKKwlyZXR1cm4gcC5TdHJpbmdTZXQKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRFKCkgTXlUZXN0RW51bSB7CisJcmV0dXJuIHAuRQorfQorZnVuYyAocCAqTXlUZXN0U3RydWN0KSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHJlYWQgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWZvciB7CisJCV8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIGZpZWxkICVkIHJlYWQgZXJyb3I6ICIsIHAsIGZpZWxkSWQpLCBlcnIpCisJCX0KKwkJaWYgZmllbGRUeXBlSWQgPT0gU1RPUCB7CisJCQlicmVhaworCQl9CisJCXN3aXRjaCBmaWVsZElkIHsKKwkJY2FzZSAxOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMShpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAyOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMihpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAzOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMyhpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA0OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkNChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA1OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkNShpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA2OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkNihpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA3OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkNyhpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA4OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkOChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSA5OgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkOShpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMDoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEwKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDExOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTEoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTI6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMihpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJCWlmIGVyciA6PSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHJlYWQgc3RydWN0IGVuZCBlcnJvcjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCb29sKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDE6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLk9uID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEJ5dGUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMjogIiwgZXJyKQorCX0gZWxzZSB7CisJCXRlbXAgOj0gaW50OCh2KQorCQlwLkIgPSB0ZW1wCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQzKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTE2KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDM6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDE2ID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA0OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQzMiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDUoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJNjQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNTogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50NjQgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ2KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkRG91YmxlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDY6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkQgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ3KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDc6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLlN0ID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkOChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEJpbmFyeSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA4OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5CaW4gPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ5KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCV8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIG1hcCBiZWdpbjogIiwgZXJyKQorCX0KKwl0TWFwIDo9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIHNpemUpCisJcC5TdHJpbmdNYXAgPSB0TWFwCisJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCXZhciBfa2V5MCBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9rZXkwID0gdgorCQl9CisJCXZhciBfdmFsMSBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV92YWwxID0gdgorCQl9CisJCXAuU3RyaW5nTWFwW19rZXkwXSA9IF92YWwxCisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkTWFwRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIG1hcCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEwKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCV8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiAiLCBlcnIpCisJfQorCXRTbGljZSA6PSBtYWtlKFtdc3RyaW5nLCAwLCBzaXplKQorCXAuU3RyaW5nTGlzdCA9IHRTbGljZQorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2VsZW0yIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2VsZW0yID0gdgorCQl9CisJCXAuU3RyaW5nTGlzdCA9IGFwcGVuZChwLlN0cmluZ0xpc3QsIF9lbGVtMikKKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRMaXN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGxpc3QgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46ICIsIGVycikKKwl9CisJdFNldCA6PSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIHNpemUpCisJcC5TdHJpbmdTZXQgPSB0U2V0CisJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCXZhciBfZWxlbTMgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfZWxlbTMgPSB2CisJCX0KKwkJcC5TdHJpbmdTZXRbX2VsZW0zXSA9IHN0cnVjdHt9e30KKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgc2V0IGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTIoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMTI6ICIsIGVycikKKwl9IGVsc2UgeworCQl0ZW1wIDo9IE15VGVzdEVudW0odikKKwkJcC5FID0gdGVtcAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgV3JpdGUob3Byb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oIk15VGVzdFN0cnVjdCIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQyKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDMob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ1KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDYob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNyhvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ4KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDkob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMTAob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMTEob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMTIob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoIndyaXRlIGZpZWxkIHN0b3AgZXJyb3I6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJ3cml0ZSBzdHJ1Y3Qgc3RvcCBlcnJvcjogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDEob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigib24iLCBCT09MLCAxKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDE6b246ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJvb2woYm9vbChwLk9uKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5vbiAoMSkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTpvbjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQyKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImIiLCBCWVRFLCAyKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDI6YjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlQnl0ZShpbnQ4KHAuQikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuYiAoMikgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMjpiOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDMob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiaW50MTYiLCBJMTYsIDMpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMzppbnQxNjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlSTE2KGludDE2KHAuSW50MTYpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmludDE2ICgzKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAzOmludDE2OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDQob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiaW50MzIiLCBJMzIsIDQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNDppbnQzMjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlSTMyKGludDMyKHAuSW50MzIpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmludDMyICg0KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA0OmludDMyOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiaW50NjQiLCBJNjQsIDUpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNTppbnQ2NDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlSTY0KGludDY0KHAuSW50NjQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmludDY0ICg1KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA1OmludDY0OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDYob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiZCIsIERPVUJMRSwgNik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA2OmQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZURvdWJsZShmbG9hdDY0KHAuRCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuZCAoNikgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNjpkOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDcob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3QiLCBTVFJJTkcsIDcpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNzpzdDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyhwLlN0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5zdCAoNykgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNzpzdDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ4KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImJpbiIsIFNUUklORywgOCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA4OmJpbjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlQmluYXJ5KHAuQmluKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmJpbiAoOCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgODpiaW46ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkOShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdNYXAiLCBNQVAsIDkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgOTpzdHJpbmdNYXA6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEJlZ2luKFNUUklORywgU1RSSU5HLCBsZW4ocC5TdHJpbmdNYXApKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbWFwIGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIHAuU3RyaW5nTWFwIHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyhrKSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHYpKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCQl9CisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgOTpzdHJpbmdNYXA6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTAob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTGlzdCIsIExJU1QsIDEwKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDEwOnN0cmluZ0xpc3Q6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RCZWdpbihTVFJJTkcsIGxlbihwLlN0cmluZ0xpc3QpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgXywgdiA6PSByYW5nZSBwLlN0cmluZ0xpc3QgeworCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHYpKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCQl9CisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxMDpzdHJpbmdMaXN0OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDExKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ1NldCIsIFNFVCwgMTEpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTE6c3RyaW5nU2V0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRCZWdpbihTVFJJTkcsIGxlbihwLlN0cmluZ1NldCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIHYgOj0gcmFuZ2UgcC5TdHJpbmdTZXQgeworCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHYpKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCQl9CisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBzZXQgZW5kOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTE6c3RyaW5nU2V0OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDEyKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImUiLCBJMzIsIDEyKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDEyOmU6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkUpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmUgKDEyKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxMjplOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAiPG5pbD4iCisJfQorCXJldHVybiBmbXQuU3ByaW50ZigiTXlUZXN0U3RydWN0KCUrdikiLCAqcCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxM2ZhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyLmdvCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKwordHlwZSBUU2VydmVyIGludGVyZmFjZSB7CisJUHJvY2Vzc29yRmFjdG9yeSgpIFRQcm9jZXNzb3JGYWN0b3J5CisJU2VydmVyVHJhbnNwb3J0KCkgVFNlcnZlclRyYW5zcG9ydAorCUlucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5CisJT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5CisJSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5CisJT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeQorCisJLy8gU3RhcnRzIHRoZSBzZXJ2ZXIKKwlTZXJ2ZSgpIGVycm9yCisJLy8gU3RvcHMgdGhlIHNlcnZlci4gVGhpcyBpcyBvcHRpb25hbCBvbiBhIHBlci1pbXBsZW1lbnRhdGlvbiBiYXNpcy4gTm90CisJLy8gYWxsIHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIGJlIGNsZWFubHkgc3RvcHBhYmxlLgorCVN0b3AoKSBlcnJvcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibmV0IgorCSJzeW5jIgorCSJ0aW1lIgorKQorCit0eXBlIFRTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKKwlsaXN0ZW5lciAgICAgIG5ldC5MaXN0ZW5lcgorCWFkZHIgICAgICAgICAgbmV0LkFkZHIKKwljbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24KKworCS8vIFByb3RlY3RzIHRoZSBpbnRlcnJ1cHRlZCB2YWx1ZSB0byBtYWtlIGl0IHRocmVhZCBzYWZlLgorCW11ICAgICAgICAgIHN5bmMuUldNdXRleAorCWludGVycnVwdGVkIGJvb2wKK30KKworZnVuYyBOZXdUU2VydmVyU29ja2V0KGxpc3RlbkFkZHIgc3RyaW5nKSAoKlRTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIsIDApCit9CisKK2Z1bmMgTmV3VFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciBzdHJpbmcsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU2VydmVyU29ja2V0LCBlcnJvcikgeworCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGxpc3RlbkFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gJlRTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dH0sIG5pbAorfQorCisvLyBDcmVhdGVzIGEgVFNlcnZlclNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNlcnZlclNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU2VydmVyU29ja2V0IHsKKwlyZXR1cm4gJlRTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dH0KK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgTGlzdGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBuaWwKKwl9CisJbCwgZXJyIDo9IG5ldC5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXAubGlzdGVuZXIgPSBsCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlwLm11LlJMb2NrKCkKKwlpbnRlcnJ1cHRlZCA6PSBwLmludGVycnVwdGVkCisJcC5tdS5SVW5sb2NrKCkKKworCWlmIGludGVycnVwdGVkIHsKKwkJcmV0dXJuIG5pbCwgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQKKwl9CisKKwlwLm11LkxvY2soKQorCWxpc3RlbmVyIDo9IHAubGlzdGVuZXIKKwlwLm11LlVubG9jaygpCisJaWYgbGlzdGVuZXIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCisJfQorCisJY29ubiwgZXJyIDo9IGxpc3RlbmVyLkFjY2VwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4gTmV3VFNvY2tldEZyb21Db25uVGltZW91dChjb25uLCBwLmNsaWVudFRpbWVvdXQpLCBuaWwKK30KKworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcuCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBJc0xpc3RlbmluZygpIGJvb2wgeworCXJldHVybiBwLmxpc3RlbmVyICE9IG5pbAorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU2VydmVyIHNvY2tldCBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiBsLCBlcnIgOj0gbmV0Lkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCXAubGlzdGVuZXIgPSBsCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKKwlpZiBwLmxpc3RlbmVyICE9IG5pbCB7CisJCXJldHVybiBwLmxpc3RlbmVyLkFkZHIoKQorCX0KKwlyZXR1cm4gcC5hZGRyCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIENsb3NlKCkgZXJyb3IgeworCXZhciBlcnIgZXJyb3IKKwlwLm11LkxvY2soKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCWVyciA9IHAubGlzdGVuZXIuQ2xvc2UoKQorCQlwLmxpc3RlbmVyID0gbmlsCisJfQorCXAubXUuVW5sb2NrKCkKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEludGVycnVwdCgpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCXAuaW50ZXJydXB0ZWQgPSB0cnVlCisJcC5tdS5VbmxvY2soKQorCXAuQ2xvc2UoKQorCisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28KQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJmbXQiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFNvY2tldElzbnRMaXN0ZW5pbmdBZnRlckludGVycnVwdCh0ICp0ZXN0aW5nLlQpIHsKKwlob3N0IDo9ICIxMjcuMC4wLjEiCisJcG9ydCA6PSA5MDkwCisJYWRkciA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJc29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCXNvY2tldC5MaXN0ZW4oKQorCXNvY2tldC5JbnRlcnJ1cHQoKQorCisJbmV3U29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCWVyciA6PSBuZXdTb2NrZXQuTGlzdGVuKCkKKwlkZWZlciBuZXdTb2NrZXQuSW50ZXJydXB0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byByZWJpbmRzOiAlcyIsIGVycikKKwl9Cit9CisKK2Z1bmMgVGVzdFNvY2tldENvbmN1cnJlbmN5KHQgKnRlc3RpbmcuVCkgeworCWhvc3QgOj0gIjEyNy4wLjAuMSIKKwlwb3J0IDo9IDkwOTAKKwlhZGRyIDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwlzb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJZ28gZnVuYygpIHsgc29ja2V0Lkxpc3RlbigpIH0oKQorCWdvIGZ1bmMoKSB7IHNvY2tldC5JbnRlcnJ1cHQoKSB9KCkKK30KKworZnVuYyBDcmVhdGVTZXJ2ZXJTb2NrZXQodCAqdGVzdGluZy5ULCBhZGRyIHN0cmluZykgKlRTZXJ2ZXJTb2NrZXQgeworCXNvY2tldCwgZXJyIDo9IE5ld1RTZXJ2ZXJTb2NrZXQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byBjcmVhdGUgc2VydmVyIHNvY2tldDogJXMiLCBlcnIpCisJfQorCXJldHVybiBzb2NrZXQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYWY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0Tm90aGluZyh0ICp0ZXN0aW5nLlQpIHsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzQwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBTZXJ2ZXIgdHJhbnNwb3J0LiBPYmplY3Qgd2hpY2ggcHJvdmlkZXMgY2xpZW50IHRyYW5zcG9ydHMuCit0eXBlIFRTZXJ2ZXJUcmFuc3BvcnQgaW50ZXJmYWNlIHsKKwlMaXN0ZW4oKSBlcnJvcgorCUFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikKKwlDbG9zZSgpIGVycm9yCisKKwkvLyBPcHRpb25hbCBtZXRob2QgaW1wbGVtZW50YXRpb24uIFRoaXMgc2lnbmFscyB0byB0aGUgc2VydmVyIHRyYW5zcG9ydAorCS8vIHRoYXQgaXQgc2hvdWxkIGJyZWFrIG91dCBvZiBhbnkgYWNjZXB0KCkgb3IgbGlzdGVuKCkgdGhhdCBpdCBpcyBjdXJyZW50bHkKKwkvLyBibG9ja2VkIG9uLiBUaGlzIG1ldGhvZCwgaWYgaW1wbGVtZW50ZWQsIE1VU1QgYmUgdGhyZWFkIHNhZmUsIGFzIGl0IG1heQorCS8vIGJlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCBjb250ZXh0IHRoYW4gdGhlIG90aGVyIFRTZXJ2ZXJUcmFuc3BvcnQKKwkvLyBtZXRob2RzLgorCUludGVycnVwdCgpIGVycm9yCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThhNzExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDEzMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImVuY29kaW5nL2pzb24iCisJImZtdCIKKwkiaW8iCisJIm1hdGgiCisJInN0cmNvbnYiCispCisKK3R5cGUgX1BhcnNlQ29udGV4dCBpbnQKKworY29uc3QgKAorCV9DT05URVhUX0lOX1RPUExFVkVMICAgICAgICAgIF9QYXJzZUNvbnRleHQgPSAxCisJX0NPTlRFWFRfSU5fTElTVF9GSVJTVCAgICAgICAgX1BhcnNlQ29udGV4dCA9IDIKKwlfQ09OVEVYVF9JTl9MSVNUICAgICAgICAgICAgICBfUGFyc2VDb250ZXh0ID0gMworCV9DT05URVhUX0lOX09CSkVDVF9GSVJTVCAgICAgIF9QYXJzZUNvbnRleHQgPSA0CisJX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZICAgX1BhcnNlQ29udGV4dCA9IDUKKwlfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSBfUGFyc2VDb250ZXh0ID0gNgorKQorCitmdW5jIChwIF9QYXJzZUNvbnRleHQpIFN0cmluZygpIHN0cmluZyB7CisJc3dpdGNoIHAgeworCWNhc2UgX0NPTlRFWFRfSU5fVE9QTEVWRUw6CisJCXJldHVybiAiVE9QTEVWRUwiCisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgorCQlyZXR1cm4gIkxJU1QtRklSU1QiCisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgorCQlyZXR1cm4gIkxJU1QiCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1Q6CisJCXJldHVybiAiT0JKRUNULUZJUlNUIgorCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQlyZXR1cm4gIk9CSkVDVC1ORVhULUtFWSIKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgorCQlyZXR1cm4gIk9CSkVDVC1ORVhULVZBTFVFIgorCX0KKwlyZXR1cm4gIlVOS05PV04tUEFSU0UtQ09OVEVYVCIKK30KKworLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorLy8KKy8vIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAorLy8gc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKKy8vIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KKy8vCit0eXBlIFRTaW1wbGVKU09OUHJvdG9jb2wgc3RydWN0IHsKKwl0cmFucyBUVHJhbnNwb3J0CisKKwlwYXJzZUNvbnRleHRTdGFjayBbXWludAorCWR1bXBDb250ZXh0ICAgICAgIFtdaW50CisKKwl3cml0ZXIgKmJ1ZmlvLldyaXRlcgorCXJlYWRlciAqYnVmaW8uUmVhZGVyCit9CisKKy8vIENvbnN0cnVjdG9yCitmdW5jIE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodCBUVHJhbnNwb3J0KSAqVFNpbXBsZUpTT05Qcm90b2NvbCB7CisJdiA6PSAmVFNpbXBsZUpTT05Qcm90b2NvbHt0cmFuczogdCwKKwkJd3JpdGVyOiBidWZpby5OZXdXcml0ZXIodCksCisJCXJlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHQpLAorCX0KKwl2LnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHYucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJdi5kdW1wQ29udGV4dCA9IGFwcGVuZCh2LmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXJldHVybiB2Cit9CisKKy8vIEZhY3RvcnkKK3R5cGUgVFNpbXBsZUpTT05Qcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCit9CisKK2Z1bmMgTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVFNpbXBsZUpTT05Qcm90b2NvbEZhY3Rvcnl7fQorfQorCit2YXIgKAorCUpTT05fQ09NTUEgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9DT0xPTiAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0xCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fUkJSQUNFICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9MQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1JCUkFDS0VUICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fUVVPVEUgICAgICAgICAgICAgICAgICAgYnl0ZQorCUpTT05fUVVPVEVfQllURVMgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9OVUxMICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1RSVUUgICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fRkFMU0UgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9JTkZJTklUWSAgICAgICAgICAgICAgICBzdHJpbmcKKwlKU09OX05FR0FUSVZFX0lORklOSVRZICAgICAgIHN0cmluZworCUpTT05fTkFOICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCisJSlNPTl9JTkZJTklUWV9CWVRFUyAgICAgICAgICBbXWJ5dGUKKwlKU09OX05FR0FUSVZFX0lORklOSVRZX0JZVEVTIFtdYnl0ZQorCUpTT05fTkFOX0JZVEVTICAgICAgICAgICAgICAgW11ieXRlCisJanNvbl9ub25iYXNlX21hcF9lbGVtX2J5dGVzICBbXWJ5dGUKKykKKworZnVuYyBpbml0KCkgeworCUpTT05fQ09NTUEgPSBbXWJ5dGV7JywnfQorCUpTT05fQ09MT04gPSBbXWJ5dGV7JzonfQorCUpTT05fTEJSQUNFID0gW11ieXRleyd7J30KKwlKU09OX1JCUkFDRSA9IFtdYnl0ZXsnfSd9CisJSlNPTl9MQlJBQ0tFVCA9IFtdYnl0ZXsnWyd9CisJSlNPTl9SQlJBQ0tFVCA9IFtdYnl0ZXsnXSd9CisJSlNPTl9RVU9URSA9ICciJworCUpTT05fUVVPVEVfQllURVMgPSBbXWJ5dGV7JyInfQorCUpTT05fTlVMTCA9IFtdYnl0ZXsnbicsICd1JywgJ2wnLCAnbCd9CisJSlNPTl9UUlVFID0gW11ieXRleyd0JywgJ3InLCAndScsICdlJ30KKwlKU09OX0ZBTFNFID0gW11ieXRleydmJywgJ2EnLCAnbCcsICdzJywgJ2UnfQorCUpTT05fSU5GSU5JVFkgPSAiSW5maW5pdHkiCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWSA9ICItSW5maW5pdHkiCisJSlNPTl9OQU4gPSAiTmFOIgorCUpTT05fSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7J0knLCAnbicsICdmJywgJ2knLCAnbicsICdpJywgJ3QnLCAneSd9CisJSlNPTl9ORUdBVElWRV9JTkZJTklUWV9CWVRFUyA9IFtdYnl0ZXsnLScsICdJJywgJ24nLCAnZicsICdpJywgJ24nLCAnaScsICd0JywgJ3knfQorCUpTT05fTkFOX0JZVEVTID0gW11ieXRleydOJywgJ2EnLCAnTid9CisJanNvbl9ub25iYXNlX21hcF9lbGVtX2J5dGVzID0gW11ieXRleyddJywgJywnLCAnWyd9Cit9CisKK2Z1bmMganNvblF1b3RlKHMgc3RyaW5nKSBzdHJpbmcgeworCWIsIF8gOj0ganNvbi5NYXJzaGFsKHMpCisJczEgOj0gc3RyaW5nKGIpCisJcmV0dXJuIHMxCit9CisKK2Z1bmMganNvblVucXVvdGUocyBzdHJpbmcpIChzdHJpbmcsIGJvb2wpIHsKKwlzMSA6PSBuZXcoc3RyaW5nKQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHMxKQorCXJldHVybiAqczEsIGVyciA9PSBuaWwKK30KKworZnVuYyBtaXNtYXRjaChleHBlY3RlZCwgYWN0dWFsIHN0cmluZykgZXJyb3IgeworCXJldHVybiBmbXQuRXJyb3JmKCJFeHBlY3RlZCAnJXMnIGJ1dCBmb3VuZCAnJXMnIHdoaWxlIHBhcnNpbmcgSlNPTi4iLCBleHBlY3RlZCwgYWN0dWFsKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OCh0eXBlSWQpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJMzIoc2VxSWQpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dE9iamVjdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCS8vcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgoa2V5VHlwZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OCh2YWx1ZVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCb29sKGIgYm9vbCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEJvb2woYikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCeXRlKGIgaW50OCkgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKGIpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkxNih2IGludDE2KSBlcnJvciB7CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIodikpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlSTMyKHYgaW50MzIpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlSTY0KHYgaW50NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRG91YmxlKHYgZmxvYXQ2NCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEY2NCh2KQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVN0cmluZyh2IHN0cmluZykgZXJyb3IgeworCXJldHVybiBwLk91dHB1dFN0cmluZyh2KQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJpbmFyeSh2IFtdYnl0ZSkgZXJyb3IgeworCS8vIEpTT04gbGlicmFyeSBvbmx5IHRha2VzIGluIGEgc3RyaW5nLAorCS8vIG5vdCBhbiBhcmJpdHJhcnkgYnl0ZSBhcnJheSwgdG8gZW5zdXJlIGJ5dGVzIGFyZSB0cmFuc21pdHRlZAorCS8vIGVmZmljaWVudGx5IHdlIG11c3QgY29udmVydCB0aGlzIGludG8gYSB2YWxpZCBKU09OIHN0cmluZworCS8vIHRoZXJlZm9yZSB3ZSB1c2UgYmFzZTY0IGVuY29kaW5nIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBlc2NhcGluZy9xdW90aW5nCisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJd3JpdGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKGJhc2U2NC5TdGRFbmNvZGluZywgcC53cml0ZXIpCisJaWYgXywgZSA6PSB3cml0ZXIuV3JpdGUodik7IGUgIT0gbmlsIHsKKwkJcC53cml0ZXIuUmVzZXQocC50cmFucykgLy8gVEhSSUZULTM3MzUKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBlIDo9IHdyaXRlci5DbG9zZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworLy8gUmVhZGluZyBtZXRob2RzLgorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQorCWlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIG5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwliVHlwZUlkLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJdHlwZUlkID0gVE1lc3NhZ2VUeXBlKGJUeXBlSWQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJaWYgc2VxSWQsIGVyciA9IHAuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4gIiIsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCBUVHlwZSwgaW50MTYsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCAwLCBlcnIKKwl9CisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpID4gMCB7CisJCXN3aXRjaCBiWzBdIHsKKwkJY2FzZSBKU09OX1JCUkFDRVswXToKKwkJCXJldHVybiAiIiwgU1RPUCwgMCwgbmlsCisJCWNhc2UgSlNPTl9RVU9URToKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCW5hbWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCisJCQkvLyBzaW1wbGVqc29uIGlzIG5vdCBtZWFudCB0byBiZSByZWFkIGJhY2sgaW50byB0aHJpZnQKKwkJCS8vIC0gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFVzYWdlSmF2YQorCQkJLy8gLSB1c2UgSlNPTiBpbnN0ZWFkCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCisJCQl9CisJCQlyZXR1cm4gbmFtZSwgU1RPUCwgLTEsIHAuUGFyc2VQb3N0VmFsdWUoKQorCQkJLyoKKwkJCSAgIGlmIGVyciA9IHAuUGFyc2VQb3N0VmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCQkgICAgIHJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKKwkJCSAgIH0KKwkJCSAgIGlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQkJICAgICByZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCisJCQkgICB9CisJCQkgICBiVHlwZSwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCQkJICAgdGhldHlwZSA6PSBUVHlwZShiVHlwZSkKKwkJCSAgIGlmIGVyciAhPSBuaWwgeworCQkJICAgICByZXR1cm4gbmFtZSwgdGhldHlwZSwgMCwgZXJyCisJCQkgICB9CisJCQkgICBpZCwgZXJyIDo9IHAuUmVhZEkxNigpCisJCQkgICByZXR1cm4gbmFtZSwgdGhldHlwZSwgaWQsIGVycgorCQkJKi8KKwkJfQorCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwifVwiIG9yICdcIicsIGJ1dCBmb3VuZDogJyVzJyIsIHN0cmluZyhiKSkKKwkJcmV0dXJuICIiLCBTVE9QLCAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGlvLkVPRikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKKwkvL3JldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIFZPSUQsIDAsIGUKKwl9CisKKwkvLyByZWFkIGtleVR5cGUKKwliS2V5VHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKKwlrZXlUeXBlID0gVFR5cGUoYktleVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCB2YWx1ZVR5cGUKKwliVmFsdWVUeXBlLCBlIDo9IHAuUmVhZEJ5dGUoKQorCXZhbHVlVHlwZSA9IFRUeXBlKGJWYWx1ZVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCBzaXplCisJaVNpemUsIGVyciA6PSBwLlJlYWRJNjQoKQorCXNpemUgPSBpbnQoaVNpemUpCisJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXZhciB2YWx1ZSBib29sCisKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdmFsdWUsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwIHsKKwkJc3dpdGNoIGZbMF0geworCQljYXNlIEpTT05fVFJVRVswXToKKwkJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX1RSVUUpKQorCQkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBmYWxzZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJCX0KKwkJCWlmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9UUlVFKSB7CisJCQkJdmFsdWUgPSB0cnVlCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJ0cnVlXCIgYnV0IGZvdW5kOiAlcyIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWJyZWFrCisJCWNhc2UgSlNPTl9GQUxTRVswXToKKwkJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0ZBTFNFKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fRkFMU0UpIHsKKwkJCQl2YWx1ZSA9IGZhbHNlCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJmYWxzZVwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlicmVhaworCQljYXNlIEpTT05fTlVMTFswXToKKwkJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBmYWxzZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJCX0KKwkJCWlmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQkJdmFsdWUgPSBmYWxzZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwibnVsbFwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiLCBcImZhbHNlXCIsIG9yIFwibnVsbFwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoZikpCisJCQlyZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQ4KHYpLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkxNigpIChpbnQxNiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MTYodiksIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQzMih2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIGVycm9yKSB7CisJdiwgXywgZXJyIDo9IHAuUGFyc2VJNjQoKQorCXJldHVybiB2LCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlRjY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBlcnJvcikgeworCXZhciB2IHN0cmluZworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiB2LCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgeworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIGVycm9yKSB7CisJdmFyIHYgW11ieXRlCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpCisJCXYgPSB2YWx1ZQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBlcnIKKwkJfQorCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJaWYgc3RyaW5nKGIpICE9IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoYikpCisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfSBlbHNlIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhmKSkKKwkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisKKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAud3JpdGVyLkZsdXNoKCkpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC50cmFucworfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRQcmVWYWx1ZSgpIGVycm9yIHsKKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fQ09NTUEpOyBlICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgorCQlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9DT0xPTik7IGUgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFBvc3RWYWx1ZSgpIGVycm9yIHsKKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6CisJCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwkJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fTElTVCkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1Q6CisJCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwkJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSkpCisJCWJyZWFrCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0Qm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJdmFyIHYgc3RyaW5nCisJaWYgdmFsdWUgeworCQl2ID0gc3RyaW5nKEpTT05fVFJVRSkKKwl9IGVsc2UgeworCQl2ID0gc3RyaW5nKEpTT05fRkFMU0UpCisJfQorCXN3aXRjaCBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKSB7CisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJdiA9IGpzb25RdW90ZSh2KQorCWRlZmF1bHQ6CisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKHYpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dE51bGwoKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTlVMTCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRGNjQodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXZhciB2IHN0cmluZworCWlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fTkFOICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fSU5GSU5JVFkgKyBzdHJpbmcoSlNPTl9RVU9URSkKKwl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgKyBzdHJpbmcoSlNPTl9RVU9URSkKKwl9IGVsc2UgeworCQl2ID0gc3RyY29udi5Gb3JtYXRGbG9hdCh2YWx1ZSwgJ2cnLCAtMSwgNjQpCisJCXN3aXRjaCBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKSB7CisJCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCQl2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgdiArIHN0cmluZyhKU09OX1FVT1RFKQorCQlkZWZhdWx0OgorCQl9CisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKHYpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXYgOj0gc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKQorCXN3aXRjaCBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKSB7CisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJdiA9IGpzb25RdW90ZSh2KQorCWRlZmF1bHQ6CisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKHYpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZyhzIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKGpzb25RdW90ZShzKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0U3RyaW5nRGF0YShzIHN0cmluZykgZXJyb3IgeworCV8sIGUgOj0gcC53cml0ZShbXWJ5dGUocykpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RCZWdpbigpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9MQlJBQ0UpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dE9iamVjdEVuZCgpIGVycm9yIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9SQlJBQ0UpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCWlmIGUgOj0gcC5PdXRwdXRQb3N0VmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dExpc3RCZWdpbigpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9MQlJBQ0tFVCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUKSkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dExpc3RFbmQoKSBlcnJvciB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUkJSQUNLRVQpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCWlmIGUgOj0gcC5PdXRwdXRQb3N0VmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OChlbGVtVHlwZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVByZVZhbHVlKCkgZXJyb3IgeworCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1Q6CisJCWlmIGxlbihiKSA+IDAgeworCQkJc3dpdGNoIGJbMF0geworCQkJY2FzZSBKU09OX1JCUkFDS0VUWzBdOgorCQkJCXJldHVybiBuaWwKKwkJCWNhc2UgSlNPTl9DT01NQVswXToKKwkJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQkJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCXJldHVybiBuaWwKKwkJCWRlZmF1bHQ6CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIl1cIiBvciBcIixcIiBpbiBsaXN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiVzXCIiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJfQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQlpZiBsZW4oYikgPiAwIHsKKwkJCXN3aXRjaCBiWzBdIHsKKwkJCWNhc2UgSlNPTl9SQlJBQ0VbMF06CisJCQkJcmV0dXJuIG5pbAorCQkJY2FzZSBKU09OX0NPTU1BWzBdOgorCQkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCQlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJcmV0dXJuIG5pbAorCQkJZGVmYXVsdDoKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwifVwiIG9yIFwiLFwiIGluIG9iamVjdCBjb250ZXh0LCBidXQgZm91bmQgXCIlc1wiIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCX0KKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgorCQlpZiBsZW4oYikgPiAwIHsKKwkJCXN3aXRjaCBiWzBdIHsKKwkJCWNhc2UgSlNPTl9DT0xPTlswXToKKwkJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQkJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCXJldHVybiBuaWwKKwkJCWRlZmF1bHQ6CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIjpcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiJXNcIiIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQl9CisJCWJyZWFrCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VQb3N0VmFsdWUoKSBlcnJvciB7CisJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKQorCXN3aXRjaCBjeHQgeworCWNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9MSVNUKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSkpCisJCWJyZWFrCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpIGVycm9yIHsKKwlmb3IgeworCQliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwkJaWYgbGVuKGIpIDwgMSB7CisJCQlyZXR1cm4gbmlsCisJCX0KKwkJc3dpdGNoIGJbMF0geworCQljYXNlICcgJywgJ1xyJywgJ1xuJywgJ1x0JzoKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCWNvbnRpbnVlCisJCWRlZmF1bHQ6CisJCQlicmVhaworCQl9CisJCWJyZWFrCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VTdHJpbmdCb2R5KCkgKHN0cmluZywgZXJyb3IpIHsKKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1FVT1RFKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWwgOj0gbGVuKGxpbmUpCisJLy8gY291bnQgbnVtYmVyIG9mIGVzY2FwZXMgdG8gc2VlIGlmIHdlIG5lZWQgdG8ga2VlcCBnb2luZworCWkgOj0gMQorCWZvciA7IGkgPCBsOyBpKysgeworCQlpZiBsaW5lW2wtaS0xXSAhPSAnXFwnIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgaSYweDAxID09IDEgeworCQl2LCBvayA6PSBqc29uVW5xdW90ZShzdHJpbmcoSlNPTl9RVU9URSkgKyBsaW5lKQorCQlpZiAhb2sgeworCQkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCXJldHVybiB2LCBuaWwKKwl9CisJcywgZXJyIDo9IHAuUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlzdHIgOj0gc3RyaW5nKEpTT05fUVVPVEUpICsgbGluZSArIHMKKwl2LCBvayA6PSBqc29uVW5xdW90ZShzdHIpCisJaWYgIW9rIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgYXMgSlNPTiBzdHJpbmcgJXMiLCBzdHIpCisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUXVvdGVkU3RyaW5nQm9keSgpIChzdHJpbmcsIGVycm9yKSB7CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9RVU9URSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsIDo9IGxlbihsaW5lKQorCS8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKKwlpIDo9IDEKKwlmb3IgOyBpIDwgbDsgaSsrIHsKKwkJaWYgbGluZVtsLWktMV0gIT0gJ1xcJyB7CisJCQlicmVhaworCQl9CisJfQorCWlmIGkmMHgwMSA9PSAxIHsKKwkJcmV0dXJuIGxpbmUsIG5pbAorCX0KKwlzLCBlcnIgOj0gcC5QYXJzZVF1b3RlZFN0cmluZ0JvZHkoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCXYgOj0gbGluZSArIHMKKwlyZXR1cm4gdiwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKSAoW11ieXRlLCBlcnJvcikgeworCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkQnl0ZXMoSlNPTl9RVU9URSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGxpbmUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWxpbmUyIDo9IGxpbmVbMCA6IGxlbihsaW5lKS0xXQorCWwgOj0gbGVuKGxpbmUyKQorCWlmIChsICUgNCkgIT0gMCB7CisJCXBhZCA6PSA0IC0gKGwgJSA0KQorCQlmaWxsIDo9IFsuLi5dYnl0ZXsnPScsICc9JywgJz0nfQorCQlsaW5lMiA9IGFwcGVuZChsaW5lMiwgZmlsbFs6cGFkXS4uLikKKwkJbCA9IGxlbihsaW5lMikKKwl9CisJb3V0cHV0IDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlZExlbihsKSkKKwluLCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZShvdXRwdXQsIGxpbmUyKQorCXJldHVybiBvdXRwdXRbMDpuXSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VJNjQoKSAoaW50NjQsIGJvb2wsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGZhbHNlLCBlcnIKKwl9CisJdmFyIHZhbHVlIGludDY0CisJdmFyIGlzbnVsbCBib29sCisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCisJCWlzbnVsbCA9IHRydWUKKwl9IGVsc2UgeworCQludW0sIGVyciA6PSBwLnJlYWROdW1lcmljKCkKKwkJaXNudWxsID0gKG51bSA9PSBuaWwpCisJCWlmICFpc251bGwgeworCQkJdmFsdWUgPSBudW0uSW50NjQoKQorCQl9CisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHZhbHVlLCBpc251bGwsIGVycgorCQl9CisJfQorCXJldHVybiB2YWx1ZSwgaXNudWxsLCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VGNjQoKSAoZmxvYXQ2NCwgYm9vbCwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZmFsc2UsIGVycgorCX0KKwl2YXIgdmFsdWUgZmxvYXQ2NAorCXZhciBpc251bGwgYm9vbAorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQorCQlpc251bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJbnVtLCBlcnIgOj0gcC5yZWFkTnVtZXJpYygpCisJCWlzbnVsbCA9IChudW0gPT0gbmlsKQorCQlpZiAhaXNudWxsIHsKKwkJCXZhbHVlID0gbnVtLkZsb2F0NjQoKQorCQl9CisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHZhbHVlLCBpc251bGwsIGVycgorCQl9CisJfQorCXJldHVybiB2YWx1ZSwgaXNudWxsLCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VPYmplY3RTdGFydCgpIChib29sLCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCXZhciBiIFtdYnl0ZQorCWIsIGVyciA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX0xCUkFDRVswXSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKKwkJcmV0dXJuIGZhbHNlLCBuaWwKKwl9IGVsc2UgaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlyZXR1cm4gdHJ1ZSwgbmlsCisJfQorCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgJ3snIG9yIG51bGwsIGJ1dCBmb3VuZCAnJXMnIiwgc3RyaW5nKGIpKQorCXJldHVybiBmYWxzZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZU9iamVjdEVuZCgpIGVycm9yIHsKKwlpZiBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKQorCWlmIChjeHQgIT0gX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSAmJiAoY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSkgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHRvIGJlIGluIHRoZSBPYmplY3QgQ29udGV4dCwgYnV0IG5vdCBpbiBPYmplY3QgQ29udGV4dCAoJWQpIiwgY3h0KQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1JCUkFDRVswXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWZvciBfLCBjaGFyIDo9IHJhbmdlIGxpbmUgeworCQlzd2l0Y2ggY2hhciB7CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGluZyBlbmQgb2Ygb2JqZWN0IFwifVwiLCBidXQgZm91bmQ6IFwiJXNcIiIsIGxpbmUpCisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgJ30nOgorCQkJYnJlYWsKKwkJfQorCX0KKwlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJcmV0dXJuIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUxpc3RCZWdpbigpIChpc051bGwgYm9vbCwgZXJyIGVycm9yKSB7CisJaWYgZSA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGUKKwl9CisJdmFyIGIgW11ieXRlCisJYiwgZXJyID0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwlpZiBsZW4oYikgPj0gMSAmJiBiWzBdID09IEpTT05fTEJSQUNLRVRbMF0geworCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUKSkKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQlpc051bGwgPSBmYWxzZQorCX0gZWxzZSBpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCWlzTnVsbCA9IHRydWUKKwl9IGVsc2UgeworCQllcnIgPSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIm51bGxcIiBvciBcIltcIiwgcmVjZWl2ZWQgJXEiLCBiKQorCX0KKwlyZXR1cm4gaXNOdWxsLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VFbGVtTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCAwLCBlCisJfQorCWJFbGVtVHlwZSwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCWVsZW1UeXBlID0gVFR5cGUoYkVsZW1UeXBlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycgorCX0KKwluU2l6ZSwgZXJyMiA6PSBwLlJlYWRJNjQoKQorCXNpemUgPSBpbnQoblNpemUpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlTGlzdEVuZCgpIGVycm9yIHsKKwlpZiBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKQorCWlmIGN4dCAhPSBfQ09OVEVYVF9JTl9MSVNUIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgTGlzdCBDb250ZXh0LCBidXQgbm90IGluIExpc3QgQ29udGV4dCAoJWQpIiwgY3h0KQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1JCUkFDS0VUWzBdKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7CisJCXN3aXRjaCBjaGFyIHsKKwkJZGVmYXVsdDoKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiJXZcIiIsIGxpbmUpCisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgcnVuZShKU09OX1JCUkFDS0VUWzBdKToKKwkJCWJyZWFrCisJCX0KKwl9CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCWlmIF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pID09IF9DT05URVhUX0lOX1RPUExFVkVMIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWRTaW5nbGVWYWx1ZSgpIChpbnRlcmZhY2V7fSwgVFR5cGUsIGVycm9yKSB7CisJZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWIsIGUgOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgeworCQljIDo9IGJbMF0KKwkJc3dpdGNoIGMgeworCQljYXNlIEpTT05fTlVMTFswXToKKwkJCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJfQorCQkJaWYgc3RyaW5nKEpTT05fTlVMTCkgIT0gc3RyaW5nKGJ1ZikgeworCQkJCWUgPSBtaXNtYXRjaChzdHJpbmcoSlNPTl9OVUxMKSwgc3RyaW5nKGJ1ZikpCisJCQkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIG5pbCwgVk9JRCwgbmlsCisJCWNhc2UgSlNPTl9RVU9URToKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCXYsIGUgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiB2LCBVVEY4LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHYgPT0gSlNPTl9JTkZJTklUWSB7CisJCQkJcmV0dXJuIElORklOSVRZLCBET1VCTEUsIG5pbAorCQkJfSBlbHNlIGlmIHYgPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZLCBET1VCTEUsIG5pbAorCQkJfSBlbHNlIGlmIHYgPT0gSlNPTl9OQU4geworCQkJCXJldHVybiBOQU4sIERPVUJMRSwgbmlsCisJCQl9CisJCQlyZXR1cm4gdiwgVVRGOCwgbmlsCisJCWNhc2UgSlNPTl9UUlVFWzBdOgorCQkJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9UUlVFKSkKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIHRydWUsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJfQorCQkJaWYgc3RyaW5nKEpTT05fVFJVRSkgIT0gc3RyaW5nKGJ1ZikgeworCQkJCWUgOj0gbWlzbWF0Y2goc3RyaW5nKEpTT05fVFJVRSksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlyZXR1cm4gdHJ1ZSwgQk9PTCwgbmlsCisJCWNhc2UgSlNPTl9GQUxTRVswXToKKwkJCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fRkFMU0UpKQorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJfQorCQkJaWYgc3RyaW5nKEpTT05fRkFMU0UpICE9IHN0cmluZyhidWYpIHsKKwkJCQllIDo9IG1pc21hdGNoKHN0cmluZyhKU09OX0ZBTFNFKSwgc3RyaW5nKGJ1ZikpCisJCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlyZXR1cm4gZmFsc2UsIEJPT0wsIG5pbAorCQljYXNlIEpTT05fTEJSQUNLRVRbMF06CisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCXJldHVybiBtYWtlKFtdaW50ZXJmYWNle30sIDApLCBMSVNULCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJY2FzZSBKU09OX0xCUkFDRVswXToKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJcmV0dXJuIG1ha2UobWFwW3N0cmluZ11pbnRlcmZhY2V7fSksIFNUUlVDVCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCWNhc2UgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnZScsICdFJywgJy4nLCAnKycsICctJywgSlNPTl9JTkZJTklUWVswXSwgSlNPTl9OQU5bMF06CisJCQkvLyBhc3N1bWUgbnVtZXJpYworCQkJdiwgZSA6PSBwLnJlYWROdW1lcmljKCkKKwkJCXJldHVybiB2LCBET1VCTEUsIGUKKwkJZGVmYXVsdDoKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgZWxlbWVudCBpbiBsaXN0IGJ1dCBmb3VuZCAnJXMnIHdoaWxlIHBhcnNpbmcgSlNPTi4iLCBzdHJpbmcoYykpCisJCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJZSA9IGZtdC5FcnJvcmYoIkNhbm5vdCByZWFkIGEgc2luZ2xlIGVsZW1lbnQgd2hpbGUgcGFyc2luZyBKU09OLiIpCisJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWRJZk51bGwoKSAoYm9vbCwgZXJyb3IpIHsKKwljb250IDo9IHRydWUKKwlmb3IgY29udCB7CisJCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCQlpZiBsZW4oYikgPCAxIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0KKwkJc3dpdGNoIGJbMF0geworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQljb250ID0gZmFsc2UKKwkJCWJyZWFrCisJCWNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnOgorCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJYnJlYWsKKwkJfQorCX0KKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKKwkJcmV0dXJuIHRydWUsIG5pbAorCX0KKwlyZXR1cm4gZmFsc2UsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkUXVvdGVJZk5leHQoKSB7CisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgeworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJfQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkTnVtZXJpYygpIChOdW1lcmljLCBlcnJvcikgeworCWlzTnVsbCwgZXJyIDo9IHAucmVhZElmTnVsbCgpCisJaWYgaXNOdWxsIHx8IGVyciAhPSBuaWwgeworCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBlcnIKKwl9CisJaGFzRGVjaW1hbFBvaW50IDo9IGZhbHNlCisJbmV4dENhbkJlU2lnbiA6PSB0cnVlCisJaGFzRSA6PSBmYWxzZQorCU1BWF9MRU4gOj0gNDAKKwlidWYgOj0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCBNQVhfTEVOKSkKKwljb250aW51ZUZvciA6PSB0cnVlCisJaW5RdW90ZXMgOj0gZmFsc2UKKwlmb3IgY29udGludWVGb3IgeworCQljLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWlmIGVyciA9PSBpby5FT0YgeworCQkJCWJyZWFrCisJCQl9CisJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCXN3aXRjaCBjIHsKKwkJY2FzZSAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOSc6CisJCQlidWYuV3JpdGVCeXRlKGMpCisJCQluZXh0Q2FuQmVTaWduID0gZmFsc2UKKwkJY2FzZSAnLic6CisJCQlpZiBoYXNEZWNpbWFsUG9pbnQgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIG11bHRpcGxlIGRlY2ltYWwgcG9pbnRzICclcy4nIiwgYnVmLlN0cmluZygpKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWlmIGhhc0UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIGRlY2ltYWwgcG9pbnRzIGluIHRoZSBleHBvbmVudCAnJXMuJyIsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlidWYuV3JpdGVCeXRlKGMpCisJCQloYXNEZWNpbWFsUG9pbnQsIG5leHRDYW5CZVNpZ24gPSB0cnVlLCBmYWxzZQorCQljYXNlICdlJywgJ0UnOgorCQkJaWYgaGFzRSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggbXVsdGlwbGUgZXhwb25lbnRzICclcyVjJyIsIGJ1Zi5TdHJpbmcoKSwgYykKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlidWYuV3JpdGVCeXRlKGMpCisJCQloYXNFLCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgdHJ1ZQorCQljYXNlICctJywgJysnOgorCQkJaWYgIW5leHRDYW5CZVNpZ24geworCQkJCWUgOj0gZm10LkVycm9yZigiTmVnYXRpdmUgc2lnbiB3aXRoaW4gbnVtYmVyIikKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlidWYuV3JpdGVCeXRlKGMpCisJCQluZXh0Q2FuQmVTaWduID0gZmFsc2UKKwkJY2FzZSAnICcsIDAsICdcdCcsICdcbicsICdccicsIEpTT05fUkJSQUNFWzBdLCBKU09OX1JCUkFDS0VUWzBdLCBKU09OX0NPTU1BWzBdLCBKU09OX0NPTE9OWzBdOgorCQkJcC5yZWFkZXIuVW5yZWFkQnl0ZSgpCisJCQljb250aW51ZUZvciA9IGZhbHNlCisJCWNhc2UgSlNPTl9OQU5bMF06CisJCQlpZiBidWYuTGVuKCkgPT0gMCB7CisJCQkJYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OQU4pKQorCQkJCWJ1ZmZlclswXSA9IGMKKwkJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzE6XSkKKwkJCQlpZiBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlpZiBKU09OX05BTiAhPSBzdHJpbmcoYnVmZmVyKSB7CisJCQkJCWUgOj0gbWlzbWF0Y2goSlNPTl9OQU4sIHN0cmluZyhidWZmZXIpKQorCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQkJfQorCQkJCWlmIGluUXVvdGVzIHsKKwkJCQkJcC5yZWFkUXVvdGVJZk5leHQoKQorCQkJCX0KKwkJCQlyZXR1cm4gTkFOLCBuaWwKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYyciLCBjKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJY2FzZSBKU09OX0lORklOSVRZWzBdOgorCQkJaWYgYnVmLkxlbigpID09IDAgfHwgKGJ1Zi5MZW4oKSA9PSAxICYmIGJ1Zi5CeXRlcygpWzBdID09ICcrJykgeworCQkJCWJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fSU5GSU5JVFkpKQorCQkJCWJ1ZmZlclswXSA9IGMKKwkJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzE6XSkKKwkJCQlpZiBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlpZiBKU09OX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKKwkJCQkJZSA6PSBtaXNtYXRjaChKU09OX0lORklOSVRZLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIElORklOSVRZLCBuaWwKKwkJCX0gZWxzZSBpZiBidWYuTGVuKCkgPT0gMSAmJiBidWYuQnl0ZXMoKVswXSA9PSBKU09OX05FR0FUSVZFX0lORklOSVRZWzBdIHsKKwkJCQlidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCQlidWZmZXJbMF0gPSBKU09OX05FR0FUSVZFX0lORklOSVRZWzBdCisJCQkJYnVmZmVyWzFdID0gYworCQkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMjpdKQorCQkJCWlmIGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCWlmIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgIT0gc3RyaW5nKGJ1ZmZlcikgeworCQkJCQllIDo9IG1pc21hdGNoKEpTT05fTkVHQVRJVkVfSU5GSU5JVFksIHN0cmluZyhidWZmZXIpKQorCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQkJfQorCQkJCWlmIGluUXVvdGVzIHsKKwkJCQkJcC5yZWFkUXVvdGVJZk5leHQoKQorCQkJCX0KKwkJCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFksIG5pbAorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyBkdWUgdG8gZXhpc3RpbmcgYnVmZmVyICVzIiwgYywgYnVmLlN0cmluZygpKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJY2FzZSBKU09OX1FVT1RFOgorCQkJaWYgIWluUXVvdGVzIHsKKwkJCQlpblF1b3RlcyA9IHRydWUKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIiwgYykKKwkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0KKwlpZiBidWYuTGVuKCkgPT0gMCB7CisJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBmcm9tIGVtcHR5IHN0cmluZyAnJyIpCisJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhidWYuU3RyaW5nKCksIGZhbHNlKSwgbmlsCit9CisKKy8vIFNhZmVseSBwZWVrcyBpbnRvIHRoZSBidWZmZXIsIHJlYWRpbmcgb25seSB3aGF0IGlzIG5lY2Vzc2FyeQorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgc2FmZVBlZWtDb250YWlucyhiIFtdYnl0ZSkgYm9vbCB7CisJZm9yIGkgOj0gMDsgaSA8IGxlbihiKTsgaSsrIHsKKwkJYSwgXyA6PSBwLnJlYWRlci5QZWVrKGkgKyAxKQorCQlpZiBsZW4oYSkgPT0gMCB8fCBhW2ldICE9IGJbaV0geworCQkJcmV0dXJuIGZhbHNlCisJCX0KKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gUmVzZXQgdGhlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZXNldENvbnRleHRTdGFjaygpIHsKKwlwLnBhcnNlQ29udGV4dFN0YWNrID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KKwlwLmR1bXBDb250ZXh0ID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgd3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAud3JpdGVyLldyaXRlKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJfQorCXJldHVybiBuLCBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk4MDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNzE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZm10IgorCSJtYXRoIgorCSJzdHJjb252IgorCSJzdHJpbmdzIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBmYWxzZQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJib29sZWFuIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCWlmIHZhbHVlIHsKKwkJCXRyYW5zLldyaXRlKEpTT05fVFJVRSkKKwkJfSBlbHNlIHsKKwkJCXRyYW5zLldyaXRlKEpTT05fRkFMU0UpCisJCX0KKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCb29sKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJieXRlIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDgoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQnl0ZSgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQxNigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDE2IgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTE2KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDMyKDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJMzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkzMk51bGwodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJdmFsdWUgOj0gIm51bGwiCisKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkSTMyKCkKKworCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9IDAgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJNjQodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50NjQoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQ2NCIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJNjQoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEk2NE51bGwodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJdmFsdWUgOj0gIm51bGwiCisKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkSTY0KCkKKworCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9IDAgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9OQU4pIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSkKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJkb3VibGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQorCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZERvdWJsZSgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiAhbWF0aC5Jc0luZih2LCAxKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgLTEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmICFtYXRoLklzTmFOKHYpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgc1swXSAhPSAnIicgfHwgc1tsZW4ocyktMV0gIT0gJyInIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICcldicsIHdyb3RlICcldicsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBmbXQuU3ByaW50KCJcIiIsIHZhbHVlLCAiXCIiKSkKKwkJfQorCQl2IDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYpOyBlcnIgIT0gbmlsIHx8ICp2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZSh2YWx1ZSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdjEgOj0gbmV3KHN0cmluZykKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZ051bGwodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gIiIgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlzIDo9IHRyYW5zLlN0cmluZygpCisJaWYgcyAhPSBmbXQuU3ByaW50KCJcIiIsIGI2NFN0cmluZywgIlwiIikgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldlxuICB3cm90ZTogJXZcbmV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCAiXCIiK2I2NFN0cmluZysiXCIiKQorCX0KKwl2MSA6PSBuZXcoc3RyaW5nKQorCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZShiNjRTdHJpbmcpKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgbGVuZ3RoICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkIGxlbmd0aDogJXYiLCB0aGV0eXBlLCBsZW4odmFsdWUpLCBzLCBsZW4odikpCisJfQorCWZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7CisJCWlmIHZbaV0gIT0gdmFsdWVbaV0geworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJWQgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgaSwgdmFsdWVbaV0sIHMsIHZbaV0pCisJCX0KKwl9CisJdjEgOj0gbmV3KHN0cmluZykKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeU51bGwodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwliLCBlIDo9IHAuUmVhZEJpbmFyeSgpCisJdiA6PSBzdHJpbmcoYikKKworCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9ICIiIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTGlzdCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJsaXN0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlTGlzdEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiTGlzdCBtdXN0IGJlIGF0IGxlYXN0IG9mIGxlbmd0aCB0d28gdG8gaW5jbHVkZSBtZXRhZGF0YSIpCisJfQorCWlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgRE9VQkxFLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sU2V0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInNldCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZVNldEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3Igc2V0LCBleHBlY3RlZDogIiwgRE9VQkxFLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJcyA6PSBsW2srMl0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xNYXAodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibWFwIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlTWFwQmVnaW4oVFR5cGUoSTMyKSwgVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTMyKGludDMyKGspKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBrZXkgaW50MzIgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlIGZsb2F0NjQgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZU1hcEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCWlmIHN0clswXSAhPSAnWycgfHwgc3RyW2xlbihzdHIpLTFdICE9ICddJyB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXYsIGluIGdvOiAldiIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKKwl9CisJbCA6PSBzdHJpbmdzLlNwbGl0KHN0clsxOmxlbihzdHIpLTFdLCAiLCIpCisJaWYgbGVuKGwpIDwgMyB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGxpc3Qgb2YgYXQgbGVhc3QgbGVuZ3RoIDMgZm9yIG1hcCBmb3IgbWV0YWRhdGEsIGJ1dCB3YXMgb2YgbGVuZ3RoICIsIGxlbihsKSkKKwl9CisJZXhwZWN0ZWRLZXlUeXBlLCBfIDo9IHN0cmNvbnYuQXRvaShsWzBdKQorCWV4cGVjdGVkVmFsdWVUeXBlLCBfIDo9IHN0cmNvbnYuQXRvaShsWzFdKQorCWV4cGVjdGVkU2l6ZSwgXyA6PSBzdHJjb252LkF0b2kobFsyXSkKKwlpZiBleHBlY3RlZEtleVR5cGUgIT0gSTMyIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIGtleSB0eXBlICIsIEkzMiwgIiwgYnV0IHdhcyAiLCBsWzBdKQorCX0KKwlpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgdmFsdWUgdHlwZSAiLCBET1VCTEUsICIsIGJ1dCB3YXMgIiwgbFsxXSkKKwl9CisJaWYgZXhwZWN0ZWRTaXplICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBzaXplIG9mICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhcyAiLCBsWzJdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXN0cmsgOj0gbFtrKjIrM10KKwkJc3RydiA6PSBsW2sqMis0XQorCQlpaywgZXJyIDo9IHN0cmNvbnYuQXRvaShzdHJrKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiwgZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgc3Ryaywgc3RyaW5nKGspLCBlcnIuRXJyb3IoKSkKKwkJfQorCQlpZiBpayAhPSBrIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHN0cmssIGspCisJCX0KKwkJcyA6PSBzdHJ2CisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05BTikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSkKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkIDo9IHN0cmNvbnYuRm9ybWF0RmxvYXQodmFsdWUsICdnJywgMTAsIDY0KQorCQkJaWYgcyAhPSBleHBlY3RlZCB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQgJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgZXhwZWN0ZWQpCisJCQl9CisJCQl2IDo9IGZsb2F0NjQoMCkKKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzU4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibG9nIgorCSJydW50aW1lL2RlYnVnIgorCSJzeW5jIgorCSJzeW5jL2F0b21pYyIKKykKKworLyoKKyAqIFRoaXMgaXMgbm90IGEgdHlwaWNhbCBUU2ltcGxlU2VydmVyIGFzIGl0IGlzIG5vdCBibG9ja2VkIGFmdGVyIGFjY2VwdCBhIHNvY2tldC4KKyAqIEl0IGlzIG1vcmUgbGlrZSBhIFRUaHJlYWRlZFNlcnZlciB0aGF0IGNhbiBoYW5kbGUgZGlmZmVyZW50IGNvbm5lY3Rpb25zIGluIGRpZmZlcmVudCBnb3JvdXRpbmVzLgorICogVGhpcyB3aWxsIHdvcmsgaWYgZ29sYW5nIHVzZXIgaW1wbGVtZW50cyBhIGNvbm4tcG9vbCBsaWtlIHRoaW5nIGluIGNsaWVudCBzaWRlLgorICovCit0eXBlIFRTaW1wbGVTZXJ2ZXIgc3RydWN0IHsKKwljbG9zZWQgaW50MzIKKwl3ZyAgICAgc3luYy5XYWl0R3JvdXAKKwltdSAgICAgc3luYy5NdXRleAorCisJcHJvY2Vzc29yRmFjdG9yeSAgICAgICBUUHJvY2Vzc29yRmFjdG9yeQorCXNlcnZlclRyYW5zcG9ydCAgICAgICAgVFNlcnZlclRyYW5zcG9ydAorCWlucHV0VHJhbnNwb3J0RmFjdG9yeSAgVFRyYW5zcG9ydEZhY3RvcnkKKwlvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5CisJaW5wdXRQcm90b2NvbEZhY3RvcnkgICBUUHJvdG9jb2xGYWN0b3J5CisJb3V0cHV0UHJvdG9jb2xGYWN0b3J5ICBUUHJvdG9jb2xGYWN0b3J5Cit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5MihOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTQoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQlwcm90b2NvbEZhY3RvcnksCisJKQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXI2KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQlpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisJCW91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisJCWlucHV0UHJvdG9jb2xGYWN0b3J5LAorCQlvdXRwdXRQcm90b2NvbEZhY3RvcnksCisJKQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Mihwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQlOZXdUVHJhbnNwb3J0RmFjdG9yeSgpLAorCQlOZXdUVHJhbnNwb3J0RmFjdG9yeSgpLAorCQlOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQlOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTQocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5LAorCQlzZXJ2ZXJUcmFuc3BvcnQsCisJCXRyYW5zcG9ydEZhY3RvcnksCisJCXRyYW5zcG9ydEZhY3RvcnksCisJCXByb3RvY29sRmFjdG9yeSwKKwkJcHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gJlRTaW1wbGVTZXJ2ZXJ7CisJCXByb2Nlc3NvckZhY3Rvcnk6ICAgICAgIHByb2Nlc3NvckZhY3RvcnksCisJCXNlcnZlclRyYW5zcG9ydDogICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKwkJaW5wdXRUcmFuc3BvcnRGYWN0b3J5OiAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlpbnB1dFByb3RvY29sRmFjdG9yeTogICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKwkJb3V0cHV0UHJvdG9jb2xGYWN0b3J5OiAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgUHJvY2Vzc29yRmFjdG9yeSgpIFRQcm9jZXNzb3JGYWN0b3J5IHsKKwlyZXR1cm4gcC5wcm9jZXNzb3JGYWN0b3J5Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFNlcnZlclRyYW5zcG9ydCgpIFRTZXJ2ZXJUcmFuc3BvcnQgeworCXJldHVybiBwLnNlcnZlclRyYW5zcG9ydAorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBJbnB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiBwLmlucHV0UHJvdG9jb2xGYWN0b3J5Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIE91dHB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiBwLm91dHB1dFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBMaXN0ZW4oKSBlcnJvciB7CisJcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIGlubmVyQWNjZXB0KCkgKGludDMyLCBlcnJvcikgeworCWNsaWVudCwgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpCisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJY2xvc2VkIDo9IGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKQorCWlmIGNsb3NlZCAhPSAwIHsKKwkJcmV0dXJuIGNsb3NlZCwgbmlsCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCWlmIGNsaWVudCAhPSBuaWwgeworCQlwLndnLkFkZCgxKQorCQlnbyBmdW5jKCkgeworCQkJZGVmZXIgcC53Zy5Eb25lKCkKKwkJCWlmIGVyciA6PSBwLnByb2Nlc3NSZXF1ZXN0cyhjbGllbnQpOyBlcnIgIT0gbmlsIHsKKwkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKKwkJCX0KKwkJfSgpCisJfQorCXJldHVybiAwLCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgQWNjZXB0TG9vcCgpIGVycm9yIHsKKwlmb3IgeworCQljbG9zZWQsIGVyciA6PSBwLmlubmVyQWNjZXB0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJaWYgY2xvc2VkICE9IDAgeworCQkJcmV0dXJuIG5pbAorCQl9CisJfQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZSgpIGVycm9yIHsKKwllcnIgOj0gcC5MaXN0ZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXAuQWNjZXB0TG9vcCgpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTdG9wKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlhdG9taWMuU3RvcmVJbnQzMigmcC5jbG9zZWQsIDEpCisJcC5zZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0KCkKKwlwLndnLldhaXQoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgcHJvY2Vzc1JlcXVlc3RzKGNsaWVudCBUVHJhbnNwb3J0KSBlcnJvciB7CisJcHJvY2Vzc29yIDo9IHAucHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KQorCWlucHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlvdXRwdXRUcmFuc3BvcnQsIGVyciA6PSBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpbnB1dFByb3RvY29sIDo9IHAuaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpCisJb3V0cHV0UHJvdG9jb2wgOj0gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KQorCWRlZmVyIGZ1bmMoKSB7CisJCWlmIGUgOj0gcmVjb3ZlcigpOyBlICE9IG5pbCB7CisJCQlsb2cuUHJpbnRmKCJwYW5pYyBpbiBwcm9jZXNzb3I6ICVzOiAlcyIsIGUsIGRlYnVnLlN0YWNrKCkpCisJCX0KKwl9KCkKKworCWlmIGlucHV0VHJhbnNwb3J0ICE9IG5pbCB7CisJCWRlZmVyIGlucHV0VHJhbnNwb3J0LkNsb3NlKCkKKwl9CisJaWYgb3V0cHV0VHJhbnNwb3J0ICE9IG5pbCB7CisJCWRlZmVyIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpCisJfQorCWZvciB7CisJCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCisJCW9rLCBlcnIgOj0gcHJvY2Vzc29yLlByb2Nlc3MoZGVmYXVsdEN0eCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCisJCWlmIGVyciwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IEVORF9PRl9GSUxFIHsKKwkJCXJldHVybiBuaWwKKwkJfSBlbHNlIGlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIGVyciwgb2sgOj0gZXJyLihUQXBwbGljYXRpb25FeGNlcHRpb24pOyBvayAmJiBlcnIuVHlwZUlkKCkgPT0gVU5LTk9XTl9NRVRIT0QgeworCQkJY29udGludWUKKwkJfQorCQlpZiAhb2sgeworCQkJYnJlYWsKKwkJfQorCX0KKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTQ5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJlcnJvcnMiCisJInJ1bnRpbWUiCispCisKK3R5cGUgbW9ja1NlcnZlclRyYW5zcG9ydCBzdHJ1Y3QgeworCUxpc3RlbkZ1bmMgICAgZnVuYygpIGVycm9yCisJQWNjZXB0RnVuYyAgICBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKQorCUNsb3NlRnVuYyAgICAgZnVuYygpIGVycm9yCisJSW50ZXJydXB0RnVuYyBmdW5jKCkgZXJyb3IKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgTGlzdGVuKCkgZXJyb3IgeworCXJldHVybiBtLkxpc3RlbkZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gbS5BY2NlcHRGdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJcmV0dXJuIG0uQ2xvc2VGdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgSW50ZXJydXB0KCkgZXJyb3IgeworCXJldHVybiBtLkludGVycnVwdEZ1bmMoKQorfQorCit0eXBlIG1vY2tUVHJhbnNwb3J0IHN0cnVjdCB7CisJVFRyYW5zcG9ydAorfQorCitmdW5jIChtICptb2NrVFRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIFRlc3RNdWx0aXBsZVN0b3AodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXZhciBpbnRlcnJ1cHRDYWxsZWQgYm9vbAorCWMgOj0gbWFrZShjaGFuIHN0cnVjdHt9KQorCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQk8LWMKKwkJCXJldHVybiBuaWwsIG5pbAorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQljIDwtIHN0cnVjdHt9e30KKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJSW50ZXJydXB0RnVuYzogZnVuYygpIGVycm9yIHsKKwkJCWludGVycnVwdENhbGxlZCA9IHRydWUKKwkJCXJldHVybiBuaWwKKwkJfSwKKwl9CisKKwlzZXJ2IDo9IE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2MsIHRyYW5zKQorCWdvIHNlcnYuU2VydmUoKQorCXNlcnYuU3RvcCgpCisJaWYgIWludGVycnVwdENhbGxlZCB7CisJCXQuRXJyb3IoImZpcnN0IHNlcnZlciB0cmFuc3BvcnQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnJ1cHRlZCIpCisJfQorCisJc2VydiA9IE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2MsIHRyYW5zKQorCWludGVycnVwdENhbGxlZCA9IGZhbHNlCisJZ28gc2Vydi5TZXJ2ZSgpCisJc2Vydi5TdG9wKCkKKwlpZiAhaW50ZXJydXB0Q2FsbGVkIHsKKwkJdC5FcnJvcigic2Vjb25kIHNlcnZlciB0cmFuc3BvcnQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnJ1cHRlZCIpCisJfQorfQorCitmdW5jIFRlc3RXYWl0UmFjZSh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCXJldHVybiAmbW9ja1RUcmFuc3BvcnR7fSwgbmlsCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJSW50ZXJydXB0RnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwl9CisKKwlzZXJ2IDo9IE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2MsIHRyYW5zKQorCWdvIHNlcnYuU2VydmUoKQorCXJ1bnRpbWUuR29zY2hlZCgpCisJc2Vydi5TdG9wKCkKK30KKworZnVuYyBUZXN0Tm9IYW5nRHVyaW5nU3RvcEZyb21EYW5nbGluZ0xvY2tBY3F1aXJlRHVyaW5nQWNjZXB0TG9vcCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoIm5vIHNpciIpCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJSW50ZXJydXB0RnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwl9CisKKwlzZXJ2IDo9IE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2MsIHRyYW5zKQorCWdvIHNlcnYuU2VydmUoKQorCXJ1bnRpbWUuR29zY2hlZCgpCisJc2Vydi5TdG9wKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1NDI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJIm5ldCIKKwkidGltZSIKKykKKwordHlwZSBUU29ja2V0IHN0cnVjdCB7CisJY29ubiAgICBuZXQuQ29ubgorCWFkZHIgICAgbmV0LkFkZHIKKwl0aW1lb3V0IHRpbWUuRHVyYXRpb24KK30KKworLy8gTmV3VFNvY2tldCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydAorLy8KKy8vIEV4YW1wbGU6CisvLyAJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNvY2tldCgibG9jYWxob3N0OjkwOTAiKQorZnVuYyBOZXdUU29ja2V0KGhvc3RQb3J0IHN0cmluZykgKCpUU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU29ja2V0VGltZW91dChob3N0UG9ydCwgMCkKK30KKworLy8gTmV3VFNvY2tldFRpbWVvdXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vIGl0IGFsc28gYWNjZXB0cyBhIHRpbWVvdXQgYXMgYSB0aW1lLkR1cmF0aW9uCitmdW5jIE5ld1RTb2NrZXRUaW1lb3V0KGhvc3RQb3J0IHN0cmluZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTb2NrZXQsIGVycm9yKSB7CisJLy9jb25uLCBlcnIgOj0gbmV0LkRpYWxUaW1lb3V0KG5ldHdvcmssIGFkZHJlc3MsIHRpbWVvdXQpCisJYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigidGNwIiwgaG9zdFBvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCB0aW1lb3V0KSwgbmlsCit9CisKKy8vIENyZWF0ZXMgYSBUU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTb2NrZXQgeworCXJldHVybiAmVFNvY2tldHthZGRyOiBhZGRyLCB0aW1lb3V0OiB0aW1lb3V0fQorfQorCisvLyBDcmVhdGVzIGEgVFNvY2tldCBmcm9tIGFuIGV4aXN0aW5nIG5ldC5Db25uCitmdW5jIE5ld1RTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiBuZXQuQ29ubiwgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNvY2tldCB7CisJcmV0dXJuICZUU29ja2V0e2Nvbm46IGNvbm4sIGFkZHI6IGNvbm4uUmVtb3RlQWRkcigpLCB0aW1lb3V0OiB0aW1lb3V0fQorfQorCisvLyBTZXRzIHRoZSBzb2NrZXQgdGltZW91dAorZnVuYyAocCAqVFNvY2tldCkgU2V0VGltZW91dCh0aW1lb3V0IHRpbWUuRHVyYXRpb24pIGVycm9yIHsKKwlwLnRpbWVvdXQgPSB0aW1lb3V0CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU29ja2V0KSBwdXNoRGVhZGxpbmUocmVhZCwgd3JpdGUgYm9vbCkgeworCXZhciB0IHRpbWUuVGltZQorCWlmIHAudGltZW91dCA+IDAgeworCQl0ID0gdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihwLnRpbWVvdXQpKQorCX0KKwlpZiByZWFkICYmIHdyaXRlIHsKKwkJcC5jb25uLlNldERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHJlYWQgeworCQlwLmNvbm4uU2V0UmVhZERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHdyaXRlIHsKKwkJcC5jb25uLlNldFdyaXRlRGVhZGxpbmUodCkKKwl9Cit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNvY2tldCkgT3BlbigpIGVycm9yIHsKKwlpZiBwLklzT3BlbigpIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpCisJfQorCWlmIHAuYWRkciA9PSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCisJfQorCWlmIGxlbihwLmFkZHIuTmV0d29yaygpKSA9PSAwIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgbmV0d29yayBuYW1lLiIpCisJfQorCWlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBhZGRyZXNzLiIpCisJfQorCXZhciBlcnIgZXJyb3IKKwlpZiBwLmNvbm4sIGVyciA9IG5ldC5EaWFsVGltZW91dChwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAudGltZW91dCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCisJfQorCXJldHVybiBuaWwKK30KKworLy8gUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgbmV0LkNvbm4KK2Z1bmMgKHAgKlRTb2NrZXQpIENvbm4oKSBuZXQuQ29ubiB7CisJcmV0dXJuIHAuY29ubgorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbgorZnVuYyAocCAqVFNvY2tldCkgSXNPcGVuKCkgYm9vbCB7CisJaWYgcC5jb25uID09IG5pbCB7CisJCXJldHVybiBmYWxzZQorCX0KKwlyZXR1cm4gdHJ1ZQorfQorCisvLyBDbG9zZXMgdGhlIHNvY2tldC4KK2Z1bmMgKHAgKlRTb2NrZXQpIENsb3NlKCkgZXJyb3IgeworCS8vIENsb3NlIHRoZSBzb2NrZXQKKwlpZiBwLmNvbm4gIT0gbmlsIHsKKwkJZXJyIDo9IHAuY29ubi5DbG9zZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCXAuY29ubiA9IG5pbAorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vUmV0dXJucyB0aGUgcmVtb3RlIGFkZHJlc3Mgb2YgdGhlIHNvY2tldC4KK2Z1bmMgKHAgKlRTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJcmV0dXJuIHAuYWRkcgorfQorCitmdW5jIChwICpUU29ja2V0KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZSh0cnVlLCBmYWxzZSkKKwluLCBlcnIgOj0gcC5jb25uLlJlYWQoYnVmKQorCXJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVFNvY2tldCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCisJfQorCXAucHVzaERlYWRsaW5lKGZhbHNlLCB0cnVlKQorCXJldHVybiBwLmNvbm4uV3JpdGUoYnVmKQorfQorCitmdW5jIChwICpUU29ja2V0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiBwLmNvbm4uQ2xvc2UoKQorfQorCitmdW5jIChwICpUU29ja2V0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDdhZmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjcnlwdG8vdGxzIgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNTTFNlcnZlclNvY2tldCBzdHJ1Y3QgeworCWxpc3RlbmVyICAgICAgbmV0Lkxpc3RlbmVyCisJYWRkciAgICAgICAgICBuZXQuQWRkcgorCWNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbgorCWludGVycnVwdGVkICAgYm9vbAorCWNmZyAgICAgICAgICAgKnRscy5Db25maWcKK30KKworZnVuYyBOZXdUU1NMU2VydmVyU29ja2V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjZmcgKnRscy5Db25maWcpICgqVFNTTFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNTTFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciwgY2ZnLCAwKQorfQorCitmdW5jIE5ld1RTU0xTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjZmcgKnRscy5Db25maWcsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU1NMU2VydmVyU29ja2V0LCBlcnJvcikgeworCWlmIGNmZy5NaW5WZXJzaW9uID09IDAgeworCQljZmcuTWluVmVyc2lvbiA9IHRscy5WZXJzaW9uVExTMTAKKwl9CisJYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigidGNwIiwgbGlzdGVuQWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiAmVFNTTFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0LCBjZmc6IGNmZ30sIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBMaXN0ZW4oKSBlcnJvciB7CisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlsLCBlcnIgOj0gdGxzLkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXAubGlzdGVuZXIgPSBsCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiBwLmludGVycnVwdGVkIHsKKwkJcmV0dXJuIG5pbCwgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQKKwl9CisJaWYgcC5saXN0ZW5lciA9PSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0IikKKwl9CisJY29ubiwgZXJyIDo9IHAubGlzdGVuZXIuQWNjZXB0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybiBOZXdUU1NMU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4sIHAuY2ZnLCBwLmNsaWVudFRpbWVvdXQpLCBuaWwKK30KKworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcuCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBJc0xpc3RlbmluZygpIGJvb2wgeworCXJldHVybiBwLmxpc3RlbmVyICE9IG5pbAorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU2VydmVyIHNvY2tldCBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiBsLCBlcnIgOj0gdGxzLkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlwLmxpc3RlbmVyID0gbAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJcmV0dXJuIHAuYWRkcgorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwlkZWZlciBmdW5jKCkgeworCQlwLmxpc3RlbmVyID0gbmlsCisJfSgpCisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJcmV0dXJuIHAubGlzdGVuZXIuQ2xvc2UoKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIEludGVycnVwdCgpIGVycm9yIHsKKwlwLmludGVycnVwdGVkID0gdHJ1ZQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYzMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImNyeXB0by90bHMiCisJIm5ldCIKKwkidGltZSIKKykKKwordHlwZSBUU1NMU29ja2V0IHN0cnVjdCB7CisJY29ubiBuZXQuQ29ubgorCS8vIGhvc3RQb3J0IGNvbnRhaW5zIGhvc3Q6cG9ydCAoZS5nLiAiYXNkZi5jb206MTIzNDUiKS4gVGhlIGZpZWxkIGlzCisJLy8gb25seSB2YWxpZCBpZiBhZGRyIGlzIG5pbC4KKwlob3N0UG9ydCBzdHJpbmcKKwkvLyBhZGRyIGlzIG5pbCB3aGVuIGhvc3RQb3J0IGlzIG5vdCAiIiwgYW5kIGlzIG9ubHkgdXNlZCB3aGVuIHRoZQorCS8vIFRTU0xTb2NrZXQgaXMgY29uc3RydWN0ZWQgZnJvbSBhIG5ldC5BZGRyLgorCWFkZHIgICAgbmV0LkFkZHIKKwl0aW1lb3V0IHRpbWUuRHVyYXRpb24KKwljZmcgICAgICp0bHMuQ29uZmlnCit9CisKKy8vIE5ld1RTU0xTb2NrZXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQgYW5kIHRscyBDb25maWd1cmF0aW9uCisvLworLy8gRXhhbXBsZToKKy8vIAl0cmFucywgZXJyIDo9IHRocmlmdC5OZXdUU1NMU29ja2V0KCJsb2NhbGhvc3Q6OTA5MCIsIG5pbCkKK2Z1bmMgTmV3VFNTTFNvY2tldChob3N0UG9ydCBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZykgKCpUU1NMU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU1NMU29ja2V0VGltZW91dChob3N0UG9ydCwgY2ZnLCAwKQorfQorCisvLyBOZXdUU1NMU29ja2V0VGltZW91dCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydAorLy8gaXQgYWxzbyBhY2NlcHRzIGEgdGxzIENvbmZpZ3VyYXRpb24gYW5kIGEgdGltZW91dCBhcyBhIHRpbWUuRHVyYXRpb24KK2Z1bmMgTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU1NMU29ja2V0LCBlcnJvcikgeworCWlmIGNmZy5NaW5WZXJzaW9uID09IDAgeworCQljZmcuTWluVmVyc2lvbiA9IHRscy5WZXJzaW9uVExTMTAKKwl9CisJcmV0dXJuICZUU1NMU29ja2V0e2hvc3RQb3J0OiBob3N0UG9ydCwgdGltZW91dDogdGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTU0xTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTU0xTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU1NMU29ja2V0IHsKKwlyZXR1cm4gJlRTU0xTb2NrZXR7YWRkcjogYWRkciwgdGltZW91dDogdGltZW91dCwgY2ZnOiBjZmd9Cit9CisKKy8vIENyZWF0ZXMgYSBUU1NMU29ja2V0IGZyb20gYW4gZXhpc3RpbmcgbmV0LkNvbm4KK2Z1bmMgTmV3VFNTTFNvY2tldEZyb21Db25uVGltZW91dChjb25uIG5ldC5Db25uLCBjZmcgKnRscy5Db25maWcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTU0xTb2NrZXQgeworCXJldHVybiAmVFNTTFNvY2tldHtjb25uOiBjb25uLCBhZGRyOiBjb25uLlJlbW90ZUFkZHIoKSwgdGltZW91dDogdGltZW91dCwgY2ZnOiBjZmd9Cit9CisKKy8vIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0CitmdW5jIChwICpUU1NMU29ja2V0KSBTZXRUaW1lb3V0KHRpbWVvdXQgdGltZS5EdXJhdGlvbikgZXJyb3IgeworCXAudGltZW91dCA9IHRpbWVvdXQKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIHB1c2hEZWFkbGluZShyZWFkLCB3cml0ZSBib29sKSB7CisJdmFyIHQgdGltZS5UaW1lCisJaWYgcC50aW1lb3V0ID4gMCB7CisJCXQgPSB0aW1lLk5vdygpLkFkZCh0aW1lLkR1cmF0aW9uKHAudGltZW91dCkpCisJfQorCWlmIHJlYWQgJiYgd3JpdGUgeworCQlwLmNvbm4uU2V0RGVhZGxpbmUodCkKKwl9IGVsc2UgaWYgcmVhZCB7CisJCXAuY29ubi5TZXRSZWFkRGVhZGxpbmUodCkKKwl9IGVsc2UgaWYgd3JpdGUgeworCQlwLmNvbm4uU2V0V3JpdGVEZWFkbGluZSh0KQorCX0KK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU1NMU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXZhciBlcnIgZXJyb3IKKwkvLyBJZiB3ZSBoYXZlIGEgaG9zdG5hbWUsIHdlIG5lZWQgdG8gcGFzcyB0aGUgaG9zdG5hbWUgdG8gdGxzLkRpYWwgZm9yCisJLy8gY2VydGlmaWNhdGUgaG9zdG5hbWUgY2hlY2tzLgorCWlmIHAuaG9zdFBvcnQgIT0gIiIgeworCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sICJ0Y3AiLCBwLmhvc3RQb3J0LCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCQl9CisJfSBlbHNlIHsKKwkJaWYgcC5Jc09wZW4oKSB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKKwkJfQorCQlpZiBwLmFkZHIgPT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gbmlsIGFkZHJlc3MuIikKKwkJfQorCQlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBuZXR3b3JrIG5hbWUuIikKKwkJfQorCQlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKKwkJfQorCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sIHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkJfQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIG5ldC5Db25uCitmdW5jIChwICpUU1NMU29ja2V0KSBDb25uKCkgbmV0LkNvbm4geworCXJldHVybiBwLmNvbm4KK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4KK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIElzT3BlbigpIGJvb2wgeworCWlmIHAuY29ubiA9PSBuaWwgeworCQlyZXR1cm4gZmFsc2UKKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU1NMU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwkvLyBDbG9zZSB0aGUgc29ja2V0CisJaWYgcC5jb25uICE9IG5pbCB7CisJCWVyciA6PSBwLmNvbm4uQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlwLmNvbm4gPSBuaWwKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZSh0cnVlLCBmYWxzZSkKKwluLCBlcnIgOj0gcC5jb25uLlJlYWQoYnVmKQorCXJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCisJfQorCXAucHVzaERlYWRsaW5lKGZhbHNlLCB0cnVlKQorCXJldHVybiBwLmNvbm4uV3JpdGUoYnVmKQorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiBwLmNvbm4uQ2xvc2UoKQorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjczOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiaW8iCispCisKK3ZhciBlcnJUcmFuc3BvcnRJbnRlcnJ1cHRlZCA9IGVycm9ycy5OZXcoIlRyYW5zcG9ydCBJbnRlcnJ1cHRlZCIpCisKK3R5cGUgRmx1c2hlciBpbnRlcmZhY2UgeworCUZsdXNoKCkgKGVyciBlcnJvcikKK30KKwordHlwZSBDb250ZXh0Rmx1c2hlciBpbnRlcmZhY2UgeworCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCit9CisKK3R5cGUgUmVhZFNpemVQcm92aWRlciBpbnRlcmZhY2UgeworCVJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpCit9CisKKy8vIEVuY2Fwc3VsYXRlcyB0aGUgSS9PIGxheWVyCit0eXBlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHsKKwlpby5SZWFkV3JpdGVDbG9zZXIKKwlDb250ZXh0Rmx1c2hlcgorCVJlYWRTaXplUHJvdmlkZXIKKworCS8vIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb24KKwlPcGVuKCkgZXJyb3IKKworCS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKwlJc09wZW4oKSBib29sCit9CisKK3R5cGUgc3RyaW5nV3JpdGVyIGludGVyZmFjZSB7CisJV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKQorfQorCisvLyBUaGlzIGlzICJlbmNoYW5jZWQiIHRyYW5zcG9ydCB3aXRoIGV4dHJhIGNhcGFiaWxpdGllcy4gWW91IG5lZWQgdG8gdXNlIG9uZSBvZiB0aGVzZQorLy8gdG8gY29uc3RydWN0IHByb3RvY29sLgorLy8gTm90YWJseSwgVFNvY2tldCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZCBpdCBpcyBhbHdheXMgYSBtaXN0YWtlIHRvIHVzZQorLy8gVFNvY2tldCBkaXJlY3RseSBpbiBwcm90b2NvbC4KK3R5cGUgVFJpY2hUcmFuc3BvcnQgaW50ZXJmYWNlIHsKKwlpby5SZWFkV3JpdGVyCisJaW8uQnl0ZVJlYWRlcgorCWlvLkJ5dGVXcml0ZXIKKwlzdHJpbmdXcml0ZXIKKwlDb250ZXh0Rmx1c2hlcgorCVJlYWRTaXplUHJvdmlkZXIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1YjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZXJyb3JzIgorCSJpbyIKKykKKwordHlwZSB0aW1lb3V0YWJsZSBpbnRlcmZhY2UgeworCVRpbWVvdXQoKSBib29sCit9CisKKy8vIFRocmlmdCBUcmFuc3BvcnQgZXhjZXB0aW9uCit0eXBlIFRUcmFuc3BvcnRFeGNlcHRpb24gaW50ZXJmYWNlIHsKKwlURXhjZXB0aW9uCisJVHlwZUlkKCkgaW50CisJRXJyKCkgZXJyb3IKK30KKworY29uc3QgKAorCVVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiA9IDAKKwlOT1RfT1BFTiAgICAgICAgICAgICAgICAgICAgPSAxCisJQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgID0gMgorCVRJTUVEX09VVCAgICAgICAgICAgICAgICAgICA9IDMKKwlFTkRfT0ZfRklMRSAgICAgICAgICAgICAgICAgPSA0CispCisKK3R5cGUgdFRyYW5zcG9ydEV4Y2VwdGlvbiBzdHJ1Y3QgeworCXR5cGVJZCBpbnQKKwllcnIgICAgZXJyb3IKK30KKworZnVuYyAocCAqdFRyYW5zcG9ydEV4Y2VwdGlvbikgVHlwZUlkKCkgaW50IHsKKwlyZXR1cm4gcC50eXBlSWQKK30KKworZnVuYyAocCAqdFRyYW5zcG9ydEV4Y2VwdGlvbikgRXJyb3IoKSBzdHJpbmcgeworCXJldHVybiBwLmVyci5FcnJvcigpCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIEVycigpIGVycm9yIHsKKwlyZXR1cm4gcC5lcnIKK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHQgaW50LCBlIHN0cmluZykgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogdCwgZXJyOiBlcnJvcnMuTmV3KGUpfQorfQorCitmdW5jIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZSBlcnJvcikgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJaWYgZSA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCisJaWYgdCwgb2sgOj0gZS4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIHQKKwl9CisKKwlzd2l0Y2ggdiA6PSBlLih0eXBlKSB7CisJY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOgorCQlyZXR1cm4gdgorCWNhc2UgdGltZW91dGFibGU6CisJCWlmIHYuVGltZW91dCgpIHsKKwkJCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IFRJTUVEX09VVCwgZXJyOiBlfQorCQl9CisJfQorCisJaWYgZSA9PSBpby5FT0YgeworCQlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBFTkRfT0ZfRklMRSwgZXJyOiBlfQorCX0KKworCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgZXJyOiBlfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQzMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uX3Rlc3QuZ28KQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJmbXQiCisJImlvIgorCisJInRlc3RpbmciCispCisKK3R5cGUgdGltZW91dCBzdHJ1Y3R7IHRpbWVkb3V0IGJvb2wgfQorCitmdW5jICh0ICp0aW1lb3V0KSBUaW1lb3V0KCkgYm9vbCB7CisJcmV0dXJuIHQudGltZWRvdXQKK30KKworZnVuYyAodCAqdGltZW91dCkgRXJyb3IoKSBzdHJpbmcgeworCXJldHVybiBmbXQuU3ByaW50ZigiVGltZW91dDogJXYiLCB0LnRpbWVkb3V0KQorfQorCitmdW5jIFRlc3RURXhjZXB0aW9uVGltZW91dCh0ICp0ZXN0aW5nLlQpIHsKKwl0aW1lb3V0IDo9ICZ0aW1lb3V0e3RydWV9CisJZXhjZXB0aW9uIDo9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IodGltZW91dCkKKwlpZiB0aW1lb3V0LkVycm9yKCkgIT0gZXhjZXB0aW9uLkVycm9yKCkgeworCQl0LkZhdGFsZigiRXJyb3IgZGlkIG5vdCBtYXRjaDogZXhwZWN0ZWQgJXEsIGdvdCAlcSIsIHRpbWVvdXQuRXJyb3IoKSwgZXhjZXB0aW9uLkVycm9yKCkpCisJfQorCisJaWYgZXhjZXB0aW9uLlR5cGVJZCgpICE9IFRJTUVEX09VVCB7CisJCXQuRmF0YWxmKCJUeXBlSWQgd2FzIG5vdCBUSU1FRF9PVVQ6IGV4cGVjdGVkICV2LCBnb3QgJXYiLCBUSU1FRF9PVVQsIGV4Y2VwdGlvbi5UeXBlSWQoKSkKKwl9Cit9CisKK2Z1bmMgVGVzdFRFeGNlcHRpb25FT0YodCAqdGVzdGluZy5UKSB7CisJZXhjZXB0aW9uIDo9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoaW8uRU9GKQorCWlmIGlvLkVPRi5FcnJvcigpICE9IGV4Y2VwdGlvbi5FcnJvcigpIHsKKwkJdC5GYXRhbGYoIkVycm9yIGRpZCBub3QgbWF0Y2g6IGV4cGVjdGVkICVxLCBnb3QgJXEiLCBpby5FT0YuRXJyb3IoKSwgZXhjZXB0aW9uLkVycm9yKCkpCisJfQorCisJaWYgZXhjZXB0aW9uLlR5cGVJZCgpICE9IEVORF9PRl9GSUxFIHsKKwkJdC5GYXRhbGYoIlR5cGVJZCB3YXMgbm90IEVORF9PRl9GSUxFOiBleHBlY3RlZCAldiwgZ290ICV2IiwgRU5EX09GX0ZJTEUsIGV4Y2VwdGlvbi5UeXBlSWQoKSkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA1ODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbwpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisvLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKy8vIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKK3R5cGUgVFRyYW5zcG9ydEZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKQorfQorCit0eXBlIHRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKKy8vIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgorZnVuYyAocCAqdFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gdHJhbnMsIG5pbAorfQorCitmdW5jIE5ld1RUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmdFRyYW5zcG9ydEZhY3Rvcnl7fQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyNzgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiaW8iCisJIm5ldCIKKwkic3RyY29udiIKKwkidGVzdGluZyIKKykKKworY29uc3QgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgPSA0MDk2CisKK3ZhciAoCisJdHJhbnNwb3J0X2JkYXRhICBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKKwl0cmFuc3BvcnRfaGVhZGVyIG1hcFtzdHJpbmddc3RyaW5nCispCisKK2Z1bmMgaW5pdCgpIHsKKwl0cmFuc3BvcnRfYmRhdGEgPSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJZm9yIGkgOj0gMDsgaSA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFOyBpKysgeworCQl0cmFuc3BvcnRfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKKwl9CisJdHJhbnNwb3J0X2hlYWRlciA9IG1hcFtzdHJpbmddc3RyaW5neyJrZXkiOiAiVXNlci1BZ2VudCIsCisJCSJ2YWx1ZSI6ICJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8zMi4wLjE2NjcuMCBTYWZhcmkvNTM3LjM2In0KK30KKworZnVuYyBUcmFuc3BvcnRUZXN0KHQgKnRlc3RpbmcuVCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0LCByZWFkVHJhbnMgVFRyYW5zcG9ydCkgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJaWYgIXdyaXRlVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHdyaXRlVHJhbnMsIHdyaXRlVHJhbnMpCisJfQorCWlmICFyZWFkVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHJlYWRUcmFucywgcmVhZFRyYW5zKQorCX0KKwlfLCBlcnIgOj0gd3JpdGVUcmFucy5Xcml0ZSh0cmFuc3BvcnRfYmRhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQorCX0KKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBvZiBiaW5hcnkgZGF0YTogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJfQorCW4sIGVyciA6PSBpby5SZWFkRnVsbChyZWFkVHJhbnMsIGJ1ZikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgcmVhZFRyYW5zLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSwgZXJyKQorCX0KKwlpZiBuICE9IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSIsIHJlYWRUcmFucywgbiwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIGJ1ZiB7CisJCWlmIHYgIT0gdHJhbnNwb3J0X2JkYXRhW2tdIHsKKwkJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgcmVhZCAlZCBpbnN0ZWFkIG9mICVkIGZvciBpbmRleCAlZCBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCB2LCB0cmFuc3BvcnRfYmRhdGFba10sIGspCisJCX0KKwl9CisJXywgZXJyID0gd3JpdGVUcmFucy5Xcml0ZSh0cmFuc3BvcnRfYmRhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIDIgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCisJfQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIGJpbmFyeSBkYXRhIDI6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwlidWYgPSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJcmVhZCA6PSAxCisJZm9yIG4gPSAwOyBuIDwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgJiYgcmVhZCAhPSAwOyB7CisJCXJlYWQsIGVyciA9IHJlYWRUcmFucy5SZWFkKGJ1ZltuOl0pCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBiaW5hcnkgZGF0YSAyIG9mIHRvdGFsIGxlbmd0aCAlZCBmcm9tIG9mZnNldCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBuLCBlcnIpCisJCX0KKwkJbiArPSByZWFkCisJfQorCWlmIG4gIT0gVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIHJlYWQgb25seSAlZCBpbnN0ZWFkIG9mICVkIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIG4sIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBidWYgeworCQlpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7CisJCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQorCQl9CisJfQorfQorCitmdW5jIFRyYW5zcG9ydEhlYWRlclRlc3QodCAqdGVzdGluZy5ULCB3cml0ZVRyYW5zIFRUcmFuc3BvcnQsIHJlYWRUcmFucyBUVHJhbnNwb3J0KSB7CisJYnVmIDo9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwlpZiAhd3JpdGVUcmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgbm90IG9wZW46ICVzIiwgd3JpdGVUcmFucywgd3JpdGVUcmFucykKKwl9CisJaWYgIXJlYWRUcmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgbm90IG9wZW46ICVzIiwgcmVhZFRyYW5zLCByZWFkVHJhbnMpCisJfQorCS8vIE5lZWQgdG8gYXNzZXJ0IHR5cGUgb2YgVFRyYW5zcG9ydCB0byBUSHR0cENsaWVudCB0byBleHBvc2UgdGhlIFNldHRlcgorCWh0dHBXUG9zdFRyYW5zIDo9IHdyaXRlVHJhbnMuKCpUSHR0cENsaWVudCkKKwlodHRwV1Bvc3RUcmFucy5TZXRIZWFkZXIodHJhbnNwb3J0X2hlYWRlclsia2V5Il0sIHRyYW5zcG9ydF9oZWFkZXJbInZhbHVlIl0pCisKKwlfLCBlcnIgOj0gd3JpdGVUcmFucy5Xcml0ZSh0cmFuc3BvcnRfYmRhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQorCX0KKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBvZiBiaW5hcnkgZGF0YTogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJfQorCS8vIE5lZWQgdG8gYXNzZXJ0IHR5cGUgb2YgVFRyYW5zcG9ydCB0byBUSHR0cENsaWVudCB0byBleHBvc2UgdGhlIEdldHRlcgorCWh0dHBSUG9zdFRyYW5zIDo9IHJlYWRUcmFucy4oKlRIdHRwQ2xpZW50KQorCXJlYWRIZWFkZXIgOj0gaHR0cFJQb3N0VHJhbnMuR2V0SGVhZGVyKHRyYW5zcG9ydF9oZWFkZXJbImtleSJdKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIEhUVFAgSGVhZGVyIFZhbHVlIiwgaHR0cFJQb3N0VHJhbnMpCisJfQorCisJaWYgdHJhbnNwb3J0X2hlYWRlclsidmFsdWUiXSAhPSByZWFkSGVhZGVyIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGVkIEhUVFAgSGVhZGVyIFZhbHVlICVzLCBnb3QgJXMiLCB0cmFuc3BvcnRfaGVhZGVyWyJ2YWx1ZSJdLCByZWFkSGVhZGVyKQorCX0KKwluLCBlcnIgOj0gaW8uUmVhZEZ1bGwocmVhZFRyYW5zLCBidWYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIGVycikKKwl9CisJaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgcmVhZCBvbmx5ICVkIGluc3RlYWQgb2YgJWQgYnl0ZXMgb2YgYmluYXJ5IGRhdGEiLCByZWFkVHJhbnMsIG4sIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBidWYgeworCQlpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7CisJCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQorCQl9CisJfQorfQorCitmdW5jIENsb3NlVHJhbnNwb3J0cyh0ICp0ZXN0aW5nLlQsIHJlYWRUcmFucyBUVHJhbnNwb3J0LCB3cml0ZVRyYW5zIFRUcmFuc3BvcnQpIHsKKwllcnIgOj0gcmVhZFRyYW5zLkNsb3NlKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2UgcmVhZCB0cmFuc3BvcnQ6ICVzIiwgcmVhZFRyYW5zLCBlcnIpCisJfQorCWlmIHdyaXRlVHJhbnMgIT0gcmVhZFRyYW5zIHsKKwkJZXJyID0gd3JpdGVUcmFucy5DbG9zZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2Ugd3JpdGUgdHJhbnNwb3J0OiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwkJfQorCX0KK30KKworZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydChzdGFydFBvcnQgaW50KSAobmV0LkFkZHIsIGVycm9yKSB7CisJZm9yIGkgOj0gc3RhcnRQb3J0OyBpIDwgNjU1MzU7IGkrKyB7CisJCXMgOj0gIjEyNy4wLjAuMToiICsgc3RyY29udi5JdG9hKGkpCisJCWwsIGVyciA6PSBuZXQuTGlzdGVuKCJ0Y3AiLCBzKQorCQlpZiBlcnIgPT0gbmlsIHsKKwkJCWwuQ2xvc2UoKQorCQkJcmV0dXJuIG5ldC5SZXNvbHZlVENQQWRkcigidGNwIiwgcykKKwkJfQorCX0KKwlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIkNvdWxkIG5vdCBmaW5kIGF2YWlsYWJsZSBzZXJ2ZXIgcG9ydCIpCit9CisKK2Z1bmMgdmFsdWVJblNsaWNlKHZhbHVlIHN0cmluZywgc2xpY2UgW11zdHJpbmcpIGJvb2wgeworCWZvciBfLCB2IDo9IHJhbmdlIHNsaWNlIHsKKwkJaWYgdmFsdWUgPT0gdiB7CisJCQlyZXR1cm4gdHJ1ZQorCQl9CisJfQorCXJldHVybiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90eXBlLmdvIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBUeXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sCit0eXBlIFRUeXBlIGJ5dGUKKworY29uc3QgKAorCVNUT1AgICA9IDAKKwlWT0lEICAgPSAxCisJQk9PTCAgID0gMgorCUJZVEUgICA9IDMKKwlJMDggICAgPSAzCisJRE9VQkxFID0gNAorCUkxNiAgICA9IDYKKwlJMzIgICAgPSA4CisJSTY0ICAgID0gMTAKKwlTVFJJTkcgPSAxMQorCVVURjcgICA9IDExCisJU1RSVUNUID0gMTIKKwlNQVAgICAgPSAxMworCVNFVCAgICA9IDE0CisJTElTVCAgID0gMTUKKwlVVEY4ICAgPSAxNgorCVVURjE2ICA9IDE3CisJLy9CSU5BUlkgPSAxOCAgIHdyb25nIGFuZCB1bnVzdWVkCispCisKK3ZhciB0eXBlTmFtZXMgPSBtYXBbaW50XXN0cmluZ3sKKwlTVE9QOiAgICJTVE9QIiwKKwlWT0lEOiAgICJWT0lEIiwKKwlCT09MOiAgICJCT09MIiwKKwlCWVRFOiAgICJCWVRFIiwKKwlET1VCTEU6ICJET1VCTEUiLAorCUkxNjogICAgIkkxNiIsCisJSTMyOiAgICAiSTMyIiwKKwlJNjQ6ICAgICJJNjQiLAorCVNUUklORzogIlNUUklORyIsCisJU1RSVUNUOiAiU1RSVUNUIiwKKwlNQVA6ICAgICJNQVAiLAorCVNFVDogICAgIlNFVCIsCisJTElTVDogICAiTElTVCIsCisJVVRGODogICAiVVRGOCIsCisJVVRGMTY6ICAiVVRGMTYiLAorfQorCitmdW5jIChwIFRUeXBlKSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHMsIG9rIDo9IHR5cGVOYW1lc1tpbnQocCldOyBvayB7CisJCXJldHVybiBzCisJfQorCXJldHVybiAiVW5rbm93biIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDQyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTMyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29tcHJlc3MvemxpYiIKKwkiY29udGV4dCIKKwkiaW8iCisJImxvZyIKKykKKworLy8gVFpsaWJUcmFuc3BvcnRGYWN0b3J5IGlzIGEgZmFjdG9yeSBmb3IgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2VzCit0eXBlIFRabGliVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWxldmVsICAgaW50CisJZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorfQorCisvLyBUWmxpYlRyYW5zcG9ydCBpcyBhIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCBtYWtlcyB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbi4KK3R5cGUgVFpsaWJUcmFuc3BvcnQgc3RydWN0IHsKKwlyZWFkZXIgICAgaW8uUmVhZENsb3NlcgorCXRyYW5zcG9ydCBUVHJhbnNwb3J0CisJd3JpdGVyICAgICp6bGliLldyaXRlcgorfQorCisvLyBHZXRUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydAorZnVuYyAocCAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5mYWN0b3J5ICE9IG5pbCB7CisJCS8vIHdyYXAgb3RoZXIgZmFjdG9yeQorCQl2YXIgZXJyIGVycm9yCisJCXRyYW5zLCBlcnIgPSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCXJldHVybiBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgcC5sZXZlbCkKK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeShsZXZlbCBpbnQpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogbmlsfQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydEZhY3RvcnkKKy8vIGFzIGEgd3JhcHBlciBvdmVyIGV4aXN0aW5nIHRyYW5zcG9ydCBmYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KGxldmVsIGludCwgZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsLCBmYWN0b3J5OiBmYWN0b3J5fQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRabGliVHJhbnNwb3J0CitmdW5jIE5ld1RabGliVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGxldmVsIGludCkgKCpUWmxpYlRyYW5zcG9ydCwgZXJyb3IpIHsKKwl3LCBlcnIgOj0gemxpYi5OZXdXcml0ZXJMZXZlbCh0cmFucywgbGV2ZWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5QcmludGxuKGVycikKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydHsKKwkJd3JpdGVyOiAgICB3LAorCQl0cmFuc3BvcnQ6IHRyYW5zLAorCX0sIG5pbAorfQorCisvLyBDbG9zZSBjbG9zZXMgdGhlIHJlYWRlciBhbmQgd3JpdGVyIChmbHVzaGluZyBhbnkgdW53cml0dGVuIGRhdGEpIGFuZCBjbG9zZXMKKy8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiB6LnJlYWRlciAhPSBuaWwgeworCQlpZiBlcnIgOj0gei5yZWFkZXIuQ2xvc2UoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IHoud3JpdGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5DbG9zZSgpCit9CisKKy8vIEZsdXNoIGZsdXNoZXMgdGhlIHdyaXRlciBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlpZiBlcnIgOj0gei53cml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcmV0dXJuIHoudHJhbnNwb3J0LkZsdXNoKGN0eCkKK30KKworLy8gSXNPcGVuIHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworLy8gT3BlbiBvcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgT3BlbigpIGVycm9yIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuT3BlbigpCit9CisKK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZWFkKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmIHoucmVhZGVyID09IG5pbCB7CisJCXIsIGVyciA6PSB6bGliLk5ld1JlYWRlcih6LnRyYW5zcG9ydCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwkJei5yZWFkZXIgPSByCisJfQorCisJcmV0dXJuIHoucmVhZGVyLlJlYWQocCkKK30KKworLy8gUmVtYWluaW5nQnl0ZXMgcmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YSB0aGF0IGlzIHN0aWxsIHRvIGJlCisvLyByZWFkLgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgdWludDY0IHsKKwlyZXR1cm4gei50cmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgV3JpdGUocCBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHoud3JpdGVyLldyaXRlKHApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZjExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFpsaWJUcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMsIGVyciA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIHpsaWIuQmVzdENvbXByZXNzaW9uKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK3R5cGUgRHVtbXlUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKkR1bW15VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyKCksIG5pbAorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoCisJCXpsaWIuQmVzdENvbXByZXNzaW9uLAorCQkmRHVtbXlUcmFuc3BvcnRGYWN0b3J5e30sCisJKQorCWJ1ZmZlciA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwl0cmFucywgZXJyIDo9IGZhY3RvcnkuR2V0VHJhbnNwb3J0KGJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhvdXRGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24sIG5pbCkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL1JFQURNRS5tZCBiL2xpYi9oYXhlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRiNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTY0IEBACitUaHJpZnQgSGF4ZSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIEhheGUKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitIYXhlIHNldHVwCistLS0tLS0tLS0tLS0tLS0KKworVGhyaWZ0IHJlcXVpcmVzIEhheGUgMy4xLjMuIEluc3RhbGxlcnMgZm9yIFdpbmRvd3MgYW5kIE9TWAorcGxhdGZvcm1zIGFyZSBhdmFpbGFibGUgYXQgYGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZGAuIAorCitEZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgdGFyZ2V0cywgeW91IG1heSBoYXZlIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlIEhheGVMaWJzIAorYWZ0ZXIgaW5zdGFsbGluZyBIYXhlIGl0c2VsZi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwbGFuIHRvIHRhcmdldCBDIywgSmF2YSBhbmQgQysrLAorZW50ZXIgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhZnRlciBpbnN0YWxsaW5nIEhheGU6CisKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKyAgICBoYXhlbGliIGluc3RhbGwgaHhqYXZhCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3MKKworRm9yIG90aGVyIHRhcmdldHMsIHBsZWFzZSBjb25zdWx0IHRoZSBIYXhlIGRvY3VtZW50YXRpb24gd2hldGhlciBvciBub3QgYW55IGFkZGl0aW9uYWwKK3RhcmdldCBsaWJyYXJpZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQgYW5kIGhvdyB0byBhY2hpZXZlIHRoaXMuCisKKworSGF4ZSBvbiBMaW51eCAKKy0tLS0tLS0tLS0tLS0tLQorCitGb3IgTGludXggcGxhdGZvcm1zIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGlzdHJvLXNwZWNpZmljIHBhY2thZ2UKK21hbmFnZXIsIHdoZXJlIHBvc3NpYmxlLiBNb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCB0aGUgCitIYXhlIExpbnV4IGRvd25sb2FkIHNlY3Rpb246IGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZC9saW51eAorCitJZiB5b3UgcnVuIGludG8gdGhlIGVycm9yIG1lc3NhZ2UgCisKKyAgICBVbmNhdWdodCBleGNlcHRpb24gLSBsb2FkLmMoMjM3KSA6IEZhaWxlZCB0byBsb2FkIGxpYnJhcnkgOiAvdXNyL2xpYi9uZWtvL3JlZ2V4cC5uZGxsICAKKwkobGlicGNyZS5zby4zOiBjYW5ub3Qgb3BlbiBzaGFyZWQgb2JqZWN0IGZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisKK3RoaXMgY2FuIGJlIHNvbHZlZCBkZXBlbmRpbmcgb24geW91ciBPU2VzIGJpdG5lc3MgYnkgZWl0aGVyCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYi9saWJwY3JlLnNvLjEgL3Vzci9saWIvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCQorb3IKKworICAgIHN1ZG8gbG4gLXNmIC91c3IvbGliNjQvbGlicGNyZS5zby4xIC91c3IvbGliNjQvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCitUaHJpZnQgSGF4ZSBiaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCQorVGhyaWZ0IEhheGUgYmluZGluZ3MgY2FuIGJlIHNldCB1cCB2aWEgdGhlIGBoYXhlbGliYCB0b29sICAKK2VpdGhlciBmcm9tIHRoZSBvZmZpY2lhbCBBU0YgcmVwbywgb3IgdmlhIHRoZSBnaXRodWIgbWlycm9yLgorCistIFRvIHNldCB1cCBhbnkgKipzdGFibGUgdmVyc2lvbioqLCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCAoZS5nLiBgMS4wLjBgLCBldGMuKToKKworICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCAxLjAuMCBsaWIvaGF4ZWAKKworLSBUbyBzZXQgdXAgdGhlIGN1cnJlbnQgKipkZXZlbG9wbWVudCB2ZXJzaW9uKiosIHVzZSB0aGUgYG1hc3RlcmAgYnJhbmNoOgorICAKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IG1hc3RlciBsaWIvaGF4ZWAJCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCisKK0FzIHVzdWFsLCB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgY2FuIGJlIHVwZGF0ZWQgdXNpbmcgYGhheGVsaWIgdXBncmFkZWAgCitvciBgaGF4ZWxpYiB1cGRhdGUgdGhyaWZ0YC4KKworSW4gb3JkZXIgdG8gd29yayB3aXRoIFRocmlmdCwgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgCitvciBidWlsZCBmcm9tIHNvdXJjZSwgZGVwZW5kaW5nIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gQXBwcm9wcmlhdGUgCitkb3dubG9hZHMgYW5kIG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCQorVG8gZ2V0IHN0YXJ0ZWQsIHZpc2l0IHRoZSAvdHV0b3JpYWwvaGF4ZSBhbmQgL3Rlc3QvaGF4ZSBkaXJzIGZvciBleGFtcGxlcy4gCitJZiB5b3UgYXJlIHVzaW5nIEhJREUgb3IgdGhlIEZsYXNoRGV2ZWxvcCBJREUsIHlvdSdsbCBmaW5kIGFwcHJvcHJpYXRlIAorcHJvamVjdCBmaWxlcyBpbiB0aGVzZSBmb2xkZXJzLgorCisKK0N1cnJlbnQgc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0gdGVzdGVkIHdpdGggSGF4ZSBDKysgdGFyZ2V0CistIHRlc3RlZCB3aXRoIEhheGUgUEhQIHRhcmdldCAoY29uc29sZS93ZWIgc2VydmVyLCBiaW5hcnkgcHJvdG9jb2xzKQorLSB0cmFuc3BvcnRzOiBTb2NrZXQsIEhUVFAgKHNlcnZlcnMgcnVuIGluc2lkZSBQSFAgc2VydmVyL1BIUCB0YXJnZXQgb25seSksIFN0cmVhbQorLSBwcm90b2NvbHM6IEJpbmFyeSwgSlNPTiwgTXVsdGlwbGV4LCBDb21wYWN0CistIHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZQorLSBjcm9zcy10ZXN0IGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZSAKKworCitGdXJ0aGVyIGRldmVsb3BtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09CistIGltcHJvdmUgdG8gd29yayB3aXRoIEMjLCBKYXZhIGFuZCBKYXZhU2NyaXB0IEhheGUvT3BlbkZMIHRhcmdldHMKKy0gaW1wcm92ZSB0byB3b3JrIHdpdGggbW9yZSAoaWRlYWxseSBhbGwpIEhheGUvT3BlbkZMIHRhcmdldHMKKy0gYWRkIEhUVFAgc2VydmVyLCB1cGRhdGUgdHV0b3JpYWwgYW5kIHRlc3RzIGFjY29yZGluZ2x5CisKKworS25vd24gcmVzdHJpY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworQWx0aG91Z2ggZGVzaWduZWQgd2l0aCBtYXhpbXVtIHBvcnRhYmlsaXR5IGluIG1pbmQsIGZvciB0ZWNobmljYWwgcmVhc29ucyBzb21lIHBsYXRmb3JtcworbWF5IG9ubHkgc3VwcG9ydCBwYXJ0cyBvZiB0aGUgbGlicmFyeSwgb3Igbm90IGJlIGNvbXBhdGlibGUgYXQgYWxsLgorCitKYXZhc2NyaXB0OgorLSB0dXRvcmlhbCBmYWlscyB0byBidWlsZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIFN5cy5hcmdzCisKK1BIUCBIVFRQIFNlcnZlciBub3RlcworPT09PT09PT09PT09PT09PT09PT09PT09CisKKy0geW91IGhhdmUgdG8gaW1wb3J0IFBIUCBmaWxlcyBnZW5lcmF0ZWQgYnkgaGF4ZSBpbnRvIFBIUAorYGBgcGhwCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworYGBgCisKKy0gdHJhY2UoKSBieSBkZWZhdWx0IG91dHB1dHMgaW50byBzdGRvdXQgKGh0dHAgcmVzcG9uc2UpLCBzbyB5b3UgaGF2ZSB0byByZWRpcmVjdCBpdCB0byBzdGRlcnIgb3IgeW91IG93biBsb2dzLCBzb21ldGhpbmcgbGlrZQorYGBgaGF4ZQorLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKK2hheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykgCit7IAorCS8vc2ltdWxhdGUgbm9ybWFsIHRyYWNlIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2Jsb2IvZGV2ZWxvcG1lbnQvc3RkL2hheGUvTG9nLmh4CisJdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKwlpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKwkJdmFyIGV4dHJhOlN0cmluZyA9ICIiOworCQlmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKwkJCWV4dHJhICs9ICIsIiArIHY7CisJCW5ld1ZhbHVlID0gdiArIGV4dHJhOworCX0KKwllbHNlIHsKKwkJbmV3VmFsdWUgPSB2OworCX0KKwl2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKwlTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKK30KK2BgYAorCistIHRvIGFsbG93IHRocmlmdCBzZXJ2ZXIgdG8gcmVhZC93cml0ZSBIVFRQIHJlcXVlc3QvcmVzcG9uc2UsIGl0IHNob3VsZCBiZSBwb2ludGVkIG91dCB0byBwaHAgc3RyZWFtcworYGBgaGF4ZQordHJhbnNwb3J0ID0JbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKwkJCQluZXcgVFN0cmVhbVRyYW5zcG9ydCgKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorCQkJCQluZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKwkJCQkJKQorCQkJCSk7CitgYGAKKworLSBUU2ltcGxlU2VydmVyIGRvZXNuJ3Qgc3RvcCBhZnRlciBmaXJzdCBjYWxsLCBzbyBwcm9jZXNzb3IucHJvY2VzcygpIHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCwgb3IgdXNlIHJ1bk9uY2UgcHJvcGVydHkgCitgYGBoYXhlCit2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKK3NlcnZlci5ydW5PbmNlID0gdHJ1ZTsKK2BgYAorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL2hheGVsaWIuanNvbiBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJhZDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvaGF4ZWxpYi5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKwkibmFtZSI6ICJ0aHJpZnQiLAorCSJ1cmwiIDogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisJImxpY2Vuc2UiOiAiQXBhY2hlIiwKKwkidGFncyI6IFsidGhyaWZ0IiwgInJwYyIsICJzZXJpYWxpemF0aW9uIiwgImNyb3NzIiwgImZyYW1ld29yayJdLAorCSJkZXNjcmlwdGlvbiI6ICJIYXhlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgYW5kIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrIiwKKwkidmVyc2lvbiI6ICIxLjAuMCIsCisJInJlbGVhc2Vub3RlIjogIkxpY2Vuc2VkIHVuZGVyIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gVGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkuIiwKKwkiY29udHJpYnV0b3JzIjogWyJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSJdLAorCSJkZXBlbmRlbmNpZXMiOiB7IH0sCisJImNsYXNzUGF0aCI6ICJzcmMiCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9BYnN0cmFjdE1ldGhvZEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjgxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiBmbGFzaAoraW1wb3J0IGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I7CisjZWxzZQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisjZW5kCisKK2NsYXNzIEFic3RyYWN0TWV0aG9kRXJyb3IKKyNpZiBmbGFzaAorZXh0ZW5kcyBJbGxlZ2FsT3BlcmF0aW9uRXJyb3IKKyNlbHNlCitleHRlbmRzIFRFeGNlcHRpb24KKyNlbmQKK3sKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWVzc2FnZSA6IFN0cmluZz0iIikgeworICAgICAgICAgIHN1cGVyKCJBdHRlbXB0IHRvIGNhbGwgYW4gYWJzdHJhY3QgbWV0aG9kIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bcmd1bWVudEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiAhIGZsYXNoCisvLyBwcmVkZWZpbmVkIGZvciBmbGFzaCBvbmx5CitjbGFzcyBBcmd1bWVudEVycm9yIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIikgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KK30KKyNlbmQKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9MaW1pdHMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgTGltaXRzIHsKKworICAgIC8vIEhheGUgbGltaXRzIGFyZSBub3QgZml4ZWQgdmFsdWVzLCB0aGV5IGRlcGVuZCBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtCisgICAgLy8gRm9yIGV4YW1wbGUsIG5la28gbGltaXRzIGFuIGludCB0byAzMSBiaXRzIGluc3RlYWQgb2YgMzIuIFNvIHdlIGRldGVjdAorICAgIC8vIHRoZSB2YWx1ZXMgb25jZSBkdXJpbmcgaW50aWFsaXNhdGlvbiBpbiBvcmRlciB0bworICAgIC8vIChhKSBnZXQgdGhlIHJpZ2h0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgIHBsYXRmb3JtLCBhbmQKKyAgICAvLyAoYikgcHJldmVudCB1cyBmcm9tIGRlcGVuZGVjaWVzIHRvIGEgYnVuY2ggb2YgZGVmaW5lcworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSTMyX01BWCA9IHsKKyAgICAgICAgdmFyIGxhc3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgbmV4dCA6IEludCA9IDA7CisgICAgICAgIGZvcihiaXQgaW4gMCAuLi4gMzIpIHsKKyAgICAgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IGxhc3QgfCAoMSA8PCBiaXQpOworICAgICAgICAgICAgaWYobmV4dCA8IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXN0OyAvLyBmaW5hbCB2YWx1ZQorICAgIH0KKworICAgIC8vIGFkZCB3aGF0ZXZlciB5b3UgbmVlZAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTg0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworICAvKioKKyAgICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCisgICAqLworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QgPSB7IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsgfTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgTUVTU0FHRV9GSUVMRCA9IHsgbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgMSk7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRZUEVfRklFTEQgPSB7IG5ldyBURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIDIpOyB9OworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV05fTUVUSE9EIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9NRVNTQUdFX1RZUEUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBXUk9OR19NRVRIT0RfTkFNRSA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJBRF9TRVFVRU5DRV9JRCA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JU1NJTkdfUkVTVUxUIDogSW50ID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5URVJOQUxfRVJST1IgOiBJbnQgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9FUlJPUiA6IEludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfVFJBTlNGT1JNIDogSW50ID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9QUk9UT0NPTCA6IEludCA9IDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIDogSW50ID0gMTA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHR5cGUgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHZhciBmaWVsZDpURmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgdmFyIG1lc3NhZ2UgOiBTdHJpbmcgPSBudWxsOworICAgICAgdmFyIHR5cGUgOiBJbnQgPSBVTktOT1dOOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CisgICAgICAgIGlmIChlcnJvck1zZyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGVycm9yTXNnKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRZUEVfRklFTEQpOworICAgICAgICBvcHJvdC53cml0ZUkzMihlcnJvcklEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTBiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuaHgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvLyBNYWtlIHN1cmUgd2UgdXNlIGF0IGxlYXN0IDMuMS4zCisvLyBTb21lIExpbnV4IHBsYXRmb3JtcyBoYXZlIHdhYWFheSB0b28gb2xkIHBhY2thZ2VzIGluIHRoZWlyIHJlcG9zCisvLyBQcm8gVGlwOiBMb29rIGF0IGh0dHA6Ly9vcGVuZmwuY29tIGZvciBhIGdvb2QgTGludXggaW5zdGFsbCBzY3JpcHQKKyNpZiggaGF4ZV92ZXIgPCAzLjEwMykKKyNlcnJvciBIYXhlIDMuMS4zIG9yIG5ld2VyIHJlcXVpcmVkLCBzb3JyeSEKKyNlbmQKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworICAvKioKKyAgICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgorICAgKgorICAgKi8KK2ludGVyZmFjZSBUQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgICAqCisgICAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gaXNTZXQoZmllbGRJZCA6IEludCkgOiBCb29sOworCisgICAgLyoqCisgICAgICogR2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50KSA6IER5bmFtaWM7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGlkLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGRJZCBUaGUgZmllbGQncyBpZCB0YWcgYXMgZm91bmQgaW4gdGhlIElETC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSWQgOiBJbnQsIHZhbHVlIDogRHluYW1pYykgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZhMWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitjbGFzcyBURXhjZXB0aW9uIHsKKworICAgIEA6aXNWYXIKKyAgICBwdWJsaWMgdmFyIGVycm9ySUQoZGVmYXVsdCxudWxsKSA6IEludDsKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvck1zZyhkZWZhdWx0LG51bGwpIDogU3RyaW5nOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1zZyA6IFN0cmluZyA9ICIiLCBpZCA6IEludCA9IDApIHsKKyAgICAgICAgZXJyb3JJRCA9IGlkOworICAgICAgICBlcnJvck1zZyA9IG1zZzsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEZpZWxkUmVxdWlyZW1lbnRUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlhMmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyAgLyoqCisgICAqIFJlcXVpcmVtZW50IHR5cGUgY29uc3RhbnRzLgorICAgKgorICAgKi8KK0A6ZW51bQorYWJzdHJhY3QgVEZpZWxkUmVxdWlyZW1lbnRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVFVSVJFRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE9QVElPTkFMIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVCAgOiBJbnQgPSAzOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I2ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorICovCitpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgICAgZnVuY3Rpb24gcHJvY2VzcyhpbnB1dDpUUHJvdG9jb2wsIG91dHB1dDpUUHJvdG9jb2wpIDogQm9vbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9CaXRDb252ZXJ0ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwYWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4CkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKK2NsYXNzIEJpdENvbnZlcnRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERvdWJsZVRvSW50NjRCaXRzKCBkYiA6IEZsb2F0KSA6IEludDY0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkRG91YmxlKCBkYik7CisgICAgICAgIHJldHVybiBieXRlc1RvTG9uZyggYnVmLmdldEJ5dGVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0IDogSW50NjQpIDogRmxvYXQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGQoIGZpeGVkTG9uZ1RvQnl0ZXMoIGk2NCkpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCkuZ2V0RG91YmxlKDApOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgKiB1bnRpbCBvZmYrNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpeGVkTG9uZ1RvQnl0ZXMoIG4gOiBJbnQ2NCkgIDogQnl0ZXMgeworICAgICAgICB2YXIgYnVmID0gQnl0ZXMuYWxsb2MoOCk7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAxLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMjQpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA0LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNDgpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA3LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDgpLCAgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDMyKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDU2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgI2VuZAorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICogeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5dGVzVG9Mb25nKCBieXRlcyA6IEJ5dGVzKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLCAwKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDcpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg2KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNSkpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDQpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgzKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDEpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgwKSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdEJUTCggdGVzdCA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmIDogQnl0ZXMgPSBmaXhlZExvbmdUb0J5dGVzKCB0ZXN0KTsKKyAgICAgICAgdmFyIGVyZyA9IGJ5dGVzVG9Mb25nKGJ1Zik7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggZXJnLCB0ZXN0KSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5ieXRlc1RvTG9uZ1Rlc3QoJHRlc3QpIGZhaWxlZDogJGVyZyc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdFBhaXIoIGEgOiBGbG9hdCwgYiA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnggPSBEb3VibGVUb0ludDY0Qml0cyhhKTsKKyAgICAgICAgaWYgKCBJbnQ2NC5jb21wYXJlKCBieCwgYikgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuVGVzdFBhaXI6IERvdWJsZVRvSW50NjRCaXRzKCRhKTogZXhwZWN0ZWQgJGIsIGdvdCAkYngnOworICAgICAgICB2YXIgYXggPSBJbnQ2NEJpdHNUb0RvdWJsZShiKTsKKyAgICAgICAgaWYoIGF4ICE9IGEpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBJbnQ2NEJpdHNUb0RvdWJsZSgkYjogZXhwZWN0ZWQgJGEsIGdvdCAgJGF4JzsKKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgZGVidWcKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFVuaXRUZXN0KCkgOiBWb2lkIHsKKworICAgICAgICAvLyBieXRlc1RvTG9uZygpCisgICAgICAgIHZhciBpIDogSW50OworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDAsMCkpOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIDYyKSB7CisgICAgICAgICAgICBUZXN0QlRMKCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgICB9CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwweEZGRkZGRkZGKSk7CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoY2FzdCgweDgwMDAwMDAwLEludCksMHgwMDAwMDAwMCkpOworCisgICAgICAgIC8vIERvdWJsZVRvSW50NjRCaXRzOworICAgICAgICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjUwMDAwMDAwMDAwMDAwMDBFKzAwMSwgIEludDY0Lm1ha2UoY2FzdCgweDQwMkUwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuNTUwMDAwMDAwMDAwMDAwMEUrMDAyLCAgSW50NjQubWFrZShjYXN0KDB4NDA2RkUwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NC5tYWtlKGNhc3QoMHg0MUVGRkZGRixJbnQpLGNhc3QoMHhGRkUwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAzLjkwNjI1MDAwMDAwMDAwMDBFLTAwMywgIEludDY0Lm1ha2UoY2FzdCgweDNGNzAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuMzI4MzA2NDM2NTM4Njk2M0UtMDEwLCAgSW50NjQubWFrZShjYXN0KDB4M0RGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMUFBNzRGRSxJbnQpLGNhc3QoMHgxQzFFN0U0NSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1MDBFLTE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDIwRDAyQTM2LEludCksY2FzdCgweDU4NkRCNEJCLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2NUUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZDLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMTUwLCAgSW50NjQubWFrZShjYXN0KDB4NUYxODIzNDQsSW50KSxjYXN0KDB4Q0QzQ0RGOUYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHg3RTNEN0VFOCxJbnQpLGNhc3QoMHhCQ0JCRDM1MixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIEludDY0Lm1ha2UoY2FzdCgweEZGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAgSW50NjQubWFrZShjYXN0KDB4N0ZFRkZGRkYsSW50KSxjYXN0KDB4RkZGRkZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAwLjAwMDAwMDAwMDAwMDAwMDBFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDdFLTMyNCwgICAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjM5MDY3MTE2MTU2Njk5NTlFLTMwOSwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDBGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguTkVHQVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4RkZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggTWF0aC5QT1NJVElWRV9JTkZJTklUWSwgICBJbnQ2NC5tYWtlKGNhc3QoMHg3RkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisKKyAgICAgICAgLy8gTmFOIGlzIHNwZWNpYWwKKyAgICAgICAgdmFyIGk2NG5hbiA9IERvdWJsZVRvSW50NjRCaXRzKCBNYXRoLk5hTik7CisgICAgICAgIHZhciBpNjRjbXAgPSBJbnQ2NC5tYWtlKGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgaWYgKCAhIE1hdGguaXNOYU4oIEludDY0Qml0c1RvRG91YmxlKCBpNjRjbXApKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzE6IGV4cGVjdGVkIE5hTic7CisKKyAgICAgICAgLy8gRm9yIGRvdWJsZXMsIGEgcXVpZXQgTmFOIGlzIGEgYml0IHBhdHRlcm4KKyAgICAgICAgLy8gYmV0d2VlbiA3RkY4MDAwMDAwMDAwMDAwIGFuZCA3RkZGRkZGRkZGRkZGRkZGCisgICAgICAgIC8vICAgICAgb3IgRkZGODAwMDAwMDAwMDAwMCBhbmQgRkZGRkZGRkZGRkZGRkZGRgorICAgICAgICB2YXIgbWluMSA9IEludDY0Lm1ha2UoIGNhc3QoMHg3RkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBtaW4yID0gSW50NjQubWFrZSggY2FzdCgweEZGRjgwMDAwLCBJbnQpLCBjYXN0KDB4MDAwMDAwMDAsIEludCkpOworICAgICAgICB2YXIgbWF4MiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkZGRkZGRiwgSW50KSwgY2FzdCgweEZGRkZGRkZGLCBJbnQpKTsKKyAgICAgICAgdmFyIG9rMSA9ICAoSW50NjQuY29tcGFyZSggbWluMSwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgxKSA8PSAwKTsKKyAgICAgICAgdmFyIG9rMiA9ICAoSW50NjQuY29tcGFyZSggbWluMiwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgyKSA8PSAwKTsKKyAgICAgICAgaWYoICEgKG9rMSB8fCBvazIpKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlciBOYU4tVGVzdCAjMjogZmFpbGVkJzsKKyAgICB9CisgICAgI2VuZAorCit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnQ2NE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworCisvLyBJbnQ2NE1hcCBhbGxvd3MgbWFwcGluZyBvZiBJbnQ2NCBrZXlzIHRvIGFyYml0cmFyeSB2YWx1ZXMuCisvLyBPYmplY3RNYXA8PiBjYW5ub3QgYmUgdXNlZCwgc2luY2Ugd2Ugd2FudCB0byBjb21wYXJlIGJ5IHZhbHVlLCBub3QgYWRkcmVzcworCitjbGFzcyBJbnQ2NE1hcDxUPiBpbXBsZW1lbnRzIElNYXA8IEludDY0LCBUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IG5ldyBJbnRNYXA8IEludE1hcDwgVD4+KCk7CisgICAgfTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0U3ViTWFwKCBoaSA6IGhheGUuSW50MzIsIGNhbkNyZWF0ZSA6IEJvb2wpIDogSW50TWFwPCBUPiB7CisgICAgICAgIGlmKCBTdWJNYXBzLmV4aXN0cyhoaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChoaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiggISBjYW5DcmVhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gbmV3IEludE1hcDwgVD4oKTsKKyAgICAgICAgU3ViTWFwcy5zZXQoIGhpLCBsb21hcCk7CisgICAgICAgIHJldHVybiBsb21hcDsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0TG93TWFwKCBrZXkgOiBoYXhlLkludDY0LCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBJbnQ2NC5nZXRIaWdoKGtleSksIGNhbkNyZWF0ZSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBHZXRTdWJNYXAoIGtleS5oaWdoLCBjYW5DcmVhdGUpOworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd0luZGV4KCBrZXkgOiBoYXhlLkludDY0KSA6IGhheGUuSW50MzIgeworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gSW50NjQuZ2V0TG93KGtleSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBrZXkubG93OworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIE51bGxDaGVjaygga2V5IDogaGF4ZS5JbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gSW50NjQgaXMgbm90IG51bGxhYmxlIGFueW1vcmUgKGl0IG5ldmVyIHJlYWxseSB3YXMpCisgICAgICAgICNlbmQKKyAgICB9OworCisKKworICAgIC8qKgorICAgICAgICBNYXBzIGBrZXlgIHRvIGB2YWx1ZWAuCisgICAgICAgIElmIGBrZXlgIGFscmVhZHkgaGFzIGEgbWFwcGluZywgdGhlIHByZXZpb3VzIHZhbHVlIGRpc2FwcGVhcnMuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldCgga2V5IDogSW50NjQsIHZhbHVlIDogVCApIDogVm9pZCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGxvbWFwLnNldCggR2V0TG93SW5kZXgoa2V5KSwgdmFsdWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgbWFwcGluZyBvZiBga2V5YC4KKyAgICAgICAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKworICAgICAgICBOb3RlIHRoYXQgYSBjaGVjayBsaWtlIGBtYXAuZ2V0KGtleSkgPT0gbnVsbGAgY2FuIGhvbGQgZm9yIHR3byByZWFzb25zOgorCisgICAgICAgICAgICAxLiB0aGUgbWFwIGhhcyBubyBtYXBwaW5nIGZvciBga2V5YAorICAgICAgICAgICAgMi4gdGhlIG1hcCBoYXMgYSBtYXBwaW5nIHdpdGggYSB2YWx1ZSBvZiBgbnVsbGAKKworICAgICAgICBJZiBpdCBpcyBpbXBvcnRhbnQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMsIGBleGlzdHMoKWAgc2hvdWxkIGJlCisgICAgICAgIHVzZWQuCisKKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCBrZXkgOiBJbnQ2NCkgOiBOdWxsPFQ+IHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZ2V0KCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIGBrZXlgIGhhcyBhIG1hcHBpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZXhpc3RzKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5leGlzdHMoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZW1vdmVzIHRoZSBtYXBwaW5nIG9mIGBrZXlgIGFuZCByZXR1cm5zIHRydWUgaWYgc3VjaCBhIG1hcHBpbmcgZXhpc3RlZCwKKyAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLiBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoIGtleSA6IEludDY0KSA6IEJvb2wgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLnJlbW92ZSggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBvcmRlciBvZiBrZXlzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cygpIDogSXRlcmF0b3I8SW50NjQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NEtleUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2YgdmFsdWVzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKSA6IEl0ZXJhdG9yPFQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NFZhbHVlSXRlcmF0b3I8VD4oU3ViTWFwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIGV4YWN0IHJlcHJlc2VudGF0aW9uIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtIGFuZCBrZXktdHlwZS4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciByZXN1bHQgOiBTdHJpbmcgPSAieyI7CisKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gdGhpcy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmKCBmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkpOworICAgICAgICAgICAgcmVzdWx0ICs9IEludDY0LnRvU3RyKGtleSkgKyAnID0+ICR2YWx1ZSc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworICAgIH0KKworfQorCisKKy8vIGludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgSW50NjRNYXA8VD4KKy8vIGFsbCBjbGFzcyB3aXRoIG1hdGNoaW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgYXMgaXRlcmF0b3IgKGR1Y2sgdHlwaW5nKQorcHJpdmF0ZSBjbGFzcyBJbnQ2NE1hcEl0ZXJhdG9yQmFzZTxUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwcml2YXRlIHZhciBIaUl0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIExvSXRlcmF0b3IgOiBJdGVyYXRvcjwgSW50PiA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgQ3VycmVudEhpIDogSW50ID0gMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBTdWJNYXBzID0gZGF0YTsKKyAgICAgICAgSGlJdGVyYXRvciA9IFN1Yk1hcHMua2V5cygpOworICAgICAgICBMb0l0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgQ3VycmVudEhpID0gMDsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgZmFsc2UgaWYgdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZSwgdHJ1ZSBvdGhlcndpc2UuCisKKyAgICAgICAgVXN1YWxseSBpdGVyYXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSBjb21wbGV0ZSBpZiBhbGwgZWxlbWVudHMgb2YgdGhlCisgICAgICAgIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUgd2VyZSBoYW5kbGVkIHRocm91Z2ggY2FsbHMgdG8gbmV4dCgpLiBIb3dldmVyLAorICAgICAgICBpbiBjdXN0b20gaXRlcmF0b3JzIGFueSBsb2dpYyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgc3RhdGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGhhc05leHQoKSA6IEJvb2wgeworCisgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggKEhpSXRlcmF0b3IgIT0gbnVsbCkgJiYgSGlJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEN1cnJlbnRIaSA9IEhpSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgTG9JdGVyYXRvciA9IFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkua2V5cygpOworICAgICAgICAgICAgaWYoIChMb0l0ZXJhdG9yICE9IG51bGwpICYmIExvSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIaUl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRLZXlJdGVyYXRvcjxUPmV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBJbnQ2NCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKCBDdXJyZW50SGksIExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBUIHsKKyAgICAgICAgaWYoIGhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkuZ2V0KExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnRTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgSW50U2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLkludE1hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8SW50PiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxJbnQ+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8SW50PiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxJbnQ+ID0gbmV3IEFycmF5PEludD4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvT2JqZWN0U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjcyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIE9iamVjdFNldDxLPiB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5PYmplY3RNYXA8SyxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8Sz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8Sz4geworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmtleXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdHJhY2VBbGwoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgnJF9zaXplIGVudHJpZXMnKTsKKyAgICAgICAgZm9yKGVudHJ5IGluIHRoaXMpIHsKKyAgICAgICAgICAgIHZhciB5ZXMgPSBjb250YWlucyhlbnRyeSk7CisgICAgICAgICAgICB0cmFjZSgnLSAkZW50cnksIGNvbnRhaW5zKCkgPSAkeWVzJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBLKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEspIDogQm9vbCB7CisgICAgICAgIGlmIChjb250YWlucyhvKSkgeworICAgICAgICAgICAgX2VsZW1lbnRzLnJlbW92ZShvKTsKKyAgICAgICAgICAgIF9zaXplLS07CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b0FycmF5KCkgOiBBcnJheTxLPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxLPiA9IG5ldyBBcnJheTxLPigpOworICAgICAgICBmb3IgKGtleSBpbiBfZWxlbWVudHMua2V5cygpKSB7CisgICAgICAgICAgICByZXQucHVzaChrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zaXplKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gX3NpemU7CisgICAgfQorfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9TdHJpbmdTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjMGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgU3RyaW5nU2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLlN0cmluZ01hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8U3RyaW5nPiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxTdHJpbmc+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBTdHJpbmcpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8U3RyaW5nPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxTdHJpbmc+ID0gbmV3IEFycmF5PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworY2xhc3MgWmlnWmFnIHsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21JbnQoIG4gOiBJbnQpIDogVUludCAgICB7CisgICAgICAgICNpZiBwaHAKKworICAgICAgICByZXR1cm4gY2FzdChjYXN0KGNhc3QobixJbnQzMikgPDwgMSxJbnQzMikgXiBjYXN0KGNhc3QobixJbnQzMikgPj4gMzEsSW50MzIpLFVJbnQpOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuIGNhc3QobiA8PCAxLFVJbnQpIF4gY2FzdChuID4+IDMxLFVJbnQpOworCisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvSW50KCBuIDogVUludCkgOiBJbnQgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgdmFyIGEgPSAoMHg3RkZGRkZGRiAmIGNhc3QobiA+PiAxLEludCkpOworICAgICAgICB2YXIgYiA9IChjYXN0KG4gJiAxLEludCkpOworICAgICAgICBiID0gLWI7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OAorICAgICAgICByZXR1cm4gYSBeIGI7CisKKyAgICAgICAgI2Vsc2UKKworICAgICAgICByZXR1cm4gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKSBeICgtY2FzdChuICYgMSxJbnQpKTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRnJvbUxvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoIEludDY0LnNobChuLCAxKSwgSW50NjQuc2hyKG4sIDYzKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvTG9uZyggbiA6IEludDY0KSA6IEludDY0IHsKKyAgICAgICAgcmV0dXJuIEludDY0LnhvcigKKyAgICAgICAgICAgIEludDY0LmFuZCgKKyAgICAgICAgICAgICAgICBJbnQ2NC5zaHIobiwgMSksCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgweDdGRkZGRkZGLCAweEZGRkZGRkZGKSksCisgICAgICAgICAgICBJbnQ2NC5zdWIoCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgwLCAwKSwKKyAgICAgICAgICAgICAgICBJbnQ2NC5hbmQobiwgSW50NjQubWFrZSgwLDEpKSkpOworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdDMyKCB0ZXN0IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IFVJbnQgPSBaaWdaYWcuRnJvbUludCggdGVzdCk7CisgICAgICAgIHZhciBiIDogSW50ID0gWmlnWmFnLlRvSW50KGEpOworICAgICAgICAjaWYgcGhwCisgICAgICAgIHRlc3QgPSB0ZXN0ICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAgICNlbmQKKyAgICAgICAgaWYoIHRlc3QgIT0gYikKKyAgICAgICAgICAgIHRocm93ICdaaWdaYWcuVGVzdDMyKCR0ZXN0KSBmYWlsZWQ6IGEgPSAkYSwgYiA9ICRiJzsKKyAgICB9CisgICAgI2VuZAorCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3Q2NCggdGVzdCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBhIDogSW50NjQgPSBaaWdaYWcuRnJvbUxvbmcoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludDY0ID0gWmlnWmFnLlRvTG9uZyhhKTsKKyAgICAgICAgaWYoIEludDY0LmNvbXBhcmUoIHRlc3QsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3Q2NCgkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisgICAgICB2YXIgdTEgOiBVSW50ID0gMHhGRkZGRkZGRTsKKyAgICAgIHZhciB1MiA6IFVJbnQgPSAweEZGRkZGRkZGOworICAgICAgdmFyIGkxIDogSW50ID0gMjE0NzQ4MzY0NzsKKyAgICAgIHZhciBpMiA6IEludCA9IC0yMTQ3NDgzNjQ4OworCisgICAgICAjaWYgcGhwCisgICAgICBpMiA9IGkyICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAjZW5kCisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIEZyb21JbnQoMCkgICE9IDApIHRocm93ICdwYiAjMSB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTEpICE9IDEpIHRocm93ICdwYiAjMiB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoMSkgICE9IDIpIHRocm93ICdwYiAjMyB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTIpICE9IDMpIHRocm93ICdwYiAjNCB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoaTEpICE9IHUxKSB0aHJvdyAncGIgIzUgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkyKSAhPSB1MikgdGhyb3cgJ3BiICM2IHRvIFppZ1phZyc7CisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIFRvSW50KDApICE9IDApIHRocm93ICdwYiAjMSBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMSkgIT0gLTEpIHRocm93ICdwYiAjMiBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMikgIT0gMSkgdGhyb3cgJ3BiICMzIGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCgzKSAhPSAtMikgdGhyb3cgJ3BiICM0IGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCh1MSkgIT0gaTEpIHRocm93ICdwYiAjNSBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTEpfSBleHBlY3RlZCAkaTEnOworICAgICAgaWYoIFRvSW50KHUyKSAhPSBpMikgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9IGV4cGVjdGVkICRpMic7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgICAgICBUZXN0MzIoIDApOworICAgICAgZm9yKCBpIGluIDAgLi4uIDMwKSB7CisgICAgICAgIFRlc3QzMiggMSA8PCBpKTsKKyAgICAgICAgVGVzdDMyKCAtKDEgIDw8IGkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3QzMiggMHg3RkZGRkZGRik7CisgICAgICBUZXN0MzIoIGNhc3QoMHg4MDAwMDAwMCxJbnQpKTsKKworICAgICAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiA2MikgeworICAgICAgICBUZXN0NjQoIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSk7CisgICAgICAgIFRlc3Q2NCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgfQorICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKyAgICB9CisgICAgI2VuZAorfQorCisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkYjExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKKworLyoqCisqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBtZXRhIGRhdGEgYWJvdXQgdGhyaWZ0IGZpZWxkcy4gRXZlcnkgZmllbGQgaW4gYQorKiBhIHN0cnVjdCBzaG91bGQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliaW5nIGl0LgorKgorKi8KK2NsYXNzIEZpZWxkTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgZmllbGROYW1lIDogU3RyaW5nOworICBwdWJsaWMgdmFyIHJlcXVpcmVtZW50VHlwZSA6IEludDsKKyAgcHVibGljIHZhciB2YWx1ZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICBwcml2YXRlIHN0YXRpYyB2YXIgc3RydWN0TWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOworCisgIHB1YmxpYyBmdW5jdGlvbiBGaWVsZE1ldGFEYXRhKG5hbWUgOiBTdHJpbmcsIHJlcSA6IEludCwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgIHRoaXMuZmllbGROYW1lID0gbmFtZTsKKyAgICB0aGlzLnJlcXVpcmVtZW50VHlwZSA9IHJlcTsKKyAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZFN0cnVjdE1ldGFEYXRhTWFwKHNDbGFzczpDbGFzcywgbWFwOkRpY3Rpb25hcnkpIDogVm9pZHsKKyAgICBzdHJ1Y3RNYXBbc0NsYXNzXSA9IG1hcDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbWFwIHdpdGggbWV0YWRhdGEgKGkuZS4gaW5zdGFuY2VzIG9mIEZpZWxkTWV0YURhdGEpIHRoYXQKKyAgICogZGVzY3JpYmUgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBzQ2xhc3MgVGhlIFRCYXNlIGNsYXNzIGZvciB3aGljaCB0aGUgbWV0YWRhdGEgbWFwIGlzIHJlcXVlc3RlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MpOkRpY3Rpb25hcnkgeworICAgIHJldHVybiBzdHJ1Y3RNYXBbc0NsYXNzXTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCisvKioKKyAqIEZpZWxkVmFsdWVNZXRhRGF0YSBhbmQgY29sbGVjdGlvbiBvZiBzdWJjbGFzc2VzIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0CisgKiB0aGUgdmFsdWUocykgb2YgYSBmaWVsZAorICovCitjbGFzcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRWYWx1ZU1ldGFEYXRhKHR5cGUgOiBJbnQpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzU3RydWN0KCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgZnVuY3Rpb24gaXNDb250YWluZXIoKSA6IEJvb2wgeworICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9MaXN0TWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYTMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIExpc3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTGlzdE1ldGFEYXRhKHR5cGUgOiBJbnQsIGVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5lbGVtTWV0YURhdGEgPSBlTWV0YURhdGE7CisgICAgfQorfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTWFwTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjNlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIE1hcE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIga2V5TWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworICAgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTWFwTWV0YURhdGEodHlwZSA6IEludCwga01ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmtleU1ldGFEYXRhID0ga01ldGFEYXRhOworICAgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICAgIH0KK30KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU2V0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzY3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFNldE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgZWxlbU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXRNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFN0cnVjdE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgc3RydWN0Q2xhc3M6Q2xhc3M7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RydWN0TWV0YURhdGEodHlwZSA6IEludCwgc0NsYXNzOkNsYXNzKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuc3RydWN0Q2xhc3MgPSBzQ2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMjkxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLkludDY0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisqIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRSZWN1cnNpb25UcmFja2VyIGltcGxlbWVudHMgVFByb3RvY29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciBBTk9OWU1PVVNfU1RSVUNUOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OX01BU0sgOiBoYXhlLkludDMyID0gMHhmZmZmMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fMSA6IGhheGUuSW50MzIgPSAweDgwMDEwMDAwOworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgdHJhbnNfIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0cmFuczpUVHJhbnNwb3J0LCBzdHJpY3RSZWFkIDogQm9vbD1mYWxzZSwgc3RyaWN0V3JpdGUgOiBCb29sPXRydWUpIHsKKyAgICAgIHRyYW5zXyA9IHRyYW5zOworICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpOlRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHN0cmljdFdyaXRlXykgeworICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgICAgIHdyaXRlSTMyKHZlcnNpb24pOworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgICAgd3JpdGVJMzIobWFwLnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKGxpc3Q6VExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKHNldC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShiID8gMSA6IDApOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVCeXRlKGIpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDE2KGkxNik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTMyKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgdmFyIGhpID0gSW50NjQuZ2V0SGlnaChpNjQpOworICAgICAgICB2YXIgbG8gPSBJbnQ2NC5nZXRMb3coaTY0KTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaGkpOworICAgICAgICBvdXQud3JpdGVJbnQzMihsbyk7CisgICAgICAgICNlbHNlCisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5oaWdoKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTY0Lmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViOkZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVEb3VibGUoZHViKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoc3RyKTsKKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHdyaXRlSTMyKCBieXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlSTMyKGJpbi5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSBzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKHJlYWRTdHJpbmcoKSwgc2l6ZSAmIDB4MDAwMDAwZmYsIHJlYWRJMzIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nQm9keShzaXplKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciBpZCA6IEludCA9IDA7CisgICAgICAgIGlmICh0eXBlICE9IFRUeXBlLlNUT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkID0gcmVhZEkxNigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICByZXR1cm4gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAxKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMSk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDIpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCAyKTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB2YXIgaGkgPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHZhciBsbyA9IGlucC5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIEludDY0Lm1ha2UoaGksbG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nQm9keShsZW4gOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgaWYoIGxlbiA+IDApIHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBsZW4pOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRTdHJpbmcobGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRCeXRlcygpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTliZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHZhciBzdHJpY3RSZWFkXyA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZV8gOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHN0cmljdFJlYWQgOiBCb29sID0gZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbCA9IHRydWUpIHsKKyAgICAgICAgc3RyaWN0UmVhZF8gID0gc3RyaWN0UmVhZDsKKyAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFByb3RvY29sICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4CkBAIC0wLDAgKzEsNzE4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuSW50MzI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLlV0Zjg7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5aaWdaYWc7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLkJpdENvbnZlcnRlcjsKKworCisvKioKKyogQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVCA6IFRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRTVE9QIDogVEZpZWxkID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU1RPUCwgMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFBST1RPQ09MX0lEIDogSW50ID0gMHg4MjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT04gOiBJbnQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogSW50ID0gMHgxZjsgLy8gMDAwMSAxMTExCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX01BU0sgOiBJbnQgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfQklUUyA6IEludCA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9TSElGVF9BTU9VTlQgOiBJbnQgPSA1OworCisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdHR5cGVUb0NvbXBhY3RUeXBlID0gWworICAgICAgICBUVHlwZS5TVE9QICAgID0+IFRDb21wYWN0VHlwZXMuU1RPUCwKKyAgICAgICAgVFR5cGUuQk9PTCAgICA9PiBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSwKKyAgICAgICAgVFR5cGUuQllURSAgICA9PiBUQ29tcGFjdFR5cGVzLkJZVEUsCisgICAgICAgIFRUeXBlLkRPVUJMRSAgPT4gVENvbXBhY3RUeXBlcy5ET1VCTEUsCisgICAgICAgIFRUeXBlLkkxNiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMTYsCisgICAgICAgIFRUeXBlLkkzMiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMzIsCisgICAgICAgIFRUeXBlLkk2NCAgICAgPT4gVENvbXBhY3RUeXBlcy5JNjQsCisgICAgICAgIFRUeXBlLlNUUklORyAgPT4gVENvbXBhY3RUeXBlcy5CSU5BUlksCisgICAgICAgIFRUeXBlLlNUUlVDVCAgPT4gVENvbXBhY3RUeXBlcy5TVFJVQ1QsCisgICAgICAgIFRUeXBlLk1BUCAgICAgPT4gVENvbXBhY3RUeXBlcy5NQVAsCisgICAgICAgIFRUeXBlLlNFVCAgICAgPT4gVENvbXBhY3RUeXBlcy5TRVQsCisgICAgICAgIFRUeXBlLkxJU1QgICAgPT4gVENvbXBhY3RUeXBlcy5MSVNUCisgICAgXTsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciB0Y29tcGFjdFR5cGVUb1R5cGUgPSBbCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RPUCAgICAgICAgICA9PiBUVHlwZS5TVE9QLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQllURSAgICAgICAgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkxNiAgICAgICAgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkzMiAgICAgICAgICAgPT4gVFR5cGUuSTMyLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkk2NCAgICAgICAgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkRPVUJMRSAgICAgICAgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJJTkFSWSAgICAgICAgPT4gVFR5cGUuU1RSSU5HLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkxJU1QgICAgICAgICAgPT4gVFR5cGUuTElTVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TRVQgICAgICAgICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5NQVAgICAgICAgICAgID0+IFRUeXBlLk1BUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TVFJVQ1QgICAgICAgID0+IFRUeXBlLlNUUlVDVAorICAgIF07CisKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRfIDogR2VuZXJpY1N0YWNrPEludD4gPSBuZXcgR2VuZXJpY1N0YWNrPEludD4oKTsKKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRJZF8gOiBJbnQgPSAwOworCisgICAgLyoqCisgICAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdmFyIGJvb2xlYW5GaWVsZF8gOiBOdWxsPFRGaWVsZD47CisKKyAgICAvKioKKyAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sVmFsdWVfIDogTnVsbDxCb29sPjsKKworCisgICAgLy8gd2hldGhlciB0aGUgdW5kZXJseWluZyBzeXN0ZW0gaG9sZHMgU3RyaW5ncyBhcyBVVEYtOAorICAgIC8vIGh0dHA6Ly9vbGQuaGF4ZS5vcmcvbWFudWFsL2VuY29kaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHV0ZjhTdHJpbmdzID0gaGF4ZS5VdGY4LnZhbGlkYXRlKCLDhy3Dny3Dhi3Qri3QqCIpOworCisgICAgLy8gdGhlIHRyYW5zcG9ydCB1c2VkCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworCisgICAgLy8gVENvbXBhY3RQcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHRyYW5zIDogVFRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVzZXQoKSA6IFZvaWR7CisgICAgICAgIHdoaWxlICggISBsYXN0RmllbGRfLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIFdyaXRlIGEgYnl0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQnl0ZURpcmVjdCggYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDEpOworICAgICAgICBidWYuc2V0KCAwLCBiKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJ1ZiwgMCwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50MzIoIG4gOiBVSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaTMyYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggbiAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkzMmJ1Zi5hZGRCeXRlKCAobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBpMzJidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9ICAoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spOworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIFBST1RPQ09MX0lEKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCB2ZXJzaW9uQW5kVHlwZSk7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1lc3NhZ2Uuc2VxaWQsIFVJbnQpKTsKKyAgICAgICAgd3JpdGVTdHJpbmcoIG1lc3NhZ2UubmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZF8uYWRkKCBsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgICAgICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKGZpZWxkOlRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkKKyAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAgICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggZmllbGQgOiBURmllbGQsIHR5cGVPdmVycmlkZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICB2YXIgdHlwZVRvV3JpdGUgOiBJbnQ7CisgICAgICAgIGlmICggdHlwZU92ZXJyaWRlID09IDB4RkYpCisgICAgICAgICAgICB0eXBlVG9Xcml0ZSA9IGdldENvbXBhY3RUeXBlKCBmaWVsZC50eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgIGlmIChmaWVsZC5pZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZC5pZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChmaWVsZC5pZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgICAgIH0KKworICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCwgSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIga3Z0eXBlID0gKGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0KSB8IGdldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdCggbWFwLnNpemUsIFVJbnQpKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgga3Z0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCBsaXN0IDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBsaXN0LmVsZW1UeXBlLCBsaXN0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2V0IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggc2V0IDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIHNldC5lbGVtVHlwZSwgc2V0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAqIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB2YXIgYmN0IDogSW50ID0gYiA/IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFIDogVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIGJjdCk7CisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBiY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoIGkxNiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggWmlnWmFnLkZyb21JbnQoIGkxNikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCBpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMzIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCggaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQ2NCggIFppZ1phZy5Gcm9tTG9uZyggaTY0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoIGR1YiA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgZGF0YSA9IEJpdENvbnZlcnRlci5maXhlZExvbmdUb0J5dGVzKCBCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZHViKSk7CisgICAgICAgIHRyYW5zLndyaXRlKCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIHN0cik7ICAvLyBubyBuZWVkIHRvIGVuY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIFV0ZjguZW5jb2RlKCBzdHIpKTsKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUJpbmFyeSggdG1wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoIGJpbiA6IEJ5dGVzKSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KGJpbi5sZW5ndGgsVUludCkpOworICAgICAgICB0cmFucy53cml0ZSggYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQorICAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBlbGVtVHlwZSA6IEludCwgc2l6ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHNpemUgPD0gMTQpICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KHNpemUsIFVJbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVWYXJpbnQ2NChuIDogaGF4ZS5JbnQ2NCkgOiBWb2lkICAgIHsKKyAgICAgICAgdmFyIHZhcmludDY0b3V0ID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggSW50NjQuaXNaZXJvKCBJbnQ2NC5hbmQoIG4sIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsMHg3RikpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCBJbnQ2NC5nZXRMb3cobikpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggbi5sb3cpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAoSW50NjQuZ2V0TG93KG4pICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIChuLmxvdyAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5zaHIoIG4sIDcpOworICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMHgwMUZGRkZGRiwweEZGRkZGRkZGKSk7ICAvLyBjbGVhbiBvdXQgdGhlIHNoaWZ0ZWQgNyBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmFyIHRtcCA9IHZhcmludDY0b3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciBwcm90b2NvbElkIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiICsgU3RyaW5nVG9vbHMuaGV4KFBST1RPQ09MX0lELDIpICsgIiBidXQgZ290ICIgKyBTdHJpbmdUb29scy5oZXgocHJvdG9jb2xJZCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSAodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICAgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA6IEludCA9ICgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICAgICAgdmFyIHNlcWlkIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBtc2dObSA6IFN0cmluZyA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZSggbXNnTm0sIHR5cGUsIHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBsYXN0RmllbGRfLmFkZChsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5wb3AoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciB0eXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKworICAgICAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgICAgICAgIGlmICh0eXBlID09IGNhc3QoVENvbXBhY3RUeXBlcy5TVE9QLEludCkpIHsKKyAgICAgICAgICAgIHJldHVybiBUU1RPUDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmaWVsZElkIDogSW50OworCisgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgdmFyIG1vZGlmaWVyIDogSW50ID0gKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgIGlmIChtb2RpZmllciA9PSAwKQorICAgICAgICAgICAgZmllbGRJZCA9IHJlYWRJMTYoKTsgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmllbGRJZCA9IGxhc3RGaWVsZElkXyArIG1vZGlmaWVyOyAvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkICA9IG5ldyBURmllbGQoICIiLCBjYXN0KGdldFRUeXBlKHR5cGUgJiAweDBmKSxJbnQpLCBmaWVsZElkKTsKKworICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICAgICAgICBib29sVmFsdWVfID0gKCh0eXBlICYgMHgwZikgPT0gY2FzdChUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSxJbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKyAgICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAqICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgdmFyIGtleUFuZFZhbHVlVHlwZSA6IEludCA9ICgoc2l6ZSA9PSAwKSAgPyAgMCAgOiAgcmVhZEJ5dGUoKSk7CisgICAgICAgIHZhciBrZXkgOiBJbnQgPSBjYXN0KCBnZXRUVHlwZSggKGtleUFuZFZhbHVlVHlwZSAmIDB4RjApID4+IDQpLCBJbnQpOworICAgICAgICB2YXIgdmFsIDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpLCBJbnQpOworICAgICAgICByZXR1cm4gbmV3IFRNYXAoIGtleSwgdmFsLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRMaXN0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRTZXQoIHR5cGUsIHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgKiBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICAgICAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA6IEJvb2wgPSBib29sVmFsdWVfOworICAgICAgICAgICAgYm9vbFZhbHVlXyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ5dGVSYXdCdWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnl0ZVJhd0J1ZiwgMCwgMSk7CisgICAgICAgIHJldHVybiBieXRlUmF3QnVmLmdldEJ5dGVzKCkuZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9JbnQoIFJlYWRWYXJpbnQzMigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9Mb25nKCBSZWFkVmFyaW50NjQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHZhciBsb25nQml0cyA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB0cmFucy5yZWFkQWxsKCBsb25nQml0cywgMCwgOCk7CisgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoIEJpdENvbnZlcnRlci5ieXRlc1RvTG9uZyggbG9uZ0JpdHMuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworCisgICAgICAgIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmLmdldEJ5dGVzKCkpOworICAgICAgICB2YXIgc3RyID0gaW5wLnJlYWRTdHJpbmcoIGxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGxlbmd0aCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlcy5hbGxvYygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCisgICAgLy8gZW5jb2RpbmcuCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDMyKCkgOiBVSW50IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IFVJbnQgPSAwOworICAgICAgICB2YXIgc2hpZnQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0IHw9IGNhc3QoKGIgJiAweDdmKSA8PCBzaGlmdCwgVUludCk7CisgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkVmFyaW50NjQoKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIHJlc3VsdCwgSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsYiAmIDB4N2YpLCBzaGlmdCkpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworICAgIC8vCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGlzQm9vbFR5cGUoIGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHZhciBsb3dlck5pYmJsZSA6IEludCA9IGIgJiAweDBmOworICAgICAgICBzd2l0Y2gobG93ZXJOaWJibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUU6IHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fRkFMU0U6IHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAqIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VFR5cGUoIHR5cGUgOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0Y29tcGFjdFR5cGVUb1R5cGVbdHlwZV07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHR0IDogSW50ID0gKHR5cGUgJiAweDBmKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAnZG9uXCd0IGtub3cgd2hhdCB0eXBlOiAkdHQgKCRlKScpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFR5cGVzIGNvbnN0YW50LgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcGFjdFR5cGUoIHR0eXBlIDogSW50KSA6IEludAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhc3QoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0sIEludCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjczYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIENvbXBhY3QgUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RUeXBlcy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQzZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAqLworQDplbnVtCithYnN0cmFjdCBUQ29tcGFjdFR5cGVzKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QICAgICAgICAgID0gMHgwMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQk9PTEVBTl9UUlVFICA9IDB4MDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fRkFMU0UgPSAweDAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFICAgICAgICAgID0gMHgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTE2ICAgICAgICAgICA9IDB4MDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiAgICAgICAgICAgPSAweDA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgICAgICAgICAgID0gMHgwNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRE9VQkxFICAgICAgICA9IDB4MDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJJTkFSWSAgICAgICAgPSAweDA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBMSVNUICAgICAgICAgID0gMHgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUICAgICAgICAgICA9IDB4MEE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCAgICAgICAgICAgPSAweDBCOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJVQ1QgICAgICAgID0gMHgwQzsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1NDk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBURmllbGQgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworICAgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIGlkIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIsIHQgOiBJbnQgPSAwLCBpIDogSW50ID0gMCkgeworICAgICAgbmFtZSA9IG47CisgICAgICB0eXBlID0gdDsKKyAgICAgIGlkID0gaTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICByZXR1cm4gJzxURmllbGQgbmFtZToiJG5hbWUiIHR5cGU6IiR0eXBlIiBmaWVsZC1pZDoiJGlkIj4nOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoIG90aGVyRmllbGQgOiBURmllbGQpIDogQm9vbCB7CisgICAgICByZXR1cm4gKHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlKQorICAgICAgICAgICYmIChpZCA9PSBvdGhlckZpZWxkLmlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4CkBAIC0wLDAgKzEsMTA3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuVXRmODsKK2ltcG9ydCBoYXhlLmNyeXB0by5CYXNlNjQ7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisKKy8qIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyogIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisqCisqICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB3aXJlIGZvcm1hdC4KKyoKKyogIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwdWJsaWMgdmFyIHRyYW5zKGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgcHJpdmF0ZSB2YXIgY29udGV4dFN0YWNrIDogR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4gPSBuZXcgR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKworICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQ7CisKKyAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgIHByaXZhdGUgdmFyIHJlYWRlciA6IExvb2thaGVhZFJlYWRlcjsKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpCisgICAgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBKU09OQ29uc3RhbnRzLlZFUlNJT04pOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyhtZXNzYWdlLm5hbWUpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS50eXBlKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS5zZXFpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGZpZWxkLmlkICk7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBmaWVsZC50eXBlKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5rZXlUeXBlKSkpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLnZhbHVlVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWFwLnNpemUpOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBsaXN0LmVsZW1UeXBlICkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggc2V0LmVsZW1UeXBlKSkpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggYikKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50NjQoIGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoc3RyKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQmFzZTY0KGJpbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIGlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBKU09OQ29uc3RhbnRzLlZFUlNJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgICAgIH0KKworICAgICAgICBtZXNzYWdlLm5hbWUgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIG1lc3NhZ2UudHlwZSA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBtZXNzYWdlLnNlcWlkID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCk6VFN0cnVjdCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSA9PSBKU09OQ29uc3RhbnRzLlJCUkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmaWVsZC5pZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgZmllbGQudHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEtleVR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgVmFsdWVUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAoIEtleVR5cGUsIFZhbHVlVHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEVsZW1lbnRUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldCggRWxlbWVudFR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpICE9IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludDY0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkJhc2U2NCgpOworICAgIH0KKworICAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgIHByaXZhdGUgZnVuY3Rpb24gIFB1c2hDb250ZXh0KGMgOiBKU09OQmFzZUNvbnRleHQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHRTdGFjay5hZGQoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQgPSBjOworICAgIH0KKworICAgIC8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgIHByaXZhdGUgZnVuY3Rpb24gIFBvcENvbnRleHQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0ID0gY29udGV4dFN0YWNrLnBvcCgpOworICAgIH0KKworCisgICAgLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05TdHJpbmcoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKworICAgICAgICBmb3IgKGkgaW4gMCAuLi4gYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGIuZ2V0KGkpOworCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKSA9PSBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSC5jaGFyQXQoMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIICsgSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIGIsIGksIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbnVtID0gSlNPTkNvbnN0YW50cy5KU09OX0NIQVJfVEFCTEVbdmFsdWVdOworICAgICAgICAgICAgICAgIGlmIChudW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVtID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZSggbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHhGRjAwMDAwMCkgPj4gMTIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gOCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCAodmFsdWUgJiAweDAwMDBGRjAwKSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoIHZhbHVlICYgMHgwMDAwMDBGRikpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnRlZ2VyKCBudW0gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnQ2NCggbnVtIDogSW50NjQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgIC8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkRvdWJsZShudW0gOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisKKyAgICAgICAgdmFyIHNwZWNpYWwgOiBCb29sID0gZmFsc2U7CisgICAgICAgIHZhciByZW5kZXJlZCA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiggTWF0aC5pc05hTihudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU47CisgICAgICAgIH0gZWxzZSBpZiAoISBNYXRoLmlzRmluaXRlKG51bSkpIHsKKyAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgaWYoIG51bSA+IDApIHsKKyAgICAgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW5kZXJlZCA9IFN0ZC5zdHJpbmcobnVtKTsgIC8vIHBsYWluIGFuZCBzaW1wbGUgZmxvYXQgbnVtYmVyCisgICAgICAgIH0KKworICAgICAgICAvLyBjb21wb3NlIG91dHB1dAorICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RyICs9IHJlbmRlcmVkOworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZCBkYXRhCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05CYXNlNjQoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEJhc2U2NC5lbmNvZGUoYikpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKworICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OT2JqZWN0U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgUHVzaENvbnRleHQoIG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKworICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBjaGFyLCBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZEpTT05TeW50YXhDaGFyKCBjaGFyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYiA9IEJ5dGVzRnJvbVN0cmluZyggY2hhcik7CisKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgaWYgKGNoLmdldCgwKSAhPSBiLmdldCgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICRjaCcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIC8vIFNraXAgUmVhZGluZyBmcm9tIHRoZSBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTlN0cmluZyhza2lwQ29udGV4dCA6IEJvb2wpIDogU3RyaW5nCisgICAgeworICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZmZXIgOiBCeXRlc0J1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworCisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUmVhZCgpOworCisgICAgICAgICAgICAvLyBlbmQgb2Ygc3RyaW5nPworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpICE9IEpTT05Db25zdGFudHMuRVNDU0VRLmNoYXJBdCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggY2guZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggKGhleCB1bmljb2RlKSBhbmQgXFggKGNvbnRyb2wgY2hhcnMpCisgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gSlNPTkNvbnN0YW50cy5FU0NBUEVfQ0hBUlNfVE9fVkFMVUVTW2NoLmdldCgwKV07CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgIHZhciBoZXhidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHZhciBoZXhsZW4gPSB0cmFucy5yZWFkQWxsKCBoZXhidWYsIDAsIDQpOworICAgICAgICAgICAgaWYoIGhleGxlbiAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOb3QgZW5vdWdoIGRhdGEgZm9yIFxcdU5OTk4gc2VxdWVuY2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhleGRpZ2l0cyA9IGhleGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgdmFyIGNoYXJjb2RlID0gMDsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMCkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMSkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMikpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMykpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hZGRTdHJpbmcoIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcmNvZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZmZlci5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIElzSlNPTk51bWVyaWMoYiA6IEludCkgOiBCb29sIHsKKyAgICAgICAgc3dpdGNoIChiKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICIrIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICItIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIuIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIwIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIxIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIyIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIzIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI0Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI1Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI2Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI3Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI4Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI5Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJFIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJlIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAvLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk51bWVyaWNDaGFycygpIDogU3RyaW5nCisgICAgeworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICBpZiggISBJc0pTT05OdW1lcmljKCBjaC5nZXQoMCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIHJlYWRlci5SZWFkKCkuZ2V0KDApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnRlZ2VyKCkgOiBJbnQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBTdGQucGFyc2VJbnQoc3RyKTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkludDY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIGlmKCBzdHIubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3Mgc2lnbgorICAgICAgICB2YXIgYk1pbnVzID0gZmFsc2U7CisgICAgICAgIHZhciBzdGFydEF0ID0gMDsKKyAgICAgICAgaWYoIChzdHIuY2hhckF0KDApID09ICIrIikgfHwgKHN0ci5jaGFyQXQoMCkgPT0gIi0iKSkgeworICAgICAgICAgICAgYk1pbnVzID0gKHN0ci5jaGFyQXQoMCkgPT0gIi0iKTsKKyAgICAgICAgICAgIHN0YXJ0QXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgZGlnaXRzCisgICAgICAgIHZhciB2YWx1ZSA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB2YXIgYkdvdERpZ2l0cyA9IGZhbHNlOworICAgICAgICBmb3IoIGkgaW4gc3RhcnRBdCAuLi4gc3RyLmxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIHZhciBkaWdpdCA9IEpTT05Db25zdGFudHMuREVDSU1BTF9ESUdJVFNbY2hdOworICAgICAgICAgICAgaWYoIGRpZ2l0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiR290RGlnaXRzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGRlY2ltYWwgZGlnaXRzCisgICAgICAgICAgICB2YWx1ZSA9IEludDY0Lm11bCggdmFsdWUsIEludDY0Lm1ha2UoMCwxMCkpOworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5hZGQoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsZGlnaXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgcGVuZGluZyBtaW51cyBzaWduLCBpZiBhcHBsaWNhYmxlCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBlZGdlIGNhc2UgTUlOX0lOVDY0IGNvcnJlY3RseQorICAgICAgICBpZiggYk1pbnVzICYmIChJbnQ2NC5jb21wYXJlKHZhbHVlLEludDY0Lm1ha2UoMCwwKSkgPiAwKSkgeworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5uZWcoIHZhbHVlKTsKKyAgICAgICAgICAgIGJNaW51cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgYkdvdERpZ2l0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkRvdWJsZSgpIDogRmxvYXQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMocmVhZGVyLlBlZWsoKSkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkgeworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5OYU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORikgeworICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICEgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyAtIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIEVzY2FwZU51bWJlcnMoKSA9PSB0cnVlCisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjayAtIHdlIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSB2YWxpZCBkaWdpdAorICAgICAgICB2YXIgZHViID0gU3RkLnBhcnNlRmxvYXQoIHN0cik7CisgICAgICAgIGlmKCAoc3RyLmxlbmd0aCA9PSAwKSB8fCBNYXRoLmlzTmFOKGR1YikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkdWI7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQmFzZTY0KCkgOiBCeXRlcworICAgIHsKKyAgICAgICAgdmFyIHN0ciA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5MQlJBQ0UpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OT2JqZWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDRSk7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJ5dGVzRnJvbVN0cmluZyggc3RyIDogU3RyaW5nKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHJldHVybiBidWYuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFN0cmluZ0Zyb21CeXRlcyggYnVmIDogQnl0ZXMpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWYpOworICAgICAgICBpZiggYnVmLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOyAgLy8gcmVhZFN0cmluZygpIHdvdWxkIHJldHVybiBudWxsIGluIHRoYXQgY2FzZSwgd2hpY2ggaXMgd3JvbmcKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBidWYubGVuZ3RoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgcmV0dXJuIHN0cjsgIC8vIG5vIG5lZWQgdG8gZGVjb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFV0ZjguZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEhleFZhbChjaGFyIDogU3RyaW5nKSA6IEludCB7CisgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuSEVYX0RJR0lUU1tjaGFyXTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0V4cGVjdGVkIGhleCBjaGFyYWN0ZXI6ICRjaGFyJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggbmliYmxlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhDaGFyKG5pYmJsZSA6IEludCkgOiBTdHJpbmcKKyAgICB7CisgICAgICAgIHJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KG5pYmJsZSAmIDB4MEYpOworICAgIH0KKworCit9CisKKworQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkNvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09NTUEgPSAiLCI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09MT04gPSAiOiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNFID0gInsiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFJCUkFDRSA9ICJ9IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBMQlJBQ0tFVCA9ICJbIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0tFVCA9ICJdIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBRVU9URSA9ICJcIiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQkFDS1NMQVNIID0gIlxcIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ1NFUSA9ICJcXHUiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkFOID0gIk5hTiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfUE9TX0lORiA9ICJJbmZpbml0eSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkVHX0lORiA9ICItSW5maW5pdHkiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgVkVSU0lPTiA9IDE7CisgICAgcHVibGljIHN0YXRpYyB2YXIgSlNPTl9DSEFSX1RBQkxFID0gWworICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgImIiLmNvZGUsICJ0Ii5jb2RlLCAibiIuY29kZSwgIDAsICJmIi5jb2RlLCAiciIuY29kZSwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDEsICAxLCAiXCIiLmNvZGUsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSUyAgICAgPSBbJyInLCdcXCcsJy8nLCdiJywnZicsJ24nLCdyJywndCddOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSU19UT19WQUxVRVMgPSBbCisgICAgICAgICJcIiIuY29kZSA9PiAweDIyLAorICAgICAgICAiXFwiLmNvZGUgPT4gMHg1QywKKyAgICAgICAgIi8iLmNvZGUgID0+IDB4MkYsCisgICAgICAgICJiIi5jb2RlICA9PiAweDA4LAorICAgICAgICAiZiIuY29kZSAgPT4gMHgwQywKKyAgICAgICAgIm4iLmNvZGUgID0+IDB4MEEsCisgICAgICAgICJyIi5jb2RlICA9PiAweDBELAorICAgICAgICAidCIuY29kZSAgPT4gMHgwOQorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUNJTUFMX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSEVYX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDksCisgICAgICAgICJBIiA9PiAxMCwKKyAgICAgICAgImEiID0+IDEwLAorICAgICAgICAiQiIgPT4gMTEsCisgICAgICAgICJiIiA9PiAxMSwKKyAgICAgICAgIkMiID0+IDEyLAorICAgICAgICAiYyIgPT4gMTIsCisgICAgICAgICJEIiA9PiAxMywKKyAgICAgICAgImQiID0+IDEzLAorICAgICAgICAiRSIgPT4gMTQsCisgICAgICAgICJlIiA9PiAxNCwKKyAgICAgICAgIkYiID0+IDE1LAorICAgICAgICAiZiIgPT4gMTUKKyAgICBdOworCisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUZfU1RSSU5HX1NJWkUgPSAxNjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfQk9PTCAgID0gJ3RmJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JZVEUgICA9ICdpOCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMTYgICAgPSAnaTE2JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0kzMiAgICA9ICdpMzInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTY0ICAgID0gJ2k2NCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUlVDVCA9ICdyZWMnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9NQVAgICAgPSAnbWFwJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0xJU1QgICA9ICdsc3QnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU0VUICAgID0gJ3NldCc7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IEludCkgOiBTdHJpbmcgeworICAgICAgICBzd2l0Y2ggKHR5cGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOiAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQllURTogICAgIHJldHVybiBOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjogICAgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjogICAgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDogICAgICAgICByZXR1cm4gTkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRTogICAgIHJldHVybiBOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOiAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6ICAgICByZXR1cm4gTkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDogICAgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDogICAgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6ICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE5BTUVTX1RPX1RZUEVTID0gWworICAgICAgICBOQU1FX0JPT0wgICA9PiBUVHlwZS5CT09MLAorICAgICAgICBOQU1FX0JZVEUgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBOQU1FX0kxNiAgICA9PiBUVHlwZS5JMTYsCisgICAgICAgIE5BTUVfSTMyICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgTkFNRV9JNjQgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBOQU1FX0RPVUJMRSA9PiBUVHlwZS5ET1VCTEUsCisgICAgICAgIE5BTUVfU1RSSU5HID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgTkFNRV9TVFJVQ1QgPT4gVFR5cGUuU1RSVUNULAorICAgICAgICBOQU1FX01BUCAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIE5BTUVfU0VUICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgTkFNRV9MSVNUICAgPT4gVFR5cGUuTElTVAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVJREZvclR5cGVOYW1lKG5hbWUgOiBTdHJpbmcpIDogSW50CisgICAgeworICAgICAgICB2YXIgdHlwZSA9IE5BTUVTX1RPX1RZUEVTW25hbWVdOworICAgICAgICBpZiggbnVsbCAhPSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworfQorCisKKy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvUmVhZGluZworLy8gYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzLiBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHByb3RvIDogVEpTT05Qcm90b2NvbCApCisgICAgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisKKy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZQorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sKSB7CisgICAgICAgIHN1cGVyKHByb3RvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICBwcm90by50cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24gb2YgZWFjaCByZWNvcmQKKy8vIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluIGFkZGl0aW9uLAorLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlIGVzY2FwZWQKKy8vIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OUGFpckNvbnRleHQgZXh0ZW5kcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHN1cGVyKCBwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKyAgICBwcml2YXRlIHZhciBjb2xvbiA6IEJvb2wgID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIGNvbG9uID8gSlNPTkNvbnN0YW50cy5DT0xPTiA6IEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiBjb2xvbjsKKyAgICB9Cit9CisKKy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgdmFyIHByb3RvIDogVEpTT05Qcm90b2NvbDsKKyAgICBwcml2YXRlIHZhciBkYXRhIDogQnl0ZXM7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIHJldHZhbCA9IFBlZWsoKTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJ5dGVzIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgcHJvdG8udHJhbnMucmVhZEFsbChidWYsIDAsIDEpOworICAgICAgICAgICAgZGF0YSA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MzU1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVExpc3QuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTGlzdCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlNjI4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4CkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVE1hcCB7CisKKyAgICBwdWJsaWMgdmFyIGtleVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciB2YWx1ZVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhrIDogSW50ID0gMCwgdiA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBrZXlUeXBlID0gazsKKyAgICAgIHZhbHVlVHlwZSA9IHY7CisgICAgICBzaXplID0gczsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MjY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5oeApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNZXNzYWdlIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzZXFpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBzZXFpZCA9IHM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICI8VE1lc3NhZ2UgbmFtZTonIiArIG5hbWUgKyAiJyB0eXBlOiAiICsgdHlwZSArICIgc2VxaWQ6IiArIHNlcWlkICsgIj4iOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob3RoZXI6VE1lc3NhZ2UpIDogQm9vbCB7CisgICAgICByZXR1cm4gbmFtZSA9PSBvdGhlci5uYW1lICYmIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBzZXFpZCA9PSBvdGhlci5zZXFpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZkMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVE1lc3NhZ2VUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBDQUxMICAgICAgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVBMWSAgICAgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFWENFUFRJT04gOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPTkVXQVkgICAgOiBJbnQgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYTNjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKiBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSB2YXIgc2VydmljZVByb2Nlc3Nvck1hcCA6IFN0cmluZ01hcDxUUHJvY2Vzc29yPiA9IG5ldyBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIHZhciBkZWZhdWx0UHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICoKKyAgICAgKiBBcmdzOgorICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAqICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVnaXN0ZXJQcm9jZXNzb3Ioc2VydmljZU5hbWUgOiBTdHJpbmcsIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsIGFzRGVmYXVsdCA6IEJvb2wgPSBmYWxzZSkgOiBWb2lkIHsKKyAgICAgICAgc2VydmljZVByb2Nlc3Nvck1hcC5zZXQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIGlmICggYXNEZWZhdWx0KSB7CisgICAgICAgICAgICBpZiggZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV04sICJDYW4ndCBoYXZlIG11bHRpcGxlIGRlZmF1bHQgcHJvY2Vzc29ycyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEZhaWwoIG9wcm90IDogVFByb3RvY29sLCBtZXNzYWdlIDogVE1lc3NhZ2UsIGV4dHlwZSA6IEludCwgZXR4dCA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggZXh0eXBlLCBldHh0KTsKKworICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1lc3NhZ2Uuc2VxaWQpOworCisgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOworICAgICAgICBhcHBleC53cml0ZSggb3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAqCisgICAgICogLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICogLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgKiAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICogLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLgorICAgICAqCisgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgorICAgICAqIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIHsKKyAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuICovCisKKyAgICAgICAgdmFyIG1lc3NhZ2UgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIG1ldGhvZE5hbWUgOiBTdHJpbmcgPSAiIjsKKworICAgICAgICBpZiAoKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCkgJiYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSkKKyAgICAgICAgeworICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICB2YXIgYWN0dWFsUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisgICAgICAgIHZhciBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gZGVmYXVsdFByb2Nlc3NvcjsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIiBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNlcnZpY2UgbmFtZSBnaXZlbgorICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZyggc2VydmljZU5hbWUubGVuZ3RoICsgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLmxlbmd0aCk7CisgICAgICAgICAgICBhY3R1YWxQcm9jZXNzb3IgPSBzZXJ2aWNlUHJvY2Vzc29yTWFwLmdldCggc2VydmljZU5hbWUpOworICAgICAgICAgICAgaWYoIGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoIG1ldGhvZE5hbWUsIG1lc3NhZ2UudHlwZSwgbWVzc2FnZS5zZXFpZCk7CisgICAgICAgIHZhciBzdG9yZWRNc2cgPSBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCBpcHJvdCwgbmV3TWVzc2FnZSk7CisgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IucHJvY2Vzcyggc3RvcmVkTXNnLCBvcHJvdCk7CisgICAgfQorfQorCisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSB2YXIgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90b2NvbCA6IFRQcm90b2NvbCwgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIoIHByb3RvY29sKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VCZWdpbjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNkMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmh4CkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAqIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgKiBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICoKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworCisgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VQQVJBVE9SIDogU3RyaW5nID0gIjoiOworCisgICAgcHJpdmF0ZSB2YXIgc2VydmljZSA6IFN0cmluZzsKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCisgICAgICogIHNlcnZpY2VOYW1lICAgICBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIDogU3RyaW5nKSAgICB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAqIEFyZ3M6CisgICAgICogICB0TWVzc2FnZSAgICAgVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCBtZXNzYWdlIDogVE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIHN3aXRjaCggbWVzc2FnZS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DQUxMOgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSArIFNFUEFSQVRPUiArIG1lc3NhZ2UubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcWlkKSk7CisKKyAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YzODQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBQcm90b2NvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgorKi8KK2ludGVyZmFjZSBUUHJvdG9jb2wgeworCisgICAgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0OworCisgICAgLyoqCisgICAgICogV3JpdGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTE2KGkxNiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWIgOiBGbG9hdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbiA6IEJ5dGVzKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisgICAgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlOworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3Q7CisgICAgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpOlRGaWVsZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCk6VE1hcDsKKyAgICBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKTpUU2V0OworICAgIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQ7CisgICAgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQ7CisgICAgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nOworICAgIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzOworCisgICAgLy8gcmVjdXJzaW9uIHRyYWNraW5nCisgICAgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjllOTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgKiBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMKKyAqIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICogaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAqCisgKiBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgKiBTZWUgVE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGltcGxlbWVudHMgVFByb3RvY29sCit7CisgICAgcHJpdmF0ZSB2YXIgd3JhcHBlZCA6IFRQcm90b2NvbDsKKworICAgIC8qKgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wpICAvLyBub3QgdG8gYmUgaW5zdGFudGlhdGVkLCBtdXN0IGRlcml2ZSBhIGNsYXNzCisgICAgeworICAgICAgICB3cmFwcGVkID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUcmFuc3BvcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlIDogVE1lc3NhZ2UpIDogVm9pZCAgICB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbih2YWx1ZSA6IFRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKHZhbHVlIDogVEZpZWxkKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRmllbGRCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCB2YWx1ZSA6IFRNYXApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oIHZhbHVlIDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggdmFsdWUgOiBUU2V0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCh2YWx1ZSA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCb29sKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSh2YWx1ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUJ5dGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMTYoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMzIoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQodmFsdWUgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTY0KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKHZhbHVlIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVEb3VibGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcodmFsdWUgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJpbmcoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkodmFsdWUgOiBCeXRlcyApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCaW5hcnkoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpIDogVE1lc3NhZ2UgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKSA6IFRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1hcEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpIDogVExpc3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTGlzdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU2V0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbAorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMTYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEkzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEk2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCkgOiBGbG9hdCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCaW5hcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMzdhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9EQVRBIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTkVHQVRJVkVfU0laRSA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNJWkVfTElNSVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfVkVSU0lPTiA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5PVF9JTVBMRU1FTlRFRCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFUFRIX0xJTUlUIDogSW50ID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKKworfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmQ2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkgeworICAgICBmdW5jdGlvbiBnZXRQcm90b2NvbCh0cmFuczpUVHJhbnNwb3J0KTpUUHJvdG9jb2w7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFlNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKyAgLyoqCisgICAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBwcm90b2NvbCBkYXRhCisgICAqIHN0cmVhbXMuCisgICAqCisgICAqLworY2xhc3MgVFByb3RvY29sVXRpbCB7CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcChwcm90OlRQcm90b2NvbCwgdHlwZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMTYoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMzIoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJNjQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkOlRGaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgICAgICB2YXIgbWFwOlRNYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gMCAuLi4gbWFwLnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLmtleVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICAgICAgICAgICAgICB2YXIgc2V0OlRTZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMCAuLi4gc2V0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3Q6VExpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDAgLi4uIGxpc3Quc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAiVW5rbm93biBmaWVsZCB0eXBlICR7dHlwZX0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGU6RHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDIxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFJlY3Vyc2lvblRyYWNrZXIuaHgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKKworCitjbGFzcyBUUmVjdXJzaW9uVHJhY2tlciB7CisKKyAgICAvLyBkZWZhdWx0CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA6IEludCA9IDY0OworCisgICAgLy8gbGltaXQgYW5kIGFjdHVhbCB2YWx1ZQorICAgIHB1YmxpYyB2YXIgcmVjdXJzaW9uTGltaXQgOiBJbnQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKKyAgICBwcml2YXRlIHZhciByZWN1cnNpb25EZXB0aCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA8IHJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZAorICAgIHsKKyAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUU2V0IHsKKworICAgIHB1YmxpYyB2YXIgZWxlbVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHQgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAgICBlbGVtVHlwZSA9IHQ7CisgICAgICAgIHNpemUgPSBzOworICAgICAgfQorCit9ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTdHJ1Y3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwYjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFN0cnVjdCB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIikgeworICAgICAgbmFtZSA9IG47CisgICAgfQorCit9ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiYmM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UVHlwZS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVFR5cGUoSW50KSAgZnJvbSBJbnQgdG8gSW50ICB7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUT1AgOiBJbnQgICA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFZPSUQgOiBJbnQgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0wgOiBJbnQgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJZVEUgOiBJbnQgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiA6IEludCAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiA6IEludCAgICA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEk2NCA6IEludCAgICA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJJTkcgOiBJbnQgPSAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUIDogSW50ID0gMTI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCA6IEludCAgICA9IDEzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTRVQgOiBJbnQgICAgPSAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCA6IEludCAgID0gMTU7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oeApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworY2xhc3MgVFNlcnZlcgoreworICAgIHByaXZhdGUgdmFyIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisKKyAgICAvLyBzZXJ2ZXIgZXZlbnRzCisgICAgcHVibGljIHZhciBzZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKworICAgIC8vIExvZyBkZWxlZ2F0aW9uCisgICAgcHJpdmF0ZSB2YXIgX2xvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCAgPSBudWxsOworICAgIHB1YmxpYyB2YXIgbG9nRGVsZWdhdGUoZ2V0LHNldCkgOiBEeW5hbWljLT5Wb2lkOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvY2Vzc29yIDogVFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkKKyAgICB7CisgICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gbG9nRGVsZWdhdGU7CisKKyAgICAgIEFwcGx5TWlzc2luZ0RlZmF1bHRzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBcHBseU1pc3NpbmdEZWZhdWx0cygpIHsKKyAgICAgICAgaWYoIHByb2Nlc3NvciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHByb2Nlc3NvciBtaXNzaW5nIjsKKyAgICAgICAgaWYoIHNlcnZlclRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHNlcnZlclRyYW5zcG9ydCBtaXNzaW5nIjsKKyAgICAgICAgaWYoIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggaW5wdXRQcm90b2NvbEZhY3RvcnkgID09IG51bGwpCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGxvZ0RlbGVnYXRlID09IG51bGwpCisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSA9IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gc2V0X2xvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYy0+Vm9pZCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2xvZ0RlbGVnYXRlKCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gRGVmYXVsdExvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYykgOiBWb2lkICB7CisgICAgICAgIHRyYWNlKCB2YWx1ZSk7CisgICAgfQorCisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzk5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKKworCisvLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyCitpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zCisgICAgZnVuY3Rpb24gcHJlU2VydmUoKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZworICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoIGlucHV0IDogVFByb3RvY29sLCBvdXRwdXQgOiBUUHJvdG9jb2wpIDogRHluYW1pYzsKKworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dAorICAgIGZ1bmN0aW9uIGRlbGV0ZUNvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IKKyAgICBmdW5jdGlvbiBwcm9jZXNzQ29udGV4dCggc2VydmVyQ29udGV4dCA6IER5bmFtaWMsIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjAwNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisvLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZworY2xhc3MgVFNpbXBsZVNlcnZlciBleHRlbmRzIFRTZXJ2ZXIgIHsKKworICAgIHByaXZhdGUgdmFyIHN0b3AgOiBCb29sID0gZmFsc2U7CisKKyAgICAvL3N0b3BzIGp1c3QgYWZ0ZXIgaW5wdXQgdHJhbnNwb3J0IHJldHVybnMgRU9GCisgICAgLy91c2VmdWwgZm9yIGxpbWl0ZWQgc2NlbmFyaW9zLCBsaWtlIGVtYmVkaW5nIGludG8gcGhwIHNlcnZlcgorICAgIHB1YmxpYyB2YXIgcnVuT25jZSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSB7CisgICAgICBzdXBlciggcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBsb2dnZXIpOworICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFNlcnZlKCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICh0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwLAorICAgICAgICAvLyBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlKCAhIHN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjbGllbnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIGlucHV0UHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29udGV4dCA6IER5bmFtaWMgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoIGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgcHJvY2Vzc29yLnByb2Nlc3MoIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHR0eCA6IFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmKHJ1bk9uY2UgJiYgdHR4LmVycm9ySUQgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICAgICAgICAgICAgLy9pbnB1dCByZXR1cm5zIGVvZiwgZXhpdAorICAgICAgICAgICAgICAgICAgLy9mb2xsb3dzIGxpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgICAgICAgICAgICAgICAgIFN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggcGV4IDogVFByb3RvY29sRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCckcGV4ICR7cGV4LmVycm9ySUR9ICR7cGV4LmVycm9yTXNnfScpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoZSk7IC8vIFVuZXhwZWN0ZWQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoY2xpZW50ICE9IG51bGwgJiYgIXJ1bk9uY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQKKyAgICB7CisgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzM2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8vIGNvbnN0YW50cworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX0JVRlNJWkUgOiBJbnQgPSAweDEwMDA7ICAgIC8vIDQwOTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUlOX0JVRlNJWkUgOiBJbnQgPSAweDEwMDsgICAgICAgICAvLyAyNTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUFYX0JVRlNJWkUgOiBJbnQgPSAweDEwMDAwMDsgICAgICAvLyAxIE1CCisKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgIHB1YmxpYyB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvLyBCdWZmZXIgZm9yIGlucHV0L291dHB1dAorICAgIHByaXZhdGUgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXJfIDogQnl0ZXNPdXRwdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBidWZTaXplIDogSW50ID0gREVGQVVMVF9CVUZTSVpFKSB7CisKKyAgICAgICAgLy8gZW5zdXJlIGJ1ZmZlciBzaXplIGlzIGluIHRoZSByYW5nZQorICAgICAgICBpZiAoIGJ1ZlNpemUgPCBNSU5fQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNSU5fQlVGU0laRTsKKyAgICAgICAgZWxzZSBpZiggYnVmU2l6ZSA+IE1BWF9CVUZTSVpFKQorICAgICAgICAgICAgYnVmU2l6ZSA9IE1BWF9CVUZTSVpFOworCisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gQnl0ZXMuYWxsb2MobGVuKTsKKworICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVmZmVyaW5nIHdoZW5ldmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBsZW5ndGggZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoIGxlbiA+PSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSB0cmFuc3BvcnQucmVhZCggYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwgMCwgZ290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoIHJlYWRDaHVuaygpIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlYWRDaHVuaygpIDogSW50IHsKKyAgICAgICAgdmFyIHNpemUgPSBidWZTaXplOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUNodW5rKGZvcmNlV3JpdGUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggd3JpdGVCdWZmZXJfLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGlmICggZm9yY2VXcml0ZSB8fCAod3JpdGVCdWZmZXJfLmxlbmd0aCA+PSBidWZTaXplKSkgeworICAgICAgICAgICAgICAgIHZhciBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBoYWxmU2l6ZSA6IEludCA9IFN0ZC5pbnQoYnVmU2l6ZSAvIDIpOworCisgICAgICAgIC8vIE5vIHBvaW50IGluIGJ1ZmZlcmluZyBpZiBsZW4gZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgbGVzcyB0aGFuIGhhbGYgZnVsbCB3ZSBzaG91bGQgc3RpbGwgY29uc2lkZXIKKyAgICAgICAgLy8gc3F1YXNoaW5nIGFsbCBpbnRvIG9uZSB3cml0ZSwgZXhjZXB0IHdoZW4gdGhlIGFjdHVhbCB3cml0ZSBsZW4gaXMgdmVyeSBsYXJnZS4KKyAgICAgICAgdmFyIGh1Z2Vfd3JpdGUgOiBCb29sID0gKGxlbiA+PSAoMiAqIGJ1ZlNpemUpKTsKKyAgICAgICAgdmFyIGV4Y2VlZHNfYnVmIDogQm9vbCA9IGh1Z2Vfd3JpdGUgfHwgKGxlbiA+PSBidWZTaXplKTsKKyAgICAgICAgdmFyIHdyaXRlX3RocnUgOiBCb29sID0gZXhjZWVkc19idWYgJiYgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gaGFsZlNpemUpOworICAgICAgICBpZiAoIHdyaXRlX3RocnUpIHsKKyAgICAgICAgICAgIHdyaXRlQ2h1bmsodHJ1ZSk7IC8vIGZvcmNlIHNlbmQgd2hhdGV2ZXIgd2UgaGF2ZSBpbiB0aGVyZQorICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOyAgLy8gd3JpdGUgdGhydQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICB3cml0ZUNodW5rKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaCggY2FsbGJhY2sgOiBEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICB3cml0ZUNodW5rKHRydWUpOworICAgICAgICB0cmFuc3BvcnQuZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzllNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgYnVmU2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoYnVmU2l6ZSA6IEludCA9IFRCdWZmZXJlZFRyYW5zcG9ydC5ERUZBVUxUX0JVRlNJWkUpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChiYXNlLCBidWZTaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhhZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworCisKK2VudW0gVEZpbGVNb2RlIHsKKyAgICBDcmVhdGVOZXc7CisgICAgQXBwZW5kOworICAgIFJlYWQ7Cit9CisKKworY2xhc3MgVEZpbGVTdHJlYW0gaW1wbGVtZW50cyBUU3RyZWFtIHsKKworICAgIHB1YmxpYyB2YXIgRmlsZU5hbWUoZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIElucHV0ICA6IHN5cy5pby5GaWxlSW5wdXQ7CisgICAgcHJpdmF0ZSB2YXIgT3V0cHV0IDogc3lzLmlvLkZpbGVPdXRwdXQ7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGZuYW1lIDogU3RyaW5nLCBtb2RlIDogVEZpbGVNb2RlKSB7CisgICAgICAgIEZpbGVOYW1lID0gZm5hbWU7CisgICAgICAgIHN3aXRjaCAoIG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLkNyZWF0ZU5ldzoKKyAgICAgICAgICAgICAgICBPdXRwdXQgPSBzeXMuaW8uRmlsZS53cml0ZSggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5BcHBlbmQ6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUuYXBwZW5kKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLlJlYWQ6CisgICAgICAgICAgICAgICAgSW5wdXQgPSBzeXMuaW8uRmlsZS5yZWFkKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG1vZGUiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIElucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElucHV0LmNsb3NlKCk7CisgICAgICAgICAgICBJbnB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBPdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIE91dHB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUGVlaygpIDogQm9vbCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiAoISBJbnB1dC5lb2YoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IEludCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiBJbnB1dC5yZWFkQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBvdXRwdXQiKTsKKworICAgICAgICBPdXRwdXQud3JpdGVCeXRlcyggYnVmLCBvZmZzZXQsIGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQgeworICAgICAgICBpZiggT3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICBPdXRwdXQuZmx1c2goKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmODJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKKy8qKgorICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCisgKiBldmVyeSB0aW1lIGJ5IHByZWNlZGluZyBtZXNzYWdlcyB3aXRoIGEgNC1ieXRlIGZyYW1lIHNpemUuCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOworCisgICAgdmFyIG1heExlbmd0aF8gOiAgSW50OworCisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICB2YXIgdHJhbnNwb3J0XyA6ICBUVHJhbnNwb3J0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3Igb3V0cHV0CisgICAgICovCisgICAgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIGlucHV0CisgICAgICovCisgICAgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBtYXhMZW5ndGggOiBJbnQgPSBERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydF8ub3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIGlmICgocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgJiYgKHJlYWRCdWZmZXJfLnBvc2l0aW9uIDwgcmVhZEJ1ZmZlcl8ubGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHZhciBnb3QgOiBJbnQgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIHJlYWRGcmFtZSgpOworCisgICAgICAgICAgICB2YXIgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZVNpemUoKSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgbGVuID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgNCBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZnVuY3Rpb24gcmVhZEZyYW1lKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkRnJhbWVTaXplKCk7CisKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoJHNpemUpIScpOworICAgICAgICB9OworICAgICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0ZyYW1lIHNpemUgKCRzaXplKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgkbWF4TGVuZ3RoXykhJyk7CisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnRfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXyA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgZnVuY3Rpb24gd3JpdGVGcmFtZVNpemUobGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQzMihsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSBidWYubGVuZ3RoOworICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKworICAgICAgICB3cml0ZUZyYW1lU2l6ZShsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy5mbHVzaChjYWxsYmFjayk7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDVhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHZhciBtYXhMZW5ndGhfIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtYXhMZW5ndGggOiBJbnQgPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtYXhMZW5ndGhfID0gbWF4TGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoYmFzZSA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydChiYXNlLCBtYXhMZW5ndGhfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzI4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGZsYXNoLmVycm9ycy5FT0ZFcnJvcjsKK2ltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLklPRXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuUHJvZ3Jlc3NFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXI7CitpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3Q7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3RNZXRob2Q7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKK2ltcG9ydCBmbGFzaC51dGlscy5JRGF0YU91dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGZsYXNoLm5ldC5Tb2NrZXQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsKKworCisgICAgLyoqCisgICAgICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisgICAgICogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBVbmxpa2UgSHR0cCBDbGllbnQsIGl0IHVzZXMgYSBzaW5nbGUgUE9TVCwgYW5kIGNodW5rLWVuY29kaW5nIHRvIHRyYW5zZmVyIGFsbCBtZXNzYWdlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBjbGFzcyBURnVsbER1cGxleEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgcmVzb3VyY2UgIDogIFN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc3RyaXBwZWQgIDogIEJvb2wgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlucHV0IDogSURhdGFJbnB1dDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogSURhdGFPdXRwdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIGJ5dGVzSW5DaHVuayAgOiAgSW50ID0gMDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgQ1JMRiA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgZXZlbnREaXNwYXRjaGVyIDogRXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoaG9zdCAgOiAgU3RyaW5nLCBwb3J0ICA6ICBJbnQsIHJlc291cmNlICA6ICBTdHJpbmcpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEzKTsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEwKTsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnN0cmlwcGVkID0gZmFsc2U7CisgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCJCeXRlcyByZW1haW5lZDoiICsgc29ja2V0LmJ5dGVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LmJ5dGVzQXZhaWxhYmxlPjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlcywgb2ZmICA6ICBJbnQsIGxlbiAgOiAgSW50KSAgOiAgSW50CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuMSAgOiAgSW50ID0gMCwgbjIgIDogIEludCA9IDAsIG4zICA6ICBJbnQgPSAwLCBuNCAgOiAgSW50ID0gMCwgY2lkeCAgOiAgSW50ID0gMjsKKyAgICAgICAgICAgIHZhciBjaHVua1NpemUgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXN0cmlwcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBuMjsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBuMzsKKyAgICAgICAgICAgICAgICAgICAgbjMgPSBuNDsKKyAgICAgICAgICAgICAgICAgICAgbjQgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKG4xID09IDEzKSAmJiAobjIgPT0gMTApICYmIChuMyA9PSAxMykgJiYgKG40ID09IDEwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjaHVuayBzaXplCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzSW5DaHVuayA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMSk7CisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjIpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayA9IHBhcnNlSW50KGNodW5rU2l6ZS50b1N0cmluZygpLCAxNik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5wdXQucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGRlYnVnQnVmZmVyKGJ1Zik7CisgICAgICAgICAgICAgICAgYnl0ZXNJbkNodW5rIC09IGxlbjsKKworICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlICA6ICAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucmVhZFVURkJ5dGVzKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBFT0ZFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yOiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGRlYnVnQnVmZmVyKGJ1ZiA6IEJ5dGVzKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVidWcgIDogIFN0cmluZyA9ICJCVUZGRVIgPj4iOworICAgICAgICAgICAgdmFyIGkgIDogIEludDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gYnVmW2ldIGFzIGludDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyArPSAiICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKGRlYnVnICsgIjw8Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgb2J1ZmZlci53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSAgOiAgU3RyaW5nLCBsaXN0ZW5lciA6IEZ1bmN0aW9uLCB1c2VDYXB0dXJlICA6ICBCb29sID0gZmFsc2UsIHByaW9yaXR5ICA6ICBJbnQgPSAwLCB1c2VXZWFrUmVmZXJlbmNlICA6ICBCb29sID0gZmFsc2UpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUsIHByaW9yaXR5LCB1c2VXZWFrUmVmZXJlbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTk5FQ1QsIHNvY2tldENvbm5lY3RlZCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgc29ja2V0RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihTZWN1cml0eUVycm9yRXZlbnQuU0VDVVJJVFlfRVJST1IsIHNvY2tldFNlY3VyaXR5RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihQcm9ncmVzc0V2ZW50LlNPQ0tFVF9EQVRBLCBzb2NrZXREYXRhSGFuZGxlcik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudCA6IEV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoICJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSG9zdCA6ICAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlci1BZ2VudCA6ICBUaHJpZnQvSGF4ZVxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRyYW5zZmVyLUVuY29kaW5nIDogIGNodW5rZWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb250ZW50LXR5cGUgOiAgYXBwbGljYXRpb24veC10aHJpZnRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJBY2NlcHQgOiAgKi8qXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQgOiBJT0Vycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvciA6ICAiICsgZXZlbnQudGV4dCkpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudCA6IFNlY3VyaXR5RXJyb3JFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIlNlY3VyaXR5IEVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50IDogUHJvZ3Jlc3NFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIkdvdCBEYXRhIGNhbGw6IiAraW9DYWxsYmFjayk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobnVsbCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2sgOiBFcnJvci0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJzZXQgY2FsbGJhY2s6IiArIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYodGhpcy5vYnVmZmVyLmxlbmd0aC50b1N0cmluZygxNikpOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyhDUkxGKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXModGhpcy5vYnVmZmVyKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5mbHVzaCgpOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIG5ldyBGbGV4IHNkayAzLjUKKyAgICAgICAgICAgIC8vdGhpcy5vYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICB0aGlzLm9idWZmZXIgPSBuZXcgQnl0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHRoaXMuc29ja2V0ID09IG51bGwgPyBmYWxzZSAgOiAgdGhpcy5zb2NrZXQuY29ubmVjdGVkKTsKKyAgICAgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmODY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworaW1wb3J0IGhheGUuSHR0cDsKKworCisKKy8qKgorKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyovCisKK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwcml2YXRlIHZhciByZXF1ZXN0QnVmZmVyXyAgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIHJlc3BvbnNlQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdF8gICAgICAgIDogSHR0cCA9IG51bGw7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHJlcXVlc3RVcmwgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgICAgcmVxdWVzdF8gPSBuZXcgSHR0cChyZXF1ZXN0VXJsKTsKKyAgICAgICAgcmVxdWVzdF8uYWRkSGVhZGVyKCAiY29udGVudFR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmOkJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAocmVzcG9uc2VCdWZmZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhID1CeXRlcy5hbGxvYyhsZW4pOworICAgICAgICBsZW4gPSByZXNwb25zZUJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsMCxsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgcmVxdWVzdEJ1ZmZlcl8ud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID0gbnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IHJlcXVlc3RCdWZmZXJfOworICAgICAgICByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBudWxsOworCisgICAgICAgIHJlcXVlc3RfLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRtcC5hZGRTdHJpbmcoZGF0YSk7CisgICAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCh0bXAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLm9uRXJyb3IgPSBmdW5jdGlvbihtc2cgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGlmKCBjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvcjogIiArIG1zZykpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLnNldFBvc3REYXRhKGJ1ZmZlci5nZXRCeXRlcygpLnRvU3RyaW5nKCkpOworICAgICAgICByZXF1ZXN0Xy5yZXF1ZXN0KHRydWUvKlBPU1QqLyk7CisgICAgfQorCit9CisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhZGIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oeApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUucmVtb3RpbmcuU29ja2V0UHJvdG9jb2w7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKy8vaW1wb3J0IGZsYXNoLm5ldC5TZXJ2ZXJTb2NrZXQ7IC0gbm90IHlldCBhdmFpbGFibGUgb24gSGF4ZSAzLjEuMworI2lmICEgKGZsYXNoIHx8IGh0bWw1KQorCitpbXBvcnQgc3lzLm5ldC5Ib3N0OworCisKK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIC8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0CisgICAgcHJpdmF0ZSB2YXIgX3NvY2tldCA6IFNvY2tldD0gbnVsbDsKKworICAgIC8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0CisgICAgcHJpdmF0ZSB2YXIgX2NsaWVudFRpbWVvdXQgOiBGbG9hdCA9IDU7CisKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKKyAgICBwcml2YXRlIHZhciBfdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KD9hZGRyZXNzIDogU3RyaW5nID0gJ2xvY2FsaG9zdCcsICBwb3J0IDogSW50LCBjbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1LCB1c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2UpCisgICAgeworICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBfc29ja2V0LmJpbmQoIG5ldyBIb3N0KGFkZHJlc3MpLCBwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0NvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgJHBvcnQ6ICRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiAhcGhwCisgICAgICAgICAgICAgICAgX3NvY2tldC5saXN0ZW4oMSk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhY2NlcHRlZCA9IF9zb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVFNvY2tldC5mcm9tU29ja2V0KGFjY2VwdGVkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUaW1lb3V0KCBfY2xpZW50VGltZW91dCk7CisKKyAgICAgICAgICAgIGlmKCBfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJidWZmZXJlZCB0cmFuc3BvcnQgbm90IHlldCBzdXBwb3J0ZWQiOyAgLy8gVE9ETworICAgICAgICAgICAgICAgIC8vcmVzdWx0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4OTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBBY2NlcHQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB2YXIgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOworICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQxYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmh4CkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworI2Vsc2VpZiBqcworaW1wb3J0IGpzLmh0bWwuV2ViU29ja2V0OworI2Vsc2UKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworI2VuZAorCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKworI2lmICEgKGZsYXNoIHx8IGpzKQoraW1wb3J0IHN5cy5uZXQuSG9zdDsKKyNlbmQKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydCAgeworCisgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBIb3N0OworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIHNvY2tldCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbmQKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIGlucHV0IDogRHluYW1pYyA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogV2ViU29ja2V0ID0gbnVsbDsKKyAgICAjZWxzZWlmIGZsYXNoCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBTb2NrZXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IElucHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBPdXRwdXQgPSBudWxsOworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHRpbWVvdXQgOiBGbG9hdCA9IDMwOworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjayA6IFRFeGNlcHRpb24tPlZvaWQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHJlYWRDb3VudCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgOiBTdHJpbmcsIHBvcnQgIDogIEludCkgIDogIFZvaWQgIHsKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdGhpcy5ob3N0ID0gbmV3IEhvc3QoaG9zdCk7CisgICAgICAgICNlbmQKKworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgICNpZiAhIChmbGFzaCB8fCBqcykKKyAgICAvLyB1c2VkIGJ5IFRTb2NrZXRTZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Tb2NrZXQoIHNvY2tldCA6IFNvY2tldCkgOiBUU29ja2V0ICB7CisgICAgICAgIHZhciBzb2NrZXRIb3N0ID0gc29ja2V0Lmhvc3QoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUU29ja2V0KHNvY2tldEhvc3QuaG9zdC50b1N0cmluZygpLCBzb2NrZXRIb3N0LnBvcnQpOworICAgICAgICByZXN1bHQuYXNzaWduU29ja2V0KHNvY2tldCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICNlbmQKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkICB7CisgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgb3V0cHV0ID0gbnVsbDsKKyAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbCAgeworICAgICAgICBpZiggKGlucHV0ID09IG51bGwpIHx8IChzb2NrZXQgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNpZiBmbGFzaAorICAgICAgICAgICAgcmV0dXJuIChpbnB1dC5ieXRlc0F2YWlsYWJsZSA+IDApOworICAgICAgICAgICAgI2Vsc2VpZiBqcworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgdmFyIHJlYWR5ID0gU29ja2V0LnNlbGVjdCggW3NvY2tldF0sIG51bGwsIG51bGwsIDApOworICAgICAgICAgICAgcmV0dXJuIChyZWFkeS5yZWFkLmxlbmd0aCA+IDApOworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgLy8gTWF5IHJldHVybiBsZXNzIGJ5dGVzIHRoYW4gbGVuIHJlcXVpcmVkCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKworICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCByZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LnJlYWRCeXRlKCkpOworICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgICAgICBpZiggaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlN0aWxsIG5vIGRhdGEgIik7ICAvLyBkb24ndCBibG9jaworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG5yID0gbGVuOworICAgICAgICAgICAgd2hpbGUoIG5yIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LmdldChvZmYrbnIpKTsKKyAgICAgICAgICAgICAgICArK25yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2UKKworICAgICAgICAgICAgLy9zb2NrZXQud2FpdEZvclJlYWQoKTsgIC0gIG5vLCB0aGlzIGlnbm9yZXMgdGltZW91dCBhbmQgYmxvY2tzIGluZmluaXRlbHkKKyAgICAgICAgICAgIGlmKHJlYWRDb3VudCA8IG9mZikgeworICAgICAgICAgICAgICAgIGlucHV0LnJlYWQob2ZmLXJlYWRDb3VudCk7CisgICAgICAgICAgICAgICAgcmVhZENvdW50ID0gb2ZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgICAgICB2YXIgZ290ID0gaW5wdXQucmVhZEJ5dGVzKGRhdGEsIDAsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICByZWFkQ291bnQgKz0gZ290OworICAgICAgICAgICAgcmV0dXJuIGdvdDsKKworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRW9mKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnRW9mICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3IgOiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgeworICAgICAgICBpZiggISBpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBub3Qgb3BlbiIpOworICAgICAgICB9CisKKyAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgdmFyIGJ5dGVzID0gbmV3IGZsYXNoLnV0aWxzLkJ5dGVBcnJheSgpOworICAgICAgICB2YXIgZGF0YSA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgYnl0ZXMud3JpdGVCeXRlKGRhdGEuZ2V0KGxlbikpOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmIGpzCisKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBvdXRidWYgPSBuZXcganMuaHRtbC5JbnQ4QXJyYXkoZGF0YS5sZW5ndGgpOworICAgICAgICB2YXIgbGVuID0gMDsKKyAgICAgICAgd2hpbGUoIGxlbiA8IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBvdXRidWYuc2V0KCBbZGF0YS5nZXQobGVuKV0sIGxlbik7CisgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgfQorICAgICAgICB2YXIgYnl0ZXMgPSBvdXRidWYuYnVmZmVyOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgdmFyIGJ5dGVzID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoOworCisgICAgICAgICNlbmQKKworICAgICAgICBvYnVmZmVyID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKworICAgICAgICBpb0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkQ291bnQgPSAwOworCisgICAgICAgICAgICAjaWYganMKKyAgICAgICAgICAgIG91dHB1dC5zZW5kKCBieXRlcyk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgb3V0cHV0LndyaXRlQnl0ZXMoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgICAgICAgICAgI2VuZAorCisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOyAgLy8gc3VjY2VzcyBjYWxsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZSwgbWVzc2FnZSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2soZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiAoc29ja2V0ICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgICNpZiBqcworICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgpOworICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gZnVuY3Rpb24oIGV2ZW50IDoganMuaHRtbC5NZXNzYWdlRXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBldmVudC5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBmbGFzaAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZWxzZWlmIHBocAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKworICAgICAgICAjZWxzZQorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuc2V0QmxvY2tpbmcodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRGYXN0U2VuZCh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworCisgICAgICAgICNlbmQKKworICAgICAgICBhc3NpZ25Tb2NrZXQoIHNvY2tldCk7CisgICAgfQorCisgICAgI2lmIGpzCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBhc3NpZ25Tb2NrZXQoIHNvY2tldCA6IFdlYlNvY2tldCkgIDogIFZvaWQKKyAgICAjZWxzZQorICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpICA6ICBWb2lkCisgICAgI2VuZAorICAgIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0OworICAgICAgICBpbnB1dCA9IHNvY2tldDsKKworICAgICAgICAjZWxzZQorICAgICAgICBvdXRwdXQgPSBzb2NrZXQub3V0cHV0OworICAgICAgICBpbnB1dCA9IHNvY2tldC5pbnB1dDsKKworICAgICAgICAjZW5kCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXQoIHRpbWVvdXQgOiBGbG9hdCApIDogVm9pZCB7CisgICAgICAgIGlmKGlzT3BlbigpKSB7CisgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjNlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW0uaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKKworCitpbnRlcmZhY2UgVFN0cmVhbSB7CisgICAgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gUGVlaygpIDogQm9vbDsKKyAgICBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gV3JpdGUoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhN2MxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRTdHJlYW1UcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyB2YXIgSW5wdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisgICAgcHVibGljIHZhciBPdXRwdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGlucHV0IDogVFN0cmVhbSwgb3V0cHV0IDogVFN0cmVhbSkgeworICAgICAgICB0aGlzLklucHV0U3RyZWFtID0gaW5wdXQ7CisgICAgICAgIHRoaXMuT3V0cHV0U3RyZWFtID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0gIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIElucHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA6IEJ5dGVzID0gIEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgIHZhciBzaXplID0gSW5wdXRTdHJlYW0uUmVhZCggZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKE91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZsdXNoIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgICAgICBpZihjYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLkZsdXNoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMzE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5BYnN0cmFjdE1ldGhvZEVycm9yOworCitjbGFzcyBUVHJhbnNwb3J0IHsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlcmUgbW9yZSBkYXRhIHRvIGJlIHJlYWQ/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlbW90ZSBzaWRlIGlzIHN0aWxsIGFsaXZlIGFuZCBmZWVkaW5nIHVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICAgIHJldHVybiBpc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgaW50byBidWZmZXIgYnVmLCBzdGFydGluZyBhdHQgb2Zmc2V0IG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgYnl0ZXMgY291bnQgYWN0dWFsbHkgcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdmFyIGdvdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldCA9IHJlYWQoYnVmLCBvZmYrZ290LCBsZW4tZ290KTsKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIgKyBnb3QgKyAiIGJ5dGVzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290ICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQWxsKGJ1ZjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdXAgdG8gbGVuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCB0byBzdGFydCB3cml0aW5nIGZyb20KKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDI4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfT1BFTiA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEFMUkVBRFlfT1BFTiA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFRJTUVEX09VVCA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEVORF9PRl9GSUxFIDogSW50ID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgKiBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAqIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICogYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgorICAgICoKKyAgICAqIEBwYXJhbSB0cmFucyBUaGUgYmFzZSB0cmFuc3BvcnQKKyAgICAqIEByZXR1cm4gV3JhcHBlZCBUcmFuc3BvcnQKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworCisvKgorICAgd3JhcHMgcmVhbCB0cmFuc3BvcnQsIHByb3ZpZGVkIGJ5IGNvbnN0cnVjdG9yCisqLworY2xhc3MgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnNwb3J0IDogVFRyYW5zcG9ydCkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZAorICB7CisgIH0KKworICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgeworICAgIHJldHVybiB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvaiBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlZDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9IYXhlVGVzdHMuaHhwcm9qCkBAIC0wLDAgKzEsNjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSIyIj4KKyAgPCEtLSBPdXRwdXQgU1dGIG9wdGlvbnMgLS0+CisgIDxvdXRwdXQ+CisgICAgPG1vdmllIG91dHB1dFR5cGU9IkFwcGxpY2F0aW9uIiAvPgorICAgIDxtb3ZpZSBpbnB1dD0iIiAvPgorICAgIDxtb3ZpZSBwYXRoPSJiaW4vSGF4ZVRlc3RzIiAvPgorICAgIDxtb3ZpZSBmcHM9IjMwIiAvPgorICAgIDxtb3ZpZSB3aWR0aD0iODAwIiAvPgorICAgIDxtb3ZpZSBoZWlnaHQ9IjYwMCIgLz4KKyAgICA8bW92aWUgdmVyc2lvbj0iMSIgLz4KKyAgICA8bW92aWUgbWlub3JWZXJzaW9uPSIwIiAvPgorICAgIDxtb3ZpZSBwbGF0Zm9ybT0iQysrIiAvPgorICAgIDxtb3ZpZSBiYWNrZ3JvdW5kPSIjRkZGRkZGIiAvPgorICA8L291dHB1dD4KKyAgPCEtLSBPdGhlciBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkIGludG8geW91ciBTV0YgLS0+CisgIDxjbGFzc3BhdGhzPgorICAgIDxjbGFzcyBwYXRoPSJzcmMiIC8+CisgICAgPGNsYXNzIHBhdGg9Imdlbi1oYXhlIiAvPgorICAgIDxjbGFzcyBwYXRoPSIuLi9zcmMiIC8+CisgIDwvY2xhc3NwYXRocz4KKyAgPCEtLSBCdWlsZCBvcHRpb25zIC0tPgorICA8YnVpbGQ+CisgICAgPG9wdGlvbiBkaXJlY3RpdmVzPSIiIC8+CisgICAgPG9wdGlvbiBmbGFzaFN0cmljdD0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBub0lubGluZU9uRGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbWFpbkNsYXNzPSJNYWluIiAvPgorICAgIDxvcHRpb24gZW5hYmxlZGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gYWRkaXRpb25hbD0iIiAvPgorICA8L2J1aWxkPgorICA8IS0tIGhheGVsaWIgbGlicmFyaWVzIC0tPgorICA8aGF4ZWxpYj4KKyAgICA8IS0tIGV4YW1wbGU6IDxsaWJyYXJ5IG5hbWU9Ii4uLiIgLz4gLS0+CisgIDwvaGF4ZWxpYj4KKyAgPCEtLSBDbGFzcyBmaWxlcyB0byBjb21waWxlIChvdGhlciByZWZlcmVuY2VkIGNsYXNzZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkKSAtLT4KKyAgPGNvbXBpbGVUYXJnZXRzPgorICAgIDwhLS0gZXhhbXBsZTogPGNvbXBpbGUgcGF0aD0iLi4uIiAvPiAtLT4KKyAgPC9jb21waWxlVGFyZ2V0cz4KKyAgPCEtLSBQYXRocyB0byBleGNsdWRlIGZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgdHJlZSAtLT4KKyAgPGhpZGRlblBhdGhzPgorICAgIDxoaWRkZW4gcGF0aD0ib2JqIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3BwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjc2hhcnAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImZsYXNoLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhc2NyaXB0Lmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5iYXQiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5zaCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Ik1ha2VmaWxlLmFtIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibmVrby5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icGhwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwcm9qZWN0LmhpZGUiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJweXRob24uaHhtbCIgLz4KKyAgPC9oaWRkZW5QYXRocz4KKyAgPCEtLSBFeGVjdXRlZCBiZWZvcmUgYnVpbGQgLS0+CisgIDxwcmVCdWlsZENvbW1hbmQ+dGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iQ3VzdG9tIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iYmluL0hheGVUZXN0cy9NYWluLmV4ZSBzZXJ2ZXIgbXVsdGlwbGV4IiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitBR0dSID0gJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK0JFTkNITUFSSyA9ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisKK0JJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeDogJChUSFJJRlRURVNUKQorCSQoVEhSSUZUQ01EKSAkKFRIUklGVFRFU1QpCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHg6ICQoQUdHUikKKwkkKFRIUklGVENNRCkgJChBR0dSKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4OiAkKEJFTkNITUFSSykKKwkkKFRIUklGVENNRCkgJChCRU5DSE1BUkspCisKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisKKyQoQklOX0NQUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCisKKyNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGZsYXNoCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmEKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YXNjcmlwdAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBuZWtvCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWhheGUgYmluCisKK2NoZWNrOiAkKEJJTl9DUFApICQoQklOX1BIUCkKKwkkKEJJTl9DUFApCisJcGhwIC1mICQoQklOX1BIUCkKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBzcmMgXAorICAgICAgICAgICAgIGNwcC5oeG1sIFwKKyAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCisgICAgICAgICAgICAgZmxhc2guaHhtbCBcCisgICAgICAgICAgICAgamF2YS5oeG1sIFwKKyAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAorICAgICAgICAgICAgIG5la28uaHhtbCBcCisgICAgICAgICAgICAgcGhwLmh4bWwgXAorICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKKyAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAorICAgICAgICAgICAgIEhheGVUZXN0cy5oeHByb2ogXAorICAgICAgICAgICAgIG1ha2VfYWxsLmJhdCBcCisgICAgICAgICAgICAgbWFrZV9hbGwuc2gKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvY3BwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODQ4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NzaGFycC5oeG1sIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM0YjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UZXN0LmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTc2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2ZsYXNoLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVGVzdC5zd2YKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sIGIvbGliL2hheGUvdGVzdC9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1Rlc3QuamFyCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YXNjcmlwdC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDk5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YVNjcmlwdCB0YXJnZXQKKy1qcyBiaW4vVGVzdC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0IGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNzAgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIFNUT1AKKworcmVtICMgaW52b2tlIEhheGUgY29tcGlsZXIgZm9yIGFsbCB0YXJnZXRzCitmb3IgJSVhIGluICgqLmh4bWwpIGRvICgKKwlyZW0gKiBmaWx0ZXIgUHl0aG9uLCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEhheGUgMy4xLjMgKGJ1dCB3aWxsIGJlIGluIDMuMS40KQorCWlmIG5vdCAiJSVhIj09InB5dGhvbi5oeG1sIiAoCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJZWNobyBCdWlsZGluZyAlJWEgLi4uCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJaGF4ZSAgLS1jd2QgLiAgJSVhCisJKQorKQorCisKK2VjaG8uCitlY2hvIGRvbmUuCitwYXVzZQorZ290byBlb2YKKworOk5PVElOU1RBTExFRAorZWNobyBGQVRBTDogRWl0aGVyIEhheGUgaXMgbm90IGluc3RhbGxlZCwgb3IgdGhlIEhBWEVQQVRIIHZhcmlhYmxlIGlzIG5vdCBzZXQuCitwYXVzZQorZ290byBlb2YKKworOk1JU1NJTkdWQVJTCitlY2hvIEZBVEFMOiBVbmFibGUgdG8gbG9jYXRlIGhvbWUgZm9sZGVyLgorZWNoby4KK2VjaG8gQm90aCBIT01FRFJJVkUgYW5kIEhPTUVQQVRIIG5lZWQgdG8gYmUgc2V0IHRvIHBvaW50IHRvIHlvdXIgSG9tZSBmb2xkZXIuCitlY2hvIFRoZSBjdXJyZW50IHZhbHVlcyBhcmU6CitlY2hvIEhPTUVEUklWRT0lSE9NRURSSVZFJQorZWNobyBIT01FUEFUSD0lSE9NRVBBVEglCitwYXVzZQorZ290byBlb2YKKworOlNUT1AKK3BhdXNlCitnb3RvIGVvZgorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLnNoIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJmNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBpbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L25la28uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjcwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UZXN0Lm4KKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjJiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZSBiL2xpYi9oYXhlL3Rlc3QvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDY3IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJUZXN0IgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiIgorICAgICwibGljZW5zZSIgOiAiIgorICAgICwidXJsIiA6ICIiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UZXN0LnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVGVzdC5uIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInBocC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNwcC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL01haW4tZGVidWcuZXhlIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImphdmEuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjc2hhcnAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVGVzdC5weSIKKyAgICAgICAgfQorICAgIF0KKyAgICAsImZpbGVzIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMTMKKyAgICAgICAgfQorICAgIF0KKyAgICAsImFjdGl2ZUZpbGUiIDogInNyY1xcTWFpbi5oeCIKKyAgICAsIm9wZW5GTFRhcmdldCIgOiBudWxsCisgICAgLCJvcGVuRkxCdWlsZE1vZGUiIDogIkRlYnVnIgorICAgICwicnVuQWN0aW9uVHlwZSIgOiBudWxsCisgICAgLCJydW5BY3Rpb25UZXh0IiA6IG51bGwKKyAgICAsImJ1aWxkQWN0aW9uQ29tbWFuZCIgOiBudWxsCisgICAgLCJoaWRkZW5JdGVtcyIgOiBbCisKKyAgICBdCisgICAgLCJzaG93SGlkZGVuSXRlbXMiIDogZmFsc2UKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3B5dGhvbi5oeG1sIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhMTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUHl0aG9uIHRhcmdldAorLXB5dGhvbiBiaW4vVGVzdC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTWFpbi5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyNjJkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworZW51bSBXaGF0VGVzdHMgeworICAgIE5vcm1hbDsKKyAgICBNdWx0aXBsZXg7Cit9CisKK2NsYXNzIE1haW4KK3sKKyAgICBzdGF0aWMgcHJpdmF0ZSB2YXIgdGVzdHMgOiBXaGF0VGVzdHMgPSBOb3JtYWw7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKworICAgIHN0YXRpYyBwcml2YXRlIGlubGluZSB2YXIgQ01ETElORUhFTFAgOiBTdHJpbmcKKyAgICAgICAgPSAiXG5IYXhlVGVzdHMgIFtjbGllbnR8c2VydmVyXSAgW211bHRpcGxleF1cbiIKKyAgICAgICAgKyAiICBjbGllbnR8c2VydmVyICAuLi4gZGV0ZXJtaW5lcyBydW4gbW9kZSBmb3Igc29tZSB0ZXN0cywgZGVmYXVsdCBpcyBjbGllbnRcbiIKKyAgICAgICAgKyAiICBtdWx0aXBsZXggLi4uLi4uLi4gcnVuIG11bHRpcGxleCB0ZXN0IHNlcnZlciBvciBjbGllbnRcbiI7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZUFyZ3MoKSB7CisgICAgICAgICNpZiBzeXMKKworICAgICAgICB2YXIgYXJncyA9IFN5cy5hcmdzKCk7CisgICAgICAgIGlmICggYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCBhcmcgaW4gYXJncykgeworICAgICAgICAgICAgICAgIHN3aXRjaChhcmcudG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGllbnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciIgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibXVsdGlwbGV4IiA6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IE11bHRpcGxleDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBhcmd1bWVudCAiJGFyZyJcbicrQ01ETElORUhFTFA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gbWFpbigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2VBcmdzKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggdGVzdHMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtVGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBjYXNlIE11bHRpcGxleDoKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGV4VGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRlc3QgbW9kZSAkdGVzdHMiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgiQWxsIHRlc3RzIGNvbXBsZXRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZTogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyRlJyk7CisgICAgICAgICAgICAjaWYgc3lzCisgICAgICAgICAgICBTeXMuZXhpdCgxKTsgIC8vIGluZGljYXRlIGVycm9yCisgICAgICAgICAgICAjZW5kCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTXVsdGlwbGV4VGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOGI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gZGVidWcgb25seQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8vIGdlbmVyYXRlZCBjb2RlIGltcG9ydHMKK2ltcG9ydCBBZ2dyOworaW1wb3J0IEFnZ3JJbXBsOworaW1wb3J0IEFnZ3JQcm9jZXNzb3I7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZTsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlSW1wbDsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlUHJvY2Vzc29yOworaW1wb3J0IEVycm9yOworCisKK2NsYXNzIEJlbmNobWFya1NlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQmVuY2htYXJrU2VydmljZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZpYm9uYWNjaShuIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ0JlbmNobWFyay5maWJvbmFjY2koJG4pJyk7CisgICAgICAgIHZhciBuZXh0IDogSW50OworICAgICAgICB2YXIgcHJldiAgID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA9IDE7CisgICAgICAgIHdoaWxlKCBuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCAgID0gcmVzdWx0ICsgcHJldjsKKyAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICAtLW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworY2xhc3MgQWdnclNlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQWdncgoreworICAgIHByaXZhdGUgdmFyIHZhbHVlcyA6IExpc3Q8aGF4ZS5JbnQzMj4gPSBuZXcgTGlzdDxoYXhlLkludDMyPigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkVmFsdWUodmFsdWUgOiBoYXhlLkludDMyKSA6IFZvaWQgICAgeworICAgICAgICB0cmFjZSgnQWdnci5hZGRWYWx1ZSgkdmFsdWUpJyk7CisgICAgICAgIHZhbHVlcy5hZGQoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkgOiBMaXN0PCBoYXhlLkludDMyPiB7CisgICAgICAgIHRyYWNlKCdBZ2dyLmdldFZhbHVlcygpJyk7CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorfQorCisKKworY2xhc3MgTXVsdGlwbGV4VGVzdCBleHRlbmRzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9CRU5DSE1BUktTRVJWSUNFIDogU3RyaW5nID0gIkJlbmNobWFya1NlcnZpY2UiOworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9BR0dSICAgICAgICAgICAgIDogU3RyaW5nICA9ICJBZ2dyIjsKKworCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKCBzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleFNlcnZlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUnVuTXVsdGlwbGV4Q2xpZW50KCk7CisgICAgICAgICAgICBSdW5EZWZhdWx0Q2xpZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biB0aGUgbXVsdGlwbGV4IHNlcnZlcgorICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuTXVsdGlwbGV4U2VydmVyKCkgOiBWb2lkICB7CisgICAgICAgdHJ5CisgICAgICAgeworICAgICAgICAgICAgdmFyIGJlbmNoSGFuZGxlciA6IEJlbmNobWFya1NlcnZpY2UgPSBuZXcgQmVuY2htYXJrU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBiZW5jaFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvciggYmVuY2hIYW5kbGVyKTsKKworICAgICAgICAgICAgdmFyIGFnZ3JIYW5kbGVyIDogQWdnciA9IG5ldyBBZ2dyU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBhZ2dyUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG5ldyBBZ2dyUHJvY2Vzc29yKCBhZ2dySGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IsIHRydWUpOyAgLy8gZGVmYXVsdAorICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOworCisgICAgICAgICAgICAvLyBwcm90b2NvbCt0cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBwcm90ZmFjdCA6IFRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgdmFyIHNlcnZlcnRyYW5zIDogVFNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCA5MDkwLCA1LCBmYWxzZSk7CisgICAgICAgICAgICB2YXIgdHJhbnNmYWN0IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgICAgICAgdmFyIHNlcnZlciA6IFRTZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlciggbXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgdHJhbnNmYWN0LCBwcm90ZmFjdCk7CisKKyAgICAgICAgICAgIHRyYWNlKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm90b2NvbDsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgIHZhciBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9BR0dSKTsKKyAgICAgICAgICAgIHZhciBhZ2dyID0gbmV3IEFnZ3JJbXBsKCBtdWx0aXBsZXgpOworCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyLmFkZCggYmVuY2guZmlibygpKS4uLicpOworICAgICAgICAgICAgZm9yKCBpIGluIDEgLi4uIDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCckaScpOworICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGFnZ3IgLi4uJyk7CisgICAgICAgICAgICB2YXIgaSA9IDE7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gYWdnci5nZXRWYWx1ZXMoKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCh2YWx1ZXMgIT0gbnVsbCwnYWdnci5nZXRWYWx1ZXMoKSA9PSBudWxsJyk7CisgICAgICAgICAgICBmb3IoIGsgaW4gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdmaWIoJGkpID0gJGsnKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyR7ZS5lcnJvcklEfSAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biBub24tbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIgdG8gdGVzdCBkZWZhdWx0IGZhbGxiYWNrCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5EZWZhdWx0Q2xpZW50KCkgOiBWb2lkICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnMgOiBUVHJhbnNwb3J0OworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIHRyYW5zLm9wZW4oKTsKKworICAgICAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyx0cnVlLHRydWUpOworCisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIHByb3RvY29sKTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYmVuY2ggKHZpYSBkZWZhdWx0KSAuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgayA9IGJlbmNoLmZpYm9uYWNjaShpKTsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvU3RyZWFtVGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBzeXMuRmlsZVN5c3RlbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgdG1wZmlsZSA6IFN0cmluZyA9ICJkYXRhLnRtcCI7CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIE1ha2VUZXN0RGF0YSgpIDogWHRydWN0IHsKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEuc3RyaW5nX3RoaW5nID0gIlN0cmVhbXRlc3QiOworICAgICAgICBkYXRhLmJ5dGVfdGhpbmcgPSAtMTI4OworICAgICAgICBkYXRhLmkzMl90aGluZyA9IDQ3MTE7CisgICAgICAgIGRhdGEuaTY0X3RoaW5nID0gSW50NjQubWFrZSgweDEyMzQ1Njc4LDB4OUFCQ0RFRjApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFdyaXRlRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgQ3JlYXRlTmV3KTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBudWxsLCBzdHJlYW0pOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgPSBNYWtlVGVzdERhdGEoKTsKKyAgICAgICAgZGF0YS53cml0ZShwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJlYWREYXRhKCkgOiBYdHJ1Y3QKKyAgICB7CisgICAgICAgIHZhciBzdHJlYW0gOiBUU3RyZWFtID0gbmV3IFRGaWxlU3RyZWFtKCB0bXBmaWxlLCBSZWFkKTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBzdHJlYW0sIG51bGwpOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEucmVhZChwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgd3JpdHRlbiA9IFdyaXRlRGF0YSgpOworICAgICAgICAgICAgdmFyIHJlYWQgPSBSZWFkRGF0YSgpOworICAgICAgICAgICAgRmlsZVN5c3RlbS5kZWxldGVGaWxlKHRtcGZpbGUpOworCisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuc3RyaW5nX3RoaW5nID09IHdyaXR0ZW4uc3RyaW5nX3RoaW5nLCAic3RyaW5nIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5ieXRlX3RoaW5nID09IHdyaXR0ZW4uYnl0ZV90aGluZywgImJ5dGUgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLmkzMl90aGluZyA9PSB3cml0dGVuLmkzMl90aGluZywgImkzMiBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHJlYWQuaTY0X3RoaW5nLCB3cml0dGVuLmk2NF90aGluZykgPT0gMCwgImk2NCBkYXRhIik7CisKKyAgICAgICAgfSBjYXRjaChlOkR5bmFtaWMpIHsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1Rlc3RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKworY2xhc3MgVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoKSB7CisgICAgICAgIC8vIG92ZXJyaWRlLCBpZiBuZWNlc3NhcnkKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeHBlY3QoIGV4cHIgOiBCb29sLCBpbmZvIDogU3RyaW5nLCA/cG9zIDogaGF4ZS5Qb3NJbmZvcykgOiBWb2lkIHsKKyAgICAgICAgaWYoICEgZXhwcikgeworICAgICAgICAgICAgdGhyb3cgKCdUZXN0ICIkaW5mbyIgZmFpbGVkIGF0ICcrcG9zLm1ldGhvZE5hbWUrJyBpbiAnK3Bvcy5maWxlTmFtZSsnOicrcG9zLmxpbmVOdW1iZXIpOworICAgICAgICB9CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hzL0NNYWtlTGlzdHMudHh0IGIvbGliL2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGEzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgUmVidWlsZCB3aGVuIGFueSBvZiB0aGVzZSBmaWxlcyBjaGFuZ2VzCitzZXQoaGFza2VsbF9zb3VyY2VzCisgICAgc3JjL1RocmlmdC5ocworICAgIHNyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKKyAgICBzcmMvVGhyaWZ0L1NlcnZlci5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1R5cGVzLmhzCisgICAgdGhyaWZ0LmNhYmFsCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgbGlzdChBUFBFTkQgaGFza2VsbF9zb3J1Y2VzCisgICAgICAgIHRlc3QvU3BlYy5ocworICAgICAgICB0ZXN0L0JpbmFyeVNwZWMuaHMKKyAgICAgICAgdGVzdC9Db21wYWN0U3BlYy5ocworICAgICAgICB0ZXN0L0pTT05TcGVjLmhzCisgICAgKQorICAgIHNldChoc19lbmFibGVfdGVzdCAiLS1lbmFibGUtdGVzdHMiKQorZW5kaWYoKQorCitzZXQoaGFza2VsbF9hcnRpZmFjdHMgdGhyaWZ0X2NhYmFsLnN0YW1wKQorIyBBZGRpbmcgKi5oaSBmaWxlcyBzbyB0aGF0IGFueSBtaXNzaW5nIGZpbGUgdHJpZ2dlcnMgdGhlIGJ1aWxkCitmb3JlYWNoKFNSQyAke2hhc2tlbGxfc291cmNlc30pCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChFWCAke1NSQ30gRVhUKQorICAgIGlmKCR7RVh9IFNUUkVRVUFMICIuaHMiKQorICAgICAgICBmaWxlKFJFTEFUSVZFX1BBVEggUkVMICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7U1JDfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChESVIgJHtSRUx9IERJUkVDVE9SWSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChCQVNFICR7UkVMfSBOQU1FX1dFKQorICAgICAgICBsaXN0KEFQUEVORCBoYXNrZWxsX2FydGlmYWN0cyBkaXN0L2J1aWxkLyR7RElSfS8ke0JBU0V9LmhpKQorICAgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQorCitpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2VpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJSZWxlYXNlIikKKyAgICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aGFza2VsbF9hcnRpZmFjdHN9CisgICAgQ09NTUFORCAke0NBQkFMfSB1cGRhdGUKKyAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBmaXJzdCB3aXRob3V0IC0tYnVpbGRkaXIsIG90aGVyd2lzZSBpdCBmYWlscy4KKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1vbmx5LWRlcGVuZGVuY2llcyAke2hzX2VuYWJsZV90ZXN0fQorICAgIENPTU1BTkQgJHtDQUJBTH0gY29uZmlndXJlICR7aHNfb3B0aW1pemV9ICR7aHNfZW5hYmxlX3Rlc3R9IC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGJ1aWxkIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0X2NhYmFsLnN0YW1wCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgREVQRU5EUyAke2hhc2tlbGxfc291cmNlc30KKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGxpYnJhcnkiKQorCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2xpYnJhcnkgQUxMCisgICAgREVQRU5EUyAke2hhc2tlbGxfYXJ0aWZhY3RzfSkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxDYWJhbENoZWNrCisgICAgICAgICAgICBDT01NQU5EICR7Q0FCQUx9IGNoZWNrCisgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxUZXN0CisgICAgICAgICAgICAjIENhYmFsIGZhaWxzIHRvIGZpbmQgYnVpbHQgZXhlY3V0YWJsZSB3aGVuIC0tYnVpbGRkaXIgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgIyBTbyB3ZSBpbnZva2UgdGhlIGV4ZWN1dGFibGUgZGlyZWN0bHkuCisgICAgICAgICAgICAjIENPTU1BTkQgJHtDQUJBTH0gdGVzdCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgICAgICAgICAjIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICAgICAgICAgIENPTU1BTkQgZGlzdC9idWlsZC9zcGVjL3NwZWMpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvaHMvTElDRU5TRSBiL2xpYi9ocy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvTElDRU5TRQpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYi9ocy9NYWtlZmlsZS5hbSBiL2xpYi9ocy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q4YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCUNNYWtlTGlzdHMudHh0IFwKKwlMSUNFTlNFIFwKKwlSRUFETUUubWQgXAorCVNldHVwLmxocyBcCisJVE9ETyBcCisJdGhyaWZ0LmNhYmFsIFwKKwlzcmMgXAorCXRlc3QKKworYWxsLWxvY2FsOgorCSQoQ0FCQUwpIHVwZGF0ZQorCSQoQ0FCQUwpIGluc3RhbGwKKworaW5zdGFsbC1leGVjLWhvb2s6CisJJChDQUJBTCkgaW5zdGFsbAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBIYXNrZWxsIGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJJChDQUJBTCkgY2xlYW4KKworbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKKwkkKENBQkFMKSBjbGVhbgorCitjaGVjay1sb2NhbDoKKwkkKENBQkFMKSBjaGVjaworCSQoQ0FCQUwpIGluc3RhbGwgLS1vbmx5LWRlcGVuZGVuY2llcyAtLWVuYWJsZS10ZXN0cworCSQoQ0FCQUwpIGNvbmZpZ3VyZSAtLWVuYWJsZS10ZXN0cworCSQoQ0FCQUwpIGJ1aWxkCisJJChDQUJBTCkgdGVzdApkaWZmIC0tZ2l0IGEvbGliL2hzL1JFQURNRSBiL2xpYi9ocy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGM4YzkuLjAwMDAwMDAKLS0tIGEvbGliL2hzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLUhhc2tlbGwgVGhyaWZ0IEJpbmRpbmdzCi0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVJ1bm5pbmcKLT09PT09PT0KLQotWW91IG5lZWQgLWZnbGFzZ293LWV4dHMuIFVzZSBDYWJhbCB0byBjb21waWxlIGFuZCBpbnN0YWxsLiBJZiB5b3UncmUgdHJ5aW5nIHRvCi1tYW51YWxseSBjb21waWxlIG9yIGxvYWQgdmlhIGdoY2ksIGFuZCB5b3UncmUgdXNpbmcgZ2hjIDYuMTAgKG9yIHJlYWxseSBpZiB5b3VyCi1kZWZhdWx0IGJhc2UgcGFja2FnZSBoYXMgbWFqb3IgdmVyc2lvbiBudW1iZXIgNCksIHlvdSBtdXN0IHNwZWNpZnkgYSB2ZXJzaW9uIG9mCi10aGUgYmFzZSBwYWNrYWdlIHdpdGggbWFqb3IgdmVyc2lvbiBudW1iZXIgMy4gRnVydGhlcm1vcmUgaWYgeW91IGhhdmUgdGhlIHN5YgotcGFja2FnZSBpbnN0YWxsZWQgeW91IG5lZWQgdG8gaGlkZSB0aGF0IHBhY2thZ2UgdG8gYXZvaWQgaW1wb3J0IGNvbmZsaWN0cy4KLUhlcmUncyBhbiBleGFtcGxlIG9mIHdoYXQgSSdtIHRhbGtpbmcgYWJvdXQ6Ci0KLSAgZ2hjaSAtZmdsYXNnb3ctZXh0cyAtcGFja2FnZSBiYXNlLTMuMC4zLjAgLWhpZGUtcGFja2FnZSBzeWIgLWlzcmMgVGhyaWZ0LmhzCi0KLVRvIGRldGVybWluZSB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgYmFzZSBwYWNrYWdlIHlvdSBoYXZlIGluc3RhbGxlZCB1c2UgdGhlCi1mb2xsb3dpbmcgY29tbWFuZDoKLQotICBnaGMtcGtnIGxpc3QgYmFzZQotCi1BbGwgb2YgdGhpcyBpcyB0YWtlbiBjYXJlIG9mIGZvciB5b3UgaWYgeW91IHVzZSBDYWJhbC4KLQotCi1FbnVtcwotPT09PT0KLQotYmVjb21lIGhhc2tlbGwgZGF0YSB0eXBlcy4gVXNlIGZyb21FbnVtIHRvIGdldCBvdXQgdGhlIGludCB2YWx1ZS4KLQotU3RydWN0cwotPT09PT09PQotCi1iZWNvbWUgcmVjb3Jkcy4gRmllbGQgbGFiZWxzIGFyZSB1Z2x5LCBvZiB0aGUgZm9ybSBmX1NUUlVDVE5BTUVfRklFTEROQU1FLiBBbGwKLWZpZWxkcyBhcmUgTWF5YmUgdHlwZXMuCi0KLUV4Y2VwdGlvbnMKLT09PT09PT09PT0KLQotaWRlbnRpY2FsIHRvIHN0cnVjdHMuIFRocm93IHRoZW0gd2l0aCB0aHJvd0R5bi4gQ2F0Y2ggdGhlbSB3aXRoIGNhdGNoRHluLgotCi1DbGllbnQKLT09PT09PQotCi1qdXN0IGEgYnVuY2ggb2YgZnVuY3Rpb25zLiBZb3UgbWF5IGhhdmUgdG8gaW1wb3J0IGEgYnVuY2ggb2YgY2xpZW50IGZpbGVzIHRvCi1kZWFsIHdpdGggaW5oZXJpdGFuY2UuCi0KLUludGVyZmFjZQotPT09PT09PT09Ci0KLVlvdSBzaG91bGQgb25seSBoYXZlIHRvIGltcG9ydCB0aGUgbGFzdCBvbmUgaW4gdGhlIGNoYWluIG9mIGluaGVyaXRvcnMuIFRvIG1ha2UKLWFuIGludGVyZmFjZSwgZGVjbGFyZSBhIGxhYmVsOgotCi0gIGRhdGEgTXlJZmFjZSA9IE15SWZhY2UKLQotYW5kIHRoZW4gZGVjbGFyZSBpdCBhbiBpbnN0YW5jZSBvZiBlYWNoIGlmYWNlIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBzdXBlcmVzdAotY2xhc3MgYW5kIHByb2NlZGluZyBkb3duIChhbGwgdGhlIHdoaWxlIGRlZmluaW5nIHRoZSBtZXRob2RzKS4gIFRoZW4gcGFzcyB5b3VyCi1sYWJlbCB0byBwcm9jZXNzIGFzIHRoZSBoYW5kbGVyLgotCi1Qcm9jZXNzb3IKLT09PT09PT09PQotCi1KdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGhhbmRsZXIgbGFiZWwsIHByb3RvY29scy4gSXQgY2FsbHMgdGhlCi1zdXBlcmNsYXNzZXMgcHJvY2VzcyBpZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MuCi0KZGlmZiAtLWdpdCBhL2xpYi9ocy9SRUFETUUubWQgYi9saWIvaHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTBhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsOTkgQEAKK0hhc2tlbGwgVGhyaWZ0IEJpbmRpbmdzCisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK0NvbXBpbGUKKz09PT09PT0KKworVXNlIENhYmFsIHRvIGNvbXBpbGUgYW5kIGluc3RhbGw7IC4vY29uZmlndXJlIHVzZXMgQ2FiYWwgdW5kZXJuZWF0aCwgYW5kIHRoYXQKK3BhdGggaXMgbm90IHlldCB3ZWxsIHRlc3RlZC4gVGhyaWZ0J3MgbGlicmFyeSBhbmQgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXBpbGUKK3dpdGggcHJldHR5IG11Y2ggYW55IEdIQyBleHRlbnNpb25zIG9yIHdhcm5pbmdzIHlvdSBlbmFibGUgKG9yIGRpc2FibGUpLgorUGxlYXNlIHJlcG9ydCB0aGlzIG5vdCBiZWluZyB0aGUgY2FzZSBhcyBhIGJ1ZyBvbgoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9DcmVhdGVJc3N1ZSFkZWZhdWx0LmpzcGEKKworQ2hhbmNlcyB5b3UnbGwgbmVlZCB0byBtdWNrIGEgYml0IHdpdGggQ2FiYWwgZmxhZ3MgdG8gaW5zdGFsbCBUaHJpZnQ6CisKK0NBQkFMX0NPTkZJR1VSRV9GTEFHUz0iLS11c2VyIiAuL2NvbmZpZ3VyZQorCitCYXNlIFR5cGVzCis9PT09PT09PT09CisKK1RoZSBtYXBwaW5nIGZyb20gVGhyaWZ0IHR5cGVzIHRvIEhhc2tlbGwncyBpczoKKworICogZG91YmxlIC0+IERvdWJsZQorICogYnl0ZSAtPiBEYXRhLkludC5JbnQ4CisgKiBpMTYgLT4gRGF0YS5JbnQuSW50MTYKKyAqIGkzMiAtPiBEYXRhLkludC5JbnQzMgorICogaTY0IC0+IERhdGEuSW50LkludDY0CisgKiBzdHJpbmcgLT4gVGV4dAorICogYmluYXJ5IC0+IERhdGEuQnl0ZVN0cmluZy5MYXp5CisgKiBib29sIC0+IEJvb2xlYW4KKworRW51bXMKKz09PT09CisKK0JlY29tZSBIYXNrZWxsICdkYXRhJyB0eXBlcy4gVXNlIGZyb21FbnVtIHRvIGdldCBvdXQgdGhlIGludCB2YWx1ZS4KKworTGlzdHMKKz09PT09CisKK0JlY29tZSBEYXRhLlZlY3Rvci5WZWN0b3IgZnJvbSB0aGUgdmVjdG9yIHBhY2thZ2UuCisKK01hcHMgYW5kIFNldHMKKz09PT09PT09PT09PT0KKworQmVjb21lIERhdGEuSGFzaE1hcC5TdHJpY3QuTWFwIGFuZCBEYXRhLkhhc2hTZXQuU2V0IGZyb20gdGhlCit1bm9yZGVyZWQtY29udGFpbmVycyBwYWNrYWdlLgorCitTdHJ1Y3RzCis9PT09PT09CisKK0JlY29tZSByZWNvcmRzLiBGaWVsZCBsYWJlbHMgYXJlIHVnbHksIG9mIHRoZSBmb3JtIGZfU1RSVUNUTkFNRV9GSUVMRE5BTUUuIEFsbAorZmllbGRzIGFyZSBNYXliZSB0eXBlcy4KKworRXhjZXB0aW9ucworPT09PT09PT09PQorCitJZGVudGljYWwgdG8gc3RydWN0cy4gVXNlIHRoZW0gd2l0aCB0aHJvdyBhbmQgY2F0Y2ggZnJvbSBDb250cm9sLkV4Y2VwdGlvbi4KKworQ2xpZW50Cis9PT09PT0KKworSnVzdCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gWW91IG1heSBoYXZlIHRvIGltcG9ydCBhIGJ1bmNoIG9mIGNsaWVudCBmaWxlcyB0bworZGVhbCB3aXRoIGluaGVyaXRhbmNlLgorCitJbnRlcmZhY2UKKz09PT09PT09PQorCitZb3Ugc2hvdWxkIG9ubHkgaGF2ZSB0byBpbXBvcnQgdGhlIGxhc3Qgb25lIGluIHRoZSBjaGFpbiBvZiBpbmhlcml0b3JzLiBUbyBtYWtlCithbiBpbnRlcmZhY2UsIGRlY2xhcmUgYSBsYWJlbDoKKworICBkYXRhIE15SWZhY2UgPSBNeUlmYWNlCisKK2FuZCB0aGVuIGRlY2xhcmUgaXQgYW4gaW5zdGFuY2Ugb2YgZWFjaCBpZmFjZSBjbGFzcywgc3RhcnRpbmcgd2l0aCB0aGUgc3VwZXJlc3QKK2NsYXNzIGFuZCBwcm9jZWVkaW5nIGRvd24gKGFsbCB0aGUgd2hpbGUgZGVmaW5pbmcgdGhlIG1ldGhvZHMpLiAgVGhlbiBwYXNzIHlvdXIKK2xhYmVsIHRvIHByb2Nlc3MgYXMgdGhlIGhhbmRsZXIuCisKK1Byb2Nlc3NvcgorPT09PT09PT09CisKK0p1c3QgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgaGFuZGxlciBsYWJlbCwgcHJvdG9jb2xzLiBJdCBjYWxscyB0aGUKK3N1cGVyY2xhc3NlcyBwcm9jZXNzIGlmIHRoZXJlIGlzIGEgc3VwZXJjbGFzcy4KZGlmZiAtLWdpdCBhL2xpYi9ocy9TZXR1cC5saHMgYi9saWIvaHMvU2V0dXAubGhzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYzllNmQ5Ny4uZDUyYWU5NAotLS0gYS9saWIvaHMvU2V0dXAubGhzCisrKyBiL2xpYi9ocy9TZXR1cC5saHMKQEAgLTEsMjMgKzEsMjEgQEAKICMhL3Vzci9iaW4vZW52IHJ1bmhhc2tlbGwKIAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCis+IC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKz4gLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKz4gLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKz4gLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCis+IC0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKz4gLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorPiAtLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKz4gLS0gCis+IC0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis+IC0tIAorPiAtLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCis+IC0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCis+IC0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorPiAtLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorPiAtLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCis+IC0tIHVuZGVyIHRoZSBMaWNlbnNlLgogCiA+IGltcG9ydCBEaXN0cmlidXRpb24uU2ltcGxlCiA+IG1haW4gPSBkZWZhdWx0TWFpbgpkaWZmIC0tZ2l0IGEvbGliL2hzL1RocmlmdC5jYWJhbCBiL2xpYi9ocy9UaHJpZnQuY2FiYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYjJlODEuLjAwMDAwMDAKLS0tIGEvbGliL2hzL1RocmlmdC5jYWJhbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS0tCi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0tLQotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS0tCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0tLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotLS0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLQotCi1OYW1lOiAgICAgICAgICAgVGhyaWZ0Ci1WZXJzaW9uOiAgICAgICAgMC4xLjEKLUNhYmFsLVZlcnNpb246ICA+PSAxLjIKLUxpY2Vuc2U6ICAgICAgICBBcGFjaGUyCi1DYXRlZ29yeTogICAgICAgRm9yZWlnbgotQnVpbGQtVHlwZTogICAgIFNpbXBsZQotU3lub3BzaXM6ICAgICAgIFRocmlmdCBsaWJyYXJ5IHBhY2thZ2UKLQotTGlicmFyeQotICBIcy1Tb3VyY2UtRGlyczoKLSAgICBzcmMKLSAgQnVpbGQtRGVwZW5kczoKLSAgICBiYXNlID49NCwgbmV0d29yaywgZ2hjLXByaW0sIGJpbmFyeSwgYnl0ZXN0cmluZywgSFRUUAotICBnaGMtb3B0aW9uczoKLSAgICAtZmdsYXNnb3ctZXh0cwotICBFeHRlbnNpb25zOgotICAgIERlcml2ZURhdGFUeXBlYWJsZQotICBFeHBvc2VkLU1vZHVsZXM6Ci0gICAgVGhyaWZ0LCBUaHJpZnQuUHJvdG9jb2wsIFRocmlmdC5UcmFuc3BvcnQsIFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKLSAgICBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZSwgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LCAgVGhyaWZ0LlNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvaHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCmluZGV4IDI5MWJjYWUuLjY1ODAyMDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCkBAIC0xLDMgKzEsNiBAQAorey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBSYW5rTlR5cGVzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yNywxNCArMzAsMTcgQEAKICAgICAsIFRocmlmdEV4Y2VwdGlvbiguLikKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLk1vbmFkICggd2hlbiApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KIAoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKCBUZXh0LCBwYWNrLCB1bnBhY2sgKQoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nCiBpbXBvcnQgRGF0YS5UeXBlYWJsZSAoIFR5cGVhYmxlICkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIAotaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKLQoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogZGF0YSBUaHJpZnRFeGNlcHRpb24gPSBUaHJpZnRFeGNlcHRpb24KICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCkBAIC00Nyw2ICs1MywxMSBAQAogICAgIHwgQUVfV1JPTkdfTUVUSE9EX05BTUUKICAgICB8IEFFX0JBRF9TRVFVRU5DRV9JRAogICAgIHwgQUVfTUlTU0lOR19SRVNVTFQKKyAgICB8IEFFX0lOVEVSTkFMX0VSUk9SCisgICAgfCBBRV9QUk9UT0NPTF9FUlJPUgorICAgIHwgQUVfSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICB8IEFFX0lOVkFMSURfUFJPVE9DT0wKKyAgICB8IEFFX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFCiAgICAgICBkZXJpdmluZyAoIEVxLCBTaG93LCBUeXBlYWJsZSApCiAKIGluc3RhbmNlIEVudW0gQXBwRXhuVHlwZSB3aGVyZQpAQCAtNTYsNiArNjcsMTIgQEAKICAgICB0b0VudW0gMyA9IEFFX1dST05HX01FVEhPRF9OQU1FCiAgICAgdG9FbnVtIDQgPSBBRV9CQURfU0VRVUVOQ0VfSUQKICAgICB0b0VudW0gNSA9IEFFX01JU1NJTkdfUkVTVUxUCisgICAgdG9FbnVtIDYgPSBBRV9JTlRFUk5BTF9FUlJPUgorICAgIHRvRW51bSA3ID0gQUVfUFJPVE9DT0xfRVJST1IKKyAgICB0b0VudW0gOCA9IEFFX0lOVkFMSURfVFJBTlNGT1JNCisgICAgdG9FbnVtIDkgPSBBRV9JTlZBTElEX1BST1RPQ09MCisgICAgdG9FbnVtIDEwID0gQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKKyAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgQXBwRXhuVHlwZSAiICsrIHNob3cgdAogCiAgICAgZnJvbUVudW0gQUVfVU5LTk9XTiA9IDAKICAgICBmcm9tRW51bSBBRV9VTktOT1dOX01FVEhPRCA9IDEKQEAgLTYzLDQ5ICs4MCwzNSBAQAogICAgIGZyb21FbnVtIEFFX1dST05HX01FVEhPRF9OQU1FID0gMwogICAgIGZyb21FbnVtIEFFX0JBRF9TRVFVRU5DRV9JRCA9IDQKICAgICBmcm9tRW51bSBBRV9NSVNTSU5HX1JFU1VMVCA9IDUKKyAgICBmcm9tRW51bSBBRV9JTlRFUk5BTF9FUlJPUiA9IDYKKyAgICBmcm9tRW51bSBBRV9QUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBmcm9tRW51bSBBRV9JTlZBTElEX1RSQU5TRk9STSA9IDgKKyAgICBmcm9tRW51bSBBRV9JTlZBTElEX1BST1RPQ09MID0gOQorICAgIGZyb21FbnVtIEFFX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKIAogZGF0YSBBcHBFeG4gPSBBcHBFeG4geyBhZV90eXBlIDo6IEFwcEV4blR5cGUsIGFlX21lc3NhZ2UgOjogU3RyaW5nIH0KICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCiBpbnN0YW5jZSBFeGNlcHRpb24gQXBwRXhuCiAKLXdyaXRlQXBwRXhuIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IEFwcEV4biAtPiBJTyAoKQotd3JpdGVBcHBFeG4gcHQgYWUgPSBkbwotICAgIHdyaXRlU3RydWN0QmVnaW4gcHQgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKK3dyaXRlQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBBcHBFeG4gLT4gSU8gKCkKK3dyaXRlQXBwRXhuIHB0IGFlID0gd3JpdGVWYWwgcHQgJCBUU3RydWN0ICQgTWFwLmZyb21MaXN0CisgICAgICAgICAgICAgICAgICAgIFsgKDEsICgibWVzc2FnZSIsIFRTdHJpbmcgJCBlbmNvZGVVdGY4ICQgcGFjayAkIGFlX21lc3NhZ2UgYWUpKQorICAgICAgICAgICAgICAgICAgICAsICgyLCAoInR5cGUiLCBUSTMyICQgZnJvbUludGVncmFsICQgZnJvbUVudW0gKGFlX3R5cGUgYWUpKSkKKyAgICAgICAgICAgICAgICAgICAgXQogCi0gICAgd2hlbiAoYWVfbWVzc2FnZSBhZSAvPSAiIikgJCBkbwotICAgICAgICB3cml0ZUZpZWxkQmVnaW4gcHQgKCJtZXNzYWdlIiwgVF9TVFJJTkcgLCAxKQotICAgICAgICB3cml0ZVN0cmluZyBwdCAoYWVfbWVzc2FnZSBhZSkKLSAgICAgICAgd3JpdGVGaWVsZEVuZCBwdAotCi0gICAgd3JpdGVGaWVsZEJlZ2luIHB0ICgidHlwZSIsIFRfSTMyLCAyKTsKLSAgICB3cml0ZUkzMiBwdCAoZnJvbUVudW0gKGFlX3R5cGUgYWUpKQotICAgIHdyaXRlRmllbGRFbmQgcHQKLSAgICB3cml0ZUZpZWxkU3RvcCBwdAotICAgIHdyaXRlU3RydWN0RW5kIHB0Ci0KLXJlYWRBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gQXBwRXhuCityZWFkQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyBBcHBFeG4KIHJlYWRBcHBFeG4gcHQgPSBkbwotICAgIHJlYWRTdHJ1Y3RCZWdpbiBwdAotICAgIHJlYyA8LSByZWFkQXBwRXhuRmllbGRzIHB0IChBcHBFeG4ge2FlX3R5cGUgPSB1bmRlZmluZWQsIGFlX21lc3NhZ2UgPSB1bmRlZmluZWR9KQotICAgIHJlYWRTdHJ1Y3RFbmQgcHQKLSAgICByZXR1cm4gcmVjCisgICAgbGV0IHR5cGVtYXAgPSBNYXAuZnJvbUxpc3QgWygxLCgibWVzc2FnZSIsVF9TVFJJTkcpKSwoMiwoInR5cGUiLFRfSTMyKSldCisgICAgVFN0cnVjdCBmaWVsZHMgPC0gcmVhZFZhbCBwdCAkIFRfU1RSVUNUIHR5cGVtYXAKKyAgICByZXR1cm4gJCByZWFkQXBwRXhuRmllbGRzIGZpZWxkcwogCi1yZWFkQXBwRXhuRmllbGRzIHB0IHJlYyA9IGRvCi0gICAgKG4sIGZ0LCBpZCkgPC0gcmVhZEZpZWxkQmVnaW4gcHQKLSAgICBpZiBmdCA9PSBUX1NUT1AKLSAgICAgICAgdGhlbiByZXR1cm4gcmVjCi0gICAgICAgIGVsc2UgY2FzZSBpZCBvZgotICAgICAgICAgICAgICAgICAxIC0+IGlmIGZ0ID09IFRfU1RSSU5HIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gcyA8LSByZWFkU3RyaW5nIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVje2FlX21lc3NhZ2UgPSBzfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRvIHNraXAgcHQgZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlYwotICAgICAgICAgICAgICAgICAyIC0+IGlmIGZ0ID09IFRfSTMyIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gaSA8LSByZWFkSTMyIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVje2FlX3R5cGUgPSAodG9FbnVtICBpKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWMKLSAgICAgICAgICAgICAgICAgXyAtPiBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpZWxkRW5kIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWMKLQorcmVhZEFwcEV4bkZpZWxkcyA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoVGV4dCwgVGhyaWZ0VmFsKSAtPiBBcHBFeG4KK3JlYWRBcHBFeG5GaWVsZHMgZmllbGRzID0gQXBwRXhueworICBhZV9tZXNzYWdlID0gbWF5YmUgdW5kZWZpbmVkIHVud3JhcE1lc3NhZ2UgJCBNYXAubG9va3VwIDEgZmllbGRzLAorICBhZV90eXBlICAgID0gbWF5YmUgdW5kZWZpbmVkIHVud3JhcFR5cGUgJCBNYXAubG9va3VwIDIgZmllbGRzCisgIH0KKyAgd2hlcmUKKyAgICB1bndyYXBNZXNzYWdlIChfLCBUU3RyaW5nIHMpID0gdW5wYWNrICQgZGVjb2RlVXRmOCBzCisgICAgdW53cmFwTWVzc2FnZSBfID0gdW5kZWZpbmVkCisgICAgdW53cmFwVHlwZSAoXywgVEkzMiBpKSA9IHRvRW51bSAkIGZyb21JbnRlZ3JhbCBpCisgICAgdW53cmFwVHlwZSBfID0gdW5kZWZpbmVkCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzBmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwpAQCAtMCwwICsxLDU1IEBACit7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW9ycGhhbnMgIy19CisKK21vZHVsZSBUaHJpZnQuQXJiaXRyYXJpZXMgd2hlcmUKKworaW1wb3J0IERhdGEuQml0cygpCisKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suQXJiaXRyYXJ5CisKK2ltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlICgoPCQ+KSkKK2ltcG9ydCBEYXRhLk1hcCAoTWFwKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBUZXh0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBIU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgSE1hcAoraW1wb3J0IERhdGEuSGFzaGFibGUgKEhhc2hhYmxlKQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkgKEJ5dGVTdHJpbmcpCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIEJTCisKKy0tIFN0cmluZyBoYXMgYW4gQXJiaXRyYXJ5IGluc3RhbmNlIGFscmVhZHkKKy0tIEJvb2wgaGFzIGFuIEFyYml0cmFyeSBpbnN0YW5jZSBhbHJlYWR5CistLSBBIFRocmlmdCAnbGlzdCcgaXMgYSBWZWN0b3IuCisKK2luc3RhbmNlIEFyYml0cmFyeSBCeXRlU3RyaW5nIHdoZXJlCisgIGFyYml0cmFyeSA9IEJTLnBhY2sgLiBmaWx0ZXIgKC89IDApIDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEFyYml0cmFyeSBrKSA9PiBBcmJpdHJhcnkgKFZlY3Rvci5WZWN0b3Igaykgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gVmVjdG9yLmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgQXJiaXRyYXJ5IFRleHQuVGV4dCB3aGVyZQorICBhcmJpdHJhcnkgPSBUZXh0LnBhY2sgLiBmaWx0ZXIgKC89ICdcMCcpIDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEVxIGssIEhhc2hhYmxlIGssIEFyYml0cmFyeSBrKSA9PiBBcmJpdHJhcnkgKEhTZXQuSGFzaFNldCBrKSB3aGVyZQorICBhcmJpdHJhcnkgPSBIU2V0LmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEVxIGssIEhhc2hhYmxlIGssIEFyYml0cmFyeSBrLCBBcmJpdHJhcnkgdikgPT4KKyAgICBBcmJpdHJhcnkgKEhNYXAuSGFzaE1hcCBrIHYpIHdoZXJlCisgIGFyYml0cmFyeSA9IEhNYXAuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQorCit7LQorICAgVG8gaGFuZGxlIFRocmlmdCAnZW51bScgd2Ugd291bGQgaWRlYWxseSB1c2Ugc29tZXRoaW5nIGxpa2U6CisKK2luc3RhbmNlIChFbnVtIGEsIEJvdW5kZWQgYSkgPT4gQXJiaXRyYXJ5IGEKKyAgICB3aGVyZSBhcmJpdHJhcnkgPSBlbGVtZW50cyAoZW51bUZyb21UbyBtaW5Cb3VuZCBtYXhCb3VuZCkKKworVW5mb3J0dW5hdGVseSB0aGlzIGRvZXNuJ3QgcGxheSBuaWNlbHkgd2l0aCB0aGUgdHlwZSBzeXN0ZW0uCitJbnN0ZWFkIHdlJ2xsIGdlbmVyYXRlIGFuIGFyYml0cmFyeSBpbnN0YW5jZSBhbG9uZyB3aXRoIHRoZSBjb2RlLgorLX0KKworey0KKyAgICBUaGVyZSBtaWdodCBiZSBzb21lIHdheSB0byBpbnRyb3NwZWN0IG9uIHRoZSBIYXNrZWxsIHN0cnVjdHVyZSBvZiBhCisgICAgVGhyaWZ0ICdzdHJ1Y3QnIG9yICdleGNlcHRpb24nIGJ1dCBnZW5lcmF0aW5nIHRoZSBjb2RlIGRpcmVjdGx5IGlzIHNpbXBsZXIuCistfQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocwppbmRleCA4ZmEwNjBlLi42N2E5MTc1IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocwpAQCAtMSwzICsxLDYgQEAKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwxNjQgKzIyLDQ2IEBACiAKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAoIFByb3RvY29sKC4uKQotICAgICwgc2tpcAotICAgICwgTWVzc2FnZVR5cGUoLi4pCi0gICAgLCBUaHJpZnRUeXBlKC4uKQorICAgICwgU3RhdGVsZXNzUHJvdG9jb2woLi4pCiAgICAgLCBQcm90b2NvbEV4biguLikKICAgICAsIFByb3RvY29sRXhuVHlwZSguLikKKyAgICAsIGdldFR5cGVPZgorICAgICwgcnVuUGFyc2VyCisgICAgLCBic1RvRG91YmxlCisgICAgLCBic1RvRG91YmxlTEUKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLk1vbmFkICggcmVwbGljYXRlTV8sIHVubGVzcyApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KLQotaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuVW5zYWZlCitpbXBvcnQgRGF0YS5GdW5jdG9yICgoPCQ+KSkKIGltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTW9ub2lkIChtZW1wdHkpCitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKFRleHQpCitpbXBvcnQgRGF0YS5UeXBlYWJsZSAoVHlwZWFibGUpCitpbXBvcnQgRGF0YS5Xb3JkCitpbXBvcnQgRm9yZWlnbi5QdHIgKGNhc3RQdHIpCitpbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAocGVlaywgcG9rZSkKK2ltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKLQotCi1kYXRhIFRocmlmdFR5cGUKLSAgICA9IFRfU1RPUAotICAgIHwgVF9WT0lECi0gICAgfCBUX0JPT0wKLSAgICB8IFRfQllURQotICAgIHwgVF9ET1VCTEUKLSAgICB8IFRfSTE2Ci0gICAgfCBUX0kzMgotICAgIHwgVF9JNjQKLSAgICB8IFRfU1RSSU5HCi0gICAgfCBUX1NUUlVDVAotICAgIHwgVF9NQVAKLSAgICB8IFRfU0VUCi0gICAgfCBUX0xJU1QKLSAgICAgIGRlcml2aW5nICggRXEgKQotCi1pbnN0YW5jZSBFbnVtIFRocmlmdFR5cGUgd2hlcmUKLSAgICBmcm9tRW51bSBUX1NUT1AgICA9IDAKLSAgICBmcm9tRW51bSBUX1ZPSUQgICA9IDEKLSAgICBmcm9tRW51bSBUX0JPT0wgICA9IDIKLSAgICBmcm9tRW51bSBUX0JZVEUgICA9IDMKLSAgICBmcm9tRW51bSBUX0RPVUJMRSA9IDQKLSAgICBmcm9tRW51bSBUX0kxNiAgICA9IDYKLSAgICBmcm9tRW51bSBUX0kzMiAgICA9IDgKLSAgICBmcm9tRW51bSBUX0k2NCAgICA9IDEwCi0gICAgZnJvbUVudW0gVF9TVFJJTkcgPSAxMQotICAgIGZyb21FbnVtIFRfU1RSVUNUID0gMTIKLSAgICBmcm9tRW51bSBUX01BUCAgICA9IDEzCi0gICAgZnJvbUVudW0gVF9TRVQgICAgPSAxNAotICAgIGZyb21FbnVtIFRfTElTVCAgID0gMTUKLQotICAgIHRvRW51bSAwICA9IFRfU1RPUAotICAgIHRvRW51bSAxICA9IFRfVk9JRAotICAgIHRvRW51bSAyICA9IFRfQk9PTAotICAgIHRvRW51bSAzICA9IFRfQllURQotICAgIHRvRW51bSA0ICA9IFRfRE9VQkxFCi0gICAgdG9FbnVtIDYgID0gVF9JMTYKLSAgICB0b0VudW0gOCAgPSBUX0kzMgotICAgIHRvRW51bSAxMCA9IFRfSTY0Ci0gICAgdG9FbnVtIDExID0gVF9TVFJJTkcKLSAgICB0b0VudW0gMTIgPSBUX1NUUlVDVAotICAgIHRvRW51bSAxMyA9IFRfTUFQCi0gICAgdG9FbnVtIDE0ID0gVF9TRVQKLSAgICB0b0VudW0gMTUgPSBUX0xJU1QKLQotZGF0YSBNZXNzYWdlVHlwZQotICAgID0gTV9DQUxMCi0gICAgfCBNX1JFUExZCi0gICAgfCBNX0VYQ0VQVElPTgotICAgICAgZGVyaXZpbmcgKCBFcSApCi0KLWluc3RhbmNlIEVudW0gTWVzc2FnZVR5cGUgd2hlcmUKLSAgICBmcm9tRW51bSBNX0NBTEwgICAgICA9ICAxCi0gICAgZnJvbUVudW0gTV9SRVBMWSAgICAgPSAgMgotICAgIGZyb21FbnVtIE1fRVhDRVBUSU9OID0gIDMKLQotICAgIHRvRW51bSAxID0gTV9DQUxMCi0gICAgdG9FbnVtIDIgPSBNX1JFUExZCi0gICAgdG9FbnVtIDMgPSBNX0VYQ0VQVElPTgotCitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKIGNsYXNzIFByb3RvY29sIGEgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IHQKKyAgcmVhZEJ5dGUgOjogYSAtPiBJTyBMQlMuQnl0ZVN0cmluZworICByZWFkVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBJTyBUaHJpZnRWYWwKKyAgcmVhZE1lc3NhZ2UgOjogYSAtPiAoKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gYikgLT4gSU8gYgogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChTdHJpbmcsIE1lc3NhZ2VUeXBlLCBJbnQpIC0+IElPICgpCi0gICAgd3JpdGVNZXNzYWdlRW5kICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCisgIHdyaXRlVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IElPICgpCisgIHdyaXRlTWVzc2FnZSA6OiBhIC0+IChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPICgpIC0+IElPICgpCiAKLSAgICB3cml0ZVN0cnVjdEJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBTdHJpbmcgLT4gSU8gKCkKLSAgICB3cml0ZVN0cnVjdEVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRCZWdpbiAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChTdHJpbmcsIFRocmlmdFR5cGUsIEludCkgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkRW5kICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRTdG9wICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVNYXBCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIFRocmlmdFR5cGUsIEludCkgLT4gSU8gKCkKLSAgICB3cml0ZU1hcEVuZCAgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlTGlzdEJlZ2luICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChUaHJpZnRUeXBlLCBJbnQpIC0+IElPICgpCi0gICAgd3JpdGVMaXN0RW5kICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZVNldEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGhyaWZ0VHlwZSwgSW50KSAtPiBJTyAoKQotICAgIHdyaXRlU2V0RW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICB3cml0ZUJvb2wgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gQm9vbCAtPiBJTyAoKQotICAgIHdyaXRlQnl0ZSAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJbnQgLT4gSU8gKCkKLSAgICB3cml0ZUkxNiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50IC0+IElPICgpCi0gICAgd3JpdGVJMzIgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludCAtPiBJTyAoKQotICAgIHdyaXRlSTY0ICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJbnQ2NCAtPiBJTyAoKQotICAgIHdyaXRlRG91YmxlIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBEb3VibGUgLT4gSU8gKCkKLSAgICB3cml0ZVN0cmluZyA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gU3RyaW5nIC0+IElPICgpCi0gICAgd3JpdGVCaW5hcnkgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFN0cmluZyAtPiBJTyAoKQotCi0KLSAgICByZWFkTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoU3RyaW5nLCBNZXNzYWdlVHlwZSwgSW50KQotICAgIHJlYWRNZXNzYWdlRW5kICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICByZWFkU3RydWN0QmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIFN0cmluZwotICAgIHJlYWRTdHJ1Y3RFbmQgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkRmllbGRCZWdpbiAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChTdHJpbmcsIFRocmlmdFR5cGUsIEludCkKLSAgICByZWFkRmllbGRFbmQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZE1hcEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGhyaWZ0VHlwZSwgVGhyaWZ0VHlwZSwgSW50KQotICAgIHJlYWRNYXBFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkTGlzdEJlZ2luICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUaHJpZnRUeXBlLCBJbnQpCi0gICAgcmVhZExpc3RFbmQgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRTZXRCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRocmlmdFR5cGUsIEludCkKLSAgICByZWFkU2V0RW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICByZWFkQm9vbCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBCb29sCi0gICAgcmVhZEJ5dGUgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50Ci0gICAgcmVhZEkxNiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50Ci0gICAgcmVhZEkzMiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50Ci0gICAgcmVhZEk2NCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50NjQKLSAgICByZWFkRG91YmxlIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBEb3VibGUKLSAgICByZWFkU3RyaW5nIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBTdHJpbmcKLSAgICByZWFkQmluYXJ5IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBTdHJpbmcKLQotCi1za2lwIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IFRocmlmdFR5cGUgLT4gSU8gKCkKLXNraXAgcCBUX1NUT1AgPSByZXR1cm4gKCkKLXNraXAgcCBUX1ZPSUQgPSByZXR1cm4gKCkKLXNraXAgcCBUX0JPT0wgPSByZWFkQm9vbCBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfQllURSA9IHJlYWRCeXRlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMTYgPSByZWFkSTE2IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMzIgPSByZWFkSTMyIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JNjQgPSByZWFkSTY0IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9ET1VCTEUgPSByZWFkRG91YmxlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJJTkcgPSByZWFkU3RyaW5nIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJVQ1QgPSBkbyByZWFkU3RydWN0QmVnaW4gcAotICAgICAgICAgICAgICAgICAgICAgc2tpcEZpZWxkcyBwCi0gICAgICAgICAgICAgICAgICAgICByZWFkU3RydWN0RW5kIHAKLXNraXAgcCBUX01BUCA9IGRvIChrLCB2LCBzKSA8LSByZWFkTWFwQmVnaW4gcAotICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gcyAoc2tpcCBwIGsgPj4gc2tpcCBwIHYpCi0gICAgICAgICAgICAgICAgICByZWFkTWFwRW5kIHAKLXNraXAgcCBUX1NFVCA9IGRvICh0LCBuKSA8LSByZWFkU2V0QmVnaW4gcAotICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gbiAoc2tpcCBwIHQpCi0gICAgICAgICAgICAgICAgICByZWFkU2V0RW5kIHAKLXNraXAgcCBUX0xJU1QgPSBkbyAodCwgbikgPC0gcmVhZExpc3RCZWdpbiBwCi0gICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gbiAoc2tpcCBwIHQpCi0gICAgICAgICAgICAgICAgICAgcmVhZExpc3RFbmQgcAotCi0KLXNraXBGaWVsZHMgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gKCkKLXNraXBGaWVsZHMgcCA9IGRvCi0gICAgKF8sIHQsIF8pIDwtIHJlYWRGaWVsZEJlZ2luIHAKLSAgICB1bmxlc3MgKHQgPT0gVF9TVE9QKSAoc2tpcCBwIHQgPj4gcmVhZEZpZWxkRW5kIHAgPj4gc2tpcEZpZWxkcyBwKQotCitjbGFzcyBQcm90b2NvbCBhID0+IFN0YXRlbGVzc1Byb3RvY29sIGEgd2hlcmUKKyAgc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IExCUy5CeXRlU3RyaW5nCisgIGRlc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKIAogZGF0YSBQcm90b2NvbEV4blR5cGUKICAgICA9IFBFX1VOS05PV04KQEAgLTE4NCw4ICs2OSw2OCBAQAogICAgIHwgUEVfTkVHQVRJVkVfU0laRQogICAgIHwgUEVfU0laRV9MSU1JVAogICAgIHwgUEVfQkFEX1ZFUlNJT04KKyAgICB8IFBFX05PVF9JTVBMRU1FTlRFRAorICAgIHwgUEVfTUlTU0lOR19SRVFVSVJFRF9GSUVMRAogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQogCiBkYXRhIFByb3RvY29sRXhuID0gUHJvdG9jb2xFeG4gUHJvdG9jb2xFeG5UeXBlIFN0cmluZwogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBQcm90b2NvbEV4bgorCitnZXRUeXBlT2YgOjogVGhyaWZ0VmFsIC0+IFRocmlmdFR5cGUKK2dldFR5cGVPZiB2ID0gIGNhc2UgdiBvZgorICBUU3RydWN0e30gLT4gVF9TVFJVQ1QgTWFwLmVtcHR5CisgIFRNYXB7fSAtPiBUX01BUCBUX1ZPSUQgVF9WT0lECisgIFRMaXN0e30gLT4gVF9MSVNUIFRfVk9JRAorICBUU2V0e30gLT4gVF9TRVQgVF9WT0lECisgIFRCb29se30gLT4gVF9CT09MCisgIFRCeXRle30gLT4gVF9CWVRFCisgIFRJMTZ7fSAtPiBUX0kxNgorICBUSTMye30gLT4gVF9JMzIKKyAgVEk2NHt9IC0+IFRfSTY0CisgIFRTdHJpbmd7fSAtPiBUX1NUUklORworICBUQmluYXJ5e30gLT4gVF9CSU5BUlkKKyAgVERvdWJsZXt9IC0+IFRfRE9VQkxFCisKK3J1blBhcnNlciA6OiAoUHJvdG9jb2wgcCwgU2hvdyBhKSA9PiBwIC0+IFBhcnNlciBhIC0+IElPIGEKK3J1blBhcnNlciBwcm90IHAgPSByZWZpbGwgPj49IGdldFJlc3VsdCAuIHBhcnNlIHAKKyAgd2hlcmUKKyAgICByZWZpbGwgPSBoYW5kbGUgaGFuZGxlRU9GICQgTEJTLnRvU3RyaWN0IDwkPiByZWFkQnl0ZSBwcm90CisgICAgZ2V0UmVzdWx0IChEb25lIF8gYSkgPSByZXR1cm4gYQorICAgIGdldFJlc3VsdCAoUGFydGlhbCBrKSA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gaworICAgIGdldFJlc3VsdCBmID0gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9JTlZBTElEX0RBVEEgKHNob3cgZikKKworaGFuZGxlRU9GIDo6IFNvbWVFeGNlcHRpb24gLT4gSU8gQlMuQnl0ZVN0cmluZworaGFuZGxlRU9GID0gY29uc3QgJCByZXR1cm4gbWVtcHR5CisKKy0tIHwgQ29udmVydHMgYSBCeXRlU3RyaW5nIHRvIGEgRmxvYXRpbmcgcG9pbnQgbnVtYmVyCistLSBUaGUgQnl0ZVN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gbmV0d29yayBvcmRlciAoQmlnIEVuZGlhbikKKy0tIHRoZXJlZm9yZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiB2YXJpZXMgYmFzZWQgb24gd2hldGhlciB0aGUgbG9jYWwKKy0tIG1hY2hpbmUgaXMgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgorYnNUb0RvdWJsZSA6OiBCUy5CeXRlU3RyaW5nIC0+IERvdWJsZQorYnNUb0RvdWJsZUxFIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKKyNlbHNlCitic1RvRG91YmxlIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKK2JzVG9Eb3VibGVMRSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorI2VuZGlmCisKKworY2FzdEJzU3dhcHBlZCBjaHJQdHIgPSBkbworICB3IDwtIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorICBwb2tlIChjYXN0UHRyIGNoclB0cikgKGJ5dGVTd2FwIHcpCisgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKKworLS0gfCBTd2FwIGVuZGlhbm5lc3Mgb2YgYSA2NC1iaXQgd29yZAorYnl0ZVN3YXAgOjogV29yZDY0IC0+IFdvcmQ2NAorYnl0ZVN3YXAgdyA9ICh3IGBzaGlmdExgIDU2IC4mLiAweEZGMDAwMDAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDQwIC4mLiAweDAwRkYwMDAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDI0IC4mLiAweDAwMDBGRjAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDggIC4mLiAweDAwMDAwMEZGMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDggIC4mLiAweDAwMDAwMDAwRkYwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDI0IC4mLiAweDAwMDAwMDAwMDBGRjAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDQwIC4mLiAweDAwMDAwMDAwMDAwMEZGMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDU2IC4mLiAweDAwMDAwMDAwMDAwMDAwRkYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKaW5kZXggZmE5YTIwNy4uN2IwYWNkOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwpAQCAtMTcsMTM2ICsxNywxOTYgQEAKIC0tIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0KIAorey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CisKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiAgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgLCBCaW5hcnlQcm90b2NvbCguLikKKyAgICAsIHZlcnNpb25NYXNrCisgICAgLCB2ZXJzaW9uMQogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQotaW1wb3J0IENvbnRyb2wuTW9uYWQgKCBsaWZ0TSApCi0KK2ltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgogaW1wb3J0IERhdGEuSW50Ci1pbXBvcnQgRGF0YS5MaXN0ICggZm9sZGwnICkKLQotaW1wb3J0IEdIQy5FeHRzCi1pbXBvcnQgR0hDLldvcmQKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nIGFzIFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeSBhcyBCaW5hcnkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLXZlcnNpb25fbWFzayA9IDB4ZmZmZjAwMDAKLXZlcnNpb25fMSAgICA9IDB4ODAwMTAwMDAKK3ZlcnNpb25NYXNrIDo6IEludDMyCit2ZXJzaW9uTWFzayA9IGZyb21JbnRlZ3JhbCAoMHhmZmZmMDAwMCA6OiBXb3JkMzIpCisKK3ZlcnNpb24xIDo6IEludDMyCit2ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCiAKIGRhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IFRyYW5zcG9ydCBhID0+IEJpbmFyeVByb3RvY29sIGEKIAorZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEJpbmFyeVByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKIAotaW5zdGFuY2UgUHJvdG9jb2wgQmluYXJ5UHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKEJpbmFyeVByb3RvY29sIHQpID0gdAorLS0gTk9URTogUmVhZGluZyBhbmQgV3JpdGluZyBmdW5jdGlvbnMgcmVseSBvbiBCdWlsZGVycyBhbmQgRGF0YS5CaW5hcnkgdG8KKy0tIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEuICBEYXRhLkJpbmFyeSBhc3N1bWVzIHRoYXQgdGhlIGJpbmFyeSB2YWx1ZXMgaXQgaXMKKy0tIGVuY29kaW5nIHRvIGFuZCBkZWNvZGluZyBmcm9tIGFyZSBpbiBCSUcgRU5ESUFOIGZvcm1hdCwgYW5kIGNvbnZlcnRzIHRoZQorLS0gZW5kaWFubmVzcyBhcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIGxvY2FsIG1hY2hpbmUuCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgLS0gZmx1c2hUcmFuc3BvcnQgcCA9IHRGbHVzaCAoZ2V0VHJhbnNwb3J0IHApCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiAodmVyc2lvbjEgLnwuIGZyb21JbnRlZ3JhbCAoZnJvbUVudW0gdCkpKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSBkbwotICAgICAgICB3cml0ZUkzMiBwICh2ZXJzaW9uXzEgLnwuIChmcm9tRW51bSB0KSkKLSAgICAgICAgd3JpdGVTdHJpbmcgcCBuCi0gICAgICAgIHdyaXRlSTMyIHAgcwotICAgIHdyaXRlTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZVN0cnVjdEJlZ2luIF8gXyA9IHJldHVybiAoKQotICAgIHdyaXRlU3RydWN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUZpZWxkQmVnaW4gcCAoXywgdCwgaSkgPSB3cml0ZVR5cGUgcCB0ID4+IHdyaXRlSTE2IHAgaQotICAgIHdyaXRlRmllbGRFbmQgXyA9IHJldHVybiAoKQotICAgIHdyaXRlRmllbGRTdG9wIHAgPSB3cml0ZVR5cGUgcCBUX1NUT1AKLSAgICB3cml0ZU1hcEJlZ2luIHAgKGssIHYsIG4pID0gd3JpdGVUeXBlIHAgayA+PiB3cml0ZVR5cGUgcCB2ID4+IHdyaXRlSTMyIHAgbgotICAgIHdyaXRlTWFwRW5kIHAgPSByZXR1cm4gKCkKLSAgICB3cml0ZUxpc3RCZWdpbiBwICh0LCBuKSA9IHdyaXRlVHlwZSBwIHQgPj4gd3JpdGVJMzIgcCBuCi0gICAgd3JpdGVMaXN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZVNldEJlZ2luIHAgKHQsIG4pID0gd3JpdGVUeXBlIHAgdCA+PiB3cml0ZUkzMiBwIG4KLSAgICB3cml0ZVNldEVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZUJvb2wgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBMQlMuc2luZ2xldG9uICQgdG9FbnVtICQgaWYgYiB0aGVuIDEgZWxzZSAwCi0gICAgd3JpdGVCeXRlIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIChnZXRCeXRlcyBiIDEpCi0gICAgd3JpdGVJMTYgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgKGdldEJ5dGVzIGIgMikKLSAgICB3cml0ZUkzMiBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAoZ2V0Qnl0ZXMgYiA0KQotICAgIHdyaXRlSTY0IHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIChnZXRCeXRlcyBiIDgpCi0gICAgd3JpdGVEb3VibGUgcCBkID0gd3JpdGVJNjQgcCAoZnJvbUludGVncmFsICQgZmxvYXRCaXRzIGQpCi0gICAgd3JpdGVTdHJpbmcgcCBzID0gd3JpdGVJMzIgcCAobGVuZ3RoIHMpID4+IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIChMQlMucGFjayBzKQotICAgIHdyaXRlQmluYXJ5ID0gd3JpdGVTdHJpbmcKLQotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IGRvCi0gICAgICAgIHZlciA8LSByZWFkSTMyIHAKLSAgICAgICAgaWYgKHZlciAuJi4gdmVyc2lvbl9tYXNrIC89IHZlcnNpb25fMSkKKyAgICByZWFkTWVzc2FnZSBwID0gKHJlYWRNZXNzYWdlQmVnaW4gcCA+Pj0pCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIGRvCisgICAgICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKICAgICAgICAgICAgIHRoZW4gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9CQURfVkVSU0lPTiAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiCiAgICAgICAgICAgICBlbHNlIGRvCi0gICAgICAgICAgICAgIHMgPC0gcmVhZFN0cmluZyBwCi0gICAgICAgICAgICAgIHN6IDwtIHJlYWRJMzIgcAotICAgICAgICAgICAgICByZXR1cm4gKHMsIHRvRW51bSAkIHZlciAuJi4gMHhGRiwgc3opCi0gICAgcmVhZE1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRTdHJ1Y3RCZWdpbiBfID0gcmV0dXJuICIiCi0gICAgcmVhZFN0cnVjdEVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZEZpZWxkQmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIGlmIHQgLz0gVF9TVE9QIHRoZW4gcmVhZEkxNiBwIGVsc2UgcmV0dXJuIDAKLSAgICAgICAgcmV0dXJuICgiIiwgdCwgbikKLSAgICByZWFkRmllbGRFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRNYXBCZWdpbiBwID0gZG8KLSAgICAgICAga3QgPC0gcmVhZFR5cGUgcAotICAgICAgICB2dCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gcmVhZEkzMiBwCi0gICAgICAgIHJldHVybiAoa3QsIHZ0LCBuKQotICAgIHJlYWRNYXBFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRMaXN0QmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKHQsIG4pCi0gICAgcmVhZExpc3RFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRTZXRCZWdpbiBwID0gZG8KLSAgICAgICAgdCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gcmVhZEkzMiBwCi0gICAgICAgIHJldHVybiAodCwgbikKLSAgICByZWFkU2V0RW5kIF8gPSByZXR1cm4gKCkKKyAgICAgICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKKyAgICAgICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBzLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB2ZXIgLiYuIDB4RkYsIHN6KQogCi0gICAgcmVhZEJvb2wgcCA9ICg9PSAxKSBgZm1hcGAgcmVhZEJ5dGUgcAotICAgIHJlYWRCeXRlIHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKLSAgICAgICAgcmV0dXJuICQgZnJvbUludGVncmFsIChjb21wb3NlQnl0ZXMgYnMgOjogSW50OCkKLSAgICByZWFkSTE2IHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDIKLSAgICAgICAgcmV0dXJuICQgZnJvbUludGVncmFsIChjb21wb3NlQnl0ZXMgYnMgOjogSW50MTYpCi0gICAgcmVhZEkzMiBwID0gY29tcG9zZUJ5dGVzIGBmbWFwYCB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDQKLSAgICByZWFkSTY0IHAgPSBjb21wb3NlQnl0ZXMgYGZtYXBgIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgOAotICAgIHJlYWREb3VibGUgcCA9IGRvCi0gICAgICAgIGJzIDwtIHJlYWRJNjQgcAotICAgICAgICByZXR1cm4gJCBmbG9hdE9mQml0cyAkIGZyb21JbnRlZ3JhbCBicwotICAgIHJlYWRTdHJpbmcgcCA9IGRvCi0gICAgICAgIGkgPC0gcmVhZEkzMiBwCi0gICAgICAgIExCUy51bnBhY2sgYGxpZnRNYCB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIGkKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQorICAgIHJlYWRWYWwgcCA9IHJ1blBhcnNlciBwIC4gcGFyc2VCaW5hcnlWYWx1ZQogCi0gICAgcmVhZEJpbmFyeSA9IHJlYWRTdHJpbmcKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChCaW5hcnlQcm90b2NvbCB0KSB3aGVyZQorICAgIHNlcmlhbGl6ZVZhbCBfID0gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlQmluYXJ5VmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gfCBXcml0aW5nIEZ1bmN0aW9ucworYnVpbGRCaW5hcnlWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRCaW5hcnlTdHJ1Y3QgZmllbGRzIDw+IGJ1aWxkVHlwZSBUX1NUT1AKK2J1aWxkQmluYXJ5VmFsdWUgKFRNYXAga3kgdnQgZW50cmllcykgPQorICBidWlsZFR5cGUga3kgPD4KKyAgYnVpbGRUeXBlIHZ0IDw+CisgIGludDMyQkUgKGZyb21JbnRlZ3JhbCAobGVuZ3RoIGVudHJpZXMpKSA8PgorICBidWlsZEJpbmFyeU1hcCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKSA9CisgIGJ1aWxkVHlwZSB0eSA8PgorICBpbnQzMkJFIChmcm9tSW50ZWdyYWwgKGxlbmd0aCBlbnRyaWVzKSkgPD4KKyAgYnVpbGRCaW5hcnlMaXN0IGVudHJpZXMKK2J1aWxkQmluYXJ5VmFsdWUgKFRTZXQgdHkgZW50cmllcykgPQorICBidWlsZFR5cGUgdHkgPD4KKyAgaW50MzJCRSAoZnJvbUludGVncmFsIChsZW5ndGggZW50cmllcykpIDw+CisgIGJ1aWxkQmluYXJ5TGlzdCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUQm9vbCBiKSA9CisgIHdvcmQ4ICQgdG9FbnVtICQgaWYgYiB0aGVuIDEgZWxzZSAwCitidWlsZEJpbmFyeVZhbHVlIChUQnl0ZSBiKSA9IGludDggYgorYnVpbGRCaW5hcnlWYWx1ZSAoVEkxNiBpKSA9IGludDE2QkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBpKSA9IGludDMyQkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVEk2NCBpKSA9IGludDY0QkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUJFIGQKK2J1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykgPSBpbnQzMkJFIGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCisgIHdoZXJlCisgICAgbGVuIDo6IEludDMyID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpCitidWlsZEJpbmFyeVZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKQorCitidWlsZEJpbmFyeVN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeVN0cnVjdCA9IE1hcC5mb2xkcldpdGhLZXkgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIGZpZCAoXyx2YWwpIHMgPQorICAgICAgYnVpbGRUeXBlT2YgdmFsIDw+IGludDE2QkUgZmlkIDw+IGJ1aWxkQmluYXJ5VmFsdWUgdmFsIDw+IHMKKworYnVpbGRCaW5hcnlNYXAgOjogWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5TWFwID0gZm9sZGwgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIHMgKGtleSwgdmFsKSA9IHMgPD4gYnVpbGRCaW5hcnlWYWx1ZSBrZXkgPD4gYnVpbGRCaW5hcnlWYWx1ZSB2YWwKKworYnVpbGRCaW5hcnlMaXN0IDo6IFtUaHJpZnRWYWxdIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5TGlzdCA9IGZvbGRyIChtYXBwZW5kIC4gYnVpbGRCaW5hcnlWYWx1ZSkgbWVtcHR5CisKKy0tIHwgUmVhZGluZyBGdW5jdGlvbnMKK3BhcnNlQmluYXJ5VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRWYWwKK3BhcnNlQmluYXJ5VmFsdWUgKFRfU1RSVUNUIHRtYXApID0gVFN0cnVjdCA8JD4gcGFyc2VCaW5hcnlTdHJ1Y3QgdG1hcAorcGFyc2VCaW5hcnlWYWx1ZSAoVF9NQVAgXyBfKSA9IGRvCisgIGt0IDwtIHBhcnNlVHlwZQorICB2dCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRNYXAga3QgdnQgPCQ+IHBhcnNlQmluYXJ5TWFwIGt0IHZ0IG4KK3BhcnNlQmluYXJ5VmFsdWUgKFRfTElTVCBfKSA9IGRvCisgIHQgPC0gcGFyc2VUeXBlCisgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICBUTGlzdCB0IDwkPiBwYXJzZUJpbmFyeUxpc3QgdCBuCitwYXJzZUJpbmFyeVZhbHVlIChUX1NFVCBfKSA9IGRvCisgIHQgPC0gcGFyc2VUeXBlCisgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICBUU2V0IHQgPCQ+IHBhcnNlQmluYXJ5TGlzdCB0IG4KK3BhcnNlQmluYXJ5VmFsdWUgVF9CT09MID0gVEJvb2wgLiAoLz0wKSA8JD4gUC5hbnlXb3JkOAorcGFyc2VCaW5hcnlWYWx1ZSBUX0JZVEUgPSBUQnl0ZSAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDEKK3BhcnNlQmluYXJ5VmFsdWUgVF9JMTYgPSBUSTE2IC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMiA9IFRJMzIgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CitwYXJzZUJpbmFyeVZhbHVlIFRfSTY0ID0gVEk2NCAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDgKK3BhcnNlQmluYXJ5VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZSA8JD4gUC50YWtlIDgKK3BhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUJpbmFyeVN0cmluZyBUU3RyaW5nCitwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZID0gcGFyc2VCaW5hcnlTdHJpbmcgVEJpbmFyeQorcGFyc2VCaW5hcnlWYWx1ZSB0eSA9IGVycm9yICQgIkNhbm5vdCByZWFkIHZhbHVlIG9mIHR5cGUgIiArKyBzaG93IHR5CisKK3BhcnNlQmluYXJ5U3RyaW5nIHR5ID0gZG8KKyAgaSA6OiBJbnQzMiAgPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBpKQorCitwYXJzZUJpbmFyeVN0cnVjdCA6OiBUeXBlTWFwIC0+IFAuUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQmluYXJ5U3RydWN0IHRtYXAgPSBNYXAuZnJvbUxpc3QgPCQ+IFAubWFueVRpbGwgcGFyc2VGaWVsZCAobWF0Y2hUeXBlIFRfU1RPUCkKKyAgd2hlcmUKKyAgICBwYXJzZUZpZWxkID0gZG8KKyAgICAgIHQgPC0gcGFyc2VUeXBlCisgICAgICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKKyAgICAgIHYgPC0gY2FzZSAodCwgTWFwLmxvb2t1cCBuIHRtYXApIG9mCisgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQmluYXJ5VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICBfIC0+IHBhcnNlQmluYXJ5VmFsdWUgdAorICAgICAgcmV0dXJuIChuLCAoIiIsIHYpKQorCitwYXJzZUJpbmFyeU1hcCA6OiBUaHJpZnRUeXBlIC0+IFRocmlmdFR5cGUgLT4gSW50MzIgLT4gUC5QYXJzZXIgWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldCitwYXJzZUJpbmFyeU1hcCBrdCB2dCBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gZG8KKyAgayA8LSBwYXJzZUJpbmFyeVZhbHVlIGt0CisgIHYgPC0gcGFyc2VCaW5hcnlWYWx1ZSB2dAorICAoKGssdikgOikgPCQ+IHBhcnNlQmluYXJ5TWFwIGt0IHZ0IChuLTEpCisKK3BhcnNlQmluYXJ5TGlzdCA6OiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFAuUGFyc2VyIFtUaHJpZnRWYWxdCitwYXJzZUJpbmFyeUxpc3QgdHkgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBsaWZ0TTIgKDopIChwYXJzZUJpbmFyeVZhbHVlIHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VCaW5hcnlMaXN0IHR5IChuLTEpKQorCiAKIAogLS0gfCBXcml0ZSBhIHR5cGUgYXMgYSBieXRlCi13cml0ZVR5cGUgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gVGhyaWZ0VHlwZSAtPiBJTyAoKQotd3JpdGVUeXBlIHAgdCA9IHdyaXRlQnl0ZSBwIChmcm9tRW51bSB0KQorYnVpbGRUeXBlIDo6IFRocmlmdFR5cGUgLT4gQnVpbGRlcgorYnVpbGRUeXBlIHQgPSB3b3JkOCAkIGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQKKworLS0gfCBXcml0ZSB0eXBlIG9mIGEgVGhyaWZ0VmFsIGFzIGEgYnl0ZQorYnVpbGRUeXBlT2YgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkVHlwZU9mID0gYnVpbGRUeXBlIC4gZ2V0VHlwZU9mCiAKIC0tIHwgUmVhZCBhIGJ5dGUgYXMgdGhvdWdoIGl0IHdlcmUgYSBUaHJpZnRUeXBlCi1yZWFkVHlwZSA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyBUaHJpZnRUeXBlCi1yZWFkVHlwZSBwID0gdG9FbnVtIGBmbWFwYCByZWFkQnl0ZSBwCitwYXJzZVR5cGUgOjogUC5QYXJzZXIgVGhyaWZ0VHlwZQorcGFyc2VUeXBlID0gdG9FbnVtIC4gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CiAKLWNvbXBvc2VCeXRlcyA6OiAoQml0cyBiKSA9PiBMQlMuQnl0ZVN0cmluZyAtPiBiCi1jb21wb3NlQnl0ZXMgPSAoZm9sZGwnIGZuIDApIC4gKG1hcCAoZnJvbUludGVncmFsIC4gZnJvbUVudW0pKSAuIExCUy51bnBhY2sKLSAgICB3aGVyZSBmbiBhY2MgYiA9IChhY2MgYHNoaWZ0TGAgOCkgLnwuIGIKLQotZ2V0Qnl0ZSA6OiBCaXRzIGEgPT4gYSAtPiBJbnQgLT4gYQotZ2V0Qnl0ZSBpIG4gPSAyNTUgLiYuIChpIGBzaGlmdFJgICg4ICogbikpCi0KLWdldEJ5dGVzIDo6IChCaXRzIGEsIEludGVncmFsIGEpID0+IGEgLT4gSW50IC0+IExCUy5CeXRlU3RyaW5nCi1nZXRCeXRlcyBpIDAgPSBMQlMuZW1wdHkKLWdldEJ5dGVzIGkgbiA9ICh0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCBnZXRCeXRlIGkgKG4tMSkpIGBMQlMuY29uc2AgKGdldEJ5dGVzIGkgKG4tMSkpCi0KLWZsb2F0Qml0cyA6OiBEb3VibGUgLT4gV29yZDY0Ci1mbG9hdEJpdHMgKEQjIGQjKSA9IFc2NCMgKHVuc2FmZUNvZXJjZSMgZCMpCi0KLWZsb2F0T2ZCaXRzIDo6IFdvcmQ2NCAtPiBEb3VibGUKLWZsb2F0T2ZCaXRzIChXNjQjIGIjKSA9IEQjICh1bnNhZmVDb2VyY2UjIGIjKQotCittYXRjaFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRUeXBlCittYXRjaFR5cGUgdCA9IHQgPCQgUC53b3JkOCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzk3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCkBAIC0wLDAgKzEsMzExIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgQ29tcGFjdFByb3RvY29sKC4uKQorICAgICwgcGFyc2VWYXJpbnQKKyAgICAsIGJ1aWxkVmFyaW50CisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0IGFzIExpc3QKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IHRoZSBDb21wYWN0IFByb3RvY29sIGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIFRocmlmdCAnVENvbXBhY3RQcm9jb3RvbCcKKy0tIHdoaWNoIGlzIHNpbWlsYXIgdG8gdGhlICdUQmluYXJ5UHJvdG9jb2wnLCBidXQgdGFrZXMgbGVzcyBzcGFjZSBvbiB0aGUgd2lyZS4KKy0tIEludGVncmFsIHR5cGVzIGFyZSBlbmNvZGVkIHVzaW5nIGFzIHZhcmludHMuCitkYXRhIENvbXBhY3RQcm90b2NvbCBhID0gQ29tcGFjdFByb3RvY29sIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0dWN0IGEgJ0NvbXBhY3RQcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCisKK3Byb3RvY29sSUQsIHZlcnNpb24sIHZlcnNpb25NYXNrLCB0eXBlTWFzaywgdHlwZUJpdHMgOjogV29yZDgKK3Byb3RvY29sSUQgID0gMHg4MiAtLSAxMDAwIDAwMTAKK3ZlcnNpb24gICAgID0gMHgwMQordmVyc2lvbk1hc2sgPSAweDFmIC0tIDAwMDEgMTExMQordHlwZU1hc2sgICAgPSAweGUwIC0tIDExMTAgMDAwMAordHlwZUJpdHMgICAgPSAweDA3IC0tIDAwMDAgMDExMQordHlwZVNoaWZ0QW1vdW50IDo6IEludAordHlwZVNoaWZ0QW1vdW50ID0gNQorCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gQ29tcGFjdFByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChDb21wYWN0UHJvdG9jb2wgdCkgPSB0CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi53b3JkOCBwcm90b2NvbElEIDw+CisgICAgICAgICAgQi53b3JkOCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KKyAgICAgICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCisgICAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+CisgICAgICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+CisgICAgICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCisKKyAgICByZWFkTWVzc2FnZSBwIGYgPSByZWFkTWVzc2FnZUJlZ2luID4+PSBmCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgorICAgICAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrCisgICAgICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgorICAgICAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cworICAgICAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCisgICAgICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCisKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VDb21wYWN0VmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gfCBXcml0aW5nIEZ1bmN0aW9ucworYnVpbGRDb21wYWN0VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBidWlsZENvbXBhY3RTdHJ1Y3QgZmllbGRzCitidWlsZENvbXBhY3RWYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBsZW5ndGggZW50cmllcyA6OiBXb3JkMzIgaW4KKyAgaWYgbGVuID09IDAKKyAgdGhlbiBCLndvcmQ4IDB4MDAKKyAgZWxzZSBidWlsZFZhcmludCBsZW4gPD4KKyAgICAgICBCLndvcmQ4IChmcm9tVFR5cGUga3QgYHNoaWZ0TGAgNCAufC4gZnJvbVRUeXBlIHZ0KSA8PgorICAgICAgIGJ1aWxkQ29tcGFjdE1hcCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVExpc3QgdHkgZW50cmllcykgPQorICBsZXQgbGVuID0gbGVuZ3RoIGVudHJpZXMgaW4KKyAgKGlmIGxlbiA8IDE1CisgICB0aGVuIEIud29yZDggJCAoZnJvbUludGVncmFsIGxlbiBgc2hpZnRMYCA0KSAufC4gZnJvbVRUeXBlIHR5CisgICBlbHNlIEIud29yZDggKDB4RjAgLnwuIGZyb21UVHlwZSB0eSkgPD4KKyAgICAgICAgYnVpbGRWYXJpbnQgKGZyb21JbnRlZ3JhbCBsZW4gOjogV29yZDMyKSkgPD4KKyAgYnVpbGRDb21wYWN0TGlzdCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKQorYnVpbGRDb21wYWN0VmFsdWUgKFRCb29sIGIpID0KKyAgQi53b3JkOCAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAorYnVpbGRDb21wYWN0VmFsdWUgKFRCeXRlIGIpID0gaW50OCBiCitidWlsZENvbXBhY3RWYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkVmFyaW50ICQgaTE2VG9aaWdaYWcgaQorYnVpbGRDb21wYWN0VmFsdWUgKFRJMzIgaSkgPSBidWlsZFZhcmludCAkIGkzMlRvWmlnWmFnIGkKK2J1aWxkQ29tcGFjdFZhbHVlIChUSTY0IGkpID0gYnVpbGRWYXJpbnQgJCBpNjRUb1ppZ1phZyBpCitidWlsZENvbXBhY3RWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUxFIGQKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpID0gYnVpbGRWYXJpbnQgbGVuIDw+IGxhenlCeXRlU3RyaW5nIHMKKyAgd2hlcmUKKyAgICBsZW4gPSBmcm9tSW50ZWdyYWwgKExCUy5sZW5ndGggcykgOjogV29yZDMyCitidWlsZENvbXBhY3RWYWx1ZSAoVEJpbmFyeSBzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpCisKK2J1aWxkQ29tcGFjdFN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RTdHJ1Y3QgPSBmbGlwIChsb29wIDApIG1lbXB0eSAuIE1hcC50b0xpc3QKKyAgd2hlcmUKKyAgICBsb29wIF8gW10gYWNjID0gYWNjIDw+IEIud29yZDggKGZyb21UVHlwZSBUX1NUT1ApCisgICAgbG9vcCBsYXN0SWQgKChmaWQsIChfLHZhbCkpIDogZmllbGRzKSBhY2MgPSBsb29wIGZpZCBmaWVsZHMgJCBhY2MgPD4KKyAgICAgIChpZiBmaWQgPiBsYXN0SWQgJiYgZmlkIC0gbGFzdElkIDw9IDE1CisgICAgICAgdGhlbiBCLndvcmQ4ICQgZnJvbUludGVncmFsICgoZmlkIC0gbGFzdElkKSBgc2hpZnRMYCA0KSAufC4gdHlwZU9mIHZhbAorICAgICAgIGVsc2UgQi53b3JkOCAodHlwZU9mIHZhbCkgPD4gYnVpbGRWYXJpbnQgKGkxNlRvWmlnWmFnIGZpZCkpIDw+CisgICAgICAoaWYgdHlwZU9mIHZhbCA+IDB4MDIgLS0gTm90IGEgVF9CT09MCisgICAgICAgdGhlbiBidWlsZENvbXBhY3RWYWx1ZSB2YWwKKyAgICAgICBlbHNlIG1lbXB0eSkgLS0gVF9CT09McyBhcmUgZW5jb2RlZCBpbiB0aGUgdHlwZQorYnVpbGRDb21wYWN0TWFwIDo6IFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RNYXAgPSBmb2xkbCBjb21iaW5lIG1lbXB0eQorICB3aGVyZQorICAgIGNvbWJpbmUgcyAoa2V5LCB2YWwpID0gYnVpbGRDb21wYWN0VmFsdWUga2V5IDw+IGJ1aWxkQ29tcGFjdFZhbHVlIHZhbCA8PiBzCisKK2J1aWxkQ29tcGFjdExpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0TGlzdCA9IGZvbGRyIChtYXBwZW5kIC4gYnVpbGRDb21wYWN0VmFsdWUpIG1lbXB0eQorCistLSB8IFJlYWRpbmcgRnVuY3Rpb25zCitwYXJzZUNvbXBhY3RWYWx1ZSA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBUaHJpZnRWYWwKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQ29tcGFjdFN0cnVjdCB0bWFwCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9NQVAga3QnIHZ0JykgPSBkbworICBuIDwtIHBhcnNlVmFyaW50IGlkCisgIGlmIG4gPT0gMAorICAgIHRoZW4gcmV0dXJuICQgVE1hcCBrdCcgdnQnIFtdCisgICAgZWxzZSBkbworICAgIHcgPC0gUC5hbnlXb3JkOAorICAgIGxldCBrdCA9IHR5cGVGcm9tICQgdyBgc2hpZnRSYCA0CisgICAgICAgIHZ0ID0gdHlwZUZyb20gJCB3IC4mLiAweDBGCisgICAgVE1hcCBrdCB2dCA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4KK3BhcnNlQ29tcGFjdFZhbHVlIChUX0xJU1QgdHkpID0gVExpc3QgdHkgPCQ+IHBhcnNlQ29tcGFjdExpc3QKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NFVCB0eSkgPSBUU2V0IHR5IDwkPiBwYXJzZUNvbXBhY3RMaXN0CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JPT0wgPSBUQm9vbCAuICgvPTApIDwkPiBQLmFueVdvcmQ4CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JZVEUgPSBUQnl0ZSAuIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0VmFsdWUgVF9JMTYgPSBUSTE2IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorcGFyc2VDb21wYWN0VmFsdWUgVF9JMzIgPSBUSTMyIDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorcGFyc2VDb21wYWN0VmFsdWUgVF9JNjQgPSBUSTY0IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0k2NAorcGFyc2VDb21wYWN0VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZUxFIDwkPiBQLnRha2UgOAorcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVFN0cmluZworcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVEJpbmFyeQorcGFyc2VDb21wYWN0VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQorCitwYXJzZUNvbXBhY3RTdHJpbmcgdHkgPSBkbworICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGxlbikKKworcGFyc2VDb21wYWN0U3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQ29tcGFjdFN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBwYXJzZUZpZWxkcyAwCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZHMgOjogSW50MTYgLT4gUGFyc2VyIFsoSW50MTYsIChMVC5UZXh0LCBUaHJpZnRWYWwpKV0KKyAgICBwYXJzZUZpZWxkcyBsYXN0SWQgPSBkbworICAgICAgdyA8LSBQLmFueVdvcmQ4CisgICAgICBpZiB3ID09IDB4MDAKKyAgICAgICAgdGhlbiByZXR1cm4gW10KKyAgICAgICAgZWxzZSBkbworICAgICAgICAgIGxldCB0eSA9IHR5cGVGcm9tICh3IC4mLiAweDBGKQorICAgICAgICAgICAgICBtb2RpZmllciA9ICh3IC4mLiAweEYwKSBgc2hpZnRSYCA0CisgICAgICAgICAgZmlkIDwtIGlmIG1vZGlmaWVyIC89IDAKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKGxhc3RJZCArIGZyb21JbnRlZ3JhbCBtb2RpZmllcikKKyAgICAgICAgICAgICAgICAgZWxzZSBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorICAgICAgICAgIHZhbCA8LSBpZiB0eSA9PSBUX0JPT0wKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKFRCb29sICQgKHcgLiYuIDB4MEYpID09IDB4MDEpCisgICAgICAgICAgICAgICAgIGVsc2UgY2FzZSAodHksIE1hcC5sb29rdXAgZmlkIHRtYXApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcGFyc2VDb21wYWN0VmFsdWUgdHkKKyAgICAgICAgICAoKGZpZCwgKExULmVtcHR5LCB2YWwpKSA6ICkgPCQ+IHBhcnNlRmllbGRzIGZpZAorCitwYXJzZUNvbXBhY3RNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+CisgICAgICAgICAgICAgICAgICAgUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gZG8KKyAgayA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBrdAorICB2IDwtIHBhcnNlQ29tcGFjdFZhbHVlIHZ0CisgICgoayx2KSA6KSA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IChuLTEpCisKK3BhcnNlQ29tcGFjdExpc3QgOjogUGFyc2VyIFtUaHJpZnRWYWxdCitwYXJzZUNvbXBhY3RMaXN0ID0gZG8KKyAgdyA8LSBQLmFueVdvcmQ4CisgIGxldCB0eSA9IHR5cGVGcm9tICQgdyAuJi4gMHgwRgorICAgICAgbHNpemUgPSB3IGBzaGlmdFJgIDQKKyAgc2l6ZSA8LSBpZiBsc2l6ZSA9PSAweEYKKyAgICAgICAgICB0aGVuIHBhcnNlVmFyaW50IGlkCisgICAgICAgICAgZWxzZSByZXR1cm4gJCBmcm9tSW50ZWdyYWwgbHNpemUKKyAgbG9vcCB0eSBzaXplCisgIHdoZXJlCisgICAgbG9vcCA6OiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorICAgIGxvb3AgdHkgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGxpZnRNMiAoOikgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIHR5IChuLTEpKQorCistLSBTaWduZWQgbnVtYmVycyBtdXN0IGJlIGNvbnZlcnRlZCB0byAiWmlnIFphZyIgZm9ybWF0IGJlZm9yZSB0aGV5IGNhbiBiZQorLS0gc2VyaWFsaXplZCBpbiB0aGUgVmFyaW50IGZvcm1hdAoraTE2VG9aaWdaYWcgOjogSW50MTYgLT4gV29yZDE2CitpMTZUb1ppZ1phZyBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0TGAgMSkgYHhvcmAgKG4gYHNoaWZ0UmAgMTUpCisKK3ppZ1phZ1RvSTE2IDo6IFdvcmQxNiAtPiBJbnQxNgoremlnWmFnVG9JMTYgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdFJgIDEpIGB4b3JgIG5lZ2F0ZSAobiAuJi4gMHgxKQorCitpMzJUb1ppZ1phZyA6OiBJbnQzMiAtPiBXb3JkMzIKK2kzMlRvWmlnWmFnIG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRMYCAxKSBgeG9yYCAobiBgc2hpZnRSYCAzMSkKKworemlnWmFnVG9JMzIgOjogV29yZDMyIC0+IEludDMyCit6aWdaYWdUb0kzMiBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0UmAgMSkgYHhvcmAgbmVnYXRlIChuIC4mLiAweDEpCisKK2k2NFRvWmlnWmFnIDo6IEludDY0IC0+IFdvcmQ2NAoraTY0VG9aaWdaYWcgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdExgIDEpIGB4b3JgIChuIGBzaGlmdFJgIDYzKQorCit6aWdaYWdUb0k2NCA6OiBXb3JkNjQgLT4gSW50NjQKK3ppZ1phZ1RvSTY0IG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRSYCAxKSBgeG9yYCBuZWdhdGUgKG4gLiYuIDB4MSkKKworYnVpbGRWYXJpbnQgOjogKEJpdHMgYSwgSW50ZWdyYWwgYSkgID0+IGEgLT4gQnVpbGRlcgorYnVpbGRWYXJpbnQgbiB8IG4gLiYuIGNvbXBsZW1lbnQgMHg3RiA9PSAwID0gQi53b3JkOCAkIGZyb21JbnRlZ3JhbCBuCisgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gQi53b3JkOCAoMHg4MCAufC4gKGZyb21JbnRlZ3JhbCBuIC4mLiAweDdGKSkgPD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFZhcmludCAobiBgc2hpZnRSYCA3KQorCitwYXJzZVZhcmludCA6OiAoQml0cyBhLCBJbnRlZ3JhbCBhLCBPcmQgYSkgPT4gKGEgLT4gYikgLT4gUGFyc2VyIGIKK3BhcnNlVmFyaW50IGZyb21aaWdaYWcgPSBkbworICBieXRlc3RlbXAgPC0gQlMudW5wYWNrIDwkPiBQLnRha2VUaWxsIChub3QgLiBmbGlwIHRlc3RCaXQgNykKKyAgbHNiIDwtIFAuYW55V29yZDgKKyAgbGV0IGJ5dGVzID0gbHNiIDogTGlzdC5yZXZlcnNlIGJ5dGVzdGVtcAorICByZXR1cm4gJCBmcm9tWmlnWmFnICQgTGlzdC5mb2xkbCcgY29tYmluZSAweDAwIGJ5dGVzCisgIHdoZXJlIGNvbWJpbmUgYSBiID0gKGEgYHNoaWZ0TGAgNykgLnwuIChmcm9tSW50ZWdyYWwgYiAuJi4gMHg3ZikKKworLS0gfCBDb21wdXRlIHRoZSBDb21wYWN0IFR5cGUKK2Zyb21UVHlwZSA6OiBUaHJpZnRUeXBlIC0+IFdvcmQ4Citmcm9tVFR5cGUgdHkgPSBjYXNlIHR5IG9mCisgIFRfU1RPUCAtPiAweDAwCisgIFRfQk9PTCAtPiAweDAxCisgIFRfQllURSAtPiAweDAzCisgIFRfSTE2IC0+IDB4MDQKKyAgVF9JMzIgLT4gMHgwNQorICBUX0k2NCAtPiAweDA2CisgIFRfRE9VQkxFIC0+IDB4MDcKKyAgVF9TVFJJTkcgLT4gMHgwOAorICBUX0JJTkFSWSAtPiAweDA4CisgIFRfTElTVHt9IC0+IDB4MDkKKyAgVF9TRVR7fSAtPiAweDBBCisgIFRfTUFQe30gLT4gMHgwQgorICBUX1NUUlVDVHt9IC0+IDB4MEMKKyAgVF9WT0lEIC0+IGVycm9yICJObyBDb21wYWN0IHR5cGUgZm9yIFRfVk9JRCIKKwordHlwZU9mIDo6IFRocmlmdFZhbCAtPiBXb3JkOAordHlwZU9mIHYgPSBjYXNlIHYgb2YKKyAgVEJvb2wgVHJ1ZSAtPiAweDAxCisgIFRCb29sIEZhbHNlIC0+IDB4MDIKKyAgVEJ5dGUgXyAtPiAweDAzCisgIFRJMTYgXyAtPiAweDA0CisgIFRJMzIgXyAtPiAweDA1CisgIFRJNjQgXyAtPiAweDA2CisgIFREb3VibGUgXyAtPiAweDA3CisgIFRTdHJpbmcgXyAtPiAweDA4CisgIFRCaW5hcnkgXyAtPiAweDA4CisgIFRMaXN0e30gLT4gMHgwOQorICBUU2V0e30gLT4gMHgwQQorICBUTWFwe30gLT4gMHgwQgorICBUU3RydWN0e30gLT4gMHgwQworCit0eXBlRnJvbSA6OiBXb3JkOCAtPiBUaHJpZnRUeXBlCit0eXBlRnJvbSB3ID0gY2FzZSB3IG9mCisgIDB4MDEgLT4gVF9CT09MCisgIDB4MDIgLT4gVF9CT09MCisgIDB4MDMgLT4gVF9CWVRFCisgIDB4MDQgLT4gVF9JMTYKKyAgMHgwNSAtPiBUX0kzMgorICAweDA2IC0+IFRfSTY0CisgIDB4MDcgLT4gVF9ET1VCTEUKKyAgMHgwOCAtPiBUX1NUUklORworICAweDA5IC0+IFRfTElTVCBUX1ZPSUQKKyAgMHgwQSAtPiBUX1NFVCBUX1ZPSUQKKyAgMHgwQiAtPiBUX01BUCBUX1ZPSUQgVF9WT0lECisgIDB4MEMgLT4gVF9TVFJVQ1QgTWFwLmVtcHR5CisgIG4gLT4gZXJyb3IgJCAidHlwZUZyb206ICIgKysgc2hvdyBuICsrICIgaXMgbm90IGEgY29tcGFjdCB0eXBlIgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9IZWFkZXIuaHMKQEAgLTAsMCArMSwxNDEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBIZWFkZXJQcm90b2NvbCguLikKKyAgICAsIGdldFByb3RvY29sVHlwZQorICAgICwgc2V0UHJvdG9jb2xUeXBlCisgICAgLCBnZXRIZWFkZXJzCisgICAgLCBnZXRXcml0ZUhlYWRlcnMKKyAgICAsIHNldEhlYWRlcgorICAgICwgc2V0SGVhZGVycworICAgICwgY3JlYXRlSGVhZGVyUHJvdG9jb2wKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sMQorICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFdyYXAgPSBmb3JhbGwgYS4gKFByb3RvY29sIGEpID0+IFByb3RvY29sV3JhcChhKQorCitpbnN0YW5jZSBQcm90b2NvbCBQcm90b2NvbFdyYXAgd2hlcmUKKyAgcmVhZEJ5dGUgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRCeXRlIHAKKyAgcmVhZFZhbCAoUHJvdG9jb2xXcmFwIHApID0gcmVhZFZhbCBwCisgIHJlYWRNZXNzYWdlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkTWVzc2FnZSBwCisgIHdyaXRlVmFsIChQcm90b2NvbFdyYXAgcCkgPSB3cml0ZVZhbCBwCisgIHdyaXRlTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVNZXNzYWdlIHAKKworZGF0YSBIZWFkZXJQcm90b2NvbCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCB7CisgICAgdHJhbnMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbywKKyAgICB3cmFwcGVkUHJvdG8gOjogSU9SZWYgUHJvdG9jb2xXcmFwCisgIH0KKworY3JlYXRlUHJvdG9jb2xXcmFwIDo6IFRyYW5zcG9ydCB0ID0+IFByb3RvY29sVHlwZSAtPiB0IC0+IFByb3RvY29sV3JhcAorY3JlYXRlUHJvdG9jb2xXcmFwIHR5cCB0ID0KKyAgY2FzZSB0eXAgb2YKKyAgICBUQmluYXJ5IC0+IFByb3RvY29sV3JhcCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICBUQ29tcGFjdCAtPiBQcm90b2NvbFdyYXAgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgIFRKU09OIC0+IFByb3RvY29sV3JhcCAkIEpTT05Qcm90b2NvbCB0CisKK2NyZWF0ZUhlYWRlclByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyhIZWFkZXJQcm90b2NvbCBpIG8pCitjcmVhdGVIZWFkZXJQcm90b2NvbCBpIG8gPSBkbworICB0IDwtIG9wZW5IZWFkZXJUcmFuc3BvcnQgaSBvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBwcm90byA8LSBuZXdJT1JlZiAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgdAorICByZXR1cm4gJCBIZWFkZXJQcm90b2NvbCB7IHRyYW5zID0gdCwgd3JhcHBlZFByb3RvID0gcHJvdG8gfQorCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgOjogVHJhbnNwb3J0IHQgPT4gdCAtPiBJTyhIZWFkZXJQcm90b2NvbCB0IHQpCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgdCA9IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdAorCityZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBJTyAoKQorcmVzZXRQcm90b2NvbCBwID0gZG8KKyAgcGlkIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKyAgd3JpdGVJT1JlZiAod3JhcHBlZFByb3RvIHApICQgY3JlYXRlUHJvdG9jb2xXcmFwIHBpZCAkIHRyYW5zIHAKKworZ2V0V3JhcHBlZCA9IHJlYWRJT1JlZiAuIHdyYXBwZWRQcm90bworCitzZXRUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc3BvcnQgcCB0ID0gcCB7IHRyYW5zID0gdCB9CisKK3VwZGF0ZVRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gKEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyVHJhbnNwb3J0IGkgbyktPiBIZWFkZXJQcm90b2NvbCBpIG8KK3VwZGF0ZVRyYW5zcG9ydCBwIGYgPSBzZXRUcmFuc3BvcnQgcCAoZiAkIHRyYW5zIHApCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCistLSBUT0RPOiB3ZSB3YW50IHRvIHNldCBoZWFkZXJzIHdpdGhvdXQgcmVjcmVhdGluZyBjbGllbnQuLi4KK3NldEhlYWRlciA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gU3RyaW5nIC0+IFN0cmluZyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlciBwIGsgdiA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlSGVhZGVycyA9IE1hcC5pbnNlcnQgayB2ICQgd3JpdGVIZWFkZXJzIHQgfQorCitzZXRIZWFkZXJzIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJzIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0SGVhZGVycyBwIGggPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBoIH0KKworLS0gVE9ETzogbWFrZSBpdCBwdWJsaWMgb25jZSB3ZSBoYXZlIGZpcnN0IHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiBmb3IgSGFza2VsbAorc2V0VHJhbnNmb3JtcyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gW1RyYW5zZm9ybVR5cGVdIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNmb3JtcyBwIHRycyA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRycyB9CisKK3NldFRyYW5zZm9ybSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gVHJhbnNmb3JtVHlwZSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybSBwIHRyID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVUcmFuc2Zvcm1zID0gdHI6KHdyaXRlVHJhbnNmb3JtcyB0KSB9CisKK2dldFdyaXRlSGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycworZ2V0V3JpdGVIZWFkZXJzID0gd3JpdGVIZWFkZXJzIC4gdHJhbnMKKworZ2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gWyhTdHJpbmcsIFN0cmluZyldCitnZXRIZWFkZXJzID0gcmVhZElPUmVmIC4gaGVhZGVycyAuIHRyYW5zCisKK2dldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbFR5cGUgcCA9IHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKworc2V0UHJvdG9jb2xUeXBlIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3NldFByb3RvY29sVHlwZSBwIHR5cCA9IGRvCisgIHR5cDAgPC0gZ2V0UHJvdG9jb2xUeXBlIHAKKyAgaWYgdHlwID09IHR5cDAKKyAgICB0aGVuIHJldHVybiAoKQorICAgIGVsc2UgZG8KKyAgICAgIHRTZXRQcm90b2NvbCAodHJhbnMgcCkgdHlwCisgICAgICByZXNldFByb3RvY29sIHAKKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gUHJvdG9jb2wgKEhlYWRlclByb3RvY29sIGkgbykgd2hlcmUKKyAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsICh0cmFucyBwKSAxCisKKyAgcmVhZFZhbCBwIHRwID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkVmFsIHByb3RvIHRwCisKKyAgcmVhZE1lc3NhZ2UgcCBmID0gZG8KKyAgICB0UmVzZXRQcm90b2NvbCAodHJhbnMgcCkKKyAgICByZXNldFByb3RvY29sIHAKKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkTWVzc2FnZSBwcm90byBmCisKKyAgd3JpdGVWYWwgcCB2ID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZVZhbCBwcm90byB2CisKKyAgd3JpdGVNZXNzYWdlIHAgeCBmID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZU1lc3NhZ2UgcHJvdG8geCBmCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCkBAIC0wLDAgKzEsMzYyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19Cit7LSMgTEFOR1VBR0UgVHVwbGVTZWN0aW9ucyAjLX0KKworbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5KU09OCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBKU09OUHJvdG9jb2woLi4pCisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uIChicmFja2V0KQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuQ2hhcjggYXMgUEMKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkJhc2U2NC5MYXp5IGFzIEI2NEMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydywgdzJjKQoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0CitpbXBvcnQgRGF0YS5NYXliZSAoY2F0TWF5YmVzKQoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHlwZXMKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IFRoZSBKU09OIFByb3RvY29sIGRhdGEgdXNlcyB0aGUgc3RhbmRhcmQgJ1RKU09OUHJvdG9jb2wnLiAgRGF0YSBpcworLS0gZW5jb2RlZCBhcyBhIEpTT04gJ0J5dGVTdHJpbmcnCitkYXRhIEpTT05Qcm90b2NvbCB0ID0gSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0cnVjdCBhICdKU09OUHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEpTT05Qcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoSlNPTlByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorCisgICAgd3JpdGVNZXNzYWdlIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQgLiBjb25zdAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHRXcml0ZSB0ICQgdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KKyAgICAgICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGZyb21FbnVtIHR5KSA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJworICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gZG8KKyAgICAgICAgICB0V3JpdGUgdCAiXSIKKyAgICAgICAgICB0Rmx1c2ggdAorCisgICAgcmVhZE1lc3NhZ2UgcCA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IGRvCisgICAgICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKKyAgICAgICAgICBjYXNlIGRlY29kZVV0ZjgnIGJzIG9mCisgICAgICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKKyAgICAgICAgICAgIFJpZ2h0IHN0ciAtPiBkbworICAgICAgICAgICAgICB0eSA8LSB0b0VudW0gPCQ+IChsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkpCisgICAgICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHIsIHR5LCBzZXFOdW0pCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKworICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VKU09OVmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gV3JpdGluZyBGdW5jdGlvbnMKKworYnVpbGRKU09OVmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkSlNPTlZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05TdHJ1Y3QgZmllbGRzIDw+IEIuY2hhcjggJ30nCitidWlsZEpTT05WYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIEIuY2hhcjggJ1snIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIGt0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIHZ0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGxlbmd0aCBlbnRyaWVzKSA8PgorICBCLmNoYXI4ICcsJyA8PiBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05NYXAgZW50cmllcyA8PiBCLmNoYXI4ICd9JyA8PgorICBCLmNoYXI4ICddJworYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgQi5jaGFyOCAnWycgPD4gQi5jaGFyOCAnIicgPD4gZ2V0VHlwZU5hbWUgdHkgPD4gQi5jaGFyOCAnIicgPD4KKyAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAobGVuZ3RoIGVudHJpZXMpIDw+CisgIChpZiBsZW5ndGggZW50cmllcyA+IDAKKyAgIHRoZW4gQi5jaGFyOCAnLCcgPD4gYnVpbGRKU09OTGlzdCBlbnRyaWVzCisgICBlbHNlIG1lbXB0eSkgPD4KKyAgQi5jaGFyOCAnXScKK2J1aWxkSlNPTlZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0gYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpCitidWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5jaGFyOCAnMScgZWxzZSBCLmNoYXI4ICcwJworYnVpbGRKU09OVmFsdWUgKFRCeXRlIGIpID0gYnVpbGRTaG93YWJsZSBiCitidWlsZEpTT05WYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkU2hvd2FibGUgaQorYnVpbGRKU09OVmFsdWUgKFRJMzIgaSkgPSBidWlsZFNob3dhYmxlIGkKK2J1aWxkSlNPTlZhbHVlIChUSTY0IGkpID0gYnVpbGRTaG93YWJsZSBpCitidWlsZEpTT05WYWx1ZSAoVERvdWJsZSBkKSA9IGJ1aWxkU2hvd2FibGUgZAorYnVpbGRKU09OVmFsdWUgKFRTdHJpbmcgcykgPSBCLmNoYXI4ICdcIicgPD4gZXNjYXBlIHMgPD4gQi5jaGFyOCAnXCInCitidWlsZEpTT05WYWx1ZSAoVEJpbmFyeSBzKSA9IEIuY2hhcjggJ1wiJyA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAuIEI2NEMuZW5jb2RlICQgcykgPD4gQi5jaGFyOCAnXCInCisKK2J1aWxkSlNPTlN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZEpTT05TdHJ1Y3QgPSBtY29uY2F0IC4gaW50ZXJzcGVyc2UgKEIuY2hhcjggJywnKSAuIE1hcC5mb2xkcldpdGhLZXkgYnVpbGRGaWVsZCBbXQorICB3aGVyZSAKKyAgICBidWlsZEZpZWxkIGZpZCAoXyx2YWwpID0gKDopICQKKyAgICAgIEIuY2hhcjggJyInIDw+IGJ1aWxkU2hvd2FibGUgZmlkIDw+IEIuc3RyaW5nOCAiXCI6IiA8PiAKKyAgICAgIEIuY2hhcjggJ3snIDw+CisgICAgICBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSAoZ2V0VHlwZU9mIHZhbCkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+CisgICAgICBidWlsZEpTT05WYWx1ZSB2YWwgPD4KKyAgICAgIEIuY2hhcjggJ30nCisKK2J1aWxkSlNPTk1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRKU09OTWFwID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRLVgorICB3aGVyZQorICAgIGJ1aWxkS1YgKGtleUAoVFN0cmluZyBfKSwgdmFsKSA9CisgICAgICBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5jaGFyOCAnOicgPD4gYnVpbGRKU09OVmFsdWUgdmFsCisgICAgYnVpbGRLViAoa2V5LCB2YWwpID0KKyAgICAgIEIuY2hhcjggJ1wiJyA8PiBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+IGJ1aWxkSlNPTlZhbHVlIHZhbAorYnVpbGRKU09OTGlzdCA6OiBbVGhyaWZ0VmFsXSAtPiBCdWlsZGVyCitidWlsZEpTT05MaXN0ID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRKU09OVmFsdWUKKworYnVpbGRTaG93YWJsZSA6OiBTaG93IGEgPT4gYSAtPiAgQnVpbGRlcgorYnVpbGRTaG93YWJsZSA9IEIuc3RyaW5nOCAuIHNob3cKKworLS0gUmVhZGluZyBGdW5jdGlvbnMKKworcGFyc2VKU09OVmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUpTT05WYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPQorICBUU3RydWN0IDwkPiAobGV4ZW1lIChQQy5jaGFyOCAneycpICo+IHBhcnNlSlNPTlN0cnVjdCB0bWFwIDwqIFBDLmNoYXI4ICd9JykKK3BhcnNlSlNPTlZhbHVlIChUX01BUCBrdCB2dCkgPSBmbWFwIChUTWFwIGt0IHZ0KSAkCisgIGJldHdlZW4gJ1snICddJyAkCisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGRlY2ltYWwgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgYmV0d2VlbiAneycgJ30nIChwYXJzZUpTT05NYXAga3QgdnQpCitwYXJzZUpTT05WYWx1ZSAoVF9MSVNUIHR5KSA9IGZtYXAgKFRMaXN0IHR5KSAkCisgIGJldHdlZW4gJ1snICddJyAkIGRvCisgICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZGVjaW1hbAorICAgIGlmIGxlbiA+IDAKKyAgICAgIHRoZW4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCitwYXJzZUpTT05WYWx1ZSAoVF9TRVQgdHkpID0gZm1hcCAoVFNldCB0eSkgJAorICBiZXR3ZWVuICdbJyAnXScgJCBkbworICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuICBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gcGFyc2VKU09OTGlzdCB0eQorICAgICAgZWxzZSByZXR1cm4gW10KK3BhcnNlSlNPTlZhbHVlIFRfQk9PTCA9CisgIChUQm9vbCBUcnVlIDwkIFBDLmNoYXI4ICcxJykgPHw+IChUQm9vbCBGYWxzZSA8JCBQQy5jaGFyOCAnMCcpCitwYXJzZUpTT05WYWx1ZSBUX0JZVEUgPSBUQnl0ZSA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTMyID0gVEkzMiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSA8JD4gZG91YmxlCitwYXJzZUpTT05WYWx1ZSBUX1NUUklORyA9IFRTdHJpbmcgPCQ+IGVzY2FwZWRTdHJpbmcKK3BhcnNlSlNPTlZhbHVlIFRfQklOQVJZID0gVEJpbmFyeSA8JD4gYmFzZTY0U3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX1NUT1AgPSBmYWlsICJwYXJzZUpTT05WYWx1ZTogY2Fubm90IHBhcnNlIHR5cGUgVF9TVE9QIgorcGFyc2VKU09OVmFsdWUgVF9WT0lEID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfVk9JRCIKKworcGFyc2VBbnlWYWx1ZSA6OiBQYXJzZXIgKCkKK3BhcnNlQW55VmFsdWUgPSBjaG9pY2UgJAorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICd7JyAnfScgOgorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICdbJyAnXScgOgorICAgICAgICAgICAgICAgIG1hcCAodm9pZCAuIHBhcnNlSlNPTlZhbHVlKQorICAgICAgICAgICAgICAgICAgWyBUX0JPT0wKKyAgICAgICAgICAgICAgICAgICwgVF9JMTYKKyAgICAgICAgICAgICAgICAgICwgVF9JMzIKKyAgICAgICAgICAgICAgICAgICwgVF9JNjQKKyAgICAgICAgICAgICAgICAgICwgVF9ET1VCTEUKKyAgICAgICAgICAgICAgICAgICwgVF9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICwgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgIF0KKyAgd2hlcmUKKyAgICBza2lwQmV0d2VlbiA6OiBDaGFyIC0+IENoYXIgLT4gUGFyc2VyICgpCisgICAgc2tpcEJldHdlZW4gYSBiID0gYmV0d2VlbiBhIGIgJCB2b2lkIChQQy5zYXRpc2Z5IChcYyAtPiBjIC89IGEgJiYgYyAvPSBiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx8PiBza2lwQmV0d2VlbiBhIGIKKworcGFyc2VKU09OU3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlSlNPTlN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IC4gY2F0TWF5YmVzIDwkPiBwYXJzZUZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZCA9IGRvCisgICAgICBmaWQgPC0gbGV4ZW1lIChiZXR3ZWVuICciJyAnIicgZGVjaW1hbCkgPCogbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICBjYXNlIE1hcC5sb29rdXAgZmlkIHRtYXAgb2YKKyAgICAgICAgSnVzdCAoc3RyLCBmdHlwZSkgLT4gYmV0d2VlbiAneycgJ30nICQgZG8KKyAgICAgICAgICBfIDwtIGxleGVtZSAoZXNjYXBlZFN0cmluZykgKj4gbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICAgICAgdmFsIDwtIGxleGVtZSAocGFyc2VKU09OVmFsdWUgZnR5cGUpCisgICAgICAgICAgcmV0dXJuICQgSnVzdCAoZmlkLCAoc3RyLCB2YWwpKQorICAgICAgICBOb3RoaW5nIC0+IGxleGVtZSBwYXJzZUFueVZhbHVlICo+IHJldHVybiBOb3RoaW5nCisKK3BhcnNlSlNPTk1hcCA6OiBUaHJpZnRUeXBlIC0+IFRocmlmdFR5cGUgLT4gUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VKU09OTWFwIGt0IHZ0ID0KKyAgKCgsKSA8JD4gbGV4ZW1lIChwYXJzZUpTT05LZXkga3QpIDwqPgorICAgKGxleGVtZSAoUEMuY2hhcjggJzonKSAqPiBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHZ0KSkpIGBzZXBCeWAKKyAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VKU09OS2V5IFRfU1RSSU5HID0gcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcKKyAgICBwYXJzZUpTT05LZXkgVF9CSU5BUlkgPSBwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWQorICAgIHBhcnNlSlNPTktleSBrdCA9IFBDLmNoYXI4ICciJyAqPiBwYXJzZUpTT05WYWx1ZSBrdCA8KiBQQy5jaGFyOCAnIicKKworcGFyc2VKU09OTGlzdCA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VKU09OTGlzdCB0eSA9IGxleGVtZSAocGFyc2VKU09OVmFsdWUgdHkpIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisKK2VzY2FwZWRTdHJpbmcgOjogUGFyc2VyIExCUy5CeXRlU3RyaW5nCitlc2NhcGVkU3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAgKExCUy5wYWNrIDwkPiBQLm1hbnknIChlc2NhcGVkQ2hhciA8fD4gbm90Q2hhcjggJyInKSkgPCoKKyAgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKworYmFzZTY0U3RyaW5nIDo6IFBhcnNlciBMQlMuQnl0ZVN0cmluZworYmFzZTY0U3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAoZGVjb2RlQmFzZTY0IC4gTEJTQy5wYWNrIDwkPiBQLm1hbnknIChQQy5ub3RDaGFyICciJykpIDwqCisgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKyAgICAgICAgICAgICAgIHdoZXJlCisgICAgICAgICAgICAgICAgIGRlY29kZUJhc2U2NCBiID0KKyAgICAgICAgICAgICAgICAgICBsZXQgcGFkZGVkID0gY2FzZSAoTEJTLmxlbmd0aCBiKSBgbW9kYCA0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtPiBMQlMuYXBwZW5kIGIgIj09IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLT4gTEJTLmFwcGVuZCBiICI9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gYiBpbgorICAgICAgICAgICAgICAgICAgIGNhc2UgQjY0Qy5kZWNvZGUgcGFkZGVkIG9mCisgICAgICAgICAgICAgICAgICAgICBSaWdodCBzIC0+IHMKKyAgICAgICAgICAgICAgICAgICAgIExlZnQgeCAtPiBlcnJvciB4CisKK2VzY2FwZWRDaGFyIDo6IFBhcnNlciBXb3JkOAorZXNjYXBlZENoYXIgPSBQQy5jaGFyOCAnXFwnICo+IChjMncgPCQ+IGNob2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdcU09IJyA8JCBQLnN0cmluZyAidTAwMDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTVFgnIDwkIFAuc3RyaW5nICJ1MDAwMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUWCcgPCQgUC5zdHJpbmcgInUwMDAzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU9UJyA8JCBQLnN0cmluZyAidTAwMDQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTlEnIDwkIFAuc3RyaW5nICJ1MDAwNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEFDSycgPCQgUC5zdHJpbmcgInUwMDA2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQkVMJyA8JCBQLnN0cmluZyAidTAwMDciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xCUycgIDwkIFAuc3RyaW5nICJ1MDAwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFZUJyAgPCQgUC5zdHJpbmcgInUwMDBiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRkYnICA8JCBQLnN0cmluZyAidTAwMGMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xDUicgIDwkIFAuc3RyaW5nICJ1MDAwZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNPJyAgPCQgUC5zdHJpbmcgInUwMDBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU0knICA8JCBQLnN0cmluZyAidTAwMGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xETEUnIDwkIFAuc3RyaW5nICJ1MDAxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDMScgPCQgUC5zdHJpbmcgInUwMDExIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcREMyJyA8JCBQLnN0cmluZyAidTAwMTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzMnIDwkIFAuc3RyaW5nICJ1MDAxMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDNCcgPCQgUC5zdHJpbmcgInUwMDE0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcTkFLJyA8JCBQLnN0cmluZyAidTAwMTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTWU4nIDwkIFAuc3RyaW5nICJ1MDAxNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUQicgPCQgUC5zdHJpbmcgInUwMDE3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQ0FOJyA8JCBQLnN0cmluZyAidTAwMTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTScgIDwkIFAuc3RyaW5nICJ1MDAxOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNVQicgPCQgUC5zdHJpbmcgInUwMDFhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRVNDJyA8JCBQLnN0cmluZyAidTAwMWIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xGUycgIDwkIFAuc3RyaW5nICJ1MDAxYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEdTJyAgPCQgUC5zdHJpbmcgInUwMDFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcUlMnICA8JCBQLnN0cmluZyAidTAwMWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xVUycgIDwkIFAuc3RyaW5nICJ1MDAxZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERFTCcgPCQgUC5zdHJpbmcgInUwMDdmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcMCcgPCQgUEMuY2hhciAnMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXGEnIDwkIFBDLmNoYXIgJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xiJyA8JCBQQy5jaGFyICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcZicgPCQgUEMuY2hhciAnZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXG4nIDwkIFBDLmNoYXIgJ24nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xyJyA8JCBQQy5jaGFyICdyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcdCcgPCQgUEMuY2hhciAndCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXHYnIDwkIFBDLmNoYXIgJ3YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1wiJyA8JCBQQy5jaGFyICciJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcJycgPCQgUEMuY2hhciAnXCcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xcJyA8JCBQQy5jaGFyICdcXCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnLycgIDwkIFBDLmNoYXIgJy8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKK2VzY2FwZSA6OiBMQlMuQnl0ZVN0cmluZyAtPiBCdWlsZGVyCitlc2NhcGUgPSBMQlMuZm9sZGwnIGVzY2FwZUNoYXIgbWVtcHR5CisgIHdoZXJlCisgICAgZXNjYXBlQ2hhciBiIHcgPSBiIDw+IChCLmxhenlCeXRlU3RyaW5nICQgY2FzZSB3MmMgdyBvZgorICAgICAgJ1wwJyAtPiAiXFwwIgorICAgICAgJ1xiJyAtPiAiXFxiIgorICAgICAgJ1xmJyAtPiAiXFxmIgorICAgICAgJ1xuJyAtPiAiXFxuIgorICAgICAgJ1xyJyAtPiAiXFxyIgorICAgICAgJ1x0JyAtPiAiXFx0IgorICAgICAgJ1wiJyAtPiAiXFxcIiIKKyAgICAgICdcXCcgLT4gIlxcXFwiCisgICAgICAnXFNPSCcgLT4gIlxcdTAwMDEiCisgICAgICAnXFNUWCcgLT4gIlxcdTAwMDIiCisgICAgICAnXEVUWCcgLT4gIlxcdTAwMDMiCisgICAgICAnXEVPVCcgLT4gIlxcdTAwMDQiCisgICAgICAnXEVOUScgLT4gIlxcdTAwMDUiCisgICAgICAnXEFDSycgLT4gIlxcdTAwMDYiCisgICAgICAnXEJFTCcgLT4gIlxcdTAwMDciCisgICAgICAnXFZUJyAgLT4gIlxcdTAwMGIiCisgICAgICAnXFNPJyAgLT4gIlxcdTAwMGUiCisgICAgICAnXFNJJyAgLT4gIlxcdTAwMGYiCisgICAgICAnXERMRScgLT4gIlxcdTAwMTAiCisgICAgICAnXERDMScgLT4gIlxcdTAwMTEiCisgICAgICAnXERDMicgLT4gIlxcdTAwMTIiCisgICAgICAnXERDMycgLT4gIlxcdTAwMTMiCisgICAgICAnXERDNCcgLT4gIlxcdTAwMTQiCisgICAgICAnXE5BSycgLT4gIlxcdTAwMTUiCisgICAgICAnXFNZTicgLT4gIlxcdTAwMTYiCisgICAgICAnXEVUQicgLT4gIlxcdTAwMTciCisgICAgICAnXENBTicgLT4gIlxcdTAwMTgiCisgICAgICAnXEVNJyAgLT4gIlxcdTAwMTkiCisgICAgICAnXFNVQicgLT4gIlxcdTAwMWEiCisgICAgICAnXEVTQycgLT4gIlxcdTAwMWIiCisgICAgICAnXEZTJyAgLT4gIlxcdTAwMWMiCisgICAgICAnXEdTJyAgLT4gIlxcdTAwMWQiCisgICAgICAnXFJTJyAgLT4gIlxcdTAwMWUiCisgICAgICAnXFVTJyAgLT4gIlxcdTAwMWYiCisgICAgICAnXERFTCcgLT4gIlxcdTAwN2YiCisgICAgICBfIC0+IExCUy5zaW5nbGV0b24gdykKKworbGV4ZW1lIDo6IFBhcnNlciBhIC0+IFBhcnNlciBhCitsZXhlbWUgPSAoPCogc2tpcFNwYWNlKQorCitub3RDaGFyOCA6OiBDaGFyIC0+IFBhcnNlciBXb3JkOAorbm90Q2hhcjggYyA9IFAuc2F0aXNmeSAoLz0gYzJ3IGMpCisKK2JldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciBhIC0+IFBhcnNlciBhCitiZXR3ZWVuIGEgYiBwID0gbGV4ZW1lIChQQy5jaGFyOCBhKSAqPiBsZXhlbWUgcCA8KiBsZXhlbWUgKFBDLmNoYXI4IGIpCisKK2dldFR5cGVOYW1lIDo6IFRocmlmdFR5cGUgLT4gQnVpbGRlcgorZ2V0VHlwZU5hbWUgdHkgPSBCLnN0cmluZzggJCBjYXNlIHR5IG9mCisgIFRfU1RSVUNUIF8gLT4gInJlYyIKKyAgVF9NQVAgXyBfICAtPiAibWFwIgorICBUX0xJU1QgXyAgIC0+ICJsc3QiCisgIFRfU0VUIF8gICAgLT4gInNldCIKKyAgVF9CT09MICAgICAtPiAidGYiCisgIFRfQllURSAgICAgLT4gImk4IgorICBUX0kxNiAgICAgIC0+ICJpMTYiCisgIFRfSTMyICAgICAgLT4gImkzMiIKKyAgVF9JNjQgICAgICAtPiAiaTY0IgorICBUX0RPVUJMRSAgIC0+ICJkYmwiCisgIFRfU1RSSU5HICAgLT4gInN0ciIKKyAgVF9CSU5BUlkgICAtPiAic3RyIgorICBfIC0+IGVycm9yICJVbnJlY29nbml6ZWQgVHlwZSIKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCmluZGV4IDc3MDk2NWYuLjU0M2YzMzggMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKQEAgLTEsMyArMSw0IEBACit7LSMgTEFOR1VBR0UgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMzEsMzUgKzMyLDM1IEBACiBpbXBvcnQgU3lzdGVtLklPCiAKIGltcG9ydCBUaHJpZnQKLWltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlKCkKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiAKIAogLS0gfCBBIHRocmVhZGVkIHNldmVyIHRoYXQgaXMgY2FwYWJsZSBvZiB1c2luZyBhbnkgVHJhbnNwb3J0IG9yIFByb3RvY29sCiAtLSBpbnN0YW5jZXMuCi1ydW5UaHJlYWRlZFNlcnZlciA6OiAoVHJhbnNwb3J0IHQsIFByb3RvY29sIGksIFByb3RvY29sIG8pCi0gICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpIHQsIG8gdCkpCitydW5UaHJlYWRlZFNlcnZlciA6OiAoUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKKyAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGksIG8pKQogICAgICAgICAgICAgICAgICAgLT4gaAotICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGkgdCwgbyB0KSAtPiBJTyBCb29sKQorICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGksIG8pIC0+IElPIEJvb2wpCiAgICAgICAgICAgICAgICAgICAtPiBQb3J0SUQKICAgICAgICAgICAgICAgICAgIC0+IElPIGEKLXJ1blRocmVhZGVkU2VydmVyIGFjY2VwdGVyIGhhbmQgcHJvYyBwb3J0ID0gZG8KK3J1blRocmVhZGVkU2VydmVyIGFjY2VwdGVyIGhhbmQgcHJvY18gcG9ydCA9IGRvCiAgICAgc29ja2V0IDwtIGxpc3Rlbk9uIHBvcnQKLSAgICBhY2NlcHRMb29wIChhY2NlcHRlciBzb2NrZXQpIChwcm9jIGhhbmQpCisgICAgYWNjZXB0TG9vcCAoYWNjZXB0ZXIgc29ja2V0KSAocHJvY18gaGFuZCkKIAogLS0gfCBBIGJhc2ljIHRocmVhZGVkIGJpbmFyeSBwcm90b2NvbCBzb2NrZXQgc2VydmVyLgogcnVuQmFzaWNTZXJ2ZXIgOjogaAogICAgICAgICAgICAgICAgLT4gKGggLT4gKEJpbmFyeVByb3RvY29sIEhhbmRsZSwgQmluYXJ5UHJvdG9jb2wgSGFuZGxlKSAtPiBJTyBCb29sKQogICAgICAgICAgICAgICAgLT4gUG9ydE51bWJlcgogICAgICAgICAgICAgICAgLT4gSU8gYQotcnVuQmFzaWNTZXJ2ZXIgaGFuZCBwcm9jIHBvcnQgPSBydW5UaHJlYWRlZFNlcnZlciBiaW5hcnlBY2NlcHQgaGFuZCBwcm9jIChQb3J0TnVtYmVyIHBvcnQpCitydW5CYXNpY1NlcnZlciBoYW5kIHByb2NfIHBvcnQgPSBydW5UaHJlYWRlZFNlcnZlciBiaW5hcnlBY2NlcHQgaGFuZCBwcm9jXyAoUG9ydE51bWJlciBwb3J0KQogICB3aGVyZSBiaW5hcnlBY2NlcHQgcyA9IGRvCiAgICAgICAgICAgICAoaCwgXywgXykgPC0gYWNjZXB0IHMKICAgICAgICAgICAgIHJldHVybiAoQmluYXJ5UHJvdG9jb2wgaCwgQmluYXJ5UHJvdG9jb2wgaCkKIAogYWNjZXB0TG9vcCA6OiBJTyB0IC0+ICh0IC0+IElPIEJvb2wpIC0+IElPIGEKLWFjY2VwdExvb3AgYWNjZXB0ZXIgcHJvYyA9IGZvcmV2ZXIgJAorYWNjZXB0TG9vcCBhY2NlcHRlciBwcm9jXyA9IGZvcmV2ZXIgJAogICAgIGRvIHBzIDwtIGFjY2VwdGVyCi0gICAgICAgZm9ya0lPICQgaGFuZGxlIChcKGUgOjogU29tZUV4Y2VwdGlvbikgLT4gcmV0dXJuICgpKQotICAgICAgICAgICAgICAgICAgKGxvb3AgJCBwcm9jIHBzKQorICAgICAgIGZvcmtJTyAkIGhhbmRsZSAoXChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IHJldHVybiAoKSkKKyAgICAgICAgICAgICAgICAgIChsb29wICQgcHJvY18gcHMpCiAgIHdoZXJlIGxvb3AgbSA9IGRvIHsgY29udGludWUgPC0gbTsgd2hlbiBjb250aW51ZSAobG9vcCBtKSB9CmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKaW5kZXggODBlNDkxNC4uMzA2ZWRjMiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocwpAQCAtMSwzICsxLDUgQEAKK3stIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yNSwyOCArMjcsMzAgQEAKIAogaW1wb3J0IENvbnRyb2wuTW9uYWQgKCB3aGVuICkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIEV4Y2VwdGlvbiwgdGhyb3cgKQotCitpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKQogaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApCitpbXBvcnQgRGF0YS5Xb3JkCiAKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogaW1wb3J0IERhdGEuTW9ub2lkCiAKIGNsYXNzIFRyYW5zcG9ydCBhIHdoZXJlCiAgICAgdElzT3BlbiA6OiBhIC0+IElPIEJvb2wKICAgICB0Q2xvc2UgIDo6IGEgLT4gSU8gKCkKICAgICB0UmVhZCAgIDo6IGEgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCisgICAgdFBlZWsgICA6OiBhIC0+IElPIChNYXliZSBXb3JkOCkKICAgICB0V3JpdGUgIDo6IGEgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKICAgICB0Rmx1c2ggIDo6IGEgLT4gSU8gKCkKICAgICB0UmVhZEFsbCA6OiBhIC0+IEludCAtPiBJTyBMQlMuQnl0ZVN0cmluZwogCi0gICAgdFJlYWRBbGwgYSAwID0gcmV0dXJuIG1lbXB0eQorICAgIHRSZWFkQWxsIF8gMCA9IHJldHVybiBtZW1wdHkKICAgICB0UmVhZEFsbCBhIGxlbiA9IGRvCiAgICAgICAgIHJlc3VsdCA8LSB0UmVhZCBhIGxlbgogICAgICAgICBsZXQgcmxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmVzdWx0CiAgICAgICAgIHdoZW4gKHJsZW4gPT0gMCkgKHRocm93ICQgVHJhbnNwb3J0RXhuICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4iIFRFX1VOS05PV04pCiAgICAgICAgIGlmIGxlbiA8PSBybGVuCi0gICAgICAgICAgICB0aGVuIHJldHVybiByZXN1bHQKLSAgICAgICAgICAgIGVsc2UgKHJlc3VsdCBgbWFwcGVuZGApIGBmbWFwYCAodFJlYWRBbGwgYSAobGVuIC0gcmxlbikpCisgICAgICAgICAgdGhlbiByZXR1cm4gcmVzdWx0CisgICAgICAgICAgZWxzZSAocmVzdWx0IGBtYXBwZW5kYCkgPCQ+IHRSZWFkQWxsIGEgKGxlbiAtIHJsZW4pCiAKIGRhdGEgVHJhbnNwb3J0RXhuID0gVHJhbnNwb3J0RXhuIFN0cmluZyBUcmFuc3BvcnRFeG5UeXBlCiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQpAQCAtNTksNCArNjMsMyBAQAogICAgIHwgVEVfVElNRURfT1VUCiAgICAgfCBURV9FTkRfT0ZfRklMRQogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQotCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocwpAQCAtMCwwICsxLDM2IEBACit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkVtcHR5CisgICAgICAgKCBFbXB0eVRyYW5zcG9ydCguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CisKK2RhdGEgRW1wdHlUcmFuc3BvcnQgPSBFbXB0eVRyYW5zcG9ydAorCitpbnN0YW5jZSBUcmFuc3BvcnQgRW1wdHlUcmFuc3BvcnQgd2hlcmUKKyAgICB0SXNPcGVuID0gY29uc3QgJCByZXR1cm4gRmFsc2UKKyAgICB0Q2xvc2UgID0gY29uc3QgJCByZXR1cm4gKCkKKyAgICB0UmVhZCBfIF8gPSByZXR1cm4gIiIKKyAgICB0UGVlayA9IGNvbnN0ICQgcmV0dXJuIE5vdGhpbmcKKyAgICB0V3JpdGUgXyBfID0gcmV0dXJuICgpCisgICAgdEZsdXNoID0gY29uc3QkIHJldHVybiAoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmYzQzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKQEAgLTAsMCArMSw5OSBAQAorey0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzICMtfQorey0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQKKyAgICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CisgICAgLCBGcmFtZWRUcmFuc3BvcnQKKyAgICAsIG9wZW5GcmFtZWRUcmFuc3BvcnQKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgorCitpbXBvcnQgRGF0YS5JbnQgKEludDMyKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeSBhcyBCCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCisKKy0tIHwgRnJhbWVkVHJhbnNwb3J0IHdyYXBzIGEgZ2l2ZW4gdHJhbnNwb3J0IGluIGZyYW1lZCBtb2RlLgorZGF0YSBGcmFtZWRUcmFuc3BvcnQgdCA9IEZyYW1lZFRyYW5zcG9ydCB7CisgICAgICB3cmFwcGVkVHJhbnMgOjogdCwgICAgICAgICAgIC0tIF4gVW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICB3cml0ZUJ1ZmZlciAgOjogV3JpdGVCdWZmZXIsIC0tIF4gV3JpdGUgYnVmZmVyLgorICAgICAgcmVhZEJ1ZmZlciAgIDo6IFJlYWRCdWZmZXIgICAtLSBeIFJlYWQgYnVmZmVyLgorICAgIH0KKworLS0gfCBDcmVhdGUgYSBuZXcgZnJhbWVkIHRyYW5zcG9ydCB3aGljaCB3cmFwcyB0aGUgZ2l2ZW4gdHJhbnNwb3J0Lgorb3BlbkZyYW1lZFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiB0IC0+IElPIChGcmFtZWRUcmFuc3BvcnQgdCkKK29wZW5GcmFtZWRUcmFuc3BvcnQgdHJhbnMgPSBkbworICB3YnVmIDwtIG5ld1dyaXRlQnVmZmVyCisgIHJidWYgPC0gbmV3UmVhZEJ1ZmZlcgorICByZXR1cm4gRnJhbWVkVHJhbnNwb3J0eyB3cmFwcGVkVHJhbnMgPSB0cmFucywgd3JpdGVCdWZmZXIgPSB3YnVmLCByZWFkQnVmZmVyID0gcmJ1ZiB9CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFRyYW5zcG9ydCAoRnJhbWVkVHJhbnNwb3J0IHQpIHdoZXJlCisKKyAgICB0Q2xvc2UgPSB0Q2xvc2UgLiB3cmFwcGVkVHJhbnMKKworICAgIHRSZWFkIHRyYW5zIG4gPSBkbworICAgICAgLS0gRmlyc3QsIGNoZWNrIHRoZSByZWFkIGJ1ZmZlciBmb3IgYW55IGRhdGEuCisgICAgICBicyA8LSByZWFkQnVmIChyZWFkQnVmZmVyIHRyYW5zKSBuCisgICAgICBpZiBMQlMubnVsbCBicworICAgICAgICAgdGhlbgorICAgICAgICAgLS0gV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LCByZWFkIGFub3RoZXIgZnJhbWUgZnJvbSB0aGUKKyAgICAgICAgIC0tIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgICAgICBkbyBsZW4gPC0gcmVhZEZyYW1lIHRyYW5zCisgICAgICAgICAgICAgIGlmIGxlbiA+IDAKKyAgICAgICAgICAgICAgICAgdGhlbiB0UmVhZCB0cmFucyBuCisgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGJzCisgICAgICAgICBlbHNlIHJldHVybiBicworICAgIHRQZWVrIHRyYW5zID0gZG8KKyAgICAgIG13IDwtIHBlZWtCdWYgKHJlYWRCdWZmZXIgdHJhbnMpCisgICAgICBjYXNlIG13IG9mCisgICAgICAgIEp1c3QgXyAtPiByZXR1cm4gbXcKKyAgICAgICAgTm90aGluZyAtPiBkbworICAgICAgICAgIGxlbiA8LSByZWFkRnJhbWUgdHJhbnMKKyAgICAgICAgICBpZiBsZW4gPiAwCisgICAgICAgICAgICAgdGhlbiB0UGVlayB0cmFucworICAgICAgICAgICAgIGVsc2UgcmV0dXJuIE5vdGhpbmcKKworICAgIHRXcml0ZSA9IHdyaXRlQnVmIC4gd3JpdGVCdWZmZXIKKworICAgIHRGbHVzaCB0cmFucyA9IGRvCisgICAgICBicyA8LSBmbHVzaEJ1ZiAod3JpdGVCdWZmZXIgdHJhbnMpCisgICAgICBsZXQgc3pCcyA9IEIuZW5jb2RlICQgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggYnMgOjogSW50MzIpCisgICAgICB0V3JpdGUgKHdyYXBwZWRUcmFucyB0cmFucykgc3pCcworICAgICAgdFdyaXRlICh3cmFwcGVkVHJhbnMgdHJhbnMpIGJzCisgICAgICB0Rmx1c2ggKHdyYXBwZWRUcmFucyB0cmFucykKKworICAgIHRJc09wZW4gPSB0SXNPcGVuIC4gd3JhcHBlZFRyYW5zCisKK3JlYWRGcmFtZSA6OiBUcmFuc3BvcnQgdCA9PiBGcmFtZWRUcmFuc3BvcnQgdCAtPiBJTyBJbnQKK3JlYWRGcmFtZSB0cmFucyA9IGRvCisgIC0tIFJlYWQgYW5kIGRlY29kZSB0aGUgZnJhbWUgc2l6ZS4KKyAgc3pCcyA8LSB0UmVhZCAod3JhcHBlZFRyYW5zIHRyYW5zKSA0CisgIGxldCBzeiA9IGZyb21JbnRlZ3JhbCAoQi5kZWNvZGUgc3pCcyA6OiBJbnQzMikKKworICAtLSBSZWFkIHRoZSBmcmFtZSBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcmVhZCBidWZmZXIuCisgIGJzIDwtIHRSZWFkICh3cmFwcGVkVHJhbnMgdHJhbnMpIHN6CisgIGZpbGxCdWYgKHJlYWRCdWZmZXIgdHJhbnMpIGJzCisKKyAgLS0gUmV0dXJuIHRoZSBmcmFtZSBzaXplIHNvIHRoYXQgdGhlIGNhbGxlciBrbm93cyB3aGV0aGVyIHRvIGV4cGVjdAorICAtLSBzb21ldGhpbmcgaW4gdGhlIHJlYWQgYnVmZmVyIG9yIG5vdC4KKyAgcmV0dXJuIHN6CmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwppbmRleCAwYjFjYjc1Li5mZjYyOTViIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKQEAgLTEsMyArMSw4IEBACit7LSMgTEFOR1VBR0UgRmxleGlibGVJbnN0YW5jZXMgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19Cit7LSMgTEFOR1VBR0UgVHlwZVN5bm9ueW1JbnN0YW5jZXMgIy19Cit7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW9ycGhhbnMgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIyLDggKzI3LDkgQEAKICAgICAsIEhhbmRsZVNvdXJjZSguLikKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKLWltcG9ydCBDb250cm9sLk1vbmFkICggcmVwbGljYXRlTSApCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCBjYXRjaCwgdGhyb3cgKQoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5JbnRlcm5hbCAoYzJ3KQoraW1wb3J0IERhdGEuRnVuY3RvcgogCiBpbXBvcnQgTmV0d29yawogCkBAIC0zMiwxNCArMzgsMjEgQEAKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIAotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiBpbXBvcnQgRGF0YS5Nb25vaWQKIAogaW5zdGFuY2UgVHJhbnNwb3J0IEhhbmRsZSB3aGVyZQogICAgIHRJc09wZW4gPSBoSXNPcGVuCi0gICAgdENsb3NlIGggICAgPSBoQ2xvc2UgaAotICAgIHRSZWFkICBoIG4gID0gTEJTLmhHZXQgaCBuIGBjYXRjaGAgaGFuZGxlRU9GCi0gICAgdFdyaXRlIGggcyAgPSBMQlMuaFB1dCBoIHMKKyAgICB0Q2xvc2UgPSBoQ2xvc2UKKyAgICB0UmVhZCBoIG4gPSByZWFkIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIG1lbXB0eQorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZCA9IGRvCisgICAgICAgICAgaExvb2tBaGVhZCBoCisgICAgICAgICAgTEJTLmhHZXROb25CbG9ja2luZyBoIG4KKyAgICB0UmVhZEFsbCBfIDAgPSByZXR1cm4gbWVtcHR5CisgICAgdFJlYWRBbGwgaCBuID0gTEJTLmhHZXQgaCBuIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGhyb3dUcmFuc3BvcnRFeG4KKyAgICB0UGVlayBoID0gKEp1c3QgLiBjMncgPCQ+IGhMb29rQWhlYWQgaCkgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgTm90aGluZworICAgIHRXcml0ZSA9IExCUy5oUHV0CiAgICAgdEZsdXNoID0gaEZsdXNoCiAKIApAQCAtNTQsNyArNjcsMTIgQEAKIGluc3RhbmNlIEhhbmRsZVNvdXJjZSAoSG9zdE5hbWUsIFBvcnRJRCkgd2hlcmUKICAgICBoT3BlbiA9IHVuY3VycnkgY29ubmVjdFRvCiAKK3Rocm93VHJhbnNwb3J0RXhuIDo6IElPRXJyb3IgLT4gSU8gYQordGhyb3dUcmFuc3BvcnRFeG4gZSA9IGlmIGlzRU9GRXJyb3IgZQorICAgIHRoZW4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiIgVEVfVU5LTk9XTgorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZSB0UmVhZEFsbDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KIAotaGFuZGxlRU9GIGUgPSBpZiBpc0VPRkVycm9yIGUKLSAgICB0aGVuIHJldHVybiBtZW1wdHkKLSAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJUQ2hhbm5lbFRyYW5zcG9ydDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KK2hhbmRsZUVPRiA6OiBhIC0+IElPRXJyb3IgLT4gSU8gYQoraGFuZGxlRU9GIGEgZSA9IGlmIGlzRU9GRXJyb3IgZQorICAgIHRoZW4gcmV0dXJuIGEKKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGU6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpAQCAtMCwwICsxLDM1NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgorICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CisgICwgSGVhZGVyVHJhbnNwb3J0KC4uKQorICAsIG9wZW5IZWFkZXJUcmFuc3BvcnQKKyAgLCBQcm90b2NvbFR5cGUoLi4pCisgICwgVHJhbnNmb3JtVHlwZSguLikKKyAgLCBDbGllbnRUeXBlKC4uKQorICAsIHRSZXNldFByb3RvY29sCisgICwgdFNldFByb3RvY29sCisgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkNoYXI4IGFzIEMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFR5cGUgPSBUQmluYXJ5IHwgVENvbXBhY3QgfCBUSlNPTiBkZXJpdmluZyAoRW51bSwgRXEpCitkYXRhIENsaWVudFR5cGUgPSBIZWFkZXJDbGllbnQgfCBGcmFtZWQgfCBVbmZyYW1lZCBkZXJpdmluZyAoRW51bSwgRXEpCisKK2luZm9JZEtleVZhbHVlID0gMQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworZGF0YSBUcmFuc2Zvcm1UeXBlID0gWmxpYlRyYW5zZm9ybSBkZXJpdmluZyAoRW51bSwgRXEpCisKK2Zyb21UcmFuc3BvcnRUeXBlIDo6IFRyYW5zZm9ybVR5cGUgLT4gSW50MTYKK2Zyb21UcmFuc3BvcnRUeXBlIFpsaWJUcmFuc2Zvcm0gPSAxCisKK3RvVHJhbnNwb3J0VHlwZSA6OiBJbnQxNiAtPiBUcmFuc2Zvcm1UeXBlCit0b1RyYW5zcG9ydFR5cGUgMSA9IFpsaWJUcmFuc2Zvcm0KK3RvVHJhbnNwb3J0VHlwZSBfID0gIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIElEIiBURV9VTktOT1dOCisKK2RhdGEgSGVhZGVyVHJhbnNwb3J0IGkgbyA9IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydAorICAgIHsgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworICAgICwgd3JpdGVCdWZmZXIgOjogSU9SZWYgQi5CdWlsZGVyCisgICAgLCBpblRyYW5zIDo6IGkKKyAgICAsIG91dFRyYW5zIDo6IG8KKyAgICAsIGNsaWVudFR5cGUgOjogSU9SZWYgQ2xpZW50VHlwZQorICAgICwgcHJvdG9jb2xUeXBlIDo6IElPUmVmIFByb3RvY29sVHlwZQorICAgICwgaGVhZGVycyA6OiBJT1JlZiBbKFN0cmluZywgU3RyaW5nKV0KKyAgICAsIHdyaXRlSGVhZGVycyA6OiBIZWFkZXJzCisgICAgLCB0cmFuc2Zvcm1zIDo6IElPUmVmIFtUcmFuc2Zvcm1UeXBlXQorICAgICwgd3JpdGVUcmFuc2Zvcm1zIDo6IFtUcmFuc2Zvcm1UeXBlXQorICAgIH0KKworb3BlbkhlYWRlclRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8gKEhlYWRlclRyYW5zcG9ydCBpIG8pCitvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbyA9IGRvCisgIHBpZCA8LSBuZXdJT1JlZiBUQ29tcGFjdAorICByQnVmIDwtIG5ld0lPUmVmIExCUy5lbXB0eQorICB3QnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICBjVHlwZSA8LSBuZXdJT1JlZiBIZWFkZXJDbGllbnQKKyAgaCA8LSBuZXdJT1JlZiBbXQorICB0cmFucyA8LSBuZXdJT1JlZiBbXQorICByZXR1cm4gSGVhZGVyVHJhbnNwb3J0CisgICAgICB7IHJlYWRCdWZmZXIgPSByQnVmCisgICAgICAsIHdyaXRlQnVmZmVyID0gd0J1ZgorICAgICAgLCBpblRyYW5zID0gaQorICAgICAgLCBvdXRUcmFucyA9IG8KKyAgICAgICwgY2xpZW50VHlwZSA9IGNUeXBlCisgICAgICAsIHByb3RvY29sVHlwZSA9IHBpZAorICAgICAgLCBoZWFkZXJzID0gaAorICAgICAgLCB3cml0ZUhlYWRlcnMgPSBNYXAuZW1wdHkKKyAgICAgICwgdHJhbnNmb3JtcyA9IHRyYW5zCisgICAgICAsIHdyaXRlVHJhbnNmb3JtcyA9IFtdCisgICAgICB9CisKK2lzRnJhbWVkIHQgPSAoLz0gVW5mcmFtZWQpIDwkPiByZWFkSU9SZWYgKGNsaWVudFR5cGUgdCkKKworcmVhZEZyYW1lIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAorcmVhZEZyYW1lIHQgPSBkbworICBsZXQgaW5wdXQgPSBpblRyYW5zIHQKKyAgbGV0IHJCdWYgPSByZWFkQnVmZmVyIHQKKyAgbGV0IGNUeXBlID0gY2xpZW50VHlwZSB0CisgIGxzeiA8LSB0UmVhZCBpbnB1dCA0CisgIGxldCBzeiA9IExCUy50b1N0cmljdCBsc3oKKyAgY2FzZSBQLnBhcnNlT25seSBQLmVuZE9mSW5wdXQgc3ogb2YKKyAgICBSaWdodCBfIC0+IGRvIHJldHVybiBGYWxzZQorICAgIExlZnQgXyAtPiBkbworICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIHN6IG9mCisgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIHN6IG9mCisgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgIGxldCBsZW4gPSBCaW5hcnkuZGVjb2RlIGxzeiA6OiBJbnQzMgorICAgICAgICAgICAgICBsYnVmIDwtIHRSZWFkQWxsIGlucHV0ICQgZnJvbUludGVncmFsIGxlbgorICAgICAgICAgICAgICBsZXQgYnVmID0gTEJTLnRvU3RyaWN0IGxidWYKKyAgICAgICAgICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VIZWFkZXJNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGZsYWdzIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCBib2R5KSA9IGV4dHJhY3RIZWFkZXIgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgSGVhZGVyQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhlYWRlciB0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIDwtIHVudHJhbnNmb3JtIHQgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBMQlMuZnJvbVN0cmljdCAkIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiB1bmtvbnduIGNsaWVudCB0eXBlIiBURV9VTktOT1dOCisKK3BhcnNlQmluYXJ5TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MCAqPiBQLndvcmQ4IDB4MDEgKj4gUC53b3JkOCAweDAwICo+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdE1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODIgKj4gUC5zYXRpc2Z5IChcYiAtPiBiIC4mLiAweDFmID09IDB4MDEpCitwYXJzZUhlYWRlck1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmICo+IChQLmNvdW50IDIgUC5hbnlXb3JkOCkKKworcGFyc2VJMzIgOjogUC5QYXJzZXIgSW50MzIKK3BhcnNlSTMyID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorcGFyc2VJMTYgOjogUC5QYXJzZXIgSW50MTYKK3BhcnNlSTE2ID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorCitleHRyYWN0SGVhZGVyIDo6IEJTLkJ5dGVTdHJpbmcgLT4gKEludDE2LCBJbnQzMiwgQlMuQnl0ZVN0cmluZywgQlMuQnl0ZVN0cmluZykKK2V4dHJhY3RIZWFkZXIgYnMgPQorICBjYXNlIFAucGFyc2UgZXh0cmFjdEhlYWRlcl8gYnMgb2YKKyAgICBQLkRvbmUgcmVtYWluIChmbGFncywgc2VxTnVtLCBoZWFkZXIpIC0+IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIHJlbWFpbikKKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisgIHdoZXJlCisgICAgZXh0cmFjdEhlYWRlcl8gPSBkbworICAgICAgbWFnaWMgPC0gUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZgorICAgICAgZmxhZ3MgPC0gcGFyc2VJMTYKKyAgICAgIHNlcU51bSA8LSBwYXJzZUkzMgorICAgICAgKGhlYWRlclNpemUgOjogSW50KSA8LSAoKiA0KSAuIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VJMTYKKyAgICAgIGhlYWRlciA8LSBQLnRha2UgaGVhZGVyU2l6ZQorICAgICAgcmV0dXJuIChmbGFncywgc2VxTnVtLCBoZWFkZXIpCisKK2hhbmRsZUhlYWRlciB0IGhlYWRlciA9CisgIGNhc2UgUC5wYXJzZU9ubHkgcGFyc2VIZWFkZXIgaGVhZGVyIG9mCisgICAgUmlnaHQgKHBUeXBlLCB0cmFucywgaW5mbykgLT4gZG8KKyAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBwVHlwZQorICAgICAgd3JpdGVJT1JlZiAodHJhbnNmb3JtcyB0KSB0cmFucworICAgICAgd3JpdGVJT1JlZiAoaGVhZGVycyB0KSBpbmZvCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorCisKK2l3MTYgOjogSW50MTYgLT4gV29yZDE2CitpdzE2ID0gZnJvbUludGVncmFsCitpdzMyIDo6IEludDMyIC0+IFdvcmQzMgoraXczMiA9IGZyb21JbnRlZ3JhbAord2kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3dpMTYgPSBmcm9tSW50ZWdyYWwKK3dpMzIgOjogV29yZDMyIC0+IEludDMyCit3aTMyID0gZnJvbUludGVncmFsCisKK3BhcnNlSGVhZGVyIDo6IFAuUGFyc2VyIChQcm90b2NvbFR5cGUsIFtUcmFuc2Zvcm1UeXBlXSwgWyhTdHJpbmcsIFN0cmluZyldKQorcGFyc2VIZWFkZXIgPSBkbworICBwcm90b2NvbFR5cGUgPC0gdG9Qcm90b2NvbFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgbnVtVHJhbnMgPC0gZnJvbUludGVncmFsIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIHRyYW5zIDwtIHJlcGxpY2F0ZU0gbnVtVHJhbnMgcGFyc2VUcmFuc2Zvcm0KKyAgaW5mbyA8LSBwYXJzZUluZm8KKyAgcmV0dXJuIChwcm90b2NvbFR5cGUsIHRyYW5zLCBpbmZvKQorCit0b1Byb3RvY29sVHlwZSA6OiBJbnQxNiAtPiBQcm90b2NvbFR5cGUKK3RvUHJvdG9jb2xUeXBlIDAgPSBUQmluYXJ5Cit0b1Byb3RvY29sVHlwZSAxID0gVEpTT04KK3RvUHJvdG9jb2xUeXBlIDIgPSBUQ29tcGFjdAorCitmcm9tUHJvdG9jb2xUeXBlIDo6IFByb3RvY29sVHlwZSAtPiBJbnQxNgorZnJvbVByb3RvY29sVHlwZSBUQmluYXJ5ID0gMAorZnJvbVByb3RvY29sVHlwZSBUSlNPTiA9IDEKK2Zyb21Qcm90b2NvbFR5cGUgVENvbXBhY3QgPSAyCisKK3BhcnNlVHJhbnNmb3JtIDo6IFAuUGFyc2VyIFRyYW5zZm9ybVR5cGUKK3BhcnNlVHJhbnNmb3JtID0gdG9UcmFuc3BvcnRUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisKK3BhcnNlSW5mbyA6OiBQLlBhcnNlciBbKFN0cmluZywgU3RyaW5nKV0KK3BhcnNlSW5mbyA9IGRvCisgIG4gPC0gUC5laXRoZXJQIFAuZW5kT2ZJbnB1dCAocGFyc2VWYXJpbnQgd2kzMikKKyAgY2FzZSBuIG9mCisgICAgTGVmdCBfIC0+IHJldHVybiBbXQorICAgIFJpZ2h0IG4wIC0+CisgICAgICByZXBsaWNhdGVNIChmcm9tSW50ZWdyYWwgbjApICQgZG8KKyAgICAgICAga2xlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIGsgPC0gUC50YWtlICQgZnJvbUludGVncmFsIGtsZW4KKyAgICAgICAgdmxlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIHYgPC0gUC50YWtlICQgZnJvbUludGVncmFsIHZsZW4KKyAgICAgICAgcmV0dXJuIChDLnVucGFjayBrLCBDLnVucGFjayB2KQorCitwYXJzZVN0cmluZyA6OiBQLlBhcnNlciBCUy5CeXRlU3RyaW5nCitwYXJzZVN0cmluZyA9IHBhcnNlVmFyaW50IHdpMzIgPj49IChQLnRha2UgLiBmcm9tSW50ZWdyYWwpCisKK2J1aWxkSGVhZGVyIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQi5CdWlsZGVyCitidWlsZEhlYWRlciB0ID0gZG8KKyAgcFR5cGUgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgbGV0IHBJZCA9IGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21Qcm90b2NvbFR5cGUgcFR5cGUKKyAgbGV0IGhlYWRlckNvbnRlbnQgPSBwSWQgPD4gKGJ1aWxkVHJhbnNmb3JtcyB0KSA8PiAoYnVpbGRJbmZvIHQpCisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoICQgQi50b0xhenlCeXRlU3RyaW5nIGhlYWRlckNvbnRlbnQKKyAgLS0gVE9ETzogbGVuZ3RoIGxpbWl0IGNoZWNrCisgIGxldCBwYWRkaW5nID0gbWNvbmNhdCAkIHJlcGxpY2F0ZSAobW9kIGxlbiA0KSAkIEIud29yZDggMAorICBsZXQgY29kZWRMZW4gPSBCLmludDE2QkUgKGZyb21JbnRlZ3JhbCAkIChxdW90IChsZW4gLSAxKSA0KSArIDEpCisgIGxldCBmbGFncyA9IDAKKyAgbGV0IHNlcU51bSA9IDAKKyAgcmV0dXJuICQgQi5pbnQxNkJFIDB4MGZmZiA8PiBCLmludDE2QkUgZmxhZ3MgPD4gQi5pbnQzMkJFIHNlcU51bSA8PiBjb2RlZExlbiA8PiBoZWFkZXJDb250ZW50IDw+IHBhZGRpbmcKKworYnVpbGRUcmFuc2Zvcm1zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCistLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKK2J1aWxkVHJhbnNmb3JtcyB0ID0KKyAgbGV0IHRyYW5zID0gd3JpdGVUcmFuc2Zvcm1zIHQgaW4KKyAgKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCB0cmFucykgPD4KKyAgKG1jb25jYXQgJCBtYXAgKGJ1aWxkVmFyaW50IC4gaXcxNiAuIGZyb21UcmFuc3BvcnRUeXBlKSB0cmFucykKKworYnVpbGRJbmZvIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCitidWlsZEluZm8gdCA9CisgIGxldCBoID0gTWFwLmFzc29jcyAkIHdyaXRlSGVhZGVycyB0IGluCisgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICBjYXNlIGxlbmd0aCBoIG9mCisgICAgMCAtPiBtZW1wdHkKKyAgICBsZW4gLT4gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbikgPD4gKG1jb25jYXQgJCBtYXAgYnVpbGRJbmZvRW50cnkgaCkKKyAgd2hlcmUKKyAgICBidWlsZEluZm9FbnRyeSAoaywgdikgPSBidWlsZFZhclN0ciBrIDw+IGJ1aWxkVmFyU3RyIHYKKyAgICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgICBidWlsZFZhclN0ciBzID0gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCBzKSA8PiBCLnN0cmluZzggcworCit0UmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3RSZXNldFByb3RvY29sIHQgPSBkbworICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICB3cml0ZUlPUmVmIChjbGllbnRUeXBlIHQpIEhlYWRlckNsaWVudAorICByZWFkRnJhbWUgdAorCit0U2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3RTZXRQcm90b2NvbCB0ID0gd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpCisKK3RyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IExCUy5CeXRlU3RyaW5nIC0+IExCUy5CeXRlU3RyaW5nCit0cmFuc2Zvcm0gdCBicyA9CisgIGZvbGRyIGFwcGx5VHJhbnNmb3JtIGJzICQgd3JpdGVUcmFuc2Zvcm1zIHQKKyAgd2hlcmUKKyAgICAtLSBhcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCit1bnRyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEJTLkJ5dGVTdHJpbmcgLT4gSU8gQlMuQnl0ZVN0cmluZwordW50cmFuc2Zvcm0gdCBicyA9IGRvCisgIHRyYW5zIDwtIHJlYWRJT1JlZiAkIHRyYW5zZm9ybXMgdAorICByZXR1cm4gJCBmb2xkbCB1bmFwcGx5VHJhbnNmb3JtIGJzIHRyYW5zCisgIHdoZXJlCisgICAgLS0gdW5hcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgdW5hcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFRyYW5zcG9ydCAoSGVhZGVyVHJhbnNwb3J0IGkgbykgd2hlcmUKKyAgdElzT3BlbiB0ID0gZG8KKyAgICB0SXNPcGVuIChpblRyYW5zIHQpCisgICAgdElzT3BlbiAob3V0VHJhbnMgdCkKKworICB0Q2xvc2UgdCA9IGRvCisgICAgdENsb3NlKG91dFRyYW5zIHQpCisgICAgdENsb3NlKGluVHJhbnMgdCkKKworICB0UmVhZCB0IGxlbiA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIGRvCisgICAgICAgIGxldCAoY29uc3VtZWQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIGxlbikgckJ1ZgorICAgICAgICB3cml0ZUlPUmVmIChyZWFkQnVmZmVyIHQpIHJlbWFpbgorICAgICAgICByZXR1cm4gY29uc3VtZWQKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFJlYWQgKGluVHJhbnMgdCkgbGVuCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdCBsZW4KKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTEJTLmVtcHR5CisKKyAgdFBlZWsgdCA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdCkKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIHJldHVybiAkIEp1c3QgJCBMQlMuaGVhZCByQnVmCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRQZWVrIChpblRyYW5zIHQpCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFBlZWsgdAorICAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCisKKyAgdFdyaXRlIHQgYnVmID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHQKKyAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgIGlmIGZyYW1lZAorICAgICAgdGhlbiBtb2RpZnlJT1JlZiB3QnVmICg8PiBCLmxhenlCeXRlU3RyaW5nIGJ1ZikKKyAgICAgIGVsc2UKKyAgICAgICAgLS0gVE9ETzogd2hhdCBzaG91bGQgd2UgZG8gd2hlbiBzd2l0Y2hlZCB0byB1bmZyYW1lZCBpbiB0aGUgbWlkZGxlID8KKyAgICAgICAgdFdyaXRlKG91dFRyYW5zIHQpIGJ1ZgorCisgIHRGbHVzaCB0ID0gZG8KKyAgICBjVHlwZSA8LSByZWFkSU9SZWYgJCBjbGllbnRUeXBlIHQKKyAgICBjYXNlIGNUeXBlIG9mCisgICAgICBVbmZyYW1lZCAtPiB0Rmx1c2ggJCBvdXRUcmFucyB0CisgICAgICBGcmFtZWQgLT4gZmx1c2hCdWZmZXIgdCBpZCBtZW1wdHkKKyAgICAgIEhlYWRlckNsaWVudCAtPiBidWlsZEhlYWRlciB0ID4+PSBmbHVzaEJ1ZmZlciB0ICh0cmFuc2Zvcm0gdCkKKyAgICB3aGVyZQorICAgICAgZmx1c2hCdWZmZXIgdCBmIGhlYWRlciA9IGRvCisgICAgICAgIHdCdWYgPC0gcmVhZElPUmVmICQgd3JpdGVCdWZmZXIgdAorICAgICAgICB3cml0ZUlPUmVmICh3cml0ZUJ1ZmZlciB0KSBtZW1wdHkKKyAgICAgICAgbGV0IHBheWxvYWQgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgKGhlYWRlciA8PiB3QnVmKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgQmluYXJ5LmVuY29kZSAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBwYXlsb2FkIDo6IEludDMyKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgZiBwYXlsb2FkCisgICAgICAgIHRGbHVzaCAob3V0VHJhbnMgdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKaW5kZXggMjI2ODI2MS4uZWRlYjMyMCAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKQEAgLTEsMyArMSw0IEBACit7LSMgTEFOR1VBR0UgRmxleGlibGVJbnN0YW5jZXMgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIxLDIwICsyMiwxNyBAQAogICAgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKICAgICAsIEh0dHBDbGllbnQgKC4uKQogICAgICwgb3Blbkh0dHBDbGllbnQKLSAgICApIHdoZXJlCispIHdoZXJlCiAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgogaW1wb3J0IE5ldHdvcmsuVVJJCiBpbXBvcnQgTmV0d29yay5IVFRQIGhpZGluZyAocG9ydCwgaG9zdCkKLWltcG9ydCBOZXR3b3JrLlRDUAogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAobGlmdE0pCiBpbXBvcnQgRGF0YS5NYXliZSAoZnJvbUp1c3QpCi1pbXBvcnQgRGF0YS5Nb25vaWQgKG1hcHBlbmQsIG1lbXB0eSkKK2ltcG9ydCBEYXRhLk1vbm9pZCAobWVtcHR5KQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICh0aHJvdykKLWltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQuTVZhcgotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeS5CdWlsZGVyIGFzIEIKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogCiAKIC0tIHwgJ0h0dHBDbGllbnQnLCBvciBUSHR0cENsaWVudCBpbXBsZW1lbnRzIHRoZSBUaHJpZnQgVHJhbnNwb3J0CkBAIC00NywzNCArNDUsMzkgQEAKICAgICAgIHJlYWRCdWZmZXIgOjogUmVhZEJ1ZmZlcgogICAgIH0KIAordXJpQXV0aCA6OiBVUkkgLT4gVVJJQXV0aAogdXJpQXV0aCA9IGZyb21KdXN0IC4gdXJpQXV0aG9yaXR5CisKK2hvc3QgOjogVVJJIC0+IFN0cmluZwogaG9zdCA9IHVyaVJlZ05hbWUgLiB1cmlBdXRoCiAKIHBvcnQgOjogVVJJIC0+IEludAotcG9ydCB1cmkgPQorcG9ydCB1cmlfID0KICAgICBpZiBwb3J0U3RyID09IG1lbXB0eSB0aGVuCiAgICAgICAgIGh0dHBQb3J0CiAgICAgZWxzZQogICAgICAgICByZWFkIHBvcnRTdHIKICAgICB3aGVyZQotICAgICAgcG9ydFN0ciA9IGRyb3BXaGlsZSAoPT0gJzonKSAkIHVyaVBvcnQgJCB1cmlBdXRoIHVyaQorICAgICAgcG9ydFN0ciA9IGRyb3BXaGlsZSAoPT0gJzonKSAkIHVyaVBvcnQgJCB1cmlBdXRoIHVyaV8KICAgICAgIGh0dHBQb3J0ID0gODAKIAogLS0gfCBVc2UgJ29wZW5IdHRwQ2xpZW50JyB0byBjcmVhdGUgYW4gSHR0cENsaWVudCBjb25uZWN0ZWQgdG8gQHVyaUAKIG9wZW5IdHRwQ2xpZW50IDo6IFVSSSAtPiBJTyBIdHRwQ2xpZW50Ci1vcGVuSHR0cENsaWVudCB1cmkgPSBkbwotICBzdHJlYW0gPC0gb3BlblRDUENvbm5lY3Rpb24gKGhvc3QgdXJpKSAocG9ydCB1cmkpCitvcGVuSHR0cENsaWVudCB1cmlfID0gZG8KKyAgc3RyZWFtIDwtIG9wZW5UQ1BDb25uZWN0aW9uIChob3N0IHVyaV8pIChwb3J0IHVyaV8pCiAgIHdidWYgPC0gbmV3V3JpdGVCdWZmZXIKICAgcmJ1ZiA8LSBuZXdSZWFkQnVmZmVyCi0gIHJldHVybiAkIEh0dHBDbGllbnQgc3RyZWFtIHVyaSB3YnVmIHJidWYKKyAgcmV0dXJuICQgSHR0cENsaWVudCBzdHJlYW0gdXJpXyB3YnVmIHJidWYKIAogaW5zdGFuY2UgVHJhbnNwb3J0IEh0dHBDbGllbnQgd2hlcmUKIAotICAgIHRDbG9zZSAgPSBjbG9zZSAuIGhzdHJlYW0KKyAgICB0Q2xvc2UgPSBjbG9zZSAuIGhzdHJlYW0KIAotICAgIHRSZWFkIGhjbGllbnQgbiA9IHJlYWRCdWYgKHJlYWRCdWZmZXIgaGNsaWVudCkgbgorICAgIHRQZWVrID0gcGVla0J1ZiAuIHJlYWRCdWZmZXIKIAotICAgIHRXcml0ZSBoY2xpZW50ID0gd3JpdGVCdWYgKHdyaXRlQnVmZmVyIGhjbGllbnQpCisgICAgdFJlYWQgPSByZWFkQnVmIC4gcmVhZEJ1ZmZlcgorCisgICAgdFdyaXRlID0gd3JpdGVCdWYgLiB3cml0ZUJ1ZmZlcgogCiAgICAgdEZsdXNoIGhjbGllbnQgPSBkbwogICAgICAgYm9keSA8LSBmbHVzaEJ1ZiAkIHdyaXRlQnVmZmVyIGhjbGllbnQKQEAgLTg5LDM2ICs5MiwxMCBAQAogCiAgICAgICByZXMgPC0gc2VuZEhUVFAgKGhzdHJlYW0gaGNsaWVudCkgcmVxdWVzdAogICAgICAgY2FzZSByZXMgb2YKLSAgICAgICAgUmlnaHQgcmVzIC0+IGRvCi0gICAgICAgICAgICBmaWxsQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIChyc3BCb2R5IHJlcykKLSAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgIFJpZ2h0IHJlc3BvbnNlIC0+CisgICAgICAgICAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciBoY2xpZW50KSAocnNwQm9keSByZXNwb25zZSkKKyAgICAgICAgTGVmdCBfIC0+CiAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiVEh0dHBDb25uZWN0aW9uOiBIVFRQIGZhaWx1cmUgZnJvbSBzZXJ2ZXIiIFRFX1VOS05PV04KICAgICAgIHJldHVybiAoKQogCiAgICAgdElzT3BlbiBfID0gcmV0dXJuIFRydWUKLS0tIE1pbmkgSU8gYnVmZmVycwotCi10eXBlIFdyaXRlQnVmZmVyID0gTVZhciAoQi5CdWlsZGVyKQotCi1uZXdXcml0ZUJ1ZmZlciA6OiBJTyBXcml0ZUJ1ZmZlcgotbmV3V3JpdGVCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi13cml0ZUJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotd3JpdGVCdWYgdyBzID0gbW9kaWZ5TVZhcl8gdyAkIHJldHVybiAuIChcYnVpbGRlciAtPgotICAgICAgICAgICAgICAgICBidWlsZGVyIGBtYXBwZW5kYCAoQi5mcm9tTGF6eUJ5dGVTdHJpbmcgcykpCi0KLWZsdXNoQnVmIDo6IFdyaXRlQnVmZmVyIC0+IElPIChMQlMuQnl0ZVN0cmluZykKLWZsdXNoQnVmIHcgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgYGxpZnRNYCBzd2FwTVZhciB3IG1lbXB0eQotCi0KLXR5cGUgUmVhZEJ1ZmZlciA9IE1WYXIgKExCUy5CeXRlU3RyaW5nKQotCi1uZXdSZWFkQnVmZmVyIDo6IElPIFJlYWRCdWZmZXIKLW5ld1JlYWRCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi1maWxsQnVmIDo6IFJlYWRCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKLWZpbGxCdWYgciBzID0gc3dhcE1WYXIgciBzID4+IHJldHVybiAoKQotCi1yZWFkQnVmIDo6IFJlYWRCdWZmZXIgLT4gSW50IC0+IElPIChMQlMuQnl0ZVN0cmluZykKLXJlYWRCdWYgciBuID0gbW9kaWZ5TVZhciByICQgcmV0dXJuIC4gZmxpcFBhaXIgLiBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pCi0gICAgd2hlcmUgZmxpcFBhaXIgKGEsIGIpID0gKGIsIGEpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViZDdkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocwpAQCAtMCwwICsxLDY5IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIKKyAgICAgICAoIFdyaXRlQnVmZmVyCisgICAgICAgLCBuZXdXcml0ZUJ1ZmZlcgorICAgICAgICwgd3JpdGVCdWYKKyAgICAgICAsIGZsdXNoQnVmCisgICAgICAgLCBSZWFkQnVmZmVyCisgICAgICAgLCBuZXdSZWFkQnVmZmVyCisgICAgICAgLCBmaWxsQnVmCisgICAgICAgLCByZWFkQnVmCisgICAgICAgLCBwZWVrQnVmCisgICAgICAgKSB3aGVyZQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCit0eXBlIFdyaXRlQnVmZmVyID0gSU9SZWYgQnVpbGRlcgordHlwZSBSZWFkQnVmZmVyID0gSU9SZWYgTEJTLkJ5dGVTdHJpbmcKKworbmV3V3JpdGVCdWZmZXIgOjogSU8gV3JpdGVCdWZmZXIKK25ld1dyaXRlQnVmZmVyID0gbmV3SU9SZWYgbWVtcHR5CisKK3dyaXRlQnVmIDo6IFdyaXRlQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCit3cml0ZUJ1ZiB3IHMgPSBtb2RpZnlJT1JlZiB3ICggPD4gbGF6eUJ5dGVTdHJpbmcgcykKKworZmx1c2hCdWYgOjogV3JpdGVCdWZmZXIgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKK2ZsdXNoQnVmIHcgPSBkbworICBidWYgPC0gcmVhZElPUmVmIHcKKyAgd3JpdGVJT1JlZiB3IG1lbXB0eQorICByZXR1cm4gJCB0b0xhenlCeXRlU3RyaW5nIGJ1ZgorCituZXdSZWFkQnVmZmVyIDo6IElPIFJlYWRCdWZmZXIKK25ld1JlYWRCdWZmZXIgPSBuZXdJT1JlZiBtZW1wdHkKKworZmlsbEJ1ZiA6OiBSZWFkQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCitmaWxsQnVmID0gd3JpdGVJT1JlZgorCityZWFkQnVmIDo6IFJlYWRCdWZmZXIgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCityZWFkQnVmIHIgbiA9IGRvCisgIGJzIDwtIHJlYWRJT1JlZiByCisgIGxldCAoaGQsIHRsKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikgYnMKKyAgd3JpdGVJT1JlZiByIHRsCisgIHJldHVybiBoZAorCitwZWVrQnVmIDo6IFJlYWRCdWZmZXIgLT4gSU8gKE1heWJlIFdvcmQ4KQorcGVla0J1ZiByID0gKGZtYXAgZnN0IC4gTEJTLnVuY29ucykgPCQ+IHJlYWRJT1JlZiByCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzkzYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocwpAQCAtMCwwICsxLDc3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CisgICAgICAgKCBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgLCBNZW1vcnlCdWZmZXIoLi4pCisgICAgICAgKSB3aGVyZQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKKworCitkYXRhIE1lbW9yeUJ1ZmZlciA9IE1lbW9yeUJ1ZmZlciB7CisgIHdyaXRlQnVmZmVyIDo6IElPUmVmIEJ1aWxkZXIsCisgIHJlYWRCdWZmZXIgOjogSU9SZWYgTEJTLkJ5dGVTdHJpbmcKK30KKworb3Blbk1lbW9yeUJ1ZmZlciA6OiBJTyBNZW1vcnlCdWZmZXIKK29wZW5NZW1vcnlCdWZmZXIgPSBkbworICB3YnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICByYnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICByZXR1cm4gTWVtb3J5QnVmZmVyIHsKKyAgICB3cml0ZUJ1ZmZlciA9IHdidWYsCisgICAgcmVhZEJ1ZmZlciA9IHJidWYKKyAgfQorCitpbnN0YW5jZSBUcmFuc3BvcnQgTWVtb3J5QnVmZmVyIHdoZXJlCisgIHRJc09wZW4gPSBjb25zdCAkIHJldHVybiBGYWxzZQorICB0Q2xvc2UgID0gY29uc3QgJCByZXR1cm4gKCkKKyAgdEZsdXNoIHRyYW5zID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHRyYW5zCisgICAgd2IgPC0gcmVhZElPUmVmIHdCdWYKKyAgICBtb2RpZnlJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykgJCBccmIgLT4gbWFwcGVuZCByYiAkIHRvTGF6eUJ5dGVTdHJpbmcgd2IKKyAgICB3cml0ZUlPUmVmIHdCdWYgbWVtcHR5CisKKyAgdFJlYWQgXyAwID0gcmV0dXJuIG1lbXB0eQorICB0UmVhZCB0cmFucyBuID0gZG8KKyAgICBsZXQgcmJ1ZiA9IHJlYWRCdWZmZXIgdHJhbnMKKyAgICByYiA8LSByZWFkSU9SZWYgcmJ1ZgorICAgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHJiCisgICAgaWYgbGVuID09IDAKKyAgICAgIHRoZW4gZG8KKyAgICAgICAgdEZsdXNoIHRyYW5zCisgICAgICAgIHJiMiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisgICAgICAgIGlmIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHJiMikgPT0gMAorICAgICAgICAgIHRoZW4gcmV0dXJuIG1lbXB0eQorICAgICAgICAgIGVsc2UgdFJlYWQgdHJhbnMgbgorICAgICAgZWxzZSBkbworICAgICAgICBsZXQgKHJldCwgcmVtYWluKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikgcmIKKyAgICAgICAgd3JpdGVJT1JlZiByYnVmIHJlbWFpbgorICAgICAgICByZXR1cm4gcmV0CisKKyAgdFBlZWsgdHJhbnMgPSAoZm1hcCBmc3QgLiBMQlMudW5jb25zKSA8JD4gcmVhZElPUmVmIChyZWFkQnVmZmVyIHRyYW5zKQorCisgIHRXcml0ZSB0cmFucyB2ID0gZG8KKyAgICBtb2RpZnlJT1JlZiAod3JpdGVCdWZmZXIgdHJhbnMpICg8PiBsYXp5Qnl0ZVN0cmluZyB2KQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTIwMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKQEAgLTAsMCArMSwxMzAgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KKworbW9kdWxlIFRocmlmdC5UeXBlcyB3aGVyZQorCitpbXBvcnQgRGF0YS5Gb2xkYWJsZSAoZm9sZGwnKQoraW1wb3J0IERhdGEuSGFzaGFibGUgKCBIYXNoYWJsZSwgaGFzaFdpdGhTYWx0ICkKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suR2VuIChlbGVtZW50cykKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoVGV4dCkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKK2luc3RhbmNlIChIYXNoYWJsZSBhKSA9PiBIYXNoYWJsZSAoVmVjdG9yLlZlY3RvciBhKSB3aGVyZQorICBoYXNoV2l0aFNhbHQgPSBWZWN0b3IuZm9sZGwnIGhhc2hXaXRoU2FsdAorCisKK3R5cGUgVHlwZU1hcCA9IE1hcC5IYXNoTWFwIEludDE2IChUZXh0LCBUaHJpZnRUeXBlKQorCitkYXRhIFRocmlmdFZhbCA9IFRTdHJ1Y3QgKE1hcC5IYXNoTWFwIEludDE2IChUZXh0LCBUaHJpZnRWYWwpKQorICAgICAgICAgICAgICAgfCBUTWFwIFRocmlmdFR5cGUgVGhyaWZ0VHlwZSBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KKyAgICAgICAgICAgICAgIHwgVExpc3QgVGhyaWZ0VHlwZSBbVGhyaWZ0VmFsXQorICAgICAgICAgICAgICAgfCBUU2V0IFRocmlmdFR5cGUgW1RocmlmdFZhbF0KKyAgICAgICAgICAgICAgIHwgVEJvb2wgQm9vbAorICAgICAgICAgICAgICAgfCBUQnl0ZSBJbnQ4CisgICAgICAgICAgICAgICB8IFRJMTYgSW50MTYKKyAgICAgICAgICAgICAgIHwgVEkzMiBJbnQzMgorICAgICAgICAgICAgICAgfCBUSTY0IEludDY0CisgICAgICAgICAgICAgICB8IFRTdHJpbmcgTEJTLkJ5dGVTdHJpbmcKKyAgICAgICAgICAgICAgIHwgVEJpbmFyeSBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBURG91YmxlIERvdWJsZQorICAgICAgICAgICAgICAgICBkZXJpdmluZyAoRXEsIFNob3cpCisKKy0tIEluZm9ybWF0aW9uIGlzIG5lZWRlZCBoZXJlIGZvciBjb2xsZWN0aW9uIHR5cGVzIChpZSBUX1NUUlVDVCwgVF9NQVAsCistLSBUX0xJU1QsIGFuZCBUX1NFVCkgc28gdGhhdCB3ZSBrbm93IHdoYXQgdHlwZXMgdGhvc2UgY29sbGVjdGlvbnMgYXJlCistLSBwYXJhbWV0ZXJpemVkIGJ5LiAgSW4gbW9zdCBwcm90b2NvbHMsIHRoaXMgY2Fubm90IGJlIGRpc2Nlcm5lZCBkaXJlY3RseQorLS0gZnJvbSB0aGUgZGF0YSBiZWluZyByZWFkLgorZGF0YSBUaHJpZnRUeXBlCisgICAgPSBUX1NUT1AKKyAgICB8IFRfVk9JRAorICAgIHwgVF9CT09MCisgICAgfCBUX0JZVEUKKyAgICB8IFRfRE9VQkxFCisgICAgfCBUX0kxNgorICAgIHwgVF9JMzIKKyAgICB8IFRfSTY0CisgICAgfCBUX1NUUklORworICAgIHwgVF9CSU5BUlkKKyAgICB8IFRfU1RSVUNUIFR5cGVNYXAKKyAgICB8IFRfTUFQIFRocmlmdFR5cGUgVGhyaWZ0VHlwZQorICAgIHwgVF9TRVQgVGhyaWZ0VHlwZQorICAgIHwgVF9MSVNUIFRocmlmdFR5cGUKKyAgICAgIGRlcml2aW5nICggRXEsIFNob3cgKQorCistLSBOT1RFOiB3aGVuIHVzaW5nIHRvRW51bSBpbmZvcm1hdGlvbiBhYm91dCBwYXJhbWV0aXplZCB0eXBlcyBpcyBOT1QgcHJlc2VydmVkLgorLS0gVGhpcyBkZXNpZ24gY2hvaWNlIGlzIGNvbnNpc3RlbnQgd290aCB0aGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uIGluIG90aGVyCistLSBsYW5ndWFnZXMKK2luc3RhbmNlIEVudW0gVGhyaWZ0VHlwZSB3aGVyZQorICAgIGZyb21FbnVtIFRfU1RPUCAgICAgICA9IDAKKyAgICBmcm9tRW51bSBUX1ZPSUQgICAgICAgPSAxCisgICAgZnJvbUVudW0gVF9CT09MICAgICAgID0gMgorICAgIGZyb21FbnVtIFRfQllURSAgICAgICA9IDMKKyAgICBmcm9tRW51bSBUX0RPVUJMRSAgICAgPSA0CisgICAgZnJvbUVudW0gVF9JMTYgICAgICAgID0gNgorICAgIGZyb21FbnVtIFRfSTMyICAgICAgICA9IDgKKyAgICBmcm9tRW51bSBUX0k2NCAgICAgICAgPSAxMAorICAgIGZyb21FbnVtIFRfU1RSSU5HICAgICA9IDExCisgICAgZnJvbUVudW0gVF9CSU5BUlkgICAgID0gMTEKKyAgICBmcm9tRW51bSAoVF9TVFJVQ1QgXykgPSAxMgorICAgIGZyb21FbnVtIChUX01BUCBfIF8pICA9IDEzCisgICAgZnJvbUVudW0gKFRfU0VUIF8pICAgID0gMTQKKyAgICBmcm9tRW51bSAoVF9MSVNUIF8pICAgPSAxNQorCisgICAgdG9FbnVtIDAgID0gVF9TVE9QCisgICAgdG9FbnVtIDEgID0gVF9WT0lECisgICAgdG9FbnVtIDIgID0gVF9CT09MCisgICAgdG9FbnVtIDMgID0gVF9CWVRFCisgICAgdG9FbnVtIDQgID0gVF9ET1VCTEUKKyAgICB0b0VudW0gNiAgPSBUX0kxNgorICAgIHRvRW51bSA4ICA9IFRfSTMyCisgICAgdG9FbnVtIDEwID0gVF9JNjQKKyAgICB0b0VudW0gMTEgPSBUX1NUUklORworICAgIC0tIHRvRW51bSAxMSA9IFRfQklOQVJZCisgICAgdG9FbnVtIDEyID0gVF9TVFJVQ1QgTWFwLmVtcHR5CisgICAgdG9FbnVtIDEzID0gVF9NQVAgVF9WT0lEIFRfVk9JRAorICAgIHRvRW51bSAxNCA9IFRfU0VUIFRfVk9JRAorICAgIHRvRW51bSAxNSA9IFRfTElTVCBUX1ZPSUQKKyAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgVGhyaWZ0VHlwZSAiICsrIHNob3cgdAorCitkYXRhIE1lc3NhZ2VUeXBlCisgICAgPSBNX0NBTEwKKyAgICB8IE1fUkVQTFkKKyAgICB8IE1fRVhDRVBUSU9OCisgICAgfCBNX09ORVdBWQorICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdyApCisKK2luc3RhbmNlIEVudW0gTWVzc2FnZVR5cGUgd2hlcmUKKyAgICBmcm9tRW51bSBNX0NBTEwgICAgICA9ICAxCisgICAgZnJvbUVudW0gTV9SRVBMWSAgICAgPSAgMgorICAgIGZyb21FbnVtIE1fRVhDRVBUSU9OID0gIDMKKyAgICBmcm9tRW51bSBNX09ORVdBWSAgICA9ICA0CisKKyAgICB0b0VudW0gMSA9IE1fQ0FMTAorICAgIHRvRW51bSAyID0gTV9SRVBMWQorICAgIHRvRW51bSAzID0gTV9FWENFUFRJT04KKyAgICB0b0VudW0gNCA9IE1fT05FV0FZCisgICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIE1lc3NhZ2VUeXBlICIgKysgc2hvdyB0CisKK2luc3RhbmNlIEFyYml0cmFyeSBNZXNzYWdlVHlwZSB3aGVyZQorICBhcmJpdHJhcnkgPSBlbGVtZW50cyBbTV9DQUxMLCBNX1JFUExZLCBNX0VYQ0VQVElPTiwgTV9PTkVXQVldCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIEJpbmFyeVNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeVByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFREb3VibGUgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgOAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWBbNjcsIDY0LCAwLCAwLCAwLCAwLCAwLCAwXQorCisgICAgICBpdCAicmVhZHMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgYmluID0gTEJTLnBhY2sgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEMucGFjayAiYWFhIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDcKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFswLCAwLCAwLCAzLCA5NywgOTcsIDk3XQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MGU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCkBAIC0wLDAgKzEsODEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgQ29tcGFjdFNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQ29tcGFjdFByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkQWxsIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzAsIDAsIDAsIDAsIDAsIDAsIDY0LCA2N10KKworICAgICAgaXQgInJlYWRzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyBiaW4KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFREb3VibGUgJCAyICoqIDUzKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFszLCA0MiwgNDMsIDQ0XQorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9KU09OU3BlYy5ocyBiL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmM4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpAQCAtMCwwICsxLDIyNSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBKU09OU3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgQworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKwordFN0cmluZyA6OiBbQ2hhcl0gLT4gVGhyaWZ0VmFsCit0U3RyaW5nID0gVFN0cmluZyAuIEMucGFjaworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiSlNPTlByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImJvb2wiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgdHJ1ZSBhcyAxIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBUcnVlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LXRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMSddCisKKyAgICAgIGl0ICJ3cml0ZXMgZmFsc2UgYXMgMCIgJCBkbworICAgICAgICBsZXQgdmFsID0gRmFsc2UKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCb29sIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMCddCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFRCb29sIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9CT09MCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJvb2wgdmFsKQorCisgICAgZGVzY3JpYmUgInN0cmluZyIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIlxcXCJhXCIiCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiXFxcImFcIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU1RSSU5HKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIlwiQVE9PVwiIgorCisgICAgICBpdCAicmVhZHMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUT09XCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIGl0ICJyZWFkcyB3aXRob3V0IHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIkFRXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCisgICAgZGVzY3JpYmUgImxpc3QiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkgbGlzdCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtdKQorCisgICAgICBpdCAid3JpdGVzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMSwwXSIKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgMF0pCisKKyAgICAgIGl0ICJyZWFkcyBlbGVtZW50cyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwyLDQyLCA0M10iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRMaXN0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX0xJU1QgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJzZXQiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTZXQgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSA0MiwgVEJ5dGUgNDNdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9TRVQgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU2V0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorCisgICAgZGVzY3JpYmUgIm1hcCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVE1hcCBUX0JZVEUgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAiW1wiaThcIixcImk4XCIsMCx7fV0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIixcImk4XCIsMCx7fV0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9NQVAgVF9CWVRFIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHN0cmluZy1zdHJpbmciICQgZG8KKyAgICAgICAgbGV0IGJpbiA9ICJbXCJzdHJcIixcInN0clwiLDIse1wiYVwiOlwiMlwiLFwiYlwiOlwiYmxhaFwifV0iCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrIGJpbikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HKQorICAgICAgICB2YWxgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HIFsodFN0cmluZyAiYSIsIHRTdHJpbmcgIjIiKSwgKHRTdHJpbmcgImIiLCB0U3RyaW5nICJibGFoIildKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9NQVAgVF9TVFJJTkcgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HICQgbWFwIHRvS1YgdmFsKQorICAgICAgICB3aGVyZQorICAgICAgICAgIHRvS1YgdiA9ICh0U3RyaW5nIHYsIHRTdHJpbmcgdikKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvU3BlYy5ocyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKQEAgLTAsMCArMSwzOCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKKy0tIE91ciBDSSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBhdXRvIGRpc2NvdmVyLgorLS0gTmVlZCB0byBhZGQgYnVpbGQtdGltZSBQQVRIIHZhcmlhYmxlIHRvIGhzcGVjLWRpc2NvdmVyIGRpciBmcm9tIENNYWtlCistLSBvciBpbnN0YWxsIGhzcGVjIHN5c3RlbS13aWRlIGZvciB0aGUgZm9sbG93aW5nIHRvIHdvcmsuCistLSB7LSMgT1BUSU9OU19HSEMgLUYgLXBnbUYgaHNwZWMtZGlzY292ZXIgIy19CisKK2ltcG9ydCBUZXN0LkhzcGVjCisKK2ltcG9ydCBxdWFsaWZpZWQgQmluYXJ5U3BlYworaW1wb3J0IHF1YWxpZmllZCBDb21wYWN0U3BlYworaW1wb3J0IHF1YWxpZmllZCBKU09OU3BlYworCittYWluIDo6IElPICgpCittYWluID0gaHNwZWMgc3BlYworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQmluYXJ5IiBCaW5hcnlTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkNvbXBhY3QiIENvbXBhY3RTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkpTT04iIEpTT05TcGVjLnNwZWMKZGlmZiAtLWdpdCBhL2xpYi9ocy90aHJpZnQuY2FiYWwgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCkBAIC0wLDAgKzEsODQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCitOYW1lOiAgICAgICAgICAgdGhyaWZ0CitWZXJzaW9uOiAgICAgICAgMS4wLjAKK0NhYmFsLVZlcnNpb246ICAxLjI0CitMaWNlbnNlOiAgICAgICAgT3RoZXJMaWNlbnNlCitDYXRlZ29yeTogICAgICAgRm9yZWlnbgorQnVpbGQtVHlwZTogICAgIFNpbXBsZQorU3lub3BzaXM6ICAgICAgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KK0hvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAorTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZworTGljZW5zZS1GaWxlOiAgIExJQ0VOU0UKKworRGVzY3JpcHRpb246CisgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uIFJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHRocmlmdCBjb2RlIGdlbmVyYXRvci4KKworZmxhZyBuZXR3b3JrLXVyaQorICAgZGVzY3JpcHRpb246IEdldCBOZXR3b3JrLlVSSSBmcm9tIHRoZSBuZXR3b3JrLXVyaSBwYWNrYWdlCisgICBkZWZhdWx0OiBUcnVlCisKK0xpYnJhcnkKKyAgSHMtU291cmNlLURpcnM6CisgICAgc3JjCisgIEJ1aWxkLURlcGVuZHM6CisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgY29udGFpbmVycywgZ2hjLXByaW0sIGF0dG9wYXJzZWMsIGJpbmFyeSwgYnl0ZXN0cmluZyA+PSAwLjEwLCBiYXNlNjQtYnl0ZXN0cmluZywgaGFzaGFibGUsIEhUVFAsIHRleHQsIGhzcGVjLWNvcmUgPiAyLjQuMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYsIHZlY3RvciA+PSAwLjEwLjEyLjIsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIHNwbGl0CisgIGlmIGZsYWcobmV0d29yay11cmkpCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKKyAgZWxzZQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42CisgIEV4cG9zZWQtTW9kdWxlczoKKyAgICBUaHJpZnQsCisgICAgVGhyaWZ0LkFyYml0cmFyaWVzCisgICAgVGhyaWZ0LlByb3RvY29sLAorICAgIFRocmlmdC5Qcm90b2NvbC5IZWFkZXIsCisgICAgVGhyaWZ0LlByb3RvY29sLkJpbmFyeSwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKKyAgICBUaHJpZnQuU2VydmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5FbXB0eSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeSwKKyAgICBUaHJpZnQuVHlwZXMKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKKyAgRGVmYXVsdC1FeHRlbnNpb25zOgorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFJlY29yZFdpbGRDYXJkcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCisKK1Rlc3QtU3VpdGUgc3BlYworICBUeXBlOiBleGl0Y29kZS1zdGRpby0xLjAKKyAgSHMtU291cmNlLURpcnM6IHRlc3QKKyAgR2hjLU9wdGlvbnM6IC1XYWxsCisgIG1haW4taXM6IFNwZWMuaHMKKyAgQnVpbGQtRGVwZW5kczogYmFzZSwgdGhyaWZ0LCBoc3BlYywgUXVpY2tDaGVjayA+PSAyLjguMiwgYnl0ZXN0cmluZyA+PSAwLjEwLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNgorICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMApkaWZmIC0tZ2l0IGEvbGliL2phdmEvQ01ha2VMaXN0cy50eHQgYi9saWIvamF2YS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmKEFORFJPSUQpCisgICAgc2V0KFRIUklGVF9BQVIgb3V0cHV0cy9hYXIvdGhyaWZ0LWRlYnVnLmFhciBvdXRwdXRzL2Fhci90aHJpZnQtcmVsZWFzZS5hYXIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtUSFJJRlRfQUFSfQorICAgICAgICBDT01NQU5EICR7R1JBRExFX0VYRUNVVEFCTEV9CisgICAgICAgICAgICAtcCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2FuZHJvaWQiCisgICAgICAgICAgICAiLVBidWlsZERpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYW5kcm9pZC9idWlsZCIgYXNzZW1ibGUKKyAgICApCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGhyaWZ0X2FhciBBTEwgREVQRU5EUyAke1RIUklGVF9BQVJ9KQorCitlbHNlKEFORFJPSUQpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtMSUJfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbmRpZigpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtET0NfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEphdmEgQUxMCisgICAgICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gYXNzZW1ibGUKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgRW5hYmxlIHB1Ymxpc2hpbmcgZnJvbSBDTWFrZSBpZiB0aGUgcHVibGlzaGluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgIGFkZF9jdXN0b21fdGFyZ2V0KE1hdmVuUHVibGlzaAorICAgICAgICBDT01NRU5UICJQdWJsaXNoaW5nIEphdmEgTGlicmFyeSB0byBBcGFjaGUgTWF2ZW4gc3RhZ2luZyIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gY2xlYW4gdXBsb2FkQXJjaGl2ZXMKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgSG9vayB0aGUgQ01ha2UgaW5zdGFsbCBwcm9jZXNzIHRvIHRoZSByZXN1bHRzIGZyb20gbWFrZSBBTEwuCisgICAgIyBUaGlzIHdvcmtzIGJlc3Qgd2hlbiAnbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdCcgaXMgdXNlZC4KKyAgICAjIFVzaW5nIHNsYXNoIHRvIGVuZCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGF2b2lkIGNvcHlpbmcgdGhlIGRpcmVjdG9yeSBwYXRoLgorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9saWJzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAibGlidGhyaWZ0LSR7dGhyaWZ0X1ZFUlNJT059LmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RlcHMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RvY3MvamF2YWRvYy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9ET0NfSU5TVEFMTF9ESVJ9KQorCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSBKYXZhVGVzdAorICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IHRlc3QKKyAgICAgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoQU5EUk9JRCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL01ha2VmaWxlLmFtIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KaW5kZXggY2IxMzMyZS4uNjU5ODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KQEAgLTE3LDIyICsxNyw1NiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotRVhUUkFfRElTVCA9IGJ1aWxkLnhtbCBpdnkueG1sIHNyYyB0ZXN0Ci0KIGV4cG9ydCBDTEFTU1BBVEgKIAogYWxsLWxvY2FsOgotCSQoQU5UKSAkKEFOVF9GTEFHUykKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgYXNzZW1ibGUgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKIGluc3RhbGwtZXhlYy1ob29rOgotCSQoQU5UKSAkKEFOVF9GTEFHUykgaW5zdGFsbCAtRGluc3RhbGwucGF0aD0kKERFU1RESVIpJChKQVZBX1BSRUZJWCkgXAotCQktRGluc3RhbGwuamF2YWRvYy5wYXRoPSQoREVTVERJUikkKGRvY2RpcikvamF2YQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBpbnN0YWxsIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUGluc3RhbGwucGF0aD0kKERFU1RESVIpJChKQVZBX1BSRUZJWCkgXAorCQktUGluc3RhbGwuamF2YWRvYy5wYXRoPSQoREVTVERJUikkKGRvY2RpcikvamF2YSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKLSMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KIGNsZWFuLWxvY2FsOgotCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCi0JJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGNsZWFuIC0tY29uc29sZT1wbGFpbgogCi1jaGVjay1sb2NhbDogYWxsCi0JJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CitwcmVjcm9zczogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHNoYWRvd0phciBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KIAorY2hlY2stbG9jYWw6ICQoVEhSSUZUKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB0ZXN0IFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgorCittYXZlbi1wdWJsaXNoOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB1cGxvYWRBcmNoaXZlcyBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC5ncmFkbGUgXAorCWdyYWRsZS5wcm9wZXJ0aWVzIFwKKwlzZXR0aW5ncy5ncmFkbGUgXAorCWdyYWRsZSBcCisJZ3JhZGxldyBcCisJZ3JhZGxldy5iYXQgXAorCUNNYWtlTGlzdHMudHh0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlhbmRyb2lkIFwKKwlzcmMgXAorCXRlc3QgXAorCWNvZGVfcXVhbGl0eV90b29scyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvamF2YS9SRUFETUUgYi9saWIvamF2YS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGQzNTEuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotVGhyaWZ0IEphdmEgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBUaHJpZnQgSmF2YSBzb3VyY2UgaXMgbm90IGJ1aWxkIHVzaW5nIHRoZSBHTlUgdG9vbHMsIGJ1dCByYXRoZXIgdXNlcwotdGhlIEFwYWNoZSBBbnQgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKLWRldmVsb3BlcnMuCi0KLVRvIGNvbXBpbGUgdGhlIEphdmEgVGhyaWZ0IGxpYnJhcmllcywgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmc6Ci0KLWFudAotCi1ZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQuamFyIGluIHRoZSBiYXNlIGRpcmVjdG9yeS4KLQotVG8gaW5jbHVkZSBUaHJpZnQgaW4geW91ciBhcHBsaWNhdGlvbnMgc2ltcGx5IGFkZCBsaWJ0aHJpZnQuamFyIHRvIHlvdXIKLWNsYXNzcGF0aCwgb3IgaW5zdGFsbCBpZiBpbiB5b3VyIGRlZmF1bHQgc3lzdGVtIGNsYXNzcGF0aCBvZiBjaG9pY2UuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLUFwYWNoZSBBbnQKLWh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRS5tZCBiL2xpYi9qYXZhL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVmMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTc2IEBACitUaHJpZnQgSmF2YSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK0J1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGZyb20gc291cmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIHVzaW5nIGEgQ01ha2UgYnVpbGQgZnJvbSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvbiBMaW51eCB0aGUKK2Vhc2llc3Qgd2F5IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGlzIHRoaXMgc2ltcGxlIGNvbW1hbmQgbGluZToKKworICAgIG1ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QKKworSXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGUgaW5zdGFsbC9mYXN0IG9wdGlvbiB0byBlbGltaW5hdGUKK3RoZSBhdXRvbWF0aWMgcmVidWlsZCBieSBkZXBlbmRlbmN5IHRoYXQgY2F1c2VzIGlzc3VlcyBiZWNhdXNlCit0aGUgYnVpbGQgdG9vbGluZyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggY2FjaGVkIGZpbGVzIGluIHRoZQordXNlciBob21lIGRpcmVjdG9yeSBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIEluc3RlYWQgdGhpcyBidWlsZHMKK3RoZSBjb2RlIGluIHRoZSBleHBlY3RlZCBsb2NhbCBidWlsZCB0cmVlIGFuZCB0aGVuIHVzZXMgQ01ha2UKK2luc3RhbGwgY29kZSB0byBjb3B5IHRvIHRoZSB0YXJnZXQgZGVzdGluYXRpb24uCisKK0J1aWxkaW5nIFRocmlmdCB3aXRoIEdyYWRsZSB3aXRob3V0IENNYWtlL0F1dG9jb25mCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgVGhyaWZ0IEphdmEgc291cmNlIGlzIG5vdCBidWlsZCB1c2luZyB0aGUgR05VIHRvb2xzLCBidXQgcmF0aGVyIHVzZXMKK3RoZSBHcmFkbGUgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKK2RldmVsb3BlcnMuCisKK1RvIGNvbXBpbGUgdGhlIEphdmEgVGhyaWZ0IGxpYnJhcmllcywgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAuL2dyYWRsZXcKKworWWVwLCB0aGF0J3MgZWFzeS4gTG9vayBmb3IgbGlidGhyaWZ0LTx2ZXJzaW9uPi5qYXIgaW4gdGhlIGJ1aWxkL2xpYnMgZGlyZWN0b3J5LgorCitUaGUgZGVmYXVsdCBidWlsZCB3aWxsIHJ1biB0aGUgdW5pdCB0ZXN0cyB3aGljaCBleHBlY3QgYSB1c2FibGUKK1RocmlmdCBjb21waWxlciB0byBleGlzdCBvbiB0aGUgc3lzdGVtLiBZb3UgaGF2ZSB0d28gY2hvaWNlcyBmb3IKK3RoYXQuCisKKyogQnVpbGQgdGhlIFRocmlmdCBleGVjdXRhYmxlIGZyb20gc291cmNlIGF0IHRoZSBkZWZhdWx0CisgIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhlIHByb2plY3QgaXMgY29uZmlndXJlZAorICB0byBsb29rIGZvciBpdCB0aGVyZS4KKyogSW5zdGFsbCB0aGUgcHVibGlzaGVkIGJpbmFyeSBkaXN0cmlidXRpb24gdG8gaGF2ZSBUaHJpZnQKKyAgZXhlY3V0YWJsZSBpbiBhIGtub3duIGxvY2F0aW9uIGFuZCBhZGQgdGhlIHBhdGggdG8gdGhlCisgIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlIHVzaW5nIHRoZSBwcm9wZXJ0eSBuYW1lCisgICJ0aHJpZnQuY29tcGlsZXIiLiBGb3IgZXhhbXBsZSB0aGlzIHdvdWxkIHNldCB0aGUgcGF0aCBpbgorICBhIFdpbmRvd3MgYm94IGlmIFRocmlmdCB3YXMgaW5zdGFsbGVkIHVuZGVyIEM6XFRocmlmdAorCisgICAgdGhyaWZ0LmNvbXBpbGVyPUM6L1RocmlmdC90aHJpZnQuZXhlCisKK1RvIGp1c3QgYnVpbGQgdGhlIGxpYnJhcnkgd2l0aG91dCBydW5uaW5nIHVuaXQgdGVzdHMgeW91IHNpbXBseSBkbyB0aGlzLgorCisgICAgLi9ncmFkbGV3IGFzc2VtYmxlCisKK1RvIGluc3RhbGwgdGhlIGxpYnJhcnkgaW4gdGhlIGxvY2FsIE1hdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24KK3doZXJlIG90aGVyIE1hdmVuIG9yIEdyYWRsZSBidWlsZHMgY2FuIHJlZmVyZW5jZSBpdCBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBpbnN0YWxsCisKK1RoZSBsaWJyYXJ5IHdpbGwgYmUgcGxhY2VkIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkgdW5kZXIgLm0yL3JlcG9zaXRvcnkKKworVG8gaW5jbHVkZSBUaHJpZnQgaW4geW91ciBhcHBsaWNhdGlvbnMgc2ltcGx5IGFkZCBsaWJ0aHJpZnQuamFyIHRvIHlvdXIKK2NsYXNzcGF0aCwgb3IgaW5zdGFsbCBpZiBpbiB5b3VyIGRlZmF1bHQgc3lzdGVtIGNsYXNzcGF0aCBvZiBjaG9pY2UuCisKKworQnVpbGQgVGhyaWZ0IGJlaGluZCBhIHByb3h5OgorCisgICAgLi9ncmFkbGV3IC1EaHR0cC5wcm94eUhvc3Q9bXlwcm94eWhvc3QgLURodHRwLnByb3h5UG9ydD04MDgwIC1EaHR0cC5wcm94eVVzZXI9dGhyaWZ0dXNlciAtRGh0dHAucHJveHlQYXNzd29yZD10b3BzZWNyZXQKKworb3IgdmlhCisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtamF2YSBHUkFETEVfT1BUUz0nLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldCcKKworCitVbml0IFRlc3QgSFRNTCBSZXBvcnRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gSFRNTCBVbml0IFRlc3QgcmVwb3J0LiBUaGlzIGNhbiBiZSBmb3VuZAordW5kZXIgYnVpbGQvcmVwb3J0cy90ZXN0cy90ZXN0L2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4KKworCitDbG92ZXIgQ29kZSBDb3ZlcmFnZSBmb3IgVGhyaWZ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIG9wdGlvbmFsbHkgZ2VuZXJhdGUgQ2xvdmVyIENvZGUgY292ZXJhZ2UgaWYgdGhlIEdyYWRsZSBwcm9wZXJ0eQorYGNsb3ZlckVuYWJsZWQ9dHJ1ZWAgaXMgc2V0IGluIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lCit2aWEgYC1QY2xvdmVyRW5hYmxlZD10cnVlYC4gVGhlIGdlbmVyYXRlZCByZXBvcnQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBsb2NhdGlvbgorYnVpbGQvcmVwb3J0cy9jbG92ZXIvaHRtbC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uIEFkZGl0aW9uYWxseSwgYSBQREYgcmVwb3J0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm91bmQKK3VuZGVyIHRoZSBsb2NhdGlvbiBidWlsZC9yZXBvcnRzL2Nsb3Zlci9jbG92ZXIucGRmLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBidWlsZCwgdW5pdCB0ZXN0LCBhbmQgZ2VuZXJhdGUgQ2xvdmVyIHJlcG9ydHM6CisKKyAgICAuL2dyYWRsZXcgLVBjbG92ZXJFbmFibGVkPXRydWUKKworCitQdWJsaXNoaW5nIE1hdmVuIEFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBdXRvbWFrZSBidWlsZCBnZW5lcmF0ZXMgYSBNYWtlZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMKK3doZW4geW91IHJ1biB0aGUgYnVpbGQgcHJvdmlkZWQgdGhlIGNvbmZpZ3VyZS5hYyBoYXMgYmVlbiBzZXQgd2l0aCB0aGUgY29ycmVjdAordmVyc2lvbiBudW1iZXIuIFRoZSBHcmFkbGUgYnVpbGQgd2lsbCByZWNlaXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVpbGQuCitUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBDTWFrZSBidWlsZCwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIHdpbGwKK2JlIHVzZWQgaWYgeW91IGV4ZWN1dGUgdGhlc2UgY29tbWFuZHM6CisKKyAgICBtYWtlIG1hdmVuLXB1Ymxpc2ggICAtLSBUaGlzIGlzIGZvciBhbiBBdXRvbWFrZSBMaW51eCBidWlsZAorICAgIG1ha2UgTWF2ZW5QdWJsaXNoICAgIC0tIFRoaXMgaXMgZm9yIGEgQ01ha2UgZ2VuZXJhdGVkIGJ1aWxkCisKK1RoZSB1cGxvYWRBcmNoaXZlcyB0YXNrIGluIEdyYWRsZSBpcyBwcmVjb25maWd1cmVkIHdpdGggYWxsIG5lY2Vzc2FyeSBkZXRhaWxzCit0byBzaWduIGFuZCBwdWJsaXNoIHRoZSBhcnRpZmFjdHMgZnJvbSB0aGUgYnVpbGQgdG8gdGhlIEFwYWNoZSBNYXZlbiBzdGFnaW5nCityZXBvc2l0b3J5LiBUaGUgdGFzayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcHJvcGVydGllcyB0bworYXV0aGVudGljYXRlIHRvIHRoZSByZXBvc2l0b3J5IGFuZCBzaWduIHRoZSBhcnRpZmFjdHMuIFRoZSBwcmVmZXJyZWQgYXBwcm9hY2gKK2lzIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXMgdG8gaXQuCisKKyAgICAjIFNpZ25pbmcga2V5IGluZm9ybWF0aW9uIGZvciBhcnRpZmFjdHMgUEdQIHNpZ25hdHVyZSAodmFsdWVzIGFyZSBleGFtcGxlcykKKyAgICBzaWduaW5nLmtleUlkPTI0ODc1RDczCisgICAgc2lnbmluZy5wYXNzd29yZD1zZWNyZXQKKyAgICBzaWduaW5nLnNlY3JldEtleVJpbmdGaWxlPS9Vc2Vycy9tZS8uZ251cGcvc2VjcmluZy5ncGcKKworICAgICMgQXBhY2hlIE1hdmVuIHN0YWdpbmcgcmVwb3NpdG9yeSB1c2VyIGNyZWRlbnRpYWxzCisgICAgbWF2ZW5Vc2VyPW1lTXlzZWxmQW5kSQorICAgIG1hdmVuUGFzc3dvcmQ9TXlTdXBlckF3ZXNvbWVTZWNyZXRQYXNzd29yZAorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHB1Ymxpc2ggdXNpbmcgdGhlIEdyYWRsZSBidWlsZCBkaXJlY3RseS4KK1dpdGggdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQgY3JlZGVudGlhbHMgaW4gcGxhY2UgdGhlIGZvbGxvd2luZyB3aWxsIGdlbmVyYXRlCitpZiBuZWVkZWQgdGhlIGJ1aWxkIGFydGlmYWN0cyBhbmQgcHJvY2VlZCB0byBwdWJsaXNoIHRoZSByZXN1bHRzLgorCisgICAgLi9ncmFkbGV3IC1QcmVsZWFzZT10cnVlIC1QdGhyaWZ0LnZlcnNpb249MC4xMS4wIHVwbG9hZEFyY2hpdmVzCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHRhcmdldCByZXBvc2l0b3J5IGZvciB0aGUgTWF2ZW4gUHVibGljYXRpb24KK2J5IHVzaW5nIGEgR3JhZGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSB5b3UgY2FuIHB1Ymxpc2ggc2lnbmVkIEpBUiBmaWxlcyB0byB5b3VyCitjb21wYW55IGludGVybmFsIHNlcnZlciBpZiB5b3UgYWRkIHRoaXMgdG8gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUKK34vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlLiBUaGUgVVJMIGJlbG93IGFzc3VtZXMgYSBOZXh1cyBSZXBvc2l0b3J5LgorCisgICAgbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorCitPciB0aGUgc2FtZSBvbiB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgLi9ncmFkbGV3IC1QbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcworCisKK0RlcGVuZGVuY2llcworPT09PT09PT09PT09CisKK0dyYWRsZQoraHR0cDovL2dyYWRsZS5vcmcvCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgQXV0b0V4cGFuZGluZ0J1ZmZlciBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBTaG9ydFN0YWNrIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ODQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMjMKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMjMuMC4xIgorICAgIHVzZUxpYnJhcnkgJ29yZy5hcGFjaGUuaHR0cC5sZWdhY3knCisgICAgc291cmNlU2V0cy5tYWluLmphdmEgeworICAgICAgICBzcmNEaXIgJy4uL3NyYycKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YScKKyAgICB9Cit9CisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5DZW50cmFsKCkKK30KK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTMnCisgICAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCisgICAgY29tcGlsZSAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuNCcKK30KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuQ2VudHJhbCgpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjEuNS4wJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEgQEAKK3Jvb3RQcm9qZWN0Lm5hbWU9J3RocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCBwYWNrYWdlPSJvcmcuYXBhY2hlLnRocmlmdCI+CisgIDxhcHBsaWNhdGlvbiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXNpbmcgdGhlIGxlZ2FjeSBwbHVnaW4gY2xhc3NwYXRoIGZvciBDbG92ZXIgc28gaXQgY2FuIGJlIGxvYWRlZCBvcHRpb25hbGx5CitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIGdyYWRsZVBsdWdpblBvcnRhbCgpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYm11c2Noa286Z3JhZGxlLWNsb3Zlci1wbHVnaW46Mi4yLjAnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnamF2YScKKyAgICBpZCAnbWF2ZW4nCisgICAgaWQgJ3NpZ25pbmcnCisgICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzIuMC4yJworfQorCitkZXNjcmlwdGlvbiA9ICdBcGFjaGUgVGhyaWZ0IEphdmEgTGlicmFyeScKKworZGVmYXVsdFRhc2tzICdidWlsZCcKKworLy8gVmVyc2lvbiBjb21wb25lbnRzIGZvciB0aGlzIHByb2plY3QKK2dyb3VwID0gcHJvcGVydHkoJ3RocmlmdC5ncm91cGlkJykKKworLy8gRHJvcCB0aGUgLWRldiBzdWZmaXgsIHdlIHVzZSB0aGUgU05BUFNIT1Qgc3VmZml4IGZvciBub24tcmVsZWFzZSB2ZXJzaW9ucworZGVmIHBhcnNlZFZlcnNpb24gPSBwcm9wZXJ0eSgndGhyaWZ0LnZlcnNpb24nKS50b1N0cmluZygpLnJlcGxhY2UoJy1kZXYnLCAnJykKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LnJlbGVhc2UpKSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24KK30gZWxzZSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24gKyAnLVNOQVBTSE9UJworfQorCisvLyBLZWVwaW5nIHRoZSByZXN0IG9mIHRoZSBidWlsZCBsb2dpYyBpbiBmdW5jdGlvbmFsIG5hbWVkIHNjcmlwdHMgZm9yIGNsYXJpdHkKK2FwcGx5IGZyb206ICdncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvcHVibGlzaGluZy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZScKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnhtbCBiL2xpYi9qYXZhL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhNGJlYS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iCi0gIHhtbG5zOml2eT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCIKLSAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+Ci0KLSAgPGRlc2NyaXB0aW9uPlRocmlmdCBCdWlsZCBGaWxlPC9kZXNjcmlwdGlvbj4KLQotICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5iZWFuIiBsb2NhdGlvbj0iZ2VuLWphdmFiZWFuIiAvPgotICA8cHJvcGVydHkgbmFtZT0ibXZuLmFudC50YXNrLnZlcnNpb24iIHZhbHVlPSIyLjEuMCIgLz4KLSAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYyIgbG9jYXRpb249IiR7YnVpbGR9L2phdmFkb2MiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpbnN0YWxsLnBhdGgiIHZhbHVlPSIvdXNyL2xvY2FsL2xpYiIgLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy50ZXN0IiBsb2NhdGlvbj0idGVzdCIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QiIGxvY2F0aW9uPSIke2J1aWxkfS90ZXN0IiAvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aHJpZnQuaG9tZSIgbG9jYXRpb249Ii4uLy4uL3Rlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5yb290IiBsb2NhdGlvbj0iLi4vLi4vIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YmFzZWRpcn0vbGlidGhyaWZ0LmphciIgLz4gIAotCi0gIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vLnRocmlmdC1idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDwhLS0gaXZ5IHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpdnkudmVyc2lvbiIgdmFsdWU9IjIuMC4wLXJjMiIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Iml2eS5kaXIiIGxvY2F0aW9uPSIke2J1aWxkfS9pdnkiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpdnkuamFyIiBsb2NhdGlvbj0iJHtpdnkuZGlyfS9pdnktJHtpdnkudmVyc2lvbn0uamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpdnkubGliLmRpciIgbG9jYXRpb249IiR7aXZ5LmRpcn0vbGliIiAvPgotICA8cHJvcGVydHkgbmFtZT0iaXZ5X3JlcG9fdXJsIiB2YWx1ZT0iaHR0cDovL3JlcG8yLm1hdmVuLm9yZy9tYXZlbjIvb3JnL2FwYWNoZS9pdnkvaXZ5LyR7aXZ5LnZlcnNpb259L2l2eS0ke2l2eS52ZXJzaW9ufS5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9Iml2eXNldHRpbmdzLnhtbCIgbG9jYXRpb249IiR7aXZ5LmRpcn0vaXZ5c2V0dGluZ3MueG1sIiAvPgotICA8cHJvcGVydHkgbmFtZT0ibXZuX2FudF90YXNrX3VybCIgdmFsdWU9Imh0dHA6Ly93d3cucmV2ZXJzZS5uZXQvcHViL2FwYWNoZS9tYXZlbi9iaW5hcmllcy9tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyIiAvPgotICA8cHJvcGVydHkgbmFtZT0ibXZuLmFudC50YXNrLmphciIgbG9jYXRpb249IiR7aXZ5LmRpcn0vbWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphciIgLz4KLSAgPHByb3BlcnR5IG5hbWU9InNvdXJjZXMuemlwIiBsb2NhdGlvbj0iJHtidWlsZH0vbGlidGhyaWZ0LXNyYy56aXAiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwb20uZmlsZSIgbG9jYXRpb249IiR7YnVpbGR9L3BvbS54bWwiIC8+Ci0gIAotICA8IS0tIFRPRE86IEdldCB0aGUgYXBwcm9wcmlhdGUgdG9rZW5zIC8gVVJMIGZvciB1cGxvYWQgLS0+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImFwYWNoZS5zbmFwc2hvdC5yZXBvc2l0b3J5IiB2YWx1ZT0iaHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzIiAvPgotICAKLSAgPHBhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7aXZ5LmxpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiAvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2Vudi5DTEFTU1BBVEh9IiAvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdCIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFyLmZpbGV9IiAvPgotICA8L3BhdGg+Ci0KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wIC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRlc3R9IiAvPgotICAgIDwhLS0KLSAgICBBbGxvdyBJdnkgdG8gYmUgZGlzYWJsZWQgd2l0aCAiLURub2l2eT0iLgotICAgIEl0IGlzIGtpbmQgb2YgYSBoYWNrIHRvIHByZXRlbmQgdGhhdCB3ZSBhbHJlYWR5IGZvdW5kIGl0LAotICAgIGJ1dCBBbnQgZG9lc24ndCBwcm92aWRlIGFuIGVhc3kgd2F5IG9mIGJsb2NraW5nIGRlcGVuZGVuY2llcwotICAgIGZyb20gZXhlY3V0aW5nIG9yIGNoZWNraW5nIG11bHRpcGxlIGNvbmRpdGlvbnMuCi0gICAgLS0+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXZ5LmZvdW5kIj48aXNzZXQgcHJvcGVydHk9Im5vaXZ5IiAvPjwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im9mZmxpbmUiPjxpc3NldCBwcm9wZXJ0eT0ibm9pdnkiIC8+PC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaXZ5LWluaXQtZGlycyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtpdnkuZGlyfSIgLz4KLSAgICA8bWtkaXIgZGlyPSIke2l2eS5saWIuZGlyfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJpdnktZG93bmxvYWQiIGRlcGVuZHM9Iml2eS1pbml0LWRpcnMiIGRlc2NyaXB0aW9uPSJUbyBkb3dubG9hZCBpdnkiIHVubGVzcz0ib2ZmbGluZSI+Ci0gICAgPGdldCBzcmM9IiR7aXZ5X3JlcG9fdXJsfSIgZGVzdD0iJHtpdnkuamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaXZ5LXByb2JlLWFudGxpYiI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXZ5LmZvdW5kIj4KLSAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50IiBuYW1lPSJjbGVhbmNhY2hlIi8+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaXZ5LWluaXQtYW50bGliIiBkZXBlbmRzPSJpdnktZG93bmxvYWQsaXZ5LXByb2JlLWFudGxpYiIgdW5sZXNzPSJpdnkuZm91bmQiPgotICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCIgb25lcnJvcj0iZmFpbCIKLSAgICAgIGxvYWRlclJlZj0iaXZ5TG9hZGVyIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpdnkuamFyfSIvPgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC90eXBlZGVmPgotICAgIDxmYWlsPgotICAgICAgPGNvbmRpdGlvbiA+Ci0gICAgICAgIDxub3Q+Ci0gICAgICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLml2eS5hbnQiIG5hbWU9ImNsZWFuY2FjaGUiLz4KLSAgICAgICAgPC9ub3Q+Ci0gICAgICA8L2NvbmRpdGlvbj4KLSAgICAgIFlvdSBuZWVkIEFwYWNoZSBJdnkgMi4wIG9yIGxhdGVyIGZyb20gaHR0cDovL2FudC5hcGFjaGUub3JnLwotICAgICAgSXQgY291bGQgbm90IGJlIGxvYWRlZCBmcm9tICR7aXZ5X3JlcG9fdXJsfQotICAgIDwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiBkZXBlbmRzPSJpdnktaW5pdC1hbnRsaWIiIGRlc2NyaXB0aW9uPSJyZXRyaWV2ZSBkZXBlbmRlbmNpZXMgd2l0aCBpdnkiIHVubGVzcz0ibm9pdnkiPgotICAgIDxpdnk6cmV0cmlldmUgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0LHJlc29sdmUiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIHNvdXJjZT0iMS41IiB0YXJnZXQ9IjEuNSIgZGVidWc9InRydWUiIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5jbGFzc3BhdGgiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFkb2Mgc291cmNlcGF0aD0iJHtzcmN9IgotICAgICAgZGVzdGRpcj0iJHtqYXZhZG9jfSIKLSAgICAgIHZlcnNpb249InRydWUiCi0gICAgICB3aW5kb3d0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIgotICAgICAgZG9jdGl0bGU9IlRocmlmdCBKYXZhIEFQSSIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9NRVRBLUlORiIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L0xJQ0VOU0UiIHRvZmlsZT0iJHtidWlsZH0vTUVUQS1JTkYvTElDRU5TRS50eHQiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9OT1RJQ0UiIHRvZmlsZT0iJHtidWlsZH0vTUVUQS1JTkYvTk9USUNFLnR4dCIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdGhyaWZ0LyoqLyouY2xhc3MiIC8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoudHh0IiAvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbCIgZGVwZW5kcz0iZGlzdCxqYXZhZG9jIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLnBhdGh9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuIj48aW5jbHVkZSBuYW1lPSIqLmphciIgLz48L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwuamF2YWRvYy5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YWRvY30iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIiAvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5iZWFufSIvPgotICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2N9Ii8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2phci5maWxlfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3QiIGRlc2NyaXB0aW9uPSJCdWlsZCB0aGUgdGVzdCBzdWl0ZSBjbGFzc2VzIiBkZXBlbmRzPSJnZW5lcmF0ZSxkaXN0Ij4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3R9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmJlYW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3R9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke3NyYy50ZXN0fSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0fSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0fS9sb2ciLz4KLQotICA8dGFyZ2V0IG5hbWU9Imp1bml0LXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIEpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmxvZy5kaXJ9Ii8+Ci0gICAgPGp1bml0Ci0gICAgICBwcmludHN1bW1hcnk9InllcyIgc2hvd291dHB1dD0iJHt0ZXN0Lm91dHB1dH0iIAotICAgICAgaGFsdG9uZmFpbHVyZT0ibm8iIGZvcms9InllcyIgZm9ya21vZGU9Im9uY2UiIG1heG1lbW9yeT0iNTEybSIKLSAgICAgIGVycm9yUHJvcGVydHk9InRlc3RzLmZhaWxlZCIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiCi0gICAgICB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdH0iLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7dGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0fSIgLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovVGVzdCouamF2YSIgLz4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LmxvZy5kaXJ9IiBpZj0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSIgaW5jbHVkZXM9IioqLyR7dGVzdGNhc2V9LmphdmEiIC8+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICAgIDxmYWlsIGlmPSJ0ZXN0cy5mYWlsZWQiPlRlc3RzIGZhaWxlZCE8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGVwcmVjYXRlZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiIC8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiIGRlcGVuZHM9Imp1bml0LXRlc3QsZGVwcmVjYXRlZC10ZXN0Ii8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0Y2xpZW50IiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBjbGllbnQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Q2xpZW50IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIgLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdFNlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iIC8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Rub25ibG9ja2luZ3NlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgbm9uYmxvY2tpbmcgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIgLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L1RocmlmdFRlc3QudGhyaWZ0IiAvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiIC8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCIgLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmJlYW5zLG5vY2FtZWwgJHt0ZXN0LnRocmlmdC5ob21lfS9KYXZhQmVhbnNUZXN0LnRocmlmdCIgLz4KLSAgICA8L2V4ZWM+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiPgotICAgIDxnZXQgc3JjPSIke212bl9hbnRfdGFza191cmx9IiBkZXN0PSIke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiIC8+IAotICAgIDxwYXRoIGlkPSJtYXZlbi1hbnQtdGFza3MuY2xhc3NwYXRoIiBwYXRoPSIke212bi5hbnQudGFzay5qYXJ9IiAvPgotICA8dGFza2RlZiByZXNvdXJjZT0ib3JnL2FwYWNoZS9tYXZlbi9hcnRpZmFjdC9hbnQvYW50bGliLnhtbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IgotICAgICAgICAgIGNsYXNzcGF0aHJlZj0ibWF2ZW4tYW50LXRhc2tzLmNsYXNzcGF0aCIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwYWNrLnNyYyI+Ci0gICAgPHppcCBkZXN0ZmlsZT0iJHtzb3VyY2VzLnppcH0iIGJhc2VkaXI9IiR7c3JjfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5wb20iIGRlcGVuZHM9ImluaXQscmVzb2x2ZSIgZGVzY3JpcHRpb249IkdlbmVyYXRlIGEgTWF2ZW4gUE9NIGZpbGUgZm9yIGxpYnRocmlmdCI+Ci0gICAgPGl2eTptYWtlcG9tIGl2eWZpbGU9IiR7YmFzZWRpcn0vaXZ5LnhtbCIgcG9tZmlsZT0iJHtwb20uZmlsZX0iID4KLSAgICAgIDxtYXBwaW5nIGNvbmY9ImRlZmF1bHQiIHNjb3BlPSJjb21waWxlIiAvPgotICAgICAgPG1hcHBpbmcgY29uZj0icnVudGltZSIgc2NvcGU9InJ1bnRpbWUiIC8+Ci0gICAgPC9pdnk6bWFrZXBvbT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJ0ZXN0LGRpc3QsbXZuLmluaXQsZ2VuZXJhdGUucG9tLHBhY2suc3JjIj4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIGZpbGU9IiR7cG9tLmZpbGV9IiAvPgotCi0gICAgPGFydGlmYWN0Omluc3RhbGwgZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPHBvbSByZWZpZD0icG9tIi8+Ci0gICAgICA8YXR0YWNoIGZpbGU9IiR7c291cmNlcy56aXB9IiBjbGFzc2lmaWVyPSJzb3VyY2UiIC8+Ci0gICAgPC9hcnRpZmFjdDppbnN0YWxsPgotCi0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9InJlbW90ZS5yZXBvc2l0b3J5IiB1cmw9IiR7YXBhY2hlLnNuYXBzaG90LnJlcG9zaXRvcnl9IiAvPgotCi0gICAgPGFydGlmYWN0OmRlcGxveSBmaWxlPSIke2phci5maWxlfSI+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0icmVtb3RlLnJlcG9zaXRvcnkiIC8+Ci0gICAgICA8cG9tIHJlZmlkPSJwb20iLz4KLSAgICAgIDxhdHRhY2ggZmlsZT0iJHtzb3VyY2VzLnppcH0iIGNsYXNzaWZpZXI9InNvdXJjZSIgLz4KLSAgICA8L2FydGlmYWN0OmRlcGxveT4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApAQCAtMCwwICsxLDUxIEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPCEtLQorICAgICAgICBUaGlzIGZpbGUgY29udHJvbHMgZmlsdGVyaW5nIHNvbWUgb2YgdGhlIG1vcmUgb2Jub3hpb3VzIGZpbmRidWdzIHJlcG9ydHMuCisgICAgICAgIFNvbWUgbWF5IGJlIHdvcnRoeSBvZiBleGFtaW5hdGlvbiBhbmQgcmVzb2x1dGlvbiwgb3RoZXJzIGFyZSB0b28gbml0LXBpY2t5LgorICAgIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPE9yPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgdGhlIG1pc3Npbmcgc2VyaWFsVmVyc2lvblVJRCBlcnJvcnMgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNuVkkiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBNYWxpY2lvdXMgY29kZSB2dWxuZXJhYmlsaXR5IFdhcm5pbmdzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJFSSxFSTIiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbmNoZWNrZWQvdW5jb25maXJtZWQgY2FzdCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iQkMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTaG91bGQgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkgcmF0aGVyIHRoYW4gbnVsbD8gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlBaTEEiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBSZWR1bmRhbnQgbnVsbGNoZWNrIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSQ04iIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBFeGNlcHRpb24gaXMgY2F1Z2h0IHdoZW4gRXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJFQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFN3aXRjaCBzdGF0ZW1lbnQgZm91bmQgd2hlcmUgZGVmYXVsdCBjYXNlIGlzIG1pc3NpbmcgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5yZWFkIHB1YmxpYy9wcm90ZWN0ZWQgZmllbGQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlVyRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEZpZWxkIG5vdCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBhbmQgZGVyZWZlcmVuY2VkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVd0YiIC8+CisgICAgICAgIDwvT3I+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgaW52b2tlcyBTeXN0ZW0uZXhpdCguLi4pLCB3aGljaCBzaHV0cyBkb3duIHRoZSBlbnRpcmUgdmlydHVhbCBtYWNoaW5lIC0tPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgICA8TWV0aG9kIG5hbWU9InByaW50VXNhZ2UiIC8+CisgICAgICAgIDxCdWcgY29kZT0iRG0iIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNpbXBsZUZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJjbG9zZSIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCRNdWx0aUZldGNoIiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0icnVuIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgQ2xhc3MgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmxldCIgLz4KKyAgICAgICA8QnVnIGNvZGU9IlNlIiAvPgorICAgICA8L01hdGNoPgorPC9GaW5kQnVnc0ZpbHRlcj4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZhOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTEuMC4wCit0aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAorcmVsZWFzZT10cnVlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjQuMQoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMTIKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBtYWluIEphdmEgc291cmNlcy4nCisKKyAgICBjbGFzc2lmaWVyICdzb3VyY2VzJworICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgSmF2YURvYy4nCisKKyAgICBjbGFzc2lmaWVyICdqYXZhZG9jJworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKKyAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBLZWVwIHRoaXMgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3Igbm93LCBkaXNhYmxlZCBieSBkZWZhdWx0CitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5jbG92ZXJFbmFibGVkKSkgeworICAgIGFwcGx5IHBsdWdpbjogJ2NvbS5ibXVzY2hrby5jbG92ZXInCisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbG92ZXIgJ29yZy5vcGVuY2xvdmVyOmNsb3Zlcjo0LjIuKycKKyAgICB9CisKKyAgICBjbG92ZXIgeworCisgICAgICAgIHRlc3RJbmNsdWRlcyA9IFsnKiovVGVzdCouamF2YSddCisgICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGdlbmVyYXRlZCB0ZXN0IGNvZGUgZnJvbSBjb2RlIGNvdmVyYWdlCisgICAgICAgIHRlc3RFeGNsdWRlcyA9IFsndGhyaWZ0L3Rlc3QvVGVzdCouamF2YSddCisKKyAgICAgICAgY29tcGlsZXIgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgICAgICAgICBkZWJ1ZyA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydCB7CisgICAgICAgICAgICBodG1sID0gdHJ1ZQorICAgICAgICAgICAgcGRmID0gdHJ1ZQorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGQuZGVwZW5kc09uIGNsb3ZlckdlbmVyYXRlUmVwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpAQCAtMCwwICsxLDM5IEBACisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmUgdGhlIEdyYWRsZSBjb2RlIHF1YWxpdHkgcGx1Z2lucyBoZXJlLgorLy8KKworYXBwbHkgcGx1Z2luOiAnZmluZGJ1Z3MnCisKK2ZpbmRidWdzIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICczLjAuMScKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIGVmZm9ydCA9ICdtYXgnCisgICAgcmVwb3J0TGV2ZWwgPSAnbG93JworICAgIGV4Y2x1ZGVGaWx0ZXIgPSBmaWxlKCdjb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCcpCit9CisKK3Rhc2tzLndpdGhUeXBlKEZpbmRCdWdzKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIHRleHQuZW5hYmxlZCA9IGZhbHNlCisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAncG1kJworCitwbWQgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzYuMC4wJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgcnVsZVNldHMgPSBbICdqYXZhLWJhc2ljJyBdCit9CisKK3Rhc2tzLndpdGhUeXBlKFBtZCkgeworICAgIHJlcG9ydHMgeworICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gT3ZlcnJpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiBDTWFrZSBpcyB1c2VkIChhbGxvd3MgZm9yIG91dC1vZi10cmVlLWJ1aWxkcykKK2lmIChoYXNQcm9wZXJ0eSgnYnVpbGQuZGlyJykpIHsKKyAgICBidWlsZERpciA9IGZpbGUocHJvcGVydHkoJ2J1aWxkLmRpcicpKQorfQorCisvLyBJbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG90aGVyIEFudCBiYXNlZCBidWlsZHMgaW4gdGhlIHN5c3RlbQorLy8gd2UgY29udmVydCB0aGUgZ3JhZGxlLnByb3BlcnRpZXMgaW50byBEU0wgZnJpZW5kbHkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzCitleHQuaW5zdGFsbFBhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5wYXRoJykKK2V4dC5pbnN0YWxsSmF2YWRvY1BhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5qYXZhZG9jLnBhdGgnKQorCitleHQudGhyaWZ0Um9vdCA9IGZpbGUoJy4uLy4uJykKKworaWYgKGhhc1Byb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKSkgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9IHByb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKQorfSBlbHNlIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSAiJHRocmlmdFJvb3QvY29tcGlsZXIvY3BwL3RocmlmdCIKK30KKworZXh0Lm12blJlcG8gPSBwcm9wZXJ0eSgnbXZuLnJlcG8nKQorZXh0LmFwYWNoZVJlcG8gPSBwcm9wZXJ0eSgnYXBhY2hlLnJlcG8nKQorZXh0Lm1hdmVuUmVwb3NpdG9yeVVybCA9IHByb3BlcnR5KCdtYXZlbi1yZXBvc2l0b3J5LXVybCcpCisKKy8vIFZlcnNpb25zIHVzZWQgaW4gdGhpcyBwcm9qZWN0CitleHQuaHR0cGNsaWVudFZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNsaWVudC52ZXJzaW9uJykKK2V4dC5odHRwY29yZVZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNvcmUudmVyc2lvbicpCitleHQuc2VydmxldFZlcnNpb24gPSBwcm9wZXJ0eSgnc2VydmxldC52ZXJzaW9uJykKK2V4dC5zbGY0alZlcnNpb24gPSBwcm9wZXJ0eSgnc2xmNGoudmVyc2lvbicpCitleHQuanVuaXRWZXJzaW9uID0gcHJvcGVydHkoJ2p1bml0LnZlcnNpb24nKQorZXh0Lm1vY2tpdG9WZXJzaW9uID0gcHJvcGVydHkoJ21vY2tpdG8udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKworICAgIHRlc3RDb21waWxlICJqdW5pdDpqdW5pdDoke2p1bml0VmVyc2lvbn0iCisgICAgdGVzdENvbXBpbGUgIm9yZy5tb2NraXRvOm1vY2tpdG8tYWxsOiR7bW9ja2l0b1ZlcnNpb259IgorICAgIHRlc3RSdW50aW1lICJvcmcuc2xmNGo6c2xmNGotbG9nNGoxMjoke3NsZjRqVmVyc2lvbn0iCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uYWwgdGVzdGluZyBoYXJuZXNzIGNyZWF0aW9uLiBUaGlzIGhlbHBzIHJ1biB0aGUgY3Jvc3MtY2hlY2sgdGVzdHMuCisvLyBUaGUgTWFrZWZpbGUgcHJlY3Jvc3MgdGFyZ2V0IGludm9rZXMgdGhlIHNoYWRvd0phciB0YXNrIGFuZCB0aGUgdGVzdHMuanNvbgorLy8gY29kZSBpcyBjaGFuZ2VkIHRvIGNhbGwgcnVuY2xpZW50IG9yIHJ1bnNlcnZlciBhcyBuZWVkZWQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3NzIFRlc3Qgc291cmNlcyBhcmUgc2VwYXJhdGVkIGluIHRoZWlyIG93biBzb3VyY2VTZXQKKy8vCitzb3VyY2VTZXRzIHsKKyAgICBjcm9zc1Rlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgfQorfQorCitjb25maWd1cmF0aW9ucyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSB7IGV4dGVuZHNGcm9tIHRlc3RDb21waWxlIH0KKyAgICBjcm9zc1Rlc3RSdW50aW1lIHsgZXh0ZW5kc0Zyb20gY3Jvc3NUZXN0Q29tcGlsZSwgdGVzdFJ1bnRpbWUgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAorICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyBJIGFtIHVzaW5nIHNoYWRvdyBwbHVnaW4gdG8gbWFrZSBhIHNlbGYgY29udGFpbmVkIGZ1bmN0aW9uYWwgdGVzdCBVYmVyIEpBUiB0aGF0CisvLyBlbGltaW5hdGVzIHN0YXJ0dXAgcHJvYmxlbXMgd2l0aCB3cmFwcGluZyB0aGUgY3Jvc3MtY2hlY2sgaGFybmVzcyBpbiBHcmFkbGUuCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHJ1bm5lciBzY3JpcHRzIGFzIHRoZSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IHdoaWNoCisvLyBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgaXQgY2FuLgorc2hhZG93SmFyIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZSBhIHRlc3QgSkFSIGZpbGUgZm9yIGNyb3NzLWNoZWNrIGV4ZWN1dGlvbicKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5lcnMgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzIHJ1bnMKKyAgICBkZXBlbmRzT24gJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50JywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyJywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBiYXNlTmFtZSA9ICdmdW5jdGlvbmFsVGVzdCcKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9mdW5jdGlvbmFsVGVzdEphciIpCisgICAgY2xhc3NpZmllciA9IG51bGwKKworICAgIC8vIFdlIGRvIG5vdCBuZWVkIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgaW50ZXJuYWwgamFyCisgICAgdmVyc2lvbiA9IG51bGwKKworICAgIC8vIEJ1bmRsZSB0aGUgY29tcGxldGUgc2V0IG9mIHVuaXQgdGVzdCBjbGFzc2VzIGluY2x1ZGluZyBnZW5lcmF0ZWQgY29kZQorICAgIC8vIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gb25lIEpBUiB0byBleHBlZGl0ZSBleGVjdXRpb24uCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0CisgICAgZnJvbSBzb3VyY2VTZXRzLmNyb3NzVGVzdC5vdXRwdXQKKyAgICBjb25maWd1cmF0aW9ucyA9IFtwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lXQorfQorCisvLyBDb21tb24gc2NyaXB0IHJ1bm5lciBjb25maWd1cmF0aW9uIGVsZW1lbnRzCitkZWYgc2NyaXB0RXh0ID0gJycKK2RlZiBleGVjRXh0ID0gJycKK2RlZiBzY3JpcHRIZWFkID0gJyMhL2Jpbi9iYXNoJworZGVmIGFyZ3MgPSAnJConCisKKy8vIEFsdGhvdWdoIHRoaXMgaXMgbWFya2VkIGludGVybmFsIGl0IGlzIGFuIGF2YWlsYWJsZSBhbmQgc3RhYmxlIGludGVyZmFjZQoraWYgKG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS53aW5kb3dzKSB7CisgICAgc2NyaXB0RXh0ID0gJy5iYXQnCisgICAgZXhlY0V4dCA9ICcuZXhlJworICAgIHNjcmlwdEhlYWQgPSAnQGVjaG8gb2ZmJworICAgIGFyZ3MgPSAnJSonCit9CisKKy8vIFRoZSBKYXZhIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHJ1bm5lciBzY3JpcHRzCitkZWYgamF2YUV4ZSA9IGZpbGUoIiR7U3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnKX0vYmluL2phdmEke2V4ZWNFeHR9IikuY2Fub25pY2FsUGF0aAorLy8gVGhlIGNvbW1vbiBVYmVyIGphciBwYXRoCitkZWYgamFyUGF0aCA9IHNoYWRvd0phci5hcmNoaXZlUGF0aC5jYW5vbmljYWxQYXRoCitkZWYgdHJ1c3RTdG9yZSA9IGZpbGUoJ3Rlc3QvLnRydXN0c3RvcmUnKS5jYW5vbmljYWxQYXRoCitkZWYga2V5U3RvcmUgPSBmaWxlKCd0ZXN0Ly5rZXlzdG9yZScpLmNhbm9uaWNhbFBhdGgKKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudChncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Q2xpZW50JworCisgICAgZGVmIGNsaWVudEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuY2xpZW50JHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5DbGllbnRUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPSR0cnVzdFN0b3JlIiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQgJGFyZ3MKKyIiIgorICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuQ2xpZW50VGV4dCcsIHJ1bkNsaWVudFRleHQKKyAgICBvdXRwdXRzLmZpbGUgY2xpZW50RmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgY2xpZW50RmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIGNsaWVudEZpbGUudGV4dCA9IHJ1bkNsaWVudFRleHQKKyAgICAgICAgY2xpZW50RmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0U2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdE5vbmJsb2NraW5nU2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVubm9uYmxvY2tpbmdzZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1MzczOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gR2VuZXJhdGVkIGNvZGUgbG9jYXRpb25zIGZvciBVbml0IHRlc3RzCitleHQuZ2VuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhIikKK2V4dC5nZW5CZWFuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhYmVhbiIpCitleHQuZ2VuUmV1c2VTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFyZXVzZSIpCitleHQuZ2VuRnVsbENhbWVsU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1mdWxsY2FtZWwiKQorZXh0LmdlblVuc2FmZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tdW5zYWZlIikKKworLy8gQWRkIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcyB0byB0aGUgdGVzdCBzb3VyY2Ugc2V0Citzb3VyY2VTZXRzIHsKKyAgICB0ZXN0LmphdmEuc3JjRGlycyBnZW5TcmMsIGdlbkJlYW5TcmMsIGdlblJldXNlU3JjLCBnZW5GdWxsQ2FtZWxTcmMsIGdlblVuc2FmZVNyYworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGdlbmVyYXRpb24gZm9yIFVuaXQgVGVzdGluZworCisvLyBBIGNhbGxhYmxlIGNsb3N1cmUgdG8gbWFrZSB0aGlzIGVhc2llcgorZXh0LnRocmlmdENvbXBpbGUgPSB7IFRhc2sgdGFzaywgU3RyaW5nIHRocmlmdEZpbGVOYW1lLCBTdHJpbmcgZ2VuZXJhdG9yID0gJ2phdmEnLCBGaWxlIG91dHB1dERpciA9IGdlblNyYyAtPgorICAgIGRlZiB0aHJpZnRGaWxlID0gZmlsZSgiJHRocmlmdFJvb3QvdGVzdC8kdGhyaWZ0RmlsZU5hbWUiKQorICAgIGFzc2VydCB0aHJpZnRGaWxlLmV4aXN0cygpCisKKyAgICB0YXNrLmlucHV0cy5maWxlIHRocmlmdEZpbGUKKyAgICB0YXNrLm91dHB1dHMuZGlyIG91dHB1dERpcgorCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBvdXRwdXREaXIubWtkaXJzKCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGV4ZWMgeworICAgICAgICAgICAgZXhlY3V0YWJsZSBmaWxlKHRocmlmdENvbXBpbGVyKQorICAgICAgICAgICAgYXJncyAnLS1nZW4nLCBnZW5lcmF0b3IKKyAgICAgICAgICAgIGFyZ3MgJy1vdXQnLCBvdXRwdXREaXIKKyAgICAgICAgICAgIGFyZ3MgdGhyaWZ0RmlsZQorICAgICAgICAgICAgc3RhbmRhcmRPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgZXJyb3JPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgaWdub3JlRXhpdFZhbHVlID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgVGhyaWZ0IGNvbXBpbGVyIG91dHB1dCBvbiBmYWlsdXJlcywgY3V0cyBkb3duIG9uIG5vaXNlIQorICAgICAgICAgICAgcHJpbnRsbiB0YXNrLm91dHB1dEJ1ZmZlci50b1N0cmluZygpCisgICAgICAgICAgICByZXN1bHQucmV0aHJvd0ZhaWx1cmUoKQorICAgICAgICB9CisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYWxsIHVuaXQgdGVzdCBUaHJpZnQgc291cmNlcycKKyAgICBjb21waWxlVGVzdEphdmEuZGVwZW5kc09uIGl0Cit9CisKK3Rhc2sgZ2VuZXJhdGVKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVGhyaWZ0VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhVHlwZXMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRGVidWdQcm90b1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdNYW55T3B0aW9uYWxzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFEZWVwQ29weVRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCcpCit9CisKK3Rhc2sgZ2VuZXJhdGVCZWFuSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFiZWFuIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhQmVhbnNUZXN0LnRocmlmdCcsICdqYXZhOmJlYW5zLG5vY2FtZWwnLCBnZW5CZWFuU3JjKQorfQorCit0YXNrIGdlbmVyYXRlUmV1c2VKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YXJldXNlIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdGdWxsQ2FtZWxUZXN0LnRocmlmdCcsICdqYXZhOmZ1bGxjYW1lbCcsIGdlbkZ1bGxDYW1lbFNyYykKK30KKwordGFzayBnZW5lcmF0ZUZ1bGxDYW1lbEphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1mdWxsY2FtZWwgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1JldXNlT2JqZWN0cy50aHJpZnQnLCAnamF2YTpyZXVzZS1vYmplY3RzJywgZ2VuUmV1c2VTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVVbnNhZmVCaW5hcmllc0phdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi11bnNhZmViaW5hcmllcyBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVW5zYWZlVHlwZXMudGhyaWZ0JywgJ2phdmE6dW5zYWZlX2JpbmFyaWVzJywgZ2VuVW5zYWZlU3JjKQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnN0YWxsYXRpb24gc3VidGFza3MsIG5vdCB1c2VkIGN1cnJlbnRseSwgd2UgdXNlICJtYWtlIGluc3RhbGwvZmFzdCIKK3Rhc2sgaW5zdGFsbERpc3QodHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJykgeworICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgVGhyaWZ0IEpBUiBhbmQgZGVwZW5kZW5jaWVzIGludG8gJGluc3RhbGxQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxQYXRoKQorCisgICAgZnJvbSBqYXIKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLmNvbXBpbGUKK30KKwordGFzayBpbnN0YWxsSmF2YWRvYyh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIFRocmlmdCBKYXZhRG9jIGludG8gJGluc3RhbGxKYXZhZG9jUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsSmF2YWRvY1BhdGgpCisKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworLy8gVGhpcyBpcyBub3QgbmVlZGVkIGJ5IEdyYWRsZSBidWlsZHMgYnV0IHRoZSByZW1haW5pbmcgQW50IGJ1aWxkcyBzZWVtIHRvCisvLyBuZWVkIGFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3NlcyBmb3IgVGhyaWZ0IHVuaXQgdGVzdHMgc28gd2UKKy8vIGFzc2lzdCB0aGVtIHRvIHVzZSBpdCB0aGlzIHdheS4KK3Rhc2sgY29weURlcGVuZGVuY2llcyh0eXBlOiBDb3B5LCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0NvcHkgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gYSBjb21tb24gbG9jYXRpb24gZm9yIG90aGVyIEFudCBiYXNlZCBwcm9qZWN0cycKKyAgICBwcm9qZWN0LmFzc2VtYmxlLmRlcGVuZHNPbiBpdAorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZGVwcyIpCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy50ZXN0UnVudGltZQorICAgIC8vIGV4Y2x1ZGUgc29tZSB2ZXJ5IHNwZWNpZmljIHVuaXQgdGVzdCBkZXBlbmRlbmNpZXMKKyAgICBleGNsdWRlICcqKi9qdW5pdCouamFyJywgJyoqL21vY2tpdG8qLmphcicsICcqKi9oYW1jcmVzdCouamFyJworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvdyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gaW5zdGFsbCBhbmQgdXBsb2FkQXJjaGl2ZXMgdGFza3MKK2RlZiBjb25maWd1cmVQb20ocG9tKSB7CisgICAgcG9tLnByb2plY3QgeworICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0JworICAgICAgICBkZXNjcmlwdGlvbiAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgIHBhY2thZ2luZyAnamFyJworICAgICAgICB1cmwgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKworICAgICAgICBzY20geworICAgICAgICAgICAgdXJsICdodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICB9CisKKyAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgbGljZW5zZSB7CisgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKKyAgICAgICAgICAgICAgICB1cmwgIiR7cHJvamVjdC5saWNlbnNlfSIKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgIGRldmVsb3BlciB7CisgICAgICAgICAgICAgICAgaWQgJ2RldicKKyAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnCisgICAgICAgICAgICAgICAgZW1haWwgJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvbS53aGVuQ29uZmlndXJlZCB7CisgICAgICAgIC8vIEZpeHVwIHRoZSBzY29wZSBmb3Igc2VydmxldC1hcGkgdG8gYmUgJ3Byb3ZpZGVkJyBpbnN0ZWFkIG9mICdjb21waWxlJworICAgICAgICBkZXBlbmRlbmNpZXMuZmluZCB7IGRlcCAtPiBkZXAuZ3JvdXBJZCA9PSAnamF2YXguc2VydmxldCcgJiYgZGVwLmFydGlmYWN0SWQgPT0gJ3NlcnZsZXQtYXBpJyB9LndpdGggeworICAgICAgICAgICAgLy8gaXQub3B0aW9uYWwgPSB0cnVlCisgICAgICAgICAgICBpdC5zY29wZSA9ICdwcm92aWRlZCcKKyAgICAgICAgfQorICAgIH0KK30KKworaW5zdGFsbCB7CisgICAgcmVwb3NpdG9yaWVzLm1hdmVuSW5zdGFsbGVyIHsKKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICBkZXBlbmRzT24gdGVzdCAvLyBtYWtlIHN1cmUgd2UgcnVuIHVuaXQgdGVzdHMgd2hlbiBwdWJsaXNoaW5nCisgICAgcmVwb3NpdG9yaWVzLm1hdmVuRGVwbG95ZXIgeworICAgICAgICAvLyBzaWduUG9tIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyB3aGVuIG5vIHNpZ25pbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+IHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KSB9CisgICAgICAgIHJlcG9zaXRvcnkodXJsOiBwcm9qZWN0Lm1hdmVuUmVwb3NpdG9yeVVybCkgeworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBtYXZlblVzZXIsIHBhc3N3b3JkOiBtYXZlblBhc3N3b3JkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCisvLyBTaWduaW5nIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsLCBvbmx5IHdoZW4gcmVsZWFzZSBhbmQgdXBsb2FkQXJjaGl2ZXMgaXMgYWN0aXZhdGVkCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7ICF2ZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNvdXJjZSBzZXRzIGZvciBtYWluIGFuZCB0ZXN0IHNvdXJjZXMKK3NvdXJjZVNldHMgeworICAgIG1haW4geworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAnc3JjJworICAgICAgICB9CisgICAgfQorICAgIHRlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIC8vIHNlZSBmdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGZvciB0aGVzZSBmaWxlcworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJ2xvZzRqLnByb3BlcnRpZXMnCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCitzb3VyY2VDb21wYXRpYmlsaXR5ID0gJzEuOCcKK3RhcmdldENvbXBhdGliaWxpdHkgPSAnMS44JworCit0YXNrcy53aXRoVHlwZShKYXZhQ29tcGlsZSkgeworICAgIG9wdGlvbnMuZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgb3B0aW9ucy5kZWJ1ZyA9IHRydWUKKyAgICBvcHRpb25zLmRlcHJlY2F0aW9uID0gdHJ1ZQorICAgIC8vIG9wdGlvbnMuY29tcGlsZXJBcmdzLmFkZEFsbCgnLVhsaW50OnVuY2hlY2tlZCcpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphciBwYWNrYWdpbmcgZGV0YWlscworcHJvY2Vzc1Jlc291cmNlcyB7CisgICAgaW50bygnTUVUQS1JTkYnKSB7CisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L0xJQ0VOU0UiCisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L05PVElDRSIKKyAgICAgICAgcmVuYW1lKCcoLispJywgJyQxLnR4dCcpCisgICAgfQorfQorCitqYXIgeworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGF0dHJpYnV0ZXMoWworICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIjogIjIiLAorICAgICAgICAgICAgIkJ1bmRsZS1TeW1ib2xpY05hbWUiOiAiJHtwcm9qZWN0Lmdyb3VwfSIsCisgICAgICAgICAgICAiQnVuZGxlLU5hbWUiOiAiQXBhY2hlIFRocmlmdCIsCisgICAgICAgICAgICAiQnVuZGxlLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtRGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJCdW5kbGUtTGljZW5zZSI6ICIke3Byb2plY3QubGljZW5zZX0iLAorICAgICAgICAgICAgIkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IjogImxhenkiLAorICAgICAgICAgICAgIkV4cG9ydC1QYWNrYWdlIjogIiR7cHJvamVjdC5ncm91cH0uYXN5bmM7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfSwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXI7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2tcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH07dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0uYXN5bmMsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ubWV0YV9kYXRhO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWU7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiIiwKKyAgICAgICAgICAgICJJbXBvcnQtUGFja2FnZSI6ICJqYXZheC5uZXQsamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VydmxldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5zZXJ2bGV0Lmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLnNsZjRqO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249XCJbMS40LDIpXCIsb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gQnVuZGxlIHRoZSB0ZXN0IGNsYXNzZXMgaW4gYSBKQVIgZm9yIG90aGVyIEFudCBiYXNlZCBidWlsZHMKK3Rhc2sgdGVzdEphcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzLicKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisKKyAgICBjbGFzc2lmaWVyICd0ZXN0JworICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0IHRlc3QgdGFza3MgYW5kIGNvbmZpZ3VyYXRpb25zCisKKy8vIEhlbHAgdGhlIHVwIHRvIGRhdGUgYWxnb3JpdGhtIHRvIG1ha2UgdGhlc2UgdGVzdHMgZG9uZQorZXh0Lm1hcmtUYXNrRG9uZSA9IHsgdGFzayAtPgorICAgIGRlZiBidWlsZEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvJHt0YXNrLm5hbWV9LmZsYWciKQorICAgIHRhc2suaW5wdXRzLmZpbGVzIHRhc2suY2xhc3NwYXRoCisgICAgdGFzay5vdXRwdXRzLmZpbGUgYnVpbGRGaWxlCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBidWlsZEZpbGUudGV4dCA9ICdQYXNzZWQhJworICAgIH0KK30KKwordGFzayBkZXByZWNhdGVkRXF1YWxpdHlUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKwordGFzayBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCisvLyBNYWluIFVuaXQgVGVzdCB0YXNrIGNvbmZpZ3VyYXRpb24KK3Rlc3QgeworICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIKKyAgICBkZXBlbmRzT24gZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCwgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QKKworICAgIC8vIEFsbG93IHJlcGVhdGluZyB0ZXN0cyBldmVuIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ3JlcnVuVGVzdHMnKSkgeworICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KKyAgICB9CisKKyAgICBpbmNsdWRlICcqKi9UZXN0Ki5jbGFzcycKKyAgICBleGNsdWRlICcqKi9UZXN0KlwkKi5jbGFzcycKKworICAgIG1heEhlYXBTaXplID0gJzUxMm0nCisgICAgZm9ya0V2ZXJ5ID0gMQorCisgICAgc3lzdGVtUHJvcGVydGllcyA9IFsKKyAgICAgICAgJ2J1aWxkLnRlc3QnOiAiJHtjb21waWxlVGVzdEphdmEuZGVzdGluYXRpb25EaXJ9IiwKKyAgICAgICAgJ3Rlc3QucG9ydCc6ICIke3Rlc3RQb3J0fSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly50cnVzdHN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8ua2V5c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuNC4xLWJpbi56aXAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcgYi9saWIvamF2YS9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9pdnkueG1sIGIvbGliL2phdmEvaXZ5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyZTUwZC4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9pdnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQotICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGl2eS1tb2R1bGUgdmVyc2lvbj0iMS4wIj4KLSAgICA8aW5mbyBvcmdhbmlzYXRpb249Im9yZy5hcGFjaGUudGhyaWZ0IiBtb2R1bGU9ImxpYnRocmlmdCIgcmV2aXNpb249IjAuMy4wLTIwMTAwMTE2IiA+Ci0gICAgICA8bGljZW5zZSBuYW1lPSJhcGFjaGUiIC8+Ci0gICAgICA8aXZ5YXV0aG9yIG5hbWU9IlRocmlmdCBUZWFtIiB1cmw9InRocmlmdC1kZXZAaW5jdWJhdG9yLmFwYWNoZS5vcmciIC8+Ci0gICAgICA8cmVwb3NpdG9yeSBuYW1lPSJhcGFjaGUgcmVwb3NpdG9yeSIgdXJsPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvdGhyaWZ0LyIgLz4KLSAgICAgIDxkZXNjcmlwdGlvbiBob21lcGFnZT0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3RocmlmdC8iIC8+Ci0gICAgPC9pbmZvPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuc2xmNGoiIG5hbWU9InNsZjRqLWFwaSIgcmV2PSIxLjUuOCIgY29uZj0iKiAtPiAqLCFzb3VyY2VzLCFqYXZhZG9jIi8+Ci0gICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuc2xmNGoiIG5hbWU9InNsZjRqLXNpbXBsZSIgcmV2PSIxLjUuOCIgY29uZj0iKiAtPiAqLCFzb3VyY2VzLCFqYXZhZG9jIi8+Ci0gICAgICAgPGRlcGVuZGVuY3kgb3JnPSJjb21tb25zLWxhbmciIG5hbWU9ImNvbW1vbnMtbGFuZyIgcmV2PSIyLjUiIGNvbmY9IiogLT4gKiwhc291cmNlcywhamF2YWRvYyIvPgotICAgICAgIDxkZXBlbmRlbmN5IG9yZz0ianVuaXQiIG5hbWU9Imp1bml0IiByZXY9IjQuNCIgY29uZj0iKiAtPiAqLCFzb3VyY2VzLCFqYXZhZG9jIi8+Ci0gICAgICAgPGRlcGVuZGVuY3kgb3JnPSJqYXZheC5zZXJ2bGV0IiBuYW1lPSJzZXJ2bGV0LWFwaSIgcmV2PSIyLjUiIGNvbmY9IiogLT4gKiwhc291cmNlcywhamF2YWRvYyIvPgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9pdnktbW9kdWxlPgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmQ4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCityb290UHJvamVjdC5uYW1lID0gJ2xpYnRocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzYzhkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIFQgZXh0ZW5kcyBUQmFzZSwgUj4geworICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lOworCisgICAgcHVibGljIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KEkgaWZhY2UsIFQgYXJncywgQXN5bmNNZXRob2RDYWxsYmFjazxSPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUIGdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQXN5bmNNZXRob2RDYWxsYmFjazxSPiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgaW50IHNlcWlkKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgVFNlcmlhbGl6YWJsZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIFRQcm90b2NvbCBvcHJvdCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgdHlwZSwgc2VxaWQpKTsKKyAgICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisKKyAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9FbmNvZGluZ1V0aWxzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciB1c2Ugd2hlbiBlbmNvZGluZy9kZWNvZGluZyByYXcgZGF0YSBhcyBieXRlIGFycmF5cy4KKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nVXRpbHMgeworCisgIC8qKgorICAgKiBFbmNvZGUgPGNvZGU+aW50ZWdlcjwvY29kZT4gYXMgYSBzZXJpZXMgb2YgNCBieXRlcyBpbnRvIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICogc3RhcnRpbmcgYXQgcG9zaXRpb24gMCB3aXRoaW4gdGhhdCBidWZmZXIuCisgICAqIAorICAgKiBAcGFyYW0gaW50ZWdlcgorICAgKiAgICAgICAgICBUaGUgaW50ZWdlciB0byBlbmNvZGUuCisgICAqIEBwYXJhbSBidWYKKyAgICogICAgICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSB0by4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBlbmNvZGVCaWdFbmRpYW4oZmluYWwgaW50IGludGVnZXIsIGZpbmFsIGJ5dGVbXSBidWYpIHsKKyAgICBlbmNvZGVCaWdFbmRpYW4oaW50ZWdlciwgYnVmLCAwKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGUgPGNvZGU+aW50ZWdlcjwvY29kZT4gYXMgYSBzZXJpZXMgb2YgNCBieXRlcyBpbnRvIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICogc3RhcnRpbmcgYXQgcG9zaXRpb24gPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICogCisgICAqIEBwYXJhbSBpbnRlZ2VyCisgICAqICAgICAgICAgIFRoZSBpbnRlZ2VyIHRvIGVuY29kZS4KKyAgICogQHBhcmFtIGJ1ZgorICAgKiAgICAgICAgICBUaGUgYnVmZmVyIHRvIHdyaXRlIHRvLgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqICAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgdGhlIGVuY29kaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGVuY29kZUJpZ0VuZGlhbihmaW5hbCBpbnQgaW50ZWdlciwgZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgeworICAgIGJ1ZltvZmZzZXRdID0gKGJ5dGUpICgweGZmICYgKGludGVnZXIgPj4gMjQpKTsKKyAgICBidWZbb2Zmc2V0ICsgMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoaW50ZWdlciA+PiAxNikpOworICAgIGJ1ZltvZmZzZXQgKyAyXSA9IChieXRlKSAoMHhmZiAmIChpbnRlZ2VyID4+IDgpKTsKKyAgICBidWZbb2Zmc2V0ICsgM10gPSAoYnl0ZSkgKDB4ZmYgJiAoaW50ZWdlcikpOworICB9CisKKyAgLyoqCisgICAqIERlY29kZSBhIHNlcmllcyBvZiA0IGJ5dGVzIGZyb20gPGNvZGU+YnVmPC9jb2RlPiwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMCwKKyAgICogYW5kIGludGVycHJldCB0aGVtIGFzIGFuIGludGVnZXIuCisgICAqIAorICAgKiBAcGFyYW0gYnVmCisgICAqICAgICAgICAgIFRoZSBidWZmZXIgdG8gcmVhZCBmcm9tLgorICAgKiBAcmV0dXJuIEFuIGludGVnZXIsIGFzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlQmlnRW5kaWFuKGZpbmFsIGJ5dGVbXSBidWYpIHsKKyAgICByZXR1cm4gZGVjb2RlQmlnRW5kaWFuKGJ1ZiwgMCk7CisgIH0KKworICAvKioKKyAgICogRGVjb2RlIGEgc2VyaWVzIG9mIDQgYnl0ZXMgZnJvbSA8Y29kZT5idWY8L2NvZGU+LCBzdGFydCBhdAorICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+LCBhbmQgaW50ZXJwcmV0IHRoZW0gYXMgYW4gaW50ZWdlci4KKyAgICogCisgICAqIEBwYXJhbSBidWYKKyAgICogICAgICAgICAgVGhlIGJ1ZmZlciB0byByZWFkIGZyb20uCisgICAqIEBwYXJhbSBvZmZzZXQKKyAgICogICAgICAgICAgVGhlIG9mZnNldCB3aXRoIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgdGhlIGRlY29kaW5nLgorICAgKiBAcmV0dXJuIEFuIGludGVnZXIsIGFzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlQmlnRW5kaWFuKGZpbmFsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKKyAgICByZXR1cm4gKChidWZbb2Zmc2V0XSAmIDB4ZmYpIDw8IDI0KSB8ICgoYnVmW29mZnNldCArIDFdICYgMHhmZikgPDwgMTYpCisgICAgICAgIHwgKChidWZbb2Zmc2V0ICsgMl0gJiAweGZmKSA8PCA4KSB8ICgoYnVmW29mZnNldCArIDNdICYgMHhmZikpOworICB9CisKKyAgLyoqCisgICAqIEJpdGZpZWxkIHV0aWxpdGllcy4KKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiaXQgYXQgcG9zaXRpb24gaXMgc2V0IGluIHYuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGVzdEJpdChieXRlIHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiB0ZXN0Qml0KChpbnQpdiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHRlc3RCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGVzdEJpdChpbnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuICh2ICYgKDEgPDwgcG9zaXRpb24pKSAhPSAwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQobG9uZyB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gKHYgJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwTDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHYsIHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBzZXQgdG8gemVyby4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBjbGVhckJpdChieXRlIHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAoYnl0ZSljbGVhckJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgY2xlYXJCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIChzaG9ydCljbGVhckJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsZWFyQml0KGludCB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdiAmIH4oMSA8PCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2xlYXJCaXQobG9uZyB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdiAmIH4oMUwgPDwgcG9zaXRpb24pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdiwgd2l0aCB0aGUgYml0IGF0IHBvc2l0aW9uIHNldCB0byAxIG9yIDAgZGVwZW5kaW5nIG9uIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIHNldEJpdChieXRlIHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIHJldHVybiAoYnl0ZSlzZXRCaXQoKGludCl2LCBwb3NpdGlvbiwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBzZXRCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgcmV0dXJuIChzaG9ydClzZXRCaXQoKGludCl2LCBwb3NpdGlvbiwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2V0Qml0KGludCB2LCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZih2YWx1ZSkKKyAgICAgIHJldHVybiB2IHwgKDEgPDwgcG9zaXRpb24pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBjbGVhckJpdCh2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2V0Qml0KGxvbmcgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgaWYodmFsdWUpCisgICAgICByZXR1cm4gdiB8ICgxTCA8PCBwb3NpdGlvbik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGNsZWFyQml0KHYsIHBvc2l0aW9uKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2QzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3B0aW9uIHR5cGUgcGF0dGVybgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3B0aW9uPFQ+IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3B0aW9uIE5PTkUgPSBuZXcgTm9uZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgT3B0aW9uIGlzIGRlZmluZWQgb3Igbm90CisgICAgICogQHJldHVybgorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgT3B0aW9uIGlzIGRlZmluZWQgKG9mIHR5cGUgU29tZSkKKyAgICAgKiAgICAgICAgIGZhbHNlIGlmIHRoZSBPcHRpb24gaXMgbm90IGRlZmluZWQgKG9mIHR5cGUgTm9uZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmluZWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIE9wdGlvbiAoaWYgaXQgaXMgZGVmaW5lZCkKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGNhbGxlZCBvbiBhIE5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVCBnZXQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGFpbmVkIHZhbHVlIChpZiBkZWZpbmVkKSBvciBlbHNlIHJldHVybiBhIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBAcGFyYW0gb3RoZXIgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkIChhIE5vbmUpCisgICAgICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlLCBvciBvdGhlciBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVCBvcihUIG90aGVyKSB7CisgICAgICAgIGlmIChpc0RlZmluZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG90aGVyOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBOb25lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBhYnNlbnQgdmFsdWUgKGluc3RlYWQgb2YgIm51bGwiKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIGdldCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBjYWxsIGdldCgpIG9uIE5vbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk5vbmUiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFNvbWUgdHlwZSwgcmVwcmVzZW50aW5nIGFuIGV4aXN0ZW5jZSBvZiBzb21lIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU29tZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKyAgICAgICAgcHVibGljIFNvbWUoVCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZpbmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJTb21lKCIgKyB2YWx1ZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBzIHZhbHVlIGluIGFuIE9wdGlvbiB0eXBlLCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdmFsdWUgaXMgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB2YWx1ZQorICAgICAqIEByZXR1cm4gU29tZSh2YWx1ZSkgaWYgdmFsdWUgaXMgbm90IG51bGwsIE5vbmUgaWYgdmFsdWUgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbjxUPiBmcm9tTnVsbGFibGUoVCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNvbWUodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5vbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgdmFsdWUgaW4gYSBTb21lIHR5cGUgKE5CISB2YWx1ZSBtdXN0IG5vdCBiZSBudWxsISkKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNvbWUodmFsdWUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU29tZTxUPiBzb21lKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBOb25lPFQ+IG5vbmUoKSB7CisgICAgICAgIHJldHVybiAoTm9uZTxUPikgTk9ORTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjEzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlPiB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3NGdW5jdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyBQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICB9CisKKyAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBJIGlmYWNlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVCBhcmdzID0gZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKyAgICB0cnkgeworICAgICAgYXJncy5yZWFkKGlwcm90KTsKKyAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeworICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7CisgICAgICB4LndyaXRlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBUU2VyaWFsaXphYmxlIHJlc3VsdCA9IG51bGw7CisgICAgYnl0ZSBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZOworCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICB0aHJvdyBleDsKKyAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgYXBwbGljYXRpb24gZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICByZXN1bHQgPSBleDsKKyAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIGlmKHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgICB9CisgICAgfQorCisgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIG1zZ1R5cGUsIHNlcWlkKSk7CisgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT25ld2F5KCkpIHsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsKKyAgICAgIHgud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCl7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKKworICBwdWJsaWMgYWJzdHJhY3QgVEJhc2UgZ2V0UmVzdWx0KEkgaWZhY2UsIFQgYXJncykgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3ZDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi0vKioKLSAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcwotICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydFN0YWNrIHsKLQotICBwcml2YXRlIHNob3J0W10gdmVjdG9yOwotICBwcml2YXRlIGludCB0b3AgPSAtMTsKLQotICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcG9wKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wLS1dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKLSAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3AgKyAxKSB7Ci0gICAgICBncm93KCk7Ci0gICAgfQotICAgIHZlY3RvclsrK3RvcF0gPSBwdXNoZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICBzaG9ydFtdIG5ld1ZlY3RvciA9IG5ldyBzaG9ydFt2ZWN0b3IubGVuZ3RoICogMl07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh2ZWN0b3IsIDAsIG5ld1ZlY3RvciwgMCwgdmVjdG9yLmxlbmd0aCk7Ci0gICAgdmVjdG9yID0gbmV3VmVjdG9yOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBlZWsoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3BdOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgdG9wID0gLTE7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIj4+Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNiLmFwcGVuZCh2ZWN0b3JbaV0pOwotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8PCIpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoIl0+Iik7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQppbmRleCBjMjk0ZmMzLi40ZDY5M2Q5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgVFNlcmlhbGl6YWJsZSB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkIE1FU1NBR0VfRklFTEQgPSBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CkBAIC00NSw4ICs0NSwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1JFU1VMVCA9IDU7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SID0gNjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlXyA9IG51bGw7CiAKICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKICAgICBzdXBlcigpOwpAQCAtNzAsNyArNzQsMTggQEAKICAgICByZXR1cm4gdHlwZV87CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmIChtZXNzYWdlXyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIFRGaWVsZCBmaWVsZDsKICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKIApAQCAtODMsMzIgKzk4LDQzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgc3dpdGNoIChmaWVsZC5pZCkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgdHlwZV8gPSB0eXBlOworICAgIG1lc3NhZ2VfID0gbWVzc2FnZTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAvKioKKyAgICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBnaXZlbiBhIFRQcm90b2NvbCBpbnB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZEZyb20oVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICByZXN1bHQucmVhZChpcHJvdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOwogICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2U3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yIHsKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIGZiLnJlc3BvbnNlUmVhZHkoKSBvbmNlIHByb2Nlc3NpbmcgaXMgY29tcGxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIpIHRocm93cyBURXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQppbmRleCA2NDU5MTEzLi5lMTQ4OWQ1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQpAQCAtMjcsMjkgKzI3LDEyIEBACiAgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCiAgKgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRCYXNlPFQgZXh0ZW5kcyBUQmFzZSwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgU2VyaWFsaXphYmxlIHsKK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFRTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZSB7CiAKICAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICogR2V0IHRoZSBGIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGRJZC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LgotICAgKgotICAgKiBAcGFyYW0gZmllbGRJZCBUaGUgZmllbGQncyBpZCB0YWcgYXMgZm91bmQgaW4gdGhlIElETC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0KGludCBmaWVsZElkKTsKKyAgcHVibGljIEYgZmllbGRGb3JJZChpbnQgZmllbGRJZCk7CiAKICAgLyoqCiAgICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KQEAgLTU5LDE2ICs0Miw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGQpOwogCiAgIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGlkLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZSAKLSAgICogYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KLSAgICoKLSAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQpOwotCi0gIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIAorICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluCiAgICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgogICAgKgogICAgKiBAcGFyYW0gZmllbGQKQEAgLTc2LDE1ICs1MCw2IEBACiAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShGIGZpZWxkKTsKIAogICAvKioKLSAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUgCi0gICAqIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCwgT2JqZWN0IHZhbHVlKTsKLQotICAvKioKICAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBmaWVsZCB2YXJpYWJsZS4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbgogICAgKiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0IHdyYXBwZXIgdHlwZS4KICAgICoKQEAgLTkyLDcgKzU3LDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKIAotICBwdWJsaWMgVEJhc2U8VCwgRj4gZGVlcENvcHkoKTsKKyAgcHVibGljIFQgZGVlcENvcHkoKTsKIAogICAvKioKICAgICogUmV0dXJuIHRvIHRoZSBzdGF0ZSBvZiBoYXZpbmcganVzdCBiZWVuIGluaXRpYWxpemVkLCBhcyB0aG91Z2ggeW91IGhhZCBqdXN0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIxODI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVEJhc2VBc3luY1Byb2Nlc3NvcjxJPiBpbXBsZW1lbnRzIFRBc3luY1Byb2Nlc3NvciwgVFByb2Nlc3NvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICBmaW5hbCBJIGlmYWNlOworICAgIGZpbmFsIE1hcDxTdHJpbmcsQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlLD8+PiBwcm9jZXNzTWFwOworCisgICAgcHVibGljIFRCYXNlQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlLD8+PiBwcm9jZXNzTWFwKSB7CisgICAgICAgIHRoaXMuaWZhY2UgPSBpZmFjZTsKKyAgICAgICAgdGhpcy5wcm9jZXNzTWFwID0gcHJvY2Vzc01hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZyxBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IGdldFByb2Nlc3NNYXBWaWV3KCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByb2Nlc3NNYXApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYikgdGhyb3dzIFRFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFRQcm90b2NvbCBpbiA9IGZiLmdldElucHV0UHJvdG9jb2woKTsKKyAgICAgICAgZmluYWwgVFByb3RvY29sIG91dCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CisKKyAgICAgICAgLy9GaW5kIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAgICAgICAgZmluYWwgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBBc3luY1Byb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXAuZ2V0KG1zZy5uYW1lKTsKKyAgICAgICAgaWYgKGZuID09IG51bGwpIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpbiwgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgIkludmFsaWQgbWV0aG9kIG5hbWU6ICciICsgbXNnLm5hbWUgKyAiJyIpOworICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJJbnZhbGlkIG1ldGhvZCBuYW1lIiwgeCk7CisKKyAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgaXQgaXMgYSB0d28td2F5IHJlcXVlc3QsIHNvIHdlIGNhbiBzZW5kIGEgcmVwbHkKKyAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCkgeworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgICAgeC53cml0ZShvdXQpOworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvL0dldCBBcmdzCisgICAgICAgIFRCYXNlIGFyZ3MgPSBmbi5nZXRFbXB0eUFyZ3NJbnN0YW5jZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcmdzLnJlYWQoaW4pOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkNvdWxkIG5vdCByZXRyaWV2ZSBmdW5jdGlvbiBhcmd1bWVudHMiLCB4KTsKKworICAgICAgICAgICAgaWYgKCFmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIGlmIChmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICB9CisKKyAgICAgICAgLy9zdGFydCBvZmYgcHJvY2Vzc2luZyBmdW5jdGlvbgorICAgICAgICBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIgPSBmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLCBtc2cuc2VxaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOworICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQppbmRleCA5YTdlZTczLi42ZjZjNmViIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0yNCwxMSArMjUsMTUgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKLXB1YmxpYyBjbGFzcyBUQmFzZUhlbHBlciB7CitwdWJsaWMgZmluYWwgY2xhc3MgVEJhc2VIZWxwZXIgeworCisgIHByaXZhdGUgVEJhc2VIZWxwZXIoKXt9CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IoKTsKIApAQCAtNDksNTcgKzU0LDI3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGEpLmNvbXBhcmVUbyhiKTsKKyAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGUgYSwgYnl0ZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gQnl0ZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKHNob3J0IGEsIHNob3J0IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBTaG9ydC5jb21wYXJlKGEsYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oaW50IGEsIGludCBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGxvbmcgYSwgbG9uZyBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gTG9uZy5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGRvdWJsZSBhLCBkb3VibGUgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBhLCBTdHJpbmcgYikgewpAQCAtMTA3LDE3ICs4MiwxNiBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgewotICAgIGludCBzaXplQ29tcGFyZSA9IGNvbXBhcmVUbyhhLmxlbmd0aCwgYi5sZW5ndGgpOwotICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7Ci0gICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGJ5dGVDb21wYXJlID0gY29tcGFyZVRvKGFbaV0sIGJbaV0pOwotICAgICAgaWYgKGJ5dGVDb21wYXJlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7CisgICAgICAgIGlmIChjb21wYXJlICE9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDb21wYXJhYmxlIGEsIENvbXBhcmFibGUgYikgewpAQCAtMTI1LDQxICs5OSwzOSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoYS5nZXQoaSksIGIuZ2V0KGkpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFNldCBhLCBTZXQgYikgewotICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOwotICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7Ci0gICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247Ci0gICAgfQotICAgIFNvcnRlZFNldCBzb3J0ZWRBID0gbmV3IFRyZWVTZXQoY29tcGFyYXRvcik7Ci0gICAgc29ydGVkQS5hZGRBbGwoYSk7Ci0gICAgU29ydGVkU2V0IHNvcnRlZEIgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRCLmFkZEFsbChiKTsKKyAgICBpbnQgY29tcGFyZSA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRBID0gbmV3IEFycmF5TGlzdChhKTsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRCID0gbmV3IEFycmF5TGlzdChiKTsKIAotICAgIEl0ZXJhdG9yIGl0ZXJBID0gc29ydGVkQS5pdGVyYXRvcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBLCBjb21wYXJhdG9yKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQiwgY29tcGFyYXRvcik7CiAKLSAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KLSAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgewotICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7CisgICAgICBJdGVyYXRvciBpdGVyQiA9IHNvcnRlZEIuaXRlcmF0b3IoKTsKKworICAgICAgLy8gQ29tcGFyZSBlYWNoIGl0ZW0uCisgICAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgeworICAgICAgICBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlKGl0ZXJBLm5leHQoKSwgaXRlckIubmV4dCgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTWFwIGEsIE1hcCBiKSB7CkBAIC0xOTYsNyArMTY4LDcgQEAKICAgLyoqCiAgICAqIENvbXBhcmF0b3IgdG8gY29tcGFyZSBpdGVtcyBpbnNpZGUgYSBzdHJ1Y3R1cmUgKGUuZy4gYSBsaXN0LCBzZXQsIG9yIG1hcCkuCiAgICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRTdHJ1Y3R1cmVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUgewogICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb0EsIE9iamVjdCBvQikgewogICAgICAgaWYgKG9BID09IG51bGwgJiYgb0IgPT0gbnVsbCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTIxOCwxNSArMTkwLDM1IEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gYmJzLCBTdHJpbmdCdWlsZGVyIHNiKSB7CisgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gaXQgPSBiYnMuaXRlcmF0b3IoKTsKKyAgICBpZiAoIWl0Lmhhc05leHQoKSkgeworICAgICAgc2IuYXBwZW5kKCJbXSIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQoIlsiKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBpdC5uZXh0KCk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b1N0cmluZyhCeXRlQnVmZmVyIGJiLCBTdHJpbmdCdWlsZGVyIHNiKSB7CiAgICAgYnl0ZVtdIGJ1ZiA9IGJiLmFycmF5KCk7CiAKICAgICBpbnQgYXJyYXlPZmZzZXQgPSBiYi5hcnJheU9mZnNldCgpOwotICAgIGludCBvcmlnTGltaXQgPSBiYi5saW1pdCgpOwotICAgIGludCBsaW1pdCA9IChvcmlnTGltaXQgLSBhcnJheU9mZnNldCA+IDEyOCkgPyBhcnJheU9mZnNldCArIDEyOCA6IG9yaWdMaW1pdDsKKyAgICBpbnQgb2Zmc2V0ID0gYXJyYXlPZmZzZXQgKyBiYi5wb3NpdGlvbigpOworICAgIGludCBvcmlnTGltaXQgPSBhcnJheU9mZnNldCArIGJiLmxpbWl0KCk7CisgICAgaW50IGxpbWl0ID0gKG9yaWdMaW1pdCAtIG9mZnNldCA+IDEyOCkgPyBvZmZzZXQgKyAxMjggOiBvcmlnTGltaXQ7CiAKLSAgICBmb3IgKGludCBpID0gYXJyYXlPZmZzZXQ7IGkgPCBsaW1pdDsgaSsrKSB7Ci0gICAgICBpZiAoaSA+IGFycmF5T2Zmc2V0KSB7CisgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxpbWl0OyBpKyspIHsKKyAgICAgIGlmIChpID4gb2Zmc2V0KSB7CiAgICAgICAgIHNiLmFwcGVuZCgiICIpOwogICAgICAgfQogICAgICAgc2IuYXBwZW5kKHBhZGRlZEJ5dGVTdHJpbmcoYnVmW2ldKSk7CkBAIC0yNDAsNCArMjMyLDY2IEBACiAgICAgaW50IGV4dGVuZGVkID0gKGIgfCAweDEwMCkgJiAweDFmZjsKICAgICByZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyhleHRlbmRlZCkudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMSk7CiAgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlQnVmZmVyVG9CeXRlQXJyYXkoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgaWYgKHdyYXBzRnVsbEFycmF5KGJ5dGVCdWZmZXIpKSB7CisgICAgICByZXR1cm4gYnl0ZUJ1ZmZlci5hcnJheSgpOworICAgIH0KKyAgICBieXRlW10gdGFyZ2V0ID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgYnl0ZUJ1ZmZlclRvQnl0ZUFycmF5KGJ5dGVCdWZmZXIsIHRhcmdldCwgMCk7CisgICAgcmV0dXJuIHRhcmdldDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cmFwc0Z1bGxBcnJheShCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5oYXNBcnJheSgpCisgICAgICAmJiBieXRlQnVmZmVyLnBvc2l0aW9uKCkgPT0gMAorICAgICAgJiYgYnl0ZUJ1ZmZlci5hcnJheU9mZnNldCgpID09IDAKKyAgICAgICYmIGJ5dGVCdWZmZXIucmVtYWluaW5nKCkgPT0gYnl0ZUJ1ZmZlci5jYXBhY2l0eSgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZUJ1ZmZlclRvQnl0ZUFycmF5KEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciwgYnl0ZVtdIHRhcmdldCwgaW50IG9mZnNldCkgeworICAgIGludCByZW1haW5pbmcgPSBieXRlQnVmZmVyLnJlbWFpbmluZygpOworICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZUJ1ZmZlci5hcnJheSgpLAorICAgICAgICBieXRlQnVmZmVyLmFycmF5T2Zmc2V0KCkgKyBieXRlQnVmZmVyLnBvc2l0aW9uKCksCisgICAgICAgIHRhcmdldCwKKyAgICAgICAgb2Zmc2V0LAorICAgICAgICByZW1haW5pbmcpOworICAgIHJldHVybiByZW1haW5pbmc7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgcmlnaHRTaXplKEJ5dGVCdWZmZXIgaW4pIHsKKyAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmICh3cmFwc0Z1bGxBcnJheShpbikpIHsKKyAgICAgIHJldHVybiBpbjsKKyAgICB9CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChieXRlQnVmZmVyVG9CeXRlQXJyYXkoaW4pKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBjb3B5QmluYXJ5KGZpbmFsIEJ5dGVCdWZmZXIgb3JpZykgeworICAgIGlmIChvcmlnID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBCeXRlQnVmZmVyIGNvcHkgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbb3JpZy5yZW1haW5pbmcoKV0pOworICAgIGlmIChvcmlnLmhhc0FycmF5KCkpIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZy5hcnJheSgpLCBvcmlnLmFycmF5T2Zmc2V0KCkgKyBvcmlnLnBvc2l0aW9uKCksIGNvcHkuYXJyYXkoKSwgMCwgb3JpZy5yZW1haW5pbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG9yaWcuc2xpY2UoKS5nZXQoY29weS5hcnJheSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29weTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvcHlCaW5hcnkoZmluYWwgYnl0ZVtdIG9yaWcpIHsKKyAgICByZXR1cm4gKG9yaWcgPT0gbnVsbCkgPyBudWxsIDogQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExvbmcuaGFzaENvZGUodmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIERvdWJsZS5oYXNoQ29kZSh2YWx1ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhOWE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgVFByb2Nlc3NvciB7CisgIHByaXZhdGUgZmluYWwgSSBpZmFjZTsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2U+PiBwcm9jZXNzTWFwOworCisgIHByb3RlY3RlZCBUQmFzZVByb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCBQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlPj4gcHJvY2Vzc0Z1bmN0aW9uTWFwKSB7CisgICAgdGhpcy5pZmFjZSA9IGlmYWNlOworICAgIHRoaXMucHJvY2Vzc01hcCA9IHByb2Nlc3NGdW5jdGlvbk1hcDsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2U+PiBnZXRQcm9jZXNzTWFwVmlldygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByb2Nlc3NNYXApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIFByb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXAuZ2V0KG1zZy5uYW1lKTsKKyAgICBpZiAoZm4gPT0gbnVsbCkgeworICAgICAgVFByb3RvY29sVXRpbC5za2lwKGluLCBUVHlwZS5TVFJVQ1QpOworICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIittc2cubmFtZSsiJyIpOworICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICB4LndyaXRlKG91dCk7CisgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBmbi5wcm9jZXNzKG1zZy5zZXFpZCwgaW4sIG91dCwgaWZhY2UpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQppbmRleCA5ZWQ4M2MwLi4zYTJkNTZjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogQ2xhc3MgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZiB3aXRob3V0IGRvaW5nIGRlZXAKQEAgLTI3LDE5ICsyOCwzNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworCisgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxTaXplOworCiAgIHB1YmxpYyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCBzaXplKSB7CiAgICAgc3VwZXIoc2l6ZSk7CisgICAgdGhpcy5pbml0aWFsU2l6ZSA9IHNpemU7CiAgIH0KIAogICBwdWJsaWMgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIHsKLSAgICBzdXBlcigpOworICAgIHRoaXMoMzIpOwogICB9CiAKICAgcHVibGljIGJ5dGVbXSBnZXQoKSB7CiAgICAgcmV0dXJuIGJ1ZjsKICAgfQogCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIHN1cGVyLnJlc2V0KCk7CisgICAgaWYgKGJ1Zi5sZW5ndGggPiBpbml0aWFsU2l6ZSkgeworICAgICAgYnVmID0gbmV3IGJ5dGVbaW5pdGlhbFNpemVdOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyBpbnQgbGVuKCkgewogICAgIHJldHVybiBjb3VudDsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCwgY2hhcnNldCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCmluZGV4IGRiZWZjZDguLmQxZDM5NjYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQpAQCAtNjQsMTAgKzY0LDIzIEBACiAgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgdG8gcmVhZCBmcm9tCiAgICAqLwogICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShUQmFzZSBiYXNlLCBieXRlW10gYnl0ZXMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGRlc2VyaWFsaXplKGJhc2UsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGZyb20gYSBieXRlIGFycmF5LgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHJlYWQgaW50bworICAgKiBAcGFyYW0gYnl0ZXMgVGhlIGFycmF5IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB7QGNvZGUgYnl0ZXN9CisgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCB0byByZWFkIGZyb20ge0Bjb2RlIGJ5dGVzfQorICAgKi8KKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoVEJhc2UgYmFzZSwgYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKLSAgICAgIHRyYW5zXy5yZXNldChieXRlcyk7CisgICAgICB0cmFuc18ucmVzZXQoYnl0ZXMsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgIGJhc2UucmVhZChwcm90b2NvbF8pOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQpAQCAtMTA4LDYgKzEyMSw3IEBACiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGUpOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQpAQCAtMjI4LDYgKzI0Miw3IEBACiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGUpOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQpAQCAtMjM2LDU0ICsyNTEsMzggQEAKICAgICB0cnkgewogICAgICAgVEZpZWxkIGZpZWxkID0gbG9jYXRlRmllbGQoYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CiAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGlzIHJlYWNoZWQsIGlwcm90IHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkLgotICAgICAgICBzd2l0Y2godHR5cGUpeworICAgICAgICBpZiAodHR5cGUgPT0gZmllbGQudHlwZSkgeworICAgICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZgorICAgICAgICAgIC8vIHRoZSBmaWVsZAorICAgICAgICAgIHN3aXRjaCAodHR5cGUpIHsKICAgICAgICAgICBjYXNlIFRUeXBlLkJPT0w6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKXsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQm9vbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQllURSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMTYpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkxNigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMzIoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkk2NCkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwMDogLy8gaGFjayB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQorICAgICAgICBpZiAodHR5cGUgPT0gMTAwICYmIGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQmluYXJ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBudWxsOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihlKTsKICAgICB9IGZpbmFsbHkgeworICAgICAgdHJhbnNfLmNsZWFyKCk7CiAgICAgICBwcm90b2NvbF8ucmVzZXQoKTsKICAgICB9CiAgIH0KQEAgLTI5MSwxMSArMjkwLDkgQEAKICAgcHJpdmF0ZSBURmllbGQgbG9jYXRlRmllbGQoYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB0cmFuc18ucmVzZXQoYnl0ZXMpOwogCi0gICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGg9IG5ldyBURmllbGRJZEVudW1bZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCArIDFdOworICAgIFRGaWVsZElkRW51bVtdIGZpZWxkSWRQYXRoID0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CiAgICAgZmllbGRJZFBhdGhbMF0gPSBmaWVsZElkUGF0aEZpcnN0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRJZFBhdGhSZXN0Lmxlbmd0aDsgaSsrKXsKLSAgICAgIGZpZWxkSWRQYXRoW2kgKyAxXSA9IGZpZWxkSWRQYXRoUmVzdFtpXTsKLSAgICB9CisgICAgU3lzdGVtLmFycmF5Y29weShmaWVsZElkUGF0aFJlc3QsIDAsIGZpZWxkSWRQYXRoLCAxLCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoKTsKIAogICAgIC8vIGluZGV4IGludG8gZmllbGQgSUQgcGF0aCBiZWluZyBjdXJyZW50bHkgc2VhcmNoZWQgZm9yCiAgICAgaW50IGN1clBhdGhJbmRleCA9IDA7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzc3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBURW51bQorICovCitwdWJsaWMgY2xhc3MgVEVudW1IZWxwZXIgeworCisgIC8qKgorICAgKiBHaXZlbiBhIFRFbnVtIGNsYXNzIGFuZCBpbnRlZ2VyIHZhbHVlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgorICAgKiB0aGUgYXNzb2NpYXRlZCBjb25zdGFudCBmcm9tIHRoZSBnaXZlbiBURW51bSBjbGFzcy4KKyAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBtb2RpZmllZCBzaG91bGQgdGhlIG5hbWUgb2YgdGhlICdmaW5kQnlWYWx1ZScgbWV0aG9kCisgICAqIGNoYW5nZS4KKyAgICoKKyAgICogQHBhcmFtIGVudW1DbGFzcyBURW51bSBmcm9tIHdoaWNoIHRvIHJldHVybiBhIG1hdGNoaW5nIGNvbnN0YW50LgorICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgY29uc3RhbnQuCisgICAqCisgICAqIEByZXR1cm4gVGhlIGNvbnN0YW50IGluICdlbnVtQ2xhc3MnIHdob3NlIHZhbHVlIGlzICd2YWx1ZScgb3IgbnVsbCBpZgorICAgKiAgICAgICAgIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBURW51bSBnZXRCeVZhbHVlKENsYXNzPD8gZXh0ZW5kcyBURW51bT4gZW51bUNsYXNzLCBpbnQgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IGVudW1DbGFzcy5nZXRNZXRob2QoImZpbmRCeVZhbHVlIiwgaW50LmNsYXNzKTsKKyAgICAgIHJldHVybiAoVEVudW0pIG1ldGhvZC5pbnZva2UobnVsbCwgdmFsdWUpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSA8Y29kZT5UUHJvY2Vzc29yPC9jb2RlPiBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFRQcm9jZXNzb3I+IFNFUlZJQ0VfUFJPQ0VTU09SX01BUAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIFRQcm9jZXNzb3IgZGVmYXVsdFByb2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclByb2Nlc3NvcihTdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgICAgIFNFUlZJQ0VfUFJPQ0VTU09SX01BUC5wdXQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEZWZhdWx0KFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgICAgIGRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAqCisgICAgICogPG9sPgorICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgorICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCisgICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4gIFlvdSBjYWxsZWQge0BsaW5rICNyZWdpc3RlclByb2Nlc3NvcihTdHJpbmcsIFRQcm9jZXNzb3IpIHJlZ2lzdGVyUHJvY2Vzc29yfQorICAgICAqIGR1cmluZyBpbml0aWFsaXphdGlvbiwgcmlnaHQ/IDopCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMICYmIG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICBpZiAoZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbWVzc2FnZSksIG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBtZXNzYWdlLm5hbWUgKyAiLiAgRGlkIHlvdSAiICsKKyAgICAgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICBUUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvciA9IFNFUlZJQ0VfUFJPQ0VTU09SX01BUC5nZXQoc2VydmljZU5hbWUpOworICAgICAgICBpZiAoYWN0dWFsUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAgRGlkIHlvdSBmb3JnZXQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgVE1lc3NhZ2Ugc3RhbmRhcmRNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoc2VydmljZU5hbWUubGVuZ3RoKCkrVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZAorICAgICAgICApOworCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgICAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKyAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luOworICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKSB7CisgICAgICAgICAgICBzdXBlcihwcm90b2NvbCk7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUJlZ2luOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJkOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpAQCAtMCwwICsxLDM5OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgdXNlcyBhIHNpbmdsZSB0aHJlYWQgdG8gc2V0IHVwIG5vbi1ibG9ja2luZyBzb2NrZXRzIHRvIGEgc2V0CisgKiBvZiByZW1vdGUgc2VydmVycyAoaG9zdG5hbWUgYW5kIHBvcnQgcGFpcnMpLCBhbmQgc2VuZHMgYSBzYW1lIHJlcXVlc3QgdG8KKyAqIGFsbCB0aGVzZSBzZXJ2ZXJzLiBJdCB0aGVuIGZldGNoZXMgcmVzcG9uc2VzIGZyb20gc2VydmVycy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBpbnQgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyIC0gYW4gdXBwZXIgbGltaXQgZm9yIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAqIHBlciBzZXJ2ZXIgKGluIGJ5dGUpLiBJZiBhIHJlc3BvbnNlIGZyb20gYSBzZXJ2ZXIgZXhjZWVkcyB0aGlzIGxpbWl0LCB0aGUKKyAqIGNsaWVudCB3aWxsIG5vdCBhbGxvY2F0ZSBtZW1vcnkgb3IgcmVhZCByZXNwb25zZSBkYXRhIGZvciBpdC4KKyAqCisgKiAgIGludCBmZXRjaFRpbWVvdXRTZWNvbmRzIC0gdGltZSBsaW1pdCBmb3IgZmV0Y2hpbmcgcmVzcG9uc2VzIGZyb20gYWxsCisgKiBzZXJ2ZXJzIChpbiBzZWNvbmQpLiBBZnRlciB0aGUgdGltZW91dCwgdGhlIGZldGNoIGpvYiBpcyBzdG9wcGVkIGFuZAorICogYXZhaWxhYmxlIHJlc3BvbnNlcyBhcmUgcmV0dXJuZWQuCisgKgorICogICBCeXRlQnVmZmVyIHJlcXVlc3RCdWYgLSByZXF1ZXN0IG1lc3NhZ2UgdGhhdCBpcyBzZW50IHRvIGFsbCBzZXJ2ZXJzLgorICoKKyAqIE91dHB1dDoKKyAqICAgUmVzcG9uc2VzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgb2YgQnl0ZUJ1ZmZlcnMuIEluZGV4IG9mIGVsZW1lbnRzIGluCisgKiB0aGlzIGFycmF5IGNvcnJlc3BvbmRzIHRvIGluZGV4IG9mIHNlcnZlcnMgaW4gdGhlIHNlcnZlciBsaXN0LiBDb250ZW50IGluCisgKiBhIEJ5dGVCdWZmZXIgbWF5IGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorICogICAxLiBGaXJzdCA0IGJ5dGVzIGZvcm0gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSwKKyAqIHRoZW4gZm9sbG93ZWQgYnkgdGhlIGRhdGEuCisgKiAgIDIuIEZpcnN0IDQgYnl0ZXMgZm9ybSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgbGVuZ3RoIG9mIGZvbGxvd2luZyBkYXRhLAorICogdGhlbiBmb2xsb3dlZCBieSBub3RoaW5nIC0gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHJlc3BvbnNlIGRhdGEgc2l6ZQorICogZXhjZWVkcyBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIsIGFuZCB0aGUgY2xpZW50IHdpbGwgbm90IHJlYWQgYW55CisgKiByZXNwb25zZSBkYXRhLgorICogICAzLiBObyBkYXRhIGluIHRoZSBCeXRlQnVmZmVyIC0gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdAorICogcmV0dXJuIGFueSByZXNwb25zZSB3aXRoaW4gZmV0Y2hUaW1lb3V0U2Vjb25kcy4KKyAqCisgKiAgIEluIHNvbWUgc3BlY2lhbCBjYXNlcyAobm8gc2VydmVycyBhcmUgZ2l2ZW4sIGZldGNoVGltZW91dFNlY29uZHMgbGVzcworICogdGhhbiBvciBlcXVhbCB0byAwLCByZXF1ZXN0QnVmIGlzIG51bGwpLCB0aGUgcmV0dXJuIGlzIG51bGwuCisgKgorICogTm90ZToKKyAqICAgSXQgYXNzdW1lcyBhbGwgcmVtb3RlIHNlcnZlcnMgYXJlIFROb25ibG9ja2luZ1NlcnZlcnMgYW5kIHVzZQorICogVEZyYW1lZFRyYW5zcG9ydC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IHsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigKKyAgICBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmNsYXNzLmdldE5hbWUoKQorICApOworCisgIC8vIGlmIHRoZSBzaXplIG9mIHRoZSByZXNwb25zZSBtc2cgZXhjZWVkcyB0aGlzIGxpbWl0IChpbiBieXRlKSwgd2Ugd2lsbAorICAvLyBub3QgcmVhZCB0aGUgbXNnCisgIHByaXZhdGUgaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcjsKKworICAvLyB0aW1lIGxpbWl0IGZvciBmZXRjaGluZyBkYXRhIGZyb20gYWxsIHNlcnZlcnMgKGluIHNlY29uZCkKKyAgcHJpdmF0ZSBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kczsKKworICAvLyBzdG9yZSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHNlcnZlcnMgIAorICBwcml2YXRlIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJlcXVlc3RCdWZEdXBsaWNhdGlvbjsKKworICAvLyBhIGxpc3Qgb2YgcmVtb3RlIHNlcnZlcnMKKyAgcHJpdmF0ZSBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBzZXJ2ZXJzOworCisgIC8vIHN0b3JlIGZldGNoIHJlc3VsdHMKKyAgcHJpdmF0ZSBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMgc3RhdHM7CisgIHByaXZhdGUgQnl0ZUJ1ZmZlcltdIHJlY3ZCdWY7CisKKyAgcHVibGljIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQoaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciwKKyAgICBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kcywgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmLAorICAgIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IHNlcnZlcnMpIHsKKyAgICB0aGlzLm1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciA9IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcjsKKyAgICB0aGlzLmZldGNoVGltZW91dFNlY29uZHMgPSBmZXRjaFRpbWVvdXRTZWNvbmRzOworICAgIHRoaXMucmVxdWVzdEJ1ZiA9IHJlcXVlc3RCdWY7CisgICAgdGhpcy5zZXJ2ZXJzID0gc2VydmVyczsKKyAgICAgIAorICAgIHN0YXRzID0gbmV3IFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cygpOworICAgIHJlY3ZCdWYgPSBudWxsOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKCkgeworICAgIHJldHVybiBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRGZXRjaFRpbWVvdXRTZWNvbmRzKCkgeworICAgIHJldHVybiBmZXRjaFRpbWVvdXRTZWNvbmRzOworICB9CisKKyAgLyoqCisgICAqIHJldHVybiBhIGR1cGxpY2F0aW9uIG9mIHJlcXVlc3RCdWYsIHNvIHRoYXQgcmVxdWVzdEJ1ZiB3aWxsIG5vdAorICAgKiBiZSBtb2RpZmllZCBieSBvdGhlcnMuCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIEJ5dGVCdWZmZXIgZ2V0UmVxdWVzdEJ1ZigpIHsKKyAgICBpZiAocmVxdWVzdEJ1ZiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlcXVlc3RCdWZEdXBsaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgIHJlcXVlc3RCdWZEdXBsaWNhdGlvbiA9IHJlcXVlc3RCdWYuZHVwbGljYXRlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVxdWVzdEJ1ZkR1cGxpY2F0aW9uOyAgCisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBnZXRTZXJ2ZXJMaXN0KCkgeworICAgIGlmIChzZXJ2ZXJzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzZXJ2ZXJzKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIGdldEZldGNoU3RhdHMoKSB7CisgICAgcmV0dXJuIHN0YXRzOworICB9CisKKyAgLyoqCisgICAqIG1haW4gZW50cnkgZnVuY3Rpb24gZm9yIGZldGNoaW5nIGZyb20gc2VydmVycworICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBCeXRlQnVmZmVyW10gZmV0Y2goKSB7CisgICAgLy8gY2xlYXIgcHJldmlvdXMgcmVzdWx0cworICAgIHJlY3ZCdWYgPSBudWxsOworICAgIHN0YXRzLmNsZWFyKCk7CisKKyAgICBpZiAoc2VydmVycyA9PSBudWxsIHx8IHNlcnZlcnMuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgcmVxdWVzdEJ1ZiA9PSBudWxsIHx8IGZldGNoVGltZW91dFNlY29uZHMgPD0gMCkgeworICAgICAgcmV0dXJuIHJlY3ZCdWY7CisgICAgfQorCisgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgTXVsdGlGZXRjaCBtdWx0aUZldGNoID0gbmV3IE11bHRpRmV0Y2goKTsKKyAgICBGdXR1cmVUYXNrPD8+IHRhc2sgPSBuZXcgRnV0dXJlVGFzayhtdWx0aUZldGNoLCBudWxsKTsKKyAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOworICAgIHRyeSB7CisgICAgICB0YXNrLmdldChmZXRjaFRpbWVvdXRTZWNvbmRzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suCisgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgIExPR0dFUi5lcnJvcigiaW50ZXJydXB0ZWQgZHVyaW5nIGZldGNoOiAiK2llLnRvU3RyaW5nKCkpOworICAgIH0gY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suCisgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgIExPR0dFUi5lcnJvcigiZXhjZXB0aW9uIGR1cmluZyBmZXRjaDogIitlZS50b1N0cmluZygpKTsKKyAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gdGUpIHsKKyAgICAgIC8vIGF0dGVtcHQgdG8gY2FuY2VsIGV4ZWN1dGlvbiBvZiB0aGUgdGFzay4gIAorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoInRpbWVvdXQgZm9yIGZldGNoOiAiK3RlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgbXVsdGlGZXRjaC5jbG9zZSgpOworICAgIHJldHVybiByZWN2QnVmOworICB9CisKKyAgLyoqCisgICAqIFByaXZhdGUgY2xhc3MgdGhhdCBkb2VzIHJlYWwgZmV0Y2ggam9iLgorICAgKiBVc2VycyBhcmUgbm90IGFsbG93ZWQgdG8gZGlyZWN0bHkgdXNlIHRoaXMgY2xhc3MsIGFzIGl0cyBydW4oKQorICAgKiBmdW5jdGlvbiBtYXkgcnVuIGZvcmV2ZXIuCisgICAqLworICBwcml2YXRlIGNsYXNzIE11bHRpRmV0Y2ggaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvcjsKKworICAgIC8qKgorICAgICAqIG1haW4gZW50cnkgZnVuY3Rpb24gZm9yIGZldGNoaW5nLgorICAgICAqCisgICAgICogU2VydmVyIHJlc3BvbnNlcyBhcmUgc3RvcmVkIGluIFROb25ibG9jaW5nTXVsdGlGZXRjaENsaWVudC5yZWN2QnVmLAorICAgICAqIGFuZCBmZXRjaCBzdGF0aXN0aWNzIGlzIGluIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuc3RhdHMuCisgICAgICoKKyAgICAgKiBTYW5pdHkgY2hlY2sgZm9yIHBhcmFtZXRlcnMgaGFzIGJlZW4gZG9uZSBpbgorICAgICAqIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgIGludCBudW1Ub3RhbFNlcnZlcnMgPSBzZXJ2ZXJzLnNpemUoKTsKKyAgICAgIHN0YXRzLnNldE51bVRvdGFsU2VydmVycyhudW1Ub3RhbFNlcnZlcnMpOworCisgICAgICAvLyBidWZmZXIgZm9yIHJlY2VpdmluZyByZXNwb25zZSBmcm9tIHNlcnZlcnMKKyAgICAgIHJlY3ZCdWYgICAgICAgICAgICAgICAgICAgICA9IG5ldyBCeXRlQnVmZmVyW251bVRvdGFsU2VydmVyc107CisgICAgICAvLyBidWZmZXIgZm9yIHNlbmRpbmcgcmVxdWVzdAorICAgICAgQnl0ZUJ1ZmZlciBzZW5kQnVmW10gICAgICAgID0gbmV3IEJ5dGVCdWZmZXJbbnVtVG90YWxTZXJ2ZXJzXTsKKyAgICAgIGxvbmcgbnVtQnl0ZXNSZWFkW10gICAgICAgICA9IG5ldyBsb25nW251bVRvdGFsU2VydmVyc107CisgICAgICBpbnQgZnJhbWVTaXplW10gICAgICAgICAgICAgPSBuZXcgaW50W251bVRvdGFsU2VydmVyc107CisgICAgICBib29sZWFuIGhhc1JlYWRGcmFtZVNpemVbXSAgPSBuZXcgYm9vbGVhbltudW1Ub3RhbFNlcnZlcnNdOworCisgICAgICB0cnkgeworICAgICAgICBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJzZWxlY3RvciBvcGVucyBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG90YWxTZXJ2ZXJzOyBpKyspIHsKKyAgICAgICAgLy8gY3JlYXRlIGJ1ZmZlciB0byBzZW5kIHJlcXVlc3QgdG8gc2VydmVyLgorICAgICAgICBzZW5kQnVmW2ldID0gcmVxdWVzdEJ1Zi5kdXBsaWNhdGUoKTsKKyAgICAgICAgLy8gY3JlYXRlIGJ1ZmZlciB0byByZWFkIHJlc3BvbnNlJ3MgZnJhbWUgc2l6ZSBmcm9tIHNlcnZlcgorICAgICAgICByZWN2QnVmW2ldID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgc3RhdHMuaW5jVG90YWxSZWN2QnVmQnl0ZXMoNCk7CisKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2VydmVyID0gc2VydmVycy5nZXQoaSk7CisgICAgICAgIFNvY2tldENoYW5uZWwgcyA9IG51bGw7CisgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgIHMgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgICBzLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgICAvLyBub3cgdGhpcyBtZXRob2QgaXMgbm9uLWJsb2NraW5nCisgICAgICAgICAgcy5jb25uZWN0KHNlcnZlcik7CisgICAgICAgICAga2V5ID0gcy5yZWdpc3RlcihzZWxlY3Rvciwgcy52YWxpZE9wcygpKTsKKyAgICAgICAgICAvLyBhdHRhY2ggaW5kZXggb2YgdGhlIGtleQorICAgICAgICAgIGtleS5hdHRhY2goaSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgc3RhdHMuaW5jTnVtQ29ubmVjdEVycm9yU2VydmVycygpOyAgCisgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNldCB1cCBzb2NrZXQgdG8gc2VydmVyICVzIGVycm9yOiAlcyIsCisgICAgICAgICAgICBzZXJ2ZXIudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAvLyBmcmVlIHJlc291cmNlCisgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHtzLmNsb3NlKCk7fSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQorICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIHdhaXQgZm9yIGV2ZW50cworICAgICAgd2hpbGUgKHN0YXRzLmdldE51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCkgKworICAgICAgICBzdGF0cy5nZXROdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgPCBzdGF0cy5nZXROdW1Ub3RhbFNlcnZlcnMoKSkgeworICAgICAgICAvLyBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIChlLmcuLCB0YXNrIGlzIGNhbmNlbGxlZCkgIAorICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnl7CisgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJzZWxlY3RvciBzZWxlY3RzIGVycm9yOiAiK2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgIFNlbGVjdGlvbktleSBzZWxLZXkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgaXQucmVtb3ZlKCk7CisKKyAgICAgICAgICAvLyBnZXQgcHJldmlvdXNseSBhdHRhY2hlZCBpbmRleAorICAgICAgICAgIGludCBpbmRleCA9IChJbnRlZ2VyKXNlbEtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNDb25uZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIHNvY2tldCB0aHJvd3MgYW4gZXhjZXB0aW9uIChlLmcuLCBjb25uZWN0aW9uIHJlZnVzZWQpLAorICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgbXNnIGFuZCBza2lwIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgIHNDaGFubmVsLmZpbmlzaENvbm5lY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHN0YXRzLmluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNvY2tldCAlZCBjb25uZWN0cyB0byBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgaW5kZXgsIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNXcml0YWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoc2VuZEJ1ZltpbmRleF0uaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzb2NrZXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcHJpbnQgZXJyb3IgbXNnIGFuZAorICAgICAgICAgICAgICAvLyBza2lwIGl0LgorICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICAgIHNDaGFubmVsLndyaXRlKHNlbmRCdWZbaW5kZXhdKTsKKyAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic29ja2V0ICVkIHdyaXRlcyB0byBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgICAiZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzZWxLZXkuaXNWYWxpZCgpICYmIHNlbEtleS5pc1JlYWRhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgc29ja2V0IHRocm93cyBhbiBleGNlcHRpb24sIHByaW50IGVycm9yIG1zZyBhbmQKKyAgICAgICAgICAgIC8vIHNraXAgaXQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHNDaGFubmVsLnJlYWQocmVjdkJ1ZltpbmRleF0pOworCisgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgbnVtQnl0ZXNSZWFkW2luZGV4XSArPSBieXRlc1JlYWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWhhc1JlYWRGcmFtZVNpemVbaW5kZXhdICYmCisgICAgICAgICAgICAgICAgICAgIHJlY3ZCdWZbaW5kZXhdLnJlbWFpbmluZygpPT0wKSB7CisgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZnJhbWUgc2l6ZSBoYXMgYmVlbiByZWFkIGNvbXBsZXRlbHksIHRoZW4gcHJlcGFyZQorICAgICAgICAgICAgICAgICAgLy8gdG8gcmVhZCB0aGUgYWN0dWFsIGZyYW1lLgorICAgICAgICAgICAgICAgICAgZnJhbWVTaXplW2luZGV4XSA9IHJlY3ZCdWZbaW5kZXhdLmdldEludCgwKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1JbnZhbGlkRnJhbWVTaXplKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSAlcy4gRG9lcyB0aGUgc2VydmVyIHVzZSBURnJhbWVkVHJhbnNwb3J0PyAiLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVtpbmRleF0sIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplW2luZGV4XSArIDQgPiBzdGF0cy5nZXRNYXhSZXNwb25zZUJ5dGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuc2V0TWF4UmVzcG9uc2VCeXRlcyhmcmFtZVNpemVbaW5kZXhdKzQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplW2luZGV4XSArIDQgPiBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtT3ZlcmZsb3dlZFJlY3ZCdWYoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoIlJlYWQgZnJhbWUgc2l6ZSAlZCBmcm9tICVzLCIKKyAgICAgICAgICAgICAgICAgICAgICArICIgdG90YWwgYnVmZmVyIHNpemUgd291bGQgZXhjZWVkIGxpbWl0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemVbaW5kZXhdLCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIGJ1ZmZlciBmb3IgYWN0dWFsIGZyYW1lIGRhdGEKKyAgICAgICAgICAgICAgICAgIHJlY3ZCdWZbaW5kZXhdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShmcmFtZVNpemVbaW5kZXhdICsgNCk7CisgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XS5wdXRJbnQoZnJhbWVTaXplW2luZGV4XSk7CisKKyAgICAgICAgICAgICAgICAgIHN0YXRzLmluY1RvdGFsUmVjdkJ1ZkJ5dGVzKGZyYW1lU2l6ZVtpbmRleF0pOworICAgICAgICAgICAgICAgICAgaGFzUmVhZEZyYW1lU2l6ZVtpbmRleF0gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChoYXNSZWFkRnJhbWVTaXplW2luZGV4XSAmJgorICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNSZWFkW2luZGV4XSA+PSBmcmFtZVNpemVbaW5kZXhdKzQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIGhhcyByZWFkIGFsbCBkYXRhCisgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgICAgIGxvbmcgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgIHN0YXRzLnNldFJlYWRUaW1lKHQyLXQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzb2NrZXQgJWQgcmVhZHMgZnJvbSBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgaW5kZXgsIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkaXNwb3NlIGFueSByZXNvdXJjZSBhbGxvY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChzZWxlY3Rvci5pc09wZW4oKSkgeworICAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gaXQgPSBzZWxlY3Rvci5rZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTZWxlY3Rpb25LZXkgc2VsS2V5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJmcmVlIHJlc291cmNlIGVycm9yOiAiK2UudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjg2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvKioKKyAqIFRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2Ygc3RhdGlzdGljcyBmb3IgVE5vbmJsb2NraW5NdWx0aUZldGNoQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIHsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtVG90YWxTZXJ2ZXJzOworICBwcml2YXRlIGludCAgICBudW1SZWFkQ29tcGxldGVkU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtQ29ubmVjdEVycm9yU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgdG90YWxSZWN2QnVmQnl0ZXM7CisgIHByaXZhdGUgaW50ICAgIG1heFJlc3BvbnNlQnl0ZXM7CisgIHByaXZhdGUgaW50ICAgIG51bU92ZXJmbG93ZWRSZWN2QnVmOworICBwcml2YXRlIGludCAgICBudW1JbnZhbGlkRnJhbWVTaXplOworICAvLyB0aW1lIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmZXRjaCgpIGZ1bmN0aW9uIHRvIHRoZSByZWFkaW5nIGZpbmlzaAorICAvLyB0aW1lIG9mIHRoZSBsYXN0IHNvY2tldCAoaW4gbWlsbGktc2Vjb25kKQorICBwcml2YXRlIGxvbmcgICByZWFkVGltZTsKKworICBwdWJsaWMgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzKCkgeworICAgIGNsZWFyKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBudW1Ub3RhbFNlcnZlcnMgPSAwOworICAgIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzID0gMDsKKyAgICBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzID0gMDsKKyAgICB0b3RhbFJlY3ZCdWZCeXRlcyA9IDA7CisgICAgbWF4UmVzcG9uc2VCeXRlcyA9IDA7CisgICAgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYgPSAwOworICAgIG51bUludmFsaWRGcmFtZVNpemUgPSAwOworICAgIHJlYWRUaW1lID0gMDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nIHN0YXRzID0gU3RyaW5nLmZvcm1hdCgibnVtVG90YWxTZXJ2ZXJzPSVkLCAiICsKKyAgICAgICJudW1SZWFkQ29tcGxldGVkU2VydmVycz0lZCwgbnVtQ29ubmVjdEVycm9yU2VydmVycz0lZCwgIiArCisgICAgICAibnVtVW5yZXNwb25zaXZlU2VydmVycz0lZCwgdG90YWxSZWN2QnVmQnl0ZXM9JWZNLCAiICsKKyAgICAgICJtYXhSZXNwb25zZUJ5dGVzPSVkLCBudW1PdmVyZmxvd2VkUmVjdkJ1Zj0lZCwgIiArCisgICAgICAibnVtSW52YWxpZEZyYW1lU2l6ZT0lZCwgcmVhZFRpbWU9JWRtcyIsCisgICAgICBudW1Ub3RhbFNlcnZlcnMsIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzLCBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzLAorICAgICAgKG51bVRvdGFsU2VydmVycy1udW1SZWFkQ29tcGxldGVkU2VydmVycy1udW1Db25uZWN0RXJyb3JTZXJ2ZXJzKSwKKyAgICAgIHRvdGFsUmVjdkJ1ZkJ5dGVzLzEwMjQuMC8xMDI0LCBtYXhSZXNwb25zZUJ5dGVzLCBudW1PdmVyZmxvd2VkUmVjdkJ1ZiwKKyAgICAgIG51bUludmFsaWRGcmFtZVNpemUsIHJlYWRUaW1lKTsKKyAgICByZXR1cm4gc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXROdW1Ub3RhbFNlcnZlcnMoaW50IHZhbCkgICAgeyBudW1Ub3RhbFNlcnZlcnMgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgc2V0TWF4UmVzcG9uc2VCeXRlcyhpbnQgdmFsKSAgIHsgbWF4UmVzcG9uc2VCeXRlcyA9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZShsb25nIHZhbCkgICAgICAgICAgeyByZWFkVGltZSA9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1SZWFkQ29tcGxldGVkU2VydmVycygpICAgeyBudW1SZWFkQ29tcGxldGVkU2VydmVycysrOyB9CisgIHB1YmxpYyB2b2lkIGluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKSAgICB7IG51bUNvbm5lY3RFcnJvclNlcnZlcnMrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1PdmVyZmxvd2VkUmVjdkJ1ZigpICAgICAgeyBudW1PdmVyZmxvd2VkUmVjdkJ1ZisrOyB9CisgIHB1YmxpYyB2b2lkIGluY1RvdGFsUmVjdkJ1ZkJ5dGVzKGludCB2YWwpICB7IHRvdGFsUmVjdkJ1ZkJ5dGVzICs9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1JbnZhbGlkRnJhbWVTaXplKCkgICAgICAgeyBudW1JbnZhbGlkRnJhbWVTaXplKys7IH0KKworICBwdWJsaWMgaW50IGdldE1heFJlc3BvbnNlQnl0ZXMoKSAgICAgICAgeyByZXR1cm4gbWF4UmVzcG9uc2VCeXRlczsgfQorICBwdWJsaWMgaW50IGdldE51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCkgeyByZXR1cm4gbnVtUmVhZENvbXBsZXRlZFNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgIHsgcmV0dXJuIG51bUNvbm5lY3RFcnJvclNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1Ub3RhbFNlcnZlcnMoKSAgICAgICAgIHsgcmV0dXJuIG51bVRvdGFsU2VydmVyczsgfQorICBwdWJsaWMgaW50IGdldE51bU92ZXJmbG93ZWRSZWN2QnVmKCkgICAgeyByZXR1cm4gbnVtT3ZlcmZsb3dlZFJlY3ZCdWY7fQorICBwdWJsaWMgaW50IGdldFRvdGFsUmVjdkJ1ZkJ5dGVzKCkgICAgICAgeyByZXR1cm4gdG90YWxSZWN2QnVmQnl0ZXM7fQorICBwdWJsaWMgaW50IGdldE51bUludmFsaWRGcmFtZVNpemUoKSAgICAgeyByZXR1cm4gbnVtSW52YWxpZEZyYW1lU2l6ZTsgfQorICBwdWJsaWMgbG9uZyBnZXRSZWFkVGltZSgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmVhZFRpbWU7IH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKaW5kZXggYmNkOGEzOC4uODE5MzNhMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTM2LDQgKzM2LDggQEAKICAgcHVibGljIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMpIHsKICAgICByZXR1cm4gcHJvY2Vzc29yXzsKICAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNQcm9jZXNzb3IoKSB7CisgICAgICByZXR1cm4gcHJvY2Vzc29yXyBpbnN0YW5jZW9mIFRBc3luY1Byb2Nlc3NvcjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwMDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICoKKyAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQppbmRleCBlZTA3Yjc4Li4wMGEzNmVlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQpAQCAtMTksMjEgKzE5LDczIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogCiAvKioKICAqIEEgVFNlcnZpY2VDbGllbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgVFNlcnZpY2UgaW1wbGVtZW50YXRpb24KICAqIGFjcm9zcyBwcm90b2NvbHMgYW5kIHRyYW5zcG9ydHMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVFNlcnZpY2VDbGllbnQgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2aWNlQ2xpZW50IHsKKyAgcHVibGljIFRTZXJ2aWNlQ2xpZW50KFRQcm90b2NvbCBwcm90KSB7CisgICAgdGhpcyhwcm90LCBwcm90KTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmljZUNsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgeworICAgIGlwcm90XyA9IGlwcm90OworICAgIG9wcm90XyA9IG9wcm90OworICB9CisKKyAgcHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87CisgIHByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOworCisgIHByb3RlY3RlZCBpbnQgc2VxaWRfOworCiAgIC8qKgogICAgKiBHZXQgdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBpbnB1dCAocmVhZCkgcHJvdG9jb2wuCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIGlucHV0IChyZWFkKSBwcm90b2NvbC4KICAgICovCi0gIHB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpOworICBwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSB7CisgICAgcmV0dXJuIHRoaXMuaXByb3RfOworICB9CisKICAgLyoqCiAgICAqIEdldCB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIG91dHB1dCAod3JpdGUpIHByb3RvY29sLgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBvdXRwdXQgKHdyaXRlKSBwcm90b2NvbC4KICAgICovCi0gIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKTsKKyAgcHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIHsKKyAgICByZXR1cm4gdGhpcy5vcHJvdF87CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2VuZEJhc2UobWV0aG9kTmFtZSwgYXJncywgVE1lc3NhZ2VUeXBlLkNBTEwpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2VPbmV3YXkoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHNlbmRCYXNlKG1ldGhvZE5hbWUsIGFyZ3MsIFRNZXNzYWdlVHlwZS5PTkVXQVkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRCYXNlKFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MsIGJ5dGUgdHlwZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIG9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobWV0aG9kTmFtZSwgdHlwZSwgKytzZXFpZF8pKTsKKyAgICBhcmdzLndyaXRlKG9wcm90Xyk7CisgICAgb3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOworICAgIG9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgcmVjZWl2ZUJhc2UoVEJhc2U8Pyw/PiByZXN1bHQsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVE1lc3NhZ2UgbXNnID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeworICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICB4LnJlYWQoaXByb3RfKTsKKyAgICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgdGhyb3cgeDsKKyAgICB9CisgICAgaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsKKyAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZTogZXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCIsIG1ldGhvZE5hbWUsIHNlcWlkXywgbXNnLnNlcWlkKSk7CisgICAgfQorICAgIHJlc3VsdC5yZWFkKGlwcm90Xyk7CisgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YQppbmRleCA4MDhkNWU2Li45ODhlNjU1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgIC8qKgogICAgKiBHZXQgYSBicmFuZC1uZXcgVCB1c2luZyA8aT5wcm90PC9pPiBhcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sLgogICAgKiBAcGFyYW0gcHJvdAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gQSBicmFuZC1uZXcgVCB1c2luZyA8aT5wcm90PC9pPiBhcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sLgogICAgKi8KICAgcHVibGljIFQgZ2V0Q2xpZW50KFRQcm90b2NvbCBwcm90KTsKIApAQCAtMzksNyArMzksNyBAQAogICAgKiBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyBtYXkgYmUgdGhlIHNhbWUgaW5zdGFuY2UuCiAgICAqIEBwYXJhbSBpcHJvdAogICAgKiBAcGFyYW0gb3Byb3QKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIGEgYnJhbmQgbmV3IFQgdXNpbmcgdGhlIHNwZWNpZmllZCBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scwogICAgKi8KICAgcHVibGljIFQgZ2V0Q2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQppbmRleCAzMjE1NmMxLi4xZWYxMWRmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0yOCw4ICsyOSwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb24sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4geworcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4gewogCiAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWVfOwogICBwcm90ZWN0ZWQgRiBzZXRGaWVsZF87CkBAIC0zOCw2ICs0MywxMiBAQAogICAgIHNldEZpZWxkXyA9IG51bGw7CiAgICAgdmFsdWVfID0gbnVsbDsKICAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IFRVbmlvblN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IFRVbmlvblR1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQogCiAgIHByb3RlY3RlZCBUVW5pb24oRiBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7CiAgICAgc2V0RmllbGRWYWx1ZShzZXRGaWVsZCwgdmFsdWUpOwpAQCAtNTQsMTEgKzY1LDggQEAKICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGRlZXBDb3B5T2JqZWN0KE9iamVjdCBvKSB7CiAgICAgaWYgKG8gaW5zdGFuY2VvZiBUQmFzZSkgewogICAgICAgcmV0dXJuICgoVEJhc2UpbykuZGVlcENvcHkoKTsKLSAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgIGJ5dGVbXSBvdGhlcl92YWwgPSAoYnl0ZVtdKW87Ci0gICAgICBieXRlW10gdGhpc192YWwgPSBuZXcgYnl0ZVtvdGhlcl92YWwubGVuZ3RoXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkob3RoZXJfdmFsLCAwLCB0aGlzX3ZhbCwgMCwgb3RoZXJfdmFsLmxlbmd0aCk7Ci0gICAgICByZXR1cm4gdGhpc192YWw7CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikgeworICAgICAgcmV0dXJuIFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKEJ5dGVCdWZmZXIpbyk7CiAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgcmV0dXJuIGRlZXBDb3B5TGlzdCgoTGlzdClvKTsKICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTZXQpIHsKQEAgLTcxLDcgKzc5LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWVwQ29weU1hcChNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCkgewotICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKG1hcC5zaXplKCkpOwogICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CiAgICAgICBjb3B5LnB1dChkZWVwQ29weU9iamVjdChlbnRyeS5nZXRLZXkoKSksIGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICB9CkBAIC03OSw3ICs4Nyw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTZXQgZGVlcENvcHlTZXQoU2V0IHNldCkgewotICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoKTsKKyAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KHNldC5zaXplKCkpOwogICAgIGZvciAoT2JqZWN0IG8gOiBzZXQpIHsKICAgICAgIGNvcHkuYWRkKGRlZXBDb3B5T2JqZWN0KG8pKTsKICAgICB9CkBAIC0xMDYsNyArMTE0LDcgQEAKICAgICBpZiAoZmllbGRJZCAhPSBzZXRGaWVsZF8pIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBnZXQgdGhlIHZhbHVlIG9mIGZpZWxkICIgKyBmaWVsZElkICsgIiBiZWNhdXNlIHVuaW9uJ3Mgc2V0IGZpZWxkIGlzICIgKyBzZXRGaWVsZF8pOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKCk7CiAgIH0KIApAQCAtMTE3LDcgKzEyNSw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KCkgewogICAgIHJldHVybiBzZXRGaWVsZF8gIT0gbnVsbDsKICAgfQotICAKKwogICBwdWJsaWMgYm9vbGVhbiBpc1NldChGIGZpZWxkSWQpIHsKICAgICByZXR1cm4gc2V0RmllbGRfID09IGZpZWxkSWQ7CiAgIH0KQEAgLTEyNywyNCArMTM1LDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgc2V0RmllbGRfID0gbnVsbDsKLSAgICB2YWx1ZV8gPSBudWxsOwotCi0gICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7Ci0KLSAgICBURmllbGQgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOwotCi0gICAgdmFsdWVfID0gcmVhZFZhbHVlKGlwcm90LCBmaWVsZCk7Ci0gICAgaWYgKHZhbHVlXyAhPSBudWxsKSB7Ci0gICAgICBzZXRGaWVsZF8gPSBlbnVtRm9ySWQoZmllbGQuaWQpOwotICAgIH0KLQotICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOwotICAgIC8vIHRoaXMgaXMgc28gdGhhdCB3ZSB3aWxsIGVhdCB0aGUgc3RvcCBieXRlLiB3ZSBjb3VsZCBwdXQgYSBjaGVjayBoZXJlIHRvCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgaXQgYWN0dWFsbHkgKmlzKiB0aGUgc3RvcCBieXRlLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXQKLSAgICAvLyB0aGlzIHdheS4KLSAgICBpcHJvdC5yZWFkRmllbGRCZWdpbigpOwotICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKEYgZmllbGRJZCwgT2JqZWN0IHZhbHVlKSB7CkBAIC0xNTgsMTUgKzE0OSw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBudWxsIHx8IGdldEZpZWxkVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgYSBUVW5pb24gd2l0aCBubyBzZXQgdmFsdWUhIik7Ci0gICAgfQotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oZ2V0U3RydWN0RGVzYygpKTsKLSAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oZ2V0RmllbGREZXNjKHNldEZpZWxkXykpOwotICAgIHdyaXRlVmFsdWUob3Byb3QpOwotICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKLSAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOwotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKICAgfQogCiAgIC8qKgpAQCAtMTgxLDExICsxNjQsMTMgQEAKICAgICogSW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCB0byByZWFkIHRoZSByaWdodCBzdHVmZiBmcm9tIHRoZSB3aXJlIAogICAgKiBiYXNlZCBvbiB0aGUgZmllbGQgaGVhZGVyLiAKICAgICogQHBhcmFtIGZpZWxkCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiByZWFkIE9iamVjdCBiYXNlZCBvbiB0aGUgZmllbGQgaGVhZGVyLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50LgogICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb247CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworICAKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCB0dXBsZVNjaGVtZVJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIHNob3J0IGZpZWxkSUQpIHRocm93cyBURXhjZXB0aW9uOworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKIAogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCk7CiAKQEAgLTE5NSw0MSArMTgwLDEwMCBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZyByZXN1bHQgPSAiPCIgKyB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiAiOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPCIpOworICAgIHNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICBzYi5hcHBlbmQoIiAiKTsKIAogICAgIGlmIChnZXRTZXRGaWVsZCgpICE9IG51bGwpIHsKICAgICAgIE9iamVjdCB2ID0gZ2V0RmllbGRWYWx1ZSgpOwotICAgICAgU3RyaW5nIHZTdHIgPSBudWxsOwotICAgICAgaWYgKHYgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgdlN0ciA9IGJ5dGVzVG9TdHIoKGJ5dGVbXSl2KTsKKyAgICAgIHNiLmFwcGVuZChnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7CisgICAgICBzYi5hcHBlbmQoIjoiKTsKKyAgICAgIGlmKHYgaW5zdGFuY2VvZiBCeXRlQnVmZmVyKSB7CisgICAgICAgIFRCYXNlSGVscGVyLnRvU3RyaW5nKChCeXRlQnVmZmVyKXYsIHNiKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZTdHIgPSB2LnRvU3RyaW5nKCk7CisgICAgICAgIHNiLmFwcGVuZCh2LnRvU3RyaW5nKCkpOwogICAgICAgfQotICAgICAgcmVzdWx0ICs9IGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lICsgIjoiICsgdlN0cjsKICAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0ICsgIj4iOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ5dGVzVG9TdHIoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgaW50IHNpemUgPSBNYXRoLm1pbihieXRlcy5sZW5ndGgsIDEyOCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgZGlnaXQgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhGRik7Ci0gICAgICBzYi5hcHBlbmQoZGlnaXQubGVuZ3RoKCkgPiAxID8gZGlnaXQgOiAiMCIgKyBkaWdpdCk7Ci0gICAgfQotICAgIGlmIChieXRlcy5sZW5ndGggPiAxMjgpIHsKLSAgICAgIHNiLmFwcGVuZCgiIC4uLiIpOwotICAgIH0KKyAgICBzYi5hcHBlbmQoIj4iKTsKICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgfQogCi0gIEBPdmVycmlkZQogICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpIHsKICAgICB0aGlzLnNldEZpZWxkXyA9IG51bGw7CiAgICAgdGhpcy52YWx1ZV8gPSBudWxsOwogICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25TdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVFVuaW9uU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBUVW5pb25TdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxUVW5pb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gbnVsbDsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBudWxsOworCisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgVEZpZWxkIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgc3RydWN0LnZhbHVlXyA9IHN0cnVjdC5zdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShpcHJvdCwgZmllbGQpOworICAgICAgaWYgKHN0cnVjdC52YWx1ZV8gIT0gbnVsbCkgeworICAgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gc3RydWN0LmVudW1Gb3JJZChmaWVsZC5pZCk7CisgICAgICB9CisKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgLy8gdGhpcyBpcyBzbyB0aGF0IHdlIHdpbGwgZWF0IHRoZSBzdG9wIGJ5dGUuIHdlIGNvdWxkIHB1dCBhIGNoZWNrIGhlcmUgdG8KKyAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGl0IGFjdHVhbGx5ICppcyogdGhlIHN0b3AgYnl0ZSwgYnV0IGl0J3MgZmFzdGVyIHRvIGRvIGl0CisgICAgICAvLyB0aGlzIHdheS4KKyAgICAgIGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc3RydWN0LmdldFNldEZpZWxkKCkgPT0gbnVsbCB8fCBzdHJ1Y3QuZ2V0RmllbGRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIGEgVFVuaW9uIHdpdGggbm8gc2V0IHZhbHVlISIpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3QuZ2V0U3RydWN0RGVzYygpKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihzdHJ1Y3QuZ2V0RmllbGREZXNjKHN0cnVjdC5zZXRGaWVsZF8pKTsKKyAgICAgIHN0cnVjdC5zdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVFVuaW9uVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBUVW5pb25UdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxUVW5pb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gbnVsbDsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBudWxsOworICAgICAgc2hvcnQgZmllbGRJRCA9IGlwcm90LnJlYWRJMTYoKTsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBzdHJ1Y3QudHVwbGVTY2hlbWVSZWFkVmFsdWUoaXByb3QsIGZpZWxkSUQpOworICAgICAgaWYgKHN0cnVjdC52YWx1ZV8gIT0gbnVsbCkgeworICAgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gc3RydWN0LmVudW1Gb3JJZChmaWVsZElEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QsIFRVbmlvbiBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChzdHJ1Y3QuZ2V0U2V0RmllbGQoKSA9PSBudWxsIHx8IHN0cnVjdC5nZXRGaWVsZFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgYSBUVW5pb24gd2l0aCBubyBzZXQgdmFsdWUhIik7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUkxNihzdHJ1Y3Quc2V0RmllbGRfLmdldFRocmlmdEZpZWxkSWQoKSk7CisgICAgICBzdHJ1Y3QudHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9wcm90KTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIEFubm90YXRpb24gaW5kaWNhdGluZyBhIGZpZWxkLCBtZXRob2QgcmV0dXJuLCBvciBtZXRob2QgcGFyYW1ldGVyIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgKiBXZSBwYWNrYWdlIG91ciBvd24gYW5ub3RhdGlvbiB0byBhdm9pZCBhIG1hbmRhdG9yeSB0aGlyZC1wYXJ0eSBkZXBlbmRlbmN5LgorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5DTEFTUykKK3B1YmxpYyBAaW50ZXJmYWNlIE51bGxhYmxlIHsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKaW5kZXggYjhjZDllZC4uNGViZGUwNyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCkBAIC0xOCwyMSArMTgsMzQgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYzsKIAorLyoqCisgKiBBIGhhbmRsZXIgaW50ZXJmYWNlIGFzeW5jaHJvbm91cyBjbGllbnRzIGNhbiBpbXBsZW1lbnQgdG8gcmVjZWl2ZSBmdXR1cmUKKyAqIG5vdGljZSBvZiB0aGUgcmVzdWx0cyBvZiBhbiBhc3luY2hyb25vdXMgbWV0aG9kIGNhbGwuCisgKgorICogQHBhcmFtIDxUPiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kLgorICovCiBwdWJsaWMgaW50ZXJmYWNlIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAvKioKICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIHNpZGUgaGFzIGNvbXBsZXRlZCBpbnZva2luZwotICAgKiB5b3VyIG1ldGhvZCBjYWxsIGFuZCB0aGUgcmVzdWx0IGlzIGZ1bGx5IHJlYWQuIEZvciBvbmV3YXkgbWV0aG9kIGNhbGxzLAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0IHRoZQotICAgKiByZXF1ZXN0LgotICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Ige0Bjb2RlIG9uZXdheX0gbWV0aG9kCisgICAqIGNhbGxzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0CisgICAqIHRoZSByZXF1ZXN0LgorICAgKgorICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCBtZXRob2Q7CisgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZm9yIHZvaWQgbWV0aG9kcyB3aGljaCBpbmNsdWRlcworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG9uZXdheX0gbWV0aG9kcy4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CisgIHZvaWQgb25Db21wbGV0ZShUIHJlc3BvbnNlKTsKIAogICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiB1bmV4cGVjdGVkIGNsaWVudHNpZGUKLSAgICogZXhjZXB0aW9uLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYXBwbGljYXRpb24tZGVmaW5lZCBleGNlcHRpb25zIHRoYXQKLSAgICogYXBwZWFyIGluIHRoZSBJREwsIGJ1dCByYXRoZXIgdGhpbmdzIGxpa2UgSU9FeGNlcHRpb25zLgotICAgKiBAcGFyYW0gdGhyb3dhYmxlCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgZWl0aGVyIGFuIHVuZXhwZWN0ZWQgY2xpZW50LXNpZGUKKyAgICogZXhjZXB0aW9uIGxpa2UgYW4gSU9FeGNlcHRpb24gb3IgZWxzZSB3aGVuIHRoZSByZW1vdGUgbWV0aG9kIHJhaXNlcyBhbgorICAgKiBleGNlcHRpb24sIGVpdGhlciBkZWNsYXJlZCBpbiB0aGUgSURMIG9yIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNlcnZlci1zaWRlCisgICAqIGVycm9yLgorICAgKgorICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gZW5jb3VudGVyZWQgcHJvY2Vzc2luZyB0aGUgdGhlIGFzeW5jaHJvbm91cworICAgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsLCBtYXkgYmUgYSBsb2NhbCBleGNlcHRpb24gb3IgYW4gdW5tYXJzaGFsbGVkCisgICAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGV4Y2VwdGlvbi4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSk7CisgIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQppbmRleCAyZThkZWEzLi4wMDUwMThhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCkBAIC0yMiw0NyArMjIsNjUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEFzeW5jQ2xpZW50IHsKLSAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OwotICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydDsKLSAgcHJvdGVjdGVkIGZpbmFsIFRBc3luY0NsaWVudE1hbmFnZXIgbWFuYWdlcjsKLSAgcHJpdmF0ZSBUQXN5bmNNZXRob2RDYWxsIGN1cnJlbnRNZXRob2Q7Ci0gIHByaXZhdGUgVGhyb3dhYmxlIGVycm9yOworICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sRmFjdG9yeSBfX19wcm90b2NvbEZhY3Rvcnk7CisgIHByb3RlY3RlZCBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgX19fdHJhbnNwb3J0OworICBwcm90ZWN0ZWQgZmluYWwgVEFzeW5jQ2xpZW50TWFuYWdlciBfX19tYW5hZ2VyOworICBwcm90ZWN0ZWQgVEFzeW5jTWV0aG9kQ2FsbCBfX19jdXJyZW50TWV0aG9kOworICBwcml2YXRlIEV4Y2VwdGlvbiBfX19lcnJvcjsKKyAgcHJpdmF0ZSBsb25nIF9fX3RpbWVvdXQ7CiAKICAgcHVibGljIFRBc3luY0NsaWVudChUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgVEFzeW5jQ2xpZW50TWFuYWdlciBtYW5hZ2VyLCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB7Ci0gICAgdGhpcy5wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7Ci0gICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLSAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB0aGlzKHByb3RvY29sRmFjdG9yeSwgbWFuYWdlciwgdHJhbnNwb3J0LCAwKTsKKyAgfQorCisgIHB1YmxpYyBUQXN5bmNDbGllbnQoVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRBc3luY0NsaWVudE1hbmFnZXIgbWFuYWdlciwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyB0aW1lb3V0KSB7CisgICAgdGhpcy5fX19wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgICAgdGhpcy5fX19tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB0aGlzLl9fX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB0aGlzLl9fX3RpbWVvdXQgPSB0aW1lb3V0OwogICB9CiAKICAgcHVibGljIFRQcm90b2NvbEZhY3RvcnkgZ2V0UHJvdG9jb2xGYWN0b3J5KCkgewotICAgIHJldHVybiBwcm90b2NvbEZhY3Rvcnk7CisgICAgcmV0dXJuIF9fX3Byb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldFRpbWVvdXQoKSB7CisgICAgcmV0dXJuIF9fX3RpbWVvdXQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBoYXNUaW1lb3V0KCkgeworICAgIHJldHVybiBfX190aW1lb3V0ID4gMDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7CisgICAgdGhpcy5fX190aW1lb3V0ID0gdGltZW91dDsKICAgfQogCiAgIC8qKgogICAgKiBJcyB0aGUgY2xpZW50IGluIGFuIGVycm9yIHN0YXRlPwotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gSWYgY2xpZW50IGluIGFuIGVycm9yIHN0YXRlPwogICAgKi8KICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0gICAgcmV0dXJuIGVycm9yICE9IG51bGw7CisgICAgcmV0dXJuIF9fX2Vycm9yICE9IG51bGw7CiAgIH0KIAogICAvKioKICAgICogR2V0IHRoZSBjbGllbnQncyBlcnJvciAtIHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPHA+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgogICAgKi8KLSAgcHVibGljIFRocm93YWJsZSBnZXRFcnJvcigpIHsKLSAgICByZXR1cm4gZXJyb3I7CisgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKSB7CisgICAgcmV0dXJuIF9fX2Vycm9yOwogICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWFkeSgpIHsKICAgICAvLyBFbnN1cmUgd2UgYXJlIG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nIGEgbWV0aG9kCi0gICAgaWYgKGN1cnJlbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYW5vdGhlciBtZXRob2Q6ICIgKyBjdXJyZW50TWV0aG9kLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICBpZiAoX19fY3VycmVudE1ldGhvZCAhPSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbGllbnQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBhbm90aGVyIG1ldGhvZDogIiArIF9fX2N1cnJlbnRNZXRob2QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogICAgIH0KIAogICAgIC8vIEVuc3VyZSB3ZSdyZSBub3QgaW4gYW4gZXJyb3Igc3RhdGUKLSAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IGhhcyBhbiBlcnJvciEiLCBlcnJvcik7CisgICAgaWYgKF9fX2Vycm9yICE9IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsaWVudCBoYXMgYW4gZXJyb3IhIiwgX19fZXJyb3IpOwogICAgIH0KICAgfQogCkBAIC03MCwxNSArODgsMTUgQEAKICAgICogQ2FsbGVkIGJ5IGRlbGVnYXRlIG1ldGhvZCB3aGVuIGZpbmlzaGVkCiAgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBvbkNvbXBsZXRlKCkgewotICAgIGN1cnJlbnRNZXRob2QgPSBudWxsOworICAgIF9fX2N1cnJlbnRNZXRob2QgPSBudWxsOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBieSBkZWxlZ2F0ZSBtZXRob2Qgb24gZXJyb3IKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgIHRyYW5zcG9ydC5jbG9zZSgpOwotICAgIGN1cnJlbnRNZXRob2QgPSBudWxsOwotICAgIGVycm9yID0gdGhyb3dhYmxlOworICBwcm90ZWN0ZWQgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICBfX190cmFuc3BvcnQuY2xvc2UoKTsKKyAgICBfX19jdXJyZW50TWV0aG9kID0gbnVsbDsKKyAgICBfX19lcnJvciA9IGV4Y2VwdGlvbjsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKaW5kZXggMWQzMmFjZS4uYzA3Y2NkNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0xOSwxNCArMTksMTYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZFNlbGVjdG9yRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DYW5jZWxsZWRLZXlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRTZWxlY3RvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CkBAIC00Nyw2ICs0OSw5IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBjYWxsKFRBc3luY01ldGhvZENhbGwgbWV0aG9kKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc1J1bm5pbmcoKSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlbGVjdFRocmVhZCBpcyBub3QgcnVubmluZyIpOworICAgIH0KICAgICBtZXRob2QucHJlcGFyZU1ldGhvZENhbGwoKTsKICAgICBwZW5kaW5nQ2FsbHMuYWRkKG1ldGhvZCk7CiAgICAgc2VsZWN0VGhyZWFkLmdldFNlbGVjdG9yKCkud2FrZXVwKCk7CkBAIC01NiwxMyArNjEsMjAgQEAKICAgICBzZWxlY3RUaHJlYWQuZmluaXNoKCk7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgcmV0dXJuIHNlbGVjdFRocmVhZC5pc0FsaXZlKCk7CisgIH0KKwogICBwcml2YXRlIGNsYXNzIFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gcnVubmluZzsKKyAgICBwcml2YXRlIGZpbmFsIFRyZWVTZXQ8VEFzeW5jTWV0aG9kQ2FsbD4gdGltZW91dFdhdGNoU2V0ID0gbmV3IFRyZWVTZXQ8VEFzeW5jTWV0aG9kQ2FsbD4obmV3IFRBc3luY01ldGhvZENhbGxUaW1lb3V0Q29tcGFyYXRvcigpKTsKIAogICAgIHB1YmxpYyBTZWxlY3RUaHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhpcy5zZWxlY3RvciA9IFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuU2VsZWN0b3IoKTsKICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7CisgICAgICB0aGlzLnNldE5hbWUoIlRBc3luY0NsaWVudE1hbmFnZXIjU2VsZWN0b3JUaHJlYWQgIiArIHRoaXMuZ2V0SWQoKSk7CisKICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaG9sZCB1cCB0aGUgSlZNIHdoZW4gc2h1dHRpbmcgZG93bgogICAgICAgc2V0RGFlbW9uKHRydWUpOwogICAgIH0KQEAgLTc5LDQ4ICs5MSwxMTEgQEAKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICB3aGlsZSAocnVubmluZykgewogICAgICAgICB0cnkgewotICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgTE9HR0VSLmVycm9yKCJDYXVnaHQgSU9FeGNlcHRpb24gaW4gVEFzeW5jQ2xpZW50TWFuYWdlciEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBhbnkgcmVhZHkgY2hhbm5lbHMgY2FsbHMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IGtleXMubmV4dCgpOwotICAgICAgICAgICAga2V5cy5yZW1vdmUoKTsKLSAgICAgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhdmUgaGFwcGVuZWQgaWYgdGhlIG1ldGhvZCBjYWxsIGV4cGVyaWVuY2VkIGFuCi0gICAgICAgICAgICAgIC8vIGVycm9yIGFuZCB0aGUga2V5IHdhcyBjYW5jZWxsZWQuIGp1c3Qgc2tpcCBpdC4KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUQXN5bmNNZXRob2RDYWxsIG1ldGhvZCA9IChUQXN5bmNNZXRob2RDYWxsKWtleS5hdHRhY2htZW50KCk7Ci0gICAgICAgICAgICBtZXRob2QudHJhbnNpdGlvbihrZXkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gZSkgewotICAgICAgICAgIExPR0dFUi5lcnJvcigiQ2F1Z2h0IENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uIGluIFRBc3luY0NsaWVudE1hbmFnZXIhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGFydCBhbnkgbmV3IGNhbGxzCi0gICAgICAgIFRBc3luY01ldGhvZENhbGwgbWV0aG9kQ2FsbDsKLSAgICAgICAgd2hpbGUgKChtZXRob2RDYWxsID0gcGVuZGluZ0NhbGxzLnBvbGwoKSkgIT0gbnVsbCkgewotICAgICAgICAgIC8vIENhdGNoIHJlZ2lzdHJhdGlvbiBlcnJvcnMuIE1ldGhvZCB3aWxsIGNhdGNoIHRyYW5zaXRpb24gZXJyb3JzIGFuZCBjbGVhbnVwLgogICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gbWV0aG9kQ2FsbC5yZWdpc3RlcldpdGhTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICBtZXRob2RDYWxsLnRyYW5zaXRpb24oa2V5KTsKLSAgICAgICAgICB9IGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1ldGhvZENhbGwub25FcnJvcihlKTsKLSAgICAgICAgICAgIExPR0dFUi53YXJuKCJDYXVnaHQgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGUpOwotICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGxlZEtleUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtZXRob2RDYWxsLm9uRXJyb3IoZSk7Ci0gICAgICAgICAgICBMT0dHRVIud2FybigiQ2F1Z2h0IENhbmNlbGxlZEtleUV4Y2UxMTVwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGUpOwotICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtZXRob2RDYWxsLm9uRXJyb3IoZSk7Ci0gICAgICAgICAgICBMT0dHRVIud2FybigiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIFRBc3luY0NsaWVudE1hbmFnZXIhIiwgZSk7Ci0gICAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0aW1lb3V0V2F0Y2hTZXQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgLy8gTm8gdGltZW91dHMsIHNvIHNlbGVjdCBpbmRlZmluaXRlbHkKKyAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgdGltZW91dCBwZW5kaW5nLCBzbyBjYWxjdWxhdGUgdGhlIHRpbWUgdW50aWwgdGhlbiBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgbG9uZyBuZXh0VGltZW91dCA9IHRpbWVvdXRXYXRjaFNldC5maXJzdCgpLmdldFRpbWVvdXRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgbG9uZyBzZWxlY3RUaW1lID0gbmV4dFRpbWVvdXQgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgaWYgKHNlbGVjdFRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gTmV4dCB0aW1lb3V0IGlzIGluIHRoZSBmdXR1cmUsIHNlbGVjdCBhbmQgd2FrZSB1cCB0aGVuCisgICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KHNlbGVjdFRpbWUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5leHQgdGltZW91dCBpcyBub3cgb3IgaW4gcGFzdCwgc2VsZWN0IGltbWVkaWF0ZWx5IHNvIHdlIGNhbiB0aW1lIG91dAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJDYXVnaHQgSU9FeGNlcHRpb24gaW4gVEFzeW5jQ2xpZW50TWFuYWdlciEiLCBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJhbnNpdGlvbk1ldGhvZHMoKTsKKyAgICAgICAgICB0aW1lb3V0TWV0aG9kcygpOworICAgICAgICAgIHN0YXJ0UGVuZGluZ01ldGhvZHMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiSWdub3JpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIGluIFNlbGVjdFRocmVhZCIsIGV4Y2VwdGlvbik7CiAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3QgY2xvc2Ugc2VsZWN0b3IuIFRoaXMgbWF5IHJlc3VsdCBpbiBsZWFrZWQgcmVzb3VyY2VzISIsIGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcmFuc2l0aW9uIG1ldGhvZHMgZm9yIHJlYWR5IGtleXMKKyAgICBwcml2YXRlIHZvaWQgdHJhbnNpdGlvbk1ldGhvZHMoKSB7CisgICAgICB0cnkgeworICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0ga2V5cy5uZXh0KCk7CisgICAgICAgICAga2V5cy5yZW1vdmUoKTsKKyAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbWV0aG9kIGNhbGwgZXhwZXJpZW5jZWQgYW4gZXJyb3IgYW5kIHRoZQorICAgICAgICAgICAgLy8ga2V5IHdhcyBjYW5jZWxsZWQuIGNhbiBhbHNvIGhhcHBlbiBpZiB3ZSB0aW1lb3V0IGEgbWV0aG9kLCB3aGljaAorICAgICAgICAgICAgLy8gcmVzdWx0cyBpbiBhIGNoYW5uZWwgY2xvc2UuCisgICAgICAgICAgICAvLyBqdXN0IHNraXAKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBUQXN5bmNNZXRob2RDYWxsIG1ldGhvZENhbGwgPSAoVEFzeW5jTWV0aG9kQ2FsbClrZXkuYXR0YWNobWVudCgpOworICAgICAgICAgIG1ldGhvZENhbGwudHJhbnNpdGlvbihrZXkpOworCisgICAgICAgICAgLy8gSWYgZG9uZSBvciBlcnJvciBvY2N1cnJlZCwgcmVtb3ZlIGZyb20gdGltZW91dCB3YXRjaCBzZXQKKyAgICAgICAgICBpZiAobWV0aG9kQ2FsbC5pc0ZpbmlzaGVkKCkgfHwgbWV0aG9kQ2FsbC5nZXRDbGllbnQoKS5oYXNFcnJvcigpKSB7CisgICAgICAgICAgICB0aW1lb3V0V2F0Y2hTZXQucmVtb3ZlKG1ldGhvZENhbGwpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNhdWdodCBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRpbWVvdXQgYW55IGV4aXN0aW5nIG1ldGhvZCBjYWxscworICAgIHByaXZhdGUgdm9pZCB0aW1lb3V0TWV0aG9kcygpIHsKKyAgICAgIEl0ZXJhdG9yPFRBc3luY01ldGhvZENhbGw+IGl0ZXJhdG9yID0gdGltZW91dFdhdGNoU2V0Lml0ZXJhdG9yKCk7CisgICAgICBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgIFRBc3luY01ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRUaW1lID49IG1ldGhvZENhbGwuZ2V0VGltZW91dFRpbWVzdGFtcCgpKSB7CisgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgbWV0aG9kQ2FsbC5vbkVycm9yKG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJPcGVyYXRpb24gIiArIG1ldGhvZENhbGwuZ2V0Q2xhc3MoKSArICIgdGltZWQgb3V0IGFmdGVyICIgKyAoY3VycmVudFRpbWUgLSBtZXRob2RDYWxsLmdldFN0YXJ0VGltZSgpKSArICIgbXMuIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gU3RhcnQgYW55IG5ldyBjYWxscworICAgIHByaXZhdGUgdm9pZCBzdGFydFBlbmRpbmdNZXRob2RzKCkgeworICAgICAgVEFzeW5jTWV0aG9kQ2FsbCBtZXRob2RDYWxsOworICAgICAgd2hpbGUgKChtZXRob2RDYWxsID0gcGVuZGluZ0NhbGxzLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgICAvLyBDYXRjaCByZWdpc3RyYXRpb24gZXJyb3JzLiBtZXRob2Qgd2lsbCBjYXRjaCB0cmFuc2l0aW9uIGVycm9ycyBhbmQgY2xlYW51cC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtZXRob2RDYWxsLnN0YXJ0KHNlbGVjdG9yKTsKKworICAgICAgICAgIC8vIElmIHRpbWVvdXQgc3BlY2lmaWVkIGFuZCBmaXJzdCB0cmFuc2l0aW9uIHdlbnQgc21vb3RobHksIGFkZCB0byB0aW1lb3V0IHdhdGNoIHNldAorICAgICAgICAgIFRBc3luY0NsaWVudCBjbGllbnQgPSBtZXRob2RDYWxsLmdldENsaWVudCgpOworICAgICAgICAgIGlmIChjbGllbnQuaGFzVGltZW91dCgpICYmICFjbGllbnQuaGFzRXJyb3IoKSkgeworICAgICAgICAgICAgdGltZW91dFdhdGNoU2V0LmFkZChtZXRob2RDYWxsKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICBMT0dHRVIud2FybigiQ2F1Z2h0IGV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGV4Y2VwdGlvbik7CisgICAgICAgICAgbWV0aG9kQ2FsbC5vbkVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogQ29tcGFyYXRvciB1c2VkIGluIFRyZWVTZXQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbFRpbWVvdXRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxUQXN5bmNNZXRob2RDYWxsPiwgU2VyaWFsaXphYmxlIHsKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVEFzeW5jTWV0aG9kQ2FsbCBsZWZ0LCBUQXN5bmNNZXRob2RDYWxsIHJpZ2h0KSB7CisgICAgICBpZiAobGVmdC5nZXRUaW1lb3V0VGltZXN0YW1wKCkgPT0gcmlnaHQuZ2V0VGltZW91dFRpbWVzdGFtcCgpKSB7CisgICAgICAgIHJldHVybiAoaW50KShsZWZ0LmdldFNlcXVlbmNlSWQoKSAtIHJpZ2h0LmdldFNlcXVlbmNlSWQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGludCkobGVmdC5nZXRUaW1lb3V0VGltZXN0YW1wKCkgLSByaWdodC5nZXRUaW1lb3V0VGltZXN0YW1wKCkpOworICAgICAgfQogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKaW5kZXggZWNhMzIxYi4uM2JmMTc0NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKQEAgLTMyLDE0ICszMywyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCiAvKioKLSAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbAorICogRW5jYXBzdWxhdGVzIGFuIGFzeW5jIG1ldGhvZCBjYWxsLgorICogPHA+CiAgKiBOZWVkIHRvIGdlbmVyYXRlOgotICogICAtIHByaXZhdGUgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkKLSAqICAgLSBwdWJsaWMgVCBnZXRSZXN1bHQoKSB0aHJvd3MgPEV4Y2VwdGlvbl8xPiwgPEV4Y2VwdGlvbl8yPiwgLi4uCi0gKiBAcGFyYW0gPFQ+CisgKiA8dWw+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCk8L2xpPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzICZsdDtFeGNlcHRpb25fMSZndDssICZsdDtFeGNlcHRpb25fMiZndDssIC4uLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgbWV0aG9kIGNhbGwuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQXN5bmNNZXRob2RDYWxsPFQgZXh0ZW5kcyBUQXN5bmNNZXRob2RDYWxsPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbDxUPiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfTUVNT1JZX0JVRkZFUl9TSVpFID0gMTI4OworICBwcml2YXRlIHN0YXRpYyBBdG9taWNMb25nIHNlcXVlbmNlSWRDb3VudGVyID0gbmV3IEF0b21pY0xvbmcoMCk7CisKICAgcHVibGljIHN0YXRpYyBlbnVtIFN0YXRlIHsKKyAgICBDT05ORUNUSU5HLAogICAgIFdSSVRJTkdfUkVRVUVTVF9TSVpFLAogICAgIFdSSVRJTkdfUkVRVUVTVF9CT0RZLAogICAgIFJFQURJTkdfUkVTUE9OU0VfU0laRSwKQEAgLTQ4LDE5ICs1OCwyNCBAQAogICAgIEVSUk9SOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfTUVNT1JZX0JVRkZFUl9TSVpFID0gMTI4OworICAvKioKKyAgICogTmV4dCBzdGVwIGluIHRoZSBjYWxsLCBpbml0aWFsaXplZCBieSBzdGFydCgpCisgICAqLworICBwcml2YXRlIFN0YXRlIHN0YXRlID0gbnVsbDsKIAogICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydDsKICAgcHJpdmF0ZSBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKICAgcHJvdGVjdGVkIGZpbmFsIFRBc3luY0NsaWVudCBjbGllbnQ7CiAgIHByaXZhdGUgZmluYWwgQXN5bmNNZXRob2RDYWxsYmFjazxUPiBjYWxsYmFjazsKICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzT25ld2F5OworICBwcml2YXRlIGxvbmcgc2VxdWVuY2VJZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVvdXQ7CiAKICAgcHJpdmF0ZSBCeXRlQnVmZmVyIHNpemVCdWZmZXI7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHNpemVCdWZmZXJBcnJheSA9IG5ldyBieXRlWzRdOwotCiAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBmcmFtZUJ1ZmZlcjsKLSAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKKworICBwcml2YXRlIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKICAgcHJvdGVjdGVkIFRBc3luY01ldGhvZENhbGwoVEFzeW5jQ2xpZW50IGNsaWVudCwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gY2FsbGJhY2ssIGJvb2xlYW4gaXNPbmV3YXkpIHsKICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKQEAgLTY4LDE2ICs4Myw0NiBAQAogICAgIHRoaXMucHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OwogICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgIHRoaXMuaXNPbmV3YXkgPSBpc09uZXdheTsKLQotICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5XUklUSU5HX1JFUVVFU1RfU0laRTsKKyAgICB0aGlzLnNlcXVlbmNlSWQgPSBUQXN5bmNNZXRob2RDYWxsLnNlcXVlbmNlSWRDb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworICAgIHRoaXMudGltZW91dCA9IGNsaWVudC5nZXRUaW1lb3V0KCk7CiAgIH0KIAogICBwcm90ZWN0ZWQgU3RhdGUgZ2V0U3RhdGUoKSB7CiAgICAgcmV0dXJuIHN0YXRlOwogICB9CiAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICByZXR1cm4gc3RhdGUgPT0gU3RhdGUuUkVTUE9OU0VfUkVBRDsKKyAgfQorCisgIHByb3RlY3RlZCBsb25nIGdldFN0YXJ0VGltZSgpIHsKKyAgICByZXR1cm4gc3RhcnRUaW1lOworICB9CisgIAorICBwcm90ZWN0ZWQgbG9uZyBnZXRTZXF1ZW5jZUlkKCkgeworICAgIHJldHVybiBzZXF1ZW5jZUlkOworICB9CisKKyAgcHVibGljIFRBc3luY0NsaWVudCBnZXRDbGllbnQoKSB7CisgICAgcmV0dXJuIGNsaWVudDsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaGFzVGltZW91dCgpIHsKKyAgICByZXR1cm4gdGltZW91dCA+IDA7CisgIH0KKyAgCisgIHB1YmxpYyBsb25nIGdldFRpbWVvdXRUaW1lc3RhbXAoKSB7CisgICAgcmV0dXJuIHRpbWVvdXQgKyBzdGFydFRpbWU7CisgIH0KKwogICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFRFeGNlcHRpb247CiAKKyAgcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZSBidWZmZXJzLgorICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gaWYgYnVmZmVyIGluaXRpYWxpemF0aW9uIGZhaWxzCisgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlTWV0aG9kQ2FsbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWVtb3J5QnVmZmVyIG1lbW9yeUJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKElOSVRJQUxfTUVNT1JZX0JVRkZFUl9TSVpFKTsKICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wobWVtb3J5QnVmZmVyKTsKQEAgLTkwLDEwICsxMzUsMzIgQEAKICAgICBzaXplQnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKHNpemVCdWZmZXJBcnJheSk7CiAgIH0KIAotICBTZWxlY3Rpb25LZXkgcmVnaXN0ZXJXaXRoU2VsZWN0b3IoU2VsZWN0b3Igc2VsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFNlbGVjdGlvbktleSBrZXkgPSB0cmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihzZWwsIFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgIC8qKgorICAgKiBSZWdpc3RlciB3aXRoIHNlbGVjdG9yIGFuZCBzdGFydCBmaXJzdCBzdGF0ZSwgd2hpY2ggY291bGQgYmUgZWl0aGVyIGNvbm5lY3Rpbmcgb3Igd3JpdGluZy4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiByZWdpc3RlciBvciBzdGFydGluZyBmYWlscworICAgKi8KKyAgdm9pZCBzdGFydChTZWxlY3RvciBzZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2VsZWN0aW9uS2V5IGtleTsKKyAgICBpZiAodHJhbnNwb3J0LmlzT3BlbigpKSB7CisgICAgICBzdGF0ZSA9IFN0YXRlLldSSVRJTkdfUkVRVUVTVF9TSVpFOworICAgICAga2V5ID0gdHJhbnNwb3J0LnJlZ2lzdGVyU2VsZWN0b3Ioc2VsLCBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0ZSA9IFN0YXRlLkNPTk5FQ1RJTkc7CisgICAgICBrZXkgPSB0cmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihzZWwsIFNlbGVjdGlvbktleS5PUF9DT05ORUNUKTsKKworICAgICAgLy8gbm9uLWJsb2NraW5nIGNvbm5lY3QgY2FuIGNvbXBsZXRlIGltbWVkaWF0ZWx5LAorICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgbm90IGV4cGVjdCB0aGUgT1BfQ09OTkVDVAorICAgICAgaWYgKHRyYW5zcG9ydC5zdGFydENvbm5lY3QoKSkgeworICAgICAgICByZWdpc3RlckZvckZpcnN0V3JpdGUoa2V5KTsKKyAgICAgIH0KKyAgICB9CisKICAgICBrZXkuYXR0YWNoKHRoaXMpOwotICAgIHJldHVybiBrZXk7CisgIH0KKworICB2b2lkIHJlZ2lzdGVyRm9yRmlyc3RXcml0ZShTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXRlID0gU3RhdGUuV1JJVElOR19SRVFVRVNUX1NJWkU7CisgICAga2V5LmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CiAgIH0KIAogICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBnZXRGcmFtZUJ1ZmZlcigpIHsKQEAgLTEwNiw3ICsxNzMsNyBAQAogICAgKiBzZWxlY3QgaW50ZXJlc3RzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29uY3VycmVuY3kuCiAgICAqIEBwYXJhbSBrZXkKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgeworICB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgewogICAgIC8vIEVuc3VyZSBrZXkgaXMgdmFsaWQKICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKICAgICAgIGtleS5jYW5jZWwoKTsKQEAgLTExOCw2ICsxODUsOSBAQAogICAgIC8vIFRyYW5zaXRpb24gZnVuY3Rpb24KICAgICB0cnkgewogICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgZG9Db25uZWN0aW5nKGtleSk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgV1JJVElOR19SRVFVRVNUX1NJWkU6CiAgICAgICAgICAgZG9Xcml0aW5nUmVxdWVzdFNpemUoKTsKICAgICAgICAgICBicmVhazsKQEAgLTEzMCwyMiArMjAwLDIxIEBACiAgICAgICAgIGNhc2UgUkVBRElOR19SRVNQT05TRV9CT0RZOgogICAgICAgICAgIGRvUmVhZGluZ1Jlc3BvbnNlQm9keShrZXkpOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFU1BPTlNFX1JFQUQ6Ci0gICAgICAgIGNhc2UgRVJST1I6Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNhbGwgaW4gc3RhdGUgIiArIHN0YXRlIAorICAgICAgICBkZWZhdWx0OiAvLyBSRVNQT05TRV9SRUFELCBFUlJPUiwgb3IgYnVnCisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNhbGwgaW4gc3RhdGUgIiArIHN0YXRlCiAgICAgICAgICAgICAgICsgIiBidXQgc2VsZWN0b3IgY2FsbGVkIHRyYW5zaXRpb24gbWV0aG9kLiBTZWVtcyBsaWtlIGEgYnVnLi4uIik7CiAgICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAga2V5LmNhbmNlbCgpOwogICAgICAga2V5LmF0dGFjaChudWxsKTsKICAgICAgIG9uRXJyb3IoZSk7CiAgICAgfQogICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBvbkVycm9yKFRocm93YWJsZSBlKSB7Ci0gICAgc3RhdGUgPSBTdGF0ZS5FUlJPUjsKKworICBwcm90ZWN0ZWQgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7CiAgICAgY2xpZW50Lm9uRXJyb3IoZSk7CiAgICAgY2FsbGJhY2sub25FcnJvcihlKTsKKyAgICBzdGF0ZSA9IFN0YXRlLkVSUk9SOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvUmVhZGluZ1Jlc3BvbnNlQm9keShTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTYyLDggKzIzMSwxNCBAQAogICAgIGtleS5pbnRlcmVzdE9wcygwKTsKICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgVEFzeW5jTWV0aG9kIGluc3RhbmNlIGRvZXNuJ3QgaGFuZyBhcm91bmQKICAgICBrZXkuYXR0YWNoKG51bGwpOwotICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7Ci0gICAgY2FsbGJhY2sub25Db21wbGV0ZSgoVCl0aGlzKTsKKyAgICB0cnkgeworICAgICAgVCByZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpOworICAgICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKKyAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUocmVzdWx0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgb25FcnJvcihlKTsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9SZWFkaW5nUmVzcG9uc2VTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE5OSw0ICsyNzQsMTEgQEAKICAgICAgIHN0YXRlID0gU3RhdGUuV1JJVElOR19SRVFVRVNUX0JPRFk7CiAgICAgfQogICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvQ29ubmVjdGluZyhTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICgha2V5LmlzQ29ubmVjdGFibGUoKSB8fCAhdHJhbnNwb3J0LmZpbmlzaENvbm5lY3QoKSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJub3QgY29ubmVjdGFibGUgb3IgZmluaXNoQ29ubmVjdCByZXR1cm5lZCBmYWxzZSBhZnRlciB3ZSBnb3QgYW4gT1BfQ09OTkVDVCIpOworICAgIH0KKyAgICByZWdpc3RlckZvckZpcnN0V3JpdGUoa2V5KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCBiNjM0MjkxLi40NDVmN2U0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKICAgfQogICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzLCBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gbWFwKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcywgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNTUsNyArNTUsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKICAgICBpZiAoIXN0cnVjdE1hcC5jb250YWluc0tleShzQ2xhc3MpKXsgLy8gTG9hZCBjbGFzcyBpZiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQKICAgICAgIHRyeXsKICAgICAgICAgc0NsYXNzLm5ld0luc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuamF2YQppbmRleCAyYWFkNjVkLi4yMTgwYjA4IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmphdmEKQEAgLTMwLDE3ICszMCwyNCBAQAogCiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1R5cGVkZWZUeXBlOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlZGVmTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmluYXJ5OwogCi0gIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlKSB7CisgIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlLCBib29sZWFuIGJpbmFyeSkgewogICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgdGhpcy5pc1R5cGVkZWZUeXBlID0gZmFsc2U7CiAgICAgdGhpcy50eXBlZGVmTmFtZSA9IG51bGw7CisgICAgdGhpcy5pc0JpbmFyeSA9IGJpbmFyeTsKKyAgfQorCisgIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlKSB7CisgICAgdGhpcyh0eXBlLCBmYWxzZSk7CiAgIH0KIAogICBwdWJsaWMgRmllbGRWYWx1ZU1ldGFEYXRhKGJ5dGUgdHlwZSwgU3RyaW5nIHR5cGVkZWZOYW1lKSB7CiAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICB0aGlzLmlzVHlwZWRlZlR5cGUgPSB0cnVlOwogICAgIHRoaXMudHlwZWRlZk5hbWUgPSB0eXBlZGVmTmFtZTsKKyAgICB0aGlzLmlzQmluYXJ5ID0gZmFsc2U7CiAgIH0KIAogICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkZWYoKSB7CkBAIC01OCw0ICs2NSw4IEBACiAgIHB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewogICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKKyAgICByZXR1cm4gaXNCaW5hcnk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcworICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCisgKi8KK2NsYXNzIFNob3J0U3RhY2sgeworCisgIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7CisKKyAgLyoqIEFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgbG9jYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgdG9wID0gMDsKKworICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07CisgIH0KKworICBwdWJsaWMgc2hvcnQgcG9wKCkgeworICAgIHJldHVybiB2ZWN0b3JbLS10b3BdOworICB9CisKKyAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKKyAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3ApIHsKKyAgICAgIGdyb3coKTsKKyAgICB9CisgICAgdmVjdG9yW3RvcCsrXSA9IHB1c2hlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm93KCkgeworICAgIHZlY3RvciA9IEFycmF5cy5jb3B5T2YodmVjdG9yLCB2ZWN0b3IubGVuZ3RoIDw8IDEpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdG9wID0gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgeworICAgICAgYm9vbGVhbiBpc1RvcCA9IChpID09ICh0b3AgLSAxKSk7CisgICAgICBzaG9ydCB2YWx1ZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICB9CisgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI+PiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCI8PCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJdPiIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKaW5kZXggMzdhOWZkOS4uYWJmYzk2NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQpAQCAtNTYsMjQgKzU2LDIzIEBACiAgICAgaWYgKGxlbiA9PSAzKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSArIChzcmNbc3JjT2ZmKzJdID4+IDYpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmKzJdID4+IDYpICYgMHgwMykpOwogICAgICAgZHN0W2RzdE9mZiArIDNdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdChzcmNbc3JjT2ZmKzJdICYgMHgzRik7CiAgICAgfQogICAgIGVsc2UgaWYgKGxlbiA9PSAyKSB7CiAgICAgICBkc3RbZHN0T2ZmKzFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSArIChzcmNbc3JjT2ZmKzFdID4+IDQpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmKzFdIDw8IDIpICYgMHgzRik7Ci0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpOwogICAgIH0KICAgICBlbHNlIHsgLy8gbGVuID09IDEpIHsKICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9Ci0gICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzRik7CisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQppbmRleCA5MTM1NzNiLi43OTI0ZTJmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwpAQCAtMzEsNDQgKzMxLDU5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOwogCi0gIHByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkIGZyb20gdGhlIG5ldHdvcmsgZm9yCisgICAqIGNvbnRhaW5lcnMgKG1hcHMsIHNldHMsIGxpc3RzKSwgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvciB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOworCisgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV87CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5vdXRUZW1wID0gbmV3IGJ5dGVbOF07CiAKICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOworICAgIHByb3RlY3RlZCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKyAgICBwcm90ZWN0ZWQgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOwogCiAgICAgcHVibGljIEZhY3RvcnkoKSB7CiAgICAgICB0aGlzKGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIDApOworICAgICAgdGhpcyhzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSwgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOwogICAgIH0KIAotICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgaW50IHJlYWRMZW5ndGgpIHsKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwogICAgIH0KIAogICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gIT0gMCkgewotICAgICAgICBwcm90by5zZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGhfKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwcm90bzsKKyAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CiAgICAgfQogICB9CiAKQEAgLTgwLDExICs5NSwyMiBAQAogICB9CiAKICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICB0aGlzKHRyYW5zLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgdGhpcyh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgewogICAgIHN1cGVyKHRyYW5zKTsKKyAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOwpAQCAtOTgsMTAwICsxMjQsMTEyIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOwogICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKICAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CiAgICAgd3JpdGVJMzIobWFwLnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGxpc3QuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKHNldC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlIFtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBib3V0WzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYm91dCwgMCwgMSk7CisgICAgaW5vdXRUZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKLSAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKLSAgICB0cmFuc18ud3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDIpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7Ci0gICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7Ci0gICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKLSAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKLSAgICB0cmFuc18ud3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOworICAgIGlub3V0VGVtcFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDQpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOwotICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOwotICAgIGk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOwotICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOwotICAgIGk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7Ci0gICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7Ci0gICAgdHJhbnNfLndyaXRlKGk2NG91dCwgMCwgOCk7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7CisgICAgaW5vdXRUZW1wWzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7CisgICAgaW5vdXRUZW1wWzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7CisgICAgaW5vdXRUZW1wWzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7CisgICAgaW5vdXRUZW1wWzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKKyAgICBpbm91dFRlbXBbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCA4KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVJNjQoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7Ci0gICAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpOworICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpOwogICAgIHdyaXRlSTMyKGxlbmd0aCk7CiAgICAgdHJhbnNfLndyaXRlKGJpbi5hcnJheSgpLCBiaW4ucG9zaXRpb24oKSArIGJpbi5hcnJheU9mZnNldCgpLCBsZW5ndGgpOwogICB9CkBAIC0yMDAsNiArMjM4LDcgQEAKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAgICAgaWYgKHNpemUgPCAwKSB7CkBAIC0yMTYsNTggKzI1NSw3NiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgdHlwZSA9IHJlYWRCeXRlKCk7CiAgICAgc2hvcnQgaWQgPSB0eXBlID09IFRUeXBlLlNUT1AgPyAwIDogcmVhZEkxNigpOwogICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRNYXAgbWFwID0gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobWFwLnNpemUpOworICAgIHJldHVybiBtYXA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFRMaXN0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChsaXN0LnNpemUpOworICAgIHJldHVybiBsaXN0OwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVFNldCBzZXQgPSBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChzZXQuc2l6ZSk7CisgICAgcmV0dXJuIHNldDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMSkgewogICAgICAgYnl0ZSBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgICAgcmV0dXJuIGI7CiAgICAgfQotICAgIHJlYWRBbGwoYmluLCAwLCAxKTsKLSAgICByZXR1cm4gYmluWzBdOworICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAxKTsKKyAgICByZXR1cm4gaW5vdXRUZW1wWzBdOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2cmQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMTZyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMikgewpAQCAtMjc1LDcgKzMzMiw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkxNnJkLCAwLCAyKTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAyKTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTI4NCw5ICszNDEsOSBAQAogICAgICAgICgoYnVmW29mZisxXSAmIDB4ZmYpKSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMzJyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gNCkgewpAQCAtMjk0LDcgKzM1MSw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDQpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA0KTsKICAgICB9CiAgICAgcmV0dXJuCiAgICAgICAoKGJ1ZltvZmZdICYgMHhmZikgPDwgMjQpIHwKQEAgLTMwMyw5ICszNjAsOSBAQAogICAgICAgKChidWZbb2ZmKzNdICYgMHhmZikpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0cmQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGk2NHJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSA4KSB7CkBAIC0zMTMsNyArMzcwLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTY0cmQsIDAsIDgpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDgpOwogICAgIH0KIAogICAgIHJldHVybgpAQCAtMzI3LDQwICszODQsMzkgQEAKICAgICAgICgobG9uZykoYnVmW29mZis3XSAmIDB4ZmYpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRJNjQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOworCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUsICJVVEYtOCIpOwotICAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBzaXplLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOworICAgICAgcmV0dXJuIHM7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KHNpemUpOwogICB9CiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7Ci0gICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOworCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewogICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplKTsKQEAgLTM3MywyNiArNDI5LDI5IEBACiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWYpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkgewotICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOwotICAgIH0KLSAgICBpZiAoY2hlY2tSZWFkTGVuZ3RoXykgewotICAgICAgcmVhZExlbmd0aF8gLT0gbGVuZ3RoOwotICAgICAgaWYgKHJlYWRMZW5ndGhfIDwgMCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIgKyBsZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgfQotCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDRjMmNmYzAuLmVlMDU4NjkKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMiwyMSArMjIsMjUgQEAKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCiAgKiBUQ29tcGFjdFByb3RvY29sMiBpcyB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcGFjdCBwcm90b2NvbCBzcGVjaWZpZWQKLSAqIGluIFRIUklGVC0xMTAuIFRoZSBmdW5kYW1lbnRhbCBhcHByb2FjaCB0byByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgCisgKiBpbiBUSFJJRlQtMTEwLiBUaGUgZnVuZGFtZW50YWwgYXBwcm9hY2ggdG8gcmVkdWNpbmcgdGhlIG92ZXJoZWFkIG9mCiAgKiBzdHJ1Y3R1cmVzIGlzIGEpIHVzZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBiKSBtYWtlCi0gKiB1c2Ugb2YgdW51c2VkIGJpdHMgd2hlcmV2ZXIgcG9zc2libGUuIFlvdXIgc2F2aW5ncyB3aWxsIG9idmlvdXNseSB2YXJ5IAotICogYmFzZWQgb24gdGhlIHNwZWNpZmljIG1ha2V1cCBvZiB5b3VyIHN0cnVjdHMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgbW9yZSAKKyAqIHVzZSBvZiB1bnVzZWQgYml0cyB3aGVyZXZlciBwb3NzaWJsZS4gWW91ciBzYXZpbmdzIHdpbGwgb2J2aW91c2x5IHZhcnkKKyAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBtYWtldXAgb2YgeW91ciBzdHJ1Y3RzLCBidXQgaW4gZ2VuZXJhbCwgdGhlIG1vcmUKICAqIGZpZWxkcywgbmVzdGVkIHN0cnVjdHVyZXMsIHNob3J0IHN0cmluZ3MgYW5kIGNvbGxlY3Rpb25zLCBhbmQgbG93LXZhbHVlIGkzMgogICogYW5kIGk2NCBmaWVsZHMgeW91IGhhdmUsIHRoZSBtb3JlIGJlbmVmaXQgeW91J2xsIHNlZS4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gRU1QVFlfQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQnl0ZUJ1ZmZlciBFTVBUWV9CVUZGRVIgPSBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURVMpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9fTEVOR1RIX0xJTUlUID0gLTE7CiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOwogICBwcml2YXRlIGZpbmFsIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAoc2hvcnQpMCk7CkBAIC02MiwxMCArNjYsMjQgQEAKICAgICogVFByb3RvY29sRmFjdG9yeSB0aGF0IHByb2R1Y2VzIFRDb21wYWN0UHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gICAgcHVibGljIEZhY3RvcnkoKSB7fQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdF87CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgICAgdGhpcyhOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCk7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcyhzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICAgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB9CiAKICAgICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKLSAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ0xlbmd0aExpbWl0XywgY29udGFpbmVyTGVuZ3RoTGltaXRfKTsKICAgICB9CiAgIH0KIApAQCAtNzMsNiArOTEsNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAxOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfTUFTSyA9IChieXRlKTB4RTA7IC8vIDExMTAgMDAwMAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAogICAvKioKQEAgLTkzLDcgKzExMiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUUlVDVCAgICAgICAgID0gMHgwQzsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCiAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCiAgICAqLwpAQCAtMTAyLDI0ICsxMjEsNzEgQEAKICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCiAgIC8qKgotICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4gCisgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgogICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCiAgICAqLwogICBwcml2YXRlIFRGaWVsZCBib29sZWFuRmllbGRfID0gbnVsbDsKIAogICAvKioKLSAgICogSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuIAorICAgKiBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCiAgICAqLwogICBwcml2YXRlIEJvb2xlYW4gYm9vbFZhbHVlXyA9IG51bGw7CiAKICAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZCBmcm9tIHRoZSBuZXR3b3JrIGZvcgorICAgKiBjb250YWluZXJzIChtYXBzLCBzZXRzLCBsaXN0cyksIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IgdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAvKioKKyAgICogVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVxdWlyZSBhCisgICAqIHNtYWxsIGFsbG9jYXRpb24uCisgICAqLworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbMTBdOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCisgICAqIEBwYXJhbSBzdHJpbmdMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmb3IKKyAgICogICAgIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuCisgICAqIEBwYXJhbSBjb250YWluZXJMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAorICAgKiAgICAgZm9yIGNvbnRhaW5lcnMuCisgICAqLworICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIFRUcmFuc3BvcnQgb2JqZWN0IHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KKyAgICogQHBhcmFtIHN0cmluZ0xlbmd0aExpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZvcgorICAgKiAgICAgdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4KKyAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIHNwZWNpZnlpbmcgYm90aCBzdHJpbmcgbGltaXQgYW5kIGNvbnRhaW5lciBsaW1pdCBpbnN0ZWFkCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgIHRoaXModHJhbnNwb3J0LCBzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgfQorCisgIC8qKgogICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgogICAgKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCiAgICAqLwogICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewotICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcyh0cmFuc3BvcnQsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTM2LDYgKzIwMiw3IEBACiAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwpAQCAtMTQ0LDEwICsyMTEsMTEgQEAKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgCisgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0xNjQsMTAgKzIzMiwxMCBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAogICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCiAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAqLyAKKyAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CiAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMTc4LDggKzI0Niw4IEBACiAgIH0KIAogICAvKioKLSAgICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAorICAgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQogICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjEwLDcgKzI3OCw3IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUgCisgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCiAgICAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTIyMSw4ICsyODksOCBAQAogICAgICAgd3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLnZhbHVlVHlwZSkpOwogICAgIH0KICAgfQotICAKLSAgLyoqIAorCisgIC8qKgogICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjM3LDkgKzMwNSw5IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluIAorICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KICAgICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLiAKKyAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgogICAgKiBPdGhlcndpc2UsIHdyaXRlIGEgc2luZ2xlIGJ5dGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yNTMsNyArMzIxLDcgQEAKICAgICB9CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yODMsMzAgKzM1MSwyNSBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICAgKi8gCisgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgZGF0YSwgMCk7Ci0gICAgdHJhbnNfLndyaXRlKGRhdGEpOworICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgdGVtcCwgMCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDgpOwogICB9CiAKICAgLyoqCi0gICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgorICAgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkISIpOwotICAgIH0KKyAgICBieXRlW10gYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVCaW5hcnkoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuIAorICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKTsKKyAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKTsKICAgICB3cml0ZUJpbmFyeShiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwgbGVuZ3RoKTsKICAgfQogCkBAIC0zMTYsOSArMzc5LDkgQEAKICAgfQogCiAgIC8vCi0gIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZSAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlCiAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgotICAvLyAKKyAgLy8KIAogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CkBAIC0zMzEsNyArMzk0LDcgQEAKICAgLy8KIAogICAvKioKLSAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbiAKKyAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgogICAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCiAgICAqLwogICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbGxlY3Rpb25CZWdpbihieXRlIGVsZW1UeXBlLCBpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMzQ3LDQ0ICs0MTAsNDIgQEAKICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KICAgICogVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSB3cml0ZVZhcmludDY0PwogICAgKi8KLSAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOwogICBwcml2YXRlIHZvaWQgd3JpdGVWYXJpbnQzMihpbnQgbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBpZHggPSAwOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgewotICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSluOwogICAgICAgICAvLyB3cml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAvLyByZXR1cm47CiAgICAgICB9IGVsc2UgewotICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOwogICAgICAgICAvLyB3cml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CiAgICAgICAgIG4gPj4+PSA3OwogICAgICAgfQogICAgIH0KLSAgICB0cmFuc18ud3JpdGUoaTMyYnVmLCAwLCBpZHgpOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCBpZHgpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgogICAgKi8KLSAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOwogICBwcml2YXRlIHZvaWQgd3JpdGVWYXJpbnQ2NChsb25nIG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gMDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChieXRlKW47CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpbjsKICAgICAgICAgYnJlYWs7CiAgICAgICB9IGVsc2UgewotICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgIHRlbXBbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOwogICAgICAgICBuID4+Pj0gNzsKICAgICAgIH0KICAgICB9Ci0gICAgdHJhbnNfLndyaXRlKHZhcmludDY0b3V0LCAwLCBpZHgpOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCBpZHgpOwogICB9CiAKICAgLyoqCi0gICAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgCisgICAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgogICAgKi8KICAgcHJpdmF0ZSBsb25nIGxvbmdUb1ppZ3phZyhsb25nIGwpIHsKQEAgLTM5Miw3ICs0NTMsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSAKKyAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCiAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KICAgICovCiAgIHByaXZhdGUgaW50IGludFRvWmlnWmFnKGludCBuKSB7CkBAIC00MDAsNyArNDYxLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgCisgICAqIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZwogICAgKiB1bnRpbCBvZmYrNy4KICAgICovCiAgIHByaXZhdGUgdm9pZCBmaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikgewpAQCAtNDE0LDMwICs0NzUsMjkgQEAKICAgICBidWZbb2ZmKzddID0gKGJ5dGUpKChuID4+IDU2KSAmIDB4ZmYpOwogICB9CiAKLSAgLyoqIAotICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLiAKKyAgLyoqCisgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgogICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgogICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gYnl0ZURpcmVjdEJ1ZmZlciA9IG5ldyBieXRlWzFdOwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICB0ZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgMSk7CiAgIH0KIAotICAvKiogCi0gICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2libGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgIC8qKgorICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICovCiAgIHByaXZhdGUgdm9pZCB3cml0ZUJ5dGVEaXJlY3QoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CiAgIH0KIAogCi0gIC8vIAorICAvLwogICAvLyBSZWFkaW5nIG1ldGhvZHMuCi0gIC8vIAorICAvLwogCiAgIC8qKgotICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuIAorICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAqLwogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOwpAQCAtNDQ5LDcgKzUwOSw3IEBACiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CiAgICAgfQotICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOwogICAgIGludCBzZXFpZCA9IHJlYWRWYXJpbnQzMigpOwogICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IHJlYWRTdHJpbmcoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC00NjYsMTYgKzUyNiwxNiBAQAogICB9CiAKICAgLyoqCi0gICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yIAorICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgogICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KICAgICovCiAgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSByZWFkIG9mZiB0aGUgd2lyZS4KICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOwogICB9Ci0gIAorCiAgIC8qKgotICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gCisgICAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwpAQCAtNTAzLDI2ICs1NjMsMjcgQEAKICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgewogICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCiAgICAgICBib29sVmFsdWVfID0gKGJ5dGUpKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0gCisgICAgfQogCiAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCiAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CiAgICAgcmV0dXJuIGZpZWxkOwogICB9CiAKLSAgLyoqIAorICAvKioKICAgICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQogICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQogICAgKiAiY29ycmVjdCIgdHlwZXMuCiAgICAqLwogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAwIDogcmVhZEJ5dGUoKTsKICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTMzLDEyICs1OTQsMTMgQEAKICAgICBpZiAoc2l6ZSA9PSAxNSkgewogICAgICAgc2l6ZSA9IHJlYWRWYXJpbnQzMigpOwogICAgIH0KKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSB0eXBlID0gZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSk7CiAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCiAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTYxLDcgKzYyMyw2IEBACiAgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOwogICB9CiAKLSAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKICAgLyoqCiAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KICAgICovCkBAIC01NzEsOCArNjMyLDggQEAKICAgICAgIGIgPSB0cmFuc18uZ2V0QnVmZmVyKClbdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCldOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOwotICAgICAgYiA9IGJ5dGVSYXdCdWZbMF07CisgICAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCAxKTsKKyAgICAgIGIgPSB0ZW1wWzBdOwogICAgIH0KICAgICByZXR1cm4gYjsKICAgfQpAQCAtNjAyLDkgKzY2Myw4IEBACiAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwotICAgIHRyYW5zXy5yZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCA4KTsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcodGVtcCkpOwogICB9CiAKICAgLyoqCkBAIC02MTIsMzAgKzY3MiwzNiBAQAogICAgKi8KICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKIAogICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIHRyeSB7Ci0gICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgIlVURi04Iik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKKyAgICBmaW5hbCBTdHJpbmcgc3RyOworICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgeworICAgICAgc3RyID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIGxlbmd0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgPSBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgfQorICAgIHJldHVybiBzdHI7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLiAKKyAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CVUZGRVI7CisKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoKTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7CisgICAgICByZXR1cm4gYmI7CisgICAgfQogCiAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOwpAQCAtNjQzLDE4ICs3MDksNDAgQEAKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuIAorICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCiAgICAqLwogICBwcml2YXRlIGJ5dGVbXSByZWFkQmluYXJ5KGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CWVRFUzsKIAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKICAgICByZXR1cm4gYnVmOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZSAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQogICAvLyBlbmNvZGluZy4KICAgLy8KICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtNjk4LDcgKzc4Niw3IEBACiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKKyAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAogICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHJlYWRWYXJpbnQ2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTczOCw3ICs4MjYsNyBAQAogICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyhsb25nIG4pIHsKQEAgLTc0Niw3ICs4MzQsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKKyAgICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCiAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCiAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCiAgICAqLwpAQCAtNzcyLDcgKzg2MCw3IEBACiAgIH0KIAogICAvKioKLSAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIAorICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKICAgICogVFR5cGUgdmFsdWUuCiAgICAqLwogICBwcml2YXRlIGJ5dGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQppbmRleCAwM2FmZmRhLi4zMTMzMWJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCkBAIC00Miw3ICs0MiwyNSBAQAogICAgIHJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgbmFtZSArICInIHR5cGU6IiArIHR5cGUgKyAiIGZpZWxkLWlkOiIgKyBpZCArICI+IjsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhURmllbGQgb3RoZXJGaWVsZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGlkOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVEZpZWxkIG90aGVyRmllbGQgPSAoVEZpZWxkKSBvYmo7CiAgICAgcmV0dXJuIHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlICYmIGlkID09IG90aGVyRmllbGQuaWQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGQwMDk4MGUuLmQzN2M0OTMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTQyLDkgKzQ0LDE2IEBACiAgICAqIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cwogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBmaWVsZE5hbWVzQXNTdHJpbmcpIHsKKyAgICAgIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmaWVsZE5hbWVzQXNTdHJpbmc7CisgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zLCBmaWVsZE5hbWVzQXNTdHJpbmdfKTsKICAgICB9CiAKICAgfQpAQCAtNzAsMTAgKzc5LDEwIEBACiAgICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgogICB9OwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfQ0hBUlMgPSAiXCJcXGJmbnJ0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9ICJcIlxcL2JmbnJ0IjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLSAgICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCiAgIH07CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKQEAgLTI4NSw2ICsyOTQsOSBAQAogICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICBwcml2YXRlIExvb2thaGVhZFJlYWRlciByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigpOwogCisgIC8vIFdyaXRlIG91dCB0aGUgVEZpZWxkIG5hbWVzIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgaW50ZWdlciB2YWx1ZQorICBwcml2YXRlIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCiAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgogICBwcml2YXRlIHZvaWQgcHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpIHsKICAgICBjb250ZXh0U3RhY2tfLnB1c2goY29udGV4dF8pOwpAQCAtMjk2LDYgKzMwOCwxMyBAQAogICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5wb3AoKTsKICAgfQogCisgIC8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7CisgICAgd2hpbGUgKCFjb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wQ29udGV4dCgpOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KQEAgLTMwMyw2ICszMjIsMTEgQEAKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZykgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgICBmaWVsZE5hbWVzQXNTdHJpbmdfID0gZmllbGROYW1lc0FzU3RyaW5nOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKQEAgLTMxMyw3ICszMzcsNyBAQAogICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCiAgIHByaXZhdGUgYnl0ZVtdIHRtcGJ1Zl8gPSBuZXcgYnl0ZVs0XTsKIAotICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y3BldGlvbiBpcyB0aHJvd24uCisgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgLy8gTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LnJlYWQKICAgLy8gYW5kIEpTT05QYWlyQ29udGV4dC5yZWFkCiAgIHByb3RlY3RlZCB2b2lkIHJlYWRKU09OU3ludGF4Q2hhcihieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMzMxLDcgKzM1NSw3IEBACiAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKICAgICB9CiAgICAgZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKLSAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyArIDEwKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCkBAIC0zNDYsNyArMzcwLDcgQEAKICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICdhJyk7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKSh2YWwgLSAxMCkgKyAnYScpOwogICAgIH0KICAgfQogCkBAIC0zOTQsMTIgKzQxOCw4IEBACiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYnVmKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9CkBAIC00MjEsMTggKzQ0MSwxNiBAQAogICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKICAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAogICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTQ4NCwxNCArNTAyLDExIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldENvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnR5cGUpOwogICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5zZXFpZCk7CiAgIH0KQEAgLTUxMyw3ICs1MjgsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlSlNPTkludGVnZXIoZmllbGQuaWQpOworICAgIGlmIChmaWVsZE5hbWVzQXNTdHJpbmdfKSB7CisgICAgICB3cml0ZVN0cmluZyhmaWVsZC5uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVKU09OSW50ZWdlcihmaWVsZC5pZCk7CisgICAgfQogICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CiAgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLnR5cGUpKTsKICAgfQpAQCAtNTk3LDEyICs2MTYsOCBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC02MTksNiArNjM0LDcgQEAKICAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlYWRKU09OU3RyaW5nKGJvb2xlYW4gc2tpcENvbnRleHQpCiAgICAgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBBcnJheUxpc3Q8Q2hhcmFjdGVyPiBjb2RldW5pdHMgPSBuZXcgQXJyYXlMaXN0PENoYXJhY3Rlcj4oKTsKICAgICBpZiAoIXNraXBDb250ZXh0KSB7CiAgICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgfQpAQCAtNjMxLDEwICs2NDcsNDEgQEAKICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKICAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgewotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgMik7Ci0gICAgICAgICAgY2ggPSAoYnl0ZSkoKGhleFZhbCgoYnl0ZSl0bXBidWZfWzBdKSA8PCA0KSArIGhleFZhbCh0bXBidWZfWzFdKSk7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgNCk7CisgICAgICAgICAgc2hvcnQgY3UgPSAoc2hvcnQpKAorICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgKHNob3J0KWhleFZhbCh0bXBidWZfWzNdKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb2RldW5pdHMuYWRkKChjaGFyKWN1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgICBhcnIud3JpdGUoCisgICAgICAgICAgICAgICAgICAobmV3IFN0cmluZyhuZXcgaW50W10geyBjb2RldW5pdHMuZ2V0KDApLCBjb2RldW5pdHMuZ2V0KDEpIH0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMikpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGN1IH0sIDAsIDEpKQorICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSIpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICBpbnQgb2ZmID0gRVNDQVBFX0NIQVJTLmluZGV4T2YoY2gpOwpAQCAtNzEyLDE5ICs3NTksMTQgQEAKICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgaWYgKHJlYWRlcl8ucGVlaygpID09IFFVT1RFWzBdKSB7CiAgICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKHRydWUpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZygiVVRGLTgiKSk7Ci0gICAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpICYmCi0gICAgICAgICAgICAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgewotICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQotICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkdWI7CisgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpCisgICAgICAgICAgJiYgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwogICAgICAgfQotICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICByZXR1cm4gZHViOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgewpAQCAtNzQ4LDYgKzc5MCwxMSBAQAogICAgIGludCBsZW4gPSBhcnIubGVuKCk7CiAgICAgaW50IG9mZiA9IDA7CiAgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CiAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKQEAgLTc5MiwxOCArODM5LDEzIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOwogICAgIGlmIChyZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKSB7CiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwogICAgIH0KLSAgICBTdHJpbmcgbmFtZTsKLSAgICB0cnkgewotICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBTdHJpbmcgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBieXRlIHR5cGUgPSAoYnl0ZSkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgaW50IHNlcWlkID0gKGludCkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC05MjAsMTIgKzk2Miw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCmluZGV4IDE0MzhiMTEuLmYxM2I4Y2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCkBAIC00NCwxNCArNDQsMzMgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0gICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVE1lc3NhZ2UpIHsKLSAgICAgIHJldHVybiBlcXVhbHMoKFRNZXNzYWdlKSBvdGhlcik7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgc2VxaWQ7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICByZXR1cm4gbmFtZS5lcXVhbHMob3RoZXIubmFtZSkgJiYgdHlwZSA9PSBvdGhlci50eXBlICYmIHNlcWlkID09IG90aGVyLnNlcWlkOworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVE1lc3NhZ2Ugb3RoZXIgPSAoVE1lc3NhZ2UpIG9iajsKKyAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubmFtZSAhPSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNlcWlkICE9IG90aGVyLnNlcWlkKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiA8cD5OT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2Uge0BsaW5rIG9yZy5hcGFjaGUudGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3J9IHRvIGhhbmRsZSByZXF1ZXN0cworICogZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogPHA+VGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqIDxwcmU+CisgKiB7QGNvZGUKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRGVjb3JhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisKKyAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRTsKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworICAgICAgICBzdXBlcihwcm90b2NvbCk7CisgICAgICAgIFNFUlZJQ0VfTkFNRSA9IHNlcnZpY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdE1lc3NhZ2UgVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIFBhc3NlZCB0aHJvdWdoIGZyb20gd3JhcHBlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0TWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIHx8IHRNZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX05BTUUgKyBTRVBBUkFUT1IgKyB0TWVzc2FnZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS5zZXFpZAorICAgICAgICAgICAgKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEKaW5kZXggMTZmYWM2NC4uMGU5NjM2OCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCkBAIC0xNTAsNCArMTUyLDExIEBACiAgICAqIGJlIGltcGxlbWVudGVkIGZvciBzdGF0ZWZ1bCBwcm90b2NvbHMuCiAgICAqLwogICBwdWJsaWMgdm9pZCByZXNldCgpIHt9CisgIAorICAvKioKKyAgICogU2NoZW1lIGFjY2Vzc29yCisgICAqLworICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElTY2hlbWU+IGdldFNjaGVtZSgpIHsKKyAgICByZXR1cm4gU3RhbmRhcmRTY2hlbWUuY2xhc3M7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI5Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiA8cD5TZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pPC9wPgorICogCisgKiBAc2VlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUUHJvdG9jb2wgY29uY3JldGVQcm90b2NvbDsKKworICAgIC8qKgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkgeworICAgICAgICBzdXBlcihwcm90b2NvbC5nZXRUcmFuc3BvcnQoKSk7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSB0TWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKHRNZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRTdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKHRTdHJ1Y3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCB0RmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkQmVnaW4odEZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCB0TWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBCZWdpbih0TWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IHRMaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0QmVnaW4odExpc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgdFNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0QmVnaW4odFNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCb29sKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUJ5dGUoYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTE2KGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVJMzIoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBsKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVJNjQobCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHYpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZURvdWJsZSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RyaW5nKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYnVmKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCaW5hcnkoYnVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkSTE2KCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkSTMyKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEk2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZERvdWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRCaW5hcnkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKaW5kZXggMjQ4ODE1Yi4uODcwZjFiOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQpAQCAtMzUsNiArMzUsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0xJTUlUID0gMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1ZFUlNJT04gPSA0OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVBUSF9MSU1JVCA9IDY7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCmluZGV4IDliZjEwZjYuLmNkYWEzMGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgogICAgKgogICAgKiBAcGFyYW0gcHJvdCAgdGhlIHByb3RvY29sIG9iamVjdCB0byByZWFkIGZyb20KLSAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgogICAgKi8KICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoVFByb3RvY29sIHByb3QsIGJ5dGUgdHlwZSkKICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC02NCw3ICs2NCw3IEBACiAgICAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCiAgICAqCiAgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQotICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCisgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCiAgICAqIEBwYXJhbSBtYXhEZXB0aCAgdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgc2tpcCBjb21wbGV4IG9iamVjdHMgdG8gdGhpcwogICAgKiAgIHJlY3Vyc2l2ZSBkZXB0aCwgdG8gcHJldmVudCBKYXZhIHN0YWNrIG92ZXJmbG93LgogICAgKi8KQEAgLTc0LDQzICs3NCwzNSBAQAogICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk1heGltdW0gc2tpcCBkZXB0aCBleGNlZWRlZCIpOwogICAgIH0KICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlLkJPT0w6Ci0gICAgICB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CiAgICAgICAgIHByb3QucmVhZEJvb2woKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5CWVRFOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CiAgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5JMTY6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgogICAgICAgICBwcm90LnJlYWRJMTYoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5JMzI6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgogICAgICAgICBwcm90LnJlYWRJMzIoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5JNjQ6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgogICAgICAgICBwcm90LnJlYWRJNjQoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5ET1VCTEU6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgogICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5TVFJJTkc6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgogICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5TVFJVQ1Q6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgogICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKQEAgLTEyMiw5ICsxMTQsOCBAQAogICAgICAgICB9CiAgICAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOwogICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlLk1BUDoKLSAgICAgIHsKKworICAgICAgY2FzZSBUVHlwZS5NQVA6CiAgICAgICAgIFRNYXAgbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgc2tpcChwcm90LCBtYXAua2V5VHlwZSwgbWF4RGVwdGggLSAxKTsKQEAgLTEzMiwyNyArMTIzLDk5IEBACiAgICAgICAgIH0KICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuU0VUOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLlNFVDoKICAgICAgICAgVFNldCBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5zaXplOyBpKyspIHsKICAgICAgICAgICBza2lwKHByb3QsIHNldC5lbGVtVHlwZSwgbWF4RGVwdGggLSAxKTsKICAgICAgICAgfQogICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5MSVNUOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkxJU1Q6CiAgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemU7IGkrKykgewogICAgICAgICAgIHNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSwgbWF4RGVwdGggLSAxKTsKICAgICAgICAgfQogICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUgIiArIHR5cGUpOwogICAgIH0KICAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0IHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wgdXNlZCB0byBzZXJpYWxpemUgc29tZSBkYXRhLgorICAgKgorICAgKiBUaGUgZ3Vlc3MgaXMgYmFzZWQgb24ga25vd24gc3BlY2lmaWNpdGllcyBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzLgorICAgKiBJbiBzb21lIGNhc2VzLCBubyBndWVzcyBjYW4gYmUgZG9uZSwgaW4gdGhhdCBjYXNlIHdlIHJldHVybiB0aGUKKyAgICogZmFsbGJhY2sgVFByb3RvY29sRmFjdG9yeS4KKyAgICogVG8gYmUgY2VydGFpbiB0byBjb3JyZWN0bHkgZGV0ZWN0IHRoZSBwcm90b2NvbCwgdGhlIGZpcnN0IGVuY29kZWQKKyAgICogZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCAmbHQ7IDI1NgorICAgKgorICAgKiBAcGFyYW0gZGF0YSBUaGUgc2VyaWFsaXplZCBkYXRhIHRvIGd1ZXNzIHRoZSBwcm90b2NvbCBmb3IuCisgICAqIEBwYXJhbSBmYWxsYmFjayBUaGUgVFByb3RvY29sIHRvIHJldHVybiBpZiBubyBndWVzcyBjYW4gYmUgbWFkZS4KKyAgICogQHJldHVybiBhIENsYXNzIGltcGxlbWVudGluZyBUUHJvdG9jb2xGYWN0b3J5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGRlc2VyaWFsaXplci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVFByb3RvY29sRmFjdG9yeSBndWVzc1Byb3RvY29sRmFjdG9yeShieXRlW10gZGF0YSwgVFByb3RvY29sRmFjdG9yeSBmYWxsYmFjaykgeworICAgIC8vCisgICAgLy8gSWYgdGhlIGZpcnN0IGFuZCBsYXN0IGJ5dGVzIGFyZSBvcGVuaW5nL2Nsb3NpbmcgY3VybHkgYnJhY2VzIHdlIGd1ZXNzIHRoZSBwcm90b2NvbCBhcworICAgIC8vIGJlaW5nIFRKU09OUHJvdG9jb2wuCisgICAgLy8gSXQgY291bGQgbm90IGJlIGEgVENvbXBhY3RCaW5hcnkgZW5jb2RpbmcgZm9yIGEgZmllbGQgb2YgdHlwZSAweGIgKE1hcCkKKyAgICAvLyB3aXRoIGRlbHRhIGlkIDcgYXMgdGhlIGxhc3QgYnl0ZSBmb3IgVENvbXBhY3RCaW5hcnkgaXMgYWx3YXlzIDAuCisgICAgLy8KKworICAgIGlmICgneycgPT0gZGF0YVswXSAmJiAnfScgPT0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdKSB7CisgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIGxhc3QgYnl0ZSBpcyBub3QgMCwgdGhlbiBpdCBjYW5ub3QgYmUgVENvbXBhY3RQcm90b2NvbCwgaXQgbXVzdCBiZQorICAgIC8vIFRCaW5hcnlQcm90b2NvbC4KKyAgICAvLworCisgICAgaWYgKGRhdGFbZGF0YS5sZW5ndGggLSAxXSAhPSAwKSB7CisgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBIGZpcnN0IGJ5dGUgb2YgdmFsdWUgPiAxNiBpbmRpY2F0ZXMgVENvbXBhY3RQcm90b2NvbCB3YXMgdXNlZCwgYW5kIHRoZSBmaXJzdCBieXRlCisgICAgLy8gZW5jb2RlcyBhIGRlbHRhIGZpZWxkIGlkIChpZCA8PSAxNSkgYW5kIGEgZmllbGQgdHlwZS4KKyAgICAvLworCisgICAgaWYgKGRhdGFbMF0gPiAweDEwKSB7CisgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIHNlY29uZCBieXRlIGlzIDAgdGhlbiBpdCBpcyBhIGZpZWxkIGlkIDwgMjU2IGVuY29kZWQgYnkgVEJpbmFyeVByb3RvY29sLgorICAgIC8vIEl0IGNhbm5vdCBwb3NzaWJseSBiZSBUQ29tcGFjdFByb3RvY29sIHNpbmNlIGEgdmFsdWUgb2YgMCB3b3VsZCBpbXBseSBhIGZpZWxkIGlkCisgICAgLy8gb2YgMCBhcyB0aGUgemlnIHphZyB2YXJpbnQgZW5jb2Rpbmcgd291bGQgZW5kLgorICAgIC8vCisKKyAgICBpZiAoZGF0YS5sZW5ndGggPiAxICYmIDAgPT0gZGF0YVsxXSkgeworICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgYml0IDcgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpZWxkIGlkIGlzIHNldCB0aGVuIHdlIGhhdmUgdHdvIGNob2ljZXM6CisgICAgLy8gMS4gQSBmaWVsZCBpZCA+IDYzIHdhcyBlbmNvZGVkIHdpdGggVENvbXBhY3RQcm90b2NvbC4KKyAgICAvLyAyLiBBIGZpZWxkIGlkID4gMHg3ZmZmICgzMjc2Nykgd2FzIGVuY29kZWQgd2l0aCBUQmluYXJ5UHJvdG9jb2wgYW5kIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCisgICAgLy8gICAgc2VyaWFsaXplZCBkYXRhIGlzIDAuCisgICAgLy8gT3B0aW9uIDIgaXMgaW1wb3NzaWJsZSBzaW5jZSBmaWVsZCBpZHMgYXJlIHNob3J0IGFuZCB0aHVzIGxpbWl0ZWQgdG8gMzI3NjcuCisgICAgLy8KKworICAgIGlmIChkYXRhLmxlbmd0aCA+IDEgJiYgKGRhdGFbMV0gJiAweDgwKSAhPSAwKSB7CisgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlIHJlbWFpbmluZyBjYXNlIGlzIGVpdGhlciBhIGZpZWxkIGlkIDw9IDYzIGVuY29kZWQgYXMgVENvbXBhY3RQcm90b2NvbCwKKyAgICAvLyBvbmUgPj0gMjU2IGVuY29kZWQgd2l0aCBUQmluYXJ5UHJvdG9jb2wgd2l0aCBhIGxhc3QgYnl0ZSBhdCAwLCBvciBhbiBlbXB0eSBzdHJ1Y3R1cmUuCisgICAgLy8gQXMgd2UgY2Fubm90IHJlYWxseSBkZWNpZGUsIHdlIHJldHVybiB0aGUgZmFsbGJhY2sgcHJvdG9jb2wuCisgICAgLy8KKyAgICByZXR1cm4gZmFsbGJhY2s7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDgzYTI1MzIuLmViN2UyM2IgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC00NSwxMyArNDUsMTMgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geycsJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNFID0gbmV3IGJ5dGVbXSB7J3snfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7J30nfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0tFVCA9IG5ldyBieXRlW10geyddJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7JywnfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyd7J307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsnfSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnXSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCBBTk9OWU1PVVNfRklFTEQgPSBuZXcgVEZpZWxkKCk7CkBAIC01OSw5ICs1OSwxNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU2V0IEVNUFRZX1NFVCA9IG5ldyBUU2V0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRMaXN0IEVNUFRZX0xJU1QgPSBuZXcgVExpc3QoKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVE1hcCBFTVBUWV9NQVAgPSBuZXcgVE1hcCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVCA9ICJsaXN0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQID0gIm1hcCI7CiAKICAgcHJvdGVjdGVkIGNsYXNzIENvbnRleHQgewogICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGtleSBpbiBhIG1hcAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWFwS2V5KCkgeyByZXR1cm4gIGZhbHNlOyB9CiAgIH0KIAogICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHsKQEAgLTkxLDYgKzk5LDIyIEBACiAgICAgfQogICB9CiAKKyAgcHJvdGVjdGVkIGNsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0IHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleSA9IHRydWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLndyaXRlKCk7CisgICAgICBpc0tleSA9ICFpc0tleTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcEtleSgpIHsKKyAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICByZXR1cm4gaXNLZXk7CisgICAgfQorICB9CisKICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgQkFTRV9DT05URVhUID0gbmV3IENvbnRleHQoKTsKIAogICAvKioKQEAgLTExOSwxMyArMTQzLDMzIEBACiAgIH0KIAogICAvKioKKyAgICogUmVzZXQgdGhlIHdyaXRlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCByZXNldFdyaXRlQ29udGV4dCgpIHsKKyAgICB3aGlsZSAoIXdyaXRlQ29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcFdyaXRlQ29udGV4dCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZW5jb3VudGVyaW5nIGEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnRhaW5lcnMKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTdHJpbmcgaW52YWxpZEtleVR5cGUpIHRocm93cyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIHsKKyAgICBpZiAod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiICsgaW52YWxpZEtleVR5cGUpOworICAgIH0KKyAgfQorCisgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KICAgcHVibGljIFRTaW1wbGVKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewogICAgIHN1cGVyKHRyYW5zKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRXcml0ZUNvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CkBAIC0xMzMsMTAzICsxNzcsMTMzIEBACiAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBOb3RlIHRoYXQgZXh0cmEgdHlwZSBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGluIEpTT04hCiAgICAgd3JpdGVTdHJpbmcoZmllbGQubmFtZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShNQVApOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKLSAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOworICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShMSVNUKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KFNFVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGkxNik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKLSAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBfd3JpdGVTdHJpbmdEYXRhKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB3cml0ZVN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7CiAgICAgfQogICB9CiAKKyAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYik7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7Ci0gICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIH0KICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwotICAgIF93cml0ZVN0cmluZ0RhdGEoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwpAQCAtMjY0LDcgKzMzOCw3IEBACiAgICAgICAgIGVzY2FwZS5hcHBlbmQoJ3QnKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICAvLyBDb250cm9sIGNoYXJhY2V0ZXJzISBBY2NvcmRpbmcgdG8gSlNPTiBSRkMgdTAwMjAgKHNwYWNlKQorICAgICAgICAvLyBDb250cm9sIGNoYXJhY3RlcnMhIEFjY29yZGluZyB0byBKU09OIFJGQyB1MDAyMCAoc3BhY2UpCiAgICAgICAgIGlmIChjIDwgJyAnKSB7CiAgICAgICAgICAgU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7CiAgICAgICAgICAgZXNjYXBlLmFwcGVuZCgnXFwnKTsKQEAgLTI4Myw5MCArMzU3LDEwOCBAQAogICAgIF93cml0ZVN0cmluZ0RhdGEoZXNjYXBlLnRvU3RyaW5nKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKLSAgICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwgIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcworICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01FU1NBR0U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUFQOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTElTVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX1NFVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAiIjsKQEAgLTM3Nyw5ICs0NjksMTUgQEAKICAgICByZXR1cm4gIiI7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR1cGxlUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY1MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRUdXBsZVByb3RvY29sIGV4dGVuZHMgVENvbXBhY3RQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworICAgIHB1YmxpYyBGYWN0b3J5KCkge30KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUVHVwbGVQcm90b2NvbCh0cmFucyk7CisgICAgfQorICB9CisKKyAgcHVibGljIFRUdXBsZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElTY2hlbWU+IGdldFNjaGVtZSgpIHsKKyAgICByZXR1cm4gVHVwbGVTY2hlbWUuY2xhc3M7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJpdFNldChCaXRTZXQgYnMsIGludCB2ZWN0b3JXaWR0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IHRvQnl0ZUFycmF5KGJzLCB2ZWN0b3JXaWR0aCk7CisgICAgZm9yIChieXRlIGIgOiBieXRlcykgeworICAgICAgd3JpdGVCeXRlKGIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCaXRTZXQgcmVhZEJpdFNldChpbnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBsZW5ndGggPSAoaW50KSBNYXRoLmNlaWwoaS84LjApOworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgYnl0ZXNbal0gPSByZWFkQnl0ZSgpOworICAgIH0KKyAgICBCaXRTZXQgYnMgPSBmcm9tQnl0ZUFycmF5KGJ5dGVzKTsKKyAgICByZXR1cm4gYnM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGJpdHNldCBjb250YWluaW5nIHRoZSB2YWx1ZXMgaW4gYnl0ZXMuIFRoZSBieXRlLW9yZGVyaW5nIG11c3QgYmUKKyAgICogYmlnLWVuZGlhbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQml0U2V0IGZyb21CeXRlQXJyYXkoYnl0ZVtdIGJ5dGVzKSB7CisgICAgQml0U2V0IGJpdHMgPSBuZXcgQml0U2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggKiA4OyBpKyspIHsKKyAgICAgIGlmICgoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSAmICgxIDw8IChpICUgOCkpKSA+IDApIHsKKyAgICAgICAgYml0cy5zZXQoaSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaXRzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxLiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlCisgICAqIHJlc3VsdCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBhIDEgKHNpbmNlIEJpdFNldCBkb2VzIG5vdCBzdXBwb3J0IHNpZ24KKyAgICogZXh0ZW5zaW9uKS4gVGhlIGJ5dGUtb3JkZXJpbmcgb2YgdGhlIHJlc3VsdCBpcyBiaWctZW5kaWFuIHdoaWNoIG1lYW5zIHRoZQorICAgKiBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBpbiBlbGVtZW50IDAuIFRoZSBiaXQgYXQgaW5kZXggMCBvZiB0aGUgYml0IHNldCBpcworICAgKiBhc3N1bWVkIHRvIGJlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisgICAqIAorICAgKiBAcGFyYW0gYml0cworICAgKiBAcGFyYW0gdmVjdG9yV2lkdGggCisgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVBcnJheShCaXRTZXQgYml0cywgaW50IHZlY3RvcldpZHRoKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbKGludCkgTWF0aC5jZWlsKHZlY3RvcldpZHRoLzguMCldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBpZiAoYml0cy5nZXQoaSkpIHsKKyAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSB8PSAxIDw8IChpICUgOCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvSVNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgaW50ZXJmYWNlIElTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiB7CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3RvLCBUIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90bywgVCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU2NoZW1lRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmE2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworcHVibGljIGludGVyZmFjZSBTY2hlbWVGYWN0b3J5IHsKKworICBwdWJsaWMgPFMgZXh0ZW5kcyBJU2NoZW1lPiBTIGdldFNjaGVtZSgpOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU3RhbmRhcmRTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MjQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVHVwbGVTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHVwbGVTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjA2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworLyoqCisgKiBQcm92aWRlcyBjb21tb24gbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5IG5vbmJsb2NraW5nIFRTZXJ2ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKKyAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKKyAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgICAgdHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgYWxsb2NhdGUgdG8gY2xpZW50IElPIGJ1ZmZlcnMgYXQgYQorICAgKiB0aW1lLiBXaXRob3V0IHRoaXMgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBnbGFkbHkgYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMKKyAgICogcmlnaHQgaW50byBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbiwgcmF0aGVyIHRoYW4gd2FpdGluZy4KKyAgICovCisgIGZpbmFsIGxvbmcgTUFYX1JFQURfQlVGRkVSX0JZVEVTOworCisgIC8qKgorICAgKiBIb3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMuCisgICAqLworICBmaW5hbCBBdG9taWNMb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IG5ldyBBdG9taWNMb25nKDApOworCisgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBNQVhfUkVBRF9CVUZGRVJfQllURVMgPSBhcmdzLm1heFJlYWRCdWZmZXJCeXRlczsKKyAgfQorCisgIC8qKgorICAgKiBCZWdpbiBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHByb2Nlc3NpbmcgaW52b2NhdGlvbnMuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgICAvLyBzdGFydCBhbnkgSU8gdGhyZWFkcworICAgIGlmICghc3RhcnRUaHJlYWRzKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKKyAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRTZXJ2aW5nKHRydWUpOworCisgICAgLy8gdGhpcyB3aWxsIGJsb2NrIHdoaWxlIHdlIHNlcnZlCisgICAgd2FpdEZvclNodXRkb3duKCk7CisKKyAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKKworICAgIC8vIGRvIGEgbGl0dGxlIGNsZWFudXAKKyAgICBzdG9wTGlzdGVuaW5nKCk7CisgIH0KKworICAvKioKKyAgICogU3RhcnRzIGFueSB0aHJlYWRzIHJlcXVpcmVkIGZvciBzZXJ2aW5nLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CisKKyAgLyoqCisgICAqIEEgbWV0aG9kIHRoYXQgd2lsbCBibG9jayB1bnRpbCB3aGVuIHRocmVhZHMgaGFuZGxpbmcgdGhlIHNlcnZpbmcgaGF2ZSBiZWVuCisgICAqIHNodXQgZG93bi4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpOworCisgIC8qKgorICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKKyAgICogICAgICAgICB3cm9uZy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0TGlzdGVuaW5nKCkgeworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0ISIsIHR0eCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgLQorICAgKiBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQorICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKKyAgICogICAgICAgICBmYWlsZWQuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKTsKKworICAvKioKKyAgICogQW4gYWJzdHJhY3QgdGhyZWFkIHRoYXQgaGFuZGxlcyBzZWxlY3Rpbmcgb24gYSBzZXQgb2YgdHJhbnNwb3J0cyBhbmQKKyAgICoge0BsaW5rIEZyYW1lQnVmZmVyIEZyYW1lQnVmZmVyc30gYXNzb2NpYXRlZCB3aXRoIHNlbGVjdGVkIGtleXMKKyAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgcHJvdGVjdGVkIFNlbGVjdG9yIHNlbGVjdG9yOworCisgICAgLy8gTGlzdCBvZiBGcmFtZUJ1ZmZlcnMgdGhhdCB3YW50IHRvIGNoYW5nZSB0aGVpciBzZWxlY3Rpb24gaW50ZXJlc3RzLgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9IG5ldyBIYXNoU2V0PEZyYW1lQnVmZmVyPigpOworCisgICAgcHVibGljIEFic3RyYWN0U2VsZWN0VGhyZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuc2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7CisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgRnJhbWVCdWZmZXIgdG8gdGhlIGxpc3Qgb2Ygc2VsZWN0IGludGVyZXN0IGNoYW5nZXMgYW5kIHdha2UgdXAgdGhlCisgICAgICogc2VsZWN0b3IgaWYgaXQncyBibG9ja2VkLiBXaGVuIHRoZSBzZWxlY3QoKSBjYWxsIGV4aXRzLCBpdCdsbCBnaXZlIHRoZQorICAgICAqIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIGNoYW5nZSBpdHMgaW50ZXJlc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgc2VsZWN0SW50ZXJlc3RDaGFuZ2VzLmFkZChmcmFtZUJ1ZmZlcik7CisgICAgICB9CisgICAgICAvLyB3YWtldXAgdGhlIHNlbGVjdG9yLCBpZiBpdCdzIGN1cnJlbnRseSBibG9ja2VkLgorICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgRnJhbWVCdWZmZXJzIHRoYXQgaGF2ZSBzd2l0Y2hlZCB0aGVpcgorICAgICAqIGludGVyZXN0IHR5cGUgZnJvbSByZWFkIHRvIHdyaXRlIG9yIHZpY2UgdmVyc2EuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7CisgICAgICAgIGZvciAoRnJhbWVCdWZmZXIgZmIgOiBzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgICBmYi5jaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yayByZXF1aXJlZCB0byByZWFkIGZyb20gYSByZWFkYWJsZSBjbGllbnQuIElmIHRoZSBmcmFtZSBpcworICAgICAqIGZ1bGx5IHJlYWQsIHRoZW4gaW52b2tlIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWFkKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLnJlYWQoKSkgeworICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gaWYgdGhlIGJ1ZmZlcidzIGZyYW1lIHJlYWQgaXMgY29tcGxldGUsIGludm9rZSB0aGUgbWV0aG9kLgorICAgICAgaWYgKGJ1ZmZlci5pc0ZyYW1lRnVsbHlSZWFkKCkpIHsKKyAgICAgICAgaWYgKCFyZXF1ZXN0SW52b2tlKGJ1ZmZlcikpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZXQgYSB3cml0YWJsZSBjbGllbnQgZ2V0IHdyaXR0ZW4sIGlmIHRoZXJlJ3MgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVdyaXRlKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLndyaXRlKCkpIHsKKyAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShrZXkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGNvbm5lY3Rpb24tY2xvc2UgY2xlYW51cCBvbiBhIGdpdmVuIFNlbGVjdGlvbktleS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIC8vIHJlbW92ZSB0aGUgcmVjb3JkcyBmcm9tIHRoZSB0d28gbWFwcworICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgIC8vIGNsb3NlIHRoZSBidWZmZXIKKyAgICAgICAgYnVmZmVyLmNsb3NlKCk7CisgICAgICB9CisgICAgICAvLyBjYW5jZWwgdGhlIHNlbGVjdGlvbiBrZXkKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICB9CisgIH0gLy8gU2VsZWN0VGhyZWFkCisKKyAgLyoqCisgICAqIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIEZyYW1lQnVmZmVyIHN0YXRlIG1hY2hpbmUuCisgICAqLworICBwcml2YXRlIGVudW0gRnJhbWVCdWZmZXJTdGF0ZSB7CisgICAgLy8gaW4gdGhlIG1pZHN0IG9mIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgb2ZmIHRoZSB3aXJlCisgICAgUkVBRElOR19GUkFNRV9TSVpFLAorICAgIC8vIHJlYWRpbmcgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIG5vdywgYnV0IG5vdCBhbGwgdGhlIHdheSBkb25lIHlldAorICAgIFJFQURJTkdfRlJBTUUsCisgICAgLy8gY29tcGxldGVseSByZWFkIHRoZSBmcmFtZSwgc28gYW4gaW52b2NhdGlvbiBjYW4gbm93IGhhcHBlbgorICAgIFJFQURfRlJBTUVfQ09NUExFVEUsCisgICAgLy8gd2FpdGluZyB0byBnZXQgc3dpdGNoZWQgdG8gbGlzdGVuaW5nIGZvciB3cml0ZSBldmVudHMKKyAgICBBV0FJVElOR19SRUdJU1RFUl9XUklURSwKKyAgICAvLyBzdGFydGVkIHdyaXRpbmcgcmVzcG9uc2UgZGF0YSwgbm90IGZ1bGx5IGNvbXBsZXRlIHlldAorICAgIFdSSVRJTkcsCisgICAgLy8gYW5vdGhlciB0aHJlYWQgd2FudHMgdGhpcyBmcmFtZWJ1ZmZlciB0byBnbyBiYWNrIHRvIHJlYWRpbmcKKyAgICBBV0FJVElOR19SRUdJU1RFUl9SRUFELAorICAgIC8vIHdlIHdhbnQgb3VyIHRyYW5zcG9ydCBhbmQgc2VsZWN0aW9uIGtleSBpbnZhbGlkYXRlZCBpbiB0aGUgc2VsZWN0b3IKKyAgICAvLyB0aHJlYWQKKyAgICBBV0FJVElOR19DTE9TRQorICB9CisKKyAgLyoqCisgICAqIENsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNvcnQgb2Ygc3RhdGUgbWFjaGluZSBhcm91bmQgdGhlIGludGVyYWN0aW9uIHdpdGggYQorICAgKiBjbGllbnQgYW5kIGFuIGludm9rZXIuIEl0IG1hbmFnZXMgcmVhZGluZyB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YSwKKyAgICogZ2V0dGluZyBpdCBoYW5kZWQgb2ZmIGFzIHdyYXBwZWQgdHJhbnNwb3J0cywgYW5kIHRoZW4gdGhlIHdyaXRpbmcgb2YKKyAgICogcmVzcG9uc2UgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoZSBwcm9jZXNzIGl0IG1hbmFnZXMgZmxpcHBpbmcgdGhlCisgICAqIHJlYWQgYW5kIHdyaXRlIGJpdHMgb24gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIGl0cyBjbGllbnQuCisgICAqLworICAgcHVibGljIGNsYXNzIEZyYW1lQnVmZmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAvLyB0aGUgYWN0dWFsIHRyYW5zcG9ydCBob29rZWQgdXAgdG8gdGhlIGNsaWVudC4KKyAgICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zXzsKKworICAgIC8vIHRoZSBTZWxlY3Rpb25LZXkgdGhhdCBjb3JyZXNwb25kcyB0byBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXlfOworCisgICAgLy8gdGhlIFNlbGVjdFRocmVhZCB0aGF0IG93bnMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZF87CisKKyAgICAvLyB3aGVyZSBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nL3dyaXRpbmcgYXJlIHdlPworICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlclN0YXRlIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworCisgICAgLy8gdGhlIEJ5dGVCdWZmZXIgd2UnbGwgYmUgdXNpbmcgdG8gd3JpdGUgYW5kIHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXJfOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOworCisgICAgLy8gdGhlIGZyYW1lIHRoYXQgdGhlIFRUcmFuc3BvcnQgc2hvdWxkIHdyYXAuCisgICAgcHJvdGVjdGVkIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBmcmFtZVRyYW5zXzsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25uZWN0IHRvIGNsaWVudHMKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBpblRyYW5zXzsKKworICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IG91dFRyYW5zXzsKKworICAgIC8vIHRoZSBpbnB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBpblByb3RfOworCisgICAgLy8gdGhlIG91dHB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBvdXRQcm90XzsKKworICAgIC8vIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJDb250ZXh0IGNvbnRleHRfOworCisgICAgcHVibGljIEZyYW1lQnVmZmVyKGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKKyAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwKKyAgICAgICAgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHNlbGVjdGlvbktleV8gPSBzZWxlY3Rpb25LZXk7CisgICAgICBzZWxlY3RUaHJlYWRfID0gc2VsZWN0VGhyZWFkOworICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisKKyAgICAgIGZyYW1lVHJhbnNfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworICAgICAgcmVzcG9uc2VfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIGluVHJhbnNfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoZnJhbWVUcmFuc18pOworICAgICAgb3V0VHJhbnNfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQocmVzcG9uc2VfKSk7CisgICAgICBpblByb3RfID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnNfKTsKKyAgICAgIG91dFByb3RfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRUcmFuc18pOworCisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGluUHJvdF8sIG91dFByb3RfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRfICA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCisgICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlYWQoKSB7CisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFKSB7CisgICAgICAgIC8vIHRyeSB0byByZWFkIHRoZSBmcmFtZSBzaXplIGNvbXBsZXRlbHkKKyAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlIHRvIHJlYWQgdGhlCisgICAgICAgIC8vIGFjdHVhbCBmcmFtZS4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmcmFtZSBzaXplIGFzIGFuIGludGVnZXIuCisgICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZmZlcl8uZ2V0SW50KDApOworICAgICAgICAgIGlmIChmcmFtZVNpemUgPD0gMCkgeworICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCisgICAgICAgICAgICAgICAgKyAiLiBBcmUgeW91IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQgb24gdGhlIGNsaWVudCBzaWRlPyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBhbHdheXMgYmUgdG9vIGxhcmdlIGZvciB0aGlzIHNlcnZlciwgbG9nIHRoZQorICAgICAgICAgIC8vIGVycm9yIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBpZiAoZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7CisgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYSBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICArICIsIHdoaWNoIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBidWZmZXIgc2l6ZSBmb3IgQUxMIGNvbm5lY3Rpb25zLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBwdXNoIHVzIG92ZXIgdGhlIG1lbW9yeSBsaW1pdCwgdGhlbiByZXR1cm4uCisgICAgICAgICAgLy8gd2l0aCBsdWNrLCBtb3JlIG1lbW9yeSB3aWxsIGZyZWUgdXAgdGhlIG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5nZXQoKSArIGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMKKyAgICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KGZyYW1lU2l6ZSArIDQpOworCisgICAgICAgICAgLy8gcmVhbGxvY2F0ZSB0aGUgcmVhZGJ1ZmZlciBhcyBhIGZyYW1lLXNpemVkIGJ1ZmZlcgorICAgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGZyYW1lU2l6ZSArIDQpOworICAgICAgICAgIGJ1ZmZlcl8ucHV0SW50KGZyYW1lU2l6ZSk7CisKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gdGhpcyBza2lwcyB0aGUgY2hlY2sgb2YgUkVBRElOR19GUkFNRSBzdGF0ZSBiZWxvdywgc2luY2Ugd2UgY2FuJ3QKKyAgICAgICAgICAvLyBwb3NzaWJseSBnbyBvbiB0byB0aGF0IHN0YXRlIGlmIHRoZXJlJ3MgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgYXQKKyAgICAgICAgICAvLyB0aGlzIG9uZS4KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0byBmYWxsIHRocm91Z2ggZnJvbSB0aGUgUkVBRElOR19GUkFNRV9TSVpFIHNlY3Rpb24KKyAgICAgIC8vIHRvIFJFQURJTkdfRlJBTUUgaWYgdGhlcmUncyBhbHJlYWR5IHNvbWUgZnJhbWUgZGF0YSBhdmFpbGFibGUgb25jZQorICAgICAgLy8gUkVBRElOR19GUkFNRV9TSVpFIGlzIGNvbXBsZXRlLgorCisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSkgeworICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgc2VsZWN0IGxvb3AgaGVyZSBmb3Igc3VyZSwgd2UgY2FuIGp1c3QKKyAgICAgICAgLy8gbW9kaWZ5IG91ciBzZWxlY3Rpb24ga2V5IGRpcmVjdGx5LgorICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgLy8gZ2V0IHJpZCBvZiB0aGUgcmVhZCBzZWxlY3QgaW50ZXJlc3RzCisgICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcygwKTsKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURfRlJBTUVfQ09NUExFVEU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIHN0YXRlIG11c3QgYmUgaW52YWxpZC4KKyAgICAgIExPR0dFUi5lcnJvcigiUmVhZCB3YXMgY2FsbGVkIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gd3JpdGUgaXRzIG91dHB1dCB0byB0aGUgZmluYWwgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKCkgeworICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLldSSVRJTkcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAodHJhbnNfLndyaXRlKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlISIsIGUpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlJ3JlIGRvbmUgd3JpdGluZy4gbm93IHdlIG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8gcmVhZGluZy4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIExPR0dFUi5lcnJvcigiV3JpdGUgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBzZXQgaXRzIGludGVyZXN0IHRvIHdyaXRlLCBvbmNlIGRhdGEKKyAgICAgKiBoYXMgY29tZSBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7CisgICAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9XUklURToKKyAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAorICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuV1JJVElORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ6CisgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19DTE9TRToKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dHRVIuZXJyb3IoCisgICAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKHt9KSIsCisgICAgICAgICAgICBzdGF0ZV8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXQgdGhlIGNvbm5lY3Rpb24gZG93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKKyAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8CisgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSB8fAorICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CisgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOworICAgICAgfQorICAgICAgdHJhbnNfLmNsb3NlKCk7CisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGV2ZW50SGFuZGxlcl8uZGVsZXRlQ29udGV4dChjb250ZXh0XywgaW5Qcm90Xywgb3V0UHJvdF8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgRnJhbWVCdWZmZXIgaGFzIGEgZnVsbCBmcmFtZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWVGdWxseVJlYWQoKSB7CisgICAgICByZXR1cm4gc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZnRlciB0aGUgcHJvY2Vzc29yIGhhcyBwcm9jZXNzZWQgdGhlIGludm9jYXRpb24sIHdoYXRldmVyIHRocmVhZCBpcworICAgICAqIG1hbmFnaW5nIGludm9jYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoaXMgRnJhbWVCdWZmZXIgc28gd2UKKyAgICAgKiBrbm93IGl0J3MgdGltZSB0byBzdGFydCB0cnlpbmcgdG8gd3JpdGUgYWdhaW4uIEFsc28sIGlmIGl0IHR1cm5zIG91dCB0aGF0CisgICAgICogdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IGRhdGEgaW4gdGhlIHJlc3BvbnNlIGJ1ZmZlciwgd2UnbGwgc2tpcCB0cnlpbmcKKyAgICAgKiB0byB3cml0ZSBhbmQgaW5zdGVhZCBnbyBiYWNrIHRvIHJlYWRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzcG9uc2VSZWFkeSgpIHsKKyAgICAgIC8vIHRoZSByZWFkIGJ1ZmZlciBpcyBkZWZpbml0ZWx5IG5vIGxvbmdlciBpbiB1c2UsIHNvIHdlIHdpbGwgZGVjcmVtZW50CisgICAgICAvLyBvdXIgcmVhZCBidWZmZXIgY291bnQuIHdlIGRvIHRoaXMgaGVyZSBhcyB3ZWxsIGFzIGluIGNsb3NlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ2QgbGlrZSB0byBmcmVlIHRoaXMgcmVhZCBtZW1vcnkgdXAgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBmb3Igb3RoZXIKKyAgICAgIC8vIGNsaWVudHMuCisgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KC1idWZmZXJfLmFycmF5KCkubGVuZ3RoKTsKKworICAgICAgaWYgKHJlc3BvbnNlXy5sZW4oKSA9PSAwKSB7CisgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHJlYWRpbmcgYWdhaW4uIHRoaXMgd2FzIHByb2JhYmx5IGFuIG9uZXdheSBtZXRob2QKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9SRUFEOworICAgICAgICBidWZmZXJfID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLndyYXAocmVzcG9uc2VfLmdldCgpLCAwLCByZXNwb25zZV8ubGVuKCkpOworCisgICAgICAgIC8vIHNldCBzdGF0ZSB0aGF0IHdlJ3JlIHdhaXRpbmcgdG8gYmUgc3dpdGNoZWQgdG8gd3JpdGUuIHdlIGRvIHRoaXMKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgdGhyb3VnaCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSBiZWNhdXNlIHRoZXJlIGlzCisgICAgICAgIC8vIGEgcG9zc2liaWxpdHkgdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGh1cyBjdXJyZW50bHkKKyAgICAgICAgLy8gYmxvY2tlZCBpbiBzZWxlY3QoKS4gKHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBwbGFjZSBmb3IgdGhlIHNha2Ugb2YKKyAgICAgICAgLy8gdGhlIEhzSGEgc2VydmVyLikKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9XUklURTsKKyAgICAgIH0KKyAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKKyAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CisgICAgICByZXNwb25zZV8ucmVzZXQoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zXykucHJvY2VzcyhpblByb3RfLCBvdXRQcm90Xyk7CisgICAgICAgIHJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIHRlKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiVW5leHBlY3RlZCB0aHJvd2FibGUgd2hpbGUgaW52b2tpbmchIiwgdCk7CisgICAgICB9CisgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYSB0aHJvd2FibGUuCisgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFOworICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCisgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxSZWFkKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYW5zXy5yZWFkKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBpbiBpbnRlcm5hbFJlYWQhIiwgZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSdyZSBkb25lIHdyaXRpbmcsIHNvIHJlc2V0IG91ciBpbnRlcmVzdCBvcHMgYW5kIGNoYW5nZSBzdGF0ZQorICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUmVhZCgpIHsKKyAgICAgIC8vIHdlIGNhbiBzZXQgb3VyIGludGVyZXN0IGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIHF1ZXVlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ3JlIGluIHRoZSBzZWxlY3QgdGhyZWFkLgorICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICAvLyBnZXQgcmVhZHkgZm9yIGFub3RoZXIgZ28tYXJvdW5kCisgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBGcmFtZUJ1ZmZlciBuZWVkcyB0byBjaGFuZ2UgaXRzIHNlbGVjdCBpbnRlcmVzdHMgYW5kIGV4ZWN1dGlvbgorICAgICAqIG1pZ2h0IG5vdCBiZSBpbiBpdHMgc2VsZWN0IHRocmVhZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGUKKyAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgZ2V0cyBkb25lIHdoZW4gdGhlIHNlbGVjdCB0aHJlYWQgd2FrZXMgYmFjayB1cC4gV2hlbiB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZCBpcyB0aGlzIEZyYW1lQnVmZmVyJ3Mgc2VsZWN0IHRocmVhZCwgdGhlbiBpdCBqdXN0IGRvZXMgdGhlCisgICAgICogaW50ZXJlc3QgY2hhbmdlIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIHsKKyAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2VsZWN0VGhyZWFkXykgeworICAgICAgICBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2VsZWN0VGhyZWFkXy5yZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgfQorICB9IC8vIEZyYW1lQnVmZmVyCisKKyAgcHVibGljIGNsYXNzIEFzeW5jRnJhbWVCdWZmZXIgZXh0ZW5kcyBGcmFtZUJ1ZmZlciB7CisgICAgcHVibGljIEFzeW5jRnJhbWVCdWZmZXIoVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgIHN1cGVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CisgICAgfQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkgeworICAgICAgcmV0dXJuICBpblByb3RfOworICAgIH0KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSB7CisgICAgICByZXR1cm4gb3V0UHJvdF87CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoKSB7CisgICAgICBmcmFtZVRyYW5zXy5yZXNldChidWZmZXJfLmFycmF5KCkpOworICAgICAgcmVzcG9uc2VfLnJlc2V0KCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbnRleHRfLCBpblRyYW5zXywgb3V0VHJhbnNfKTsKKyAgICAgICAgfQorICAgICAgICAoKFRBc3luY1Byb2Nlc3Nvcilwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFuc18pKS5wcm9jZXNzKHRoaXMpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIHRocm93YWJsZSB3aGlsZSBpbnZva2luZyEiLCB0KTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhIHRocm93YWJsZS4KKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0U7CisgICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9JbnZvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXI7CisKKy8qKgorICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgorICogYW4gaWRsZSB3b3JrZXIgdGhyZWFkLiBJdCBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMgdGhlCisgKiB0aHJlYWQncyBwcm9jZXNzb3Igc2hvdWxkIHVzZSB0byBwZXJmb3JtIHRoZSB1c3VhbCBUaHJpZnQgaW52b2NhdGlvbi4KKyAqLworY2xhc3MgSW52b2NhdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgcHJpdmF0ZSBmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcjsKKworICBwdWJsaWMgSW52b2NhdGlvbihmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHN0b3Jpbmcgc2VydmVyJ3MgY29ubmVjdGlvbiBjb250ZXh0CisgKi8KKyAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlckNvbnRleHQge30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDgyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgVGhyaWZ0U2VydmVyLCB0aGF0IGFsbG93cyB7QGxpbmsgVFByb2Nlc3Nvcn0gYW5kCisgKiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0gdG8gYmUgc3VwcGxpZWQgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QgaGFzCisgKiBmaW5pc2hlZC4gPGJyPgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB0aGF0IHJldHVybiB0aGUgVFByb2Nlc3NvciBhbmQKKyAqIHR3byBUUHJvdG9jb2xGYWN0b3J5LiBUaG9zZSBtZXRob2RzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UsCisgKiBhbmQgdGhhdCB7QGxpbmsgU2VydmxldENvbnRleHR9IGlzIGF2YWlsYWJsZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRFeHRlbnNpYmxlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKworICBwcml2YXRlIFRQcm90b2NvbEZhY3RvcnkgaW5GYWN0b3J5OworCisgIHByaXZhdGUgVFByb3RvY29sRmFjdG9yeSBvdXRGYWN0b3J5OworCisgIHByaXZhdGUgQ29sbGVjdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBjdXN0b21IZWFkZXJzOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0uIFRoaXMgd2lsbCBiZSBjYWxsZWQgPGI+b25jZTwvYj4ganVzdAorICAgKiBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAorICAgKiAKKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFRQcm9jZXNzb3J9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCisgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKKyAgICogCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsgLy9uby1hcmdzIGluaXQoKSBoYXBwZW5zIGhlcmUKKyAgICB0aGlzLnByb2Nlc3NvciA9IGdldFByb2Nlc3NvcigpOworICAgIHRoaXMuaW5GYWN0b3J5ID0gZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLm91dEZhY3RvcnkgPSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7CisKKyAgICBpZiAocHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJwcm9jZXNzb3IgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisgICAgaWYgKGluRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiaW5GYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICAgIGlmIChvdXRGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJvdXRGYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlCisgICAqICAgICAgcmVzcG9uc2UpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUVHJhbnNwb3J0IGluVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBUVHJhbnNwb3J0IG91dFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisKKyAgICAgIGlmIChudWxsICE9IHRoaXMuY3VzdG9tSGVhZGVycykgeworCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiB0aGlzLmN1c3RvbUhlYWRlcnMpIHsKKwkgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKwl9CisgICAgICB9CisKKyAgICAgIElucHV0U3RyZWFtIGluID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoaW4sIG91dCk7CisgICAgICBpblRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIG91dFRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworICAgICAgVFByb3RvY29sIGluUHJvdG9jb2wgPSBpbkZhY3RvcnkuZ2V0UHJvdG9jb2woaW5UcmFuc3BvcnQpOworICAgICAgVFByb3RvY29sIG91dFByb3RvY29sID0gaW5GYWN0b3J5LmdldFByb3RvY29sKG91dFRyYW5zcG9ydCk7CisKKyAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGluUHJvdG9jb2wsIG91dFByb3RvY29sKTsKKyAgICAgIG91dC5mbHVzaCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHNlZSBIdHRwU2VydmxldCNkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZQorICAgKiAgICAgIHJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZG9Qb3N0KHJlcSwgcmVzcCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDdXN0b21IZWFkZXIoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzLmFkZChuZXcgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPigpIHsKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCXJldHVybiBrZXk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCXJldHVybiBudWxsOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q3VzdG9tSGVhZGVycyhDb2xsZWN0aW9uPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGhlYWRlcnMpIHsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuY2xlYXIoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKaW5kZXggYTRiYThkOS4uNGM1ZDdiNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQpAQCAtMjIsMTQgKzIyLDEwIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CiAKIC8qKgpAQCAtMzgsMjA5ICszNCwxMjkgQEAKICAqLwogcHVibGljIGNsYXNzIFRIc0hhU2VydmVyIGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyIHsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7CisgICAgcHVibGljIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gNTsKKyAgICBwdWJsaWMgaW50IG1heFdvcmtlclRocmVhZHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICBwcml2YXRlIGludCBzdG9wVGltZW91dFZhbCA9IDYwOworICAgIHByaXZhdGUgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBudWxsOworCisgICAgcHVibGljIEFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1pbiBhbmQgbWF4IHRocmVhZHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNtaW5Xb3JrZXJUaHJlYWRzKGludCl9IGFuZCB7QGxpbmsgI21heFdvcmtlclRocmVhZHMoaW50KX0gIGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGF0IHRoZSBtaW4gdGhyZWFkcyB3YXMgc2V0IHRvLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldE1pbldvcmtlclRocmVhZHMoKX0gYW5kIHtAbGluayAjZ2V0TWF4V29ya2VyVGhyZWFkcygpfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGludCBnZXRXb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1pbldvcmtlclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWluV29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWluV29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBtYXhXb3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtYXhXb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWluV29ya2VyVGhyZWFkcygpIHsKKyAgICAgIHJldHVybiBtaW5Xb3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4V29ya2VyVGhyZWFkcygpIHsKKyAgICAgIHJldHVybiBtYXhXb3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXRWYWwoKSB7CisgICAgICByZXR1cm4gc3RvcFRpbWVvdXRWYWw7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRWYWwoaW50IHN0b3BUaW1lb3V0VmFsKSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VmFsID0gc3RvcFRpbWVvdXRWYWw7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZVVuaXQgZ2V0U3RvcFRpbWVvdXRVbml0KCkgeworICAgICAgcmV0dXJuIHN0b3BUaW1lb3V0VW5pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0KSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VW5pdCA9IHN0b3BUaW1lb3V0VW5pdDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBleGVjdXRvclNlcnZpY2UoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0KKworCiAgIC8vIFRoaXMgd3JhcHMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHF1ZXVlaW5nIGFuZCB0aHJlYWQgcG9vbCBtYW5hZ2VtZW50CiAgIC8vIGZvciB0aGUgcGFzc2luZyBvZiBJbnZvY2F0aW9ucyBmcm9tIHRoZSBTZWxlY3RvciB0byB3b3JrZXJzLgotICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyOworICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyOwogCi0gIHByb3RlY3RlZCBmaW5hbCBpbnQgd29ya2VyX3RocmVhZHM7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgc3RvcF90aW1lb3V0X3ZhbDsKLSAgcHJvdGVjdGVkIGZpbmFsIFRpbWVVbml0IHN0b3BfdGltZW91dF91bml0OworICBwcml2YXRlIGZpbmFsIEFyZ3MgYXJnczsKIAogICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIGdpdmVuIHByb2Nlc3NvciwgYW5kIHNlcnZlciB0cmFuc3BvcnQuIERlZmF1bHQgc2VydmVyCi0gICAqIG9wdGlvbnMsIFRCaW5hcnlQcm90b2NvbCBmb3IgdGhlIHByb3RvY29sLCBhbmQgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG9uCi0gICAqIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLiBBIFRQcm9jZXNzb3JGYWN0b3J5IHdpbGwgYmUgY3JlYXRlZCB0aGF0Ci0gICAqIGFsd2F5cyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgorICAgKiBDcmVhdGUgdGhlIHNlcnZlciB3aXRoIHRoZSBzcGVjaWZpZWQgQXJncyBjb25maWd1cmF0aW9uCiAgICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgT3B0aW9ucygpKTsKKyAgcHVibGljIFRIc0hhU2VydmVyKEFyZ3MgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworCisgICAgaW52b2tlciA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlID09IG51bGwgPyBjcmVhdGVJbnZva2VyUG9vbChhcmdzKSA6IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlOworICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgIH0KIAogICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIGdpdmVuIHByb2Nlc3Nvciwgc2VydmVyIHRyYW5zcG9ydCwgYW5kIHNlcnZlciBvcHRpb25zCi0gICAqIHVzaW5nIFRCaW5hcnlQcm90b2NvbCBmb3IgdGhlIHByb3RvY29sLCBhbmQgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG9uCi0gICAqIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLiBBIFRQcm9jZXNzb3JGYWN0b3J5IHdpbGwgYmUgY3JlYXRlZCB0aGF0Ci0gICAqIGFsd2F5cyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgorICAgKiB7QGluaGVyaXREb2N9CiAgICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LCBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHByb2Nlc3NvciBmYWN0b3J5IGFuZCBzZXJ2ZXIgdHJhbnNwb3J0LiBVc2VzCi0gICAqIGRlZmF1bHQgb3B0aW9ucy4gVEJpbmFyeVByb3RvY29sIGlzIGFzc3VtZWQuIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBpcwotICAgKiB1c2VkIG9uIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgbmV3IE9wdGlvbnMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IgZmFjdG9yeSwgc2VydmVyIHRyYW5zcG9ydCwgYW5kIHNlcnZlcgotICAgKiBvcHRpb25zLiBUQmluYXJ5UHJvdG9jb2wgaXMgYXNzdW1lZC4gVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IGlzIHVzZWQgb24KLSAgICogYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMuCi0gICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpLAotICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG9wdGlvbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IsIHNlcnZlciB0cmFuc3BvcnQsIGFuZCBpbi9vdXQgcHJvdG9jb2wKLSAgICogZmFjdG9yeS4gRGVmYXVsdHMgd2lsbCBiZSB1c2VkIGZvciBpbi9vdXQgdHJhbnNwb3J0IGZhY3RvcnkgYW5kIHNlcnZlcgotICAgKiBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgcHJvdG9jb2xGYWN0b3J5LCBuZXcgT3B0aW9ucygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgcHJvY2Vzc29yLCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgaW4vb3V0IHByb3RvY29sCi0gICAqIGZhY3RvcnkuIERlZmF1bHRzIHdpbGwgYmUgdXNlZCBmb3IgaW4vb3V0IHRyYW5zcG9ydCBmYWN0b3J5IGFuZCBzZXJ2ZXIKLSAgICogb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICB0aGlzKG5ldyBUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCksCi0gICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgCi0gICAgICBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHByb2Nlc3Nvciwgc2VydmVyIHRyYW5zcG9ydCwgaW4vb3V0Ci0gICAqIHRyYW5zcG9ydCBmYWN0b3J5LCBpbi9vdXQgcHJvdG9jb2wgZmFjdG9yeSwgYW5kIGRlZmF1bHQgc2VydmVyIG9wdGlvbnMuIEEKLSAgICogcHJvY2Vzc29yIGZhY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNwZWNpZmllZAotICAgKiBwcm9jZXNzb3IuCi0gICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKG5ldyBUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgcHJvY2Vzc29yIGZhY3RvcnksIHNlcnZlciB0cmFuc3BvcnQsIGluL291dAotICAgKiB0cmFuc3BvcnQgZmFjdG9yeSwgaW4vb3V0IHByb3RvY29sIGZhY3RvcnksIGFuZCBkZWZhdWx0IHNlcnZlciBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmV3IE9wdGlvbnMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IgZmFjdG9yeSwgc2VydmVyIHRyYW5zcG9ydCwgaW4vb3V0Ci0gICAqIHRyYW5zcG9ydCBmYWN0b3J5LCBpbi9vdXQgcHJvdG9jb2wgZmFjdG9yeSwgYW5kIHNlcnZlciBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggZXZlcnl0aGluZyBzcGVjaWZpZWQsIGV4Y2VwdCB1c2UgZGVmYXVsdCBzZXJ2ZXIgb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBldmVyeXRoaW5nIHNwZWNpZmllZCwgZXhjZXB0IHVzZSBkZWZhdWx0IHNlcnZlciBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKLSAgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIG5ldyBPcHRpb25zKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBldmVyeSBvcHRpb24gZnVsbHkgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpCi0gIHsKLSAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIG9wdGlvbnMpOwotCi0gICAgd29ya2VyX3RocmVhZHMgPSBvcHRpb25zLndvcmtlclRocmVhZHM7Ci0gICAgc3RvcF90aW1lb3V0X3ZhbCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRWYWw7Ci0gICAgc3RvcF90aW1lb3V0X3VuaXQgPSBvcHRpb25zLnN0b3BUaW1lb3V0VW5pdDsKLSAgfQotCi0gIC8qKiBAaW5oZXJpdERvYyAqLwogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgaWYgKCFzdGFydEludm9rZXJQb29sKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHRoaXMgd2lsbCBibG9jayB3aGlsZSB3ZSBzZXJ2ZQorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CiAgICAgam9pblNlbGVjdG9yKCk7Ci0KICAgICBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLQotICAgIC8vIHVuZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGludm9rZXIgcG9vbD8KICAgfQogCi0gIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0SW52b2tlclBvb2woKSB7Ci0gICAgLy8gc3RhcnQgdGhlIGludm9rZXIgcG9vbAotICAgIExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+IHF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCk7Ci0gICAgaW52b2tlciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3Iod29ya2VyX3RocmVhZHMsIHdvcmtlcl90aHJlYWRzLAotICAgICAgc3RvcF90aW1lb3V0X3ZhbCwgc3RvcF90aW1lb3V0X3VuaXQsIHF1ZXVlKTsKKyAgLyoqCisgICAqIEhlbHBlciB0byBjcmVhdGUgYW4gaW52b2tlciBwb29sCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBjcmVhdGVJbnZva2VyUG9vbChBcmdzIG9wdGlvbnMpIHsKKyAgICBpbnQgbWluV29ya2VyVGhyZWFkcyA9IG9wdGlvbnMubWluV29ya2VyVGhyZWFkczsKKyAgICBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IG9wdGlvbnMubWF4V29ya2VyVGhyZWFkczsKKyAgICBpbnQgc3RvcFRpbWVvdXRWYWwgPSBvcHRpb25zLnN0b3BUaW1lb3V0VmFsOworICAgIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRVbml0OwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4gcXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oKTsKKyAgICBFeGVjdXRvclNlcnZpY2UgaW52b2tlciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IobWluV29ya2VyVGhyZWFkcywKKyAgICAgIG1heFdvcmtlclRocmVhZHMsIHN0b3BUaW1lb3V0VmFsLCBzdG9wVGltZW91dFVuaXQsIHF1ZXVlKTsKKworICAgIHJldHVybiBpbnZva2VyOworICB9CisKKyAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRJbnZva2VyKCkgeworICAgIHJldHVybiBpbnZva2VyOwogICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKSB7CkBAIC0yNTEsNyArMTY3LDcgQEAKICAgICAvLyBleGNlcHRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gd2UnbGwgc2h1dCBkb3duIHByZW1hdHVyZWx5LiBXZSB3YW50CiAgICAgLy8gdG8gbGV0IHRoZSBleGVjdXRvclNlcnZpY2UgY2xlYXIgaXQncyB0YXNrIHF1ZXVlLCBjbG9zaW5nIGNsaWVudCBzb2NrZXRzCiAgICAgLy8gYXBwcm9wcmlhdGVseS4KLSAgICBsb25nIHRpbWVvdXRNUyA9IDEwMDAwOworICAgIGxvbmcgdGltZW91dE1TID0gYXJncy5zdG9wVGltZW91dFVuaXQudG9NaWxsaXMoYXJncy5zdG9wVGltZW91dFZhbCk7CiAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICB3aGlsZSAodGltZW91dE1TID49IDApIHsKICAgICAgIHRyeSB7CkBAIC0yNjcsMzQgKzE4MywyMiBAQAogCiAgIC8qKgogICAgKiBXZSBvdmVycmlkZSB0aGUgc3RhbmRhcmQgaW52b2tlIG1ldGhvZCBoZXJlIHRvIHF1ZXVlIHRoZSBpbnZvY2F0aW9uIGZvcgotICAgKiBpbnZva2VyIHNlcnZpY2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBpbnZva2luZy4gVGhlIHRocmVhZCBwb29sIHRha2VzIGNhcmUgb2YgdGhlIHJlc3QuCisgICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBUaGUgdGhyZWFkIHBvb2wgdGFrZXMgY2FyZQorICAgKiBvZiB0aGUgcmVzdC4KICAgICovCiAgIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7Ci0gICAgaW52b2tlci5leGVjdXRlKG5ldyBJbnZvY2F0aW9uKGZyYW1lQnVmZmVyKSk7Ci0gIH0KLQotICAvKioKLSAgICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgotICAgKiBhbiBpZGxlIHdvcmtlciB0aHJlYWQuIEl0IGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyB0aGUKLSAgICogdGhyZWFkJ3MgcHJvY2Vzc29yIHNob3VsZCB1c2UgdG8gcGVyZm9ybSB0aGUgdXN1YWwgVGhyaWZ0IGludm9jYXRpb24uCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEludm9jYXRpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyOwotCi0gICAgcHVibGljIEludm9jYXRpb24oZmluYWwgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEludm9rZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIHRyeSB7CisgICAgICBSdW5uYWJsZSBpbnZvY2F0aW9uID0gZ2V0UnVubmFibGUoZnJhbWVCdWZmZXIpOworICAgICAgaW52b2tlci5leGVjdXRlKGludm9jYXRpb24pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gcngpIHsKKyAgICAgIExPR0dFUi53YXJuKCJFeGVjdXRvclNlcnZpY2UgcmVqZWN0ZWQgZXhlY3V0aW9uISIsIHJ4KTsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wdGlvbnMgZXh0ZW5kcyBUTm9uYmxvY2tpbmdTZXJ2ZXIuT3B0aW9ucyB7Ci0gICAgcHVibGljIGludCB3b3JrZXJUaHJlYWRzID0gNTsKLSAgICBwdWJsaWMgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7Ci0gICAgcHVibGljIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgIHByb3RlY3RlZCBSdW5uYWJsZSBnZXRSdW5uYWJsZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcil7CisgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uKGZyYW1lQnVmZmVyKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggMzFhNmUyNC4uZmUwMzY1YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0yMCwzMSArMjAsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogLyoqCiAgKiBBIG5vbmJsb2NraW5nIFRTZXJ2ZXIgaW1wbGVtZW50YXRpb24uIFRoaXMgYWxsb3dzIGZvciBmYWlybmVzcyBhbW9uZ3N0IGFsbApAQCAtNTcsMTY4ICszOSwzMyBAQAogICogdHJhbnNwb3J0LCBvdGhlcndpc2UgdGhpcyBzZXJ2ZXIgd2lsbCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHdoZW4gYSB3aG9sZQogICogbWV0aG9kIGNhbGwgaGFzIGJlZW4gcmVhZCBvZmYgdGhlIHdpcmUuIENsaWVudHMgbXVzdCBhbHNvIHVzZSBURnJhbWVkVHJhbnNwb3J0LgogICovCi1wdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPQotICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFROb25ibG9ja2luZ1NlcnZlci5jbGFzcy5nZXROYW1lKCkpOworcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgewogCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfOwotCi0gIHByaXZhdGUgU2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZF87Ci0KLSAgLyoqCi0gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgd2Ugd2lsbCBhbGxvY2F0ZSB0byBjbGllbnQgSU8gYnVmZmVycyBhdCBhCi0gICAqIHRpbWUuIFdpdGhvdXQgdGhpcyBsaW1pdCwgdGhlIHNlcnZlciB3aWxsIGdsYWRseSBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycwotICAgKiByaWdodCBpbnRvIGFuIG91dCBvZiBtZW1vcnkgZXhjZXB0aW9uLCByYXRoZXIgdGhhbiB3YWl0aW5nLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBsb25nIE1BWF9SRUFEX0JVRkZFUl9CWVRFUzsKLQotICBwcm90ZWN0ZWQgZmluYWwgT3B0aW9ucyBvcHRpb25zXzsKLQotICAvKioKLSAgICogSG93IG1hbnkgYnl0ZXMgYXJlIGN1cnJlbnRseSBhbGxvY2F0ZWQgdG8gcmVhZCBidWZmZXJzLgotICAgKi8KLSAgcHJpdmF0ZSBsb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IDA7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBnaXZlbiBwcm9jZXNzb3IgYW5kIHNlcnZlciB0cmFuc3BvcnQsIHVzaW5nCi0gICAqIFRCaW5hcnlQcm90b2NvbCBmb3IgdGhlIHByb3RvY29sLCBURnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnkgb24gYm90aCBpbnB1dAotICAgKiBhbmQgb3V0cHV0IHRyYW5zcG9ydHMuIEEgVFByb2Nlc3NvckZhY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIHRoYXQgYWx3YXlzCi0gICAqIHJldHVybnMgdGhlIHNwZWNpZmllZCBwcm9jZXNzb3IuCi0gICAqLwotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkgewotICAgIHRoaXMobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IgZmFjdG9yeSBhbmQgc2VydmVyIHRyYW5zcG9ydC4KLSAgICogVEJpbmFyeVByb3RvY29sIGlzIGFzc3VtZWQuIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBpcyB1c2VkIG9uIGJvdGggaW5wdXQKLSAgICogYW5kIG91dHB1dCB0cmFuc3BvcnRzLgotICAgKi8KLSAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7Ci0gIH0KLQotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpLAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBuZXcgT3B0aW9ucygpKTsKLSAgfQotCi0gIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIG51bGwsIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gICAgb3B0aW9uc18gPSBvcHRpb25zOwotICAgIG9wdGlvbnNfLnZhbGlkYXRlKCk7Ci0gICAgTUFYX1JFQURfQlVGRkVSX0JZVEVTID0gb3B0aW9ucy5tYXhSZWFkQnVmZmVyQnl0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogQmVnaW4gYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGFuZCBwcm9jZXNzaW5nIGludm9jYXRpb25zLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgLy8gc3RhcnQgbGlzdGVuaW5nLCBvciBleGl0Ci0gICAgaWYgKCFzdGFydExpc3RlbmluZygpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gc3RhcnQgdGhlIHNlbGVjdG9yLCBvciBleGl0Ci0gICAgaWYgKCFzdGFydFNlbGVjdG9yVGhyZWFkKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIHdpbGwgYmxvY2sgd2hpbGUgd2Ugc2VydmUKLSAgICBqb2luU2VsZWN0b3IoKTsKLQotICAgIC8vIGRvIGEgbGl0dGxlIGNsZWFudXAKLSAgICBzdG9wTGlzdGVuaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogSGF2ZSB0aGUgc2VydmVyIHRyYW5zcG9ydCBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBzdGFydGVkIGxpc3RlbmluZyBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIHNvbWV0aGluZyB3ZW50Ci0gICAqIHdyb25nLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRMaXN0ZW5pbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgbGlzdGVuaW5nIG9uIHNlcnZlciBzb2NrZXQhIiwgdHR4KTsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8QXJncz4geworICAgIHB1YmxpYyBBcmdzKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFN0b3AgbGlzdGVuaW5nIGZvciBjb25lY3Rpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7CisgIHByaXZhdGUgU2VsZWN0QWNjZXB0VGhyZWFkIHNlbGVjdEFjY2VwdFRocmVhZF87CisKKyAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyBhcmdzKSB7CisgICAgc3VwZXIoYXJncyk7CiAgIH0KIAorCiAgIC8qKgotICAgKiBTdGFydCB0aGUgc2VsZWN0b3IgdGhyZWFkIHJ1bm5pbmcgdG8gZGVhbCB3aXRoIGNsaWVudHMuCisgICAqIFN0YXJ0IHRoZSBzZWxlY3RvciB0aHJlYWQgdG8gZGVhbCB3aXRoIGFjY2VwdHMgYW5kIGNsaWVudCBtZXNzYWdlcy4KICAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKICAgICogcmVhc29uLgogICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRTZWxlY3RvclRocmVhZCgpIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0VGhyZWFkcygpIHsKICAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IKICAgICB0cnkgewotICAgICAgc2VsZWN0VGhyZWFkXyA9IG5ldyBTZWxlY3RUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydClzZXJ2ZXJUcmFuc3BvcnRfKTsKLSAgICAgIHNlbGVjdFRocmVhZF8uc3RhcnQoKTsKKyAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8gPSBuZXcgU2VsZWN0QWNjZXB0VGhyZWFkKChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQpc2VydmVyVHJhbnNwb3J0Xyk7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfLnN0YXJ0KCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICBMT0dHRVIuZXJyb3IoIkZhaWxlZCB0byBzdGFydCBzZWxlY3RvciB0aHJlYWQhIiwgZSk7CkBAIC0yMjYsMTMgKzczLDE4IEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKKyAgICBqb2luU2VsZWN0b3IoKTsKKyAgfQorCiAgIC8qKgotICAgKiBCbG9jayB1bnRpbCB0aGUgc2VsZWN0b3IgZXhpdHMuCisgICAqIEJsb2NrIHVudGlsIHRoZSBzZWxlY3RvciB0aHJlYWQgZXhpdHMuCiAgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBqb2luU2VsZWN0b3IoKSB7CiAgICAgLy8gd2FpdCB1bnRpbCB0aGUgc2VsZWN0b3IgdGhyZWFkIGV4aXRzCiAgICAgdHJ5IHsKLSAgICAgIHNlbGVjdFRocmVhZF8uam9pbigpOworICAgICAgc2VsZWN0QWNjZXB0VGhyZWFkXy5qb2luKCk7CiAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgLy8gZm9yIG5vdywganVzdCBzaWxlbnRseSBpZ25vcmUuIHRlY2huaWNhbGx5IHRoaXMgbWVhbnMgd2UnbGwgaGF2ZSBsZXNzIG9mCiAgICAgICAvLyBhIGdyYWNlZnVsIHNodXRkb3duIGFzIGEgcmVzdWx0LgpAQCAtMjQyLDEwICs5NCwxMSBAQAogICAvKioKICAgICogU3RvcCBzZXJ2aW5nIGFuZCBzaHV0IGV2ZXJ5dGhpbmcgZG93bi4KICAgICovCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBzdG9wKCkgewogICAgIHN0b3BwZWRfID0gdHJ1ZTsKLSAgICBpZiAoc2VsZWN0VGhyZWFkXyAhPSBudWxsKSB7Ci0gICAgICBzZWxlY3RUaHJlYWRfLndha2V1cFNlbGVjdG9yKCk7CisgICAgaWYgKHNlbGVjdEFjY2VwdFRocmVhZF8gIT0gbnVsbCkgeworICAgICAgc2VsZWN0QWNjZXB0VGhyZWFkXy53YWtldXBTZWxlY3RvcigpOwogICAgIH0KICAgfQogCkBAIC0yNTMsNzcgKzEwNiw3NCBAQAogICAgKiBQZXJmb3JtIGFuIGludm9jYXRpb24uIFRoaXMgbWV0aG9kIGNvdWxkIGJlaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCB3YXlzCiAgICAqIC0gaW52b2tlIGltbWVkaWF0ZWx5IGlubGluZSwgcXVldWUgZm9yIHNlcGFyYXRlIGV4ZWN1dGlvbiwgZXRjLgogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEludm9rZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEludm9rZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewogICAgIGZyYW1lQnVmZmVyLmludm9rZSgpOworICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIEEgRnJhbWVCdWZmZXIgd2FudHMgdG8gY2hhbmdlIGl0cyBzZWxlY3Rpb24gcHJlZmVyZW5jZXMsIGJ1dCBtaWdodCBub3QgYmUKLSAgICogaW4gdGhlIHNlbGVjdCB0aHJlYWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICBzZWxlY3RUaHJlYWRfLnJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShmcmFtZUJ1ZmZlcik7CisKKyAgcHVibGljIGJvb2xlYW4gaXNTdG9wcGVkKCkgeworICAgIHJldHVybiBzZWxlY3RBY2NlcHRUaHJlYWRfLmlzU3RvcHBlZCgpOwogICB9CiAKICAgLyoqCiAgICAqIFRoZSB0aHJlYWQgdGhhdCB3aWxsIGJlIGRvaW5nIGFsbCB0aGUgc2VsZWN0aW5nLCBtYW5hZ2luZyBuZXcgY29ubmVjdGlvbnMKICAgICogYW5kIHRob3NlIHRoYXQgc3RpbGwgbmVlZCB0byBiZSByZWFkLgogICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgIHByb3RlY3RlZCBjbGFzcyBTZWxlY3RBY2NlcHRUaHJlYWQgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdFRocmVhZCB7CiAKKyAgICAvLyBUaGUgc2VydmVyIHRyYW5zcG9ydCBvbiB3aGljaCBuZXcgY2xpZW50IHRyYW5zcG9ydHMgd2lsbCBiZSBhY2NlcHRlZAogICAgIHByaXZhdGUgZmluYWwgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKLSAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwotCi0gICAgLy8gTGlzdCBvZiBGcmFtZUJ1ZmZlcnMgdGhhdCB3YW50IHRvIGNoYW5nZSB0aGVpciBzZWxlY3Rpb24gaW50ZXJlc3RzLgotICAgIHByaXZhdGUgZmluYWwgU2V0PEZyYW1lQnVmZmVyPiBzZWxlY3RJbnRlcmVzdENoYW5nZXMgPQotICAgICAgbmV3IEhhc2hTZXQ8RnJhbWVCdWZmZXI+KCk7CiAKICAgICAvKioKLSAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkLgorICAgICAqIFNldCB1cCB0aGUgdGhyZWFkIHRoYXQgd2lsbCBoYW5kbGUgdGhlIG5vbi1ibG9ja2luZyBhY2NlcHRzLCByZWFkcywgYW5kCisgICAgICogd3JpdGVzLgogICAgICAqLwotICAgIHB1YmxpYyBTZWxlY3RUaHJlYWQoZmluYWwgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICBwdWJsaWMgU2VsZWN0QWNjZXB0VGhyZWFkKGZpbmFsIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCiAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OwotICAgICAgdGhpcy5zZWxlY3RvciA9IFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuU2VsZWN0b3IoKTsKICAgICAgIHNlcnZlclRyYW5zcG9ydC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwZWQoKSB7CisgICAgICByZXR1cm4gc3RvcHBlZF87CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhlIHdvcmsgbG9vcC4gSGFuZGxlcyBib3RoIHNlbGVjdGluZyAoYWxsIElPIG9wZXJhdGlvbnMpIGFuZCBtYW5hZ2luZwogICAgICAqIHRoZSBzZWxlY3Rpb24gcHJlZmVyZW5jZXMgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKLSAgICAgICAgc2VsZWN0KCk7Ci0gICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKLSAgICAgIH0KLSAgICB9CisgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBJZiB0aGUgc2VsZWN0b3IgaXMgYmxvY2tlZCwgd2FrZSBpdCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YWtldXBTZWxlY3RvcigpIHsKLSAgICAgIHNlbGVjdG9yLndha2V1cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBGcmFtZUJ1ZmZlciB0byB0aGUgbGlzdCBvZiBzZWxlY3QgaW50ZXJlc3QgY2hhbmdlcyBhbmQgd2FrZSB1cCB0aGUKLSAgICAgKiBzZWxlY3RvciBpZiBpdCdzIGJsb2NrZWQuIFdoZW4gdGhlIHNlbGVjdCgpIGNhbGwgZXhpdHMsIGl0J2xsIGdpdmUgdGhlCi0gICAgICogRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gY2hhbmdlIGl0cyBpbnRlcmVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKHNlbGVjdEludGVyZXN0Q2hhbmdlcykgewotICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuYWRkKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICAgIHNlbGVjdCgpOworICAgICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgOiBzZWxlY3Rvci5rZXlzKCkpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KHNlbGVjdGlvbktleSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3Npbmcgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RvcHBlZF8gPSB0cnVlOwogICAgICAgfQotICAgICAgLy8gd2FrZXVwIHRoZSBzZWxlY3RvciwgaWYgaXQncyBjdXJyZW50bHkgYmxvY2tlZC4KLSAgICAgIHNlbGVjdG9yLndha2V1cCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNlbGVjdCBhbmQgcHJvY2VzcyBJTyBldmVudHMgYXBwcm9wcmlhdGVseToKICAgICAgKiBJZiB0aGVyZSBhcmUgY29ubmVjdGlvbnMgdG8gYmUgYWNjZXB0ZWQsIGFjY2VwdCB0aGVtLgogICAgICAqIElmIHRoZXJlIGFyZSBleGlzdGluZyBjb25uZWN0aW9ucyB3aXRoIGRhdGEgd2FpdGluZyB0byBiZSByZWFkLCByZWFkIGl0LAotICAgICAqIGJ1ZmZlcnJpbmcgdW50aWwgYSB3aG9sZSBmcmFtZSBoYXMgYmVlbiByZWFkLgorICAgICAqIGJ1ZmZlcmluZyB1bnRpbCBhIHdob2xlIGZyYW1lIGhhcyBiZWVuIHJlYWQuCiAgICAgICogSWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIHJlc3BvbnNlcywgYnVmZmVyIHRoZW0gdW50aWwgdGhlaXIgdGFyZ2V0IGNsaWVudAogICAgICAqIGlzIGF2YWlsYWJsZSwgYW5kIHRoZW4gc2VuZCB0aGUgZGF0YS4KICAgICAgKi8KQEAgLTM0MCw3ICsxOTAsNyBAQAogCiAgICAgICAgICAgLy8gc2tpcCBpZiBub3QgdmFsaWQKICAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25rZXkoa2V5KTsKKyAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KIApAQCAtMzYzLDE3ICsyMTMsMTIgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBGcmFtZUJ1ZmZlcnMgdGhhdCBoYXZlIHN3aXRjaGVkIHRoZWlyCi0gICAgICogaW50ZXJlc3QgdHlwZSBmcm9tIHJlYWQgdG8gd3JpdGUgb3IgdmljZSB2ZXJzYS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpIHsKLSAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7Ci0gICAgICAgIGZvciAoRnJhbWVCdWZmZXIgZmIgOiBzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKLSAgICAgICAgICBmYi5jaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKLSAgICAgICAgfQotICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuY2xlYXIoKTsKLSAgICAgIH0KKyAgICBwcm90ZWN0ZWQgRnJhbWVCdWZmZXIgY3JlYXRlRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLmlzQXN5bmNQcm9jZXNzb3IoKSA/CisgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgIG5ldyBGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzg4LDM3OCArMjMzLDE2IEBACiAgICAgICAgIGNsaWVudEtleSA9IGNsaWVudC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CiAKICAgICAgICAgLy8gYWRkIHRoaXMga2V5IHRvIHRoZSBtYXAKLSAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoY2xpZW50LCBjbGllbnRLZXkpOwotICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyKGNsaWVudCwgY2xpZW50S2V5LCBTZWxlY3RBY2NlcHRUaHJlYWQudGhpcyk7CisKKyAgICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CiAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGFjY2VwdGluZy4KICAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gYWNjZXB0ISIsIHR0ZSk7CiAgICAgICAgIHR0ZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgaWYgKGNsaWVudEtleSAhPSBudWxsKSBjbGVhbnVwU2VsZWN0aW9ua2V5KGNsaWVudEtleSk7CisgICAgICAgIGlmIChjbGllbnRLZXkgIT0gbnVsbCkgY2xlYW51cFNlbGVjdGlvbktleShjbGllbnRLZXkpOwogICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIGNsaWVudC5jbG9zZSgpOwogICAgICAgfQogICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHJlYWQgZnJvbSBhIHJlYWRhYmxlIGNsaWVudC4gSWYgdGhlIGZyYW1lIGlzCi0gICAgICogZnVsbHkgcmVhZCwgdGhlbiBpbnZva2UgdGhlIG1ldGhvZCBjYWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZWFkKFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcilrZXkuYXR0YWNobWVudCgpOwotICAgICAgaWYgKGJ1ZmZlci5yZWFkKCkpIHsKLSAgICAgICAgLy8gaWYgdGhlIGJ1ZmZlcidzIGZyYW1lIHJlYWQgaXMgY29tcGxldGUsIGludm9rZSB0aGUgbWV0aG9kLgotICAgICAgICBpZiAoYnVmZmVyLmlzRnJhbWVGdWxseVJlYWQoKSkgewotICAgICAgICAgIHJlcXVlc3RJbnZva2UoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYW51cFNlbGVjdGlvbmtleShrZXkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExldCBhIHdyaXRhYmxlIGNsaWVudCBnZXQgd3JpdHRlbiwgaWYgdGhlcmUncyBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdyaXRlKFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcilrZXkuYXR0YWNobWVudCgpOwotICAgICAgaWYgKCFidWZmZXIud3JpdGUoKSkgewotICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gY29ubmVjdGlvbi1jbG9zZSBjbGVhbnVwIG9uIGEgZ2l2ZW4gU2VsZWN0aW9uS2V5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwU2VsZWN0aW9ua2V5KFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIC8vIHJlbW92ZSB0aGUgcmVjb3JkcyBmcm9tIHRoZSB0d28gbWFwcwotICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKWtleS5hdHRhY2htZW50KCk7Ci0gICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKLSAgICAgICAgLy8gY2xvc2UgdGhlIGJ1ZmZlcgotICAgICAgICBidWZmZXIuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIC8vIGNhbmNlbCB0aGUgc2VsZWN0aW9uIGtleQotICAgICAga2V5LmNhbmNlbCgpOwotICAgIH0KLSAgfSAvLyBTZWxlY3RvclRocmVhZAotCi0gIC8qKgotICAgKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgYSBzb3J0IG9mIHN0YXRlIG1hY2hpbmUgYXJvdW5kIHRoZSBpbnRlcmFjdGlvbiB3aXRoCi0gICAqIGEgY2xpZW50IGFuZCBhbiBpbnZva2VyLiBJdCBtYW5hZ2VzIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEsCi0gICAqIGdldHRpbmcgaXQgaGFuZGVkIG9mZiBhcyB3cmFwcGVkIHRyYW5zcG9ydHMsIGFuZCB0aGVuIHRoZSB3cml0aW5nIG9mCi0gICAqIHJlcG9uc2UgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoZSBwcm9jZXNzIGl0IG1hbmFnZXMgZmxpcHBpbmcgdGhlCi0gICAqIHJlYWQgYW5kIHdyaXRlIGJpdHMgb24gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIGl0cyBjbGllbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgRnJhbWVCdWZmZXIgewotICAgIC8vCi0gICAgLy8gUG9zc2libGUgc3RhdGVzIGZvciB0aGUgRnJhbWVCdWZmZXIgc3RhdGUgbWFjaGluZS4KLSAgICAvLwotICAgIC8vIGluIHRoZSBtaWRzdCBvZiByZWFkaW5nIHRoZSBmcmFtZSBzaXplIG9mZiB0aGUgd2lyZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFESU5HX0ZSQU1FX1NJWkUgPSAxOwotICAgIC8vIHJlYWRpbmcgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIG5vdywgYnV0IG5vdCBhbGwgdGhlIHdheSBkb25lIHlldAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFESU5HX0ZSQU1FID0gMjsKLSAgICAvLyBjb21wbGV0ZWx5IHJlYWQgdGhlIGZyYW1lLCBzbyBhbiBpbnZvY2F0aW9uIGNhbiBub3cgaGFwcGVuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfRlJBTUVfQ09NUExFVEUgPSAzOwotICAgIC8vIHdhaXRpbmcgdG8gZ2V0IHN3aXRjaGVkIHRvIGxpc3RlbmluZyBmb3Igd3JpdGUgZXZlbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFID0gNDsKLSAgICAvLyBzdGFydGVkIHdyaXRpbmcgcmVzcG9uc2UgZGF0YSwgbm90IGZ1bGx5IGNvbXBsZXRlIHlldAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklUSU5HID0gNjsKLSAgICAvLyBhbm90aGVyIHRocmVhZCB3YW50cyB0aGlzIGZyYW1lYnVmZmVyIHRvIGdvIGJhY2sgdG8gcmVhZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FJVElOR19SRUdJU1RFUl9SRUFEID0gNzsKLSAgICAvLyB3ZSB3YW50IG91ciB0cmFuc3BvcnQgYW5kIHNlbGVjdGlvbiBrZXkgaW52YWxpZGF0ZWQgaW4gdGhlIHNlbGVjdG9yIHRocmVhZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FJVElOR19DTE9TRSA9IDg7Ci0KLSAgICAvLwotICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcwotICAgIC8vCi0KLSAgICAvLyB0aGUgYWN0dWFsIHRyYW5zcG9ydCBob29rZWQgdXAgdG8gdGhlIGNsaWVudC4KLSAgICBwcml2YXRlIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc187Ci0KLSAgICAvLyB0aGUgU2VsZWN0aW9uS2V5IHRoYXQgY29ycmVzcG9uZHMgdG8gb3VyIHRyYW5zcG9ydAotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleV87Ci0KLSAgICAvLyB3aGVyZSBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nL3dyaXRpbmcgYXJlIHdlPwotICAgIHByaXZhdGUgaW50IHN0YXRlXyA9IFJFQURJTkdfRlJBTUVfU0laRTsKLQotICAgIC8vIHRoZSBCeXRlQnVmZmVyIHdlJ2xsIGJlIHVzaW5nIHRvIHdyaXRlIGFuZCByZWFkLCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGJ1ZmZlcl87Ci0KLSAgICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOwotCi0gICAgcHVibGljIEZyYW1lQnVmZmVyKCBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5KSB7Ci0gICAgICB0cmFuc18gPSB0cmFuczsKLSAgICAgIHNlbGVjdGlvbktleV8gPSBzZWxlY3Rpb25LZXk7Ci0gICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gcmVhZC4gVGhlIHNlbGVjdG9yIGxvb3Agc2hvdWxkIGhhdmUKLSAgICAgKiByZWNlaXZlZCBhIHJlYWQgZXZlbnQgZm9yIHRoaXMgRnJhbWVCdWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGxpdmUgb24sIGZhbHNlIGlmIGl0IHNob3VsZCBiZQotICAgICAqIGNsb3NlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYWQoKSB7Ci0gICAgICBpZiAoc3RhdGVfID09IFJFQURJTkdfRlJBTUVfU0laRSkgewotICAgICAgICAvLyB0cnkgdG8gcmVhZCB0aGUgZnJhbWUgc2l6ZSBjb21wbGV0ZWx5Ci0gICAgICAgIGlmICghaW50ZXJuYWxSZWFkKCkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgZnJhbWUgc2l6ZSBoYXMgYmVlbiByZWFkIGNvbXBsZXRlbHksIHRoZW4gcHJlcGFyZSB0byByZWFkIHRoZQotICAgICAgICAvLyBhY3R1YWwgZnJhbWUuCi0gICAgICAgIGlmIChidWZmZXJfLnJlbWFpbmluZygpID09IDApIHsKLSAgICAgICAgICAvLyBwdWxsIG91dCB0aGUgZnJhbWUgc2l6ZSBhcyBhbiBpbnRlZ2VyLgotICAgICAgICAgIGludCBmcmFtZVNpemUgPSBidWZmZXJfLmdldEludCgwKTsKLSAgICAgICAgICBpZiAoZnJhbWVTaXplIDw9IDApIHsKLSAgICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgIiArIGZyYW1lU2l6ZQotICAgICAgICAgICAgICArICIuIEFyZSB5b3UgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydCBvbiB0aGUgY2xpZW50IHNpZGU/Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gaWYgdGhpcyBmcmFtZSB3aWxsIGFsd2F5cyBiZSB0b28gbGFyZ2UgZm9yIHRoaXMgc2VydmVyLCBsb2cgdGhlCi0gICAgICAgICAgLy8gZXJyb3IgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotICAgICAgICAgIGlmIChmcmFtZVNpemUgPiBNQVhfUkVBRF9CVUZGRVJfQllURVMpIHsKLSAgICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVhZCBhIGZyYW1lIHNpemUgb2YgIiArIGZyYW1lU2l6ZQotICAgICAgICAgICAgICArICIsIHdoaWNoIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBidWZmZXIgc2l6ZSBmb3IgQUxMIGNvbm5lY3Rpb25zLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBwdXNoIHVzIG92ZXIgdGhlIG1lbW9yeSBsaW1pdCwgdGhlbiByZXR1cm4uCi0gICAgICAgICAgLy8gd2l0aCBsdWNrLCBtb3JlIG1lbW9yeSB3aWxsIGZyZWUgdXAgdGhlIG5leHQgdGltZSBhcm91bmQuCi0gICAgICAgICAgaWYgKHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCArIGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gaW5jcmVtZW1lbnQgdGhlIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIHRvIHJlYWQgYnVmZmVycwotICAgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCArPSBmcmFtZVNpemU7Ci0KLSAgICAgICAgICAvLyByZWFsbG9jYXRlIHRoZSByZWFkYnVmZmVyIGFzIGEgZnJhbWUtc2l6ZWQgYnVmZmVyCi0gICAgICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZnJhbWVTaXplKTsKLQotICAgICAgICAgIHN0YXRlXyA9IFJFQURJTkdfRlJBTUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gdGhpcyBza2lwcyB0aGUgY2hlY2sgb2YgUkVBRElOR19GUkFNRSBzdGF0ZSBiZWxvdywgc2luY2Ugd2UgY2FuJ3QKLSAgICAgICAgICAvLyBwb3NzaWJseSBnbyBvbiB0byB0aGF0IHN0YXRlIGlmIHRoZXJlJ3MgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgYXQKLSAgICAgICAgICAvLyB0aGlzIG9uZS4KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0byBmYWxsIHRocm91Z2ggZnJvbSB0aGUgUkVBRElOR19GUkFNRV9TSVpFIHNlY3Rpb24KLSAgICAgIC8vIHRvIFJFQURJTkdfRlJBTUUgaWYgdGhlcmUncyBhbHJlYWR5IHNvbWUgZnJhbWUgZGF0YSBhdmFpbGFibGUgb25jZQotICAgICAgLy8gUkVBRElOR19GUkFNRV9TSVpFIGlzIGNvbXBsZXRlLgotCi0gICAgICBpZiAoc3RhdGVfID09IFJFQURJTkdfRlJBTUUpIHsKLSAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNpbmNlIHdlJ3JlIGFscmVhZHkgaW4gdGhlIHNlbGVjdCBsb29wIGhlcmUgZm9yIHN1cmUsIHdlIGNhbiBqdXN0Ci0gICAgICAgIC8vIG1vZGlmeSBvdXIgc2VsZWN0aW9uIGtleSBkaXJlY3RseS4KLSAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgewotICAgICAgICAgIC8vIGdldCByaWQgb2YgdGhlIHJlYWQgc2VsZWN0IGludGVyZXN0cwotICAgICAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoMCk7Ci0gICAgICAgICAgc3RhdGVfID0gUkVBRF9GUkFNRV9DT01QTEVURTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyBpZiB3ZSBmYWxsIHRocm91Z2ggdG8gdGhpcyBwb2ludCwgdGhlbiB0aGUgc3RhdGUgbXVzdCBiZSBpbnZhbGlkLgotICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIHdhcyBjYWxsZWQgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byB3cml0ZSBpdHMgb3V0cHV0IHRvIHRoZSBmaW5hbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGUoKSB7Ci0gICAgICBpZiAoc3RhdGVfID09IFdSSVRJTkcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAodHJhbnNfLndyaXRlKGJ1ZmZlcl8pIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlISIsIGUpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlJ3JlIGRvbmUgd3JpdGluZy4gbm93IHdlIG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8gcmVhZGluZy4KLSAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgewotICAgICAgICAgIHByZXBhcmVSZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIExPR0dFUi5lcnJvcigiV3JpdGUgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBzZXQgaXRzIGludGVyZXN0IHRvIHdyaXRlLCBvbmNlIGRhdGEKLSAgICAgKiBoYXMgY29tZSBpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7Ci0gICAgICBpZiAoc3RhdGVfID09IEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFKSB7Ci0gICAgICAgIC8vIHNldCB0aGUgT1BfV1JJVEUgaW50ZXJlc3QKLSAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOwotICAgICAgICBzdGF0ZV8gPSBXUklUSU5HOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gQVdBSVRJTkdfUkVHSVNURVJfUkVBRCkgewotICAgICAgICBwcmVwYXJlUmVhZCgpOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gQVdBSVRJTkdfQ0xPU0UpewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBzZWxlY3Rpb25LZXlfLmNhbmNlbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKAotICAgICAgICAgICJjaGFuZ2VTZWxlY3RJbnRlcmVzdCB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIgotICAgICAgICAgICsgc3RhdGVfICsgIikiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaHV0IHRoZSBjb25uZWN0aW9uIGRvd24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAvLyBpZiB3ZSdyZSBiZWluZyBjbG9zZWQgZHVlIHRvIGFuIGVycm9yLCB3ZSBtaWdodCBoYXZlIGFsbG9jYXRlZCBhCi0gICAgICAvLyBidWZmZXIgdGhhdCB3ZSBuZWVkIHRvIHN1YnRyYWN0IGZvciBvdXIgbWVtb3J5IGFjY291bnRpbmcuCi0gICAgICBpZiAoc3RhdGVfID09IFJFQURJTkdfRlJBTUUgfHwgc3RhdGVfID09IFJFQURfRlJBTUVfQ09NUExFVEUpIHsKLSAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkIC09IGJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGg7Ci0gICAgICB9Ci0gICAgICB0cmFuc18uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGlzIEZyYW1lQnVmZmVyIGhhcyBhIGZ1bGwgZnJhbWUgcmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYW1lRnVsbHlSZWFkKCkgewotICAgICAgcmV0dXJuIHN0YXRlXyA9PSBSRUFEX0ZSQU1FX0NPTVBMRVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFmdGVyIHRoZSBwcm9jZXNzb3IgaGFzIHByb2Nlc3NlZCB0aGUgaW52b2NhdGlvbiwgd2hhdGV2ZXIgdGhyZWFkIGlzCi0gICAgICogbWFuYWdpbmcgaW52b2NhdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhpcyBGcmFtZUJ1ZmZlciBzbyB3ZQotICAgICAqIGtub3cgaXQncyB0aW1lIHRvIHN0YXJ0IHRyeWluZyB0byB3cml0ZSBhZ2Fpbi4gQWxzbywgaWYgaXQgdHVybnMgb3V0Ci0gICAgICogdGhhdCB0aGVyZSBhY3R1YWxseSBpc24ndCBhbnkgZGF0YSBpbiB0aGUgcmVzcG9uc2UgYnVmZmVyLCB3ZSdsbCBza2lwCi0gICAgICogdHJ5aW5nIHRvIHdyaXRlIGFuZCBpbnN0ZWFkIGdvIGJhY2sgdG8gcmVhZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNwb25zZVJlYWR5KCkgewotICAgICAgLy8gdGhlIHJlYWQgYnVmZmVyIGlzIGRlZmluaXRlbHkgbm8gbG9uZ2VyIGluIHVzZSwgc28gd2Ugd2lsbCBkZWNyZW1lbnQKLSAgICAgIC8vIG91ciByZWFkIGJ1ZmZlciBjb3VudC4gd2UgZG8gdGhpcyBoZXJlIGFzIHdlbGwgYXMgaW4gY2xvc2UgYmVjYXVzZQotICAgICAgLy8gd2UnZCBsaWtlIHRvIGZyZWUgdGhpcyByZWFkIG1lbW9yeSB1cCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGZvciBvdGhlcgotICAgICAgLy8gY2xpZW50cy4KLSAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCAtPSBidWZmZXJfLmFycmF5KCkubGVuZ3RoOwotCi0gICAgICBpZiAocmVzcG9uc2VfLmxlbigpID09IDApIHsKLSAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gcmVhZGluZyBhZ2Fpbi4gdGhpcyB3YXMgcHJvYmFibHkgYW4gb25ld2F5IG1ldGhvZAotICAgICAgICBzdGF0ZV8gPSBBV0FJVElOR19SRUdJU1RFUl9SRUFEOwotICAgICAgICBidWZmZXJfID0gbnVsbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLndyYXAocmVzcG9uc2VfLmdldCgpLCAwLCByZXNwb25zZV8ubGVuKCkpOwotCi0gICAgICAgIC8vIHNldCBzdGF0ZSB0aGF0IHdlJ3JlIHdhaXRpbmcgdG8gYmUgc3dpdGNoZWQgdG8gd3JpdGUuIHdlIGRvIHRoaXMKLSAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgdGhyb3VnaCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSBiZWNhdXNlIHRoZXJlIGlzIGEKLSAgICAgICAgLy8gcG9zc2liaWxpdHkgdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGh1cyBjdXJyZW50bHkKLSAgICAgICAgLy8gYmxvY2tlZCBpbiBzZWxlY3QoKS4gKHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBwbGFjZSBmb3IgdGhlIHNha2Ugb2YKLSAgICAgICAgLy8gdGhlIEhzSGEgc2VydmVyLikKLSAgICAgICAgc3RhdGVfID0gQVdBSVRJTkdfUkVHSVNURVJfV1JJVEU7Ci0gICAgICB9Ci0gICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3R1YWxseSBpbnZva2UgdGhlIG1ldGhvZCBzaWduaWZpZWQgYnkgdGhpcyBGcmFtZUJ1ZmZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2UoKSB7Ci0gICAgICBUVHJhbnNwb3J0IGluVHJhbnMgPSBnZXRJbnB1dFRyYW5zcG9ydCgpOwotICAgICAgVFByb3RvY29sIGluUHJvdCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpblRyYW5zKTsKLSAgICAgIFRQcm90b2NvbCBvdXRQcm90ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChnZXRPdXRwdXRUcmFuc3BvcnQoKSk7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zKS5wcm9jZXNzKGluUHJvdCwgb3V0UHJvdCk7Ci0gICAgICAgIHJlc3BvbnNlUmVhZHkoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgewotICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIHRlKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgZSk7Ci0gICAgICB9Ci0gICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYW4gZXhjZXB0aW9uLgotICAgICAgc3RhdGVfID0gQVdBSVRJTkdfQ0xPU0U7Ci0gICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcmFwIHRoZSByZWFkIGJ1ZmZlciBpbiBhIG1lbW9yeS1iYXNlZCB0cmFuc3BvcnQgc28gYSBwcm9jZXNzb3IgY2FuIHJlYWQKLSAgICAgKiB0aGUgZGF0YSBpdCBuZWVkcyB0byBoYW5kbGUgYW4gaW52b2NhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRUcmFuc3BvcnQgZ2V0SW5wdXRUcmFuc3BvcnQoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChidWZmZXJfLmFycmF5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHJhbnNwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGludm9rZXIgZm9yIHJlc3BvbmRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUVHJhbnNwb3J0IGdldE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICAgIHJlc3BvbnNlXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQocmVzcG9uc2VfKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCi0gICAgICogY29ubmVjdGlvbiBjbG9zZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGludGVybmFsUmVhZCgpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmICh0cmFuc18ucmVhZChidWZmZXJfKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gaW4gaW50ZXJuYWxSZWFkISIsIGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UncmUgZG9uZSB3cml0aW5nLCBzbyByZXNldCBvdXIgaW50ZXJlc3Qgb3BzIGFuZCBjaGFuZ2Ugc3RhdGUgYWNjb3JkaW5nbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVSZWFkKCkgewotICAgICAgLy8gd2UgY2FuIHNldCBvdXIgaW50ZXJlc3QgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgcXVldWUgYmVjYXVzZQotICAgICAgLy8gd2UncmUgaW4gdGhlIHNlbGVjdCB0aHJlYWQuCi0gICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9SRUFEKTsKLSAgICAgIC8vIGdldCByZWFkeSBmb3IgYW5vdGhlciBnby1hcm91bmQKLSAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOwotICAgICAgc3RhdGVfID0gUkVBRElOR19GUkFNRV9TSVpFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gdGhpcyBGcmFtZUJ1ZmZlciBuZWVkcyB0byBjaGFuZ2UgaXQncyBzZWxlY3QgaW50ZXJlc3RzIGFuZCBleGVjdXRpb24KLSAgICAgKiBtaWdodCBub3QgYmUgaW4gdGhlIHNlbGVjdCB0aHJlYWQsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBtYWtlIHN1cmUgdGhlCi0gICAgICogaW50ZXJlc3QgY2hhbmdlIGdldHMgZG9uZSB3aGVuIHRoZSBzZWxlY3QgdGhyZWFkIHdha2VzIGJhY2sgdXAuIFdoZW4gdGhlCi0gICAgICogY3VycmVudCB0aHJlYWQgaXMgdGhlIHNlbGVjdCB0aHJlYWQsIHRoZW4gaXQganVzdCBkb2VzIHRoZSBpbnRlcmVzdCBjaGFuZ2UKLSAgICAgKiBpbW1lZGlhdGVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCkgewotICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gc2VsZWN0VGhyZWFkXykgewotICAgICAgICBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFROb25ibG9ja2luZ1NlcnZlci50aGlzLnJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSh0aGlzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gLy8gRnJhbWVCdWZmZXIKLQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9ucyB7Ci0gICAgcHVibGljIGxvbmcgbWF4UmVhZEJ1ZmZlckJ5dGVzID0gTG9uZy5NQVhfVkFMVUU7Ci0KLSAgICBwdWJsaWMgT3B0aW9ucygpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLSAgICAgIGlmIChtYXhSZWFkQnVmZmVyQnl0ZXMgPD0gMTAyNCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgbXVzdCBhbGxvY2F0ZSBhdCBsZWFzdCAxS0IgdG8gdGhlIHJlYWQgYnVmZmVyLiIpOwotICAgICAgfQotICAgIH0KLSAgfQorICB9IC8vIFNlbGVjdEFjY2VwdFRocmVhZAogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQppbmRleCBlYWZlMGMxLi5iYWMwNmIyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQpAQCAtMTksNiArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CkBAIC0zMSw2ICszMiw2NyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlciB7CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPEFyZ3M+IHsKKyAgICBwdWJsaWMgQXJncyhUU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+PiB7CisgICAgZmluYWwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RTZXJ2ZXJBcmdzKFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgcHVibGljIFQgcHJvY2Vzc29yRmFjdG9yeShUUHJvY2Vzc29yRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIHByb2Nlc3NvcihUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3Nvcik7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgdHJhbnNwb3J0RmFjdG9yeShUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIGlucHV0VHJhbnNwb3J0RmFjdG9yeShUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeShUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIHByb3RvY29sRmFjdG9yeShUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIGlucHV0UHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb3JlIHByb2Nlc3NvcgogICAgKi8KQEAgLTYxLDU1ICsxMjMsMjEgQEAKICAgICovCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeV87CiAKLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3JzLgotICAgKi8KKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzU2VydmluZzsKIAotICBwcm90ZWN0ZWQgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKLSAgfQorICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXJfOwogCi0gIHByb3RlY3RlZCBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKLSAgfQorICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCisgIC8vIFBsZWFzZSBzZWUgVEhSSUZULTE3OTUgZm9yIHRoZSB1c2FnZSBvZiB0aGlzIGZsYWcKKyAgcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZF8gPSBmYWxzZTsKIAotICBwcm90ZWN0ZWQgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHByb2Nlc3NvckZhY3RvcnlfID0gcHJvY2Vzc29yRmFjdG9yeTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfID0gc2VydmVyVHJhbnNwb3J0OwotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgIHByb3RlY3RlZCBUU2VydmVyKEFic3RyYWN0U2VydmVyQXJncyBhcmdzKSB7CisgICAgcHJvY2Vzc29yRmFjdG9yeV8gPSBhcmdzLnByb2Nlc3NvckZhY3Rvcnk7CisgICAgc2VydmVyVHJhbnNwb3J0XyA9IGFyZ3Muc2VydmVyVHJhbnNwb3J0OworICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBhcmdzLmlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGFyZ3Mub3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBhcmdzLmlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBhcmdzLm91dHB1dFByb3RvY29sRmFjdG9yeTsKICAgfQogCiAgIC8qKgpAQCAtMTIzLDQgKzE1MSwyNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgc3RvcCgpIHt9CiAKKyAgcHVibGljIGJvb2xlYW4gaXNTZXJ2aW5nKCkgeworICAgIHJldHVybiBpc1NlcnZpbmc7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2aW5nKGJvb2xlYW4gc2VydmluZykgeworICAgIGlzU2VydmluZyA9IHNlcnZpbmc7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9CisKKyAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBldmVudEhhbmRsZXJfOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZ2V0U2hvdWxkU3RvcCgpIHsKKyAgICByZXR1cm4gdGhpcy5zdG9wcGVkXzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNob3VsZFN0b3AoYm9vbGVhbiBzaG91bGRTdG9wKSB7CisgICAgdGhpcy5zdG9wcGVkXyA9IHNob3VsZFN0b3A7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2OWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogSW50ZXJmYWNlIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyIGNvcmUuIFRvCisgKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQorICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKKyAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAorICogaW5zdGFuY2UncyBzdGF0ZSkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAqLworICB2b2lkIHByZVNlcnZlKCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgKi8KKyAgU2VydmVyQ29udGV4dCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyCisgICAqIGNvbnRleHQuCisgICAqLworICB2b2lkIGRlbGV0ZUNvbnRleHQoU2VydmVyQ29udGV4dCBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAqLworICB2b2lkIHByb2Nlc3NDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKaW5kZXggNTg1ODY1Yy4uZTgxNWIyYyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKQEAgLTIxLDE0ICsyMSw5IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtNDAsNTcgKzM1LDExIEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRTaW1wbGVTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAotICBwcml2YXRlIGJvb2xlYW4gc3RvcHBlZF8gPSBmYWxzZTsKLQotICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICBzdXBlcihuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KTsKKyAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKICAgfQogCi0gIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBzdXBlcihuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgc3VwZXIobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0KTsKLSAgfQotCi0gIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotCiAgIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIHN0b3BwZWRfID0gZmFsc2U7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKQEAgLTk4LDYgKzQ3LDEzIEBACiAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAorICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKKyAgICB9CisKKyAgICBzZXRTZXJ2aW5nKHRydWUpOworCiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewogICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOwogICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOwpAQCAtMTA1LDYgKzYxLDcgQEAKICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICBTZXJ2ZXJDb250ZXh0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKICAgICAgIHRyeSB7CiAgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KCk7CiAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewpAQCAtMTEzLDcgKzcwLDE3IEBACiAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CiAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CiAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgd2hpbGUgKHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkge30KKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGV2ZW50SGFuZGxlcl8uY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KQEAgLTEyNyw2ICs5NCwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICB9CisKICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CiAgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CiAgICAgICB9CkBAIC0xMzYsNiArMTA3LDcgQEAKICAgICAgIH0KIAogICAgIH0KKyAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKaW5kZXggNWI0NDJhMC4uMTY5N2FkNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQpAQCAtMTksMjYgKzE5LDIzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNhc2xUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKwogCiAvKioKICAqIFNlcnZlciB3aGljaCB1c2VzIEphdmEncyBidWlsdCBpbiBUaHJlYWRQb29sIG1hbmFnZW1lbnQgdG8gc3Bhd24gb2ZmCkBAIC00NiwxNDQgKzQzLDE4NyBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0KICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRUaHJlYWRQb29sU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPEFyZ3M+IHsKKyAgICBwdWJsaWMgaW50IG1pbldvcmtlclRocmVhZHMgPSA1OworICAgIHB1YmxpYyBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlOworICAgIHB1YmxpYyBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKKyAgICBwdWJsaWMgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICBwdWJsaWMgaW50IHJlcXVlc3RUaW1lb3V0ID0gMjA7CisgICAgcHVibGljIFRpbWVVbml0IHJlcXVlc3RUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgcHVibGljIGludCBiZUJhY2tvZmZTbG90TGVuZ3RoID0gMTAwOworICAgIHB1YmxpYyBUaW1lVW5pdCBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsKKworICAgIHB1YmxpYyBBcmdzKFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1pbldvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWF4V29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFZhbChpbnQgbikgeworICAgICAgc3RvcFRpbWVvdXRWYWwgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICBzdG9wVGltZW91dFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHJlcXVlc3RUaW1lb3V0KGludCBuKSB7CisgICAgICByZXF1ZXN0VGltZW91dCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyByZXF1ZXN0VGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCBsZW5ndGgKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoKGludCBuKSB7CisgICAgICBiZUJhY2tvZmZTbG90TGVuZ3RoID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCB0aW1lIHVuaXQKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdChUaW1lVW5pdCB0dSkgeworICAgICAgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCiAgIC8vIEV4ZWN1dG9yIHNlcnZpY2UgZm9yIGhhbmRsaW5nIGNsaWVudCBjb25uZWN0aW9ucwogICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2VfOwogCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfOworICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdDsKIAotICAvLyBTZXJ2ZXIgb3B0aW9ucwotICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uc187CisgIHByaXZhdGUgZmluYWwgbG9uZyBzdG9wVGltZW91dFZhbDsKIAotICAvLyBDdXN0b21pemFibGUgc2VydmVyIG9wdGlvbnMKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zIHsKLSAgICBwdWJsaWMgaW50IG1pbldvcmtlclRocmVhZHMgPSA1OwotICAgIHB1YmxpYyBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgIHB1YmxpYyBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKLSAgICBwdWJsaWMgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCByZXF1ZXN0VGltZW91dFVuaXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlcXVlc3RUaW1lb3V0OworCisgIHByaXZhdGUgZmluYWwgbG9uZyBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisKKyAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKEFyZ3MgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworCisgICAgc3RvcFRpbWVvdXRVbml0ID0gYXJncy5zdG9wVGltZW91dFVuaXQ7CisgICAgc3RvcFRpbWVvdXRWYWwgPSBhcmdzLnN0b3BUaW1lb3V0VmFsOworICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IGFyZ3MucmVxdWVzdFRpbWVvdXRVbml0OworICAgIHJlcXVlc3RUaW1lb3V0ID0gYXJncy5yZXF1ZXN0VGltZW91dDsKKyAgICBiZUJhY2tvZmZTbG90SW5NaWxsaXMgPSBhcmdzLmJlQmFja29mZlNsb3RMZW5ndGhVbml0LnRvTWlsbGlzKGFyZ3MuYmVCYWNrb2ZmU2xvdExlbmd0aCk7CisKKyAgICBleGVjdXRvclNlcnZpY2VfID0gYXJncy5leGVjdXRvclNlcnZpY2UgIT0gbnVsbCA/CisgICAgICAgIGFyZ3MuZXhlY3V0b3JTZXJ2aWNlIDogY3JlYXRlRGVmYXVsdEV4ZWN1dG9yU2VydmljZShhcmdzKTsKICAgfQogCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7Ci0gIH0KLQotICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotICAgIG9wdGlvbnNfID0gbmV3IE9wdGlvbnMoKTsKLSAgICBleGVjdXRvclNlcnZpY2VfID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykgewotICAgIHRoaXMobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBvcHRpb25zKTsKLSAgfQotCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLQotICAgIGV4ZWN1dG9yU2VydmljZV8gPSBudWxsOwotCisgIHByaXZhdGUgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBjcmVhdGVEZWZhdWx0RXhlY3V0b3JTZXJ2aWNlKEFyZ3MgYXJncykgewogICAgIFN5bmNocm9ub3VzUXVldWU8UnVubmFibGU+IGV4ZWN1dG9yUXVldWUgPQogICAgICAgbmV3IFN5bmNocm9ub3VzUXVldWU8UnVubmFibGU+KCk7Ci0KLSAgICBleGVjdXRvclNlcnZpY2VfID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihvcHRpb25zLm1pbldvcmtlclRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXhXb3JrZXJUaHJlYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JRdWV1ZSk7Ci0KLSAgICBvcHRpb25zXyA9IG9wdGlvbnM7CisgICAgcmV0dXJuIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoYXJncy5taW5Xb3JrZXJUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubWF4V29ya2VyVGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUXVldWUpOwogICB9CiAKLQotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICB0cnkgeworICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlXzsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlU2VydmUoKSB7CisgIAl0cnkgewogICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgbGlzdGVuaW5nLiIsIHR0eCk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAorICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKKyAgICB9CiAgICAgc3RvcHBlZF8gPSBmYWxzZTsKKyAgICBzZXRTZXJ2aW5nKHRydWUpOworICAgIAorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2VydmUoKSB7CisgIAlpZiAoIXByZVNlcnZlKCkpIHsKKyAgCQlyZXR1cm47CisgIAl9CisKKyAgCWV4ZWN1dGUoKTsKKyAgCXdhaXRGb3JTaHV0ZG93bigpOworICAgIAorICAgIHNldFNlcnZpbmcoZmFsc2UpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgeworICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgIHdoaWxlICghc3RvcHBlZF8pIHsKLSAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgICAgdHJ5IHsKICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdCgpOwogICAgICAgICBXb3JrZXJQcm9jZXNzIHdwID0gbmV3IFdvcmtlclByb2Nlc3MoY2xpZW50KTsKLSAgICAgICAgZXhlY3V0b3JTZXJ2aWNlXy5leGVjdXRlKHdwKTsKKworICAgICAgICBpbnQgcmV0cnlDb3VudCA9IDA7CisgICAgICAgIGxvbmcgcmVtYWluVGltZUluTWlsbGlzID0gcmVxdWVzdFRpbWVvdXRVbml0LnRvTWlsbGlzKHJlcXVlc3RUaW1lb3V0KTsKKyAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2VfLmV4ZWN1dGUod3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICByZXRyeUNvdW50Kys7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpblRpbWVJbk1pbGxpcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgIC8vZG8gYSB0cnVuY2F0ZWQgMjAgYmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xlZXAKKyAgICAgICAgICAgICAgICAgIGxvbmcgc2xlZXBUaW1lSW5NaWxsaXMgPSAoKGxvbmcpIChyYW5kb20ubmV4dERvdWJsZSgpICoKKyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgTWF0aC5taW4ocmV0cnlDb3VudCwgMjApKSkpICogYmVCYWNrb2ZmU2xvdEluTWlsbGlzOworICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lSW5NaWxsaXMgPSBNYXRoLm1pbihzbGVlcFRpbWVJbk1pbGxpcywgcmVtYWluVGltZUluTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcChzbGVlcFRpbWVJbk1pbGxpcyk7CisgICAgICAgICAgICAgICAgICByZW1haW5UaW1lSW5NaWxsaXMgPSByZW1haW5UaW1lSW5NaWxsaXMgLSBzbGVlcFRpbWVJbk1pbGxpczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICB3cCA9IG51bGw7CisgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiVGFzayBoYXMgYmVlbiByZWplY3RlZCBieSBFeGVjdXRvclNlcnZpY2UgIiArIHJldHJ5Q291bnQKKyAgICAgICAgICAgICAgICAgICAgICArICIgdGltZXMgdGlsbCB0aW1lZG91dCwgcmVhc29uOiAiICsgdCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyB0byBwbGFjZSBjbGllbnQgb24gZXhlY3V0b3IgcXVldWUuIik7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGVjdXRvclNlcnZpY2UgdGhyZXcgZXJyb3I6ICIgKyB0LCB0KTsKKyAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvL2ZvciBvdGhlciBwb3NzaWJsZSBydW50aW1lIGVycm9ycyBmcm9tIEV4ZWN1dG9yU2VydmljZSwgc2hvdWxkIGFsc28gbm90IGtpbGwgc2VydmUKKyAgICAgICAgICAgICAgTE9HR0VSLndhcm4oIkV4ZWN1dG9yU2VydmljZSB0aHJldyBlcnJvcjogIiArIHQsIHQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICAgIGlmICghc3RvcHBlZF8pIHsKICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKQEAgLTE5MSwxNCArMjMxLDE2IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICBleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKKyAgCWV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKIAogICAgIC8vIExvb3AgdW50aWwgYXdhaXRUZXJtaW5hdGlvbiBmaW5hbGx5IGRvZXMgcmV0dXJuIHdpdGhvdXQgYSBpbnRlcnJ1cHRlZAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKICAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKICAgICAvLyBhcHByb3ByaWF0ZWx5LgotICAgIGxvbmcgdGltZW91dE1TID0gb3B0aW9uc18uc3RvcFRpbWVvdXRVbml0LnRvTWlsbGlzKG9wdGlvbnNfLnN0b3BUaW1lb3V0VmFsKTsKKyAgICBsb25nIHRpbWVvdXRNUyA9IHN0b3BUaW1lb3V0VW5pdC50b01pbGxpcyhzdG9wVGltZW91dFZhbCk7CiAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICB3aGlsZSAodGltZW91dE1TID49IDApIHsKICAgICAgIHRyeSB7CkBAIC0yNDIsMjkgKzI4NCw2MiBAQAogICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwogICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwogICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKworICAgICAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIgPSBudWxsOworICAgICAgU2VydmVyQ29udGV4dCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKICAgICAgIHRyeSB7CiAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihjbGllbnRfKTsKICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgZXZlbnRIYW5kbGVyID0gZ2V0RXZlbnRIYW5kbGVyKCk7CisgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICB9CiAgICAgICAgIC8vIHdlIGNoZWNrIHN0b3BwZWRfIGZpcnN0IHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gYmUgc2h1dHRpbmcKICAgICAgICAgLy8gZG93bi4gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGdyYWNlZnVsIHNodXRkb3duLgotICAgICAgICB3aGlsZSAoIXN0b3BwZWRfICYmIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkge30KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIC8vIEFzc3VtZSB0aGUgY2xpZW50IGRpZWQgYW5kIGNvbnRpbnVlIHNpbGVudGx5CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihzdG9wcGVkXyB8fCAhcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHR4KSB7CiAgICAgICAgIExPR0dFUi5lcnJvcigiVGhyaWZ0IGVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgdHgpOwogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOwotICAgICAgfQotCi0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOwotICAgICAgfQotCi0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIC8vIFdlJ2xsIHVzdWFsbHkgcmVjZWl2ZSBSdW50aW1lRXhjZXB0aW9uIHR5cGVzIGhlcmUKKyAgICAgICAgLy8gTmVlZCB0byB1bndyYXAgdG8gYXNjZXJ0YWluIHJlYWwgY2F1c2luZyBleGNlcHRpb24gYmVmb3JlIHdlIGNob29zZSB0byBpZ25vcmUKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxDYXVzZSA9IHguZ2V0Q2F1c2UoKTsKKyAgICAgICAgLy8gSWdub3JlIGVyci1sb2dnaW5nIGFsbCB0cmFuc3BvcnQtbGV2ZWwvdHlwZSBleGNlcHRpb25zCisgICAgICAgIGlmICgocmVhbENhdXNlICE9IG51bGwgJiYgcmVhbENhdXNlIGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHx8ICh4IGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoCisgICAgICAgICAgICAgICJSZWNlaXZlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIExvZyB0aGUgZXhjZXB0aW9uIGF0IGVycm9yIGxldmVsIGFuZCBjb250aW51ZQorICAgICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudF8uaXNPcGVuKCkpIHsKKyAgICAgICAgICBjbGllbnRfLmNsb3NlKCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBIEhhbGYtU3luYy9IYWxmLUFzeW5jIHNlcnZlciB3aXRoIGEgc2VwYXJhdGUgcG9vbCBvZiB0aHJlYWRzIHRvIGhhbmRsZQorICogbm9uLWJsb2NraW5nIEkvTy4gQWNjZXB0cyBhcmUgaGFuZGxlZCBvbiBhIHNpbmdsZSB0aHJlYWQsIGFuZCBhIGNvbmZpZ3VyYWJsZQorICogbnVtYmVyIG9mIG5vbmJsb2NraW5nIHNlbGVjdG9yIHRocmVhZHMgbWFuYWdlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgY2xpZW50CisgKiBjb25uZWN0aW9ucy4gQSBzeW5jaHJvbm91cyB3b3JrZXIgdGhyZWFkIHBvb2wgaGFuZGxlcyBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzLgorICoKKyAqIFBlcmZvcm1zIGJldHRlciB0aGFuIFROb25ibG9ja2luZ1NlcnZlci9USHNIYVNlcnZlciBpbiBtdWx0aS1jb3JlCisgKiBlbnZpcm9ubWVudHMgd2hlbiB0aGUgdGhlIGJvdHRsZW5lY2sgaXMgQ1BVIG9uIHRoZSBzaW5nbGUgc2VsZWN0b3IgdGhyZWFkCisgKiBoYW5kbGluZyBJL08uIEluIGFkZGl0aW9uLCBiZWNhdXNlIHRoZSBhY2NlcHQgaGFuZGxpbmcgaXMgZGVjb3VwbGVkIGZyb20KKyAqIHJlYWRzL3dyaXRlcyBhbmQgaW52b2NhdGlvbiwgdGhlIHNlcnZlciBoYXMgYmV0dGVyIGFiaWxpdHkgdG8gaGFuZGxlIGJhY2stCisgKiBwcmVzc3VyZSBmcm9tIG5ldyBjb25uZWN0aW9ucyAoZS5nLiBzdG9wIGFjY2VwdGluZyB3aGVuIGJ1c3kpLgorICoKKyAqIExpa2UgVE5vbmJsb2NraW5nU2VydmVyLCBpdCByZWxpZXMgb24gdGhlIHVzZSBvZiBURnJhbWVkVHJhbnNwb3J0LgorICovCitwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8QXJncz4geworCisgICAgLyoqIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3Igc2VsZWN0aW5nIG9uIGFscmVhZHktYWNjZXB0ZWQgY29ubmVjdGlvbnMgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdG9yVGhyZWFkcyA9IDI7CisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhlIGV4ZWN1dG9yIHNlcnZpY2UgKGlmIG5vbmUgaXMgc3BlY2lmaWVkKSB0aGF0IHdpbGwgaGFuZGxlCisgICAgICogaW52b2NhdGlvbnMuIFRoaXMgbWF5IGJlIHNldCB0byAwLCBpbiB3aGljaCBjYXNlIGludm9jYXRpb25zIHdpbGwgYmUKKyAgICAgKiBoYW5kbGVkIGRpcmVjdGx5IG9uIHRoZSBzZWxlY3RvciB0aHJlYWRzIChhcyBpcyBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgd29ya2VyVGhyZWFkcyA9IDU7CisgICAgLyoqIFRpbWUgdG8gd2FpdCBmb3Igc2VydmVyIHRvIHN0b3AgZ3JhY2VmdWxseSAqLworICAgIHByaXZhdGUgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7CisgICAgcHJpdmF0ZSBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIC8qKiBUaGUgRXhlY3V0b3JTZXJ2aWNlIGZvciBoYW5kbGluZyBkaXNwYXRjaGVkIHJlcXVlc3RzICovCisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgYmxvY2tpbmcgcXVldWUgcGVyIHNlbGVjdG9yIHRocmVhZCBmb3IgcGFzc2luZyBhY2NlcHRlZAorICAgICAqIGNvbm5lY3Rpb25zIHRvIHRoZSBzZWxlY3RvciB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQgPSA0OworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIG5ldyBhY2NlcHRlZCBjb25uZWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gQWNjZXB0UG9saWN5IHsKKyAgICAgIC8qKgorICAgICAgICogUmVxdWlyZSBhY2NlcHRlZCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBleGVjdXRvci4KKyAgICAgICAqIElmIHRoZSB3b3JrZXIgcG9vbCBpcyBzYXR1cmF0ZWQsIGZ1cnRoZXIgYWNjZXB0cyB3aWxsIGJlIGNsb3NlZAorICAgICAgICogaW1tZWRpYXRlbHkuIFNsaWdodGx5IGluY3JlYXNlcyBsYXRlbmN5IGR1ZSB0byBhbiBleHRyYSBzY2hlZHVsaW5nLgorICAgICAgICovCisgICAgICBGQUlSX0FDQ0VQVCwKKyAgICAgIC8qKgorICAgICAgICogSGFuZGxlIHRoZSBhY2NlcHRzIGFzIGZhc3QgYXMgcG9zc2libGUsIGRpc3JlZ2FyZGluZyB0aGUgc3RhdHVzIG9mIHRoZQorICAgICAgICogZXhlY3V0b3Igc2VydmljZS4KKyAgICAgICAqLworICAgICAgRkFTVF9BQ0NFUFQKKyAgICB9CisKKyAgICBwcml2YXRlIEFjY2VwdFBvbGljeSBhY2NlcHRQb2xpY3kgPSBBY2NlcHRQb2xpY3kuRkFTVF9BQ0NFUFQ7CisKKyAgICBwdWJsaWMgQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHNlbGVjdG9yVGhyZWFkcyhpbnQgaSkgeworICAgICAgc2VsZWN0b3JUaHJlYWRzID0gaTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0b3JUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIHNlbGVjdG9yVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBpKSB7CisgICAgICB3b3JrZXJUaHJlYWRzID0gaTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V29ya2VyVGhyZWFkcygpIHsKKyAgICAgIHJldHVybiB3b3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXRWYWwoKSB7CisgICAgICByZXR1cm4gc3RvcFRpbWVvdXRWYWw7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRWYWwoaW50IHN0b3BUaW1lb3V0VmFsKSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VmFsID0gc3RvcFRpbWVvdXRWYWw7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZVVuaXQgZ2V0U3RvcFRpbWVvdXRVbml0KCkgeworICAgICAgcmV0dXJuIHN0b3BUaW1lb3V0VW5pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0KSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VW5pdCA9IHN0b3BUaW1lb3V0VW5pdDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBleGVjdXRvclNlcnZpY2UoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCgpIHsKKyAgICAgIHJldHVybiBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQ7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkKGludCBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQpIHsKKyAgICAgIHRoaXMuYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkID0gYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFjY2VwdFBvbGljeSBnZXRBY2NlcHRQb2xpY3koKSB7CisgICAgICByZXR1cm4gYWNjZXB0UG9saWN5OworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGFjY2VwdFBvbGljeShBY2NlcHRQb2xpY3kgYWNjZXB0UG9saWN5KSB7CisgICAgICB0aGlzLmFjY2VwdFBvbGljeSA9IGFjY2VwdFBvbGljeTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgaWYgKHNlbGVjdG9yVGhyZWFkcyA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yVGhyZWFkcyBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgfQorICAgICAgaWYgKHdvcmtlclRocmVhZHMgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndvcmtlclRocmVhZHMgbXVzdCBiZSBub24tbmVnYXRpdmUuIik7CisgICAgICB9CisgICAgICBpZiAoYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkIDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGhlIHRocmVhZCBoYW5kbGluZyBhbGwgYWNjZXB0cworICBwcml2YXRlIEFjY2VwdFRocmVhZCBhY2NlcHRUaHJlYWQ7CisKKyAgLy8gVGhyZWFkcyBoYW5kbGluZyBldmVudHMgb24gY2xpZW50IHRyYW5zcG9ydHMKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8U2VsZWN0b3JUaHJlYWQ+IHNlbGVjdG9yVGhyZWFkcyA9IG5ldyBIYXNoU2V0PFNlbGVjdG9yVGhyZWFkPigpOworCisgIC8vIFRoaXMgd3JhcHMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHF1ZXVlaW5nIGFuZCB0aHJlYWQgcG9vbCBtYW5hZ2VtZW50CisgIC8vIGZvciB0aGUgcGFzc2luZyBvZiBJbnZvY2F0aW9ucyBmcm9tIHRoZSBzZWxlY3RvciB0aHJlYWQocykgdG8gdGhlIHdvcmtlcnMKKyAgLy8gKGlmIGFueSkuCisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisKKyAgcHJpdmF0ZSBmaW5hbCBBcmdzIGFyZ3M7CisKKyAgLyoqCisgICAqIENyZWF0ZSB0aGUgc2VydmVyIHdpdGggdGhlIHNwZWNpZmllZCBBcmdzIGNvbmZpZ3VyYXRpb24KKyAgICovCisgIHB1YmxpYyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcihBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBhcmdzLnZhbGlkYXRlKCk7CisgICAgaW52b2tlciA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlID09IG51bGwgPyBjcmVhdGVEZWZhdWx0RXhlY3V0b3IoYXJncykgOiBhcmdzLmV4ZWN1dG9yU2VydmljZTsKKyAgICB0aGlzLmFyZ3MgPSBhcmdzOworICB9CisKKyAgLyoqCisgICAqIFN0YXJ0IHRoZSBhY2NlcHQgYW5kIHNlbGVjdG9yIHRocmVhZHMgcnVubmluZyB0byBkZWFsIHdpdGggY2xpZW50cy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKKyAgICogICAgICAgICByZWFzb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRUaHJlYWRzKCkgeworICAgIHRyeSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2VsZWN0b3JUaHJlYWRzOyArK2kpIHsKKyAgICAgICAgc2VsZWN0b3JUaHJlYWRzLmFkZChuZXcgU2VsZWN0b3JUaHJlYWQoYXJncy5hY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQpKTsKKyAgICAgIH0KKyAgICAgIGFjY2VwdFRocmVhZCA9IG5ldyBBY2NlcHRUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCkgc2VydmVyVHJhbnNwb3J0XywKKyAgICAgICAgY3JlYXRlU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoc2VsZWN0b3JUaHJlYWRzKSk7CisgICAgICBmb3IgKFNlbGVjdG9yVGhyZWFkIHRocmVhZCA6IHNlbGVjdG9yVGhyZWFkcykgeworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgIH0KKyAgICAgIGFjY2VwdFRocmVhZC5zdGFydCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgdGhyZWFkcyEiLCBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSm9pbnMgdGhlIGFjY2VwdCBhbmQgc2VsZWN0b3IgdGhyZWFkcyBhbmQgc2h1dHMgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgICAgdHJ5IHsKKyAgICAgIGpvaW5UaHJlYWRzKCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gTm9uLWdyYWNlZnVsIHNodXRkb3duIG9jY3VycmVkCisgICAgICBMT0dHRVIuZXJyb3IoIkludGVycnVwdGVkIHdoaWxlIGpvaW5pbmcgdGhyZWFkcyEiLCBlKTsKKyAgICB9CisgICAgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGpvaW5UaHJlYWRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBpbyB0aHJlYWRzIGV4aXQKKyAgICBhY2NlcHRUaHJlYWQuam9pbigpOworICAgIGZvciAoU2VsZWN0b3JUaHJlYWQgdGhyZWFkIDogc2VsZWN0b3JUaHJlYWRzKSB7CisgICAgICB0aHJlYWQuam9pbigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTdG9wIHNlcnZpbmcgYW5kIHNodXQgZXZlcnl0aGluZyBkb3duLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgc3RvcHBlZF8gPSB0cnVlOworCisgICAgLy8gU3RvcCBxdWV1aW5nIGNvbm5lY3QgYXR0ZW1wdHMgYXNhcAorICAgIHN0b3BMaXN0ZW5pbmcoKTsKKworICAgIGlmIChhY2NlcHRUaHJlYWQgIT0gbnVsbCkgeworICAgICAgYWNjZXB0VGhyZWFkLndha2V1cFNlbGVjdG9yKCk7CisgICAgfQorICAgIGlmIChzZWxlY3RvclRocmVhZHMgIT0gbnVsbCkgeworICAgICAgZm9yIChTZWxlY3RvclRocmVhZCB0aHJlYWQgOiBzZWxlY3RvclRocmVhZHMpIHsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxsKQorICAgICAgICAgIHRocmVhZC53YWtldXBTZWxlY3RvcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgeworICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQorICAgIGludm9rZXIuc2h1dGRvd24oKTsKKworICAgIC8vIExvb3AgdW50aWwgYXdhaXRUZXJtaW5hdGlvbiBmaW5hbGx5IGRvZXMgcmV0dXJuIHdpdGhvdXQgYSBpbnRlcnJ1cHRlZAorICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKKyAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKKyAgICAvLyBhcHByb3ByaWF0ZWx5LgorICAgIGxvbmcgdGltZW91dE1TID0gYXJncy5zdG9wVGltZW91dFVuaXQudG9NaWxsaXMoYXJncy5zdG9wVGltZW91dFZhbCk7CisgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB3aGlsZSAodGltZW91dE1TID49IDApIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGludm9rZXIuYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0TVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaXgpIHsKKyAgICAgICAgbG9uZyBuZXdub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdGltZW91dE1TIC09IChuZXdub3cgLSBub3cpOworICAgICAgICBub3cgPSBuZXdub3c7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdlIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBpbnZva2UgbWV0aG9kIGhlcmUgdG8gcXVldWUgdGhlIGludm9jYXRpb24gZm9yCisgICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBJZiB0aGVyZSBpcyBubyB0aHJlYWQKKyAgICogcG9vbCwgaGFuZGxlIHRoZSBpbnZvY2F0aW9uIGlubGluZSBvbiB0aGlzIHRocmVhZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIHJlcXVlc3RJbnZva2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKKyAgICBSdW5uYWJsZSBpbnZvY2F0aW9uID0gZ2V0UnVubmFibGUoZnJhbWVCdWZmZXIpOworICAgIGlmIChpbnZva2VyICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGludm9rZXIuZXhlY3V0ZShpbnZvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiByeCkgeworICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHJlamVjdGVkIGV4ZWN1dGlvbiEiLCByeCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSW52b2tlIG9uIHRoZSBjYWxsZXIncyB0aHJlYWQKKyAgICAgIGludm9jYXRpb24ucnVuKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgUnVubmFibGUgZ2V0UnVubmFibGUoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKKyAgICByZXR1cm4gbmV3IEludm9jYXRpb24oZnJhbWVCdWZmZXIpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciB0byBjcmVhdGUgdGhlIGludm9rZXIgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZURlZmF1bHRFeGVjdXRvcihBcmdzIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gKG9wdGlvbnMud29ya2VyVGhyZWFkcyA+IDApID8gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChvcHRpb25zLndvcmtlclRocmVhZHMpIDogbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBjcmVhdGVEZWZhdWx0QWNjZXB0UXVldWUoaW50IHF1ZXVlU2l6ZSkgeworICAgIGlmIChxdWV1ZVNpemUgPT0gMCkgeworICAgICAgLy8gVW5ib3VuZGVkIHF1ZXVlCisgICAgICByZXR1cm4gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+KHF1ZXVlU2l6ZSk7CisgIH0KKworICAvKioKKyAgICogVGhlIHRocmVhZCB0aGF0IHNlbGVjdHMgb24gdGhlIHNlcnZlciB0cmFuc3BvcnQgKGxpc3RlbiBzb2NrZXQpIGFuZCBhY2NlcHRzCisgICAqIG5ldyBjb25uZWN0aW9ucyB0byBoYW5kIG9mZiB0byB0aGUgSU8gc2VsZWN0b3IgdGhyZWFkcworICAgKi8KKyAgcHJvdGVjdGVkIGNsYXNzIEFjY2VwdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAvLyBUaGUgbGlzdGVuIHNvY2tldCB0byBhY2NlcHQgb24KKyAgICBwcml2YXRlIGZpbmFsIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBhY2NlcHRTZWxlY3RvcjsKKworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgdGhyZWFkQ2hvb3NlcjsKKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgQWNjZXB0VGhlYWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXB0VGhyZWFkKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHRocmVhZENob29zZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgIHRoaXMudGhyZWFkQ2hvb3NlciA9IHRocmVhZENob29zZXI7CisgICAgICB0aGlzLmFjY2VwdFNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOworICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihhY2NlcHRTZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdvcmsgbG9vcC4gU2VsZWN0cyBvbiB0aGUgc2VydmVyIHRyYW5zcG9ydCBhbmQgYWNjZXB0cy4gSWYgdGhlcmUgd2FzCisgICAgICogYSBzZXJ2ZXIgdHJhbnNwb3J0IHRoYXQgaGFkIGJsb2NraW5nIGFjY2VwdHMsIGFuZCByZXR1cm5lZCBvbiBibG9ja2luZworICAgICAqIGNsaWVudCB0cmFuc3BvcnRzLCB0aGF0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICAgIHNlbGVjdCgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICBMT0dHRVIuZXJyb3IoInJ1bigpIG9uIEFjY2VwdFRocmVhZCBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBhY2NlcHRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgY2xvc2luZyBhY2NlcHQgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyB3aWxsIHdha2UgdXAgdGhlIHNlbGVjdG9yIHRocmVhZHMKKyAgICAgICAgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIudGhpcy5zdG9wKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7CisgICAgICBhY2NlcHRTZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW5kIHByb2Nlc3MgSU8gZXZlbnRzIGFwcHJvcHJpYXRlbHk6IElmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0bworICAgICAqIGJlIGFjY2VwdGVkLCBhY2NlcHQgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0KCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gd2FpdCBmb3IgY29ubmVjdCBldmVudHMuCisgICAgICAgIGFjY2VwdFNlbGVjdG9yLnNlbGVjdCgpOworCisgICAgICAgIC8vIHByb2Nlc3MgdGhlIGlvIGV2ZW50cyB3ZSByZWNlaXZlZAorICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cyA9IGFjY2VwdFNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICghc3RvcHBlZF8gJiYgc2VsZWN0ZWRLZXlzLmhhc05leHQoKSkgeworICAgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSBzZWxlY3RlZEtleXMubmV4dCgpOworICAgICAgICAgIHNlbGVjdGVkS2V5cy5yZW1vdmUoKTsKKworICAgICAgICAgIC8vIHNraXAgaWYgbm90IHZhbGlkCisgICAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoa2V5LmlzQWNjZXB0YWJsZSgpKSB7CisgICAgICAgICAgICBoYW5kbGVBY2NlcHQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLndhcm4oIlVuZXhwZWN0ZWQgc3RhdGUgaW4gc2VsZWN0ISAiICsga2V5LmludGVyZXN0T3BzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIHNlbGVjdGluZyEiLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWNjZXB0KCkgeworICAgICAgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGNsaWVudCA9IGRvQWNjZXB0KCk7CisgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgLy8gUGFzcyB0aGlzIGNvbm5lY3Rpb24gdG8gYSBzZWxlY3RvciB0aHJlYWQKKyAgICAgICAgZmluYWwgU2VsZWN0b3JUaHJlYWQgdGFyZ2V0VGhyZWFkID0gdGhyZWFkQ2hvb3Nlci5uZXh0VGhyZWFkKCk7CisKKyAgICAgICAgaWYgKGFyZ3MuYWNjZXB0UG9saWN5ID09IEFyZ3MuQWNjZXB0UG9saWN5LkZBU1RfQUNDRVBUIHx8IGludm9rZXIgPT0gbnVsbCkgeworICAgICAgICAgIGRvQWRkQWNjZXB0KHRhcmdldFRocmVhZCwgY2xpZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGQUlSX0FDQ0VQVAorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZva2VyLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBkb0FkZEFjY2VwdCh0YXJnZXRUaHJlYWQsIGNsaWVudCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHJ4KSB7CisgICAgICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHJlamVjdGVkIGFjY2VwdCByZWdpc3RyYXRpb24hIiwgcngpOworICAgICAgICAgICAgLy8gY2xvc2UgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGRvQWNjZXB0KCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIChUTm9uYmxvY2tpbmdUcmFuc3BvcnQpIHNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGFjY2VwdGluZy4KKyAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gYWNjZXB0ISIsIHR0ZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZEFjY2VwdChTZWxlY3RvclRocmVhZCB0aHJlYWQsIFROb25ibG9ja2luZ1RyYW5zcG9ydCBjbGllbnQpIHsKKyAgICAgIGlmICghdGhyZWFkLmFkZEFjY2VwdGVkQ29ubmVjdGlvbihjbGllbnQpKSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfSAvLyBBY2NlcHRUaHJlYWQKKworICAvKioKKyAgICogVGhlIFNlbGVjdG9yVGhyZWFkKHMpIHdpbGwgYmUgZG9pbmcgYWxsIHRoZSBzZWxlY3Rpbmcgb24gYWNjZXB0ZWQgYWN0aXZlCisgICAqIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdG9yVGhyZWFkIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RUaHJlYWQgeworCisgICAgLy8gQWNjZXB0ZWQgY29ubmVjdGlvbnMgYWRkZWQgYnkgdGhlIGFjY2VwdCB0aHJlYWQuCisgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4gYWNjZXB0ZWRRdWV1ZTsKKyAgICBwcml2YXRlIGludCBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEID0gNTEyOworICAgIHByaXZhdGUgbG9uZyBNT05JVE9SX1BFUklPRCA9IDEwMDBMOworICAgIHByaXZhdGUgaW50IGp2bUJ1ZyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gdW5ib3VuZGVkIHF1ZXVlIGZvciBpbmNvbWluZyBhY2NlcHRzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBpZiBhIHNlbGVjdG9yIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIFNlbGVjdG9yVGhyZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMobmV3IExpbmtlZEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZChpbnQgbWF4UGVuZGluZ0FjY2VwdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzKGNyZWF0ZURlZmF1bHRBY2NlcHRRdWV1ZShtYXhQZW5kaW5nQWNjZXB0cykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhIHNwZWNpZmllZCBxdWV1ZSBmb3IgY29ubmVjdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXB0ZWRRdWV1ZQorICAgICAqICAgICAgICAgIFRoZSBCbG9ja2luZ1F1ZXVlIGltcGxlbWVudGF0aW9uIGZvciBob2xkaW5nIGluY29taW5nIGFjY2VwdGVkCisgICAgICogICAgICAgICAgY29ubmVjdGlvbnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBpZiBhIHNlbGVjdG9yIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZChCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4gYWNjZXB0ZWRRdWV1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuYWNjZXB0ZWRRdWV1ZSA9IGFjY2VwdGVkUXVldWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZHMgb2ZmIGFuIGFjY2VwdGVkIGNvbm5lY3Rpb24gdG8gYmUgaGFuZGxlZCBieSB0aGlzIHRocmVhZC4gVGhpcworICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSBxdWV1ZSBmb3IgbmV3IGNvbm5lY3Rpb25zIGlzIGF0IGNhcGFjaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VwdGVkCisgICAgICogICAgICAgICAgVGhlIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBhY2NlcHRlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZEFjY2VwdGVkQ29ubmVjdGlvbihUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXB0ZWQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGFjY2VwdGVkUXVldWUucHV0KGFjY2VwdGVkKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkludGVycnVwdGVkIHdoaWxlIGFkZGluZyBhY2NlcHRlZCBjb25uZWN0aW9uISIsIGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JrIGxvb3AuIEhhbmRsZXMgc2VsZWN0aW5nIChyZWFkL3dyaXRlIElPKSwgZGlzcGF0Y2hpbmcsIGFuZAorICAgICAqIG1hbmFnaW5nIHRoZSBzZWxlY3Rpb24gcHJlZmVyZW5jZXMgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKKyAgICAgICAgICBzZWxlY3QoKTsKKyAgICAgICAgICBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpOworICAgICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgOiBzZWxlY3Rvci5rZXlzKCkpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KHNlbGVjdGlvbktleSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgb24gU2VsZWN0b3JUaHJlYWQgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3Npbmcgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyB3aWxsIHdha2UgdXAgdGhlIGFjY2VwdCB0aHJlYWQgYW5kIHRoZSBvdGhlciBzZWxlY3RvciB0aHJlYWRzCisgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLnRoaXMuc3RvcCgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhbmQgcHJvY2VzcyBJTyBldmVudHMgYXBwcm9wcmlhdGVseTogSWYgdGhlcmUgYXJlIGV4aXN0aW5nCisgICAgICogY29ubmVjdGlvbnMgd2l0aCBkYXRhIHdhaXRpbmcgdG8gYmUgcmVhZCwgcmVhZCBpdCwgYnVmZmVyaW5nIHVudGlsIGEKKyAgICAgKiB3aG9sZSBmcmFtZSBoYXMgYmVlbiByZWFkLiBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgcmVzcG9uc2VzLCBidWZmZXIKKyAgICAgKiB0aGVtIHVudGlsIHRoZWlyIHRhcmdldCBjbGllbnQgaXMgYXZhaWxhYmxlLCBhbmQgdGhlbiBzZW5kIHRoZSBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CisgICAgICB0cnkgeworCisgICAgICAgIGRvU2VsZWN0KCk7CisKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCisgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXyAmJiBzZWxlY3RlZEtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNlbGVjdGVkS2V5cy5uZXh0KCk7CisgICAgICAgICAgc2VsZWN0ZWRLZXlzLnJlbW92ZSgpOworCisgICAgICAgICAgLy8gc2tpcCBpZiBub3QgdmFsaWQKKyAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChrZXkuaXNSZWFkYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBkZWFsIHdpdGggcmVhZHMKKyAgICAgICAgICAgIGhhbmRsZVJlYWQoa2V5KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGtleS5pc1dyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB3cml0ZXMKKyAgICAgICAgICAgIGhhbmRsZVdyaXRlKGtleSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuKCJVbmV4cGVjdGVkIHN0YXRlIGluIHNlbGVjdCEgIiArIGtleS5pbnRlcmVzdE9wcygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBzZWxlY3RpbmchIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gc2VsZWN0IGFuZCBqdWRnZSBlcG9sbCBidWcgaGFwcGVuLgorICAgICAqIFNlZSA6IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNTEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgbG9uZyBiZWZvcmVTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgIGludCBzZWxlY3RlZE51bXMgPSBzZWxlY3Rvci5zZWxlY3QoKTsKKyAgICAgIGxvbmcgYWZ0ZXJTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgaWYgKHNlbGVjdGVkTnVtcyA9PSAwKSB7CisgICAgICAgIGp2bUJ1ZysrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgICAgbG9uZyBzZWxlY3RlZFRpbWUgPSBhZnRlclNlbGVjdCAtIGJlZm9yZVNlbGVjdDsKKyAgICAgIGlmIChzZWxlY3RlZFRpbWUgPj0gTU9OSVRPUl9QRVJJT0QpIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoanZtQnVnID4gU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCkgeworICAgICAgICBMT0dHRVIud2FybigiSW4ge30gbXMgaGFwcGVuIHt9IHRpbWVzIGp2bSBidWc7IHJlYnVpbGRpbmcgc2VsZWN0b3IuIiwgTU9OSVRPUl9QRVJJT0QsIGp2bUJ1Zyk7CisgICAgICAgIHJlYnVpbGRTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZWxlY3ROb3coKTsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IFNlbGVjdG9yIG9mIHRoaXMgU2VsZWN0b3JUaHJlYWQgd2l0aCBuZXdseSBjcmVhdGVkIFNlbGVjdG9yIHRvIHdvcmsKKyAgICAgKiBhcm91bmQgdGhlIGluZmFtb3VzIGVwb2xsIDEwMCUgQ1BVIGJ1Zy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRTZWxlY3RvcigpIHsKKyAgICAgIGZpbmFsIFNlbGVjdG9yIG9sZFNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICBpZiAob2xkU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBTZWxlY3RvciBuZXdTZWxlY3RvciA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBuZXdTZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgTE9HR0VSLndhcm4oIkNyZWF0ZWQgbmV3IFNlbGVjdG9yLiIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNyZWF0ZSBuZXcgU2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IG9sZFNlbGVjdG9yLnNlbGVjdGVkS2V5cygpKSB7CisgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSAmJiBrZXkucmVhZHlPcHMoKSA9PSAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihuZXdTZWxlY3Rvciwga2V5LnJlYWR5T3BzKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSwgYXR0YWNobWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlZ2lzdGVyIG5ldyBzZWxlY3RvciBrZXkgZXJyb3IuIiwgZSk7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBzZWxlY3RvciA9IG5ld1NlbGVjdG9yOworICAgICAgdHJ5IHsKKyAgICAgICAgb2xkU2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJDbG9zZSBvbGQgc2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisgICAgICBMT0dHRVIud2FybigiUmVwbGFjZSBuZXcgc2VsZWN0b3Igc3VjY2Vzcy4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FjY2VwdGVkQ29ubmVjdGlvbnMoKSB7CisgICAgICAvLyBSZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9ucworICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXB0ZWQgPSBhY2NlcHRlZFF1ZXVlLnBvbGwoKTsKKyAgICAgICAgaWYgKGFjY2VwdGVkID09IG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZWdpc3RlckFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRnJhbWVCdWZmZXIgY3JlYXRlRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLmlzQXN5bmNQcm9jZXNzb3IoKSA/CisgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgIG5ldyBGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckFjY2VwdGVkKFROb25ibG9ja2luZ1RyYW5zcG9ydCBhY2NlcHRlZCkgeworICAgICAgU2VsZWN0aW9uS2V5IGNsaWVudEtleSA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnRLZXkgPSBhY2NlcHRlZC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisKKyAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBjcmVhdGVGcmFtZUJ1ZmZlcihhY2NlcHRlZCwgY2xpZW50S2V5LCBTZWxlY3RvclRocmVhZC50aGlzKTsKKworICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkZhaWxlZCB0byByZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIHNlbGVjdG9yISIsIGUpOworICAgICAgICBpZiAoY2xpZW50S2V5ICE9IG51bGwpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGNsaWVudEtleSk7CisgICAgICAgIH0KKyAgICAgICAgYWNjZXB0ZWQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLy8gU2VsZWN0b3JUaHJlYWQKKworICAvKioKKyAgICogQ3JlYXRlcyBhIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHRvIGJlIHVzZWQgYnkgdGhlIGFjY2VwdCB0aHJlYWQgZm9yCisgICAqIGFzc2lnbmluZyBuZXdseSBhY2NlcHRlZCBjb25uZWN0aW9ucyBhY3Jvc3MgdGhlIHRocmVhZHMuCisgICAqLworICBwcm90ZWN0ZWQgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgY3JlYXRlU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IHRocmVhZHMpIHsKKyAgICByZXR1cm4gbmV3IFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKHRocmVhZHMpOworICB9CisKKyAgLyoqCisgICAqIEEgcm91bmQgcm9iaW4gbG9hZCBiYWxhbmNlciBmb3IgY2hvb3Npbmcgc2VsZWN0b3IgdGhyZWFkcyBmb3IgbmV3CisgICAqIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gdGhyZWFkczsKKyAgICBwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gbmV4dFRocmVhZEl0ZXJhdG9yOworCisgICAgcHVibGljIDxUIGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKENvbGxlY3Rpb248VD4gdGhyZWFkcykgeworICAgICAgaWYgKHRocmVhZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBzZWxlY3RvciB0aHJlYWQgaXMgcmVxdWlyZWQiKTsKKyAgICAgIH0KKyAgICAgIHRoaXMudGhyZWFkcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDxUPih0aHJlYWRzKSk7CisgICAgICBuZXh0VGhyZWFkSXRlcmF0b3IgPSB0aGlzLnRocmVhZHMuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VsZWN0b3JUaHJlYWQgbmV4dFRocmVhZCgpIHsKKyAgICAgIC8vIENob29zZSBhIHNlbGVjdG9yIHRocmVhZCAocm91bmQgcm9iaW4pCisgICAgICBpZiAoIW5leHRUaHJlYWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgbmV4dFRocmVhZEl0ZXJhdG9yID0gdGhyZWFkcy5pdGVyYXRvcigpOworICAgICAgfQorICAgICAgcmV0dXJuIG5leHRUaHJlYWRJdGVyYXRvci5uZXh0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IGIwMjkwNWYuLmZjM2FhOTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKICAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKQEAgLTI1LDI4ICsyNywyNCBAQAogICogcmF0ZSBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5IHdpdGggdGhlICh1bnRlc3RlZCkKICAqIG9iamVjdGl2ZSBvZiBhdm9pZGluZyBleHBlbnNpdmUgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBjb3BpZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKK2NsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgewogICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKIAotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBncm93dGhDb2VmZmljaWVudDsKLQotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICBpZiAoZ3Jvd3RoQ29lZmZpY2llbnQgPCAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdyb3d0aCBjb2VmZmljaWVudCBtdXN0IGJlID49IDEuMCIpOwotICAgIH0KLSAgICBhcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgdGhpcy5ncm93dGhDb2VmZmljaWVudCA9IGdyb3d0aENvZWZmaWNpZW50OworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5hcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNpemVJZk5lY2Vzc2FyeShpbnQgc2l6ZSkgewotICAgIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbKGludCkoc2l6ZSAqIGdyb3d0aENvZWZmaWNpZW50KV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdCdWYsIDAsIGFycmF5Lmxlbmd0aCk7Ci0gICAgICBhcnJheSA9IG5ld0J1ZjsKKyAgICBmaW5hbCBpbnQgY3VycmVudENhcGFjaXR5ID0gdGhpcy5hcnJheS5sZW5ndGg7CisgICAgaWYgKGN1cnJlbnRDYXBhY2l0eSA8IHNpemUpIHsKKyAgICAgIC8vIEluY3JlYXNlIGJ5IGEgZmFjdG9yIG9mIDEuNXgKKyAgICAgIGludCBncm93Q2FwYWNpdHkgPSBjdXJyZW50Q2FwYWNpdHkgKyAoY3VycmVudENhcGFjaXR5ID4+IDEpOworICAgICAgaW50IG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgoZ3Jvd0NhcGFjaXR5LCBzaXplKTsKKyAgICAgIHRoaXMuYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdDYXBhY2l0eSk7CiAgICAgfQogICB9CiAKICAgcHVibGljIGJ5dGVbXSBhcnJheSgpIHsKLSAgICByZXR1cm4gYXJyYXk7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCBkMjlkNjBiLi5hMjhkMjU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KIC8qKgogICogVFRyYW5zcG9ydCBmb3IgcmVhZGluZyBmcm9tIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTMwLDggKzI4LDggQEAKICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgb3Zlcmdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIG92ZXJncm93dGhDb2VmZmljaWVudCk7CisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOwogICB9CiAKICAgcHVibGljIHZvaWQgZmlsbChUVHJhbnNwb3J0IGluVHJhbnMsIGludCBsZW5ndGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTYwLDcgKzU4LDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCAyMzc2Y2YzLi5lYzdlN2Q0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTE4LDggKzE4LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBUVHJhbnNwb3J0IGZvciB3cml0aW5nIHRvIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTI3LDEwICsyNSwyOSBAQAogCiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlciBidWY7CiAgIHByaXZhdGUgaW50IHBvczsKKyAgcHJpdmF0ZSBpbnQgcmVzOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIGdyb3d0aENvZWZmaWNpZW50KTsKLSAgICB0aGlzLnBvcyA9IDA7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAqIEBwYXJhbSBmcm9udFJlc2VydmUgc3BhY2UsIGlmIGFueSwgdG8gcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIHN1Y2gKKyAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBmaXJzdCB3cml0ZSBpcyBhZnRlciB0aGlzIHJlc2VydmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZnJhbWVkIHRyYW5zcG9ydCB0byByZXNlcnZlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmcmFtZSBidWZmZXIgbGVuZ3RoLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgbGVzcyB0aGFuIHplcm8KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGdyZWF0ZXIgdGhhbiBpbml0aWFsQ2FwYWNpdHkKKyAgICovCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGZyb250UmVzZXJ2ZSkgeworICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsQ2FwYWNpdHkiKTsKKyAgICB9CisgICAgaWYgKGZyb250UmVzZXJ2ZSA8IDAgfHwgaW5pdGlhbENhcGFjaXR5IDwgZnJvbnRSZXNlcnZlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9udFJlc2VydmUiKTsKKyAgICB9CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIHRoaXMucG9zID0gZnJvbnRSZXNlcnZlOworICAgIHRoaXMucmVzID0gZnJvbnRSZXNlcnZlOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC00NCw3ICs2MSw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTU4LDExICs3NSwxNCBAQAogICAgIHJldHVybiBidWY7CiAgIH0KIAotICBwdWJsaWMgaW50IGdldFBvcygpIHsKKyAgLyoqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyBhbnkgZnJvbnQgcmVzZXJ2ZQorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CiAgICAgcmV0dXJuIHBvczsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIHBvcyA9IDA7CisgICAgcG9zID0gcmVzOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMDY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEJ5dGVCdWZmZXItYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUQnl0ZUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUQnl0ZUJ1ZmZlciB3cmFwcGluZyBhIGdpdmVuIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgeworICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbiA9IE1hdGgubWluKGJ5dGVCdWZmZXIucmVtYWluaW5nKCksIGxlbik7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICB0cnkgeworICAgICAgICBieXRlQnVmZmVyLmdldChidWYsIG9mZiwgbik7CisgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZUJ1ZmZlci5wdXQoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgY2xlYXIoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBjbGVhcigpIHsKKyAgICBieXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgZmxpcCgpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgZmxpcCgpIHsKKyAgICBieXRlQnVmZmVyLmZsaXAoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlciB0byBhCisgICAqIHBsYWluIG9sZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOworICAgIGJ5dGVCdWZmZXIuc2xpY2UoKS5nZXQoZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCAyYTFmMWRhLi5hMWZkMjQ5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiAvKioKLSAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzIAorICogVGhpcyB0cmFuc3BvcnQgaXMgd2lyZSBjb21wYXRpYmxlIHdpdGgge0BsaW5rIFRGcmFtZWRUcmFuc3BvcnR9LCBidXQgbWFrZXMKICAqIHVzZSBvZiByZXVzYWJsZSwgZXhwYW5kaW5nIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYXZvaWQKICAqIGFsbG9jYXRpbmcgbmV3IGJ5dGVbXXMgYWxsIHRoZSB0aW1lLiBTaW5jZSB0aGUgYnVmZmVycyBvbmx5IGV4cGFuZCwgeW91CiAgKiBzaG91bGQgcHJvYmFibHkgb25seSB1c2UgdGhpcyB0cmFuc3BvcnQgaWYgeW91ciBtZXNzYWdlcyBhcmUgbm90IHRvbyB2YXJpYWJseQogICogbGFyZ2UsIHVubGVzcyB0aGUgcGVyc2lzdGVudCBtZW1vcnkgY29zdCBpcyBub3QgYW4gaXNzdWUuCi0gKiAKKyAqCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIE5PVCB0aHJlYWRzYWZlLgogICovCiBwdWJsaWMgY2xhc3MgVEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKQEAgLTU5LDEzICs1OSwxNCBAQAogICAgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZfQ0FQQUNJVFkgPSAxMDI0OwogICAvKioKLSAgICogSG93IGJpZyBpcyB0aGUgbGFyZ2VzdCBhbGxvd2FibGUgZnJhbWU/IERlZmF1bHRzIHRvIEludGVnZXIuTUFYX1ZBTFVFLgorICAgKiBIb3cgYmlnIGlzIHRoZSBsYXJnZXN0IGFsbG93YWJsZSBmcmFtZT8gRGVmYXVsdHMgdG8gMTZNQi4KICAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IEludGVnZXIuTUFYX1ZBTFVFOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKIAogICBwcml2YXRlIGZpbmFsIFRUcmFuc3BvcnQgdW5kZXJseWluZzsKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgd3JpdGVCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CiAKQEAgLTkxLDcgKzkyLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHVuZGVybHlpbmcgVHJhbnNwb3J0IHRoYXQgcmVhbCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZ28gdGhyb3VnaCB0by4KICAgICogQHBhcmFtIGluaXRpYWxCdWZmZXJDYXBhY2l0eSBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgogICAgKiBJbiBwcmFjdGljZSwgaXQncyBub3QgY3JpdGljYWwgdG8gc2V0IHRoaXMgdW5sZXNzIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdApAQCAtMTA0LDggKzEwNSw5IEBACiAgIHB1YmxpYyBURmFzdEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHksIGludCBtYXhMZW5ndGgpIHsKICAgICB0aGlzLnVuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwogICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7Ci0gICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7CisgICAgdGhpcy5pbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDQpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xNDEsMTEgKzE0MywxNCBAQAogICAgIGludCBzaXplID0gVEZyYW1lZFRyYW5zcG9ydC5kZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOwogICAgIH0KIAogICAgIHJlYWRCdWZmZXIuZmlsbCh1bmRlcmx5aW5nLCBzaXplKTsKQEAgLTE2MSwxMiArMTY2LDE5IEBACiAgICAgcmVhZEJ1ZmZlci5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICAvKioKKyAgICogT25seSBjbGVhcnMgdGhlIHJlYWQgYnVmZmVyIQorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGludCBsZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRQb3MoKTsKLSAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGkzMmJ1Zik7Ci0gICAgdW5kZXJseWluZy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHVuZGVybHlpbmcud3JpdGUod3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgbGVuZ3RoKTsKKyAgICBpbnQgcGF5bG9hZExlbmd0aCA9IHdyaXRlQnVmZmVyLmdldExlbmd0aCgpIC0gNDsgICAgICAgIAorICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShwYXlsb2FkTGVuZ3RoLCBkYXRhKTsKKyAgICB1bmRlcmx5aW5nLndyaXRlKGRhdGEsIDAsIHBheWxvYWRMZW5ndGggKyA0KTsKICAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOwogICAgIHVuZGVybHlpbmcuZmx1c2goKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDg3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogRmlsZVByb2Nlc3NvcjogaGVscHMgaW4gcHJvY2Vzc2luZyBmaWxlcyBnZW5lcmF0ZWQgYnkgVEZpbGVUcmFuc3BvcnQuCisgKiBQb3J0IG9mIG9yaWdpbmFsIGNwcCBpbXBsZW1lbnRhdGlvbgorICovCitwdWJsaWMgY2xhc3MgVEZpbGVQcm9jZXNzb3IgeworCisgIHByaXZhdGUgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworICBwcml2YXRlIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBwcml2YXRlIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgcHJpdmF0ZSBURmlsZVRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydF87CisgIHByaXZhdGUgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnRfOworCisgIHB1YmxpYyBURmlsZVByb2Nlc3NvcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBURmlsZVRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KSB7CisgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gcHJvdG9jb2xGYWN0b3J5OworICAgIGlucHV0VHJhbnNwb3J0XyA9IGlucHV0VHJhbnNwb3J0OworICAgIG91dHB1dFRyYW5zcG9ydF8gPSBvdXRwdXRUcmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgVEZpbGVQcm9jZXNzb3IoVFByb2Nlc3NvciBwcm9jZXNzb3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZpbGVUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCkgeworICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICBpbnB1dFRyYW5zcG9ydF8gPSBpbnB1dFRyYW5zcG9ydDsKKyAgICBvdXRwdXRUcmFuc3BvcnRfID0gb3V0cHV0VHJhbnNwb3J0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NVbnRpbChpbnQgbGFzdENodW5rKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVFByb3RvY29sIGlwID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CisgICAgVFByb3RvY29sIG9wID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKKyAgICBpbnQgY3VyQ2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKTsKKworICAgIHRyeSB7CisgICAgICB3aGlsZSAobGFzdENodW5rID49IGN1ckNodW5rKSB7CisgICAgICAgIHByb2Nlc3Nvcl8ucHJvY2VzcyhpcCwgb3ApOworICAgICAgICBpbnQgbmV3Q2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKTsKKyAgICAgICAgY3VyQ2h1bmsgPSBuZXdDaHVuazsKKyAgICAgIH0gCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBpZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgbGFzdCBjaHVuayAtIHdlIGNvdWxkIGhhdmUganVzdCBoaXQgRU9GCisgICAgICAvLyBvbiBFT0YgLSB0cmFwIHRoZSBlcnJvciBhbmQgc3RvcCBwcm9jZXNzaW5nLgorICAgICAgaWYoZS5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByb2Nlc3MgZnJvbSBzdGFydCB0byBsYXN0IGNodW5rIGJvdGggaW5jbHVzaXZlIHdoZXJlIGNodW5rcyBiZWdpbiBmcm9tIDAKKworICAgKiBAcGFyYW0gc3RhcnRDaHVua051bSBmaXJzdCBjaHVuayB0byBiZSBwcm9jZXNzZWQKKyAgICogQHBhcmFtIGVuZENodW5rTnVtIGxhc3QgY2h1bmsgdG8gYmUgcHJvY2Vzc2VkCisgICAqLworICBwdWJsaWMgdm9pZCBwcm9jZXNzQ2h1bmsoaW50IHN0YXJ0Q2h1bmtOdW0sIGludCBlbmRDaHVua051bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBudW1DaHVua3MgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0TnVtQ2h1bmtzKCk7CisgICAgaWYoZW5kQ2h1bmtOdW0gPCAwKQorICAgICAgZW5kQ2h1bmtOdW0gKz0gbnVtQ2h1bmtzOworCisgICAgaWYoc3RhcnRDaHVua051bSA8IDApCisgICAgICBzdGFydENodW5rTnVtICs9IG51bUNodW5rczsKKworICAgIGlmKGVuZENodW5rTnVtIDwgc3RhcnRDaHVua051bSkKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJlbmRDaHVua051bSAiICsgZW5kQ2h1bmtOdW0gKyAiIGlzIGxlc3MgdGhhbiAiICsgc3RhcnRDaHVua051bSk7CisKKyAgICBpbnB1dFRyYW5zcG9ydF8uc2Vla1RvQ2h1bmsoc3RhcnRDaHVua051bSk7CisgICAgcHJvY2Vzc1VudGlsKGVuZENodW5rTnVtKTsKKyAgfQorCisgIC8qKgorICAgKiBQcm9jZXNzIGEgc2luZ2xlIGNodW5rCisgICAqCisgICAqIEBwYXJhbSBjaHVua051bSBjaHVuayB0byBiZSBwcm9jZXNzZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NDaHVuayhpbnQgY2h1bmtOdW0pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwcm9jZXNzQ2h1bmsoY2h1bmtOdW0sIGNodW5rTnVtKTsKKyAgfQorCisgIC8qKgorICAgKiBQcm9jZXNzIGEgY3VycmVudCBjaHVuaworICAgKi8KKyAgcHVibGljIHZvaWQgcHJvY2Vzc0NodW5rKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHByb2Nlc3NDaHVuayhpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDExYzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogRmlsZVRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKiBDdXJyZW50bHkgdGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBwb3J0IG9mIHRoZSBjcHAgaW1wbGVtZW50YXRpb24KKyAqIAorICogSXQgbWF5IG1ha2UgYmV0dGVyIHNlbnNlIHRvIHByb3ZpZGUgYSBiYXNpYyBzdHJlYW0gYWNjZXNzIG9uIHRvcCBvZiB0aGUgZnJhbWVkIGZpbGUgZm9ybWF0CisgKiBUaGUgRmlsZVRyYW5zcG9ydCBjYW4gdGhlbiBiZSBhIHVzZXIgb2YgdGhpcyBmcmFtZWQgZmlsZSBmb3JtYXQgd2l0aCBzb21lIGFkZGl0aW9uYWwgbG9naWMKKyAqIGZvciBjaHVua2luZy4KKyAqLworcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CisgICAgcHVibGljIHZvaWQgdHJ1bmMoKSB7CisgICAgICBwb3MgPSBjb3VudCA9IDA7CisgICAgfSAgICAgICAgCisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgIHN1cGVyKGluKTsKKyAgICB9CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CisgICAgICBzdXBlcihpbiwgc2l6ZSk7CisgICAgfQorICB9CisKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEV2ZW50IHsKKyAgICBwcml2YXRlIGJ5dGVbXSBidWZfOworICAgIHByaXZhdGUgaW50IG5yZWFkXzsKKyAgICBwcml2YXRlIGludCBuYXZhaWxhYmxlXzsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYW4gZXZlbnQuIEluaXRpYWxseSwgaXQgaGFzIG5vIHZhbGlkIGNvbnRlbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIGJ5dGUgYXJyYXkgYnVmZmVyIHRvIHN0b3JlIGV2ZW50IAorICAgICAqLworICAgIHB1YmxpYyBFdmVudChieXRlW10gYnVmKSB7CisgICAgICBidWZfID0gYnVmOworICAgICAgbnJlYWRfID0gbmF2YWlsYWJsZV8gPSAwOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0QnVmKCkgeyByZXR1cm4gYnVmXzt9CisgICAgcHVibGljIGludCBnZXRTaXplKCkgeyByZXR1cm4gYnVmXy5sZW5ndGg7IH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGludCBzeikgeyBucmVhZF8gPSAwOyBuYXZhaWxhYmxlXz1zejt9CisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7IHJldHVybiAobmF2YWlsYWJsZV8gLSBucmVhZF8pOyB9CisKKyAgICBwdWJsaWMgaW50IGVtaXQoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IG5kZXNpcmVkKSB7CisgICAgICBpZigobmRlc2lyZWQgPT0gMCkgfHwgKG5kZXNpcmVkID4gZ2V0UmVtYWluaW5nKCkpKQorICAgICAgICBuZGVzaXJlZCA9IGdldFJlbWFpbmluZygpOworCisgICAgICBpZihuZGVzaXJlZCA8PSAwKQorICAgICAgICByZXR1cm4gKG5kZXNpcmVkKTsKKworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZfLCBucmVhZF8sIGJ1Ziwgb2Zmc2V0LCBuZGVzaXJlZCk7CisgICAgICBucmVhZF8gKz0gbmRlc2lyZWQ7CisKKyAgICAgIHJldHVybihuZGVzaXJlZCk7CisgICAgfQorICB9OworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2h1bmtTdGF0ZSB7CisgICAgLyoqCisgICAgICogQ2h1bmsgU2l6ZS4gTXVzdCBiZSBzYW1lIGFjcm9zcyBhbGwgaW1wbGVtZW50YXRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSFVOS19TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsKKworICAgIHByaXZhdGUgaW50IGNodW5rX3NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIHByaXZhdGUgbG9uZyBvZmZzZXRfID0gMDsKKworICAgIHB1YmxpYyBDaHVua1N0YXRlKCkge30KKyAgICBwdWJsaWMgQ2h1bmtTdGF0ZShpbnQgY2h1bmtfc2l6ZSkgeyBjaHVua19zaXplXyA9IGNodW5rX3NpemU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IHNpemUpIHtvZmZzZXRfICs9IHNpemU7IH0KKyAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB7b2Zmc2V0XyA9IG9mZnNldDt9CisKKyAgICBwdWJsaWMgaW50IGdldENodW5rU2l6ZSgpIHsgcmV0dXJuIGNodW5rX3NpemVfO30KKyAgICBwdWJsaWMgaW50IGdldENodW5rTnVtKCkgeyByZXR1cm4gKChpbnQpKG9mZnNldF8vY2h1bmtfc2l6ZV8pKTt9CisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7IHJldHVybiAoY2h1bmtfc2l6ZV8gLSAoKGludCkob2Zmc2V0XyAlIGNodW5rX3NpemVfKSkpO30KKyAgICBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoKSB7IHJldHVybiAob2Zmc2V0Xyk7fQorICB9CisKKyAgcHVibGljIHN0YXRpYyBlbnVtIFRhaWxQb2xpY3kgeworCisgICAgTk9XQUlUKDAsIDApLAorICAgICAgV0FJVF9GT1JFVkVSKDUwMCwgLTEpOworCisgICAgLyoqCisgICAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIG5leHQgcmVhZAorICAgICAqIElmIDAsIG5vIHNsZWVwCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCB0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBnaXZpbmcgdXAKKyAgICAgKiBpZiAwLCBubyByZXRyaWVzCisgICAgICogaWYgLTEsIHJldHJ5IGZvcmV2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IHJldHJpZXNfOworCisgICAgLyoqCisgICAgICogY3RvciBmb3IgcG9saWN5CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBzbGVlcCB0aW1lIGZvciB0aGlzIHBhcnRpY3VsYXIgcG9saWN5CisgICAgICogQHBhcmFtIHJldHJpZXMgbnVtYmVyIG9mIHJldHJpZXMKKyAgICAgKi8KKworICAgIFRhaWxQb2xpY3koaW50IHRpbWVvdXQsIGludCByZXRyaWVzKSB7CisgICAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgICAgICByZXRyaWVzXyA9IHJldHJpZXM7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEN1cnJlbnQgdGFpbGluZyBwb2xpY3kKKyAgICovCisgIFRhaWxQb2xpY3kgY3VycmVudFBvbGljeV8gPSBUYWlsUG9saWN5Lk5PV0FJVDsKKworCisgIC8qKiAKKyAgICogVW5kZXJseWluZyBmaWxlIGJlaW5nIHJlYWQKKyAgICovCisgIHByb3RlY3RlZCBUU2Vla2FibGVGaWxlIGlucHV0RmlsZV8gPSBudWxsOworCisgIC8qKiAKKyAgICogVW5kZXJseWluZyBvdXRwdXRTdHJlYW0gCisgICAqLworICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbV8gPSBudWxsOworCisKKyAgLyoqCisgICAqIEV2ZW50IGN1cnJlbnRseSByZWFkIGluCisgICAqLworICBFdmVudCBjdXJyZW50RXZlbnRfID0gbnVsbDsKKworICAvKioKKyAgICogSW5wdXRTdHJlYW0gY3VycmVudGx5IGJlaW5nIHVzZWQgZm9yIHJlYWRpbmcKKyAgICovCisgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtXyA9IG51bGw7CisKKyAgLyoqCisgICAqIGN1cnJlbnQgQ2h1bmsgc3RhdGUKKyAgICovCisgIENodW5rU3RhdGUgY3MgPSBudWxsOworCisgIC8qKgorICAgKiBpcyByZWFkIG9ubHk/CisgICAqLworICBwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHlfID0gZmFsc2U7CisKKyAgLyoqCisgICAqIEdldCBGaWxlIFRhaWxpbmcgUG9saWN5CisgICAqIAorICAgKiBAcmV0dXJuIGN1cnJlbnQgcmVhZCBwb2xpY3kKKyAgICovCisgIHB1YmxpYyBUYWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CisgICAgcmV0dXJuIChjdXJyZW50UG9saWN5Xyk7CisgIH0KKworICAvKioKKyAgICogU2V0IGZpbGUgVGFpbGluZyBQb2xpY3kKKyAgICogCisgICAqIEBwYXJhbSBwb2xpY3kgTmV3IHBvbGljeSB0byBzZXQKKyAgICogQHJldHVybiBPbGQgcG9saWN5CisgICAqLworICBwdWJsaWMgVGFpbFBvbGljeSBzZXRUYWlsUG9saWN5KFRhaWxQb2xpY3kgcG9saWN5KSB7CisgICAgVGFpbFBvbGljeSBvbGQgPSBjdXJyZW50UG9saWN5XzsKKyAgICBjdXJyZW50UG9saWN5XyA9IHBvbGljeTsKKyAgICByZXR1cm4gKG9sZCk7CisgIH0KKworCisgIC8qKgorICAgKiBJbml0aWFsaXplIHJlYWQgaW5wdXQgc3RyZWFtCisgICAqIAorICAgKiBAcmV0dXJuIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20gZmlsZQorICAgKi8KKyAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBJbnB1dFN0cmVhbSBpczsKKyAgICB0cnkgeworICAgICAgaWYoaW5wdXRTdHJlYW1fICE9IG51bGwpIHsKKyAgICAgICAgKChUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKWlucHV0U3RyZWFtXykudHJ1bmMoKTsKKyAgICAgICAgaXMgPSBpbnB1dFN0cmVhbV87CisgICAgICB9IGVsc2UgeworICAgICAgICBpcyA9IG5ldyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZUlucHV0U3RyZWFtOiAiK2lveC5nZXRNZXNzYWdlKCkpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LmdldE1lc3NhZ2UoKSwgaW94KTsKKyAgICB9CisgICAgcmV0dXJuKGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIChwb3RlbnRpYWxseSB0YWlsaW5nKSBhbiBpbnB1dCBzdHJlYW0KKyAgICogCisgICAqIEBwYXJhbSBpcyBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgT2Zmc2V0IGluIGJ1ZmZlciB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGxlbiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgKiBAcGFyYW0gdHAgIHBvbGljeSB0byB1c2UgaWYgd2UgaGl0IEVPRgorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkCisgICAqLworICBwcml2YXRlIGludCB0YWlsUmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmYsIGludCBsZW4sIFRhaWxQb2xpY3kgdHApIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpbnQgb3JpZ19sZW4gPSBsZW47CisgICAgdHJ5IHsKKyAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgIHdoaWxlKGxlbiA+IDApIHsKKyAgICAgICAgaW50IGNudCA9IGlzLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIGlmKGNudCA+IDApIHsKKyAgICAgICAgICBvZmYgKz0gY250OworICAgICAgICAgIGxlbiAtPSBjbnQ7CisgICAgICAgICAgcmV0cmllcyA9IDA7CisgICAgICAgICAgY3Muc2tpcChjbnQpOyAvLyByZW1lbWJlciB0aGF0IHdlIHJlYWQgc28gbWFueSBieXRlcworICAgICAgICB9IGVsc2UgaWYgKGNudCA9PSAtMSkgeworICAgICAgICAgIC8vIEVPRgorICAgICAgICAgIHJldHJpZXMrKzsKKworICAgICAgICAgIGlmKCh0cC5yZXRyaWVzXyAhPSAtMSkgJiYgdHAucmV0cmllc18gPCByZXRyaWVzKQorICAgICAgICAgICAgcmV0dXJuIChvcmlnX2xlbiAtIGxlbik7CisKKyAgICAgICAgICBpZih0cC50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgIHRyeSB7VGhyZWFkLnNsZWVwKHRwLnRpbWVvdXRfKTt9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGVpdGhlciBub24temVybyBvciAtMSBpcyB3aGF0IHRoZSBjb250cmFjdCBzYXlzIQorICAgICAgICAgIHRocm93IG5ldworICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCByZXR1cm4gZnJvbSBJbnB1dFN0cmVhbS5yZWFkID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5nZXRNZXNzYWdlKCksIGlveCk7CisgICAgfQorCisgICAgcmV0dXJuKG9yaWdfbGVuIC0gbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBFdmVudCBpcyBjb3JydXB0ZWQuIERvIHJlY292ZXJ5CisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiByZWNvdmVyeSBjb3VsZCBiZSBwZXJmb3JtZWQgYW5kIHdlIGNhbiByZWFkIG1vcmUgZGF0YQorICAgKiAgICAgICAgIGZhbHNlIGlzIHJldHVybmVkIG9ubHkgd2hlbiBub3RoaW5nIG1vcmUgY2FuIGJlIHJlYWQKKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtUmVjb3ZlcnkoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworICAgIGludCBjdXJDaHVuayA9IGNzLmdldENodW5rTnVtKCk7CisKKyAgICBpZihjdXJDaHVuayA+PSAobnVtQ2h1bmtzLTEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKzEpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgZXZlbnQgZnJvbSB1bmRlcmx5aW5nIGZpbGUKKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGV2ZW50IGNvdWxkIGJlIHJlYWQsIGZhbHNlIG90aGVyd2lzZSAob24gRU9GKQorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIHJlYWRFdmVudCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBieXRlW10gZWJ5dGVzID0gbmV3IGJ5dGVbNF07CisgICAgaW50IGVzaXplOworICAgIGludCBucmVhZDsKKyAgICBpbnQgbnJlcXVlc3RlZDsKKworICAgIHJldHJ5OgorICAgIGRvIHsKKyAgICAgIC8vIGNvcm5lciBjYXNlLiByZWFkIHRvIGVuZCBvZiBjaHVuaworICAgICAgbnJlcXVlc3RlZCA9IGNzLmdldFJlbWFpbmluZygpOworICAgICAgaWYobnJlcXVlc3RlZCA8IDQpIHsKKyAgICAgICAgbnJlYWQgPSB0YWlsUmVhZChpbnB1dFN0cmVhbV8sIGVieXRlcywgMCwgbnJlcXVlc3RlZCwgY3VycmVudFBvbGljeV8pOworICAgICAgICBpZihucmVhZCAhPSBucmVxdWVzdGVkKSB7CisgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBhc3N1bWluZyBzZXJpYWxpemVkIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZQorICAgICAgbnJlYWQgPSB0YWlsUmVhZChpbnB1dFN0cmVhbV8sIGVieXRlcywgMCwgNCwgY3VycmVudFBvbGljeV8pOworICAgICAgaWYobnJlYWQgIT0gNCkgeworICAgICAgICByZXR1cm4oZmFsc2UpOworICAgICAgfQorCisgICAgICBlc2l6ZT0wOworICAgICAgZm9yKGludCBpPTM7IGk+PTA7IGktLSkgeworICAgICAgICBpbnQgdmFsID0gKDB4MDAwMDAwZmYgJiAoaW50KWVieXRlc1tpXSk7CisgICAgICAgIGVzaXplIHw9ICh2YWwgPDwgKGkqOCkpOworICAgICAgfQorCisgICAgICAvLyBjaGVjayBpZiBldmVudCBpcyBjb3JydXB0ZWQgYW5kIGRvIHJlY292ZXJ5IGFzIHJlcXVpcmVkCisgICAgICBpZihlc2l6ZSA+IGNzLmdldFJlbWFpbmluZygpKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlVHJhbnNwb3J0IGVycm9yOiBiYWQgZXZlbnQgc2l6ZSIpOworICAgICAgICAvKiAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZihwZXJmb3JtUmVjb3ZlcnkoKSkgeworICAgICAgICAgICAgICAgICAgZXNpemU9MDsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICovCisgICAgICB9CisgICAgfSB3aGlsZSAoZXNpemUgPT0gMCk7CisKKyAgICAvLyByZXNldCBleGlzdGluZyBldmVudCBvciBnZXQgYSBsYXJnZXIgb25lCisgICAgaWYoY3VycmVudEV2ZW50Xy5nZXRTaXplKCkgPCBlc2l6ZSkKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBuZXcgRXZlbnQobmV3IGJ5dGUgW2VzaXplXSk7CisKKyAgICAvLyBwb3B1bGF0ZSB0aGUgZXZlbnQKKyAgICBieXRlW10gYnVmID0gY3VycmVudEV2ZW50Xy5nZXRCdWYoKTsKKyAgICBucmVhZCA9IHRhaWxSZWFkKGlucHV0U3RyZWFtXywgYnVmLCAwLCBlc2l6ZSwgY3VycmVudFBvbGljeV8pOworICAgIGlmKG5yZWFkICE9IGVzaXplKSB7CisgICAgICByZXR1cm4oZmFsc2UpOworICAgIH0KKyAgICBjdXJyZW50RXZlbnRfLnNldEF2YWlsYWJsZShlc2l6ZSk7CisgICAgcmV0dXJuKHRydWUpOworICB9CisKKyAgLyoqCisgICAqIG9wZW4gaWYgYm90aCBpbnB1dC9vdXRwdXQgb3BlbiB1bmxlc3MgcmVhZG9ubHkKKyAgICoKKyAgICogQHJldHVybiB0cnVlCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuICgoaW5wdXRTdHJlYW1fICE9IG51bGwpICYmIChyZWFkT25seV8gfHwgKG91dHB1dFN0cmVhbV8gIT0gbnVsbCkpKTsKKyAgfQorCisKKyAgLyoqCisgICAqIERpdmVyZ2luZyBmcm9tIHRoZSBjcHAgbW9kZWwgYW5kIHN0aWNraW5nIHRvIHRoZSBUU29ja2V0IG1vZGVsCisgICAqIEZpbGVzIGFyZSBub3Qgb3BlbmVkIGluIGN0b3IgLSBidXQgaW4gZXhwbGljaXQgb3BlbiBjYWxsCisgICAqLworICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChpc09wZW4oKSkgCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTik7CisKKyAgICB0cnkgeworICAgICAgaW5wdXRTdHJlYW1fID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgIGNzID0gbmV3IENodW5rU3RhdGUoKTsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBuZXcgRXZlbnQobmV3IGJ5dGUgWzI1Nl0pOworCisgICAgICBpZighcmVhZE9ubHlfKQorICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAqLworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoaW5wdXRGaWxlXyAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnB1dEZpbGVfLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBFcnJvciBjbG9zaW5nIGlucHV0IGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW94LmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICBpbnB1dEZpbGVfID0gbnVsbDsKKyAgICB9CisgICAgaWYgKG91dHB1dFN0cmVhbV8gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgb3V0cHV0U3RyZWFtXy5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogRXJyb3IgY2xvc2luZyBvdXRwdXQgc3RyZWFtOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlveC5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgb3V0cHV0U3RyZWFtXyA9IG51bGw7CisgICAgfQorICB9CisKKworICAvKioKKyAgICogRmlsZSBUcmFuc3BvcnQgY3RvcgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBGaWxlIHBhdGggdG8gcmVhZCBhbmQgd3JpdGUgZnJvbQorICAgKiBAcGFyYW0gcmVhZE9ubHkgV2hldGhlciB0aGlzIGlzIGEgcmVhZC1vbmx5IHRyYW5zcG9ydAorICAgKi8gCisgIHB1YmxpYyBURmlsZVRyYW5zcG9ydChmaW5hbCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWFkT25seSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnB1dEZpbGVfID0gbmV3IFRTdGFuZGFyZEZpbGUocGF0aCk7CisgICAgcmVhZE9ubHlfID0gcmVhZE9ubHk7CisgIH0KKworICAvKioKKyAgICogRmlsZSBUcmFuc3BvcnQgY3RvcgorICAgKgorICAgKiBAcGFyYW0gaW5wdXRGaWxlIG9wZW4gVFNlZWthYmxlRmlsZSB0byByZWFkL3dyaXRlIGZyb20KKyAgICogQHBhcmFtIHJlYWRPbmx5IFdoZXRoZXIgdGhpcyBpcyBhIHJlYWQtb25seSB0cmFuc3BvcnQKKyAgICovCisgIHB1YmxpYyBURmlsZVRyYW5zcG9ydChUU2Vla2FibGVGaWxlIGlucHV0RmlsZSwgYm9vbGVhbiByZWFkT25seSkgeworICAgIGlucHV0RmlsZV8gPSBpbnB1dEZpbGU7CisgICAgcmVhZE9ubHlfID0gcmVhZE9ubHk7CisgIH0KKworCisgIC8qKgorICAgKiBDbG9uZWQgZnJvbSBUVHJhbnNwb3J0LmphdmE6cmVhZEFsbCgpLiBPbmx5IGRpZmZlcmVuY2UgaXMgdGhyb3dpbmcgYW4gRU9GIGV4Y2VwdGlvbgorICAgKiB3aGVyZSBvbmUgaXMgZGV0ZWN0ZWQuCisgICAqLworICBwdWJsaWMgaW50IHJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IGdvdCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgcmV0ID0gcmVhZChidWYsIG9mZitnb3QsIGxlbi1nb3QpOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIGluIHJlYWRpbmcgZnJvbSBmaWxlIik7CisgICAgICB9CisgICAgICBpZihyZXQgPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5kIG9mIEZpbGUgcmVhY2hlZCIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisKKyAgLyoqCisgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYuCisgICAqCisgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgcmVhZGluZyIpOworCisgICAgaWYoY3VycmVudEV2ZW50Xy5nZXRSZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICBpZighcmVhZEV2ZW50KCkpCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpbnQgbnJlYWQgPSBjdXJyZW50RXZlbnRfLmVtaXQoYnVmLCBvZmYsIGxlbik7CisgICAgcmV0dXJuIG5yZWFkOworICB9CisKKyAgcHVibGljIGludCBnZXROdW1DaHVua3MoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgZ2V0TnVtQ2h1bmtzIik7CisgICAgdHJ5IHsKKyAgICAgIGxvbmcgbGVuID0gaW5wdXRGaWxlXy5sZW5ndGgoKTsKKyAgICAgIGlmKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UgCisgICAgICAgIHJldHVybiAoKChpbnQpKGxlbi9jcy5nZXRDaHVua1NpemUoKSkpICsgMSk7CisKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5nZXRNZXNzYWdlKCksIGlveCk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRDdXJDaHVuaygpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZighaXNPcGVuKCkpIAorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBvcGVuIGJlZm9yZSBnZXRDdXJDaHVuayIpOworICAgIHJldHVybiAoY3MuZ2V0Q2h1bmtOdW0oKSk7CisKKyAgfQorCisKKyAgcHVibGljIHZvaWQgc2Vla1RvQ2h1bmsoaW50IGNodW5rKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgc2Vla2luZyIpOworCisgICAgaW50IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworCisgICAgLy8gZmlsZSBpcyBlbXB0eSwgc2Vla2luZyB0byBjaHVuayBpcyBwb2ludGxlc3MKKyAgICBpZiAobnVtQ2h1bmtzID09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBuZWdhdGl2ZSBpbmRpY2F0ZXMgcmV2ZXJzZSBzZWVrIChmcm9tIHRoZSBlbmQpCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgY2h1bmsgKz0gbnVtQ2h1bmtzOworICAgIH0KKworICAgIC8vIHRvbyBsYXJnZSBhIHZhbHVlIGZvciByZXZlcnNlIHNlZWssIGp1c3Qgc2VlayB0byBiZWdpbm5pbmcKKyAgICBpZiAoY2h1bmsgPCAwKSB7CisgICAgICBjaHVuayA9IDA7CisgICAgfQorCisgICAgbG9uZyBlb2ZPZmZzZXQ9MDsKKyAgICBib29sZWFuIHNlZWtUb0VuZCA9IChjaHVuayA+PSBudW1DaHVua3MpOworICAgIGlmKHNlZWtUb0VuZCkgeworICAgICAgY2h1bmsgPSBjaHVuayAtIDE7CisgICAgICB0cnkgeyBlb2ZPZmZzZXQgPSBpbnB1dEZpbGVfLmxlbmd0aCgpOyB9CisgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7dGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3gpO30KKyAgICB9CisKKyAgICBpZihjaHVuaypjcy5nZXRDaHVua1NpemUoKSAhPSBjcy5nZXRPZmZzZXQoKSkgeworICAgICAgdHJ5IHsgaW5wdXRGaWxlXy5zZWVrKChsb25nKWNodW5rKmNzLmdldENodW5rU2l6ZSgpKTsgfSAKKyAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVJbnB1dFN0cmVhbTogIitpb3guZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlZWsgdG8gY2h1bmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rICsgIiAiICtpb3guZ2V0TWVzc2FnZSgpLCBpb3gpOworICAgICAgfQorCisgICAgICBjcy5zZWVrKChsb25nKWNodW5rKmNzLmdldENodW5rU2l6ZSgpKTsKKyAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOworICAgICAgaW5wdXRTdHJlYW1fID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBpZihzZWVrVG9FbmQpIHsKKyAgICAgIC8vIHdhaXRpbmcgZm9yZXZlciBoZXJlIC0gb3RoZXJ3aXNlIHdlIGNhbiBoaXQgRU9GIGFuZCBlbmQgdXAKKyAgICAgIC8vIGhhdmluZyBjb25zdW1lZCBwYXJ0aWFsIGRhdGEgZnJvbSB0aGUgZGF0YSBzdHJlYW0uCisgICAgICBUYWlsUG9saWN5IG9sZCA9IHNldFRhaWxQb2xpY3koVGFpbFBvbGljeS5XQUlUX0ZPUkVWRVIpOworICAgICAgd2hpbGUoY3MuZ2V0T2Zmc2V0KCkgPCBlb2ZPZmZzZXQpIHsgcmVhZEV2ZW50KCk7IH0KKyAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOworICAgICAgc2V0VGFpbFBvbGljeShvbGQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNlZWtUb0VuZCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZighaXNPcGVuKCkpIAorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBvcGVuIGJlZm9yZSBzZWVraW5nIik7CisgICAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOworICB9CisKKworICAvKioKKyAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAqCisgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOb3QgU3VwcG9ydGVkIik7CisgIH0KKworICAvKioKKyAgICogRmx1c2ggYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSB0cmFuc3BvcnQgYnVmZmVyLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAqLworICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm90IFN1cHBvcnRlZCIpOworICB9CisKKyAgLyoqCisgICAqIHRlc3QgcHJvZ3JhbQorICAgKiAKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgaW50IG51bV9jaHVua3MgPSAxMDsKKworICAgIGlmKChhcmdzLmxlbmd0aCA8IDEpIHx8IGFyZ3NbMF0uZXF1YWxzKCItLWhlbHAiKQorICAgICAgIHx8IGFyZ3NbMF0uZXF1YWxzKCItaCIpIHx8IGFyZ3NbMF0uZXF1YWxzKCItPyIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgfQorCisgICAgaWYoYXJncy5sZW5ndGggPiAxKSB7CisgICAgICB0cnkgeworICAgICAgICBudW1fY2h1bmtzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IHBhcnNlICIgKyBhcmdzWzFdKTsgCisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBURmlsZVRyYW5zcG9ydCB0ID0gbmV3IFRGaWxlVHJhbnNwb3J0KGFyZ3NbMF0sIHRydWUpOworICAgIHQub3BlbigpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtQ2h1bmtzPSIrdC5nZXROdW1DaHVua3MoKSk7CisKKyAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKKyAgICBmb3IoaW50IGo9MDsgajxudW1fY2h1bmtzOyBqKyspIHsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgIGludCBjbnVtID0gci5uZXh0SW50KHQuZ2V0TnVtQ2h1bmtzKCktMSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWRpbmcgY2h1bmsgIitjbnVtKTsKKyAgICAgIHQuc2Vla1RvQ2h1bmsoY251bSk7CisgICAgICBmb3IoaW50IGk9MDsgaTw0MDk2OyBpKyspIHsKKyAgICAgICAgdC5yZWFkKGJ1ZiwgMCwgNDA5Nik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgeworICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IFRGaWxlVHJhbnNwb3J0IDxmaWxlbmFtZT4gW251bV9jaHVua3NdIik7CisgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgICAgKE9wZW5zIGFuZCByZWFkcyBudW1fY2h1bmtzIGNodW5rcyBmcm9tIGZpbGUgcmFuZG9tbHkpIik7CisgICAgU3lzdGVtLmV4aXQoMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCAzMjQ4M2VlLi5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMjMsMTEgKzIzLDExIEBACiAKIC8qKgogICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCi0gKiBldmVyeSB0aW1lIGJ5IHByZWNlZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgorICogZXZlcnkgdGltZSBieSBwcmVjZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgogICovCiBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDB4N0ZGRkZGRkY7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOwogCiAgIHByaXZhdGUgaW50IG1heExlbmd0aF87CiAKQEAgLTQ1LDcgKzQ1LDggQEAKICAgLyoqCiAgICAqIEJ1ZmZlciBmb3IgaW5wdXQKICAgICovCi0gIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CisgIHByaXZhdGUgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0KKyAgICBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CiAgICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoXzsKQEAgLTY1LDE2ICs2NiwyNSBAQAogICB9CiAKICAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5wc29ydAorICAgKiBTb21ldGhpbmcgdG8gZmlsbCBpbiB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgYnVmZmVyCisgICAqIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGZyYW1lIHNpemUuICBUaGlzIGFsbG93cyB0aGUKKyAgICogaW1wbGVtZW50YXRpb24gdG8gd3JpdGUgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNpemVGaWxsZXJfID0gbmV3IGJ5dGVbXSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CiAgICAqLwogICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IG1heExlbmd0aCkgewogICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CiAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTkwLDExICsxMDAsOSBAQAogICB9CiAKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpZiAocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgewotICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7Ci0gICAgICBpZiAoZ290ID4gMCkgewotICAgICAgICByZXR1cm4gZ290OwotICAgICAgfQorICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICByZXR1cm4gZ290OwogICAgIH0KIAogICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCkBAIC0xMjMsNiArMTMxLDEwIEBACiAgICAgcmVhZEJ1ZmZlcl8uY29uc3VtZUJ1ZmZlcihsZW4pOwogICB9CiAKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlcl8uY2xlYXIoKTsKKyAgfQorCiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogCiAgIHByaXZhdGUgdm9pZCByZWFkRnJhbWUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC0xMzAsMTEgKzE0MiwxNCBAQAogICAgIGludCBzaXplID0gZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CiAKICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aF8gKyAiKSEiKTsKICAgICB9CiAKICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwpAQCAtMTQ5LDEyICsxNjQsMTIgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0KCk7Ci0gICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKTsKKyAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpIC0gNDsgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHByZXBlbmRlZCBmcmFtZSBzaXplCiAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsgIC8vIG1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgZnJhbWUncyBzaXplIGRhdGEKIAotICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGkzMmJ1Zik7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4pOworICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGJ1Zik7ICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBmcmFtZSBsZW5ndGggd2l0aG91dCB0aGUgZmlsbGVyCisgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbiArIDQpOyAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEKICAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CiAgIH0KIApAQCAtMTY2LDcgKzE4MSw3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWNvZGVGcmFtZVNpemUoZmluYWwgYnl0ZVtdIGJ1ZikgewotICAgIHJldHVybiAKKyAgICByZXR1cm4KICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgIDgpIHwKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCA0MTkyMzUzLi5jMzA2M2ZlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOCwxNyArMjksNDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ5dGVBcnJheUVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVDb25uZWN0aW9uUE5hbWVzOworCiAvKioKICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQotICogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24gKHVzaW5nIGZvciBleGFtcGxlIFRTZXJ2bGV0KS4KICAqCisgKiBUaGlzIGNsYXNzIG9mZmVycyB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBIVFRQIHRyYW5zcG9ydC4KKyAqIE9uZSB1c2VzIEh0dHBVUkxDb25uZWN0aW9uIGluc3RhbmNlcywgdGhlIG90aGVyIEh0dHBDbGllbnQgZnJvbSBBcGFjaGUKKyAqIEh0dHAgQ29tcG9uZW50cy4KKyAqIFRoZSBjaG9zZW4gaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB0aGUgY29uc3RydWN0b3IgdXNlZCB0bworICogY3JlYXRlIHRoZSBUSHR0cENsaWVudCBpbnN0YW5jZS4KKyAqIFVzaW5nIHRoZSBUSHR0cENsaWVudChTdHJpbmcgdXJsKSBjb25zdHJ1Y3RvciBvciBwYXNzaW5nIG51bGwgYXMgdGhlCisgKiBIdHRwQ2xpZW50IHRvIFRIdHRwQ2xpZW50KFN0cmluZyB1cmwsIEh0dHBDbGllbnQgY2xpZW50KSB3aWxsIGNyZWF0ZSBhbgorICogaW5zdGFuY2Ugd2hpY2ggd2lsbCB1c2UgSHR0cFVSTENvbm5lY3Rpb24uCisgKgorICogV2hlbiB1c2luZyBIdHRwQ2xpZW50LCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gbGVhZHMgdG8gNS0xNSUgCisgKiBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB0aGUgSHR0cFVSTENvbm5lY3Rpb24gaW1wbGVtZW50YXRpb246CisgKgorICogaHR0cC5wcm90b2NvbC52ZXJzaW9uPUh0dHBWZXJzaW9uLkhUVFBfMV8xCisgKiBodHRwLnByb3RvY29sLmNvbnRlbnQtY2hhcnNldD1VVEYtOAorICogaHR0cC5wcm90b2NvbC5leHBlY3QtY29udGludWU9ZmFsc2UKKyAqIGh0dHAuY29ubmVjdGlvbi5zdGFsZWNoZWNrPWZhbHNlCisgKgorICogQWxzbyBub3RlIHRoYXQgdW5kZXIgaGlnaCBsb2FkLCB0aGUgSHR0cFVSTENvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqIG1heSBleGhhdXN0IHRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvciBsaW1pdC4KKyAqCisgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk3MCI+VEhSSUZULTk3MDwvYT4KICAqLworCiBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIAogICBwcml2YXRlIFVSTCB1cmxfID0gbnVsbDsKIAotICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXF1ZXN0QnVmZmVyXyA9Ci0gICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAogICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtXyA9IG51bGw7CiAKQEAgLTQ4LDkgKzc5LDU0IEBACiAKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLFN0cmluZz4gY3VzdG9tSGVhZGVyc18gPSBudWxsOwogCisgIHByaXZhdGUgZmluYWwgSHR0cEhvc3QgaG9zdDsKKyAgCisgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJsOworICAgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgICAgCisgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIHVybCkgeworICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIHVybCwgSHR0cENsaWVudCBjbGllbnQpIHsKKyAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAobnVsbCAhPSBjbGllbnQpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KHVybCwgY2xpZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KHVybCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgfQorCiAgIHB1YmxpYyBUSHR0cENsaWVudChTdHJpbmcgdXJsKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKICAgICAgIHVybF8gPSBuZXcgVVJMKHVybCk7CisgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgICB0aGlzLmhvc3QgPSBudWxsOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVEh0dHBDbGllbnQoU3RyaW5nIHVybCwgSHR0cENsaWVudCBjbGllbnQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgdXJsXyA9IG5ldyBVUkwodXJsKTsKKyAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgdGhpcy5ob3N0ID0gbmV3IEh0dHBIb3N0KHVybF8uZ2V0SG9zdCgpLCAtMSA9PSB1cmxfLmdldFBvcnQoKSA/IHVybF8uZ2V0RGVmYXVsdFBvcnQoKSA6IHVybF8uZ2V0UG9ydCgpLCB1cmxfLmdldFByb3RvY29sKCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKICAgICB9CkBAIC01OCwxMCArMTM0LDIwIEBACiAKICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKICAgICBjb25uZWN0VGltZW91dF8gPSB0aW1lb3V0OworICAgIGlmIChudWxsICE9IHRoaXMuY2xpZW50KSB7CisgICAgICAvLyBXQVJOSU5HLCB0aGlzIG1vZGlmaWVzIHRoZSBIdHRwQ2xpZW50IHBhcmFtcywgdGhpcyBtaWdodCBoYXZlIGFuIGltcGFjdCBlbHNld2hlcmUgaWYgdGhlCisgICAgICAvLyBzYW1lIEh0dHBDbGllbnQgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UuCisgICAgICBjbGllbnQuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKENvcmVDb25uZWN0aW9uUE5hbWVzLkNPTk5FQ1RJT05fVElNRU9VVCwgY29ubmVjdFRpbWVvdXRfKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dChpbnQgdGltZW91dCkgewogICAgIHJlYWRUaW1lb3V0XyA9IHRpbWVvdXQ7CisgICAgaWYgKG51bGwgIT0gdGhpcy5jbGllbnQpIHsKKyAgICAgIC8vIFdBUk5JTkcsIHRoaXMgbW9kaWZpZXMgdGhlIEh0dHBDbGllbnQgcGFyYW1zLCB0aGlzIG1pZ2h0IGhhdmUgYW4gaW1wYWN0IGVsc2V3aGVyZSBpZiB0aGUKKyAgICAgIC8vIHNhbWUgSHR0cENsaWVudCBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZS4KKyAgICAgIGNsaWVudC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuU09fVElNRU9VVCwgcmVhZFRpbWVvdXRfKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRDdXN0b21IZWFkZXJzKE1hcDxTdHJpbmcsU3RyaW5nPiBoZWFkZXJzKSB7CkBAIC0xMTEsNyArMTk3LDEyNiBAQAogICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAKKyAgLyoqCisgICAqIGNvcHkgZnJvbSBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlscyNjb25zdW1lLiBBbmRyb2lkIGhhcyBpdCdzIG93biBodHRwY29yZQorICAgKiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN1bWUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnN1bWUoZmluYWwgSHR0cEVudGl0eSBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoZW50aXR5LmlzU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7CisgICAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZmx1c2hVc2luZ0h0dHBDbGllbnQoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgCisgICAgaWYgKG51bGwgPT0gdGhpcy5jbGllbnQpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOdWxsIEh0dHBDbGllbnQsIGFib3J0aW5nLiIpOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgcmVxdWVzdCBhbmQgcmVzZXQgYnVmZmVyCisgICAgYnl0ZVtdIGRhdGEgPSByZXF1ZXN0QnVmZmVyXy50b0J5dGVBcnJheSgpOworICAgIHJlcXVlc3RCdWZmZXJfLnJlc2V0KCk7CisKKyAgICBIdHRwUG9zdCBwb3N0ID0gbnVsbDsKKyAgICAKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgCisgICAgdHJ5IHsgICAgICAKKyAgICAgIC8vIFNldCByZXF1ZXN0IHRvIHBhdGggKyBxdWVyeSBzdHJpbmcKKyAgICAgIHBvc3QgPSBuZXcgSHR0cFBvc3QodGhpcy51cmxfLmdldEZpbGUoKSk7CisgICAgICAKKyAgICAgIC8vCisgICAgICAvLyBIZWFkZXJzIGFyZSBhZGRlZCB0byB0aGUgSHR0cFBvc3QgaW5zdGFuY2UsIG5vdAorICAgICAgLy8gdG8gSHR0cENsaWVudC4KKyAgICAgIC8vCisgICAgICAKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJBY2NlcHQiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJVc2VyLUFnZW50IiwgIkphdmEvVEh0dHBDbGllbnQvSEMiKTsKKyAgICAgIAorICAgICAgaWYgKG51bGwgIT0gY3VzdG9tSGVhZGVyc18pIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGN1c3RvbUhlYWRlcnNfLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBwb3N0LnNldEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwb3N0LnNldEVudGl0eShuZXcgQnl0ZUFycmF5RW50aXR5KGRhdGEpKTsKKyAgICAgIAorICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gdGhpcy5jbGllbnQuZXhlY3V0ZSh0aGlzLmhvc3QsIHBvc3QpOworICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisKKyAgICAgIC8vICAgICAgCisgICAgICAvLyBSZXRyaWV2ZSB0aGUgaW5wdXRzdHJlYW0gQkVGT1JFIGNoZWNraW5nIHRoZSBzdGF0dXMgY29kZSBzbworICAgICAgLy8gcmVzb3VyY2VzIGdldCBmcmVlZCBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisgICAgICAvLworCisgICAgICBpcyA9IHJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKKyAgICAgIAorICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMgaW50byBhIGJ5dGUgYXJyYXkgc28gd2UgY2FuIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgIC8vIGVhcmx5LiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgd2hvbGUgY29udGVudCB3aWxsIGhhdmUgdG8gYmUgcmVhZCBpbgorICAgICAgLy8gbWVtb3J5LCBhbmQgdGhhdCBtb21lbnRhcmlseSB3ZSBtaWdodCB1c2UgdXAgdHdpY2UgdGhlIG1lbW9yeSAod2hpbGUgdGhlCisgICAgICAvLyB0aHJpZnQgc3RydWN0IGlzIGJlaW5nIHJlYWQgdXAgdGhlIGNoYWluKS4KKyAgICAgIC8vIFByb2NlZWRpbmcgZGlmZmVyZW50bHkgbWlnaHQgbGVhZCB0byBleGhhdXN0aW9uIG9mIGNvbm5lY3Rpb25zIGFuZCB0aHVzCisgICAgICAvLyB0byBhcHAgZmFpbHVyZS4KKyAgICAgIAorICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgZG8geworICAgICAgICBsZW4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgYmFvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKC0xICE9IGxlbik7CisgICAgICAKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIEluZGljYXRlIHdlJ3JlIGRvbmUgd2l0aCB0aGUgY29udGVudC4KKyAgICAgICAgY29uc3VtZShyZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgLy8gV2UgaWdub3JlIHRoaXMgZXhjZXB0aW9uLCBpdCBtaWdodCBvbmx5IG1lYW4gdGhlIHNlcnZlciBoYXMgbm8KKyAgICAgICAgLy8ga2VlcC1hbGl2ZSBjYXBhYmlsaXR5LgorICAgICAgfQorICAgICAgICAgICAgCisgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIC8vIEFib3J0IG1ldGhvZCBzbyB0aGUgY29ubmVjdGlvbiBnZXRzIHJlbGVhc2VkIGJhY2sgdG8gdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICAgICAgaWYgKG51bGwgIT0gcG9zdCkgeworICAgICAgICBwb3N0LmFib3J0KCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAobnVsbCAhPSBpcykgeworICAgICAgICAvLyBDbG9zZSB0aGUgZW50aXR5J3MgaW5wdXQgc3RyZWFtLCB0aGlzIHdpbGwgcmVsZWFzZSB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBvc3QgIT0gbnVsbCkgeworICAgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICB9CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisKKyAgICBpZiAobnVsbCAhPSB0aGlzLmNsaWVudCkgeworICAgICAgZmx1c2hVc2luZ0h0dHBDbGllbnQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgogICAgIGJ5dGVbXSBkYXRhID0gcmVxdWVzdEJ1ZmZlcl8udG9CeXRlQXJyYXkoKTsKICAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQppbmRleCA5YjkwNmRiLi5iMTlhYzg2IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCkBAIC0yOCw4ICsyOCwxMCBAQAogcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhbiBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIDxpPnNpemU8L2k+LiBUaGUKLSAgICogaW50ZXJuYWwgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQogICAgKiBiZWluZyB3cml0dGVuIHRvIGl0LgorICAgKgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIKICAgICovCiAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGludCBzaXplKSB7CiAgICAgYXJyXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHNpemUpOwpAQCAtNjksMjAgKzcxLDIwIEBACiAgIC8qKgogICAgKiBPdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQKICAgICogZW5jb2RpbmcKLSAgICogQHBhcmFtIGVuYyAgdGhlIGVuY29kaW5nIHRvIHVzZQorICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgZW5jb2RpbmcgdG8gdXNlCiAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nCiAgICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gYXJyXy50b1N0cmluZyhlbmMpOworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKENoYXJzZXQgY2hhcnNldCkgeworICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGNoYXJzZXQpOwogICB9CiAKICAgcHVibGljIFN0cmluZyBpbnNwZWN0KCkgewotICAgIFN0cmluZyBidWYgPSAiIjsKKyAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgYnl0ZVtdIGJ5dGVzID0gYXJyXy50b0J5dGVBcnJheSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGJ1ZiArPSAocG9zXyA9PSBpID8gIj09PiIgOiAiIiApICsgSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpICsgIiAiOworICAgICAgYnVmLmFwcGVuZChwb3NfID09IGkgPyAiPT0+IiA6ICIiICkuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbaV0gJiAweGZmKSkuYXBwZW5kKCIgIik7CiAgICAgfQotICAgIHJldHVybiBidWY7CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICB9CiAKICAgLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUlucHV0VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlJbnB1dFRyYW5zcG9ydC5qYXZhCmluZGV4IDEzYjVmODMuLjI1MzBkY2MgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUlucHV0VHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5SW5wdXRUcmFuc3BvcnQuamF2YQpAQCAtNDUsNiArNDUsMTAgQEAKICAgICBlbmRQb3NfID0gb2Zmc2V0ICsgbGVuZ3RoOwogICB9CiAKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgYnVmXyA9IG51bGw7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQppbmRleCBlMjZiOWNmLi5lZjgyYWMyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKQEAgLTMwLDEwICszMCwxNCBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKIAoraW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIC8qKgogICogV3JhcHBlciBhcm91bmQgU2VydmVyU29ja2V0Q2hhbm5lbAogICovCiBwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jbGFzcy5nZXROYW1lKCkpOwogCiAgIC8qKgogICAgKiBUaGlzIGNoYW5uZWwgaXMgd2hlcmUgYWxsIHRoZSBub25ibG9ja2luZyBtYWdpYyBoYXBwZW5zLgpAQCAtNDEsMzQgKzQ1LDE3IEBACiAgIHByaXZhdGUgU2VydmVyU29ja2V0Q2hhbm5lbCBzZXJ2ZXJTb2NrZXRDaGFubmVsID0gbnVsbDsKIAogICAvKioKLSAgICogVW5kZXJseWluZyBzZXJ2ZXJzb2NrZXQgb2JqZWN0CisgICAqIFVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9iamVjdAogICAgKi8KICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0XyA9IG51bGw7CiAKICAgLyoqCi0gICAqIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqLwotICBwcml2YXRlIGludCBwb3J0XyA9IDA7Ci0KLSAgLyoqCiAgICAqIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0CiAgICAqLwogICBwcml2YXRlIGludCBjbGllbnRUaW1lb3V0XyA9IDA7CiAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0gICAqLwotICAvLyBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQpIHsKLSAgLy8gICB0aGlzKHNlcnZlclNvY2tldCwgMCk7Ci0gIC8vIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLSAgICovCi0gIC8vIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwgaW50IGNsaWVudFRpbWVvdXQpIHsKLSAgLy8gICBzZXJ2ZXJTb2NrZXRfID0gc2VydmVyU29ja2V0OwotICAvLyAgIGNsaWVudFRpbWVvdXRfID0gY2xpZW50VGltZW91dDsKLSAgLy8gfQorICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzIGV4dGVuZHMKKyAgICAgIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncz4ge30KIAogICAvKioKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldApAQCAtODEsMTYgKzY4LDE5IEBACiAgICAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKICAgICovCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgdGhpcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCksIGNsaWVudFRpbWVvdXQpOwotICAgIHBvcnRfID0gcG9ydDsKLSAgfSAgCisgICAgdGhpcyhuZXcgTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOworICB9CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRoaXMoYmluZEFkZHIsIDApOwogICB9CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5iaW5kQWRkcihiaW5kQWRkcikuY2xpZW50VGltZW91dChjbGllbnRUaW1lb3V0KSk7CisgIH0KKworICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzIGFyZ3MpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBjbGllbnRUaW1lb3V0XyA9IGFyZ3MuY2xpZW50VGltZW91dDsKICAgICB0cnkgewogICAgICAgc2VydmVyU29ja2V0Q2hhbm5lbCA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOwogICAgICAgc2VydmVyU29ja2V0Q2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CkBAIC0xMDAsMTAgKzkwLDEwIEBACiAgICAgICAvLyBQcmV2ZW50IDJNU0wgZGVsYXkgcHJvYmxlbSBvbiBzZXJ2ZXIgcmVzdGFydHMKICAgICAgIHNlcnZlclNvY2tldF8uc2V0UmV1c2VBZGRyZXNzKHRydWUpOwogICAgICAgLy8gQmluZCB0byBsaXN0ZW5pbmcgcG9ydAotICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGJpbmRBZGRyKTsKKyAgICAgIHNlcnZlclNvY2tldF8uYmluZChhcmdzLmJpbmRBZGRyLCBhcmdzLmJhY2tsb2cpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgc2VydmVyU29ja2V0XyA9IG51bGw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCkBAIC0xNTIsOCArMTQyLDcgQEAKICAgICAgIHRyeSB7CiAgICAgICAgIHNlcnZlclNvY2tldF8uY2xvc2UoKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlveC5nZXRNZXNzYWdlKCkpOworICAgICAgICBMT0dHRVIud2FybigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBpb3guZ2V0TWVzc2FnZSgpKTsKICAgICAgIH0KICAgICAgIHNlcnZlclNvY2tldF8gPSBudWxsOwogICAgIH0KQEAgLTE2NSw0ICsxNTQsMTAgQEAKICAgICBjbG9zZSgpOwogICB9CiAKKyAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgIGlmIChzZXJ2ZXJTb2NrZXRfID09IG51bGwpCisgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHNlcnZlclNvY2tldF8uZ2V0TG9jYWxQb3J0KCk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKaW5kZXggMzEzZWY4NS4uZjg2YTQ4YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCkBAIC0yMywxMzcgKzIzLDEyMiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CiAKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiAvKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFRvIGJlIGNvbW1lbnRlZCBzb29uIQorICogVHJhbnNwb3J0IGZvciB1c2Ugd2l0aCBhc3luYyBjbGllbnQuCiAgKi8KIHB1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTb2NrZXQgZXh0ZW5kcyBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgewogCi0gIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gbnVsbDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFROb25ibG9ja2luZ1NvY2tldC5jbGFzcy5nZXROYW1lKCkpOwogCiAgIC8qKgotICAgKiBXcmFwcGVkIFNvY2tldCBvYmplY3QKKyAgICogSG9zdCBhbmQgcG9ydCBpZiBwYXNzZWQgaW4sIHVzZWQgZm9yIGxhenkgbm9uLWJsb2NraW5nIGNvbm5lY3QuCiAgICAqLwotICBwcml2YXRlIFNvY2tldCBzb2NrZXRfID0gbnVsbDsKKyAgcHJpdmF0ZSBmaW5hbCBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3NfOworCisgIHByaXZhdGUgZmluYWwgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsXzsKKworICBwdWJsaWMgVE5vbmJsb2NraW5nU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzKGhvc3QsIHBvcnQsIDApOworICB9CiAKICAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0Ci0gICAqLwotICBwcml2YXRlIGludCB0aW1lb3V0XyA9IDA7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBub25ibG9ja2luZyBzb2NrZXQgdHJhbnNwb3J0IGNvbm5lY3RlZCB0byBob3N0OnBvcnQuCisgICAqIENyZWF0ZSBhIG5ldyBub25ibG9ja2luZyBzb2NrZXQgdHJhbnNwb3J0IHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQgdG8gaG9zdDpwb3J0LgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgKi8KLSAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgdGhpcyhTb2NrZXRDaGFubmVsLm9wZW4obmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpKSk7CisgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzKFNvY2tldENoYW5uZWwub3BlbigpLCB0aW1lb3V0LCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCkpOwogICB9CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgQWxyZWFkeSBjcmVhdGVkIFNvY2tldENoYW5uZWwgb2JqZWN0Ci0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXR0aW5nIHVwIHRoZSBzdHJlYW1zCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc2V0dGluZyB1cCB0aGUgc3RyZWFtcwogICAgKi8KLSAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gbWFrZSBpdCBhIG5vbmJsb2NraW5nIGNoYW5uZWwKLSAgICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgIH0KKyAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcyhzb2NrZXRDaGFubmVsLCAwLCBudWxsKTsKKyAgICBpZiAoIXNvY2tldENoYW5uZWwuaXNDb25uZWN0ZWQoKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTb2NrZXQgbXVzdCBhbHJlYWR5IGJlIGNvbm5lY3RlZCIpOworICB9CiAKLSAgICB0aGlzLnNvY2tldENoYW5uZWwgPSBzb2NrZXRDaGFubmVsOwotICAgIHRoaXMuc29ja2V0XyA9IHNvY2tldENoYW5uZWwuc29ja2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwotICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewotICAgICAgc3gucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQorICBwcml2YXRlIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIGludCB0aW1lb3V0LCBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNvY2tldENoYW5uZWxfID0gc29ja2V0Q2hhbm5lbDsKKyAgICBzb2NrZXRBZGRyZXNzXyA9IHNvY2tldEFkZHJlc3M7CisKKyAgICAvLyBtYWtlIGl0IGEgbm9uYmxvY2tpbmcgY2hhbm5lbAorICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworCisgICAgLy8gc2V0IG9wdGlvbnMKKyAgICBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKKyAgICBzb2NrZXQuc2V0U29MaW5nZXIoZmFsc2UsIDApOworICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7CisgICAgc2V0VGltZW91dCh0aW1lb3V0KTsKICAgfQogCiAgIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHNvY2tldCB3aXRoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUKLSAgICogb3BlcmF0aW9ucy4KKyAgICogUmVnaXN0ZXIgdGhlIG5ldyBTb2NrZXRDaGFubmVsIHdpdGggb3VyIFNlbGVjdG9yLCBpbmRpY2F0aW5nCisgICAqIHdlJ2QgbGlrZSB0byBiZSBub3RpZmllZCB3aGVuIGl0J3MgcmVhZHkgZm9yIEkvTy4KICAgICoKICAgICogQHBhcmFtIHNlbGVjdG9yCiAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIHRoaXMgc29ja2V0LgogICAgKi8KICAgcHVibGljIFNlbGVjdGlvbktleSByZWdpc3RlclNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgaW50ZXJlc3RzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFJlZ2lzdGVyIHRoZSBuZXcgU29ja2V0Q2hhbm5lbCB3aXRoIG91ciBTZWxlY3RvciwgaW5kaWNhdGluZwotICAgIC8vIHdlJ2QgbGlrZSB0byBiZSBub3RpZmllZCB3aGVuIHRoZXJlJ3MgZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWQKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC5yZWdpc3RlcihzZWxlY3RvciwgaW50ZXJlc3RzKTsKKyAgICByZXR1cm4gc29ja2V0Q2hhbm5lbF8ucmVnaXN0ZXIoc2VsZWN0b3IsIGludGVyZXN0cyk7CiAgIH0KIAogICAvKioKLSAgICogSW5pdGlhbGl6ZXMgdGhlIHNvY2tldCBvYmplY3QKLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0U29ja2V0KCkgewotICAgIHNvY2tldF8gPSBuZXcgU29ja2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwotICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgc29ja2V0Xy5zZXRTb1RpbWVvdXQodGltZW91dF8pOwotICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewotICAgICAgc3gucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0CisgICAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0LCBhbHRob3VnaCB0aGlzIGltcGxlbWVudGF0aW9uIG5ldmVyIHVzZXMgYmxvY2tpbmcgb3BlcmF0aW9ucyBzbyBpdCBpcyB1bnVzZWQuCiAgICAqCiAgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OwogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0KTsKKyAgICAgIHNvY2tldENoYW5uZWxfLnNvY2tldCgpLnNldFNvVGltZW91dCh0aW1lb3V0KTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKLSAgICAgIHN4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBzZXQgc29ja2V0IHRpbWVvdXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBTb2NrZXRDaGFubmVsLgogICAgKi8KLSAgcHVibGljIFNvY2tldCBnZXRTb2NrZXQoKSB7Ci0gICAgaWYgKHNvY2tldF8gPT0gbnVsbCkgewotICAgICAgaW5pdFNvY2tldCgpOwotICAgIH0KLSAgICByZXR1cm4gc29ja2V0XzsKKyAgcHVibGljIFNvY2tldENoYW5uZWwgZ2V0U29ja2V0Q2hhbm5lbCgpIHsKKyAgICByZXR1cm4gc29ja2V0Q2hhbm5lbF87CiAgIH0KIAogICAvKioKICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCiAgICAqLwogICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7Ci0gICAgaWYgKHNvY2tldF8gPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gc29ja2V0Xy5pc0Nvbm5lY3RlZCgpOworICAgIC8vIGlzQ29ubmVjdGVkKCkgZG9lcyBub3QgcmV0dXJuIGZhbHNlIGFmdGVyIGNsb3NlKCksIGJ1dCBpc09wZW4oKSBkb2VzCisgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLmlzT3BlbigpICYmIHNvY2tldENoYW5uZWxfLmlzQ29ubmVjdGVkKCk7CiAgIH0KIAogICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCisgICAqIERvIG5vdCBjYWxsLCB0aGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgaXRzIG93biBsYXp5IG5vbi1ibG9ja2luZyBjb25uZWN0LgogICAgKi8KICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcGVuKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBUTm9uYmxvY2tpbmdTb2NrZXQiKTsKICAgfQogCiAgIC8qKgogICAgKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgcmVhZCBpbnRvIGJ1ZmZlci4KICAgICovCiAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC5yZWFkKGJ1ZmZlcik7CisgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLnJlYWQoYnVmZmVyKTsKICAgfQogCiAKQEAgLTE2MSwxMiArMTQ2LDEyIEBACiAgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGlmIG5vdCBudWxsLgogICAgKi8KICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpZiAoKHNvY2tldENoYW5uZWwudmFsaWRPcHMoKSAmIFNlbGVjdGlvbktleS5PUF9SRUFEKSAhPSBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgeworICAgIGlmICgoc29ja2V0Q2hhbm5lbF8udmFsaWRPcHMoKSAmIFNlbGVjdGlvbktleS5PUF9SRUFEKSAhPSBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gd3JpdGUtb25seSBzb2NrZXQgY2hhbm5lbCIpOwogICAgIH0KICAgICB0cnkgewotICAgICAgcmV0dXJuIHNvY2tldENoYW5uZWwucmVhZChCeXRlQnVmZmVyLndyYXAoYnVmLCBvZmYsIGxlbikpOworICAgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLnJlYWQoQnl0ZUJ1ZmZlci53cmFwKGJ1Ziwgb2ZmLCBsZW4pKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgaW94KTsKICAgICB9CkBAIC0xNzYsMjYgKzE2MSwyNiBAQAogICAgKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgd3JpdGUgb2YgdGhlIGRhdGEgaW4gYnVmZmVyOwogICAgKi8KICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC53cml0ZShidWZmZXIpOworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy53cml0ZShidWZmZXIpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGlmICgoc29ja2V0Q2hhbm5lbC52YWxpZE9wcygpICYgU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKSAhPSBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpIHsKKyAgICBpZiAoKHNvY2tldENoYW5uZWxfLnZhbGlkT3BzKCkgJiBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpICE9IFNlbGVjdGlvbktleS5PUF9XUklURSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byB3cml0ZS1vbmx5IHNvY2tldCBjaGFubmVsIik7CiAgICAgfQogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXIud3JhcChidWYsIG9mZiwgbGVuKSk7CisgICAgICBzb2NrZXRDaGFubmVsXy53cml0ZShCeXRlQnVmZmVyLndyYXAoYnVmLCBvZmYsIGxlbikpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBpb3gpOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgKiBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCisgICAqIE5vb3AuCiAgICAqLwogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IFNvY2tldENoYW5uZWwuCkBAIC0yMDYsMTAgKzE5MSwyMCBAQAogICAgKi8KICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgdHJ5IHsKLSAgICAgIHNvY2tldENoYW5uZWwuY2xvc2UoKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzaWxlbnRseSBpZ25vcmUuCisgICAgICBzb2NrZXRDaGFubmVsXy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQuIiwgaW94KTsKICAgICB9CiAgIH0KIAorICAvKioge0Bpbmhlcml0RG9jfSAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy5jb25uZWN0KHNvY2tldEFkZHJlc3NfKTsKKyAgfQorCisgIC8qKiB7QGluaGVyaXREb2N9ICovCisgIHB1YmxpYyBib29sZWFuIGZpbmlzaENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy5maW5pc2hDb25uZWN0KCk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nVHJhbnNwb3J0LmphdmEKaW5kZXggNTE3ZWFjYi4uNDNjMTMwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1RyYW5zcG9ydC5qYXZhCkBAIC0yMCwxMiArMjAsMjggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFROb25ibG9ja2luZ1RyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgIC8qKgorICAgKiBOb24tYmxvY2tpbmcgY29ubmVjdGlvbiBpbml0aWFsaXphdGlvbi4KKyAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI2Nvbm5lY3QoU29ja2V0QWRkcmVzcyByZW1vdGUpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIE5vbi1ibG9ja2luZyBjb25uZWN0aW9uIGNvbXBsZXRpb24uCisgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCNmaW5pc2hDb25uZWN0KCkKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZpbmlzaENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IFNlbGVjdGlvbktleSByZWdpc3RlclNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgaW50ZXJlc3RzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKEJ5dGVCdWZmZXIgYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzJhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKKworLyoqCisgKiAgQSBGYWN0b3J5IGZvciBwcm92aWRpbmcgYW5kIHNldHRpbmcgdXAgQ2xpZW50IGFuZCBTZXJ2ZXIgU1NMIHdyYXBwZWQKKyAqICBUU29ja2V0IGFuZCBUU2VydmVyU29ja2V0CisgKi8KK3B1YmxpYyBjbGFzcyBUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgLyoqCisgICAqIEdldCBhIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LiBJbiB0aGlzCisgICAqIGNvbmZpZ3VyYXRpb24gdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlIHVzZWQuIERlZmF1bHQgc2V0dGluZ3MgYXJlIHJldHJpZXZlZAorICAgKiBmcm9tIFN5c3RlbSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHNldC4KKyAgICoKKyAgICogRXhhbXBsZSBzeXN0ZW0gcHJvcGVydGllczoKKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CisgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKKyAgICoKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyU29ja2V0KGludCBwb3J0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldFNlcnZlclNvY2tldChwb3J0LCAwKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0CisgICAqCisgICAqIEBwYXJhbSBwb3J0CisgICAqIEBwYXJhbSBjbGllbnRUaW1lb3V0CisgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0U2VydmVyU29ja2V0KHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBpbnRlcmZhY2UKKyAgICoKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKKyAgICogQHBhcmFtIGlmQWRkcmVzcworICAgKiBAcmV0dXJuIEEgU1NMIHdyYXBwZWQgVFNlcnZlclNvY2tldAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sZWFuIGNsaWVudEF1dGgsIEluZXRBZGRyZXNzIGlmQWRkcmVzcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICByZXR1cm4gY3JlYXRlU2VydmVyKGZhY3RvcnksIHBvcnQsIGNsaWVudFRpbWVvdXQsIGNsaWVudEF1dGgsIGlmQWRkcmVzcywgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlLgorICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLAorICAgKiB0cnVzdHN0b3JlIGFuZCBvdGhlciBzZXR0aW5ncworICAgKgorICAgKiBAcGFyYW0gcG9ydAorICAgKiBAcGFyYW0gY2xpZW50VGltZW91dAorICAgKiBAcGFyYW0gaWZBZGRyZXNzCisgICAqIEBwYXJhbSBwYXJhbXMKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgSW5ldEFkZHJlc3MgaWZBZGRyZXNzLCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGFyYW1zID09IG51bGwgfHwgIShwYXJhbXMuaXNLZXlTdG9yZVNldCB8fCBwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVpdGhlciBvbmUgb2YgdGhlIEtleVN0b3JlIG9yIFRydXN0U3RvcmUgbXVzdCBiZSBzZXQgZm9yIFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IGN0eCA9IGNyZWF0ZVNTTENvbnRleHQocGFyYW1zKTsKKyAgICByZXR1cm4gY3JlYXRlU2VydmVyKGN0eC5nZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5KCksIHBvcnQsIGNsaWVudFRpbWVvdXQsIHBhcmFtcy5jbGllbnRBdXRoLCBpZkFkZHJlc3MsIHBhcmFtcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlcihTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IGZhY3RvcnksIGludCBwb3J0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBjbGllbnRBdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaWZBZGRyZXNzLCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgU1NMU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IChTU0xTZXJ2ZXJTb2NrZXQpIGZhY3RvcnkuY3JlYXRlU2VydmVyU29ja2V0KHBvcnQsIDEwMCwgaWZBZGRyZXNzKTsKKyAgICAgIHNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7CisgICAgICBzZXJ2ZXJTb2NrZXQuc2V0TmVlZENsaWVudEF1dGgoY2xpZW50QXV0aCk7CisgICAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmNpcGhlclN1aXRlcyAhPSBudWxsKSB7CisgICAgICAgIHNlcnZlclNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKHBhcmFtcy5jaXBoZXJTdWl0ZXMpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBUU2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgc2VydmVyU29ja2V0KHNlcnZlclNvY2tldCkuY2xpZW50VGltZW91dCh0aW1lb3V0KSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYmluZCB0byBwb3J0ICIgKyBwb3J0LCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU29ja2V0IGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuIEFsbAorICAgKiB0aGUgY2xpZW50IG1ldGhvZHMgcmV0dXJuIGEgYm91bmQgY29ubmVjdGlvbi4gU28gdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIG9wZW4oKSBvbiB0aGUKKyAgICogVFRyYW5zcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHBhcmFtIHRpbWVvdXQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnkgPSAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgcmV0dXJuIGNyZWF0ZUNsaWVudChmYWN0b3J5LCBob3N0LCBwb3J0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHJldHVybiBnZXRDbGllbnRTb2NrZXQoaG9zdCwgcG9ydCwgMCk7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgY3VzdG9tIGNvbmZpZ3VyZWQgU1NMIHdyYXBwZWQgVFNvY2tldC4gVGhlIFNTTCBzZXR0aW5ncyBhcmUgb2J0YWluZWQgZnJvbSB0aGUKKyAgICogcGFzc2VkIGluIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzLgorICAgKgorICAgKiBAcGFyYW0gaG9zdAorICAgKiBAcGFyYW0gcG9ydAorICAgKiBAcGFyYW0gdGltZW91dAorICAgKiBAcGFyYW0gcGFyYW1zCisgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU29ja2V0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUU29ja2V0IGdldENsaWVudFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0LCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGFyYW1zID09IG51bGwgfHwgIShwYXJhbXMuaXNLZXlTdG9yZVNldCB8fCBwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVpdGhlciBvbmUgb2YgdGhlIEtleVN0b3JlIG9yIFRydXN0U3RvcmUgbXVzdCBiZSBzZXQgZm9yIFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IGN0eCA9IGNyZWF0ZVNTTENvbnRleHQocGFyYW1zKTsKKyAgICByZXR1cm4gY3JlYXRlQ2xpZW50KGN0eC5nZXRTb2NrZXRGYWN0b3J5KCksIGhvc3QsIHBvcnQsIHRpbWVvdXQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIFNTTENvbnRleHQgY3R4OworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOworICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOworICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gbnVsbDsKKworICAgICAgaWYgKHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKKyAgICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMudHJ1c3RNYW5hZ2VyVHlwZSk7CisgICAgICAgIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0U3RvcmVUeXBlKTsKKyAgICAgICAgaWYgKHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICBpbiA9IHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAgdHMubG9hZChpbiwKKyAgICAgICAgICAgICAgICAocGFyYW1zLnRydXN0UGFzcyAhPSBudWxsID8gcGFyYW1zLnRydXN0UGFzcy50b0NoYXJBcnJheSgpIDogbnVsbCkpOworICAgICAgICB0bWYuaW5pdCh0cyk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJhbXMuaXNLZXlTdG9yZVNldCkgeworICAgICAgICBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMua2V5TWFuYWdlclR5cGUpOworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy5rZXlTdG9yZVR5cGUpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFtcy5pc0tleVN0b3JlU2V0ICYmIHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKKyAgICAgICAgY3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOworICAgICAgfQorICAgICAgZWxzZSBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKKyAgICAgICAgY3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIG51bGwsIG51bGwpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGN0eC5pbml0KG51bGwsIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyB0aGUgdHJhbnNwb3J0IiwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3R4OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U3RvcmVBc1N0cmVhbShTdHJpbmcgc3RvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHN0b3JlKTsKKyAgICB9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgSW5wdXRTdHJlYW0gc3RvcmVTdHJlYW0gPSBudWxsOworICAgIHRyeSB7CisgICAgICBzdG9yZVN0cmVhbSA9IG5ldyBVUkwoc3RvcmUpLm9wZW5TdHJlYW0oKTsKKyAgICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICAgIH0KKyAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgc3RvcmVTdHJlYW0gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oc3RvcmUpOworCisgICAgaWYgKHN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBmaWxlOiAiICsgc3RvcmUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRTb2NrZXQgY3JlYXRlQ2xpZW50KFNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gKFNTTFNvY2tldCkgZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOworICAgICAgcmV0dXJuIG5ldyBUU29ja2V0KHNvY2tldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY29ubmVjdCB0byAiICsgaG9zdCArICIgb24gcG9ydCAiICsgcG9ydCwgZSk7CisgICAgfQorICB9CisKKworICAvKioKKyAgICogQSBDbGFzcyB0byBob2xkIGFsbCB0aGUgU1NMIHBhcmFtZXRlcnMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgeworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2wgPSAiVExTIjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVBhc3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSA9IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlVHlwZSA9ICJKS1MiOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZTsKKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0UGFzczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0TWFuYWdlclR5cGUgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmVUeXBlID0gIkpLUyI7CisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNpcGhlclN1aXRlczsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGllbnRBdXRoID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXlTdG9yZVNldCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVHJ1c3RTdG9yZVNldCA9IGZhbHNlOworCisgICAgcHVibGljIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCkge30KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIHByb3RvY29sIGFuZCBjaXBoZXIgc3VpdGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIHNwZWNpZmljIHByb3RvY29sIChUTFMvU1NMKSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdmVyc2lvbnMKKyAgICAgKiBAcGFyYW0gY2lwaGVyU3VpdGVzCisgICAgICovCisgICAgcHVibGljIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKFN0cmluZyBwcm90b2NvbCwgU3RyaW5nW10gY2lwaGVyU3VpdGVzKSB7CisgICAgICB0aGlzKHByb3RvY29sLCBjaXBoZXJTdWl0ZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIHRoZSBwcm90b2NvbCwgY2lwaGVyIHN1aXRlcyBhbmQgaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICogaXMgcmVxdWlyZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgc3BlY2lmaWMgcHJvdG9jb2wgKFRMUy9TU0wpIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB2ZXJzaW9ucworICAgICAqIEBwYXJhbSBjaXBoZXJTdWl0ZXMKKyAgICAgKiBAcGFyYW0gY2xpZW50QXV0aAorICAgICAqLworICAgIHB1YmxpYyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyhTdHJpbmcgcHJvdG9jb2wsIFN0cmluZ1tdIGNpcGhlclN1aXRlcywgYm9vbGVhbiBjbGllbnRBdXRoKSB7CisgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgICB9CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKKyAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmUgTG9jYXRpb24gb2YgdGhlIEtleXN0b3JlIG9uIGRpc2sKKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShTdHJpbmcga2V5U3RvcmUsIFN0cmluZyBrZXlQYXNzLCBTdHJpbmcga2V5TWFuYWdlclR5cGUsIFN0cmluZyBrZXlTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMua2V5U3RvcmUgPSBrZXlTdG9yZTsKKyAgICAgIHRoaXMua2V5UGFzcyA9IGtleVBhc3M7CisgICAgICBpZiAoa2V5TWFuYWdlclR5cGUgIT0gbnVsbCkgeworICAgICAgICB0aGlzLmtleU1hbmFnZXJUeXBlID0ga2V5TWFuYWdlclR5cGU7CisgICAgICB9CisgICAgICBpZiAoa2V5U3RvcmVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5rZXlTdG9yZVR5cGUgPSBrZXlTdG9yZVR5cGU7CisgICAgICB9CisgICAgICBpc0tleVN0b3JlU2V0ID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZSBMb2NhdGlvbiBvZiB0aGUgS2V5c3RvcmUgb24gZGlzaworICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGtleXN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlU3RyZWFtIEtleXN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGtleVBhc3MgS2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MpIHsKKyAgICAgIHNldEtleVN0b3JlKGtleVN0b3JlU3RyZWFtLCBrZXlQYXNzLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlLCBwYXNzd29yZCwgY2VydGlmaWNhdGUgdHlwZSBhbmQgdGhlIHN0b3JlIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlIExvY2F0aW9uIG9mIHRoZSBUcnVzdHN0b3JlIG9uIGRpc2sKKyAgICAgKiBAcGFyYW0gdHJ1c3RQYXNzIFRydXN0c3RvcmUgcGFzc3dvcmQKKyAgICAgKiBAcGFyYW0gdHJ1c3RNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIHRydXN0U3RvcmVUeXBlIFRoZSBkZWZhdWx0IGlzIEpLUworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZSA9IHRydXN0U3RvcmU7CisgICAgICB0aGlzLnRydXN0UGFzcyA9IHRydXN0UGFzczsKKyAgICAgIGlmICh0cnVzdE1hbmFnZXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy50cnVzdE1hbmFnZXJUeXBlID0gdHJ1c3RNYW5hZ2VyVHlwZTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVzdFN0b3JlVHlwZSAhPSBudWxsKSB7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZVR5cGUgPSB0cnVzdFN0b3JlVHlwZTsKKyAgICAgIH0KKyAgICAgIGlzVHJ1c3RTdG9yZVNldCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICogQHBhcmFtIHRydXN0TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW0sIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZVN0cmVhbSA9IHRydXN0U3RvcmVTdHJlYW07CisgICAgICBzZXRUcnVzdFN0b3JlKCIiLCB0cnVzdFBhc3MsIHRydXN0TWFuYWdlclR5cGUsIHRydXN0U3RvcmVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZSBMb2NhdGlvbiBvZiB0aGUgVHJ1c3RzdG9yZSBvbiBkaXNrCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShTdHJpbmcgdHJ1c3RTdG9yZSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzKSB7CisgICAgICBzZXRUcnVzdFN0b3JlKHRydXN0U3RvcmVTdHJlYW0sIHRydXN0UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZAorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudEF1dGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xpZW50QXV0aChib29sZWFuIGNsaWVudEF1dGgpIHsKKyAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxY2EwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIFdyYXBzIGFub3RoZXIgVGhyaWZ0IDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+LCBidXQgcGVyZm9ybXMgU0FTTCBjbGllbnQKKyAqIG5lZ290aWF0aW9uIG9uIHRoZSBjYWxsIHRvIDxjb2RlPm9wZW4oKTwvY29kZT4uIFRoaXMgY2xhc3Mgd2lsbCB3cmFwIGVuc3VpbmcKKyAqIGNvbW11bmljYXRpb24gb3ZlciBpdCwgaWYgYSBTQVNMIFFPUCBpcyBuZWdvdGlhdGVkIHdpdGggdGhlIG90aGVyIHBhcnR5LgorICovCitwdWJsaWMgY2xhc3MgVFNhc2xDbGllbnRUcmFuc3BvcnQgZXh0ZW5kcyBUU2FzbFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRTYXNsQ2xpZW50VHJhbnNwb3J0LmNsYXNzKTsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIG1lY2hhbmlzbSB0aGlzIGNsaWVudCBzdXBwb3J0cy4KKyAgICovCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lY2hhbmlzbTsKKworICAvKioKKyAgICogVXNlcyB0aGUgZ2l2ZW4gPGNvZGU+U2FzbENsaWVudDwvY29kZT4uCisgICAqIAorICAgKiBAcGFyYW0gc2FzbENsaWVudAorICAgKiAgICAgICAgICBUaGUgPGNvZGU+U2FzbENsaWVudDwvY29kZT4gdG8gdXNlIGZvciB0aGUgc3Vic2VxdWVudCBTQVNMCisgICAqICAgICAgICAgIG5lZ290aWF0aW9uLgorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRyYW5zcG9ydCB1bmRlcmx5aW5nIHRoaXMgb25lLgorICAgKi8KKyAgcHVibGljIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFNhc2xDbGllbnQgc2FzbENsaWVudCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcihzYXNsQ2xpZW50LCB0cmFuc3BvcnQpOworICAgIG1lY2hhbmlzbSA9IHNhc2xDbGllbnQuZ2V0TWVjaGFuaXNtTmFtZSgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiB1c2luZyB0aGUgZ2l2ZW4gU0FTTC1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgKiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsQ2xpZW50PC9jb2RlPiBmb3IgdGhlCisgICAqIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRoZSB1bmRlcmx5aW5nIFRocmlmdCB0cmFuc3BvcnQuCisgICAqIEB0aHJvd3MgU2FzbEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFN0cmluZyBtZWNoYW5pc20sIFN0cmluZyBhdXRob3JpemF0aW9uSWQsIFN0cmluZyBwcm90b2NvbCwKKyAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoLCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKKyAgICBzdXBlcihTYXNsLmNyZWF0ZVNhc2xDbGllbnQobmV3IFN0cmluZ1tdIHsgbWVjaGFuaXNtIH0sIGF1dGhvcml6YXRpb25JZCwgcHJvdG9jb2wsIHNlcnZlck5hbWUsCisgICAgICAgIHByb3BzLCBjYmgpLCB0cmFuc3BvcnQpOworICAgIHRoaXMubWVjaGFuaXNtID0gbWVjaGFuaXNtOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNhc2xSb2xlIGdldFJvbGUoKSB7CisgICAgcmV0dXJuIFNhc2xSb2xlLkNMSUVOVDsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgVGhyaWZ0IFNBU0wKKyAgICogcHJvdG9jb2wuIEdlbmVyYXRlcyBhbmQgc2VuZHMgdGhlIGluaXRpYWwgcmVzcG9uc2UgdG8gdGhlIHNlcnZlciwgaW5jbHVkaW5nCisgICAqIHdoaWNoIG1lY2hhbmlzbSB0aGlzIGNsaWVudCB3YW50cyB0byB1c2UuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2FzbFN0YXJ0TWVzc2FnZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBTYXNsRXhjZXB0aW9uIHsKKyAgICBTYXNsQ2xpZW50IHNhc2xDbGllbnQgPSBnZXRTYXNsQ2xpZW50KCk7CisKKyAgICBieXRlW10gaW5pdGlhbFJlc3BvbnNlID0gbmV3IGJ5dGVbMF07CisgICAgaWYgKHNhc2xDbGllbnQuaGFzSW5pdGlhbFJlc3BvbnNlKCkpCisgICAgICBpbml0aWFsUmVzcG9uc2UgPSBzYXNsQ2xpZW50LmV2YWx1YXRlQ2hhbGxlbmdlKGluaXRpYWxSZXNwb25zZSk7CisKKyAgICBMT0dHRVIuZGVidWcoIlNlbmRpbmcgbWVjaGFuaXNtIG5hbWUge30gYW5kIGluaXRpYWwgcmVzcG9uc2Ugb2YgbGVuZ3RoIHt9IiwgbWVjaGFuaXNtLAorICAgICAgICBpbml0aWFsUmVzcG9uc2UubGVuZ3RoKTsKKworICAgIGJ5dGVbXSBtZWNoYW5pc21CeXRlcyA9IG1lY2hhbmlzbS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICBzZW5kU2FzbE1lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuU1RBUlQsCisgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbUJ5dGVzKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgcmVzcG9uc2UKKyAgICBzZW5kU2FzbE1lc3NhZ2Uoc2FzbENsaWVudC5pc0NvbXBsZXRlKCkgPyBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSA6IE5lZ290aWF0aW9uU3RhdHVzLk9LLAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzcG9uc2UpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjgxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBXcmFwcyBhbm90aGVyIFRocmlmdCA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiwgYnV0IHBlcmZvcm1zIFNBU0wgc2VydmVyCisgKiBuZWdvdGlhdGlvbiBvbiB0aGUgY2FsbCB0byA8Y29kZT5vcGVuKCk8L2NvZGU+LiBUaGlzIGNsYXNzIHdpbGwgd3JhcCBlbnN1aW5nCisgKiBjb21tdW5pY2F0aW9uIG92ZXIgaXQsIGlmIGEgU0FTTCBRT1AgaXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBvdGhlciBwYXJ0eS4KKyAqLworcHVibGljIGNsYXNzIFRTYXNsU2VydmVyVHJhbnNwb3J0IGV4dGVuZHMgVFNhc2xUcmFuc3BvcnQgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUU2FzbFNlcnZlclRyYW5zcG9ydC5jbGFzcyk7CisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBTQVNMIG1lY2hhbmlzbSBuYW1lIC0+IGFsbCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCB0bworICAgKiBpbnN0YW50aWF0ZSBhIFNBU0wgc2VydmVyLgorICAgKi8KKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRTYXNsU2VydmVyRGVmaW5pdGlvbj4oKTsKKworICAvKioKKyAgICogQ29udGFpbnMgYWxsIHRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gZGVmaW5lIGEgU0FTTCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUU2FzbFNlcnZlckRlZmluaXRpb24geworICAgIHB1YmxpYyBTdHJpbmcgbWVjaGFuaXNtOworICAgIHB1YmxpYyBTdHJpbmcgcHJvdG9jb2w7CisgICAgcHVibGljIFN0cmluZyBzZXJ2ZXJOYW1lOworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzOworICAgIHB1YmxpYyBDYWxsYmFja0hhbmRsZXIgY2JoOworCisgICAgcHVibGljIFRTYXNsU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICB0aGlzLm1lY2hhbmlzbSA9IG1lY2hhbmlzbTsKKyAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgIHRoaXMuc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7CisgICAgICB0aGlzLnByb3BzID0gcHJvcHM7CisgICAgICB0aGlzLmNiaCA9IGNiaDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlcyB0aGUgZ2l2ZW4gdW5kZXJseWluZyB0cmFuc3BvcnQuIEFzc3VtZXMgdGhhdCBhZGRTZXJ2ZXJEZWZpbml0aW9uIGlzCisgICAqIGNhbGxlZCBsYXRlci4KKyAgICogCisgICAqIEBwYXJhbSB0cmFuc3BvcnQKKyAgICogICAgICAgICAgVHJhbnNwb3J0IHVuZGVybHlpbmcgdGhpcyBvbmUuCisgICAqLworICBwdWJsaWMgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiB1c2luZyB0aGUgZ2l2ZW4gU0FTTC1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgKiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPiBmb3IgdGhlCisgICAqIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRoZSB1bmRlcmx5aW5nIFRocmlmdCB0cmFuc3BvcnQuCisgICAqLworICBwdWJsaWMgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQoU3RyaW5nIG1lY2hhbmlzbSwgU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmVyTmFtZSwKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMsIENhbGxiYWNrSGFuZGxlciBjYmgsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICBhZGRTZXJ2ZXJEZWZpbml0aW9uKG1lY2hhbmlzbSwgcHJvdG9jb2wsIHNlcnZlck5hbWUsIHByb3BzLCBjYmgpOworICB9CisKKyAgcHJpdmF0ZSBUU2FzbFNlcnZlclRyYW5zcG9ydChNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICB0aGlzLnNlcnZlckRlZmluaXRpb25NYXAucHV0QWxsKHNlcnZlckRlZmluaXRpb25NYXApOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhIHN1cHBvcnRlZCBzZXJ2ZXIgZGVmaW5pdGlvbiB0byB0aGlzIHRyYW5zcG9ydC4gU2VlIHRoZSBKYXZhCisgICAqIGRvY3VtZW50YXRpb24gZm9yIDxjb2RlPlNhc2wuY3JlYXRlU2FzbFNlcnZlcjwvY29kZT4gZm9yIHRoZSBkZXRhaWxzIG9mIHRoZQorICAgKiBwYXJhbWV0ZXJzLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcywgQ2FsbGJhY2tIYW5kbGVyIGNiaCkgeworICAgIHNlcnZlckRlZmluaXRpb25NYXAucHV0KG1lY2hhbmlzbSwgbmV3IFRTYXNsU2VydmVyRGVmaW5pdGlvbihtZWNoYW5pc20sIHByb3RvY29sLCBzZXJ2ZXJOYW1lLAorICAgICAgICBwcm9wcywgY2JoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNhc2xSb2xlIGdldFJvbGUoKSB7CisgICAgcmV0dXJuIFNhc2xSb2xlLlNFUlZFUjsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgVGhyaWZ0IFNBU0wgcHJvdG9jb2wuCisgICAqIFJlY2VpdmVzIHRoZSBpbml0aWFsIHJlc3BvbnNlIGZyb20gdGhlIGNsaWVudCwgY3JlYXRlcyBhIFNBU0wgc2VydmVyIHVzaW5nCisgICAqIHRoZSBtZWNoYW5pc20gcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgKGlmIHRoaXMgc2VydmVyIHN1cHBvcnRzIGl0KSwgYW5kCisgICAqIHNlbmRzIHRoZSBmaXJzdCBjaGFsbGVuZ2UgYmFjayB0byB0aGUgY2xpZW50LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgU2FzbEV4Y2VwdGlvbiB7CisgICAgU2FzbFJlc3BvbnNlIG1lc3NhZ2UgPSByZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKworICAgIExPR0dFUi5kZWJ1ZygiUmVjZWl2ZWQgc3RhcnQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSIsIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICBpZiAobWVzc2FnZS5zdGF0dXMgIT0gTmVnb3RpYXRpb25TdGF0dXMuU1RBUlQpIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJFeHBlY3RpbmcgU1RBUlQgc3RhdHVzLCByZWNlaXZlZCAiICsgbWVzc2FnZS5zdGF0dXMpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgbWVjaGFuaXNtIG5hbWUuCisgICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgVFNhc2xTZXJ2ZXJEZWZpbml0aW9uIHNlcnZlckRlZmluaXRpb24gPSBzZXJ2ZXJEZWZpbml0aW9uTWFwLmdldChtZWNoYW5pc21OYW1lKTsKKyAgICBMT0dHRVIuZGVidWcoIlJlY2VpdmVkIG1lY2hhbmlzbSBuYW1lICd7fSciLCBtZWNoYW5pc21OYW1lKTsKKworICAgIGlmIChzZXJ2ZXJEZWZpbml0aW9uID09IG51bGwpIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuQkFELCAiVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgIiArIG1lY2hhbmlzbU5hbWUpOworICAgIH0KKyAgICBTYXNsU2VydmVyIHNhc2xTZXJ2ZXIgPSBTYXNsLmNyZWF0ZVNhc2xTZXJ2ZXIoc2VydmVyRGVmaW5pdGlvbi5tZWNoYW5pc20sCisgICAgICAgIHNlcnZlckRlZmluaXRpb24ucHJvdG9jb2wsIHNlcnZlckRlZmluaXRpb24uc2VydmVyTmFtZSwgc2VydmVyRGVmaW5pdGlvbi5wcm9wcywKKyAgICAgICAgc2VydmVyRGVmaW5pdGlvbi5jYmgpOworICAgIHNldFNhc2xTZXJ2ZXIoc2FzbFNlcnZlcik7CisgIH0KKworICAvKioKKyAgICogPGNvZGU+VFRyYW5zcG9ydEZhY3Rvcnk8L2NvZGU+IHRvIGNyZWF0ZQorICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydHM8L2NvZGU+LiBFbnN1cmVzIHRoYXQgYSBnaXZlbgorICAgKiB1bmRlcmx5aW5nIDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IGluc3RhbmNlIHJlY2VpdmVzIHRoZSBzYW1lCisgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPi4gVGhpcyBpcyBraW5kIG9mIGFuIGF3ZnVsIGhhY2sgdG8gd29yaworICAgKiBhcm91bmQgdGhlIGZhY3QgdGhhdCBUaHJpZnQgaXMgZGVzaWduZWQgYXNzdW1pbmcgdGhhdAorICAgKiA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZXMgYXJlIHN0YXRlbGVzcywgYW5kIHRodXMgdGhlIGV4aXN0aW5nCisgICAqIDxjb2RlPlRTZXJ2ZXJzPC9jb2RlPiB1c2UgZGlmZmVyZW50IDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IGluc3RhbmNlcyBmb3IKKyAgICogaW5wdXQgYW5kIG91dHB1dC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhd2Z1bCBoYWNrIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgKiA8Y29kZT5XZWFrSGFzaE1hcDwvY29kZT4gaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBsZWFrIG1lbW9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8VFRyYW5zcG9ydCwgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4+IHRyYW5zcG9ydE1hcCA9CisgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IFdlYWtIYXNoTWFwPFRUcmFuc3BvcnQsIFdlYWtSZWZlcmVuY2U8VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ+PigpKTsKKworICAgIC8qKgorICAgICAqIE1hcHBpbmcgZnJvbSBTQVNMIG1lY2hhbmlzbSBuYW1lIC0+IGFsbCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCB0bworICAgICAqIGluc3RhbnRpYXRlIGEgU0FTTCBzZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRTYXNsU2VydmVyRGVmaW5pdGlvbj4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBGYWN0b3J5LiBBc3N1bWVzIHRoYXQgPGNvZGU+YWRkU2VydmVyRGVmaW5pdGlvbjwvY29kZT4gd2lsbAorICAgICAqIGJlIGNhbGxlZCBsYXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkZhY3Rvcnk8L2NvZGU+LCBpbml0aWFsbHkgd2l0aCB0aGUgc2luZ2xlIHNlcnZlcgorICAgICAqIGRlZmluaXRpb24gZ2l2ZW4uIFlvdSBtYXkgc3RpbGwgY2FsbCA8Y29kZT5hZGRTZXJ2ZXJEZWZpbml0aW9uPC9jb2RlPgorICAgICAqIGxhdGVyLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPgorICAgICAqIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjdG9yeShTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICBzdXBlcigpOworICAgICAgYWRkU2VydmVyRGVmaW5pdGlvbihtZWNoYW5pc20sIHByb3RvY29sLCBzZXJ2ZXJOYW1lLCBwcm9wcywgY2JoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdXBwb3J0ZWQgc2VydmVyIGRlZmluaXRpb24gdG8gdGhlIHRyYW5zcG9ydHMgY3JlYXRlZCBieSB0aGlzCisgICAgICogZmFjdG9yeS4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yCisgICAgICogPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPiBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICBzZXJ2ZXJEZWZpbml0aW9uTWFwLnB1dChtZWNoYW5pc20sIG5ldyBUU2FzbFNlcnZlckRlZmluaXRpb24obWVjaGFuaXNtLCBwcm90b2NvbCwgc2VydmVyTmFtZSwKKyAgICAgICAgICBwcm9wcywgY2JoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZSwgb3IgcmV1c2UgdGhlCisgICAgICogZXhpc3Rpbmcgb25lIGlmIGEgPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiBjcmVhdGVkIGJlZm9yZSB1c2luZyB0aGUgZ2l2ZW4gPGNvZGU+VFRyYW5zcG9ydDwvY29kZT4gYXMgYW4gdW5kZXJseWluZworICAgICAqIHRyYW5zcG9ydC4gVGhpcyBlbnN1cmVzIHRoYXQgYSBnaXZlbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpbnN0YW5jZQorICAgICAqIHJlY2VpdmVzIHRoZSBzYW1lIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCBiYXNlKSB7CisgICAgICBXZWFrUmVmZXJlbmNlPFRTYXNsU2VydmVyVHJhbnNwb3J0PiByZXQgPSB0cmFuc3BvcnRNYXAuZ2V0KGJhc2UpOworICAgICAgaWYgKHJldCA9PSBudWxsIHx8IHJldC5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgIExPR0dFUi5kZWJ1ZygidHJhbnNwb3J0IG1hcCBkb2VzIG5vdCBjb250YWluIGtleSIsIGJhc2UpOworICAgICAgICByZXQgPSBuZXcgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4obmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXQuZ2V0KCkub3BlbigpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoImZhaWxlZCB0byBvcGVuIHNlcnZlciB0cmFuc3BvcnQiLCBlKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICB0cmFuc3BvcnRNYXAucHV0KGJhc2UsIHJldCk7IC8vIE5vIG5lZWQgZm9yIHB1dElmQWJzZW50KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uY3VycmVudCBjYWxscyB0byBnZXRUcmFuc3BvcnQoKSB3aWxsIHBhc3MgaW4gZGlmZmVyZW50IFRUcmFuc3BvcnRzLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HR0VSLmRlYnVnKCJ0cmFuc3BvcnQgbWFwIGRvZXMgY29udGFpbiBrZXkge30iLCBiYXNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQuZ2V0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkM2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5CisgKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZC4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFNhc2xUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNhc2xUcmFuc3BvcnQuY2xhc3MpOworCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDB4N0ZGRkZGRkY7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVDSEFOSVNNX05BTUVfQllURVMgPSAxOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQllURVMgPSAxOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQQVlMT0FEX0xFTkdUSF9CWVRFUyA9IDQ7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBlbnVtIFNhc2xSb2xlIHsKKyAgICBTRVJWRVIsIENMSUVOVDsKKyAgfQorCisgIC8qKgorICAgKiBTdGF0dXMgYnl0ZXMgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgVGhyaWZ0IFNBU0wgaGFuZHNoYWtlLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBlbnVtIE5lZ290aWF0aW9uU3RhdHVzIHsKKyAgICBTVEFSVCgoYnl0ZSkweDAxKSwKKyAgICBPSygoYnl0ZSkweDAyKSwKKyAgICBCQUQoKGJ5dGUpMHgwMyksCisgICAgRVJST1IoKGJ5dGUpMHgwNCksCisgICAgQ09NUExFVEUoKGJ5dGUpMHgwNSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGUgdmFsdWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Qnl0ZSwgTmVnb3RpYXRpb25TdGF0dXM+IHJldmVyc2VNYXAgPQorICAgICAgbmV3IEhhc2hNYXA8Qnl0ZSwgTmVnb3RpYXRpb25TdGF0dXM+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoTmVnb3RpYXRpb25TdGF0dXMgcyA6IE5lZ290aWF0aW9uU3RhdHVzLmNsYXNzLmdldEVudW1Db25zdGFudHMoKSkgeworICAgICAgICByZXZlcnNlTWFwLnB1dChzLmdldFZhbHVlKCksIHMpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTmVnb3RpYXRpb25TdGF0dXMoYnl0ZSB2YWwpIHsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOZWdvdGlhdGlvblN0YXR1cyBieVZhbHVlKGJ5dGUgdmFsKSB7CisgICAgICByZXR1cm4gcmV2ZXJzZU1hcC5nZXQodmFsKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJhbnNwb3J0IHVuZGVybHlpbmcgdGhpcyBvbmUuCisgICAqLworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0OworCisgIC8qKgorICAgKiBFaXRoZXIgYSBTQVNMIGNsaWVudCBvciBhIFNBU0wgc2VydmVyLgorICAgKi8KKyAgcHJpdmF0ZSBTYXNsUGFydGljaXBhbnQgc2FzbDsKKworICAvKioKKyAgICogV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHdyYXAvdW53cmFwIHJlYWRzL3dyaXRlcy4gRGV0ZXJtaW5lZCBieSB3aGV0aGVyIG9yCisgICAqIG5vdCBhIFFPUCBpcyBuZWdvdGlhdGVkIGR1cmluZyB0aGUgU0FTTCBoYW5kc2hha2UuCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV3JhcCA9IGZhbHNlOworCisgIC8qKgorICAgKiBCdWZmZXIgZm9yIGlucHV0LgorICAgKi8KKyAgcHJpdmF0ZSBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlciA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQoKTsKKworICAvKioKKyAgICogQnVmZmVyIGZvciBvdXRwdXQuCisgICAqLworICBwcml2YXRlIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKKworICAvKioKKyAgICogQ3JlYXRlIGEgVFNhc2xUcmFuc3BvcnQuIEl0J3MgYXNzdW1lZCB0aGF0IHNldFNhc2xTZXJ2ZXIgd2lsbCBiZSBjYWxsZWQKKyAgICogbGF0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgU0FTTCBlbmRwb2ludCB1bmRlcmx5aW5nIHRoaXMgdHJhbnNwb3J0LgorICAgKgorICAgKiBAcGFyYW0gdW5kZXJseWluZ1RyYW5zcG9ydAorICAgKiAgICAgICAgICBUaGUgdGhyaWZ0IHRyYW5zcG9ydCB3aGljaCB0aGlzIHRyYW5zcG9ydCBpcyB3cmFwcGluZy4KKyAgICovCisgIHByb3RlY3RlZCBUU2FzbFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHsKKyAgICB0aGlzLnVuZGVybHlpbmdUcmFuc3BvcnQgPSB1bmRlcmx5aW5nVHJhbnNwb3J0OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRTYXNsVHJhbnNwb3J0IHdoaWNoIGFjdHMgYXMgYSBjbGllbnQuCisgICAqCisgICAqIEBwYXJhbSBzYXNsQ2xpZW50CisgICAqICAgICAgICAgIFRoZSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiB3aGljaCB0aGlzIHRyYW5zcG9ydCB3aWxsIHVzZSBmb3IgU0FTTAorICAgKiAgICAgICAgICBuZWdvdGlhdGlvbi4KKyAgICogQHBhcmFtIHVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICogICAgICAgICAgVGhlIHRocmlmdCB0cmFuc3BvcnQgd2hpY2ggdGhpcyB0cmFuc3BvcnQgaXMgd3JhcHBpbmcuCisgICAqLworICBwcm90ZWN0ZWQgVFNhc2xUcmFuc3BvcnQoU2FzbENsaWVudCBzYXNsQ2xpZW50LCBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHsKKyAgICBzYXNsID0gbmV3IFNhc2xQYXJ0aWNpcGFudChzYXNsQ2xpZW50KTsKKyAgICB0aGlzLnVuZGVybHlpbmdUcmFuc3BvcnQgPSB1bmRlcmx5aW5nVHJhbnNwb3J0OworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0U2FzbFNlcnZlcihTYXNsU2VydmVyIHNhc2xTZXJ2ZXIpIHsKKyAgICBzYXNsID0gbmV3IFNhc2xQYXJ0aWNpcGFudChzYXNsU2VydmVyKTsKKyAgfQorCisgIC8vIFVzZWQgdG8gcmVhZCB0aGUgc3RhdHVzIGJ5dGUgYW5kIHBheWxvYWQgbGVuZ3RoLgorICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtZXNzYWdlSGVhZGVyID0gbmV3IGJ5dGVbU1RBVFVTX0JZVEVTICsgUEFZTE9BRF9MRU5HVEhfQllURVNdOworCisgIC8qKgorICAgKiBTZW5kIGEgY29tcGxldGUgVGhyaWZ0IFNBU0wgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIHN0YXR1cworICAgKiAgICAgICAgICBUaGUgc3RhdHVzIHRvIHNlbmQuCisgICAqIEBwYXJhbSBwYXlsb2FkCisgICAqICAgICAgICAgIFRoZSBkYXRhIHRvIHNlbmQgYXMgdGhlIHBheWxvYWQgb2YgdGhpcyBtZXNzYWdlLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHNlbmRTYXNsTWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIGJ5dGVbXSBwYXlsb2FkKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHBheWxvYWQgPT0gbnVsbCkKKyAgICAgIHBheWxvYWQgPSBuZXcgYnl0ZVswXTsKKworICAgIG1lc3NhZ2VIZWFkZXJbMF0gPSBzdGF0dXMuZ2V0VmFsdWUoKTsKKyAgICBFbmNvZGluZ1V0aWxzLmVuY29kZUJpZ0VuZGlhbihwYXlsb2FkLmxlbmd0aCwgbWVzc2FnZUhlYWRlciwgU1RBVFVTX0JZVEVTKTsKKworICAgIExPR0dFUi5kZWJ1Zygie306IFdyaXRpbmcgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAorICAgICAgICBnZXRSb2xlKCksIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworCisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShtZXNzYWdlSGVhZGVyKTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKHBheWxvYWQpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgY29tcGxldGUgVGhyaWZ0IFNBU0wgbWVzc2FnZS4KKyAgICoKKyAgICogQHJldHVybiBUaGUgU0FTTCBzdGF0dXMgYW5kIHBheWxvYWQgZnJvbSB0aGlzIG1lc3NhZ2UuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKKyAgICogICAgICAgICAgIHRyYW5zcG9ydCwgb3IgaWYgYSBzdGF0dXMgY29kZSBvZiBCQUQgb3IgRVJST1IgaXMgZW5jb3VudGVyZWQuCisgICAqLworICBwcm90ZWN0ZWQgU2FzbFJlc3BvbnNlIHJlY2VpdmVTYXNsTWVzc2FnZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwobWVzc2FnZUhlYWRlciwgMCwgbWVzc2FnZUhlYWRlci5sZW5ndGgpOworCisgICAgYnl0ZSBzdGF0dXNCeXRlID0gbWVzc2FnZUhlYWRlclswXTsKKworICAgIE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cyA9IE5lZ290aWF0aW9uU3RhdHVzLmJ5VmFsdWUoc3RhdHVzQnl0ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBzdGF0dXMgIiArIHN0YXR1c0J5dGUpOworICAgIH0KKworICAgIGludCBwYXlsb2FkQnl0ZXMgPSBFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOworICAgIGlmIChwYXlsb2FkQnl0ZXMgPCAwIHx8IHBheWxvYWRCeXRlcyA+IDEwNDg1NzYwMCAvKiAxMDAgTUIgKi8pIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoCisgICAgICAgIE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6ICIgKyBwYXlsb2FkQnl0ZXMpOworICAgIH0KKworICAgIGJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbcGF5bG9hZEJ5dGVzXTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOworCisgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKKyAgfQorCisgIC8qKgorICAgKiBTZW5kIGEgVGhyaWZ0IFNBU0wgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgKHVzdWFsbHkgQkFEIG9yIEVSUk9SKSBhbmQKKyAgICogc3RyaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbgorICAgKiBtZXNzYWdlLgorICAgKgorICAgKiBAcGFyYW0gc3RhdHVzCisgICAqICAgICAgICAgIFRoZSBUaHJpZnQgU0FTTCBzdGF0dXMgY29kZSB0byBzZW5kLiBVc3VhbGx5IEJBRCBvciBFUlJPUi4KKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgVGhlIG9wdGlvbmFsIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgb3RoZXIgc2lkZS4KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqICAgICAgICAgICBBbHdheXMgdGhyb3duIHdpdGggdGhlIG1lc3NhZ2UgcHJvdmlkZWQuCisgICAqIEByZXR1cm4gYWx3YXlzIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBkZWNsYXJlcyByZXR1cm4gdHlwZSB0byBhbGxvdworICAgKiAgICAgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKC4uLikgdG8gaW5mb3JtIGNvbXBpbGVyIGNvbnRyb2wgZmxvdworICAgKi8KKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnRFeGNlcHRpb24gc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IHNlbmQgZmFpbHVyZSByZXNwb25zZSIsIGUpOworICAgICAgbWVzc2FnZSArPSAiXG5BbHNvLCBjb3VsZCBub3Qgc2VuZCByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24obWVzc2FnZSk7CisgIH0KKworICAvKioKKyAgICogSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzdGFydCB0aGUgVGhyaWZ0IFNBU0wgaGFuZHNoYWtlIHByb2Nlc3MuIFdoZW4KKyAgICogdGhpcyBtZXRob2QgY29tcGxldGVzLCB0aGUgPGNvZGU+U2FzbFBhcnRpY2lwYW50PC9jb2RlPiBpbiB0aGlzIGNsYXNzIGlzCisgICAqIGFzc3VtZWQgdG8gYmUgaW5pdGlhbGl6ZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KKyAgICovCisgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgU2FzbEV4Y2VwdGlvbjsKKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2FzbFJvbGUgZ2V0Um9sZSgpOworCisgIC8qKgorICAgKiBPcGVucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgaXQncyBub3QgYWxyZWFkeSBvcGVuIGFuZCB0aGVuIHBlcmZvcm1zCisgICAqIFNBU0wgbmVnb3RpYXRpb24uIElmIGEgUU9QIGlzIG5lZ290aWF0ZWQgZHVyaW5nIHRoaXMgU0FTTCBoYW5kc2hha2UsIGl0IHVzZWQKKyAgICogZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9uIHRoaXMgdHJhbnNwb3J0IGFmdGVyIHRoaXMgY2FsbCBpcyBjb21wbGV0ZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIC8qCisgICAgICogcmVhZFNhc2xIZWFkZXIgaXMgdXNlZCB0byB0YWcgd2hldGhlciB0aGUgU0FTTCBoZWFkZXIgaGFzIGJlZW4gcmVhZCBwcm9wZXJseS4KKyAgICAgKiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gcmVhZGluZyB0aGUgaGVhZGVyLCB0aGVyZSBtaWdodCBub3QgYmUgYW55CisgICAgICogZGF0YSBpbiB0aGUgc3RyZWFtLCBwb3NzaWJseSBhIFRDUCBoZWFsdGggY2hlY2sgZnJvbSBsb2FkIGJhbGFuY2VyLgorICAgICAqLworICAgIGJvb2xlYW4gcmVhZFNhc2xIZWFkZXIgPSBmYWxzZTsKKworICAgIExPR0dFUi5kZWJ1Zygib3BlbmluZyB0cmFuc3BvcnQge30iLCB0aGlzKTsKKyAgICBpZiAoc2FzbCAhPSBudWxsICYmIHNhc2wuaXNDb21wbGV0ZSgpKQorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNBU0wgdHJhbnNwb3J0IGFscmVhZHkgb3BlbiIpOworCisgICAgaWYgKCF1bmRlcmx5aW5nVHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5vcGVuKCk7CisKKyAgICB0cnkgeworICAgICAgLy8gTmVnb3RpYXRlIGEgU0FTTCBtZWNoYW5pc20uIFRoZSBjbGllbnQgYWxzbyBzZW5kcyBpdHMKKyAgICAgIC8vIGluaXRpYWwgcmVzcG9uc2UsIG9yIGFuIGVtcHR5IG9uZS4KKyAgICAgIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKTsKKyAgICAgIHJlYWRTYXNsSGVhZGVyID0gdHJ1ZTsKKyAgICAgIExPR0dFUi5kZWJ1Zygie306IFN0YXJ0IG1lc3NhZ2UgaGFuZGxlZCIsIGdldFJvbGUoKSk7CisKKyAgICAgIFNhc2xSZXNwb25zZSBtZXNzYWdlID0gbnVsbDsKKyAgICAgIHdoaWxlICghc2FzbC5pc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgbWVzc2FnZSA9IHJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgIT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKKyAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHVzICE9IE5lZ290aWF0aW9uU3RhdHVzLk9LKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkV4cGVjdGVkIENPTVBMRVRFIG9yIE9LLCBnb3QgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBjaGFsbGVuZ2UgPSBzYXNsLmV2YWx1YXRlQ2hhbGxlbmdlT3JSZXNwb25zZShtZXNzYWdlLnBheWxvYWQpOworCisgICAgICAgIC8vIElmIHdlIGFyZSB0aGUgY2xpZW50LCBhbmQgdGhlIHNlcnZlciBpbmRpY2F0ZXMgQ09NUExFVEUsIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gc2VuZCBiYWNrIGFueSBmdXJ0aGVyIHJlc3BvbnNlLgorICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKKyAgICAgICAgICAgIGdldFJvbGUoKSA9PSBTYXNsUm9sZS5DTElFTlQpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoInt9OiBBbGwgZG9uZSEiLCBnZXRSb2xlKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2VuZFNhc2xNZXNzYWdlKHNhc2wuaXNDb21wbGV0ZSgpID8gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgOiBOZWdvdGlhdGlvblN0YXR1cy5PSywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZSk7CisgICAgICB9CisgICAgICBMT0dHRVIuZGVidWcoInt9OiBNYWluIG5lZ290aWF0aW9uIGxvb3AgY29tcGxldGUiLCBnZXRSb2xlKCkpOworCisgICAgICAvLyBJZiB3ZSdyZSB0aGUgY2xpZW50LCBhbmQgd2UncmUgY29tcGxldGUsIGJ1dCB0aGUgc2VydmVyIGlzbid0CisgICAgICAvLyBjb21wbGV0ZSB5ZXQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIHJlc3BvbnNlLiBUaGlzIHdpbGwgb2NjdXIKKyAgICAgIC8vIHdpdGggQU5PTllNT1VTIGF1dGgsIGZvciBleGFtcGxlLCB3aGVyZSB3ZSBzZW5kIGFuIGluaXRpYWwgcmVzcG9uc2UKKyAgICAgIC8vIGFuZCBhcmUgaW1tZWRpYXRlbHkgY29tcGxldGUuCisgICAgICBpZiAoZ2V0Um9sZSgpID09IFNhc2xSb2xlLkNMSUVOVCAmJgorICAgICAgICAgIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuT0spKSB7CisgICAgICAgIExPR0dFUi5kZWJ1Zygie306IFNBU0wgQ2xpZW50IHJlY2VpdmluZyBsYXN0IG1lc3NhZ2UiLCBnZXRSb2xlKCkpOworICAgICAgICBtZXNzYWdlID0gcmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICAgIGlmIChtZXNzYWdlLnN0YXR1cyAhPSBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSkgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgIkV4cGVjdGVkIFNBU0wgQ09NUExFVEUsIGJ1dCBnb3QgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJTQVNMIG5lZ290aWF0aW9uIGZhaWx1cmUiLCBlKTsKKyAgICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5CQUQsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGVyZSBpcyBuby1kYXRhIG9yIG5vLXNhc2wgaGVhZGVyIGluIHRoZSBzdHJlYW0sIHRocm93IGEgZGlmZmVyZW50CisgICAgICAgKiB0eXBlIG9mIGV4Y2VwdGlvbiBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgc2NlbmFyaW8gZGlmZmVyZW50bHkuCisgICAgICAgKi8KKyAgICAgIGlmICghcmVhZFNhc2xIZWFkZXIgJiYgZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIExPR0dFUi5kZWJ1ZygiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgICB0aHJvdyBuZXcgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oIk5vIGRhdGEgb3Igbm8gc2FzbCBkYXRhIGluIHRoZSBzdHJlYW0iKTsKKyAgICAgIH0KKyAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgU3RyaW5nIHFvcCA9IChTdHJpbmcpIHNhc2wuZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFNhc2wuUU9QKTsKKyAgICBpZiAocW9wICE9IG51bGwgJiYgIXFvcC5lcXVhbHNJZ25vcmVDYXNlKCJhdXRoIikpCisgICAgICBzaG91bGRXcmFwID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbENsaWVudDwvY29kZT4uCisgICAqCisgICAqIEByZXR1cm4gVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyYW5zcG9ydAorICAgKiAgICAgICAgIGlzIGJhY2tlZCBieSBhIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIFNhc2xDbGllbnQgZ2V0U2FzbENsaWVudCgpIHsKKyAgICByZXR1cm4gc2FzbC5zYXNsQ2xpZW50OworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdGhhdCBTYXNsIGlzIHVzaW5nLgorICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiB0cmFuc3BvcnQKKyAgICovCisgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeworICAgICByZXR1cm4gdW5kZXJseWluZ1RyYW5zcG9ydDsKKyAgIH0KKworICAvKioKKyAgICogR2V0IHRoZSB1bmRlcmx5aW5nIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgorICAgKgorICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKKyAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBTYXNsU2VydmVyIGdldFNhc2xTZXJ2ZXIoKSB7CisgICAgcmV0dXJuIHNhc2wuc2FzbFNlcnZlcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgNC1ieXRlIHdvcmQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYW5kIGludGVycHJldCBpdCBhcyBhbgorICAgKiBpbnRlZ2VyLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggcHJlZml4IG9mIHRoZSBuZXh0IFNBU0wgbWVzc2FnZSB0byByZWFkLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICogICAgICAgICAgIFRocm93biBpZiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBsZW5CdWYgPSBuZXcgYnl0ZVs0XTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwobGVuQnVmLCAwLCBsZW5CdWYubGVuZ3RoKTsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy5kZWNvZGVCaWdFbmRpYW4obGVuQnVmKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSB0aGUgZ2l2ZW4gaW50ZWdlciBhcyA0IGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGxlbmd0aAorICAgKiAgICAgICAgICBUaGUgbGVuZ3RoIHByZWZpeCBvZiB0aGUgbmV4dCBTQVNMIG1lc3NhZ2UgdG8gd3JpdGUuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHdyaXRpbmcgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBsZW5CdWYgPSBuZXcgYnl0ZVs0XTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGxlbkJ1Zik7CisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShsZW5CdWYpOworICB9CisKKyAgLy8gQmVsb3cgaXMgdGhlIFNBU0wgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGFuZCBkaXNwb3NlcyBvZiB0aGUgU0FTTCBpbXBsZW1lbnRhdGlvbgorICAgKiB1bmRlcmx5aW5nIHRoaXMgdHJhbnNwb3J0LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICB0cnkgeworICAgICAgc2FzbC5kaXNwb3NlKCk7CisgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBOb3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS4KKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgb3BlbiBhbmQgdGhlIFNBU0wgaGFuZHNoYWtlIGlzCisgICAqIGNvbXBsZXRlLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdW5kZXJseWluZ1RyYW5zcG9ydC5pc09wZW4oKSAmJiBzYXNsICE9IG51bGwgJiYgc2FzbC5pc0NvbXBsZXRlKCk7CisgIH0KKworICAvKioKKyAgICogUmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVW53cmFwcyB0aGUgY29udGVudHMgaWYgYSBRT1Agd2FzCisgICAqIG5lZ290aWF0ZWQgZHVyaW5nIHRoZSBTQVNMIGhhbmRzaGFrZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU0FTTCBhdXRoZW50aWNhdGlvbiBub3QgY29tcGxldGUiKTsKKworICAgIGludCBnb3QgPSByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIHJldHVybiBnb3Q7CisgICAgfQorCisgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICB0cnkgeworICAgICAgcmVhZEZyYW1lKCk7CisgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBzaW5nbGUgZnJhbWUgb2YgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdW53cmFwcGluZyBpZgorICAgKiBuZWNlc3NhcnkuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICogQHRocm93cyBTYXNsRXhjZXB0aW9uCisgICAqICAgICAgICAgICBUaHJvd24gaWYgdGhlcmUncyBhbiBlcnJvciB1bndyYXBwaW5nIHRoZSBkYXRhLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBTYXNsRXhjZXB0aW9uIHsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IHJlYWRMZW5ndGgoKTsKKworICAgIGlmIChkYXRhTGVuZ3RoIDwgMCkKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIGRhdGFMZW5ndGggKyAiKSEiKTsKKworICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbZGF0YUxlbmd0aF07CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogcmVhZGluZyBkYXRhIGxlbmd0aDoge30iLCBnZXRSb2xlKCksIGRhdGFMZW5ndGgpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQucmVhZEFsbChidWZmLCAwLCBkYXRhTGVuZ3RoKTsKKyAgICBpZiAoc2hvdWxkV3JhcCkgeworICAgICAgYnVmZiA9IHNhc2wudW53cmFwKGJ1ZmYsIDAsIGJ1ZmYubGVuZ3RoKTsKKyAgICAgIExPR0dFUi5kZWJ1ZygiZGF0YSBsZW5ndGggYWZ0ZXIgdW53cmFwOiB7fSIsIGJ1ZmYubGVuZ3RoKTsKKyAgICB9CisgICAgcmVhZEJ1ZmZlci5yZXNldChidWZmKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU0FTTCBhdXRoZW50aWNhdGlvbiBub3QgY29tcGxldGUiKTsKKworICAgIHdyaXRlQnVmZmVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIEZsdXNoZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBXcmFwcyB0aGUgY29udGVudHMgaWYgYSBRT1Agd2FzCisgICAqIG5lZ290aWF0ZWQgZHVyaW5nIHRoZSBTQVNMIGhhbmRzaGFrZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuZ2V0KCk7CisgICAgaW50IGRhdGFMZW5ndGggPSB3cml0ZUJ1ZmZlci5sZW4oKTsKKyAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOworCisgICAgaWYgKHNob3VsZFdyYXApIHsKKyAgICAgIExPR0dFUi5kZWJ1ZygiZGF0YSBsZW5ndGggYmVmb3JlIHdyYXA6IHt9IiwgZGF0YUxlbmd0aCk7CisgICAgICB0cnkgeworICAgICAgICBidWYgPSBzYXNsLndyYXAoYnVmLCAwLCBkYXRhTGVuZ3RoKTsKKyAgICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICAgIGRhdGFMZW5ndGggPSBidWYubGVuZ3RoOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoIndyaXRpbmcgZGF0YSBsZW5ndGg6IHt9IiwgZGF0YUxlbmd0aCk7CisgICAgd3JpdGVMZW5ndGgoZGF0YUxlbmd0aCk7CisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShidWYsIDAsIGRhdGFMZW5ndGgpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGV4Y2x1c2l2ZWx5IGJ5IHJlYWRTYXNsTWVzc2FnZSB0byByZXR1cm4gYm90aCBhIHN0YXR1cyBhbmQgZGF0YS4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2FzbFJlc3BvbnNlIHsKKyAgICBwdWJsaWMgTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzOworICAgIHB1YmxpYyBieXRlW10gcGF5bG9hZDsKKworICAgIHB1YmxpYyBTYXNsUmVzcG9uc2UoTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzLCBieXRlW10gcGF5bG9hZCkgeworICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIHRvIGFic3RyYWN0IG92ZXIgdGhlIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+IGFuZAorICAgKiA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiBjbGFzc2VzLCB3aGljaCBzaGFyZSBhIGxvdCBvZiB0aGVpciBpbnRlcmZhY2UsIGJ1dAorICAgKiB1bmZvcnR1bmF0ZWx5IGRvbid0IHNoYXJlIGEgY29tbW9uIHN1cGVyY2xhc3MuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXNsUGFydGljaXBhbnQgeworICAgIC8vIE9uZSBvZiB0aGVzZSB3aWxsIGFsd2F5cyBiZSBudWxsLgorICAgIHB1YmxpYyBTYXNsU2VydmVyIHNhc2xTZXJ2ZXI7CisgICAgcHVibGljIFNhc2xDbGllbnQgc2FzbENsaWVudDsKKworICAgIHB1YmxpYyBTYXNsUGFydGljaXBhbnQoU2FzbFNlcnZlciBzYXNsU2VydmVyKSB7CisgICAgICB0aGlzLnNhc2xTZXJ2ZXIgPSBzYXNsU2VydmVyOworICAgIH0KKworICAgIHB1YmxpYyBTYXNsUGFydGljaXBhbnQoU2FzbENsaWVudCBzYXNsQ2xpZW50KSB7CisgICAgICB0aGlzLnNhc2xDbGllbnQgPSBzYXNsQ2xpZW50OworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVDaGFsbGVuZ2VPclJlc3BvbnNlKGJ5dGVbXSBjaGFsbGVuZ2VPclJlc3BvbnNlKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2FzbENsaWVudCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzYXNsQ2xpZW50LmV2YWx1YXRlQ2hhbGxlbmdlKGNoYWxsZW5nZU9yUmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNhc2xTZXJ2ZXIuZXZhbHVhdGVSZXNwb25zZShjaGFsbGVuZ2VPclJlc3BvbnNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgICAgaWYgKHNhc2xDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIHNhc2xDbGllbnQuaXNDb21wbGV0ZSgpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2FzbFNlcnZlci5pc0NvbXBsZXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKKyAgICAgIGlmIChzYXNsQ2xpZW50ICE9IG51bGwpCisgICAgICAgIHNhc2xDbGllbnQuZGlzcG9zZSgpOworICAgICAgZWxzZQorICAgICAgICBzYXNsU2VydmVyLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIHVud3JhcChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2FzbENsaWVudCAhPSBudWxsKQorICAgICAgICByZXR1cm4gc2FzbENsaWVudC51bndyYXAoYnVmLCBvZmYsIGxlbik7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLnVud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIHdyYXAoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFNhc2xFeGNlcHRpb24geworICAgICAgaWYgKHNhc2xDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIHNhc2xDbGllbnQud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHNhc2xTZXJ2ZXIud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE5lZ290aWF0ZWRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKKyAgICAgIGlmIChzYXNsQ2xpZW50ICE9IG51bGwpCisgICAgICAgIHJldHVybiBzYXNsQ2xpZW50LmdldE5lZ290aWF0ZWRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLmdldE5lZ290aWF0ZWRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxODlmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKgorICogVGhpcyBleGNlcHRpb24gaXMgdXNlZCB0byB0cmFjayBleGNlcHRpb25zIGluIFRTYXNsVHJhbnNwb3J0CisgKiB0aGF0IGRvZXMgbm90IGhhdmUgU2FzbCBzaWduYXR1cmUgaW4gdGhlaXIgc3RyZWFtLgorICovCitwdWJsaWMgY2xhc3MgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKworICBwdWJsaWMgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZWVrYWJsZUZpbGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlZWthYmxlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmQzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZWVrYWJsZUZpbGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFRTZWVrYWJsZUZpbGUgeworCisgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggM2VjYTdiYy4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTM3LDMzICszNywzNiBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNlcnZlclNvY2tldC5jbGFzcy5nZXROYW1lKCkpOwogCiAgIC8qKgotICAgKiBVbmRlcmx5aW5nIHNlcnZlcnNvY2tldCBvYmplY3QKKyAgICogVW5kZXJseWluZyBTZXJ2ZXJTb2NrZXQgb2JqZWN0CiAgICAqLwogICBwcml2YXRlIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKIAogICAvKioKLSAgICogUG9ydCB0byBsaXN0ZW4gb24KLSAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKLQotICAvKioKICAgICogVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKICAgICovCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXRfID0gMDsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlclRyYW5zcG9ydEFyZ3M8U2VydmVyU29ja2V0VHJhbnNwb3J0QXJncz4geworICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisKKyAgICBwdWJsaWMgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncyBzZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgeworICAgICAgdGhpcy5zZXJ2ZXJTb2NrZXQgPSBzZXJ2ZXJTb2NrZXQ7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKICAgICovCi0gIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQpIHsKKyAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRoaXMoc2VydmVyU29ja2V0LCAwKTsKICAgfQogCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwgaW50IGNsaWVudFRpbWVvdXQpIHsKLSAgICBzZXJ2ZXJTb2NrZXRfID0gc2VydmVyU29ja2V0OwotICAgIGNsaWVudFRpbWVvdXRfID0gY2xpZW50VGltZW91dDsKKyAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKG5ldyBTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkuc2VydmVyU29ja2V0KHNlcnZlclNvY2tldCkuY2xpZW50VGltZW91dChjbGllbnRUaW1lb3V0KSk7CiAgIH0KIAogICAvKioKQEAgLTc4LDcgKzgxLDYgQEAKICAgICovCiAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRoaXMobmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpLCBjbGllbnRUaW1lb3V0KTsKLSAgICBwb3J0XyA9IHBvcnQ7CiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtODYsMjIgKzg4LDMwIEBACiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLmJpbmRBZGRyKGJpbmRBZGRyKS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgYXJncykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGNsaWVudFRpbWVvdXRfID0gYXJncy5jbGllbnRUaW1lb3V0OworICAgIGlmIChhcmdzLnNlcnZlclNvY2tldCAhPSBudWxsKSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldF8gPSBhcmdzLnNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAogICAgICAgc2VydmVyU29ja2V0XyA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKICAgICAgIC8vIFByZXZlbnQgMk1TTCBkZWxheSBwcm9ibGVtIG9uIHNlcnZlciByZXN0YXJ0cwogICAgICAgc2VydmVyU29ja2V0Xy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0Ci0gICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYmluZEFkZHIpOworICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBiaW5kQWRkci50b1N0cmluZygpICsgIi4iKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKQEAgLTE0Miw0ICsxNTIsNyBAQAogICAgIGNsb3NlKCk7CiAgIH0KIAorICBwdWJsaWMgU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldCgpIHsKKyAgICByZXR1cm4gc2VydmVyU29ja2V0XzsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQppbmRleCAxN2ZmODZiLi40MjRlNGZhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMTksMTEgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CisKIC8qKgogICogU2VydmVyIHRyYW5zcG9ydC4gT2JqZWN0IHdoaWNoIHByb3ZpZGVzIGNsaWVudCB0cmFuc3BvcnRzLgogICoKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJUcmFuc3BvcnRBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlclRyYW5zcG9ydEFyZ3M8VD4+IHsKKyAgICBpbnQgYmFja2xvZyA9IDA7IC8vIEEgdmFsdWUgb2YgMCBtZWFucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQgKGN1cnJlbnRseSBzZXQgYXQgNTApCisgICAgaW50IGNsaWVudFRpbWVvdXQgPSAwOworICAgIEluZXRTb2NrZXRBZGRyZXNzIGJpbmRBZGRyOworCisgICAgcHVibGljIFQgYmFja2xvZyhpbnQgYmFja2xvZykgeworICAgICAgdGhpcy5iYWNrbG9nID0gYmFja2xvZzsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBjbGllbnRUaW1lb3V0KGludCBjbGllbnRUaW1lb3V0KSB7CisgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIHBvcnQoaW50IHBvcnQpIHsKKyAgICAgIHRoaXMuYmluZEFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgYmluZEFkZHIoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIpIHsKKyAgICAgIHRoaXMuYmluZEFkZHIgPSBiaW5kQWRkcjsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisgIH0KIAogICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTAyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CisKKworLyoqCisgKiBCYXNpYyBmaWxlIHN1cHBvcnQgZm9yIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVFNpbXBsZUZpbGVUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG51bGw7ICAgCisgIHByaXZhdGUgYm9vbGVhbiByZWFkYWJsZTsgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZSBib29sZWFuIHdyaXRhYmxlOyAgICAgICAgICAgICAgIAorICBwcml2YXRlIFN0cmluZyBwYXRoXzsgICAgICAgICAgICAgICAKKworCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIGZpbGUgCisgICAqIAorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAcGFyYW0gcmVhZCB0cnVlIHRvIHN1cHBvcnQgcmVhZCBvcGVyYXRpb25zCisgICAqIEBwYXJhbSB3cml0ZSB0cnVlIHRvIHN1cHBvcnQgd3JpdGUgb3BlcmF0aW9ucworICAgKiBAcGFyYW0gb3BlbkZpbGUgdHJ1ZSB0byBvcGVuIHRoZSBmaWxlIG9uIGNvbnN0cnVjdGlvbgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVhZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdyaXRlLCBib29sZWFuIG9wZW5GaWxlKQorICAgICAgICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm8gcGF0aCBzcGVjaWZpZWQiKTsKKyAgICB9CisgICAgaWYgKCFyZWFkICYmICF3cml0ZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5laXRoZXIgUkVBRCBub3IgV1JJVEUgc3BlY2lmaWVkIik7CisgICAgfQorICAgIHJlYWRhYmxlID0gcmVhZDsKKyAgICB3cml0YWJsZSA9IHdyaXRlOworICAgIHBhdGhfID0gcGF0aDsKKyAgICBpZiAob3BlbkZpbGUpIHsKKyAgICAgIG9wZW4oKTsKKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIGZpbGUgCisgICAqIEltcGxpY2l0bHkgb3BlbnMgZmlsZSB0byBjb25mb3JtIHRvIEMrKyBiZWhhdmlvci4KKyAgICogCisgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIG9wZW4vY3JlYXRlCisgICAqIEBwYXJhbSByZWFkIHRydWUgdG8gc3VwcG9ydCByZWFkIG9wZXJhdGlvbnMKKyAgICogQHBhcmFtIHdyaXRlIHRydWUgdG8gc3VwcG9ydCB3cml0ZSBvcGVyYXRpb25zCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIG9wZW4gZmFpbHMKKyAgICovCisgIHB1YmxpYyBUU2ltcGxlRmlsZVRyYW5zcG9ydChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWFkLCBib29sZWFuIHdyaXRlKQorICAgICAgICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKHBhdGgsIHJlYWQsIHdyaXRlLCB0cnVlKTsKKyAgfQorICAKKyAgLyoqCisgICAqIENyZWF0ZSBhIHRyYW5zcG9ydCBiYWNrZWQgYnkgYSBzaW1wbGUgcmVhZCBvbmx5IGRpc2sgZmlsZSAoaW1wbGljaXRseSBvcGVucworICAgKiBmaWxlKQorICAgKgorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKHBhdGgsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IGZpbGUgc3RhdHVzCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVuLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIChmaWxlICE9IG51bGwpOworICB9CisKKyAgLyoqCisgICAqIE9wZW4gZmlsZSBpZiBub3QgcHJldmlvdXNseSBvcGVuZWQuIAorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgb3BlbiBmYWlscworICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKGZpbGUgPT0gbnVsbCl7CisgICAgICB0cnkgeworICAgICAgICBTdHJpbmcgYWNjZXNzID0gInIiOyAgICAgICAvL1JhbmRvbUFjY2Vzc0ZpbGUgb2JqZWN0cyBtdXN0IGJlIHJlYWRhYmxlCisgICAgICAgIGlmICh3cml0YWJsZSkgeworICAgICAgICAgIGFjY2VzcyArPSAidyI7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGhfLCBhY2Nlc3MpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gICAgICAKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2UgZmlsZSwgc3Vic2VxdWVudCByZWFkL3dyaXRlIGFjdGl2aXR5IHdpbGwgdGhyb3cgZXhjZXB0aW9ucworICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vTm90aGluZyB0byBkbworICAgICAgfQorICAgICAgZmlsZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlYWQgdXAgdG8gbGVuIG1hbnkgYnl0ZXMgaW50byBidWYgYXQgb2Zmc2V0IAorICAgKgorICAgKiBAcGFyYW0gYnVmIGhvdXNlcyBieXRlcyByZWFkCisgICAqIEBwYXJhbSBvZmYgb2Zmc2V0IGludG8gYnVmZiB0byBiZWdpbiB3cml0aW5nIHRvCisgICAqIEBwYXJhbSBsZW4gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvbiByZWFkIGZhaWx1cmUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghcmVhZGFibGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIG9wZXJhdGlvbiBvbiB3cml0ZSBvbmx5IGZpbGUiKTsKKyAgICB9CisgICAgaW50IGlCeXRlc1JlYWQgPSAwOworICAgIHRyeSB7CisgICAgICBpQnl0ZXNSZWFkID0gZmlsZS5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgZmlsZSA9IG51bGw7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGlCeXRlc1JlYWQ7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgbGVuIG1hbnkgYnl0ZXMgZnJvbSBidWZmIHN0YXJ0aW5nIGF0IG9mZnNldCAKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byB3cml0ZQorICAgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbnRvIGJ1ZmZlciB0byBiZWdpbiB3cml0aW5nIGZyb20KKyAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9uIHdyaXRlIGZhaWx1cmUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbGUud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICBmaWxlID0gbnVsbDsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBNb3ZlIGZpbGUgcG9pbnRlciB0byBzcGVjaWZpZWQgb2Zmc2V0LCBuZXcgcmVhZC93cml0ZSBjYWxscyB3aWxsIGFjdCBoZXJlCisgICAqCisgICAqIEBwYXJhbSBvZmZzZXQgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSB0byBtb3ZlIHBvaW50ZXIgdG8KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlzIHNlZWsgZmFpbHMKKyAgICovCisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBvZmZzZXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgZmlsZS5zZWVrKG9mZnNldCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzCisgICAqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIGFjY2VzcyBmYWlscworICAgKi8KKyAgcHVibGljIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gZmlsZS5sZW5ndGgoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIGN1cnJlbnQgZmlsZSBwb2ludGVyIHBvc2l0aW9uIGluIGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUKKyAgICoKKyAgICogQHJldHVybiBmaWxlIHBvaW50ZXIgcG9zaXRpb24KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgYWNjZXNzIGZhaWxzCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCmluZGV4IDYwNmU4YTkuLmIyMGIzMmIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCkBAIC00MCwyMiArNDAsMjcgQEAKICAgLyoqCiAgICAqIFdyYXBwZWQgU29ja2V0IG9iamVjdAogICAgKi8KLSAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0XyA9IG51bGw7CisgIHByaXZhdGUgU29ja2V0IHNvY2tldF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBob3N0CiAgICAqLwotICBwcml2YXRlIFN0cmluZyBob3N0XyAgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBob3N0XzsKIAogICAvKioKICAgICogUmVtb3RlIHBvcnQKICAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgcG9ydF87CiAKICAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0CisgICAqIFNvY2tldCB0aW1lb3V0IC0gcmVhZCB0aW1lb3V0IG9uIHRoZSBzb2NrZXQKICAgICovCi0gIHByaXZhdGUgaW50IHRpbWVvdXRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgc29ja2V0VGltZW91dF87CisKKyAgLyoqCisgICAqIENvbm5lY3Rpb24gdGltZW91dAorICAgKi8KKyAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCBzb2NrZXQuCkBAIC02OCwxNCArNzMsMTUgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3QgY29uZmlndXJlIHNvY2tldC4iLCBzeCk7CiAgICAgfQogCiAgICAgaWYgKGlzT3BlbigpKSB7CiAgICAgICB0cnkgewotICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCksIDEwMjQpOwotICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CkBAIC0xMDAsMTIgKzEwNiwyNyBAQAogICAgKgogICAgKiBAcGFyYW0gaG9zdCAgICBSZW1vdGUgaG9zdAogICAgKiBAcGFyYW0gcG9ydCAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dAorICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgVFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB7CisgICAgdGhpcyhob3N0LCBwb3J0LCB0aW1lb3V0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydCwgd2l0aCBhIHNwZWNpZmljIGNvbm5lY3Rpb24gdGltZW91dCBhbmQgYQorICAgKiBzcGVjaWZpYyBzb2NrZXQgdGltZW91dC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICBSZW1vdGUgaG9zdAorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgIFJlbW90ZSBwb3J0CisgICAqIEBwYXJhbSBzb2NrZXRUaW1lb3V0ICAgU29ja2V0IHRpbWVvdXQKKyAgICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0ICBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHB1YmxpYyBUU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvY2tldFRpbWVvdXQsIGludCBjb25uZWN0VGltZW91dCkgewogICAgIGhvc3RfID0gaG9zdDsKICAgICBwb3J0XyA9IHBvcnQ7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OworICAgIHNvY2tldFRpbWVvdXRfID0gc29ja2V0VGltZW91dDsKKyAgICBjb25uZWN0VGltZW91dF8gPSBjb25uZWN0VGltZW91dDsKICAgICBpbml0U29ja2V0KCk7CiAgIH0KIApAQCAtMTE3LDE5ICsxMzgsMzkgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0Xyk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHNvY2tldFRpbWVvdXRfKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi5lcnJvcigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIHRoaXMuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCk7CisgICAgdGhpcy5zZXRTb2NrZXRUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIHRpbWUgb3V0CisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICAvKioKICAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKICAgICoKICAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXQpOwogICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewpAQCAtMTY1LDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTE3Nyw5ICsyMTgsOSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIHRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0YW5kYXJkRmlsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RhbmRhcmRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzM2FmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0YW5kYXJkRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIFRTdGFuZGFyZEZpbGUgaW1wbGVtZW50cyBUU2Vla2FibGVGaWxlIHsKKworICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhfID0gbnVsbDsKKyAgcHJvdGVjdGVkIFJhbmRvbUFjY2Vzc0ZpbGUgaW5wdXRGaWxlXyA9IG51bGw7CisKKyAgcHVibGljIFRTdGFuZGFyZEZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcGF0aF8gPSBwYXRoOworICAgIGlucHV0RmlsZV8gPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwYXRoXywgInIiKTsKKyAgfQorCisgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRGRCgpKTsKKyAgfQorCisgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aF8pOworICB9CisKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmKGlucHV0RmlsZV8gIT0gbnVsbCkgeworICAgICAgaW5wdXRGaWxlXy5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGlucHV0RmlsZV8ubGVuZ3RoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlucHV0RmlsZV8uc2Vlayhwb3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCmluZGV4IDM3OGVmZGMuLjczYWQ3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKKwogLyoqCiAgKiBHZW5lcmljIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIuIFRoaXMgaXMgYmFzaWNhbGx5IGEgdGhpbgogICogd3JhcHBlciBhcm91bmQgdGhlIGNvbWJpbmVkIGZ1bmN0aW9uYWxpdHkgb2YgSmF2YSBpbnB1dC9vdXRwdXQgc3RyZWFtcy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKIAogICAvKioKICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTU2LDcgKzU4LDcgQEAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKTsKIAogICAvKioKLSAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYuCiAgICAqCiAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCiAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdApAQCAtODMsNyArODUsMTIgQEAKICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CiAgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CiAgICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIgKyBsZW4gKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIGdvdCArICIgYnl0ZXMuIik7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKKyAgICAgICAgICAgICAgICArIGxlbgorICAgICAgICAgICAgICAgICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIKKyAgICAgICAgICAgICAgICArIGdvdAorICAgICAgICAgICAgICAgICsgIiBieXRlcy4gKFRoaXMgaXMgb2Z0ZW4gaW5kaWNhdGl2ZSBvZiBhbiBpbnRlcm5hbCBlcnJvciBvbiB0aGUgc2VydmVyIHNpZGUuIFBsZWFzZSBjaGVjayB5b3VyIHNlcnZlciBsb2dzLikiKTsKICAgICAgIH0KICAgICAgIGdvdCArPSByZXQ7CiAgICAgfQpAQCAtMTIyLDcgKzEyOSw3IEBACiAgIC8qKgogICAgKiBBY2Nlc3MgdGhlIHByb3RvY29sJ3MgdW5kZXJseWluZyBidWZmZXIgZGlyZWN0bHkuIElmIHRoaXMgaXMgbm90IGEKICAgICogYnVmZmVyZWQgdHJhbnNwb3J0LCByZXR1cm4gbnVsbC4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHByb3RvY29sJ3MgVW5kZXJseWluZyBidWZmZXIKICAgICovCiAgIHB1YmxpYyBieXRlW10gZ2V0QnVmZmVyKCkgewogICAgIHJldHVybiBudWxsOwpAQCAtMTMxLDcgKzEzOCw4IEBACiAgIC8qKgogICAgKiBSZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5leHQgc3BvdAogICAgKiB0aGF0IHNob3VsZCBiZSByZWFkIGZyb20uCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBpbmRleCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXh0IHNwb3QKKyAgICogdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ1ZmZlclBvc2l0aW9uKCkgewogICAgIHJldHVybiAwOwpAQCAtMTQwLDcgKzE0OCw4IEBACiAgIC8qKgogICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiBSZXR1cm5zIC0xIGlmCiAgICAqIHRoaXMgaXMgYSBub24tYnVmZmVyZWQgdHJhbnNwb3J0LgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiA8YnI+IFJldHVybnMgLTEgaWYKKyAgICogdGhpcyBpcyBhIG5vbi1idWZmZXJlZCB0cmFuc3BvcnQuCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSB7CiAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQppbmRleCBkMDhmM2IwLi5iODg2YmMyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMzQsNiArMzQsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFJFQURZX09QRU4gPSAyOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRF9PVVQgPSAzOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfRklMRSA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUlJVUFRFRF9EQVRBID0gNTsKIAogICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTVhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUWmxpYlRyYW5zcG9ydCBkZWZsYXRlcyBvbiB3cml0ZSBhbmQgaW5mbGF0ZXMgb24gcmVhZC4KKyAqLworcHVibGljIGNsYXNzIFRabGliVHJhbnNwb3J0IGV4dGVuZHMgVElPU3RyZWFtVHJhbnNwb3J0IHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnRfID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgcHVibGljIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUWmxpYlRyYW5zcG9ydChiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcyh0cmFuc3BvcnQsIERlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gIGNvbXByZXNzaW9uTGV2ZWwgMCBmb3Igbm8gY29tcHJlc3Npb24sIDkgZm9yIG1heGltdW0gY29tcHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0odHJhbnNwb3J0XyksIG5ldyBJbmZsYXRlcigpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShuZXcgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSh0cmFuc3BvcnRfKSwgbmV3IERlZmxhdGVyKGNvbXByZXNzaW9uTGV2ZWwsIGZhbHNlKSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydF8uaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydElucHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICB0cmFuc3BvcnQucmVhZChidWYsIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZlswXTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgIHB1YmxpYyBUVHJhbnNwb3J0T3V0cHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKG5ldyBieXRlW117KGJ5dGUpIGJ9KTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZSBiL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDY2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMgYi9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5YmViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKKyMgbG9nNGogY29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyBidWlsZCBhbmQgdW5pdCB0ZXN0cworbG9nNGoucm9vdExvZ2dlcj1kZWJ1ZyxzdGRvdXQKK2xvZzRqLnRocmVzaG9sZD1BTEwKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCAlY3syfSAoJUY6JU0oJUwpKSAtICVtJW4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQppbmRleCAxNGJkYzA4Li42MWY0MGE1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCkBAIC0xNywxMDYgKzE3LDMyNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCB0aHJpZnQudGVzdC4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQm9uazsKK2ltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OZXN0aW5nOworaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaDsKIAogcHVibGljIGNsYXNzIEZpeHR1cmVzIHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBPbmVPZkVhY2ggb25lT2ZFYWNoOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIE5lc3RpbmcgbmVzdGluZzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgY29tcGFjdFByb3RvVGVzdFN0cnVjdDsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBrVW5pY29kZUJ5dGVzID0gewotICAgIChieXRlKTB4ZDMsIChieXRlKTB4ODAsIChieXRlKTB4ZTIsIChieXRlKTB4ODUsIChieXRlKTB4YWUsIChieXRlKTB4Y2UsCi0gICAgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhkMCwgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHhjZSwgKGJ5dGUpMHhiZiwKLSAgICAoYnl0ZSkweGUyLCAoYnl0ZSkweDg1LCAoYnl0ZSkweGJmLCAoYnl0ZSkweGQwLCAoYnl0ZSkweGJlLCAoYnl0ZSkweGM5LAotICAgIChieXRlKTB4YTEsIChieXRlKTB4ZDAsIChieXRlKTB4YjMsIChieXRlKTB4ZDAsIChieXRlKTB4YjAsIChieXRlKTB4Y2YsCi0gICAgKGJ5dGUpMHg4MSwgKGJ5dGUpMHhlMiwgKGJ5dGUpMHg4NCwgKGJ5dGUpMHg4ZSwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhjZSwKLSAgICAoYnl0ZSkweDkxLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDc0LCAoYnl0ZSkweGNlLCAoYnl0ZSkweGIxLCAoYnl0ZSkweGUyLAotICAgIChieXRlKTB4ODUsIChieXRlKTB4YmQsIChieXRlKTB4Y2UsIChieXRlKTB4YmEsIChieXRlKTB4ODMsIChieXRlKTB4ZTIsCi0gICAgKGJ5dGUpMHg4MCwgKGJ5dGUpMHhiYwotICB9OworCisgIC8vIFRoZXNlIGJ5dGUgYXJyYXlzIGFyZSBzZXJpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBzdHJ1Y3RzLgorICAvLyBUaGV5IHdlcmUgc2VyaWFsaXplZCBpbiBiaW5hcnkgcHJvdG9jb2wgdXNpbmcgdGhyaWZ0IDAuNi54IGFuZCBhcmUgdXNlZCB0bworICAvLyB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhbmRhcmQgc2NoZW1lLgorICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4RDYsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4NjksIChieXRlKSAweDc4LAorICAgIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4RkIsCisgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHgyRCwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg0RiwgKGJ5dGUpIDB4NEUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDUzLAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LAorICAgIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OUQsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4QzksIChieXRlKSAweEExLAorICAgIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIwLCAoYnl0ZSkgMHhDRiwKKyAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4MjAsCisgICAgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEJELCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDBGLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc05lc3RpbmcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4N0EsIChieXRlKSAweDY5LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDEzLAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDZELCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4NkIsIChieXRlKSAweDJFLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweDc4LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHhENiwKKyAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsCisgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwKKyAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsCisgICAgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLAorICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsCisgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LAorICAgIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsCisgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LAorICAgIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLAorICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywKKyAgICAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweEQ2LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LAorICAgIChieXRlKSAweDY5LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweEZCLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELAorICAgIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4NEYsIChieXRlKSAweDRFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLAorICAgIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDAsIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLAorICAgIChieXRlKSAweEM5LCAoYnl0ZSkgMHhBMSwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4Q0YsIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsCisgICAgKGJ5dGUpIDB4OEUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4QkQsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LAorICAgIChieXRlKSAweDM0LCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELAorICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NkYsIChieXRlKSAweDZFLAorICAgIChieXRlKSAweDY1LCAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4MjAsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NywKKyAgICAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NEYsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4MjEsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NkUsIChieXRlKSAweDY0LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDZGLCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2RSwKKyAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NzQsCisgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDZGLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2OSwKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDNGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwKKyAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg3QSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2RiwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10ga1VuaWNvZGVCeXRlcyA9IHsgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDgwLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDlkLAorICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweGQwLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGJmLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGJlLAorICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGExLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGQwLAorICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGNmLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg0LAorICAgICAgKGJ5dGUpIDB4OGUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LAorICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4ODMsIChieXRlKSAweGUyLAorICAgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweGJjIH07CiAKICAgc3RhdGljIHsKICAgICB0cnkgewogICAgICAgb25lT2ZFYWNoID0gbmV3IE9uZU9mRWFjaCgpOwotICAgICAgb25lT2ZFYWNoLmltX3RydWUgPSB0cnVlOwotICAgICAgb25lT2ZFYWNoLmltX2ZhbHNlID0gZmFsc2U7Ci0gICAgICBvbmVPZkVhY2guYV9iaXRlID0gKGJ5dGUpIDB4ZDY7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjE2ID0gMjcwMDA7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjMyID0gMSA8PCAyNDsKLSAgICAgIG9uZU9mRWFjaC5pbnRlZ2VyNjQgPSAobG9uZykgNjAwMCAqIDEwMDAgKiAxMDAwOwotICAgICAgb25lT2ZFYWNoLmRvdWJsZV9wcmVjaXNpb24gPSBNYXRoLlBJOwotICAgICAgb25lT2ZFYWNoLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOwotICAgICAgb25lT2ZFYWNoLnpvbWdfdW5pY29kZSA9IG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgIlVURi04Iik7Ci0gICAgICBvbmVPZkVhY2guYmFzZTY0ID0gQnl0ZUJ1ZmZlci53cmFwKCJiYXNlNjQiLmdldEJ5dGVzKCkpOworICAgICAgb25lT2ZFYWNoLnNldEltX3RydWUodHJ1ZSk7CisgICAgICBvbmVPZkVhY2guc2V0SW1fZmFsc2UoZmFsc2UpOworICAgICAgb25lT2ZFYWNoLnNldEFfYml0ZSgoYnl0ZSkgMHhkNik7CisgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjE2KChzaG9ydCkgMjcwMDApOworICAgICAgb25lT2ZFYWNoLnNldEludGVnZXIzMigxIDw8IDI0KTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbnRlZ2VyNjQoKGxvbmcpIDYwMDAgKiAxMDAwICogMTAwMCk7CisgICAgICBvbmVPZkVhY2guc2V0RG91YmxlX3ByZWNpc2lvbihNYXRoLlBJKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRTb21lX2NoYXJhY3RlcnMoIkpTT04gVEhJUyEgXCJcMSIpOworICAgICAgb25lT2ZFYWNoLnNldFpvbWdfdW5pY29kZShuZXcgU3RyaW5nKGtVbmljb2RlQnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRCYXNlNjQoQnl0ZUJ1ZmZlci53cmFwKCJiYXNlNjQiLmdldEJ5dGVzKCkpKTsKICAgICAgIC8vIGJ5dGUsIGkxNiwgYW5kIGk2NCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJ5IGRlZmF1bHQgY29uc3RydWN0b3IKIAogICAgICAgQm9uayBib25rID0gbmV3IEJvbmsoKTsKLSAgICAgIGJvbmsudHlwZSA9IDMxMzM3OwotICAgICAgYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworICAgICAgYm9uay5zZXRUeXBlKDMxMzM3KTsKKyAgICAgIGJvbmsuc2V0TWVzc2FnZSgiSSBhbSBhIGJvbmsuLi4geG9yISIpOwogICAgICAgbmVzdGluZyA9IG5ldyBOZXN0aW5nKGJvbmssIG9uZU9mRWFjaCk7CiAKICAgICAgIGhvbHlNb2xleSA9IG5ldyBIb2x5TW9sZXkoKTsKLSAgICAgIGhvbHlNb2xleS5iaWcgPSBuZXcgQXJyYXlMaXN0PE9uZU9mRWFjaD4oKTsKLSAgICAgIGhvbHlNb2xleS5iaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7Ci0gICAgICBob2x5TW9sZXkuYmlnLmFkZChuZXN0aW5nLm15X29vZSk7Ci0gICAgICBob2x5TW9sZXkuYmlnLmdldCgwKS5hX2JpdGUgPSAoYnl0ZSkgMHgyMjsKLSAgICAgIGhvbHlNb2xleS5iaWcuZ2V0KDEpLmFfYml0ZSA9IChieXRlKSAweDIzOworICAgICAgTGlzdDxPbmVPZkVhY2g+IGJpZyA9IG5ldyBBcnJheUxpc3Q8T25lT2ZFYWNoPigpOworICAgICAgYmlnLmFkZChuZXcgT25lT2ZFYWNoKG9uZU9mRWFjaCkpOworICAgICAgYmlnLmFkZChuZXN0aW5nLm15X29vZSk7CisgICAgICBob2x5TW9sZXkuc2V0QmlnKGJpZyk7CisgICAgICBob2x5TW9sZXkuZ2V0QmlnKCkuZ2V0KDApLnNldEFfYml0ZSgoYnl0ZSkgMHgyMik7CisgICAgICBob2x5TW9sZXkuZ2V0QmlnKCkuZ2V0KDApLnNldEFfYml0ZSgoYnl0ZSkgMHgyMyk7CiAKLSAgICAgIGhvbHlNb2xleS5jb250YWluID0gbmV3IEhhc2hTZXQ8TGlzdDxTdHJpbmc+PigpOworICAgICAgaG9seU1vbGV5LnNldENvbnRhaW4obmV3IEhhc2hTZXQ8TGlzdDxTdHJpbmc+PigpKTsKICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHN0YWdlMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyKTsKICAgICAgIHN0YWdlMS5hZGQoImFuZCBhIG9uZSIpOwogICAgICAgc3RhZ2UxLmFkZCgiYW5kIGEgdHdvIik7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAgICAgICBzdGFnZTEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMyk7CiAgICAgICBzdGFnZTEuYWRkKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgICAgIHN0YWdlMS5hZGQoInRocmVlISIpOwogICAgICAgc3RhZ2UxLmFkZCgiRk9VUiEhIik7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAgICAgICBzdGFnZTEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCk7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAKICAgICAgIEFycmF5TGlzdDxCb25rPiBzdGFnZTIgPSBuZXcgQXJyYXlMaXN0PEJvbms+KCk7Ci0gICAgICBob2x5TW9sZXkuYm9ua3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Qm9uaz4+KCk7CisgICAgICBob2x5TW9sZXkuc2V0Qm9ua3MobmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEJvbms+PigpKTsKICAgICAgIC8vIG9uZSBlbXB0eQotICAgICAgaG9seU1vbGV5LmJvbmtzLnB1dCgiemVybyIsIHN0YWdlMik7Ci0gICAgICAKKyAgICAgIGhvbHlNb2xleS5nZXRCb25rcygpLnB1dCgiemVybyIsIHN0YWdlMik7CisKICAgICAgIC8vIG9uZSB3aXRoIHR3bwogICAgICAgc3RhZ2UyID0gbmV3IEFycmF5TGlzdDxCb25rPigpOwogICAgICAgQm9uayBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDE7Ci0gICAgICBiLm1lc3NhZ2UgPSAiV2FpdC4iOworICAgICAgYi5zZXRUeXBlKDEpOworICAgICAgYi5zZXRNZXNzYWdlKCJXYWl0LiIpOwogICAgICAgc3RhZ2UyLmFkZChiKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gMjsKLSAgICAgIGIubWVzc2FnZSA9ICJXaGF0PyI7Ci0gICAgICBzdGFnZTIuYWRkKGIpOyAgICAgIAotICAgICAgaG9seU1vbGV5LmJvbmtzLnB1dCgidHdvIiwgc3RhZ2UyKTsKLSAgICAgIAorICAgICAgYi5zZXRUeXBlKDIpOworICAgICAgYi5zZXRNZXNzYWdlKCJXaGF0PyIpOworICAgICAgc3RhZ2UyLmFkZChiKTsKKyAgICAgIGhvbHlNb2xleS5nZXRCb25rcygpLnB1dCgidHdvIiwgc3RhZ2UyKTsKKwogICAgICAgLy8gb25lIHdpdGggdGhyZWUKICAgICAgIHN0YWdlMiA9IG5ldyBBcnJheUxpc3Q8Qm9uaz4oKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gMzsKLSAgICAgIGIubWVzc2FnZSA9ICJxdW90aCI7CisgICAgICBiLnNldFR5cGUoMyk7CisgICAgICBiLnNldE1lc3NhZ2UoInF1b3RoIik7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDQ7Ci0gICAgICBiLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKKyAgICAgIGIuc2V0VHlwZSg0KTsKKyAgICAgIGIuc2V0TWVzc2FnZSgidGhlIHJhdmVuIik7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDU7Ci0gICAgICBiLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgICAgIGhvbHlNb2xleS5ib25rcy5wdXQoInRocmVlIiwgc3RhZ2UyKTsKKyAgICAgIGIuc2V0VHlwZSg1KTsKKyAgICAgIGIuc2V0TWVzc2FnZSgibmV2ZXJtb3JlIik7CisgICAgICBob2x5TW9sZXkuZ2V0Qm9ua3MoKS5wdXQoInRocmVlIiwgc3RhZ2UyKTsKIAogICAgICAgLy8gc3VwZXJodWdlIGNvbXBhY3QgcHJvdG8gdGVzdCBzdHJ1Y3QKLSAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgPSBuZXcgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCh0aHJpZnQudGVzdC5Db25zdGFudHMuQ09NUEFDVF9URVNUKTsKLSAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QuYV9iaW5hcnkgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOH0pOworICAgICAgY29tcGFjdFByb3RvVGVzdFN0cnVjdCA9IG5ldyBDb21wYWN0UHJvdG9UZXN0U3RydWN0KAorICAgICAgICAgIHRocmlmdC50ZXN0LkRlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVCk7CisgICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0LnNldEFfYmluYXJ5KEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsgMCwgMSwgMiwKKyAgICAgICAgICAzLCA0LCA1LCA2LCA3LCA4IH0pKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgfQogICB9Ci0gIAogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUJhcjsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUZvbzsKKworcHVibGljIGNsYXNzIFRlc3REZWVwQ29weSBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0RGVlcENvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBmb28gPSBuZXcgRGVlcENvcHlGb28oKTsKKworICAgIGZvby5hZGRUb0wobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5hZGRUb1MobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5wdXRUb00oInRlc3QgMyIsIG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZvby5hZGRUb0xpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLmFkZFRvU2kobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28ucHV0VG9NaSgidGVzdCAzIiwgbmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKworICAgIGZvby5zZXRCYXIobmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZmluYWwgRGVlcENvcHlGb28gZGVlcENvcHlGb28gPSBmb28uZGVlcENvcHkoKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEJhcigpLCBkZWVwQ29weUZvby5nZXRCYXIoKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TCgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE0oKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMaSgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMaSgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNaSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNaSgpLmdldCgidGVzdCAzIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdvZEJlYW47CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR3JlZWtHb2RHb2RkZXNzOworCitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0RW51bUNvbnRhaW5lcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnRhaW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMSA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIGIxLmFkZFRvR29kZGVzcyhHcmVla0dvZEdvZGRlc3MuSEVSQSk7CisgICAgICAgIGIxLmdldEdvZGRlc3MoKS5hZGQoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSk7CisgICAgICAgIGIxLnB1dFRvUG93ZXIoR3JlZWtHb2RHb2RkZXNzLlpFVVMsIDEwMDApOworICAgICAgICBiMS5nZXRQb3dlcigpLnB1dChHcmVla0dvZEdvZGRlc3MuSEVSQSwgMzMzKTsKKyAgICAgICAgYjEucHV0VG9CeUFsaWFzKCJNci4gWiIsIEdyZWVrR29kR29kZGVzcy5aRVVTKTsKKyAgICAgICAgYjEuYWRkVG9JbWFnZXMoIkJhdGhzIG9mIEFwaHJvZGl0ZSAwMS5qcGVnIik7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMiA9IG5ldyBHb2RCZWFuKGIxKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIzID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBUU2VyaWFsaXplcigpOworICAgICAgICAgICAgZmluYWwgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworCisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShiMSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYjMsIGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIyLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMi5nZXRQb3dlcigpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMy5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjMuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgZm9yIChHb2RCZWFuIGVhY2ggOiBuZXcgR29kQmVhbltde2IxLCBiMiwgYjN9KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuUE9TRUlET04pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDAwKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzMzMpLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0UG93ZXIoKSBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0QnlBbGlhcygpIGluc3RhbmNlb2YgSGFzaE1hcCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0SW1hZ2VzKCkgaW5zdGFuY2VvZiBIYXNoU2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29uc3RhbnRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImxpZ2h0bmluZyBib2x0IiwgRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSkpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTg4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5PbmVPZkVhY2haWjsKK2ltcG9ydCB0aHJpZnQudGVzdC5mdWxsY2FtZWwuVW5kZXJzY29yZVNydjsKKworLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgJ2Z1bGxjYW1lbCcuCisvLworcHVibGljIGNsYXNzIFRlc3RGdWxsQ2FtZWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdENhbWVsQ2FzZVN5bnRheCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTZXJpYWxpemVyICAgYmluYXJ5U2VyaWFsaXplciAgID0gbmV3ICAgVFNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIFREZXNlcmlhbGl6ZXIgYmluYXJ5RGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworCisgICAgT25lT2ZFYWNoWlogb2JqID0gbmV3IE9uZU9mRWFjaFpaKCk7CisgICAgb2JqLnNldEFCaXRlKChieXRlKSAweGFlKTsKKyAgICBvYmouc2V0SW1GYWxzZSh0cnVlKTsKKyAgICBieXRlW10gc2VyQnl0ZXMgPSBiaW5hcnlTZXJpYWxpemVyLnNlcmlhbGl6ZShvYmopOworICAgIGJpbmFyeURlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShvYmosIHNlckJ5dGVzKTsKKyAgICBhc3NlcnRUcnVlKCBvYmouZ2V0QUJpdGUoKSA9PSAoYnl0ZSkgMHhhZSApOworICAgIGFzc2VydFRydWUoIG9iai5pc0ltRmFsc2UoKSA9PSB0cnVlICk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZWxDYXNlUnBjTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFVuZGVyc2NvcmVTcnYuSWZhY2Ugc3J2ID0gbmV3IFVuZGVyc2NvcmVTcnYuSWZhY2UoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBsb25nIHNvbWVScGNDYWxsKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiAxbDsKKyAgICAgIH0KKyAgICB9OworICAgIGFzc2VydFRydWUoMWwgPT0gc3J2LnNvbWVScGNDYWxsKCJ0ZXN0IikpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzc2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgIHByaXZhdGUgVE11bHRpcGxleGVkUHJvY2Vzc29yIG1wOworICBwcml2YXRlIFRQcm90b2NvbCBpcHJvdDsKKyAgcHJpdmF0ZSBUUHJvdG9jb2wgb3Byb3Q7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIGlwcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICAgIG9wcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdNZXNzYWdlVHlwZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuIChpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoU2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworCisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgc3RhdGljIGNsYXNzIFN0dWJQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgaWYgKCEiZnVuYyIuZXF1YWxzKG1zZy5uYW1lKSB8fCBtc2cudHlwZSE9VE1lc3NhZ2VUeXBlLkNBTEwgfHwgbXNnLnNlcWlkIT00MikgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiaW5jb3JyZWN0IHBhcmFtZXRlcnMiKTsKKyAgICAgIH0KKyAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RpbmdTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJQcm9jZXNzb3IoInNlcnZpY2UiLCBuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlckRlZmF1bHQobmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDI4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjsKKworLy8gVGVzdHMgYW5kIGRvY3VtZW50cyBiZWhhdmlvciBmb3IgdGhlICJPcHRpb248VD4iIHR5cGUKK3B1YmxpYyBjbGFzcyBUZXN0T3B0aW9uVHlwZSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9ICJDaHVjayBOb3JyaXMiOworICAgICAgICBPcHRpb248U3RyaW5nPiBvcHRpb24gPSBPcHRpb24uZnJvbU51bGxhYmxlKG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uLlNvbWUpOworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbi5pc0RlZmluZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU29tZShDaHVjayBOb3JyaXMpIiwgb3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLm9yKCJkZWZhdWx0IHZhbHVlIiksICJDaHVjayBOb3JyaXMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5nZXQoKSwiQ2h1Y2sgTm9ycmlzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBPcHRpb248U3RyaW5nPiBvcHRpb24gPSBPcHRpb24uZnJvbU51bGxhYmxlKG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uLk5vbmUpOworICAgICAgICBhc3NlcnRGYWxzZShvcHRpb24uaXNEZWZpbmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5vbmUiLCBvcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24ub3IoImRlZmF1bHQgdmFsdWUiKSwgImRlZmF1bHQgdmFsdWUiKTsKKyAgICAgICAgLy8gRXhwZWN0IGV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb3B0aW9uLmdldCgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBnb3Qgbm8gZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworCisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIGdvdCBzb21lIG90aGVyIGV4Y2VwdGlvbjogIitleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlU29tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb248U3RyaW5nPiBzb21lID0gT3B0aW9uLnNvbWUoIndlZSIpOworICAgICAgICBhc3NlcnRUcnVlKHNvbWUgaW5zdGFuY2VvZiBPcHRpb24uU29tZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbjxJbnRlZ2VyPiBub25lID0gT3B0aW9uLm5vbmUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25lIGluc3RhbmNlb2YgT3B0aW9uLk5vbmUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvbmFscy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1OTFlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvbmFscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IHRocmlmdC50ZXN0Lk9wdDQ7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0MzA7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0NjQ7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0ODA7CisKKy8vIEV4ZXJjaXNlcyB0aGUgaXNTZXQgbWV0aG9kcyB1c2luZyBzdHJ1Y3RzIGZyb20gZnJvbSBNYW55T3B0aW9uYWxzLnRocmlmdAorcHVibGljIGNsYXNzIFRlc3RPcHRpb25hbHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZ1V0aWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkweDgsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkwLCAzLCB0cnVlKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkwLCBFbmNvZGluZ1V0aWxzLnNldEJpdCgoc2hvcnQpMHg4LCAzLCBmYWxzZSkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoKHNob3J0KTB4OCwgMykpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgRW5jb2RpbmdVdGlscy50ZXN0Qml0KChzaG9ydCkweDgsIDQpKTsKKworICAgIGFzc2VydEVxdWFscygoc2hvcnQpU2hvcnQuTUlOX1ZBTFVFLCBFbmNvZGluZ1V0aWxzLnNldEJpdCgoc2hvcnQpMCwgMTUsIHRydWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTAsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydClTaG9ydC5NSU5fVkFMVUUsIDE1LCBmYWxzZSkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoU2hvcnQuTUlOX1ZBTFVFLCAxNSkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgRW5jb2RpbmdVdGlscy50ZXN0Qml0KFNob3J0Lk1JTl9WQUxVRSwgMTQpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0NCB4ID0gbmV3IE9wdDQoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYxKCkpOworICAgIHguc2V0RGVmMSgzKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMigpKTsKKworICAgIE9wdDQgY29weSA9IG5ldyBPcHQ0KHgpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBjb3B5LnVuc2V0RGVmMSgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29weS5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDMwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0MzAgeCA9IG5ldyBPcHQzMCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0NjQgeCA9IG5ldyBPcHQ2NCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworICAgIHguc2V0RGVmNjQoMjIpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmNjMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ4MCB4ID0gbmV3IE9wdDgwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisKKyAgICBPcHQ4MCBjb3B5ID0gbmV3IE9wdDgwKHgpOworICAgIGNvcHkudW5zZXREZWYxKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTFmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Eb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFUFNJTE9OID0gMC4wMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUID0KKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGxpc3QgaXRlbSBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9CisgICAgICAgICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSI7CisKKyAgICAvLyB0byBtYWtlIHN1cmUgbGlzdHMgY29udGFpbmluZyBkb3VibGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBkb3VibGVbXSBFWFBFQ1RFRF9MSVNUID0KKyAgICAgICAgICAgIHsxZCwtMTAwZCwxMDBkLDkyMjMzNzIwMzY4NTQ3NzU4MDdkLC05MjIzMzcyMDM2ODU0Nzc1ODA3ZCwzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LAorICAgICAgICAgICAgIC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzfTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0xJU1QubGVuZ3RoLCBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QsCisgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEX0xJU1RbaV0sCisgICAgICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5nZXQoaSkpLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0xJU1RbaV0sIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5nZXQoaSksIEVQU0lMT04pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgKKyAgICAgICAgLy8gICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgLy8gICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0YWJkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5SZXVzZTsKKworLy8gVGVzdHMgcmV1c2luZyBvYmplY3RzIGZvciBkZXNlcmlhbGl6YXRpb24uCisvLworcHVibGljIGNsYXNzIFRlc3RSZXVzZSBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHB1YmxpYyB2b2lkIHRlc3RSZXVzZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTZXJpYWxpemVyICAgYmluYXJ5U2VyaWFsaXplciAgID0gbmV3ICAgVFNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIFREZXNlcmlhbGl6ZXIgYmluYXJ5RGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworCisgICAgUmV1c2UgcnUxID0gbmV3IFJldXNlKCk7CisgICAgSGFzaFNldDxTdHJpbmc+IGhzMSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBieXRlW10gc2VyQnl0ZXM7ICAgIAorICAgIFN0cmluZyBzdDEgPSBuZXcgU3RyaW5nKCJzdHJpbmcxIik7CisgICAgU3RyaW5nIHN0MiA9IG5ldyBTdHJpbmcoInN0cmluZzIiKTsKKworICAgIHJ1MS5zZXRWYWwxKDExKTsKKyAgICBydTEuc2V0VmFsMihoczEpOworICAgIHJ1MS5hZGRUb1ZhbDIoc3QxKTsKKyAgICAKKyAgICBzZXJCeXRlcyA9IGJpbmFyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJ1MSk7CisKKyAgICAvLyB1cGRhdGUgaGFzaCBzZXQgYWZ0ZXIgc2VyaWFsaXphdGlvbgorICAgIGhzMS5hZGQoc3QyKTsKKworICAgIGJpbmFyeURlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShydTEsIHNlckJ5dGVzKTsKKyAgIAorICAgIGFzc2VydFRydWUoIHJ1MS5nZXRWYWwyKCkgPT0gaHMxICk7CisgICAgYXNzZXJ0VHJ1ZSggaHMxLnNpemUoKSA9PSAyICk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzgzMWU1Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNob3J0U3RhY2sgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJQUxTID0gNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9SRVBTID0gMTAwMDAwMDA7Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9wcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICBzLnB1c2goKHNob3J0KTEwKTsKLSAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTEsIHMucG9wKCkpOwotICAgIHMucHVzaCgoc2hvcnQpNDApOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBvcCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wb3AoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHMucGVlaygpOwotICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8geWF5Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHMucG9wKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R3JvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZvciAoaW50IHRyaWFsID0gMDsgdHJpYWwgPCBOVU1fVFJJQUxTOyB0cmlhbCsrKSB7Ci0gICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxMCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpNSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICB9Ci0gICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaG9ydFN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotCi0gICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3RhY2s8U2hvcnQ+IHN0ZFN0YWNrID0gbmV3IFN0YWNrPFNob3J0PigpOwotICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgTlVNX1JFUFM7IHJlcCsrKSB7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxMTEpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpNSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsdC1pbiBzdGFjazogIiArIChlbmQtc3RhcnQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKaW5kZXggZTlmMTY1ZC4uMzM3OWVkMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKQEAgLTE4LDYgKzE4LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtNDAsNiArNDQsOCBAQAogaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKIGltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU3RydWN0QTsKK2ltcG9ydCB0aHJpZnQudGVzdC5TdHJ1Y3RCOwogaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKIAogcHVibGljIGNsYXNzIFRlc3RTdHJ1Y3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CkBAIC0xOTYsMjMgKzIwMiwyOCBAQAogICAgIE1hcDxDcmF6eU5lc3RpbmcuX0ZpZWxkcywgRmllbGRNZXRhRGF0YT4gbWRNYXAgPSBDcmF6eU5lc3RpbmcubWV0YURhdGFNYXA7CiAKICAgICAvLyBDaGVjayBmb3Igc3RydWN0IGZpZWxkcyBleGlzdGVuY2UKLSAgICBhc3NlcnRFcXVhbHMoMywgbWRNYXAuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgbWRNYXAuc2l6ZSgpKTsKICAgICBhc3NlcnRUcnVlKG1kTWFwLmNvbnRhaW5zS2V5KENyYXp5TmVzdGluZy5fRmllbGRzLlNFVF9GSUVMRCkpOwogICAgIGFzc2VydFRydWUobWRNYXAuY29udGFpbnNLZXkoQ3JhenlOZXN0aW5nLl9GaWVsZHMuTElTVF9GSUVMRCkpOwogICAgIGFzc2VydFRydWUobWRNYXAuY29udGFpbnNLZXkoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU1RSSU5HX0ZJRUxEKSk7CisgICAgYXNzZXJ0VHJ1ZShtZE1hcC5jb250YWluc0tleShDcmF6eU5lc3RpbmcuX0ZpZWxkcy5CSU5BUllfRklFTEQpKTsKIAogICAgIC8vIENoZWNrIGZvciBzdHJ1Y3QgZmllbGRzIGNvbnRlbnRzCiAgICAgYXNzZXJ0RXF1YWxzKCJzdHJpbmdfZmllbGQiLCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU1RSSU5HX0ZJRUxEKS5maWVsZE5hbWUpOwogICAgIGFzc2VydEVxdWFscygibGlzdF9maWVsZCIsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5MSVNUX0ZJRUxEKS5maWVsZE5hbWUpOwogICAgIGFzc2VydEVxdWFscygic2V0X2ZpZWxkIiwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNFVF9GSUVMRCkuZmllbGROYW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoImJpbmFyeV9maWVsZCIsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5CSU5BUllfRklFTEQpLmZpZWxkTmFtZSk7CiAKICAgICBhc3NlcnRFcXVhbHMoVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5TVFJJTkdfRklFTEQpLnJlcXVpcmVtZW50VHlwZSk7CiAgICAgYXNzZXJ0RXF1YWxzKFRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLkxJU1RfRklFTEQpLnJlcXVpcmVtZW50VHlwZSk7CiAgICAgYXNzZXJ0RXF1YWxzKFRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNFVF9GSUVMRCkucmVxdWlyZW1lbnRUeXBlKTsKIAogICAgIGFzc2VydEVxdWFscyhUVHlwZS5TVFJJTkcsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5TVFJJTkdfRklFTEQpLnZhbHVlTWV0YURhdGEudHlwZSk7CisgICAgYXNzZXJ0RmFsc2UobWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNUUklOR19GSUVMRCkudmFsdWVNZXRhRGF0YS5pc0JpbmFyeSgpKTsKICAgICBhc3NlcnRFcXVhbHMoVFR5cGUuTElTVCwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLkxJU1RfRklFTEQpLnZhbHVlTWV0YURhdGEudHlwZSk7CiAgICAgYXNzZXJ0RXF1YWxzKFRUeXBlLlNFVCwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNFVF9GSUVMRCkudmFsdWVNZXRhRGF0YS50eXBlKTsKKyAgICBhc3NlcnRFcXVhbHMoVFR5cGUuU1RSSU5HLCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuQklOQVJZX0ZJRUxEKS52YWx1ZU1ldGFEYXRhLnR5cGUpOworICAgIGFzc2VydFRydWUobWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLkJJTkFSWV9GSUVMRCkudmFsdWVNZXRhRGF0YS5pc0JpbmFyeSgpKTsKIAogICAgIC8vIENoZWNrIG5lc3RlZCBzdHJ1Y3R1cmVzCiAgICAgYXNzZXJ0VHJ1ZShtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuTElTVF9GSUVMRCkudmFsdWVNZXRhRGF0YS5pc0NvbnRhaW5lcigpKTsKQEAgLTI5Niw0ICszMDcsOTAgQEAKICAgICBhc3NlcnRFcXVhbHMoIkphdmFUZXN0SGVscGVyKHJlcV9pbnQ6MCwgcmVxX29iajosIHJlcV9iaW46KSIsIAogICAgICAgICBvYmplY3QudG9TdHJpbmcoKSk7CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgeworICAgIGlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGJ5dGUgYXJyYXkgZGlkIG5vdCBtYXRjaCBhY3R1YWwuIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAKKyAgICBmaW5hbCBTdHJpbmcgdGVzdFN0cmluZyA9ICJ0ZXN0Qnl0ZXNCdWZmZXJGZWF0dXJlcyI7CisgICAgZmluYWwgSmF2YVRlc3RIZWxwZXIgbyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOworCisgICAgby5zZXRSZXFfYmluKChCeXRlQnVmZmVyKW51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRSZXFfYmluKEJ5dGVCdWZmZXIud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2JpbigoYnl0ZVtdKW51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRSZXFfYmluKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBudWxsKTsKKyAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBudWxsKTsKKyAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIEJ5dGVCdWZmZXIud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RKYXZhU2VyaWFsaXphYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgCisgICAgT25lT2ZFYWNoIG9vZSA9IEZpeHR1cmVzLm9uZU9mRWFjaDsKKworICAgIC8vIFNlcmlhbGl6ZSBvb2UgdGhlIEphdmEgd2F5Li4uCisgICAgb29zLndyaXRlT2JqZWN0KG9vZSk7CisgICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICAvLyBBdHRlbXB0IHRvIGRlc2VyaWFsaXplIGl0CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkKTsKKyAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgT25lT2ZFYWNoIG9vZTIgPSAoT25lT2ZFYWNoKSBvaXMucmVhZE9iamVjdCgpOworCisgICAgYXNzZXJ0RXF1YWxzKG9vZSwgb29lMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3ViU3RydWN0VmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cnVjdEEgdmFsaWQgPSBuZXcgU3RydWN0QSgidmFsaWQiKTsKKyAgICBTdHJ1Y3RBIGludmFsaWQgPSBuZXcgU3RydWN0QSgpOworCisgICAgU3RydWN0QiBiID0gbmV3IFN0cnVjdEIoKTsKKyAgICB0cnkgeworICAgICAgYi52YWxpZGF0ZSgpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgLy8gZXhwZWN0ZWQKKyAgICB9CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYih2YWxpZCk7CisgICAgYi52YWxpZGF0ZSgpOworCisgICAgYiA9IG5ldyBTdHJ1Y3RCKCkuc2V0QWIoaW52YWxpZCk7CisgICAgdHJ5IHsKKyAgICAgIGIudmFsaWRhdGUoKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGV4cGVjdGVkCisgICAgfQorCisgICAgYiA9IG5ldyBTdHJ1Y3RCKCkuc2V0QWIodmFsaWQpLnNldEFhKGludmFsaWQpOworICAgIHRyeSB7CisgICAgICBiLnZhbGlkYXRlKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRCYXNlSGVscGVyLmphdmEKaW5kZXggNmYyNDA5My4uOGIwODU1NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0xMzksNCArMTQwLDcwIEBACiAgICAgYi5hZGQobmV3IGJ5dGVbXXsnYScsJ2InLCAnYSd9KTsKICAgICBhc3NlcnRUcnVlKFRCYXNlSGVscGVyLmNvbXBhcmVUbyhhLCBiKSA+IDApOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVCdWZmZXJUb0J5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBiMSA9IHsxMCw5LDgsNyw2LDUsNCwzLDIsMSwwfTsKKyAgICBieXRlW10gYjIgPSBUQmFzZUhlbHBlci5ieXRlQnVmZmVyVG9CeXRlQXJyYXkoQnl0ZUJ1ZmZlci53cmFwKGIxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJiMSBhbmQgYjIgc2hvdWxkIGJlIHRoZSBleGFjdCBzYW1lIGFycmF5IChpZGVudGl0eSkgZHVlIHRvIGZhc3QgcGF0aCIsIGIxLCBiMik7CisKKyAgICBieXRlW10gYjMgPSBUQmFzZUhlbHBlci5ieXRlQnVmZmVyVG9CeXRlQXJyYXkoQnl0ZUJ1ZmZlci53cmFwKGIxLCAxLCAzKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIGIzLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSwgMSwgMyksIEJ5dGVCdWZmZXIud3JhcChiMykpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJpZ2h0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydE51bGwoVEJhc2VIZWxwZXIucmlnaHRTaXplKG51bGwpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlQnVmZmVyVG9TdHJpbmcoKSB7CisgICAgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbXXsxLCAyLCAzfTsKKyAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCAxLCAyKTsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBUQmFzZUhlbHBlci50b1N0cmluZyhiYiwgc2IpOworICAgIGFzc2VydEVxdWFscygiMDIgMDMiLCBzYi50b1N0cmluZygpKTsKKyAgICBiYiA9IEJ5dGVCdWZmZXIud3JhcChhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKKyAgICBiYi5wb3NpdGlvbigxKTsKKyAgICBiYiA9IGJiLnNsaWNlKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJiLmFycmF5T2Zmc2V0KCkpOworICAgIGFzc2VydEVxdWFscygwLCBiYi5wb3NpdGlvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgYmIubGltaXQoKSk7CisgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIFRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgYXNzZXJ0RXF1YWxzKCIwMiAwMyIsIHNiLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvcHlCaW5hcnlXaXRoQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW117MCwgMSwgMiwgMywgNCwgNX07CisgICAgQnl0ZUJ1ZmZlciBiID0gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKTsKKyAgICBCeXRlQnVmZmVyIGJDb3B5ID0gVEJhc2VIZWxwZXIuY29weUJpbmFyeShiKTsKKyAgICBhc3NlcnRFcXVhbHMoYiwgYkNvcHkpOworICAgIGFzc2VydEVxdWFscygwLCBiLnBvc2l0aW9uKCkpOworCisgICAgYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoNik7CisgICAgYi5wdXQoYnl0ZXMpOworICAgIGIucG9zaXRpb24oMCk7CisgICAgYkNvcHkgPSBUQmFzZUhlbHBlci5jb3B5QmluYXJ5KGIpOworICAgIGFzc2VydEVxdWFscyg2LCBiLnJlbWFpbmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYi5wb3NpdGlvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoYiwgYkNvcHkpOworCisgICAgYi5tYXJrKCk7CisgICAgYi5nZXQoKTsKKyAgICBiQ29weSA9IFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoYik7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChieXRlcywgMSwgNSksIGJDb3B5KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYi5wb3NpdGlvbigpKTsKKyAgICBiLnJlc2V0KCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGIucG9zaXRpb24oKSk7CisKKyAgICBhc3NlcnROdWxsKFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKEJ5dGVCdWZmZXIpbnVsbCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvcHlCaW5hcnlXaXRoQnl0ZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXswLCAxLCAyLCAzLCA0LCA1fTsKKyAgICBieXRlW10gY29weSA9IFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoYnl0ZXMpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYnl0ZXMpLCBCeXRlQnVmZmVyLndyYXAoY29weSkpOworICAgIGFzc2VydE5vdFNhbWUoYnl0ZXMsIGNvcHkpOworCisgICAgYXNzZXJ0TnVsbChUQmFzZUhlbHBlci5jb3B5QmluYXJ5KChieXRlW10pbnVsbCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RURGVzZXJpYWxpemVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RURGVzZXJpYWxpemVyLmphdmEKaW5kZXggMWYxNDFiZC4uYTRhMzUzZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VERlc2VyaWFsaXplci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFREZXNlcmlhbGl6ZXIuamF2YQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZyA9IGRlc2VyaWFsaXplci5wYXJ0aWFsRGVzZXJpYWxpemVTdHJpbmcoc2VyaWFsaXplKGxldmVsMVNXVSwgZmFjdG9yeSksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfRklFTEQsIE9uZU9mRWFjaC5fRmllbGRzLlNPTUVfQ0hBUkFDVEVSUyk7CiAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHJlc3VsdFN0cmluZyk7CiAKLSAgICAgIGJ5dGVbXSBleHBlY3RlZEJpbmFyeSA9IGxldmVsM09uZU9mRWFjaC5nZXRCYXNlNjQoKS5hcnJheSgpOworICAgICAgYnl0ZVtdIGV4cGVjdGVkQmluYXJ5ID0gbGV2ZWwzT25lT2ZFYWNoLmdldEJhc2U2NCgpOwogICAgICAgQnl0ZUJ1ZmZlciByZXN1bHRCaW5hcnkgPSBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplQnl0ZUFycmF5KHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBPbmVPZkVhY2guX0ZpZWxkcy5CQVNFNjQpOwogICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQmluYXJ5Lmxlbmd0aCwgcmVzdWx0QmluYXJ5LmxpbWl0KCkgLSByZXN1bHRCaW5hcnkucG9zaXRpb24oKSAtIHJlc3VsdEJpbmFyeS5hcnJheU9mZnNldCgpKTsKICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoZXhwZWN0ZWRCaW5hcnkpLCByZXN1bHRCaW5hcnkpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEVudW1IZWxwZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRFbnVtSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjY2E0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRFbnVtSGVscGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEVudW1IZWxwZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEdldEJ5VmFsdWVfVmFsaWRWYWx1ZXMoKSB7CisgICAgZm9yIChOdW1iZXJ6IG46IE51bWJlcnoudmFsdWVzKCkpIHsKKyAgICAgIGludCB2YWx1ZSA9IG4uZ2V0VmFsdWUoKTsKKyAgICAgIGFzc2VydEVxdWFscyhuLCBURW51bUhlbHBlci5nZXRCeVZhbHVlKE51bWJlcnouY2xhc3MsIHZhbHVlKSk7CisgICAgfSAKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeVZhbHVlX0ludmFsaWRWYWx1ZSgpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgVEVudW1IZWxwZXIuZ2V0QnlWYWx1ZShOdW1iZXJ6LmNsYXNzLCAwKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnlWYWx1ZV9JbnZhbGlkQ2xhc3MoKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFRFbnVtSGVscGVyLmdldEJ5VmFsdWUoVEVudW0uY2xhc3MsIDApKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VFVuaW9uLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQppbmRleCBiNjAzMmNjLi5mMWU2ZjBlIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQpAQCAtMTgsOCArMTgsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yOSw2ICszNCw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFyYWJsZVVuaW9uOwpAQCAtNDUsNiArNTEsNyBAQAogICAgIFRlc3RVbmlvbiB1bmlvbiA9IG5ldyBUZXN0VW5pb24oKTsKIAogICAgIGFzc2VydEZhbHNlKHVuaW9uLmlzU2V0KCkpOworICAgIGFzc2VydEZhbHNlKHVuaW9uLmlzU2V0STMyX2ZpZWxkKCkpOwogICAgIGFzc2VydE51bGwodW5pb24uZ2V0RmllbGRWYWx1ZSgpKTsKIAogICAgIHVuaW9uID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5JMzJfRklFTEQsIDI1KTsKQEAgLTUyLDYgKzU5LDggQEAKICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgdW5pb24uZ2V0RmllbGRWYWx1ZSgpKTsKICAgCiAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIHVuaW9uLmdldEZpZWxkVmFsdWUoVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxEKSk7CisgICAgCisgICAgYXNzZXJ0VHJ1ZSh1bmlvbi5pc1NldEkzMl9maWVsZCgpKTsKICAgCiAgICAgdHJ5IHsKICAgICAgIHVuaW9uLmdldEZpZWxkVmFsdWUoVGVzdFVuaW9uLl9GaWVsZHMuU1RSSU5HX0ZJRUxEKTsKQEAgLTY5LDYgKzc4LDggQEAKICAgICBhc3NlcnRFcXVhbHMoMSwgdW5pb24uZ2V0STMyX2ZpZWxkKCkpOwogICAgIHVuaW9uLmhhc2hDb2RlKCk7CiAKKyAgICBhc3NlcnRGYWxzZSh1bmlvbi5pc1NldFN0cmluZ19maWVsZCgpKTsKKyAgICAKICAgICB0cnkgewogICAgICAgdW5pb24uZ2V0U3RyaW5nX2ZpZWxkKCk7CiAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CkBAIC0xNDMsNiArMTU0LDcgQEAKIAogICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgIFRlc3RVbmlvbiB1bmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxELCAyNSk7CisgICAgdW5pb24uc2V0STMyX3NldChDb2xsZWN0aW9ucy5zaW5nbGV0b24oNDIpKTsKIAogICAgIFRNZW1vcnlCdWZmZXIgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CiAgICAgVFByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbChidWYpOwpAQCAtMTc0LDYgKzE4Niw0MSBAQAogICAgIHN3YXUud3JpdGUocHJvdG8pOwogICAgIG5ldyBFbXB0eSgpLnJlYWQocHJvdG8pOwogICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVQcm90b2NvbFNlcmlhbGl6YXRpb24gKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFVuaW9uIHVuaW9uID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5JMzJfRklFTEQsIDI1KTsKKyAgICB1bmlvbi5zZXRJMzJfc2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbig0MikpOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBUUHJvdG9jb2wgcHJvdG8gPSBuZXcgVFR1cGxlUHJvdG9jb2woYnVmKTsKKworICAgIHVuaW9uLndyaXRlKHByb3RvKTsKKworICAgIFRlc3RVbmlvbiB1MiA9IG5ldyBUZXN0VW5pb24oKTsKKworICAgIHUyLnJlYWQocHJvdG8pOworCisgICAgYXNzZXJ0RXF1YWxzKHUyLCB1bmlvbik7CisKKyAgICBTdHJ1Y3RXaXRoQVVuaW9uIHN3YXUgPSBuZXcgU3RydWN0V2l0aEFVbmlvbih1Mik7CisKKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKTsKKworICAgIHN3YXUud3JpdGUocHJvdG8pOworCisgICAgU3RydWN0V2l0aEFVbmlvbiBzd2F1MiA9IG5ldyBTdHJ1Y3RXaXRoQVVuaW9uKCk7CisgICAgYXNzZXJ0RmFsc2Uoc3dhdTIuZXF1YWxzKHN3YXUpKTsKKyAgICBzd2F1Mi5yZWFkKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoc3dhdTIsIHN3YXUpOworCisgICAgLy8gdGhpcyBzaG91bGQgTk9UIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBwcm90byA9IG5ldyBUVHVwbGVQcm90b2NvbChidWYpOworCisgICAgc3dhdS53cml0ZShwcm90byk7CisgICAgbmV3IEVtcHR5KCkucmVhZChwcm90byk7CisgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0U2tpcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIFRlc3RVbmlvbiB0dSA9IFRlc3RVbmlvbi5zdHJpbmdfZmllbGQoInN0cmluZyIpOwpAQCAtMTgzLDQgKzIzMCwzOSBAQAogICAgIGFzc2VydE51bGwodHVtcy5nZXRTZXRGaWVsZCgpKTsKICAgICBhc3NlcnROdWxsKHR1bXMuZ2V0RmllbGRWYWx1ZSgpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWVwQ29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IHsxLCAyLCAzfTsKKyAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKTsKKyAgICBDb21wYXJhYmxlVW5pb24gY3UgPSBDb21wYXJhYmxlVW5pb24uYmluYXJ5X2ZpZWxkKHZhbHVlKTsKKyAgICBDb21wYXJhYmxlVW5pb24gY29weSA9IGN1LmRlZXBDb3B5KCk7CisgICAgYXNzZXJ0RXF1YWxzKGN1LCBjb3B5KTsKKyAgICBhc3NlcnROb3RTYW1lKGN1LmJ1ZmZlckZvckJpbmFyeV9maWVsZCgpLmFycmF5KCksIGNvcHkuYnVmZmVyRm9yQmluYXJ5X2ZpZWxkKCkuYXJyYXkoKSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IHsxLCAyLCAzfTsKKyAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKTsKKyAgICBDb21wYXJhYmxlVW5pb24gY3UgPSBDb21wYXJhYmxlVW5pb24uYmluYXJ5X2ZpZWxkKHZhbHVlKTsKKyAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiPENvbXBhcmFibGVVbmlvbiBiaW5hcnlfZmllbGQ6MDEgMDIgMDM+IjsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIGN1LnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEphdmFTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAKKyAgICBUZXN0VW5pb24gdHUgPSBUZXN0VW5pb24uc3RyaW5nX2ZpZWxkKCJzdHJpbmciKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0dSB0aGUgSmF2YSB3YXkuLi4KKyAgICBvb3Mud3JpdGVPYmplY3QodHUpOworICAgIGJ5dGVbXSBzZXJpYWxpemVkID0gYmFvcy50b0J5dGVBcnJheSgpOworCisgICAgLy8gQXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBpdAorICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2VyaWFsaXplZCk7CisgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgIFRlc3RVbmlvbiB0dTIgPSAoVGVzdFVuaW9uKSBvaXMucmVhZE9iamVjdCgpOworCisgICAgYXNzZXJ0RXF1YWxzKHR1LCB0dTIpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZjMjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuU2FmZUJ5dGVzOworaW1wb3J0IHRocmlmdC50ZXN0LlVuc2FmZUJ5dGVzOworCisvLyAgdGVzdCBnZW5lcmF0aW5nIHR5cGVzIHdpdGggdW4tY29waWVkIGJ5dGVbXS9CeXRlQnVmZmVyIGlucHV0L291dHB1dAorLy8KK3B1YmxpYyBjbGFzcyBUZXN0VW5zYWZlQmluYXJpZXMgZXh0ZW5kcyBUZXN0U3RydWN0IHsKKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gaW5wdXQoKSB7CisgICAgcmV0dXJuIG5ldyBieXRlW117MSwgMX07CisgIH0KKworICAvLworICAvLyAgdmVyaWZ5IHRoYXQgdGhlIHVuc2FmZV9iaW5hcmllcyBvcHRpb24gbW9kaWZpZXMgYmVoYXZpb3IKKyAgLy8KKworICAvLyAgY29uc3RydWN0b3IgZG9lc24ndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBnZXR0ZXIgZG9lc24ndCBjb3B5CisgIC8vICBub3RlOiB0aGlzIGJlaGF2aW9yIGlzIHRoZSBzYW1lIHdpdGgvd2l0aG91dCB0aGUgZmxhZywgYnV0IGlmIHRoaXMgZGVmYXVsdCBldmVyIGNoYW5nZXMsIHRoZSBjdXJyZW50IGJlaGF2aW9yCisgIC8vICAgICAgICBzaG91bGQgYmUgcmV0YWluZWQgd2hlbiB1c2luZyB0aGlzIGZsYWcKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUdldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgYnl0ZVtdIHZhbCA9IHN0cnVjdC5nZXRCeXRlcygpOworICAgIHZhbFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBzZXR0ZXIgZG9lc24ndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVTZXR0ZXIoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoKTsKKworICAgIGJ5dGVbXSB2YWwgPSBpbnB1dCgpOworICAgIHN0cnVjdC5zZXRCeXRlcyh2YWwpOworCisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGJ1ZmZlciBkb2Vucyd0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUJ1ZmZlckZvcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgQnl0ZUJ1ZmZlciB2YWwgPSBzdHJ1Y3QuYnVmZmVyRm9yQnl0ZXMoKTsKKyAgICB2YWwuYXJyYXkoKVswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgZGVmYXVsdCBnZW5lcmF0b3IgZG9lcyBub3QgY2hhbmdlIGJlaGF2aW9yCisgIC8vCisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVDb25zdHJ1Y3RvcigpIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlU2V0dGVyKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVCdWZmZXJGb3IoKXsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgQnl0ZUJ1ZmZlciB2YWwgPSBzdHJ1Y3QuYnVmZmVyRm9yQnl0ZXMoKTsKKyAgICB2YWwuYXJyYXkoKVswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmNhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnQuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKK2ltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEFzeW5jQ2xpZW50IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0UmFpc2VzRXhjZXB0aW9uV2hlblVzZWRDb25jdXJyZW50bHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUQXN5bmNDbGllbnRNYW5hZ2VyIG1vY2tDbGllbnRNYW5hZ2VyID0gbmV3IFRBc3luY0NsaWVudE1hbmFnZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGNhbGwoVEFzeW5jTWV0aG9kQ2FsbCBtZXRob2QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgfQorICAgIH07CisKKyAgICBTcnYuQXN5bmNDbGllbnQgYyA9IG5ldyBBc3luY0NsaWVudChudWxsLCBtb2NrQ2xpZW50TWFuYWdlciwgbnVsbCk7CisgICAgYy5KYW5reSgwLCBudWxsKTsKKyAgICB0cnkgeworICAgICAgYy5jaGVja1JlYWR5KCk7CisgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBoaXQgYW4gZXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGF3ZXNvbWUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQppbmRleCAyNTM1MDY3Li5jNDgzY2YyIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0xOCw1MCArMTgsMjczIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJUZXN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVEhzSGFTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyLkFyZ3M7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU29ja2V0OwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRXhjZXB0aW9uV2l0aEFNYXA7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0LlNydi5JZmFjZTsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQub25ld2F5TWV0aG9kX2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50LnZvaWRNZXRob2RfY2FsbDsKIAogcHVibGljIGNsYXNzIFRlc3RUQXN5bmNDbGllbnRNYW5hZ2VyIGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWlsdXJlTGVzc0NhbGxiYWNrPFQgZXh0ZW5kcyBUQXN5bmNNZXRob2RDYWxsPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgZmFpbCgidW5leHBlY3RlZCBlcnJvciAiICsgdGhyb3dhYmxlKTsKKworICBwcml2YXRlIFRIc0hhU2VydmVyIHNlcnZlcl87CisgIHByaXZhdGUgVGhyZWFkIHNlcnZlclRocmVhZF87CisgIHByaXZhdGUgVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyXzsKKworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHNlcnZlcl8gPSBuZXcgVEhzSGFTZXJ2ZXIobmV3IEFyZ3MobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldCgKKyAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKSkuCisgICAgICBwcm9jZXNzb3IobmV3IFNydi5Qcm9jZXNzb3IobmV3IFNydkhhbmRsZXIoKSkpKTsKKyAgICBzZXJ2ZXJUaHJlYWRfID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHNlcnZlcl8uc2VydmUoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBzZXJ2ZXJUaHJlYWRfLnN0YXJ0KCk7CisgICAgY2xpZW50TWFuYWdlcl8gPSBuZXcgVEFzeW5jQ2xpZW50TWFuYWdlcigpOworICAgIFRocmVhZC5zbGVlcCg1MDApOworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJfLnN0b3AoKTsKKyAgICBjbGllbnRNYW5hZ2VyXy5zdG9wKCk7CisgICAgc2VydmVyVGhyZWFkXy5qb2luKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgIGJhc2ljQ2FsbChjbGllbnQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJhc2ljQ2FsbFdpdGhUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgIGNsaWVudC5zZXRUaW1lb3V0KDUwMDApOworICAgIGJhc2ljQ2FsbChjbGllbnQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXJyb3JDYWxsVGVzdDxDIGV4dGVuZHMgVEFzeW5jQ2xpZW50LCBSPiB7CisgICAgZmluYWwgdm9pZCBydW5UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+IGVycm9yID0gbmV3IEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+KCk7CisgICAgICBDIGNsaWVudCA9IGV4ZWN1dGVFcnJvcmluZ0NhbGwobmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFIgcmVzcG9uc2UpIHsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICBlcnJvci5zZXQoZXhjZXB0aW9uKTsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBsYXRjaC5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOworICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGVycm9yLmdldCgpOworICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOworICAgICAgYXNzZXJ0U2FtZShleGNlcHRpb24sIGNsaWVudC5nZXRFcnJvcigpKTsKKyAgICAgIHZhbGlkYXRlRXJyb3IoY2xpZW50LCBleGNlcHRpb24pOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgY2FsbCB0aGF0IGlzIGV4cGVjdGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdGVzdGluZyBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBpbnN0YWxsZWQuCisgICAgICogQHJldHVybiBUaGUgY2xpZW50IHRoZSBjYWxsIHdhcyBtYWRlIGFnYWluc3QuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBzZXR0aW5nIHVwIHRoZSBjbGllbnQgb3IgbWFraW5nIHRoZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IEMgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPFI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRnVydGhlciB2YWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVycm9yIHJhaXNlZCBpbiB0aGUgcmVtb3RlIGNhbGwgYW5kIHRoZSBzdGF0ZSBvZiB0aGUKKyAgICAgKiBjbGllbnQgYWZ0ZXIgdGhhdCBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHJldHVybmVkIGZyb20ge0BsaW5rICNleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2spfS4KKyAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIHJlbW90ZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVFcnJvcihDIGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmV4cGVjdGVkUmVtb3RlRXhjZXB0aW9uQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5kZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZChmYWxzZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QodHJ1ZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25XaXRoQU1hcC5jbGFzcywgZXJyb3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEV4Y2VwdGlvbldpdGhBTWFwIGV4Y2VwdGlvbldpdGhBTWFwID0gKEV4Y2VwdGlvbldpdGhBTWFwKSBlcnJvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibGFoIiwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0QmxhaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBleGNlcHRpb25XaXRoQU1hcC5nZXRNYXBfZmllbGQoKSk7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEludGVnZXI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOworICAgICAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RWb2lkQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgIGNsaWVudC52b2lkTWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFZvaWQgcmVzcG9uc2UpIHsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBsYXRjaC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXlDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICB9CisgICAgfSk7CisgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgYXNzZXJ0VHJ1ZShyZXR1cm5lZC5nZXQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWxsZWxDYWxscygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIG1ha2UgbXVsdGlwbGUgY2FsbHMgd2l0aCBkZXNlcmlhbGl6YXRpb24gaW4gdGhlIHNlbGVjdG9yIHRocmVhZCAocmVwcm8gRXJpYydzIGlzc3VlKQorICAgIGludCBudW1UaHJlYWRzID0gNTA7CisgICAgaW50IG51bUNhbGxzUGVyVGhyZWFkID0gMTAwOworICAgIExpc3Q8SmFua3lSdW5uYWJsZT4gcnVubmFibGVzID0gbmV3IEFycmF5TGlzdDxKYW5reVJ1bm5hYmxlPigpOworICAgIExpc3Q8VGhyZWFkPiB0aHJlYWRzID0gbmV3IEFycmF5TGlzdDxUaHJlYWQ+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspIHsKKyAgICAgIEphbmt5UnVubmFibGUgcnVubmFibGUgPSBuZXcgSmFua3lSdW5uYWJsZShudW1DYWxsc1BlclRocmVhZCk7CisgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChydW5uYWJsZSk7CisgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgIHRocmVhZHMuYWRkKHRocmVhZCk7CisgICAgICBydW5uYWJsZXMuYWRkKHJ1bm5hYmxlKTsKKyAgICB9CisgICAgZm9yIChUaHJlYWQgdGhyZWFkIDogdGhyZWFkcykgeworICAgICAgdGhyZWFkLmpvaW4oKTsKKyAgICB9CisgICAgaW50IG51bVN1Y2Nlc3NlcyA9IDA7CisgICAgZm9yIChKYW5reVJ1bm5hYmxlIHJ1bm5hYmxlIDogcnVubmFibGVzKSB7CisgICAgICBudW1TdWNjZXNzZXMgKz0gcnVubmFibGUuZ2V0TnVtU3VjY2Vzc2VzKCk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhudW1UaHJlYWRzICogbnVtQ2FsbHNQZXJUaHJlYWQsIG51bVN1Y2Nlc3Nlcyk7CisgIH0KKworICBwcml2YXRlIFNydi5Bc3luY0NsaWVudCBnZXRDbGllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFROb25ibG9ja2luZ1NvY2tldCBjbGllbnRTb2NrZXQgPSBuZXcgVE5vbmJsb2NraW5nU29ja2V0KFNlcnZlclRlc3RCYXNlLkhPU1QsIFNlcnZlclRlc3RCYXNlLlBPUlQpOworICAgIHJldHVybiBuZXcgU3J2LkFzeW5jQ2xpZW50KG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBjbGllbnRNYW5hZ2VyXywgY2xpZW50U29ja2V0KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBiYXNpY0NhbGwoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBjbGllbnQuSmFua3koMSwgbmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSW50ZWdlciByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuaW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3RyaW5nV3JpdGVyIHNpbmsgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc2luaywgdHJ1ZSkpOworICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgb25FcnJvciB3aXRoIGV4Y2VwdGlvbiAiICsgc2luay50b1N0cmluZygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGxhdGNoLmF3YWl0KDEwMCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgYXNzZXJ0VHJ1ZShyZXR1cm5lZC5nZXQoKSk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU3J2SGFuZGxlciBpbXBsZW1lbnRzIElmYWNlIHsKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgZm9yIGEgc3RhbmRhcmQgY2FsbCB0ZXN0aW5nCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBKYW5reShpbnQgYXJnKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXJnKTsKICAgICAgIHJldHVybiAzOwogICAgIH0KIAorICAgIC8vIFVzaW5nIHRoaXMgbWV0aG9kIGZvciB0aW1lb3V0IHRlc3RpbmcgLSBzbGVlcHMgZm9yIDEgc2Vjb25kIGJlZm9yZSByZXR1cm5pbmcKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoaW50IHNvbWV0aGluZykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHB1YmxpYyBpbnQgcHJpbWl0aXZlTWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBwcmltaXRpdmVNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcHVibGljIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKGludCBzb21ldGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qgc3RydWN0TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNzUsMjAwICsyOTgsODEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvd0RlY2xhcmVkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2hvdWxkVGhyb3dEZWNsYXJlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uV2l0aEFNYXAoImJsYWgiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCEiKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBKYW5reVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHByaXZhdGUgVEFzeW5jQ2xpZW50TWFuYWdlciBhY21fOworCisgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhaWx1cmVMZXNzQ2FsbGJhY2s8VD4gaW1wbGVtZW50cyBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgIGZhaWwoZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWwoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKKyAgICBmYWlsKCJ1bmV4cGVjdGVkIGVycm9yICIgKyBzaW5rLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBKYW5reVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewogICAgIHByaXZhdGUgaW50IG51bUNhbGxzXzsKICAgICBwcml2YXRlIGludCBudW1TdWNjZXNzZXNfID0gMDsKICAgICBwcml2YXRlIFNydi5Bc3luY0NsaWVudCBjbGllbnRfOwotICAgIHByaXZhdGUgVE5vbmJsb2NraW5nU29ja2V0IGNsaWVudFNvY2tldF87Ci0gICAgCi0gICAgcHVibGljIEphbmt5UnVubmFibGUoVEFzeW5jQ2xpZW50TWFuYWdlciBhY20sIGludCBudW1DYWxscykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmFjbV8gPSBhY207Ci0gICAgICB0aGlzLm51bUNhbGxzXyA9IG51bUNhbGxzOwotICAgICAgdGhpcy5jbGllbnRTb2NrZXRfID0gbmV3IFROb25ibG9ja2luZ1NvY2tldCgibG9jYWxob3N0IiwgMTIzNDUpOwotICAgICAgdGhpcy5jbGllbnRfID0gbmV3IFNydi5Bc3luY0NsaWVudChuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgYWNtXywgY2xpZW50U29ja2V0Xyk7CisKKyAgICBwdWJsaWMgSmFua3lSdW5uYWJsZShpbnQgbnVtQ2FsbHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgbnVtQ2FsbHNfID0gbnVtQ2FsbHM7CisgICAgICBjbGllbnRfID0gZ2V0Q2xpZW50KCk7CisgICAgICBjbGllbnRfLnNldFRpbWVvdXQoMjAwMDApOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtU3VjY2Vzc2VzKCkgewogICAgICAgcmV0dXJuIG51bVN1Y2Nlc3Nlc187CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYWxsc187IGkrKykgewotICAgICAgICB0cnkgeyAgICAgICAgICAKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FsbHNfICYmICFjbGllbnRfLmhhc0Vycm9yKCk7IGkrKykgeworICAgICAgICBmaW5hbCBpbnQgaXRlcmF0aW9uID0gaTsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAvLyBjb25uZWN0IGFuIGFzeW5jIGNsaWVudAotICAgICAgICAgIGZpbmFsIE9iamVjdCBvID0gbmV3IE9iamVjdCgpOwotICAgICAgICAgIAotICAgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gamFua3lSZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFNydi5Bc3luY0NsaWVudC5KYW5reV9jYWxsPigpIHsKKyAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgIGNsaWVudF8uSmFua3koMSwgbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CisKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShKYW5reV9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3BvbnNlLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgICAgICBqYW5reVJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobykgewotICAgICAgICAgICAgICAgICAgby5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgICAgICAgICAgICAgIG8ubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3VsdCkgeworICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmludFZhbHVlKCkpOworICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgICAgICAgIHN5bmNocm9uaXplZChvKSB7Ci0gICAgICAgICAgICAgICAgby5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIG9uRXJyb3Igb24gaXRlcmF0aW9uICIgKyBpdGVyYXRpb24gKyAiOiAiICsgc2luay50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIHRocm93YWJsZSk7ICAgICAgICAgICAgIAogICAgICAgICAgICAgfQogICAgICAgICAgIH0pOwotICAgICAgCi0gICAgICAgICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgICAgICAgIG8ud2FpdCgxMDAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reVJldHVybmVkLmdldCgpKTsKKworICAgICAgICAgIGJvb2xlYW4gY2FsbGVkQmFjayA9IGxhdGNoLmF3YWl0KDMwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICBhc3NlcnRUcnVlKCJ3YXNuJ3QgY2FsbGVkIGJhY2sgaW4gdGltZSBvbiBpdGVyYXRpb24gIiArIGl0ZXJhdGlvbiwgY2FsbGVkQmFjayk7CisgICAgICAgICAgYXNzZXJ0VHJ1ZSgib25Db21wbGV0ZSBub3QgY2FsbGVkIG9uIGl0ZXJhdGlvbiAiICsgaXRlcmF0aW9uLCByZXR1cm5lZC5nZXQoKSk7CiAgICAgICAgICAgdGhpcy5udW1TdWNjZXNzZXNfKys7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCAiICsgZSk7CisgICAgICAgICAgZmFpbChlKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIHB1dCB1cCBhIHNlcnZlcgotICAgIGZpbmFsIFROb25ibG9ja2luZ1NlcnZlciBzID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihuZXcgU3J2LlByb2Nlc3NvcihuZXcgU3J2SGFuZGxlcigpKSwgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldCgxMjM0NSkpOwotICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHMuc2VydmUoKTsKLSAgICAgIH0KLSAgICB9KS5zdGFydCgpOwotICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLQotICAgIC8vIHNldCB1cCBhc3luYyBjbGllbnQgbWFuYWdlcgotICAgIFRBc3luY0NsaWVudE1hbmFnZXIgYWNtID0gbmV3IFRBc3luY0NsaWVudE1hbmFnZXIoKTsKLQotICAgIC8vIGNvbm5lY3QgYW4gYXN5bmMgY2xpZW50Ci0gICAgVE5vbmJsb2NraW5nU29ja2V0IGNsaWVudFNvY2sgPSBuZXcgVE5vbmJsb2NraW5nU29ja2V0KCJsb2NhbGhvc3QiLCAxMjM0NSk7Ci0gICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IG5ldyBTcnYuQXN5bmNDbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGFjbSwgY2xpZW50U29jayk7Ci0KLSAgICBmaW5hbCBPYmplY3QgbyA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8vIG1ha2UgYSBzdGFuZGFyZCBtZXRob2QgY2FsbAotICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gamFua3lSZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICBjbGllbnQuSmFua3koMSwgbmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8U3J2LkFzeW5jQ2xpZW50Lkphbmt5X2NhbGw+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgIGphbmt5UmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZChvKSB7Ci0gICAgICAgICAgby5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgIG8ud2FpdCgxMDAwMDApOwotICAgIH0KLSAgICBhc3NlcnRUcnVlKGphbmt5UmV0dXJuZWQuZ2V0KCkpOwotCi0gICAgLy8gbWFrZSBhIHZvaWQgbWV0aG9kIGNhbGwKLSAgICBmaW5hbCBBdG9taWNCb29sZWFuIHZvaWRNZXRob2RSZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICBjbGllbnQudm9pZE1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsPigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSh2b2lkTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICB2b2lkTWV0aG9kUmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChvKSB7Ci0gICAgICAgICAgby5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgIG8ud2FpdCgxMDAwKTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZSh2b2lkTWV0aG9kUmV0dXJuZWQuZ2V0KCkpOwotIAotICAgIC8vIG1ha2UgYSBvbmV3YXkgbWV0aG9kIGNhbGwKLSAgICBmaW5hbCBBdG9taWNCb29sZWFuIG9uZXdheVJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8b25ld2F5TWV0aG9kX2NhbGw+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKG9uZXdheU1ldGhvZF9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgb25ld2F5UmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgICAgICBvLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgc3luY2hyb25pemVkKG8pIHsKLSAgICAgIG8ud2FpdCgxMDAwKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRUcnVlKG9uZXdheVJldHVybmVkLmdldCgpKTsKLQotICAgIC8vIG1ha2UgYW5vdGhlciBzdGFuZGFyZCBtZXRob2QgY2FsbAotICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gdm9pZEFmdGVyT25ld2F5UmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8dm9pZE1ldGhvZF9jYWxsPigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSh2b2lkTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICB2b2lkQWZ0ZXJPbmV3YXlSZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQobykgewotICAgICAgICAgIG8ubm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBzeW5jaHJvbml6ZWQobykgewotICAgICAgby53YWl0KDEwMDApOwotICAgIH0KLSAgICBhc3NlcnRUcnVlKHZvaWRBZnRlck9uZXdheVJldHVybmVkLmdldCgpKTsKLSAgICAKLSAgICAvLyBtYWtlIG11bHRpcGxlIGNhbGxzIHdpdGggZGVzZXJpYWxpemF0aW9uIGluIHRoZSBzZWxlY3RvciB0aHJlYWQgKHJlcHJvIEVyaWMncyBpc3N1ZSkKLSAgICBpbnQgbnVtVGhyZWFkcyA9IDUwMDsKLSAgICBpbnQgbnVtQ2FsbHNQZXJUaHJlYWQgPSAxMDA7Ci0gICAgTGlzdDxKYW5reVJ1bm5hYmxlPiBydW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0PEphbmt5UnVubmFibGU+KCk7Ci0gICAgTGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PFRocmVhZD4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykgewotICAgICAgSmFua3lSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKYW5reVJ1bm5hYmxlKGFjbSwgbnVtQ2FsbHNQZXJUaHJlYWQpOwotICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotICAgICAgdGhyZWFkLnN0YXJ0KCk7Ci0gICAgICB0aHJlYWRzLmFkZCh0aHJlYWQpOwotICAgICAgcnVubmFibGVzLmFkZChydW5uYWJsZSk7Ci0gICAgfQotICAgIGZvciAoVGhyZWFkIHRocmVhZCA6IHRocmVhZHMpIHsKLSAgICAgIHRocmVhZC5qb2luKCk7Ci0gICAgfQotICAgIGludCBudW1TdWNjZXNzZXMgPSAwOwotICAgIGZvciAoSmFua3lSdW5uYWJsZSBydW5uYWJsZSA6IHJ1bm5hYmxlcykgewotICAgICAgbnVtU3VjY2Vzc2VzICs9IHJ1bm5hYmxlLmdldE51bVN1Y2Nlc3NlcygpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobnVtU3VjY2Vzc2VzLCBudW1UaHJlYWRzICogbnVtQ2FsbHNQZXJUaHJlYWQpOwotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL0JlbmNobWFya1Byb3RvY29scy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgxNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIEJlbmNobWFya1Byb3RvY29scyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFRQcm90b2NvbEZhY3Rvcnk+IEZBQ1RPUklFUyA9IG5ldyBMaW5rZWRIYXNoU2V0PFRQcm90b2NvbEZhY3Rvcnk+KCl7eworICAgIGFkZChuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9fTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJQUxTID0gMTA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIE1hcDxUUHJvdG9jb2xGYWN0b3J5LCBMaXN0PExvbmc+PiB0aW1lc0J5RmFjdG9yeSA9IG5ldyBIYXNoTWFwPFRQcm90b2NvbEZhY3RvcnksIExpc3Q8TG9uZz4+KCk7CisKKyAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgfQorLy8gICAgICBUUHJvdG9jb2wgcHJvdG8gPSBmYWN0b3J5LmdldFByb3RvY29sKG5ldyBUVHJhbnNwb3J0KCkgeworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgICByZXR1cm4gMDsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisvLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworLy8gICAgICAgIH0KKy8vICAgICAgfSk7CisKKworICAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgICAgaWYgKHRpbWVzQnlGYWN0b3J5LmdldChmYWN0b3J5KSA9PSBudWxsKSB7CisgICAgICAgICAgdGltZXNCeUZhY3RvcnkucHV0KGZhY3RvcnksIG5ldyBBcnJheUxpc3Q8TG9uZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgeworICAgICAgICAgIFRQcm90b2NvbCBwcm90byA9IGZhY3RvcnkuZ2V0UHJvdG9jb2wobmV3IFRNZW1vcnlCdWZmZXIoMTI4KjEwMjQpKTsKKyAgICAgICAgICBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LndyaXRlKHByb3RvKTsKKyAgICAgICAgICBGaXh0dXJlcy5uZXN0aW5nLndyaXRlKHByb3RvKTsKKyAgICAgICAgfQorICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSkuYWRkKGVuZC1zdGFydCk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgIExpc3Q8TG9uZz4gdGltZXMgPSB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSk7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmF3IHRpbWVzIHByZS1kcm9wOiAiICsgdGltZXMgKTsKKyAgICAgIHRpbWVzLnJlbW92ZShDb2xsZWN0aW9ucy5tYXgodGltZXMpKTsKKyAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgZm9yIChsb25nIHQgOiB0aW1lcykgeworICAgICAgICB0b3RhbCArPSB0OworICAgICAgfQorICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aW1lcyk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYXZlcmFnZSB0aW1lOiAiICsgKHRvdGFsIC8gdGltZXMuc2l6ZSgpKSArICJtcyIpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyYXcgdGltZXM6ICIgKyB0aW1lcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKaW5kZXggNWYyMmNmYy4uMDM4NmQ4MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKQEAgLTc0LDEyICs3NCwyOSBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEJpbmFyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZvciAoYnl0ZVtdIGIgOiBBcnJheXMuYXNMaXN0KG5ldyBieXRlWzBdLCBuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4LDksMTB9LCBuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LCBuZXcgYnl0ZVsxMjhdKSkgeworICAgIGZvciAoYnl0ZVtdIGIgOiBBcnJheXMuYXNMaXN0KG5ldyBieXRlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezB4NUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117KGJ5dGUpMHhENSwoYnl0ZSkweDVEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdeyhieXRlKTB4RkYsKGJ5dGUpMHhENSwoYnl0ZSkweDVEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVsxMjhdKSkgewogICAgICAgaWYgKGNhbkJlVXNlZE5ha2VkKCkpIHsKICAgICAgICAgaW50ZXJuYWxUZXN0TmFrZWRCaW5hcnkoYik7CiAgICAgICB9CiAgICAgICBpbnRlcm5hbFRlc3RCaW5hcnlGaWVsZChiKTsKICAgICB9CisKKyAgICBpZiAoY2FuQmVVc2VkTmFrZWQoKSkgeworICAgICAgYnl0ZVtdIGRhdGEgPSB7MSwgMiwgMywgNCwgNSwgNn07CisKKyAgICAgIFRNZW1vcnlCdWZmZXIgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgICBUUHJvdG9jb2wgcHJvdG8gPSBnZXRGYWN0b3J5KCkuZ2V0UHJvdG9jb2woYnVmKTsKKyAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7CisgICAgICBiYi5nZXQoKTsKKyAgICAgIHByb3RvLndyaXRlQmluYXJ5KGJiLnNsaWNlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChkYXRhLCAxLCA1KSwgcHJvdG8ucmVhZEJpbmFyeSgpKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMTAsNiArMzI3LDExIEBACiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uZXdheU1ldGhvZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZChib29sZWFuIHNob3VsZFRocm93KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaG91bGRUaHJvdzsKKyAgICAgIH0KICAgICB9OwogCiAgICAgU3J2LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFNydi5Qcm9jZXNzb3IoaGFuZGxlcik7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNzhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFNob3J0U3RhY2sgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdE9wcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEpOworICAgIHMucHVzaCgoc2hvcnQpMTApOworICAgIHMucHVzaCgoc2hvcnQpMTEpOworICAgIHMucHVzaCgoc2hvcnQpMTIpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTEsIHMucG9wKCkpOworICAgIHMucHVzaCgoc2hvcnQpNDApOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOworICAgIHRyeSB7CisgICAgICBzLnBvcCgpOworICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgLy8geWF5CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZkOTM3Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwotCi1wdWJsaWMgY2xhc3MgVGVzdFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFByb3RvY29sVGVzdEJhc2UgewotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVVc2VkTmFrZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRDb21wYWN0UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRDb21wYWN0UHJvdG9jb2wuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZiMTM0ZTYuLmI0YzA4ODgKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VENvbXBhY3RQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRDb21wYWN0UHJvdG9jb2wuamF2YQpAQCAtMjAsOCArMjAsMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URGVzZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2ltcG9ydCB0aHJpZnQudGVzdC5Cb25rOwogCiBwdWJsaWMgY2xhc3MgVGVzdFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCkBAIC0zNCw2ICszNiwyMCBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdE9PTURlbmlhbE9mU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFN0cnVjdCBoZWFkZXIsIEludGVnZXIuTUFYX1ZBTFVFIGxlbmd0aCwgYW5kIG9ubHkgb25lIHJlYWwKKyAgICAvLyBieXRlIG9mIGRhdGEKKyAgICBieXRlIFtdIGJ5dGVzID0gezI0LCAtMSwgLTEsIC0xLCAtMTcsIDQ5fTsKKyAgICBURGVzZXJpYWxpemVyIGRlc2VyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRDb21wYWN0UHJvdG9jb2wKKwkJCQkJICAgIC5GYWN0b3J5KDEwMDApKTsKKyAgICBCb25rIGJvbmsgPSBuZXcgQm9uaygpOworICAgIHRyeSB7CisJZGVzZXIuZGVzZXJpYWxpemUoYm9uaywgYnl0ZXMpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworCS8vIElnbm9yZSBhcyB3ZSBhcmUgb25seSBjaGVja2luZyBmb3IgT09NIGluIHRoZSBmYWlsdXJlIGNhc2UKKyAgICB9CisgIH0KKwogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBuZXcgVGVzdFRDb21wYWN0UHJvdG9jb2woKS5iZW5jaG1hcmsoKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGQ3Mzc2YWMuLmMyY2ExZmEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKQEAgLTE4LDYgKzE4LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKIHB1YmxpYyBjbGFzcyBUZXN0VEpTT05Qcm90b2NvbCBleHRlbmRzIFByb3RvY29sVGVzdEJhc2UgewogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKQEAgLTI4LDQgKzM0LDE1IEBACiAgIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkVW5pY29kZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBTdHJpbmcganNvblN0cmluZyA9ICJcImhlbGxvIHVuaWNvZGUgXFx1MGUwMVxcdWQ4MzRcXHVkZDFlIHdvcmxkXCIiOworICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJoZWxsbyB1bmljb2RlIFx1MGUwMVx1ZDgzNFx1ZGQxZSB3b3JsZCI7CisKKyAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMDApOworICAgIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpOworICAgIGJ1ZmZlci53cml0ZShqc29uU3RyaW5nLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgcHJvdG9jb2wucmVhZFN0cmluZygpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2Y1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdDsKKworcHVibGljIGNsYXNzIFRlc3RUUHJvdG9jb2xVdGlsIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RHdWVzc1Byb3RvY29sRmFjdG9yeV9KU09OKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBieXRlW10gZGF0YSA9ICJ7Zm9vfSIuZ2V0Qnl0ZXMoKTsKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgPSBUUHJvdG9jb2xVdGlsLmd1ZXNzUHJvdG9jb2xGYWN0b3J5KGRhdGEsIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgVEpTT05Qcm90b2NvbC5GYWN0b3J5KTsKKworICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHNlcmlhbGl6ZWQgd2l0aCBUQ29tcGFjdCBhbmQgd2hpY2ggc3RhcnRzIHdpdGggJ3snCisgICAgLy8gaXMgbm90IG1pc3Rha2VubHkgZ3Vlc3NlZCBhcyBzZXJpYWxpemVkIHdpdGggSlNPTi4KKworICAgIEd1ZXNzUHJvdG9jb2xTdHJ1Y3QgcyA9IG5ldyBHdWVzc1Byb3RvY29sU3RydWN0KCk7CisgICAgcy5wdXRUb01hcF9maWVsZCgifSIsIn0iKTsKKyAgICBieXRlW10gc2VyID0gbmV3IFRTZXJpYWxpemVyKG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSkuc2VyaWFsaXplKHMpOworICAgIGZhY3RvcnkgPSBUUHJvdG9jb2xVdGlsLmd1ZXNzUHJvdG9jb2xGYWN0b3J5KHNlciwgbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhc3NlcnRGYWxzZShmYWN0b3J5IGluc3RhbmNlb2YgVEpTT05Qcm90b2NvbC5GYWN0b3J5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHdWVzc1Byb3RvY29sRmFjdG9yeV9CaW5hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBDaGVjayB0aGF0IGEgbGFzdCBieXRlICE9IDAgaXMgY29ycmVjdGx5IHJlcG9ydGVkIGFzIEJpbmFyeQorCisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzFdOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGJ1ZlswXSA9IChieXRlKSBpOworICAgICAgVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5ID0gVFByb3RvY29sVXRpbC5ndWVzc1Byb3RvY29sRmFjdG9yeShidWYsIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgICBhc3NlcnRUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCBhIHNlY29uZCBieXRlIHNldCB0byAwIGlzIHJlcG9ydGVkIGFzIEJpbmFyeQorICAgIGJ1ZiA9IG5ldyBieXRlWzJdOworICAgIFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSA9IFRQcm90b2NvbFV0aWwuZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnVmLCBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIGFzc2VydFRydWUoZmFjdG9yeSBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHdWVzc1Byb3RvY29sRmFjdG9yeV9Db21wYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQ2hlY2sgdGhhdCBhIGZpcnN0IGJ5dGUgPiAweDEwIGlzIHJlcG9ydGVkIGFzIENvbXBhY3QKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbM107CisgICAgYnVmWzBdID0gMHgxMTsgCisgICAgVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5ID0gVFByb3RvY29sVXRpbC5ndWVzc1Byb3RvY29sRmFjdG9yeShidWYsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhc3NlcnRUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkpOworCisgICAgLy8gQ2hlY2sgdGhhdCBzZWNvbmQgYnl0ZSA+PSAweDgwIGlzIHJlcG9ydGVkIGFzIENvbXBhY3QKKyAgICBidWZbMF0gPSAwOworICAgIGZvciAoaW50IGkgPSAweDgwOyBpIDwgMHgxMDA7IGkrKykgeworICAgICAgYnVmWzFdID0gKGJ5dGUpIGk7CisgICAgICBmYWN0b3J5ID0gVFByb3RvY29sVXRpbC5ndWVzc1Byb3RvY29sRmFjdG9yeShidWYsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICAgIGFzc2VydFRydWUoZmFjdG9yeSBpbnN0YW5jZW9mIFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEd1ZXNzUHJvdG9jb2xGYWN0b3J5X1VuZGVjaWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVszXTsKKyAgICBidWZbMV0gPSAweDdlOworICAgIFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSA9IFRQcm90b2NvbFV0aWwuZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnVmLCBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpOworICAgIGFzc2VydFRydWUoZmFjdG9yeSBpbnN0YW5jZW9mIFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDEyNWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5GaXh0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgcHJpdmF0ZSBUU2ltcGxlSlNPTlByb3RvY29sIHByb3RvOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMDApOworICAgIHByb3RvID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woYnVmKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGJ1ZlRvU3RyaW5nKCkgeworICAgIHJldHVybiBidWYudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SG9seU1vbGV5KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGZpbmFsIEhvbHlNb2xleSBob2x5TW9sZXkgPSBGaXh0dXJlcy5ob2x5TW9sZXkuZGVlcENvcHkoKTsKKyAgICAvLyB1bnNldCBzZXRzIHRoYXQgcHJvZHVjZSBpbmNvbnNpc3RlbnQgb3JkZXJpbmcgYmV0d2VlbiBKREs3LzgKKyAgICBob2x5TW9sZXkudW5zZXRCb25rcygpOworICAgIGhvbHlNb2xleS51bnNldENvbnRhaW4oKTsKKyAgICBob2x5TW9sZXkud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wiYmlnXCI6W3tcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6MzUsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX0se1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX1dfSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgRml4dHVyZXMubmVzdGluZy53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJteV9ib25rXCI6e1widHlwZVwiOjMxMzM3LFwibWVzc2FnZVwiOlwiSSBhbSBhIGJvbmsuLi4geG9yIVwifSxcIm15X29vZVwiOntcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119fSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZU9mRWFjaCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBGaXh0dXJlcy5vbmVPZkVhY2gud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYW5lUGFydHNPZkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgLy8gdW5zZXQgYWxsIHRoZSBtYXBzIHdpdGggY29udGFpbmVyIGtleXMKKyAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0IHN0cnVjdCA9IEZpeHR1cmVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QuZGVlcENvcHkoKTsKKyAgICBzdHJ1Y3QudW5zZXRMaXN0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0U2V0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0TWFwX2J5dGVfbWFwKCk7CisgICAgLy8gdW5zZXQgc2V0cyBhbmQgbWFwcyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgc3RydWN0LnVuc2V0Qnl0ZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRJMTZfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STY0X3NldCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRTdHJpbmdfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STMyX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STY0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0RG91YmxlX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImFfYnl0ZVwiOjEyNyxcImFfaTE2XCI6MzIwMDAsXCJhX2kzMlwiOjEwMDAwMDAwMDAsXCJhX2k2NFwiOjEwOTk1MTE2Mjc3NzUsXCJhX2RvdWJsZVwiOjUuNjc4OSxcImFfc3RyaW5nXCI6XCJteSBzdHJpbmdcIixcImFfYmluYXJ5XCI6XCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlwiLFwidHJ1ZV9maWVsZFwiOjEsXCJmYWxzZV9maWVsZFwiOjAsXCJlbXB0eV9zdHJ1Y3RfZmllbGRcIjp7fSxcImJ5dGVfbGlzdFwiOlstMTI3LC0xLDAsMSwxMjddLFwiaTE2X2xpc3RcIjpbLTEsMCwxLDMyNzY3XSxcImkzMl9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDIxNDc0ODM2NDddLFwiaTY0X2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsNDI5NDk2NzI5NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw3MjA1NzU5NDAzNzkyNzkzNSw5MjIzMzcyMDM2ODU0Nzc1ODA3XSxcImRvdWJsZV9saXN0XCI6WzAuMSwwLjIsMC4zXSxcInN0cmluZ19saXN0XCI6W1wiZmlyc3RcIixcInNlY29uZFwiLFwidGhpcmRcIl0sXCJib29sZWFuX2xpc3RcIjpbMSwxLDEsMCwwLDBdLFwic3RydWN0X2xpc3RcIjpbe30se31dLFwiaTMyX3NldFwiOlsxLDIsM10sXCJib29sZWFuX3NldFwiOlswLDFdLFwic3RydWN0X3NldFwiOlt7fV0sXCJieXRlX2J5dGVfbWFwXCI6e1wiMVwiOjJ9LFwiYm9vbGVhbl9ieXRlX21hcFwiOntcIjBcIjowLFwiMVwiOjF9LFwiYnl0ZV9pMTZfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MzI3Njd9LFwiYnl0ZV9pMzJfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MjE0NzQ4MzY0N30sXCJieXRlX2k2NF9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjo5MjIzMzcyMDM2ODU0Nzc1ODA3fSxcImJ5dGVfZG91YmxlX21hcFwiOntcIjFcIjowLjEsXCIyXCI6LTAuMSxcIjNcIjoxMDAwMDAwLjF9LFwiYnl0ZV9zdHJpbmdfbWFwXCI6e1wiMVwiOlwiXCIsXCIyXCI6XCJibGFoXCIsXCIzXCI6XCJsb29vb29vb29vb29vb29uZyBzdHJpbmdcIn0sXCJieXRlX2Jvb2xlYW5fbWFwXCI6e1wiMVwiOjEsXCIyXCI6MH0sXCJieXRlX21hcF9tYXBcIjp7XCIwXCI6e30sXCIxXCI6e1wiMVwiOjF9LFwiMlwiOntcIjFcIjoxLFwiMlwiOjJ9fSxcImJ5dGVfc2V0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19LFwiYnl0ZV9saXN0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19fSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRocm93c09uQ29sbGVjdGlvbktleXMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIEZpeHR1cmVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qud3JpdGUocHJvdG8pOworICAgICAgZmFpbCgidGhpcyBzaG91bGQgdGhyb3cgYSBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFNpbXBsZUpTT05Qcm90b2NvbC5Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUVHVwbGVQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU0ZGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKKworaW1wb3J0IHRocmlmdC50ZXN0LlR1cGxlUHJvdG9jb2xUZXN0U3RydWN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0VFR1cGxlUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVVc2VkTmFrZWQoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qml0c2V0TGVuZ3RoSXNzdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCB0MSA9IG5ldyBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCgpOworICAgIHQxLnNldEZpZWxkMSgwKTsKKyAgICB0MS5zZXRGaWVsZDIoMTIpOworICAgIG5ldyBURGVzZXJpYWxpemVyKG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCkpLmRlc2VyaWFsaXplKG5ldyBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCgpLCBuZXcgVFNlcmlhbGl6ZXIobmV3IFRUdXBsZVByb3RvY29sLkZhY3RvcnkoKSkuc2VyaWFsaXplKHQxKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVGVzdFN0YW5kYXJkU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMjI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CitpbXBvcnQgdGhyaWZ0LnRlc3QuTmVzdGluZzsKK2ltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworCisgIC8qKgorICAgKiBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIFN0YW5kYXJkIFNjaGVtZSBwcm9wZXJseSByZWFkcyBzdHJ1Y3RzIHNlcmlhbGl6ZWQKKyAgICogdXNpbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiB0aHJpZnQuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFN0cnVjdHMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IE9uZU9mRWFjaCgpLCBGaXh0dXJlcy5vbmVPZkVhY2gsIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc09uZU9mRWFjaCk7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IEhvbHlNb2xleSgpLCBGaXh0dXJlcy5ob2x5TW9sZXksIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSk7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IE5lc3RpbmcoKSwgRml4dHVyZXMubmVzdGluZywgRml4dHVyZXMucGVyc2lzdGVudEJ5dGVzTmVzdGluZyk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkQW5kQ29tcGFyZShUQmFzZSBzdHJ1Y3QsIFRCYXNlIGZpeHR1cmUsIGJ5dGVbXSBpbnB1dEJ5dGVzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIHRyYW5zLndyaXRlKGlucHV0Qnl0ZXMsIDAsIGlucHV0Qnl0ZXMubGVuZ3RoKTsKKyAgICBUUHJvdG9jb2wgaXByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zKTsKKyAgICBzdHJ1Y3QucmVhZChpcHJvdCk7CisgICAgYXNzZXJ0RXF1YWxzKGZpeHR1cmUsIHN0cnVjdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCmluZGV4IGFlNTY3YzIuLjFkZWUyMmQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpAQCAtMjYsMTAgKzI2LDEzIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKQEAgLTM3LDYgKzQwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeTsKIAogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwogaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CkBAIC00OSwzOCArNTQsNTQgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUZXN0QmFzZSBleHRlbmRzIFRlc3RDYXNlIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5JZmFjZSB7Ci0gIAorCiAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkge30KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RWb2lkKClcbiIpOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKworICAgIHB1YmxpYyBib29sZWFuIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCb29sKCIgKyB0aGluZyArICIpXG4iKTsKKyAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKICAgICBwdWJsaWMgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJMzIoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJNjQoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIEJ5dGVCdWZmZXIgdGVzdEJpbmFyeShCeXRlQnVmZmVyIHRoaW5nKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpbmcucmVtYWluaW5nKCkgKiAzKTsKKyAgICAgIHRoaW5nLm1hcmsoKTsKKyAgICAgIHdoaWxlICh0aGluZy5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMlggIiwgdGhpbmcuZ2V0KCkpKTsKKyAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoIiArIHNiLnRvU3RyaW5nKCkgKyAiKVxuIik7CisgICAgICB0aGluZy5yZXNldCgpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJ1Y3QoeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKQEAgLTg5LDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkgewogICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TmVzdCh7IiArCkBAIC0xMDEsMjIgKzEyMiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gbmVzdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRlc3RNYXAoTWFwPEludGVnZXIsSW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXAoeyIpOwotICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGludCBrZXkgOiB0aGluZy5rZXlTZXQoKSkgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyB0aGluZy5nZXQoa2V5KSk7Ci0gICAgICB9CisgICAgICBTeXN0ZW0ub3V0LnByaW50KHRoaW5nKTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiB0ZXN0U3RyaW5nTWFwKE1hcDxTdHJpbmcsU3RyaW5nPiB0aGluZykgeworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZ01hcCh7Iik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KHRoaW5nKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKKyAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKICAgICBwdWJsaWMgU2V0PEludGVnZXI+IHRlc3RTZXQoU2V0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U2V0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTMxLDcgKzE1MSw3IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RMaXN0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTQ2LDgwICsxNjYsNTggQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0VHlwZWRlZigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXBNYXAoIiArIGhlbGxvICsgIilcbiIpOwogICAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+KCk7Ci0gIAorCiAgICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICAgIH0KLSAgCisKICAgICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7Ci0gIAorCiAgICAgICByZXR1cm4gbWFwbWFwOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKVxuIik7Ci0gIAotICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOwotICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotICAKLSAgICAgIFh0cnVjdCBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKLSAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKLSAgCi0gICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgY3JhenkudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gIAotICAgICAgY3JhenkudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChnb29kYnllKTsKLSAgCi0gICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgIGNyYXp5LnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChoZWxsbyk7Ci0gIAorCiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7OwotICAKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgY3JhenkpOwotICAKKworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CisKKyAgICAgIEluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwogICAgICAgc2Vjb25kX21hcC5wdXQoTnVtYmVyei5TSVgsIGxvb25leSk7Ci0gIAorCiAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IGluc2FuZSA9CiAgICAgICAgIG5ldyBIYXNoTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4oKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMSwgZmlyc3RfbWFwKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMiwgc2Vjb25kX21hcCk7Ci0gIAorCiAgICAgICByZXR1cm4gaW5zYW5lOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIE1hcDxTaG9ydCxTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGkoKVxuIik7Ci0gIAorCiAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7OwogICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKQEAgLTIyNywxOCArMjI1LDI0IEBACiAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwogICAgICAgcmV0dXJuIGhlbGxvOwogICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihTdHJpbmcgYXJnKSB0aHJvd3MgWGNlcHRpb24geworCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihTdHJpbmcgYXJnKSB0aHJvd3MgWGNlcHRpb24sIFRFeGNlcHRpb24gewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7Ci0gICAgICBpZiAoYXJnLmVxdWFscygiWGNlcHRpb24iKSkgeworICAgICAgaWYgKCJYY2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOwogICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOwogICAgICAgICB0aHJvdyB4OworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgcmVzdWx0LnN0cmluZ190aGluZyA9IGFyZzsKICAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWGNlcHRpb24sIFhjZXB0aW9uMiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpXG4iKTsKICAgICAgIGlmIChhcmcwLmVxdWFscygiWGNlcHRpb24iKSkgewpAQCAtMjUzLDE3ICsyNTcsMTcgQEAKICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKICAgICAgICAgdGhyb3cgeDsKICAgICAgIH0KLSAgCisKICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CiAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RPbmV3YXkoIiArIEludGVnZXIudG9TdHJpbmcoc2xlZXBGb3IpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAiKSA9PiBzbGVlcGluZy4uLiIpOwogICAgICAgdHJ5IHsKLSAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcEZvciAqIFNMRUVQX0RFTEFZKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHNsZWVwaW5nISIpOwogICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwpAQCAtMjc1LDE3ICsyNzksMzAgQEAKICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAogICAgICAgbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSA5MDkwOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDEwMDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVCA9IEludGVnZXIudmFsdWVPZigKKyAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QucG9ydCIsICI5MDkwIikpOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTTEVFUF9ERUxBWSA9IDEwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gMTUwMDsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0IFhTVFJVQ1QgPSBuZXcgWHRydWN0KCJaZXJvIiwgKGJ5dGUpIDEsIC0zLCAtNSk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdDIgWFNUUlVDVDIgPSBuZXcgWHRydWN0MigoYnl0ZSkxLCBYU1RSVUNULCA1KTsKIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb247CiAKLSAgcHVibGljIGFic3RyYWN0IFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgcHVibGljIGFic3RyYWN0IFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICBwcml2YXRlIHZvaWQgdGVzdEJvb2woVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJvb2xlYW4gdCA9IHRlc3RDbGllbnQudGVzdEJvb2wodHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHQpOworICAgIGJvb2xlYW4gZiA9IHRlc3RDbGllbnQudGVzdEJvb2woZmFsc2UpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZik7CisgIH0KIAogICBwcml2YXRlIHZvaWQgdGVzdEJ5dGUoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgaTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwpAQCAtMzE4LDcgKzMzNSw3IEBACiAgIC8vIHRvZG86IGFkZCBhc3NlcnRpb25zCiAgIHByaXZhdGUgdm9pZCB0ZXN0SW5zYW5pdHkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIEluc2FuaXR5IGluc2FuZTsKLSAgCisKICAgICBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7CiAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNTAwMCk7CkBAIC0zMzYsNyArMzUzLDcgQEAKICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgewogICAgICAgTWFwPE51bWJlcnosSW5zYW5pdHk+IHZhbCA9IHdob2EuZ2V0KGtleSk7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4geyIpOwotICAKKwogICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7CiAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKQEAgLTM0OCw3ICszNjUsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKLSAgCisKICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CiAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKQEAgLTM1Nyw3ICszNzQsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7Ci0gIAorCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgfQogICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CkBAIC0zNjUsMjcgKzM4MiwyOCBAQAogICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICB9CiAKKyAgcHVibGljIGJvb2xlYW4gdXNlQXN5bmNQcm9jZXNzb3IoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAotICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBQUk9UT0NPTFMpIHsKLSAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLSAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKKyAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gdXNlQXN5bmNQcm9jZXNzb3IoKSA/IG5ldyBUaHJpZnRUZXN0LkFzeW5jUHJvY2Vzc29yPEFzeW5jVGVzdEhhbmRsZXI+KG5ldyBBc3luY1Rlc3RIYW5kbGVyKCkpIDogbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihuZXcgVGVzdEhhbmRsZXIoKSk7CiAKICAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5KTsKIAotICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7Ci0KICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7Ci0gICAgICB0cmFuc3BvcnQgPSBzb2NrZXQ7Ci0gICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBnZXRDbGllbnRUcmFuc3BvcnQoc29ja2V0KTsKIAogICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9GYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CiAgICAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKIAotICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIG9wZW4odHJhbnNwb3J0KTsKICAgICAgIHRlc3RWb2lkKHRlc3RDbGllbnQpOwogICAgICAgdGVzdFN0cmluZyh0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RCb29sKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEJ5dGUodGVzdENsaWVudCk7CiAgICAgICB0ZXN0STMyKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEk2NCh0ZXN0Q2xpZW50KTsKQEAgLTM5MywxOSArNDExLDMxIEBACiAgICAgICB0ZXN0U3RydWN0KHRlc3RDbGllbnQpOwogICAgICAgdGVzdE5lc3RlZFN0cnVjdCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RNYXAodGVzdENsaWVudCk7CisgICAgICB0ZXN0U3RyaW5nTWFwKHRlc3RDbGllbnQpOwogICAgICAgdGVzdFNldCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RMaXN0KHRlc3RDbGllbnQpOwogICAgICAgdGVzdEVudW0odGVzdENsaWVudCk7CiAgICAgICB0ZXN0VHlwZWRlZih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3ROZXN0ZWRNYXAodGVzdENsaWVudCk7CiAgICAgICB0ZXN0SW5zYW5pdHkodGVzdENsaWVudCk7CisgICAgICB0ZXN0RXhjZXB0aW9uKHRlc3RDbGllbnQpOwogICAgICAgdGVzdE9uZXdheSh0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RJMzIodGVzdENsaWVudCk7CiAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIHNvY2tldC5jbG9zZSgpOwogCiAgICAgICBzdG9wU2VydmVyKCk7CiAgICAgfQogICB9CiAKKyAgcHVibGljIHZvaWQgb3BlbihUVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKKyAgICByZXR1cm4gUFJPVE9DT0xTOworICB9CisKICAgcHJpdmF0ZSB2b2lkIHRlc3RMaXN0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBMaXN0PEludGVnZXI+IGxpc3RvdXQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CiAgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CkBAIC00MjQsMTkgKzQ1NCwyOSBAQAogICAgIGFzc2VydEVxdWFscyhtYXBvdXQsIG1hcGluKTsKICAgfQogCisgIHByaXZhdGUgdm9pZCB0ZXN0U3RyaW5nTWFwKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLFN0cmluZz4gbWFwb3V0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKyAgICBtYXBvdXQucHV0KCJhIiwgIjEyMyIpOworICAgIG1hcG91dC5wdXQoIiB4IHkgIiwgIiB3aXRoIHNwYWNlcyAiKTsKKyAgICBtYXBvdXQucHV0KCJzYW1lIiwgInNhbWUiKTsKKyAgICBtYXBvdXQucHV0KCIwIiwgIm51bWVyaWMga2V5Iik7CisgICAgTWFwPFN0cmluZyxTdHJpbmc+IG1hcGluID0gdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKG1hcG91dCk7CisgICAgYXNzZXJ0RXF1YWxzKG1hcG91dCwgbWFwaW4pOworICB9CisKICAgcHJpdmF0ZSB2b2lkIHRlc3ROZXN0ZWRNYXAoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtbSA9CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICB9Ci0gIAorCiAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7CiAgICAgYXNzZXJ0RXF1YWxzKG1hcG1hcCwgbW0pOwpAQCAtNDQ4LDcgKzQ4OCwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RPbmV3YXkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOworICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbjsKKyAgICBhc3NlcnRUcnVlKGVsYXBzZWQgPCA1MDApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXQoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNDc3LDQgKzUyMCwxOTIgQEAKICAgICB0ZXN0Q2xpZW50LnRlc3RWb2lkKCk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YmxpYyBpbnQgY291bnQgPSAwOworICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBmYWN0b3J5OworCisgICAgcHVibGljIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkoRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICBjb3VudCsrOworICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgeworICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+IHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4oaGFuZGxlcik7CisKKyAgICAgIGZpbmFsIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSk7CisKKyAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5LCBmYWN0b3J5KTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBmYWN0b3J5LmNvdW50KTsKKworICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKKyAgICAgIHNvY2tldC5zZXRUaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICBvcGVuKHRyYW5zcG9ydCk7CisKKyAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkgMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZhY3RvcnkuY291bnQpOworICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICBzdG9wU2VydmVyKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNlcHRpb24oVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24sIFhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOworICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgICAgICBhc3NlcnRFcXVhbHMoZS5lcnJvckNvZGUsIDEwMDEpOworICAgIH0KKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKKyAgICB9CisgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKKyAgfQorCisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Rlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5Bc3luY0lmYWNlIHsKKworICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFN0cmluZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cmluZyh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJvb2wodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZShieXRlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJ5dGU+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCeXRlKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEkzMihpbnQgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEkzMih0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJNjQobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMb25nPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STY0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZShkb3VibGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8RG91YmxlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0RG91YmxlKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJpbmFyeShCeXRlQnVmZmVyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJ5dGVCdWZmZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCaW5hcnkodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJ1Y3QodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFh0cnVjdDI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3ROZXN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsIEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ01hcChNYXA8U3RyaW5nLCBTdHJpbmc+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmdNYXAodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTZXQ8SW50ZWdlcj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTZXQodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExpc3Q8SW50ZWdlcj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RMaXN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEVudW0oTnVtYmVyeiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxOdW1iZXJ6PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0RW51bSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFR5cGVkZWYodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwTWFwKGludCBoZWxsbywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXBNYXAoaGVsbG8pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJbnNhbml0eShhcmd1bWVudCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIE1hcDxTaG9ydCwgU3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNdWx0aShhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZywgQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKKyAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CisgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICAgIC8vIHRocm93IGFuZCBvbkVycm9yIHlpZWxkIHRoZSBzYW1lIHJlc3VsdC4KKyAgICAgICAgLy8gdGhyb3cgeDsKKyAgICAgICAgcmVzdWx0SGFuZGxlci5vbkVycm9yKHgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHJlc3VsdEhhbmRsZXIub25FcnJvcihuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CisgICAgICB9CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2Vjb25kc1RvU2xlZXAsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaGFuZGxlci50ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwKTsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKKyAgICB9CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0QXN5bmNTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM1NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXN5bmNTZXJ2ZXIgZXh0ZW5kcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgeworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIHVzZUFzeW5jUHJvY2Vzc29yKCl7CisgICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RIc0hhU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0SHNIYVNlcnZlci5qYXZhCmluZGV4IGY4MDU2MGIuLjY2MzhhMzMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RIc0hhU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEhzSGFTZXJ2ZXIuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyLkFyZ3M7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKIAogcHVibGljIGNsYXNzIFRlc3RIc0hhU2VydmVyIGV4dGVuZHMgVGVzdE5vbmJsb2NraW5nU2VydmVyIHsKICAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgewotICAgIHJldHVybiBuZXcgVEhzSGFTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHByb3RvRmFjdG9yeSk7CisgICAgcmV0dXJuIG5ldyBUSHNIYVNlcnZlcihuZXcgQXJncyhzb2NrZXQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpLnByb3RvY29sRmFjdG9yeShwcm90b0ZhY3RvcnkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCBjNDNiNDczLi4zZGYzYmQ4IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMjAsMzEgKzIwLDQyIEBACiAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlROb25ibG9ja2luZ1NlcnZlci5BcmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKIAogcHVibGljIGNsYXNzIFRlc3ROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIFNlcnZlclRlc3RCYXNlIHsKIAogICBwcml2YXRlIFRocmVhZCBzZXJ2ZXJUaHJlYWQ7CiAgIHByaXZhdGUgVFNlcnZlciBzZXJ2ZXI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUVVFUklFUyA9IDEwMDA7CiAKLSAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgewotICAgIHJldHVybiBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCBwcm90b0ZhY3RvcnkpOworICBwcm90ZWN0ZWQgVFNlcnZlciBnZXRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBzb2NrZXQsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgZmluYWwgQXJncyBhcmdzID0gbmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkocHJvdG9GYWN0b3J5KTsKKyAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICBhcmdzLnRyYW5zcG9ydEZhY3RvcnkoZmFjdG9yeSk7CisgICAgfQorICAgIHJldHVybiBuZXcgVE5vbmJsb2NraW5nU2VydmVyKGFyZ3MpOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAvLyBUcmFuc3BvcnQKICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9Ci0gICAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KFBPUlQpOworICAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChQT1JUKSk7CiAKLSAgICAgICAgICBzZXJ2ZXIgPSBnZXRTZXJ2ZXIocHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBwcm90b0ZhY3RvcnkpOworICAgICAgICAgIHNlcnZlciA9IGdldFNlcnZlcihwcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQsIHByb3RvRmFjdG9yeSwgZmFjdG9yeSk7CiAKICAgICAgICAgICAvLyBSdW4gaXQKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiICsgUE9SVCArICIuLi4iKTsKQEAgLTY4LDkgKzc5LDQ1IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKLSAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7Ci0gICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCk7CisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nVHJhbnNwb3J0KTsKKyAgfQorCisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFudXBBbGxTZWxlY3Rpb25LZXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7CisgICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7CisKKyAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5KTsKKworICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKKyAgICAgIHNvY2tldC5zZXRUaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CisKKyAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG9wZW4odHJhbnNwb3J0KTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUVVFUklFUzsgKytpKSB7CisgICAgICAgIHRlc3RDbGllbnQudGVzdEkzMigxKTsKKyAgICAgIH0KKyAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9RVUVSSUVTOyArK2kpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJMzIoMSk7CisgICAgICAgIH0gY2F0Y2goVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGZhaWwoInRpbWVkIG91dCB3aGVuIGl0IHNob3VsZCBoYXZlIHRocm93biBhbm90aGVyIGtpbmQgb2YgZXJyb3IhIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc3RvcFNlcnZlcigpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKKworcHVibGljIGNsYXNzIFRlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgVGVzdE5vbmJsb2NraW5nU2VydmVyIHsKKyAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgeworICAgIHJldHVybiBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIobmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkocHJvdG9GYWN0b3J5KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9KYXZhQmVhbnNUZXN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvSmF2YUJlYW5zVGVzdC5qYXZhCmluZGV4IDNmOGQyMmEuLjZhMmEwZWQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9KYXZhQmVhbnNUZXN0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L0phdmFCZWFuc1Rlc3QuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImlzU2V0IG1ldGhvZCBlcnJvcjogdW5zZXQgZmllbGQgcmV0dXJuZWQgYXMgc2V0ISIpOwogCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMjsgaSsrKXsKLSAgICAgIGlmIChvb2UuaXNTZXQoaSkpCisgICAgICBpZiAob29lLmlzU2V0KG9vZS5maWVsZEZvcklkKGkpKSkKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImlzU2V0IG1ldGhvZCBlcnJvcjogdW5zZXQgZmllbGQgIiArIGkgKyAiIHJldHVybmVkIGFzIHNldCEiKTsKICAgICB9CiAKQEAgLTk1LDE0ICs5NSwxNCBAQAogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImlzU2V0IG1ldGhvZCBlcnJvcjogc2V0IGZpZWxkIHJldHVybmVkIGFzIHVuc2V0ISIpOwogCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMjsgaSsrKXsKLSAgICAgIGlmICghb29lLmlzU2V0KGkpKQorICAgICAgaWYgKCFvb2UuaXNTZXQob29lLmZpZWxkRm9ySWQoaSkpKQogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaXNTZXQgbWV0aG9kIGVycm9yOiBzZXQgZmllbGQgIiArIGkgKyAiIHJldHVybmVkIGFzIHVuc2V0ISIpOwogICAgIH0KIAogICAgIC8vIFNob3VsZCB0aHJvdyBleGNlcHRpb24gd2hlbiBmaWVsZCBkb2Vzbid0IGV4aXN0CiAgICAgYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKICAgICB0cnl7Ci0gICAgICBpZiAob29lLmlzU2V0KDEwMCkpOworICAgICAgaWYgKG9vZS5pc1NldChvb2UuZmllbGRGb3JJZCgxMDApKSk7CiAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewogICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFhOTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CisKKy8qKgorICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCisgKiB0aGlzIG1ha2VzIGEgdmFyaWV0eSBvZiByZXF1ZXN0cyB0byBlbmFibGUgdGVzdGluZyBmb3IgYm90aCBwZXJmb3JtYW5jZSBhbmQKKyAqIGNvcnJlY3RuZXNzIG9mIHRoZSBvdXRwdXQuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdENsaWVudCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9CQVNFVFlQRVMgPSAxOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1NUUlVDVFMgPSAyOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1BST1RPQ09MUyA9IDE2OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1VOS05PV04gPSA2NDsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgIFN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgaW50IHBvcnQgPSA5MDkwOworICAgIGludCBudW1UZXN0cyA9IDE7CisgICAgU3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKKyAgICBTdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOworICAgIGJvb2xlYW4gc3NsID0gZmFsc2U7CisKKyAgICBpbnQgc29ja2V0VGltZW91dCA9IDEwMDA7CisKKyAgICB0cnkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0taG9zdCIpKSB7CisgICAgICAgICAgaG9zdCA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICBob3N0LnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKKyAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CisgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKKyAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXByb3RvY29sIikpIHsKKyAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10cmFuc3BvcnQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgeworICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taG9zdD1hcmcgKD0iICsgaG9zdCArICIpXHRIb3N0IHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkLCBodHRwIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4gbm90IHBhcnNlIGFyZ3VtZW50cyEgU2VlIC0taGVscCIpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biB0cmFuc3BvcnQgdHlwZSEgIiArIHRyYW5zcG9ydF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSAmJiBzc2wgPT0gdHJ1ZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTU0wgaXMgbm90IHN1cHBvcnRlZCBvdmVyIGh0dHAuIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQorCisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly8iICsgaG9zdCArICI6IiArIHBvcnQgKyAiL3NlcnZpY2UiOworICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgaWYgKHNzbCA9PSB0cnVlKSB7CisgICAgICAgICAgc29ja2V0ID0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KGhvc3QsIHBvcnQsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNvY2tldCA9IG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpOworICAgICAgICB9CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHNvY2tldFRpbWVvdXQpOworICAgICAgICB0cmFuc3BvcnQgPSBzb2NrZXQ7CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQorCisgICAgVFByb3RvY29sIHRQcm90b2NvbCA9IG51bGw7CisgICAgVFByb3RvY29sIHRQcm90b2NvbDIgPSBudWxsOworICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgdFByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgfQorCisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KKworICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKKyAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKworICAgIGxvbmcgdGltZU1pbiA9IDA7CisgICAgbG9uZyB0aW1lTWF4ID0gMDsKKyAgICBsb25nIHRpbWVUb3QgPSAwOworCisgICAgaW50IHJldHVybkNvZGUgPSAwOworICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGVzdHM7ICsrdGVzdCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENPTk5FQ1QgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0ICMiICsgKHRlc3QrMSkgKyAiLCAiICsgImNvbm5lY3QgIiArIGhvc3QgKyAiOiIgKyBwb3J0KTsKKworICAgICAgICBpZiAodHJhbnNwb3J0LmlzT3BlbigpID09IGZhbHNlKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgICAgIHR0eC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29ubmVjdCBmYWlsZWQ6ICIgKyB0dHguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZPSUQgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOworICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CisgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTVFJJTkcgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTXVsdGlwbGV4ZWQgdGVzdAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgICAgIFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZENsaWVudCA9IG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudCh0UHJvdG9jb2wyKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJzZWNvbmR0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICBzID0gc2Vjb25kQ2xpZW50LnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgICAgaWYgKCFzLmVxdWFscygidGVzdFN0cmluZyhcIlRlc3QyXCIpIikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1BST1RPQ09MUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEJZVEUgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgYnl0ZSBpOCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpOCArICJcbiIpOworICAgICAgICBpZiAoaTggIT0gMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSTMyIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJMzIoLTEpIik7CisgICAgICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTMyICsgIlxuIik7CisgICAgICAgIGlmIChpMzIgIT0gLTEpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEk2NCBURVNUCisgICAgICAgICAqLworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgbG9uZyBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpNjQgKyAiXG4iKTsKKyAgICAgICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBET1VCTEUgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdERvdWJsZSgtNS4zMjUwOTgyMzUpIik7CisgICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMzI1MDk4MjM1KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGR1YiArICJcbiIpOworICAgICAgICBpZiAoTWF0aC5hYnMoZHViIC0gKC01LjMyNTA5ODIzNSkpID4gMC4wMDEpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJJTkFSWSBURVNUCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoLTEyOC4uLjEyNykgPSAiKTsKKyAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwgLTk4LCAtOTcsIC05NiwgLTk1LCAtOTQsIC05MywgLTkyLCAtOTEsIC05MCwgLTg5LCAtODgsIC04NywgLTg2LCAtODUsIC04NCwgLTgzLCAtODIsIC04MSwgLTgwLCAtNzksIC03OCwgLTc3LCAtNzYsIC03NSwgLTc0LCAtNzMsIC03MiwgLTcxLCAtNzAsIC02OSwgLTY4LCAtNjcsIC02NiwgLTY1LCAtNjQsIC02MywgLTYyLCAtNjEsIC02MCwgLTU5LCAtNTgsIC01NywgLTU2LCAtNTUsIC01NCwgLTUzLCAtNTIsIC01MSwgLTUwLCAtNDksIC00OCwgLTQ3LCAtNDYsIC00NSwgLTQ0LCAtNDMsIC00MiwgLTQxLCAtNDAsIC0zOSwgLTM4LCAtMzcsIC0zNiwgLTM1LCAtMzQsIC0zMywgLTMyLCAtMzEsIC0zMCwgLTI5LCAtMjgsIC0yNywgLTI2LCAtMjUsIC0yNCwgLTIzLCAtMjIsIC0yMSwgLTIwLCAtMTksIC0xOCwgLTE3LCAtMTYsIC0xNSwgLTE0LCAtMTMsIC0xMiwgLTExLCAtMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisgICAgICAgICAgQnl0ZUJ1ZmZlciBiaW4gPSB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgICAgICBiaW4ubWFyaygpOworICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2Jpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCldOworICAgICAgICAgIGJpbi5nZXQoYnl0ZXMpOworICAgICAgICAgIGJpbi5yZXNldCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGJ5dGVzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLndyYXAoZGF0YSkuZXF1YWxzKGJpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU1RSVUNUIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICBYdHJ1Y3Qgb3V0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBvdXQuc3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICBvdXQuYnl0ZV90aGluZyA9IChieXRlKSAxOworICAgICAgICBvdXQuaTMyX3RoaW5nID0gLTM7CisgICAgICAgIG91dC5pNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgWHRydWN0IGluID0gdGVzdENsaWVudC50ZXN0U3RydWN0KG91dCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pNjRfdGhpbmcgKyAifVxuIik7CisgICAgICAgIGlmICghaW4uZXF1YWxzKG91dCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgICAgICBYdHJ1Y3QyIG91dDIgPSBuZXcgWHRydWN0MigpOworICAgICAgICBvdXQyLmJ5dGVfdGhpbmcgPSAoc2hvcnQpMTsKKyAgICAgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CisgICAgICAgIG91dDIuaTMyX3RoaW5nID0gNTsKKyAgICAgICAgWHRydWN0MiBpbjIgPSB0ZXN0Q2xpZW50LnRlc3ROZXN0KG91dDIpOworICAgICAgICBpbiA9IGluMi5zdHJ1Y3RfdGhpbmc7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgaW4yLmJ5dGVfdGhpbmcgKyAiLCB7IiArICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLnN0cmluZ190aGluZyArICJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOworICAgICAgICBpZiAoIWluMi5lcXVhbHMob3V0MikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNQVAgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgTWFwPEludGVnZXIsSW50ZWdlcj4gbWFwb3V0ID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICAgIG1hcG91dC5wdXQoaSwgaS0xMCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcCh7Iik7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBrZXkgOiBtYXBvdXQua2V5U2V0KCkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICBNYXA8SW50ZWdlcixJbnRlZ2VyPiBtYXBpbiA9IHRlc3RDbGllbnQudGVzdE1hcChtYXBvdXQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQga2V5IDogbWFwaW4ua2V5U2V0KCkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKCFtYXBvdXQuZXF1YWxzKG1hcGluKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNUUklORyBNQVAgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNtYXBvdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgiYSIsICIyIik7CisgICAgICAgICAgc21hcG91dC5wdXQoImIiLCAiYmxhaCIpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJzb21lIiwgInRoaW5nIik7CisgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc21hcG91dC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyBzbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSkiKTsKKyAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNtYXBpbiA9IHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChzbWFwb3V0KTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHNtYXBpbi5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyBzbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKCFzbWFwb3V0LmVxdWFscyhzbWFwaW4pKSB7CisgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNFVCBURVNUCisgICAgICAgICAqLworICAgICAgICBTZXQ8SW50ZWdlcj4gc2V0b3V0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgc2V0b3V0LmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogc2V0b3V0KSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pIik7CisgICAgICAgIFNldDxJbnRlZ2VyPiBzZXRpbiA9IHRlc3RDbGllbnQudGVzdFNldChzZXRvdXQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgZWxlbSA6IHNldGluKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIXNldG91dC5lcXVhbHMoc2V0aW4pKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTElTVCBURVNUCisgICAgICAgICAqLworICAgICAgICBMaXN0PEludGVnZXI+IGxpc3RvdXQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICAgIGxpc3RvdXQuYWRkKGkpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogbGlzdG91dCkgeworICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludChlbGVtKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICBMaXN0PEludGVnZXI+IGxpc3RpbiA9IHRlc3RDbGllbnQudGVzdExpc3QobGlzdG91dCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogbGlzdGluKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFTlVNIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUV08pIik7CisgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5UV08pIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5USFJFRSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5GSVZFKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUWVBFREVGIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgbG9uZyB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgdWlkICsgIlxuIik7CisgICAgICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTkVTVEVEIE1BUCBURVNUCisgICAgICAgICAqLworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtbSA9CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZvciAoaW50IGtleSA6IG1tLmtleVNldCgpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICBNYXA8SW50ZWdlcixJbnRlZ2VyPiBtMiA9IG1tLmdldChrZXkpOworICAgICAgICAgIGZvciAoaW50IGsyIDogbTIua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+ICIgKyBtMi5nZXQoazIpICsgIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwgIW1tLmNvbnRhaW5zS2V5KDQpIHx8ICFtbS5jb250YWluc0tleSgtNCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTEgPSBtbS5nZXQoNCk7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0yID0gbW0uZ2V0KC00KTsKKyAgICAgICAgICBpZiAobTEuZ2V0KDEpICE9IDEgfHwgbTEuZ2V0KDIpICE9IDIgfHwgbTEuZ2V0KDMpICE9IDMgfHwgbTEuZ2V0KDQpICE9IDQgfHwKKyAgICAgICAgICAgICAgbTIuZ2V0KC0xKSAhPSAtMSB8fCBtMi5nZXQoLTIpICE9IC0yIHx8IG0yLmdldCgtMykgIT0gLTMgfHwgbTIuZ2V0KC00KSAhPSAtNCkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSU5TQU5JVFkgVEVTVAorICAgICAgICAgKi8KKworICAgICAgICBib29sZWFuIGluc2FuaXR5RmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7CisgICAgICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgICAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKKworICAgICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7CisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoZ29vZGJ5ZSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKGhlbGxvKTsKKworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiB3aG9hID0KKyAgICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBMb25nPiB1c2VyTWFwID0gdjIudXNlck1hcDsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGszIDogdXNlck1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKworICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CisKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKHdob2Euc2l6ZSgpID09IDIgJiYgd2hvYS5jb250YWluc0tleSgxTCkgJiYgd2hvYS5jb250YWluc0tleSgyTCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gd2hvYS5nZXQoMUwpOworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gd2hvYS5nZXQoMkwpOworICAgICAgICAgICAgaWYgKGZpcnN0X21hcC5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRXTykgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5USFJFRSkgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5jb250YWluc0tleShOdW1iZXJ6LlNJWCkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKSkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgc2l4ID1zZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgIm5ldyBJbnNhbml0eSgpLmVxdWFscyhzaXgpIiBiZWNhdXNlIGFzIG9mIG5vdywgc3RydWN0L2NvbnRhaW5lcgorICAgICAgICAgICAgICAvLyBmaWVsZHMgd2l0aCBkZWZhdWx0IHJlcXVpcmVkbmVzcyBoYXZlIGlzc2V0PWZhbHNlIGZvciBsb2NhbCBpbnN0YW5jZXMgYW5kIHlldAorICAgICAgICAgICAgICAvLyByZWNlaXZlZCBlbXB0eSB2YWx1ZXMgZnJvbSBvdGhlciBsYW5ndWFnZXMgbGlrZSBDKysgaGF2ZSBpc3NldD10cnVlIC4KKyAgICAgICAgICAgICAgaWYgKHNpeC5nZXRVc2VyTWFwU2l6ZSgpID09IDAgJiYgc2l4LmdldFh0cnVjdHNTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluc2FuaXR5RmFpbGVkKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRVhFQ1BUSU9OIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7XCIlc1wifVxuIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4iKTsKKyAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNVUxUSSBFWENFUFRJT04gVEVTVAorICAgICAgICAgKi8KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChYY2VwdGlvbjIgZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICAgICAgWHRydWN0IHJlc3VsdDsKKyAgICAgICAgICByZXN1bHQgPSB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigic3VjY2VzcyIsICJ0ZXN0IDMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7e1wiJXNcIn19XG4iLCByZXN1bHQuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPTkVXQVkgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE9uZXdheSgzKS4uLiIpOworICAgICAgICBsb25nIHN0YXJ0T25ld2F5ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICAgICAgbG9uZyBvbmV3YXlFbGFwc2VkTWlsbGlzID0gKFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnRPbmV3YXkpIC8gMTAwMDAwMDsKKyAgICAgICAgaWYgKG9uZXdheUVsYXBzZWRNaWxsaXMgPiAyMDApIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZXdheSB0ZXN0IGZhaWxlZDogdG9vayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSB0b29rICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zIik7CisgICAgICAgIH0KKworCisgICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICBsb25nIHRvdCA9IHN0b3Atc3RhcnQ7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCB0aW1lOiAiICsgdG90LzEwMDAgKyAidXMiKTsKKworICAgICAgICBpZiAodGltZU1pbiA9PSAwIHx8IHRvdCA8IHRpbWVNaW4pIHsKKyAgICAgICAgICB0aW1lTWluID0gdG90OworICAgICAgICB9CisgICAgICAgIGlmICh0b3QgPiB0aW1lTWF4KSB7CisgICAgICAgICAgdGltZU1heCA9IHRvdDsKKyAgICAgICAgfQorICAgICAgICB0aW1lVG90ICs9IHRvdDsKKworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9VTktOT1dOOworICAgICAgfQorICAgIH0KKworICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIHRpbWU6ICIgKyB0aW1lTWluLzEwMDAgKyAidXMiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1heCB0aW1lOiAiICsgdGltZU1heC8xMDAwICsgInVzIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOworCisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBqc29uID0gKG5ldyBUU2VyaWFsaXplcihuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpKS50b1N0cmluZyhpbnNhbmUpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworCisgICAgU3lzdGVtLmV4aXQocmV0dXJuQ29kZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM0YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyLkFyZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2UuVGVzdEhhbmRsZXI7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUZXN0U2VydmVyIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKyAgICB0cnkgeworICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgYm9vbGVhbiBoc2hhID0gZmFsc2U7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1wIikpIHsKKyAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaSsrXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1oc2hhIikpIHsKKyAgICAgICAgICBoc2hhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy9AVE9ETyBhZGQgb3RoZXIgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCB0eXBlcworCisgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0KKyAgICAgICAgbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0KKyAgICAgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgLy8gVHJhbnNwb3J0CisgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9CisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQocG9ydCkpOworCisgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKworICAgICAgaWYgKGhzaGEpIHsKKyAgICAgICAgLy8gSHNIYSBTZXJ2ZXIKKyAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRIc0hhU2VydmVyKG5ldyBBcmdzKHRTZXJ2ZXJTb2NrZXQpLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKKyAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihuZXcgQXJncyh0U2VydmVyU29ja2V0KS5wcm9jZXNzb3IodGVzdFByb2Nlc3NvcikpOworICAgICAgfQorCisgICAgICAvLyBSdW4gaXQKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgIi4uLiIpOworICAgICAgc2VydmVyRW5naW5lLnNlcnZlKCk7CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lLiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNlNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNpbXBsZVNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlLlRlc3RIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CitpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKK2ltcG9ydCB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247CitpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YdHJ1Y3QyOworCitwdWJsaWMgY2xhc3MgVGVzdFNlcnZlciB7CisKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvdG9jb2wgU3VwcG9ydCBEZXRhaWxzOgorICAvLworICAvLyBGb3IgbXVsdGlwbGV4ZWQgdGVzdGluZyB3ZSBhbHdheXMgdXNlIGJpbmFyeSBwcm90b2NvbCB1bmRlcm5lYXRoLgorICAvLworICAvLyAiVGhyaWZ0VGVzdCIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJUaHJpZnRUZXN0IiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vICJTZWNvbmRTZXJ2aWNlIiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlNlY29uZFNlcnZpY2UiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gSW4gYWRkaXRpb24sIHRvIHN1cHBvcnQgb2xkZXIgbm9uLW11bHRpcGxleGVkIGNsaWVudHMgdXNpbmcgdGhlIHNhbWUgY29uY3JldGUgcHJvdG9jb2wKKyAgLy8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyB0YXVnaHQgdG8gdXNlICJUaHJpZnRUZXN0IiBpZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgbm8KKyAgLy8gbXVsdGlwbGV4ZWQgY2FsbCBuYW1lIGRlY29yYXRpb24uCisKKyAgc3RhdGljIGNsYXNzIFNlY29uZEhhbmRsZXIgaW1wbGVtZW50cyB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlLklmYWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0aGluZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7IHJldHVybiAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyQ29udGV4dCBpbXBsZW1lbnRzIFNlcnZlckNvbnRleHQgeworCisgICAgICAgIGludCBjb25uZWN0aW9uSWQ7CisKKyAgICAgICAgcHVibGljIFRlc3RTZXJ2ZXJDb250ZXh0KGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbklkKGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dENvbm5lY3Rpb25JZCA9IDE7CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUgLSBjYWxsZWQgb25seSBvbmNlIGJlZm9yZSBzZXJ2ZXIgc3RhcnRzIGFjY2VwdGluZyBjb25uZWN0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcnZlckNvbnRleHQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIC8vd2UgY2FuIGNyZWF0ZSBzb21lIGNvbm5lY3Rpb24gbGV2ZWwgZGF0YSB3aGljaCBpcyBzdG9yZWQgd2hpbGUgY29ubmVjdGlvbiBpcyBhbGl2ZSAmIHNlcnZlZAorICAgICAgICAgICAgVGVzdFNlcnZlckNvbnRleHQgY3R4ID0gbmV3IFRlc3RTZXJ2ZXJDb250ZXh0KG5leHRDb25uZWN0aW9uSWQrKyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBjdHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0IC0gY29ubmVjdGlvbiAjIitjdHguZ2V0Q29ubmVjdGlvbklkKCkrIiB0ZXJtaW5hdGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgaXMgcmVhZHkgdG8gcHJvY2VzcyBuZXh0IHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgIHRyeSB7CisgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICBib29sZWFuIHNzbCA9IGZhbHNlOworICAgICAgU3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKKyAgICAgIFN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CisgICAgICBTdHJpbmcgc2VydmVyX3R5cGUgPSAidGhyZWFkLXBvb2wiOworICAgICAgU3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgICAgIGludCBzdHJpbmdfbGltaXQgPSAtMTsKKyAgICAgIGludCBjb250YWluZXJfbGltaXQgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc2VydmVyLXR5cGUiKSkgeworICAgICAgICAgICAgc2VydmVyX3R5cGUgPSBhcmdzW2ldLnNwbGl0KCI9IilbMV07CisgICAgICAgICAgICBzZXJ2ZXJfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0PUludGVnZXIucGFyc2VJbnQoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wcm90b2NvbCIpKSB7CisgICAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgcHJvdG9jb2xfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tdHJhbnNwb3J0IikpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgdHJhbnNwb3J0X3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc3NsIikpIHsKKyAgICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc3RyaW5nLWxpbWl0IikpIHsKKyAgICAgICAgICAgIHN0cmluZ19saW1pdCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLWNvbnRhaW5lci1saW1pdCIpKSB7CisgICAgICAgICAgICBjb250YWluZXJfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdHJhbnNwb3J0PWFyZyAoPSIgKyB0cmFuc3BvcnRfdHlwZSArICIpXG5cdFx0XHRcdFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgZmFzdGZyYW1lZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zc2xcdFx0XHRFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc2VydmVyLXR5cGU9YXJnICg9IiArIHNlcnZlcl90eXBlICsiKVxuXHRcdFx0XHRUeXBlIG9mIHNlcnZlcjogc2ltcGxlLCB0aHJlYWQtcG9vbCwgbm9uYmxvY2tpbmcsIHRocmVhZGVkLXNlbGVjdG9yIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zdHJpbmctbGltaXQ9YXJnICg9IiArIHN0cmluZ19saW1pdCArICIpXHRTdHJpbmcgcmVhZCBsZW5ndGggbGltaXQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWNvbnRhaW5lci1saW1pdD1hcmcgKD0iICsgY29udGFpbmVyX2xpbWl0ICsgIilcdENvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdCIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbiBub3QgcGFyc2UgYXJndW1lbnRzISBTZWUgLS1oZWxwIik7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJzaW1wbGUiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkLXBvb2wiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIGlmIChzc2wgPT0gdHJ1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBub25ibG9ja2luZyBzZXJ2ZXJzISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikpIHsKKyAgICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNTTCBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgbm9uYmxvY2tpbmcgc2VydmVycyEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzZXJ2ZXIgdHlwZSEgIiArIHNlcnZlcl90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHRyYW5zcG9ydCB0eXBlISAiICsgdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIH0KKworICAgICAgLy8gUHJvY2Vzc29ycworICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOworCisgICAgICBTZWNvbmRIYW5kbGVyIHNlY29uZEhhbmRsZXIgPSBuZXcgU2Vjb25kSGFuZGxlcigpOworICAgICAgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Igc2Vjb25kUHJvY2Vzc29yID0gbmV3IFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpOworCisgICAgICAvLyBQcm90b2NvbCBmYWN0b3J5CisgICAgICBUUHJvdG9jb2xGYWN0b3J5IHRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KHN0cmluZ19saW1pdCwgY29udGFpbmVyX2xpbWl0KTsKKyAgICAgIH0gZWxzZSB7IC8vIGFsc28gY292ZXJzIG11bHRpCisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfQorCisgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0VHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgICB0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgeyAvLyAuZXF1YWxzKCJidWZmZXJlZCIpID0+IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgdFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgIH0KKworICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOworCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKworICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAorICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgeworICAgICAgICAvLyBOb25ibG9ja2luZyBzZXJ2ZXJzCisgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB0Tm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgPQorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQocG9ydCkpOworCisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5jb250YWlucygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIC8vIE5vbmJsb2NraW5nIFNlcnZlcgorICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlci5BcmdzIHROb25ibG9ja2luZ1NlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCisgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKKyAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncworICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcih0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBCbG9ja2luZyBzZXJ2ZXJzCisKKyAgICAgICAgLy8gU1NMIHNvY2tldAorICAgICAgICBUU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPSBudWxsOworICAgICAgICBpZiAoc3NsKSB7CisgICAgICAgICAgdFNlcnZlclNvY2tldCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChwb3J0LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0U2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLnBvcnQocG9ydCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygic2ltcGxlIikpIHsKKyAgICAgICAgICAvLyBTaW1wbGUgU2VydmVyCisgICAgICAgICAgVFNlcnZlci5BcmdzIHRTZXJ2ZXJBcmdzID0gbmV3IFRTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodFNlcnZlckFyZ3MpOworICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZHBvb2wiKQorICAgICAgICAgIC8vIFRocmVhZFBvb2wgU2VydmVyCisgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyB0VGhyZWFkUG9vbFNlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHRUaHJlYWRQb29sU2VydmVyQXJncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICBzZXJ2ZXJFbmdpbmUuc2V0U2VydmVyRXZlbnRIYW5kbGVyKG5ldyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyKCkpOworCisgICAgICAvLyBSdW4gaXQKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlICIgKyAoc3NsID8gInNzbCBzZXJ2ZXIiIDogInNlcnZlciIpICsKKyAgICAgICAgIiBbIiArIHByb3RvY29sX3R5cGUgKyAiLyIgKyB0cmFuc3BvcnRfdHlwZSArICIvIiArIHNlcnZlcl90eXBlICsgIl0gb24gIiArCisgICAgICAgICgoZG9tYWluX3NvY2tldCA9PSAiIikgPyAoInBvcnQgIiArIHBvcnQpIDogKCJ1bml4IHNvY2tldCAiICsgZG9tYWluX3NvY2tldCkpKTsKKyAgICAgIHNlcnZlckVuZ2luZS5zZXJ2ZSgpOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9uZS4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQppbmRleCBiMmIxZTU3Li4zYzc0OWY5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQpAQCAtMTgsMzIgKzE4LDQ0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBSZWFkQ291bnRpbmdUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKICAgcHVibGljIGludCByZWFkQ291bnQgPSAwOwogICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnM7CisgIHByaXZhdGUgYm9vbGVhbiBvcGVuID0gdHJ1ZTsKIAogICBwdWJsaWMgUmVhZENvdW50aW5nVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewogICAgIHRyYW5zID0gdW5kZXJseWluZzsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIG9wZW4gPSBmYWxzZTsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7cmV0dXJuIHRydWU7fQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIG9wZW47CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgb3BlbiA9IHRydWU7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KICAgICByZWFkQ291bnQrKzsKICAgICByZXR1cm4gdHJhbnMucmVhZChidWYsIG9mZiwgbGVuKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCAzMzdkY2Y4Li5jMzUzNDg5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOwogCiAgICAgLy8gZG9lc24ndCBzaHJpbmsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMmUxZjk0Ny4uODNlYmMyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwKTsKIAogICAgIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1idWYgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KEhVTkRSRURfQllURVMpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggZDVmMjM5ZC4uODZiNWIwZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMTksMjYgKzE5LDUxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKIAotcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDApOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgdC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CiAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXXsxLDIsM307CiAgICAgdC53cml0ZShiMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygzLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDMpKTsKIAogICAgIHQucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwotICAgIGFzc2VydEVxdWFscygwLCB0LmdldFBvcygpKTsKICAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CiAgICAgdC53cml0ZShiMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygyLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIyKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMikpOworCisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHV1dCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoOCwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgdXV0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHV1dC5nZXRCdWYoKS5hcnJheSgpLCA0LCAzKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEluaXRpYWxTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgwLCAwKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgLTEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUb29TbWFsbEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIDUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzA3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQ2hhcnNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEJ5dGVCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlUmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KSk7CisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkdvb2RieWUgSG9yc2VzIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiR29vZGJ5ZSBIb3JzZXMiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCkpOworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIHdyaXRlIG9wZXJhdGlvbiB0byBmYWlsIHdpdGggVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggZTAyNDA0OS4uMDZlZTIwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTE5LDggKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogcHVibGljIGNsYXNzIFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRlc3RURnJhbWVkVHJhbnNwb3J0IHsKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDUwOworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7Ci0gICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCA1MCwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCBtYXhMZW5ndGgpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCA3OGY1OGVjLi5lMzBkNzRiIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcpOwogICB9CiAKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBtYXhMZW5ndGgpOworICB9CisKICAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZVNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmQtc3RhcnQrMV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gKGVuZC1zdGFydCk7IGkrKykgewpAQCAtNzUsNiArNzksNDAgQEAKICAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRUcmFucy5yZWFkQ291bnQpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRGcmFtZVNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBtYXhMZW5ndGggPSAxMjg7CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgxMzApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTI5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zLCBtYXhMZW5ndGgpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJ5IHsKKyAgICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgNCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBmcmFtZSB3ZSdyZSB0cnlpbmcgdG8gcmVhZCBpcyBsYXJnZXIgdGhhbiBvdXIgbWF4IGZyYW1lIGxlbmd0aAorICAgICAgYXNzZXJ0RXF1YWxzKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsIGUuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRGYWxzZSh0cmFucy5pc09wZW4oKSk7CisKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gVGhpcyB0aW1lIHdlIGdldCBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgZS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKQEAgLTg3LDExICsxMjUsMTEgQEAKICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKICAgICBhc3NlcnRFcXVhbHMoMjU2LCBkaW4ucmVhZEludCgpKTsKQEAgLTE0NSw0ICsxODMsMzIgQEAKICAgICBhc3NlcnRFcXVhbHMoNjUsIHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEwLCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMjIwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwyMTkpKSk7CisKKyAgICBhc3NlcnRUcnVlKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCB8fCB0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KTsKKyAgICBpZiAodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpICE9IG51bGwgJiYgdHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gMCk7CisgICAgICAoKFRGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSA9PSBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgICAgKChURmFzdEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA9PSBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmMyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2ltcGxlU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyLkFyZ3M7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBTZXJ2ZXJUZXN0QmFzZSB7CisgIHByaXZhdGUgVGhyZWFkIHNlcnZlclRocmVhZDsKKyAgcHJpdmF0ZSBUU2VydmVyIHNlcnZlcjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29scyA9IG5ldyBBcnJheUxpc3Q8VFByb3RvY29sRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICAvLyBUT0RPOiBPbmx5IHN1cHBvcnRlZCBvbiBUQmluYXJ5UHJvdG9jb2wuIERvZXNuJ3Qgd29yayBmb3IgVENvbXBhY3RQcm90b2NvbAorICAgIHByb3RvY29scy5hZGQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gZ2V0U2VydmVyVHJhbnNwb3J0KCk7CisgICAgICAgICAgZmluYWwgQXJncyBhcmdzID0gbmV3IEFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKTsKKyAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihhcmdzKTsKKyAgICAgICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXIuc3RvcCgpOworICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3BlbihUVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxUUHJvdG9jb2xGYWN0b3J5PiBnZXRQcm90b2NvbHMoKSB7CisgICAgcmV0dXJuIHByb3RvY29sczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIHRoaXMgdGVzdCBkb2Vzbid0IHJlYWxseSBhcHBseSB0byB0aGlzIHN1aXRlLCBzbyBsZXQncyBza2lwIGl0LgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50MSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiksCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldENsaWVudFNvY2tldChIT1NULCBQT1JULCAwLyp0aW1lb3V0Ki8sIHBhcmFtcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQyIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkKKyAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3CisgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworCisgICAgcGFyYW1zLnNldFRydXN0U3RvcmUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiKSwgbnVsbCk7CisKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suTmFtZUNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suUGFzc3dvcmRDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5BdXRob3JpemVDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlJlYWxtQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xDbGllbnRGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xTZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyRmFjdG9yeTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTaW1wbGVTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgVGVzdFRTYXNsVHJhbnNwb3J0cyBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdFRTYXNsVHJhbnNwb3J0cy5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAidGhyaWZ0LXRlc3QiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTkNJUEFMID0gInRocmlmdC10ZXN0LXByaW5jaXBhbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJzdXBlciBzZWNyZXQgcGFzc3dvcmQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAidGhyaWZ0LXRlc3QtcmVhbG0iOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTldSQVBQRURfTUVDSEFOSVNNID0gIkNSQU0tTUQ1IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBVTldSQVBQRURfUFJPUFMgPSBudWxsOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVEX01FQ0hBTklTTSA9ICJESUdFU1QtTUQ1IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBXUkFQUEVEX1BST1BTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgc3RhdGljIHsKKyAgICBXUkFQUEVEX1BST1BTLnB1dChTYXNsLlFPUCwgImF1dGgtaW50Iik7CisgICAgV1JBUFBFRF9QUk9QUy5wdXQoImNvbS5zdW4uc2VjdXJpdHkuc2FzbC5kaWdlc3QucmVhbG0iLCBSRUFMTSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdE1lc3NhZ2UxID0gIkhlbGxvLCB3b3JsZCEgQWxzbywgZm91ciAiCisgICAgICArICJzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGggb24gdGhpcyAiCisgICAgICArICJjb250aW5lbnQgYSBuZXcgbmF0aW9uLCBjb25jZWl2ZWQgaW4gbGliZXJ0eSwgYW5kIGRlZGljYXRlZCB0byB0aGUgIgorICAgICAgKyAicHJvcG9zaXRpb24gdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RNZXNzYWdlMiA9ICJJIGhhdmUgYSBkcmVhbSB0aGF0IG9uZSBkYXkgIgorICAgICAgKyAidGhpcyBuYXRpb24gd2lsbCByaXNlIHVwIGFuZCBsaXZlIG91dCB0aGUgdHJ1ZSBtZWFuaW5nIG9mIGl0cyBjcmVlZDogIgorICAgICAgKyAiJ1dlIGhvbGQgdGhlc2UgdHJ1dGhzIHRvIGJlIHNlbGYtZXZpZGVudCwgdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiciOworCisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhc3N3b3JkOworCisgICAgcHVibGljIFRlc3RTYXNsQ2FsbGJhY2tIYW5kbGVyKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZShDYWxsYmFja1tdIGNhbGxiYWNrcykgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoQ2FsbGJhY2sgYyA6IGNhbGxiYWNrcykgeworICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIE5hbWVDYWxsYmFjaykgeworICAgICAgICAgICgoTmFtZUNhbGxiYWNrKSBjKS5zZXROYW1lKFBSSU5DSVBBTCk7CisgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFBhc3N3b3JkQ2FsbGJhY2spIHsKKyAgICAgICAgICAoKFBhc3N3b3JkQ2FsbGJhY2spIGMpLnNldFBhc3N3b3JkKHBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBBdXRob3JpemVDYWxsYmFjaykgeworICAgICAgICAgICgoQXV0aG9yaXplQ2FsbGJhY2spIGMpLnNldEF1dGhvcml6ZWQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFJlYWxtQ2FsbGJhY2spIHsKKyAgICAgICAgICAoKFJlYWxtQ2FsbGJhY2spIGMpLnNldFRleHQoUkVBTE0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uKGMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgIGZpbmFsIFN0cmluZyBtZWNoYW5pc207CisgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wczsKKyAgICB2b2xhdGlsZSBUaHJvd2FibGUgdGhyb3duOworCisgICAgcHVibGljIFNlcnZlclRocmVhZChTdHJpbmcgbWVjaGFuaXNtLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzKSB7CisgICAgICB0aGlzLm1lY2hhbmlzbSA9IG1lY2hhbmlzbTsKKyAgICAgIHRoaXMucHJvcHMgPSBwcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnRlcm5hbFJ1bigpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgdGhyb3duID0gdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoCisgICAgICAgIG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgICBwb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGFjY2VwdEFuZFdyaXRlKHNlcnZlclNvY2tldCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWNjZXB0QW5kV3JpdGUoVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFRUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgVFRyYW5zcG9ydCBzYXNsU2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KAorICAgICAgICBtZWNoYW5pc20sIFNFUlZJQ0UsIEhPU1QsCisgICAgICAgIHByb3BzLCBuZXcgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIoUEFTU1dPUkQpLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICBzYXNsU2VydmVyVHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgYnl0ZVtdIGluQnVmID0gbmV3IGJ5dGVbdGVzdE1lc3NhZ2UxLmdldEJ5dGVzKCkubGVuZ3RoXTsKKyAgICAgIC8vIERlbGliZXJhdGVseSByZWFkIGxlc3MgdGhhbiB0aGUgZnVsbCBidWZmZXIgdG8gZW5zdXJlCisgICAgICAvLyB0aGF0IFRTYXNsVHJhbnNwb3J0IGlzIGNvcnJlY3RseSBidWZmZXJpbmcgcmVhZHMuIFRoaXMKKyAgICAgIC8vIHdpbGwgZmFpbCBmb3IgdGhlIFdSQVBQRUQgdGVzdCwgaWYgaXQgZG9lc24ndCB3b3JrLgorICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC5yZWFkQWxsKGluQnVmLCAwLCA1KTsKKyAgICAgIHNhc2xTZXJ2ZXJUcmFuc3BvcnQucmVhZEFsbChpbkJ1ZiwgNSwgMTApOworICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC5yZWFkQWxsKGluQnVmLCAxNSwgaW5CdWYubGVuZ3RoIC0gMTUpOworICAgICAgTE9HR0VSLmRlYnVnKCJzZXJ2ZXIgZ290OiB7fSIsIG5ldyBTdHJpbmcoaW5CdWYpKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nKGluQnVmKSwgdGVzdE1lc3NhZ2UxKTsKKworICAgICAgTE9HR0VSLmRlYnVnKCJzZXJ2ZXIgd3JpdGluZzoge30iLCB0ZXN0TWVzc2FnZTIpOworICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC53cml0ZSh0ZXN0TWVzc2FnZTIuZ2V0Qnl0ZXMoKSk7CisgICAgICBzYXNsU2VydmVyVHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHNhc2xTZXJ2ZXJUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdFNhc2xPcGVuKGZpbmFsIFN0cmluZyBtZWNoYW5pc20sIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkID0gbmV3IFNlcnZlclRocmVhZChtZWNoYW5pc20sIHByb3BzKTsKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gQWggd2VsbC4KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVFNvY2tldCBjbGllbnRTb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKKyAgICAgIFRUcmFuc3BvcnQgc2FzbENsaWVudFRyYW5zcG9ydCA9IG5ldyBUU2FzbENsaWVudFRyYW5zcG9ydChtZWNoYW5pc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTkNJUEFMLCBTRVJWSUNFLCBIT1NULCBwcm9wcywgbmV3IFRlc3RTYXNsQ2FsbGJhY2tIYW5kbGVyKFBBU1NXT1JEKSwgY2xpZW50U29ja2V0KTsKKyAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgTE9HR0VSLmRlYnVnKCJjbGllbnQgd3JpdGluZzoge30iLCB0ZXN0TWVzc2FnZTEpOworICAgICAgc2FzbENsaWVudFRyYW5zcG9ydC53cml0ZSh0ZXN0TWVzc2FnZTEuZ2V0Qnl0ZXMoKSk7CisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGJ5dGVbXSBpbkJ1ZiA9IG5ldyBieXRlW3Rlc3RNZXNzYWdlMi5nZXRCeXRlcygpLmxlbmd0aF07CisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LnJlYWRBbGwoaW5CdWYsIDAsIGluQnVmLmxlbmd0aCk7CisgICAgICBMT0dHRVIuZGVidWcoImNsaWVudCBnb3Q6IHt9IiwgbmV3IFN0cmluZyhpbkJ1ZikpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcoaW5CdWYpLCB0ZXN0TWVzc2FnZTIpOworCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uID0gZTsKKyAgICAgIH0KKyAgICAgIGFzc2VydE5vdE51bGwoZXhwZWN0ZWRFeGNlcHRpb24pOworCisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gY2F1Z2h0IiwgZSk7CisgICAgICB0aHJvdyBlOworICAgIH0gZmluYWxseSB7CisgICAgICBzZXJ2ZXJUaHJlYWQuaW50ZXJydXB0KCk7CisgICAgICB0cnkgeworICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBBaCB3ZWxsLgorICAgICAgfQorICAgICAgYXNzZXJ0TnVsbChzZXJ2ZXJUaHJlYWQudGhyb3duKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW53cmFwcGVkT3BlbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRlc3RTYXNsT3BlbihVTldSQVBQRURfTUVDSEFOSVNNLCBVTldSQVBQRURfUFJPUFMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFNhc2xPcGVuKFdSQVBQRURfTUVDSEFOSVNNLCBXUkFQUEVEX1BST1BTKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBbm9ueW1vdXNPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFNhc2xPcGVuKCJBTk9OWU1PVVMiLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIgZXhjZXB0aW9ucyB0aHJvd24gYmFjayB0aGUgc2VydmVyIHdoZW4KKyAgICogdGhlIGNsaWVudCBwcm92aWRlcyBpbnZhbGlkIHBhc3N3b3JkLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEJhZFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZCA9IG5ldyBTZXJ2ZXJUaHJlYWQoVU5XUkFQUEVEX01FQ0hBTklTTSwgVU5XUkFQUEVEX1BST1BTKTsKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gQWggd2VsbC4KKyAgICB9CisKKyAgICBib29sZWFuIGNsaWVudFNpZGVQYXNzZWQgPSB0cnVlOworCisgICAgdHJ5IHsKKyAgICAgIFRTb2NrZXQgY2xpZW50U29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgU2VydmVyVGVzdEJhc2UuUE9SVCk7CisgICAgICBUVHJhbnNwb3J0IHNhc2xDbGllbnRUcmFuc3BvcnQgPSBuZXcgVFNhc2xDbGllbnRUcmFuc3BvcnQoCisgICAgICAgIFVOV1JBUFBFRF9NRUNIQU5JU00sIFBSSU5DSVBBTCwgU0VSVklDRSwgSE9TVCwgVU5XUkFQUEVEX1BST1BTLAorICAgICAgICBuZXcgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIoIk5PVCBUSEUgUEFTU1dPUkQiKSwgY2xpZW50U29ja2V0KTsKKyAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgY2xpZW50U2lkZVBhc3NlZCA9IGZhbHNlOworICAgICAgZmFpbCgiV2FzIGFibGUgdG8gb3BlbiB0cmFuc3BvcnQgd2l0aCBiYWQgcGFzc3dvcmQiKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0ZSkgeworICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gZm9yIGJhZCBwYXNzd29yZCIsIHR0ZSk7CisgICAgICBhc3NlcnROb3ROdWxsKHR0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgYXNzZXJ0VHJ1ZSh0dGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJJbnZhbGlkIHJlc3BvbnNlIikpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlcnZlclRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisKKyAgICAgIGlmIChjbGllbnRTaWRlUGFzc2VkKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmVyVGhyZWFkLnRocm93bik7CisgICAgICAgIGFzc2VydFRydWUoc2VydmVyVGhyZWFkLnRocm93bi5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkludmFsaWQgcmVzcG9uc2UiKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdpdGhTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgVGVzdFRTYXNsVHJhbnNwb3J0c1dpdGhTZXJ2ZXIoKS50ZXN0SXQoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RUU2FzbFRyYW5zcG9ydHNXaXRoU2VydmVyIGV4dGVuZHMgU2VydmVyVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBUaHJlYWQgc2VydmVyVGhyZWFkOworICAgIHByaXZhdGUgVFNlcnZlciBzZXJ2ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBuZXcgVFNhc2xDbGllbnRUcmFuc3BvcnQoCisgICAgICAgIFdSQVBQRURfTUVDSEFOSVNNLCBQUklOQ0lQQUwsIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCisgICAgICAgIG5ldyBUZXN0U2FzbENhbGxiYWNrSGFuZGxlcihQQVNTV09SRCksIHVuZGVybHlpbmdUcmFuc3BvcnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgVFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldC5TZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkucG9ydChQT1JUKSk7CisKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuRmFjdG9yeSgKKyAgICAgICAgICAgICAgV1JBUFBFRF9NRUNIQU5JU00sIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCisgICAgICAgICAgICAgIG5ldyBUZXN0U2FzbENhbGxiYWNrSGFuZGxlcihQQVNTV09SRCkpOworICAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIobmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS50cmFuc3BvcnRGYWN0b3J5KGZhY3RvcnkpLnByb3RvY29sRmFjdG9yeShwcm90b0ZhY3RvcnkpKTsKKworICAgICAgICAgICAgLy8gUnVuIGl0CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCB7fSIsIFBPUlQpOworICAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICAgIH0KKworICB9CisKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgU0FTTCBBTk9OWU1PVVMsIHVzZWQgZm9yIHRlc3RpbmcgY2xpZW50LXNpZGUKKyAgICogaW5pdGlhbCByZXNwb25zZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm9ueW1vdXNDbGllbnQgaW1wbGVtZW50cyBTYXNsQ2xpZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VybmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2U7CisKKyAgICBwdWJsaWMgQW5vbnltb3VzQ2xpZW50KFN0cmluZyB1c2VybmFtZSkgeworICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVjaGFuaXNtTmFtZSgpIHsgcmV0dXJuICJBTk9OWU1PVVMiOyB9CisgICAgcHVibGljIGJvb2xlYW4gaGFzSW5pdGlhbFJlc3BvbnNlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVDaGFsbGVuZ2UoYnl0ZVtdIGNoYWxsZW5nZSkgdGhyb3dzIFNhc2xFeGNlcHRpb24geworICAgICAgaWYgKGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlKSB7CisgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOworICAgICAgfQorCisgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7CisgICAgICByZXR1cm4gdXNlcm5hbWUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7IHJldHVybiBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZTsgfQorICAgIHB1YmxpYyBieXRlW10gdW53cmFwKGJ5dGVbXSBpbmNvbWluZywgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHB1YmxpYyBieXRlW10gd3JhcChieXRlW10gb3V0Z29pbmcsIGludCBvZmZzZXQsIGludCBsZW4pIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5lZ290aWF0ZWRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFub255bW91c1NlcnZlciBpbXBsZW1lbnRzIFNhc2xTZXJ2ZXIgeworICAgIHByaXZhdGUgU3RyaW5nIHVzZXI7CisgICAgcHVibGljIFN0cmluZyBnZXRNZWNoYW5pc21OYW1lKCkgeyByZXR1cm4gIkFOT05ZTU9VUyI7IH0KKyAgICBwdWJsaWMgYnl0ZVtdIGV2YWx1YXRlUmVzcG9uc2UoYnl0ZVtdIHJlc3BvbnNlKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICB0aGlzLnVzZXIgPSBuZXcgU3RyaW5nKHJlc3BvbnNlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gdXNlciAhPSBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpemF0aW9uSUQoKSB7IHJldHVybiB1c2VyOyB9CisgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisgICAgcHVibGljIGJ5dGVbXSB3cmFwKGJ5dGVbXSBvdXRnb2luZywgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhc2xBbm9ueW1vdXNGYWN0b3J5CisgICAgaW1wbGVtZW50cyBTYXNsQ2xpZW50RmFjdG9yeSwgU2FzbFNlcnZlckZhY3RvcnkgeworCisgICAgcHVibGljIFNhc2xDbGllbnQgY3JlYXRlU2FzbENsaWVudCgKKyAgICAgIFN0cmluZ1tdIG1lY2hhbmlzbXMsIFN0cmluZyBhdXRob3JpemF0aW9uSWQsIFN0cmluZyBwcm90b2NvbCwKKyAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLCBNYXA8U3RyaW5nLD8+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKQorICAgIHsKKyAgICAgIGZvciAoU3RyaW5nIG1lY2ggOiBtZWNoYW5pc21zKSB7CisgICAgICAgIGlmICgiQU5PTllNT1VTIi5lcXVhbHMobWVjaCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEFub255bW91c0NsaWVudChhdXRob3JpemF0aW9uSWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2FzbFNlcnZlciBjcmVhdGVTYXNsU2VydmVyKAorICAgICAgU3RyaW5nIG1lY2hhbmlzbSwgU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmVyTmFtZSwgTWFwPFN0cmluZyw/PiBwcm9wcywgQ2FsbGJhY2tIYW5kbGVyIGNiaCkKKyAgICB7CisgICAgICBpZiAoIkFOT05ZTU9VUyIuZXF1YWxzKG1lY2hhbmlzbSkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTZXJ2ZXIoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWVjaGFuaXNtTmFtZXMoTWFwPFN0cmluZywgPz4gcHJvcHMpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiQU5PTllNT1VTIiB9OworICAgIH0KKyAgfQorCisgIHN0YXRpYyB7CisgICAgamF2YS5zZWN1cml0eS5TZWN1cml0eS5hZGRQcm92aWRlcihuZXcgU2FzbEFub255bW91c1Byb3ZpZGVyKCkpOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FzbEFub255bW91c1Byb3ZpZGVyIGV4dGVuZHMgamF2YS5zZWN1cml0eS5Qcm92aWRlciB7CisgICAgcHVibGljIFNhc2xBbm9ueW1vdXNQcm92aWRlcigpIHsKKyAgICAgIHN1cGVyKCJUaHJpZnRTYXNsQW5vbnltb3VzIiwgMS4wLCAiVGhyaWZ0IEFub255bW91cyBTQVNMIHByb3ZpZGVyIik7CisgICAgICBwdXQoIlNhc2xDbGllbnRGYWN0b3J5LkFOT05ZTU9VUyIsIFNhc2xBbm9ueW1vdXNGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICBwdXQoIlNhc2xTZXJ2ZXJGYWN0b3J5LkFOT05ZTU9VUyIsIFNhc2xBbm9ueW1vdXNGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1RUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICAgIGJ5dGVbXSBiYWRIZWFkZXIgPSBudWxsOworICAgIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXIgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KCk7CisKKyAgICBwdWJsaWMgTW9ja1RUcmFuc3BvcnQoaW50IG1vZGUpIHsKKyAgICAgIGlmIChtb2RlPT0xKSB7CisgICAgICAgIC8vIEludmFsaWQgc3RhdHVzIGJ5dGUKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4RkYsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDUgfTsKKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAyKSB7CisgICAgICAgIC8vIFZhbGlkIHN0YXR1cyBieXRlLCBuZWdhdGl2ZSBwYXlsb2FkIGxlbmd0aAorICAgICAgICBiYWRIZWFkZXIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMHgwMSwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiB9OworICAgICAgfSBlbHNlIGlmIChtb2RlID09IDMpIHsKKyAgICAgICAgLy8gVmFsaWQgc3RhdHVzIGJ5dGUsIGV4Y2Vzc2l2ZWx5IGxhcmdlLCBib2d1cyBwYXlsb2FkIGxlbmd0aAorICAgICAgICBiYWRIZWFkZXIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMHgwMSwgKGJ5dGUpMHg2NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCB9OworICAgICAgfQorICAgICAgcmVhZEJ1ZmZlci5yZXNldChiYWRIZWFkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRIZWFkZXIoKSB7CisgICAgVFNhc2xUcmFuc3BvcnQgc2FzbFRyYW5zcG9ydCA9IG5ldyBUU2FzbFNlcnZlclRyYW5zcG9ydChuZXcgTW9ja1RUcmFuc3BvcnQoMSkpOworICAgIHRyeSB7CisgICAgICBzYXNsVHJhbnNwb3J0LnJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIGR1ZSB0byBpbmNvcnJlY3Qgc3RhdHVzIGJ5dGUgdmFsdWUuIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIHN0YXR1cyAtMSIpOworICAgIH0KKyAgICBzYXNsVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KG5ldyBNb2NrVFRyYW5zcG9ydCgyKSk7CisgICAgdHJ5IHsKKyAgICAgIHNhc2xUcmFuc3BvcnQucmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IgZHVlIHRvIG5lZ2F0aXZlIHBheWxvYWQgbGVuZ3RoLiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6IC0xIik7CisgICAgfQorICAgIHNhc2xUcmFuc3BvcnQgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQobmV3IE1vY2tUVHJhbnNwb3J0KDMpKTsKKyAgICB0cnkgeworICAgICAgc2FzbFRyYW5zcG9ydC5yZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBkdWUgdG8gYm9ndXMgKGxhcmdlKSBwYXlsb2FkIGxlbmd0aC4iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkludmFsaWQgcGF5bG9hZCBoZWFkZXIgbGVuZ3RoOiAxNjc3NzIxNjAwIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODgwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0RnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvL1Rlc3Qgd3JpdGUgc2lkZQorICAgIFBhdGggdGVtcEZpbGVQYXRoTmFtZSA9IEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCJUU2ltcGxlRmlsZVRyYW5zcG9ydFRlc3QiLCBudWxsKTsKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CisgICAgYnl0ZVtdIGlucHV0X2J1ZiA9IG5ldyBieXRlW117MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIFRTaW1wbGVGaWxlVHJhbnNwb3J0IHRyYW5zX3dyaXRlID0gbmV3IFRTaW1wbGVGaWxlVHJhbnNwb3J0KHRlbXBGaWxlUGF0aE5hbWUudG9TdHJpbmcoKSxmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIGFzc2VydCAoIXRyYW5zX3dyaXRlLmlzT3BlbigpKTsKKyAgICB0cmFuc193cml0ZS5vcGVuKCk7CisgICAgYXNzZXJ0KHRyYW5zX3dyaXRlLmlzT3BlbigpKTsKKyAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYpOworICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1ZiwyLDIpOworICAgIHRyYW5zX3dyaXRlLmZsdXNoKCk7CisgICAgdHJhbnNfd3JpdGUuY2xvc2UoKTsKKworICAgIC8vVGVzdCByZWFkIHNpZGUKKyAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFucyA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksdHJ1ZSwgZmFsc2UpOworICAgIGFzc2VydCh0cmFucy5pc09wZW4oKSk7CisKKyAgICAvL1NpbXBsZSBmaWxlIHRyYW5zIHByb3ZpZGVzIG5vIGJ1ZmZlciBhY2Nlc3MKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKKyAgICBhc3NlcnQobnVsbCA9PSB0cmFucy5nZXRCdWZmZXIoKSk7CisgICAgYXNzZXJ0KC0xID09IHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CisKKyAgICAvL1Rlc3QgZmlsZSBwb2ludGVyIG9wZXJhdGlvbnMKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICBhc3NlcnQoMTIgPT0gdHJhbnMubGVuZ3RoKCkpOworCisgICAgZmluYWwgaW50IEJVRlNJWiA9IDQ7CisgICAgYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVtCVUZTSVpdOworICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKKyAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOworICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKKworICAgIGludCBieXRlc1JlYWQgPSB0cmFucy5yZWFkKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KGJ5dGVzUmVhZCA+IDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNSZWFkOyArK2kpIHsKKyAgICAgIGFzc2VydChidWYxW2ldID09IGkrNSk7CisgICAgfQorCisgICAgdHJhbnMuc2VlaygwKTsKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICB0cmFucy5yZWFkQWxsKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSwgYnVmMSkpOworICAgIGFzc2VydChCVUZTSVogPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3ZjljMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC56aXAuRGF0YUZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUWmxpYlRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7CisgICAgcmV0dXJuIG5ldyBUWmxpYlRyYW5zcG9ydCh1bmRlcmx5aW5nKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJ5dGVTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZW5kLXN0YXJ0KzFdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IChlbmQtc3RhcnQpOyBpKyspIHsKKyAgICAgIHJlc3VsdFtpXSA9IChieXRlKShzdGFydCtpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbQorICAgICAgICAoYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKKyAgICBjb3VudGluZ1RyYW5zLmNsb3NlKCk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZU9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KGJhb3MpKTsKKyAgICBieXRlW10gdW5jb21wcmVzc2VkID0gYnl0ZVNlcXVlbmNlKDAsIDI0NSk7CisgICAgdHJhbnMud3JpdGUodW5jb21wcmVzc2VkKTsKKyAgICB0cmFucy5jbG9zZSgpOworICAgIGZpbmFsIGJ5dGVbXSBjb21wcmVzc2VkID0gYmFvcy50b0J5dGVBcnJheSgpOworCisgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1NV07CisgICAgVFRyYW5zcG9ydCB0cmFuc1JlYWQgPSBnZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29tcHJlc3NlZCkpKTsKKyAgICBpbnQgcmVhZEJ5dGVzID0gdHJhbnNSZWFkLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHModW5jb21wcmVzc2VkLmxlbmd0aCwgcmVhZEJ5dGVzKTsKKyAgICB0cmFuc1JlYWQuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEZWZsYXRlck91dHB1dFN0cmVhbSBkZWZsYXRlck91dHB1dFN0cmVhbSA9IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGRlZmxhdGVyT3V0cHV0U3RyZWFtKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDQ5KSk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKTsKKworICAgIGRlZmxhdGVyT3V0cHV0U3RyZWFtLmZpbmlzaCgpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDEwKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgxMCwxOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgYXNzZXJ0RXF1YWxzKDMwLCB0cmFucy5yZWFkKG5ldyBieXRlWzMwXSwgMCwgMzApKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgYXNzZXJ0RXF1YWxzKDIyMCwgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsIDIxOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zKSkpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRpbmdUcmFucyk7CisKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDEwMSwgMjAwKSk7CisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDIwMSwgMjU1KSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICB0cmFucy5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDI0NSkpOworICAgIHRyYW5zLmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICBEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkpOworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTZdOworICAgIGludCBuID0gZGluLnJlYWQoYnVmLCAwLCAyNTYpOworICAgIGFzc2VydEVxdWFscyhuLCAyNTYpOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlU2VxdWVuY2UoMCwgMjU1KSwgYnVmKSk7CisKKyAgICBidWYgPSBuZXcgYnl0ZVsyNDZdOworICAgIG4gPSBkaW4ucmVhZChidWYsIDAsIDI0Nik7CisgICAgYXNzZXJ0RXF1YWxzKG4sIDI0Nik7CisgICAgZm9yIChpbnQgaSA9IDA7IGk8YnVmLmxlbmd0aDsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoImZvciAiK2ksIGJ5dGVTZXF1ZW5jZSgwLDI0NSlbaV0sIGJ1ZltpXSk7CisgICAgfQorCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVTZXF1ZW5jZSgwLDI0NSksIGJ1ZikpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1dyaXRlQ291bnRpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1dyaXRlQ291bnRpbmdUcmFuc3BvcnQuamF2YQppbmRleCBkYWFkODM4Li4zNThmNWM2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9Xcml0ZUNvdW50aW5nVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvV3JpdGVDb3VudGluZ1RyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAgIHB1YmxpYyBpbnQgd3JpdGVDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NjEyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9NRVRIT0QgPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKKworICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKworICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgIH0KKworICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGludCB0eXBlKSB7CisgICAgc3VwZXIoKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRGaWVsZCBmaWVsZDsKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICBpbnQgdHlwZSA9IFVOS05PV047CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgbWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRTdHJ1Y3Qgc3RydWN0ID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKHN0cnVjdCk7CisgICAgaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICBmaWVsZC5uYW1lID0gIm1lc3NhZ2UiOworICAgICAgZmllbGQudHlwZSA9IFRUeXBlLlNUUklORzsKKyAgICAgIGZpZWxkLmlkID0gMTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhnZXRNZXNzYWdlKCkpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBmaWVsZC5uYW1lID0gInR5cGUiOworICAgIGZpZWxkLnR5cGUgPSBUVHlwZS5JMzI7CisgICAgZmllbGQuaWQgPSAyOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgb3Byb3Qud3JpdGVJMzIodHlwZV8pOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYTAyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2UgIHsKKworICAvKioKKyAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOworCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgKgorICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcik7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzFkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFRCYXNlSGVscGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhib29sZWFuIGEsIGJvb2xlYW4gYikgeworICAgICAgICAgcmV0dXJuIChhID09IGIpID8gMCA6IChhID8gMSA6IC0xKTsKKyAgICAKKworICAgIH0KKyAgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKEJvb2xlYW4gYSwgQm9vbGVhbiBiKSB7CisgICAgICAgICByZXR1cm4gKGEuYm9vbGVhblZhbHVlKCkgPT0gYi5ib29sZWFuVmFsdWUoKSkgPyAwIDogKGEuYm9vbGVhblZhbHVlKCkgPyAxIDogLTEpOworCisKKyAgICB9CisgICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhCb29sZWFuIGEsIGJvb2xlYW4gYikgeworICAgICAgICAgcmV0dXJuIChhLmJvb2xlYW5WYWx1ZSgpID09IGIpID8gMCA6IChhLmJvb2xlYW5WYWx1ZSgpID8gMSA6IC0xKTsKKworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGJvb2xlYW5WYWx1ZU9mKGJvb2xlYW4gYikgeworICAgICAgICByZXR1cm4gKGIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZSBhLCBieXRlIGIpIHsKKyAgICAgICAgaWYgKGEgPCBiKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oc2hvcnQgYSwgc2hvcnQgYikgeworICAgICAgICBpZiAoYSA8IGIpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChiIDwgYSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhpbnQgYSwgaW50IGIpIHsKKyAgICAgICAgaWYgKGEgPCBiKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8obG9uZyBhLCBsb25nIGIpIHsKKyAgICAgICAgaWYgKGEgPCBiKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7CisgICAgICAgIGlmIChhIDwgYikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGIgPCBhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBhLCBTdHJpbmcgYikgeworICAgICAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgeworICAgICAgICBpbnQgc2l6ZUNvbXBhcmUgPSBjb21wYXJlVG8oYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICAgICAgaWYgKHNpemVDb21wYXJlICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBieXRlQ29tcGFyZSA9IGNvbXBhcmVUbyhhLCBiKTsKKyAgICAgICAgICAgIGlmIChieXRlQ29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhPYmplY3QgYSwgT2JqZWN0IGIpIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBWZWN0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG8oKFZlY3RvcilhLCAoVmVjdG9yKWIpOworICAgICAgICB9IGlmIChhIGluc3RhbmNlb2YgSGFzaHRhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvKChIYXNodGFibGUpYSwgKEhhc2h0YWJsZSliKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoKFRCYXNlKWEpLmNvbXBhcmVUbyhiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhWZWN0b3IgYSwgVmVjdG9yIGIpIHsKKyAgICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3Qgb0EgPSBhLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIE9iamVjdCBvQiA9IGIuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8ob0EsIG9CKTsKKyAgICAgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKEhhc2h0YWJsZSBhLCBIYXNodGFibGUgYikgeworICAgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBlbnVtQSA9IGEua2V5cygpOworICAgICAgICBFbnVtZXJhdGlvbiBlbnVtQiA9IGIua2V5cygpOworICAgICAgICB3aGlsZSAobGFzdENvbXBhcmlzb24gPT0gMCAmJiBlbnVtQS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgT2JqZWN0IGtleUEgPSBlbnVtQS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgT2JqZWN0IGtleUIgPSBlbnVtQi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oa2V5QSwga2V5Qik7CisgICAgICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuZ2V0KGtleUEpLCBiLmdldChrZXlCKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhURW51bSBhLCBURW51bSBiKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8oYS5nZXRWYWx1ZSgpLCBiLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7CisgICAgICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG9BID0gYS5nZXQoaSk7CisgICAgICAgICAgICBPYmplY3Qgb0IgPSBiLmdldChpKTsKKyAgICAgICAgICAgIGlmIChvQSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbygoTGlzdCkgb0EsIChMaXN0KSBvQik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKChDb21wYXJhYmxlKSBvQSwgKENvbXBhcmFibGUpIG9CKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAgKi8KKworICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoYnl0ZVtdIGJ5dGVzLCBTdHJpbmdCdWZmZXIgc2IpIHsKKyAgICB0b1N0cmluZyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCBzYik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoYnl0ZVtdIGJ1ZiwgaW50IGFycmF5T2Zmc2V0LCBpbnQgb3JpZ0xpbWl0LCBTdHJpbmdCdWZmZXIgc2IpIHsKKyAgICBpbnQgbGltaXQgPSAob3JpZ0xpbWl0IC0gYXJyYXlPZmZzZXQgPiAxMjgpID8gYXJyYXlPZmZzZXQgKyAxMjggOiBvcmlnTGltaXQ7CisKKyAgICBmb3IgKGludCBpID0gYXJyYXlPZmZzZXQ7IGkgPCBsaW1pdDsgaSsrKSB7CisgICAgICBpZiAoaSA+IGFycmF5T2Zmc2V0KSB7CisgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgc2IuYXBwZW5kKHBhZGRlZEJ5dGVTdHJpbmcoYnVmW2ldKSk7CisgICAgfQorICAgIGlmIChvcmlnTGltaXQgIT0gbGltaXQpIHsKKyAgICAgIHNiLmFwcGVuZCgiLi4uIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkZGVkQnl0ZVN0cmluZyhieXRlIGIpIHsKKyAgICBpbnQgZXh0ZW5kZWQgPSAoYiB8IDB4MTAwKSAmIDB4MWZmOworICAgIHJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGV4dGVuZGVkKS50b1VwcGVyQ2FzZSgpLnN1YnN0cmluZygxKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3YzJlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworLyoqCisgKiBDbGFzcyB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYnVmIHdpdGhvdXQgZG9pbmcgZGVlcAorICogY29waWVzIG9uIGl0LgorICoKKyAqLworcHVibGljIGNsYXNzIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworICBwdWJsaWMgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShpbnQgc2l6ZSkgeworICAgIHN1cGVyKHNpemUpOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXQoKSB7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHB1YmxpYyBpbnQgbGVuKCkgeworICAgIHJldHVybiBjb3VudDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2VhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworCisvKioKKyAqIEdlbmVyaWMgdXRpbGl0eSBmb3IgZWFzaWx5IGRlc2VyaWFsaXppbmcgb2JqZWN0cyBmcm9tIGEgYnl0ZSBhcnJheSBvciBKYXZhCisgKiBTdHJpbmcuCisgKgorICovCitwdWJsaWMgY2xhc3MgVERlc2VyaWFsaXplciB7CisgIHByaXZhdGUgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnlfOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorICAgKi8KKyAgcHVibGljIFREZXNlcmlhbGl6ZXIoKSB7CisgICAgdGhpcyhuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIuIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZQorICAgKiBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgorICAgKgorICAgKiBAcGFyYW0gcHJvdG9jb2xGYWN0b3J5IEZhY3RvcnkgdG8gY3JlYXRlIGEgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyBURGVzZXJpYWxpemVyKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgcHJvdG9jb2xGYWN0b3J5XyA9IHByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIC8qKgorICAgKiBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBmcm9tIGEgYnl0ZSBhcnJheS4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBhcnJheSB0byByZWFkIGZyb20KKyAgICovCisgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFRCYXNlIGJhc2UsIGJ5dGVbXSBieXRlcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJhc2UucmVhZCgKKyAgICAgICAgcHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbCgKKyAgICAgICAgICBuZXcgVElPU3RyZWFtVHJhbnNwb3J0KAorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSkpKTsKKyAgfQorCisgIC8qKgorICAgKiBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBmcm9tIGEgSmF2YSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWVkCisgICAqIGNoYXJhY3RlciBzZXQgZm9yIGRlY29kaW5nLgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHJlYWQgaW50bworICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RyaW5nIHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gY2hhcnNldCBWYWxpZCBKVk0gY2hhcnNldAorICAgKi8KKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoVEJhc2UgYmFzZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGRlc2VyaWFsaXplKGJhc2UsIGRhdGEuZ2V0Qnl0ZXMoY2hhcnNldCkpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgRU5DT0RJTkc6ICIgKyBjaGFyc2V0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRGVlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBmcm9tIGEgSmF2YSBzdHJpbmcsIHVzaW5nIHRoZSBkZWZhdWx0IEpWTQorICAgKiBjaGFyc2V0IGVuY29kaW5nLgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHJlYWQgaW50bworICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RyaW5nIHRvIHJlYWQgZnJvbQorICAgKiBAcmV0dXJuIFNlcmlhbGl6ZWQgb2JqZWN0IGFzIGEgU3RyaW5nCisgICAqLworICBwdWJsaWMgdm9pZCB0b1N0cmluZyhUQmFzZSBiYXNlLCBTdHJpbmcgZGF0YSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGRlc2VyaWFsaXplKGJhc2UsIGRhdGEuZ2V0Qnl0ZXMoKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW0uamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1ZmRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitwdWJsaWMgaW50ZXJmYWNlIFRFbnVtIHsKKyAgcHVibGljIGludCBnZXRWYWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzc1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvKioKKyAqIEdlbmVyaWMgZXhjZXB0aW9uIGNsYXNzIGZvciBUaHJpZnQuCisgKgorICovCitwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIFRFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBURXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKwlzdXBlcihjYXVzZS5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgcHVibGljIFRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCSAgc3VwZXIobWVzc2FnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEZpZWxkUmVxdWlyZW1lbnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0YTM5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBSZXF1aXJlbWVudCB0eXBlIGNvbnN0YW50cy4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBURmllbGRSZXF1aXJlbWVudFR5cGUgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVRVUlSRUQgID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QVElPTkFMID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERFRkFVTFQgPSAzOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTUyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yIHsKKyAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpCisgICAgdGhyb3dzIFRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q4YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KKyAqIGluc3RhbmNlLgorICovCitwdWJsaWMgY2xhc3MgVFByb2Nlc3NvckZhY3RvcnkgeworCisgIHByaXZhdGUgZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworCisgIHB1YmxpYyBUUHJvY2Vzc29yRmFjdG9yeShUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgIH0KKworICBwdWJsaWMgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucykgeworICAgIHJldHVybiBwcm9jZXNzb3JfOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXplci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFjZTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7CisKKy8qKgorICogR2VuZXJpYyB1dGlsaXR5IGZvciBlYXNpbHkgc2VyaWFsaXppbmcgb2JqZWN0cyBpbnRvIGEgYnl0ZSBhcnJheSBvciBKYXZhCisgKiBTdHJpbmcuCisgKgorICovCitwdWJsaWMgY2xhc3MgVFNlcmlhbGl6ZXIgeworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBieXRlIGFycmF5IHRoYXQgZGF0YSBpcyBhY3R1YWxseSBzZXJpYWxpemVkIGludG8KKyAgICovCisgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3NfID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgIC8qKgorICAgKiBUaGlzIHRyYW5zcG9ydCB3cmFwcyB0aGF0IGJ5dGUgYXJyYXkKKyAgICovCisgIHByaXZhdGUgZmluYWwgVElPU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydF8gPSBuZXcgVElPU3RyZWFtVHJhbnNwb3J0KGJhb3NfKTsKKworICAvKioKKyAgICogSW50ZXJuYWwgcHJvdG9jb2wgdXNlZCBmb3Igc2VyaWFsaXppbmcgb2JqZWN0cy4KKyAgICovCisgIHByaXZhdGUgVFByb3RvY29sIHByb3RvY29sXzsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCisgICAqLworICBwdWJsaWMgVFNlcmlhbGl6ZXIoKSB7CisgICAgdGhpcyhuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyLiBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUKKyAgICogZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KKyAgICoKKyAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBGYWN0b3J5IHRvIGNyZWF0ZSBhIHByb3RvY29sCisgICAqLworICBwdWJsaWMgVFNlcmlhbGl6ZXIoVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBwcm90b2NvbF8gPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0Xyk7CisgIH0KKworICAvKioKKyAgICogU2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGludG8gYSBieXRlIGFycmF5LiBUaGUgcHJvY2VzcyBpcyBzaW1wbGUsCisgICAqIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQorICAgKiByYXcgYnl0ZXMuCisgICAqCisgICAqIEBwYXJhbSBiYXNlIFRoZSBvYmplY3QgdG8gc2VyaWFsaXplCisgICAqIEByZXR1cm4gU2VyaWFsaXplZCBvYmplY3QgaW4gYnl0ZVtdIGZvcm1hdAorICAgKi8KKyAgcHVibGljIGJ5dGVbXSBzZXJpYWxpemUoVEJhc2UgYmFzZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJhb3NfLnJlc2V0KCk7CisgICAgYmFzZS53cml0ZShwcm90b2NvbF8pOworICAgIHJldHVybiBiYW9zXy50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBpbnRvIGEgSmF2YSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWVkCisgICAqIGNoYXJhY3RlciBzZXQgZm9yIGVuY29kaW5nLgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHNlcmlhbGl6ZQorICAgKiBAcGFyYW0gY2hhcnNldCBWYWxpZCBKVk0gY2hhcnNldAorICAgKiBAcmV0dXJuIFNlcmlhbGl6ZWQgb2JqZWN0IGFzIGEgU3RyaW5nCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRCYXNlIGJhc2UsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKHNlcmlhbGl6ZShiYXNlKSwgY2hhcnNldCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBFTkNPRElORzogIiArIGNoYXJzZXQpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIEphdmEgc3RyaW5nLCB1c2luZyB0aGUgZGVmYXVsdCBKVk0KKyAgICogY2hhcnNldCBlbmNvZGluZy4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byBzZXJpYWxpemUKKyAgICogQHJldHVybiBTZXJpYWxpemVkIG9iamVjdCBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUQmFzZSBiYXNlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2VyaWFsaXplKGJhc2UpKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTA3Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKy8qKgorICogQSBUU2VydmljZUNsaWVudCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYSBUU2VydmljZSBpbXBsZW1lbnRhdGlvbgorICogYWNyb3NzIHByb3RvY29scyBhbmQgdHJhbnNwb3J0cy4KKyAqLworcHVibGljIGludGVyZmFjZSBUU2VydmljZUNsaWVudCB7CisgIC8qKgorICAgKiBHZXQgdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBpbnB1dCAocmVhZCkgcHJvdG9jb2wuCisgICAqIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpOworICAvKioKKyAgICogR2V0IHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgb3V0cHV0ICh3cml0ZSkgcHJvdG9jb2wuCisgICAqIEByZXR1cm4KKyAgICovCisgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgbWV0YSBkYXRhIGFib3V0IHRocmlmdCBmaWVsZHMuIEV2ZXJ5IGZpZWxkIGluIGEKKyAqIGEgc3RydWN0IHNob3VsZCBoYXZlIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGRlc2NyaWJpbmcgaXQuCisgKgorICovCitwdWJsaWMgY2xhc3MgRmllbGRNZXRhRGF0YSAgeworICBwdWJsaWMgZmluYWwgU3RyaW5nIGZpZWxkTmFtZTsKKyAgcHVibGljIGZpbmFsIGJ5dGUgcmVxdWlyZW1lbnRUeXBlOworICBwdWJsaWMgZmluYWwgRmllbGRWYWx1ZU1ldGFEYXRhIHZhbHVlTWV0YURhdGE7CisgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzdHJ1Y3RNYXA7CisgIAorICBzdGF0aWMgeworICAgIHN0cnVjdE1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgfQorICAKKyAgcHVibGljIEZpZWxkTWV0YURhdGEoU3RyaW5nIG5hbWUsIGJ5dGUgcmVxLCBGaWVsZFZhbHVlTWV0YURhdGEgdk1ldGFEYXRhKXsKKyAgICB0aGlzLmZpZWxkTmFtZSA9IG5hbWU7CisgICAgdGhpcy5yZXF1aXJlbWVudFR5cGUgPSByZXE7CisgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcywgSGFzaHRhYmxlIG1hcCl7CisgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG1hcCB3aXRoIG1ldGFkYXRhIChpLmUuIGluc3RhbmNlcyBvZiBGaWVsZE1ldGFEYXRhKSB0aGF0CisgICAqIGRlc2NyaWJlIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEhhc2h0YWJsZSBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MpeworICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAorICAgICAgdHJ5eworICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSl7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGZvciBUQmFzZSBjbGFzczogIiArIHNDbGFzcy5nZXROYW1lKCkgKyAiLCBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZm9yIFRCYXNlIGNsYXNzOiAiICsgc0NsYXNzLmdldE5hbWUoKSArICIsIG1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAoSGFzaHRhYmxlKSBzdHJ1Y3RNYXAuZ2V0KHNDbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzAxN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworCisvKioKKyAqIEZpZWxkVmFsdWVNZXRhRGF0YSBhbmQgY29sbGVjdGlvbiBvZiBzdWJjbGFzc2VzIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0CisgKiB0aGUgdmFsdWUocykgb2YgYSBmaWVsZAorICovCitwdWJsaWMgY2xhc3MgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKyAgcHVibGljIGZpbmFsIGJ5dGUgdHlwZTsgIAorIAorICBwdWJsaWMgRmllbGRWYWx1ZU1ldGFEYXRhKGJ5dGUgdHlwZSl7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3QoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gVFR5cGUuU1RSVUNUOyAKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gVFR5cGUuTElTVCB8fCB0eXBlID09IFRUeXBlLk1BUCB8fCB0eXBlID09IFRUeXBlLlNFVDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDcxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGE7CisKK3B1YmxpYyBjbGFzcyBMaXN0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworICBwdWJsaWMgZmluYWwgRmllbGRWYWx1ZU1ldGFEYXRhIGVsZW1NZXRhRGF0YTsKKyAgCisgIHB1YmxpYyBMaXN0TWV0YURhdGEoYnl0ZSB0eXBlLCBGaWVsZFZhbHVlTWV0YURhdGEgZU1ldGFEYXRhKXsKKyAgICBzdXBlcih0eXBlKTsKKyAgICB0aGlzLmVsZW1NZXRhRGF0YSA9IGVNZXRhRGF0YTsKKyAgfSAgICAKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxZDZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhOworCitwdWJsaWMgY2xhc3MgTWFwTWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworICBwdWJsaWMgZmluYWwgRmllbGRWYWx1ZU1ldGFEYXRhIGtleU1ldGFEYXRhOworICBwdWJsaWMgZmluYWwgRmllbGRWYWx1ZU1ldGFEYXRhIHZhbHVlTWV0YURhdGE7CisgIAorICBwdWJsaWMgTWFwTWV0YURhdGEoYnl0ZSB0eXBlLCBGaWVsZFZhbHVlTWV0YURhdGEga01ldGFEYXRhLCBGaWVsZFZhbHVlTWV0YURhdGEgdk1ldGFEYXRhKXsKKyAgICBzdXBlcih0eXBlKTsKKyAgICB0aGlzLmtleU1ldGFEYXRhID0ga01ldGFEYXRhOworICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKKyAgfSAgICAKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjNjg2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK3B1YmxpYyBjbGFzcyBTZXRNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisgIHB1YmxpYyBmaW5hbCBGaWVsZFZhbHVlTWV0YURhdGEgZWxlbU1ldGFEYXRhOworICAKKyAgcHVibGljIFNldE1ldGFEYXRhKGJ5dGUgdHlwZSwgRmllbGRWYWx1ZU1ldGFEYXRhIGVNZXRhRGF0YSl7CisgICAgc3VwZXIodHlwZSk7CisgICAgdGhpcy5lbGVtTWV0YURhdGEgPSBlTWV0YURhdGE7CisgIH0gICAgCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGQ5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YTsKKworCitwdWJsaWMgY2xhc3MgU3RydWN0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworICBwdWJsaWMgZmluYWwgQ2xhc3Mgc3RydWN0Q2xhc3M7CisgIAorICBwdWJsaWMgU3RydWN0TWV0YURhdGEoYnl0ZSB0eXBlLCBDbGFzcyBzQ2xhc3MpeworICAgIHN1cGVyKHR5cGUpOworICAgIHRoaXMuc3RydWN0Q2xhc3MgPSBzQ2xhc3M7CisgIH0gICAgCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIENsYXNzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgQmFzZTY0IGRhdGEuCisgKgorICogVGhpcyBjbGFzcyBpcyBrZXB0IGF0IHBhY2thZ2UgbGV2ZWwgYmVjYXVzZSB0aGUgaW50ZXJmYWNlIGRvZXMgbm8gaW5wdXQKKyAqIHZhbGlkYXRpb24gYW5kIGlzIHRoZXJlZm9yZSB0b28gbG93LWxldmVsIGZvciBnZW5lcmFsaXplZCByZXVzZS4KKyAqCisgKiBOb3RlIGFsc28gdGhhdCB0aGUgZW5jb2RpbmcgZG9lcyBub3QgcGFkIHdpdGggZXF1YWwgc2lnbnMgLCBhcyBkaXNjdXNzZWQgaW4KKyAqIHNlY3Rpb24gMi4yIG9mIHRoZSBSRkMgKGh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMzNTQ4Lmh0bWwpLiBGdXJ0aGVybW9yZSwKKyAqIGJhZCBkYXRhIGVuY291bnRlcmVkIHdoZW4gZGVjb2RpbmcgaXMgbmVpdGhlciByZWplY3RlZCBvciBpZ25vcmVkIGJ1dCBzaW1wbHkKKyAqIHJlc3VsdHMgaW4gYmFkIGRlY29kZWQgZGF0YSAtLSB0aGlzIGlzIG5vdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIFJGQyBidXQgaXMKKyAqIGRvbmUgaW4gdGhlIGludGVyZXN0IG9mIHBlcmZvcm1hbmNlLgorICoKKyAqLworY2xhc3MgVEJhc2U2NFV0aWxzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFX1RBQkxFID0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKyAgLyoqCisgICAqIEVuY29kZSBsZW4gYnl0ZXMgb2YgZGF0YSBpbiBzcmMgYXQgb2Zmc2V0IHNyY09mZiwgc3RvcmluZyB0aGUgcmVzdWx0IGludG8KKyAgICogZHN0IGF0IG9mZnNldCBkc3RPZmYuIGxlbiBtdXN0IGJlIDEsIDIsIG9yIDMuIGRzdCBtdXN0IGhhdmUgYXQgbGVhc3QgbGVuKzEKKyAgICogYnl0ZXMgb2Ygc3BhY2UgYXQgZHN0T2ZmLiBzcmMgYW5kIGRzdCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIG9iamVjdC4gVGhpcworICAgKiBtZXRob2QgZG9lcyBubyB2YWxpZGF0aW9uIG9mIHRoZSBpbnB1dCB2YWx1ZXMgaW4gdGhlIGludGVyZXN0IG9mCisgICAqIHBlcmZvcm1hbmNlLgorICAgKgorICAgKiBAcGFyYW0gc3JjICB0aGUgc291cmNlIG9mIGJ5dGVzIHRvIGVuY29kZQorICAgKiBAcGFyYW0gc3JjT2ZmICB0aGUgb2Zmc2V0IGludG8gdGhlIHNvdXJjZSB0byByZWFkIHRoZSB1bmVuY29kZWQgYnl0ZXMKKyAgICogQHBhcmFtIGxlbiAgdGhlIG51bWJlciBvZiBieXRlcyB0byBlbmNvZGUgKG11c3QgYmUgMSwgMiwgb3IgMykuCisgICAqIEBwYXJhbSBkc3QgIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGVuY29kaW5nCisgICAqIEBwYXJhbSBkc3RPZmYgIHRoZSBvZmZzZXQgaW50byB0aGUgZGVzdGluYXRpb24gdG8gcGxhY2UgdGhlIGVuY29kZWQgYnl0ZXMKKyAgICovCisgIHN0YXRpYyBmaW5hbCB2b2lkIGVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCAgYnl0ZVtdIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RPZmYpIHsKKyAgICBkc3RbZHN0T2ZmXSA9IChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRik7CisgICAgaWYgKGxlbiA9PSAzKSB7CisgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZisxXSA+PiA0KSAmIDB4MEYpKTsKKyAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmKzFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYrMl0gPj4gNikgJiAweDAzKSk7CisgICAgICBkc3RbZHN0T2ZmICsgM10gPQorICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KHNyY1tzcmNPZmYrMl0gJiAweDNGKTsKKyAgICB9CisgICAgZWxzZSBpZiAobGVuID09IDIpIHsKKyAgICAgIGRzdFtkc3RPZmYrMV0gPQorICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CisgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmKzFdIDw8IDIpICYgMHgzQyk7CisgICAgfQorICAgIGVsc2UgeyAvLyBsZW4gPT0gMSkgeworICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gREVDT0RFX1RBQkxFID0geworICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAorICAgIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAorICAgIDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAorICAgIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICB9OworCisgIC8qKgorICAgKiBEZWNvZGUgbGVuIGJ5dGVzIG9mIGRhdGEgaW4gc3JjIGF0IG9mZnNldCBzcmNPZmYsIHN0b3JpbmcgdGhlIHJlc3VsdCBpbnRvCisgICAqIGRzdCBhdCBvZmZzZXQgZHN0T2ZmLiBsZW4gbXVzdCBiZSAyLCAzLCBvciA0LiBkc3QgbXVzdCBoYXZlIGF0IGxlYXN0IGxlbi0xCisgICAqIGJ5dGVzIG9mIHNwYWNlIGF0IGRzdE9mZi4gc3JjIGFuZCBkc3QgbWF5IGJlIHRoZSBzYW1lIG9iamVjdCBhcyBsb25nIGFzCisgICAqIGRzdG9mZiA8PSBzcmNPZmYuIFRoaXMgbWV0aG9kIGRvZXMgbm8gdmFsaWRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWVzIGluCisgICAqIHRoZSBpbnRlcmVzdCBvZiBwZXJmb3JtYW5jZS4KKyAgICoKKyAgICogQHBhcmFtIHNyYyAgdGhlIHNvdXJjZSBvZiBieXRlcyB0byBkZWNvZGUKKyAgICogQHBhcmFtIHNyY09mZiAgdGhlIG9mZnNldCBpbnRvIHRoZSBzb3VyY2UgdG8gcmVhZCB0aGUgZW5jb2RlZCBieXRlcworICAgKiBAcGFyYW0gbGVuICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGRlY29kZSAobXVzdCBiZSAyLCAzLCBvciA0KQorICAgKiBAcGFyYW0gZHN0ICB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBkZWNvZGluZworICAgKiBAcGFyYW0gZHN0T2ZmICB0aGUgb2Zmc2V0IGludG8gdGhlIGRlc3RpbmF0aW9uIHRvIHBsYWNlIHRoZSBkZWNvZGVkIGJ5dGVzCisgICAqLworICBzdGF0aWMgZmluYWwgdm9pZCBkZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0T2ZmKSB7CisgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkKKyAgICAgICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwKKyAgICAgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYrMV0gJiAweDBGRl0gPj4gNCkpOworICAgIGlmIChsZW4gPiAyKSB7CisgICAgICBkc3RbZHN0T2ZmKzFdID0gKGJ5dGUpCisgICAgICAgICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmKzFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfAorICAgICAgICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmKzJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgIGlmIChsZW4gPiAzKSB7CisgICAgICAgIGRzdFtkc3RPZmYrMl0gPSAoYnl0ZSkKKyAgICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZisyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwKKyAgICAgICAgICAgREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYrM10gJiAweDBGRl0pOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmZlNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKQEAgLTAsMCArMSwzMjkgQEAKKyAvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICoKKyAqLworcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RSZWFkXyA9IGZhbHNlOworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgIC8qKgorICAgKiBGYWN0b3J5CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXyA9IHRydWU7CisKKyAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICAgIHRoaXMoZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgeworICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yCisgICAqLworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICB0aGlzKHRyYW5zLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CisgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKHN0cmljdFdyaXRlXykgeworICAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CisgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICB3cml0ZUkzMihtYXAuc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICB3cml0ZUkzMihsaXN0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CisgICAgd3JpdGVJMzIoc2V0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZSBbXSBib3V0ID0gbmV3IGJ5dGVbMV07CisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBib3V0WzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUoYm91dCwgMCwgMSk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKKyAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKKyAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKKyAgICB0cmFuc18ud3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOworICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7CisgICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7CisgICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKKyAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKKyAgICB0cmFuc18ud3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOworICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOworICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOworICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOworICAgIGk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOworICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOworICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOworICAgIGk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7CisgICAgdHJhbnNfLndyaXRlKGk2NG91dCwgMCwgOCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVJNjQoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKKyAgICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVJMzIoYmluLmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGJpbiwgMCwgYmluLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iKTsKKyAgICAgIH0KKyAgICAgIG1lc3NhZ2UudHlwZSA9IChieXRlKShzaXplICYgMHgwMDAwMDBmZik7CisgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgICBtZXNzYWdlLnNlcWlkID0gcmVhZEkzMigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyaWN0UmVhZF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgIH0KKyAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRTdHJpbmdCb2R5KHNpemUpOworICAgICAgbWVzc2FnZS50eXBlID0gcmVhZEJ5dGUoKTsKKyAgICAgIG1lc3NhZ2Uuc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorCisgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgIGZpZWxkLnR5cGUgPSByZWFkQnl0ZSgpOworICAgIGlmIChmaWVsZC50eXBlICE9IFRUeXBlLlNUT1ApIHsKKyAgICAgIGZpZWxkLmlkID0gcmVhZEkxNigpOworICAgIH0KKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKCk7CisgICAgbWFwLmtleVR5cGUgPSByZWFkQnl0ZSgpOworICAgIG1hcC52YWx1ZVR5cGUgPSByZWFkQnl0ZSgpOworICAgIG1hcC5zaXplID0gcmVhZEkzMigpOworICAgIHJldHVybiBtYXA7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgbGlzdC5lbGVtVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgbGlzdC5zaXplID0gcmVhZEkzMigpOworICAgIHJldHVybiBsaXN0OworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgc2V0LmVsZW1UeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBzZXQuc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gc2V0OworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gYmluID0gbmV3IGJ5dGVbMV07CisgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRBbGwoYmluLCAwLCAxKTsKKyAgICByZXR1cm4gYmluWzBdOworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gaTE2cmQgPSBuZXcgYnl0ZVsyXTsKKyAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEFsbChpMTZyZCwgMCwgMik7CisgICAgcmV0dXJuCisgICAgICAoc2hvcnQpCisgICAgICAoKChpMTZyZFswXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAoKGkxNnJkWzFdICYgMHhmZikpKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGkzMnJkID0gbmV3IGJ5dGVbNF07CisgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICByZXR1cm4KKyAgICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKKyAgICAgICgoaTMycmRbM10gJiAweGZmKSk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBpNjRyZCA9IG5ldyBieXRlWzhdOworICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRBbGwoaTY0cmQsIDAsIDgpOworICAgIHJldHVybgorICAgICAgKChsb25nKShpNjRyZFswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAoKGxvbmcpKGk2NHJkWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICgobG9uZykoaTY0cmRbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgKChsb25nKShpNjRyZFszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAoKGxvbmcpKGk2NHJkWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICgobG9uZykoaTY0cmRbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgKChsb25nKShpNjRyZFs2XSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAoKGxvbmcpKGk2NHJkWzddICYgMHhmZikpOworICB9CisKKyAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkSTY0KCkpOworICB9CisKKyAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBzaXplID0gcmVhZEkzMigpOworICAgIHJldHVybiByZWFkU3RyaW5nQm9keShzaXplKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZ0JvZHkoaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTE0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGZpZWxkIG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRGaWVsZCB7CisgIHB1YmxpYyBURmllbGQoKSB7fQorCisgIHB1YmxpYyBURmllbGQoU3RyaW5nIG4sIGJ5dGUgdCwgc2hvcnQgaSkgeworICAgIG5hbWUgPSBuOworICAgIHR5cGUgPSB0OworICAgIGlkID0gaTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgbmFtZSA9ICIiOworICBwdWJsaWMgYnl0ZSAgIHR5cGUgPSBUVHlwZS5TVE9QOworICBwdWJsaWMgc2hvcnQgIGlkICAgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTE2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgKiBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIHdyaXRlIGFuZCByZWFkLgorICogUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKworICAvKioKKyAgICogRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgQ09NTUEgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnLCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBDT0xPTiAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICc6JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIExCUkFDRSAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3snIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUkJSQUNFICAgICAgICAgICA9IG5ldyBieXRlW10geyAnfScgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBMQlJBQ0tFVCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdbJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFJCUkFDS0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ10nIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUVVPVEUgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnIicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBCQUNLU0xBU0ggICAgICAgID0gbmV3IGJ5dGVbXSB7ICdcXCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBaRVJPICAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICcwJyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgRVNDU0VRICAgICAgICAgICA9IG5ldyBieXRlW10geyAnXFwnLCAndScsICcwJywgJzAnIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyAgICBWRVJTSU9OICAgICAgICAgID0gMTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEpTT05fQ0hBUl9UQUJMRSAgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIDEgMiAzIDQgNSA2IDcgOCA5IEEgQiBDIEQgRSBGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgMSwgMSwgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgRVNDQVBFX0NIQVJTICAgICA9ICJcIlxcL2JmbnJ0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicsICdcXCcsICcvJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgICBERUZfU1RSSU5HX1NJWkUgID0gMTY7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0JPT0wgICAgICAgID0gbmV3IGJ5dGVbXSB7ICd0JywgJ2YnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9CWVRFICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICc4JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTE2ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMScsICc2JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTMyICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMycsICcyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTY0ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnNicsICc0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfRE9VQkxFICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2QnLCAnYicsICdsJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSVUNUICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3InLCAnZScsICdjJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSSU5HICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAndCcsICdyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTUFQICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ20nLCAnYScsICdwJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTElTVCAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2wnLCAncycsICd0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAnZScsICd0JyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldFR5cGVOYW1lRm9yVHlwZUlEKGJ5dGUgdHlwZUlEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHN3aXRjaCAodHlwZUlEKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgcmV0dXJuIE5BTUVfRE9VQkxFOworICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgIHJldHVybiBOQU1FX0xJU1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIHJlc3VsdCA9IFRUeXBlLlNUT1A7CisgICAgaWYgKG5hbWUubGVuZ3RoID4gMSkgeworICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgICBjYXNlICdkJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuRE9VQkxFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2knOgorICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQllURTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2wnOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5MSVNUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ20nOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5NQVA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncic6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUlVDVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSSU5HOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU0VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndCc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJPT0w7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvcmVhZGluZworICAvLyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkJhc2VDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVzY2FwZU51bSgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9yZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAvLyBmb3IgdGhlIGZpcnN0IG9uZQorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShDT01NQSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoQ09NTUEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvcmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgIC8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCisgIC8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29sb25fID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlc2NhcGVOdW0oKSB7CisgICAgICByZXR1cm4gY29sb25fOworICAgIH0KKyAgfQorCisgIC8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhXzsKKyAgICBwcml2YXRlIGJ5dGVbXSAgZGF0YV8gPSBuZXcgYnl0ZVsxXTsKKworICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAvLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KKyAgICBwcm90ZWN0ZWQgYnl0ZSByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGhhc0RhdGFfKSB7CisgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8sIDAsIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIGRhdGFfWzBdOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbHJlYWR5LgorICAgIHByb3RlY3RlZCBieXRlIHBlZWsoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoIWhhc0RhdGFfKSB7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBkYXRhX1swXTsKKyAgICB9CisgIH0KKworICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgb2YgdHlwZSBKU09OQmFzZUNvbnRleHQgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgY29udGV4dFN0YWNrXyA9IG5ldyBTdGFjaygpOworCisgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICBwcml2YXRlIEpTT05CYXNlQ29udGV4dCBjb250ZXh0XyAgICAgID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworCisgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgIHByaXZhdGUgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl8gICAgICAgPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisKKyAgLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgIHByaXZhdGUgdm9pZCBwdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykgeworICAgIGNvbnRleHRTdGFja18ucHVzaChjb250ZXh0Xyk7CisgICAgY29udGV4dF8gPSBjOworICB9CisKKyAgLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCisgIHByaXZhdGUgdm9pZCBwb3BDb250ZXh0KCkgeworICAgIGNvbnRleHRfID0gKEpTT05CYXNlQ29udGV4dCljb250ZXh0U3RhY2tfLnBvcCgpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yCisgICAqLworICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgc3VwZXIodHJhbnMpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgY29udGV4dFN0YWNrXy5jbGVhcigpOworICAgIGNvbnRleHRfID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisgIH0KKworICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCisgIHByaXZhdGUgYnl0ZVtdIHRtcGJ1Zl8gPSBuZXcgYnl0ZVs0XTsKKworICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIC8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5yZWFkCisgIC8vIGFuZCBKU09OUGFpckNvbnRleHQucmVhZAorICBwcm90ZWN0ZWQgdm9pZCByZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgaWYgKGNoICE9IGJbMF0pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IiArIChjaGFyKWNoKTsKKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgLy8gY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBoZXhWYWwoYnl0ZSBjaCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgfQorICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgIH0KKyAgfQorCisgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGhleENoYXIoYnl0ZSB2YWwpIHsKKyAgICB2YWwgJj0gMHgwRjsKKyAgICBpZiAodmFsIDwgMTApIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKSh2YWwgLSAxMCkgKyAnYScpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdUQ4MDAnICYmIGMgPD0gJ1x1REJGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdURDMDAnICYmIGMgPD0gJ1x1REZGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBjb2RlcG9pbnQpIHsKKyAgICBmaW5hbCBpbnRbXSBGSVJTVF9CWVRFX01BU0sgPSB7IDAsIDB4YzAsIDB4ZTAsIDB4ZjAgfTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIGxlbmd0aCA9IDE7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSBsZW5ndGggPSAyOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIGxlbmd0aCA9IDM7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSBsZW5ndGggPSA0OworICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvZGUgcG9pbnQgb3ZlciBVKzFGRkZGRiBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIHN3aXRjaCAobGVuZ3RoKSB7CisgICAgY2FzZSA0OgorICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAzOgorICAgICAgYnl0ZXNbMl0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAyOgorICAgICAgYnl0ZXNbMV0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAxOgorICAgICAgYnl0ZXNbMF0gPSAoYnl0ZSkoY29kZXBvaW50IHwgRklSU1RfQllURV9NQVNLW2xlbmd0aCAtIDFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBoaWdoLCBpbnQgbG93KSB7CisgICAgaW50IGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCk7CisgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmOworICAgIHJldHVybiB0b1VURjgoY29kZXBvaW50KTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICBwcml2YXRlIHZvaWQgd3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIGludCBsZW4gPSBiLmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJbaV0gPT0gQkFDS1NMQVNIWzBdKSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKGIsIGksIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdG1wYnVmX1swXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgICAgaWYgKHRtcGJ1Zl9bMF0gPT0gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShiLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0bXBidWZfWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICB0bXBidWZfWzBdID0gaGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7CisgICAgICAgICAgdG1wYnVmX1sxXSA9IGhleENoYXIoYltpXSk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICAvLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05JbnRlZ2VyKGxvbmcgbnVtKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gTG9uZy50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gY29udGV4dF8uZXNjYXBlTnVtKCk7CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCB3cml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IERvdWJsZS50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gc3BlY2lhbCA9IGZhbHNlOworICAgIHN3aXRjaCAoc3RyLmNoYXJBdCgwKSkgeworICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnLSc6CisgICAgICBpZiAoc3RyLmNoYXJBdCgxKSA9PSAnSScpIHsgLy8gLUluZmluaXR5CisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLmVzY2FwZU51bSgpOworICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAvLyBkYXRhCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgaW50IGxlbiA9IGxlbmd0aDsKKyAgICBpbnQgb2ZmID0gb2Zmc2V0OworICAgIHdoaWxlIChsZW4gPj0gMykgeworICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgNCk7CisgICAgICBvZmYgKz0gMzsKKyAgICAgIGxlbiAtPSAzOworICAgIH0KKyAgICBpZiAobGVuID4gMCkgeworICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgbGVuICsgMSk7CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTk9iamVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05BcnJheUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC50eXBlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5rZXlUeXBlKSk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1hcC5zaXplKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGxpc3Quc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5lbGVtVHlwZSkpOworICAgIHdyaXRlSlNPTkludGVnZXIoc2V0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGIgPyAobG9uZykxIDogKGxvbmcpMCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGkzMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05Eb3VibGUoZHViKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05CYXNlNjQoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgcmVhZGluZyBmcm9tIHRoZQorICAvLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWFkSlNPTlN0cmluZyhib29sZWFuIHNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIGludCBoaWdoU3Vycm9nYXRlID0gMDsKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgfQorICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGUgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgIGlmIChjaCA9PSBRVU9URVswXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKKyAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGN1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGhpZ2hTdXJyb2dhdGUsIGN1KSk7CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoY3UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CisgICAgICAgICAgaWYgKG9mZiA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2ggPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFyci53cml0ZShjaCk7CisgICAgfQorCisgICAgaWYgKGhpZ2hTdXJyb2dhdGUgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICB9CisgICAgcmV0dXJuIGFycjsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICBwcml2YXRlIGJvb2xlYW4gaXNKU09OTnVtZXJpYyhieXRlIGIpIHsKKyAgICBzd2l0Y2ggKGIpIHsKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcuJzoKKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICBjYXNlICdFJzoKKyAgICBjYXNlICdlJzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgIC8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgcHJpdmF0ZSBTdHJpbmcgcmVhZEpTT05OdW1lcmljQ2hhcnMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgICAgaWYgKCFpc0pTT05OdW1lcmljKGNoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN0cmJ1Zi5hcHBlbmQoKGNoYXIpcmVhZGVyXy5yZWFkKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCByZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgIHByaXZhdGUgbG9uZyByZWFkSlNPTkludGVnZXIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IHJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihzdHIpLmxvbmdWYWx1ZSgpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgIHByaXZhdGUgZG91YmxlIHJlYWRKU09ORG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKKyAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7CisgICAgICB0cnkgeworICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKSAmJgorICAgICAgICAgICAgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkdWI7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHJlYWRKU09OTnVtZXJpY0NoYXJzKCkpLmRvdWJsZVZhbHVlKCk7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICBwcml2YXRlIGJ5dGVbXSByZWFkSlNPTkJhc2U2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICBieXRlW10gYiA9IGFyci5nZXQoKTsKKyAgICBpbnQgbGVuID0gYXJyLmxlbigpOworICAgIGludCBvZmYgPSAwOworICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICBvZmYgKz0gNDsKKyAgICAgIGxlbiAtPSA0OworICAgICAgc2l6ZSArPSAzOworICAgIH0KKyAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgaWYgKGxlbiA+IDEpIHsKKyAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCBsZW4sIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgIH0KKyAgICAvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIHJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05PYmplY3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBpZiAocmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgIH0KKyAgICBTdHJpbmcgbmFtZTsKKyAgICB0cnkgeworICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgaW50IHNlcWlkID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGUgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBieXRlIHR5cGU7CisgICAgc2hvcnQgaWQgPSAwOworICAgIGlmIChjaCA9PSBSQlJBQ0VbMF0pIHsKKyAgICAgIHR5cGUgPSBUVHlwZS5TVE9QOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlkID0gKHNob3J0KXJlYWRKU09OSW50ZWdlcigpOworICAgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgdHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGtleVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGJ5dGUgdmFsdWVUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdEVuZCgpOworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGJ5dGUgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGludCBzaXplID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChyZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoYnl0ZSlyZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoc2hvcnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiByZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZEpTT05Eb3VibGUoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVExpc3QuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmNjc4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBsaXN0IG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRMaXN0IHsKKyAgcHVibGljIFRMaXN0KCkge30KKworICBwdWJsaWMgVExpc3QoYnl0ZSB0LCBpbnQgcykgeworICAgIGVsZW1UeXBlID0gdDsKKyAgICBzaXplID0gczsKKyAgfQorCisgIHB1YmxpYyBieXRlIGVsZW1UeXBlID0gVFR5cGUuU1RPUDsKKyAgcHVibGljIGludCAgc2l6ZSAgICAgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGExMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBtYXAgbWV0YWRhdGEuCisgKgorICovCitwdWJsaWMgY2xhc3MgVE1hcCB7CisgIHB1YmxpYyBUTWFwKCkge30KKworICBwdWJsaWMgVE1hcChieXRlIGssIGJ5dGUgdiwgaW50IHMpIHsKKyAgICBrZXlUeXBlID0gazsKKyAgICB2YWx1ZVR5cGUgPSB2OworICAgIHNpemUgPSBzOworICB9CisKKyAgcHVibGljIGJ5dGUgIGtleVR5cGUgICA9IFRUeXBlLlNUT1A7CisgIHB1YmxpYyBieXRlICB2YWx1ZVR5cGUgPSBUVHlwZS5TVE9QOworICBwdWJsaWMgaW50ICAgc2l6ZSAgICAgID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOGIwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc3RydWN0IG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRNZXNzYWdlIHsKKyAgcHVibGljIFRNZXNzYWdlKCkge30KKworICBwdWJsaWMgVE1lc3NhZ2UoU3RyaW5nIG4sIGJ5dGUgdCwgaW50IHMpIHsKKyAgICBuYW1lID0gbjsKKyAgICB0eXBlID0gdDsKKyAgICBzZXFpZCA9IHM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIG5hbWUgPSAiIjsKKyAgcHVibGljIGJ5dGUgdHlwZTsKKyAgcHVibGljIGludCBzZXFpZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZWE3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBNZXNzYWdlIHR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVE1lc3NhZ2VUeXBlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENBTEwgID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFUExZID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVYQ0VQVElPTiA9IDM7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGU2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBQcm90b2NvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgeworCisgIC8qKgorICAgKiBQcmV2ZW50IGRpcmVjdCBpbnN0YW50aWF0aW9uCisgICAqLworICBwcml2YXRlIFRQcm90b2NvbCgpIHt9CisKKyAgLyoqCisgICAqIFRyYW5zcG9ydAorICAgKi8KKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNfOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcgorICAgKi8KKyAgcHJvdGVjdGVkIFRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgdHJhbnNfID0gdHJhbnM7CisgIH0KKworICAvKioKKyAgICogVHJhbnNwb3J0IGFjY2Vzc29yCisgICAqLworICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoKSB7CisgICAgcmV0dXJuIHRyYW5zXzsKKyAgfQorCisgIC8qKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChCb29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHdyaXRlQm9vbChiLmJvb2xlYW5WYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShCeXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHdyaXRlQnl0ZShiLmJ5dGVWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGVJMTYoU2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB3cml0ZUkxNihpMTYuc2hvcnRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKEludGVnZXIgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB3cml0ZUkzMihpMzIuaW50VmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGVJNjQoTG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHdyaXRlSTY0KGk2NC5sb25nVmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShEb3VibGUgZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgd3JpdGVEb3VibGUoZC5kb3VibGVWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIHB1YmxpYyBhYnN0cmFjdCBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg4MTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworLyoqCisgKiBQcm90b2NvbCBleGNlcHRpb25zLgorICoKKyAqLworcHVibGljIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RBVEEgPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9MSU1JVCA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKworICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKSB7CisgICAgc3VwZXIoKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBGYWN0b3J5IGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIHByb3RvY29sIGluc3RhbmNlcy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7CisgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmMTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvdG9jb2wgZGF0YQorICogc3RyZWFtcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUUHJvdG9jb2xVdGlsIHsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gcmVjdXJzaXZlIGRlcHRoIHRoZSBza2lwKCkgZnVuY3Rpb24gd2lsbCB0cmF2ZXJzZSBiZWZvcmUKKyAgICogdGhyb3dpbmcgYSBURXhjZXB0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1heFNraXBEZXB0aCA9IEludGVnZXIuTUFYX1ZBTFVFOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gcmVjdXJzaXZlIGRlcHRoIHRoYXQgdGhlIHNraXAgZnVuY3Rpb24gd2lsbAorICAgKiB0cmF2ZXJzZSBiZWZvcmUgdGhyb3dpbmcgYSBURXhjZXB0aW9uLiAgVGhpcyBpcyBhIGdsb2JhbCBzZXR0aW5nLCBzbworICAgKiBhbnkgY2FsbCB0byBza2lwIGluIHRoaXMgSlZNIHdpbGwgZW5mb3JjZSB0aGlzIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gZGVwdGggIHRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aC4gIEEgdmFsdWUgb2YgMiB3b3VsZCBhbGxvdworICAgKiAgICB0aGUgc2tpcCBmdW5jdGlvbiB0byBza2lwIGEgc3RydWN0dXJlIG9yIGNvbGxlY3Rpb24gd2l0aCBiYXNpYyBjaGlsZHJlbiwKKyAgICogICAgYnV0IGl0IHdvdWxkIG5vdCBwZXJtaXQgc2tpcHBpbmcgYSBzdHJ1Y3QgdGhhdCBoYWQgYSBmaWVsZCBjb250YWluaW5nCisgICAqICAgIGEgY2hpbGQgc3RydWN0LiAgQSB2YWx1ZSBvZiAxIHdvdWxkIG9ubHkgYWxsb3cgc2tpcHBpbmcgb2Ygc2ltcGxlCisgICAqICAgIHR5cGVzIGFuZCBlbXB0eSBzdHJ1Y3RzL2NvbGxlY3Rpb25zLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1heFNraXBEZXB0aChpbnQgZGVwdGgpIHsKKyAgICBtYXhTa2lwRGVwdGggPSBkZXB0aDsKKyAgfQorCisgIC8qKgorICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gcHJvdCAgdGhlIHByb3RvY29sIG9iamVjdCB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoVFByb3RvY29sIHByb3QsIGJ5dGUgdHlwZSkKKyAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2tpcChwcm90LCB0eXBlLCBtYXhTa2lwRGVwdGgpOworICB9CisKKyAgLyoqCisgICAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCisgICAqIEBwYXJhbSBtYXhEZXB0aCAgdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgc2tpcCBjb21wbGV4IG9iamVjdHMgdG8gdGhpcworICAgKiAgIHJlY3Vyc2l2ZSBkZXB0aCwgdG8gcHJldmVudCBKYXZhIHN0YWNrIG92ZXJmbG93LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoVFByb3RvY29sIHByb3QsIGJ5dGUgdHlwZSwgaW50IG1heERlcHRoKQorICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKG1heERlcHRoIDw9IDApIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJNYXhpbXVtIHNraXAgZGVwdGggZXhjZWVkZWQiKTsKKyAgICB9CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgeworICAgICAgICBwcm90LnJlYWRCb29sKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgeworICAgICAgICBwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICB7CisgICAgICAgIHByb3QucmVhZEk2NCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgeworICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICB7CisgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBza2lwKHByb3QsIGZpZWxkLnR5cGUsIG1heERlcHRoIC0gMSk7CisgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICB7CisgICAgICAgIFRNYXAgbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgc2tpcChwcm90LCBtYXAua2V5VHlwZSwgbWF4RGVwdGggLSAxKTsKKyAgICAgICAgICBza2lwKHByb3QsIG1hcC52YWx1ZVR5cGUsIG1heERlcHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgeworICAgICAgICBUU2V0IHNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0LnNpemU7IGkrKykgeworICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlLCBtYXhEZXB0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZFNldEVuZCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICB7CisgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemU7IGkrKykgeworICAgICAgICAgIHNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSwgbWF4RGVwdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGU5YjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNldC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc2V0IG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRTZXQgeworICBwdWJsaWMgVFNldCgpIHt9CisKKyAgcHVibGljIFRTZXQoYnl0ZSB0LCBpbnQgcykgeworICAgIGVsZW1UeXBlID0gdDsKKyAgICBzaXplID0gczsKKyAgfQorCisgIHB1YmxpYyBieXRlIGVsZW1UeXBlID0gVFR5cGUuU1RPUDsKKyAgcHVibGljIGludCAgc2l6ZSAgICAgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2JiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBzdHJ1Y3QgbWV0YWRhdGEuCisgKgorICovCitwdWJsaWMgY2xhc3MgVFN0cnVjdCB7CisgIHB1YmxpYyBUU3RydWN0KCkge30KKworICBwdWJsaWMgVFN0cnVjdChTdHJpbmcgbikgeworICAgIG5hbWUgPSBuOworICB9CisKKyAgcHVibGljIFN0cmluZyBuYW1lID0gIiI7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UVHlwZS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRjM2NhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogVHlwZSBjb25zdGFudHMgaW4gdGhlIFRocmlmdCBwcm90b2NvbC4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUVHlwZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVE9QICAgPSAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVk9JRCAgID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEJPT0wgICA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBCWVRFICAgPSAzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRE9VQkxFID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEkxNiAgICA9IDY7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJMzIgICAgPSA4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSTY0ICAgID0gMTA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFJJTkcgPSAxMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUUlVDVCA9IDEyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUFQICAgID0gMTM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVQgICAgPSAxNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExJU1QgICA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNzQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBUbyBiZSBjb21tZW50ZWQgc29vbiEKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgLyoqCisgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAqLworICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0XyA9IG51bGw7CisKKyAgLyoqCisgICAqIEJ1ZmZlciBmb3Igb3V0cHV0CisgICAqLworICBwcml2YXRlIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gd3JpdGVCdWZmZXJfID0KKyAgICBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKKworICAvKioKKyAgICogQnVmZmVyIGZvciBpbnB1dAorICAgKi8KKyAgcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWFkQnVmZmVyXyA9IG51bGw7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgIH0KKworICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IGJhc2UpIHsKKyAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydChiYXNlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnBzb3J0CisgICAqLworICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLmlzT3BlbigpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgeworICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICByZXR1cm4gZ290OworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgcmVhZEZyYW1lKCk7CisKKyAgICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkRnJhbWUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGkzMnJkID0gbmV3IGJ5dGVbNF07CisgICAgdHJhbnNwb3J0Xy5yZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICBpbnQgc2l6ZSA9CisgICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB0cmFuc3BvcnRfLnJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7CisgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyXy5nZXQoKTsKKyAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpOworICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworCisgICAgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOworICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGxlbiA+PiAyNCkpOworICAgIGkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGxlbiA+PiAxNikpOworICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGxlbiA+PiA4KSk7CisgICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAobGVuKSk7CisgICAgdHJhbnNwb3J0Xy53cml0ZShpMzJvdXQsIDAsIDQpOworICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4pOworICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmZmYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5pby5IdHRwQ29ubmVjdGlvbjsKKworLyoqCisgKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIFN0cmluZyB1cmxfID0gbnVsbDsKKworICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtXyA9IG51bGw7CisKKyAgcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKKworICBwcml2YXRlIGludCBjb25uZWN0VGltZW91dF8gPSAwOworCisgIHByaXZhdGUgaW50IHJlYWRUaW1lb3V0XyA9IDA7CisKKyAgcHJpdmF0ZSBIYXNodGFibGUgY3VzdG9tSGVhZGVyc18gPSBudWxsOworCisgIHB1YmxpYyBUSHR0cENsaWVudChTdHJpbmcgdXJsKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdXJsXyA9IHVybDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgY29ubmVjdFRpbWVvdXRfID0gdGltZW91dDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgcmVhZFRpbWVvdXRfID0gdGltZW91dDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUhlYWRlcnMoSGFzaHRhYmxlIGhlYWRlcnMpIHsKKyAgICBjdXN0b21IZWFkZXJzXyA9IGhlYWRlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDdXN0b21IZWFkZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKGN1c3RvbUhlYWRlcnNfID09IG51bGwpIHsKKyAgICAgIGN1c3RvbUhlYWRlcnNfID0gbmV3IEhhc2h0YWJsZSgpOworICAgIH0KKyAgICBjdXN0b21IZWFkZXJzXy5wdXQoa2V5LCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBvcGVuKCkge30KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAobnVsbCAhPSBpbnB1dFN0cmVhbV8pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlucHV0U3RyZWFtXy5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICB9CisgICAgICBpbnB1dFN0cmVhbV8gPSBudWxsOworICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgfQorICAgICAgY29ubmVjdGlvbiA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXRTdHJlYW1fID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgfQorICAgIHRyeSB7CisgICAgICBpbnQgcmV0ID0gaW5wdXRTdHJlYW1fLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisgIAorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgorICAgIGJ5dGVbXSBkYXRhID0gcmVxdWVzdEJ1ZmZlcl8udG9CeXRlQXJyYXkoKTsKKyAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOworCisgICAgdHJ5IHsKKyAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIG9iamVjdAorICAgICAgY29ubmVjdGlvbiA9IChIdHRwQ29ubmVjdGlvbilDb25uZWN0b3Iub3Blbih1cmxfKTsKKyAgCisgICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkphdmFNRS9USHR0cENsaWVudCIpOworCisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29ubmVjdGlvbiIsICJLZWVwLUFsaXZlIik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiS2VlcC1BbGl2ZSIsICI1MDAwIik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiSHR0cC12ZXJzaW9uIiwgIkhUVFAvMS4xIik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ2FjaGUtQ29udHJvbCIsICJuby10cmFuc2Zvcm0iKTsKKworICAgICAgaWYgKGN1c3RvbUhlYWRlcnNfICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY3VzdG9tSGVhZGVyc18ua2V5cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7CisgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY3VzdG9tSGVhZGVyc18uZ2V0KGtleSk7CisgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgCisgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb25uZWN0aW9uLm9wZW5PdXRwdXRTdHJlYW0oKTsKKyAgICAgIG9zLndyaXRlKGRhdGEpOworICAgICAgb3MuY2xvc2UoKTsKKworICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgICBpZiAocmVzcG9uc2VDb2RlICE9IEh0dHBDb25uZWN0aW9uLkhUVFBfT0spIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkhUVFAgUmVzcG9uc2UgY29kZTogIiArIHJlc3BvbnNlQ29kZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlcworICAgICAgaW5wdXRTdHJlYW1fID0gY29ubmVjdGlvbi5vcGVuSW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb3gudG9TdHJpbmcoKSk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3gpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RJT1N0cmVhbVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RJT1N0cmVhbVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjcwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVElPU3RyZWFtVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogVGhpcyBpcyB0aGUgbW9zdCBjb21tb25seSB1c2VkIGJhc2UgdHJhbnNwb3J0LiBJdCB0YWtlcyBhbiBJbnB1dFN0cmVhbQorICogYW5kIGFuIE91dHB1dFN0cmVhbSBhbmQgdXNlcyB0aG9zZSB0byBwZXJmb3JtIGFsbCB0cmFuc3BvcnQgb3BlcmF0aW9ucy4KKyAqIFRoaXMgYWxsb3dzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWxsIHRoZSBuaWNlIGNvbnN0cnVjdHMgSmF2YSBhbHJlYWR5CisgKiBoYXMgdG8gcHJvdmlkZSBhIHZhcmlldHkgb2YgdHlwZXMgb2Ygc3RyZWFtcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUSU9TdHJlYW1UcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworCisgIC8qKiBVbmRlcmx5aW5nIGlucHV0U3RyZWFtICovCisgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbV8gPSBudWxsOworCisgIC8qKiBVbmRlcmx5aW5nIG91dHB1dFN0cmVhbSAqLworICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbV8gPSBudWxsOworCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIGNhbiBpbnZva2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIHRoZW4gYXNzaWduIHRoZSBpbnB1dAorICAgKiBzdHJlYW1zIGluIHRoZSBvcGVuIG1ldGhvZC4KKyAgICovCisgIHByb3RlY3RlZCBUSU9TdHJlYW1UcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBJbnB1dCBzdHJlYW0gY29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAqLworICBwdWJsaWMgVElPU3RyZWFtVHJhbnNwb3J0KElucHV0U3RyZWFtIGlzKSB7CisgICAgaW5wdXRTdHJlYW1fID0gaXM7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0IHN0cmVhbSBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIG9zIE91dHB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAqLworICBwdWJsaWMgVElPU3RyZWFtVHJhbnNwb3J0KE91dHB1dFN0cmVhbSBvcykgeworICAgIG91dHB1dFN0cmVhbV8gPSBvczsKKyAgfQorCisgIC8qKgorICAgKiBUd28td2F5IHN0cmVhbSBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGlzIElucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIG9zIE91dHB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAqLworICBwdWJsaWMgVElPU3RyZWFtVHJhbnNwb3J0KElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHsKKyAgICBpbnB1dFN0cmVhbV8gPSBpczsKKyAgICBvdXRwdXRTdHJlYW1fID0gb3M7CisgIH0KKworICAvKioKKyAgICogVGhlIHN0cmVhbXMgbXVzdCBhbHJlYWR5IGJlIG9wZW4gYXQgY29uc3RydWN0aW9uIHRpbWUsIHNvIHRoaXMgc2hvdWxkCisgICAqIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhlIHN0cmVhbXMgbXVzdCBhbHJlYWR5IGJlIG9wZW4uIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorCisgIC8qKgorICAgKiBDbG9zZXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICAgKi8KKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGlucHV0U3RyZWFtXyAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnB1dFN0cmVhbV8uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgfQorICAgICAgaW5wdXRTdHJlYW1fID0gbnVsbDsKKyAgICB9CisgICAgaWYgKG91dHB1dFN0cmVhbV8gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgb3V0cHV0U3RyZWFtXy5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICB9CisgICAgICBvdXRwdXRTdHJlYW1fID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gaWYgbm90IG51bGwuCisgICAqLworICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChpbnB1dFN0cmVhbV8gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dFN0cmVhbSIpOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmV0dXJuIGlucHV0U3RyZWFtXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBpb3gpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAob3V0cHV0U3RyZWFtXyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0U3RyZWFtIik7CisgICAgfQorICAgIHRyeSB7CisgICAgICBvdXRwdXRTdHJlYW1fLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBpb3gpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCisgICAqLworICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAob3V0cHV0U3RyZWFtXyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIik7CisgICAgfQorICAgIHRyeSB7CisgICAgICBvdXRwdXRTdHJlYW1fLmZsdXNoKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sIGlveCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUxYWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKKy8qKgorICogTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDcmVhdGUgYSBUTWVtb3J5QnVmZmVyIHdpdGggYW4gaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiA8aT5zaXplPC9pPi4gVGhlCisgICAqIGludGVybmFsIGJ1ZmZlciB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCisgICAqIGJlaW5nIHdyaXR0ZW4gdG8gaXQuCisgICAqLworICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcihpbnQgc2l6ZSkgeworICAgIGFycl8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShzaXplKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgICAgLyogRG8gbm90aGluZyAqLworICB9CisKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgLyogRG8gbm90aGluZyAqLworICB9CisKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICBieXRlW10gc3JjID0gYXJyXy5nZXQoKTsKKyAgICBpbnQgYW10VG9SZWFkID0gKGxlbiA+IGFycl8ubGVuKCkgLSBwb3NfID8gYXJyXy5sZW4oKSAtIHBvc18gOiBsZW4pOworICAgIGlmIChhbXRUb1JlYWQgPiAwKSB7CisgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNyYywgcG9zXywgYnVmLCBvZmYsIGFtdFRvUmVhZCk7CisgICAgICBwb3NfICs9IGFtdFRvUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIGFtdFRvUmVhZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICBhcnJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIE91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcsIHVzaW5nIHRoZSBzdXBwbGllZAorICAgKiBlbmNvZGluZworICAgKiAKKyAgICogQHBhcmFtIGVuYyB0aGUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYXJyXy50b1N0cmluZyhlbmMpOworICB9CisKKyAgcHVibGljIFN0cmluZyBpbnNwZWN0KCkgeworICAgIFN0cmluZyBidWYgPSAiIjsKKyAgICBieXRlW10gYnl0ZXMgPSBhcnJfLnRvQnl0ZUFycmF5KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgYnVmICs9IChwb3NfID09IGkgPyAiPT0+IiA6ICIiKSArIEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbaV0gJiAweGZmKSArICIgIjsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIC8vIFRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyCisgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJfOworCisgIC8vIFBvc2l0aW9uIHRvIHJlYWQgbmV4dCBieXRlIGZyb20KKyAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgIHBvc187CisKKyAgcHVibGljIGludCBsZW5ndGgoKSB7CisgICAgcmV0dXJuIGFycl8uc2l6ZSgpOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXRBcnJheSgpIHsKKyAgICByZXR1cm4gYXJyXy5nZXQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgSS9PIGxheWVyLiBUaGlzIGlzIGJhc2ljYWxseSBhIHRoaW4KKyAqIHdyYXBwZXIgYXJvdW5kIHRoZSBjb21iaW5lZCBmdW5jdGlvbmFsaXR5IG9mIEphdmEgaW5wdXQvb3V0cHV0IHN0cmVhbXMuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCB7CisKKyAgLyoqCisgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09wZW4oKTsKKworICAvKioKKyAgICogSXMgdGhlcmUgbW9yZSBkYXRhIHRvIGJlIHJlYWQ/CisgICAqCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVtb3RlIHNpZGUgaXMgc3RpbGwgYWxpdmUgYW5kIGZlZWRpbmcgdXMKKyAgICovCisgIHB1YmxpYyBib29sZWFuIHBlZWsoKSB7CisgICAgcmV0dXJuIGlzT3BlbigpOworICB9CisKKyAgLyoqCisgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZy4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZAorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbigpCisgICAgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb247CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAqCisgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uOworCisgIC8qKgorICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBBcnJheSB0byByZWFkIGludG8KKyAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBsZW4KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpbnQgZ290ID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CisgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIgKyBsZW4gKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIGdvdCArICIgYnl0ZXMuIik7CisgICAgICB9CisgICAgICBnb3QgKz0gcmV0OworICAgIH0KKyAgICByZXR1cm4gZ290OworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBUaGUgb3V0cHV0IGRhdGEgYnVmZmVyCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyBkYXRhCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdXAgdG8gbGVuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBUaGUgb3V0cHV0IGRhdGEgYnVmZmVyCisgICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCB0byBzdGFydCB3cml0aW5nIGZyb20KKyAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBkYXRhCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uOworCisgIC8qKgorICAgKiBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4ZjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMuCisgKgorICovCitwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfT1BFTiA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUkVBRFlfT1BFTiA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVEX09VVCA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9GSUxFID0gNDsKKworICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oaW50IHR5cGUpIHsKKyAgICBzdXBlcigpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgdHlwZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViNjA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgKiBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAqIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICogYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICoKKyAqLworcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAvKioKKyAgICogUmV0dXJuIGEgd3JhcHBlZCBpbnN0YW5jZSBvZiB0aGUgYmFzZSBUcmFuc3BvcnQuCisgICAqCisgICAqIEBwYXJhbSBpbiBUaGUgYmFzZSB0cmFuc3BvcnQKKyAgICogQHJldHVybnMgV3JhcHBlZCBUcmFuc3BvcnQKKyAgICovCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgcmV0dXJuIHRyYW5zOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9HcnVudGZpbGUuanMgYi9saWIvanMvR3J1bnRmaWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmEwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvR3J1bnRmaWxlLmpzCkBAIC0wLDAgKzEsMjkzIEBACisvL1RvIGJ1aWxkIGRpc3QvdGhyaWZ0LmpzLCBkaXN0L3RocmlmdC5taW4uanMgYW5kIGRvYy8qCisvL3J1biBncnVudCBhdCB0aGUgY29tbWFuZCBsaW5lIGluIHRoaXMgZGlyZWN0b3J5LgorLy9QcmVyZXF1aXNpdGVzOgorLy8gTm9kZSBTZXR1cCAtICAgbm9kZWpzLm9yZworLy8gR3J1bnQgU2V0dXAgLSAgbnBtIGluc3RhbGwgIC8vcmVhZHMgdGhlIC4vcGFja2FnZS5qc29uIGFuZCBpbnN0YWxscyBwcm9qZWN0IGRlcGVuZGVuY2llcworLy8gUnVuIGdydW50IC0gICAgbnB4IGdydW50ICAvLyB1c2VzIHByb2plY3QtbG9jYWwgaW5zdGFsbGVkIHZlcnNpb24gb2YgZ3J1bnQgKGZyb20gcGFja2FnZS5qc29uKQorCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGdydW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBncnVudC5pbml0Q29uZmlnKHsKKyAgICBwa2c6IGdydW50LmZpbGUucmVhZEpTT04oJ3BhY2thZ2UuanNvbicpLAorICAgIGNvbmNhdDogeworICAgICAgb3B0aW9uczogeworICAgICAgICBzZXBhcmF0b3I6ICc7JworICAgICAgfSwKKyAgICAgIGRpc3Q6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICAgIGRlc3Q6ICdkaXN0LzwlPSBwa2cubmFtZSAlPi5qcycKKyAgICAgIH0KKyAgICB9LAorICAgIGpzZG9jIDogeworICAgICAgICBkaXN0IDogeworICAgICAgICAgICAgc3JjOiBbJ3NyYy8qLmpzJywgJy4vUkVBRE1FLm1kJ10sCisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnZG9jJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB1Z2xpZnk6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgYmFubmVyOiAnLyohIDwlPSBwa2cubmFtZSAlPiA8JT0gZ3J1bnQudGVtcGxhdGUudG9kYXkoImRkLW1tLXl5eXkiKSAlPiAqL1xuJworICAgICAgfSwKKyAgICAgIGRpc3Q6IHsKKyAgICAgICAgZmlsZXM6IHsKKyAgICAgICAgICAnZGlzdC88JT0gcGtnLm5hbWUgJT4ubWluLmpzJzogWyc8JT0gY29uY2F0LmRpc3QuZGVzdCAlPiddCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIHNoZWxsOiB7CisgICAgICBJbnN0YWxsVGhyaWZ0SlM6IHsKKyAgICAgICAgY29tbWFuZDogJ21rZGlyIC1wIHRlc3QvYnVpbGQvanMvbGliOyBjcCBzcmMvdGhyaWZ0LmpzIHRlc3QvYnVpbGQvanMvdGhyaWZ0LmpzJworICAgICAgfSwKKyAgICAgIEluc3RhbGxUaHJpZnROb2RlSlNEZXA6IHsKKyAgICAgICAgY29tbWFuZDogJ2NkIC4uLy4uOyBucG0gaW5zdGFsbCcKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGVzdExpYnM6IHsKKyAgICAgICAgY29tbWFuZDogJ2NkIHRlc3Q7IGFudCBkb3dubG9hZF9qc2xpYnMnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuOiB7CisgICAgICAgIGNvbW1hbmQ6IFsKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtLW91dCB0ZXN0L2dlbi1qcyAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1qcXVlcnknLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC0tb3V0IHRlc3QvZ2VuLWpzLWpxdWVyeSAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOm5vZGUgLS1vdXQgdGVzdC9nZW4tbm9kZWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6ZXM2IC0tb3V0IHRlc3QvZ2VuLWpzLWVzNiAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzLWVzNicsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlLGVzNiAtLW91dCAuL3Rlc3QvZ2VuLW5vZGVqcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgIF0uam9pbignICYmICcpCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuSlE6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpqcXVlcnkgLWdlbiBqczpub2RlIC1vIHRlc3QgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5EZWVwQ29uc3RydWN0b3I6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5Eb3VibGVDb25zdGFudHM6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlcjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIiwKKyAgICAgIH0sCisgICAgICBUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cHMuanMgLS1lczYiLAorICAgICAgfSwKKyAgICB9LAorICAgIHF1bml0OiB7CisgICAgICBUaHJpZnRKUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU0pROiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU19Eb3VibGVSZW5kZXJpbmc6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0d3MuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU19UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3Qtbm9qcS5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNKUV9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTX1RMUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwOTEvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnREZWVwQ29uc3RydWN0b3I6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1NFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1lczYuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIGpzaGludDogeworICAgICAgLy8gVGhlIG1haW4gdGhyaWZ0IGxpYnJhcnkgZmlsZS4gbm90IGVzNiB5ZXQgOigKKyAgICAgIGxpYjogeworICAgICAgICBzcmM6IFsnc3JjLyoqLyouanMnXSwKKyAgICAgIH0sCisgICAgICAvLyBUaGUgdGVzdCBmaWxlcyB1c2UgZXM2CisgICAgICB0ZXN0OiB7CisgICAgICAgIHNyYzogWydHcnVudGZpbGUuanMnLCAndGVzdC8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fanNfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMvKi5qcycsICd0ZXN0L2dlbi1qcy1qcXVlcnkvKi5qcyddLAorICAgICAgfSwKKyAgICAgIGdlbl9lczZfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGVzdmVyc2lvbjogNiwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBub2RlOiB0cnVlLAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX25vZGVfZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy1lczYvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICB9KTsKKworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItdWdsaWZ5Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1qc2hpbnQnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXF1bml0Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1jb25jYXQnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1qc2RvYycpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LXNoZWxsLXNwYXduJyk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd3YWl0JywgJ1dhaXQganVzdCBvbmUgc2Vjb25kIGZvciBzZXJ2ZXIgdG8gc3RhcnQnLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGRvbmUgPSB0aGlzLmFzeW5jKCk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgIGRvbmUodHJ1ZSk7CisgICAgfSwgMTAwMCk7CisgIH0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnaW5zdGFsbEFuZEdlbmVyYXRlJywgWworICAgICdzaGVsbDpJbnN0YWxsVGhyaWZ0SlMnLCAnc2hlbGw6SW5zdGFsbFRocmlmdE5vZGVKU0RlcCcsICdzaGVsbDpUaHJpZnRHZW4nLAorICAgICdzaGVsbDpUaHJpZnRHZW5EZWVwQ29uc3RydWN0b3InLCAnc2hlbGw6VGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzJywKKyAgICAnc2hlbGw6SW5zdGFsbFRlc3RMaWJzJywKKyAgXSk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd0ZXN0JywgWworICAgICdpbnN0YWxsQW5kR2VuZXJhdGUnLAorICAgICdqc2hpbnQnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyJywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJfVExTJywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUycsCisgICAgJ3dhaXQnLAorICAgICdxdW5pdDpUaHJpZnREZWVwQ29uc3RydWN0b3InLAorICAgICdxdW5pdDpUaHJpZnRKUycsICdxdW5pdDpUaHJpZnRKU19UTFMnLAorICAgICdxdW5pdDpUaHJpZnRKU19Eb3VibGVSZW5kZXJpbmcnLAorICAgICdxdW5pdDpUaHJpZnRXUycsCisgICAgJ3F1bml0OlRocmlmdEpTSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUV9UTFMnLAorICAgICdxdW5pdDpUaHJpZnRXU0VTNicsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXI6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUzpraWxsJywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNjpraWxsJywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTOmtpbGwnLAorICBdKTsKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdkZWZhdWx0JywgWyd0ZXN0JywgJ2NvbmNhdCcsICd1Z2xpZnknLCAnanNkb2MnXSk7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL2pzL01ha2VmaWxlLmFtIGIvbGliL2pzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTIwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KKyMgV2UgY2FsbCBpbnN0YWxsIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKyMKK2lmIEhBVkVfTlBNCitTVUJESVJTID0gdGVzdAorCitjaGVjay1sb2NhbDogYWxsCisJJChOUE0pIGluc3RhbGwgfHwgJChOUE0pIGluc3RhbGwKKwkkKE5QTSkgbGlzdAorCS4vbm9kZV9tb2R1bGVzLy5iaW4vZ3J1bnQKK2VuZGlmCmRpZmYgLS1naXQgYS9saWIvanMvUkVBRE1FIGIvbGliL2pzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmZGM0My4uMDAwMDAwMAotLS0gYS9saWIvanMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotVGhyaWZ0IEphdmFzY3JpcHQgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhc2NyaXB0Ci09PT09PT09PT09PT09PT09PT09PT0KLQotQWxsb3dzIGphdmFzY3JpcHQgY2xpZW50IGludGVyZmFjZXMgdG8gVGhyaWZ0IHNlcnZpY2VzLgotVGhpcyBpcyBnZWFyZWQgZm9yIHVzZSBpbiBhIHdlYiBicm93c2VyLgotCi1UaGlzIGNsaWVudCBjYW4gb25seSBzcGVhayB0aGUgSlNPTiBQcm90b2NvbCBhbmQgdGhlIG9ubHkgc3VwcG9ydGVkCi10cmFuc3BvcnQgaXMgQUpBWC4KLQotVGhlcmUgaXMgYSB0ZXN0IGh0dHBkIHNlcnZpY2UgaW4gdGhlIHRlc3QgZGlyIHRoYXQgcmVxdWlyZXMKLWh0dHA6Ly9oYy5hcGFjaGUub3JnIHVuZGVyIHRlc3QgZGlyCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci1BIEphdmFTY3JpcHQgZW5hYmxlZCBicm93c2VyLiBUZXN0ZWQgd2l0aDoKLSAqSUUgNiw3LDgKLSAqRkYgMiwzCi0gKlNhZmFyaSAzICYgNApkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRS5tZCBiL2xpYi9qcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9SRUFETUUubWQKQEAgLTAsMCArMSwxNDAgQEAKK1RocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgYnJvd3NlciBiYXNlZCBBcGFjaGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCitSUEMgY2xpZW50cyB1c2luZyB0aGUgSlNPTiBwcm90b2NvbCBvdmVyIEh0dHBbc10gd2l0aCBYSFIKK2FuZCBXZWJTb2NrZXQuCisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitHcnVudCBCdWlsZAorLS0tLS0tLS0tLS0tCitUaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdAorbGlicmFyeS4gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBHcnVudGZpbGUuanMgYW5kIGEKK3BhY2thZ2UuanNvbi4gTWFueSBvZiB0aGUgYnVpbGQgYW5kIHRlc3QgdG9vbHMgdXNlZCBoZXJlCityZXF1aXJlIGEgcmVjZW50IHZlcnNpb24gb2YgTm9kZS5qcyB0byBiZSBpbnN0YWxsZWQuIFRvIAoraW5zdGFsbCB0aGUgc3VwcG9ydCBmaWxlcyBmb3IgdGhlIEdydW50IGJ1aWxkIHRvb2wgZXhlY3V0ZQordGhlIGNvbW1hbmQ6CisKKyAgICBucG0gaW5zdGFsbAorICAgIAorVGhpcyByZWFkcyB0aGUgcGFja2FnZS5qc29uIGFuZCBwdWxscyBpbiB0aGUgYXBwcm9wcmlhdGUKK3NvdXJjZXMgZnJvbSB0aGUgaW50ZXJuZXQuIFRvIGJ1aWxkIHRoZSBKYXZhU2NyaXB0IGJyYW5jaAorb2YgQXBhY2hlIFRocmlmdCBleGVjdXRlIHRoZSBjb21tYW5kOgorCisgICAgbnB4IGdydW50CisgICAgCitUaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wgKGZyb20gd2l0aGluIGAuL25vZGVfbW9kdWxlcy8uYmluL2ApLAorbGludGluZyBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUKK3Rlc3RzLCBjb25jYXRlbmF0aW5nIGFuZCBtaW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZAorZ2VuZXJhdGluZyB0aGUgaHRtbCBkb2N1bWVudGF0aW9uLgorCitUcmVlCistLS0tCitUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGFyZSBwcmVzZW50IChzb21lIG9ubHkgYWZ0ZXIgdGhlCitncnVudCBidWlsZCk6CisgIC9zcmMgIC0gVGhlIEphdmFTY3JpcHQgQXBhY2hlIFRocmlmdCBzb3VyY2UKKyAgL2RvYyAgLSBIVE1MIGRvY3VtZW50YXRpb24KKyAgL2Rpc3QgLSBEaXN0cmlidXRpb24gZmlsZXMgKHRocmlmdC5qcyBhbmQgdGhyaWZ0Lm1pbi5qcykKKyAgL3Rlc3QgLSBWYXJpb3VzIHRlc3RzLCB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byBsb29rIGZvcgorICAgICAgICAgIGV4YW1wbGUgY29kZQorICAvbm9kZV9tb2R1bGVzIC0gQnVpbGQgc3VwcG9ydCBmaWxlcyBpbnN0YWxsZWQgYnkgbnBtCisKKworRXhhbXBsZSBKYXZhU2NyaXB0IENsaWVudCBhbmQgU2VydmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBsaXN0aW5nIGJlbG93IGRlbW9uc3RyYXRlcyBhIHNpbXBsZSBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQKK1RocmlmdCBjbGllbnQgYW5kIE5vZGUuanMgSmF2YVNjcmlwdCBzZXJ2ZXIgZm9yIHRoZSBoZWxsb19zdmMgCitzZXJ2aWNlLiAKKworIyMjIGhlbGxvLnRocmlmdCAtIFNlcnZpY2UgSURMIAorIyMjIGJ1aWxkIHdpdGg6ICQgdGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIGhlbGxvLnRocmlmdAorICAgIHNlcnZpY2UgaGVsbG9fc3ZjIHsKKyAgICAgIHN0cmluZyBnZXRfbWVzc2FnZSgxOiBzdHJpbmcgbmFtZSkKKyAgICB9CisKKyMjIyBoZWxsby5odG1sIC0gQnJvd3NlciBDbGllbnQKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgICAgICA8dGl0bGU+SGVsbG8gVGhyaWZ0PC90aXRsZT4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICBOYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im5hbWVfaW4iPgorICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iZ2V0X21zZyIgdmFsdWU9IkdldCBNZXNzYWdlIiA+CisgICAgICAgIDxkaXYgaWQ9Im91dHB1dCI+PC9kaXY+CisgIAorICAgICAgICA8c2NyaXB0IHNyYz0idGhyaWZ0LmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9oZWxsb19zdmMuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0PgorICAgICAgICAgIChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoIi9oZWxsbyIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCAgICA9IG5ldyBoZWxsb19zdmNDbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIG5hbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hbWVfaW4iKTsKKyAgICAgICAgICAgIHZhciBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdldF9tc2ciKQorICAgICAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIGNsaWVudC5nZXRfbWVzc2FnZShuYW1lRWxlbWVudC52YWx1ZSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICBvdXRwdXRFbGVtZW50LmlubmVySFRNTCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSkoKTsKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCisjIyMgaGVsbG8uanMgLSBOb2RlIFNlcnZlcgorICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKyAgICB2YXIgaGVsbG9fc3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2hlbGxvX3N2Yy5qcycpOworICAgIAorICAgIHZhciBoZWxsb19oYW5kbGVyID0geworICAgICAgZ2V0X21lc3NhZ2U6IGZ1bmN0aW9uKG5hbWUsIHJlc3VsdCkgeworICAgICAgICB2YXIgbXNnID0gIkhlbGxvICIgKyBuYW1lICsgIiEiOworICAgICAgICByZXN1bHQobnVsbCwgbXNnKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmFyIGhlbGxvX3N2Y19vcHQgPSB7CisgICAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgICAgICBwcm9jZXNzb3I6IGhlbGxvX3N2YywKKyAgICAgIGhhbmRsZXI6IGhlbGxvX2hhbmRsZXIKKyAgICB9OworICAgIAorICAgIHZhciBzZXJ2ZXJfb3B0ID0geworICAgICAgc3RhdGljRmlsZVBhdGg6ICIuIiwKKyAgICAgIHNlcnZpY2VzOiB7CisgICAgICAgICIvaGVsbG8iOiBoZWxsb19zdmNfb3B0CisgICAgICB9CisgICAgfQorICAgIAorICAgIHZhciBzZXJ2ZXIgPSBUaHJpZnQuY3JlYXRlV2ViU2VydmVyKHNlcnZlcl9vcHQpOworICAgIHZhciBwb3J0ID0gOTA5OTsKKyAgICBzZXJ2ZXIubGlzdGVuKHBvcnQpOworICAgIGNvbnNvbGUubG9nKCJIdHRwL1RocmlmdCBTZXJ2ZXIgcnVubmluZyBvbiBwb3J0OiAiICsgcG9ydCk7CisKKworVHlwZVNjcmlwdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMgY2FuIGFsc28gYmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmc6CisKKyAgICB0aHJpZnQgLS1nZW4ganM6dHMgZmlsZS50aHJpZnQKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvanMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvanMvcGFja2FnZS1sb2NrLmpzb24gYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkODFjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDM3NzcgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbm5lOS9JaVEvaHpJaFk2cGREbmJCdHo3RGpQVEtyWTAwUC96dlBTbTVwT0ZrbDZ4dUdyR25Ybi9WdFROTmZOdEFmWjkvMVJ0ZWhrc3pVOXFjVGlpMFE9PSIKKyAgICB9LAorICAgICJhZ2VudC1iYXNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FnZW50LWJhc2UvLS9hZ2VudC1iYXNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVndYTXI5bkhZVFVYc0JGS1VxaEp3dmxjWVUvYmxyZU9FVWtoTlIyZVhaSXZ3ZCtjK281VjRNZ0RQS1duTVMvNTZhd04zVFJ6SVArS29Qbityb1F0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2lmeSI6ICJeNS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi01LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWM3WHV5aityWlQ0OVA1UWlzMEd0UWlCZHlXVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY28iOiAiXjQuNi4wIiwKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMS4wLjAiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbGlnbi10ZXh0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FsaWduLXRleHQvLS9hbGlnbi10ZXh0LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRE5rS1ZoQ1Q4MTBLbVNWc0lyY0dsRFA2MFJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIiwKKyAgICAgICAgImxvbmdlc3QiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYXJyLWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWRpZmYvLS9hcnItZGlmZi00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFrWVFkUDYvN0hIbjRWSTFkaG95bWwzSHhTQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItZmxhdHRlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZmxhdHRlbi8tL2Fyci1mbGF0dGVuLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MM2hLVjVSL3A1bzgxUjdPMDJJR253cERta3A2RTk4MlhodGJ1d1NlM080cU90TU1NdG9kaWNBU0ExQ255MlUrYUNYY05wbWwrbTRkUHN2c0ozamF0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci11bmlvbi8tL2Fyci11bmlvbi0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTQ1c0pycW5lK0dhbzhnYmlpSzlqa1p1dU9jUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWVhY2gvLS9hcnJheS1lYWNoLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDVTdkRBV3JGMUtFYnVkVG9mSVJvRnVneEU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWZpbmQtaW5kZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZmluZC1pbmRleC8tL2FycmF5LWZpbmQtaW5kZXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zd0VLb1NoK0ZrdTlwdmx5T3dxV29leEJoNkU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktc2xpY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktc2xpY2UvLS9hcnJheS1zbGljZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQjFxTUQzUkJQN084bzBIMkticlhEeUIwSWNjZWpNRjE1Kzg3THZsb3IxMk9OUFJIUDZnVGpYTU5rdC9kM1p1T0diQWU2NmhGbWFDZkVDSTI0VWZwNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXVuaXF1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxdWUvLS9hcnJheS11bmlxdWUtMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSlMzWFV2RTlzMW5udk1rU3AvWTlHcmkxQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNuMSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc24xLy0vYXNuMS0wLjIuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanh3elFwTFFqU21XWGd3YUNaRTlOeitnbEFHMDF5RjFRbldnYmhHd0hJNUE2RlJJRVk2SVZxdEhoSWVwSHFJNy9reUV5UUVhZ0JDNW1CRUZsSVl2ZGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAifjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNzaWduLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzaWduLXN5bWJvbHMvLS9hc3NpZ24tc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdXWi9RZnJkVHlETXZDdTVhNDFQZjNqc0EyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5ja2l0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5ja2l0Ly0vYXN5bmNraXQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14NTdaZjM4MHk0OHJvYnlYa0x6RFprZExTM2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImF0b2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXRvYi8tL2F0b2ItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdtNnVrb2FPR0ppLzczcC9jbDJHdkxqVEk1Sk0xay9PMTRpc0Q3M1lNTDhTdHJILzcvbFJGZ21nOG5JQ1pnRDNiWlp2andDR3h0TU9EM3dXTkF1OGNnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IgorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZS8tL2Jhc2UtMC4xMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01VDZQNHhQZ3BwMFlERnZTV3dFWjROb0UzYU00UUJRWER6bVZicmFDa0ZqOHpITSttYmE4U3lxQjVEYlpXeVI3bVlIbzZZN0JkUW8zTW9BNG0wVGVRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FjaGUtYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiY2xhc3MtdXRpbHMiOiAiXjAuMy41IiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJtaXhpbi1kZWVwIjogIl4xLjIuMCIsCisgICAgICAgICJwYXNjYWxjYXNlIjogIl4wLjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHdlZXRuYWNsIjogIl4wLjE0LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicmFjZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2VzLy0vYnJhY2VzLTIuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hTmRibmo5UDhQamRYVTR5YmFXTEsySUYzamMvRW9EWWJDN0Fhelc2dG8zVFJzZlh4c2NDOVVYT0I1aURpRVFya3lJYldwMlNMUWRhNCtRQWE3bmMzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWZsYXR0ZW4iOiAiXjEuMS4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZpbGwtcmFuZ2UiOiAiXjQuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJyZXBlYXQtZWxlbWVudCI6ICJeMS4xLjIiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAic25hcGRyYWdvbi1ub2RlIjogIl4yLjAuMSIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4yIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS16bGliLy0vYnJvd3NlcmlmeS16bGliLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdXpYNHBSbjJBT0Q2YTRTRkpCeVhuUUZCK3kwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBha28iOiAifjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1mcm9tLy0vYnVmZmVyLWZyb20tMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1RY1hFVWJDS3RFbzdiaHFFczY1NjBIeWQ0WGFvdlpsTy9rOVYzaGpWVUYvendXN0tCVmRTSzRnSXQvYnp3UzlNYlI1cW9iK0Y1anVzWnNiMFlRSzJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItc2hpbXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLXNoaW1zLy0vYnVmZmVyLXNoaW1zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbVhqT01YT0l4a210aDVNQ2pEUjM3d1JLaTFFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWlsdGluLW1vZHVsZXMvLS9idWlsdGluLW1vZHVsZXMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KdzhIYkZweXdDOWJaYVI5K1V4ZjQ2SjRpUzg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FtZWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZCMFcxbm1odStXY29DeXM3UHNCSGlBZldoOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYW1lbGNhc2Uta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS1rZXlzLy0vY2FtZWxjYXNlLWtleXMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSXZ1ci8zeWdSa0ZIdm9ka3lJVHlSdVBrdWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4yLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYXNlbGVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FzZWxlc3MvLS9jYXNlbGVzcy0wLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMmdjSWYrRUF6eUNaVU1KQm9sQ0RSaHhVZHc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2VudGVyLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NlbnRlci1hbGlnbi8tL2NlbnRlci1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFnMHlZcHR1NlhJZ0JCSEwxRVlja0h2Q3Q2MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMyIsCisgICAgICAgICJsYXp5LWNhY2hlIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xhc3MtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xhc3MtdXRpbHMvLS9jbGFzcy11dGlscy0wLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcU9oUGEvRmo3czZUWThIOGVzR3U1UU5wTU1ReHo3OWgrdXJ6ck5ZTjZtbis5Qm54bERHZjVRWitYZUNEc3hTalBxc1NSNTZYT1pPSm1wZXVybkxNZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci11bmlvbiI6ICJeMy4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RhdGljLWV4dGVuZCI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS8tL2NsaS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlvRjFOUEpMK2tsUXcwMVRMVWpzdkdJYmpCUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJjbGl1aSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGl1aS8tL2NsaXVpLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzBkWFlQK0FKa3gyTERvWEdRTXVrY2Yrb05FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNlbnRlci1hbGlnbiI6ICJeMC4xLjEiLAorICAgICAgICAicmlnaHQtYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIjAuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImNvIjogeworICAgICAgInZlcnNpb24iOiAiNC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvLy0vY28tNC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1icWE5ODloVHJsVE11T1I3K2d2eitRTWZzWVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNvZmZlZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29mZmVlc2NyaXB0Ly0vY29mZmVlc2NyaXB0LTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTU2cURBWkYrOWlHelhZbzU4MGpjM1IyMzR6ND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xsZWN0aW9uLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbGxlY3Rpb24tdmlzaXQvLS9jb2xsZWN0aW9uLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzhBM1BCWkx3eWtiVFRhTWdwenhxQXBaM0tBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1hcC12aXNpdCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9ycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Gb3BIQVhWcmFuOVJvU3pneVh2NktNQ0U3V009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tYmluZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmVkLXN0cmVhbS8tL2NvbWJpbmVkLXN0cmVhbS0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYnJXbDl5NnZPQjF4WVBaY3BaZGUzTjl6REJ5WFRvc0FlTURvNHAxd3pvNlVNT1g0dnVtQitUUDFSWjc2c2ZFNk1kNjhRME5KU3JFL2diZXpkNFVsK3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGF5ZWQtc3RyZWFtIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb21wb25lbnQtZW1pdHRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21wb25lbnQtZW1pdHRlci8tL2NvbXBvbmVudC1lbWl0dGVyLTEuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRTNrWTF0ZUNnL2ZmZW10OFdtUGhRT2FVSmVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtc3RyZWFtLy0vY29uY2F0LXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMjdIQmdoSnhqaVp0SWszWWN2bi80a2JKay8xdVp1SkZmdVBFbnM2TGFFdnB2RzFmMGhUZWE4bGlscm91eW85bVZjMkdXZGNFWjhPTG9HbVNBRGxyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1mcm9tIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjMiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjIuMiIsCisgICAgICAgICJ0eXBlZGFycmF5IjogIl4wLjAuNiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtYnJvd3NlcmlmeS8tL2NvbnNvbGUtYnJvd3NlcmlmeS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThDUWNSWE1LbjhZeU95QnR2emp0eDBIUXV4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkYXRlLW5vdyI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiY29weS1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcHktZGVzY3JpcHRvci8tL2NvcHktZGVzY3JpcHRvci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVoyOXVzOE9abDhMdUdzT3BKUDFoSkhTUFY0MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jdXJyZW50bHktdW5oYW5kbGVkLy0vY3VycmVudGx5LXVuaGFuZGxlZC0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1JM3pQK3F4a2U5NW1tRTJuZGRzRjYzNVYrbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maW5kLWluZGV4IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjeWNsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jeWNsZS8tL2N5Y2xlLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSWVnTEsraFlENWkwYVBONVF3WmlzRWJEU3RJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJkYXNoZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGFzaGRhc2gvLS9kYXNoZGFzaC0xLjE0LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVHo2RDN5K0wrMWQ0Z01tdU4xWUVEWDI0dkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkYXRlLW5vdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlLW5vdy8tL2RhdGUtbm93LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnZRNS9VMUlTSzEwNWN4OXZ2SUFaeXVlTkZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRhdGVmb3JtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGVmb3JtYXQvLS9kYXRlZm9ybWF0LTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW54SkxaMWxNazMvM0JwTXVTbVFzeW8yNy91az0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNhbWVsaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY2FtZWxpemUvLS9kZWNhbWVsaXplLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWxOTkZSU0NhYklEVXVlKzRtOVFINW9aRXBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlY29kZS11cmktY29tcG9uZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29kZS11cmktY29tcG9uZW50Ly0vZGVjb2RlLXVyaS1jb21wb25lbnQtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02emtUTXpSWWQxeTRUTkdoK3VCaUVHdTRkVVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItandLMlVWNGNuUHBiY0c3K1ZSQVJLVFpQVVdvd3dYQThiekg1TlA2dWQwb2VBeHlZUHVHWlVBQzdoTXVncENkejRCZVNabDJEbDlrNjZDSEovNDZaWVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4yIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImRlbGF5ZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGF5ZWQtc3RyZWFtLy0vZGVsYXllZC1zdHJlYW0tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zenJobWF5dCszMUVDcXJnc3A0aWNySk94aGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWZpbGUvLS9kZXRlY3QtZmlsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThOWnRBMmNxZ2x5eHR6dmJQK1lqRU1qbFVyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb20tc2VyaWFsaXplciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb20tc2VyaWFsaXplci8tL2RvbS1zZXJpYWxpemVyLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQnp4cGRVYk9CNERPSTc1S0tPS1Q1QXZERElJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIn4xLjEuMSIsCisgICAgICAgICJlbnRpdGllcyI6ICJ+MS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12U2gzUGlaQ2lCcnNVVlJKSkNtY1hOZ2lHRnM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZW50aXRpZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWJsd3RDbFlodGRyYTdPK0F1UTdmdGMxM2N2QT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21lbGVtZW50dHlwZS8tL2RvbWVsZW1lbnR0eXBlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc1hydGd1aXJXZVV0MmNHYkYxYmcvQmh5Qk1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvbWhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9taGFuZGxlci8tL2RvbWhhbmRsZXItMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MZVdhQ0NMVkFuK3IvMjhETENzbG9xaXI1emc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkb211dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb211dGlscy8tL2RvbXV0aWxzLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM05oSWlpYjFZOVlRZWVTTW4zdCtNamMyZ3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbS1zZXJpYWxpemVyIjogIjAiLAorICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVudGl0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VudGl0aWVzLy0vZW50aXRpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcGg2bzRJVFIvemVaQ3NrL2Z5ZVQ3Y1N2eVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXJyb3ItZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXJyb3ItZXgvLS9lcnJvci1leC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN2RGSE5tcWVGU0V0MlpCc0NyaW9yS25uM1oycGorZmQ5a21JNlFvV3c0Ly9ETCtpY0VCZmMwVTdxSkNpc3FyVHNLVGp3NGZORnkycFc5T3FTdEQ4NGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFycmF5aXNoIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlczYtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzZS8tL2VzNi1wcm9taXNlLTQuMi41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uNnd2cGRFNDNWRnRKcStsVURZREJGVXdWOFRaYnVHWExWNEQ2d0thZmcxM2xkem5Lc3lFdmF0dWJubVVlMzF6Y3ZlbFN6T0hGK1hiYVQrQmw5T2JEZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXM2LXByb21pc2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNpZnkvLS9lczYtcHJvbWlzaWZ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVVFuV0x6NVc2cFo4UzJOUVd1OElLUnlLVWdNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIKKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMTQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItMC40LjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtajJHM1hONEJLeTZlc29UVVZGV0R0V1E3WWFzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhpdC8tL2V4aXQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CakpqajQySGZNZ2hCOU1LRC84YUY4dWh6UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLWJyYWNrZXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC1icmFja2V0cy8tL2V4cGFuZC1icmFja2V0cy0yLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXQzYzE0eFhPTVBhMjcvRDRPd1FWR2lKRWxpST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMi4zLjMiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXhwYW5kLXRpbGRlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10aWxkZS8tL2V4cGFuZC10aWxkZS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwrZ0JxZ1V0OENSVTNrYXdLL1loWkN6Y2hRST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLy0vZXh0ZW5kLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1manF1QzU5Y0Q3Q3lXNnVyTlhLMEZCdWZrWmNvaUdHODB3VHVQdWpYNTkwY0I1VHRsbjIwRTJVQjRTL1dBUlZxaFhmZlpsMkxOZ1MrZ1FkUElJaW0vZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpxY2Fyd2M3T2ZzaEp4Y25SaE1jSndRQ2piZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NpZ24tc3ltYm9scyI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0Z2xvYi8tL2V4dGdsb2ItMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5tYjZRWGtFTHN1QnIyNENKU2tpbG82VUhIZ2Jla0s1VWlaZ2ZFNlVIRDNFYjI3WUM2b0QrYmhjVCt0SjZjbDhkbXNnZFF4bldsY3J5OGtzQklCTHB3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiZXhwYW5kLWJyYWNrZXRzIjogIl4yLjEuNCIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dHJhY3QtemlwIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHJhY3QtemlwLy0vZXh0cmFjdC16aXAtMS42LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRUMwdUs5a0F5Wk1qYlYvVHhwME16NzRIK2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICIxLjYuMiIsCisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJta2RpcnAiOiAiMC41LjEiLAorICAgICAgICAieWF1emwiOiAiMi40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0c3ByaW50ZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRzcHJpbnRmLy0vZXh0c3ByaW50Zi0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxwR0VRT01FR25wQlQ0eFM0OFYwNnp3K0hnVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleWVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V5ZXMvLS9leWVzLTAuMS44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXM4U0FqVEdnM2hka0NOSXFBRHZQZ3pDQzhBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd0ZOSGVCZklhMUhhcUZQSUhnV2JjejBDTmhRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmZC1zbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmQtc2xpY2VyLy0vZmQtc2xpY2VyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaTF2TDJld3lmRkJCdjVxd0kvMW5VUEVYZm1VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBlbmQiOiAifjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15K0hqci96eHpVUzRESzMrMG8zSGs2bHdIUzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpbGwtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsbC1yYW5nZS8tL2ZpbGwtcmFuZ2UtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xVVNCSFVLUG1Pc0dwajNFQXRKQVBES01PUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiLAorICAgICAgICAidG8tcmVnZXgtcmFuZ2UiOiAiXjIuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmQtdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZC11cC8tL2ZpbmQtdXAtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1heTZZSXJHaXpncGdxMlRXRU96SzFUeXlUUTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1leGlzdHMiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kdXAtc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTjVNS3BkZ1d0M2ZBTkVYaGxtekdlUXBNQ3hZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAifjUuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZWQvLS9maW5lZC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMzM0lSTGRxTDE1d2dlaUU5OEN1TkU4Vk5IWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAib2JqZWN0LmRlZmF1bHRzIjogIl4xLjEuMCIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4yLjAiLAorICAgICAgICAicGFyc2UtZmlsZXBhdGgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZsYWdnZWQtcmVzcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGFnZ2VkLXJlc3Bhd24vLS9mbGFnZ2VkLXJlc3Bhd24tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Ubm11bXk2emkvaHJPN1ZyOCtDbGFxWDhxOWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLWluIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1pbi8tL2Zvci1pbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdRYU5LVnFCUXV3S3h5Ykc0aUFNTVB0dFhvQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3Itb3duIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1vd24vLS9mb3Itb3duLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGpNeTlCWE8zRXNFMi81d3o0TmtsTVU4dEVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yZXZlci1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JldmVyLWFnZW50Ly0vZm9yZXZlci1hZ2VudC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSs4Y2ZERUd0NnpmNWJGZDYwZTFDMlAyc3lwRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJqc29uZmlsZSI6ICJeMi4xLjAiLAorICAgICAgICAia2xhdyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtsYXciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0xLjMuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RSWhETzBhenNib2xuWGg0WFk2Vzl6dWdKRGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdVdqR3NLQkRoREpKQXVpL0dsM3pKWG1rVVA0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtdmFsdWUvLS9nZXQtdmFsdWUtMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zQlhLSEdjamg4cDJ2VGVzQ2psYm9nUXFMQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0b2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldG9iamVjdC8tL2dldG9iamVjdC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJIcEVsNG42RmcwQmoxU0c3WkV5QzI3SGlGdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRwYXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldHBhc3MvLS9nZXRwYXNzLTAuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWHYrT1BtaE5WcHJreXlzU2dtQk9pNlloU2ZvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlSdXZyMG5sSmJqTmt5WU5GS3NUWVZLejlYbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuMiIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtbW9kdWxlcy8tL2dsb2JhbC1tb2R1bGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zS3pwRWtmMTFHcE9GdXcwWnpqem10NEI0VVp3ak9jRzc1N1BQdnJmaHhjTEZicTB3cHNncE9xeHB4dHhGaUNHNER0RzkzTTZYUlZiRjJvR2RldjdiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmFsLXByZWZpeCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1wcmVmaXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLXByZWZpeC8tL2dsb2JhbC1wcmVmaXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yL2REeHNGSmtsazhaVlZveTJidE1zQVNMcjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIsCisgICAgICAgICJpbmkiOiAiXjEuMy40IiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTQiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIKKyAgICB9LAorICAgICJncnVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC8tL2dydW50LTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vSnptWk5QZktvcmxDcnJteFdxUU80SlZvZE8rRFZkNVhYNERrb2NMLzFXbExsS1ZMRTkrU2RFSWVtcE9BeERoV1B5c0xsZTZhZnZuL2hnN0NrMms5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29mZmVlc2NyaXB0IjogIn4xLjEwLjAiLAorICAgICAgICAiZGF0ZWZvcm1hdCI6ICJ+MS4wLjEyIiwKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAifjAuNC4xMyIsCisgICAgICAgICJleGl0IjogIn4wLjEuMSIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4wLjAiLAorICAgICAgICAiZ3J1bnQtY2xpIjogIn4xLjIuMCIsCisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nIjogIn4yLjAuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktdXRpbCI6ICJ+MS4xLjEiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJ+MC40LjEzIiwKKyAgICAgICAgImpzLXlhbWwiOiAifjMuNS4yIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIn4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAifjIuNi4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJncnVudC1jbGkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmlzUm5yc0duZHRHU3M0b1JWQWI2WHMxdHFnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgICAgICJyZXNvbHZlIjogIn4xLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJub3B0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV3QlJ1L1FwQWpEYzUzRFJMRWt5aWxGZEwwemVucHh1K2ZkZFRJbHNGL0tKcWROY0hhUW12eXUxVzNjRGVzWjlycXFaZEtLNUE4K1FESXlMVUVXb1pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJpbnRlcnByZXQiOiAifjEuMS4wIiwKKyAgICAgICAgImxpZnRvZmYiOiAifjIuNS4wIiwKKyAgICAgICAgIm5vcHQiOiAifjQuMC4xIiwKKyAgICAgICAgInY4ZmxhZ3MiOiAifjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItY29uY2F0Ly0vZ3J1bnQtY29udHJpYi1jb25jYXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZVkNZWXdoT2h4MStodDVJd0JVbG50bDNSYjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWpzaGludC8tL2dydW50LWNvbnRyaWItanNoaW50LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnAyUW15V1R4QTZMNTVsQXNoTkFoUXg1T2F3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjEuMSIsCisgICAgICAgICJob29rZXIiOiAiXjAuMi4zIiwKKyAgICAgICAgImpzaGludCI6ICJ+Mi45LjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXF1bml0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItcXVuaXQvLS9ncnVudC1jb250cmliLXF1bml0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zOTk0K2lwS3djK29VVUlXYUdJdzFzb3lJRDRwRXhTR01kL2NIUU41aDBwOEtiSWpSMUxlM1pDM2dpU0RES1h0WkZFMGkrT2JmMHVJak52amZ0WDJDdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJeNS4wLjEiLAorICAgICAgICAicC1lYWNoLXNlcmllcyI6ICJeMS4wLjAiLAorICAgICAgICAicHVwcGV0ZWVyIjogIjEuNy4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItNS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVplZ2xkWDdhMWZvbEM5djErcXRZNkNjbEZJPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi11Z2xpZnkvLS9ncnVudC1jb250cmliLXVnbGlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJtZWtiNUZUN2RUTEVZRTZWZXRweHcxOXN2cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjAuMSIsCisgICAgICAgICJtYXhtaW4iOiAiXjEuMS4wIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJ+Mi42LjIiLAorICAgICAgICAidXJpLXBhdGgiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtanNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtanNkb2MvLS9ncnVudC1qc2RvYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0M2NlRDUlhlUU1qM0hJeXFWU0JKbTh6ZFV6NDNlNXZhRy9QTE8vNjI3QTFlZGJKbnp4aEpWN25GMEtxTHdNTTBSRE51MWlzdEM2ZnZmbllxRktpM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJqc2RvYyI6ICJ+My41LjUiLAorICAgICAgICAibWFya2VkIjogIl4wLjUuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWFya2VkIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuNS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaVVrQlplZ0Nab3U0QWR3YktUd1NXL2xORGN6NU91UlNsM3FkY2wzMUlhMEIyUVBHMEpuK3RLYmxoLzkvZVA5LzYrNGgyN3Zwb2g4d2VsL3ZRT1Ywdnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWtub3duLW9wdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQta25vd24tb3B0aW9ucy8tL2dydW50LWtub3duLW9wdGlvbnMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNId3NMcW9pZ2hwdTdUdVlqNVJvbm5FdXhHVkZuenRjVXFUcXA1clhGR1lMNE91UEZvZndDNFljZzduOWZZd3ZLNkY1V2JZZ2VWT3dwaDlDcnMyZnNRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2cvLS9ncnVudC1sZWdhY3ktbG9nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbTMrNVF2RFlmUjFsdHI4aGppYWlOamRkeEdkUVdjSDBydzFpS0tpUW5GMCt4dGdUYXppclNUR3U2OFJjaFB5aDFPQm5nMWJCVWpMbVg4cTlOcG9Ddz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3JzIjogIn4xLjEuMiIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogIn4yLjAuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy41IgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS1sb2ctdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LWxvZy11dGlscy8tL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW83dUh5Ty9KK2kydFhHOHIyYlpObFZrMjB2bElGSjlJRVl5SE1DUUdmV1lydThKdjN3VHFLWnp2VjMwWVc5cldFanEwZVAzY2ZsUTFxV29qSWU5VkZBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJ+Mi40LjEiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS11dGlsLy0vZ3J1bnQtbGVnYWN5LXV0aWwtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTl6eUEyOXcvZkJlNkJJZmpHRU5uZHdvZTFVeTMxQklYeFRIM3M4bWdhMFo1QnoyU3A0VUNqa2V5djJ0STQ0OXlta3gzeDI2Qis0NkZWNGZYRWRkbDVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS41LjIiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0b2JqZWN0IjogIn4wLjEuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJ1bmRlcnNjb3JlLnN0cmluZyI6ICJ+My4zLjQiLAorICAgICAgICAid2hpY2giOiAifjEuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LXNoZWxsLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1zaGVsbC1zcGF3bi8tL2dydW50LXNoZWxsLXNwYXduLTAuMy4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdidU5SWDdFZlRHQ3FIMWpDTytFWGQrNVNJOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudCI6ICI+PTAuNC54IiwKKyAgICAgICAgInN5bmMtZXhlYyI6ICJ+MC42LjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3ppcC1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2d6aXAtc2l6ZS8tL2d6aXAtc2l6ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpzK0xFQkJISW51VnVzNXVvZG9NRjM3VndpOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiAiXjAuMS40IiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhci1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXNjaGVtYS8tL2hhci1zY2hlbWEtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xVXdpSk92S3dFZUNvTmtEVlNIeVJ6VzM3Skk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImhhci12YWxpZGF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXZhbGlkYXRvci8tL2hhci12YWxpZGF0b3ItNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStxbm1Oakk0T2ZIMmlwUTlWUU93MjNiQmQvaWJ0ZmJWZEsyZlliWTRhY1REcUtUVy9ZRHA5TWNpbVpkRGJHOGlWOWZaaXpVcVFNRDV4dnJpQjE0NlRBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl41LjMuMCIsCisgICAgICAgICJoYXItc2NoZW1hIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtYW5zaS8tL2hhcy1hbnNpLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlBVRW5PSHMzeXNHU2E4KzhrNUY3VFZCYlpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZS8tL2hhcy12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUdMS0IybGhiSEZ4UjN2Sk1rdzdTbWd2bXNYYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtdmFsdWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZXMvLS9oYXMtdmFsdWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGJDMlArd2hSbUdhYitWLzUxWW8xYU9lL2s4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAia2luZC1vZiI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi00LjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JSUU5ODljU2tvc2djM2hwR2tVR2I2NXkzVmM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoYS8tL2hhc2hhLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZU5mTC9CNXRaakEvNTVnM05sbUVVWHN2YnVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1zdHJlYW0iOiAiXjEuMC4xIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJob21lZGlyLXBvbHlmaWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvbWVkaXItcG9seWZpbGwvLS9ob21lZGlyLXBvbHlmaWxsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVEN1OGluV0ptUDdyOWUxb1dBOTIxR2RvdEx3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhcnNlLXBhc3N3ZCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9va2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvb2tlci8tL2hvb2tlci0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVEVDNJOHhLSkNxbVdXTkZuZmJaaE1YVDJWaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJob3N0ZWQtZ2l0LWluZm8iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9zdGVkLWdpdC1pbmZvLy0vaG9zdGVkLWdpdC1pbmZvLTIuNy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03VC9CeEgxOXpiY0NUYThYa01sYks1bFRvMVd0Z2tGaTNHdmRXRXlOdWM0VmV4Ny85RHFibnBzZjRKTXlkY2ZqOUhDZzR6VVdGVEwzWmE2bGFwZzUvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbHBhcnNlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAianNwcmltIjogIl4xLjIuMiIsCisgICAgICAgICJzc2hwayI6ICJeMS43LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cHMtcHJveHktYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cHMtcHJveHktYWdlbnQvLS9odHRwcy1wcm94eS1hZ2VudC0yLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFBDVFMxTFc1MWJjeU1ZYnhVSU9PNEhFT2xRMS8xcVJhRldjeXh2d2FxVVM5VFk4OGFvRXVIVVkzM2t1QWgxWWhWVmFEUWhMWnNuUGQrWE5BUldabFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFnZW50LWJhc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTMuMi42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWVsK2pmN25ydEVsNVBuMVF4NDZ6QVJYS0RwQmJ2emV6c2U3cDdMcUlObWRvSWs4UFlQNVN5U2F4RW1ZdjZUWjBKeUVLQTFoc0NJZDZESWhnSVR0V1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmRlbnQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZGVudC1zdHJpbmcvLS9pbmRlbnQtc3RyaW5nLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamkxSU5JZENFaHRLZ2hpM29UZnBwU0JKM0lBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlcGVhdGluZyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnRlcnByZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW50ZXJwcmV0Ly0vaW50ZXJwcmV0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZnRHeFFReHFEZzk0ejVYVHVFUU1ZL2VMaGhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFic29sdXRlLy0vaXMtYWJzb2x1dGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRPV29xZmx2Y3lkQVJhMzYwR3Z2MThEWi9nUnVIS2kyTlUvd1U1WDFaRnpkWWZIMjlua2lOWnNGM21wNE9KM0g0eW85TXg4QS91QUdOenB6UE4zeUJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1yZWxhdGl2ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFlRXNzNjZOaDJjbjd1ODRRL2lnaVh0Y21OWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWFycmF5aXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFycmF5aXNoLy0vaXMtYXJyYXlpc2gtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kOG1ZUUZKNnFPeXhxTHBwZTRCa1ducVNhcDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1ZmZlci8tL2lzLWJ1ZmZlci0xLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNkQUx3cFhrVG01WnZ2Yms3b3dPVVN2VnZCS0RnS1A1L2V3ZlhFem5tUUZmczRaUm1hbk9lS0JUalJWamthM1FGb042WEorOUYzVVNxZkhxVGFVNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYnVpbHRpbi1tb2R1bGUvLS9pcy1idWlsdGluLW1vZHVsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZBVnkwMDk2d3hHZmozYkRETHdiSGdONi83ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWlsdGluLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy10eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXR5cGVkYXJyYXkvLS9pcy10eXBlZGFycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNUhuSUNGamZEQnNSM2RwcFFQbGdFZnphU3BvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy11bmMtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy11bmMtcGF0aC8tL2lzLXVuYy1wYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tckdwVmQwZnM3V1dMZlZzU3R2Z0Y2aUVKbmJqREZaaDkvZW1oUkRjR1dUZHVUZk5IZDlDSGVVd0gzZ1lJamRid280T242aHVua3p0d09hQXcweWxsUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5jLXBhdGgtcmVnZXgiOiAiXjAuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXV0ZjgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdXRmOC8tL2lzLXV0ZjgtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TdzJoUkNFRTBiTTJOQTZBZVg2R1hQT2ZmWEk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtd2luZG93cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy13aW5kb3dzLy0vaXMtd2luZG93cy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVhLMVVJbnEyYlBtanlYNmUzVkhJek1Mb2JjNEo5NGk0QVduK0hwcTNPVTVLa3JSQzk2T0FjUjNQUkovcEd1Nm04VFJuQkhQOWRrWFFWc1QvQ09WSUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc29iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGtNZWtyRWFsekZqYXFINXlOSE12UDJyZU44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzc3RyZWFtLy0vaXNzdHJlYW0tMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SK1kvZXZWYSttK1M0VkFPYVE2NHVGS2NDWm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzZkRnQmZLdkhNaXNOSDd6U1dra1dRZkw3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjIiLAorICAgICAgICAiZXNwcmltYSI6ICJeMi42LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2JuIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzYm4vLS9qc2JuLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGVaVXd1V2kzclh5QWRsczc3eW9EQTd5OVJNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi45LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzaGludC8tL2pzaGludC0yLjkuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS085U0lBS1RsSlFPTTRsRTY0R1FVdEdCUnBUT3V2YnJSclNadzNBaFV4TU5HMjY2blg5aEsyY0tBNFNCaFhPajBpckpHeU55R1NMVDYySEdPVkRFT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNsaSI6ICJ+MS4wLjAiLAorICAgICAgICAiY29uc29sZS1icm93c2VyaWZ5IjogIjEuMS54IiwKKyAgICAgICAgImV4aXQiOiAiMC4xLngiLAorICAgICAgICAiaHRtbHBhcnNlcjIiOiAiMy44LngiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAicGhhbnRvbSI6ICJ+NC4wLjEiLAorICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIn4yLjEuNyIsCisgICAgICAgICJzaGVsbGpzIjogIjAuMy54IiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiMS4wLngiLAorICAgICAgICAidW5pY29kZS01LjIuMCI6ICJeMC43LjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0xLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1IaFg3eXNsOVB1bWI4dGM3VEdWckNDdTYrNUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2xpbnQvLS9qc2xpbnQtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Sb0NzeUlDY0tBKzZURnNieXM5RHBLVGZQVmFDNzFNbTVRU2p2cldBMGxEVk4rTEl2eDZhcGE0MkZGaXNNcW1DVHZKOER4a2NvUUdKMGo3bTNrVFZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICJ+MC4xLjIiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIn4yLjEuNSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMS4wLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlE0Z3QxWlpDdFA1RUpQeVdrOHEyTC96QzZNPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMS41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVp2cUxjZzRVT0xOa2FCOHEwYVk4WVlSSXlkQT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJidWZmZXItc2hpbXMiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+MS4wLjYiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS8tL2pzb24tc2NoZW1hLTAuMi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdElESWt1V2FMd1dWVE9jbnZUOHFUb2d2bmhNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTkpwdFJNVTZVZDZKdEFnRnhkWGxtMEY5TTBBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RyaW5naWZ5LXNhZmUvLS9qc29uLXN0cmluZ2lmeS1zYWZlLTUuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXBhaTFZL1VYeG1nOXM0QjFsY0I0c2MxdHVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25maWxlLy0vanNvbmZpbGUtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OemFpdENpNGU3Mmd6SU8xUDZQV002TmNLdWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc3ByaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNwcmltLy0vanNwcmltLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTVQ1bXZCNWN3RzVEaThHM1Nad3VYRmFzdHFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICIxLjAuMCIsCisgICAgICAgICJleHRzcHJpbnRmIjogIjEuMy4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hIjogIjAuMi4zIiwKKyAgICAgICAgInZlcnJvciI6ICIxLjEwLjAiCisgICAgICB9CisgICAgfSwKKyAgICAia2V3IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tldy8tL2tldy0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVkazlMVE0yUFcvZEtYQ3pOZGtVR3RXUjE1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAia2luZC1vZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczVrTE9jbkgwWHFETytGdnVhTFg4RERqWjE4Q0dGazdWeWdINDBRb0tQVVFoVzRlMnJ2TTByd1VxMHQ4SVFET3dZU2VMSzAxVTkwT2p6QlRtZTJRcUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsYXp5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xhenktY2FjaGUvLS9sYXp5LWNhY2hlLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtb2RlUHc2VUVkTXVBaEYwN08yNGRwSnBFYm80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxpZnRvZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlmdG9mZi8tL2xpZnRvZmYtMi41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JQWtwRzdNYzZvWWJ2eENud1Zvb3l2ZGNNZXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kIjogIl4zLjAuMCIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJeMi4wLjAiLAorICAgICAgICAiZmluZWQiOiAiXjEuMC4xIiwKKyAgICAgICAgImZsYWdnZWQtcmVzcGF3biI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIsCisgICAgICAgICJvYmplY3QubWFwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWNob2lyIjogIl4wLjYuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWt5YXhTSXdpMGFZSWhsQ29hUUd5MmFrS0xMdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJkZXRlY3QtZmlsZSI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWdsb2IiOiAiXjMuMS4wIiwKKyAgICAgICAgICAgICJtaWNyb21hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvYWQtanNvbi1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9hZC1qc29uLWZpbGUvLS9sb2FkLWpzb24tZmlsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxXa0ZjSTFZdExxMHdpWWJCUFdmTWNtVGRNQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGFyc2UtanNvbiI6ICJeMi4yLjAiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWJvbSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb25nZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvbmdlc3QvLS9sb25nZXN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUtDeTJqajNOM0RvS1VvTkl1WmlYdGQ5QUpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxvdWQtcmVqZWN0aW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvdWQtcmVqZWN0aW9uLy0vbG91ZC1yZWplY3Rpb24tMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XMGI0QVVmdDdsZUljUENHMEVnaHo1bU9WUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6ICJeMC40LjEiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1ha2UtaXRlcmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFrZS1pdGVyYXRvci8tL21ha2UtaXRlcmF0b3ItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXB4aXVYaDBpVkVxN1ZNN0tNSWhzNWd4c2Z4Q3V4MlVScHRVUWFYbzRpWlpKeEJBelRQT0xFMkJ1bU81ZGJmVllxL2hCSkZCUi9hMW1GRG1PeDVBR213PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXAtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLWNhY2hlLy0vbWFwLWNhY2hlLTAuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd3lxOUM5WlNYWnNGRmtXN1R5YXNYY21LRGI4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC1vYmoiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLW9iai8tL21hcC1vYmotMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yVFBPdVNCZGdyM1BTSWIyZEN2Y0swM3FGRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC12aXNpdC8tL21hcC12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdOeW84VEZFNW1EeHRiMUI4UzgwZWRtTis0OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3QtdmlzaXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1lb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZW93Ly0vbWVvdy0zLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNzdG1pMEpTS0NrS3UvcUZhSkpZY3dpb0Fmcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2Uta2V5cyI6ICJeMi4wLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4xLjIiLAorICAgICAgICAibG91ZC1yZWplY3Rpb24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1hcC1vYmoiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjEuMyIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuNCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJyZWFkLXBrZy11cCI6ICJeMS4wLjEiLAorICAgICAgICAicmVkZW50IjogIl4xLjAuMCIsCisgICAgICAgICJ0cmltLW5ld2xpbmVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1pY3JvbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pY3JvbWF0Y2gvLS9taWNyb21hdGNoLTMuMS4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVdpa2dsOW45TTN3K2Jwc1kzSGU4TCt3OWVGOTMzOHhSbDhJQU81dmlEaXp3U3p6aUZFeVV6bzJ4cnJsb0I2NEFEYlRmOHVBOHZScXF0dERUT21jY2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImJyYWNlcyI6ICJeMi4zLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAiZXh0Z2xvYiI6ICJeMi4wLjQiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIiwKKyAgICAgICAgIm5hbm9tYXRjaCI6ICJeMS4yLjkiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS8tL21pbWUtMi4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FVWxsY1ZveWRCSEdOMXo4NHlmUURpbW41OHBaTk5OWGdabEhYU2JveE1sRnZnSTZNWFNXcFdLcEZScmE3SDFIeHBWaEhUa3JnaGZSVzQ5azZ5amVnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLWRiIjogeworICAgICAgInZlcnNpb24iOiAiMS4zNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLWRiLy0vbWltZS1kYi0xLjM3LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVIzQzRkYjZiZ1FobEloUFU0OGZVdGRWbUtuZmxxK2hSZGFkN0l5S2h0RmowNlZQTlZkazJSaGlZTDNValFJbHNvOEwrWXhBdEZrb2JUMFZLK1MveWJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLXR5cGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLXR5cGVzLy0vbWltZS10eXBlcy0yLjEuMjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNpTDZEYndweUx6alIzeEhTRk5GZWI5TnovTThXRGtYMzN0MUdGUW5GT2xsV2s4cE9yaC9MU3JCNU9YbG5sVzVQOUxINzNYNmxvVy9lb2djK0Y1bEpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1lLWRiIjogIn4xLjM3LjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIKKyAgICB9LAorICAgICJtaXhpbi1kZWVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21peGluLWRlZXAvLS9taXhpbi1kZWVwLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Wkl0TEhlRWdhcUV2ZDVsWUJYZm00RVpTRkNYMjlKYjlLK2xBSGhES3pSZUtCUUtqM1IrN05PRjZ0anFZaTl0NG9JOFZVZmFXSVRKUW04NnduWEdOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLWluIjogIl4xLjAuMiIsCisgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTEuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXJuWE14VDFoaG9LbzlrMUxaZG1sTnlKZEREZnkydjBmWGpGbG1vazQraTh1bC82V2xiVmdlOWJoTTc0T3BOUFFQTUdVVG9EdHorS1hhMVBuZUp4T0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFub21hdGNoLy0vbmFub21hdGNoLTEuMi4xMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZnBvZTJUMFJiSHdCVEJVT2Z0QWZCUGFERWkwNnVmYVVhaTBtRTZZbjFrYWNjM1NuVEVyZmIvaCtYOTRWWHpJNjRyS0ZIWUltWFN2ZHdHR0Ntd09xQ0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMiIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wTlJvV3YxVUZSazhqSFVGWUMwTkY4MWtSMDA9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIiwKKyAgICAgICAgIm9zZW52IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvLS9ub3JtYWxpemUtcGFja2FnZS1kYXRhLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ampVRmJUUGZFeTNSL2FkLzJvTmJLdFc5SGdvdmw1TzFGdkZXS2tLYmxOWG9OL09vdTYrOStLS29oUEsxM1ljMy9UeXVueVdoSnA2Z3ZSTlIvUFBBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9zdGVkLWdpdC1pbmZvIjogIl4yLjEuNCIsCisgICAgICAgICJpcy1idWlsdGluLW1vZHVsZSI6ICJeMS4wLjAiLAorICAgICAgICAic2VtdmVyIjogIjIgfHwgMyB8fCA0IHx8IDUiLAorICAgICAgICAidmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZSI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYXV0aC1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC45LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29hdXRoLXNpZ24vLS9vYXV0aC1zaWduLTAuOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZXhoVUZGUFRHVjh5YkF0U0lHYlY2Z09rU3Y4VXRSYkRCbkF5TFF3NFFQS2tnTmxzSDJCeVBHdE1VcWRXa29zNllDUm1BcVZpd2dackpjL21SRHpaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWNvcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWNvcHkvLS9vYmplY3QtY29weS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZuMkZpM2diMThtUnBCdXBkZTA0RW5WT21Zdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3B5LWRlc2NyaXB0b3IiOiAiXjAuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAia2luZC1vZiI6ICJeMy4wLjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtdmlzaXQvLS9vYmplY3QtdmlzaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05NXhFazY4TVUzZTFuK09kT1Y1QkJDM1FSYnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5kZWZhdWx0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QuZGVmYXVsdHMvLS9vYmplY3QuZGVmYXVsdHMtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PbitHZ3pTMEI5NmdiYUZ0aU5YTktlUTEvczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZWFjaCI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyYXktc2xpY2UiOiAiXjEuMC4wIiwKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QubWFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5tYXAvLS9vYmplY3QubWFwLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtejRQbG5jajh3SzFmUWxEaDk0czdnYjJBSFRjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1ha2UtaXRlcmF0b3IiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5waWNrIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5waWNrLy0vb2JqZWN0LnBpY2stMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNkVLeE1GcFM5TGh5L1Uxa2FaaFFmdGQxMGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iCisgICAgfSwKKyAgICAib3NlbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3NlbnYvLS9vc2Vudi0wLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMENXY0NFQ2RNVmMyUnczVTV3OVpqcVg2Z2E2dWJrMXhEVkt4dEJRUEs3d2lzLzBGMnI5VDZrNHlkR1loZWNsN1lVQnhCVnhoTDVvaXNQc054QVBlMmc9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMCIsCisgICAgICAgICJvcy10bXBkaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtZWFjaC1zZXJpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1lYWNoLXNlcmllcy8tL3AtZWFjaC1zZXJpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rdzg5RXQwZlVPZERSRmVpTE5id1NzYXRmM0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicC1yZWR1Y2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtcmVkdWNlLy0vcC1yZWR1Y2UtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTUt3M1pOcVJwQ2xLZmdqSDFpZy9iYWtmZm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFrbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYWtvLy0vcGFrby0wLjIuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTgvZFNMMDczZ2pTTnFCWWJyWjdQMVJ2NE9uVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZS1maWxlcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1maWxlcGF0aC8tL3BhcnNlLWZpbGVwYXRoLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGpJU2YxT3E4OUZZZHZXSEx6LzZ4MlBXeUpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFic29sdXRlIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4wIiwKKyAgICAgICAgInBhdGgtcm9vdCI6ICJeMC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1qc29uLy0vcGFyc2UtanNvbi0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlJRDBCRFR2Z0hRZmhHa0puNDNxR1BWYVRjaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcnJvci1leCI6ICJeMS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtcGFzc3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLXBhc3N3ZC8tL3BhcnNlLXBhc3N3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJWdVRTa1ZwazdJOU4vUUtPQzF2Rm1hbzVjWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXNjYWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bhc2NhbGNhc2UvLS9wYXNjYWxjYXNlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJQbFhvQUd5bS9pRjRUUzJ5SzlGZGVSZnhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtZXhpc3RzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EK3RzWlBEOFVZMmFkVTNWNzdZc2NDSjJIMHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZW5kLy0vcGVuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVsZnJWUXBuZy9rUlV6SDg5R1k5WEk0QWVsQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwZXJmb3JtYW5jZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVyZm9ybWFuY2Utbm93Ly0vcGVyZm9ybWFuY2Utbm93LTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXduMDRPWDZrVDdCeHBNSHJqWkxTemQ4bm5zPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJwaGFudG9tIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waGFudG9tLy0vcGhhbnRvbS00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVR6ODJYaHRQbXdDazFGRlBtZWN5N3lSR1pHMmJ0cHpZMktJOWZjb1BUN3pUOWRldDBDY015ZkJGUHAxUzhEcXpzblFubThaWUVmZHk1Mjhtd1Z0a3NBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTYiLAorICAgICAgICAic3BsaXQiOiAiXjEuMC4xIiwKKyAgICAgICAgIndpbnN0b24iOiAiXjIuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBoYW50b21qcy1wcmVidWlsdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbWpzLXByZWJ1aWx0Ly0vcGhhbnRvbWpzLXByZWJ1aWx0LTIuMS4xNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTc5SVNwS09XYlRaSGFFNm91bmlGU2I0cTcrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2UiOiAiXjQuMC4zIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNSIsCisgICAgICAgICJmcy1leHRyYSI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzaGEiOiAiXjIuMi4wIiwKKyAgICAgICAgImtldyI6ICJeMC43LjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjEuMS44IiwKKyAgICAgICAgInJlcXVlc3QiOiAiXjIuODEuMCIsCisgICAgICAgICJyZXF1ZXN0LXByb2dyZXNzIjogIl4yLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjEwIgorICAgICAgfQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMvLS9wb3NpeC1jaGFyYWN0ZXItY2xhc3Nlcy0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFlckEvanRhOXhvcWJBTCtxN2pCL3ZmZ0Rxcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dHktYnl0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHR5LWJ5dGVzLy0vcHJldHR5LWJ5dGVzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2lMb0lRWUpyVFZVTDR5TlhTRlpyL0IxSElRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0xLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRtREhqMkZoemRtdzVXekQ0S2hkNFh4NlY3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHJveHktZnJvbS1lbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJveHktZnJvbS1lbnYvLS9wcm94eS1mcm9tLWVudi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU04VURtUGNPcCt1VzBoOTdnWFl3cFZlUngrND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BzbC8tL3BzbC0xLjEuMjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFlVW1RMG9MTjAyZmxWSFhXaDlzU0pGN21jZEZxMHBwaWQvSmtFcnVmYzNoR0lWL0FNYThGbzlWZ0RvL2NUMmpGZE9Xb0Z2SHA5MHFxQkg1NFcrZ2pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdOV21PeWNZZ0FyWTRlc1BwU2FjaE4xQmhGND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1cHBldGVlci8tL3B1cHBldGVlci0xLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZisxRHhLSFBxY2U2Q1hVQnoyZVZPMldjQVRlVmVRU09QRzlHWWFHT2JFWkRDaUNFVXdHK2dvZ2pNc3J2bjdoZTJ3SFRxTlZiNXA2UlVyd21yOFhGQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjYiLAorICAgICAgICAiaHR0cHMtcHJveHktYWdlbnQiOiAiXjIuMi4xIiwKKyAgICAgICAgIm1pbWUiOiAiXjIuMC4zIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJwcm94eS1mcm9tLWVudiI6ICJeMS4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjYuMSIsCisgICAgICAgICJ3cyI6ICJeNS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJxcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcy8tL3FzLTYuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ONVpBWDQvTHhKbUYrN3dONzRwVUQ2cUFoOS93bnZkUWNqcTlUWmpldnZYelNVbzdiZm13OTFzYXFNanpHUzJ4cTkxL29kTjJkVy9XT2w3cVFITkRHQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInJlYWQtcGtnIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLy0vcmVhZC1wa2ctMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZitxWHMwcHl6SEFSMHZLZlhWcmE3S2VQeWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibG9hZC1qc29uLWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy4yIiwKKyAgICAgICAgInBhdGgtdHlwZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1wa2ctdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1wa2ctdXAvLS9yZWFkLXBrZy11cC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5XUEJNbmJBWlpHTlYvQUNwWDlBb2JaRCt3ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmaW5kLXVwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkLXBrZyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0xLjEuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mUFRGVHZaSTQ0RXdoTVkyM1NCNTRXYkFnZGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICIwLjAuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMC4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWhpcy9LbW85QmQrQ2F2OFlEaVRtd1hSN3Q4PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhd3Mtc2lnbjIiOiAifjAuNy4wIiwKKyAgICAgICAgImF3czQiOiAiXjEuOC4wIiwKKyAgICAgICAgImNhc2VsZXNzIjogIn4wLjEyLjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIn4xLjAuNiIsCisgICAgICAgICJleHRlbmQiOiAifjMuMC4yIiwKKyAgICAgICAgImZvcmV2ZXItYWdlbnQiOiAifjAuNi4xIiwKKyAgICAgICAgImZvcm0tZGF0YSI6ICJ+Mi4zLjIiLAorICAgICAgICAiaGFyLXZhbGlkYXRvciI6ICJ+NS4xLjAiLAorICAgICAgICAiaHR0cC1zaWduYXR1cmUiOiAifjEuMi4wIiwKKyAgICAgICAgImlzLXR5cGVkYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgImlzc3RyZWFtIjogIn4wLjEuMiIsCisgICAgICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogIn41LjAuMSIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIn4yLjEuMTkiLAorICAgICAgICAib2F1dGgtc2lnbiI6ICJ+MC45LjAiLAorICAgICAgICAicGVyZm9ybWFuY2Utbm93IjogIl4yLjEuMCIsCisgICAgICAgICJxcyI6ICJ+Ni41LjIiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIiwKKyAgICAgICAgInRvdWdoLWNvb2tpZSI6ICJ+Mi40LjMiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ1dWlkIjogIl4zLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0LXByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QtcHJvZ3Jlc3MvLS9yZXF1ZXN0LXByb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWFRhN1Y1WWNaenFsdDRqYnlCUWYzeU8wVGdnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdHRsZWl0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLXJlZ2V4Ly0vc2FmZS1yZWdleC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFLTm1uenNIZlI2VVBVUmluaFY5MUlBanZ5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXQiOiAifjAuMS4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWh3MHl4azlHVC9IcjV5SkVZbkhOS1lYa0lBOG1WSmdkOWRpdFlaQ2UxNlpjemNhRUxZWWNmdmFYZXNOQUNrMk84TzBuVGlQUWNRaEdVUWo4Skx6ZWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuMyIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGVsbGpzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWxsanMvLS9zaGVsbGpzLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlpibU1IcDRGVVQxa2ZOOXBoZzJEekhiVjdFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic25hcGRyYWdvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLy0vc25hcGRyYWdvbi0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRnR5T25XTi93Q0hUVlhPTXd2U3YyNmQra281dldsSURENnpvVUo3TFc4dmgrWkJDOFFkbGp2ZVJQK2NyTnJ0Qndpb0VVV3kvNGRNdGJCakE0aW9ObGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2UiOiAiXjAuMTEuMSIsCisgICAgICAgICJkZWJ1ZyI6ICJeMi4yLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuNiIsCisgICAgICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiAiXjAuNS4wIiwKKyAgICAgICAgInVzZSI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLW5vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi1ub2RlLy0vc25hcGRyYWdvbi1ub2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PMjdsNHhhTVl0L1JTUTVUUjN2cFdDQUI1S2IvY3pJY3FVRk9NL0M0ZlljTG5iWlVjMVBralRBTWpvZjJwQldhU1R3T1VkNnFVSGNGR1ZHajdhSXdudz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic25hcGRyYWdvbi11dGlsIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tdXRpbC8tL3NuYXBkcmFnb24tdXRpbC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWJLa01kUUtzalg0QkFMNGJSWVRqMjFlZE9mOGNON1hIZFlVSkVlK1puOTloVkVZY012S1BjdDFJcU5lNytBWlBpcm44QkNET1FCSFFaa25xbUtsWlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjUuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlnT2RMUkFoMGkwZW9VeUEyT3BHaTZMdlA4dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC1yZXNvbHZlLy0vc291cmNlLW1hcC1yZXNvbHZlLTAuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NanFzdk53eXoxczBrODFHb3ovOXZSQmU5U1pkQjA5QmR3Ky96WXlPKzNDdVBrNmZvdVRheHNjSGtndEU4akt2ZjAxa1ZmbDhyaUh6RVJRL2tlZmFTQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXRvYiI6ICJeMi4xLjEiLAorICAgICAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiAiXjAuMi4wIiwKKyAgICAgICAgInJlc29sdmUtdXJsIjogIl4wLjIuMSIsCisgICAgICAgICJzb3VyY2UtbWFwLXVybCI6ICJeMC40LjAiLAorICAgICAgICAidXJpeCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcC11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC11cmwvLS9zb3VyY2UtbWFwLXVybC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBwTmRmZDF6WXh1WFpabFcxVkVvNkh0UWhLTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWNvcnJlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1jb3JyZWN0Ly0vc3BkeC1jb3JyZWN0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xOWhlZHR6eVhIcjVTMEExdkVQb0svN2w4TnBma0ZZVHE2aUNZK1BubzJaYmRaUjZXZXhaRnRxZVZHa0d4VzNURUpNTjkxNFo1NUVuQUdNbWVubElRUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWV4Y2VwdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leGNlcHRpb25zLy0vc3BkeC1leGNlcHRpb25zLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yWFFBQ2ZFbEtpOVNsVmIxQ1lhZEtEWHZvYWpQZ0JWUG4vZ09RTHJUdkhkRWxhVmhyN1pFYnFKYVJuSkxWTmVhSTRjTUVBZ1ZDZUJNS0Y2TVdSRENSQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS8tL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWWc2RDNYcFJENGtrT21UcGRnYlVpRUpGS2doSkgwM2ZpQzFPUGxsNWgvMHNPNm5laDJqcVJEVkhPUTRvL0xNZWEwdGdDa2JNZ2VhNWlwL2UrTWtXeWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhjZXB0aW9ucyI6ICJeMi4xLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1saWNlbnNlLWlkcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWxpY2Vuc2UtaWRzLy0vc3BkeC1saWNlbnNlLWlkcy0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVGZPZlBjWUdCQjVzRHVQbjNkZUJ5eFBobWZlZ0FocERZS1NPWFpRTjgxT3lycmlmOFpDb2RPTHpLM0Flc0VMbkN4MDNraWtoeUR3aDBwZnZ2UXZGOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwbGl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Ly0vc3BsaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UeU9vUGJyaXZ0WG53bkl4WlJGWVJyUE50RUZLbHBCMmZ2alNuQ1FVaUFBNnFBWnpxd25hNWVudks0dWs2T0llUDE3Q3NkRjNyU0JHWVZCc1UwVGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICIyIgorICAgICAgfQorICAgIH0sCisgICAgInNwbGl0LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC1zdHJpbmcvLS9zcGxpdC1zdHJpbmctMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU56TlZoSkRZcHdjZVZWaWk4L0h1NkRLZkQyRytOclFIbFMvVi9xZ3Y3NjNFWXVkVndFY01RTnhkMmxoKzBWclVCeVhOL29Ka2w1Z3JPaFlXdlFVWWl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5yNTRNZ3IrV0FIMnpxUHVlTGJscXJsQTZndz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE1LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1TZGdOVWFpZGsrZFJVNU1oWXROOXplYmR6RjJpRzBjTlBXeThIRytXOHkrZlQxSm5Ta2gwZnp6cGpPYTBMN1A4aTFSc2N6Mzh0MGg0Z1BjS3o0M3hBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNuMSI6ICJ+MC4yLjMiLAorICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImJjcnlwdC1wYmtkZiI6ICJeMS4wLjAiLAorICAgICAgICAiZGFzaGRhc2giOiAiXjEuMTIuMCIsCisgICAgICAgICJlY2MtanNibiI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0cGFzcyI6ICJeMC4xLjEiLAorICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjAuMiIsCisgICAgICAgICJ0d2VldG5hY2wiOiAifjAuMTQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdGFjay10cmFjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhY2stdHJhY2UvLS9zdGFjay10cmFjZS0wLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WSHh3czBmbzB5dE9FSTZob3FGWjVmM2VHY0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInN0YXRpYy1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdGljLWV4dGVuZC8tL3N0YXRpYy1leHRlbmQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZSUNjT2N2L1ZUTnlKdjFlQzFJUE5COGZ0Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJvYmplY3QtY29weSI6ICJeMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTAuMTAuMzEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3luYy1leGVjIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N5bmMtZXhlYy8tL3N5bmMtZXhlYy0wLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNYMGl6RlB3emgzdlZaUTJMenFKb3V1NUVRVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIKKyAgICB9LAorICAgICJ0aHJvdHRsZWl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm90dGxlaXQvLS90aHJvdHRsZWl0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbm5oWU50cjBaME1VV2xtRXRpYU5nb1Vvckd3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInRvLW9iamVjdC1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLW9iamVjdC1wYXRoLy0vdG8tb2JqZWN0LXBhdGgtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1LWFdJdDdEbjRLd0k0RTVuTDRYQjlKbWVGNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC8tL3RvLXJlZ2V4LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GV3RsZU5BdFovS2kycXRxZWoyQ1hUT2F5T0g5YkhEUUYrUTQ4VnBXeURYamJZeEE0WXo4aURCMzF6WE9CVWxPSEhLaWREYnFHVnJUVXZRTVBtQkdCdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMiIsCisgICAgICAgICJzYWZlLXJlZ2V4IjogIl4xLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC1yYW5nZS8tL3RvLXJlZ2V4LXJhbmdlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZklEQmU1Myt2bG1lSnpaK0RVM1ZXUUZCMnpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHdlZXRuYWNsIjogeworICAgICAgInZlcnNpb24iOiAiMC4xNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90d2VldG5hY2wvLS90d2VldG5hY2wtMC4xNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV3VhQmQvR1MxRVZpYWRFSXI2ay8rSFEvVDJRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGVkYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZWRhcnJheS8tL3R5cGVkYXJyYXktMC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1obnJIVGpoa0dIc2RQVWZabHFlT3hjaURCM2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTIuNi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmVvdnN3V2NrNVJwTHhYKzJId3JOc0ZybXQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4wLjIuNiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjUuMSIsCisgICAgICAgICJ1Z2xpZnktdG8tYnJvd3NlcmlmeSI6ICJ+MS4wLjAiLAorICAgICAgICAieWFyZ3MiOiAifjMuMTAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjEwIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTAuMi4xMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10cnZnc0dkTG5YR1hDTW80M293amZMVW13OUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LXRvLWJyb3dzZXJpZnkvLS91Z2xpZnktdG8tYnJvd3NlcmlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJna2sxcjJtdGEvalNlT2FiV01vVUtENGdyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmMtcGF0aC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmMtcGF0aC1yZWdleC8tL3VuYy1wYXRoLXJlZ2V4LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXozVDE3RFh4ZTJHKzZ4ckN1Zll4cWFkVVBvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IgorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZS5zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS5zdHJpbmcvLS91bmRlcnNjb3JlLnN0cmluZy0zLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZytkcG1nbitYQm5lTG1YWG8rc0dsVzV4UUV0NEVya1MzbWdlTjJHRmJyZW1ZZU1CU0pLcjlXZjJLSnBsUVZhaVBZL2Y3Rk42YXRvc1dZTm05b3ZyWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAiXjEuMC4zIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmljb2RlLTUuMi4wIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaWNvZGUtNS4yLjAvLS91bmljb2RlLTUuMi4wLTAuNy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LVkdMVzFCcmkzMHgwMHl2NEhOTThrQnhvcUZYcjBTYm81NTczNW52cmxzeDRQWUJab2wzVXRvV2dPNDkyZlN3bXNldHpQRVp6eTczcmJVOE9HWEpjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLXBhdGgvLS91cmktcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwwZndHRFdKTThNZDRQelAyQzBUam1jbUxqST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cml4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaXgvLS91cml4LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnBOL2VtTGlIK3dmMFkxSnMxd3BOUVo2YkhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91c2UvLS91c2UtMy4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN3RVNWWGxPM3VybDlZV2xGVy9UQTljc2hDRWh0dTdJS0ovcDVzb0ovZ0dwajd2YnZGckFZL2VJaW9RNkR3MjNLalpoWWdpSW84SE9zMW5RMnZyL29RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV1aWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXVpZC8tL3V1aWQtMy4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlYSm1lTmF3M0RubktBT0tKRTUxc0wvWmFZZldKUmwxcEs5ZHIxOVlGQ3UwT2JTMjMxQUIxL0xicVRLUkFRNWt3OEE5MHJBNmZyNHJpT1VwVFp2UVpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidjhmbGFncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92OGZsYWdzLy0vdjhmbGFncy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnNnU0tvRncxVXBVUGQzY0ZkRjdRR25ySDZ0RGVCZ1cxRjN2OWd5OGdMWTBtbGJpQlhxOHNveThhUXBZNnhlZUNqSDVLK0p2QzYyQWNwN2d0bDd3V0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZS8tL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwS20yVWkveE43L0hRS0N0cFp4b1JXQmhaOVowa3F0eWdHOFhDZ05ROFpsRG54dVFtV2hqNTY2ajhmTjRDdTMvSm1iaHNEbzdmY0FKcTRzOWgyN0V3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWNvcnJlY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidmVycm9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92ZXJyb3IvLS92ZXJyb3ItMS4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT2hCY29YQlRyMVhXNG5EQitDaUdndUdOcEFBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2luZG93LXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luZG93LXNpemUvLS93aW5kb3ctc2l6ZS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZEak5McWs3SUM3Nk9obitpSWV1NThsUG5KMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aW5zdG9uIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbnN0b24vLS93aW5zdG9uLTIuNC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OQm8yUGVwbjRoSzRWMDFVZmNXY0RsbWlWVHM3VlRCMWg3YmduQjByZ1AxNDZiWWhNeFgweXBDejNsQk9mTnhDTzRadWVrN3llVCt5L3pNMU9mTXc0UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4xLjAuMCIsCisgICAgICAgICJjb2xvcnMiOiAiMS4wLngiLAorICAgICAgICAiY3ljbGUiOiAiMS4wLngiLAorICAgICAgICAiZXllcyI6ICIwLjEueCIsCisgICAgICAgICJpc3N0cmVhbSI6ICIwLjEueCIsCisgICAgICAgICJzdGFjay10cmFjZSI6ICIwLjAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1B3RXlqb1RlRXJlbmhaQnI1aFhqUHZXUjZrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY29sb3JzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJEUDBUWUNXZ1AzcllPMG1EeHNNSmk2Q3BBcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10NVpwdTBMc3RBbjRQVmc4clZMS0YrcWhaRDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iCisgICAgfSwKKyAgICAieWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWFyZ3MvLS95YXJncy0zLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05KzU3MkZmZGZCMHRPTURuVHZ2V2dkRkRIOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4xLjAuMiIsCisgICAgICAgICJjbGl1aSI6ICJeMi4xLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4wLjAiLAorICAgICAgICAid2luZG93LXNpemUiOiAiMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0xLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tN1V3VFM0TFZtbUxMSFdMQ0tQcXFkcWxpams9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAieWF1emwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWF1emwvLS95YXV6bC0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxTajBRdHF4c2loT1dMUTNtN0dVNGk0TVFBVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmZC1zbGljZXIiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UuanNvbiBiL2xpYi9qcy9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5Y2RjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLmpzb24KQEAgLTAsMCArMSwxOSBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImdydW50IjogIl4xLjAuMiIsCisgICAgImdydW50LWNsaSI6ICJeMS4yLjAiLAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJeMS4wLjEiLAorICAgICJncnVudC1jb250cmliLWpzaGludCI6ICJeMS4wLjAiLAorICAgICJncnVudC1jb250cmliLXF1bml0IjogIl4zLjAuMSIsCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIl4xLjAuMSIsCisgICAgImdydW50LWpzZG9jIjogIl4yLjIuMSIsCisgICAgImdydW50LXNoZWxsLXNwYXduIjogIl4wLjMuMTAiLAorICAgICJqc2xpbnQiOiAiXjAuMTIuMCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAianNkb2MiOiAiXjMuNS41IiwKKyAgICAibm9wdCI6ICJeNC4wLjEiCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzIGIvbGliL2pzL3NyYy90aHJpZnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmODEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCkBAIC0wLDAgKzEsMTU2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKmpzaGludCBldmlsOnRydWUqLworCisvKioKKyAqIFRoZSBUaHJpZnQgbmFtZXNwYWNlIGhvdXNlcyB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnkKKyAqIGVsZW1lbnRzIHByb3ZpZGluZyBKYXZhU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMKKyAqIHN5c3RlbS4gRW5kIHVzZXJzIHdpbGwgdHlwaWNhbGx5IG9ubHkgZGlyZWN0bHkgbWFrZSB1c2Ugb2YgdGhlCisgKiBUcmFuc3BvcnQgKFRYSFJUcmFuc3BvcnQvVFdlYlNvY2tldFRyYW5zcG9ydCkgYW5kIFByb3RvY29sCisgKiAoVEpTT05QUm90b2NvbC9UQmluYXJ5UHJvdG9jb2wpIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBPYmplY3QgbWV0aG9kcyBiZWdpbm5pbmcgd2l0aCBhIF9fIChlLmcuIF9fb25PcGVuKCkpIGFyZSBpbnRlcm5hbAorICogYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIG9iamVjdCdzIG93biBtZXRob2RzLgorICoKKyAqIFRoaXMgbGlicmFyeSBjcmVhdGVzIG9uZSBnbG9iYWwgb2JqZWN0OiBUaHJpZnQKKyAqIENvZGUgaW4gdGhpcyBsaWJyYXJ5IG11c3QgbmV2ZXIgY3JlYXRlIGFkZGl0aW9uYWwgZ2xvYmFsIGlkZW50aWZpZXJzLAorICogYWxsIGZlYXR1cmVzIG11c3QgYmUgc2NvcGVkIHdpdGhpbiB0aGUgVGhyaWZ0IG5hbWVzcGFjZS4KKyAqIEBuYW1lc3BhY2UKKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0Ojg1ODUnKTsKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICogICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTdmNDbGllbnQocHJvdG9jb2wpOworICogICAgIHZhciByZXN1bHQgPSBjbGllbnQuTXlNZXRob2QoKTsKKyAqLwordmFyIFRocmlmdCA9IHsKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5IHZlcnNpb24uCisgICAgICogQHJlYWRvbmx5CisgICAgICogQGNvbnN0IHtzdHJpbmd9IFZlcnNpb24KKyAgICAgKiBAbWVtYmVyb2YgVGhyaWZ0CisgICAgICovCisgICAgVmVyc2lvbjogJzEuMC4wJywKKworICAgIC8qKgorICAgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUT1AgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBWT0lEICAgLSBObyB2YWx1ZSAob25seSBsZWdhbCBmb3IgcmV0dXJuIHR5cGVzKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJPT0wgICAtIFRydWUvRmFsc2UgaW50ZWdlci4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJZVEUgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTA4ICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBET1VCTEUgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMTYgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMzIgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJNjQgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJJTkcgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjcgICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY3IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUUlVDVCAtIEEgbXVsdGlmaWVsZCB0eXBlLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgTUFQICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNFVCAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIExJU1QgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGOCAgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjggZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBUeXBlOiB7CisgICAgICAgIFNUT1A6IDAsCisgICAgICAgIFZPSUQ6IDEsCisgICAgICAgIEJPT0w6IDIsCisgICAgICAgIEJZVEU6IDMsCisgICAgICAgIEkwODogMywKKyAgICAgICAgRE9VQkxFOiA0LAorICAgICAgICBJMTY6IDYsCisgICAgICAgIEkzMjogOCwKKyAgICAgICAgSTY0OiAxMCwKKyAgICAgICAgU1RSSU5HOiAxMSwKKyAgICAgICAgVVRGNzogMTEsCisgICAgICAgIFNUUlVDVDogMTIsCisgICAgICAgIE1BUDogMTMsCisgICAgICAgIFNFVDogMTQsCisgICAgICAgIExJU1Q6IDE1LAorICAgICAgICBVVEY4OiAxNiwKKyAgICAgICAgVVRGMTY6IDE3CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFRocmlmdCBSUEMgbWVzc2FnZSB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgICAqIEByZWFkb25seQorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ0FMTCAgICAgIC0gUlBDIGNhbGwgc2VudCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBSRVBMWSAgICAgLSBSUEMgY2FsbCBub3JtYWwgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRVhDRVBUSU9OIC0gUlBDIGNhbGwgZXhjZXB0aW9uIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE9ORVdBWSAgICAtIE9uZXdheSBSUEMgY2FsbCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgd2l0aCBubyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBNZXNzYWdlVHlwZTogeworICAgICAgICBDQUxMOiAxLAorICAgICAgICBSRVBMWTogMiwKKyAgICAgICAgRVhDRVBUSU9OOiAzLAorICAgICAgICBPTkVXQVk6IDQKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvdW50IG9mIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBPYmplY3QgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBudW1iZXIgb2Ygb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBvYmplY3RMZW5ndGg6IGZ1bmN0aW9uKG9iaikgeworICAgICAgICB2YXIgbGVuZ3RoID0gMDsKKyAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVzdGFibGlzaCBwcm90b3R5cGUgaW5oZXJpdGFuY2UuCisgICAgICogQHNlZSB7QGxpbmsgaHR0cDovL2phdmFzY3JpcHQuY3JvY2tmb3JkLmNvbS9wcm90b3R5cGFsLmh0bWx8UHJvdG90eXBhbCBJbmhlcml0YW5jZX0KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgZGVyaXZlZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBiYXNlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUeXBlIG5hbWUgdG8gc2V0IGFzIG5hbWUgcHJvcGVydHkgaW4gZGVyaXZlZCBwcm90b3R5cGUuCisgICAgICovCisgICAgaW5oZXJpdHM6IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yLCBuYW1lKSB7CisgICAgICBmdW5jdGlvbiBGKCkge30KKyAgICAgIEYucHJvdG90eXBlID0gc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgRigpOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUgPSBuYW1lIHx8ICcnOworICAgIH0KK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQGF1Z21lbnRzIEVycm9yCisgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBURXhjZXB0aW9uIG1lc3NhZ2UgKGRpc3RpbmN0IGZyb20gdGhlIEVycm9yIG1lc3NhZ2UpLgorICogQGNsYXNzZGVzYyBURXhjZXB0aW9uIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMgdHlwZXMuCisgKi8KK1RocmlmdC5URXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSkgeworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5URXhjZXB0aW9uLCBFcnJvciwgJ1RFeGNlcHRpb24nKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBleGNlcHRpb24gbWVzc2FnZQorICovCitUaHJpZnQuVEV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7Cit9OworCisvKioKKyAqIFRocmlmdCBBcHBsaWNhdGlvbiBFeGNlcHRpb24gdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOICAgICAgICAgICAgICAgICAtIFVua25vd24vdW5kZWZpbmVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOX01FVEhPRCAgICAgICAgICAtIENsaWVudCBhdHRlbXB0ZWQgdG8gY2FsbCBhIG1ldGhvZCB1bmtub3duIHRvIHRoZSBzZXJ2ZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfTUVTU0FHRV9UWVBFICAgIC0gQ2xpZW50IHBhc3NlZCBhbiB1bmtub3duL3Vuc3VwcG9ydGVkIE1lc3NhZ2VUeXBlLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICAtIFVudXNlZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgLSBVbnVzZWQgaW4gVGhyaWZ0IFJQQywgdXNlZCB0byBmbGFnIHByb3ByaWV0YXJ5IHNlcXVlbmNlIG51bWJlciBlcnJvcnMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIE1JU1NJTkdfUkVTVUxUICAgICAgICAgIC0gUmFpc2VkIGJ5IGEgc2VydmVyIHByb2Nlc3NvciBpZiBhIGhhbmRsZXIgZmFpbHMgdG8gc3VwcGx5IHRoZSByZXF1aXJlZCByZXR1cm4gcmVzdWx0LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICAtIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIFBST1RPQ09MX0VSUk9SICAgICAgICAgIC0gVGhlIHByb3RvY29sIGxheWVyIGZhaWxlZCB0byBzZXJpYWxpemUgb3IgZGVzZXJpYWxpemUgZGF0YS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgLSBVbnVzZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfUFJPVE9DT0wgICAgICAgIC0gVGhlIHByb3RvY29sIChvciB2ZXJzaW9uKSBpcyBub3Qgc3VwcG9ydGVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtIFVudXNlZC4KKyAqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBVTktOT1dOX01FVEhPRDogMSwKKyAgICBJTlZBTElEX01FU1NBR0VfVFlQRTogMiwKKyAgICBXUk9OR19NRVRIT0RfTkFNRTogMywKKyAgICBCQURfU0VRVUVOQ0VfSUQ6IDQsCisgICAgTUlTU0lOR19SRVNVTFQ6IDUsCisgICAgSU5URVJOQUxfRVJST1I6IDYsCisgICAgUFJPVE9DT0xfRVJST1I6IDcsCisgICAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgICAgSU5WQUxJRF9QUk9UT0NPTDogOSwKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RhbmNlLgorICogQGNvbnN0cnVjdG9yCisgKiBAYXVnbWVudHMgVGhyaWZ0LlRFeGNlcHRpb24KKyAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IFtjb2RlXSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGNvZGUuCisgKiBAY2xhc3NkZXNjIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgdG8gcHJvcGFnYXRlIGV4Y2VwdGlvbnMgZnJvbSBhbiBSUEMgc2VydmVyIGJhY2sgdG8gYSBjYWxsaW5nIGNsaWVudC4KKyovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSkgeworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICdudW1iZXInID8gY29kZSA6IDA7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisKKy8qKgorICogUmVhZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBwcm90b2NvbCB0byByZWFkIGZyb20uCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHZhciByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmlkID0gcmV0LmZpZDsKKworICAgICAgICBzd2l0Y2ggKGZpZCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0LnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGUgPSByZXQudmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7Cit9OworCisvKioKKyAqIFdpdGUgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gdG8gdGhlIHN1cHBsaWVkIHByb3RvY29sLgorICogQHBhcmFtIHtvYmplY3R9IG91dHB1dCAtIFRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gd3JpdGUgdG8uCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7CisgICAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKHRoaXMubWVzc2FnZSkgeworICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0LlR5cGUuU1RSSU5HLCAxKTsKKyAgICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKHRoaXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5jb2RlKSB7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQuVHlwZS5JMzIsIDIpOworICAgICAgICBvdXRwdXQud3JpdGVJMzIodGhpcy5jb2RlKTsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNvZGUgc2V0IG9uIHRoZSBleGNlcHRpb24uCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZX0gZXhjZXB0aW9uIGNvZGUKKyAqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvZGU7Cit9OworCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZSA9IHsKKyAgICBVTktOT1dOOiAwLAorICAgIElOVkFMSURfREFUQTogMSwKKyAgICBORUdBVElWRV9TSVpFOiAyLAorICAgIFNJWkVfTElNSVQ6IDMsCisgICAgQkFEX1ZFUlNJT046IDQsCisgICAgTk9UX0lNUExFTUVOVEVEOiA1LAorICAgIERFUFRIX0xJTUlUOiA2Cit9OworCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uID0gZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKKyAgICBFcnJvci5jYWxsKHRoaXMpOworICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVFByb3RvY29sRXhjZXB0aW9uJyk7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBYSFIgdHJhbnNwb3J0LgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIFhIUiBvcGVyYXRpb25zIG9uCisgKiB5b3VyIG93bi4gVGhpcyB0eXBlIGNhbiBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBUcmFuc3BvcnQgYWxpYXMKKyAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFhIUlRyYW5zcG9ydCBvYmplY3QKKyAqIHVzZXMgSHR0cFtzXS9YSFIuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IHRoZSBodHRwW3NdIHRyYW5zcG9ydAorICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKi8KK1RocmlmdC5UcmFuc3BvcnQgPSBUaHJpZnQuVFhIUlRyYW5zcG9ydCA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIHRoaXMud3BvcyA9IDA7CisgICAgdGhpcy5ycG9zID0gMDsKKyAgICB0aGlzLnVzZUNPUlMgPSAob3B0aW9ucyAmJiBvcHRpb25zLnVzZUNPUlMpOworICAgIHRoaXMuY3VzdG9tSGVhZGVycyA9IG9wdGlvbnMgPyAob3B0aW9ucy5jdXN0b21IZWFkZXJzID8gb3B0aW9ucy5jdXN0b21IZWFkZXJzIDoge30pOiB7fTsKKyAgICB0aGlzLnNlbmRfYnVmID0gJyc7CisgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOworfTsKKworVGhyaWZ0LlRYSFJUcmFuc3BvcnQucHJvdG90eXBlID0geworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBicm93c2VyIFhIUiBpbnRlcmZhY2Ugb2JqZWN0CisgICAgICovCisgICAgZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICB0cnkgeyByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IH0gY2F0Y2ggKGUxKSB7IH0KKyAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoIChlMikgeyB9CisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaCAoZTMpIHsgfQorCisgICAgICAgIHRocm93ICJZb3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IFhIUi4iOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwKKyAgICAgKiBhbmQgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aAorICAgICAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICAgICAqIHRoZSBVUkwgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyBvciB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIHtzdHJpbmd9IElmIFhIUiBmYWlscy4KKyAgICAgKi8KKyAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgaWYgKChhc3luYyAmJiAhY2FsbGJhY2spIHx8IHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB4cmVxID0gdGhpcy5nZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOworCisgICAgICAgIGlmICh4cmVxLm92ZXJyaWRlTWltZVR5cGUpIHsKKyAgICAgICAgICAgIHhyZXEub3ZlcnJpZGVNaW1lVHlwZSgnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICAvL0lnbm9yZSBYSFIgY2FsbGJhY2tzIHVudGlsIHRoZSBkYXRhIGFycml2ZXMsIHRoZW4gY2FsbCB0aGUKKyAgICAgICAgICAgIC8vICBjbGllbnQncyBjYWxsYmFjaworICAgICAgICAgICAgeHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPQorICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIodGhpcy5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0oKSk7CisKKyAgICAgICAgICAgIC8vIGRldGVjdCBuZXQ6OkVSUl9DT05ORUNUSU9OX1JFRlVTRUQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgeHJlcS5vbmVycm9yID0KKyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KCkpOworCisgICAgICAgIH0KKworICAgICAgICB4cmVxLm9wZW4oJ1BPU1QnLCB0aGlzLnVybCwgISFhc3luYyk7CisKKyAgICAgICAgLy8gYWRkIGN1c3RvbSBoZWFkZXJzCisgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY3VzdG9tSGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7CisgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIocHJvcCwgc2VsZi5jdXN0b21IZWFkZXJzW3Byb3BdKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHhyZXEuc2V0UmVxdWVzdEhlYWRlcikgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICB9CisKKyAgICAgICAgeHJlcS5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4cmVxLnJlYWR5U3RhdGUgIT0gNCkgeworICAgICAgICAgICAgdGhyb3cgJ2VuY291bnRlcmVkIGFuIHVua25vd24gYWpheCByZWFkeSBzdGF0ZTogJyArIHhyZXEucmVhZHlTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4cmVxLnN0YXR1cyAhPSAyMDApIHsKKyAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhIHVua25vd24gcmVxdWVzdCBzdGF0dXM6ICcgKyB4cmVxLnN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVjdl9idWYgPSB4cmVxLnJlc3BvbnNlVGV4dDsKKyAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy5ycG9zID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGpRdWVyeSBYSFIgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGEgVGhyaWZ0IHNlcnZlciBjYWxsLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjbGllbnQgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xpZW50IG9iamVjdCBnZW5lcmF0ZWQgYnkgdGhlIElETCBjb21waWxlci4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdERhdGEgLSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBvcmlnaW5hbCBjYWxsIGFyZ3VtZW50cyB3aXRoIHRoZSBzdWNjZXNzIGNhbGwgYmFjayBhdCB0aGUgZW5kLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlY3ZfbWV0aG9kIC0gVGhlIFRocmlmdCBTZXJ2aWNlIENsaWVudCByZWNlaXZlIG1ldGhvZCBmb3IgdGhlIGNhbGwuCisgICAgICogQHJldHVybnMge29iamVjdH0gQSBuZXcgalF1ZXJ5IFhIUiBvYmplY3QuCisgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiB0aGUgalF1ZXJ5IHZlcnNpb24gaXMgcHJpb3IgdG8gMS41IG9yIGlmIGpRdWVyeSBpcyBub3QgZm91bmQuCisgICAgICovCisgICAganFSZXF1ZXN0OiBmdW5jdGlvbihjbGllbnQsIHBvc3REYXRhLCBhcmdzLCByZWN2X21ldGhvZCkgeworICAgICAgICBpZiAodHlwZW9mIGpRdWVyeSA9PT0gJ3VuZGVmaW5lZCcgfHwKKyAgICAgICAgICAgIHR5cGVvZiBqUXVlcnkuRGVmZXJyZWQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICB0aHJvdyAnVGhyaWZ0LmpzIHJlcXVpcmVzIGpRdWVyeSAxLjUrIHRvIHVzZSBhc3luY2hyb25vdXMgcmVxdWVzdHMnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRocmlmdFRyYW5zcG9ydCA9IHRoaXM7CisKKyAgICAgICAgdmFyIGpxWEhSID0galF1ZXJ5LmFqYXgoeworICAgICAgICAgICAgdXJsOiB0aGlzLnVybCwKKyAgICAgICAgICAgIGRhdGE6IHBvc3REYXRhLAorICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgICAgICAgY2FjaGU6IGZhbHNlLAorICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uOyBjaGFyc2V0PXV0Zi04JywKKyAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCB0aHJpZnQnLAorICAgICAgICAgICAgY29udmVydGVyczogeworICAgICAgICAgICAgICAgICd0ZXh0IHRocmlmdCcgOiBmdW5jdGlvbihyZXNwb25zZURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyaWZ0VHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzcG9uc2VEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVjdl9tZXRob2QuY2FsbChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGNvbnRleHQ6IGNsaWVudCwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5tYWtlQXJyYXkoYXJncykucG9wKCkKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIGpxWEhSOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gcHJvdmlkZSB0aGUgcHJvdG9jb2wgd2hlbiBkZXNlcmlhbGl6aW5nLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHN1cHBseSB0aGUgcHJvdG9jb2wuCisgICAgICovCisgICAgc2V0UmVjdkJ1ZmZlcjogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRoaXMucmVjdl9idWYgPSBidWY7CisgICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMucnBvcyA9IDA7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgVHJ1ZS4KKyAgICAgKi8KKyAgICBpc09wZW46IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICAgICAqLworICAgIG9wZW46IGZ1bmN0aW9uKCkge30sCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICAgICAqLworICAgIGNsb3NlOiBmdW5jdGlvbigpIHt9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgICAgICogYnVmZmVyLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWQ6IGZ1bmN0aW9uKGxlbikgeworICAgICAgICB2YXIgYXZhaWwgPSB0aGlzLndwb3MgLSB0aGlzLnJwb3M7CisKKyAgICAgICAgaWYgKGF2YWlsID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJyc7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2l2ZSA9IGxlbjsKKworICAgICAgICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICAgICAgICAgIGdpdmUgPSBhdmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICAgICAgICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAgICAgICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICAgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWRBbGw6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWN2X2J1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICovCisgICAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgICAgICovCisgICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOworICAgIH0KKworfTsKKworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKK1RocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKKyAgICBfX3Jlc2V0OiBmdW5jdGlvbih1cmwpIHsKKyAgICAgIHRoaXMudXJsID0gdXJsOyAgICAgICAgICAgICAvL1doZXJlIHRvIGNvbm5lY3QKKyAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgICAgICB0aGlzLmNhbGxiYWNrcyA9IFtdOyAgICAgICAgLy9QZW5kaW5nIGNhbGxiYWNrcworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgICAgIC8vQnVmZmVycy9DYWxsYmFjayBwYWlycyB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgICAgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgICAgICB0aGlzLnJlY3ZfYnVmID0gJyc7ICAgICAgICAgLy9JbmJvdW5kIGRhdGEKKyAgICAgIHRoaXMucmJfd3BvcyA9IDA7ICAgICAgICAgICAvL05ldHdvcmsgd3JpdGUgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKyAgICAgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjaworICAgICAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIFRoZSBjbGllbnQgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKQorICAgICAqLworICAgIGZsdXNoOiBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgICAgIHRoaXMuc29ja2V0LnNlbmQodGhpcy5zZW5kX2J1Zik7CisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9KCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCisgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goeworICAgICAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgICAgICBjYjogY2FsbGJhY2sKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIF9fb25PcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgaWYgKHRoaXMuc2VuZF9wZW5kaW5nLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgICAgIC8vb3Blbiwgc2VuZCB0aGVtIG5vdworICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKKyAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgfSgpKSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgICAgICB9CisgICAgfSwKKworICAgIF9fb25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7CisgICAgICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworICAgIH0sCisKKyAgICBfX29uTWVzc2FnZTogZnVuY3Rpb24oZXZ0KSB7CisgICAgICBpZiAodGhpcy5jYWxsYmFja3MubGVuZ3RoKSB7CisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICAgICAgfQorICAgIH0sCisKKyAgICBfX29uRXJyb3I6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgY29uc29sZS5sb2coJ1RocmlmdCBXZWJTb2NrZXQgRXJyb3I6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gcmVjZWl2aW5nIHNlcnZlciByZXNwb25zZXMuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLnJwb3MgPSAwOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge2Jvb2xlYW59CisgICAgICovCisgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgICAgICovCisgICAgb3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAvL0lmIE9QRU4vQ09OTkVDVElORy9DTE9TSU5HIGlnbm9yZSBhZGRpdGlvbmFsIG9wZW5zCisgICAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpOworICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIGNsb3NlOiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkOiBmdW5jdGlvbihsZW4pIHsKKyAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgICAgICAgIGlmIChhdmFpbCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdpdmUgPSBsZW47CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbGVuKSB7CisgICAgICAgICAgICBnaXZlID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgICAgICAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICB9CisKK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcworICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICovCitUaHJpZnQuVEpTT05Qcm90b2NvbCA9IFRocmlmdC5Qcm90b2NvbCA9IGZ1bmN0aW9uKHRyYW5zcG9ydCkgeworICAgIHRoaXMudHN0YWNrID0gW107CisgICAgdGhpcy50cG9zID0gW107CisgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Cit9OworCisvKioKKyAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHNlZSB7QGxpbmsgVGhyaWZ0LlR5cGV9CisgKi8KK1RocmlmdC5Qcm90b2NvbC5UeXBlID0ge307CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CT09MXSA9ICcidGYiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkJZVEVdID0gJyJpOCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTE2XSA9ICciaTE2Iic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JMzJdID0gJyJpMzIiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkk2NF0gPSAnImk2NCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuRE9VQkxFXSA9ICciZGJsIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJVQ1RdID0gJyJyZWMiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNUUklOR10gPSAnInN0ciInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTUFQXSA9ICcibWFwIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5MSVNUXSA9ICcibHN0Iic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TRVRdID0gJyJzZXQiJzsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUaHJpZnQuUHJvdG9jb2wuUlR5cGUgPSB7fTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS50ZiA9IFRocmlmdC5UeXBlLkJPT0w7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTggPSBUaHJpZnQuVHlwZS5CWVRFOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmkxNiA9IFRocmlmdC5UeXBlLkkxNjsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5pMzIgPSBUaHJpZnQuVHlwZS5JMzI7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTY0ID0gVGhyaWZ0LlR5cGUuSTY0OworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmRibCA9IFRocmlmdC5UeXBlLkRPVUJMRTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5yZWMgPSBUaHJpZnQuVHlwZS5TVFJVQ1Q7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuc3RyID0gVGhyaWZ0LlR5cGUuU1RSSU5HOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLm1hcCA9IFRocmlmdC5UeXBlLk1BUDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5sc3QgPSBUaHJpZnQuVHlwZS5MSVNUOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLnNldCA9IFRocmlmdC5UeXBlLlNFVDsKKworLyoqCisgKiBUaGUgVEpTT05Qcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KKyAqIEByZWFkb25seQorICogQGNvbnN0IHtudW1iZXJ9IFZlcnNpb24KKyAqIEBtZW1iZXJvZiBUaHJpZnQuUHJvdG9jb2wKKyAqLworIFRocmlmdC5Qcm90b2NvbC5WZXJzaW9uID0gMTsKKworVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRyYW5zcG9ydH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAqLworICAgIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHtUaHJpZnQuTWVzc2FnZVR5cGV9IG1lc3NhZ2VUeXBlIC0gVGhlIHR5cGUgb2YgbWV0aG9kIGNhbGwuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUJlZ2luOiBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKKyAgICAgICAgdGhpcy50c3RhY2sgPSBbXTsKKyAgICAgICAgdGhpcy50cG9zID0gW107CisKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlZlcnNpb24sICciJyArCisgICAgICAgICAgICBuYW1lICsgJyInLCBtZXNzYWdlVHlwZSwgc2VxaWRdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKKworICAgICAgICB0aGlzLndvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgdGhpcy53b2JqLnB1c2gob2JqKTsKKworICAgICAgICB0aGlzLndidWYgPSAnWycgKyB0aGlzLndvYmouam9pbignLCcpICsgJ10nOworCisgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRlKHRoaXMud2J1Zik7CisgICAgIH0sCisKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVTdHJ1Y3RCZWdpbjogZnVuY3Rpb24obmFtZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKHt9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0RW5kOiBmdW5jdGlvbigpIHsKKworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKyAgICAgICAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOworICAgICAgICB2YXIgc3RyID0gJ3snOworICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHIgKz0gJywnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHIgKz0ga2V5ICsgJzonICsgc3RydWN0W2tleV07CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gJ30nOworICAgICAgICB0aGlzLnRzdGFja1twXSA9IHN0cjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0IGZpZWxkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZElkIC0gVGhlIGZpZWxkJ3MgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICovCisgICAgd3JpdGVGaWVsZEJlZ2luOiBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKKyAgICAgICAgICAgIGZpZWxkSWQgKyAnIicsICdmaWVsZFR5cGUnOiBUaHJpZnQuUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCisgICAgICAgIH0pOworCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICAgICAqLworICAgIHdyaXRlRmllbGRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgICAgICAgIHRoaXMudHN0YWNrW3RoaXMudHN0YWNrLmxlbmd0aCAtIDFdW2ZpZWxkSW5mby5maWVsZElkXSA9ICd7JyArCisgICAgICAgICAgICBmaWVsZEluZm8uZmllbGRUeXBlICsgJzonICsgdmFsdWUgKyAnfSc7CisgICAgICAgIHRoaXMudHBvcy5wb3AoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkU3RvcDogZnVuY3Rpb24oKSB7CisgICAgICAgIC8vbmEKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSB2YWxUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgICAgICovCisgICAgd3JpdGVNYXBCZWdpbjogZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtrZXlUeXBlXSwKKyAgICAgICAgICAgIFRocmlmdC5Qcm90b2NvbC5UeXBlW3ZhbFR5cGVdLCAwXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgICAgICAgIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgJSAyICE9PSAwKSB7CisgICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCcnKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzaXplID0gKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAvIDI7CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF1bdGhpcy50c3RhY2tbcF0ubGVuZ3RoIC0gMV0gPSBzaXplOworCisgICAgICAgIHZhciBtYXAgPSAnfSc7CisgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHZhciBrID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXAgPSAnLCcgKyBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCisgICAgICAgICAgICBtYXAgPSBrICsgJzonICsgdiArIG1hcDsKKyAgICAgICAgfQorICAgICAgICBtYXAgPSAneycgKyBtYXA7CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaChtYXApOworICAgICAgICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlU2V0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgICovCisgICAgd3JpdGVTZXRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworICAgIHdyaXRlQm9vbDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh2YWx1ZSA/IDEgOiAwKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUJ5dGU6IGZ1bmN0aW9uKGk4KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTgpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTE2OiBmdW5jdGlvbihpMTYpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMTYpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTMyOiBmdW5jdGlvbihpMzIpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMzIpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTY0OiBmdW5jdGlvbihpNjQpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpNjQpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbihkYmwpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChkYmwpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKKyAgICAgICAgaWYgKHN0ciA9PT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgorICAgICAgICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaAorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzIGRvdWJsZSBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGInKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzcGFjZTogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcYic7ICAvLyB3cml0ZSBvdXQgYXM6IFxiIgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcZicpIHsgICAgLy8gYSBzaW5nbGUgZm9ybWZlZWQ6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGYnOyAgLy8gd3JpdGUgb3V0IGFzOiBcZiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXG4nKSB7ICAgIC8vIGEgc2luZ2xlIG5ld2xpbmU6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXG4nOyAgLy8gd3JpdGUgb3V0IGFzOiBcbiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHInKSB7ICAgIC8vIGEgc2luZ2xlIHJldHVybjogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xccic7ICAvLyB3cml0ZSBvdXQgYXM6IFxyIgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcdCcpIHsgICAgLy8gYSBzaW5nbGUgdGFiOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFx0JzsgIC8vIHdyaXRlIG91dCBhczogXHQiCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSBjaDsgICAgIC8vIEVsc2UgaXQgbmVlZCBub3QgYmUgZXNjYXBlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInICsgZXNjYXBlZFN0cmluZyArICciJyk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZUJpbmFyeTogZnVuY3Rpb24oYmluYXJ5KSB7CisgICAgICAgIHZhciBzdHIgPSAnJzsKKyAgICAgICAgaWYgKHR5cGVvZiBiaW5hcnkgPT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgIHN0ciA9IGJpbmFyeTsKKyAgICAgICAgfSBlbHNlIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CisgICAgICAgICAgICB2YXIgYXJyID0gYmluYXJ5OworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignd3JpdGVCaW5hcnkgb25seSBhY2NlcHRzIFN0cmluZyBvciBVaW50OEFycmF5LicpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnRvYShzdHIpICsgJyInKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuTWVzc2FnZVR5cGV9IG10eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSBjYWxsLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICAgICAqLworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1lc3NhZ2VCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucnN0YWNrID0gW107CisgICAgICAgIHRoaXMucnBvcyA9IFtdOworCisgICAgICAgIGlmICh0eXBlb2YgSlNPTiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEpTT04ucGFyc2UgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IEpTT04ucGFyc2UodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgalF1ZXJ5ICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgdGhpcy5yb2JqID0galF1ZXJ5LnBhcnNlSlNPTih0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yb2JqID0gZXZhbCh0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKKworICAgICAgICBpZiAodmVyc2lvbiAhPSBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbikgeworICAgICAgICAgICAgdGhyb3cgJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgICAgICAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOworICAgICAgICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOworCisKKyAgICAgICAgLy9nZXQgdG8gdGhlIG1haW4gb2JqCisgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yb2JqLnNoaWZ0KCkpOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworICAgIHJlYWRNZXNzYWdlRW5kOiBmdW5jdGlvbigpIHsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCisgICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBzdHJpbmcgZm5hbWUgcHJvcGVydHkKKyAgICAgKi8KKyAgICByZWFkU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgci5mbmFtZSA9ICcnOworCisgICAgICAgIC8vaW5jYXNlIHRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RydWN0cworICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuICovCisgICAgcmVhZFN0cnVjdEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAyXSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZEZpZWxkQmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHt9OworCisgICAgICAgIHZhciBmaWQgPSAtMTsKKyAgICAgICAgdmFyIGZ0eXBlID0gVGhyaWZ0LlR5cGUuU1RPUDsKKworICAgICAgICAvL2dldCBhIGZpZWxkSWQKKyAgICAgICAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgICAgICAgICBpZiAoZiA9PT0gbnVsbCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZiwgMTApOworICAgICAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKworICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgICAgICAgICAgLy9yZW1vdmUgc28gd2UgZG9uJ3Qgc2VlIGl0IGFnYWluCisgICAgICAgICAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZCAhPSAtMSkgeworCisgICAgICAgICAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKKyAgICAgICAgICAgIC8vd2F5IHRvIG1hdGNoIGEga2V5CisgICAgICAgICAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldOworICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByLmZuYW1lID0gJyc7CisgICAgICAgIHIuZnR5cGUgPSBmdHlwZTsKKyAgICAgICAgci5maWQgPSBmaWQ7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworICAgIHJlYWRGaWVsZEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7CisKKyAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCisgICAgICAgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB9CisKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IHZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1hcEJlZ2luOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB2YXIgZmlyc3QgPSBtYXAuc2hpZnQoKTsKKyAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcCk7CisgICAgICAgICAgbWFwID0gZmlyc3Q7CisgICAgICAgICAgZmlyc3QgPSBtYXAuc2hpZnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIua3R5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbZmlyc3RdOworICAgICAgICByLnZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKKyAgICAgICAgci5zaXplID0gbWFwLnNoaWZ0KCk7CisKKworICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLiAqLworICAgIHJlYWRNYXBFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZExpc3RCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgci5ldHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOworICAgICAgICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7CisKKyAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy5yc3RhY2sucHVzaChsaXN0LnNoaWZ0KCkpOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LiAqLworICAgIHJlYWRMaXN0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKSAtIDI7CisgICAgICAgIHZhciBzdCA9IHRoaXMucnN0YWNrOworICAgICAgICBzdC5wb3AoKTsKKyAgICAgICAgaWYgKHN0IGluc3RhbmNlb2YgQXJyYXkgJiYgc3QubGVuZ3RoID4gcG9zICYmIHN0W3Bvc10ubGVuZ3RoID4gMCkgeworICAgICAgICAgIHN0LnB1c2goc3RbcG9zXS5zaGlmdCgpKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkU2V0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCisgICAgcmVhZFNldEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvCisgICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlcgorICAgICAqICBpcyAxLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBUcnVlICovCisgICAgcmVhZEJvb2w6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOworCisgICAgICAgIGlmIChyICE9PSBudWxsICYmIHIudmFsdWUgPT0gJzEnKSB7CisgICAgICAgICAgICByLnZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIudmFsdWUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRCeXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJMTY6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEkzMjogZnVuY3Rpb24oZikgeworICAgICAgICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgciA9IHt9OworCisgICAgICAgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChmLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghZi5pc1JldmVyc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGYucmV2ZXJzZSgpOworICAgICAgICAgICAgICAgICAgICBmLmlzUmV2ZXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByLnZhbHVlID0gZi5wb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgICAgICAgIGZvciAodmFyIGkgaW4gZikgeworICAgICAgICAgICAgICAgIGlmIChpID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZltpXTsKKworICAgICAgICAgICAgICAgIHIudmFsdWUgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZjsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEk2NDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkQmluYXJ5OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKyAgICAgICAgci52YWx1ZSA9IGF0b2Ioci52YWx1ZSk7CisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEgKi8KKyAgICBza2lwOiBmdW5jdGlvbih0eXBlKSB7CisgICAgICAgIHZhciByZXQsIGk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJvb2woKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuSTE2OgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMTYoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTY0KCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWREb3VibGUoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuTUFQOgorICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJldC5zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yc3RhY2subGVuZ3RoID4gdGhpcy5ycG9zW3RoaXMucnBvcy5sZW5ndGggLSAxXSArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0Lmt0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC52dHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLlNFVDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQuZXR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5MSVNUOgorICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQuZXR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKworLyoqCisgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sCisgKiBAY29uc3RydWN0b3IKKyAqLworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24oc3J2TmFtZSwgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgICAgVGhyaWZ0LlByb3RvY29sLmNhbGwodGhpcywgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKKyAgICB0aGlzLnNlcnZpY2VOYW1lID0gc3J2TmFtZTsKK307CitUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLCBUaHJpZnQuUHJvdG9jb2wsICdtdWx0aXBsZXhQcm90b2NvbCcpOworCisvKiogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZSovCitUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKKworICAgIGlmICh0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCB8fCB0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCB0aGlzLnNlcnZpY2VOYW1lICsgJzonICsgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgfQorfTsKKworVGhyaWZ0Lk11bHRpcGxleGVyID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZXFpZCA9IDA7Cit9OworCisvKiogSW5zdGFudGlhdGVzIGEgbXVsdGlwbGV4ZWQgY2xpZW50IGZvciBhIHNwZWNpZmljIHNlcnZpY2UKKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2VOYW1lIC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlNlcnZpY2VDbGllbnR9IFNDbCAtIFRoZSBTZXJ2aWNlIENsaWVudCBDbGFzcworICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQKKyAqIEBleGFtcGxlCisgKiAgICB2YXIgbXAgPSBuZXcgVGhyaWZ0Lk11bHRpcGxleGVyKCk7CisgKiAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MC9mb28udGhyaWZ0Iik7CisgKiAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgKiAgICB2YXIgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCdBdXRoU2VydmljZScsIEF1dGhTZXJ2aWNlQ2xpZW50LCB0cmFuc3BvcnQpOworKi8KK1RocmlmdC5NdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNDbCwgdHJhbnNwb3J0KSB7CisgICAgaWYgKFNDbC5DbGllbnQpIHsKKyAgICAgICAgU0NsID0gU0NsLkNsaWVudDsKKyAgICB9CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CisgICAgfTsKKyAgICB2YXIgY2xpZW50ID0gbmV3IFNDbChuZXcgVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sKHNlcnZpY2VOYW1lLCB0cmFuc3BvcnQpKTsKKworICAgIHJldHVybiBjbGllbnQ7Cit9OworCisKKwordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpIHsKKworICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciByZXN1bHQgPSB7fSwgdmFsOworICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworVGhyaWZ0LmNvcHlNYXAgPSBjb3B5TWFwOworVGhyaWZ0LmNvcHlMaXN0ID0gY29weUxpc3Q7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9qcy90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0OTI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZXhwb3J0IENMQVNTUEFUSAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCitjaGVjay1sb2NhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L1JFQURNRS5tZCBiL2xpYi9qcy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQxNDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjggQEAKK1RocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgYnJvd3NlciBiYXNlZCBBcGFjaGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCitSUEMgY2xpZW50cyB1c2luZyB0aGUgSlNPTiBwcm90b2NvbCBvdmVyIEh0dHBbc10gd2l0aCBYSFIKK2FuZCBXZWJTb2NrZXQuCisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitUZXN0IFNlcnZlcnMKKy0tLS0tLS0tLS0tLQorZHJ3eHIteHIteCAyIHJhbmR5IHJhbmR5ICA0MDk2IEZlYiAgOCAxNTo0NCBzZWMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjE4MyBGZWIgIDkgMDQ6MDEgc2VydmVyX2h0dHAuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjM4NiBGZWIgIDkgMDU6Mzkgc2VydmVyX2h0dHBzLmpzCisKK3NlcnZlcl9odHRwLmpzIGlzIGEgTm9kZS5qcyB3ZWIgc2VydmVyIHdoaWNoIHN1cHBvcnQgdGhlCitzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IHRlc3Qgc3VpdGUgKHRocmlmdC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0KS4KK1RoZSBzZXJ2ZXIgc3VwcG9ydHMgQXBhY2hlIFRocmlmdCBYSFIgYW5kIFdlYlNvY2tldCBjbGllbnRzLgorCitzZXJ2ZXJfaHR0cHMuanMgaXMgdGhlIHNhbWUgYnV0IHVzZXMgU1NML1RMUy4gVGhlIHNlcnZlciBrZXkgCithbmQgY2VydCBhcmUgcHVsbGVkIGZyb20gdGhlIHRocmlmdC90ZXN0L2tleXMgZm9sZGVyLgorCitCb3RoIG9mIHRoZXNlIHNlcnZlcnMgc3VwcG9ydCBXZWJTb2NrZXQgKHRoZSBodHRwOiBzdXBwb3J0cyB3czosCithbmQgdGhlIGh0dHBzOiBzdXBwb3J0IHdzczopLgorCitUbyBydW4gdGhlIGNsaWVudCB0ZXN0IHdpdGggdGhlIEphdmEgdGVzdCBzZXJ2ZXIgdXNlOiAKKyQgbWFrZSBjaGVjayAocmVxdWlyZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YSBicmFuY2ggCithbmQgbWFrZSBjaGVjayBtdXN0IGhhdmUgYmVlbiBydW4gaW4gdGhyaWZ0L2xpYi9qYXZhIAorcHJldmlvdXNseSkuCisKK1RvIHJ1biB0aGUgY2xpZW50IHRlc3RzIHdpdGggdGhlIE5vZGUgc2VydmVycyBydW4gdGhlIGdydW50CisgYnVpbGQgaW4gdGhlIHBhcmVudCBqcyBkaXJlY3RvcnkgKHNlZSBSRUFETUUgdGhlcmUpLgorIAorVGVzdCBDbGllbnRzCistLS0tLS0tLS0tLS0KKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAxMzU1OCBGZWIgIDkgMDc6MTggdGVzdC1hc3luYy5qcworLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICA1NzI0IEZlYiAgOSAwMzo0NSB0ZXN0X2hhbmRsZXIuanMKKy1yd3hyLXhyLXggMSByYW5keSByYW5keSAgMjcxOSBGZWIgIDkgMDY6MDQgdGVzdC5odG1sCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDQ2MTEgRmViICA5IDA2OjA1IHRlc3QtanEuanMKKy1yd3hyLXhyLXggMSByYW5keSByYW5keSAxMjE1MyBGZWIgIDkgMDY6MDQgdGVzdC5qcworLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICAyNTkzIEZlYiAgOSAwNjoxNiB0ZXN0LW5vanEuaHRtbAorLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICAxNDUwIEZlYiAgOSAwNjoxNCB0ZXN0LW5vanEuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjg0NyBGZWIgIDkgMDY6MzEgdGVzdHdzLmh0bWwKKworVGhlcmUgYXJlIHRocmVlIGh0bWwgdGVzdCBkcml2ZXIgZmlsZXMsIGFsbCBvZiB3aGljaCBhcmUKK1FVbml0IGJhc2VkLiB0ZXN0Lmh0bWwgdGVzdHMgdGhlIEFwYWNoZSBUaHJpZnQgalF1ZXJ5CitnZW5lcmF0ZWQgY29kZSAodGhyaWZ0IC1nZW4ganM6anF1ZXJ5KS4gVGhlIHRlc3Qtbm9qcS5odG1sCitydW5zIGFsbW9zdCBpZGVudGljYWwgdGVzdHMgYWdhaW5zdCBub3JtYWwgSmF2YVNjcmlwdCBidWlsZHMKKyh0aHJpZnQgLWdlbiBqcykuIEJvdGggb2YgdGhlIHByZXZpb3VzIHRlc3RzIHVzZSB0aGUgWEhSIAordHJhbnNwb3J0LiBUaGUgdGVzdHdzLmh0bWwgcnVucyBzaW1pbGFyIHRlc3RzIHVzaW5nIHRoZQorV2ViU29ja2V0IHRyYW5zcG9ydC4gVGhlIHRlc3QqLmpzIGZpbGVzIGFyZSBsb2FkZWQgYnkgdGhlCitodG1sIGRyaXZlcnMgYW5kIGNvbnRhaW4gdGhlIGFjdHVhbCBBcGFjaGUgVGhyaWZ0IHRlc3RzLgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaCBiL2xpYi9qcy90ZXN0L1J1blRlc3RTZXJ2ZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3NGY3YzUuLjAwMDAwMDAKLS0tIGEvbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMhL2Jpbi9iYXNoIAotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9HNEo9Ii4uLy4uL2phdmEvYnVpbGQvaXZ5L2xpYi9zbGY0ai1hcGktMS41LjguamFyOi4uLy4uL2phdmEvYnVpbGQvaXZ5L2xpYi9sb2c0ai0xLjIuMTUuamFyOi4uLy4uL2phdmEvYnVpbGQvaXZ5L2xpYi9zbGY0ai1zaW1wbGUtMS41LjguamFyIgotSFRUUENPUkU9Ii4vaHR0cGNvcmUtNC4wLjEuamFyIgotCi1pZiBbIC1mICR7SFRUUENPUkV9IF0KLXRoZW4KLSAgICBlY2hvICJjb21waWxpbmcgdGVzdC4uLiIKLWVsc2UKLSAgICBlY2hvICJNaXNzaW5nIHJlcXVpcmVkIGZpbGUgJHtIVFRQQ09SRX0iCi0gICAgZWNobyAiWW91IGNhbiBkb3dubG9hZCB0aGlzIGZyb20gaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2h0dHBjb21wb25lbnRzL2h0dHBjb3JlL2JpbmFyeS9odHRwY29tcG9uZW50cy1jb3JlLTQuMC4xLWJpbi50YXIuZ3oiCi0gICAgZWNobyAiUGxhY2UgdGhlIGphciBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKLSAgICBleGl0Ci1maQotCi0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGphdmEgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0KLWphdmFjIC1jcCAke0xPRzRKfTouLi8uLi9qYXZhL2xpYnRocmlmdC5qYXIgZ2VuLWphdmEvdGhyaWZ0L3Rlc3QvKi5qYXZhCi1qYXZhYyAtY3AgJHtMT0c0Sn06JHtIVFRQQ09SRX06Li4vLi4vamF2YS9saWJ0aHJpZnQuamFyOmdlbi1qYXZhLyBzcmMvdGVzdC8qLmphdmEgCi1qYXZhIC1jcCAgJHtMT0c0Sn06JHtIVFRQQ09SRX06Li4vLi4vamF2YS9saWJ0aHJpZnQuamFyOmdlbi1qYXZhOnNyYyB0ZXN0Lkh0dHBkIC4uLwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcyBiL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbCBiL2xpYi9qcy90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNGMxMzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjQ5IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iSmF2YSBTY3JpcHQgVGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiIKKyAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIKKyAgeG1sbnM6anNsPSJhbnRsaWI6Y29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiPgorCisgIDxkZXNjcmlwdGlvbj5KYXZhIFNjcmlwdCBUZXN0IGJhc2VkIG9uIFRocmlmdCBKYXZhIExpYnJhcnk8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW5qYXZhIiBsb2NhdGlvbj0iZ2VuLWphdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW5qcyIgbG9jYXRpb249Imdlbi1qcyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGR9L2pzdGVzdC5qYXIiIC8+CisKKyAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgamF2YSBwcm9wZXJ0aWVzIGZpbGUgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZH0vbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPHBhdGggcmVmaWQ9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXIuZmlsZX0iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImRlcGVuZGVuY2llcyI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIyIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBZb3UgbmVlZCBsaWJ0aHJpZnQqLmphciBhbmQgbGlidGhyaWZ0KnRlc3QuamFyIGxvY2F0ZWQgYXQKKyAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzCisgICAgICBEaWQgeW91IGNvbXBpbGUgVGhyaWZ0IEphdmEgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUgYnkgImFudCBjb21waWxlLXRlc3QiPworICAgIDwvZmFpbD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBkaXI9IiR7dGhyaWZ0LmRpcn0iIGluY2x1ZGVzPSJjb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgVGhyaWZ0IGNvbXBpbGVyIGlzIG1pc3NpbmcgIQorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJkZXBlbmRlbmNpZXMiPgorICAgIDx0c3RhbXAgLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2pzL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xvZyIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L3Rlc3QiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0L2xvZyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkX2pzbGlicyI+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuMTEuMy5taW4uanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9qcXVlcnkuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianNsaWJzIiBkZXBlbmRzPSJpbml0LCBwcm94eSwgZG93bmxvYWRfanNsaWJzIj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iY29tcGlsZSB0aGUgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUsIHJlc29sdmUiPgorICAgIDwhLS0gLy9UT0RPIGVuYWJsZSA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludCIvPi0tPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW5qYXZhfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianN0ZXN0IiBkZXNjcmlwdGlvbj0iY3JlYXRlIHRoZSB0ZXN0IHN1aXRlIGphciBmaWxlIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8amFyIGphcmZpbGU9IiR7amFyLmZpbGV9IiBiYXNlZGlyPSIke2J1aWxkfS90ZXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImpzdGVzdCwganNsaWJzIj4KKyAgICA8amF2YSBjbGFzc25hbWU9InRlc3QuSHR0cGQiIGZvcms9InRydWUiCisgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByb3h5IiBpZj0icHJveHkuZW5hYmxlZCI+CisgICAgPHNldHByb3h5IHByb3h5aG9zdD0iJHtwcm94eS5ob3N0fSIgcHJveHlwb3J0PSIke3Byb3h5LnBvcnR9IgorICAgICAgcHJveHl1c2VyPSIke3Byb3h5LnVzZXJ9IiBwcm94eXBhc3N3b3JkPSIke3Byb3h5LnBhc3N9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieHZmYiI+CisgICAgPGVjaG8+Y2hlY2sgaWYgWHZmYiBpcyBhdmFpbGFibGU6PC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ilh2ZmIiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyIgcmVzdWx0cHJvcGVydHk9Inh2ZmIucHJlc2VudCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy94dmZiLmxvZyI+CisgICAgICA8YXJnIGxpbmU9Ii0tdmVyc2lvbiIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwaGFudG9tanMiIGRlcGVuZHM9Inh2ZmIiIGlmPSJ4dmZiLnByZXNlbnQiPgorICAgIDxlY2hvPmNoZWNrIGlmIHBoYW50b21qcyBpcyBhdmFpbGFibGU6PC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9InBoYW50b21qcyIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIiByZXN1bHRwcm9wZXJ0eT0icGhhbnRvbWpzLnByZXNlbnQiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvcGhhbnRvbWpzLmxvZyI+CisgICAgICA8YXJnIGxpbmU9Ii0tdmVyc2lvbiIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1bml0dGVzdCIgZGVzY3JpcHRpb249ImRvIHVuaXQgdGVzdHMgd2l0aCBoZWFkbGVzcyBicm93c2VyIHBoYW50b21qcyIgZGVwZW5kcz0iaW5pdCwgcGhhbnRvbWpzLCBqc3Rlc3QsIGpzbGlicyIgaWY9InBoYW50b21qcy5wcmVzZW50Ij4KKyAgICA8cGFyYWxsZWw+CisgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJYdmZiIiBzcGF3bj0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgICAgPGFyZyBsaW5lPSI6OTkiIC8+CisgICAgICA8L2V4ZWM+CisgICAgICA8amF2YSBjbGFzc25hbWU9InRlc3QuSHR0cGQiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAwIgorICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3VuaXR0ZXN0LmxvZyI+CisgICAgICAgIDxhcmcgdmFsdWU9Ii4uLyIgLz4KKyAgICAgIDwvamF2YT4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgICAgICA8ZWNobz5SdW5uaW5nIFVuaXQgVGVzdHMgd2l0aCBoZWFkbGVzcyBicm93c2VyITwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0icGhhbnRvbWpzIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGVudiBrZXk9IkRJU1BMQVkiIHZhbHVlPSI6OTkiLz4KKyAgICAgICAgICA8YXJnIGxpbmU9InBoYW50b21qcy1xdW5pdC5qcyBodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC90ZXN0Lmh0bWwiIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L3BhcmFsbGVsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAke3RocmlmdC5kaXJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqczpqcXVlcnkgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biB0ZXN0IHN1aXRlIChsaW50LCB1bml0dGVzdCkiIGRlcGVuZHM9ImxpbnQsIHVuaXR0ZXN0Ii8+CisKKyAgPHRhcmdldCBuYW1lPSJsaW50IiBkZXNjcmlwdGlvbj0iY29kZSBxdWFsaXR5IGNoZWNrcyAoanNsaW50IGFuZCBnanNsaW50IGlmIGF2YWlsYWJsZSkiIGRlcGVuZHM9ImdlbmVyYXRlLCBnanNsaW50LCBqc2xpbnQiLz4KKworICA8dGFyZ2V0IG5hbWU9ImpzbGludCIgZGVwZW5kcz0icmVzb2x2ZSI+CisgICAgPHRhc2tkZWYgdXJpPSJhbnRsaWI6Y29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiIHJlc291cmNlPSJjb20vZ29vZ2xlY29kZS9qc2xpbnQ0amF2YS9hbnRsaWIueG1sIiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDwhLS0KKyAgICAgICAgIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3b3VsZCBwcm9iYWJseSBtYWtlIHNlbnNlIGluIHRoZSBmdXR1cmU6CisgICAgICAgICBicm93c2VyLHVuZGVmLGVxZXFlcSxwbHVzcGx1cyxiaXR3aXNlLHJlZ2V4cCxzdHJpY3QsbmV3Y2FwLGltbWVkCisgICAgLS0+CisgICAgPGpzbDpqc2xpbnQgb3B0aW9ucz0iZXZpbCxmb3Jpbixicm93c2VyLGJpdHdpc2UscmVnZXhwLG5ld2NhcCxpbW1lZCIgZW5jb2Rpbmc9IlVURi04Ij4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIC8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Z2VuanN9IiBpbmNsdWRlcz0iKiovKi5qcyIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLi4vc3JjIiBpbmNsdWRlcz0idGhyaWZ0LmpzIiAvPgorCisgICAgICA8IS0tIGlzc3VlcyB3aXRoIHVuc2FmZSBjaGFyYWN0ZXIgLS0+CisgICAgICA8IS0tIGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKnRlc3QqLmpzIiAvPiAtLT4KKyAgICA8L2pzbDpqc2xpbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2hlY2stZ2pzbGludCI+CisgICAgPGVjaG8+Y2hlY2sgaWYgZ2pzbGludCBpcyBhdmFpbGFibGU6PC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Imdqc2xpbnQiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyIgcmVzdWx0cHJvcGVydHk9Imdqc2xpbnQucHJlc2VudCIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1oZWxwc2hvcnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2pzbGludCIgZGVwZW5kcz0iY2hlY2stZ2pzbGludCIgaWY9Imdqc2xpbnQucHJlc2VudCI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZ2pzbGludCIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIj4KKyAgICAgIDxhcmcgbGluZT0iLS1ub2pzZG9jIi8+CisgICAgICA8YXJnIGxpbmU9IiR7Z2VuanN9LyouanMiLz4KKyAgICAgIDxhcmcgbGluZT0iLi4vc3JjL3RocmlmdC5qcyIvPgorCisgICAgICA8IS0tIGlzc3VlcyB3aXRoIHVuc2FmZSBjaGFyYWN0ZXIsIGV0Yy4gLS0+CisgICAgICA8IS0tIDxhcmcgbGluZT0iKnRlc3QqLmpzIi8+IC0tPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbmphdmF9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbmpzfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJpbml0LG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJqcy50ZXN0LmRlcGVuZGVuY3kuamFycyI+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSI0LjAuMSIvPgorICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiIGFydGlmYWN0SWQ9ImpzbGludDRqYXZhLWFudCIgdmVyc2lvbj0iMS40LjYiLz4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImV1Lm1lZHNlYS5taW1ldXRpbCIgYXJ0aWZhY3RJZD0ibWltZS11dGlsIiB2ZXJzaW9uPSIyLjEuMyIvPgorICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgorCisgICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGR9L2xpYiI+CisgICAgICA8ZmlsZXNldCByZWZpZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgIDwvY29weT4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDNhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTAsMCArMSwyMTMgQEAKK2Z1bmN0aW9uIHNlcmlhbGl6ZShkYXRhKSB7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oJycsIDAsIDApOworICBkYXRhLndyaXRlKHByb3RvY29sKTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIHJldHVybiB0cmFuc3BvcnQuc2VuZF9idWY7Cit9CisKK2Z1bmN0aW9uIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CisgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHNlcmlhbGl6ZWQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKKyAgZGF0YS5yZWFkKHByb3RvY29sKTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKKworZnVuY3Rpb24gY3JlYXRlVGhyaWZ0T2JqKCkgeworCisgIHJldHVybiBuZXcgQ29tcGxleCh7CisKKyAgICBzdHJ1Y3RfZmllbGQ6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2InfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2MnfSkKKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdkJ30pLAorICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdlJ30pCisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnZid9KSwKKyAgICAgIEI6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnZyd9KQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnaCd9KSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnaSd9KQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2onfSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2snfSkKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgICBbJ3RocmVlJywgJ2ZvdXInXSwKKyAgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgICBdCisgIH0KKyAgKTsKK30KKworCitmdW5jdGlvbiBjcmVhdGVKc09iaigpIHsKKworICByZXR1cm4geworCisgICAgc3RydWN0X2ZpZWxkOiB7dmFsdWU6ICdhJ30sCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWworICAgICAge3ZhbHVlOiAnYid9LAorICAgICAge3ZhbHVlOiAnYyd9CisgICAgXSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKKyAgICAgIHt2YWx1ZTogJ2QnfSwKKyAgICAgIHt2YWx1ZTogJ2UnfQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiB7dmFsdWU6ICdmJ30sCisgICAgICBCOiB7dmFsdWU6ICdnJ30KKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbCisgICAgICAgICAgICB7dmFsdWU6ICdoJ30sCisgICAgICAgICAgICB7dmFsdWU6ICdpJ30KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IHt2YWx1ZTogJ2onfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWydvbmUnLCAndHdvJ10sCisgICAgICBbJ3RocmVlJywgJ2ZvdXInXSwKKyAgICAgIFsnZml2ZScsICdzaXgnXQorICAgXQorICB9OworfQorCisKK2Z1bmN0aW9uIGFzc2VydFZhbHVlcyhvYmosIGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2ZpZWxkLnZhbHVlLCAnYScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUsICdiJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgJ2MnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUsICdkJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlLCAnZScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAnZicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X21hcF9maWVsZC5CLnZhbHVlLCAnZycpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0udmFsdWUsICdoJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgJ2knKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgJ2onKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgJ2snKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgJ29uZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdLCAndHdvJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMF0sICd0aHJlZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdLCAnZm91cicpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAnZml2ZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdLCAnc2l4Jyk7Cit9CisKK2NvbnN0IGNhc2VzID0geworCisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2ltcGxlIHN0cnVjdCBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKKyAgfSwKKworCisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CisgIH0sCisKKyAgJ05lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgY29uc3QgdE9iajIgPSBuZXcgQ29tcGxleChjcmVhdGVKc09iaigpKTsKKyAgICBhc3NlcnRWYWx1ZXModE9iajIsIGFzc2VydCk7CisgICAgYXNzZXJ0LmVxdWFsKHNlcmlhbGl6ZSh0T2JqMiksIHNlcmlhbGl6ZSh0T2JqMSkpOworICB9LAorCisgICdNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOworICAgIGFzc2VydFZhbHVlcyhhcmdzLCBhc3NlcnQpOworCisgICAgY29uc3QgdE9iaiA9IG5ldyBDb21wbGV4KGFyZ3MpOworICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworCisgICAgYXJncy5zdHJ1Y3RfZmllbGQudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAnWlpaJzsKKworICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworICB9LAorCisgICdudWxscyBhcmUgb2snOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoeworICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X21hcF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKKyAgICB9KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKKyAgfQorCit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICBRVW5pdC50ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZiBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViMTU4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgpAQCAtMCwwICsxLDE4IEBACitzZXJ2ZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6OTg3NgorCitsb2FkOgorIyBRdW5pdCBhZGFwdGVyCisgIC0gYnVpbGQvanMvbGliL2VxdWl2LmpzCisgIC0gYnVpbGQvanMvbGliL1FVbml0QWRhcHRlci5qcworIyBkZXBlbmRlbmNpZXMKKyAgLSBidWlsZC9qcy9saWIvanF1ZXJ5LmpzCisgIC0gYnVpbGQvanMvdGhyaWZ0LmpzCisgIC0gZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmpzCisgIC0gZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMKKyAgLSBnZW4tanMvVGhyaWZ0VGVzdC5qcworIyB0aGUgdGVzdCBzdWl0ZQorICAtIHRlc3QuanMKKworIyByZWRpcmVjdCB0byB0aGUgSmF2YSBiYXNlZCBUaHJpZnQgdGVzdHNlcnZlcgorcHJveHk6CisgLSB7bWF0Y2hlcjogIioiLCBzZXJ2ZXI6ICIgaHR0cDovL2xvY2FsaG9zdDo4MDg4In0KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxN2U3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKyhmdW5jdGlvbigpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIFJ1ZGltZW50YXJ5IHRlc3QgaGVscGVyIGZ1bmN0aW9ucworICAvLyBUT0RPOiBSZXR1cm4gZXJyb3IgY29kZSBiYXNlZCBvbiBraW5kIG9mIGVycm9ycyByYXRoZXIgdGhhbiB0aHJvdworICB2YXIgb2sgPSBmdW5jdGlvbih0LCBtc2cpIHsKKyAgICBpZiAoIXQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgICAgfQorICB9OworICB2YXIgZXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CisgICAgaWYgKGEgIT09IGIpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgfQorICB9OworICB2YXIgdGVzdCA9IGZ1bmN0aW9uKG5hbWUsIGYpIHsKKyAgICBjb25zb2xlLmxvZygnVEVTVCA6ICcgKyBuYW1lKTsKKyAgICBmKCk7CisgICAgY29uc29sZS5sb2coJ09LXG4nKTsKKyAgfTsKKworICB2YXIgcGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncykgeworICAgIHZhciBza2lwcyA9IFsKKyAgICAgICctLXRyYW5zcG9ydD1odHRwJywKKyAgICAgICctLXByb3RvY29sPWpzb24nCisgICAgXTsKKyAgICB2YXIgb3B0cyA9IHsKKyAgICAgIHBvcnQ6ICc5MDkwJworICAgICAgLy8gcHJvdG9jb2w6ICdqc29uJywKKyAgICB9OworICAgIHZhciBrZXlzID0ge307CisgICAgZm9yICh2YXIga2V5IGluIG9wdHMpIHsKKyAgICAgIGtleXNbJy0tJyArIGtleSArICc9J10gPSBrZXk7CisgICAgfQorICAgIGZvciAodmFyIGkgaW4gYXJncykgeworICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07CisgICAgICBpZiAoc2tpcHMuaW5kZXhPZihhcmcpICE9IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGhpdCA9IGZhbHNlOworICAgICAgZm9yICh2YXIgayBpbiBrZXlzKSB7CisgICAgICAgIGlmIChhcmcuc2xpY2UoMCwgay5sZW5ndGgpID09PSBrKSB7CisgICAgICAgICAgb3B0c1trZXlzW2tdXSA9IGFyZy5zbGljZShrLmxlbmd0aCk7CisgICAgICAgICAgaGl0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFoaXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3B0cy5wb3J0ID0gcGFyc2VJbnQob3B0cy5wb3J0LCAxMCk7CisgICAgaWYgKCFvcHRzLnBvcnQgfHwgb3B0cy5wb3J0IDwgMSB8fCBvcHRzLnBvcnQgPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBvcnQgbnVtYmVyJyk7CisgICAgfQorICAgIHJldHVybiBvcHRzOworICB9OworCisgIHZhciBleGVjdXRlID0gZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJyMjIyBBcGFjaGUgVGhyaWZ0IEphdmFzY3JpcHQgc3RhbmRhbG9uZSB0ZXN0IGNsaWVudCcpOworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnc3JjL3RocmlmdC5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdC5qcycpOworCisgICAgdmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworICAgIHZhciBvcHRzID0gcGFyc2VBcmdzKHN5c3RlbS5hcmdzLnNsaWNlKDEpKTsKKyAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKKyAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQgKyAnL3NlcnZpY2UnKTsKKyAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgorICAgIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKyAgICB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpOworICAgIH0pOworICAgIHRlc3QoJ0k4JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJMzInLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgfSk7CisgICAgdGVzdCgnSTY0JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSksIC1NYXRoLnBvdygyLCA1MikpOworICAgIH0pOworCisgICAgdGVzdCgnU3RydWN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgICAgfTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1NldCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdMaXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdFbnVtJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworCisgICAgdGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICAgIH0pOworCisgICAgdGVzdCgnU2tpcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgICAgdmFyIHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CisKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MworICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIHJldHVybiB4dHJ1Y3QzOworICAgICAgfTsKKworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2sob2spOworICAgICAgfQorICAgIH0pOworCisgICAgdmFyIGNyYXp5ID0geworICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgfV0KKyAgICB9OworICAgIHRlc3QoJ0luc2FuaXR5JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgaW5zYW5pdHkgPSB7CisgICAgICAgICcxJzogeworICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICB9LAorICAgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgICAgfTsKKyAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgfSk7CisKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgY29uc29sZS5sb2coJyMjIyBBbGwgdGVzdHMgc3VjY2VlZGVkLicpOworICAgIHJldHVybiAwOworICB9OworCisgIHRyeSB7CisgICAgdmFyIHJldCA9IGV4ZWN1dGUoKTsKKyAgICBwaGFudG9tLmV4aXQocmV0KTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgLy8gQ2F0Y2ggYWxsIGFuZCBleGl0IHRvIGF2b2lkIGhhbmcuCisgICAgY29uc29sZS5lcnJvcihlcnIpOworICAgIHBoYW50b20uZXhpdCgxKTsKKyAgfQorfSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMWQ3YTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qanNoaW50IGV2aWw6dHJ1ZSovCisKKy8qIFRoaXMgZmlsZSBpcyBvbmx5IHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUuCisgKgorICogT3JpZ2luOiAgaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9ydW4tcXVuaXQuanMKKyAqIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5CU0QKKyAqCisgKiBJbmNsdXNpb24gaW50byBBcGFjaGUgcHJvZHVjdHMgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xlZ2FsLzNwYXJ0eS5odG1sCisgKi8KKwordmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworCisKKy8qKgorICogV2FpdCB1bnRpbCB0aGUgdGVzdCBjb25kaXRpb24gaXMgdHJ1ZSBvciBhIHRpbWVvdXQgb2NjdXJzLiBVc2VmdWwgZm9yIHdhaXRpbmcKKyAqIG9uIGEgc2VydmVyIHJlc3BvbnNlIG9yIGZvciBhIHVpIGNoYW5nZSAoZmFkZUluLCBldGMuKSB0byBvY2N1ci4KKyAqCisgKiBAcGFyYW0gdGVzdEZ4IGphdmFzY3JpcHQgY29uZGl0aW9uIHRoYXQgZXZhbHVhdGVzIHRvIGEgYm9vbGVhbiwKKyAqIGl0IGNhbiBiZSBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgKGUuZy46ICIxID09IDEiIG9yICIkKCcjYmFyJykuaXMoJzp2aXNpYmxlJykiIG9yCisgKiBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogQHBhcmFtIG9uUmVhZHkgd2hhdCB0byBkbyB3aGVuIHRlc3RGeCBjb25kaXRpb24gaXMgZnVsZmlsbGVkLAorICogaXQgY2FuIGJlIHBhc3NlZCBpbiBhcyBhIHN0cmluZyAoZS5nLjogIjEgPT0gMSIgb3IgIiQoJyNiYXInKS5pcygnOnZpc2libGUnKSIgb3IKKyAqIGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBAcGFyYW0gdGltZU91dE1pbGxpcyB0aGUgbWF4IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQuIElmIG5vdCBzcGVjaWZpZWQsIDMgc2VjIGlzIHVzZWQuCisgKi8KK2Z1bmN0aW9uIHdhaXRGb3IodGVzdEZ4LCBvblJlYWR5LCB0aW1lT3V0TWlsbGlzKSB7CisgICAgdmFyIG1heHRpbWVPdXRNaWxsaXMgPSB0aW1lT3V0TWlsbGlzID8gdGltZU91dE1pbGxpcyA6IDMwMDEsIC8vPCBEZWZhdWx0IE1heCBUaW1vdXQgaXMgM3MKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKKyAgICAgICAgY29uZGl0aW9uID0gZmFsc2UsCisgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQgPCBtYXh0aW1lT3V0TWlsbGlzKSAmJiAhY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbm90IHRpbWUtb3V0IHlldCBhbmQgY29uZGl0aW9uIG5vdCB5ZXQgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gKHR5cGVvZih0ZXN0RngpID09PSAnc3RyaW5nJyA/IGV2YWwodGVzdEZ4KSA6IHRlc3RGeCgpKTsgLy88IGRlZmVuc2l2ZSBjb2RlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbmRpdGlvbiBzdGlsbCBub3QgZnVsZmlsbGVkICh0aW1lb3V0IGJ1dCBjb25kaXRpb24gaXMgJ2ZhbHNlJykKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIHRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcGhhbnRvbS5leGl0KDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbiBmdWxmaWxsZWQgKHRpbWVvdXQgYW5kL29yIGNvbmRpdGlvbiBpcyAndHJ1ZScpCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgJ21zLicpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChvblJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IC8vPCBTdG9wIHRoaXMgaW50ZXJ2YWwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIDEwMCk7IC8vPCByZXBlYXQgY2hlY2sgZXZlcnkgMjUwbXMKK30KKworCitpZiAoc3lzdGVtLmFyZ3MubGVuZ3RoID09PSAxIHx8IHN5c3RlbS5hcmdzLmxlbmd0aCA+IDMpIHsKKyAgICBjb25zb2xlLmxvZygnVXNhZ2U6IHBoYW50b21qcyBwaGFudG9tanMtcXVuaXQuanMgVVJMJyk7CisgICAgcGhhbnRvbS5leGl0KDEpOworfQorCit2YXIgcGFnZSA9IG5ldyBXZWJQYWdlKCk7CisKKy8vIFJvdXRlICJjb25zb2xlLmxvZygpIiBjYWxscyBmcm9tIHdpdGhpbiB0aGUgUGFnZSBjb250ZXh0IHRvIHRoZSBtYWluIFBoYW50b20gY29udGV4dCAoaS5lLiBjdXJyZW50ICJ0aGlzIikKK3BhZ2Uub25Db25zb2xlTWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeworICAgIGNvbnNvbGUubG9nKG1zZyk7Cit9OworCitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CisgICAgICAgIHBoYW50b20uZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKKyAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGZhaWxlZE51bSA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlbC5pbm5lclRleHQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmYWlsZWQnKVswXS5pbm5lckhUTUw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwaGFudG9tLmV4aXQoKHBhcnNlSW50KGZhaWxlZE51bSwgMTApID4gMCkgPyAxIDogMCk7CisgICAgICAgIH0pOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgwYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKKy8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKKy8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLworCitjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKKworY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKKwl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorCXByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKKwloYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAorCXNlcnZpY2VzOiB7CisJCScvc2VydmljZSc6IFRocmlmdFRlc3RTdmNPcHQKKwl9Cit9OworCitjb25zdCBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOworY29uc3QgcG9ydCA9IGVzNk1vZGUgPyA4MDg4IDogODA4OTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZyhgU2VydmluZyBmaWxlcyBmcm9tOiAke19fZGlybmFtZX1gKTsKK2NvbnNvbGUubG9nKGBIdHRwL1RocmlmdCBTZXJ2ZXIgKEVTNiBtb2RlICR7ZXM2TW9kZX0pIHJ1bm5pbmcgb24gcG9ydDogJHtwb3J0fWApOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTcxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmVyIHRoZSB0ZXN0Lmh0bWwgYnJvd3NlcgorLy8gIGJhc2VkIEphdmFTY3JpcHQgdGVzdCBwYWdlICh3aGljaCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuCisvLyAgVGhpcyBzZXJ2ZXIgYWxzbyBzdXBwbGllcyB0aGUgVGhyaWZ0IGJhc2VkIHRlc3Qgc2VydmljZSwgd2hpY2ggZGVwZW5kcworLy8gIG9uIHRoZSBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBJREwgc2VydmljZSAod2hpY2ggbXVzdCBiZSBjb21waWxlZAorLy8gIGZvciBOb2RlIGFuZCBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQgaW4gLi9nZW4tbm9kZWpzIGFuZCAuL2dlbi1qcworLy8gIHJlc3BlY3RpdmVseSkuIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgYnJvd3NlcgorLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcworLy8gIGluIC4vYnVpbGQvanMvbGliKS4KKworY29uc3QgZnMgPSByZXF1aXJlKCdmcycpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CisKKy8vU2V0dXAgdGhlIEkvTyBzdGFjayBvcHRpb25zIGZvciB0aGUgVGhyaWZ0VGVzdCBzZXJ2aWNlCitjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0geworICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAorICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKyAgZmlsZXM6IF9fZGlybmFtZSwKKyAgdGxzOiB7CisgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleScpLAorICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0JykKKyAgfSwKKyAgc2VydmljZXM6IHsKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CisgIH0KK307CisKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwOTAgOiA4MDkxOworc2VydmVyLmxpc3Rlbihwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhIGIvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQppbmRleCAxNTVhOGI4Li5lNGZjMGNjIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCisrKyBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKQEAgLTcwLDYgKzcwLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJUZXN0QmFzZS5UZXN0SGFuZGxlcjsKKworaW1wb3J0IGV1Lm1lZHNlYS5taW1ldXRpbC5kZXRlY3Rvci5FeHRlbnNpb25NaW1lRGV0ZWN0b3I7CitpbXBvcnQgZXUubWVkc2VhLm1pbWV1dGlsLk1pbWVVdGlsMjsKK2ltcG9ydCBldS5tZWRzZWEubWltZXV0aWwuTWltZVR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKICAqIEJhc2ljLCB5ZXQgZnVsbHkgZnVuY3Rpb25hbCBhbmQgc3BlYyBjb21wbGlhbnQsIEhUVFAvMS4xIGZpbGUgc2VydmVyLgpAQCAtMTMwLDggKzEzNywxMiBAQAogICAgICAgICAgICAgICAgIGJvZHkuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOwogICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYodGFyZ2V0LmluZGV4T2YoIj8iKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc3Vic3RyaW5nKDEsIHRhcmdldC5pbmRleE9mKCI/IikpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZG9jUm9vdCwgVVJMRGVjb2Rlci5kZWNvZGUodGFyZ2V0KSk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5kb2NSb290LCBVUkxEZWNvZGVyLmRlY29kZSh0YXJnZXQsICJVVEYtOCIpKTsKKwogICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewogCiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQpOwpAQCAtMTcyLDggKzE4MywyMiBAQAogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKIAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICAgICAgICAgICAgICAgICAgTWltZVV0aWwyIG1pbWVVdGlsID0gbmV3IE1pbWVVdGlsMigpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVVdGlsLnJlZ2lzdGVyTWltZURldGVjdG9yKEV4dGVuc2lvbk1pbWVEZXRlY3Rvci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248TWltZVR5cGU+IGNvbGxlY3Rpb24gPSBtaW1lVXRpbC5nZXRNaW1lVHlwZXMoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1pbWVUeXBlPiBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSBtdCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gIG10LmdldE1lZGlhVHlwZSgpICsgIi8iICsgbXQuZ2V0U3ViVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICBGaWxlRW50aXR5IGJvZHkgPSBuZXcgRmlsZUVudGl0eShmaWxlLCAidGV4dC9odG1sIik7CisgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRpdHkgYm9keSA9IG5ldyBGaWxlRW50aXR5KGZpbGUsIG1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCBtaW1lVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aW5nIGZpbGUgIiArIGZpbGUuZ2V0UGF0aCgpKTsKIApkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvVGVzdEhhbmRsZXIuamF2YSBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L1Rlc3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzk0NGYuLjAwMDAwMDAKLS0tIGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvVGVzdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotCi1pbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKLWltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKLWltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OwotaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKLQotcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5JZmFjZSB7Ci0KLSAgICBwdWJsaWMgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiwgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBYY2VwdGlvbigxLGFyZyk7ICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPExvbmcsIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4oKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdC5wdXQoTG9uZy52YWx1ZU9mKDEpLCBuZXcgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PigpKTsKLSAgICAgICAgcmVzdWx0LmdldChMb25nLnZhbHVlT2YoMSkpLnB1dChOdW1iZXJ6Lk9ORSwgYXJndW1lbnQpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0LnB1dChMb25nLnZhbHVlT2YoMiksIG5ldyBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+KCkpOwotICAgICAgICByZXN1bHQuZ2V0KExvbmcudmFsdWVPZigyKSkucHV0KE51bWJlcnouT05FLCBhcmd1bWVudCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIEludGVnZXI+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsSW50ZWdlcj4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0LnB1dChJbnRlZ2VyLnZhbHVlT2YoMSksIG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKSk7Ci0gICAgICAgIHJlc3VsdC5nZXQoSW50ZWdlci52YWx1ZU9mKDEpKS5wdXQoSW50ZWdlci52YWx1ZU9mKDEpLCBJbnRlZ2VyLnZhbHVlT2YoMSkpOwotICAgICAgICByZXN1bHQuZ2V0KEludGVnZXIudmFsdWVPZigxKSkucHV0KEludGVnZXIudmFsdWVPZigyKSwgSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgcmVzdWx0LmdldChJbnRlZ2VyLnZhbHVlT2YoMikpLnB1dChJbnRlZ2VyLnZhbHVlT2YoMSksIEludGVnZXIudmFsdWVPZigxKSk7Ci0gICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgWHRydWN0IHh0ciA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgCi0gICAgICAgIHh0ci5ieXRlX3RoaW5nID0gYXJnMDsKLSAgICAgICAgeHRyLmkzMl90aGluZyAgPSBhcmcxOwotICAgICAgICB4dHIuaTY0X3RoaW5nICA9IGFyZzI7Ci0gICAgICAgIHh0ci5zdHJpbmdfdGhpbmcgPSAic2VydmVyIHN0cmluZyI7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4geHRyOwotICAgIH0KLQotICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhjZXB0aW9uLCBYY2VwdGlvbjIsIFRFeGNlcHRpb24gewotICAgICAgICBYdHJ1Y3QgeHRyID0gbmV3IFh0cnVjdCgpOwotICAgICAgICB4dHIuc2V0U3RyaW5nX3RoaW5nKGFyZzApOwotICAgICAgICB0aHJvdyBuZXcgWGNlcHRpb24yKDEseHRyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChzZWNvbmRzVG9TbGVlcCAqIDEwMDApOwotICAgICAgICB9Y2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KKyAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAorICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKi8KKworCisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CisgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoNCk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJNjQoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgIH07CisKKyAgICBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RUeXBlZGVmKDY5LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBmb3IgKGxldCBrZXkyIGluIHJlc3VsdFtrZXldKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgJzMnOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgIH07CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpLCBmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdPbmV3YXknKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RPbmV3YXkoMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGZjMGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sCkBAIC0wLDAgKzEsNDkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9Kc0RlZXBDb25zdHJ1Y3RvclRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKwk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBEZWVwIENvbnN0cnVjdG9yIFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCI+SnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDMwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbApAQCAtMCwwICsxLDU1IEBACisrPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgICAgPHRpdGxlPlJlbmRlcmluZyBEb3VibGUgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgICAgICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8IS0tIGRvdWJsZSBjb25zdGFudHMgdG8gY2hlY2sgLS0+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfdHlwZXMuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0galF1ZXJ5IC0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgICAgICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgICAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtZG91YmxlLXJlbmRlcmluZy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgIDwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+UmVuZGVyaW5nIERvdWJsZSBDb25zdGFudHMgaW4gSlM6IFVuaXQgVGVzdDwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTBjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgZG91YmxlIGNvbnN0YW50cyBpbnNpZGUKKyAqIERvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0LiBUaGVzZSB0ZXN0cyB3aWxsIHJ1biBhZ2FpbnN0IE5vcm1hbCAoLWdlbiBqcykKKyAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIERvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisgKi8KKworLy8gZG91YmxlIGFzc2VydGlvbiB0aHJlc2hvbGQKK2NvbnN0IEVQU0lMT04gPSAwLjAwMDAwMDE7CisKKy8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgoraWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgeworICAvLyBXaGVuIHVzaW5nIHJlYWwgUVVuaXQgKGZyb24gUGhhbnRvbUpTKSBsb2cgZmFpbHVyZXMgdG8gY29uc29sZQorICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOworICAgICAgaWYgKGRldGFpbHMubWVzc2FnZSkgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIGRldGFpbHMuZXhwZWN0ZWQpOworICAgICAgY29uc29sZS5sb2coJ0FjdHVhbCAgOiAnICsgZGV0YWlscy5hY3R1YWwpOworICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9CisgIH0pOworfQorCitRVW5pdC5tb2R1bGUoJ0RvdWJsZSByZW5kZXJpbmcnKTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUgKHJlbmRlcmluZyknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zb2xlLmxvZygnRG91YmxlIHJlbmRlcmluZyB0ZXN0IC0tIHN0YXJ0cycpOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgLSBET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9MSVNUID0KKyAgICAgICAgWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCwKKyAgICAgICAgICAgIDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDNdOworICAgIGFzc2VydC5lcXVhbChET1VCTEVfTElTVF9URVNULmxlbmd0aCwgRVhQRUNURURfRE9VQkxFX0xJU1QubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IEVYUEVDVEVEX0RPVUJMRV9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgIGFzc2VydC5vayhNYXRoLmFicyhFWFBFQ1RFRF9ET1VCTEVfTElTVFtpXSAtIERPVUJMRV9MSVNUX1RFU1RbaV0pIDw9IEVQU0lMT04pOworICAgIH0KKyAgICBjb25zb2xlLmxvZygnRG91YmxlIHJlbmRlcmluZyB0ZXN0IC0tIGVuZHMnKTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDQ5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sCkBAIC0wLDAgKzEsNjIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtZXM2L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQ+CisgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uOworICAgIGNvbnN0IHdzX3VyaSA9ICgobG9jLnByb3RvY29sID09PSAiaHR0cHM6IikgPyAid3NzOi8vIiA6ICJ3czovLyIpICsKKyAgICAgICAgICAgICAgICAgICBsb2MuaG9zdG5hbWUgKyAiOiIgKyBsb2MucG9ydCArIGxvYy5wYXRobmFtZTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQod3NfdXJpKTsKKyAgICBjb25zdCBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtZXM2LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZXM2LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1MTcxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2LmpzCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBGdWxseSBBc3luYyBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LgorICogVGhlc2UgdGVzdHMgYXJlIGRlc2lnbmVkIHRvIGV4ZXJjaXNlIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0CisgKiAod2hpY2ggaXMgZXhjbHVzaXZlbHkgYXN5bmMpLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6ZXM2IFRocmlmdFRlc3QudGhyaWZ0CisgKi8KKworCisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKKyAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgICBhc3NlcnQuZXF1YWwobWFwMSwgbWFwMik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1FVbml0Lm1vZHVsZSgnQmFzZSBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0Vm9pZCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdFN0cmluZygnJykudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAnJyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycykudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgtMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA2MCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEk2NCgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg3KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIGxpc3RUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCA2OSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgIH07CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHsKKworICAgICAgY29uc29sZS5sb2coYEV4Y2VwdGlvbiBleGNlcHRpb24gZWApOworICAgICAgY29uc29sZS5sb2coZSk7CisgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShlLCBudWxsLCAyKSk7CisKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJykudGhlbihmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgJzMnOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgIH07CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpKS50aGVuKGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOworICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWpxLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJiYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMCwwICsxLDE1OSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIG9ubHkgd2l0aCBqUXVlcnkgKC1nZW4ganM6anF1ZXJ5KSBBcGFjaGUgVGhyaWZ0CisgKiBpbnRlcmZhY2VzLiBUbyBjcmVhdGUgY2xpZW50IGNvZGU6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCisgKiArKyB0ZXN0LW5vanEuanMgZm9yICItZ2VuIGpzIiBvbmx5IHRlc3RzCisgKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL2pRdWVyeSBhc3luY2hyb25vdXMgdGVzdHMKK2pRdWVyeS5hamF4U2V0dXAoeyB0aW1lb3V0OiAwIH0pOworCitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jIE1hbnVhbCcpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgY29uc3QganF4aHIgPSBqUXVlcnkuYWpheCh7CisgICAgICB1cmw6ICcvc2VydmljZScsCisgICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STMyKE1hdGgucG93KC0yLCAzMSkpLAorICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgY2FjaGU6IGZhbHNlLAorICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnJlY3ZfdGVzdEkzMigpLCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKKyAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgalF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MSBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEk2NChNYXRoLnBvdygtMiwgNTIpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MSBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnJlY3ZfdGVzdEk2NCgpLCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKKyAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnalEgQXN5bmMnKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICBjb25zdCBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLCAzMSksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICBqcXhoci5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7IGFzc2VydC5vayhmYWxzZSwgZS5tZXNzYWdlKTsgfSkKKyAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgeworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7CisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgICAkKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBkb25lKCk7IH0gKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODQyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMCwwICsxLDUyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1ub2pxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODAxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqIFRvIGNyZWF0ZSBjbGllbnQgY29kZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cworICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCisgKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL0FzeW5jIGV4Y2VwdGlvbiB0ZXN0cworCitRVW5pdC5tb2R1bGUoJ05valEgQXN5bmMnKTsKKworUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDcwOGRiNDEuLjhiNjcwMTQKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApAQCAtMSwxODkgKzEsNTQgQEAKIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgogPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgogPGhlYWQ+CiAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CiAKLSAgPHNjcmlwdCBzcmM9Ii90aHJpZnQuanMiICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWpxdWVyeS9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIAogICA8IS0tIGpRdWVyeSAtLT4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjQuMi9qcXVlcnkubWluLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIAogICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9xdW5pdC9yYXcvbWFzdGVyL3F1bml0L3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vanF1ZXJ5L3F1bml0L3Jhdy9tYXN0ZXIvcXVuaXQvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CiAKLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KLSAgLy88IVtDREFUQVsKLSAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIikKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCi0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpCi0KLQotICAgIG1vZHVsZSgiQmFzZSBUeXBlcyIpOwotCi0gICAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3RTdHJpbmcoIndvcmtzIiksICJ3b3JrcyIpOwotICAgIH0pOwotICAgIHRlc3QoIlN0cmluZyBVVEYtOCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGxhbmd1YWdlc1V0ZjggPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3RTdHJpbmcobGFuZ3VhZ2VzVXRmOCksIGxhbmd1YWdlc1V0ZjgpOwotICAgIH0pOwotICAgIHRlc3QoIkRvdWJsZSIsIGZ1bmN0aW9uKCkgewotICAgICAgZXF1YWxzKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKLSAgICB9KTsKLSAgICB0ZXN0KCJCeXRlIiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKLSAgICB9KTsKLSAgICB0ZXN0KCJJMzIiLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSksIE1hdGgucG93KDIsMzApKTsKLSAgICB9KTsKLSAgICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSksIE1hdGgucG93KDIsNjApKTsKLSAgICB9KTsKLQotCi0gICAgbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7Ci0KLSAgICB2YXIgaW5zYW5pdHkgID0gbmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKQotICAgIGluc2FuaXR5LnVzZXJNYXBbVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORV0gPSAxCi0gICAgaW5zYW5pdHkudXNlck1hcFtUaHJpZnRUZXN0Lk51bWJlcnouVFdPXSA9IDIKLQotICAgIHZhciB4dHIgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKQotICAgIHh0ci5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJwotICAgIGluc2FuaXR5Lnh0cnVjdHMucHVzaCh4dHIpCi0KLSAgICB2YXIgeHRyMj0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpCi0gICAgeHRyMi5zdHJ1Y3RfdGhpbmcgPSB4dHIKLQotICAgIHZhciBsaXN0ID0gWzEsMiwzXQotCi0gICAgdGVzdCgiU3RydWN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3RTdHJ1Y3QoeHRyKS5zdHJpbmdfdGhpbmcsICJ3b3JrZWQiKTsKLSAgICB9KTsKLSAgICB0ZXN0KCJOZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3ROZXN0KHh0cjIpLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICJ3b3JrZWQiKTsKLSAgICB9KTsKLSAgICB0ZXN0KCJNYXAiLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdE1hcChpbnNhbml0eS51c2VyTWFwKVtUaHJpZnRUZXN0Lk51bWJlcnouT05FXSwgMSk7Ci0gICAgfSk7Ci0gICAgdGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgICAgc2FtZShjbGllbnQudGVzdExpc3QobGlzdCksIGxpc3QpOwotICAgIH0pOwotICAgIHRlc3QoIlNldCIsIGZ1bmN0aW9uKCkgewotICAgICAgc2FtZShjbGllbnQudGVzdFNldChsaXN0KSwgbGlzdCk7Ci0gICAgfSk7Ci0gICAgdGVzdCgiRW51bSIsIGZ1bmN0aW9uKCkgewotICAgICAgZXF1YWxzKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7Ci0gICAgfSk7Ci0KLQotICAgIG1vZHVsZSgiRXhjZXB0aW9uIik7Ci0KLSAgICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgICAgZXhwZWN0KDIpOwotICAgICAgdHJ5ewotICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgIH1jYXRjaChlKXsKLSAgICAgICAgZXF1YWxzKGUuZXJyb3JDb2RlLCAxKTsKLSAgICAgICAgZXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0ZXN0KCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgICAgZXhwZWN0KDEpOwotICAgICAgdHJ5ewotICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLSAgICAgIH1jYXRjaChlKXsKLSAgICAgICAgZXF1YWxzKGUubWVzc2FnZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0ZXN0KCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICAgIGV4cGVjdCgxKTsKLSAgICAgIHRyeXsKLSAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwotICAgICAgfWNhdGNoKGUpewotICAgICAgICBlcXVhbHMoZS5tZXNzYWdlLCAibm8gRXhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLQotICAgIG1vZHVsZSgiSW5zYW5pdHkiKTsKLQotICAgIHRlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5pdHkpOwotICAgICAgZXF1YWxzKHJlc1siMSJdWyIxIl0ueHRydWN0c1swXS5zdHJpbmdfdGhpbmcsICJ3b3JrZWQiKTsKLSAgICB9KTsKLQotICB9KTsKLSAgLy9dXT4KLSAgPC9zY3JpcHQ+Ci0KKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+Ci0gIC8vPCFbQ0RBVEFbCi0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvL1J1biBzYW1lIHRlc3RzIGFzeW5jaHJvbm91c2x5Ci0vKgotICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCi0gIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQotCi0gIGRvY3VtZW50LndyaXRlKCI8aDI+QXN5bmNocm9ub3VzIEV4YW1wbGU8XC9oMj4iKQotICBqUXVlcnkuYWpheCh7Ci0gICAgIHVybDogIi9zZXJ2aWNlIiwKLSAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygyLDMwKSksCi0gICAgIHR5cGU6ICJQT1NUIiwKLSAgICAgY2FjaGU6IGZhbHNlLAotICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICAgICAgdmFyIF90cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpCi0gICAgICAgICAgICB2YXIgX3Byb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2woX3RyYW5zcG9ydCkKLSAgICAgICAgICAgIHZhciBfY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChfcHJvdG9jb2wpCi0KLSAgICAgICAgICAgIF90cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICkKLQotICAgICAgICAgICAgdmFyIHYgPSAgX2NsaWVudC5yZWN2X3Rlc3RJMzIoKQotICAgICAgICAgICAgJCgiI2JvZHkiKS5hcHBlbmQoImNsaWVudC50ZXN0STMyKCkgICAgPT4gIisodiA9PSBNYXRoLnBvdygyLDMwKSkrIjxici8+IikKLQotICAgICB9Ci0gIH0pCi0KLSAgalF1ZXJ5LmFqYXgoewotICAgICB1cmw6ICIvc2VydmljZSIsCi0gICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coMiw2MCkpLAotICAgICB0eXBlOiAiUE9TVCIsCi0gICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgICAgIHZhciBfdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQotICAgICAgICAgICAgdmFyIF9wcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKF90cmFuc3BvcnQpCi0gICAgICAgICAgICB2YXIgX2NsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQoX3Byb3RvY29sKQotCi0gICAgICAgICAgICBfdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApCi0KLSAgICAgICAgICAgIHZhciB2ID0gIF9jbGllbnQucmVjdl90ZXN0STY0KCkKLSAgICAgICAgICAgICQoIiNib2R5IikuYXBwZW5kKCJjbGllbnQudGVzdEk2NCgpICAgID0+ICIrKHYgPT0gTWF0aC5wb3coMiw2MCkpKyI8YnIvPiIpCi0KLSAgICAgfQotICB9KQotKi8KLQotICAvL11dPgotICA8L3NjcmlwdD4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2luY3ViYXRvci90aHJpZnQvdHJ1bmsvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgogICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCiAgIDxwPgogICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwogICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKICAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CiAgIDwvcD4KKyAgLS0+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODZhNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKSBhbmQgalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkKKyAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqCisgKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGgKKyAqIE5vcm1hbCBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIEFsbCBzeW5jaHJvbm91cyB0ZXN0cyBiZWxvbmcKKyAqIGhlcmUuCisgKgorICogQXN5bmNocm9ub3VzIHN1Y2Nlc3MgY2FsbGJhY2tzIHBhc3NlZCBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAqIG9mIGFuIFJQQyBjYWxsIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aCBOb3JtYWwgYW5kIGpRdWVyeQorICogaW50ZXJmYWNlcy4gQXN5bmMgc3VjY2VzcyB0ZXN0cyBiZWxvbmcgaGVyZS4KKyAqCisgKiBBc3luY2hyb25vdXMgZXhjZXB0aW9uIHByb2Nlc3NpbmcgaXMgZGlmZmVyZW50IGluIE5vcm1hbAorICogYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBTdWNoIHRlc3RzIGJlbG9uZyBpbiB0aGUgdGVzdC1ub2pxLmpzCisgKiBvciB0ZXN0LWpxLmpzIGZpbGVzIHJlc3BlY3RpdmVseS4galF1ZXJ5IHNwZWNpZmljIFhIUiBvYmplY3QKKyAqIHRlc3RzIGFsc28gYmVsb25nIGluIHRlc3QtanEuanMuIERvIG5vdCBjcmVhdGUgYW55IGpRdWVyeQorICogZGVwZW5kZW5jaWVzIGluIHRoaXMgZmlsZSBvciBpbiB0ZXN0LW5vanEuanMKKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKiAgICAgIC0tIG9yIC0tCisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LW5vanEuanMgZm9yICItZ2VuIGpzIiBvbmx5IHRlc3RzCisgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKKyAqLworCitjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKK2NvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworY29uc3QgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKy8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgoraWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgeworICAvLyBXaGVuIHVzaW5nIHJlYWwgUVVuaXQgKGZyb24gUGhhbnRvbUpTKSBsb2cgZmFpbHVyZXMgdG8gY29uc29sZQorICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOworICAgICAgaWYgKGRldGFpbHMubWVzc2FnZSkgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIGRldGFpbHMuZXhwZWN0ZWQpOworICAgICAgY29uc29sZS5sb2coJ0FjdHVhbCAgOiAnICsgZGV0YWlscy5hY3R1YWwpOworICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9CisgIH0pOworfQorCisvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Citjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsZXQga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGxldCBiaW5hcnkgPSAnJzsKKyAgICBmb3IgKGxldCB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgfQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShiaW5hcnkpLCBiaW5hcnkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGxldCBiaW5hcnkgPSAnJzsKKyAgICBmb3IgKGxldCB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgfQorICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgKytpKSB7CisgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgIH0KKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZygnJyksICcnKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICB9KTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworCisgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBhc3NlcnQub2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NraXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBjb25zdCBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgbW9kaWZpZWRDbGllbnQucmVjdl90ZXN0U3RydWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OworICAgICAgY29uc3QgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKKworICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIC8vIHJlYWQgWHRydWN0IGRhdGEgd2l0aCBYdHJ1Y3QzCisgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgeHRydWN0My5yZWFkKGlucHV0KTsKKyAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKworICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgcmV0dXJuIHh0cnVjdDM7CisgICAgfTsKKworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICB9OworCisgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworCisKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgZm9yIChsZXQga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgfQorICAgIH0KKworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOworCisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfQorICB9KTsKKworICBRVW5pdC50ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgLy9UaHJpZnRUZXN0IGRvZXMgbm90IGxpc3QgVEV4Y2VwdGlvbiBhcyBhIGxlZ2FsIGV4Y2VwdGlvbiBzbyBpdCB3aWxsCisgICAgLy8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uIG9uIHRoZSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBwcm9wYWdhdGUgYmFjayB0bworICAgIC8vIHRoZSBjbGllbnQuIFRoaXMgdGVzdCBoYXMgYmVlbiBtb2RpZmllZCB0byBlcXVhdGUgdG8gIm5vIGV4Y2VwdGlvbiIKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIC8vYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9CisgICAgYXNzZXJ0Lm9rKHRydWUpOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgY29uc3QgY3JhenkgPSB7CisgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgJ3h0cnVjdHMnOiBbeworICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgfSwKKyAgICB7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgfV0KKyAgfTsKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgJzMnOiBjcmF6eQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjb25zdCByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICB9KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL1J1biBzYW1lIHRlc3RzIGFzeW5jaHJvbm91c2x5CisKK1FVbml0Lm1vZHVsZSgnQXN5bmMnKTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNDE1OTI2NSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLCAzMSksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVmN2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorCitjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworCitleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0geworICB0ZXN0Vm9pZDogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0sCisgIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0Qnl0ZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJMzI6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEkzMignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdERvdWJsZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCaW5hcnk6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEJpbmFyeShcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE5lc3Q6IGZ1bmN0aW9uKG5lc3QsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TmVzdCgnKTsKKyAgICBjb25zb2xlLmxvZyhuZXN0KTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCBuZXN0KTsKKyAgfSwKKyAgdGVzdE1hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U2V0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTZXQoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdExpc3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdExpc3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEVudW0oJyArIHRoaW5nICsgJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0VHlwZWRlZjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0VHlwZWRlZignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RNYXBNYXA6IGZ1bmN0aW9uKGhlbGxvLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgY29uc3QgbWFwbWFwID0gW107CisgICAgY29uc3QgcG9zID0gW107CisgICAgY29uc3QgbmVnID0gW107CisgICAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7CisgIH0sCisgIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7CisgICAgY29uc29sZS5sb2coYXJndW1lbnQpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgY29uc3QgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOworICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKKworICAgIGNvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNyYXp5LnVzZXJNYXAgPSBbXTsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkVJR0hUXSA9IDg7CisgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5GSVZFXSA9IDU7CisgICAgY3JhenkueHRydWN0cyA9IFtnb29kYnllLCBoZWxsb107CisKKyAgICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwID0gW107CisKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKKworICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisKKyAgICBjb25zdCBpbnNhbmUgPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIGNvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOworICAgIGNvbnNvbGUubG9nKGluc2FuZSk7CisgICAgcmVzdWx0KG51bGwsIGluc2FuZSk7CisgIH0sCisgIHRlc3RNdWx0aTogZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJlc3VsdChudWxsLCBoZWxsbyk7CisgIH0sCisgIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJyArIGFyZyArICcpJyk7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdChudWxsKTsKKyAgICB9CisgIH0sCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHJlc3VsdCh4Mik7CisgICAgfQorCisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgfSwKKyAgdGVzdE9uZXdheTogZnVuY3Rpb24oc2xlZXBGb3IsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworICB9Cit9OyAgIC8vVGhyaWZ0VGVzdFN2Y0hhbmRsZXIKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCkBAIC0wLDAgKzEsNjIgQEAKK++7vzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0PgorICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCisgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KHdzX3VyaSk7CisgICAgY29uc3QgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWFzeW5jLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90aHJpZnQuanMgYi9saWIvanMvdGhyaWZ0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ4ZGJmLi4wMDAwMDAwCi0tLSBhL2xpYi9qcy90aHJpZnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIFRocmlmdCA9IHsKLQotICAgIFR5cGUgOiB7Ci0gICAgICAgICJTVE9QIiAgIDogMCwKLSAgICAgICAgIlZPSUQiICAgOiAxLAotICAgICAgICAiQk9PTCIgICA6IDIsCi0gICAgICAgICJCWVRFIiAgIDogMywKLSAgICAgICAgIkkwOCIgICAgOiAzLAotICAgICAgICAiRE9VQkxFIiA6IDQsCi0gICAgICAgICJJMTYiICAgIDogNiwKLSAgICAgICAgIkkzMiIgICAgOiA4LAotICAgICAgICAiSTY0IiAgICA6IDEwLAotICAgICAgICAiU1RSSU5HIiA6IDExLAotICAgICAgICAiVVRGNyIgICA6IDExLAotICAgICAgICAiU1RSVUNUIiA6IDEyLAotICAgICAgICAiTUFQIiAgICA6IDEzLAotICAgICAgICAiU0VUIiAgICA6IDE0LAotICAgICAgICAiTElTVCIgICA6IDE1LAotICAgICAgICAiVVRGOCIgICA6IDE2LAotICAgICAgICAiVVRGMTYiICA6IDE3Ci0gICAgfSwKLQotICAgIE1lc3NhZ2VUeXBlIDogewotICAgICAgICAiQ0FMTCIgICAgICA6IDEsCi0gICAgICAgICJSRVBMWSIgICAgIDogMiwKLSAgICAgICAgIkVYQ0VQVElPTiIgOiAzCi0gICAgfQotfQotCi1UaHJpZnQuVEV4Y2VwdGlvbiA9IHt9Ci1UaHJpZnQuVEV4Y2VwdGlvbi5wcm90b3R5cGUgPSB7IAotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCBtZXNzYWdlLCBjb2RlICkgewotICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHRoaXMuY29kZSAgICA9IChjb2RlID09IG51bGwpID8gMCA6IGNvZGU7Ci0gICAgfQotfQotCi0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewotICAgICJVTktOT1dOIiAgICAgICAgICAgICAgOiAwLAotICAgICJVTktOT1dOX01FVEhPRCIgICAgICAgOiAxLAotICAgICJJTlZBTElEX01FU1NBR0VfVFlQRSIgOiAyLAotICAgICJXUk9OR19NRVRIT0RfTkFNRSIgICAgOiAzLAotICAgICJCQURfU0VRVUVOQ0VfSUQiICAgICAgOiA0LAotICAgICJNSVNTSU5HX1JFU1VMVCIgICAgICAgOiA1ICAgICAgIAotfQotCi1UaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSl7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZQotICAgIHRoaXMuY29kZSAgICA9IChjb2RlID09IG51bGwpID8gMCA6IGNvZGUKLX0KLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUgPSB7IAotICAgICAgIAotICAgIHJlYWQgOiBmdW5jdGlvbihpbnB1dCl7Ci0gICAgICAgIAotICAgICAgICB2YXIgZnR5cGUKLSAgICAgICAgdmFyIGZpZAotICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZFN0cnVjdEJlZ2luKGZuYW1lKSAKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZm5hbWUgPSByZXQuZm5hbWUgICAgICAKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKDEpewotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKHJldC5mdHlwZSA9PSBUVHlwZS5TVE9QKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBmaWQgPSByZXQuZmlkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaChmaWQpewotICAgICAgICAgICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5TVFJJTkcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0LnZhbHVlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5JMzIgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgICA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKQotICAgICAgICAKLSAgICB9LAotICAgIAotICAgIHdyaXRlOiBmdW5jdGlvbihvdXRwdXQpewotICAgICAgICB2YXIgeGZlciAgID0gMDsKLSAgICAgICAgCi0gICAgICAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMuY29kZSkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbigndHlwZScsIFR5cGUuSTMyLCAyKQotICAgICAgICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCkKLSAgICAgICAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCkKLSAgICAgICAKLSAgICB9LAotICAgIAotICAgIGdldENvZGUgOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29kZQotICAgIH0sCi0gICAgCi0gICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlCi0gICAgfQotfQotCi0KLQotLyoqCi0gKklmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBhamF4IG9uIHlvdXIgb3duLgotICpUaGlzIGlzIGhvdyB0byB1c2UganMgYmluZGluZ3MgaW4gYSBhc3luYyBmYXNoaW9uLgotICovCi1UaHJpZnQuVHJhbnNwb3J0ID0gZnVuY3Rpb24odXJsKXsKLSAgICB0aGlzLnVybCAgICAgID0gdXJsCi0gICAgdGhpcy53cG9zICAgICA9IDAKLSAgICB0aGlzLnJwb3MgICAgID0gMAotCi0gICAgdGhpcy5zZW5kX2J1ZiA9ICcnCi0gICAgdGhpcy5yZWN2X2J1ZiA9ICcnCi19Ci0KLVRocmlmdC5UcmFuc3BvcnQucHJvdG90eXBlID0gewotCi0gICAgLy9HZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdAotICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0IDogZnVuY3Rpb24oKSB7Ci0JCi0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKSB9IGNhdGNoKGUpIHt9Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKSB9IGNhdGNoIChlKSB7fQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikgfSBjYXRjaCAoZSkge30KLQotICAgICAgICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgWG1sSHR0cFJlcXVlc3Qgb2JqZWN0LiAgVHJ5IHVwZ3JhZGluZyB0byBGaXJlZm94LiIKLQkKLSAgICB9LAotCi0gICAgZmx1c2ggOiBmdW5jdGlvbigpewotCi0gICAgICAgIC8vYXN5bmMgbW9kZQotICAgICAgICBpZih0aGlzLnVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT0gJycpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKLQotICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKQotICAgICAgICAJCQotICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKQotICAgICAgICAgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCJhcHBsaWNhdGlvbi9qc29uIikKLSAgICAgICAgCi0gICAgICAgIHhyZXEub3BlbigiUE9TVCIsIHRoaXMudXJsLCBmYWxzZSkKLSAgICAgICAgeHJlcS5zZW5kKHRoaXMuc2VuZF9idWYpCi0gICAgICAgIAotICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpCi0gICAgICAgICAgICB0aHJvdyAiZW5jb3VudGVyZWQgYW4gdW5rbm93biBhamF4IHJlYWR5IHN0YXRlOiAiK3hyZXEucmVhZHlTdGF0ZQotICAgICAgICAKLSAgICAgICAgaWYgKHhyZXEuc3RhdHVzICE9IDIwMCkKLSAgICAgICAgICAgIHRocm93ICJlbmNvdW50ZXJlZCBhIHVua25vd24gcmVxdWVzdCBzdGF0dXM6ICIreHJlcS5zdGF0dXMKLQotICAgICAgICB0aGlzLnJlY3ZfYnVmICAgID0geHJlcS5yZXNwb25zZVRleHQKLSAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoCi0gICAgICAgIHRoaXMud3BvcyAgICAgICAgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aAotICAgICAgICB0aGlzLnJwb3MgICAgICAgID0gMAotICAgIH0sCi0KLSAgICBzZXRSZWN2QnVmZmVyIDogZnVuY3Rpb24oYnVmKXsKLSAgICAgICAgdGhpcy5yZWN2X2J1ZiAgICA9IGJ1ZgotICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGgKLSAgICAgICAgdGhpcy53cG9zICAgICAgICA9IHRoaXMucmVjdl9idWYubGVuZ3RoCi0gICAgICAgIHRoaXMucnBvcyAgICAgICAgPSAwCi0gICAgfSwKLQotICAgIGlzT3BlbiA6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgIH0sCi0KLSAgICBvcGVuIDogZnVuY3Rpb24oKSB7fSwKLQotICAgIGNsb3NlOiBmdW5jdGlvbigpIHt9LAotCi0gICAgcmVhZCA6IGZ1bmN0aW9uKGxlbikgewotICAgICAgICB2YXIgYXZhaWwgPSB0aGlzLndwb3MgLSB0aGlzLnJwb3MKLSAgICAgICAKLSAgICAgICAgaWYoYXZhaWwgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAnJwotCi0gICAgICAgIHZhciBnaXZlID0gbGVuCi0KLSAgICAgICAgaWYoYXZhaWwgPCBsZW4pCi0gICAgICAgICAgICBnaXZlID0gYXZhaWwKLQotICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLGdpdmUpCi0gICAgICAgIHRoaXMucnBvcyArPSBnaXZlCi0KLSAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KLSAgICAgICAgcmV0dXJuIHJldAotICAgIH0sCi0KLSAgICByZWFkQWxsIDogZnVuY3Rpb24oKSB7Ci0gICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWYKLSAgICB9LAotCi0gICAgd3JpdGUgOiBmdW5jdGlvbihidWYpewotICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmCi0gICAgfSwKLQotICAgIGdldFNlbmRCdWZmZXIgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZgotICAgIH0KLQotfQotCi0KLQotVGhyaWZ0LlByb3RvY29sID0gZnVuY3Rpb24odHJhbnNwb3J0KXsKLSAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAotfQotCi1UaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVsgVGhyaWZ0LlR5cGUuQk9PTCAgIF0gPSAnInRmIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5CWVRFICAgXSA9ICciaTgiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkkxNiAgICBdID0gJyJpMTYiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkkzMiAgICBdID0gJyJpMzIiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkk2NCAgICBdID0gJyJpNjQiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkRPVUJMRSBdID0gJyJkYmwiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNUUlVDVCBdID0gJyJyZWMiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNUUklORyBdID0gJyJzdHIiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLk1BUCAgICBdID0gJyJtYXAiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkxJU1QgICBdID0gJyJsc3QiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNFVCAgICBdID0gJyJzZXQiJwotCi0KLVRocmlmdC5Qcm90b2NvbC5SVHlwZSA9IHt9Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJ0ZiIgXSA9IFRocmlmdC5UeXBlLkJPT0wKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImk4IiBdID0gVGhyaWZ0LlR5cGUuQllURQotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAiaTE2Il0gPSBUaHJpZnQuVHlwZS5JMTYKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImkzMiJdID0gVGhyaWZ0LlR5cGUuSTMyCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJpNjQiXSA9IFRocmlmdC5UeXBlLkk2NCAKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImRibCJdID0gVGhyaWZ0LlR5cGUuRE9VQkxFIAotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAicmVjIl0gPSBUaHJpZnQuVHlwZS5TVFJVQ1QgCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJzdHIiXSA9IFRocmlmdC5UeXBlLlNUUklORwotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAibWFwIl0gPSBUaHJpZnQuVHlwZS5NQVAgCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJsc3QiXSA9IFRocmlmdC5UeXBlLkxJU1QKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgInNldCJdID0gVGhyaWZ0LlR5cGUuU0VUIAotCi1UaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDEKLQotVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZSA9IHsKLSAgICAKLSAgICBnZXRUcmFuc3BvcnQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQKLSAgICB9LAotCi0gICAgLy9Xcml0ZSBmdW5jdGlvbnMKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiA6IGZ1bmN0aW9uKG5hbWUsbWVzc2FnZVR5cGUsc2VxaWQpewotICAgICAgICB0aGlzLnRzdGFjayA9IG5ldyBBcnJheSgpCi0gICAgICAgIHRoaXMudHBvcyAgID0gbmV3IEFycmF5KCk7Ci0gICAgICAgICAgIAotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiwnIicrbmFtZSsnIicsbWVzc2FnZVR5cGUsc2VxaWRdKTsKLSAgICB9LAotCi0gICAgd3JpdGVNZXNzYWdlRW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgIAotICAgICAgICB0aGlzLndvYmogPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICB0aGlzLndvYmoucHVzaChvYmopCi0gCi0gICAgICAgIHRoaXMud2J1ZiA9ICJbIit0aGlzLndvYmouam9pbigiLCIpKyJdIjsKLQotICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOyAgICAgICAKLSAgICAgfSwKLQotCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiA6IGZ1bmN0aW9uKG5hbWUpewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goe30pCi0gICAgfSwKLQotICAgIHdyaXRlU3RydWN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgCi0gICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCi0gICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXQotICAgICAgICB2YXIgc3RyID0gInsiCi0gICAgICAgIHZhciBmaXJzdCA9IHRydWUKLSAgICAgICAgZm9yKCB2YXIga2V5IGluIHN0cnVjdCApewotICAgICAgICAgICAgaWYoZmlyc3QpIAotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RyICs9ICIsIjsKLQotICAgICAgICAgICAgc3RyICs9IGtleSsiOiIrc3RydWN0W2tleV0KLSAgICAgICAgfSAKLQotICAgICAgICBzdHIgKz0gIn0iCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gc3RyOwotICAgIH0sCi0KLSAgICB3cml0ZUZpZWxkQmVnaW4gOiBmdW5jdGlvbihuYW1lLGZpZWxkVHlwZSxmaWVsZElkKXsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKHsiZmllbGRJZCIgOiAnIicrZmllbGRJZCsnIicsICJmaWVsZFR5cGUiIDogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXX0pOwotICAgICAgIAotICAgIH0sCi0KLSAgICB3cml0ZUZpZWxkRW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHZhbHVlICAgICA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKSAKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHN0YWNrW3RoaXMudHN0YWNrLmxlbmd0aC0xXVtmaWVsZEluZm8uZmllbGRJZF0gPSAieyIrZmllbGRJbmZvLmZpZWxkVHlwZSsiOiIrdmFsdWUrIn0iIAotICAgICAgICB0aGlzLnRwb3MucG9wKCkKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZFN0b3AgOiBmdW5jdGlvbigpewotICAgICAgICAvL25hCi0gICAgfSwKLQotICAgIHdyaXRlTWFwQmVnaW4gOiBmdW5jdGlvbihrZXlUeXBlLHZhbFR5cGUsc2l6ZSl7Ci0gICAgICAgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2tleVR5cGVdLFRocmlmdC5Qcm90b2NvbC5UeXBlW3ZhbFR5cGVdLDBdKSAKLSAgICB9LAotCi0gICAgd3JpdGVNYXBFbmQgOiBmdW5jdGlvbigpewotICAgICAgICB2YXIgcCAgID0gdGhpcy50cG9zLnBvcCgpCi0gICAgICAgIAotICAgICAgICBpZihwID09IHRoaXMudHN0YWNrLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGlmKCh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgJSAyICE9IDApCi0gICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCIiKTsKLQotICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkvMgotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aC0xXSA9IHNpemU7Ci0gICAgICAgIAotICAgICAgICB2YXIgbWFwICAgPSAieyIKLSAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdiA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgICAgICBpZihmaXJzdCl7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgbWFwICs9ICIsIgotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBtYXAgICs9ICciJytrKyciOicrdgotICAgICAgICB9Ci0gICAgICAgIG1hcCArPSAifSIKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKQotICAgICAgICB0aGlzLnRzdGFja1twXSA9ICJbIit0aGlzLnRzdGFja1twXS5qb2luKCIsIikrIl0iCi0gICAgfSwKLQotICAgIHdyaXRlTGlzdEJlZ2luIDogZnVuY3Rpb24oZWxlbVR5cGUsc2l6ZSl7Ci0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCkKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLHNpemVdKTsKLSAgICB9LAotCi0gICAgd3JpdGVMaXN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCkKLQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCsxXQotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHArMSwgMSkKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycrdGhpcy50c3RhY2tbcF0uam9pbigiLCIpKyddJzsKLSAgICB9LAotCi0gICAgd3JpdGVTZXRCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSxzaXplXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlU2V0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCkKLQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCsxXQotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHArMSwgMSkKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycrdGhpcy50c3RhY2tbcF0uam9pbigiLCIpKyddJzsKLSAgICB9LAotCi0gICAgd3JpdGVCb29sIDogZnVuY3Rpb24odmFsdWUpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCB2YWx1ZSA/IDEgOiAwICk7Ci0gICAgfSwKLQotICAgIHdyaXRlQnl0ZSA6IGZ1bmN0aW9uKGk4KXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpOCk7Ci0gICAgfSwKLQotICAgIHdyaXRlSTE2IDogZnVuY3Rpb24oaTE2KXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMTYpOwotICAgIH0sCi0KLSAgICB3cml0ZUkzMiA6IGZ1bmN0aW9uKGkzMil7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKLSAgICB9LAotCi0gICAgd3JpdGVJNjQgOiBmdW5jdGlvbihpNjQpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7Ci0gICAgfSwKLQotICAgIHdyaXRlRG91YmxlIDogZnVuY3Rpb24oZGJsKXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChkYmwpOwotICAgIH0sCi0KLSAgICB3cml0ZVN0cmluZyA6IGZ1bmN0aW9uKHN0cil7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInK2VuY29kZVVSSUNvbXBvbmVudChzdHIpKyciJyk7Ci0gICAgfSwKLQotICAgIHdyaXRlQmluYXJ5IDogZnVuY3Rpb24oc3RyKXsKLSAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpOwotICAgIH0sCi0KLQotICAgIAotICAgIC8vIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiA6IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCl7Ci0gICAgICAgIHRoaXMucnN0YWNrID0gbmV3IEFycmF5KCkKLSAgICAgICAgdGhpcy5ycG9zICAgPSBuZXcgQXJyYXkoKQotICAgICAgIAotICAgICAgICB0aGlzLnJvYmogPSBldmFsKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSkKLSAgICAgICAgCi0gICAgICAgIHZhciByID0ge30gICAgIAotICAgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpCi0gICAgICAgIAotICAgICAgICBpZih2ZXJzaW9uICE9IFRocmlmdC5Qcm90b2NvbC5WZXJzaW9uKXsKLSAgICAgICAgICAgIHRocm93ICJXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogIit2ZXJzaW9uCi0gICAgICAgIH0KLQotICAgICAgICByWyJmbmFtZSJdICA9IHRoaXMucm9iai5zaGlmdCgpCi0gICAgICAgIHJbIm10eXBlIl0gID0gdGhpcy5yb2JqLnNoaWZ0KCkKLSAgICAgICAgclsicnNlcWlkIl0gPSB0aGlzLnJvYmouc2hpZnQoKQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vZ2V0IHRvIHRoZSBtYWluIG9iagotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKQotICAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAKLSAgICByZWFkTWVzc2FnZUVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RCZWdpbiA6IGZ1bmN0aW9uKG5hbWUpewotICAgICAgICB2YXIgciA9IHt9Ci0gICAgICAgIHJbImZuYW1lIl0gPSAnJwotICAgICAgICAKLSAgICAgICAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCi0gICAgICAgIGlmKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXSBpbnN0YW5jZW9mIEFycmF5KQotICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0uc2hpZnQoKSkKLSAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RFbmQgOiBmdW5jdGlvbigpewotICAgICAgICBpZih0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMl0gaW5zdGFuY2VvZiBBcnJheSkKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpCi0gICAgfSwKLQotICAgIHJlYWRGaWVsZEJlZ2luIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgCi0gICAgICAgIHZhciBmaWQgICA9IC0xCi0gICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1AgCi0gICAgICAgIAotICAgICAgICAvL2dldCBhIGZpZWxkSWQKLSAgICAgICAgZm9yKHZhciBmIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0pKXsKLSAgICAgICAgICAgIGlmKGYgPT0gbnVsbCkgY29udGludWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZikKLSAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZpZF0KLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV1bZmlkXQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZpZWxkKSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYoZmlkICE9IC0xKXsgICAgICAKLSAgICAgICAKLSAgICAgICAgICAgIC8vc2hvdWxkIG9ubHkgYmUgMSBvZiB0aGVzZSBidXQgdGhpcyBpcyB0aGUgb25seQotICAgICAgICAgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKLSAgICAgICAgICAgIGZvcih2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdKSl7Ci0gICAgICAgICAgICAgICAgaWYoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdID09IG51bGwgKSBjb250aW51ZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdCi0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZdCi0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgclsiZm5hbWUiXSA9ICcnCi0gICAgICAgIHJbImZ0eXBlIl0gPSBmdHlwZQotICAgICAgICByWyJmaWQiXSAgID0gZmlkCi0gICAgICAgIAotCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRGaWVsZEVuZCA6IGZ1bmN0aW9uKCl7ICAKLSAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKQotICAgICAgICAKLSAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCi0gICAgICAgIHdoaWxlKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAKLSAgICB9LAotCi0gICAgcmVhZE1hcEJlZ2luIDogZnVuY3Rpb24oa2V5VHlwZSx2YWxUeXBlLHNpemUpewotICAgICAgICAKLSAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpCi0gICAgICAgIAotICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICByWyJrdHlwZSJdID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXQotICAgICAgICByWyJ2dHlwZSJdID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXQotICAgICAgICByWyJzaXplIl0gID0gbWFwLnNoaWZ0KCkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMucnN0YWNrLnB1c2gobWFwLnNoaWZ0KCkpCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZE1hcEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCkKLSAgICB9LAotCi0gICAgcmVhZExpc3RCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgCi0gICAgICAgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdCi0gICAgICAKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgclsiZXR5cGUiXSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOwotICAgICAgICByWyJzaXplIiBdID0gbGlzdC5zaGlmdCgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdCkKLSAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRMaXN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKQotICAgIH0sCi0KLSAgICByZWFkU2V0QmVnaW4gOiBmdW5jdGlvbihlbGVtVHlwZSxzaXplKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbihlbGVtVHlwZSxzaXplKQotICAgIH0sCi0KLSAgICByZWFkU2V0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKQotICAgIH0sCi0KLSAgICByZWFkQm9vbCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCkKLSAgICAKLSAgICAgICAgaWYoIHIgIT0gbnVsbCAmJiByWyJ2YWx1ZSJdID09ICIxIiApewotICAgICAgICAgICAgclsidmFsdWUiXSA9IHRydWUKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByWyJ2YWx1ZSJdID0gZmFsc2UKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHIKLSAgICB9LAotCi0gICAgcmVhZEJ5dGUgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCkKLSAgICB9LAotCi0gICAgcmVhZEkxNiA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0gICAKLQotICAgIHJlYWRJMzIgOiBmdW5jdGlvbihmKXsKLSAgICAgICAgaWYoZiA9PSB1bmRlZmluZWQpCi0gICAgICAgICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdCi0gICAgICAgIAotICAgICAgICB2YXIgciA9IHt9ICAgIAotICAgICAgICAgICAgCi0gICAgICAgIGlmKGYgaW5zdGFuY2VvZiBBcnJheSl7Ci0gICAgICAgICAgICBpZihmLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJbInZhbHVlIl0gPSB1bmRlZmluZWQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gZi5zaGlmdCgpCi0KLSAgICAgICAgfWVsc2UgaWYoZiBpbnN0YW5jZW9mIE9iamVjdCl7Ci0gICAgICAgICAgIGZvcih2YXIgaSBpbiBmKXsKLSAgICAgICAgICAgICAgICBpZihpID09IG51bGwpIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKQotICAgICAgICAgICAgICAgIGRlbGV0ZSBmW2ldICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gaQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJbInZhbHVlIl0gPSBmCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRJNjQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCkKLSAgICB9LAotCi0gICAgcmVhZERvdWJsZSA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0KLSAgICByZWFkU3RyaW5nIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKQotICAgICAgICByWyJ2YWx1ZSJdID0gZGVjb2RlVVJJQ29tcG9uZW50KHJbInZhbHVlIl0pCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcgotICAgIH0sCi0KLSAgICByZWFkQmluYXJ5IDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpCi0gICAgfSwKLQotICAgIAotICAgIC8vTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgotICAgIHNraXAgOiBmdW5jdGlvbih0eXBlKXsKLSAgICAgICAgdGhyb3cgInNraXAgbm90IHN1cHBvcnRlZCB5ZXQiCi0gICAgfQotICAgCi19Ci0KLQotCmRpZmYgLS1naXQgYS9saWIvanNvbi9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICAgIHNjaGVtYS5qc29uIFwKKyAgICB0ZXN0CmRpZmYgLS1naXQgYS9saWIvanNvbi9zY2hlbWEuanNvbiBiL2xpYi9qc29uL3NjaGVtYS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNThhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9zY2hlbWEuanNvbgpAQCAtMCwwICsxLDM0NCBAQAoreworICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorCisgICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc2NoZW1hLmpzb24jIiwKKyAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCisKKyAgImRlZmluaXRpb25zIjogeworICAgICJ0eXBlLWlkIjogeworICAgICAgInRpdGxlIjogIkFueSB0eXBlIGlkIChuYW1lKSIsCisgICAgICAiZW51bSI6IFsKKyAgICAgICAgInZvaWQiLAorICAgICAgICAic3RyaW5nIiwKKyAgICAgICAgImJvb2wiLAorICAgICAgICAiYnl0ZSIsCisgICAgICAgICJpOCIsCisgICAgICAgICJpMTYiLAorICAgICAgICAiaTMyIiwKKyAgICAgICAgImk2NCIsCisgICAgICAgICJkb3VibGUiLAorICAgICAgICAibGlzdCIsCisgICAgICAgICJzZXQiLAorICAgICAgICAibWFwIiwKKyAgICAgICAgInVuaW9uIiwKKyAgICAgICAgInN0cnVjdCIsCisgICAgICAgICJiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAiYmFzZS10eXBlIjogeworICAgICAgInRpdGxlIjogIkJhc2UgdHlwZSBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTgiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCisgICAgfSwKKyAgICAibGlzdC10eXBlIjogeworICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImVsZW1UeXBlSWQiOiAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJlbGVtVHlwZSI6ICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiZWxlbVR5cGVJZCIgXQorICAgIH0sCisgICAgIm1hcC10eXBlIjogeworICAgICAgInRpdGxlIjogIk1hcCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibWFwIiBdCisgICAgICAgIH0sCisgICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KKyAgICB9LAorICAgICJzdHJ1Y3QtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QsIHVuaW9uIGFuZCBleGNlcHRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgInVuaW9uIiwgInN0cnVjdCIsICJleGNlcHRpb24iIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJjbGFzcyIgXQorICAgIH0sCisgICAgInR5cGUtZGVzYyI6IHsKKyAgICAgICJ0aXRsZSI6ICJUeXBlIGRlc2NyaXB0b3Igc2NoZW1hIiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJ0eXBlSWQiOiAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJjbGFzcyI6ICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAib25lT2YiOgorICAgICAgICAgIFsKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9iYXNlLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbGlzdC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21hcC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdC10eXBlIiB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAibmFtZS1hbmQtZG9jIjogeworICAgICAgInRpdGxlIjogIk5hbWUgYW5kIGRvY3VtZW50YXRpb24gc3ViLXNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJkb2MiOiB7ICJ0eXBlIjogInN0cmluZyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiIF0KKyAgICB9LAorICAgICJlbnVtIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCAnZW51bScgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm1lbWJlcnMiIF0sCisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAibWVtYmVycyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgICAidmFsdWUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiLCAidmFsdWUiIF0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInR5cGVkZWYiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHR5cGVkZWYgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImNvbnN0YW50IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBjb25zdGFudCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidmFsdWUiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInZhbHVlIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJmaWVsZCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGZpZWxkIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiB7CisgICAgICAgICAgICAgICJlbnVtIjogWyAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAicmVxX291dCIgXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgICAgICJkZWZhdWx0IjogeworICAgICAgICAgICAgICAib25lT2YiOiBbCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJudW1iZXIiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJhcnJheSIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm9iamVjdCIgfQorICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAicmVxdWlyZWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInN0cnVjdCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJpc0V4Y2VwdGlvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgICJpc1VuaW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImZpZWxkcyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9maWVsZCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiaXNFeGNlcHRpb24iLCAiaXNVbmlvbiIsICJmaWVsZHMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInVuaW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCB1bmlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICB9LAorICAgICJleGNlcHRpb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGV4Y2VwdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgIm1pbmltdW0iOiAxLAorICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgfSwKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJleGNlcHRpb24iIF0gfSwKKyAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAibmFtZSIsICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJmdW5jdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAib25ld2F5IjogeworICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXR1cm5UeXBlIjogeworICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJndW1lbnRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4Y2VwdGlvbiIgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAib25ld2F5IiwgImFyZ3VtZW50cyIsICJleGNlcHRpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2aWNlIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJmdW5jdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZnVuY3Rpb24iCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImZ1bmN0aW9ucyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiYW5ub3RhdGlvbnMiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIG9mIGFubm90YXRpb24gbmFtZXMgdG8gdmFsdWVzIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgInR5cGUiOiAib2JqZWN0IiwKKyAgInJlcXVpcmVkIjogWworICAgICJuYW1lIiwKKyAgICAiZW51bXMiLAorICAgICJ0eXBlZGVmcyIsCisgICAgInN0cnVjdHMiLAorICAgICJjb25zdGFudHMiLAorICAgICJzZXJ2aWNlcyIKKyAgXSwKKyAgInByb3BlcnRpZXMiOiB7CisgICAgIm5hbWUiOiB7CisgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgfSwKKyAgICAiaW5jbHVkZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0sCisgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCisgICAgfSwKKyAgICAibmFtZXNwYWNlcyI6IHsKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnVtcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVkZWZzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCisgICAgICB9CisgICAgfSwKKyAgICAic3RydWN0cyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc3RhbnRzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgorICAgICAgfQorICAgIH0sCisgICAgInNlcnZpY2VzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCisgICAgICB9CisgICAgfQorICB9LAorICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorIyBKYXIgdmVyc2lvbnMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCisKKyMgRGVwZW5kZW5jeSB2ZXJzaW9ucworanNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb249Mi4yLjYKKworIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC54bWwgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZhMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxNDQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJKU09OIFNjaGVtYSBUZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KKworICA8ZGVzY3JpcHRpb24+SlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBUZXN0PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbi5qc29uLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9nZW4tanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uc2NoZW1hIiBsb2NhdGlvbj0iJHtqc29uLmRpcn0vc2NoZW1hLmpzb24iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+CisKKyAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC50ZXN0LmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vdGVzdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8IS0tIEdldCBtYXZlbiBkZXBlbmRlbmN5IHZlcnNpb25zIGZyb20gaGVyZSAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMsIG12bi5pbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWtkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtnZW4uanNvbi5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UaHJpZnRUZXN0LnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganNvbjptZXJnZSIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLmpzb24uZGlyfSIvPgorICAgICAgPGFyZyBsaW5lPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1zY2hlbWEsIHZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1zY2hlbWEiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii0tc3ludGF4Ii8+CisgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQtanNvbiIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9UaHJpZnRUZXN0Lmpzb24iLz4KKyAgICA8dmFsaWRhdGUtanNvbiBmaWxlPSIke2dlbi5qc29uLmRpcn0vSW5jbHVkZS5qc29uIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuLmpzb24uZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJta2RpcnMsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJ0ZXN0LmRlcGVuZGVuY3kuamFycyI+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmZnZSIgYXJ0aWZhY3RJZD0ianNvbi1zY2hlbWEtdmFsaWRhdG9yIiB2ZXJzaW9uPSIke2pzb24tc2NoZW1hLXZhbGlkYXRvci52ZXJzaW9ufSIvPgorICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgorCisgICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQubGliLmRpcn0iPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIi8+CisgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICA8L2NvcHk+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsaWRhdGUtanNvbiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiBkZWZhdWx0PSIiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxqYXZhIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgICAgIGRpcj0iJHtqc29uLmRpcn0iCisgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5naXRodWIuZmdlLmpzb25zY2hlbWEubWFpbi5jbGkuTWFpbiIKKyAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgorICAgICAgICA8YXJnIGxpbmU9Ii0tZmFrZXJvb3QgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIvPgorICAgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSJAe2ZpbGV9Ii8+CisgICAgICA8L2phdmE+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbHVhL01ha2VmaWxlLmFtIGIvbGliL2x1YS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBmMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK1NVQkRJUlMgPSAuCisKK2xpYl9MVExJQlJBUklFUyA9IFwKKwkJCWxpYmx1YXNvY2tldC5sYSBcCisJCQlsaWJsdWFsb25nbnVtYmVyLmxhIFwKKwkJCWxpYmx1YWJwYWNrLmxhIFwKKwkJCWxpYmx1YWJpdHdpc2UubGEKKworbGlibHVhc29ja2V0X2xhX1NPVVJDRVMgPSBcCisJCQlzcmMvbHVhc29ja2V0LmMgXAorCQkJc3JjL3Vzb2NrZXQuYworCitub2Jhc2VfaW5jbHVkZV9IRUFERVJTID0gc3JjL3NvY2tldC5oCisKK2xpYmx1YXNvY2tldF9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YXNvY2tldF9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhc29ja2V0X2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCisKK2xpYmx1YWJwYWNrX2xhX1NPVVJDRVMgPSBzcmMvbHVhYnBhY2suYworCitsaWJsdWFicGFja19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJwYWNrX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhICQoTFVBX0xJQikgLWxtCisKK2xpYmx1YWJpdHdpc2VfbGFfU09VUkNFUyA9IHNyYy9sdWFiaXR3aXNlLmMKKworbGlibHVhYml0d2lzZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJpdHdpc2VfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJpdHdpc2VfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworbGlibHVhbG9uZ251bWJlcl9sYV9TT1VSQ0VTID0gXAorCQlzcmMvbHVhbG9uZ251bWJlci5jIFwKKwkJc3JjL2xvbmdudW1iZXJ1dGlscy5jCisKK2xpYmx1YWxvbmdudW1iZXJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFsb25nbnVtYmVyX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFsb25nbnVtYmVyX2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCisKK0VYVFJBX0RJU1QgPSBcCisJCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCQlUQmluYXJ5UHJvdG9jb2wubHVhIFwKKwkJVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBcCisJCVRDb21wYWN0UHJvdG9jb2wubHVhIFwKKwkJVEZyYW1lZFRyYW5zcG9ydC5sdWEgXAorCQlUaHJpZnQubHVhIFwKKwkJVEh0dHBUcmFuc3BvcnQubHVhIFwKKwkJVEpzb25Qcm90b2NvbC5sdWEgXAorCQlUTWVtb3J5QnVmZmVyLmx1YSBcCisJCVRQcm90b2NvbC5sdWEgXAorCQlUU2VydmVyLmx1YSBcCisJCVRTb2NrZXQubHVhIFwKKwkJVFRyYW5zcG9ydC5sdWEKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEJpbmFyeVByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEJpbmFyeVByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlOThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsMjY0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworCitUQmluYXJ5UHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RCaW5hcnlQcm90b2NvbCcsCisgIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgLS0gMHhmZmZmMDAwMAorICBWRVJTSU9OXzEgICAgPSAtMjE0NzQxODExMiwgLS0gMHg4MDAxMDAwMAorICBUWVBFX01BU0sgICAgPSAweDAwMDAwMGZmLAorICBzdHJpY3RSZWFkICAgPSBmYWxzZSwKKyAgc3RyaWN0V3JpdGUgID0gdHJ1ZQorfSkKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKyAgaWYgc2VsZi5zdHJpY3RXcml0ZSB0aGVuCisgICAgc2VsZjp3cml0ZUkzMihsaWJsdWFiaXR3aXNlLmJvcihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xLCB0dHlwZSkpCisgICAgc2VsZjp3cml0ZVN0cmluZyhuYW1lKQorICAgIHNlbGY6d3JpdGVJMzIoc2VxaWQpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgICAgc2VsZjp3cml0ZUJ5dGUodHR5cGUpCisgICAgc2VsZjp3cml0ZUkzMihzZXFpZCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBzZWxmOndyaXRlQnl0ZSh0dHlwZSkKKyAgc2VsZjp3cml0ZUkxNihpZCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKKyAgc2VsZjp3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShrdHlwZSkKKyAgc2VsZjp3cml0ZUJ5dGUodnR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUJ5dGUoZXR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUJ5dGUoZXR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUJvb2woYm9vbCkKKyAgaWYgYm9vbCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUoMSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUJ5dGUoYnl0ZSkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgYnl0ZSkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUkxNihpMTYpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygncycsIGkxNikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUkzMihpMzIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnaScsIGkzMikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUk2NChpNjQpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnbCcsIGk2NCkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnZCcsIGR1YikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVN0cmluZyhzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSTMyKHN0cmluZy5sZW4oc3RyKSkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNZXNzYWdlQmVnaW4oKQorICBsb2NhbCBzeiwgdHR5cGUsIG5hbWUsIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgaWYgc3ogPCAwIHRoZW4KKyAgICBsb2NhbCB2ZXJzaW9uID0gbGlibHVhYml0d2lzZS5iYW5kKHN6LCBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLKQorICAgIGlmIHZlcnNpb24gfj0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB0aGVuCisgICAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgICAgbWVzc2FnZSA9ICdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAnIC4uIHN6CisgICAgICB9KQorICAgIGVuZAorICAgIHR0eXBlID0gbGlibHVhYml0d2lzZS5iYW5kKHN6LCBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLKQorICAgIG5hbWUgPSBzZWxmOnJlYWRTdHJpbmcoKQorICAgIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgZWxzZQorICAgIGlmIHNlbGYuc3RyaWN0UmVhZCB0aGVuCisgICAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gJ05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJ30pCisgICAgZW5kCisgICAgbmFtZSA9IHNlbGYudHJhbnM6cmVhZEFsbChzeikKKyAgICB0dHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgZW5kCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZE1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIHR0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybiBuaWwsIHR0eXBlLCAwCisgIGVuZAorICBsb2NhbCBpZCA9IHNlbGY6cmVhZEkxNigpCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBsb2NhbCBrdHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCB2dHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSTMyKCkKKyAgcmV0dXJuIGt0eXBlLCB2dHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZExpc3RCZWdpbigpCisgIGxvY2FsIGV0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZExpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU2V0QmVnaW4oKQorICBsb2NhbCBldHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSTMyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIGJ5dGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgaWYgYnl0ZSA9PSAwIHRoZW4KKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCisgIHJldHVybiB0cnVlCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRCeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTE2KCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgyKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdzJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTMyKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg0KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdsJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdkJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU3RyaW5nKCkKKyAgbG9jYWwgbGVuID0gc2VsZjpyZWFkSTMyKCkKKyAgbG9jYWwgc3RyID0gc2VsZi50cmFuczpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHN0cgorZW5kCisKK1RCaW5hcnlQcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RCaW5hcnlQcm90b2NvbEZhY3RvcnknLAorICBzdHJpY3RSZWFkID0gZmFsc2UKK30KKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykKKyAgLS0gVE9ETyBFbmZvcmNlIHRoYXQgdGhpcyBtdXN0IGJlIGEgdHJhbnNwb3J0IGNsYXNzIChpZSBub3QgYSBib29sKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMsCisgICAgc3RyaWN0UmVhZCA9IHNlbGYuc3RyaWN0UmVhZCwKKyAgICBzdHJpY3RXcml0ZSA9IHRydWUKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZjRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVEJ1ZmZlcmVkVHJhbnNwb3J0JywKKyAgckJ1ZlNpemUgPSAyMDQ4LAorICB3QnVmU2l6ZSA9IDIwNDgsCisgIHdCdWYgPSAnJywKKyAgckJ1ZiA9ICcnCit9CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlLm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0Om9wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczpvcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6Y2xvc2UoKQorICByZXR1cm4gc2VsZi50cmFuczpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OnJlYWQobGVuKQorICByZXR1cm4gc2VsZi50cmFuczpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6cmVhZEFsbChsZW4pCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWRBbGwobGVuKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDp3cml0ZShidWYpCisgIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiAuLiBidWYKKyAgaWYgc3RyaW5nLmxlbihzZWxmLndCdWYpID49IHNlbGYud0J1ZlNpemUgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoc2VsZi53QnVmKQorICAgIHNlbGYud0J1ZiA9ICcnCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpmbHVzaCgpCisgIGlmIHN0cmluZy5sZW4oc2VsZi53QnVmKSA+IDAgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoc2VsZi53QnVmKQorICAgIHNlbGYud0J1ZiA9ICcnCisgIGVuZAorZW5kCisKK1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeScKK30KKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQnVmZmVyZWRUcmFuc3BvcnQ6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpAQCAtMCwwICsxLDQ1NyBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RQcm90b2NvbCcKK3JlcXVpcmUgJ2xpYmx1YWJwYWNrJworcmVxdWlyZSAnbGlibHVhYml0d2lzZScKK3JlcXVpcmUgJ2xpYmx1YWxvbmdudW1iZXInCisKK1RDb21wYWN0UHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RDb21wYWN0UHJvdG9jb2wnLAorICBDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHg4MiwKKyAgQ09NUEFDVF9WRVJTSU9OICAgICAgICAgICA9IDEsCisgIENPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmLAorICBDT01QQUNUX1RZUEVfTUFTSyAgICAgICAgID0gMHhFMCwKKyAgQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1LAorCisgIC0tIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgIC0tIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgIGxhc3RGaWVsZCA9IHt9LAorICBsYXN0RmllbGRJZCA9IDAsCisgIGxhc3RGaWVsZEluZGV4ID0gMSwKKworICAtLSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgLS0gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICBib29sZWFuRmllbGROYW1lICAgID0gIiIsCisgIGJvb2xlYW5GaWVsZElkICAgICAgPSAwLAorICBib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UsCisKKyAgLS0gSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgIC0tIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorICBib29sVmFsdWUgICAgICAgICAgPSBmYWxzZSwKKyAgYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UsCit9KQorCitUQ29tcGFjdFR5cGUgPSB7CisgIENPTVBBQ1RfQk9PTEVBTl9UUlVFICA9IDB4MDEsCisgIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgIENPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMsCisgIENPTVBBQ1RfSTE2ICAgICAgICAgICA9IDB4MDQsCisgIENPTVBBQ1RfSTMyICAgICAgICAgICA9IDB4MDUsCisgIENPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYsCisgIENPTVBBQ1RfRE9VQkxFICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfQklOQVJZICAgICAgICA9IDB4MDgsCisgIENPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDksCisgIENPTVBBQ1RfU0VUICAgICAgICAgICA9IDB4MEEsCisgIENPTVBBQ1RfTUFQICAgICAgICAgICA9IDB4MEIsCisgIENPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKK30KKworVFR5cGVUb0NvbXBhY3RUeXBlID0ge30KK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVE9QXSAgID0gVFR5cGUuU1RPUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkJPT0xdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5CWVRFXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkkxNl0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTYKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JMzJdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTY0XSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0k2NAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkRPVUJMRV0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVFJJTkddID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTElTVF0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0xJU1QKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TRVRdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTUFQXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX01BUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUUlVDVF0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1QKKworQ29tcGFjdFR5cGVUb1RUeXBlID0ge30KK0NvbXBhY3RUeXBlVG9UVHlwZVtUVHlwZS5TVE9QXSAgICAgICAgICAgICAgICAgICAgICAgID0gVFR5cGUuU1RPUAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURV0gICAgICAgICA9IFRUeXBlLkJZVEUKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTZdICAgICAgICAgID0gVFR5cGUuSTE2CitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyXSAgICAgICAgICA9IFRUeXBlLkkzMgorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0k2NF0gICAgICAgICAgPSBUVHlwZS5JNjQKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEVdICAgICAgID0gVFR5cGUuRE9VQkxFCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZXSAgICAgICA9IFRUeXBlLlNUUklORworQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0xJU1RdICAgICAgICAgPSBUVHlwZS5MSVNUCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUXSAgICAgICAgICA9IFRUeXBlLlNFVAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX01BUF0gICAgICAgICAgPSBUVHlwZS5NQVAKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1RdICAgICAgID0gVFR5cGUuU1RSVUNUCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVzZXRMYXN0RmllbGQoKQorICBzZWxmLmxhc3RGaWVsZCA9IHt9CisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSAxCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpwYWNrQ29tcGFjdFR5cGUoa3R5cGUsIHZ0eXBlKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwoa3R5cGUsIDQpLCB2dHlwZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKyAgc2VsZjp3cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1BST1RPQ09MX0lEKQorICBzZWxmOndyaXRlQnl0ZShsaWJsdWFicGFjay5wYWNrTWVzZ1R5cGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT04sCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT05fTUFTSyx0dHlwZSwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQsCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1RZUEVfTUFTSykpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihzZXFpZCkKKyAgc2VsZjp3cml0ZVN0cmluZyhuYW1lKQorICBzZWxmOnJlc2V0TGFzdEZpZWxkKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4ICsgMQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RydWN0RW5kKCkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggLSAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBpZCkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgc2VsZi5ib29sZWFuRmllbGROYW1lID0gbmFtZQorICAgIHNlbGYuYm9vbGVhbkZpZWxkSWQgICA9IGlkCisgICAgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nID0gdHJ1ZQorICBlbHNlCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIC0xKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZFN0b3AoKQorICBzZWxmOndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBpZiBzaXplID09IDAgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKDApCisgIGVsc2UKKyAgICBzZWxmOndyaXRlVmFyaW50MzIoc2l6ZSkKKyAgICBzZWxmOndyaXRlQnl0ZShzZWxmOnBhY2tDb21wYWN0VHlwZShUVHlwZVRvQ29tcGFjdFR5cGVba3R5cGVdLCBUVHlwZVRvQ29tcGFjdFR5cGVbdnR5cGVdKSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGxvY2FsIHZhbHVlID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRQorICBpZiBib29sIHRoZW4KKyAgICB2YWx1ZSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorICBlbmQKKyAgcHJpbnQodmFsdWUsc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nLHNlbGYuYm9vbGVhbkZpZWxkSWQpCisgIGlmIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyB0aGVuCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChzZWxmLmJvb2xlYW5GaWVsZE5hbWUsIFRUeXBlLkJPT0wsIHNlbGYuYm9vbGVhbkZpZWxkSWQsIHZhbHVlKQorICAgIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh2YWx1ZSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJ5dGUoYnl0ZSkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgYnl0ZSkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBzZWxmOndyaXRlVmFyaW50MzIobGlibHVhYnBhY2suaTMyVG9aaWd6YWcoaTE2KSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgc2VsZjp3cml0ZVZhcmludDMyKGxpYmx1YWJwYWNrLmkzMlRvWmlnemFnKGkzMikpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUk2NChpNjQpCisgIHNlbGY6d3JpdGVWYXJpbnQ2NChsaWJsdWFicGFjay5pNjRUb1ppZ3phZyhpNjQpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVEb3VibGUoZHViKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2QnLCBkdWIpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVCaW5hcnkoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZVZhcmludDMyKHN0cmluZy5sZW4oc3RyKSkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIHR5cGVPdmVycmlkZSkKKyAgaWYgdHlwZU92ZXJyaWRlID09IC0xIHRoZW4KKyAgICB0eXBlT3ZlcnJpZGUgPSBUVHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdCisgIGVuZAorICBsb2NhbCBvZmZzZXQgPSBpZCAtIHNlbGYubGFzdEZpZWxkSWQKKyAgaWYgaWQgPiBzZWxmLmxhc3RGaWVsZElkIGFuZCBvZmZzZXQgPD0gMTUgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKG9mZnNldCwgNCksIHR5cGVPdmVycmlkZSkpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh0eXBlT3ZlcnJpZGUpCisgICAgc2VsZjp3cml0ZUkxNihpZCkKKyAgZW5kCisgIHNlbGYubGFzdEZpZWxkSWQgPSBpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCisgIGlmIHNpemUgPD0gMTQgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKHNpemUsIDQpLCBUVHlwZVRvQ29tcGFjdFR5cGVbZXR5cGVdKSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKDB4ZjAsIFRUeXBlVG9Db21wYWN0VHlwZVtldHlwZV0pKQorICAgIHNlbGY6d3JpdGVWYXJpbnQzMihzaXplKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlVmFyaW50MzIoaTMyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgbG9jYWwgc3RyID0gbGlibHVhYnBhY2sudG9WYXJpbnQzMihpMzIpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVWYXJpbnQ2NChpNjQpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBsb2NhbCBzdHIgPSBsaWJsdWFicGFjay50b1ZhcmludDY0KGk2NCkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgbG9jYWwgcHJvdG9jb2xJZCA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgaWYgcHJvdG9jb2xJZCB+PSBzZWxmLkNPTVBBQ1RfUFJPVE9DT0xfSUQgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiIC4uIHNlbGYuQ09NUEFDVF9QUk9UT0NPTF9JRCAuLiAiIGJ1dCBnb3QgIiAuLiBwcm90b2NvbElkfSkKKyAgZW5kCisgIGxvY2FsIHZlcnNpb25BbmRUeXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCB2ZXJzaW9uID0gbGlibHVhYml0d2lzZS5iYW5kKHZlcnNpb25BbmRUeXBlLCBzZWxmLkNPTVBBQ1RfVkVSU0lPTl9NQVNLKQorICBsb2NhbCB0dHlwZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cih2ZXJzaW9uQW5kVHlwZSwKKyAgICBzZWxmLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpLCBzZWxmLkNPTVBBQ1RfVFlQRV9CSVRTKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuQ09NUEFDVF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgdmVyc2lvbiAiIC4uIHNlbGYuQ09NUEFDVF9WRVJTSU9OIC4uICIgYnV0IGdvdCAiIC4uIHZlcnNpb259KQorICBlbmQKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRTdHJpbmcoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggKyAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCAtIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIGZpZWxkX2FuZF90dHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOmdldFRUeXBlKGZpZWxkX2FuZF90dHlwZSkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuIG5pbCwgdHR5cGUsIDAKKyAgZW5kCisgIC0tIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbG9jYWwgbW9kaWZpZXIgPSBsaWJsdWFiaXR3aXNlLnNoaWZ0cihsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweGYwKSwgNCkKKyAgbG9jYWwgaWQgPSAwCisgIGlmIG1vZGlmaWVyID09IDAgdGhlbgorICAgIGlkID0gc2VsZjpyZWFkSTE2KCkKKyAgZWxzZQorICAgIGlkID0gc2VsZi5sYXN0RmllbGRJZCArIG1vZGlmaWVyCisgIGVuZAorICBpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBib29sVmFsdWUgPSBsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweDBmKSA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKKyAgICBib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisgIGVuZAorICBzZWxmLmxhc3RGaWVsZElkID0gaWQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEJlZ2luKCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgaWYgc2l6ZSA8IDAgdGhlbgorICAgIHJldHVybiBuaWwsbmlsLG5pbAorICBlbmQKKyAgbG9jYWwga3Z0eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBrdHlwZSA9IHNlbGY6Z2V0VFR5cGUobGlibHVhYml0d2lzZS5zaGlmdHIoa3Z0eXBlLCA0KSkKKyAgbG9jYWwgdnR5cGUgPSBzZWxmOmdldFRUeXBlKGt2dHlwZSkKKyAgcmV0dXJuIGt0eXBlLCB2dHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgbG9jYWwgc2l6ZV9hbmRfdHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgc2l6ZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cihzaXplX2FuZF90eXBlLCA0KSwgMHgwZikKKyAgaWYgc2l6ZSA9PSAxNSB0aGVuCisgICAgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgZW5kCisgIGlmIHNpemUgPCAwIHRoZW4KKyAgICByZXR1cm4gbmlsLG5pbAorICBlbmQKKyAgbG9jYWwgZXR5cGUgPSBzZWxmOmdldFRUeXBlKGxpYmx1YWJpdHdpc2UuYmFuZChzaXplX2FuZF90eXBlLCAweDBmKSkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2V0QmVnaW4oKQorICByZXR1cm4gc2VsZjpyZWFkTGlzdEJlZ2luKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJvb2woKQorICBpZiBib29sVmFsdWVJc05vdE51bGwgdGhlbgorICAgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKyAgICByZXR1cm4gYm9vbFZhbHVlCisgIGVuZAorICBsb2NhbCB2YWwgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGlmIHZhbCA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVuZAorICByZXR1cm4gZmFsc2UKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdDJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRJMzIoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkzMigpCisgIGxvY2FsIHYgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIHZhbHVlID0gbGlibHVhYnBhY2suemlnemFnVG9JMzIodikKKyAgcmV0dXJuIHZhbHVlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgdmFsdWUgPSBzZWxmOnJlYWRWYXJpbnQ2NCgpCisgIHJldHVybiB2YWx1ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoOCkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnZCcsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkQmluYXJ5KCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCaW5hcnkoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBpZiBzaXplIDw9IDAgdGhlbgorICAgIHJldHVybiAiIgorICBlbmQKKyAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZEFsbChzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICBsb2NhbCByZXN1bHQgPSAwCisgIHdoaWxlIHRydWUgZG8KKyAgICBiID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgcmVzdWx0ID0gbGlibHVhYml0d2lzZS5ib3IocmVzdWx0LAorICAgICAgICAgICAgIGxpYmx1YWJpdHdpc2Uuc2hpZnRsKGxpYmx1YWJpdHdpc2UuYmFuZChiLCAweDdmKSwgc2hpZnRsKSkKKyAgICBpZiBsaWJsdWFiaXR3aXNlLmJhbmQoYiwgMHg4MCkgfj0gMHg4MCB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRWYXJpbnQ2NCgpCisgIGxvY2FsIHJlc3VsdCA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIGxvY2FsIGRhdGEgPSByZXN1bHQoMCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICB3aGlsZSB0cnVlIGRvCisgICAgYiA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIGVuZEZsYWcsIGRhdGEgPSBsaWJsdWFicGFjay5mcm9tVmFyaW50NjQoYiwgc2hpZnRsLCBkYXRhKQorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgICBpZiBlbmRGbGFnID09IDAgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBkYXRhCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpnZXRUVHlwZShjdHlwZSkKKyAgcmV0dXJuIENvbXBhY3RUeXBlVG9UVHlwZVtsaWJsdWFiaXR3aXNlLmJhbmQoY3R5cGUsIDB4MGYpXQorZW5kCisKK1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhlMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDExOCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RUcmFuc3BvcnQnCityZXF1aXJlICdsaWJsdWFicGFjaycKKworVEZyYW1lZFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RGcmFtZWRUcmFuc3BvcnQnLAorICBkb1JlYWQgPSB0cnVlLAorICBkb1dyaXRlID0gdHJ1ZSwKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycKK30KKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlLm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDppc09wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczppc09wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6Y2xvc2UoKQorICByZXR1cm4gc2VsZi50cmFuczpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X19yZWFkRnJhbWUoKQorICBlbmQKKworICBpZiBzZWxmLmRvUmVhZCA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZChsZW4pCisgIGVuZAorCisgIGlmIGxlbiA+IHN0cmluZy5sZW4oc2VsZi5yQnVmKSB0aGVuCisgICAgbG9jYWwgdmFsID0gc2VsZi5yQnVmCisgICAgc2VsZi5yQnVmID0gJycKKyAgICByZXR1cm4gdmFsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6X19yZWFkRnJhbWUoKQorICBsb2NhbCBidWYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoNCkKKyAgbG9jYWwgZnJhbWVfbGVuID0gbGlibHVhYnBhY2suYnVucGFjaygnaScsIGJ1ZikKKyAgc2VsZi5yQnVmID0gc2VsZi50cmFuczpyZWFkQWxsKGZyYW1lX2xlbikKK2VuZAorCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIHNlbGYuZG9Xcml0ZSA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6d3JpdGUoYnVmLCBsZW4pCisgIGVuZAorCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6Zmx1c2goKQorICBpZiBzZWxmLmRvV3JpdGUgPT0gZmFsc2UgdGhlbgorICAgIHJldHVybiBzZWxmLnRyYW5zOmZsdXNoKCkKKyAgZW5kCisKKyAgLS0gSWYgdGhlIHdyaXRlIGZhaWxzIHdlIHN0aWxsIHdhbnQgd0J1ZiB0byBiZSBjbGVhcgorICBsb2NhbCB0bXAgPSBzZWxmLndCdWYKKyAgc2VsZi53QnVmID0gJycKKyAgbG9jYWwgZnJhbWVfbGVuX2J1ZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCJpIiwgc3RyaW5nLmxlbih0bXApKQorICB0bXAgPSBmcmFtZV9sZW5fYnVmIC4uIHRtcAorICBzZWxmLnRyYW5zOndyaXRlKHRtcCkKKyAgc2VsZi50cmFuczpmbHVzaCgpCitlbmQKKworVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRGcmFtZWRUcmFuc3BvcnQ6bmV3e3RyYW5zID0gdHJhbnN9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsMTgyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVEh0dHBUcmFuc3BvcnQgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydCcsCisgIHBhdGggPSAnLycsCisgIHdCdWYgPSAnJywKKyAgckJ1ZiA9ICcnLAorICBDUkxGID0gJ1xyXG4nLAorICBWRVJTSU9OID0gdmVyc2lvbiwKKyAgaXNTZXJ2ZXIgPSB0cnVlCit9CisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDppc09wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczppc09wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om9wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczpvcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHNlbGY6cmVhZChsZW4pCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6cmVhZChsZW4pCisgIGlmIHN0cmluZy5sZW4oc2VsZi5yQnVmKSA9PSAwIHRoZW4KKyAgICBzZWxmOl9yZWFkTXNnKCkKKyAgZW5kCisgIGlmIGxlbiA+IHN0cmluZy5sZW4oc2VsZi5yQnVmKSB0aGVuCisgICAgbG9jYWwgdmFsID0gc2VsZi5yQnVmCisgICAgc2VsZi5yQnVmID0gJycKKyAgICByZXR1cm4gdmFsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Ol9yZWFkTXNnKCkKKyAgd2hpbGUgdHJ1ZSBkbworICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWQoNCkKKyAgICBpZiBzdHJpbmcuZmluZChzZWxmLnJCdWYsIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYpIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICBpZiBub3Qgc2VsZi5yQnVmIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKyAgc2VsZjpnZXRMaW5lKCkKKyAgbG9jYWwgaGVhZGVycyA9IHNlbGY6X3BhcnNlSGVhZGVycygpCisgIGlmIG5vdCBoZWFkZXJzIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKworICBsb2NhbCBsZW5ndGggPSB0b251bWJlcihoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQorICBpZiBsZW5ndGggdGhlbgorICAgIGxlbmd0aCA9IGxlbmd0aCAtIHN0cmluZy5sZW4oc2VsZi5yQnVmKQorICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWRBbGwobGVuZ3RoKQorICBlbmQKKyAgaWYgc2VsZi5yQnVmID09IG5pbCB0aGVuCisgICAgc2VsZi5yQnVmID0gIiIKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Z2V0TGluZSgpCisgIGxvY2FsIGEsYiA9IHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGKQorICBsb2NhbCBsaW5lID0gIiIKKyAgaWYgYSBhbmQgYiB0aGVuCisgICAgbGluZSA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBhLTEpCisgICAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGIrMSkKKyAgZW5kCisgIHJldHVybiBsaW5lCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3BhcnNlSGVhZGVycygpCisgIGxvY2FsIGhlYWRlcnMgPSB7fQorCisgIHJlcGVhdAorICAgIGxvY2FsIGxpbmUgPSBzZWxmOmdldExpbmUoKQorICAgIGZvciBrZXksIHZhbCBpbiBzdHJpbmcuZ21hdGNoKGxpbmUsICIoWyV3JS1dKyklcyo6JXMqKC4rKSIpIGRvCisgICAgICBpZiBoZWFkZXJzW2tleV0gdGhlbgorICAgICAgICBsb2NhbCBkZWxpbWl0ZXIgPSAiLCAiCisgICAgICAgIGlmIGtleSA9PSAiU2V0LUNvb2tpZSIgdGhlbgorICAgICAgICAgIGRlbGltaXRlciA9ICI7ICIKKyAgICAgICAgZW5kCisgICAgICAgIGhlYWRlcnNba2V5XSA9IGhlYWRlcnNba2V5XSAuLiBkZWxpbWl0ZXIgLi4gdG9zdHJpbmcodmFsKQorICAgICAgZWxzZQorICAgICAgICBoZWFkZXJzW2tleV0gPSB0b3N0cmluZyh2YWwpCisgICAgICBlbmQKKyAgICBlbmQKKyAgdW50aWwgc3RyaW5nLmZpbmQobGluZSwgIl4lcyokIikKKworICByZXR1cm4gaGVhZGVycworZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlKGJ1ZiwgbGVuKQorICBpZiBsZW4gYW5kIGxlbiA8IHN0cmluZy5sZW4oYnVmKSB0aGVuCisgICAgYnVmID0gc3RyaW5nLnN1YihidWYsIDAsIGxlbikKKyAgZW5kCisgIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiAuLiBidWYKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDp3cml0ZUh0dHBIZWFkZXIoY29udGVudF9sZW4pCisgIGlmIHNlbGYuaXNTZXJ2ZXIgdGhlbgorICAgIGxvY2FsIGhlYWRlciA9ICAiSFRUUC8xLjEgMjAwIE9LIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJTZXJ2ZXI6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZWxzZQorICAgIGxvY2FsIGhlYWRlciA9ICJQT1NUICIgLi4gc2VsZi5wYXRoIC4uICIgSFRUUC8xLjEiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkhvc3Q6ICIgLi4gc2VsZi50cmFucy5ob3N0IC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQgIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJVc2VyLUFnZW50OiBUaHJpZnQvIiAuLiBzZWxmLlZFUlNJT04gLi4gIiAoTHVhL1RIdHRwQ2xpZW50KSIKKyAgICAgIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Zmx1c2goKQorICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCisgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgorICBzZWxmLndCdWYgPSAnJworICBzZWxmOndyaXRlSHR0cEhlYWRlcihzdHJpbmcubGVuKHRtcCkpCisgIHNlbGYudHJhbnM6d3JpdGUodG1wKQorICBzZWxmLnRyYW5zOmZsdXNoKCkKK2VuZAorCitUSHR0cFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEh0dHBUcmFuc3BvcnRGYWN0b3J5JworfQorZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEh0dHBUcmFuc3BvcnQ6bmV3e3RyYW5zID0gdHJhbnN9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDhlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsNzI3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIiksIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworCitUSlNPTlByb3RvY29sID0gX19UT2JqZWN0Lm5ldyhUUHJvdG9jb2xCYXNlLCB7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sJywKKyAgVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEsCisgIGpzb25Db250ZXh0ID0ge30sCisgIGpzb25Db250ZXh0VmFsID0ge2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSB0cnVlfSwKKyAganNvbkNvbnRleHRJbmRleCA9IDEsCisgIGhhc1JlYWRCeXRlID0gIiIKK30pCisKK1RUeXBlVG9TdHJpbmcgPSB7fQorVFR5cGVUb1N0cmluZ1tUVHlwZS5CT09MXSAgID0gInRmIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5CWVRFXSAgID0gImk4IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMTZdICAgID0gImkxNiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTMyXSAgICA9ICJpMzIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkk2NF0gICAgPSAiaTY0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5ET1VCTEVdID0gImRibCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSSU5HXSA9ICJzdHIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLlNUUlVDVF0gPSAicmVjIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5MSVNUXSAgID0gImxzdCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU0VUXSAgICA9ICJzZXQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLk1BUF0gICAgPSAibWFwIgorCitTdHJpbmdUb1RUeXBlID0geworICB0ZiAgPSBUVHlwZS5CT09MLAorICBpOCAgPSBUVHlwZS5CWVRFLAorICBpMTYgPSBUVHlwZS5JMTYsCisgIGkzMiA9IFRUeXBlLkkzMiwKKyAgaTY0ID0gVFR5cGUuSTY0LAorICBkYmwgPSBUVHlwZS5ET1VCTEUsCisgIHN0ciA9IFRUeXBlLlNUUklORywKKyAgcmVjID0gVFR5cGUuU1RSVUNULAorICBtYXAgPSBUVHlwZS5NQVAsCisgIHNldCA9IFRUeXBlLlNFVCwKKyAgbHN0ID0gVFR5cGUuTElTVAorfQorCitKU09OTm9kZSA9IHsKKyAgT2JqZWN0QmVnaW4gPSAneycsCisgIE9iamVjdEVuZCA9ICd9JywKKyAgQXJyYXlCZWdpbiA9ICdbJywKKyAgQXJyYXlFbmQgPSAnXScsCisgIFBhaXJTZXBhcmF0b3IgPSAnOicsCisgIEVsZW1TZXBhcmF0b3IgPSAnLCcsCisgIEJhY2tzbGFzaCA9ICdcXCcsCisgIFN0cmluZ0RlbGltaXRlciA9ICciJywKKyAgWmVyb0NoYXIgPSAnMCcsCisgIEVzY2FwZUNoYXIgPSAndScsCisgIE5hbiA9ICdOYU4nLAorICBJbmZpbml0eSA9ICdJbmZpbml0eScsCisgIE5lZ2F0aXZlSW5maW5pdHkgPSAnLUluZmluaXR5JywKKyAgRXNjYXBlQ2hhcnMgPSAiXCJcXGJmbnJ0IiwKKyAgRXNjYXBlUHJlZml4ID0gIlxcdTAwIgorfQorCitFc2NhcGVDaGFyVmFscyA9IHsKKyAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnCit9CisKK0pTT05DaGFyVGFibGUgPSB7CisgIC0tMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCA5OCwxMTYsMTEwLCAgMCwxMDIsMTE0LCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwzNCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCit9CisKKy0tIGNoYXJhY3RlciB0YWJsZSBzdHJpbmcKK2xvY2FsIGI9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nCisKKy0tIGVuY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKGRhdGEpCisgICAgcmV0dXJuICgoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkgCisgICAgICAgIGxvY2FsIHIsYj0nJyx4OmJ5dGUoKQorICAgICAgICBmb3IgaT04LDEsLTEgZG8gcj1yLi4oYiUyXmktYiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpLi4nMDAwMCcpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggPCA2KSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgYz0wCisgICAgICAgIGZvciBpPTEsNiBkbyBjPWMrKHg6c3ViKGksaSk9PScxJyBhbmQgMl4oNi1pKSBvciAwKSBlbmQKKyAgICAgICAgcmV0dXJuIGI6c3ViKGMrMSxjKzEpCisgICAgZW5kKS4uKHsgJycsICc9PScsICc9JyB9KVsjZGF0YSUzKzFdKQorZW5kCisKKy0tIGRlY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZGVjb2RlKGRhdGEpCisgICAgZGF0YSA9IHN0cmluZy5nc3ViKGRhdGEsICdbXicuLmIuLic9XScsICcnKQorICAgIHJldHVybiAoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKHggPT0gJz0nKSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgcixmPScnLChiOmZpbmQoeCktMSkKKyAgICAgICAgZm9yIGk9NiwxLC0xIGRvIHI9ci4uKGYlMl5pLWYlMl4oaS0xKT4wIGFuZCAnMScgb3IgJzAnKSBlbmQKKyAgICAgICAgcmV0dXJuIHI7CisgICAgZW5kKTpnc3ViKCclZCVkJWQ/JWQ/JWQ/JWQ/JWQ/JWQ/JywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKCN4IH49IDgpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw4IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig4LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXIoYykKKyAgICBlbmQpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVzZXRDb250ZXh0KCkKKyAgc2VsZi5qc29uQ29udGV4dCA9IHt9CisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9CisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IDEKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmNvbnRleHRQdXNoKGNvbnRleHQpCisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IHNlbGYuanNvbkNvbnRleHRJbmRleCArIDEKKyAgc2VsZi5qc29uQ29udGV4dFtzZWxmLmpzb25Db250ZXh0SW5kZXhdID0gc2VsZi5qc29uQ29udGV4dFZhbAorICBzZWxmLmpzb25Db250ZXh0VmFsID0gY29udGV4dAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFBvcCgpCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4IC0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6ZXNjYXBlTnVtKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICByZXR1cm4gc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbgorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlBhaXJTZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4Q2hhcih2YWwpCisgIHZhbCA9IGxpYmx1YWJpdHdpc2UuYmFuZCh2YWwsIDB4MGYpCisgIGlmIHZhbCA8IDEwIHRoZW4KKyAgICByZXR1cm4gdmFsICsgNDgKKyAgZWxzZQorICAgIHJldHVybiB2YWwgKyA4NworICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkVzY2FwZUNoYXIoY2gpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRXNjYXBlUHJlZml4KQorICBsb2NhbCBvdXRDaCA9IGhleENoYXIobGlibHVhYml0d2lzZS5zaGlmdHIoY2gsIDQpKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBvdXRDaCkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICBvdXRDaCA9IGhleENoYXIoY2gpCisgIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05DaGFyKGJ5dGUpCisgIGNoID0gc3RyaW5nLmJ5dGUoYnl0ZSkKKyAgaWYgY2ggPj0gMHgzMCB0aGVuCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgZWxzZQorICAgICAgc2VsZi50cmFuczp3cml0ZShieXRlKQorICAgIGVuZAorICBlbHNlCisgICAgbG9jYWwgb3V0Q2ggPSBKU09OQ2hhclRhYmxlW2NoKzFdCisgICAgaWYgb3V0Q2ggPT0gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZWxzZWlmIG91dENoID4gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICAgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICAgIGVsc2UKKyAgICAgIHNlbGY6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05TdHJpbmcoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAtLSBUT0RPIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIGlpID0gMQorICB3aGlsZSBpaSA8PSBsZW5ndGggZG8KKyAgICBzZWxmOndyaXRlSlNPTkNoYXIoc3RyaW5nLnN1YihzdHIsIGlpLCBpaSkpCisgICAgaWkgPSBpaSArIDEKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQmFzZTY0KHN0cikKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDMgZG8KKyAgICAtLSBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBsb2NhbCBieXRlcyA9IGJhc2U2NF9lbmNvZGUoc3RyaW5nLnN1YihzdHIsIG9mZnNldCwgb2Zmc2V0KzMpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gMworICAgIG9mZnNldCA9IG9mZnNldCArIDMKKyAgZW5kCisgIGlmIGxlbmd0aCA+IDAgdGhlbgorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrbGVuZ3RoKSkKKyAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGVzKQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05JbnRlZ2VyKG51bSkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIG51bXN0ciA9ICIiIC4uIG51bQorICBudW1zdHIgPSBzdHJpbmcuc3ViKG51bXN0ciwgc3RyaW5nLmZpbmQobnVtc3RyLCAiXlsrLV0/JWQrIikpCisgIHNlbGYudHJhbnM6d3JpdGUobnVtc3RyKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05Eb3VibGUoZHViKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGxvY2FsIHZhbCA9ICIiIC4uIGR1YgorICBsb2NhbCBwcmVmaXggPSBzdHJpbmcuc3ViKHZhbCwgMSwgMSkKKyAgbG9jYWwgc3BlY2lhbCA9IGZhbHNlCisgIGlmIHByZWZpeCA9PSAnTicgb3IgcHJlZml4ID09ICduJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuTmFuCisgICAgc3BlY2lhbCA9IHRydWUKKyAgZWxzZWlmIHByZWZpeCA9PSAnSScgb3IgcHJlZml4ID09ICdpJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuSW5maW5pdHkKKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICctJyB0aGVuCisgICAgbG9jYWwgc2Vjb25kQnl0ZSA9IHN0cmluZy5zdWIodmFsLCAyLCAyKQorICAgIGlmIHNlY29uZEJ5dGUgPT0gJ0knIG9yIHNlY29uZEJ5dGUgPT0gJ2knIHRoZW4KKyAgICAgIHZhbCA9IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlCisgICAgZW5kCisgIGVuZAorCisgIGlmIHNwZWNpYWwgb3Igc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKHZhbCkKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuT2JqZWN0RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlFbmQoKQorICBzZWxmOmNvbnRleHRQb3AoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBzZWxmOnJlc2V0Q29udGV4dCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihUSlNPTlByb3RvY29sLlRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcih0dHlwZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoaWQpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW3R0eXBlXSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkU3RvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1trdHlwZV0pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdnR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKKyAgcmV0dXJuIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbZXR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTGlzdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQm9vbChib29sKQorICBpZiBib29sIHRoZW4KKyAgICBzZWxmOndyaXRlSlNPTkludGVnZXIoMSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigwKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdzJywgaTE2KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdzJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdpJywgaTMyKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdsJywgaTY0KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdsJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHRvc3RyaW5nKHZhbCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVKU09ORG91YmxlKHN0cmluZy5mb3JtYXQoIiUuMTZmIiwgZHViKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZUpTT05CYXNlNjQoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05TeW50YXhDaGFyKGNoKQorICBsb2NhbCBjaDIgPSAiIgorICBpZiBzZWxmLmhhc1JlYWRCeXRlIH49ICIiIHRoZW4KKyAgICBjaDIgPSBzZWxmLmhhc1JlYWRCeXRlCisgICAgc2VsZi5oYXNSZWFkQnl0ZSA9ICIiCisgIGVsc2UKKyAgICBjaDIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgZW5kCisgIGlmIGNoMiB+PSBjaCB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCAiLi4gY2ggLi4gIiwgZ290ICIgLi4gY2gyfSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwubnVsbCB0aGVuCisgICAgcmV0dXJuCisgIGVuZAorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0IHRoZW4KKyAgICBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0ID0gZmFsc2UKKyAgZWxzZQorICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwudHR5cGUgPT0gMSB0aGVuCisgICAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5FbGVtU2VwYXJhdG9yKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmhleFZhbChjaCkKKyAgbG9jYWwgdmFsID0gc3RyaW5nLmJ5dGUoY2gpCisgIGlmIHZhbCA+PSA0OCBhbmQgdmFsIDw9IDU3IHRoZW4KKyAgICByZXR1cm4gdmFsIC0gNDgKKyAgZWxzZWlmIHZhbCA+PSA5NyBhbmQgdmFsIDw9IDEwMiB0aGVuCisgICAgcmV0dXJuIHZhbCAtIDg3CisgIGVsc2UKKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290ICIgLi4gY2h9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlplcm9DaGFyKQorICBsb2NhbCBiMSA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCBiMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5zaGlmdGwoc2VsZjpoZXhWYWwoYjEpLCA0KSArIHNlbGY6aGV4VmFsKGIyKQorZW5kCisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN0cmluZygpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGxvY2FsIHJlc3VsdCA9ICIiCisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgIGlmIGNoID09IEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlciB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIGlmIGNoID09IEpTT05Ob2RlLkJhY2tzbGFzaCB0aGVuCisgICAgICBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgICAgaWYgY2ggPT0gSlNPTk5vZGUuRXNjYXBlQ2hhciB0aGVuCisgICAgICAgIHNlbGY6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICAgICAgZWxzZQorICAgICAgICBsb2NhbCBwb3MsIF8gPSBzdHJpbmcuZmluZChKU09OTm9kZS5Fc2NhcGVDaGFycywgY2gpCisgICAgICAgIGlmIHBvcyA9PSBuaWwgdGhlbgorICAgICAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgIiAuLiBjaH0pCisgICAgICAgIGVuZAorICAgICAgICBjaCA9IEVzY2FwZUNoYXJWYWxzW3Bvc10KKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJlc3VsdCA9IHJlc3VsdCAuLiBjaAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05CYXNlNjQoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihyZXN1bHQpCisgIGxvY2FsIHN0ciA9ICIiCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDQgZG8KKyAgICBsb2NhbCBieXRlcyA9IHN0cmluZy5zdWIocmVzdWx0LCBvZmZzZXQsIG9mZnNldCs0KQorICAgIHN0ciA9IHN0ciAuLiBiYXNlNjRfZGVjb2RlKGJ5dGVzKQorICAgIG9mZnNldCA9IG9mZnNldCArIDQKKyAgICBsZW5ndGggPSBsZW5ndGggLSA0CisgIGVuZAorICBpZiBsZW5ndGggPj0gMCB0aGVuCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSkKKyAgZW5kCisgIHJldHVybiBzdHIKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgc3RyaW5nLmZpbmQoY2gsICdbLSswLTkuRWVdJykgdGhlbgorICAgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgICAgZWxzZQorICAgICAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Mb25nSW50ZWdlcigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIHRvbnVtYmVyKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Eb3VibGUoKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgZGVsaW1pdGVyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIG51bSA9IDAuMAorICBpZiBkZWxpbWl0ZXIgPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICBsb2NhbCBzdHIgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgICBpZiBzdHIgPT0gSlNPTk5vZGUuTmFuIHRoZW4KKyAgICAgIG51bSA9IDEuMAorICAgIGVsc2VpZiBzdHIgPT0gSlNPTk5vZGUuSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5tYXhpbnRlZ2VyCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5OZWdhdGl2ZUluZmluaXR5IHRoZW4KKyAgICAgIG51bSA9IG1hdGgubWluaW50ZWdlcgorICAgIGVsc2UKKyAgICAgIG51bSA9IHRvbnVtYmVyKHN0cikKKyAgICBlbmQKKyAgZWxzZQorICAgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAgIGVuZAorICAgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIG51bSA9IHRvbnVtYmVyKGRlbGltaXRlci4uIHJlc3VsdCkKKyAgZW5kCisgIHJldHVybiBudW0KK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDEsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLk9iamVjdEVuZCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB2ZXJzaW9uID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4ifSkKKyAgZW5kCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGxvY2FsIHNlcWlkID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIHR0eXBlID0gVFR5cGUuU1RPUAorICBsb2NhbCBpZCA9IDAKKyAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgIGlmIGNoIH49IEpTT05Ob2RlLk9iamVjdEVuZCB0aGVuCisgICAgaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgICAgc2VsZjpyZWFkSlNPTk9iamVjdEJlZ2luKCkKKyAgICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIHR0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgZW5kCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEZpZWxkRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGt0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdnR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBldHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZExpc3RFbmQoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIHJldHVybiBzZWxmOnJlYWRMaXN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJvb2woKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA9PSAxIHRoZW4KKyAgICByZXR1cm4gdHJ1ZQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA+PSAyNTYgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiVW5FeHBlY3RlZCBCeXRlICIgLi4gcmVzdWx0fSkKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJMTYoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkzMigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgbG9uZyA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIHJldHVybiBsb25nKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIHJldHVybiBzZWxmOnJlYWRKU09ORG91YmxlKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTlN0cmluZygpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQmluYXJ5KCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05CYXNlNjQoKQorZW5kCisKK1RKU09OUHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRKU09OUHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhIGIvbGliL2x1YS9UTWVtb3J5QnVmZmVyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIyZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UTWVtb3J5QnVmZmVyLmx1YQpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVE1lbW9yeUJ1ZmZlciA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RNZW1vcnlCdWZmZXInLAorICBidWZmZXIgPSAnJywKKyAgYnVmZmVyU2l6ZSA9IDEwMjQsCisgIHdQb3MgPSAwLAorICByUG9zID0gMAorfQorZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjppc09wZW4oKQorICByZXR1cm4gMQorZW5kCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOm9wZW4oKSBlbmQKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Y2xvc2UoKSBlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpwZWFrKCkKKyAgcmV0dXJuIHNlbGYuclBvcyA8IHNlbGYud1BvcworZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Z2V0QnVmZmVyKCkKKyAgcmV0dXJuIHNlbGYuYnVmZmVyCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpyZXNldEJ1ZmZlcihidWYpCisgIGlmIGJ1ZiB0aGVuCisgICAgc2VsZi5idWZmZXIgPSBidWYKKyAgICBzZWxmLmJ1ZmZlclNpemUgPSBzdHJpbmcubGVuKGJ1ZikKKyAgZWxzZQorICAgIHNlbGYuYnVmZmVyID0gJycKKyAgICBzZWxmLmJ1ZmZlclNpemUgPSAxMDI0CisgIGVuZAorICBzZWxmLndQb3MgPSBzdHJpbmcubGVuKGJ1ZikKKyAgc2VsZi5yUG9zID0gMAorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6YXZhaWxhYmxlKCkKKyAgcmV0dXJuIHNlbGYud1BvcyAtIHNlbGYuclBvcworZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6cmVhZChsZW4pCisgIGxvY2FsIGF2YWlsID0gc2VsZjphdmFpbGFibGUoKQorICBpZiBhdmFpbCA9PSAwIHRoZW4KKyAgICByZXR1cm4gJycKKyAgZW5kCisKKyAgaWYgYXZhaWwgPCBsZW4gdGhlbgorICAgIGxlbiA9IGF2YWlsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5idWZmZXIsIHNlbGYuclBvcyArIDEsIHNlbGYuclBvcyArIGxlbikKKyAgc2VsZi5yUG9zID0gc2VsZi5yUG9zICsgbGVuCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnJlYWRBbGwobGVuKQorICBsb2NhbCBhdmFpbCA9IHNlbGY6YXZhaWxhYmxlKCkKKworICBpZiBhdmFpbCA8IGxlbiB0aGVuCisgICAgbG9jYWwgbXNnID0gc3RyaW5nLmZvcm1hdCgnQXR0ZW1wdCB0byByZWFkQWxsKCVkKSBmb3VuZCBvbmx5ICVkIGF2YWlsYWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGF2YWlsKQorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gbXNnfSkKKyAgZW5kCisgIC0tIHJlYWQgc2hvdWxkIGJsb2NrIHNvIHdlIGRvbid0IG5lZWQgYSBsb29wIGhlcmUKKyAgcmV0dXJuIHNlbGY6cmVhZChsZW4pCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjp3cml0ZShidWYpCisgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXIgLi4gYnVmCisgIHNlbGYud1BvcyA9IHNlbGYud1BvcyArIHN0cmluZy5sZW4oYnVmKQorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Zmx1c2goKSBlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFByb3RvY29sLmx1YSBiL2xpYi9sdWEvVFByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZlMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UUHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsMTYyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVGhyaWZ0JworCitUUHJvdG9jb2xFeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ldyB7CisgIFVOS05PV04gICAgICAgICAgPSAwLAorICBJTlZBTElEX0RBVEEgICAgID0gMSwKKyAgTkVHQVRJVkVfU0laRSAgICA9IDIsCisgIFNJWkVfTElNSVQgICAgICAgPSAzLAorICBCQURfVkVSU0lPTiAgICAgID0gNCwKKyAgSU5WQUxJRF9QUk9UT0NPTCA9IDUsCisgIERFUFRIX0xJTUlUICAgICAgPSA2LAorICBlcnJvckNvZGUgICAgICAgID0gMCwKKyAgX190eXBlID0gJ1RQcm90b2NvbEV4Y2VwdGlvbicKK30KK2Z1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX0RBVEEgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBkYXRhJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5ORUdBVElWRV9TSVpFIHRoZW4KKyAgICByZXR1cm4gJ05lZ2F0aXZlIHNpemUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlNJWkVfTElNSVQgdGhlbgorICAgIHJldHVybiAnU2l6ZSBsaW1pdCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuQkFEX1ZFUlNJT04gdGhlbgorICAgIHJldHVybiAnQmFkIHZlcnNpb24nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0wgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBwcm90b2NvbCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuREVQVEhfTElNSVQgdGhlbgorICAgIHJldHVybiAnRXhjZWVkZWQgc2l6ZSBsaW1pdCcKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK1RQcm90b2NvbEJhc2UgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFByb3RvY29sQmFzZScsCisgIHRyYW5zCit9CisKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBfX1RPYmplY3QubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWVzc2FnZUVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cnVjdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVGaWVsZEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkU3RvcCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWFwRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTGlzdEJlZ2luKHR0eXBlLCBzaXplKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVMaXN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU2V0QmVnaW4odHR5cGUsIHNpemUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVNldEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUJvb2woYm9vbCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlQnl0ZShieXRlKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJMTYoaTE2KSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJMzIoaTMyKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJNjQoaTY0KSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVEb3VibGUoZHViKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVTdHJpbmcoc3RyKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1lc3NhZ2VCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWVzc2FnZUVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU3RydWN0QmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFN0cnVjdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRmllbGRCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRmllbGRFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1hcEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRNYXBFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZExpc3RCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTGlzdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU2V0QmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFNldEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkQm9vbCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkQnl0ZSgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkSTE2KCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRJMzIoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZEk2NCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRG91YmxlKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTdHJpbmcoKSBlbmQKKworZnVuY3Rpb24gVFByb3RvY29sQmFzZTpza2lwKHR0eXBlKQorICBpZiB0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybgorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgc2VsZjpyZWFkQm9vbCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5CWVRFIHRoZW4KKyAgICBzZWxmOnJlYWRCeXRlKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkkxNiB0aGVuCisgICAgc2VsZjpyZWFkSTE2KCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkkzMiB0aGVuCisgICAgc2VsZjpyZWFkSTMyKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkk2NCB0aGVuCisgICAgc2VsZjpyZWFkSTY0KCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkRPVUJMRSB0aGVuCisgICAgc2VsZjpyZWFkRG91YmxlKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLlNUUklORyB0aGVuCisgICAgc2VsZjpyZWFkU3RyaW5nKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLlNUUlVDVCB0aGVuCisgICAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSB0cnVlIGRvCisgICAgICBsb2NhbCBuYW1lLCB0dHlwZSwgaWQgPSBzZWxmOnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgICBzZWxmOnNraXAodHR5cGUpCisgICAgICBzZWxmOnJlYWRGaWVsZEVuZCgpCisgICAgZW5kCisgICAgc2VsZjpyZWFkU3RydWN0RW5kKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLk1BUCB0aGVuCisgICAgbG9jYWwga3R0eXBlLCB2dHR5cGUsIHNpemUgPSBzZWxmOnJlYWRNYXBCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoa3R0eXBlKQorICAgICAgc2VsZjpza2lwKHZ0dHlwZSkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRNYXBFbmQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU0VUIHRoZW4KKyAgICBsb2NhbCBldHR5cGUsIHNpemUgPSBzZWxmOnJlYWRTZXRCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoZXR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZFNldEVuZCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5MSVNUIHRoZW4KKyAgICBsb2NhbCBldHR5cGUsIHNpemUgPSBzZWxmOnJlYWRMaXN0QmVnaW4oKQorICAgIGZvciBpID0gMSwgc2l6ZSwgMSBkbworICAgICAgc2VsZjpza2lwKGV0dHlwZSkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRMaXN0RW5kKCkKKyAgZW5kCitlbmQKKworVFByb3RvY29sRmFjdG9yeSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUUHJvdG9jb2xGYWN0b3J5JywKK30KK2Z1bmN0aW9uIFRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UU2VydmVyLmx1YSBiL2xpYi9sdWEvVFNlcnZlci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzN2Q1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVFNlcnZlci5sdWEKQEAgLTAsMCArMSwxNDAgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCityZXF1aXJlICdURnJhbWVkVHJhbnNwb3J0JworcmVxdWlyZSAnVEJpbmFyeVByb3RvY29sJworCistLSBUU2VydmVyCitUU2VydmVyID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXInCit9CisKKy0tIDIgcG9zc2libGUgY29uc3RydWN0b3JzCistLSAgIDEuIHtwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydH0KKy0tICAgMi4ge3Byb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3Rvcnl9CitmdW5jdGlvbiBUU2VydmVyOm5ldyhhcmdzKQorICBpZiB0dHlwZShhcmdzKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcignVFNlcnZlciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorICBpZiBhcmdzLnByb2Nlc3NvciA9PSBuaWwgdGhlbgorICAgIHRlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHByb2Nlc3NvcicpCisgIGVuZAorICBpZiBhcmdzLnNlcnZlclRyYW5zcG9ydCA9PSBuaWwgdGhlbgorICAgIHRlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHNlcnZlclRyYW5zcG9ydCcpCisgIGVuZAorCisgIC0tIENyZWF0ZSB0aGUgb2JqZWN0CisgIGxvY2FsIG9iaiA9IF9fVE9iamVjdC5uZXcoc2VsZiwgYXJncykKKworICBpZiBvYmoudHJhbnNwb3J0RmFjdG9yeSB0aGVuCisgICAgb2JqLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai50cmFuc3BvcnRGYWN0b3J5CisgICAgb2JqLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvYmoudHJhbnNwb3J0RmFjdG9yeQorICAgIG9iai50cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisgIGVsc2UKKyAgICBvYmouaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk6bmV3e30KKyAgICBvYmoub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai5pbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgZW5kCisKKyAgaWYgb2JqLnByb3RvY29sRmFjdG9yeSB0aGVuCisgICAgb2JqLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gb2JqLnByb3RvY29sRmFjdG9yeQorICAgIG9iai5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvYmoucHJvdG9jb2xGYWN0b3J5CisgICAgb2JqLnByb3RvY29sRmFjdG9yeSA9IG5pbAorICBlbHNlCisgICAgb2JqLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpuZXd7fQorICAgIG9iai5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgZW5kCisKKyAgLS0gU2V0IHRoZSBfX3NlcnZlciB2YXJpYWJsZSBpbiB0aGUgaGFuZGxlciBzbyB3ZSBjYW4gc3RvcCB0aGUgc2VydmVyCisgIG9iai5wcm9jZXNzb3IuaGFuZGxlci5fX3NlcnZlciA9IHNlbGYKKworICByZXR1cm4gb2JqCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoaGFuZGxlcikKKyAgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIgPSBoYW5kbGVyCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpfY2xpZW50QmVnaW4oY29udGVudCwgaXByb3QsIG9wcm90KQorICBpZiBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciBhbmQKKyAgICB0eXBlKHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyLmNsaWVudEJlZ2luKSA9PSAnZnVuY3Rpb24nIHRoZW4KKyAgICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlcjpjbGllbnRCZWdpbihpcHJvdCwgb3Byb3QpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6X3ByZVNlcnZlKCkKKyAgaWYgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIgYW5kCisgICAgdHlwZShzZWxmLnNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSkgPT0gJ2Z1bmN0aW9uJyB0aGVuCisgICAgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXI6cHJlU2VydmUoc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6Z2V0U29ja2V0SW5mbygpKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOl9oYW5kbGVFeGNlcHRpb24oZXJyKQorICBpZiBzdHJpbmcuZmluZChlcnIsICdUVHJhbnNwb3J0RXhjZXB0aW9uJykgPT0gbmlsIHRoZW4KKyAgICBwcmludChlcnIpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6c2VydmUoKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXI6aGFuZGxlKGNsaWVudCkKKyAgbG9jYWwgaXRyYW5zLCBvdHJhbnMgPQorICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpLAorICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQoY2xpZW50KQorICBsb2NhbCBpcHJvdCwgb3Byb3QgPQorICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2woaXRyYW5zKSwKKyAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChvdHJhbnMpCisKKyAgc2VsZjpfY2xpZW50QmVnaW4oaXByb3QsIG9wcm90KQorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgcmV0LCBlcnIgPSBwY2FsbChzZWxmLnByb2Nlc3Nvci5wcm9jZXNzLCBzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90KQorICAgIGlmIHJldCA9PSBmYWxzZSBhbmQgZXJyIHRoZW4KKyAgICAgIGlmIG5vdCBzdHJpbmcuZmluZChlcnIsICJUVHJhbnNwb3J0RXhjZXB0aW9uIikgdGhlbgorICAgICAgICBzZWxmOl9oYW5kbGVFeGNlcHRpb24oZXJyKQorICAgICAgZW5kCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgaXRyYW5zOmNsb3NlKCkKKyAgb3RyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOmNsb3NlKCkKKyAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6Y2xvc2UoKQorZW5kCisKKy0tIFRTaW1wbGVTZXJ2ZXIKKy0tICBTaW5nbGUgdGhyZWFkZWQgc2VydmVyIHRoYXQgaGFuZGxlcyBvbmUgdHJhbnNwb3J0IChjb25uZWN0aW9uKQorVFNpbXBsZVNlcnZlciA9IF9fVE9iamVjdDpuZXcoVFNlcnZlciwgeworICBfX3R5cGUgPSAnVFNpbXBsZVNlcnZlcicsCisgIF9fc3RvcCA9IGZhbHNlCit9KQorCitmdW5jdGlvbiBUU2ltcGxlU2VydmVyOnNlcnZlKCkKKyAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6bGlzdGVuKCkKKyAgc2VsZjpfcHJlU2VydmUoKQorICB3aGlsZSBub3Qgc2VsZi5fX3N0b3AgZG8KKyAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydDphY2NlcHQoKQorICAgIHNlbGY6aGFuZGxlKGNsaWVudCkKKyAgZW5kCisgIHNlbGY6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRTaW1wbGVTZXJ2ZXI6c3RvcCgpCisgIHNlbGYuX19zdG9wID0gdHJ1ZQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RTb2NrZXQubHVhIGIvbGliL2x1YS9UU29ja2V0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFmYzFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UU29ja2V0Lmx1YQpAQCAtMCwwICsxLDEzMiBAQAorLS0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworcmVxdWlyZSAnbGlibHVhc29ja2V0JworCistLSBUU29ja2V0QmFzZQorVFNvY2tldEJhc2UgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUU29ja2V0QmFzZScsCisgIHRpbWVvdXQgPSAxMDAwLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwLAorICBoYW5kbGUKK30KKworZnVuY3Rpb24gVFNvY2tldEJhc2U6Y2xvc2UoKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZi5oYW5kbGU6ZGVzdHJveSgpCisgICAgc2VsZi5oYW5kbGUgPSBuaWwKKyAgZW5kCitlbmQKKworLS0gUmV0dXJucyBhIHRhYmxlIHdpdGggdGhlIGZpZWxkcyBob3N0IGFuZCBwb3J0CitmdW5jdGlvbiBUU29ja2V0QmFzZTpnZXRTb2NrZXRJbmZvKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHJldHVybiBzZWxmLmhhbmRsZTpnZXRzb2NraW5mbygpCisgIGVuZAorICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7ZXJyb3JDb2RlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTn0pCitlbmQKKworZnVuY3Rpb24gVFNvY2tldEJhc2U6c2V0VGltZW91dCh0aW1lb3V0KQorICBpZiB0aW1lb3V0IGFuZCB0dHlwZSh0aW1lb3V0KSA9PSAnbnVtYmVyJyB0aGVuCisgICAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgICAgc2VsZi5oYW5kbGU6c2V0dGltZW91dCh0aW1lb3V0KQorICAgIGVuZAorICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgZW5kCitlbmQKKworLS0gVFNvY2tldAorVFNvY2tldCA9IFRTb2NrZXRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTb2NrZXQnLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwCit9CisKK2Z1bmN0aW9uIFRTb2NrZXQ6aXNPcGVuKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVuZAorICByZXR1cm4gZmFsc2UKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0Om9wZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZjpjbG9zZSgpCisgIGVuZAorCisgIC0tIENyZWF0ZSBsb2NhbCBoYW5kbGUKKyAgbG9jYWwgc29jaywgZXJyID0gbHVhc29ja2V0LmNyZWF0ZV9hbmRfY29ubmVjdCgKKyAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi50aW1lb3V0KQorICBpZiBlcnIgPT0gbmlsIHRoZW4KKyAgICBzZWxmLmhhbmRsZSA9IHNvY2sKKyAgZW5kCisKKyAgaWYgZXJyIHRoZW4KKyAgICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvICcgLi4gc2VsZi5ob3N0IC4uICc6JyAuLiBzZWxmLnBvcnQKKyAgICAgICAgLi4gJyAoJyAuLiBlcnIgLi4gJyknCisgICAgfSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDpyZWFkKGxlbikKKyAgbG9jYWwgYnVmID0gc2VsZi5oYW5kbGU6cmVjZWl2ZShzZWxmLmhhbmRsZSwgbGVuKQorICBpZiBub3QgYnVmIG9yIHN0cmluZy5sZW4oYnVmKSB+PSBsZW4gdGhlbgorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV059KQorICBlbmQKKyAgcmV0dXJuIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRTb2NrZXQ6d3JpdGUoYnVmKQorICBzZWxmLmhhbmRsZTpzZW5kKHNlbGYuaGFuZGxlLCBidWYpCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDpmbHVzaCgpCitlbmQKKworLS0gVFNlcnZlclNvY2tldAorVFNlcnZlclNvY2tldCA9IFRTb2NrZXRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXJTb2NrZXQnLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwCit9CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQ6bGlzdGVuKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHNlbGY6Y2xvc2UoKQorICBlbmQKKworICBsb2NhbCBzb2NrLCBlcnIgPSBsdWFzb2NrZXQuY3JlYXRlKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorICBpZiBub3QgZXJyIHRoZW4KKyAgICBzZWxmLmhhbmRsZSA9IHNvY2sKKyAgZWxzZQorICAgIHRlcnJvcihlcnIpCisgIGVuZAorICBzZWxmLmhhbmRsZTpzZXR0aW1lb3V0KHNlbGYudGltZW91dCkKKyAgc2VsZi5oYW5kbGU6bGlzdGVuKCkKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyU29ja2V0OmFjY2VwdCgpCisgIGxvY2FsIGNsaWVudCwgZXJyID0gc2VsZi5oYW5kbGU6YWNjZXB0KCkKKyAgaWYgZXJyIHRoZW4KKyAgICB0ZXJyb3IoZXJyKQorICBlbmQKKyAgcmV0dXJuIFRTb2NrZXQ6bmV3KHtoYW5kbGUgPSBjbGllbnR9KQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9UVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDkzIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVGhyaWZ0JworCitUVHJhbnNwb3J0RXhjZXB0aW9uID0gVEV4Y2VwdGlvbjpuZXcgeworICBVTktOT1dOICAgICAgICAgICAgID0gMCwKKyAgTk9UX09QRU4gICAgICAgICAgICA9IDEsCisgIEFMUkVBRFlfT1BFTiAgICAgICAgPSAyLAorICBUSU1FRF9PVVQgICAgICAgICAgID0gMywKKyAgRU5EX09GX0ZJTEUgICAgICAgICA9IDQsCisgIElOVkFMSURfRlJBTUVfU0laRSAgPSA1LAorICBJTlZBTElEX1RSQU5TRk9STSAgID0gNiwKKyAgSU5WQUxJRF9DTElFTlRfVFlQRSA9IDcsCisgIGVycm9yQ29kZSAgICAgICAgPSAwLAorICBfX3R5cGUgPSAnVFRyYW5zcG9ydEV4Y2VwdGlvbicKK30KKworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5OT1RfT1BFTiB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgbm90IG9wZW4nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLkFMUkVBRFlfT1BFTiB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgYWxyZWFkeSBvcGVuJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5USU1FRF9PVVQgdGhlbgorICAgIHJldHVybiAnVHJhbnNwb3J0IHRpbWVkIG91dCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuRU5EX09GX0ZJTEUgdGhlbgorICAgIHJldHVybiAnRW5kIG9mIGZpbGUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfRlJBTUVfU0laRSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIGZyYW1lIHNpemUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX0NMSUVOVF9UWVBFIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgY2xpZW50IHR5cGUnCisgIGVsc2UKKyAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pJworICBlbmQKK2VuZAorCitUVHJhbnNwb3J0QmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0QmFzZScKK30KKworZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6aXNPcGVuKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpvcGVuKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpjbG9zZSgpIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6cmVhZChsZW4pIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6cmVhZEFsbChsZW4pCisgIGxvY2FsIGJ1ZiwgaGF2ZSwgY2h1bmsgPSAnJywgMAorICB3aGlsZSBoYXZlIDwgbGVuIGRvCisgICAgY2h1bmsgPSBzZWxmOnJlYWQobGVuIC0gaGF2ZSkKKyAgICBoYXZlID0gaGF2ZSArIHN0cmluZy5sZW4oY2h1bmspCisgICAgYnVmID0gYnVmIC4uIGNodW5rCisKKyAgICBpZiBzdHJpbmcubGVuKGNodW5rKSA9PSAwIHRoZW4KKyAgICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3sKKyAgICAgICAgZXJyb3JDb2RlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRQorICAgICAgfSkKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBidWYKK2VuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6d3JpdGUoYnVmKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOmZsdXNoKCkgZW5kCisKK1RTZXJ2ZXJUcmFuc3BvcnRCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXJUcmFuc3BvcnRCYXNlJworfQorZnVuY3Rpb24gVFNlcnZlclRyYW5zcG9ydEJhc2U6bGlzdGVuKCkgZW5kCitmdW5jdGlvbiBUU2VydmVyVHJhbnNwb3J0QmFzZTphY2NlcHQoKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOmNsb3NlKCkgZW5kCisKK1RUcmFuc3BvcnRGYWN0b3J5QmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0RmFjdG9yeUJhc2UnCit9CitmdW5jdGlvbiBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICByZXR1cm4gdHJhbnMKK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UaHJpZnQubHVhIGIvbGliL2x1YS9UaHJpZnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDRiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RocmlmdC5sdWEKQEAgLTAsMCArMSwyODEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCistLS0tIG5hbWVzcGFjZSB0aHJpZnQKKy0tdGhyaWZ0ID0ge30KKy0tc2V0bWV0YXRhYmxlKHRocmlmdCwge19faW5kZXggPSBfR30pIC0tPiBwZXJmIGhpdCBmb3IgYWNjZXNzaW5nIGdsb2JhbCBtZXRob2RzCistLXNldGZlbnYoMSwgdGhyaWZ0KQorCitwYWNrYWdlLmNwYXRoID0gcGFja2FnZS5jcGF0aCAuLiAnO2Jpbi8/LnNvJyAtLSBUT0RPIEZJWAorZnVuY3Rpb24gdHR5cGUob2JqKQorICBpZiB0eXBlKG9iaikgPT0gJ3RhYmxlJyBhbmQKKyAgICBvYmouX190eXBlIGFuZAorICAgIHR5cGUob2JqLl9fdHlwZSkgPT0gJ3N0cmluZycgdGhlbgorICAgICAgcmV0dXJuIG9iai5fX3R5cGUKKyAgZW5kCisgIHJldHVybiB0eXBlKG9iaikKK2VuZAorCitmdW5jdGlvbiB0ZXJyb3IoZSkKKyAgaWYgZSBhbmQgZS5fX3Rvc3RyaW5nIHRoZW4KKyAgICBlcnJvcihlOl9fdG9zdHJpbmcoKSkKKyAgICByZXR1cm4KKyAgZW5kCisgIGVycm9yKGUpCitlbmQKKworZnVuY3Rpb24gdHRhYmxlX3NpemUodCkKKyAgbG9jYWwgY291bnQgPSAwCisgIGZvciBrLCB2IGluIHBhaXJzKHQpIGRvCisgICAgY291bnQgPSBjb3VudCArIDEKKyAgZW5kCisgIHJldHVybiBjb3VudAorZW5kCisKK3ZlcnNpb24gPSAnMS4wLjAnCisKK1RUeXBlID0geworICBTVE9QICAgPSAwLAorICBWT0lEICAgPSAxLAorICBCT09MICAgPSAyLAorICBCWVRFICAgPSAzLAorICBJMDggICAgPSAzLAorICBET1VCTEUgPSA0LAorICBJMTYgICAgPSA2LAorICBJMzIgICAgPSA4LAorICBJNjQgICAgPSAxMCwKKyAgU1RSSU5HID0gMTEsCisgIFVURjcgICA9IDExLAorICBTVFJVQ1QgPSAxMiwKKyAgTUFQICAgID0gMTMsCisgIFNFVCAgICA9IDE0LAorICBMSVNUICAgPSAxNSwKKyAgVVRGOCAgID0gMTYsCisgIFVURjE2ICA9IDE3Cit9CisKK1RNZXNzYWdlVHlwZSA9IHsKKyAgQ0FMTCAgPSAxLAorICBSRVBMWSA9IDIsCisgIEVYQ0VQVElPTiA9IDMsCisgIE9ORVdBWSA9IDQKK30KKworLS0gUmVjdXJzaXZlIF9faW5kZXggZnVuY3Rpb24gdG8gYWNoaWV2ZSBpbmhlcml0YW5jZQorZnVuY3Rpb24gX190b2JqX2luZGV4KHNlbGYsIGtleSkKKyAgbG9jYWwgdiA9IHJhd2dldChzZWxmLCBrZXkpCisgIGlmIHYgfj0gbmlsIHRoZW4KKyAgICByZXR1cm4gdgorICBlbmQKKworICBsb2NhbCBwID0gcmF3Z2V0KHNlbGYsICdfX3BhcmVudCcpCisgIGlmIHAgdGhlbgorICAgIHJldHVybiBfX3RvYmpfaW5kZXgocCwga2V5KQorICBlbmQKKworICByZXR1cm4gbmlsCitlbmQKKworLS0gQmFzaWMgVGhyaWZ0LUx1YSBPYmplY3QKK19fVE9iamVjdCA9IHsKKyAgX190eXBlID0gJ19fVE9iamVjdCcsCisgIF9fbXQgPSB7CisgICAgX19pbmRleCA9IF9fdG9ial9pbmRleAorICB9Cit9CitmdW5jdGlvbiBfX1RPYmplY3Q6bmV3KGluaXRfb2JqKQorICBsb2NhbCBvYmogPSB7fQorICBpZiB0dHlwZShvYmopID09ICd0YWJsZScgdGhlbgorICAgIG9iaiA9IGluaXRfb2JqCisgIGVuZAorCisgIC0tIFVzZSB0aGUgX19wYXJlbnQga2V5IGFuZCB0aGUgX19pbmRleCBmdW5jdGlvbiB0byBhY2hpZXZlIGluaGVyaXRhbmNlCisgIG9iai5fX3BhcmVudCA9IHNlbGYKKyAgc2V0bWV0YXRhYmxlKG9iaiwgX19UT2JqZWN0Ll9fbXQpCisgIHJldHVybiBvYmoKK2VuZAorCistLSBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW55IGx1YSB2YXJpYWJsZQorZnVuY3Rpb24gdGhyaWZ0X3ByaW50X3IodCkKKyAgbG9jYWwgcmV0ID0gJycKKyAgbG9jYWwgbHR5cGUgPSB0eXBlKHQpCisgIGlmIChsdHlwZSA9PSAndGFibGUnKSB0aGVuCisgICAgcmV0ID0gcmV0IC4uICd7ICcKKyAgICBmb3Iga2V5LHZhbHVlIGluIHBhaXJzKHQpIGRvCisgICAgICByZXQgPSByZXQgLi4gdG9zdHJpbmcoa2V5KSAuLiAnPScgLi4gdGhyaWZ0X3ByaW50X3IodmFsdWUpIC4uICcgJworICAgIGVuZAorICAgIHJldCA9IHJldCAuLiAnfScKKyAgZWxzZWlmIGx0eXBlID09ICdzdHJpbmcnIHRoZW4KKyAgICByZXQgPSByZXQgLi4gIiciIC4uIHRvc3RyaW5nKHQpIC4uICInIgorICBlbHNlCisgICAgcmV0ID0gcmV0IC4uIHRvc3RyaW5nKHQpCisgIGVuZAorICByZXR1cm4gcmV0CitlbmQKKworLS0gQmFzaWMgRXhjZXB0aW9uCitURXhjZXB0aW9uID0gX19UT2JqZWN0Om5ld3sKKyAgbWVzc2FnZSwKKyAgZXJyb3JDb2RlLAorICBfX3R5cGUgPSAnVEV4Y2VwdGlvbicKK30KK2Z1bmN0aW9uIFRFeGNlcHRpb246X190b3N0cmluZygpCisgIGlmIHNlbGYubWVzc2FnZSB0aGVuCisgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoJyVzOiAlcycsIHNlbGYuX190eXBlLCBzZWxmLm1lc3NhZ2UpCisgIGVsc2UKKyAgICBsb2NhbCBtZXNzYWdlCisgICAgaWYgc2VsZi5lcnJvckNvZGUgYW5kIHNlbGYuX19lcnJvckNvZGVUb1N0cmluZyB0aGVuCisgICAgICBtZXNzYWdlID0gc3RyaW5nLmZvcm1hdCgnJWQ6ICVzJywgc2VsZi5lcnJvckNvZGUsIHNlbGY6X19lcnJvckNvZGVUb1N0cmluZygpKQorICAgIGVsc2UKKyAgICAgIG1lc3NhZ2UgPSB0aHJpZnRfcHJpbnRfcihzZWxmKQorICAgIGVuZAorICAgIHJldHVybiBzdHJpbmcuZm9ybWF0KCclczolcycsIHNlbGYuX190eXBlLCBtZXNzYWdlKQorICBlbmQKK2VuZAorCitUQXBwbGljYXRpb25FeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ld3sKKyAgVU5LTk9XTiAgICAgICAgICAgICAgICAgPSAwLAorICBVTktOT1dOX01FVEhPRCAgICAgICAgICA9IDEsCisgIElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0gMiwKKyAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPSAzLAorICBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9IDQsCisgIE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0gNSwKKyAgSU5URVJOQUxfRVJST1IgICAgICAgICAgPSA2LAorICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9IDcsCisgIElOVkFMSURfVFJBTlNGT1JNICAgICAgID0gOCwKKyAgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPSA5LAorICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwLAorICBlcnJvckNvZGUgICAgICAgICAgICAgICA9IDAsCisgIF9fdHlwZSA9ICdUQXBwbGljYXRpb25FeGNlcHRpb24nCit9CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRCB0aGVuCisgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEUgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLldST05HX01FVEhPRF9OQU1FIHRoZW4KKyAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQgdGhlbgorICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVCB0aGVuCisgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5URVJOQUxfRVJST1IgdGhlbgorICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SIHRoZW4KKyAgICByZXR1cm4gJ1Byb3RvY29sIGVycm9yJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX1RSQU5TRk9STSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTCB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSB0aGVuCisgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBjbGllbnQgdHlwZScKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRFeGNlcHRpb246cmVhZChpcHJvdCkKKyAgaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKQorICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbHNlaWYgZmlkID09IDEgdGhlbgorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HIHRoZW4KKyAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3Q6cmVhZFN0cmluZygpCisgICAgICBlbHNlCisgICAgICAgIGlwcm90OnNraXAoZnR5cGUpCisgICAgICBlbmQKKyAgICBlbHNlaWYgZmlkID09IDIgdGhlbgorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyIHRoZW4KKyAgICAgICAgc2VsZi5lcnJvckNvZGUgPSBpcHJvdDpyZWFkSTMyKCkKKyAgICAgIGVsc2UKKyAgICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGlwcm90OnNraXAoZnR5cGUpCisgICAgZW5kCisgICAgaXByb3Q6cmVhZEZpZWxkRW5kKCkKKyAgZW5kCisgIGlwcm90OnJlYWRTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRFeGNlcHRpb246d3JpdGUob3Byb3QpCisgIG9wcm90OndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgIGlmIHNlbGYubWVzc2FnZSB0aGVuCisgICAgb3Byb3Q6d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGUuU1RSSU5HLCAxKQorICAgIG9wcm90OndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICBvcHJvdDp3cml0ZUZpZWxkRW5kKCkKKyAgZW5kCisgIGlmIHNlbGYuZXJyb3JDb2RlIHRoZW4KKyAgICBvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgb3Byb3Q6d3JpdGVJMzIoc2VsZi5lcnJvckNvZGUpCisgICAgb3Byb3Q6d3JpdGVGaWVsZEVuZCgpCisgIGVuZAorICBvcHJvdDp3cml0ZUZpZWxkU3RvcCgpCisgIG9wcm90OndyaXRlU3RydWN0RW5kKCkKK2VuZAorCistLSBCYXNpYyBDbGllbnQgKHVzZWQgaW4gZ2VuZXJhdGVkIGx1YSBjb2RlKQorX19UQ2xpZW50ID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ19fVENsaWVudCcsCisgIF9zZXFpZCA9IDAKK30KK2Z1bmN0aW9uIF9fVENsaWVudDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKCdUQ2xpZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gU2V0IGlwcm90ICYgb3Byb3QKKyAgaWYgb2JqLnByb3RvY29sIHRoZW4KKyAgICBvYmouaXByb3QgPSBvYmoucHJvdG9jb2wKKyAgICBvYmoub3Byb3QgPSBvYmoucHJvdG9jb2wKKyAgICBvYmoucHJvdG9jb2wgPSBuaWwKKyAgZWxzZWlmIG5vdCBvYmouaXByb3QgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGFuIGlwcm90JykKKyAgZW5kCisgIGlmIG5vdCBvYmoub3Byb3QgdGhlbgorICAgIG9iai5vcHJvdCA9IG9iai5pcHJvdAorICBlbmQKKworICByZXR1cm4gX19UT2JqZWN0Lm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gX19UQ2xpZW50OmNsb3NlKCkKKyAgc2VsZi5pcHJvdC50cmFuczpjbG9zZSgpCisgIHNlbGYub3Byb3QudHJhbnM6Y2xvc2UoKQorZW5kCisKKy0tIEJhc2ljIFByb2Nlc3NvciAodXNlZCBpbiBnZW5lcmF0ZWQgbHVhIGNvZGUpCitfX1RQcm9jZXNzb3IgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnX19UUHJvY2Vzc29yJworfQorZnVuY3Rpb24gX19UUHJvY2Vzc29yOm5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IoJ1RQcm9jZXNzb3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSBoYW5kbGVyIGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmouaGFuZGxlciB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSBoYW5kbGVyJykKKyAgZW5kCisKKyAgcmV0dXJuIF9fVE9iamVjdC5uZXcoc2VsZiwgb2JqKQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2xvbmdudW1iZXJ1dGlscy5jIGIvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNjc4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL2xvbmdudW1iZXJ1dGlscy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK2NvbnN0IGNoYXIgKiBMT05HX05VTV9UWVBFID0gIl9fdGhyaWZ0X2xvbmdudW1iZXIiOworaW50NjRfdCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhsdWFfU3RhdGUgKkwsIGludCBpbmRleCkgeworICBzd2l0Y2ggKGx1YV90eXBlKEwsIGluZGV4KSkgeworICAgIGNhc2UgTFVBX1ROVU1CRVI6CisgICAgICByZXR1cm4gKGludDY0X3QpbHVhX3RvbnVtYmVyKEwsIGluZGV4KTsKKyAgICBjYXNlIExVQV9UU1RSSU5HOgorICAgICAgcmV0dXJuIGF0b2xsKGx1YV90b3N0cmluZyhMLCBpbmRleCkpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKigoaW50NjRfdCAqKWx1YUxfY2hlY2t1ZGF0YShMLCBpbmRleCwgTE9OR19OVU1fVFlQRSkpOworICB9Cit9CisKKy8vIENyZWF0ZXMgYSBuZXcgbG9uZ251bWJlciBhbmQgcHVzaGVzIGl0IG9udG8gdGhlIHN0YXRjaworaW50NjRfdCAqIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcobHVhX1N0YXRlICpMLCBpbnQ2NF90ICp2YWwpIHsKKyAgaW50NjRfdCAqZGF0YSA9IChpbnQ2NF90ICopbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZihpbnQ2NF90KSk7IC8vIGxvbmdudW0KKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgTE9OR19OVU1fVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdudW0sIG10CisgIGx1YV9zZXRtZXRhdGFibGUoTCwgLTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nbnVtCisgIGlmICh2YWwpIHsKKyAgICAqZGF0YSA9ICp2YWw7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJpdHdpc2UuYyBiL2xpYi9sdWEvc3JjL2x1YWJpdHdpc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA3ZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jCkBAIC0wLDAgKzEsODMgQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorCitzdGF0aWMgaW50IGxfbm90KGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBhID0gfmE7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX3hvcihsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSBePSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9hbmQobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgJj0gYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfb3IobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgfD0gYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfc2hpZnRyKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQgYiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBhID0gYSA+PiBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9zaGlmdGwobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgPSBhIDw8IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBmdW5jc1tdID0geworICB7ImJhbmQiLCBsX2FuZH0sCisgIHsiYm9yIiwgbF9vcn0sCisgIHsiYnhvciIsIGxfeG9yfSwKKyAgeyJibm90IiwgbF9ub3R9LAorICB7InNoaWZ0bCIsIGxfc2hpZnRsfSwKKyAgeyJzaGlmdHIiLCBsX3NoaWZ0cn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworaW50IGx1YW9wZW5fbGlibHVhYml0d2lzZShsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhYml0d2lzZSIsIGZ1bmNzKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9sdWFicGFjay5jIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzdiNmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpAQCAtMCwwICsxLDMwOCBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK2V4dGVybiBpbnQ2NF90IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTsKK2V4dGVybiBpbnQ2NF90IGx1YWxvbmdudW1iZXJfcHVzaGxvbmcobHVhX1N0YXRlICpMLCBpbnQ2NF90ICp2YWwpOworCisvLyBob3N0IG9yZGVyIHRvIG5ldHdvcmsgb3JkZXIgKDY0LWJpdCkKK3N0YXRpYyBpbnQ2NF90IFRfaHRvbmxsKHVpbnQ2NF90IGRhdGEpIHsKKyAgdWludDMyX3QgZDEgPSBodG9ubCgodWludDMyX3QpZGF0YSk7CisgIHVpbnQzMl90IGQyID0gaHRvbmwoKHVpbnQzMl90KShkYXRhID4+IDMyKSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWQxIDw8IDMyKSArICh1aW50NjRfdClkMjsKK30KKworLy8gbmV0d29yayBvcmRlciB0byBob3N0IG9yZGVyICg2NC1iaXQpCitzdGF0aWMgaW50NjRfdCBUX250b2hsbCh1aW50NjRfdCBkYXRhKSB7CisgIHVpbnQzMl90IGQxID0gbnRvaGwoKHVpbnQzMl90KWRhdGEpOworICB1aW50MzJfdCBkMiA9IG50b2hsKCh1aW50MzJfdCkoZGF0YSA+PiAzMikpOworICByZXR1cm4gKCh1aW50NjRfdClkMSA8PCAzMikgKyAodWludDY0X3QpZDI7Cit9CisKKy8qKgorICogYnBhY2sodHlwZSwgZGF0YSkKKyAqICBjIC0gU2lnbmVkIEJ5dGUKKyAqICBzIC0gU2lnbmVkIFNob3J0CisgKiAgaSAtIFNpZ25lZCBJbnQKKyAqICBsIC0gU2lnbmVkIExvbmcKKyAqICBkIC0gRG91YmxlCisgKi8KK3N0YXRpYyBpbnQgbF9icGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgc3dpdGNoIChjb2RlWzBdKSB7CisgICAgY2FzZSAnYyc6IHsKKyAgICAgIGludDhfdCBkYXRhID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAncyc6IHsKKyAgICAgIGludDE2X3QgZGF0YSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgICBkYXRhID0gKGludDE2X3QpaHRvbnMoZGF0YSk7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2knOiB7CisgICAgICBpbnQzMl90IGRhdGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgICAgIGRhdGEgPSAoaW50MzJfdClodG9ubChkYXRhKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnbCc6IHsKKyAgICAgIGludDY0X3QgZGF0YSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICAgICAgZGF0YSA9IChpbnQ2NF90KVRfaHRvbmxsKGRhdGEpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdkJzogeworICAgICAgZG91YmxlIGRhdGEgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgbHVhTF9hcmdjaGVjayhMLCAwLCAwLCAiSW52YWxpZCBmb3JtYXQgY29kZS4iKTsKKyAgfQorCisgIGx1YUxfcHVzaHJlc3VsdCgmYnVmKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogYnVucGFjayh0eXBlLCBkYXRhKQorICogIGMgLSBTaWduZWQgQnl0ZQorICogIEMgLSBVbnNpZ25lZCBCeXRlCisgKiAgcyAtIFNpZ25lZCBTaG9ydAorICogIGkgLSBTaWduZWQgSW50CisgKiAgbCAtIFNpZ25lZCBMb25nCisgKiAgZCAtIERvdWJsZQorICovCitzdGF0aWMgaW50IGxfYnVucGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOworICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyNpZiBMVUFfVkVSU0lPTl9OVU0gPj0gNTAyCisgIHNpemVfdCBsZW4gPSBsdWFfcmF3bGVuKEwsIDIpOworI2Vsc2UKKyAgc2l6ZV90IGxlbiA9IGx1YV9vYmpsZW4oTCwgMik7CisjZW5kaWYKKworICBzd2l0Y2ggKGNvZGVbMF0pIHsKKyAgICBjYXNlICdjJzogeworICAgICAgaW50OF90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qKgorICAgICAqIHVucGFjayB1bnNpZ25lZCBCeXRlLgorICAgICAqLworICAgIGNhc2UgJ0MnOiB7CisgICAgICB1aW50OF90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ3MnOiB7CisgICAgICBpbnQxNl90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICB2YWwgPSAoaW50MTZfdCludG9ocyh2YWwpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdpJzogeworICAgICAgaW50MzJfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgdmFsID0gKGludDMyX3QpbnRvaGwodmFsKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnbCc6IHsKKyAgICAgIGludDY0X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIHZhbCA9IChpbnQ2NF90KVRfbnRvaGxsKHZhbCk7CisgICAgICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZ2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2QnOiB7CisgICAgICBkb3VibGUgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgMCwgMCwgIkludmFsaWQgZm9ybWF0IGNvZGUuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitzdGF0aWMgaW50IGxfaTY0VG9aaWd6YWcobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChuIDw8IDEpIF4gKG4gPj4gNjMpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMTsKK30KKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pMzJUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50MzJfdCBuID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIHVpbnQzMl90IHJlc3VsdCA9ICh1aW50MzJfdCkobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgcmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JMzIobHVhX1N0YXRlICpMKSB7CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50MzJfdCByZXN1bHQgPSAoaW50MzJfdCkobiA+PiAxKSBeICh1aW50MzJfdCkoLShpbnQzMl90KShuICYgMSkpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAqLworc3RhdGljIGludCBsX3ppZ3phZ1RvSTY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgaW50NjRfdCByZXN1bHQgPSAoaW50NjRfdCkobiA+PiAxKSBeICh1aW50NjRfdCkoLShpbnQ2NF90KShuICYgMSkpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGFuIGkzMiB0byBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50MzIobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgYnVmWzVdOworICB1aW50MzJfdCBuID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAoMSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKyAgbHVhX3B1c2hsc3RyaW5nKEwsIGJ1Ziwgd3NpemUpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGFuIGk2NCB0byBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbF90b1ZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICB1aW50OF90IGRhdGFbMTBdOworICB1aW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgbHVhTF9CdWZmZXIgYnVmOworICBsdWFMX2J1ZmZpbml0KEwsICZidWYpOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICBkYXRhW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHdzaXplKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZidWYpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgdmFyaW50IHRvIGk2NC4KKyAqLworc3RhdGljIGludCBsX2Zyb21WYXJpbnQ2NChsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCByZXN1bHQ7CisgIHVpbnQ4X3QgYnl0ZSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGludDMyX3Qgc2hpZnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICB1aW50NjRfdCBuID0gKHVpbnQ2NF90KWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDMpOworICBuIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworCisgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgIHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gbjsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgfQorICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMjsKK30KKworLyoqCisgKiBUbyBwYWNrIG1lc3NhZ2UgdHlwZSBvZiBjb21wYWN0IHByb3RvY29sLgorICovCitzdGF0aWMgaW50IGxfcGFja01lc2dUeXBlKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IHZlcnNpb25fbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHZlcnNpb25fbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBpbnQzMl90IG1lc3NhZ2V0eXBlID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMyk7CisgIGludDMyX3QgdHlwZV9zaGlmdF9hbW91bnQgPSBsdWFMX2NoZWNraW50ZWdlcihMLCA0KTsKKyAgaW50MzJfdCB0eXBlX21hc2sgPSBsdWFMX2NoZWNraW50ZWdlcihMLCA1KTsKKyAgaW50MzJfdCB0b19tZXNnX3R5cGUgPSAodmVyc2lvbl9uICYgdmVyc2lvbl9tYXNrKSB8CisgICAgKCgoaW50MzJfdCltZXNzYWdldHlwZSA8PCB0eXBlX3NoaWZ0X2Ftb3VudCkgJiB0eXBlX21hc2spOworICBsdWFfcHVzaG51bWJlcihMLCB0b19tZXNnX3R5cGUpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBsdWFfYnBhY2tbXSA9IHsKKyAgeyJicGFjayIsIGxfYnBhY2t9LAorICB7ImJ1bnBhY2siLCBsX2J1bnBhY2t9LAorICB7ImkzMlRvWmlnemFnIiwgbF9pMzJUb1ppZ3phZ30sCisgIHsiaTY0VG9aaWd6YWciLCBsX2k2NFRvWmlnemFnfSwKKyAgeyJ6aWd6YWdUb0kzMiIsIGxfemlnemFnVG9JMzJ9LAorICB7InppZ3phZ1RvSTY0IiwgbF96aWd6YWdUb0k2NH0sCisgIHsidG9WYXJpbnQzMiIsIGxfdG9WYXJpbnQzMn0sCisgIHsidG9WYXJpbnQ2NCIsIGxfdG9WYXJpbnQ2NH0sCisgIHsiZnJvbVZhcmludDY0IiwgbF9mcm9tVmFyaW50NjR9LAorICB7InBhY2tNZXNnVHlwZSIsIGxfcGFja01lc2dUeXBlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitpbnQgbHVhb3Blbl9saWJsdWFicGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhYnBhY2siLCBsdWFfYnBhY2spOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWxvbmdudW1iZXIuYyBiL2xpYi9sdWEvc3JjL2x1YWxvbmdudW1iZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDAxZTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jCkBAIC0wLDAgKzEsMjI4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBMT05HX05VTV9UWVBFOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIGxfc2VyaWFsaXplKGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50NjRfdCB2YWwpIHsKKyAgc25wcmludGYoYnVmLCBsZW4sICIlIlBSSWQ2NCwgdmFsKTsKK30KKworc3RhdGljIGludDY0X3QgbF9kZXNlcmlhbGl6ZShjb25zdCBjaGFyICpidWYpIHsKKyAgaW50NjRfdCBkYXRhOworICBpbnQgcnY7CisgIC8vIFN1cHBvcnQgaGV4IHByZWZpeGVkIHdpdGggJzB4JworICBpZiAoc3Ryc3RyKGJ1ZiwgIjB4IikgPT0gYnVmKSB7CisgICAgcnYgPSBzc2NhbmYoYnVmLCAiJSJQUkl4NjQsICZkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICBydiA9IHNzY2FuZihidWYsICIlIlBSSWQ2NCwgJmRhdGEpOworICB9CisgIGlmIChydiA9PSAxKSB7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKyAgcmV0dXJuIDA7IC8vIEZhaWxlZAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGxfbmV3KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHZhbDsKKyAgY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKyAgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UU1RSSU5HKSB7CisgICAgc3RyID0gbHVhX3Rvc3RyaW5nKEwsIDEpOworICAgIHZhbCA9IGxfZGVzZXJpYWxpemUoc3RyKTsKKyAgfSBlbHNlIGlmIChsdWFfdHlwZShMLCAxKSA9PSBMVUFfVE5VTUJFUikgeworICAgIHZhbCA9IChpbnQ2NF90KWx1YV90b251bWJlcihMLCAxKTsKKyAgICBzdHIgPSAoY29uc3QgY2hhciAqKTE7CisgIH0KKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAoc3RyID8gJnZhbCA6IE5VTEwpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGEgKyBiCitzdGF0aWMgaW50IGxfYWRkKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSArIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSAvIGIKK3N0YXRpYyBpbnQgbF9kaXYobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhIC8gYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhID09IGIgKGJvdGggYSBhbmQgYiBhcmUgbHVhbG9uZ251bWJlcidzKQorc3RhdGljIGludCBsX2VxKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPT0gYiA/IDEgOiAwKSk7CisgIHJldHVybiAxOworfQorCisvLyBnYXJiYWdlIGNvbGxlY3Rpb24KK3N0YXRpYyBpbnQgbF9nYyhsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2huaWwoTCk7CisgIGx1YV9zZXRtZXRhdGFibGUoTCwgMSk7CisgIHJldHVybiAwOworfQorCisvLyBhIDwgYgorc3RhdGljIGludCBsX2x0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPCBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgPD0gYgorc3RhdGljIGludCBsX2xlKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPD0gYiA/IDEgOiAwKSk7CisgIHJldHVybiAxOworfQorCisvLyBhICUgYgorc3RhdGljIGludCBsX21vZChsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgJSBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgKiBiCitzdGF0aWMgaW50IGxfbXVsKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAqIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSBeIGIKK3N0YXRpYyBpbnQgbF9wb3cobHVhX1N0YXRlICpMKSB7CisgIGxvbmcgZG91YmxlIGEsIGI7CisgIGludDY0X3QgYzsKKyAgYSA9IChsb25nIGRvdWJsZSlsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IChsb25nIGRvdWJsZSlsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IChpbnQ2NF90KXBvdyhhLCBiKTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIC0gYgorc3RhdGljIGludCBsX3N1YihsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgLSBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHRvc3RyaW5nKCkKK3N0YXRpYyBpbnQgbF90b3N0cmluZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhOworICBjaGFyIHN0clsyNTZdOworICBsX3NlcmlhbGl6ZShzdHIsIDI1NiwgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSkpOworICBsdWFfcHVzaHN0cmluZyhMLCBzdHIpOworICByZXR1cm4gMTsKK30KKworLy8gLWEKK3N0YXRpYyBpbnQgbF91bm0obHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBjID0gLWE7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIG1ldGhvZHNbXSA9IHsKKyAgeyJfX2FkZCIsIGxfYWRkfSwKKyAgeyJfX2RpdiIsIGxfZGl2fSwKKyAgeyJfX2VxIiwgbF9lcX0sCisgIHsiX19nYyIsIGxfZ2N9LAorICB7Il9fbHQiLCBsX2x0fSwKKyAgeyJfX2xlIiwgbF9sZX0sCisgIHsiX19tb2QiLCBsX21vZH0sCisgIHsiX19tdWwiLCBsX211bH0sCisgIHsiX19wb3ciLCBsX3Bvd30sCisgIHsiX19zdWIiLCBsX3N1Yn0sCisgIHsiX190b3N0cmluZyIsIGxfdG9zdHJpbmd9LAorICB7Il9fdW5tIiwgbF91bm19LAorICB7TlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgZnVuY3NbXSA9IHsKKyAgeyJuZXciLCBsX25ld30sCisgIHtOVUxMLCBOVUxMfQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgc2V0X21ldGhvZHMobHVhX1N0YXRlICpMLAorICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgKm1ldGhvZHMpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgbWV0YXRhYmxlbmFtZSk7ICAgLy8gbXQKKyAgLy8gTm8gbmVlZCBmb3IgYSBfX2luZGV4IHRhYmxlIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgX18qCisgIGZvciAoOyBtZXRob2RzLT5uYW1lOyBtZXRob2RzKyspIHsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBtZXRob2RzLT5uYW1lKTsgICAgLy8gbXQsICJuYW1lIgorICAgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIG1ldGhvZHMtPmZ1bmMpOyAvLyBtdCwgIm5hbWUiLCBmdW5jCisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10CisgIH0KKyAgbHVhX3BvcChMLCAxKTsKK30KKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9saWJsdWFsb25nbnVtYmVyKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld21ldGF0YWJsZShMLCBMT05HX05VTV9UWVBFKTsKKyAgbHVhX3BvcChMLCAxKTsKKyAgc2V0X21ldGhvZHMoTCwgTE9OR19OVU1fVFlQRSwgbWV0aG9kcyk7CisKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhbG9uZ251bWJlciIsIGZ1bmNzKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9sdWFzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODM1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFzb2NrZXQuYwpAQCAtMCwwICsxLDM4MCBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9BTlkgICAgID0gIl9fdGhyaWZ0X3NvY2tldF9hbnkiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9DT05OICAgID0gIl9fdGhyaWZ0X3NvY2tldF9jb25uZWN0ZWQiOworCitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0dFTkVSSUMgPSAiX190aHJpZnRfc29ja2V0X2dlbmVyaWMiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9DTElFTlQgID0gIl9fdGhyaWZ0X3NvY2tldF9jbGllbnQiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9TRVJWRVIgID0gIl9fdGhyaWZ0X3NvY2tldF9zZXJ2ZXIiOworCitzdGF0aWMgY29uc3QgY2hhciAqREVGQVVMVF9IT1NUICAgPSAibG9jYWxob3N0IjsKKwordHlwZWRlZiBzdHJ1Y3QgX190X3RjcCB7CisgIHRfc29ja2V0IHNvY2s7CisgIGludCB0aW1lb3V0OyAvLyBNaWxsaXNlY29uZHMKK30gdF90Y3A7Cit0eXBlZGVmIHRfdGNwICpwX3RjcDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWwKKworc3RhdGljIHZvaWQgdGhyb3dfYXJnZXJyb3IobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKSB7CisgIGNoYXIgbXNnWzI1Nl07CisgIHNwcmludGYobXNnLCAiJXMgZXhwZWN0ZWQsIGdvdCAlcyIsIGV4cGVjdGVkLCBsdWFMX3R5cGVuYW1lKEwsIGluZGV4KSk7CisgIGx1YUxfYXJnZXJyb3IoTCwgaW5kZXgsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkICpjaGVja2dyb3VwKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICpncm91cG5hbWUpIHsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIGluZGV4KSkgeworICAgIHRocm93X2FyZ2Vycm9yKEwsIGluZGV4LCBncm91cG5hbWUpOworICB9CisKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZ3JvdXBuYW1lKTsKKyAgbHVhX3Jhd2dldChMLCAtMik7CisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAyKTsKKyAgICB0aHJvd19hcmdlcnJvcihMLCBpbmRleCwgZ3JvdXBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBsdWFfcG9wKEwsIDIpOworICAgIHJldHVybiBsdWFfdG91c2VyZGF0YShMLCBpbmRleCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7IC8vIE5vdCByZWFjaGFibGUKK30KKworc3RhdGljIHZvaWQgKmNoZWNrdHlwZShsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpIHsKKyAgaWYgKHN0cmNtcCh0eXBlbmFtZSwgU09DS0VUX0FOWSkgPT0gMCB8fAorICAgICAgc3RyY21wKHR5cGVuYW1lLCBTT0NLRVRfQ09OTikgPT0gMCkgeworICAgIHJldHVybiBjaGVja2dyb3VwKEwsIGluZGV4LCB0eXBlbmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGx1YUxfY2hlY2t1ZGF0YShMLCBpbmRleCwgdHlwZW5hbWUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldHR5cGUobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGVuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIHR5cGVuYW1lKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCBpbmRleCk7Cit9CisKKyNkZWZpbmUgTFVBX1NVQ0NFU1NfUkVUVVJOKEwpIFwKKyAgbHVhX3B1c2hudW1iZXIoTCwgMSk7IFwKKyAgcmV0dXJuIDEKKworI2RlZmluZSBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycikgXAorICBpZiAoZXJyKSB7IFwKKyAgICBsdWFfcHVzaG5pbChMKTsgXAorICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7IFwKKyAgICByZXR1cm4gMjsgXAorICB9IFwKKyAgTFVBX1NVQ0NFU1NfUkVUVVJOKEwpCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY3JlYXRlKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2Rlc3Ryb3kobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2V0dGltZW91dChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9nZXRzb2NraW5mbyhsdWFfU3RhdGUgKkwpOworCitzdGF0aWMgaW50IGxfc29ja2V0X2FjY2VwdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9saXN0ZW4obHVhX1N0YXRlICpMKTsKKworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY29ubmVjdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9zZW5kKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X3JlY2VpdmUobHVhX1N0YXRlICpMKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBtZXRob2RzX2dlbmVyaWNbXSA9IHsKKyAgeyJkZXN0cm95IiwgICAgIGxfc29ja2V0X2Rlc3Ryb3l9LAorICB7InNldHRpbWVvdXQiLCAgbF9zb2NrZXRfc2V0dGltZW91dH0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsibGlzdGVuIiwgICAgICBsX3NvY2tldF9saXN0ZW59LAorICB7ImNvbm5lY3QiLCAgICAgbF9zb2NrZXRfY29ubmVjdH0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBtZXRob2RzX3NlcnZlcltdID0geworICB7ImRlc3Ryb3kiLCAgICAgbF9zb2NrZXRfZGVzdHJveX0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsiYWNjZXB0IiwgICAgICBsX3NvY2tldF9hY2NlcHR9LAorICB7InNlbmQiLCAgICAgICAgbF9zb2NrZXRfc2VuZH0sCisgIHsicmVjZWl2ZSIsICAgICBsX3NvY2tldF9yZWNlaXZlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfY2xpZW50W10gPSB7CisgIHsiZGVzdHJveSIsICAgICBsX3NvY2tldF9kZXN0cm95fSwKKyAgeyJzZXR0aW1lb3V0IiwgIGxfc29ja2V0X3NldHRpbWVvdXR9LAorICB7ImdldHNvY2tpbmZvIiwgbF9zb2NrZXRfZ2V0c29ja2luZm99LAorICB7InNlbmQiLCAgICAgICAgbF9zb2NrZXRfc2VuZH0sCisgIHsicmVjZWl2ZSIsICAgICBsX3NvY2tldF9yZWNlaXZlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGZ1bmNzX2x1YXNvY2tldFtdID0geworICB7ImNyZWF0ZSIsICAgICAgICAgICAgIGxfc29ja2V0X2NyZWF0ZX0sCisgIHsiY3JlYXRlX2FuZF9jb25uZWN0IiwgbF9zb2NrZXRfY3JlYXRlX2FuZF9jb25uZWN0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBDaGVjay9lbmZvcmNlIGluaGVyaXRhbmNlCitzdGF0aWMgdm9pZCBhZGRfdG9fZ3JvdXAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWV0YXRhYmxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSkgeworICBsdWFMX2dldG1ldGF0YWJsZShMLCBtZXRhdGFibGVuYW1lKTsgLy8gbXQKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZ3JvdXBuYW1lKTsgICAgICAgIC8vIG10LCAibmFtZSIKKyAgbHVhX3B1c2hib29sZWFuKEwsIDEpOyAgICAgICAgICAgICAgIC8vIG10LCAibmFtZSIsIHRydWUKKyAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tZXRob2RzKGx1YV9TdGF0ZSAqTCwKKyAgY29uc3QgY2hhciAqbWV0YXRhYmxlbmFtZSwKKyAgY29uc3Qgc3RydWN0IGx1YUxfUmVnICptZXRob2RzKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIG1ldGF0YWJsZW5hbWUpOyAgIC8vIG10CisgIC8vIENyZWF0ZSB0aGUgX19pbmRleCB0YWJsZQorICBsdWFfcHVzaHN0cmluZyhMLCAiX19pbmRleCIpOyAgICAgICAgICAvLyBtdCwgIl9faW5kZXgiCisgIGx1YV9uZXd0YWJsZShMKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG10LCAiX19pbmRleCIsIHQKKyAgZm9yICg7IG1ldGhvZHMtPm5hbWU7IG1ldGhvZHMrKykgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIG1ldGhvZHMtPm5hbWUpOyAgICAvLyBtdCwgIl9faW5kZXgiLCB0LCAibmFtZSIKKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBtZXRob2RzLT5mdW5jKTsgLy8gbXQsICJfX2luZGV4IiwgdCwgIm5hbWUiLCBmdW5jCisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10LCAiX19pbmRleCIsIHQKKyAgfQorICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgICAvLyBtdAorICBsdWFfcG9wKEwsIDEpOworfQorCitpbnQgbHVhb3Blbl9saWJsdWFzb2NrZXQobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIFNPQ0tFVF9HRU5FUklDKTsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX0NMSUVOVCk7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIFNPQ0tFVF9TRVJWRVIpOworICBsdWFfcG9wKEwsIDMpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0dFTkVSSUMsIFNPQ0tFVF9BTlkpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0NMSUVOVCwgU09DS0VUX0FOWSk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfU0VSVkVSLCBTT0NLRVRfQU5ZKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9DTElFTlQsIFNPQ0tFVF9DT05OKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9TRVJWRVIsIFNPQ0tFVF9DT05OKTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX0dFTkVSSUMsIG1ldGhvZHNfZ2VuZXJpYyk7CisgIHNldF9tZXRob2RzKEwsIFNPQ0tFVF9DTElFTlQsIG1ldGhvZHNfY2xpZW50KTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX1NFUlZFUiwgbWV0aG9kc19zZXJ2ZXIpOworCisgIGx1YUxfcmVnaXN0ZXIoTCwgImx1YXNvY2tldCIsIGZ1bmNzX2x1YXNvY2tldCk7CisgIHJldHVybiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2VuZXJhbAorCisvLyBzb2NrLGVyciBjcmVhdGUoYmluZF9ob3N0LCBiaW5kX3BvcnQpCisvLyBzb2NrLGVyciBjcmVhdGUoYmluZF9ob3N0KSAtPiBhbnkgcG9ydAorLy8gc29jayxlcnIgY3JlYXRlKCkgLT4gYW55IHBvcnQgb24gbG9jYWxob3N0CitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZShsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICB0X3NvY2tldCBzb2NrOworICBjb25zdCBjaGFyICphZGRyID0gbHVhX3Rvc3RyaW5nKEwsIDEpOworICBpZiAoIWFkZHIpIHsKKyAgICBhZGRyID0gREVGQVVMVF9IT1NUOworICB9CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFfdG9udW1iZXIoTCwgMik7CisgIGVyciA9IHRjcF9jcmVhdGUoJnNvY2spOworICBpZiAoIWVycikgeworICAgIGVyciA9IHRjcF9iaW5kKCZzb2NrLCBhZGRyLCBwb3J0KTsgLy8gYmluZCBvbiBjcmVhdGUKKyAgICBpZiAoZXJyKSB7CisgICAgICB0Y3BfZGVzdHJveSgmc29jayk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZih0X3RjcCkpOworICAgICAgc2V0dHlwZShMLCAtMiwgU09DS0VUX0dFTkVSSUMpOworICAgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKCZzb2NrKTsKKyAgICAgIHRjcC0+c29jayA9IHNvY2s7CisgICAgICB0Y3AtPnRpbWVvdXQgPSAwOworICAgICAgcmV0dXJuIDE7IC8vIFJldHVybiB1c2VyZGF0YQorICAgIH0KKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vIGRlc3Ryb3koKQorc3RhdGljIGludCBsX3NvY2tldF9kZXN0cm95KGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQU5ZKTsKKyAgY29uc3QgY2hhciAqZXJyID0gdGNwX2Rlc3Ryb3koJnRjcC0+c29jayk7CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gc2VuZChzb2NrZXQsIGRhdGEpCitzdGF0aWMgaW50IGxfc29ja2V0X3NlbmQobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQ09OTik7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDIsIFNPQ0tFVF9DT05OKTsKKyAgc2l6ZV90IGxlbjsKKyAgY29uc3QgY2hhciAqZGF0YSA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDMsICZsZW4pOworICBjb25zdCBjaGFyICplcnIgPQorICAgIHRjcF9zZW5kKCZ0Y3AtPnNvY2ssIGRhdGEsIGxlbiwgdGNwLT50aW1lb3V0KTsKKyAgTFVBX0NIRUNLX1JFVFVSTihMLCBlcnIpOworfQorCisjZGVmaW5lIExVQV9SRUFEX1NURVAgODE5Mgorc3RhdGljIGludCBsX3NvY2tldF9yZWNlaXZlKGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0NPTk4pOworICBwX3RjcCBoYW5kbGUgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAyLCBTT0NLRVRfQ09OTik7CisgIHNpemVfdCBsZW4gPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICBjaGFyIGJ1ZltMVUFfUkVBRF9TVEVQXTsKKyAgY29uc3QgY2hhciAqZXJyID0gTlVMTDsKKyAgaW50IHJlY2VpdmVkOworICBzaXplX3QgZ290ID0gMCwgc3RlcCA9IDA7CisgIGx1YUxfQnVmZmVyIGI7CisKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGRvIHsKKyAgICBzdGVwID0gKExVQV9SRUFEX1NURVAgPCBsZW4gLSBnb3QgPyBMVUFfUkVBRF9TVEVQIDogbGVuIC0gZ290KTsKKyAgICBlcnIgPSB0Y3BfcmF3X3JlY2VpdmUoJmhhbmRsZS0+c29jaywgYnVmLCBzdGVwLCBzZWxmLT50aW1lb3V0LCAmcmVjZWl2ZWQpOworICAgIGlmIChlcnIgPT0gTlVMTCkgeworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBidWYsIHJlY2VpdmVkKTsKKyAgICAgIGdvdCArPSByZWNlaXZlZDsKKyAgICB9CisgIH0gd2hpbGUgKGVyciA9PSBOVUxMICYmIGdvdCA8IGxlbik7CisKKyAgaWYgKGVycikgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHNldHRpbWVvdXQodGltZW91dCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2V0dGltZW91dChsdWFfU3RhdGUgKkwpIHsKKyAgcF90Y3Agc2VsZiA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBpbnQgdGltZW91dCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHNlbGYtPnRpbWVvdXQgPSB0aW1lb3V0OworICBMVUFfU1VDQ0VTU19SRVRVUk4oTCk7Cit9CisKKy8vIHRhYmxlIGdldHNvY2tpbmZvKCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfZ2V0c29ja2luZm8obHVhX1N0YXRlICpMKSB7CisgIGNoYXIgYnVmWzI1Nl07CisgIHNob3J0IHBvcnQgPSAwOworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQU5ZKTsKKyAgaWYgKHNvY2tldF9nZXRfaW5mbygmdGNwLT5zb2NrLCAmcG9ydCwgYnVmLCAyNTYpID09IFNVQ0NFU1MpIHsKKyAgICBsdWFfbmV3dGFibGUoTCk7ICAgICAgICAgICAgICAgICAgICAvLyB0CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImhvc3QiKTsgICAgICAgICAgLy8gdCwgImhvc3QiCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYnVmKTsgICAgICAgICAgICAgLy8gdCwgImhvc3QiLCBidWYKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAvLyB0CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgInBvcnQiKTsgICAgICAgICAgLy8gdCwgInBvcnQiCisgICAgbHVhX3B1c2hudW1iZXIoTCwgcG9ydCk7ICAgICAgICAgICAgLy8gdCwgInBvcnQiLCBwb3J0CisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgLy8gdAorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2VydmVyCisKKy8vIGFjY2VwdCgpCitzdGF0aWMgaW50IGxfc29ja2V0X2FjY2VwdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX1NFUlZFUik7CisgIHRfc29ja2V0IHNvY2s7CisgIGVyciA9IHRjcF9hY2NlcHQoJnNlbGYtPnNvY2ssICZzb2NrLCBzZWxmLT50aW1lb3V0KTsKKyAgaWYgKCFlcnIpIHsgLy8gU3VjY2VzcworICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50CisgICAgcF90Y3AgY2xpZW50ID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgc2V0dHlwZShMLCAyLCBTT0NLRVRfQ0xJRU5UKTsKKyAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgIGNsaWVudC0+c29jayA9IHNvY2s7CisgICAgY2xpZW50LT50aW1lb3V0ID0gc2VsZi0+dGltZW91dDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfbGlzdGVuKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyKiBlcnI7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9HRU5FUklDKTsKKyAgaW50IGJhY2tsb2cgPSAxMDsKKyAgZXJyID0gdGNwX2xpc3RlbigmdGNwLT5zb2NrLCBiYWNrbG9nKTsKKyAgaWYgKCFlcnIpIHsKKyAgICAvLyBTZXQgdGhlIGN1cnJlbnQgYXMgYSBzZXJ2ZXIKKyAgICBzZXR0eXBlKEwsIDEsIFNPQ0tFVF9TRVJWRVIpOyAvLyBOb3cgYSBzZXJ2ZXIKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGllbnQKKworLy8gY3JlYXRlX2FuZF9jb25uZWN0KGhvc3QsIHBvcnQsIHRpbWVvdXQpCitleHRlcm4gZG91YmxlIF9fZ2V0dGltZSgpOworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIqIGVyciA9IE5VTEw7CisgIGRvdWJsZSBlbmQ7CisgIHRfc29ja2V0IHNvY2s7CisgIGNvbnN0IGNoYXIgKmhvc3QgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgaW50IHRpbWVvdXQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworCisgIC8vIENyZWF0ZSBhbmQgY29ubmVjdCBsb29wIGZvciB0aW1lb3V0IG1pbGxpc2Vjb25kcworICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKKyAgZG8geworICAgIC8vIENyZWF0ZSB0aGUgc29ja2V0CisgICAgZXJyID0gdGNwX2NyZWF0ZSgmc29jayk7CisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgLy8gQ29ubmVjdAorICAgICAgICBlcnIgPSB0Y3BfY29ubmVjdCgmc29jaywgaG9zdCwgcG9ydCwgdGltZW91dCk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICB0Y3BfZGVzdHJveSgmc29jayk7CisgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7IC8vIHNsZWVwIGZvciAxMDBtcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZih0X3RjcCkpOworICAgICAgICAgIHNldHR5cGUoTCwgLTIsIFNPQ0tFVF9DTElFTlQpOworICAgICAgICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgICAgICAgdGNwLT5zb2NrID0gc29jazsKKyAgICAgICAgICB0Y3AtPnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgIHJldHVybiAxOyAvLyBSZXR1cm4gdXNlcmRhdGEKKyAgICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZXJyICYmIF9fZ2V0dGltZSgpIDwgZW5kKTsKKworICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vIGNvbm5lY3QoaG9zdCwgcG9ydCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY29ubmVjdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfR0VORVJJQyk7CisgIGNvbnN0IGNoYXIgKmhvc3QgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gbHVhTF9jaGVja251bWJlcihMLCAzKTsKKyAgZXJyID0gdGNwX2Nvbm5lY3QoJnRjcC0+c29jaywgaG9zdCwgcG9ydCwgdGNwLT50aW1lb3V0KTsKKyAgaWYgKCFlcnIpIHsKKyAgICBzZXR0eXBlKEwsIDEsIFNPQ0tFVF9DTElFTlQpOyAvLyBOb3cgYSBjbGllbnQKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9zb2NrZXQuaCBiL2xpYi9sdWEvc3JjL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjgyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9zb2NrZXQuaApAQCAtMCwwICsxLDc4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2lmbmRlZiBMVUFfVEhSSUZUX1NPQ0tFVF9ICisjZGVmaW5lIExVQV9USFJJRlRfU09DS0VUX0gKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmZGVmIF9XSU4zMgorLy8gU09MCisjZWxzZQordHlwZWRlZiBpbnQgdF9zb2NrZXQ7Cit0eXBlZGVmIHRfc29ja2V0KiBwX3NvY2tldDsKKyNlbmRpZgorCisvLyBFcnJvciBDb2RlcworZW51bSB7CisgIFNVQ0NFU1MgPSAwLAorICBUSU1FT1VUID0gLTEsCisgIENMT1NFRCA9IC0yLAorfTsKK3R5cGVkZWYgaW50IFRfRVJSQ09ERTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBUSU1FT1VUX01TRyA9ICJUaW1lb3V0IjsKK3N0YXRpYyBjb25zdCBjaGFyICogQ0xPU0VEX01TRyA9ICJDb25uZWN0aW9uIENsb3NlZCI7CisKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyIHRfc2E7Cit0eXBlZGVmIHRfc2EgKiBwX3NhOworCitUX0VSUkNPREUgc29ja2V0X2NyZWF0ZShwX3NvY2tldCBzb2NrLCBpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKK1RfRVJSQ09ERSBzb2NrZXRfZGVzdHJveShwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfYmluZChwX3NvY2tldCBzb2NrLCBwX3NhIGFkZHIsIGludCBhZGRyX2xlbik7CitUX0VSUkNPREUgc29ja2V0X2dldF9pbmZvKHBfc29ja2V0IHNvY2ssIHNob3J0ICpwb3J0LCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworVF9FUlJDT0RFIHNvY2tldF9zZW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0KTsKK1RfRVJSQ09ERSBzb2NrZXRfcmVjdihwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlY2VpdmVkKTsKKworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jayk7CisKK1RfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IHNpYmxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3NhIGFkZHIsIHNvY2tsZW5fdCAqYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKK1RfRVJSQ09ERSBzb2NrZXRfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKTsKKworVF9FUlJDT0RFIHNvY2tldF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuLCBpbnQgdGltZW91dCk7CisKK2NvbnN0IGNoYXIgKiB0Y3BfY3JlYXRlKHBfc29ja2V0IHNvY2spOworY29uc3QgY2hhciAqIHRjcF9kZXN0cm95KHBfc29ja2V0IHNvY2spOworY29uc3QgY2hhciAqIHRjcF9iaW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHNob3J0IHBvcnQpOworY29uc3QgY2hhciAqIHRjcF9zZW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCB3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCk7Citjb25zdCBjaGFyICogdGNwX3JlY2VpdmUocF9zb2NrZXQgc29jaywgY2hhciAqZGF0YSwgc2l6ZV90IHJfbGVuLCBpbnQgdGltZW91dCk7Citjb25zdCBjaGFyICogdGNwX3Jhd19yZWNlaXZlKHBfc29ja2V0IHNvY2ssIGNoYXIgKiBkYXRhLCBzaXplX3Qgcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKTsKKworY29uc3QgY2hhciAqIHRjcF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpOworY29uc3QgY2hhciAqIHRjcF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LCBpbnQgdGltZW91dCk7CisKK2NvbnN0IGNoYXIgKiB0Y3BfY29ubmVjdChwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBzaG9ydCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy91c29ja2V0LmMgYi9saWIvbHVhL3NyYy91c29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExYjU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwpAQCAtMCwwICsxLDM3NiBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4gLy8gVE9ETyBSRU1PVkUKKworI2luY2x1ZGUgInNvY2tldC5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJpdmF0ZQorCisvLyBOdW0gc2Vjb25kcyBzaW5jZSBKYW4gMSAxOTcwIChVVEMpCisjaWZkZWYgX1dJTjMyCisvLyBTT0wKKyNlbHNlCisgIGRvdWJsZSBfX2dldHRpbWUoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdjsKKyAgICBnZXR0aW1lb2ZkYXkoJnYsIChzdHJ1Y3QgdGltZXpvbmUqKSBOVUxMKTsKKyAgICByZXR1cm4gdi50dl9zZWMgKyB2LnR2X3VzZWMvMS4wZTY7CisgIH0KKyNlbmRpZgorCisjZGVmaW5lIFdBSVRfTU9ERV9SICAxCisjZGVmaW5lIFdBSVRfTU9ERV9XICAyCisjZGVmaW5lIFdBSVRfTU9ERV9DICAoV0FJVF9NT0RFX1J8V0FJVF9NT0RFX1cpCitUX0VSUkNPREUgc29ja2V0X3dhaXQocF9zb2NrZXQgc29jaywgaW50IG1vZGUsIGludCB0aW1lb3V0KSB7CisgIGludCByZXQgPSAwOworICBmZF9zZXQgcmZkcywgd2ZkczsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGRvdWJsZSBlbmQsIHQ7CisgIGlmICghdGltZW91dCkgeworICAgIHJldHVybiBUSU1FT1VUOworICB9CisKKyAgZW5kID0gX19nZXR0aW1lKCkgKyB0aW1lb3V0LzEwMDA7CisgIGRvIHsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9aRVJPKCZ3ZmRzKTsKKworICAgIC8vIFNwZWNpZnkgd2hhdCBJL08gb3BlcmF0aW9ucyB3ZSBjYXJlIGFib3V0CisgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfUikgeworICAgICAgRkRfU0VUKCpzb2NrLCAmcmZkcyk7CisgICAgfQorICAgIGlmIChtb2RlICYgV0FJVF9NT0RFX1cpIHsKKyAgICAgIEZEX1NFVCgqc29jaywgJndmZHMpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0aW1lb3V0CisgICAgdCA9IGVuZCAtIF9fZ2V0dGltZSgpOworICAgIGlmICh0IDwgMC4wKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBXYWl0CisgICAgdHYudHZfc2VjID0gKGludCl0OworICAgIHR2LnR2X3VzZWMgPSAoaW50KSgodCAtIHR2LnR2X3NlYykgKiAxLjBlNik7CisgICAgcmV0ID0gc2VsZWN0KCpzb2NrKzEsICZyZmRzLCAmd2ZkcywgTlVMTCwgJnR2KTsKKyAgfSB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIHJldHVybiBlcnJubzsKKyAgfQorCisgIC8vIENoZWNrIGZvciB0aW1lb3V0CisgIGlmIChyZXQgPT0gMCkgeworICAgIHJldHVybiBUSU1FT1VUOworICB9CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIGFjdHVhbGx5IHJlYWQgZnJvbSB0aGUgcmVtb3RlIGhvc3QKKyAgaWYgKG1vZGUgJiBXQUlUX01PREVfQyAmJiBGRF9JU1NFVCgqc29jaywgJnJmZHMpICYmCisgICAgICByZWN2KCpzb2NrLCAoY2hhciopICZyZmRzLCAwLCAwKSAhPSAwKSB7CisgICAgcmV0dXJuIGVycm5vOworICB9CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmFsCisKK1RfRVJSQ09ERSBzb2NrZXRfY3JlYXRlKHBfc29ja2V0IHNvY2ssIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpIHsKKyAgKnNvY2sgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgIGlmICgqc29jayA+IDApIHsKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZXJybm87CisgIH0KK30KKworVF9FUlJDT0RFIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHNvY2spIHsKKyAgLy8gVE9ETyBGaWd1cmUgb3V0IGlmIEkgc2hvdWxkIGJlIGZyZWUtaW5nIHRoaXMKKyAgaWYgKCpzb2NrID4gMCkgeworICAgICh2b2lkKXNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgICBjbG9zZSgqc29jayk7CisgICAgKnNvY2sgPSAtMTsKKyAgfQorICByZXR1cm4gU1VDQ0VTUzsKK30KKworVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKSB7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKGJpbmQoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSkgeworICAgIHJldCA9IGVycm5vOworICB9CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OworfQorCitUX0VSUkNPREUgc29ja2V0X2dldF9pbmZvKHBfc29ja2V0IHNvY2ssIHNob3J0ICpwb3J0LCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzYSk7CisgIGludCByYyA9IGdldHNvY2tuYW1lKCpzb2NrLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZhZGRybGVuKTsKKyAgaWYgKCFyYykgeworICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luLT5zaW42X2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZzaW4tPnNpbl9hZGRyLCBidWYsIGxlbikpIHsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgICAgfQorICAgICAgKnBvcnQgPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICB9CisgICAgcmV0dXJuIFNVQ0NFU1M7CisgIH0KKyAgcmV0dXJuIGVycm5vOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2VydmVyCisKK1RfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IGNsaWVudCwKKyAgICAgICAgICAgICAgICAgIHBfc2EgYWRkciwgc29ja2xlbl90ICphZGRybGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICBkbyB7CisgICAgKmNsaWVudCA9IGFjY2VwdCgqc29jaywgYWRkciwgYWRkcmxlbik7CisgICAgaWYgKCpjbGllbnQgPiAwKSB7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworCisgIGlmIChlcnIgPT0gRUFHQUlOIHx8IGVyciA9PSBFQ09OTkFCT1JURUQpIHsKKyAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpIHsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAobGlzdGVuKCpzb2NrLCBiYWNrbG9nKSkgeworICAgIHJldCA9IGVycm5vOworICB9CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xpZW50CisKK1RfRVJSQ09ERSBzb2NrZXRfY29ubmVjdChwX3NvY2tldCBzb2NrLCBwX3NhIGFkZHIsIGludCBhZGRyX2xlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVycjsKKyAgaWYgKCpzb2NrIDwgMCkgeworICAgIHJldHVybiBDTE9TRUQ7CisgIH0KKworICBkbyB7CisgICAgaWYgKGNvbm5lY3QoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSA9PSAwKSB7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworICBpZiAoZXJyICE9IEVJTlBST0dSRVNTICYmIGVyciAhPSBFQUdBSU4pIHsKKyAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfQywgdGltZW91dCk7Cit9CisKK1RfRVJSQ09ERSBzb2NrZXRfc2VuZCgKKyAgcF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVyciwgcHV0ID0gMDsKKyAgaWYgKCpzb2NrIDwgMCkgeworICAgIHJldHVybiBDTE9TRUQ7CisgIH0KKyAgZG8geworICAgIHB1dCA9IHNlbmQoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CisgICAgaWYgKHB1dCA+IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisKKyAgaWYgKGVyciA9PSBFQUdBSU4pIHsKKyAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1csIHRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworVF9FUlJDT0RFIHNvY2tldF9yZWN2KAorICBwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCwgaW50ICpyZWNlaXZlZCkgeworICBpbnQgZXJyLCBnb3QgPSAwOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICAqcmVjZWl2ZWQgPSAwOworCisgIGRvIHsKKyAgICBnb3QgPSByZWN2KCpzb2NrLCBkYXRhLCBsZW4sIDApOworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAqcmVjZWl2ZWQgPSBnb3Q7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgICAgZXJyID0gZXJybm87CisKKyAgICAvLyBDb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBieSBwZWVyCisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICByZXR1cm4gQ0xPU0VEOworICAgIH0KKyAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKKworICBpZiAoZXJyID09IEVBR0FJTikgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVXRpbAorCitUX0VSUkNPREUgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKKyAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOworICBmbGFncyB8PSBPX05PTkJMT0NLOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKK30KKworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CisgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKKyAgZmxhZ3MgJj0gKH4oT19OT05CTE9DSykpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRDUAorCisjZGVmaW5lIEVSUk9SU1RSX1JFVFVSTihlcnIpIFwKKyAgaWYgKGVyciA9PSBTVUNDRVNTKSB7IFwKKyAgICByZXR1cm4gTlVMTDsgXAorICB9IGVsc2UgaWYgKGVyciA9PSBUSU1FT1VUKSB7IFwKKyAgICByZXR1cm4gVElNRU9VVF9NU0c7IFwKKyAgfSBlbHNlIGlmIChlcnIgPT0gQ0xPU0VEKSB7IFwKKyAgICByZXR1cm4gQ0xPU0VEX01TRzsgXAorICB9IFwKKyAgcmV0dXJuIHN0cmVycm9yKGVycikKKworY29uc3QgY2hhciAqIHRjcF9jcmVhdGUocF9zb2NrZXQgc29jaykgeworICBpbnQgZXJyID0gc29ja2V0X2NyZWF0ZShzb2NrLCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgeworICBpbnQgZXJyID0gc29ja2V0X2Rlc3Ryb3koc29jayk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2JpbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgc2hvcnQgcG9ydCkgeworICBpbnQgZXJyOworICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsOworICBtZW1zZXQoJmxvY2FsLCAwLCBzaXplb2YobG9jYWwpKTsKKyAgbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIGxvY2FsLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBsb2NhbC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAoc3RyY21wKGhvc3QsICIqIikgJiYgIWluZXRfYXRvbihob3N0LCAmbG9jYWwuc2luX2FkZHIpKSB7CisgICAgaCA9IGdldGhvc3RieW5hbWUoaG9zdCk7CisgICAgaWYgKCFoKSB7CisgICAgICByZXR1cm4gaHN0cmVycm9yKGhfZXJybm8pOworICAgIH0KKyAgICBtZW1jcHkoJmxvY2FsLnNpbl9hZGRyLAorICAgICAgICAgICAoc3RydWN0IGluX2FkZHIgKiloLT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgIH0KKyAgZXJyID0gc29ja2V0X2JpbmQoc29jaywgKHBfc2EpICZsb2NhbCwgc2l6ZW9mKGxvY2FsKSk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZykgeworICBpbnQgZXJyID0gc29ja2V0X2xpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IGNsaWVudCwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVyciA9IHNvY2tldF9hY2NlcHQoc29jaywgY2xpZW50LCBOVUxMLCBOVUxMLCB0aW1lb3V0KTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfY29ubmVjdChwX3NvY2tldCBzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZTsKKyAgbWVtc2V0KCZyZW1vdGUsIDAsIHNpemVvZihyZW1vdGUpKTsKKyAgcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgaWYgKHN0cmNtcChob3N0LCAiKiIpICYmICFpbmV0X2F0b24oaG9zdCwgJnJlbW90ZS5zaW5fYWRkcikpIHsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKyAgICBpZiAoIWgpIHsKKyAgICAgIHJldHVybiBoc3RyZXJyb3IoaF9lcnJubyk7CisgICAgfQorICAgIG1lbWNweSgmcmVtb3RlLnNpbl9hZGRyLAorICAgICAgICAgICAoc3RydWN0IGluX2FkZHIgKiloLT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgIH0KKyAgZXJyID0gc29ja2V0X2Nvbm5lY3Qoc29jaywgKHBfc2EpICZyZW1vdGUsIHNpemVvZihyZW1vdGUpLCB0aW1lb3V0KTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKKyNkZWZpbmUgV1JJVEVfU1RFUCA4MTkyCitjb25zdCBjaGFyICogdGNwX3NlbmQoCisgIHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKiBkYXRhLCBzaXplX3Qgd19sZW4sIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIHNpemVfdCBwdXQgPSAwLCBzdGVwOworICBpZiAoIXdfbGVuKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBkbyB7CisgICAgc3RlcCA9IChXUklURV9TVEVQIDwgd19sZW4gLSBwdXQgPyBXUklURV9TVEVQIDogd19sZW4gLSBwdXQpOworICAgIGVyciA9IHNvY2tldF9zZW5kKHNvY2ssIGRhdGEgKyBwdXQsIHN0ZXAsIHRpbWVvdXQpOworICAgIHB1dCArPSBzdGVwOworICB9IHdoaWxlIChlcnIgPT0gU1VDQ0VTUyAmJiBwdXQgPCB3X2xlbik7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX3Jhd19yZWNlaXZlKAorICBwX3NvY2tldCBzb2NrLCBjaGFyICogZGF0YSwgc2l6ZV90IHJfbGVuLCBpbnQgdGltZW91dCwgaW50ICpyZWNlaXZlZCkgeworICBpbnQgZXJyID0gc29ja2V0X3JlY3Yoc29jaywgZGF0YSwgcl9sZW4sIHRpbWVvdXQsIHJlY2VpdmVkKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjNmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NoZWNrLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgdGVzdCBUZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagorCSR7RE9UTkVUQ09SRX0gdGVzdCBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgVGhyaWZ0L2JpbgorCSQoUk0pIC1yIFRocmlmdC9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVRlc3RzIFwKKwlUaHJpZnQgXAorCVRocmlmdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2ggXAorCXJ1bnRlc3RzLmNtZCBcCisJcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1JFQURNRS5tZCBiL2xpYi9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIwNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRjb3JlCisKK1RocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMgLSBwcm9qZWN0IGZvciBjaGVja2luZyBwdWJsaWMgaW50ZXJmYWNlcyBkdXJpbmcgYWRkaW5nIGNoYW5nZXMgdG8gVGhyaWZ0IGxpYnJhcnkKKy0gVGhyaWZ0IC0gVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIC5ORVQgU3RhbmRhcmQgMS42IChTREsgMi4wLjApCisKKyMgSG93IHRvIGJ1aWxkIG9uIFdpbmRvd3MKKy0gR2V0IFRocmlmdCBJREwgY29tcGlsZXIgZXhlY3V0YWJsZSwgYWRkIHRvIHNvbWUgZm9sZGVyIGFuZCBhZGQgcGF0aCB0byB0aGlzIGZvbGRlciBpbnRvIFBBVEggdmFyaWFibGUKKy0gT3BlbiB0aGUgVGhyaWZ0LnNsbiBwcm9qZWN0IHdpdGggVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQuCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UKKworIyBLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTRjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9BcGFjaGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNTAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBLZWxsZXJtYW5Tb2Z0d2FyZS5Db21wYXJlTmV0T2JqZWN0czsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcm90b2NvbHNPcGVyYXRpb25zVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGFyZUxvZ2ljIF9jb21wYXJlTG9naWMgPSBuZXcgQ29tcGFyZUxvZ2ljKCk7CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1lc3NhZ2VfVGVzdChUeXBlIHByb3RvY29sVHlwZSwgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1lc3NhZ2UobmFtZW9mKFRNZXNzYWdlKSwgbWVzc2FnZVR5cGUsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNZXNzYWdlID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RydWN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU3RydWN0KG5hbWVvZihUU3RydWN0KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRGaWVsZF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVEZpZWxkKG5hbWVvZihURmllbGQpLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWFwX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWFwKFRUeXBlLlN0cmluZywgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZExpc3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRMaXN0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFNldF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFNldChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJvb2xfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQnl0ZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzYnl0ZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTE2X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNob3J0Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTE2QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkxNkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTMyX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMzJBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEk2NF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTY0QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRG91YmxlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGRvdWJsZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cmluZ19UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuYW1lb2YoU3RyaW5nKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJpbmdBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJpbmFyeV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKG5hbWVvZihTdHJpbmcpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJpbmFyeUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+IEdldFByb3RvY29sSW5zdGFuY2UoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgc3RyZWFtQ2xpZW50VHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQobWVtb3J5U3RyZWFtLCBtZW1vcnlTdHJlYW0pOworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gKFRQcm90b2NvbCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHByb3RvY29sVHlwZSwgc3RyZWFtQ2xpZW50VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+KG1lbW9yeVN0cmVhbSwgcHJvdG9jb2wpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwyOSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CisvQXBhY2hlCisvRmFjZWJvb2sKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNzA1IEBACisjIS91c3IvbG9jYWwvYmluL3RocmlmdCAtLWphdmEgLS1waHAgLS1weQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyMgKioqIFBMRUFTRSBSRU1FTUJFUiBUTyBFRElUIFRIRSBWRVJTSU9OIENPTlNUQU5UIFdIRU4gTUFLSU5HIENIQU5HRVMgKioqCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjCisjIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBDYXNzYW5kcmEgU2VydmljZQorIworCituYW1lc3BhY2UgbmV0Y29yZSBBcGFjaGUuQ2Fzc2FuZHJhLlRlc3QKKworIyBUaHJpZnQucmIgaGFzIGEgYnVnIHdoZXJlIHRvcC1sZXZlbCBtb2R1bGVzIHRoYXQgaW5jbHVkZSBtb2R1bGVzIAorIyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIG5vdCBwcm9wZXJseSByZWZlcmVuY2VkLCBzbyB3ZSBjYW4ndCBkbworIyBDYXNzYW5kcmE6OkNhc3NhbmRyYTo6Q2xpZW50LgorbmFtZXNwYWNlIHJiIENhc3NhbmRyYVRocmlmdAorCisjIFRoZSBBUEkgdmVyc2lvbiAoTk9UIHRoZSBwcm9kdWN0IHZlcnNpb24pLCBjb21wb3NlZCBhcyBhIGRvdCBkZWxpbWl0ZWQKKyMgc3RyaW5nIHdpdGggbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwgY29tcG9uZW50cy4KKyMKKyMgIC0gTWFqb3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgY2hhbmdlcyB0byB0aGUgbnVtYmVyIG9yIGRpc3Bvc2l0aW9uIG9mIG1ldGhvZCBhcmd1bWVudHMuCisjICAtIE1pbm9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgKG9wdGlvbmFsKSBtZXRob2QuCisjICAtIFBhdGNoOiBJbmNyZW1lbnRlZCBmb3IgYnVnIGZpeGVzLiBUaGUgcGF0Y2ggbGV2ZWwgc2hvdWxkIGJlIGluY3JlYXNlZAorIyAgICAgICAgICAgZm9yIGV2ZXJ5IGVkaXQgdGhhdCBkb2Vzbid0IHJlc3VsdCBpbiBhIGNoYW5nZSB0byBtYWpvci9taW5vci4KKyMKKyMgU2VlIHRoZSBTZW1hbnRpYyBWZXJzaW9uaW5nIFNwZWNpZmljYXRpb24gKFNlbVZlcikgaHR0cDovL3NlbXZlci5vcmcuCitjb25zdCBzdHJpbmcgVkVSU0lPTiA9ICIxOS4yNC4wIgorCisKKyMKKyMgZGF0YSBzdHJ1Y3R1cmVzCisjCisKKy8qKiBCYXNpYyB1bml0IG9mIGRhdGEgd2l0aGluIGEgQ29sdW1uRmFtaWx5LgorICogQHBhcmFtIG5hbWUsIHRoZSBuYW1lIGJ5IHdoaWNoIHRoaXMgY29sdW1uIGlzIHNldCBhbmQgcmV0cmlldmVkLiAgTWF4aW11bSA2NEtCIGxvbmcuCisgKiBAcGFyYW0gdmFsdWUuIFRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4gIE1heGltdW0gMkdCIGxvbmcsIGJ1dCBpbiBwcmFjdGljZSB5b3Ugc2hvdWxkIGxpbWl0IGl0IHRvIHNtYWxsIG51bWJlcnMgb2YgTUIgKHNpbmNlIFRocmlmdCBtdXN0IHJlYWQgdGhlIGZ1bGwgdmFsdWUgaW50byBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBpdCkuCisgKiBAcGFyYW0gdGltZXN0YW1wLiBUaGUgdGltZXN0YW1wIGlzIHVzZWQgZm9yIGNvbmZsaWN0IGRldGVjdGlvbi9yZXNvbHV0aW9uIHdoZW4gdHdvIGNvbHVtbnMgd2l0aCBzYW1lIG5hbWUgbmVlZCB0byBiZSBjb21wYXJlZC4KKyAqIEBwYXJhbSB0dGwuIEFuIG9wdGlvbmFsLCBwb3NpdGl2ZSBkZWxheSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggdGhlIGNvbHVtbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gCisgKi8KK3N0cnVjdCBDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiBvcHRpb25hbCBiaW5hcnkgdmFsdWUsCisgICAzOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgNDogb3B0aW9uYWwgaTMyIHR0bCwKK30KKworLyoqIEEgbmFtZWQgbGlzdCBvZiBjb2x1bW5zLgorICogQHBhcmFtIG5hbWUuIHNlZSBDb2x1bW4ubmFtZS4KKyAqIEBwYXJhbSBjb2x1bW5zLiBBIGNvbGxlY3Rpb24gb2Ygc3RhbmRhcmQgQ29sdW1ucy4gIFRoZSBjb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBhcmUgZGVmaW5lZCBpbiBhbiBhZGhvYyBtYW5uZXIuCisgKiAgICAgICAgICAgICAgICAgQ29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gZG8gbm90IGhhdmUgdG8gaGF2ZSBtYXRjaGluZyBzdHJ1Y3R1cmVzIChzaW1pbGFybHkgbmFtZWQgY2hpbGQgY29sdW1ucykuCisgKi8KK3N0cnVjdCBTdXBlckNvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgQ291bnRlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgaTY0IHZhbHVlCit9CisKK3N0cnVjdCBDb3VudGVyU3VwZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q291bnRlckNvbHVtbj4gY29sdW1ucworfQorCisvKioKKyAgICBNZXRob2RzIGZvciBmZXRjaGluZyByb3dzL3JlY29yZHMgZnJvbSBDYXNzYW5kcmEgd2lsbCByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gb3IgYSBsaXN0CisgICAgb2YgQ29sdW1uT3JTdXBlckNvbHVtbnMgKGdldF9zbGljZSgpKS4gSWYgeW91J3JlIGxvb2tpbmcgdXAgYSBTdXBlckNvbHVtbiAob3IgbGlzdCBvZiBTdXBlckNvbHVtbnMpIHRoZW4gdGhlIHJlc3VsdGluZworICAgIGluc3RhbmNlcyBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIHdpbGwgaGF2ZSB0aGUgcmVxdWVzdGVkIFN1cGVyQ29sdW1uIGluIHRoZSBhdHRyaWJ1dGUgc3VwZXJfY29sdW1uLiBGb3IgcXVlcmllcyByZXN1bHRpbmcKKyAgICBpbiBDb2x1bW5zLCB0aG9zZSB2YWx1ZXMgd2lsbCBiZSBpbiB0aGUgYXR0cmlidXRlIGNvbHVtbi4gVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgYmV0d2VlbiAwLjMgYW5kIDAuNCB0byBzdGFuZGFyZGl6ZSBvbgorICAgIHNpbmdsZSBxdWVyeSBtZXRob2RzIHRoYXQgbWF5IHJldHVybiBlaXRoZXIgYSBTdXBlckNvbHVtbiBvciBDb2x1bW4uCisKKyAgICBJZiB0aGUgcXVlcnkgd2FzIG9uIGEgY291bnRlciBjb2x1bW4gZmFtaWx5LCB5b3Ugd2lsbCBlaXRoZXIgZ2V0IGEgY291bnRlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBjb2x1bW4pIG9yIGEgCisgICAgY291bnRlcl9zdXBlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBzdXBlcl9jb2x1bW4pCisKKyAgICBAcGFyYW0gY29sdW1uLiBUaGUgQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9jb2x1bW4uIFRoZSBDb3VudGVyb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfc3VwZXJfY29sdW1uLiBUaGUgQ291bnRlclN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICovCitzdHJ1Y3QgQ29sdW1uT3JTdXBlckNvbHVtbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uIGNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBTdXBlckNvbHVtbiBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgQ291bnRlckNvbHVtbiBjb3VudGVyX2NvbHVtbiwKKyAgICA0OiBvcHRpb25hbCBDb3VudGVyU3VwZXJDb2x1bW4gY291bnRlcl9zdXBlcl9jb2x1bW4KK30KKworCisjCisjIEV4Y2VwdGlvbnMKKyMgKG5vdGUgdGhhdCBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JzIHdpbGwgcmFpc2UgYSBUQXBwbGljYXRpb25FeGNlcHRpb24sIGNvdXJ0ZXN5IG9mIFRocmlmdCkKKyMKKworLyoqIEEgc3BlY2lmaWMgY29sdW1uIHdhcyByZXF1ZXN0ZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KK2V4Y2VwdGlvbiBOb3RGb3VuZEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBJbnZhbGlkIHJlcXVlc3QgY291bGQgbWVhbiBrZXlzcGFjZSBvciBjb2x1bW4gZmFtaWx5IGRvZXMgbm90IGV4aXN0LCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLCBvciBhIHBhcmFtZXRlciBpcyBtYWxmb3JtZWQuIAorICAgIHdoeSBjb250YWlucyBhbiBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UuCisqLworZXhjZXB0aW9uIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBOb3QgYWxsIHRoZSByZXBsaWNhcyByZXF1aXJlZCBjb3VsZCBiZSBjcmVhdGVkIGFuZC9vciByZWFkLiAqLworZXhjZXB0aW9uIFVuYXZhaWxhYmxlRXhjZXB0aW9uIHsKK30KKworLyoqIFJQQyB0aW1lb3V0IHdhcyBleGNlZWRlZC4gIGVpdGhlciBhIG5vZGUgZmFpbGVkIG1pZC1vcGVyYXRpb24sIG9yIGxvYWQgd2FzIHRvbyBoaWdoLCBvciB0aGUgcmVxdWVzdGVkIG9wIHdhcyB0b28gbGFyZ2UuICovCitleGNlcHRpb24gVGltZWRPdXRFeGNlcHRpb24geworfQorCisvKiogaW52YWxpZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IChpbnZhbGlkIGtleXNwYWNlLCB1c2VyIGRvZXMgbm90IGV4aXN0LCBvciBjcmVkZW50aWFscyBpbnZhbGlkKSAqLworZXhjZXB0aW9uIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhvcml6YXRpb24gcmVxdWVzdCAodXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBrZXlzcGFjZSkgKi8KK2V4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBzY2hlbWFzIGFyZSBub3QgaW4gYWdyZWVtZW50IGFjcm9zcyBhbGwgbm9kZXMgKi8KK2V4Y2VwdGlvbiBTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24geworfQorCisKKyMKKyMgc2VydmljZSBhcGkKKyMKKy8qKiAKKyAqIFRoZSBDb25zaXN0ZW5jeUxldmVsIGlzIGFuIGVudW0gdGhhdCBjb250cm9scyBib3RoIHJlYWQgYW5kIHdyaXRlCisgKiBiZWhhdmlvciBiYXNlZCBvbiB0aGUgUmVwbGljYXRpb25GYWN0b3Igb2YgdGhlIGtleXNwYWNlLiAgVGhlCisgKiBkaWZmZXJlbnQgY29uc2lzdGVuY3kgbGV2ZWxzIGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzLCBkZXBlbmRpbmcgb24KKyAqIGlmIHlvdSdyZSBkb2luZyBhIHdyaXRlIG9yIHJlYWQgb3BlcmF0aW9uLiAKKyAqCisgKiBJZiBXICsgUiA+IFJlcGxpY2F0aW9uRmFjdG9yLCB3aGVyZSBXIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgdG8KKyAqIGJsb2NrIGZvciBvbiB3cml0ZSwgYW5kIFIgdGhlIG51bWJlciB0byBibG9jayBmb3Igb24gcmVhZHMsIHlvdQorICogd2lsbCBoYXZlIHN0cm9uZ2x5IGNvbnNpc3RlbnQgYmVoYXZpb3I7IHRoYXQgaXMsIHJlYWRlcnMgd2lsbAorICogYWx3YXlzIHNlZSB0aGUgbW9zdCByZWNlbnQgd3JpdGUuIE9mIHRoZXNlLCB0aGUgbW9zdCBpbnRlcmVzdGluZyBpcworICogdG8gZG8gUVVPUlVNIHJlYWRzIGFuZCB3cml0ZXMsIHdoaWNoIGdpdmVzIHlvdSBjb25zaXN0ZW5jeSB3aGlsZQorICogc3RpbGwgYWxsb3dpbmcgYXZhaWxhYmlsaXR5IGluIHRoZSBmYWNlIG9mIG5vZGUgZmFpbHVyZXMgdXAgdG8gaGFsZgorICogb2YgPFJlcGxpY2F0aW9uRmFjdG9yPi4gT2YgY291cnNlIGlmIGxhdGVuY3kgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbgorICogY29uc2lzdGVuY3kgdGhlbiB5b3UgY2FuIHVzZSBsb3dlciB2YWx1ZXMgZm9yIGVpdGhlciBvciBib3RoLgorICogCisgKiBTb21lIENvbnNpc3RlbmN5TGV2ZWxzIChPTkUsIFRXTywgVEhSRUUpIHJlZmVyIHRvIGEgc3BlY2lmaWMgbnVtYmVyCisgKiBvZiByZXBsaWNhcyByYXRoZXIgdGhhbiBhIGxvZ2ljYWwgY29uY2VwdCB0aGF0IGFkanVzdHMKKyAqIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcmVwbGljYXRpb24gZmFjdG9yLiAgT2YgdGhlc2UsIG9ubHkgT05FIGlzCisgKiBjb21tb25seSB1c2VkOyBUV08gYW5kIChldmVuIG1vcmUgcmFyZWx5KSBUSFJFRSBhcmUgb25seSB1c2VmdWwKKyAqIHdoZW4geW91IGNhcmUgbW9yZSBhYm91dCBndWFyYW50ZWVpbmcgYSBjZXJ0YWluIGxldmVsIG9mCisgKiBkdXJhYmlsaXR5LCB0aGFuIGNvbnNpc3RlbmN5LgorICogCisgKiBXcml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJlcG9ydGluZyBzdWNjZXNzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiBvbmNlIHNvbWV3aGVyZSwgaW5jbHVkaW5nIHBvc3NpYmx5IGJlaW5nIGhpbnRlZCBpbiBhIG5vbi10YXJnZXQgbm9kZS4KKyAqICAgT05FICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDEgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUV08gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMiBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRIUkVFICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAzIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgUVVPUlVNICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcworICogICBMT0NBTF9RVU9SVU0gRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzLCB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBFQUNIX1FVT1JVTSAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzIGluIGVhY2ggZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEFMTCAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaXMgd3JpdHRlbiB0byA8Y29kZT4mbHQ7UmVwbGljYXRpb25GYWN0b3ImZ3Q7PC9jb2RlPiBub2RlcyBiZWZvcmUgcmVzcG9uZGluZyB0byB0aGUgY2xpZW50LgorICogCisgKiBSZWFkIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmV0dXJuaW5nIHN1Y2Nlc3NmdWwgcmVzdWx0cyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgTm90IHN1cHBvcnRlZC4gWW91IHByb2JhYmx5IHdhbnQgT05FIGluc3RlYWQuCisgKiAgIE9ORSAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgb2J0YWluZWQgZnJvbSBhIHNpbmdsZSByZXBsaWNhLgorICogICBUV08gICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHR3byByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFRIUkVFICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdGhyZWUgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBRVU9SVU0gICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBMT0NBTF9RVU9SVU0gUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgRUFDSF9RVU9SVU0gIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiBlYWNoIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBBTEwgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGFsbCByZXBsaWNhcyBoYXZlIHJlcGxpZWQgKGltcGxpZXMgbm8gcmVwbGljYSBtYXkgYmUgZG93bikuLgorKi8KK2VudW0gQ29uc2lzdGVuY3lMZXZlbCB7CisgICAgT05FID0gMSwKKyAgICBRVU9SVU0gPSAyLAorICAgIExPQ0FMX1FVT1JVTSA9IDMsCisgICAgRUFDSF9RVU9SVU0gPSA0LAorICAgIEFMTCA9IDUsCisgICAgQU5ZID0gNiwKKyAgICBUV08gPSA3LAorICAgIFRIUkVFID0gOCwKK30KKworLyoqCisgICAgQ29sdW1uUGFyZW50IGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgZ3JvdXBzIG9mIGNvbHVtbnMgZnJvbSB0aGUgc2FtZSBDb2x1bW5GYW1pbHkuIEluIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGVybXMsIGltYWdpbmUKKyAgICBDb2x1bW5QYXJlbnQgYXMgQ29sdW1uUGF0aCArICcvLi4vJy4KKworICAgIFNlZSBhbHNvIDxhIGhyZWY9ImNhc3NhbmRyYS5odG1sI1N0cnVjdF9Db2x1bW5QYXRoIj5Db2x1bW5QYXRoPC9hPgorICovCitzdHJ1Y3QgQ29sdW1uUGFyZW50IHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorfQorCisvKiogVGhlIENvbHVtblBhdGggaXMgdGhlIHBhdGggdG8gYSBzaW5nbGUgY29sdW1uIGluIENhc3NhbmRyYS4gSXQgbWlnaHQgbWFrZSBzZW5zZSB0byB0aGluayBvZiBDb2x1bW5QYXRoIGFuZAorICogQ29sdW1uUGFyZW50IGluIHRlcm1zIG9mIGEgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBDb2x1bW5QYXRoIGlzIHVzZWQgdG8gbG9va2luZyB1cCBhIHNpbmdsZSBjb2x1bW4uCisgKgorICogQHBhcmFtIGNvbHVtbl9mYW1pbHkuIFRoZSBuYW1lIG9mIHRoZSBDRiBvZiB0aGUgY29sdW1uIGJlaW5nIGxvb2tlZCB1cC4KKyAqIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBzdXBlciBjb2x1bW4gbmFtZS4KKyAqIEBwYXJhbSBjb2x1bW4uIFRoZSBjb2x1bW4gbmFtZS4KKyAqLworc3RydWN0IENvbHVtblBhdGggeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgNTogb3B0aW9uYWwgYmluYXJ5IGNvbHVtbiwKK30KKworLyoqCisgICAgQSBzbGljZSByYW5nZSBpcyBhIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBiYXNpYyByYW5nZSwgb3JkZXJpbmcgYW5kIGxpbWl0IGluZm9ybWF0aW9uIGZvciBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4KKyAgICBtdWx0aXBsZSBjb2x1bW5zLiBJdCBjb3VsZCBiZSB0aG91Z2h0IG9mIGFzIENhc3NhbmRyYSdzIHZlcnNpb24gb2YgTElNSVQgYW5kIE9SREVSIEJZCisKKyAgICBAcGFyYW0gc3RhcnQuIFRoZSBjb2x1bW4gbmFtZSB0byBzdGFydCB0aGUgc2xpY2Ugd2l0aC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byAnJywgaS5lLiwgYW4gZW1wdHkgYnl0ZSBhcnJheSwgdG8gc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29sdW1uIG5hbWUuIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgIG11c3QgYSB2YWxpZCB2YWx1ZSB1bmRlciB0aGUgcnVsZXMgb2YgdGhlIENvbXBhcmF0b3IgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIENvbHVtbkZhbWlseS4KKyAgICBAcGFyYW0gZmluaXNoLiBUaGUgY29sdW1uIG5hbWUgdG8gc3RvcCB0aGUgc2xpY2UgYXQuIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvIGFuIGVtcHR5IGJ5dGUgYXJyYXkgdG8gbm90IHN0b3AgdW50aWwgJ2NvdW50JyByZXN1bHRzIGFyZSBzZWVuLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICAgbXVzdCBhbHNvIGJlIGEgdmFsaWQgdmFsdWUgdG8gdGhlIENvbHVtbkZhbWlseSBDb21wYXJhdG9yLgorICAgIEBwYXJhbSByZXZlcnNlZC4gV2hldGhlciB0aGUgcmVzdWx0cyBzaG91bGQgYmUgb3JkZXJlZCBpbiByZXZlcnNlZCBvcmRlci4gU2ltaWxhciB0byBPUkRFUiBCWSBibGFoIERFU0MgaW4gU1FMLgorICAgIEBwYXJhbSBjb3VudC4gSG93IG1hbnkgY29sdW1ucyB0byByZXR1cm4uIFNpbWlsYXIgdG8gTElNSVQgaW4gU1FMLiBNYXkgYmUgYXJiaXRyYXJpbHkgbGFyZ2UsIGJ1dCBUaHJpZnQgd2lsbAorICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUgdGhlIHdob2xlIHJlc3VsdCBpbnRvIG1lbW9yeSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSBjbGllbnQsIHNvIGJlIGF3YXJlIHRoYXQgeW91IG1heQorICAgICAgICAgICAgICAgICAgYmUgYmV0dGVyIHNlcnZlZCBieSBpdGVyYXRpbmcgdGhyb3VnaCBzbGljZXMgYnkgcGFzc2luZyB0aGUgbGFzdCB2YWx1ZSBvZiBvbmUgY2FsbCBpbiBhcyB0aGUgJ3N0YXJ0JworICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgaW5zdGVhZCBvZiBpbmNyZWFzaW5nICdjb3VudCcgYXJiaXRyYXJpbHkgbGFyZ2UuCisgKi8KK3N0cnVjdCBTbGljZVJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgc3RhcnQsCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IGZpbmlzaCwKKyAgICAzOiByZXF1aXJlZCBib29sIHJldmVyc2VkPTAsCisgICAgNDogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCisgICAgQSBTbGljZVByZWRpY2F0ZSBpcyBzaW1pbGFyIHRvIGEgbWF0aGVtYXRpYyBwcmVkaWNhdGUgKHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZWRpY2F0ZV8obWF0aGVtYXRpY2FsX2xvZ2ljKSksCisgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGFzICJhIHByb3BlcnR5IHRoYXQgdGhlIGVsZW1lbnRzIG9mIGEgc2V0IGhhdmUgaW4gY29tbW9uLiIKKworICAgIFNsaWNlUHJlZGljYXRlJ3MgaW4gQ2Fzc2FuZHJhIGFyZSBkZXNjcmliZWQgd2l0aCBlaXRoZXIgYSBsaXN0IG9mIGNvbHVtbl9uYW1lcyBvciBhIFNsaWNlUmFuZ2UuICBJZiBjb2x1bW5fbmFtZXMgaXMKKyAgICBzcGVjaWZpZWQsIHNsaWNlX3JhbmdlIGlzIGlnbm9yZWQuCisKKyAgICBAcGFyYW0gY29sdW1uX25hbWUuIEEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0cmlldmUuIFRoaXMgY2FuIGJlIHVzZWQgc2ltaWxhciB0byBNZW1jYWNoZWQncyAibXVsdGktZ2V0IiBmZWF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICB0byBmZXRjaCBOIGtub3duIGNvbHVtbiBuYW1lcy4gRm9yIGluc3RhbmNlLCBpZiB5b3Uga25vdyB5b3Ugd2lzaCB0byBmZXRjaCBjb2x1bW5zICdKb2UnLCAnSmFjaycsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJ0ppbScgeW91IGNhbiBwYXNzIHRob3NlIGNvbHVtbiBuYW1lcyBhcyBhIGxpc3QgdG8gZmV0Y2ggYWxsIHRocmVlIGF0IG9uY2UuCisgICAgQHBhcmFtIHNsaWNlX3JhbmdlLiBBIFNsaWNlUmFuZ2UgZGVzY3JpYmluZyBob3cgdG8gcmFuZ2UsIG9yZGVyLCBhbmQvb3IgbGltaXQgdGhlIHNsaWNlLgorICovCitzdHJ1Y3QgU2xpY2VQcmVkaWNhdGUgeworICAgIDE6IG9wdGlvbmFsIGxpc3Q8YmluYXJ5PiBjb2x1bW5fbmFtZXMsCisgICAgMjogb3B0aW9uYWwgU2xpY2VSYW5nZSAgIHNsaWNlX3JhbmdlLAorfQorCitlbnVtIEluZGV4T3BlcmF0b3IgeworICAgIEVRLAorICAgIEdURSwKKyAgICBHVCwKKyAgICBMVEUsCisgICAgTFQKK30KKworc3RydWN0IEluZGV4RXhwcmVzc2lvbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGNvbHVtbl9uYW1lLAorICAgIDI6IHJlcXVpcmVkIEluZGV4T3BlcmF0b3Igb3AsCisgICAgMzogcmVxdWlyZWQgYmluYXJ5IHZhbHVlLAorfQorCitzdHJ1Y3QgSW5kZXhDbGF1c2UgeworICAgIDE6IHJlcXVpcmVkIGxpc3Q8SW5kZXhFeHByZXNzaW9uPiBleHByZXNzaW9ucworICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBzdGFydF9rZXksCisgICAgMzogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCitUaGUgc2VtYW50aWNzIG9mIHN0YXJ0IGtleXMgYW5kIHRva2VucyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LgorS2V5cyBhcmUgc3RhcnQtaW5jbHVzaXZlOyB0b2tlbnMgYXJlIHN0YXJ0LWV4Y2x1c2l2ZS4gIFRva2VuCityYW5nZXMgbWF5IGFsc28gd3JhcCAtLSB0aGF0IGlzLCB0aGUgZW5kIHRva2VuIG1heSBiZSBsZXNzCit0aGFuIHRoZSBzdGFydCBvbmUuICBUaHVzLCBhIHJhbmdlIGZyb20ga2V5WCB0byBrZXlYIGlzIGEKK29uZS1lbGVtZW50IHJhbmdlLCBidXQgYSByYW5nZSBmcm9tIHRva2VuWSB0byB0b2tlblkgaXMgdGhlCitmdWxsIHJpbmcuCisqLworc3RydWN0IEtleVJhbmdlIHsKKyAgICAxOiBvcHRpb25hbCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBlbmRfa2V5LAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDU6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAKK30KKworLyoqCisgICAgQSBLZXlTbGljZSBpcyBrZXkgZm9sbG93ZWQgYnkgdGhlIGRhdGEgaXQgbWFwcyB0by4gQSBjb2xsZWN0aW9uIG9mIEtleVNsaWNlIGlzIHJldHVybmVkIGJ5IHRoZSBnZXRfcmFuZ2Vfc2xpY2Ugb3BlcmF0aW9uLgorCisgICAgQHBhcmFtIGtleS4gYSByb3cga2V5CisgICAgQHBhcmFtIGNvbHVtbnMuIExpc3Qgb2YgZGF0YSByZXByZXNlbnRlZCBieSB0aGUga2V5LiBUeXBpY2FsbHksIHRoZSBsaXN0IGlzIHBhcmVkIGRvd24gdG8gb25seSB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgYSBTbGljZVByZWRpY2F0ZS4KKyAqLworc3RydWN0IEtleVNsaWNlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IEtleUNvdW50IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisvKioKKyAqIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIGlzIG9ubHkgb3B0aW9uYWwgaW4gY2FzZSBvZiBjb3VudGVyIGRlbGV0aW9uLgorICovCitzdHJ1Y3QgRGVsZXRpb24geworICAgIDE6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCit9CisKKy8qKgorICAgIEEgTXV0YXRpb24gaXMgZWl0aGVyIGFuIGluc2VydCAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4pIG9yIGEgZGVsZXRpb24gKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgdGhlIGRlbGV0aW9uIGF0dHJpYnV0ZSkuCisgICAgQHBhcmFtIGNvbHVtbl9vcl9zdXBlcmNvbHVtbi4gQW4gaW5zZXJ0IHRvIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uIChwb3NzaWJseSBjb3VudGVyIGNvbHVtbiBvciBzdXBlcmNvbHVtbikKKyAgICBAcGFyYW0gZGVsZXRpb24uIEEgZGVsZXRpb24gb2YgYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4KKyovCitzdHJ1Y3QgTXV0YXRpb24geworICAgIDE6IG9wdGlvbmFsIENvbHVtbk9yU3VwZXJDb2x1bW4gY29sdW1uX29yX3N1cGVyY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIERlbGV0aW9uIGRlbGV0aW9uLAorfQorCitzdHJ1Y3QgRW5kcG9pbnREZXRhaWxzIHsKKyAgICAxOiBzdHJpbmcgaG9zdCwKKyAgICAyOiBzdHJpbmcgZGF0YWNlbnRlciwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgcmFjaworfQorCisvKioKKyAgICBBIFRva2VuUmFuZ2UgZGVzY3JpYmVzIHBhcnQgb2YgdGhlIENhc3NhbmRyYSByaW5nLCBpdCBpcyBhIG1hcHBpbmcgZnJvbSBhIHJhbmdlIHRvCisgICAgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGF0IHJhbmdlLgorICAgIEBwYXJhbSBzdGFydF90b2tlbiBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZF90b2tlbiBUaGUgbGFzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgbGlzdGVuX2FkZHJlc3MpCisgICAgQHBhcmFtIHJwY19lbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBycGNfYWRkcmVzcykKKyovCitzdHJ1Y3QgVG9rZW5SYW5nZSB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgMzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGVuZHBvaW50cywKKyAgICA0OiBvcHRpb25hbCBsaXN0PHN0cmluZz4gcnBjX2VuZHBvaW50cworICAgIDU6IG9wdGlvbmFsIGxpc3Q8RW5kcG9pbnREZXRhaWxzPiBlbmRwb2ludF9kZXRhaWxzLAorfQorCisvKioKKyAgICBBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBjYW4gY29udGFpbiBhbnkgZGF0YSwgZGVwZW5kZW50IG9uIHRoZSBJQXV0aGVudGljYXRvciB1c2VkCisqLworc3RydWN0IEF1dGhlbnRpY2F0aW9uUmVxdWVzdCB7CisgICAgMTogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBjcmVkZW50aWFscworfQorCitlbnVtIEluZGV4VHlwZSB7CisgICAgS0VZUywKKyAgICBDVVNUT00KK30KKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGluIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDb2x1bW5EZWYgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyB2YWxpZGF0aW9uX2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIEluZGV4VHlwZSBpbmRleF90eXBlLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBpbmRleF9uYW1lLAorICAgIDU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBpbmRleF9vcHRpb25zCit9CisKKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDZkRlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBjb2x1bW5fdHlwZT0iU3RhbmRhcmQiLAorICAgIDU6IG9wdGlvbmFsIHN0cmluZyBjb21wYXJhdG9yX3R5cGU9IkJ5dGVzVHlwZSIsCisgICAgNjogb3B0aW9uYWwgc3RyaW5nIHN1YmNvbXBhcmF0b3JfdHlwZSwKKyAgICA4OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKKyAgICAxMjogb3B0aW9uYWwgZG91YmxlIHJlYWRfcmVwYWlyX2NoYW5jZT0xLjAsCisgICAgMTM6IG9wdGlvbmFsIGxpc3Q8Q29sdW1uRGVmPiBjb2x1bW5fbWV0YWRhdGEsCisgICAgMTQ6IG9wdGlvbmFsIGkzMiBnY19ncmFjZV9zZWNvbmRzLAorICAgIDE1OiBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWxpZGF0aW9uX2NsYXNzLAorICAgIDE2OiBvcHRpb25hbCBpMzIgaWQsCisgICAgMTc6IG9wdGlvbmFsIGkzMiBtaW5fY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMTg6IG9wdGlvbmFsIGkzMiBtYXhfY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMjQ6IG9wdGlvbmFsIGJvb2wgcmVwbGljYXRlX29uX3dyaXRlLAorICAgIDI1OiBvcHRpb25hbCBkb3VibGUgbWVyZ2Vfc2hhcmRzX2NoYW5jZSwKKyAgICAyNjogb3B0aW9uYWwgc3RyaW5nIGtleV92YWxpZGF0aW9uX2NsYXNzLAorICAgIDI4OiBvcHRpb25hbCBiaW5hcnkga2V5X2FsaWFzLAorICAgIDI5OiBvcHRpb25hbCBzdHJpbmcgY29tcGFjdGlvbl9zdHJhdGVneSwKKyAgICAzMDogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucywKKyAgICAzMjogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXByZXNzaW9uX29wdGlvbnMsCisgICAgMzM6IG9wdGlvbmFsIGRvdWJsZSBibG9vbV9maWx0ZXJfZnBfY2hhbmNlLAorfQorCisvKiBkZXNjcmliZXMgYSBrZXlzcGFjZS4gKi8KK3N0cnVjdCBLc0RlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHN0cmF0ZWd5X2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBzdHJhdGVneV9vcHRpb25zLAorCisgICAgLyoqIEBkZXByZWNhdGVkICovCisgICAgNDogb3B0aW9uYWwgaTMyIHJlcGxpY2F0aW9uX2ZhY3RvciwgCisKKyAgICA1OiByZXF1aXJlZCBsaXN0PENmRGVmPiBjZl9kZWZzLAorICAgIDY6IG9wdGlvbmFsIGJvb2wgZHVyYWJsZV93cml0ZXM9MSwKK30KKworLyoqIENRTCBxdWVyeSBjb21wcmVzc2lvbiAqLworZW51bSBDb21wcmVzc2lvbiB7CisgICAgR1pJUCA9IDEsCisgICAgTk9ORSA9IDIKK30KKworZW51bSBDcWxSZXN1bHRUeXBlIHsKKyAgICBST1dTID0gMSwKKyAgICBWT0lEID0gMiwKKyAgICBJTlQgPSAzCit9CisKKy8qKiBSb3cgcmV0dXJuZWQgZnJvbSBhIENRTCBxdWVyeSAqLworc3RydWN0IENxbFJvdyB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucworfQorCitzdHJ1Y3QgQ3FsTWV0YWRhdGEgeworICAgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBuYW1lX3R5cGVzLAorICAgIDI6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiB2YWx1ZV90eXBlcywKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF9uYW1lX3R5cGUsCisgICAgNDogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfdmFsdWVfdHlwZQorfQorCitzdHJ1Y3QgQ3FsUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBDcWxSZXN1bHRUeXBlIHR5cGUsCisgICAgMjogb3B0aW9uYWwgbGlzdDxDcWxSb3c+IHJvd3MsCisgICAgMzogb3B0aW9uYWwgaTMyIG51bSwKKyAgICA0OiBvcHRpb25hbCBDcWxNZXRhZGF0YSBzY2hlbWEKK30KKworc3RydWN0IENxbFByZXBhcmVkUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBpMzIgaXRlbUlkLAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisKK3NlcnZpY2UgQ2Fzc2FuZHJhIHsKKyAgIyBhdXRoIG1ldGhvZHMKKyAgdm9pZCBsb2dpbigxOiByZXF1aXJlZCBBdXRoZW50aWNhdGlvblJlcXVlc3QgYXV0aF9yZXF1ZXN0KSB0aHJvd3MgKDE6QXV0aGVudGljYXRpb25FeGNlcHRpb24gYXV0aG54LCAyOkF1dGhvcml6YXRpb25FeGNlcHRpb24gYXV0aHp4KSwKKyAKKyAgIyBzZXQga2V5c3BhY2UKKyAgdm9pZCBzZXRfa2V5c3BhY2UoMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKyAgCisgICMgcmV0cmlldmFsIG1ldGhvZHMKKworICAvKioKKyAgICBHZXQgdGhlIENvbHVtbiBvciBTdXBlckNvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhdGguIElmIG5vIHZhbHVlIGlzIHByZXNlbnQsIE5vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gKFRoaXMgaXMKKyAgICB0aGUgb25seSBtZXRob2QgdGhhdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHVuZGVyIG5vbi1mYWlsdXJlIGNvbmRpdGlvbnMuKQorICAgKi8KKyAgQ29sdW1uT3JTdXBlckNvbHVtbiBnZXQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMzpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgNDpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgR2V0IHRoZSBncm91cCBvZiBjb2x1bW5zIGNvbnRhaW5lZCBieSBjb2x1bW5fcGFyZW50IChlaXRoZXIgYSBDb2x1bW5GYW1pbHkgbmFtZSBvciBhIENvbHVtbkZhbWlseS9TdXBlckNvbHVtbiBuYW1lCisgICAgcGFpcikgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBTbGljZVByZWRpY2F0ZS4gSWYgbm8gbWF0Y2hpbmcgdmFsdWVzIGFyZSBmb3VuZCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKyAgICovCisgIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gZ2V0X3NsaWNlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBtYXRjaGluZyA8Y29kZT5wcmVkaWNhdGU8L2NvZGU+IGZvciBhIHBhcnRpY3VsYXIgPGNvZGU+a2V5PC9jb2RlPiwgCisgICAgPGNvZGU+Q29sdW1uRmFtaWx5PC9jb2RlPiBhbmQgb3B0aW9uYWxseSA8Y29kZT5TdXBlckNvbHVtbjwvY29kZT4uCisgICovCisgIGkzMiBnZXRfY291bnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtcyBhIGdldF9zbGljZSBmb3IgY29sdW1uX3BhcmVudCBhbmQgcHJlZGljYXRlIGZvciB0aGUgZ2l2ZW4ga2V5cyBpbiBwYXJhbGxlbC4KKyAgKi8KKyAgbWFwPGJpbmFyeSxsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+PiBtdWx0aWdldF9zbGljZSgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm0gYSBnZXRfY291bnQgaW4gcGFyYWxsZWwgb24gdGhlIGdpdmVuIGxpc3Q8YmluYXJ5PiBrZXlzLiBUaGUgcmV0dXJuIHZhbHVlIG1hcHMga2V5cyB0byB0aGUgY291bnQgZm91bmQuCisgICovCisgIG1hcDxiaW5hcnksIGkzMj4gbXVsdGlnZXRfY291bnQoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgcmV0dXJucyBhIHN1YnNldCBvZiBjb2x1bW5zIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2Yga2V5cy4KKyAgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X3JhbmdlX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIEtleVJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqIFJldHVybnMgdGhlIHN1YnNldCBvZiBjb2x1bW5zIHNwZWNpZmllZCBpbiBTbGljZVByZWRpY2F0ZSBmb3IgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIEluZGV4Q2xhdXNlICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9pbmRleGVkX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBJbmRleENsYXVzZSBpbmRleF9jbGF1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIGNvbHVtbl9wcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgICMgbW9kaWZpY2F0aW9uIG1ldGhvZHMKKworICAvKioKKyAgICogSW5zZXJ0IGEgQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGFyZW50LmNvbHVtbl9mYW1pbHkgYW5kIG9wdGlvbmFsIGNvbHVtbl9wYXJlbnQuc3VwZXJfY29sdW1uLgorICAgKi8KKyAgdm9pZCBpbnNlcnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb2x1bW4gY29sdW1uLAorICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIEluY3JlbWVudCBvciBkZWNyZW1lbnQgYSBjb3VudGVyLgorICAgKi8KKyAgdm9pZCBhZGQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAzOnJlcXVpcmVkIENvdW50ZXJDb2x1bW4gY29sdW1uLAorICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUmVtb3ZlIGRhdGEgZnJvbSB0aGUgcm93IHNwZWNpZmllZCBieSBrZXkgYXQgdGhlIGdyYW51bGFyaXR5IHNwZWNpZmllZCBieSBjb2x1bW5fcGF0aCwgYW5kIHRoZSBnaXZlbiB0aW1lc3RhbXAuIE5vdGUKKyAgICB0aGF0IGFsbCB0aGUgdmFsdWVzIGluIGNvbHVtbl9wYXRoIGJlc2lkZXMgY29sdW1uX3BhdGguY29sdW1uX2ZhbWlseSBhcmUgdHJ1bHkgb3B0aW9uYWw6IHlvdSBjYW4gcmVtb3ZlIHRoZSBlbnRpcmUKKyAgICByb3cgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBDb2x1bW5GYW1pbHksIG9yIHlvdSBjYW4gcmVtb3ZlIGEgU3VwZXJDb2x1bW4gb3IgYSBzaW5nbGUgQ29sdW1uIGJ5IHNwZWNpZnlpbmcgdGhvc2UgbGV2ZWxzIHRvby4KKyAgICovCisgIHZvaWQgcmVtb3ZlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIGk2NCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIDQ6Q29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogUmVtb3ZlIGEgY291bnRlciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgKiBOb3RlIHRoYXQgY291bnRlcnMgaGF2ZSBsaW1pdGVkIHN1cHBvcnQgZm9yIGRlbGV0ZXM6IGlmIHlvdSByZW1vdmUgYSBjb3VudGVyLCB5b3UgbXVzdCB3YWl0IHRvIGlzc3VlIGFueSBmb2xsb3dpbmcgdXBkYXRlCisgICAqIHVudGlsIHRoZSBkZWxldGUgaGFzIHJlYWNoZWQgYWxsIHRoZSBub2RlcyBhbmQgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGZ1bGx5IGNvbXBhY3RlZC4KKyAgICovCisgIHZvaWQgcmVtb3ZlX2NvdW50ZXIoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgLyoqCisgICAgTXV0YXRlIG1hbnkgY29sdW1ucyBvciBzdXBlciBjb2x1bW5zIGZvciBtYW55IHJvdyBrZXlzLiBTZWUgYWxzbzogTXV0YXRpb24uCisKKyAgICBtdXRhdGlvbl9tYXAgbWFwcyBrZXkgdG8gY29sdW1uIGZhbWlseSB0byBhIGxpc3Qgb2YgTXV0YXRpb24gb2JqZWN0cyB0byB0YWtlIHBsYWNlIGF0IHRoYXQgc2NvcGUuCisgICoqLworICB2b2lkIGJhdGNoX211dGF0ZSgxOnJlcXVpcmVkIG1hcDxiaW5hcnksIG1hcDxzdHJpbmcsIGxpc3Q8TXV0YXRpb24+Pj4gbXV0YXRpb25fbWFwLAorICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisgICAgICAgCisgIC8qKgorICAgVHJ1bmNhdGUgd2lsbCBtYXJrIGFuZCBlbnRpcmUgY29sdW1uIGZhbWlseSBhcyBkZWxldGVkLgorICAgRnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRydW5jYXRlIHdpbGwgcmVzdWx0IGNvbXBsZXRlIGRhdGEgZGVsZXRpb24gZnJvbSBjZm5hbWUuCisgICBJbnRlcm5hbGx5LCBob3dldmVyLCBkaXNrIHNwYWNlIHdpbGwgbm90IGJlIGltbWVkaWF0aWx5IHJlbGVhc2VkLCBhcyB3aXRoIGFsbCBkZWxldGVzIGluIGNhc3NhbmRyYSwgdGhpcyBvbmUKKyAgIG9ubHkgbWFya3MgdGhlIGRhdGEgYXMgZGVsZXRlZC4KKyAgIFRoZSBvcGVyYXRpb24gc3VjY2VlZHMgb25seSBpZiBhbGwgaG9zdHMgaW4gdGhlIGNsdXN0ZXIgYXQgYXZhaWxhYmxlIGFuZCB3aWxsIHRocm93IGFuIFVuYXZhaWxhYmxlRXhjZXB0aW9uIGlmIAorICAgc29tZSBob3N0cyBhcmUgZG93bi4KKyAgKi8KKyAgdm9pZCB0cnVuY2F0ZSgxOnJlcXVpcmVkIHN0cmluZyBjZm5hbWUpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6IFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOiBUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAgIAorICAvLyBNZXRhLUFQSXMgLS0gQVBJcyB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgb3IgY2x1c3RlciwKKyAgLy8gcmF0aGVyIHRoYW4gdXNlciBkYXRhLiAgVGhlIG5vZGVwcm9iZSBwcm9ncmFtIHByb3ZpZGVzIHVzYWdlIGV4YW1wbGVzLgorICAKKyAgLyoqIAorICAgKiBmb3IgZWFjaCBzY2hlbWEgdmVyc2lvbiBwcmVzZW50IGluIHRoZSBjbHVzdGVyLCByZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBhdCB0aGF0IHZlcnNpb24uCisgICAqIGhvc3RzIHRoYXQgZG8gbm90IHJlc3BvbmQgd2lsbCBiZSB1bmRlciB0aGUga2V5IERhdGFiYXNlRGVzY3JpcHRvci5JTklUSUFMX1ZFUlNJT04uIAorICAgKiB0aGUgY2x1c3RlciBpcyBhbGwgb24gdGhlIHNhbWUgdmVyc2lvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgbWFwIGlzIDEuIAorICAgKi8KKyAgbWFwPHN0cmluZywgbGlzdDxzdHJpbmc+PiBkZXNjcmliZV9zY2hlbWFfdmVyc2lvbnMoKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogbGlzdCB0aGUgZGVmaW5lZCBrZXlzcGFjZXMgaW4gdGhpcyBjbHVzdGVyICovCisgIGxpc3Q8S3NEZWY+IGRlc2NyaWJlX2tleXNwYWNlcygpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGdldCB0aGUgY2x1c3RlciBuYW1lICovCisgIHN0cmluZyBkZXNjcmliZV9jbHVzdGVyX25hbWUoKSwKKworICAvKiogZ2V0IHRoZSB0aHJpZnQgYXBpIHZlcnNpb24gKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3ZlcnNpb24oKSwKKworICAvKiogZ2V0IHRoZSB0b2tlbiByaW5nOiBhIG1hcCBvZiByYW5nZXMgdG8gaG9zdCBhZGRyZXNzZXMsCisgICAgICByZXByZXNlbnRlZCBhcyBhIHNldCBvZiBUb2tlblJhbmdlIGluc3RlYWQgb2YgYSBtYXAgZnJvbSByYW5nZQorICAgICAgdG8gbGlzdCBvZiBlbmRwb2ludHMsIGJlY2F1c2UgeW91IGNhbid0IHVzZSBUaHJpZnQgc3RydWN0cyBhcworICAgICAgbWFwIGtleXM6CisgICAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIgCisKKyAgICAgIGZvciB0aGUgc2FtZSByZWFzb24sIHdlIGNhbid0IHJldHVybiBhIHNldCBoZXJlLCBldmVuIHRob3VnaAorICAgICAgb3JkZXIgaXMgbmVpdGhlciBpbXBvcnRhbnQgbm9yIHByZWRpY3RhYmxlLiAqLworICBsaXN0PFRva2VuUmFuZ2U+IGRlc2NyaWJlX3JpbmcoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIHJldHVybnMgdGhlIHBhcnRpdGlvbmVyIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9wYXJ0aXRpb25lcigpLAorCisgIC8qKiByZXR1cm5zIHRoZSBzbml0Y2ggdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3NuaXRjaCgpLAorCisgIC8qKiBkZXNjcmliZSBzcGVjaWZpZWQga2V5c3BhY2UgKi8KKyAgS3NEZWYgZGVzY3JpYmVfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMjpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBleHBlcmltZW50YWwgQVBJIGZvciBoYWRvb3AvcGFyYWxsZWwgcXVlcnkgc3VwcG9ydC4gIAorICAgICAgbWF5IGNoYW5nZSB2aW9sZW50bHkgYW5kIHdpdGhvdXQgd2FybmluZy4gCisKKyAgICAgIHJldHVybnMgbGlzdCBvZiB0b2tlbiBzdHJpbmdzIHN1Y2ggdGhhdCBmaXJzdCBzdWJyYW5nZSBpcyAobGlzdFswXSwgbGlzdFsxXV0sCisgICAgICBuZXh0IGlzIChsaXN0WzFdLCBsaXN0WzJdXSwgZXRjLiAqLworICBsaXN0PHN0cmluZz4gZGVzY3JpYmVfc3BsaXRzKDE6cmVxdWlyZWQgc3RyaW5nIGNmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgaTMyIGtleXNfcGVyX3NwbGl0KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBhZGRzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgIAorICAvKiogZHJvcHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3BfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksIAorICAKKyAgLyoqIGFkZHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIGRyb3BzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEga2V5c3BhY2UuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgICAgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBhbmQgcmV0dXJucyBhCisgICAqIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgIC8qKgorICAgKiBQcmVwYXJlIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBjb21waWxpbmcgYW5kIHJldHVybmluZworICAgKiAtIHRoZSB0eXBlIG9mIENRTCBzdGF0ZW1lbnQKKyAgICogLSBhbiBpZCB0b2tlbiBvZiB0aGUgY29tcGlsZWQgQ1FMIHN0b3JlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAqIC0gYSBjb3VudCBvZiB0aGUgZGlzY292ZXJlZCBib3VuZCBtYXJrZXJzIGluIHRoZSBzdGF0ZW1lbnQgCisgICAqLworICBDcWxQcmVwYXJlZFJlc3VsdCBwcmVwYXJlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKQorCisgICAgICAgICAgICAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIHByZXBhcmVkIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgcGFzc2luZyBhbiBpZCB0b2tlbiBhbmQgIGEgbGlzdCBvZiB2YXJpYWJsZXMKKyAgICogdG8gYmluZCBhbmQgcmV0dXJucyBhIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfcHJlcGFyZWRfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgaTMyIGl0ZW1JZCwgMjpyZXF1aXJlZCBsaXN0PHN0cmluZz4gdmFsdWVzKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImQwZDM3MDZiLWZlZDUtNGNmNS1iOTg0LTA0ZjQ0OGRlOWQ3YiIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMzYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjEuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICAvL1RPRE86IEFkZCB0ZXN0cyBmb3IgSUVudW1lcmFibGUgd2l0aCBvYmplY3RzIGFuZCBwcmltaXRpdmUgdmFsdWVzIGluc2lkZQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX0RpZmZlcmVudF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMgfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4geyAxLCAyIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09iamVjdHNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgY29sbGVjdGlvbnMKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09uZUFuZFRoZVNhbWVPYmplY3RfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IGNvbGxlY3Rpb24xOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIG9uZSBhbmQgdGhlIHNhbWUgY29sbGVjdGlvbgorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBYIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTczZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEhhc2hTZXRfRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMTsKKworICAgICAgICAgICAgdmFyIGhhc2hTZXQgPSBuZXcgVEhhc2hTZXQ8aW50PiB7dmFsdWV9OworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5SZW1vdmUodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQ2xlYXIoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICB2YXIgbmV3QXJyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIGhhc2hTZXQuQ29weVRvKG5ld0FyciwgMCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobmV3QXJyLkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIHZhciBlbiA9IGhhc2hTZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoaW50KWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAodmFyIGllbiA9ICgoSUVudW1lcmFibGU8aW50PiloYXNoU2V0KS5HZXRFbnVtZXJhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjODMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXJUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UU3RvcF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZS5TdG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9Ob25FeGlzdGluZ1RUeXBlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKChUVHlwZSkxMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZSh0Lkl0ZW0yKSA9PSB0Lkl0ZW0xLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UU3RvcFR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBbXXsoYnl0ZSlUVHlwZS5TdG9wLCAoYnl0ZSlUVHlwZS5TdG9wfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfTm9uRXhpc3RpbmdUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdezEwMH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX0VtcHR5TmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0pzb25OdW1lcmljX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjb3JyZWN0SnNvbk51bWVyaWMgPSAiKy0uMDEyMzQ1Njc4OUVlIjsKKyAgICAgICAgICAgIHZhciBpbmNvcnJlY3RKc29uTnVtZXJpYyA9ICJBYUJjRGQvKlxcIjsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIHRydWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHNldHMuQWRkUmFuZ2UoaW5jb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIGZhbHNlKSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5Jc0pzb25OdW1lcmljKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBDaGFyIHt0Lkl0ZW0xfSB0byBib29sOiB7dC5JdGVtMn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRIZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjaGFycy5TZWxlY3QoKGNoLCBpKSA9PiBuZXcgVHVwbGU8Y2hhciwgYnl0ZT4oY2gsIGV4cGVjdGVkSGV4VmFsdWVzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpdC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGNoYXIgYnl0ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgaGV4IHZhbHVlOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfV3JvbmdJbnB1dENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpJ3MnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGhleFZhbHVlcyA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRDaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICB2YXIgc2V0cyA9IGhleFZhbHVlcy5TZWxlY3QoKGh2LCBpKSA9PiBuZXcgVHVwbGU8Ynl0ZSwgY2hhcj4oaHYsIGV4cGVjdGVkQ2hhcnNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIodC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGhleCB2YWx1ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgY2hhcjoge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNzM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgTlN1YnN0aXR1dGU7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEpTT05Qcm90b2NvbF9DYW5fQ3JlYXRlX0luc3RhbmNlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaHR0cENsaWVudFRyYW5zcG9ydCA9IFN1YnN0aXR1dGUuRm9yPFRIdHRwQ2xpZW50VHJhbnNwb3J0PihuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0IiksIG51bGwpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFRKU09OUHJvdG9jb2xXcmFwcGVyKGh0dHBDbGllbnRUcmFuc3BvcnQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkUmVhZGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LlRyYW5zcG9ydCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uRGVwdGggPT0gMCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uTGltaXQgPT0gVFByb3RvY29sLkRlZmF1bHRSZWN1cnNpb25EZXB0aCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LlRyYW5zcG9ydC5FcXVhbHMoaHR0cENsaWVudFRyYW5zcG9ydCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZENvbnRleHQuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJKU09OQmFzZUNvbnRleHQiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVhZGVyLkdldFR5cGUoKS5OYW1lLkVxdWFscygiTG9va2FoZWFkUmVhZGVyIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUSlNPTlByb3RvY29sV3JhcHBlciA6IFRKc29uUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2xXcmFwcGVyKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpIDogYmFzZSh0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkQ29udGV4dCA9PiBDb250ZXh0OworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkUmVhZGVyID0+IFJlYWRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgV3JhcHBlZFJlY3Vyc2lvbkRlcHRoID0+IFJlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uTGltaXQgPT4gUmVjdXJzaW9uTGltaXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDE4IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNS4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0QWRhcHRlciIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RGcmFtZXdvcmsiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5TdWJzdGl0dXRlIiBWZXJzaW9uPSIzLjEuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQuc2xuIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpAQCAtMCwwICsxLDg1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVGVzdHMiLCAiVGVzdHMiLCAie0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICJUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LkludGVncmF0aW9uVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIiwgIns5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oiLCAiezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiIsICJ7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oTmVzdGVkUHJvamVjdHMpID0gcHJlU29sdXRpb24KKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0ge0ZEMjBCQzRBLTAxMDktNDFEOC04QzBDLTg5M0U3ODREN0VGOX0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2JmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vICAgICBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaXRlciA9IGZpcnN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIHZhciBzaXRlciA9IHNlY29uZC5HZXRFbnVtZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHZhciBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB2YXIgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICB3aGlsZSAoZm5leHQgJiYgc25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICB2YXIgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworCisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm5leHQgPT0gc25leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZShJRW51bWVyYWJsZSBlbnVtZXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW51bWVyYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGFzaGNvZGUgPSAwOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSgpIDogR2V0SGFzaENvZGUoZW51bTIpOworCisgICAgICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNoY29kZSA9IChoYXNoY29kZSozOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIYXNoU2V0PFQ+IF9zZXQgPSBuZXcgSGFzaFNldDxUPigpOworCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgPT4gX3NldC5Db3VudDsKKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5ID0+IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFQ+KSBfc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5SZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhlNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgLk5FVCBDb3JlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIGV4VHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgZXhUeXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzExNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzMjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNDkyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCkBAIC0wLDAgKzEsMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVjODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw2MTMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICAvL1RPRE86IFVuaXQgdGVzdHMKKyAgICAgICAgLy9UT0RPOiBMb2NhbGl6YXRpb24KKyAgICAgICAgLy9UT0RPOiBwcmFnbWEKKworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWZXJzaW9uTWFzayA9IDB4ZmZmZjAwMDA7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb24xID0gMHg4MDAxMDAwMDsKKworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RSZWFkOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBTdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gVmVyc2lvbjEgfCAodWludCkgbWVzc2FnZS5UeXBlOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoKGludCkgdmVyc2lvbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1lc3NhZ2UuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgVFR5cGUuU3RvcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIgPyAoc2J5dGUpIDEgOiAoc2J5dGUpIDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYm91dCA9IG5ldyBieXRlWzFdOworCisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpIGI7CisKKyAgICAgICAgICAgIHJldHVybiBib3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBib3V0ID0gQ3JlYXRlV3JpdGVCeXRlKGIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhib3V0LCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkxNihzaG9ydCBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gbmV3IGJ5dGVbMl07CisKKyAgICAgICAgICAgIGkxNk91dFswXSA9IChieXRlKSAoMHhmZiAmIChzID4+IDgpKTsKKyAgICAgICAgICAgIGkxNk91dFsxXSA9IChieXRlKSAoMHhmZiAmIHMpOworCisgICAgICAgICAgICByZXR1cm4gaTE2T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gQ3JlYXRlV3JpdGVJMTYoaTE2KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTE2T3V0LCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTMyT3V0ID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgICAgIGkzMk91dFswXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICAgICAgICAgIGkzMk91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMk91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyT3V0WzNdID0gKGJ5dGUpICgweGZmICYgaTMyKTsKKworICAgICAgICAgICAgcmV0dXJuIGkzMk91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBDcmVhdGVXcml0ZUkzMihpMzIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMzJPdXQsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gbmV3IGJ5dGVbOF07CisKKyAgICAgICAgICAgIGk2NE91dFswXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NE91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NE91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICAgICAgICAgIGk2NE91dFszXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NE91dFs0XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NE91dFs1XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICAgICAgICAgIGk2NE91dFs2XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0T3V0WzddID0gKGJ5dGUpICgweGZmICYgaTY0KTsKKworICAgICAgICAgICAgcmV0dXJuIGk2NE91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gQ3JlYXRlV3JpdGVJNjQoaTY0KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTY0T3V0LCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhieXRlcy5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgdmFyIHNpemUgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gKHVpbnQpIHNpemUgJiBWZXJzaW9uTWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiB7dmVyc2lvbn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgKHNpemUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpY3RSZWFkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdCb2R5QXN5bmMoc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVE9ETzogbm8gcmVhZCBmcm9tIGludGVybmFsIHRyYW5zcG9ydD8KKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRGaWVsZD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBhd2FpdCBSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNYXA+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgVmFsdWVUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRMaXN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFNldD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2J5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJpbiwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAvL1RPRE86IHdoeSByZWFkYWxsID8KKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJpblswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkxNkluID0gbmV3IGJ5dGVbMl07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTE2SW4sIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoc2hvcnQpICgoKGkxNkluWzBdICYgMHhmZikgPDwgOCkgfCBpMTZJblsxXSAmIDB4ZmYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTMySW4gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMzJJbiwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgKChpMzJJblswXSAmIDB4ZmYpIDw8IDI0KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMV0gJiAweGZmKSA8PCAxNikgfCAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGkzMkluWzNdICYgMHhmZjsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgbG9uZyBDcmVhdGVSZWFkSTY0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPQorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBidWZbN10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRJbiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGk2NEluLCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVhZEk2NChpNjRJbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGQgPSBhd2FpdCBSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0JvZHlBc3luYyhpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgU3RyaWN0UmVhZCwgU3RyaWN0V3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTIyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQcm90b2NvbElkID0gMHg4MjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZlcnNpb24gPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbk1hc2sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVNYXNrID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUeXBlQml0cyA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUeXBlU2hpZnRBbW91bnQgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUU3RydWN0IEFub255bW91c1N0cnVjdCA9IG5ldyBUU3RydWN0KHN0cmluZy5FbXB0eSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRGaWVsZCBUc3RvcCA9IG5ldyBURmllbGQoc3RyaW5nLkVtcHR5LCBUVHlwZS5TdG9wLCAwKTsKKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gVFR5cGVUb0NvbXBhY3RUeXBlID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLCBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0YWNrPHNob3J0PiBfbGFzdEZpZWxkID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVEZpZWxkPyBfYm9vbGVhbkZpZWxkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbD8gX2Jvb2xWYWx1ZTsKKworICAgICAgICBwcml2YXRlIHNob3J0IF9sYXN0RmllbGRJZDsKKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RvcF0gPSBUeXBlcy5TdG9wOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkJvb2xdID0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQnl0ZV0gPSBUeXBlcy5CeXRlOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkRvdWJsZV0gPSBUeXBlcy5Eb3VibGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJpbmFyeTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5MaXN0XSA9IFR5cGVzLkxpc3Q7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU2V0XSA9IFR5cGVzLlNldDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5NYXBdID0gVHlwZXMuTWFwOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9sYXN0RmllbGQuQ2xlYXIoKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtQcm90b2NvbElkfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoVmVyc2lvbiAmIFZlcnNpb25NYXNrKSB8ICgoKHVpbnQpIG1lc3NhZ2UuVHlwZSA8PCBUeXBlU2hpZnRBbW91bnQpICYgVHlwZU1hc2spKX0sCisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyAgICAgdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyAgICAgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgZXhUeXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgICAgIHZhciB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gR2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKChmaWVsZC5JRCA+IF9sYXN0RmllbGRJZCkgJiYgKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkIDw9IDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSAoKChmaWVsZC5JRCAtIF9sYXN0RmllbGRJZCkgPDwgNCkgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge2J9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge3R5cGVUb1dyaXRlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKGZpZWxkLCAweEZGLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtUeXBlcy5TdG9wfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAgICAgIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSBleFR5cGUgaW5kaWNhdG9yLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgoc2l6ZSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSl9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgweGYwIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIHNpemUpOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgICAgICByaWdodCBleFR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgICAgIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhfYm9vbGVhbkZpZWxkLlZhbHVlLCBiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7YiA/IFR5cGVzLkJvb2xlYW5UcnVlIDogVHlwZXMuQm9vbGVhbkZhbHNlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSBifSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkxNikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQzMih1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC5SZXN1bHRzIGluIDEgLSA1IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAgICAgdmFyIGkzMkJ1ZiA9IG5ldyBieXRlWzVdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyQnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oaTMyQnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMihJbnRUb1ppZ3phZyhpMzIpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgVHVwbGU8Ynl0ZVtdLCBpbnQ+IENyZWF0ZVdyaXRlVmFySW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4odWxvbmcpIDB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSAoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8Ynl0ZVtdLCBpbnQ+KGJ1ZiwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDY0KExvbmdUb1ppZ3phZyhpNjQpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIEZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgc3RyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSAwfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIG1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10geyhieXRlKSAoKEdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xJZCA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFByb3RvY29sSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHByb3RvY29sIGlkIHtQcm90b2NvbElkOlh9IGJ1dCBnb3Qge3Byb3RvY29sSWQ6WH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAoYnl0ZSkgKHZlcnNpb25BbmRUeXBlICYgVmVyc2lvbk1hc2spOworCisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJFeHBlY3RlZCB2ZXJzaW9uIHtWZXJzaW9ufSBidXQgZ290IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSAoKHZlcnNpb25BbmRUeXBlID4+IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlQml0cyk7CisgICAgICAgICAgICB2YXIgc2VxaWQgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKSB0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFN0cnVjdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzb21lIG1hZ2ljIGlzIGhlcmUgKQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBBbm9ueW1vdXNTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAgICAgdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgICAgICAgICAgIGlmICh0eXBlID09IFR5cGVzLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRzdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG9ydCBmaWVsZElkOworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSBleFR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgICAgICB2YXIgbW9kaWZpZXIgPSAoc2hvcnQpICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkgKF9sYXN0RmllbGRJZCArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIEdldFRUeXBlKChieXRlKSAodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgZXhUeXBlCisgICAgICAgICAgICBpZiAoSXNCb29sVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gKGJ5dGUpICh0eXBlICYgMHgwZikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAgICAgYW5kIHZhbHVlIGV4VHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAgICAgImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemUgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpIDAgOiAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoR2V0VFR5cGUoKGJ5dGUpIChrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgICAgICBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2Jvb2xWYWx1ZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBidWZbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNob3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8bG9uZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9Mb25nKGF3YWl0IFJlYWRWYXJJbnQ2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMobG9uZ0JpdHMsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShCeXRlc1RvTG9uZyhsb25nQml0cykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgICAgIG9mIHRoZSBlbGVtZW50IGV4VHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAgICAgdHJ1ZSBzaXplLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemVBbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHR5cGUgPSBHZXRUVHlwZShzaXplQW5kVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgR2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIHR0eXBlXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVpbnQ+IFJlYWRWYXJJbnQzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHVpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazx1bG9uZz4gUmVhZFZhckludDY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykgKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgWmlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKG4gPj4gMSkgXiAtKGludCkgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgWmlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgKG4gPj4gMSkgXiAtKGxvbmcpIChuICYgMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIEJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgICAgIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s2XSAmIDB4ZmZMKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChieXRlc1szXSAmIDB4ZmZMKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnl0ZXNbMF0gJiAweGZmTCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiAobG93ZXJOaWJibGUgPT0gVHlwZXMuQm9vbGVhblRydWUpIHx8IChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuRmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSAodHlwZSAmIDB4MGYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RvcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0b3A7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuRmFsc2U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJEb24ndCBrbm93IHdoYXQgZXhUeXBlOiB7KGJ5dGUpICh0eXBlICYgMHgwZil9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBMb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgKG4gPDwgMSkgXiAodWxvbmcpIChuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgSW50VG9aaWd6YWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQKKyAgICAgICAgICAgIHJldHVybiAodWludCkgKG4gPDwgMSkgXiAodWludCkgKG4gPj4gMzEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIHVudGlsIG9mZis3LgorICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpIChuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkgKChuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMl0gPSAoYnl0ZSkgKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpICgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSAoKG4gPj4gMzIpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNV0gPSAoYnl0ZSkgKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpICgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSAoKG4gPj4gNTYpICYgMHhmZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEFsbCBvZiB0aGUgb24td2lyZSBleFR5cGUgY29kZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFN0b3AgPSAweDAwOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhblRydWUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhbkZhbHNlID0gMHgwMjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJ5dGUgPSAweDAzOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTE2ID0gMHgwNDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkzMiA9IDB4MDU7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgRG91YmxlID0gMHgwNzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJpbmFyeSA9IDB4MDg7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMaXN0ID0gMHgwOTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNldCA9IDB4MEE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBNYXAgPSAweDBCOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RydWN0ID0gMHgwQzsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzM2YwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpAQCAtMCwwICsxLDk4MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gICAgIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgICAgLy8vICAgICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyAgICAgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgICAvLy8gICAgIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEpzb25Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZlcnNpb24gPSAxOworCisgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3RlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIEpTT05CYXNlQ29udGV4dCBDb250ZXh0OworCisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBDb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOworCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgUmVhZGVyOworCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIFV0ZjhFbmNvZGluZyA9IEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRKc29uUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRKc29uUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgICAgICBSZWFkZXIgPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dFN0YWNrLlB1c2goQ29udGV4dCk7CisgICAgICAgICAgICBDb250ZXh0ID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHQgPSBDb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gICAgIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyAgICAgYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBhc3luYyBUYXNrIFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGNoICE9IGJ5dGVzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogeyhjaGFyKSBjaH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvblN0cmluZ0FzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChieXRlc1tpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1tpXSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcy5Ub0FycmF5KCksIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuSnNvbkNoYXJUYWJsZVtieXRlc1tpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBpLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKChieXRlKSAoYnl0ZXNbaV0gPj4gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMV0gPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcihieXRlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vICAgICB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkludGVnZXJBc3luYyhsb25nIG51bSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc3RyID0gbnVtLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBieXRlcyA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25Eb3VibGVBc3luYyhkb3VibGUgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAgICAgICAvLy8gICAgIGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID49IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgMywgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRW5jb2RlKGJ5dGVzLCBvZmYsIGxlbiwgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIGxlbiArIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhWZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBiID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYygobG9uZykgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGZpZWxkLklELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoZmllbGQuVHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5LZXlUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChtYXAuVmFsdWVUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKGxpc3QuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoc2V0LkVsZW1lbnRUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiA/IDEgOiAwLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25Eb3VibGVBc3luYyhkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCisgICAgICAgIC8vLyAgICAgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvblN0cmluZ0FzeW5jKGJvb2wgc2tpcENvbnRleHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKKworCisgICAgICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZVswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkPworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXNbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgICAgIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1sxXSkgLy8gY29udHJvbCBjaGFycyBsaWtlIFxuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmYgPSBBcnJheS5JbmRleE9mKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhcnMsIChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY2FwZUNoYXJWYWx1ZXNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKF90ZW1wQnVmZmVyLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdjaCA9IChzaG9ydCkgKChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzNdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpIHdjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhci5Jc0xvd1N1cnJvZ2F0ZSgoY2hhcikgd2NoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXdbXSB7KGNoYXIpIHdjaH0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmModG1wLCAwLCB0bXAuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vICAgICBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UT0RPOiB3b3JrYXJvdW5kIGZvciBwcmltaXRpdmUgdHlwZXMgd2l0aCBUSnNvblByb3RvY29sLCB0aGluayAtIGhvdyB0byByZXdyaXRlIGludG8gbW9yZSBlYXN5IGZvcm0gd2l0aG91dCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChjaGFyKWF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSnNvbkludGVnZXJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN0ciA9IGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcuUGFyc2Uoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gICAgIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWRKc29uRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhcnIgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKHRydWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB2YXIgZHViID0gZG91YmxlLlBhcnNlKFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIUNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFkb3VibGUuSXNOYU4oZHViKSAmJiAhZG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkdWI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChDb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShhd2FpdCBSZWFkSnNvbk51bWVyaWNDaGFyc0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvbkJhc2U2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworICAgICAgICAgICAgdmFyIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgZXhUeXBlKQorICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJlYWRKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkJhc2U2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBJVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vICAgICBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgICBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vICAgICBmb3IgdGhlIGZpcnN0IG9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5SZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyAgICAgb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vICAgICBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlRyYW5zLldyaXRlQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKF9jb2xvbiA/IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29sb24gOiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9kYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzRGF0YTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSnNvblByb3RvY29sIFByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gICAgIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJ5dGU+IFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gICAgIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdlNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLyoqCisgICAgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgKgorICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgKgorICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgICoKKyAgICAqICAgICBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICoKKyAgICAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICAgICoKKyAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAgICAqCisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAgICAqCisgICAgKi8KKworICAgIC8vVE9ETzogaW1wbGVtZW50YXRpb24gb2YgVFByb3RvY29sCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKyAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBTZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3NlcnZpY2VOYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQXJnczoKKyAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKCQie19zZXJ2aWNlTmFtZX17U2VwYXJhdG9yfXttZXNzYWdlLk5hbWV9IiwgbWVzc2FnZS5UeXBlLCBtZXNzYWdlLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzCkBAIC0wLDAgKzEsMzc2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRSZWN1cnNpb25EZXB0aCA9IDY0OworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgUmVjdXJzaW9uRGVwdGg7CisKKyAgICAgICAgcHJvdGVjdGVkIFRDbGllbnRUcmFuc3BvcnQgVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFucyA9IHRyYW5zOworICAgICAgICAgICAgUmVjdXJzaW9uTGltaXQgPSBEZWZhdWx0UmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBSZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBUcmFuc3BvcnQgPT4gVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25MaW1pdCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWN1cnNpb25EZXB0aCA8IFJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLVJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoVHJhbnMgYXMgSURpc3Bvc2FibGUpPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1hcEJlZ2luQXN5bmMobWFwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTZXRCZWdpbkFzeW5jKHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQm9vbEFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYyhiLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkxNkFzeW5jKGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTY0QXN5bmMoaTY0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRG91YmxlQXN5bmMoZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKHMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMCwwICsxLDI0NyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgICAgLy8vICAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuV2hpbGUgaXQgaGFzCisgICAgLy8vICAgICBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gICAgIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfd3JhcHBlZFByb3RvY29sOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKEBzdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luQXN5bmMobGlzdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMTZBc3luYyhpMTYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMzJBc3luYyhpMzIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlSTY0QXN5bmMoaTY0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMocywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY3YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBkbyBub3QgcmVuYW1lIHB1YmxpYyBjb25zdGFudHMgLSB0aGV5IHVzZWQgaW4gZ2VuZXJhdGVkIGZpbGVzCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBUeXBlID0gVU5LTk9XTjsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBHZXRFeGNlcHRpb25UeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZjVlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NEhlbHBlcgorICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZDQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQ29uc3RhbnRzCisgICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIGFyZ3MKKyAgICAgICAgLy9UT0RPOiBVbml0ZXN0cworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFbmNvZGVUYWJsZSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnRbXSBEZWNvZGVUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsCisgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBFbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9IChieXRlKSBFbmNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxlbiA9PSAxCisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOworCisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwgRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKQEAgLTAsMCArMSw2MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8vVE9ETyBDaGVjayBmb3IgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgSW1tdXRhYmxlQXJyYXkgZnJvbSBTeXN0ZW0uQ29sbGVjdGlvbnMuSW1tdXRhYmxlIChodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS9kb3RuZXQvMjAxMy8wNi8yNC9wbGVhc2Utd2VsY29tZS1pbW11dGFibGVhcnJheXQvKQorICAgICAgICAvLyBjYW4gYmUgcG9zc2libGUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBhbmQgYWxzbyBiZXR0ZXIgR0MKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb21tYSA9IHsoYnl0ZSkgJywnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQ29sb24gPSB7KGJ5dGUpICc6J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIExlZnRCcmFjZSA9IHsoYnl0ZSkgJ3snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFjZSA9IHsoYnl0ZSkgJ30nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNrZXQgPSB7KGJ5dGUpICdbJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIFJpZ2h0QnJhY2tldCA9IHsoYnl0ZSkgJ10nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUXVvdGUgPSB7KGJ5dGUpICciJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEJhY2tzbGFzaCA9IHsoYnl0ZSkgJ1xcJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gSnNvbkNoYXJUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAnYicsIChieXRlKSAndCcsIChieXRlKSAnbicsIDAsIChieXRlKSAnZicsIChieXRlKSAncicsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgMSwgMSwgKGJ5dGUpICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEVzY2FwZUNoYXJzID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY2FwZUNoYXJWYWx1ZXMgPSB7KGJ5dGUpICciJywgKGJ5dGUpICdcXCcsIChieXRlKSAnLycsIChieXRlKSAnXGInLCAoYnl0ZSkgJ1xmJywgKGJ5dGUpICdcbicsIChieXRlKSAnXHInLCAoYnl0ZSkgJ1x0J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY1NlcXVlbmNlcyA9IHsoYnl0ZSkgJ1xcJywgKGJ5dGUpICd1JywgKGJ5dGUpICcwJywgKGJ5dGUpICcwJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUJvb2wgPSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQnl0ZSA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMTYgPSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMzIgPSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJNjQgPSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVEb3VibGUgPSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJ1Y3QgPSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJpbmcgPSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVNYXAgPSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVMaXN0ID0geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lU2V0ID0geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMjZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUSlNPTlByb3RvY29sSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZSB0eXBlSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVHlwZSBHZXRUeXBlSWRGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICd0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09IChieXRlKSAnZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzSnNvbk51bWVyaWMoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknKyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknRSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vICAgICBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9IZXhWYWwoYnl0ZSBjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleENoYXIoYnl0ZSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCAmPSAweDBGOworICAgICAgICAgICAgaWYgKHZhbCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCAtPSAxMDsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIFNraXBBc3luYyhUUHJvdG9jb2wgcHJvdG9jb2wsIFRUeXBlIHR5cGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90b2NvbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbWFwLlZhbHVlVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXQgPSBhd2FpdCBwcm90b2NvbC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHVuaGFuZGxlZCBleGNlcHRpb25zLCBldGMuCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBBc3luY0Jhc2VTZXJ2ZXIgOiBUQmFzZVNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUYXNrIF9zZXJ2ZXJUYXNrOworCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnksIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgIGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihBc3luY0Jhc2VTZXJ2ZXIpKSwgY2xpZW50V2FpdGluZ0RlbGF5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXN5bmNCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyLCBpbnQgY2xpZW50V2FpdGluZ0RlbGF5ID0gMTApCisgICAgICAgICAgICA6IGJhc2UoaXRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnRXYWl0aW5nRGVsYXkgPSBjbGllbnRXYWl0aW5nRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxhdGlvbiB0b2tlbgorICAgICAgICAgICAgICAgIF9zZXJ2ZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IFN0YXJ0TGlzdGVuaW5nKGNhbmNlbGxhdGlvblRva2VuKSwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgYXdhaXQgX3NlcnZlclRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBTdGFydExpc3RlbmluZyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworCisgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByZVNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJUcmFuc3BvcnQuSXNDbGllbnRQZW5kaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIldhaXRpbmcgZm9yIGNsaWVudCBjb25uZWN0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IEV4ZWN1dGUoY2xpZW50LCBjYW5jZWxsYXRpb25Ub2tlbiksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheShUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKF9jbGllbnRXYWl0aW5nRGVsYXkpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGFza0NhbmNlbGVkRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIEV4ZWN1dGUoVENsaWVudFRyYW5zcG9ydCBjbGllbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworCisgICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gSXRQcm9jZXNzb3JGYWN0b3J5LkdldEFzeW5jUHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisKKyAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IE91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5DcmVhdGVDb250ZXh0QXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBpbnB1dFRyYW5zcG9ydC5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByb2Nlc3NDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoJCJFcnJvcjoge3h9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSw3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXI7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IElucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvY2Vzc29yRmFjdG9yeSBJdFByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIFNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgU2VydmVyVHJhbnNwb3J0OworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZVNlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgaXRQcm9jZXNzb3JGYWN0b3J5LCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LCBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJTG9nZ2VyIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgSXRQcm9jZXNzb3JGYWN0b3J5ID0gaXRQcm9jZXNzb3JGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGl0UHJvY2Vzc29yRmFjdG9yeSkpOworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgTG9nZ2VyID0gbG9nZ2VyID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBHZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2JiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy9UT0RPOiByZXBsYWNlbWVudCBieSBldmVudD8KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrPG9iamVjdD4gQ3JlYXRlQ29udGV4dEFzeW5jKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBEZWxldGVDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJvY2Vzc0NvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkgOiBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRBc3luY1Byb2Nlc3NvciBfdEFzeW5jUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShJVEFzeW5jUHJvY2Vzc29yIHRBc3luY1Byb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgX3RBc3luY1Byb2Nlc3NvciA9IHRBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVEFzeW5jUHJvY2Vzc29yIEdldEFzeW5jUHJvY2Vzc29yKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIFRCYXNlU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3RBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNZXNzYWdlVHlwZUZpZWxkSWQgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFeFR5cGVGaWVsZElkID0gMjsKKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBUeXBlOworCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8VEFwcGxpY2F0aW9uRXhjZXB0aW9uPiBSZWFkQXN5bmMoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICB2YXIgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeFR5cGVGaWVsZElkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlVHlwZUZpZWxkTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBleFR5cGVGaWVsZE5hbWUgPSAiZXhUeXBlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUgPSAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIjsKKworICAgICAgICAgICAgdmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3Qoc3RydWN0QXBwbGljYXRpb25FeGNlcHRpb25OYW1lKTsKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9IG1lc3NhZ2VUeXBlRmllbGROYW1lOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBNZXNzYWdlVHlwZUZpZWxkSWQ7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKE1lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWVsZC5OYW1lID0gZXhUeXBlRmllbGROYW1lOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gRXhUeXBlRmllbGRJZDsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlSTMyQXN5bmMoKGludCkgVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTkyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKQEAgLTAsMCArMSw5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUQmFzZUNsaWVudC4KKyAgICAvLy8gICAgIEJhc2UgY2xpZW50IGZvciBnZW5lcmF0ZWQgY2xpZW50cy4KKyAgICAvLy8gICAgIERvIG5vdCBjaGFuZ2UgdGhpcyBjbGFzcyB3aXRob3V0IGNoZWNraW5nIGdlbmVyYXRlZCBjb2RlIChuYW1pbmdzLCBldGMuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlQ2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfaW5wdXRQcm90b2NvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2wgX291dHB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgaW50IF9zZXFJZDsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQ2xpZW50SWQgPSBHdWlkLk5ld0d1aWQoKTsKKworICAgICAgICBwcm90ZWN0ZWQgVEJhc2VDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2wpKTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wgPT4gX2lucHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCA9PiBfb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIGludCBTZXFJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKytfc2VxSWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlblRyYW5zcG9ydEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlblRyYW5zcG9ydEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lucHV0UHJvdG9jb2wuVHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2w/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIElUQXN5bmNQcm9jZXNzb3I+IF9zZXJ2aWNlUHJvY2Vzc29yTWFwID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4oKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuQ2FsbCkgJiYgKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuT25ld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgZXhUeXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWVzc2FnZS5OYW1lLkluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU2VwYXJhdG9yLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWwpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHttZXNzYWdlLk5hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICBpZiAoIV9zZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZDoge3NlcnZpY2VOYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbmV3TWVzc2FnZSksIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNpbWlsYXIgdG8gYWxsIG90aGVyIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKHN0cmluZyBzZXJ2aWNlTmFtZSwgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmljZVByb2Nlc3Nvck1hcC5Db250YWluc0tleShzZXJ2aWNlTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICQiUHJvY2Vzc29yIG1hcCBhbHJlYWR5IGNvbnRhaW5zIHByb2Nlc3NvciB3aXRoIG5hbWU6ICd7c2VydmljZU5hbWV9JyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRmFpbEFzeW5jKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLAorICAgICAgICAgICAgc3RyaW5nIGV0eHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3TWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgYXBwZXguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZG9ubHkgVE1lc3NhZ2UgX21zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9tc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDZmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvagpAQCAtMCwwICsxLDMxIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdDwvUGFja2FnZUlkPgorICAgIDxBdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPnRydWU8L0F1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+CisgICAgPEdlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+dHJ1ZTwvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkNvbnNvbGUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkRlYnVnIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBpcGVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lk5hbWVSZXNvbHV0aW9uIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5SZXF1ZXN0cyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuU2VjdXJpdHkiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjA2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9idWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICAvL1RPRE86IHNob3VsZCBzdXBwb3J0IG9ubHkgc3BlY2lmaWVkIGlucHV0IHRyYW5zcG9ydD8KKyAgICAgICAgcHVibGljIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZlNpemUpLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIF9idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gIV9pc0Rpc3Bvc2VkICYmIF90cmFuc3BvcnQuSXNPcGVuOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0Lk9wZW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgX3RyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGludmVzdGlnYXRlIGhvdyBpdCBzaG91bGQgd29yayBjb3JyZWN0bHkKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBfYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9pbnB1dEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgIC8vIGludmVzdGlnYXRlCisgICAgICAgICAgICB2YXIgZmlsbGVkID0gYXdhaXQgX3RyYW5zcG9ydC5SZWFkQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgMCwgKGludCkgX2lucHV0QnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworCisgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIHZhciB3cml0dGVuQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FwYSA9IChpbnQpIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gX291dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciB3cml0ZVNpemUgPSBjYXBhIDw9IGxlbmd0aCA/IGNhcGEgOiBsZW5ndGg7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dEJ1ZmZlci5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCB3cml0ZVNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSB3cml0ZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlU2l6ZSA9PSBjYXBhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9fb3V0cHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZlNlZ21lbnQuQXJyYXksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIC0gd3JpdHRlbkNvdW50ID49IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgX2J1ZlNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuQ291bnQgKz0gX2J1ZlNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZW1haW4gPSBsZW5ndGggLSB3cml0dGVuQ291bnQ7CisgICAgICAgICAgICBpZiAocmVtYWluID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyB3cml0dGVuQ291bnQsIHJlbWFpbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9vdXRwdXRCdWZmZXIuVG9BcnJheSgpOyAvLyBUcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEgLypidWZTZWdtZW50LkFycmF5Ki8sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbihuYW1lb2YoX3RyYW5zcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0QnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWJiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IGltcGxlbWVudGF0aW9uIAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9yZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF93cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBnb3QgPSBhd2FpdCBfcmVhZEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGcmFtZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEZyYW1lQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKF9oZWFkZXJCdWYsIDAsIEhlYWRlclNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIHNpemUgPSBEZWNvZGVGcmFtZVNpemUoX2hlYWRlckJ1Zik7CisKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNldExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX3JlYWRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgdmFyIGJ1ZmYgPSBidWZTZWdtZW50LkFycmF5OworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBbGxBc3luYyhidWZmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3dyaXRlQnVmZmVyLkxlbmd0aCArIGxlbmd0aCA+IGludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBGbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3dyaXRlQnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICAvL193cml0ZUJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworICAgICAgICAgICAgLy92YXIgYnVmID0gYnVmU2VnbWVudC5BcnJheTsKKyAgICAgICAgICAgIHZhciBidWYgPSBfd3JpdGVCdWZmZXIuVG9BcnJheSgpOworCisgICAgICAgICAgICAvL3ZhciBsZW4gPSAoaW50KV93cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IChpbnQpIF93cml0ZUJ1ZmZlci5MZW5ndGggLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFMZW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluamVjdCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSByZXNlcnZlZCBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhTGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRXcml0ZUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICBfd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDI0KSk7CisgICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBEZWNvZGVGcmFtZVNpemUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnVmWzNdICYgMHhmZik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZENsaWVudFRyYW5zcG9ydCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlYWRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlQnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMjYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHAuSGVhZGVyczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIF9jZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIF91cmk7CisKKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IF9jb25uZWN0VGltZW91dCA9IDMwMDAwOworICAgICAgICBwcml2YXRlIEh0dHBDbGllbnQgX2h0dHBDbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSwgY3VzdG9tSGVhZGVycykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcywKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfdXJpID0gdTsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICBDdXN0b21IZWFkZXJzID0gY3VzdG9tSGVhZGVyczsKKworICAgICAgICAgICAgLy8gZHVlIHRvIGN1cnJlbnQgYnVnIHdpdGggcGVyZm9ybWFuY2Ugb2YgRGlzcG9zZSBpbiBuZXRjb3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZWZ4L2lzc3Vlcy84ODA5CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBkZWZhdWx0IHdheSAoY3JlYXRlIGNsaWVudC0+dXNlLT5kaXNwb3NlIHBlciBmbHVzaCkgbGF0ZXIKKyAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gQ3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jb25uZWN0VGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaHR0cENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfaHR0cENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgX2lucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX291dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBDcmVhdGVDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcigpOworICAgICAgICAgICAgaGFuZGxlci5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoX2NlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaGFuZGxlcik7CisKKyAgICAgICAgICAgIGlmIChfY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuVGltZW91dCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKF9jb25uZWN0VGltZW91dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFjY2VwdC5BZGQobmV3IE1lZGlhVHlwZVdpdGhRdWFsaXR5SGVhZGVyVmFsdWUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikpOworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuVXNlckFnZW50LkFkZChuZXcgUHJvZHVjdEluZm9IZWFkZXJWYWx1ZSgiVEh0dHBDbGllbnRUcmFuc3BvcnQiLCAiMS4wLjAiKSk7CisKKyAgICAgICAgICAgIGlmIChDdXN0b21IZWFkZXJzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaHR0cENsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRTdHJlYW0gPSBuZXcgU3RyZWFtQ29udGVudChfb3V0cHV0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGF3YWl0IF9odHRwQ2xpZW50LlBvc3RBc3luYyhfdXJpLCBvdXRTdHJlYW0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLkVuc3VyZVN1Y2Nlc3NTdGF0dXNDb2RlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IGF3YWl0IG1zZy5Db250ZW50LlJlYWRBc1N0cmVhbUFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lucHV0U3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChIdHRwUmVxdWVzdEV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTU1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfYnl0ZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2J5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydChieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfYnl0ZVN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF9ieXRlU3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ieXRlU3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpIDogdGhpcygiLiIsIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyTmFtZSA9IHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2Uoc2VydmVyKSA/IHNlcnZlciA6ICIuIjsKKworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oc2VydmVyTmFtZSwgcGlwZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX2NsaWVudCAhPSBudWxsICYmIF9jbGllbnQuSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfY2xpZW50LlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjlkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDEzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNvY2tldENsaWVudFRyYW5zcG9ydCA6IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgPSBjbGllbnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoY2xpZW50KSk7CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhvc3QgPSBob3N0OworICAgICAgICAgICAgUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgSG9zdCB7IGdldDsgfQorICAgICAgICBwdWJsaWMgaW50IFBvcnQgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGNwQ2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgb3Igbm90IGluaXRpYWxpemVkIHRjcCBjbGllbnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVGNwQ2xpZW50LkNvbm5lY3RBc3luYyhIb3N0LCBQb3J0KTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudD8uRGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBPdXRwdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gSW5wdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IElucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjM3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCB3b3JrCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9jZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUEFkZHJlc3MgX2hvc3Q7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNTZXJ2ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBfY2xpZW50OworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBfc2VjdXJlU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBfdGltZW91dDsKKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLCBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICBfaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWVvZihjZXJ0aWZpY2F0ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydGlmaWNhdGVQYXRoKSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQgeyBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50ID0+IF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0ID0+IF9ob3N0OworCisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCA9PiBfcG9ydDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0OworICAgICAgICAgICAgX2NsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLAorICAgICAgICAgICAgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2hvc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3BvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyhfaG9zdCwgX3BvcnQpOworICAgICAgICAgICAgICAgIGF3YWl0IFNldHVwVGxzQXN5bmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNldHVwVGxzQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gX2NlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAoX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IsIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyQXN5bmMoX2NlcnRpZmljYXRlLCBfY2VydFZhbGlkYXRvciAhPSBudWxsLCBfc3NsUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnRzID0gX2NlcnRpZmljYXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24ge19jZXJ0aWZpY2F0ZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9IF9ob3N0LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnRBc3luYyh0YXJnZXRIb3N0LCBjZXJ0cywgX3NzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBfc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5IdHRwOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxvZ2dlciBfbG9nZ2VyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlcXVlc3REZWxlZ2F0ZSBfbmV4dDsKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIElUQXN5bmNQcm9jZXNzb3IgUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgUmVxdWVzdERlbGVnYXRlIG5leHQsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV4dCwgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBJVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlckZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihsb2dnZXJGYWN0b3J5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2Nlc3NvciA9IHByb2Nlc3NvciA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihwcm9jZXNzb3IpKTsKKyAgICAgICAgICAgIElucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIE91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRQcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgICAgICAgX25leHQgPSBuZXh0OworICAgICAgICAgICAgX2xvZ2dlciA9IGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgSW52b2tlKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIGF3YWl0IFByb2Nlc3NSZXF1ZXN0QXN5bmMoY29udGV4dCwgY29udGV4dC5SZXF1ZXN0QWJvcnRlZCk7IC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgbG9naWMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuQm9keSwgY29udGV4dC5SZXNwb25zZS5Cb2R5KTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0LCBjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE5MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3BpcGVBZGRyZXNzOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfYXN5bmNNb2RlID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIF9pc1BlbmRpbmcgPSB0cnVlOworCisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW0gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgX3BpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgZm9yIGRpc2NvbmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgX2lzUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaXNQZW5kaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSAyNTQ7CisgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBQaXBlVHJhbnNtaXNzaW9uTW9kZS5CeXRlOworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gX2FzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2FzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CisKKyAgICAgICAgICAgICAgICAvL19pc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE5hbWVkUGlwZVNlcnZlclN0cmVhbSBfc3RyZWFtOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9zdHJlYW0gIT0gbnVsbCAmJiBfc3RyZWFtLklzQ29ubmVjdGVkOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNTAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEZyYW1lZENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpOgorICAgICAgICAgICAgdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5ZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgX2NsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlMiBfc2VydmVyQ2VydGlmaWNhdGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGZhbHNlLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKSAKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlLCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjbGllbnRDZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBib29sIHVzZUZyYW1lZFRyYW5zcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZXJ0aWZpY2F0ZS5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiWW91ciBzZXJ2ZXItY2VydGlmaWNhdGUgbmVlZHMgdG8gaGF2ZSBhIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIF91c2VGcmFtZWRUcmFuc3BvcnQgPSB1c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBfY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0IHtwb3J0fS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhY2NlcHQgaXMgbm90IGJsb2NraW5nCisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6IHtzeC5NZXNzYWdlfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIHZhciB0VGxzU29ja2V0ID0gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBfc2VydmVyQ2VydGlmaWNhdGUsIHRydWUsIF9jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBfc3NsUHJvdG9jb2xzKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IHRUbHNTb2NrZXQuU2V0dXBUbHNBc3luYygpOworCisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IHRUbHNTb2NrZXQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKF91c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6IHtleH0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgY2xpZW50IGluZm8gCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVENsaWVudFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICAvL1RPRE86IHRoaW5rIGhvdyB0byBhdm9pZCBwZWVrIGJ5dGUKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IGF3YWl0IFJlYWRBc3luYyhfcGVla0J1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihvZmZzZXQpLCAiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YobGVuZ3RoKSwgIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZmZlciksICJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFsbEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldHJpZXZlZCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgcmV0cmlldmVkKytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXRyaWV2ZWQgPCBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvdW50ID0gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgcmV0cmlldmVkLCBsZW5ndGggLSByZXRyaWV2ZWQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyaWV2ZWQgKz0gcmV0dXJuZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgRmx1c2hBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NWE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw1NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0NsaWVudFBlbmRpbmcoKTsKKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQie25hbWVvZihBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKX0gc2hvdWxkIG5vdCByZXR1cm4gbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBOb3RPcGVuLAorICAgICAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgICAgIEludGVycnVwdGVkCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBFeFR5cGU7CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIGV4VHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBFeFR5cGUgPSBleFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlID0+IEV4VHlwZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gICAgIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vICAgICBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gICAgIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuY21kIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2M0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5zaCBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworI3NldCAtZQorCit0aHJpZnQgLS12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKyNyZXZpc2lvbj0ke1RSQVZJU19KT0JfSUQ6PTF9ICAKKyNyZXZpc2lvbj0kKHByaW50ZiAiJTA0ZCIgJHJldmlzaW9uKSAKKworI2RvdG5ldCBwYWNrIC4vc3JjL1BST0pFQ1RfTkFNRSAtYyBSZWxlYXNlIC1vIC4vYXJ0aWZhY3RzIC0tdmVyc2lvbi1zdWZmaXg9JHJldmlzaW9uICAKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCkBAIC0wLDAgKzEsMjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuc2ggYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZjYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGVhM2VhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMKKworIyBUT0RPOiBMaW50IG5vZGVqcyBsaWIgYW5kIGdlbi1jb2RlIGFzIHBhcnQgb2YgYnVpbGQKK2NoZWNrOiBkZXBzCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgdGVzdCAmJiAkKE5QTSkgcnVuIGxpbnQtdGVzdHMgJiYgY2QgbGliL25vZGVqcworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCitFWFRSQV9ESVNUID0gXAorCWV4YW1wbGVzIFwKKwlsaWIgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9SRUFETUUubWQKQEAgLTAsMCArMSw3MCBAQAorVGhyaWZ0IE5vZGUuanMgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAorCisjIyBJbnN0YWxsCisKKyAgICBucG0gaW5zdGFsbCB0aHJpZnQgCisKKyMjIFRocmlmdCBDb21waWxlcgorCitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIE5vZGUuanMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICB0aHJpZnQgLS1nZW4ganM6bm9kZSB0aHJpZnRfZmlsZQorCisjIyBDYXNzYW5kcmEgQ2xpZW50IEV4YW1wbGU6CisKK0hlcmUgaXMgYSBDYXNzYW5kcmEgZXhhbXBsZToKKworYGBganMKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAorICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgY29uc29sZS5lcnJvcihlcnIpOworfSk7CisKK2NsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICBpZiAoZXJyKSB7CisgICAgLy8gaGFuZGxlIGVycgorICB9IGVsc2UgeworICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCisgIH0KKyAgY29ubmVjdGlvbi5lbmQoKTsKK30pOworYGBgCisKKzxhIG5hbWU9ImludDY0Ij48L2E+CisjIyBJbnQ2NAorCitTaW5jZSBKYXZhU2NyaXB0IHJlcHJlc2VudHMgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgaW50NjQgdmFsdWVzIGNhbm5vdCBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIG5hdHVyYWxseS4gVG8gc29sdmUgdGhpcywgaW50NjQgdmFsdWVzIGluIHJlc3BvbnNlcyB3aWxsIGJlIHdyYXBwZWQgd2l0aCBUaHJpZnQuSW50NjQgb2JqZWN0cy4gVGhlIEludDY0IGltcGxlbWVudGF0aW9uIHVzZWQgaXMgW2Jyb29mYS9ub2RlLWludDY0XShodHRwczovL2dpdGh1Yi5jb20vYnJvb2ZhL25vZGUtaW50NjQpLgorCisjIyBDbGllbnQgYW5kIHNlcnZlciBleGFtcGxlcworCitTZXZlcmFsIGV4YW1wbGUgY2xpZW50cyBhbmQgc2VydmVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHRocmlmdC9saWIvbm9kZWpzL2V4YW1wbGVzIGZvbGRlciBhbmQgdGhlIGNyb3NzIGxhbmd1YWdlIHR1dG9yaWFsIHRocmlmdC90dXRvcmlhbC9ub2RlanMgZm9sZGVyLgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL01ha2VmaWxlIGIvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzE1N2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KK2FsbDoJCisJLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisKK3NlcnZlcjogYWxsCQorCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdDokKE5PREVfUEFUSCkgbm9kZSBzZXJ2ZXIuanMKKworY2xpZW50OiBhbGwJCisJTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0OiQoTk9ERV9QQVRIKSBub2RlIGNsaWVudC5qcwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzUwYzEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyBUaHJpZnQgTm9kZS5qcyBFeGFtcGxlcworCisjIyBMaWNlbnNlCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgUnVubmluZyB0aGUgdXNlciBleGFtcGxlCisKK0dlbmVyYXRlIHRoZSBiaW5kaW5nczoKKworICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAorICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSAtLWdlbiBweSBoZWxsby50aHJpZnQKKworVG8gcnVuIHRoZSB1c2VyIGV4YW1wbGUsIGZpcnN0IHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgaW4gb25lIHRlcm1pbmFsOgorCisgICAgTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgc2VydmVyLmpzCisKK05vdyBydW4gdGhlIGNsaWVudDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIGNsaWVudC5qcworCitGb3IgYW4gZXhhbXBsZSB1c2luZyBKYXZhU2NyaXB0IGluIHRoZSBicm93c2VyIHRvIGNvbm5lY3QgdG8KK2Egbm9kZS5qcyBzZXJ2ZXIgbG9vayBhdCBoZWxsby5odG1sLCBoZWxsby5qcyBhbmQgaGVsbG8udGhyaWZ0CisKK0hUVFAgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGFsc286IGh0dHBDbGllbnQuanMgYW5kIGh0dHBTZXJ2ZXIuanMKK1lvdSBjYW4gdGVzdCBIVFRQIGNyb3NzIHBsYXRmb3JtIHdpdGggdGhlIGh0dHBTZXJ2ZXIucHkgUHl0aG9uIHNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNiMzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnQuanMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworCit2YXIgVXNlclN0b3JhZ2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVXNlclN0b3JhZ2UuanMnKSwKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdXNlcl90eXBlcycpOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkwKSwKKyAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFVzZXJTdG9yYWdlLCBjb25uZWN0aW9uKTsKKwordmFyIHVzZXIgPSBuZXcgdHR5cGVzLlVzZXJQcm9maWxlKHt1aWQ6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJNYXJrIFNsZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVyYjogIkknbGwgZmluZCBzb21ldGhpbmcgdG8gcHV0IGhlcmUuIn0pOworCitjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBjb25zb2xlLmVycm9yKGVycik7Cit9KTsKKworY2xpZW50LnN0b3JlKHVzZXIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgaWYgKGVycikgeworICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zb2xlLmxvZygiY2xpZW50IHN0b3JlZDoiLCB1c2VyLnVpZCk7CisgICAgY2xpZW50LnJldHJpZXZlKHVzZXIudWlkLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlVXNlcikgeworICAgICAgaWYgKGVycikgeworICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zb2xlLmxvZygiY2xpZW50IHJldHJpZXZlZDoiLCByZXNwb25zZVVzZXIudWlkKTsKKyAgICAgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvY2xpZW50X211bHRpdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzdkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKKwordmFyIFVzZXJTdG9yYWdlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1VzZXJTdG9yYWdlJyksCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3VzZXJfdHlwZXMnKTsKKwordmFyIGZfY29ubiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkwKSwgLy8gZGVmYXVsdDogZnJhbWVkCisgICAgZl9jbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFVzZXJTdG9yYWdlLCBmX2Nvbm4pOwordmFyIGJfY29ubiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkxLCB7dHJhbnNwb3J0OiB0dHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydH0pLAorICAgIGJfY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChVc2VyU3RvcmFnZSwgYl9jb25uKTsKK3ZhciB1c2VyMSA9IG5ldyB0dHlwZXMuVXNlclByb2ZpbGUoe3VpZDogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJNYXJrIFNsZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1cmI6ICJJJ2xsIGZpbmQgc29tZXRoaW5nIHRvIHB1dCBoZXJlLiJ9KTsKK3ZhciB1c2VyMiA9IG5ldyB0dHlwZXMuVXNlclByb2ZpbGUoe3VpZDogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJTYXRvc2hpIFRhZ29tb3JpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXJiOiAib2ssIGxldCdzIHRlc3Qgd2l0aCBidWZmZXJlZCB0cmFuc3BvcnQuIn0pOworCitmX2Nvbm4ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGNvbnNvbGUuZXJyb3IoImZyYW1lZDoiLCBlcnIpOworfSk7CisKK2ZfY2xpZW50LnN0b3JlKHVzZXIxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGlmIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyByZXR1cm47IH0KKworICBjb25zb2xlLmxvZygic3RvcmVkOiIsIHVzZXIxLnVpZCwgIiBhcyAiLCB1c2VyMS5uYW1lKTsKKyAgYl9jbGllbnQucmV0cmlldmUodXNlcjEudWlkLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlVXNlcikgeworICAgIGlmIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyByZXR1cm47IH0KKyAgICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHJlc3BvbnNlVXNlci51aWQsICIgYXMgIiwgcmVzcG9uc2VVc2VyLm5hbWUpOworICB9KTsKK30pOworCitiX2NsaWVudC5zdG9yZSh1c2VyMiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyMi51aWQsICIgYXMgIiwgdXNlcjIubmFtZSk7CisgIGZfY2xpZW50LnJldHJpZXZlKHVzZXIyLnVpZCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZVVzZXIpIHsKKyAgICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisgICAgY29uc29sZS5sb2coInJldHJpZXZlZDoiLCByZXNwb25zZVVzZXIudWlkLCAiIGFzICIsIHJlc3BvbnNlVXNlci5uYW1lKTsKKyAgfSk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbCBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTg1YTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5odG1sCkBAIC0wLDAgKzEsNjUgQEAKKzwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICA8dGl0bGU+QXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IEJyb3dzZXIgQ2xpZW50IERlbW88L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJ0aHJpZnQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9IZWxsb1N2Yy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RpbWVzVHdvLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBCcm93c2VyIENsaWVudCBEZW1vPC9oMT4KKyAgICA8cD5UaGlzIGh0bWwgZmlsZSBkZW1vbnN0cmF0ZXMgQXBhY2hlIFRocmlmdCBKYXZhU2NycHQgUlBDIGJldHdlZW4gYSBicm93c2VyIGNsaWVudCB0byBhIG5vZGUuanMgc2VydmVyLiBDbGlja2luZyB0aGUgYnV0dG9ucyBiZWxvdyB3aWxsIGNhbGwgdGhlIFJQQyBmdW5jdGlvbnMgaG9zdGVkIGJ5IHRoZSBBcGFjaGUgVGhyaWZ0IHNlcnZlciBhdCBsb2NhbGhvc3Q6ODU4NS4gVGhlIGZpbGUgaGVsbG8uanMgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbm9kZS5qcyBzZXJ2ZXIgcmVxdWlyZWQuIEhlcmUgYXJlIHRoZSBzdGVwcyB0byBnZXQgdGhlIGV4YW1wbGUgcnVubmluZzo8L3A+CisgICAgPG9sPgorICAgICAgICA8bGk+SW5zdGFsbCBOb2RlLmpzIDxwcmU+PGEgaHJlZj0iaHR0cDovL25vZGVqcy5vcmciPm5vZGVqcy5vcmc8L2E+PC9wcmU+PC9saT4KKyAgICAgICAgPGxpPkluc3RhbGwgQXBhY2hlIFRocmlmdCBmb3Igbm9kZSAobm90ZSB0aGF0IHRoZSBub2RlIHBhY2thZ2UgbWFuYWdlciB3aWxsIGNyZWF0ZSB0aGUgbm9kZV9tb2R1bGVzIGZvbGRlciBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc28gbWFrZSBzdXJlIHRvIHJ1biBucG0gZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaGVsbG8uanMgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBmaW5kIHRoZSBUaHJpZnQgbGlicmFyaWVzLiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgQXBhY2hlIFRocmlmdCAwLjkuMispIDxwcmU+JCBucG0gaW5zdGFsbCB0aHJpZnQ8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29tcGlsZSB0aGUgaGVsbG8uaWRsIGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzICh5b3UnbGwgbmVlZCB0byBoYXZlIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGluc3RhbGxlZCBmb3IgdGhpcyBzdGVwLiBUaGlzIGFsc28gbmVlZHMgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGhlbGxvLmpzIGJlY2F1c2UgaGVsbG8uanMgYW5kIGhlbGxvLmh0bWwgbG9vayBmb3IgdGhlIGdlbi1ub2RlanMgYW5kIGdlbi1qcyBkaXJlY3RvcmllcyBoZXJlLik8cHJlPiQgdGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIGhlbGxvLnRocmlmdDwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5SdW4gdGhlIG5vZGUgc2VydmVyIGluIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgaGVsbG8uaHRtbCBmaWxlPHByZT4kIG5vZGUgaGVsbG8uanM8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29weSB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnksIHRocmlmdC5qcywgaW50byB0aGUgZGlyZWN0b3J5IHdpdGggdGhpcyBodG1sIGZpbGUuPHByZT4kIGNwIC4uLi4uL3RocmlmdC5qcyAuICh5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIEJvd2VyIHRvIGluc3RhbGwgdGhlIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBsaWJyYXJ5IGluIHRoZSBuZWFyIGZ1dHVyZS4pPC9wcmU+CisgICAgICAgIDxsaT5SZWxvYWQgdGhpcyBwYWdlIGluIGEgYnJvd3NlciB0aHJvdWdoIHRoZSBub2RlIHNlcnZlciB1c2luZyB1c2luZyB0aGUgVVJMOiA8cHJlPmh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsby5odG1sPC9wcmU+dGhlbiBjbGljayBhIGJ1dHRvbiBiZWxvdyB0byBtYWtlIGFuIFJQQyBjYWxsPC9saT4KKyAgICA8L29sPgorICAgIDxidXR0b24gaWQ9ImJ0biI+R2V0IE1lc3NhZ2UgZnJvbSBOb2RlIFNlcnZlcjwvYnV0dG9uPgorICAgIDxidXR0b24gaWQ9ImJ0bkRibCI+RG91YmxlIDI1PC9idXR0b24+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBnZXRNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsbyIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBIZWxsb1N2Y0NsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICB2YXIgbXNnID0gY2xpZW50LmhlbGxvX2Z1bmMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS5pbm5lckhUTUwgPSBtc2c7CisgICAgICAgIH0KKworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuRGJsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkYmxNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZGJsTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9kYmwiKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgVGltZXNUd29DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIHZhbCA9IGNsaWVudC5kYmwoMjUpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dDIiKS5pbm5lckhUTUwgPSB2YWw7CisgICAgICAgIH0KKyAgICA8L3NjcmlwdD4KKyAgICA8aDI+U2VydmVyIFJlc3BvbnNlOiA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PjwvaDI+CisgICAgPGgyPlNlcnZlciBEYmw6IDxkaXYgaWQ9Im91dHB1dDIiPjwvZGl2PjwvaDI+Cis8L2JvZHk+IAorPC9odG1sPgorCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdjNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgSGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKK3ZhciBUaW1lc1R3b1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaW1lc1R3by5qcycpOworCit2YXIgaGVsbG9IYW5kbGVyID0geworCWhlbGxvX2Z1bmM6IGZ1bmN0aW9uKHJlc3VsdCkgeworCQl0aGlzLmNhbGxfY291bnRlciA9IHRoaXMuY2FsbF9jb3VudGVyIHx8IDA7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArICgrK3RoaXMuY2FsbF9jb3VudGVyKSk7CisJCXJlc3VsdChudWxsLCAiSGVsbG8gQXBhY2hlIFRocmlmdCBmb3IgSmF2YVNjcmlwdCAiICsgdGhpcy5jYWxsX2NvdW50ZXIpOworCX0KK30KKwordmFyIHRpbWVzVHdvSGFuZGxlciA9IHsKKwlkYmw6IGZ1bmN0aW9uKHZhbCwgcmVzdWx0KSB7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArIHZhbCk7CisJCXJlc3VsdChudWxsLCB2YWwgKiAyKTsKKwl9Cit9CisKK3ZhciBoZWxsb1NlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IEhlbGxvU3ZjLAorCWhhbmRsZXI6IGhlbGxvSGFuZGxlcgorfTsKKwordmFyIGRibFNlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IFRpbWVzVHdvU3ZjLAorCWhhbmRsZXI6IHRpbWVzVHdvSGFuZGxlcgorfTsKKwordmFyIFNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6ICIuIiwKKwlzZXJ2aWNlczogeworCQkiL2hlbGxvIjogaGVsbG9TZXJ2aWNlLAorCQkiL2RibCI6IGRibFNlcnZpY2UsCisJfQorfQorCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihTZXJ2ZXJPcHRpb25zKTsKK3ZhciBwb3J0ID0gODU4NTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc2VydmljZSBIZWxsb1N2YyB7CisgICAgc3RyaW5nIGhlbGxvX2Z1bmMoKSwKK30KKworc2VydmljZSBUaW1lc1R3byB7CisgICAgaTY0IGRibCgxOiBpNjQgdmFsKSwKK30KKworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljYzBjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cENsaWVudC5qcwpAQCAtMCwwICsxLDIzIEBACit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgaGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKKwordmFyIG9wdGlvbnMgPSB7CisgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgICBwYXRoOiAiL2hlbGxvIiwKKyAgIGhlYWRlcnM6IHsiQ29ubmVjdGlvbiI6ICJjbG9zZSJ9LAorICAgaHR0cHM6IGZhbHNlCit9OworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgb3B0aW9ucyk7Cit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoaGVsbG9TdmMsIGNvbm5lY3Rpb24pOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgeworICAgY29uc29sZS5sb2coIkVycm9yOiAiICsgZXJyKTsKK30pOworCitjbGllbnQuaGVsbG9fZnVuYyhmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7CisgICBjb25zb2xlLmxvZygiTXNnIGZyb20gc2VydmVyOiAiICsgcmVzdWx0KTsKK30pOworCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLmpzCkBAIC0wLDAgKzEsMzEgQEAKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsgICAgICAgICAgICAgICAgIAkKK3ZhciBoZWxsb1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9IZWxsb1N2YycpOworCisvL1NlcnZpY2VIYW5kbGVyOiBJbXBsZW1lbnQgdGhlIGhlbGxvIHNlcnZpY2UgCit2YXIgaGVsbG9IYW5kbGVyID0geworICBoZWxsb19mdW5jOiBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIEhlbGxvIGNhbGwiKTsKKyAgICByZXN1bHQobnVsbCwgIkhlbGxvIGZyb20gTm9kZS5qcyIpOworICB9Cit9OworCisvL1NlcnZpY2VPcHRpb25zOiBUaGUgSS9PIHN0YWNrIGZvciB0aGUgc2VydmljZQordmFyIGhlbGxvU3ZjT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICBoYW5kbGVyOiBoZWxsb0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgIAkKKyAgICBwcm9jZXNzb3I6IGhlbGxvU3ZjLCAgICAgICAgICAgICAgICAgICAgICAgICAJCisgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLCAgICAgICAgICAgICAgICAgCisgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0IAkJCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy9TZXJ2ZXJPcHRpb25zOiBEZWZpbmUgc2VydmVyIGZlYXR1cmVzCit2YXIgc2VydmVyT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgCQorICAgc2VydmljZXM6IHsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAiL2hlbGxvIjogaGVsbG9TdmNPcHQgICAgICAgICAgICAgICAgIAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvL0NyZWF0ZSBhbmQgc3RhcnQgdGhlIHdlYiBzZXJ2ZXIgCit2YXIgcG9ydCA9IDkwOTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCit0aHJpZnQuY3JlYXRlV2ViU2VydmVyKHNlcnZlck9wdCkubGlzdGVuKHBvcnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAkJCitjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMmZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQpAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gaGVsbG8gaW1wb3J0IEhlbGxvU3ZjCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUSHR0cFNlcnZlcgorCitjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CisgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgorICAgIHByaW50KCJIZWxsbyBDYWxsZWQiKQorICAgIHJldHVybiAiaGVsbG8gZnJvbSBQeXRob24iCisKK3Byb2Nlc3NvciA9IEhlbGxvU3ZjLlByb2Nlc3NvcihIZWxsb1N2Y0hhbmRsZXIoKSkKK3Byb3RvRmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorcG9ydCA9IDkwOTAKK3NlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCJsb2NhbGhvc3QiLCBwb3J0KSwgcHJvdG9GYWN0b3J5KQorcHJpbnQgIlB5dGhvbiBzZXJ2ZXIgcnVubmluZyBvbiBwb3J0ICIgKyBzdHIocG9ydCkKK3NlcnZlci5zZXJ2ZSgpCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3BhcnNlLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKworICBUaGlzIGlzIGEgc3RhbmRhbG9uZSBkZXNlcmlhbGl6ZS9wYXJzZSBleGFtcGxlIGlmIHlvdSBqdXN0IHdhbnQgdG8gZGVzZXJpYWxpemUKKyAgdGhyaWZ0IGRlY291cGxlZCBmcm9tIGNhc3NhbmRyYSBzZXJ2ZXIKKworICAxLiAgYWNxdWlyZSB0aHJpZnQgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBmaWxlcyBmcm9tIHdobyBldmVyIGJ1aWx0IGl0IChlZzogRVhBTVBMRS50aHJpZnQpCisKKyAgMi4gIEluc3RhbGwgdGhyaWZ0IG9uIGxvY2FsIG1hY2hpbmUKKworICAzLiAgZ2VuZXJhdGUgdGhyaWZ0IGNsaWVudHMgZm9yIG5vZGVqcyB1c2luZyB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uIGZpbGVzICgjMSkKKyAgICAgIHRocmlmdCAtLWdlbiBqczpub2RlIHNjaGVtYS9FWEFNUExFLnRocmlmdAorCisgICAgICBUaGlzIGNyZWF0ZXMgY3JlYXRlcyBnZW4tbm9kZS5qcyBkaXJlY3RvcnkgY29udGFpbmluZyBhIG5ldyBmaWxlLCBHRU5FUkFURUQuanMKKworICA0LiAgSW5zaWRlIEdFTkVSQVRFRC5qcyBpcyBhIGNsYXNzIHlvdSB3aWxsIHdhbnQgdG8gaW5zdGFuY2lhdGUuICBGaW5kIHRoaXMgY2xhc3MgbmFtZSBhbmQgcGx1ZyAKKyAgICAgIGl0IGludG8gdGhlIGV4YW1wbGUgY29kZSBiZWxvdyAgKGllLCAiWU9VUl9DTEFTU19OQU1FIikKKyAqLworCitmdW5jdGlvbiBwYXJzZVRocmlmdCh0aHJpZnRFbmNvZGVkRGF0YSwgY2FsbGJhY2spIHsKKyAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHRocmlmdEVuY29kZWREYXRhKTsKKyAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgdmFyIGNsaWVudENsYXNzID0gcmVxdWlyZSgnLi4vZ2VuLW5vZGVqcy9HRU5FUkFURUQnKS5ZT1VSX0NMQVNTX05BTUU7CisgIHZhciBjbGllbnQgPSBuZXcgY2xpZW50Q2xhc3MoKTsKKyAgY2xpZW50LnJlYWQocHJvdG9jb2wpOworICBjYWxsYmFjayhudWxsLCBjbGllbnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQ4MmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworCit2YXIgVXNlclN0b3JhZ2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVXNlclN0b3JhZ2UuanMnKSwKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdXNlcl90eXBlcycpOworCit2YXIgdXNlcnMgPSB7fTsKKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyAgc3RvcmU6IGZ1bmN0aW9uKHVzZXIsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJzZXJ2ZXIgc3RvcmVkOiIsIHVzZXIudWlkKTsKKyAgICB1c2Vyc1t1c2VyLnVpZF0gPSB1c2VyOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKworICByZXRyaWV2ZTogZnVuY3Rpb24odWlkLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygic2VydmVyIHJldHJpZXZlZDoiLCB1aWQpOworICAgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKKyAgfSwKK30pOworCitzZXJ2ZXIubGlzdGVuKDkwOTApOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIGNvbm5lY3QgPSByZXF1aXJlKCdjb25uZWN0Jyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisKK3ZhciBVc2VyU3RvcmFnZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Vc2VyU3RvcmFnZScpLAorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy91c2VyX3R5cGVzJyk7CisKK3ZhciB1c2VycyA9IHt9OworCit2YXIgc3RvcmUgPSBmdW5jdGlvbih1c2VyLCByZXN1bHQpIHsKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyLnVpZCk7CisgIHVzZXJzW3VzZXIudWlkXSA9IHVzZXI7CisgIHJlc3VsdChudWxsKTsKK307Cit2YXIgcmV0cmlldmUgPSBmdW5jdGlvbih1aWQsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHVpZCk7CisgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKK307CisKK3ZhciBzZXJ2ZXJfaHR0cCA9IHRocmlmdC5jcmVhdGVIdHRwU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9odHRwLmxpc3Rlbig5MDkwKTsKKwordmFyIHNlcnZlcl9jb25uZWN0ID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9KSk7CitzZXJ2ZXJfaHR0cC5saXN0ZW4oOTA5MSk7CisKK3ZhciBzZXJ2ZXJfY29ubmVjdF9qc29uID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7cHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sfSkpOworc2VydmVyX2Nvbm5lY3RfanNvbi5saXN0ZW4oOTA5Mik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDhlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKKwordmFyIFVzZXJTdG9yYWdlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1VzZXJTdG9yYWdlJyksCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3VzZXJfdHlwZXMnKTsKKwordmFyIHVzZXJzID0ge307CisKK3ZhciBzdG9yZSA9IGZ1bmN0aW9uKHVzZXIsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygic3RvcmVkOiIsIHVzZXIudWlkKTsKKyAgdXNlcnNbdXNlci51aWRdID0gdXNlcjsKKyAgcmVzdWx0KG51bGwpOworfTsKK3ZhciByZXRyaWV2ZSA9IGZ1bmN0aW9uKHVpZCwgcmVzdWx0KSB7CisgIGNvbnNvbGUubG9nKCJyZXRyaWV2ZWQ6IiwgdWlkKTsKKyAgcmVzdWx0KG51bGwsIHVzZXJzW3VpZF0pOworfTsKKwordmFyIHNlcnZlcl9mcmFtZWQgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9mcmFtZWQubGlzdGVuKDkwOTApOwordmFyIHNlcnZlcl9idWZmZXJlZCA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7dHJhbnNwb3J0OiB0dHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydH0pOworc2VydmVyX2J1ZmZlcmVkLmxpc3Rlbig5MDkxKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvdXNlci50aHJpZnQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODdmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzdHJ1Y3QgVXNlclByb2ZpbGUgeworICAxOiBpMzIgdWlkLAorICAyOiBzdHJpbmcgbmFtZSwKKyAgMzogc3RyaW5nIGJsdXJiCit9CisKK3NlcnZpY2UgVXNlclN0b3JhZ2UgeworICB2b2lkIHN0b3JlKDE6IFVzZXJQcm9maWxlIHVzZXIpLAorICBVc2VyUHJvZmlsZSByZXRyaWV2ZSgxOiBpMzIgdWlkKQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxM2ZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIFBPV184ID0gTWF0aC5wb3coMiwgOCk7Cit2YXIgUE9XXzE2ID0gTWF0aC5wb3coMiwgMTYpOwordmFyIFBPV18yNCA9IE1hdGgucG93KDIsIDI0KTsKK3ZhciBQT1dfMzIgPSBNYXRoLnBvdygyLCAzMik7Cit2YXIgUE9XXzQwID0gTWF0aC5wb3coMiwgNDApOwordmFyIFBPV180OCA9IE1hdGgucG93KDIsIDQ4KTsKK3ZhciBQT1dfNTIgPSBNYXRoLnBvdygyLCA1Mik7Cit2YXIgUE9XXzEwMjIgPSBNYXRoLnBvdygyLCAxMDIyKTsKKworZXhwb3J0cy5yZWFkQnl0ZSA9IGZ1bmN0aW9uKGIpeworCXJldHVybiBiID4gMTI3ID8gYi0yNTYgOiBiOworfTsKKworZXhwb3J0cy5yZWFkSTE2ID0gZnVuY3Rpb24oYnVmZiwgb2ZmKSB7CisgIG9mZiA9IG9mZiB8fCAwOworICB2YXIgdiA9IGJ1ZmZbb2ZmICsgMV07CisgIHYgKz0gYnVmZltvZmZdIDw8IDg7CisgIGlmIChidWZmW29mZl0gJiAxMjgpIHsKKyAgICB2IC09IFBPV18xNjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMucmVhZEkzMiA9IGZ1bmN0aW9uKGJ1ZmYsIG9mZikgeworICBvZmYgPSBvZmYgfHwgMDsKKyAgdmFyIHYgPSBidWZmW29mZiArIDNdOworICB2ICs9IGJ1ZmZbb2ZmICsgMl0gPDwgODsKKyAgdiArPSBidWZmW29mZiArIDFdIDw8IDE2OworICB2ICs9IGJ1ZmZbb2ZmXSAqIFBPV18yNDsKKyAgaWYgKGJ1ZmZbb2ZmXSAmIDB4ODApIHsKKyAgICB2IC09IFBPV18zMjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMud3JpdGVJMTYgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbMV0gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlswXSA9IHYgJiAweGZmOworICByZXR1cm4gYnVmZjsKK307CisKK2V4cG9ydHMud3JpdGVJMzIgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbM10gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlsyXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzFdID0gdiAmIDB4ZmY7CisgIHYgPj49IDg7CisgIGJ1ZmZbMF0gPSB2ICYgMHhmZjsKKyAgcmV0dXJuIGJ1ZmY7Cit9OworCitleHBvcnRzLnJlYWREb3VibGUgPSBmdW5jdGlvbihidWZmLCBvZmYpIHsKKyAgb2ZmID0gb2ZmIHx8IDA7CisgIHZhciBzaWduZWQgPSBidWZmW29mZl0gJiAweDgwOworICB2YXIgZSA9IChidWZmW29mZisxXSAmIDB4RjApID4+IDQ7CisgIGUgKz0gKGJ1ZmZbb2ZmXSAmIDB4N0YpIDw8IDQ7CisKKyAgdmFyIG0gPSBidWZmW29mZis3XTsKKyAgbSArPSBidWZmW29mZis2XSA8PCA4OworICBtICs9IGJ1ZmZbb2ZmKzVdIDw8IDE2OworICBtICs9IGJ1ZmZbb2ZmKzRdICogUE9XXzI0OworICBtICs9IGJ1ZmZbb2ZmKzNdICogUE9XXzMyOworICBtICs9IGJ1ZmZbb2ZmKzJdICogUE9XXzQwOworICBtICs9IChidWZmW29mZisxXSAmIDB4MEYpICogUE9XXzQ4OworCisgIHN3aXRjaCAoZSkgeworICAgIGNhc2UgMDoKKyAgICAgIGUgPSAtMTAyMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA0NzoKKyAgICAgIHJldHVybiBtID8gTmFOIDogKHNpZ25lZCA/IC1JbmZpbml0eSA6IEluZmluaXR5KTsKKyAgICBkZWZhdWx0OgorICAgICAgbSArPSBQT1dfNTI7CisgICAgICBlIC09IDEwMjM7CisgIH0KKworICBpZiAoc2lnbmVkKSB7CisgICAgbSAqPSAtMTsKKyAgfQorCisgIHJldHVybiBtICogTWF0aC5wb3coMiwgZSAtIDUyKTsKK307CisKKy8qCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdGhlIGpzcGFjayBtb2R1bGU6CisgKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNwYWNrLworICovCitleHBvcnRzLndyaXRlRG91YmxlID0gZnVuY3Rpb24oYnVmZiwgdikgeworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzBdID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZlsxXSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZlswXSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZls3XSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzZdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZls0XSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzNdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZlsxXSB8PSBtICYgMHgwZjsKKworICByZXR1cm4gYnVmZjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdjOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOworCittb2R1bGUuZXhwb3J0cyA9IFRCaW5hcnlQcm90b2NvbDsKKworLy8gSmF2YVNjcmlwdCBzdXBwb3J0cyBvbmx5IG51bWVyaWMgZG91YmxlcywgdGhlcmVmb3JlIGV2ZW4gaGV4IHZhbHVlcyBhcmUgYWx3YXlzIHNpZ25lZC4KKy8vIFRoZSBsYXJnZXN0IGludGVnZXIgdmFsdWUgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQgaXMgKy8tMl41My4KKy8vIEJpdHdpc2Ugb3BlcmF0aW9ucyBjb252ZXJ0IG51bWJlcnMgdG8gMzIgYml0IGludGVnZXJzIGJ1dCBwZXJmb3JtIHNpZ24gZXh0ZW5zaW9uCisvLyB1cG9uIGFzc2lnbmluZyB2YWx1ZXMgYmFjayB0byB2YXJpYWJsZXMuCit2YXIgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAgIC8vIDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMiwgLy8gMHg4MDAxMDAwMAorICAgIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmY7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKKyAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKKyAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7CisgICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKKyAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOworICAgIH0KKyAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKKyAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOworICAgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICAgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX3NlcWlkICE9PSBudWxsKSB7CisgICAgICAgIHRoaXMuX3NlcWlkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cud2FybmluZygnTm8gc2VxaWQgdG8gdW5zZXQnKTsKKyAgICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7CisgIHRoaXMud3JpdGVCeXRlKHR5cGUpOworICB0aGlzLndyaXRlSTE2KGlkKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa3R5cGUsIHZ0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGt0eXBlKTsKKyAgdGhpcy53cml0ZUJ5dGUodnR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShldHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgaWYgKGJvb2wpIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgwKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7CisgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVJMTYobmV3IEJ1ZmZlcigyKSwgaTE2KSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTMyKG5ldyBCdWZmZXIoNCksIGkzMikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICBpZiAoaTY0LmJ1ZmZlcikgeworICAgIHRoaXMudHJhbnMud3JpdGUoaTY0LmJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgSW50NjQoaTY0KS5idWZmZXIpOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlRG91YmxlKG5ldyBCdWZmZXIoOCksIGR1YikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICBpZiAodHlwZW9mKGFyZykgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZUkzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSk7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmICgoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB8fAorICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKKyAgICAvLyBkZWZpbmluZyBhIG5ldyBvYmplY3QuIFdlIGRldGVjdCB0aGVtIGhlcmUgc28gd2UgY2FuIHdyaXRlIHRoZW0KKyAgICAvLyBjb3JyZWN0bHkKKyAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOworICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHN6ID0gdGhpcy5yZWFkSTMyKCk7CisgIHZhciB0eXBlLCBuYW1lLCBzZXFpZDsKKworICBpZiAoc3ogPCAwKSB7CisgICAgdmFyIHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKKyAgICB9CisgICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOworICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXIiKTsKKyAgICB9CisgICAgbmFtZSA9IHRoaXMudHJhbnMucmVhZChzeik7CisgICAgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9CisgIHJldHVybiB7Zm5hbWU6IG5hbWUsIG10eXBlOiB0eXBlLCByc2VxaWQ6IHNlcWlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7Zm5hbWU6ICcnfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgaWYgKHR5cGUgPT0gVHlwZS5TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogMH07CisgIH0KKyAgdmFyIGlkID0gdGhpcy5yZWFkSTE2KCk7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiB0eXBlLCBmaWQ6IGlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZXR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7ZXR5cGU6IGV0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworICBpZiAoYiA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTE2KCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEkzMigpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICByZXR1cm4gbmV3IEludDY0KGJ1ZmYpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWREb3VibGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2U4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitleHBvcnRzLlRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciB4aHJDb25uZWN0aW9uID0gcmVxdWlyZSgnLi94aHJfY29ubmVjdGlvbicpOworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5YSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDbGllbnQgPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNsaWVudDsKKworZXhwb3J0cy5NdWx0aXBsZXhlciA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKS5NdWx0aXBsZXhlcjsKKworZXhwb3J0cy5UV2ViU29ja2V0VHJhbnNwb3J0ID0gcmVxdWlyZSgnLi93c190cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworCitleHBvcnRzLlByb3RvY29sID0gZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK21vZHVsZS5leHBvcnRzID0gVEJ1ZmZlcmVkVHJhbnNwb3J0OworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSA9IDEwMjQ7CisgIHRoaXMud3JpdGVCdWZmZXJTaXplID0gNTEyOyAvLyBTb2Z0IExpbWl0CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7IC8vIGZvciBpbnB1dCBidWZmZXIKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQorCitUQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKKyAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKworICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgeworICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKKyAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKKyAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKKyAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKKyAgICB9CisgICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKKyAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7CisKKyAgICBjYWxsYmFjayhyZWFkZXIsIHNlcWlkKTsKKyAgfTsKK307CisKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb21taXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7CisgIHZhciB1bnJlYWRTaXplID0gdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcjsKKyAgdmFyIGJ1ZlNpemUgPSAodW5yZWFkU2l6ZSAqIDIgPiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSkgPworICAgIHVucmVhZFNpemUgKiAyIDogdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemU7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOworICBpZiAodW5yZWFkU2l6ZSA+IDApIHsKKyAgICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMud3JpdGVDdXJzb3IpOworICB9CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRTaXplOworICB0aGlzLmluQnVmID0gYnVmOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKK30KKworICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0CitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworfTsKKworICAvLyBTZXQgdGhlIHNlcWlkIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjbGllbnQKKyAgLy8gU28gdGhhdCBjYWxsYmFja3MgY2FuIGJlIGZvdW5kCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnNldEN1cnJTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuX3NlcWlkID0gc2VxaWQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbik7CisgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGxlbjsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMSk7CisgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRDdXJzb3IrK10pOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOworICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDI7CisgIHJldHVybiBpMTY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKKyAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gODsKKyAgcmV0dXJuIGQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMucmVhZEN1cnNvciArIGxlbik7CisgIHRoaXMucmVhZEN1cnNvciArPSBsZW47CisgIHJldHVybiBzdHI7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0ge2J1ZjogdGhpcy5pbkJ1ZiwgcmVhZEluZGV4OiB0aGlzLnJlYWRDdXJzb3IsIHdyaXRlSW5kZXg6IHRoaXMud3JpdGVDdXJzb3J9OworICByZXR1cm4gb2JqOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgeworICB0aGlzLnJlYWRDdXJzb3IgKz0gYnl0ZXNDb25zdW1lZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgLy8gSWYgdGhlIHNlcWlkIG9mIHRoZSBjYWxsYmFjayBpcyBhdmFpbGFibGUgcGFzcyBpdCB0byB0aGUgb25GbHVzaAorICAvLyBUaGVuIHJlbW92ZSB0aGUgY3VycmVudCBzZXFpZAorICB2YXIgc2VxaWQgPSB0aGlzLl9zZXFpZDsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworCisgIGlmICh0aGlzLm91dENvdW50IDwgMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtc2cgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAorICAgICAgcG9zID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7CisgICAgYnVmLmNvcHkobXNnLCBwb3MsIDApOworICAgIHBvcyArPSBidWYubGVuZ3RoOworICB9KTsKKworICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgLy8gUGFzc2luZyBzZXFpZCB0aHJvdWdoIHRoaXMgY2FsbCB0byBnZXQgaXQgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICB0aGlzLm9uRmx1c2gobXNnLCBzZXFpZCk7CisgIH0KKworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTMxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQ29tcGFjdFByb3RvY29sOworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPV180MCA9IE1hdGgucG93KDIsIDQwKTsKK3ZhciBQT1dfNDggPSBNYXRoLnBvdygyLCA0OCk7Cit2YXIgUE9XXzUyID0gTWF0aC5wb3coMiwgNTIpOwordmFyIFBPV18xMDIyID0gTWF0aC5wb3coMiwgMTAyMik7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBDb21wYWN0IFByb3RvY29sLgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge29iamVjdH0gW3RyYW5zXSAtIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBQcm90b2NvbCBsYXllciBwZXJmb3JtcyBzZXJpYWxpemF0aW9uCisgKiAgICAgb2YgYmFzZSB0eXBlcywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgc2VyaWFsaXplcyBkYXRhIGluIGJpbmFyeQorICogICAgIGZvcm0gd2l0aCBtaW5pbWFsIHNwYWNlIHVzZWQgZm9yIHNjYWxhciB2YWx1ZXMuCisgKi8KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLmxhc3RGaWVsZF8gPSBbXTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworICB0aGlzLnN0cmluZ19saW1pdF8gPSAwOworICB0aGlzLnN0cmluZ19idWZfID0gbnVsbDsKKyAgdGhpcy5zdHJpbmdfYnVmX3NpemVfID0gMDsKKyAgdGhpcy5jb250YWluZXJfbGltaXRfID0gMDsKKyAgdGhpcy5ib29sZWFuRmllbGRfID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZQorICB9OworICB0aGlzLmJvb2xWYWx1ZV8gPSB7CisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZSwKKyAgICBib29sVmFsdWU6IGZhbHNlCisgIH07Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIENvbnN0YW50cworLy8KKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBJRCBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFBST1RPQ09MX0lECisgICovCitUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEID0gLTEyNjsgIC8vMTAwMCAwMDEwCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFZFUlNJT05fTgorICAqLworVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04gPSAxOworCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIHZlcnNpb24gbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9NQVNLCisgICovCitUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9IDB4MWY7IC8vMDAwMSAxMTExCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIG1hc2sgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfTUFTSworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0sgPSAtMzI7ICAgICAvLzExMTAgMDAwMAorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBiaXRzIGZvciBlbnN1cmluZyBtZXNzYWdlIHR5cGUgYml0IHNpemUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfQklUUworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMgPSA3OyAvLzAwMDAgMDExMQorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBzaGlmdCBhbW91bnQgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfU0hJRlRfQU1PVU5UCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIHR5cGUgSURzIHVzZWQgdG8ga2VlcCB0eXBlIGRhdGEgd2l0aGluIG9uZSBuaWJibGUuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RPUCAgICAgICAgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fVFJVRSAgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggdHJ1ZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fRkFMU0UgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggZmFsc2UgdmFsdWUgKHBhY2tlZCBmaWVsZCBhbmQgdmFsdWUpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CWVRFICAgICAgICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kxNiAgICAgICAgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kzMiAgICAgICAgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0k2NCAgICAgICAgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIgKDJeNTMgbWF4IGluIEphdmFTY3JpcHQpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9ET1VCTEUgICAgICAgIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CSU5BUlkgICAgICAgIC0gQXJyYXkgb2YgYnl0ZXMgKHVzZWQgZm9yIHN0cmluZ3MgYWxzbykuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0xJU1QgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU0VUICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTUFQICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NUUlVDVCAgICAgICAgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5UeXBlcyA9IHsKKyAgQ1RfU1RPUDogICAgICAgICAgIDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRTogICAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFOiAgMHgwMiwKKyAgQ1RfQllURTogICAgICAgICAgIDB4MDMsCisgIENUX0kxNjogICAgICAgICAgICAweDA0LAorICBDVF9JMzI6ICAgICAgICAgICAgMHgwNSwKKyAgQ1RfSTY0OiAgICAgICAgICAgIDB4MDYsCisgIENUX0RPVUJMRTogICAgICAgICAweDA3LAorICBDVF9CSU5BUlk6ICAgICAgICAgMHgwOCwKKyAgQ1RfTElTVDogICAgICAgICAgIDB4MDksCisgIENUX1NFVDogICAgICAgICAgICAweDBBLAorICBDVF9NQVA6ICAgICAgICAgICAgMHgwQiwKKyAgQ1RfU1RSVUNUOiAgICAgICAgIDB4MEMKK307CisKKy8qKgorICogQXJyYXkgbWFwcGluZyBDb21wYWN0IHR5cGUgSURzIHRvIHN0YW5kYXJkIFRocmlmdCB0eXBlIElEcy4KKyAqIEByZWFkb25seQorICovCitUQ29tcGFjdFByb3RvY29sLlRUeXBlVG9DVHlwZSA9IFsKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK107CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgVXRpbGl0aWVzCisvLworCisvKioKKyAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgorICogQHJldHVybiB7b2JqZWN0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCisgKi9UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCisvKioKKyAqIExvb2t1cCBhIENvbXBhY3QgUHJvdG9jb2wgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBUaHJpZnQgVHlwZSB2YWx1ZS4KKyAqIE4uQi4gVXNlZCBvbmx5IGludGVybmFsbHkuCisgKiBAcGFyYW0ge251bWJlcn0gdHR5cGUgLSBUaHJpZnQgdHlwZSB2YWx1ZQorICogQHJldHVybnMge251bWJlcn0gQ29tcGFjdCBwcm90b2NvbCB0eXBlIHZhbHVlCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldENvbXBhY3RUeXBlID0gZnVuY3Rpb24odHR5cGUpIHsKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlW3R0eXBlXTsKK307CisKKy8qKgorICogTG9va3VwIGEgVGhyaWZ0IFR5cGUgdmFsdWUgZm9yIGEgZ2l2ZW4gQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlLgorICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gQ29tcGFjdCBQcm90b2NvbCB0eXBlIHZhbHVlCisgKiBAcmV0dXJucyB7bnVtYmVyfSBUaHJpZnQgVHlwZSB2YWx1ZQorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm4gVHlwZS5TVE9QOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVHlwZS5CT09MOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFOgorICAgICAgcmV0dXJuIFR5cGUuQllURTsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2OgorICAgICAgcmV0dXJuIFR5cGUuSTE2OworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMzI6CisgICAgICByZXR1cm4gVHlwZS5JMzI7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NDoKKyAgICAgIHJldHVybiBUeXBlLkk2NDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFR5cGUuRE9VQkxFOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlk6CisgICAgICByZXR1cm4gVHlwZS5TVFJJTkc7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0xJU1Q6CisgICAgICByZXR1cm4gVHlwZS5MSVNUOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQ6CisgICAgICByZXR1cm4gVHlwZS5TRVQ7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUDoKKyAgICAgIHJldHVybiBUeXBlLk1BUDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFR5cGUuU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorICByZXR1cm4gVHlwZS5TVE9QOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCB3cml0ZSBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFNlbmQgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSBlbmQgcG9pbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhbiBSUEMgbWVzc2FnZSBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSAoQ0FMTCwgUkVQTFksIEVYQ0VQVElPTiwgT05FV0FZKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBjYWxsIHNlcXVlbmNlIG51bWJlciAoaWYgYW55KS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICB0aGlzLndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEKTsKKyAgdGhpcy53cml0ZUJ5dGUoKFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICgodHlwZSA8PCBUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2wuVFlQRV9NQVNLKSk7CisgIHRoaXMud3JpdGVWYXJpbnQzMihzZXFpZCk7CisgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisKKyAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCisgIGlmICh0aGlzLl9zZXFpZCkgeworICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICB9IGVsc2UgeworICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CisgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSB0aGlzLmxhc3RGaWVsZF8ucG9wKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBmaWVsZCBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZpZWxkIG5hbWUgKG5vdCB3cml0dGVuIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wpLgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgZmllbGQgZGF0YSB0eXBlIChhIG5vcm1hbCBUaHJpZnQgZmllbGQgVHlwZSkuCisgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSURMIGZpZWxkIElkLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgeworICBpZiAodHlwZSAhPSBUeXBlLkJPT0wpIHsKKyAgICByZXR1cm4gdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlLCBpZCwgLTEpOworICB9CisKKyAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gdHlwZTsKKyAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkSWQgPSBpZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIG1hcCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGtleVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorICogQHBhcmFtIHtudW1iZXJ9IHZhbFR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2Ygay92IHBhaXJzIGluIHRoZSBtYXAuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKHNpemUpOworICAgIHRoaXMud3JpdGVCeXRlKHRoaXMuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUodmFsVHlwZSkpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworLyoqCisgKiBXcml0ZXMgYSBsaXN0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIGxpc3QgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogV3JpdGVzIGEgc2V0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIHNldCBlbGVtZW50cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgaWYgKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lICE9PSBudWxsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCh0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOworICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHRoaXMud3JpdGVCeXRlKCh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgeworICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMTYpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkzMikpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgdGhpcy53cml0ZVZhcmludDY0KHRoaXMuaTY0VG9aaWd6YWcoaTY0KSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKHYpIHsKKyAgdmFyIGJ1ZmYgPSBuZXcgQnVmZmVyKDgpOworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzddID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZls2XSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZls3XSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZlswXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzFdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlszXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls2XSB8PSBtICYgMHgwZjsKKworICB0aGlzLnRyYW5zLndyaXRlKGJ1ZmYpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKSA7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIgfHwKKyAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQorICAgIHRoaXMud3JpdGVWYXJpbnQzMihhcmcubGVuZ3RoKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHdyaXRlIG1ldGhvZHMKKy8vCisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbkludGVybmFsID0gZnVuY3Rpb24obmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGUpIHsKKyAgLy9JZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIHZhciB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0aGlzLmdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworICAvL0NoZWNrIGlmIHdlIGNhbiBkZWx0YSBlbmNvZGUgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElkID4gdGhpcy5sYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIHRoaXMubGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy9JbmNsdWRlIHRoZSB0eXBlIGRlbHRhIHdpdGggdGhlIGZpZWxkIElECisgICAgdGhpcy53cml0ZUJ5dGUoKGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgfSBlbHNlIHsKKyAgICAvL1dyaXRlIHNlcGFyYXRlIHR5cGUgYW5kIElEIHZhbHVlcworICAgIHRoaXMud3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICB0aGlzLndyaXRlSTE2KGZpZWxkSWQpOworICB9CisgIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQ29sbGVjdGlvbkJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICAvL0NvbWJpbmUgc2l6ZSBhbmQgdHlwZSBpbiBvbmUgYnl0ZSBpZiBwb3NzaWJsZQorICAgIHRoaXMud3JpdGVCeXRlKHNpemUgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgweGYwIHwgdGhpcy5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHRoaXMud3JpdGVWYXJpbnQzMihzaXplKTsKKyAgfQorfTsKKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDMyID0gZnVuY3Rpb24obikgeworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcig1KTsKKyAgdmFyIHdzaXplID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IG47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPSBuID4+PiA3OworICAgIH0KKyAgfQorICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOworICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7CisgIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Cit9OworCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICogTi5CLiBub2RlLWludDY0IGlzIGFsd2F5cyBiaWcgZW5kaWFuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlVmFyaW50NjQgPSBmdW5jdGlvbihuKSB7CisgIGlmICh0eXBlb2YgbiA9PT0gIm51bWJlciIpeworICAgIG4gPSBuZXcgSW50NjQobik7CisgIH0KKyAgaWYgKCEgKG4gaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbik7CisgIH0KKworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxMCk7CisgIHZhciB3c2l6ZSA9IDA7CisgIHZhciBoaSA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworICB2YXIgbWFzayA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCgobG8gJiB+MHg3RikgPT09IDApICYmIChoaSA9PT0gMCkpIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGxvOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobG8gJiAweDdGKSB8IDB4ODApOworICAgICAgbWFzayA9IGhpIDw8IDI1OworICAgICAgbG8gPSBsbyA+Pj4gNzsKKyAgICAgIGhpID0gaGkgPj4+IDc7CisgICAgICBsbyA9IGxvIHwgbWFzazsKKyAgICB9CisgIH0KKyAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKKyAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOworICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOworfTsKKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmk2NFRvWmlnemFnID0gZnVuY3Rpb24obCkgeworICBpZiAodHlwZW9mIGwgPT09ICdzdHJpbmcnKSB7CisgICAgbCA9IG5ldyBJbnQ2NChwYXJzZUludChsLCAxMCkpOworICB9IGVsc2UgaWYgKHR5cGVvZiBsID09PSAnbnVtYmVyJykgeworICAgIGwgPSBuZXcgSW50NjQobCk7CisgIH0KKyAgaWYgKCEgKGwgaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbCk7CisgIH0KKyAgdmFyIGhpID0gbC5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisgIHZhciBzaWduID0gaGkgPj4+IDMxOworICBoaSA9ICgoaGkgPDwgMSkgfCAobG8gPj4+IDMxKSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7CisgIGxvID0gKGxvIDw8IDEpIF4gKCghIXNpZ24pID8gMHhGRkZGRkZGRiA6IDApOworICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5pMzJUb1ppZ3phZyA9IGZ1bmN0aW9uKG4pIHsKKyAgcmV0dXJuIChuIDw8IDEpIF4gKChuICYgMHg4MDAwMDAwMCkgPyAweEZGRkZGRkZGIDogMCk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIHJlYWQgb3BlcmF0aW9ucworLy8KKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAvL1JlYWQgcHJvdG9jb2wgSUQKKyAgdmFyIHByb3RvY29sSWQgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIGlmIChwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyICIgKyBwcm90b2NvbElkKTsKKyAgfQorCisgIC8vUmVhZCBWZXJzaW9uIGFuZCBUeXBlCisgIHZhciB2ZXJzaW9uQW5kVHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgdmFyIHZlcnNpb24gPSAodmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgIH0KKyAgdmFyIHR5cGUgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMpOworCisgIC8vUmVhZCBTZXFJZAorICB2YXIgc2VxaWQgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworCisgIC8vUmVhZCBuYW1lCisgIHZhciBuYW1lID0gdGhpcy5yZWFkU3RyaW5nKCk7CisKKyAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZF8ucHVzaCh0aGlzLmxhc3RGaWVsZElkXyk7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIHtmbmFtZTogJyd9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBmaWVsZElkID0gMDsKKyAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKGIpOworICB2YXIgdHlwZSA9IChiICYgMHgwZik7CisKKyAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IFRocmlmdC5UeXBlLlNUT1AsIGZpZDogMH07CisgIH0KKworICAvL01hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIgdG8gY2hlY2sgZm9yIGZpZWxkIGlkIGRlbHRhLgorICB2YXIgbW9kaWZpZXIgPSAoKGIgJiAweDAwMDAwMGYwKSA+Pj4gNCk7CisgIGlmIChtb2RpZmllciA9PT0gMCkgeworICAgIC8vSWYgbm90IGEgZGVsdGEgcmVhZCB0aGUgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IHRoaXMucmVhZEkxNigpOworICB9IGVsc2UgeworICAgIC8vUmVjb3ZlciB0aGUgZmllbGQgaWQgZnJvbSB0aGUgZGVsdGEKKyAgICBmaWVsZElkID0gKHRoaXMubGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICB9CisgIHZhciBmaWVsZFR5cGUgPSB0aGlzLmdldFRUeXBlKHR5cGUpOworCisgIC8vQm9vbGVhbiBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkgeworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy9TYXZlIHRoZSBuZXcgZmllbGQgZm9yIHRoZSBuZXh0IGRlbHRhIGNvbXB1dGF0aW9uLgorICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiBmaWVsZFR5cGUsIGZpZDogZmllbGRJZH07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbXNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAobXNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIG1hcCBzaXplIik7CisgIH0KKworICB2YXIga3ZUeXBlID0gMDsKKyAgaWYgKG1zaXplICE9PSAwKSB7CisgICAga3ZUeXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICB9CisKKyAgdmFyIGtleVR5cGUgPSB0aGlzLmdldFRUeXBlKChrdlR5cGUgJiAweGYwKSA+Pj4gNCk7CisgIHZhciB2YWxUeXBlID0gdGhpcy5nZXRUVHlwZShrdlR5cGUgJiAweGYpOworICByZXR1cm4ge2t0eXBlOiBrZXlUeXBlLCB2dHlwZTogdmFsVHlwZSwgc2l6ZTogbXNpemV9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZV9hbmRfdHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKworICB2YXIgbHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+Pj4gNCkgJiAweDAwMDAwMDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICBsc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGxpc3Qgc2l6ZSIpOworICB9CisKKyAgdmFyIGVsZW1UeXBlID0gdGhpcy5nZXRUVHlwZShzaXplX2FuZF90eXBlICYgMHgwMDAwMDAwZik7CisKKyAgcmV0dXJuIHtldHlwZTogZWxlbVR5cGUsIHNpemU6IGxzaXplfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlID0gZmFsc2U7CisgIHZhciByc2l6ZSA9IDA7CisgIGlmICh0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09PSB0cnVlKSB7CisgICAgdmFsdWUgPSB0aGlzLmJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgcmVzID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICAgIHJzaXplID0gcmVzLnJzaXplOworICAgIHZhbHVlID0gKHJlcy52YWx1ZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy56aWd6YWdUb0kzMih0aGlzLnJlYWRWYXJpbnQzMigpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuemlnemFnVG9JNjQodGhpcy5yZWFkVmFyaW50NjQoKSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICB2YXIgb2ZmID0gMDsKKworICB2YXIgc2lnbmVkID0gYnVmZltvZmYgKyA3XSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzZdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmYrN10gJiAweDdGKSA8PCA0OworCisgIHZhciBtID0gYnVmZltvZmZdOworICBtICs9IGJ1ZmZbb2ZmKzFdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrMl0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrNV0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzZdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhzaXplKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgaW50ZXJuYWwgcmVhZCBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFyaW50MzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZFZhcmludDY0KCkudG9OdW1iZXIoKTsKK307CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciByc2l6ZSA9IDA7CisgIHZhciBsbyA9IDA7CisgIHZhciBoaSA9IDA7CisgIHZhciBzaGlmdCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgICAgcnNpemUgKys7CisgICAgaWYgKHNoaWZ0IDw9IDI1KSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgIH0gZWxzZSBpZiAoMjUgPCBzaGlmdCAmJiBzaGlmdCA8IDMyKSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpID4+PiAoMzItc2hpZnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpIDw8IChzaGlmdC0zMikpOworICAgIH0KKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGIgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyc2l6ZSA+PSAxMCkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JMzIgPSBmdW5jdGlvbihuKSB7CisgIHJldHVybiAobiA+Pj4gMSkgXiAoLTEgKiAobiAmIDEpKTsKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnppZ3phZ1RvSTY0ID0gZnVuY3Rpb24obikgeworICB2YXIgaGkgPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKworICB2YXIgbmVnID0gbmV3IEludDY0KGhpICYgMCwgbG8gJiAxKTsKKyAgbmVnLl8yc2NvbXAoKTsKKyAgdmFyIGhpX25lZyA9IG5lZy5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG9fbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisKKyAgdmFyIGhpX2xvID0gKGhpIDw8IDMxKTsKKyAgaGkgPSAoaGkgPj4+IDEpIF4gKGhpX25lZyk7CisgIGxvID0gKChsbyA+Pj4gMSkgfCBoaV9sbykgXiAobG9fbmVnKTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YzA2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7Cit2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7Cit2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7CisKK3ZhciBDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CisKKyAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CisgIHRoaXMuY29ubmVjdGlvbiA9IHN0cmVhbTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOworICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKKyAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKyAgdGhpcy5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKKworICB0aGlzLl9kZWJ1ZyA9IHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKKyAgaWYgKHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJgorICAgICAgdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyA+IDApIHsKKyAgICAgdGhpcy5tYXhfYXR0ZW1wdHMgPSArdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0czsKKyAgfQorICB0aGlzLnJldHJ5X21heF9kZWxheSA9IG51bGw7CisgIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5KSAmJgorICAgICAgdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSA+IDApIHsKKyAgICAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSB0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5OworICB9CisgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gZmFsc2U7CisgIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCkgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPiAwKSB7CisgICAgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gK3RoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQ7CisgIH0KKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIodGhpcy5zc2wgPyAic2VjdXJlQ29ubmVjdCIgOiAiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKKworICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKKyAgICB0aGlzLnNldE5vRGVsYXkoKTsKKyAgICB0aGlzLmZyYW1lTGVmdCA9IDA7CisgICAgdGhpcy5mcmFtZVBvcyA9IDA7CisgICAgdGhpcy5mcmFtZSA9IG51bGw7CisgICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKKworICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKKyAgICB9KTsKKworICAgIHNlbGYuZW1pdCgiY29ubmVjdCIpOworICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICAgLy8gT25seSBlbWl0IHRoZSBlcnJvciBpZiBuby1vbmUgZWxzZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvbm5lY3Rpb24KKyAgICAvLyBvciBpZiBzb21lb25lIGlzIGxpc3RlbmluZyBvbiB1cywgYmVjYXVzZSBOb2RlIHR1cm5zIHVuaGFuZGxlZAorICAgIC8vICdlcnJvcicgZXZlbnRzIGludG8gZXhjZXB0aW9ucy4KKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEgfHwKKyAgICAgICAgc2VsZi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID4gMCkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgICAgfQorICB9KTsKKworICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgorICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKSB7CisgICAgc2VsZi5jb25uZWN0aW9uX2dvbmUoKTsgLy8gaGFuZGxlIGNsb3NlIGV2ZW50LiB0cnkgdG8gcmVjb25uZWN0CisgIH0pOworCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigidGltZW91dCIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuZW1pdCgidGltZW91dCIpOworICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImRhdGEiLCBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IG1lc3NhZ2UucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKKyAgICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgICAgLy8gIFRoZSBjb25uZWN0aW9uLmNsaWVudCBvYmplY3QgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdAorICAgICAgICAvLyAgbXVsdGlwbGV4aW5nLCB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZAorICAgICAgICAvLyAgaGFzaCBvZiBjbGllbnQgb2JqZWN0cy4KKyAgICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgICAvLyAgLS1yYQorICAgICAgICB2YXIgc2VydmljZV9uYW1lID0gc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgfQorICAgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisKKyAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgICBkZWxldGUgc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAvKmpzaGludCArVzA4MyAqLworCisgICAgICAgIGlmKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9KSk7Cit9OwordXRpbC5pbmhlcml0cyhDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCitDb25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmNvbm5lY3Rpb24uZGVzdHJveSgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZV9yZXRyeV92YXJzID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgdGhpcy5yZXRyeV90b3RhbHRpbWUgPSAwOworICB0aGlzLnJldHJ5X2RlbGF5ID0gMTUwOworICB0aGlzLnJldHJ5X2JhY2tvZmYgPSAxLjc7CisgIHRoaXMuYXR0ZW1wdHMgPSAwOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIGlmICghdGhpcy5jb25uZWN0ZWQpIHsKKyAgICB0aGlzLm9mZmxpbmVfcXVldWUucHVzaChkYXRhKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGhpcy5jb25uZWN0aW9uLndyaXRlKGRhdGEpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuY29ubmVjdGlvbl9nb25lID0gZnVuY3Rpb24gKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisKKyAgLy8gSWYgYSByZXRyeSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBqdXN0IGxldCB0aGF0IGhhcHBlbgorICBpZiAodGhpcy5yZXRyeV90aW1lcikgeworICAgIHJldHVybjsKKyAgfQorICAvLyBXZSBjYW5ub3QgcmVjb25uZWN0IGEgc2VjdXJlIHNvY2tldC4KKyAgaWYgKCF0aGlzLm1heF9hdHRlbXB0cyB8fCB0aGlzLnNzbCkgeworICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGhpcy5yZXRyeV9tYXhfZGVsYXkgIT09IG51bGwgJiYgdGhpcy5yZXRyeV9kZWxheSA+PSB0aGlzLnJldHJ5X21heF9kZWxheSkgeworICAgIHRoaXMucmV0cnlfZGVsYXkgPSB0aGlzLnJldHJ5X21heF9kZWxheTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnJldHJ5X2RlbGF5ID0gTWF0aC5mbG9vcih0aGlzLnJldHJ5X2RlbGF5ICogdGhpcy5yZXRyeV9iYWNrb2ZmKTsKKyAgfQorCisgIGxvZy5kZWJ1ZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKKworICBpZiAodGhpcy5tYXhfYXR0ZW1wdHMgJiYgdGhpcy5hdHRlbXB0cyA+PSB0aGlzLm1heF9hdHRlbXB0cykgeworICAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOworICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyB0aGlzLm1heF9hdHRlbXB0cyArICIgYXR0ZW1wdHMuIik7CisgICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRoaXMuYXR0ZW1wdHMgKz0gMTsKKyAgdGhpcy5lbWl0KCJyZWNvbm5lY3RpbmciLCB7CisgICAgZGVsYXk6IHNlbGYucmV0cnlfZGVsYXksCisgICAgYXR0ZW1wdDogc2VsZi5hdHRlbXB0cworICB9KTsKKworICB0aGlzLnJldHJ5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5kZXN0cm95ZWQpIHsKKyAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZy5kZWJ1ZygiUmV0cnlpbmcgY29ubmVjdGlvbi4uLiIpOworCisgICAgc2VsZi5yZXRyeV90b3RhbHRpbWUgKz0gc2VsZi5yZXRyeV9kZWxheTsKKworICAgIGlmIChzZWxmLmNvbm5lY3RfdGltZW91dCAmJiBzZWxmLnJldHJ5X3RvdGFsdGltZSA+PSBzZWxmLmNvbm5lY3RfdGltZW91dCkgeworICAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyBzZWxmLnJldHJ5X3RvdGFsdGltZSArICJtcy4iKTsKKyAgICAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzZWxmLnBhdGggIT09IHVuZGVmaW5lZCkgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIH0KKyAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgfSwgdGhpcy5yZXRyeV9kZWxheSk7Cit9OworCitleHBvcnRzLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHZhciBzdHJlYW0gPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihwb3J0LCBob3N0KTsKKyAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOworICBjb25uZWN0aW9uLmhvc3QgPSBob3N0OworICBjb25uZWN0aW9uLnBvcnQgPSBwb3J0OworCisgIHJldHVybiBjb25uZWN0aW9uOworfTsKKworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICB2YXIgc3RyZWFtID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24ocGF0aCk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5wYXRoID0gcGF0aDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zKSkgeworICAgIG9wdGlvbnMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgb3B0aW9ucy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgIH0KKworICB2YXIgc3RyZWFtID0gdGxzLmNvbm5lY3QocG9ydCwgaG9zdCwgb3B0aW9ucyk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5ob3N0ID0gaG9zdDsKKyAgY29ubmVjdGlvbi5wb3J0ID0gcG9ydDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKKworZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjcmVhdGVDbGllbnQ7CisKK3ZhciBjaGlsZF9wcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwordmFyIFN0ZElPQ29ubmVjdGlvbiA9IGV4cG9ydHMuU3RkSU9Db25uZWN0aW9uID0gZnVuY3Rpb24oY29tbWFuZCwgb3B0aW9ucykgeworICB2YXIgY29tbWFuZF9wYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJyAnKTsKKyAgY29tbWFuZCA9IGNvbW1hbmRfcGFydHNbMF07CisgIHZhciBhcmdzID0gY29tbWFuZF9wYXJ0cy5zcGxpY2UoMSxjb21tYW5kX3BhcnRzLmxlbmd0aCAtMSk7CisgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsYXJncyk7CisKKyAgdmFyIHNlbGYgPSB0aGlzOworICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICB0aGlzLmNvbm5lY3Rpb24gPSBjaGlsZC5zdGRpbjsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CisgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOworCisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKKyAgICB9KTsKKworICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSxzaWduYWwpIHsKKyAgICAgIGxvZy5kZWJ1Zyhjb2RlICsgJzonICsgc2lnbmFsLCAnQ0hJTEQgRVhJVEVEJyk7CisgICAgfSk7CisgIH0KKworICB0aGlzLmZyYW1lTGVmdCA9IDA7CisgIHRoaXMuZnJhbWVQb3MgPSAwOworICB0aGlzLmZyYW1lID0gbnVsbDsKKyAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCisgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKKyAgfSk7CisKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgIH0pOworCisgIC8vIEFkZCBhIGNsb3NlIGxpc3RlbmVyCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpIHsKKyAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgIH0pOworCisgIGNoaWxkLnN0ZG91dC5hZGRMaXN0ZW5lcigiZGF0YSIsIHNlbGYudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgbWVzc2FnZSA9IG5ldyBzZWxmLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICAgIHRyeSB7CisgICAgICB2YXIgaGVhZGVyID0gbWVzc2FnZS5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworCisgICAgICAgIHZhciBjYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgY2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CisgICAgfQorICB9KSk7Cit9OworCit1dGlsLmluaGVyaXRzKFN0ZElPQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOworfTsKKworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKCF0aGlzLmNvbm5lY3RlZCkgeworICAgIHRoaXMub2ZmbGluZV9xdWV1ZS5wdXNoKGRhdGEpOworICAgIHJldHVybjsKKyAgfQorICB0aGlzLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7CisgIHJldHVybiBuZXcgU3RkSU9Db25uZWN0aW9uKGNvbW1hbmQsb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNsaWVudDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNsaWVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVGhyaWZ0IHNlcnZpY2UuCisgKiBAcGFyYW0ge29iamVjdH0gU2VydmljZUNsaWVudCAtIFRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xpZW50CisgKiBAcGFyYW0ge0Nvbm5lY3Rpb259IENvbm5lY3Rpb24gLSBUaGUgY29ubmVjdGlvbiB0byB1c2UuCisgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY2xpZW50IG9iamVjdC4KKyAqLworZnVuY3Rpb24gY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgLy8gVE9ETyB2YWxpZGF0ZSByZXF1aXJlZCBvcHRpb25zIGFuZCB0aHJvdyBvdGhlcndpc2UKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIC8vIFRPRE8gZGV0YW5nbGUgdGhlc2UgaW5pdGlhbGl6YXRpb24gY2FsbHMKKyAgLy8gY3JlYXRpbmcgImNsaWVudCIgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyBzZXJ2aWNlIGNsaWVudCBpbnN0YW5jZQorICAvLworICAvLyBOZXcgc2VydmljZSBjbGllbnQgaW5zdGFuY2UgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UKKyAgLy8gICAtIHByb3RvY29sIGNsYXNzIHJlZmVyZW5jZQorICAvLworICAvLyBOZXcgdHJhbnNwb3J0IGluc3RhbmNlIHJlcXVpcmVzCisgIC8vICAgLSBCdWZmZXIgdG8gdXNlIChvciBub25lKQorICAvLyAgIC0gQ2FsbGJhY2sgdG8gY2FsbCBvbiBmbHVzaAorCisgIC8vIFdyYXAgdGhlIHdyaXRlIG1ldGhvZAorICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKKyAgICBjb25uZWN0aW9uLndyaXRlKGJ1Ziwgc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIGNvbm5lY3Rpb24ucHJvdG9jb2wpOworICB0cmFuc3BvcnQuY2xpZW50ID0gY2xpZW50OworICBjb25uZWN0aW9uLmNsaWVudCA9IGNsaWVudDsKKyAgcmV0dXJuIGNsaWVudDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDc5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRGcmFtZWRUcmFuc3BvcnQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmluQnVmID0gYnVmZmVyIHx8IG5ldyBCdWZmZXIoMCk7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKKyAgdGhpcy5yZWFkUG9zID0gMDsKKyAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CisgIHZhciByZXNpZHVhbCA9IG51bGw7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAvLyBQcmVwZW5kIGFueSByZXNpZHVhbCBkYXRhIGZyb20gb3VyIHByZXZpb3VzIHJlYWQKKyAgICBpZiAocmVzaWR1YWwpIHsKKyAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtyZXNpZHVhbCwgZGF0YV0pOworICAgICAgcmVzaWR1YWwgPSBudWxsOworICAgIH0KKworICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKKyAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0CisgICAgICAgIHJlc2lkdWFsID0gZGF0YTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFyIGZyYW1lU2l6ZSA9IGJpbmFyeS5yZWFkSTMyKGRhdGEsIDApOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCArIGZyYW1lU2l6ZSkgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGJ5dGVzIHRvIGNvbnRpbnVlLCBzYXZlIGFuZCByZXN1bWUgb24gbmV4dCBwYWNrZXQKKyAgICAgICAgcmVzaWR1YWwgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmcmFtZSA9IGRhdGEuc2xpY2UoNCwgNCArIGZyYW1lU2l6ZSk7CisgICAgICByZXNpZHVhbCA9IGRhdGEuc2xpY2UoNCArIGZyYW1lU2l6ZSk7CisKKyAgICAgIGNhbGxiYWNrKG5ldyBURnJhbWVkVHJhbnNwb3J0KGZyYW1lKSwgc2VxaWQpOworCisgICAgICBkYXRhID0gcmVzaWR1YWw7CisgICAgICByZXNpZHVhbCA9IG51bGw7CisgICAgfQorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29tbWl0UG9zaXRpb24gPSBmdW5jdGlvbigpe30sCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXt9LAorCisgIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gIGZ1bmN0aW9uKCkge307CisKKyAgLy8gU2V0IHRoZSBzZXFpZCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2xpZW50CisgIC8vIFNvIHRoYXQgY2FsbGJhY2tzIGNhbiBiZSBmb3VuZAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0Q3VyclNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkUG9zICsgbGVuID4gdGhpcy5pbkJ1Zi5sZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggZnJhbWVzLgorICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgZW5kID0gdGhpcy5yZWFkUG9zICsgbGVuOworCisgIGlmICh0aGlzLmluQnVmLmxlbmd0aCA8IGVuZCkgeworICAgIHRocm93IG5ldyBFcnJvcigncmVhZCgnICsgbGVuICsgJykgZmFpbGVkIC0gbm90IGVub3VnaCBkYXRhJyk7CisgIH0KKworICB2YXIgYnVmID0gdGhpcy5pbkJ1Zi5zbGljZSh0aGlzLnJlYWRQb3MsIGVuZCk7CisgIHRoaXMucmVhZFBvcyA9IGVuZDsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOworICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkUG9zKytdKTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMik7CisgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gMjsKKyAgcmV0dXJuIGkxNjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7CisgIHZhciBkID0gYmluYXJ5LnJlYWREb3VibGUodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDg7CisgIHJldHVybiBkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZFBvcywgdGhpcy5yZWFkUG9zICsgbGVuKTsKKyAgdGhpcy5yZWFkUG9zICs9IGxlbjsKKyAgcmV0dXJuIHN0cjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIGJ1ZjogdGhpcy5pbkJ1ZiwKKyAgICByZWFkSW5kZXg6IHRoaXMucmVhZFBvcywKKyAgICB3cml0ZUluZGV4OiB0aGlzLmluQnVmLmxlbmd0aAorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKGJ5dGVzQ29uc3VtZWQpIHsKKyAgdGhpcy5yZWFkUG9zICs9IGJ5dGVzQ29uc3VtZWQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIC8vIElmIHRoZSBzZXFpZCBvZiB0aGUgY2FsbGJhY2sgaXMgYXZhaWxhYmxlIHBhc3MgaXQgdG8gdGhlIG9uRmx1c2gKKyAgLy8gVGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgc2VxaWQKKyAgdmFyIHNlcWlkID0gdGhpcy5fc2VxaWQ7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKKworICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKKyAgICAgIHBvcyA9IDA7CisgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgeworICAgIGJ1Zi5jb3B5KG91dCwgcG9zLCAwKTsKKyAgICBwb3MgKz0gYnVmLmxlbmd0aDsKKyAgfSk7CisKKyAgaWYgKHRoaXMub25GbHVzaCkgeworICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKKyAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihvdXQubGVuZ3RoICsgNCk7CisgICAgYmluYXJ5LndyaXRlSTMyKG1zZywgb3V0Lmxlbmd0aCk7CisgICAgb3V0LmNvcHkobXNnLCA0LCAwLCBvdXQubGVuZ3RoKTsKKyAgICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgICAvLyBQYXNzaW5nIHNlcWlkIHRocm91Z2ggdGhpcyBjYWxsIHRvIGdldCBpdCB0byB0aGUgY29ubmVjdGlvbgorICAgICAgdGhpcy5vbkZsdXNoKG1zZywgc2VxaWQpOworICAgIH0KKyAgfQorCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJhYjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQ29ubmVjdE9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmFuc3BvcnQgLSBUaGUgVGhyaWZ0IGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBldGMpLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sIC0gVGhlIFRocmlmdCBzZXJpYWxpemF0aW9uIHByb3RvY29sIHRvIHVzZSAoVEJpbmFyeVByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIFBPU1QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBodHRwcyAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSBodHRwcywgb3RoZXJ3aXNlIGh0dHAgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBub2RlT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIG5vZGUuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzIHNzbC90bHMsIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoIHJlcXVlc3QsCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byBodHRwczovL3RocmlmdC5leGFtcGxlLmNvbTo5MDkwL2hlbGxvCisgKiAgICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICogICAgIHZhciBvcHRpb25zID0geworICogICAgICAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAqICAgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgKiAgICAgICAgcGF0aDogIi9oZWxsbyIsCisgKiAgICAgICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCisgKiAgICAgICAgaHR0cHM6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIHZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCisgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCisgKiAgICAgcmVxdWVzdCBvciByZXNwb25zZSBwcm9jZXNzaW5nLCBpbiB3aGljaCBjYXNlIHRoZSBub2RlIGVycm9yIGlzIHBhc3NlZCBvbi4gQW4gImVycm9yIgorICogICAgIGV2ZW50IG1heSBhbHNvIGJlIGZpcmVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBIdHRwQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCisgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KKyAqLwordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOworICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKKworICAvL1ByZXBhcmUgTm9kZS5qcyBvcHRpb25zCisgIHRoaXMubm9kZU9wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCisgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAorICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LAorICAgIHJlc3BvbnNlVHlwZTogdGhpcy5vcHRpb25zLnJlc3BvbnNlVHlwZSB8fCBudWxsCisgIH07CisgIGZvciAodmFyIGF0dHJuYW1lIGluIHRoaXMub3B0aW9ucy5ub2RlT3B0aW9ucykgeworICAgIHRoaXMubm9kZU9wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zW2F0dHJuYW1lXTsKKyAgfQorICAvKmpzaGludCAtVzA2OSAqLworICBpZiAoISB0aGlzLm5vZGVPcHRpb25zLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSkgeworICAgIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2tlZXAtYWxpdmUnOworICB9CisgIC8qanNoaW50ICtXMDY5ICovCisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIGZ1bmN0aW9uIGRlY29kZUNhbGxiYWNrKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgcHJvdG8gPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAgIC8vICBvYmplY3RzLgorICAgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAgIC8vICAtLXJhCisgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIH0KKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgICAgaWYoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvL1Jlc3BvbnNlIGhhbmRsZXIKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgdGhpcy5yZXNwb25zZUNhbGxiYWNrID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICB2YXIgZGF0YSA9IFtdOworICAgIHZhciBkYXRhTGVuID0gMDsKKworICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKKyAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOworICAgIH0pOworCisgICAgLy8gV2hlbiBydW5uaW5nIGRpcmVjdGx5IHVuZGVyIG5vZGUsIGNodW5rIHdpbGwgYmUgYSBidWZmZXIsCisgICAgLy8gaG93ZXZlciwgd2hlbiBydW5uaW5nIGluIGEgQnJvd3NlciAoZS5nLiBCcm93c2VyaWZ5KSwgY2h1bmsKKyAgICAvLyB3aWxsIGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5QnVmZmVyLgorICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7CisgICAgICBpZiAoKHR5cGVvZiBjaHVuayA9PSAnc3RyaW5nJykgfHwKKyAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNodW5rKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgICAgIC8vIFdyYXAgQXJyYXlCdWZmZXIvc3RyaW5nIGluIGEgQnVmZmVyIHNvIGRhdGFbaV0uY29weSB3aWxsIHdvcmsKKyAgICAgICAgZGF0YS5wdXNoKG5ldyBCdWZmZXIoY2h1bmspKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHVzaChjaHVuayk7CisgICAgICB9CisgICAgICBkYXRhTGVuICs9IGNodW5rLmxlbmd0aDsKKyAgICB9KTsKKworICAgIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpeworICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YUxlbik7CisgICAgICBmb3IgKHZhciBpPTAsIGxlbj1kYXRhLmxlbmd0aCwgcG9zPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXS5jb3B5KGJ1ZiwgcG9zKTsKKyAgICAgICAgcG9zICs9IGRhdGFbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgLy9HZXQgdGhlIHJlY2VpdmVyIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwb3J0IGFuZAorICAgICAgLy8gIGNhbGwgaXQgd2l0aCB0aGUgYnVmZmVyCisgICAgICBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihkZWNvZGVDYWxsYmFjaykoYnVmKTsKKyAgICB9KTsKKyAgfTsKK307Cit1dGlsLmluaGVyaXRzKEh0dHBDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyAqIFdyaXRlcyBUaHJpZnQgbWVzc2FnZSBkYXRhIHRvIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIEEgTm9kZS5qcyBCdWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZQorICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS4KKyAqIEBldmVudCB7ZXJyb3J9IHRoZSAiZXJyb3IiIGV2ZW50IGlzIHJhaXNlZCB1cG9uIHJlcXVlc3QgZmFpbHVyZSBwYXNzaW5nIHRoZQorICogICAgIE5vZGUuanMgZXJyb3Igb2JqZWN0IHRvIHRoZSBsaXN0ZW5lci4KKyAqLworSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHZhciBvcHRzID0gc2VsZi5ub2RlT3B0aW9uczsKKyAgb3B0cy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIGlmICghb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKKyAgICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsgIAorICB2YXIgcmVxID0gKHNlbGYuaHR0cHMpID8KKyAgICAgIGh0dHBzLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6CisgICAgICBodHRwLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKKyAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOworICB9KTsKKyAgcmVxLndyaXRlKGRhdGEpOworICByZXEuZW5kKCk7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgSHR0cENvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAcmV0dXJucyB7SHR0cENvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIENvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICBvcHRpb25zLmhvc3QgPSBob3N0OworICBvcHRpb25zLnBvcnQgPSBwb3J0IHx8IDgwOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy5zb2NrZXRQYXRoID0gcGF0aDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGNyZWF0ZUNsaWVudAorCisKK2Z1bmN0aW9uIFRIVFRQRXhjZXB0aW9uKHJlc3BvbnNlKSB7CisgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTsKKyAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICB0aGlzLnR5cGUgPSB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5QUk9UT0NPTF9FUlJPUjsKKyAgdGhpcy5tZXNzYWdlID0gIlJlY2VpdmVkIGEgcmVzcG9uc2Ugd2l0aCBhIGJhZCBIVFRQIHN0YXR1cyBjb2RlOiAiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZTsKK30KK3V0aWwuaW5oZXJpdHMoVEhUVFBFeGNlcHRpb24sIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTk1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGxvZy5zZXRMb2dGdW5jOworZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGxvZy5zZXRMb2dMZXZlbDsKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBsb2cuZ2V0TG9nTGV2ZWw7CisKK3ZhciBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi9jb25uZWN0aW9uJyk7CitleHBvcnRzLkNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlQ2xpZW50OworZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVVRFNDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVTU0xDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9DbGllbnQ7CitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9Db25uZWN0aW9uOworCit2YXIgaHR0cENvbm5lY3Rpb24gPSByZXF1aXJlKCcuL2h0dHBfY29ubmVjdGlvbicpOworZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLkh0dHBDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwQ2xpZW50ID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENsaWVudDsKKwordmFyIHdzQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vd3NfY29ubmVjdGlvbicpOworZXhwb3J0cy5XU0Nvbm5lY3Rpb24gPSB3c0Nvbm5lY3Rpb24uV1NDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVXU0Nvbm5lY3Rpb24gPSB3c0Nvbm5lY3Rpb24uY3JlYXRlV1NDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVXU0NsaWVudCA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0NsaWVudDsKKwordmFyIHhockNvbm5lY3Rpb24gPSByZXF1aXJlKCcuL3hocl9jb25uZWN0aW9uJyk7CitleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLlhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ2xpZW50OworCit2YXIgc2VydmVyID0gcmVxdWlyZSgnLi9zZXJ2ZXInKTsKK2V4cG9ydHMuY3JlYXRlU2VydmVyID0gc2VydmVyLmNyZWF0ZVNlcnZlcjsKK2V4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyID0gc2VydmVyLmNyZWF0ZU11bHRpcGxleFNlcnZlcjsKKwordmFyIHdlYl9zZXJ2ZXIgPSByZXF1aXJlKCcuL3dlYl9zZXJ2ZXInKTsKK2V4cG9ydHMuY3JlYXRlV2ViU2VydmVyID0gd2ViX3NlcnZlci5jcmVhdGVXZWJTZXJ2ZXI7CisKK2V4cG9ydHMuSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CitleHBvcnRzLlEgPSByZXF1aXJlKCdxJyk7CisKK3ZhciBtcHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKTsKK3ZhciBtcHJvdG9jb2wgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb3RvY29sJyk7CitleHBvcnRzLk11bHRpcGxleGVyID0gbXByb3RvY29sLk11bHRpcGxleGVyOworZXhwb3J0cy5NdWx0aXBsZXhlZFByb2Nlc3NvciA9IG1wcm9jZXNzb3IuTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8qCisgKiBFeHBvcnQgdHJhbnNwb3J0IGFuZCBwcm90b2NvbCBzbyB0aGV5IGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgYQorICogY2Fzc2FuZHJhL3NlcnZlciBjb250ZXh0CisgKi8KK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTU1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCittb2R1bGUuZXhwb3J0cyA9IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKKworZnVuY3Rpb24gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307CisKK3V0aWwuaW5oZXJpdHMoSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCBFcnJvcik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDcwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKKwordmFyIEludDY0VXRpbCA9IG1vZHVsZS5leHBvcnRzID0ge307CisKK3ZhciBQT1cyXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPVzJfMzEgPSBNYXRoLnBvdygyLCAzMSk7Cit2YXIgUE9XMl8zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1cxMF8xMSA9IE1hdGgucG93KDEwLCAxMSk7CisKK0ludDY0VXRpbC50b0RlY2ltYWxTdHJpbmcgPSBmdW5jdGlvbihpNjQpIHsKKyAgdmFyIGIgPSBpNjQuYnVmZmVyOworICB2YXIgbyA9IGk2NC5vZmZzZXQ7CisgIGlmICgoIWJbb10gJiYgIShiW28gKyAxXSAmIDB4ZTApKSB8fAorICAgICAgKCF+YltvXSAmJiAhfihiW28gKyAxXSAmIDB4ZTApKSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGwgZW5vdWdoLgorICAgIHJldHVybiBpNjQudG9TdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgbmVnYXRpdmUgPSBiW29dICYgMHg4MDsKKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICB2YXIgaW5jcmVtZW50ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKDgpOworICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9ICh+YltvICsgaV0gKyAoaW5jcmVtZW50ZWQgPyAwIDogMSkpICYgMHhmZjsKKyAgICAgICAgaW5jcmVtZW50ZWQgfD0gYltvICsgaV07CisgICAgICB9CisgICAgICBiID0gYnVmZmVyOworICAgIH0KKyAgICB2YXIgaGlnaDIgPSBiW28gKyAxXSArIChiW29dIDw8IDgpOworICAgIC8vIExlc3NlciAxMSBkaWdpdHMgd2l0aCBleGNlZWRpbmcgdmFsdWVzIGJ1dCBpcyB1bmRlciA1MyBiaXRzIGNhcGFjaXR5LgorICAgIHZhciBsb3cgPSBiW28gKyA3XSArIChiW28gKyA2XSA8PCA4KSArIChiW28gKyA1XSA8PCAxNikKKyAgICAgICAgKyBiW28gKyA0XSAqIFBPVzJfMjQgIC8vIEJpdCBzaGlmdCByZW5kZXJzIDMydGggYml0IGFzIHNpZ24sIHNvIHVzZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICArIChiW28gKyAzXSArIChiW28gKyAyXSA8PCA4KSkgKiBQT1cyXzMyICsgaGlnaDIgKiA3NDk3NjcxMDY1NjsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggJSAxMF4xMQorICAgIC8vIDEydGggZGlnaXQgYW5kIGdyZWF0ZXIuCisgICAgdmFyIGhpZ2ggPSBNYXRoLmZsb29yKGxvdyAvIFBPVzEwXzExKSArIGhpZ2gyICogMjgxNDsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggLyAxMF4xMQorICAgIC8vIE1ha2UgaXQgZXhhY3RseSAxMSB3aXRoIGxlYWRpbmcgemVyb3MuCisgICAgbG93ID0gKCcwMDAwMDAwMDAwMCcgKyBTdHJpbmcobG93ICUgUE9XMTBfMTEpKS5zbGljZSgtMTEpOworICAgIHJldHVybiAobmVnYXRpdmUgPyAnLScgOiAnJykgKyBTdHJpbmcoaGlnaCkgKyBsb3c7CisgIH0KK307CisKK0ludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgdmFyIG5lZ2F0aXZlID0gdGV4dC5jaGFyQXQoMCkgPT09ICctJzsKKyAgaWYgKHRleHQubGVuZ3RoIDwgKG5lZ2F0aXZlID8gMTcgOiAxNikpIHsKKyAgICAvLyBUaGUgbWFnbml0dWRlIGlzIHNtYWxsZXIgdGhhbiAyXjUzLgorICAgIHJldHVybiBuZXcgSW50NjQoK3RleHQpOworICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID4gKG5lZ2F0aXZlID8gMjAgOiAxOSkpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVG9vIG1hbnkgZGlnaXRzIGZvciBJbnQ2NDogJyArIHRleHQpOworICB9IGVsc2UgeworICAgIC8vIE1vc3Qgc2lnbmlmaWNhbnQgKHVwIHRvIDUpIGRpZ2l0cworICAgIHZhciBoaWdoNSA9ICt0ZXh0LnNsaWNlKG5lZ2F0aXZlID8gMSA6IDAsIC0xNSk7CisgICAgdmFyIGxvdyA9ICt0ZXh0LnNsaWNlKC0xNSkgKyBoaWdoNSAqIDI3NjQ0NzIzMjA7ICAvLyBUaGUgbGl0ZXJhbCBpcyAxMF4xNSAlIDJeMzIKKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMl8zMikgKyBoaWdoNSAqIDIzMjgzMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1IC8gMl4mMzIKKyAgICBsb3cgPSBsb3cgJSBQT1cyXzMyOworICAgIGlmIChoaWdoID49IFBPVzJfMzEgJiYKKyAgICAgICAgIShuZWdhdGl2ZSAmJiBoaWdoID09IFBPVzJfMzEgJiYgbG93ID09IDApICAvLyBBbGxvdyBtaW5pbXVtIEludDY0CisgICAgICAgKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIG1hZ25pdHVkZSBpcyB0b28gbGFyZ2UgZm9yIEludDY0LicpOworICAgIH0KKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICBoaWdoID0gfmhpZ2g7CisgICAgICBpZiAobG93ID09PSAwKSB7CisgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IH5sb3cgKyAxOworICAgICAgfQorICAgICAgaGlnaCA9IDB4ODAwMDAwMDAgfCBoaWdoOworICAgIH0KKyAgICByZXR1cm4gbmV3IEludDY0KGhpZ2gsIGxvdyk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjBiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEltcG9ydGVkIGZyb20gRG91Z2xhcyBDcm9ja2ZvcmQncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbXVtIG1vZGlmaWNhdGlvbgorICogdG8gaGFuZGxlIEludDY0LgorICoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanMvYmxvYi9jOTg5NDhhZTE5NDRhMjhlMmU4ZWJjMzcxNzg5NGU1ODBhZWFhYTA1L2pzb25fcGFyc2UuanMKKyAqCisgKiBPcmlnaW5hbCBsaWNlbnNlIGhlYWRlcjoKKyAqCisgKiBqc29uX3BhcnNlLmpzCisgKiAyMDE1LTA1LTAyCisgKiBQdWJsaWMgRG9tYWluLgorICogTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorICovCisKKworLypqc2xpbnQgZm9yICovCisKKy8qcHJvcGVydHkKKyAgICBhdCwgYiwgY2FsbCwgY2hhckF0LCBmLCBmcm9tQ2hhckNvZGUsIGhhc093blByb3BlcnR5LCBtZXNzYWdlLCBuLCBuYW1lLAorICAgIHByb3RvdHlwZSwgcHVzaCwgciwgdCwgdGV4dAorKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIEludDY0VXRpbCA9IHJlcXVpcmUoJy4vaW50NjRfdXRpbCcpOworCit2YXIganNvbl9wYXJzZSA9IG1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBwYXJzZSBhIEpTT04gdGV4dCwgcHJvZHVjaW5nIGEgSmF2YVNjcmlwdAorLy8gZGF0YSBzdHJ1Y3R1cmUuIEl0IGlzIGEgc2ltcGxlLCByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuIEl0IGRvZXMgbm90IHVzZQorLy8gZXZhbCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1vZGVsIGZvciBpbXBsZW1lbnRpbmcKKy8vIGEgSlNPTiBwYXJzZXIgaW4gb3RoZXIgbGFuZ3VhZ2VzLgorCisvLyBXZSBhcmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIGluc2lkZSBvZiBhbm90aGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nCisvLyBnbG9iYWwgdmFyaWFibGVzLgorCisgICAgdmFyIGF0LCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBlc2NhcGVlID0geworICAgICAgICAgICAgJyInOiAnIicsCisgICAgICAgICAgICAnXFwnOiAnXFwnLAorICAgICAgICAgICAgJy8nOiAnLycsCisgICAgICAgICAgICBiOiAnXGInLAorICAgICAgICAgICAgZjogJ1xmJywKKyAgICAgICAgICAgIG46ICdcbicsCisgICAgICAgICAgICByOiAnXHInLAorICAgICAgICAgICAgdDogJ1x0JworICAgICAgICB9LAorICAgICAgICB0ZXh0LAorCisgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKG0pIHsKKworLy8gQ2FsbCBlcnJvciB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKG0pOworICAgICAgICB9LAorCisgICAgICAgIG5leHQgPSBmdW5jdGlvbiAoYykgeworCisvLyBJZiBhIGMgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKworICAgICAgICAgICAgaWYgKGMgJiYgYyAhPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKKyAgICAgICAgICAgIH0KKworLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzLAorLy8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgICAgIGNoID0gdGV4dC5jaGFyQXQoYXQpOworICAgICAgICAgICAgYXQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfSwKKworICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGEgbnVtYmVyIHZhbHVlLgorCisgICAgICAgICAgICB2YXIgbnVtYmVyLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICctJykgeworICAgICAgICAgICAgICAgIHN0cmluZyA9ICctJzsKKyAgICAgICAgICAgICAgICBuZXh0KCctJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQoKSAmJiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXIgPSArc3RyaW5nOworICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIkJhZCBudW1iZXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID49IEludDY0Lk1BWF9JTlQgfHwgbnVtYmVyIDw9IEludDY0Lk1JTl9JTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gcmF3IHN0cmluZyBmb3IgZnVydGhlciBwcm9jZXNzIGluIFRKU09OUHJvdG9jb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHN0cmluZyA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBzdHJpbmcgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBoZXgsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKKyAgICAgICAgICAgICAgICB1ZmZmZjsKKworLy8gV2hlbiBwYXJzaW5nIGZvciBzdHJpbmcgdmFsdWVzLCB3ZSBtdXN0IGxvb2sgZm9yICIgYW5kIFwgY2hhcmFjdGVycy4KKworICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBlc2NhcGVlW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIHN0cmluZyIpOworICAgICAgICB9LAorCisgICAgICAgIHdoaXRlID0gZnVuY3Rpb24gKCkgeworCisvLyBTa2lwIHdoaXRlc3BhY2UuCisKKyAgICAgICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgd29yZCA9IGZ1bmN0aW9uICgpIHsKKworLy8gdHJ1ZSwgZmFsc2UsIG9yIG51bGwuCisKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdyJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdhJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdlJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgbmV4dCgnbicpOworICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgJyIgKyBjaCArICInIik7CisgICAgICAgIH0sCisKKyAgICAgICAgdmFsdWUsICAvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSB2YWx1ZSBmdW5jdGlvbi4KKworICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYW4gYXJyYXkgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICdbJykgeworICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKKyAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OyAgIC8vIGVtcHR5IGFycmF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIGFycmF5Iik7CisgICAgICAgIH0sCisKKyAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBvYmplY3QgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBrZXksCisgICAgICAgICAgICAgICAgb2JqZWN0ID0ge307CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgneycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgIC8vIGVtcHR5IG9iamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CisgICAgICAgIH07CisKKyAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBKU09OIHZhbHVlLiBJdCBjb3VsZCBiZSBhbiBvYmplY3QsIGFuIGFycmF5LCBhIHN0cmluZywgYSBudW1iZXIsCisvLyBvciBhIHdvcmQuCisKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nKCk7CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScKKyAgICAgICAgICAgICAgICA/IG51bWJlcigpCisgICAgICAgICAgICAgICAgOiB3b3JkKCk7CisgICAgICAgIH0KKyAgICB9OworCisvLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZQorLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCisKKyAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgICB2YXIgcmVzdWx0OworCisgICAgICAgIHRleHQgPSBzb3VyY2U7CisgICAgICAgIGF0ID0gMDsKKyAgICAgICAgY2ggPSAnICc7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CisgICAgICAgIHdoaXRlKCk7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OworfSgpKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7Cit2YXIganNvbl9wYXJzZSA9IHJlcXVpcmUoJy4vanNvbl9wYXJzZScpOworCit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUSlNPTlByb3RvY29sOworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnMgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcworICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICovCitmdW5jdGlvbiBUSlNPTlByb3RvY29sKHRyYW5zKSB7CisgIHRoaXMudHN0YWNrID0gW107CisgIHRoaXMudHBvcyA9IFtdOworICB0aGlzLnRyYW5zID0gdHJhbnM7Cit9OworCisvKioKKyAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHNlZSB7QGxpbmsgVGhyaWZ0LlR5cGV9CisgKi8KK1RKU09OUHJvdG9jb2wuVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuQk9PTF0gPSAnInRmIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkkxNl0gPSAnImkxNiInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTMyXSA9ICciaTMyIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkRPVUJMRV0gPSAnImRibCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLk1BUF0gPSAnIm1hcCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTElTVF0gPSAnImxzdCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5SVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5SVHlwZS50ZiA9IFR5cGUuQk9PTDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTggPSBUeXBlLkJZVEU7CitUSlNPTlByb3RvY29sLlJUeXBlLmkxNiA9IFR5cGUuSTE2OworVEpTT05Qcm90b2NvbC5SVHlwZS5pMzIgPSBUeXBlLkkzMjsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTY0ID0gVHlwZS5JNjQ7CitUSlNPTlByb3RvY29sLlJUeXBlLmRibCA9IFR5cGUuRE9VQkxFOworVEpTT05Qcm90b2NvbC5SVHlwZS5yZWMgPSBUeXBlLlNUUlVDVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc3RyID0gVHlwZS5TVFJJTkc7CitUSlNPTlByb3RvY29sLlJUeXBlLm1hcCA9IFR5cGUuTUFQOworVEpTT05Qcm90b2NvbC5SVHlwZS5sc3QgPSBUeXBlLkxJU1Q7CitUSlNPTlByb3RvY29sLlJUeXBlLnNldCA9IFR5cGUuU0VUOworCisvKioKKyAqIFRoZSBUSlNPTlByb3RvY29sIHZlcnNpb24gbnVtYmVyLgorICogQHJlYWRvbmx5CisgKiBAY29uc3Qge251bWJlcn0gVmVyc2lvbgorICogQG1lbWJlcm9mIFRocmlmdC5Qcm90b2NvbAorICovCitUSlNPTlByb3RvY29sLlZlcnNpb24gPSAxOworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMudHN0YWNrLmxlbmd0aCA9PT0gMSkgeworICAgIHRoaXMudHJhbnMud3JpdGUodGhpcy50c3RhY2sucG9wKCkpOworICB9Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5WZXJzaW9uLCAnIicgKyBuYW1lICsgJyInLCBtZXNzYWdlVHlwZSwgc2VxaWRdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIHRoaXMud29iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworICB0aGlzLndvYmoucHVzaChvYmopOworCisgIHRoaXMud2J1ZiA9ICdbJyArIHRoaXMud29iai5qb2luKCcsJykgKyAnXSc7CisKKyAgLy8gd2UgYXNzdW1lIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBjb21lIHNvIHdlIHdyaXRlCisgIHRoaXMudHJhbnMud3JpdGUodGhpcy53YnVmKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgeworICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKHt9KTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKyAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOworICB2YXIgc3RyID0gJ3snOworICB2YXIgZmlyc3QgPSB0cnVlOworICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gJywnOworICAgIH0KKworICAgIHN0ciArPSBrZXkgKyAnOicgKyBzdHJ1Y3Rba2V5XTsKKyAgfQorCisgIHN0ciArPSAnfSc7CisgIHRoaXMudHN0YWNrW3BdID0gc3RyOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QgZmllbGQuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkSWQgLSBUaGUgZmllbGQncyB1bmlxdWUgaWRlbnRpZmllci4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgZmllbGRJZCArICciJywgJ2ZpZWxkVHlwZSc6IFRKU09OUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCisgIH0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIGlmICgnOicgKyB2YWx1ZSA9PT0gIjpbb2JqZWN0IE9iamVjdF0iKSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnfSc7CisgIH0gZWxzZSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyB2YWx1ZSArICd9JzsKKyAgfQorICB0aGlzLnRwb3MucG9wKCk7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IHZhbFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICAvL3NpemUgaXMgaW52YWxpZCwgd2UnbGwgc2V0IGl0IG9uIGVuZC4KKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2tleVR5cGVdLCBUSlNPTlByb3RvY29sLlR5cGVbdmFsVHlwZV0sIDBdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAlIDIgIT09IDApIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKCcnKTsKKyAgfQorCisgIHZhciBzaXplID0gKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAvIDI7CisKKyAgdGhpcy50c3RhY2tbcF1bdGhpcy50c3RhY2tbcF0ubGVuZ3RoIC0gMV0gPSBzaXplOworCisgIHZhciBtYXAgPSAnfSc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgdmFyIGsgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hcCA9ICcsJyArIG1hcDsKKyAgICB9CisKKyAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgIG1hcCA9IGsgKyAnOicgKyB2ICsgbWFwOworICB9CisgIG1hcCA9ICd7JyArIG1hcDsKKworICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCk7CisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgIHRoaXMudHN0YWNrLnNwbGljZShwICsgMSwgMSk7CisgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICB9CisKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgdGhpcy50c3RhY2sucHVzaChib29sID8gMSA6IDApOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGJ5dGUpIHsKKyAgdGhpcy50c3RhY2sucHVzaChieXRlKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLnRzdGFjay5wdXNoKGkxNik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKKyAgdGhpcy50c3RhY2sucHVzaChpMzIpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTY0ID0gZnVuY3Rpb24oaTY0KSB7CisgIGlmIChpNjQgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyhpNjQpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7CisgIH0KK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgeworICB0aGlzLnRzdGFjay5wdXNoKGR1Yik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKKyAgaWYgKGFyZyA9PT0gbnVsbCkgeworICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKKyAgfSBlbHNlIHsKKyAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgICAgICB2YXIgc3RyID0gYXJnOworICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKKyAgICAgICAgdmFyIHN0ciA9IGFyZy50b1N0cmluZygndXRmOCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZVN0cmluZyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICAgICAgfQorCisgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2g6IFwKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhczogXFwKKyAgICAgICAgICAvKiBDdXJyZW50bHkgZXNjYXBlZCBmb3J3YXJkIHNsYXNoZXMgYnJlYWsgVEpTT05Qcm90b2NvbC4KKyAgICAgICAgICAgKiBBcyBpdCBzdGFuZHMsIHdlIGNhbiBzaW1wbHkgcGFzcyBmb3J3YXJkIHNsYXNoZXMgaW50bworICAgICAgICAgICAqIG91ciBzdHJpbmdzIGFjcm9zcyB0aGUgd2lyZSB3aXRob3V0IGJlaW5nIGVzY2FwZWQuCisgICAgICAgICAgICogSSB0aGluayB0aGlzIGlzIHRoZSBwcm90b2NvbCdzIGJ1Zywgbm90IHRocmlmdC5qcworICAgICAgICAgICAqIH0gZWxzZSBpZihjaCA9PT0gJy8nKSB7ICAgLy8gYSBzaW5nbGUgZm9yd2FyZCBzbGFzaDogLworICAgICAgICAgICAqICBlc2NhcGVkU3RyaW5nICs9ICdcXC8nOyAgLy8gd3JpdGUgb3V0IGFzIFwvCisgICAgICAgICAgICogfQorICAgICAgICAgICAqLworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcYicpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NwYWNlOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxiJzsgIC8vIHdyaXRlIG91dCBhczogXGIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xmJykgeyAgICAvLyBhIHNpbmdsZSBmb3JtZmVlZDogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcZic7ICAvLyB3cml0ZSBvdXQgYXM6IFxmIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsgICAgLy8gYSBzaW5nbGUgbmV3bGluZTogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcbic7ICAvLyB3cml0ZSBvdXQgYXM6IFxuIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdccicpIHsgICAgLy8gYSBzaW5nbGUgcmV0dXJuOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxyJzsgIC8vIHdyaXRlIG91dCBhczogXHIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1x0JykgeyAgICAvLyBhIHNpbmdsZSB0YWI6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHQnOyAgLy8gd3JpdGUgb3V0IGFzOiBcdCIKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9IGNoOyAgICAgLy8gRWxzZSBpdCBuZWVkIG5vdCBiZSBlc2NhcGVkCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBlc2NhcGVkU3RyaW5nICsgJyInKTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGFyZywgJ2JpbmFyeScpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgIHsKKyAgICB2YXIgYnVmID0gYXJnOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVCaW5hcnkgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0JykgKyAnIicpOworfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgKiBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCisgKiBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sgPSBbXTsKKyAgdGhpcy5ycG9zID0gW107CisKKyAgLy9Cb3Jyb3cgdGhlIGluYm91bmQgdHJhbnNwb3J0IGJ1ZmZlciBhbmQgZW5zdXJlIGRhdGEgaXMgcHJlc2VudC9jb25zaXN0ZW50CisgIHZhciB0cmFuc0J1ZiA9IHRoaXMudHJhbnMuYm9ycm93KCk7CisgIGlmICh0cmFuc0J1Zi5yZWFkSW5kZXggPj0gdHJhbnNCdWYud3JpdGVJbmRleCkgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorICB2YXIgY3Vyc29yID0gdHJhbnNCdWYucmVhZEluZGV4OworCisgIGlmICh0cmFuc0J1Zi5idWZbY3Vyc29yXSAhPT0gMHg1QikgeyAvL1sKKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBKU09OIGlucHV0LCBubyBvcGVuaW5nIGJyYWNrZXQiKTsKKyAgfQorCisgIC8vUGFyc2UgYSBzaW5nbGUgbWVzc2FnZSAodGhlcmUgbWF5IGJlIHNldmVyYWwgaW4gdGhlIGJ1ZmZlcikKKyAgLy8gIFRPRE86IEhhbmRsZSBjaGFyYWN0ZXJzIHVzaW5nIG11bHRpcGxlIGNvZGUgdW5pdHMKKyAgY3Vyc29yKys7CisgIHZhciBvcGVuQnJhY2tldENvdW50ID0gMTsKKyAgdmFyIGluU3RyaW5nID0gZmFsc2U7CisgIGZvciAoOyBjdXJzb3IgPCB0cmFuc0J1Zi53cml0ZUluZGV4OyBjdXJzb3IrKykgeworICAgIHZhciBjaHIgPSB0cmFuc0J1Zi5idWZbY3Vyc29yXTsKKyAgICAvL3dlIHVzZSBoZXhhIGNoYXJjb2RlIGhlcmUgYmVjYXVzZSBkYXRhW2ldIHJldHVybnMgYW4gaW50IGFuZCBub3QgYSBjaGFyCisgICAgaWYgKGluU3RyaW5nKSB7CisgICAgICBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUMpIHsgLy9cCisgICAgICAgIC8vZXNjYXBlZCBjaGFyYWN0ZXIsIHNraXAKKyAgICAgICAgY3Vyc29yICs9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaHIgPT09IDB4NUIpIHsgLy9bCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgKz0gMTsKKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDVEKSB7IC8vXQorICAgICAgICBvcGVuQnJhY2tldENvdW50IC09IDE7CisgICAgICAgIGlmIChvcGVuQnJhY2tldENvdW50ID09PSAwKSB7CisgICAgICAgICAgLy9lbmQgb2YganNvbiBtZXNzYWdlIGRldGVjdGVkCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG9wZW5CcmFja2V0Q291bnQgIT09IDApIHsKKyAgICAvLyBNaXNzaW5nIGNsb3NpbmcgYnJhY2tldC4gQ2FuIGJlIGJ1ZmZlciB1bmRlcnJ1bi4KKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KKworICAvL1JlY29uc3RpdHV0ZSB0aGUgSlNPTiBvYmplY3QgYW5kIGNvbnVtZSB0aGUgbmVjZXNzYXJ5IGJ5dGVzCisgIHRoaXMucm9iaiA9IGpzb25fcGFyc2UodHJhbnNCdWYuYnVmLnNsaWNlKHRyYW5zQnVmLnJlYWRJbmRleCwgY3Vyc29yKzEpLnRvU3RyaW5nKCkpOworICB0aGlzLnRyYW5zLmNvbnN1bWUoY3Vyc29yICsgMSAtIHRyYW5zQnVmLnJlYWRJbmRleCk7CisKKyAgLy9WZXJpZnkgdGhlIHByb3RvY29sIHZlcnNpb24KKyAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgaWYgKHZlcnNpb24gIT0gVEpTT05Qcm90b2NvbC5WZXJzaW9uKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb24pOworICB9CisKKyAgLy9PYmplY3RpZnkgdGhlIHRocmlmdCBtZXNzYWdlIHtuYW1lL3R5cGUvc2VxdWVuY2UtbnVtYmVyfSBmb3IgcmV0dXJuCisgIC8vIGFuZCB0aGVuIHNhdmUgdGhlIEpTT04gb2JqZWN0IGluIHJzdGFjaworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSk7CisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKyAgci5mbmFtZSA9ICcnOworCisgIC8vaW5jYXNlIHRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RydWN0cworICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgIH0KKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sucG9wKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBmdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciByID0ge307CisKKyAgdmFyIGZpZCA9IC0xOworICB2YXIgZnR5cGUgPSBUeXBlLlNUT1A7CisKKyAgLy9nZXQgYSBmaWVsZElkCisgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgIGlmIChmID09PSBudWxsKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmaWQgPSBwYXJzZUludChmLCAxMCk7CisgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKworICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KKyAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmlkICE9IC0xKSB7CisgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKKyAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKKyAgICAgIGlmIChUSlNPTlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbaV07CisgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgIH0KKyAgfQorCisgIHIuZm5hbWUgPSAnJzsKKyAgci5mdHlwZSA9IGZ0eXBlOworICByLmZpZCA9IGZpZDsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7CisKKyAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCisgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKKyAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgfQorfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gdnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbWFwID0gdGhpcy5yc3RhY2sucG9wKCk7CisgIHZhciBmaXJzdCA9IG1hcC5zaGlmdCgpOworICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2gobWFwKTsKKyAgICBtYXAgPSBmaXJzdDsKKyAgICBmaXJzdCA9IG1hcC5zaGlmdCgpOworICB9CisKKyAgdmFyIHIgPSB7fTsKKyAgci5rdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbZmlyc3RdOworICByLnZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMucmVhZEZpZWxkRW5kKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisKKyAgdmFyIHIgPSB7fTsKKyAgci5ldHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgIHN0LnBvcCgpOworICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICB9Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKSA9PSAnMSc7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbihmKSB7CisgIHJldHVybiArdGhpcy5yZWFkVmFsdWUoKTsKK30KKworLyoqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFZhbHVlID0gZnVuY3Rpb24oZikgeworICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CisgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICB9CisKKyAgdmFyIHIgPSB7fTsKKworICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgaWYgKGYubGVuZ3RoID09PSAwKSB7CisgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSB7CisgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOworICAgIH0KKyAgfSBlbHNlIGlmICghKGYgaW5zdGFuY2VvZiBJbnQ2NCkgJiYgZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgIGZvciAodmFyIGkgaW4gZikgeworICAgICAgaWYgKGkgPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB0aGlzLnJzdGFjay5wdXNoKGZbaV0pOworICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgIHIudmFsdWUgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHIudmFsdWUgPSBmOworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9CisKKyAgcmV0dXJuIHIudmFsdWU7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBuID0gdGhpcy5yZWFkVmFsdWUoKQorICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7CisgICAgLy8gQXNzdW1pbmcgbm8gb25lIGlzIHNlbmRpbmcgaW4gMS4xMTExMWUrMzMgZm9ybWF0CisgICAgcmV0dXJuIEludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyhuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEludDY0KG4pOworICB9Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBCdWZmZXIodGhpcy5yZWFkVmFsdWUoKSwgJ2Jhc2U2NCcpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtUaHJpZnQuVHJhbnNwb3J0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKKy8qKgorICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2U4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBkaXNhYmxlZCA9IGZ1bmN0aW9uICgpIHt9OwordmFyIGxvZ0Z1bmMgPSBjb25zb2xlLmxvZzsKK3ZhciBsb2dMZXZlbCA9ICdlcnJvcic7IC8vIGRlZmF1bHQgbGV2ZWwKKworZnVuY3Rpb24gZmFjdG9yeShsZXZlbCkgeworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIC8vIGJldHRlciB1c2Ugc3ByZWFkIHN5bnRheCwgYnV0IGR1ZSB0byBjb21wYXRpYmlsaXR5LAorICAgIC8vIHVzZSBsZWdhY3kgbWV0aG9kIGhlcmUuCisgICAgdmFyIGFyZ3MgPSBbJ3RocmlmdDogWycgKyBsZXZlbCArICddICddLmNvbmNhdChBcnJheS5mcm9tKGFyZ3VtZW50cykpOworICAgIHJldHVybiBsb2dGdW5jKHV0aWwuZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3MpKTsKKyAgfTsKK30KKwordmFyIHRyYWNlID0gZGlzYWJsZWQ7Cit2YXIgZGVidWcgPSBkaXNhYmxlZDsKK3ZhciBlcnJvciA9IGRpc2FibGVkOwordmFyIHdhcm5pbmcgPSBkaXNhYmxlZDsKK3ZhciBpbmZvID0gZGlzYWJsZWQ7CisKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGZ1bmN0aW9uIChmdW5jKSB7CisgIGxvZ0Z1bmMgPSBmdW5jOworfTsKKwordmFyIHNldExvZ0xldmVsID0gZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkgeworICB0cmFjZSA9IGRlYnVnID0gZXJyb3IgPSB3YXJuaW5nID0gaW5mbyA9IGRpc2FibGVkOworICBsb2dMZXZlbCA9IGxldmVsOworICBzd2l0Y2ggKGxvZ0xldmVsKSB7CisgIGNhc2UgJ3RyYWNlJzoKKyAgICB0cmFjZSA9IGZhY3RvcnkoJ1RSQUNFJyk7CisgIGNhc2UgJ2RlYnVnJzoKKyAgICBkZWJ1ZyA9IGZhY3RvcnkoJ0RFQlVHJyk7CisgIGNhc2UgJ2Vycm9yJzoKKyAgICBlcnJvciA9IGZhY3RvcnkoJ0VSUk9SJyk7CisgIGNhc2UgJ3dhcm5pbmcnOgorICAgIHdhcm5pbmcgPSBmYWN0b3J5KCdXQVJOJyk7CisgIGNhc2UgJ2luZm8nOgorICAgIGluZm8gPSBmYWN0b3J5KCdJTkZPJyk7CisgIH0KK307CisKKy8vIHNldCBkZWZhdWx0CitzZXRMb2dMZXZlbChsb2dMZXZlbCk7CisKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBsb2dMZXZlbDsKK307CisKK2V4cG9ydHMudHJhY2UgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0cmFjZS5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGRlYnVnLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmVycm9yID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZXJyb3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMud2FybmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHdhcm5pbmcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuaW5mbyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGluZm8uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I2MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKworZXhwb3J0cy5NdWx0aXBsZXhlZFByb2Nlc3NvciA9IE11bHRpcGxleGVkUHJvY2Vzc29yOworCitmdW5jdGlvbiBNdWx0aXBsZXhlZFByb2Nlc3NvcihzdHJlYW0sIG9wdGlvbnMpIHsKKyAgdGhpcy5zZXJ2aWNlcyA9IHt9OworfTsKKworTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyUHJvY2Vzc29yID0gZnVuY3Rpb24obmFtZSwgaGFuZGxlcikgeworICB0aGlzLnNlcnZpY2VzW25hbWVdID0gaGFuZGxlcjsKK307CisKK011bHRpcGxleGVkUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wLCBvdXQpIHsKKyAgdmFyIGJlZ2luID0gaW5wLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICBpZiAoYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgJiYgYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbignVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZScpOworICB9CisKKyAgdmFyIHAgPSBiZWdpbi5mbmFtZS5zcGxpdCgnOicpOworICB2YXIgc25hbWUgPSBwWzBdOworICB2YXIgZm5hbWUgPSBwWzFdOworCisgIGlmICghIChzbmFtZSBpbiB0aGlzLnNlcnZpY2VzKSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbignVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmtub3duIHNlcnZpY2U6ICcgKyBzbmFtZSk7CisgIH0KKworICAvL2NvbnN0cnVjdCBhIHByb3h5IG9iamVjdCB3aGljaCBzdHVicyB0aGUgcmVhZE1lc3NhZ2VCZWdpbgorICAvL2ZvciB0aGUgc2VydmljZQorICB2YXIgaW5wUHJveHkgPSB7fTsKKworICBmb3IgKHZhciBhdHRyIGluIGlucCkgeworICAgIGlucFByb3h5W2F0dHJdID0gaW5wW2F0dHJdOworICB9CisKKyAgaW5wUHJveHkucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB7CisgICAgICBmbmFtZTogZm5hbWUsCisgICAgICBtdHlwZTogYmVnaW4ubXR5cGUsCisgICAgICByc2VxaWQ6IGJlZ2luLnJzZXFpZAorICAgIH07CisgIH07CisKKyAgdGhpcy5zZXJ2aWNlc1tzbmFtZV0ucHJvY2VzcyhpbnBQcm94eSwgb3V0KTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3OGFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCitleHBvcnRzLk11bHRpcGxleGVyID0gTXVsdGlwbGV4ZXI7CisKK2Z1bmN0aW9uIFdyYXBwZXIoc2VydmljZU5hbWUsIHByb3RvY29sLCBjb25uZWN0aW9uKSB7CisKKyAgZnVuY3Rpb24gTXVsdGlwbGV4UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgICAgcHJvdG9jb2wuY2FsbCh0aGlzLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9OworCisgIHV0aWwuaW5oZXJpdHMoTXVsdGlwbGV4UHJvdG9jb2wsIHByb3RvY29sKTsKKworICBNdWx0aXBsZXhQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICAgIGlmICh0eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIHx8IHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgY29ubmVjdGlvbi5zZXFJZDJTZXJ2aWNlW3NlcWlkXSA9IHNlcnZpY2VOYW1lOworICAgICAgTXVsdGlwbGV4UHJvdG9jb2wuc3VwZXJfLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgKyAiOiIgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0KKyAgfTsKKworICByZXR1cm4gTXVsdGlwbGV4UHJvdG9jb2w7Cit9OworCitmdW5jdGlvbiBNdWx0aXBsZXhlcigpIHsKKyAgdGhpcy5zZXFpZCA9IDA7Cit9OworCitNdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIHZhciB3cml0ZUNiID0gZnVuY3Rpb24oYnVmLCBzZXFpZCkgeworICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmLHNlcWlkKTsKKyAgfTsKKyAgdmFyIHRyYW5zcG9ydCA9IG5ldyBjb25uZWN0aW9uLnRyYW5zcG9ydCh1bmRlZmluZWQsIHdyaXRlQ2IpOworICB2YXIgcHJvdG9jb2xXcmFwcGVyID0gbmV3IFdyYXBwZXIoc2VydmljZU5hbWUsIGNvbm5lY3Rpb24ucHJvdG9jb2wsIGNvbm5lY3Rpb24pOworICB2YXIgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQodHJhbnNwb3J0LCBwcm90b2NvbFdyYXBwZXIpOworICB2YXIgc2VsZiA9IHRoaXM7CisgIGNsaWVudC5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsKKyAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CisgIH07CisKKyAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLmNsaWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICBjb25uZWN0aW9uLmNsaWVudCA9IHt9OworICB9CisgIGNvbm5lY3Rpb24uY2xpZW50W3NlcnZpY2VOYW1lXSA9IGNsaWVudDsKKworICByZXR1cm4gY2xpZW50OworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlLmV4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK21vZHVsZS5leHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKK21vZHVsZS5leHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKK3ZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKK3ZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCisvKioKKyAqIENyZWF0ZSBhIFRocmlmdCBzZXJ2ZXIgd2hpY2ggY2FuIHNlcnZlIG9uZSBvciBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqIEBwYXJhbSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBBIG5vcm1hbCBvciBtdWx0aXBsZXhlZFByb2Nlc3NvciAobXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHByZWNvbnN0cnVjdGVkIHdpdGggdGhlIGRlc2lyZWQgaGFuZGxlcikuCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25hbCBhZGRpdGlvbmFsIHNlcnZlciBjb25maWd1cmF0aW9uLgorICogQHJldHVybnMge29iamVjdH0gLSBUaGUgQXBhY2hlIFRocmlmdCBNdWx0aXBsZXggU2VydmVyLgorICovCitleHBvcnRzLmNyZWF0ZU11bHRpcGxleFNlcnZlciA9IGZ1bmN0aW9uKHByb2Nlc3Nvciwgb3B0aW9ucykgeworICB2YXIgdHJhbnNwb3J0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc3BvcnQpID8gb3B0aW9ucy50cmFuc3BvcnQgOiBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbCA9IChvcHRpb25zICYmIG9wdGlvbnMucHJvdG9jb2wpID8gb3B0aW9ucy5wcm90b2NvbCA6IFRCaW5hcnlQcm90b2NvbDsKKworICBmdW5jdGlvbiBzZXJ2ZXJJbXBsKHN0cmVhbSkgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgIH0pOworICAgIHN0cmVhbS5vbignZGF0YScsIHRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRXaXRoRGF0YSkgeworICAgICAgdmFyIGlucHV0ID0gbmV3IHByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgcHJvdG9jb2wobmV3IHRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgICBzdHJlYW0uZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZG8geworICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09ICJJbnZhbGlkIHR5cGU6IHVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAvL05vIG1vcmUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgLy9UaGlzIHRyYXAgaXMgYSBiaXQgaGFja2lzaAorICAgICAgICAgIC8vVGhlIG5leHQgc3RlcCB0byBpbXByb3ZlIHRoZSBub2RlIGJlaGF2aW9yIGhlcmUgaXMgdG8gaGF2ZQorICAgICAgICAgIC8vICB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHByb2Nlc3MgbWV0aG9kIHRocm93IGEgbW9yZSBleHBsaWNpdAorICAgICAgICAgIC8vICBlcnJvciB3aGVuIHRoZSBuZXR3b3JrIGJ1ZmZlciBpcyBlbXB0eSAocmVnYXJkbGVzIG9mIHRoZQorICAgICAgICAgIC8vICBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sgaW4gdXNlKSBhbmQgcmVwbGFjZSB0aGlzIGhldXJpc3RpYy4KKyAgICAgICAgICAvLyAgQWxzbyB0cmFuc3BvcnRzIHNob3VsZCBwcm9iYWJseSBub3QgZm9yY2UgdXBwZXIgbGF5ZXJzIHRvCisgICAgICAgICAgLy8gIG1hbmFnZSB0aGVpciBidWZmZXIgcG9zaXRpb25zIChpLmUuIHJvbGxiYWNrUG9zaXRpb24oKSBhbmQKKyAgICAgICAgICAvLyAgY29tbWl0UG9zaXRpb24oKSBzaG91bGQgYmUgZWxpbWluYXRlZCBpbiBsaWV1IG9mIGEgdHJhbnNwb3J0CisgICAgICAgICAgLy8gIGVuY2Fwc3VsYXRlZCBidWZmZXIgbWFuYWdlbWVudCBzdHJhdGVneS4pCisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVW5leHBlY3RlZCBlcnJvcgorICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgICAgICAgIHN0cmVhbS5lbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pKTsKKworICAgIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7CisgICAgICBzdHJlYW0uZW5kKCk7CisgICAgfSk7CisgIH0KKworICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRscykgeworICAgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucy50bHMpICYmICEoJ3NlY3VyZU9wdGlvbnMnIGluIG9wdGlvbnMudGxzKSkgeworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgICAgfQorICAgIHJldHVybiB0bHMuY3JlYXRlU2VydmVyKG9wdGlvbnMudGxzLCBzZXJ2ZXJJbXBsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV0LmNyZWF0ZVNlcnZlcihzZXJ2ZXJJbXBsKTsKKyAgfQorfTsKKworLyoqCisgKiBDcmVhdGUgYSBzaW5nbGUgc2VydmljZSBBcGFjaGUgVGhyaWZ0IHNlcnZlci4KKyAqIEBwYXJhbSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBBIHNlcnZpY2UgY2xhc3Mgb3IgcHJvY2Vzc29yIGZ1bmN0aW9uLgorICogQHBhcmFtIHtTZXJ2ZXJPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgTXVsdGlwbGV4IFNlcnZlci4KKyAqLworZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBmdW5jdGlvbihwcm9jZXNzb3IsIGhhbmRsZXIsIG9wdGlvbnMpIHsKKyAgaWYgKHByb2Nlc3Nvci5Qcm9jZXNzb3IpIHsKKyAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IuUHJvY2Vzc29yOworICB9CisgIHJldHVybiBleHBvcnRzLmNyZWF0ZU11bHRpcGxleFNlcnZlcihuZXcgcHJvY2Vzc29yKGhhbmRsZXIpLCBvcHRpb25zKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIyODk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBUeXBlID0gZXhwb3J0cy5UeXBlID0geworICBTVE9QOiAwLAorICBWT0lEOiAxLAorICBCT09MOiAyLAorICBCWVRFOiAzLAorICBJMDg6IDMsCisgIERPVUJMRTogNCwKKyAgSTE2OiA2LAorICBJMzI6IDgsCisgIEk2NDogMTAsCisgIFNUUklORzogMTEsCisgIFVURjc6IDExLAorICBTVFJVQ1Q6IDEyLAorICBNQVA6IDEzLAorICBTRVQ6IDE0LAorICBMSVNUOiAxNSwKKyAgVVRGODogMTYsCisgIFVURjE2OiAxNworfTsKKworZXhwb3J0cy5NZXNzYWdlVHlwZSA9IHsKKyAgQ0FMTDogMSwKKyAgUkVQTFk6IDIsCisgIEVYQ0VQVElPTjogMywKKyAgT05FV0FZOiA0Cit9OworCitleHBvcnRzLlRFeGNlcHRpb24gPSBURXhjZXB0aW9uOworCitmdW5jdGlvbiBURXhjZXB0aW9uKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307Cit1dGlsLmluaGVyaXRzKFRFeGNlcHRpb24sIEVycm9yKTsKKwordmFyIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7CisgIFVOS05PV046IDAsCisgIFVOS05PV05fTUVUSE9EOiAxLAorICBJTlZBTElEX01FU1NBR0VfVFlQRTogMiwKKyAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgIEJBRF9TRVFVRU5DRV9JRDogNCwKKyAgTUlTU0lOR19SRVNVTFQ6IDUsCisgIElOVEVSTkFMX0VSUk9SOiA2LAorICBQUk9UT0NPTF9FUlJPUjogNywKKyAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgIElOVkFMSURfUFJPVE9DT0w6IDksCisgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiAxMAorfTsKKworZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBUQXBwbGljYXRpb25FeGNlcHRpb247CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIFRFeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMudHlwZSA9IHR5cGUgfHwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUQXBwbGljYXRpb25FeGNlcHRpb24sIFRFeGNlcHRpb24pOworCitUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeworICB2YXIgZnR5cGU7CisgIHZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgIHdoaWxlKDEpeworICAgICAgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlmKHJldC5mdHlwZSA9PSBUeXBlLlNUT1ApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIHN3aXRjaChyZXQuZmlkKXsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5TVFJJTkcgKXsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5JMzIgKXsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHJldDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldCAgID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgfQorICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7Cit9OworCitUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KXsKKyAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgIGlmICh0aGlzLm1lc3NhZ2UpIHsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSk7CisgICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5tZXNzYWdlKTsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgIH0KKworICBpZiAodGhpcy5jb2RlKSB7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVHlwZS5JMzIsIDIpOworICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOworICB9CisKKyAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpOworfTsKKwordmFyIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgIFVOS05PV046IDAsCisgIElOVkFMSURfREFUQTogMSwKKyAgTkVHQVRJVkVfU0laRTogMiwKKyAgU0laRV9MSU1JVDogMywKKyAgQkFEX1ZFUlNJT046IDQsCisgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgREVQVEhfTElNSVQ6IDYKK307CisKKworZXhwb3J0cy5UUHJvdG9jb2xFeGNlcHRpb24gPSBUUHJvdG9jb2xFeGNlcHRpb247CisKK2Z1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMudHlwZSA9IHR5cGU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUUHJvdG9jb2xFeGNlcHRpb24sIEVycm9yKTsKKworZXhwb3J0cy5vYmplY3RMZW5ndGggPSBmdW5jdGlvbihvYmopIHsKKyAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoOworfTsKKworZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKSB7CisgIHV0aWwuaW5oZXJpdHMoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IpOworfTsKKwordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpeworCisgIGlmICghb2JqKSB7cmV0dXJuIG9iajsgfQorCisgIHZhciB0eXBlOworCisgIGlmICh0eXBlcy5zaGlmdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgdHlwZSA9IHR5cGVzOworICB9CisgIGVsc2UgeworICAgIHR5cGUgPSB0eXBlc1swXTsKKyAgfQorICB2YXIgVHlwZSA9IHR5cGU7CisKKyAgdmFyIHJlc3VsdCA9IHt9LCB2YWw7CisgIGZvcih2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZihvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworbW9kdWxlLmV4cG9ydHMuY29weU1hcCA9IGNvcHlNYXA7Cittb2R1bGUuZXhwb3J0cy5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzZjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgdXJsID0gcmVxdWlyZSgidXJsIik7Cit2YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK3ZhciBmcyA9IHJlcXVpcmUoImZzIik7Cit2YXIgY3J5cHRvID0gcmVxdWlyZSgiY3J5cHRvIik7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKwordmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKS5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCisvLyBXU0ZyYW1lIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiogQXBhY2hlIFRocmlmdCBSUEMgV2ViIFNvY2tldCBUcmFuc3BvcnQKKyAqICBGcmFtZSBsYXlvdXQgY29uZm9ybWluZyB0byBSRkMgNjQ1NSBjaXJjYSAxMi8yMDExCisgKgorICogVGhlb3JldGljYWwgZnJhbWUgc2l6ZSBsaW1pdCBpcyA0R0IqNEdCLCBob3dldmVyIHRoZSBOb2RlIEJ1ZmZlcgorICogbGltaXQgaXMgMUdCIGFzIG9mIHYwLjEwLiBUaGUgZnJhbWUgbGVuZ3RoIGVuY29kaW5nIGlzIGFsc28KKyAqIGNvbmZpZ3VyZWQgZm9yIGEgbWF4IG9mIDRHQiBwcmVzZW50bHkgYW5kIG5lZWRzIHRvIGJlIGFkanVzdGVkCisgKiBpZiBOb2RlL0Jyb3dzZXJzIGJlY29tZSBjYXBhYmlsZSBvZiA+IDRHQiBmcmFtZXMuCisgKgorICogIC0gRklOIGlzIDEgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKKyAqICAtIFJTVjEvMi8zIGFyZSBhbHdheXMgMAorICogIC0gT3Bjb2RlIGlzIDEoVEVYVCkgZm9yIFRKU09OUHJvdG9jb2wgYW5kIDIoQklOKSBmb3IgVEJpbmFyeVByb3RvY29sCisgKiAgLSBNYXNrIFByZXNlbnQgYml0IGlzIDEgc2VuZGluZyB0by1zZXJ2ZXIgYW5kIDAgc2VuZGluZyB0by1jbGllbnQKKyAqICAtIFBheWxvYWQgTGVuOgorICogICAgICAgICsgSWYgPCAxMjY6IHRoZW4gcmVwcmVzZW50ZWQgZGlyZWN0bHkKKyAqICAgICAgICArIElmID49MTI2OiBidXQgd2l0aGluIHJhbmdlIG9mIGFuIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICB0aGVuIFBheWxvYWQgTGVuIGlzIDEyNiBhbmQgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgc3RvcmUKKyAqICAgICAgICAgICAgIHRoZSBsZW5ndGgKKyAqICAgICAgICArIEVsc2U6IFBheWxvYWQgTGVuIGlzIDEyNyBhbmQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzIHN0b3JlIHRoZQorICogICAgICAgICAgICAgbGVuZ3RoIGFzIGFuIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyCisgKiAgLSBNYXNraW5nIGtleSBpcyBhIDMyIGJpdCBrZXkgb25seSBwcmVzZW50IHdoZW4gc2VuZGluZyB0byB0aGUgc2VydmVyCisgKiAgLSBQYXlsb2FkIGZvbGxvd3MgdGhlIG1hc2tpbmcga2V5IG9yIGxlbmd0aAorICoKKyAqICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICArLSstKy0rLSstLS0tLS0tKy0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfEZ8UnxSfFJ8IG9wY29kZXxNfCBQYXlsb2FkIGxlbiB8ICAgIEV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoICAgIHwKKyAqICAgIHxJfFN8U3xTfCAgKDQpICB8QXwgICAgICg3KSAgICAgfCAgICAgICAgICAgICAoMTYvNjQpICAgICAgICAgICB8CisgKiAgICB8TnxWfFZ8VnwgICAgICAgfFN8ICAgICAgICAgICAgIHwgICAoaWYgcGF5bG9hZCBsZW49PTEyNi8xMjcpICAgfAorICogICAgfCB8MXwyfDN8ICAgICAgIHxLfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0tLS0tLS0rLSstLS0tLS0tLS0tLS0tKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICB8ICAgICBFeHRlbmRlZCBwYXlsb2FkIGxlbmd0aCBjb250aW51ZWQsIGlmIHBheWxvYWQgbGVuID09IDEyNyAgfAorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1hc2tpbmcta2V5LCBpZiBNQVNLIHNldCB0byAxICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCBNYXNraW5nLWtleSAoY29udGludWVkKSAgICAgICB8ICAgICAgICAgIFBheWxvYWQgRGF0YSAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICA6ICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZCBEYXRhIGNvbnRpbnVlZCAuLi4gICAgICAgICAgICAgICAgOgorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkIERhdGEgY29udGludWVkIC4uLiAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCit2YXIgd3NGcmFtZSA9IHsKKyAgLyoqIEVuY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBUaGUgcmF3IGRhdGEgdG8gZW5jb2RlCisgICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gVGhlIG1hc2sgdG8gYXBwbHkgd2hlbiBzZW5kaW5nIHRvIHNlcnZlciwgbnVsbCBmb3Igbm8gbWFzaworICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJpbkVuY29kaW5nIC0gVHJ1ZSBmb3IgYmluYXJ5IGVuY29kaW5nLCBmYWxzZSBmb3IgdGV4dCBlbmNvZGluZworICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSBXZWJTb2NrZXQgZnJhbWUsIHJlYWR5IHRvIHNlbmQKKyAgICovCisgIGVuY29kZTogZnVuY3Rpb24oZGF0YSwgbWFzaywgYmluRW5jb2RpbmcpIHsKKyAgICAgIHZhciBmcmFtZSA9IG5ldyBCdWZmZXIod3NGcmFtZS5mcmFtZVNpemVGcm9tRGF0YShkYXRhLCBtYXNrKSk7CisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgZnJhbWVbMF0gPSB3c0ZyYW1lLmZpbi5GSU4gKworICAgICAgICAgIChiaW5FbmNvZGluZyA/IHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA6IHdzRnJhbWUuZnJhbWVPcENvZGVzLlRFWFQpOworICAgICAgLy9CeXRlIDEgb3IgMS0zIG9yIDEtOSAtIE1BU0sgRkxBRyAmIFNJWkUKKyAgICAgIHZhciBwYXlsb2FkT2Zmc2V0ID0gMjsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDB4N0UpIHsKKyAgICAgICAgZnJhbWVbMV0gPSBkYXRhLmxlbmd0aCArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOworICAgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgICBmcmFtZVsxXSA9IDB4N0UgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MTZCRShkYXRhLmxlbmd0aCwgMiwgdHJ1ZSk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWVbMV0gPSAweDdGICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoMCwgMiwgdHJ1ZSk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDYsIHRydWUpOworICAgICAgICBwYXlsb2FkT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIG1hc2suY29weShmcmFtZSwgcGF5bG9hZE9mZnNldCwgMCwgNCk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgKz0gNDsKKyAgICAgIH0KKyAgICAgIC8vUGF5bG9hZAorICAgICAgZGF0YS5jb3B5KGZyYW1lLCBwYXlsb2FkT2Zmc2V0KTsKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKGZyYW1lLnNsaWNlKHBheWxvYWRPZmZzZXQpLCBmcmFtZS5zbGljZShwYXlsb2FkT2Zmc2V0LTQscGF5bG9hZE9mZnNldCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZyYW1lOworICB9LAorCisgIC8qKgorICAgKiBAY2xhc3MKKyAgICogQG5hbWUgV1NEZWNvZGVSZXN1bHQKKyAgICogQHByb3BlcnR5IHtCdWZmZXJ9IGRhdGEgLSBUaGUgZGVjb2RlZCBkYXRhIGZvciB0aGUgZmlyc3QgQVRSUEMgbWVzc2FnZQorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbWFzayAtIFRoZSBmcmFtZSBtYXNrCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGlmIGJpbmFyeSAoVEJpbmFyeVByb3RvY29sKSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHRleHQgKFRKU09OUHJvdG9jb2wpCisgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBuZXh0RnJhbWUgLSBNdWx0aXBsZSBBVFJQQyBtZXNzYWdlcyBtYXkgYmUgc2VudCBpbiBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgV2ViU29ja2V0IGZyYW1lLCB0aGlzIEJ1ZmZlciBjb250YWlucworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGJ5dGVzIHJlbWFpbmluZyB0byBiZSBkZWNvZGVkCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gRklOIC0gVHJ1ZSBpcyB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQorICAgKi8KKworICAgLyoqIERlY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGZyYW1lIC0gVGhlIHJhdyBpbmJvdW5kIGZyYW1lLCBpZiB0aGlzIGlzIGEgY29udGludWF0aW9uCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGl0IG11c3QgaGF2ZSBhIG1hc2sgcHJvcGVydHkgd2l0aCB0aGUgbWFzay4KKyAgICogQHJldHVybnMge1dTRGVjb2RlUmVzdWx0fSAtIFRoZSBkZWNvZGVkIHBheWxvYWQKKyAgICoKKyAgICogQHNlZSB7QGxpbmsgV1NEZWNvZGVSZXN1bHR9CisgICAqLworICBkZWNvZGU6IGZ1bmN0aW9uKGZyYW1lKSB7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBkYXRhOiBudWxsLAorICAgICAgICBtYXNrOiBudWxsLAorICAgICAgICBiaW5FbmNvZGluZzogZmFsc2UsCisgICAgICAgIG5leHRGcmFtZTogbnVsbCwKKyAgICAgICAgRklOOiB0cnVlCisgICAgICB9OworCisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgaWYgKHdzRnJhbWUuZmluLkZJTiAhPSAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZpbi5GSU4pKSB7CisgICAgICAgIHJlc3VsdC5GSU4gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5iaW5FbmNvZGluZyA9ICh3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5CSU4gPT0gKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuQklOKSk7CisgICAgICAvL0J5dGUgMSBvciAxLTMgb3IgMS05IC0gU0laRQorICAgICAgdmFyIGxlbkJ5dGUgPSAoZnJhbWVbMV0gJiAweDAwMDAwMDdGKTsKKyAgICAgIHZhciBsZW4gPSBsZW5CeXRlOworICAgICAgdmFyIGRhdGFPZmZzZXQgPSAyOworICAgICAgaWYgKGxlbkJ5dGUgPT0gMHg3RSkgeworICAgICAgICBsZW4gPSBmcmFtZS5yZWFkVUludDE2QkUoMik7CisgICAgICAgIGRhdGFPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIGlmIChsZW5CeXRlID09IDB4N0YpIHsKKyAgICAgICAgbGVuID0gZnJhbWUucmVhZFVJbnQzMkJFKDYpOworICAgICAgICBkYXRhT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmICh3c0ZyYW1lLm1hc2suVE9fU0VSVkVSID09IChmcmFtZVsxXSAmIHdzRnJhbWUubWFzay5UT19TRVJWRVIpKSB7CisgICAgICAgIHJlc3VsdC5tYXNrID0gbmV3IEJ1ZmZlcig0KTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubWFzaywgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCArIDQpOworICAgICAgICBkYXRhT2Zmc2V0ICs9IDQ7CisgICAgICB9CisgICAgICAvL1BheWxvYWQKKyAgICAgIHJlc3VsdC5kYXRhID0gbmV3IEJ1ZmZlcihsZW4pOworICAgICAgZnJhbWUuY29weShyZXN1bHQuZGF0YSwgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCtsZW4pOworICAgICAgaWYgKHJlc3VsdC5tYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKHJlc3VsdC5kYXRhLCByZXN1bHQubWFzayk7CisgICAgICB9CisgICAgICAvL05leHQgRnJhbWUKKyAgICAgIGlmIChmcmFtZS5sZW5ndGggPiBkYXRhT2Zmc2V0K2xlbikgeworICAgICAgICByZXN1bHQubmV4dEZyYW1lID0gbmV3IEJ1ZmZlcihmcmFtZS5sZW5ndGggLSAoZGF0YU9mZnNldCtsZW4pKTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubmV4dEZyYW1lLCAwLCBkYXRhT2Zmc2V0K2xlbiwgZnJhbWUubGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIC8vRG9uJ3QgZm9yd2FyZCBjb250cm9sIGZyYW1lcworICAgICAgaWYgKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuRklOQ1RSTCkgeworICAgICAgICByZXN1bHQuZGF0YSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgLyoqIE1hc2tzL1VubWFza3MgZGF0YQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGRhdGEgdG8gbWFzay91bm1hc2sgaW4gcGxhY2UKKyAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSB0aGUgbWFzaworICAgKi8KKyAgYXBwbHlNYXNrOiBmdW5jdGlvbihkYXRhLCBtYXNrKXsKKyAgICAvL1RPRE86IGxvb2sgaW50byB4b3Jpbmcgd29yZHMgYXQgYSB0aW1lCisgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKKyAgICB2YXIgbWFza0xlbiA9IG1hc2subGVuZ3RoOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSsrKSB7CisgICAgICBkYXRhW2ldID0gZGF0YVtpXSBeIG1hc2tbaSVtYXNrTGVuXTsKKyAgICB9CisgIH0sCisKKyAgLyoqIENvbXB1dGVzIGZyYW1lIHNpemUgb24gdGhlIHdpcmUgZnJvbSBkYXRhIHRvIGJlIHNlbnQKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBkYXRhLmxlbmd0aCBpcyB0aGUgYXNzdW1lZCBwYXlsb2FkIHNpemUKKyAgICogQHBhcmFtIHtCb29sZWFufSBtYXNrIC0gdHJ1ZSBpZiBhIG1hc2sgd2lsbCBiZSBzZW50IChUT19TRVJWRVIpCisgICAqLworICBmcmFtZVNpemVGcm9tRGF0YTogZnVuY3Rpb24oZGF0YSwgbWFzaykgeworICAgIHZhciBoZWFkZXJTaXplID0gMTA7CisgICAgaWYgKGRhdGEubGVuZ3RoIDwgMHg3RSkgeworICAgICAgaGVhZGVyU2l6ZSA9IDI7CisgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgaGVhZGVyU2l6ZSA9IDQ7CisgICAgfQorICAgIHJldHVybiBoZWFkZXJTaXplICsgZGF0YS5sZW5ndGggKyAobWFzayA/IDQgOiAwKTsKKyAgfSwKKworICBmcmFtZU9wQ29kZXM6IHsKKyAgICBDT05UOiAgICAgMHgwMCwKKyAgICBURVhUOiAgICAgMHgwMSwKKyAgICBCSU46ICAgICAgMHgwMiwKKyAgICBDVFJMOiAgICAgMHg4MAorICB9LAorCisgIG1hc2s6IHsKKyAgICBUT19TRVJWRVI6IDB4ODAsCisgICAgVE9fQ0xJRU5UOiAweDAwCisgIH0sCisKKyAgZmluOiB7CisgICAgQ09OVDogMHgwMCwKKyAgICBGSU46IDB4ODAKKyAgfQorfTsKKworCisvLyBjcmVhdGVXZWJTZXJ2ZXIgY29uc3RydWN0b3IgYW5kIG9wdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgU2VydmVyT3B0aW9ucworICogQHByb3BlcnR5IHthcnJheX0gY29ycyAtIEFycmF5IG9mIENPUlMgb3JpZ2luIHN0cmluZ3MgdG8gcGVybWl0IHJlcXVlc3RzIGZyb20uCisgKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZXMgLSBQYXRoIHRvIHNlcnZlIHN0YXRpYyBmaWxlcyBmcm9tLCBpZiBhYnNlbnQgb3IgIiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIHNlcnZpY2UgaXMgZGlzYWJsZWQuCisgKiBAcHJvcGVydHkge29iamVjdH0gaGVhZGVycyAtIEFuIG9iamVjdCBoYXNoIG1hcHBpbmcgaGVhZGVyIHN0cmluZ3MgdG8gaGVhZGVyIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MsIHRoZXNlIGhlYWRlcnMgYXJlIHRyYW5zbWl0dGVkIGluIHJlc3BvbnNlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIEdFVCBvcGVyYXRpb25zLgorICogQHByb3BlcnR5IHtvYmplY3R9IHNlcnZpY2VzIC0gQW4gb2JqZWN0IGhhc2ggbWFwcGluZyBzZXJ2aWNlIFVSSSBzdHJpbmdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBTZXJ2aWNlT3B0aW9ucyBvYmplY3RzCisgKiBAcHJvcGVydHkge29iamVjdH0gdGxzIC0gTm9kZS5qcyBUTFMgb3B0aW9ucyAoc2VlOiBub2RlanMub3JnL2FwaS90bHMuaHRtbCksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXNlbnQgb3IgbnVsbCByZWd1bGFyIGh0dHAgaXMgdXNlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBsZWFzdCBhIGtleSBhbmQgYSBjZXJ0IG11c3QgYmUgZGVmaW5lZCB0byB1c2UgU1NML1RMUworICogQHNlZSB7QGxpbmsgU2VydmljZU9wdGlvbnN9CisgKi8KKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIFNlcnZpY2VPcHRpb25zCisgKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNwb3J0IC0gVGhlIGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoZGVmYXVsdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUQnVmZmVyZWRUcmFuc3BvcnQpLgorICogQHByb3BlcnR5IHtvYmplY3R9IHByb3RvY29sIC0gVGhlIHNlcmlhbGl6YXRpb24gUHJvdG9jb2wgdG8gdXNlIChkZWZhdWx0cyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xhc3MvcHJvY2Vzc29yIGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBJREwgQ29tcGlsZXIgZm9yIHRoZSBzZXJ2aWNlICh0aGUgImNscyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBhdHRyaWJ1dGUpLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBtZXRob2RzIGZvciB0aGUgVGhyaWZ0IFNlcnZpY2UuCisgKi8KKworLyoqCisgKiBDcmVhdGUgYSBUaHJpZnQgc2VydmVyIHdoaWNoIGNhbiBzZXJ2ZSBzdGF0aWMgZmlsZXMgYW5kL29yIG9uZSBvcgorICogbW9yZSBUaHJpZnQgU2VydmljZXMuCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IFdlYiBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlV2ViU2VydmVyID0gZnVuY3Rpb24ob3B0aW9ucykgeworICB2YXIgYmFzZURpciA9IG9wdGlvbnMuZmlsZXM7CisgIHZhciBjb250ZW50VHlwZXNCeUV4dGVuc2lvbiA9IHsKKyAgICAnLnR4dCc6ICd0ZXh0L3BsYWluJywKKyAgICAnLmh0bWwnOiAndGV4dC9odG1sJywKKyAgICAnLmNzcyc6ICd0ZXh0L2NzcycsCisgICAgJy54bWwnOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsCisgICAgJy5qcyc6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKKyAgICAnLmpwZyc6ICdpbWFnZS9qcGVnJywKKyAgICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsCisgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJywKKyAgICAnLnBuZyc6ICdpbWFnZS9wbmcnLAorICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnCisgIH07CisKKyAgLy9TZXR1cCBhbGwgb2YgdGhlIHNlcnZpY2VzCisgIHZhciBzZXJ2aWNlcyA9IG9wdGlvbnMuc2VydmljZXM7CisgIGZvciAodmFyIHVyaSBpbiBzZXJ2aWNlcykgeworICAgIHZhciBzdmNPYmogPSBzZXJ2aWNlc1t1cmldOworCisgICAgLy9TZXR1cCB0aGUgcHJvY2Vzc29yCisgICAgaWYgKHN2Y09iai5wcm9jZXNzb3IgaW5zdGFuY2VvZiBNdWx0aXBsZXhlZFByb2Nlc3NvcikgeworICAgICAgLy9NdWx0aXBsZXggcHJvY2Vzc29ycyBoYXZlIHByZSBlbWJlZGRlZCBwcm9jZXNzb3IvaGFuZGxlciBwYWlycywgc2F2ZSBhcyBpcworICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHN2Y09iai5wcm9jZXNzb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vRm9yIGhpc3RvcmljYWwgcmVhc29ucyBOb2RlLmpzIHN1cHBvcnRzIHByb2Nlc3NvcnMgcGFzc2VkIGluIGRpcmVjdGx5IG9yIHZpYSB0aGUKKyAgICAgIC8vICBJREwgQ29tcGlsZXIgZ2VuZXJhdGVkIGNsYXNzIGhvdXNpbmcgdGhlIHByb2Nlc3Nvci4gQWxzbywgdGhlIG9wdGlvbnMgcHJvcGVydHkKKyAgICAgIC8vICBmb3IgYSBQcm9jZXNzb3IgaGFzIGJlZW4gY2FsbGVkIGJvdGggY2xzIGFuZCBwcm9jZXNzb3IgYXQgZGlmZmVyZW50IHRpbWVzLiBXZQorICAgICAgLy8gIHN1cHBvcnQgYW55IG9mIHRoZSBmb3VyIHBvc3NpYmlsaXRpZXMgaGVyZS4KKyAgICAgIHZhciBwcm9jZXNzb3IgPSAoc3ZjT2JqLnByb2Nlc3NvcikgPyAoc3ZjT2JqLnByb2Nlc3Nvci5Qcm9jZXNzb3IgfHwgc3ZjT2JqLnByb2Nlc3NvcikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdmNPYmouY2xzLlByb2Nlc3NvciB8fCBzdmNPYmouY2xzKTsKKyAgICAgIC8vUHJvY2Vzc29ycyBjYW4gYmUgc3VwcGxpZWQgYXMgY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIGhhbmRsZXJzIGFscmVhZHkgZW1iZWRkZWQsCisgICAgICAvLyAgaWYgYSBoYW5kbGVyIGlzIHByb3ZpZGVkIHdlIGNvbnN0cnVjdCBhIG5ldyBwcm9jZXNzb3IsIGlmIG5vdCB3ZSB1c2UgdGhlIHByb2Nlc3NvcgorICAgICAgLy8gIG9iamVjdCBkaXJlY3RseQorICAgICAgaWYgKHN2Y09iai5oYW5kbGVyKSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBuZXcgcHJvY2Vzc29yKHN2Y09iai5oYW5kbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB9CisgICAgfQorICAgIHN2Y09iai50cmFuc3BvcnQgPSBzdmNPYmoudHJhbnNwb3J0ID8gc3ZjT2JqLnRyYW5zcG9ydCA6IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgICBzdmNPYmoucHJvdG9jb2wgPSBzdmNPYmoucHJvdG9jb2wgPyBzdmNPYmoucHJvdG9jb2wgOiBUQmluYXJ5UHJvdG9jb2w7CisgIH0KKworICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICBmdW5jdGlvbiBWZXJpZnlDT1JTQW5kU2V0SGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIGlmIChyZXF1ZXN0LmhlYWRlcnMub3JpZ2luICYmIG9wdGlvbnMuY29ycykgeworICAgICAgaWYgKG9wdGlvbnMuY29yc1siKiJdIHx8IG9wdGlvbnMuY29yc1tyZXF1ZXN0LmhlYWRlcnMub3JpZ2luXSkgeworICAgICAgICAvL0FsbG93LCBvcmlnaW4gYWxsb3dlZAorICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbiIsIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4pOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW1ldGhvZHMiLCAiR0VULCBQT1NULCBPUFRJT05TIik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctaGVhZGVycyIsICJjb250ZW50LXR5cGUsIGFjY2VwdCIpOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLW1heC1hZ2UiLCAiNjAiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL0Rpc2FsbG93LCBvcmlnaW4gZGVuaWVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy9BbGxvdywgQ09SUyBpcyBub3QgaW4gdXNlCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisgIC8vSGFuZGxlIE9QVElPTlMgbWV0aG9kIChDT1JTKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc09wdGlvbnMocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICBpZiAoVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjIwNCIsICJObyBDb250ZW50IiwgeyJjb250ZW50LWxlbmd0aCI6IDB9KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICB9CisgICAgcmVzcG9uc2UuZW5kKCk7CisgIH0KKworCisgIC8vSGFuZGxlIFBPU1QgbWV0aG9kcyAoVFhIUlRyYW5zcG9ydCkKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIGZ1bmN0aW9uIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgLy9Mb29rdXAgc2VydmljZQorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBzdmMgPSBzZXJ2aWNlc1t1cmldOworICAgIGlmICghc3ZjKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJObyBBcGFjaGUgVGhyaWZ0IFNlcnZpY2UgYXQgIiArIHVyaSwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vUHJvY2VzcyBYSFIgcGF5bG9hZAorICAgIHJlcXVlc3Qub24oJ2RhdGEnLCBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgc3ZjLnByb3RvY29sKG5ldyBzdmMudHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9KSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHN2Yy5wcm9jZXNzb3IucHJvY2VzcyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSkpOworICB9CisKKworICAvL0hhbmRsZSBHRVQgbWV0aG9kcyAoU3RhdGljIFBhZ2UgU2VydmVyKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIC8vVW5kZWZpbmVkIG9yIGVtcHR5IGJhc2UgZGlyZWN0b3J5IG1lYW5zIGRvIG5vdCBzZXJ2ZSBzdGF0aWMgZmlsZXMKKyAgICBpZiAoIWJhc2VEaXIgfHwgIiIgPT09IGJhc2VEaXIpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTG9jYXRlIHRoZSBmaWxlIHJlcXVlc3RlZCBhbmQgc2VuZCBpdAorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBmaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oYmFzZURpciwgdXJpKSk7CisKKyAgICAvL0Vuc3VyZSB0aGUgYmFzZWRpciBwYXRoIGlzIG5vdCBhYmxlIHRvIGJlIGVzY2FwZWQKKyAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZihiYXNlRGlyKSAhPSAwKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDAwLCAiSW52YWxpZCByZXF1ZXN0IHBhdGgiLCB7fSk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcy5leGlzdHMoZmlsZW5hbWUsIGZ1bmN0aW9uKGV4aXN0cykgeworICAgICAgaWYoIWV4aXN0cykgeworICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDA0KTsKKyAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVuYW1lKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIGZpbGVuYW1lICs9ICcvaW5kZXguaHRtbCc7CisgICAgICB9CisKKyAgICAgIGZzLnJlYWRGaWxlKGZpbGVuYW1lLCAiYmluYXJ5IiwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTsKKyAgICAgICAgICByZXNwb25zZS5lbmQoZXJyICsgIlxuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZhciBoZWFkZXJzID0ge307CisgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlc0J5RXh0ZW5zaW9uW3BhdGguZXh0bmFtZShmaWxlbmFtZSldOworICAgICAgICBpZiAoY29udGVudFR5cGUpIHsKKyAgICAgICAgICBoZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9IGNvbnRlbnRUeXBlOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGsgaW4gb3B0aW9ucy5oZWFkZXJzKSB7CisgICAgICAgICAgaGVhZGVyc1trXSA9IG9wdGlvbnMuaGVhZGVyc1trXTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCBoZWFkZXJzKTsKKyAgICAgICAgcmVzcG9uc2Uud3JpdGUoZmlsZSwgImJpbmFyeSIpOworICAgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKworICAvL0hhbmRsZSBXZWJTb2NrZXQgY2FsbHMgKFRXZWJTb2NrZXRUcmFuc3BvcnQpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzV1MoZGF0YSwgc29ja2V0LCBzdmMsIGJpbkVuY29kaW5nKSB7CisgICAgc3ZjLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRXaXRoRGF0YSkgeworICAgICAgdmFyIGlucHV0ID0gbmV3IHN2Yy5wcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7CisgICAgICB2YXIgb3V0cHV0ID0gbmV3IHN2Yy5wcm90b2NvbChuZXcgc3ZjLnRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhciBmcmFtZSA9IHdzRnJhbWUuZW5jb2RlKGJ1ZiwgbnVsbCwgYmluRW5jb2RpbmcpOworICAgICAgICAgIHNvY2tldC53cml0ZShmcmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc3ZjLnByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgfQorICAgICAgY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KShkYXRhKTsKKyAgfQorCisgIC8vQ3JlYXRlIHRoZSBzZXJ2ZXIgKEhUVFAgb3IgSFRUUFMpCisgIHZhciBzZXJ2ZXIgPSBudWxsOworICBpZiAob3B0aW9ucy50bHMpIHsKKyAgICBzZXJ2ZXIgPSBodHRwcy5jcmVhdGVTZXJ2ZXIob3B0aW9ucy50bHMpOworICB9IGVsc2UgeworICAgIHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKCk7CisgIH0KKworICAvL1dpcmUgdXAgbGlzdGVuZXJzIGZvciB1cGdyYWRlKHRvIFdlYlNvY2tldCkgJiByZXF1ZXN0IG1ldGhvZHMgZm9yOgorICAvLyAgIC0gR0VUIHN0YXRpYyBmaWxlcywKKyAgLy8gICAtIFBPU1QgWEhSIFRocmlmdCBzZXJ2aWNlcworICAvLyAgIC0gT1BUSU9OUyBDT1JTIHJlcXVlc3RzCisgIHNlcnZlci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHsKKyAgICAgIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykgeworICAgICAgcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7CisgICAgICBwcm9jZXNzT3B0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgfQorICB9KS5vbigndXBncmFkZScsIGZ1bmN0aW9uKHJlcXVlc3QsIHNvY2tldCwgaGVhZCkgeworICAgIC8vTG9va3VwIHNlcnZpY2UKKyAgICB2YXIgc3ZjOworICAgIHRyeSB7CisgICAgICBzdmMgPSBzZXJ2aWNlc1tPYmplY3Qua2V5cyhzZXJ2aWNlcylbMF1dOworICAgIH0gY2F0Y2goZSkgeworICAgICAgc29ja2V0LndyaXRlKCJIVFRQLzEuMSA0MDMgTm8gQXBhY2hlIFRocmlmdCBTZXJ2aWNlIGF2YWlsYWJsZVxyXG5cclxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vUGVyZm9ybSB1cGdyYWRlCisgICAgdmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgic2hhMSIpOworICAgIGhhc2gudXBkYXRlKHJlcXVlc3QuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1rZXknXSArICIyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEiKTsKKyAgICBzb2NrZXQud3JpdGUoIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJVcGdyYWRlOiB3ZWJzb2NrZXRcclxuIiArCisgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IFVwZ3JhZGVcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlNlYy1XZWJTb2NrZXQtQWNjZXB0OiAiICsgaGFzaC5kaWdlc3QoImJhc2U2NCIpICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1PcmlnaW46ICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1Mb2NhdGlvbjogd3M6Ly8iICsgcmVxdWVzdC5oZWFkZXJzLmhvc3QgKyByZXF1ZXN0LnVybCArICJcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlxyXG4iKTsKKyAgICAvL0hhbmRsZSBXZWJTb2NrZXQgdHJhZmZpYworICAgIHZhciBkYXRhID0gbnVsbDsKKyAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbihmcmFtZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKGZyYW1lKSB7CisgICAgICAgICAgdmFyIHJlc3VsdCA9IHdzRnJhbWUuZGVjb2RlKGZyYW1lKTsKKyAgICAgICAgICAvL1ByZXBlbmQgYW55IGV4aXN0aW5nIGRlY29kZWQgZGF0YQorICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHsKKyAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBuZXcgQnVmZmVyKGRhdGEubGVuZ3RoICsgcmVzdWx0LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgZGF0YS5jb3B5KG5ld0RhdGEpOworICAgICAgICAgICAgICByZXN1bHQuZGF0YS5jb3B5KG5ld0RhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBuZXdEYXRhOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIC8vSWYgdGhpcyBjb21wbGV0ZXMgYSBtZXNzYWdlIHByb2Nlc3MgaXQKKyAgICAgICAgICBpZiAocmVzdWx0LkZJTikgeworICAgICAgICAgICAgcHJvY2Vzc1dTKHJlc3VsdC5kYXRhLCBzb2NrZXQsIHN2YywgcmVzdWx0LmJpbkVuY29kaW5nKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IHJlc3VsdC5kYXRhOworICAgICAgICAgIH0KKyAgICAgICAgICAvL1ByZXBhcmUgbmV4dCBmcmFtZSBmb3IgZGVjb2RpbmcgKGlmIGFueSkKKyAgICAgICAgICBmcmFtZSA9IHJlc3VsdC5uZXh0RnJhbWU7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICBsb2cuZXJyb3IoJ1RXZWJTb2NrZXRUcmFuc3BvcnQgRXhjZXB0aW9uOiAnICsgZSk7CisgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIC8vUmV0dXJuIHRoZSBzZXJ2ZXIKKyAgcmV0dXJuIHNlcnZlcjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKK3ZhciB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCit2YXIgY3JlYXRlQ2xpZW50ID0gcmVxdWlyZSgnLi9jcmVhdGVfY2xpZW50Jyk7CisKK2V4cG9ydHMuV1NDb25uZWN0aW9uID0gV1NDb25uZWN0aW9uOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgV1NDb25uZWN0T3B0aW9ucworICogQHByb3BlcnR5IHtzdHJpbmd9IHRyYW5zcG9ydCAtIFRoZSBUaHJpZnQgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChUQnVmZmVyZWRUcmFuc3BvcnQsIGV0YykuCisgKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wgLSBUaGUgVGhyaWZ0IHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdG8gdXNlIChUSlNPTlByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIGNvbm5lY3QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBzZWN1cmUgLSBUcnVlIGNhdXNlcyB0aGUgY29ubmVjdGlvbiB0byB1c2Ugd3NzLCBvdGhlcndpc2Ugd3MgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB3c09wdGlvbnMgLSBPcHRpb25zIHBhc3NlZCBvbiB0byBXZWJTb2NrZXQuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgc2VjdXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbgorICogICAgIC8vICB1c2VzIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgbGF5ZXIsIHVzZXMgdGhlIEpTT04gcHJvdG9jb2wgYW5kIGRpcmVjdHMgUlBDIHRyYWZmaWMKKyAqICAgICAvLyAgdG8gd3NzOi8vdGhyaWZ0LmV4YW1wbGUuY29tOjkwOTAvaGVsbG8KKyAqICAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgKiAgICAgdmFyIG9wdGlvbnMgPSB7CisgKiAgICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICogICAgICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAqICAgICAgICBwYXRoOiAiL2hlbGxvIiwKKyAqICAgICAgICBzZWN1cmU6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKCJ0aHJpZnQuZXhhbXBsZS5jb20iLCA5MDkwLCBvcHRpb25zKTsKKyAqICAgICBjb24ub3BlbigpCisgKiAgICAgdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICogICAgIGNvbi5jbG9zZSgpCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIFRocmlmdCBXU0Nvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVXU0Nvbm5lY3Rpb24oKSByYXRoZXIgdGhhbgorICogICAgaW5zdGFudGlhdGluZyBkaXJlY3RseSkuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KKyAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKKyAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCisgKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlzb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBXU0Nvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFdlYnNvY2tldHMuCisgKiBAc2VlIHtAbGluayBjcmVhdGVXU0Nvbm5lY3Rpb259CisgKi8KK2Z1bmN0aW9uIFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAorICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICAvL1NldCBjb25maWd1cmF0aW9uCisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5zZWN1cmUgPSB0aGlzLm9wdGlvbnMuc2VjdXJlIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRKU09OUHJvdG9jb2w7CisgIHRoaXMucGF0aCA9IHRoaXMub3B0aW9ucy5wYXRoOworICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKKworICAvL1ByZXBhcmUgV2ViU29ja2V0IG9wdGlvbnMKKyAgdGhpcy53c09wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCB8fCA4MCwKKyAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCisgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30KKyAgfTsKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLndzT3B0aW9ucykgeworICAgIHRoaXMud3NPcHRpb25zW2F0dHJuYW1lXSA9IHRoaXMub3B0aW9ucy53c09wdGlvbnNbYXR0cm5hbWVdOworICB9Cit9OwordXRpbC5pbmhlcml0cyhXU0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldCA9IG51bGw7IC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuZW1pdCgib3BlbiIpOworICBpZiAodGhpcy5zZW5kX3BlbmRpbmcubGVuZ3RoID4gMCkgeworICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgdGhpcy5zZW5kX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLnNvY2tldC5zZW5kKGRhdGEpOworICAgIH0pOworICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgIH0KK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiY2xvc2UiKTsKKyAgdGhpcy5fX3Jlc2V0KCk7Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fZGVjb2RlQ2FsbGJhY2sgPSBmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgIHZhciBwcm90byA9IG5ldyB0aGlzLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICB0cnkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgaGVhZGVyID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgdmFyIGNsaWVudCA9IHRoaXMuY2xpZW50OworICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgIC8vICBsb29rdXAgdGhlIGFwcHJvcHJpYXRlIGNsaWVudCBmb3IgdGhpcyBjYWxsLgorICAgICAgLy8gIFRoZSBjbGllbnQgdmFyIGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QgbXVsdGlwbGV4aW5nLAorICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAvLyAgb2JqZWN0cy4KKyAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAvLyAgLS1yYQorICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgY2xpZW50ID0gdGhpcy5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIH0KKyAgICAgIC8qanNoaW50IC1XMDgzICovCisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICBjbGllbnRDYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICB9CisgICAgICB9OworICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgIGlmIChjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdOworICAgICAgICB0aGlzLmVtaXQoImVycm9yIiwKKyAgICAgICAgICBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgIlJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gYW4gdW5rbm93biBSUEMgZnVuY3Rpb24iKSk7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CisgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEpOworICB9CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGEpOworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkoYnVmKTsKKworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fb25EYXRhKGV2dC5kYXRhKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiZXJyb3IiLCBldnQpOworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7CisgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKKyAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmkoKSwgIiIsIHRoaXMud3NPcHRpb25zKTsKKyAgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm4gVVJJIGZvciB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMge3N0cmluZ30gVVJJCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUudXJpID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJzsKKyAgdmFyIHBvcnQgPSAnJzsKKyAgdmFyIHBhdGggPSB0aGlzLnBhdGggfHwgJy8nOworICB2YXIgaG9zdCA9IHRoaXMuaG9zdDsKKworICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYQorICBpZiAodGhpcy5wb3J0ICYmICgoJ3dzcycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA0NDMpIHx8CisgICAgKCd3cycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA4MCkpKSB7CisgICAgcG9ydCA9ICc6JyArIHRoaXMucG9ydDsKKyAgfQorCisgIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIGhvc3QgKyBwb3J0ICsgcGF0aDsKK307CisKKy8qKgorICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goZGF0YSk7CisgIH0KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBXU0Nvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge1dTQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtXU0Nvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFdTQ29ubmVjdE9wdGlvbnN9CisgKi8KK2V4cG9ydHMuY3JlYXRlV1NDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlV1NDbGllbnQgPSBjcmVhdGVDbGllbnQ7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworZnVuY3Rpb24gVFdlYlNvY2tldFRyYW5zcG9ydCh1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKHVybCkgeworICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgIHRoaXMuY2FsbGJhY2tzID0gW107ICAgICAgICAvL1BlbmRpbmcgY2FsbGJhY2tzCisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgIHRoaXMucmVjdl9idWYgPSAnJzsgICAgICAgICAvL0luYm91bmQgZGF0YQorICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gVGhlIGNsaWVudCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgIH07CisgICAgfSgpKSk7CisgIH0gZWxzZSB7CisgICAgLy9RdWV1ZSB0aGUgc2VuZCB0byBnbyBvdXQgX19vbk9wZW4KKyAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgIGNiOiAgY2FsbGJhY2sKKyAgICB9KTsKKyAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk9wZW4gPSBmdW5jdGlvbigpIHsKKyAgIHZhciBzZWxmID0gdGhpczsKKyAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7CisgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7CisgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgIH07CisgICAgICAgICB9KCkpKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25DbG9zZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk1lc3NhZ2UgPSBmdW5jdGlvbihldnQpIHsKKyAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgbG9nLmVycm9yKCd3ZWJzb2NrZXQ6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0UmVjdkJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLnJwb3MgPSAwOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5nZXRTZW5kQnVmZmVyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNlbmRfYnVmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU5YzkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0gWEhSQ29ubmVjdGlvbjsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFhIUiBDb25uZWN0aW9uLgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgaG9zdCBhbmQgcG9ydCB0aGVuIFhIUkNvbm5lY3Rpb24gd2lsbCBkZWZhdWx0IHRvIHRoZQorICogaG9zdCBhbmQgcG9ydCBvZiB0aGUgcGFnZSBmcm9tIHdoaWNoIHRoaXMgamF2YXNjcmlwdCBpcyBzZXJ2ZWQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVFhIUkNvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFhIUi4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUkNvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIDkwOTksIHt9KTsKKyAqLworZnVuY3Rpb24gWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMud3BvcyA9IDA7CisgIHRoaXMucnBvcyA9IDA7CisgIHRoaXMudXNlQ09SUyA9IChvcHRpb25zICYmIG9wdGlvbnMudXNlQ09SUyk7CisgIHRoaXMuc2VuZF9idWYgPSAnJzsKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOworICB0aGlzLnRyYW5zcG9ydCA9IG9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9OworCisgIGhvc3QgPSBob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0OworICBwb3J0ID0gcG9ydCB8fCB3aW5kb3cubG9jYXRpb24ucG9ydDsKKyAgdmFyIHByZWZpeCA9IG9wdGlvbnMuaHR0cHMgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nOworICB2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnLyc7CisKKyAgaWYgKHBvcnQgPT09ICcnKSB7CisgICAgcG9ydCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIGlmICghcG9ydCB8fCBwb3J0ID09PSA4MCB8fCBwb3J0ID09PSAnODAnKSB7CisgICAgdGhpcy51cmwgPSBwcmVmaXggKyBob3N0ICsgcGF0aDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyAnOicgKyBwb3J0ICsgcGF0aDsKKyAgfQorCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKK307CisKK3V0aWwuaW5oZXJpdHMoWEhSQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworLyoqCisqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0ID0gZnVuY3Rpb24oKSB7CisgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSBjYXRjaCAoZTEpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUyKSB7IH0KKyAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoIChlMykgeyB9CisKKyAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgWEhSLiI7Cit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTAorICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICogdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgorICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgaWYgKHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgIH0KKworICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CisgIH0KKworICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcih0aGlzLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9OworCisgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCB0cnVlKTsKKworICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyS2V5KSB7CisgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlcktleSwgc2VsZi5oZWFkZXJzW2hlYWRlcktleV0pOworICB9KTsKKworICB4cmVxLnNlbmQodGhpcy5zZW5kX2J1Zik7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byBwcm92aWRlIHRoZSBwcm90b2NvbCB3aGVuIGRlc2VyaWFsaXppbmcuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7CisKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChidWYpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CisgIH0KKyAgdmFyIHRoaW5nID0gbmV3IEJ1ZmZlcihkYXRhIHx8IGJ1Zik7CisKKyAgdGhpcy50cmFuc3BvcnQucmVjZWl2ZXIodGhpcy5fX2RlY29kZUNhbGxiYWNrLmJpbmQodGhpcykpKHRoaW5nKTsKKworfTsKKworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworICB0aGlzLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgVFhIUlRyYW5zcG9ydCBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7WEhSQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtYSFJDb25uZWN0aW9ufSBUaGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiBAc2VlIHtAbGluayBYSFJDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFhIUkNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdjZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CisKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweGZmKSk7CisKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOworICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgLy9Qcm90b2NvbCBzaW1wbHkgd3JpdGVzIHRvIHRoZSBidWZmZXIuIE5vdGhpbmcgdG8gdGVzdC4uIHlldC4KKyAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorICAiU2hvdWxkIHJlYWQgSTE2IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkSTE2KFsweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMV0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTE2KFsweGZmLCAweGZmXSkpOworCisgICAgLy8gTWluIEkxNgorICAgIGFzc2VydC5lcXVhbCgtMzI3NjgsIGJpbmFyeS5yZWFkSTE2KFsweDgwLCAweDAwXSkpOworICAgIC8vIE1heCBJMTYKKyAgICBhc3NlcnQuZXF1YWwoMzI3NjcsIGJpbmFyeS5yZWFkSTE2KFsweDdmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMTYoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTEpKTsKKworICAgIC8vIE1pbiBJMTYKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDgwLCAweDAwXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAtMzI3NjgpKTsKKyAgICAvLyBNYXggSTE2CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgMzI3NjcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIEkzMiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbCgwLCBiaW5hcnkucmVhZEkzMihbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRJMzIoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEkzMihbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKTsKKworICAgIC8vIE1pbiBJMzIKKyAgICBhc3NlcnQuZXF1YWwoLTIxNDc0ODM2NDgsIGJpbmFyeS5yZWFkSTMyKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSkpOworICAgIC8vIE1heCBJMzIKKyAgICBhc3NlcnQuZXF1YWwoMjE0NzQ4MzY0NywgYmluYXJ5LnJlYWRJMzIoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgSTMyIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgMCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLCBiaW5hcnkud3JpdGVJMzIoW10sIDEpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMSkpOworCisgICAgLy8gTWluIEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVJMzIoW10sIC0yMTQ3NDgzNjQ4KQorICAgICk7CisgICAgLy8gTWF4IEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIDIxNDc0ODM2NDcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAwLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLTIsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE1hdGguUEksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSkKKyAgICApOworCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5vaygKKyAgICAgIGlzTmFOKGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEgLyAzLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDApCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMikKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC0yKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIE1hdGguUEkpCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIEluZmluaXR5KQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLUluZmluaXR5KQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBOYU4pCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEgLyAzKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9Cit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRSBiL2xpYi9ub2RlanMvdGVzdC9jZXJ0aWZpY2F0ZXMuUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRQpAQCAtMCwwICsxLDcgQEAKK3NlcnZlci5jcnQgQU5EIHNlcnZlci5rZXkgQVJFIFBST1ZJREVEIEZPUiBURVNUIFBVUlBPU0UgQU5EIFNIT1VMRCAqTkVWRVIqIEJFIFVTRUQgSU4gUFJPRFVDVElPTgorCisKK09yaWdpbiBvZiB0aGUgdGVzdCBrZXkgYW5kIGNlcnQgaXMgdGhlIGZvbGRlciB0ZXN0L2tleXMgb2YgQXBhY2hlIFRocmlmdCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb24KKworV2UgbmVlZCBjb3BpZXMgZm9yIG5wbSBkZXBsb3ltZW50CisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTNhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBub2RlCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKKworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIikuVGhyaWZ0VGVzdERyaXZlcjsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpCisgIC5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7CisKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKKworcHJvZ3JhbQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikgW3Byb3RvY29sXSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIFt0cmFuc3BvcnRdIgorICApCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0taG9zdCA8aG9zdD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0IiwgImxvY2FsaG9zdCIpCisgIC5vcHRpb24oCisgICAgIi0tZG9tYWluLXNvY2tldCA8cGF0aD4iLAorICAgICJTZXQgdGhyaWZ0IHNlcnZlciB1bml4IGRvbWFpbiBzb2NrZXQgdG8gY29ubmVjdCIKKyAgKQorICAub3B0aW9uKCItLXNzbCIsICJ1c2UgU1NMIHRyYW5zcG9ydCIpCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKworY29uc3QgaG9zdCA9IHByb2dyYW0uaG9zdDsKK2NvbnN0IHBvcnQgPSBwcm9ncmFtLnBvcnQ7Citjb25zdCBkb21haW5Tb2NrZXQgPSBwcm9ncmFtLmRvbWFpblNvY2tldDsKK2NvbnN0IHNzbCA9IHByb2dyYW0uc3NsOworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY3Jvc3MgdGVzdCBpbnZvY2F0aW9uIGZvciBodHRwIHRyYW5zcG9ydCB0ZXN0aW5nICovCitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2NvbnN0IG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKKyAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCit9OworCitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMucGF0aCA9ICIvdGVzdCI7Cit9CisKK2lmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgb3B0aW9ucy5oZWFkZXJzID0geyBDb25uZWN0aW9uOiAiY2xvc2UiIH07Cit9CisKK2lmIChzc2wpIHsKKyAgaWYgKHR5cGUgPT09ICJ0Y3AiIHx8IHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgICBvcHRpb25zLm5vZGVPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CisgICAgb3B0aW9ucy5odHRwcyA9IHRydWU7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgICBvcHRpb25zLndzT3B0aW9ucyA9IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9OworICAgIG9wdGlvbnMuc2VjdXJlID0gdHJ1ZTsKKyAgfQorfQorCitsZXQgY29ubmVjdGlvbjsKK2xldCBjbGllbnQ7Citjb25zdCB0ZXN0RHJpdmVyID0gcHJvZ3JhbS5jYWxsYmFjaworICA/IFRocmlmdFRlc3REcml2ZXIKKyAgOiBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2lmIChoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiAmJiBwcm9ncmFtLmNhbGxiYWNrKSB7CisgIGNvbnNvbGUubG9nKCJFUzYgZG9lcyBub3Qgc3VwcG9ydCBjYWxsYmFjayBzdHlsZSIpOworICBwcm9jZXNzLmV4aXQoMCk7Cit9CisKK2lmICh0eXBlID09PSAidGNwIiB8fCB0eXBlID09PSAibXVsdGlwbGV4IikgeworICBpZiAoZG9tYWluU29ja2V0KSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHNzbAorICAgICAgPyB0aHJpZnQuY3JlYXRlU1NMQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKQorICAgICAgOiB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24oZG9tYWluU29ja2V0LCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICB9Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICBjb25uZWN0aW9uLm9wZW4oKTsKK30KKworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKK2lmICh0eXBlID09PSAidGNwIikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBtcCA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZXIoKTsKKyAgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCJUaHJpZnRUZXN0IiwgVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIGNvbnN0IHNlY29uZGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgKKyAgICAiU2Vjb25kU2VydmljZSIsCisgICAgU2Vjb25kU2VydmljZSwKKyAgICBjb25uZWN0aW9uCisgICk7CisKKyAgY29ubmVjdGlvbi5vbigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICAgIHNlY29uZGNsaWVudC5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0IiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0KCFlcnIpOworICAgICAgYXNzZXJ0LmVxdWFsKCd0ZXN0U3RyaW5nKCJUZXN0IiknLCByZXNwb25zZSk7CisgICAgfSk7CisKKyAgICBydW5UZXN0cygpOworICB9KTsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVIdHRwQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlV1NDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIHJ1blRlc3RzKCk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkgeworICB0ZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24oc3RhdHVzKSB7CisgICAgY29uc29sZS5sb2coc3RhdHVzKTsKKyAgICBpZiAodHlwZSAhPT0gImh0dHAiICYmIHR5cGUgIT09ICJ3ZWJzb2NrZXQiKSB7CisgICAgICBjb25uZWN0aW9uLmVuZCgpOworICAgIH0KKyAgICBpZiAodHlwZSAhPT0gIm11bHRpcGxleCIpIHsKKyAgICAgIHByb2Nlc3MuZXhpdCgwKTsKKyAgICB9CisgIH0pOworfQorCitleHBvcnRzLmV4cHJlc3NvVGVzdCA9IGZ1bmN0aW9uKCkge307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRkYWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBidWZmZXJFcXVhbHMgPSByZXF1aXJlKCJidWZmZXItZXF1YWxzIik7CisKK2Z1bmN0aW9uIHNlcmlhbGl6ZUJpbmFyeShkYXRhKSB7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKKyAgICBidWZmID0gbXNnOworICB9KTsKKyAgY29uc3QgcHJvdCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGRhdGEud3JpdGUocHJvdCk7CisgIHByb3QuZmx1c2goKTsKKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK2Z1bmN0aW9uIGRlc2VyaWFsaXplQmluYXJ5KHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHQpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKKyAgZGF0YS5yZWFkKHApOworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc2VyaWFsaXplSlNPTihkYXRhKSB7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKKyAgICBidWZmID0gbXNnOworICB9KTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oIiIsIDAsIDApOworICBkYXRhLndyaXRlKHByb3RvY29sKTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIHByb3RvY29sLmZsdXNoKCk7CisgIHJldHVybiBidWZmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZUpTT04oc2VyaWFsaXplZCwgdHlwZSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwcm90b2NvbCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgIHJldHVybiBkYXRhOworfQorCitmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7CisgIHJldHVybiBuZXcgdHR5cGVzLkNvbXBsZXgoeworICAgIHN0cnVjdF9maWVsZDogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImEiIH0pLAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJiIiB9KSwKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJjIiB9KQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZCIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZSIgfSkKKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImYiIH0pLAorICAgICAgQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImciIH0pCisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImgiIH0pLAorICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImkiIH0pCisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaiIgfSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiayIgfSkKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsibDAwIiwgImwwMSIsICJsMDIiXSwKKyAgICAgIFsibDEwIiwgImwxMSIsICJsMTIiXSwKKyAgICAgIFsibDIwIiwgImwyMSIsICJsMjIiXQorICAgIF0sCisKKyAgICBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQorICB9KTsKK30KKworZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7CisgIHJldHVybiB7CisgICAgc3RydWN0X2ZpZWxkOiB7IHZhbHVlOiAiYSIgfSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbeyB2YWx1ZTogImIiIH0sIHsgdmFsdWU6ICJjIiB9XSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFt7IHZhbHVlOiAiZCIgfSwgeyB2YWx1ZTogImUiIH1dLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogeyB2YWx1ZTogImYiIH0sCisgICAgICBCOiB7IHZhbHVlOiAiZyIgfQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFt7IHZhbHVlOiAiaCIgfSwgeyB2YWx1ZTogImkiIH1dCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IHsgdmFsdWU6ICJqIiB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogeyB2YWx1ZTogImsiIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsibDAwIiwgImwwMSIsICJsMDIiXSwKKyAgICAgIFsibDEwIiwgImwxMSIsICJsMTIiXSwKKyAgICAgIFsibDIwIiwgImwyMSIsICJsMjIiXQorICAgIF0sCisKKyAgICBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQorICB9OworfQorCitmdW5jdGlvbiBhc3NlcnRWYWx1ZXMob2JqLCBhc3NlcnQpIHsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2ZpZWxkLnZhbHVlLCAiYSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgImIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUsICJjIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUsICJkIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICJlIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSwgImYiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5CLnZhbHVlLCAiZyIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgImgiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0udmFsdWUsICJpIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgImoiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAiayIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMF0sICJsMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdLCAibDAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXSwgImwwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMF0sICJsMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdLCAibDExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXSwgImwxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICJsMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdLCAibDIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXSwgImwyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzBdLCAibTAwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsxXSwgIm0wMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMl0sICJtMDAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzBdLCAibTAxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsxXSwgIm0wMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMl0sICJtMDEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzBdLCAibTAyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsxXSwgIm0wMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMl0sICJtMDIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMF0sICJtMTAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzFdLCAibTEwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVsyXSwgIm0xMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMF0sICJtMTEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzFdLCAibTExMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVsyXSwgIm0xMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMF0sICJtMTIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzFdLCAibTEyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVsyXSwgIm0xMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVswXSwgIm0yMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMV0sICJtMjAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzJdLCAibTIwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVswXSwgIm0yMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMV0sICJtMjExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzJdLCAibTIxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVswXSwgIm0yMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMV0sICJtMjIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzJdLCAibTIyMiIpOworfQorCitmdW5jdGlvbiBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSkgeworICBjb25zdCBjYXNlcyA9IHsKKyAgICAiU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgdHR5cGVzLkNvbXBsZXgpOworICAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkLCAibm90IHRoZSBzYW1lIG9iamVjdCIpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMiOiBmdW5jdGlvbigKKyAgICAgIGFzc2VydAorICAgICkgeworICAgICAgY29uc3QgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICAgIGNvbnN0IHRPYmoyID0gbmV3IHR0eXBlcy5Db21wbGV4KGNyZWF0ZUpzT2JqKCkpOworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOworICAgICAgY29uc3QgczEgPSBzZXJpYWxpemUodE9iajEpOworICAgICAgY29uc3QgczIgPSBzZXJpYWxpemUodE9iajIpOworICAgICAgYXNzZXJ0Lm9rKGJ1ZmZlckVxdWFscyhzMSwgczIpKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9LAorCisgICAgIk1vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCI6IGZ1bmN0aW9uKAorICAgICAgYXNzZXJ0CisgICAgKSB7CisgICAgICBjb25zdCBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICAgIGFzc2VydFZhbHVlcyhhcmdzLCBhc3NlcnQpOworCisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KGFyZ3MpOworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisKKyAgICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAiWlpaIjsKKworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJudWxscyBhcmUgb2siOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXgoeworICAgICAgICBzdHJ1Y3RfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKKyAgICAgIH0pOworICAgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0T2JqLnN0cnVjdF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJDYW4gbWFrZSBsaXN0IHdpdGggb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleExpc3QoeworICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogW25ldyB0dHlwZXMuQ29tcGxleCh7fSldCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGlubmVyT2JqID0gdE9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXTsKKyAgICAgIGFzc2VydC5vayhpbm5lck9iaiBpbnN0YW5jZW9mIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9saXN0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3Rfc2V0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbWFwX2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIsIG51bGwpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIGNhc2VzOworfQorCitmdW5jdGlvbiBydW4obmFtZSwgY2FzZXMpIHsKKyAgT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgICB0ZXN0KG5hbWUgKyAiOiAiICsgY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7CisgIH0pOworfQorCitydW4oImJpbmFyeSIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7CitydW4oImpzb24iLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjc5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisidXNlIHN0cmljdCI7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC90aHJpZnQuanMiKTsKK2NvbnN0IElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yIik7CisKK3Rlc3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJ1bmV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgMTAwKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogMTAwLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsIDEwMCwgImhhcyBlcnJvciBtZXNzYWdlIDEwMCIpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRFeGNlcHRpb24oImZvbyIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6MjE6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubmFtZSwgIlRFeGNlcHRpb24iLCAiaGFzIGZ1bmN0aW9uIG5hbWUgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJUUHJvdG9jb2xFeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oMSwgImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVFByb3RvY29sRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRQcm90b2NvbEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6MzM6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVFByb3RvY29sRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVFByb3RvY29sRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLAorICAgICJpcyBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3I6IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjQ2OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIklucHV0QnVmZmVyVW5kZXJydW5FcnJvciIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzIGIvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkMTI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOworCittb2R1bGUuZXhwb3J0cy50cmFuc3BvcnRzID0geworICBidWZmZXJlZDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgZnJhbWVkOiB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydAorfTsKKworbW9kdWxlLmV4cG9ydHMucHJvdG9jb2xzID0geworICBqc29uOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgYmluYXJ5OiB0aHJpZnQuVEJpbmFyeVByb3RvY29sLAorICBjb21wYWN0OiB0aHJpZnQuVENvbXBhY3RQcm90b2NvbAorfTsKKworbW9kdWxlLmV4cG9ydHMuZWNtYU1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikgPyAiZXM2IiA6ICJlczUiOworbW9kdWxlLmV4cG9ydHMuZ2VuUGF0aCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygiLS1lczYiKQorICA/ICJnZW4tbm9kZWpzLWVzNiIKKyAgOiAiZ2VuLW5vZGVqcyI7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydCBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwMjA5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKQEAgLTAsMCArMSwxMzcgQEAKKyMhL3Vzci9iaW4vZW52IG5vZGUKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7Citjb25zdCBwYXRoID0gcmVxdWlyZSgicGF0aCIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOworY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworCitwcm9ncmFtCisgIC5vcHRpb24oCisgICAgIi1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4iLAorICAgICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8Y29tcGFjdHxqc29uKSIsCisgICAgImJpbmFyeSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIiwKKyAgICAiYnVmZmVyZWQiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIHNzbCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQiLCA5MDkwKQorICAub3B0aW9uKCItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwgIlNldCB0aGlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IikKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHlwZSA8dHlwZT4iLAorICAgICJTZWxlY3Qgc2VydmVyIHR5cGUgKGh0dHB8bXVsdGlwbGV4fHRjcHx3ZWJzb2NrZXQpIiwKKyAgICAidGNwIgorICApCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tZXM2IiwgIlVzZSBlczYgY29kZSIpCisgIC5vcHRpb24oIi0tZXM1IiwgIlVzZSBlczUgY29kZSIpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCitjb25zdCBUaHJpZnRUZXN0ID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdGApOworY29uc3QgU2Vjb25kU2VydmljZSA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1NlY29uZFNlcnZpY2VgKTsKK2NvbnN0IHsgVGhyaWZ0VGVzdEhhbmRsZXIgfSA9IHJlcXVpcmUoIi4vdGVzdF9oYW5kbGVyIik7CisKK2NvbnN0IHBvcnQgPSBwcm9ncmFtLnBvcnQ7Citjb25zdCBkb21haW5Tb2NrZXQgPSBwcm9ncmFtLmRvbWFpblNvY2tldDsKK2NvbnN0IHNzbCA9IHByb2dyYW0uc3NsOworCitsZXQgdHlwZSA9IHByb2dyYW0udHlwZTsKK2lmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImh0dHAiKSB7CisgIHByb2dyYW0udHJhbnNwb3J0ID0gImJ1ZmZlcmVkIjsKKyAgdHlwZSA9ICJodHRwIjsKK30KKworbGV0IG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKKyAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCit9OworCitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMuaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyOworICBvcHRpb25zLnByb2Nlc3NvciA9IFRocmlmdFRlc3Q7CisKKyAgb3B0aW9ucyA9IHsKKyAgICBzZXJ2aWNlczogeyAiL3Rlc3QiOiBvcHRpb25zIH0sCisgICAgY29yczogeworICAgICAgIioiOiB0cnVlCisgICAgfQorICB9OworfQorCitsZXQgcHJvY2Vzc29yOworaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIGNvbnN0IFNlY29uZFNlcnZpY2VIYW5kbGVyID0geworICAgIHNlY29uZHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKKyAgICAgIHJlc3VsdChudWxsLCAndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgfQorICB9OworCisgIHByb2Nlc3NvciA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlRocmlmdFRlc3QiLAorICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihUaHJpZnRUZXN0SGFuZGxlcikKKyAgKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihTZWNvbmRTZXJ2aWNlSGFuZGxlcikKKyAgKTsKK30KKworaWYgKHNzbCkgeworICBpZiAoCisgICAgdHlwZSA9PT0gInRjcCIgfHwKKyAgICB0eXBlID09PSAibXVsdGlwbGV4IiB8fAorICAgIHR5cGUgPT09ICJodHRwIiB8fAorICAgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCisgICkgeworICAgIG9wdGlvbnMudGxzID0geworICAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5rZXkiKSksCisgICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5jcnQiKSkKKyAgICB9OworICB9Cit9CisKK2xldCBzZXJ2ZXI7CitpZiAodHlwZSA9PT0gInRjcCIpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LCBUaHJpZnRUZXN0SGFuZGxlciwgb3B0aW9ucyk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIocHJvY2Vzc29yLCBvcHRpb25zKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIob3B0aW9ucyk7Cit9CisKK2lmIChkb21haW5Tb2NrZXQpIHsKKyAgc2VydmVyLmxpc3Rlbihkb21haW5Tb2NrZXQpOworfSBlbHNlIGlmICgKKyAgdHlwZSA9PT0gInRjcCIgfHwKKyAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgdHlwZSA9PT0gImh0dHAiIHx8CisgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCispIHsKKyAgc2VydmVyLmxpc3Rlbihwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5IGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5CkBAIC0wLDAgKzEsMjggQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzU2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisidXNlIHN0cmljdCI7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworCisvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKy8qanNoaW50IC1XMTAwICovCitjb25zdCBzdHJpbmdUZXN0ID0gKG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPQorICAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworLypqc2hpbnQgK1cxMDAgKi8KKworY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAobW9kdWxlLmV4cG9ydHMuc3BlY2lhbENoYXJhY3RlcnMgPQorICAncXVvdGU6ICIgYmFja3NsYXNoOicgKworICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiAvICIgKworICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiICsKKyAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXC9cYlxuXHJcdCcgKworICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKKyAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSAiXV0gXFwiIH19fXsgW1tbICcpOworCitjb25zdCBtYXBUZXN0SW5wdXQgPSAobW9kdWxlLmV4cG9ydHMubWFwVGVzdElucHV0ID0geworICBhOiAiMTIzIiwKKyAgImEgYiI6ICJ3aXRoIHNwYWNlcyAiLAorICBzYW1lOiAic2FtZSIsCisgICIwIjogIm51bWVyaWMga2V5IiwKKyAgbG9uZ1ZhbHVlOiBzdHJpbmdUZXN0LAorICBzdHJpbmdUZXN0OiAibG9uZyBrZXkiCit9KTsKKworY29uc3Qgc2ltcGxlID0gWworICBbInRlc3RWb2lkIiwgdW5kZWZpbmVkXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIlRlc3QiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIiJdLAorICBbInRlc3RTdHJpbmciLCBzdHJpbmdUZXN0XSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbInRlc3RCb29sIiwgdHJ1ZV0sCisgIFsidGVzdEJvb2wiLCBmYWxzZV0sCisgIFsidGVzdEJ5dGUiLCAxXSwKKyAgWyJ0ZXN0Qnl0ZSIsIDBdLAorICBbInRlc3RCeXRlIiwgLTFdLAorICBbInRlc3RCeXRlIiwgLTEyN10sCisgIFsidGVzdEkzMiIsIC0xXSwKKyAgWyJ0ZXN0RG91YmxlIiwgLTUuMjA5ODUyM10sCisgIFsidGVzdERvdWJsZSIsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKKyAgWyJ0ZXN0RW51bSIsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0sCisgIFsidGVzdEk2NCIsIDVdLAorICBbInRlc3RJNjQiLCAtNV0sCisgIFsidGVzdEk2NCIsIDczNDM1OTczODM2OF0sCisgIFsidGVzdEk2NCIsIC03MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMCwgMHgyMCwgMCwgMCwgMCwgMCwgMCwgMV0pKV0sIC8vIDJeNTMrMQorICBbCisgICAgInRlc3RJNjQiLAorICAgIG5ldyBJbnQ2NChuZXcgQnVmZmVyKFsweGZmLCAweGRmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkpCisgIF0sIC8vIC0yXjUzLTEKKyAgWyJ0ZXN0VHlwZWRlZiIsIDY5XQorXTsKKworY29uc3QgbWFwb3V0ID0ge307Citmb3IgKGxldCBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpIC0gMTA7Cit9CisKK2NvbnN0IGRlZXAgPSBbCisgIFsKKyAgICAidGVzdExpc3QiLAorICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjBdCisgIF0KK107CisKK2NvbnN0IGRlZXBVbm9yZGVyZWQgPSBbCisgIFsidGVzdE1hcCIsIG1hcG91dF0sCisgIFsidGVzdFNldCIsIFsxLCAyLCAzXV0sCisgIFsidGVzdFN0cmluZ01hcCIsIG1hcFRlc3RJbnB1dF0KK107CisKK2NvbnN0IG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgc3RyaW5nX3RoaW5nOiAiWmVybyIsCisgIGJ5dGVfdGhpbmc6IDEsCisgIGkzMl90aGluZzogLTMsCisgIGk2NF90aGluZzogMTAwMDAwMAorfSk7CisKK2NvbnN0IG91dDIgPSBuZXcgdHR5cGVzLlh0cnVjdDIoKTsKK291dDIuYnl0ZV90aGluZyA9IDE7CitvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKK291dDIuaTMyX3RoaW5nID0gNTsKKworY29uc3QgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0pLAorICAgIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgIHN0cmluZ190aGluZzogIkhlbGxvMiIsCisgICAgICBieXRlX3RoaW5nOiAyLAorICAgICAgaTMyX3RoaW5nOiAyLAorICAgICAgaTY0X3RoaW5nOiAyCisgICAgfSkKKyAgXQorfSk7CisKK2NvbnN0IGNyYXp5MiA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSwKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0KKyAgXQorfSk7CisKK2NvbnN0IGluc2FuaXR5ID0geworICAiMSI6IHsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6IHsgIjYiOiB7IHVzZXJNYXA6IHt9LCB4dHJ1Y3RzOiBbXSB9IH0KK307CisKK21vZHVsZS5leHBvcnRzLnNpbXBsZSA9IHNpbXBsZTsKK21vZHVsZS5leHBvcnRzLmRlZXAgPSBkZWVwOworbW9kdWxlLmV4cG9ydHMuZGVlcFVub3JkZXJlZCA9IGRlZXBVbm9yZGVyZWQ7CisKK21vZHVsZS5leHBvcnRzLm91dCA9IG91dDsKK21vZHVsZS5leHBvcnRzLm91dDIgPSBvdXQyOworbW9kdWxlLmV4cG9ydHMuY3JhenkgPSBjcmF6eTsKK21vZHVsZS5leHBvcnRzLmNyYXp5MiA9IGNyYXp5MjsKK21vZHVsZS5leHBvcnRzLmluc2FuaXR5ID0gaW5zYW5pdHk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaCBiL2xpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0ZjFmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMCwwICsxLDk4IEBACisjISAvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiBbIC1uICIkezF9IiBdOyB0aGVuCisgIENPVkVSPSR7MX07CitmaQorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK0lTVEFOQlVMPSIkRElSLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pc3RhbmJ1bC9saWIvY2xpLmpzIgorCitSRVBPUlRfUFJFRklYPSIke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0IgorCitDT1VOVD0wCisKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vbGliOiR7Tk9ERV9QQVRIfSIKKwordGVzdFNlcnZlcigpCit7CisgIGVjaG8gIiAgW0VDTUEgJDFdIFRlc3RpbmcgJDIgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQzIGFuZCB0cmFuc3BvcnQgJDQgJDUiOworICBSRVQ9MAorICBpZiBbIC1uICIke0NPVkVSfSIgXTsgdGhlbgorICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9zZXJ2ZXIuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0taGFuZGxlLXNpZ2ludCAtLSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgorICAgIENPVU5UPSQoKENPVU5UKzEpKQorICBlbHNlCisgICAgbm9kZSAke0RJUn0vc2VydmVyLmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgorICBmaQorICBTRVJWRVJQSUQ9JCEKKyAgc2xlZXAgMC4xCisgIGlmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCisgICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS0kezF9IC0tdHlwZSAkMiAtcCAkMyAtdCAkNCAkNSB8fCBSRVQ9MQorICAgIENPVU5UPSQoKENPVU5UKzEpKQorICBlbHNlCisgICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKKyAgZmkKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHdhaXQgJFNFUlZFUlBJRAorICByZXR1cm4gJFJFVAorfQorCisKK1RFU1RPSz0wCisKKyNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Citta2RpciAke0RJUn0vZ2VuLW5vZGVqcy1lczYKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJHtESVJ9L2dlbi1ub2RlanMtZXM2IC0tZ2VuIGpzOm5vZGUsZXM2ICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CisKKyN1bml0IHRlc3RzCisKK25vZGUgJHtESVJ9L2JpbmFyeS50ZXN0LmpzIHx8IFRFU1RPSz0xCitub2RlICR7RElSfS9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgfHwgVEVTVE9LPTEKKworI2ludGVncmF0aW9uIHRlc3RzCisKK2ZvciB0eXBlIGluIHRjcCBtdWx0aXBsZXggd2Vic29ja2V0IGh0dHAKK2RvCisgIGZvciBwcm90b2NvbCBpbiBjb21wYWN0IGJpbmFyeSBqc29uCisgIGRvCisgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKKyAgICBkbworICAgICAgZm9yIGVjbWFfdmVyc2lvbiBpbiBlczUgZXM2CisgICAgICBkbworICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgfHwgVEVTVE9LPTEKKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IC0tc3NsIHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLWNhbGxiYWNrIHx8IFRFU1RPSz0xCisgICAgICBkb25lCisgICAgZG9uZQorICBkb25lCitkb25lCisKKworaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbAorICBybSAtciAke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0Ki8qCisgIHJtZGlyICR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQqCitmaQorCitleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlhOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKKworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOworY29uc3QgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7Citjb25zdCB0ZXN0Q2FzZXMgPSByZXF1aXJlKCIuL3Rlc3QtY2FzZXMiKTsKKworZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KAorICAgICJOb2RlSlMgU3R5bGUgQ2FsbGJhY2sgQ2xpZW50IFRlc3RzIiwKKyAgICB7IHNraXA6IGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiIH0sCisgICAgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgICAgICAgICBjb25zdCBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOworICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pCisgICAgICApOworICAgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgICAgdGVzdENhc2VzLmRlZXBVbm9yZGVyZWQuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSkKKyAgICAgICk7CisKKyAgICAgIGNvbnN0IGFyciA9IFtdOworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICBhcnJbaV0gPSAyNTUgLSBpOworICAgICAgfQorICAgICAgbGV0IGJ1ZiA9IG5ldyBCdWZmZXIoYXJyKTsKKyAgICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1ZiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KEJ1ZmZlcikiKTsKKyAgICAgIH0pOworICAgICAgYnVmID0gbmV3IEJ1ZmZlcihhcnIpOworICAgICAgY2xpZW50LnRlc3RCaW5hcnkoYnVmLnRvU3RyaW5nKCJiaW5hcnkiKSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KHN0cmluZykiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9Cit9OworCitleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KCJQcm9taXNlIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKKyAgICAgICAgY29uc3QgZm5OYW1lID0gY1swXTsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSkKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICB9CisgICAgICB9KQorICAgICk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKQorICAgICk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdFN0cnVjdCIpKTsKKworICAgIGNsaWVudAorICAgICAgLnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5MikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RJbnNhbml0eTIiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKCkgeworICAgICAgICBhc3NlcnQuZmFpbCgidGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb24iKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0T25ld2F5KDApCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgcmVqZWN0IikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQKKyAgICAgICAgLnRlc3RJMzIoLTEpCisgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJjaGVja09mZkJ5T25lIikpOworICAgIH0sIGNhbGxiYWNrKTsKKyAgfSk7Cit9OworCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24obWFwMSwgbWFwMiwgbXNnKSB7CisgICAgY29uc3QgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworCisgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOworCisgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgeworICAgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCisgICAgICAgICAgaWYgKAorICAgICAgICAgICAgdHlwZW9mIG1hcDEgPT09ICJudW1iZXIiICYmCisgICAgICAgICAgICB0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIubGVuZ3RoID09PSA4CisgICAgICAgICAgKSB7CisgICAgICAgICAgICBjb25zdCBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09PSBuLnRvTnVtYmVyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09IG1hcDI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXAxKS5ldmVyeShmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lLCBjYWxsYmFjaykgeworICBjb25zdCByZXRyeV9saW1pdCA9IDMwOworICBjb25zdCByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgbGV0IHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgbGV0IHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYgKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKKyAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjaygKKyAgICAgICAgICAiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKworICAgICAgICAgICAgKHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwpIC8gMTAwMCArCisgICAgICAgICAgICAiIHNlY29uZHMiCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworfQorCitmdW5jdGlvbiBtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbmFtZSkgeworICAgIGFzc2VydC5lcXVhbChhY3R1YWwubGVuZ3RoLCBleHBlY3RlZC5sZW5ndGgsIG5hbWUpOworICAgIGZvciAoY29uc3QgayBpbiBhY3R1YWwpIHsKKyAgICAgIGxldCBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChjb25zdCBrMiBpbiBleHBlY3RlZCkgeworICAgICAgICBpZiAoYWN0dWFsW2tdID09PSBleHBlY3RlZFtrMl0pIHsKKyAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgdmFsdWUgIiArIGFjdHVhbFtrXSArICIgd2l0aCBrZXkgIiArIGspOworICAgICAgfQorICAgIH0KKyAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2E3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOworCitmdW5jdGlvbiBtYWtlU3luY0hhbmRsZXIoKSB7CisgIHJldHVybiBmdW5jdGlvbih0aGluZykgeworICAgIHJldHVybiB0aGluZzsKKyAgfTsKK30KKworY29uc3Qgc3luY0hhbmRsZXJzID0geworICB0ZXN0Vm9pZDogdGVzdFZvaWQsCisgIHRlc3RNYXBNYXA6IHRlc3RNYXBNYXAsCisgIHRlc3RJbnNhbml0eTogdGVzdEluc2FuaXR5LAorICB0ZXN0TXVsdGk6IHRlc3RNdWx0aSwKKyAgdGVzdEV4Y2VwdGlvbjogdGVzdEV4Y2VwdGlvbiwKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiB0ZXN0TXVsdGlFeGNlcHRpb24sCisgIHRlc3RPbmV3YXk6IHRlc3RPbmV3YXkKK307CisKK2Z1bmN0aW9uIG1ha2VBc3luY0hhbmRsZXIobGFiZWwpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICB0aGluZyA9IHN5bmNIYW5kbGVyc1tsYWJlbF0odGhpbmcpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH07Cit9CisKK2NvbnN0IGFzeW5jSGFuZGxlcnMgPSB7CisgIHRlc3RWb2lkOiB0ZXN0Vm9pZEFzeW5jLAorICB0ZXN0TXVsdGk6IHRlc3RNdWx0aUFzeW5jLAorICB0ZXN0RXhjZXB0aW9uOiB0ZXN0RXhjZXB0aW9uQXN5bmMsCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMsCisgIHRlc3RPbmV3YXk6IHRlc3RPbmV3YXlBc3luYworfTsKKworY29uc3QgaWRlbnRpdHlIYW5kbGVycyA9IFsKKyAgInRlc3RTdHJpbmciLAorICAidGVzdEJvb2wiLAorICAidGVzdEJ5dGUiLAorICAidGVzdEkzMiIsCisgICJ0ZXN0STY0IiwKKyAgInRlc3REb3VibGUiLAorICAidGVzdEJpbmFyeSIsCisgICJ0ZXN0U3RydWN0IiwKKyAgInRlc3ROZXN0IiwKKyAgInRlc3RNYXAiLAorICAidGVzdFN0cmluZ01hcCIsCisgICJ0ZXN0U2V0IiwKKyAgInRlc3RMaXN0IiwKKyAgInRlc3RFbnVtIiwKKyAgInRlc3RUeXBlZGVmIgorXTsKKworZnVuY3Rpb24gdGVzdFZvaWQoKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKK30KKworZnVuY3Rpb24gdGVzdFZvaWRBc3luYyhyZXN1bHQpIHsKKyAgcmVzdWx0KHRlc3RWb2lkKCkpOworfQorCitmdW5jdGlvbiB0ZXN0TWFwTWFwKCkgeworICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgY29uc3QgcG9zID0gW107CisgIGNvbnN0IG5lZyA9IFtdOworICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgIHBvc1tpXSA9IGk7CisgICAgbmVnWy1pXSA9IC1pOworICB9CisgIG1hcG1hcFs0XSA9IHBvczsKKyAgbWFwbWFwWy00XSA9IG5lZzsKKworICByZXR1cm4gbWFwbWFwOworfQorCitmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoYXJndW1lbnQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEluc2FuaXR5KCcpOworICAvL2NvbnNvbGUubG9nKGFyZ3VtZW50KTsKKyAgLy9jb25zb2xlLmxvZygnKScpOworCisgIGNvbnN0IGZpcnN0X21hcCA9IFtdOworICBjb25zdCBzZWNvbmRfbWFwID0gW107CisKKyAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworCisgIGNvbnN0IGluc2FuZSA9IFtdOworICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgLy9jb25zb2xlLmxvZygnaW5zYW5lIHJlc3VsdDonKTsKKyAgLy9jb25zb2xlLmxvZyhpbnNhbmUpOworICByZXR1cm4gaW5zYW5lOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMikgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOworCisgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICByZXR1cm4gaGVsbG87Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgeworICBjb25zdCBoZWxsbyA9IHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgcmVzdWx0KG51bGwsIGhlbGxvKTsKK30KKworZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbihhcmcpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOworICBpZiAoYXJnID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgeC5tZXNzYWdlID0gYXJnOworICAgIHRocm93IHg7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorfQorCitmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uQXN5bmMoYXJnLCByZXN1bHQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOworICBpZiAoYXJnID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgeC5tZXNzYWdlID0gYXJnOworICAgIHJlc3VsdCh4KTsKKyAgfSBlbHNlIGlmIChhcmcgPT09ICJURXhjZXB0aW9uIikgeworICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQobnVsbCk7CisgIH0KK30KKworZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICB0aHJvdyB4OworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICB0aHJvdyB4MjsKKyAgfQorCisgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICByZXR1cm4gcmVzOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhhcmcwLCBhcmcxLCByZXN1bHQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICByZXN1bHQoeCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgIHJlc3VsdCh4Mik7CisgIH0gZWxzZSB7CisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgfQorfQorCisvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworZnVuY3Rpb24gdGVzdE9uZXdheSgpIHt9CisKK2Z1bmN0aW9uIHRlc3RPbmV3YXlBc3luYyhzbGVlcEZvcikgeworICB0ZXN0T25ld2F5KHNsZWVwRm9yKTsKK30KKworaWRlbnRpdHlIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIHN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlU3luY0hhbmRsZXIobGFiZWwpOworICBhc3luY0hhbmRsZXJzW2xhYmVsXSA9IG1ha2VBc3luY0hhbmRsZXIobGFiZWwpOworfSk7CisKK1sidGVzdE1hcE1hcCIsICJ0ZXN0SW5zYW5pdHkiXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIGFzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCk7Cit9KTsKKworZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzLy5naXRpZ25vcmUgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYmE4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0ZXN0LWNvbXBpbGVkLwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy9NYWtlZmlsZS5hbSBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE2NDBjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV2UgY2FsbCBucG0gdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcworCitzdHViczogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgdGVzdC1jb21waWxlZAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlLHRzIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAmJiAkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LWNvbXBpbGVkICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCit0cy1jb21waWxlOiBzdHVicworCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkuLi8uLi9ub2RlX21vZHVsZXMvdHlwZXNjcmlwdC9iaW4vdHNjIC0tb3V0RGlyIHRlc3QtY29tcGlsZWQvIC0tcHJvamVjdCB0ZXN0L3RzY29uZmlnLmpzb24KKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMgdHMtY29tcGlsZQorCitwcmVjcm9zczogZGVwcyBzdHVicyB0cy1jb21waWxlCisKK2NoZWNrOiBkZXBzIHRzLWNvbXBpbGUKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSBydW4gdGVzdC10cyAmJiBjZCBsaWIvbm9kZXRzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisJJChSTSkgLXIgdGVzdC1jb21waWxlZAorCitFWFRSQV9ESVNUID0gXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhM2MyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QiKTsKK2ltcG9ydCB0ZXN0X2RyaXZlciA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKTsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyID0gdGVzdF9kcml2ZXIuVGhyaWZ0VGVzdERyaXZlcjsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXJQcm9taXNlOworCisvLyB2YXIgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworaW1wb3J0ICogYXMgcHJvZ3JhbSBmcm9tICJjb21tYW5kZXIiOworCitwcm9ncmFtCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0tcHJvbWlzZSIsICJ0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLXByb3RvY29sIiwgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeSkgW3Byb3RvY29sXSIpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCit2YXIgcG9ydDogbnVtYmVyID0gcHJvZ3JhbS5wb3J0OwordmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7CisKK3ZhciBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IFRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiBUaHJpZnQuVEJpbmFyeVByb3RvY29sCit9OworCit2YXIgdGVzdERyaXZlciA9IHByb21pc2UgPyBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA6IFRocmlmdFRlc3REcml2ZXI7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIHBvcnQsIG9wdGlvbnMpOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycjogc3RyaW5nKSB7CisgICAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFRocmlmdFRlc3QuQ2xpZW50LCBjb25uZWN0aW9uKTsKK3J1blRlc3RzKCk7CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkgeworICB0ZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24gKHN0YXR1czogc3RyaW5nKSB7CisgICAgY29uc29sZS5sb2coc3RhdHVzKTsKKyAgICBwcm9jZXNzLmV4aXQoMCk7CisgIH0pOworfQorCitleHBvcnRzLmV4cHJlc3NvVGVzdCA9IGZ1bmN0aW9uKCkge307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDVlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApAQCAtMCwwICsxLDE4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJCoKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2ggYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZWU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorfQorY29tcGlsZQorCitub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkKgorCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTUzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCkBAIC0wLDAgKzEsMjYgQEAKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7CitpbXBvcnQgdGVzdF9oYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKTsKKworCitwcm9ncmFtCisgIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCcsIDkwOTApCisgIC5vcHRpb24oJy0tcHJvbWlzZScsICd0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMnKQorICAub3B0aW9uKCctLXByb3RvY29sJywgJyJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iJykKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7CisKK3ZhciBvcHRpb25zOiB0aHJpZnQuU2VydmVyT3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHNlcnZlcjogdGhyaWZ0LlNlcnZlcjsKK2lmIChwcm9ncmFtLnByb21pc2UpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5Bc3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfSBlbHNlIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5TeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKSwgb3B0aW9ucyk7Cit9CitzZXJ2ZXIubGlzdGVuKHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc0MGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKQEAgLTAsMCArMSwxMTMgQEAKKyd1c2Ugc3RyaWN0JzsKKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7CisKKy8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorLypqc2hpbnQgLVcxMDAgKi8KK2V4cG9ydCB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKy8qanNoaW50ICtXMTAwICovCisKK2V4cG9ydCB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKworICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKKworZXhwb3J0IHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAorICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKK307CisKK2V4cG9ydCB2YXIgc2ltcGxlID0gWworICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKKyAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKKyAgWyd0ZXN0U3RyaW5nJywgJyddLAorICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKKyAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbJ3Rlc3RCeXRlJywgMV0sCisgIFsndGVzdEJ5dGUnLCAwXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xMjddLAorICBbJ3Rlc3RJMzInLCAtMV0sCisgIFsndGVzdERvdWJsZScsIC01LjIwOTg1MjNdLAorICBbJ3Rlc3REb3VibGUnLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsndGVzdEVudW0nLCB0dHlwZXMuTnVtYmVyei5PTkVdCitdOworCitleHBvcnQgdmFyIHNpbXBsZUxvb3NlID0gWworICBbJ3Rlc3RJNjQnLCA1XSwKKyAgWyd0ZXN0STY0JywgLTVdLAorICBbJ3Rlc3RJNjQnLCA3MzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0VHlwZWRlZicsIDY5XQorXQorCit2YXIgbWFwb3V0OiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0ge307Citmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpLTEwOworfQorCitleHBvcnQgdmFyIGRlZXAgPSBbCisgIFsndGVzdE1hcCcsIG1hcG91dF0sCisgIFsndGVzdFNldCcsIFsxLDIsM11dLAorICBbJ3Rlc3RMaXN0JywgWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwXV0sCisgIFsndGVzdFN0cmluZ01hcCcsIG1hcFRlc3RJbnB1dF0KK107CisKK2V4cG9ydCB2YXIgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoeworICBzdHJpbmdfdGhpbmc6ICdaZXJvJywKKyAgYnl0ZV90aGluZzogMSwKKyAgaTMyX3RoaW5nOiAtMywKKyAgaTY0X3RoaW5nOiAxMDAwMDAwCit9KTsKKworZXhwb3J0IHZhciBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CitvdXQyLmJ5dGVfdGhpbmcgPSAxOworb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CitvdXQyLmkzMl90aGluZyA9IDU7CisKK2V4cG9ydCB2YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCisgICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKKyAgICAgICJieXRlX3RoaW5nIjo0LAorICAgICAgImkzMl90aGluZyI6NCwKKyAgICAgICJpNjRfdGhpbmciOjQKKyAgICB9KSwgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCisgICAgICAiYnl0ZV90aGluZyI6MiwKKyAgICAgICJpMzJfdGhpbmciOjIsCisgICAgICAiaTY0X3RoaW5nIjoyCisgICAgfSldCit9KTsKKworZXhwb3J0IHZhciBpbnNhbml0eTogYW55ID0geworICAiMSI6eyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCisgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjp7fSwgInh0cnVjdHMiOltdIH0gfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCisgIHRzYyAtLW91dERpciAkQ09NUElMRURESVIgLS1wcm9qZWN0ICRESVIvdHNjb25maWcuanNvbgorfQorY29tcGlsZQorCit0ZXN0U2VydmVyKCkKK3sKKyAgZWNobyAic3RhcnQgc2VydmVyICQxIgorICBSRVQ9MAorICBub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkMSAmCisgIFNFUlZFUlBJRD0kIQorICBzbGVlcCAxCisgIGVjaG8gInN0YXJ0IGNsaWVudCAkMSIKKyAgbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJDEgfHwgUkVUPTEKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHJldHVybiAkUkVUCit9CisKKyNpbnRlZ3JhdGlvbiB0ZXN0cworCit0ZXN0U2VydmVyIHx8IFRFU1RPSz0xCit0ZXN0U2VydmVyIC0tcHJvbWlzZSB8fCBURVNUT0s9MQorCitleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQxNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyAvLyBUaGlzIGlzIHRoZSBOb2RlLmpzIHRlc3QgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAorIC8vIHRlc3Qgc2VydmljZS4gVGhlIGRyaXZlciBpbnZva2VzIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlCisgLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKyAvLworIC8vIFRoZSBUaHJpZnRUZXN0RHJpdmVyIGZ1bmN0aW9uIHJlcXVpcmVzIGEgY2xpZW50IG9iamVjdAorIC8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorIC8vIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoCisgLy8gYSBzdGF0dXMgbWVzc2FnZSB3aGVuIHRoZSB0ZXN0IGlzIGNvbXBsZXRlLgorCitpbXBvcnQgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcyIpOworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFEgPSB0aHJpZnQuUTsKK2ltcG9ydCBURXhjZXB0aW9uID0gdGhyaWZ0LlRocmlmdC5URXhjZXB0aW9uOwordmFyIEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworaW1wb3J0IHRlc3RDYXNlcyA9IHJlcXVpcmUoIi4vdGVzdC1jYXNlcyIpOworCitleHBvcnQgZnVuY3Rpb24gVGhyaWZ0VGVzdERyaXZlcihjbGllbnQ6IFRocmlmdFRlc3QuQ2xpZW50LCBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdGVzdCgiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgdmFyIGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbjogKGE6IGFueSwgYjogYW55LCBtc2c/OiBzdHJpbmcpID0+IHZvaWQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjOiAoc3RyaW5nIHwgYW55KVtdKSB7CisgICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAoPGFueT5jbGllbnQpW2ZuTmFtZV0oZXhwZWN0ZWQsIGZ1bmN0aW9uKGVycjogYW55LCBhY3R1YWw6IGFueSkgeworICAgICAgICAgIGFzc2VydC5lcnJvcihlcnIsIGZuTmFtZSArICI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgfSkKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIHZhciBleHBlY3RlZDogdHlwZW9mIHJlc3BvbnNlID0geworICAgICAgICAiNCI6IHsiMSI6MSwgIjIiOjIsICIzIjozLCAiNCI6NH0sCisgICAgICAgICItNCI6IHsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfQorICAgICAgfTsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbChleHBlY3RlZCwgcmVzcG9uc2UsICJ0ZXN0TWFwTWFwIik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdFN0cnVjdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TmVzdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEsICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIGNvZGUnKTsKKyAgICAgIGFzc2VydC5lcXVhbCgnWGNlcHRpb24nLCBlcnIubWVzc2FnZSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgbWVzc2FnZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE9uZXdheTogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXNwb25zZSwgdW5kZWZpbmVkLCAndGVzdE9uZXdheTogdm9pZCByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSwgY2FsbGJhY2spOworCisgIH0pOworfTsKKworZXhwb3J0IGZ1bmN0aW9uIFRocmlmdFRlc3REcml2ZXJQcm9taXNlKGNsaWVudDogVGhyaWZ0VGVzdC5DbGllbnQsIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB0ZXN0KCJRIFByb21pc2UgQ2xpZW50IFRlc3RzIiwgZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgZnVuY3Rpb24gZmFpbChtc2c6IHN0cmluZykgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yLCByZXNwb25zZSkgeworICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHsKKyAgICAgICAgICBhc3NlcnQuZmFpbChtc2cpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuOiAoYTogYW55LCBiOiBhbnksIG1zZz86IHN0cmluZykgPT4gdm9pZCkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGM6IChzdHJpbmcgfCBhbnkpW10pIHsKKyAgICAgICAgdmFyIGZuTmFtZSA9IGNbMF07CisgICAgICAgIHZhciBleHBlY3RlZCA9IGNbMV07CisgICAgICAgICg8YW55PmNsaWVudClbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWw6IGFueSkgeworICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgICB9KQorICAgICAgICAgIC5mYWlsKGZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0U3RydWN0IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEluc2FuaXR5IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBmYWlsKCJ0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgZmFpbCgidGVzdEV4Y2VwdGlvbjogWGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbik7CisgICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKCJYY2VwdGlvbiIsIGVyci5tZXNzYWdlKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkCisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEV4Y2VwdGlvbiIpKTsKKworICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgYW5zd2VyIikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJMzIoLTEpKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pCisgICAgICAgIC5mYWlsKGZhaWwoImNoZWNrT2ZmQnlPbmUiKSk7CisgICAgfSwgY2FsbGJhY2spOworICB9KTsKK307CisKKworLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Z1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQ6IHRlc3QuVGVzdCkgeworCisgIHJldHVybiBmdW5jdGlvbiAobWFwMTogYW55LCBtYXAyOiBhbnksIG1zZzogc3RyaW5nKSB7CisgICAgdmFyIGVxdWFsID0gdHJ1ZTsKKworICAgIHZhciBlcXVhbCA9IGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMik7CisKKyAgICBhc3NlcnQub2soZXF1YWwsIG1zZyk7CisKKyAgICAvLyBkZWVwRXF1YWwgZG9lc24ndCB3b3JrIHdpdGggZmllbGRzIHVzaW5nIG5vZGUtaW50NjQKKyAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDE6IGFueSwgbWFwMjogYW55KSA6IGJvb2xlYW4geworICAgICAgaWYgKCEodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgLy9IYW5kbGUgaW50NjQgdHlwZXMgKHdoaWNoIHVzZSBub2RlLWludDY0IGluIE5vZGUuanMgSmF2YVNjcmlwdCkKKyAgICAgICAgaWYgKCh0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIpICYmICh0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIpICYmCisgICAgICAgICAgICAobWFwMi5idWZmZXIpICYmIChtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOCkpIHsKKyAgICAgICAgICB2YXIgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIG1hcDEgPT09IG4udG9OdW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwMSkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQsIGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdmFyIHJldHJ5X2xpbWl0ID0gMzA7CisgIHZhciByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgdmFyIHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgdmFyIHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYodGVzdF9jb21wbGV0ZSAmJiBjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2soIlNlcnZlciBzdWNjZXNzZnVsbHkgdGVzdGVkISIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKytyZXRyeXMgPCByZXRyeV9saW1pdCkgeworICAgICAgICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CisgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4NTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzIik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBRID0gcmVxdWlyZSgicSIpOworCisKK2V4cG9ydCBjbGFzcyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICB0ZXN0Vm9pZCgpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICAvL2NvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZTx2b2lkPih1bmRlZmluZWQpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlcikgeworICAgIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmV0dXJuIFEucmVzb2x2ZShtYXBtYXApOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5KTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBhbnk7IH0+IHsKKyAgICBjb25zdCBmaXJzdF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKyAgCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKyAgCisgICAgY29uc3QgaW5zYW5lOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIHJldHVybiBRLnJlc29sdmUoaW5zYW5lKTsKKyAgfQorICB0ZXN0TXVsdGkoYXJnMDogYW55LCBhcmcxOiBudW1iZXIsIGFyZzI6IG51bWJlciwgYXJnMzogeyBbazogbnVtYmVyXTogc3RyaW5nOyB9LCBhcmc0OiB0dHlwZXMuTnVtYmVyeiwgYXJnNTogbnVtYmVyKSB7CisgICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmV0dXJuIFEucmVzb2x2ZShoZWxsbyk7CisgIH0KKyAgdGVzdEV4Y2VwdGlvbihhcmc6IHN0cmluZyk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgdGhyb3cgeDsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRFeGNlcHRpb24oYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICAgIH0KKyAgfQorICB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMDogc3RyaW5nLCBhcmcxOiBzdHJpbmcpIHsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHRocm93IHgyOworICAgIH0KKworICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJldHVybiBRLnJlc29sdmUocmVzKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIpIHsKKyAgfQorCisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZykgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCb29sKHRoaW5nOiBib29sZWFuKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RTdHJ1Y3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RyaW5nTWFwKHRoaW5nOiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U2V0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RMaXN0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RFbnVtKHRoaW5nOiB0dHlwZXMuTnVtYmVyeikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RUeXBlZGVmKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorfQorCitleHBvcnQgY2xhc3MgQXN5bmNUaHJpZnRUZXN0SGFuZGxlciB7CisgIHByaXZhdGUgc3luY0hhbmRsZXI6IFN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5zeW5jSGFuZGxlciA9IG5ldyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKTsKKyAgfQorCisgIHRlc3RWb2lkKGNhbGxiYWNrOiAocmVzdWx0OiB2b2lkKSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgY2FsbGJhY2sodW5kZWZpbmVkKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE1hcE1hcChoZWxsbzogbnVtYmVyLAorICAgIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9KSA9PiB2b2lkKToKKyAgICAgUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH07IH0+IHsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgY2FsbGJhY2sobnVsbCwgbWFwbWFwKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEluc2FuaXR5KGFyZ3VtZW50OiB0dHlwZXMuSW5zYW5pdHksIGNhbGxiYWNrPzogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IGFueTsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogYW55OyB9PiB7CisgICAgY29uc3QgZmlyc3RfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisgIAorICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgIAorICAgIGNvbnN0IGluc2FuZTogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCl7CisgICAgICBjYWxsYmFjayhudWxsLCBpbnNhbmUpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpKGFyZzA6IGFueSwgYXJnMTogbnVtYmVyLCBhcmcyOiBudW1iZXIsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlciwgcmVzdWx0OiBGdW5jdGlvbik6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIHZhciBoZWxsbyA9IHRoaXMuc3luY0hhbmRsZXIudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIGhlbGxvLnRoZW4oaGVsbG8gPT4gcmVzdWx0KG51bGwsIGhlbGxvKSk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcsIHJlc3VsdDogKGVycjogYW55KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgcmVzdWx0KG5ldyBUaHJpZnQuVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSwgcmVzPzogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICByZXN1bHQoeDIpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pIHsKKyAgICB0aGlzLnN5bmNIYW5kbGVyLnRlc3RPbmV3YXkoc2xlZXBGb3IpOworICB9CisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBzdHJpbmcpID0+IHZvaWQpOiBRLklQcm9taXNlPHN0cmluZz4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJvb2wodGhpbmc6IGJvb2xlYW4sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCApOiBRLklQcm9taXNlPGJvb2xlYW4+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBCdWZmZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPEJ1ZmZlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFN0cnVjdCh0aGluZzogdHR5cGVzLlh0cnVjdCwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuWHRydWN0KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdDIpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3QyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJpbmdNYXAodGhpbmc6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IHN0cmluZ106IHN0cmluZzsgfT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnosIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLk51bWJlcnopID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5OdW1iZXJ6PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24gYi9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkMDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAgICJjb21waWxlck9wdGlvbnMiOiB7CisgICAgICAgICJhbGxvd0pzIjogZmFsc2UsCisgICAgICAgICJhbHdheXNTdHJpY3QiOiB0cnVlLAorICAgICAgICAiYmFzZVVybCI6ICIuIiwKKyAgICAgICAgImRlY2xhcmF0aW9uIjogdHJ1ZSwKKyAgICAgICAgImVtaXREZWNvcmF0b3JNZXRhZGF0YSI6IHRydWUsCisgICAgICAgICJleHBlcmltZW50YWxEZWNvcmF0b3JzIjogdHJ1ZSwKKyAgICAgICAgIm1vZHVsZSI6ICJjb21tb25qcyIsCisgICAgICAgICJtb2R1bGVSZXNvbHV0aW9uIjogIm5vZGUiLAorICAgICAgICAibm9JbXBsaWNpdFRoaXMiOiB0cnVlLAorICAgICAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAorICAgICAgICAicHJlc2VydmVDb25zdEVudW1zIjogdHJ1ZSwKKyAgICAgICAgInJlbW92ZUNvbW1lbnRzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdEZ1bmN0aW9uVHlwZXMiOiB0cnVlLAorICAgICAgICAic3RyaWN0TnVsbENoZWNrcyI6IHRydWUsCisgICAgICAgICJ0YXJnZXQiOiAiZXM2IiwKKyAgICAgICAgInBhdGhzIjogeworICAgICAgICAgICAgInRocmlmdCI6IFsiLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQiXQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sLy5naXRpZ25vcmUgYi9saWIvb2NhbWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorX2J1aWxkLworX3RhZ3MKK2NvbmZpZ3VyZQorc2V0dXAuZGF0YQorc2V0dXAubWwKK215b2NhbWxidWlsZC5tbAorKi9NRVRBCisqLyoubWxsaWIKKyovKi5tbGR5bGliCitNYWtlZmlsZQorT0NhbWxNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL0RFVkVMT1BNRU5UIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvREVWRUxPUE1FTlQKQEAgLTAsMCArMSw3NiBAQAorVGhyaWZ0IE9DYW1sIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBidWlsZCB0aGlzIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBpbnN0YWxsZWQ6CisKKyAgKiBUaGUgT0NhbWwgY29tcGlsZXIsIHByZWZlcmFibHkgPjQuMDAKKyAgKiBUaGUgT2FzaXMgYnVpbGQgdG9vbAorCitJbiBhZGRpdGlvbiB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBPUEFNLCB3aGljaCB3aWxsIGFsbG93IHlvdSB0byBzZXR1cCBhbgorT0NhbWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCdzIGlzb2xhdGVkIGZyb20geW91ciBzeXN0ZW0gaW5zdGFsbGF0aW9uLAorbXVjaCBsaWtlIHZpcnV0YWxlbnYgZm9yIFB5dGhvbiBvciB0aGUgbXlyaWFkIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBSdWJ5LiBJZgoreW91IGhhdmUgT1BBTSBpbnN0YWxsZWQsIHRoZW4gaW5zdGFsbGluZyBPYXNpcyBpcyBhcyBzaW1wbGUgYXMgcnVubmluZzoKKworICAkIG9wYW0gaW5zdGFsbCBvYXNpcworCitCdWlsZGluZworLS0tLS0tLS0KKworT25jZSBhbGwgdGhlIHByZXJlcXVpc2l0ZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgJCBvYXNpcyBzZXR1cAorICAkIC4vY29uZmlndXJlCisgICQgbWFrZQorCitUaGUgYG9hc2lzIHNldHVwYCBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIE1ha2VmaWxlLAorYWxvbmcgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG9wYW0gd2lsbCB1c2UgdG8gY3JlYXRlIGFuIGluc3RhbGxhYmxlIGxpYnJhcnkuCitUaGUgY29maWd1cmUgc2NyaXB0IHdpbGwgZW5zdXJlIHRoYXQgYWxsIGJ1aWxkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBhbmQKK21ha2Ugd2lsbCBhY3R1YWxseSBidWlsZCB0aGUgbGlicmFyeS4KKworVG8gcmVtb3ZlIGZpbGVzIHRoYXQgdGhlIGNvbXBpbGVyIGdlbmVhdGVzLCBydW46CisKKyAgJCBtYWtlIGNsZWFuCisKK1RvIHJlbW92ZSB0aG9zZSBmaWxlcyBfYXMgd2VsbCBhc18gZmlsZXMgdGhhdCB0aGUgc2V0dXAgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzCitnZW5lcmF0ZXMsIHJ1bjoKKworICAkIHJtIGBjYXQgLmdpdGlnbm9yZWAKKworSW5zdGFsbGluZworLS0tLS0tLS0tLQorCitJZiB5b3UncmUgdXNpbmcgb3BhbSwgc2ltcGx5IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgJCBtYWtlIGluc3RhbGwKKworV2hpbGUgZGV2ZWxvcG1lbnQsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIHlvdXIgbGF0ZXN0IGJ1aWxkIG9uIHRoZSBzeXN0ZW0gdG8KK3Rlc3QgYWdhaW5zdCBvdGhlciBsaWJyYXJpZXMgb3IgcHJvZ3JhbXMuIFRvIGRvIHRoaXMsIHVzZToKKworICAkIG1ha2UgcmVpbnN0YWxsCisKK0Rpc3RyaWJ1dGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBkZSBmYWN0byBwcmVmZXJyZWQgbWV0aG9kIGZvciBkaXN0cmlidXRpbmcgT0NhbWwgbGlicmFyaWVzIGlzIHRocm91Z2ggdGhlCitPUEFNIHBhY2thZ2UgcmVwb3NpdG9yeS4gVG8gcHVibGlzaCB0aGUgbGF0ZXN0IHBhY2thZ2UsIGlzc3VlIGEgcHVsbCByZXF1ZXN0CithZ2FpbnN0IHRoZSBmb2xsb3dpbmcgZ2l0aHViIHJlcG9zaXRvcnk6CisKKyAgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeQorCitUaGUgcHVsbCByZXF1ZXN0aW9uIHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBmaWxlczoKKworICBwYWNrYWdlCisgICAgfF9fdGhyaWZ0CisgICAgICAgfF9fdGhyaWZ0LjxWRVJTSU9OPgorICAgICAgICAgIHxfXyBkZXNjcgorICAgICAgICAgIHxfXyBvcGFtCisgICAgICAgICAgfF9fIHVybAorCitUZW1wbGF0ZXMgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBvcGFtLyBzdWJkaXJlY3Rvcnkgb2YKK3RoaXMgbGlicmFyeSdzIHJvb3QsIHdpdGggWFhYKC4uLikgaW5kaWNhdGluZyBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZAorb3V0LiBZb3UgY2FuIGZpbmQgZnVydGhlciBkb2N1bWVudGF0aW9uIGhlcmU6CisKKyAgaHR0cDovL29wYW0ub2NhbWwub3JnL2RvYy9QYWNrYWdpbmcuaHRtbApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL01ha2VmaWxlIGIvbGliL29jYW1sL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJlZWU3Li4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1hbGw6Ci0JY2Qgc3JjOyBtYWtlOyBjZCAuLgotY2xlYW46Ci0JY2Qgc3JjOyBtYWtlIGNsZWFuOyBjZCAuLgpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTI1Mi4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWxNYWtlZmlsZQotIyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBNYXJrdXMgTW90dGwKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1cGRhdGVzIHNlZToKLSMgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNb2RpZmllZCBieSBkYW1pZW4gZm9yIC5nbGFkZS5tbCBjb21waWxhdGlvbgotCi0jIFNldCB0aGVzZSB2YXJpYWJsZXMgdG8gdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2VzIHRvIGJlIHByb2Nlc3NlZCBhbmQKLSMgdGhlIHJlc3VsdCB2YXJpYWJsZS4gT3JkZXIgbWF0dGVycyBkdXJpbmcgbGlua2FnZSEKLQotaWZuZGVmIFNPVVJDRVMKLSAgU09VUkNFUyA6PSBmb28ubWwKLWVuZGlmCi1leHBvcnQgU09VUkNFUwotCi1pZm5kZWYgUkVTX0NMSUJfU1VGCi0gIFJFU19DTElCX1NVRiA6PSBfc3R1YnMKLWVuZGlmCi1leHBvcnQgUkVTX0NMSUJfU1VGCi0KLWlmbmRlZiBSRVNVTFQKLSAgUkVTVUxUIDo9IGZvbwotZW5kaWYKLWV4cG9ydCBSRVNVTFQgOj0gJChzdHJpcCAkKFJFU1VMVCkpCi0KLWV4cG9ydCBMSUJfUEFDS19OQU1FCi0KLWlmbmRlZiBET0NfRklMRVMKLSAgRE9DX0ZJTEVTIDo9ICQoZmlsdGVyICUubWxpLCAkKFNPVVJDRVMpKQotZW5kaWYKLWV4cG9ydCBET0NfRklMRVMKLUZJUlNUX0RPQ19GSUxFIDo9ICQoZmlyc3R3b3JkICQoRE9DX0ZJTEVTKSkKLQotZXhwb3J0IEJDU1VGRklYCi1leHBvcnQgTkNTVUZGSVgKLQotaWZuZGVmIFRPUFNVRkZJWAotICBUT1BTVUZGSVggOj0gLnRvcAotZW5kaWYKLWV4cG9ydCBUT1BTVUZGSVgKLQotIyBFdmVudHVhbGx5IHNldCBpbmNsdWRlLSBhbmQgbGlicmFyeS1wYXRocywgbGlicmFyaWVzIHRvIGxpbmssCi0jIGFkZGl0aW9uYWwgY29tcGlsYXRpb24tLCBsaW5rLSBhbmQgb2NhbWx5YWNjLWZsYWdzCi0jIFBhdGgtIGFuZCBsaWJyYXJ5IGluZm9ybWF0aW9uIG5lZWRzIG5vdCBiZSB3cml0dGVuIHdpdGggIi1JIiBhbmQgc3VjaC4uLgotIyBEZWZpbmUgVEhSRUFEUyBpZiB5b3UgbmVlZCBpdCwgb3RoZXJ3aXNlIGxlYXZlIGl0IHVuc2V0IChzYW1lIGZvcgotIyBVU0VfQ0FNTFA0KSEKLQotZXhwb3J0IFRIUkVBRFMKLWV4cG9ydCBWTVRIUkVBRFMKLWV4cG9ydCBBTk5PVEFURQotZXhwb3J0IFVTRV9DQU1MUDQKLQotZXhwb3J0IElOQ0RJUlMKLWV4cG9ydCBMSUJESVJTCi1leHBvcnQgRVhUTElCRElSUwotZXhwb3J0IFJFU1VMVERFUFMKLWV4cG9ydCBPQ0FNTF9ERUZBVUxUX0RJUlMKLQotZXhwb3J0IExJQlMKLWV4cG9ydCBDTElCUwotZXhwb3J0IENGUkFNRVdPUktTCi0KLWV4cG9ydCBPQ0FNTEZMQUdTCi1leHBvcnQgT0NBTUxOQ0ZMQUdTCi1leHBvcnQgT0NBTUxCQ0ZMQUdTCi0KLWV4cG9ydCBPQ0FNTExERkxBR1MKLWV4cG9ydCBPQ0FNTE5MREZMQUdTCi1leHBvcnQgT0NBTUxCTERGTEFHUwotCi1leHBvcnQgT0NBTUxNS0xJQl9GTEFHUwotCi1pZm5kZWYgT0NBTUxDUEZMQUdTCi0gIE9DQU1MQ1BGTEFHUyA6PSBhCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1BGTEFHUwotCi1pZm5kZWYgRE9DX0RJUgotICBET0NfRElSIDo9IGRvYwotZW5kaWYKLWV4cG9ydCBET0NfRElSCi0KLWV4cG9ydCBQUEZMQUdTCi0KLWV4cG9ydCBMRkxBR1MKLWV4cG9ydCBZRkxBR1MKLWV4cG9ydCBJRExGTEFHUwotCi1leHBvcnQgT0NBTUxET0NGTEFHUwotCi1leHBvcnQgT0NBTUxGSU5EX0lOU1RGTEFHUwotCi1leHBvcnQgRFZJUFNGTEFHUwotCi1leHBvcnQgU1RBVElDCi0KLSMgQWRkIGEgbGlzdCBvZiBvcHRpb25hbCB0cmFzaCBmaWxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGJ5ICJtYWtlIGNsZWFuIgotZXhwb3J0IFRSQVNICi0KLUVDSE8gOj0gZWNobwotCi1pZmRlZiBSRUFMTFlfUVVJRVQKLSAgZXhwb3J0IFJFQUxMWV9RVUlFVAotICBFQ0hPIDo9IHRydWUKLSAgTEZMQUdTIDo9ICQoTEZMQUdTKSAtcQotICBZRkxBR1MgOj0gJChZRkxBR1MpIC1xCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB5b3VyIE9DYW1sLWluc3RhbGxhdGlvbgotCi1pZmRlZiBNSU5HVwotICBleHBvcnQgTUlOR1cKLSAgV0lOMzIgICA6PSAxCi0gIENGTEFHU19XSU4zMiA6PSAtbW5vLWN5Z3dpbgotZW5kaWYKLWlmZGVmIE1TVkMKLSAgZXhwb3J0IE1TVkMKLSAgV0lOMzIgICA6PSAxCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBDUFBGTEFHU19XSU4zMiA6PSAtRENBTUxfRExMCi0gIGVuZGlmCi0gIENGTEFHU19XSU4zMiArPSAtbm9sb2dvCi0gIEVYVF9PQkogOj0gb2JqCi0gIEVYVF9MSUIgOj0gbGliCi0gIGlmZXEgKCQoQ0MpLGdjYykKLSAgICAjIHdvcmsgYXJvdW5kIEdOVSBNYWtlIGRlZmF1bHQgdmFsdWUKLSAgICBpZmRlZiBUSFJFQURTCi0gICAgICBDQyA6PSBjbCAtTVQKLSAgICBlbHNlCi0gICAgICBDQyA6PSBjbAotICAgIGVuZGlmCi0gIGVuZGlmCi0gIGlmZXEgKCQoQ1hYKSxnKyspCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgQ1hYIDo9ICQoQ0MpCi0gIGVuZGlmCi0gIENGTEFHX08gOj0gLUZvCi1lbmRpZgotaWZkZWYgV0lOMzIKLSAgRVhUX0NYWCA6PSBjcHAKLSAgRVhFICAgICA6PSAuZXhlCi1lbmRpZgotCi1pZm5kZWYgRVhUX09CSgotICBFWFRfT0JKIDo9IG8KLWVuZGlmCi1pZm5kZWYgRVhUX0xJQgotICBFWFRfTElCIDo9IGEKLWVuZGlmCi1pZm5kZWYgRVhUX0NYWAotICBFWFRfQ1hYIDo9IGNjCi1lbmRpZgotaWZuZGVmIEVYRQotICBFWEUgOj0gIyBlbXB0eQotZW5kaWYKLWlmbmRlZiBDRkxBR19PCi0gIENGTEFHX08gOj0gLW8gIyBkbyBub3QgZGVsZXRlIHRoaXMgY29tbWVudCAocHJlc2VydmVzIHRyYWlsaW5nIHdoaXRlc3BhY2UpIQotZW5kaWYKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLWV4cG9ydCBMREZMQUdTCi1leHBvcnQgQ1BQRkxBR1MKLQotaWZuZGVmIFJQQVRIX0ZMQUcKLSAgaWZkZWYgRUxGX1JQQVRIX0ZMQUcKLSAgICBSUEFUSF9GTEFHIDo9ICQoRUxGX1JQQVRIX0ZMQUcpCi0gIGVsc2UKLSAgICBSUEFUSF9GTEFHIDo9IC1SCi0gIGVuZGlmCi1lbmRpZgotZXhwb3J0IFJQQVRIX0ZMQUcKLQotaWZuZGVmIE1TVkMKLWlmbmRlZiBQSUNfQ0ZMQUdTCi0gIFBJQ19DRkxBR1MgOj0gLWZQSUMKLWVuZGlmCi1pZm5kZWYgUElDX0NQUEZMQUdTCi0gIFBJQ19DUFBGTEFHUyA6PSAtRFBJQwotZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBQSUNfQ0ZMQUdTCi1leHBvcnQgUElDX0NQUEZMQUdTCi0KLUJDUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKEJDU1VGRklYKSwgJChSRVNVTFQpKQotTkNSRVNVTFQgIDo9ICQoYWRkc3VmZml4ICQoTkNTVUZGSVgpLCAkKFJFU1VMVCkpCi1UT1BSRVNVTFQgOj0gJChhZGRzdWZmaXggJChUT1BTVUZGSVgpLCAkKFJFU1VMVCkpCi0KLWlmbmRlZiBPQ0FNTEZJTkQKLSAgT0NBTUxGSU5EIDo9IG9jYW1sZmluZAotZW5kaWYKLWV4cG9ydCBPQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MQwotICBPQ0FNTEMgOj0gb2NhbWxjCi1lbmRpZgotZXhwb3J0IE9DQU1MQwotCi1pZm5kZWYgT0NBTUxPUFQKLSAgT0NBTUxPUFQgOj0gb2NhbWxvcHQKLWVuZGlmCi1leHBvcnQgT0NBTUxPUFQKLQotaWZuZGVmIE9DQU1MTUtUT1AKLSAgT0NBTUxNS1RPUCA6PSBvY2FtbG1rdG9wCi1lbmRpZgotZXhwb3J0IE9DQU1MTUtUT1AKLQotaWZuZGVmIE9DQU1MQ1AKLSAgT0NBTUxDUCA6PSBvY2FtbGNwCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1AKLQotaWZuZGVmIE9DQU1MREVQCi0gIE9DQU1MREVQIDo9IG9jYW1sZGVwCi1lbmRpZgotZXhwb3J0IE9DQU1MREVQCi0KLWlmbmRlZiBPQ0FNTExFWAotICBPQ0FNTExFWCA6PSBvY2FtbGxleAotZW5kaWYKLWV4cG9ydCBPQ0FNTExFWAotCi1pZm5kZWYgT0NBTUxZQUNDCi0gIE9DQU1MWUFDQyA6PSBvY2FtbHlhY2MKLWVuZGlmCi1leHBvcnQgT0NBTUxZQUNDCi0KLWlmbmRlZiBPQ0FNTE1LTElCCi0gIE9DQU1MTUtMSUIgOj0gb2NhbWxta2xpYgotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LTElCCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDCi0gIE9DQU1MX0dMQURFQ0MgOj0gbGFibGdsYWRlY2MyCi1lbmRpZgotZXhwb3J0IE9DQU1MX0dMQURFQ0MKLQotaWZuZGVmIE9DQU1MX0dMQURFQ0NfRkxBR1MKLSAgT0NBTUxfR0xBREVDQ19GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlQKLSAgQ0FNRUxFT05fUkVQT1JUIDo9IHJlcG9ydAotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9SRVBPUlQKLQotaWZuZGVmIENBTUVMRU9OX1JFUE9SVF9GTEFHUwotICBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWQotICBDQU1FTEVPTl9aT0dHWSA6PSBjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fWk9HR1kKLQotaWZuZGVmIENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0gIENBTUVMRU9OX1pPR0dZX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0KLWlmbmRlZiBPWFJJREwKLSAgT1hSSURMIDo9IG94cmlkbAotZW5kaWYKLWV4cG9ydCBPWFJJREwKLQotaWZuZGVmIENBTUxJREwKLSAgQ0FNTElETCA6PSBjYW1saWRsCi1lbmRpZgotZXhwb3J0IENBTUxJREwKLQotaWZuZGVmIENBTUxJRExETEwKLSAgQ0FNTElETERMTCA6PSBjYW1saWRsZGxsCi1lbmRpZgotZXhwb3J0IENBTUxJRExETEwKLQotaWZuZGVmIE5PSURMSEVBREVSCi0gIE1BWUJFX0lETF9IRUFERVIgOj0gLWhlYWRlcgotZW5kaWYKLWV4cG9ydCBOT0lETEhFQURFUgotCi1leHBvcnQgTk9fQ1VTVE9NCi0KLWlmbmRlZiBDQU1MUDQKLSAgQ0FNTFA0IDo9IGNhbWxwNAotZW5kaWYKLWV4cG9ydCBDQU1MUDQKLQotaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gIGlmZGVmIFBBQ0tTCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmZGVmIFRIUkVBRFMKLQlQQUNLUyArPSB0aHJlYWRzCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gICAgZW1wdHkgOj0KLSAgICBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQotICAgIGNvbW1hIDo9ICwKLSAgICBpZmRlZiBQUkVEUwotICAgICAgUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUFJFRFMpKQotICAgICAgUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAtcHJlZGljYXRlcyAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICMgICAgT0NBTUxfREVQX1BSRURJQ0FURVMgOj0gLXN5bnRheCAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICAgICBPQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoT0NBTUxfRklORF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9ICQoT0NBTUxfREVQX1BSRURJQ0FURVMpIC1wYWNrYWdlICQoUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMpCi0gICAgZWxzZQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAtcGFja2FnZSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUEFDS1MpKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9Ci0gICAgZW5kaWYKLSAgICBPQ0FNTF9GSU5EX0xJTktQS0cgOj0gLWxpbmtwa2cKLSAgICBSRUFMX09DQU1MRklORCA6PSAkKE9DQU1MRklORCkKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBPQ0FNTF9GSU5EX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfREVQX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfRklORF9MSU5LUEtHCi1leHBvcnQgUkVBTF9PQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MRE9DCi0gIE9DQU1MRE9DIDo9IG9jYW1sZG9jCi1lbmRpZgotZXhwb3J0IE9DQU1MRE9DCi0KLWlmbmRlZiBMQVRFWAotICBMQVRFWCA6PSBsYXRleAotZW5kaWYKLWV4cG9ydCBMQVRFWAotCi1pZm5kZWYgRFZJUFMKLSAgRFZJUFMgOj0gZHZpcHMKLWVuZGlmCi1leHBvcnQgRFZJUFMKLQotaWZuZGVmIFBTMlBERgotICBQUzJQREYgOj0gcHMycGRmCi1lbmRpZgotZXhwb3J0IFBTMlBERgotCi1pZm5kZWYgT0NBTUxNQUtFRklMRQotICBPQ0FNTE1BS0VGSUxFIDo9IE9DYW1sTWFrZWZpbGUKLWVuZGlmCi1leHBvcnQgT0NBTUxNQUtFRklMRQotCi1pZm5kZWYgT0NBTUxMSUJQQVRICi0gIE9DQU1MTElCUEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKE9DQU1MQykgMj4vZGV2L251bGwgLXdoZXJlIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvb2NhbWwpCi1lbmRpZgotZXhwb3J0IE9DQU1MTElCUEFUSAotCi1pZm5kZWYgT0NBTUxfTElCX0lOU1RBTEwKLSAgT0NBTUxfTElCX0lOU1RBTEwgOj0gJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxfTElCX0lOU1RBTEwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjICBjaGFuZ2UgZm9sbG93aW5nIHNlY3Rpb25zIG9ubHkgaWYKLSMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLQotIyBkZWxldGUgdGFyZ2V0IGZpbGVzIHdoZW4gYSBidWlsZCBjb21tYW5kIGZhaWxzCi0uUEhPTlk6IC5ERUxFVEVfT05fRVJST1IKLS5ERUxFVEVfT05fRVJST1I6Ci0KLSMgZm9yIHBlZGFudHMgdXNpbmcgIi0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzIgotZXhwb3J0IE1BWUJFX0lETAotZXhwb3J0IFJFQUxfUkVTVUxUCi1leHBvcnQgQ0FNTElETEZMQUdTCi1leHBvcnQgVEhSRUFEX0ZMQUcKLWV4cG9ydCBSRVNfQ0xJQgotZXhwb3J0IE1BS0VETEwKLWV4cG9ydCBBTk5PVF9GTEFHCi1leHBvcnQgQ19PWFJJREwKLWV4cG9ydCBTVUJQUk9KUwotZXhwb3J0IENGTEFHU19XSU4zMgotZXhwb3J0IENQUEZMQUdTX1dJTjMyCi0KLUlOQ0ZMQUdTIDo9Ci0KLVNIRUxMIDo9IC9iaW4vc2gKLQotTUxERVBESVIgOj0gLl9kCi1CQ0RJRElSICA6PSAuX2JjZGkKLU5DRElESVIgIDo9IC5fbmNkaQotCi1GSUxURVJfRVhUTlMgOj0gJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLmMgJS5tICUuJChFWFRfQ1hYKSAlLnJlcCAlLnpvZyAlLmdsYWRlCi0KLUZJTFRFUkVEICAgICA6PSAkKGZpbHRlciAkKEZJTFRFUl9FWFROUyksICQoU09VUkNFUykpCi1TT1VSQ0VfRElSUyAgOj0gJChmaWx0ZXItb3V0IC4vLCAkKHNvcnQgJChkaXIgJChGSUxURVJFRCkpKSkKLQotRklMVEVSRURfUkVQIDo9ICQoZmlsdGVyICUucmVwLCAkKEZJTFRFUkVEKSkKLURFUF9SRVAgICAgICA6PSAkKEZJTFRFUkVEX1JFUDolLnJlcD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX1JFUCAgICAgOj0gJChGSUxURVJFRF9SRVA6LnJlcD0ubWwpCi0KLUZJTFRFUkVEX1pPRyA6PSAkKGZpbHRlciAlLnpvZywgJChGSUxURVJFRCkpCi1ERVBfWk9HICAgICAgOj0gJChGSUxURVJFRF9aT0c6JS56b2c9JChNTERFUERJUikvJS5kKQotQVVUT19aT0cgICAgIDo9ICQoRklMVEVSRURfWk9HOi56b2c9Lm1sKQotCi1GSUxURVJFRF9HTEFERSA6PSAkKGZpbHRlciAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLURFUF9HTEFERSAgICAgIDo9ICQoRklMVEVSRURfR0xBREU6JS5nbGFkZT0kKE1MREVQRElSKS8lLmQpCi1BVVRPX0dMQURFICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOi5nbGFkZT0ubWwpCi0KLUZJTFRFUkVEX01MICA6PSAkKGZpbHRlciAlLm1sLCAkKEZJTFRFUkVEKSkKLURFUF9NTCAgICAgICA6PSAkKEZJTFRFUkVEX01MOiUubWw9JChNTERFUERJUikvJS5kKQotCi1GSUxURVJFRF9NTEkgOj0gJChmaWx0ZXIgJS5tbGksICQoRklMVEVSRUQpKQotREVQX01MSSAgICAgIDo9ICQoRklMVEVSRURfTUxJOi5tbGk9LmRpKQotCi1GSUxURVJFRF9NTEwgOj0gJChmaWx0ZXIgJS5tbGwsICQoRklMVEVSRUQpKQotREVQX01MTCAgICAgIDo9ICQoRklMVEVSRURfTUxMOiUubWxsPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fTUxMICAgICA6PSAkKEZJTFRFUkVEX01MTDoubWxsPS5tbCkKLQotRklMVEVSRURfTUxZIDo9ICQoZmlsdGVyICUubWx5LCAkKEZJTFRFUkVEKSkKLURFUF9NTFkgICAgICA6PSAkKEZJTFRFUkVEX01MWTolLm1seT0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfTUxZOi5tbHk9LmRpKQotQVVUT19NTFkgICAgIDo9ICQoRklMVEVSRURfTUxZOi5tbHk9Lm1saSkgJChGSUxURVJFRF9NTFk6Lm1seT0ubWwpCi0KLUZJTFRFUkVEX0lETCA6PSAkKGZpbHRlciAlLmlkbCwgJChGSUxURVJFRCkpCi1ERVBfSURMICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX0lETDouaWRsPS5kaSkKLUNfSURMICAgICAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLmMpCi1pZm5kZWYgTk9JRExIRUFERVIKLSBDX0lETCArPSAkKEZJTFRFUkVEX0lETDouaWRsPS5oKQotZW5kaWYKLU9CSl9DX0lETCAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLiQoRVhUX09CSikpCi1BVVRPX0lETCAgICAgOj0gJChGSUxURVJFRF9JREw6LmlkbD0ubWxpKSAkKEZJTFRFUkVEX0lETDouaWRsPS5tbCkgJChDX0lETCkKLQotRklMVEVSRURfT1hSSURMIDo9ICQoZmlsdGVyICUub3hyaWRsLCAkKEZJTFRFUkVEKSkKLURFUF9PWFJJREwgICAgICA6PSAkKEZJTFRFUkVEX09YUklETDolLm94cmlkbD0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9LmRpKQotQVVUT19PWFJJREwgICAgIDo9ICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1saSkgJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0ubWwpICQoQ19PWFJJREwpCi0KLUZJTFRFUkVEX0NfQ1hYIDo9ICQoZmlsdGVyICUuYyAlLm0gJS4kKEVYVF9DWFgpLCAkKEZJTFRFUkVEKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoRklMVEVSRURfQ19DWFg6LmM9LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDoubT0uJChFWFRfT0JKKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoT0JKX0NfQ1hYOi4kKEVYVF9DWFgpPS4kKEVYVF9PQkopKQotCi1QUkVfVEFSR0VUUyAgKz0gJChBVVRPX01MTCkgJChBVVRPX01MWSkgJChBVVRPX0lETCkgJChBVVRPX09YUklETCkgJChBVVRPX1pPRykgJChBVVRPX1JFUCkgJChBVVRPX0dMQURFKQotCi1BTExfREVQUyAgICAgOj0gJChERVBfTUwpICQoREVQX01MSSkgJChERVBfTUxMKSAkKERFUF9NTFkpICQoREVQX0lETCkgJChERVBfT1hSSURMKSAkKERFUF9aT0cpICQoREVQX1JFUCkgJChERVBfR0xBREUpCi0KLU1MREVQUyAgICAgICA6PSAkKGZpbHRlciAlLmQsICQoQUxMX0RFUFMpKQotTUxJREVQUyAgICAgIDo9ICQoZmlsdGVyICUuZGksICQoQUxMX0RFUFMpKQotQkNERVBJUyAgICAgIDo9ICQoTUxJREVQUzolLmRpPSQoQkNESURJUikvJS5kaSkKLU5DREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKE5DRElESVIpLyUuZGkpCi0KLUFMTE1MICAgICAgICA6PSAkKGZpbHRlciAlLm1saSAlLm1sICUubWxsICUubWx5ICUuaWRsICUub3hyaWRsICUucmVwICUuem9nICUuZ2xhZGUsICQoRklMVEVSRUQpKQotCi1JTVBMT19JTlRGICAgOj0gJChBTExNTDolLm1saT0lLm1saS5fXykKLUlNUExPX0lOVEYgICA6PSAkKGZvcmVhY2ggZmlsZSwgJChJTVBMT19JTlRGKSwgXAotICAgICAgICAgICAgICAgICAgJChiYXNlbmFtZSAkKGZpbGUpKS5jbWkgJChiYXNlbmFtZSAkKGZpbGUpKS5jbW8pCi1JTVBMT19JTlRGICAgOj0gJChmaWx0ZXItb3V0ICUubWxpLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExPX0lOVEYgICA6PSAkKElNUExPX0lOVEY6JS5tbGkuY21pPSUuY21pKQotCi1JTVBMWF9JTlRGICAgOj0gJChJTVBMT19JTlRGOi5jbW89LmNteCkKLQotSU5URiAgICAgICAgIDo9ICQoZmlsdGVyICUuY21pLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTU8gICAgIDo9ICQoZmlsdGVyICUuY21vLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTVggICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uY214KQotSU1QTF9BU00gICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uYXNtKQotSU1QTF9TICAgICAgIDo9ICQoSU1QTF9DTU86LmNtbz0ucykKLQotT0JKX0xJTksgICAgIDo9ICQoT0JKX0NfSURMKSAkKE9CSl9DX0NYWCkKLU9CSl9GSUxFUyAgICA6PSAkKElNUExfQ01POi5jbW89LiQoRVhUX09CSikpICQoT0JKX0xJTkspCi0KLUVYRUNTICAgICAgICA6PSAkKGFkZHN1ZmZpeCAkKEVYRSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNvcnQgJChUT1BSRVNVTFQpICQoQkNSRVNVTFQpICQoTkNSRVNVTFQpKSkKLWlmZGVmIFdJTjMyCi0gIEVYRUNTICAgICAgKz0gJChCQ1JFU1VMVCkuZGxsICQoTkNSRVNVTFQpLmRsbAotZW5kaWYKLQotQ0xJQl9CQVNFICAgIDo9ICQoUkVTVUxUKSQoUkVTX0NMSUJfU1VGKQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgUkVTX0NMSUIgICAgIDo9IGxpYiQoQ0xJQl9CQVNFKS4kKEVYVF9MSUIpCi1lbmRpZgotCi1pZmRlZiBXSU4zMgotRExMU09OQU1FIDo9ICQoQ0xJQl9CQVNFKS5kbGwKLWVsc2UKLURMTFNPTkFNRSA6PSBkbGwkKENMSUJfQkFTRSkuc28KLWVuZGlmCi0KLU5PTkVYRUNTICAgICA6PSAkKElOVEYpICQoSU1QTF9DTU8pICQoSU1QTF9DTVgpICQoSU1QTF9BU00pICQoSU1QTF9TKSBcCi0JCSQoT0JKX0ZJTEVTKSAkKFBSRV9UQVJHRVRTKSAkKEJDUkVTVUxUKS5jbWEgJChOQ1JFU1VMVCkuY214YSBcCi0JCSQoTkNSRVNVTFQpLiQoRVhUX0xJQikgJChCQ1JFU1VMVCkuY21pICQoQkNSRVNVTFQpLmNtbyBcCi0JCSQoTkNSRVNVTFQpLmNtaSAkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCSQoUkVTX0NMSUIpICQoSU1QTF9DTU86LmNtbz0uYW5ub3QpIFwKLQkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChMSUJfUEFDS19OQU1FKS5jbXggJChMSUJfUEFDS19OQU1FKS5vCi0KLWlmbmRlZiBTVEFUSUMKLSAgTk9ORVhFQ1MgKz0gJChETExTT05BTUUpCi1lbmRpZgotCi1pZm5kZWYgTElCSU5TVEFMTF9GSUxFUwotICBMSUJJTlNUQUxMX0ZJTEVTIDo9ICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hIFwKLQkJICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNfQ0xJQikKLSAgaWZuZGVmIFNUQVRJQwotICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gICAgICBMSUJJTlNUQUxMX0ZJTEVTICs9ICQoRExMU09OQU1FKQotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTElCSU5TVEFMTF9GSUxFUwotCi1pZmRlZiBXSU4zMgotICAjIHNvbWUgZXh0cmEgc3R1ZmYgaXMgY3JlYXRlZCB3aGlsZSBsaW5raW5nIERMTHMKLSAgTk9ORVhFQ1MgICArPSAkKEJDUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmV4cCAkKE5DUkVTVUxUKS5leHAgJChDTElCX0JBU0UpLmV4cCAkKENMSUJfQkFTRSkubGliCi1lbmRpZgotCi1UQVJHRVRTICAgICAgOj0gJChFWEVDUykgJChOT05FWEVDUykKLQotIyBJZiB0aGVyZSBhcmUgSURMLWZpbGVzCi1pZm5lcSAoJChzdHJpcCAkKEZJTFRFUkVEX0lETCkpLCkKLSAgTUFZQkVfSURMIDo9IC1jY2xpYiAtbGNhbWxpZGwKLWVuZGlmCi0KLWlmZGVmIFVTRV9DQU1MUDQKLSAgQ0FNTFA0UEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKENBTUxQNCkgLXdoZXJlIDI+L2Rldi9udWxsIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvY2FtbHA0KQotICBJTkNGTEFHUyA6PSAtSSAkKENBTUxQNFBBVEgpCi0gIENJTkNGTEFHUyA6PSAtSSQoQ0FNTFA0UEFUSCkKLWVuZGlmCi0KLURJTkNGTEFHUyA6PSAkKElOQ0ZMQUdTKSAkKFNPVVJDRV9ESVJTOiU9LUkgJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSAlKQotSU5DRkxBR1MgOj0gJChESU5DRkxBR1MpICQoSU5DRElSUzolPS1JICUpCi1DSU5DRkxBR1MgKz0gJChTT1VSQ0VfRElSUzolPS1JJSkgJChJTkNESVJTOiU9LUklKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1JJSkKLQotaWZuZGVmIE1TVkMKLSAgQ0xJQkZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tTCUpICQoTElCRElSUzolPS1MJSkgXAotICAgICAgICAgICAgICAgJChFWFRMSUJESVJTOiU9LUwlKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MJSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCksIHllcykKLSAgICBDTElCRkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LVdsLCQoUlBBVEhfRkxBRyklKQotICBlbmRpZgotZW5kaWYKLQotaWZuZGVmIFBST0ZJTElORwotICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLWVsc2UKLSAgaWZuZGVmIFRIUkVBRFMKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQ1ApIC1wICQoT0NBTUxDUEZMQUdTKQotICBlbHNlCi0gICAgIyBPQ2FtbCBkb2VzIG5vdCBzdXBwb3J0IHByb2ZpbGluZyBieXRlIGNvZGUKLSAgICAjIHdpdGggdGhyZWFkcyAoeWV0KSwgdGhlcmVmb3JlIHdlIGZvcmNlIGFuIGVycm9yLgotICAgIGlmbmRlZiBSRUFMX09DQU1MQwotICAgICAgJChlcnJvciBQcm9maWxpbmcgb2YgbXVsdGl0aHJlYWRlZCBieXRlIGNvZGUgbm90IHlldCBzdXBwb3J0ZWQgYnkgT0NhbWwpCi0gICAgZW5kaWYKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBNU1ZDCi0gIENPTU1PTl9MREZMQUdTIDo9ICQoTERGTEFHUzolPS1jY29wdCAlKSAkKFNPVVJDRV9ESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChMSUJESVJTOiU9LWNjb3B0IC1MJSkgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1jY29wdCAtTCUpKQotCi0gIGlmZXEgKCQoRUxGX1JQQVRIKSx5ZXMpCi0gICAgQ09NTU9OX0xERkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVsc2UKLSAgQ09NTU9OX0xERkxBR1MgOj0gLWNjb3B0ICIvbGluayAtTk9ERUZBVUxUTElCOkxJQkMgJChMREZMQUdTOiU9JSkgJChTT1VSQ0VfRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoTElCRElSUzolPS1MSUJQQVRIOiUpICQoRVhUTElCRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUxJQlBBVEg6JSkgIgotZW5kaWYKLQotQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliIC1sJSkgJChDRlJBTUVXT1JLUzolPS1jY2xpYiAnLWZyYW1ld29yayAlJykKLWlmZGVmIE1TVkMKLSAgaWZuZGVmIFNUQVRJQwotICAjIE1TVkMgbGlicmFyaWVzIGRvIG5vdCBoYXZlICdsaWInIHByZWZpeAotICBDTElCU19PUFRTIDo9ICQoQ0xJQlM6JT0tY2NsaWIgJS5saWIpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgT0JKU19MSUJTIDo9IC1jY2xpYiAtbCQoQ0xJQl9CQVNFKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbHNlCi0gICAgT0JKU19MSUJTIDo9ICQoT0JKX0xJTkspICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi0gIGVuZGlmCi1lbHNlCi0gIE9CSlNfTElCUyA6PSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotZW5kaWYKLQotIyBJZiB3ZSBoYXZlIHRvIG1ha2UgYnl0ZS1jb2RlCi1pZm5kZWYgUkVBTF9PQ0FNTEMKLSAgQllURV9PQ0FNTCA6PSB5Ci0KLSAgIyBFWFRSQURFUFMgaXMgYWRkZWQgZGVwZW5kZW5jaWVzIHdlIGhhdmUgdG8gaW5zZXJ0IGZvciBhbGwKLSAgIyBleGVjdXRhYmxlIGZpbGVzIHdlIGdlbmVyYXRlLiAgSWRlYWxseSBpdCBzaG91bGQgYmUgYWxsIG9mIHRoZQotICAjIGxpYnJhcmllcyB3ZSB1c2UsIGJ1dCBpdCdzIGhhcmQgdG8gZmluZCB0aGUgb25lcyB0aGF0IGdldCBzZWFyY2hlZCBvbgotICAjIHRoZSBwYXRoIHNpbmNlIEkgZG9uJ3Qga25vdyB0aGUgcGF0aHMgYnVpbHQgaW50byB0aGUgY29tcGlsZXIsIHNvCi0gICMganVzdCBpbmNsdWRlIHRoZSBvbmVzIHdpdGggc2xhc2hlcyBpbiB0aGVpciBuYW1lcy4KLSAgRVhUUkFERVBTIDo9ICQoYWRkc3VmZml4IC5jbWEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxCQ0ZMQUdTKQotCi0gIFJFQUxfT0NBTUxDIDo9ICQoSU5URl9PQ0FNTEMpCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTU8pCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTE9fSU5URikKLSAgSU1QTF9TVUYgOj0gLmNtbwotCi0gIERFUEZMQUdTICA6PQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoQkNERVBJUykKLQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgb3ZlcnJpZGUgQ0ZMQUdTIDo9ICQoUElDX0NGTEFHUykgJChDRkxBR1MpCi0gICAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gJChQSUNfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpCi0gICAgaWZuZGVmIFNUQVRJQwotICAgICAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQlNQUtFRExMIDo9ICQoRExMU09OQU1FKQotCUFMTF9MREZMQUdTIDo9IC1kbGxpYiAkKERMTFNPTkFNRSkKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBpZm5kZWYgTk9fQ1VTVE9NCi0gICAgaWZuZXEgIiQoc3RyaXAgJChPQkpfTElOSykgJChUSFJFQURTKSAkKE1BWUJFX0lETCkgJChDTElCUykgJChDRlJBTUVXT1JLUykpIiAiIgotICAgICAgQUxMX0xERkxBR1MgKz0gLWN1c3RvbQotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgQUxMX0xERkxBR1MgKz0gJChJTkNGTEFHUykgJChPQ0FNTExERkxBR1MpICQoT0NBTUxCTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKENPTU1PTl9MREZMQUdTKSAkKExJQlM6JT0lLmNtYSkKLSAgQ0FNTElETERMTEZMQUdTIDo9Ci0KLSAgaWZkZWYgVEhSRUFEUwotICAgIGlmZGVmIFZNVEhSRUFEUwotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXZtdGhyZWFkCi0gICAgZWxzZQotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIGVuZGlmCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY21hIHRocmVhZHMuY21hICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSMgd2UgaGF2ZSB0byBtYWtlIG5hdGl2ZS1jb2RlCi1lbHNlCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY214YSwkKGZvcmVhY2ggaSwkKExJQlMpLCQoaWYgJChmaW5kc3RyaW5nIC8sJChpKSksJChpKSkpKQotICBpZm5kZWYgUFJPRklMSU5HCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9Ci0gIGVsc2UKLSAgICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gLXAgJChPQ0FNTE5DRkxBR1MpCi0gICAgUExERkxBR1MgOj0gLXAKLSAgZW5kaWYKLQotICBSRUFMX0lNUEwgOj0gJChJTVBMX0NNWCkKLSAgUkVBTF9JTVBMX0lOVEYgOj0gJChJTVBMWF9JTlRGKQotICBJTVBMX1NVRiA6PSAuY214Ci0KLSAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gLUROQVRJVkVfQ09ERSAkKENQUEZMQUdTKQotCi0gIERFUEZMQUdTICA6PSAtbmF0aXZlCi0gIE1BS0VfREVQUyA6PSAkKE1MREVQUykgJChOQ0RFUElTKQotCi0gIEFMTF9MREZMQUdTIDo9ICQoUExERkxBR1MpICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICQoT0NBTUxOTERGTEFHUykgJChDT01NT05fTERGTEFHUykKLSAgQ0FNTElETERMTEZMQUdTIDo9IC1vcHQKLQotICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgIEFMTF9MREZMQUdTICs9ICQoTElCUzolPSUuY214YSkKLSAgZWxzZQotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICBlbmRpZgotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBUSFJFQURfRkxBRyA6PSAtdGhyZWFkCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY214YSB0aHJlYWRzLmNteGEgJChBTExfTERGTEFHUykKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBNQUtFX0RFUFMKLQotaWZkZWYgQU5OT1RBVEUKLSAgQU5OT1RfRkxBRyA6PSAtZHR5cGVzCi1lbHNlCi1lbmRpZgotCi1BTExfT0NBTUxDRkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSAkKE9DQU1MRkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKElOQ0ZMQUdTKSAkKFNQRUNJQUxfT0NBTUxGTEFHUykKLQotaWZkZWYgbWFrZV9kZXBzCi0gIC1pbmNsdWRlICQoTUFLRV9ERVBTKQotICBQUkVfVEFSR0VUUyA6PQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFVTRVIgUlVMRVMKLQotIyBDYWxsICJPQ2FtbE1ha2VmaWxlIFFVSUVUPSIgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIEAncy4KLVFVSUVUPUAKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIChkZWZhdWx0KQotYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLWJjOglieXRlLWNvZGUKLQotYnl0ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iY25sOglieXRlLWNvZGUtbm9saW5rCi0KLXRvcDoJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChUT1BSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jOgluYXRpdmUtY29kZQotCi1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbmw6CW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2w6CWJ5dGUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGxpYnJhcmllcwotbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNsOgluYXRpdmUtY29kZS1saWJyYXJ5Ci0KLWlmZGVmIFdJTjMyCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZGxsCi1ieXRlLWNvZGUtZGxsOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLWJjZDoJYnl0ZS1jb2RlLWRsbAotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBkbGwKLW5hdGl2ZS1jb2RlLWRsbDoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jZDoJbmF0aXZlLWNvZGUtZGxsCi1lbmRpZgotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWRlYnVnLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGM6CWRlYnVnLWNvZGUKLQotZGVidWctY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNubDoJZGVidWctY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jOglkZWJ1Zy1uYXRpdmUtY29kZQotCi1kZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbmw6CWRlYnVnLW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kY2w6CWRlYnVnLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmNsOglkZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBmb3IgcHJvZmlsaW5nCi1wcm9maWxpbmctYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiYzoJcHJvZmlsaW5nLWJ5dGUtY29kZQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZQotCi1wcm9maWxpbmctbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCVBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuYzoJcHJvZmlsaW5nLW5hdGl2ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiY2w6CXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNteGEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuY2w6CXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgcGFja3MgYnl0ZS1jb2RlIG9iamVjdHMKLXBhY2stYnl0ZS1jb2RlOgkJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKS5jbW8gXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCVBBQ0tfTElCPXllcyBtYWtlX2RlcHM9eWVzCi1wYWJjOglwYWNrLWJ5dGUtY29kZQotCi0jIHBhY2tzIG5hdGl2ZS1jb2RlIG9iamVjdHMKLXBhY2stbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoTkNSRVNVTFQpLmNteCAkKE5DUkVTVUxUKS5vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFuYzoJcGFjay1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLWh0ZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWwKLQotIyBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotbGFkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQotIyBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi1wc2RvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0KLSMgZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi1wZGZkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGYKLQotIyBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi1kb2M6IGh0ZG9jIGxhZG9jIHBzZG9jIHBkZmRvYwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTE9XIExFVkVMIFJVTEVTCi0KLSQoUkVBTF9SRVNVTFQpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotbm9saW5rOgkJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0KLWlmZGVmIFdJTjMyCi0kKFJFQUxfUkVTVUxUKS5kbGw6CSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0JCQkkKENBTUxJRExETEwpICQoQ0FNTElETERMTEZMQUdTKSAkKE9CSl9MSU5LKSAkKENMSUJTKSBcCi0JCQkJLW8gJEAgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0lJChUT1BTVUZGSVgpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MTUtUT1ApIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotLlNVRkZJWEVTOgkJLm1saSAubWwgLmNtaSAuY21vIC5jbXggLmNtYSAuY214YSAuJChFWFRfT0JKKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAubWx5IC5kaSAuZCAuJChFWFRfTElCKSAuaWRsICUub3hyaWRsIC5jIC5tIC4kKEVYVF9DWFgpIC5oIC5zbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAucmVwIC56b2cgLmdsYWRlCi0KLWlmbmRlZiBTVEFUSUMKLWlmZGVmIE1JTkdXCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChDQykgJChDRkxBR1MpICQoQ0ZMQUdTX1dJTjMyKSAkKE9CSl9MSU5LKSAtc2hhcmVkIC1vICRAIFwKLQkJCS1XbCwtLXdob2xlLWFyY2hpdmUgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS9saWIlLmEpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5hIFwKLQkJCS1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scyBcCi0JCQktV2wsLS1uby13aG9sZS1hcmNoaXZlCi1lbHNlCi1pZmRlZiBNU1ZDCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJbGluayAvTk9MT0dPIC9ETEwgL09VVDokQCAkKE9CSl9MSU5LKSBcCi0JCQkgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS8lLmxpYikpKSBcCi0JCQkgJChPQ0FNTExJQlBBVEgpL29jYW1scnVuLmxpYgotCi1lbHNlCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChPQ0FNTE1LTElCKSAkKElOQ0ZMQUdTKSAkKENMSUJGTEFHUykgXAotCQkJCS1vICQoQ0xJQl9CQVNFKSAkKE9CSl9MSU5LKSAkKENMSUJTOiU9LWwlKSAkKENGUkFNRVdPUktTOiU9LWZyYW1ld29yayAlKSBcCi0JCQkJJChPQ0FNTE1LTElCX0ZMQUdTKQotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTElCX1BBQ0tfTkFNRQotJChSRVNVTFQpLmNtYToJCSQoUkVBTF9JTVBMX0lOVEYpICQoTUFLRURMTCkgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoUkVBTF9JTVBMX0lOVEYpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi1lbHNlCi1pZmRlZiBCWVRFX09DQU1MCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbzogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY21vICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVsc2UKLSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214OiAkKFJFQUxfSU1QTF9JTlRGKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLXBhY2sgLW8gJChMSUJfUEFDS19OQU1FKS5jbXggICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLSQoUkVTVUxUKS5jbWE6CQkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbW8KLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214ICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKGZpbHRlci1vdXQgLWN1c3RvbSwgJChBTExfTERGTEFHUykpICQoT0JKU19MSUJTKSAtbyAkQCAkKExJQl9QQUNLX05BTUUpLmNteAotZW5kaWYKLQotJChSRVNfQ0xJQik6IAkJJChPQkpfTElOSykKLWlmbmRlZiBNU1ZDCi0gIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JCSAgICAgICQoQVIpIHJjcyAkQCAkKE9CSl9MSU5LKQotICBlbmRpZgotZWxzZQotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkJbGliIC1ub2xvZ28gLWRlYnVndHlwZTpjdiAtb3V0OiQoUkVTX0NMSUIpICQoT0JKX0xJTkspCi0gIGVuZGlmCi1lbmRpZgotCi0ubWxpLmNtaTogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCWVsc2UgXAotCQkJICAgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQlmaQotCi0ubWwuY21pIC5tbC4kKEVYVF9PQkopIC5tbC5jbXggLm1sLmNtbzogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwICIkJHBwICQoUFBGTEFHUykiICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotaWZkZWYgUEFDS19MSUIKLSQoUkVBTF9SRVNVTFQpLmNtbyAkKFJFQUxfUkVTVUxUKS5jbXggJChSRUFMX1JFU1VMVCkubzogJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAkKEFMTF9MREZMQUdTKSBcCi0JCQkJJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLm1sbAotCQkJJChPQ0FNTExFWCkgJChMRkxBR1MpICQ8Ci0KLS5QUkVDSU9VUzogICAgICAgICAgICAgICUubWwgJS5tbGkKLSUubWwgJS5tbGk6ICAgICAgICAgICAgICUubWx5Ci0JCQkkKE9DQU1MWUFDQykgJChZRkxBR1MpICQ8Ci0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJ3MvLiooXCpwcCBcKFteKl0qXCkgXCopLiovXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgISAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgIG12ICQqLm1sICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1sOyBcCi0JCQkgIGNhdCAkKi5tbC50ZW1wb3JhcnkgPj4gJCoubWw7IFwKLQkJCSAgcm0gJCoubWwudGVtcG9yYXJ5OyBcCi0JCQkgIG12ICQqLm1saSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQkgIGVjaG8gIigqcHAgJCRwcCAkKFBQRkxBR1MpKikiID4gJCoubWxpOyBcCi0JCQkgIGNhdCAkKi5tbGkudGVtcG9yYXJ5ID4+ICQqLm1saTsgXAotCQkJICBybSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQlmaQotCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5yZXAKLQkJCSQoQ0FNRUxFT05fUkVQT1JUKSAkKENBTUVMRU9OX1JFUE9SVF9GTEFHUykgLWdlbiAkPAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuem9nCi0JCQkkKENBTUVMRU9OX1pPR0dZKSAgJChDQU1FTEVPTl9aT0dHWV9GTEFHUykgLWltcGwgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuZ2xhZGUKLQkJCSQoT0NBTUxfR0xBREVDQykgICQoT0NBTUxfR0xBREVDQ19GTEFHUykgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpCi0lLm1sICUubWxpOgkJJS5veHJpZGwKLQkJCSQoT1hSSURMKSAkPAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpICVfc3R1YnMuYyAlLmgKLSUubWwgJS5tbGkgJV9zdHVicy5jICUuaDoJCSUuaWRsCi0JCQkkKENBTUxJREwpICQoTUFZQkVfSURMX0hFQURFUikgJChJRExGTEFHUykgXAotCQkJCSQoQ0FNTElETEZMQUdTKSAkPAotCQkJJChRVUlFVClpZiBbICQoTk9JRExIRUFERVIpIF07IHRoZW4gdG91Y2ggJCouaDsgZmkKLQotLmMuJChFWFRfT0JKKToKLQkJCSQoT0NBTUxDKSAtYyAtY2MgIiQoQ0MpIiAtY2NvcHQgIiQoQ0ZMQUdTKSBcCi0JCQkJJChDUFBGTEFHUykgJChDUFBGTEFHU19XSU4zMikgXAotCQkJCSQoQ0ZMQUdTX1dJTjMyKSAkKENJTkNGTEFHUykgJChDRkxBR19PKSRAICIgJDwKLQotLm0uJChFWFRfT0JKKToKLQkJCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0uJChFWFRfQ1hYKS4kKEVYVF9PQkopOgotCQkJJChDWFgpIC1jICQoQ1hYRkxBR1MpICQoQ0lOQ0ZMQUdTKSAkKENQUEZMQUdTKSBcCi0JCQkJLUknJChPQ0FNTExJQlBBVEgpJyBcCi0JCQkJJDwgJChDRkxBR19PKSRACi0KLSQoTUxERVBESVIpLyUuZDoJJS5tbAotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKEJDRElESVIpLyUuZGkgJChOQ0RJRElSKS8lLmRpOgklLm1saQotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSBcCi0JCQkgICAgLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sOgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwvaW5kZXguaHRtbDogJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbCAkKERPQ19GSUxFUykKLQlybSAtcmYgJDwvKgotCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkKEZJUlNUX0RPQ19GSUxFKWA7IFwKLQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXg6Ci0JbWtkaXIgLXAgJEAKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleDogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgXAotCSAgCSQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgXAotCSAgCS1vICRAOyBcCi0JZWxzZSBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wczogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleAotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChMQVRFWCkgZG9jLnRleCAmJiBcCi0JICAkKERWSVBTKSAkKERWSVBTRkxBR1MpIGRvYy5kdmkgLW8gJChARikKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBkZjogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0JY2QgJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJiYgJChQUzJQREYpICQoPEYpCi0KLWRlZmluZSBtYWtlX3N1YnByb2oKLS5QSE9OWToKLXN1YnByb2pfJCgxKToKLQkkJChldmFsICQkKGNhbGwgUFJPSl8kKDEpKSkKLQkkKFFVSUVUKWlmIFsgIiQoU1VCVEFSR0VUKSIgIT0gImFsbCIgXTsgdGhlbiBcCi0JICAkKE1BS0UpIC1mICQoT0NBTUxNQUtFRklMRSkgJChTVUJUQVJHRVQpOyBcCi0JZmkKLWVuZGVmCi0KLSQoZm9yZWFjaCBzdWJwcm9qLCQoU1VCUFJPSlMpLCQoZXZhbCAkKGNhbGwgbWFrZV9zdWJwcm9qLCQoc3VicHJvaikpKSkKLQotLlBIT05ZOgotc3VicHJvanM6ICQoU1VCUFJPSlM6JT1zdWJwcm9qXyUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAoVU4pSU5TVEFMTCBSVUxFUyBGT1IgTElCUkFSSUVTCi0KLS5QSE9OWTogbGliaW5zdGFsbAotbGliaW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSAkKExJQklOU1RBTExfRklMRVMpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1ieXRlLWNvZGUKLWxpYmluc3RhbGwtYnl0ZS1jb2RlOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGJ5dGUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNVTFQpLmNteGEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1uYXRpdmUtY29kZQotbGliaW5zdGFsbC1uYXRpdmUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBuYXRpdmUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChETExTT05BTUUpICQoUkVTVUxUKS5jbWEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGlidW5pbnN0YWxsCi1saWJ1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgcmVtb3ZlICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpCi0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiByYXdpbnN0YWxsCi1yYXdpbnN0YWxsOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGxpYnJhcnkgdG86ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JLWluc3RhbGwgLWQgJChPQ0FNTF9MSUJfSU5TVEFMTCkKLQlmb3IgaSBpbiAkKExJQklOU1RBTExfRklMRVMpOyBkbyBcCi0JICBpZiBbIC1mICQkaSBdOyB0aGVuIFwKLQkgICAgaW5zdGFsbCAtYyAtbSAwNjQ0ICQkaSAkKE9DQU1MX0xJQl9JTlNUQUxMKTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3dW5pbnN0YWxsCi1yYXd1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgZnJvbTogJChPQ0FNTF9MSUJfSU5TVEFMTClcbiIKLQljZCAkKE9DQU1MX0xJQl9JTlNUQUxMKSAmJiBybSAkKG5vdGRpciAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBNQUlOVEVOQU5DRSBSVUxFUwotCi0uUEhPTlk6CWNsZWFuCi1jbGVhbjo6Ci0Jcm0gLWYgJChUQVJHRVRTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOgljbGVhbnVwCi1jbGVhbnVwOjoKLQlybSAtZiAkKE5PTkVYRUNTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOiBjbGVhbi1kb2MKLWNsZWFuLWRvYzo6Ci0Jcm0gLXJmICQoRE9DX0RJUikvJChSRVNVTFQpCi0KLS5QSE9OWTogY2xlYW4tYWxsCi1jbGVhbi1hbGw6OiBjbGVhbiBjbGVhbi1kb2MKLQotLlBIT05ZOiBub2JhY2t1cAotbm9iYWNrdXA6Ci0Jcm0gLWYgKi5iYWsgKn4gKi5kdXAKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBiL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5N2M2NC4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotTk9URSAoYnJ5YW5kdXhidXJ5KTogT0NhbWxNYWtlZmlsZSBpcyBzYWZlIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QgYWZ0ZXIKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTEVHQUwtNTguCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gb2YgIm9jYW1sX21ha2UiCi0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDYgIE1hcmt1cyBNb3R0bCAtIGZyZWUgdG8gY29weSBhbmQgbW9kaWZ5IQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFIEFUIFlPVVIgT1dOIFJJU0shCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFUkVRVUlTSVRFUwotCi0gICAgICAgICAgICAgKioqIFlPVSBXSUxMIE5FRUQgR05VLU1BS0UgVkVSU0lPTiA+My44MCAqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudHMgb2YgdGhpcyBkaXN0cmlidXRpb24KLQotQ2hhbmdlcyAgICAgICAgLSBndWVzcyB3aGF0PyA7LSkKLQotT0NhbWxNYWtlZmlsZSAgLSBNYWtlZmlsZSBmb3IgZWFzeSBoYW5kbGluZyBvZiBjb21waWxhdGlvbiBvZiBub3Qgc28gZWFzeQotICAgICAgICAgICAgICAgICBPQ2FtbC1wcm9qZWN0cy4gIEl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgb2YgT0NhbWwtZmlsZXMKLSAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSwgaXMgYWJsZSB0byBoYW5kbGUgIm9jYW1sbGV4Ii0sCi0gICAgICAgICAgICAgICAgICJvY2FtbHlhY2MiLSwgSURMLSBhbmQgQy1maWxlcywga25vd3MgaG93IHRvIHJ1bgotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3JzIGFuZCBnZW5lcmF0ZXMgbmF0aXZlLSBvciBieXRlLWNvZGUsIGFzCi0gICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgb3IgYXMgbGlicmFyeSAtIHdpdGggdGhyZWFkLXN1cHBvcnQgaWYgeW91Ci0gICAgICAgICAgICAgICAgIHdhbnQhIFByb2ZpbGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlIGFkZGVkIG9uCi0gICAgICAgICAgICAgICAgIHRoZSBmbHkhICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgbGlicmFyaWVzLgotICAgICAgICAgICAgICAgICBBaCwgeWVzLCBhbmQgeW91IGNhbiBhbHNvIGNyZWF0ZSB0b3BsZXZlbHMgZnJvbSBhbnkKLSAgICAgICAgICAgICAgICAgc291cmNlczogdGhpcyBhbGxvd3MgeW91IGltbWVkaWF0ZSBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgotICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uIGlzIGVhc3kgZHVlIHRvCi0gICAgICAgICAgICAgICAgIGludGVncmF0aW9uIG9mIHN1cHBvcnQgZm9yIE9DYW1sZG9jLgotCi1SRUFETUUgICAgICAgICAtIHRoaXMgZmlsZQotCi1jYWxjLyAgICAgICAgICAtIERpcmVjdG9yeSBjb250YWluaW5nIGEgcXVpdGUgZnVsbHktZmVhdHVyZWQgZXhhbXBsZQotICAgICAgICAgICAgICAgICBvZiB3aGF0ICJPQ2FtbE1ha2VmaWxlIiBjYW4gZG8gZm9yIHlvdS4gVGhpcyBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG1ha2VzIHVzZSBvZiAib2NhbWxsZXgiLCAib2NhbWx5YWNjIiwgSURMICsgQyBhbmQKLSAgICAgICAgICAgICAgICAgdGhyZWFkcy4KLQotY2FtbHA0LyAgICAgICAgLSBUaGlzIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzIGZpbGVzIHdpdGggdGhlIGNhbWxwNC1wcmVwcm9jZXNzb3IuCi0KLWd0ay8gICAgICAgICAgIC0gRGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIE9DYW1sTWFrZWZpbGUgd2l0aCBHVEsKLSAgICAgICAgICAgICAgICAgYW5kIHRocmVhZHMuIENvdXJ0ZXN5IG9mIFRpbSBGcmVlbWFuIDx0aW1AZnVuZ2libGUuY29tPi4KLQotaWRsLyAgICAgICAgICAgLSBDb250YWlucyBhIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBob3cgdG8gdXNlCi0gICAgICAgICAgICAgICAgICJjYW1saWRsIiB0b2dldGhlciB3aXRoICJPQ2FtbE1ha2VmaWxlIi4gQWxzbyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICB0byBzaG93LCBob3cgZWFzeSBpdCBpcyB0byBpbnRlcmZhY2UgT0NhbWwgYW5kIEMuCi0KLXRocmVhZHMvICAgICAgIC0gVHdvIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhyZWFkcyAob3JpZ2luYWxseQotICAgICAgICAgICAgICAgICBwb3N0ZWQgYnkgWGF2aWVyIExlcm95IHNvbWUgdGltZSBhZ28pLiBTaG93cyB0aGUgdXNlIG9mCi0gICAgICAgICAgICAgICAgICJPQ2FtbE1ha2VmaWxlIiBpbiBhbiBlbnZpcm9ubWVudCBvZiBtdWx0aXBsZSBjb21waWxhdGlvbgotICAgICAgICAgICAgICAgICB0YXJnZXRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgIFdoeSBzaG91bGQgeW91IHVzZSBpdD8KLQotRm9yIHNldmVyYWwgcmVhc29uczoKLQotICAqIEl0IGlzIHdlbGwtdGVzdGVkIChJIHVzZSBpdCBpbiBhbGwgb2YgbXkgcHJvamVjdHMpLgotCi0gICogSW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBhcHByb2FjaGVzIGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMKLSAgICBjb3JyZWN0bHkgYnkgZW5zdXJpbmcgdGhhdCBhbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgT0NhbWwtZmlsZXMKLSAgICBleGlzdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvCi0gICAgZ3VhcmFudGVlIHRoYXQgIm9jYW1sZGVwIiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgKiBJdCBpcyBleHRyZW1lbHkgY29udmVuaWVudCAoYXQgbGVhc3QgSSB0aGluayBzbyA7LSkuCi0gICAgRXZlbiBxdWl0ZSBjb21wbGV4IGNvbXBpbGF0aW9uIHByb2Nlc3NlcyAoc2VlIGV4YW1wbGUgImNhbGMubWwiKQotICAgIG5lZWQgdmVyeSBsaXR0bGUgaW5mb3JtYXRpb24gdG8gd29yayBjb3JyZWN0bHkgLSBhY3R1YWxseSBqdXN0IGFib3V0Ci0gICAgdGhlIG1pbmltdW0gKGZpbGUgbmFtZXMgb2Ygc291cmNlcykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBXaGVuIHlvdSBzaG91bGRuJ3QgdXNlIGl0Li4uCi0KLUluIHByb2plY3RzIHdoZXJlIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQgbmVlZHMgZGlmZmVyZW50IGZsYWdzIC0gYnV0Ci1pbiBzdWNoIGNvbXBsaWNhdGVkIGNhc2VzIHlvdSB3aWxsIGJlIG9uIHlvdXIgb3duIGFueXdheS4gTHVja2lseSwKLXRoaXMgZG9lc24ndCBoYXBwZW4gdG9vIGZyZXF1ZW50bHkuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICBIb3cgdG8gdXNlICJPQ2FtbE1ha2VmaWxlIiBpbiB5b3VyIG93biBwcm9qZWN0Ci0gICAgICAgICAoVGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGZvciBhIHF1aWNrIGludHJvZHVjdGlvbiEpCi0KLUNyZWF0ZSB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1Ob3cgdGhlcmUgYXJlIHR3byB3YXlzIG9mIG1ha2luZyB1c2Ugb2YgIk9DYW1sTWFrZWZpbGUiOgotCi0gIDEpIEhhdmUgYSBsb29rIGF0IHRoZSBkZWZhdWx0IHNldHRpbmdzIGluICJPQ2FtbE1ha2VmaWxlIiBhbmQgc2V0Ci0gICAgIHRoZW0gdG8gdGhlIHZhbHVlcyB0aGF0IGFyZSB2YWlsZCBvbiB5b3VyIHN5c3RlbSAtIHdoZXRoZXIgdGhlCi0gICAgIHBhdGggdG8gdGhlIHN0YW5kYXJkIGxpYnJhcmllcyBpcyBvaywgd2hhdCBleGVjdXRhYmxlcyBzaGFsbCBiZQotICAgICB1c2VkLCBldGMuLi4KLQotICAyKSBDb3B5IGl0IGludG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCB0byBiZSBjb21waWxlZC4KLSAgICAgQWRkICItaW5jbHVkZSBPQ2FtbE1ha2VmaWxlIiBhcyBhIGxhc3QgbGluZSBvZiB5b3VyICJNYWtlZmlsZSIuCi0KLSAgMykgUHV0IGl0IHNvbWV3aGVyZSBlbHNlIG9uIHRoZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvCi0gICAgIHNldCBhIHZhcmlhYmxlICJPQ0FNTE1BS0VGSUxFIiBpbiB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIi4KLSAgICAgVGhpcyBpcyB0aGUgd2F5IGluIHdoaWNoIHRoZSBleGFtcGxlcyBhcmUgd3JpdHRlbjogc28geW91IG5lZWQKLSAgICAgb25seSBvbmUgdmVyc2lvbiBvZiAiT0NhbWxNYWtlZmlsZSIgdG8gbWFuYWdlIGFsbCB5b3VyIHByb2plY3RzIQotICAgICBTZWUgdGhlIGV4YW1wbGVzIGZvciBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIHVzdWFsbHkgc3BlY2lmeSB0d28gZnVydGhlciB2YXJpYWJsZXMgZm9yIHlvdXIgcHJvamVjdDoKLQotICAqIFNPVVJDRVMgIChkZWZhdWx0OiBmb28ubWwpCi0gICogUkVTVUxUICAgKGRlZmF1bHQ6IGZvbykKLQotUHV0IGFsbCB0aGUgc291cmNlcyBuZWNlc3NhcnkgZm9yIGEgdGFyZ2V0IGludG8gdmFyaWFibGUgIlNPVVJDRVMiLgotVGhlbiBzZXQgIlJFU1VMVCIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhcmdldC4gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUKLWxpYnJhcmllcywgeW91IHNob3VsZCAqbm90KiBzcGVjaWZ5IHRoZSBzdWZmaXggKCIuY21hIiwgIi5jbXhhIiwgIi5hIikKLS0gaXQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gYnVpbGQKLWEgbGlicmFyeS4KLQotICAgICAgKiogICAgICBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSAiLm1saSItZmlsZXMsIHRvbyEgICAgICAgICoqCi0gICAgICAqKiAgRG9uJ3QgZm9yZ2V0IHRoYXQgb3JkZXIgb2YgdGhlIHNvdXJjZSBmaWxlcyBtYXR0ZXJzISAgKioKLQotVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCBtYXR0ZXJzIGR1cmluZyBsaW5raW5nIGFueXdheQotZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgY2F1c2VkIGF0IHByb2dyYW0gc3RhcnR1cC4gVGhpcyBpcwotd2h5IE9DYW1sTWFrZWZpbGUgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJ0aWFsbHkgb3JkZXIgZGVwZW5kZW5jaWVzIGJ5Ci1pdHNlbGYsIHdoaWNoIG1pZ2h0IGNvbmZ1c2UgdXNlcnMgZXZlbiBtb3JlLiBJdCBqdXN0IGNvbXBpbGVzIGFuZCBsaW5rcwotT0NhbWwtc291cmNlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBldmVuIGlmIGl0IGNvdWxkCi1kZXRlcm1pbmUgYXV0b21hdGljYWxseSB0aGF0IHRoZSBvcmRlciBjYW5ub3QgYmUgY29ycmVjdC4KLQotVGhlIG1pbmltdW0gb2YgeW91ciAiTWFrZWZpbGUiIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhhdAotIk9DYW1sTWFrZWZpbGUiIGlzIGluIHRoZSBzZWFyY2ggcGF0aCBvZiAibWFrZSIpOgotCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIGNvbXBpbGUgYSBmaWxlICJmb28ubWwiIHRvIGEgYmluYXJ5Ci0iZm9vIi4KLQotT3RoZXJ3aXNlLCB5b3VyIE1ha2VmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLUJlIGNhcmVmdWwgd2l0aCB0aGUgbmFtZXMgeW91IHB1dCBpbnRvIHRoZXNlIHZhcmlhYmxlczogaWYgdGhleSBhcmUgd3JvbmcsCi1hICJtYWtlIGNsZWFuIiBtaWdodCBlcmFzZSB0aGUgd3JvbmcgZmlsZXMgLSBidXQgSSBrbm93IHlvdSB3aWxsIG5vdCBkbwotdGhhdCA7LSkKLQotQSBzaW1wbGUgIm1ha2UiIHdpbGwgZ2VuZXJhdGUgYSBieXRlLWNvZGUgZXhlY3V0YWJsZS4gSWYgeW91IHdhbnQgdG8KLWNoYW5nZSB0aGlzLCB5b3UgbWF5IGFkZCBhbiAiYWxsIi1ydWxlIHRoYXQgZ2VuZXJhdGVzIHNvbWV0aGluZyBlbHNlLgotCi1FLmcuOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICBhbGw6IG5hdGl2ZS1jb2RlLWxpYnJhcnkKLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYnVpbGQgYSBuYXRpdmUtY29kZSBsaWJyYXJ5ICJmb28uY214YSIgKCsgImZvby5hIikgZnJvbSBmaWxlCi0iZm9vLm1sIi4KLQotWW91IG1heSBldmVuIGJ1aWxkIHNldmVyYWwgdGFyZ2V0cyBhdCBvbmNlLiBUbyBwcm9kdWNlIGJ5dGUtIGFuZCBuYXRpdmUtY29kZQotZXhlY3V0YWJsZXMgd2l0aCBvbmUgIm1ha2UiLCBhZGQgdGhlIGZvbGxvd2luZyBydWxlOgotCi0gICAgYWxsOiBieXRlLWNvZGUgbmF0aXZlLWNvZGUKLQotWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciBlYWNoIG9mIHRoZXNlIHRhcmdldHMKLXNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiAoc2VlIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdwotZm9yIGRldGFpbHMpLgotCi1Zb3UgbWF5IGFsc28gdGVsbCAibWFrZSIgYXQgdGhlIGNvbW1hbmQtbGluZSB3aGF0IGtpbmQgb2YgdGFyZ2V0IHRvCi1wcm9kdWNlIChlLmcuICJtYWtlIG5jIikuICBIZXJlIGFsbCB0aGUgcG9zc2liaWxpdGllcyB3aXRoIHNob3J0Y3V0cwotYmV0d2VlbiBwYXJlbnRoZXNpczoKLQotICAgKiBieXRlLWNvZGUgICAgICAgICAgICAgICAgICAgICAoYmMpCi0gICAqIGJ5dGUtY29kZS1ub2xpbmsgICAgICAgICAgICAgIChiY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBieXRlLWNvZGUtbGlicmFyeSAgICAgICAgICAgICAoYmNsKQotICAgKiBuYXRpdmUtY29kZSAgICAgICAgICAgICAgICAgICAobmMpCi0gICAqIG5hdGl2ZS1jb2RlLW5vbGluayAgICAgICAgICAgIChuY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBuYXRpdmUtY29kZS1saWJyYXJ5ICAgICAgICAgICAobmNsKQotICAgKiBkZWJ1Zy1jb2RlICAgICAgICAgICAgICAgICAgICAoZGMpCi0gICAqIGRlYnVnLWNvZGUtbm9saW5rICAgICAgICAgICAgIChkY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBkZWJ1Zy1jb2RlLWxpYnJhcnkgICAgICAgICAgICAoZGNsKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlICAgICAgICAgICAocGJjKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkgICAocGJjbCkKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlICAgICAgICAgKHBuYykKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkgKHBuY2wpCi0gICAqIGJ5dGUtY29kZS1kbGwgICAgICAgICAgICAgICAgIChiY2QpCi0gICAqIG5hdGl2ZS1jb2RlLWRsbCAgICAgICAgICAgICAgIChuY2QpCi0gICAqIHBhY2stYnl0ZS1jb2RlICAgICAgICAgICAgICAgIChwYWJjKQotICAgKiBwYWNrLW5hdGl2ZS1jb2RlICAgICAgICAgICAgICAocGFuYykKLSAgICogdG9wbGV2ZWwgaW50ZXJwcmV0ZXIgICAgICAgICAgKHRvcCkKLSAgICogc3VicHJvanMKLQotSGVyZSBhIHNob3J0IG5vdGUgY29uY2VybmluZyBidWlsZGluZyBhbmQgbGlua2luZyBieXRlIGNvZGUgbGlicmFyaWVzCi13aXRoIEMtZmlsZXM6Ci0KLSAgT0NhbWwgbGlua3MgQy1vYmplY3QgZmlsZXMgb25seSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gYW4gZXhlY3V0YWJsZS4KLSAgQWZ0ZXIgY29tcGlsYXRpb24gdGhleSBzaG91bGQgYmUgcGxhY2VkIGluIHNvbWUgZGlyZWN0b3J5IHRoYXQgaXMgaW4KLSAgeW91ciBpbmNsdWRlIHBhdGggaWYgeW91IGxpbmsgeW91ciBsaWJyYXJ5IGFnYWluc3QgYW4gZXhlY3V0YWJsZS4KLQotICBJdCBpcyBzb21ldGltZXMgbW9yZSBjb252ZW5pZW50IHRvIGxpbmsgYWxsIEMtb2JqZWN0IGZpbGVzIGludG8gYQotICBzaW5nbGUgQy1saWJyYXJ5LiBUaGVuIHlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgbGluayBmbGFncwotICBvZiB5b3VyIGxpYnJhcnkgdXNpbmcgIi1ub2F1dG9saW5rIiBhbmQgYWRkIGFub3RoZXIgbGlua2ZsYWcgdGhhdAotICBsaW5rcyBpbiB5b3VyIEMtbGlicmFyeSBleHBsaWNpdGx5LgotCi1XaGF0IGNvbmNlcm5zIG1haW50YWluYW5jZToKLQotICAibWFrZSBjbGVhbiIgcmVtb3ZlcyBhbGwgKGFsbCEpIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzIC0gc28KLSAgYWdhaW46IG1ha2Ugc3VyZSB5b3VyIHZhcmlhYmxlcyBhcmUgb2shCi0KLSAgIm1ha2UgY2xlYW51cCIgaXMgc2ltaWxhciB0byAibWFrZSBjbGVhbiIgYnV0IGxlYXZlcyBleGVjdXRhYmxlcy4KLQotQW5vdGhlciB3YXkgdG8gZGVzdHJveSBzb21lIGltcG9ydGFudCBmaWxlcyBpcyBieSBoYXZpbmcgIk9DYW1sTWFrZWZpbGUiCi1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVhZCB0aGUgZG9jdW1lbnRhdGlvbgotYWJvdXQgdGhlIHRvb2xzIGluIHRoZSBPQ2FtbC1kaXN0cmlidXRpb24gdG8gc2VlIHdoYXQga2luZCBvZiBmaWxlcyBhcmUKLWdlbmVyYXRlZC4gIk9DYW1sTWFrZWZpbGUiIGFkZGl0aW9uYWxseSBnZW5lcmF0ZXMgKCclJyBpcyBiYXNlbmFtZSBvZgotc291cmNlIGZpbGUpOgotCi0gICVfaWRsLmMgIC0gImNhbWxpZGwiIGdlbmVyYXRlcyBhIGZpbGUgIiUuYyIgZnJvbSAiJS5pZGwiLCBidXQgdGhpcyBpcwotICAgICAgICAgICAgIG5vdCBzdWNoIGEgZ29vZCBpZGVhLCBiZWNhdXNlIHdoZW4gZ2VuZXJhdGluZyBuYXRpdmUtY29kZSwKLSAgICAgICAgICAgICBib3RoIHRoZSBmaWxlICIlLmMiIGFuZCAiJS5tbCIgd291bGQgZ2VuZXJhdGUgZmlsZXMgIiUubyIKLSAgICAgICAgICAgICB3aGljaCB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4gVGh1cywgIk9DYW1sTWFrZWZpbGUiCi0gICAgICAgICAgICAgcmVuYW1lcyAiJS5jIiB0byAiJV9pZGwuYyIgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLgotCi1UaGUgZGVwZW5kZW5jaWVzIGFyZSBzdG9yZWQgaW4gdGhyZWUgZGlmZmVyZW50IHN1YmRpcmVjdG9yaWVzIChkb3QgZGlycyk6Ci0KLSAgLl9kICAgIC0gY29udGFpbnMgZGVwZW5kZW5jaWVzIGZvciAubWwtZmlsZXMKLSAgLl9iY2RpIC0gY29udGFpbnMgYnl0ZSBjb2RlIGRlcGVuZGVuY2llcyBmb3IgLm1saS1maWxlcwotICAuX25jZGkgLSBjb250YWlucyBuYXRpdmUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLQotVGhlIGVuZGluZ3Mgb2YgdGhlIGRlcGVuZGVuY3kgZmlsZXMgYXJlOiAiJS5kIiBmb3IgdGhvc2UgZ2VuZXJhdGVkIGZyb20KLSIlLm1sIi1maWxlcywgIiUuZGkiIGZvciBvbmVzIGRlcml2ZWQgZnJvbSAiJS5tbGkiLWZpbGVzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nCi0KLSAgVGhpcyBpcyBlYXN5OiBpZiB5b3UgZGlzY292ZXIgYSBidWcsIGp1c3QgZG8gYSAibWFrZSBjbGVhbjsgbWFrZSBkYyIKLSAgdG8gcmVjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhlbiB5b3UgY2FuCi0gIGltbWVkaWF0ZWx5IGFwcGx5ICJvY2FtbGRlYnVnIiB0byB0aGUgZXhlY3V0YWJsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGluZwotCi0gIEZvciBnZW5lcmF0aW5nIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aCAib2NhbWxwcm9mIiAoYnl0ZSBjb2RlKQotICBvciAiZ3Byb2YiIChuYXRpdmUgY29kZSksIGNvbXBpbGUgeW91ciBwcm9qZWN0IHdpdGggb25lIG9mIHRoZSBwcm9maWxpbmcKLSAgdGFyZ2V0cyAoc2VlIHRhcmdldHMgYWJvdmUpLiBFLmcuOgotCi0gICAgKiAibWFrZSBwYmMiIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJvY2FtbHByb2YiLgotCi0gICAgKiAibWFrZSBwbmMiIHdpbGwgYnVpbGQgbmF0aXZlIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aAotICAgICAgImdwcm9mIi4KLQotICBQbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgdG8gcHJvZmlsZSBieXRlIGNvZGUgd2l0aAotICB0aHJlYWRzLiBPQ2FtbE1ha2VmaWxlIHdpbGwgZm9yY2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBkbyB0aGlzLgotCi0gIEEgc2hvcnQgaGludCBmb3IgREVDIEFscGhhLXVzZXJzICh1bmRlciBEaWdpdGFsIFVuaXgpOiB5b3UgbWF5IGFsc28KLSAgY29tcGlsZSB5b3VyIHNvdXJjZXMgdG8gbmF0aXZlIGNvZGUgd2l0aG91dCBhbnkgZnVydGhlciBwcm9maWxpbmcKLSAgb3B0aW9ucy90YXJnZXRzLiBUaGVuIGNhbGwgInBpeGllIG15X2V4ZWMiLCAibXlfZXhlYyIgYmVpbmcgeW91cgotICBleGVjdXRhYmxlLiBUaGlzIHdpbGwgcHJvZHVjZSAoYW1vbmcgb3RoZXIgZmlsZXMpIGFuIGV4ZWN1dGFibGUKLSAgIm15X2V4ZWMucGl4aWUiLiBDYWxsIGl0IGFuZCBpdCB3aWxsIHByb2R1Y2UgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHdoaWNoCi0gIGNhbiBiZSBhbmFseXNlZCB1c2luZyAicHJvZiAtcGl4aWUgbXlfZXhlYyIuIFRoZSByZXN1bHRpbmcgaW5mb3JtYXRpb24KLSAgaXMgZXh0cmVtZWx5IGRldGFpbGVkIGFuZCBhbGxvd3MgYW5hbHlzaXMgdXAgdG8gdGhlIGNsb2NrIGN5Y2xlIGxldmVsLi4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIFByZXByb2Nlc3NvcnMKLQotICBCZWNhdXNlIG9uZSBjb3VsZCBlbXBsb3kgYW55IGtpbmQgb2YgcHJvZ3JhbSB0aGF0IHJlYWRzIGZyb20gc3RhbmRhcmQKLSAgaW5wdXQgYW5kIHByaW50cyB0byBzdGFuZGFyZCBvdXRwdXQgYXMgcHJlcHJvY2Vzc29yLCB0aGVyZSBjYW5ub3QgYmUgYW55Ci0gIGRlZmF1bHQgd2F5IHRvIGhhbmRsZSBhbGwgb2YgdGhlbSBjb3JyZWN0bHkgd2l0aG91dCBmdXJ0aGVyIGtub3dsZWRnZS4KLQotICBUaGVyZWZvcmUgeW91IGhhdmUgdG8gY29vcGVyYXRlIGEgYml0IHdpdGggT0NhbWxNYWtlZmlsZSB0byBsZXQKLSAgcHJlcHJvY2Vzc2luZyBoYXBwZW4gYXV0b21hdGljYWxseS4gQmFzaWNhbGx5LCB0aGlzIG9ubHkgcmVxdWlyZXMKLSAgdGhhdCB5b3UgcHV0IGEgY29tbWVudCBpbnRvIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlCi0gIHByZXByb2Nlc3NlZCwgZS5nLjoKLQotICAgICgqcHAgY2F0ICopCi0gICAgLi4uIHJlc3Qgb2YgcHJvZ3JhbSAuLi4KLQotICBPQ2FtbE1ha2VmaWxlIGxvb2tzIGF0IHRoZSBmaXJzdCBsaW5lIG9mIHlvdXIgZmlsZXMsIGFuZCBpZiBpdCBmaW5kcwotICBhIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCAiKCpwcCIsIHRoZW4gaXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKLSAgcmVzdCBvZiB0aGUgY29tbWVudCB0ZWxscyBpdCBob3cgdG8gY29ycmVjdGx5IGNhbGwgdGhlIGFwcHJvcHJpYXRlCi0gIHByZXByb2Nlc3Nvci4gSW4gdGhpcyBjYXNlIHRoZSBwcm9ncmFtICJjYXQiIHdpbGwgYmUgY2FsbGVkLCB3aGljaCB3aWxsLAotICBvZiBjb3Vyc2UsIGp1c3Qgb3V0cHV0IHRoZSBzb3VyY2UgdGV4dCBhZ2FpbiB3aXRob3V0IGNoYW5naW5nIGl0LgotCi0gIElmIHlvdSBhcmUsIGZvciBleGFtcGxlLCBhbiBhZHZvY2F0ZSBvZiB0aGUgbmV3ICJyZXZpc2VkIHN5bnRheCIsCi0gIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtbHA0IHByZXByb2Nlc3NvciwgeW91IGNvdWxkIHNpbXBseSB3cml0ZToKLQotICAgICgqcHAgY2FtbHA0ciAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gaW4gcmV2aXNlZCBzeW50YXggLi4uCi0KLSAgU2ltcGxlLCBpc24ndCBpdD8KLQotICBJZiB5b3Ugd2FudCB0byB3cml0ZSB5b3VyIG93biBzeW50YXggZXh0ZW5zaW9ucywganVzdCB0YWtlIGEgbG9vayBhdCB0aGUKLSAgZXhhbXBsZSBpbiB0aGUgZGlyZWN0b3J5ICJjYW1scDQiOiBpdCBpbXBsZW1lbnRzIHRoZSAicmVwZWF0IC4uLiB1bnRpbCIKLSAgZXh0ZW5zaW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgY2FtbHA0LXR1dG9yaWFsLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgTGlicmFyeSAoVW4tKUluc3RhbGxhdGlvbiBTdXBwb3J0Ci0KLSAgT0NhbWxNYWtlZmlsZSBjb250YWlucyB0d28gdGFyZ2V0cyB1c2luZyAib2NhbWxmaW5kIiBmb3IgdGhpcyBwdXJwb3NlOgotCi0gICAgKiBsaWJpbnN0YWxsCi0gICAgKiBsaWJ1bmluc3RhbGwKLQotICBUaGVzZSB0d28gdGFyZ2V0cyByZXF1aXJlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHZhcmlhYmxlCi0gICJMSUJJTlNUQUxMX0ZJTEVTIiwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBhbGwgdGhlIGZpbGVzIHRoYXQgeW91Ci0gIHdhbnQgdG8gaW5zdGFsbCBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkgKHVzdWFsbHkgJS5tbGksICUuY21pLCAlLmNtYSwKLSAgJS5jbXhhLCAlLmEgYW5kIHBvc3NpYmx5IGZ1cnRoZXIgQy1saWJyYXJpZXMpLiBUaGUgdGFyZ2V0ICJsaWJpbnN0YWxsIgotICBoYXMgdGhlIGRlcGVuZGVuY3kgImFsbCIgdG8gZm9yY2UgY29tcGlsYXRpb24gb2YgdGhlIGxpYnJhcnkgc28gbWFrZQotICBzdXJlIHlvdSBkZWZpbmUgdGFyZ2V0ICJhbGwiIGluIHlvdXIgTWFrZWZpbGUgYXBwcm9wcmlhdGVseS4KLQotICBUaGUgdGFyZ2V0cyBpbmZvcm0gdGhlIHVzZXIgYWJvdXQgdGhlIGNvbmZpZ3VyZWQgaW5zdGFsbCBwYXRoIGFuZCBhc2sKLSAgZm9yIGNvbmZpcm1hdGlvbiB0byAodW4paW5zdGFsbCB0aGVyZS4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZW0sIGl0Ci0gIGlzIG9mdGVuIGEgZ29vZCBpZGVhIHRvIGp1c3QgYWxpYXMgdGhlbSBpbiB5b3VyIE1ha2VmaWxlIHRvICJpbnN0YWxsIgotICBhbmQgInVuaW5zdGFsbCIgcmVzcGVjdGl2ZWx5LgotCi0gIFR3byBvdGhlciB0YXJnZXRzIGFsbG93IGluc3RhbGxhdGlvbiBvZiBmaWxlcyBpbnRvIGEgcGFydGljdWxhcgotICBkaXJlY3RvcnkgKHdpdGhvdXQgdXNpbmcgb2NhbWxmaW5kKToKLQotICAgICogcmF3aW5zdGFsbAotICAgICogcmF3dW5pbnN0YWxsCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgdG9wbGV2ZWxzCi0KLSAgVGhlcmUgaXMganVzdCBvbmUgdGFyZ2V0IGZvciB0aGlzOgotCi0gICAgKiB0b3AKLQotICBUaGUgZ2VuZXJhdGVkIGZpbGUgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgZm9yIGludGVyYWN0aXZlIHNlc3Npb25zIC0KLSAgZXZlbiB3aXRoIHNjYW5uZXJzLCBwYXJzZXJzLCBDLWZpbGVzLCBldGMuIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbgotCi0gIFRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgc3VwcG9ydGVkOgotCi0gICAqIGh0ZG9jICAgICAgLSBnZW5lcmF0ZXMgSFRNTC1kb2N1bWVudGF0aW9uCi0gICAqIGxhZG9jICAgICAgLSBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotICAgKiBwc2RvYyAgICAgIC0gZ2VuZXJhdGVzIFBvc3RTY3JpcHQtZG9jdW1lbnRhdGlvbgotICAgKiBwZGZkb2MgICAgIC0gZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi0gICAqIGRvYyAgICAgICAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0gICAqIGNsZWFuLWRvYyAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0KLSAgQWxsIG9mIHRoZW0gZ2VuZXJhdGUgYSBzdWItZGlyZWN0b3J5ICJkb2MiLiBNb3JlIHByZWNpc2VseSwgZm9yIEhUTUwgaXQKLSAgaXMgImRvYy8kKFJFU1VMVCkvaHRtbCIgYW5kIGZvciBMYXRleCwgUG9zdFNjcmlwdCBhbmQgUERGIHRoZSBkaXJlY3RvcnkKLSAgImRvYy8kKFJFU1VMVCkvbGF0ZXgiLiBTZWUgdGhlIE9DYW1sZG9jLW1hbnVhbCBmb3IgZGV0YWlscyBhbmQgdGhlCi0gIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdyBmb3Igc2V0dGluZ3MgeW91IGNhbiBjb250cm9sLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgc3VicHJvamVjdHMKLQotICBZb3UgY2FuIGhhdmUgc2V2ZXJhbCB0YXJnZXRzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgbWFuYWdlIHRoZW0KLSAgZnJvbSB3aXRoaW4gYW4gc2luZ2xlIE1ha2VmaWxlLgotCi0gIEdpdmUgZWFjaCBzdWJwcm9qZWN0IGEgbmFtZSwgZS5nLiAicDEiLCAicDIiLCBldGMuIFRoZW4geW91IGV4cG9ydAotICBzZXR0aW5ncyBzcGVjaWZpYyB0byBlYWNoIHByb2plY3QgYnkgdXNpbmcgdmFyaWFibGVzIG9mIHRoZSBmb3JtCi0gICJQUk9KX3AxIiwgIlBST0pfcDIiLCBldGMuICBFLmcuOgotCi0gICAgZGVmaW5lIFBST0pfcDEKLSAgICAgIFNPVVJDRVM9ImZvby5tbCBtYWluLm1sIgotICAgICAgUkVTVUxUPSJwMSIKLSAgICAgIE9DQU1MRkxBR1M9Ii11bnNhZmUiCi0gICAgZW5kZWYKLSAgICBleHBvcnQgUFJPSl9wMQotCi0gICAgZGVmaW5lIFBST0pfcDIKLSAgICAgIC4uLgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDIKLQotICBZb3UgbWF5IGFsc28gZXhwb3J0IGNvbW1vbiBzZXR0aW5ncyB1c2VkIGJ5IGFsbCBwcm9qZWN0cyBkaXJlY3RseSwgZS5nLgotICAiZXhwb3J0IFRIUkVBRFMgPSB5Ii4KLQotICBOb3cgaXQgaXMgYSBnb29kIGlkZWEgdG8gZGVmaW5lLCB3aGljaCBwcm9qZWN0cyBzaG91bGQgYmUgYWZmZWN0ZWQgYnkKLSAgY29tbWFuZHMgYnkgZGVmYXVsdC4gIEUuZy46Ci0KLSAgICBpZm5kZWYgU1VCUFJPSlMKLSAgICAgIGV4cG9ydCBTVUJQUk9KUyA9IHAxIHAyCi0gICAgZW5kaWYKLQotICBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIHRob3NlCi0gIHN1YnByb2plY3RzIGlmIHRoaXMgdmFyaWFibGUgaGFzIG5vdCBiZWVuIGRlZmluZWQgaW4gdGhlIHNoZWxsCi0gIGVudmlyb25tZW50IG9yIGluIHRoZSBjb21tYW5kIGxpbmUgb2YgdGhlIG1ha2UtaW52b2NhdGlvbiBieSB0aGUgdXNlci4KLSAgRS5nLiwgIm1ha2UgZGMiIHdpbGwgZ2VuZXJhdGUgZGVidWcgY29kZSBmb3IgYWxsIHN1YnByb2plY3RzLgotCi0gIFRoZW4geW91IG5lZWQgdG8gZGVmaW5lIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHlvdXIgc3VicHJvamVjdHMgaWYgIm1ha2UiCi0gIGhhcyBiZWVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50czoKLQotICAgIGFsbDogYmMKLQotICBUaGlzIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIGJ5IGRlZmF1bHQgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBGaW5hbGx5LCB5b3UnbGwgaGF2ZSB0byBkZWZpbmUgYSBjYXRjaC1hbGwgdGFyZ2V0IHRoYXQgdXNlcyB0aGUgdGFyZ2V0Ci0gIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvciBhbGwgc3VicHJvamVjdHMuIEp1c3QgYWRkIChhc3N1bWluZyB0aGF0Ci0gIE9DQU1MTUFLRUZJTEUgaGFzIGJlZW4gZGVmaW5lZCBhcHByb3ByaWF0ZWx5KToKLQotICAgICU6Ci0gICAgICAgICAgICBAbWFrZSAtZiAkKE9DQU1MTUFLRUZJTEUpIHN1YnByb2pzIFNVQlRBUkdFVD0kQAotCi0gIFNlZSB0aGUgInRocmVhZHMiLWRpcmVjdG9yeSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBhIHNob3J0IGV4YW1wbGUhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBPcHRpb25hbCB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvICJPQ2FtbE1ha2VmaWxlIgotCi0gICogTElCX1BBQ0tfTkFNRSAtIHBhY2tzIGFsbCBtb2R1bGVzIG9mIGEgbGlicmFyeSBpbnRvIGEgbW9kdWxlIHdob3NlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdmFyaWFibGUgIkxJQl9QQUNLX05BTUUiLgotCi0gICogUkVTX0NMSUJfU1VGICAtIHdoZW4gYnVpbGRpbmcgYSBsaWJyYXJ5IHRoYXQgY29udGFpbnMgQy1zdHVicywgdGhpcwotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBjb250cm9scyB0aGUgc3VmZml4IGFwcGVuZGVkIHRvIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIG9mIHRoZSBDLWxpYnJhcnkgKGRlZmF1bHQ6ICJfc3R1YnMiKS4KLQotICAqIFRIUkVBRFMgICAgICAgLSBzYXkgIlRIUkVBRFMgPSB5ZXMiIGlmIHlvdSBuZWVkIHRocmVhZCBzdXBwb3J0IGNvbXBpbGVkIGluLAotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIFZNVEhSRUFEUyAgICAgLSBzYXkgIlZNVEhSRUFEUyA9IHllcyIgaWYgeW91IHdhbnQgdG8gZm9yY2UgVk0tbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZyBvZiB0aHJlYWRzIChieXRlLWNvZGUgb25seSkuCi0KLSAgKiBBTk5PVEFURSAgICAgIC0gc2F5ICJBTk5PVEFURSA9IHllcyIgdG8gZ2VuZXJhdGUgdHlwZSBhbm5vdGF0aW9uIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICguYW5ub3QpIHRvIHN1cHBvcnQgZGlzcGxheWluZyBvZiB0eXBlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGluIGVkaXRvcnMuCi0KLSAgKiBVU0VfQ0FNTFA0ICAgIC0gc2F5ICJVU0VfQ0FNTFA0ID0geWVzIiBpbiB5b3VyICJNYWtlZmlsZSIgaWYgeW91Ci0gICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gaW5jbHVkZSB0aGUgY2FtbHA0IGRpcmVjdG9yeSBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkIHByb2Nlc3MsIG90aGVyd2lzZSBsZWF2ZSBpdCBhd2F5LgotCi0gICogSU5DRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciAiLmNtaSItIGFuZAotICAgICAgICAgICAgICAgICAgICAiLmNtbyItZmlsZXMuICBZb3UgbmVlZCBub3Qgd3JpdGUgIi1JIC4uLiIgLSBqdXN0IHRoZQotICAgICAgICAgICAgICAgICAgICBwbGFpbiBuYW1lcy4KLSAgKiBMSUJESVJTICAgICAgIC0gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICBBbHNvIGp1c3QgcHV0IHRoZSBwbGFpbiBwYXRocyBpbnRvIHRoaXMgdmFyaWFibGUKLSAgKiBFWFRMSUJESVJTICAgIC0gU2FtZSBhcyAiTElCRElSUyIsIGJ1dCBwYXRocyBpbiB0aGlzIHZhcmlhYmxlIGFyZQotICAgICAgICAgICAgICAgICAgICBhbHNvIGFkZGVkIHRvIHRoZSBiaW5hcnkgdmlhIHRoZSAiLVIiLWZsYWcgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcyBpbiBub24tc3RhbmRhcmQgcGxhY2VzIGNhbiBiZSBmb3VuZC4KLSAgKiBSRVNVTFRERVBTICAgIC0gVGFyZ2V0cyBvbiB3aGljaCByZXN1bHRzIChleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMpCi0gICAgICAgICAgICAgICAgICAgIHNob3VsZCBhZGRpdGlvbmFsbHkgZGVwZW5kLgotCi0gICogUEFDS1MgICAgICAgICAtIGFkZHMgcGFja2FnZXMgdW5kZXIgY29udHJvbCBvZiAiZmluZGxpYiIuCi0KLSAgKiBQUkVEUyAgICAgICAgIC0gc3BlY2lmaWVzICJmaW5kbGliIi1wcmVkaWNhdGVzLgotCi0gICogTElCUyAgICAgICAgICAtIE9DYW1sLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotICAgICAgICAgICAgICAgICAgICBFLmcuIGlmIHlvdSB3YW50IHRvIGxpbmsgdGhlIFN0ci1saWJyYXJ5LCBqdXN0IHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICJzdHIiICh3aXRob3V0IHF1b3RlcykuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBuZXcgT0NhbWwtY29tcGlsZXIgaGFuZGxlcyBsaWJyYXJpZXMgaW4gc3VjaAotICAgICAgICAgICAgICAgICAgICBhIHdheSB0aGF0IHRoZXkgInJlbWVtYmVyIiB3aGV0aGVyIHRoZXkgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICBiZSBsaW5rZWQgYWdhaW5zdCBhIEMtbGlicmFyeSBhbmQgaXQgZ2V0cyBsaW5rZWQKLSAgICAgICAgICAgICAgICAgICAgaW4gYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzbGFzaCBpbiB0aGUgbGlicmFyeSBuYW1lIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIuL3N0ciIgb3IgImxpYi9mb28iKSB0aGVuIG1ha2UgaXMgdG9sZCB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgZmlsZXMgZGVwZW5kIG9uIHRoZSBsaWJyYXJ5LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICBoZWxwcyB0byBlbnN1cmUgdGhhdCBjaGFuZ2VzIHRvIHlvdXIgbGlicmFyaWVzIGFyZQotICAgICAgICAgICAgICAgICAgICB0YWtlbiBpbnRvIGFjY291bnQsIHdoaWNoIGlzIGltcG9ydGFudCBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgICAgICAgIHJlZ2VuZXJhdGluZyB5b3VyIGxpYnJhcmllcyBmcmVxdWVudGx5LgotICAqIENMSUJTICAgICAgICAgLSBDLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotCi0gICogUFJFX1RBUkdFVFMgICAtIHNldCB0aGlzIHRvIGEgbGlzdCBvZiB0YXJnZXQgZmlsZXMgdGhhdCB5b3Ugd2FudAotICAgICAgICAgICAgICAgICAgICB0byBoYXZlIGJ1aWxkdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbiBhY3R1YWxseQotICAgICAgICAgICAgICAgICAgICB0YWtlcyBwbGFjZS4gRS5nLiB1c2UgdGhpcyB0byBhdXRvbWF0aWNhbGx5IGNvbXBpbGUKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyBuZWVkZWQgYnkgY2FtbHA0LCB3aGljaCBoYXZlIHRvIGJlIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgb3RoZXIgbW9kdWxlcyBjYW4gYmUgcGFyc2VkIGF0IGFsbC4KLQotICAgICAgICAgICAgICAgICAgICAqKiBXQVJOSU5HICoqOiB0aGUgZmlsZXMgbWVudGlvbmVkIGluIHRoaXMgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIHdoZW4gIm1ha2UgY2xlYW4iIGlzIGV4ZWN1dGVkIQotCi0gICogTElCSU5TVEFMTF9GSUxFUyAtIHRoZSBmaWxlcyBvZiBhIGxpYnJhcnkgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICJmaW5kbGliIi4gRGVmYXVsdDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLmEgbGliJChSRVNVTFQpLmEKLQotICAqIE9DQU1MX0xJQl9JTlNUQUxMIC0gdGFyZ2V0IGRpcmVjdG9yeSBmb3IgInJhd2luc3RhbGwvcmF3dW5pbnN0YWxsIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAkKE9DQU1MTElCUEFUSCkvY29udHJpYikKLQotICAqIERPQ19GSUxFUyAgICAgLSBuYW1lcyBvZiBmaWxlcyBmcm9tIHdoaWNoIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLgotICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogYWxsIC5tbGktZmlsZXMgaW4geW91ciAkKFNPVVJDRVMpKS4KLQotICAqIERPQ19ESVIgICAgICAgLSBuYW1lIG9mIGRpcmVjdG9yeSB3aGVyZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgKiBPQ0FNTEZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBjb21waWxlcnMKLSAgKiBPQ0FNTEJDRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBieXRlIGNvZGUgY29tcGlsZXIgb25seQotICAqIE9DQU1MTkNGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIG5hdGl2ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLQotICAqIE9DQU1MTERGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlcgotICAqIE9DQU1MQkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcgYnl0ZSBjb2RlCi0gICogT0NBTUxOTERGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyIHdoZW4gbGlua2luZwotICAgICAgICAgICAgICAgICAgICBuYXRpdmUgY29kZQotCi0gICogT0NBTUxNS0xJQl9GTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwgbGlicmFyeSB0b29sCi0KLSAgKiBPQ0FNTENQRkxBR1MgIC0gcHJvZmlsaW5nIGZsYWdzIHBhc3NlZCB0byAib2NhbWxjcCIgKGRlZmF1bHQ6ICJhIikKLQotICAqIFBQRkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yIChkZWZhdWx0OiBub25lKQotCi0gICogTEZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxsZXgiCi0gICogWUZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWx5YWNjIgotICAqIElETEZMQUdTICAgICAgLSBmbGFncyBwYXNzZWQgdG8gImNhbWxpZGwiCi0KLSAgKiBPQ0FNTERPQ0ZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGRvYyIKLQotICAqIE9DQU1MRklORF9JTlNURkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sZmluZCIgZHVyaW5nIGluc3RhbGxhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogbm9uZSkKLQotICAqIERWSVBTRkxBR1MgICAgLSBmbGFncyBwYXNzZWQgdG8gZHZpcHMKLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2VuZXJhdGluZyBkb2N1bWVudGF0aW9uIGluIFBvc3RTY3JpcHQpLgotCi0gICogU1RBVElDICAgICAgICAtIHNldCB0aGlzIHZhcmlhYmxlIGlmIHlvdSB3YW50IHRvIGZvcmNlIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9mIHN0YXRpYyBsaWJyYXJpZXMKLQotICAqIENDICAgICAgICAgICAgLSB0aGUgQy1jb21waWxlciB0byBiZSB1c2VkCi0gICogQ1hYICAgICAgICAgICAtIHRoZSBDKystY29tcGlsZXIgdG8gYmUgdXNlZAotCi0gICogQ0ZMQUdTICAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLWNvbXBpbGVyLgotICAgICAgICAgICAgICAgICAgICBUaGUgZmxhZyAiLUROQVRJVkVfQ09ERSIgd2lsbCBiZSBwYXNzZWQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICBpZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIG5hdGl2ZSBjb2RlLiBUaGlzIGFsbG93cyB5b3UKLSAgICAgICAgICAgICAgICAgICAgdG8gY29tcGlsZSB5b3VyIEMtZmlsZXMgY29uZGl0aW9uYWxseS4gQnV0IHBsZWFzZQotICAgICAgICAgICAgICAgICAgICBub3RlOiBZb3Ugc2hvdWxkIGRvIGEgIm1ha2UgY2xlYW4iIG9yIHJlbW92ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpbGVzIG1hbnVhbGx5IG9yIHRvdWNoIHRoZSAlLmMtZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgdGhleSBtYXkgbm90IGJlIGNvcnJlY3RseSByZWNvbXBpbGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gZGlmZmVyZW50IGJ1aWxkcy4KLQotICAqIENYWEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQysrLWNvbXBpbGVyLgotCi0gICogQ1BQRkxBR1MgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLXByZXByb2Nlc3Nvci4KLQotICAqIENGUkFNRVdPUktTICAgLSBPYmplY3RpdmUtQyBmcmFtZXdvcmsgdG8gcGFzcyB0byBsaW5rZXIgb24gTWFjT1MgWC4KLQotICAqIExERkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1saW5rZXIKLQotICAqIFJQQVRIX0ZMQUcgICAgLSBmbGFnIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBDLWxpbmtlciB0byBzZXQgYSBwYXRoIGZvcgotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcy4gIE1heSBuZWVkIHRvIGJlIHNldCBieSB1c2VyIG9uCi0gICAgICAgICAgICAgICAgICAgIGV4b3RpYyBwbGF0Zm9ybXMuICAoZGVmYXVsdDogIi1SIikuCi0KLSAgKiBFTEZfUlBBVEhfRkxBRyAtIHRoaXMgZmxhZyBpcyB1c2VkIHRvIHNldCB0aGUgcnBhdGggb24gRUxGLXBsYXRmb3Jtcy4KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiLVIiKQotCi0gICogRUxGX1JQQVRIICAgICAtIGlmIHRoaXMgZmxhZyBpcyAieWVzIiwgdGhlbiB0aGUgUlBBVEhfRkxBRyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgIHBhc3NlZCBieSAiLVdsIiB0byB0aGUgbGlua2VyIGFzIG5vcm1hbCBvbgotICAgICAgICAgICAgICAgICAgICBFTEYtcGxhdGZvcm1zLgotCi0gICogT0NBTUxMSUJQQVRIICAtIHBhdGggdG8gdGhlIE9DYW1sLXN0YW5kYXJkLWxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICAoZmlyc3QgZGVmYXVsdDogYCQoT0NBTUxDKSAtd2hlcmVgKQotICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGRlZmF1bHQ6ICIvdXNyL2xvY2FsL2xpYi9vY2FtbCIpCi0KLSAgKiBPQ0FNTF9ERUZBVUxUX0RJUlMgLSBhZGRpdGlvbmFsIHBhdGggaW4gd2hpY2ggdGhlIHVzZXIgY2FuIHN1cHBseQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgZGlyZWN0b3JpZXMgdG8gaGlzIG93biBjb2xsZWN0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLiAgVGhlIGlkZWEgaXMgdG8gcGFzcyB0aGlzIGFzIGFuIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgc28gdGhhdCB0aGUgTWFrZWZpbGVzIGRvIG5vdCBoYXZlIHRvIGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhdGggYWxsIHRoZSB0aW1lLgotCi0gICogT0NBTUxGSU5EICAgICAtIG9jYW1sZmluZCBmcm9tIGZpbmRsaWIgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGZpbmQiKQotICAqIE9DQU1MQyAgICAgICAgLSBieXRlLWNvZGUgY29tcGlsZXIgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxjIikKLSAgKiBPQ0FNTE9QVCAgICAgIC0gbmF0aXZlLWNvZGUgY29tcGlsZXIgICAgICAgICAoZGVmYXVsdDogIm9jYW1sb3B0IikKLSAgKiBPQ0FNTE1LVE9QICAgIC0gdG9wLWxldmVsIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sbWt0b3AiKQotICAqIE9DQU1MQ1AgICAgICAgLSBwcm9maWxpbmcgYnl0ZS1jb2RlIGNvbXBpbGVyIChkZWZhdWx0OiAib2NhbWxjcCIpCi0gICogT0NBTUxERVAgICAgICAtIGRlcGVuZGVuY3kgZ2VuZXJhdG9yICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRlcCIpCi0gICogT0NBTUxMRVggICAgICAtIHNjYW5uZXIgZ2VuZXJhdG9yICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGxleCIpCi0gICogT0NBTUxZQUNDICAgICAtIHBhcnNlciBnZW5lcmF0b3IgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbHlhY2MiKQotICAqIE9DQU1MTUtMSUIgICAgLSB0b29sIHRvIGNyZWF0ZSBsaWJyYXJpZXMgICAgIChkZWZhdWx0OiAib2NhbWxta2xpYiIpCi0gICogQ0FNTElETCAgICAgICAtIElETC1jb2RlIGdlbmVyYXRvciAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsIikKLSAgKiBDQU1MSURMRExMICAgIC0gSURMLXV0aWxpdHkgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxpZGxkbGwiKQotICAqIENBTUxQNCAgICAgICAgLSBjYW1scDQgcHJlcHJvY2Vzc29yICAgICAgICAgIChkZWZhdWx0OiAiY2FtbHA0IikKLSAgKiBPQ0FNTERPQyAgICAgIC0gT0NhbWxkb2MtY29tbWFuZCAgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sZG9jIikKLQotICAqIExBVEVYICAgICAgICAgLSBMYXRleC1wcm9jZXNzb3IgICAgICAgICAgICAgIChkZWZhdWx0OiAibGF0ZXgiKQotICAqIERWSVBTICAgICAgICAgLSBkdmlwcy1jb21tYW5kICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiZHZpcHMiKQotICAqIFBTMlBERiAgICAgICAgLSBQb3N0U2NyaXB0LXRvLVBERiBjb252ZXJ0ZXIgIChkZWZhdWx0OiAicHMycGRmIikKLQotICAqIENBTUVMRU9OX1JFUE9SVCAtIHJlcG9ydCB0b29sIG9mIENhbWVsZW9uICAoZGVmYXVsdDogInJlcG9ydCIpCi0gICogQ0FNRUxFT05fUkVQT1JUX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbgotCi0gICogQ0FNRUxFT05fWk9HR1kgLSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNG8gcGFfem9nLmNtYSBwcl9vLmNtbyIpCi0gICogQ0FNRUxFT05fWk9HR1lfRkxBR1MgLSBmbGFncyBmb3IgdGhlIHpvZ2d5IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIE9DQU1MX0dMQURFQ0MgLSBHbGFkZSBjb21waWxlciBmb3IgT0NhbWwgICAgIChkZWZhdWx0OiAibGFibGdsYWRlY2MyIikKLSAgKiBPQ0FNTF9HTEFERUNDX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSBHbGFkZSBjb21waWxlcgotCi0gICogT1hSSURMICAgICAgICAtIE9YUklETC1nZW5lcmF0b3IgIChkZWZhdWx0OiAib3hyaWRsIikKLQotICAqIE5PSURMSEVBREVSICAgLSBzZXQgdG8gInllcyIgdG8gcHJvaGliaXQgIk9DYW1sTWFrZWZpbGUiIGZyb20gdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY2FtbGlkbC1mbGFnICItaGVhZGVyIi4KLQotICAqIE5PX0NVU1RPTSAgICAgLSBQcmV2ZW50IGxpbmtpbmcgaW4gY3VzdG9tIG1vZGUuCi0KLSAgKiBRVUlFVCAgICAgICAgIC0gdW5zZXR0aW5nIHRoaXMgdmFyaWFibGUgKGUuZy4gIm1ha2UgUVVJRVQ9IikKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBwcmludCBhbGwgZXhlY3V0ZWQgY29tbWFuZHMsIGluY2x1ZGluZwotICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgb25lcy4gVGhpcyBhbGxvd3MgbW9yZSBjb21mb3J0YWJsZQotICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgd2hlbiB0aGluZ3MgZ28gd3JvbmcgZHVyaW5nIGEgYnVpbGQuCi0KLSAgKiBSRUFMTFlfUVVJRVQgIC0gd2hlbiBzZXQgdGhpcyBmbGFnIHR1cm5zIG9mZiBvdXRwdXQgZnJvbSBzb21lIGNvbW1hbmRzLgotCi0gICogT0NBTUxNQUtFRklMRSAtIGxvY2F0aW9uIG9mICg9cGF0aCB0bykgdGhpcyAiT0NhbWxNYWtlZmlsZSIuCi0gICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgaXQgY2FsbGVzIGl0c2VsZiByZWN1cnNpdmVseSwgaXQgaGFzIHRvCi0gICAgICAgICAgICAgICAgICAgIGtub3cgd2hlcmUgaXQgaXMuIChkZWZhdWx0OiAiT0NhbWxNYWtlZmlsZSIgPQotICAgICAgICAgICAgICAgICAgICBsb2NhbCBkaXJlY3RvcnkpCi0KLSAgKiBCQ1NVRkZJWCAgICAgIC0gU3VmZml4IGZvciBhbGwgYnl0ZS1jb2RlIGZpbGVzLiBFLmcuOgotCi0gICAgICAgICAgICAgICAgICAgICAgUkVTVUxUICAgPSBmb28KLSAgICAgICAgICAgICAgICAgICAgICBCQ1NVRkZJWCA9IF9iYwotCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBwcm9kdWNlIGJ5dGUtY29kZSBleGVjdXRhYmxlcy9saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBiYXNlbmFtZSAiZm9vX2JjIi4KLQotICAqIE5DU1VGRklYICAgICAgLSBTaW1pbGFyIHRvICJCQ1NVRkZJWCIsIGJ1dCBmb3IgbmF0aXZlLWNvZGUgZmlsZXMuCi0gICogVE9QU1VGRklYICAgICAtIFN1ZmZpeCBhZGRlZCB0byB0b3BsZXZlbCBpbnRlcnByZXRlcnMgKGRlZmF1bHQ6ICIudG9wIikKLQotICAqIFNVQlBST0pTICAgICAgLSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBzdWJwcm9qZWN0cyB0byBiZQotICAgICAgICAgICAgICAgICAgICBjb21waWxlZC4KLQotICAqIFNVQlRBUkdFVCAgICAgLSB0YXJnZXQgdG8gYmUgYnVpbHQgZm9yIGFsbCBwcm9qZWN0cyBpbiB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICBTVUJQUk9KUy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIGZvciBXaW5kb3dzIHVzZXJzCi0KLSAgKiBNSU5HVyAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNSU5HVy1lbnZpcm9ubWVudAotICAqIE1TVkMgICAgICAgICAgLSB2YXJpYWJsZSB0byBkZXRlY3QgdGhlIE1TVkMtY29tcGlsZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVwLXRvLWRhdGUgaW5mb3JtYXRpb24gKG5ld2VzdCByZWxlYXNlIG9mIGRpc3RyaWJ1dGlvbikgY2FuIGFsd2F5cyBiZQotZm91bmQgYXQ6Ci0KLSAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FbmpveSEKLQotTmV3IFlvcmssIDIwMDctMDQtMjIKLU1hcmt1cyBNb3R0bAotCi1lLW1haWw6IG1hcmt1cy5tb3R0bEBnbWFpbC5jb20KLVdXVzogICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvUkVBRE1FIGIvbGliL29jYW1sL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL29jYW1sL1JFQURNRQpyZW5hbWUgdG8gbGliL29jYW1sL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL19vYXNpcyBiL2xpYi9vY2FtbC9fb2FzaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9fb2FzaXMKQEAgLTAsMCArMSwxOSBAQAorTmFtZTogbGlidGhyaWZ0LW9jYW1sCitWZXJzaW9uOiAxLjAuMAorT0FTSVNGb3JtYXQ6IDAuMworU3lub3BzaXM6IE9DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0xpY2Vuc2U6IEFwYWNoZS0yLjAKK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1aWxkVG9vbHM6IG9jYW1sYnVpbGQKK1BsdWdpbnM6ICAgICBNRVRBICgwLjMpLAorICBEZXZGaWxlcyAoMC4zKQorCitMaWJyYXJ5ICJsaWJ0aHJpZnQtb2NhbWwiCisgIFBhdGg6IHNyYworICBGaW5kbGliTmFtZTogdGhyaWZ0CisgIGJ1aWxkVG9vbHM6IG9jYW1sYnVpbGQKKyAgQnVpbGREZXBlbmRzOiB0aHJlYWRzCisgIE1vZHVsZXM6IFRocmlmdCxUQmluYXJ5UHJvdG9jb2wsVFNvY2tldCxURnJhbWVkVHJhbnNwb3J0LFRDaGFubmVsVHJhbnNwb3J0LFRTZXJ2ZXIsVFNpbXBsZVNlcnZlcixUU2VydmVyU29ja2V0LFRUaHJlYWRlZFNlcnZlcgorICBYTUVUQVJlcXVpcmVzOiB0aHJlYWRzCisKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL29jYW1sL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL2Rlc2NyIGIvbGliL29jYW1sL2Rlc2NyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTc0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvZGVzY3IKQEAgLTAsMCArMSBAQAorT0NhbWwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9vcGFtIGIvbGliL29jYW1sL29wYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYzNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9vcGFtCkBAIC0wLDAgKzEsOCBAQAorb3BhbS12ZXJzaW9uOiAiMSIKK21haW50YWluZXI6ICJYWFgoRklMTCBNRSBJTiBXSVRIIEVNQUlMKSIKK2J1aWxkOiBbCisgIFttYWtlXQorICBbbWFrZSAiaW5zdGFsbCJdCitdCityZW1vdmU6IFtbIm9jYW1sZmluZCIgInJlbW92ZSIgInRocmlmdCJdXQorZGVwZW5kczogWyJvY2FtbGZpbmQiXQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9NYWtlZmlsZSBiL2xpYi9vY2FtbC9zcmMvTWFrZWZpbGUKaW5kZXggNDJlYzhkYi4uYTk3YWRlNSAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9NYWtlZmlsZQorKysgYi9saWIvb2NhbWwvc3JjL01ha2VmaWxlCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TT1VSQ0VTID0gVGhyaWZ0Lm1sIFRCaW5hcnlQcm90b2NvbC5tbCBUU29ja2V0Lm1sIFRDaGFubmVsVHJhbnNwb3J0Lm1sIFRTZXJ2ZXIubWwgVFNpbXBsZVNlcnZlci5tbCBUU2VydmVyU29ja2V0Lm1sIFRUaHJlYWRlZFNlcnZlci5tbAorU09VUkNFUyA9IFRocmlmdC5tbCBUQmluYXJ5UHJvdG9jb2wubWwgVFNvY2tldC5tbCBURnJhbWVkVHJhbnNwb3J0Lm1sIFRDaGFubmVsVHJhbnNwb3J0Lm1sIFRTZXJ2ZXIubWwgVFNpbXBsZVNlcnZlci5tbCBUU2VydmVyU29ja2V0Lm1sIFRUaHJlYWRlZFNlcnZlci5tbAogUkVTVUxUID0gdGhyaWZ0CiBMSUJTID0gdW5peCB0aHJlYWRzCiBUSFJFQURTID0geWVzCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RCaW5hcnlQcm90b2NvbC5tbCBiL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCmluZGV4IGEwNmNjOWEuLjZkNzUwMGUgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCkBAIC0yMiw2ICsyMiw3IEBACiBtb2R1bGUgUCA9IFByb3RvY29sCiAKIGxldCBnZXRfYnl0ZSBpIGIgPSAyNTUgbGFuZCAoaSBsc3IgKDgqYikpCitsZXQgZ2V0X2J5dGUzMiBpIGIgPSAyNTUgbGFuZCAoSW50MzIudG9faW50IChJbnQzMi5zaGlmdF9yaWdodCBpICg4KmIpKSkKIGxldCBnZXRfYnl0ZTY0IGkgYiA9IDI1NSBsYW5kIChJbnQ2NC50b19pbnQgKEludDY0LnNoaWZ0X3JpZ2h0IGkgKDgqYikpKQogCiAKQEAgLTM1LDcgKzM2LDcgQEAKICAgICBmb3IgaT0wIHRvIChuLTEpIGRvCiAgICAgICBzOj0gSW50MzIubG9nb3IgIXMgKEludDMyLnNoaWZ0X2xlZnQgKEludDMyLm9mX2ludCAoaW50X29mX2NoYXIgYi5baV0pKSAoOCoobi0xLWkpKSkKICAgICBkb25lOwotICAgIEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHQgKEludDMyLnNoaWZ0X2xlZnQgIXMgc2IpIHNiKQorICAgIEludDMyLnNoaWZ0X3JpZ2h0IChJbnQzMi5zaGlmdF9sZWZ0ICFzIHNiKSBzYgogCiBsZXQgY29tcF9pbnQ2NCBiIG4gPQogICBsZXQgcyA9IHJlZiAwTCBpbgpAQCAtNDQsOCArNDUsOCBAQAogICAgIGRvbmU7CiAgICAgIXMKIAotbGV0IHZlcnNpb25fbWFzayA9IDB4ZmZmZjAwMDAKLWxldCB2ZXJzaW9uXzEgPSAweDgwMDEwMDAwCitsZXQgdmVyc2lvbl9tYXNrID0gMHhmZmZmMDAwMGwKK2xldCB2ZXJzaW9uXzEgPSAweDgwMDEwMDAwbAogCiBjbGFzcyB0IHRyYW5zID0KIG9iamVjdCAoc2VsZikKQEAgLTYzLDcgKzY0LDcgQEAKICAgICAgIGlieXRlLlswXSA8LSBjaGFyX29mX2ludCAoZ2IgMSk7CiAgICAgICB0cmFucyN3cml0ZSBpYnl0ZSAwIDIKICAgbWV0aG9kIHdyaXRlSTMyIGkgPQotICAgIGxldCBnYiA9IGdldF9ieXRlIGkgaW4KKyAgICBsZXQgZ2IgPSBnZXRfYnl0ZTMyIGkgaW4KICAgICAgIGZvciBpPTAgdG8gMyBkbwogICAgICAgICBpYnl0ZS5bMy1pXSA8LSBjaGFyX29mX2ludCAoZ2IgaSkKICAgICAgIGRvbmU7CkBAIC03OCwxMyArNzksMTMgQEAKICAgICBzZWxmI3dyaXRlSTY0IChJbnQ2NC5iaXRzX29mX2Zsb2F0IGQpCiAgIG1ldGhvZCB3cml0ZVN0cmluZyBzPQogICAgIGxldCBuID0gU3RyaW5nLmxlbmd0aCBzIGluCi0gICAgICBzZWxmI3dyaXRlSTMyKG4pOworICAgICAgc2VsZiN3cml0ZUkzMiAoSW50MzIub2ZfaW50IG4pOwogICAgICAgdHJhbnMjd3JpdGUgcyAwIG4KICAgbWV0aG9kIHdyaXRlQmluYXJ5IGEgPSBzZWxmI3dyaXRlU3RyaW5nIGEKICAgbWV0aG9kIHdyaXRlTWVzc2FnZUJlZ2luIChuLHQscykgPQotICAgIHNlbGYjd3JpdGVJMzIgKHZlcnNpb25fMSBsb3IgKFAubWVzc2FnZV90eXBlX3RvX2kgdCkpOworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLmxvZ29yIHZlcnNpb25fMSAoSW50MzIub2ZfaW50IChQLm1lc3NhZ2VfdHlwZV90b19pIHQpKSk7CiAgICAgc2VsZiN3cml0ZVN0cmluZyBuOwotICAgIHNlbGYjd3JpdGVJMzIgcworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBzKQogICBtZXRob2Qgd3JpdGVNZXNzYWdlRW5kID0gKCkKICAgbWV0aG9kIHdyaXRlU3RydWN0QmVnaW4gcyA9ICgpCiAgIG1ldGhvZCB3cml0ZVN0cnVjdEVuZCA9ICgpCkBAIC05MywyNiArOTQsMjYgQEAKICAgICBzZWxmI3dyaXRlSTE2IGkKICAgbWV0aG9kIHdyaXRlRmllbGRFbmQgPSAoKQogICBtZXRob2Qgd3JpdGVGaWVsZFN0b3AgPQotICAgIHNlbGYjd3JpdGVCeXRlICh0diAoUHJvdG9jb2wuVF9TVE9QKSkKKyAgICBzZWxmI3dyaXRlQnl0ZSAodHYgKFAuVF9TVE9QKSkKICAgbWV0aG9kIHdyaXRlTWFwQmVnaW4gKGssdixzKSA9CiAgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IGspOwogICAgIHNlbGYjd3JpdGVCeXRlICh0diB2KTsKLSAgICBzZWxmI3dyaXRlSTMyIHMKKyAgICBzZWxmI3dyaXRlSTMyIChJbnQzMi5vZl9pbnQgcykKICAgbWV0aG9kIHdyaXRlTWFwRW5kID0gKCkKICAgbWV0aG9kIHdyaXRlTGlzdEJlZ2luICh0LHMpID0KICAgICBzZWxmI3dyaXRlQnl0ZSAodHYgdCk7Ci0gICAgc2VsZiN3cml0ZUkzMiBzCisgICAgc2VsZiN3cml0ZUkzMiAoSW50MzIub2ZfaW50IHMpCiAgIG1ldGhvZCB3cml0ZUxpc3RFbmQgPSAoKQogICBtZXRob2Qgd3JpdGVTZXRCZWdpbiAodCxzKSA9CiAgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IHQpOwotICAgIHNlbGYjd3JpdGVJMzIgcworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBzKQogICBtZXRob2Qgd3JpdGVTZXRFbmQgPSAoKQogICBtZXRob2QgcmVhZEJ5dGUgPQogICAgIGlnbm9yZSAodHJhbnMjcmVhZEFsbCBpYnl0ZSAwIDEpOwotICAgIChjb21wX2ludCBpYnl0ZSAxKQorICAgIEludDMyLnRvX2ludCAoY29tcF9pbnQgaWJ5dGUgMSkKICAgbWV0aG9kIHJlYWRJMTYgPQogICAgIGlnbm9yZSAodHJhbnMjcmVhZEFsbCBpYnl0ZSAwIDIpOwotICAgIGNvbXBfaW50IGlieXRlIDIKKyAgICBJbnQzMi50b19pbnQgKGNvbXBfaW50IGlieXRlIDIpCiAgIG1ldGhvZCByZWFkSTMyID0KICAgICBpZ25vcmUgKHRyYW5zI3JlYWRBbGwgaWJ5dGUgMCA0KTsKICAgICBjb21wX2ludCBpYnl0ZSA0CkBAIC0xMjQsMjAgKzEyNSwxOSBAQAogICBtZXRob2QgcmVhZEJvb2wgPQogICAgIHNlbGYjcmVhZEJ5dGUgPSAxCiAgIG1ldGhvZCByZWFkU3RyaW5nID0KLSAgICBsZXQgc3ogPSBzZWxmI3JlYWRJMzIgaW4KKyAgICBsZXQgc3ogPSBJbnQzMi50b19pbnQgKHNlbGYjcmVhZEkzMikgaW4KICAgICBsZXQgYnVmID0gU3RyaW5nLmNyZWF0ZSBzeiBpbgogICAgICAgaWdub3JlICh0cmFucyNyZWFkQWxsIGJ1ZiAwIHN6KTsKICAgICAgIGJ1ZgogICBtZXRob2QgcmVhZEJpbmFyeSA9IHNlbGYjcmVhZFN0cmluZwogICBtZXRob2QgcmVhZE1lc3NhZ2VCZWdpbiA9CiAgICAgbGV0IHZlciA9IHNlbGYjcmVhZEkzMiBpbgotICAgICAgaWYgKHZlciBsYW5kIHZlcnNpb25fbWFzayAhPSB2ZXJzaW9uXzEpIHRoZW4KLSAgICAgICAgKHByaW50X2ludCB2ZXI7Ci0gICAgICAgIHJhaXNlIChQLkUgKFAuQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIpKSkKKyAgICAgIGlmIEludDMyLmNvbXBhcmUgKEludDMyLmxvZ2FuZCB2ZXIgdmVyc2lvbl9tYXNrKSB2ZXJzaW9uXzEgIT0gMCB0aGVuCisgICAgICAgIHJhaXNlIChQLkUgKFAuQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIpKQogICAgICAgZWxzZQogICAgICAgICBsZXQgcyA9IHNlbGYjcmVhZFN0cmluZyBpbgotICAgICAgICBsZXQgbXQgPSBQLm1lc3NhZ2VfdHlwZV9vZl9pICh2ZXIgbGFuZCAweEZGKSBpbgotICAgICAgICAgIChzLG10LCBzZWxmI3JlYWRJMzIpCisgICAgICAgIGxldCBtdCA9IFAubWVzc2FnZV90eXBlX29mX2kgKEludDMyLnRvX2ludCAoSW50MzIubG9nYW5kIHZlciAweEZGbCkpIGluCisgICAgICAgICAgKHMsbXQsIEludDMyLnRvX2ludCBzZWxmI3JlYWRJMzIpCiAgIG1ldGhvZCByZWFkTWVzc2FnZUVuZCA9ICgpCiAgIG1ldGhvZCByZWFkU3RydWN0QmVnaW4gPQogICAgICIiCkBAIC0xNTIsMTUgKzE1MiwxNSBAQAogICBtZXRob2QgcmVhZE1hcEJlZ2luID0KICAgICBsZXQga3QgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KICAgICBsZXQgdnQgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KLSAgICAgIChrdCx2dCwgc2VsZiNyZWFkSTMyKQorICAgICAgKGt0LHZ0LCBJbnQzMi50b19pbnQgc2VsZiNyZWFkSTMyKQogICBtZXRob2QgcmVhZE1hcEVuZCA9ICgpCiAgIG1ldGhvZCByZWFkTGlzdEJlZ2luID0KICAgICBsZXQgdCA9IHZ0IChzZWxmI3JlYWRCeXRlKSBpbgotICAgICh0LHNlbGYjcmVhZEkzMikKKyAgICAodCwgSW50MzIudG9faW50IHNlbGYjcmVhZEkzMikKICAgbWV0aG9kIHJlYWRMaXN0RW5kID0gKCkKICAgbWV0aG9kIHJlYWRTZXRCZWdpbiA9CiAgICAgbGV0IHQgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KLSAgICAodCwgc2VsZiNyZWFkSTMyKTsKKyAgICAodCwgSW50MzIudG9faW50IHNlbGYjcmVhZEkzMik7CiAgIG1ldGhvZCByZWFkU2V0RW5kID0gKCkKIGVuZAogCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RGcmFtZWRUcmFuc3BvcnQubWwgYi9saWIvb2NhbWwvc3JjL1RGcmFtZWRUcmFuc3BvcnQubWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9zcmMvVEZyYW1lZFRyYW5zcG9ydC5tbApAQCAtMCwwICsxLDkzIEBACitvcGVuIFRocmlmdAorCittb2R1bGUgVCA9IFRyYW5zcG9ydAorCitsZXQgY18weGZmXzMyID0gSW50MzIub2Zfc3RyaW5nICIweGZmIgorCisoKiBDb3BpZWQgZnJvbSBPQ2FtbG5ldCBydHlwZXMubWwgKikKK2xldCBlbmNvZGVfZnJhbWVfc2l6ZSB4ID0KKwlsZXQgcyA9IFN0cmluZy5jcmVhdGUgNCBpbgorCWxldCBuMyA9IEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbCB4IDI0KSBsYW5kIDB4ZmYgaW4KKwlsZXQgbjIgPSBJbnQzMi50b19pbnQgKEludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCAxNikgbGFuZCAweGZmIGluCisJbGV0IG4xID0gSW50MzIudG9faW50IChJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIHggOCkgbGFuZCAweGZmIGluCisJbGV0IG4wID0gSW50MzIudG9faW50IChJbnQzMi5sb2dhbmQgeCBjXzB4ZmZfMzIpIGluCisJCVN0cmluZy51bnNhZmVfc2V0IHMgMCAoQ2hhci51bnNhZmVfY2hyIG4zKTsKKwkJU3RyaW5nLnVuc2FmZV9zZXQgcyAxIChDaGFyLnVuc2FmZV9jaHIgbjIpOworCQlTdHJpbmcudW5zYWZlX3NldCBzIDIgKENoYXIudW5zYWZlX2NociBuMSk7CisJCVN0cmluZy51bnNhZmVfc2V0IHMgMyAoQ2hhci51bnNhZmVfY2hyIG4wKTsKKwkJcworCQkKK2xldCBkZWNvZGVfZnJhbWVfc2l6ZSBzID0gCisJbGV0IG4zID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMF0pIGluCisJbGV0IG4yID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMV0pIGluCisJbGV0IG4xID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMl0pIGluCisJbGV0IG4wID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bM10pIGluCisJCUludDMyLmxvZ29yCisJCShJbnQzMi5zaGlmdF9sZWZ0IG4zIDI0KQorCQkoSW50MzIubG9nb3IKKwkJCShJbnQzMi5zaGlmdF9sZWZ0IG4yIDE2KQorCQkJKEludDMyLmxvZ29yCisJCQkJKEludDMyLnNoaWZ0X2xlZnQgbjEgOCkKKwkJCQluMCkpCisKK2NsYXNzIHQgPyhtYXhfbGVuZ3RoPVN5cy5tYXhfc3RyaW5nX2xlbmd0aCkgKHRyYW5zcG9ydDogVC50KSA9CitvYmplY3QgKHNlbGYpCisJaW5oZXJpdCBULnQKKworCW1ldGhvZCBpc09wZW4gPSB0cmFuc3BvcnQjaXNPcGVuCisJbWV0aG9kIG9wbiA9IHRyYW5zcG9ydCNvcG4KKwltZXRob2QgY2xvc2UgPSB0cmFuc3BvcnQjY2xvc2UKKyAKKwl2YWwgbXV0YWJsZSByZWFkX2J1ZiA9IE5vbmUKKwl2YWwgbXV0YWJsZSByZWFkX2J1Zl9vZmZzZXQgPSAwCisJdmFsIG11dGFibGUgd3JpdGVfYnVmID0gIiIKKworCW1ldGhvZCBwcml2YXRlIHJlYWRfZnJhbWUgPQorCQlsZXQgbGVuX2J1ZiA9IFN0cmluZy5jcmVhdGUgNCBpbgorCQlhc3NlcnQgKHRyYW5zcG9ydCNyZWFkQWxsIGxlbl9idWYgMCA0ID0gNCk7IAorCQkKKwkJbGV0IHNpemUgPSBJbnQzMi50b19pbnQgKGRlY29kZV9mcmFtZV9zaXplIGxlbl9idWYpIGluCisJCQorCQkoaWYgc2l6ZSA8IDAKKwkJdGhlbiBmYWlsd2l0aCAoUHJpbnRmLnNwcmludGYgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICglaSkhIiBzaXplKSk7CisJCQorCQkoaWYgc2l6ZSA+IG1heF9sZW5ndGgKKwkJdGhlbiBmYWlsd2l0aCAoUHJpbnRmLnNwcmludGYgIkZyYW1lIHNpemUgKCVpKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICglaSkhIiBzaXplIG1heF9sZW5ndGgpKTsKKworCQlsZXQgYnVmID0gU3RyaW5nLmNyZWF0ZSBzaXplIGluCisJCQlhc3NlcnQgKHRyYW5zcG9ydCNyZWFkQWxsIGJ1ZiAwIHNpemUgPSBzaXplKTsKKwkJCXJlYWRfYnVmIDwtIFNvbWUgYnVmOworCQkJcmVhZF9idWZfb2Zmc2V0IDwtIDAKKworCW1ldGhvZCBwcml2YXRlIHJlYWRfZnJvbV9mcmFtZSBmcmFtZSBidWYgb2ZmIGxlbiA9CisJCWxldCB0b19jb3B5ID0gbWluIGxlbiAoKFN0cmluZy5sZW5ndGggZnJhbWUpIC0gcmVhZF9idWZfb2Zmc2V0KSBpbgorCQkJU3RyaW5nLmJsaXQgZnJhbWUgcmVhZF9idWZfb2Zmc2V0IGJ1ZiBvZmYgdG9fY29weTsKKwkJCXJlYWRfYnVmX29mZnNldCA8LSByZWFkX2J1Zl9vZmZzZXQgKyB0b19jb3B5OworCQkJdG9fY29weQorCisJbWV0aG9kIHJlYWQgYnVmIG9mZiBsZW4gPSAKKwkJbWF0Y2ggcmVhZF9idWYgd2l0aAorCQl8IFNvbWUgZnJhbWUgLT4gCisJCQlsZXQgaSA9IHNlbGYjcmVhZF9mcm9tX2ZyYW1lIGZyYW1lIGJ1ZiBvZmYgbGVuIGluCisJCQlpZiBpID4gMAorCQkJdGhlbiBpCisJCQllbHNlIGJlZ2luCisJCQkJc2VsZiNyZWFkX2ZyYW1lOyAKKwkJCQlzZWxmI3JlYWRfZnJvbV9mcmFtZSBmcmFtZSBidWYgb2ZmIGxlbgorCQkJZW5kCisJCXwgTm9uZSAtPgorCQkJCXNlbGYjcmVhZF9mcmFtZTsKKwkJCQlzZWxmI3JlYWQgYnVmIG9mZiBsZW4gCisJIAorCW1ldGhvZCB3cml0ZSBidWYgb2ZmIGxlbiA9IAorCQl3cml0ZV9idWYgPC0gd3JpdGVfYnVmIF4gKFN0cmluZy5zdWIgYnVmIG9mZiBsZW4pCisKKwltZXRob2QgZmx1c2ggPSAKKwkJbGV0IGVuY29kZWRfc2l6ZSA9IGVuY29kZV9mcmFtZV9zaXplIChJbnQzMi5vZl9pbnQgKFN0cmluZy5sZW5ndGggd3JpdGVfYnVmKSkgaW4KKwkJCXRyYW5zcG9ydCN3cml0ZSBlbmNvZGVkX3NpemUgMCAoU3RyaW5nLmxlbmd0aCBlbmNvZGVkX3NpemUpOworCQkJdHJhbnNwb3J0I3dyaXRlIHdyaXRlX2J1ZiAwIChTdHJpbmcubGVuZ3RoIHdyaXRlX2J1Zik7CisJCQl0cmFuc3BvcnQjZmx1c2g7IAorCQkJd3JpdGVfYnVmIDwtICIiCitlbmQKKworCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RTaW1wbGVTZXJ2ZXIubWwgYi9saWIvb2NhbWwvc3JjL1RTaW1wbGVTZXJ2ZXIubWwKaW5kZXggZDE5ZDhjNS4uMjkyN2MwOCAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9UU2ltcGxlU2VydmVyLm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVFNpbXBsZVNlcnZlci5tbApAQCAtMjYsMTMgKzI2LDE1IEBACiAgIG1ldGhvZCBzZXJ2ZSA9CiAgICAgdHJ5CiAgICAgICBzdCNsaXN0ZW47Ci0gICAgICBsZXQgYyA9IHN0I2FjY2VwdCBpbgotICAgICAgbGV0IHRyYW5zID0gdGYjZ2V0VHJhbnNwb3J0IGMgaW4KLSAgICAgIGxldCBpbnAgPSBpcGYjZ2V0UHJvdG9jb2wgdHJhbnMgaW4KLSAgICAgIGxldCBvcCA9IG9wZiNnZXRQcm90b2NvbCB0cmFucyBpbgotICAgICAgICB0cnkKLSAgICAgICAgICB3aGlsZSAocGYjcHJvY2VzcyBpbnAgb3ApIGRvICgpIGRvbmU7Ci0gICAgICAgICAgdHJhbnMjY2xvc2UKLSAgICAgICAgd2l0aCBlIC0+IHRyYW5zI2Nsb3NlOyByYWlzZSBlCisgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgIGxldCBjID0gc3QjYWNjZXB0IGluCisgICAgICAgIGxldCB0cmFucyA9IHRmI2dldFRyYW5zcG9ydCBjIGluCisgICAgICAgIGxldCBpbnAgPSBpcGYjZ2V0UHJvdG9jb2wgdHJhbnMgaW4KKyAgICAgICAgbGV0IG9wID0gb3BmI2dldFByb3RvY29sIHRyYW5zIGluCisgICAgICAgICAgdHJ5CisgICAgICAgICAgICB3aGlsZSAocGYjcHJvY2VzcyBpbnAgb3ApIGRvICgpIGRvbmU7CisgICAgICAgICAgICB0cmFucyNjbG9zZQorICAgICAgICAgIHdpdGggZSAtPiB0cmFucyNjbG9zZTsgcmFpc2UgZQorICAgICAgZG9uZQogICAgIHdpdGggXyAtPiAoKQogZW5kCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RocmlmdC5tbCBiL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCmluZGV4IDhkYzlhZmEuLmYwZDdhNDIgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUJvb2wgOiBib29sIC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUJ5dGUgOiBpbnQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlSTE2IDogaW50IC0+IHVuaXQKLSAgICBtZXRob2QgdmlydHVhbCB3cml0ZUkzMiA6IGludCAtPiB1bml0CisgICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVJMzIgOiBJbnQzMi50IC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUk2NCA6IEludDY0LnQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlRG91YmxlIDogZmxvYXQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlU3RyaW5nIDogc3RyaW5nIC0+IHVuaXQKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRCb29sIDogYm9vbAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRCeXRlIDogaW50CiAgICAgbWV0aG9kIHZpcnR1YWwgcmVhZEkxNiA6IGludAotICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRJMzI6IGludAorICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRJMzI6IEludDMyLnQKICAgICBtZXRob2QgdmlydHVhbCByZWFkSTY0IDogSW50NjQudAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWREb3VibGUgOiBmbG9hdAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRTdHJpbmcgOiBzdHJpbmcKQEAgLTI2MSw2ICsyNjEsOCBAQAogICAgICAgfCBORUdBVElWRV9TSVpFCiAgICAgICB8IFNJWkVfTElNSVQKICAgICAgIHwgQkFEX1ZFUlNJT04KKyAgICAgIHwgTk9UX0lNUExFTUVOVEVECisgICAgICB8IERFUFRIX0xJTUlUCiAKICAgZXhjZXB0aW9uIEUgb2YgZXhuX3R5cGUgKiBzdHJpbmc7OwogCkBAIC0yOTIsMjIgKzI5NCwzNyBAQAogICAgICAgfCBXUk9OR19NRVRIT0RfTkFNRQogICAgICAgfCBCQURfU0VRVUVOQ0VfSUQKICAgICAgIHwgTUlTU0lOR19SRVNVTFQKKyAgICAgIHwgSU5URVJOQUxfRVJST1IKKyAgICAgIHwgUFJPVE9DT0xfRVJST1IKKyAgICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICAgIHwgSU5WQUxJRF9QUk9UT0NPTAorICAgICAgfCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogCiAgIGxldCB0eXBfb2ZfaSA9IGZ1bmN0aW9uCi0gICAgICAwIC0+IFVOS05PV04KLSAgICB8IDEgLT4gVU5LTk9XTl9NRVRIT0QKLSAgICB8IDIgLT4gSU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICB8IDMgLT4gV1JPTkdfTUVUSE9EX05BTUUKLSAgICB8IDQgLT4gQkFEX1NFUVVFTkNFX0lECi0gICAgfCA1IC0+IE1JU1NJTkdfUkVTVUxUCisgICAgICAwbCAtPiBVTktOT1dOCisgICAgfCAxbCAtPiBVTktOT1dOX01FVEhPRAorICAgIHwgMmwgLT4gSU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICB8IDNsIC0+IFdST05HX01FVEhPRF9OQU1FCisgICAgfCA0bCAtPiBCQURfU0VRVUVOQ0VfSUQKKyAgICB8IDVsIC0+IE1JU1NJTkdfUkVTVUxUCisgICAgfCA2bCAtPiBJTlRFUk5BTF9FUlJPUgorICAgIHwgN2wgLT4gUFJPVE9DT0xfRVJST1IKKyAgICB8IDhsIC0+IElOVkFMSURfVFJBTlNGT1JNCisgICAgfCA5bCAtPiBJTlZBTElEX1BST1RPQ09MCisgICAgfCAxMGwgLT4gVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICB8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yOzsKICAgbGV0IHR5cF90b19pID0gZnVuY3Rpb24KLSAgICB8IFVOS05PV04gLT4gMAotICAgIHwgVU5LTk9XTl9NRVRIT0QgLT4gMQotICAgIHwgSU5WQUxJRF9NRVNTQUdFX1RZUEUgLT4gMgotICAgIHwgV1JPTkdfTUVUSE9EX05BTUUgLT4gMwotICAgIHwgQkFEX1NFUVVFTkNFX0lEIC0+IDQKLSAgICB8IE1JU1NJTkdfUkVTVUxUIC0+IDUKKyAgICB8IFVOS05PV04gLT4gMGwKKyAgICB8IFVOS05PV05fTUVUSE9EIC0+IDFsCisgICAgfCBJTlZBTElEX01FU1NBR0VfVFlQRSAtPiAybAorICAgIHwgV1JPTkdfTUVUSE9EX05BTUUgLT4gM2wKKyAgICB8IEJBRF9TRVFVRU5DRV9JRCAtPiA0bAorICAgIHwgTUlTU0lOR19SRVNVTFQgLT4gNWwKKyAgICB8IElOVEVSTkFMX0VSUk9SIC0+IDZsCisgICAgfCBQUk9UT0NPTF9FUlJPUiAtPiA3bAorICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0gLT4gOGwKKyAgICB8IElOVkFMSURfUFJPVE9DT0wgLT4gOWwKKyAgICB8IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0+IDEwbAogCiAgIGNsYXNzIHQgPQogICBvYmplY3QgKHNlbGYpCkBAIC0zMzcsMjMgKzM1NCwyMSBAQAogCiAgIGxldCByZWFkIChpcHJvdCA6IFByb3RvY29sLnQpID0KICAgICBsZXQgbXNnID0gcmVmICIiIGluCi0gICAgbGV0IHR5cCA9IHJlZiAwIGluCisgICAgbGV0IHR5cCA9IHJlZiAwbCBpbgogICAgICAgaWdub3JlIGlwcm90I3JlYWRTdHJ1Y3RCZWdpbjsKICAgICAgICh0cnkKICAgICAgICAgICAgd2hpbGUgdHJ1ZSBkbwogICAgICAgICAgICAgIGxldCAobmFtZSxmdCxpZCkgPWlwcm90I3JlYWRGaWVsZEJlZ2luIGluCi0gICAgICAgICAgICAgICBpZiBmdCA9IFByb3RvY29sLlRfU1RPUCB0aGVuCi0gICAgICAgICAgICAgICAgIHJhaXNlIEJyZWFrCisgICAgICAgICAgICAgICBpZiBmdCA9IFByb3RvY29sLlRfU1RPUAorICAgICAgICAgICAgICAgdGhlbiByYWlzZSBCcmVhawogICAgICAgICAgICAgICAgZWxzZSAoKTsKICAgICAgICAgICAgICAgIChtYXRjaCBpZCB3aXRoCi0gICAgICAgICAgICAgfCAxIC0+IChpZiBmdCA9IFByb3RvY29sLlRfU1RSSU5HIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgOj0gKGlwcm90I3JlYWRTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXByb3Qjc2tpcCBmdCkKLSAgICAgICAgICAgICB8IDIgLT4gKGlmIGZ0ID0gUHJvdG9jb2wuVF9JMzIgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cCA6PSBpcHJvdCNyZWFkSTMyCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXByb3Qjc2tpcCBmdCkKKyAgICAgICAgICAgICB8IDEgLT4gKGlmIGZ0ID0gUHJvdG9jb2wuVF9TVFJJTkcKKyAgICAgICAgICAgICAgIHRoZW4gbXNnIDo9IChpcHJvdCNyZWFkU3RyaW5nKQorICAgICAgICAgICAgICAgZWxzZSBpcHJvdCNza2lwIGZ0KQorICAgICAgICAgICAgIHwgMiAtPiAoaWYgZnQgPSBQcm90b2NvbC5UX0kzMgorICAgICAgICAgICAgICAgdGhlbiB0eXAgOj0gaXByb3QjcmVhZEkzMgorICAgICAgICAgICAgICAgZWxzZSBpcHJvdCNza2lwIGZ0KQogICAgICAgICAgICAgIHwgXyAtPiBpcHJvdCNza2lwIGZ0KTsKICAgICAgICAgICAgICAgIGlwcm90I3JlYWRGaWVsZEVuZAogICAgICAgZG9uZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3VybCBiL2xpYi9vY2FtbC91cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZDYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC91cmwKQEAgLTAsMCArMSwyIEBACithcmNoaXZlOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBVUkwpIgorY2hlY2tzdW06ICJYWFgoRklMTCBNRSBJTiBXSVRIIE1ENSkiCmRpZmYgLS1naXQgYS9saWIvcGVybC9NQU5JRkVTVC5TS0lQIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYzYjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApAQCAtMCwwICsxLDEzIEBACitibGliLy4qJAorYnVpbGQtY3Bhbi1kaXN0LnNoCitGaXh1cERpc3QucGwKK01BTklGRVNULmJhaworTUFOSUZFU1QuU0tJUAorTVlNRVRBLmpzb24KK01ha2VmaWxlCitNYWtlZmlsZS5hbQorTWFrZWZpbGUuaW4KK3BtX3RvX2JsaWIKK3Rlc3QvTWFrZWZpbGUuYW0KK3Rlc3QvTWFrZWZpbGUuaW4KK3Rvb2xzL0ZpeHVwRGlzdC5wbApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuUEwgYi9saWIvcGVybC9NYWtlZmlsZS5QTAppbmRleCA5NGVhMzdjLi5iZGVhYWQyIDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5QTAorKysgYi9saWIvcGVybC9NYWtlZmlsZS5QTApAQCAtMTcsMTMgKzE3LDIwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwogdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKCAnTkFNRScgPT4gJ1RocmlmdCcsCi0gICAgICAgICAgICAgICAnVkVSU0lPTl9GUk9NJyA9PiAnbGliL1RocmlmdC5wbScsCi0gICAgICAgICAgICAgICAnUFJFUkVRX1BNJyAgICAgICAgICAgICAgPT4gewotICAgICAgICAgICAgICAgICAgICdCaXQ6OlZlY3RvcicgPT4gMCwKKworV3JpdGVNYWtlZmlsZSggQUJTVFJBQ1QgPT4gJ0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LicsCisgICAgICAgICAgICAgICBBVVRIT1IgPT4gJ0FwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4nLAorICAgICAgICAgICAgICAgTElDRU5TRSA9PiAnYXBhY2hlXzJfMCcsCisgICAgICAgICAgICAgICBNSU5fUEVSTF9WRVJTSU9OID0+ICc1LjAxMDAwMCcsCisgICAgICAgICAgICAgICBOQU1FID0+ICdUaHJpZnQnLAorICAgICAgICAgICAgICAgTkVFRFNfTElOS0lORyA9PiAwLAorICAgICAgICAgICAgICAgUFJFUkVRX1BNID0+IHsKKyAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICdDbGFzczo6QWNjZXNzb3InID0+IDAKICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAoJF0gPj0gNS4wMDUgPwotICggICAgICAgICAgICAgICAgQVVUSE9SICAgICA9PiAnVCBKYWtlIEx1Y2lhbmkgPGpha2Vyc0BnbWFpbC5jb20+JykgOiAoKSksCi0gICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgVkVSU0lPTl9GUk9NID0+ICdsaWIvVGhyaWZ0LnBtJyApOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuYW0gYi9saWIvcGVybC9NYWtlZmlsZS5hbQppbmRleCA4ZTBjYWFlLi5mYTBmMTZiIDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGVybC9NYWtlZmlsZS5hbQpAQCAtMjMsMzMgKzIzLDg2IEBACiAJJChQRVJMKSBNYWtlZmlsZS5QTCBNQUtFRklMRT1NYWtlZmlsZS1wZXJsLm1rIElOU1RBTExESVJTPSQoSU5TVEFMTERJUlMpIElOU1RBTExfQkFTRT0kKFBFUkxfUFJFRklYKQogCiBhbGwtbG9jYWw6IE1ha2VmaWxlLXBlcmwubWsKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsKKwkkKE1BS0UpIC1mICQ8CiAJZmluZCBibGliIC1uYW1lICdNYWtlZmlsZSonIC1leGVjIHJtIC1mIHt9IFw7CiAKLWNoZWNrLWxvY2FsOgotCSQoUEVSTCkgLUlibGliL2xpYiAtSUBhYnNfc3JjZGlyQCAtSUBidWlsZGRpckAvdGVzdC9nZW4tcGVybCBcCi0JCUBhYnNfc3JjZGlyQC90ZXN0LnBsIEBhYnNfc3JjZGlyQC90ZXN0LyoudAotCiBpbnN0YWxsLWV4ZWMtbG9jYWw6IE1ha2VmaWxlLXBlcmwubWsKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsgaW5zdGFsbCBERVNURElSPSQoREVTVERJUikvCisJJChNQUtFKSAtZiAkPCBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KIAogY2xlYW4tbG9jYWw6CiAJaWYgdGVzdCAtZiBNYWtlZmlsZS1wZXJsLm1rIDsgdGhlbiBcCiAJCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBjbGVhbiA7IFwKIAlmaQotCXJtIC1mIE1ha2VmaWxlLXBlcmwubWsub2xkCisJJChSTSkgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSAtciBnZW4tcGVybCBnZW4tcGVybDIKIAogRVhUUkFfRElTVCA9IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlidWlsZC1jcGFuLWRpc3Quc2ggXAogCU1ha2VmaWxlLlBMIFwKIAl0ZXN0LnBsIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtIFwKKwlsaWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBcCiAJbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gXAogCWxpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBcCiAJbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gXAorCWxpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0gXAorCWxpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0gXAorCWxpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbSBcCiAJbGliL1RocmlmdC9Qcm90b2NvbC5wbSBcCisJbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbSBcCiAJbGliL1RocmlmdC9TZXJ2ZXIucG0gXAorCWxpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtIFwKIAlsaWIvVGhyaWZ0L1NvY2tldC5wbSBcCi0JbGliL1RocmlmdC9UcmFuc3BvcnQucG0KKwlsaWIvVGhyaWZ0L1NTTFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbSBcCisJbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1R5cGUucG0gXAorCWxpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIFwKKwlSRUFETUUubWQKKworVEhSSUZUID0gQHRvcF9idWlsZGRpckAvY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX0lGID0gQHRvcF9zcmNkaXJAL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK05BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICBAdG9wX3NyY2RpckAvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CitOQU1FX0FHR1IgPSBAdG9wX3NyY2RpckAvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisKK1RIUklGVFRFU1RfR0VOID0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1NlY29uZFNlcnZpY2UucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQorCitCRU5DSE1BUktfR0VOID0gXAorCWdlbi1wZXJsL0JlbmNobWFya1NlcnZpY2UucG0gXAorCWdlbi1wZXJsL0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVHlwZXMucG0KKworQUdHUl9HRU4gPSBcCisJZ2VuLXBlcmwyL0FnZ3IucG0gXAorCWdlbi1wZXJsMi9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsMi9UeXBlcy5wbQorCitQRVJMX0dFTiA9IFwKKwkkKFRIUklGVFRFU1RfR0VOKSBcCisJJChCRU5DSE1BUktfR0VOKSBcCisJJChBR0dSX0dFTikKKworQlVJTFRfU09VUkNFUyA9ICQoUEVSTF9HRU4pCisKK2NoZWNrLWxvY2FsOiAkKFBFUkxfR0VOKQorCSQoUEVSTCkgLUlibGliL2xpYiAtSUBhYnNfc3JjZGlyQCAtSUBidWlsZGRpckAvZ2VuLXBlcmwyIC1JQGJ1aWxkZGlyQC9nZW4tcGVybCBcCisJCUBhYnNfc3JjZGlyQC90ZXN0LnBsIEBhYnNfc3JjZGlyQC90ZXN0LyoudAorCiskKFRIUklGVFRFU1RfR0VOKTogJChUSFJJRlRfSUYpICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQ8CisKKyQoQkVOQ0hNQVJLX0dFTik6ICQoTkFNRV9CRU5DSE1BUktTRVJWSUNFKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEFHR1JfR0VOKTogJChOQU1FX0FHR1IpICQoVEhSSUZUKQorCSQoTUtESVJfUCkgZ2VuLXBlcmwyCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBlcmwyIC0tZ2VuIHBlcmwgJDwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL1JFQURNRSBiL2xpYi9wZXJsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxNDg4Yi4uMDAwMDAwMAotLS0gYS9saWIvcGVybC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1UaHJpZnQgUGVybCBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIFBlcmwKLT09PT09PT09PT09PT09PT09PT09PQotCi1UaHJpZnQgcmVxdWlyZXMgUGVybCA+PSA1LjYuMAotCi1FeGNlcHRpb25zIGFyZSB0aHJvd24gd2l0aCBkaWUgc28gYmUgc3VyZSB0byB3cmFwIGV2YWx7fSBzdGF0bWVudHMKLWFyb3VuZCBhbnkgY29kZSB0aGF0IGNvbnRhaW5zIGV4Y2VwdGlvbnMuCi0KLVRoZSA2NGJpdCBJbnRlZ2VycyB3b3JrIG9ubHkgdXB0byAyXjQyIG9uIG15IG1hY2hpbmUgOi0/Ci1NYXRoOjpCaWdJbnQgaXMgcHJvYmFibHkgbmVlZGVkLgotCi1QbGVhc2Ugc2VlIHR1dG9yYWwgYW5kIHRlc3QgZGlycyBmb3IgZXhhbXBsZXMuLi4KLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotQml0OjpWZWN0b3IgICAgIC0gY29tZXMgd2l0aCBtb2Rlcm4gcGVybCBpbnN0YWxsYXRpb25zLgotQ2xhc3M6OkFjY2Vzc29yCi0KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL1JFQURNRS5tZCBiL2xpYi9wZXJsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDFlNWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTI0IEBACitUaHJpZnQgUGVybCBTb2Z0d2FyZSBMaWJyYXJ5CisKKyMgU3VtbWFyeQorCitBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4KK0l0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrCitlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiAgQSBsYW5ndWFnZS1uZXV0cmFsIElETAoraXMgdXNlZCB0byBnZW5lcmF0ZSBmdW5jdGlvbmluZyBjbGllbnQgbGlicmFyaWVzIGFuZCBzZXJ2ZXItc2lkZSBoYW5kbGluZyBmcmFtZXdvcmtzLgorCisjIExpY2Vuc2UKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRm9yIE1vcmUgSW5mb3JtYXRpb24KKworU2VlIHRoZSBbQXBhY2hlIFRocmlmdCBXZWIgU2l0ZV0oaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyMgVXNpbmcgVGhyaWZ0IHdpdGggUGVybAorCitUaHJpZnQgcmVxdWlyZXMgUGVybCA+PSA1LjEwLjAKKworVW5leHBlY3RlZCBleGNlcHRpb25zIGluIGEgc2VydmljZSBoYW5kbGVyIGFyZSBjb252ZXJ0ZWQgdG8KK1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aXRoIHR5cGUgSU5URVJOQUwgRVJST1IgYW5kIHRoZSBzdHJpbmcKK29mIHRoZSBleGNlcHRpb24gaXMgZGVsaXZlcmVkIGFzIHRoZSBtZXNzYWdlLgorCitPbiB0aGUgY2xpZW50IHNpZGUsIGV4Y2VwdGlvbnMgYXJlIHRocm93biB3aXRoIGRpZSwgc28gYmUgc3VyZQordG8gd3JhcCBldmFse30gc3RhdG1lbnRzIGFyb3VuZCBhbnkgY29kZSB0aGF0IGNvbnRhaW5zIGV4Y2VwdGlvbnMuCisKK1BsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4KKworVGhlIFBlcmwgRm9ya2luZ1NlcnZlciBpZ25vcmVzIFNJR0NITEQgYWxsb3dpbmcgdGhlIGZvcmtzIHRvIGJlCityZWFwZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmF0dXJhbGx5IHdoZW4gdGhleSBleGl0LiAgVGhpcyBtZWFucworb25lIGNhbm5vdCB1c2UgYSBjdXN0b20gU0lHQ0hMRCBoYW5kbGVyIGluIHRoZSBjb25zdW1pbmcgcGVybAoraW1wbGVtZW50YXRpb24gdGhhdCBjYWxscyBzZXJ2ZSgpLiAgSXQgaXMgYWNjZXB0YWJsZSB0byB1c2UKK2EgY3VzdG9tIFNJR0NITEQgaGFuZGxlciB3aXRoaW4gYSB0aHJpZnQgaGFuZGxlciBpbXBsZW1lbnRhdGlvbgorYXMgdGhlIEZvcmtpbmdTZXJ2ZXIgcmVzZXRzIHRoZSBmb3JrZWQgY2hpbGQgcHJvY2VzcyB0byB1c2UKK2RlZmF1bHQgc2lnbmFsIGhhbmRsaW5nLgorCisjIERlcGVuZGVuY2llcworCitUaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIG5vdCBwcm92aWRlZCBieSBQZXJsIDUuMTAuMCBidXQgYXJlIHJlcXVpcmVkCit0byB1c2UgVGhyaWZ0LgorCisjIyBSdW50aW1lCisKKyAgKiBCaXQ6OlZlY3RvcgorICAqIENsYXNzOjpBY2Nlc3NvcgorCisjIyMgSHR0cENsaWVudCBUcmFuc3BvcnQKKworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgVGhyaWZ0OjpIdHRwQ2xpZW50OgorCisgICogSFRUUDo6UmVxdWVzdAorICAqIElPOjpTdHJpbmcKKyAgKiBMV1A6OlVzZXJBZ2VudAorCisjIyMgU1NML1RMUworCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6OlNTTFNvY2tldCBvciBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDoKKworICAqIElPOjpTb2NrZXQ6OlNTTAorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMC4wCisKK1RoZSBzb2NrZXQgY2xhc3NlcyB3ZXJlIHJlZmFjdG9yZWQgaW4gMC4xMC4wIHNvIHRoYXQgdGhlcmUgaXMgb25lIHBhY2thZ2UgcGVyCitmaWxlLiAgVGhpcyBtZWFucyBgdXNlIFNvY2tldDtgIG5vIGxvbmdlciBkZWZpbmVzIFNTTFNvY2tldC4gIFlvdSBjYW4gdXNlIHRoaXMKK3RlY2huaXF1ZSB0byBtYWtlIHlvdXIgYXBwbGljYXRpb24gcnVuIGFnYWluc3QgMC4xMC4wIGFzIHdlbGwgYXMgZWFybGllciB2ZXJzaW9uczoKKworYGV2YWwgeyByZXF1aXJlIFRocmlmdDo6U1NMU29ja2V0OyB9IG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ6OlNvY2tldDsgfWAKKworIyMgMC4xMS4wCisKKyAgKiBOYW1lc3BhY2VzIG9mIHBhY2thZ2VzIHRoYXQgd2VyZSBub3Qgc2NvcGVkIHdpdGhpbiBUaHJpZnQgaGF2ZSBiZWVuIGZpeGVkLgorICAqKiBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICoqIFRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEV4Y2VwdGlvbgorICAqKiBUTWVzc2FnZVR5cGUgaXMgbm93IFRocmlmdDo6VE1lc3NhZ2VUeXBlCisgICoqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24KKyAgKiogVFByb3RvY29sRmFjdG9yeSBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5CisgICoqIFRUcmFuc3BvcnRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbgorICAqKiBUVHlwZSBpcyBub3cgVGhyaWZ0OjpUVHlwZQorCitJZiB5b3UgbmVlZCBhIHNpbmdsZSB2ZXJzaW9uIG9mIHlvdXIgY29kZSB0byB3b3JrIHdpdGggYm90aCBvbGRlciBhbmQgbmV3ZXIgdGhyaWZ0CituYW1lc3BhY2UgY2hhbmdlcywgeW91IGNhbiBtYWtlIHRoZSBuZXcsIGNvcnJlY3QgbmFtZXNwYWNlcyBiZWhhdmUgbGlrZSB0aGUgb2xkIG9uZXMKK2luIHlvdXIgZmlsZXMgd2l0aCB0aGlzIHRlY2huaXF1ZSB0byBjcmVhdGUgYW4gYWxpYXMsIHdoaWNoIHdpbGwgYWxsb3cgeW91IGNvZGUgdG8KK3J1biBhZ2FpbnN0IGVpdGhlciB2ZXJzaW9uIG9mIHRoZSBwZXJsIHJ1bnRpbWUgZm9yIHRocmlmdDoKKworYEJFR0lOIHsqVFR5cGU6OiA9ICpUaHJpZnQ6OlRUeXBlOjp9YAorCisgICogUGFja2FnZXMgZm91bmQgaW4gVGhyaWZ0LnBtIHdlcmUgbW92ZWQgaW50byB0aGUgVGhyaWZ0LyBkaXJlY3RvcnkgaW4gc2VwYXJhdGUgZmlsZXM6CisgICoqIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VEV4Y2VwdGlvbiBpcyBub3cgaW4gVGhyaWZ0L0V4Y2VwdGlvbi5wbQorICAqKiBUaHJpZnQ6OlRNZXNzYWdlVHlwZSBpcyBub3cgaW4gVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCisgICoqIFRocmlmdDo6VFR5cGUgaXMgbm93IGluIFRocmlmdC9UeXBlLnBtCisKK0lmIHlvdSBuZWVkIHRvIG1vZGlmeSB5b3VyIGNvZGUgdG8gd29yayBhZ2FpbnN0IGJvdGggb2xkZXIgb3IgbmV3ZXIgdGhyaWZ0IHZlcnNpb25zLAoreW91IGNhbiBkZWFsIHdpdGggdGhlc2UgY2hhbmdlcyBpbiBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdheSBpbiB5b3VyIHByb2plY3RzIHVzaW5nIGV2YWw6CisKK2BldmFsICB7IHJlcXVpcmUgVGhyaWZ0OjpFeGNlcHRpb247IHJlcXVpcmUgVGhyaWZ0OjpNZXNzYWdlVHlwZTsgcmVxdWlyZSBUaHJpZnQ6OlR5cGU7IH0KKyBvciBkbyB7IHJlcXVpcmUgVGhyaWZ0OyB9YAorCisjIERlcHJlY2F0aW9ucworCisjIyAwLjExLjAKKworVGhyaWZ0OjpIdHRwQ2xpZW50IHNldFJlY3ZUaW1lb3V0KCkgYW5kIHNldFNlbmRUaW1lb3V0KCkgYXJlIGRlcHJlY2F0ZWQuIAorVXNlIHNldFRpbWVvdXQgaW5zdGVhZC4KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoIGIvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlMjJlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhZnRlciB0YWdnaW5nIHRoZSByZXBvc2l0b3J5IGFuZCB1cGRhdGluZworIyB0aGUgdmVyc2lvbiBmaWxlcyBmb3IgYSByZWxlYXNlLiAgSXQgd2lsbCBjcmVhdGUgYSBDUEFOIGFyY2hpdmUuICBSdW4gdGhpcworIyBmcm9tIGluc2lkZSBhIGRvY2tlciBpbWFnZSBsaWtlIHVidW50dS14ZW5pYWwuCisjCisKK3NldCAtZQorCitybSAtZiBNQU5JRkVTVAorcm0gLXJmIFRocmlmdC0qCisKKyMgc2V0dXAgY3BhbiB3aXRob3V0IGEgcHJvbXB0CitlY2hvIHwgY3BhbgorY3BhbiBpbnN0YWxsIEhUVFA6OkRhdGUKK2NwYW4gaW5zdGFsbCBDUEFOCitjcGFuIGluc3RhbGwgQ1BBTjo6TWV0YSBFeHRVdGlsczo6TWFrZU1ha2VyIEpTT046OlBQCisKK3BlcmwgTWFrZWZpbGUuUEwKK3JtIE1ZTUVUQS55bWwKK21ha2UgbWFuaWZlc3QKK21ha2UgZGlzdAorCisjCisjIFdlIHVucGFjayB0aGUgYXJjaGl2ZSBzbyB3ZSBjYW4gYWRkIHZlcnNpb24gbWV0YWRhdGEgZm9yIENQQU4KKyMgc28gdGhhdCBpdCBwcm9wZXJseSBpbmRleGVzIFRocmlmdCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGZpbGVzLgorIworCitlY2hvICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK3NldCAteAorCitESVNURklMRT0kKGxzIFRocmlmdCouZ3opCitORVdGSUxFPSR7RElTVEZJTEUvdC12L3QtfQoraWYgW1sgIiRESVNURklMRSIgIT0gIiRORVdGSUxFIiBdXTsgdGhlbgorICAgIG12ICRESVNURklMRSAkTkVXRklMRQorICAgIERJU1RGSUxFPSIkTkVXRklMRSIKK2ZpCit0YXIgeHpmICRESVNURklMRQorcm0gJERJU1RGSUxFCitESVNURElSPSQobHMgLWQgVGhyaWZ0KikKKyMgY3BhbiBkb2Vzbid0IGxpa2UgIlRocmlmdC12MC5ubi4wIGFzIGEgZGlyZWN0b3J5IG5hbWUKKyMgbmVlZHMgdG8gYmUgVGhyaWZ0LTAubm4uMAorTkVXRElSPSR7RElTVERJUi90LXYvdC19CitpZiBbWyAiJERJU1RESVIiICE9ICIkTkVXRElSIiBdXTsgdGhlbgorICAgIG12ICRESVNURElSICRORVdESVIKKyAgICBESVNURElSPSIkTkVXRElSIgorZmkKK2NkICRESVNURElSCitjcCAtcCAuLi9NYWtlZmlsZS5QTCAuCitwZXJsIC4uL3Rvb2xzL0ZpeHVwRGlzdC5wbAorY2QgLi4KK3RhciBjdnpmICRESVNURklMRSAkRElTVERJUgorcm0gLXIgJERJU1RESVIKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTgyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsMiBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpLgorQWRkaXRpb25hbCBwZXJsIGNvZGluZyBzdGFuZGFyZHMgY2FuIGJlIGZvdW5kIGluIFtwZXJsc3R5bGVdKGh0dHA6Ly9wZXJsZG9jLnBlcmwub3JnL3BlcmxzdHlsZS5odG1sKS4KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCmluZGV4IGZlMGY4ZTcuLmFiNDA5MzAgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQpAQCAtMTcsMTYxICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotb3VyICRWRVJTSU9OID0gJzAuMSc7Ci0KLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogIwotIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIyBWZXJzaW9uaW5nCiAjCi1wYWNrYWdlIFRUeXBlOwotdXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwotdXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwotdXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwotdXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwotdXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwotdXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwotdXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwotdXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwotdXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKLXVzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Ci11c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwotdXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKLXVzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Ci11c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwotdXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKLXVzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Ci11c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OwotMTsKLQorIyBFdmVyeSBwZXJsIG1vZHVsZSBmb3IgVGhyaWZ0IHdpbGwgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uCisjIGRlY2xhcmF0aW9uLiAgRm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgY2hhbmdlIGl0IGJlbG93IHRvCisjIHNvbWV0aGluZyBsaWtlICJ2MC4xMS4wIiBhbmQgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbiBhbGwKKyMgb2YgdGhlIGZpbGVzIHdpbGwgcGljayBpdCB1cCBmcm9tIGhlcmUuCiAjCi0jIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwotIwotcGFja2FnZSBUTWVzc2FnZVR5cGU7Ci11c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Ci11c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Ci11c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Ci11c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7Ci0xOwogCi1wYWNrYWdlIFRocmlmdDo6VEV4Y2VwdGlvbjsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0xOwotCi1wYWNrYWdlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLXVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKLQotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSA9PiAyOwotdXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgPT4gNDsKLXVzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICA9PiA1OwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0KLSAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIHJlYWQgewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRpbnB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgID0gMDsKLSAgICBteSAkZm5hbWUgPSB1bmRlZjsKLSAgICBteSAkZnR5cGUgPSAwOwotICAgIG15ICRmaWQgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOwotCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgbGFzdDsgbmV4dDsKLSAgICAgICAgfQotCi0gICAgICBTV0lUQ0g6IGZvcigkZmlkKQotICAgICAgewotICAgICAgICAgIC8xLyAmJiBkb3sKLQotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cmluZygkc2VsZi0+e21lc3NhZ2V9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgLzIvICYmIGRvewotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpJMzIpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMigkc2VsZi0+e2NvZGV9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfTsKLQotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgfQotCi0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIHdyaXRlIHsKLSAgICBteSAkc2VsZiAgID0gc2hpZnQ7Ci0gICAgbXkgJG91dHB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLQotICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkc2VsZi0+Z2V0TWVzc2FnZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIGlmICgkc2VsZi0+Z2V0Q29kZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIGdldE1lc3NhZ2UKLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Ci19Ci0KLXN1YiBnZXRDb2RlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OwotfQorcGFja2FnZSBUaHJpZnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCJ2MS4wLjAiKTsKIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCmluZGV4IDY0ZDc5NTguLmQ2MjUwOWEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQpAQCAtMTcsMjcgKzE3LDI5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwotCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotdXNlIHV0Zjg7Ci11c2UgRW5jb2RlOwotCi11c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6UHJvdG9jb2w7Ci0KIHVzZSBCaXQ6OlZlY3RvcjsKK3VzZSBFbmNvZGU7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlR5cGU7Cit1c2UgdXRmODsKIAogIwogIyBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlByb3RvY29sJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBWRVJTSU9OX01BU0sgICA9PiAweGZmZmYwMDAwOwogdXNlIGNvbnN0YW50IFZFUlNJT05fMSAgICAgID0+IDB4ODAwMTAwMDA7Cit1c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCdoKicsIHBhY2soJ3MnLCAxKSkgPX4gbS8wMS87CiAKIHN1YiBuZXcKIHsKQEAgLTY1LDcgKzY3LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3ViIHdyaXRlU3RydWN0QmVnaW57CitzdWIgd3JpdGVTdHJ1Y3RCZWdpbgorewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgICByZXR1cm4gMDsKQEAgLTk2LDcgKzk5LDcgQEAKIHN1YiB3cml0ZUZpZWxkU3RvcAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRocmlmdDo6VFR5cGU6OlNUT1ApOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbgpAQCAtMjExLDcgKzIxNCwxMiBAQAogICAgIG15ICR2YWx1ZT0gc2hpZnQ7CiAKICAgICBteSAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOwotICAgICRzZWxmLT57dHJhbnN9LT53cml0ZShzY2FsYXIgcmV2ZXJzZSgkZGF0YSksIDgpOworICAgIGlmIChJU19CSUdfRU5ESUFOKSB7CisgICAgICAkc2VsZi0+e3RyYW5zfS0+d3JpdGUoJGRhdGEsIDgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICRzZWxmLT57dHJhbnN9LT53cml0ZShzY2FsYXIgcmV2ZXJzZSgkZGF0YSksIDgpOworICAgIH0KICAgICByZXR1cm4gODsKIH0KIApAQCAtMjQ2LDE0ICsyNTQsMTYgQEAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRJMzIoXCR2ZXJzaW9uKTsKICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSA+IDApIHsKICAgICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spICE9IFZFUlNJT05fMSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKQorICAgICAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CiAgICAgICB9CiAgICAgICAkJHR5cGUgPSAkdmVyc2lvbiAmIDB4MDAwMDAwZmY7CiAgICAgICByZXR1cm4KICAgICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgICAkc2VsZi0+cmVhZFN0cmluZygkbmFtZSkgKwogICAgICAgICAgICRzZWxmLT5yZWFkSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQorICAgIH0KKyAgICBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQogICAgICAgcmV0dXJuCiAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAkc2VsZi0+cmVhZFN0cmluZ0JvZHkoJG5hbWUsICR2ZXJzaW9uKSArICMgdmVyc2lvbiBoZXJlIGhvbGRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKQEAgLTI5MSw3ICszMDEsNyBAQAogCiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKIAotICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAkJGZpZWxkSWQgPSAwOwogICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQpAQCAtNDE5LDcgKzQyOSw3IEBACiAKICAgICBteSAoJGhpLCRsbyk9dW5wYWNrKCdOTicsJGRhdGEpOwogCi0gICAgbXkgJHZlYyA9IG5ldyBCaXQ6OlZlY3Rvcig2NCk7CisgICAgbXkgJHZlYyA9IEJpdDo6VmVjdG9yLT5uZXcoNjQpOwogCiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMzIsJGhpKTsKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwwLCRsbyk7CkBAIC00MzQsNyArNDQ0LDE0IEBACiAgICAgbXkgJHNlbGYgID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVlID0gc2hpZnQ7CiAKLSAgICBteSAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKKyAgICBteSAkZGF0YTsKKyAgICBpZiAoSVNfQklHX0VORElBTikgeworICAgICAgJGRhdGEgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCg4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKKyAgICB9CisKICAgICBteSBAYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwogCiAgICAgJCR2YWx1ZSA9ICRhcnJbMF07CkBAIC00NTIsNyArNDY5LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00NjcsNyArNDg1LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00NzgsNyArNDk3LDggQEAKICMgQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci11c2UgYmFzZSgnVFByb3RvY29sRmFjdG9yeScpOwordXNlIGJhc2UoJ1RocmlmdDo6VFByb3RvY29sRmFjdG9yeScpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC00OTIsNyArNTEyLDcgQEAKICAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICBteSAkdHJhbnMgPSBzaGlmdDsKIAotICAgIHJldHVybiBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnMpOworICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zKTsKIH0KIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCmluZGV4IDM4NjhjYTIuLjZiNWJmN2EgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQpAQCAtMTcsMTUgKzE3LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHBhY2thZ2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICMgQnVmZmVyZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA0MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwxNjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlR5cGU7CisKK3BhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeworICAgIHJldHVybgorICAgICAgICBzcHJpbnRmICclcyBlcnJvcjogJXMgKGNvZGUgJXMpJywKKyAgICAgICAgICByZWYoICRfWzBdICksCisgICAgICAgICAgKCAkX1swXS0+e21lc3NhZ2V9IHx8ICdlbXB0eSBtZXNzYWdlJyApLAorICAgICAgICAgICggZGVmaW5lZCAkX1swXS0+e2NvZGV9ID8gJF9bMF0tPntjb2RlfSA6ICd1bmRlZmluZWQnICk7CisgICAgfTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb247Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlRFeGNlcHRpb24nOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwordXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Cit1c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwordXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Cit1c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKK3VzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwordXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKK3VzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWQgeworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRpbnB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgID0gMDsKKyAgICBteSAkZm5hbWUgPSB1bmRlZjsKKyAgICBteSAkZnR5cGUgPSAwOworICAgIG15ICRmaWQgICA9IDA7CisKKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7CisgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgbGFzdDsgbmV4dDsKKyAgICAgICAgfQorCisgICAgICBTV0lUQ0g6IGZvcigkZmlkKQorICAgICAgeworICAgICAgICAgIC8xLyAmJiBkb3sKKworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgLzIvICYmIGRveworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgfTsKKworICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgfQorCisgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIHdyaXRlIHsKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgICA9IDA7CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdDo6VFR5cGU6OlNUUklORywgMSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0OjpUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gJHhmZXI7Cit9CisKK3N1YiBnZXRNZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OworfQorCitzdWIgZ2V0Q29kZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KaW5kZXggYjc4YjE5OC4uYmE4OWJhMyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KQEAgLTE3LDYgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0zMCw4ICszMSw4IEBACiAjIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKICMKIHBhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC02OCw3ICs2OSw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e3RyYW5zcG9ydH0pIHsKKyAgICAgICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOworICAgIH0KIH0KIAogIwpAQCAtMTYxLDQgKzE2NCwzMSBAQAogCiB9CiAKKyMKKyMgRnJhbWVkVHJhbnNwb3J0IGZhY3RvcnkgY3JlYXRlcyBmcmFtZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCisjCitwYWNrYWdlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgQnVpbGQgYSBmcmFtZWQgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0CisjCisjIEByZXR1cm4gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0CisjCitzdWIgZ2V0VHJhbnNwb3J0Cit7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHRyYW5zID0gc2hpZnQ7CisKKyAgICBteSAkYnVmZmVyZWQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCR0cmFucyk7CisgICAgcmV0dXJuICRidWZmZXJlZDsKK30KKwogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQppbmRleCBkNmZjOGJlLi40MGVjOWNlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCkBAIC0xNywyNiArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIEhUVFA6OlJlcXVlc3Q7Cit1c2UgSU86OlN0cmluZzsKK3VzZSBMV1A6OlVzZXJBZ2VudDsKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKLXVzZSBIVFRQOjpSZXF1ZXN0OwotdXNlIExXUDo6VXNlckFnZW50OwotdXNlIElPOjpTdHJpbmc7Ci0KIHBhY2thZ2UgVGhyaWZ0OjpIdHRwQ2xpZW50OwotCiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkdXJsICAgICAgID0gc2hpZnQgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5MCc7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OwogCiAgICAgbXkgJG91dCA9IElPOjpTdHJpbmctPm5ldzsKICAgICBiaW5tb2RlKCRvdXQpOwpAQCAtNDQsNDQgKzQzLDQ0IEBACiAgICAgbXkgJHNlbGYgPSB7CiAgICAgICAgIHVybCAgICAgICAgICA9PiAkdXJsLAogICAgICAgICBvdXQgICAgICAgICAgPT4gJG91dCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwLAotICAgICAgICByZWN2VGltZW91dCAgPT4gNzUwLAorICAgICAgICB0aW1lb3V0ICAgICAgPT4gMTAwLAogICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIGhlYWRlcnMgICAgICA9PiB7fSwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCitzdWIgc2V0VGltZW91dAoreworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKworICAgICRzZWxmLT57dGltZW91dH0gPSAkdGltZW91dDsKK30KKworc3ViIHNldFJlY3ZUaW1lb3V0Cit7CisgICAgd2FybiAnc2V0UmVjdlRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworICAgICMgbm90ZTogcmVjdlRpbWVvdXQgd2FzIG5ldmVyIHVzZWQgc28gd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZQorfQorCiBzdWIgc2V0U2VuZFRpbWVvdXQKIHsKICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CiAKLSAgICAkc2VsZi0+e3NlbmRUaW1lb3V0fSA9ICR0aW1lb3V0OworICAgIHdhcm4gJ3NldFNlbmRUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKworICAgICRzZWxmLT5zZXRUaW1lb3V0KCR0aW1lb3V0KTsKIH0KIAotc3ViIHNldFJlY3ZUaW1lb3V0CitzdWIgc2V0SGVhZGVyCiB7Ci0gICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKLSAgICBteSAkdGltZW91dCA9IHNoaWZ0OworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CiAKLSAgICAkc2VsZi0+e3JlY3ZUaW1lb3V0fSA9ICR0aW1lb3V0OwotfQotCi0KLSMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKKyAgICAkc2VsZi0+e2hlYWRlcnN9LT57JG5hbWV9ID0gJHZhbHVlOwogfQogCiAjCkBAIC0xMDMsOCArMTAyLDggQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIGlmIChkZWZpbmVkKCRzZWxmLT57aW99KSkgewotICAgICAgY2xvc2UoJHNlbGYtPntpb30pOwotICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKKyAgICAgICAgY2xvc2UoJHNlbGYtPntpb30pOworICAgICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOwogICAgIH0KIH0KIApAQCAtMTIyLDcgKzEyMSw4IEBACiAgICAgbXkgJGJ1ZiA9ICRzZWxmLT5yZWFkKCRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkKCRidWYpKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXInKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAkbGVuIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICByZXR1cm4gJGJ1ZjsKIH0KQEAgLTE0MCwxNSArMTQwLDE4IEBACiAgICAgbXkgJGluID0gJHNlbGYtPntpbn07CiAKICAgICBpZiAoIWRlZmluZWQoJGluKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICBldmFsIHsKLSAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7Ci0gICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOwotICAgICAgfQotICAgIH07IGlmKCRAKXsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRAKTsKKyAgICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKKyAgICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdObyBtb3JlIGRhdGEgYXZhaWxhYmxlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKKyAgICAgICAgfQorICAgIH07CisgICAgaWYoJEApeworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIiRAIiwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKICAgICB9CiAKICAgICByZXR1cm4gJGJ1ZjsKQEAgLTE3MSw4ICsxNzQsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKLSAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCd0aW1lb3V0JyA9PiAoJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKSwKLSAgICAgICdhZ2VudCcgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCisgICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygKKyAgICAgICAgJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3RpbWVvdXR9IC8gMTAwMCksCisgICAgICAgICdhZ2VudCcgICA9PiAnUGVybC9USHR0cENsaWVudCcKICAgICAgKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CkBAIC0xODIsNyArMTg2LDcgQEAKICAgICAkb3V0LT5zZXRwb3MoMCk7ICMgcmV3aW5kCiAgICAgbXkgJGJ1ZiA9IGpvaW4oJycsIDwkb3V0Pik7CiAKLSAgICBteSAkcmVxdWVzdCA9IG5ldyBIVFRQOjpSZXF1ZXN0KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCB1bmRlZiwgJGJ1Zik7CisgICAgbXkgJHJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoUE9TVCA9PiAkc2VsZi0+e3VybH0sICgkc2VsZi0+e2hlYWRlcnN9IHx8IHVuZGVmKSwgJGJ1Zik7CiAgICAgbXkgJHJlc3BvbnNlID0gJHVhLT5yZXF1ZXN0KCRyZXF1ZXN0KTsKICAgICBteSAkY29udGVudF9yZWYgPSAkcmVzcG9uc2UtPmNvbnRlbnRfcmVmOwogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCmluZGV4IDBiMjg2ODcuLmJlOTdjZTQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTI2LDYgKzI2LDcgQEAKIAogcGFja2FnZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0zNCwxMCArMzUsMTAgQEAKICAgICBteSAkYnVmZmVyU2l6ZT0gc2hpZnQgfHwgMTAyNDsKIAogICAgIG15ICRzZWxmID0gewotICAgICAgICBidWZmZXIgICAgPT4gJycsCi0gICAgICAgIGJ1ZmZlclNpemU9PiAkYnVmZmVyU2l6ZSwKLSAgICAgICAgd1BvcyAgICAgID0+IDAsCi0gICAgICAgIHJQb3MgICAgICA9PiAwLAorICAgICAgICBidWZmZXIgICAgID0+ICcnLAorICAgICAgICBidWZmZXJTaXplID0+ICRidWZmZXJTaXplLAorICAgICAgICB3UG9zICAgICAgID0+IDAsCisgICAgICAgIHJQb3MgICAgICAgPT4gMCwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtMTE2LDcgKzExNyw4IEBACiAKICAgICBteSAkYXZhaWwgPSAoJHNlbGYtPnt3UG9zfSAtICRzZWxmLT57clBvc30pOwogICAgIGlmICgkYXZhaWwgPCAkbGVuKSB7Ci0gICAgICAgIGRpZSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIpOworICAgICAgICBkaWUgVFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KIAogICAgIG15ICRkYXRhID0gJyc7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVjMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisjCitwYWNrYWdlIFRocmlmdDo6VE1lc3NhZ2VUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Cit1c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Cit1c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpAQCAtMCwwICsxLDEzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRmbmFtZSAgPSBzaGlmdDsKKyAgICBteSAkbXR5cGUgID0gc2hpZnQ7CisgICAgbXkgJHJzZXFpZCAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbCk7CisKKyAgICAkc2VsZi0+e2ZuYW1lfSA9ICRmbmFtZTsKKyAgICAkc2VsZi0+e210eXBlfSA9ICRtdHlwZTsKKyAgICAkc2VsZi0+e3JzZXFpZH0gPSAkcnNlcWlkOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkdHlwZSA9IHNoaWZ0OworICAgIG15ICRzZXFpZCA9IHNoaWZ0OworCisgICAgJCRuYW1lID0gJHNlbGYtPntmbmFtZX07CisgICAgJCR0eXBlID0gJHNlbGYtPnttdHlwZX07CisgICAgJCRzZXFpZCA9ICRzZWxmLT57cnNlcWlkfTsKK30KKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworCisgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfSA9IHt9OworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSB1bmRlZjsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIGRlZmF1bHRQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9ICRwcm9jZXNzb3I7Cit9CisKK3N1YiByZWdpc3RlclByb2Nlc3NvciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc2VydmljZU5hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7CisKKyAgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0gPSAkcHJvY2Vzc29yOworfQorCitzdWIgcHJvY2VzcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaW5wdXQgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICAjCisgICAgIyAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAjICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAjICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAjCisKKyAgICBteSAoJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOworICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZuYW1lLCBcJG10eXBlLCBcJHJzZXFpZCk7CisKKyAgICBpZiAoJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPycpOworICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICBpZiAoaW5kZXgoJGZuYW1lLCBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSkgeworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0tPnByb2Nlc3MoCisgICAgICAgICAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9IGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBkZWZpbmVkLiBEaWQgeW91ICIgLgorICAgICAgICAgICAgICAgICdmb3JnZXQgdG8gdXNlIGEgTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Jyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAobXkgJHNlcnZpY2VOYW1lLCBteSAkbWVzc2FnZU5hbWUpID0gc3BsaXQoJzonLCAkZm5hbWUsIDIpOworCisgICAgaWYgKCFleGlzdHMoJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0pKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICd0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Jyk7CisgICAgfQorCisgICAgIyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgbXkgJHByb2Nlc3NvciA9ICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9OworICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjViNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNFUEFSQVRPUiAgPT4gJzonOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZXJ2aWNlTmFtZSAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOworCisgICAgJHNlbGYtPntzZXJ2aWNlTmFtZX0gPSAkc2VydmljZU5hbWU7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyMgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUi4KKyMKKyMgQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZS4KKyMgQHBhcmFtIGludCAgICAkdHlwZSAgTWVzc2FnZSB0eXBlLgorIyBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorIworc3ViIHdyaXRlTWVzc2FnZUJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CisKKyAgICBpZiAoJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBteSAkbmFtZVdpdGhTZXJ2aWNlID0gJHNlbGYtPntzZXJ2aWNlTmFtZX0uU0VQQVJBVE9SLiRuYW1lOworICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KaW5kZXggMDM0NzExZi4uMjZlZjQ2YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCkBAIC0xNywyMyArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6OlR5cGU7CiAKICMKICMgUHJvdG9jb2wgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUUHJvdG9jb2xFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICA9PiAwOwotdXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgPT4gMTsKLXVzZSBjb25zdGFudCBORUdBVElWRV9TSVpFID0+IDI7Ci11c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICA9PiAzOwotdXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgPT4gNDsKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgICAgPT4gMTsKK3VzZSBjb25zdGFudCBORUdBVElWRV9TSVpFICAgPT4gMjsKK3VzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgICAgPT4gNDsKK3VzZSBjb25zdGFudCBOT1RfSU1QTEVNRU5URUQgPT4gNTsKK3VzZSBjb25zdGFudCBERVBUSF9MSU1JVCAgICAgPT4gNjsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNDcsNiArNTIsNyBAQAogIyBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KICMKIHBhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNzUsMzcgKzgxLDM3IEBACiBzdWIgd3JpdGVNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIHRoZSBtZXNzYWdlCiAjCiBzdWIgd3JpdGVNZXNzYWdlRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgogIwogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0QmVnaW4gewogICAgIG15ICgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSBhIHN0cnVjdC4KICMKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4NSArMTIwLDg1IEBACiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKICMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQogIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlRmllbGRCZWdpbiB7CiAgICAgbXkgKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkU3RvcCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCb29sIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCeXRlIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMTYgewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTMyIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUk2NCB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVEb3VibGUgewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMDUsNyArMjExLDcgQEAKIHN1YiByZWFkTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjEzLDEwNSArMjE5LDEwNSBAQAogIwogc3ViIHJlYWRNZXNzYWdlRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0QmVnaW4KIHsKICAgICBteSgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBCZWdpbgogewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJvb2wKIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJ5dGUKIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkxNgogewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMzIKIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTY0CiB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZERvdWJsZQogewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTMyOSwzNiArMzM1LDM2IEBACiAgICAgbXkgJHJlc3VsdDsKICAgICBteSAkaTsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCb29sKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCeXRlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTE2KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTMyKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTY0KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkRG91YmxlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUklORykKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRTdHJpbmcoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSVUNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCkKICAgICB7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFN0cnVjdEJlZ2luKFwkcmVmKTsKICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIG15ICgkZnR5cGUsJGZpZCk7CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkRmllbGRCZWdpbihcJHJlZiwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXAoJGZ0eXBlKTsKQEAgLTM2Nyw3ICszNzMsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU3RydWN0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgIG15KCRrZXlUeXBlLCR2YWxUeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTWFwQmVnaW4oXCRrZXlUeXBlLCBcJHZhbFR5cGUsIFwkc2l6ZSk7CkBAIC0zNzgsNyArMzg0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZE1hcEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU2V0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTM4OCw3ICszOTQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU2V0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZExpc3RCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtMzk5LDggKzQwNSw4IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotCi0gICAgcmV0dXJuIDA7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiAKICAgfQogCkBAIC00MTYsMzEgKzQyMiwzMSBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkdHlwZSAgID0gc2hpZnQ7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKLSAgICB7Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpCisgICAgeworICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICB9CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSSU5HICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HICkKICAgICB7CiAgICAgICAgIG15IEBsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKICAgICAgICAgbXkgJGxlbiA9ICRsZW5bMF07CkBAIC00NDksMjUgKzQ1NSwyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJVQ1QgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QgKQogICAgIHsKICAgICAgICAgbXkgJHJlc3VsdCA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgbXkgJGZ0eXBlID0gMDsKLSAgICAgICAgICBteSAkZmlkID0gMDsKLSAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgICMgSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKKyAgICAgICAgICAgIG15ICRmdHlwZSA9IDA7CisgICAgICAgICAgICBteSAkZmlkID0gMDsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICMgSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgIyBLdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC00OTEsNyArNDk3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgICMgVnR5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNTExLDE1ICs1MTcsMTUgQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0gICAgcmV0dXJuIDA7Ci0KKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIH0KIAogIwogIyBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKLXBhY2thZ2UgVFByb3RvY29sRmFjdG9yeTsKLQorcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUzNiw3ICs1NDIsNyBAQAogc3ViIGdldFByb3RvY29sCiB7CiAgICAgbXkgKCR0cmFucyk7Ci0gICAgZGllICJpbnRlcmZhY2UiOworICAgIGRpZSAnaW50ZXJmYWNlJzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVjOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpAQCAtMCwwICsxLDM2MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6UHJvdG9jb2w7CisKK3BhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2wpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworCisgICAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfSA9ICRwcm90b2NvbDsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworIworIyBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgd3JpdGVNZXNzYWdlQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgICByZXR1cm4gICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKK30KKworIworIyBDbG9zZSB0aGUgbWVzc2FnZQorIworc3ViIHdyaXRlTWVzc2FnZUVuZCB7CisgICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCisjCisjIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisjCisjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7Cit9CisKKyMKKyMgQ2xvc2UgYSBzdHJ1Y3QuCisjCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RFbmQoKTsKK30KKworIworIyBTdGFydHMgYSBmaWVsZC4KKyMKKyMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorIyBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisjIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVGaWVsZEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworfQorCitzdWIgd3JpdGVGaWVsZEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkRW5kKCk7Cit9CisKK3N1YiB3cml0ZUZpZWxkU3RvcCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkU3RvcCgpOworfQorCitzdWIgd3JpdGVNYXBCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVNYXBFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBFbmQoKTsKK30KKworc3ViIHdyaXRlTGlzdEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVMaXN0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOworfQorCitzdWIgd3JpdGVTZXRCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVTZXRFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3N1YiB3cml0ZUJvb2wgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJvb2wgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUJvb2woJGJvb2wpOworfQorCitzdWIgd3JpdGVCeXRlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVCeXRlKCRieXRlKTsKK30KKworc3ViIHdyaXRlSTE2IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMTYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkxNigkaTE2KTsKK30KKworc3ViIHdyaXRlSTMyIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkaTMyKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTMyKCRpMzIpOworCit9CisKK3N1YiB3cml0ZUk2NCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJNjQoJGk2NCk7Cit9CisKK3N1YiB3cml0ZURvdWJsZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVEb3VibGUoJGR1Yik7Cit9CisKK3N1YiB3cml0ZVN0cmluZyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJpbmcoJHN0cik7Cit9CisKKyMKKyMgUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworfQorCisjCisjIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyMKK3N1YiByZWFkTWVzc2FnZUVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworc3ViIHJlYWRTdHJ1Y3RCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworfQorCitzdWIgcmVhZFN0cnVjdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEVuZCgpOworfQorCitzdWIgcmVhZEZpZWxkQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKK30KKworc3ViIHJlYWRGaWVsZEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3N1YiByZWFkTWFwQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRNYXBFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBFbmQoKTsKK30KKworc3ViIHJlYWRMaXN0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkTGlzdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZExpc3RFbmQoKTsKK30KKworc3ViIHJlYWRTZXRCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZFNldEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEVuZCgpOworfQorCitzdWIgcmVhZEJvb2wKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRib29sID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJvb2woJGJvb2wpOworfQorCitzdWIgcmVhZEJ5dGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJ5dGUoJGJ5dGUpOworfQorCitzdWIgcmVhZEkxNgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkxNiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMTYoJGkxNik7Cit9CisKK3N1YiByZWFkSTMyCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTMyICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMzIoJGkzMik7Cit9CisKK3N1YiByZWFkSTY0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJNjQoJGk2NCk7Cit9CisKK3N1YiByZWFkRG91YmxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWREb3VibGUoJGR1Yik7Cit9CisKK3N1YiByZWFkU3RyaW5nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cmluZygkc3RyKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNjQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsNzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBUYWtlcyBhIGhhc2g6CisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBjYSAgICAgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGVuYW1lIC0gbm90IHJlcXVpcmVkCisjIEBwYXJhbVtpbl0gIGNlcnQgICBjZXJ0aWZpY2F0ZSBmaWxlbmFtZTsgbWF5IGNvbnRhaW4ga2V5IGluIHdoaWNoIGNhc2Uga2V5IGlzIG5vdCByZXF1aXJlZAorIyBAcGFyYW1baW5dICBrZXkgICAgcHJpdmF0ZSBrZXkgZmlsZW5hbWUgZm9yIHRoZSBjZXJ0aWZpY2F0ZSBpZiBpdCBpcyBub3QgaW5zaWRlIHRoZSBjZXJ0IGZpbGUKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRvcHRzID0ge0xpc3RlbiAgICAgICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgTG9jYWxBZGRyICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIExvY2FsUG9ydCAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFJldXNlQWRkciAgICAgPT4gMX07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ5MjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KQEAgLTAsMCArMSwxMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBBbnkgb3B0aW9uIGZyb20gU29ja2V0LnBtIGlzIHZhbGlkLCBhbmQgdGhlbjoKKyMKKyMgY2EgICAgICAgICAgPT4gY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKFBFTSBmaWxlKSB0byBhdXRoZW50aWNhdGUgdGhlCisjICAgICAgICAgICAgICAgIHNlcnZlciBhZ2FpbnN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIHNlcnZlciBpcyBub3QKKyMgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZAorIyBjZXJ0ICAgICAgICA9PiBjZXJ0aWZpY2F0ZSB0byB1c2UgYXMgdGhlIGNsaWVudDsgaWYgbm90IHNwZWNpZmllZCB0aGVuCisjICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgZG9lcyBub3QgcHJlc2VudCBvbmUgYnV0IHN0aWxsIGNvbm5lY3RzIHVzaW5nCisjICAgICAgICAgICAgICAgIHNlY3VyZSBwcm90b2NvbAorIyBjaXBoZXJzICAgICA9PiBhbGxvd2VkIGNpcGhlciBsaXN0CisjICAgICAgICAgICAgICAgIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY2lwaGVycy5odG1sI0NJUEhFUl9TVFJJTkdTKQorIyBrZXkgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBrZXkgZm9yICJjZXJ0IiBvcHRpb24KKyMgdmVyc2lvbiAgICAgPT4gYWNjZXB0YWJsZSBTU0wvVExTIHZlcnNpb25zIC0gaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZQorIyAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIHVzZSBTU0x2MjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZQorIyAgICAgICAgICAgICAgICBhdCBUTFN2MS4wIG9yIGxhdGVyCisjCisKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgPSB7UGVlckFkZHIgICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIFBlZXJQb3J0ICAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwfTsKKworICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7Cit9CisKK3N1YiBfX2Nsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07CisgICAgaWYgKCRzb2NrKSB7CisgICAgICAkc29jay0+Y2xvc2UoU1NMX25vX3NodXRkb3duID0+IDEpOworICAgIH0KK30KKworc3ViIF9fcmVjdgoreworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgaWYgKCRzb2NrKSB7CisgICAgc3lzcmVhZCgkc29jaywgJGJ1ZiwgJGxlbik7CisgIH0KKyAgcmV0dXJuICRidWY7Cit9CisKK3N1YiBfX3NlbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gc2hpZnQ7CisgICAgbXkgJGJ1ZiA9IHNoaWZ0OworICAgIHJldHVybiBzeXN3cml0ZSgkc29jaywgJGJ1Zik7Cit9CisKK3N1YiBfX3dhaXQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXTsKKyAgICBpZiAoJHNvY2sgYW5kICRzb2NrLT5wZW5kaW5nKCkgZXEgMCkgeworICAgICAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpfX3dhaXQoKTsKKyAgICB9CisgICAgcmV0dXJuICRzb2NrOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCmluZGV4IDk2MGZiZDEuLjI4ODIyZTggMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCkBAIC0xNywyNSArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBTZXJ2ZXIgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKKyMKICMgMyBwb3NzaWJsZSBjb25zdHJ1Y3RvcnM6CiAjICAgMS4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyMgICAgICAgVXNlcyBhIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBhbmQgYSBCaW5hcnlQcm90b2NvbEZhY3RvcnkuCiAjICAgMi4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorIyAgICAgICBVc2VzIHRoZSBzYW1lIGZhY3RvcnkgZm9yIGlucHV0IGFuZCBvdXRwdXQgb2YgZWFjaCB0eXBlLgogIyAgIDMuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCiAjICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCiAjICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKQEAgLTQ1LDcgKzUxLDcgQEAKIAogICAgIGlmIChzY2FsYXIgQGFyZ3MgPT0gMikKICAgICB7Ci0gICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKKyAgICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCksCkBAIC02MSw3ICs2Nyw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBkaWUgIlRocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MiOworICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzJyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtODgsNyArOTQsNyBAQAogCiBzdWIgc2VydmUKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIF9jbGllbnRCZWdpbgpAQCAtMTA5LDYyICsxMTUsNjggQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRlICAgID0gc2hpZnQ7CiAKLSAgICBpZiAoJGUgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKKyAgICBpZiAoJGUtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CiAgICAgICAgIG15ICRtZXNzYWdlID0gJGUtPnttZXNzYWdlfTsKICAgICAgICAgbXkgJGNvZGUgICAgPSAkZS0+e2NvZGV9OwogICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgJG1lc3NhZ2UgPX4gbS9UVHJhbnNwb3J0RXhjZXB0aW9uLyBhbmQgZGllICRvdXQ7Ci0gICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1RTb2NrZXQvKSB7Ci0gICAgICAgICAgICAjIHN1cHByZXNzIFRTb2NrZXQgbWVzc2FnZXMKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCRtZXNzYWdlID1+IG0vU29ja2V0LykgeworICAgICAgICAgICAgIyBzdXBwcmVzcyBTb2NrZXQgbWVzc2FnZXMKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJG91dDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICB3YXJuICRlOwogICAgIH0KIH0KIAotCiAjCiAjIFNpbXBsZVNlcnZlciBmcm9tIHRoZSBTZXJ2ZXIgYmFzZSBjbGFzcyB0aGF0IGhhbmRsZXMgb25lIGNvbm5lY3Rpb24gYXQgYSB0aW1lCiAjCiBwYWNrYWdlIFRocmlmdDo6U2ltcGxlU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgICAgICA9IEBfOwogCi0gICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQGFyZ3MpOworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAogc3ViIHNlcnZlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RvcCA9IDA7CiAKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwotICAgIHdoaWxlICgxKQotICAgIHsKKyAgICB3aGlsZSAoISRzdG9wKSB7CiAgICAgICAgIG15ICRjbGllbnQgPSAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmFjY2VwdCgpOwotICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7Ci0gICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOwotICAgICAgICBldmFsIHsKLSAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOwotICAgICAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgaWYgKGRlZmluZWQgJGNsaWVudCkgeworICAgICAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7CisgICAgICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKKyAgICAgICAgICAgIGV2YWwgeworICAgICAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYoJEApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH07IGlmKCRAKSB7Ci0gICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CisgICAgICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOworICAgICAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdG9wID0gMTsKICAgICAgICAgfQotCi0gICAgICAgICRpdHJhbnMtPmNsb3NlKCk7Ci0gICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNzMsOSArMTg1LDkgQEAKICMgRm9ya2luZ1NlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogIwogcGFja2FnZSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKLQotdXNlIFBPU0lYICI6c3lzX3dhaXRfaCI7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgUE9TSVggJzpzeXNfd2FpdF9oJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMTkxLDYgKzIwMyw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAorICAgICMgVEhSSUZULTM4NDg6IHdpdGhvdXQgaWdub3JpbmcgU0lHQ0hMRCwgcGVybCBGb3JraW5nU2VydmVyIGdvZXMgaW50byBhIHRpZ2h0IGxvb3AKKyAgICAkU0lHe0NITER9ID0gJ0lHTk9SRSc7CisKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwogICAgIHdoaWxlICgxKQogICAgIHsKQEAgLTIxNSwxMyArMjMwLDE1IEBACiAKICAgICAgICAgbXkgJHBpZCA9IGZvcmsoKTsKIAotICAgICAgICBpZiAoJHBpZCkgI3BhcmVudAorICAgICAgICBpZiAoJHBpZCkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPl9wYXJlbnQoJHBpZCwgJGl0cmFucywgJG90cmFucyk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAkc2VsZi0+X2NoaWxkKCRpdHJhbnMsICRvdHJhbnMsICRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQogfQpAQCAtMjMzLDEwICsyNTAsNiBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkb3RyYW5zID0gc2hpZnQ7CiAKLSAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9ID0gMTsKLSAgICAkc2VsZi0+X2NvbGxlY3RDaGlsZHJlbigpOwotCiAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQgY2xvc2VkIHByb21wdGx5CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRpdHJhbnMpOwogICAgICRzZWxmLT50cnlDbG9zZSgkb3RyYW5zKTsKQEAgLTI1MiwxMSArMjY1LDE0IEBACiAKICAgICBteSAkZWNvZGUgPSAwOwogICAgIGV2YWwgeworICAgICAgICAjIFRIUklGVC00MDY1IGVuc3VyZSBjaGlsZCBwcm9jZXNzIGhhcyBub3JtYWwgc2lnbmFsIGhhbmRsaW5nIGluIGNhc2UgdGhyaWZ0IGhhbmRsZXIgdXNlcyBpdAorICAgICAgICAkU0lHe0NITER9ID0gJ0RFRkFVTFQnOwogICAgICAgICB3aGlsZSAoMSkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkZWNvZGUgPSAxOwogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQpAQCAtMjc3LDM3ICsyOTMsMTkgQEAKICAgICAgICAgewogICAgICAgICAgICRmaWxlLT5jbG9zZSgpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKLSAgICAgICAgaWYgKCRAID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CisgICAgfTsKKyAgICBpZigkQCkgeworICAgICAgICBpZiAoJEAtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CiAgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICRALT57bWVzc2FnZX07CiAgICAgICAgICAgICBteSAkY29kZSAgICA9ICRALT57Y29kZX07CiAgICAgICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgICAgIHdhcm4gJG91dDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJEA7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN1YiBfY29sbGVjdENoaWxkcmVuCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHdoaWxlIChzY2FsYXIga2V5cyAleyRzZWxmLT57Y2hpbGRyZW59fSkKLSAgICB7Ci0gICAgICAgIG15ICRwaWQgICAgPSB3YWl0cGlkKC0xLCBXTk9IQU5HKTsKLQotICAgICAgICBpZiAoJHBpZD4wKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MjY0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsMTI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBJTzo6U29ja2V0OjpJTkVUOwordXNlIElPOjpTZWxlY3Q7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIFRocmlmdDo6U29ja2V0OworCitwYWNrYWdlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyVHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIExlZ2FjeSBjb25zdHJ1Y3Rpb24gdGFrZXMgb25lIGFyZ3VtZW50LCBwb3J0IG51bWJlci4KKyMgTmV3IGNvbnN0cnVjdGlvbiB0YWtlcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIGhvc3QgICBob3N0IGludGVyZmFjZSB0byBsaXN0ZW4gb24gKHVuZGVmID0gYWxsIGludGVyZmFjZXMpCisjIEBwYXJhbVtpbl0gIHBvcnQgICBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24gKHJlcXVpcmVkKQorIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQgaXMgMTI4KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQorIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICAjIFN1cHBvcnQgYm90aCBvbGQtc3R5bGUgInBvcnQgbnVtYmVyIiBjb25zdHJ1Y3Rpb24gYW5kIG5ld2VyLi4uCisgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CisgICAgICAgICRzZWxmID0gJGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZiA9IHsgcG9ydCA9PiAkYXJncyB9OworICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e3F1ZXVlfSkgeworICAgICAgICAkc2VsZi0+e3F1ZXVlfSA9IDEyODsKKyAgICB9CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fbGlzdGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpIC4gJzogQ291bGQgbm90IGJpbmQgdG8gJyAuICcqOicgLiAkc2VsZi0+e3BvcnR9IC4gJyAoJyAuICQhIC4gJyknOworCisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSAkc29jazsKK30KKworc3ViIGFjY2VwdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgeworICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7CisgICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gJHNlbGYtPl9fY2xpZW50KCk7CisgICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCRjbGllbnQpOworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBjbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57aGFuZGxlfS0+Y2xvc2UoKTsKKyAgICB9Cit9CisKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIworCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICByZXR1cm4gSU86OlNvY2tldDo6SU5FVC0+bmV3KExvY2FsQWRkciA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgPT4gMSk7Cit9CisKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KaW5kZXggN2ViZWEzNS4uYmEwZGI1ZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KQEAgLTE3LDM3ICsxNyw2MyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCiB1c2UgSU86OlNvY2tldDo6SU5FVDsKIHVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6VHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgaG9zdCAgICAgICAgPT4gaG9zdCB0byBjb25uZWN0IHRvCisjIHBvcnQgICAgICAgID0+IHBvcnQgdG8gY29ubmVjdCB0bworIyBzZW5kVGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHNlbmQgYW5kIGZvciBjb25uZWN0CisjIHJlY3ZUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3IgcmVjdgorIwogCiBzdWIgbmV3CiB7Ci0gICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwotICAgIG15ICRob3N0ICAgICAgICAgPSBzaGlmdCB8fCAibG9jYWxob3N0IjsKLSAgICBteSAkcG9ydCAgICAgICAgID0gc2hpZnQgfHwgOTA5MDsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRvcHRzICAgICAgPSBzaGlmdDsKIAorICAgICMgZGVmYXVsdCBzZXR0aW5nczoKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgaG9zdCAgICAgICAgID0+ICRob3N0LAotICAgICAgICBwb3J0ICAgICAgICAgPT4gJHBvcnQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorICAgICAgICBob3N0ICAgICAgICAgPT4gJ2xvY2FsaG9zdCcsCisgICAgICAgIHBvcnQgICAgICAgICA9PiA5MDkwLAogICAgICAgICByZWN2VGltZW91dCAgPT4gMTAwMDAsCi0gICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorCisgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZgogICAgIH07CiAKKyAgICBpZiAoZGVmaW5lZCAkb3B0cyBhbmQgcmVmICRvcHRzIGVxIHJlZiB7fSkgeworCisgICAgICAjIGFyZ3VtZW50IGlzIGEgaGFzaCBvZiBvcHRpb25zIHNvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cworICAgICAgJHNlbGYtPnskX30gPSAkb3B0cy0+eyRffSBmb3Iga2V5cyAlJG9wdHM7CisKKyAgICB9IGVsc2UgeworCisgICAgICAjIG9sZGVyIHN0eWxlIGNvbnN0cnVjdG9yIHRha2VzIDMgYXJndW1lbnRzLCBub25lIG9mIHdoaWNoIGFyZSByZXF1aXJlZAorICAgICAgJHNlbGYtPntob3N0fSA9ICRvcHRzIHx8ICdsb2NhbGhvc3QnOworICAgICAgJHNlbGYtPntwb3J0fSA9IHNoaWZ0IHx8IDkwOTA7CisKKyAgICB9CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTcwLDE5ICs5Niw2IEBACiAKIAogIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOwotfQotCi0jCiAjIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCiAjCiAjIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgpAQCAtMTA1LDIzICsxMTgsMTIgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9LzEwMDApCi0gICAgICAgIHx8IGRvIHsKLSAgICAgICAgICAgIG15ICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7CisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X19vcGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpLic6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fS4nICgnLiQhLicpJzsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKIAotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLQotICAgICAgICB9OwotCi0KLSAgICAkc2VsZi0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCggJHNvY2sgKTsKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoICRzb2NrICk7CiB9CiAKICMKQEAgLTEzMCw5ICsxMzIsOCBAQAogc3ViIGNsb3NlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApewotICAgICAgICBDT1JFOjpjbG9zZSggKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSApOworICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKKyAgICAgICRzZWxmLT5fX2Nsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNTMsMzAgKzE1NCwyMiBAQAogICAgIG15ICRwcmUgPSAiIjsKICAgICB3aGlsZSAoMSkgewogCi0gICAgICAgICNjaGVjayBmb3IgdGltZW91dAotICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOwotCi0gICAgICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKLQotICAgICAgICBteSAoJGJ1Ziwkc3opOwotICAgICAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICAgICAgbXkgJHNvY2sgPSAkc2VsZi0+X193YWl0KCk7CisgICAgICAgIG15ICRidWYgPSAkc2VsZi0+X19yZWN2KCRzb2NrLCAkbGVuKTsKIAogICAgICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKLSAgICAgICAgfSBlbHNpZiAoKCRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKChteSAkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgewogCiAgICAgICAgICAgICAkcHJlIC49ICRidWY7CiAgICAgICAgICAgICAkbGVuIC09ICRzejsKIAotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICRwcmUuJGJ1ZjsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NSwyMyArMTg4LDEzIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgI2NoZWNrIGZvciB0aW1lb3V0Ci0gICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKLQotICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKLSAgICB9Ci0KLSAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOwotCi0gICAgbXkgKCRidWYsJHN6KTsKLSAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX3dhaXQoKTsKKyAgICBteSAkYnVmID0gJHNlbGYtPl9fcmVjdigkc29jaywgJGxlbik7CiAKICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgZGllIG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKICAgICB9CiAKQEAgLTIyOSwzMCArMjEyLDI3IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkYnVmICA9IHNoaWZ0OwogCi0KICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCiAgICAgd2hpbGUgKGxlbmd0aCgkYnVmKSA+IDApIHsKLQotCiAgICAgICAgICNjaGVjayBmb3IgdGltZW91dAogICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3dyaXRlKCAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDAgKTsKIAogICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICAgICAgfQogCi0gICAgICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07CisgICAgICAgIG15ICRzZW50ID0gJHNlbGYtPl9fc2VuZCgkc29ja2V0c1swXSwgJGJ1Zik7CiAKLSAgICAgICAgbXkgJGdvdCA9ICRzb2NrLT5zZW5kKCRidWYpOworICAgICAgICBpZiAoIWRlZmluZWQgJHNlbnQgfHwgJHNlbnQgPT0gMCApIHsKIAotICAgICAgICBpZiAoIWRlZmluZWQgJGdvdCB8fCAkZ290ID09IDAgKSB7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOworCiAgICAgICAgIH0KIAotICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRzZW50KTsKICAgICB9CiB9CiAKQEAgLTI2NSw2NSArMjQ1LDgyIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgbXkgJHJldCAgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdLT5mbHVzaDsKKyAgICBteSAkcmV0ID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXS0+Zmx1c2g7CiB9CiAKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIwogCiAjCi0jIEJ1aWxkIGEgU2VydmVyU29ja2V0IGZyb20gdGhlIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzCisjIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgc2VydmVyLgogIwotcGFja2FnZSAgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Ci0KLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwotCi11c2UgY29uc3RhbnQgTElTVEVOX1FVRVVFX1NJWkUgPT4gMTI4OwotCi1zdWIgbmV3Ci17Ci0gICAgbXkgJGNsYXNzbmFtZSAgID0gc2hpZnQ7Ci0gICAgbXkgJHBvcnQgICAgICAgID0gc2hpZnQ7Ci0KLSAgICBteSAkc2VsZiAgICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KHVuZGVmLCAkcG9ydCwgdW5kZWYpOwotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIGxpc3Rlbgorc3ViIF9fb3BlbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICAjIExpc3RlbiB0byBhIG5ldyBzb2NrZXQKLSAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhMb2NhbEFkZHIgPT4gdW5kZWYsICMgYW55IGFkZHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgID0+IExJU1RFTl9RVUVVRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlQWRkciA9PiAxKQotICAgICAgICB8fCBkbyB7Ci0gICAgICAgICAgICBteSAkZXJyb3IgPSAnVFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9IC4gJzonIC4gJHNlbGYtPntwb3J0fSAuICcgKCcgLiAkISAuICcpJzsKLQotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLSAgICAgICAgfTsKLQotICAgICRzZWxmLT57aGFuZGxlfSA9ICRzb2NrOworICAgIHJldHVybiBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCk7CiB9CiAKLXN1YiBhY2NlcHQKKyMKKyMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24KKyMKK3N1YiBfX2Nsb3NlCit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQ09SRTo6Y2xvc2UoKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSk7Cit9CisKKyMKKyMgUmVhZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRsZW4gdGhlIGxlbmd0aCB0byByZWFkCisjIEByZXR1cm5zIHRoZSBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWFkCisjCitzdWIgX19yZWN2Cit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzb2NrID0gc2hpZnQ7CisgIG15ICRsZW4gPSBzaGlmdDsKKyAgbXkgJGJ1ZiA9IHVuZGVmOworICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgcmV0dXJuICRidWY7Cit9CisKKyMKKyMgU2VuZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRidWYgdGhlIGRhdGEgYnVmZmVyCisjIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorIworc3ViIF9fc2VuZAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgICBteSAkYnVmID0gc2hpZnQ7CisgICAgcmV0dXJuICRzb2NrLT5zZW5kKCRidWYpOworfQogCi0gICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCi0gICAgewotICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7Ci0gICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gbmV3IFRocmlmdDo6U29ja2V0OwotICAgICAgICAkcmVzdWx0LT57aGFuZGxlfSA9IG5ldyBJTzo6U2VsZWN0KCRjbGllbnQpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyMKKyMgV2FpdCBmb3IgZGF0YSB0byBiZSByZWFkYWJsZQorIworIyBAcmV0dXJucyBhIHNvY2tldCB0aGF0IGNhbiBiZSByZWFkCisjCitzdWIgX193YWl0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOworCisgICAgaWYgKEBzb2NrZXRzID09IDApIHsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHJlYWRpbmcgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgfQogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICRzb2NrZXRzWzBdOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KaW5kZXggNWVjNmZlZS4uNDFiN2UxNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KQEAgLTE3LDE3ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFRyYW5zcG9ydCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRUcmFuc3BvcnRFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFVOS05PV04gICAgICA9PiAwOwogdXNlIGNvbnN0YW50IE5PVF9PUEVOICAgICA9PiAxOwpAQCAtMzUsNyArMzcsNyBAQAogdXNlIGNvbnN0YW50IFRJTUVEX09VVCAgICA9PiAzOwogdXNlIGNvbnN0YW50IEVORF9PRl9GSUxFICA9PiA0OwogCi1zdWIgbmV3eworc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKIApAQCAtNDMsNiArNDUsNyBAQAogfQogCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTUxLDcgKzU0LDcgQEAKICMKIHN1YiBpc09wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjEsNyArNjQsNyBAQAogIwogc3ViIG9wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjksNyArNzIsNyBAQAogIwogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTgxLDggKzg0LDcgQEAKICMKIHN1YiByZWFkCiB7Ci0gICAgbXkgKCRsZW4pOwotICAgIGRpZSgiYWJzdHJhY3QiKTsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE0LDggKzExNiw3IEBACiAjCiBzdWIgd3JpdGUKIHsKLSAgICBteSAoJGJ1Zik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTEzMCw2ICsxMzEsNyBAQAogIyBUcmFuc3BvcnRGYWN0b3J5IGNyZWF0ZXMgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtMTU2LDIwICsxNTgsMjEgQEAKICMgIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIGxpc3RlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgYWNjZXB0CiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKKworIworIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIworcGFja2FnZSBUaHJpZnQ6OlRUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Cit1c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Cit1c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Cit1c2UgY29uc3RhbnQgQllURSAgID0+IDM7Cit1c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Cit1c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Cit1c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Cit1c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwordXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKK3VzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Cit1c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwordXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKK3VzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Cit1c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwordXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKK3VzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1ZTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDg0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBub3QgYSBoYXNoLCB0aGF0IGlzIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgcGF0aC4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIHBhdGggICB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBuYW1lCisjIEBwYXJhbVtpbl0gIHF1ZXVlICB0aGUgbGlzdGVuIHF1ZXVlIHNpemUgKGRlZmF1bHQgaXMgbm90IHNwZWNpZmllZCBpcyBzdXBwbGllZCBieSBTZXJ2ZXJTb2NrZXQpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJHBhdGgpOworIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KHBhdGggPT4gInNvbWVwYXRoIiwgcXVldWUgPT4gNjQpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAgICAgJHNlbGYtPntwYXRofSA9ICRhcmdzOworICAgIH0KKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIExvY2FsICAgICA9PiAkc2VsZi0+e3BhdGh9LAorICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzg2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZW5hbWUuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBwYXRoICAgcGF0aCB0byB1bml4IHNvY2tldCBmaWxlCisjIEBleGFtcGxlICAgIG15ICRzb2NrID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJHBhdGgpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19vcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIFBlZXIgICAgICA9PiAkc2VsZi0+e3BhdGh9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA3OTVhYWVkLi5kZTAzOTcxIDEwMDY0NAotLS0gYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDE1ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0Ci1USFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1jaGVjay1sb2NhbDogZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQotCi1nZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtOiAkKFRIUklGVF9JRikKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAkKFRIUklGVF9JRikKLQotY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGdlbi1wZXJsCi0KLUVYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQKK0VYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQgbXVsdGlwbGV4LnQKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTliNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50CkBAIC0wLDAgKzEsMjAxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gNjsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgQmVuY2htYXJrU2VydmljZTsKK3VzZSBBZ2dyOworCit1c2UgY29uc3RhbnQgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0+ICdCZW5jaG1hcmtTZXJ2aWNlJzsKK3VzZSBjb25zdGFudCBOQU1FX0FHR1IgID0+ICAnQWdncic7CisKK215ICRidWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KDEwMjQpOworbXkgJGFnZ3JfcHJvdG9jb2wgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0FHR1IpOworbXkgJGFnZ3JfY2xpZW50ICAgID0gQWdnckNsaWVudC0+bmV3KCRhZ2dyX3Byb3RvY29sKTsKK215ICRiZW5jaG1hcmtfcHJvdG9jb2wgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CitteSAkYmVuY2htYXJrX2NsaWVudCA9IEJlbmNobWFya1NlcnZpY2VDbGllbnQtPm5ldygkYmVuY2htYXJrX3Byb3RvY29sKTsgCisKKyRidWZmZXItPm9wZW4oKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRhZ2dyX2NsaWVudC0+c2VuZF9hZGRWYWx1ZSgkaSk7CisgICAgJGFnZ3JfY2xpZW50LT57c2VxaWR9Kys7Cit9CisKKyRhZ2dyX2NsaWVudC0+c2VuZF9nZXRWYWx1ZXMoKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRiZW5jaG1hcmtfY2xpZW50LT5zZW5kX2ZpYm9uYWNjaSgkaSk7CisgICAgJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0rKzsKK30KKyRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9LS07CisKK215ICRjbGllbnRfY29tbWFuZF9iaW5hcnkgPSAkYnVmZmVyLT5nZXRCdWZmZXI7CiskYnVmZmVyLT5yZXNldEJ1ZmZlcjsKKworCisjIFByb2Nlc3MgYnkgc2VydmVyCitteSAkc2VydmVyX291dHB1dF9iaW5hcnk7Cit7CisgICAgbXkgJGJlbmNobWFya19oYW5kbGVyID0gTXk6OkJlbmNobWFya1NlcnZpY2UtPm5ldygpOworICAgIG15ICRiZW5jaG1hcmtfcHJvY2Vzc29yID0gQmVuY2htYXJrU2VydmljZVByb2Nlc3Nvci0+bmV3KCRiZW5jaG1hcmtfaGFuZGxlcik7CisgICAgbXkgJGFnZ3JfaGFuZGxlciA9IE15OjpBZ2dyLT5uZXcoKTsgCisgICAgbXkgJGFnZ3JfcHJvY2Vzc29yID0gQWdnclByb2Nlc3Nvci0+bmV3KCRhZ2dyX2hhbmRsZXIpOworICAgIAorICAgIG15ICRwcm90b2NvbF9mYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworCisgICAgbXkgJGlucHV0X2J1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICAkaW5wdXRfYnVmZmVyLT53cml0ZSgkY2xpZW50X2NvbW1hbmRfYmluYXJ5KTsKKworICAgIG15ICRpbnB1dF9wcm90b2NvbCAgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJGlucHV0X2J1ZmZlcik7CisKKyAgICBteSAkb3V0cHV0X2J1ZmZlciAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOworICAgIG15ICRvdXRwdXRfcHJvdG9jb2wgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJG91dHB1dF9idWZmZXIpOworCisgICAgbXkgJHByb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygpOworCisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9CRU5DSE1BUktTRVJWSUNFLCAkYmVuY2htYXJrX3Byb2Nlc3Nvcik7CisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9BR0dSLCAkYWdncl9wcm9jZXNzb3IpOworICAgIG15ICRyZXN1bHQ7CisgICAgZm9yKG15ICRpID0gMTsgJGkgPD0gMTE7ICRpKyspIHsKKyAgICAgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKKyAgICAgICAgcHJpbnQgInByb2Nlc3MgcmVzdWx0ZWQgaW4gJHJlc3VsdFxuIjsKKyAgICB9CisKKyAgICAkc2VydmVyX291dHB1dF9iaW5hcnkgPSAkb3V0cHV0X2J1ZmZlci0+Z2V0QnVmZmVyKCk7Cit9CisKKyRidWZmZXItPndyaXRlKCRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSk7CisKKworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgICAgZGllOworICAgIH0KKyAgICAKKyAgICBteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2FkZFZhbHVlX3Jlc3VsdC0+bmV3KCk7CisgICAgJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCiskYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGRpZTsKK30KKyAgICAKK215ICRhZ2dyX3Jlc3VsdCA9IEFnZ3JfZ2V0VmFsdWVzX3Jlc3VsdC0+bmV3KCk7CiskYWdncl9yZXN1bHQtPnJlYWQoJGFnZ3JfcHJvdG9jb2wpOworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisKK2lzX2RlZXBseSgkYWdncl9yZXN1bHQtPnN1Y2Nlc3MoKSwgWzEsMiwzLDQsNV0pOworIAorCitmb3JlYWNoIG15ICR2YWwoKDEsMiwzLDUsOCkpIHsKKyAgICBteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgICBkaWU7CisgICAgfQorICAgIG15ICRiZW5jaG1hcmtfcmVzdWx0ID0gQmVuY2htYXJrU2VydmljZV9maWJvbmFjY2lfcmVzdWx0LT5uZXcoKTsKKyAgICAkYmVuY2htYXJrX3Jlc3VsdC0+cmVhZCgkYmVuY2htYXJrX3Byb3RvY29sKTsKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIAorICAgIGlzKCRiZW5jaG1hcmtfcmVzdWx0LT5zdWNjZXNzKCksICR2YWwpOworfQorCisKK3BhY2thZ2UgTXk6OkFnZ3I7Cit1c2UgYmFzZSBxdyhBZ2dySWYpOyAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsgCisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisgICAgCisgICAgJHNlbGYtPnt2YWx1ZXN9ID0gKCk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBhZGRWYWx1ZXsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworCisgICAgcHVzaCAoQHskc2VsZi0+e3ZhbHVlc319LCAkdmFsdWUpOyAgCit9CisKK3N1YiBnZXRWYWx1ZXN7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAKKyAgIHJldHVybiAkc2VsZi0+e3ZhbHVlc307Cit9CisKKworCitwYWNrYWdlIE15OjpCZW5jaG1hcmtTZXJ2aWNlOwordXNlIGJhc2UgcXcoQmVuY2htYXJrU2VydmljZUlmKTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzIHt9LCAkY2xhc3M7Cit9CisKK3N1YiBmaWJvbmFjY2kgeworICAgIG15ICgkc2VsZiwgJG4pID0gQF87CisgICAgCisgICAgbXkgJHByZXYgPSAwOworICAgIG15ICRuZXh0OworICAgIG15ICRyZXN1bHQgPSAxOworICAgIAorICAgIHdoaWxlICgkbiA+IDApIHsKKyAgICAgICAgJG5leHQgPSAkcmVzdWx0ICsgJHByZXY7CisgICAgICAgICRwcmV2ID0gJHJlc3VsdDsKKyAgICAgICAgJHJlc3VsdCA9ICRuZXh0OworICAgICAgICAtLSRuOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKaW5kZXggMWQ4YmU3My4uZjgzMzAzNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CkBAIC0yMiw5ICsyMiw5IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogICAgIHByaW50ICIgICRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWRcbiI7CiAKLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKICAgICAgICAgZGllOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYjhkN2U5My4uOGQ5MDUwYQotLS0gYS9saWIvcGhwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvTWFrZWZpbGUuYW0KQEAgLTE3LDMyICsxNywxMzMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXBocGRpciA9ICQoUEhQX1BSRUZJWCkKLXBocF9EQVRBID0gIFwKLSAgc3JjL2F1dG9sb2FkLnBocCBcCi0gIHNyYy9UaHJpZnQucGhwCiAKLXBocGV4dGRpciA9ICQocGhwZGlyKS9leHQvdGhyaWZ0X3Byb3RvY29sCi1waHBleHRfREFUQSA9IFwKLSAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IFwKLSAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAotICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgPSB0ZXN0CitlbmRpZgogCi1waHBwcm90b2NvbGRpciA9ICQocGhwZGlyKS9wcm90b2NvbAoraWYgV0lUSF9QSFBfRVhURU5TSU9OCislLnNvOgorCWNkIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sLyAmJiAkKE1BS0UpCisKK3BocGNvbmZkaXI9JChQSFBfQ09ORklHX1BSRUZJWCkKK3BocGNvbmZfREFUQT10aHJpZnRfcHJvdG9jb2wuaW5pCisKK3BocG1vZHVsZWRpciA9IGBwaHAtY29uZmlnIC0tZXh0ZW5zaW9uLWRpcmAKK3BocG1vZHVsZV9TQ1JJUFRTID0gc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy90aHJpZnRfcHJvdG9jb2wuc28KKworZGlzdGNsZWFuLWxvY2FsOgorCWNkICQocGhwbW9kdWxlX1NDUklQVFMpICYmICQoUEhQSVpFKSAtLWNsZWFuCisKK2VuZGlmCisKK3BocGRpciA9ICQoUEhQX1BSRUZJWCkvCitwaHBfREFUQSA9IFwKKyAgbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAKKworcGhwYmFzZWRpciA9ICQocGhwZGlyKS9CYXNlCitwaHBiYXNlX0RBVEEgPSBcCisgIGxpYi9CYXNlL1RCYXNlLnBocAorCitwaHBjbGFzc2xvYWRlcmRpciA9ICQocGhwZGlyKS9DbGFzc0xvYWRlcgorcGhwY2xhc3Nsb2FkZXJfREFUQSA9IFwKKyAgbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorCitwaHBleGNlcHRpb25kaXIgPSAkKHBocGRpcikvRXhjZXB0aW9uCitwaHBleGNlcHRpb25fREFUQSA9IFwKKyAgbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKworcGhwZmFjdG9yeWRpciA9ICQocGhwZGlyKS9GYWN0b3J5CitwaHBmYWN0b3J5X0RBVEEgPSBcCisgIGxpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisKK3BocHByb3RvY29sZGlyID0gJChwaHBkaXIpL1Byb3RvY29sCiBwaHBwcm90b2NvbF9EQVRBID0gXAotICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCi0gIHNyYy9wcm90b2NvbC9UUHJvdG9jb2wucGhwCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIFwKKyAgbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCiAKLXBocHRyYW5zcG9ydGRpciA9ICQocGhwZGlyKS90cmFuc3BvcnQKK3BocHByb3RvY29sanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL0pTT04KK3BocHByb3RvY29sanNvbl9EQVRBID0gXAorICBsaWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCisKK3BocHByb3RvY29sc2ltcGxlanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL1NpbXBsZUpTT04KK3BocHByb3RvY29sc2ltcGxlanNvbl9EQVRBID0gXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocAorCitwaHBzZXJpYWxpemVyZGlyID0gJChwaHBkaXIpL1NlcmlhbGl6ZXIKK3BocHNlcmlhbGl6ZXJfREFUQSA9IFwKKyAgbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisKK3BocHNlcnZlcmRpciA9ICQocGhwZGlyKS9TZXJ2ZXIKK3BocHNlcnZlcl9EQVRBID0gXAorICBsaWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIFwKKyAgbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgXAorICBsaWIvU2VydmVyL1RTZXJ2ZXIucGhwIFwKKyAgbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKKworcGhwc3RyaW5nZnVuY2RpciA9ICQocGhwZGlyKS9TdHJpbmdGdW5jCitwaHBzdHJpbmdmdW5jX0RBVEEgPSBcCisgIGxpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocCBcCisgIGxpYi9TdHJpbmdGdW5jL0NvcmUucGhwIFwKKyAgbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCisKK3BocHRyYW5zcG9ydGRpciA9ICQocGhwZGlyKS9UcmFuc3BvcnQKIHBocHRyYW5zcG9ydF9EQVRBID0gXAotICBzcmMvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAorICBsaWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgXAorICBsaWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCiAKLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUgTWFrZWZpbGUuaW4KK3BocHR5cGVkaXIgPSAkKHBocGRpcikvVHlwZQorcGhwdHlwZV9EQVRBID0gXAorICBsaWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKKyAgbGliL1R5cGUvVFR5cGUucGhwIFwKKyAgbGliL1R5cGUvVENvbnN0YW50LnBocAorCitFWFRSQV9ESVNUID0gXAorICBsaWIgXAorICBzcmMvYXV0b2xvYWQucGhwIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMiBcCisgIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcnVuLXRlc3RzLnBocCBcCisgIHNyYy9UaHJpZnQucGhwIFwKKyAgc3JjL1RTdHJpbmdVdGlscy5waHAgXAorICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKyAgdGhyaWZ0X3Byb3RvY29sLmluaSBcCisgIFJFQURNRS5hcGFjaGUubWQgXAorICBSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisgIE1ha2VmaWxlIFwKKyAgTWFrZWZpbGUuaW4KKwpkaWZmIC0tZ2l0IGEvbGliL3BocC9SRUFETUUgYi9saWIvcGhwL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1NjZmNC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVRocmlmdCBQSFAgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBQSFAKLT09PT09PT09PT09PT09PT09PT09PQotCi1UaHJpZnQgcmVxdWlyZXMgUEhQIDUuIFRocmlmdCBtYWtlcyBhcyBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgeW91ciBQSFAKLWVudmlyb25tZW50IGFzIHBvc3NpYmxlIHdoaWxlIHRyeWluZyB0byBtYWtlIHNvbWUgbW9yZSBhZHZhbmNlZCBQSFAKLWZlYXR1cmVzIChpLmUuIEFQQyBjYWNoZWluZyB1c2luZyBhc2JvbHV0ZSBwYXRoIFVSTHMpIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KLQotVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCi0jMSkgQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvc3JjIGludG8geW91ciBQSFAgY29kZWJhc2UKLSMyKSBTZXQgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gdG8gdGhlIHBhdGggeW91IGluc3RhbGxlZCBUaHJpZnQKLSMzKSBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLQotTm90ZSB0aGF0ICMzIG11c3QgYmUgZG9uZSBiZWZvcmUgaW5jbHVkaW5nIGFueSBvdGhlciBUaHJpZnQgZmlsZXMuCi1JZiB5b3UgZG8gbm90IGRvICMyLCBUaHJpZnQucGhwIHdpbGwgc2V0IHRoaXMgZ2xvYmFsIGZvciB5b3UsIGJ1dCBpdCB3aWxsIGJlCi1kb25lIHVzaW5nIGRpcm5hbWUoX19GSUxFX18pLCB3aGljaCBpcyBsZXNzIGVmZmljaWVudCB0aGFuIHByb3ZpZGluZyB0aGUgc3RhdGljCi1zdHJpbmcgeW91cnNlbGYuCi0KLVdoZW4geW91IGdlbmVyYXRlIGEgVGhyaWZ0IHBhY2thZ2UgdXNpbmcgdGhlIGNvbXBpbGVyLCBpdCBtYWtlcyBhbiBhc3N1bXB0aW9uCi1hYm91dCB3aGVyZSB5b3VyIGdlbmVyYXRlZCBjb2RlIHdpbGwgbGl2ZS4gSWYgeW91ciBmaWxlIGlzICJNeVBhY2thZ2UudGhyaWZ0IiwKLXRoZSBnZW5lcmF0ZWQgZmlsZXMgbXVzdCBiZSBpbnN0YWxsZWQgaW50bzoKLQotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy9NeVBhY2thZ2UvJzsKLQotVGhpcyBhbGxvd3MgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGNvbXBpbGUgeW91ciBjb2RlIHdpdGhvdXQgYW55IGV4dHJhIGZsYWdzCi1mb3IgdGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZXMgd2hpbGUgc3RpbGwgYWxsb3dpbmcgeW91ciBpbmNsdWRlIHBhdGhzIHRvCi1iZSBhYnNvbHV0ZSAoaWYgeW91IGhhdmUgYW4gYWJzb2x1dGUgVEhSSUZUX1JPT1QpLgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1QSFBfSU5UX1NJWkUKLQotICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCi0gIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bwotICBzZXJpYWxpemUgZGF0YS4KLQotYXBjX2ZldGNoKCksIGFwY19zdG9yZSgpCi0KLSAgQVBDIGNhY2hlIGlzIHVzZWQgYnkgdGhlIFRTb2NrZXRQb29sIGNsYXNzLiBJZiB5b3UgZG8gbm90IGhhdmUgQVBDIGluc3RhbGxlZCwKLSAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5hcGFjaGUgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDE4MzMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9SRUFETUUuYXBhY2hlCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotVGhyaWZ0IFBIUC9BcGFjaGUgSW50ZWdyYXRpb24KLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotQnVpbGRpbmcgUEhQIFRocmlmdCBTZXJ2aWNlcyB3aXRoIEFwYWNoZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaHJpZnQgY2FuIGJlIGVtYmVkZGVkIGluIHRoZSBBcGFjaGUgd2Vic2VydmVyIHdpdGggUEhQIGluc3RhbGxlZC4gU2FtcGxlCi1jb2RlIGlzIHByb3ZpZGVkIGJlbG93LiBOb3RlIHRoYXQgdG8gbWFrZSByZXF1ZXN0cyB0byB0aGlzIHR5cGUgb2Ygc2VydmVyCi15b3UgbXVzdCB1c2UgYSBUSHR0cENsaWVudCB0cmFuc3BvcnQuCi0KLVNhbXBsZSBDb2RlCi09PT09PT09PT09PQotCi08P3BocAotCi0vKioKLSAqIEV4YW1wbGUgb2YgaG93IHRvIGJ1aWxkIGEgVGhyaWZ0IHNlcnZlciBpbiBBcGFjaGUvUEhQCi0gKgotICovCi0KLSRHTE9CQUxTWydUSFJJRlRfUk9PVCddID0gJy95b3VyL3RocmlmdC9yb290JzsKLQotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVGhyaWZ0LnBocCc7Ci1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCc7Ci1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwJzsKLQotY2xhc3MgU2VydmljZUhhbmRsZXIgaW1wbGVtZW50cyBTZXJ2aWNlSWYgewotICAvLyBJbXBsZW1lbnQgeW91ciBpbnRlcmZhY2UgYW5kIG1ldGhvZHMgaGVyZQotfQotCi1oZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQnKTsKLQotJGhhbmRsZXIgPSBuZXcgU2VydmljZUhhbmRsZXIoKTsKLSRwcm9jZXNzb3IgPSBuZXcgU2VydmljZVByb2Nlc3NvcigkaGFuZGxlcik7Ci0KLS8vIFVzZSB0aGUgVFBocFN0cmVhbSB0cmFuc3BvcnQgdG8gcmVhZC93cml0ZSBkaXJlY3RseSBmcm9tIEhUVFAKLSR0cmFuc3BvcnQgPSBuZXcgVFBocFN0cmVhbShUUGhwU3RyZWFtOjpNT0RFX1IgfCBUUGhwU3RyZWFtOjpNT0RFX1cpOwotJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLQotJHRyYW5zcG9ydC0+b3BlbigpOwotJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7Ci0kdHJhbnNwb3J0LT5jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvbGliL3BocC9SRUFETUUuYXBhY2hlLm1kIGIvbGliL3BocC9SRUFETUUuYXBhY2hlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTI1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQKQEAgLTAsMCArMSw3NCBAQAorVGhyaWZ0IFBIUC9BcGFjaGUgSW50ZWdyYXRpb24KKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworQnVpbGRpbmcgUEhQIFRocmlmdCBTZXJ2aWNlcyB3aXRoIEFwYWNoZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaHJpZnQgY2FuIGJlIGVtYmVkZGVkIGluIHRoZSBBcGFjaGUgd2Vic2VydmVyIHdpdGggUEhQIGluc3RhbGxlZC4gU2FtcGxlCitjb2RlIGlzIHByb3ZpZGVkIGJlbG93LiBOb3RlIHRoYXQgdG8gbWFrZSByZXF1ZXN0cyB0byB0aGlzIHR5cGUgb2Ygc2VydmVyCit5b3UgbXVzdCB1c2UgYSBUSHR0cENsaWVudCB0cmFuc3BvcnQuCisKK1NhbXBsZSBDb2RlCis9PT09PT09PT09PQorCis8P3BocAorCituYW1lc3BhY2UgTXlOYW1lc3BhY2U7CisKKy8qKgorICogSW5jbHVkZSBwYXRoCisgKi8KKyRUSFJJRlRfUk9PVCA9ICcveW91ci90aHJpZnQvcm9vdC9saWInOworCisvKioKKyAqIEluaXQgQXV0bG9hZGVyCisgKi8KK3JlcXVpcmVfb25jZSAkVEhSSUZUX1JPT1QgLiAnL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworCiskbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7CiskbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgJFRIUklGVF9ST09UKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0JywgJFRIUklGVF9ST09UIC4gJy9wYWNrYWdlcycpOworJGxvYWRlci0+cmVnaXN0ZXIoKTsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFBocFN0cmVhbTsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOworCisvKioKKyAqIEV4YW1wbGUgb2YgaG93IHRvIGJ1aWxkIGEgVGhyaWZ0IHNlcnZlciBpbiBBcGFjaGUvUEhQCisgKi8KKworY2xhc3MgU2VydmljZUhhbmRsZXIgaW1wbGVtZW50cyBTZXJ2aWNlSWYgeworICAvLyBJbXBsZW1lbnQgeW91ciBpbnRlcmZhY2UgYW5kIG1ldGhvZHMgaGVyZQorfQorCitoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQnKTsKKworJGhhbmRsZXIgPSBuZXcgU2VydmljZUhhbmRsZXIoKTsKKyRwcm9jZXNzb3IgPSBuZXcgU2VydmljZVByb2Nlc3NvcigkaGFuZGxlcik7CisKKy8vIFVzZSB0aGUgVFBocFN0cmVhbSB0cmFuc3BvcnQgdG8gcmVhZC93cml0ZSBkaXJlY3RseSBmcm9tIEhUVFAKKyR0cmFuc3BvcnQgPSBuZXcgVFBocFN0cmVhbShUUGhwU3RyZWFtOjpNT0RFX1IgfCBUUGhwU3RyZWFtOjpNT0RFX1cpOworJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKworJHRyYW5zcG9ydC0+b3BlbigpOworJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7CiskdHJhbnNwb3J0LT5jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvbGliL3BocC9SRUFETUUubWQgYi9saWIvcGhwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcwMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorVGhyaWZ0IFBIUCBTb2Z0d2FyZSBMaWJyYXJ5CisKKyMgTGljZW5zZQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBQSFAKKworVGhyaWZ0IHJlcXVpcmVzIFBIUCA1LiBUaHJpZnQgbWFrZXMgYXMgZmV3IGFzc3VtcHRpb25zIGFib3V0IHlvdXIgUEhQCitlbnZpcm9ubWVudCBhcyBwb3NzaWJsZSB3aGlsZSB0cnlpbmcgdG8gbWFrZSBzb21lIG1vcmUgYWR2YW5jZWQgUEhQCitmZWF0dXJlcyAoaS5lLiBBUEMgY2FjaGVpbmcgdXNpbmcgYXNib2x1dGUgcGF0aCBVUkxzKSBhcyBzaW1wbGUgYXMgcG9zc2libGUuCisKK1RvIHVzZSBUaHJpZnQgaW4geW91ciBQSFAgY29kZWJhc2UsIHRha2UgdGhlIGZvbGxvd2luZyBzdGVwczoKKworMS4gQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvbGliIGludG8geW91ciBQSFAgY29kZWJhc2UKKzIuIENvbmZpZ3VyZSBTeW1mb255IEF1dG9sb2FkZXIgKG9yIHdoYXRldmVyIHlvdSB1c3VhbGx5IHVzZSkKKworQWZ0ZXIgdGhhdCwgeW91IGhhdmUgdG8gbWFudWFsbHkgaW5jbHVkZSB0aGUgVGhyaWZ0IHBhY2thZ2UKK2NyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOgorCitgYGAKK3JlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9TZXJ2aWNlLnBocCc7CityZXF1aXJlX29uY2UgJ3BhY2thZ2VzL1NlcnZpY2UvVHlwZXMucGhwJzsKK2BgYAorCisjIERlcGVuZGVuY2llcworCitQSFBfSU5UX1NJWkUKKworICAgIFRoaXMgYnVpbHQtaW4gc2lnbmFscyB3aGV0aGVyIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIDMyIG9yIDY0IGJpdCBhbmQgaXMKKyAgICB1c2VkIGJ5IHRoZSBUQmluYXJ5UHJvdG9jb2wgdG8gcHJvcGVybHkgdXNlIHBhY2soKSBhbmQgdW5wYWNrKCkgdG8KKyAgICBzZXJpYWxpemUgZGF0YS4KKworYXBjX2ZldGNoKCksIGFwY19zdG9yZSgpCisKKyAgICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAorICAgIFRocmlmdCB3aWxsIGZpbGwgaW4gbnVsbCBzdHViIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKKzEuIFtQU1ItNF0oaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci00LykgbG9hZGVyIGlzIG5vdyB0aGUgZGVmYXVsdC4gSWYgeW91IHdhbnQgdG8gdXNlIGNsYXNzIG1hcHMgaW5zdGVhZCwgdXNlIGAtZ2VuIHBocDpjbGFzc21hcGAuCisKKzIuIElmIHVzaW5nIFBTUi00LCB1c2UgYCR0aHJpZnRDbGFzc0xvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ25hbWVzcGFjZScsICc8cGF0aD4nKWAgaW5zdGVhZCBvZiBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ25hbWVzcGFjZScsICc8cGF0aD4nKWAuCmRpZmYgLS1naXQgYS9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNzUzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDUgQEAKKyMjIFBIUCBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1BTUi0yXShodHRwOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItMi8pCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocApAQCAtMCwwICsxLDM4MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxCYXNlOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgorICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQorICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgorICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKKyAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgorICovCithYnN0cmFjdCBjbGFzcyBUQmFzZQoreworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYyA9IG51bGwsICR2YWxzID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPl9fY29uc3RydWN0KGdldF9vYmplY3RfdmFycygkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwIGIvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKQEAgLTAsMCArMSwyMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENsYXNzTG9hZGVyIHRvIGxvYWQgVGhyaWZ0IGxpYnJhcnkgYW5kIGRlZmluaXRpb25zCisgKiBJbnNwaXJlZCBmcm9tIFVuaXZlcnNhbENsYXNzTG9hZGVyIGZyb20gU3ltZm9ueSAyCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LmNsYXNzbG9hZGVyCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxDbGFzc0xvYWRlcjsKKworY2xhc3MgVGhyaWZ0Q2xhc3NMb2FkZXIKK3sKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2VzIHBhdGgKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRuYW1lc3BhY2VzID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIFRocmlmdCBkZWZpbml0aW9uIHBhdGhzCisgICAgICogQHZhciB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWZpbml0aW9ucyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSB1c2UgQVBDIGNhY2hlID8KKyAgICAgKiBAdmFyIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwYyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQVBDIENhY2hlIHByZWZpeAorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRhcGNfcHJlZml4OworCisgICAgLyoqCisgICAgICogU2V0IGF1dG9sb2FkZXIgdG8gdXNlIEFQQyBjYWNoZQorICAgICAqIEBwYXJhbSBib29sZWFuICRhcGMKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRhcGNfcHJlZml4CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcGMgPSBmYWxzZSwgJGFwY19wcmVmaXggPSBudWxsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFwYyA9ICRhcGM7CisgICAgICAgICR0aGlzLT5hcGNfcHJlZml4ID0gJGFwY19wcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCisgICAgeworICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgVGhyaWZ0IGRlZmluaXRpb24gbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJEZWZpbml0aW9uKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWZpbml0aW9uc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCh0cnVlID09PSAkdGhpcy0+YXBjICYmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZUluQXBjKCRjbGFzcykpKSBvcgorICAgICAgICAgICAgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpCisgICAgICAgICkgeworICAgICAgICAgICAgcmVxdWlyZV9vbmNlICRmaWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIG9yIGludGVyZmFjZSBpbiBBUEMuCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRGaWxlSW5BcGMoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSA9IGFwY19mZXRjaCgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcykpIHsKKyAgICAgICAgICAgIGFwY19zdG9yZSgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcywgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBjbGFzcyBpbiBuYW1lc3BhY2VzIG9yIGRlZmluaXRpb25zIGRpcmVjdG9yaWVzCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQorICAgIHsKKyAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IGJhY2tzbGFzaAorICAgICAgICBpZiAoJ1xcJyA9PSAkY2xhc3NbMF0pIHsKKyAgICAgICAgICAgICRjbGFzcyA9IHN1YnN0cigkY2xhc3MsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CisgICAgICAgICAgICAvLyBOYW1lc3BhY2VkIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBzdWJzdHIoJGNsYXNzLCAwLCAkcG9zKTsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSBpbiBub3JtYWwgbmFtZXNwYWNlcworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm5hbWVzcGFjZXMgYXMgJG5zID0+ICRkaXJzKSB7CisgICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycworICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CisgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkcG9zICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKSAuCisgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgLiAnLnBocCc7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQorICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7CisKKyAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCisgICAgICAgICAgICBpZiAoY291bnQoJG0pIDw9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7CisgICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEF2YWlsYWJsZSBpbiBzZXJ2aWNlOiBJbnRlcmZhY2UsIENsaWVudCwgUHJvY2Vzc29yLCBSZXN0CisgICAgICAgICAgICAgICAgICAgICAqIEFuZCBldmVyeSBzZXJ2aWNlIG1ldGhvZHMgKF8uKykKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBwcmVnX21hdGNoKCcjKC4rKShpZnxjbGllbnR8cHJvY2Vzc29yfHJlc3QpJCNpJywgJGNsYXNzLCAkbikgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBwcmVnX21hdGNoKCcjKC4rKV9bYS16MC05XStfKGFyZ3N8cmVzdWx0KSQjaScsICRjbGFzcywgJG4pCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICdUeXBlcyc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJG5bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjZhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOworCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyAkX1RTUEVDID0KKyAgICAgICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCisgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCisgICAgICAgICAgICAyID0+IGFycmF5KCd2YXInID0+ICdjb2RlJywKKyAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OkkzMikpOworCisgICAgY29uc3QgVU5LTk9XTiA9IDA7CisgICAgY29uc3QgVU5LTk9XTl9NRVRIT0QgPSAxOworICAgIGNvbnN0IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKKyAgICBjb25zdCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgICAgY29uc3QgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgICAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OworICAgIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgICBjb25zdCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgICAgY29uc3QgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgICAgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICAgICAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJGNvZGUgPSAkdGhpcy0+Z2V0Q29kZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRjb2RlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDM4NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcQmFzZVxUQmFzZTsKKworLyoqCisgKiBOT1RFKG1jc2xlZSk6IFRoaXMgY3VycmVudGx5IGNvbnRhaW5zIGEgdG9uIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIFRCYXNlCisgKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2F2ZSBDUFUgY3ljbGVzIGFuZCB0aGlzIGlzIG5vdCB5ZXQgaW4gYW4gZXh0ZW5zaW9uLgorICogSWRlYWxseSB3ZSdkIG11bHRpcGx5LWluaGVyaXQgVEV4Y2VwdGlvbiBmcm9tIGJvdGggRXhjZXB0aW9uIGFuZCBCYXNlLCBidXQKKyAqIHRoYXQncyBub3QgcG9zc2libGUgaW4gUEhQIGFuZCB0aGVyZSBhcmUgbm8gbW9kdWxlcyBlaXRoZXIsIHNvIGZvciBub3cgd2UKKyAqIGFwb2xvZ2V0aWNhbGx5IHRha2UgYSB0cmlwIHRvIEhhY2tUb3duLgorICoKKyAqIENhbiBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBFeGNlcHRpb24gY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUpIG9yIHdpdGgKKyAqIFRocmlmdCBCYXNlIG9iamVjdCBjb25zdHJ1Y3RvciAoc3BlYywgdmFscykuCisgKgorICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCisgKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCisgKi8KK2NsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMSA9IG51bGwsICRwMiA9IDApCisgICAgeworICAgICAgICBpZiAoaXNfYXJyYXkoJHAxKSAmJiBpc19hcnJheSgkcDIpKSB7CisgICAgICAgICAgICAkc3BlYyA9ICRwMTsKKyAgICAgICAgICAgICR2YWxzID0gJHAyOworICAgICAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7CisgICAgICAgICAgICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoCisgICAgICAgIFRUeXBlOjpCT09MID0+ICdCb29sJywKKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gJ0J5dGUnLAorICAgICAgICBUVHlwZTo6STE2ID0+ICdJMTYnLAorICAgICAgICBUVHlwZTo6STMyID0+ICdJMzInLAorICAgICAgICBUVHlwZTo6STY0ID0+ICdJNjQnLAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnCisgICAgKTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKQEAgLTAsMCArMSw1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworLyoqCisgKiBQcm90b2NvbCBleGNlcHRpb25zCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOworICAgIGNvbnN0IE5FR0FUSVZFX1NJWkUgPSAyOworICAgIGNvbnN0IFNJWkVfTElNSVQgPSAzOworICAgIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKKyAgICBjb25zdCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgIGNvbnN0IERFUFRIX0xJTUlUID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBOT1RfT1BFTiA9IDE7CisgICAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKKyAgICBjb25zdCBUSU1FRF9PVVQgPSAzOworICAgIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE5MTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQ1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOworCisvKioKKyAqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyaWN0UmVhZCA9IGZhbHNlLCAkc3RyaWN0V3JpdGUgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnMsICR0aGlzLT5zdHJpY3RSZWFkXywgJHRoaXMtPnN0cmljdFdyaXRlXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZiOGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSw0MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7CisKKy8qKgorICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woJHRyYW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZmIxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKKworLyoqCisgKiBKU09OIFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDY2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsMzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKworLyoqCisgKiBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKKyAqLworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICAvKioKKyAgICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2wgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRlNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xDb3JlOwordXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwordXNlIFRocmlmdFxTdHJpbmdGdW5jXFRTdHJpbmdGdW5jOworCitjbGFzcyBUU3RyaW5nRnVuY0ZhY3RvcnkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkX2luc3RhbmNlOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgVFN0cmluZ0Z1bmMgaW1wbGVtZW50YXRpb24gdGhhdCBpcworICAgICAqIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBzeXN0ZW0ncyBtYnN0cmluZy5mdW5jX292ZXJsb2FkIHNldHRpbmdzLgorICAgICAqCisgICAgICogQHJldHVybiBUU3RyaW5nRnVuYworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JF9pbnN0YW5jZSkgeworICAgICAgICAgICAgc2VsZjo6X3NldEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VsZjo6JF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfc2V0SW5zdGFuY2UoKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbm5vdCB1c2Ugc3RyKiBmdW5jdGlvbnMgZm9yIGJ5dGUgY291bnRpbmcgYmVjYXVzZSBtdWx0aWJ5dGUKKyAgICAgICAgICogY2hhcmFjdGVycyB3aWxsIGJlIHJlYWQgYSBzaW5nbGUgYnl0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZTogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL21ic3RyaW5nLm92ZXJsb2FkLnBocAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDIpIHsKKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgTWJzdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbWJzdHJpbmcgaXMgbm90IGluc3RhbGxlZCBvciBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCisgICAgICAgICAgICAgKiBieXRlIGNvdW50aW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IENvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMmVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsMTggQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKKworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgICAvKioKKyAgICAgKiBAc3RhdGljCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiY2I0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCkBAIC0wLDAgKzEsMzkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKworY2xhc3MgQmFzZUNvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSAkZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+cmVhZEpTT05TeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE4YzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCkBAIC0wLDAgKzEsNTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKworY2xhc3MgTG9va2FoZWFkUmVhZGVyCit7CisgICAgcHJpdmF0ZSAkaGFzRGF0YV8gPSBmYWxzZTsKKyAgICBwcml2YXRlICRkYXRhXyA9IGFycmF5KCk7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0RhdGFfKSB7CisgICAgICAgICAgICAkdGhpcy0+aGFzRGF0YV8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5kYXRhXyA9ICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRBbGwoMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3Vic3RyKCR0aGlzLT5kYXRhXywgMCwgMSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHBlZWsoKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+aGFzRGF0YV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5kYXRhXyA9ICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRBbGwoMSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+aGFzRGF0YV8gPSB0cnVlOworCisgICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzUzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocApAQCAtMCwwICsxLDY0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXEpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKKworY2xhc3MgUGFpckNvbnRleHQgZXh0ZW5kcyBCYXNlQ29udGV4dAoreworICAgIHByaXZhdGUgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkY29sb25fID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXyA9IG51bGw7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5yZWFkSlNPTlN5bnRheENoYXIoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGVzY2FwZU51bSgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbG9uXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJiODVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDMzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKK2NsYXNzIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkMTZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKQEAgLTAsMCArMSwzNSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOworCitjbGFzcyBDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocApAQCAtMCwwICsxLDQ1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZShUU2ltcGxlSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMwNjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRpc0tleSA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgcGFyZW50Ojp3cml0ZSgpOworICAgICAgICAkdGhpcy0+aXNLZXkgPSAhJHRoaXMtPmlzS2V5OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc01hcEtleSgpCisgICAgeworICAgICAgICAvLyB3ZSB3YW50IHRvIGNvZXJjZSBtYXAga2V5cyB0byBqc29uIHN0cmluZ3MgcmVnYXJkbGVzcworICAgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICAgIHJldHVybiAkdGhpcy0+aXNLZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7CisKK2NsYXNzIFN0cnVjdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOworICAgIHByb3RlY3RlZCAkY29sb25fID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgKKyAgICAgICAgICAgICAgICAkdGhpcy0+Y29sb25fID8KKyAgICAgICAgICAgICAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbDo6Q09MT04gOgorICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT01NQQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSAhJHRoaXMtPmNvbG9uXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNDUzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgorICoKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgICBjb25zdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgICAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZmllbGRUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnTicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKQorICAgIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgICAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgeworICAgICAgICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHZhbHVlICo9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKKyAgICAgICAgICAgICRsbyA9IChpbnQpJHZhbHVlOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOworICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc3RycmV2KCRkYXRhKSwgOCk7CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRsZW4gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHZhbHVlKTsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKKyAgICAgICAgaWYgKCRzeiA8IDApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gKGludCkoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKKyAgICAgICAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KXNlbGY6OlZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcgLiAkc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOworICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAorICAgICAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOworICAgICAgICAgICAgICAgICRyZXN1bHQgKz0KKyAgICAgICAgICAgICAgICAgICAgJHN6ICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzZXFpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkbmFtZSA9ICcnOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOworICAgICAgICBpZiAoJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkSWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRrZXlUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXSA9PSAxOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMik7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoNCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKworICAgICAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkaGkgPSAkYXJyWzFdOworICAgICAgICAgICAgJGxvID0gJGFyclsyXTsKKyAgICAgICAgICAgICRpc05lZyA9ICRoaSA8IDA7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGlzTmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICAgICAgaWYgKCRsbyA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87CisKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0CisgICAgICAgICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgKyAkYXJyWzJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gc3RycmV2KCR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCkpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzk5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKQEAgLTAsMCArMSw2NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OworCisvKioKKyAqIEFjY2VsZXJhdGVkIGJpbmFyeSBwcm90b2NvbDogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB0aHJpZnRfcHJvdG9jb2wKKyAqIGV4dGVuc2lvbiBmb3IgZmFzdGVyIGRlc2VyaWFsaXphdGlvbgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBleHRlbmRzIFRCaW5hcnlQcm90b2NvbAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQorICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCisKKyAgICAgICAgLy8gTk9URSAodC5oZWludHopOiBUaGlzIGlzIHZlcnkgZXZpbCB0byBkbywgYmVjYXVzZSB0aGUgVEJ1ZmZlcmVkVHJhbnNwb3J0IG1heSBzd2FsbG93IGJ5dGVzLCB3aGljaAorICAgICAgICAvLyBhcmUgdGhlbiBuZXZlciB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVGhpcyBoYXBwZW5zIHByZWNpc2VseSB3aGVuIGEgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgbWF4IGJ1ZmZlciBzaXplICg1MTIgYnkgZGVmYXVsdCkgaXMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGFuZCB0aGVuIGZsdXNoKCkgaXMgTk9UCisgICAgICAgIC8vIGNhbGxlZC4gSW4gdGhhdCBjYXNlIHRoZSBkYXRhIHN0YXlzIGluIHRoZSB3cml0ZUJ1ZmZlciBvZiB0aGUgdHJhbnNwb3J0LCBmcm9tIHdoZXJlIGl0IGNhbiBuZXZlciBiZQorICAgICAgICAvLyBhY2Nlc3NlZCBhZ2FpbiAoZm9yIGV4YW1wbGUgdGhyb3VnaCByZWFkKCkpLgorICAgICAgICAvLworICAgICAgICAvLyBTaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHdyYXBwaW5nIHRyYW5zcG9ydCwgdGhpcyBjcmVhdGVzIGJ1Z3Mgd2hpY2gKKyAgICAgICAgLy8gYXJlIHZlcnkgZGlmZmljdWx0IHRvIGZpbmQuIEhlbmNlIHRoZSB3cmFwcGluZyBvZiBhIHRyYW5zcG9ydCBpbiBhIGJ1ZmZlciBzaG91bGQgYmUgbGVmdCB0byB0aGUKKyAgICAgICAgLy8gY2FsbGluZyBjb2RlLiBBbiBpbnRlcmZhY2UgY291bGQgdXNlZCB0byBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgcHV0QmFjaygpIG1ldGhvZCBpbiB0aGUgdHJhbnNwb3J0LgorICAgICAgICAvLworICAgICAgICAvLyBJIGFtIGxlYXZpbmcgdGhpcyBjb2RlIGluIG5vbmV0aGVsZXNzLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhcHBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIHRoaXMgYmVoYXZpb3IuCisgICAgICAgIC8vCisgICAgICAgIC8vIEBzZWUgVEhSSUZULTE1NzkKKworICAgICAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7CisgICAgICAgICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkLCAkc3RyaWN0V3JpdGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFJlYWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJpY3RSZWFkXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RXcml0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFdyaXRlXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjJhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocApAQCAtMCwwICsxLDczOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NUEFDVF9TVE9QID0gMHgwMDsKKyAgICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOworICAgIGNvbnN0IENPTVBBQ1RfRkFMU0UgPSAweDAyOworICAgIGNvbnN0IENPTVBBQ1RfQllURSA9IDB4MDM7CisgICAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OworICAgIGNvbnN0IENPTVBBQ1RfSTMyID0gMHgwNTsKKyAgICBjb25zdCBDT01QQUNUX0k2NCA9IDB4MDY7CisgICAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OworICAgIGNvbnN0IENPTVBBQ1RfQklOQVJZID0gMHgwODsKKyAgICBjb25zdCBDT01QQUNUX0xJU1QgPSAweDA5OworICAgIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKKyAgICBjb25zdCBDT01QQUNUX01BUCA9IDB4MEI7CisgICAgY29uc3QgQ09NUEFDVF9TVFJVQ1QgPSAweDBDOworCisgICAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1dSSVRFID0gMTsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9XUklURSA9IDI7CisgICAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKKyAgICBjb25zdCBTVEFURV9CT09MX1dSSVRFID0gNDsKKyAgICBjb25zdCBTVEFURV9GSUVMRF9SRUFEID0gNTsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7CisgICAgY29uc3QgU1RBVEVfVkFMVUVfUkVBRCA9IDc7CisgICAgY29uc3QgU1RBVEVfQk9PTF9SRUFEID0gODsKKworICAgIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisgICAgY29uc3QgUFJPVE9DT0xfSUQgPSAweDgyOworICAgIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7CisgICAgY29uc3QgVFlQRV9CSVRTID0gMHgwNzsKKyAgICBjb25zdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OlNUT1AgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QLAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAorICAgICAgICBUVHlwZTo6STE2ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2LAorICAgICAgICBUVHlwZTo6STMyID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTMyLAorICAgICAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQklOQVJZLAorICAgICAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAorICAgICAgICBUVHlwZTo6TFNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCwKKyAgICAgICAgVFR5cGU6OlNFVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NFVCwKKyAgICAgICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyAkdHR5cGVzID0gYXJyYXkoCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RPUCA9PiBUVHlwZTo6U1RPUCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFID0+IFRUeXBlOjpCT09MLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQllURSA9PiBUVHlwZTo6QllURSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYgPT4gVFR5cGU6OkkxNiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQgPT4gVFR5cGU6Okk2NCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUgPT4gVFR5cGU6OkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QgPT4gVFR5cGU6OlNUUlVDVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNUID0+IFRUeXBlOjpMU1QsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQID0+IFRUeXBlOjpNQVAsCisgICAgKTsKKworICAgIHByb3RlY3RlZCAkc3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKyAgICBwcm90ZWN0ZWQgJGxhc3RGaWQgPSAwOworICAgIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7CisgICAgcHJvdGVjdGVkICRib29sVmFsdWUgPSBudWxsOworICAgIHByb3RlY3RlZCAkc3RydWN0cyA9IGFycmF5KCk7CisgICAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKKworICAgIC8vIFNvbWUgdmFyaW50IC8gemlnemFnIGhlbHBlciBtZXRob2RzCisgICAgcHVibGljIGZ1bmN0aW9uIHRvWmlnWmFnKCRuLCAkYml0cykKKyAgICB7CisgICAgICAgIHJldHVybiAoJG4gPDwgMSkgXiAoJG4gPj4gKCRiaXRzIC0gMSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmcm9tWmlnWmFnKCRuKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA+PiAxKSBeIC0oJG4gJiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKQorICAgIHsKKyAgICAgICAgJG91dCA9ICIiOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKCgkZGF0YSAmIH4weDdmKSA9PT0gMCkgeworICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRkYXRhICYgMHhmZikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7CisgICAgICAgICRyZXN1bHQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXN1bHQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVmFyaW50KCYkcmVzdWx0KQorICAgIHsKKyAgICAgICAgJGlkeCA9IDA7CisgICAgICAgICRzaGlmdCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgICRyZXN1bHQgfD0gKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0OworICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAkaWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0KKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OIHwKKyAgICAgICAgICAgICAgICAoJHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNlcWlkKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICByZXR1cm4gJHdyaXR0ZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJG9sZF92YWx1ZXMgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSAkb2xkX3ZhbHVlc1swXTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkb2xkX3ZhbHVlc1sxXTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRIZWFkZXIoJHR5cGUsICRmaWQpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgICRkZWx0YSA9ICRmaWQgLSAkdGhpcy0+bGFzdEZpZDsKKyAgICAgICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkZmlkOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKQorICAgIHsKKyAgICAgICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOworICAgICAgICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcihzZWxmOjokY3R5cGVzWyRmaWVsZF90eXBlXSwgJGZpZWxkX2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPSAwOworICAgICAgICBpZiAoJHNpemUgPD0gMTQpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8CisgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8CisgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKHNlbGY6OiRjdHlwZXNbJGtleV90eXBlXSA8PCA0IHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skdmFsX3R5cGVdKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEUpIHsKKyAgICAgICAgICAgICRjdHlwZSA9IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0U7CisgICAgICAgICAgICBpZiAoJHZhbHVlKSB7CisgICAgICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7CisgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgkdmFsdWUgPyAxIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUocGFjaygnQycsICRieXRlKSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDMyKTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkY29tcGFjdF90eXBlX2FuZF9kZWx0YSk7CisKKyAgICAgICAgJGNvbXBhY3RfdHlwZSA9ICRjb21wYWN0X3R5cGVfYW5kX2RlbHRhICYgMHgwZjsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkX3R5cGUgPSAkY29tcGFjdF90eXBlOworICAgICAgICAgICAgJGZpZWxkX2lkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgJGRlbHRhID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgPj4gNDsKKyAgICAgICAgaWYgKCRkZWx0YSA9PSAwKSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZF9pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWVsZF9pZDsKKyAgICAgICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGNvbXBhY3RfdHlwZSk7CisKKyAgICAgICAgaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOworICAgICAgICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfUkVBRDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRaaWdaYWcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkdmFsdWUpOworICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHByb3RvSWQgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7CisgICAgICAgIGlmICgkcHJvdG9JZCAhPSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHByb3RvY29sIGlkIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkdmVyVHlwZSA9IDA7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdmVyVHlwZSk7CisgICAgICAgICR0eXBlID0gKCR2ZXJUeXBlID4+IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfQklUUzsKKyAgICAgICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgKCR2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7IC8vIHVudXNlZAorICAgICAgICAkdGhpcy0+c3RydWN0c1tdID0gYXJyYXkoJHRoaXMtPnN0YXRlLCAkdGhpcy0+bGFzdEZpZCk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkbGFzdCA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRsYXN0WzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRsYXN0WzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkJlZ2luKCYkdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHNpemVUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKKyAgICAgICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHNpemVUeXBlKTsKKyAgICAgICAgaWYgKCRzaXplID09IDE1KSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5X3R5cGUsICYkdmFsX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7CisgICAgICAgICR0eXBlcyA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOworICAgICAgICB9CisgICAgICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOworICAgICAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOworICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Ym9vbFZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFppZ1phZygkdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VFR5cGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gc2VsZjo6JHR0eXBlc1skYnl0ZSAmIDB4MGZdOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKworICAgIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCisgICAgeworICAgICAgICAvLyBSZWFkIHZhcmludCBmcm9tIHdpcmUKKyAgICAgICAgJGhpID0gMDsKKyAgICAgICAgJGxvID0gMDsKKworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgIC8vIFNoaWZ0IGhpIGFuZCBsbyB0b2dldGhlci4KKyAgICAgICAgICAgIGlmICgkc2hpZnQgPCAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkc2hpZnQgPT0gMjgpIHsKKyAgICAgICAgICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4MGYpIDw8IDI4KTsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4NzApID4+IDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHVuemlnIGl0LgorICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICBpZiAoJGxvICYgMSkgeworICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfQorICAgICAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKKyAgICAgICAgJGxvID0gJGxvIHwgKCgkaGkgJiAxKSA8PCAzMSk7CisgICAgICAgICRoaSA9ICgkaGkgPj4gMSkgXiAkeG9yZXI7CisgICAgICAgICRsbyA9ICRsbyBeICR4b3JlcjsKKworICAgICAgICAvLyBOb3cgcHV0ICRoaSBhbmQgJGxvIGJhY2sgdG9nZXRoZXIKKyAgICAgICAgJGlzTmVnID0gJGhpIDwgMCB8fCAkaGkgJiAweDgwMDAwMDAwOworCisgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICRoaSA9IH4kaGkgJiAoaW50KTB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KKyAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbG8gJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhcyBuZWdhdGl2ZSB2YWx1ZSBmaXJzdCwgc2luY2Ugd2UgY2FuIHN0b3JlIC0yXjYzIGJ1dCBub3QgMl42MworICAgICAgICAkdmFsdWUgPSAtJGhpICogNDI5NDk2NzI5NiAtICRsbzsKKworICAgICAgICBpZiAoISRpc05lZykgeworICAgICAgICAgICAgJHZhbHVlID0gLSR2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gSTMyIHJhbmdlLCB1c2UgdGhlIGVhc3kgbWV0aG9kIGJlbG93LgorICAgICAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpJHZhbHVlID4+IDMyOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWUgJiAweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGRvIHRoZSB6aWdnaW5nIGFuZCB6YWdnaW5nLgorICAgICAgICAgICAgJHhvcmVyID0gMDsKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRsb3diaXQgPSAoJGxvID4+IDMxKSAmIDE7CisgICAgICAgICAgICAkaGkgPSAoJGhpIDw8IDEpIHwgJGxvd2JpdDsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gPDwgMSk7CisgICAgICAgICAgICAkbG8gPSAoJGxvIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkaGkgPSAoJGhpIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHZhcmludCwgZW5zdXJpbmcgd2Ugc2hpZnQgYm90aCBoaSBhbmQgbG8KKyAgICAgICAgICAgICRvdXQgPSAiIjsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgJGhpID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRsbyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCgkbG8gJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gJGxvIHwgKCRoaSA8PCAyNSk7CisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSA+PiA3OworICAgICAgICAgICAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgorICAgICAgICAgICAgICAgICAgICAkaGkgPSAkaGkgJiAoMTI3IDw8IDI1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDY0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApAQCAtMCwwICsxLDgxNSBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cQmFzZUNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTG9va2FoZWFkUmVhZGVyOwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXFBhaXJDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExpc3RDb250ZXh0OworCisvKioKKyAqIEpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKyAgICBjb25zdCBCQUNLU0xBU0ggPSAnXFwnOworICAgIGNvbnN0IFpFUk8gPSAnMCc7CisgICAgY29uc3QgRVNDU0VRID0gJ1xcJzsKKyAgICBjb25zdCBET1VCTEVFU0MgPSAnX19ET1VCTEVfRVNDQVBFX1NFUVVFTkNFX18nOworCisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisKKyAgICBwdWJsaWMgc3RhdGljICRKU09OX0NIQVJfVEFCTEUgPSBhcnJheSgKKyAgICAgICAgLyogIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKKyAgICApOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJTID0gYXJyYXkoJyInLCAnXFwnLCAnLycsICJiIiwgImYiLCAibiIsICJyIiwgInQiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSX1ZBTFMgPSBhcnJheSgKKyAgICAgICAgJyInLCAnXFwnLCAnLycsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKKyAgICApOworCisgICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKKyAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOworICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7CisgICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKKyAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOworICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7CisgICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKKyAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKKworICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyAkY29udGV4dFN0YWNrXyA9IGFycmF5KCk7CisgICAgcHVibGljICRjb250ZXh0XzsKKyAgICBwdWJsaWMgJHJlYWRlcl87CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHB1c2hDb250ZXh0KCRjKQorICAgIHsKKyAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikKKyAgICB7CisgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpCisgICAgeworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHMpOyAkaSsrKSB7CisgICAgICAgICAgICAkY2ggPSBzdWJzdHIoJHMsICRpLCAxKTsKKworICAgICAgICAgICAgaWYgKCEoJGNoID49ICJhIiAmJiAkY2ggPD0gImYiKSAmJiAhKCRjaCA+PSAiMCIgJiYgJGNoIDw9ICI5IikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggY2hhcmFjdGVyICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZXhkZWMoJHMpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4Q2hhcigkdmFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfTUFKT1JfVkVSU0lPTiA+IDUgfHwgKFBIUF9NQUpPUl9WRVJTSU9OID09IDUgJiYgUEhQX01JTk9SX1ZFUlNJT04gPj0gNCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gdW5lc2NhcGVkVW5pY29kZSgkc3RyKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5oYXNKU09OVW5lc2NhcGVkVW5pY29kZSgpKSB7CisgICAgICAgICAgICByZXR1cm4ganNvbl9lbmNvZGUoJHN0ciwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CisgICAgICAgIH0KKworICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCRzdHIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqIEhpZ2ggc3Vycm9nYXRlOiAweEQ4MDAgLSAweERCRkYKKyAgICAgICAgICogTG93IHN1cnJvZ2F0ZTogMHhEQzAwIC0gMHhERkZGCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoZFs4OWFiXVswLTlhLWZdezJ9KVxcXFx1KGRbY2RlZl1bMC05YS1mXXsyfSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdIC4gJG1hdGNoZXNbMl0pLCAnVVRGLTgnLCAnVVRGLTE2QkUnKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAkanNvbgorICAgICAgICApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoWzAtOWEtZl17NH0pL2knLAorICAgICAgICAgICAgZnVuY3Rpb24gKCRtYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcocGFjaygnSConLCAkbWF0Y2hlc1sxXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgcmV0dXJuICRqc29uOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdGhpcy0+dW5lc2NhcGVkVW5pY29kZSgkYikpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG51bSk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRudW0pKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05CYXNlNjQoJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoYmFzZTY0X2VuY29kZSgkZGF0YSkpKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OU3RyaW5nKCRza2lwQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICghJHNraXBDb250ZXh0KSB7CisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uU3RyaW5nID0gJyc7CisgICAgICAgICRsYXN0Q2hhciA9IG51bGw7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICAgICAgJGpzb25TdHJpbmcgLj0gJGNoOworICAgICAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSAkY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJGIpIHsKKyAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICB7CisgICAgICAgICRzdHJibGQgPSBhcnJheSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworCisgICAgICAgICAgICBpZiAoISR0aGlzLT5pc0pTT05OdW1lcmljKCRjaCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHN0cmJsZFtdID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbXBsb2RlKCIiLCAkc3RyYmxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlcigpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnR2YWwoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWRlbnRpY2FsIHRvIHJlYWRKU09OSW50ZWdlciBidXQgd2l0aG91dCB0aGUgZmluYWwgY2FzdC4KKyAgICAgKiBOZWVkZWQgZm9yIHByb3BlciBoYW5kbGluZyBvZiBpNjQgb24gMzIgYml0IG1hY2hpbmVzLiAgV2h5IGEKKyAgICAgKiBzZXBhcmF0ZSBmdW5jdGlvbj8gIFNvIHdlIGRvbid0IGhhdmUgdG8gZm9yY2UgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogdXNlIGNhc2VzIHRocm91Z2ggdGhlIGV4dHJhIGNvbmRpdGlvbmFsLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNfbnVtZXJpYygkc3RyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIGluIG51bWVyaWM6ICIgLiAkc3RyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHN0cjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09ORG91YmxlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmIChzdWJzdHIoJHRoaXMtPnJlYWRlcl8tPnBlZWsoKSwgMCwgMSkgPT0gc2VsZjo6UVVPVEUpIHsKKyAgICAgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICgkYXJyID09ICJOYU4iKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkYXJyID09ICJJbmZpbml0eSIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5GOworICAgICAgICAgICAgfSBlbHNlaWYgKCEkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkICIgLiAkYXJyLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkKKyAgICB7CisgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKHNlbGY6OlZFUlNJT04pOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKc29uT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpICE9IHNlbGY6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uIiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgIH0KKworICAgICAgICAkbmFtZSA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICR0eXBlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKKyAgICAgICAgJG5hbWUgPSAiIjsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgICRib29sID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgICRpMzIgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09PSA0KSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICAkZHViID0gJHRoaXMtPnJlYWRKU09ORG91YmxlKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3OWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApAQCAtMCwwICsxLDg1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogQHBhY2thZ2UgVGhyaWZ0XFByb3RvY29sCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgLyoqCisgICAgICogU2VwYXJhdG9yIGJldHdlZW4gc2VydmljZSBuYW1lIGFuZCBmdW5jdGlvbiBuYW1lLgorICAgICAqIFNob3VsZCBiZSB0aGUgc2FtZSBhcyB1c2VkIGF0IG11bHRpcGxleGVkIFRocmlmdCBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIGNvbnN0IFNFUEFSQVRPUiA9ICI6IjsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHNlcnZpY2VOYW1lXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBjbGFzcy4KKyAgICAgKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPiRzZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sCisgICAgICogQHBhcmFtIHN0cmluZyAgICAkc2VydmljZU5hbWUgVGhlIG5hbWUgb2Ygc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCwgJHNlcnZpY2VOYW1lKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+c2VydmljZU5hbWVfID0gJHNlcnZpY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1I8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZS4KKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBNZXNzYWdlIHR5cGUuCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICBpZiAoJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICAkbmFtZVdpdGhTZXJ2aWNlID0gJHRoaXMtPnNlcnZpY2VOYW1lXyAuIHNlbGY6OlNFUEFSQVRPUiAuICRuYW1lOworICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZVdpdGhTZXJ2aWNlLCAkdHlwZSwgJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmVudDo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhY2ViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKKworLyoqCisgKiBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCAkdHJhbnNfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOworCisgICAgLyoKKyAgICAgKiBTdGFydHMgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisgICAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0CisgICAgICogY2F1c2luZyBjb3JydXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJHZhbFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFNldEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZvciBza2lwcGluZyBiaW5hcnkgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgRmllbGQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKKyAgICAgICAgICAgICAgICAkbGVuID0gJGxlblsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJGxlbiA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRmaWQgPSAwOworICAgICAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgLy8gS3R5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAka3R5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA2OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA1OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGZpZWxkIHR5cGU6ICcgLiAkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1ZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKQEAgLTAsMCArMSwyODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgcHJvdG9jb2wsIHRvIHdoaWNoIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRjb25jcmV0ZVByb3RvY29sXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gY2xhc3MuCisgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIGluc3RhbmNlLiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfID0gJHByb3RvY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsMzc0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxMaXN0Q29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxTdHJ1Y3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXE1hcENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAoreworICAgIGNvbnN0IENPTU1BID0gJywnOworICAgIGNvbnN0IENPTE9OID0gJzonOworICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKKyAgICBjb25zdCBSQlJBQ0UgPSAnfSc7CisgICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7CisgICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7CisgICAgY29uc3QgUVVPVEUgPSAnIic7CisKKyAgICBjb25zdCBOQU1FX01BUCA9ICJtYXAiOworICAgIGNvbnN0IE5BTUVfTElTVCA9ICJsc3QiOworICAgIGNvbnN0IE5BTUVfU0VUID0gInNldCI7CisKKyAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dF8gPSBudWxsOworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0U3RhY2tfID0gW107CisKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgbmV3IHdyaXRlIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hXcml0ZUNvbnRleHQoQ29udGV4dCAkYykKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRTdGFja19bXSA9ICR0aGlzLT53cml0ZUNvbnRleHRfOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9ICRjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCB3cml0ZSBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wV3JpdGVDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT53cml0ZUNvbnRleHRTdGFja18pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoJGludmFsaWRLZXlUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiIC4KKyAgICAgICAgICAgICAgICAkaW52YWxpZEtleVR5cGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChzdHJpbmcpJGIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKChpbnQpJG51bSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChmbG9hdCkkbnVtKSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRmaWVsZE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9NQVApOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX0xJU1QpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgLy8gTm8gbWV0YWRhdGEhCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX1NFVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBzaW1wbGVqc29uIGlzIG5vdCBtZWFudCB0byBiZSByZWFkIGJhY2sgaW50byB0aHJpZnQKKyAgICAgKiAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKyAgICAgKiAtIHVzZSBKU09OIGluc3RlYWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyYjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCkBAIC0wLDAgKzEsODcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcmlhbGl6ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZworICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgorICovCitjbGFzcyBUQmluYXJ5U2VyaWFsaXplcgoreworICAgIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5CisgICAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKKyAgICAvLyBhIHRyYW5zcG9ydCBpbiB3aGljaCB0byBzZXJpYWxpemUgYW4gb2JqZWN0LiBJdCBoYXMgdG8KKyAgICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUoJG9iamVjdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgKKyAgICAgICAgICAgICAgICAkcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgJG9iamVjdC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UkVQTFksCisgICAgICAgICAgICAgICAgJG9iamVjdCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsICR1bnVzZWRfc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworCisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0LT5nZXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSwgJGJ1ZmZlcl9zaXplID0gODE5MikKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpKSB7CisgICAgICAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCisgICAgICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKKyAgICAgICAgICAgIC8vIGxlc3MgdGhhbiA1MTIgYnl0ZXMgdG8gdGhlIHRyYW5zcG9ydCAoc2VlIHRoZSBjb21tZW50IHRoZXJlIGFzIHdlbGwpLgorICAgICAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorICAgICAgICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQgPSAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHByb3RvY29sLCAkY2xhc3NfbmFtZSwgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSwgJGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKKyAgICAgICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuICRvYmplY3Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApAQCAtMCwwICsxLDEyNSBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAorICAgICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgKiBhcnJpdmVzLgorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgkcGlkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZVBhcmVudCgkdHJhbnNwb3J0LCAkcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdGYWlsZWQgdG8gZm9yaycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkdGhpcy0+Y29sbGVjdENoaWxkcmVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIGludCAkcGlkCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgeworICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5jaGlsZHJlbl9bJHBpZF0pOworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSw5NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU1NMU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwLCAkY29udGV4dCA9IG51bGwpCisgICAgeworICAgICAgICAkc3NsX2hvc3QgPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNzbF9ob3N0LCAkcG9ydCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKKyAgICAgICAgaWYgKCR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGhvc3QgPSAnc3NsOi8vJyAuICRob3N0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAkaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gQHN0cmVhbV9zb2NrZXRfc2VydmVyKAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgIFNUUkVBTV9TRVJWRVJfQklORCB8IFNUUkVBTV9TRVJWRVJfTElTVEVOLAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhjMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTAyIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwordXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEB2YXIgVFByb2Nlc3NvcgorICAgICAqLworICAgIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKKworICAgIC8qKgorICAgICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCisgICAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKKyAgICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkcHJvY2Vzc29yLAorICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgKSB7CisgICAgICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgorICAgICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAorICAgICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzhmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSwxMjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkbGlzdGVuZXJfOworCisgICAgLyoqCisgICAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGltZW91dCB3aGVuIGxpc3RlbmluZyBmb3IgYSBuZXcgY2xpZW50CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKKworICAgIC8qKgorICAgICAqIEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKKyAgICB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY2NlcHQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IHN0cmVhbV9zb2NrZXRfc2VydmVyKCd0Y3A6Ly8nIC4gJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHNlcnZlcgorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKKyAgICAgKiBhY2NlcHQuCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKKworICAgICAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWRkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKQEAgLTAsMCArMSw2MCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCisgICAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgICAgICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgICAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm9jZXNzb3IKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IHRoZSBNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIHRoZSBNZXNzYWdlIG5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgJGZuYW1lXzsKKyAgICBwcml2YXRlICRtdHlwZV87CisgICAgcHJpdmF0ZSAkcnNlcWlkXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7CisgICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOworICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOworICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9Db3JlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE3NWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9Db3JlLnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTdHJpbmdGdW5jOworCitjbGFzcyBDb3JlIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ZmYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwCkBAIC0wLDAgKzEsNDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2NsYXNzIE1ic3RyaW5nIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgc2Vjb25kCisgICAgICAgICAqIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgdGhlIGZpcnN0IG9wdGlvbmFsIHBhcmFtZXRlciBjYW4ndAorICAgICAgICAgKiBiZSBudWxsIG9yIGZhbHNlIGFzIGEgIm1hZ2ljIiB2YWx1ZSBiZWNhdXNlIHRoYXQgd291bGQKKyAgICAgICAgICogY2F1c2UgYW4gZW1wdHkgc3RyaW5nIHRvIGJlIHJldHVybmVkLCBzbyB3ZSBuZWVkIHRvCisgICAgICAgICAqIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGxlbmd0aCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnN0cmxlbigkc3RyKSAtICRzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYl9zdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoLCAnOGJpdCcpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocCBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTQ5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocApAQCAtMCwwICsxLDI4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTdHJpbmdGdW5jOworCitpbnRlcmZhY2UgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpOworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cik7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApAQCAtMCwwICsxLDExOCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSBQcm9jZXNzb3IgYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICAkcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcQ2FsY3VsYXRvclByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcV2VhdGhlclJlcG9ydFByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICAkcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KKworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSAkc2VydmljZVByb2Nlc3Nvck1hcF87CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyUHJvY2Vzc29yKCRzZXJ2aWNlTmFtZSwgJHByb2Nlc3NvcikKKyAgICB7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdID0gJHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgTWVzc2FnZS48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhUUHJvdG9jb2wgJGlucHV0LCBUUHJvdG9jb2wgJG91dHB1dCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAgICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICovCisgICAgICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7CisKKyAgICAgICAgaWYgKCRtdHlwZSAhPT0gVE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSAhPSBUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCisgICAgICAgIGlmIChzdHJwb3MoJGZuYW1lLCBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0uIERpZCB5b3UgIiAuCisgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCgkc2VydmljZU5hbWUsICRtZXNzYWdlTmFtZSkgPSBleHBsb2RlKCc6JywgJGZuYW1lLCAyKTsKKyAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRzZXJ2aWNlTmFtZSwgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgJHByb2Nlc3NvciA9ICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdOworCisgICAgICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICAgICAgbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCgkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwKKyAgICAgICAgICAgICRvdXRwdXQKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2M1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKKyAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQorICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0LCAkckJ1ZlNpemUgPSA1MTIsICR3QnVmU2l6ZSA9IDUxMikKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKKyAgICAgICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKKyAgICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCisgICAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgorICAgICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgorICAgICAqCisgICAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKKyAgICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOworICAgICAgICBpZiAoJGhhdmUgPT0gMCkgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPiAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbgorICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJHRoaXMtPnJCdWZTaXplXyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApAQCAtMCwwICsxLDI3NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQ3VybENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkY3VybEhhbmRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXF1ZXN0XzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVzcG9uc2UgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgYmluYXJ5IHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkcmVzcG9uc2VfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJykKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRyZXQgPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZV8sICRsZW4pOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLiBTaW5jZSBUQ3VybENsaWVudCBnZXRzIGVudGlyZSBwYXlsb2FkIGF0CisgICAgICogb25jZSwgcGFyZW50IHJlYWRBbGwgY2Fubm90IGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+cmVhZCgkbGVuKTsKKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSAhPT0gJGxlbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RDdXJsQ2xpZW50IGNvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKyAgICAgICAgJGZ1bGxVcmwgPSAkdGhpcy0+c2NoZW1lXyAuICI6Ly8iIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOworCisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dF8pOworICAgICAgICB9CisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworCisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgJGZ1bGxVcmwpOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgJHJlc3BvbnNlRXJyb3IgPSBjdXJsX2Vycm9yKHNlbGY6OiRjdXJsSGFuZGxlKTsKKworICAgICAgICAkY29kZSA9IGN1cmxfZ2V0aW5mbyhzZWxmOjokY3VybEhhbmRsZSwgQ1VSTElORk9fSFRUUF9DT0RFKTsKKworICAgICAgICAvLyBIYW5kbGUgbm9uIDIwMCBzdGF0dXMgY29kZSAvIGNvbm5lY3QgZmFpbHVyZQorICAgICAgICBpZiAoJHRoaXMtPnJlc3BvbnNlXyA9PT0gZmFsc2UgfHwgJGNvZGUgIT09IDIwMCkgeworICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUQ3VybENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRmdWxsVXJsOworICAgICAgICAgICAgaWYgKCRyZXNwb25zZUVycm9yKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsICcgLiAkcmVzcG9uc2VFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY29kZSkgeworICAgICAgICAgICAgICAgICRlcnJvciAuPSAnLCBIVFRQIHN0YXR1cyBjb2RlOiAnIC4gJGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbG9zZUN1cmxIYW5kbGUoKQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZWxmOjokY3VybEhhbmRsZSkgeworICAgICAgICAgICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgeworICAgICAgICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSwxOTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAorICogdGhlaXIgbGVuZ3RoLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHJCdWZfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkd0J1Zl87CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZWFkXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICR3cml0ZV87CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydCA9IG51bGwsICRyZWFkID0gdHJ1ZSwgJHdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7CisgICAgICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKKyAgICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgorICAgICAgICBpZiAoJGxlbiA+PSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAkb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgorICAgICAgICAkb3V0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBkYXRhIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNodW5rIG9mIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKQorICAgIHsKKyAgICAgICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOworICAgICAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7CisgICAgICAgICRzeiA9ICR2YWxbMV07CisKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbiA9IG51bGwpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGxlbiAhPT0gbnVsbCAmJiAkbGVuIDwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpKSB7CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsIDAsICRsZW4pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCisgICAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgJG91dCA9IHBhY2soJ04nLCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSk7CisgICAgICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOworCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU4ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApAQCAtMCwwICsxLDI1OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR1cmlfOworCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkc2NoZW1lXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkYnVmXzsKKworICAgIC8qKgorICAgICAqIElucHV0IHNvY2tldCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGFkZGl0aW9uYWwgb3B0aW9ucworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF87CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRzY2hlbWUKKyAgICAgKiBAcGFyYW0gYXJyYXkgICRjb250ZXh0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydCA9IDgwLCAkdXJpID0gJycsICRzY2hlbWUgPSAnaHR0cCcsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgorICAgICAgICAkaG9zdCA9ICR0aGlzLT5ob3N0XyAuICgkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicgLiAkdGhpcy0+cG9ydF8gOiAnJyk7CisKKyAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOworICAgICAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ1VzZXItQWdlbnQnID0+ICdQSFAvVEh0dHBDbGllbnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcgPT4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+Y29udGV4dF87CisKKyAgICAgICAgJGJhc2VIdHRwT3B0aW9ucyA9IGlzc2V0KCRvcHRpb25zWyJodHRwIl0pID8gJG9wdGlvbnNbImh0dHAiXSA6IGFycmF5KCk7CisKKyAgICAgICAgJGh0dHBPcHRpb25zID0gJGJhc2VIdHRwT3B0aW9ucyArIGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKKyAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCisgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKKyAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7CisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICAkaHR0cE9wdGlvbnNbJ3RpbWVvdXQnXSA9ICR0aGlzLT50aW1lb3V0XzsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICRvcHRpb25zWyJodHRwIl0gPSAkaHR0cE9wdGlvbnM7CisgICAgICAgICRjb250ZXh0aWQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoJG9wdGlvbnMpOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigKKyAgICAgICAgICAgICR0aGlzLT5zY2hlbWVfIC4gJzovLycgLiAkaG9zdCAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgJ3InLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAkY29udGV4dGlkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRob3N0IC4gJHRoaXMtPnVyaV87CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKQEAgLTAsMCArMSwxMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgorICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQorICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCisgICAgICogZm9yIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOworCisgICAgICAgIGlmICgkYnVmTGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnVE1lbW9yeUJ1ZmZlcjogQ291bGQgbm90IHJlYWQgJyAuCisgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5idWZfOworICAgICAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKworICAgICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5idWZfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyA9ICRkYXRhIC4gJHRoaXMtPmJ1Zl87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MjNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcworICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBjb25zdCBNT0RFX1IgPSAxOworICAgIGNvbnN0IE1PREVfVyA9IDI7CisKKyAgICBwcml2YXRlICRpblN0cmVhbV8gPSBudWxsOworCisgICAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSAkd3JpdGVfID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9XOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL2lucHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOworICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aW5TdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKKyAgICAgICAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7CisgICAgICAgICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzJworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpCisgICAgeworICAgICAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7CisgICAgICAgICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAncGhwOi8vaW5wdXQnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwYWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCkBAIC0wLDAgKzEsMTE3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTb2NrZXQgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIHJlc291cmNlICRjb250ZXh0IFN0cmVhbSBjb250ZXh0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRjb250ZXh0ID0gbnVsbCwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaG9zdCBuYW1lIHdpdGggU1NMIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqIGlmIG5vIHRyYW5zcG9ydCBwcm90b2NvbCBhbHJlYWR5IHNwZWNpZmllZCBpbgorICAgICAqIHRoZSBob3N0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiBzdHJpbmcgJGhvc3QgICBIb3N0IG5hbWUgd2l0aCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHN0cmVhbV9zb2NrZXRfY2xpZW50KAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSwKKyAgICAgICAgICAgIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0XworICAgICAgICApOworCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDdlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKQEAgLTAsMCArMSwzNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdG8gUEhQIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGFuZGxlXyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBzZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0U2VjXyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBzZWNvbmRzCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50IHNvY2tldCBvciBwbGFpbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnZ2luZyBvbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdmFyIG1peGVkCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKKyAgICAgICAgc3RyZWFtX3NldF9ibG9ja2luZygkdGhpcy0+aGFuZGxlXywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOworICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9CisgICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGRlYnVnCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBob3N0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGludCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgorICAgICAqCisgICAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICcgKCcgLiAkZXJyc3RyIC4gJyBbJyAuICRlcnJubyAuICddKSc7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9pbXBvcnRfc3RyZWFtJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfc2V0X29wdGlvbicpKSB7CisgICAgICAgICAgICAkc29ja2V0ID0gc29ja2V0X2ltcG9ydF9zdHJlYW0oJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgc29ja2V0X3NldF9vcHRpb24oJHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBub3Qgd2FpdCBmb3IgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSwgaXQgd2lsbCByZXR1cm4gYXMKKyAgICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAkcmVhZCwKKyAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLAorICAgICAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18KKyAgICAgICAgKTsKKworICAgICAgICBpZiAoJHJlYWRhYmxlID4gMCkgeworICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7CisgICAgICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICAgICAgfSBlbHNlaWYgKCRyZWFkYWJsZSA9PT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICRudWxsID0gbnVsbDsKKyAgICAgICAgJHdyaXRlID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworCisgICAgICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKKyAgICAgICAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR3cml0ZSwKKyAgICAgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKCR3cml0YWJsZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOworICAgICAgICAgICAgICAgIGlmICgkd3JpdHRlbiA9PT0gLTEgfHwgJHdyaXR0ZW4gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGJ1ZmZlciBpcyBsZWZ0IHRvIHdyaXRlCisgICAgICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7CisgICAgICAgICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIG91dHB1dCB0byB0aGUgc29ja2V0LgorICAgICAqCisgICAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKKyAgICAgKiB0aGlzIGlzIGEgbm8tb3AKKyAgICAgKgorICAgICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0CisgICAgICogaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZThkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKQEAgLTAsMCArMSwzMTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKKyAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCisgKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQorICogbWlzc2VzLgorICovCitpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKKyAgICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bCA9IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KKyAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKKyAgICAgKi8KKyAgICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgICAqIG1hcmtlZCBhcyBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOworCisgICAgLyoqCisgICAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyYW5kb21pemVfID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSAkaG9zdHMgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCisgICAgICogQHBhcmFtIG1peGVkICRwb3J0cyBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBtaXhlZCAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0JyksCisgICAgICAgICRwb3J0cyA9IGFycmF5KDkwOTApLAorICAgICAgICAkcGVyc2lzdCA9IGZhbHNlLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKKworICAgICAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKKyAgICAgICAgICAgICRwb3J0ID0gJHBvcnRzOworICAgICAgICAgICAgJHBvcnRzID0gYXJyYXkoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7CisgICAgICAgICAgICAkdGhpcy0+c2VydmVyc18gW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCisgICAgeworICAgICAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAorICAgICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KKyAgICAgICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7CisgICAgICAgICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCisgICAgICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKKworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgeworICAgICAgICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcworICAgICAgICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCisgICAgICAgICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSworICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOworICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7CisgICAgICAgICAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnKSAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcworICAgICAgICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKKyAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKKyAgICAgICAgICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAorICAgICAgICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAorICAgICAgICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuICd+JzsKKworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMrKzsKKworICAgICAgICAgICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnIC4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfIC4gJyBzZWNzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnIC4gJGNvbnNlY2ZhaWxzIC4gJyBmYWlsZWQgYXR0ZW1wdHMuJworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKKyAgICAgICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKKyAgICAgICAgJGhvc3RzID0gYXJyYXkoKTsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKKyAgICAgICAgICAgICRob3N0cyBbXSA9ICRzZXJ2ZXJbJ2hvc3QnXSAuICc6JyAuICRzZXJ2ZXJbJ3BvcnQnXTsKKyAgICAgICAgfQorICAgICAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKKyAgICAgICAgJGVycm9yIC49ICcoJyAuICRob3N0bGlzdCAuICcpJzsKKyAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTIxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw5OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gb3BlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pOworCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgICRkYXRhID0gJyc7CisgICAgICAgICRnb3QgPSAwOworICAgICAgICB3aGlsZSAoKCRnb3QgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocCBiL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVkYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCkBAIC0wLDAgKzEsNTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjb25zdGFudCBNYW5hZ2VtZW50CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRDb25zdGFudAoreworICAgIC8qKgorICAgICAqIERvbid0IGluc3RhbmNpYXRlIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQorICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAorICAgICAqIEByZXR1cm4gbWl4ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCisgICAgeworICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7CisgICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCdzdGF0aWM6OmluaXRfJXMnLCAkY29uc3RhbnQpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXRpYzo6JCRjb25zdGFudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApAQCAtMCwwICsxLDM0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisgKi8KK2NsYXNzIFRNZXNzYWdlVHlwZQoreworICAgIGNvbnN0IENBTEwgID0gMTsKKyAgICBjb25zdCBSRVBMWSA9IDI7CisgICAgY29uc3QgRVhDRVBUSU9OID0gMzsKKyAgICBjb25zdCBPTkVXQVkgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAKQEAgLTAsMCArMSw0NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisgKi8KK2NsYXNzIFRUeXBlCit7CisgICAgY29uc3QgU1RPUCAgID0gMDsKKyAgICBjb25zdCBWT0lEICAgPSAxOworICAgIGNvbnN0IEJPT0wgICA9IDI7CisgICAgY29uc3QgQllURSAgID0gMzsKKyAgICBjb25zdCBJMDggICAgPSAzOworICAgIGNvbnN0IERPVUJMRSA9IDQ7CisgICAgY29uc3QgSTE2ICAgID0gNjsKKyAgICBjb25zdCBJMzIgICAgPSA4OworICAgIGNvbnN0IEk2NCAgICA9IDEwOworICAgIGNvbnN0IFNUUklORyA9IDExOworICAgIGNvbnN0IFVURjcgICA9IDExOworICAgIGNvbnN0IFNUUlVDVCA9IDEyOworICAgIGNvbnN0IE1BUCAgICA9IDEzOworICAgIGNvbnN0IFNFVCAgICA9IDE0OworICAgIGNvbnN0IExTVCAgICA9IDE1OyAgICAvLyBOLkIuIGNhbm5vdCB1c2UgTElTVCBrZXl3b3JkIGluIFBIUCEKKyAgICBjb25zdCBVVEY4ICAgPSAxNjsKKyAgICBjb25zdCBVVEYxNiAgPSAxNzsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAgYi9saWIvcGhwL3NyYy9UU3RyaW5nVXRpbHMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGJhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3NyYy9UU3RyaW5nVXRpbHMucGhwCkBAIC0wLDAgKzEsOTAgQEAKKzw/cGhwCisKK2ludGVyZmFjZSBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCk7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKTsKK30KKworY2xhc3MgVFN0cmluZ0Z1bmNfQ29yZQoraW1wbGVtZW50cyBUU3RyaW5nRnVuYyB7CisgICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKQorICAgIHsKKyAgICAgICAgLy8gc3BlY2lmeWluZyBhIG51bGwgJGxlbmd0aCB3b3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cmxlbigkc3RyKTsKKyAgICB9Cit9CisKK2NsYXNzIFRTdHJpbmdGdW5jX01ic3RyaW5nCitpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgc2Vjb25kCisgICAgICAgICAqIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgdGhlIGZpcnN0IG9wdGlvbmFsIHBhcmFtZXRlciBjYW4ndAorICAgICAgICAgKiBiZSBudWxsIG9yIGZhbHNlIGFzIGEgIm1hZ2ljIiB2YWx1ZSBiZWNhdXNlIHRoYXQgd291bGQKKyAgICAgICAgICogY2F1c2UgYW4gZW1wdHkgc3RyaW5nIHRvIGJlIHJldHVybmVkLCBzbyB3ZSBuZWVkIHRvCisgICAgICAgICAqIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGxlbmd0aCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnN0cmxlbigkc3RyKSAtICRzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYl9zdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoLCAnOGJpdCcpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKKyAgICB9Cit9CisKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCisgICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7CisgICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCisgICAgICAgICAqLworICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgeworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBUU3RyaW5nRnVuY19NYnN0cmluZygpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAgICAgICogb2YgdGhlIHN0ciogZnVuY3Rpb25zIGVuYWJsZWQgc28gdXNlIFBIUCBjb3JlIHN0ciogZnVuY3Rpb25zIGZvcgorICAgICAgICAgKiBieXRlIGNvdW50aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IFRTdHJpbmdGdW5jX0NvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL1RocmlmdC5waHAgYi9saWIvcGhwL3NyYy9UaHJpZnQucGhwCmluZGV4IGExNGEzZjMuLjRmZTQzOTIgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL1RocmlmdC5waHAKKysrIGIvbGliL3BocC9zcmMvVGhyaWZ0LnBocApAQCAtMjAsMTEgKzIwLDExIEBACiAgKiBAcGFja2FnZSB0aHJpZnQKICAqLwogCi0KIC8qKgogICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKICAqLwotY2xhc3MgVFR5cGUgeworY2xhc3MgVFR5cGUKK3sKICAgY29uc3QgU1RPUCAgID0gMDsKICAgY29uc3QgVk9JRCAgID0gMTsKICAgY29uc3QgQk9PTCAgID0gMjsKQEAgLTQ3LDcgKzQ3LDggQEAKIC8qKgogICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCiAgKi8KLWNsYXNzIFRNZXNzYWdlVHlwZSB7CitjbGFzcyBUTWVzc2FnZVR5cGUKK3sKICAgY29uc3QgQ0FMTCAgPSAxOwogICBjb25zdCBSRVBMWSA9IDI7CiAgIGNvbnN0IEVYQ0VQVElPTiA9IDM7CkBAIC02Nyw4ICs2OCwxMCBAQAogICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCiAgKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCiAgKi8KLWNsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcDE9bnVsbCwgJHAyPTApIHsKK2NsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KK3sKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkKKyAgewogICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKICAgICAgICRzcGVjID0gJHAxOwogICAgICAgJHZhbHMgPSAkcDI7CkBAIC05MSw3ICs5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTE1NCwxMCArMTU4LDEyIEBACiAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXJlYWQgPSAkdnJlYWQgPSBudWxsOwpAQCAtMjA3LDEwICsyMTMsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZm5hbWUgPSBudWxsOwogICAgICRmdHlwZSA9IDA7CkBAIC0yNTYsMTAgKzI2NCwxMiBAQAogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTMxNCwxMCArMzI0LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRld3JpdGUgPSBudWxsOwpAQCAtMzU3LDEwICszNjksMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CiAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKQEAgLTM5Miw2ICs0MDYsNyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIApAQCAtNDA0LDggKzQxOSw4IEBACiAgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZwogICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCiAgKi8KLWFic3RyYWN0IGNsYXNzIFRCYXNlIHsKLQorYWJzdHJhY3QgY2xhc3MgVEJhc2UKK3sKICAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLApAQCAtNDE0LDExICs0MjksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7CiAKLSAgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOwogCi0gIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7CiAKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjPW51bGwsICR2YWxzPW51bGwpIHsKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjPW51bGwsICR2YWxzPW51bGwpCisgIHsKICAgICBpZiAoaXNfYXJyYXkoJHNwZWMpICYmIGlzX2FycmF5KCR2YWxzKSkgewogICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CkBAIC00MjksNyArNDQ1LDggQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC00OTIsMTAgKzUwOSwxMiBAQAogICAgICAgJHZhclska2V5XSA9ICR2YWw7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKQEAgLTU0NSwxMCArNTY0LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGZuYW1lID0gbnVsbDsKICAgICAkZnR5cGUgPSAwOwpAQCAtNTk0LDEwICs2MTUsMTIgQEAKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC02NTIsMTAgKzY3NSwxMiBAQAogICAgICAgfQogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXdyaXRlID0gbnVsbDsKQEAgLTY5NSwxMCArNzIwLDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbigkY2xhc3MpOwogICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CkBAIC03MzAsMTEgKzc1NywxMyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIH0KIAotY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CiAgIHN0YXRpYyAkX1RTUEVDID0KICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKQEAgLTc0NywxNiArNzc2LDIxIEBACiAgIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKICAgY29uc3QgQkFEX1NFUVVFTkNFX0lEID0gNDsKICAgY29uc3QgTUlTU0lOR19SRVNVTFQgPSA1OworICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKIAotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7CisgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQorICB7CiAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwogICB9CiAKLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJG91dHB1dCkgeworICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQorICB7CiAgICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeworICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKICAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7CkBAIC03NzEsNiArODA1LDcgQEAKICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiB9CkBAIC03ODMsMyArODE4LDQgQEAKIH0KIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RQcm90b2NvbC5waHAnOwogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwJzsKK2luY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RTdHJpbmdVdGlscy5waHAnOwpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwIGIvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCmluZGV4IDNhMzU1NDUuLjg1YmQ3OTcgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocAorKysgYi9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKQEAgLTIwLDcgKzIwLDYgQEAKICAqIEBwYWNrYWdlIHRocmlmdAogICovCiAKLQogLyoqCiAgKiBJbmNsdWRlIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1c2UgYXV0b2xvYWQgd2l0aCB5b3VyIFBIUCBnZW5lcmF0ZWQgVGhyaWZ0CiAgKiBjb2RlLiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCAqbm90KiBpbmNsdWRlIGFueSBkZWZpbmVkIFRocmlmdCBjbGFzc2VzIGJ5CkBAIC0zNywxMiArMzYsMTMgQEAKICRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddID0gYXJyYXkoKTsKIAogaWYgKCFmdW5jdGlvbl9leGlzdHMoJ19fYXV0b2xvYWQnKSkgewotICBmdW5jdGlvbiBfX2F1dG9sb2FkKCRjbGFzcykgeworICBmdW5jdGlvbiBfX2F1dG9sb2FkKCRjbGFzcykKKyAgewogICAgIGdsb2JhbCAkVEhSSUZUX0FVVE9MT0FEOwogICAgICRjbGFzc2wgPSBzdHJ0b2xvd2VyKCRjbGFzcyk7CiAgICAgaWYgKGlzc2V0KCRUSFJJRlRfQVVUT0xPQURbJGNsYXNzbF0pKSB7CiAgICAgICBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy8nLiRUSFJJRlRfQVVUT0xPQURbJGNsYXNzbF07Ci0gICAgfSBlbHNlIGlmICghZW1wdHkoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10pKSB7CisgICAgfSBlbHNlaWYgKCFlbXB0eSgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSkpIHsKICAgICAgIGZvcmVhY2ggKCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddIGFzICRob29rKSB7CiAgICAgICAgICRob29rKCRjbGFzcyk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00CmluZGV4IDJjMzM4YTAuLmUyMTM4YzggMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00CisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00CkBAIC0yLDE0ICsyLDMzIEBACiBkbmwgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKIGRubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKIGRubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCitkbmwKK2RubCBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitkbmwgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2RubCBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorZG5sIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorZG5sIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK2RubCAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCitkbmwgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitkbmwKK2RubCAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitkbmwKK2RubCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitkbmwgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK2RubCAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK2RubCBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorZG5sIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK2RubCB1bmRlciB0aGUgTGljZW5zZS4KIAogUEhQX0FSR19FTkFCTEUodGhyaWZ0X3Byb3RvY29sLCB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbiwKLVsgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIGZidGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbl0pCitbICAtLWVuYWJsZS10aHJpZnRfcHJvdG9jb2wJRW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKIAogaWYgdGVzdCAiJFBIUF9USFJJRlRfUFJPVE9DT0wiICE9ICJubyI7IHRoZW4KICAgUEhQX1JFUVVJUkVfQ1hYKCkKICAgUEhQX0FERF9MSUJSQVJZX1dJVEhfUEFUSChzdGRjKyssICIiLCBUSFJJRlRfUFJPVE9DT0xfU0hBUkVEX0xJQkFERCkKICAgUEhQX1NVQlNUKFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQorICBDWFhGTEFHUz0iJENYWEZMQUdTIC1zdGQ9YysrMTEiCisKICAgUEhQX05FV19FWFRFTlNJT04odGhyaWZ0X3Byb3RvY29sLCBwaHBfdGhyaWZ0X3Byb3RvY29sLmNwcCwgJGV4dF9zaGFyZWQpCiBmaQogCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy53MzIgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy53MzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmMjczZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMgpAQCAtMCwwICsxLDggQEAKKy8vICRJZDogY29uZmlnLnczMiAyNTA0MDQgMjAwOC0wMS0xMSAxMzozNzoyNFogcnJpY2hhcmRzICQKKy8vIHZpbTpmdD1qYXZhc2NyaXB0CisKK0FSR19XSVRIKCJ0aHJpZnRfcHJvdG9jb2wiLCAid2hldGhlciB0byBlbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb24iLCAieWVzIik7CisKK2lmIChQSFBfVEhSSUZUX1BST1RPQ09MID09ICJ5ZXMiKXsKKyAgRVhURU5TSU9OKCJ0aHJpZnRfcHJvdG9jb2wiLCAicGhwX3RocmlmdF9wcm90b2NvbC5jcHAiKQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKaW5kZXggNjQxZmZmMi4uNjNjODkwNSAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCkBAIC0xNiwyNCArMTYsNDMgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInBocC5oIgorI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgorI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKKworI2lmIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwCisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmbmRlZiBic3dhcF82NAorI2RlZmluZQlic3dhcF82NCh4KSAgICAgKCgodWludDY0X3QpKHgpIDw8IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA8PCA0MCkgJiAweGZmMDAwMDAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA8PCAyNCkgJiAweGZmMDAwMDAwMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgOCkgICYgMHhmZjAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA+PiA4KSAgJiAweGZmMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA+PiAyNCkgJiAweGZmMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gNDApICYgMHhmZjAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpKHgpICA+PiA1NikpCisjZW5kaWYKIAogI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgaHRvbmxsKHgpIGJzd2FwXzY0KHgpCiAjZGVmaW5lIG50b2hsbCh4KSBic3dhcF82NCh4KQotI2Vsc2UKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KICNkZWZpbmUgaHRvbmxsKHgpIHgKICNkZWZpbmUgbnRvaGxsKHgpIHgKKyNlbHNlCisjZXJyb3IgVW5rbm93biBfX0JZVEVfT1JERVIKICNlbmRpZgogCiBlbnVtIFRUeXBlIHsKQEAgLTY2LDI2ICs4NSwyMiBAQAogY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CiBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OwogCi0jaW5jbHVkZSAicGhwLmgiCi0jaW5jbHVkZSAiemVuZF9pbnRlcmZhY2VzLmgiCi0jaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCi0jaW5jbHVkZSAicGhwX3RocmlmdF9wcm90b2NvbC5oIgotCi1zdGF0aWMgZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0gewotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgTlVMTCkKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgTlVMTCkKLSAge05VTEwsIE5VTEwsIE5VTEx9Ci19IDsKK3N0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnNbXSA9IHsKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbiwgbnVsbHB0cikKKyAge251bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9Cit9OwogCiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5ID0gewogICBTVEFOREFSRF9NT0RVTEVfSEVBREVSLAogICAidGhyaWZ0X3Byb3RvY29sIiwKICAgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9ucywKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKICAgIjEuMCIsCiAgIFNUQU5EQVJEX01PRFVMRV9QUk9QRVJUSUVTCiB9OwpAQCAtOTYsNDIgKzExMSw2MSBAQAogCiBjbGFzcyBQSFBFeGNlcHRpb25XcmFwcGVyIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgOiBleChfZXgpIHsKLSAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBleCk7CisgIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIHsKKyAgICBaVkFMX0NPUFkoJmV4LCBfZXgpOworICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leCk7CiAgIH0KLSAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gX3doYXQ7IH0KLSAgflBIUEV4Y2VwdGlvbldyYXBwZXIoKSB0aHJvdygpIHt9Ci0gIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBjb25zdF9jYXN0PHp2YWwqPihleCk7IH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCisKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6ZW5kX29iamVjdCogX2V4b2JqKSB0aHJvdygpIHsKKyAgICBaVkFMX09CSigmZXgsIF9leG9iaik7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4b2JqKTsKKyAgfQorICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkgeworICAgIHp2YWxfZHRvcigmZXgpOworICB9CisKKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICAgIHJldHVybiBfd2hhdDsKKyAgfQorICBvcGVyYXRvciB6dmFsKigpIGNvbnN0IHRocm93KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PHp2YWwqPigmZXgpOworICB9IC8vIFplbmQgQVBJIGRvZXNuJ3QgZG8gJ2NvbnN0Jy4uLgogcHJvdGVjdGVkOgotICB6dmFsKiBleDsKKyAgenZhbCBleDsKICAgY2hhciBfd2hhdFs0MF07CiB9IDsKIAogY2xhc3MgUEhQVHJhbnNwb3J0IHsKLXB1YmxpYzoKLSAgenZhbCogcHJvdG9jb2woKSB7IHJldHVybiBwOyB9Ci0gIHp2YWwqIHRyYW5zcG9ydCgpIHsgcmV0dXJuIHQ7IH0KIHByb3RlY3RlZDoKLSAgUEhQVHJhbnNwb3J0KCkge30KKyAgUEhQVHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgYXNzZXJ0KFpfVFlQRV9QKF9wKSA9PSBJU19PQkpFQ1QpOwogCi0gIHZvaWQgY29uc3RydWN0X3dpdGhfenZhbCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgeworICAgIFpWQUxfVU5ERUYoJnQpOworCiAgICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW1hbGxvYyhfYnVmZmVyX3NpemUpKTsKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwogICAgIGJ1ZmZlcl91c2VkID0gMDsKICAgICBidWZmZXJfc2l6ZSA9IF9idWZmZXJfc2l6ZTsKLSAgICBwID0gX3A7CiAKICAgICAvLyBHZXQgdGhlIHRyYW5zcG9ydCBmb3IgdGhlIHBhc3NlZCBwcm90b2NvbAogICAgIHp2YWwgZ2V0dHJhbnNwb3J0OwotICAgIFpWQUxfU1RSSU5HKCZnZXR0cmFuc3BvcnQsICJnZXRUcmFuc3BvcnQiLCAwKTsKLSAgICBNQUtFX1NURF9aVkFMKHQpOwotICAgIFpWQUxfTlVMTCh0KTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmcCwgJmdldHRyYW5zcG9ydCwgdCwgMCwgTlVMTCBUU1JNTFNfQ0MpOworICAgIFpWQUxfU1RSSU5HKCZnZXR0cmFuc3BvcnQsICJnZXRUcmFuc3BvcnQiKTsKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24obnVsbHB0ciwgX3AsICZnZXR0cmFuc3BvcnQsICZ0LCAwLCBudWxscHRyKTsKKworICAgIHp2YWxfZHRvcigmZ2V0dHJhbnNwb3J0KTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICB9CisKKyAgICBhc3NlcnQoWl9UWVBFKHQpID09IElTX09CSkVDVCk7CiAgIH0KKwogICB+UEhQVHJhbnNwb3J0KCkgewogICAgIGVmcmVlKGJ1ZmZlcik7Ci0gICAgenZhbF9wdHJfZHRvcigmdCk7CisgICAgenZhbF9kdG9yKCZ0KTsKICAgfQogCiAgIGNoYXIqIGJ1ZmZlcjsKQEAgLTEzOSwyNCArMTczLDE4IEBACiAgIHNpemVfdCBidWZmZXJfdXNlZDsKICAgc2l6ZV90IGJ1ZmZlcl9zaXplOwogCi0gIHp2YWwqIHA7Ci0gIHp2YWwqIHQ7CisgIHp2YWwgdDsKIH07CiAKIAogY2xhc3MgUEhQT3V0cHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOwotICB9Ci0KLSAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICBmbHVzaCgpOwotICB9CisgIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsgfQorICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgeyB9CiAKICAgdm9pZCB3cml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgaWYgKChsZW4gKyBidWZmZXJfdXNlZCkgPiBidWZmZXJfc2l6ZSkgewotICAgICAgZmx1c2goKTsKKyAgICAgIGludGVybmFsRmx1c2goKTsKICAgICB9CiAgICAgaWYgKGxlbiA+IGJ1ZmZlcl9zaXplKSB7CiAgICAgICBkaXJlY3RXcml0ZShkYXRhLCBsZW4pOwpAQCAtMTk3LDQyICsyMjUsNDggQEAKICAgfQogCiAgIHZvaWQgZmx1c2goKSB7Ci0gICAgaWYgKGJ1ZmZlcl91c2VkKSB7Ci0gICAgICBkaXJlY3RXcml0ZShidWZmZXIsIGJ1ZmZlcl91c2VkKTsKLSAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7Ci0gICAgICBidWZmZXJfdXNlZCA9IDA7Ci0gICAgfQorICAgIGludGVybmFsRmx1c2goKTsKICAgICBkaXJlY3RGbHVzaCgpOwogICB9CiAKIHByb3RlY3RlZDoKLSAgdm9pZCBkaXJlY3RGbHVzaCgpIHsKLSAgICB6dmFsIHJldDsKLSAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgenZhbCBmbHVzaGZuOwotICAgIFpWQUxfU1RSSU5HKCZmbHVzaGZuLCAiZmx1c2giLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJmZsdXNoZm4sICZyZXQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKLSAgICB6dmFsX2R0b3IoJnJldCk7CisgIHZvaWQgaW50ZXJuYWxGbHVzaCgpIHsKKyAgICAgaWYgKGJ1ZmZlcl91c2VkKSB7CisgICAgICBkaXJlY3RXcml0ZShidWZmZXIsIGJ1ZmZlcl91c2VkKTsKKyAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CisgICAgICBidWZmZXJfdXNlZCA9IDA7CisgICAgfQogICB9Ci0gIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICAgIHp2YWwgd3JpdGVmbjsKLSAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIiwgMCk7Ci0gICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MobGVuICsgMSk7Ci0gICAgbWVtY3B5KG5ld2J1ZiwgZGF0YSwgbGVuKTsKLSAgICBuZXdidWZbbGVuXSA9ICdcMCc7Ci0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGxlbiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgenZhbCByZXQ7CisgIHZvaWQgZGlyZWN0Rmx1c2goKSB7CisgICAgenZhbCByZXQsIGZsdXNoZm47CiAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZsdXNoZm4sICZyZXQsIDAsIG51bGxwdHIpOworICAgIHp2YWxfZHRvcigmZmx1c2hmbik7CiAgICAgenZhbF9kdG9yKCZyZXQpOwogICAgIGlmIChFRyhleGNlcHRpb24pKSB7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKyAgfQorICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICB6dmFsIGFyZ3NbMV0sIHJldCwgd3JpdGVmbjsKKworICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiKTsKKyAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGRhdGEsIGxlbik7CisKKyAgICBaVkFMX05VTEwoJnJldCk7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgenZhbF9kdG9yKCZ3cml0ZWZuKTsKKyAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAgIH0KQEAgLTI0MCw4ICsyNzQsNyBAQAogCiBjbGFzcyBQSFBJbnB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOworICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsKICAgfQogCiAgIH5QSFBJbnB1dFRyYW5zcG9ydCgpIHsKQEAgLTI1MCwyNCArMjgzLDIxIEBACiAKICAgdm9pZCBwdXRfYmFjaygpIHsKICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKLSAgICAgIHp2YWwgcHV0YmFja2ZuOwotICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siLCAwKTsKLQotICAgICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MoYnVmZmVyX3VzZWQgKyAxKTsKLSAgICAgIG1lbWNweShuZXdidWYsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKLSAgICAgIG5ld2J1ZltidWZmZXJfdXNlZF0gPSAnXDAnOwotCi0gICAgICB6dmFsICphcmdzWzFdOwotICAgICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGJ1ZmZlcl91c2VkLCAwKTsKLQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0KLSAgICAgIHp2YWwgcmV0OworICAgICAgenZhbCBhcmdzWzFdLCByZXQsIHB1dGJhY2tmbjsKKyAgICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOworICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siKTsKICAgICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworCisgICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgICAgenZhbF9kdG9yKCZwdXRiYWNrZm4pOwogICAgICAgenZhbF9kdG9yKCZyZXQpOworICAgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0yNzUsNyArMzA1LDcgQEAKIAogICB2b2lkIHNraXAoc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKICAgICAgICAgYnVmZmVyX3VzZWQgLT0gY2h1bmtfc2l6ZTsKQEAgLTI4OCw3ICszMTgsNyBAQAogCiAgIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgbWVtY3B5KGJ1ZiwgYnVmZmVyX3B0ciwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CkBAIC0zMjksMjkgKzM1OSwyOSBAQAogICB2b2lkIHJlZmlsbCgpIHsKICAgICBhc3NlcnQoYnVmZmVyX3VzZWQgPT0gMCk7CiAgICAgenZhbCByZXR2YWw7Ci0gICAgWlZBTF9OVUxMKCZyZXR2YWwpOwotCi0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfTE9ORyhhcmdzWzBdLCBidWZmZXJfc2l6ZSk7Ci0KLSAgICBUU1JNTFNfRkVUQ0goKTsKLQorICAgIHp2YWwgYXJnc1sxXTsKICAgICB6dmFsIGZ1bmNuYW1lOwotICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiLCAwKTsKIAotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKKyAgICBaVkFMX0xPTkcoJmFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKKworICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICB6dmFsX2R0b3IoJmZ1bmNuYW1lKTsKIAogICAgIGlmIChFRyhleGNlcHRpb24pKSB7CiAgICAgICB6dmFsX2R0b3IoJnJldHZhbCk7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogCiAgICAgYnVmZmVyX3VzZWQgPSBaX1NUUkxFTihyZXR2YWwpOwogICAgIG1lbWNweShidWZmZXIsIFpfU1RSVkFMKHJldHZhbCksIGJ1ZmZlcl91c2VkKTsKKwogICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKIAogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0zNTksMjIwICszODksNjMgQEAKIAogfTsKIAorc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOworc3RhdGljCiB2b2lkIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7Ci12b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKLXZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCk7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYyk7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlX2lzX3NjYWxhcihpbnQ4X3QgdCk7CiAKIC8vIENyZWF0ZSBhIFBIUCBvYmplY3QgZ2l2ZW4gYSB0eXBlbmFtZSBhbmQgY2FsbCB0aGUgY3Rvciwgb3B0aW9uYWxseSBwYXNzaW5nIHVwIHRvIDIgYXJndW1lbnRzCi12b2lkIGNyZWF0ZU9iamVjdChjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IE5VTEwsIHp2YWwqIGFyZzIgPSBOVUxMKSB7Ci0gIFRTUk1MU19GRVRDSCgpOwotICBzaXplX3Qgb2JqX3R5cGVuYW1lX2xlbiA9IHN0cmxlbihvYmpfdHlwZW5hbWUpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX3R5cGVuYW1lLCBvYmpfdHlwZW5hbWVfbGVuLCBaRU5EX0ZFVENIX0NMQVNTX0RFRkFVTFQgVFNSTUxTX0NDKTsKK3N0YXRpYwordm9pZCBjcmVhdGVPYmplY3QoY29uc3QgY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBudWxscHRyLCB6dmFsKiBhcmcyID0gbnVsbHB0cikgeworICAvKiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhhdCBvbiB0aGUgc3RhY2sgPyAqLworICB6ZW5kX3N0cmluZyAqb2JqX25hbWUgPSB6ZW5kX3N0cmluZ19pbml0KG9ial90eXBlbmFtZSwgc3RybGVuKG9ial90eXBlbmFtZSksIDApOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX25hbWUsIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCk7CisgIHplbmRfc3RyaW5nX3JlbGVhc2Uob2JqX25hbWUpOworCiAgIGlmICghIGNlKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKKyAgICBwaHBfZXJyb3JfZG9jcmVmKG51bGxwdHIsIEVfRVJST1IsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCIsIG9ial90eXBlbmFtZSk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogCi0gIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIE5VTEwpOwotICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKTsKLSAgenZhbCogY3Rvcl9ydiA9IE5VTEw7Ci0gIHplbmRfY2FsbF9tZXRob2QoJnJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyIFRTUk1MU19DQyk7Ci0gIHp2YWxfcHRyX2R0b3IoJmN0b3JfcnYpOworICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBudWxscHRyKTsKKyAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IoWl9PQkpfUChyZXR1cm5fdmFsdWUpKTsKKyAgenZhbCBjdG9yX3J2OworICB6ZW5kX2NhbGxfbWV0aG9kKHJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyKTsKKyAgenZhbF9kdG9yKCZjdG9yX3J2KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9CiB9CiAKLXZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7Ci0gIFRTUk1MU19GRVRDSCgpOworc3RhdGljCit2b2lkIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihjb25zdCBjaGFyKiB3aGF0LCBsb25nIGVycm9yY29kZSkgeworICB6dmFsIHp3aGF0LCB6ZXJyb3Jjb2RlOwogCi0gIHp2YWwgKnp3aGF0LCAqemVycm9yY29kZTsKLSAgTUFLRV9TVERfWlZBTCh6d2hhdCk7Ci0gIE1BS0VfU1REX1pWQUwoemVycm9yY29kZSk7CisgIFpWQUxfU1RSSU5HKCZ6d2hhdCwgd2hhdCk7CisgIFpWQUxfTE9ORygmemVycm9yY29kZSwgZXJyb3Jjb2RlKTsKIAotICBaVkFMX1NUUklORyh6d2hhdCwgd2hhdCwgMSk7Ci0gIFpWQUxfTE9ORyh6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOworICB6dmFsIGV4OworICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRQcm90b2NvbEV4Y2VwdGlvbiIsICZleCwgMiwgJnp3aGF0LCAmemVycm9yY29kZSk7CiAKLSAgenZhbCogZXg7Ci0gIE1BS0VfU1REX1pWQUwoZXgpOwotICBjcmVhdGVPYmplY3QoIlRQcm90b2NvbEV4Y2VwdGlvbiIsIGV4LCAyLCB6d2hhdCwgemVycm9yY29kZSk7Ci0gIHp2YWxfcHRyX2R0b3IoJnp3aGF0KTsKLSAgenZhbF9wdHJfZHRvcigmemVycm9yY29kZSk7Ci0gIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB6dmFsX2R0b3IoJnp3aGF0KTsKKyAgenZhbF9kdG9yKCZ6ZXJyb3Jjb2RlKTsKKworICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7CiB9CiAKIC8vIFNldHMgRUcoZXhjZXB0aW9uKSwgY2FsbCB0aGlzIGFuZCB0aGVuIFJFVFVSTl9OVUxMKCk7CitzdGF0aWMKIHZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdChUU1JNTFNfQ0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CisgIHplbmRfdGhyb3dfZXhjZXB0aW9uKHplbmRfZXhjZXB0aW9uX2dldF9kZWZhdWx0KCksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDApOwogfQogCi0KLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiByZXR1cm5fdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7Ci0gIHp2YWwqKiB2YWxfcHRyOwotICBaX1RZUEVfUChyZXR1cm5fdmFsdWUpID0gSVNfTlVMTDsgLy8ganVzdCBpbiBjYXNlCi0KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIGlmICh6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIDYsICh2b2lkKiopJnZhbF9wdHIpICE9IFNVQ0NFU1MpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUFAodmFsX3B0cik7Ci0gICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKLSAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOwotICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgInNwZWMgZm9yICVzIGlzIHdyb25nIHR5cGU6ICVkXG4iLCBzdHJ1Y3RUeXBlLCBaX1RZUEVfUChzcGVjKSk7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFRfQk9PTDogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fQk9PTChjICE9IDApOwotICAgIH0KLSAgLy9jYXNlIFRfSTA4OiAvLyBzYW1lIG51bWVyaWMgdmFsdWUgYXMgVF9CWVRFCi0gICAgY2FzZSBUX0JZVEU6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDhfdCljKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kxNjogewotICAgICAgdWludDE2X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDIpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDE2X3QpbnRvaHMoYykpOwotICAgIH0KLSAgICBjYXNlIFRfSTMyOiB7Ci0gICAgICB1aW50MzJfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgNCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MzJfdCludG9obChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9VNjQ6Ci0gICAgY2FzZSBUX0k2NDogewotICAgICAgdWludDY0X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDgpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDY0X3QpbnRvaGxsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICB1aW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJihhLmMpLCA4KTsKLSAgICAgIGEuYyA9IG50b2hsbChhLmMpOwotICAgICAgUkVUVVJOX0RPVUJMRShhLmQpOwotICAgIH0KLSAgICAvL2Nhc2UgVF9VVEY3OiAvLyBhbGlhc2VzIFRfU1RSSU5HCi0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgY2hhciogc3RyYnVmID0gKGNoYXIqKSBlbWFsbG9jKHNpemUgKyAxKTsKLSAgICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyhzdHJidWYsIHNpemUpOwotICAgICAgICBzdHJidWZbc2l6ZV0gPSAnXDAnOwotICAgICAgICBaVkFMX1NUUklOR0wocmV0dXJuX3ZhbHVlLCBzdHJidWYsIHNpemUsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgWlZBTF9FTVBUWV9TVFJJTkcocmV0dXJuX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX01BUDogeyAvLyBhcnJheSBvZiBrZXkgLT4gdmFsdWUKLSAgICAgIHVpbnQ4X3QgdHlwZXNbMl07Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHR5cGVzLCAyKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJrZXkiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsICp2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0KLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICBNQUtFX1NURF9aVkFMKGtleSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsIGtleSwga2V5c3BlYyk7Ci0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCB2YWx1ZSwgdmFsc3BlYyk7Ci0gICAgICAgIGlmIChaX1RZUEVfUChrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfTFZBTF9QKGtleSksICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEVfUChrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoa2V5KTsKLSAgICAgICAgICB6ZW5kX2hhc2hfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfU1RSVkFMX1Aoa2V5KSwgWl9TVFJMRU5fUChrZXkpICsgMSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgenZhbF9wdHJfZHRvcigma2V5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCi0gICAgfQotICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKLSAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCB2YWx1ZSwgZWxlbXNwZWMpOwotICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKLSAgICAgIHVpbnQ4X3QgdHlwZTsKLSAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOwotICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICB6dmFsKiB2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgWlZBTF9UUlVFKHZhbHVlKTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCBrZXksIGVsZW1zcGVjKTsKLQotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9OwotCi0gIGNoYXIgZXJyYnVmWzEyOF07Ci0gIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7Ci0gIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci19Ci0KK3N0YXRpYwogdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KSB7CiAgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewogICAgIGNhc2UgVF9TVE9QOgpAQCAtNjMyLDc0ICs1MDUsNDcyIEBACiAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MpIHsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgenZhbF9pc19ib29sKHp2YWwqIHYpIHsKKyAgcmV0dXJuIFpfVFlQRV9QKHYpID09IElTX1RSVUUgfHwgWl9UWVBFX1AodikgPT0gSVNfRkFMU0U7Cit9CisKK3N0YXRpYwordm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKKyAgWlZBTF9OVUxMKHJldHVybl92YWx1ZSk7CisKKyAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCBzaXplb2YoImNsYXNzIiktMSk7CisgICAgICBpZiAodmFsX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorCisgICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgaW4gUEhQIHVzZXJsYW5kIGJhc2VkIG9uIG91ciBzcGVjCisgICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKKyAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQorICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVF9CT09MOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7CisgICAgfQorICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKKyAgICBjYXNlIFRfQllURTogeworICAgICAgdWludDhfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7CisgICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOworICAgIH0KKyAgICBjYXNlIFRfSTE2OiB7CisgICAgICB1aW50MTZfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7CisgICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7CisgICAgfQorICAgIGNhc2UgVF9JMzI6IHsKKyAgICAgIHVpbnQzMl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX1U2NDoKKyAgICBjYXNlIFRfSTY0OiB7CisgICAgICB1aW50NjRfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7CisgICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOiB7CisgICAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOworICAgICAgYS5jID0gbnRvaGxsKGEuYyk7CisgICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7CisgICAgfQorICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzogeworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBpZiAoc2l6ZSkgeworICAgICAgICBjaGFyIHN0cmJ1ZltzaXplKzFdOworICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7CisgICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQorICAgICAgdWludDhfdCB0eXBlc1syXTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisKKyAgICAgIHp2YWwgKnZhbF9wdHI7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSk7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsICZrZXksIGtleXNwZWMpOworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgJnZhbHVlLCB2YWxzcGVjKTsKKyAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKKyAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7CisgICAgICAgICAgemVuZF9zeW10YWJsZV91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHp2YWxfZHRvcigma2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCisgICAgfQorICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKKyAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwgdmFsdWU7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZ2YWx1ZSwgZWxlbXNwZWMpOworICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCAmdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCisgICAgICB1aW50OF90IHR5cGU7CisgICAgICB1aW50MzJfdCBzaXplOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKKyAgICAgIHNpemUgPSBudG9obChzaXplKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisgICAgICAgIFpWQUxfVFJVRSgmdmFsdWUpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZrZXksIGVsZW1zcGVjKTsKKworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MsIEhhc2hUYWJsZSogc3BlYykgewogICBib29sIGtleXR5cGVfaXNfbnVtZXJpYyA9ICghKChrZXl0eXBlID09IFRfU1RSSU5HKSB8fCAoa2V5dHlwZSA9PSBUX1VURjgpIHx8IChrZXl0eXBlID09IFRfVVRGMTYpKSk7CiAKLSAgY2hhcioga2V5OworICB6ZW5kX3N0cmluZyoga2V5OwogICB1aW50IGtleV9sZW47CiAgIGxvbmcgaW5kZXggPSAwOwogCi0gIHp2YWwqIHo7Ci0gIE1BS0VfU1REX1pWQUwoeik7CisgIHp2YWwgejsKIAotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgJmtleV9sZW4sICh1bG9uZyopJmluZGV4LCAwLCAmaHRfcG9zKTsKLSAgaWYgKGtleXR5cGVfaXNfbnVtZXJpYykgewotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBpbmRleCA9IHN0cnRvbChrZXksIE5VTEwsIDEwKTsKLSAgICB9Ci0gICAgWlZBTF9MT05HKHosIGluZGV4KTsKKyAgaW50IHJlcyA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoaHQsICZrZXksICh6ZW5kX3Vsb25nKikmaW5kZXgsICZodF9wb3MpOworICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgeworICAgIFpWQUxfU1RSX0NPUFkoJnosIGtleSk7CiAgIH0gZWxzZSB7Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBrZXlfbGVuIC09IDE7IC8vIHNraXAgdGhlIG51bGwgdGVybWluYXRvcgotICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgICAgIGtleSA9IGJ1Zjsga2V5X2xlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLSAgICBaVkFMX1NUUklOR0woeiwga2V5LCBrZXlfbGVuLCAxKTsKKyAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKICAgfQotICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIE5VTEwpOwotICB6dmFsX3B0cl9kdG9yKCZ6KTsKKyAgYmluYXJ5X3NlcmlhbGl6ZShrZXl0eXBlLCB0cmFuc3BvcnQsICZ6LCBzcGVjKTsKKyAgenZhbF9kdG9yKCZ6KTsKIH0KIAotaW5saW5lIGJvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBpZiAodmFsdWUpIHsKKyAgICBaVkFMX0RFUkVGKHZhbHVlKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgorICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfU1RSVUNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX09CSkVDVCkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AodmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICAgIGlmIChzcGVjICYmIFpfVFlQRV9QKHNwZWMpID09IElTX1JFRkVSRU5DRSkgeworICAgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgfQorICAgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9CT09MOgorICAgICAgaWYgKCF6dmFsX2lzX2Jvb2wodmFsdWUpKSBjb252ZXJ0X3RvX2Jvb2xlYW4odmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9UWVBFX0lORk9fUCh2YWx1ZSkgPT0gSVNfVFJVRSA/IDEgOiAwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kxNjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JMzI6CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTY0OgorICAgIGNhc2UgVF9VNjQ6IHsKKyAgICAgIGludDY0X3QgbF9kYXRhOworI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgbF9kYXRhID0gWl9MVkFMX1AodmFsdWUpOworI2Vsc2UKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSAoaW50NjRfdClaX0RWQUxfUCh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50NjRfdCBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgIH0gYTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBhLmQgPSBaX0RWQUxfUCh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUCh2YWx1ZSksIFpfU1RSTEVOX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfTUFQOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgc2l6ZW9mKCJrdHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgc2l6ZW9mKCJ2dHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKKyAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOworICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0ciwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfTElTVDogeworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfU0VUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgc2l6ZW9mKCJldHlwZSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBzcGVjID0gWl9BUlJWQUxfUCh6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBpZih0dHlwZV9pc19zY2FsYXIoa2V5dHlwZSkpeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCB6ZW5kX3N0cmluZyogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgeworICB6dmFsIGFyZ3NbM107CisgIHp2YWwgcmV0OworICB6dmFsIHdyaXRlTWVzc2FnZWZuOworCisgIFpWQUxfU1RSX0NPUFkoJmFyZ3NbMF0sIG1ldGhvZF9uYW1lKTsKKyAgWlZBTF9MT05HKCZhcmdzWzFdLCBtc2d0eXBlKTsKKyAgWlZBTF9MT05HKCZhcmdzWzJdLCBzZXFJRCk7CisgIFpWQUxfTlVMTCgmcmV0KTsKKyAgWlZBTF9TVFJJTkcoJndyaXRlTWVzc2FnZWZuLCAid3JpdGVNZXNzYWdlQmVnaW4iKTsKKworICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCB0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyk7CisKKyAgenZhbF9kdG9yKCZ3cml0ZU1lc3NhZ2Vmbik7CisgIHp2YWxfZHRvcigmYXJnc1syXSk7IHp2YWxfZHRvcigmYXJnc1sxXSk7IHp2YWxfZHRvcigmYXJnc1swXSk7CisgIHp2YWxfZHRvcigmcmV0KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CiAgIHJldHVybiAoKHQgPT0gVF9CWVRFKSB8fCAoKHQgPj0gVF9JMTYpICAmJiAodCA8PSBUX0k2NCkpKTsKIH0KK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KSB7CisgIHJldHVybiAhKCh0ID09IFRfU1RSVUNUKSB8fCAoIHQ9PSBUX01BUCkgIHx8ICh0ID09IFRfU0VUKSB8fCAodCA9PSBUX0xJU1QpKTsKK30KIAotaW5saW5lIGJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlc19hcmVfY29tcGF0aWJsZShpbnQ4X3QgdDEsIGludDhfdCB0MikgewogICAvLyBJbnRlZ2VyIHR5cGVzIG9mIGRpZmZlcmVudCB3aWR0aHMgYXJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZTsKICAgLy8gb3RoZXJ3aXNlIHRoZSB0eXBlSUQgbXVzdCBtYXRjaC4KICAgcmV0dXJuICgodDEgPT0gdDIpIHx8ICh0dHlwZV9pc19pbnQodDEpICYmIHR0eXBlX2lzX2ludCh0MikpKTsKIH0KIAorLy9pcyB1c2VkIHRvIHZhbGlkYXRlIG9iamVjdHMgYmVmb3JlIHNlcmlhbGl6YXRpb24gYW5kIGFmdGVyIGRlc2VyaWFsaXphdGlvbi4gRm9yIG5vdywgb25seSByZXF1aXJlZCBmaWVsZHMgYXJlIHZhbGlkYXRlZC4KK3N0YXRpYwordm9pZCB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp2YWwqIG9iamVjdCkgeworICAgIHplbmRfY2xhc3NfZW50cnkqIG9iamVjdF9jbGFzc19lbnRyeSA9IFpfT0JKQ0VfUChvYmplY3QpOworICAgIHp2YWwqIGlzX3ZhbGlkYXRlID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJpc1ZhbGlkYXRlIiwgc2l6ZW9mKCJpc1ZhbGlkYXRlIiktMSwgdHJ1ZSk7CisgICAgaWYgKGlzX3ZhbGlkYXRlKSB7CisgICAgICBaVkFMX0RFUkVGKGlzX3ZhbGlkYXRlKTsKKyAgICB9CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgenZhbCogdmFsX3B0cjsKKworICAgIGlmIChpc192YWxpZGF0ZSAmJiBaX1RZUEVfSU5GT19QKGlzX3ZhbGlkYXRlKSA9PSBJU19UUlVFKSB7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cikpIHsKKworICAgICAgICAgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgICAgICAgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoWl9BUlJWQUxfUChzcGVjKSwgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgICAgICAgIC8vIGZpZWxkIG5hbWUKKyAgICAgICAgICAgIHp2YWwqIHp2YXJuYW1lID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgICAgICAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh6dmFybmFtZSk7CisKKyAgICAgICAgICAgIHp2YWwqIGlzX3JlcXVpcmVkID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImlzUmVxdWlyZWQiLCBzaXplb2YoImlzUmVxdWlyZWQiKS0xKTsKKyAgICAgICAgICAgIHp2YWwgcnY7CisgICAgICAgICAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgb2JqZWN0LCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgICAgICAgICBpZiAoWl9UWVBFX0lORk9fUChpc19yZXF1aXJlZCkgPT0gSVNfVFJVRSAmJiBaX1RZUEVfUChwcm9wKSA9PSBJU19OVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlJlcXVpcmVkIGZpZWxkICVzLiVzIGlzIHVuc2V0ISIsIFpTVFJfVkFMKG9iamVjdF9jbGFzc19lbnRyeS0+bmFtZSksIHZhcm5hbWUpOworICAgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIC8vIFNFVCBhbmQgTElTVCBoYXZlICdlbGVtJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hbF0gJ2NsYXNzJykKICAgLy8gTUFQIGhhcyAndmFsJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hXSAnY2xhc3MnKQotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IFpfT0JKQ0VfUCh6dGhpcyk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgenZhbCoqIHZhbF9wdHIgPSBOVUxMOwotCiAgICAgaW50OF90IHR0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHJldHVybjsKKyAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnQxNl90IGZpZWxkbm8gPSB0cmFuc3BvcnQucmVhZEkxNigpOwotICAgIGlmICh6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vLCAodm9pZCoqKSZ2YWxfcHRyKSA9PSBTVUNDRVNTKSB7Ci0gICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vKTsKKyAgICBpZiAodmFsX3B0ciAhPSBudWxscHRyKSB7CisgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAgICAgICAvLyBwdWxsIHRoZSBmaWVsZCBuYW1lCi0gICAgICAvLyB6ZW5kIGhhc2ggdGFibGVzIHVzZSB0aGUgbnVsbCBhdCB0aGUgZW5kIGluIHRoZSBsZW5ndGguLi4gc28gc3RybGVuKGhhc2gga2V5KSArIDEuCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgICAvLyBhbmQgdGhlIHR5cGUKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCiAgICAgICBpZiAodHR5cGVzX2FyZV9jb21wYXRpYmxlKHR0eXBlLCBleHBlY3RlZF90dHlwZSkpIHsKLSAgICAgICAgenZhbCogcnYgPSBOVUxMOwotICAgICAgICBNQUtFX1NURF9aVkFMKHJ2KTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHJ2LCBmaWVsZHNwZWMpOwotICAgICAgICB6ZW5kX3VwZGF0ZV9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgcnYgVFNSTUxTX0NDKTsKKyAgICAgICAgenZhbCBydjsKKyAgICAgICAgWlZBTF9VTkRFRigmcnYpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcnYsIGZpZWxkc3BlYyk7CisgICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCAmcnYpOworCiAgICAgICAgIHp2YWxfcHRyX2R0b3IoJnJ2KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNraXBfZWxlbWVudCh0dHlwZSwgdHJhbnNwb3J0KTsKQEAgLTcxMCwxNjQgKzk4MSw0NCBAQAogICB9CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdHlwZUlEIChhbmQgZmllbGQgbnVtLCBpZiBhcHBsaWNhYmxlKSBzaG91bGQndmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBhbGwgd2UgbmVlZCB0byBkbyBpcyB3cml0ZSB0aGUgcGF5bG9hZC4KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19PQkpFQ1QpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLW9iamVjdCB0eXBlIGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoKnZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKCp2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0JPT0wpIGNvbnZlcnRfdG9fYm9vbGVhbigqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9CVkFMX1BQKHZhbHVlKSA/IDEgOiAwKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgICB1bmlvbiB7Ci0gICAgICAgIGludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKCp2YWx1ZSk7Ci0gICAgICBhLmQgPSBaX0RWQUxfUFAodmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGEuYyk7Ci0gICAgfSByZXR1cm47Ci0gICAgLy9jYXNlIFRfVVRGNzoKLSAgICBjYXNlIFRfVVRGODoKLSAgICBjYXNlIFRfVVRGMTY6Ci0gICAgY2FzZSBUX1NUUklORzoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhaX1NUUlZBTF9QUCh2YWx1ZSksIFpfU1RSTEVOX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX01BUDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX01BUCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJrdHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2dHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhbCIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX0xJU1Q6IHsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KCp2YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9MSVNUKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9TRVQ6IHsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KCp2YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgfTsKLSAgY2hhciBlcnJidWZbMTI4XTsKLSAgc3ByaW50ZihlcnJidWYsICJVbmtub3duIHRocmlmdCB0eXBlSUQgJWQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQotCitzdGF0aWMKIHZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CisKKyAgdmFsaWRhdGVfdGhyaWZ0X29iamVjdCh6dGhpcyk7CisKICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gIHp2YWwqKiB2YWxfcHRyOworICB6dmFsKiB2YWxfcHRyOwogCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoc3BlYywgJmtleV9wdHIpOworICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7CiAKLSAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KHNwZWMsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KHNwZWMsICZrZXlfcHRyKSkgewotICAgIHVsb25nIGZpZWxkbm87Ci0gICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgTlVMTCwgTlVMTCwgJmZpZWxkbm8sIDAsICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgIGlmICh6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KHNwZWMsIG51bGxwdHIsICZmaWVsZG5vLCAma2V5X3B0cikgIT0gSEFTSF9LRVlfSVNfTE9ORykgewogICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgLy8gZmllbGQgbmFtZQotICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyB0aHJpZnQgdHlwZQotICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgaW50OF90IHR0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgaW50OF90IHR0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKLSAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIHp2YWwgcnY7CisgICAgenZhbCogcHJvcCA9IHplbmRfcmVhZF9wcm9wZXJ0eShaX09CSkNFX1AoenRoaXMpLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBmYWxzZSwgJnJ2KTsKKworICAgIGlmIChaX1RZUEVfUChwcm9wKSA9PSBJU19SRUZFUkVOQ0UpeworICAgICAgWlZBTF9VTlJFRihwcm9wKTsKKyAgICB9CiAgICAgaWYgKFpfVFlQRV9QKHByb3ApICE9IElTX05VTEwpIHsKICAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHR0eXBlKTsKICAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihmaWVsZG5vKTsKLSAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgJnByb3AsIGZpZWxkc3BlYyk7CisgICAgICBiaW5hcnlfc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHByb3AsIGZpZWxkc3BlYyk7CiAgICAgfQogICB9CiAgIHRyYW5zcG9ydC53cml0ZUk4KFRfU1RPUCk7IC8vIHN0cnVjdCBlbmQKQEAgLTg3NSw2NCArMTAyNiwzOCBAQAogCiAvLyA2IHBhcmFtczogJHRyYW5zcG9ydCAkbWV0aG9kX25hbWUgJHR0eXBlICRyZXF1ZXN0X3N0cnVjdCAkc2VxSUQgJHN0cmljdF93cml0ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkpIHsKLSAgaW50IGFyZ2MgPSBaRU5EX05VTV9BUkdTKCk7Ci0gIGlmIChhcmdjIDwgNikgewotICAgIFdST05HX1BBUkFNX0NPVU5UOwotICB9CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOwogCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nIChtZXRob2QgbmFtZSkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzNdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiNHRoIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0IChyZXF1ZXN0IHN0cnVjdCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzX2V4KFpFTkRfUEFSU0VfUEFSQU1TX1FVSUVULCBaRU5EX05VTV9BUkdTKCksICJvU2xvbGIiLAorICAgICZwcm90b2NvbCwgJm1ldGhvZF9uYW1lLCAmbXNndHlwZSwKKyAgICAmcmVxdWVzdF9zdHJ1Y3QsICZzZXFJRCwgJnN0cmljdF93cml0ZSkgPT0gRkFJTFVSRSkgeworICAgICAgcmV0dXJuOwogICB9CiAKICAgdHJ5IHsKLSAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICAgIGNvbnZlcnRfdG9fbG9uZygqYXJnc1syXSk7Ci0gICAgaW50MzJfdCBtc2d0eXBlID0gWl9MVkFMX1BQKGFyZ3NbMl0pOwotICAgIHp2YWwqIHJlcXVlc3Rfc3RydWN0ID0gKmFyZ3NbM107Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzRdKTsKLSAgICBpbnQzMl90IHNlcUlEID0gWl9MVkFMX1BQKGFyZ3NbNF0pOwotICAgIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1s1XSk7Ci0gICAgYm9vbCBzdHJpY3RXcml0ZSA9IFpfQlZBTF9QUChhcmdzWzVdKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBhcmdzID0gTlVMTDsKLQotICAgIGlmIChzdHJpY3RXcml0ZSkgewotICAgICAgaW50MzJfdCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbXNndHlwZTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih2ZXJzaW9uKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhtZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoc2VxSUQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcobWV0aG9kX25hbWUsIHN0cmxlbihtZXRob2RfbmFtZSkpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgobXNndHlwZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoc2VxSUQpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXF1ZXN0X3N0cnVjdCksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOwogICAgIH0KIAotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOwogICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKICAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwpAQCAtOTQwLDM3ICsxMDY1LDIwIEBACiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKLSAgfQotCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nICh0eXBlbmFtZSBvZiBleHBlY3RlZCByZXNwb25zZSBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAogICB0cnkgewotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgY2hhciogb2JqX3R5cGVuYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgICBib29sIHN0cmljdF9yZWFkID0gWl9CVkFMX1BQKGFyZ3NbMl0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotCisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtOTk2LDE5ICsxMTA0LDM0IEBACiAgICAgfQogCiAgICAgaWYgKG1lc3NhZ2VUeXBlID09IFRfRVhDRVBUSU9OKSB7Ci0gICAgICB6dmFsKiBleDsKLSAgICAgIE1BS0VfU1REX1pWQUwoZXgpOwotICAgICAgY3JlYXRlT2JqZWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBleCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShleCBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKGV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB6dmFsIGV4OworICAgICAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb24iLCAmZXgpOworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRShleCksICJfVFNQRUMiLCBzaXplb2YoIl9UUFNFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYygmZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7CiAgICAgfQogCi0gICAgY3JlYXRlT2JqZWN0KG9ial90eXBlbmFtZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7CisgICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCBkZXNlcmlhbGl6ZSB0byBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgfQogICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKICAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKLSAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoZXggVFNSTUxTX0NDKTsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgenZhbF9kdG9yKHJldHVybl92YWx1ZSk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKICAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwpAQCAtMTAxNiwzICsxMTM5LDM0IEBACiAgIH0KIH0KIAorLy8gNCBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZCAkYnVmZmVyX3NpemUKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbikgeworICB6dmFsICpwcm90b2NvbDsKKyAgemVuZF9zdHJpbmcgKm9ial90eXBlbmFtZTsKKyAgemVuZF9ib29sIHN0cmljdF9yZWFkOworICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdHJ5IHsKKyAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wsIGJ1ZmZlcl9zaXplKTsKKworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOworICAgIFJFVFVSTl9OVUxMKCk7CisgIH0KK30KKworI2VuZGlmIC8qIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwICovCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCmluZGV4IDQ0ZDAzY2MuLjA0MjA5OTcgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KTsKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkpOworUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKTsKIAogZXh0ZXJuIHplbmRfbW9kdWxlX2VudHJ5IHRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnk7CiAjZGVmaW5lIHBocGV4dF90aHJpZnRfcHJvdG9jb2xfcHRyICZ0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIGIvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1NzllMS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKLQotLyoqCi0gKiBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7Ci0KLSAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLSAgY29uc3QgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKLQotICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7Ci0gICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOwotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpIHsKLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpJHZhbHVlOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpIHsKLSAgICAkbGVuID0gc3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7Ci0gICAgaWYgKCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZElkID0gMDsKLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotICAgIHJldHVybiAyOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKLSAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgfQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKLQotICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOwotCi0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotCi0gICAgICAkaGkgPSAkYXJyWzFdOwotICAgICAgJGxvID0gJGFyclsyXTsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR2YWx1ZSA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQotCi0vKioKLSAqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJpdmF0ZSAkc3RyaWN0V3JpdGVfID0gZmFsc2U7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9ZmFsc2UpIHsKLSAgICAkdGhpcy0+c3RyaWN0UmVhZF8gPSAkc3RyaWN0UmVhZDsKLSAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykgewotICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWQsICR0aGlzLT5zdHJpY3RXcml0ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBY2NlbGVyYXRlZCBiaW5hcnkgcHJvdG9jb2w6IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdGhyaWZ0X3Byb3RvY29sCi0gKiBleHRlbnNpb24gZm9yIGZhc3RlciBkZXNlcmlhbGl6YXRpb24KLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZXh0ZW5kcyBUQmluYXJ5UHJvdG9jb2wgewotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQotICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKLSAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7Ci0gICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7Ci0gICAgfQotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZCwgJHN0cmljdFdyaXRlKTsKLSAgfQotICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RSZWFkKCkgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0UmVhZF87Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0V3JpdGUoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5zdHJpY3RXcml0ZV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAgYi9saWIvcGhwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzFmYWNkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotCi0vKioKLSAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgSU5WQUxJRF9EQVRBID0gMTsKLSAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7Ci0gIGNvbnN0IFNJWkVfTElNSVQgPSAzOwotICBjb25zdCBCQURfVkVSU0lPTiA9IDQ7Ci0KLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKLSAgfQotfQotCi0vKioKLSAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgotICovCi1hYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgewotICAvLyBUaGUgYmVsb3cgbWF5IHNlZW0gc2lsbHksIGJ1dCBpdCBpcyB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIHRoYXQgdGhlCi0gIC8vICJpbnN0YW5jZW9mIiBvcGVyYXRvciBjYW4gb25seSB0YWtlIGluIGEgVF9WQVJJQUJMRSBhbmQgbm90IGEgVF9TVFJJTkcKLSAgLy8gb3IgVF9DT05TVEFOVF9FTkNBUFNFRF9TVFJJTkcuIFVzaW5nICJpc19hKCkiIGluc3RlYWQgb2YgImluc3RhbmNlb2YiIGlzCi0gIC8vIGEgd29ya2Fyb3VuZCBidXQgaXMgZGVwcmVjYXRlZCBpbiBQSFA1LiBUaGlzIGlzIHVzZWQgaW4gdGhlIGdlbmVyYXRlZAotICAvLyBkZXNlcmlhbGl6YXRpb24gY29kZS4KLSAgc3RhdGljICRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCA9ICdUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCc7Ci0KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc187Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKSB7Ci0gICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKLSAgfQotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotCi0gIC8qKgotICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICoKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIC8qCi0gICAqIFN0YXJ0cyBhIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKLSAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7Ci0KLSAgLyoqCi0gICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKLSAgICogY2F1c2luZyBjb3JydXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7Ci0gICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkZnR5cGUgPSAwOwotICAgICAgICAgICRmaWQgPSAwOwotICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICB7Ci0gICAgICAgIC8vIEt0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDY7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwotICovCi1pbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFByb3RvY29sIHByb3RvY29sCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvc3JjL3NlcnZlci9UU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1YTllZS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy9zZXJ2ZXIvVFNlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIgewotCi0gIC8qKgotICAgKiBQcm9jZXNzb3IgdG8gaGFuZGxlIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFByb2Nlc3NvcgotICAgKi8KLSAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXIgdHJhbnNwb3J0IHRvIGJlIHVzZWQgZm9yIGxpc3RlbmluZwotICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFNlcnZlclRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOwotCi0gIC8qKgotICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCAkcHJvY2Vzc29yCi0gICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8gPSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZlcyB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4KLSAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0Ci0gICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgc2VydmluZwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QwYTMyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/cGhwCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3NlcnZlci9UU2VydmVyLnBocCc7Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKLSAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgJGlucHV0UHJvdG9jb2wgPSAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAotICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQxNTY0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogQnVmZmVyZWQgdHJhbnNwb3J0LiBTdG9yZXMgZGF0YSB0byBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCBpdCBkb2Vzbid0Ci0gKiBhY3R1YWxseSB3cml0ZSBvdXQgdW50aWwgZmx1c2ggaXMgY2FsbGVkLiBGb3IgcmVhZGluZywgd2UgZG8gYSBncmVlZHkKLSAqIHJlYWQgYW5kIHRoZW4gc2VydmUgZGF0YSBvdXQgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBhcm91bmQgYW4gdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyQnVmU2l6ZT01MTIsICR3QnVmU2l6ZT01MTIpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKLSAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKLQotICAvKioKLSAgICogVGhlIHJlYWQgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAotICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCi0gICAqIGV4YW1wbGUsIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgYmxvY2tzIGlmIHlvdSBjYWxsIHJlYWQgd2l0aCAkbGVuIGdyZWF0ZXIKLSAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCi0gICAqCi0gICAqIFRoZXJlZm9yZSwgdXNlIHRoZSByZWFkQWxsIG1ldGhvZCBvZiB0aGUgd3JhcHBlZCB0cmFuc3BvcnQgaW5zaWRlCi0gICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgICRoYXZlID0gc3RybGVuKCR0aGlzLT5yQnVmXyk7Ci0gICAgaWYgKCRoYXZlID09IDApIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPT0gJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICB9IGVsc2UgaWYgKCRoYXZlID4gJGxlbikgewotICAgICAgJGRhdGEgPSBzdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkcmV0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPj0gJHRoaXMtPndCdWZTaXplXykgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPiAwKSB7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJHRoaXMtPndCdWZfKTsKLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTczOTIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LgotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByaXZhdGUgJHRyYW5zcG9ydF87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcmVhZCBkYXRhLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJpdmF0ZSAkckJ1Zl87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcXVldWVkIG91dHB1dCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICR3QnVmXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBmcmFtZSByZWFkcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHJlYWRfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHdyaXRlcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHdyaXRlXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyZWFkPXRydWUsICR3cml0ZT10cnVlKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yZWFkXyA9ICRyZWFkOwotICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKLSAgICogY2h1bmsgYW5kIHNlcnZlcyBmdXR1cmUgcmVhZHMgb3V0IG9mIHRoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKLSAgICB9Ci0KLSAgICAvLyBKdXN0IHJldHVybiBmdWxsIGJ1ZmYKLSAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJCdWZfKSkgewotICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7Ci0gICAgICByZXR1cm4gJG91dDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gc3Vic3RyCi0gICAgJG91dCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKSB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBzdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBzdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICAkb3V0ID0gcGFjaygnTicsIHN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKLSAgICAkb3V0IC49ICR0aGlzLT53QnVmXzsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmRiYmIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotCi0vKioKLSAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkaG9zdF87Ci0KLSAgLyoqCi0gICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRoZSBVUkkgdG8gcmVxdWVzdAotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICR1cmlfOwotCi0gIC8qKgotICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkc2NoZW1lXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkYnVmXzsKLQotICAvKioKLSAgICogSW5wdXQgc29ja2V0IHN0cmVhbS4KLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJvdGVjdGVkICRoYW5kbGVfOwotCi0gIC8qKgotICAgKiBSZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHZhciBmbG9hdAotICAgKi8KLSAgcHJvdGVjdGVkICR0aW1lb3V0XzsKLQotICAvKioKLSAgICogTWFrZSBhIG5ldyBIVFRQIGNsaWVudC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdAotICAgKiBAcGFyYW0gaW50ICAgICRwb3J0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJHVyaQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydD04MCwgJHVyaT0nJywgJHNjaGVtZSA9ICdodHRwJykgewotICAgIGlmICgoc3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgewotICAgICAgJHVyaSA9ICcvJy4kdXJpOwotICAgIH0KLSAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gICAgJHRoaXMtPnVyaV8gPSAkdXJpOwotICAgICR0aGlzLT5idWZfID0gJyc7Ci0gICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJlYWQgdGltZW91dAotICAgKgotICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkgewotICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KLSAgICoKLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICBpZiAoJG1kWyd0aW1lZF9vdXQnXSkgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nLycuJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nLycuJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotCi0gICAgJGhlYWRlcnMgPSBhcnJheSgnSG9zdDogJy4kaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50OiBQSFAvVEh0dHBDbGllbnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAnLnN0cmxlbigkdGhpcy0+YnVmXykpOwotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGIxYTU0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgotICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQotICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKLSAqIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCi0gICAqIGZvciB0aGUgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykgewotICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKLSAgfQotCi0gIHByb3RlY3RlZCAkYnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+YnVmXykgPT09IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLiAnIGJ5dGVzIGZyb20gYnVmZmVyLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5idWZfKSA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87Ci0gICAgICAkdGhpcy0+YnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IHN1YnN0cigkdGhpcy0+YnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPmJ1Zl8gPSBzdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOwotCi0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5idWZfOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpIHsKLSAgICByZXR1cm4gc3RybGVuKCR0aGlzLT5idWZfKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTM0MGQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgotICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7fQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjExYTYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKLSAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICBjb25zdCBNT0RFX1IgPSAxOwotICBjb25zdCBNT0RFX1cgPSAyOwotCi0gIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkcmVhZF8gPSBmYWxzZTsKLQotICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpIHsKLSAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKLSAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gQGZvcGVuKHNlbGY6OmluU3RyZWFtTmFtZSgpLCAncicpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL291dHB1dCcpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOwotICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7Ci0gICAgfQotICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybgotICAgICAgKCEkdGhpcy0+cmVhZF8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpICYmCi0gICAgICAoISR0aGlzLT53cml0ZV8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgd2hpbGUgKHN0cmxlbigkYnVmKSA+IDApIHsKLSAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKLSAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IEZBTFNFKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJy5zdHJsZW4oJGJ1ZikuJyBieXRlcycpOwotICAgICAgfQotICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkZ290KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpblN0cmVhbU5hbWUoKSB7Ci0gICAgaWYgKHBocF9zYXBpX25hbWUoKSA9PSAnY2xpJykgewotICAgICAgcmV0dXJuICdwaHA6Ly9zdGRpbic7Ci0gICAgfQotICAgIHJldHVybiAncGhwOi8vaW5wdXQnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjMTJhYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3BocAotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5waHAnOwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXQucGhwJzsKLQotLyoqCi0gKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcml2YXRlICRsaXN0ZW5lcl87Ci0KLSAgLyoqCi0gICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJGFjY2VwdFRpbWVvdXRfID0gMzAwMDA7Ci0KLSAgLyoqCi0gICAqIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRob3N0XzsKLQotICAvKioKLSAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkgewotICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpIHsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKLSAgICoKLSAgICogQHJldHVybiBUU29ja2V0Ci0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpIHsKLSAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7Ci0gICAgaWYoISRoYW5kbGUpIHJldHVybiBudWxsOwotCi0gICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7Ci0gICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOwotICAgIAotICAgIHJldHVybiAkc29ja2V0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MmNhNzcuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLQotLyoqCi0gKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKLSAgLyoqCi0gICAqIExpc3QgZm9yIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHNlcnZlcgotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgdG8gaW1wbGVtZW50Ci0gICAqIGFjY2VwdC4KLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGZ1bmN0aW9uIGFjY2VwdEltcGwoKTsKLQotICAvKioKLSAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KLSAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpIHsKLSAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKLQotICAgIGlmICgkdHJhbnNwb3J0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTE5ODcuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSB0byBQSFAgc29ja2V0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByaXZhdGUgJGhhbmRsZV8gPSBudWxsOwotCi0gIC8qKgotICAgKiBSZW1vdGUgaG9zdG5hbWUKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkaG9zdF8gPSAnbG9jYWxob3N0JzsKLQotICAvKioKLSAgICogUmVtb3RlIHBvcnQKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcG9ydF8gPSAnOTA5MCc7Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0XyA9IDEwMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRfID0gNzUwOwotCi0gIC8qKgotICAgKiBJcyBzZW5kIHRpbWVvdXQgc2V0PwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0U2V0XyA9IEZBTFNFOwotCi0gIC8qKgotICAgKiBQZXJzaXN0ZW50IHNvY2tldCBvciBwbGFpbj8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRwZXJzaXN0XyA9IEZBTFNFOwotCi0gIC8qKgotICAgKiBEZWJ1Z2dpbmcgb24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z18gPSBGQUxTRTsKLQotICAvKioKLSAgICogRGVidWcgaGFuZGxlcgotICAgKgotICAgKiBAdmFyIG1peGVkCi0gICAqLwotICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOwotCi0gIC8qKgotICAgKiBTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgIFJlbW90ZSBob3N0bmFtZQotICAgKiBAcGFyYW0gaW50ICAgICRwb3J0ICAgICAgICAgUmVtb3RlIHBvcnQKLSAgICogQHBhcmFtIGJvb2wgICAkcGVyc2lzdCAgICAgIFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKLSAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICAgICR0aGlzLT5wZXJzaXN0XyA9ICRwZXJzaXN0OwotICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkgewotICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZW5kIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0XyA9ICR0aW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVjdlRpbWVvdXQoJHRpbWVvdXQpIHsKLSAgICAkdGhpcy0+cmVjdlRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXREZWJ1ZygkZGVidWcpIHsKLSAgICAkdGhpcy0+ZGVidWdfID0gJGRlYnVnOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBob3N0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPmhvc3RfOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBpbnQgcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgotICAgKgotICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIGlzX3Jlc291cmNlKCR0aGlzLT5oYW5kbGVfKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKGVtcHR5KCR0aGlzLT5ob3N0XykpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0Xy8xMDAwLjApOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRfLzEwMDAuMCk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotCi0gICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5oYW5kbGVfLCAwLCAkdGhpcy0+c2VuZFRpbWVvdXRfKjEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFNldF8gPSBUUlVFOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXNlcyBzdHJlYW0gZ2V0IGNvbnRlbnRzIHRvIGRvIHRoZSByZWFkaW5nCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbWFueSBieXRlcwotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgIGlmICgkdGhpcy0+c2VuZFRpbWVvdXRTZXRfKSB7Ci0gICAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHRoaXMtPmhhbmRsZV8sIDAsICR0aGlzLT5yZWN2VGltZW91dF8qMTAwMCk7Ci0gICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0gICAgfQotICAgIC8vIFRoaXMgY2FsbCBkb2VzIG5vdCBvYmV5IHN0cmVhbV9zZXRfdGltZW91dCB2YWx1ZXMhCi0gICAgLy8gJGJ1ZiA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLQotICAgICRwcmUgPSBudWxsOwotICAgIHdoaWxlIChUUlVFKSB7Ci0gICAgICAkYnVmID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICAgIGlmICgkYnVmID09PSBGQUxTRSB8fCAkYnVmID09PSAnJykgewotICAgICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoKCRzeiA9IHN0cmxlbigkYnVmKSkgPCAkbGVuKSB7Ci0gICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkcHJlIC49ICRidWY7Ci0gICAgICAgICAgJGxlbiAtPSAkc3o7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAkcHJlLiRidWY7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSB0aGUgc29ja2V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbWFueSBieXRlcwotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgIGlmICgkdGhpcy0+c2VuZFRpbWVvdXRTZXRfKSB7Ci0gICAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHRoaXMtPmhhbmRsZV8sIDAsICR0aGlzLT5yZWN2VGltZW91dF8qMTAwMCk7Ci0gICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0gICAgfQotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgIGlmICghJHRoaXMtPnNlbmRUaW1lb3V0U2V0XykgewotICAgICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5oYW5kbGVfLCAwLCAkdGhpcy0+c2VuZFRpbWVvdXRfKjEwMDApOwotICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2V0XyA9IFRSVUU7Ci0gICAgfQotICAgIHdoaWxlIChzdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+aGFuZGxlXywgJGJ1Zik7Ci0gICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBGQUxTRSkgewotICAgICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcuc3RybGVuKCRidWYpLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAkcmV0ID0gZmZsdXNoKCR0aGlzLT5oYW5kbGVfKTsKLSAgICBpZiAoJHJldCA9PT0gRkFMU0UpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgZmx1c2g6ICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0NmMzNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKiBJbmhlcml0cyBmcm9tIFNvY2tldCAqLwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXQucGhwJzsKLQotLyoqCi0gKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKLSAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCi0gKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQotICogbWlzc2VzLgotICovCi1pZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKLSAgZnVuY3Rpb24gYXBjX2ZldGNoKCRrZXkpIHsgcmV0dXJuIEZBTFNFOyB9Ci0gIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsPTApIHsgcmV0dXJuIEZBTFNFOyB9Ci19Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgotICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQgewotCi0gIC8qKgotICAgKiBSZW1vdGUgc2VydmVycy4gQXJyYXkgb2YgYXNzb2NpYXRpdmUgYXJyYXlzIHdpdGggJ2hvc3QnIGFuZCAncG9ydCcga2V5cwotICAgKi8KLSAgcHJpdmF0ZSAkc2VydmVyc18gPSBhcnJheSgpOwotCi0gIC8qKgotICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkbnVtUmV0cmllc18gPSAxOwotCi0gIC8qKgotICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgotICAgKiBtYXJrZWQgYXMgZG93bi4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJldHJ5SW50ZXJ2YWxfID0gNjA7Ci0KLSAgLyoqCi0gICAqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gMTsKLQotICAvKioKLSAgICogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHJhbmRvbWl6ZV8gPSBUUlVFOwotCi0gIC8qKgotICAgKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRhbHdheXNUcnlMYXN0XyA9IFRSVUU7Ci0KLSAgLyoqCi0gICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBhcnJheSAgJGhvc3RzICAgICAgICBMaXN0IG9mIHJlbW90ZSBob3N0bmFtZXMKLSAgICogQHBhcmFtIG1peGVkICAkcG9ydHMgICAgICAgIEFycmF5IG9mIHJlbW90ZSBwb3J0cywgb3IgYSBzaW5nbGUgY29tbW9uIHBvcnQKLSAgICogQHBhcmFtIGJvb2wgICAkcGVyc2lzdCAgICAgIFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKLSAgICogQHBhcmFtIG1peGVkICAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3RzPWFycmF5KCdsb2NhbGhvc3QnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0cz1hcnJheSg5MDkwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwZXJzaXN0PUZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSGFuZGxlcj1udWxsKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdChudWxsLCAwLCAkcGVyc2lzdCwgJGRlYnVnSGFuZGxlcik7Ci0KLSAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKLSAgICAgICRwb3J0ID0gJHBvcnRzOwotICAgICAgJHBvcnRzID0gYXJyYXkoKTsKLSAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICAgJHBvcnRzWyRrZXldID0gJHBvcnQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJGhvc3QpIHsKLSAgICAgICR0aGlzLT5zZXJ2ZXJzXyBbXT0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gJHBvcnRzWyRrZXldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCi0gICAqCi0gICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IGhvc3RuYW1lIG9yIElQCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGFkZFNlcnZlcigkaG9zdCwgJHBvcnQpIHsKLSAgICAkdGhpcy0+c2VydmVyc19bXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwgJ3BvcnQnID0+ICRwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKSB7Ci0gICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJldHJ5SW50ZXJ2YWwoJHJldHJ5SW50ZXJ2YWwpIHsKLSAgICAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gPSAkcmV0cnlJbnRlcnZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoJG1heENvbnNlY3V0aXZlRmFpbHVyZXMpIHsKLSAgICAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKLSAgfQotCi0gIC8qKgotICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkcmFuZG9taXplCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpIHsKLSAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGFsd2F5c1RyeUxhc3QKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRBbHdheXNUcnlMYXN0KCRhbHdheXNUcnlMYXN0KSB7Ci0gICAgJHRoaXMtPmFsd2F5c1RyeUxhc3RfID0gJGFsd2F5c1RyeUxhc3Q7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAotICAgKiBhbmQgdHJ5aW5nIHRvIGZpbmQgb25lIHRoYXQgd29ya3MuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KLSAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKLSAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCi0gICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOwotCi0gICAgZm9yICgkaSA9IDA7ICRpIDwgJG51bVNlcnZlcnM7ICsrJGkpIHsKLQotICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcwotICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKLQotICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCi0gICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgLy8gQ2FjaGUgbWlzcz8gQXNzdW1lIGl0J3MgT0sKLSAgICAgICRsYXN0RmFpbHRpbWUgPSBhcGNfZmV0Y2goJGZhaWx0aW1lS2V5KTsKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID09PSBGQUxTRSkgewotICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKLSAgICAgIH0KLQotICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBGQUxTRTsKLQotICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7Ci0gICAgICAgIGlmICgkZWxhcHNlZCA+ICR0aGlzLT5yZXRyeUludGVydmFsXykgewotICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gVFJVRTsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IHJldHJ5SW50ZXJ2YWwgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJykgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcuJGhvc3QuJzonLiRwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcwotICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKLSAgICAgICRpc0xhc3RTZXJ2ZXIgPSBGQUxTRTsKLSAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKLSAgICAgICAgJGlzTGFzdFNlcnZlciA9ICgkaSA9PSAoJG51bVNlcnZlcnMgLSAxKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoJGxhc3RGYWlsdGltZSA9PT0gMCkgfHwKLSAgICAgICAgICAoJGlzTGFzdFNlcnZlcikgfHwKLSAgICAgICAgICAoJGxhc3RGYWlsdGltZSA+IDAgJiYgJHJldHJ5SW50ZXJ2YWxQYXNzZWQpKSB7Ci0KLSAgICAgICAgLy8gU2V0IHVuZGVybHlpbmcgVFNvY2tldCBwYXJhbXMgdG8gdGhpcyBvbmUKLSAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotCi0gICAgICAgIC8vIFRyeSB1cCB0byBudW1SZXRyaWVzXyBjb25uZWN0aW9ucyBwZXIgc2VydmVyCi0gICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIHVuZGVybHlpbmcgVFNvY2tldCBvcGVuIGZ1bmN0aW9uCi0gICAgICAgICAgICBwYXJlbnQ6Om9wZW4oKTsKLQotICAgICAgICAgICAgLy8gT25seSBjbGVhciB0aGUgZmFpbHVyZSBjb3VudHMgaWYgcmVxdWlyZWQgdG8gZG8gc28KLSAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgewotICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXJrIGZhaWx1cmUgb2YgdGhpcyBob3N0IGluIHRoZSBjYWNoZQotICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgICAvLyBJZ25vcmUgY2FjaGUgbWlzc2VzCi0gICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOwotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBGQUxTRSkgewotICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmNyZW1lbnQgYnkgb25lCi0gICAgICAgICRjb25zZWNmYWlscysrOwotCi0gICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCi0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPj0gJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcuJGhvc3QuJzonLiRwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nIHNlY3MgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnLiRjb25zZWNmYWlscy4nIGZhaWxlZCBhdHRlbXB0cy4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3RvcmUgdGhlIGZhaWx1cmUgdGltZQotICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7Ci0KLSAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAkY29uc2VjZmFpbHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKLSAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOwotICAgICRob3N0cyA9IGFycmF5KCk7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKLSAgICAgICRob3N0cyBbXT0gJHNlcnZlclsnaG9zdCddLic6Jy4kc2VydmVyWydwb3J0J107Ci0gICAgfQotICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOwotICAgICRlcnJvciAuPSAnKCcuJGhvc3RsaXN0LicpJzsKLSAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7Ci0gICAgfQotICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlMzM2ZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBUcmFuc3BvcnQgZXhjZXB0aW9ucwotICovCi1jbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7Ci0KLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IE5PVF9PUEVOID0gMTsKLSAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKLSAgY29uc3QgVElNRURfT1VUID0gMzsKLSAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OwotCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIG9wZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkbGVuKTsKLQotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pIHsKLSAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7Ci0KLSAgICAkZGF0YSA9ICcnOwotICAgICRnb3QgPSAwOwotICAgIHdoaWxlICgoJGdvdCA9IHN0cmxlbigkZGF0YSkpIDwgJGxlbikgewotICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBnaXZlbiBkYXRhIG91dC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRidWYpOwotCi0gIC8qKgotICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7fQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGE2NWEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/cGhwCi0KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEBzdGF0aWMKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkgewotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU3ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApAQCAtMCwwICsxLDE5NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFRocmlmdFRlc3RcWHRydWN0OwordXNlIFRocmlmdFRlc3RcWHRydWN0MjsKK3VzZSBUaHJpZnRUZXN0XE51bWJlcno7Cit1c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKKworY2xhc3MgRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICRidWZzaXplID0gODE5MjsgLy9iaWcgZW5vdWdoIHRvIHJlYWQgYmlnZ2VzdCBzZXJpYWxpemVkIEZpeHR1cmUgYXJnLgorICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddID0KKyAgICAgICAgICAgICJxdW90ZTogXFxcIiBiYWNrc2xhc2g6IiAuCisgICAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIiAuCisgICAgICAgICAgICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiIC4KKyAgICAgICAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXC9cYlxuXHJcdCIgLgorICAgICAgICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCNcJCUmKCkoJiUkI3t9e308Pjw+PCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddID0KKyAgICAgICAgICAgICJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXSA9CisgICAgICAgICAgICAi4Liq4Lin4Lix4Liq4LiU4Li1L/Cdkq8iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddID0gMy4xNDE1OTI2NTM1ODk4OworCisgICAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXSA9IDB4MDE7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coMiwgMzApOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSBwb3coMiwgNjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSAiMTE1MjkyMTUwNDYwNjg0NzAwMCI7CisgICAgICAgIH0KKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdygyLCAzMCksCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QyKAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMTUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA3ID0+IDc3LAorICAgICAgICAgICAgICAgIDggPT4gODgsCisgICAgICAgICAgICAgICAgOSA9PiA5OQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAiYSIgPT4gIjEyMyIsCisgICAgICAgICAgICAgICAgImEgYiIgPT4gIndpdGggc3BhY2VzICIsCisgICAgICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKKyAgICAgICAgICAgICAgICAiMCIgPT4gIm51bWVyaWMga2V5IiwKKyAgICAgICAgICAgICAgICAibG9uZ1ZhbHVlIiA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10sCisgICAgICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U2V0J10gPSBhcnJheSgxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSgxLCAyLCAzKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ10gPSBOdW1iZXJ6OjpPTkU7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA0ID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICAxID0+IDEsCisgICAgICAgICAgICAgICAgICAgIDIgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgMyA9PiAzLAorICAgICAgICAgICAgICAgICAgICA0ID0+IDQsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAtNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgLTQgPT4gLTQsCisgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAorICAgICAgICAgICAgICAgICAgICAtMiA9PiAtMiwKKyAgICAgICAgICAgICAgICAgICAgLTEgPT4gLTEKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQorCisgICAgICAgICR4dHJ1Y3QxID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkeHRydWN0MiA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICR1c2VyTWFwID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpFSUdIVCA9PiA4CisgICAgICAgICAgICApOworCisgICAgICAgICRpbnNhbml0eTIgPQorICAgICAgICAgICAgbmV3IEluc2FuaXR5KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gJHVzZXJNYXAsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0MSwgJHh0cnVjdDIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkzID0gJGluc2FuaXR5MjsKKworICAgICAgICAkaW5zYW5pdHk2ID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+IG51bGwsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBudWxsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgIjEiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUV08gPT4gJGluc2FuaXR5MiwKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIjIiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpTSVggPT4gJGluc2FuaXR5NgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Njg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKQEAgLTAsMCArMSwxMTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxKc29uU2VyaWFsaXplOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2Ugc3RkQ2xhc3M7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBKc29uU2VyaWFsaXplVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNS40JywgJzwnKSkgeworICAgICAgICAgICAgJHRoaXMtPm1hcmtUZXN0U2tpcHBlZCgnUmVxdWlyZXMgUEhQIDUuNCBvciBuZXdlciEnKTsKKyAgICAgICAgfQorICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwanMnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0KCkKKyAgICB7CisgICAgICAgICRlbXB0eSA9IG5ldyBcVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdChhcnJheSgnbm9uX2V4aXN0aW5nX2tleScgPT4gJ2JhcicpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscyhuZXcgc3RkQ2xhc3MoKSwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGVtcHR5KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nc0FuZEludHMoKQorICAgIHsKKyAgICAgICAgJGlucHV0ID0gYXJyYXkoCisgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJywKKyAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDEyMzQ1Njc4OTAsCisgICAgICAgICk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCRpbnB1dCk7CisKKyAgICAgICAgLy8gWHRydWN0J3MgJ2kzMl90aGluZycgYW5kICdieXRlX3RoaW5nJyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGhlcmUhCisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cmluZ190aGluZyA9ICRpbnB1dFsnc3RyaW5nX3RoaW5nJ107CisgICAgICAgICRleHBlY3RlZC0+aTY0X3RoaW5nID0gJGlucHV0WydpNjRfdGhpbmcnXTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRTdHJ1Y3RzKCkKKyAgICB7CisgICAgICAgICR4dHJ1Y3QyID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdDIoYXJyYXkoCisgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNDIsCisgICAgICAgICAgICAnc3RydWN0X3RoaW5nJyA9PiBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KAorICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyMzQ1NiwKKyAgICAgICAgICAgICkpLAorICAgICAgICApKTsKKworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ieXRlX3RoaW5nID0gJHh0cnVjdDItPmJ5dGVfdGhpbmc7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmcgPSAkeHRydWN0Mi0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmc7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0MikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KCkKKyAgICB7CisgICAgICAgICR4aW5wdXQgPSBhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJyk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCR4aW5wdXQpOworICAgICAgICAkaW5zYW5pdHkgPSBuZXcgXFRocmlmdFRlc3RcSW5zYW5pdHkoYXJyYXkoCisgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdCwgJHh0cnVjdCwgJHh0cnVjdCkKKyAgICAgICAgKSk7CisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnh0cnVjdHMgPSBhcnJheSgob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCwgKG9iamVjdCkkeGlucHV0KTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRpbnNhbml0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZExpc3RzKCkKKyAgICB7CisgICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSk7CisgICAgICAgICRuZXN0ZWQgPSBuZXcgXFRocmlmdFRlc3RcTmVzdGVkTGlzdHNCb25rKGFycmF5KCdib25rJyA9PiBhcnJheShhcnJheShhcnJheSgkYm9uaykpKSkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ib25rID0gYXJyYXkoYXJyYXkoYXJyYXkoKG9iamVjdClhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKSkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJG5lc3RlZCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcHMoKQorICAgIHsKKyAgICAgICAgJGludG1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbJ3RoaW5nJyA9PiBbMCA9PiAnemVybyddXSk7CisgICAgICAgICRlbXB0eW1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sidGhpbmciOnsiMCI6Inplcm8ifX0nLCBqc29uX2VuY29kZSgkaW50bWFwKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3t9JywganNvbl9lbmNvZGUoJGVtcHR5bWFwKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTY2FsYXJUeXBlcygpCisgICAgeworICAgICAgICAkYiA9IG5ldyBcVGhyaWZ0VGVzdFxCb29scyhbJ2ltX3RydWUnID0+ICcxJywgJ2ltX2ZhbHNlJyA9PiAnMCddKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJpbV90cnVlIjp0cnVlLCJpbV9mYWxzZSI6ZmFsc2V9JywganNvbl9lbmNvZGUoJGIpKTsKKyAgICAgICAgJHMgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QShbJ3MnID0+IDQyXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sicyI6IjQyIn0nLCBqc29uX2VuY29kZSgkcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODI0Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitQSFBVTklUPXBocCAkKHRvcF9zcmNkaXIpL3ZlbmRvci9iaW4vcGhwdW5pdAorCitzdHViczogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHAKKwkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwlta2RpciAtcCAuL3BhY2thZ2VzL3BocHYKKwlta2RpciAtcCAuL3BhY2thZ2VzL3BocHZvCisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHBqcworCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdiAgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUsb29wIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdm8gIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6anNvbiAgICAgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwanMgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCitkZXBzOiAkKHRvcF9zcmNkaXIpL2NvbXBvc2VyLmpzb24KKwljb21wb3NlciBpbnN0YWxsIC0td29ya2luZy1kaXI9JCh0b3Bfc3JjZGlyKQorCithbGwtbG9jYWw6IGRlcHMKKworY2hlY2stanNvbi1zZXJpYWxpemVyOiBkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1qc29uLXNlcmlhbGl6ZXIueG1sIEpzb25TZXJpYWxpemUvCisKK2NoZWNrLXZhbGlkYXRvcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctdmFsaWRhdG9yLnhtbCBWYWxpZGF0b3IvCisKK2NoZWNrLXByb3RvY29sOglkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1wcm90b2NvbC54bWwgUHJvdG9jb2wvCisKK2NoZWNrOiBkZXBzIHN0dWJzIFwKKyAgY2hlY2stcHJvdG9jb2wgXAorICBjaGVjay12YWxpZGF0b3IgXAorICBjaGVjay1qc29uLXNlcmlhbGl6ZXIKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgLi9wYWNrYWdlcworCSQoUk0pIFRFU1QtKi54bWwKZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjBiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCkBAIC0wLDAgKzEsNjAgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgQmluYXJ5U2VyaWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgdHJ5IHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgYSByYW5kb20gb2JqZWN0IHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uCisgICAgICogQHNlZSBUSFJJRlQtMTU3OQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5U2VyaWFsaXplcigpCisgICAgeworICAgICAgICAkc3RydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnYWJjJykpOworICAgICAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkZGVzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKCRzZXJpYWxpemVkLCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJHN0cnVjdCwgJGRlc2VyaWFsaXplZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKQEAgLTAsMCArMSw3NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKworY2xhc3MgVEpTT05Qcm90b2NvbEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc0pTT04oKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogXC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlXCfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LBcL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ10gPSAneyIxIjp7InN0ciI6InN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcXFxcXCJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPSAneyIxIjp7InN0ciI6IuC4quC4p+C4seC4quC4lOC4tVwv8J2SryJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3siMSI6eyJkYmwiOjMuMTQxNTkyNjUzNTg5OH19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyIxIjp7ImkzMiI6MTA3Mzc0MTgyNH19JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3siMSI6eyJzZXQiOlsiaTMyIiwzLDEsNSw2XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXSA9ICd7IjEiOnsiaTY0Ijo2OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGVjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCkBAIC0wLDAgKzEsNTE4IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBUSlNPTlByb3RvY29sVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0OworICAgIHByaXZhdGUgJHByb3RvY29sOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgJGFjdHVhbCByZXR1cm5zIHVuZXNjYXBlZCBzdHJpbmcuCisgICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRvIHRvIGRlY29kZSB0aGVuIGVuY29kZSBpdCBhZ2FpbgorICAgICAgICAgKiB0byBnZXQgdGhlIGV4cGVjdGVkIGVzY2FwZWQgdW5pY29kZS4KKyAgICAgICAgICovCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2VuY29kZShqc29uX2RlY29kZSgkYWN0dWFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSRUFEIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM1dyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmc0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1SZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBNYXBfcmVzdWx0KCk7CisgICAgICAgICRyZXN1bHQtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHlSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXQorICAgICAgICApOworICAgICAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNjcgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyJ0aGluZyI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7InRoaW5nIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7InRoaW5nIjozLjE0MTU5MjY1MzU4OTh9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyJ0aGluZyI6MTA3Mzc0MTgyNH0nOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ319JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30sImkzMl90aGluZyI6MzI3Njh9fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH0nOworCisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyJ0aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3sidGhpbmciOnsiNyI6NzcsIjgiOjg4LCI5Ijo5OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyJ0aGluZyI6eyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyJ0aGluZyI6WzEsNSw2XX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10gPSAneyJ0aGluZyI6WzEsMiwzXX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyJ0aGluZyI6MX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyJ0aGluZyI6Njl9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGExMzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDI1NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworCisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0VmFsaWRhdG9ycy50aHJpZnQgYi9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIHBocCBUZXN0VmFsaWRhdG9ycworCitpbmNsdWRlICIuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IgorCit1bmlvbiBVbmlvbk9mU3RyaW5ncyB7CisgIDE6IHN0cmluZyBhYTsKKyAgMjogc3RyaW5nIGJiOworfQorCitzZXJ2aWNlIFRlc3RTZXJ2aWNlIHsKKyAgICB2b2lkIHRlc3QoKSB0aHJvd3MoMTogVGhyaWZ0VGVzdC5YY2VwdGlvbiB4Y2VwdGlvbik7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvQmFzZVZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjkwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApAQCAtMCwwICsxLDE1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK2Fic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0VmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJvbmtWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RBVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFVuaW9uT2ZTdHJpbmdzVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xVbmlvbk9mU3RyaW5ncycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2VydmljZVJlc3VsdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFJlYWRFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigiXDAwMCIpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkYm9uay0+cmVhZCgkcHJvdG9jb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICAgICAkdGhpcy0+ZmFpbCgnQm9uayB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKKyAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlV2l0aE1pc3NpbmdSZXF1aXJlZCgpCisgICAgeworICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBub3QgYWJsZSB0byB3cml0ZSBTdHJ1Y3RBIHdpdGggYSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ1N0cnVjdEEgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkU3RydWN0QSgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoYmFzZTY0X2RlY29kZSgnQ3dBQkFBQUFBMkZpWXdBPScpKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOworICAgICAgICAkc3RydWN0YS0+cmVhZCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCJhYmMiLCAkc3RydWN0YS0+cyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnMgPSAiYWJjIjsKKyAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICR3cml0ZVJlc3VsdCA9IGJhc2U2NF9lbmNvZGUoJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCdDd0FCQUFBQUEyRmlZd0E9JywgJHdyaXRlUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgbm90IGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JSZWFkJyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKKworICAgICAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvcldyaXRlJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YzdhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2Jyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0T29wLnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiY2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKy8qKgorICogQ2xhc3MgVGVzdFZhbGlkYXRvcnNPb3AKKyAqIEBwYWNrYWdlIFRlc3RcVGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBWYWxpZGF0b3JUZXN0T29wIGV4dGVuZHMgQmFzZVZhbGlkYXRvclRlc3QKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocHZvJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90aHJpZnRfcHJvdG9jb2wuaW5pIGIvbGliL3BocC90aHJpZnRfcHJvdG9jb2wuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjBkODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3RocmlmdF9wcm90b2NvbC5pbmkKQEAgLTAsMCArMSBAQAorZXh0ZW5zaW9uPXRocmlmdF9wcm90b2NvbC5zbwpkaWZmIC0tZ2l0IGEvbGliL3B5L0NNYWtlTGlzdHMudHh0IGIvbGliL3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjkxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtQWVRIT05fSU5DTFVERV9ESVJTfSkKKworYWRkX2N1c3RvbV90YXJnZXQocHl0aG9uX2J1aWxkIEFMTAorICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gc2V0dXAucHkgYnVpbGQKKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICBDT01NRU5UICJCdWlsZGluZyBQeXRob24gbGlicmFyeSIKKykKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChQeXRob25UZXN0U1NMU29ja2V0ICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5KQorICAgIGFkZF90ZXN0KFB5dGhvblRocmlmdEpzb24gJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvdGhyaWZ0X2pzb24ucHkpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvcHkvTUFOSUZFU1QuaW4gYi9saWIvcHkvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9NQU5JRkVTVC5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlIHNyYy9leHQvKgpkaWZmIC0tZ2l0IGEvbGliL3B5L01ha2VmaWxlLmFtIGIvbGliL3B5L01ha2VmaWxlLmFtCmluZGV4IDZkM2JiZWEuLjU4NjE4NTggMTAwNjQ0Ci0tLSBhL2xpYi9weS9NYWtlZmlsZS5hbQorKysgYi9saWIvcHkvTWFrZWZpbGUuYW0KQEAgLTE2LDExICsxNiwyMSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwotCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiBERVNURElSID89IC8KLUVYVFJBX0RJU1QgPSBzZXR1cC5weSBzcmMKIAotYWxsLWxvY2FsOgoraWYgV0lUSF9QWTMKK3B5My1idWlsZDoKKwkkKFBZVEhPTjMpIHNldHVwLnB5IGJ1aWxkCitweTMtdGVzdDogcHkzLWJ1aWxkCisJJChQWVRIT04zKSB0ZXN0L3RocmlmdF9qc29uLnB5CisJJChQWVRIT04zKSB0ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CitlbHNlCitweTMtYnVpbGQ6CitweTMtdGVzdDoKK2VuZGlmCisKK2FsbC1sb2NhbDogcHkzLWJ1aWxkCiAJJChQWVRIT04pIHNldHVwLnB5IGJ1aWxkCiAKICMgV2UncmUgaWdub3JpbmcgcHJlZml4IGhlcmUgYmVjYXVzZSBzaXRlLXBhY2thZ2VzIHNlZW1zIHRvIGJlCkBAIC0zMyw0ICs0MywxNyBAQAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgYnVpbGQKIAotY2hlY2stbG9jYWw6IGFsbAorY2hlY2stbG9jYWw6IGFsbCBweTMtdGVzdAorCSQoUFlUSE9OKSB0ZXN0L3RocmlmdF9qc29uLnB5CisJJChQWVRIT04pIHRlc3QvdGVzdF9zc2xzb2NrZXQucHkKKworRVhUUkFfRElTVCA9IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJTUFOSUZFU1QuaW4gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWNvbXBhdCBcCisJc2V0dXAucHkgXAorCXNldHVwLmNmZyBcCisJc3JjIFwKKwl0ZXN0IFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9weS9SRUFETUUgYi9saWIvcHkvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcHkvUkVBRE1FCnJlbmFtZSB0byBsaWIvcHkvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcHkvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTYwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDcgQEAKKyMjIFB5dGhvbiBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogQ29kZSBTdHlsZSBmb3IgUHl0aG9uIENvZGUgW1BFUDhdKGh0dHA6Ly9sZWdhY3kucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDAwOC8pCisKK1doZW4gaW4gZG91YnQgLSBjaGVjayB3aXRoIDxodHRwOi8vd3d3LnB5bGludC5vcmcvPiBvciBvbmxpbmUgd2l0aCA8aHR0cDovL3BlcDhvbmxpbmUuY29tPi4KZGlmZiAtLWdpdCBhL2xpYi9weS9jb21wYXQvd2luMzIvc3RkaW50LmggYi9saWIvcHkvY29tcGF0L3dpbjMyL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjYwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvY29tcGF0L3dpbjMyL3N0ZGludC5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLyBJU08gQzl4ICBjb21wbGlhbnQgc3RkaW50LmggZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvCisvLyBCYXNlZCBvbiBJU08vSUVDIDk4OTk6VEMyIENvbW1pdHRlZSBkcmFmdCAoTWF5IDYsIDIwMDUpIFdHMTQvTjExMjQgCisvLyAKKy8vICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBBbGV4YW5kZXIgQ2hlbWVyaXMKKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisvLyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKy8vIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKy8vIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworLy8gT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIAorLy8gV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKy8vIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKy8vIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8gCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZm5kZWYgX01TQ19WRVIgLy8gWworI2Vycm9yICJVc2UgdGhpcyBoZWFkZXIgb25seSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVycyEiCisjZW5kaWYgLy8gX01TQ19WRVIgXQorCisjaWZuZGVmIF9NU0NfU1RESU5UX0hfIC8vIFsKKyNkZWZpbmUgX01TQ19TVERJTlRfSF8KKworI2lmIF9NU0NfVkVSID4gMTAwMAorI3ByYWdtYSBvbmNlCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvLyBGb3IgVmlzdWFsIFN0dWRpbyA2IGluIEMrKyBtb2RlIGFuZCBmb3IgbWFueSBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zIHdoZW4KKy8vIGNvbXBpbGluZyBmb3IgQVJNIHdlIHNob3VsZCB3cmFwIDx3Y2hhci5oPiBpbmNsdWRlIHdpdGggJ2V4dGVybiAiQysrIiB7fScKKy8vIG9yIGNvbXBpbGVyIGdpdmUgbWFueSBlcnJvcnMgbGlrZSB0aGlzOgorLy8gICBlcnJvciBDMjczMzogc2Vjb25kIEMgbGlua2FnZSBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uICd3bWVtY2hyJyBub3QgYWxsb3dlZAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorIyAgaW5jbHVkZSA8d2NoYXIuaD4KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIERlZmluZSBfVzY0IG1hY3JvcyB0byBtYXJrIHR5cGVzIGNoYW5naW5nIHRoZWlyIHNpemUsIGxpa2UgaW50cHRyX3QuCisjaWZuZGVmIF9XNjQKKyMgIGlmICFkZWZpbmVkKF9fbWlkbCkgJiYgKGRlZmluZWQoX1g4Nl8pIHx8IGRlZmluZWQoX01fSVg4NikpICYmIF9NU0NfVkVSID49IDEzMDAKKyMgICAgIGRlZmluZSBfVzY0IF9fdzY0CisjICBlbHNlCisjICAgICBkZWZpbmUgX1c2NAorIyAgZW5kaWYKKyNlbmRpZgorCisKKy8vIDcuMTguMSBJbnRlZ2VyIHR5cGVzCisKKy8vIDcuMTguMS4xIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMKKworLy8gVmlzdWFsIFN0dWRpbyA2IGFuZCBFbWJlZGRlZCBWaXN1YWwgQysrIDQgZG9lc24ndAorLy8gcmVhbGl6ZSB0aGF0LCBlLmcuIGNoYXIgaGFzIHRoZSBzYW1lIHNpemUgYXMgX19pbnQ4CisvLyBzbyB3ZSBnaXZlIHVwIG9uIF9faW50WCBmb3IgdGhlbS4KKyNpZiAoX01TQ19WRVIgPCAxMzAwKQorICAgdHlwZWRlZiBzaWduZWQgY2hhciAgICAgICBpbnQ4X3Q7CisgICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICAgIGludDE2X3Q7CisgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICAgIGludDMyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIHVpbnQ4X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgIHVpbnQxNl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICB1aW50MzJfdDsKKyNlbHNlCisgICB0eXBlZGVmIHNpZ25lZCBfX2ludDggICAgIGludDhfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIF9faW50MTYgICAgaW50MTZfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIF9faW50MzIgICAgaW50MzJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICAgdWludDhfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiAgdWludDE2X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgIHVpbnQzMl90OworI2VuZGlmCit0eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgICAgIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgIHVpbnQ2NF90OworCisKKy8vIDcuMTguMS4yIE1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwordHlwZWRlZiBpbnQ4X3QgICAgaW50X2xlYXN0OF90OwordHlwZWRlZiBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwordHlwZWRlZiB1aW50OF90ICAgdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgdWludDE2X3QgIHVpbnRfbGVhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdCAgdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICB1aW50X2xlYXN0NjRfdDsKKworLy8gNy4xOC4xLjMgRmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKK3R5cGVkZWYgaW50OF90ICAgIGludF9mYXN0OF90OwordHlwZWRlZiBpbnQxNl90ICAgaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnQzMl90ICAgaW50X2Zhc3QzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwordHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICB1aW50X2Zhc3Q2NF90OworCisvLyA3LjE4LjEuNCBJbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2YgaG9sZGluZyBvYmplY3QgcG9pbnRlcnMKKyNpZmRlZiBfV0lONjQgLy8gWworICAgdHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgICBpbnRwdHJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgdWludHB0cl90OworI2Vsc2UgLy8gX1dJTjY0IF1bCisgICB0eXBlZGVmIF9XNjQgc2lnbmVkIGludCAgIGludHB0cl90OworICAgdHlwZWRlZiBfVzY0IHVuc2lnbmVkIGludCB1aW50cHRyX3Q7CisjZW5kaWYgLy8gX1dJTjY0IF0KKworLy8gNy4xOC4xLjUgR3JlYXRlc3Qtd2lkdGggaW50ZWdlciB0eXBlcwordHlwZWRlZiBpbnQ2NF90ICAgaW50bWF4X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICB1aW50bWF4X3Q7CisKKworLy8gNy4xOC4yIExpbWl0cyBvZiBzcGVjaWZpZWQtd2lkdGggaW50ZWdlciB0eXBlcworCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykgLy8gWyAgIFNlZSBmb290bm90ZSAyMjAgYXQgcGFnZSAyNTcgYW5kIGZvb3Rub3RlIDIyMSBhdCBwYWdlIDI1OQorCisvLyA3LjE4LjIuMSBMaW1pdHMgb2YgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlQ4X01JTiAgICAgKChpbnQ4X3QpX0k4X01JTikKKyNkZWZpbmUgSU5UOF9NQVggICAgIF9JOF9NQVgKKyNkZWZpbmUgSU5UMTZfTUlOICAgICgoaW50MTZfdClfSTE2X01JTikKKyNkZWZpbmUgSU5UMTZfTUFYICAgIF9JMTZfTUFYCisjZGVmaW5lIElOVDMyX01JTiAgICAoKGludDMyX3QpX0kzMl9NSU4pCisjZGVmaW5lIElOVDMyX01BWCAgICBfSTMyX01BWAorI2RlZmluZSBJTlQ2NF9NSU4gICAgKChpbnQ2NF90KV9JNjRfTUlOKQorI2RlZmluZSBJTlQ2NF9NQVggICAgX0k2NF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgIF9VSThfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICBfVUkxNl9NQVgKKyNkZWZpbmUgVUlOVDMyX01BWCAgIF9VSTMyX01BWAorI2RlZmluZSBVSU5UNjRfTUFYICAgX1VJNjRfTUFYCisKKy8vIDcuMTguMi4yIExpbWl0cyBvZiBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UX0xFQVNUOF9NSU4gICAgSU5UOF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUOF9NQVggICAgSU5UOF9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICAgSU5UMTZfTUlOCisjZGVmaW5lIElOVF9MRUFTVDE2X01BWCAgIElOVDE2X01BWAorI2RlZmluZSBJTlRfTEVBU1QzMl9NSU4gICBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUFYICAgSU5UMzJfTUFYCisjZGVmaW5lIElOVF9MRUFTVDY0X01JTiAgIElOVDY0X01JTgorI2RlZmluZSBJTlRfTEVBU1Q2NF9NQVggICBJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDhfTUFYICAgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCAgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UX0xFQVNUNjRfTUFYICBVSU5UNjRfTUFYCisKKy8vIDcuMTguMi4zIExpbWl0cyBvZiBmYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlRfRkFTVDhfTUlOICAgIElOVDhfTUlOCisjZGVmaW5lIElOVF9GQVNUOF9NQVggICAgSU5UOF9NQVgKKyNkZWZpbmUgSU5UX0ZBU1QxNl9NSU4gICBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UX0ZBU1QxNl9NQVggICBJTlQxNl9NQVgKKyNkZWZpbmUgSU5UX0ZBU1QzMl9NSU4gICBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UX0ZBU1QzMl9NQVggICBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4gICBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q2NF9NQVggICBJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUOF9NQVggICBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMTZfTUFYICBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDMyX01BWCAgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UX0ZBU1Q2NF9NQVggIFVJTlQ2NF9NQVgKKworLy8gNy4xOC4yLjQgTGltaXRzIG9mIGludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBob2xkaW5nIG9iamVjdCBwb2ludGVycworI2lmZGVmIF9XSU42NCAvLyBbCisjICBkZWZpbmUgSU5UUFRSX01JTiAgIElOVDY0X01JTgorIyAgZGVmaW5lIElOVFBUUl9NQVggICBJTlQ2NF9NQVgKKyMgIGRlZmluZSBVSU5UUFRSX01BWCAgVUlOVDY0X01BWAorI2Vsc2UgLy8gX1dJTjY0IF1bCisjICBkZWZpbmUgSU5UUFRSX01JTiAgIElOVDMyX01JTgorIyAgZGVmaW5lIElOVFBUUl9NQVggICBJTlQzMl9NQVgKKyMgIGRlZmluZSBVSU5UUFRSX01BWCAgVUlOVDMyX01BWAorI2VuZGlmIC8vIF9XSU42NCBdCisKKy8vIDcuMTguMi41IExpbWl0cyBvZiBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVE1BWF9NSU4gICBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UTUFYX01BWCAgIElOVDY0X01BWAorI2RlZmluZSBVSU5UTUFYX01BWCAgVUlOVDY0X01BWAorCisvLyA3LjE4LjMgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMKKworI2lmZGVmIF9XSU42NCAvLyBbCisjICBkZWZpbmUgUFRSRElGRl9NSU4gIF9JNjRfTUlOCisjICBkZWZpbmUgUFRSRElGRl9NQVggIF9JNjRfTUFYCisjZWxzZSAgLy8gX1dJTjY0IF1bCisjICBkZWZpbmUgUFRSRElGRl9NSU4gIF9JMzJfTUlOCisjICBkZWZpbmUgUFRSRElGRl9NQVggIF9JMzJfTUFYCisjZW5kaWYgIC8vIF9XSU42NCBdCisKKyNkZWZpbmUgU0lHX0FUT01JQ19NSU4gIElOVF9NSU4KKyNkZWZpbmUgU0lHX0FUT01JQ19NQVggIElOVF9NQVgKKworI2lmbmRlZiBTSVpFX01BWCAvLyBbCisjICBpZmRlZiBfV0lONjQgLy8gWworIyAgICAgZGVmaW5lIFNJWkVfTUFYICBfVUk2NF9NQVgKKyMgIGVsc2UgLy8gX1dJTjY0IF1bCisjICAgICBkZWZpbmUgU0laRV9NQVggIF9VSTMyX01BWAorIyAgZW5kaWYgLy8gX1dJTjY0IF0KKyNlbmRpZiAvLyBTSVpFX01BWCBdCisKKy8vIFdDSEFSX01JTiBhbmQgV0NIQVJfTUFYIGFyZSBhbHNvIGRlZmluZWQgaW4gPHdjaGFyLmg+CisjaWZuZGVmIFdDSEFSX01JTiAvLyBbCisjICBkZWZpbmUgV0NIQVJfTUlOICAwCisjZW5kaWYgIC8vIFdDSEFSX01JTiBdCisjaWZuZGVmIFdDSEFSX01BWCAvLyBbCisjICBkZWZpbmUgV0NIQVJfTUFYICBfVUkxNl9NQVgKKyNlbmRpZiAgLy8gV0NIQVJfTUFYIF0KKworI2RlZmluZSBXSU5UX01JTiAgMAorI2RlZmluZSBXSU5UX01BWCAgX1VJMTZfTUFYCisKKyNlbmRpZiAvLyBfX1NURENfTElNSVRfTUFDUk9TIF0KKworCisvLyA3LjE4LjQgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19DT05TVEFOVF9NQUNST1MpIC8vIFsgICBTZWUgZm9vdG5vdGUgMjI0IGF0IHBhZ2UgMjYwCisKKy8vIDcuMTguNC4xIE1hY3JvcyBmb3IgbWluaW11bS13aWR0aCBpbnRlZ2VyIGNvbnN0YW50cworCisjZGVmaW5lIElOVDhfQyh2YWwpICB2YWwjI2k4CisjZGVmaW5lIElOVDE2X0ModmFsKSB2YWwjI2kxNgorI2RlZmluZSBJTlQzMl9DKHZhbCkgdmFsIyNpMzIKKyNkZWZpbmUgSU5UNjRfQyh2YWwpIHZhbCMjaTY0CisKKyNkZWZpbmUgVUlOVDhfQyh2YWwpICB2YWwjI3VpOAorI2RlZmluZSBVSU5UMTZfQyh2YWwpIHZhbCMjdWkxNgorI2RlZmluZSBVSU5UMzJfQyh2YWwpIHZhbCMjdWkzMgorI2RlZmluZSBVSU5UNjRfQyh2YWwpIHZhbCMjdWk2NAorCisvLyA3LjE4LjQuMiBNYWNyb3MgZm9yIGdyZWF0ZXN0LXdpZHRoIGludGVnZXIgY29uc3RhbnRzCisjZGVmaW5lIElOVE1BWF9DICAgSU5UNjRfQworI2RlZmluZSBVSU5UTUFYX0MgIFVJTlQ2NF9DCisKKyNlbmRpZiAvLyBfX1NURENfQ09OU1RBTlRfTUFDUk9TIF0KKworCisjZW5kaWYgLy8gX01TQ19TVERJTlRfSF8gXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLmNmZyBiL2xpYi9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZDBhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zZXR1cC5jZmcKQEAgLTAsMCArMSw2IEBACitbaW5zdGFsbF0KK29wdGltaXplID0gMQorW21ldGFkYXRhXQorZGVzY3JpcHRpb24tZmlsZSA9IFJFQURNRS5tZAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLnB5IGIvbGliL3B5L3NldHVwLnB5CmluZGV4IGQxMTFiYjEuLjNjZjE0NjkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zZXR1cC5weQorKysgYi9saWIvcHkvc2V0dXAucHkKQEAgLTE5LDI2ICsxOSwxMjEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2V4Y2VwdCBFeGNlcHRpb246CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogCi1mYXN0YmluYXJ5bW9kID0gRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgPSBbJ3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMnXSwKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorCisjIEZpeCB0byBidWlsZCBzZGlzdCB1bmRlciB2YWdyYW50CitpbXBvcnQgb3MKK2lmICd2YWdyYW50JyBpbiBzdHIob3MuZW52aXJvbik6CisgICAgdHJ5OgorICAgICAgICBkZWwgb3MubGluaworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworCitpbmNsdWRlX2RpcnMgPSBbJ3NyYyddCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICBpbmNsdWRlX2RpcnMuYXBwZW5kKCdjb21wYXQvd2luMzInKQorICAgIGV4dF9lcnJvcnMgPSAoQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgSU9FcnJvcikKK2Vsc2U6CisgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKQorCisKK2NsYXNzIEJ1aWxkRmFpbGVkKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIHZlX2J1aWxkX2V4dChidWlsZF9leHQpOgorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1aWxkX2V4dC5ydW4oc2VsZikKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CisgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCisKKyAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQorICAgICAgICBleGNlcHQgZXh0X2Vycm9yczoKKyAgICAgICAgICAgIHJhaXNlIEJ1aWxkRmFpbGVkKCkKKworCitkZWYgcnVuX3NldHVwKHdpdGhfYmluYXJ5KToKKyAgICBpZiB3aXRoX2JpbmFyeToKKyAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoCisgICAgICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9WworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvbW9kdWxlLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC90eXBlcy5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvYmluYXJ5LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC9jb21wYWN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBjbWRjbGFzcz1kaWN0KGJ1aWxkX2V4dD12ZV9idWlsZF9leHQpCisgICAgICAgICkKKyAgICBlbHNlOgorICAgICAgICBleHRlbnNpb25zID0gZGljdCgpCiAKLXNldHVwKG5hbWUgPSAnVGhyaWZ0JywKLSAgICAgIHZlcnNpb24gPSAnMC4xJywKLSAgICAgIGRlc2NyaXB0aW9uID0gJ1RocmlmdCBQeXRob24gTGlicmFyaWVzJywKLSAgICAgIGF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXSwKLSAgICAgIGF1dGhvcl9lbWFpbCA9IFsndGhyaWZ0LWRldkBpbmN1YmF0b3IuYXBhY2hlLm9yZyddLAotICAgICAgdXJsID0gJ2h0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy90aHJpZnQvJywKLSAgICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICAgIHBhY2thZ2VzID0gWwotICAgICAgICAndGhyaWZ0JywKLSAgICAgICAgJ3RocmlmdC5wcm90b2NvbCcsCi0gICAgICAgICd0aHJpZnQudHJhbnNwb3J0JywKLSAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAotICAgICAgXSwKLSAgICAgIHBhY2thZ2VfZGlyID0geyd0aHJpZnQnIDogJ3NyYyd9LAotICAgICAgZXh0X21vZHVsZXMgPSBbZmFzdGJpbmFyeW1vZF0sCi0gICAgICApCisgICAgc3NsX2RlcHMgPSBbXQorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdpcGFkZHJlc3MnKQorICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDAwMDoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lPj0zLjUnKQorICAgIHRvcm5hZG9fZGVwcyA9IFsndG9ybmFkbz49NC4wJ10KKyAgICB0d2lzdGVkX2RlcHMgPSBbJ3R3aXN0ZWQnXQogCisgICAgc2V0dXAobmFtZT0ndGhyaWZ0JywKKyAgICAgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCisgICAgICAgICAgYXV0aG9yPSdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnLAorICAgICAgICAgIGF1dGhvcl9lbWFpbD0nZGV2QHRocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPVsnc2l4Pj0xLjcuMiddLAorICAgICAgICAgIGV4dHJhc19yZXF1aXJlPXsKKyAgICAgICAgICAgICAgJ3NzbCc6IHNzbF9kZXBzLAorICAgICAgICAgICAgICAndG9ybmFkbyc6IHRvcm5hZG9fZGVwcywKKyAgICAgICAgICAgICAgJ3R3aXN0ZWQnOiB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgICAgICdhbGwnOiBzc2xfZGVwcyArIHRvcm5hZG9fZGVwcyArIHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICB9LAorICAgICAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAgICAgJ3RocmlmdCcsCisgICAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAorICAgICAgICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCisgICAgICAgICAgICAgICd0aHJpZnQuc2VydmVyJywKKyAgICAgICAgICBdLAorICAgICAgICAgIHBhY2thZ2VfZGlyPXsndGhyaWZ0JzogJ3NyYyd9LAorICAgICAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICAgICAgXSwKKyAgICAgICAgICB6aXBfc2FmZT1GYWxzZSwKKyAgICAgICAgICAqKmV4dGVuc2lvbnMKKyAgICAgICAgICApCisKKwordHJ5OgorICAgIHdpdGhfYmluYXJ5ID0gVHJ1ZQorICAgIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSkKK2V4Y2VwdCBCdWlsZEZhaWxlZDoKKyAgICBwcmludCgpCisgICAgcHJpbnQoJyonICogODApCisgICAgcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjb21waWxlIHdpdGggdGhlIEMgZXh0ZW5zaW9uIGVuYWJsZWQiKQorICAgIHByaW50KCJBdHRlbXB0aW5nIHRvIGJ1aWxkIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBub3ciKQorICAgIHByaW50KCcqJyAqIDgwKQorICAgIHByaW50KCkKKworICAgIHJ1bl9zZXR1cChGYWxzZSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5IGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbERlY29yYXRvciwgVE11bHRpcGxleGVkUHJvdG9jb2wKKworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoVFByb2Nlc3Nvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZpY2VzID0ge30KKworICAgIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgaWYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCBhbmQgdHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleGVkIHByb3RvY29sIG9ubHkgc3VwcG9ydHMgQ0FMTCAmIE9ORVdBWSIpCisKKyAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKworICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KKyAgICAgICAgY2FsbCA9IG5hbWVbaW5kZXggKyBsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCisgICAgICAgIGlmIHNlcnZpY2VOYW1lIG5vdCBpbiBzZWxmLnNlcnZpY2VzOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpCisKKyAgICAgICAgc3RhbmRhcmRNZXNzYWdlID0gKGNhbGwsIHR5cGUsIHNlcWlkKQorICAgICAgICByZXR1cm4gc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0ucHJvY2VzcyhTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KQorCisKK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6CisgICAgICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZUJlZ2luCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpAQCAtMCwwICsxLDgzIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUKKworVFlQRV9JRFggPSAxCitTUEVDX0FSR1NfSURYID0gMworU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFggPSAwCitTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYID0gMQorCisKK2RlZiBmaXhfc3BlYyhhbGxfc3RydWN0cyk6CisgICAgIiIiV2lyZSB1cCByZWN1cnNpdmUgcmVmZXJlbmNlcyBmb3IgYWxsIFRTdHJ1Y3QgZGVmaW5pdGlvbnMgaW5zaWRlIG9mIGVhY2ggdGhyaWZ0X3NwZWMuIiIiCisgICAgZm9yIHN0cnVjIGluIGFsbF9zdHJ1Y3RzOgorICAgICAgICBzcGVjID0gc3RydWMudGhyaWZ0X3NwZWMKKyAgICAgICAgZm9yIHRocmlmdF9zcGVjIGluIHNwZWM6CisgICAgICAgICAgICBpZiB0aHJpZnRfc3BlYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgb3RoZXIgPSB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWF0udGhyaWZ0X3NwZWMKKyAgICAgICAgICAgICAgICB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYXSA9IG90aGVyCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgIF9maXhfbWFwKHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorCisKK2RlZiBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBsaXN0IG9yIHNldCwgdGhlIHRocmlmdF9zcGVjIGVudHJ5IGxvb2tzIGxpa2UsCisgICAgIyAoMSwgVFR5cGUuTElTVCwgJ2xpc3RlcicsIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpLCBOb25lLCApLCAgIyAxCisgICAgIyBzbyBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKQorICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworCitkZWYgX2ZpeF9tYXAoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gdmFsdWUgdHlwZSwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULCBbUmVjTWFwQmFzaWMsIE5vbmVdLCBGYWxzZSksIE5vbmUsICkKKyAgICAjIHdoaWNoIGlzIGp1c3QgYSBub3JtYWwgc3RydWN0IGRlZmluaXRpb24uCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBsaXN0IC8gc2V0LCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5MSVNULCAoVFR5cGUuU1RSVUNULCBbUmVjTWFwTGlzdCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSAzcmQgZWxlbWVudCBhcyBhIGxpc3QuCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBtYXAsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLk1BUCwgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULAorICAgICMgIFtSZWNNYXBNYXAsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIG5lZWQgdG8gcHJvY2VzcyAzcmQgZWxlbWVudCBhcyBhIG1hcC4KKworICAgICMgSXMgdGhlIG1hcCBrZXkgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisgICAgIyBJcyB0aGUgbWFwIHZhbHVlIGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVszXVsxXSA9IGVsZW1lbnRfdHlwZVszXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzJdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVszXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVszXSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFNDb25zLnB5IGIvbGliL3B5L3NyYy9UU0NvbnMucHkKaW5kZXggMjQwNDYyNS4uYmM2N2Q3MCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU0NvbnMucHkKKysrIGIvbGliL3B5L3NyYy9UU0NvbnMucHkKQEAgLTE5LDE1ICsxOSwxOCBAQAogCiBmcm9tIG9zIGltcG9ydCBwYXRoCiBmcm9tIFNDb25zLkJ1aWxkZXIgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBtYXAKKwogCiBkZWYgc2NvbnNfZW52KGVudiwgYWRkPScnKToKLSAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCi0gIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCi0gIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb24gPSBsc3RyKQotICBlbnYuQXBwZW5kKEJVSUxERVJTID0geydUaHJpZnRDcHAnIDogY3BwYnVpbGR9KQorICAgIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQorICAgIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCisgICAgY3BwYnVpbGQgPSBCdWlsZGVyKGFjdGlvbj1sc3RyKQorICAgIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCisKIAogZGVmIGdlbl9jcHAoZW52LCBkaXIsIGZpbGUpOgotICBzY29uc19lbnYoZW52KQotICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCi0gIHRhcmdldHMgPSBtYXAobGFtYmRhIHM6ICdnZW4tY3BwLycgKyBmaWxlICsgcywgc3VmZml4ZXMpCi0gIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpcitmaWxlKycudGhyaWZ0JykKKyAgICBzY29uc19lbnYoZW52KQorICAgIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KKyAgICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQorICAgIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5IGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQppbmRleCBiMTlmOThhLi5mYmJlNzY4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CisrKyBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKQEAgLTE3LDE4ICsxNywyMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBwcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSAucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSAudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKLWRlZiBzZXJpYWxpemUodGhyaWZ0X29iamVjdCwgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOgorCitkZWYgc2VyaWFsaXplKHRocmlmdF9vYmplY3QsCisgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIHRocmlmdF9vYmplY3Qud3JpdGUocHJvdG9jb2wpCiAgICAgcmV0dXJuIHRyYW5zcG9ydC5nZXR2YWx1ZSgpCiAKLWRlZiBkZXNlcmlhbGl6ZShiYXNlLCBidWYsIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKToKKworZGVmIGRlc2VyaWFsaXplKGJhc2UsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGJ1ZikKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIGJhc2UucmVhZChwcm90b2NvbCkKICAgICByZXR1cm4gYmFzZQotCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RUb3JuYWRvLnB5IGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpAQCAtMCwwICsxLDE4OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHNvY2tldAoraW1wb3J0IHN0cnVjdAorCitmcm9tIC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFRyYW5zcG9ydEJhc2UsIFRNZW1vcnlCdWZmZXIKKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKK2Zyb20gdG9ybmFkbyBpbXBvcnQgZ2VuLCBpb3N0cmVhbSwgaW9sb29wLCB0Y3BzZXJ2ZXIsIGNvbmN1cnJlbnQKKworX19hbGxfXyA9IFsnVFRvcm5hZG9TZXJ2ZXInLCAnVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQnXQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitjbGFzcyBfTG9jayhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fd2FpdGVycyA9IGRlcXVlKCkKKworICAgIGRlZiBhY3F1aXJlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl93YWl0ZXJzKSA+IDAKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGFjcXVpcmUoc2VsZik6CisgICAgICAgIGJsb2NrZXIgPSBzZWxmLl93YWl0ZXJzWy0xXSBpZiBzZWxmLmFjcXVpcmVkKCkgZWxzZSBOb25lCisgICAgICAgIGZ1dHVyZSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkKKyAgICAgICAgc2VsZi5fd2FpdGVycy5hcHBlbmQoZnV0dXJlKQorICAgICAgICBpZiBibG9ja2VyOgorICAgICAgICAgICAgeWllbGQgYmxvY2tlcgorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZi5fbG9ja19jb250ZXh0KCkpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYWNxdWlyZWQoKSwgJ0xvY2sgbm90IGFxdWlyZWQnCisgICAgICAgIGZ1dHVyZSA9IHNlbGYuX3dhaXRlcnMucG9wbGVmdCgpCisgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KE5vbmUpCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX2xvY2tfY29udGV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKworY2xhc3MgVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgorICAgICIiImEgZnJhbWVkLCBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciBhIFRvcm5hZG8gc3RyZWFtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmVhbT1Ob25lLCBpb19sb29wPU5vbmUpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5pb19sb29wID0gaW9fbG9vcCBvciBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9yZWFkX2xvY2sgPSBfTG9jaygpCisKKyAgICAgICAgIyBzZXJ2ZXJzIHByb3ZpZGUgYSByZWFkeS10by1nbyBzdHJlYW0KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiB3aXRoX3RpbWVvdXQoc2VsZiwgdGltZW91dCwgZnV0dXJlKToKKyAgICAgICAgcmV0dXJuIGdlbi53aXRoX3RpbWVvdXQodGltZW91dCwgZnV0dXJlLCBzZWxmLmlvX2xvb3ApCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiBvcGVuKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGxvZ2dlci5kZWJ1Zygnc29ja2V0IGNvbm5lY3RpbmcnKQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICBzZWxmLnN0cmVhbSA9IGlvc3RyZWFtLklPU3RyZWFtKHNvY2spCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubmVjdCA9IHNlbGYuc3RyZWFtLmNvbm5lY3QoKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi53aXRoX3RpbWVvdXQodGltZW91dCwgY29ubmVjdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgY29ubmVjdAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvciwgaW9sb29wLlRpbWVvdXRFcnJvcikgYXMgZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnY291bGQgbm90IGNvbm5lY3QgdG8ge306e30gKHt9KScuZm9ybWF0KHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBlKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZikKKworICAgIGRlZiBzZXRfY2xvc2VfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIG9wZW4oKSByZXR1cm5zCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbS5zZXRfY2xvc2VfY2FsbGJhY2soY2FsbGJhY2spCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgZG9uJ3QgcmFpc2UgaWYgd2UgaW50ZW5kIHRvIGNsb3NlCisgICAgICAgIHNlbGYuc3RyZWFtLnNldF9jbG9zZV9jYWxsYmFjayhOb25lKQorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBfKToKKyAgICAgICAgIyBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9yIFRvcm5hZG8gc2hvdWxkbid0IGRvIGluZGl2aWR1YWwgcmVhZHMgLS0gb25seQorICAgICAgICAjIGZyYW1lcyBhdCBhIHRpbWUKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAieW91J3JlIGRvaW5nIGl0IHdyb25nIgorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIGlvX2V4Y2VwdGlvbl9jb250ZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorICAgICAgICBleGNlcHQgaW9zdHJlYW0uU3RyZWFtQnVmZmVyRnVsbEVycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICAjIElPU3RyZWFtIHByb2Nlc3NlcyByZWFkcyBvbmUgYXQgYSB0aW1lCisgICAgICAgIHdpdGggKHlpZWxkIHNlbGYuX3JlYWRfbG9jay5hY3F1aXJlKCkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICAgICAgZnJhbWVfaGVhZGVyID0geWllbGQgc2VsZi5zdHJlYW0ucmVhZF9ieXRlcyg0KQorICAgICAgICAgICAgICAgIGlmIGxlbihmcmFtZV9oZWFkZXIpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGlvc3RyZWFtLlN0cmVhbUNsb3NlZEVycm9yKCdSZWFkIHplcm8gYnl0ZXMgZnJvbSBzdHJlYW0nKQorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIGZyYW1lX2hlYWRlcikKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHNlbGYuc3RyZWFtLnJlYWRfYnl0ZXMoZnJhbWVfbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oZnJhbWUpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBmcmFtZSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgZnJhbWVfbGVuZ3RoID0gc3RydWN0LnBhY2soJyFpJywgbGVuKGZyYW1lKSkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJlYW0ud3JpdGUoZnJhbWVfbGVuZ3RoICsgZnJhbWUpCisKKworY2xhc3MgVFRvcm5hZG9TZXJ2ZXIodGNwc2VydmVyLlRDUFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihUVG9ybmFkb1NlcnZlciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHNlbGYuX3Byb2Nlc3NvciA9IHByb2Nlc3NvcgorICAgICAgICBzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeQorICAgICAgICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaXByb3RfZmFjdG9yeSkKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGhhbmRsZV9zdHJlYW0oc2VsZiwgc3RyZWFtLCBhZGRyZXNzKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IGFkZHJlc3NbOjJdCisgICAgICAgIHRyYW5zID0gVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoaG9zdD1ob3N0LCBwb3J0PXBvcnQsIHN0cmVhbT1zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIG9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3QgdHJhbnMuc3RyZWFtLmNsb3NlZCgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCB0cmFucy5yZWFkRnJhbWUoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgdHIgPSBUTWVtb3J5QnVmZmVyKGZyYW1lKQorICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLl9wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCd0aHJpZnQgZXhjZXB0aW9uIGluIGhhbmRsZV9zdHJlYW0nKQorICAgICAgICAgICAgdHJhbnMuY2xvc2UoKQorCisgICAgICAgIGxvZ2dlci5pbmZvKCdjbGllbnQgZGlzY29ubmVjdGVkICVzOiVkJywgaG9zdCwgcG9ydCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5IGIvbGliL3B5L3NyYy9UaHJpZnQucHkKaW5kZXggNWYyNTY0ZC4uMDA5NDFkOCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UaHJpZnQucHkKKysrIGIvbGliL3B5L3NyYy9UaHJpZnQucHkKQEAgLTE5LDExNSArMTksMTc0IEBACiAKIGltcG9ydCBzeXMKIAotY2xhc3MgVFR5cGU6Ci0gIFNUT1AgICA9IDAKLSAgVk9JRCAgID0gMQotICBCT09MICAgPSAyCi0gIEJZVEUgICA9IDMKLSAgSTA4ICAgID0gMwotICBET1VCTEUgPSA0Ci0gIEkxNiAgICA9IDYKLSAgSTMyICAgID0gOAotICBJNjQgICAgPSAxMAotICBTVFJJTkcgPSAxMQotICBVVEY3ICAgPSAxMQotICBTVFJVQ1QgPSAxMgotICBNQVAgICAgPSAxMwotICBTRVQgICAgPSAxNAotICBMSVNUICAgPSAxNQotICBVVEY4ICAgPSAxNgotICBVVEYxNiAgPSAxNwogCi1jbGFzcyBUTWVzc2FnZVR5cGU6Ci0gIENBTEwgID0gMQotICBSRVBMWSA9IDIKLSAgRVhDRVBUSU9OID0gMwotICBPTkVXQVkgPSA0CitjbGFzcyBUVHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAwCisgICAgVk9JRCA9IDEKKyAgICBCT09MID0gMgorICAgIEJZVEUgPSAzCisgICAgSTA4ID0gMworICAgIERPVUJMRSA9IDQKKyAgICBJMTYgPSA2CisgICAgSTMyID0gOAorICAgIEk2NCA9IDEwCisgICAgU1RSSU5HID0gMTEKKyAgICBVVEY3ID0gMTEKKyAgICBTVFJVQ1QgPSAxMgorICAgIE1BUCA9IDEzCisgICAgU0VUID0gMTQKKyAgICBMSVNUID0gMTUKKyAgICBVVEY4ID0gMTYKKyAgICBVVEYxNiA9IDE3CiAKLWNsYXNzIFRQcm9jZXNzb3I6CisgICAgX1ZBTFVFU19UT19OQU1FUyA9ICgKKyAgICAgICAgJ1NUT1AnLAorICAgICAgICAnVk9JRCcsCisgICAgICAgICdCT09MJywKKyAgICAgICAgJ0JZVEUnLAorICAgICAgICAnRE9VQkxFJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kxNicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMzInLAorICAgICAgICBOb25lLAorICAgICAgICAnSTY0JywKKyAgICAgICAgJ1NUUklORycsCisgICAgICAgICdTVFJVQ1QnLAorICAgICAgICAnTUFQJywKKyAgICAgICAgJ1NFVCcsCisgICAgICAgICdMSVNUJywKKyAgICAgICAgJ1VURjgnLAorICAgICAgICAnVVRGMTYnLAorICAgICkKIAotICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jc2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKIAotICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpOgotICAgIHBhc3MKK2NsYXNzIFRNZXNzYWdlVHlwZShvYmplY3QpOgorICAgIENBTEwgPSAxCisgICAgUkVQTFkgPSAyCisgICAgRVhDRVBUSU9OID0gMworICAgIE9ORVdBWSA9IDQKKworCitjbGFzcyBUUHJvY2Vzc29yKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBURXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKKyAgICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCisgICAgaWYgKDIsIDYsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQogCi0gICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKLSAgaWYgKDIsNiwwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsMCk6Ci0gICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKLQkgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotCSAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQotICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKKyAgICAgICAgZGVmIF9zZXRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKIAotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKLSAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKIAogY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIFVOS05PV04gPSAwCi0gIFVOS05PV05fTUVUSE9EID0gMQotICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIKLSAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCi0gIEJBRF9TRVFVRU5DRV9JRCA9IDQKLSAgTUlTU0lOR19SRVNVTFQgPSA1CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIGlmIHNlbGYubWVzc2FnZToKLSAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2UKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBVTktOT1dOX01FVEhPRDoKLSAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gSU5WQUxJRF9NRVNTQUdFX1RZUEU6Ci0gICAgICByZXR1cm4gJ0ludmFsaWQgbWVzc2FnZSB0eXBlJwotICAgIGVsaWYgc2VsZi50eXBlID09IFdST05HX01FVEhPRF9OQU1FOgotICAgICAgcmV0dXJuICdXcm9uZyBtZXRob2QgbmFtZScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBCQURfU0VRVUVOQ0VfSUQ6Ci0gICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBNSVNTSU5HX1JFU1VMVDoKLSAgICAgIHJldHVybiAnTWlzc2luZyByZXN1bHQnCi0gICAgZWxzZToKLSAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwotCi0gIGRlZiByZWFkKHNlbGYsIGlwcm90KToKLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIGlmIGZpZCA9PSAxOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1lc3NhZ2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5LTk9XTl9NRVRIT0Q6CisgICAgICAgICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfTUVTU0FHRV9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKKyAgICAgICAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuQkFEX1NFUVVFTkNFX0lEOgorICAgICAgICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuTUlTU0lOR19SRVNVTFQ6CisgICAgICAgICAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5QUk9UT0NPTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9UUkFOU0ZPUk06CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0w6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJwogICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbGlmIGZpZCA9PSAyOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi50eXBlID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbHNlOgotICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKLSAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwogCi0gIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKLSAgICBpZiBzZWxmLm1lc3NhZ2UgIT0gTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKLSAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIGlmIHNlbGYudHlwZSAhPSBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQotICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZmlkID09IDE6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgICAgICAgIGlmIHNlbGYubWVzc2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKworY2xhc3MgVEZyb3plbkRpY3QoZGljdCk6CisgICAgIiIiQSBkaWN0aW9uYXJ5IHRoYXQgaXMgImZyb3plbiIgbGlrZSBhIGZyb3plbnNldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRGcm96ZW5EaWN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICMgU29ydCB0aGUgaXRlbXMgc28gdGhleSB3aWxsIGJlIGluIGEgY29uc2lzdGVudCBvcmRlci4KKyAgICAgICAgIyBYT1IgaW4gdGhlIGhhc2ggb2YgdGhlIGNsYXNzIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aAorICAgICAgICAjIHRoZSBoYXNoIG9mIGEgbGlzdCBvZiB0dXBsZXMuCisgICAgICAgIHNlbGYuX19oYXNodmFsID0gaGFzaChURnJvemVuRGljdCkgXiBoYXNoKHR1cGxlKHNvcnRlZChzZWxmLml0ZW1zKCkpKSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBURnJlZXphYmxlRGljdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2h2YWwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvY29tcGF0LnB5IGIvbGliL3B5L3NyYy9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvY29tcGF0LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBCdWZmZXJJTworCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHN0cl92YWwKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBvcmQoYnl0ZXNfdmFsW2ldKQorCitlbHNlOgorCisgICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBCdWZmZXJJTyAgIyBub3FhCisKKyAgICBkZWYgYmluYXJ5X3RvX3N0cihiaW5fdmFsKToKKyAgICAgICAgcmV0dXJuIGJpbl92YWwuZGVjb2RlKCd1dGY4JykKKworICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgorICAgICAgICByZXR1cm4gYnl0ZXMoc3RyX3ZhbCwgJ3V0ZjgnKQorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3ZhbFtpXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcCBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2JpbmFyeS5oIgorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2Jvb2wgQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpIHsKKyAgdWludDhfdCBiID0gMDsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gcmVhZEkxNih0YWcpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmggYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQklOQVJZX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0JJTkFSWV9ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJleHQvZW5kaWFuLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjbGFzcyBCaW5hcnlQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8QmluYXJ5UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QmluYXJ5UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCBzaXplb2YoaW50OF90KSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7CisgICAgaW50MTZfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihodG9ucyh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDE2X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsKKyAgICBpbnQzMl90IG5ldCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGh0b25sKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50MzJfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeworICAgIGludDY0X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaHRvbmxsKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgLy8gVW5mb3J0dW5hdGVseSwgYml0d2lzZV9jYXN0IGRvZXNuJ3Qgd29yayBpbiBDLiAgQmFkIEMhCisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gZHViOworICAgIHdyaXRlSTY0KHRyYW5zZmVyLnQpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYpKTsgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoUHlPYmplY3QqIHZhbHVlLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlSTMyKGxlbik7CisgICAgd3JpdGVCdWZmZXIoUHlCeXRlc19BU19TVFJJTkcodmFsdWUpLCBsZW4pOworICB9CisKKyAgYm9vbCB3cml0ZUxpc3RCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IFNldExpc3RUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5lbGVtZW50X3R5cGUpOworICAgIHdyaXRlSTMyKGxlbik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5rdGFnKTsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy52dGFnKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZVN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlU3RydWN0RW5kKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlRmllbGQoUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTdHJ1Y3RJdGVtU3BlYyYgcGFyc2Vkc3BlYykgeworICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihwYXJzZWRzcGVjLnR5cGUpKTsKKyAgICB3cml0ZUkxNihwYXJzZWRzcGVjLnRhZyk7CisgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFRfU1RPUCkpOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDE2X3QpKTsKKyAgICB2YWwgPSBudG9ocyh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQzMl90KSk7CisgICAgdmFsID0gbnRvaGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEk2NChpbnQ2NF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDY0X3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHZhbCA9IG50b2hsbCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGlmICghcmVhZEk2NCh0cmFuc2Zlci5mKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgaWYgKCFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSB8fCAhcmVhZEJ5dGVzKGJ1ZiwgbGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBldHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgYiA9IDA7CisgICAgaWYgKCFyZWFkQnl0ZShiKSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oYik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrdHlwZSwgVFR5cGUmIHZ0eXBlKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgdWludDhfdCBrLCB2OworICAgIGlmICghcmVhZEJ5dGUoaykgfHwgIXJlYWRCeXRlKHYpIHx8ICFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBrdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihrKTsKKyAgICB2dHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPih2KTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgYm9vbCByZWFkU3RydWN0QmVnaW4oKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpOworCisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgYm9vbCBza2lwQm9vbCgpIHsgU0tJUEJZVEVTKDEpOyB9CisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBJMTYoKSB7IFNLSVBCWVRFUygyKTsgfQorICBib29sIHNraXBJMzIoKSB7IFNLSVBCWVRFUyg0KTsgfQorICBib29sIHNraXBJNjQoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkSTMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0JJTkFSWV9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcCBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTk5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2NvbXBhY3QuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NvbnN0IHVpbnQ4X3QgQ29tcGFjdFByb3RvY29sOjpUVHlwZVRvQ1R5cGVbXSA9IHsKKyAgICBDVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgICBDVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICAgIENUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgICBDVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgICAgQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICAgIENUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgICBDVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgICAgQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK307CisKK2Jvb2wgQ29tcGFjdFByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYjsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB1aW50OF90IGN0eXBlID0gYiAmIDB4ZjsKKyAgdHlwZSA9IGdldFRUeXBlKGN0eXBlKTsKKyAgaWYgKHR5cGUgPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICB0YWcgPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisgIHVpbnQ4X3QgZGlmZiA9IChiICYgMHhmMCkgPj4gNDsKKyAgaWYgKGRpZmYpIHsKKyAgICB0YWcgPSByZWFkVGFnc18udG9wKCkgKyBkaWZmOworICB9IGVsc2UgaWYgKCFyZWFkSTE2KHRhZykpIHsKKyAgICByZWFkVGFnc18udG9wKCkgPSAtMTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGN0eXBlID09IENUX0JPT0xFQU5fRkFMU0UgfHwgY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFKSB7CisgICAgcmVhZEJvb2xfLmV4aXN0cyA9IHRydWU7CisgICAgcmVhZEJvb2xfLnZhbHVlID0gY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFOworICB9CisgIHJlYWRUYWdzXy50b3AoKSA9IHRhZzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RUeXBlIENvbXBhY3RQcm90b2NvbDo6Z2V0VFR5cGUodWludDhfdCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfU1RPUDoKKyAgICByZXR1cm4gVF9TVE9QOworICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgIHJldHVybiBUX0JPT0w7CisgIGNhc2UgQ1RfQllURToKKyAgICByZXR1cm4gVF9CWVRFOworICBjYXNlIENUX0kxNjoKKyAgICByZXR1cm4gVF9JMTY7CisgIGNhc2UgQ1RfSTMyOgorICAgIHJldHVybiBUX0kzMjsKKyAgY2FzZSBDVF9JNjQ6CisgICAgcmV0dXJuIFRfSTY0OworICBjYXNlIENUX0RPVUJMRToKKyAgICByZXR1cm4gVF9ET1VCTEU7CisgIGNhc2UgQ1RfQklOQVJZOgorICAgIHJldHVybiBUX1NUUklORzsKKyAgY2FzZSBDVF9MSVNUOgorICAgIHJldHVybiBUX0xJU1Q7CisgIGNhc2UgQ1RfU0VUOgorICAgIHJldHVybiBUX1NFVDsKKyAgY2FzZSBDVF9NQVA6CisgICAgcmV0dXJuIFRfTUFQOworICBjYXNlIENUX1NUUlVDVDoKKyAgICByZXR1cm4gVF9TVFJVQ1Q7CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImRvbid0IGtub3cgd2hhdCB0eXBlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUVHlwZT4oLTEpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmggYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZDdhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaApAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9DT01QQUNUX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0NPTVBBQ1RfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0YWNrPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQ29tcGFjdFByb3RvY29sIDogcHVibGljIFByb3RvY29sQmFzZTxDb21wYWN0UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgQ29tcGFjdFByb3RvY29sKCkgeyByZWFkQm9vbF8uZXhpc3RzID0gZmFsc2U7IH0KKworICB2aXJ0dWFsIH5Db21wYWN0UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCAxKTsgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50MTZfdCB2YWwpIHsgd3JpdGVWYXJpbnQodG9aaWdaYWcodmFsKSk7IH0KKworICBpbnQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsgcmV0dXJuIHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeyB3cml0ZVZhcmludDY0KHRvWmlnWmFnNjQodmFsKSk7IH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgZjsKKyAgICAgIGludDY0X3QgdDsKKyAgICB9IHRyYW5zZmVyOworICAgIHRyYW5zZmVyLmYgPSBodG9sZWxsKGR1Yik7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnRyYW5zZmVyLnQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgaW50IGN0eXBlID0gdG9Db21wYWN0VHlwZShhcmdzLmVsZW1lbnRfdHlwZSk7CisgICAgaWYgKGxlbiA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxlbiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4ZjAgfCBjdHlwZSk7CisgICAgICB3cml0ZVZhcmludChsZW4pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVNYXBCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IE1hcFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5rdGFnKSA8PCA0IHwgdG9Db21wYWN0VHlwZShhcmdzLnZ0YWcpOworICAgIHdyaXRlVmFyaW50KGxlbik7CisgICAgd3JpdGVCeXRlKGN0eXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsKKyAgICB3cml0ZVRhZ3NfLnB1c2goMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICB3cml0ZVRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMpIHsKKyAgICBpZiAoc3BlYy50eXBlID09IFRfQk9PTCkgeworICAgICAgZG9Xcml0ZUZpZWxkQmVnaW4oc3BlYywgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIHRvQ29tcGFjdFR5cGUoc3BlYy50eXBlKSk7CisgICAgICByZXR1cm4gZW5jb2RlVmFsdWUodmFsdWUsIHNwZWMudHlwZSwgc3BlYy50eXBlYXJncyk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKDApOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBpZiAocmVhZEJvb2xfLmV4aXN0cykgeworICAgICAgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOworICAgICAgdmFsID0gcmVhZEJvb2xfLnZhbHVlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF0gPT0gQ1RfQk9PTEVBTl9UUlVFOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEk4KGludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkxNihpbnQxNl90JiB2YWwpIHsKKyAgICB1aW50MTZfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQxNl90LCAzPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQxNl90LCB1aW50MTZfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIHVpbnQzMl90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDMyX3QsIHVpbnQzMl90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgdWludDY0X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50NjRfdCwgMTA+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDY0X3QsIHVpbnQ2NF90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWREb3VibGUoZG91YmxlJiB2YWwpIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQ2NF90IGY7CisgICAgICBkb3VibGUgdDsKKyAgICB9IHRyYW5zZmVyOworCisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdHJhbnNmZXIuZiwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHRyYW5zZmVyLmYgPSBsZXRvaGxsKHRyYW5zZmVyLmYpOworICAgIHZhbCA9IHRyYW5zZmVyLnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbnQzMl90IHJlYWRTdHJpbmcoY2hhcioqIGJ1ZikgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICB1aW50OF90IGI7CisgICAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBldHlwZSA9IGdldFRUeXBlKGIgJiAweGYpOworICAgIGlmIChldHlwZSA9PSAtMSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1aW50MzJfdCBsZW4gPSAoYiA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobGVuID09IDE1ICYmICFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuICE9IDApIHsKKyAgICAgIHVpbnQ4X3Qga3ZUeXBlOworICAgICAgaWYgKCFyZWFkQnl0ZShrdlR5cGUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGt0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlID4+IDQpOworICAgICAgdnR5cGUgPSBnZXRUVHlwZShrdlR5cGUgJiAweGYpOworICAgICAgaWYgKGt0eXBlID09IC0xIHx8IHZ0eXBlID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJlYWRUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICByZWFkVGFnc18ucG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworICBib29sIHNraXBCb29sKCkgeworICAgIGJvb2wgdmFsOworICAgIHJldHVybiByZWFkQm9vbCh2YWwpOworICB9CisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBJMTYoKSB7CisgICAgaW50MTZfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMTYodmFsKTsKKyAgfQorICBib29sIHNraXBJMzIoKSB7CisgICAgaW50MzJfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMzIodmFsKTsKKyAgfQorICBib29sIHNraXBJNjQoKSB7CisgICAgaW50NjRfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJNjQodmFsKTsKKyAgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTS0lQQllURVMobGVuKTsKKyAgfQorI3VuZGVmIFNLSVBCWVRFUworCitwcml2YXRlOgorICBlbnVtIFR5cGVzIHsKKyAgICBDVF9TVE9QID0gMHgwMCwKKyAgICBDVF9CT09MRUFOX1RSVUUgPSAweDAxLAorICAgIENUX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICAgIENUX0JZVEUgPSAweDAzLAorICAgIENUX0kxNiA9IDB4MDQsCisgICAgQ1RfSTMyID0gMHgwNSwKKyAgICBDVF9JNjQgPSAweDA2LAorICAgIENUX0RPVUJMRSA9IDB4MDcsCisgICAgQ1RfQklOQVJZID0gMHgwOCwKKyAgICBDVF9MSVNUID0gMHgwOSwKKyAgICBDVF9TRVQgPSAweDBBLAorICAgIENUX01BUCA9IDB4MEIsCisgICAgQ1RfU1RSVUNUID0gMHgwQworICB9OworCisgIHN0YXRpYyBjb25zdCB1aW50OF90IFRUeXBlVG9DVHlwZVtdOworCisgIFRUeXBlIGdldFRUeXBlKHVpbnQ4X3QgdHlwZSk7CisKKyAgaW50IHRvQ29tcGFjdFR5cGUoVFR5cGUgdHlwZSkgeworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50Pih0eXBlKTsKKyAgICByZXR1cm4gaSA8IDE2ID8gVFR5cGVUb0NUeXBlW2ldIDogLTE7CisgIH0KKworICB1aW50MzJfdCB0b1ppZ1phZyhpbnQzMl90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiAzMSkgXiAodmFsIDw8IDEpOyB9CisKKyAgdWludDY0X3QgdG9aaWdaYWc2NChpbnQ2NF90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiA2MykgXiAodmFsIDw8IDEpOyB9CisKKyAgaW50IHdyaXRlVmFyaW50KHVpbnQzMl90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlUpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlUpIHwgMHg4MFUpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIGludCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlVMTCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KCh2YWwgJiAweDdmVUxMKSB8IDB4ODBVTEwpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTWF4PgorICBib29sIHJlYWRWYXJpbnQoVCYgcmVzdWx0KSB7CisgICAgdWludDhfdCBiOworICAgIFQgdmFsID0gMDsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF4OyArK2kpIHsKKyAgICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKGIgJiAweDgwKSB7CisgICAgICAgIHZhbCB8PSBzdGF0aWNfY2FzdDxUPihiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYikgPDwgc2hpZnQ7CisgICAgICAgIHJlc3VsdCA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInZhcmludCBleGNlZWRlZCAlZCBieXRlcyIsIE1heCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFU+CisgIFMgZnJvbVppZ1phZyhVIHZhbCkgeworICAgIHJldHVybiAodmFsID4+IDEpIF4gc3RhdGljX2Nhc3Q8VT4oLXN0YXRpY19jYXN0PFM+KHZhbCAmIDEpKTsKKyAgfQorCisgIHZvaWQgZG9Xcml0ZUZpZWxkQmVnaW4oY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMsIGludCBjdHlwZSkgeworICAgIGludCBkaWZmID0gc3BlYy50YWcgLSB3cml0ZVRhZ3NfLnRvcCgpOworICAgIGlmIChkaWZmID4gMCAmJiBkaWZmIDw9IDE1KSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oZGlmZiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN0eXBlKSk7CisgICAgICB3cml0ZUkxNihzcGVjLnRhZyk7CisgICAgfQorICAgIHdyaXRlVGFnc18udG9wKCkgPSBzcGVjLnRhZzsKKyAgfQorCisgIHN0ZDo6c3RhY2s8aW50PiB3cml0ZVRhZ3NfOworICBzdGQ6OnN0YWNrPGludD4gcmVhZFRhZ3NfOworICBzdHJ1Y3QgeworICAgIGJvb2wgZXhpc3RzOworICAgIGJvb2wgdmFsdWU7CisgIH0gcmVhZEJvb2xfOworICBjaGFyKiBkdW1teV9idWZfOworfTsKK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfQ09NUEFDVF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaCBiL2xpYi9weS9zcmMvZXh0L2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0VORElBTl9ICisjZGVmaW5lIFRIUklGVF9QWV9FTkRJQU5fSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI3ByYWdtYSBjb21tZW50KGxpYiwgIndzMl8zMi5saWIiKQorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KKyNpZiBkZWZpbmVkKF9fU1ZSNCkgJiYgZGVmaW5lZChfX3N1bikKKyNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIF9faTM4Nl9fCisjZW5kaWYKKworI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCisjZW5kaWYKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2VuZGlmCisKKy8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLworI2lmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0JZVEVfT1JERVIKKyNpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQorI2RlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgorI2Vsc2UKKyNlcnJvciAiQ2Fubm90IGRldGVybWluZSBlbmRpYW5uZXNzIgorI2VuZGlmCisjZW5kaWYKKworLy8gU2FtZSBjb21tZW50IGFzIHRoZSBlbnVtLiAgU29ycnkuCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZSBudG9obGwobikgKG4pCisjZGVmaW5lIGh0b25sbChuKSAobikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2RlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBsZXRvaGxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpKQorI2RlZmluZSBodG9sZWxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpKQorI2VuZGlmCisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQorI2Vsc2UgLyogR05VQyAmIEdMSUJDICovCisjZGVmaW5lIG50b2hsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSkKKyNkZWZpbmUgaHRvbmxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpKQorI2VuZGlmIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBsZXRvaGxsKG4pIChuKQorI2RlZmluZSBodG9sZWxsKG4pIChuKQorI2Vsc2UgLyogX19CWVRFX09SREVSICovCisjZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKKyNlbmRpZgorCisjZW5kaWYgLy8gVEhSSUZUX1BZX0VORElBTl9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9tb2R1bGUuY3BwIGIvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU4YjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJiaW5hcnkuaCIKKyNpbmNsdWRlICJjb21wYWN0LmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBUT0RPKGRyZWlzcyk6IGRlZnZhbCBhcHBlYXJzIHRvIGJlIHVudXNlZC4gIExvb2sgaW50byByZW1vdmluZyBpdC4KKy8vIFRPRE8oZHJlaXNzKTogTWFrZSBwYXJzZV9zcGVjX2FyZ3MgcmVjdXJzaXZlLCBhbmQgY2FjaGUgdGhlIG91dHB1dAorLy8gICAgICAgICAgICAgICBwZXJtYW5lbnRseSBpbiB0aGUgb2JqZWN0LiAgKE1hbGxvYyBhbmQgb3JwaGFuLikKKy8vIFRPRE8oZHJlaXNzKTogV2h5IGRvIHdlIG5lZWQgY1N0cmluZ0lPIGZvciByZWFkaW5nLCB3aHkgbm90IGp1c3QgY2hhcio/CisvLyAgICAgICAgICAgICAgIENhbiBjU3RyaW5nSU8gbGV0IHVzIHdvcmsgd2l0aCBhIEJ1ZmZlcmVkVHJhbnNwb3J0PworLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBpZ25vcmUgdGhlIHJ2IGZyb20gY3dyaXRlIChtYXliZSkuCisKKy8vIERvaW5nIGEgYmVuY2htYXJrIHNob3dzIHRoYXQgaW50ZXJuaW5nIGFjdHVhbGx5IG1ha2VzIGEgZGlmZmVyZW5jZSwgYW1hemluZ2x5LgorCisvKiogUG9pbnRlciB0byBpbnRlcm5lZCBzdHJpbmcgdG8gc3BlZWQgdXAgYXR0cmlidXRlIGxvb2t1cC4gKi8KK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcodHJhbnMpOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgUHlPYmplY3QqIGVuY29kZV9pbXBsKFB5T2JqZWN0KiBhcmdzKSB7CisgIGlmICghYXJncykKKyAgICByZXR1cm4gTlVMTDsKKworICBQeU9iamVjdCogZW5jX29iaiA9IE5VTEw7CisgIFB5T2JqZWN0KiB0eXBlX2FyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmVuY19vYmosICZ0eXBlX2FyZ3MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFlbmNfb2JqIHx8ICF0eXBlX2FyZ3MpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGlmICghcHJvdG9jb2wucHJlcGFyZUVuY29kZUJ1ZmZlcigpIHx8ICFwcm90b2NvbC5lbmNvZGVWYWx1ZShlbmNfb2JqLCBUX1NUUlVDVCwgdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLmdldEVuY29kZWRWYWx1ZSgpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdCogdmFsdWUsIGxvbmcgZGVmYXVsdF92YWx1ZSkgeworICBTY29wZWRQeU9iamVjdCBzY29wZSh2YWx1ZSk7CisgIGxvbmcgdiA9IFB5SW50X0FzTG9uZyh2YWx1ZSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBQeU9iamVjdCogb3V0cHV0X29iaiA9IE5VTEw7CisgIFB5T2JqZWN0KiBvcHJvdCA9IE5VTEw7CisgIFB5T2JqZWN0KiB0eXBlYXJncyA9IE5VTEw7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZvcHJvdCwgJnR5cGVhcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgVCBwcm90b2NvbDsKKyAgaW50MzJfdCBkZWZhdWx0X2xpbWl0ID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKTsKKyAgcHJvdG9jb2wuc2V0U3RyaW5nTGVuZ3RoTGltaXQoCisgICAgICBhc19sb25nX3RoZW5fZGVsZXRlKFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xpbWl0KSk7CisgIHByb3RvY29sLnNldENvbnRhaW5lckxlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBTY29wZWRQeU9iamVjdCB0cmFuc3BvcnQoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyh0cmFucykpKTsKKyAgaWYgKCF0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFwcm90b2NvbC5wcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydCh0cmFuc3BvcnQuZ2V0KCkpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcHJvdG9jb2wucmVhZFN0cnVjdChvdXRwdXRfb2JqLCBwYXJzZWRhcmdzLmtsYXNzLCBwYXJzZWRhcmdzLnNwZWMpOworfQorfQorfQorfQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnB5OworCisvKiAtLSBQWVRIT04gTU9EVUxFIFNFVFVQIFNUVUZGIC0tLSAqLworCitleHRlcm4gIkMiIHsKKworc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfYmluYXJ5KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGVuY29kZV9pbXBsPEJpbmFyeVByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfYmluYXJ5KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGRlY29kZV9pbXBsPEJpbmFyeVByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlPYmplY3QqIGRlY29kZV9jb21wYWN0KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGRlY29kZV9pbXBsPENvbXBhY3RQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0geworICAgIHsiZW5jb2RlX2JpbmFyeSIsIGVuY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2JpbmFyeSIsIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZW5jb2RlX2NvbXBhY3QiLCBlbmNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAgeyJkZWNvZGVfY29tcGFjdCIsIGRlY29kZV9jb21wYWN0LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gLyogU2VudGluZWwgKi8KK307CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKworc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBUaHJpZnRGYXN0QmluYXJ5RGVmID0ge1B5TW9kdWxlRGVmX0hFQURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKKworI2RlZmluZSBJTklURVJST1IgcmV0dXJuIE5VTEw7CisKK1B5T2JqZWN0KiBQeUluaXRfZmFzdGJpbmFyeSgpIHsKKworI2Vsc2UKKworI2RlZmluZSBJTklURVJST1IgcmV0dXJuOworCit2b2lkIGluaXRmYXN0YmluYXJ5KCkgeworCisgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIGlmIChQeWNTdHJpbmdJTyA9PSBOVUxMKQorICAgIElOSVRFUlJPUgorCisjZW5kaWYKKworI2RlZmluZSBJTklUX0lOVEVSTl9TVFJJTkcodmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTl9TVFJJTkcodmFsdWUpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghSU5URVJOX1NUUklORyh2YWx1ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgSU5JVEVSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIElOSVRfSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworICBJTklUX0lOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHRyYW5zKTsKKyN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKKworICBQeU9iamVjdCogbW9kdWxlID0KKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgICAgIFB5TW9kdWxlX0NyZWF0ZSgmVGhyaWZ0RmFzdEJpbmFyeURlZik7CisjZWxzZQorICAgICAgUHlfSW5pdE1vZHVsZSgidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLCBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcyk7CisjZW5kaWYKKyAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgIElOSVRFUlJPUjsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICByZXR1cm4gbW9kdWxlOworI2VuZGlmCit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC5oIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFiN2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX1BST1RPQ09MX0gKKyNkZWZpbmUgVEhSSUZUX1BZX1BST1RPQ09MX0gKKworI2luY2x1ZGUgImV4dC90eXBlcy5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorY2xhc3MgUHJvdG9jb2xCYXNlIHsKKworcHVibGljOgorICBQcm90b2NvbEJhc2UoKQorICAgIDogc3RyaW5nTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAorICAgICAgY29udGFpbmVyTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAorICAgICAgb3V0cHV0XyhOVUxMKSB7fQorICBpbmxpbmUgdmlydHVhbCB+UHJvdG9jb2xCYXNlKCk7CisKKyAgYm9vbCBwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpOworCisgIFB5T2JqZWN0KiByZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKTsKKworICBib29sIHByZXBhcmVFbmNvZGVCdWZmZXIoKTsKKworICBib29sIGVuY29kZVZhbHVlKFB5T2JqZWN0KiB2YWx1ZSwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBQeU9iamVjdCogZ2V0RW5jb2RlZFZhbHVlKCk7CisKKyAgbG9uZyBzdHJpbmdMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ0xpbWl0XzsgfQorICB2b2lkIHNldFN0cmluZ0xlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgc3RyaW5nTGltaXRfID0gbGltaXQ7IH0KKworICBsb25nIGNvbnRhaW5lckxpbWl0KCkgY29uc3QgeyByZXR1cm4gY29udGFpbmVyTGltaXRfOyB9CisgIHZvaWQgc2V0Q29udGFpbmVyTGVuZ3RoTGltaXQobG9uZyBsaW1pdCkgeyBjb250YWluZXJMaW1pdF8gPSBsaW1pdDsgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgcmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pOworCisgIGJvb2wgcmVhZEJ5dGUodWludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJ1ZlswXSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlQnVmZmVyKGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pOworCisgIHZvaWQgd3JpdGVCeXRlKHVpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCAxKTsgfQorCisgIFB5T2JqZWN0KiBkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpOworCisgIGJvb2wgc2tpcChUVHlwZSB0eXBlKTsKKworICBpbmxpbmUgYm9vbCBjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCk7CisgIGlubGluZSBib29sIGNoZWNrTGVuZ3RoTGltaXQoaW50MzJfdCBsZW4sIGxvbmcgbGltaXQpOworCisgIGlubGluZSBib29sIGlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpOworCitwcml2YXRlOgorICBJbXBsKiBpbXBsKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbCo+KHRoaXMpOyB9CisKKyAgbG9uZyBzdHJpbmdMaW1pdF87CisgIGxvbmcgY29udGFpbmVyTGltaXRfOworICBFbmNvZGVCdWZmZXIqIG91dHB1dF87CisgIERlY29kZUJ1ZmZlciBpbnB1dF87Cit9OworfQorfQorfQorCisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLnRjYyIKKworI2VuZGlmIC8vIFRIUklGVF9QWV9QUk9UT0NPTF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1ZGY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYwpAQCAtMCwwICsxLDkxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKyNkZWZpbmUgVEhSSUZUX1BZX1BST1RPQ09MX1RDQworCisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNkZWZpbmUgQ0hFQ0tfUkFOR0UodiwgbWluLCBtYXgpICgoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSkKKyNkZWZpbmUgSU5JVF9PVVRCVUZfU0laRSAxMjgKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisjaW5jbHVkZSA8Y1N0cmluZ0lPLmg+CisjZWxzZQorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisKK25hbWVzcGFjZSBkZXRhaWwgeworCitpbmxpbmUgYm9vbCBpbnB1dF9jaGVjayhQeU9iamVjdCogaW5wdXQpIHsKKyAgcmV0dXJuIFB5Y1N0cmluZ0lPX0lucHV0Q2hlY2soaW5wdXQpOworfQorCitpbmxpbmUgRW5jb2RlQnVmZmVyKiBuZXdfZW5jb2RlX2J1ZmZlcihzaXplX3Qgc2l6ZSkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoc2l6ZSk7Cit9CisKK2lubGluZSBpbnQgcmVhZF9idWZmZXIoUHlPYmplY3QqIGJ1ZiwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZmFpbGVkIHRvIGltcG9ydCBuYXRpdmUgY1N0cmluZ0lPIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y3JlYWQoYnVmLCBvdXRwdXQsIGxlbik7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIFByb3RvY29sQmFzZTxJbXBsPjo6flByb3RvY29sQmFzZSgpIHsKKyAgaWYgKG91dHB1dF8pIHsKKyAgICBQeV9DTEVBUihvdXRwdXRfKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6aXNVdGY4KFB5T2JqZWN0KiB0eXBlYXJncykgeworICByZXR1cm4gUHlTdHJpbmdfQ2hlY2sodHlwZWFyZ3MpICYmICFzdHJuY21wKFB5U3RyaW5nX0FTX1NUUklORyh0eXBlYXJncyksICJVVEY4IiwgNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUHlPYmplY3QqIFByb3RvY29sQmFzZTxJbXBsPjo6Z2V0RW5jb2RlZFZhbHVlKCkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUob3V0cHV0Xyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojp3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZmFpbGVkIHRvIGltcG9ydCBuYXRpdmUgY1N0cmluZ0lPIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGludCBsZW4gPSBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dF8sIGRhdGEsIHNpemUpOworICBpZiAobGVuIDwgMCkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiZmFpbGVkIHRvIHdyaXRlIHRvIGNTdHJpbmdJTyBvYmplY3QiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSAhPSBzaXplKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0VPRkVycm9yLCAid3JpdGUgbGVuZ3RoIG1pc21hdGNoOiBleHBlY3RlZCAlbHUgZ290ICVkIiwgc2l6ZSwgbGVuKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbHNlCisKK25hbWVzcGFjZSBkZXRhaWwgeworCitpbmxpbmUgYm9vbCBpbnB1dF9jaGVjayhQeU9iamVjdCogaW5wdXQpIHsKKyAgLy8gVE9ETzogQ2hlY2sgZm9yIEJ5dGVzSU8gdHlwZQorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgRW5jb2RlQnVmZmVyKiBidWZmZXIgPSBuZXcgRW5jb2RlQnVmZmVyOworICBidWZmZXItPmJ1Zi5yZXNlcnZlKHNpemUpOworICBidWZmZXItPnBvcyA9IDA7CisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0cnVjdCBieXRlc2lvIHsKKyAgUHlPYmplY3RfSEVBRAorI2lmIFBZX01JTk9SX1ZFUlNJT04gPCA1CisgICAgICBjaGFyKiBidWY7CisjZWxzZQorICAgICAgUHlPYmplY3QqIGJ1ZjsKKyNlbmRpZgorICBQeV9zc2l6ZV90IHBvczsKKyAgUHlfc3NpemVfdCBzdHJpbmdfc2l6ZTsKK307CisKK2lubGluZSBpbnQgcmVhZF9idWZmZXIoUHlPYmplY3QqIGJ1ZiwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBieXRlc2lvKiBidWYyID0gcmVpbnRlcnByZXRfY2FzdDxieXRlc2lvKj4oYnVmKTsKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAqb3V0cHV0ID0gYnVmMi0+YnVmICsgYnVmMi0+cG9zOworI2Vsc2UKKyAgKm91dHB1dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGJ1ZjItPmJ1ZikgKyBidWYyLT5wb3M7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3MwID0gYnVmMi0+cG9zOworICBidWYyLT5wb3MgPSAoc3RkOjptaW4pKGJ1ZjItPnBvcyArIHN0YXRpY19jYXN0PFB5X3NzaXplX3Q+KGxlbiksIGJ1ZjItPnN0cmluZ19zaXplKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmMi0+cG9zIC0gcG9zMCk7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIFByb3RvY29sQmFzZTxJbXBsPjo6flByb3RvY29sQmFzZSgpIHsKKyAgaWYgKG91dHB1dF8pIHsKKyAgICBkZWxldGUgb3V0cHV0XzsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6aXNVdGY4KFB5T2JqZWN0KiB0eXBlYXJncykgeworICAvLyB3aGlsZSBjb25kaXRpb24gZm9yIHB5MiBpcyAiYXJnID09ICdVVEY4JyIsIGl0IHNob3VsZCBiZSAiYXJnICE9ICdCSU5BUlknIiBmb3IgcHkzLgorICAvLyBIQUNLOiBjaGVjayB0aGUgbGVuZ3RoIGFuZCBkb24ndCBib3RoZXIgcmVhZGluZyB0aGUgdmFsdWUKKyAgcmV0dXJuICFQeVVuaWNvZGVfQ2hlY2sodHlwZWFyZ3MpIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHR5cGVhcmdzKSAhPSA2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUob3V0cHV0Xy0+YnVmLmRhdGEoKSwgb3V0cHV0Xy0+YnVmLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojp3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3QgbmVlZCA9IHNpemUgKyBvdXRwdXRfLT5wb3M7CisgIGlmIChvdXRwdXRfLT5idWYuY2FwYWNpdHkoKSA8IG5lZWQpIHsKKyAgICB0cnkgeworICAgICAgb3V0cHV0Xy0+YnVmLnJlc2VydmUobmVlZCk7CisgICAgfSBjYXRjaCAoc3RkOjpiYWRfYWxsb2MmIGV4KSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJGYWlsZWQgdG8gYWxsb2NhdGUgd3JpdGUgYnVmZmVyIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHN0ZDo6Y29weShkYXRhLCBkYXRhICsgc2l6ZSwgc3RkOjpiYWNrX2luc2VydGVyKG91dHB1dF8tPmJ1ZikpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK25hbWVzcGFjZSBkZXRhaWwgeworCisjZGVmaW5lIERFQ0xBUkVfT1BfU0NPUEUobmFtZSwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBuYW1lIyNTY29wZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSW1wbCogaW1wbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCB2YWxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSMjU2NvcGUoSW1wbCogdGhpeikgOiBpbXBsKHRoaXopLCB2YWxpZChpbXBsLT5vcCMjQmVnaW4oKSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfm5hbWUjI1Njb3BlKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGltcGwtPm9wIyNFbmQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIHZhbGlkOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbXBsLCB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWUjI1Njb3BlPEltcGw+IG9wIyNTY29wZShUPEltcGw+KiB0aGl6KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5hbWUjI1Njb3BlPEltcGw+KHN0YXRpY19jYXN0PEltcGwqPih0aGl6KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK0RFQ0xBUkVfT1BfU0NPUEUoV3JpdGVTdHJ1Y3QsIHdyaXRlU3RydWN0KQorREVDTEFSRV9PUF9TQ09QRShSZWFkU3RydWN0LCByZWFkU3RydWN0KQorI3VuZGVmIERFQ0xBUkVfT1BfU0NPUEUKKworaW5saW5lIGJvb2wgY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgeworICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAorICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNpemUgb3V0IG9mIHJhbmdlOiBleGNlZWRlZCBJTlQzMl9NQVgiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBwYXJzZV9weWludChQeU9iamVjdCogbywgVCogcmV0LCBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpIHsKKyAgbG9uZyB2YWwgPSBQeUludF9Bc0xvbmcobyk7CisKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHZhbCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRSh2YWwsIG1pbiwgbWF4KSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpyZXQgPSBzdGF0aWNfY2FzdDxUPih2YWwpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmNoZWNrVHlwZShUVHlwZSBnb3QsIFRUeXBlIGV4cGVjdGVkKSB7CisgIGlmIChleHBlY3RlZCAhPSBnb3QpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZ290IHdyb25nIHR0eXBlIHdoaWxlIHJlYWRpbmcgZmllbGQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmNoZWNrTGVuZ3RoTGltaXQoaW50MzJfdCBsZW4sIGxvbmcgbGltaXQpIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5lZ2F0aXZlIGxlbmd0aDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobGVuID4gbGltaXQpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNpemUgZXhjZWVkZWQgc3BlY2lmaWVkIGxpbWl0OiAlbGQiLCBsaW1pdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkQnl0ZXMoY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBpZiAobGVuIDwgMCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiYXR0ZW1wdGVkIHRvIHJlYWQgbmVnYXRpdmUgbGVuZ3RoOiAlZCIsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgZmVhciB0aGUgbWFsbG9jLiAgVGhpbmsgYWJvdXQgdGFraW5nIGEgY29weSBvZgorICAvLyAgICAgICAgICAgICAgIHRoZSBwYXJ0aWFsIHJlYWQgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZSB0cmFuc3BvcnQKKyAgLy8gICAgICAgICAgICAgICB0byBwcmVwZW5kIGl0IHRvIGl0cyBidWZmZXIuCisKKyAgaW50IHJsZW4gPSBkZXRhaWw6OnJlYWRfYnVmZmVyKGlucHV0Xy5zdHJpbmdpb2J1Zi5nZXQoKSwgb3V0cHV0LCBsZW4pOworCisgIGlmIChybGVuID09IGxlbikgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHJsZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgLy8gdXNpbmcgYnVpbGRpbmcgZnVuY3Rpb25zIGFzIHRoaXMgaXMgYSByYXJlIGNvZGVwYXRoCisgICAgU2NvcGVkUHlPYmplY3QgbmV3aW9idWYoUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGlucHV0Xy5yZWZpbGxfY2FsbGFibGUuZ2V0KCksIHJlZmlsbF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHJsZW4sIGxlbiwgTlVMTCkpOworICAgIGlmICghbmV3aW9idWYpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKKyAgICBpbnB1dF8uc3RyaW5naW9idWYucmVzZXQobmV3aW9idWYucmVsZWFzZSgpKTsKKworICAgIHJsZW4gPSBkZXRhaWw6OnJlYWRfYnVmZmVyKGlucHV0Xy5zdHJpbmdpb2J1Zi5nZXQoKSwgb3V0cHV0LCBsZW4pOworCisgICAgaWYgKHJsZW4gPT0gbGVuKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJsZW4gPT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGNvdWxkIGJlIGEgdmFsaWQgY29kZSBwYXRoIGZvciBiaWcgYmluYXJ5IGJsb2JzLgorICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnByZXBhcmVEZWNvZGVCdWZmZXJGcm9tVHJhbnNwb3J0KFB5T2JqZWN0KiB0cmFucykgeworICBpZiAoaW5wdXRfLnN0cmluZ2lvYnVmKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkZWNvZGUgYnVmZmVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTY29wZWRQeU9iamVjdCBzdHJpbmdpb2J1ZihQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpKSk7CisgIGlmICghc3RyaW5naW9idWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFkZXRhaWw6OmlucHV0X2NoZWNrKHN0cmluZ2lvYnVmLmdldCgpKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXRfIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3QgcmVmaWxsX2NhbGxhYmxlKFB5T2JqZWN0X0dldEF0dHIodHJhbnMsIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCkpKTsKKyAgaWYgKCFyZWZpbGxfY2FsbGFibGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHJlZmlsbF9jYWxsYWJsZS5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGNhbGxhYmxlIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW5wdXRfLnN0cmluZ2lvYnVmLnN3YXAoc3RyaW5naW9idWYpOworICBpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLnN3YXAocmVmaWxsX2NhbGxhYmxlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnByZXBhcmVFbmNvZGVCdWZmZXIoKSB7CisgIG91dHB1dF8gPSBkZXRhaWw6Om5ld19lbmNvZGVfYnVmZmVyKElOSVRfT1VUQlVGX1NJWkUpOworICByZXR1cm4gb3V0cHV0XyAhPSBOVUxMOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjplbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICAvKgorICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKKyAgICoKKyAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKKyAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KKyAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgorICAgKiBlbmNvZGVWYWx1ZSBhc3N1bWVzIHRoYXQgYSByZWZlcmVuY2UgaXMgYWxyZWFkeSBoZWxkLiBUaGUgKmNhbGxlciogaXMKKyAgICogcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMKKyAgICovCisKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBpbnQgdiA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7CisgICAgaWYgKHYgPT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW1wbCgpLT53cml0ZUJvb2wodik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0kwODogeworICAgIGludDhfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgpKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUk4KHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUkxNih2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMzI6IHsKKyAgICBpbnQzMl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMzIodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCBudmFsID0gUHlMb25nX0FzTG9uZ0xvbmcodmFsdWUpOworCisgICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKG52YWwpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFDSEVDS19SQU5HRShudmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSkpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJNjQobnZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIG52YWwgPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAobnZhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlRG91YmxlKG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIFNjb3BlZFB5T2JqZWN0IG52YWw7CisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgbnZhbC5yZXNldChQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHZhbHVlKSk7CisgICAgICBpZiAoIW52YWwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgbnZhbC5yZXNldCh2YWx1ZSk7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX1NpemUobnZhbC5nZXQoKSk7CisgICAgaWYgKCFkZXRhaWw6OmNoZWNrX3NzaXplX3RfMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVTdHJpbmcobnZhbC5nZXQoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obGVuKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTElTVDoKKyAgY2FzZSBUX1NFVDogeworICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWltcGwoKS0+d3JpdGVMaXN0QmVnaW4odmFsdWUsIHBhcnNlZGFyZ3MsIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3QgaXRlcmF0b3IoUHlPYmplY3RfR2V0SXRlcih2YWx1ZSkpOworICAgIGlmICghaXRlcmF0b3IpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoUHlPYmplY3QqIHJhd0l0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyYXRvci5nZXQoKSkpIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGl0ZW0ocmF3SXRlbSk7CisgICAgICBpZiAoIWVuY29kZVZhbHVlKGl0ZW0uZ2V0KCksIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeURpY3RfU2l6ZSh2YWx1ZSk7CisgICAgaWYgKCFkZXRhaWw6OmNoZWNrX3NzaXplX3RfMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTWFwQmVnaW4odmFsdWUsIHBhcnNlZGFyZ3MsIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0KiBrID0gTlVMTDsKKyAgICBQeU9iamVjdCogdiA9IE5VTEw7CisgICAgLy8gVE9ETyhibWF1cmVyKTogc2hvdWxkIHN1cHBvcnQgYW55IG1hcHBpbmcsIG5vdCBqdXN0IGRpY3RzCisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHZhbHVlLCAmcG9zLCAmaywgJnYpKSB7CisgICAgICBpZiAoIWVuY29kZVZhbHVlKGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCisgICAgICAgICAgfHwgIWVuY29kZVZhbHVlKHYsIHBhcnNlZGFyZ3MudnRhZywgcGFyc2VkYXJncy52dHlwZWFyZ3MpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQeV9zc2l6ZV90IG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7CisgICAgaWYgKG5zcGVjID09IC0xKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3BlYyBpcyBub3QgYSB0dXBsZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRldGFpbDo6V3JpdGVTdHJ1Y3RTY29wZTxJbXBsPiBzY29wZSA9IGRldGFpbDo6d3JpdGVTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgICBpZiAoIXNjb3BlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoUHlfc3NpemVfdCBpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOworICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKKyAgICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYygmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBTY29wZWRQeU9iamVjdCBpbnN0dmFsKFB5T2JqZWN0X0dldEF0dHIodmFsdWUsIHBhcnNlZHNwZWMuYXR0cm5hbWUpKTsKKworICAgICAgaWYgKCFpbnN0dmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3R2YWwuZ2V0KCkgPT0gUHlfTm9uZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCByZXMgPSBpbXBsKCktPndyaXRlRmllbGQoaW5zdHZhbC5nZXQoKSwgcGFyc2Vkc3BlYyk7CisgICAgICBpZiAoIXJlcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZW5jb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnNraXAoVFR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJvb2woKTsKKyAgY2FzZSBUX0kwODoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwQnl0ZSgpOworICBjYXNlIFRfSTE2OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJMTYoKTsKKyAgY2FzZSBUX0kzMjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTMyKCk7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEk2NCgpOworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiBpbXBsKCktPnNraXBEb3VibGUoKTsKKworICBjYXNlIFRfU1RSSU5HOiB7CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcFN0cmluZygpOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBUVHlwZSBldHlwZSA9IFRfU1RPUDsKKyAgICBpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZExpc3RCZWdpbihldHlwZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmICghc2tpcChldHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9NQVA6IHsKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICBpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZE1hcEJlZ2luKGt0eXBlLCB2dHlwZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmICghc2tpcChrdHlwZSkgfHwgIXNraXAodnR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgICBpZiAoIXNjb3BlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBUVHlwZSB0eXBlID0gVF9TVE9QOworICAgICAgaW50MTZfdCB0YWc7CisgICAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3Igc2tpcDogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmRlY29kZVZhbHVlKFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBzd2l0Y2ggKHR5cGUpIHsKKworICBjYXNlIFRfQk9PTDogeworICAgIGJvb2wgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRCb29sKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHYpIHsKKyAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJOCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorICBjYXNlIFRfSTE2OiB7CisgICAgaW50MTZfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEkxNih2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEkzMih2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorCisgIGNhc2UgVF9JNjQ6IHsKKyAgICBpbnQ2NF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTY0KHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gVE9ETyhkcmVpc3MpOiBGaW5kIG91dCBpZiB3ZSBjYW4gdGFrZSB0aGlzIGZhc3RwYXRoIGFsd2F5cyB3aGVuCisgICAgLy8gICAgICAgICAgICAgICBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykuCisgICAgaWYgKENIRUNLX1JBTkdFKHYsIExPTkdfTUlOLCBMT05HX01BWCkpIHsKKyAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2KTsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodik7CisgIH0KKworICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIHYgPSAwLjA7CisgICAgaWYgKCFpbXBsKCktPnJlYWREb3VibGUodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHYpOworICB9CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIGNoYXIqIGJ1ZiA9IE5VTEw7CisgICAgaW50IGxlbiA9IGltcGwoKS0+cmVhZFN0cmluZygmYnVmKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpc1V0ZjgodHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjgoYnVmLCBsZW4sIDApOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7CisgICAgfQorICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGxlbiA+IDAgJiYgIWNoZWNrVHlwZShldHlwZSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBib29sIHVzZV90dXBsZSA9IHR5cGUgPT0gVF9MSVNUICYmIHBhcnNlZGFyZ3MuaW1tdXRhYmxlOworICAgIFNjb3BlZFB5T2JqZWN0IHJldCh1c2VfdHVwbGUgPyBQeVR1cGxlX05ldyhsZW4pIDogUHlMaXN0X05ldyhsZW4pKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgUHlPYmplY3QqIGl0ZW0gPSBkZWNvZGVWYWx1ZShldHlwZSwgcGFyc2VkYXJncy50eXBlYXJncyk7CisgICAgICBpZiAoIWl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAodXNlX3R1cGxlKSB7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQuZ2V0KCksIGksIGl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKKyAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgorICAgIGlmICh0eXBlID09IFRfU0VUKSB7CisgICAgICBQeU9iamVjdCogc2V0cmV0OworICAgICAgc2V0cmV0ID0gcGFyc2VkYXJncy5pbW11dGFibGUgPyBQeUZyb3plblNldF9OZXcocmV0LmdldCgpKSA6IFB5U2V0X05ldyhyZXQuZ2V0KCkpOworICAgICAgcmV0dXJuIHNldHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldC5yZWxlYXNlKCk7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgTWFwVHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGt0eXBlID0gVF9TVE9QOworICAgIFRUeXBlIHZ0eXBlID0gVF9TVE9QOworICAgIHVpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZE1hcEJlZ2luKGt0eXBlLCB2dHlwZSk7CisgICAgaWYgKGxlbiA+IDAgJiYgKCFjaGVja1R5cGUoa3R5cGUsIHBhcnNlZGFyZ3Mua3RhZykgfHwgIWNoZWNrVHlwZSh2dHlwZSwgcGFyc2VkYXJncy52dGFnKSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IHJldChQeURpY3RfTmV3KCkpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGsoZGVjb2RlVmFsdWUoa3R5cGUsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKSk7CisgICAgICBpZiAoIWspIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBTY29wZWRQeU9iamVjdCB2KGRlY29kZVZhbHVlKHZ0eXBlLCBwYXJzZWRhcmdzLnZ0eXBlYXJncykpOworICAgICAgaWYgKCF2KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldC5nZXQoKSwgay5nZXQoKSwgdi5nZXQoKSkgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHBhcnNlZGFyZ3MuaW1tdXRhYmxlKSB7CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICBUaHJpZnRNb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInRocmlmdC5UaHJpZnQiKTsKKyAgICAgIH0KKyAgICAgIGlmICghVGhyaWZ0TW9kdWxlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBTY29wZWRQeU9iamVjdCBjbHMoUHlPYmplY3RfR2V0QXR0cihUaHJpZnRNb2R1bGUsIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpKSk7CisgICAgICBpZiAoIWNscykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgYXJnKFB5VHVwbGVfTmV3KDEpKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnLmdldCgpLCAwLCByZXQucmVsZWFzZSgpKTsKKyAgICAgIHJldC5yZXNldChQeU9iamVjdF9DYWxsT2JqZWN0KGNscy5nZXQoKSwgYXJnLmdldCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldC5yZWxlYXNlKCk7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVhZFN0cnVjdChQeV9Ob25lLCBwYXJzZWRhcmdzLmtsYXNzLCBwYXJzZWRhcmdzLnNwZWMpOworICB9CisKKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVVRGMTY6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVTY0OgorICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIGZvciBkZWNvZGVWYWx1ZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OnJlYWRTdHJ1Y3QoUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIGtsYXNzLCBQeU9iamVjdCogc3BlY19zZXEpIHsKKyAgaW50IHNwZWNfc2VxX2xlbiA9IFB5VHVwbGVfU2l6ZShzcGVjX3NlcSk7CisgIGJvb2wgaW1tdXRhYmxlID0gb3V0cHV0ID09IFB5X05vbmU7CisgIFNjb3BlZFB5T2JqZWN0IGt3YXJnczsKKyAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGltbXV0YWJsZSkgeworICAgIGt3YXJncy5yZXNldChQeURpY3RfTmV3KCkpOworICAgIGlmICgha3dhcmdzKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmFpbGVkIHRvIHByZXBhcmUga3dhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICBkZXRhaWw6OlJlYWRTdHJ1Y3RTY29wZTxJbXBsPiBzY29wZSA9IGRldGFpbDo6cmVhZFN0cnVjdFNjb3BlKHRoaXMpOworICBpZiAoIXNjb3BlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBUVHlwZSB0eXBlID0gVF9TVE9QOworICAgIGludDE2X3QgdGFnOworICAgIGlmICghaW1wbCgpLT5yZWFkRmllbGRCZWdpbih0eXBlLCB0YWcpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHRhZyA8IDAgfHwgdGFnID49IHNwZWNfc2VxX2xlbikgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgUHlPYmplY3QqIGl0ZW1fc3BlYyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY19zZXEsIHRhZyk7CisgICAgaWYgKGl0ZW1fc3BlYyA9PSBQeV9Ob25lKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkVycm9yIHdoaWxlIHNraXBwaW5nIHVua25vd24gZmllbGQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIGl0ZW1fc3BlYykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGFyc2Vkc3BlYy50eXBlICE9IHR5cGUpIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcnNlZHNwZWMudHlwZSwgdHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgU2NvcGVkUHlPYmplY3QgZmllbGR2YWwoZGVjb2RlVmFsdWUocGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKSk7CisgICAgaWYgKCFmaWVsZHZhbCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKChpbW11dGFibGUgJiYgUHlEaWN0X1NldEl0ZW0oa3dhcmdzLmdldCgpLCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbC5nZXQoKSkgPT0gLTEpCisgICAgICAgIHx8ICghaW1tdXRhYmxlICYmIFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbC5nZXQoKSkgPT0gLTEpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKGltbXV0YWJsZSkgeworICAgIFNjb3BlZFB5T2JqZWN0IGFyZ3MoUHlUdXBsZV9OZXcoMCkpOworICAgIGlmICghYXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGFyZ3VtZW50IHN0b3JhZ2UiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbChrbGFzcywgYXJncy5nZXQoKSwga3dhcmdzLmdldCgpKTsKKyAgfQorICBQeV9JTkNSRUYob3V0cHV0KTsKKyAgcmV0dXJuIG91dHB1dDsKK30KK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDQzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC90eXBlcy5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC90eXBlcy5oIgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworUHlPYmplY3QqIFRocmlmdE1vZHVsZSA9IE5VTEw7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworY2hhciByZWZpbGxfc2lnbmF0dXJlW10gPSB7J3MnLCAnIycsICdpJ307CisjZWxzZQorY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZSA9ICJ5I2kiOworI2VuZGlmCisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpIHsKKyAgLy8gaSdkIGxpa2UgdG8gdXNlIFBhcnNlQXJncyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgYSBib3R0bGVuZWNrLgorICBpZiAoUHlUdXBsZV9TaXplKHNwZWNfdHVwbGUpICE9IDUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciBzcGVjIHR1cGxlIGJ1dCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnRhZyA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnR5cGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+YXR0cm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDIpOworICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMyk7CisgIGRlc3QtPmRlZnZhbCA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgNCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhcnNlX3NldF9saXN0X2FyZ3MoU2V0TGlzdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAzIGZvciBsaXN0L3NldCB0eXBlIGFyZ3MiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5lbGVtZW50X3R5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKworICBkZXN0LT5pbW11dGFibGUgPSBQeV9UcnVlID09IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNSBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmt0YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5rdGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnZ0YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT52dGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmt0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOworICBkZXN0LT52dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAzKTsKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCA0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeUxpc3RfU2l6ZSh0eXBlYXJncykgIT0gMikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgbGlzdCBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+a2xhc3MgPSBQeUxpc3RfR0VUX0lURU0odHlwZWFyZ3MsIDApOworICBkZXN0LT5zcGVjID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKworICByZXR1cm4gdHJ1ZTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmggYi9saWIvcHkvc3JjL2V4dC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDhkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC90eXBlcy5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX1RZUEVTX0gKKyNkZWZpbmUgVEhSSUZUX1BZX1RZUEVTX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gVE9ETzogYmV0dGVyIG1hY3JvcworI2RlZmluZSBQeUludF9Bc0xvbmcodikgUHlMb25nX0FzTG9uZyh2KQorI2RlZmluZSBQeUludF9Gcm9tTG9uZyh2KSBQeUxvbmdfRnJvbUxvbmcodikKKworI2RlZmluZSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHYpIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKHYpCisKKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTl9TVFJJTkcodmFsdWUpIF9pbnRlcm5fIyN2YWx1ZQorCisjZGVmaW5lIElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpICgoKHYpID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorCitleHRlcm4gIkMiIHsKK2V4dGVybiBQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitleHRlcm4gUHlPYmplY3QqIFRocmlmdE1vZHVsZTsKKworLy8gU3RvbGVuIG91dCBvZiBUUHJvdG9jb2wuaC4KKy8vIEl0IHdvdWxkIGJlIGEgaHVnZSBwYWluIHRvIGhhdmUgYm90aCBnZXQgdGhpcyBmcm9tIG9uZSBwbGFjZS4KK2VudW0gVFR5cGUgeworICBUX0lOVkFMSUQgPSAtMSwKKyAgVF9TVE9QID0gMCwKKyAgVF9WT0lEID0gMSwKKyAgVF9CT09MID0gMiwKKyAgVF9CWVRFID0gMywKKyAgVF9JMDggPSAzLAorICBUX0kxNiA9IDYsCisgIFRfSTMyID0gOCwKKyAgVF9VNjQgPSA5LAorICBUX0k2NCA9IDEwLAorICBUX0RPVUJMRSA9IDQsCisgIFRfU1RSSU5HID0gMTEsCisgIFRfVVRGNyA9IDExLAorICBUX1NUUlVDVCA9IDEyLAorICBUX01BUCA9IDEzLAorICBUX1NFVCA9IDE0LAorICBUX0xJU1QgPSAxNSwKKyAgVF9VVEY4ID0gMTYsCisgIFRfVVRGMTYgPSAxNworfTsKKworLy8gcmVwbGFjZSB3aXRoIHVuaXF1ZV9wdHIgd2hlbiB3ZSdyZSBPSyB3aXRoIEMrKzExCitjbGFzcyBTY29wZWRQeU9iamVjdCB7CitwdWJsaWM6CisgIFNjb3BlZFB5T2JqZWN0KCkgOiBvYmpfKE5VTEwpIHt9CisgIGV4cGxpY2l0IFNjb3BlZFB5T2JqZWN0KFB5T2JqZWN0KiBweV9vYmplY3QpIDogb2JqXyhweV9vYmplY3QpIHt9CisgIH5TY29wZWRQeU9iamVjdCgpIHsKKyAgICBpZiAob2JqXykKKyAgICAgIFB5X0RFQ1JFRihvYmpfKTsKKyAgfQorICBQeU9iamVjdCogZ2V0KCkgdGhyb3coKSB7IHJldHVybiBvYmpfOyB9CisgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBvYmpfOyB9CisgIHZvaWQgcmVzZXQoUHlPYmplY3QqIHB5X29iamVjdCkgdGhyb3coKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgICAgb2JqXyA9IHB5X29iamVjdDsKKyAgfQorICBQeU9iamVjdCogcmVsZWFzZSgpIHRocm93KCkgeworICAgIFB5T2JqZWN0KiB0bXAgPSBvYmpfOworICAgIG9ial8gPSBOVUxMOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgdm9pZCBzd2FwKFNjb3BlZFB5T2JqZWN0JiBvdGhlcikgdGhyb3coKSB7CisgICAgU2NvcGVkUHlPYmplY3QgdG1wKG90aGVyLnJlbGVhc2UoKSk7CisgICAgb3RoZXIucmVzZXQocmVsZWFzZSgpKTsKKyAgICByZXNldCh0bXAucmVsZWFzZSgpKTsKKyAgfQorCitwcml2YXRlOgorICBTY29wZWRQeU9iamVjdChjb25zdCBTY29wZWRQeU9iamVjdCYpIHt9CisgIFNjb3BlZFB5T2JqZWN0JiBvcGVyYXRvcj0oY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7IHJldHVybiAqdGhpczsgfQorCisgIFB5T2JqZWN0KiBvYmpfOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSB0d28ga2V5IGF0dHJpYnV0ZXMgb2YgYSBDUmVhZGFibGVUcmFuc3BvcnQsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeU9iamVjdF9HZXRBdHRyLgorICovCitzdHJ1Y3QgRGVjb2RlQnVmZmVyIHsKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWY7CisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZTsKK307CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworZXh0ZXJuIGNoYXIgcmVmaWxsX3NpZ25hdHVyZVszXTsKK3R5cGVkZWYgUHlPYmplY3QgRW5jb2RlQnVmZmVyOworI2Vsc2UKK2V4dGVybiBjb25zdCBjaGFyKiByZWZpbGxfc2lnbmF0dXJlOworc3RydWN0IEVuY29kZUJ1ZmZlciB7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKKyAgc2l6ZV90IHBvczsKK307CisjZW5kaWYKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU2V0TGlzdFR5cGVBcmdzIHsKKyAgVFR5cGUgZWxlbWVudF90eXBlOworICBQeU9iamVjdCogdHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgbWFwLAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IE1hcFR5cGVBcmdzIHsKKyAgVFR5cGUga3RhZzsKKyAgVFR5cGUgdnRhZzsKKyAgUHlPYmplY3QqIGt0eXBlYXJnczsKKyAgUHlPYmplY3QqIHZ0eXBlYXJnczsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzdHJ1Y3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0VHlwZUFyZ3MgeworICBQeU9iamVjdCoga2xhc3M7CisgIFB5T2JqZWN0KiBzcGVjOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBTdHJ1Y3RJdGVtU3BlYyB7CisgIGludCB0YWc7CisgIFRUeXBlIHR5cGU7CisgIFB5T2JqZWN0KiBhdHRybmFtZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBQeU9iamVjdCogZGVmdmFsOworfTsKKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSk7Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlMWIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKQEAgLTAsMCArMSw4MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCisKK2NsYXNzIFRCYXNlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOgorICAgICAgICAgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgb3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikKKyAgICAgICAgICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworICAgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBpZiAob3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIG9wcm90LnRyYW5zLndyaXRlKAorICAgICAgICAgICAgICAgIG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisKKworY2xhc3MgVEV4Y2VwdGlvbkJhc2UoVEJhc2UsIEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIFRGcm96ZW5CYXNlKFRCYXNlKToKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBzdHJ1Y3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaChzZWxmLl9fc2xvdHNfXykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWFkKGNscywgaXByb3QpOgorICAgICAgICBpZiAoaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKKyAgICAgICAgICAgICAgICBjbHMudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZiA9IGNscygpCisgICAgICAgICAgICByZXR1cm4gaXByb3QuX2Zhc3RfZGVjb2RlKE5vbmUsIGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGlwcm90LnJlYWRTdHJ1Y3QoY2xzLCBjbHMudGhyaWZ0X3NwZWMsIFRydWUpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CmluZGV4IDUwYzZhYTguLmY2YmU3NzIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CkBAIC0xNywyNDMgKzE3LDI4NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0ICoKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbgogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCisKIGNsYXNzIFRCaW5hcnlQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKKyAgICAiIiJCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorICAgICMgTmFzdHlIYXh4LiBQeXRob24gMi40KyBvbiAzMi1iaXQgbWFjaGluZXMgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKKyAgICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKKyAgICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KIAotICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCi0gICMgcG9zaXRpdmUsIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgbG9uZy4gSWYgd2UgaGFyZGNvZGUgdGhlIGludCB2YWx1ZQotICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KKyAgICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKIAotICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKLSAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CisgICAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCisgICAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKIAotICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKLSAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKKyAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmCiAKLSAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSwgKiprd2FyZ3MpOgorICAgICAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQorICAgICAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdzdHJpbmdfbGVuZ3RoX2xpbWl0JywgTm9uZSkKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnY29udGFpbmVyX2xlbmd0aF9saW1pdCcsIE5vbmUpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKLSAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICBkZWYgX2NoZWNrX3N0cmluZ19sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgaWYgc2VsZi5zdHJpY3RXcml0ZToKLSAgICAgIHNlbGYud3JpdGVJMzIoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB8IHR5cGUpCi0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICBkZWYgX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6CisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCi0gICAgc2VsZi53cml0ZUkxNihpZCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMTYoaWQpCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYud3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShrdHlwZSkKLSAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKQogCi0gIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCisgICAgICAgIHNlbGYud3JpdGVCeXRlKHZ0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIGJvb2w6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgxKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKKyAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHNlbGYud3JpdGVJMzIobGVuKHN0cikpCi0gICAgc2VsZi50cmFucy53cml0ZShzdHIpCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHN6ID0gc2VsZi5yZWFkSTMyKCkKLSAgICBpZiBzeiA8IDA6Ci0gICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCi0gICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKLSAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKLSAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQotICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQotICAgIGVsc2U6Ci0gICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQotICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKLSAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cikKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBzeiA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGlmIHN6IDwgMDoKKyAgICAgICAgICAgIHZlcnNpb24gPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sKKyAgICAgICAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAlZCcgJSAoc3opKQorICAgICAgICAgICAgdHlwZSA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlRZUEVfTUFTSworICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cmluZygpCisgICAgICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlcicpCisgICAgICAgICAgICBuYW1lID0gc2VsZi50cmFucy5yZWFkQWxsKHN6KQorICAgICAgICAgICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIDApCi0gICAgaWQgPSBzZWxmLnJlYWRJMTYoKQotICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQorICAgICAgICBpZCA9IHNlbGYucmVhZEkxNigpCisgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKLSAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoZXR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgYnl0ZSA9PSAwOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCi0gICAgdmFsLCA9IHVucGFjaygnIWInLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGJ5dGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgYnl0ZSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQotICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoNCkKLSAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDIpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFpJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFxJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIGxlbiA9IHNlbGYucmVhZEkzMigpCi0gICAgc3RyID0gc2VsZi50cmFucy5yZWFkQWxsKGxlbikKLSAgICByZXR1cm4gc3RyCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcyA9IHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgICAgICByZXR1cm4gcwogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlKQotICAgIHJldHVybiBwcm90CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9c2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0KQorICAgICAgICByZXR1cm4gcHJvdAogCiAKIGNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKFRCaW5hcnlQcm90b2NvbCk6CisgICAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVEJpbmFyeVByb3RvY29sLgorICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKKyAgICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKKyAgICByZWFzb24uICAoVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgaGFwcGVuIHNhbmVseSBpbiBtb3JlIGNhc2VzLikKKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCiAKLSAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKLSAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bwotICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCi0gIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAotICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKLSAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQorICAgIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgogCi0gIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKLSAgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQmluYXJ5UHJvdG9jb2wuCisgICAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgorICAgICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCisgICAgICAgICAgIGJ1dCB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcHJvZHVjdGlvbi1yZWFkeS4KKyAgICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCisgICAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgorICAgICIiIgorICAgIHBhc3MKIAotICBOT1RFOiAgVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBhbiBleHRlcm5hbCBkZXZlbG9wZXIuCi0gICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCi0gICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCi0gICAgICAgICBQbGVhc2UgZmVlbCBmcmVlIHRvIHJlcG9ydCBidWdzIGFuZC9vciBzdWNjZXNzIHN0b3JpZXMKLSAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgotICAiIiIKLQotICBwYXNzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZhbGxiYWNrID0ga3dhcmdzLnBvcCgnZmFsbGJhY2snLCBUcnVlKQorICAgICAgICBzdXBlcihUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5CisgICAgICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeQogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeToKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnMpCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NWNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQpAQCAtMCwwICsxLDQ3NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbiwgY2hlY2tJbnRlZ2VyTGltaXRzCitmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCisKK2Zyb20gLi5jb21wYXQgaW1wb3J0IGJpbmFyeV90b19zdHIsIHN0cl90b19iaW5hcnkKKworX19hbGxfXyA9IFsnVENvbXBhY3RQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSddCisKK0NMRUFSID0gMAorRklFTERfV1JJVEUgPSAxCitWQUxVRV9XUklURSA9IDIKK0NPTlRBSU5FUl9XUklURSA9IDMKK0JPT0xfV1JJVEUgPSA0CitGSUVMRF9SRUFEID0gNQorQ09OVEFJTkVSX1JFQUQgPSA2CitWQUxVRV9SRUFEID0gNworQk9PTF9SRUFEID0gOAorCisKK2RlZiBtYWtlX2hlbHBlcih2X2Zyb20sIGNvbnRhaW5lcik6CisgICAgZGVmIGhlbHBlcihmdW5jKToKKyAgICAgICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gbmVzdGVkCisgICAgcmV0dXJuIGhlbHBlcgorCisKK3dyaXRlciA9IG1ha2VfaGVscGVyKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpCityZWFkZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCkKKworCitkZWYgbWFrZVppZ1phZyhuLCBiaXRzKToKKyAgICBjaGVja0ludGVnZXJMaW1pdHMobiwgYml0cykKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAoYml0cyAtIDEpKQorCisKK2RlZiBmcm9tWmlnWmFnKG4pOgorICAgIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpCisKKworZGVmIHdyaXRlVmFyaW50KHRyYW5zLCBuKToKKyAgICBvdXQgPSBieXRlYXJyYXkoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGlmIG4gJiB+MHg3ZiA9PSAwOgorICAgICAgICAgICAgb3V0LmFwcGVuZChuKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dC5hcHBlbmQoKG4gJiAweGZmKSB8IDB4ODApCisgICAgICAgICAgICBuID0gbiA+PiA3CisgICAgdHJhbnMud3JpdGUoYnl0ZXMob3V0KSkKKworCitkZWYgcmVhZFZhcmludCh0cmFucyk6CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHggPSB0cmFucy5yZWFkQWxsKDEpCisgICAgICAgIGJ5dGUgPSBvcmQoeCkKKyAgICAgICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQKKyAgICAgICAgaWYgYnl0ZSA+PiA3ID09IDA6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHNoaWZ0ICs9IDcKKworCitjbGFzcyBDb21wYWN0VHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAweDAwCisgICAgVFJVRSA9IDB4MDEKKyAgICBGQUxTRSA9IDB4MDIKKyAgICBCWVRFID0gMHgwMworICAgIEkxNiA9IDB4MDQKKyAgICBJMzIgPSAweDA1CisgICAgSTY0ID0gMHgwNgorICAgIERPVUJMRSA9IDB4MDcKKyAgICBCSU5BUlkgPSAweDA4CisgICAgTElTVCA9IDB4MDkKKyAgICBTRVQgPSAweDBBCisgICAgTUFQID0gMHgwQgorICAgIFNUUlVDVCA9IDB4MEMKKworCitDVFlQRVMgPSB7CisgICAgVFR5cGUuU1RPUDogQ29tcGFjdFR5cGUuU1RPUCwKKyAgICBUVHlwZS5CT09MOiBDb21wYWN0VHlwZS5UUlVFLCAgIyB1c2VkIGZvciBjb2xsZWN0aW9uCisgICAgVFR5cGUuQllURTogQ29tcGFjdFR5cGUuQllURSwKKyAgICBUVHlwZS5JMTY6IENvbXBhY3RUeXBlLkkxNiwKKyAgICBUVHlwZS5JMzI6IENvbXBhY3RUeXBlLkkzMiwKKyAgICBUVHlwZS5JNjQ6IENvbXBhY3RUeXBlLkk2NCwKKyAgICBUVHlwZS5ET1VCTEU6IENvbXBhY3RUeXBlLkRPVUJMRSwKKyAgICBUVHlwZS5TVFJJTkc6IENvbXBhY3RUeXBlLkJJTkFSWSwKKyAgICBUVHlwZS5TVFJVQ1Q6IENvbXBhY3RUeXBlLlNUUlVDVCwKKyAgICBUVHlwZS5MSVNUOiBDb21wYWN0VHlwZS5MSVNULAorICAgIFRUeXBlLlNFVDogQ29tcGFjdFR5cGUuU0VULAorICAgIFRUeXBlLk1BUDogQ29tcGFjdFR5cGUuTUFQLAorfQorCitUVFlQRVMgPSB7fQorZm9yIGssIHYgaW4gQ1RZUEVTLml0ZW1zKCk6CisgICAgVFRZUEVTW3ZdID0gaworVFRZUEVTW0NvbXBhY3RUeXBlLkZBTFNFXSA9IFRUeXBlLkJPT0wKK2RlbCBrCitkZWwgdgorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2woVFByb3RvY29sQmFzZSk6CisgICAgIiIiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKworICAgIFBST1RPQ09MX0lEID0gMHg4MgorICAgIFZFUlNJT04gPSAxCisgICAgVkVSU0lPTl9NQVNLID0gMHgxZgorICAgIFRZUEVfTUFTSyA9IDB4ZTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQorICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMgPSBbXQorICAgICAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKKworICAgIGRlZiBfY2hlY2tfY29udGFpbmVyX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCisKKyAgICBkZWYgX193cml0ZVZhcmludChzZWxmLCBuKToKKyAgICAgICAgd3JpdGVWYXJpbnQoc2VsZi50cmFucywgbikKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuUFJPVE9DT0xfSUQpCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuVkVSU0lPTiB8ICh0eXBlIDw8IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpKQorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQoc2VxaWQpCisgICAgICAgIHNlbGYuX193cml0ZUJpbmFyeShzdHJfdG9fYmluYXJ5KG5hbWUpKQorICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IFZBTFVFX1dSSVRFCisgICAgICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1dSSVRFLCBWQUxVRV9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCisKKyAgICBkZWYgX193cml0ZUZpZWxkSGVhZGVyKHNlbGYsIHR5cGUsIGZpZCk6CisgICAgICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCisgICAgICAgIGlmIDAgPCBkZWx0YSA8PSAxNToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKGRlbHRhIDw8IDQgfCB0eXBlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlSTE2KGZpZCkKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGZpZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1dSSVRFCisgICAgICAgICAgICBzZWxmLl9fYm9vbF9maWQgPSBmaWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoQ1RZUEVTW3R5cGVdLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBCT09MX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKKworICAgIGRlZiBfX3dyaXRlVUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIUInLCBieXRlKSkKKworICAgIGRlZiBfX3dyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchYicsIGJ5dGUpKQorCisgICAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCisKKyAgICBkZWYgX193cml0ZVNpemUoc2VsZiwgaTMyKToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KGkzMikKKworICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiBzaXplIDw9IDE0OgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKDB4ZjAgfCBDVFlQRVNbZXR5cGVdKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorICAgIHdyaXRlU2V0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiBzaXplID09IDA6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShDVFlQRVNba3R5cGVdIDw8IDQgfCBDVFlQRVNbdnR5cGVdKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorCisgICAgZGVmIHdyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHdyaXRlTWFwRW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVTZXRFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKKyAgICAgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuRkFMU0UKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuVFJVRSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiKQorCisgICAgd3JpdGVCeXRlID0gd3JpdGVyKF9fd3JpdGVCeXRlKQorICAgIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCisKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQorCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpNjQsIDY0KSkKKworICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCisKKyAgICBkZWYgX193cml0ZUJpbmFyeShzZWxmLCBzKToKKyAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShsZW4ocykpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocykKKyAgICB3cml0ZUJpbmFyeSA9IHdyaXRlcihfX3dyaXRlQmluYXJ5KQorCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFELCBzZWxmLnN0YXRlCisgICAgICAgIHR5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgaWYgdHlwZSAmIDB4MGYgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgMCwgMCkKKyAgICAgICAgZGVsdGEgPSB0eXBlID4+IDQKKyAgICAgICAgaWYgZGVsdGEgPT0gMDoKKyAgICAgICAgICAgIGZpZCA9IHNlbGYuX19yZWFkSTE2KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpZCA9IHNlbGYuX19sYXN0X2ZpZCArIGRlbHRhCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAorICAgICAgICB0eXBlID0gdHlwZSAmIDB4MGYKKyAgICAgICAgaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5UUlVFOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBUcnVlCisgICAgICAgIGVsaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5GQUxTRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9SRUFECisgICAgICAgIHJldHVybiAoTm9uZSwgc2VsZi5fX2dldFRUeXBlKHR5cGUpLCBmaWQpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorCisgICAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJlc3VsdCwgPSB1bnBhY2soJyFiJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19yZWFkVmFyaW50KHNlbGYpOgorICAgICAgICByZXR1cm4gcmVhZFZhcmludChzZWxmLnRyYW5zKQorCisgICAgZGVmIF9fcmVhZFppZ1phZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKKworICAgIGRlZiBfX3JlYWRTaXplKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgaWYgcHJvdG9faWQgIT0gc2VsZi5QUk9UT0NPTF9JRDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBwcm90b2NvbCBpZCBpbiB0aGUgbWVzc2FnZTogJWQnICUgcHJvdG9faWQpCisgICAgICAgIHZlcl90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHR5cGUgPSAodmVyX3R5cGUgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkgJiBzZWxmLlRZUEVfQklUUworICAgICAgICB2ZXJzaW9uID0gdmVyX3R5cGUgJiBzZWxmLlZFUlNJT05fTUFTSworICAgICAgICBpZiB2ZXJzaW9uICE9IHNlbGYuVkVSU0lPTjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCB2ZXJzaW9uOiAlZCAoZXhwZWN0ICVkKScgJSAodmVyc2lvbiwgc2VsZi5WRVJTSU9OKSkKKyAgICAgICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgIG5hbWUgPSBiaW5hcnlfdG9fc3RyKHNlbGYuX19yZWFkQmluYXJ5KCkpCisgICAgICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5fX3N0cnVjdHMpID09IDAKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1JFQUQsIFZBTFVFX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAorCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKKworICAgIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNpemVfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKKyAgICAgICAgdHlwZSA9IHNlbGYuX19nZXRUVHlwZShzaXplX3R5cGUpCisgICAgICAgIGlmIHNpemUgPT0gMTU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECisgICAgICAgIHJldHVybiB0eXBlLCBzaXplCisgICAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHR5cGVzID0gMAorICAgICAgICBpZiBzaXplID4gMDoKKyAgICAgICAgICAgIHR5cGVzID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHZ0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzKQorICAgICAgICBrdHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcyA+PiA0KQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECisgICAgICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZE1hcEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19ib29sX3ZhbHVlID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkQnl0ZSgpID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2w6ICVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlKQorCisgICAgcmVhZEJ5dGUgPSByZWFkZXIoX19yZWFkQnl0ZSkKKyAgICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKKyAgICByZWFkSTE2ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTMyID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKworICAgIEByZWFkZXIKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCc8ZCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBfX3JlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICByZWFkQmluYXJ5ID0gcmVhZGVyKF9fcmVhZEJpbmFyeSkKKworICAgIGRlZiBfX2dldFRUeXBlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQpCisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKFRDb21wYWN0UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQ29tcGFjdFByb3RvY29sLgorCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVENvbXBhY3RQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVENvbXBhY3RQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVENvbXBhY3RQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4KKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCisKKyAgICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCisgICAgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVENvbXBhY3RQcm90b2NvbC4KKyAgICAiIiIKKyAgICBwYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfY29tcGFjdAorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9jb21wYWN0CisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2E3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpAQCAtMCwwICsxLDIyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USGVhZGVyVHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0LCBUSGVhZGVyU3VicHJvdG9jb2xJRCwgVEhlYWRlckNsaWVudFR5cGUKKworCitQUk9UT0NPTFNfQllfSUQgPSB7CisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZOiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUOiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsCit9CisKKworY2xhc3MgVEhlYWRlclByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkEgZnJhbWVkIHByb3RvY29sIHdpdGggaGVhZGVycyBhbmQgcGF5bG9hZCB0cmFuc2Zvcm1zLgorCisgICAgVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIG9wdGlvbmFsCisgICAgb3V0LW9mLWJhbmQgaGVhZGVycy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3VicHJvdG9jb2xzIGFyZQorICAgIFRCaW5hcnlQcm90b2NvbCBhbmQgVENvbXBhY3RQcm90b2NvbC4KKworICAgIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBlbmNvZGVkIG1lc3NhZ2UgcGF5bG9hZC4gVGhlCisgICAgb25seSB0cmFuc2Zvcm0gY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0byBnemlwLgorCisgICAgV2hlbiB1c2VkIGluIGEgc2VydmVyLCBUSGVhZGVyUHJvdG9jb2wgY2FuIGFjY2VwdCBtZXNzYWdlcyBmcm9tCisgICAgbm9uLVRIZWFkZXJQcm90b2NvbCBjbGllbnRzIGlmIGFsbG93ZWQgKHNlZSBgYWxsb3dlZF9jbGllbnRfdHlwZXNgKS4gVGhpcworICAgIGluY2x1ZGVzIGZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhbmQgYm90aCBUQmluYXJ5UHJvdG9jb2wgYW5kCisgICAgVENvbXBhY3RQcm90b2NvbC4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxlY3QgZm9yCisgICAgdGhlIGNvbm5lY3RlZCBjbGllbnQuIEhUVFAgY2xpZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgVEhUVFBTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwKKyAgICBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisKKyAgICBTZWUgZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBmb3IgZGV0YWlscyBvZiB0aGUgd2lyZSBmb3JtYXQuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgIyBtdWNoIG9mIHRoZSBhY3R1YWwgd29yayBmb3IgVEhlYWRlclByb3RvY29sIGhhcHBlbnMgZG93biBpbgorICAgICAgICAjIFRIZWFkZXJUcmFuc3BvcnQgc2luY2Ugd2UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgc2hlbmFuaWdhbnMgdG8gZGV0ZWN0CisgICAgICAgICMgaWYgdGhlIGNsaWVudCBpcyBzZW5kaW5nIHVzIGhlYWRlcnMgb3Igb25lIG9mIHRoZSBoZWFkZXJsZXNzIGZvcm1hdHMKKyAgICAgICAgIyB3ZSBzdXBwb3J0LiB0aGlzIHdyYXBzIHRoZSByZWFsIHRyYW5zcG9ydCB3aXRoIHRoZSBvbmUgdGhhdCBkb2VzIGFsbAorICAgICAgICAjIHRoZSBtYWdpYy4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHJhbnNwb3J0LCBUSGVhZGVyVHJhbnNwb3J0KToKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IFRIZWFkZXJUcmFuc3BvcnQodHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcykKKyAgICAgICAgc3VwZXIoVEhlYWRlclByb3RvY29sLCBzZWxmKS5fX2luaXRfXyh0cmFuc3BvcnQpCisgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLmdldF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRyYW5zLnNldF9oZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zLmNsZWFyX2hlYWRlcnMoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgc2VsZi50cmFucy5hZGRfdHJhbnNmb3JtKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnRyYW5zLnNlcXVlbmNlX2lkID0gc2VxaWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpCisKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRFbmQoKQorCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJvb2woYm9vbF92YWwpCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCeXRlKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTE2KGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMzIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUk2NChpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRG91YmxlKGR1YikKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQmluYXJ5KHN0cl92YWwpCisKKyAgICBkZWYgX3NldF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvdG9jb2xfY2xzID0gUFJPVE9DT0xTX0JZX0lEW3NlbGYudHJhbnMucHJvdG9jb2xfaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sX2NscyhzZWxmLnRyYW5zKQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2VuY29kZQorICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2RlY29kZQorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHJhbnMucmVhZEZyYW1lKDApCisgICAgICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKGIiIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgMCkKKyAgICAgICAgICAgIGV4Yy53cml0ZShzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgICAgICBzZWxmLnRyYW5zLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwRW5kKCkKKworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEVuZCgpCisKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEVuZCgpCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQm9vbCgpCisKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQnl0ZSgpCisKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMTYoKQorCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTMyKCkKKworICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEk2NCgpCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWREb3VibGUoKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQmluYXJ5KCkKKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWRfY2xpZW50X3R5cGVzPShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLCkpOgorICAgICAgICBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMDk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQpAQCAtMCwwICsxLDY3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMpCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgbWF0aAoraW1wb3J0IHN5cworCitmcm9tIC4uY29tcGF0IGltcG9ydCBzdHJfdG9fYmluYXJ5CisKKworX19hbGxfXyA9IFsnVEpTT05Qcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sRmFjdG9yeScsCisgICAgICAgICAgICdUU2ltcGxlSlNPTlByb3RvY29sJywKKyAgICAgICAgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5J10KKworVkVSU0lPTiA9IDEKKworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJworCitFU0NTRVEwID0gb3JkKCdcXCcpCitFU0NTRVExID0gb3JkKCd1JykKK0VTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgJyInOiAnXFwiJywKKyAgICAnXFwnOiAnXFxcXCcsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgIyAnLyc6ICdcXC8nLAorfQorRVNDQVBFX0NIQVJTID0geworICAgIGInIic6ICciJywKKyAgICBiJ1xcJzogJ1xcJywKKyAgICBiJ2InOiAnXGInLAorICAgIGInZic6ICdcZicsCisgICAgYiduJzogJ1xuJywKKyAgICBiJ3InOiAnXHInLAorICAgIGIndCc6ICdcdCcsCisgICAgYicvJzogJy8nLAorfQorTlVNRVJJQ19DSEFSID0gYicrLS4wMTIzNDU2Nzg5RWUnCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQorCitKVFlQRVMgPSB7fQorZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgorICAgIEpUWVBFU1tDVFlQRVNba2V5XV0gPSBrZXkKKworCitjbGFzcyBKU09OQmFzZUNvbnRleHQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLmZpcnN0ID0gVHJ1ZQorCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCitjbGFzcyBKU09OTGlzdENvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT01NQSkKKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorCisKK2NsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc3VwZXIoSlNPTlBhaXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXyhwcm90b2NvbCkKKyAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC5yZWFkSlNPTlN5bnRheENoYXIpCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKKyAgICBoYXNEYXRhID0gRmFsc2UKKyAgICBkYXRhID0gJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisKKyAgICAjIFdlIGRvbid0IGhhdmUgbGVuZ3RoIGxpbWl0IGltcGxlbWVudGF0aW9uIGZvciBKU09OIHByb3RvY29scworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVzZXRXcml0ZUNvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorICAgICAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisKKyAgICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZGVyID0gTG9va2FoZWFkUmVhZGVyKHNlbGYpCisKKyAgICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2suYXBwZW5kKGN0eCkKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY3R4CisKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorCisgICAgZGVmIHdyaXRlSlNPTlN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBqc29uX3N0ciA9IFsnIiddCisgICAgICAgIGZvciBzIGluIHN0cmluZzoKKyAgICAgICAgICAgIGVzY2FwZWQgPSBFU0NBUEVfQ0hBUl9WQUxTLmdldChzLCBzKQorICAgICAgICAgICAganNvbl9zdHIuYXBwZW5kKGVzY2FwZWQpCisgICAgICAgIGpzb25fc3RyLmFwcGVuZCgnIicpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoc3RyX3RvX2JpbmFyeSgnJy5qb2luKGpzb25fc3RyKSkpCisKKyAgICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlciwgZm9ybWF0dGVyPSd7MH0nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNOdW1iZXIgPSBzdHIoZm9ybWF0dGVyLmZvcm1hdChudW1iZXIpKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKKworICAgIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNFKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDS0VUKQorCisgICAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICBjdXJyZW50ID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgIGlmIGNoYXJhY3RlciAhPSBjdXJyZW50OgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAlcyIgJSBjdXJyZW50KQorCisgICAgZGVmIF9pc0hpZ2hTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkODAwIGFuZCBjb2RldW5pdCA8PSAweGRiZmYKKworICAgIGRlZiBfaXNMb3dTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkYzAwIGFuZCBjb2RldW5pdCA8PSAweGRmZmYKKworICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCisKKyAgICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgorICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICBzdHJpbmcgPSBbXQorICAgICAgICBpZiBza2lwQ29udGV4dCBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgIGlmIGNoYXJhY3RlciA9PSBRVU9URToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMDoKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBvcmQoY2hhcmFjdGVyKSA9PSBFU0NTRVExOgorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnRyYW5zLnJlYWQoNCkuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0ID0gaW50KGNoYXJhY3RlciwgMTYpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzSGlnaFN1cnJvZ2F0ZShjb2RldW5pdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gY29kZXVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5faXNMb3dTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLl90b0NoYXIoaGlnaFN1cnJvZ2F0ZSwgY29kZXVuaXQpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGNvZGV1bml0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXJhY3RlciBub3QgaW4gRVNDQVBFX0NIQVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSU1tjaGFyYWN0ZXJdCisgICAgICAgICAgICBlbGlmIGNoYXJhY3RlciBpbiBFU0NBUEVfQ0hBUl9WQUxTOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5lc2NhcGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOgorICAgICAgICAgICAgICAgIHV0ZjhfYnl0ZXMgPSBieXRlYXJyYXkoW29yZChjaGFyYWN0ZXIpXSkKKyAgICAgICAgICAgICAgICB3aGlsZSBvcmQoc2VsZi5yZWFkZXIucGVlaygpKSA+PSAweDgwOgorICAgICAgICAgICAgICAgICAgICB1dGY4X2J5dGVzLmFwcGVuZChvcmQoc2VsZi5yZWFkZXIucmVhZCgpKSkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB1dGY4X2J5dGVzLmRlY29kZSgndXRmOCcpCisgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGNoYXJhY3RlcikKKworICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKKworICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorCisgICAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgorICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQorCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICB0dHlwZSA9IDAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIGlmIGNoYXJhY3RlciA9PSBSQlJBQ0U6CisgICAgICAgICAgICB0dHlwZSA9IFRUeXBlLlNUT1AKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBrZXlUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gKEZhbHNlIGlmIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkgPT0gMCBlbHNlIFRydWUpCisKKyAgICBkZWYgcmVhZE51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKKyAgICByZWFkSTE2ID0gcmVhZE51bWJlcgorICAgIHJlYWRJMzIgPSByZWFkTnVtYmVyCisgICAgcmVhZEk2NCA9IHJlYWROdW1iZXIKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkRvdWJsZSgpCisKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05CYXNlNjQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoVkVSU0lPTikKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1trdHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMTYsIDE2KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6CisgICAgICAgICMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIHNob3VsZCBiZSBqdXN0IGVub3VnaCBmb3IgYW55IGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsLCAnezA6LjE3Z30nKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbCh0cmFucykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisgICAgIiIiU2ltcGxlLCByZWFkYWJsZSwgd3JpdGUtb25seSBKU09OIHByb3RvY29sLgorCisgICAgVXNlZnVsIGZvciBpbnRlcmFjdGluZyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMuCisgICAgIiIiCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKworICAgIGRlZiBfd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB3cml0ZUxpc3RCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEVuZCA9IF93cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZVNldEJlZ2luID0gX3dyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVTZXRFbmQgPSBfd3JpdGVDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoYnl0ZSwgOCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKKworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjgzOTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IKKworU0VQQVJBVE9SID0gIjoiCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6CisgICAgICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKKyAgICAgICAgICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2VxaWQKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggYmUzY2IxNC4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTE3LDE4OSArMTcsNDA0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbiwgVFR5cGUsIFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCitpbXBvcnQgc2l4CitpbXBvcnQgc3lzCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgemlwCisKIAogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkN1c3RvbSBQcm90b2NvbCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBJTlZBTElEX0RBVEEgPSAxCisgICAgTkVHQVRJVkVfU0laRSA9IDIKKyAgICBTSVpFX0xJTUlUID0gMworICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgICBJTlZBTElEX1BST1RPQ09MID0gNwogCi0gIFVOS05PV04gPSAwCi0gIElOVkFMSURfREFUQSA9IDEKLSAgTkVHQVRJVkVfU0laRSA9IDIKLSAgU0laRV9MSU1JVCA9IDMKLSAgQkFEX1ZFUlNJT04gPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQogCi1jbGFzcyBUUHJvdG9jb2xCYXNlOgorY2xhc3MgVFByb3RvY29sQmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gTm9uZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2hlY2tfbGVuZ3RoKGxpbWl0LCBsZW5ndGgpOgorICAgICAgICBpZiBsZW5ndGggPCAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOZWdhdGl2ZSBsZW5ndGg6ICVkJyAlIGxlbmd0aCkKKyAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+IGxpbWl0OgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICVkJyAlIGxpbWl0KQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHNlbGYud3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShzdHJfdmFsKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVVdGY4KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlU3RyaW5nKHN0cl92YWwuZW5jb2RlKCd1dGY4JykpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkxNihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMzIoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBza2lwKHNlbGYsIHR5cGUpOgotICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybgotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5yZWFkQm9vbCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkJZVEU6Ci0gICAgICBzZWxmLnJlYWRCeXRlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTE2OgotICAgICAgc2VsZi5yZWFkSTE2KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgc2VsZi5yZWFkSTMyKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgc2VsZi5yZWFkSTY0KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgc2VsZi5yZWFkRG91YmxlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgc2VsZi5yZWFkU3RyaW5nKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSVUNUOgotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIChuYW1lLCB0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYuc2tpcCh0eXBlKQotICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5NQVA6Ci0gICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKLSAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoa3R5cGUpCi0gICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKLSAgICAgIHNlbGYucmVhZE1hcEVuZCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLlNFVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKLSAgICAgICAgc2VsZi5za2lwKGV0eXBlKQotICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuTElTVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQotICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLWNsYXNzIFRQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gYmluYXJ5X3RvX3N0cihzZWxmLnJlYWRCaW5hcnkoKSkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZFV0Zjgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0ZjgnKQorCisgICAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgorICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYucmVhZEJvb2woKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6CisgICAgICAgICAgICBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6CisgICAgICAgICAgICBzZWxmLnJlYWRJMTYoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgorICAgICAgICAgICAgc2VsZi5yZWFkSTY0KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgICBzZWxmLnJlYWREb3VibGUoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgIHNlbGYucmVhZFN0cmluZygpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGt0eXBlKQorICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZE1hcEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU0VUOgorICAgICAgICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGV0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisKKyAgICAjIHR1cGxlIG9mOiAoICdyZWFkZXIgbWV0aG9kJyBuYW1lLCBpc19jb250YWluZXIgYm9vbCwgJ3dyaXRlcl9tZXRob2QnIG5hbWUgKQorICAgIF9UVFlQRV9IQU5ETEVSUyA9ICgKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMCBUVHlwZS5TVE9QCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPworICAgICAgICAoJ3JlYWRCb29sJywgJ3dyaXRlQm9vbCcsIEZhbHNlKSwgICMgMiBUVHlwZS5CT09MCisgICAgICAgICgncmVhZEJ5dGUnLCAnd3JpdGVCeXRlJywgRmFsc2UpLCAgIyAzIFRUeXBlLkJZVEUgYW5kIEkwOAorICAgICAgICAoJ3JlYWREb3VibGUnLCAnd3JpdGVEb3VibGUnLCBGYWxzZSksICAjIDQgVFR5cGUuRE9VQkxFCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkxNicsICd3cml0ZUkxNicsIEZhbHNlKSwgICMgNiBUVHlwZS5JMTYKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNyB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA5IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJNjQnLCAnd3JpdGVJNjQnLCBGYWxzZSksICAjIDEwIFRUeXBlLkk2NAorICAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNworICAgICAgICAoJ3JlYWRDb250YWluZXJTdHJ1Y3QnLCAnd3JpdGVDb250YWluZXJTdHJ1Y3QnLCBUcnVlKSwgICMgMTIgKi5TVFJVQ1QKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTWFwJywgJ3dyaXRlQ29udGFpbmVyTWFwJywgVHJ1ZSksICAjIDEzIFRUeXBlLk1BUAorICAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCisgICAgICAgICgncmVhZENvbnRhaW5lckxpc3QnLCAnd3JpdGVDb250YWluZXJMaXN0JywgVHJ1ZSksICAjIDE1IFRUeXBlLkxJU1QKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMTYgVFR5cGUuVVRGOCAjIFRPRE86IGhhbmRsZSB1dGY4IHR5cGVzPworICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPworICAgICkKKworICAgIGRlZiBfdHR5cGVfaGFuZGxlcnMoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICBpZiBzcGVjID09ICdCSU5BUlknOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgYmluYXJ5IGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkQmluYXJ5JywgJ3dyaXRlQmluYXJ5JywgRmFsc2UpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3BlYyA9PSAnVVRGOCc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBzdHJpbmcgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRVdGY4JywgJ3dyaXRlVXRmOCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKKworICAgIGRlZiBfcmVhZF9ieV90dHlwZShzZWxmLCB0dHlwZSwgc3BlYywgZXNwZWMpOgorICAgICAgICByZWFkZXJfbmFtZSwgXywgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIGVzcGVjKQorICAgICAgICBpZiByZWFkZXJfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIHR5cGUgJWQnICUgKHR0eXBlKSkKKyAgICAgICAgcmVhZGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHJlYWRlcl9uYW1lKQorICAgICAgICByZWFkID0gKGxhbWJkYTogcmVhZGVyX2Z1bmMoZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSByZWFkZXJfZnVuYworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgcmVhZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHNwZWMpKQorCisgICAgZGVmIHJlYWRDb250YWluZXJMaXN0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKGxpc3RfdHlwZSwgbGlzdF9sZW4pID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgbGlzdF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAodHVwbGUgaWYgaXNfaW1tdXRhYmxlIGVsc2UgbGlzdCkoZWxlbXMpCisgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTZXQoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAoc2V0X3R5cGUsIHNldF9sZW4pID0gc2VsZi5yZWFkU2V0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBzZXRfbGVuKQorICAgICAgICByZXN1bHRzID0gKGZyb3plbnNldCBpZiBpc19pbW11dGFibGUgZWxzZSBzZXQpKGVsZW1zKQorICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIChvYmpfY2xhc3MsIG9ial9zcGVjKSA9IHNwZWMKKyAgICAgICAgb2JqID0gb2JqX2NsYXNzKCkKKyAgICAgICAgb2JqLnJlYWQoc2VsZikKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChtYXBfa3R5cGUsIG1hcF92dHlwZSwgbWFwX2xlbikgPSBzZWxmLnJlYWRNYXBCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKKyAgICAgICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCisgICAgICAgIGtleXMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKGt0eXBlLCBzcGVjLCBrc3BlYykKKyAgICAgICAgdmFscyA9IHNlbGYuX3JlYWRfYnlfdHR5cGUodnR5cGUsIHNwZWMsIHZzcGVjKQorICAgICAgICBrZXl2YWxzID0gaXNsaWNlKHppcChrZXlzLCB2YWxzKSwgbWFwX2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChURnJvemVuRGljdCBpZiBpc19pbW11dGFibGUgZWxzZSBkaWN0KShrZXl2YWxzKQorICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYywgaXNfaW1tdXRhYmxlPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgZmllbGRzID0ge30KKyAgICAgICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQorICAgICAgICAgICAgICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZm5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIHJldHVybiBvYmooKipmaWVsZHMpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJTdHJ1Y3Qoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAgdmFsLndyaXRlKHNlbGYpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJMaXN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZUxpc3RCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZVNldEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHppcChzZWxmLl93cml0ZV9ieV90dHlwZShrdHlwZSwgc2l4Lml0ZXJrZXlzKHZhbCksIHNwZWMsIGtzcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHZ0eXBlLCBzaXguaXRlcnZhbHVlcyh2YWwpLCBzcGVjLCB2c3BlYykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKKyAgICAgICAgICAgIGlmIGZpZWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlkID0gZmllbGRbMF0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbMV0KKyAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiBfd3JpdGVfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHZhbHMsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgXywgd3JpdGVyX25hbWUsIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgd3JpdGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHdyaXRlcl9uYW1lKQorICAgICAgICB3cml0ZSA9IChsYW1iZGEgdjogd3JpdGVyX2Z1bmModiwgZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSB3cml0ZXJfZnVuYworICAgICAgICBmb3IgdiBpbiB2YWxzOgorICAgICAgICAgICAgeWllbGQgd3JpdGUodikKKworICAgIGRlZiB3cml0ZUZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgdmFsLCBzcGVjKToKKyAgICAgICAgbmV4dChzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgW3ZhbF0sIHNwZWMsIHNwZWMpKQorCisKK2RlZiBjaGVja0ludGVnZXJMaW1pdHMoaSwgYml0cyk6CisgICAgaWYgYml0cyA9PSA4IGFuZCAoaSA8IC0xMjggb3IgaSA+IDEyNyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk4IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpCisgICAgZWxpZiBiaXRzID09IDE2IGFuZCAoaSA8IC0zMjc2OCBvciBpID4gMzI3NjcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMTYgcmVxdWlyZXMgLTMyNzY4IDw9IG51bWJlciA8PSAzMjc2NyIpCisgICAgZWxpZiBiaXRzID09IDMyIGFuZCAoaSA8IC0yMTQ3NDgzNjQ4IG9yIGkgPiAyMTQ3NDgzNjQ3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIHJlcXVpcmVzIC0yMTQ3NDgzNjQ4IDw9IG51bWJlciA8PSAyMTQ3NDgzNjQ3IikKKyAgICBlbGlmIGJpdHMgPT0gNjQgYW5kIChpIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3IgaSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgcmVxdWlyZXMgLTkyMjMzNzIwMzY4NTQ3NzU4MDggPD0gbnVtYmVyIDw9IDkyMjMzNzIwMzY4NTQ3NzU4MDciKQorCisKK2NsYXNzIFRQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTQ2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3Iob2JqZWN0KToKKyAgICBkZWYgX19uZXdfXyhjbHMsIHByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBkZWNvcmF0ZWRfY2xzID0gdHlwZSgnJy5qb2luKFsnRGVjb3JhdGVkJywgcHJvdG9jb2wuX19jbGFzc19fLl9fbmFtZV9fXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMsIHByb3RvY29sLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oZGVjb3JhdGVkX2NscykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CmluZGV4IDAxYmZlMTguLjcxNDhmNjYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQpAQCAtMTcsNCArMTcsNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotX19hbGxfXyA9IFsnVFByb3RvY29sJywgJ1RCaW5hcnlQcm90b2NvbCcsICdmYXN0YmluYXJ5J10KK19fYWxsX18gPSBbJ2Zhc3RiaW5hcnknLCAnVEJhc2UnLCAnVEJpbmFyeVByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAgICAnVEpTT05Qcm90b2NvbCcsICdUUHJvdG9jb2wnXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMgYi9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMjE1YS4uMDAwMDAwMAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0jaW5jbHVkZSAiY1N0cmluZ0lPLmgiCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQotICNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgX19pMzg2X18KLSAjZW5kaWYKLQotICNpZm5kZWYgQklHX0VORElBTgotICAjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCi0gI2VuZGlmCi0gI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0gICNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSAjZW5kaWYKLQotIC8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLwotICNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotICNlbmRpZgotI2VuZGlmCi0KLS8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgotLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0Ci0vLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQotLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KLS8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/Ci0vLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KLQotLyogPT09PT09IEJFR0lOIFVUSUxJVElFUyA9PT09PT0gKi8KLQotI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAotCi0vLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgotLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgotdHlwZWRlZiBlbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfSBUVHlwZTsKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBudG9obGwobikgKG4pCi0jIGRlZmluZSBodG9ubGwobikgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KLSNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8gIyMgdmFsdWUKLQotI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoICgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkgKQotI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCAoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSApCi0KLS8vIFB5X3NzaXplX3Qgd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSBQeXRob24gMi41Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLXR5cGVkZWYgaW50IFB5X3NzaXplX3Q7Ci0jZW5kaWYKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGVsZW1lbnRfdHlwZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotfSBTZXRMaXN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUga3RhZzsKLSAgVFR5cGUgdnRhZzsKLSAgUHlPYmplY3QqIGt0eXBlYXJnczsKLSAgUHlPYmplY3QqIHZ0eXBlYXJnczsKLX0gTWFwVHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIGtsYXNzOwotICBQeU9iamVjdCogc3BlYzsKLX0gU3RydWN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRhZzsKLSAgVFR5cGUgdHlwZTsKLSAgUHlPYmplY3QqIGF0dHJuYW1lOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiBkZWZ2YWw7Ci19IFN0cnVjdEl0ZW1TcGVjOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIHN0cmluZ2lvYnVmOwotICBQeU9iamVjdCogcmVmaWxsX2NhbGxhYmxlOwotfSBEZWNvZGVCdWZmZXI7Ci0KLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgewotICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgSU5UMzJfTUFYKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIHNpemUgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBpbnQzMl90KiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgewotICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKLQotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnJldCA9IChpbnQzMl90KSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBGVU5DVElPTlMgVE8gUEFSU0UgU1RSVUNUIFNQRUNJRklDQVRPSU5TIC0tLSAqLwotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmVsZW1lbnRfdHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNCBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT52dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0gIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a2xhc3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKLSAgZGVzdC0+c3BlYyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgewotCi0gIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KLSAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7Ci0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKLSAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PSBFTkQgVVRJTElUSUVTID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBXUklUSU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQgd3JpdGVCeXRlKFB5T2JqZWN0KiBvdXRidWYsIGludDhfdCB2YWwpIHsKLSAgaW50OF90IG5ldCA9IHZhbDsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50OF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTE2KFB5T2JqZWN0KiBvdXRidWYsIGludDE2X3QgdmFsKSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnModmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MTZfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkzMihQeU9iamVjdCogb3V0YnVmLCBpbnQzMl90IHZhbCkgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDMyX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJNjQoUHlPYmplY3QqIG91dGJ1ZiwgaW50NjRfdCB2YWwpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50NjRfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZURvdWJsZShQeU9iamVjdCogb3V0YnVmLCBkb3VibGUgZHViKSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQotICB1bmlvbiB7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCB0OwotICB9IHRyYW5zZmVyOwotICB0cmFuc2Zlci5mID0gZHViOwotICB3cml0ZUk2NChvdXRidWYsIHRyYW5zZmVyLnQpOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBPVVRQVVQgRlVDTlRJT04gLS0gKi8KLQotc3RhdGljIGludAotb3V0cHV0X3ZhbChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICAvKgotICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKLSAgICoKLSAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKLSAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KLSAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgotICAgKiBvdXRwdXRfdmFsIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcwotICAgKi8KLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKLSAgICBpZiAodiA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHYpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDhfTUlOLCBJTlQ4X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDE2X01JTiwgSU5UMTZfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTE2KG91dHB1dCwgKGludDE2X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7Ci0KLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIElOVDY0X01JTiwgSU5UNjRfTUFYKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJNjQob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlRG91YmxlKG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLSAgICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dCwgUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpLCAoaW50MzJfdCkgbGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0ZXJhdG9yOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLQotICAgIGl0ZXJhdG9yID0gIFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpOwotICAgIGlmIChpdGVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IpKSkgewotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaXRlbSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFB5T2JqZWN0ICprLCAqdjsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0KLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotCi0gICAgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5rdGFnKTsKLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLnZ0YWcpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgbGVuKTsKLQotICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cwotICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBoYXJkIGFib3V0IHdoZXRoZXIgdGhlc2UgSU5DUkVGcyBhY3R1YWxseQotICAgICAgLy8gICAgICAgICAgICAgICB0dXJuIGFueSB1bnNhZmUgc2NlbmFyaW9zIGludG8gc2FmZSBzY2VuYXJpb3MuCi0gICAgICBQeV9JTkNSRUYoayk7Ci0gICAgICBQeV9JTkNSRUYodik7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCi0gICAgICAgICAgfHwgIW91dHB1dF92YWwob3V0cHV0LCB2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYnJlYWtpbmcgdGhpcyBvdXQgYXMgYSBmdW5jdGlvbgotICAvLyAgICAgICAgICAgICAgIHRoZSB3YXkgd2UgZGlkIGZvciBkZWNvZGVfc3RydWN0LgotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeV9zc2l6ZV90IG5zcGVjOwotICAgIFB5X3NzaXplX3QgaTsKLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7Ci0KLSAgICBpZiAobnNwZWMgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgewotICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLSAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlOwotICAgICAgUHlPYmplY3QqIGluc3R2YWwgPSBOVUxMOwotCi0gICAgICBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOwotICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjICgmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpbnN0dmFsID0gUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSk7Ci0KLSAgICAgIGlmICghaW5zdHZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnN0dmFsID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgcGFyc2Vkc3BlYy50eXBlKTsKLSAgICAgIHdyaXRlSTE2KG91dHB1dCwgcGFyc2Vkc3BlYy50YWcpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpbnN0dmFsLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdClUX1NUT1ApOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIE9VVFBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZW5jb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIGVuY19vYmo7Ci0gIFB5T2JqZWN0KiB0eXBlX2FyZ3M7Ci0gIFB5T2JqZWN0KiBidWY7Ci0gIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZiA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoSU5JVF9PVVRCVUZfU0laRSk7Ci0gIGlmIChvdXRwdXRfdmFsKGJ1ZiwgZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKLSAgICByZXQgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGJ1Zik7Ci0gIH0KLQotICBQeV9ERUNSRUYoYnVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09IEVORCBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgUkVBRElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX2RlY29kZWJ1ZihEZWNvZGVCdWZmZXIqIGQpIHsKLSAgUHlfWERFQ1JFRihkLT5zdHJpbmdpb2J1Zik7Ci0gIFB5X1hERUNSRUYoZC0+cmVmaWxsX2NhbGxhYmxlKTsKLX0KLQotc3RhdGljIGJvb2wKLWRlY29kZV9idWZmZXJfZnJvbV9vYmooRGVjb2RlQnVmZmVyKiBkZXN0LCBQeU9iamVjdCogb2JqKSB7Ci0gIGRlc3QtPnN0cmluZ2lvYnVmID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpOwotICBpZiAoIWRlc3QtPnN0cmluZ2lvYnVmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeWNTdHJpbmdJT19JbnB1dENoZWNrKGRlc3QtPnN0cmluZ2lvYnVmKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5yZWZpbGxfY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSk7Ci0KLSAgaWYoIWRlc3QtPnJlZmlsbF9jYWxsYWJsZSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHlDYWxsYWJsZV9DaGVjayhkZXN0LT5yZWZpbGxfY2FsbGFibGUpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFkQnl0ZXMoRGVjb2RlQnVmZmVyKiBpbnB1dCwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgewotICBpbnQgcmVhZDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKLSAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0Ci0gIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgotCi0gIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBQeU9iamVjdCogbmV3aW9idWY7Ci0KLSAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKLSAgICBuZXdpb2J1ZiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKLSAgICAgICAgaW5wdXQtPnJlZmlsbF9jYWxsYWJsZSwgInMjaSIsICpvdXRwdXQsIHJlYWQsIGxlbiwgTlVMTCk7Ci0gICAgaWYgKG5ld2lvYnVmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKLSAgICBQeV9DTEVBUihpbnB1dC0+c3RyaW5naW9idWYpOwotICAgIGlucHV0LT5zdHJpbmdpb2J1ZiA9IG5ld2lvYnVmOwotCi0gICAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICAgIGlmIChyZWFkID09IGxlbikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgcmVhZEJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50OF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKihpbnQ4X3QqKSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHJlYWRJMTYoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQxNl90KSBudG9ocygqKGludDE2X3QqKSBidWYpOwotfQotCi1zdGF0aWMgaW50MzJfdCByZWFkSTMyKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpIG50b2hsKCooaW50MzJfdCopIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludDY0X3QgcmVhZEk2NChEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDY0X3QpIG50b2hsbCgqKGludDY0X3QqKSBidWYpOwotfQotCi1zdGF0aWMgZG91YmxlIHJlYWREb3VibGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBmOwotICAgIGRvdWJsZSB0OwotICB9IHRyYW5zZmVyOwotCi0gIHRyYW5zZmVyLmYgPSByZWFkSTY0KGlucHV0KTsKLSAgaWYgKHRyYW5zZmVyLmYgPT0gLTEpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zZmVyLnQ7Ci19Ci0KLXN0YXRpYyBib29sCi1jaGVja1R5cGVCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIGV4cGVjdGVkKSB7Ci0gIFRUeXBlIGdvdCA9IHJlYWRCeXRlKGlucHV0KTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGdvdCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlKSB7Ci0jZGVmaW5lIFNLSVBCWVRFUyhuKSBcCi0gIGRvIHsgXAotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmZHVtbXlfYnVmLCAobikpKSB7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgXAotICAgIH0gXAotICB9IHdoaWxlKDApCi0KLSAgY2hhciogZHVtbXlfYnVmOwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOgotICBjYXNlIFRfSTA4OiBTS0lQQllURVMoMSk7IGJyZWFrOwotICBjYXNlIFRfSTE2OiBTS0lQQllURVMoMik7IGJyZWFrOwotICBjYXNlIFRfSTMyOiBTS0lQQllURVMoNCk7IGJyZWFrOwotICBjYXNlIFRfSTY0OgotICBjYXNlIFRfRE9VQkxFOiBTS0lQQllURVMoOCk7IGJyZWFrOwotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHRoZXNlIGNoZWNrX3NzaXplX3QzMnMgYXJlIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgaW50IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNLSVBCWVRFUyhsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBUVHlwZSBldHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAgZXR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGV0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgZXR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgVFR5cGUga3R5cGUsIHZ0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBrdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoa3R5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2dHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodnR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCEoc2tpcChpbnB1dCwga3R5cGUpICYmIHNraXAoaW5wdXQsIHZ0eXBlKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVFR5cGUgdHlwZTsKLQotICAgICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKQotICAgICAgICBicmVhazsKLQotICAgICAgU0tJUEJZVEVTKDIpOyAvLyB0YWcKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSN1bmRlZiBTS0lQQllURVMKLX0KLQotCi0vKiAtLS0gSEVMUEVSIEZVTkNUSU9OIEZPUiBERUNPREVfVkFMIC0tLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfc3RydWN0KERlY29kZUJ1ZmZlciogaW5wdXQsIFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBzcGVjX3NlcSkgewotICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKLSAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgVFR5cGUgdHlwZTsKLSAgICBpbnQxNl90IHRhZzsKLSAgICBQeU9iamVjdCogaXRlbV9zcGVjOwotICAgIFB5T2JqZWN0KiBmaWVsZHZhbCA9IE5VTEw7Ci0gICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLQotICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGFnID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHRhZyA+PSAwICYmIHRhZyA8IHNwZWNfc2VxX2xlbikgewotICAgICAgaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlbV9zcGVjID0gUHlfTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlIHdoaWxlIHJlYWRpbmcgYW5kIGNhbid0IGJlIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGR2YWwgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOwotICAgIGlmIChmaWVsZHZhbCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbCkgPT0gLTEpIHsKLSAgICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIElOUFVUIEZVQ05USU9OIC0tLSAqLwotCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHYpIHsKLSAgICBjYXNlIDA6IFB5X1JFVFVSTl9GQUxTRTsKLSAgICBjYXNlIDE6IFB5X1JFVFVSTl9UUlVFOwotICAgIC8vIERvbid0IGxhdWdoLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgaXNzdWUuCi0gICAgZGVmYXVsdDogUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJvb2xlYW4gb3V0IG9mIHJhbmdlIik7IHJldHVybiBOVUxMOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDE2X3QgdiA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2ID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgdiA9IHJlYWRJNjQoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgotICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgotICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwotICAgIH0KLQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSB2ID0gcmVhZERvdWJsZShpbnB1dCk7Ci0gICAgaWYgKHYgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBjaGFyKiBidWY7Ci0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIGludDMyX3QgbGVuOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlMaXN0X05ldyhsZW4pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOwotICAgICAgaWYgKCFpdGVtKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQsIGksIGl0ZW0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKLSAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgotICAgIGlmICh0eXBlID09IFRfU0VUKSB7Ci0gICAgICBQeU9iamVjdCogc2V0cmV0OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAvLyBoYWNrIG5lZWRlZCBmb3Igb2xkZXIgdmVyc2lvbnMKLSAgICAgIHNldHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KikmUHlTZXRfVHlwZSwgcmV0LCBOVUxMKTsKLSNlbHNlCi0gICAgICAvLyBvZmZpY2lhbCB2ZXJzaW9uCi0gICAgICBzZXRyZXQgPSBQeVNldF9OZXcocmV0KTsKLSNlbmRpZgotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gc2V0cmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIGludDMyX3QgbGVuOwotICAgIGludCBpOwotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5rdGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy52dGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXQgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogayA9IE5VTEw7Ci0gICAgICBQeU9iamVjdCogdiA9IE5VTEw7Ci0gICAgICBrID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncyk7Ci0gICAgICBpZiAoayA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIHYgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKTsKLSAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldCwgaywgdikgPT0gLTEpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgICBjb250aW51ZTsKLQotICAgICAgLy8gWXVjayEgIERlc3RydWN0b3JzLCBhbnlvbmU/Ci0gICAgICBsb29wX2Vycm9yOgotICAgICAgUHlfWERFQ1JFRihrKTsKLSAgICAgIFB5X1hERUNSRUYodik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLSAgICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5T2JqZWN0KiByZXQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHBhcnNlZGFyZ3Mua2xhc3MsIE5VTEwpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWRlY29kZV9zdHJ1Y3QoaW5wdXQsIHJldCwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIElOUFVUIC0tICovCi0KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV9iaW5hcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gIFB5T2JqZWN0KiBvdXRwdXRfb2JqID0gTlVMTDsKLSAgUHlPYmplY3QqIHRyYW5zcG9ydCA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0eXBlYXJncyA9IE5VTEw7Ci0gIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gIERlY29kZUJ1ZmZlciBpbnB1dCA9IHt9OwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZ0cmFuc3BvcnQsICZ0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfYnVmZmVyX2Zyb21fb2JqKCZpbnB1dCwgdHJhbnNwb3J0KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfc3RydWN0KCZpbnB1dCwgb3V0cHV0X29iaiwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotCi0gIFB5X1JFVFVSTl9OT05FOwotfQotCi0vKiA9PT09PT0gRU5EIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0KLS8qIC0tIFBZVEhPTiBNT0RVTEUgU0VUVVAgU1RVRkYgLS0tICovCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0gewotCi0gIHsiZW5jb2RlX2JpbmFyeSIsICBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLSAgeyJkZWNvZGVfYmluYXJ5IiwgIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotCi0gIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KLX07Ci0KLVB5TU9ESU5JVF9GVU5DCi1pbml0ZmFzdGJpbmFyeSh2b2lkKSB7Ci0jZGVmaW5lIElOSVRfSU5URVJOX1NUUklORyh2YWx1ZSkgXAotICBkbyB7IFwKLSAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgXAotICAgIGlmKCFJTlRFUk5fU1RSSU5HKHZhbHVlKSkgcmV0dXJuOyBcCi0gIH0gd2hpbGUoMCkKLQotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7Ci0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKLSN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKLQotICBQeWNTdHJpbmdfSU1QT1JUOwotICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkgcmV0dXJuOwotCi0gICh2b2lkKSBQeV9Jbml0TW9kdWxlKCJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKaW5kZXggMjFmYzMxNC4uODVjZjQwMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKQEAgLTE3LDQ3ICsxNyw5MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3NsCisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCisKK2NsYXNzIFJlc3BvbnNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQWxsb3dzIGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBIVFRQIHJlc3BvbnNlCisKKyAgICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCisgICAgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciAoZS5nLiwgdG8gc2ltdWxhdGUgYSBtaXNjb25maWd1cmVkIG9yCisgICAgb3ZlcmxvYWRlZCB3ZWIgc2VydmVyIGR1cmluZyB0ZXN0aW5nKSwgaXQgY2FuIHJhaXNlIGEgUmVzcG9uc2VFeGNlcHRpb24uCisgICAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICBSZXF1ZXN0SGFuZGxlciBhcyBpdHMgb25seSBhcmd1bWVudC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKKworCiBjbGFzcyBUSHR0cFNlcnZlcihUU2VydmVyLlRTZXJ2ZXIpOgotICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKKyAgICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKIAotICBUaGlzIGNsYXNzIGlzIG5vdCB2ZXJ5IHBlcmZvcm1hbnQsIGJ1dCBpdCBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSBmb3IKLSAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LiIiIgorICAgIFRoaXMgY2xhc3MgaXMgbm90IHZlcnkgcGVyZm9ybWFudCwgYnV0IGl0IGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIGZvcgorICAgIGFjdGluZyBhcyBhIG1vY2sgdmVyc2lvbiBvZiBhbiBBcGFjaGUtYmFzZWQgUEhQIFRocmlmdCBlbmRwb2ludC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICBzZXJ2ZXJfY2xhc3M9QmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICAgICAiIiJTZXQgdXAgcHJvdG9jb2wgZmFjdG9yaWVzIGFuZCBIVFRQIChvciBIVFRQUykgc2VydmVyLgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIHNlcnZlcl9hZGRyZXNzLAotICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IE5vbmUpOgotICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgc2VydmVyLgorICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgorICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgogCi0gICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KLSAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLiIiIgorICAgICAgICBUbyBtYWtlIGEgc2VjdXJlIHNlcnZlciwgcHJvdmlkZSB0aGUgbmFtZWQgYXJndW1lbnRzOgorICAgICAgICAqIGNhZmlsZSAgICAtIHRvIHZhbGlkYXRlIGNsaWVudHMgW29wdGlvbmFsXQorICAgICAgICAqIGNlcnRfZmlsZSAtIHRoZSBzZXJ2ZXIgY2VydAorICAgICAgICAqIGtleV9maWxlICAtIHRoZSBzZXJ2ZXIncyBrZXkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKIAotICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgotICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAKLSAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAotICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB0aHR0cHNlcnZlciA9IHNlbGYKIAotICAgIHRodHRwc2VydmVyID0gc2VsZgorICAgICAgICBjbGFzcyBSZXF1ZXN0SGFuZGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCisgICAgICAgICAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi53ZmlsZSkKKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICAgICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICAgICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgorICAgICAgICAgICAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG90cmFucy5nZXR2YWx1ZSgpKQogCi0gICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgotICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KLSAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiY29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHNlbGYuaHR0cGQgPSBzZXJ2ZXJfY2xhc3Moc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCiAKLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCi0gICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgb3RyYW5zLmZsdXNoKCkKKyAgICAgICAgaWYgKGt3YXJncy5nZXQoJ2NhZmlsZScpIG9yIGt3YXJncy5nZXQoJ2NlcnRfZmlsZScpIG9yIGt3YXJncy5nZXQoJ2tleV9maWxlJykpOgorICAgICAgICAgICAgY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1rd2FyZ3MuZ2V0KCdjYWZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQorICAgICAgICAgICAgY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oa3dhcmdzLmdldCgnY2VydF9maWxlJyksIGt3YXJncy5nZXQoJ2tleV9maWxlJykpCisgICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYga3dhcmdzLmdldCgnY2FmaWxlJykgZWxzZSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBzZWxmLmh0dHBkLnNvY2tldCA9IGNvbnRleHQud3JhcF9zb2NrZXQoc2VsZi5odHRwZC5zb2NrZXQsIHNlcnZlcl9zaWRlPVRydWUpCiAKLSAgICBzZWxmLmh0dHBkID0gQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcihzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICBzZWxmLmh0dHBkLnNvY2tldC5jbG9zZSgpCisgICAgICAgICMgc2VsZi5odHRwZC5zaHV0ZG93bigpICMgaGFuZ3MgZm9yZXZlciwgcHl0aG9uIGRvZXNuJ3QgaGFuZGxlIFBPTExOVkFMIHByb3Blcmx5IQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CmluZGV4IGVhMzQ4YTAuLmY2MmQ0ODYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKQEAgLTE4LDI1ICsxOCwzMyBAQAogIwogIiIiSW1wbGVtZW50YXRpb24gb2Ygbm9uLWJsb2NraW5nIHNlcnZlci4KIAotVGhlIG1haW4gaWRlYSBvZiB0aGUgc2VydmVyIGlzIHJlY2l2aW5nIGFuZCBzZW5kaW5nIHJlcXVlc3RzCi1vbmx5IGZyb20gbWFpbiB0aHJlYWQuCitUaGUgbWFpbiBpZGVhIG9mIHRoZSBzZXJ2ZXIgaXMgdG8gcmVjZWl2ZSBhbmQgc2VuZCByZXF1ZXN0cworb25seSBmcm9tIHRoZSBtYWluIHRocmVhZC4KIAotSXQgYWxzbyBtYWtlcyB0aHJlYWQgcG9vbCBzZXJ2ZXIgaW4gdGFza3MgdGVybXMsIG5vdCBjb25uZWN0aW9ucy4KK1RoZSB0aHJlYWQgcG9vb2wgc2hvdWxkIGJlIHNpemVkIGZvciBjb25jdXJyZW50IHRhc2tzLCBub3QKK21heGltdW0gY29ubmVjdGlvbnMKICIiIgotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHNvY2tldAotaW1wb3J0IFF1ZXVlCi1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgc3RydWN0CisKIGltcG9ydCBsb2dnaW5nCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGhyZWFkaW5nCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKIAogX19hbGxfXyA9IFsnVE5vbmJsb2NraW5nU2VydmVyJ10KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKwogY2xhc3MgV29ya2VyKHRocmVhZGluZy5UaHJlYWQpOgogICAgICIiIldvcmtlciBpcyBhIHNtYWxsIGhlbHBlciB0byBwcm9jZXNzIGluY29taW5nIGNvbm5lY3Rpb24uIiIiCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgcXVldWUpOgogICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCiAgICAgICAgIHNlbGYucXVldWUgPSBxdWV1ZQpAQCAtNTEsOCArNTksOSBAQAogICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKICAgICAgICAgICAgICAgICBjYWxsYmFjayhUcnVlLCBvdHJhbnMuZ2V0dmFsdWUoKSkKICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCAnJykKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IiwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgYicnKQorCiAKIFdBSVRfTEVOID0gMAogV0FJVF9NRVNTQUdFID0gMQpAQCAtNjAsOCArNjksOSBAQAogU0VORF9BTlNXRVIgPSAzCiBDTE9TRUQgPSA0CiAKKwogZGVmIGxvY2tlZChmdW5jKToKLSAgICAiRGVjb3JhdG9yIHdoaWNoIGxvY2tzIHNlbGYubG9jay4iCisgICAgIiIiRGVjb3JhdG9yIHdoaWNoIGxvY2tzIHNlbGYubG9jay4iIiIKICAgICBkZWYgbmVzdGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKICAgICAgICAgdHJ5OgpAQCAtNzAsMjUgKzgwLDQwIEBACiAgICAgICAgICAgICBzZWxmLmxvY2sucmVsZWFzZSgpCiAgICAgcmV0dXJuIG5lc3RlZAogCisKIGRlZiBzb2NrZXRfZXhjZXB0aW9uKGZ1bmMpOgotICAgICJEZWNvcmF0b3IgY2xvc2Ugb2JqZWN0IG9uIHNvY2tldC5lcnJvci4iCisgICAgIiIiRGVjb3JhdG9yIGNsb3NlIG9iamVjdCBvbiBzb2NrZXQuZXJyb3IuIiIiCiAgICAgZGVmIHJlYWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpZ25vcmluZyBzb2NrZXQgZXhjZXB0aW9uJywgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgIHJldHVybiByZWFkCiAKLWNsYXNzIENvbm5lY3Rpb246CisKK2NsYXNzIE1lc3NhZ2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBsZW5fLCBoZWFkZXIpOgorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLmxlbiA9IGxlbl8KKyAgICAgICAgc2VsZi5idWZmZXIgPSBOb25lCisgICAgICAgIHNlbGYuaXNfaGVhZGVyID0gaGVhZGVyCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQgKyBzZWxmLmxlbgorCisKK2NsYXNzIENvbm5lY3Rpb24ob2JqZWN0KToKICAgICAiIiJCYXNpYyBjbGFzcyBpcyByZXByZXNlbnRlZCBjb25uZWN0aW9uLgotICAgIAorCiAgICAgSXQgY2FuIGJlIGluIHN0YXRlOgogICAgICAgICBXQUlUX0xFTiAtLS0gY29ubmVjdGlvbiBpcyByZWFkaW5nIHJlcXVlc3QgbGVuLgogICAgICAgICBXQUlUX01FU1NBR0UgLS0tIGNvbm5lY3Rpb24gaXMgcmVhZGluZyByZXF1ZXN0LgotICAgICAgICBXQUlUX1BST0NFU1MgLS0tIGNvbm5lY3Rpb24gaGFzIGp1c3QgcmVhZCB3aG9sZSByZXF1ZXN0IGFuZCAKLSAgICAgICAgICAgIHdhaXRzIGZvciBjYWxsIHJlYWR5IHJvdXRpbmUuCisgICAgICAgIFdBSVRfUFJPQ0VTUyAtLS0gY29ubmVjdGlvbiBoYXMganVzdCByZWFkIHdob2xlIHJlcXVlc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHMgZm9yIGNhbGwgcmVhZHkgcm91dGluZS4KICAgICAgICAgU0VORF9BTlNXRVIgLS0tIGNvbm5lY3Rpb24gaXMgc2VuZGluZyBhbnN3ZXIgc3RyaW5nIChpbmNsdWRpbmcgbGVuZ3RoCi0gICAgICAgICAgICBvZiBhbnN3ZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgb2YgYW5zd2VyKS4KICAgICAgICAgQ0xPU0VEIC0tLSBzb2NrZXQgd2FzIGNsb3NlZCBhbmQgY29ubmVjdGlvbiBzaG91bGQgYmUgZGVsZXRlZC4KICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3X3NvY2tldCwgd2FrZV91cCk6CkBAIC05Niw4MCArMTIxLDcyIEBACiAgICAgICAgIHNlbGYuc29ja2V0LnNldGJsb2NraW5nKEZhbHNlKQogICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCiAgICAgICAgIHNlbGYubGVuID0gMAotICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJworICAgICAgICBzZWxmLnJlY2VpdmVkID0gZGVxdWUoKQorICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICBzZWxmLl9yYnVmID0gYicnCisgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICBzZWxmLndha2VfdXAgPSB3YWtlX3VwCi0KLSAgICBkZWYgX3JlYWRfbGVuKHNlbGYpOgotICAgICAgICAiIiJSZWFkcyBsZW5ndGggb2YgcmVxdWVzdC4KLSAgICAgICAgCi0gICAgICAgIEl0J3MgcmVhbGx5IHBhcmFub2ljIHJvdXRpbmUgYW5kIGl0IG1heSBiZSByZXBsYWNlZCBieSAKLSAgICAgICAgc2VsZi5zb2NrZXQucmVjdig0KS4iIiIKLSAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoNCAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICMgaWYgd2UgcmVhZCAwIGJ5dGVzIGFuZCBzZWxmLm1lc3NhZ2UgaXMgZW1wdHksIGl0IG1lYW5zIGNsaWVudCBjbG9zZSAKLSAgICAgICAgICAgICMgY29ubmVjdGlvbgotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgIT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIHNpemUgZnJvbSBzb2NrZXQiKQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gNDoKLSAgICAgICAgICAgIHNlbGYubGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5tZXNzYWdlKQotICAgICAgICAgICAgaWYgc2VsZi5sZW4gPCAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIm5lZ2F0aXZlIGZyYW1lIHNpemUsIGl0IHNlZW1zIGNsaWVudCJcCi0gICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCB1c2UgRnJhbWVkVHJhbnNwb3J0IikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsaWYgc2VsZi5sZW4gPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJlbXB0eSBmcmFtZSwgaXQncyByZWFsbHkgc3RyYW5nZSIpCi0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCi0gICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBGYWxzZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgcmVhZChzZWxmKToKICAgICAgICAgIiIiUmVhZHMgZGF0YSBmcm9tIHN0cmVhbSBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgaW4gKFdBSVRfTEVOLCBXQUlUX01FU1NBR0UpCi0gICAgICAgIGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTEVOOgotICAgICAgICAgICAgc2VsZi5fcmVhZF9sZW4oKQotICAgICAgICAgICAgIyBnbyBiYWNrIHRvIHRoZSBtYWluIGxvb3AgaGVyZSBmb3Igc2ltcGxpY2l0eSBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAjIGZhbGxpbmcgdGhyb3VnaCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0Ci0gICAgICAgICAgICAjIHRoZSBtZXNzYWdlIGlzIGFscmVhZHkgYXZhaWxhYmxlCi0gICAgICAgIGVsaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9NRVNTQUdFOgotICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3Yoc2VsZi5sZW4gLSBsZW4oc2VsZi5tZXNzYWdlKSkKLSAgICAgICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgZnJvbSBzb2NrZXQgKGdldCAlZCBvZiAlZCBieXRlcykiICUKLSAgICAgICAgICAgICAgICAgICAgKGxlbihzZWxmLm1lc3NhZ2UpLCBzZWxmLmxlbikpCisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5yZWNlaXZlZAorICAgICAgICBidWZfc2l6ZSA9IDgxOTIKKyAgICAgICAgZmlyc3QgPSBUcnVlCisgICAgICAgIGRvbmUgPSBGYWxzZQorICAgICAgICB3aGlsZSBub3QgZG9uZToKKyAgICAgICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KGJ1Zl9zaXplKQorICAgICAgICAgICAgcmxlbiA9IGxlbihyZWFkKQorICAgICAgICAgICAgZG9uZSA9IHJsZW4gPCBidWZfc2l6ZQorICAgICAgICAgICAgc2VsZi5fcmJ1ZiArPSByZWFkCisgICAgICAgICAgICBpZiBmaXJzdCBhbmQgcmxlbiA9PSAwOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RhdHVzICE9IFdBSVRfTEVOIG9yIHNlbGYuX3JidWY6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignY291bGQgbm90IHJlYWQgZnJhbWUgZnJvbSBzb2NrZXQnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncmVhZCB6ZXJvIGxlbmd0aC4gY2xpZW50IG1pZ2h0IGhhdmUgZGlzY29ubmVjdGVkJykKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSArPSByZWFkCi0gICAgICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSA9PSBzZWxmLmxlbjoKKyAgICAgICAgICAgIHdoaWxlIGxlbihzZWxmLl9yYnVmKSA+PSBzZWxmLl9yZWFkaW5nLmVuZDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZWFkaW5nLmlzX2hlYWRlcjoKKyAgICAgICAgICAgICAgICAgICAgbWxlbiwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIHNlbGYuX3JidWZbOjRdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZShzZWxmLl9yZWFkaW5nLmVuZCwgbWxlbiwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9NRVNTQUdFCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZy5idWZmZXIgPSBzZWxmLl9yYnVmCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjZWl2ZWQuYXBwZW5kKHNlbGYuX3JlYWRpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JidWYgPSBzZWxmLl9yYnVmW3NlbGYuX3JlYWRpbmcuZW5kOl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2UoMCwgNCwgVHJ1ZSkKKyAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIHNlbGYucmVjZWl2ZWQ6CiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX1BST0NFU1MKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLnJlbWFpbmluZyA9IG5vdCBkb25lCiAKICAgICBAc29ja2V0X2V4Y2VwdGlvbgogICAgIGRlZiB3cml0ZShzZWxmKToKICAgICAgICAgIiIiV3JpdGVzIGRhdGEgZnJvbSBzb2NrZXQgYW5kIHN3aXRjaCBzdGF0ZS4iIiIKICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdHVzID09IFNFTkRfQU5TV0VSCi0gICAgICAgIHNlbnQgPSBzZWxmLnNvY2tldC5zZW5kKHNlbGYubWVzc2FnZSkKLSAgICAgICAgaWYgc2VudCA9PSBsZW4oc2VsZi5tZXNzYWdlKToKKyAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5fd2J1ZikKKyAgICAgICAgaWYgc2VudCA9PSBsZW4oc2VsZi5fd2J1Zik6CiAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJworICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2Vbc2VudDpdCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc2VsZi5fd2J1ZltzZW50Ol0KIAogICAgIEBsb2NrZWQKICAgICBkZWYgcmVhZHkoc2VsZiwgYWxsX29rLCBtZXNzYWdlKToKICAgICAgICAgIiIiQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN3aXRjaGluZyBzdGF0ZSBhbmQgd2FraW5nIHVwIG1haW4gdGhyZWFkLgotICAgICAgICAKKwogICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHdpdGNoIGNhbiBiZSBjYWxsZWQgYXN5bmNocm9ub3VzLgotICAgICAgICAKKwogICAgICAgICBUaGUgcmVhZHkgY2FuIHN3aXRjaCBDb25uZWN0aW9uIHRvIHRocmVlIHN0YXRlczoKICAgICAgICAgICAgIFdBSVRfTEVOIGlmIHJlcXVlc3Qgd2FzIG9uZXdheS4KICAgICAgICAgICAgIFNFTkRfQU5TV0VSIGlmIHJlcXVlc3Qgd2FzIHByb2Nlc3NlZCBpbiBub3JtYWwgd2F5LgogICAgICAgICAgICAgQ0xPU0VEIGlmIHJlcXVlc3QgdGhyb3dzIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLgotICAgICAgICAKKwogICAgICAgICBUaGUgb25lIHdha2VzIHVwIG1haW4gdGhyZWFkLgogICAgICAgICAiIiIKICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdHVzID09IFdBSVRfUFJPQ0VTUwpAQCAtMTc3LDY1ICsxOTQsNzQgQEAKICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi53YWtlX3VwKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmxlbiA9ICcnCisgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBpZiBsZW4obWVzc2FnZSkgPT0gMDoKICAgICAgICAgICAgICMgaXQgd2FzIGEgb25ld2F5IHJlcXVlc3QsIGRvIG5vdCB3cml0ZSBhbnN3ZXIKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzdHJ1Y3QucGFjaygnIWknLCBsZW4obWVzc2FnZSkpICsgbWVzc2FnZQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCiAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFNFTkRfQU5TV0VSCiAgICAgICAgIHNlbGYud2FrZV91cCgpCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIGlzX3dyaXRlYWJsZShzZWxmKToKLSAgICAgICAgIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byB3cml0ZSBsaXN0IG9mIHNlbGVjdC4iCisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHdyaXRlIGxpc3Qgb2Ygc2VsZWN0IiIiCiAgICAgICAgIHJldHVybiBzZWxmLnN0YXR1cyA9PSBTRU5EX0FOU1dFUgogCiAgICAgIyBpdCdzIG5vdCBuZWNlc3NhcnksIGJ1dC4uLgogICAgIEBsb2NrZWQKICAgICBkZWYgaXNfcmVhZGFibGUoc2VsZik6Ci0gICAgICAgICJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gcmVhZCBsaXN0IG9mIHNlbGVjdC4iCisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHJlYWQgbGlzdCBvZiBzZWxlY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzIGluIChXQUlUX0xFTiwgV0FJVF9NRVNTQUdFKQogCiAgICAgQGxvY2tlZAogICAgIGRlZiBpc19jbG9zZWQoc2VsZik6Ci0gICAgICAgICJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGlvbiBpcyBjbG9zZWQuIgorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGlvbiBpcyBjbG9zZWQuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnN0YXR1cyA9PSBDTE9TRUQKIAogICAgIGRlZiBmaWxlbm8oc2VsZik6Ci0gICAgICAgICJSZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0ZWQgc29ja2V0LiIKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBhc3NvY2lhdGVkIHNvY2tldC4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmZpbGVubygpCiAKICAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgICJDbG9zZXMgY29ubmVjdGlvbiIKKyAgICAgICAgIiIiQ2xvc2VzIGNvbm5lY3Rpb24iIiIKICAgICAgICAgc2VsZi5zdGF0dXMgPSBDTE9TRUQKICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQogCi1jbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlcihvYmplY3QpOgogICAgICIiIk5vbi1ibG9ja2luZyBzZXJ2ZXIuIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgbHNvY2tldCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwgCi0gICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwgdGhyZWFkcz0xMCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBsc29ja2V0LAorICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdGhyZWFkcz0xMCk6CiAgICAgICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCiAgICAgICAgIHNlbGYuc29ja2V0ID0gbHNvY2tldAogICAgICAgICBzZWxmLmluX3Byb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3Rvcnkgb3IgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAgICAgICAgIHNlbGYub3V0X3Byb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5IG9yIHNlbGYuaW5fcHJvdG9jb2wKICAgICAgICAgc2VsZi50aHJlYWRzID0gaW50KHRocmVhZHMpCiAgICAgICAgIHNlbGYuY2xpZW50cyA9IHt9Ci0gICAgICAgIHNlbGYudGFza3MgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYudGFza3MgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgIHNlbGYuX3JlYWQsIHNlbGYuX3dyaXRlID0gc29ja2V0LnNvY2tldHBhaXIoKQogICAgICAgICBzZWxmLnByZXBhcmVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5fc3RvcCA9IEZhbHNlCiAKICAgICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgogICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkLiIiIgogICAgICAgICAjIGltcGxlbWVudCBUaHJlYWRQb29sIGludGVyZmFjZQotICAgICAgICBhc3NlcnQgbm90IHNlbGYucHJlcGFyZWQsICJZb3UgY2FuJ3QgY2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGZvciB3b3JraW5nIHNlcnZlciIKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnByZXBhcmVkLCAiQ2FuJ3QgY2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGFmdGVyIHN0YXJ0IgogICAgICAgICBzZWxmLnRocmVhZHMgPSBudW0KIAogICAgIGRlZiBwcmVwYXJlKHNlbGYpOgogICAgICAgICAiIiJQcmVwYXJlcyBzZXJ2ZXIgZm9yIHNlcnZlIHJlcXVlc3RzLiIiIgorICAgICAgICBpZiBzZWxmLnByZXBhcmVkOgorICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuc29ja2V0Lmxpc3RlbigpCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgdGhyZWFkID0gV29ya2VyKHNlbGYudGFza3MpCiAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQpAQCAtMjQzLDUyICsyNjksODIgQEAKIAogICAgIGRlZiB3YWtlX3VwKHNlbGYpOgogICAgICAgICAiIiJXYWtlIHVwIG1haW4gdGhyZWFkLgotICAgICAgICAKLSAgICAgICAgVGhlIHNlcnZlciB1c3VhbHkgd2FpdHMgaW4gc2VsZWN0IGNhbGwgaW4gd2Ugc2hvdWxkIHRlcm1pbmF0ZSBvbmUuCisKKyAgICAgICAgVGhlIHNlcnZlciB1c3VhbGx5IHdhaXRzIGluIHNlbGVjdCBjYWxsIGluIHdlIHNob3VsZCB0ZXJtaW5hdGUgb25lLgogICAgICAgICBUaGUgc2ltcGxlc3Qgd2F5IGlzIHVzaW5nIHNvY2tldHBhaXIuCi0gICAgICAgIAorCiAgICAgICAgIFNlbGVjdCBhbHdheXMgd2FpdCB0byByZWFkIGZyb20gdGhlIGZpcnN0IHNvY2tldCBvZiBzb2NrZXRwYWlyLgotICAgICAgICAKKwogICAgICAgICBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IHdyaXRlIGFueXRoaW5nIHRvIHRoZSBzZWNvbmQgc29ja2V0IGZyb20KLSAgICAgICAgc29ja2V0cGFpci4iIiIKLSAgICAgICAgc2VsZi5fd3JpdGUuc2VuZCgnMScpCisgICAgICAgIHNvY2tldHBhaXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl93cml0ZS5zZW5kKGInMScpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIiIiU3RvcCB0aGUgc2VydmVyLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGNhdXNlcyB0aGUgc2VydmUoKSBtZXRob2QgdG8gcmV0dXJuLiAgc3RvcCgpIG1heSBiZSBpbnZva2VkCisgICAgICAgIGZyb20gd2l0aGluIHlvdXIgaGFuZGxlciwgb3IgZnJvbSBhbm90aGVyIHRocmVhZC4KKworICAgICAgICBBZnRlciBzdG9wKCkgaXMgY2FsbGVkLCBzZXJ2ZSgpIHdpbGwgcmV0dXJuIGJ1dCB0aGUgc2VydmVyIHdpbGwgc3RpbGwKKyAgICAgICAgYmUgbGlzdGVuaW5nIG9uIHRoZSBzb2NrZXQuICBzZXJ2ZSgpIG1heSB0aGVuIGJlIGNhbGxlZCBhZ2FpbiB0byByZXN1bWUKKyAgICAgICAgcHJvY2Vzc2luZyByZXF1ZXN0cy4gIEFsdGVybmF0aXZlbHksIGNsb3NlKCkgbWF5IGJlIGNhbGxlZCBhZnRlcgorICAgICAgICBzZXJ2ZSgpIHJldHVybnMgdG8gY2xvc2UgdGhlIHNlcnZlciBzb2NrZXQgYW5kIHNodXRkb3duIGFsbCB3b3JrZXIKKyAgICAgICAgdGhyZWFkcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3N0b3AgPSBUcnVlCisgICAgICAgIHNlbGYud2FrZV91cCgpCiAKICAgICBkZWYgX3NlbGVjdChzZWxmKToKICAgICAgICAgIiIiRG9lcyBzZWxlY3Qgb24gb3BlbiBjb25uZWN0aW9ucy4iIiIKICAgICAgICAgcmVhZGFibGUgPSBbc2VsZi5zb2NrZXQuaGFuZGxlLmZpbGVubygpLCBzZWxmLl9yZWFkLmZpbGVubygpXQogICAgICAgICB3cml0YWJsZSA9IFtdCi0gICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIHNlbGYuY2xpZW50cy5pdGVtcygpOgorICAgICAgICByZW1haW5pbmcgPSBbXQorICAgICAgICBmb3IgaSwgY29ubmVjdGlvbiBpbiBsaXN0KHNlbGYuY2xpZW50cy5pdGVtcygpKToKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfcmVhZGFibGUoKToKICAgICAgICAgICAgICAgICByZWFkYWJsZS5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKKyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnJlbWFpbmluZyBvciBjb25uZWN0aW9uLnJlY2VpdmVkOgorICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX3dyaXRlYWJsZSgpOgogICAgICAgICAgICAgICAgIHdyaXRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19jbG9zZWQoKToKICAgICAgICAgICAgICAgICBkZWwgc2VsZi5jbGllbnRzW2ldCi0gICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHJlYWRhYmxlLCB3cml0YWJsZSwgcmVhZGFibGUpCi0gICAgICAgIAorICAgICAgICBpZiByZW1haW5pbmc6CisgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nLCBbXSwgW10sIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyZWFkYWJsZSwgd3JpdGFibGUsIHJlYWRhYmxlKSArIChUcnVlLCkKKwogICAgIGRlZiBoYW5kbGUoc2VsZik6CiAgICAgICAgICIiIkhhbmRsZSByZXF1ZXN0cy4KLSAgICAgICAKLSAgICAgICAgV0FSTklORyEgWW91IG11c3QgY2FsbCBwcmVwYXJlIEJFRk9SRSBjYWxsaW5nIGhhbmRsZS4KKworICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUoKSBCRUZPUkUgY2FsbGluZyBoYW5kbGUoKQogICAgICAgICAiIiIKICAgICAgICAgYXNzZXJ0IHNlbGYucHJlcGFyZWQsICJZb3UgaGF2ZSB0byBjYWxsIHByZXBhcmUgYmVmb3JlIGhhbmRsZSIKLSAgICAgICAgcnNldCwgd3NldCwgeHNldCA9IHNlbGYuX3NlbGVjdCgpCisgICAgICAgIHJzZXQsIHdzZXQsIHhzZXQsIHNlbGVjdGVkID0gc2VsZi5fc2VsZWN0KCkKICAgICAgICAgZm9yIHJlYWRhYmxlIGluIHJzZXQ6CiAgICAgICAgICAgICBpZiByZWFkYWJsZSA9PSBzZWxmLl9yZWFkLmZpbGVubygpOgogICAgICAgICAgICAgICAgICMgZG9uJ3QgY2FyZSBpIGp1c3QgbmVlZCB0byBjbGVhbiByZWFkYWJsZSBmbGFnCi0gICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpIAorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQucmVjdigxMDI0KQogICAgICAgICAgICAgZWxpZiByZWFkYWJsZSA9PSBzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCk6Ci0gICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkuaGFuZGxlCi0gICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzW2NsaWVudC5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudCwgc2VsZi53YWtlX3VwKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzW2NsaWVudC5oYW5kbGUuZmlsZW5vKCldID0gQ29ubmVjdGlvbihjbGllbnQuaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdlcnJvciB3aGlsZSBhY2NlcHRpbmcnLCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gc2VsZi5jbGllbnRzW3JlYWRhYmxlXQotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZCgpCi0gICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5zdGF0dXMgPT0gV0FJVF9QUk9DRVNTOgotICAgICAgICAgICAgICAgICAgICBpdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGNvbm5lY3Rpb24ubWVzc2FnZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnJlY2VpdmVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb25uZWN0aW9uLnJlY2VpdmVkLnBvcGxlZnQoKQorICAgICAgICAgICAgICAgICAgICBpdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZy5idWZmZXIsIG1zZy5vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgIG90cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQogICAgICAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5fcHJvdG9jb2wuZ2V0UHJvdG9jb2woaXRyYW5zcG9ydCkKICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dF9wcm90b2NvbC5nZXRQcm90b2NvbChvdHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tzLnB1dChbc2VsZi5wcm9jZXNzb3IsIGlwcm90LCBvcHJvdCwgCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza3MucHV0KFtzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCwgY29ubmVjdGlvbi5yZWFkeV0pCiAgICAgICAgIGZvciB3cml0ZWFibGUgaW4gd3NldDoKICAgICAgICAgICAgIHNlbGYuY2xpZW50c1t3cml0ZWFibGVdLndyaXRlKCkKQEAgLTI5OCwxMyArMzU0LDE3IEBACiAKICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICIiIkNsb3NlcyB0aGUgc2VydmVyLiIiIgotICAgICAgICBmb3IgXyBpbiB4cmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKICAgICAgICAgICAgIHNlbGYudGFza3MucHV0KFtOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lXSkKICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQogICAgICAgICBzZWxmLnByZXBhcmVkID0gRmFsc2UKLSAgICAgICAgCisKICAgICBkZWYgc2VydmUoc2VsZik6Ci0gICAgICAgICIiIlNlcnZlIGZvcmV2ZXIuIiIiCisgICAgICAgICIiIlNlcnZlIHJlcXVlc3RzLgorCisgICAgICAgIFNlcnZlIHJlcXVlc3RzIGZvcmV2ZXIsIG9yIHVudGlsIHN0b3AoKSBpcyBjYWxsZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKICAgICAgICAgc2VsZi5wcmVwYXJlKCkKLSAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuX3N0b3A6CiAgICAgICAgICAgICBzZWxmLmhhbmRsZSgpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2ZGM4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQpAQCAtMCwwICsxLDEyMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaW1wb3J0IGxvZ2dpbmcKKworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFByb2Nlc3MsIFZhbHVlLCBDb25kaXRpb24KKworZnJvbSAuVFNlcnZlciBpbXBvcnQgVFNlcnZlcgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKworY2xhc3MgVFByb2Nlc3NQb29sU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHdvcmtlciBzdWJwcm9jZXNzZXMgdG8gc2VydmljZSByZXF1ZXN0cworCisgICAgTm90ZSB0aGF0IGlmIHlvdSBuZWVkIHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIHRoZSBoYW5kbGVycyAtIGl0J3MgdXAgdG8geW91IQorICAgIFdyaXR0ZW4gYnkgRHZpciBWb2xrLCBkb2F0LmNvbQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYubnVtV29ya2VycyA9IDEwCisgICAgICAgIHNlbGYud29ya2VycyA9IFtdCisgICAgICAgIHNlbGYuaXNSdW5uaW5nID0gVmFsdWUoJ2InLCBGYWxzZSkKKyAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uID0gQ29uZGl0aW9uKCkKKyAgICAgICAgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrID0gTm9uZQorCisgICAgZGVmIHNldFBvc3RGb3JrQ2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICBpZiBub3QgY2FsbGFibGUoY2FsbGJhY2spOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUaGlzIGlzIG5vdCBhIGNhbGxiYWNrISIpCisgICAgICAgIHNlbGYucG9zdEZvcmtDYWxsYmFjayA9IGNhbGxiYWNrCisKKyAgICBkZWYgc2V0TnVtV29ya2VycyhzZWxmLCBudW0pOgorICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCisgICAgICAgIHNlbGYubnVtV29ya2VycyA9IG51bQorCisgICAgZGVmIHdvcmtlclByb2Nlc3Moc2VsZik6CisgICAgICAgICIiIkxvb3AgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtIiIiCisgICAgICAgIGlmIHNlbGYucG9zdEZvcmtDYWxsYmFjazoKKyAgICAgICAgICAgIHNlbGYucG9zdEZvcmtDYWxsYmFjaygpCisKKyAgICAgICAgd2hpbGUgc2VsZi5pc1J1bm5pbmcudmFsdWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKKyAgICAgICAgIiIiUHJvY2VzcyBpbnB1dC9vdXRwdXQgZnJvbSBhIGNsaWVudCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZSIiIgorICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKyAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICBvdHJhbnMuY2xvc2UoKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICAiIiJTdGFydCB3b3JrZXJzIGFuZCBwdXQgaW50byBxdWV1ZSIiIgorICAgICAgICAjIHRoaXMgaXMgYSBzaGFyZWQgc3RhdGUgdGhhdCBjYW4gdGVsbCB0aGUgd29ya2VycyB0byBleGl0IHdoZW4gRmFsc2UKKyAgICAgICAgc2VsZi5pc1J1bm5pbmcudmFsdWUgPSBUcnVlCisKKyAgICAgICAgIyBmaXJzdCBiaW5kIGFuZCBsaXN0ZW4gdG8gdGhlIHBvcnQKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKworICAgICAgICAjIGZvcmsgdGhlIGNoaWxkcmVuCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubnVtV29ya2Vycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdyA9IFByb2Nlc3ModGFyZ2V0PXNlbGYud29ya2VyUHJvY2VzcykKKyAgICAgICAgICAgICAgICB3LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgICAgICB3LnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBzZWxmLndvcmtlcnMuYXBwZW5kKHcpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICMgd2FpdCB1bnRpbCB0aGUgY29uZGl0aW9uIGlzIHNldCBieSBzdG9wKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi5hY3F1aXJlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24ud2FpdCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCAoU3lzdGVtRXhpdCwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIHNlbGYuaXNSdW5uaW5nLnZhbHVlID0gRmFsc2UKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLmlzUnVubmluZy52YWx1ZSA9IEZhbHNlCisgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLm5vdGlmeSgpCisgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CmluZGV4IDYxNTI5MTEuLmRmMmE3YmIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQpAQCAtMTcsMjU0ICsxNywzMDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBzeXMKIGltcG9ydCBvcwotaW1wb3J0IHRyYWNlYmFjawogaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IFF1ZXVlCiAKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvcgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USGVhZGVyUHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi1jbGFzcyBUU2VydmVyOgorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKLSAgIiIiQmFzZSBpbnRlcmZhY2UgZm9yIGEgc2VydmVyLCB3aGljaCBtdXN0IGhhdmUgYSBzZXJ2ZSBtZXRob2QuIiIiCiAKLSAgIiIiIDMgY29uc3RydWN0b3JzIGZvciBhbGwgc2VydmVyczoKLSAgMSkgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQotICAyKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKLSAgMykgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBpZiAobGVuKGFyZ3MpID09IDIpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgZWxpZiAobGVuKGFyZ3MpID09IDQpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1szXSkKLSAgICBlbGlmIChsZW4oYXJncykgPT0gNik6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKQorY2xhc3MgVFNlcnZlcihvYmplY3QpOgorICAgICIiIkJhc2UgaW50ZXJmYWNlIGZvciBhIHNlcnZlciwgd2hpY2ggbXVzdCBoYXZlIGEgc2VydmUoKSBtZXRob2QuCiAKLSAgZGVmIF9faW5pdEFyZ3NfXyhzZWxmLCBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk6Ci0gICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydAotICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQotICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgVGhyZWUgY29uc3RydWN0b3JzIGZvciBhbGwgc2VydmVyczoKKyAgICAxKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgMykgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAyKToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBlbGlmIChsZW4oYXJncykgPT0gNCk6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzNdKQorICAgICAgICBlbGlmIChsZW4oYXJncykgPT0gNik6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIF9faW5pdEFyZ3NfXyhzZWxmLCBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydAorICAgICAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQorICAgICAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQorCisgICAgICAgIGlucHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgb3V0cHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIGlmIGFueSgoaW5wdXRfaXNfaGVhZGVyLCBvdXRwdXRfaXNfaGVhZGVyKSkgYW5kIGlucHV0X2lzX2hlYWRlciAhPSBvdXRwdXRfaXNfaGVhZGVyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVEhlYWRlclByb3RvY29sIHNlcnZlcnMgcmVxdWlyZSB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgcHJvdG9jb2xzIGFyZSBUSGVhZGVyUHJvdG9jb2wuIikKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgcGFzcworCiAKIGNsYXNzIFRTaW1wbGVTZXJ2ZXIoVFNlcnZlcik6CisgICAgIiIiU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgdGhhdCBqdXN0IHB1bXBzIGFyb3VuZCBvbmUgdHJhbnNwb3J0LiIiIgogCi0gICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLQotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCiAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgcGFzcwotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgIGl0cmFucy5jbG9zZSgpCi0gICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisKKyAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yCisgICAgICAgICAgICAjIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisKIAogY2xhc3MgVFRocmVhZGVkU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlRocmVhZGVkIHNlcnZlciB0aGF0IHNwYXducyBhIG5ldyB0aHJlYWQgcGVyIGVhY2ggY29ubmVjdGlvbi4iIiIKIAotICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuaGFuZGxlLCBhcmdzPShjbGllbnQsKSkKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQgPSBzZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6CisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgZGVmIGhhbmRsZShzZWxmLCBjbGllbnQpOgotICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgIHBhc3MKLSAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisKIAogY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIoVFNlcnZlcik6CisgICAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2YgdGhyZWFkcyB3aGljaCBzZXJ2aWNlIHJlcXVlc3RzLiIiIgogCi0gICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jbGllbnRzID0gcXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLnRocmVhZHMgPSAxMAorICAgICAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNsaWVudHMgPSBRdWV1ZS5RdWV1ZSgpCi0gICAgc2VsZi50aHJlYWRzID0gMTAKKyAgICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgorICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCisgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCi0gIGRlZiBzZXROdW1UaHJlYWRzKHNlbGYsIG51bSk6Ci0gICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgotICAgIHNlbGYudGhyZWFkcyA9IG51bQorICAgIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKKyAgICAgICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmVUaHJlYWQoc2VsZik6Ci0gICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQotICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CisgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKLSAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCi0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgcGFzcwotICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgaXRyYW5zLmNsb3NlKCkKLSAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgotICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldCA9IHNlbGYuc2VydmVUaHJlYWQpCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKIAotICAgICMgUHVtcCB0aGUgc29ja2V0IGZvciBjbGllbnRzCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICBzZWxmLmNsaWVudHMucHV0KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZVRocmVhZCkKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgIyBQdW1wIHRoZSBzb2NrZXQgZm9yIGNsaWVudHMKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAKIGNsYXNzIFRGb3JraW5nU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogCi0gICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdCIiIgotICAiIiIKLSAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQotICBHSUwgY29udGVudGlvbi4KKyAgICBUaGlzIGlzIG1vcmUgc2NhbGFibGUgdGhhbiB0aGUgdGhyZWFkZWQgc2VydmVyIGFzIGl0IGRvZXMgbm90IGNhdXNlCisgICAgR0lMIGNvbnRlbnRpb24uCiAKLSAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KLSAgU3BlY2lmaWNhbGx5LCB1cGRhdGVzIHRvIHNoYXJlZCB2YXJpYWJsZXMgd2lsbCBubyBsb25nZXIgYmUgc2hhcmVkLgotICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KKyAgICBOb3RlIHRoYXQgdGhpcyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmcm9tIHRoZSB0aHJlYWRpbmcgc2VydmVyLgorICAgIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KKyAgICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KIAotICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQotICBQeXRob24gc3RkbGliLgotICAiIiIKKyAgICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQorICAgIFB5dGhvbiBzdGRsaWIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuY2hpbGRyZW4gPSBbXQotCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBkZWYgdHJ5X2Nsb3NlKGZpbGUpOgotICAgICAgdHJ5OgotICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgotICAgICAgICBsb2dnaW5nLndhcm5pbmcoZSwgZXhjX2luZm89VHJ1ZSkKLQotCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIHRyeToKLSAgICAgICAgcGlkID0gb3MuZm9yaygpCi0KLSAgICAgICAgaWYgcGlkOiAjIHBhcmVudAotICAgICAgICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKHBpZCkKLSAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgICAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQKLSAgICAgICAgICAjIGNsb3NlZCBwcm9tcHRseQotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0KLSAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotCi0gICAgICAgICAgZWNvZGUgPSAwCi0gICAgICAgICAgdHJ5OgorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgZGVmIHRyeV9jbG9zZShmaWxlKToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgotICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihlKQotICAgICAgICAgICAgICBlY29kZSA9IDEKLSAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCiAKLSAgICAgICAgICBvcy5fZXhpdChlY29kZSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCiAKLSAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAgICAgICAgIGlmIHBpZDogICMgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCiAKKyAgICAgICAgICAgICAgICAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQKKyAgICAgICAgICAgICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCisgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKLSAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgotICAgICAgdHJ5OgotICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKLSAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICMgaW5zdGFuY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAgICAgICAgICAgICAgIyBpbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICAgIGlmIHBpZDoKLSAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQotICAgICAgZWxzZToKLSAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAwCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY29kZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKIAorICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdChlY29kZSkKIAorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGlkID0gTm9uZQorCisgICAgICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNTY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkKQEAgLTAsMCArMSwzNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3RydWN0CitpbXBvcnQgemxpYgorCitmcm9tIHRocmlmdC5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPLCBieXRlX2luZGV4Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgcmVhZFZhcmludCwgd3JpdGVWYXJpbnQKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgKAorICAgIENSZWFkYWJsZVRyYW5zcG9ydCwKKyAgICBUTWVtb3J5QnVmZmVyLAorICAgIFRUcmFuc3BvcnRCYXNlLAorICAgIFRUcmFuc3BvcnRFeGNlcHRpb24sCispCisKKworVTE2ID0gc3RydWN0LlN0cnVjdCgiIUgiKQorSTMyID0gc3RydWN0LlN0cnVjdCgiIWkiKQorSEVBREVSX01BR0lDID0gMHgwRkZGCitIQVJEX01BWF9GUkFNRV9TSVpFID0gMHgzRkZGRkZGRgorCisKK2NsYXNzIFRIZWFkZXJDbGllbnRUeXBlKG9iamVjdCk6CisgICAgSEVBREVSUyA9IDB4MDAKKworICAgIEZSQU1FRF9CSU5BUlkgPSAweDAxCisgICAgVU5GUkFNRURfQklOQVJZID0gMHgwMgorCisgICAgRlJBTUVEX0NPTVBBQ1QgPSAweDAzCisgICAgVU5GUkFNRURfQ09NUEFDVCA9IDB4MDQKKworCitjbGFzcyBUSGVhZGVyU3VicHJvdG9jb2xJRChvYmplY3QpOgorICAgIEJJTkFSWSA9IDB4MDAKKyAgICBDT01QQUNUID0gMHgwMgorCisKK2NsYXNzIFRJbmZvSGVhZGVyVHlwZShvYmplY3QpOgorICAgIEtFWV9WQUxVRSA9IDB4MDEKKworCitjbGFzcyBUSGVhZGVyVHJhbnNmb3JtSUQob2JqZWN0KToKKyAgICBaTElCID0gMHgwMQorCisKK1JFQURfVFJBTlNGT1JNU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyVHJhbnNmb3JtSUQuWkxJQjogemxpYi5kZWNvbXByZXNzLAorfQorCisKK1dSSVRFX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuY29tcHJlc3MsCit9CisKKworZGVmIF9yZWFkU3RyaW5nKHRyYW5zKToKKyAgICBzaXplID0gcmVhZFZhcmludCh0cmFucykKKyAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGgiCisgICAgICAgICkKKyAgICByZXR1cm4gdHJhbnMucmVhZChzaXplKQorCisKK2RlZiBfd3JpdGVTdHJpbmcodHJhbnMsIHZhbHVlKToKKyAgICB3cml0ZVZhcmludCh0cmFucywgbGVuKHZhbHVlKSkKKyAgICB0cmFucy53cml0ZSh2YWx1ZSkKKworCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUworICAgICAgICBzZWxmLl9hbGxvd2VkX2NsaWVudF90eXBlcyA9IGFsbG93ZWRfY2xpZW50X3R5cGVzCisKKyAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhiIiIpCisgICAgICAgIHNlbGYuX3JlYWRfaGVhZGVycyA9IHt9CisKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgc2VsZi5fd3JpdGVfdHJhbnNmb3JtcyA9IFtdCisKKyAgICAgICAgc2VsZi5mbGFncyA9IDAKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCA9IDAKKyAgICAgICAgc2VsZi5fcHJvdG9jb2xfaWQgPSBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBIQVJEX01BWF9GUkFNRV9TSVpFCisKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0LmlzT3BlbigpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5vcGVuKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2hlYWRlcnMKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXksIGJ5dGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImhlYWRlciBuYW1lcyBtdXN0IGJlIGJ5dGVzIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImhlYWRlciB2YWx1ZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnNba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgY2xlYXJfaGVhZGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycy5jbGVhcigpCisKKyAgICBkZWYgYWRkX3RyYW5zZm9ybShzZWxmLCB0cmFuc2Zvcm1faWQpOgorICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFdSSVRFX1RSQU5TRk9STVNfQllfSUQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIHRyYW5zZm9ybSIpCisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMuYXBwZW5kKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiBzZXRfbWF4X2ZyYW1lX3NpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIG5vdCAwIDwgc2l6ZSA8IEhBUkRfTUFYX0ZSQU1FX1NJWkU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtYXhpbXVtIGZyYW1lIHNpemUgc2hvdWxkIGJlIDwgJWQgYW5kID4gMCIgJSBIQVJEX01BWF9GUkFNRV9TSVpFKQorICAgICAgICBzZWxmLl9tYXhfZnJhbWVfc2l6ZSA9IHNpemUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcm90b2NvbF9pZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgPT0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbF9pZAorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICByZXR1cm4gVEhlYWRlclN1YnByb3RvY29sSUQuQ09NUEFDVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlByb3RvY29sIElEIG5vdCBrbm93IGZvciBjbGllbnQgdHlwZSAlZCIgJSBzZWxmLl9jbGllbnRfdHlwZSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgIyBpZiB0aGVyZSBhcmUgYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyLCBwcm9kdWNlIHRob3NlIGZpcnN0LgorICAgICAgICBieXRlc19yZWFkID0gc2VsZi5fcmVhZF9idWZmZXIucmVhZChzeikKKyAgICAgICAgYnl0ZXNfbGVmdF90b19yZWFkID0gc3ogLSBsZW4oYnl0ZXNfcmVhZCkKKyAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID09IDA6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZAorCisgICAgICAgICMgaWYgd2UndmUgZGV0ZXJtaW5lZCB0aGlzIGlzIGFuIHVuZnJhbWVkIGNsaWVudCwganVzdCBwYXNzIHRoZSByZWFkCisgICAgICAgICMgdGhyb3VnaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdW50aWwgd2UncmUgcmVzZXQgYWdhaW4gYXQgdGhlCisgICAgICAgICMgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1lc3NhZ2UuCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl90cmFuc3BvcnQucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisKKyAgICAgICAgIyB3ZSdyZSBlbXB0eSBhbmQgKG1heWJlKSBmcmFtZWQuIGZpbGwgdGhlIGJ1ZmZlcnMgd2l0aCB0aGUgbmV4dCBmcmFtZS4KKyAgICAgICAgc2VsZi5yZWFkRnJhbWUoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZCArIHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgZGVmIF9zZXRfY2xpZW50X3R5cGUoc2VsZiwgY2xpZW50X3R5cGUpOgorICAgICAgICBpZiBjbGllbnRfdHlwZSBub3QgaW4gc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXM6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ2xpZW50IHR5cGUgJWQgbm90IGFsbG93ZWQgYnkgc2VydmVyLiIgJSBjbGllbnRfdHlwZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fY2xpZW50X3R5cGUgPSBjbGllbnRfdHlwZQorCisgICAgZGVmIHJlYWRGcmFtZShzZWxmLCByZXFfc3opOgorICAgICAgICAjIHRoZSBmaXJzdCB3b3JkIGNvdWxkIGVpdGhlciBiZSB0aGUgbGVuZ3RoIGZpZWxkIG9mIGEgZnJhbWVkIG1lc3NhZ2UKKyAgICAgICAgIyBvciB0aGUgZmlyc3QgYnl0ZXMgb2YgYW4gdW5mcmFtZWQgbWVzc2FnZS4KKyAgICAgICAgZmlyc3Rfd29yZCA9IHNlbGYuX3RyYW5zcG9ydC5yZWFkQWxsKEkzMi5zaXplKQorICAgICAgICBmcmFtZV9zaXplLCA9IEkzMi51bnBhY2soZmlyc3Rfd29yZCkKKyAgICAgICAgaXNfdW5mcmFtZWQgPSBGYWxzZQorICAgICAgICBpZiBmcmFtZV9zaXplICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSkKKyAgICAgICAgICAgIGlzX3VuZnJhbWVkID0gVHJ1ZQorICAgICAgICBlbGlmIChieXRlX2luZGV4KGZpcnN0X3dvcmQsIDApID09IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgYW5kCisgICAgICAgICAgICAgIGJ5dGVfaW5kZXgoZmlyc3Rfd29yZCwgMSkgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT04pOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKworICAgICAgICBpZiBpc191bmZyYW1lZDoKKyAgICAgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHJlcV9zeiAtIEkzMi5zaXplCisgICAgICAgICAgICBpZiBieXRlc19sZWZ0X3RvX3JlYWQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3QgPSBzZWxmLl90cmFuc3BvcnQucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3QgPSBiIiIKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oZmlyc3Rfd29yZCArIHJlc3QpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIG9rLCB3ZSdyZSBzdGlsbCBoZXJlIHNvIHdlJ3JlIGZyYW1lZC4KKyAgICAgICAgaWYgZnJhbWVfc2l6ZSA+IHNlbGYuX21heF9mcmFtZV9zaXplOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkZyYW1lIHdhcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhzZWxmLl90cmFuc3BvcnQucmVhZEFsbChmcmFtZV9zaXplKSkKKworICAgICAgICAjIHRoZSBuZXh0IHdvcmQgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHRoZSB2ZXJzaW9uIGZpZWxkIG9mIGEKKyAgICAgICAgIyBiaW5hcnkvY29tcGFjdCBwcm90b2NvbCBtZXNzYWdlIG9yIHRoZSBtYWdpYyB2YWx1ZSArIGZsYWdzIG9mIGEKKyAgICAgICAgIyBoZWFkZXIgcHJvdG9jb2wgbWVzc2FnZS4KKyAgICAgICAgc2Vjb25kX3dvcmQgPSByZWFkX2J1ZmZlci5yZWFkKEkzMi5zaXplKQorICAgICAgICB2ZXJzaW9uLCA9IEkzMi51bnBhY2soc2Vjb25kX3dvcmQpCisgICAgICAgIHJlYWRfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgaWYgdmVyc2lvbiA+PiAxNiA9PSBIRUFERVJfTUFHSUM6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUykKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gc2VsZi5fcGFyc2VfaGVhZGVyX2Zvcm1hdChyZWFkX2J1ZmZlcikKKyAgICAgICAgZWxpZiB2ZXJzaW9uICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsaWYgKGJ5dGVfaW5kZXgoc2Vjb25kX3dvcmQsIDApID09IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgYW5kCisgICAgICAgICAgICAgIGJ5dGVfaW5kZXgoc2Vjb25kX3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gcmVhZF9idWZmZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZS4iLAorICAgICAgICAgICAgKQorCisgICAgZGVmIF9wYXJzZV9oZWFkZXJfZm9ybWF0KHNlbGYsIGJ1ZmZlcik6CisgICAgICAgICMgbWFrZSBCdWZmZXJJTyBsb29rIGxpa2UgVFRyYW5zcG9ydCBmb3IgdmFyaW50IGhlbHBlcnMKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXIoKQorICAgICAgICBidWZmZXJfdHJhbnNwb3J0Ll9idWZmZXIgPSBidWZmZXIKKworICAgICAgICBidWZmZXIucmVhZCgyKSAgIyBkaXNjYXJkIHRoZSBtYWdpYyBieXRlcworICAgICAgICBzZWxmLmZsYWdzLCA9IFUxNi51bnBhY2soYnVmZmVyLnJlYWQoVTE2LnNpemUpKQorICAgICAgICBzZWxmLnNlcXVlbmNlX2lkLCA9IEkzMi51bnBhY2soYnVmZmVyLnJlYWQoSTMyLnNpemUpKQorCisgICAgICAgIGhlYWRlcl9sZW5ndGggPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSlbMF0gKiA0CisgICAgICAgIGVuZF9vZl9oZWFkZXJzID0gYnVmZmVyLnRlbGwoKSArIGhlYWRlcl9sZW5ndGgKKyAgICAgICAgaWYgZW5kX29mX2hlYWRlcnMgPiBsZW4oYnVmZmVyLmdldHZhbHVlKCkpOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIGxhcmdlciB0aGFuIHdob2xlIGZyYW1lLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fcHJvdG9jb2xfaWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisKKyAgICAgICAgdHJhbnNmb3JtcyA9IFtdCisgICAgICAgIHRyYW5zZm9ybV9jb3VudCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UodHJhbnNmb3JtX2NvdW50KToKKyAgICAgICAgICAgIHRyYW5zZm9ybV9pZCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIHRyYW5zZm9ybV9pZCBub3QgaW4gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVkFMSURfVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAiVW5rbm93biB0cmFuc2Zvcm06ICVkIiAlIHRyYW5zZm9ybV9pZCwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisgICAgICAgIHRyYW5zZm9ybXMucmV2ZXJzZSgpCisKKyAgICAgICAgaGVhZGVycyA9IHt9CisgICAgICAgIHdoaWxlIGJ1ZmZlci50ZWxsKCkgPCBlbmRfb2ZfaGVhZGVyczoKKyAgICAgICAgICAgIGhlYWRlcl90eXBlID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgaWYgaGVhZGVyX3R5cGUgPT0gVEluZm9IZWFkZXJUeXBlLktFWV9WQUxVRToKKyAgICAgICAgICAgICAgICBjb3VudCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX3JlYWRTdHJpbmcoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsgICMgaWdub3JlIHVua25vd24gaGVhZGVycworICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSBoZWFkZXJzCisKKyAgICAgICAgIyBza2lwIHBhZGRpbmcgLyBhbnl0aGluZyB3ZSBkaWRuJ3QgdW5kZXJzdGFuZAorICAgICAgICBidWZmZXIuc2VlayhlbmRfb2ZfaGVhZGVycykKKworICAgICAgICBwYXlsb2FkID0gYnVmZmVyLnJlYWQoKQorICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHRyYW5zZm9ybXM6CisgICAgICAgICAgICB0cmFuc2Zvcm1fZm4gPSBSRUFEX1RSQU5TRk9STVNfQllfSURbdHJhbnNmb3JtX2lkXQorICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorICAgICAgICByZXR1cm4gQnVmZmVySU8ocGF5bG9hZCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fd3JpdGVfYnVmZmVyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyID0gQnVmZmVySU8oKQorCisgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgPT0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUzoKKyAgICAgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gc2VsZi5fd3JpdGVfdHJhbnNmb3JtczoKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fZm4gPSBXUklURV9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gdHJhbnNmb3JtX2ZuKHBheWxvYWQpCisKKyAgICAgICAgICAgIGhlYWRlcnMgPSBCdWZmZXJJTygpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBzZWxmLl9wcm90b2NvbF9pZCkKKyAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV90cmFuc2Zvcm1zKSkKKyAgICAgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gc2VsZi5fd3JpdGVfdHJhbnNmb3JtczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCB0cmFuc2Zvcm1faWQpCisgICAgICAgICAgICBpZiBzZWxmLl93cml0ZV9oZWFkZXJzOgorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUUpCisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgbGVuKHNlbGYuX3dyaXRlX2hlYWRlcnMpKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX3dyaXRlX2hlYWRlcnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlU3RyaW5nKGhlYWRlcnMsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlU3RyaW5nKGhlYWRlcnMsIHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMgPSB7fQorICAgICAgICAgICAgcGFkZGluZ19uZWVkZWQgPSAoNCAtIChsZW4oaGVhZGVycy5nZXR2YWx1ZSgpKSAlIDQpKSAlIDQKKyAgICAgICAgICAgIGhlYWRlcnMud3JpdGUoYiJceDAwIiAqIHBhZGRpbmdfbmVlZGVkKQorICAgICAgICAgICAgaGVhZGVyX2J5dGVzID0gaGVhZGVycy5nZXR2YWx1ZSgpCisKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjaygxMCArIGxlbihoZWFkZXJfYnl0ZXMpICsgbGVuKHBheWxvYWQpKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhIRUFERVJfTUFHSUMpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKHNlbGYuZmxhZ3MpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKHNlbGYuc2VxdWVuY2VfaWQpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKGxlbihoZWFkZXJfYnl0ZXMpIC8vIDQpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKGhlYWRlcl9ieXRlcykKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2sobGVuKHBheWxvYWQpKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBjbGllbnQgdHlwZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgICMgdGhlIGZyYW1lIGxlbmd0aCBmaWVsZCBkb2Vzbid0IGNvdW50IHRvd2FyZHMgdGhlIGZyYW1lIHBheWxvYWQgc2l6ZQorICAgICAgICBmcmFtZV9ieXRlcyA9IGJ1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIGZyYW1lX3BheWxvYWRfc2l6ZSA9IGxlbihmcmFtZV9ieXRlcykgLSA0CisgICAgICAgIGlmIGZyYW1lX3BheWxvYWRfc2l6ZSA+IHNlbGYuX21heF9mcmFtZV9zaXplOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2VuZCBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC53cml0ZShmcmFtZV9ieXRlcykKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICByZXN1bHQgPSBieXRlYXJyYXkocGFydGlhbHJlYWQpCisgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmVzdWx0ICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmVzdWx0KSkKKyAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhyZXN1bHQpCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2J1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQppbmRleCAwNWNhNTNhLi4zN2IwYTRkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQpAQCAtMTcsMTA4ICsxNywxNzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgKgotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi0KLWltcG9ydCB1cmxwYXJzZQotaW1wb3J0IGh0dHBsaWIKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2ltcG9ydCBvcworaW1wb3J0IHNzbAoraW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgYmFzZTY0CisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudAorCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZQoraW1wb3J0IHNpeAorCiAKIGNsYXNzIFRIdHRwQ2xpZW50KFRUcmFuc3BvcnRCYXNlKToKKyAgICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lLCBjYWZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsIGtleV9maWxlPU5vbmUsIHNzbF9jb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbnN0cnVjdGlvbjoKIAotICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lKToKLSAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgICAgICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAorICAgICAgICBUSHR0cENsaWVudCh1cmksIFtwb3J0PTxuPiwgcGF0aD08cz4sIGNhZmlsZT08ZmlsZW5hbWU+LCBjZXJ0X2ZpbGU9PGZpbGVuYW1lPiwga2V5X2ZpbGU9PGZpbGVuYW1lPiwgc3NsX2NvbnRleHQ9PGNvbnRleHQ+XSkKIAotICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAotICAgIFRIdHRwQ2xpZW50KHVyaSkKKyAgICAgICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiAgVG8gcHJvcGVybHkgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciwKKyAgICAgICAgcHJvdmlkZSB0aGUgY2xpZW50J3MgaWRlbnRpdHkgYnkgc3BlY2lmeWluZyBjZXJ0X2ZpbGUgYW5kIGtleV9maWxlLiAgVG8gcHJvcGVybHkKKyAgICAgICAgYXV0aGVudGljYXRlIHRoZSBzZXJ2ZXIsIHNwZWNpZnkgZWl0aGVyIGNhZmlsZSBvciBzc2xfY29udGV4dCB3aXRoIGEgQ0EgZGVmaW5lZC4KKyAgICAgICAgTk9URTogaWYgYm90aCBjYWZpbGUgYW5kIHNzbF9jb250ZXh0IGFyZSBkZWZpbmVkLCBzc2xfY29udGV4dCB3aWxsIG92ZXJyaWRlIGNhZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cHtzfTovL2hvc3Q6cG9ydC9wYXRoJykgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgYXNzZXJ0IHBhdGgKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQorICAgICAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBfUE9SVAorICAgICAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBTX1BPUlQKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydF9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9Y2FmaWxlKSBpZiAoY2FmaWxlIGFuZCBub3Qgc3NsX2NvbnRleHQpIGVsc2Ugc3NsX2NvbnRleHQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKKyAgICAgICAgICAgIGlmIHBhcnNlZC5xdWVyeToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggKz0gJz8lcycgJSBwYXJzZWQucXVlcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJveHkgPSB1cmxsaWIucmVxdWVzdC5nZXRwcm94aWVzKClbc2VsZi5zY2hlbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdXJsbGliLnJlcXVlc3QucHJveHlfYnlwYXNzKHNlbGYuaG9zdCk6CisgICAgICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGlmIHByb3h5OgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHByb3h5KQorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYuaG9zdAorICAgICAgICAgICAgc2VsZi5yZWFscG9ydCA9IHNlbGYucG9ydAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydAorICAgICAgICAgICAgc2VsZi5wcm94eV9hdXRoID0gc2VsZi5iYXNpY19wcm94eV9hdXRoX2hlYWRlcihwYXJzZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5yZWFscG9ydCA9IHNlbGYucHJveHlfYXV0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQogCi0gICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYmFzaWNfcHJveHlfYXV0aF9oZWFkZXIocHJveHkpOgorICAgICAgICBpZiBwcm94eSBpcyBOb25lIG9yIG5vdCBwcm94eS51c2VybmFtZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGFwID0gIiVzOiVzIiAlICh1cmxsaWIucGFyc2UudW5xdW90ZShwcm94eS51c2VybmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIucGFyc2UudW5xdW90ZShwcm94eS5wYXNzd29yZCkpCisgICAgICAgIGNyID0gYmFzZTY0LmI2NGVuY29kZShhcCkuc3RyaXAoKQorICAgICAgICByZXR1cm4gIkJhc2ljICIgKyBjcgogCi0gICAgaWYgcG9ydCBpcyBub3QgTm9uZToKLSAgICAgIHdhcm5pbmdzLndhcm4oIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwOi8vaG9zdDpwb3J0L3BhdGgnKSBzeW50YXgiLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0Ci0gICAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgICBhc3NlcnQgcGF0aAotICAgICAgc2VsZi5wYXRoID0gcGF0aAotICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKLSAgICBlbHNlOgotICAgICAgcGFyc2VkID0gdXJscGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCi0gICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKLSAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQotICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBfUE9SVAotICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBTX1BPUlQKLSAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQotICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9faHR0cCA9IE5vbmUKLSAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICBkZWYgdXNpbmdfcHJveHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWxob3N0IGlzIG5vdCBOb25lCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgc2VsZi5fX2h0dHAgPSBodHRwbGliLkhUVFAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQUyhzZWxmLmhvc3QsIHNlbGYucG9ydCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCkKKyAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZmlsZT1zZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi5fX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0PXNlbGYuY29udGV4dCkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAuc2V0X3R1bm5lbChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlByb3h5LUF1dGhvcml6YXRpb24iOiBzZWxmLnByb3h5X2F1dGh9KQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBzZWxmLl9faHR0cC5jbG9zZSgpCi0gICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9faHR0cC5jbG9zZSgpCisgICAgICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IE5vbmUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9faHR0cCAhPSBOb25lCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19odHRwIGlzIG5vdCBOb25lCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgorICAgICAgICBpZiBtcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgICBpZiBtcyBpcyBOb25lOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMvMTAwMC4wCisgICAgZGVmIHNldEN1c3RvbUhlYWRlcnMoc2VsZiwgaGVhZGVycyk6CisgICAgICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IGhlYWRlcnMKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuX19odHRwLmZpbGUucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFkKHN6KQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBfX3dpdGhUaW1lb3V0KGYpOgotICAgIGRlZiBfZigqYXJncywgKiprd2FyZ3MpOgotICAgICAgb3JpZ190aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChhcmdzWzBdLl9fdGltZW91dCkKLSAgICAgIHJlc3VsdCA9IGYoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9yaWdfdGltZW91dCkKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gX2YKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5vcGVuKCkKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgaWYgc2VsZi5pc09wZW4oKToKLSAgICAgIHNlbGYuY2xvc2UoKQotICAgIHNlbGYub3BlbigpOworICAgICAgICAjIFB1bGwgZGF0YSBvdXQgb2YgYnVmZmVyCisgICAgICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKLSAgICAjIFB1bGwgZGF0YSBvdXQgb2YgYnVmZmVyCi0gICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgIyBIVFRQIHJlcXVlc3QKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpIGFuZCBzZWxmLnNjaGVtZSA9PSAiaHR0cCI6CisgICAgICAgICAgICAjIG5lZWQgZnVsbCBVUkwgb2YgcmVhbCBob3N0IGZvciBIVFRQIHByb3h5IGhlcmUgKEhUVFBTIHVzZXMgQ09OTkVDVCB0dW5uZWwpCisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgImh0dHA6Ly8lczolcyVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LCBzZWxmLnBhdGgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsIHNlbGYucGF0aCkKIAotICAgICMgSFRUUCByZXF1ZXN0Ci0gICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsIHNlbGYucGF0aCkKKyAgICAgICAgIyBXcml0ZSBoZWFkZXJzCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JykKKyAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCkgYW5kIHNlbGYuc2NoZW1lID09ICJodHRwIiBhbmQgc2VsZi5wcm94eV9hdXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCJQcm94eS1BdXRob3JpemF0aW9uIiwgc2VsZi5wcm94eV9hdXRoKQogCi0gICAgIyBXcml0ZSBoZWFkZXJzCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdIb3N0Jywgc2VsZi5ob3N0KQotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JykKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihkYXRhKSkpCi0gICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgb3IgJ1VzZXItQWdlbnQnIG5vdCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICB1c2VyX2FnZW50ID0gJ1B5dGhvbi9USHR0cENsaWVudCcKKyAgICAgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgICAgICBpZiBzY3JpcHQ6CisgICAgICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICclcyAoJXMpJyAlICh1c2VyX2FnZW50LCB1cmxsaWIucGFyc2UucXVvdGUoc2NyaXB0KSkKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCiAKLSAgICAjIFdyaXRlIHBheWxvYWQKLSAgICBzZWxmLl9faHR0cC5zZW5kKGRhdGEpCisgICAgICAgIGlmIHNlbGYuX19jdXN0b21faGVhZGVyczoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuX19jdXN0b21faGVhZGVycyk6CisgICAgICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKGtleSwgdmFsKQogCi0gICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKLSAgICBzZWxmLmNvZGUsIHNlbGYubWVzc2FnZSwgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHAuZ2V0cmVwbHkoKQorICAgICAgICBzZWxmLl9faHR0cC5lbmRoZWFkZXJzKCkKIAotICAjIERlY29yYXRlIGlmIHdlIGtub3cgaG93IHRvIHRpbWVvdXQKLSAgaWYgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgIGZsdXNoID0gX193aXRoVGltZW91dChmbHVzaCkKKyAgICAgICAgIyBXcml0ZSBwYXlsb2FkCisgICAgICAgIHNlbGYuX19odHRwLnNlbmQoZGF0YSkKKworICAgICAgICAjIEdldCByZXBseSB0byBmbHVzaCB0aGUgcmVxdWVzdAorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IHNlbGYuX19odHRwLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5jb2RlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2Uuc3RhdHVzCisgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnJlYXNvbgorICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5tc2cKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NGNhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CkBAIC0wLDAgKzEsMzk2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNvY2tldAoraW1wb3J0IHNzbAoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gLnNzbGNvbXBhdCBpbXBvcnQgX21hdGNoX2hvc3RuYW1lLCBfbWF0Y2hfaGFzX2lwYWRkcmVzcworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAorICAgICdkZWZhdWx0JywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9X19uYW1lX18pCisKKworY2xhc3MgVFNTTEJhc2Uob2JqZWN0KToKKyAgICAjIFNTTENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDwgMi43LjkKKyAgICBfaGFzX3NzbF9jb250ZXh0ID0gc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDlGMAorCisgICAgIyBjaXBoZXJzIGFyZ3VtZW50IGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiA8IDIuNy4wCisgICAgX2hhc19jaXBoZXJzID0gc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDBGMAorCisgICAgIyBGb3IgcHl0aG9uID49IDIuNy45LCB1c2UgbGF0ZXN0IFRMUyB0aGF0IGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAjIHN1cHBvcnRzLgorICAgICMgU1NMIDIuMCBhbmQgMy4wIGFyZSBkaXNhYmxlZCB2aWEgc3NsLk9QX05PX1NTTHYyIGFuZCBzc2wuT1BfTk9fU1NMdjMuCisgICAgIyBGb3IgcHl0aG9uIDwgMi43LjksIHVzZSBUTFMgMS4wIHNpbmNlIFRMU3YxX1ggbm9yIE9QX05PX1NTTHZYIGlzCisgICAgIyB1bmF2YWlsYWJsZS4KKyAgICBfZGVmYXVsdF9wcm90b2NvbCA9IHNzbC5QUk9UT0NPTF9TU0x2MjMgaWYgX2hhc19zc2xfY29udGV4dCBlbHNlIFwKKyAgICAgICAgc3NsLlBST1RPQ09MX1RMU3YxCisKKyAgICBkZWYgX2luaXRfY29udGV4dChzZWxmLCBzc2xfdmVyc2lvbik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBzc2wuU1NMQ29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbnRleHQucHJvdG9jb2wgPT0gc3NsLlBST1RPQ09MX1NTTHYyMzoKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250ZXh0Lm9wdGlvbnMgfD0gc3NsLk9QX05PX1NTTHYyCisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29udGV4dCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3NzbF92ZXJzaW9uID0gc3NsX3ZlcnNpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfc2hvdWxkX3ZlcmlmeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQudmVyaWZ5X21vZGUgIT0gc3NsLkNFUlRfTk9ORQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2VydF9yZXFzICE9IHNzbC5DRVJUX05PTkUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX2NvbnRleHQucHJvdG9jb2wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xfdmVyc2lvbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGV4dAorCisgICAgU1NMX1ZFUlNJT04gPSBfZGVmYXVsdF9wcm90b2NvbAorICAgICIiIgorICBEZWZhdWx0IFNTTCB2ZXJzaW9uLgorICBGb3IgYmFja3dvcmQgY29tcGF0aWJpbGl0eSwgaXQgY2FuIGJlIG1vZGlmaWVkLgorICBVc2UgX19pbml0X18ga2V5d29hcmQgYXJndW1lbnQgInNzbF92ZXJzaW9uIiBpbnN0ZWFkLgorICAiIiIKKworICAgIGRlZiBfZGVwcmVjYXRlZF9hcmcoc2VsZiwgYXJncywga3dhcmdzLCBwb3MsIGtleSk6CisgICAgICAgIGlmIGxlbihhcmdzKSA8PSBwb3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmVhbF9wb3MgPSBwb3MgKyAzCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnJWR0aCBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQuJworICAgICAgICAgICAgJ3BsZWFzZSB1c2Uga2V5d2FyZCBhcmd1bWVudCBpbnN0ZWFuZC4nCisgICAgICAgICAgICAlIHJlYWxfcG9zLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MykKKworICAgICAgICBpZiBrZXkgaW4ga3dhcmdzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICdEdXBsaWNhdGUgYXJndW1lbnQ6ICVkdGggYXJndW1lbnQgYW5kICVzIGtleXdhcmQgYXJndW1lbnQuJworICAgICAgICAgICAgICAgICUgKHJlYWxfcG9zLCBrZXkpKQorICAgICAgICBrd2FyZ3Nba2V5XSA9IGFyZ3NbcG9zXQorCisgICAgZGVmIF91bml4X3NvY2tldF9hcmcoc2VsZiwgaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAga2V5ID0gJ3VuaXhfc29ja2V0JworICAgICAgICBpZiBob3N0IGlzIE5vbmUgYW5kIHBvcnQgaXMgTm9uZSBhbmQgbGVuKGFyZ3MpID09IDEgYW5kIGtleSBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzWzBdCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgPT0gJ1NTTF9WRVJTSU9OJzoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ1NTTF9WRVJTSU9OIGlzIGRlcHJlY2F0ZWQuJworICAgICAgICAgICAgICAgICdwbGVhc2UgdXNlIHNzbF92ZXJzaW9uIGF0dHJpYnV0ZSBpbnN0ZWFkLicsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfdmVyc2lvbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9zaWRlLCBob3N0LCBzc2xfb3B0cyk6CisgICAgICAgIHNlbGYuX3NlcnZlcl9zaWRlID0gc2VydmVyX3NpZGUKKyAgICAgICAgaWYgVFNTTEJhc2UuU1NMX1ZFUlNJT04gIT0gc2VsZi5fZGVmYXVsdF9wcm90b2NvbDoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ1NTTF9WRVJTSU9OIGlzIGRlcHJlY2F0ZWQuJworICAgICAgICAgICAgICAgICdwbGVhc2UgdXNlIHNzbF92ZXJzaW9uIGtleXdhcmQgYXJndW1lbnQgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsX29wdHMucG9wKCdzc2xfY29udGV4dCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IE5vbmUKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlcnZlcl9zaWRlOgorICAgICAgICAgICAgc2VsZi5fc2VydmVyX2hvc3RuYW1lID0gc3NsX29wdHMucG9wKCdzZXJ2ZXJfaG9zdG5hbWUnLCBob3N0KQorICAgICAgICBpZiBzZWxmLl9jb250ZXh0OgorICAgICAgICAgICAgc2VsZi5fY3VzdG9tX2NvbnRleHQgPSBUcnVlCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnSW5jb21wYXRpYmxlIGFyZ3VtZW50czogc3NsX2NvbnRleHQgYW5kICVzJworICAgICAgICAgICAgICAgICAgICAlICcgJy5qb2luKHNzbF9vcHRzLmtleXMoKSkpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdzc2xfY29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHZlcnNpb24gb2YgUHl0aG9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gRmFsc2UKKyAgICAgICAgICAgIHNzbF92ZXJzaW9uID0gc3NsX29wdHMucG9wKCdzc2xfdmVyc2lvbicsIFRTU0xCYXNlLlNTTF9WRVJTSU9OKQorICAgICAgICAgICAgc2VsZi5faW5pdF9jb250ZXh0KHNzbF92ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2xfb3B0cy5wb3AoJ2NlcnRfcmVxcycsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IHNzbF9vcHRzLnBvcCgnY2FfY2VydHMnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0gc3NsX29wdHMucG9wKCdrZXlmaWxlJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBzc2xfb3B0cy5wb3AoJ2NlcnRmaWxlJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IHNzbF9vcHRzLnBvcCgnY2lwaGVycycsIE5vbmUpCisKKyAgICAgICAgICAgIGlmIHNzbF9vcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGtleXdvcmQgYXJndW1lbnRzOiAnLCAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorCisgICAgICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNhX2NlcnRzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX2NlcnRzIGlzIG5lZWRlZCB3aGVuIGNlcnRfcmVxcyBpcyBub3Qgc3NsLkNFUlRfTk9ORScpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhzZWxmLmNhX2NlcnRzLCBvcy5SX09LKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNhX2NlcnRzIGZpbGUgIiVzIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCByZWFkYWJsZSwgY2Fubm90IHZhbGlkYXRlIFNTTCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NlcnRpZmljYXRlcy4nICUgKHNlbGYuY2FfY2VydHMpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNlcnRmaWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2VydGZpbGUKKworICAgIEBjZXJ0ZmlsZS5zZXR0ZXIKKyAgICBkZWYgY2VydGZpbGUoc2VsZiwgY2VydGZpbGUpOgorICAgICAgICBpZiBzZWxmLl9zZXJ2ZXJfc2lkZSBhbmQgbm90IGNlcnRmaWxlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2VydGZpbGUgaXMgbmVlZGVkIGZvciBzZXJ2ZXItc2lkZScpCisgICAgICAgIGlmIGNlcnRmaWxlIGFuZCBub3Qgb3MuYWNjZXNzKGNlcnRmaWxlLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ05vIHN1Y2ggY2VydGZpbGUgZm91bmQ6ICVzJyAlIChjZXJ0ZmlsZSkpCisgICAgICAgIHNlbGYuX2NlcnRmaWxlID0gY2VydGZpbGUKKworICAgIGRlZiBfd3JhcF9zb2NrZXQoc2VsZiwgc29jayk6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jdXN0b21fY29udGV4dDoKKyAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LnZlcmlmeV9tb2RlID0gc2VsZi5jZXJ0X3JlcXMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNlcnRmaWxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmtleWZpbGUpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LnNldF9jaXBoZXJzKHNlbGYuY2lwaGVycykKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLmNhX2NlcnRzKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX2NvbnRleHQud3JhcF9zb2NrZXQoCisgICAgICAgICAgICAgICAgc29jaywgc2VydmVyX3NpZGU9c2VsZi5fc2VydmVyX3NpZGUsCisgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPXNlbGYuX3NlcnZlcl9ob3N0bmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNzbF9vcHRzID0geworICAgICAgICAgICAgICAgICdzc2xfdmVyc2lvbic6IHNlbGYuX3NzbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICdzZXJ2ZXJfc2lkZSc6IHNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgICdjYV9jZXJ0cyc6IHNlbGYuY2FfY2VydHMsCisgICAgICAgICAgICAgICAgJ2tleWZpbGUnOiBzZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRmaWxlJzogc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAnY2VydF9yZXFzJzogc2VsZi5jZXJ0X3JlcXMsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiBzZWxmLmNpcGhlcnM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faGFzX2NpcGhlcnM6CisgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRzWydjaXBoZXJzJ10gPSBzZWxmLmNpcGhlcnMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICdjaXBoZXJzIGlzIHNwZWNpZmllZCBidXQgaWdub3JlZCBkdWUgdG8gb2xkIFB5dGhvbiB2ZXJzaW9uJykKKyAgICAgICAgICAgIHJldHVybiBzc2wud3JhcF9zb2NrZXQoc29jaywgKipzc2xfb3B0cykKKworCitjbGFzcyBUU1NMU29ja2V0KFRTb2NrZXQuVFNvY2tldCwgVFNTTEJhc2UpOgorICAgICIiIgorICAgIFNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU29ja2V0CisKKyAgICBUaGlzIGNsYXNzIGNyZWF0ZXMgb3V0Ym91bmQgc29ja2V0cyB3cmFwcGVkIHVzaW5nIHRoZQorICAgIHB5dGhvbiBzdGFuZGFyZCBzc2wgbW9kdWxlIGZvciBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCisgICAgIiIiCisKKyAgICAjIE5ldyBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsCisgICAgIyAgICAgICAgICAgICAgKipzc2xfYXJncyk6CisgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwKKyAgICAjICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsCisgICAgIyAgICAgICAgICAgICAgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJQb3NpdGlvbmFsIGFyZ3VtZW50czogYGBob3N0YGAsIGBgcG9ydGBgLCBgYHVuaXhfc29ja2V0YGAKKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czogYGBrZXlmaWxlYGAsIGBgY2VydGZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgc3NsX3ZlcnNpb25gYCwgYGBjYV9jZXJ0c2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBjaXBoZXJzYGAgKFB5dGhvbiAyLjcuMCBvciBsYXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgIChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgIFBhc3NlZCB0byBzc2wud3JhcF9zb2NrZXQuIFNlZSBzc2wud3JhcF9zb2NrZXQgZG9jdW1lbnRhdGlvbi4KKworICAgICAgICBBbHRlcm5hdGl2ZSBrZXl3b3JkIGFyZ3VtZW50czogKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgICBgYHNzbF9jb250ZXh0YGA6IHNzbC5TU0xDb250ZXh0IHRvIGJlIHVzZWQgZm9yIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKyAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgOiBQYXNzZWQgdG8gU1NMQ29udGV4dC53cmFwX3NvY2tldAorCisgICAgICAgIENvbW1vbiBrZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICAgIGBgdmFsaWRhdGVfY2FsbGJhY2tgYCAoY2VydCwgaG9zdG5hbWUpIC0+IE5vbmU6CisgICAgICAgICAgICAgIENhbGxlZCBhZnRlciBTU0wgaGFuZHNoYWtlLiBDYW4gcmFpc2Ugd2hlbiBob3N0bmFtZSBkb2VzIG5vdAorICAgICAgICAgICAgICBtYXRjaCB0aGUgY2VydC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaXNfdmFsaWQgPSBGYWxzZQorICAgICAgICBzZWxmLnBlZXJjZXJ0ID0gTm9uZQorCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBpZiBsZW4oYXJncykgPiA2OgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudCcpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdW5peF9zb2NrZXRfYXJnKGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAwLCAndmFsaWRhdGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAxLCAnY2FfY2VydHMnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAyLCAna2V5ZmlsZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDMsICdjZXJ0ZmlsZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDQsICd1bml4X3NvY2tldCcpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDUsICdjaXBoZXJzJykKKworICAgICAgICB2YWxpZGF0ZSA9IGt3YXJncy5wb3AoJ3ZhbGlkYXRlJywgTm9uZSkKKyAgICAgICAgaWYgdmFsaWRhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjZXJ0X3JlcXNfbmFtZSA9ICdDRVJUX1JFUVVJUkVEJyBpZiB2YWxpZGF0ZSBlbHNlICdDRVJUX05PTkUnCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICd2YWxpZGF0ZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRfcmVxcz1zc2wuJXMgaW5zdGVhZCcKKyAgICAgICAgICAgICAgICAlIGNlcnRfcmVxc19uYW1lLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgaWYgJ2NlcnRfcmVxcycgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IHNwZWNpZnkgYm90aCB2YWxpZGF0ZSBhbmQgY2VydF9yZXFzJykKKyAgICAgICAgICAgIGt3YXJnc1snY2VydF9yZXFzJ10gPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiB2YWxpZGF0ZSBlbHNlIHNzbC5DRVJUX05PTkUKKworICAgICAgICB1bml4X3NvY2tldCA9IGt3YXJncy5wb3AoJ3VuaXhfc29ja2V0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2sgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZV9jYWxsYmFjaycsIF9tYXRjaF9ob3N0bmFtZSkKKyAgICAgICAgVFNTTEJhc2UuX19pbml0X18oc2VsZiwgRmFsc2UsIGhvc3QsIGt3YXJncykKKyAgICAgICAgVFNvY2tldC5UU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgICAgICB3YXJuaW5ncy53YXJuKCd2YWxpZGF0ZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRfcmVxcyBpbnN0ZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIHNlbGYuY2VydF9yZXFzICE9IHNzbC5DRVJUX05PTkUKKworICAgIEB2YWxpZGF0ZS5zZXR0ZXIKKyAgICBkZWYgdmFsaWRhdGUoc2VsZiwgdmFsdWUpOgorICAgICAgICB3YXJuaW5ncy53YXJuKCd2YWxpZGF0ZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRfcmVxcyBpbnN0ZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiB2YWx1ZSBlbHNlIHNzbC5DRVJUX05PTkUKKworICAgIGRlZiBfZG9fb3BlbihzZWxmLCBmYW1pbHksIHNvY2t0eXBlKToKKyAgICAgICAgcGxhaW5fc29jayA9IHNvY2tldC5zb2NrZXQoZmFtaWx5LCBzb2NrdHlwZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfc29ja2V0KHBsYWluX3NvY2spCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwbGFpbl9zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIG1zZyA9ICdmYWlsZWQgdG8gaW5pdGlhbGl6ZSBTU0wnCisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHN1cGVyKFRTU0xTb2NrZXQsIHNlbGYpLm9wZW4oKQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgc2VsZi5wZWVyY2VydCA9IHNlbGYuaGFuZGxlLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhzZWxmLnBlZXJjZXJ0LCBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBzdHIoZXgpKQorCisKK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKKworICAgIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCisgICAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgorICAgICIiIgorCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCAqKnNzbF9hcmdzKToKKyAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIGNlcnRmaWxlPSdjZXJ0LnBlbScsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJQb3NpdGlvbmFsIGFyZ3VtZW50czogYGBob3N0YGAsIGBgcG9ydGBgLCBgYHVuaXhfc29ja2V0YGAKKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czogYGBrZXlmaWxlYGAsIGBgY2VydGZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwgYGBzc2xfdmVyc2lvbmBgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBjYV9jZXJ0c2BgLCBgYGNpcGhlcnNgYCAoUHl0aG9uIDIuNy4wIG9yIGxhdGVyKQorICAgICAgICBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMzoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ2NlcnRmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ3VuaXhfc29ja2V0JykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2NpcGhlcnMnKQorCisgICAgICAgIGlmICdzc2xfY29udGV4dCcgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICMgUHJlc2VydmUgZXhpc3RpbmcgYmVoYXZpb3JzIGZvciBkZWZhdWx0IHZhbHVlcworICAgICAgICAgICAgaWYgJ2NlcnRfcmVxcycgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfTk9ORQorICAgICAgICAgICAgaWYnY2VydGZpbGUnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAga3dhcmdzWydjZXJ0ZmlsZSddID0gJ2NlcnQucGVtJworCisgICAgICAgIHVuaXhfc29ja2V0ID0ga3dhcmdzLnBvcCgndW5peF9zb2NrZXQnLCBOb25lKQorICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayA9IFwKKyAgICAgICAgICAgIGt3YXJncy5wb3AoJ3ZhbGlkYXRlX2NhbGxiYWNrJywgX21hdGNoX2hvc3RuYW1lKQorICAgICAgICBUU1NMQmFzZS5fX2luaXRfXyhzZWxmLCBUcnVlLCBOb25lLCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNlcnZlclNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeSBhbmQgbm90IF9tYXRjaF9oYXNfaXBhZGRyZXNzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTmVlZCBpcGFkZHJlc3MgYW5kIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlIHRvIHZlcmlmeSBjbGllbnQgY2VydGlmaWNhdGUnKQorCisgICAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgIiIiU2V0IG9yIGNoYW5nZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGZpbGUgdXNlZCB0byB3cmFwIG5ldworICAgICAgICBjb25uZWN0aW9ucy4KKworICAgICAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKKyAgICAgICAgQHR5cGUgY2VydGZpbGU6IHN0cgorCisgICAgICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB0aGUgY2VydGZpbGUgaXMgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnc2V0Q2VydGZpbGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0ZmlsZSBwcm9wZXJ0eSBpbnN0ZWFkLicsCisgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwbGFpbl9jbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9jbGllbnQpCisgICAgICAgIGV4Y2VwdCAoc3NsLlNTTEVycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRXJyb3Igd2hpbGUgYWNjZXB0aW5nIGZyb20gJXMnLCBhZGRyKQorICAgICAgICAgICAgIyBmYWlsZWQgaGFuZHNoYWtlL3NzbCB3cmFwLCBjbG9zZSBzb2NrZXQgdG8gY2xpZW50CisgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgIyByYWlzZQorICAgICAgICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkCisgICAgICAgICAgICAjIHNlcnZlKCkgbWV0aG9kcy4KKyAgICAgICAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCisgICAgICAgICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgIGNsaWVudC5wZWVyY2VydCA9IGNsaWVudC5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2soY2xpZW50LnBlZXJjZXJ0LCBhZGRyWzBdKQorICAgICAgICAgICAgICAgIGNsaWVudC5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGUgYWRkcmVzczogJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGV4Y19pbmZvPVRydWUpCisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmVzdWx0ID0gVFNvY2tldC5UU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGNsaWVudAorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQppbmRleCA4NzExOTYxLi5hN2Q2NjE3IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKQEAgLTE3LDEzMyArMTcsMTg1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKLWltcG9ydCBvcwogaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCiBpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCisKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBUVHJhbnNwb3J0RXhjZXB0aW9uLCBUU2VydmVyVHJhbnNwb3J0QmFzZQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKwogCiBjbGFzcyBUU29ja2V0QmFzZShUVHJhbnNwb3J0QmFzZSk6Ci0gIGRlZiBfcmVzb2x2ZUFkZHIoc2VsZik6Ci0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQgaXMgbm90IE5vbmU6Ci0gICAgICByZXR1cm4gWyhzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNLCBOb25lLCBOb25lLCBzZWxmLl91bml4X3NvY2tldCldCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBzb2NrZXQuZ2V0YWRkcmluZm8oc2VsZi5ob3N0LCBzZWxmLnBvcnQsIHNvY2tldC5BRl9VTlNQRUMsIHNvY2tldC5TT0NLX1NUUkVBTSwgMCwgc29ja2V0LkFJX1BBU1NJVkUgfCBzb2NrZXQuQUlfQUREUkNPTkZJRykKKyAgICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09DS19TVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIGlmIHNlbGYuaGFuZGxlOgotICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQotICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorCiAKIGNsYXNzIFRTb2NrZXQoVFNvY2tldEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAogCi0gICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQotICAgICIiIgorICAgICAgICBAcGFyYW0gaG9zdChzdHIpICBUaGUgaG9zdCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gdW5peF9zb2NrZXQoc3RyKSAgVGhlIGZpbGVuYW1lIG9mIGEgdW5peCBzb2NrZXQgdG8gY29ubmVjdCB0by4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3N0IGFuZCBwb3J0IHdpbGwgYmUgaWdub3JlZC4pCisgICAgICAgIEBwYXJhbSBzb2NrZXRfZmFtaWx5KGludCkgIFRoZSBzb2NrZXQgZmFtaWx5IHRvIHVzZSB3aXRoIHRoaXMgc29ja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CiAKLSAgICBzZWxmLmhvc3QgPSBob3N0Ci0gICAgc2VsZi5wb3J0ID0gcG9ydAotICAgIHNlbGYuaGFuZGxlID0gTm9uZQotICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKLSAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6CisgICAgICAgIHNlbGYuaGFuZGxlID0gaAogCi0gIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6Ci0gICAgc2VsZi5oYW5kbGUgPSBoCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5oYW5kbGUgIT0gTm9uZQorICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKKyAgICAgICAgaWYgbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6Ci0gICAgaWYgbXMgaXMgTm9uZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBtcy8xMDAwLjAKKyAgICAgICAgaWYgc2VsZi5oYW5kbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCiAKLSAgICBpZiAoc2VsZi5oYW5kbGUgIT0gTm9uZSk6Ci0gICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICByZXR1cm4gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuaXhfc29ja2V0IGlmIHNlbGYuX3VuaXhfc29ja2V0IGVsc2UgJyVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5BTFJFQURZX09QRU4pCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KHJlc1s0XSkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgICAgICBpZiByZXMgaXMgbm90IHJlczBbLTFdOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBicmVhawotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICBpZiBzZWxmLl91bml4X3NvY2tldDoKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBzb2NrZXQgJXMnICUgc2VsZi5fdW5peF9zb2NrZXQKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1lc3NhZ2U9bWVzc2FnZSkKKyAgICAgICAgICAgIGFkZHJzID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byByZXNvbHZlIHNvY2thZGRyIGZvciAnICsgc3RyKHNlbGYuX2FkZHJlc3MpCisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQorICAgICAgICBmb3IgZmFtaWx5LCBzb2NrdHlwZSwgXywgXywgc29ja2FkZHIgaW4gYWRkcnM6CisgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLl9kb19vcGVuKGZhbWlseSwgc29ja3R5cGUpCisgICAgICAgICAgICBoYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhhbmRsZS5jb25uZWN0KHNvY2thZGRyKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzJywgc29ja2FkZHIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIG1zZyA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBhbnkgb2YgJXMnICUgbGlzdChtYXAobGFtYmRhIGE6IGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcnMpKQorICAgICAgICBsb2dnZXIuZXJyb3IobXNnKQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCi0gICAgaWYgbGVuKGJ1ZmYpID09IDA6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQotICAgIHJldHVybiBidWZmCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZmID0gc2VsZi5oYW5kbGUucmVjdihzeikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAorICAgICAgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKKyAgICAgICAgICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKKyAgICAgICAgICAgICAgICAjIGFuZCBmYWlsIHdpdGggRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bi4KKyAgICAgICAgICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCisgICAgICAgICAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgorICAgICAgICAgICAgICAgIGJ1ZmYgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBsZW4oYnVmZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgotICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtZXNzYWdlPSdUcmFuc3BvcnQgbm90IG9wZW4nKQotICAgIHNlbnQgPSAwCi0gICAgaGF2ZSA9IGxlbihidWZmKQotICAgIHdoaWxlIHNlbnQgPCBoYXZlOgotICAgICAgcGx1cyA9IHNlbGYuaGFuZGxlLnNlbmQoYnVmZikKLSAgICAgIGlmIHBsdXMgPT0gMDoKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKLSAgICAgIHNlbnQgKz0gcGx1cwotICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKKyAgICAgICAgc2VudCA9IDAKKyAgICAgICAgaGF2ZSA9IGxlbihidWZmKQorICAgICAgICB3aGlsZSBzZW50IDwgaGF2ZToKKyAgICAgICAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCisgICAgICAgICAgICBpZiBwbHVzID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCisgICAgICAgICAgICBzZW50ICs9IHBsdXMKKyAgICAgICAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKIAogY2xhc3MgVFNlcnZlclNvY2tldChUU29ja2V0QmFzZSwgVFNlcnZlclRyYW5zcG9ydEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgc2VsZi5ob3N0ID0gTm9uZQotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fYmFja2xvZyA9IDEyOAogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICBpZiByZXNbMF0gaXMgc29ja2V0LkFGX0lORVQ2IG9yIHJlcyBpcyByZXMwWy0xXToKLSAgICAgICAgYnJlYWsKKyAgICBkZWYgc2V0QmFja2xvZyhzZWxmLCBiYWNrbG9nPU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICBzZWxmLl9iYWNrbG9nID0gYmFja2xvZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXZSBjYW5uJ3QgdXBkYXRlIGJhY2tsb2cgd2hlbiBpdCBpcyBhbHJlYWR5IGxpc3RlbmluZywgc2luY2UgdGhlCisgICAgICAgICAgICAjIGhhbmRsZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIHRvIHNldCBiYWNrbG9nIGJlZm9yZSBsaXN0ZW4uJykKIAotICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCi0gICAgIyBub2JvZHkgaXMgbGlzdGVuaW5nIG9uIGl0LgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgIHRyeToKLSAgICAgICAgdG1wLmNvbm5lY3QocmVzWzRdKQotICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgotICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncwotICAgICAgICBpZiBlbm8gPT0gZXJybm8uRUNPTk5SRUZVU0VEOgotICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgc29ja2V0X2ZhbWlseSA9IHNlbGYuX3NvY2tldF9mYW1pbHkgPT0gc29ja2V0LkFGX1VOU1BFQyBhbmQgc29ja2V0LkFGX0lORVQ2IG9yIHNlbGYuX3NvY2tldF9mYW1pbHkKKyAgICAgICAgZm9yIHJlcyBpbiByZXMwOgorICAgICAgICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldF9mYW1pbHkgb3IgcmVzIGlzIHJlczBbLTFdOgorICAgICAgICAgICAgICAgIGJyZWFrCiAKLSAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgc2VsZi5oYW5kbGUuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0X3RpbWVvdXQnKToKLSAgICAgIHNlbGYuaGFuZGxlLnNldF90aW1lb3V0KE5vbmUpCi0gICAgc2VsZi5oYW5kbGUuYmluZChyZXNbNF0pCi0gICAgc2VsZi5oYW5kbGUubGlzdGVuKDEyOCkKKyAgICAgICAgIyBXZSBuZWVkIHJlbW92ZSB0aGUgb2xkIHVuaXggc29ja2V0IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKKyAgICAgICAgIyBub2JvZHkgaXMgbGlzdGVuaW5nIG9uIGl0LgorICAgICAgICBpZiBzZWxmLl91bml4X3NvY2tldDoKKyAgICAgICAgICAgIHRtcCA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdG1wLmNvbm5lY3QocmVzWzRdKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlcnI6CisgICAgICAgICAgICAgICAgZW5vLCBtZXNzYWdlID0gZXJyLmFyZ3MKKyAgICAgICAgICAgICAgICBpZiBlbm8gPT0gZXJybm8uRUNPTk5SRUZVU0VEOgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocmVzWzRdKQogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKLSAgICByZXN1bHQgPSBUU29ja2V0KCkKLSAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKKyAgICAgICAgc2VsZi5oYW5kbGUuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmhhbmRsZSwgJ3NldHRpbWVvdXQnKToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5oYW5kbGUuYmluZChyZXNbNF0pCisgICAgICAgIHNlbGYuaGFuZGxlLmxpc3RlbihzZWxmLl9iYWNrbG9nKQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKKyAgICAgICAgcmVzdWx0ID0gVFNvY2tldCgpCisgICAgICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQppbmRleCA5ODU4YmJlLi5kMTMwNjBmIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKQEAgLTE3LDMxMCArMTcsNDM5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gc3RydWN0IGltcG9ydCBwYWNrLHVucGFjaworZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCitmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTworCiAKIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24oVEV4Y2VwdGlvbik6CisgICAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICAiIiJDdXN0b20gVHJhbnNwb3J0IEV4Y2VwdGlvbiBjbGFzcyIiIgorICAgIFVOS05PV04gPSAwCisgICAgTk9UX09QRU4gPSAxCisgICAgQUxSRUFEWV9PUEVOID0gMgorICAgIFRJTUVEX09VVCA9IDMKKyAgICBFTkRfT0ZfRklMRSA9IDQKKyAgICBORUdBVElWRV9TSVpFID0gNQorICAgIFNJWkVfTElNSVQgPSA2CisgICAgSU5WQUxJRF9DTElFTlRfVFlQRSA9IDcKIAotICBVTktOT1dOID0gMAotICBOT1RfT1BFTiA9IDEKLSAgQUxSRUFEWV9PUEVOID0gMgotICBUSU1FRF9PVVQgPSAzCi0gIEVORF9PRl9GSUxFID0gNAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKIAotY2xhc3MgVFRyYW5zcG9ydEJhc2U6CitjbGFzcyBUVHJhbnNwb3J0QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKKyAgICAgICAgYnVmZiA9IGInJworICAgICAgICBoYXZlID0gMAorICAgICAgICB3aGlsZSAoaGF2ZSA8IHN6KToKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6IC0gaGF2ZSkKKyAgICAgICAgICAgIGNodW5rTGVuID0gbGVuKGNodW5rKQorICAgICAgICAgICAgaGF2ZSArPSBjaHVua0xlbgorICAgICAgICAgICAgYnVmZiArPSBjaHVuawogCi0gIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKLSAgICBidWZmID0gJycKLSAgICBoYXZlID0gMAotICAgIHdoaWxlIChoYXZlIDwgc3opOgotICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3otaGF2ZSkKLSAgICAgIGhhdmUgKz0gbGVuKGNodW5rKQotICAgICAgYnVmZiArPSBjaHVuaworICAgICAgICAgICAgaWYgY2h1bmtMZW4gPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcigpCiAKLSAgICAgIGlmIGxlbihjaHVuaykgPT0gMDoKLSAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQorICAgICAgICByZXR1cm4gYnVmZgogCi0gICAgcmV0dXJuIGJ1ZmYKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcwogCiAjIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHRob3VnaHQgb2YgYXMgYW4gaW50ZXJmYWNlLgotY2xhc3MgQ1JlYWRhYmxlVHJhbnNwb3J0OgotICAiIiJiYXNlIGNsYXNzIGZvciB0cmFuc3BvcnRzIHRoYXQgYXJlIHJlYWRhYmxlIGZyb20gQyIiIgorY2xhc3MgQ1JlYWRhYmxlVHJhbnNwb3J0KG9iamVjdCk6CisgICAgIiIiYmFzZSBjbGFzcyBmb3IgdHJhbnNwb3J0cyB0aGF0IGFyZSByZWFkYWJsZSBmcm9tIEMiIiIKIAotICAjIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgY2hhbmdpbmcgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXMgdG8gdXNlCi0gICMgICAgICAgICAgICAgICBhIChQeXRob24sIG5vdCBjKSBTdHJpbmdJTyBpbnN0ZWFkLCBiZWNhdXNlIGl0IGFsbG93cwotICAjICAgICAgICAgICAgICAgeW91IHRvIHdyaXRlIGFmdGVyIHJlYWRpbmcuCisgICAgIyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IGNoYW5naW5nIHRoaXMgaW50ZXJmYWNlIHRvIGFsbG93IHVzIHRvIHVzZQorICAgICMgICAgICAgICAgICAgICBhIChQeXRob24sIG5vdCBjKSBTdHJpbmdJTyBpbnN0ZWFkLCBiZWNhdXNlIGl0IGFsbG93cworICAgICMgICAgICAgICAgICAgICB5b3UgdG8gd3JpdGUgYWZ0ZXIgcmVhZGluZy4KIAotICAjIE5PVEU6IFRoaXMgaXMgYSBjbGFzc2ljIGNsYXNzLCBzbyBwcm9wZXJ0aWVzIHdpbGwgTk9UIHdvcmsKLSAgIyAgICAgICBjb3JyZWN0bHkgZm9yIHNldHRpbmcuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICAiIiJBIGNTdHJpbmdJTyBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBjaHVuayB3ZSBhcmUgcmVhZGluZy4iIiIKLSAgICBwYXNzCisgICAgIyBOT1RFOiBUaGlzIGlzIGEgY2xhc3NpYyBjbGFzcywgc28gcHJvcGVydGllcyB3aWxsIE5PVCB3b3JrCisgICAgIyAgICAgICBjb3JyZWN0bHkgZm9yIHNldHRpbmcuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgICIiIkEgY1N0cmluZ0lPIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNodW5rIHdlIGFyZSByZWFkaW5nLiIiIgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIiIiUmVmaWxscyBjc3RyaW5naW9fYnVmLgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICAiIiJSZWZpbGxzIGNzdHJpbmdpb19idWYuCiAKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdXNlZCBidWZmZXIgKHdoaWNoIGNhbiBidXQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMKLSAgICB0aGUgb2xkIGNzdHJpbmdpb19idWYpLiBwYXJ0aWFscmVhZCBpcyB3aGF0IHRoZSBDIGNvZGUgaGFzIHJlYWQgZnJvbSB0aGUKLSAgICBidWZmZXIsIGFuZCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVyIGJlZm9yZSBhbnkgbW9yZSByZWFkcy4gIFRoZQotICAgIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgbmV3LCBub3QgYm9ycm93ZWQgcmVmZXJlbmNlLiAgU29tZXRoaW5nIGFsb25nIHRoZQotICAgIGxpbmVzIG9mIHNlbGYuX2J1ZiBzaG91bGQgYmUgZmluZS4KKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudGx5IHVzZWQgYnVmZmVyICh3aGljaCBjYW4gYnV0IG5lZWQgbm90IGJlIHRoZSBzYW1lIGFzCisgICAgICAgIHRoZSBvbGQgY3N0cmluZ2lvX2J1ZikuIHBhcnRpYWxyZWFkIGlzIHdoYXQgdGhlIEMgY29kZSBoYXMgcmVhZCBmcm9tIHRoZQorICAgICAgICBidWZmZXIsIGFuZCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVyIGJlZm9yZSBhbnkgbW9yZSByZWFkcy4gIFRoZQorICAgICAgICByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIG5ldywgbm90IGJvcnJvd2VkIHJlZmVyZW5jZS4gIFNvbWV0aGluZyBhbG9uZyB0aGUKKyAgICAgICAgbGluZXMgb2Ygc2VsZi5fYnVmIHNob3VsZCBiZSBmaW5lLgogCi0gICAgSWYgcmVxbGVuIGJ5dGVzIGNhbid0IGJlIHJlYWQsIHRocm93IEVPRkVycm9yLgorICAgICAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuIiIiCisKKyAgICBkZWYgbGlzdGVuKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeUJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhIFRyYW5zcG9ydCBGYWN0b3J5IiIiCisKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIHRyYW5zCisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGJ1ZmZlcmVkIHRyYW5zcG9ydHMiIiIKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcmVkCisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGJ1ZmZlcnMgaXRzIEkvTy4KKworICAgIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgorICAgIGJ1dCBidWZmZXJzIGFsbCB3cml0ZXMgdW50aWwgYSBmbHVzaCBpcyBwZXJmb3JtZWQuCiAgICAgIiIiCi0gICAgcGFzcworICAgIERFRkFVTFRfQlVGRkVSID0gNDA5NgogCi1jbGFzcyBUU2VydmVyVHJhbnNwb3J0QmFzZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZT1ERUZBVUxUX0JVRkZFUik6CisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIFBhc3Mgc3RyaW5nIGFyZ3VtZW50IHRvIGluaXRpYWxpemUgcmVhZCBidWZmZXIgYXMgY1N0cmluZ0lPLklucHV0VHlwZQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3JidWZfc2l6ZSA9IHJidWZfc2l6ZQogCi0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4iIiIKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLl9fdHJhbnMucmVhZChtYXgoc3osIHNlbGYuX19yYnVmX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZToKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAjIG9uIGV4Y2VwdGlvbiByZXNldCB3YnVmIHNvIGl0IGRvZXNuJ3QgY29udGFpbiBhIHBhcnRpYWwgZnVuY3Rpb24gY2FsbAorICAgICAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICAgICByYWlzZSBlCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gdHJhbnMKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk6CisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgIHJldHN0cmluZyA9IHBhcnRpYWxyZWFkCisgICAgICAgIGlmIHJlcWxlbiA8IHNlbGYuX19yYnVmX3NpemU6CisgICAgICAgICAgICAjIHRyeSB0byBtYWtlIGEgcmVhZCBvZiBhcyBtdWNoIGFzIHdlIGNhbi4KKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZChzZWxmLl9fcmJ1Zl9zaXplKQogCi0gICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGJ1ZmZlcmVkIHRyYW5zcG9ydHMiIiIKKyAgICAgICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgorICAgICAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKLSAgICByZXR1cm4gYnVmZmVyZWQKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhyZXRzdHJpbmcpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCiAKLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSxDUmVhZGFibGVUcmFuc3BvcnQpOgotCi0gICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGJ1ZmZlcnMgaXRzIEkvTy4iIiIKLQotICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKLQotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgotICAgIHNlbGYuX190cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygiIikKLQotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKLQotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQotCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKLQotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAotCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLl9fdHJhbnMucmVhZChtYXgoc3osIHNlbGYuREVGQVVMVF9CVUZGRVIpKSkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKLQotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCi0KLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKLQotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgIHJldHN0cmluZyA9IHBhcnRpYWxyZWFkCi0gICAgaWYgcmVxbGVuIDwgc2VsZi5ERUZBVUxUX0JVRkZFUjoKLSAgICAgICMgdHJ5IHRvIG1ha2UgYSByZWFkIG9mIGFzIG11Y2ggYXMgd2UgY2FuLgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkKHNlbGYuREVGQVVMVF9CVUZGRVIpCi0KLSAgICAjIGJ1dCBtYWtlIHN1cmUgd2UgZG8gcmVhZCByZXFsZW4gYnl0ZXMuCi0gICAgaWYgbGVuKHJldHN0cmluZykgPCByZXFsZW46Ci0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWRBbGwocmVxbGVuIC0gbGVuKHJldHN0cmluZykpCi0KLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHJldHN0cmluZykKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKLQogY2xhc3MgVE1lbW9yeUJ1ZmZlcihUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiV3JhcHMgYSBjU3RyaW5nSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KKyAgICAiIiJXcmFwcyBhIGNCeXRlc0lPIG9iamVjdCBhcyBhIFRUcmFuc3BvcnQuCiAKLSAgTk9URTogVW5saWtlIHRoZSBDKysgdmVyc2lvbiBvZiB0aGlzIGNsYXNzLCB5b3UgY2Fubm90IHdyaXRlIHRvIGl0Ci0gICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKLSAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyB3b3JrIGxpa2UgdGhlIEMrKyB2ZXJzaW9uLgotICAiIiIKKyAgICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKKyAgICAgICAgICB0aGVuIGltbWVkaWF0ZWx5IHJlYWQgZnJvbSBpdC4gIElmIHlvdSB3YW50IHRvIHJlYWQgZnJvbSBhCisgICAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCisgICAgIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUpOgotICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lLCBvZmZzZXQ9MCk6CisgICAgICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbwogCi0gICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCi0gICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgotICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8odmFsdWUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX2J1ZmZlciA9IFN0cmluZ0lPKCkKKyAgICAgICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCisgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgZm9yIHdyaXRpbmciIiIKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBCdWZmZXJJTyh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgaWYgb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyLnNlZWsob2Zmc2V0KQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9idWZmZXIuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXR2YWx1ZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLmdldHZhbHVlKCkKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2J1ZmZlcgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KLSAgICByYWlzZSBFT0ZFcnJvcigpCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICMgb25seSBvbmUgc2hvdCBhdCByZWFkaW5nLi4uCisgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAotY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk6CiAKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBmcmFtZWQKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGZyYW1lZAogCiAKIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgZnJhbWVzIGl0cyBJL08gd2hlbiB3cml0aW5nLiIiIgogCi0gICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywpOgotICAgIHNlbGYuX190cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYucmVhZEZyYW1lKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLSAgICBzZWxmLnJlYWRGcmFtZSgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgZGVmIHJlYWRGcmFtZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHN6LCA9IHVucGFjaygnIWknLCBidWZmKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKIAotICBkZWYgcmVhZEZyYW1lKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLl9fdHJhbnMucmVhZEFsbCg0KQotICAgIHN6LCA9IHVucGFjaygnIWknLCBidWZmKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oc2VsZi5fX3RyYW5zLnJlYWRBbGwoc3opKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgd3N6ID0gbGVuKHdvdXQpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIE4uQi46IERvaW5nIHRoaXMgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgV0FZIGNoZWFwZXIgdGhhbiBtYWtpbmcKKyAgICAgICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgorICAgICAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKKyAgICAgICAgIyBnb29kIGpvYiBvZiBtYW5hZ2luZyBzdHJpbmcgYnVmZmVyIG9wZXJhdGlvbnMgd2l0aG91dCBleGNlc3NpdmUgY29waWVzCisgICAgICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICB3c3ogPSBsZW4od291dCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZwotICAgICMgdHdvIHNlcGFyYXRlIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuIFNvY2tldCB3cml0ZXMgaW4KLSAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKLSAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKLSAgICBidWYgPSBwYWNrKCIhaSIsIHdzeikgKyB3b3V0Ci0gICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0Ci0gICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCi0gICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkRnJhbWUoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKKyAgICAgICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCisgICAgICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAogY2xhc3MgVEZpbGVPYmplY3RUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgotICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKKyAgICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6Ci0gICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHNlbGYuZmlsZW9iai5mbHVzaCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmouZmx1c2goKQorCisKK2NsYXNzIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgICIiIgorICAgIFNBU0wgdHJhbnNwb3J0CisgICAgIiIiCisKKyAgICBTVEFSVCA9IDEKKyAgICBPSyA9IDIKKyAgICBCQUQgPSAzCisgICAgRVJST1IgPSA0CisgICAgQ09NUExFVEUgPSA1CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc209J0dTU0FQSScsCisgICAgICAgICAgICAgICAgICoqc2FzbF9rd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgdHJhbnNwb3J0OiBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB1c2UsIHR5cGljYWxseSBqdXN0IGEgVFNvY2tldAorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKKworICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZnJvbSBwdXJlc2FzbC5jbGllbnQgaW1wb3J0IFNBU0xDbGllbnQKKworICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNhc2wgPSBTQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKipzYXNsX2t3YXJncykKKworICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYudHJhbnNwb3J0LmlzT3BlbigpOgorICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisKKyAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuU1RBUlQsIHNlbGYuc2FzbC5tZWNoYW5pc20pCisgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcygpKQorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzdGF0dXMsIGNoYWxsZW5nZSA9IHNlbGYucmVjdl9zYXNsX21zZygpCisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gc2VsZi5PSzoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoY2hhbGxlbmdlKSkKKyAgICAgICAgICAgIGVsaWYgc3RhdHVzID09IHNlbGYuQ09NUExFVEU6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc2FzbC5jb21wbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZlciBlcnJvbmVvdXNseSBpbmRpY2F0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRoYXQgU0FTTCBuZWdvdGlhdGlvbiB3YXMgY29tcGxldGUiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICJCYWQgU0FTTCBuZWdvdGlhdGlvbiBzdGF0dXM6ICVkICglcykiCisgICAgICAgICAgICAgICAgICAgICUgKHN0YXR1cywgY2hhbGxlbmdlKSkKKworICAgIGRlZiBzZW5kX3Nhc2xfbXNnKHNlbGYsIHN0YXR1cywgYm9keSk6CisgICAgICAgIGhlYWRlciA9IHBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZShoZWFkZXIgKyBib2R5KQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBkZWYgcmVjdl9zYXNsX21zZyhzZWxmKToKKyAgICAgICAgaGVhZGVyID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbCg1KQorICAgICAgICBzdGF0dXMsIGxlbmd0aCA9IHVucGFjaygiPkJJIiwgaGVhZGVyKQorICAgICAgICBpZiBsZW5ndGggPiAwOgorICAgICAgICAgICAgcGF5bG9hZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF5bG9hZCA9ICIiCisgICAgICAgIHJldHVybiBzdGF0dXMsIHBheWxvYWQKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoZGF0YSkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYuc2FzbC53cmFwKGRhdGEpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCcnLmpvaW4oKHBhY2soIiFpIiwgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorCisgICAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKKworICAgIGRlZiBfcmVhZF9mcmFtZShzZWxmKToKKyAgICAgICAgaGVhZGVyID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbCg0KQorICAgICAgICBsZW5ndGgsID0gdW5wYWNrKCchaScsIGhlYWRlcikKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuc2FzbC51bndyYXAoZW5jb2RlZCkpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2FzbC5kaXNwb3NlKCkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKQorCisgICAgIyBiYXNlZCBvbiBURnJhbWVkVHJhbnNwb3J0CisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CmluZGV4IGI2ZGNiNGUuLmEyN2YwYWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CkBAIC0xNiwzMCArMTYsMzMgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLWZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudHMsIEludGVyZmFjZSwgQXR0cmlidXRlCi1mcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IFByb3RvY29sLCBTZXJ2ZXJGYWN0b3J5LCBDbGllbnRGYWN0b3J5LCBcCisKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIsIEludGVyZmFjZSwgQXR0cmlidXRlCitmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKICAgICBjb25uZWN0aW9uRG9uZQogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlcgorZnJvbSB0d2lzdGVkLmludGVybmV0LnRocmVhZHMgaW1wb3J0IGRlZmVyVG9UaHJlYWQKIGZyb20gdHdpc3RlZC5wcm90b2NvbHMgaW1wb3J0IGJhc2ljCi1mcm9tIHR3aXN0ZWQucHl0aG9uIGltcG9ydCBsb2cKIGZyb20gdHdpc3RlZC53ZWIgaW1wb3J0IHNlcnZlciwgcmVzb3VyY2UsIGh0dHAKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAogCiBjbGFzcyBUTWVzc2FnZVNlbmRlclRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCiAgICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLnNlbmRNZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VuZE1lc3NhZ2UobXNnKQogCiAgICAgZGVmIHNlbmRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCkBAIC01Miw3ICs1NSw3IEBACiAgICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKIAogICAgIGRlZiBzZW5kTWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLSAgICAgICAgc2VsZi5mdW5jKG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBzZWxmLmZ1bmMobWVzc2FnZSkKIAogCiBjbGFzcyBUaHJpZnRDbGllbnRQcm90b2NvbChiYXNpYy5JbnQzMlN0cmluZ1JlY2VpdmVyKToKQEAgLTc5LDExICs4MiwxOCBAQAogICAgICAgICBzZWxmLnN0YXJ0ZWQuY2FsbGJhY2soc2VsZi5jbGllbnQpCiAKICAgICBkZWYgY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uPWNvbm5lY3Rpb25Eb25lKToKLSAgICAgICAgZm9yIGssdiBpbiBzZWxmLmNsaWVudC5fcmVxcy5pdGVyaXRlbXMoKToKKyAgICAgICAgIyB0aGUgY2FsbGVkIGVycmJhY2tzIGNhbiBhZGQgaXRlbXMgdG8gb3VyIGNsaWVudCdzIF9yZXFzLAorICAgICAgICAjIHNvIHdlIG5lZWQgdG8gdXNlIGEgdG1wLCBhbmQgaXRlcmF0ZSB1bnRpbCBubyBtb3JlIHJlcXVlc3RzCisgICAgICAgICMgYXJlIGFkZGVkIGR1cmluZyBlcnJiYWNrcworICAgICAgICBpZiBzZWxmLmNsaWVudDoKICAgICAgICAgICAgIHRleCA9IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICBtZXNzYWdlPSdDb25uZWN0aW9uIGNsb3NlZCcpCi0gICAgICAgICAgICB2LmVycmJhY2sodGV4KQorICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkICglcyknICUgcmVhc29uKQorICAgICAgICAgICAgd2hpbGUgc2VsZi5jbGllbnQuX3JlcXM6CisgICAgICAgICAgICAgICAgXywgdiA9IHNlbGYuY2xpZW50Ll9yZXFzLnBvcGl0ZW0oKQorICAgICAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICBkZWwgc2VsZi5jbGllbnQuX3JlcXMKKyAgICAgICAgICAgIHNlbGYuY2xpZW50ID0gTm9uZQogCiAgICAgZGVmIHN0cmluZ1JlY2VpdmVkKHNlbGYsIGZyYW1lKToKICAgICAgICAgdHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpCkBAIC05OSw2ICsxMDksMTA4IEBACiAgICAgICAgIG1ldGhvZChpcHJvdCwgbXR5cGUsIHJzZXFpZCkKIAogCitjbGFzcyBUaHJpZnRTQVNMQ2xpZW50UHJvdG9jb2woVGhyaWZ0Q2xpZW50UHJvdG9jb2wpOgorCisgICAgU1RBUlQgPSAxCisgICAgT0sgPSAyCisgICAgQkFEID0gMworICAgIEVSUk9SID0gNAorICAgIENPTVBMRVRFID0gNQorCisgICAgTUFYX0xFTkdUSCA9IDIgKiogMzEgLSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIGhvc3Q9Tm9uZSwgc2VydmljZT1Ob25lLCBtZWNoYW5pc209J0dTU0FQSScsICoqc2FzbF9rd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIG1lY2hhbmlzbTogdGhlIG5hbWUgb2YgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gdG8gdXNlCisKKyAgICAgICAgQWxsIG90aGVyIGt3YXJncyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcHVyZXNhc2wuY2xpZW50LlNBU0xDbGllbnQKKyAgICAgICAgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorCisgICAgICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CisgICAgICAgIHNlbGYuU0FTTENMaWVudCA9IFNBU0xDbGllbnQKKworICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5fX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3RvcnkpCisKKyAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYuY2xpZW50ID0gTm9uZQorCisgICAgICAgIGlmIGhvc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZVNBU0xDbGllbnQoaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKnNhc2xfa3dhcmdzKQorCisgICAgZGVmIGNyZWF0ZVNBU0xDbGllbnQoc2VsZiwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc2FzbCA9IHNlbGYuU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqa3dhcmdzKQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIG1zZyk6CisgICAgICAgIGVuY29kZWQgPSBzZWxmLnNhc2wud3JhcChtc2cpCisgICAgICAgIGxlbl9hbmRfZW5jb2RlZCA9ICcnLmpvaW4oKHN0cnVjdC5wYWNrKCchaScsIGxlbihlbmNvZGVkKSksIGVuY29kZWQpKQorICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5kaXNwYXRjaChzZWxmLCBsZW5fYW5kX2VuY29kZWQpCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIGNvbm5lY3Rpb25NYWRlKHNlbGYpOgorICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKKyAgICAgICAgaW5pdGlhbF9tZXNzYWdlID0geWllbGQgZGVmZXJUb1RocmVhZChzZWxmLnNhc2wucHJvY2VzcykKKyAgICAgICAgc2VsZi5fc2VuZFNBU0xNZXNzYWdlKHNlbGYuT0ssIGluaXRpYWxfbWVzc2FnZSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSB5aWVsZCBzZWxmLl9yZWNlaXZlU0FTTE1lc3NhZ2UoKQorICAgICAgICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBkZWZlclRvVGhyZWFkKHNlbGYuc2FzbC5wcm9jZXNzLCBjaGFsbGVuZ2UpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZFNBU0xNZXNzYWdlKHNlbGYuT0ssIHJlc3BvbnNlKQorICAgICAgICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXNsLmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiVGhlIHNlcnZlciBlcnJvbmVvdXNseSBpbmRpY2F0ZWQgdGhhdCBTQVNMICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24obXNnLCBtZXNzYWdlPW1zZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIiAlIChzdGF0dXMsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24obXNnLCBtZXNzYWdlPW1zZykKKworICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkID0gTm9uZQorICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5jb25uZWN0aW9uTWFkZShzZWxmKQorCisgICAgZGVmIF9zZW5kU0FTTE1lc3NhZ2Uoc2VsZiwgc3RhdHVzLCBib2R5KToKKyAgICAgICAgaWYgYm9keSBpcyBOb25lOgorICAgICAgICAgICAgYm9keSA9ICIiCisgICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoaGVhZGVyICsgYm9keSkKKworICAgIGRlZiBfcmVjZWl2ZVNBU0xNZXNzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkID0gZGVmZXIuRGVmZXJyZWQoKQorICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cyA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQKKworICAgIGRlZiBjb25uZWN0aW9uTG9zdChzZWxmLCByZWFzb249Y29ubmVjdGlvbkRvbmUpOgorICAgICAgICBpZiBzZWxmLmNsaWVudDoKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbikKKworICAgIGRlZiBkYXRhUmVjZWl2ZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQ6CisgICAgICAgICAgICAjIHdlIGdvdCBhIHNhc2wgY2hhbGxlbmdlIGluIHRoZSBmb3JtYXQgKHN0YXR1cywgbGVuZ3RoLCBjaGFsbGVuZ2UpCisgICAgICAgICAgICAjIHNhdmUgdGhlIHN0YXR1cywgbGV0IEludE5TdHJpbmdSZWNlaXZlciBwaWVjZSB0aGUgY2hhbGxlbmdlIGRhdGEgdG9nZXRoZXIKKyAgICAgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzLCA9IHN0cnVjdC51bnBhY2soIkIiLCBkYXRhWzBdKQorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuZGF0YVJlY2VpdmVkKHNlbGYsIGRhdGFbMTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBub3JtYWwgZnJhbWUsIGxldCBJbnROU3RyaW5nUmVjZWl2ZXIgcGllY2UgaXQgdG9nZXRoZXIKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmRhdGFSZWNlaXZlZChzZWxmLCBkYXRhKQorCisgICAgZGVmIHN0cmluZ1JlY2VpdmVkKHNlbGYsIGZyYW1lKToKKyAgICAgICAgaWYgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZDoKKyAgICAgICAgICAgICMgdGhlIGZyYW1lIGlzIGp1c3QgYSBTQVNMIGNoYWxsZW5nZQorICAgICAgICAgICAgcmVzcG9uc2UgPSAoc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMsIGZyYW1lKQorICAgICAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZC5jYWxsYmFjayhyZXNwb25zZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGhlcmUncyBhIHNlY29uZCA0IGJ5dGUgbGVuZ3RoIHByZWZpeCBpbnNpZGUgdGhlIGZyYW1lCisgICAgICAgICAgICBkZWNvZGVkX2ZyYW1lID0gc2VsZi5zYXNsLnVud3JhcChmcmFtZVs0Ol0pCisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5zdHJpbmdSZWNlaXZlZChzZWxmLCBkZWNvZGVkX2ZyYW1lKQorCisKIGNsYXNzIFRocmlmdFNlcnZlclByb3RvY29sKGJhc2ljLkludDMyU3RyaW5nUmVjZWl2ZXIpOgogCiAgICAgTUFYX0xFTkdUSCA9IDIgKiogMzEgLSAxCkBAIC0xMjQsNyArMjM2LDcgQEAKIAogICAgICAgICBkID0gc2VsZi5mYWN0b3J5LnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKICAgICAgICAgZC5hZGRDYWxsYmFja3Moc2VsZi5wcm9jZXNzT2ssIHNlbGYucHJvY2Vzc0Vycm9yLAotICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKIAogCiBjbGFzcyBJVGhyaWZ0U2VydmVyRmFjdG9yeShJbnRlcmZhY2UpOgpAQCAtMTQ1LDEwICsyNTcsOSBAQAogICAgIG9wcm90X2ZhY3RvcnkgPSBBdHRyaWJ1dGUoIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IikKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdFNlcnZlckZhY3RvcnkpCiBjbGFzcyBUaHJpZnRTZXJ2ZXJGYWN0b3J5KFNlcnZlckZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0U2VydmVyRmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0U2VydmVyUHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0xNjAsMTAgKzI3MSw5IEBACiAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5CiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRDbGllbnRGYWN0b3J5KQogY2xhc3MgVGhyaWZ0Q2xpZW50RmFjdG9yeShDbGllbnRGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdENsaWVudEZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdENsaWVudFByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpAQCAtMTc2LDcgKzI4Niw3IEBACiAKICAgICBkZWYgYnVpbGRQcm90b2NvbChzZWxmLCBhZGRyKToKICAgICAgICAgcCA9IHNlbGYucHJvdG9jb2woc2VsZi5jbGllbnRfY2xhc3MsIHNlbGYuaXByb3RfZmFjdG9yeSwKLSAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQogICAgICAgICBwLmZhY3RvcnkgPSBzZWxmCiAgICAgICAgIHJldHVybiBwCiAKQEAgLTE4Niw3ICsyOTYsNyBAQAogICAgIGFsbG93ZWRNZXRob2RzID0gKCdQT1NUJywpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUpOgorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CiAgICAgICAgIHJlc291cmNlLlJlc291cmNlLl9faW5pdF9fKHNlbGYpCiAgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogICAgICAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0ODU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMjQ4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIiIiVFpsaWJUcmFuc3BvcnQgcHJvdmlkZXMgYSBjb21wcmVzc2VkIHRyYW5zcG9ydCBhbmQgdHJhbnNwb3J0IGZhY3RvcnkKK2NsYXNzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgemxpYiBtb2R1bGUgdG8gaW1wbGVtZW50CitkYXRhIGNvbXByZXNzaW9uLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2ltcG9ydCB6bGliCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0Citmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTworCisKK2NsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgorCisgICAgVGhpcyBmYWN0b3J5IGNhY2hlcyB0aGUgbGFzdCBzaW5nbGUgY2xpZW50L3RyYW5zcG9ydCB0aGF0IGl0IHdhcyBwYXNzZWQKKyAgICBhbmQgcmV0dXJucyB0aGUgc2FtZSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KKworICAgIFRoaXMgY2FjaGluZyBtZWFucyB0aGUgVFNlcnZlciBjbGFzcyB3aWxsIGdldCB0aGUgX3NhbWVfIHRyYW5zcG9ydAorICAgIG9iamVjdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMgZnJvbSB0aGlzIGZhY3RvcnkuCisgICAgKEZvciBub24tdGhyZWFkZWQgc2NlbmFyaW9zIG9ubHksIHNpbmNlIHRoZSBjYWNoZSBvbmx5IGhvbGRzIG9uZSBvYmplY3QpCisKKyAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGNhY2hpbmcgaXMgdG8gYWxsb2NhdGUgb25seSBvbmUgVFpsaWJUcmFuc3BvcnQgd2hlcmUKKyAgICBvbmx5IG9uZSBpcyByZWFsbHkgbmVlZGVkIChzaW5jZSBpdCBtdXN0IGhhdmUgc2VwYXJhdGUgcmVhZC93cml0ZSBidWZmZXJzKSwKKyAgICBhbmQgbWFrZXMgdGhlIHN0YXRpc3RpY3MgZnJvbSBnZXRDb21wU2F2aW5ncygpIGFuZCBnZXRDb21wUmF0aW8oKQorICAgIGVhc2llciB0byB1bmRlcnN0YW5kLgorICAgICIiIgorICAgICMgY2xhc3Mgc2NvcGVkIGNhY2hlIG9mIGxhc3QgdHJhbnNwb3J0IGdpdmVuIGFuZCB6bGlidHJhbnNwb3J0IHJldHVybmVkCisgICAgX2xhc3RfdHJhbnMgPSBOb25lCisgICAgX2xhc3RfeiA9IE5vbmUKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIldyYXAgYSB0cmFuc3BvcnQsIHRyYW5zLCB3aXRoIHRoZSBUWmxpYlRyYW5zcG9ydAorICAgICAgICBjb21wcmVzc2VkIHRyYW5zcG9ydCBjbGFzcywgcmV0dXJuaW5nIGEgbmV3CisgICAgICAgIHRyYW5zcG9ydCB0byB0aGUgY2FsbGVyLgorCisgICAgICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZworICAgICAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHRzIHRvIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorCisgICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBUWmxpYlRyYW5zcG9ydCB3aGljaCB3cmFwcyB0aGUKKyAgICAgICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRyYW5zID09IHNlbGYuX2xhc3RfdHJhbnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGFzdF96CisgICAgICAgIHp0cmFucyA9IFRabGliVHJhbnNwb3J0KHRyYW5zLCBjb21wcmVzc2xldmVsKQorICAgICAgICBzZWxmLl9sYXN0X3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fbGFzdF96ID0genRyYW5zCisgICAgICAgIHJldHVybiB6dHJhbnMKKworCitjbGFzcyBUWmxpYlRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGEgdHJhbnNwb3J0IHdpdGggemxpYiwgY29tcHJlc3Npbmcgd3JpdGVzCisgICAgYW5kIGRlY29tcHJlc3NlcyByZWFkcywgdXNpbmcgdGhlIHB5dGhvbiBzdGFuZGFyZAorICAgIGxpYnJhcnkgemxpYiBtb2R1bGUuCisgICAgIiIiCisgICAgIyBSZWFkIGJ1ZmZlciBzaXplIGZvciB0aGUgcHl0aG9uIGZhc3RiaW5hcnkgQyBleHRlbnNpb24sCisgICAgIyB0aGUgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgY2xhc3MuCisgICAgREVGQVVMVF9CVUZGU0laRSA9IDQwOTYKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IFRabGliVHJhbnNwb3J0LCB3cmFwcGluZyBDe3RyYW5zfSwgYW5vdGhlcgorICAgICAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgorCisgICAgICAgIEBwYXJhbSB0cmFuczogQSB0aHJpZnQgdHJhbnNwb3J0IG9iamVjdCwgaS5lLiBhIFRTb2NrZXQoKSBvYmplY3QuCisgICAgICAgIEB0eXBlIHRyYW5zOiBUVHJhbnNwb3J0CisgICAgICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZworICAgICAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHQgaXMgOS4KKyAgICAgICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50CisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLmNvbXByZXNzbGV2ZWwgPSBjb21wcmVzc2xldmVsCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5faW5pdF96bGliKCkKKyAgICAgICAgc2VsZi5faW5pdF9zdGF0cygpCisKKyAgICBkZWYgX3JlaW5pdF9idWZmZXJzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gaW5pdGlhbGl6ZS9yZXNldCB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gb2JqZWN0cworICAgICAgICBmb3IgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKworICAgIGRlZiBfaW5pdF9zdGF0cyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0aXN0aWNzIGNvdW50ZXJzCisgICAgICAgIGZvciBjb21wcmVzc2lvbiByYXRpb3MgYW5kIGJhbmR3aWR0aCBzYXZpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ieXRlc19pbiA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXQgPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCA9IDAKKworICAgIGRlZiBfaW5pdF96bGliKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgZm9yIHNldHRpbmcgdXAgdGhlIHpsaWIgY29tcHJlc3Npb24gYW5kCisgICAgICAgIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3pjb21wX3JlYWQgPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBzZWxmLl96Y29tcF93cml0ZSA9IHpsaWIuY29tcHJlc3NvYmooc2VsZi5jb21wcmVzc2xldmVsKQorCisgICAgZGVmIGdldENvbXBSYXRpbyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IG1lYXN1cmVkIGNvbXByZXNzaW9uIHJhdGlvcyAoaW4sb3V0KSBmcm9tCisgICAgICAgIHRoaXMgdHJhbnNwb3J0LgorCisgICAgICAgIFJldHVybnMgYSB0dXBsZSBvZjoKKyAgICAgICAgKGluYm91bmRfY29tcHJlc3Npb25fcmF0aW8sIG91dGJvdW5kX2NvbXByZXNzaW9uX3JhdGlvKQorCisgICAgICAgIFRoZSBjb21wcmVzc2lvbiByYXRpb3MgYXJlIGNvbXB1dGVkIGFzOgorICAgICAgICAgICAgY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZAorCisgICAgICAgIEUuZy4sIGRhdGEgdGhhdCBjb21wcmVzc2VzIGJ5IDEweCB3aWxsIGhhdmUgYSByYXRpbyBvZjogMC4xMAorICAgICAgICBhbmQgZGF0YSB0aGF0IGNvbXByZXNzZXMgdG8gaGFsZiBvZiB0cyBvcmlnaW5hbCBzaXplIHdpbGwKKyAgICAgICAgaGF2ZSBhIHJhdGlvIG9mIDAuNQorCisgICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaWYgbm8gYnl0ZXMgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQgaW4KKyAgICAgICAgYSBwYXJ0aWN1bGFyIGRpcmVjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJfcGVyY2VudCwgd19wZXJjZW50ID0gKE5vbmUsIE5vbmUpCisgICAgICAgIGlmIHNlbGYuYnl0ZXNfaW4gPiAwOgorICAgICAgICAgICAgcl9wZXJjZW50ID0gc2VsZi5ieXRlc19pbl9jb21wIC8gc2VsZi5ieXRlc19pbgorICAgICAgICBpZiBzZWxmLmJ5dGVzX291dCA+IDA6CisgICAgICAgICAgICB3X3BlcmNlbnQgPSBzZWxmLmJ5dGVzX291dF9jb21wIC8gc2VsZi5ieXRlc19vdXQKKyAgICAgICAgcmV0dXJuIChyX3BlcmNlbnQsIHdfcGVyY2VudCkKKworICAgIGRlZiBnZXRDb21wU2F2aW5ncyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IGNvdW50IG9mIHNhdmVkIGJ5dGVzIGR1ZSB0byBkYXRhCisgICAgICAgIGNvbXByZXNzaW9uLgorCisgICAgICAgIFJldHVybnMgYSB0dXBsZSBvZjoKKyAgICAgICAgKGluYm91bmRfc2F2ZWRfYnl0ZXMsIG91dGJvdW5kX3NhdmVkX2J5dGVzKQorCisgICAgICAgIE5vdGU6IGlmIGNvbXByZXNzaW9uIGlzIGFjdHVhbGx5IGV4cGFuZGluZyB5b3VyCisgICAgICAgIGRhdGEgKG9ubHkgbGlrZWx5IHdpdGggdmVyeSB0aW55IHRocmlmdCBvYmplY3RzKSwgdGhlbgorICAgICAgICB0aGUgdmFsdWVzIHJldHVybmVkIHdpbGwgYmUgbmVnYXRpdmUuCisgICAgICAgICIiIgorICAgICAgICByX3NhdmVkID0gc2VsZi5ieXRlc19pbiAtIHNlbGYuYnl0ZXNfaW5fY29tcAorICAgICAgICB3X3NhdmVkID0gc2VsZi5ieXRlc19vdXQgLSBzZWxmLmJ5dGVzX291dF9jb21wCisgICAgICAgIHJldHVybiAocl9zYXZlZCwgd19zYXZlZCkKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBvcGVuIHN0YXR1cyIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiT3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKKyAgICAgICAgc2VsZi5faW5pdF9zdGF0cygpCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCisKKyAgICBkZWYgbGlzdGVuKHNlbGYpOgorICAgICAgICAiIiJJbnZva2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgbGlzdGVuKCkgbWV0aG9kIiIiCisgICAgICAgIHNlbGYuX190cmFucy5saXN0ZW4oKQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgIiIiQWNjZXB0IGNvbm5lY3Rpb25zIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmFjY2VwdCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwiIiIKKyAgICAgICAgc2VsZi5fcmVpbml0X2J1ZmZlcnMoKQorICAgICAgICBzZWxmLl9pbml0X3psaWIoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBzeiBieXRlcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgYnl0ZXMgYnVmZmVyLCBhbmQKKyAgICAgICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgorICAgICAgICBidWZmZXIgaXMgZW1wdHkuCisgICAgICAgICIiIgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSA+IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgICMga2VlcCByZWFkaW5nIGZyb20gdHJhbnNwb3J0IHVudGlsIHNvbWV0aGluZyBjb21lcyBiYWNrCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgcmVhZENvbXAoc2VsZiwgc3opOgorICAgICAgICAiIiJSZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlbgorICAgICAgICBkZWNvbXByZXNzIGl0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGludGVybmFsIFN0cmluZ0lPIHJlYWQgYnVmZmVyCisgICAgICAgICIiIgorICAgICAgICB6YnVmID0gc2VsZi5fX3RyYW5zLnJlYWQoc3opCisgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF9yZWFkLnVuY29uc3VtZWRfdGFpbCArIHpidWYKKyAgICAgICAgYnVmID0gc2VsZi5femNvbXBfcmVhZC5kZWNvbXByZXNzKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW4gKz0gbGVuKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCArPSBsZW4oYnVmKQorICAgICAgICBvbGQgPSBzZWxmLl9fcmJ1Zi5yZWFkKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhvbGQgKyBidWYpCisgICAgICAgIGlmIGxlbihvbGQpICsgbGVuKGJ1ZikgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgICIiIldyaXRlIHNvbWUgYnl0ZXMsIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBpbnRlcm5hbCB3cml0ZQorICAgICAgICBidWZmZXIgZm9yIGV2ZW50dWFsIGNvbXByZXNzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbnkgcXVldWVkIHVwIGRhdGEgaW4gdGhlIHdyaXRlIGJ1ZmZlciBhbmQgZW5zdXJlIHRoZQorICAgICAgICBjb21wcmVzc2lvbiBidWZmZXIgaXMgZmx1c2hlZCBvdXQgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgICIiIgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBpZiBsZW4od291dCkgPiAwOgorICAgICAgICAgICAgemJ1ZiA9IHNlbGYuX3pjb21wX3dyaXRlLmNvbXByZXNzKHdvdXQpCisgICAgICAgICAgICBzZWxmLmJ5dGVzX291dCArPSBsZW4od291dCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHpidWYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6YnVmID0gJycKKyAgICAgICAgenRhaWwgPSBzZWxmLl96Y29tcF93cml0ZS5mbHVzaCh6bGliLlpfU1lOQ19GTFVTSCkKKyAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oenRhaWwpCisgICAgICAgIGlmIChsZW4oemJ1ZikgKyBsZW4oenRhaWwpKSA+IDA6CisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHNlbGYuX190cmFucy53cml0ZSh6YnVmICsgenRhaWwpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSBmb3IgcmVmaWxsIiIiCisgICAgICAgIHJldHN0cmluZyA9IHBhcnRpYWxyZWFkCisgICAgICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGU0laRToKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQoc2VsZi5ERUZBVUxUX0JVRkZTSVpFKQorICAgICAgICB3aGlsZSBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJldHN0cmluZykpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocmV0c3RyaW5nKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvX19pbml0X18ucHkKaW5kZXggMDJjNjA0OC4uYzk1OTZkOSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvX19pbml0X18ucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvX19pbml0X18ucHkKQEAgLTE3LDQgKzE3LDQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLV9fYWxsX18gPSBbJ1RUcmFuc3BvcnQnLCAnVFNvY2tldCcsICdUSHR0cENsaWVudCddCitfX2FsbF9fID0gWydUVHJhbnNwb3J0JywgJ1RTb2NrZXQnLCAnVEh0dHBDbGllbnQnLCAnVFpsaWJUcmFuc3BvcnQnXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKQEAgLTAsMCArMSwxMDAgQEAKKyMKKyMgbGljZW5zZWQgdG8gdGhlIGFwYWNoZSBzb2Z0d2FyZSBmb3VuZGF0aW9uIChhc2YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gc2VlIHRoZSBub3RpY2UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gdGhlIGFzZiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBhcGFjaGUgbGljZW5zZSwgdmVyc2lvbiAyLjAgKHRoZQorIyAibGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIGxpY2Vuc2UuIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAorIworIyB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBsaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJhcyBpcyIgYmFzaXMsIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitkZWYgbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrKGNlcnQsIGhvc3RuYW1lKToKKyAgICAiIiJsZWdhY3kgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sKKyAgICB0aGUgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCisgICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcworICAgIGluIGNlcnRpZmljYXRlcy4KKworICAgIHJhaXNlcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSBjZXJ0aWZpY2F0ZSBmYWlscyB2YWxpZGF0aW9uLgorICAgICIiIgorICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAnTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXMnICUgaG9zdG5hbWUpCisgICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCisgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKKyAgICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkLCB0dXBsZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X3BhaXIgPSBmaWVsZFswXQorICAgICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCisgICAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQorICAgICAgICAjIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzb21lIHNvcnQgb2YgQWNjZXNzIE1hbmFnZXIKKyAgICAgICAgaWYgY2VydGhvc3QgPT0gaG9zdG5hbWU6CisgICAgICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgJ0hvc3RuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChob3N0bmFtZSwgY2VydGhvc3QpKQorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgJ0NvdWxkIG5vdCB2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgZnJvbSBob3N0ICIlcyIuICBDZXJ0PSVzJworICAgICAgICAlIChob3N0bmFtZSwgY2VydCkpCisKKworZGVmIF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBpcGFkZHJlc3MgICMgbm9xYQorICAgICAgICBsb2dnZXIuZGVidWcoJ2lwYWRkcmVzcyBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ2lwYWRkcmVzcyBtb2R1bGUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBGYWxzZQorCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMEYwOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBfX3ZlcnNpb25fXyBhcyB2ZXIKKyAgICAgICAgICAgIHZlciA9IGxpc3QobWFwKGludCwgdmVyLnNwbGl0KCcuJykpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgICAgICAgICAgaWYgdmVyWzBdICogMTAgKyB2ZXJbMV0gPj0gMzU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIHRvbyBvbGQnKQorICAgICAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdzc2wubWF0Y2hfaG9zdG5hbWUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ3VzaW5nIGxlZ2FjeSB2YWxpZGF0aW9uIGNhbGxiYWNrJykKKyAgICAgICAgbWF0Y2ggPSBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2sKKyAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorCisKK19tYXRjaF9oYXNfaXBhZGRyZXNzLCBfbWF0Y2hfaG9zdG5hbWUgPSBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5IGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKKworZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpAQCAtMCwwICsxLDM0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorU0VSVkVSX1BFTSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIucGVtJykKK1NFUlZFUl9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5jcnQnKQorU0VSVkVSX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIua2V5JykKK0NMSUVOVF9DRVJUX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5jcnQnKQorQ0xJRU5UX0tFWV9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQua2V5JykKK0NMSUVOVF9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5jcnQnKQorQ0xJRU5UX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMua2V5JykKK0NMSUVOVF9DQSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdDQS5wZW0nKQorCitURVNUX0NJUEhFUlMgPSAnREVTLUNCQzMtU0hBOkVDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicKKworCitjbGFzcyBTZXJ2ZXJBY2NlcHRvcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSk6CisgICAgICAgIHN1cGVyKFNlcnZlckFjY2VwdG9yLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl9zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2NsaWVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fZXhwZWN0X2ZhaWx1cmUgPSBleHBlY3RfZmFpbHVyZQorICAgICAgICBmcmFtZSA9IGluc3BlY3Quc3RhY2soMylbMl0KKyAgICAgICAgc2VsZi5uYW1lID0gZnJhbWVbM10KKyAgICAgICAgZGVsIGZyYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zZXJ2ZXIubGlzdGVuKCkKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWRkcmVzcyA9IHNlbGYuX3NlcnZlci5oYW5kbGUuZ2V0c29ja25hbWUoKQorICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKKyAgICAgICAgICAgICAgICAjIEFGX0lORVQgYWRkcmVzc2VzIGFyZSAyLXR1cGxlcyAoaG9zdCwgcG9ydCkgYW5kIEFGX0lORVQ2IGFyZQorICAgICAgICAgICAgICAgICMgNC10dXBsZXMgKGhvc3QsIHBvcnQsIC4uLiksIGJ1dCBpbiBlYWNoIGNhc2UgcG9ydCBpcyBpbiB0aGUgc2Vjb25kIHNsb3QuCisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGFkZHJlc3NbMV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BvcnRfYm91bmQuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQgPSBzZWxmLl9zZXJ2ZXIuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdlcnJvciBvbiBzZXJ2ZXIgc2lkZSAoJXMpOicgJSBzZWxmLm5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhwZWN0X2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC5zZXQoKQorCisgICAgZGVmIGF3YWl0X2xpc3RlbmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLndhaXQoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xpZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9jbGllbnQKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fc2VydmVyLmNsb3NlKCkKKworCisjIFB5dGhvbiAyLjYgY29tcGF0CitjbGFzcyBBc3NlcnRSYWlzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgbm90IGV4Y190eXBlIG9yIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLl9leHBlY3RlZCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZhaWwnKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRTU0xTb2NrZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3NlcnZlcl9zb2NrZXQoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVFNTTFNlcnZlclNvY2tldChwb3J0PTAsICoqa3dhcmdzKQorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9jb25uZWN0YWJsZV9jbGllbnQoc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSwgcGF0aD1Ob25lLCAqKmNsaWVudF9rd2FyZ3MpOgorICAgICAgICBhY2MgPSBTZXJ2ZXJBY2NlcHRvcihzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhY2Muc3RhcnQoKQorICAgICAgICAgICAgYWNjLmF3YWl0X2xpc3RlbmluZygpCisKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSAoJ2xvY2FsaG9zdCcsIGFjYy5wb3J0KSBpZiBwYXRoIGlzIE5vbmUgZWxzZSAoTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGNsaWVudCA9IFRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQ9cGF0aCwgKipjbGllbnRfa3dhcmdzKQorICAgICAgICAgICAgeWllbGQgYWNjLCBjbGllbnQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFjYy5jbG9zZSgpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5DUklUSUNBTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBUcnVlLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBmYWlsdXJlLCBidXQgbm90IHRvbyBsb25nLiAgMjBtcyBpcyBhIHR1bmFibGUKKyAgICAgICAgICAgICAgICAjIGNvbXByb21pc2UgYmV0d2VlbiB0ZXN0IHNwZWVkIGFuZCBzdGFiaWxpdHkKKyAgICAgICAgICAgICAgICBjbGllbnQuc2V0VGltZW91dCgyMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoVFRyYW5zcG9ydEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgZGVmIF9hc3NlcnRfcmFpc2VzKHNlbGYsIGV4Yyk6CisgICAgICAgIGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXMoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEFzc2VydFJhaXNlcyhleGMpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3RfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgVHJ1ZSwgU0VSVkVSX0NFUlQsIENMSUVOVF9LRVksIENMSUVOVF9DRVJULCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgNykKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldChOb25lLCAwLCBTRVJWRVJfUEVNLCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X2NlcnRfcmVxc19ieV92YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX1JFUVVJUkVEKQorCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX05PTkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAyKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfdmFsaWRhdGVfYnlfY2VydF9yZXFzKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMiA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMzID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMy52YWxpZGF0ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICBkZWYgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQoc2VsZik6CisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmQsIHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQodW5peF9zb2NrZXQ9cGF0aCwga2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBwYXRoPXBhdGgsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisKKyAgICBkZWYgdGVzdF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICMgc2VydmVyIGNlcnQgbm90IGluIGNhX2NlcnRzCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorCisgICAgZGVmIHRlc3Rfc2V0X3NlcnZlcl9jZXJ0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQpCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gJ2ZvbycKKyAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBOb25lCisgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9IFNFUlZFUl9DRVJUCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfY2xpZW50X2NlcnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NsaWVudF9jZXJ0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGtleWZpbGU9U0VSVkVSX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJUX05PX0lQLCBrZXlmaWxlPUNMSUVOVF9LRVlfTk9fSVApCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCwga2V5ZmlsZT1DTElFTlRfS0VZKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfT1BUSU9OQUwsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NpcGhlcnMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9J05VTEwnKQorCisgICAgZGVmIHRlc3Rfc3NsMl9hbmRfc3NsM19kaXNhYmxlZChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjMnKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MyBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYzKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1NTTHYyIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIpCisKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfbmV3ZXJfdGxzKHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X25ld2VyX3RscycpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKSBvciBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBhbmQvb3IgUFJPVE9DT0xfVExTdjFfMiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgZGVmIHRlc3Rfc3NsX2NvbnRleHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3Rfc3NsX2NvbnRleHQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlcl9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuQ0xJRU5UX0FVVEgpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihTRVJWRVJfQ0VSVCwgU0VSVkVSX0tFWSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKENMSUVOVF9DQSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHNzbF9jb250ZXh0PXNlcnZlcl9jb250ZXh0KQorCisgICAgICAgIGNsaWVudF9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuU0VSVkVSX0FVVEgpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihDTElFTlRfQ0VSVCwgQ0xJRU5UX0tFWSkKKyAgICAgICAgY2xpZW50X2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNFUlZFUl9DRVJUKQorICAgICAgICBjbGllbnRfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIHNzbF9jb250ZXh0PWNsaWVudF9jb250ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLldBUk4pCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTU0xTb2NrZXQgaW1wb3J0IFRTU0xTb2NrZXQsIFRTU0xTZXJ2ZXJTb2NrZXQsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU3YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKQEAgLTAsMCArMSw1MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgX2ltcG9ydF9sb2NhbF90aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdEpTT05TdHJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXNjYXBlZF91bmljb2RlX3N0cmluZyhzZWxmKToKKyAgICAgICAgdW5pY29kZV9qc29uID0gYiciaGVsbG8gXFx1MGUwMVxcdTBlMDJcXHUwZTAzXFx1ZDgzNVxcdWRjYWJcXHVkYjQwXFx1ZGM3MCB1bmljb2RlIicKKyAgICAgICAgdW5pY29kZV90ZXh0ID0gdSdoZWxsbyBcdTBlMDFcdTBlMDJcdTBlMDNcVTAwMDFENEFCXFUwMDBFMDA3MCB1bmljb2RlJworCisgICAgICAgIGJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcih1bmljb2RlX2pzb24pCisgICAgICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpLmdldFRyYW5zcG9ydChidWYpCisgICAgICAgIHByb3RvY29sID0gVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICAgICAgdW5pY29kZV90ZXh0ID0gdW5pY29kZV90ZXh0LmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG9jb2wucmVhZFN0cmluZygpLCB1bmljb2RlX3RleHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9DSEFOR0VMT0cgYi9saWIvcmIvQ0hBTkdFTE9HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRjZTJhLi4wMDAwMDAwCi0tLSBhL2xpYi9yYi9DSEFOR0VMT0cKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi12MC4wLjEuIEluaXRpYWwgcmVsZWFzZQpkaWZmIC0tZ2l0IGEvbGliL3JiL0dlbWZpbGUgYi9saWIvcmIvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg2YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL0dlbWZpbGUKQEAgLTAsMCArMSw0IEBACitzb3VyY2UgImh0dHA6Ly9ydWJ5Z2Vtcy5vcmciCisKK2dlbXNwZWMKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL01ha2VmaWxlLmFtIGIvbGliL3JiL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZGE0NWVkNS4uMTM3ZWRiNAotLS0gYS9saWIvcmIvTWFrZWZpbGUuYW0KKysrIGIvbGliL3JiL01ha2VmaWxlLmFtCkBAIC0xNywzMSArMTcsMzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK0RFU1RESVIgPz0gLworCitpZiBIQVZFX0JVTkRMRVIKKworYWxsLWxvY2FsOgorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyByYWtlIGJ1aWxkX2V4dAorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBpbnN0YWxsCisKK2NsZWFuLWxvY2FsOgorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyByYWtlIGNsZWFuCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZQorCitlbmRpZgorCiBFWFRSQV9ESVNUID0gXAotCUNIQU5HRUxPRyBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJUmFrZWZpbGUgXAotCU1hbmlmZXN0IFwKLQlzZXR1cC5yYiBcCisJR2VtZmlsZSBcCisJdGhyaWZ0LmdlbXNwZWMgXAogCWxpYiBcCiAJZXh0IFwKIAliZW5jaG1hcmsgXAogCXNjcmlwdCBcCi0Jc3BlYwotCi1hbGwtbG9jYWw6Ci0JaWYgWyAtbiAiJChSVUJZX1BSRUZJWCkiIF0gOyB0aGVuICQoUlVCWSkgc2V0dXAucmIgY29uZmlnIC0tcHJlZml4PSQoREVTVERJUikkKFJVQllfUFJFRklYKSAtLXJiZGlyPSckJGxpYmRpci9ydWJ5JyAtLXNvZGlyPSckJGxpYmRpci9ydWJ5JyA7IGVsaWYgWyAtbiAiJChERVNURElSKSIgXSA7IHRoZW4gJChSVUJZKSBzZXR1cC5yYiBjb25maWcgLS1wcmVmaXg9JChERVNURElSKSA7IGVsc2UgJChSVUJZKSBzZXR1cC5yYiBjb25maWcgOyBmaQotCSQoUlVCWSkgc2V0dXAucmIgc2V0dXAKLQotaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChSVUJZKSBzZXR1cC5yYiBpbnN0YWxsCi0KLSMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIFJ1YnkgaXMgbm90IGNvbmZpZ3VyZWQuCi1jbGVhbi1sb2NhbDoKLQlSVUJZPSQoUlVCWSkgOyBpZiB0ZXN0IC16ICIkJFJVQlkiIDsgdGhlbiBSVUJZPTogOyBmaSA7IFwKLQkkJFJVQlkgc2V0dXAucmIgY2xlYW4KLQotY2hlY2stbG9jYWw6IGFsbAotaWYgSEFWRV9SU1BFQwotCXJha2Ugc3BlYwotZW5kaWYKLQorCXNwZWMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JiL01hbmlmZXN0IGIvbGliL3JiL01hbmlmZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDFmMDMxLi4wMDAwMDAwCi0tLSBhL2xpYi9yYi9NYW5pZmVzdAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLUNIQU5HRUxPRwotTWFuaWZlc3QKLVJha2VmaWxlCi1SRUFETUUKLXNldHVwLnJiCi1iZW5jaG1hcmsvYmVuY2htYXJrLnJiCi1iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAotYmVuY2htYXJrL2NsaWVudC5yYgotYmVuY2htYXJrL3NlcnZlci5yYgotYmVuY2htYXJrL3RoaW5fc2VydmVyLnJiCi1leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKLWV4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuaAotZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwotZXh0L2NvbXBhY3RfcHJvdG9jb2wuaAotZXh0L2NvbnN0YW50cy5oCi1leHQvZXh0Y29uZi5yYgotZXh0L21hY3Jvcy5oCi1leHQvbWVtb3J5X2J1ZmZlci5jCi1leHQvbWVtb3J5X2J1ZmZlci5oCi1leHQvcHJvdG9jb2wuYwotZXh0L3Byb3RvY29sLmgKLWV4dC9zdHJ1Y3QuYwotZXh0L3N0cnVjdC5oCi1leHQvdGhyaWZ0X25hdGl2ZS5jCi1saWIvdGhyaWZ0LnJiCi1saWIvdGhyaWZ0L2NsaWVudC5yYgotbGliL3RocmlmdC9jb3JlX2V4dC5yYgotbGliL3RocmlmdC9leGNlcHRpb25zLnJiCi1saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgotbGliL3RocmlmdC9zdHJ1Y3QucmIKLWxpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCi1saWIvdGhyaWZ0L3VuaW9uLnJiCi1saWIvdGhyaWZ0L3RocmlmdF9uYXRpdmUucmIKLWxpYi90aHJpZnQvdHlwZXMucmIKLWxpYi90aHJpZnQvY29yZV9leHQvZml4bnVtLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgotbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCi1saWIvdGhyaWZ0L3NlcmlhbGl6ZXIvZGVzZXJpYWxpemVyLnJiCi1saWIvdGhyaWZ0L3NlcmlhbGl6ZXIvc2VyaWFsaXplci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCi1zY3JpcHQvcHJvdG9fYmVuY2htYXJrLnJiCi1zY3JpcHQvcmVhZF9zdHJ1Y3QucmIKLXNjcmlwdC93cml0ZV9zdHJ1Y3QucmIKLXNwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCi1zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCi1zcGVjL2NsaWVudF9zcGVjLnJiCi1zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgotc3BlYy9leGNlcHRpb25fc3BlYy5yYgotc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCi1zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgotc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgotc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgotc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKLXNwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCi1zcGVjL3NlcnZlcl9zcGVjLnJiCi1zcGVjL3NvY2tldF9zcGVjLnJiCi1zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgotc3BlYy9zcGVjX2hlbHBlci5yYgotc3BlYy9zdHJ1Y3Rfc3BlYy5yYgotc3BlYy91bmlvbl9zcGVjLnJiCi1zcGVjL1RocmlmdFNwZWMudGhyaWZ0Ci1zcGVjL3R5cGVzX3NwZWMucmIKLXNwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgpkaWZmIC0tZ2l0IGEvbGliL3JiL1JFQURNRSBiL2xpYi9yYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGUzNTIuLjAwMDAwMDAKLS0tIGEvbGliL3JiL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVRocmlmdCBSdWJ5IFNvZnR3YXJlIExpYnJhcnkKLSAgICBodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvdGhyaWZ0LwotCi09PSBMSUNFTlNFOgotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotPT0gREVTQ1JJUFRJT046Ci0KLVRocmlmdCBpcyBhIHN0cm9uZ2x5LXR5cGVkIGxhbmd1YWdlLWFnbm9zdGljIFJQQyBzeXN0ZW0uCi1UaGlzIGxpYnJhcnkgaXMgdGhlIHJ1YnkgaW1wbGVtZW50YXRpb24gZm9yIGJvdGggY2xpZW50cyBhbmQgc2VydmVycy4KLQotPT0gSU5TVEFMTDoKLQotICAkIGdlbSBpbnN0YWxsIHRocmlmdAotCi09PSBDQVZFQVRTOgotCi1UaGlzIGxpYnJhcnkgcHJvdmlkZXMgdGhlIGNsaWVudCBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucyBvZiB0aHJpZnQuCi1JdCBkb2VzIDxlbT5ub3Q8L2VtPiBwcm92aWRlIHRoZSBjb21waWxlciBmb3IgdGhlIC50aHJpZnQgZmlsZXMuIFRvIGNvbXBpbGUKLS50aHJpZnQgZmlsZXMgaW50byBsYW5ndWFnZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMsIHBsZWFzZSBkb3dubG9hZCB0aGUgZnVsbAotdGhyaWZ0IHNvZnR3YXJlIHBhY2thZ2UuCi0KLT09IFVTQUdFOgotCi1UaGlzIHNlY3Rpb24gc2hvdWxkIGdldCB3cml0dGVuIGJ5IHNvbWVvbmUgd2l0aCB0aGUgdGltZSBhbmQgaW5jbGluYXRpb24uCi1JbiB0aGUgbWVhbnRpbWUsIGxvb2sgYXQgZXhpc3RpbmcgY29kZSwgc3VjaCBhcyB0aGUgYmVuY2htYXJrIG9yIHRoZSB0dXRvcmlhbAotaW4gdGhlIGZ1bGwgdGhyaWZ0IGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL2xpYi9yYi9SRUFETUUubWQgYi9saWIvcmIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTlhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDMgQEAKK1RocmlmdCBSdWJ5IFNvZnR3YXJlIExpYnJhcnkKKyAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworPT0gTElDRU5TRToKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKz09IERFU0NSSVBUSU9OOgorCitUaHJpZnQgaXMgYSBzdHJvbmdseS10eXBlZCBsYW5ndWFnZS1hZ25vc3RpYyBSUEMgc3lzdGVtLgorVGhpcyBsaWJyYXJ5IGlzIHRoZSBydWJ5IGltcGxlbWVudGF0aW9uIGZvciBib3RoIGNsaWVudHMgYW5kIHNlcnZlcnMuCisKKz09IElOU1RBTEw6CisKKyAgJCBnZW0gaW5zdGFsbCB0aHJpZnQKKworPT0gQ0FWRUFUUzoKKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIHRoZSBjbGllbnQgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhyaWZ0LgorSXQgZG9lcyA8ZW0+bm90PC9lbT4gcHJvdmlkZSB0aGUgY29tcGlsZXIgZm9yIHRoZSAudGhyaWZ0IGZpbGVzLiBUbyBjb21waWxlCisudGhyaWZ0IGZpbGVzIGludG8gbGFuZ3VhZ2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLCBwbGVhc2UgZG93bmxvYWQgdGhlIGZ1bGwKK3RocmlmdCBzb2Z0d2FyZSBwYWNrYWdlLgorCis9PSBVU0FHRToKKworVGhpcyBzZWN0aW9uIHNob3VsZCBnZXQgd3JpdHRlbiBieSBzb21lb25lIHdpdGggdGhlIHRpbWUgYW5kIGluY2xpbmF0aW9uLgorSW4gdGhlIG1lYW50aW1lLCBsb29rIGF0IGV4aXN0aW5nIGNvZGUsIHN1Y2ggYXMgdGhlIGJlbmNobWFyayBvciB0aGUgdHV0b3JpYWwKK2luIHRoZSBmdWxsIHRocmlmdCBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS9saWIvcmIvUmFrZWZpbGUgYi9saWIvcmIvUmFrZWZpbGUKaW5kZXggMTAzODNlNy4uNWU1ZTVhYyAxMDA2NDQKLS0tIGEvbGliL3JiL1Jha2VmaWxlCisrKyBiL2xpYi9yYi9SYWtlZmlsZQpAQCAtMTksODYgKzE5LDEwMiBAQAogCiByZXF1aXJlICdydWJ5Z2VtcycKIHJlcXVpcmUgJ3Jha2UnCi1yZXF1aXJlICdzcGVjL3Jha2Uvc3BlY3Rhc2snCityZXF1aXJlICdyYWtlL2NsZWFuJworcmVxdWlyZSAncnNwZWMvY29yZS9yYWtlX3Rhc2snCiAKIFRIUklGVCA9ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JwogCi10YXNrIDpkZWZhdWx0ID0+IFs6c3BlY10KK3Rhc2sgOmRlZmF1bHQgPT4gWzpnZW1dCit0YXNrIDpzcGVjID0+IFs6J2dlbi1yYicsIDpidWlsZF9leHQsIDpyZWFsc3BlY10KIAotdGFzayA6c3BlYyA9PiBbOidnZW4tcmInLCA6cmVhbHNwZWNdCi0KLVNwZWM6OlJha2U6OlNwZWNUYXNrLm5ldyg6cmVhbHNwZWMpIGRvIHx0fAotICB0LnNwZWNfZmlsZXMgPSBGaWxlTGlzdFsnc3BlYy8qKi8qX3NwZWMucmInXQotICB0LnNwZWNfb3B0cyA9IFsnLS1jb2xvciddCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDpyZWFsc3BlYykgZG8gfHR8CisgIHQucnNwZWNfb3B0cyA9IFsnLS1jb2xvcicsICctLWZvcm1hdCBkJ10KIGVuZAogCi1TcGVjOjpSYWtlOjpTcGVjVGFzay5uZXcoOidzcGVjOnJjb3YnKSBkbyB8dHwKLSAgdC5zcGVjX2ZpbGVzID0gRmlsZUxpc3RbJ3NwZWMvKiovKl9zcGVjLnJiJ10KLSAgdC5zcGVjX29wdHMgPSBbJy0tY29sb3InXQorUlNwZWM6OkNvcmU6OlJha2VUYXNrLm5ldyg6J3NwZWM6cmNvdicpIGRvIHx0fAorICB0LnJzcGVjX29wdHMgPSBbJy0tY29sb3InLCAnLS1mb3JtYXQgZCddCiAgIHQucmNvdiA9IHRydWUKICAgdC5yY292X29wdHMgPSBbJy0tZXhjbHVkZScsICdec3BlYywvZ2Vtcy8nXQogZW5kCiAKLWRlc2MgJ1J1biB0aGUgY29tcGlsZXIgdGVzdHMgKHJlcXVpcmVzIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0KScKLXRhc2sgOnRlc3QgZG8KLSAgIyBlbnN1cmUgdGhpcyBpcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IGFuZCBub3QgYSB0YXJiYWxsIG9mIHRoZSBydWJ5IGxpYnMKLSAgY21kID0gJ2hlYWQgLTEgLi4vLi4vUkVBRE1FIDI+L2Rldi9udWxsIHwgZ3JlcCBUaHJpZnQgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCcKLSAgc3lzdGVtKGNtZCkgb3IgZmFpbCAicmFrZSB0ZXN0IHJlcXVpcmVzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQiCi0gIHNoICdtYWtlJywgJy1DJywgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvLi4vLi4vdGVzdC9yYiIsICJjaGVjayIKLWVuZAotCiBkZXNjICdDb21waWxlIHRoZSAudGhyaWZ0IGZpbGVzIGZvciB0aGUgc3BlY3MnCi10YXNrIDonZ2VuLXJiJyA9PiBbOidnZW4tcmI6c3BlYycsIDonZ2VuLXJiOmJlbmNobWFyaycsIDonZ2VuLXJiOmRlYnVnX3Byb3RvJ10KLQordGFzayA6J2dlbi1yYicgPT4gWzonZ2VuLXJiOnNwZWMnLCA6J2dlbi1yYjpuYW1lc3BhY2VkX3NwZWMnLCA6J2dlbi1yYjpmbGF0X3NwZWMnLCA6J2dlbi1yYjpiZW5jaG1hcmsnLCA6J2dlbi1yYjpkZWJ1Z19wcm90byddCiBuYW1lc3BhY2UgOidnZW4tcmInIGRvCiAgIHRhc2sgOidzcGVjJyBkbwogICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCiAgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLW8nLCBkaXIsICIje2Rpcn0vVGhyaWZ0U3BlYy50aHJpZnQiCiAgIGVuZAogCisgIHRhc2sgOiduYW1lc3BhY2VkX3NwZWMnIGRvCisgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vQmFzZVNlcnZpY2UudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L0V4dGVuZGVkU2VydmljZS50aHJpZnQiCisgIGVuZAorCisgIHRhc2sgOidmbGF0X3NwZWMnIGRvCisgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKKyAgICBta2Rpcl9wKCIje2Rpcn0vZ2VuLXJiL2ZsYXQiKQorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy0tcmVjdXJzZScsICctb3V0JywgIiN7ZGlyfS9nZW4tcmIvZmxhdCIsICIje2Rpcn0vVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IgorICBlbmQKKwogICB0YXNrIDonYmVuY2htYXJrJyBkbwogICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL2JlbmNobWFyaycKICAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctbycsIGRpciwgIiN7ZGlyfS9CZW5jaG1hcmsudGhyaWZ0IgogICBlbmQKICAgCiAgIHRhc2sgOidkZWJ1Z19wcm90bycgZG8KLSAgICBzaCAibWtkaXIiLCAiLXAiLCAiZGVidWdfcHJvdG9fdGVzdCIKLSAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICItbyIsICJkZWJ1Z19wcm90b190ZXN0IiwgIi4uLy4uL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IgorICAgIHNoICJta2RpciIsICItcCIsICJ0ZXN0L2RlYnVnX3Byb3RvIgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgIi1vIiwgInRlc3QvZGVidWdfcHJvdG8iLCAiLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiCiAgIGVuZAogZW5kCiAKK2Rlc2MgIkJ1aWxkIHRoZSBuYXRpdmUgbGlicmFyeSIKK3Rhc2sgOmJ1aWxkX2V4dCA9PiA6J2dlbi1yYicgZG8KKyAgIG5leHQgaWYgZGVmaW5lZD8oUlVCWV9FTkdJTkUpICYmIFJVQllfRU5HSU5FID1+IC9qcnVieS8KKyAgIERpcjo6Y2hkaXIoRmlsZTo6ZGlybmFtZSgnZXh0L2V4dGNvbmYucmInKSkgZG8KKyAgICAgIHVubGVzcyBzaCAicnVieSAje0ZpbGU6OmJhc2VuYW1lKCdleHQvZXh0Y29uZi5yYicpfSIKKyAgICAgICAgJHN0ZGVyci5wdXRzICJGYWlsZWQgdG8gcnVuIGV4dGNvbmYiCisgICAgICAgICAgYnJlYWsKKyAgICAgIGVuZAorICAgICAgdW5sZXNzIHNoICJtYWtlIgorICAgICAgICAkc3RkZXJyLnB1dHMgIm1ha2UgZmFpbGVkIgorICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgZW5kCitlbmQKKworZGVzYyAnUnVuIHRoZSBjb21waWxlciB0ZXN0cyAocmVxdWlyZXMgZnVsbCB0aHJpZnQgY2hlY2tvdXQpJwordGFzayA6dGVzdCBkbworICAjIGVuc3VyZSB0aGlzIGlzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQgYW5kIG5vdCBhIHRhcmJhbGwgb2YgdGhlIHJ1YnkgbGlicworICBjbWQgPSAnaGVhZCAtMSAuLi8uLi9SRUFETUUubWQgMj4vZGV2L251bGwgfCBncmVwIFRocmlmdCA+L2Rldi9udWxsIDI+L2Rldi9udWxsJworICBzeXN0ZW0oY21kKSBvciBmYWlsICJyYWtlIHRlc3QgcmVxdWlyZXMgYSBmdWxsIHRocmlmdCBjaGVja291dCIKKyAgc2ggJ21ha2UnLCAnLUMnLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi8uLi8uLi90ZXN0L3JiIiwgImNoZWNrIgorZW5kCisKIGRlc2MgJ1J1biBiZW5jaG1hcmtpbmcgb2YgTm9uYmxvY2tpbmdTZXJ2ZXInCiB0YXNrIDpiZW5jaG1hcmsgZG8KICAgcnVieSAnYmVuY2htYXJrL2JlbmNobWFyay5yYicKIGVuZAogCi0KLWJlZ2luCi0gIHJlcXVpcmUgJ2VjaG9lJwotCi0gIEVjaG9lLm5ldygndGhyaWZ0JykgZG8gfHB8Ci0gICAgcC5hdXRob3IgPSBbJ0tldmluIEJhbGxhcmQnLCAnS2V2aW4gQ2xhcmsnLCAnTWFyayBTbGVlJ10KLSAgICBwLmVtYWlsID0gWydrZXZpbkBzYi5vcmcnLCAna2V2aW4uY2xhcmtAZ21haWwuY29tJywgJ21jc2xlZUBmYWNlYm9vay5jb20nXQotICAgIHAuc3VtbWFyeSA9ICJSdWJ5IGxpYnJhcmllcyBmb3IgVGhyaWZ0IChhIGxhbmd1YWdlLWFnbm9zdGljIFJQQyBzeXN0ZW0pIgotICAgIHAudXJsID0gImh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy90aHJpZnQvIgotICAgIHAuaW5jbHVkZV9yYWtlZmlsZSA9IHRydWUKLSAgICBwLnZlcnNpb24gPSAiMC4yLjUiCi0gICAgcC5ydWJ5Z2Vtc192ZXJzaW9uID0gIj49IDEuMi4wIgotICBlbmQKLQotICB0YXNrIDppbnN0YWxsID0+IFs6Y2hlY2tfc2l0ZV9saWJdCi0KLSAgcmVxdWlyZSAncmJjb25maWcnCi0gIHRhc2sgOmNoZWNrX3NpdGVfbGliIGRvCi0gICAgaWYgRmlsZS5leGlzdD8oRmlsZS5qb2luKENvbmZpZzo6Q09ORklHWydzaXRlbGliZGlyJ10sICd0aHJpZnQucmInKSkKLSAgICAgIGZhaWwgInRocmlmdCBpcyBhbHJlYWR5IGluc3RhbGxlZCBpbiBzaXRlX3J1YnkiCi0gICAgZW5kCi0gIGVuZAotcmVzY3VlIExvYWRFcnJvcgotICBbOmluc3RhbGwsIDpwYWNrYWdlXS5lYWNoIGRvIHx0fAotICAgIGRlc2MgIlN0dWIgZm9yICN7dH0iCi0gICAgdGFzayB0IGRvCi0gICAgICBmYWlsICJUaGUgRWNob2UgZ2VtIGlzIHJlcXVpcmVkIGZvciB0aGlzIHRhc2siCi0gICAgZW5kCitkZXNjICdCdWlsZHMgdGhlIHRocmlmdCBnZW0nCit0YXNrIDpnZW0gPT4gWzpzcGVjLCA6YnVpbGRfZXh0XSBkbworICB1bmxlc3Mgc2ggJ2dlbScsICdidWlsZCcsICd0aHJpZnQuZ2Vtc3BlYycKKyAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBidWlsZCB0aHJpZnQgZ2VtIgorICAgIGJyZWFrCiAgIGVuZAogZW5kCisKK2Rlc2MgJ0luc3RhbGwgdGhlIHRocmlmdCBnZW0nCit0YXNrIDppbnN0YWxsID0+IFs6Z2VtXSBkbworICB1bmxlc3Mgc2ggJ2dlbScsICdpbnN0YWxsJywgRGlyLmdsb2IoJ3RocmlmdC0qLmdlbScpLmxhc3QKKyAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBpbnN0YWxsIHRocmlmdCBnZW0iCisgICAgYnJlYWsKKyAgZW5kCitlbmQKKworQ0xFQU4uaW5jbHVkZSBbCisgICcuYnVuZGxlJywgJ2JlbmNobWFyay9nZW4tcmInLCAnY292ZXJhZ2UnLCAnZXh0Lyoue28sYnVuZGxlLHNvLGRsbH0nLCAnZXh0L21rbWYubG9nJywKKyAgJ2V4dC9NYWtlZmlsZScsICdleHQvY29uZnRlc3QuZFNZTScsICdHZW1maWxlLmxvY2snLCAnbWttZi5sb2cnLCAncGtnJywgICdzcGVjL2dlbi1yYicsCisgICd0ZXN0JywgJ3RocmlmdC0qLmdlbScKK10KZGlmZiAtLWdpdCBhL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYyBiL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKaW5kZXggMzg1NDg4Ny4uNjVjYmU1ZiAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYworKysgYi9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCkBAIC0yMiw3ICsyMiw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8Y29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8c3RydWN0Lmg+Ci0jaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSA8bWFjcm9zLmg+CisjaW5jbHVkZSA8Ynl0ZXMuaD4KIAogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19uYXRpdmVfcW1hcmsoVkFMVUUgc2VsZikgewogICByZXR1cm4gUXRydWU7CkBAIC0zNCw2ICszNSw3IEBACiBzdGF0aWMgaW50IFZFUlNJT05fTUFTSzsKIHN0YXRpYyBpbnQgVFlQRV9NQVNLOwogc3RhdGljIGludCBCQURfVkVSU0lPTjsKK3N0YXRpYyBJRCByYnVmX2l2YXJfaWQ7CiAKIHN0YXRpYyB2b2lkIHdyaXRlX2J5dGVfZGlyZWN0KFZBTFVFIHRyYW5zLCBpbnQ4X3QgYikgewogICBXUklURSh0cmFucywgKGNoYXIqKSZiLCAxKTsKQEAgLTc3LDggKzc5LDkgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfc3RyaW5nX2RpcmVjdChWQUxVRSB0cmFucywgVkFMVUUgc3RyKSB7CiAgIGlmIChUWVBFKHN0cikgIT0gVF9TVFJJTkcpIHsKLSAgICByYl9yYWlzZShyYl9lU3RhbmRhcmRFcnJvciwgIlZhbHVlIHNob3VsZCBiZSBhIHN0cmluZyIpOyAgICAKKyAgICByYl9yYWlzZShyYl9lU3RhbmRhcmRFcnJvciwgIlZhbHVlIHNob3VsZCBiZSBhIHN0cmluZyIpOwogICB9CisgIHN0ciA9IGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpOwogICB3cml0ZV9pMzJfZGlyZWN0KHRyYW5zLCBSU1RSSU5HX0xFTihzdHIpKTsKICAgcmJfZnVuY2FsbCh0cmFucywgd3JpdGVfbWV0aG9kX2lkLCAxLCBzdHIpOwogfQpAQCAtMjE2LDM2ICsyMTksNTYgQEAKICAgcmV0dXJuIFFuaWw7CiB9CiAKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1ZikgeworICBDSEVDS19OSUwoYnVmKTsKKyAgVkFMVUUgdHJhbnMgPSBHRVRfVFJBTlNQT1JUKHNlbGYpOworICBidWYgPSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKTsKKyAgd3JpdGVfaTMyX2RpcmVjdCh0cmFucywgUlNUUklOR19MRU4oYnVmKSk7CisgIHJiX2Z1bmNhbGwodHJhbnMsIHdyaXRlX21ldGhvZF9pZCwgMSwgYnVmKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBpbnRlcmZhY2UgcmVhZGluZyBtZXRob2RzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9ieXRlKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2kzMihWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pMTYoVkFMVUUgc2VsZik7CiAKIHN0YXRpYyBjaGFyIHJlYWRfYnl0ZV9kaXJlY3QoVkFMVUUgc2VsZikgewotICBWQUxVRSBidWYgPSBSRUFEKHNlbGYsIDEpOwotICByZXR1cm4gUlNUUklOR19QVFIoYnVmKVswXTsKKyAgVkFMVUUgYnl0ZSA9IHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9ieXRlX21ldGhvZF9pZCwgMCk7CisgIHJldHVybiAoY2hhcikoRklYMklOVChieXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQxNl90IHJlYWRfaTE2X2RpcmVjdChWQUxVRSBzZWxmKSB7Ci0gIFZBTFVFIGJ1ZiA9IFJFQUQoc2VsZiwgMik7Ci0gIHJldHVybiAoaW50MTZfdCkoKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzFdKSkgfCAoKHVpbnQxNl90KSgoUlNUUklOR19QVFIoYnVmKVswXSkgPDwgOCkpKTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoMikpOworICByZXR1cm4gKGludDE2X3QpKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMV0pKSB8ICgodWludDE2X3QpKChSU1RSSU5HX1BUUihyYnVmKVswXSkgPDwgOCkpKTsKIH0KIAogc3RhdGljIGludDMyX3QgcmVhZF9pMzJfZGlyZWN0KFZBTFVFIHNlbGYpIHsKLSAgVkFMVUUgYnVmID0gUkVBRChzZWxmLCA0KTsKLSAgcmV0dXJuICgodWludDhfdCkoUlNUUklOR19QVFIoYnVmKVszXSkpIHwgCi0gICAgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnVmKVsyXSkpIDw8IDgpIHwgCi0gICAgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnVmKVsxXSkpIDw8IDE2KSB8IAotICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ1ZilbMF0pKSA8PCAyNCk7CisgIFZBTFVFIHJidWYgPSByYl9pdmFyX2dldChzZWxmLCByYnVmX2l2YXJfaWQpOworICByYl9mdW5jYWxsKEdFVF9UUkFOU1BPUlQoc2VsZiksIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkLCAyLCByYnVmLCBJTlQyRklYKDQpKTsKKyAgcmV0dXJuICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbM10pKSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMl0pKSA8PCA4KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMV0pKSA8PCAxNikgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzBdKSkgPDwgMjQpOwogfQogCiBzdGF0aWMgaW50NjRfdCByZWFkX2k2NF9kaXJlY3QoVkFMVUUgc2VsZikgewotICB1aW50NjRfdCBoaSA9IHJlYWRfaTMyX2RpcmVjdChzZWxmKTsKLSAgdWludDMyX3QgbG8gPSByZWFkX2kzMl9kaXJlY3Qoc2VsZik7CisgIFZBTFVFIHJidWYgPSByYl9pdmFyX2dldChzZWxmLCByYnVmX2l2YXJfaWQpOworICByYl9mdW5jYWxsKEdFVF9UUkFOU1BPUlQoc2VsZiksIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkLCAyLCByYnVmLCBJTlQyRklYKDgpKTsKKyAgdWludDY0X3QgaGkgPSAoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzNdKSkgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzJdKSkgPDwgOCkgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzFdKSkgPDwgMTYpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVswXSkpIDw8IDI0KTsKKyAgdWludDMyX3QgbG8gPSAoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzddKSkgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzZdKSkgPDwgOCkgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzVdKSkgPDwgMTYpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVs0XSkpIDw8IDI0KTsKICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKIH0KIApAQCAtMjYwLDI3ICsyODMsMjcgQEAKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbGlzdF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC0zNjgsNiArMzkxLDExIEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZikgeworICBWQUxVRSBidWZmZXIgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KHNlbGYpOworICByZXR1cm4gY29udmVydF90b19zdHJpbmcoYnVmZmVyKTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKSB7CiAgIGludCBzaXplID0gcmVhZF9pMzJfZGlyZWN0KHNlbGYpOwogICByZXR1cm4gUkVBRChzZWxmLCBzaXplKTsKIH0KQEAgLTM5Niw2ICs0MjQsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2k2NCIsICAgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2k2NCwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfZG91YmxlIiwgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfZG91YmxlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJpbmciLCAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9zdHJpbmcsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2JpbmFyeSIsICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2JpbmFyeSwgMSk7CiAgIC8vIHVudXNlZCBtZXRob2RzCiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7CkBAIC00MTcsMTIgKzQ0NiwxNSBAQAogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfaTY0IiwgICAgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTY0LCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2RvdWJsZSIsICAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2RvdWJsZSwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJpbmciLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfYmluYXJ5IiwgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5LCAwKTsKICAgLy8gdW51c2VkIG1ldGhvZHMKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX21lc3NhZ2VfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9iZWdpbiwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJ1Y3RfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9maWVsZF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX21hcF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbGlzdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9maWVsZF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX21hcF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3NldF9lbmQsIDApOworCisgIHJidWZfaXZhcl9pZCA9IHJiX2ludGVybigiQHJidWYiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvYnl0ZXMuYyBiL2xpYi9yYi9leHQvYnl0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZmYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2V4dC9ieXRlcy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxydWJ5Lmg+CisjaWZkZWYgSEFWRV9SVUJZX0VOQ09ESU5HX0gKKyNpbmNsdWRlIDxydWJ5L2VuY29kaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjb25zdGFudHMuaD4KKworVkFMVUUgZm9yY2VfYmluYXJ5X2VuY29kaW5nKFZBTFVFIGJ1ZmZlcikgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQsIDEsIGJ1ZmZlcik7Cit9CisKK1ZBTFVFIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihWQUxVRSBzdHJpbmcpIHsKKyAgcmV0dXJuIHJiX2Z1bmNhbGwodGhyaWZ0X2J5dGVzX21vZHVsZSwgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkLCAxLCBzdHJpbmcpOworfQorCitWQUxVRSBjb252ZXJ0X3RvX3N0cmluZyhWQUxVRSB1dGY4X2J1ZmZlcikgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBjb252ZXJ0X3RvX3N0cmluZ19pZCwgMSwgdXRmOF9idWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9ieXRlcy5oIGIvbGliL3JiL2V4dC9ieXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDhkODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L2J5dGVzLmgKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKworLyoKKyAqIEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBieXRlcyBhbmQgYnl0ZSBidWZmZXJzLgorICoKKyAqIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBuYXRpdmUgYW5hbG9naWVzIHRvIHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4KKyAqIFRocmlmdDo6Qnl0ZXMgKHRocmlmdC9ieXRlcy5yYikuCisgKi8KKworVkFMVUUgZm9yY2VfYmluYXJ5X2VuY29kaW5nKFZBTFVFIGJ1ZmZlcik7CitWQUxVRSBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoVkFMVUUgc3RyaW5nKTsKK1ZBTFVFIGNvbnZlcnRfdG9fc3RyaW5nKFZBTFVFIHV0ZjhfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvY29tcGFjdF9wcm90b2NvbC5jIGIvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKaW5kZXggNmMwMTIzZC4uYzBmNDZiOSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKKysrIGIvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKQEAgLTIwLDkgKzIwLDEwIEBACiAjaW5jbHVkZSA8cnVieS5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJjb25zdGFudHMuaCIKLSNpbmNsdWRlICJzdHJ1Y3QuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlIDxjb25zdGFudHMuaD4KKyNpbmNsdWRlIDxzdHJ1Y3QuaD4KKyNpbmNsdWRlIDxtYWNyb3MuaD4KKyNpbmNsdWRlIDxieXRlcy5oPgogCiAjZGVmaW5lIExBU1RfSUQob2JqKSBGSVgySU5UKHJiX2FyeV9wb3AocmJfaXZhcl9nZXQob2JqLCBsYXN0X2ZpZWxkX2lkKSkpCiAjZGVmaW5lIFNFVF9MQVNUX0lEKG9iaiwgdmFsKSByYl9hcnlfcHVzaChyYl9pdmFyX2dldChvYmosIGxhc3RfZmllbGRfaWQpLCB2YWwpCkBAIC0zNCwxMCArMzUsMTIgQEAKIHN0YXRpYyBJRCBsYXN0X2ZpZWxkX2lkOwogc3RhdGljIElEIGJvb2xlYW5fZmllbGRfaWQ7CiBzdGF0aWMgSUQgYm9vbF92YWx1ZV9pZDsKK3N0YXRpYyBJRCByYnVmX2l2YXJfaWQ7CiAKIHN0YXRpYyBpbnQgVkVSU0lPTjsKIHN0YXRpYyBpbnQgVkVSU0lPTl9NQVNLOwogc3RhdGljIGludCBUWVBFX01BU0s7CitzdGF0aWMgaW50IFRZUEVfQklUUzsKIHN0YXRpYyBpbnQgVFlQRV9TSElGVF9BTU9VTlQ7CiBzdGF0aWMgaW50IFBST1RPQ09MX0lEOwogCkBAIC0xNjUsNiArMTY4LDcgQEAKIAogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfaTMyKFZBTFVFIHNlbGYsIFZBTFVFIGkzMik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJpbmcoVkFMVUUgc2VsZiwgVkFMVUUgc3RyKTsKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeShWQUxVRSBzZWxmLCBWQUxVRSBidWYpOwogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9tZXNzYWdlX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwpAQCAtMzAzLDkgKzMwNywxNiBAQAogfQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJpbmcoVkFMVUUgc2VsZiwgVkFMVUUgc3RyKSB7CisgIHN0ciA9IGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpOworICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnkoc2VsZiwgc3RyKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeShWQUxVRSBzZWxmLCBWQUxVRSBidWYpIHsKKyAgYnVmID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1Zik7CiAgIFZBTFVFIHRyYW5zcG9ydCA9IEdFVF9UUkFOU1BPUlQoc2VsZik7Ci0gIHdyaXRlX3ZhcmludDMyKHRyYW5zcG9ydCwgUlNUUklOR19MRU4oc3RyKSk7Ci0gIFdSSVRFKHRyYW5zcG9ydCwgUlNUUklOR19QVFIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CisgIHdyaXRlX3ZhcmludDMyKHRyYW5zcG9ydCwgUlNUUklOR19MRU4oYnVmKSk7CisgIFdSSVRFKHRyYW5zcG9ydCwgU3RyaW5nVmFsdWVQdHIoYnVmKSwgUlNUUklOR19MRU4oYnVmKSk7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC0zMTYsNiArMzI3LDcgQEAKICNkZWZpbmUgaXNfYm9vbF90eXBlKGN0eXBlKSAoKChjdHlwZSkgJiAweDBGKSA9PSBDVFlQRV9CT09MRUFOX1RSVUUgfHwgKChjdHlwZSkgJiAweDBGKSA9PSBDVFlQRV9CT09MRUFOX0ZBTFNFKQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKTsKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9ieXRlKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9pMzIoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2kxNihWQUxVRSBzZWxmKTsKQEAgLTM1NCw4ICszNjYsOCBAQAogfQogCiBzdGF0aWMgY2hhciByZWFkX2J5dGVfZGlyZWN0KFZBTFVFIHNlbGYpIHsKLSAgVkFMVUUgYnVmID0gUkVBRChzZWxmLCAxKTsKLSAgcmV0dXJuIFJTVFJJTkdfUFRSKGJ1ZilbMF07CisgIFZBTFVFIGJ5dGUgPSByYl9mdW5jYWxsKEdFVF9UUkFOU1BPUlQoc2VsZiksIHJlYWRfYnl0ZV9tZXRob2RfaWQsIDApOworICByZXR1cm4gKGNoYXIpKEZJWDJJTlQoYnl0ZSkpOwogfQogCiBzdGF0aWMgaW50NjRfdCB6aWdfemFnX3RvX2xsKGludDY0X3QgbikgewpAQCAtNDM5LDcgKzQ1MSw3IEBACiAgICAgcmJfZXhjX3JhaXNlKGdldF9wcm90b2NvbF9leGNlcHRpb24oSU5UMkZJWCgtMSksIHJiX3N0cl9uZXcyKGJ1ZikpKTsKICAgfQogICAKLSAgaW50OF90IHR5cGUgPSAodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiAweDAzOworICBpbnQ4X3QgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUzsKICAgaW50MzJfdCBzZXFpZCA9IHJlYWRfdmFyaW50NjQoc2VsZik7CiAgIFZBTFVFIG1lc3NhZ2VOYW1lID0gcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJpbmcoc2VsZik7CiAgIHJldHVybiByYl9hcnlfbmV3MygzLCBtZXNzYWdlTmFtZSwgSU5UMkZJWCh0eXBlKSwgSU5UMk5VTShzZXFpZCkpOwpAQCAtNTI4LDM3ICs1NDAsNDUgQEAKICAgICBkb3VibGUgZjsKICAgICBpbnQ2NF90IGw7CiAgIH0gdHJhbnNmZXI7Ci0gIFZBTFVFIGJ5dGVzID0gUkVBRChzZWxmLCA4KTsKLSAgdWludDMyX3QgbG8gPSAoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVswXSkpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbMV0pKSA8PCA4KQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzJdKSkgPDwgMTYpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbM10pKSA8PCAyNCk7Ci0gIHVpbnQ2NF90IGhpID0gKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzRdKSkpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbNV0pKSA8PCA4KQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzZdKSkgPDwgMTYpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbN10pKSA8PCAyNCk7CisgIFZBTFVFIHJidWYgPSByYl9pdmFyX2dldChzZWxmLCByYnVmX2l2YXJfaWQpOworICByYl9mdW5jYWxsKEdFVF9UUkFOU1BPUlQoc2VsZiksIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkLCAyLCByYnVmLCBJTlQyRklYKDgpKTsKKyAgdWludDMyX3QgbG8gPSAoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzBdKSkKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzFdKSkgPDwgOCkKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzJdKSkgPDwgMTYpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVszXSkpIDw8IDI0KTsKKyAgdWludDY0X3QgaGkgPSAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVs0XSkpKQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNV0pKSA8PCA4KQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNl0pKSA8PCAxNikKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzddKSkgPDwgMjQpOwogICB0cmFuc2Zlci5sID0gKGhpIDw8IDMyKSB8IGxvOwogCiAgIHJldHVybiByYl9mbG9hdF9uZXcodHJhbnNmZXIuZik7CiB9CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpIHsKKyAgVkFMVUUgYnVmZmVyID0gcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoc2VsZik7CisgIHJldHVybiBjb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpOworfQorCitWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKSB7CiAgIGludDY0X3Qgc2l6ZSA9IHJlYWRfdmFyaW50NjQoc2VsZik7CiAgIHJldHVybiBSRUFEKHNlbGYsIHNpemUpOwogfQogCiBzdGF0aWMgdm9pZCBJbml0X2NvbnN0YW50cygpIHsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJDb21wYWN0UHJvdG9jb2wiKSk7Ci0gIAorCiAgIFZFUlNJT04gPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlZFUlNJT04iKSkpOwogICBWRVJTSU9OX01BU0sgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlZFUlNJT05fTUFTSyIpKSk7CiAgIFRZUEVfTUFTSyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVFlQRV9NQVNLIikpKTsKKyAgVFlQRV9CSVRTID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX0JJVFMiKSkpOwogICBUWVBFX1NISUZUX0FNT1VOVCA9IEZJWDJJTlQocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlRZUEVfU0hJRlRfQU1PVU5UIikpKTsKICAgUFJPVE9DT0xfSUQgPSBGSVgySU5UKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJQUk9UT0NPTF9JRCIpKSk7Ci0gIAorCiAgIGxhc3RfZmllbGRfaWQgPSByYl9pbnRlcm4oIkBsYXN0X2ZpZWxkIik7CiAgIGJvb2xlYW5fZmllbGRfaWQgPSByYl9pbnRlcm4oIkBib29sZWFuX2ZpZWxkIik7CiAgIGJvb2xfdmFsdWVfaWQgPSByYl9pbnRlcm4oIkBib29sX3ZhbHVlIik7CisgIHJidWZfaXZhcl9pZCA9IHJiX2ludGVybigiQHJidWYiKTsKIH0KIAogc3RhdGljIHZvaWQgSW5pdF9yYl9tZXRob2RzKCkgewpAQCAtNTc3LDYgKzU5Nyw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9pNjQiLCAgICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfaTY0LCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2RvdWJsZSIsICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9kb3VibGUsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfc3RyaW5nIiwgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZywgMSk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9iaW5hcnkiLCAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5LCAxKTsKIAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9tZXNzYWdlX2VuZCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJ1Y3RfYmVnaW4sIDEpOwpAQCAtNTk5LDYgKzYyMCw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2k2NCIsICAgICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9pNjQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9kb3VibGUiLCAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfZG91YmxlLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfc3RyaW5nIiwgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZywgMCk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2JpbmFyeSIsICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogCiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9tZXNzYWdlX2VuZCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cnVjdF9iZWdpbiwgMCk7CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2NvbnN0YW50cy5oIGIvbGliL3JiL2V4dC9jb25zdGFudHMuaAppbmRleCA1N2RmNTQ0Li5lN2FlYzQ0IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2NvbnN0YW50cy5oCisrKyBiL2xpYi9yYi9leHQvY29uc3RhbnRzLmgKQEAgLTQyLDE5ICs0MiwyMCBAQAogZXh0ZXJuIElEIHdyaXRlX2k2NF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfZG91YmxlX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkOworZXh0ZXJuIElEIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbWFwX2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfc2V0X2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zZXRfZW5kX21ldGhvZF9pZDsKLWV4dGVybiBJRCBzaXplX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2Jvb2xfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfYnl0ZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pMTZfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaTMyX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2k2NF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9zdHJpbmdfbWV0aG9kX2lkOworZXh0ZXJuIElEIHJlYWRfYmluYXJ5X21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2RvdWJsZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQ7CkBAIC02NywxNCArNjgsMTUgQEAKIGV4dGVybiBJRCByZWFkX2ZpZWxkX2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQ7CiBleHRlcm4gSUQga2V5c19tZXRob2RfaWQ7Ci1leHRlcm4gSUQgZW50cmllc19tZXRob2RfaWQ7IAotZXh0ZXJuIElEIG5hbWVfbWV0aG9kX2lkOyAKLWV4dGVybiBJRCBzb3J0X21ldGhvZF9pZDsKK2V4dGVybiBJRCBlbnRyaWVzX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9maWVsZF9zdG9wX21ldGhvZF9pZDsKIGV4dGVybiBJRCBza2lwX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9hbGxfbWV0aG9kX2lkOwotZXh0ZXJuIElEIG5hdGl2ZV9xbWFya19tZXRob2RfaWQ7CitleHRlcm4gSUQgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQ7CitleHRlcm4gSUQgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkOworZXh0ZXJuIElEIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZDsKK2V4dGVybiBJRCBjb252ZXJ0X3RvX3N0cmluZ19pZDsKIAogZXh0ZXJuIElEIGZpZWxkc19jb25zdF9pZDsKIGV4dGVybiBJRCB0cmFuc3BvcnRfaXZhcl9pZDsKQEAgLTg3LDkgKzg5LDExIEBACiBleHRlcm4gVkFMVUUgdmFsdWVfc3ltOwogZXh0ZXJuIFZBTFVFIGVsZW1lbnRfc3ltOwogZXh0ZXJuIFZBTFVFIGNsYXNzX3N5bTsKK2V4dGVybiBWQUxVRSBiaW5hcnlfc3ltOwogCiBleHRlcm4gVkFMVUUgcmJfY1NldDsKIGV4dGVybiBWQUxVRSB0aHJpZnRfbW9kdWxlOwogZXh0ZXJuIFZBTFVFIHRocmlmdF90eXBlc19tb2R1bGU7CitleHRlcm4gVkFMVUUgdGhyaWZ0X2J5dGVzX21vZHVsZTsKIGV4dGVybiBWQUxVRSBjbGFzc190aHJpZnRfcHJvdG9jb2w7CiBleHRlcm4gVkFMVUUgcHJvdG9jb2xfZXhjZXB0aW9uX2NsYXNzOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9leHRjb25mLnJiIGIvbGliL3JiL2V4dC9leHRjb25mLnJiCmluZGV4IDA3NTU4YjguLmIzNWY2MGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvZXh0Y29uZi5yYgorKysgYi9saWIvcmIvZXh0L2V4dGNvbmYucmIKQEAgLTE3LDEwICsxNywxOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMgCiAKLXJlcXVpcmUgJ21rbWYnCitpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPX4gL2pydWJ5LworICBGaWxlLm9wZW4oJ01ha2VmaWxlJywgJ3cnKXt8ZnwgZi5wdXRzICJhbGw6XG5cbmluc3RhbGw6XG4iIH0KK2Vsc2UKKyAgcmVxdWlyZSAnbWttZicKKyAgcmVxdWlyZSAncmJjb25maWcnCiAKLSRDRkxBR1MgPSAiLWcgLU8yIC1XYWxsIC1XZXJyb3IiCisgICRBUkNIX0ZMQUdTID0gUmJDb25maWc6OkNPTkZJR1snQ0ZMQUdTJ10uc2NhbiggLygtYXJjaCApKFxTKykvICkubWFwe3x4LHl8IHggKyB5ICsgJyAnIH0uam9pbignJykKIAotaGF2ZV9mdW5jKCJzdHJsY3B5IiwgInN0cmluZy5oIikKIAotY3JlYXRlX21ha2VmaWxlICd0aHJpZnRfbmF0aXZlJworICAkQ0ZMQUdTID0gIi1mc2lnbmVkLWNoYXIgLWcgLU8yIC1XYWxsIC1XZXJyb3IgIiArICRBUkNIX0ZMQUdTCisKKyAgaGF2ZV9mdW5jKCJzdHJsY3B5IiwgInN0cmluZy5oIikKKworICBjcmVhdGVfbWFrZWZpbGUgJ3RocmlmdF9uYXRpdmUnCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jIGIvbGliL3JiL2V4dC9tZW1vcnlfYnVmZmVyLmMKaW5kZXggNzRlZmEyYy4uOGI1MmM0YSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9tZW1vcnlfYnVmZmVyLmMKKysrIGIvbGliL3JiL2V4dC9tZW1vcnlfYnVmZmVyLmMKQEAgLTE5LDcgKzE5LDggQEAKIAogI2luY2x1ZGUgPHJ1YnkuaD4KICNpbmNsdWRlIDxjb25zdGFudHMuaD4KLSNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlIDxieXRlcy5oPgorI2luY2x1ZGUgPG1hY3Jvcy5oPgogCiBJRCBidWZfaXZhcl9pZDsKIElEIGluZGV4X2l2YXJfaWQ7CkBAIC0zMCw5ICszMSwxNSBAQAogCiAjZGVmaW5lIEdFVF9CVUYoc2VsZikgcmJfaXZhcl9nZXQoc2VsZiwgYnVmX2l2YXJfaWQpCiAKK1ZBTFVFIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKFZBTFVFIHNlbGYsIFZBTFVFIHN0cik7CitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkKFZBTFVFIHNlbGYsIFZBTFVFIGxlbmd0aF92YWx1ZSk7CitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2J5dGUoVkFMVUUgc2VsZik7CitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2ludG9fYnVmZmVyKFZBTFVFIHNlbGYsIFZBTFVFIGJ1ZmZlcl92YWx1ZSwgVkFMVUUgc2l6ZV92YWx1ZSk7CisKIFZBTFVFIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKFZBTFVFIHNlbGYsIFZBTFVFIHN0cikgewogICBWQUxVRSBidWYgPSBHRVRfQlVGKHNlbGYpOwotICByYl9zdHJfYnVmX2NhdChidWYsIFJTVFJJTkdfUFRSKHN0ciksIFJTVFJJTkdfTEVOKHN0cikpOworICBzdHIgPSBmb3JjZV9iaW5hcnlfZW5jb2Rpbmcoc3RyKTsKKyAgcmJfc3RyX2J1Zl9jYXQoYnVmLCBTdHJpbmdWYWx1ZVB0cihzdHIpLCBSU1RSSU5HX0xFTihzdHIpKTsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTUzLDE5ICs2MCw3MCBAQAogICAgIHJiX2l2YXJfc2V0KHNlbGYsIGJ1Zl9pdmFyX2lkLCByYl9mdW5jYWxsKGJ1Ziwgc2xpY2VfbWV0aG9kX2lkLCAyLCBJTlQyRklYKGluZGV4KSwgSU5UMkZJWChSU1RSSU5HX0xFTihidWYpIC0gMSkpKTsKICAgICBpbmRleCA9IDA7CiAgIH0KKyAgcmJfaXZhcl9zZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCwgSU5UMkZJWChpbmRleCkpOwogCiAgIGlmIChSU1RSSU5HX0xFTihkYXRhKSA8IGxlbmd0aCkgewogICAgIHJiX3JhaXNlKHJiX2VFT0ZFcnJvciwgIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIG1lbW9yeSBidWZmZXIiKTsKICAgfQogCi0gIHJiX2l2YXJfc2V0KHNlbGYsIGluZGV4X2l2YXJfaWQsIElOVDJGSVgoaW5kZXgpKTsKICAgcmV0dXJuIGRhdGE7CiB9CiAKK1ZBTFVFIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfYnl0ZShWQUxVRSBzZWxmKSB7CisgIFZBTFVFIGluZGV4X3ZhbHVlID0gcmJfaXZhcl9nZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCk7CisgIGludCBpbmRleCA9IEZJWDJJTlQoaW5kZXhfdmFsdWUpOworCisgIFZBTFVFIGJ1ZiA9IEdFVF9CVUYoc2VsZik7CisgIGlmIChpbmRleCA+PSBSU1RSSU5HX0xFTihidWYpKSB7CisgICAgcmJfcmFpc2UocmJfZUVPRkVycm9yLCAiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gbWVtb3J5IGJ1ZmZlciIpOworICB9CisgIGNoYXIgYnl0ZSA9IFJTVFJJTkdfUFRSKGJ1ZilbaW5kZXgrK107CisKKyAgaWYgKGluZGV4ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKKyAgICByYl9pdmFyX3NldChzZWxmLCBidWZfaXZhcl9pZCwgcmJfZnVuY2FsbChidWYsIHNsaWNlX21ldGhvZF9pZCwgMiwgSU5UMkZJWChpbmRleCksIElOVDJGSVgoUlNUUklOR19MRU4oYnVmKSAtIDEpKSk7CisgICAgaW5kZXggPSAwOworICB9CisgIHJiX2l2YXJfc2V0KHNlbGYsIGluZGV4X2l2YXJfaWQsIElOVDJGSVgoaW5kZXgpKTsKKworICBpbnQgcmVzdWx0ID0gKGludCkgYnl0ZTsKKyAgcmV0dXJuIElOVDJGSVgocmVzdWx0KTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9pbnRvX2J1ZmZlcihWQUxVRSBzZWxmLCBWQUxVRSBidWZmZXJfdmFsdWUsIFZBTFVFIHNpemVfdmFsdWUpIHsKKyAgaW50IGkgPSAwOworICBpbnQgc2l6ZSA9IEZJWDJJTlQoc2l6ZV92YWx1ZSk7CisgIGludCBpbmRleDsKKyAgVkFMVUUgYnVmID0gR0VUX0JVRihzZWxmKTsKKworICBpbmRleCA9IEZJWDJJTlQocmJfaXZhcl9nZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCkpOworICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICBpZiAoaW5kZXggPj0gUlNUUklOR19MRU4oYnVmKSkgeworICAgICAgcmJfcmFpc2UocmJfZUVPRkVycm9yLCAiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gbWVtb3J5IGJ1ZmZlciIpOworICAgIH0KKyAgICBjaGFyIGJ5dGUgPSBSU1RSSU5HX1BUUihidWYpW2luZGV4KytdOworCisgICAgaWYgKGkgPj0gUlNUUklOR19MRU4oYnVmZmVyX3ZhbHVlKSkgeworICAgICAgcmJfcmFpc2UocmJfZUluZGV4RXJyb3IsICJpbmRleCAlZCBvdXQgb2Ygc3RyaW5nIiwgaSk7CisgICAgfQorICAgICgoY2hhciopUlNUUklOR19QVFIoYnVmZmVyX3ZhbHVlKSlbaV0gPSBieXRlOworICAgIGkrKzsKKyAgfQorCisgIGlmIChpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7CisgICAgcmJfaXZhcl9zZXQoc2VsZiwgYnVmX2l2YXJfaWQsIHJiX2Z1bmNhbGwoYnVmLCBzbGljZV9tZXRob2RfaWQsIDIsIElOVDJGSVgoaW5kZXgpLCBJTlQyRklYKFJTVFJJTkdfTEVOKGJ1ZikgLSAxKSkpOworICAgIGluZGV4ID0gMDsKKyAgfQorICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7CisKKyAgcmV0dXJuIElOVDJGSVgoaSk7Cit9CisKIHZvaWQgSW5pdF9tZW1vcnlfYnVmZmVyKCkgewogICBWQUxVRSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcyA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIk1lbW9yeUJ1ZmZlclRyYW5zcG9ydCIpKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgIndyaXRlIiwgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9tZW1vcnlfYnVmZmVyX2NsYXNzLCAicmVhZCIsIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9tZW1vcnlfYnVmZmVyX2NsYXNzLCAicmVhZF9ieXRlIiwgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9ieXRlLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgInJlYWRfaW50b19idWZmZXIiLCByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2ludG9fYnVmZmVyLCAyKTsKICAgCiAgIGJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAYnVmIik7CiAgIGluZGV4X2l2YXJfaWQgPSByYl9pbnRlcm4oIkBpbmRleCIpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9wcm90b2NvbC5jIGIvbGliL3JiL2V4dC9wcm90b2NvbC5jCmluZGV4IGMxODc2NTQuLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvcHJvdG9jb2wuYworKysgYi9saWIvcmIvZXh0L3Byb3RvY29sLmMKQEAgLTEsMTg1ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxydWJ5Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8Y29uc3RhbnRzLmg+Ci0jaW5jbHVkZSA8c3RydWN0Lmg+Ci0KLXN0YXRpYyBWQUxVRSBza2lwKFZBTFVFIHNlbGYsIGludCB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gVFRZUEVfU1RPUCkgewotICAgIHJldHVybiBRbmlsOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0JPT0wpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfYm9vbF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0JZVEUpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfYnl0ZV9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0kxNikgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9pMTZfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMzIpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfaTMyX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTY0KSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2k2NF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9kb3VibGVfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfc3RyaW5nX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSVUNUKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cnVjdF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBWQUxVRSBmaWVsZF9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICAgIGlmIChOSUxfUChmaWVsZF9oZWFkZXIpIHx8IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGZpZWxkX2hlYWRlciwgMSkpID09IFRUWVBFX1NUT1AgKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgIHNraXAoc2VsZiwgRklYMklOVChyYl9hcnlfZW50cnkoZmllbGRfaGVhZGVyLCAxKSkpOwotICAgICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQsIDApOwotICAgIH0KLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfc3RydWN0X2VuZF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX01BUCkgewotICAgIGludCBpOwotICAgIFZBTFVFIG1hcF9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgaW50IGt0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMCkpOwotICAgIGludCB2dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDEpKTsKLSAgICBpbnQgc2l6ZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDIpKTsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBza2lwKHNlbGYsIGt0eXBlKTsKLSAgICAgIHNraXAoc2VsZiwgdnR5cGUpOwotICAgIH0KLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0xJU1QgfHwgdHR5cGUgPT0gVFRZUEVfU0VUKSB7Ci0gICAgaW50IGk7Ci0gICAgVkFMVUUgY29sbGVjdGlvbl9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHR0eXBlID09IFRUWVBFX0xJU1QgPyByZWFkX2xpc3RfYmVnaW5fbWV0aG9kX2lkIDogcmVhZF9zZXRfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICBpbnQgZXR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShjb2xsZWN0aW9uX2hlYWRlciwgMCkpOwotICAgIGludCBzaXplID0gRklYMklOVChyYl9hcnlfZW50cnkoY29sbGVjdGlvbl9oZWFkZXIsIDEpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBza2lwKHNlbGYsIGV0eXBlKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCB0dHlwZSA9PSBUVFlQRV9MSVNUID8gcmVhZF9saXN0X2VuZF9tZXRob2RfaWQgOiByZWFkX3NldF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIHsKLSAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJkb24ndCBrbm93IGhvdyB0byBza2lwIHR5cGUgJWQiLCB0dHlwZSk7Ci0gIH0KLQotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3Byb3RvY29sX25hdGl2ZV9xbWFyayhWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRZmFsc2U7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF9wcm90b2NvbF9za2lwKFZBTFVFIHByb3RvY29sLCBWQUxVRSB0dHlwZSkgewotICByZXR1cm4gc2tpcChwcm90b2NvbCwgRklYMklOVCh0dHlwZSkpOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbWVzc2FnZV9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmLCBWQUxVRSBuYW1lKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9saXN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfc2V0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXZvaWQgSW5pdF9wcm90b2NvbCgpIHsKLSAgVkFMVUUgY19wcm90b2NvbCA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIkJhc2VQcm90b2NvbCIpKTsKLSAgCi0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInNraXAiLCByYl90aHJpZnRfcHJvdG9jb2xfc2tpcCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfc3RydWN0X2JlZ2luIiwgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3N0cnVjdF9lbmQiLCByYl90aHJpZnRfd3JpdGVfc3RydWN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF93cml0ZV9maWVsZF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9tYXBfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX21hcF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9saXN0X2VuZCIsIHJiX3RocmlmdF93cml0ZV9saXN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3NldF9lbmQiLCByYl90aHJpZnRfd3JpdGVfc2V0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfcmVhZF9tYXBfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9yZWFkX3NldF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJuYXRpdmU/IiwgcmJfdGhyaWZ0X3Byb3RvY29sX25hdGl2ZV9xbWFyaywgMCk7Ci0gIAotICAvLyBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlICpucG10OwotICAvLyBucG10ID0gQUxMT0MobmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSk7Ci0gIC8vIG5wbXQtPndyaXRlX21lc3NhZ2VfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kOwotICAvLyBucG10LT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2JlZ2luOwotICAvLyBucG10LT53cml0ZV9zdHJ1Y3RfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX2ZpZWxkX2VuZCA9IHJiX3RocmlmdF93cml0ZV9maWVsZF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX21hcF9lbmQgPSByYl90aHJpZnRfd3JpdGVfbWFwX2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfbGlzdF9lbmQgPSByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX3NldF9lbmQgPSByYl90aHJpZnRfd3JpdGVfc2V0X2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9tZXNzYWdlX2VuZCA9IHJiX3RocmlmdF9yZWFkX21lc3NhZ2VfZW5kOwotICAvLyBucG10LT5yZWFkX3N0cnVjdF9iZWdpbiA9IHJiX3RoaWZ0X3JlYWRfc3RydWN0X2JlZ2luOwotICAvLyBucG10LT5yZWFkX3N0cnVjdF9lbmQgPSByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfZmllbGRfZW5kID0gcmJfdGhpZnRfcmVhZF9maWVsZF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbWFwX2VuZCA9IHJiX3RoaWZ0X3JlYWRfbWFwX2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9saXN0X2VuZCA9IHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfc2V0X2VuZCA9IHJiX3RoaWZ0X3JlYWRfc2V0X2VuZDsKLSAgLy8gCi0gIC8vIFZBTFVFIG1ldGhvZF90YWJsZV9vYmplY3QgPSBEYXRhX1dyYXBfU3RydWN0KHJiX2NPYmplY3QsIDAsIGZyZWUsIG5wbXQpOwotICAvLyByYl9jb25zdF9zZXQoY19wcm90b2NvbCwgcmJfaW50ZXJuKCJAbmF0aXZlX21ldGhvZF90YWJsZSIpLCBtZXRob2RfdGFibGVfb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvcHJvdG9jb2wuaCBiL2xpYi9yYi9leHQvcHJvdG9jb2wuaAppbmRleCA1MzY5NTMwLi5lNjlkZTI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3Byb3RvY29sLmgKKysrIGIvbGliL3JiL2V4dC9wcm90b2NvbC5oCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdm9pZCBJbml0X3Byb3RvY29sKCk7CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cmxjcHkuYyBiL2xpYi9yYi9leHQvc3RybGNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDBmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L3N0cmxjcHkuYwpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic3RybGNweS5oIgorCisjaWZuZGVmIEhBVkVfU1RSTENQWQorI2RlZmluZSBIQVZFX1NUUkxDUFkKK3NpemVfdAorc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opCit7CisgICAgc2l6ZV90IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZHN0X3N6OyBuKyspIHsKKyAgICAgIGlmICgoKmRzdCsrID0gKnNyYysrKSA9PSAnXDAnKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobiA8IGRzdF9zeikKKyAgICAgIHJldHVybiBuOworICAgIGlmIChuID4gMCkKKyAgICAgICooZHN0IC0gMSkgPSAnXDAnOworICAgIHJldHVybiBuICsgc3RybGVuIChzcmMpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvc3RybGNweS5oIGIvbGliL3JiL2V4dC9zdHJsY3B5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZTBmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9leHQvc3RybGNweS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyNkZWZpbmUgX19oYXNfYnVpbHRpbih4KSAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKK3NpemVfdCBzdHJsY3B5IChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zeik7CisjZWxzZQorI2lmICFfX2hhc19idWlsdGluKHN0cmxjcHkpCitleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cnVjdC5jIGIvbGliL3JiL2V4dC9zdHJ1Y3QuYwppbmRleCBkYjc4ZWZhLi5lM2FhODU1IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3N0cnVjdC5jCisrKyBiL2xpYi9yYi9leHQvc3RydWN0LmMKQEAgLTIwLDMzICsyMCw3IEBACiAjaW5jbHVkZSAic3RydWN0LmgiCiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCi0KLSNpZm5kZWYgSEFWRV9TVFJMQ1BZCi0KLXN0YXRpYwotc2l6ZV90Ci1zdHJsY3B5IChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zeikKLXsKLSAgICBzaXplX3QgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCBkc3Rfc3o7IG4rKykgewotICAgICAgaWYgKCgqZHN0KysgPSAqc3JjKyspID09ICdcMCcpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChuIDwgZHN0X3N6KQotICAgICAgcmV0dXJuIG47Ci0gICAgaWYgKG4gPiAwKQotICAgICAgKihkc3QgLSAxKSA9ICdcMCc7Ci0gICAgcmV0dXJuIG4gKyBzdHJsZW4gKHNyYyk7Ci19Ci0jZWxzZQotLyoKLSAgIFJ1YnkgMS45LnggaW5jbHVkZXMgdGhlIE9wZW5CU0QgaW1wbGVtZW50YXRpb24gb2Ygc3RybGNweS4KLSAgIFNlZSBtaXNzaW5nL3N0cmxjcHkuYyBpbiBSdWJ5IDEuOSBzb3VyY2UKLSAqLwotZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCisjaW5jbHVkZSAic3RybGNweS5oIgogCiBWQUxVRSB0aHJpZnRfdW5pb25fY2xhc3M7CiAKQEAgLTU1LDYgKzI5LDcgQEAKIAogSUQgdG9fc19tZXRob2RfaWQ7CiBJRCBuYW1lX3RvX2lkX21ldGhvZF9pZDsKK3N0YXRpYyBJRCBzb3J0ZWRfZmllbGRfaWRzX21ldGhvZF9pZDsKIAogI2RlZmluZSBJU19DT05UQUlORVIodHR5cGUpICgodHR5cGUpID09IFRUWVBFX01BUCB8fCAodHR5cGUpID09IFRUWVBFX0xJU1QgfHwgKHR0eXBlKSA9PSBUVFlQRV9TRVQpCiAjZGVmaW5lIFNUUlVDVF9GSUVMRFMob2JqKSByYl9jb25zdF9nZXQoQ0xBU1NfT0Yob2JqKSwgZmllbGRzX2NvbnN0X2lkKQpAQCAtMTAwLDYgKzc1LDExIEBACiAgIHJldHVybiBRbmlsOwogfQogCitWQUxVRSBkZWZhdWx0X3dyaXRlX2JpbmFyeShWQUxVRSBwcm90b2NvbCwgVkFMVUUgdmFsdWUpIHsKKyAgcmJfZnVuY2FsbChwcm90b2NvbCwgd3JpdGVfYmluYXJ5X21ldGhvZF9pZCwgMSwgdmFsdWUpOworICByZXR1cm4gUW5pbDsKK30KKwogVkFMVUUgZGVmYXVsdF93cml0ZV9saXN0X2JlZ2luKFZBTFVFIHByb3RvY29sLCBWQUxVRSBldHlwZSwgVkFMVUUgbGVuZ3RoKSB7CiAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkLCAyLCBldHlwZSwgbGVuZ3RoKTsKICAgcmV0dXJuIFFuaWw7CkBAIC0yMTUsNiArMTk1LDEwIEBACiAgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX3N0cmluZ19tZXRob2RfaWQsIDApOwogfQogCitWQUxVRSBkZWZhdWx0X3JlYWRfYmluYXJ5KFZBTFVFIHByb3RvY29sKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX2JpbmFyeV9tZXRob2RfaWQsIDApOworfQorCiBWQUxVRSBkZWZhdWx0X3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHByb3RvY29sKSB7CiAgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX3N0cnVjdF9iZWdpbl9tZXRob2RfaWQsIDApOwogfQpAQCAtMjMwLDEwICsyMTQsMTAgQEAKIHN0YXRpYyB2b2lkIHdyaXRlX2FueXRoaW5nKGludCB0dHlwZSwgVkFMVUUgdmFsdWUsIFZBTFVFIHByb3RvY29sLCBWQUxVRSBmaWVsZF9pbmZvKTsKIAogVkFMVUUgZ2V0X2ZpZWxkX3ZhbHVlKFZBTFVFIG9iaiwgVkFMVUUgZmllbGRfbmFtZSkgewotICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMV07CisgIGNoYXIgbmFtZV9idWZbUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAyXTsKIAogICBuYW1lX2J1ZlswXSA9ICdAJzsKLSAgc3RybGNweSgmbmFtZV9idWZbMV0sIFJTVFJJTkdfUFRSKGZpZWxkX25hbWUpLCBzaXplb2YobmFtZV9idWYpKTsKKyAgc3RybGNweSgmbmFtZV9idWZbMV0sIFJTVFJJTkdfUFRSKGZpZWxkX25hbWUpLCBSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDEpOwogCiAgIFZBTFVFIHZhbHVlID0gcmJfaXZhcl9nZXQob2JqLCByYl9pbnRlcm4obmFtZV9idWYpKTsKIApAQCAtMzA2LDcgKzI5MCw3IEBACiAKICAgICBpZiAoVFlQRSh2YWx1ZSkgPT0gVF9BUlJBWSkgewogICAgICAgaXRlbXMgPSB2YWx1ZTsKLSAgICB9IGVsc2UgeyAgICAgICAgCisgICAgfSBlbHNlIHsKICAgICAgIGlmIChyYl9jU2V0ID09IENMQVNTX09GKHZhbHVlKSkgewogICAgICAgICBpdGVtcyA9IHJiX2Z1bmNhbGwodmFsdWUsIGVudHJpZXNfbWV0aG9kX2lkLCAwKTsKICAgICAgIH0gZWxzZSB7CkBAIC0zNTIsNyArMzM2LDEyIEBACiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfRE9VQkxFKSB7CiAgICAgZGVmYXVsdF93cml0ZV9kb3VibGUocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICBkZWZhdWx0X3dyaXRlX3N0cmluZyhwcm90b2NvbCwgdmFsdWUpOworICAgIFZBTFVFIGlzX2JpbmFyeSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBiaW5hcnlfc3ltKTsKKyAgICBpZiAoaXNfYmluYXJ5ICE9IFF0cnVlKSB7CisgICAgICBkZWZhdWx0X3dyaXRlX3N0cmluZyhwcm90b2NvbCwgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICBkZWZhdWx0X3dyaXRlX2JpbmFyeShwcm90b2NvbCwgdmFsdWUpOworICAgIH0KICAgfSBlbHNlIGlmIChJU19DT05UQUlORVIodHR5cGUpKSB7CiAgICAgd3JpdGVfY29udGFpbmVyKHR0eXBlLCBmaWVsZF9pbmZvLCB2YWx1ZSwgcHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUlVDVCkgewpAQCAtMzc1LDEzICszNjQsMTEgQEAKIAogICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBmaWVsZHMgaGVyZQogICBWQUxVRSBzdHJ1Y3RfZmllbGRzID0gU1RSVUNUX0ZJRUxEUyhzZWxmKTsKLQotICBWQUxVRSBzdHJ1Y3RfZmllbGRfaWRzX3Vub3JkZXJlZCA9IHJiX2Z1bmNhbGwoc3RydWN0X2ZpZWxkcywga2V5c19tZXRob2RfaWQsIDApOwotICBWQUxVRSBzdHJ1Y3RfZmllbGRfaWRzX29yZGVyZWQgPSByYl9mdW5jYWxsKHN0cnVjdF9maWVsZF9pZHNfdW5vcmRlcmVkLCBzb3J0X21ldGhvZF9pZCwgMCk7CisgIFZBTFVFIHNvcnRlZF9maWVsZF9pZHMgPSByYl9mdW5jYWxsKHNlbGYsIHNvcnRlZF9maWVsZF9pZHNfbWV0aG9kX2lkLCAwKTsKIAogICBpbnQgaSA9IDA7Ci0gIGZvciAoaT0wOyBpIDwgUkFSUkFZX0xFTihzdHJ1Y3RfZmllbGRfaWRzX29yZGVyZWQpOyBpKyspIHsKLSAgICBWQUxVRSBmaWVsZF9pZCA9IHJiX2FyeV9lbnRyeShzdHJ1Y3RfZmllbGRfaWRzX29yZGVyZWQsIGkpOworICBmb3IgKGk9MDsgaSA8IFJBUlJBWV9MRU4oc29ydGVkX2ZpZWxkX2lkcyk7IGkrKykgeworICAgIFZBTFVFIGZpZWxkX2lkID0gcmJfYXJ5X2VudHJ5KHNvcnRlZF9maWVsZF9pZHMsIGkpOwogCiAgICAgVkFMVUUgZmllbGRfaW5mbyA9IHJiX2hhc2hfYXJlZihzdHJ1Y3RfZmllbGRzLCBmaWVsZF9pZCk7CiAKQEAgLTQxNCwxNiArNDAxLDM1IEBACiAKIHN0YXRpYyBWQUxVRSByYl90aHJpZnRfdW5pb25fcmVhZChWQUxVRSBzZWxmLCBWQUxVRSBwcm90b2NvbCk7CiBzdGF0aWMgVkFMVUUgcmJfdGhyaWZ0X3N0cnVjdF9yZWFkKFZBTFVFIHNlbGYsIFZBTFVFIHByb3RvY29sKTsKK3N0YXRpYyB2b2lkIHNraXBfbWFwX2NvbnRlbnRzKFZBTFVFIHByb3RvY29sLCBWQUxVRSBrZXlfdHlwZV92YWx1ZSwgVkFMVUUgdmFsdWVfdHlwZV92YWx1ZSwgaW50IHNpemUpOworc3RhdGljIHZvaWQgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhWQUxVRSBwcm90b2NvbCwgVkFMVUUgZWxlbWVudF90eXBlX3ZhbHVlLCBpbnQgc2l6ZSk7CiAKIHN0YXRpYyB2b2lkIHNldF9maWVsZF92YWx1ZShWQUxVRSBvYmosIFZBTFVFIGZpZWxkX25hbWUsIFZBTFVFIHZhbHVlKSB7Ci0gIGNoYXIgbmFtZV9idWZbUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAxXTsKKyAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDJdOwogCiAgIG5hbWVfYnVmWzBdID0gJ0AnOwotICBzdHJsY3B5KCZuYW1lX2J1ZlsxXSwgUlNUUklOR19QVFIoZmllbGRfbmFtZSksIHNpemVvZihuYW1lX2J1ZikpOworICBzdHJsY3B5KCZuYW1lX2J1ZlsxXSwgUlNUUklOR19QVFIoZmllbGRfbmFtZSksIFJTVFJJTkdfTEVOKGZpZWxkX25hbWUpKzEpOwogCiAgIHJiX2l2YXJfc2V0KG9iaiwgcmJfaW50ZXJuKG5hbWVfYnVmKSwgdmFsdWUpOwogfQogCisvLyBIZWxwZXIgbWV0aG9kIHRvIHNraXAgdGhlIGNvbnRlbnRzIG9mIGEgbWFwIChhc3N1bWVzIHRoZSBtYXAgaGVhZGVyIGhhcyBiZWVuIHJlYWQpLgorc3RhdGljIHZvaWQgc2tpcF9tYXBfY29udGVudHMoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIGtleV90eXBlX3ZhbHVlLCBWQUxVRSB2YWx1ZV90eXBlX3ZhbHVlLCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCBrZXlfdHlwZV92YWx1ZSk7CisgICAgcmJfZnVuY2FsbChwcm90b2NvbCwgc2tpcF9tZXRob2RfaWQsIDEsIHZhbHVlX3R5cGVfdmFsdWUpOworICB9Cit9CisKKy8vIEhlbHBlciBtZXRob2QgdG8gc2tpcCB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9yIHNldCAoYXNzdW1lcyB0aGUgbGlzdC9zZXQgaGVhZGVyIGhhcyBiZWVuIHJlYWQpLgorc3RhdGljIHZvaWQgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhWQUxVRSBwcm90b2NvbCwgVkFMVUUgZWxlbWVudF90eXBlX3ZhbHVlLCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCBlbGVtZW50X3R5cGVfdmFsdWUpOworICB9Cit9CisKIHN0YXRpYyBWQUxVRSByZWFkX2FueXRoaW5nKFZBTFVFIHByb3RvY29sLCBpbnQgdHR5cGUsIFZBTFVFIGZpZWxkX2luZm8pIHsKICAgVkFMVUUgcmVzdWx0ID0gUW5pbDsKIApAQCAtNDM4LDcgKzQ0NCwxMiBAQAogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0k2NCkgewogICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9pNjQocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUklORykgewotICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9zdHJpbmcocHJvdG9jb2wpOworICAgIFZBTFVFIGlzX2JpbmFyeSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBiaW5hcnlfc3ltKTsKKyAgICBpZiAoaXNfYmluYXJ5ICE9IFF0cnVlKSB7CisgICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfc3RyaW5nKHByb3RvY29sKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX2JpbmFyeShwcm90b2NvbCk7CisgICAgfQogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewogICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9kb3VibGUocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUlVDVCkgewpAQCAtNDU4LDE4ICs0NjksMzAgQEAKICAgICBpbnQgdmFsdWVfdHR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAxKSk7CiAgICAgaW50IG51bV9lbnRyaWVzID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMikpOwogCisgICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIGtleSBhbmQgdmFsdWUgdHlwZXMgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgb25lcyBhbmQgc2tpcCB0aGUgbWFwIGNvbnRlbnRzCisgICAgLy8gaWYgdGhlIHR5cGVzIGRvbid0IG1hdGNoLgogICAgIFZBTFVFIGtleV9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGtleV9zeW0pOwogICAgIFZBTFVFIHZhbHVlX2luZm8gPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgdmFsdWVfc3ltKTsKIAotICAgIHJlc3VsdCA9IHJiX2hhc2hfbmV3KCk7CisgICAgaWYgKCFOSUxfUChrZXlfaW5mbykgJiYgIU5JTF9QKHZhbHVlX2luZm8pKSB7CisgICAgICBpbnQgc3BlY2lmaWVkX2tleV90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoa2V5X2luZm8sIHR5cGVfc3ltKSk7CisgICAgICBpbnQgc3BlY2lmaWVkX3ZhbHVlX3R5cGUgPSBGSVgySU5UKHJiX2hhc2hfYXJlZih2YWx1ZV9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKG51bV9lbnRyaWVzID09IDAgfHwgKHNwZWNpZmllZF9rZXlfdHlwZSA9PSBrZXlfdHR5cGUgJiYgc3BlY2lmaWVkX3ZhbHVlX3R5cGUgPT0gdmFsdWVfdHR5cGUpKSB7CisgICAgICAgIHJlc3VsdCA9IHJiX2hhc2hfbmV3KCk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgewotICAgICAgVkFMVUUga2V5LCB2YWw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKSB7CisgICAgICAgICAgVkFMVUUga2V5LCB2YWw7CiAKLSAgICAgIGtleSA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGtleV90dHlwZSwga2V5X2luZm8pOwotICAgICAgdmFsID0gcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgdmFsdWVfdHR5cGUsIHZhbHVlX2luZm8pOworICAgICAgICAgIGtleSA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGtleV90dHlwZSwga2V5X2luZm8pOworICAgICAgICAgIHZhbCA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIHZhbHVlX3R0eXBlLCB2YWx1ZV9pbmZvKTsKIAotICAgICAgcmJfaGFzaF9hc2V0KHJlc3VsdCwga2V5LCB2YWwpOworICAgICAgICAgIHJiX2hhc2hfYXNldChyZXN1bHQsIGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcF9tYXBfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoa2V5X3R0eXBlKSwgSU5UMkZJWCh2YWx1ZV90dHlwZSksIG51bV9lbnRyaWVzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2tpcF9tYXBfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoa2V5X3R0eXBlKSwgSU5UMkZJWCh2YWx1ZV90dHlwZSksIG51bV9lbnRyaWVzKTsKICAgICB9CiAKICAgICBkZWZhdWx0X3JlYWRfbWFwX2VuZChwcm90b2NvbCk7CkBAIC00NzksMTAgKzUwMiwyMyBAQAogICAgIFZBTFVFIGxpc3RfaGVhZGVyID0gZGVmYXVsdF9yZWFkX2xpc3RfYmVnaW4ocHJvdG9jb2wpOwogICAgIGludCBlbGVtZW50X3R0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkobGlzdF9oZWFkZXIsIDApKTsKICAgICBpbnQgbnVtX2VsZW1lbnRzID0gRklYMklOVChyYl9hcnlfZW50cnkobGlzdF9oZWFkZXIsIDEpKTsKLSAgICByZXN1bHQgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7Ci0gICAgICByYl9hcnlfcHVzaChyZXN1bHQsIHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGVsZW1lbnRfdHR5cGUsIHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBlbGVtZW50X3N5bSkpKTsKKyAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGFnYWluc3QgdGhlIGV4cGVjdGVkIG9uZSBhbmQgc2tpcCB0aGUgbGlzdCBjb250ZW50cworICAgIC8vIGlmIHRoZSB0eXBlcyBkb24ndCBtYXRjaC4KKyAgICBWQUxVRSBlbGVtZW50X2luZm8gPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgZWxlbWVudF9zeW0pOworICAgIGlmICghTklMX1AoZWxlbWVudF9pbmZvKSkgeworICAgICAgaW50IHNwZWNpZmllZF9lbGVtZW50X3R5cGUgPSBGSVgySU5UKHJiX2hhc2hfYXJlZihlbGVtZW50X2luZm8sIHR5cGVfc3ltKSk7CisgICAgICBpZiAoc3BlY2lmaWVkX2VsZW1lbnRfdHlwZSA9PSBlbGVtZW50X3R0eXBlKSB7CisgICAgICAgIHJlc3VsdCA9IHJiX2FyeV9uZXcyKG51bV9lbGVtZW50cyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7CisgICAgICAgICAgcmJfYXJ5X3B1c2gocmVzdWx0LCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBlbGVtZW50X3R0eXBlLCByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgZWxlbWVudF9zeW0pKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoZWxlbWVudF90dHlwZSksIG51bV9lbGVtZW50cyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoZWxlbWVudF90dHlwZSksIG51bV9lbGVtZW50cyk7CiAgICAgfQogCiAgICAgZGVmYXVsdF9yZWFkX2xpc3RfZW5kKHByb3RvY29sKTsKQEAgLTQ5MywxNSArNTI5LDI4IEBACiAgICAgVkFMVUUgc2V0X2hlYWRlciA9IGRlZmF1bHRfcmVhZF9zZXRfYmVnaW4ocHJvdG9jb2wpOwogICAgIGludCBlbGVtZW50X3R0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkoc2V0X2hlYWRlciwgMCkpOwogICAgIGludCBudW1fZWxlbWVudHMgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShzZXRfaGVhZGVyLCAxKSk7Ci0gICAgaXRlbXMgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7Ci0gICAgICByYl9hcnlfcHVzaChpdGVtcywgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZWxlbWVudF90dHlwZSwgcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKSkpOworICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBlbGVtZW50IHR5cGUgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgb25lIGFuZCBza2lwIHRoZSBzZXQgY29udGVudHMKKyAgICAvLyBpZiB0aGUgdHlwZXMgZG9uJ3QgbWF0Y2guCisgICAgVkFMVUUgZWxlbWVudF9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKTsKKyAgICBpZiAoIU5JTF9QKGVsZW1lbnRfaW5mbykpIHsKKyAgICAgIGludCBzcGVjaWZpZWRfZWxlbWVudF90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoZWxlbWVudF9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKHNwZWNpZmllZF9lbGVtZW50X3R5cGUgPT0gZWxlbWVudF90dHlwZSkgeworICAgICAgICBpdGVtcyA9IHJiX2FyeV9uZXcyKG51bV9lbGVtZW50cyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7CisgICAgICAgICAgcmJfYXJ5X3B1c2goaXRlbXMsIHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGVsZW1lbnRfdHR5cGUsIHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBlbGVtZW50X3N5bSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgxLCAmaXRlbXMsIHJiX2NTZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhwcm90b2NvbCwgSU5UMkZJWChlbGVtZW50X3R0eXBlKSwgbnVtX2VsZW1lbnRzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhwcm90b2NvbCwgSU5UMkZJWChlbGVtZW50X3R0eXBlKSwgbnVtX2VsZW1lbnRzKTsKICAgICB9CiAKICAgICBkZWZhdWx0X3JlYWRfc2V0X2VuZChwcm90b2NvbCk7Ci0KLSAgICByZXN1bHQgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMSwgJml0ZW1zLCByYl9jU2V0KTsKICAgfSBlbHNlIHsKICAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJyZWFkX2FueXRoaW5nIG5vdCBpbXBsZW1lbnRlZCBmb3IgdHlwZSAlZCEiLCB0dHlwZSk7CiAgIH0KQEAgLTU3Nyw3ICs2MjYsNyBAQAogICAgIGlmIChmaWVsZF90eXBlID09IHNwZWNpZmllZF90eXBlKSB7CiAgICAgICAvLyByZWFkIHRoZSB2YWx1ZQogICAgICAgVkFMVUUgbmFtZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBuYW1lX3N5bSk7Ci0gICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIElEMlNZTShyYl9pbnRlcm4oUlNUUklOR19QVFIobmFtZSkpKSk7CisgICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIHJiX3N0cl9pbnRlcm4obmFtZSkpOwogICAgICAgcmJfaXZfc2V0KHNlbGYsICJAdmFsdWUiLCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBmaWVsZF90eXBlLCBmaWVsZF9pbmZvKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCBmaWVsZF90eXBlX3ZhbHVlKTsKQEAgLTU5Nyw5ICs2NDYsNiBAQAogICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJ0b28gbWFueSBmaWVsZHMgaW4gdW5pb24hIik7CiAgIH0KIAotICAvLyByZWFkIGZpZWxkIGVuZAotICBkZWZhdWx0X3JlYWRfZmllbGRfZW5kKHByb3RvY29sKTsKLQogICAvLyByZWFkIHN0cnVjdCBlbmQKICAgZGVmYXVsdF9yZWFkX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCkBAIC02MjQsNiArNjcwLDEwIEBACiAKICAgVkFMVUUgZmllbGRfaW5mbyA9IHJiX2hhc2hfYXJlZihzdHJ1Y3RfZmllbGRzLCBmaWVsZF9pZCk7CiAKKyAgaWYoTklMX1AoZmllbGRfaW5mbykpIHsKKyAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKTsKKyAgfQorCiAgIFZBTFVFIHR0eXBlX3ZhbHVlID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIHR5cGVfc3ltKTsKICAgaW50IHR0eXBlID0gRklYMklOVCh0dHlwZV92YWx1ZSk7CiAKQEAgLTY1Nyw0ICs3MDcsNSBAQAogCiAgIHRvX3NfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ0b19zIik7CiAgIG5hbWVfdG9faWRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJuYW1lX3RvX2lkIik7CisgIHNvcnRlZF9maWVsZF9pZHNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJzb3J0ZWRfZmllbGRfaWRzIik7CiB9CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3RocmlmdF9uYXRpdmUuYyBiL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jCmluZGV4IDA5YjlmZTQuLjM0MzBiN2MgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jCisrKyBiL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jCkBAIC0xOCwxNSArMTgsMTYgQEAKICAqLwogCiAjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgPGJ5dGVzLmg+CiAjaW5jbHVkZSA8c3RydWN0Lmg+CiAjaW5jbHVkZSA8YmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmg+CiAjaW5jbHVkZSA8Y29tcGFjdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sLmg+CiAjaW5jbHVkZSA8bWVtb3J5X2J1ZmZlci5oPgogCiAvLyBjYWNoZWQgY2xhc3Nlcy9tb2R1bGVzCiBWQUxVRSByYl9jU2V0OwogVkFMVUUgdGhyaWZ0X21vZHVsZTsKK1ZBTFVFIHRocmlmdF9ieXRlc19tb2R1bGU7CiBWQUxVRSB0aHJpZnRfdHlwZXNfbW9kdWxlOwogCiAvLyBUVHlwZSBjb25zdGFudHMKQEAgLTU2LDE5ICs1NywyMCBAQAogSUQgd3JpdGVfaTY0X21ldGhvZF9pZDsKIElEIHdyaXRlX2RvdWJsZV9tZXRob2RfaWQ7CiBJRCB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkOworSUQgd3JpdGVfYmluYXJ5X21ldGhvZF9pZDsKIElEIHdyaXRlX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBJRCB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZDsKIElEIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkOwogSUQgd3JpdGVfbGlzdF9lbmRfbWV0aG9kX2lkOwogSUQgd3JpdGVfc2V0X2JlZ2luX21ldGhvZF9pZDsKIElEIHdyaXRlX3NldF9lbmRfbWV0aG9kX2lkOwotSUQgc2l6ZV9tZXRob2RfaWQ7CiBJRCByZWFkX2Jvb2xfbWV0aG9kX2lkOwogSUQgcmVhZF9ieXRlX21ldGhvZF9pZDsKIElEIHJlYWRfaTE2X21ldGhvZF9pZDsKIElEIHJlYWRfaTMyX21ldGhvZF9pZDsKIElEIHJlYWRfaTY0X21ldGhvZF9pZDsKIElEIHJlYWRfc3RyaW5nX21ldGhvZF9pZDsKK0lEIHJlYWRfYmluYXJ5X21ldGhvZF9pZDsKIElEIHJlYWRfZG91YmxlX21ldGhvZF9pZDsKIElEIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZDsKIElEIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQ7CkBAIC04MSwxNCArODMsMTUgQEAKIElEIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkOwogSUQgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkOwogSUQga2V5c19tZXRob2RfaWQ7Ci1JRCBlbnRyaWVzX21ldGhvZF9pZDsgCi1JRCBuYW1lX21ldGhvZF9pZDsgCi1JRCBzb3J0X21ldGhvZF9pZDsKK0lEIGVudHJpZXNfbWV0aG9kX2lkOwogSUQgd3JpdGVfZmllbGRfc3RvcF9tZXRob2RfaWQ7CiBJRCBza2lwX21ldGhvZF9pZDsKIElEIHdyaXRlX21ldGhvZF9pZDsKIElEIHJlYWRfYWxsX21ldGhvZF9pZDsKLUlEIG5hdGl2ZV9xbWFya19tZXRob2RfaWQ7CitJRCByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZDsKK0lEIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZDsKK0lEIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZDsKK0lEIGNvbnZlcnRfdG9fc3RyaW5nX2lkOwogCiAvLyBjb25zdGFudCBpZHMKIElEIGZpZWxkc19jb25zdF9pZDsKQEAgLTEwMywxMSArMTA2LDEzIEBACiBWQUxVRSB2YWx1ZV9zeW07CiBWQUxVRSBlbGVtZW50X3N5bTsKIFZBTFVFIGNsYXNzX3N5bTsKK1ZBTFVFIGJpbmFyeV9zeW07CiBWQUxVRSBwcm90b2NvbF9leGNlcHRpb25fY2xhc3M7CiAKIHZvaWQgSW5pdF90aHJpZnRfbmF0aXZlKCkgewogICAvLyBjYWNoZWQgY2xhc3NlcwogICB0aHJpZnRfbW9kdWxlID0gcmJfY29uc3RfZ2V0KHJiX2NPYmplY3QsIHJiX2ludGVybigiVGhyaWZ0IikpOworICB0aHJpZnRfYnl0ZXNfbW9kdWxlID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiQnl0ZXMiKSk7CiAgIHRocmlmdF90eXBlc19tb2R1bGUgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJUeXBlcyIpKTsKICAgcmJfY1NldCA9IHJiX2NvbnN0X2dldChyYl9jT2JqZWN0LCByYl9pbnRlcm4oIlNldCIpKTsKICAgcHJvdG9jb2xfZXhjZXB0aW9uX2NsYXNzID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiUHJvdG9jb2xFeGNlcHRpb24iKSk7CkBAIC0xMzgsMTkgKzE0MywyMCBAQAogICB3cml0ZV9pNjRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9pNjQiKTsKICAgd3JpdGVfZG91YmxlX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfZG91YmxlIik7CiAgIHdyaXRlX3N0cmluZ19tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX3N0cmluZyIpOworICB3cml0ZV9iaW5hcnlfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9iaW5hcnkiKTsKICAgd3JpdGVfbWFwX2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbWFwX2JlZ2luIik7CiAgIHdyaXRlX21hcF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9tYXBfZW5kIik7CiAgIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9saXN0X2JlZ2luIik7CiAgIHdyaXRlX2xpc3RfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbGlzdF9lbmQiKTsKICAgd3JpdGVfc2V0X2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfc2V0X2JlZ2luIik7CiAgIHdyaXRlX3NldF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9zZXRfZW5kIik7Ci0gIHNpemVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJzaXplIik7CiAgIHJlYWRfYm9vbF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYm9vbCIpOwogICByZWFkX2J5dGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2J5dGUiKTsKICAgcmVhZF9pMTZfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2kxNiIpOwogICByZWFkX2kzMl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaTMyIik7CiAgIHJlYWRfaTY0X21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pNjQiKTsKICAgcmVhZF9zdHJpbmdfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX3N0cmluZyIpOworICByZWFkX2JpbmFyeV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYmluYXJ5Iik7CiAgIHJlYWRfZG91YmxlX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9kb3VibGUiKTsKICAgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX21hcF9iZWdpbiIpOwogICByZWFkX21hcF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX21hcF9lbmQiKTsgIApAQCAtMTY0LDEzICsxNzAsMTQgQEAKICAgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2ZpZWxkX2VuZCIpOwogICBrZXlzX21ldGhvZF9pZCA9IHJiX2ludGVybigia2V5cyIpOwogICBlbnRyaWVzX21ldGhvZF9pZCA9IHJiX2ludGVybigiZW50cmllcyIpOwotICBuYW1lX21ldGhvZF9pZCA9IHJiX2ludGVybigibmFtZSIpOwotICBzb3J0X21ldGhvZF9pZCA9IHJiX2ludGVybigic29ydCIpOwogICB3cml0ZV9maWVsZF9zdG9wX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfZmllbGRfc3RvcCIpOwogICBza2lwX21ldGhvZF9pZCA9IHJiX2ludGVybigic2tpcCIpOwogICB3cml0ZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlIik7CiAgIHJlYWRfYWxsX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9hbGwiKTsKLSAgbmF0aXZlX3FtYXJrX21ldGhvZF9pZCA9IHJiX2ludGVybigibmF0aXZlPyIpOworICByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pbnRvX2J1ZmZlciIpOworICBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQgPSByYl9pbnRlcm4oImZvcmNlX2JpbmFyeV9lbmNvZGluZyIpOworICBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXJfaWQgPSByYl9pbnRlcm4oImNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciIpOworICBjb252ZXJ0X3RvX3N0cmluZ19pZCA9IHJiX2ludGVybigiY29udmVydF90b19zdHJpbmciKTsKIAogICAvLyBjb25zdGFudCBpZHMKICAgZmllbGRzX2NvbnN0X2lkID0gcmJfaW50ZXJuKCJGSUVMRFMiKTsKQEAgLTE4NSw4ICsxOTIsOCBAQAogICB2YWx1ZV9zeW0gPSBJRDJTWU0ocmJfaW50ZXJuKCJ2YWx1ZSIpKTsKICAgZWxlbWVudF9zeW0gPSBJRDJTWU0ocmJfaW50ZXJuKCJlbGVtZW50IikpOwogICBjbGFzc19zeW0gPSBJRDJTWU0ocmJfaW50ZXJuKCJjbGFzcyIpKTsKKyAgYmluYXJ5X3N5bSA9IElEMlNZTShyYl9pbnRlcm4oImJpbmFyeSIpKTsKIAotICBJbml0X3Byb3RvY29sKCk7CiAgIEluaXRfc3RydWN0KCk7CiAgIEluaXRfYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkKCk7CiAgIEluaXRfY29tcGFjdF9wcm90b2NvbCgpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQucmIgYi9saWIvcmIvbGliL3RocmlmdC5yYgppbmRleCAwMmQ2N2I4Li4wZjU4MTIyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC5yYgpAQCAtMSw0ICsxLDQgQEAKLSMgCisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTYsMjYgKzYsMjggQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKKyMKICMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCisjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIAorIwogIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgogIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogIyBkZXRhaWxzLgogCiAkOi51bnNoaWZ0IEZpbGUuZGlybmFtZShfX0ZJTEVfXykKIAorcmVxdWlyZSAndGhyaWZ0L2J5dGVzJwogcmVxdWlyZSAndGhyaWZ0L2NvcmVfZXh0JwogcmVxdWlyZSAndGhyaWZ0L2V4Y2VwdGlvbnMnCiByZXF1aXJlICd0aHJpZnQvdHlwZXMnCiByZXF1aXJlICd0aHJpZnQvcHJvY2Vzc29yJworcmVxdWlyZSAndGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3NvcicKIHJlcXVpcmUgJ3RocmlmdC9jbGllbnQnCiByZXF1aXJlICd0aHJpZnQvc3RydWN0JwogcmVxdWlyZSAndGhyaWZ0L3VuaW9uJwpAQCAtNDAsMTIgKzQyLDE2IEBACiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sJwogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZCcKIHJlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sJworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wnCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wnCiAKICMgdHJhbnNwb3J0CiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydCcKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L2J5dGVzLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvYnl0ZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkNGY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L2J5dGVzLnJiCkBAIC0wLDAgKzEsMTMxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbW9kdWxlIFRocmlmdAorICAjIEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBieXRlcyBhbmQgYnl0ZSBidWZmZXJzLgorICBtb2R1bGUgQnl0ZXMKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgICMgQ3JlYXRlcyBhbmQgZW1wdHkgYnl0ZSBidWZmZXIgKFN0cmluZyB3aXRoIEJJTkFSWSBlbmNvZGluZykKKyAgICAgICMKKyAgICAgICMgc2l6ZSAtIFRoZSBJbnRlZ2VyIHNpemUgb2YgdGhlIGJ1ZmZlciAoZGVmYXVsdDogbmlsKSB0byBjcmVhdGUKKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIFN0cmluZyB3aXRoIEJJTkFSWSBlbmNvZGluZywgZmlsbGVkIHdpdGggbnVsbCBjaGFyYWN0ZXJzIAorICAgICAgIyBpZiBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAgICBkZWYgc2VsZi5lbXB0eV9ieXRlX2J1ZmZlcihzaXplID0gbmlsKQorICAgICAgICBpZiAoc2l6ZSAmJiBzaXplID4gMCkKKyAgICAgICAgICAiXDAiLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpICogc2l6ZQorICAgICAgICBlbHNlCisgICAgICAgICAgJycuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBGb3JjZXMgdGhlIGVuY29kaW5nIG9mIHRoZSBidWZmZXIgdG8gQklOQVJZLiBJZiB0aGUgYnVmZmVyCisgICAgICAjIHBhc3NlZCBpcyBmcm96ZW4sIHRoZW4gaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgorICAgICAgIworICAgICAgIyBidWZmZXIgLSBUaGUgU3RyaW5nIHRvIGZvcmNlIHRoZSBlbmNvZGluZyBvZi4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIHBhc3NlZCB3aXRoIGFuIGVuY29kaW5nIG9mIEJJTkFSWTsgcmV0dXJuZWQKKyAgICAgICMgU3RyaW5nIG1heSBiZSBhIGR1cGxpY2F0ZS4KKyAgICAgIGRlZiBzZWxmLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWZmZXIpCisgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5kdXAgaWYgYnVmZmVyLmZyb3plbj8KKyAgICAgICAgYnVmZmVyLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgIyBHZXRzIHRoZSBieXRlIHZhbHVlIG9mIGEgZ2l2ZW4gcG9zaXRpb24gaW4gYSBTdHJpbmcuCisgICAgICAjCisgICAgICAjIHN0cmluZyAtIFRoZSBTdHJpbmcgdG8gcmV0cml2ZSB0aGUgYnl0ZSB2YWx1ZSBmcm9tLgorICAgICAgIyBpbmRleCAgLSBUaGUgSW50ZWdlciBsb2NhdGlvbiBvZiB0aGUgYnl0ZSB2YWx1ZSB0byByZXRyaWV2ZS4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhbiBJbnRlZ2VyIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LgorICAgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgICAgIHN0cmluZy5nZXRieXRlKGluZGV4KQorICAgICAgZW5kCisKKyAgICAgICMgU2V0cyB0aGUgYnl0ZSB2YWx1ZSBnaXZlbiB0byBhIGdpdmVuIGluZGV4IGluIGEgU3RyaW5nLgorICAgICAgIworICAgICAgIyBzdHJpbmcgLSBUaGUgU3RyaW5nIHRvIHNldCB0aGUgYnl0ZSB2YWx1ZSBpbi4KKyAgICAgICMgaW5kZXggIC0gVGhlIEludGVnZXIgbG9jYXRpb24gdG8gc2V0IHRoZSBieXRlIHZhbHVlIGF0LgorICAgICAgIyBieXRlICAgLSBUaGUgSW50ZWdlciB2YWx1ZSAoMCB0byAyNTUpIHRvIHNldCBpbiB0aGUgc3RyaW5nLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGFuIEludGVnZXIgdmFsdWUgb2YgdGhlIGJ5dGUgdmFsdWUgdG8gc2V0LgorICAgICAgZGVmIHNlbGYuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCisgICAgICAgIHN0cmluZy5zZXRieXRlKGluZGV4LCBieXRlKQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgdGhlIGdpdmVuIFN0cmluZyB0byBhIFVURi04IGJ5dGUgYnVmZmVyLgorICAgICAgIworICAgICAgIyBzdHJpbmcgLSBUaGUgU3RyaW5nIHRvIGNvbnZlcnQuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBuZXcgU3RyaW5nIHdpdGggQklOQVJZIGVuY29kaW5nLCBjb250YWluaW5nIHRoZSBVVEYtOAorICAgICAgIyBieXRlcyBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nLgorICAgICAgZGVmIHNlbGYuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cmluZykKKyAgICAgICAgaWYgc3RyaW5nLmVuY29kaW5nICE9IEVuY29kaW5nOjpVVEZfOAorICAgICAgICAgICMgdHJhbnNjb2RlIHRvIFVURi04CisgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLmVuY29kZShFbmNvZGluZzo6VVRGXzgpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIGVuY29kaW5nIGlzIGFscmVhZHkgVVRGLTgsIGJ1dCBhIGR1cGxpY2F0ZSBpcyBuZWVkZWQKKyAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuZHVwCisgICAgICAgIGVuZAorICAgICAgICBzdHJpbmcuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorCisgICAgICAjIENvbnZlcnRzIHRoZSBnaXZlbiBVVEYtOCBieXRlIGJ1ZmZlciBpbnRvIGEgU3RyaW5nCisgICAgICAjCisgICAgICAjIHV0ZjhfYnVmZmVyIC0gQSBTdHJpbmcsIHdpdGggQklOQVJZIGVuY29kaW5nLCBjb250YWluaW5nIFVURi04IGJ5dGVzCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBuZXcgU3RyaW5nIHdpdGggVVRGLTggZW5jb2RpbmcsCisgICAgICBkZWYgc2VsZi5jb252ZXJ0X3RvX3N0cmluZyh1dGY4X2J1ZmZlcikKKyAgICAgICAgIyBkdXBsaWNhdGUgdGhlIGJ1ZmZlciwgZm9yY2UgZW5jb2RpbmcgdG8gVVRGLTgKKyAgICAgICAgdXRmOF9idWZmZXIuZHVwLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGRlZiBzZWxmLmVtcHR5X2J5dGVfYnVmZmVyKHNpemUgPSBuaWwpCisgICAgICAgIGlmIChzaXplICYmIHNpemUgPiAwKQorICAgICAgICAgICJcMCIgKiBzaXplCisgICAgICAgIGVsc2UKKyAgICAgICAgICAnJworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmZmVyKQorICAgICAgICBidWZmZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5nZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCkKKyAgICAgICAgc3RyaW5nW2luZGV4XQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgICAgICBzdHJpbmdbaW5kZXhdID0gYnl0ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHJpbmcpCisgICAgICAgICMgVGhpcyBhc3N1bWVzICRLQ09ERSBpcyAnVVRGOCcvJ1UnLCB3aGljaCB3b3VsZCBtZWFuIHRoZSBTdHJpbmcgaXMgYWxyZWFkeSBhIFVURi04IGJ5dGUgYnVmZmVyCisgICAgICAgICMgVE9ETyBjb25zaWRlciBoYW5kbGluZyBvdGhlciAkS0NPREUgdmFsdWVzIGFuZCB0cmFuc2NvZGluZyB3aXRoIGljb252CisgICAgICAgIHN0cmluZworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNvbnZlcnRfdG9fc3RyaW5nKHV0ZjhfYnVmZmVyKQorICAgICAgICAjIFNlZSBjb21tZW50IGluICdjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGZvciByZWxldmFudCBhc3N1bXB0aW9ucy4KKyAgICAgICAgdXRmOF9idWZmZXIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiCmluZGV4IDViMzBmMDEuLjY0ZWYwNTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIKQEAgLTEsNCArMSw0IEBACi0jIAorIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC02LDE2ICs2LDE2IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCisjCiAjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAorIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKKyMKIAogbW9kdWxlIFRocmlmdAogICBtb2R1bGUgQ2xpZW50CkBAIC0yNyw2ICsyNywxNSBAQAogCiAgICAgZGVmIHNlbmRfbWVzc2FnZShuYW1lLCBhcmdzX2NsYXNzLCBhcmdzID0ge30pCiAgICAgICBAb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkNBTEwsIEBzZXFpZCkKKyAgICAgIHNlbmRfbWVzc2FnZV9hcmdzKGFyZ3NfY2xhc3MsIGFyZ3MpCisgICAgZW5kCisKKyAgICBkZWYgc2VuZF9vbmV3YXlfbWVzc2FnZShuYW1lLCBhcmdzX2NsYXNzLCBhcmdzID0ge30pCisgICAgICBAb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWSwgQHNlcWlkKQorICAgICAgc2VuZF9tZXNzYWdlX2FyZ3MoYXJnc19jbGFzcywgYXJncykKKyAgICBlbmQKKworICAgIGRlZiBzZW5kX21lc3NhZ2VfYXJncyhhcmdzX2NsYXNzLCBhcmdzKQogICAgICAgZGF0YSA9IGFyZ3NfY2xhc3MubmV3CiAgICAgICBhcmdzLmVhY2ggZG8gfGssIHZ8CiAgICAgICAgIGRhdGEuc2VuZCgiI3trLnRvX3N9PSIsIHYpCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYgppbmRleCBkZGE3MDg5Li42OGNiOWUwIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKQEAgLTM1LDYgKzM1LDExIEBACiAgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCiAgICAgQkFEX1NFUVVFTkNFX0lEID0gNAogICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCiAgICAgYXR0cl9yZWFkZXIgOnR5cGUKIApAQCAtNzksNCArODQsNCBAQAogICAgIGVuZAogCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczNGMwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5yYgpAQCAtMCwwICsxLDc2IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvcicKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sJworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIE11bHRpcGxleGVkUHJvY2Vzc29yCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBhY3R1YWxfcHJvY2Vzc29ycyA9IHt9CisgICAgZW5kCisgCisgICAgZGVmIHJlZ2lzdGVyX3Byb2Nlc3NvcihzZXJ2aWNlX25hbWUsIHByb2Nlc3NvcikKKyAgICAgIEBhY3R1YWxfcHJvY2Vzc29yc1tzZXJ2aWNlX25hbWVdID0gcHJvY2Vzc29yCisgICAgZW5kCisgCisgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgbmFtZSwgdHlwZSwgc2VxaWQgPSBpcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4KKyAgICAgIGNoZWNrX3R5cGUodHlwZSkKKyAgICAgIGNoZWNrX3NlcGFyYXRvcihuYW1lKQorICAgICAgc2VydmljZV9uYW1lLCBtZXRob2QgPSBuYW1lLnNwbGl0KCc6JykKKyAgICAgIHByb2Nlc3NvcihzZXJ2aWNlX25hbWUpLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sLm5ldyhpcHJvdCwgW21ldGhvZCwgdHlwZSwgc2VxaWRdKSwgb3Byb3QpCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGRlZiBwcm9jZXNzb3Ioc2VydmljZV9uYW1lKQorICAgICAgaWYgQGFjdHVhbF9wcm9jZXNzb3JzLmhhc19rZXk/KHNlcnZpY2VfbmFtZSkKKyAgICAgICAgQGFjdHVhbF9wcm9jZXNzb3JzW3NlcnZpY2VfbmFtZV0KKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAje3NlcnZpY2VfbmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgI3tzZWxmLmNsYXNzLm5hbWV9I3JlZ2lzdGVyX3Byb2Nlc3Nvcj8iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY2hlY2tfdHlwZSh0eXBlKQorICAgICAgdW5sZXNzIFtNZXNzYWdlVHlwZXM6OkNBTEwsIE1lc3NhZ2VUeXBlczo6T05FV0FZXS5pbmNsdWRlPyh0eXBlKQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoJ1RoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8nKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY2hlY2tfc2VwYXJhdG9yKG5hbWUpCisgICAgICBpZiBuYW1lLmNvdW50KCc6JykgPCAxCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICN7bmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRocmlmdDo6UHJvdG9jb2w6Ok11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPCBCYXNlUHJvdG9jb2wKKworICAgIGluY2x1ZGUgUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCwgbWVzc2FnZV9iZWdpbikKKyAgICAgIHN1cGVyKHByb3RvY29sKQorICAgICAgQG1lc3NhZ2VfYmVnaW4gPSBtZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBAbWVzc2FnZV9iZWdpbgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCmluZGV4IDVkOWUwYTEuLmNlMjFlMTIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKQEAgLTE3LDI1ICsxNywzNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMgCiAKK3JlcXVpcmUgJ2xvZ2dlcicKKwogbW9kdWxlIFRocmlmdAogICBtb2R1bGUgUHJvY2Vzc29yCi0gICAgZGVmIGluaXRpYWxpemUoaGFuZGxlcikKKyAgICBkZWYgaW5pdGlhbGl6ZShoYW5kbGVyLCBsb2dnZXI9bmlsKQogICAgICAgQGhhbmRsZXIgPSBoYW5kbGVyCisgICAgICBpZiBsb2dnZXIubmlsPworICAgICAgICBAbG9nZ2VyID0gTG9nZ2VyLm5ldyhTVERFUlIpCisgICAgICAgIEBsb2dnZXIubGV2ZWwgPSBMb2dnZXI6OldBUk4KKyAgICAgIGVsc2UKKyAgICAgICAgQGxvZ2dlciA9IGxvZ2dlcgorICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICBuYW1lLCB0eXBlLCBzZXFpZCAgPSBpcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4KICAgICAgIGlmIHJlc3BvbmRfdG8/KCJwcm9jZXNzXyN7bmFtZX0iKQotICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQorICAgICAgICBiZWdpbgorICAgICAgICAgIHNlbmQoInByb2Nlc3NfI3tuYW1lfSIsIHNlcWlkLCBpcHJvdCwgb3Byb3QpCisgICAgICAgIHJlc2N1ZSA9PiBlCisgICAgICAgICAgeCA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgICAgICAgQGxvZ2dlci5kZWJ1ZyAiSW50ZXJuYWwgZXJyb3IgOiAje2UubWVzc2FnZX1cbiN7ZS5iYWNrdHJhY2Uuam9pbigiXG4iKX0iCisgICAgICAgICAgd3JpdGVfZXJyb3IoeCwgb3Byb3QsIG5hbWUsIHNlcWlkKQorICAgICAgICBlbmQKICAgICAgICAgdHJ1ZQogICAgICAgZWxzZQogICAgICAgICBpcHJvdC5za2lwKFR5cGVzOjpTVFJVQ1QpCiAgICAgICAgIGlwcm90LnJlYWRfbWVzc2FnZV9lbmQKICAgICAgICAgeCA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICdVbmtub3duIGZ1bmN0aW9uICcrbmFtZSkKLSAgICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgc2VxaWQpCi0gICAgICAgIHgud3JpdGUob3Byb3QpCi0gICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfZW5kCi0gICAgICAgIG9wcm90LnRyYW5zLmZsdXNoCisgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKICAgICAgICAgZmFsc2UKICAgICAgIGVuZAogICAgIGVuZApAQCAtNTMsNSArNjQsMTIgQEAKICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfZW5kCiAgICAgICBvcHJvdC50cmFucy5mbHVzaAogICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2Vycm9yKGVyciwgb3Byb3QsIG5hbWUsIHNlcWlkKQorICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgc2VxaWQpCisgICAgICBlcnIud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAorICAgICAgb3Byb3QudHJhbnMuZmx1c2gKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCmluZGV4IGIxOTkwOWQuLjVjNjkzZTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgpAQCAtMjgsNiArMjgsOCBAQAogICAgIE5FR0FUSVZFX1NJWkUgPSAyCiAgICAgU0laRV9MSU1JVCA9IDMKICAgICBCQURfVkVSU0lPTiA9IDQKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1CisgICAgREVQVEhfTElNSVQgPSA2CiAKICAgICBhdHRyX3JlYWRlciA6dHlwZQogCkBAIC0xMTQsMTAgKzExNiwyNyBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCisgICAgIyBXcml0ZXMgYSBUaHJpZnQgU3RyaW5nLiBJbiBSdWJ5IDEuOSssIHRoZSBTdHJpbmcgcGFzc2VkIHdpbGwgYmUgdHJhbnNjb2RlZCB0byBVVEYtOC4KKyAgICAjCisgICAgIyBzdHIgLSBUaGUgU3RyaW5nIHRvIHdyaXRlLgorICAgICMKKyAgICAjIFJhaXNlcyBFbmNvZGluZ0Vycm9yIGlmIHRoZSB0cmFuc2NvZGluZyB0byBVVEYtOCBmYWlscy4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCiAgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFdyaXRlcyBhIFRocmlmdCBCaW5hcnkgKFRocmlmdCBTdHJpbmcgd2l0aCBubyBlbmNvZGluZykuIEluIFJ1YnkgMS45KywgdGhlIFN0cmluZyBwYXNzZWQKKyAgICAjIHdpbGwgZm9yY2VkIGludG8gQklOQVJZIGVuY29kaW5nLgorICAgICMKKyAgICAjIGJ1ZiAtIFRoZSBTdHJpbmcgdG8gd3JpdGUuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZApAQCAtMTc4LDE4ICsxOTcsNjcgQEAKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAorICAgICMgUmVhZHMgYSBUaHJpZnQgU3RyaW5nLiBJbiBSdWJ5IDEuOSssIGFsbCBTdHJpbmdzIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhbiBFbmNvZGluZyBvZiBVVEYtOC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU3RyaW5nLgogICAgIGRlZiByZWFkX3N0cmluZwogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCi0gICAgZGVmIHdyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCi0gICAgICB3cml0ZV9maWVsZF9iZWdpbihuYW1lLCB0eXBlLCBmaWQpCi0gICAgICB3cml0ZV90eXBlKHR5cGUsIHZhbHVlKQorICAgICMgUmVhZHMgYSBUaHJpZnQgQmluYXJ5IChUaHJpZnQgU3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLiBJbiBSdWJ5IDEuOSssIGFsbCBTdHJpbmdzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAjIHdpdGggYW4gRW5jb2Rpbmcgb2YgQklOQVJZLgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcuCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZW5kCisKKyAgICAjIFdyaXRlcyBhIGZpZWxkIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbiwgZmllbGQgSUQgYW5kIHZhbHVlLgorICAgICMKKyAgICAjIGZpZWxkX2luZm8gLSBBIEhhc2ggY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZmllbGQ6CisgICAgIyAgICAgICAgICAgICAgOm5hbWUgICAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAjICAgICAgICAgICAgICA6dHlwZSAgIC0gVGhlIHR5cGUgb2YgdGhlIGZpZWxkLCB3aGljaCBtdXN0IGJlIGEgVGhyaWZ0OjpUeXBlcyBjb25zdGFudC4KKyAgICAjICAgICAgICAgICAgICA6YmluYXJ5IC0gQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMgZmlkICAgICAgICAtIFRoZSBJRCBvZiB0aGUgZmllbGQuCisgICAgIyB2YWx1ZSAgICAgIC0gVGhlIGZpZWxkJ3MgdmFsdWUgdG8gd3JpdGU7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiA6dHlwZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlX2ZpZWxkKCphcmdzKQorICAgICAgaWYgYXJncy5zaXplID09IDMKKyAgICAgICAgIyBoYW5kbGVzIHRoZSBkb2N1bWVudGVkIG1ldGhvZCBzaWduYXR1cmUgLSB3cml0ZV9maWVsZChmaWVsZF9pbmZvLCBmaWQsIHZhbHVlKQorICAgICAgICBmaWVsZF9pbmZvID0gYXJnc1swXQorICAgICAgICBmaWQgPSBhcmdzWzFdCisgICAgICAgIHZhbHVlID0gYXJnc1syXQorICAgICAgZWxzaWYgYXJncy5zaXplID09IDQKKyAgICAgICAgIyBoYW5kbGVzIHRoZSBkZXByZWNhdGVkIG1ldGhvZCBzaWduYXR1cmUgLSB3cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQorICAgICAgICBmaWVsZF9pbmZvID0gezpuYW1lID0+IGFyZ3NbMF0sIDp0eXBlID0+IGFyZ3NbMV19CisgICAgICAgIGZpZCA9IGFyZ3NbMl0KKyAgICAgICAgdmFsdWUgPSBhcmdzWzNdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgje2FyZ3Muc2l6ZX0gZm9yIDMpIgorICAgICAgZW5kCisKKyAgICAgIHdyaXRlX2ZpZWxkX2JlZ2luKGZpZWxkX2luZm9bOm5hbWVdLCBmaWVsZF9pbmZvWzp0eXBlXSwgZmlkKQorICAgICAgd3JpdGVfdHlwZShmaWVsZF9pbmZvLCB2YWx1ZSkKICAgICAgIHdyaXRlX2ZpZWxkX2VuZAogICAgIGVuZAogCi0gICAgZGVmIHdyaXRlX3R5cGUodHlwZSwgdmFsdWUpCi0gICAgICBjYXNlIHR5cGUKKyAgICAjIFdyaXRlcyBhIGZpZWxkIHZhbHVlIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpZWxkOgorICAgICMgICAgICAgICAgICAgIDp0eXBlICAgLSBUaGUgVGhyaWZ0OjpUeXBlcyBjb25zdGFudCB0aGF0IGRldGVybWluZXMgaG93IHRoZSB2YWx1ZSBpcyB3cml0dGVuLgorICAgICMgICAgICAgICAgICAgIDpiaW5hcnkgLSBBIEJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyBpZiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcgaXMgYSBiaW5hcnkgc3RyaW5nIChzdHJpbmcgd2l0aG91dCBlbmNvZGluZykuCisgICAgIyB2YWx1ZSAgICAgIC0gVGhlIGZpZWxkJ3MgdmFsdWUgdG8gd3JpdGU7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiBmaWVsZF9pbmZvWzp0eXBlXS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlX3R5cGUoZmllbGRfaW5mbywgdmFsdWUpCisgICAgICAjIGlmIGZpZWxkX2luZm8gaXMgYSBGaXhudW0sIGFzc3VtZSBpdCBpcyBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQKKyAgICAgICMgY29udmVydCBpdCBpbnRvIGEgZmllbGRfaW5mbyBIYXNoIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgaWYgZmllbGRfaW5mby5pc19hPyBGaXhudW0KKyAgICAgICAgZmllbGRfaW5mbyA9IHs6dHlwZSA9PiBmaWVsZF9pbmZvfQorICAgICAgZW5kCisKKyAgICAgIGNhc2UgZmllbGRfaW5mb1s6dHlwZV0KICAgICAgIHdoZW4gVHlwZXM6OkJPT0wKICAgICAgICAgd3JpdGVfYm9vbCh2YWx1ZSkKICAgICAgIHdoZW4gVHlwZXM6OkJZVEUKQEAgLTIwMyw3ICsyNzEsMTEgQEAKICAgICAgIHdoZW4gVHlwZXM6Okk2NAogICAgICAgICB3cml0ZV9pNjQodmFsdWUpCiAgICAgICB3aGVuIFR5cGVzOjpTVFJJTkcKLSAgICAgICAgd3JpdGVfc3RyaW5nKHZhbHVlKQorICAgICAgICBpZiBmaWVsZF9pbmZvWzpiaW5hcnldCisgICAgICAgICAgd3JpdGVfYmluYXJ5KHZhbHVlKQorICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGVfc3RyaW5nKHZhbHVlKQorICAgICAgICBlbmQKICAgICAgIHdoZW4gVHlwZXM6OlNUUlVDVAogICAgICAgICB2YWx1ZS53cml0ZShzZWxmKQogICAgICAgZWxzZQpAQCAtMjExLDggKzI4MywyMSBAQAogICAgICAgZW5kCiAgICAgZW5kCiAKLSAgICBkZWYgcmVhZF90eXBlKHR5cGUpCi0gICAgICBjYXNlIHR5cGUKKyAgICAjIFJlYWRzIGEgZmllbGQgdmFsdWUgYmFzZWQgb24gdGhlIGZpZWxkIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIGZpZWxkX2luZm8gLSBBIEhhc2ggY29udGFpbmluZyB0aGUgcGVydGluZW50IGRhdGEgdG8gd3JpdGU6CisgICAgIyAgICAgICAgICAgICAgOnR5cGUgICAtIFRoZSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50IHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIHZhbHVlIGlzIHdyaXR0ZW4uCisgICAgIyAgICAgICAgICAgICAgOmJpbmFyeSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcgaXMgYSBiaW5hcnkgc3RyaW5nIChzdHJpbmcgd2l0aG91dCBlbmNvZGluZykuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgdmFsdWUgcmVhZDsgb2JqZWN0IHR5cGUgdmFyaWVzIGJhc2VkIG9uIGZpZWxkX2luZm9bOnR5cGVdLgorICAgIGRlZiByZWFkX3R5cGUoZmllbGRfaW5mbykKKyAgICAgICMgaWYgZmllbGRfaW5mbyBpcyBhIEZpeG51bSwgYXNzdW1lIGl0IGlzIGEgVGhyaWZ0OjpUeXBlcyBjb25zdGFudAorICAgICAgIyBjb252ZXJ0IGl0IGludG8gYSBmaWVsZF9pbmZvIEhhc2ggZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICBpZiBmaWVsZF9pbmZvLmlzX2E/IEZpeG51bQorICAgICAgICBmaWVsZF9pbmZvID0gezp0eXBlID0+IGZpZWxkX2luZm99CisgICAgICBlbmQKKworICAgICAgY2FzZSBmaWVsZF9pbmZvWzp0eXBlXQogICAgICAgd2hlbiBUeXBlczo6Qk9PTAogICAgICAgICByZWFkX2Jvb2wKICAgICAgIHdoZW4gVHlwZXM6OkJZVEUKQEAgLTIyNiw3ICszMTEsMTEgQEAKICAgICAgIHdoZW4gVHlwZXM6Okk2NAogICAgICAgICByZWFkX2k2NAogICAgICAgd2hlbiBUeXBlczo6U1RSSU5HCi0gICAgICAgIHJlYWRfc3RyaW5nCisgICAgICAgIGlmIGZpZWxkX2luZm9bOmJpbmFyeV0KKyAgICAgICAgICByZWFkX2JpbmFyeQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVhZF9zdHJpbmcKKyAgICAgICAgZW5kCiAgICAgICBlbHNlCiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgIGVuZApAQCAtMjgwLDExICszNjksMTkgQEAKICAgICAgICAgcmVhZF9saXN0X2VuZAogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICIje3RyYW5zLnRvX3N9IgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKaW5kZXggMDRkMTQ5YS4uZDgyNzlkYiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgpAQCAtMjksNiArMjksMTAgQEAKICAgICAgIHN1cGVyKHRyYW5zKQogICAgICAgQHN0cmljdF9yZWFkID0gc3RyaWN0X3JlYWQKICAgICAgIEBzdHJpY3Rfd3JpdGUgPSBzdHJpY3Rfd3JpdGUKKworICAgICAgIyBQcmUtYWxsb2NhdGVkIHJlYWQgYnVmZmVyIGZvciBmaXhlZC1zaXplIHJlYWQgbWV0aG9kcy4gTmVlZHMgdG8gYmUgYXQgbGVhc3QgOCBieXRlcyBsb25nIGZvcgorICAgICAgIyByZWFkX2k2NCgpIGFuZCByZWFkX2RvdWJsZSgpLgorICAgICAgQHJidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcig4KQogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCkBAIC0xMDMsOCArMTA3LDEzIEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKLSAgICAgIHdyaXRlX2kzMihzdHIubGVuZ3RoKQotICAgICAgdHJhbnMud3JpdGUoc3RyKQorICAgICAgYnVmID0gQnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cikKKyAgICAgIHdyaXRlX2JpbmFyeShidWYpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIHdyaXRlX2kzMihidWYuYnl0ZXNpemUpCisgICAgICB0cmFucy53cml0ZShidWYpCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCkBAIC0xNjUsOCArMTc0LDcgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2J5dGUKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDEpCi0gICAgICB2YWwgPSBkYXRbMF0ub3JkCisgICAgICB2YWwgPSB0cmFucy5yZWFkX2J5dGUKICAgICAgIGlmICh2YWwgPiAweDdmKQogICAgICAgICB2YWwgPSAwIC0gKCh2YWwgLSAxKSBeIDB4ZmYpCiAgICAgICBlbmQKQEAgLTE3NCw4ICsxODIsOCBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfaTE2Ci0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCgyKQotICAgICAgdmFsLCA9IGRhdC51bnBhY2soJ24nKQorICAgICAgdHJhbnMucmVhZF9pbnRvX2J1ZmZlcihAcmJ1ZiwgMikKKyAgICAgIHZhbCwgPSBAcmJ1Zi51bnBhY2soJ24nKQogICAgICAgaWYgKHZhbCA+IDB4N2ZmZikKICAgICAgICAgdmFsID0gMCAtICgodmFsIC0gMSkgXiAweGZmZmYpCiAgICAgICBlbmQKQEAgLTE4Myw4ICsxOTEsOCBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfaTMyCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCg0KQotICAgICAgdmFsLCA9IGRhdC51bnBhY2soJ04nKQorICAgICAgdHJhbnMucmVhZF9pbnRvX2J1ZmZlcihAcmJ1ZiwgNCkKKyAgICAgIHZhbCwgPSBAcmJ1Zi51bnBhY2soJ04nKQogICAgICAgaWYgKHZhbCA+IDB4N2ZmZmZmZmYpCiAgICAgICAgIHZhbCA9IDAgLSAoKHZhbCAtIDEpIF4gMHhmZmZmZmZmZikKICAgICAgIGVuZApAQCAtMTkyLDggKzIwMCw4IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9pNjQKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDgpCi0gICAgICBoaSwgbG8gPSBkYXQudW5wYWNrKCdOMicpCisgICAgICB0cmFucy5yZWFkX2ludG9fYnVmZmVyKEByYnVmLCA4KQorICAgICAgaGksIGxvID0gQHJidWYudW5wYWNrKCdOMicpCiAgICAgICBpZiAoaGkgPiAweDdmZmZmZmZmKQogICAgICAgICBoaSBePSAweGZmZmZmZmZmCiAgICAgICAgIGxvIF49IDB4ZmZmZmZmZmYKQEAgLTIwNCwyMiArMjEyLDMzIEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9kb3VibGUKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDgpCi0gICAgICB2YWwgPSBkYXQudW5wYWNrKCdHJykuZmlyc3QKKyAgICAgIHRyYW5zLnJlYWRfaW50b19idWZmZXIoQHJidWYsIDgpCisgICAgICB2YWwgPSBAcmJ1Zi51bnBhY2soJ0cnKS5maXJzdAogICAgICAgdmFsCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9zdHJpbmcKLSAgICAgIHN6ID0gcmVhZF9pMzIKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKHN6KQotICAgICAgZGF0CisgICAgICBidWZmZXIgPSByZWFkX2JpbmFyeQorICAgICAgQnl0ZXMuY29udmVydF90b19zdHJpbmcoYnVmZmVyKQogICAgIGVuZAogCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICBzaXplID0gcmVhZF9pMzIKKyAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJpbmFyeVByb3RvY29sRmFjdG9yeSA8IEJhc2VQcm90b2NvbEZhY3RvcnkKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgcmV0dXJuIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmluYXJ5IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCmluZGV4IDcwZWE2NTIuLjA5YjAyNjQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKQEAgLTM1LDUgKzM1LDEzIEBACiAgICAgICAgIEJpbmFyeVByb3RvY29sLm5ldyh0cmFucykKICAgICAgIGVuZAogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgIGlmIChkZWZpbmVkPyBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgICAiYmluYXJ5LWFjY2VsIgorICAgICAgZWxzZQorICAgICAgICAiYmluYXJ5IgorICAgICAgZW5kCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgppbmRleCAzYmUyYTkwLi4xZjliZDMwIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKQEAgLTI0LDYgKzI0LDcgQEAKICAgICBWRVJTSU9OID0gMQogICAgIFZFUlNJT05fTUFTSyA9IDB4MWYKICAgICBUWVBFX01BU0sgPSAweEUwCisgICAgVFlQRV9CSVRTID0gMHgwNwogICAgIFRZUEVfU0hJRlRfQU1PVU5UID0gNQogCiAgICAgVFNUT1AgPSBbIiIsIFR5cGVzOjpTVE9QLCAwXQpAQCAtOTgsNiArOTksOSBAQAogCiAgICAgICBAbGFzdF9maWVsZCA9IFswXQogICAgICAgQGJvb2xlYW5fdmFsdWUgPSBuaWwKKworICAgICAgIyBQcmUtYWxsb2NhdGVkIHJlYWQgYnVmZmVyIGZvciByZWFkX2RvdWJsZSgpLgorICAgICAgQHJidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcig4KQogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCkBAIC0yMDcsOCArMjExLDEzIEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKLSAgICAgIHdyaXRlX3ZhcmludDMyKHN0ci5sZW5ndGgpCi0gICAgICBAdHJhbnMud3JpdGUoc3RyKQorICAgICAgYnVmID0gQnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cikKKyAgICAgIHdyaXRlX2JpbmFyeShidWYpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIHdyaXRlX3ZhcmludDMyKGJ1Zi5ieXRlc2l6ZSkKKyAgICAgIEB0cmFucy53cml0ZShidWYpCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCkBAIC0yMjMsNyArMjMyLDcgQEAKICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KCJFeHBlY3RlZCB2ZXJzaW9uICN7VkVSU0lPTn0gYnV0IGdvdCAje3ZlcnNpb259Iik7CiAgICAgICBlbmQKICAgICAgIAotICAgICAgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMKKyAgICAgIHR5cGUgPSAodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMKICAgICAgIHNlcWlkID0gcmVhZF92YXJpbnQzMigpCiAgICAgICBtZXNzYWdlTmFtZSA9IHJlYWRfc3RyaW5nKCkKICAgICAgIFttZXNzYWdlTmFtZSwgdHlwZSwgc2VxaWRdCkBAIC0zMDIsOCArMzExLDcgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2J5dGUKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDEpCi0gICAgICB2YWwgPSBkYXRbMF0KKyAgICAgIHZhbCA9IHRyYW5zLnJlYWRfYnl0ZQogICAgICAgaWYgKHZhbCA+IDB4N2YpCiAgICAgICAgIHZhbCA9IDAgLSAoKHZhbCAtIDEpIF4gMHhmZikKICAgICAgIGVuZApAQCAtMzIzLDE3ICszMzEsMjUgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2RvdWJsZQotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoOCkKLSAgICAgIHZhbCA9IGRhdC5yZXZlcnNlLnVucGFjaygnRycpLmZpcnN0CisgICAgICB0cmFucy5yZWFkX2ludG9fYnVmZmVyKEByYnVmLCA4KQorICAgICAgdmFsID0gQHJidWYucmV2ZXJzZS51bnBhY2soJ0cnKS5maXJzdAogICAgICAgdmFsCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CisgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKICAgICAgIHNpemUgPSByZWFkX3ZhcmludDMyKCkKICAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCiAgICAgZW5kCiAgICAgCi0gICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJjb21wYWN0KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogICAgIAogICAgICMgCkBAIC00MTksNSArNDM1LDkgQEAKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgQ29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU3NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpAQCAtMCwwICsxLDc4NiBAQAorIyBlbmNvZGluZzogVVRGLTgKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKworcmVxdWlyZSAnYmFzZTY0JworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIExvb2thaGVhZFJlYWRlcgorICAgIGRlZiBpbml0aWFsaXplKHRyYW5zKQorICAgICAgQHRyYW5zID0gdHJhbnMKKyAgICAgIEBoYXNEYXRhID0gZmFsc2UKKyAgICAgIEBkYXRhID0gbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZAorICAgICAgaWYgQGhhc0RhdGEKKyAgICAgICAgQGhhc0RhdGEgPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBAZGF0YSA9IEB0cmFucy5yZWFkKDEpCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIEBkYXRhCisgICAgZW5kCisKKyAgICBkZWYgcGVlaworICAgICAgaWYgIUBoYXNEYXRhCisgICAgICAgIEBkYXRhID0gQHRyYW5zLnJlYWQoMSkKKyAgICAgIGVuZAorICAgICAgQGhhc0RhdGEgPSB0cnVlCisgICAgICByZXR1cm4gQGRhdGEKKyAgICBlbmQKKyAgZW5kCisKKyAgIworICAjIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CisgICMgaW1wbGVtZW50YXRpb25zCisgICMKKyAgY2xhc3MgSlNPTkNvbnRleHQKKyAgICBAQGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJworICAgICMKKyAgICAjIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnMuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAjCisgICAgZGVmIHdyaXRlKHRyYW5zKQorICAgIGVuZAorCisgICAgIworICAgICMgUmVhZCBjb250ZXh0IGRhdGEgZnJvbSB0aGUgdHJhbnMuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAjCisgICAgZGVmIHJlYWQocmVhZGVyKQorICAgIGVuZAorCisgICAgIworICAgICMgUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCisgICAgIyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KKyAgICAjCisgICAgZGVmIGVzY2FwZU51bQorICAgICAgcmV0dXJuIGZhbHNlCisgICAgZW5kCisgIGVuZAorCisgICMgQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKKyAgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDwgSlNPTkNvbnRleHQKKyAgICBAQGtKU09OUGFpclNlcGFyYXRvciA9ICc6JworCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBmaXJzdCA9IHRydWUKKyAgICAgIEBjb2xvbiA9IHRydWUKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZSh0cmFucykKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICAgIEBjb2xvbiA9IHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgdHJhbnMud3JpdGUoQGNvbG9uID8gQEBrSlNPTlBhaXJTZXBhcmF0b3IgOiBAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgICAgQGNvbG9uID0gIUBjb2xvbgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZChyZWFkZXIpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgICBAY29sb24gPSB0cnVlCisgICAgICBlbHNlCisgICAgICAgIGNoID0gKEBjb2xvbiA/IEBAa0pTT05QYWlyU2VwYXJhdG9yIDogQEBrSlNPTkVsZW1TZXBhcmF0b3IpCisgICAgICAgIEBjb2xvbiA9ICFAY29sb24KKyAgICAgICAgSnNvblByb3RvY29sOjpyZWFkX3N5bnRheF9jaGFyKHJlYWRlciwgY2gpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgorICAgIGRlZiBlc2NhcGVOdW0KKyAgICAgIHJldHVybiBAY29sb24KKyAgICBlbmQKKyAgZW5kCisKKyAgIyBDb250ZXh0IGNsYXNzIGZvciBsaXN0cworICBjbGFzcyBKU09OTGlzdENvbnRleHQgPCBKU09OQ29udGV4dAorCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBmaXJzdCA9IHRydWUKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZSh0cmFucykKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05FbGVtU2VwYXJhdG9yKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZChyZWFkZXIpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBKc29uUHJvdG9jb2w6OnJlYWRfc3ludGF4X2NoYXIocmVhZGVyLCBAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBKc29uUHJvdG9jb2wgPCBCYXNlUHJvdG9jb2wKKworICAgIEBAa0pTT05PYmplY3RTdGFydCA9ICd7JworICAgIEBAa0pTT05PYmplY3RFbmQgPSAnfScKKyAgICBAQGtKU09OQXJyYXlTdGFydCA9ICdbJworICAgIEBAa0pTT05BcnJheUVuZCA9ICddJworICAgIEBAa0pTT05OZXdsaW5lID0gJ1xuJworICAgIEBAa0pTT05CYWNrc2xhc2ggPSAnXFwnCisgICAgQEBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJworCisgICAgQEBrVGhyaWZ0VmVyc2lvbjEgPSAxCisKKyAgICBAQGtUaHJpZnROYW4gPSAiTmFOIgorICAgIEBAa1RocmlmdEluZmluaXR5ID0gIkluZmluaXR5IgorICAgIEBAa1RocmlmdE5lZ2F0aXZlSW5maW5pdHkgPSAiLUluZmluaXR5IgorCisgICAgZGVmIGluaXRpYWxpemUodHJhbnMpCisgICAgICBzdXBlcih0cmFucykKKyAgICAgIEBjb250ZXh0ID0gSlNPTkNvbnRleHQubmV3CisgICAgICBAY29udGV4dHMgPSBBcnJheS5uZXcKKyAgICAgIEByZWFkZXIgPSBMb29rYWhlYWRSZWFkZXIubmV3KHRyYW5zKQorICAgIGVuZAorCisgICAgZGVmIGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoaWQpCisgICAgICBjYXNlIGlkCisgICAgICB3aGVuIFR5cGVzOjpCT09MCisgICAgICAgICJ0ZiIKKyAgICAgIHdoZW4gVHlwZXM6OkJZVEUKKyAgICAgICAgImk4IgorICAgICAgd2hlbiBUeXBlczo6STE2CisgICAgICAgICJpMTYiCisgICAgICB3aGVuIFR5cGVzOjpJMzIKKyAgICAgICAgImkzMiIKKyAgICAgIHdoZW4gVHlwZXM6Okk2NAorICAgICAgICAiaTY0IgorICAgICAgd2hlbiBUeXBlczo6RE9VQkxFCisgICAgICAgICJkYmwiCisgICAgICB3aGVuIFR5cGVzOjpTVFJJTkcKKyAgICAgICAgInN0ciIKKyAgICAgIHdoZW4gVHlwZXM6OlNUUlVDVAorICAgICAgICAicmVjIgorICAgICAgd2hlbiBUeXBlczo6TUFQCisgICAgICAgICJtYXAiCisgICAgICB3aGVuIFR5cGVzOjpTRVQKKyAgICAgICAgInNldCIKKyAgICAgIHdoZW4gVHlwZXM6OkxJU1QKKyAgICAgICAgImxzdCIKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShuYW1lKQorICAgICAgaWYgKG5hbWUgPT0gInRmIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkJPT0wKKyAgICAgIGVsc2lmIChuYW1lID09ICJpOCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpCWVRFCisgICAgICBlbHNpZiAobmFtZSA9PSAiaTE2IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkkxNgorICAgICAgZWxzaWYgKG5hbWUgPT0gImkzMiIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpJMzIKKyAgICAgIGVsc2lmIChuYW1lID09ICJpNjQiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6STY0CisgICAgICBlbHNpZiAobmFtZSA9PSAiZGJsIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkRPVUJMRQorICAgICAgZWxzaWYgKG5hbWUgPT0gInN0ciIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTVFJJTkcKKyAgICAgIGVsc2lmIChuYW1lID09ICJyZWMiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U1RSVUNUCisgICAgICBlbHNpZiAobmFtZSA9PSAibWFwIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6Ok1BUAorICAgICAgZWxzaWYgKG5hbWUgPT0gInNldCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTRVQKKyAgICAgIGVsc2lmIChuYW1lID09ICJsc3QiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6TElTVAorICAgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U1RPUAorICAgICAgZW5kCisgICAgICBpZiAocmVzdWx0ID09IFR5cGVzOjpTVE9QKQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICBlbmQKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICBlbmQKKworICAgICMgU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKKworICAgICMgUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KKyAgICAjIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KKyAgICBkZWYgc2VsZi5yZWFkX3N5bnRheF9jaGFyKHJlYWRlciwgY2gpCisgICAgICBjaDIgPSByZWFkZXIucmVhZAorICAgICAgaWYgKGNoMiAhPSBjaCkKKyAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcJyN7Y2h9XCcgZ290IFwnI3tjaDJ9XCcuIikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAjIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgZGVmIGlzX2pzb25fbnVtZXJpYyhjaCkKKyAgICAgIGNhc2UgY2gKKyAgICAgIHdoZW4gJysnLCAnLScsICcuJywgJzAnIC4uICc5JywgJ0UnLCAiZSIKKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwdXNoX2NvbnRleHQoY29udGV4dCkKKyAgICAgIEBjb250ZXh0cy5wdXNoKEBjb250ZXh0KQorICAgICAgQGNvbnRleHQgPSBjb250ZXh0CisgICAgZW5kCisKKyAgICBkZWYgcG9wX2NvbnRleHQKKyAgICAgIEBjb250ZXh0ID0gQGNvbnRleHRzLnBvcAorICAgIGVuZAorCisgICAgIyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQorICAgIGRlZiB3cml0ZV9qc29uX2VzY2FwZV9jaGFyKGNoKQorICAgICAgdHJhbnMud3JpdGUoJ1xcdScpCisgICAgICBjaF92YWx1ZSA9IGNoWzBdCisgICAgICBpZiAoY2hfdmFsdWUua2luZF9vZj8gU3RyaW5nKQorICAgICAgICBjaF92YWx1ZSA9IGNoLmJ5dGVzLmZpcnN0CisgICAgICBlbmQKKyAgICAgIHRyYW5zLndyaXRlKGNoX3ZhbHVlLnRvX3MoMTYpLnJqdXN0KDQsJzAnKSkKKyAgICBlbmQKKworICAgICMgV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIGRlZiB3cml0ZV9qc29uX2NoYXIoY2gpCisgICAgICAjIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycworICAgICAgIyAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCisgICAgICAjIDEgOiBqdXN0IG91dHB1dCBpbmRleAorICAgICAgIyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KKyAgICAgIGtKU09OQ2hhclRhYmxlID0gWworICAgICAgICAgICMgMCAxIDIgMyA0IDUgNiA3IDggOSBBIEIgQyBEIEUgRgorICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsJ2InLCd0JywnbicsIDAsJ2YnLCdyJywgMCwgMCwgIyAwCisgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIyAxCisgICAgICAgICAgMSwgMSwnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICMgMgorICAgICAgXQorCisgICAgICBjaF92YWx1ZSA9IGNoWzBdCisgICAgICBpZiAoY2hfdmFsdWUua2luZF9vZj8gU3RyaW5nKQorICAgICAgICBjaF92YWx1ZSA9IGNoLmJ5dGVzLmZpcnN0CisgICAgICBlbmQKKyAgICAgIGlmIChjaF92YWx1ZSA+PSAweDMwKQorICAgICAgICBpZiAoY2ggPT0gQEBrSlNPTkJhY2tzbGFzaCkgIyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCisgICAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkJhY2tzbGFzaCkKKyAgICAgICAgICB0cmFucy53cml0ZShAQGtKU09OQmFja3NsYXNoKQorICAgICAgICBlbHNlCisgICAgICAgICAgdHJhbnMud3JpdGUoY2gpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBvdXRDaCA9IGtKU09OQ2hhclRhYmxlW2NoX3ZhbHVlXTsKKyAgICAgICAgIyBDaGVjayBpZiByZWd1bGFyIGNoYXJhY3RlciwgYmFja3NsYXNoIGVzY2FwZWQsIG9yIEpTT04gZXNjYXBlZAorICAgICAgICBpZiBvdXRDaC5raW5kX29mPyBTdHJpbmcKKyAgICAgICAgICB0cmFucy53cml0ZShAQGtKU09OQmFja3NsYXNoKQorICAgICAgICAgIHRyYW5zLndyaXRlKG91dENoKQorICAgICAgICBlbHNpZiBvdXRDaCA9PSAxCisgICAgICAgICAgdHJhbnMud3JpdGUoY2gpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZV9qc29uX2VzY2FwZV9jaGFyKGNoKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCisgICAgZGVmIHdyaXRlX2pzb25fc3RyaW5nKHN0cikKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIHN0ci5zcGxpdCgnJykuZWFjaCBkbyB8Y2h8CisgICAgICAgIHdyaXRlX2pzb25fY2hhcihjaCkKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICBlbmQKKworICAgICMgV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKKyAgICAjIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCisgICAgZGVmIHdyaXRlX2pzb25fYmFzZTY0KHN0cikKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIHRyYW5zLndyaXRlKEJhc2U2NC5zdHJpY3RfZW5jb2RlNjQoc3RyKSkKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZworICAgICMgaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCisgICAgZGVmIHdyaXRlX2pzb25faW50ZWdlcihudW0pCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIGVzY2FwZU51bSA9IEBjb250ZXh0LmVzY2FwZU51bQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUobnVtLnRvX3MpOworICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCisgICAgIyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgorICAgIGRlZiB3cml0ZV9qc29uX2RvdWJsZShudW0pCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiB0aHJpZnQ6OnRvX3N0cmluZyBmb3IgTmFOcyBhbmQgSW5maW5pdGllcworICAgICAgc3BlY2lhbCA9IGZhbHNlOworICAgICAgaWYgKG51bS5uYW4/KQorICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgdmFsID0gQEBrVGhyaWZ0TmFuOworICAgICAgZWxzaWYgKG51bS5pbmZpbml0ZT8pCisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICB2YWwgPSBAQGtUaHJpZnRJbmZpbml0eTsKKyAgICAgICAgaWYgKG51bSA8IDAuMCkKKyAgICAgICAgICB2YWwgPSBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OworICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgdmFsID0gbnVtLnRvX3MKKyAgICAgIGVuZAorCisgICAgICBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IEBjb250ZXh0LmVzY2FwZU51bQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUodmFsKQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05PYmplY3RTdGFydCkKKyAgICAgIHB1c2hfY29udGV4dChKU09OUGFpckNvbnRleHQubmV3KTsKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9qc29uX29iamVjdF9lbmQKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICB0cmFucy53cml0ZShAQGtKU09OT2JqZWN0RW5kKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkFycmF5U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTkxpc3RDb250ZXh0Lm5ldyk7CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICB0cmFucy53cml0ZShAQGtKU09OQXJyYXlFbmQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihAQGtUaHJpZnRWZXJzaW9uMSkKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKG5hbWUpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIodHlwZSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzZXFpZCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RydWN0X2VuZAorICAgICAgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaWQpCisgICAgICB3cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZCh0eXBlKSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9lbmQKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX3N0b3A7IG5pbDsgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoa3R5cGUpKQorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZCh2dHlwZSkpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2VuZAorICAgICAgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKGV0eXBlKSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoZXR5cGUpKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ib29sKGJvb2wpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoYm9vbCA/IDEgOiAwKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2J5dGUoYnl0ZSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihieXRlKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kxNihpMTYpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTE2KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kzMihpMzIpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTMyKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2k2NChpNjQpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTY0KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2RvdWJsZShkdWIpCisgICAgICB3cml0ZV9qc29uX2RvdWJsZShkdWIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKHN0cikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoc3RyKQorICAgICAgd3JpdGVfanNvbl9iYXNlNjQoc3RyKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJlYWRpbmcgZnVuY3Rpb25zCisgICAgIyMKKworICAgICMgUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCisgICAgZGVmIHJlYWRfanNvbl9zeW50YXhfY2hhcihjaCkKKyAgICAgIEpzb25Qcm90b2NvbDo6cmVhZF9zeW50YXhfY2hhcihAcmVhZGVyLCBjaCkKKyAgICBlbmQKKworICAgICMgRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucworICAgICMgdGhlIGNoYXJhY3RlciB2aWEgb3V0LgorICAgICMKKyAgICAjIE5vdGUgLSB0aGlzIG9ubHkgc3VwcG9ydHMgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSBCTVAgKFUrMDAwMCB0byBVK0ZGRkYpOworICAgICMgY2hhcmFjdGVycyBhYm92ZSB0aGUgQk1QIGFyZSBlbmNvZGVkIGFzIHR3byBlc2NhcGUgc2VxdWVuY2VzIChzdXJyb2dhdGUgcGFpcnMpLAorICAgICMgd2hpY2ggaXMgbm90IHlldCBpbXBsZW1lbnRlZAorICAgIGRlZiByZWFkX2pzb25fZXNjYXBlX2NoYXIKKyAgICAgIHN0ciA9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgICAgIHN0ci5oZXguY2hyKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyLmhleC5jaHIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKKyAgICBkZWYgcmVhZF9qc29uX3N0cmluZyhza2lwQ29udGV4dCA9IGZhbHNlKQorICAgICAgIyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBlc2NhcGVfY2hhcl92YWxzLgorICAgICAgIyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorICAgICAgIyBpdCBpcyBub3QgaW4gdGhlIFJGQyAtPiBpdCBpcy4gU2VlIFJGQyA0NjI3CisgICAgICBlc2NhcGVfY2hhcnMgPSAiXCJcXC9iZm5ydCIKKworICAgICAgIyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKyAgICAgICMgZXNjYXBlX2NoYXJzCisgICAgICBlc2NhcGVfY2hhcl92YWxzID0gWworICAgICAgICAiXCIiLCAiXFwiLCAiXC8iLCAiXGIiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICAgXQorCisgICAgICBpZiAhc2tpcENvbnRleHQKKyAgICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgZW5kCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGNoID0gIiIKKyAgICAgIHN0ciA9ICIiCisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgY2ggPSBAcmVhZGVyLnJlYWQKKyAgICAgICAgaWYgKGNoID09IEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZW5kCisgICAgICAgIGlmIChjaCA9PSBAQGtKU09OQmFja3NsYXNoKQorICAgICAgICAgIGNoID0gQHJlYWRlci5yZWFkCisgICAgICAgICAgaWYgKGNoID09ICd1JykKKyAgICAgICAgICAgIGNoID0gcmVhZF9qc29uX2VzY2FwZV9jaGFyCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9zID0gZXNjYXBlX2NoYXJzLmluZGV4KGNoKTsKKyAgICAgICAgICAgIGlmIChwb3MubmlsPykgIyBub3QgZm91bmQKKyAgICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCBcJyN7Y2h9XCcuIikKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgY2ggPSBlc2NhcGVfY2hhcl92YWxzW3Bvc10KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciArPSBjaAorICAgICAgZW5kCisgICAgICByZXR1cm4gc3RyCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCisgICAgZGVmIHJlYWRfanNvbl9iYXNlNjQKKyAgICAgIHN0ciA9IHJlYWRfanNvbl9zdHJpbmcKKyAgICAgIG0gPSBzdHIubGVuZ3RoICUgNAorICAgICAgaWYgbSAhPSAwCisgICAgICAgICMgQWRkIG1pc3NpbmcgcGFkZGluZworICAgICAgICAoNCAtIG0pLnRpbWVzIGRvCisgICAgICAgICAgc3RyICs9ICc9JworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgQmFzZTY0LnN0cmljdF9kZWNvZGU2NChzdHIpCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorICAgICMgYSB2YWxpZCBKU09OIG51bWVyaWMgY2hhcmFjdGVyLgorICAgIGRlZiByZWFkX2pzb25fbnVtZXJpY19jaGFycworICAgICAgc3RyID0gIiIKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICBjaCA9IEByZWFkZXIucGVlaworICAgICAgICBpZiAoIWlzX2pzb25fbnVtZXJpYyhjaCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVuZAorICAgICAgICBjaCA9IEByZWFkZXIucmVhZAorICAgICAgICBzdHIgKz0gY2gKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHN0cgorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCisgICAgIyByZXR1cm5pbmcgdGhlbSB2aWEgbnVtCisgICAgZGVmIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICBpZiAoQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgc3RyID0gcmVhZF9qc29uX251bWVyaWNfY2hhcnMKKworICAgICAgYmVnaW4KKyAgICAgICAgbnVtID0gSW50ZWdlcihzdHIpOworICAgICAgcmVzY3VlCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiI3tzdHJ9XCIiKQorICAgICAgZW5kCisKKyAgICAgIGlmIChAY29udGV4dC5lc2NhcGVOdW0pCisgICAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBudW0KKyAgICBlbmQKKworICAgICMgUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCisgICAgZGVmIHJlYWRfanNvbl9kb3VibGUKKyAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIG51bSA9IDAKKyAgICAgIGlmIChAcmVhZGVyLnBlZWsgPT0gQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgICAgc3RyID0gcmVhZF9qc29uX3N0cmluZyh0cnVlKQorICAgICAgICAjIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKKyAgICAgICAgaWYgKHN0ciA9PSBAQGtUaHJpZnROYW4pCisgICAgICAgICAgbnVtID0gKCsxLjAvMC4wKS8oKzEuMC8wLjApCisgICAgICAgIGVsc2lmIChzdHIgPT0gQEBrVGhyaWZ0SW5maW5pdHkpCisgICAgICAgICAgbnVtID0gKzEuMC8wLjAKKyAgICAgICAgZWxzaWYgKHN0ciA9PSBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KQorICAgICAgICAgIG51bSA9IC0xLjAvMC4wCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAoIUBjb250ZXh0LmVzY2FwZU51bSkKKyAgICAgICAgICAgICMgUmFpc2UgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgbnVtID0gRmxvYXQoc3RyKQorICAgICAgICAgIHJlc2N1ZQorICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIje3N0cn1cIiIpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBpZiAoQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICAgICMgVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9IHJlYWRfanNvbl9udW1lcmljX2NoYXJzCisgICAgICAgIGJlZ2luCisgICAgICAgICAgbnVtID0gRmxvYXQoc3RyKQorICAgICAgICByZXNjdWUKKyAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiN7c3RyfVwiIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHJldHVybiBudW0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTk9iamVjdFN0YXJ0KQorICAgICAgcHVzaF9jb250ZXh0KEpTT05QYWlyQ29udGV4dC5uZXcpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fb2JqZWN0X2VuZAorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05PYmplY3RFbmQpCisgICAgICBwb3BfY29udGV4dAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTkFycmF5U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTkxpc3RDb250ZXh0Lm5ldykKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OQXJyYXlFbmQpCisgICAgICBwb3BfY29udGV4dAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHZlcnNpb24gPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgaWYgKHZlcnNpb24gIT0gQEBrVGhyaWZ0VmVyc2lvbjEpCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKQorICAgICAgZW5kCisgICAgICBuYW1lID0gcmVhZF9qc29uX3N0cmluZworICAgICAgbWVzc2FnZV90eXBlID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIHNlcWlkID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIFtuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9lbmQKKyAgICAgIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2JlZ2luCisgICAgICByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2JlZ2luCisgICAgICAjIENoZWNrIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICBjaCA9IEByZWFkZXIucGVlaworICAgICAgaWYgKGNoID09IEBAa0pTT05PYmplY3RFbmQpCisgICAgICAgIGZpZWxkX3R5cGUgPSBUeXBlczo6U1RPUAorICAgICAgZWxzZQorICAgICAgICBmaWVsZF9pZCA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICAgIHJlYWRfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgICAgZmllbGRfdHlwZSA9IGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZykKKyAgICAgIGVuZAorICAgICAgW25pbCwgZmllbGRfdHlwZSwgZmllbGRfaWRdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAga2V5X3R5cGUgPSBnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpCisgICAgICB2YWxfdHlwZSA9IGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZykKKyAgICAgIHNpemUgPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgcmVhZF9qc29uX29iamVjdF9zdGFydAorICAgICAgW2tleV90eXBlLCB2YWxfdHlwZSwgc2l6ZV0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9saXN0X2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIFtnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpLCByZWFkX2pzb25faW50ZWdlcl0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAgW2dldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZyksIHJlYWRfanNvbl9pbnRlZ2VyXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2VuZAorICAgICAgcmVhZF9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYm9vbAorICAgICAgYnl0ZSA9IHJlYWRfYnl0ZQorICAgICAgYnl0ZSAhPSAwCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTE2CisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTMyCisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTY0CisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZG91YmxlCisgICAgICByZWFkX2pzb25fZG91YmxlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIHJlYWRfanNvbl9zdHJpbmcKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgcmVhZF9qc29uX2Jhc2U2NAorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBKc29uUHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQorICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCisgICAgICByZXR1cm4gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zKQorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQyOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKQEAgLTAsMCArMSw0NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgTXVsdGlwbGV4ZWRQcm90b2NvbCA8IEJhc2VQcm90b2NvbAorCisgICAgaW5jbHVkZSBQcm90b2NvbERlY29yYXRvcgorCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIHNlcnZpY2VfbmFtZSkKKyAgICAgIHN1cGVyKHByb3RvY29sKQorICAgICAgQHNlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWQorICAgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigiI3tAc2VydmljZV9uYW1lfToje25hbWV9IiwgdHlwZSwgc2VxaWQpCisgICAgICBlbHNlCisgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgZW5kIAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibXVsdGlwbGV4ZWQoI3tAc2VydmljZV9uYW1lPUBwcm90b2NvbC50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2MxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYgpAQCAtMCwwICsxLDE5NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgbW9kdWxlIFByb3RvY29sRGVjb3JhdG9yCisKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCkKKyAgICAgIEBwcm90b2NvbCA9IHByb3RvY29sCisgICAgZW5kCisKKyAgICBkZWYgdHJhbnMKKyAgICAgIEBwcm90b2NvbC50cmFucworICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIEBwcm90b2NvbC53cml0ZV9maWVsZF9zdG9wCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbGlzdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc2V0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zZXRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYm9vbChib29sKQorICAgICAgQHByb3RvY29sLndyaXRlX2Jvb2woYm9vbCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ieXRlKGJ5dGUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYnl0ZShieXRlKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kxNihpMTYpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTE2KGkxNikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMzIoaTMyKQorICAgICAgQHByb3RvY29sLndyaXRlX2kzMihpMzIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTY0KGk2NCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pNjQoaTY0KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2RvdWJsZShkdWIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfZG91YmxlKGR1YikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQorICAgICAgQHByb3RvY29sLndyaXRlX3N0cmluZyhzdHIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21lc3NhZ2VfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cnVjdF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9tYXBfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21hcF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2xpc3RfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9saXN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9zZXRfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX3NldF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2Jvb2wKKyAgICAgIEBwcm90b2NvbC5yZWFkX2Jvb2wKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIEBwcm90b2NvbC5yZWFkX2J5dGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kxNgorICAgICAgQHByb3RvY29sLnJlYWRfaTE2CisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMzIKKyAgICAgIEBwcm90b2NvbC5yZWFkX2kzMgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTY0CisgICAgICBAcHJvdG9jb2wucmVhZF9pNjQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2RvdWJsZQorICAgICAgQHByb3RvY29sLnJlYWRfZG91YmxlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cmluZworICAgIGVuZAorCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICBAcHJvdG9jb2wucmVhZF9iaW5hcnkKKyAgICBlbmQKKyAgZW5kCitlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKaW5kZXggMWVlMTIxMy4uYWE0ZDA5YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgpAQCAtMjYsNiArMjYsMTIgQEAKICAgICAgIEBwcm90b2NvbF9mYWN0b3J5ID0gcHJvdG9jb2xfZmFjdG9yeSA/IHByb3RvY29sX2ZhY3RvcnkgOiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKICAgICBlbmQKIAotICAgIGRlZiBzZXJ2ZTsgbmlsOyBlbmQKKyAgICBkZWYgc2VydmUKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAic2VydmVyKCN7QHByb3RvY29sX2ZhY3RvcnkudG9fc30oI3tAdHJhbnNwb3J0X2ZhY3RvcnkudG9fc30oI3tAc2VydmVyX3RyYW5zcG9ydC50b19zfSkpKSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKaW5kZXggODRlYWNmMC4uZGUzNTRjOCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKQEAgLTIwLDYgKzIwLDcgQEAKIHJlcXVpcmUgJ21vbmdyZWwnCiAKICMjIFN0aWNrcyBhIHNlcnZpY2Ugb24gYSBVUkwsIHVzaW5nIG1vbmdyZWwgdG8gZG8gdGhlIEhUVFAgd29yaworIyA8Yj5ERVBSRUNBVEVEOjwvYj4gUGxlYXNlIHVzZSA8dHQ+VGhyaWZ0OjpUaGluSFRUUFNlcnZlcjwvdHQ+IGluc3RlYWQuCiBtb2R1bGUgVGhyaWZ0CiAgIGNsYXNzIE1vbmdyZWxIVFRQU2VydmVyIDwgQmFzZVNlcnZlcgogICAgIGNsYXNzIEhhbmRsZXIgPCBNb25ncmVsOjpIdHRwSGFuZGxlcgpAQCAtNDMsNiArNDQsNyBAQAogICAgIGVuZAogCiAgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRzPXt9KQorICAgICAgS2VybmVsLndhcm4gIltERVBSRUNBVElPTiBXQVJOSU5HXSBgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcmAgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgYFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXJgIGluc3RlYWQuIgogICAgICAgcG9ydCA9IG9wdHNbOnBvcnRdIHx8IDgwCiAgICAgICBpcCA9IG9wdHNbOmlwXSB8fCAiMC4wLjAuMCIKICAgICAgIHBhdGggPSBvcHRzWzpwYXRoXSB8fCAiIgpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZ19zZXJ2ZXIucmIKaW5kZXggOWUxY2ZlNi4uNzQwZjM0MSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiCkBAIC00NCw3ICs0NCwxMyBAQAogICAgICAgYmVnaW4KICAgICAgICAgbG9vcCBkbwogICAgICAgICAgIGJyZWFrIGlmIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlZD8KLSAgICAgICAgICByZCwgPSBzZWxlY3QoW0BzZXJ2ZXJfdHJhbnNwb3J0XSwgbmlsLCBuaWwsIDAuMSkKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgcmQsID0gc2VsZWN0KFtAc2VydmVyX3RyYW5zcG9ydF0sIG5pbCwgbmlsLCAwLjEpCisgICAgICAgICAgcmVzY3VlIEVycm5vOjpFQkFERiA9PiBlCisgICAgICAgICAgICAjIEluIFJ1YnkgMS45LCBjYWxsaW5nIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlIGluIHNodXRkb3duIHBhdGhzIGNhdXNlcyB0aGUgc2VsZWN0KCkgdG8gcmFpc2UgYW4KKyAgICAgICAgICAgICMgRXJybm86OkVCQURGLiBJZiB0aGlzIGhhcHBlbnMsIGlnbm9yZSBpdCBhbmQgcmV0cnkgdGhlIGxvb3AuCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAogICAgICAgICAgIG5leHQgaWYgcmQubmlsPwogICAgICAgICAgIHNvY2tldCA9IEBzZXJ2ZXJfdHJhbnNwb3J0LmFjY2VwdAogICAgICAgICAgIEBsb2dnZXIuZGVidWcgIkFjY2VwdGVkIHNvY2tldDogI3tzb2NrZXQuaW5zcGVjdH0iCkBAIC0xNDYsMTAgKzE1MiwxNCBAQAogICAgICAgICAgICAgYnJlYWsgaWYgcmVhZF9zaWduYWxzID09IDpzaHV0ZG93bgogICAgICAgICAgIGVuZAogICAgICAgICAgIHJkLmVhY2ggZG8gfGZkfAotICAgICAgICAgICAgaWYgZmQuaGFuZGxlLmVvZj8KKyAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgIGlmIGZkLmhhbmRsZS5lb2Y/CisgICAgICAgICAgICAgICAgcmVtb3ZlX2Nvbm5lY3Rpb24gZmQKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlYWRfY29ubmVjdGlvbiBmZAorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUNPTk5SRVNFVAogICAgICAgICAgICAgICByZW1vdmVfY29ubmVjdGlvbiBmZAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICByZWFkX2Nvbm5lY3Rpb24gZmQKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKQEAgLTI5Miw0ICszMDIsNCBAQAogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCmluZGV4IDIxZTg2NTkuLjkwNWZlOWIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCkBAIC0zOSw1ICszOSw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNpbXBsZSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RoaW5faHR0cF9zZXJ2ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4MWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyLnJiCkBAIC0wLDAgKzEsOTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdyYWNrJworcmVxdWlyZSAndGhpbicKKworIyMKKyMgV3JhcHMgdGhlIFRoaW4gd2ViIHNlcnZlciB0byBwcm92aWRlIGEgVGhyaWZ0IHNlcnZlciBvdmVyIEhUVFAuCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIFRoaW5IVFRQU2VydmVyIDwgQmFzZVNlcnZlcgorCisgICAgIyMKKyAgICAjIEFjY2VwdHMgYSBUaHJpZnQ6OlByb2Nlc3NvcgorICAgICMgT3B0aW9ucyBpbmNsdWRlOgorICAgICMgKiA6cG9ydAorICAgICMgKiA6aXAKKyAgICAjICogOnBhdGgKKyAgICAjICogOnByb3RvY29sX2ZhY3RvcnkKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm9jZXNzb3IsIG9wdGlvbnM9e30pCisgICAgICBwb3J0ID0gb3B0aW9uc1s6cG9ydF0gfHwgODAKKyAgICAgIGlwID0gb3B0aW9uc1s6aXBdIHx8ICIwLjAuMC4wIgorICAgICAgcGF0aCA9IG9wdGlvbnNbOnBhdGhdIHx8ICIvIgorICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IG9wdGlvbnNbOnByb3RvY29sX2ZhY3RvcnldIHx8IEJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKKyAgICAgIGFwcCA9IFJhY2tBcHBsaWNhdGlvbi5mb3IocGF0aCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgQHNlcnZlciA9IFRoaW46OlNlcnZlci5uZXcoaXAsIHBvcnQsIGFwcCkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBTdGFydHMgdGhlIHNlcnZlcgorICAgIGRlZiBzZXJ2ZQorICAgICAgQHNlcnZlci5zdGFydAorICAgIGVuZAorCisgICAgY2xhc3MgUmFja0FwcGxpY2F0aW9uCisKKyAgICAgIFRIUklGVF9IRUFERVIgPSAiYXBwbGljYXRpb24veC10aHJpZnQiCisKKyAgICAgIGRlZiBzZWxmLmZvcihwYXRoLCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICAgIFJhY2s6OkJ1aWxkZXIubmV3IGRvCisgICAgICAgICAgdXNlIFJhY2s6OkNvbW1vbkxvZ2dlcgorICAgICAgICAgIHVzZSBSYWNrOjpTaG93RXhjZXB0aW9ucworICAgICAgICAgIHVzZSBSYWNrOjpMaW50CisgICAgICAgICAgbWFwIHBhdGggZG8KKyAgICAgICAgICAgIHJ1biBsYW1iZGEgeyB8ZW52fAorICAgICAgICAgICAgICByZXF1ZXN0ID0gUmFjazo6UmVxdWVzdC5uZXcoZW52KQorICAgICAgICAgICAgICBpZiBSYWNrQXBwbGljYXRpb24udmFsaWRfdGhyaWZ0X3JlcXVlc3Q/KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgUmFja0FwcGxpY2F0aW9uLnN1Y2Nlc3NmdWxfcmVxdWVzdChyZXF1ZXN0LCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSYWNrQXBwbGljYXRpb24uZmFpbGVkX3JlcXVlc3QKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnN1Y2Nlc3NmdWxfcmVxdWVzdChyYWNrX3JlcXVlc3QsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgICAgcmVzcG9uc2UgPSBSYWNrOjpSZXNwb25zZS5uZXcoW10sIDIwMCwgeydDb250ZW50LVR5cGUnID0+IFRIUklGVF9IRUFERVJ9KQorICAgICAgICB0cmFuc3BvcnQgPSBJT1N0cmVhbVRyYW5zcG9ydC5uZXcgcmFja19yZXF1ZXN0LmJvZHksIHJlc3BvbnNlCisgICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRfcHJvdG9jb2wgdHJhbnNwb3J0CisgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzIHByb3RvY29sLCBwcm90b2NvbAorICAgICAgICByZXNwb25zZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmZhaWxlZF9yZXF1ZXN0CisgICAgICAgIFJhY2s6OlJlc3BvbnNlLm5ldyhbJ05vdCBGb3VuZCddLCA0MDQsIHsnQ29udGVudC1UeXBlJyA9PiBUSFJJRlRfSEVBREVSfSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi52YWxpZF90aHJpZnRfcmVxdWVzdD8ocmFja19yZXF1ZXN0KQorICAgICAgICByYWNrX3JlcXVlc3QucG9zdD8gJiYgcmFja19yZXF1ZXN0LmVudlsiQ09OVEVOVF9UWVBFIl0gPT0gVEhSSUZUX0hFQURFUgorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKaW5kZXggOGNlYzgwNS4uYmI3NTRhZCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCkBAIC03MSw1ICs3MSw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZHBvb2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgppbmRleCBhMmM5MTdjLi44OGVlMTgzIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKQEAgLTQzLDUgKzQzLDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAidGhyZWFkZWQoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIKaW5kZXggOWVlNjkxMi4uZGY5ZDY1NiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYgpAQCAtMjEsNyArMjEsNyBAQAogCiBtb2R1bGUgVGhyaWZ0CiAgIG1vZHVsZSBTdHJ1Y3QKLSAgICBkZWYgaW5pdGlhbGl6ZShkPXt9KQorICAgIGRlZiBpbml0aWFsaXplKGQ9e30sICZibG9jaykKICAgICAgICMgZ2V0IGEgY29weSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMgdG8gd29yayBvbiwgcmVtb3ZpbmcgZGVmYXVsdHMgaW4gZmF2b3Igb2YgYXJndW1lbnRzCiAgICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0cyA9IGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzLmR1cAogICAgICAgCkBAIC01MCwxMCArNTAsMTIgQEAKICAgICAgICAgICBpbnN0YW5jZV92YXJpYWJsZV9zZXQoIkAje25hbWV9IiwgKGRlZmF1bHRfdmFsdWUuZHVwIHJlc2N1ZSBkZWZhdWx0X3ZhbHVlKSkKICAgICAgICAgZW5kCiAgICAgICBlbmQKKyAgICAgIAorICAgICAgeWllbGQgc2VsZiBpZiBibG9ja19naXZlbj8KICAgICBlbmQKIAogICAgIGRlZiBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcwotICAgICAgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzIikKKyAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzID0gc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcykKICAgICAgIHVubGVzcyBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcwogICAgICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcyA9IHt9CiAgICAgICAgIHN0cnVjdF9maWVsZHMuZWFjaCBkbyB8ZmlkLCBmaWVsZF9kZWZ8CkBAIC02MSw3ICs2Myw3IEBACiAgICAgICAgICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlc1tmaWVsZF9kZWZbOm5hbWVdXSA9IGZpZWxkX2RlZls6ZGVmYXVsdF0KICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCi0gICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCJAZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMiLCBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcykKKyAgICAgICAgc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcywgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMpCiAgICAgICBlbmQKICAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzCiAgICAgZW5kCkBAIC0xMDMsNyArMTA1LDcgQEAKICAgICAgICAgICAgIHdyaXRlX2NvbnRhaW5lcihvcHJvdCwgdmFsdWUsIGZpZWxkX2luZm8pCiAgICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZF9lbmQKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVfZmllbGQoZmllbGRfaW5mbywgZmlkLCB2YWx1ZSkKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKQEAgLTExMiw5ICsxMTQsMTAgQEAKICAgICBlbmQKIAogICAgIGRlZiA9PShvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZSBpZiBvdGhlci5uaWw/CiAgICAgICBlYWNoX2ZpZWxkIGRvIHxmaWQsIGZpZWxkX2luZm98CiAgICAgICAgIG5hbWUgPSBmaWVsZF9pbmZvWzpuYW1lXQotICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHNlbGYuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCJAI3tuYW1lfSIpID09IG90aGVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQCN7bmFtZX0iKQorICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIG90aGVyLnJlc3BvbmRfdG8/KG5hbWUpICYmIHNlbGYuc2VuZChuYW1lKSA9PSBvdGhlci5zZW5kKG5hbWUpCiAgICAgICBlbmQKICAgICAgIHRydWUKICAgICBlbmQKQEAgLTEyMywxMyArMTI2LDE1IEBACiAgICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHNlbGYgPT0gb3RoZXIKICAgICBlbmQKIAorICAgICMgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoKCkgaXMgaW5zcGlyZWQgYnkgQXBhY2hlJ3MgSmF2YSBIYXNoQ29kZUJ1aWxkZXIgY2xhc3MuCiAgICAgZGVmIGhhc2gKLSAgICAgIGZpZWxkX3ZhbHVlcyA9IFtdCisgICAgICB0b3RhbCA9IDE3CiAgICAgICBlYWNoX2ZpZWxkIGRvIHxmaWQsIGZpZWxkX2luZm98CiAgICAgICAgIG5hbWUgPSBmaWVsZF9pbmZvWzpuYW1lXQotICAgICAgICBmaWVsZF92YWx1ZXMgPDwgc2VsZi5pbnN0YW5jZV92YXJpYWJsZV9nZXQoIkAje25hbWV9IikKKyAgICAgICAgdmFsdWUgPSBzZWxmLnNlbmQobmFtZSkKKyAgICAgICAgdG90YWwgPSAodG90YWwgKiAzNyArIHZhbHVlLmhhc2gpICYgMHhmZmZmZmZmZgogICAgICAgZW5kCi0gICAgICBmaWVsZF92YWx1ZXMuaGFzaAorICAgICAgdG90YWwKICAgICBlbmQKIAogICAgIGRlZiBkaWZmZXJlbmNlcyhvdGhlcikKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYgppbmRleCA5YmZiZWQ1Li5lMjFiMzllIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCkBAIC0yMSwxOSArMjEsMjggQEAKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFN0cnVjdF9VbmlvbgogICAgIGRlZiBuYW1lX3RvX2lkKG5hbWUpCi0gICAgICBuYW1lc190b19pZHMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQG5hbWVzX3RvX2lkcyIpCisgICAgICBuYW1lc190b19pZHMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG5hbWVzX3RvX2lkcykKICAgICAgIHVubGVzcyBuYW1lc190b19pZHMKICAgICAgICAgbmFtZXNfdG9faWRzID0ge30KICAgICAgICAgc3RydWN0X2ZpZWxkcy5lYWNoIGRvIHxmaWQsIGZpZWxkX2RlZnwKICAgICAgICAgICBuYW1lc190b19pZHNbZmllbGRfZGVmWzpuYW1lXV0gPSBmaWQKICAgICAgICAgZW5kCi0gICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCJAbmFtZXNfdG9faWRzIiwgbmFtZXNfdG9faWRzKQorICAgICAgICBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QG5hbWVzX3RvX2lkcywgbmFtZXNfdG9faWRzKQogICAgICAgZW5kCiAgICAgICBuYW1lc190b19pZHNbbmFtZV0KICAgICBlbmQKIAorICAgIGRlZiBzb3J0ZWRfZmllbGRfaWRzCisgICAgICBzb3J0ZWRfZmllbGRfaWRzID0gc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBzb3J0ZWRfZmllbGRfaWRzKQorICAgICAgdW5sZXNzIHNvcnRlZF9maWVsZF9pZHMKKyAgICAgICAgc29ydGVkX2ZpZWxkX2lkcyA9IHN0cnVjdF9maWVsZHMua2V5cy5zb3J0CisgICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAc29ydGVkX2ZpZWxkX2lkcywgc29ydGVkX2ZpZWxkX2lkcykKKyAgICAgIGVuZAorICAgICAgc29ydGVkX2ZpZWxkX2lkcworICAgIGVuZAorCiAgICAgZGVmIGVhY2hfZmllbGQKLSAgICAgIHN0cnVjdF9maWVsZHMua2V5cy5zb3J0LmVhY2ggZG8gfGZpZHwKKyAgICAgIHNvcnRlZF9maWVsZF9pZHMuZWFjaCBkbyB8ZmlkfAogICAgICAgICBkYXRhID0gc3RydWN0X2ZpZWxkc1tmaWRdCiAgICAgICAgIHlpZWxkIGZpZCwgZGF0YQogICAgICAgZW5kCkBAIC00NiwyOSArNTUsNTMgQEAKICAgICAgICAgdmFsdWUucmVhZChpcHJvdCkKICAgICAgIHdoZW4gVHlwZXM6Ok1BUAogICAgICAgICBrZXlfdHlwZSwgdmFsX3R5cGUsIHNpemUgPSBpcHJvdC5yZWFkX21hcF9iZWdpbgotICAgICAgICB2YWx1ZSA9IHt9Ci0gICAgICAgIHNpemUudGltZXMgZG8KLSAgICAgICAgICBrID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6a2V5XSkpCi0gICAgICAgICAgdiA9IHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOnZhbHVlXSkpCi0gICAgICAgICAgdmFsdWVba10gPSB2CisgICAgICAgICMgU2tpcCB0aGUgbWFwIGNvbnRlbnRzIGlmIHRoZSBkZWNsYXJlZCBrZXkgb3IgdmFsdWUgdHlwZXMgZG9uJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZXMuCisgICAgICAgIGlmIChzaXplICE9IDAgJiYgKGtleV90eXBlICE9IGZpZWxkWzprZXldWzp0eXBlXSB8fCB2YWxfdHlwZSAhPSBmaWVsZFs6dmFsdWVdWzp0eXBlXSkpCisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgaXByb3Quc2tpcChrZXlfdHlwZSkKKyAgICAgICAgICAgIGlwcm90LnNraXAodmFsX3R5cGUpCisgICAgICAgICAgZW5kCisgICAgICAgICAgdmFsdWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlID0ge30KKyAgICAgICAgICBzaXplLnRpbWVzIGRvCisgICAgICAgICAgICBrID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6a2V5XSkpCisgICAgICAgICAgICB2ID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6dmFsdWVdKSkKKyAgICAgICAgICAgIHZhbHVlW2tdID0gdgorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgICAgaXByb3QucmVhZF9tYXBfZW5kCiAgICAgICB3aGVuIFR5cGVzOjpMSVNUCiAgICAgICAgIGVfdHlwZSwgc2l6ZSA9IGlwcm90LnJlYWRfbGlzdF9iZWdpbgotICAgICAgICB2YWx1ZSA9IEFycmF5Lm5ldyhzaXplKSBkbyB8bnwKLSAgICAgICAgICByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzplbGVtZW50XSkpCisgICAgICAgICMgU2tpcCB0aGUgbGlzdCBjb250ZW50cyBpZiB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZS4KKyAgICAgICAgaWYgKGVfdHlwZSAhPSBmaWVsZFs6ZWxlbWVudF1bOnR5cGVdKQorICAgICAgICAgIHNpemUudGltZXMgZG8KKyAgICAgICAgICAgIGlwcm90LnNraXAoZV90eXBlKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHZhbHVlID0gbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICB2YWx1ZSA9IEFycmF5Lm5ldyhzaXplKSBkbyB8bnwKKyAgICAgICAgICAgIHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICAgIGlwcm90LnJlYWRfbGlzdF9lbmQKICAgICAgIHdoZW4gVHlwZXM6OlNFVAogICAgICAgICBlX3R5cGUsIHNpemUgPSBpcHJvdC5yZWFkX3NldF9iZWdpbgotICAgICAgICB2YWx1ZSA9IFNldC5uZXcKLSAgICAgICAgc2l6ZS50aW1lcyBkbwotICAgICAgICAgIGVsZW1lbnQgPSByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzplbGVtZW50XSkpCi0gICAgICAgICAgdmFsdWUgPDwgZWxlbWVudAorICAgICAgICAjIFNraXAgdGhlIHNldCBjb250ZW50cyBpZiB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZS4KKyAgICAgICAgaWYgKGVfdHlwZSAhPSBmaWVsZFs6ZWxlbWVudF1bOnR5cGVdKQorICAgICAgICAgIHNpemUudGltZXMgZG8KKyAgICAgICAgICAgIGlwcm90LnNraXAoZV90eXBlKQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgdmFsdWUgPSBTZXQubmV3CisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgZWxlbWVudCA9IHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKKyAgICAgICAgICAgIHZhbHVlIDw8IGVsZW1lbnQKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICAgIGlwcm90LnJlYWRfc2V0X2VuZAogICAgICAgZWxzZQotICAgICAgICB2YWx1ZSA9IGlwcm90LnJlYWRfdHlwZShmaWVsZFs6dHlwZV0pCisgICAgICAgIHZhbHVlID0gaXByb3QucmVhZF90eXBlKGZpZWxkKQogICAgICAgZW5kCiAgICAgICB2YWx1ZQogICAgIGVuZApAQCAtNzcsNyArMTEwLDcgQEAKICAgICAgIGlmIGlzX2NvbnRhaW5lcj8gZmllbGRbOnR5cGVdCiAgICAgICAgIHdyaXRlX2NvbnRhaW5lcihvcHJvdCwgdmFsdWUsIGZpZWxkKQogICAgICAgZWxzZQotICAgICAgICBvcHJvdC53cml0ZV90eXBlKGZpZWxkWzp0eXBlXSwgdmFsdWUpCisgICAgICAgIG9wcm90LndyaXRlX3R5cGUoZmllbGQsIHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCmluZGV4IDY4YzVhZjAuLjAxMDU0NjMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgpAQCAtMzQsNCArMzQsNCBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCmluZGV4IDA4YTcxZGEuLjk3ZTU5MzUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKQEAgLTM0LDYgKzM0LDE4IEBACiAgICAgZW5kCiAgIGVuZAogCisgIG1vZHVsZSBUcmFuc3BvcnRVdGlscworICAgICMgRGVwcmVjYXRlZDogVXNlIFRocmlmdDo6Qnl0ZXMgaW5zdGVhZAorICAgIGRlZiBzZWxmLmdldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4KQorICAgICAgQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgZW5kCisKKyAgICAjIERlcHJlY2F0ZWQ6IFVzZSBUaHJpZnQ6OkJ5dGVzIGluc3RlYWQKKyAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKKyAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgIGVuZAorICBlbmQKKwogICBjbGFzcyBCYXNlVHJhbnNwb3J0CiAgICAgZGVmIG9wZW4/OyBlbmQKICAgICAKQEAgLTQxLDEzICs1MywzNSBAQAogCiAgICAgZGVmIGNsb3NlOyBlbmQKIAorICAgICMgUmVhZHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0cy4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHJldHVybmVkIHdpbGwgaGF2ZSBhIEJJTkFSWSAoYWthIEFTQ0lJOEJJVCkgZW5jb2RpbmcuCisgICAgIworICAgICMgc3ogLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0LgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgYWN0aW5nIGFzIGEgYnl0ZSBidWZmZXIuCiAgICAgZGVmIHJlYWQoc3opCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFJldHVybnMgYW4gdW5zaWduZWQgYnl0ZSBhcyBhIEZpeG51bSBpbiB0aGUgcmFuZ2UgKDAuLjI1NSkuCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgYnVmID0gcmVhZF9hbGwoMSkKKyAgICAgIHJldHVybiBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoYnVmLCAwKQorICAgIGVuZAorCisgICAgIyBSZWFkcyBzaXplIGJ5dGVzIGFuZCBjb3BpZXMgdGhlbSBpbnRvIGJ1ZmZlclswLi5zaXplXS4KKyAgICBkZWYgcmVhZF9pbnRvX2J1ZmZlcihidWZmZXIsIHNpemUpCisgICAgICB0bXAgPSByZWFkX2FsbChzaXplKQorICAgICAgaSA9IDAKKyAgICAgIHRtcC5lYWNoX2J5dGUgZG8gfGJ5dGV8CisgICAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIGkgKz0gMQorICAgICAgZW5kCisgICAgICBpCisgICAgZW5kCisKICAgICBkZWYgcmVhZF9hbGwoc2l6ZSkKLSAgICAgIGJ1ZiA9ICcnCi0gICAgCisgICAgICByZXR1cm4gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgaWYgc2l6ZSA8PSAwCisgICAgICBidWYgPSByZWFkKHNpemUpCiAgICAgICB3aGlsZSAoYnVmLmxlbmd0aCA8IHNpemUpCiAgICAgICAgIGNodW5rID0gcmVhZChzaXplIC0gYnVmLmxlbmd0aCkKICAgICAgICAgYnVmIDw8IGNodW5rCkBAIC01NSwxNiArODksMjkgQEAKICAgICAKICAgICAgIGJ1ZgogICAgIGVuZAotICAKKworICAgICMgV3JpdGVzIHRoZSBieXRlIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LiBJbiBSdWJ5IDEuOSssIHRoZSBidWZmZXIgd2lsbCBiZSBmb3JjZWQgaW50byBCSU5BUlkgZW5jb2RpbmcuCisgICAgIworICAgICMgYnVmIC0gQSBTdHJpbmcgYWN0aW5nIGFzIGEgYnl0ZSBidWZmZXIuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgogICAgIGRlZiB3cml0ZShidWYpOyBlbmQKICAgICBhbGlhc19tZXRob2QgOjw8LCA6d3JpdGUKIAogICAgIGRlZiBmbHVzaDsgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAogICAKICAgY2xhc3MgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFucykKICAgICAgIHJldHVybiB0cmFucwogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCmluZGV4IDhkZWFkNGUuLjRmZTljNDEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgpAQCAtMjQsOCArMjQsOCBAQAogICAgIAogICAgIGRlZiBpbml0aWFsaXplKHRyYW5zcG9ydCkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKLSAgICAgIEB3YnVmID0gJycKLSAgICAgIEByYnVmID0gJycKKyAgICAgIEB3YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEByYnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIEBpbmRleCA9IDAKICAgICBlbmQKIApAQCAtNDQsMzQgKzQ0LDc5IEBACiAKICAgICBkZWYgcmVhZChzeikKICAgICAgIEBpbmRleCArPSBzegotICAgICAgcmV0ID0gQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCAnJworICAgICAgcmV0ID0gQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogCiAgICAgICBpZiByZXQubGVuZ3RoID09IDAKICAgICAgICAgQHJidWYgPSBAdHJhbnNwb3J0LnJlYWQoW3N6LCBERUZBVUxUX0JVRkZFUl0ubWF4KQogICAgICAgICBAaW5kZXggPSBzegotICAgICAgICByZXQgPSBAcmJ1Zi5zbGljZSgwLCBzeikgfHwgJycKKyAgICAgICAgcmV0ID0gQHJidWYuc2xpY2UoMCwgc3opIHx8IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBlbmQKIAogICAgICAgcmV0CiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICAjIElmIHRoZSByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHRyeSB0byByZWFkIHVwIHRvIERFRkFVTFRfQlVGRkVSIG1vcmUgYnl0ZXMgaW50byBpdC4KKyAgICAgIGlmIEBpbmRleCA+PSBAcmJ1Zi5zaXplCisgICAgICAgIEByYnVmID0gQHRyYW5zcG9ydC5yZWFkKERFRkFVTFRfQlVGRkVSKQorICAgICAgICBAaW5kZXggPSAwCisgICAgICBlbmQKKworICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHJlYWQgYSBzaW5nbGUgYnl0ZS4gVXNpbmcgZ2V0X3N0cmluZ19ieXRlKCkgYXZvaWRzCisgICAgICAjIGFsbG9jYXRpbmcgYSB0ZW1wIHN0cmluZyBvZiBzaXplIDEgdW5uZWNlc3NhcmlseS4KKyAgICAgIEBpbmRleCArPSAxCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQgaW50byB0aGUgYnVmZmVyIHBhc3NlZC4KKyAgICAjCisgICAgIyBidWZmZXIgLSBUaGUgU3RyaW5nIChieXRlIGJ1ZmZlcikgdG8gd3JpdGUgZGF0YSB0bzsgdGhpcyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBCSU5BUlkgZW5jb2RpbmcuCisgICAgIyBzaXplICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFuZCB3cml0ZSB0byB0aGUgYnVmZmVyLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKKyAgICAgIGkgPSAwCisgICAgICB3aGlsZSBpIDwgc2l6ZQorICAgICAgICAjIElmIHRoZSByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHRyeSB0byByZWFkIHVwIHRvIERFRkFVTFRfQlVGRkVSIG1vcmUgYnl0ZXMgaW50byBpdC4KKyAgICAgICAgaWYgQGluZGV4ID49IEByYnVmLnNpemUKKyAgICAgICAgICBAcmJ1ZiA9IEB0cmFuc3BvcnQucmVhZChERUZBVUxUX0JVRkZFUikKKyAgICAgICAgICBAaW5kZXggPSAwCisgICAgICAgIGVuZAorCisgICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCBzbyBjb3B5IGJ5dGVzIG92ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgIGJ5dGUgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCkKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgQGluZGV4ICs9IDEKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKwogICAgIGRlZiB3cml0ZShidWYpCi0gICAgICBAd2J1ZiA8PCBidWYKKyAgICAgIEB3YnVmIDw8IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpCiAgICAgZW5kCiAKICAgICBkZWYgZmx1c2gKLSAgICAgIGlmIEB3YnVmICE9ICcnCisgICAgICB1bmxlc3MgQHdidWYuZW1wdHk/CiAgICAgICAgIEB0cmFuc3BvcnQud3JpdGUoQHdidWYpCi0gICAgICAgIEB3YnVmID0gJycKKyAgICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgZW5kCiAgICAgICAKICAgICAgIEB0cmFuc3BvcnQuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYnVmZmVyZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDwgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgppbmRleCA1NThhZjc0Li45NTMxNzc4IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgpAQCAtMjIsOCArMjIsOCBAQAogICBjbGFzcyBGcmFtZWRUcmFuc3BvcnQgPCBCYXNlVHJhbnNwb3J0CiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0LCByZWFkPXRydWUsIHdyaXRlPXRydWUpCiAgICAgICBAdHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0gICAgICBAcmJ1ZiAgICAgID0gJycKLSAgICAgIEB3YnVmICAgICAgPSAnJworICAgICAgQHJidWYgICAgICA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICBAd2J1ZiAgICAgID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIEByZWFkICAgICAgPSByZWFkCiAgICAgICBAd3JpdGUgICAgID0gd3JpdGUKICAgICAgIEBpbmRleCAgICAgID0gMApAQCAtNDQsMTcgKzQ0LDQzIEBACiAgICAgZGVmIHJlYWQoc3opCiAgICAgICByZXR1cm4gQHRyYW5zcG9ydC5yZWFkKHN6KSB1bmxlc3MgQHJlYWQKIAotICAgICAgcmV0dXJuICcnIGlmIHN6IDw9IDAKKyAgICAgIHJldHVybiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciBpZiBzeiA8PSAwCiAKICAgICAgIHJlYWRfZnJhbWUgaWYgQGluZGV4ID49IEByYnVmLmxlbmd0aAogCiAgICAgICBAaW5kZXggKz0gc3oKLSAgICAgIEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgJycKKyAgICAgIEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZShidWYsc3o9bmlsKQorICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIHJldHVybiBAdHJhbnNwb3J0LnJlYWRfYnl0ZSgpIHVubGVzcyBAcmVhZAorCisgICAgICByZWFkX2ZyYW1lIGlmIEBpbmRleCA+PSBAcmJ1Zi5sZW5ndGgKKworICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHJlYWQgYSBzaW5nbGUgYnl0ZS4gVXNpbmcgZ2V0X3N0cmluZ19ieXRlKCkgYXZvaWRzCisgICAgICAjIGFsbG9jYXRpbmcgYSB0ZW1wIHN0cmluZyBvZiBzaXplIDEgdW5uZWNlc3NhcmlseS4KKyAgICAgIEBpbmRleCArPSAxCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaW50b19idWZmZXIoYnVmZmVyLCBzaXplKQorICAgICAgaSA9IDAKKyAgICAgIHdoaWxlIGkgPCBzaXplCisgICAgICAgIHJlYWRfZnJhbWUgaWYgQGluZGV4ID49IEByYnVmLmxlbmd0aAorCisgICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCBzbyBjb3B5IGJ5dGVzIG92ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgIGJ5dGUgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCkKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgQGluZGV4ICs9IDEKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZShidWYsIHN6PW5pbCkKICAgICAgIHJldHVybiBAdHJhbnNwb3J0LndyaXRlKGJ1ZikgdW5sZXNzIEB3cml0ZQogCisgICAgICBidWYgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKQogICAgICAgQHdidWYgPDwgKHN6ID8gYnVmWzAuLi5zel0gOiBidWYpCiAgICAgZW5kCiAKQEAgLTY2LDEwICs5MiwxNSBAQAogICAgICAgcmV0dXJuIEB0cmFuc3BvcnQuZmx1c2ggdW5sZXNzIEB3cml0ZQogCiAgICAgICBvdXQgPSBbQHdidWYubGVuZ3RoXS5wYWNrKCdOJykKKyAgICAgICMgQXJyYXkjcGFjayBzaG91bGQgcmV0dXJuIGEgQklOQVJZIGVuY29kZWQgU3RyaW5nLCBzbyBpdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHRvIGZvcmNlIGVuY29kaW5nCiAgICAgICBvdXQgPDwgQHdidWYKICAgICAgIEB0cmFuc3BvcnQud3JpdGUob3V0KQogICAgICAgQHRyYW5zcG9ydC5mbHVzaAotICAgICAgQHdidWYgPSAnJworICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKICAgICBlbmQKIAogICAgIHByaXZhdGUKQEAgLTg2LDUgKzExNyw5IEBACiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnNwb3J0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZnJhbWVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKaW5kZXggMjJjYWYwMi4uNWMxZGQ1YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCkBAIC0yMCwyMSArMjAsMjMgQEAKIAogcmVxdWlyZSAnbmV0L2h0dHAnCiByZXF1aXJlICduZXQvaHR0cHMnCityZXF1aXJlICdvcGVuc3NsJwogcmVxdWlyZSAndXJpJwogcmVxdWlyZSAnc3RyaW5naW8nCiAKIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgSFRUUENsaWVudFRyYW5zcG9ydCA8IEJhc2VUcmFuc3BvcnQKIAotICAgIGRlZiBpbml0aWFsaXplKHVybCkKKyAgICBkZWYgaW5pdGlhbGl6ZSh1cmwsIG9wdHMgPSB7fSkKICAgICAgIEB1cmwgPSBVUkkgdXJsCiAgICAgICBAaGVhZGVycyA9IHsnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnfQotICAgICAgQG91dGJ1ZiA9ICIiCisgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEBzc2xfdmVyaWZ5X21vZGUgPSBvcHRzLmZldGNoKDpzc2xfdmVyaWZ5X21vZGUsIE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj87IHRydWUgZW5kCiAgICAgZGVmIHJlYWQoc3opOyBAaW5idWYucmVhZCBzeiBlbmQKLSAgICBkZWYgd3JpdGUoYnVmKTsgQG91dGJ1ZiA8PCBidWYgZW5kCisgICAgZGVmIHdyaXRlKGJ1Zik7IEBvdXRidWYgPDwgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZikgZW5kCiAKICAgICBkZWYgYWRkX2hlYWRlcnMoaGVhZGVycykKICAgICAgIEBoZWFkZXJzID0gQGhlYWRlcnMubWVyZ2UoaGVhZGVycykKQEAgLTQyLDEwICs0NCwxOCBAQAogCiAgICAgZGVmIGZsdXNoCiAgICAgICBodHRwID0gTmV0OjpIVFRQLm5ldyBAdXJsLmhvc3QsIEB1cmwucG9ydAotICAgICAgaHR0cC51c2Vfc3NsID0gQHVybC5zY2hlbWUgPT0gImh0dHBzIgotICAgICAgcmVzcCwgZGF0YSA9IGh0dHAucG9zdChAdXJsLnJlcXVlc3RfdXJpLCBAb3V0YnVmLCBAaGVhZGVycykKKyAgICAgIGh0dHAudXNlX3NzbCA9IEB1cmwuc2NoZW1lID09ICdodHRwcycKKyAgICAgIGh0dHAudmVyaWZ5X21vZGUgPSBAc3NsX3ZlcmlmeV9tb2RlIGlmIEB1cmwuc2NoZW1lID09ICdodHRwcycKKyAgICAgIHJlc3AgPSBodHRwLnBvc3QoQHVybC5yZXF1ZXN0X3VyaSwgQG91dGJ1ZiwgQGhlYWRlcnMpCisgICAgICBkYXRhID0gcmVzcC5ib2R5CisgICAgICBkYXRhID0gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGRhdGEpCiAgICAgICBAaW5idWYgPSBTdHJpbmdJTy5uZXcgZGF0YQotICAgICAgQG91dGJ1ZiA9ICIiCisgICAgZW5zdXJlCisgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIkB7c2VsZi51cmx9IgogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgppbmRleCBiZTM0OGFhLi5jY2VjNjhmIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgpAQCAtMzIsOCArMzIsMTEgQEAKIAogICAgIGRlZiBvcGVuPzsgbm90IEBpbnB1dC5jbG9zZWQ/IG9yIG5vdCBAb3V0cHV0LmNsb3NlZD8gZW5kCiAgICAgZGVmIHJlYWQoc3opOyBAaW5wdXQucmVhZChzeikgZW5kCi0gICAgZGVmIHdyaXRlKGJ1Zik7IEBvdXRwdXQud3JpdGUoYnVmKSBlbmQKKyAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKSkgZW5kCiAgICAgZGVmIGNsb3NlOyBAaW5wdXQuY2xvc2U7IEBvdXRwdXQuY2xvc2UgZW5kCiAgICAgZGVmIHRvX2lvOyBAaW5wdXQgZW5kICMgd2UncmUgYXNzdW1pbmcgdGhpcyBpcyB1c2VkIGluIGEgSU8uc2VsZWN0IGZvciByZWFkaW5nCisgICAgZGVmIHRvX3MKKyAgICAgICJpb3N0cmVhbShpbnB1dD0je0BpbnB1dC50b19zfSxvdXRwdXQ9I3tAb3V0cHV0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgppbmRleCAzMTY5YjJiLi40NjllYTczIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgIyB0aGlzIGJlaGF2aW9yIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIGl0CiAgICAgIyBnbyBhaGVhZCwganVzdCBtYWtlIHN1cmUgdGhlIHNwZWNzIHBhc3MKICAgICBkZWYgaW5pdGlhbGl6ZShidWZmZXIgPSBuaWwpCi0gICAgICBAYnVmID0gYnVmZmVyIHx8ICcnCisgICAgICBAYnVmID0gYnVmZmVyID8gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZmZlcikgOiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgQGluZGV4ID0gMAogICAgIGVuZAogCkBAIC00OCw3ICs0OCw3IEBACiAKICAgICAjIHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZSB0aGUgcGFzc2VkIG9iamVjdCBkaXJlY3RseSBidXQgY29waWVzIGl0CiAgICAgZGVmIHJlc2V0X2J1ZmZlcihuZXdfYnVmID0gJycpCi0gICAgICBAYnVmLnJlcGxhY2UgbmV3X2J1ZgorICAgICAgQGJ1Zi5yZXBsYWNlIEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhuZXdfYnVmKQogICAgICAgQGluZGV4ID0gMAogICAgIGVuZAogCkBAIC03MCw4ICs3MCwzNyBAQAogICAgICAgZGF0YQogICAgIGVuZAogCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgcmFpc2UgRU9GRXJyb3IubmV3KCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiKSBpZiBAaW5kZXggPj0gQGJ1Zi5zaXplCisgICAgICB2YWwgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQGJ1ZiwgQGluZGV4KQorICAgICAgQGluZGV4ICs9IDEKKyAgICAgIGlmIEBpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFCisgICAgICAgIEBidWYgPSBAYnVmLnNsaWNlKEBpbmRleC4uLTEpCisgICAgICAgIEBpbmRleCA9IDAKKyAgICAgIGVuZAorICAgICAgdmFsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pbnRvX2J1ZmZlcihidWZmZXIsIHNpemUpCisgICAgICBpID0gMAorICAgICAgd2hpbGUgaSA8IHNpemUKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IubmV3KCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiKSBpZiBAaW5kZXggPj0gQGJ1Zi5zaXplCisKKyAgICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHNvIGNvcHkgYnl0ZXMgb3ZlciB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAYnVmLCBAaW5kZXgpCisgICAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIEBpbmRleCArPSAxCisgICAgICAgIGkgKz0gMQorICAgICAgZW5kCisgICAgICBpZiBAaW5kZXggPj0gR0FSQkFHRV9CVUZGRVJfU0laRQorICAgICAgICBAYnVmID0gQGJ1Zi5zbGljZShAaW5kZXguLi0xKQorICAgICAgICBAaW5kZXggPSAwCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKwogICAgIGRlZiB3cml0ZSh3YnVmKQotICAgICAgQGJ1ZiA8PCB3YnVmCisgICAgICBAYnVmIDw8IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyh3YnVmKQogICAgIGVuZAogCiAgICAgZGVmIGZsdXNoCkBAIC05Miw1ICsxMjEsOSBAQAogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDA2YzkzN2UuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMzMsMjUgKzMzLDI4IEBACiAgICAgYXR0cl9hY2Nlc3NvciA6aGFuZGxlLCA6dGltZW91dAogCiAgICAgZGVmIG9wZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIGFkZHJpbmZvID0gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCkuZmlyc3QKLSAgICAgICAgQGhhbmRsZSA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQotICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKKyAgICAgIGZvciBhZGRyaW5mbyBpbiA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkgZG8KICAgICAgICAgYmVnaW4KLSAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKLSAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCi0gICAgICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb25uZWN0aW9uIHRpbWVvdXQgdG8gI3tAZGVzY30iKQotICAgICAgICAgIGVuZAorICAgICAgICAgIHNvY2tldCA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICAgIHNvY2tldC5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQorICAgICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQogICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCisgICAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBzb2NrZXQgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIEBoYW5kbGUgPSBzb2NrZXQKKyAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG5leHQKICAgICAgICAgZW5kCi0gICAgICAgIEBoYW5kbGUKLSAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKLSAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgICAgZW5kCisgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj8KQEAgLTYwLDYgKzYzLDcgQEAKIAogICAgIGRlZiB3cml0ZShzdHIpCiAgICAgICByYWlzZSBJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIgdW5sZXNzIG9wZW4/CisgICAgICBzdHIgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2Rpbmcoc3RyKQogICAgICAgYmVnaW4KICAgICAgICAgaWYgQHRpbWVvdXQubmlsPyBvciBAdGltZW91dCA9PSAwCiAgICAgICAgICAgQGhhbmRsZS53cml0ZShzdHIpCkBAIC05NywxMiArMTAxLDEzIEBACiAgICAgICAgICAgZGF0YSA9IEBoYW5kbGUucmVhZHBhcnRpYWwoc3opCiAgICAgICAgIGVsc2UKICAgICAgICAgICAjIGl0J3MgcG9zc2libGUgdG8gaW50ZXJydXB0IHNlbGVjdCBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpbWVvdXQKLSAgICAgICAgICAjIHNvIHdlIG5lZWQgdG8gZW5zdXJlIHdlJ3ZlIHdhaXRlZCBsb25nIGVub3VnaAorICAgICAgICAgICMgc28gd2UgbmVlZCB0byBlbnN1cmUgd2UndmUgd2FpdGVkIGxvbmcgZW5vdWdoLCBidXQgbm90IHRvbyBsb25nCiAgICAgICAgICAgc3RhcnQgPSBUaW1lLm5vdwotICAgICAgICAgIHJkID0gbmlsICMgc2NvcGluZwotICAgICAgICAgIGxvb3AgZG8KLSAgICAgICAgICAgIHJkLCA9IElPLnNlbGVjdChbQGhhbmRsZV0sIG5pbCwgbmlsLCBAdGltZW91dCkKLSAgICAgICAgICAgIGJyZWFrIGlmIChyZCBhbmQgbm90IHJkLmVtcHR5Pykgb3IgVGltZS5ub3cgLSBzdGFydCA+PSBAdGltZW91dAorICAgICAgICAgIHRpbWVzcGVudCA9IDAKKyAgICAgICAgICByZCA9IGxvb3AgZG8KKyAgICAgICAgICAgIHJkLCA9IElPLnNlbGVjdChbQGhhbmRsZV0sIG5pbCwgbmlsLCBAdGltZW91dCAtIHRpbWVzcGVudCkKKyAgICAgICAgICAgIHRpbWVzcGVudCA9IFRpbWUubm93IC0gc3RhcnQKKyAgICAgICAgICAgIGJyZWFrIHJkIGlmIChyZCBhbmQgbm90IHJkLmVtcHR5Pykgb3IgdGltZXNwZW50ID49IEB0aW1lb3V0CiAgICAgICAgICAgZW5kCiAgICAgICAgICAgaWYgcmQubmlsPyBvciByZC5lbXB0eT8KICAgICAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJTb2NrZXQ6IFRpbWVkIG91dCByZWFkaW5nICN7c3p9IGJ5dGVzIGZyb20gI3tAZGVzY30iKQpAQCAtMTI5LDggKzEzNCwxMCBAQAogICAgICAgQGhhbmRsZSA9IG5pbAogICAgIGVuZAogCi0gICAgZGVmIHRvX2lvCi0gICAgICBAaGFuZGxlCisgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpAQCAtMCwwICsxLDQxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc29ja2V0JworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIFNTTFNlcnZlclNvY2tldCA8IFNlcnZlclNvY2tldAorICAgIGRlZiBpbml0aWFsaXplKGhvc3Rfb3JfcG9ydCwgcG9ydCA9IG5pbCwgc3NsX2NvbnRleHQgPSBuaWwpCisgICAgICBzdXBlcihob3N0X29yX3BvcnQsIHBvcnQpCisgICAgICBAc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAorICAgIGVuZAorCisgICAgYXR0cl9hY2Nlc3NvciA6c3NsX2NvbnRleHQKKworICAgIGRlZiBsaXN0ZW4KKyAgICAgIHNvY2tldCA9IFRDUFNlcnZlci5uZXcoQGhvc3QsIEBwb3J0KQorICAgICAgQGhhbmRsZSA9IE9wZW5TU0w6OlNTTDo6U1NMU2VydmVyLm5ldyhzb2NrZXQsIEBzc2xfY29udGV4dCkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiOTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiCkBAIC0wLDAgKzEsNTEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIFNTTFNvY2tldCA8IFNvY2tldAorICAgIGRlZiBpbml0aWFsaXplKGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdGltZW91dD1uaWwsIHNzbF9jb250ZXh0PW5pbCkKKyAgICAgIHN1cGVyKGhvc3QsIHBvcnQsIHRpbWVvdXQpCisgICAgICBAc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAorICAgIGVuZAorCisgICAgYXR0cl9hY2Nlc3NvciA6c3NsX2NvbnRleHQKKworICAgIGRlZiBvcGVuCisgICAgICBzb2NrZXQgPSBzdXBlcgorICAgICAgQGhhbmRsZSA9IE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0Lm5ldyhzb2NrZXQsIEBzc2xfY29udGV4dCkKKyAgICAgIGJlZ2luCisgICAgICAgIEBoYW5kbGUuY29ubmVjdF9ub25ibG9jaworICAgICAgICBAaGFuZGxlLnBvc3RfY29ubmVjdGlvbl9jaGVjayhAaG9zdCkKKyAgICAgICAgQGhhbmRsZQorICAgICAgcmVzY3VlIElPOjpXYWl0UmVhZGFibGUKKyAgICAgICAgSU8uc2VsZWN0KFsgQGhhbmRsZSBdLCBuaWwsIG5pbCwgQHRpbWVvdXQpCisgICAgICAgIHJldHJ5CisgICAgICByZXNjdWUgSU86OldhaXRXcml0YWJsZQorICAgICAgICBJTy5zZWxlY3QobmlsLCBbIEBoYW5kbGUgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgcmV0cnkKKyAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKKyAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQorICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzc2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgppbmRleCBhMTM1ZDI1Li4wNTdkMTIyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKQEAgLTU2LDUgKzU2LDkgQEAKICAgICBlbmQKIAogICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJkb21haW4oI3tAcGF0aH0pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCmluZGV4IDhmNjkyZTQuLjVkZmZkNTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKQEAgLTM2LDUgKzM2LDkgQEAKICAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IG9wZW4gVU5JWCBzb2NrZXQgYXQgI3tAcGF0aH0iKQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJkb21haW4oI3tAcGF0aH0pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIgYi9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgppbmRleCBhNzA1OGYyLi40OTBjNTVjIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgpAQCAtODcsMTIgKzg3LDkgQEAKICAgICBlbmQKIAogICAgIGRlZiA9PShvdGhlcikKLSAgICAgIG90aGVyICE9IG5pbCAmJiBAc2V0ZmllbGQgPT0gb3RoZXIuZ2V0X3NldF9maWVsZCAmJiBAdmFsdWUgPT0gb3RoZXIuZ2V0X3ZhbHVlCisgICAgICBvdGhlci5lcXVhbD8oc2VsZikgfHwgb3RoZXIuaW5zdGFuY2Vfb2Y/KHNlbGYuY2xhc3MpICYmIEBzZXRmaWVsZCA9PSBvdGhlci5nZXRfc2V0X2ZpZWxkICYmIEB2YWx1ZSA9PSBvdGhlci5nZXRfdmFsdWUKICAgICBlbmQKLQotICAgIGRlZiBlcWw/KG90aGVyKQotICAgICAgc2VsZi5jbGFzcyA9PSBvdGhlci5jbGFzcyAmJiBzZWxmID09IG90aGVyCi0gICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDplcWw/LCA6PT0KIAogICAgIGRlZiBoYXNoCiAgICAgICBbc2VsZi5jbGFzcy5uYW1lLCBAc2V0ZmllbGQsIEB2YWx1ZV0uaGFzaApAQCAtMTc2LDQgKzE3Myw0IEBACiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zZXR1cC5yYiBiL2xpYi9yYi9zZXR1cC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwYzgyNi4uMDAwMDAwMAotLS0gYS9saWIvcmIvc2V0dXAucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg1ICswLDAgQEAKLSMKLSMgc2V0dXAucmIKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2kKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuCi0jIFlvdSBjYW4gZGlzdHJpYnV0ZS9tb2RpZnkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyB0aGUgR05VIExHUEwsIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLgotIwotCi11bmxlc3MgRW51bWVyYWJsZS5tZXRob2RfZGVmaW5lZD8oOm1hcCkgICAjIFJ1YnkgMS40LjYKLSAgbW9kdWxlIEVudW1lcmFibGUKLSAgICBhbGlhcyBtYXAgY29sbGVjdAotICBlbmQKLWVuZAotCi11bmxlc3MgRmlsZS5yZXNwb25kX3RvPyg6cmVhZCkgICAjIFJ1YnkgMS42Ci0gIGRlZiBGaWxlLnJlYWQoZm5hbWUpCi0gICAgb3BlbihmbmFtZSkge3xmfAotICAgICAgcmV0dXJuIGYucmVhZAotICAgIH0KLSAgZW5kCi1lbmQKLQotdW5sZXNzIEVycm5vLmNvbnN0X2RlZmluZWQ/KDpFTk9URU1QVFkpICAgIyBXaW5kb3dzPwotICBtb2R1bGUgRXJybm8KLSAgICBjbGFzcyBFTk9URU1QVFkKLSAgICAgICMgV2UgZG8gbm90IHJhaXNlIHRoaXMgZXhjZXB0aW9uLCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbmVlZGVkLgotICAgIGVuZAotICBlbmQKLWVuZAotCi1kZWYgRmlsZS5iaW5yZWFkKGZuYW1lKQotICBvcGVuKGZuYW1lLCAncmInKSB7fGZ8Ci0gICAgcmV0dXJuIGYucmVhZAotICB9Ci1lbmQKLQotIyBmb3IgY29ycnVwdGVkIFdpbmRvd3MnIHN0YXQoMikKLWRlZiBGaWxlLmRpcj8ocGF0aCkKLSAgRmlsZS5kaXJlY3Rvcnk/KChwYXRoWy0xLDFdID09ICcvJykgPyBwYXRoIDogcGF0aCArICcvJykKLWVuZAotCi0KLWNsYXNzIENvbmZpZ1RhYmxlCi0KLSAgaW5jbHVkZSBFbnVtZXJhYmxlCi0KLSAgZGVmIGluaXRpYWxpemUocmJjb25maWcpCi0gICAgQHJiY29uZmlnID0gcmJjb25maWcKLSAgICBAaXRlbXMgPSBbXQotICAgIEB0YWJsZSA9IHt9Ci0gICAgIyBvcHRpb25zCi0gICAgQGluc3RhbGxfcHJlZml4ID0gbmlsCi0gICAgQGNvbmZpZ19vcHQgPSBuaWwKLSAgICBAdmVyYm9zZSA9IHRydWUKLSAgICBAbm9faGFybSA9IGZhbHNlCi0gIGVuZAotCi0gIGF0dHJfYWNjZXNzb3IgOmluc3RhbGxfcHJlZml4Ci0gIGF0dHJfYWNjZXNzb3IgOmNvbmZpZ19vcHQKLQotICBhdHRyX3dyaXRlciA6dmVyYm9zZQotCi0gIGRlZiB2ZXJib3NlPwotICAgIEB2ZXJib3NlCi0gIGVuZAotCi0gIGF0dHJfd3JpdGVyIDpub19oYXJtCi0KLSAgZGVmIG5vX2hhcm0/Ci0gICAgQG5vX2hhcm0KLSAgZW5kCi0KLSAgZGVmIFtdKGtleSkKLSAgICBsb29rdXAoa2V5KS5yZXNvbHZlKHNlbGYpCi0gIGVuZAotCi0gIGRlZiBbXT0oa2V5LCB2YWwpCi0gICAgbG9va3VwKGtleSkuc2V0IHZhbAotICBlbmQKLQotICBkZWYgbmFtZXMKLSAgICBAaXRlbXMubWFwIHt8aXwgaS5uYW1lIH0KLSAgZW5kCi0KLSAgZGVmIGVhY2goJmJsb2NrKQotICAgIEBpdGVtcy5lYWNoKCZibG9jaykKLSAgZW5kCi0KLSAgZGVmIGtleT8obmFtZSkKLSAgICBAdGFibGUua2V5PyhuYW1lKQotICBlbmQKLQotICBkZWYgbG9va3VwKG5hbWUpCi0gICAgQHRhYmxlW25hbWVdIG9yIHNldHVwX3JiX2Vycm9yICJubyBzdWNoIGNvbmZpZyBpdGVtOiAje25hbWV9IgotICBlbmQKLQotICBkZWYgYWRkKGl0ZW0pCi0gICAgQGl0ZW1zLnB1c2ggaXRlbQotICAgIEB0YWJsZVtpdGVtLm5hbWVdID0gaXRlbQotICBlbmQKLQotICBkZWYgcmVtb3ZlKG5hbWUpCi0gICAgaXRlbSA9IGxvb2t1cChuYW1lKQotICAgIEBpdGVtcy5kZWxldGVfaWYge3xpfCBpLm5hbWUgPT0gbmFtZSB9Ci0gICAgQHRhYmxlLmRlbGV0ZV9pZiB7fG5hbWUsIGl8IGkubmFtZSA9PSBuYW1lIH0KLSAgICBpdGVtCi0gIGVuZAotCi0gIGRlZiBsb2FkX3NjcmlwdChwYXRoLCBpbnN0ID0gbmlsKQotICAgIGlmIEZpbGUuZmlsZT8ocGF0aCkKLSAgICAgIE1ldGFDb25maWdFbnZpcm9ubWVudC5uZXcoc2VsZiwgaW5zdCkuaW5zdGFuY2VfZXZhbCBGaWxlLnJlYWQocGF0aCksIHBhdGgKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHNhdmVmaWxlCi0gICAgJy5jb25maWcnCi0gIGVuZAotCi0gIGRlZiBsb2FkX3NhdmVmaWxlCi0gICAgYmVnaW4KLSAgICAgIEZpbGUuZm9yZWFjaChzYXZlZmlsZSgpKSBkbyB8bGluZXwKLSAgICAgICAgaywgdiA9ICpsaW5lLnNwbGl0KC89LywgMikKLSAgICAgICAgc2VsZltrXSA9IHYuc3RyaXAKLSAgICAgIGVuZAotICAgIHJlc2N1ZSBFcnJubzo6RU5PRU5UCi0gICAgICBzZXR1cF9yYl9lcnJvciAkIS5tZXNzYWdlICsgIlxuI3tGaWxlLmJhc2VuYW1lKCQwKX0gY29uZmlnIGZpcnN0IgotICAgIGVuZAotICBlbmQKLQotICBkZWYgc2F2ZQotICAgIEBpdGVtcy5lYWNoIHt8aXwgaS52YWx1ZSB9Ci0gICAgRmlsZS5vcGVuKHNhdmVmaWxlKCksICd3Jykge3xmfAotICAgICAgQGl0ZW1zLmVhY2ggZG8gfGl8Ci0gICAgICAgIGYucHJpbnRmICIlcz0lc1xuIiwgaS5uYW1lLCBpLnZhbHVlIGlmIGkudmFsdWU/IGFuZCBpLnZhbHVlCi0gICAgICBlbmQKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBsb2FkX3N0YW5kYXJkX2VudHJpZXMKLSAgICBzdGFuZGFyZF9lbnRyaWVzKEByYmNvbmZpZykuZWFjaCBkbyB8ZW50fAotICAgICAgYWRkIGVudAotICAgIGVuZAotICBlbmQKLQotICBkZWYgc3RhbmRhcmRfZW50cmllcyhyYmNvbmZpZykKLSAgICBjID0gcmJjb25maWcKLQotICAgIHJ1YnlwYXRoID0gRmlsZS5qb2luKGNbJ2JpbmRpciddLCBjWydydWJ5X2luc3RhbGxfbmFtZSddICsgY1snRVhFRVhUJ10pCi0KLSAgICBtYWpvciA9IGNbJ01BSk9SJ10udG9faQotICAgIG1pbm9yID0gY1snTUlOT1InXS50b19pCi0gICAgdGVlbnkgPSBjWydURUVOWSddLnRvX2kKLSAgICB2ZXJzaW9uID0gIiN7bWFqb3J9LiN7bWlub3J9IgotCi0gICAgIyBydWJ5IHZlci4gPj0gMS40LjQ/Ci0gICAgbmV3cGF0aF9wID0gKChtYWpvciA+PSAyKSBvcgotICAgICAgICAgICAgICAgICAoKG1ham9yID09IDEpIGFuZAotICAgICAgICAgICAgICAgICAgKChtaW5vciA+PSA1KSBvcgotICAgICAgICAgICAgICAgICAgICgobWlub3IgPT0gNCkgYW5kICh0ZWVueSA+PSA0KSkpKSkKLQotICAgIGlmIGNbJ3J1YnlsaWJkaXInXQotICAgICAgIyBWID4gMS42LjMKLSAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKLSAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9IGNbJ3J1YnlsaWJkaXInXQotICAgICAgbGlicnVieXZlcmFyY2ggID0gY1snYXJjaGRpciddCi0gICAgICBzaXRlcnVieSAgICAgICAgPSBjWydzaXRlZGlyJ10KLSAgICAgIHNpdGVydWJ5dmVyICAgICA9IGNbJ3NpdGVsaWJkaXInXQotICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gY1snc2l0ZWFyY2hkaXInXQotICAgIGVsc2lmIG5ld3BhdGhfcAotICAgICAgIyAxLjQuNCA8PSBWIDw9IDEuNi4zCi0gICAgICBsaWJydWJ5ICAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkiCi0gICAgICBsaWJydWJ5dmVyICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufSIKLSAgICAgIGxpYnJ1Ynl2ZXJhcmNoICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259LyN7Y1snYXJjaCddfSIKLSAgICAgIHNpdGVydWJ5ICAgICAgICA9IGNbJ3NpdGVkaXInXQotICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gIiRzaXRlcnVieS8je3ZlcnNpb259IgotICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gIiRzaXRlcnVieXZlci8je2NbJ2FyY2gnXX0iCi0gICAgZWxzZQotICAgICAgIyBWIDwgMS40LjQKLSAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKLSAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259IgotICAgICAgbGlicnVieXZlcmFyY2ggID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vI3tjWydhcmNoJ119IgotICAgICAgc2l0ZXJ1YnkgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vc2l0ZV9ydWJ5IgotICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gc2l0ZXJ1YnkKLSAgICAgIHNpdGVydWJ5dmVyYXJjaCA9ICIkc2l0ZXJ1Ynl2ZXIvI3tjWydhcmNoJ119IgotICAgIGVuZAotICAgIHBhcmFtZXRlcml6ZSA9IGxhbWJkYSB7fHBhdGh8Ci0gICAgICBwYXRoLnN1YigvXEEje1JlZ2V4cC5xdW90ZShjWydwcmVmaXgnXSl9LywgJyRwcmVmaXgnKQotICAgIH0KLQotICAgIGlmIGFyZyA9IGNbJ2NvbmZpZ3VyZV9hcmdzJ10uc3BsaXQuZGV0ZWN0IHt8YXJnfCAvLS13aXRoLW1ha2UtcHJvZz0vID1+IGFyZyB9Ci0gICAgICBtYWtlcHJvZyA9IGFyZy5zdWIoLycvLCAnJykuc3BsaXQoLz0vLCAyKVsxXQotICAgIGVsc2UKLSAgICAgIG1ha2Vwcm9nID0gJ21ha2UnCi0gICAgZW5kCi0KLSAgICBbCi0gICAgICBFeGVjSXRlbS5uZXcoJ2luc3RhbGxkaXJzJywgJ3N0ZC9zaXRlL2hvbWUnLAotICAgICAgICAgICAgICAgICAgICdzdGQ6IGluc3RhbGwgdW5kZXIgbGlicnVieTsgc2l0ZTogaW5zdGFsbCB1bmRlciBzaXRlX3J1Ynk7IGhvbWU6IGluc3RhbGwgdW5kZXIgJEhPTUUnKVwKLSAgICAgICAgICB7fHZhbCwgdGFibGV8Ci0gICAgICAgICAgICBjYXNlIHZhbAotICAgICAgICAgICAgd2hlbiAnc3RkJwotICAgICAgICAgICAgICB0YWJsZVsncmJkaXInXSA9ICckbGlicnVieXZlcicKLSAgICAgICAgICAgICAgdGFibGVbJ3NvZGlyJ10gPSAnJGxpYnJ1Ynl2ZXJhcmNoJwotICAgICAgICAgICAgd2hlbiAnc2l0ZScKLSAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJHNpdGVydWJ5dmVyJwotICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckc2l0ZXJ1Ynl2ZXJhcmNoJwotICAgICAgICAgICAgd2hlbiAnaG9tZScKLSAgICAgICAgICAgICAgc2V0dXBfcmJfZXJyb3IgJyRIT01FIHdhcyBub3Qgc2V0JyB1bmxlc3MgRU5WWydIT01FJ10KLSAgICAgICAgICAgICAgdGFibGVbJ3ByZWZpeCddID0gRU5WWydIT01FJ10KLSAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJGxpYmRpci9ydWJ5JwotICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckbGliZGlyL3J1YnknCi0gICAgICAgICAgICBlbmQKLSAgICAgICAgICB9LAotICAgICAgUGF0aEl0ZW0ubmV3KCdwcmVmaXgnLCAncGF0aCcsIGNbJ3ByZWZpeCddLAotICAgICAgICAgICAgICAgICAgICdwYXRoIHByZWZpeCBvZiB0YXJnZXQgZW52aXJvbm1lbnQnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnYmluZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydiaW5kaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGNvbW1hbmRzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snbGliZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnZGF0YWRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snZGF0YWRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc2hhcmVkIGRhdGEnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbWFuZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydtYW5kaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIG1hbiBwYWdlcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzeXNjb25mZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydzeXNjb25mZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBmaWxlcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsb2NhbHN0YXRlZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydsb2NhbHN0YXRlZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsb2NhbCBzdGF0ZSBkYXRhJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1YnknLCAncGF0aCcsIGxpYnJ1YnksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXInLCAncGF0aCcsIGxpYnJ1Ynl2ZXIsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHN0YW5kYXJkIHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBsaWJydWJ5dmVyYXJjaCwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc3RhbmRhcmQgcnVieSBleHRlbnNpb25zJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NpdGVydWJ5JywgJ3BhdGgnLCBzaXRlcnVieSwKLSAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgdmVyc2lvbi1pbmRlcGVuZGVudCBhdXggcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXInLCAncGF0aCcsIHNpdGVydWJ5dmVyLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBhdXggcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBzaXRlcnVieXZlcmFyY2gsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGF1eCBydWJ5IGJpbmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3JiZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyJywKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgcnVieSBzY3JpcHRzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NvZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyYXJjaCcsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgZXh0ZW50aW9ucycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdydWJ5cGF0aCcsICdwYXRoJywgcnVieXBhdGgsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBwYXRoIHRvIHNldCB0byAjISBsaW5lJyksCi0gICAgICBQcm9ncmFtSXRlbS5uZXcoJ3J1Ynlwcm9nJywgJ25hbWUnLCBydWJ5cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAndGhlIHJ1YnkgcHJvZ3JhbSB1c2luZyBmb3IgaW5zdGFsbGF0aW9uJyksCi0gICAgICBQcm9ncmFtSXRlbS5uZXcoJ21ha2Vwcm9nJywgJ25hbWUnLCBtYWtlcHJvZywKLSAgICAgICAgICAgICAgICAgICAgICAndGhlIG1ha2UgcHJvZ3JhbSB0byBjb21waWxlIHJ1YnkgZXh0ZW50aW9ucycpLAotICAgICAgU2VsZWN0SXRlbS5uZXcoJ3NoZWJhbmcnLCAnYWxsL3J1YnkvbmV2ZXInLCAncnVieScsCi0gICAgICAgICAgICAgICAgICAgICAnc2hlYmFuZyBsaW5lICgjISkgZWRpdGluZyBtb2RlJyksCi0gICAgICBCb29sSXRlbS5uZXcoJ3dpdGhvdXQtZXh0JywgJ3llcy9ubycsICdubycsCi0gICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGNvbXBpbGUvaW5zdGFsbCBydWJ5IGV4dGVudGlvbnMnKQotICAgIF0KLSAgZW5kCi0gIHByaXZhdGUgOnN0YW5kYXJkX2VudHJpZXMKLQotICBkZWYgbG9hZF9tdWx0aXBhY2thZ2VfZW50cmllcwotICAgIG11bHRpcGFja2FnZV9lbnRyaWVzKCkuZWFjaCBkbyB8ZW50fAotICAgICAgYWRkIGVudAotICAgIGVuZAotICBlbmQKLQotICBkZWYgbXVsdGlwYWNrYWdlX2VudHJpZXMKLSAgICBbCi0gICAgICBQYWNrYWdlU2VsZWN0aW9uSXRlbS5uZXcoJ3dpdGgnLCAnbmFtZSxuYW1lLi4uJywgJycsICdBTEwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIG5hbWVzIHRoYXQgeW91IHdhbnQgdG8gaW5zdGFsbCcpLAotICAgICAgUGFja2FnZVNlbGVjdGlvbkl0ZW0ubmV3KCd3aXRob3V0JywgJ25hbWUsbmFtZS4uLicsICcnLCAnTk9ORScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UgbmFtZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gaW5zdGFsbCcpCi0gICAgXQotICBlbmQKLSAgcHJpdmF0ZSA6bXVsdGlwYWNrYWdlX2VudHJpZXMKLQotICBBTElBU0VTID0gewotICAgICdzdGQtcnVieScgICAgICAgICA9PiAnbGlicnVieXZlcicsCi0gICAgJ3N0ZHJ1YnknICAgICAgICAgID0+ICdsaWJydWJ5dmVyJywKLSAgICAncnVieWxpYmRpcicgICAgICAgPT4gJ2xpYnJ1Ynl2ZXInLAotICAgICdhcmNoZGlyJyAgICAgICAgICA9PiAnbGlicnVieXZlcmFyY2gnLAotICAgICdzaXRlLXJ1YnktY29tbW9uJyA9PiAnc2l0ZXJ1YnknLCAgICAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICdzaXRlLXJ1YnknICAgICAgICA9PiAnc2l0ZXJ1Ynl2ZXInLCAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICdiaW4tZGlyJyAgICAgICAgICA9PiAnYmluZGlyJywKLSAgICAnYmluLWRpcicgICAgICAgICAgPT4gJ2JpbmRpcicsCi0gICAgJ3JiLWRpcicgICAgICAgICAgID0+ICdyYmRpcicsCi0gICAgJ3NvLWRpcicgICAgICAgICAgID0+ICdzb2RpcicsCi0gICAgJ2RhdGEtZGlyJyAgICAgICAgID0+ICdkYXRhZGlyJywKLSAgICAncnVieS1wYXRoJyAgICAgICAgPT4gJ3J1YnlwYXRoJywKLSAgICAncnVieS1wcm9nJyAgICAgICAgPT4gJ3J1Ynlwcm9nJywKLSAgICAncnVieScgICAgICAgICAgICAgPT4gJ3J1Ynlwcm9nJywKLSAgICAnbWFrZS1wcm9nJyAgICAgICAgPT4gJ21ha2Vwcm9nJywKLSAgICAnbWFrZScgICAgICAgICAgICAgPT4gJ21ha2Vwcm9nJwotICB9Ci0KLSAgZGVmIGZpeHVwCi0gICAgQUxJQVNFUy5lYWNoIGRvIHxhbGksIG5hbWV8Ci0gICAgICBAdGFibGVbYWxpXSA9IEB0YWJsZVtuYW1lXQotICAgIGVuZAotICAgIEBpdGVtcy5mcmVlemUKLSAgICBAdGFibGUuZnJlZXplCi0gICAgQG9wdGlvbnNfcmUgPSAvXEEtLSgje0B0YWJsZS5rZXlzLmpvaW4oJ3wnKX0pKD86PSguKikpP1x6LwotICBlbmQKLQotICBkZWYgcGFyc2Vfb3B0KG9wdCkKLSAgICBtID0gQG9wdGlvbnNfcmUubWF0Y2gob3B0KSBvciBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1bmtub3duIG9wdGlvbiAje29wdH0iCi0gICAgbS50b19hWzEsMl0KLSAgZW5kCi0KLSAgZGVmIGRsbGV4dAotICAgIEByYmNvbmZpZ1snRExFWFQnXQotICBlbmQKLQotICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQotICAgIGxvb2t1cChuYW1lKS52YWx1ZT8KLSAgZW5kCi0KLSAgY2xhc3MgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHRlbXBsYXRlLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQG5hbWUgPSBuYW1lLmZyZWV6ZQotICAgICAgQHRlbXBsYXRlID0gdGVtcGxhdGUKLSAgICAgIEB2YWx1ZSA9IGRlZmF1bHQKLSAgICAgIEBkZWZhdWx0ID0gZGVmYXVsdAotICAgICAgQGRlc2NyaXB0aW9uID0gZGVzYwotICAgIGVuZAotCi0gICAgYXR0cl9yZWFkZXIgOm5hbWUKLSAgICBhdHRyX3JlYWRlciA6ZGVzY3JpcHRpb24KLQotICAgIGF0dHJfYWNjZXNzb3IgOmRlZmF1bHQKLSAgICBhbGlhcyBoZWxwX2RlZmF1bHQgZGVmYXVsdAotCi0gICAgZGVmIGhlbHBfb3B0Ci0gICAgICAiLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0iCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWU/Ci0gICAgICB0cnVlCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWUKLSAgICAgIEB2YWx1ZQotICAgIGVuZAotCi0gICAgZGVmIHJlc29sdmUodGFibGUpCi0gICAgICBAdmFsdWUuZ3N1YiglcjxcJChbXi9dKyk+KSB7IHRhYmxlWyQxXSB9Ci0gICAgZW5kCi0KLSAgICBkZWYgc2V0KHZhbCkKLSAgICAgIEB2YWx1ZSA9IGNoZWNrKHZhbCkKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7bmFtZX0gcmVxdWlyZXMgYXJndW1lbnQiIHVubGVzcyB2YWwKLSAgICAgIHZhbAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBCb29sSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdib29sJwotICAgIGVuZAotCi0gICAgZGVmIGhlbHBfb3B0Ci0gICAgICAiLS0je0BuYW1lfSIKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICByZXR1cm4gJ3llcycgdW5sZXNzIHZhbAotICAgICAgY2FzZSB2YWwKLSAgICAgIHdoZW4gL1xBeShlcyk/XHovaSwgL1xBdChydWUpP1x6L2kgdGhlbiAneWVzJwotICAgICAgd2hlbiAvXEFuKG8pP1x6L2ksIC9cQWYoYWxzZSlcei9pICB0aGVuICdubycKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogLS0je0BuYW1lfSBhY2NlcHRzIG9ubHkgeWVzL25vIGZvciBhcmd1bWVudCIKLSAgICAgIGVuZAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQYXRoSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdwYXRoJwotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHBhdGgpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7QG5hbWV9IHJlcXVpcmVzIGFyZ3VtZW50IiAgdW5sZXNzIHBhdGgKLSAgICAgIHBhdGhbMCwxXSA9PSAnJCcgPyBwYXRoIDogRmlsZS5leHBhbmRfcGF0aChwYXRoKQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQcm9ncmFtSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdwcm9ncmFtJwotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBTZWxlY3RJdGVtIDwgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHNlbGVjdGlvbiwgZGVmYXVsdCwgZGVzYykKLSAgICAgIHN1cGVyCi0gICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQotICAgIGVuZAotCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAnc2VsZWN0JwotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHZhbCkKLSAgICAgIHVubGVzcyBAb2suaW5jbHVkZT8odmFsLnN0cmlwKQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1c2UgLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0gKCN7dmFsfSkiCi0gICAgICBlbmQKLSAgICAgIHZhbC5zdHJpcAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBFeGVjSXRlbSA8IEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBzZWxlY3Rpb24sIGRlc2MsICZibG9jaykKLSAgICAgIHN1cGVyIG5hbWUsIHNlbGVjdGlvbiwgbmlsLCBkZXNjCi0gICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQotICAgICAgQGFjdGlvbiA9IGJsb2NrCi0gICAgZW5kCi0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdleGVjJwotICAgIGVuZAotCi0gICAgZGVmIHZhbHVlPwotICAgICAgZmFsc2UKLSAgICBlbmQKLQotICAgIGRlZiByZXNvbHZlKHRhYmxlKQotICAgICAgc2V0dXBfcmJfZXJyb3IgIiQje25hbWUoKX0gd3JvbmdseSB1c2VkIGFzIG9wdGlvbiB2YWx1ZSIKLSAgICBlbmQKLQotICAgIHVuZGVmIHNldAotCi0gICAgZGVmIGV2YWx1YXRlKHZhbCwgdGFibGUpCi0gICAgICB2ID0gdmFsLnN0cmlwLmRvd25jYXNlCi0gICAgICB1bmxlc3MgQG9rLmluY2x1ZGU/KHYpCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnZhbGlkIG9wdGlvbiAtLSN7QG5hbWV9PSN7dmFsfSAodXNlICN7QHRlbXBsYXRlfSkiCi0gICAgICBlbmQKLSAgICAgIEBhY3Rpb24uY2FsbCB2LCB0YWJsZQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQYWNrYWdlU2VsZWN0aW9uSXRlbSA8IEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCB0ZW1wbGF0ZSwgZGVmYXVsdCwgaGVscF9kZWZhdWx0LCBkZXNjKQotICAgICAgc3VwZXIgbmFtZSwgdGVtcGxhdGUsIGRlZmF1bHQsIGRlc2MKLSAgICAgIEBoZWxwX2RlZmF1bHQgPSBoZWxwX2RlZmF1bHQKLSAgICBlbmQKLQotICAgIGF0dHJfcmVhZGVyIDpoZWxwX2RlZmF1bHQKLQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ3BhY2thZ2UnCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2sodmFsKQotICAgICAgdW5sZXNzIEZpbGUuZGlyPygicGFja2FnZXMvI3t2YWx9IikKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogbm8gc3VjaCBwYWNrYWdlOiAje3ZhbH0iCi0gICAgICBlbmQKLSAgICAgIHZhbAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBNZXRhQ29uZmlnRW52aXJvbm1lbnQKLSAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIGluc3RhbGxlcikKLSAgICAgIEBjb25maWcgPSBjb25maWcKLSAgICAgIEBpbnN0YWxsZXIgPSBpbnN0YWxsZXIKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWdfbmFtZXMKLSAgICAgIEBjb25maWcubmFtZXMKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWc/KG5hbWUpCi0gICAgICBAY29uZmlnLmtleT8obmFtZSkKLSAgICBlbmQKLQotICAgIGRlZiBib29sX2NvbmZpZz8obmFtZSkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmNvbmZpZ190eXBlID09ICdib29sJwotICAgIGVuZAotCi0gICAgZGVmIHBhdGhfY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgPT0gJ3BhdGgnCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgIT0gJ2V4ZWMnCi0gICAgZW5kCi0KLSAgICBkZWYgYWRkX2NvbmZpZyhpdGVtKQotICAgICAgQGNvbmZpZy5hZGQgaXRlbQotICAgIGVuZAotCi0gICAgZGVmIGFkZF9ib29sX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQGNvbmZpZy5hZGQgQm9vbEl0ZW0ubmV3KG5hbWUsICd5ZXMvbm8nLCBkZWZhdWx0ID8gJ3llcycgOiAnbm8nLCBkZXNjKQotICAgIGVuZAotCi0gICAgZGVmIGFkZF9wYXRoX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQGNvbmZpZy5hZGQgUGF0aEl0ZW0ubmV3KG5hbWUsICdwYXRoJywgZGVmYXVsdCwgZGVzYykKLSAgICBlbmQKLQotICAgIGRlZiBzZXRfY29uZmlnX2RlZmF1bHQobmFtZSwgZGVmYXVsdCkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmRlZmF1bHQgPSBkZWZhdWx0Ci0gICAgZW5kCi0KLSAgICBkZWYgcmVtb3ZlX2NvbmZpZyhuYW1lKQotICAgICAgQGNvbmZpZy5yZW1vdmUobmFtZSkKLSAgICBlbmQKLQotICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCi0gICAgZGVmIHBhY2thZ2VzCi0gICAgICByYWlzZSAnW3NldHVwLnJiIGZhdGFsXSBtdWx0aS1wYWNrYWdlIG1ldGFjb25maWcgQVBJIHBhY2thZ2VzKCkgY2FsbGVkIGZvciBzaW5nbGUtcGFja2FnZTsgY29udGFjdCBhcHBsaWNhdGlvbiBwYWNrYWdlIHZlbmRvcicgdW5sZXNzIEBpbnN0YWxsZXIKLSAgICAgIEBpbnN0YWxsZXIucGFja2FnZXMKLSAgICBlbmQKLQotICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCi0gICAgZGVmIGRlY2xhcmVfcGFja2FnZXMobGlzdCkKLSAgICAgIHJhaXNlICdbc2V0dXAucmIgZmF0YWxdIG11bHRpLXBhY2thZ2UgbWV0YWNvbmZpZyBBUEkgZGVjbGFyZV9wYWNrYWdlcygpIGNhbGxlZCBmb3Igc2luZ2xlLXBhY2thZ2U7IGNvbnRhY3QgYXBwbGljYXRpb24gcGFja2FnZSB2ZW5kb3InIHVubGVzcyBAaW5zdGFsbGVyCi0gICAgICBAaW5zdGFsbGVyLnBhY2thZ2VzID0gbGlzdAotICAgIGVuZAotICBlbmQKLQotZW5kICAgIyBjbGFzcyBDb25maWdUYWJsZQotCi0KLSMgVGhpcyBtb2R1bGUgcmVxdWlyZXM6ICN2ZXJib3NlPywgI25vX2hhcm0/Ci1tb2R1bGUgRmlsZU9wZXJhdGlvbnMKLQotICBkZWYgbWtkaXJfcChkaXJuYW1lLCBwcmVmaXggPSBuaWwpCi0gICAgZGlybmFtZSA9IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGlybmFtZSkgaWYgcHJlZml4Ci0gICAgJHN0ZGVyci5wdXRzICJta2RpciAtcCAje2Rpcm5hbWV9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotCi0gICAgIyBEb2VzIG5vdCBjaGVjayAnLycsIGl0J3MgdG9vIGFibm9ybWFsLgotICAgIGRpcnMgPSBGaWxlLmV4cGFuZF9wYXRoKGRpcm5hbWUpLnNwbGl0KCVyPCg/PS8pPikKLSAgICBpZiAvXEFbYS16XTpcei9pID1+IGRpcnNbMF0KLSAgICAgIGRpc2sgPSBkaXJzLnNoaWZ0Ci0gICAgICBkaXJzWzBdID0gZGlzayArIGRpcnNbMF0KLSAgICBlbmQKLSAgICBkaXJzLmVhY2hfaW5kZXggZG8gfGlkeHwKLSAgICAgIHBhdGggPSBkaXJzWzAuLmlkeF0uam9pbignJykKLSAgICAgIERpci5ta2RpciBwYXRoIHVubGVzcyBGaWxlLmRpcj8ocGF0aCkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJtX2YocGF0aCkKLSAgICAkc3RkZXJyLnB1dHMgInJtIC1mICN7cGF0aH0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0gICAgZm9yY2VfcmVtb3ZlX2ZpbGUgcGF0aAotICBlbmQKLQotICBkZWYgcm1fcmYocGF0aCkKLSAgICAkc3RkZXJyLnB1dHMgInJtIC1yZiAje3BhdGh9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotICAgIHJlbW92ZV90cmVlIHBhdGgKLSAgZW5kCi0KLSAgZGVmIHJlbW92ZV90cmVlKHBhdGgpCi0gICAgaWYgRmlsZS5zeW1saW5rPyhwYXRoKQotICAgICAgcmVtb3ZlX2ZpbGUgcGF0aAotICAgIGVsc2lmIEZpbGUuZGlyPyhwYXRoKQotICAgICAgcmVtb3ZlX3RyZWUwIHBhdGgKLSAgICBlbHNlCi0gICAgICBmb3JjZV9yZW1vdmVfZmlsZSBwYXRoCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiByZW1vdmVfdHJlZTAocGF0aCkKLSAgICBEaXIuZm9yZWFjaChwYXRoKSBkbyB8ZW50fAotICAgICAgbmV4dCBpZiBlbnQgPT0gJy4nCi0gICAgICBuZXh0IGlmIGVudCA9PSAnLi4nCi0gICAgICBlbnRwYXRoID0gIiN7cGF0aH0vI3tlbnR9IgotICAgICAgaWYgRmlsZS5zeW1saW5rPyhlbnRwYXRoKQotICAgICAgICByZW1vdmVfZmlsZSBlbnRwYXRoCi0gICAgICBlbHNpZiBGaWxlLmRpcj8oZW50cGF0aCkKLSAgICAgICAgcmVtb3ZlX3RyZWUwIGVudHBhdGgKLSAgICAgIGVsc2UKLSAgICAgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZW50cGF0aAotICAgICAgZW5kCi0gICAgZW5kCi0gICAgYmVnaW4KLSAgICAgIERpci5ybWRpciBwYXRoCi0gICAgcmVzY3VlIEVycm5vOjpFTk9URU1QVFkKLSAgICAgICMgZGlyZWN0b3J5IG1heSBub3QgYmUgZW1wdHkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIG1vdmVfZmlsZShzcmMsIGRlc3QpCi0gICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZGVzdAotICAgIGJlZ2luCi0gICAgICBGaWxlLnJlbmFtZSBzcmMsIGRlc3QKLSAgICByZXNjdWUKLSAgICAgIEZpbGUub3BlbihkZXN0LCAnd2InKSB7fGZ8Ci0gICAgICAgIGYud3JpdGUgRmlsZS5iaW5yZWFkKHNyYykKLSAgICAgIH0KLSAgICAgIEZpbGUuY2htb2QgRmlsZS5zdGF0KHNyYykubW9kZSwgZGVzdAotICAgICAgRmlsZS51bmxpbmsgc3JjCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBmb3JjZV9yZW1vdmVfZmlsZShwYXRoKQotICAgIGJlZ2luCi0gICAgICByZW1vdmVfZmlsZSBwYXRoCi0gICAgcmVzY3VlCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiByZW1vdmVfZmlsZShwYXRoKQotICAgIEZpbGUuY2htb2QgMDc3NywgcGF0aAotICAgIEZpbGUudW5saW5rIHBhdGgKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGwoZnJvbSwgZGVzdCwgbW9kZSwgcHJlZml4ID0gbmlsKQotICAgICRzdGRlcnIucHV0cyAiaW5zdGFsbCAje2Zyb219ICN7ZGVzdH0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0KLSAgICByZWFsZGVzdCA9IHByZWZpeCA/IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGVzdCkgOiBkZXN0Ci0gICAgcmVhbGRlc3QgPSBGaWxlLmpvaW4ocmVhbGRlc3QsIEZpbGUuYmFzZW5hbWUoZnJvbSkpIGlmIEZpbGUuZGlyPyhyZWFsZGVzdCkKLSAgICBzdHIgPSBGaWxlLmJpbnJlYWQoZnJvbSkKLSAgICBpZiBkaWZmPyhzdHIsIHJlYWxkZXN0KQotICAgICAgdmVyYm9zZV9vZmYgewotICAgICAgICBybV9mIHJlYWxkZXN0IGlmIEZpbGUuZXhpc3Q/KHJlYWxkZXN0KQotICAgICAgfQotICAgICAgRmlsZS5vcGVuKHJlYWxkZXN0LCAnd2InKSB7fGZ8Ci0gICAgICAgIGYud3JpdGUgc3RyCi0gICAgICB9Ci0gICAgICBGaWxlLmNobW9kIG1vZGUsIHJlYWxkZXN0Ci0KLSAgICAgIEZpbGUub3BlbigiI3tvYmpkaXJfcm9vdCgpfS9JbnN0YWxsZWRGaWxlcyIsICdhJykge3xmfAotICAgICAgICBpZiBwcmVmaXgKLSAgICAgICAgICBmLnB1dHMgcmVhbGRlc3Quc3ViKHByZWZpeCwgJycpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBmLnB1dHMgcmVhbGRlc3QKLSAgICAgICAgZW5kCi0gICAgICB9Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBkaWZmPyhuZXdfY29udGVudCwgcGF0aCkKLSAgICByZXR1cm4gdHJ1ZSB1bmxlc3MgRmlsZS5leGlzdD8ocGF0aCkKLSAgICBuZXdfY29udGVudCAhPSBGaWxlLmJpbnJlYWQocGF0aCkKLSAgZW5kCi0KLSAgZGVmIGNvbW1hbmQoKmFyZ3MpCi0gICAgJHN0ZGVyci5wdXRzIGFyZ3Muam9pbignICcpIGlmIHZlcmJvc2U/Ci0gICAgc3lzdGVtKCphcmdzKSBvciByYWlzZSBSdW50aW1lRXJyb3IsCi0gICAgICAgICJzeXN0ZW0oI3thcmdzLm1hcHt8YXwgYS5pbnNwZWN0IH0uam9pbignICcpfSkgZmFpbGVkIgotICBlbmQKLQotICBkZWYgcnVieSgqYXJncykKLSAgICBjb21tYW5kIGNvbmZpZygncnVieXByb2cnKSwgKmFyZ3MKLSAgZW5kCi0KLSAgZGVmIG1ha2UodGFzayA9IG5pbCkKLSAgICBjb21tYW5kKCpbY29uZmlnKCdtYWtlcHJvZycpLCB0YXNrXS5jb21wYWN0KQotICBlbmQKLQotICBkZWYgZXh0ZGlyPyhkaXIpCi0gICAgRmlsZS5leGlzdD8oIiN7ZGlyfS9NQU5JRkVTVCIpIG9yIEZpbGUuZXhpc3Q/KCIje2Rpcn0vZXh0Y29uZi5yYiIpCi0gIGVuZAotCi0gIGRlZiBmaWxlc19vZihkaXIpCi0gICAgRGlyLm9wZW4oZGlyKSB7fGR8Ci0gICAgICByZXR1cm4gZC5zZWxlY3Qge3xlbnR8IEZpbGUuZmlsZT8oIiN7ZGlyfS8je2VudH0iKSB9Ci0gICAgfQotICBlbmQKLQotICBESVJfUkVKRUNUID0gJXcoIC4gLi4gQ1ZTIFNDQ1MgUkNTIENWUy5hZG0gLnN2biApCi0KLSAgZGVmIGRpcmVjdG9yaWVzX29mKGRpcikKLSAgICBEaXIub3BlbihkaXIpIHt8ZHwKLSAgICAgIHJldHVybiBkLnNlbGVjdCB7fGVudHwgRmlsZS5kaXI/KCIje2Rpcn0vI3tlbnR9IikgfSAtIERJUl9SRUpFQ1QKLSAgICB9Ci0gIGVuZAotCi1lbmQKLQotCi0jIFRoaXMgbW9kdWxlIHJlcXVpcmVzOiAjc3JjZGlyX3Jvb3QsICNvYmpkaXJfcm9vdCwgI3JlbHBhdGgKLW1vZHVsZSBIb29rU2NyaXB0QVBJCi0KLSAgZGVmIGdldF9jb25maWcoa2V5KQotICAgIEBjb25maWdba2V5XQotICBlbmQKLQotICBhbGlhcyBjb25maWcgZ2V0X2NvbmZpZwotCi0gICMgb2Jzb2xldGU6IHVzZSBtZXRhY29uZmlnIHRvIGNoYW5nZSBjb25maWd1cmF0aW9uCi0gIGRlZiBzZXRfY29uZmlnKGtleSwgdmFsKQotICAgIEBjb25maWdba2V5XSA9IHZhbAotICBlbmQKLQotICAjCi0gICMgc3JjZGlyL29iamRpciAod29ya3Mgb25seSBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkpCi0gICMKLQotICBkZWYgY3Vycl9zcmNkaXIKLSAgICAiI3tzcmNkaXJfcm9vdCgpfS8je3JlbHBhdGgoKX0iCi0gIGVuZAotCi0gIGRlZiBjdXJyX29iamRpcgotICAgICIje29iamRpcl9yb290KCl9LyN7cmVscGF0aCgpfSIKLSAgZW5kCi0KLSAgZGVmIHNyY2ZpbGUocGF0aCkKLSAgICAiI3tjdXJyX3NyY2RpcigpfS8je3BhdGh9IgotICBlbmQKLQotICBkZWYgc3JjZXhpc3Q/KHBhdGgpCi0gICAgRmlsZS5leGlzdD8oc3JjZmlsZShwYXRoKSkKLSAgZW5kCi0KLSAgZGVmIHNyY2RpcmVjdG9yeT8ocGF0aCkKLSAgICBGaWxlLmRpcj8oc3JjZmlsZShwYXRoKSkKLSAgZW5kCi0KLSAgZGVmIHNyY2ZpbGU/KHBhdGgpCi0gICAgRmlsZS5maWxlPyhzcmNmaWxlKHBhdGgpKQotICBlbmQKLQotICBkZWYgc3JjZW50cmllcyhwYXRoID0gJy4nKQotICAgIERpci5vcGVuKCIje2N1cnJfc3JjZGlyKCl9LyN7cGF0aH0iKSB7fGR8Ci0gICAgICByZXR1cm4gZC50b19hIC0gJXcoLiAuLikKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBzcmNmaWxlcyhwYXRoID0gJy4nKQotICAgIHNyY2VudHJpZXMocGF0aCkuc2VsZWN0IHt8Zm5hbWV8Ci0gICAgICBGaWxlLmZpbGU/KEZpbGUuam9pbihjdXJyX3NyY2RpcigpLCBwYXRoLCBmbmFtZSkpCi0gICAgfQotICBlbmQKLQotICBkZWYgc3JjZGlyZWN0b3JpZXMocGF0aCA9ICcuJykKLSAgICBzcmNlbnRyaWVzKHBhdGgpLnNlbGVjdCB7fGZuYW1lfAotICAgICAgRmlsZS5kaXI/KEZpbGUuam9pbihjdXJyX3NyY2RpcigpLCBwYXRoLCBmbmFtZSkpCi0gICAgfQotICBlbmQKLQotZW5kCi0KLQotY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXIKLQotICBWZXJzaW9uICAgPSAnMy40LjEnCi0gIENvcHlyaWdodCA9ICdDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raScKLQotICBUQVNLUyA9IFsKLSAgICBbICdhbGwnLCAgICAgICdkbyBjb25maWcsIHNldHVwLCB0aGVuIGluc3RhbGwnIF0sCi0gICAgWyAnY29uZmlnJywgICAnc2F2ZXMgeW91ciBjb25maWd1cmF0aW9ucycgXSwKLSAgICBbICdzaG93JywgICAgICdzaG93cyBjdXJyZW50IGNvbmZpZ3VyYXRpb24nIF0sCi0gICAgWyAnc2V0dXAnLCAgICAnY29tcGlsZXMgcnVieSBleHRlbnRpb25zIGFuZCBvdGhlcnMnIF0sCi0gICAgWyAnaW5zdGFsbCcsICAnaW5zdGFsbHMgZmlsZXMnIF0sCi0gICAgWyAndGVzdCcsICAgICAncnVuIGFsbCB0ZXN0cyBpbiB0ZXN0LycgXSwKLSAgICBbICdjbGVhbicsICAgICJkb2VzIGBtYWtlIGNsZWFuJyBmb3IgZWFjaCBleHRlbnRpb24iIF0sCi0gICAgWyAnZGlzdGNsZWFuJywiZG9lcyBgbWFrZSBkaXN0Y2xlYW4nIGZvciBlYWNoIGV4dGVudGlvbiIgXQotICBdCi0KLSAgZGVmIFRvcGxldmVsSW5zdGFsbGVyLmludm9rZQotICAgIGNvbmZpZyA9IENvbmZpZ1RhYmxlLm5ldyhsb2FkX3JiY29uZmlnKCkpCi0gICAgY29uZmlnLmxvYWRfc3RhbmRhcmRfZW50cmllcwotICAgIGNvbmZpZy5sb2FkX211bHRpcGFja2FnZV9lbnRyaWVzIGlmIG11bHRpcGFja2FnZT8KLSAgICBjb25maWcuZml4dXAKLSAgICBrbGFzcyA9IChtdWx0aXBhY2thZ2U/KCkgPyBUb3BsZXZlbEluc3RhbGxlck11bHRpIDogVG9wbGV2ZWxJbnN0YWxsZXIpCi0gICAga2xhc3MubmV3KEZpbGUuZGlybmFtZSgkMCksIGNvbmZpZykuaW52b2tlCi0gIGVuZAotCi0gIGRlZiBUb3BsZXZlbEluc3RhbGxlci5tdWx0aXBhY2thZ2U/Ci0gICAgRmlsZS5kaXI/KEZpbGUuZGlybmFtZSgkMCkgKyAnL3BhY2thZ2VzJykKLSAgZW5kCi0KLSAgZGVmIFRvcGxldmVsSW5zdGFsbGVyLmxvYWRfcmJjb25maWcKLSAgICBpZiBhcmcgPSBBUkdWLmRldGVjdCB7fGFyZ3wgL1xBLS1yYmNvbmZpZz0vID1+IGFyZyB9Ci0gICAgICBBUkdWLmRlbGV0ZShhcmcpCi0gICAgICBsb2FkIEZpbGUuZXhwYW5kX3BhdGgoYXJnLnNwbGl0KC89LywgMilbMV0pCi0gICAgICAkIi5wdXNoICdyYmNvbmZpZy5yYicKLSAgICBlbHNlCi0gICAgICByZXF1aXJlICdyYmNvbmZpZycKLSAgICBlbmQKLSAgICA6OkNvbmZpZzo6Q09ORklHCi0gIGVuZAotCi0gIGRlZiBpbml0aWFsaXplKGFyZGlyX3Jvb3QsIGNvbmZpZykKLSAgICBAYXJkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKGFyZGlyX3Jvb3QpCi0gICAgQGNvbmZpZyA9IGNvbmZpZwotICAgICMgY2FjaGUKLSAgICBAdmFsaWRfdGFza19yZSA9IG5pbAotICBlbmQKLQotICBkZWYgY29uZmlnKGtleSkKLSAgICBAY29uZmlnW2tleV0KLSAgZW5kCi0KLSAgZGVmIGluc3BlY3QKLSAgICAiIzwje3NlbGYuY2xhc3N9ICN7X19pZF9fKCl9PiIKLSAgZW5kCi0KLSAgZGVmIGludm9rZQotICAgIHJ1bl9tZXRhY29uZmlncwotICAgIGNhc2UgdGFzayA9IHBhcnNlYXJnX2dsb2JhbCgpCi0gICAgd2hlbiBuaWwsICdhbGwnCi0gICAgICBwYXJzZWFyZ19jb25maWcKLSAgICAgIGluaXRfaW5zdGFsbGVycwotICAgICAgZXhlY19jb25maWcKLSAgICAgIGV4ZWNfc2V0dXAKLSAgICAgIGV4ZWNfaW5zdGFsbAotICAgIGVsc2UKLSAgICAgIGNhc2UgdGFzawotICAgICAgd2hlbiAnY29uZmlnJywgJ3Rlc3QnCi0gICAgICAgIDsKLSAgICAgIHdoZW4gJ2NsZWFuJywgJ2Rpc3RjbGVhbicKLSAgICAgICAgQGNvbmZpZy5sb2FkX3NhdmVmaWxlIGlmIEZpbGUuZXhpc3Q/KEBjb25maWcuc2F2ZWZpbGUpCi0gICAgICBlbHNlCi0gICAgICAgIEBjb25maWcubG9hZF9zYXZlZmlsZQotICAgICAgZW5kCi0gICAgICBfX3NlbmRfXyAicGFyc2VhcmdfI3t0YXNrfSIKLSAgICAgIGluaXRfaW5zdGFsbGVycwotICAgICAgX19zZW5kX18gImV4ZWNfI3t0YXNrfSIKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJ1bl9tZXRhY29uZmlncwotICAgIEBjb25maWcubG9hZF9zY3JpcHQgIiN7QGFyZGlyfS9tZXRhY29uZmlnIgotICBlbmQKLQotICBkZWYgaW5pdF9pbnN0YWxsZXJzCi0gICAgQGluc3RhbGxlciA9IEluc3RhbGxlci5uZXcoQGNvbmZpZywgQGFyZGlyLCBGaWxlLmV4cGFuZF9wYXRoKCcuJykpCi0gIGVuZAotCi0gICMKLSAgIyBIb29rIFNjcmlwdCBBUEkgYmFzZXMKLSAgIwotCi0gIGRlZiBzcmNkaXJfcm9vdAotICAgIEBhcmRpcgotICBlbmQKLQotICBkZWYgb2JqZGlyX3Jvb3QKLSAgICAnLicKLSAgZW5kCi0KLSAgZGVmIHJlbHBhdGgKLSAgICAnLicKLSAgZW5kCi0KLSAgIwotICAjIE9wdGlvbiBQYXJzaW5nCi0gICMKLQotICBkZWYgcGFyc2VhcmdfZ2xvYmFsCi0gICAgd2hpbGUgYXJnID0gQVJHVi5zaGlmdAotICAgICAgY2FzZSBhcmcKLSAgICAgIHdoZW4gL1xBXHcrXHovCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnZhbGlkIHRhc2s6ICN7YXJnfSIgdW5sZXNzIHZhbGlkX3Rhc2s/KGFyZykKLSAgICAgICAgcmV0dXJuIGFyZwotICAgICAgd2hlbiAnLXEnLCAnLS1xdWlldCcKLSAgICAgICAgQGNvbmZpZy52ZXJib3NlID0gZmFsc2UKLSAgICAgIHdoZW4gJy0tdmVyYm9zZScKLSAgICAgICAgQGNvbmZpZy52ZXJib3NlID0gdHJ1ZQotICAgICAgd2hlbiAnLS1oZWxwJwotICAgICAgICBwcmludF91c2FnZSAkc3Rkb3V0Ci0gICAgICAgIGV4aXQgMAotICAgICAgd2hlbiAnLS12ZXJzaW9uJwotICAgICAgICBwdXRzICIje0ZpbGUuYmFzZW5hbWUoJDApfSB2ZXJzaW9uICN7VmVyc2lvbn0iCi0gICAgICAgIGV4aXQgMAotICAgICAgd2hlbiAnLS1jb3B5cmlnaHQnCi0gICAgICAgIHB1dHMgQ29weXJpZ2h0Ci0gICAgICAgIGV4aXQgMAotICAgICAgZWxzZQotICAgICAgICBzZXR1cF9yYl9lcnJvciAidW5rbm93biBnbG9iYWwgb3B0aW9uICcje2FyZ30nIgotICAgICAgZW5kCi0gICAgZW5kCi0gICAgbmlsCi0gIGVuZAotCi0gIGRlZiB2YWxpZF90YXNrPyh0KQotICAgIHZhbGlkX3Rhc2tfcmUoKSA9fiB0Ci0gIGVuZAotCi0gIGRlZiB2YWxpZF90YXNrX3JlCi0gICAgQHZhbGlkX3Rhc2tfcmUgfHw9IC9cQSg/OiN7VEFTS1MubWFwIHt8dGFzayxkZXNjfCB0YXNrIH0uam9pbignfCcpfSlcei8KLSAgZW5kCi0KLSAgZGVmIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgICB1bmxlc3MgQVJHVi5lbXB0eT8KLSAgICAgIHRhc2sgPSBjYWxsZXIoMCkuZmlyc3Quc2xpY2UoJXI8YHBhcnNlYXJnXyhcdyspJz4sIDEpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiI3t0YXNrfTogdW5rbm93biBvcHRpb25zOiAje0FSR1Yuam9pbignICcpfSIKLSAgICBlbmQKLSAgZW5kCi0KLSAgYWxpYXMgcGFyc2Vhcmdfc2hvdyAgICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX3NldHVwICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICBhbGlhcyBwYXJzZWFyZ190ZXN0ICAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgYWxpYXMgcGFyc2VhcmdfY2xlYW4gICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX2Rpc3RjbGVhbiAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotCi0gIGRlZiBwYXJzZWFyZ19jb25maWcKLSAgICBldmFsb3B0ID0gW10KLSAgICBzZXQgPSBbXQotICAgIEBjb25maWcuY29uZmlnX29wdCA9IFtdCi0gICAgd2hpbGUgaSA9IEFSR1Yuc2hpZnQKLSAgICAgIGlmIC9cQS0tP1x6LyA9fiBpCi0gICAgICAgIEBjb25maWcuY29uZmlnX29wdCA9IEFSR1YuZHVwCi0gICAgICAgIGJyZWFrCi0gICAgICBlbmQKLSAgICAgIG5hbWUsIHZhbHVlID0gKkBjb25maWcucGFyc2Vfb3B0KGkpCi0gICAgICBpZiBAY29uZmlnLnZhbHVlX2NvbmZpZz8obmFtZSkKLSAgICAgICAgQGNvbmZpZ1tuYW1lXSA9IHZhbHVlCi0gICAgICBlbHNlCi0gICAgICAgIGV2YWxvcHQucHVzaCBbbmFtZSwgdmFsdWVdCi0gICAgICBlbmQKLSAgICAgIHNldC5wdXNoIG5hbWUKLSAgICBlbmQKLSAgICBldmFsb3B0LmVhY2ggZG8gfG5hbWUsIHZhbHVlfAotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuZXZhbHVhdGUgdmFsdWUsIEBjb25maWcKLSAgICBlbmQKLSAgICAjIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQKLSAgICBzZXQuZWFjaCBkbyB8bnwKLSAgICAgIEBjb25maWdbbl0gaWYgQGNvbmZpZy52YWx1ZV9jb25maWc/KG4pCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBwYXJzZWFyZ19pbnN0YWxsCi0gICAgQGNvbmZpZy5ub19oYXJtID0gZmFsc2UKLSAgICBAY29uZmlnLmluc3RhbGxfcHJlZml4ID0gJycKLSAgICB3aGlsZSBhID0gQVJHVi5zaGlmdAotICAgICAgY2FzZSBhCi0gICAgICB3aGVuICctLW5vLWhhcm0nCi0gICAgICAgIEBjb25maWcubm9faGFybSA9IHRydWUKLSAgICAgIHdoZW4gL1xBLS1wcmVmaXg9LwotICAgICAgICBwYXRoID0gYS5zcGxpdCgvPS8sIDIpWzFdCi0gICAgICAgIHBhdGggPSBGaWxlLmV4cGFuZF9wYXRoKHBhdGgpIHVubGVzcyBwYXRoWzAsMV0gPT0gJy8nCi0gICAgICAgIEBjb25maWcuaW5zdGFsbF9wcmVmaXggPSBwYXRoCi0gICAgICBlbHNlCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnN0YWxsOiB1bmtub3duIG9wdGlvbiAje2F9IgotICAgICAgZW5kCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBwcmludF91c2FnZShvdXQpCi0gICAgb3V0LnB1dHMgJ1R5cGljYWwgSW5zdGFsbGF0aW9uIFByb2NlZHVyZTonCi0gICAgb3V0LnB1dHMgIiAgJCBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gY29uZmlnIgotICAgIG91dC5wdXRzICIgICQgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IHNldHVwIgotICAgIG91dC5wdXRzICIgICMgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IGluc3RhbGwgKG1heSByZXF1aXJlIHJvb3QgcHJpdmlsZWdlKSIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdEZXRhaWxlZCBVc2FnZTonCi0gICAgb3V0LnB1dHMgIiAgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IDxnbG9iYWwgb3B0aW9uPiIKLSAgICBvdXQucHV0cyAiICBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gWzxnbG9iYWwgb3B0aW9ucz5dIDx0YXNrPiBbPHRhc2sgb3B0aW9ucz5dIgotCi0gICAgZm10ID0gIiAgJS0yNHMgJXNcbiIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdHbG9iYWwgb3B0aW9uczonCi0gICAgb3V0LnByaW50ZiBmbXQsICctcSwtLXF1aWV0JywgICAnc3VwcHJlc3MgbWVzc2FnZSBvdXRwdXRzJwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS12ZXJib3NlJywgJ291dHB1dCBtZXNzYWdlcyB2ZXJib3NlbHknCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLWhlbHAnLCAgICAncHJpbnQgdGhpcyBtZXNzYWdlJwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS12ZXJzaW9uJywgJ3ByaW50IHZlcnNpb24gYW5kIHF1aXQnCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLWNvcHlyaWdodCcsICAncHJpbnQgY29weXJpZ2h0IGFuZCBxdWl0JwotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ1Rhc2tzOicKLSAgICBUQVNLUy5lYWNoIGRvIHxuYW1lLCBkZXNjfAotICAgICAgb3V0LnByaW50ZiBmbXQsIG5hbWUsIGRlc2MKLSAgICBlbmQKLQotICAgIGZtdCA9ICIgICUtMjRzICVzIFslc11cbiIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdPcHRpb25zIGZvciBDT05GSUcgb3IgQUxMOicKLSAgICBAY29uZmlnLmVhY2ggZG8gfGl0ZW18Ci0gICAgICBvdXQucHJpbnRmIGZtdCwgaXRlbS5oZWxwX29wdCwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5oZWxwX2RlZmF1bHQKLSAgICBlbmQKLSAgICBvdXQucHJpbnRmIGZtdCwgJy0tcmJjb25maWc9cGF0aCcsICdyYmNvbmZpZy5yYiB0byBsb2FkJywicnVubmluZyBydWJ5J3MiCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnT3B0aW9ucyBmb3IgSU5TVEFMTDonCi0gICAgb3V0LnByaW50ZiBmbXQsICctLW5vLWhhcm0nLCAnb25seSBkaXNwbGF5IHdoYXQgdG8gZG8gaWYgZ2l2ZW4nLCAnb2ZmJwotICAgIG91dC5wcmludGYgZm10LCAnLS1wcmVmaXg9cGF0aCcsICAnaW5zdGFsbCBwYXRoIHByZWZpeCcsICcnCi0gICAgb3V0LnB1dHMKLSAgZW5kCi0KLSAgIwotICAjIFRhc2sgSGFuZGxlcnMKLSAgIwotCi0gIGRlZiBleGVjX2NvbmZpZwotICAgIEBpbnN0YWxsZXIuZXhlY19jb25maWcKLSAgICBAY29uZmlnLnNhdmUgICAjIG11c3QgYmUgZmluYWwKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBAaW5zdGFsbGVyLmV4ZWNfc2V0dXAKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfaW5zdGFsbAotICAgIEBpbnN0YWxsZXIuZXhlY19pbnN0YWxsCi0gIGVuZAotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICBAaW5zdGFsbGVyLmV4ZWNfdGVzdAotICBlbmQKLQotICBkZWYgZXhlY19zaG93Ci0gICAgQGNvbmZpZy5lYWNoIGRvIHxpfAotICAgICAgcHJpbnRmICIlLTIwcyAlc1xuIiwgaS5uYW1lLCBpLnZhbHVlIGlmIGkudmFsdWU/Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgQGluc3RhbGxlci5leGVjX2NsZWFuCi0gIGVuZAotCi0gIGRlZiBleGVjX2Rpc3RjbGVhbgotICAgIEBpbnN0YWxsZXIuZXhlY19kaXN0Y2xlYW4KLSAgZW5kCi0KLWVuZCAgICMgY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXIKLQotCi1jbGFzcyBUb3BsZXZlbEluc3RhbGxlck11bHRpIDwgVG9wbGV2ZWxJbnN0YWxsZXIKLQotICBpbmNsdWRlIEZpbGVPcGVyYXRpb25zCi0KLSAgZGVmIGluaXRpYWxpemUoYXJkaXJfcm9vdCwgY29uZmlnKQotICAgIHN1cGVyCi0gICAgQHBhY2thZ2VzID0gZGlyZWN0b3JpZXNfb2YoIiN7QGFyZGlyfS9wYWNrYWdlcyIpCi0gICAgcmFpc2UgJ25vIHBhY2thZ2UgZXhpc3RzJyBpZiBAcGFja2FnZXMuZW1wdHk/Ci0gICAgQHJvb3RfaW5zdGFsbGVyID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLCBAYXJkaXIsIEZpbGUuZXhwYW5kX3BhdGgoJy4nKSkKLSAgZW5kCi0KLSAgZGVmIHJ1bl9tZXRhY29uZmlncwotICAgIEBjb25maWcubG9hZF9zY3JpcHQgIiN7QGFyZGlyfS9tZXRhY29uZmlnIiwgc2VsZgotICAgIEBwYWNrYWdlcy5lYWNoIGRvIHxuYW1lfAotICAgICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7bmFtZX0vbWV0YWNvbmZpZyIKLSAgICBlbmQKLSAgZW5kCi0KLSAgYXR0cl9yZWFkZXIgOnBhY2thZ2VzCi0KLSAgZGVmIHBhY2thZ2VzPShsaXN0KQotICAgIHJhaXNlICdwYWNrYWdlIGxpc3QgaXMgZW1wdHknIGlmIGxpc3QuZW1wdHk/Ci0gICAgbGlzdC5lYWNoIGRvIHxuYW1lfAotICAgICAgcmFpc2UgImRpcmVjdG9yeSBwYWNrYWdlcy8je25hbWV9IGRvZXMgbm90IGV4aXN0IlwKLSAgICAgICAgICAgICAgdW5sZXNzIEZpbGUuZGlyPygiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7bmFtZX0iKQotICAgIGVuZAotICAgIEBwYWNrYWdlcyA9IGxpc3QKLSAgZW5kCi0KLSAgZGVmIGluaXRfaW5zdGFsbGVycwotICAgIEBpbnN0YWxsZXJzID0ge30KLSAgICBAcGFja2FnZXMuZWFjaCBkbyB8cGFja3wKLSAgICAgIEBpbnN0YWxsZXJzW3BhY2tdID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiN7QGFyZGlyfS9wYWNrYWdlcy8je3BhY2t9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlcy8je3BhY2t9IikKLSAgICBlbmQKLSAgICB3aXRoICAgID0gZXh0cmFjdF9zZWxlY3Rpb24oY29uZmlnKCd3aXRoJykpCi0gICAgd2l0aG91dCA9IGV4dHJhY3Rfc2VsZWN0aW9uKGNvbmZpZygnd2l0aG91dCcpKQotICAgIEBzZWxlY3RlZCA9IEBpbnN0YWxsZXJzLmtleXMuc2VsZWN0IHt8bmFtZXwKLSAgICAgICAgICAgICAgICAgICh3aXRoLmVtcHR5PyBvciB3aXRoLmluY2x1ZGU/KG5hbWUpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCB3aXRob3V0LmluY2x1ZGU/KG5hbWUpCi0gICAgICAgICAgICAgICAgfQotICBlbmQKLQotICBkZWYgZXh0cmFjdF9zZWxlY3Rpb24obGlzdCkKLSAgICBhID0gbGlzdC5zcGxpdCgvLC8pCi0gICAgYS5lYWNoIGRvIHxuYW1lfAotICAgICAgc2V0dXBfcmJfZXJyb3IgIm5vIHN1Y2ggcGFja2FnZTogI3tuYW1lfSIgIHVubGVzcyBAaW5zdGFsbGVycy5rZXk/KG5hbWUpCi0gICAgZW5kCi0gICAgYQotICBlbmQKLQotICBkZWYgcHJpbnRfdXNhZ2UoZikKLSAgICBzdXBlcgotICAgIGYucHV0cyAnSW5sdWRlZCBwYWNrYWdlczonCi0gICAgZi5wdXRzICcgICcgKyBAcGFja2FnZXMuc29ydC5qb2luKCcgJykKLSAgICBmLnB1dHMKLSAgZW5kCi0KLSAgIwotICAjIFRhc2sgSGFuZGxlcnMKLSAgIwotCi0gIGRlZiBleGVjX2NvbmZpZwotICAgIHJ1bl9ob29rICdwcmUtY29uZmlnJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19jb25maWcgfQotICAgIHJ1bl9ob29rICdwb3N0LWNvbmZpZycKLSAgICBAY29uZmlnLnNhdmUgICAjIG11c3QgYmUgZmluYWwKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBydW5faG9vayAncHJlLXNldHVwJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19zZXR1cCB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3Qtc2V0dXAnCi0gIGVuZAotCi0gIGRlZiBleGVjX2luc3RhbGwKLSAgICBydW5faG9vayAncHJlLWluc3RhbGwnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2luc3RhbGwgfQotICAgIHJ1bl9ob29rICdwb3N0LWluc3RhbGwnCi0gIGVuZAotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICBydW5faG9vayAncHJlLXRlc3QnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX3Rlc3QgfQotICAgIHJ1bl9ob29rICdwb3N0LXRlc3QnCi0gIGVuZAotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcnVuX2hvb2sgJ3ByZS1jbGVhbicKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfY2xlYW4gfQotICAgIHJ1bl9ob29rICdwb3N0LWNsZWFuJwotICBlbmQKLQotICBkZWYgZXhlY19kaXN0Y2xlYW4KLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBydW5faG9vayAncHJlLWRpc3RjbGVhbicKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfZGlzdGNsZWFuIH0KLSAgICBydW5faG9vayAncG9zdC1kaXN0Y2xlYW4nCi0gIGVuZAotCi0gICMKLSAgIyBsaWIKLSAgIwotCi0gIGRlZiBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMKLSAgICBEaXIubWtkaXIgJ3BhY2thZ2VzJyB1bmxlc3MgRmlsZS5kaXI/KCdwYWNrYWdlcycpCi0gICAgQHNlbGVjdGVkLmVhY2ggZG8gfHBhY2t8Ci0gICAgICAkc3RkZXJyLnB1dHMgIlByb2Nlc3NpbmcgdGhlIHBhY2thZ2UgYCN7cGFja30nIC4uLiIgaWYgdmVyYm9zZT8KLSAgICAgIERpci5ta2RpciAicGFja2FnZXMvI3twYWNrfSIgdW5sZXNzIEZpbGUuZGlyPygicGFja2FnZXMvI3twYWNrfSIpCi0gICAgICBEaXIuY2hkaXIgInBhY2thZ2VzLyN7cGFja30iCi0gICAgICB5aWVsZCBAaW5zdGFsbGVyc1twYWNrXQotICAgICAgRGlyLmNoZGlyICcuLi8uLicKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJ1bl9ob29rKGlkKQotICAgIEByb290X2luc3RhbGxlci5ydW5faG9vayBpZAotICBlbmQKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiB2ZXJib3NlPwotICAgIEBjb25maWcudmVyYm9zZT8KLSAgZW5kCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgbm9faGFybT8KLSAgICBAY29uZmlnLm5vX2hhcm0/Ci0gIGVuZAotCi1lbmQgICAjIGNsYXNzIFRvcGxldmVsSW5zdGFsbGVyTXVsdGkKLQotCi1jbGFzcyBJbnN0YWxsZXIKLQotICBGSUxFVFlQRVMgPSAldyggYmluIGxpYiBleHQgZGF0YSBjb25mIG1hbiApCi0KLSAgaW5jbHVkZSBGaWxlT3BlcmF0aW9ucwotICBpbmNsdWRlIEhvb2tTY3JpcHRBUEkKLQotICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIHNyY3Jvb3QsIG9ianJvb3QpCi0gICAgQGNvbmZpZyA9IGNvbmZpZwotICAgIEBzcmNkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKHNyY3Jvb3QpCi0gICAgQG9iamRpciA9IEZpbGUuZXhwYW5kX3BhdGgob2Jqcm9vdCkKLSAgICBAY3VycmRpciA9ICcuJwotICBlbmQKLQotICBkZWYgaW5zcGVjdAotICAgICIjPCN7c2VsZi5jbGFzc30gI3tGaWxlLmJhc2VuYW1lKEBzcmNkaXIpfT4iCi0gIGVuZAotCi0gIGRlZiBub29wKHJlbCkKLSAgZW5kCi0KLSAgIwotICAjIEhvb2sgU2NyaXB0IEFQSSBiYXNlIG1ldGhvZHMKLSAgIwotCi0gIGRlZiBzcmNkaXJfcm9vdAotICAgIEBzcmNkaXIKLSAgZW5kCi0KLSAgZGVmIG9iamRpcl9yb290Ci0gICAgQG9iamRpcgotICBlbmQKLQotICBkZWYgcmVscGF0aAotICAgIEBjdXJyZGlyCi0gIGVuZAotCi0gICMKLSAgIyBDb25maWcgQWNjZXNzCi0gICMKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiB2ZXJib3NlPwotICAgIEBjb25maWcudmVyYm9zZT8KLSAgZW5kCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgbm9faGFybT8KLSAgICBAY29uZmlnLm5vX2hhcm0/Ci0gIGVuZAotCi0gIGRlZiB2ZXJib3NlX29mZgotICAgIGJlZ2luCi0gICAgICBzYXZlLCBAY29uZmlnLnZlcmJvc2UgPSBAY29uZmlnLnZlcmJvc2U/LCBmYWxzZQotICAgICAgeWllbGQKLSAgICBlbnN1cmUKLSAgICAgIEBjb25maWcudmVyYm9zZSA9IHNhdmUKLSAgICBlbmQKLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgY29uZmlnCi0gICMKLQotICBkZWYgZXhlY19jb25maWcKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2NvbmZpZycKLSAgZW5kCi0KLSAgYWxpYXMgY29uZmlnX2Rpcl9iaW4gbm9vcAotICBhbGlhcyBjb25maWdfZGlyX2xpYiBub29wCi0KLSAgZGVmIGNvbmZpZ19kaXJfZXh0KHJlbCkKLSAgICBleHRjb25mIGlmIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgZW5kCi0KLSAgYWxpYXMgY29uZmlnX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgY29uZmlnX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgY29uZmlnX2Rpcl9tYW4gbm9vcAotCi0gIGRlZiBleHRjb25mCi0gICAgcnVieSAiI3tjdXJyX3NyY2RpcigpfS9leHRjb25mLnJiIiwgKkBjb25maWcuY29uZmlnX29wdAotICBlbmQKLQotICAjCi0gICMgVEFTSyBzZXR1cAotICAjCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ3NldHVwJwotICBlbmQKLQotICBkZWYgc2V0dXBfZGlyX2JpbihyZWwpCi0gICAgZmlsZXNfb2YoY3Vycl9zcmNkaXIoKSkuZWFjaCBkbyB8Zm5hbWV8Ci0gICAgICB1cGRhdGVfc2hlYmFuZ19saW5lICIje2N1cnJfc3JjZGlyKCl9LyN7Zm5hbWV9IgotICAgIGVuZAotICBlbmQKLQotICBhbGlhcyBzZXR1cF9kaXJfbGliIG5vb3AKLQotICBkZWYgc2V0dXBfZGlyX2V4dChyZWwpCi0gICAgbWFrZSBpZiBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gIGVuZAotCi0gIGFsaWFzIHNldHVwX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgc2V0dXBfZGlyX2NvbmYgbm9vcAotICBhbGlhcyBzZXR1cF9kaXJfbWFuIG5vb3AKLQotICBkZWYgdXBkYXRlX3NoZWJhbmdfbGluZShwYXRoKQotICAgIHJldHVybiBpZiBub19oYXJtPwotICAgIHJldHVybiBpZiBjb25maWcoJ3NoZWJhbmcnKSA9PSAnbmV2ZXInCi0gICAgb2xkID0gU2hlYmFuZy5sb2FkKHBhdGgpCi0gICAgaWYgb2xkCi0gICAgICAkc3RkZXJyLnB1dHMgIndhcm5pbmc6ICN7cGF0aH06IFNoZWJhbmcgbGluZSBpbmNsdWRlcyB0b28gbWFueSBhcmdzLiAgSXQgaXMgbm90IHBvcnRhYmxlIGFuZCB5b3VyIHByb2dyYW0gbWF5IG5vdCB3b3JrLiIgaWYgb2xkLmFyZ3Muc2l6ZSA+IDEKLSAgICAgIG5ldyA9IG5ld19zaGViYW5nKG9sZCkKLSAgICAgIHJldHVybiBpZiBuZXcudG9fcyA9PSBvbGQudG9fcwotICAgIGVsc2UKLSAgICAgIHJldHVybiB1bmxlc3MgY29uZmlnKCdzaGViYW5nJykgPT0gJ2FsbCcKLSAgICAgIG5ldyA9IFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSkKLSAgICBlbmQKLSAgICAkc3RkZXJyLnB1dHMgInVwZGF0aW5nIHNoZWJhbmc6ICN7RmlsZS5iYXNlbmFtZShwYXRoKX0iIGlmIHZlcmJvc2U/Ci0gICAgb3Blbl9hdG9taWNfd3JpdGVyKHBhdGgpIHt8b3V0cHV0fAotICAgICAgRmlsZS5vcGVuKHBhdGgsICdyYicpIHt8ZnwKLSAgICAgICAgZi5nZXRzIGlmIG9sZCAgICMgZGlzY2FyZAotICAgICAgICBvdXRwdXQucHV0cyBuZXcudG9fcwotICAgICAgICBvdXRwdXQucHJpbnQgZi5yZWFkCi0gICAgICB9Ci0gICAgfQotICBlbmQKLQotICBkZWYgbmV3X3NoZWJhbmcob2xkKQotICAgIGlmIC9cQXJ1YnkvID1+IEZpbGUuYmFzZW5hbWUob2xkLmNtZCkKLSAgICAgIFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSwgb2xkLmFyZ3MpCi0gICAgZWxzaWYgRmlsZS5iYXNlbmFtZShvbGQuY21kKSA9PSAnZW52JyBhbmQgb2xkLmFyZ3MuZmlyc3QgPT0gJ3J1YnknCi0gICAgICBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJyksIG9sZC5hcmdzWzEuLi0xXSkKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb2xkIHVubGVzcyBjb25maWcoJ3NoZWJhbmcnKSA9PSAnYWxsJwotICAgICAgU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgb3Blbl9hdG9taWNfd3JpdGVyKHBhdGgsICZibG9jaykKLSAgICB0bXBmaWxlID0gRmlsZS5iYXNlbmFtZShwYXRoKSArICcudG1wJwotICAgIGJlZ2luCi0gICAgICBGaWxlLm9wZW4odG1wZmlsZSwgJ3diJywgJmJsb2NrKQotICAgICAgRmlsZS5yZW5hbWUgdG1wZmlsZSwgRmlsZS5iYXNlbmFtZShwYXRoKQotICAgIGVuc3VyZQotICAgICAgRmlsZS51bmxpbmsgdG1wZmlsZSBpZiBGaWxlLmV4aXN0Pyh0bXBmaWxlKQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBTaGViYW5nCi0gICAgZGVmIFNoZWJhbmcubG9hZChwYXRoKQotICAgICAgbGluZSA9IG5pbAotICAgICAgRmlsZS5vcGVuKHBhdGgpIHt8ZnwKLSAgICAgICAgbGluZSA9IGYuZ2V0cwotICAgICAgfQotICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgL1xBIyEvID1+IGxpbmUKLSAgICAgIHBhcnNlKGxpbmUpCi0gICAgZW5kCi0KLSAgICBkZWYgU2hlYmFuZy5wYXJzZShsaW5lKQotICAgICAgY21kLCAqYXJncyA9ICpsaW5lLnN0cmlwLnN1YigvXEFcIyEvLCAnJykuc3BsaXQoJyAnKQotICAgICAgbmV3KGNtZCwgYXJncykKLSAgICBlbmQKLQotICAgIGRlZiBpbml0aWFsaXplKGNtZCwgYXJncyA9IFtdKQotICAgICAgQGNtZCA9IGNtZAotICAgICAgQGFyZ3MgPSBhcmdzCi0gICAgZW5kCi0KLSAgICBhdHRyX3JlYWRlciA6Y21kCi0gICAgYXR0cl9yZWFkZXIgOmFyZ3MKLQotICAgIGRlZiB0b19zCi0gICAgICAiIyEgI3tAY21kfSIgKyAoQGFyZ3MuZW1wdHk/ID8gJycgOiAiICN7QGFyZ3Muam9pbignICcpfSIpCi0gICAgZW5kCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGluc3RhbGwKLSAgIwotCi0gIGRlZiBleGVjX2luc3RhbGwKLSAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2luc3RhbGwnCi0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9iaW4ocmVsKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdiaW5kaXInKX0vI3tyZWx9IiwgMDc1NQotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfbGliKHJlbCkKLSAgICBpbnN0YWxsX2ZpbGVzIGxpYmZpbGVzKCksICIje2NvbmZpZygncmJkaXInKX0vI3tyZWx9IiwgMDY0NAotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfZXh0KHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgICBpbnN0YWxsX2ZpbGVzIHJ1YnlleHRlbnRpb25zKCcuJyksCi0gICAgICAgICAgICAgICAgICAiI3tjb25maWcoJ3NvZGlyJyl9LyN7RmlsZS5kaXJuYW1lKHJlbCl9IiwKLSAgICAgICAgICAgICAgICAgIDA1NTUKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2RhdGEocmVsKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdkYXRhZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2NvbmYocmVsKQotICAgICMgRklYTUU6IHNob3VsZCBub3QgcmVtb3ZlIGN1cnJlbnQgY29uZmlnIGZpbGVzCi0gICAgIyAocmVuYW1lIHByZXZpb3VzIGZpbGUgdG8gLm9sZC8ub3JnKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdzeXNjb25mZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX21hbihyZWwpCi0gICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ21hbmRpcicpfS8je3JlbH0iLCAwNjQ0Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2ZpbGVzKGxpc3QsIGRlc3QsIG1vZGUpCi0gICAgbWtkaXJfcCBkZXN0LCBAY29uZmlnLmluc3RhbGxfcHJlZml4Ci0gICAgbGlzdC5lYWNoIGRvIHxmbmFtZXwKLSAgICAgIGluc3RhbGwgZm5hbWUsIGRlc3QsIG1vZGUsIEBjb25maWcuaW5zdGFsbF9wcmVmaXgKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIGxpYmZpbGVzCi0gICAgZ2xvYl9yZWplY3QoJXcoKi55ICoub3V0cHV0KSwgdGFyZ2V0ZmlsZXMoKSkKLSAgZW5kCi0KLSAgZGVmIHJ1YnlleHRlbnRpb25zKGRpcikKLSAgICBlbnRzID0gZ2xvYl9zZWxlY3QoIiouI3tAY29uZmlnLmRsbGV4dH0iLCB0YXJnZXRmaWxlcygpKQotICAgIGlmIGVudHMuZW1wdHk/Ci0gICAgICBzZXR1cF9yYl9lcnJvciAibm8gcnVieSBleHRlbnRpb24gZXhpc3RzOiAncnVieSAjeyQwfSBzZXR1cCcgZmlyc3QiCi0gICAgZW5kCi0gICAgZW50cwotICBlbmQKLQotICBkZWYgdGFyZ2V0ZmlsZXMKLSAgICBtYXBkaXIoZXhpc3RmaWxlcygpIC0gaG9va2ZpbGVzKCkpCi0gIGVuZAotCi0gIGRlZiBtYXBkaXIoZW50cykKLSAgICBlbnRzLm1hcCB7fGVudHwKLSAgICAgIGlmIEZpbGUuZXhpc3Q/KGVudCkKLSAgICAgIHRoZW4gZW50ICAgICAgICAgICAgICAgICAgICAgICAgICMgb2JqZGlyCi0gICAgICBlbHNlICIje2N1cnJfc3JjZGlyKCl9LyN7ZW50fSIgICAjIHNyY2RpcgotICAgICAgZW5kCi0gICAgfQotICBlbmQKLQotICAjIHBpY2tlZCB1cCBtYW55IGVudHJpZXMgZnJvbSBjdnMtMS4xMS4xL3NyYy9pZ25vcmUuYwotICBKVU5LX0ZJTEVTID0gJXcoCi0gICAgY29yZSBSQ1NMT0cgdGFncyBUQUdTIC5tYWtlLnN0YXRlCi0gICAgLm5zZV9kZXBpbmZvICMqIC4jKiBjdnNsb2cuKiAsKiAuZGVsLSogKi5vbGIKLSAgICAqfiAqLm9sZCAqLmJhayAqLkJBSyAqLm9yaWcgKi5yZWogXyQqICokCi0KLSAgICAqLm9yZyAqLmluIC4qCi0gICkKLQotICBkZWYgZXhpc3RmaWxlcwotICAgIGdsb2JfcmVqZWN0KEpVTktfRklMRVMsIChmaWxlc19vZihjdXJyX3NyY2RpcigpKSB8IGZpbGVzX29mKCcuJykpKQotICBlbmQKLQotICBkZWYgaG9va2ZpbGVzCi0gICAgJXcoIHByZS0lcyBwb3N0LSVzIHByZS0lcy5yYiBwb3N0LSVzLnJiICkubWFwIHt8Zm10fAotICAgICAgJXcoIGNvbmZpZyBzZXR1cCBpbnN0YWxsIGNsZWFuICkubWFwIHt8dHwgc3ByaW50ZihmbXQsIHQpIH0KLSAgICB9LmZsYXR0ZW4KLSAgZW5kCi0KLSAgZGVmIGdsb2Jfc2VsZWN0KHBhdCwgZW50cykKLSAgICByZSA9IGdsb2JzMnJlKFtwYXRdKQotICAgIGVudHMuc2VsZWN0IHt8ZW50fCByZSA9fiBlbnQgfQotICBlbmQKLQotICBkZWYgZ2xvYl9yZWplY3QocGF0cywgZW50cykKLSAgICByZSA9IGdsb2JzMnJlKHBhdHMpCi0gICAgZW50cy5yZWplY3Qge3xlbnR8IHJlID1+IGVudCB9Ci0gIGVuZAotCi0gIEdMT0IyUkVHRVggPSB7Ci0gICAgJy4nID0+ICdcLicsCi0gICAgJyQnID0+ICdcJCcsCi0gICAgJyMnID0+ICdcIycsCi0gICAgJyonID0+ICcuKicKLSAgfQotCi0gIGRlZiBnbG9iczJyZShwYXRzKQotICAgIC9cQSg/OiN7Ci0gICAgICBwYXRzLm1hcCB7fHBhdHwgcGF0LmdzdWIoL1tcLlwkXCNcKl0vKSB7fGNofCBHTE9CMlJFR0VYW2NoXSB9IH0uam9pbignfCcpCi0gICAgfSlcei8KLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgdGVzdAotICAjCi0KLSAgVEVTVERJUiA9ICd0ZXN0JwotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICB1bmxlc3MgRmlsZS5kaXJlY3Rvcnk/KCd0ZXN0JykKLSAgICAgICRzdGRlcnIucHV0cyAnbm8gdGVzdCBpbiB0aGlzIHBhY2thZ2UnIGlmIHZlcmJvc2U/Ci0gICAgICByZXR1cm4KLSAgICBlbmQKLSAgICAkc3RkZXJyLnB1dHMgJ1J1bm5pbmcgdGVzdHMuLi4nIGlmIHZlcmJvc2U/Ci0gICAgYmVnaW4KLSAgICAgIHJlcXVpcmUgJ3Rlc3QvdW5pdCcKLSAgICByZXNjdWUgTG9hZEVycm9yCi0gICAgICBzZXR1cF9yYl9lcnJvciAndGVzdC91bml0IGNhbm5vdCBsb2FkZWQuICBZb3UgbmVlZCBSdWJ5IDEuOCBvciBsYXRlciB0byBpbnZva2UgdGhpcyB0YXNrLicKLSAgICBlbmQKLSAgICBydW5uZXIgPSBUZXN0OjpVbml0OjpBdXRvUnVubmVyLm5ldyh0cnVlKQotICAgIHJ1bm5lci50b19ydW4gPDwgVEVTVERJUgotICAgIHJ1bm5lci5ydW4KLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgY2xlYW4KLSAgIwotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdjbGVhbicKLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKLSAgZW5kCi0KLSAgYWxpYXMgY2xlYW5fZGlyX2JpbiBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9saWIgbm9vcAotICBhbGlhcyBjbGVhbl9kaXJfZGF0YSBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgY2xlYW5fZGlyX21hbiBub29wCi0KLSAgZGVmIGNsZWFuX2Rpcl9leHQocmVsKQotICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICAgIG1ha2UgJ2NsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGRpc3RjbGVhbgotICAjCi0KLSAgZGVmIGV4ZWNfZGlzdGNsZWFuCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdkaXN0Y2xlYW4nCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcm1fZiAnSW5zdGFsbGVkRmlsZXMnCi0gIGVuZAotCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfYmluIG5vb3AKLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9saWIgbm9vcAotCi0gIGRlZiBkaXN0Y2xlYW5fZGlyX2V4dChyZWwpCi0gICAgcmV0dXJuIHVubGVzcyBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gICAgbWFrZSAnZGlzdGNsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCi0gIGVuZAotCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfZGF0YSBub29wCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfY29uZiBub29wCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfbWFuIG5vb3AKLQotICAjCi0gICMgVHJhdmVyc2luZwotICAjCi0KLSAgZGVmIGV4ZWNfdGFza190cmF2ZXJzZSh0YXNrKQotICAgIHJ1bl9ob29rICJwcmUtI3t0YXNrfSIKLSAgICBGSUxFVFlQRVMuZWFjaCBkbyB8dHlwZXwKLSAgICAgIGlmIHR5cGUgPT0gJ2V4dCcgYW5kIGNvbmZpZygnd2l0aG91dC1leHQnKSA9PSAneWVzJwotICAgICAgICAkc3RkZXJyLnB1dHMgJ3NraXBwaW5nIGV4dC8qIGJ5IHVzZXIgb3B0aW9uJyBpZiB2ZXJib3NlPwotICAgICAgICBuZXh0Ci0gICAgICBlbmQKLSAgICAgIHRyYXZlcnNlIHRhc2ssIHR5cGUsICIje3Rhc2t9X2Rpcl8je3R5cGV9IgotICAgIGVuZAotICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCi0gIGVuZAotCi0gIGRlZiB0cmF2ZXJzZSh0YXNrLCByZWwsIG1pZCkKLSAgICBkaXZlX2ludG8ocmVsKSB7Ci0gICAgICBydW5faG9vayAicHJlLSN7dGFza30iCi0gICAgICBfX3NlbmRfXyBtaWQsIHJlbC5zdWIoJXJbXEEuKj8oPzovfFx6KV0sICcnKQotICAgICAgZGlyZWN0b3JpZXNfb2YoY3Vycl9zcmNkaXIoKSkuZWFjaCBkbyB8ZHwKLSAgICAgICAgdHJhdmVyc2UgdGFzaywgIiN7cmVsfS8je2R9IiwgbWlkCi0gICAgICBlbmQKLSAgICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCi0gICAgfQotICBlbmQKLQotICBkZWYgZGl2ZV9pbnRvKHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIEZpbGUuZGlyPygiI3tAc3JjZGlyfS8je3JlbH0iKQotCi0gICAgZGlyID0gRmlsZS5iYXNlbmFtZShyZWwpCi0gICAgRGlyLm1rZGlyIGRpciB1bmxlc3MgRmlsZS5kaXI/KGRpcikKLSAgICBwcmV2ZGlyID0gRGlyLnB3ZAotICAgIERpci5jaGRpciBkaXIKLSAgICAkc3RkZXJyLnB1dHMgJy0tLT4gJyArIHJlbCBpZiB2ZXJib3NlPwotICAgIEBjdXJyZGlyID0gcmVsCi0gICAgeWllbGQKLSAgICBEaXIuY2hkaXIgcHJldmRpcgotICAgICRzdGRlcnIucHV0cyAnPC0tLSAnICsgcmVsIGlmIHZlcmJvc2U/Ci0gICAgQGN1cnJkaXIgPSBGaWxlLmRpcm5hbWUocmVsKQotICBlbmQKLQotICBkZWYgcnVuX2hvb2soaWQpCi0gICAgcGF0aCA9IFsgIiN7Y3Vycl9zcmNkaXIoKX0vI3tpZH0iLAotICAgICAgICAgICAgICIje2N1cnJfc3JjZGlyKCl9LyN7aWR9LnJiIiBdLmRldGVjdCB7fGNhbmR8IEZpbGUuZmlsZT8oY2FuZCkgfQotICAgIHJldHVybiB1bmxlc3MgcGF0aAotICAgIGJlZ2luCi0gICAgICBpbnN0YW5jZV9ldmFsIEZpbGUucmVhZChwYXRoKSwgcGF0aCwgMQotICAgIHJlc2N1ZQotICAgICAgcmFpc2UgaWYgJERFQlVHCi0gICAgICBzZXR1cF9yYl9lcnJvciAiaG9vayAje3BhdGh9IGZhaWxlZDpcbiIgKyAkIS5tZXNzYWdlCi0gICAgZW5kCi0gIGVuZAotCi1lbmQgICAjIGNsYXNzIEluc3RhbGxlcgotCi0KLWNsYXNzIFNldHVwRXJyb3IgPCBTdGFuZGFyZEVycm9yOyBlbmQKLQotZGVmIHNldHVwX3JiX2Vycm9yKG1zZykKLSAgcmFpc2UgU2V0dXBFcnJvciwgbXNnCi1lbmQKLQotaWYgJDAgPT0gX19GSUxFX18KLSAgYmVnaW4KLSAgICBUb3BsZXZlbEluc3RhbGxlci5pbnZva2UKLSAgcmVzY3VlIFNldHVwRXJyb3IKLSAgICByYWlzZSBpZiAkREVCVUcKLSAgICAkc3RkZXJyLnB1dHMgJCEubWVzc2FnZQotICAgICRzdGRlcnIucHV0cyAiVHJ5ICdydWJ5ICN7JDB9IC0taGVscCcgZm9yIGRldGFpbGVkIHVzYWdlLiIKLSAgICBleGl0IDEKLSAgZW5kCi1lbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdCBiL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdkMzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgQmFzZQorCitzdHJ1Y3QgSGVsbG8geworICAxOiBzdHJpbmcgZ3JlZXRpbmcgPSAiaGVsbG8gd29ybGQiCit9CisKK3NlcnZpY2UgQmFzZVNlcnZpY2UgeworICBIZWxsbyBncmVldGluZygxOmJvb2wgZW5nbGlzaCkKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQgYi9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgRXh0ZW5kZWQKKworaW5jbHVkZSAiQmFzZVNlcnZpY2UudGhyaWZ0IgorCitzZXJ2aWNlIEV4dGVuZGVkU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlLkJhc2VTZXJ2aWNlIHsKKyAgdm9pZCBwaW5nKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL1JlZmVyZW5jZWQudGhyaWZ0IGIvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmMTgzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL1JlZmVyZW5jZWQudGhyaWZ0CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBPdGhlck5hbWVzcGFjZQorCitlbnVtIFNvbWVFbnVtIHsKKyAgT05FCisgIFRXTworfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IGIvbGliL3JiL3NwZWMvVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjI4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlCisKK2luY2x1ZGUgIlJlZmVyZW5jZWQudGhyaWZ0IgorCitzdHJ1Y3QgSGVsbG8geworICAxOiBzdHJpbmcgZ3JlZXRpbmcgPSAiaGVsbG8gd29ybGQiCit9CisKK3NlcnZpY2UgTmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSB7CisgIEhlbGxvIGdyZWV0aW5nKDE6Ym9vbCBlbmdsaXNoKQorICBib29sIGJsb2NrKCkKKyAgb25ld2F5IHZvaWQgdW5ibG9jaygxOmkzMiBuKQorICBvbmV3YXkgdm9pZCBzaHV0ZG93bigpCisgIHZvaWQgc2xlZXAoMTpkb3VibGUgc2Vjb25kcykKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL1RocmlmdFNwZWMudGhyaWZ0IGIvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKaW5kZXggZTRkZWNlNC4uYjQyNDgxYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKKysrIGIvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKQEAgLTEyOSw0ICsxMjksNTUgQEAKIAogc3RydWN0IFN0cnVjdFdpdGhFbnVtTWFwIHsKICAgMTogbWFwPFNvbWVFbnVtLCBsaXN0PFNvbWVFbnVtPj4gbXlfbWFwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworIyBOZXN0ZWQgbGlzdHMKK3N0cnVjdCBOZXN0ZWRMaXN0SW5MaXN0IHsKKyAgMTogbGlzdDxsaXN0PGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTGlzdEluU2V0IHsKKyAgMTogc2V0PGxpc3Q8Ynl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0SW5NYXBLZXkgeworICAxOiBtYXA8bGlzdDxieXRlPiwgYnl0ZT4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZExpc3RJbk1hcFZhbHVlIHsKKyAgMTogbWFwPGJ5dGUsIGxpc3Q8Ynl0ZT4+IHZhbHVlCit9CisKKyMgTmVzdGVkIHNldHMKK3N0cnVjdCBOZXN0ZWRTZXRJbkxpc3QgeworICAxOiBsaXN0PHNldDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluU2V0IHsKKyAgMTogc2V0PHNldDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluTWFwS2V5IHsKKyAgMTogbWFwPHNldDxieXRlPiwgYnl0ZT4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluTWFwVmFsdWUgeworICAxOiBtYXA8Ynl0ZSwgc2V0PGJ5dGU+PiB2YWx1ZQorfQorCisjIE5lc3RlZCBtYXBzCitzdHJ1Y3QgTmVzdGVkTWFwSW5MaXN0IHsKKyAgMTogbGlzdDxtYXA8Ynl0ZSwgYnl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJblNldCB7CisgIDE6IHNldDxtYXA8Ynl0ZSwgYnl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJbk1hcEtleSB7CisgIDI6IG1hcDxtYXA8Ynl0ZSwgYnl0ZT4sIGJ5dGU+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJbk1hcFZhbHVlIHsKKyAgMjogbWFwPGJ5dGUsIG1hcDxieXRlLCBieXRlPj4gdmFsdWUKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgppbmRleCBlZmIxNmQ4Li5lY2E5MzZiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCkBAIC0xNywxNDQgKzE3LDIxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRCYXNlUHJvdG9jb2xTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnQmFzZVByb3RvY29sJyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICBAcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcoQHRyYW5zKQorICAgIEB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgQHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoQHRyYW5zKQogICBlbmQKIAotICBkZXNjcmliZSBCYXNlUHJvdG9jb2wgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2wgZG8KICAgICAjIG1vc3Qgb2YgdGhlIG1ldGhvZHMgYXJlIHN0dWJzLCBzbyB3ZSBjYW4gaWdub3JlIHRoZW0KIAotICAgIGl0ICJzaG91bGQgbWFrZSB0cmFucyBhY2Nlc3NpYmxlIiBkbwotICAgICAgQHByb3QudHJhbnMuc2hvdWxkIGVxbChAdHJhbnMpCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoInRyYW5zIikKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgZmllbGQgbmljZWx5IiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKCd0eXBlJywgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgIGl0ICJzaG91bGQgbWFrZSB0cmFucyBhY2Nlc3NpYmxlIiBkbworICAgICAgZXhwZWN0KEBwcm90LnRyYW5zKS50byBlcWwoQHRyYW5zKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkgKGRlcHJlY2F0ZWQgd3JpdGVfZmllbGQgc2lnbmF0dXJlKScgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZSd9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfZmllbGQoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJywgJ3ZhbHVlJykKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkJPT0wsICdib29sJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkJZVEUsICdieXRlJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpJMTYsICdpMTYnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6STMyLCAnaTMyJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6Okk2NCwgJ2k2NCcpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpTVFJJTkcsICdzdHJpbmcnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6U1RSVUNULCBzdHJ1Y3QpCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAnZmlkJywgJ3ZhbHVlJykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgd3JpdGVfdHlwZSBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBzdHJ1Y3QgPSBkb3VibGUoJ1N0cnVjdCcpCisgICAgICBleHBlY3Qoc3RydWN0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MLCAnYm9vbCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUsICdieXRlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAnZG91YmxlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STE2LCAnaTE2JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STMyLCAnaTMyJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STY0LCAnaTY0JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAnc3RyaW5nJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6U1RSVUNULCBzdHJ1Y3QpCiAgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCi0gICAgICBbVHlwZXM6OlNUT1AsIFR5cGVzOjpWT0lELCBUeXBlczo6TUFQLCBUeXBlczo6U0VULCBUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKLSAgICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfdHlwZSh0eXBlLCB0eXBlLnRvX3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3R5cGUodHlwZSwgdHlwZS50b19zKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBlbmQKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6Qk9PTCkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6QllURSkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6STE2KQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpJMzIpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6Okk2NCkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6RE9VQkxFKQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpTVFJJTkcpCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9iaW5hcnkpLndpdGgoJ2JpbmFyeScpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgJ2Jvb2wnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICdieXRlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sICdkb3VibGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgJ2kxNicpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAnaTMyJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICdpNjQnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgJ3N0cmluZycpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDpiaW5hcnkgPT4gdHJ1ZX0sICdiaW5hcnknKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgc3RydWN0KQogICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAotICAgICAgW1R5cGVzOjpTVE9QLCBUeXBlczo6Vk9JRCwgVHlwZXM6Ok1BUCwgVHlwZXM6OlNFVCwgVHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8Ci0gICAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfdHlwZSh0eXBlKSB9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiB0eXBlfSwgdHlwZS50b19zKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzIChkZXByZWNhdGVkIHJlYWRfdHlwZSBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFKQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLAorICAgICAgIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVCwgVGhyaWZ0OjpUeXBlczo6U1RSVUNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX3R5cGUodHlwZSkgfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklORywgOmJpbmFyeSA9PiB0cnVlfSkKKyAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsCisgICAgICAgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gdHlwZX0pIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHRoZSBiYXNpYyB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpCT09MKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6QllURSkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkkxNikKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkkzMikKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6Okk2NCkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkRPVUJMRSkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OlNUUklORykKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OlNUT1ApICMgc2hvdWxkIGRvIGFic29sdXRlbHkgbm90aGluZworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpJNjQpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpTVE9QKSAjIHNob3VsZCBkbyBhYnNvbHV0ZWx5IG5vdGhpbmcKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzdHJ1Y3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAotICAgICAgICBbJ2ZpZWxkIDEnLCBUeXBlczo6U1RSSU5HLCAxXSwKLSAgICAgICAgWydmaWVsZCAyJywgVHlwZXM6OkkzMiwgMl0sCi0gICAgICAgIFsnZmllbGQgMycsIFR5cGVzOjpNQVAsIDNdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgICBbJ2ZpZWxkIDEnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICBbJ2ZpZWxkIDInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAorICAgICAgICBbJ2ZpZWxkIDMnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDNdLAorICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpTVFJJTkcsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0pCiAgICAgICAjIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgyKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG1hcHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVHlwZXM6OlNUUklORywgVHlwZXM6OlNUUlVDVCwgMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVHlwZXM6OlNUT1AsIG5pbF0pOwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIG5pbF0pOworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpNQVApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgc2V0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUeXBlczo6STY0LCA5XSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6OlNFVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTRVQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbGlzdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpET1VCTEUsIDExXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCi0gICAgICByZWFsX3NraXAuY2FsbChUeXBlczo6TElTVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TElTVCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVByb3RvY29sRmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IiIGRvCiAgICAgICAjIHJldHVybmluZyBuaWwgc2luY2UgUHJvdG9jb2wgaXMganVzdCBhbiBhYnN0cmFjdCBjbGFzcwotICAgICAgbGFtYmRhIHtCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKX0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCmluZGV4IGEyOTY1NmYuLmQyZjYwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgpAQCAtMTcsMjEyICsxNywyMzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0QmFzZVRyYW5zcG9ydFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdCYXNlVHJhbnNwb3J0JyBkbwogCi0gIGRlc2NyaWJlIFRyYW5zcG9ydEV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgbWFrZSB0eXBlIGFjY2Vzc2libGUiIGRvCi0gICAgICBleGMgPSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOLCAibXNnIikKLSAgICAgIGV4Yy50eXBlLnNob3VsZCA9PSBUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTgotICAgICAgZXhjLm1lc3NhZ2Uuc2hvdWxkID09ICJtc2ciCisgICAgICBleGMgPSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTiwgIm1zZyIpCisgICAgICBleHBlY3QoZXhjLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pCisgICAgICBleHBlY3QoZXhjLm1lc3NhZ2UpLnRvIGVxKCJtc2ciKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCYXNlVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgc3BlY2lmaWVkIHNpemUiIGRvCi0gICAgICB0cmFuc3BvcnQgPSBCYXNlVHJhbnNwb3J0Lm5ldwotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkuc2hvdWxkID09ICIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIgorICAgICAgdHJhbnNwb3J0ID0gVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldworICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQucmVhZF9hbGwoNDApKS50byBlcSgiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IHRoZSByZXN0IG9mIHRoZSBtZXRob2RzIiBkbwogICAgICAgIyBjYW4ndCB0ZXN0IGZvciBzdHViYmluZXNzLCBzbyBqdXN0IG1ha2Ugc3VyZSB0aGV5J3JlIGRlZmluZWQKICAgICAgIFs6b3Blbj8sIDpvcGVuLCA6Y2xvc2UsIDpyZWFkLCA6d3JpdGUsIDpmbHVzaF0uZWFjaCBkbyB8c3ltfAotICAgICAgICBCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsaWFzIDw8IHRvIHdyaXRlIiBkbwotICAgICAgQmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KS5zaG91bGQgPT0gQmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KSkudG8gZXEoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVNlcnZlclRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IGl0cyBtZXRob2RzIiBkbwogICAgICAgWzpsaXN0ZW4sIDphY2NlcHQsIDpjbG9zZV0uZWFjaCBkbyB8c3ltfAotICAgICAgICBCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJldHVybiB0aGUgdHJhbnNwb3J0IGl0J3MgZ2l2ZW4iIGRvCi0gICAgICB0cmFuc3BvcnQgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgQmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KS5zaG91bGQgZXFsKHRyYW5zcG9ydCkKKyAgICAgIHRyYW5zcG9ydCA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkpLnRvIGVxbCh0cmFuc3BvcnQpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQnVmZmVyZWRUcmFuc3BvcnQgZG8KLSAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGJ1dCB3cml0ZS9mbHVzaC9yZWFkIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgYnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBidHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICBkZXNjcmliZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0IGRvCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImJ1ZmZlcmVkKG1vY2spIikKICAgICBlbmQKLSAgICAKLSAgICBpdCAic2hvdWxkIGJ1ZmZlciByZWFkcyBpbiBjaHVua3Mgb2YgI3tCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVJ9IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAibG9ydW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJpcHN1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImRvbG9yICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZW1ldCIKKworICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgYnV0IHdyaXRlL2ZsdXNoL3JlYWQiIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChidHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYnVmZmVyIHJlYWRzIGluIGNodW5rcyBvZiAje1RocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSfSIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgibG9ydW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImlwc3VtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJkb2xvciAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZW1ldCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMgYW5kIHNlbmQgdGhlbSBvbiBmbHVzaCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9ubHkgc2VuZCBidWZmZXJlZCBkYXRhIG9uY2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKLSAgICAgIHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKKyAgICAgIGFsbG93KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5mbHVzaAogICAgICAgIyBOb3RoaW5nIHRvIGZsdXNoIHdpdGggbm8gZGF0YQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCi0gICAgCisKICAgICBpdCAic2hvdWxkIGZsdXNoIG9uIGNsb3NlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuY2xvc2UKICAgICBlbmQKLSAgICAKKwogICAgIGl0ICJzaG91bGQgbm90IHdyaXRlIHRvIHNvY2tldCBpZiB0aGVyZSdzIG5vIGRhdGEiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gbW9jaygiQnVmZmVyZWRUcmFuc3BvcnQiKQotICAgICAgQnVmZmVyZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCi0gICAgICBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpLnNob3VsZCA9PSBidHJhbnMKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gZG91YmxlKCJCdWZmZXJlZFRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykpLnRvIGVxKGJ0cmFucykKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJidWZmZXJlZCIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEZyYW1lZFRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImZyYW1lZChtb2NrKSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBvcGVuPy9vcGVuL2Nsb3NlIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQotICAgICAgZnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGZ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgZnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChmdHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHJlYWQgd2hlbiByZWFkIGlzIHR1cm5lZCBvZmYiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgZmFsc2UsIHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIGZ0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCB3cml0ZS9mbHVzaCB3aGVuIHdyaXRlIGlzIHR1cm5lZCBvZmYiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKLSAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikuc2hvdWxkID09ICIrIHdyaXRlIgotICAgICAgZnRyYW5zLmZsdXNoLnNob3VsZCA9PSAiKyBmbHVzaCIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvbyIpLm9yZGVyZWQuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKKyAgICAgIGV4cGVjdChmdHJhbnMud3JpdGUoImZvbyIpKS50byBlcSgiKyB3cml0ZSIpCisgICAgICBleHBlY3QoZnRyYW5zLmZsdXNoKS50byBlcSgiKyBmbHVzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBhIGZ1bGwgZnJhbWUgaWYgYXNrZWQgZm9yID49IHRoZSBmcmFtZSdzIGxlbmd0aCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKS5zaG91bGQgPT0gZnJhbWUKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApKS50byBlcShmcmFtZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHNsaWNlcyBvZiB0aGUgZnJhbWUgd2hlbiBhc2tlZCBmb3IgPCB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAiIGlzICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImEgZnJhbWUiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoIiBpcyAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImEgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbm90aGluZyBpZiBhc2tlZCBmb3IgPD0gMCIgZG8KLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHB1bGwgYSBuZXcgZnJhbWUgd2hlbiB0aGUgZmlyc3QgaXMgZXhoYXVzdGVkIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgogICAgICAgZnJhbWUyID0gInlldCBhbm90aGVyIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg4KS5zaG91bGQgPT0gIiBpcyBhIGZyIgotICAgICAgZnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJhbWUiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInlldCAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhbm90aGVyIGZyYW1lIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDgpKS50byBlcSgiIGlzIGEgZnIiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDYpKS50byBlcSgiYW1lIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInlldCAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImFub3RoZXIgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdF9yZWNlaXZlKDp3cml0ZSkKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGUpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoImJhciIpCiAgICAgICBmdHJhbnMud3JpdGUoInRoaXMgaXMgYSBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHNsaWNlcyBvZiB0aGUgYnVmZmVyIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQogICAgICAgZnRyYW5zLndyaXRlKCJmb29iYXIiLCAzKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXJmb28iLCAxKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGZsdXNoIGZyYW1lcyB3aXRoIGEgNC1ieXRlIGhlYWRlciIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgZnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGZ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInRocmVlLyIpCkBAIC0yMzEsMTIwICsyNTQsMTM0IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBmbHVzaCB0aGUgc2FtZSBidWZmZXJlZCBkYXRhIHR3aWNlIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCi0gICAgICBAdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCIvYmFyIikKICAgICAgIGZ0cmFucy5mbHVzaAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEZyYW1lZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQotICAgICAgRnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCisgICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImZyYW1lZCIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBidWZmZXIgPSBNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGJ1ZmZlci50b19zKS50byBlcSgibWVtb3J5IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGEgYnVmZmVyIG9uIGlucHV0IGFuZCB1c2UgaXQgZGlyZWN0bHkiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgotICAgICAgQGJ1ZmZlciA9IE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcocykKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCisgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KHMpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGhpcyIpCiAgICAgICBzLnNsaWNlISgtNC4uLTEpCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGlzIGEgIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgaXMgYSAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgcmVtYWluIG9wZW4iIGRvCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgICAgQGJ1ZmZlci5jbG9zZQotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVzcG9uZCB0byBwZWVrIGFuZCBhdmFpbGFibGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJzb21lIGRhdGEiCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA5CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoOSkKICAgICAgIEBidWZmZXIucmVhZCg0KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDUpCiAgICAgICBAYnVmZmVyLnJlYWQoNSkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfZmFsc2UKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byByZXNldCB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoImZvb2JhciIpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvb2JhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vYmFyIikKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjb3B5IHRoZSBnaXZlbiBzdHJpbmcgd2hlbiByZXNldHRpbmcgdGhlIGJ1ZmZlciIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcihzKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDE0CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDE0KQogICAgICAgQGJ1ZmZlci5yZWFkKDEwKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDQKLSAgICAgIHMuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNCkKKyAgICAgIGV4cGVjdChzKS50byBlcSgidGhpcyBpcyBhIHRlc3QiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gZnJvbSByZWFkIHdoYXQgd2FzIGdpdmVuIGluIHdyaXRlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGVzdCIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgZGF0YSIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0ZXN0IikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGRhdGEiKQogICAgICAgQGJ1ZmZlci53cml0ZSAiZm9vIgogICAgICAgQGJ1ZmZlci53cml0ZSAiIGJhciIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb28gYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb28gYmFyIikKICAgICBlbmQKLSAgICAKKwogICAgIGl0ICJzaG91bGQgdGhyb3cgYW4gRU9GRXJyb3Igd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIiIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDEpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDEpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKIAogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIjEyMzQiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCg1KX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCg1KX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIElPU3RyZWFtVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAaW5wdXQgPSBtb2NrKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQG91dHB1dCA9IG1vY2soIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQHRyYW5zID0gSU9TdHJlYW1UcmFuc3BvcnQubmV3KEBpbnB1dCwgQG91dHB1dCkKKyAgICAgIEBpbnB1dCA9IGRvdWJsZSgiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBvdXRwdXQgPSBkb3VibGUoIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQHRyYW5zID0gVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5uZXcoQGlucHV0LCBAb3V0cHV0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19pbnB1dCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19vdXRwdXQiKQorICAgICAgZXhwZWN0KEB0cmFucy50b19zKS50byBlcSgiaW9zdHJlYW0oaW5wdXQ9bW9ja19pbnB1dCxvdXRwdXQ9bW9ja19vdXRwdXQpIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgb3BlbiBhcyBsb25nIGFzIGJvdGggaW5wdXQgb3Igb3V0cHV0IGFyZSBvcGVuIiBkbwotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQotICAgICAgQG91dHB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfbm90IGJlX29wZW4KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQorICAgICAgYWxsb3coQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZC93cml0ZSB0byBpbnB1dC9vdXRwdXQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCi0gICAgICBAdHJhbnMud3JpdGUoImZvb2JhciIpLnNob3VsZCA9PSAiKyB3cml0ZSIKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCisgICAgICBleHBlY3QoQHRyYW5zLndyaXRlKCJmb29iYXIiKSkudG8gZXEoIisgd3JpdGUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEB0cmFucy5jbG9zZQogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKaW5kZXggYjg1MThjOC4uYjJjZDA0YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKQEAgLTE3LDMwICsxNywzMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkJworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkIikKIAogaWYgZGVmaW5lZD8gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCiAKLSAgY2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgICBpbmNsdWRlIFRocmlmdAorICBkZXNjcmliZSAnQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCcgZG8KKyAgICAjIHNpbmNlIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc2hvdWxkIGJlIGRpcmVjdGx5IGVxdWl2YWxlbnQgdG8KKyAgICAjIEJpbmFyeVByb3RvY29sLCB3ZSBkb24ndCBuZWVkIGFueSBjdXN0b20gc3BlY3MhCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKIAotICAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBkbwotICAgICAgIyBzaW5jZSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNob3VsZCBiZSBkaXJlY3RseSBlcXVpdmFsZW50IHRvIAotICAgICAgIyBCaW5hcnlQcm90b2NvbCwgd2UgZG9uJ3QgbmVlZCBhbnkgY3VzdG9tIHNwZWNzIQotICAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKLQotICAgICAgZGVmIHByb3RvY29sX2NsYXNzCi0gICAgICAgIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKLSAgICAgIGVuZAorICAgIGRlZiBwcm90b2NvbF9jbGFzcworICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCiAgICAgZW5kCiAKLSAgICBkZXNjcmliZSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSBkbworICAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkgZG8KICAgICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCIgZG8KLSAgICAgICAgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnktYWNjZWwiKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogZWxzZQogICBwdXRzICJza2lwcGluZyBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNwZWMgYmVjYXVzZSBpdCBpcyBub3QgZGVmaW5lZC4iCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMGFiY2NiOC4uMDY1ZjVjZSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKQEAgLTE3LDQ3ICsxNyw1OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkJworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnQmluYXJ5UHJvdG9jb2wnIGRvCiAKLSAgZGVzY3JpYmUgQmluYXJ5UHJvdG9jb2wgZG8KLSAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJworICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJwogCi0gICAgZGVmIHByb3RvY29sX2NsYXNzCi0gICAgICBCaW5hcnlQcm90b2NvbAorICBkZWYgcHJvdG9jb2xfY2xhc3MKKyAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sCisgIGVuZAorCisgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wgZG8KKworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGEgbWVzc2FnZSBoZWFkZXIiIGRvCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS5leGFjdGx5KDIpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSwKLSAgICAgICAgWzQyXS5wYWNrKCdOJykKLSAgICAgICkgICAgICAKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0KKyAgICAgIEB0cmFucy53cml0ZShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZXS5wYWNrKCdOJykpCisgICAgICBAdHJhbnMud3JpdGUoWzQyXS5wYWNrKCdOJykpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQotICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigtMSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAogICAgICAgICBlLnR5cGUgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGRvZXMgbm90IGV4aXN0IGFuZCBzdHJpY3RfcmVhZCBpcyBlbmFibGVkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnN0cmljdF9yZWFkKS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwgICAgICAgIAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImJpbmFyeShtZW1vcnkpIikKKyAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbCIgZG8KLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKEJpbmFyeVByb3RvY29sKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5IikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgppbmRleCAyOGRhNzYwLi41OGQ2NWYwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCkBAIC0xLDMgKzEsNCBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNyw3ICsxOCw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKIHNoYXJlZF9leGFtcGxlc19mb3IgJ2EgYmluYXJ5IHByb3RvY29sJyBkbwogICBiZWZvcmUoOmVhY2gpIGRvCkBAIC0yNiwzNCArMjcsMzQgQEAKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWZpbmUgdGhlIHByb3BlciBWRVJTSU9OXzEsIFZFUlNJT05fTUFTSyBBTkQgVFlQRV9NQVNLIiBkbwotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKS5zaG91bGQgPT0gMHhmZmZmMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKS5zaG91bGQgPT0gMHg4MDAxMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VFlQRV9NQVNLKS5zaG91bGQgPT0gMHgwMDAwMDBmZgorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fTUFTSykpLnRvIGVxKDB4ZmZmZjAwMDApCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSkudG8gZXEoMHg4MDAxMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spKS50byBlcSgweDAwMDAwMGZmKQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2Ugc3RyaWN0X3JlYWQgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3JlYWQuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3RfcmVhZCkudG8gZXFsKHRydWUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3Rfd3JpdGUgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3dyaXRlLnNob3VsZCBlcWwodHJ1ZSkKKyAgICBleHBlY3QoQHByb3Quc3RyaWN0X3dyaXRlKS50byBlcWwodHJ1ZSkKICAgZW5kICAgIAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aCBhIHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpICMgc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogCkBAIC02MSw2NCArNjIsNjcgQEAKIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oJ2ZvbycsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKSkKICAgZW5kCiAgIAogICAjIGZpZWxkIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIFNUT1AgZmllbGQiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtYXAgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIik7CisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIikpOwogICBlbmQKICAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBsaXN0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OkkxNiwgNDIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKSkKICAgZW5kCiAgIAogICAjIGxpc3QgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgc2V0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBib29sIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMVwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMVwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgdHJlYXQgYSBuaWwgYm9vbCBhcyBmYWxzZSIgZG8KICAgICBAcHJvdC53cml0ZV9ib29sKG5pbCkKLSAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gIlwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcSgiXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJ5dGUiIGRvCiAgICAgIyBieXRlIGlzIHNtYWxsIGVub3VnaCwgbGV0J3MgY2hlY2sgLTEyOC4uMTI3CiAgICAgKC0xMjguLjEyNykuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBoYW5kaW5nIGl0IG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yc3BlY192ZXJpZnkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjbGlwIG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSIgZG8KICAgICAoMTI4Li4yNTUpLmVhY2ggZG8gfGl8CiAgICAgICBAcHJvdC53cml0ZV9ieXRlKGkpCi0gICAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gW2ldLnBhY2soJ2MnKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcShbaV0ucGFjaygnYycpKQogICAgIGVuZAotICAgICMgYW5kIGxhc3RseSwgYSBCaWdudW0gaXMgZ29pbmcgdG8gZXJyb3Igb3V0Ci0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZSgyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgZW5kCisKKyAgaXQgImVycm9ycyBvdXQgd2l0aCBhIEJpZ251bSIgZG8KKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGJ5dGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkxNiIgZG8KQEAgLTEzMCwxNCArMTM0LDE0IEBACiAgICAgIyBhbmQgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAogICAgIEBwcm90LndyaXRlX2kxNigyKioxNSArIDUpCiAgICAgCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMFwzNzRcMDAwXDAwMFwwMjFcMDAwXDAwMFwzMzBcMzYwXDAwNlwyNzNcMTc3XDM3N1wyMDBcMDA1IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiKQogICAgIAogICAgICMgYSBCaWdudW0gc2hvdWxkIGVycm9yCiAgICAgIyBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYoMioqNjUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGkxNiIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkzMiIgZG8KQEAgLTE0NywxNCArMTUxLDE0IEBACiAgICAgICBAcHJvdC53cml0ZV9pMzIoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IikKICAgICBbMiAqKiAzMSArIDUsIDIgKiogNjUgKyA1XS5lYWNoIGRvIHxpfAotICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKGkpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKKyAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kzMihpKSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTMyIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kzMihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTY0IiBkbwpAQCAtMTY0LDcgKzE2OCw3IEBACiAgICAgICBAcHJvdC53cml0ZV9pNjQoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gWyJcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKICAgICAgICJcMzc3XDM3N1wzNjRcMzAzXDAzNVwyNDQrXSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzZcMjMxOlwzNDEiLAogICAgICAgIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMDI2IiwKQEAgLTE3MiwxMiArMTc2LDEyIEBACiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwzMTciLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwI1wzNDBcMjA0IiwKICAgICAgICJcMDAwXDAwMFwwMDBcMDAyXDM0MFwzMTF+XDM2NSIsCi0gICAgICAiXDE3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciXS5qb2luKCIiKQotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpKQorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpNjQiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGRvdWJsZSIgZG8KQEAgLTE4NSw4MSArMTg5LDEyNCBAQAogICAgIHZhbHVlcyA9IFtGbG9hdDo6TUlOLC0xMjMxLjE1MzI1LCAtMTIzMTIzLjIzLCAtMjMuMjM1MTUxMjMsIDAsIDEyMzUxLjEzMjUsIDUyMy4yMywgRmxvYXQ6Ok1BWF0KICAgICB2YWx1ZXMuZWFjaCBkbyB8ZnwKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZShmKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtmXS5wYWNrKCJHIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW2ZdLnBhY2soIkciKSkKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgZG91YmxlIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2RvdWJsZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKLSAgCi0gIGl0ICJzaG91bGQgd3JpdGUgYSBzdHJpbmciIGRvCi0gICAgc3RyID0gImhlbGxvIHdvcmxkIgotICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtzdHIuc2l6ZV0ucGFjaygiTiIpICsgc3RyCisKKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZycgZG8KKyAgICAgIHN0ciA9ICdhYmMnCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KKyAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIFx1MjBBRCIuZW5jb2RlKCdVVEYtOCcpCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIsIDB4ODIsIDB4QUMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QURdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMgYW5kIHRyYW5zY29kaW5nJyBkbworICAgICAgc3RyID0gImFiYyBcdTIwQUMiLmVuY29kZSgnSVNPLTg4NTktMTUnKQorICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDIwLCAweEUyLCAweDgyLCAweEFDXSkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbworICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCisgICAgZW5kCisgIGVsc2UKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nJyBkbworICAgICAgc3RyID0gJ2FiYycKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQorICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCisgICAgZW5kCiAgIGVuZAotICAKKwogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgc3RyaW5nIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgICMgbWVzc2FnZSBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLnBhY2soImNuIikpCi0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc3RvcCBmaWVsZCIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUT1BdLnBhY2soImMiKSk7Ci0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmVhZCBhIG1hcCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdLnBhY2soImNjTiIpKQotICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0pCiAgIGVuZAogICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzZXQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBzZXQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYm9vbCIgZG8KICAgICBAdHJhbnMud3JpdGUoIlwwMDFcMDAwIik7Ci0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCi0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYnl0ZSIgZG8KICAgICBbLTEyOCwgLTU3LCAtMywgMCwgMTcsIDI0LCAxMjddLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soImMiKSkKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjY3LDcgKzMxNCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjE1LCAtNTIzNywgLTM1MywgMCwgMTUyNywgMjIzNCwgMioqMTUtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygibiIpKTsKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTI3NSw3ICszMjIsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKiozMSwgLTIzNTEyNSwgLTYyMzYsIDAsIDIzNTEsIDEyMzEyMywgMioqMzEtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiTiIpKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjgzLDcgKzMzMCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjYzLCAtMTIzNTEyMzEyLCAtNjM0NiwgMCwgMzIsIDIzNDYzMjIzMjMsIDIqKjYzLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2kgPj4gMzIsIGkgJiAweEZGRkZGRkZGXS5wYWNrKCJOTiIpKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjkxLDI3ICszMzgsNjMgQEAKICAgICAjIHRyeSBhIHJhbmRvbSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbRmxvYXQ6Ok1JTiwgLTIzMTIzMS4xMjM1MSwgLTMyMy4yMzM1MTMsIDAsIDEyMy4yMzUxMjM1LCAyMzUxMjM1LjEyMzUxMjM1LCBGbG9hdDo6TUFYXS5lYWNoIGRvIHxmfAogICAgICAgQHRyYW5zLndyaXRlKFtmXS5wYWNrKCJHIikpOwotICAgICAgQHByb3QucmVhZF9kb3VibGUuc2hvdWxkID09IGYKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoZikKICAgICBlbmQKICAgZW5kCi0gIAotICBpdCAic2hvdWxkIHJlYWQgYSBzdHJpbmciIGRvCi0gICAgc3RyID0gImhlbGxvIHdvcmxkIgotICAgIEB0cmFucy53cml0ZShbc3RyLnNpemVdLnBhY2soIk4iKSArIHN0cikKLSAgICBAcHJvdC5yZWFkX3N0cmluZy5zaG91bGQgPT0gc3RyCisKKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgc3RyaW5nJyBkbworICAgICAgIyBpMzIgb2YgdmFsdWUgMywgZm9sbG93ZWQgYnkgdGhyZWUgY2hhcmFjdGVycy9VVEYtOCBieXRlcyAnYScsICdiJywgJ2MnCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZworICAgICAgZXhwZWN0KGEpLnRvIGVxKCdhYmMnLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcgY29udGFpbmluZyB1bmljb2RlIGNoYXJhY3RlcnMgZnJvbSBVVEYtOCBlbmNvZGVkIGJ1ZmZlcicgZG8KKyAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IG9uZSBjaGFyYWN0ZXIgVSsyMEFDIG1hZGUgdXAgb2YgdGhyZWUgYnl0ZXMKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweEUyLCAweDgyLCAweEFDXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgZW5kCisgIGVsc2UKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCisgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RyaW5nKS50byBlcSgnYWJjJykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBubyBhcmdzIG9yIHJldHVybiIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ZvaWRNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl92b2lkTWV0aG9kLnNob3VsZCA9PSBuaWx9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3Zfdm9pZE1ldGhvZCkudG8gZXEobmlsKX0KICAgICApCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIGEgcHJpbWl0aXZlIHJldHVybiB0eXBlIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfcHJpbWl0aXZlTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kLnNob3VsZCA9PSAxfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZCkudG8gZXEoMSl9CiAgICAgKQogICBlbmQKIApAQCAtMzIyLDcgKzQwNSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNsaWVudC5yZWN2X3N0cnVjdE1ldGhvZAogICAgICAgICByZXN1bHQuc2V0X2J5dGVfbWFwID0gbmlsCiAgICAgICAgIHJlc3VsdC5tYXBfYnl0ZV9tYXAgPSBuaWwKLSAgICAgICAgcmVzdWx0LnNob3VsZCA9PSBGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVAorICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCkKICAgICAgIH0KICAgICApCiAgIGVuZApAQCAtMzQzLDkgKzQyNiw5IEBACiAgICAgY2xpZW50cHJvdG8gPSBwcm90b2NvbF9jbGFzcy5uZXcoY2xpZW50c2lkZSkKICAgICBzZXJ2ZXJwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhzZXJ2ZXJzaWRlKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQogCi0gICAgY2xpZW50ID0gU3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKKyAgICBjbGllbnQgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6Q2xpZW50Lm5ldyhjbGllbnRwcm90bywgY2xpZW50cHJvdG8pCiAKICAgICAjIGZpcnN0IGJsb2NrCiAgICAgZmlyc3RibG9jay5jYWxsKGNsaWVudCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODY1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCkBAIC0wLDAgKzEsMTYwIEBACisjIGVuY29kaW5nOiBVVEYtOAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSBUaHJpZnQ6OkJ5dGVzIGRvCisgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JworICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDApKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDEpKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGNoYW5nZSBlbmNvZGluZycgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnLmVuY29kZSgnVVRGLTgnKQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykubm90X3RvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbworICAgICAgICBzID0gIlx4NDFceDQyIgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5zZXRfc3RyaW5nX2J5dGUnIGRvCisgICAgICBpdCAnc2hvdWxkIHNldCBieXRlIHZhbHVlIGF0IGluZGV4JyBkbworICAgICAgICBzID0gIlx4NDFceDQyIgorICAgICAgICBUaHJpZnQ6OkJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzLCAwLCAweDQzKQorICAgICAgICBleHBlY3Qocy5nZXRieXRlKDApKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggU3RyaW5nIHRvIGJ5dGUgYnVmZmVyJyBkbworICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQworICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCisKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IElTTy04ODU5LTE1IFN0cmluZyB0byBVVEYtOCBieXRlIGJ1ZmZlcicgZG8KKyAgICAgICAgIyBBc3N1bXB0aW9ucworICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQywgdGhlbiBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMTUKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQorICAgICAgICBleHBlY3QoZS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEE0XSkgIyBldXJvIHNpZ24gaXMgYSBkaWZmZXJlbnQgY29kZSBwb2ludCBpbiBJU08tODg1OS0xNQorCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBleHBlY3QoYS5sZW5ndGgpLnRvIGVxKDMpCisgICAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4RTIsIDB4ODIsIDB4QUNdKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fc3RyaW5nJyBkbworICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IFVURi04IGJ5dGUgYnVmZmVyIHRvIGEgVVRGLTggU3RyaW5nJyBkbworICAgICAgICBlID0gWzB4RTIsIDB4ODIsIDB4QUNdLnBhY2soIkMqIikKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcdTIwQUMiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgZWxzZSAjIFJVQllfVkVSU0lPTgorICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiWzBdKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYlsxXSkudG8gZXEoMCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLnNldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCisgICAgICAgIGV4cGVjdChzWzBdKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgppbmRleCBlNzA3ZDgxLi5kNWQ0Y2VlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgpAQCAtMTcsODQgKzE3LDgyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdENsaWVudFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdDbGllbnQnIGRvCiAKICAgY2xhc3MgQ2xpZW50U3BlYwogICAgIGluY2x1ZGUgVGhyaWZ0OjpDbGllbnQKICAgZW5kCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBAY2xpZW50ID0gQ2xpZW50U3BlYy5uZXcoQHByb3QpCiAgIGVuZAogCi0gIGRlc2NyaWJlIENsaWVudCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkNsaWVudCBkbwogICAgIGl0ICJzaG91bGQgcmUtdXNlIGlwcm90IGZvciBvcHJvdCBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCIgZG8KLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQG9wcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BpcHJvdCcpKS50byBlcWwoQHByb3QpCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKSkudG8gZXFsKEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAwKQotICAgICAgbW9ja19hcmdzID0gbW9jaygnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6Zm9vPSkud2l0aCgnZm9vJykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpIGRvCi0gICAgICAgIG1vY2soJ3RyYW5zJykudGVlIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoJyM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPicpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpIGRvCisgICAgICAgIGRvdWJsZSgndHJhbnMnKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBrbGFzcyA9IHN0dWIoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCiAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBrbGFzcywgOmZvbyA9PiAnZm9vJywgOmJhciA9PiA0MikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBpZCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMiIGRvCi0gICAgICBwZW5kaW5nICJpdCBzZWVtcyBzZXF1ZW5jZSBpZHMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCByaWdodCBub3ciIGRvCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMicsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAyKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIG1vY2soInRyYW5zIikuYXNfbnVsbF9vYmplY3QKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KSAgICAgICAgCi0gICAgICBlbmQKKyAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDEpLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKKyAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBkb3VibGUoInRyYW5zIikuYXNfbnVsbF9vYmplY3QKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWNlaXZlIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKLSAgICAgIG1vY2tfa2xhc3MgPSBtb2NrKCIjPE1vY2tDbGFzczptb2NrPiIpCi0gICAgICBtb2NrX2tsYXNzLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQotICAgICAgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2Uoc3R1YigiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19rbGFzcyA9IGRvdWJsZSgiIzxNb2NrQ2xhc3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfa2xhc3MpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShkb3VibGUoIk1vY2tDbGFzcyIsIDpuZXcgPT4gbW9ja19rbGFzcykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSByZWNlaXZlZCBleGNlcHRpb25zIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24uc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbwotICAgICAgICBTdGFuZGFyZEVycm9yLm5ldy50ZWUgZG8gfG1vY2tfZXhjfAotICAgICAgICAgIG1vY2tfZXhjLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpIGRvCisgICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRhcCBkbyB8bW9ja19leGN8CisgICAgICAgICAgZXhwZWN0KG1vY2tfZXhjKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNlbmRpbmcgYSBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfYmVnaW4pCi0gICAgICBAcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19hcmdzID0gbW9jaygiIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+IikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGtsYXNzID0gbW9jaygiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQotICAgICAgbGFtYmRhIHsgQGNsaWVudC5zZW5kX21lc3NhZ2UoInRlc3RNZXNzYWdlIiwga2xhc3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikKKyAgICAgIGV4cGVjdChAcHJvdCkubm90X3RvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQorICAgICAgYWxsb3coQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDFmYTIxODIuLjUxM2RkNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKQEAgLTEsMyArMSw0IEBACisjIGVuY29kaW5nOiBVVEYtOAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNyw3ICsxOCw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKIGRlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sIGRvCiAgIFRFU1RTID0gewpAQCAtMjUsNyArMjYsNyBAQAogICAgIDppMTYgPT4gKDAuLjE0KS5tYXAge3xzaGlmdHwgWzEgPDwgc2hpZnQsIC0oMSA8PCBzaGlmdCldfS5mbGF0dGVuLnNvcnQsCiAgICAgOmkzMiA9PiAoMC4uMzApLm1hcCB7fHNoaWZ0fCBbMSA8PCBzaGlmdCwgLSgxIDw8IHNoaWZ0KV19LmZsYXR0ZW4uc29ydCwKICAgICA6aTY0ID0+ICgwLi42MikubWFwIHt8c2hpZnR8IFsxIDw8IHNoaWZ0LCAtKDEgPDwgc2hpZnQpXX0uZmxhdHRlbi5zb3J0LAotICAgIDpzdHJpbmcgPT4gWyIiLCAiMSIsICJzaG9ydCIsICJmb3VydGVlbjEyMzQ1NiIsICJmaWZ0ZWVuMTIzNDU2NzgiLCAiMSIgKiAxMjcsICIxIiAqIDMwMDBdLAorICAgIDpzdHJpbmcgPT4gWyIiLCAiMSIsICJzaG9ydCIsICJmb3VydGVlbjEyMzQ1NiIsICJmaWZ0ZWVuMTIzNDU2NzgiLCAidW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIiwgIjEiICogMTI3LCAiMSIgKiAzMDAwXSwKICAgICA6YmluYXJ5ID0+IFsiIiwgIlwwMDEiLCAiXDAwMSIgKiA1LCAiXDAwMSIgKiAxNCwgIlwwMDEiICogMTUsICJcMDAxIiAqIDEyNywgIlwwMDEiICogMzAwMF0sCiAgICAgOmRvdWJsZSA9PiBbMC4wLCAxLjAsIC0xLjAsIDEuMSwgLTEuMSwgMTAwMDAwMDAuMSwgMS4wLzAuMCwgLTEuMC8wLjBdLAogICAgIDpib29sID0+IFt0cnVlLCBmYWxzZV0KQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgICAgcHJvdG8uc2VuZCh3cml0ZXIocHJpbWl0aXZlX3R5cGUpLCB2YWx1ZSkKICAgICAgICAgIyBwdXRzICJidWY6ICN7dHJhbnMuaW5zcGVjdF9idWZmZXJ9IiBpZiBwcmltaXRpdmVfdHlwZSA9PSA6aTY0CiAgICAgICAgIHJlYWRfYmFjayA9IHByb3RvLnNlbmQocmVhZGVyKHByaW1pdGl2ZV90eXBlKSkKLSAgICAgICAgcmVhZF9iYWNrLnNob3VsZCA9PSB2YWx1ZQorICAgICAgICBleHBlY3QocmVhZF9iYWNrKS50byBlcSh2YWx1ZSkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKQEAgLTYxLDEwICs2MiwxMCBAQAogCiAgICAgICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgICBuYW1lLCB0eXBlLCBpZCA9IHByb3RvLnJlYWRfZmllbGRfYmVnaW4KLSAgICAgICAgdHlwZS5zaG91bGQgPT0gdGhyaWZ0X3R5cGUKLSAgICAgICAgaWQuc2hvdWxkID09IDE1CisgICAgICAgIGV4cGVjdCh0eXBlKS50byBlcSh0aHJpZnRfdHlwZSkKKyAgICAgICAgZXhwZWN0KGlkKS50byBlcSgxNSkKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgICBwcm90by5yZWFkX2ZpZWxkX2VuZAogICAgICAgZW5kCiAgICAgZW5kCkBAIC03NCwxMyArNzUsMTMgQEAKICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogCi0gICAgc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QgPSBUaHJpZnQ6OlRlc3Q6OkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CiAgICAgIyBzZXRzIGFuZCBtYXBzIGRvbid0IGhhc2ggd2VsbC4uLiBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuCiAgICAgc3RydWN0LndyaXRlKHByb3RvKQogCi0gICAgc3RydWN0MiA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICBzdHJ1Y3QyLnJlYWQocHJvdG8pICAgIAotICAgIHN0cnVjdDIuc2hvdWxkID09IHN0cnVjdAorICAgIGV4cGVjdChzdHJ1Y3QyKS50byBlcShzdHJ1Y3QpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBtZXRob2QgY2FsbHMgY29ycmVjdGx5IiBkbwpAQCAtOTAsMTkgKzkxLDE5IEBACiAgICAgY2xpZW50X2luX3RyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgY2xpZW50X2luX3Byb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KGNsaWVudF9pbl90cmFucykKIAotICAgIHByb2Nlc3NvciA9IFNydjo6UHJvY2Vzc29yLm5ldyhKYW5reUhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudF9pbl9wcm90bywgY2xpZW50X291dF9wcm90bykKICAgICBjbGllbnQuc2VuZF9KYW5reSgxKQogICAgICMgcHV0cyBjbGllbnRfb3V0X3RyYW5zLmluc3BlY3RfYnVmZmVyCiAgICAgcHJvY2Vzc29yLnByb2Nlc3MoY2xpZW50X291dF9wcm90bywgY2xpZW50X2luX3Byb3RvKQotICAgIGNsaWVudC5yZWN2X0phbmt5LnNob3VsZCA9PSAyCisgICAgZXhwZWN0KGNsaWVudC5yZWN2X0phbmt5KS50byBlcSgyKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZGVhbCB3aXRoIGZpZWxkcyBmb2xsb3dpbmcgZmllbGRzIHRoYXQgaGF2ZSBub24tZGVsdGEgaWRzIiBkbwotICAgIGJyY3AgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKKyAgICBicmNwID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKICAgICAgIDpmaWVsZDEgPT4gImJsYWgiLCAKLSAgICAgIDpmaWVsZDIgPT4gQmlnRmllbGRJZFN0cnVjdC5uZXcoCisgICAgICA6ZmllbGQyID0+IFRocmlmdDo6VGVzdDo6QmlnRmllbGRJZFN0cnVjdC5uZXcoCiAgICAgICAgIDpmaWVsZDEgPT4gInN0cmluZzEiLCAKICAgICAgICAgOmZpZWxkMiA9PiAic3RyaW5nMiIpLCAKICAgICAgIDpmaWVsZDMgPT4gMykKQEAgLTExMCw5ICsxMTEsMjUgQEAKICAgICBieXRlcyA9IHNlci5zZXJpYWxpemUoYnJjcCkKIAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCi0gICAgYnJjcDIgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldworICAgIGJyY3AyID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKGJyY3AyLCBieXRlcykKLSAgICBicmNwMi5zaG91bGQgPT0gYnJjcAorICAgIGV4cGVjdChicmNwMikudG8gZXEoYnJjcCkKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIGFuIGVtcHR5IG1hcCB0byBhbiBlbXB0eSBoYXNoIiBkbworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcoOmkzMl9tYXAgPT4ge30pCisgICAgc2VyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQorICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShzdHJ1Y3QpCisKKyAgICBkZXNlciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQorICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6OlNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3CisgICAgZGVzZXIuZGVzZXJpYWxpemUoc3RydWN0MiwgYnl0ZXMpCisgICAgZXhwZWN0KHN0cnVjdCkudG8gZXEoc3RydWN0MikKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKS50b19zKS50byBlcSgiY29tcGFjdChtZW1vcnkpIikKICAgZW5kCiAgIAogICBjbGFzcyBKYW5reUhhbmRsZXIKQEAgLTEyMiwxMiArMTM5LDIwIEBACiAgIGVuZAogICAKICAgZGVmIHdyaXRlcihzeW0pCi0gICAgc3ltID0gc3ltID09IDpiaW5hcnkgPyA6c3RyaW5nIDogc3ltCiAgICAgIndyaXRlXyN7c3ltLnRvX3N9IgogICBlbmQKICAgCiAgIGRlZiByZWFkZXIoc3ltKQotICAgIHN5bSA9IHN5bSA9PSA6YmluYXJ5ID8gOnN0cmluZyA6IHN5bQogICAgICJyZWFkXyN7c3ltLnRvX3N9IgogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZAorCitkZXNjcmliZSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkgZG8KKyAgaXQgInNob3VsZCBjcmVhdGUgYSBDb21wYWN0UHJvdG9jb2wiIGRvCisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiY29tcGFjdCIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCmluZGV4IGZjMzIxMzcuLjM3OWFlNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCkBAIC0xNywxMjYgKzE3LDEyNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRFeGNlcHRpb25TcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnRXhjZXB0aW9uJyBkbwogCi0gIGRlc2NyaWJlIEV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIG1lc3NhZ2UiIGRvCi0gICAgICBlID0gRXhjZXB0aW9uLm5ldygidGVzdCBtZXNzYWdlIikKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGUgPSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQXBwbGljYXRpb25FeGNlcHRpb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaW5oZXJpdCBmcm9tIFRocmlmdDo6RXhjZXB0aW9uIiBkbwotICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcy5zaG91bGQgPT0gRXhjZXB0aW9uCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzKS50byBlcShUaHJpZnQ6OkV4Y2VwdGlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUgYW5kIG1lc3NhZ2UiIGRvCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3Ci0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBzdHJ1Y3Qgb2ZmIG9mIGEgcHJvdG9jb2wiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFsibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDFdLAotICAgICAgICBbInR5cGUiLCBUeXBlczo6STMyLCAyXSwKLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAorICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMikudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgYmFkIGZpZWxkcyB3aGVuIHJlYWRpbmcgYSBzdHJ1Y3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpJMzIsIDJdLAotICAgICAgICBbInR5cGUiLCBUeXBlczo6U1RSSU5HLCAyXSwKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6Ok1BUCwgMV0sCi0gICAgICAgIFsibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDNdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMV0sCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6OlNUUklORykudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6Ok1BUCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwogICAgICAgZS5yZWFkKHByb3QpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGEgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzdHJ1Y3QgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbmlsIGZpZWxkcyB3aGVuIHdyaXRpbmcgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsLCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVHlwZXM6OkkzMiwgMikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICAgIGUud3JpdGUocHJvdCkKIAotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFByb3RvY29sRXhjZXB0aW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIiBkbwotICAgICAgcHJvdCA9IFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCwgIm1lc3NhZ2UiKQotICAgICAgcHJvdC50eXBlLnNob3VsZCA9PSBQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVAotICAgICAgcHJvdC5tZXNzYWdlLnNob3VsZCA9PSAibWVzc2FnZSIKKyAgICAgIHByb3QgPSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCisgICAgICBleHBlY3QocHJvdC50eXBlKS50byBlcShUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKQorICAgICAgZXhwZWN0KHByb3QubWVzc2FnZSkudG8gZXEoIm1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzA1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKQEAgLTAsMCArMSw2MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnZ2VuZXJhdGlvbicgZG8KKyAgYmVmb3JlIGRvCisgICAgcmVxdWlyZSAnbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZGlkIG5vdCBnZW5lcmF0ZSB0aGUgd3JvbmcgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJnZW5lcmF0ZWQgdGhlIHJpZ2h0IGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYi9mbGF0IiwgX19GSUxFX18pCisgICAgWyJuYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY190eXBlcy5yYiIsCisgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQorICAgIGVuZAorICBlbmQKKworICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbworICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKaW5kZXggYzkxOTA1MS4uZGY0NzJhYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCkBAIC0xNywzMyArMTcsNDAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0SFRUUENsaWVudFRyYW5zcG9ydFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQnIGRvCiAKLSAgZGVzY3JpYmUgSFRUUENsaWVudFRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAY2xpZW50ID0gSFRUUENsaWVudFRyYW5zcG9ydC5uZXcoImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIpCisgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpIVFRQQ2xpZW50VHJhbnNwb3J0Lm5ldygiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIikKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBAY2xpZW50LnRvX3MgPT0gImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIGJlIG9wZW4iIGRvCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgICAgQGNsaWVudC5jbG9zZQotICAgICAgQGNsaWVudC5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBjbGllbnQpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcG9zdCB2aWEgSFRUUCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIiBkbwogICAgICAgQGNsaWVudC53cml0ZSAiYSB0ZXN0IgogICAgICAgQGNsaWVudC53cml0ZSAiIGZyYW1lIgotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50ZWUgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KS5hbmRfcmV0dXJuKFtuaWwsICJkYXRhIl0pCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCi0gICAgICBAY2xpZW50LnJlYWQoMTApLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChAY2xpZW50LnJlYWQoMTApKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgY3VzdG9tIGhlYWRlcnMgaWYgZGVmaW5lZCIgZG8KQEAgLTUyLDEzICs1OSw4MSBAQAogICAgICAgaGVhZGVycyA9IHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0ubWVyZ2UoY3VzdG9tX2hlYWRlcnMpCiAKICAgICAgIEBjbGllbnQuYWRkX2hlYWRlcnMoY3VzdG9tX2hlYWRlcnMpCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRlZSBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCBoZWFkZXJzKS5hbmRfcmV0dXJuKFtuaWwsICJkYXRhIl0pCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCBoZWFkZXJzKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgQGNsaWVudC5mbHVzaAogICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZXNldCB0aGUgb3V0YnVmIG9uIEhUVFAgZmFpbHVyZXMnIGRvCisgICAgICBAY2xpZW50LndyaXRlICJ0ZXN0IgorCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSB7IHJhaXNlIE5ldDo6UmVhZFRpbWVvdXQgfQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBAY2xpZW50LmZsdXNoICByZXNjdWUKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG91dGJ1ZikpLnRvIGVxKFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIpCisgICAgZW5kCisKKyAgZW5kCisKKyAgZGVzY3JpYmUgJ3NzbCBlbmFibGVkJyBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBzZXJ2aWNlX3BhdGggPSAiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIKKyAgICAgIEBzZXJ2ZXJfdXJpID0gImh0dHBzOi8vbXkuZG9tYWluLmNvbSIKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgdXNlIFNTTCBmb3IgaHR0cHMiIGRvCisgICAgICBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCIje0BzZXJ2ZXJfdXJpfSN7QHNlcnZpY2VfcGF0aH0iKQorCisgICAgICBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGNsaWVudC5mbHVzaAorICAgICAgZXhwZWN0KGNsaWVudC5yZWFkKDQpKS50byBlcSgiZGF0YSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHNldCBTU0wgdmVyaWZ5IG1vZGUgd2hlbiBzcGVjaWZpZWQiIGRvCisgICAgICBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCIje0BzZXJ2ZXJfdXJpfSN7QHNlcnZpY2VfcGF0aH0iLAorICAgICAgICAgIDpzc2xfdmVyaWZ5X21vZGUgPT4gT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKworICAgICAgY2xpZW50LndyaXRlICJ0ZXN0IgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xpZW50LmZsdXNoCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFhZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCkBAIC0wLDAgKzEsNTUyIEBACisjIGVuY29kaW5nOiBVVEYtOAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnSnNvblByb3RvY29sJyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6SnNvblByb3RvY29sIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBAcHJvdCA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyhAdHJhbnMpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZXNjYXBlZCBjaGFyIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiXG4iKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXHUwMDBhJykKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiICIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMjAnKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGNoYXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxuIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1xcbicpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiICIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcgJykKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcXCIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcXFxcIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJAIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ0AnKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIHN0cmluZyIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fc3RyaW5nKCJ0aGlzIGlzIGEgXFwganNvblxuc3RyaW5nIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwidGhpcyBpcyBhIFxcXFwganNvblxcbnN0cmluZ1wiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBiYXNlNjQiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2Jhc2U2NCgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBpbnRlZ2VyIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDQ1KQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNDUiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoMzMwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMzAwMCIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMDAwMDAwMDAwKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzAwMDAwMDAwMCIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcig2MDAwMDAwMDAwKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNjAwMDAwMDAwMCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZG91YmxlIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoMTIuMykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEyLjMiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgtMy4yMSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIi0zLjIxIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCgrMS4wLzAuMCkvKCsxLjAvMC4wKSkpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIk5hTlwiIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCsxLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgtMS4wLzAuMCkpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIi1JbmZpbml0eVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3Qgc3RhcnQiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gb2JqZWN0IGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYXJyYXkgc3RhcnQiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCJuYW1lIiwgMTIsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiWzEsXCJuYW1lXCIsMTIsMzIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBtZXNzYWdlIGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgc3RydWN0IGJlZ2luIiBkbworICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2JlZ2luKCJuYW1lIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoInsiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGJlZ2luIiBkbworICAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oIm5hbWUiLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzJ7XCJyZWNcIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkX2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIHN0b3AiIGRvCisgICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBtYXAgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9tYXBfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAzMikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLFwibHN0XCIsMzIseyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9tYXBfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9XSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIiwzMiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfbGlzdF9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgc2V0IGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX3NldF9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBib29sIiBkbworICAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMSIpCisKKyAgICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgYnl0ZSIgZG8KKyAgICAgIEBwcm90LndyaXRlX2J5dGUoMTAwKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgaTE2IiBkbworICAgICAgQHByb3Qud3JpdGVfaTE2KDEwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgaTMyIiBkbworICAgICAgQHByb3Qud3JpdGVfaTMyKDMwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgaTY0IiBkbworICAgICAgQHByb3Qud3JpdGVfaTY0KDYwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZG91YmxlIiBkbworICAgICAgQHByb3Qud3JpdGVfZG91YmxlKDEuMjMpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxLjIzIikKKworICAgICAgQHByb3Qud3JpdGVfZG91YmxlKC0zMi4xKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMyLjEiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCgrMS4wLzAuMCkvKCsxLjAvMC4wKSkpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIk5hTlwiIikKKworICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgrMS4wLzAuMCkpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkluZmluaXR5XCIiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKC0xLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQorICAgIGVuZAorCisgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZycgZG8KKyAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbworICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCIpCisgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEXCIiLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbworICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoInRoaXMgaXMgYSBiYXNlNjQgc3RyaW5nIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGxvbmcgYmluYXJ5IiBkbworICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KCgwLi4uMjU2KS50b19hLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwK1AwQkJRa05FUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldsdGNYVjVmWUdGaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2ZTN4OWZuK0FnWUtEaElXR2g0aUppb3VNalk2UGtKR1NrNVNWbHBlWW1acWJuSjJlbjZDaG9xT2twYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNi93TUhDdzhURnhzZkl5Y3JMek0zT3o5RFIwdFBVMWRiWDJObmEyOXpkM3QvZzRlTGo1T1htNStqcDZ1dnM3ZTd2OFBIeTgvVDE5dmY0K2ZyNy9QMysvdz09XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBnZXQgdHlwZSBuYW1lIGZvciB0eXBlIGlkIiBkbworICAgICAgZXhwZWN0IHtAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUT1ApfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZXhwZWN0IHtAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlZPSUQpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Qk9PTCkpLnRvIGVxKCJ0ZiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCWVRFKSkudG8gZXEoImk4IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkpLnRvIGVxKCJkYmwiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoImkxNiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMzIpKS50byBlcSgiaTMyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkpLnRvIGVxKCJpNjQiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKSkudG8gZXEoInN0ciIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpKS50byBlcSgicmVjIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkpLnRvIGVxKCJtYXAiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U0VUKSkudG8gZXEoInNldCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoImxzdCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGdldCB0eXBlIGlkIGZvciB0eXBlIG5hbWUiIGRvCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInBwIil9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgidGYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpOCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCWVRFKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImRibCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpET1VCTEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTE2IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMzIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk2NCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJNjQpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic3RyIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNUUklORykKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJyZWMiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoIm1hcCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic2V0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNFVCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJsc3QiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6TElTVCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIHN5bnRheCBjaGFyIiBkbworICAgICAgQHRyYW5zLndyaXRlKCdGJykKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N5bnRheF9jaGFyKCdHJyl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCisgICAgICBAdHJhbnMud3JpdGUoJ0gnKQorICAgICAgQHByb3QucmVhZF9qc29uX3N5bnRheF9jaGFyKCdIJykKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGVzY2FwZSBjaGFyIiBkbworICAgICAgQHRyYW5zLndyaXRlKCcwMDU0JykKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZXNjYXBlX2NoYXIpLnRvIGVxKCdUJykKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcIiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXFxcXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXFwiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFwvXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXC8iKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXGIiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxmXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXGYiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxuXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXG4iKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxyXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXHIiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFx0XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXHQiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3RyaW5nIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcUCIpCisgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYmFzZTY0IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJcImRHaHBjeUJwY3lCaElIUmxjM1FnYzNSeWFXNW5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2Jhc2U2NCkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGlzIGpzb24gbnVtZXJpYyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkEiKSkudG8gZXEoZmFsc2UpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIrIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCItIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIuIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIwIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIxIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIyIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIzIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI0IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI1IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI2IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI3IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI4IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI5IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJFIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJlIikpLnRvIGVxKHRydWUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBudW1lcmljIGNoYXJzIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1M0U0NVQiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9udW1lcmljX2NoYXJzKS50byBlcSgiMS40NTNFNDUiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gaW50ZWdlciIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMS40NVwiXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25faW50ZWdlcn0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgIEBwcm90LnJlYWRfc3RyaW5nCisKKyAgICAgIEB0cmFucy53cml0ZSgiMTQ1M1QiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9pbnRlZ2VyKS50byBlcSgxNDUzKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gZG91YmxlIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1ZTNlMDFcIlwiIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX2RvdWJsZX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgIEBwcm90LnJlYWRfc3RyaW5nCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCIxLjQ1M2UwMVwiIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX2RvdWJsZX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1M2UwMVwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKDE0LjUzKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCJcIk5hTlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlLm5hbj8pLnRvIGVxKHRydWUpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJJbmZpbml0eVwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgrMS4wLzAuMCkKKworICAgICAgQHRyYW5zLndyaXRlKCJcIi1JbmZpbml0eVwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgtMS4wLzAuMCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG9iamVjdCBzdGFydCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgieyIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9zdGFydCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgifSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9lbmQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGFycmF5IHN0YXJ0IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfc3RhcnQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGFycmF5IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2FycmF5X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkX21lc3NhZ2VfYmVnaW4iIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlsyLCIpCisgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfbWVzc2FnZV9iZWdpbn0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKworICAgICAgQHRyYW5zLndyaXRlKCJbMSxcIm5hbWVcIiwxMiwzMlwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbikudG8gZXEoWyJuYW1lIiwgMTIsIDMyXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBtZXNzYWdlIGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBiZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgieyIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJ1Y3RfYmVnaW4pLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBzdHJ1Y3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9lbmQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBiZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMXtcInJlY1wiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCAxMiwgMV0pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgZmllbGQgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1hcCBiZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsXCJsc3RcIiwyLHsiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbMTIsIDE1LCAyXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBtYXAgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9XSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbGlzdCBiZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsMlwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoWzEyLCAyXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHNldCBiZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsMlwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbMTIsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHNldCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIl0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGJvb2wiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKGZhbHNlKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCIxXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcSh0cnVlKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGJ5dGUiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjYwXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcSg2MCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBpMTYiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEwMDBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kxNikudG8gZXEoMTAwMCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBpMzIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjMwMDAwMDAwMDBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoMzAwMDAwMDAwMCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBpNjQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjYwMDAwMDAwMDBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoNjAwMDAwMDAwMCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBkb3VibGUiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEyLjIzXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKDEyLjIzKQorICAgIGVuZAorCisgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nJyBkbworICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICAgIGV4cGVjdChhKS50byBlcSgndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbworICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICAgIGV4cGVjdChhKS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQorICAgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYmluYXJ5IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJcImRHaHBjeUJwY3lCaElIUmxjM1FnYzNSeWFXNW5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGxvbmcgYmluYXJ5IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJcIkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwK1AwQkJRa05FUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldsdGNYVjVmWUdGaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2ZTN4OWZuK0FnWUtEaElXR2g0aUppb3VNalk2UGtKR1NrNVNWbHBlWW1acWJuSjJlbjZDaG9xT2twYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNi93TUhDdzhURnhzZkl5Y3JMek0zT3o5RFIwdFBVMWRiWDJObmEyOXpkM3QvZzRlTGo1T1htNStqcDZ1dnM3ZTd2OFBIeTgvVDE5dmY0K2ZyNy9QMysvdz09XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYmluYXJ5LmJ5dGVzLnRvX2EpLnRvIGVxKCgwLi4uMjU2KS50b19hKQorICAgIGVuZAorICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImpzb24obWVtb3J5KSIpCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlIFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSBkbworICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgSnNvblByb3RvY29sIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgianNvbiIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9tb25ncmVsX2h0dHBfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9tb25ncmVsX2h0dHBfc2VydmVyX3NwZWMucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTQ0OTEuLjAwMDAwMDAKLS0tIGEvbGliL3JiL3NwZWMvbW9uZ3JlbF9odHRwX3NlcnZlcl9zcGVjLnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJwotcmVxdWlyZSAndGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyJwotCi1jbGFzcyBUaHJpZnRIVFRQU2VydmVyU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotCi0gIEhhbmRsZXIgPSBNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlcgotCi0gIGRlc2NyaWJlIE1vbmdyZWxIVFRQU2VydmVyIGRvCi0gICAgaXQgInNob3VsZCBoYXZlIGFwcHJvcHJpYXRlIGRlZmF1bHRzIiBkbwotICAgICAgbW9ja19mYWN0b3J5ID0gbW9jaygiQmluYXJ5UHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIG1vY2tfcHJvYyA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBCaW5hcnlQcm90b2NvbEZhY3Rvcnkuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrX2ZhY3RvcnkpCi0gICAgICBNb25ncmVsOjpIdHRwU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIjAuMC4wLjAiLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyIikudGVlIGRvIHxtb2NrfAotICAgICAgICAgIGhhbmRsZXIgPSBtb2NrKCJIYW5kbGVyIikKLSAgICAgICAgICBIYW5kbGVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobW9ja19wcm9jLCBtb2NrX2ZhY3RvcnkpLmFuZF9yZXR1cm4oaGFuZGxlcikKLSAgICAgICAgICBtb2NrLnNob3VsZF9yZWNlaXZlKDpyZWdpc3Rlcikud2l0aCgiLyIsIGhhbmRsZXIpCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCB1bmRlcnN0YW5kIDppcCwgOnBvcnQsIDpwYXRoLCBhbmQgOnByb3RvY29sX2ZhY3RvcnkiIGRvCi0gICAgICBtb2NrX3Byb2MgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgbW9ja19mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgiMS4yLjMuNCIsIDEyMzQpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlciIpLnRlZSBkbyB8bW9ja3wKLSAgICAgICAgICBoYW5kbGVyID0gbW9jaygiSGFuZGxlciIpCi0gICAgICAgICAgSGFuZGxlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG1vY2tfcHJvYywgbW9ja19mYWN0b3J5KS5hbmRfcmV0dXJuKGhhbmRsZXIpCi0gICAgICAgICAgbW9jay5zaG91bGRfcmVjZWl2ZSg6cmVnaXN0ZXIpLndpdGgoIi9mb28iLCBoYW5kbGVyKQotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgTW9uZ3JlbEhUVFBTZXJ2ZXIubmV3KG1vY2tfcHJvYywgOmlwID0+ICIxLjIuMy40IiwgOnBvcnQgPT4gMTIzNCwgOnBhdGggPT4gImZvbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvdG9jb2xfZmFjdG9yeSA9PiBtb2NrX2ZhY3RvcnkpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIE1vbmdyZWw6Okh0dHBTZXJ2ZXIiIGRvCi0gICAgICBCaW5hcnlQcm90b2NvbEZhY3Rvcnkuc3R1YiEoOm5ldykKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyIikudGVlIGRvIHxtb2NrfAotICAgICAgICAgIEhhbmRsZXIuc3R1YiEoOm5ldykKLSAgICAgICAgICBtb2NrLnN0dWIhKDpyZWdpc3RlcikKLSAgICAgICAgICBtb2NrLnNob3VsZF9yZWNlaXZlKDpydW4pLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIucnVuIikudGVlIGRvIHxydW5uZXJ8Ci0gICAgICAgICAgICAgIHJ1bm5lci5zaG91bGRfcmVjZWl2ZSg6am9pbikKLSAgICAgICAgICAgIGVuZAotICAgICAgICAgIGVuZAotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgTW9uZ3JlbEhUVFBTZXJ2ZXIubmV3KG5pbCkuc2VydmUKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVzY3JpYmUgTW9uZ3JlbEhUVFBTZXJ2ZXI6OkhhbmRsZXIgZG8KLSAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBmYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIEBoYW5kbGVyID0gSGFuZGxlci5uZXcoQHByb2Nlc3NvciwgQGZhY3RvcnkpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHJldHVybiA0MDQgZm9yIG5vbi1QT1NUIHJlcXVlc3RzIiBkbwotICAgICAgcmVxdWVzdCA9IG1vY2soInJlcXVlc3QiLCA6cGFyYW1zID0+IHsiUkVRVUVTVF9NRVRIT0QiID0+ICJHRVQifSkKLSAgICAgIHJlc3BvbnNlID0gbW9jaygicmVzcG9uc2UiKQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KS53aXRoKDQwNCkKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9ub3RfcmVjZWl2ZSg6c3RhcnQpLndpdGgoMjAwKQotICAgICAgQGhhbmRsZXIucHJvY2VzcyhyZXF1ZXN0LCByZXNwb25zZSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgYXBwbGljYXRpb24veC10aHJpZnQiIGRvCi0gICAgICByZXF1ZXN0ID0gbW9jaygicmVxdWVzdCIsIDpwYXJhbXMgPT4geyJSRVFVRVNUX01FVEhPRCIgPT4gIlBPU1QifSwgOmJvZHkgPT4gbmlsKQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICBoZWFkID0gbW9jaygiaGVhZCIpCi0gICAgICBoZWFkLnNob3VsZF9yZWNlaXZlKDpbXT0pLndpdGgoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICBJT1N0cmVhbVRyYW5zcG9ydC5zdHViISg6bmV3KQotICAgICAgQGZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc3R1YiEoOnByb2Nlc3MpCi0gICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpLndpdGgoMjAwKS5hbmRfeWllbGQoaGVhZCwgbmlsKQotICAgICAgQGhhbmRsZXIucHJvY2VzcyhyZXF1ZXN0LCByZXNwb25zZSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgdXNlIHRoZSBJT1N0cmVhbVRyYW5zcG9ydCIgZG8KLSAgICAgIGJvZHkgPSBtb2NrKCJib2R5IikKLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiUE9TVCJ9LCA6Ym9keSA9PiBib2R5KQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICBoZWFkID0gbW9jaygiaGVhZCIpCi0gICAgICBoZWFkLnN0dWIhKDpbXT0pCi0gICAgICBvdXQgPSBtb2NrKCJvdXQiKQotICAgICAgcHJvdG9jb2wgPSBtb2NrKCJwcm90b2NvbCIpCi0gICAgICB0cmFuc3BvcnQgPSBtb2NrKCJ0cmFuc3BvcnQiKQotICAgICAgSU9TdHJlYW1UcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChib2R5LCBvdXQpLmFuZF9yZXR1cm4odHJhbnNwb3J0KQotICAgICAgQGZhY3Rvcnkuc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkud2l0aCh0cmFuc3BvcnQpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS53aXRoKHByb3RvY29sLCBwcm90b2NvbCkKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApLmFuZF95aWVsZChoZWFkLCBvdXQpCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotICBlbmQKLWVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmQzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnbmFtZXNwYWNlZCBnZW5lcmF0aW9uJyBkbworICBiZWZvcmUgZG8KKyAgICByZXF1aXJlICduYW1lc3BhY2VkX3NwZWNfbmFtZXNwYWNlL25hbWVzcGFjZWRfbm9uYmxvY2tpbmdfc2VydmljZScKKyAgZW5kCisKKyAgaXQgImdlbmVyYXRlZCB0aGUgcmlnaHQgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiIiwgX19GSUxFX18pCisgICAgWyJuYW1lc3BhY2VkX3NwZWNfbmFtZXNwYWNlL25hbWVzcGFjZWRfbm9uYmxvY2tpbmdfc2VydmljZS5yYiIsCisgICAgICJuYW1lc3BhY2VkX3NwZWNfbmFtZXNwYWNlL3RocmlmdF9uYW1lc3BhY2VkX3NwZWNfY29uc3RhbnRzLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY190eXBlcy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAorICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfdHlwZXMucmIiCisgICAgXS5lYWNoIGRvIHxuYW1lfAorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkudG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJkaWQgbm90IGdlbmVyYXRlIHRoZSB3cm9uZyBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfbm9uYmxvY2tpbmdfc2VydmljZS5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX2NvbnN0YW50cy5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZXMucmIiCisgICAgXS5lYWNoIGRvIHxuYW1lfAorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkubm90X3RvIGJlX3RydXRoeQorICAgIGVuZAorICBlbmQKKworICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbworICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAiZXh0ZW5kZWQgYSBzZXJ2aWNlIiBkbworICAgIHJlcXVpcmUgImV4dGVuZGVkL2V4dGVuZGVkX3NlcnZpY2UiCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKaW5kZXggZWFkNTFkNy4uNjEzZDg4MyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKQEAgLTE3LDExICsxNyw5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdE5vbmJsb2NraW5nU2VydmVyU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdOb25ibG9ja2luZ1NlcnZlcicgZG8KIAogICBjbGFzcyBIYW5kbGVyCiAgICAgZGVmIGluaXRpYWxpemUKQEAgLTU1LDcgKzUzLDcgQEAKICAgICBlbmQKICAgZW5kCiAKLSAgY2xhc3MgU3BlY1RyYW5zcG9ydCA8IEJhc2VUcmFuc3BvcnQKKyAgY2xhc3MgU3BlY1RyYW5zcG9ydCA8IFRocmlmdDo6QmFzZVRyYW5zcG9ydAogICAgIGRlZiBpbml0aWFsaXplKHRyYW5zcG9ydCwgcXVldWUpCiAgICAgICBAdHJhbnNwb3J0ID0gdHJhbnNwb3J0CiAgICAgICBAcXVldWUgPSBxdWV1ZQpAQCAtODksNyArODcsNyBAQAogICAgIGVuZAogICBlbmQKIAotICBjbGFzcyBTcGVjU2VydmVyU29ja2V0IDwgU2VydmVyU29ja2V0CisgIGNsYXNzIFNwZWNTZXJ2ZXJTb2NrZXQgPCBUaHJpZnQ6OlNlcnZlclNvY2tldAogICAgIGRlZiBpbml0aWFsaXplKGhvc3QsIHBvcnQsIHF1ZXVlKQogICAgICAgc3VwZXIoaG9zdCwgcG9ydCkKICAgICAgIEBxdWV1ZSA9IHF1ZXVlCkBAIC0xMDUsMTMgKzEwMywxMyBAQAogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBwb3J0ID0gNDMyNTEKICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyLm5ldwotICAgICAgcHJvY2Vzc29yID0gTm9uYmxvY2tpbmdTZXJ2aWNlOjpQcm9jZXNzb3IubmV3KGhhbmRsZXIpCisgICAgICBwcm9jZXNzb3IgPSBTcGVjTmFtZXNwYWNlOjpOb25ibG9ja2luZ1NlcnZpY2U6OlByb2Nlc3Nvci5uZXcoaGFuZGxlcikKICAgICAgIHF1ZXVlID0gUXVldWUubmV3CiAgICAgICBAdHJhbnNwb3J0ID0gU3BlY1NlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIEBwb3J0LCBxdWV1ZSkKLSAgICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gRnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKKyAgICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwogICAgICAgbG9nZ2VyID0gTG9nZ2VyLm5ldyhTVERFUlIpCiAgICAgICBsb2dnZXIubGV2ZWwgPSBMb2dnZXI6OldBUk4KLSAgICAgIEBzZXJ2ZXIgPSBOb25ibG9ja2luZ1NlcnZlci5uZXcocHJvY2Vzc29yLCBAdHJhbnNwb3J0LCB0cmFuc3BvcnRfZmFjdG9yeSwgbmlsLCA1LCBsb2dnZXIpCisgICAgICBAc2VydmVyID0gVGhyaWZ0OjpOb25ibG9ja2luZ1NlcnZlci5uZXcocHJvY2Vzc29yLCBAdHJhbnNwb3J0LCB0cmFuc3BvcnRfZmFjdG9yeSwgbmlsLCA1LCBsb2dnZXIpCiAgICAgICBoYW5kbGVyLnNlcnZlciA9IEBzZXJ2ZXIKICAgICAgIEBzZXJ2ZXJfdGhyZWFkID0gVGhyZWFkLm5ldyhUaHJlYWQuY3VycmVudCkgZG8gfG1hc3Rlcl90aHJlYWR8CiAgICAgICAgIGJlZ2luCkBAIC0xMzYsOSArMTM0LDkgQEAKICAgICBlbmQKIAogICAgIGRlZiBzZXR1cF9jbGllbnQocXVldWUgPSBuaWwpCi0gICAgICB0cmFuc3BvcnQgPSBTcGVjVHJhbnNwb3J0Lm5ldyhGcmFtZWRUcmFuc3BvcnQubmV3KFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIEBwb3J0KSksIHF1ZXVlKQotICAgICAgcHJvdG9jb2wgPSBCaW5hcnlQcm90b2NvbC5uZXcodHJhbnNwb3J0KQotICAgICAgY2xpZW50ID0gTm9uYmxvY2tpbmdTZXJ2aWNlOjpDbGllbnQubmV3KHByb3RvY29sKQorICAgICAgdHJhbnNwb3J0ID0gU3BlY1RyYW5zcG9ydC5uZXcoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQpKSwgcXVldWUpCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zcG9ydCkKKyAgICAgIGNsaWVudCA9IFNwZWNOYW1lc3BhY2U6Ok5vbmJsb2NraW5nU2VydmljZTo6Q2xpZW50Lm5ldyhwcm90b2NvbCkKICAgICAgIHRyYW5zcG9ydC5vcGVuCiAgICAgICBAY2xpZW50cyA8PCBbY2xpZW50LCB0cmFuc3BvcnRdCiAgICAgICBjbGllbnQKQEAgLTE3OCw4ICsxNzYsOCBAQAogCiAgICAgaXQgInNob3VsZCBoYW5kbGUgYmFzaWMgbWVzc2FnZSBwYXNzaW5nIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IEhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMTk3LDcgKzE5NSw3IEBACiAgICAgICBlbmQKICAgICAgIDQudGltZXMgeyB0cmFuc19xdWV1ZS5wb3AgfQogICAgICAgc2V0dXBfY2xpZW50LnVuYmxvY2soNCkKLSAgICAgIDQudGltZXMgeyBxdWV1ZS5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChxdWV1ZS5wb3ApLnRvIGJlX3RydXRoeSB9CiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIxNCwxNSArMjEyLDE1IEBACiAgICAgICBxdWV1ZXNbNF0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNV0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNl0gPDwgOmhlbGxvCi0gICAgICAzLnRpbWVzIHsgcmVzdWx0LnBvcC5zaG91bGQgPT0gSGVsbG8ubmV3IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3CisgICAgICAzLnRpbWVzIHsgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykgfQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgcXVldWVzWzVdIDw8IFs6dW5ibG9jaywgNF0KLSAgICAgIDQudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCBiZV90cnVlIH0KKyAgICAgIDQudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIHF1ZXVlc1syXSA8PCA6aGVsbG8KLSAgICAgIHJlc3VsdC5wb3Auc2hvdWxkID09IEhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChyZXN1bHQucG9wKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKGZhbHNlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykpCiAgICAgICA3LnRpbWVzIHsgcXVldWVzLnNoaWZ0IDw8IDpleGl0IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIzMSw3ICsyMjksNyBAQAogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50CiAgICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpICMgZm9yY2UgYSBtZXNzYWdlIHBhc3MKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgYWN0aXZlIG1lc3NhZ2VzIHdoZW4gc2h1dHRpbmcgZG93biIgZG8KQEAgLTI0MCw4ICsyMzgsOCBAQAogICAgICAgY2xpZW50IDw8IDpzbGVlcAogICAgICAgc2xlZXAgMC4xICMgZ2l2ZSB0aGUgc2VydmVyIHRpbWUgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gOnNsZXB0CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKDpzbGVwdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQga2lsbCBhY3RpdmUgbWVzc2FnZXMgd2hlbiB0aGV5IGRvbid0IGV4cGlyZSB3aGlsZSBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjUxLDE1ICsyNDksMTUgQEAKICAgICAgIHNsZWVwIDAuMSAjIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNsaWVudCdzIG1lc3NhZ2UKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24oMSkKICAgICAgIEBjYXRjaF9leGNlcHRpb25zID0gdHJ1ZQotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigzKS5zaG91bGRfbm90IGJlX25pbAotICAgICAgcmVzdWx0LnNob3VsZCBiZV9lbXB0eQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMykpLm5vdF90byBiZV9uaWwKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGJlX2VtcHR5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsbG93IHNodXR0aW5nIGRvd24gaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IEhlbGxvLm5ldworICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgY2xpZW50LnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZF9ub3QgYmVfbmlsCisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkubm90X3RvIGJlX25pbAogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgppbmRleCBkMzVmNjUyLi5kMzA1NTNmIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgpAQCAtMTcsNjUgKzE3LDYyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdFByb2Nlc3NvclNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdQcm9jZXNzb3InIGRvCiAKICAgY2xhc3MgUHJvY2Vzc29yU3BlYwogICAgIGluY2x1ZGUgVGhyaWZ0OjpQcm9jZXNzb3IKICAgZW5kCiAKLSAgZGVzY3JpYmUgIlByb2Nlc3NvciIgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpQcm9jZXNzb3IgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gUHJvY2Vzc29yU3BlYy5uZXcobW9jaygiTW9ja0hhbmRsZXIiKSkKLSAgICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhkb3VibGUoIk1vY2tIYW5kbGVyIikpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBlbmQKIAogICAgIGRlZiBtb2NrX3RyYW5zKG9iaikKLSAgICAgIG9iai5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpLm9yZGVyZWQuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJ0cmFucyIpLnRlZSBkbyB8dHJhbnN8Ci0gICAgICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3Qob2JqKS50byByZWNlaXZlKDp0cmFucykub3JkZXJlZCBkbworICAgICAgICBkb3VibGUoInRyYW5zIikudGFwIGRvIHx0cmFuc3wKKyAgICAgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNhbGwgcHJvY2Vzc188bWVzc2FnZT4gd2hlbiBpdCByZWNlaXZlcyB0aGF0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMTddCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTddCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2Vzc190ZXN0TWVzc2FnZSkud2l0aCgxNywgQHByb3QsIEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkpLnRvIGVxKHRydWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdoZW4gdGhlIHJlY2VpdmVkIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCA0XQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6OlNUUlVDVCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIE1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCA0KS5vcmRlcmVkCi0gICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgIlVua25vd24gZnVuY3Rpb24gdGVzdE1lc3NhZ2UiKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soQXBwbGljYXRpb25FeGNlcHRpb24pLnRlZSBkbyB8ZXwKLSAgICAgICAgICBlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgNF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKKyAgICAgIGUgPSBkb3VibGUoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgIGV4cGVjdChlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgIlVua25vd24gZnVuY3Rpb24gdGVzdE1lc3NhZ2UiKS5hbmRfcmV0dXJuKGUpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCiAgICAgICBtb2NrX3RyYW5zKEBwcm90KQogICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyBhcmdzIG9mZiB0byB0aGUgYXJncyBjbGFzcyIgZG8KLSAgICAgIGFyZ3NfY2xhc3MgPSBtb2NrKCJNb2NrQXJnc0NsYXNzIikKLSAgICAgIGFyZ3MgPSBtb2NrKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50ZWUgZG8gfGFyZ3N8Ci0gICAgICAgIGFyZ3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGFyZ3NfY2xhc3MgPSBkb3VibGUoIk1vY2tBcmdzQ2xhc3MiKQorICAgICAgYXJncyA9IGRvdWJsZSgiIzxNb2NrQXJnc0NsYXNzOm1vY2s+IikudGFwIGRvIHxhcmdzfAorICAgICAgICBleHBlY3QoYXJncykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAogICAgICAgZW5kCi0gICAgICBhcmdzX2NsYXNzLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKS5zaG91bGQgZXFsKGFyZ3MpCisgICAgICBleHBlY3QoYXJnc19jbGFzcykudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGFyZ3MKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKSkudG8gZXFsKGFyZ3MpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG91dCBhIHJlcGx5IHdoZW4gYXNrZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OlJFUExZLCAyMykub3JkZXJlZAotICAgICAgcmVzdWx0ID0gbW9jaygiTW9ja1Jlc3VsdCIpCi0gICAgICByZXN1bHQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCisgICAgICByZXN1bHQgPSBkb3VibGUoIk1vY2tSZXN1bHQiKQorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLndyaXRlX3Jlc3VsdChyZXN1bHQsIEBwcm90LCAndGVzdE1lc3NhZ2UnLCAyMykKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgppbmRleCA0NDMzOWMwLi4yYTdkYzZkIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCkBAIC0xNyw1MyArMTcsNTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0U2VyaWFsaXplclNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLSAgaW5jbHVkZSBTcGVjTmFtZXNwYWNlCitkZXNjcmliZSAnU2VyaWFsaXplcicgZG8KIAotICBkZXNjcmliZSBTZXJpYWxpemVyIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6U2VyaWFsaXplciBkbwogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCi0gICAgICBzZXJpYWxpemVyID0gU2VyaWFsaXplci5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCi0gICAgICBkYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUoSGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKLSAgICAgIGRhdGEuc2hvdWxkID09ICJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIgorICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCisgICAgICBkYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKKyAgICAgIGV4cGVjdChkYXRhKS50byBlcSgiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBzdHJ1Y3RzIHRvIHRoZSBnaXZlbiBwcm90b2NvbCIgZG8KLSAgICAgIHByb3RvY29sID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoSGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcocHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIERlc2VyaWFsaXplciBkbworICBkZXNjcmliZSBUaHJpZnQ6OkRlc2VyaWFsaXplciBkbwogICAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgc3RydWN0cyBmcm9tIGJpbmFyeSBieSBkZWZhdWx0IiBkbwotICAgICAgZGVzZXJpYWxpemVyID0gRGVzZXJpYWxpemVyLm5ldworICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3CiAgICAgICBkYXRhID0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCi0gICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoSGVsbG8ubmV3LCBkYXRhKS5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKQorICAgICAgZXhwZWN0KGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsIGRhdGEpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5hbmRfcmV0dXJuKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVHlwZXM6OlNUUklORywgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0pCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oIkdvb2QgZGF5IikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIGRlc2VyaWFsaXplciA9IERlc2VyaWFsaXplci5uZXcocHJvdG9jb2xfZmFjdG9yeSkKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShIZWxsby5uZXcsICIiKS5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGRvdWJsZSgiUHJvdG9jb2xGYWN0b3J5IikKKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKKyAgICAgIGRlc2VyaWFsaXplciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQorICAgICAgZXhwZWN0KGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsICIiKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgppbmRleCBmY2U1MDEzLi5lYzllNTUwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0xNyw2NCArMTcsNjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3NvY2tldF9zcGVjX3NoYXJlZCIKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCiAKLWNsYXNzIFRocmlmdFNlcnZlclNvY2tldFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdUaHJpZnQ6OlNlcnZlclNvY2tldCcgZG8KIAotICBkZXNjcmliZSBTZXJ2ZXJTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAc29ja2V0ID0gU2VydmVyU29ja2V0Lm5ldygxMjM0KQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldygxMjM0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBoYW5kbGUgd2hlbiBjYWxsaW5nIGxpc3RlbiIgZG8KLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgaG9zdCBhcmd1bWVudCIgZG8KLSAgICAgIEBzb2NrZXQgPSBTZXJ2ZXJTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCAxMjM0KQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgQHNvY2tldC50b19zID09ICJzZXJ2ZXIobG9jYWxob3N0OjEyMzQpIgogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpTb2NrZXQgdG8gd3JhcCBhY2NlcHRlZCBzb2NrZXRzIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIikKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJTb2NrZXQiKQotICAgICBTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgic29ja2V0KDoxMjM0KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCmluZGV4IGZmZTliZmYuLjU3ZjUyMzcgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCkBAIC0xNiwxNDUgKzE2LDE3MiBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCitkZXNjcmliZSAnU2VydmVyJyBkbwogCi1jbGFzcyBUaHJpZnRTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0KLSAgZGVzY3JpYmUgQmFzZVNlcnZlciBkbwotICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KLSAgICAgIHNlcnZlciA9IEJhc2VTZXJ2ZXIubmV3KG1vY2soIlByb2Nlc3NvciIpLCBtb2NrKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5Jykuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKEJhc2VUcmFuc3BvcnRGYWN0b3J5KQotICAgICAgc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5Jykuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKEJpbmFyeVByb3RvY29sRmFjdG9yeSkKLSAgICBlbmQKLQotICAgICMgc2VydmUgaXMgYSBub29wLCBzbyBjYW4ndCB0ZXN0IHRoYXQKLSAgZW5kCi0KLSAgc2hhcmVkX2V4YW1wbGVzX2ZvciAic2VydmVycyIgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyVHJhbnMgPSBtb2NrKCJTZXJ2ZXJUcmFuc3BvcnQiKQotICAgICAgQHRyYW5zID0gbW9jaygiQmFzZVRyYW5zcG9ydCIpCi0gICAgICBAcHJvdCA9IG1vY2soIkJhc2VQcm90b2NvbCIpCi0gICAgICBAY2xpZW50ID0gbW9jaygiQ2xpZW50IikKLSAgICAgIEBzZXJ2ZXIgPSBzZXJ2ZXJfdHlwZS5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6OkJhc2VTZXJ2ZXIubmV3KGRvdWJsZSgiUHJvY2Vzc29yIiksIGRvdWJsZSgiQmFzZVNlcnZlclRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAcHJvdG9jb2xfZmFjdG9yeScpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgbm90IHNlcnZlIiBkbworICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSgpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgic2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBTaW1wbGVTZXJ2ZXIgZG8KLSAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgInNlcnZlcnMiCi0KLSAgICBkZWYgc2VydmVyX3R5cGUKLSAgICAgIFNpbXBsZVNlcnZlcgorICBkZXNjcmliZSBUaHJpZnQ6OlNpbXBsZVNlcnZlciBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAotCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzaW1wbGUoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluIHRoZSBtYWluIHRocmVhZCIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgVGhyZWFkZWRTZXJ2ZXIgZG8KLSAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgInNlcnZlcnMiCi0KLSAgICBkZWYgc2VydmVyX3R5cGUKLSAgICAgIFRocmVhZGVkU2VydmVyCisgIGRlc2NyaWJlIFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKKyAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkZWQoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIHRocmVhZHMiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwcm90LCBAdHJhbnMpLmV4YWN0bHkoMykudGltZXMuYW5kX3lpZWxkKEBwcm90LCBAdHJhbnMpCiAgICAgICB4ID0gMAotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiB0aHJvdyA6c3RvcAogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZAotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUgfS50byB0aHJvd19zeW1ib2woOnN0b3ApCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFRocmVhZFBvb2xTZXJ2ZXIgZG8KLSAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgInNlcnZlcnMiCi0KLSAgICBkZWYgc2VydmVyX3R5cGUKLSAgICAgICMgcHV0IHRoaXMgc3R1ZmYgaGVyZSBzbyBpdCBydW5zIGJlZm9yZSB0aGUgc2VydmVyIGlzIGNyZWF0ZWQKLSAgICAgIEB0aHJlYWRRID0gbW9jaygiU2l6ZWRRdWV1ZSIpCi0gICAgICBTaXplZFF1ZXVlLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoMjApLmFuZF9yZXR1cm4oQHRocmVhZFEpCi0gICAgICBAZXhjUSA9IG1vY2soIlF1ZXVlIikKLSAgICAgIFF1ZXVlLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGV4Y1EpCi0gICAgICBUaHJlYWRQb29sU2VydmVyCisgIGRlc2NyaWJlIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyX3RyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKKyAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJfdHJhbnMsIEB0cmFucywgQHByb3QpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCBzZXQgdXAgdGhlIHF1ZXVlcyIgZG8KLSAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRocmVhZF9xJykuc2hvdWxkIGJlKEB0aHJlYWRRKQotICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAZXhjZXB0aW9uX3EnKS5zaG91bGQgYmUoQGV4Y1EpCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyX3RyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInRocmVhZHBvb2woc2VydmVyKHByb3QodHJhbnMoc2VydmVyX3RyYW5zKSkpKSIpCiAgICAgZW5kCi0KKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZCIgZG8KLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvIHxibG9ja3wKLSAgICAgICAgQHNlcnZlci5zaG91bGRfcmVjZWl2ZSg6c2VydmUpCi0gICAgICAgIGJsb2NrLmNhbGwKLSAgICAgICAgQHNlcnZlci5yc3BlY192ZXJpZnkKKyAgICAgIGV4Y2VwdGlvbl9xID0gQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBleGNlcHRpb25fcSkKKyAgICAgIGV4cGVjdF9hbnlfaW5zdGFuY2Vfb2YoZGVzY3JpYmVkX2NsYXNzKS50byByZWNlaXZlKDpzZXJ2ZSkgZG8gCisgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SJykpCiAgICAgICBlbmQKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwb3ApLmFuZF90aHJvdyg6cG9wcGVkKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpwb3BwZWQpCisgICAgICBleHBlY3QgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnRvKHJhaXNlX2Vycm9yKCdFUlJPUicpKQorICAgICAgc2xlZXAoMC4xNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYXZvaWQgcnVubmluZyB0aGUgc2VydmVyIHR3aWNlIHdoZW4gcmV0cnlpbmcgcmVzY3VhYmxlX3NlcnZlIiBkbwotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8gfGJsb2NrfAotICAgICAgICBAc2VydmVyLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkKLSAgICAgICAgYmxvY2suY2FsbAotICAgICAgICBAc2VydmVyLnJzcGVjX3ZlcmlmeQorICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IxJykpCisgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SMicpKQogICAgICAgZW5kCi0gICAgICBAZXhjUS5zaG91bGRfcmVjZWl2ZSg6cG9wKS50d2ljZS5hbmRfdGhyb3coOnBvcHBlZCkKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6cG9wcGVkKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpwb3BwZWQpCisgICAgICBleHBlY3QgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnRvKHJhaXNlX2Vycm9yKCdFUlJPUjEnKSkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SMicpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyBhIHRocmVhZCBwb29sIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEB0aHJlYWRRLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKLSAgICAgIEB0aHJlYWRRLnNob3VsZF9yZWNlaXZlKDpwb3ApCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3lpZWxkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICB0aHJlYWRfcSA9IGRvdWJsZSgiU2l6ZWRRdWV1ZSIpCisgICAgICBleGNlcHRpb25fcSA9IGRvdWJsZSgiUXVldWUiKQorICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkB0aHJlYWRfcSwgdGhyZWFkX3EpCisgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QGV4Y2VwdGlvbl9xLCBleGNlcHRpb25fcSkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aCg6dG9rZW4pCisgICAgICBleHBlY3QodGhyZWFkX3EpLnRvIHJlY2VpdmUoOnBvcCkKKyAgICAgIGV4cGVjdChUaHJlYWQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3lpZWxkCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKICAgICAgIGVycm9yID0gUnVudGltZUVycm9yLm5ldygiU3RvcHBlZCIpCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHJhaXNlIGVycm9yCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAZXhjUS5zaG91bGRfcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChleGNlcHRpb25fcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvKHRocm93X3N5bWJvbCg6c3RvcCkpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCmluZGV4IGRkOGIwZjkuLjIwMmM3NDUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCkBAIC0xNyw0NSArMTcsNTIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3NvY2tldF9zcGVjX3NoYXJlZCIKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCiAKLWNsYXNzIFRocmlmdFNvY2tldFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdTb2NrZXQnIGRvCiAKLSAgZGVzY3JpYmUgU29ja2V0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6U29ja2V0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHNvY2tldCA9IFNvY2tldC5uZXcKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y29ubmVjdF9ub25ibG9jaykKLSAgICAgIDo6U29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKICAgICBlbmQKIAogICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlKSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChsb2NhbGhvc3Q6OTA5MCkiCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlKSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQotICAgICAgU29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCkub3BlbgorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChteS5kb21haW46MTIzNCkiCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbwotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykKLSAgICAgIFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ215aG9zdCcsIDgwOTApLnRvX3MpLnRvIGVxKCJzb2NrZXQobXlob3N0OjgwOTApIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgppbmRleCA5NmI0MzNiLi4zMmJkYjcxIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCkBAIC0xNyw4OCArMTcsODggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAogc2hhcmVkX2V4YW1wbGVzX2ZvciAiYSBzb2NrZXQiIGRvCiAgIGl0ICJzaG91bGQgb3BlbiBhIHNvY2tldCIgZG8KLSAgICBAc29ja2V0Lm9wZW4uc2hvdWxkID09IEBoYW5kbGUKKyAgICBleHBlY3QoQHNvY2tldC5vcGVuKS50byBlcShAaGFuZGxlKQogICBlbmQKIAogICBpdCAic2hvdWxkIGJlIG9wZW4gd2hlbmV2ZXIgaXQgaGFzIGEgaGFuZGxlIiBkbwotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQHNvY2tldC5zaG91bGQgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBuaWwKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICAgIEBzb2NrZXQuaGFuZGxlID0gQGhhbmRsZQogICAgIEBzb2NrZXQuY2xvc2UKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHdyaXRlIGRhdGEgdG8gdGhlIGhhbmRsZSIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpCiAgICAgQHNvY2tldC53cml0ZSgiZm9vYmFyIikKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIGl0IGNhbm5vdCByZWFkIGZyb20gdGhlIGhhbmRsZSIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDE3KSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByZXR1cm4gdGhlIGRhdGEgcmVhZCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgaGFuZGxlIHdvcmtzIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQotICAgIEBzb2NrZXQucmVhZCgxNykuc2hvdWxkID09ICJ0ZXN0IGRhdGEiCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWNsYXJlIGl0c2VsZiBhcyBjbG9zZWQgd2hlbiBpdCBoYXMgYW4gZXJyb3IiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfb3BlbgorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCi0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDEwKSB9LnNob3VsZCByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCisgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTApIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQogICBlbmQKIAogICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHRpbWVvdXQgYWNjZXNzb3IgZm9yIHJlYWQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMwogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgoW0BoYW5kbGVdLCBuaWwsIG5pbCwgMykuYW5kX3JldHVybihbW0BoYW5kbGVdLCBbXSwgW11dKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQotICAgIEBzb2NrZXQucmVhZCgxNykuc2hvdWxkID09ICJ0ZXN0IGRhdGEiCisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgoW0BoYW5kbGVdLCBuaWwsIG5pbCwgMykuYW5kX3JldHVybihbW0BoYW5kbGVdLCBbXSwgW11dKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKKyAgICBleHBlY3QoQHNvY2tldC5yZWFkKDE3KSkudG8gZXEoInRlc3QgZGF0YSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3Igd3JpdGUiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMwogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMykudHdpY2UuYW5kX3JldHVybihbW10sIFtAaGFuZGxlXSwgW11dKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoIiBkYXRhIikuYW5kX3JldHVybig1KQotICAgIEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpLnNob3VsZCA9PSA5CisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMykudHdpY2UuYW5kX3JldHVybihbW10sIFtAaGFuZGxlXSwgW11dKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgidGVzdCBkYXRhIikuYW5kX3JldHVybig0KQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCisgICAgZXhwZWN0KEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpKS50byBlcSg5KQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gcmVhZCB0aW1lcyBvdXQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMC41CiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAwLjUpLmF0X2xlYXN0KDEpLnRpbWVzLmFuZF9yZXR1cm4obmlsKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxNykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCB9CisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLm9uY2Uge3NsZWVwKDAuNSk7IG5pbH0KKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHdyaXRlIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDAuNSkuYW55X251bWJlcl9vZl90aW1lcy5hbmRfcmV0dXJuKG5pbCkKLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBhbGxvdyhJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDAuNSkuYW5kX3JldHVybihuaWwpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIgYi9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgppbmRleCBlYjVkMjljLi41YmY5OGQwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgorKysgYi9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgpAQCAtMSwzICsxLDQgQEAKKyMgZW5jb2Rpbmc6IFVURi04CiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE4LDkgKzE5LDcgQEAKICMKIAogcmVxdWlyZSAncnVieWdlbXMnCi0jIHJlcXVpcmUgYXQgbGVhc3QgMS4xLjQgdG8gZml4IGEgYnVnIHdpdGggZGVzY3JpYmluZyBNb2R1bGVzCi1nZW0gJ3JzcGVjJywgJz49IDEuMS40JwotcmVxdWlyZSAnc3BlYycKK3JlcXVpcmUgJ3JzcGVjJwogCiAkOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbLi4gZXh0XSkKIApAQCAtMjgsMzMgKzI3LDM4IEBACiAjIHdpbGwgZ2V0IHNjcmV3ZWQgdXAKICMgJCIgPDwgJ2Zhc3R0aHJlYWQuYnVuZGxlJwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL2xpYi90aHJpZnQnCityZXF1aXJlICd0aHJpZnQnCiAKLWNsYXNzIE9iamVjdAotICAjIHRlZSBpcyBhIHVzZWZ1bCBtZXRob2QsIHNvIGxldCdzIGxldCBvdXIgdGVzdHMgaGF2ZSBpdAotICBkZWYgdGVlKCZibG9jaykKLSAgICBibG9jay5jYWxsKHNlbGYpCi0gICAgc2VsZgordW5sZXNzIE9iamVjdC5tZXRob2RfZGVmaW5lZD8gOnRhcAorICAjIGlmIE9iamVjdCN0YXAgaXNuJ3QgZGVmaW5lZCwgdGhlbiBhZGQgaXQ7IHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIFJ1YnkgPCAxLjguNworICBjbGFzcyBPYmplY3QKKyAgICBkZWYgdGFwKCZibG9jaykKKyAgICAgIGJsb2NrLmNhbGwoc2VsZikKKyAgICAgIHNlbGYKKyAgICBlbmQKICAgZW5kCiBlbmQKIAotU3BlYzo6UnVubmVyLmNvbmZpZ3VyZSBkbyB8Y29uZmlndXJhdGlvbnwKK1JTcGVjLmNvbmZpZ3VyZSBkbyB8Y29uZmlndXJhdGlvbnwKICAgY29uZmlndXJhdGlvbi5iZWZvcmUoOmVhY2gpIGRvCiAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgIGVuZAogZW5kCiAKLSQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1suLiBkZWJ1Z19wcm90b190ZXN0IGdlbi1yYl0pCi1yZXF1aXJlICJzcnYiCi1yZXF1aXJlICJkZWJ1Z19wcm90b190ZXN0X2NvbnN0YW50cyIKKyQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1suLiB0ZXN0IGRlYnVnX3Byb3RvIGdlbi1yYl0pCityZXF1aXJlICdzcnYnCityZXF1aXJlICdkZWJ1Z19wcm90b190ZXN0X2NvbnN0YW50cycKIAogJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3W2dlbi1yYl0pCiByZXF1aXJlICd0aHJpZnRfc3BlY190eXBlcycKIHJlcXVpcmUgJ25vbmJsb2NraW5nX3NlcnZpY2UnCiAKIG1vZHVsZSBGaXh0dXJlcwotICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gQ09NUEFDVF9URVNULmR1cAorICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gVGhyaWZ0OjpUZXN0OjpDT01QQUNUX1RFU1QuZHVwCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QuYV9iaW5hcnkgPSBbMCwxLDIsMyw0LDUsNiw3LDhdLnBhY2soJ2MqJykKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5tYXBfYnl0ZV9tYXAgPSBuaWwKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZAorCiskOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbZ2VuLXJiL2ZsYXRdKQorCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmU2NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNlcnZlclNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcoMTIzNCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KDoxMjM0KSkiKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKQEAgLTAsMCArMSw3OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCisKK2Rlc2NyaWJlICdTU0xTb2NrZXQnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTU0xTb2NrZXQgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAY29udGV4dCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC5uZXcKKyAgICAgIEBzaW1wbGVfc29ja2V0X2hhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorCisgICAgICBAaGFuZGxlID0gZG91YmxlKGRvdWJsZSgiU1NMSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnBvc3RfY29ubmVjdGlvbl9jaGVjayA9PiB0cnVlKSwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spCisKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQHNpbXBsZV9zb2NrZXRfaGFuZGxlKQorICAgICAgYWxsb3coT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgIGVuZAorCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKKworICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNzbCBzb2NrZXQiIGRvCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAc2ltcGxlX3NvY2tldF9oYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbG9jYWxob3N0JykKKyAgICAgIEBzb2NrZXQub3BlbgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCisgICAgICBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChoYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbXkuZG9tYWluJykKKyAgICAgIFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCwgNjAwMCwgbmlsKS5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIGNvbnRleHQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1LCBAY29udGV4dCkuc3NsX2NvbnRleHQpLnRvIGVxKEBjb250ZXh0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNzbChzb2NrZXQobXlob3N0OjgwOTApKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjM1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgpAQCAtMCwwICsxLDE5MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnU3RydWN0TmVzdGVkQ29udGFpbmVycycgZG8KKworICBkZWYgd2l0aF90eXBlX2NoZWNraW5nCisgICAgc2F2ZWRfdHlwZV9jaGVja2luZywgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBUaHJpZnQudHlwZV9jaGVja2luZywgdHJ1ZQorICAgIGJlZ2luCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBzYXZlZF90eXBlX2NoZWNraW5nCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlIFRocmlmdDo6U3RydWN0IGRvCisgICAgIyBOZXN0ZWQgY29udGFpbmVyIHRlc3RzLCBzZWUgVEhSSUZULTM2OS4KKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluc2lkZSBsaXN0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTGlzdC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbkxpc3QubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXSwgWzIsIDMsIDRdIF0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5wdXNoIFszLCA0LCA1XQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbGlzdHMgaW5zaWRlIHNldHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJblNldC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJblNldC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXS50b19zZXQKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5hZGQgWzMsIDQsIDVdCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBsaXN0cyBpbiBtYXAga2V5cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTWFwS2V5Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTWFwS2V5Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10gPT4gMSwgWzIsIDMsIDRdID0+IDIgfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlW1szLCA0LCA1XV0gPSAzCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBsaXN0cyBpbiBtYXAgdmFsdWVzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBWYWx1ZS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbk1hcFZhbHVlLm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXSwgMiA9PiBbMiwgMywgNF0gfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlWzNdID0gWzMsIDQsIDVdCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBzZXRzIGluc2lkZSBsaXN0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5MaXN0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5MaXN0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10udG9fc2V0LCBbMiwgMywgNF0udG9fc2V0IF0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5wdXNoKFszLCA0LCA1XS50b19zZXQpCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBzZXRzIGluc2lkZSBzZXRzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJblNldC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluU2V0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10udG9fc2V0LCBbMiwgMywgNF0udG9fc2V0IF0udG9fc2V0CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUuYWRkKFszLCA0LCA1XS50b19zZXQpCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBzZXRzIGluIG1hcCBrZXlzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbk1hcEtleS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwS2V5Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10udG9fc2V0ID0+IDEsIFsyLCAzLCA0XS50b19zZXQgPT4gMiB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdLnRvX3NldF0gPSAzCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBzZXRzIGluIG1hcCB2YWx1ZXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwVmFsdWUubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbk1hcFZhbHVlLm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXS50b19zZXQsIDIgPT4gWzIsIDMsIDRdLnRvX3NldCB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0udG9fc2V0CisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBtYXBzIGluc2lkZSBsaXN0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5MaXN0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5MaXN0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyB7MSA9PiAyLCAzID0+IDR9LCB7MiA9PiAzLCA0ID0+IDV9IF0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5wdXNoKHsgMyA9PiA0LCA1ID0+IDYgfSkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW5zaWRlIHNldHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluU2V0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5TZXQubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXS50b19zZXQKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5hZGQoeyAzID0+IDQsIDUgPT4gNiB9KQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbWFwcyBpbiBtYXAga2V5cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5NYXBLZXkubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbk1hcEtleS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgeyAxID0+IDIsIDMgPT4gNH0gPT4gMSwgezIgPT4gMywgNCA9PiA1fSAgPT4gMiB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbezMgPT4gNCwgNSA9PiA2fV0gPSAzCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBtYXBzIGluIG1hcCB2YWx1ZXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwVmFsdWUubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbk1hcFZhbHVlLm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IHsgMSA9PiAyLCAzID0+IDR9LCAyID0+IHsyID0+IDMsIDQgPT4gNX0gfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlWzNdID0geyAzID0+IDQsIDUgPT4gNiB9CisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgppbmRleCA1OWE0MDE4Li5iYmQ1MDJiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgpAQCAtMTcsMTk1ICsxNywyMDIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0U3RydWN0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdTdHJ1Y3QnIGRvCiAKLSAgZGVzY3JpYmUgU3RydWN0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6U3RydWN0IGRvCiAgICAgaXQgInNob3VsZCBpdGVyYXRlIG92ZXIgYWxsIGZpZWxkcyBwcm9wZXJseSIgZG8KICAgICAgIGZpZWxkcyA9IHt9Ci0gICAgICBGb28ubmV3LmVhY2hfZmllbGQgeyB8ZmlkLGZpZWxkX2luZm98IGZpZWxkc1tmaWRdID0gZmllbGRfaW5mbyB9Ci0gICAgICBmaWVsZHMuc2hvdWxkID09IEZvbzo6RklFTERTCisgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmVhY2hfZmllbGQgeyB8ZmlkLGZpZWxkX2luZm98IGZpZWxkc1tmaWRdID0gZmllbGRfaW5mbyB9CisgICAgICBleHBlY3QoZmllbGRzKS50byBlcShTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEUykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHRzIiBkbwotICAgICAgc3RydWN0ID0gRm9vLm5ldwotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNTMKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gIndvcmRzIgotICAgICAgc3RydWN0LmhlbGxvLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIHN0cnVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHRzIGFuZCBhY2NlcHQgYSBibG9jayBhcmd1bWVudCIgZG8KKyAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcgZG8gfGZ8CisgICAgICAgIHZhbGlkYXRlX2RlZmF1bHRfYXJndW1lbnRzKGYpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhvYmplY3QpCisgICAgICBleHBlY3Qob2JqZWN0LnNpbXBsZSkudG8gZXEoNTMpCisgICAgICBleHBlY3Qob2JqZWN0LndvcmRzKS50byBlcSgid29yZHMiKQorICAgICAgZXhwZWN0KG9iamVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KG9iamVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qob2JqZWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KG9iamVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHNoYXJlIGRlZmF1bHQgdmFsdWVzIGJldHdlZW4gaW5zdGFuY2VzIiBkbwogICAgICAgYmVnaW4KLSAgICAgICAgc3RydWN0ID0gRm9vLm5ldworICAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICAgIHN0cnVjdC5pbnRzIDw8IDE3Ci0gICAgICAgIEZvby5uZXcuaW50cy5zaG91bGQgPT0gWzEsMiwyLDNdCisgICAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmludHMpLnRvIGVxKFsxLDIsMiwzXSkKICAgICAgIGVuc3VyZQogICAgICAgICAjIGVuc3VyZSBubyBsZWFrYWdlIHRvIG90aGVyIHRlc3RzCi0gICAgICAgIEZvbzo6RklFTERTWzRdWzpkZWZhdWx0XSA9IFsxLDIsMiwzXQorICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEU1s0XVs6ZGVmYXVsdF0gPSBbMSwyLDIsM10KICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIGJvb2xlYW4gdmFsdWVzIiBkbwotICAgICAgc3RydWN0ID0gQm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQotICAgICAgc3RydWN0Lnllc25vLnNob3VsZCBiZV9mYWxzZQorICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQorICAgICAgZXhwZWN0KHN0cnVjdC55ZXNubykudG8gYmVfZmFsc2V5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgcHJvcGVyID09IHNlbWFudGljcyIgZG8KLSAgICAgIEZvby5uZXcuc2hvdWxkX25vdCA9PSBIZWxsby5uZXcKLSAgICAgIEZvby5uZXcuc2hvdWxkID09IEZvby5uZXcKLSAgICAgIEZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2hvdWxkX25vdCA9PSBGb28ubmV3CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS50byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1MikpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWVzIGluIGluc3BlY3QiIGRvCi0gICAgICBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iKQogCi0gICAgICBTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U29tZUVudW06Ok9ORSA9PiBbU29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBGb28ubmV3Lm9wdF9zdHJpbmc/LnNob3VsZCBiZV9mYWxzZQotICAgICAgRm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/LnNob3VsZCBiZV90cnVlCi0gICAgICBGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgRm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcub3B0X3N0cmluZz8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwotICAgICAgczEgPSBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkKLSAgICAgIHMyID0gU3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpUV08pCisgICAgICBzMSA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKQorICAgICAgczIgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXTykKIAotICAgICAgKHMxIDw9PiBzMikuc2hvdWxkID09IC0xCi0gICAgICAoczIgPD0+IHMxKS5zaG91bGQgPT0gMQotICAgICAgKHMxIDw9PiBzMSkuc2hvdWxkID09IDAKLSAgICAgIChzMSA8PT4gU3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS5zaG91bGQgPT0gLTEKKyAgICAgIGV4cGVjdChzMSA8PT4gczIpLnRvIGVxKC0xKQorICAgICAgZXhwZWN0KHMyIDw9PiBzMSkudG8gZXEoMSkKKyAgICAgIGV4cGVjdChzMSA8PT4gczEpLnRvIGVxKDApCisgICAgICBleHBlY3QoczEgPD0+IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkudG8gZXEoLTEpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaXRzZWxmIG9mZiB0aGUgd2lyZSIgZG8KLSAgICAgIHN0cnVjdCA9IEZvby5uZXcKLSAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAotICAgICAgICBbJ2NvbXBsZXgnLCBUeXBlczo6TUFQLCA1XSwgIyBGb28KLSAgICAgICAgWyd3b3JkcycsIFR5cGVzOjpTVFJJTkcsIDJdLCAjIEZvbwotICAgICAgICBbJ2hlbGxvJywgVHlwZXM6OlNUUlVDVCwgM10sICMgRm9vCi0gICAgICAgICAgWydncmVldGluZycsIFR5cGVzOjpTVFJJTkcsIDFdLCAjIEhlbGxvCi0gICAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdLCAjIEhlbGxvCi0gICAgICAgIFsnc2ltcGxlJywgVHlwZXM6OkkzMiwgMV0sICMgRm9vCi0gICAgICAgIFsnaW50cycsIFR5cGVzOjpMSVNULCA0XSwgIyBGb28KLSAgICAgICAgWydzaG9ydHMnLCBUeXBlczo6U0VULCA2XSwgIyBGb28KLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdICMgSGVsbG8KKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1XSwgIyBGb28KKyAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sICMgRm9vCisgICAgICAgIFsnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDNdLCAjIEZvbworICAgICAgICAgIFsnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLCAjIEhlbGxvCisgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0sICMgSGVsbG8KKyAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLCAjIEZvbworICAgICAgICBbJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0XSwgIyBGb28KKyAgICAgICAgWydzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDZdLCAjIEZvbworICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSAjIEhlbGxvCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCi0gICAgICAgIFtUeXBlczo6STMyLCBUeXBlczo6TUFQLCAyXSwgIyBjb21wbGV4Ci0gICAgICAgICAgW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpET1VCTEUsIDJdLCAjIGNvbXBsZXgvMS92YWx1ZQotICAgICAgICAgIFtUeXBlczo6U1RSSU5HLCBUeXBlczo6RE9VQkxFLCAxXSAjIGNvbXBsZXgvMi92YWx1ZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMl0sICMgY29tcGxleAorICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMl0sICMgY29tcGxleC8xL3ZhbHVlCisgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxXSAjIGNvbXBsZXgvMi92YWx1ZQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLmFuZF9yZXR1cm4oW1R5cGVzOjpJMzIsIDRdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUeXBlczo6STE2LCAyXSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKICAgICAgICAgMSwgMTQsICAgICAgICAjIGNvbXBsZXgga2V5cwogICAgICAgICA0MiwgICAgICAgICAgICMgc2ltcGxlCiAgICAgICAgIDQsIDIzLCA0LCAyOSAgIyBpbnRzCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCi0gICAgICBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6c2tpcCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKKyAgICAgIGV4cGVjdChwcm90KS5ub3RfdG8gcmVjZWl2ZSg6c2tpcCkKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgPT0gezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19Ci0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKQotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiYXBwbGUgYmFuYW5hIgotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFs0LCAyMywgNCwgMjldCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFszLCAyXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gZXEoezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19KQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpKQorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImFwcGxlIGJhbmFuYSIpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFs0LCAyMywgNCwgMjldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzMsIDJdKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGZhbHNlIGJvb2xlYW4gZmllbGRzIGNvcnJlY3RseSIgZG8KLSAgICAgIGIgPSBCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCi0gICAgICBwcm90ID0gQmluYXJ5UHJvdG9jb2wubmV3KE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQorICAgICAgYiA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKICAgICAgIGIud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCB1bmV4cGVjdGVkIGZpZWxkcyBpbiBzdHJ1Y3RzIGFuZCB1c2UgZGVmYXVsdCB2YWx1ZXMiIGRvCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKLSAgICAgICAgWydzaW1wbGUnLCBUeXBlczo6STMyLCAxXSwKLSAgICAgICAgWydjb21wbGV4JywgVHlwZXM6OlNUUlVDVCwgNV0sCi0gICAgICAgIFsndGhpbnonLCBUeXBlczo6TUFQLCA3XSwKLSAgICAgICAgWydmb29iYXInLCBUeXBlczo6STMyLCAzXSwKLSAgICAgICAgWyd3b3JkcycsIFR5cGVzOjpTVFJJTkcsIDJdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLAorICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDVdLAorICAgICAgICBbJ3RoaW56JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA3XSwKKyAgICAgICAgWydmb29iYXInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDNdLAorICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSVUNUKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6TUFQKQotICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybihbVHlwZXM6OkkzMiwgVHlwZXM6OkkzMiwgMF0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiZm9vYmFyIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6STMyLCAwXSkKICAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6STMyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImZvb2JhciIKLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzEsIDIsIDIsIDNdCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFs1LCAxNywgMjM5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiZm9vYmFyIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaXRzZWxmIHRvIHRoZSB3aXJlIiBkbwotICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFR5cGVzOjpMSVNULCA0KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvbXBsZXgnLCBUeXBlczo6TUFQLCA1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUeXBlczo6U0VULCA2KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFR5cGVzOjpJMzIsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaGVsbG8nLCBUeXBlczo6U1RSVUNULCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVHlwZXM6OlNUUklORywgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVHlwZXM6OkkzMiwgVHlwZXM6Ok1BUCwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUeXBlczo6U1RSSU5HLCBUeXBlczo6RE9VQkxFLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfYmVnaW4pLndpdGgoVHlwZXM6OkkzMiwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFR5cGVzOjpJMTYsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQogCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3CisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICBzdHJ1Y3Qud29yZHMgPSBuaWwKICAgICAgIHN0cnVjdC5jb21wbGV4ID0gezUgPT4geyJmb28iID0+IDEuMjN9fQogICAgICAgc3RydWN0LndyaXRlKHByb3QpCkBAIC0yMTMsNTEgKzIyMCw1MSBAQAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgcHJlc2VudGVkIHdpdGggYW4gdW5rbm93biBjb250YWluZXIiIGRvCiAgICAgICAjIHllYWggdGhpcyBpcyBzaWxseSwgYnV0IEknbSBnb2luZyBmb3IgY29kZSBjb3ZlcmFnZSBoZXJlCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBsYW1iZGEgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBleHBlY3QgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KLSAgICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gZmllbGQgYWNjZXNzb3JzIiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgotICAgICAgICBoZWxsbyA9IEhlbGxvLm5ldwotICAgICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBoZWxsby5ncmVldGluZyA9IDMgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdW5rbm93biB0eXBlcyBhcmUgZ2l2ZW4gdG8gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwotICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnNob3VsZCByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnRvIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgYHJhaXNlIFhjZXB0aW9uLCAnbWVzc2FnZSdgIGZvciBFeGNlcHRpb24gc3RydWN0cyIgZG8KICAgICAgIGJlZ2luCi0gICAgICAgIHJhaXNlIFhjZXB0aW9uLCAic29tZXRoaW5nIGhhcHBlbmVkIgorICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgInNvbWV0aGluZyBoYXBwZW5lZCIKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSgxKQogICAgICAgICAjIGVuc3VyZSBpdCBnZXRzIHNlcmlhbGl6ZWQgcHJvcGVybHksIHRoaXMgaXMgdGhlIHJlYWxseSBpbXBvcnRhbnQgcGFydAotICAgICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVHlwZXM6OkkzMiwgMikjLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKQEAgLTI2NSwxOSArMjcyLDE5IEBACiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHJlZ3VsYXIgaW5pdGlhbGl6ZXIgZm9yIGV4Y2VwdGlvbiBzdHJ1Y3RzIiBkbwogICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgWGNlcHRpb24sIDptZXNzYWdlID0+ICJzb21ldGhpbmcgaGFwcGVuZWQiLCA6Y29kZSA9PiA1CisgICAgICAgIHJhaXNlIFNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAic29tZXRoaW5nIGhhcHBlbmVkIiwgOmNvZGUgPT4gNQogICAgICAgcmVzY3VlIFRocmlmdDo6RXhjZXB0aW9uID0+IGUKLSAgICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAic29tZXRoaW5nIGhhcHBlbmVkIgotICAgICAgICBlLmNvZGUuc2hvdWxkID09IDUKLSAgICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVHlwZXM6OlNUUklORywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFR5cGVzOjpJMzIsIDIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSg1KQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MzkxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgpAQCAtMCwwICsxLDE0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSAncmFjay90ZXN0JworcmVxdWlyZSAndGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyJworCitkZXNjcmliZSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyIGRvCisKKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CisKKyAgZGVzY3JpYmUgIiNpbml0aWFsaXplIiBkbworCisgICAgY29udGV4dCAid2hlbiB1c2luZyB0aGUgZGVmYXVsdHMiIGRvCisKKyAgICAgIGl0ICJiaW5kcyB0byBwb3J0IDgwLCB3aXRoIGhvc3QgMC4wLjAuMCwgYSBwYXRoIG9mICcvJyIgZG8KKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCcwLjAuMC4wJywgODAsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisgICAgICBlbmQKKworICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCcgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbikudG8gcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKyAgICAgIGVuZAorCisgICAgICBpdCAidXNlcyB0aGUgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IiBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorICAgICAgZW5kCisKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndoZW4gdXNpbmcgdGhlIG9wdGlvbnMiIGRvCisKKyAgICAgIGl0ICdhY2NlcHRzIDppcCwgOnBvcnQsIDpwYXRoJyBkbworICAgICAgICBpcCA9ICIxOTIuMTY4LjAuMSIKKyAgICAgICAgcG9ydCA9IDMwMDAKKyAgICAgICAgcGF0aCA9ICIvdGhpbiIKKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGlwLCBwb3J0LCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlwID0+IGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOnBvcnQgPT4gcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwYXRoID0+IHBhdGgpCisgICAgICBlbmQKKworICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sIGZhY3RvcnknIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb3RvY29sX2ZhY3RvcnkgPT4gVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldykKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCisKKyAgZGVzY3JpYmUgIiNzZXJ2ZSIgZG8KKworICAgIGl0ICdzdGFydHMgdGhlIFRoaW4gc2VydmVyJyBkbworICAgICAgdW5kZXJseWluZ190aGluX3NlcnZlciA9IGRvdWJsZSgndGhpbiBzZXJ2ZXInLCA6c3RhcnQgPT4gdHJ1ZSkKKyAgICAgIGFsbG93KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpCisKKyAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlciA9IFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKworICAgICAgZXhwZWN0KHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpLnRvIHJlY2VpdmUoOnN0YXJ0KQorICAgICAgdGhpbl90aHJpZnRfc2VydmVyLnNlcnZlCisgICAgZW5kCisgIGVuZAorCitlbmQKKworZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uIGRvCisgIGluY2x1ZGUgUmFjazo6VGVzdDo6TWV0aG9kcworCisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorICBsZXQoOnByb3RvY29sX2ZhY3RvcnkpIHsgZG91YmxlKCdwcm90b2NvbCBmYWN0b3J5JykgfQorCisgIGRlZiBhcHAKKyAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uZm9yKCIvIiwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICBlbmQKKworICBjb250ZXh0ICI0MDQgcmVzcG9uc2UiIGRvCisKKyAgICBpdCAncmVjZWl2ZXMgYSBub24tUE9TVCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGdldCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CisgICAgZW5kCisKKyAgICBpdCAncmVjZWl2ZXMgYSBoZWFkZXIgb3RoZXIgdGhhbiBhcHBsaWNhdGlvbi94LXRocmlmdCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgcG9zdCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CisgICAgZW5kCisKKyAgZW5kCisKKyAgY29udGV4dCAiMjAwIHJlc3BvbnNlIiBkbworCisgICAgYmVmb3JlIGRvCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpCisgICAgICBhbGxvdyhwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpCisgICAgZW5kCisKKyAgICBpdCAnY3JlYXRlcyBhbiBJT1N0cmVhbVRyYW5zcG9ydCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgoYW5faW5zdGFuY2Vfb2YoUmFjazo6TGludDo6SW5wdXRXcmFwcGVyKSwgYW5faW5zdGFuY2Vfb2YoUmFjazo6UmVzcG9uc2UpKQorICAgICAgcG9zdCAiLyIKKyAgICBlbmQKKworICAgIGl0ICdmZXRjaGVzIHRoZSByaWdodCBwcm90b2NvbCBiYXNlZCBvbiB0aGUgVHJhbnNwb3J0JyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgZXhwZWN0KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkud2l0aChhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KSkKKyAgICAgIHBvc3QgIi8iCisgICAgZW5kCisKKyAgICBpdCAnc3RhdHVzIGNvZGUgMjAwJyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgcG9zdCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLm9rPykudG8gYmVfdHJ1dGh5CisgICAgZW5kCisKKyAgZW5kCisKK2VuZAorCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgppbmRleCA3OTk5ZTkyLi5kNTk1YWI1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKQEAgLTE3LDEwICsxNyw5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdFR5cGVzU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgVGhyaWZ0OjpUeXBlcyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKQEAgLTMwLDg3ICsyOSw5MCBAQAogICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgZW5kCiAKLSAgZGVzY3JpYmUgIlR5cGUgY2hlY2tpbmciIGRvCisgIGNvbnRleHQgJ3R5cGUgY2hlY2tpbmcnIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHByb3BlciBuYW1lIGZvciBlYWNoIHR5cGUiIGRvCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFR5cGVzOjpJMTYpLnNob3VsZCA9PSAiVHlwZXM6OkkxNiIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVHlwZXM6OlZPSUQpLnNob3VsZCA9PSAiVHlwZXM6OlZPSUQiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFR5cGVzOjpMSVNUKS5zaG91bGQgPT0gIlR5cGVzOjpMSVNUIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZSg0Mikuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoIlR5cGVzOjpJMTYiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkpLnRvIGVxKCJUeXBlczo6Vk9JRCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoIlR5cGVzOjpMSVNUIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKDQyKSkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIHR5cGVzIHByb3Blcmx5IiBkbwotICAgICAgIyBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIFR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUodHJ1ZSwgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkJPT0x9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkJZVEV9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6STMyfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6Okk2NH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoIjMiLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgICMgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgiZm9vIiwgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgezp0eXBlID0+IFR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVHlwZXM6OkxJU1R9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCB7OnR5cGUgPT4gVHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwyXSwgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiB0cnVlfSwgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSJ9LCAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBlcnJvciBvdXQgaWYgbmlsIGlzIHBhc3NlZCBhbmQgc2tpcF90eXBlcyBpcyBmYWxzZSIgZG8KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayBlbGVtZW50IHR5cGVzIG9uIGNvbnRhaW5lcnMiIGRvCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLCBuaWwsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR319Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIG5pbCwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICAKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgbmlsID0+ICJuaWwifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCBnaXZlIHRoZSBUeXBlRXJyb3IgYSByZWFkYWJsZSBtZXNzYWdlIiBkbwotICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZm9vIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsIG1zZykKLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvby5lbGVtZW50IgotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgIGl0ICJzaG91bGQgZ2l2ZSB0aGUgVGhyaWZ0OjpUeXBlRXJyb3IgYSByZWFkYWJsZSBtZXNzYWdlIiBkbworICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby8KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLmVsZW1lbnQvCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6STMyLCByZWNlaXZlZCBOaWxDbGFzcyBmb3IgZmllbGQgZm9vLmVsZW1lbnQua2V5IgotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OkxJU1QsCi0gICAgICAgICAgICAgICA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVHlwZXM6Ok1BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6a2V5ID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwKKyAgICAgICAgICAgICAgIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC52YWx1ZSIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKaW5kZXggNzAyZTkyMC4uMGNlNjMwNiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCkBAIC0xNywxNTYgKzE3LDE3OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRVbmlvblNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLSAgaW5jbHVkZSBTcGVjTmFtZXNwYWNlCitkZXNjcmliZSAnVW5pb24nIGRvCiAKLSAgZGVzY3JpYmUgVW5pb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpVbmlvbiBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB2YWx1ZSBpbiB1bnNldCB1bmlvbiIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSBuaWwKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gbmlsCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKG5pbCkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2V0IGEgZmllbGQgYW5kIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBnZXRfdmFsdWUgYW5kIHRoZSBuYW1lZCBmaWVsZCBhY2Nlc3NvciIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjUKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gMjUKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjUpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSgyNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd29yayBjb3JyZWN0bHkgd2hlbiBpbnN0YW50aWF0ZWQgd2l0aCBzdGF0aWMgZmllbGQgY29uc3RydWN0b3JzIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5pbnRlZ2VyMzIoNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gNQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5pbnRlZ2VyMzIoNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmludGVnZXIzMikudG8gZXEoNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgZm9yIHdyb25nIHNldCBmaWVsZCIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCi0gICAgIAorCisgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIHdoZW4gaGFzaCBpbml0aWFsaXplZCBhbmQgdHlwZSBjaGVja2luZyBpcyBvZmYiIGRvCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyh7aW5jb3JyZWN0X2ZpZWxkOiA6aW5jb3JyZWN0fSkKKyAgICAgIGV4YW1wbGUgPSBsYW1iZGEgeyBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3LnNlcmlhbGl6ZSh1bmlvbikgfQorICAgICAgZXhwZWN0KGV4YW1wbGUpLnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5pbCIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG5pbAorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG5pbCkKICAgICBlbmQKLSAgICAgCisKKyAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB3aXRoIGFuIGVtcHR5IFN0cmluZyIgZG8KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcSgnJykKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucywgaTMyIHZzLiBzdHJpbmciIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgcmVzZXQgc2V0ZmllbGQgYW5kIHNldHZhbHVlIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQogICAgICAgdW5pb24uc29tZV9jaGFyYWN0ZXJzID0gImJsYWghIgotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOnNvbWVfY2hhcmFjdGVycwotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAiYmxhaCEiCi0gICAgICBsYW1iZGEgeyB1bmlvbi5pbnRlZ2VyMzIgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDpzb21lX2NoYXJhY3RlcnMpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgiYmxhaCEiKQorICAgICAgZXhwZWN0IHsgdW5pb24uaW50ZWdlcjMyIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IHZhbHVlcyIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgNDAwKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCA0MDApCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCBmaWVsZHMiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDpvdGhlcl9pMzIsIDI1KQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6b3RoZXJfaTMyLCAyNSkKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbnNwZWN0IHByb3Blcmx5IiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBleHBlY3QodW5pb24uaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHdpdGggaW5zdGFuY2VfdmFyaWFibGVfc2V0IiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjcpCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNykKICAgICAgIHVuaW9uLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHNvbWVfY2hhcmFjdGVycywgImhhbGxvISIpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNykKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGNvcnJlY3RseSIgZG8KKyAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBiaW5hcnkgY29ycmVjdGx5IiBkbwogICAgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICAgIHByb3RvID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICB1bmlvbi53cml0ZShwcm90bykKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBqc29uIGNvcnJlY3RseSIgZG8KKyAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBwcm90byA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFucykKKworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICB1bmlvbi53cml0ZShwcm90bykKKworICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2Ugd2hlbiB2YWxpZGF0aW5nIHVuc2V0IHVuaW9uIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAxKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgdmFsaWRhdGUgYW4gZW51bSBmaWVsZCBwcm9wZXJseSIgZG8KLSAgICAgIHVuaW9uID0gVGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMykKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDplbnVtX2ZpZWxkCi0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAzKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDplbnVtX2ZpZWxkKQorICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCiAKLSAgICAgIG90aGVyX3VuaW9uID0gVGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAxKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgc2VyaWFsaXplIGFuZCBtYXRjaCBzdHJ1Y3RzIHdpdGggYSB1bmlvbiIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI2KQotICAgICAgc3d1ID0gU3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gdW5pb24pCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNikKKyAgICAgIHN3dSA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IHVuaW9uKQogCiAgICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKICAgICAgIHN3dS53cml0ZShwcm90bykKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImhlbGxvIHRoZXJlIikKLSAgICAgIHN3dTIgPSBTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiBvdGhlcl91bmlvbikKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJoZWxsbyB0aGVyZSIpCisgICAgICBzd3UyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gb3RoZXJfdW5pb24pCiAKLSAgICAgIHN3dTIuc2hvdWxkX25vdCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS5ub3RfdG8gZXEoc3d1KQogCiAgICAgICBzd3UyLnJlYWQocHJvdG8pCi0gICAgICBzd3UyLnNob3VsZCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS50byBlcShzd3UpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb2xkIHN0eWxlIGNvbnN0cnVjdG9yIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiA9PiAyNikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjYKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIgPT4gMjYpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI2KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBpbnNwZWN0ZWQgYW5kIHVuc2V0IiBkbwotICAgICAgbGFtYmRhe1Rlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5zaG91bGRfbm90IHJhaXNlX2Vycm9yCisgICAgICBleHBlY3R7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWUgd2hlbiBpbnNwZWN0ZWQiIGRvCi0gICAgICBNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IikKIAotICAgICAgTXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NvbWVFbnVtOjpPTkUgPT4gW1NvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIgCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgTXlfdW5pb24ubmV3LnNvbWVfZW51bT8uc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKS5zb21lX2VudW0/LnNob3VsZCBiZV90cnVlCi0gICAgICBNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCi0gICAgICBNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcuc29tZV9lbnVtPykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuc29tZV9lbnVtPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGNvbXBhcmFibGUiIGRvCkBAIC0xNzcsMTUgKzE5OSwxNSBAQAogICAgICAgICBbMSwgICAxLCAgMSwgIDBdXQogCiAgICAgICBvYmpzID0gWwotICAgICAgICBUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoIiksIAotICAgICAgICBUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoYmxhaCIpLAotICAgICAgICBUZXN0VW5pb24ubmV3KDppMzJfZmllbGQsIDEpLAotICAgICAgICBUZXN0VW5pb24ubmV3KCldCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOnN0cmluZ19maWVsZCwgImJsYWgiKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6c3RyaW5nX2ZpZWxkLCAiYmxhaGJsYWgiKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6aTMyX2ZpZWxkLCAxKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpXQogCiAgICAgICBmb3IgeSBpbiAwLi4zCiAgICAgICAgIGZvciB4IGluIDAuLjMKICAgICAgICAgICAjIHB1dHMgIiN7b2Jqc1t5XS5pbnNwZWN0fSA8PT4gI3tvYmpzW3hdLmluc3BlY3R9IHNob3VsZCA9PSAje3JlbGF0aW9uc2hpcHNbeV1beF19IgotICAgICAgICAgIChvYmpzW3ldIDw9PiBvYmpzW3hdKS5zaG91bGQgPT0gcmVsYXRpb25zaGlwc1t5XVt4XQorICAgICAgICAgIGV4cGVjdChvYmpzW3ldIDw9PiBvYmpzW3hdKS50byBlcShyZWxhdGlvbnNoaXBzW3ldW3hdKQogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKaW5kZXggZGYyMzlkNy4uODYyM2U5NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCkBAIC0xNyw5MiArMTcsMTAwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJwotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi9zb2NrZXRfc3BlY19zaGFyZWQiCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQogCi1jbGFzcyBUaHJpZnRVTklYU29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1VOSVhTb2NrZXQnIGRvCiAKLSAgZGVzY3JpYmUgVU5JWFNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlVOSVhTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAcGF0aCA9ICcvdG1wL3RocmlmdF9zcGVjX3NvY2tldCcKLSAgICAgIEBzb2NrZXQgPSBVTklYU29ja2V0Lm5ldyhAcGF0aCkKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc29ja2V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KQotICAgICAgVU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBVTklYU2VydmVyU29ja2V0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6VU5JWFNlcnZlclNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBwYXRoID0gJy90bXAvdGhyaWZ0X3NwZWNfc29ja2V0JwotICAgICAgQHNvY2tldCA9IFVOSVhTZXJ2ZXJTb2NrZXQubmV3KEBwYXRoKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNlcnZlclNvY2tldC5uZXcoQHBhdGgpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6VU5JWFNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIikKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiVU5JWFNvY2tldCIpCi0gICAgICBVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkID09IHRyYW5zCisgICAgICBzb2NrID0gZG91YmxlKCJzb2NrIikKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlVOSVhTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZWxldGUgdGhlIHNvY2tldCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBGaWxlLnNob3VsZF9yZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3RocmlmdC5nZW1zcGVjIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzE5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKQEAgLTAsMCArMSw0MCBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorJDoucHVzaCBGaWxlLmV4cGFuZF9wYXRoKCIuLi9saWIiLCBfX0ZJTEVfXykKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICA9ICd0aHJpZnQnCisgIHMudmVyc2lvbiAgICAgPSAnMS4wLjAnCisgIHMuYXV0aG9ycyAgICAgPSBbJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyddCisgIHMuZW1haWwgICAgICAgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddCisgIHMuaG9tZXBhZ2UgICAgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJworICBzLnN1bW1hcnkgICAgID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgQXBhY2hlIFRocmlmdH0KKyAgcy5kZXNjcmlwdGlvbiA9ICVxe1J1YnkgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW19CisgIHMubGljZW5zZSAgICAgPSAnQXBhY2hlLTIuMCcKKyAgcy5leHRlbnNpb25zICA9IFsnZXh0L2V4dGNvbmYucmInXQorCisgIHMuaGFzX3Jkb2MgICAgICA9IHRydWUKKyAgcy5yZG9jX29wdGlvbnMgID0gJXdbLS1saW5lLW51bWJlcnMgLS1pbmxpbmUtc291cmNlIC0tdGl0bGUgVGhyaWZ0IC0tbWFpbiBSRUFETUVdCisKKyAgcy5ydWJ5Zm9yZ2VfcHJvamVjdCA9ICd0aHJpZnQnCisKKyAgZGlyID0gRmlsZS5leHBhbmRfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorCisgIHMuZmlsZXMgPSBEaXIuZ2xvYigie2xpYixzcGVjfS8qKi8qIikKKyAgcy50ZXN0X2ZpbGVzID0gRGlyLmdsb2IoInt0ZXN0LHNwZWMsYmVuY2htYXJrfS8qKi8qIikKKyAgcy5leGVjdXRhYmxlcyA9ICBEaXIuZ2xvYigie2Jpbn0vKiovKiIpCisKKyAgcy5leHRyYV9yZG9jX2ZpbGVzICA9ICV3W1JFQURNRS5tZF0gKyBEaXIuZ2xvYigie2V4dCxsaWJ9LyoqLyoue2MsaCxyYn0iKQorCisgIHMucmVxdWlyZV9wYXRocyA9ICV3W2xpYiBleHRdCisKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnYnVuZGxlcicsICAgICAgICAgICAgJ34+IDEuMTEnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeScsICAgICAgICAgICAgICAgICd+PiAwLjExLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1ieWVidWcnLCAgICAgICAgICd+PiAzLjYnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1zdGFja19leHBsb3JlcicsICd+PiAwLjQuOS4yJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrJywgICAgICAgICAgICAgICAnfj4gMi4wJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrLXRlc3QnLCAgICAgICAgICAnfj4gMC44LjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnLCAgICAgICAgICAgICAgICd+PiAxMi4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICAgICAgICAgICAgICAnfj4gMy43JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICd0aGluJywgICAgICAgICAgICAgICAnfj4gMS43JworZW5kCisKZGlmZiAtLWdpdCBhL2xpYi9ycy9DYXJnby50b21sIGIvbGliL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzMjE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQiCitkZXNjcmlwdGlvbiA9ICJSdXN0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIgordmVyc2lvbiA9ICIxLjAuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitob21lcGFnZSA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCitkb2N1bWVudGF0aW9uID0gImh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmciCityZWFkbWUgPSAiUkVBRE1FLm1kIgorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInRlc3QvKioiLCAiKi5pbWwiXQora2V5d29yZHMgPSBbInRocmlmdCJdCisKK1tkZXBlbmRlbmNpZXNdCitieXRlb3JkZXIgPSAifjEuMi4xIgoraW50ZWdlci1lbmNvZGluZyA9ICJ+MS4wLjQiCitsb2cgPSAifjAuMy44IgordGhyZWFkcG9vbCA9ICJ+MS43LjEiCit0cnlfZnJvbSA9ICJ+MC4yLjIiCisKZGlmZiAtLWdpdCBhL2xpYi9ycy9NYWtlZmlsZS5hbSBiL2xpYi9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTM0MTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK2luc3RhbGw6CisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnVGhlIFJ1c3QgY2xpZW50IGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCB2aWEgYSBDYXJnby50b21sIGRlcGVuZGVuY3kgLSBwbGVhc2Ugc2VlIC9saWIvcnMvUkVBRE1FLm1kJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKK2NoZWNrLWxvY2FsOgorCSQoQ0FSR08pIHRlc3QKKworYWxsLWxvY2FsOgorCSQoQ0FSR08pIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCUNhcmdvLnRvbWwgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JzL1JFQURNRS5tZCBiL2xpYi9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzN2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUFETUUubWQKQEAgLTAsMCArMSwxMTEgQEAKKyMgUnVzdCBUaHJpZnQgbGlicmFyeQorCisjIyBPdmVydmlldworCitUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nIFRocmlmdCBzZXJ2ZXIKK2FuZCBjbGllbnQuIEl0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisKKyAxLiBlcnJvcnMKKyAyLiBwcm90b2NvbAorIDMuIHRyYW5zcG9ydAorIDQuIHNlcnZlcgorIDUuIGF1dG9nZW4KKworVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24uIFRoZSBgZ2VuZXJhdGVkYCBsYXllciBpcyBjb2RlIGdlbmVyYXRlZCBieSB0aGUKK1RocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luLiBJdCB1c2VzIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0bworc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSB0eXBlcyBhbmQgaW1wbGVtZW50IFJQQy4gVXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGVzZQordHlwZXMgYW5kIHNlcnZpY2VzIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgb24gdG9wLgorCisgYGBgdGV4dAorICstLS0tLS0tLS0tLSsKKyB8ICBhcHAgZGV2ICB8CisgKy0tLS0tLS0tLS0tKworIHwgZ2VuZXJhdGVkIHwgPC0+IGVycm9ycy9yZXN1bHRzCisgKy0tLS0tLS0tLS0tKworIHwgIHByb3RvY29sIHwKKyArLS0tLS0tLS0tLS0rCisgfCB0cmFuc3BvcnQgfAorICstLS0tLS0tLS0tLSsKKyBgYGAKKworIyMgVXNpbmcgdGhpcyBjcmF0ZQorCitBZGQgYHRocmlmdCA9ICJ4LnkueiJgIHRvIHlvdXIgYENhcmdvLnRvbWxgLCB3aGVyZSBgeC55LnpgIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZQorVGhyaWZ0IGNvbXBpbGVyIHlvdSdyZSB1c2luZy4KKworIyMgQVBJIERvY3VtZW50YXRpb24KKworRnVsbCBbUnVzdGRvY10oaHR0cHM6Ly9kb2NzLnJzL3RocmlmdC8pCisKKyMjIENvbXBhdGliaWxpdHkKKworVGhlIFJ1c3QgbGlicmFyeSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSB0YXJnZXRzIFJ1c3QgdmVyc2lvbnMgMS4yOCsuCitJdCBkb2VzIG5vdCBjdXJyZW50bHkgdXNlIGFueSBSdXN0IDIwMTggZmVhdHVyZXMuCisKKyMjIyBCcmVha2luZyBDaGFuZ2VzCisKK0JyZWFraW5nIGNoYW5nZXMgYXJlIG1pbmltaXplZC4gV2hlbiB0aGV5IGFyZSBtYWRlIHRoZXkgd2lsbCBiZSBvdXRsaW5lZCBiZWxvdyB3aXRoIHRyYW5zaXRpb24gZ3VpZGVsaW5lcy4KKworIyMjIyMgVGhyaWZ0IDAuMTIuMAorCisqICoqW1RIUklGVC00NTI5XSoqIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKworICAgIFByZXZpb3VzbHksIGVudW0gdmFyaWFudHMgd2VyZSB1cHBlcmNhc2VkIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBjb2RlLgorICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRocmlmdCBlbnVtOgorCisgICAgYGBgdGhyaWZ0CisgICAgLy8gVEhSSUZUCisgICAgZW51bSBPcGVyYXRpb24geworICAgICAgQURELAorICAgICAgU1VCVFJBQ1QsCisgICAgICBNVUxUSVBMWSwKKyAgICAgIERJVklERSwKKyAgICB9CisgICAgYGBgCisgICAgCisgICAgdXNlZCB0byBnZW5lcmF0ZToKKyAgICAKKyAgICBgYGBydXN0CisgICAgLy8gT0xEIEFVVE8tR0VORVJBVEVEIFJVU1QKKyAgICBwdWIgZW51bSBPcGVyYXRpb24geworICAgICAgIEFERCwKKyAgICAgICBTVUJUUkFDVCwKKyAgICAgICBNVUxUSVBMWSwKKyAgICAgICBESVZJREUsCisgICAgIH0KKyAgICBgYGAKKyAgICBJdCAqbm93KiBnZW5lcmF0ZXM6CisgICAgYGBgcnVzdAorICAgIC8vIE5FVyBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBZGQsCisgICAgICAgU3VidHJhY3QsCisgICAgICAgTXVsdGlwbHksCisgICAgICAgRGl2aWRlLAorICAgICB9CisgICAgYGBgCisgICAgCisgICAgWW91IHdpbGwgaGF2ZSB0byBjaGFuZ2UgYWxsIGVudW0gdmFyaWFudHMgaW4geW91ciBjb2RlIHRvIHVzZSBjYW1lbC1jYXNlZCBuYW1lcy4KKyAgICBUaGlzIHNob3VsZCBiZSBhIHNlYXJjaCBhbmQgcmVwbGFjZS4KKworIyMgQ29udHJpYnV0aW5nCisKK0J1ZyByZXBvcnRzIGFuZCBQUnMgYXJlIGFsd2F5cyB3ZWxjb21lISBQbGVhc2Ugc2VlIHRoZQorW1RocmlmdCB3ZWJzaXRlXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnLykgZm9yIG1vcmUgZGV0YWlscy4KKworVGhyaWZ0IFJ1c3Qgc3VwcG9ydCByZXF1aXJlcyBjb2RlIGluIHNldmVyYWwgZGlyZWN0b3JpZXM6CisKKyogYGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjYDogYmluZGluZyBjb2RlIGdlbmVyYXRvcgorKiBgbGliL3JzYDogcnVudGltZSBsaWJyYXJ5CisqIGBsaWIvcnMvdGVzdGA6IHN1cHBsZW1lbnRhbCB0ZXN0cworKiBgdHV0b3JpYWwvcnNgOiB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlcgorKiBgdGVzdC9yc2A6IGNyb3NzLWxhbmd1YWdlIHRlc3QgY2xpZW50IGFuZCBzZXJ2ZXIKKworQWxsIGxpYnJhcnkgY29kZSwgdGVzdCBjb2RlIGFuZCBhdXRvLWdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzIGFuZCBwYXNzZXMgY2xpcHB5Cit3aXRob3V0IHdhcm5pbmdzLiBBbGwgbmV3IGNvZGUgbXVzdCBkbyB0aGUgc2FtZSEgV2hlbiBtYWtpbmcgY2hhbmdlcyBlbnN1cmUgdGhhdDoKKworKiBgcnVzdGNgIGRvZXMgZG9lcyBvdXRwdXQgYW55IHdhcm5pbmdzCisqIGBjbGlwcHlgIHdpdGggZGVmYXVsdCBzZXR0aW5ncyBkb2VzIG5vdCBvdXRwdXQgYW55IHdhcm5pbmdzIChpbmNsdWRlcyBhdXRvLWdlbmVyYXRlZCBjb2RlKQorKiBgY2FyZ28gdGVzdGAgaXMgc3VjY2Vzc2Z1bAorKiBgbWFrZSBwcmVjcm9zc2AgYW5kIGBtYWtlIGNoZWNrYCBhcmUgc3VjY2Vzc2Z1bAorKiBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX2NsaWVudGAgYW5kIGB0dXRvcmlhbC9iaW4vdHV0b3JpYWxfc2VydmVyYCBjb21tdW5pY2F0ZQpkaWZmIC0tZ2l0IGEvbGliL3JzL1JFTEVBU0lORy5tZCBiL2xpYi9ycy9SRUxFQVNJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUxFQVNJTkcubWQKQEAgLTAsMCArMSw1NyBAQAorIyBQdWJsaXNoaW5nIHRoZSB0aHJpZnQgY3JhdGUKKworUHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXMgc3RyYWlnaHRmb3J3YXJkLCBhbmQgaW52b2x2ZXMgdHdvIG1ham9yIHN0ZXBzOgorCisxLiBTZXR0aW5nIHVwIHlvdXIgW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhY2NvdW50IF8ob25lLXRpbWUpXworCisyLiBQYWNrYWdpbmcvcHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXRzZWxmCisKKyMjIFNldCB1cCB5b3VyIGNyYXRlcy5pbyBhY2NvdW50IChvbmUtdGltZSkKKworMS4gR28gdG8gW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhbmQgY2xpY2sgdGhlIGBMb2cgSW5gIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0LgorCisgICBMb2cgaW4gKiphcyB0aGUgR2l0aHViIHVzZXIgd2l0aCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdGhyaWZ0IHJlcG8hKioKKworMi4gQ2xpY2sgeW91ciB1c2VyIGljb24gYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQgYW5kIHNlbGVjdCBgQWNjb3VudCBTZXR0aW5nc2AuCisKKzMuIENsaWNrIGBOZXcgVG9rZW5gIG5leHQgdG8gYEFQSSBBY2Nlc3NgLgorCisgICBUaGlzIGdlbmVyYXRlcyBhIG5ldyBBUEkga2V5IHRoYXQgY2FyZ28gdXNlcyB0byBwdWJsaXNoIHBhY2thZ2VzIHRvIGNyYXRlcy5pby4KKyAgIFN0b3JlIHRoaXMgQVBJIGtleSBzb21ld2hlcmUgc2FmZS4gSWYgeW91IHdpbGwgb25seSB1c2UgdGhpcyBHaXRodWIgYWNjb3VudCB0bworICAgcHVibGlzaCBjcmF0ZXMgdG8gY3JhdGVzLmlvIHlvdSBjYW4gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gc2F2ZSB0aGUKKyAgIGdlbmVyYXRlZCBrZXkgdG8gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC4KKworIyMgUGFja2FnZSBhbmQgUHVibGlzaAorCitZb3UgY2FuIHVzZSB0aGUgYXV0b21hdGVkIHNjcmlwdCBvciBydW4gdGhlIHJlbGVhc2Ugc3RlcHMgbWFudWFsbHkuCisKKyoqSW1wb3J0YW50Kio6IGBjYXJnb2AgZXhwZWN0cyB0aGF0IHZlcnNpb24gbnVtYmVycyBmb2xsb3cgdGhlIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LgorVGhpcyBtZWFucyB0aGF0IGBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OYCBtdXN0IGhhdmUgYSBtYWpvciwgbWlub3IgYW5kIHBhdGNoIG51bWJlciwgaS5lLiwgbXVzdAorYmUgaW4gdGhlIGZvcm0gYCMuIyMuIyNgLgorCisjIyMjIEF1dG9tYXRlZAorCitSdW4gYC4vcmVsZWFzZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gLgorCitfUmVxdWlyZXMgeW91IHRvIGhhdmUgc3RvcmVkIHlvdXIgY3JlZGVudGlhbHMgaW4gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC5fCisKKyMjIyMgTWFudWFsCisKKzEuIEVkaXQgYENhcmdvLnRvbWxgIGFuZCB1cGRhdGUgdGhlIGB2ZXJzaW9uID0gMS4wYCBrZXkgdG8gYHZlcnNpb24gPSBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gCisKKzIuIGBnaXQgYWRkIENhcmdvLnRvbWxgCisKKzMuIGBnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dIiAtbSAiQ2xpZW50OiBycyJgCisKKzQuIGBjYXJnbyBsb2dpbmAKKworICAgIF8obm90IHJlcXVpcmVkIGlmIHlvdSBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2ApXworCis1LiBgY2FyZ28gY2xlYW5gCisKKzYuIGBjYXJnbyBwYWNrYWdlYAorCisgICBUaGlzIHN0ZXAgZmFpbHMgaWYgdGhlcmUgYXJlIGFueSB1bmNvbW1pdHRlZCBvciBpZ25vcmVkIGZpbGVzLiBEbyAqKm5vdCoqIHVzZSB0aGUgYC0tYWxsb3ctZGlydHlgCisgICBmbGFnISBJbnN0ZWFkLCBhZGQgdGhlIGhpZ2hsaWdodGVkIGZpbGVzIGFzIGVudHJpZXMgaW4gdGhlIGBDYXJnby50b21sYCBgZXhjbHVkZWAga2V5LgorCis3LiBgY2FyZ28gcHVibGlzaGAKZGlmZiAtLWdpdCBhL2xpYi9ycy9yZWxlYXNlLnNoIGIvbGliL3JzL3JlbGVhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzRlNWI0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9yZWxlYXNlLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtbyBlcnJleGl0CitzZXQgLW8gcGlwZWZhaWwKK3NldCAtbyBub3Vuc2V0CisKK2lmICEgW1sgJCMgLWVxIDEgJiYgJDEgPX4gXlswLTldKFwuWzAtOV1bMC05XSopezJ9JCBdXTsgdGhlbgorICAgICg+JjIgZWNobyAiVXNhZ2U6IC4vcHVibGlzaC1jcmF0ZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl0gIikKKyAgICAoPiYyIGVjaG8gIiAgICAgICBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OIGlzIGluIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LCBpLmUuICMuIyMuIyMiKQorICAgIGV4aXQgMQorZmkKKworVEhSSUZUX1JFTEVBU0VfVkVSU0lPTj0kezE6LX0KKworZWNobyAiVXBkYXRpbmcgQ2FyZ28udG9tbCB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059Igorc2VkIC1pLm9sZCAtZSAicy9edmVyc2lvbiA9IC4qJC92ZXJzaW9uID0gXCIke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059XCIvZyIgQ2FyZ28udG9tbAorcm0gQ2FyZ28udG9tbC5vbGQKKworZWNobyAiQ29tbWl0dGluZyB1cGRhdGVkIENhcmdvLnRvbWwiCitnaXQgYWRkIENhcmdvLnRvbWwKK2dpdCBjb21taXQgLW0gIlVwZGF0ZSB0aHJpZnQgY3JhdGUgdmVyc2lvbiB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IiAtbSAiQ2xpZW50OiBycyIKKworZWNobyAiUGFja2FnaW5nIGFuZCByZWxlYXNpbmcgcnVzdCB0aHJpZnQgY3JhdGUgd2l0aCB2ZXJzaW9uICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iCitjYXJnbyBjbGVhbgorY2FyZ28gcGFja2FnZQorY2FyZ28gcHVibGlzaApkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9hdXRvZ2VuLnJzIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDQwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2F1dG9nZW4ucnMKQEAgLTAsMCArMSw0NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVGhyaWZ0IGNvbXBpbGVyIGF1dG8tZ2VuZXJhdGVkIHN1cHBvcnQuCisvLyEKKy8vIQorLy8hIFR5cGVzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbgorLy8hIHRvIGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LiBVc2VycyBzaG91bGQgbmV2ZXIgaGF2ZSB0byB1c2UgY29kZQorLy8hIGluIHRoaXMgbW9kdWxlIGRpcmVjdGx5LgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKworLy8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBmdW5jdGlvbmFsaXR5IGFuIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCBzaG91bGQgcHJvdmlkZQorLy8vIHRvIGNvbW11bmljYXRlIHdpdGggYSBUaHJpZnQgc2VydmVyLgorcHViIHRyYWl0IFRUaHJpZnRDbGllbnQgeworICAgIC8vLyBSZXR1cm5zIHRoZSBpbnB1dCBwcm90b2NvbCB1c2VkIHRvIHJlYWQgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gZnJvbSB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgb3V0cHV0IHByb3RvY29sIHVzZWQgdG8gd3JpdGUgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sOworICAgIC8vLyBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgbWVzc2FnZSB3cml0dGVuIHRvIHRoZSBUaHJpZnQKKyAgICAvLy8gc2VydmVyLiBSZXR1cm5zIGAwYCBpZiBubyBtZXNzYWdlcyBoYXZlIGJlZW4gd3JpdHRlbi4gU2VxdWVuY2UKKyAgICAvLy8gbnVtYmVycyBzaG91bGQgKm5ldmVyKiBiZSBuZWdhdGl2ZSwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYGkzMmAKKyAgICAvLy8gc2ltcGx5IGJlY2F1c2UgdGhlIFRocmlmdCBwcm90b2NvbCBlbmNvZGVzIHNlcXVlbmNlIG51bWJlcnMgYXMgYGkzMmAgb24KKyAgICAvLy8gdGhlIHdpcmUuCisgICAgZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzI7IC8vIEZJWE1FOiBjb25zaWRlciByZXR1cm5pbmcgYSB1MzIKKyAgICAvLy8gSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyLCBpbmRpY2F0aW5nIHRoYXQgYSBtZXNzYWdlIHdpdGggdGhhdAorICAgIC8vLyBudW1iZXIgaGFzIGJlZW4gc2VudCB0byB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyOworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9lcnJvcnMucnMgYi9saWIvcnMvc3JjL2Vycm9ycy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEyNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKQEAgLTAsMCArMSw2NzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZXJyb3I6OkVycm9yIGFzIFN0ZEVycm9yOwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIERpc3BsYXksIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjp7ZXJyb3IsIGZtdCwgaW8sIHN0cmluZ307Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBwcm90b2NvbDo6e1RGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07CisKKy8vIEZJWE1FOiBzaG91bGQgYWxsIG15IGVycm9yIHN0cnVjdHMgaW1wbCBlcnJvcjo6RXJyb3IgYXMgd2VsbD8KKy8vIEZJWE1FOiBzaG91bGQgYWxsIGZpZWxkcyBpbiBUcmFuc3BvcnRFcnJvciwgUHJvdG9jb2xFcnJvciBhbmQgQXBwbGljYXRpb25FcnJvciBiZSBvcHRpb25hbD8KKworLy8vIEVycm9yIHR5cGUgcmV0dXJuZWQgYnkgYWxsIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMuCisvLy8KKy8vLyBgdGhyaWZ0OjpFcnJvcmAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgY3JhdGUgYXMgd2VsbCBhcyBpbiBhdXRvLWdlbmVyYXRlZAorLy8vIFJ1c3QgY29kZS4gSXQgY29uc2lzdHMgb2YgZm91ciB2YXJpYW50cyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gYWNyb3NzIFRocmlmdAorLy8vIGltcGxlbWVudGF0aW9uczoKKy8vLworLy8vIDEuIGBUcmFuc3BvcnRgOiBlcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscworLy8vIDIuIGBQcm90b2NvbGA6IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcKKy8vLyAzLiBgQXBwbGljYXRpb25gOiBlcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUKKy8vLyA0LiBgVXNlcmA6IElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzCisvLy8KKy8vLyBUaGUgYEFwcGxpY2F0aW9uYCB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBhbGwgaGFuZGxlciBlcnJvcnMKKy8vLyBhcmUgYXV0b21hdGljYWxseSB0dXJuZWQgaW50byBhcHBsaWNhdGlvbiBlcnJvcnMuCisvLy8KKy8vLyBBbGwgZXJyb3IgdmFyaWFudHMgZXhjZXB0IGBFcnJvcjo6VXNlcmAgdGFrZSBhbiBlcG9ueW1vdXMgc3RydWN0IHdpdGggdHdvCisvLy8gcmVxdWlyZWQgZmllbGRzOgorLy8vCisvLy8gMS4gYGtpbmRgOiB2YXJpYW50LXNwZWNpZmljIGVudW0gaWRlbnRpZnlpbmcgdGhlIGVycm9yIHN1Yi10eXBlCisvLy8gMi4gYG1lc3NhZ2VgOiBodW1hbi1yZWFkYWJsZSBlcnJvciBpbmZvIHN0cmluZworLy8vCisvLy8gYGtpbmRgIGlzIGRlZmluZWQgYnkgY29udmVudGlvbiB3aGlsZSBgbWVzc2FnZWAgaXMgZnJlZWZvcm0uIElmIG5vbmUgb2YgdGhlCisvLy8gZW51bWVyYXRlZCBraW5kcyBhcmUgc3VpdGFibGUgdXNlIGBVbmtub3duYC4KKy8vLworLy8vIFRvIHNpbXBsaWZ5IGVycm9yIGNyZWF0aW9uIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9ycyBhcmUgZGVmaW5lZCBmb3IgYWxsCisvLy8gdmFyaWFudHMsIGFuZCBjb252ZXJzaW9ucyBmcm9tIHRoZWlyIHN0cnVjdHMgKGB0aHJpZnQ6OlRyYW5zcG9ydEVycm9yYCwKKy8vLyBgdGhyaWZ0OjpQcm90b2NvbEVycm9yYCBhbmQgYHRocmlmdDo6QXBwbGljYXRpb25FcnJvcmAgaW50byBgdGhyaWZ0OjpFcnJvcmAuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVHJhbnNwb3J0RXJyb3JgLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7VHJhbnNwb3J0RXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisvLy8KKy8vLyAvLyBleHBsaWNpdAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIGNvbnZlcnNpb24KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbSgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3IgeworLy8vICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLyAvLyB1c2Ugc3RydWN0IGNvbnN0cnVjdG9yCisvLy8gbGV0IGVycjI6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OlRyYW5zcG9ydCgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3I6Om5ldygKKy8vLyAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICAgICkKKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8KKy8vLyAvLyB1c2UgZXJyb3IgdmFyaWFudCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIzOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6Om5ld190cmFuc3BvcnRfZXJyb3IoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhbiBlcnJvciBmcm9tIGEgc3RyaW5nLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworLy8vCisvLy8gLy8gd2UganVzdCB1c2UgYEZyb206OmZyb21gIHRvIGNvbnZlcnQgYSBgU3RyaW5nYCBpbnRvIGEgYHRocmlmdDo6RXJyb3JgCisvLy8gbGV0IGVycjA6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICk7CisvLy8KKy8vLyAvLyBlcnIwIGlzIGVxdWl2YWxlbnQgdG8uLi4KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oCisvLy8gICAgIEFwcGxpY2F0aW9uRXJyb3IgeworLy8vICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIFJldHVybiBhbiBJREwtZGVmaW5lZCBleGNlcHRpb24uCisvLy8KKy8vLyBgYGB0ZXh0CisvLy8gLy8gVGhyaWZ0IElETCBleGNlcHRpb24gZGVmaW5pdGlvbi4KKy8vLyBleGNlcHRpb24gWGNlcHRpb24geworLy8vICAgMTogaTMyIGVycm9yQ29kZSwKKy8vLyAgIDI6IHN0cmluZyBtZXNzYWdlCisvLy8gfQorLy8vIGBgYAorLy8vCisvLy8gYGBgCisvLy8gdXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKKy8vLyB1c2Ugc3RkOjplcnJvcjo6RXJyb3I7CisvLy8gdXNlIHN0ZDo6Zm10OworLy8vIHVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQorLy8vIHB1YiBzdHJ1Y3QgWGNlcHRpb24geworLy8vICAgcHViIGVycm9yX2NvZGU6IE9wdGlvbjxpMzI+LAorLy8vICAgcHViIG1lc3NhZ2U6IE9wdGlvbjxTdHJpbmc+LAorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIEVycm9yIGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisvLy8gICAgICJyZW1vdGUgc2VydmljZSB0aHJldyBYY2VwdGlvbiIKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBGcm9tPFhjZXB0aW9uPiBmb3IgdGhyaWZ0OjpFcnJvciB7CisvLy8gICBmbiBmcm9tKGU6IFhjZXB0aW9uKSAtPiBTZWxmIHsKKy8vLyAgICAgdGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBEaXNwbGF5IGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisvLy8gICAgIHNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbiB1c2VyIGNvZGUuLi4KKy8vLyBsZXQgZXJyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKFhjZXB0aW9uIHsgZXJyb3JfY29kZTogU29tZSgxKSwgbWVzc2FnZTogTm9uZSB9KQorLy8vICk7CisvLy8gYGBgCitwdWIgZW51bSBFcnJvciB7CisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBvcGVyYXRpbmcgb24gSS9PIGNoYW5uZWxzLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpjb25uZWN0aW9uIGNsb3NlZCogYW5kICpiaW5kIGZhaWx1cmUqLgorICAgIFRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciksCisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm1lc3NhZ2UgdG9vIGxhcmdlKiBhbmQgKnVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24qLgorICAgIFByb3RvY29sKFByb3RvY29sRXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUsIG9yIHdoZW4gaW5jb21pbmcKKyAgICAvLy8gb3Igb3V0Z29pbmcgbWVzc2FnZXMgdmlvbGF0ZSB0aGUgVGhyaWZ0IHNwZWMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm91dC1vZi1vcmRlciBtZXNzYWdlcyogYW5kICptaXNzaW5nIHJlcXVpcmVkIHN0cnVjdAorICAgIC8vLyBmaWVsZHMqLgorICAgIC8vLworICAgIC8vLyBUaGlzIHZhcmlhbnQgYWxzbyBmdW5jdGlvbnMgYXMgYSBjYXRjaC1hbGw6IGVycm9ycyBmcm9tIGhhbmRsZXIKKyAgICAvLy8gZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHJldHVybmVkIGFzIGFuIGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yKSwKKyAgICAvLy8gSURMLWRlZmluZWQgZXhjZXB0aW9uIHN0cnVjdHMuCisgICAgVXNlcihCb3g8ZXJyb3I6OkVycm9yICsgU3luYyArIFNlbmQ+KSwKK30KKworaW1wbCBFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhbiBgQXBwbGljYXRpb25FcnJvcmAgZnJvbSBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgKKyAgICAgICAgaTogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PEFwcGxpY2F0aW9uRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBtZXNzYWdlID0gImdlbmVyYWwgcmVtb3RlIGVycm9yIi50b19vd25lZCgpOworICAgICAgICBsZXQgbXV0IGtpbmQgPSBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bjsKKworICAgICAgICBpLnJlYWRfc3RydWN0X2JlZ2luKCk/OworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gaS5yZWFkX2ZpZWxkX2JlZ2luKCk/OworCisgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGlkID0gZmllbGRfaWRlbnQKKyAgICAgICAgICAgICAgICAuaWQKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJzZW5kZXIgc2hvdWxkIGFsd2F5cyBzcGVjaWZ5IGlkIGZvciBub24tU1RPUCBmaWVsZCIpOworCisgICAgICAgICAgICBtYXRjaCBpZCB7CisgICAgICAgICAgICAgICAgMSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfbWVzc2FnZSA9IGkucmVhZF9zdHJpbmcoKT87CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSByZW1vdGVfbWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgMiA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfdHlwZV9hc19pbnQgPSBpLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX2tpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kID0gVHJ5RnJvbTo6dHJ5X2Zyb20ocmVtb3RlX3R5cGVfYXNfaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcF9vcihBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bik7CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIGtpbmQgPSByZW1vdGVfa2luZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgICAgIGkuc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgT2soQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICAvLy8gQ29udmVydCBhbiBgQXBwbGljYXRpb25FcnJvcmAgaW50byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbiBhbmQgd3JpdGUKKyAgICAvLy8gaXQgdG8gdGhlIHJlbW90ZS4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHdyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgKKyAgICAgICAgZTogJkFwcGxpY2F0aW9uRXJyb3IsCisgICAgICAgIG86ICZtdXQgVE91dHB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iLnRvX293bmVkKCksCisgICAgICAgIH0pPzsKKworICAgICAgICBsZXQgbWVzc2FnZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygibWVzc2FnZSIsIFRUeXBlOjpTdHJpbmcsIDEpOworICAgICAgICBsZXQgdHlwZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygidHlwZSIsIFRUeXBlOjpJMzIsIDIpOworCisgICAgICAgIG8ud3JpdGVfZmllbGRfYmVnaW4oJm1lc3NhZ2VfZmllbGQpPzsKKyAgICAgICAgby53cml0ZV9zdHJpbmcoJmUubWVzc2FnZSk/OworICAgICAgICBvLndyaXRlX2ZpZWxkX2VuZCgpPzsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZ0eXBlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfaTMyKGUua2luZCBhcyBpMzIpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9zdG9wKCk/OworICAgICAgICBvLndyaXRlX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgby5mbHVzaCgpCisgICAgfQorfQorCitpbXBsIGVycm9yOjpFcnJvciBmb3IgRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gVHJhbnNwb3J0RXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBQcm90b2NvbEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gQXBwbGljYXRpb25FcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gZS5kZXNjcmlwdGlvbigpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERlYnVnIGZvciBFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxTdHJpbmc+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiBTdHJpbmcpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IHMsCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsPCdhPiBGcm9tPCYnYSBzdHI+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiAmJ2Egc3RyKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc6OmZyb20ocyksCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIEZyb208VHJhbnNwb3J0RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBUcmFuc3BvcnRFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxQcm90b2NvbEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogUHJvdG9jb2xFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChlKQorICAgIH0KK30KKworaW1wbCBGcm9tPEFwcGxpY2F0aW9uRXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBBcHBsaWNhdGlvbkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKGUpCisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEKKy8vLyBgVHJhbnNwb3J0RXJyb3JgLgorcHViIGZuIG5ld190cmFuc3BvcnRfZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBJL08gZXJyb3JzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUcmFuc3BvcnRFcnJvciB7CisgICAgLy8vIEkvTyBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBUcmFuc3BvcnRFcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFRyYW5zcG9ydEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgIFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEkvTyBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIEkvTyBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHdoZW4gdGhlIHRyYW5zcG9ydCBjaGFubmVsIHdhcyBub3Qgb3Blbi4KKyAgICBOb3RPcGVuID0gMSwKKyAgICAvLy8gVGhlIHRyYW5zcG9ydCBjaGFubmVsIGNhbm5vdCBiZSBvcGVuZWQgYmVjYXVzZSBpdCB3YXMgb3BlbmVkIHByZXZpb3VzbHkuCisgICAgQWxyZWFkeU9wZW4gPSAyLAorICAgIC8vLyBBbiBJL08gb3BlcmF0aW9uIHRpbWVkIG91dC4KKyAgICBUaW1lZE91dCA9IDMsCisgICAgLy8vIEEgcmVhZCBjb3VsZCBub3QgY29tcGxldGUgYmVjYXVzZSBubyBieXRlcyB3ZXJlIGF2YWlsYWJsZS4KKyAgICBFbmRPZkZpbGUgPSA0LAorICAgIC8vLyBBbiBpbnZhbGlkIChidWZmZXIvbWVzc2FnZSkgc2l6ZSB3YXMgcmVxdWVzdGVkIG9yIHJlY2VpdmVkLgorICAgIE5lZ2F0aXZlU2l6ZSA9IDUsCisgICAgLy8vIFRvbyBsYXJnZSBhIGJ1ZmZlciBvciBtZXNzYWdlIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBTaXplTGltaXQgPSA2LAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24gPT4gInRyYW5zcG9ydCBlcnJvciIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4gPT4gIm5vdCBvcGVuIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4gPT4gImFscmVhZHkgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0ID0+ICJ0aW1lZCBvdXQiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUgPT4gImVuZCBvZiBmaWxlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplID0+ICJuZWdhdGl2ZSBzaXplIG1lc3NhZ2UiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuKSwKKyAgICAgICAgICAgIDIgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiksCisgICAgICAgICAgICAzID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQpLAorICAgICAgICAgICAgNCA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSksCisgICAgICAgICAgICA1ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDYgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRyYW5zcG9ydEVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208aW86OkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBpbzo6RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBlcnIua2luZCgpIHsKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkNvbm5lY3Rpb25SZXNldAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVmdXNlZAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpOb3RDb25uZWN0ZWQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkFscmVhZHlFeGlzdHMgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpUaW1lZE91dCA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OlVuZXhwZWN0ZWRFb2YgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwgLy8gRklYTUU6IHVzZSBpbyBlcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxzdHJpbmc6OkZyb21VdGY4RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IHN0cmluZzo6RnJvbVV0ZjhFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgZm10OjpFcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICB9KQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFByb3RvY29sYCB0aGF0IHdyYXBzIGEKKy8vLyBgUHJvdG9jb2xFcnJvcmAuCitwdWIgZm4gbmV3X3Byb3RvY29sX2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIHRoYXQgb2NjdXIgaW4gdGhlIHJ1bnRpbWUgbGlicmFyeS4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIFByb3RvY29sIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogUHJvdG9jb2xFcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBQcm90b2NvbEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBQcm90b2NvbEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IFByb3RvY29sRXJyb3IgeworICAgICAgICBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFJ1bnRpbWUgbGlicmFyeSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gUHJvdG9jb2xFcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgcnVudGltZS1saWJyYXJ5IGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBzdXBwbGllZCB0byBhIGxpYnJhcnkgZnVuY3Rpb24sIG9yIGludmFsaWQgZGF0YQorICAgIC8vLyB3YXMgcmVjZWl2ZWQgZnJvbSBhIFRocmlmdCBlbmRwb2ludC4KKyAgICBJbnZhbGlkRGF0YSA9IDEsCisgICAgLy8vIEFuIGludmFsaWQgc2l6ZSB3YXMgcmVjZWl2ZWQgaW4gYW4gZW5jb2RlZCBmaWVsZC4KKyAgICBOZWdhdGl2ZVNpemUgPSAyLAorICAgIC8vLyBUaHJpZnQgbWVzc2FnZSBvciBmaWVsZCB3YXMgdG9vIGxvbmcuCisgICAgU2l6ZUxpbWl0ID0gMywKKyAgICAvLy8gVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBUaHJpZnQgcHJvdG9jb2wgdmVyc2lvbi4KKyAgICBCYWRWZXJzaW9uID0gNCwKKyAgICAvLy8gVW5zdXBwb3J0ZWQgVGhyaWZ0IHByb3RvY29sLCBzZXJ2ZXIgb3IgZmllbGQgdHlwZS4KKyAgICBOb3RJbXBsZW1lbnRlZCA9IDUsCisgICAgLy8vIFJlYWNoZWQgdGhlIG1heGltdW0gbmVzdGVkIGRlcHRoIHRvIHdoaWNoIGFuIGVuY29kZWQgVGhyaWZ0IGZpZWxkIGNvdWxkCisgICAgLy8vIGJlIHNraXBwZWQuCisgICAgRGVwdGhMaW1pdCA9IDYsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24gPT4gInByb3RvY29sIGVycm9yIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSA9PiAiYmFkIGRhdGEiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgbWVzc2FnZSBzaXplIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24gPT4gImludmFsaWQgdGhyaWZ0IHZlcnNpb24iLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkID0+ICJub3QgaW1wbGVtZW50ZWQiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQgPT4gIm1heGltdW0gc2tpcCBkZXB0aCByZWFjaGVkIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBQcm90b2NvbEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgUHJvdG9jb2xFcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSksCisgICAgICAgICAgICAyID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUpLAorICAgICAgICAgICAgMyA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIDQgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24pLAorICAgICAgICAgICAgNSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6Tm90SW1wbGVtZW50ZWQpLAorICAgICAgICAgICAgNiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gUHJvdG9jb2xFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYEFwcGxpY2F0aW9uYCB0aGF0IHdyYXBzIGFuCisvLy8gYEFwcGxpY2F0aW9uRXJyb3JgLgorcHViIGZuIG5ld19hcHBsaWNhdGlvbl9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIG9yIGluIHVzZXItaW1wbGVtZW50ZWQKKy8vLyBzZXJ2aWNlIGhhbmRsZXJzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQXBwbGljYXRpb24gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgQXBwbGljYXRpb25FcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgIEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQXV0by1nZW5lcmF0ZWQgb3IgdXNlci1pbXBsZW1lbnRlZCBjb2RlIGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBBcHBsaWNhdGlvbkVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBhcHBsaWNhdGlvbiBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gTWFkZSBzZXJ2aWNlIGNhbGwgdG8gYW4gdW5rbm93biBzZXJ2aWNlIG1ldGhvZC4KKyAgICBVbmtub3duTWV0aG9kID0gMSwKKyAgICAvLy8gUmVjZWl2ZWQgYW4gdW5rbm93biBUaHJpZnQgbWVzc2FnZSB0eXBlLiBUaGF0IGlzLCBub3Qgb25lIG9mIHRoZQorICAgIC8vLyBgdGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlYCB2YXJpYW50cy4KKyAgICBJbnZhbGlkTWVzc2FnZVR5cGUgPSAyLAorICAgIC8vLyBNZXRob2QgbmFtZSBpbiBhIHNlcnZpY2UgcmVwbHkgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlCisgICAgLy8vIHJlY2VpdmluZyBzZXJ2aWNlIG1ldGhvZC4KKyAgICBXcm9uZ01ldGhvZE5hbWUgPSAzLAorICAgIC8vLyBSZWNlaXZlZCBhbiBvdXQtb2Ytb3JkZXIgVGhyaWZ0IG1lc3NhZ2UuCisgICAgQmFkU2VxdWVuY2VJZCA9IDQsCisgICAgLy8vIFNlcnZpY2UgcmVwbHkgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAgTWlzc2luZ1Jlc3VsdCA9IDUsCisgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGNvZGUgZmFpbGVkIHVuZXhwZWN0ZWRseS4KKyAgICBJbnRlcm5hbEVycm9yID0gNiwKKyAgICAvLy8gVGhyaWZ0IHByb3RvY29sIGVycm9yLiBXaGVuIHBvc3NpYmxlIHVzZSBgRXJyb3I6OlByb3RvY29sRXJyb3JgIHdpdGggYQorICAgIC8vLyBzcGVjaWZpYyBgUHJvdG9jb2xFcnJvcktpbmRgIGluc3RlYWQuCisgICAgUHJvdG9jb2xFcnJvciA9IDcsCisgICAgLy8vICpVbmtub3duKi4gSW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIFRocmlmdCBpbXBsZW1lbnRhdGlvbnMuCisgICAgSW52YWxpZFRyYW5zZm9ybSA9IDgsIC8vID8/CisgICAgLy8vIFRocmlmdCBlbmRwb2ludCByZXF1ZXN0ZWQsIG9yIGlzIHVzaW5nLCBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZy4KKyAgICBJbnZhbGlkUHJvdG9jb2wgPSA5LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgYXV0by1nZW5lcmF0ZWQgY2xpZW50IHR5cGUuCisgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlID0gMTAsIC8vID8/Cit9CisKK2ltcGwgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24gPT4gInNlcnZpY2UgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QgPT4gInVua25vd24gc2VydmljZSBtZXRob2QiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSA9PiAid3JvbmcgbWVzc2FnZSB0eXBlIHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUgPT4gInVua25vd24gbWV0aG9kIHJlcGx5IHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkID0+ICJvdXQgb2Ygb3JkZXIgc2VxdWVuY2UgaWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQgPT4gIm1pc3NpbmcgbWV0aG9kIHJlc3VsdCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW50ZXJuYWxFcnJvciA9PiAicmVtb3RlIHNlcnZpY2UgdGhyZXcgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpQcm90b2NvbEVycm9yID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSA9PiAiaW52YWxpZCB0cmFuc2Zvcm0iLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCA9PiAiaW52YWxpZCBwcm90b2NvbCByZXF1ZXN0ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9PiAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgY2xpZW50IiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kKSwKKyAgICAgICAgICAgIDIgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSksCisgICAgICAgICAgICAzID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUpLAorICAgICAgICAgICAgNCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCksCisgICAgICAgICAgICA1ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0KSwKKyAgICAgICAgICAgIDYgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IpLAorICAgICAgICAgICAgNyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciksCisgICAgICAgICAgICA4ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkVHJhbnNmb3JtKSwKKyAgICAgICAgICAgIDkgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCksCisgICAgICAgICAgICAxMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5zdXBwb3J0ZWRDbGllbnRUeXBlKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBBcHBsaWNhdGlvbkVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9saWIucnMgYi9saWIvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVjN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSw4NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgUnVzdCBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uCisvLyEKKy8vISBUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nCisvLyEgVGhyaWZ0IHNlcnZlciBhbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorLy8hCisvLyEgMS4gZXJyb3JzCisvLyEgMi4gcHJvdG9jb2wKKy8vISAzLiB0cmFuc3BvcnQKKy8vISA0LiBzZXJ2ZXIKKy8vISA1LiBhdXRvZ2VuCisvLyEKKy8vISBUaGUgbW9kdWxlcyBhcmUgbGF5ZXJlZCBhcyBzaG93biBpbiB0aGUgZGlhZ3JhbSBiZWxvdy4gVGhlIGBhdXRvZ2VuJ2RgCisvLyEgbGF5ZXIgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUKKy8vISB0eXBlcyBhbmQgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCisvLyEgbWVzc2FnZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UgdHlwZXMgYW5kIHNlcnZpY2VzCisvLyEgYnkgd3JpdGluZyB0aGVpciBvd24gY29kZSB0aGF0IHVzZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGNsaWVudHMgYW5kCisvLyEgc2VydmVycy4KKy8vIQorLy8hIGBgYHRleHQKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB1c2VyIGFwcCAgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IGF1dG9nZW4nZCB8ICh1c2VzIGVycm9ycywgYXV0b2dlbikKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCAgcHJvdG9jb2wgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IHRyYW5zcG9ydCB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIGBgYAorCisjIVtjcmF0ZV90eXBlID0gImxpYiJdCisjIVtkb2ModGVzdChhdHRyKGFsbG93KHVudXNlZF92YXJpYWJsZXMpLCBkZW55KHdhcm5pbmdzKSkpKV0KKworZXh0ZXJuIGNyYXRlIGJ5dGVvcmRlcjsKK2V4dGVybiBjcmF0ZSBpbnRlZ2VyX2VuY29kaW5nOworZXh0ZXJuIGNyYXRlIHRocmVhZHBvb2w7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKKworLy8gTk9URTogdGhpcyBtYWNybyBoYXMgdG8gYmUgZGVmaW5lZCBiZWZvcmUgYW55IG1vZHVsZXMuIFNlZToKKy8vIGh0dHBzOi8vZGFuaWVsa2VlcC5naXRodWIuaW8vcXVpY2staW50cm8tdG8tbWFjcm9zLmh0bWwjc29tZS1tb3JlLWdvdGNoYXMKKworLy8vIEFzc2VydCB0aGF0IGFuIGV4cHJlc3Npb24gcmV0dXJuaW5nIGEgYFJlc3VsdGAgaXMgYSBzdWNjZXNzLiBJZiBpdCBpcywKKy8vLyByZXR1cm4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0LCBpLmUuIGBleHByLnVud3JhcCgpYC4KKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9zdWNjZXNzIHsKKyAgICAoJGU6IGV4cHIpID0+IHt7CisgICAgICAgIGxldCByZXMgPSAkZTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisgICAgICAgIHJlcy51bndyYXAoKQorICAgIH19OworfQorCitwdWIgbW9kIHByb3RvY29sOworcHViIG1vZCBzZXJ2ZXI7CitwdWIgbW9kIHRyYW5zcG9ydDsKKworbW9kIGVycm9yczsKK3B1YiB1c2UgZXJyb3JzOjoqOworCittb2QgYXV0b2dlbjsKK3B1YiB1c2UgYXV0b2dlbjo6KjsKKworLy8vIFJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gQXMgaXMgY29udmVudGlvbiB0aGlzIGlzIGEgdHlwZWRlZiBvZiBgc3RkOjpyZXN1bHQ6OlJlc3VsdGAKKy8vLyB3aXRoIGBFYCBkZWZpbmVkIGFzIHRoZSBgdGhyaWZ0OjpFcnJvcmAgdHlwZS4KK3B1YiB0eXBlIFJlc3VsdDxUPiA9IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8VCwgc2VsZjo6RXJyb3I+OwpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFmZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKQEAgLTAsMCArMSw5NTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgQnl0ZU9yZGVyLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKK2NvbnN0IEJJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzE6IHUzMiA9IDB4ODAwMTAwMDA7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBzaW1wbGUgYmluYXJ5IGVuY29kaW5nLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgbW9kZXM6IGBzdHJpY3RgIGFuZCBgbm9uLXN0cmljdGAsIHdoZXJlIHRoZQorLy8vIGBub24tc3RyaWN0YCB2ZXJzaW9uIGRvZXMgbm90IGNoZWNrIGZvciB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUKKy8vLyByZWNlaXZlZCBtZXNzYWdlIGhlYWRlci4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgc3RyaWN0OiBib29sLAorICAgIHB1YiB0cmFuc3BvcnQ6IFQsIC8vIEZJWE1FOiBzaG91bGRuJ3QgYmUgcHVibGljCit9CisKK2ltcGw8J2EsIFQ+IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMgY29udGFpbiB0aGUgcHJvdG9jb2wKKyAgICAvLy8gdmVyc2lvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlci4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCwgc3RyaWN0OiBib29sKSAtPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgICNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhjb2xsYXBzaWJsZV9pZikpXQorICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBsZXQgbXV0IGZpcnN0X2J5dGVzID0gdmVjIVswOyA0XTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IGZpcnN0X2J5dGVzWy4uXSk/OworCisgICAgICAgIC8vIHRoZSB0aHJpZnQgdmVyc2lvbiBoZWFkZXIgaXMgaW50ZW50aW9uYWxseSBuZWdhdGl2ZQorICAgICAgICAvLyBzbyB0aGUgZmlyc3QgY2hlY2sgd2UnbGwgZG8gaXMgc2VlIGlmIHRoZSBzaWduIGJpdCBpcyBzZXQKKyAgICAgICAgLy8gYW5kIGlmIHNvIC0gYXNzdW1lIGl0J3MgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyCisgICAgICAgIGlmIGZpcnN0X2J5dGVzWzBdID49IDggeworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSB3ZSBnb3QgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciAtIGNoZWNrCisgICAgICAgICAgICAvLyBpdCwgYW5kIGlmIGl0IG1hdGNoZXMsIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcworICAgICAgICAgICAgaWYgZmlyc3RfYnl0ZXNbMC4uMl0gIT0gWzB4ODAsIDB4MDFdIHsKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRyeUZyb206OnRyeV9mcm9tKGZpcnN0X2J5dGVzWzNdKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZGlkbid0IGdldCBhIHByb3RvY29sLXZlcnNpb24gaGVhZGVyLAorICAgICAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBpZiB0aGUgc2VuZGVyIGlzIG5vdCB1c2luZyB0aGUgc3RyaWN0IHByb3RvY29sCisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgaW4gc3RyaWN0IG1vZGUgaG93ZXZlciwgYW5kIHRoYXQgYWx3YXlzCisgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyIHRvIGJlIHdyaXR0ZW4gZmlyc3QKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGluIHRoZSBub24tc3RyaWN0IHZlcnNpb24gdGhlIGZpcnN0IG1lc3NhZ2UgZmllbGQKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbWVzc2FnZSBuYW1lLiBzdHJpbmdzIChieXRlIGFycmF5cykgYXJlIGxlbmd0aC1wcmVmaXhlZCwKKyAgICAgICAgICAgICAgICAvLyBzbyB3ZSd2ZSBqdXN0IHJlYWQgdGhlIGxlbmd0aCBpbiB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICAgICAgICAgIGxldCBuYW1lX3NpemUgPSBCaWdFbmRpYW46OnJlYWRfaTMyKCZmaXJzdF9ieXRlcykgYXMgdXNpemU7CisgICAgICAgICAgICAgICAgbGV0IG11dCBuYW1lX2J1ZjogVmVjPHU4PiA9IHZlYyFbMDsgbmFtZV9zaXplXTsKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2V4YWN0KCZtdXQgbmFtZV9idWYpPzsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFN0cmluZzo6ZnJvbV91dGY4KG5hbWVfYnVmKT87CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKFRyeUZyb206OnRyeV9mcm9tKT87CisgICAgICAgICAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcobmFtZSwgbWVzc2FnZV90eXBlLCBzZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBmaWVsZF90eXBlX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBmaWVsZF90eXBlX2Zyb21fdTgoZmllbGRfdHlwZV9ieXRlKT87CisgICAgICAgIGxldCBpZCA9IG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soMCksCisgICAgICAgICAgICBfID0+IHNlbGYucmVhZF9pMTYoKSwKKyAgICAgICAgfT87CisgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXI6Om5ldzo6PE9wdGlvbjxTdHJpbmc+LCBTdHJpbmcsIGkxNj4oCisgICAgICAgICAgICBOb25lLCBmaWVsZF90eXBlLCBpZCwKKyAgICAgICAgKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBudW1fYnl0ZXMgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IG51bV9ieXRlc107CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBsZXQgYiA9IHNlbGYucmVhZF9pOCgpPzsKKyAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAwID0+IE9rKGZhbHNlKSwKKyAgICAgICAgICAgIF8gPT4gT2sodHJ1ZSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pOCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2kxNjo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2Y2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gc2VsZi5yZWFkX2J5dGVzKCk/OworICAgICAgICBTdHJpbmc6OmZyb21fdXRmOChieXRlcykubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGtleV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCB2YWx1ZV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhrZXlfdHlwZSwgdmFsdWVfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3U4KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeUlucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworLy8vIFdyaXRlIG1lc3NhZ2VzIHVzaW5nIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgc3RyaWN0YCB2ZXJzaW9uIHdyaXRlcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UKKy8vLyBoZWFkZXIgYW5kIHRoZSBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2Jvb2wodHJ1ZSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJ0ZXN0X3N0cmluZyIpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogZG8gbm90IG1ha2UgcHVibGljOyBvbmx5IHB1YmxpYyBmb3IgdGVzdGluZyEKK30KKworaW1wbDxUPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgb3V0Z29pbmcgbWVzc2FnZXMgc2hvdWxkIGNvbnRhaW4gdGhlCisgICAgLy8vIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sIGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiB1OCA9IGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKTsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIHwgKG1lc3NhZ2VfdHlwZSBhcyB1MzIpOworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTMyOjo8QmlnRW5kaWFuPihoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGlkZW50aWZpZXIuaWQuaXNfbm9uZSgpICYmIGlkZW50aWZpZXIuZmllbGRfdHlwZSAhPSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgd3JpdGUgaWRlbnRpZmllciB7Oj99IHdpdGhvdXQgc2VxdWVuY2UgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgJmlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5maWVsZF90eXBlKSk/OworICAgICAgICBpZiBsZXQgU29tZShpZCkgPSBpZGVudGlmaWVyLmlkIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTE2KGlkKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGIubGVuKCkgYXMgaTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGIgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTgoaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTE2Ojo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pMzI6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k2NDo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfZjY0Ojo8QmlnRW5kaWFuPihkKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlcyhzLmFzX2J5dGVzKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGtleV90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChrZXlfdHlwZSkpPzsKKyAgICAgICAgbGV0IHZhbF90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgodmFsX3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTgoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeU91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCwgdHJ1ZSkpCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpWb2lkID0+IDB4MDEsCisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDIsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNiwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA4LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgfCBUVHlwZTo6VXRmNyA9PiAweDBCLAorICAgICAgICBUVHlwZTo6U3RydWN0ID0+IDB4MEMsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwRCwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBFLAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDBGLAorICAgICAgICBUVHlwZTo6VXRmOCA9PiAweDEwLAorICAgICAgICBUVHlwZTo6VXRmMTYgPT4gMHgxMSwKKyAgICB9Cit9CisKK2ZuIGZpZWxkX3R5cGVfZnJvbV91OChiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDEgPT4gT2soVFR5cGU6OlZvaWQpLAorICAgICAgICAweDAyID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgMHgwMyA9PiBPayhUVHlwZTo6STA4KSwgLy8gRXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICAweDA0ID0+IE9rKFRUeXBlOjpEb3VibGUpLAorICAgICAgICAweDA2ID0+IE9rKFRUeXBlOjpJMTYpLAorICAgICAgICAweDA4ID0+IE9rKFRUeXBlOjpJMzIpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpJNjQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpTdHJpbmcpLCAvLyB0ZWNobmljYWxseSwgYWxzbyBhIFVURjcsIGJ1dCB3ZSdsbCB0cmVhdCBpdCBhcyBzdHJpbmcKKyAgICAgICAgMHgwQyA9PiBPayhUVHlwZTo6U3RydWN0KSwKKyAgICAgICAgMHgwRCA9PiBPayhUVHlwZTo6TWFwKSwKKyAgICAgICAgMHgwRSA9PiBPayhUVHlwZTo6U2V0KSwKKyAgICAgICAgMHgwRiA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MTAgPT4gT2soVFR5cGU6OlV0ZjgpLAorICAgICAgICAweDExID0+IE9rKFRUeXBlOjpVdGYxNiksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX2NhbGxfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RyaWN0X21lc3NhZ2VfcmVwbHlfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbm9uX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6UmVwbHksIDEwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxM10gPSBbCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDBBLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cmljdF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25vbl9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJnNlbnRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWVzc2FnZV9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2JlZ2luKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUoCisgICAgICAgICAgICB8b3wgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3N0cnVjdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzb21lX2ZpZWxkIiwgVFR5cGU6OlN0cmluZywgMjIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsweDBCLCAweDAwLCAweDE2XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IHNlbnRfZmllbGRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDIwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJnNlbnRfZmllbGRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpJNjQsCisgICAgICAgICAgICBpZDogU29tZSgyMCksCisgICAgICAgIH07IC8vIG5vIG5hbWUKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdG9wX2ZpZWxkKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX3N0b3AoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgaWQ6IFNvbWUoMCksCisgICAgICAgIH07IC8vIHdlIGdldCBpZCAwCisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCA1KSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDkwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9saXN0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkxNiwgNykpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDddOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCAyMDAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50X3Jlc3VsdCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpOworICAgICAgICBhc3NlcnQhKHJlY2VpdmVkX2lkZW50X3Jlc3VsdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnRfcmVzdWx0LnVud3JhcCgpLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCBUVHlwZTo6U3RydWN0LCAzMikpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDZdID0gWzB4MEEsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6U2V0LCAxMDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDFdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfZmFsc2UoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHgwMF0pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19hbnlfbm9uX3plcm9fdmFsdWVfdG9fYmVfaW50ZXJwcmV0ZWRfYXNfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4QUNdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ieXRlcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMTBdID0gWzB4MEEsIDB4Q0MsIDB4RDEsIDB4ODQsIDB4OTksIDB4MTIsIDB4QUIsIDB4QkIsIDB4NDUsIDB4REZdOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2J5dGVzKCZieXRlcykuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGJ1ZiA9IG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjRdLCBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQV0pOyAvLyBsZW5ndGgKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzQuLl0sIGJ5dGVzKTsgLy8gYWN0dWFsIGJ5dGVzCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ieXRlcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMjVdID0gWworICAgICAgICAgICAgMHgyMCwKKyAgICAgICAgICAgIDB4RkQsCisgICAgICAgICAgICAweDE4LAorICAgICAgICAgICAgMHg4NCwKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweDEyLAorICAgICAgICAgICAgMHhBQiwKKyAgICAgICAgICAgIDB4QkIsCisgICAgICAgICAgICAweDQ1LAorICAgICAgICAgICAgMHhERiwKKyAgICAgICAgICAgIDB4MzQsCisgICAgICAgICAgICAweERDLAorICAgICAgICAgICAgMHg5OCwKKyAgICAgICAgICAgIDB4QTQsCisgICAgICAgICAgICAweDZELAorICAgICAgICAgICAgMHhGMywKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweEI0LAorICAgICAgICAgICAgMHhCNywKKyAgICAgICAgICAgIDB4RDQsCisgICAgICAgICAgICAweDlDLAorICAgICAgICAgICAgMHhBNSwKKyAgICAgICAgICAgIDB4QjMsCisgICAgICAgICAgICAweEM5LAorICAgICAgICAgICAgMHg4OCwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9ieXRlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfYnl0ZXMsICZieXRlcyk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKAorICAgICAgICBzdHJpY3Q6IGJvb2wsCisgICAgKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9tZW0sIHN0cmljdCk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSwgc3RyaWN0KTsKKworICAgICAgICAoaV9wcm90LCBvX3Byb3QpCisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3dyaXRlPEY+KG11dCB3cml0ZV9mbjogRiwgc3RyaWN0OiBib29sKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHN0cmljdCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMKQEAgLTAsMCArMSwyMzg2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2UgaW50ZWdlcl9lbmNvZGluZzo6e1ZhckludFJlYWRlciwgVmFySW50V3JpdGVyfTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCitjb25zdCBDT01QQUNUX1BST1RPQ09MX0lEOiB1OCA9IDB4ODI7Citjb25zdCBDT01QQUNUX1ZFUlNJT046IHU4ID0gMHgwMTsKK2NvbnN0IENPTVBBQ1RfVkVSU0lPTl9NQVNLOiB1OCA9IDB4MUY7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBsZXQgcmVjdmRfYm9vbCA9IHByb3RvY29sLnJlYWRfYm9vbCgpLnVud3JhcCgpOworLy8vIGxldCByZWN2ZF9zdHJpbmcgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBkZXNlcmlhbGl6ZWQgZm9yIGEgc3RydWN0LgorICAgIGxhc3RfcmVhZF9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHJlYWQgZmllbGQgaWRzIChhIG5ldyBlbnRyeSBpcyBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHJlYWQpLgorICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzxpMTY+LAorICAgIC8vIEJvb2xlYW4gdmFsdWUgZm9yIGEgZmllbGQuCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZSwKKyAgICAvLyBhbmQgcmVhZGluZyB0aGUgZmllbGQgb25seSBvY2N1cnMgYWZ0ZXIgdGhlIGZpZWxkIGlkIGlzIHJlYWQuCisgICAgcGVuZGluZ19yZWFkX2Jvb2xfdmFsdWU6IE9wdGlvbjxib29sPiwKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciBieXRlLWxldmVsIG9wZXJhdGlvbnMuCisgICAgdHJhbnNwb3J0OiBULAorfQorCitpbXBsPFQ+IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF9yZWFkX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgcmVhZF9maWVsZF9pZF9zdGFjazogVmVjOjpuZXcoKSwKKyAgICAgICAgICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3Rfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KFRUeXBlLCBpMzIpPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZShoZWFkZXIgJiAweDBGKT87CisKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQ7CisgICAgICAgIGxldCBwb3NzaWJsZV9lbGVtZW50X2NvdW50ID0gKGhlYWRlciAmIDB4RjApID4+IDQ7CisgICAgICAgIGlmIHBvc3NpYmxlX2VsZW1lbnRfY291bnQgIT0gMTUgeworICAgICAgICAgICAgLy8gaGlnaCBiaXRzIHNldCBoaWdoIGlmIGNvdW50IGFuZCB0eXBlIGVuY29kZWQgc2VwYXJhdGVseQorICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHBvc3NpYmxlX2VsZW1lbnRfY291bnQgYXMgaTMyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPyBhcyBpMzI7CisgICAgICAgIH0KKworICAgICAgICBPaygoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGNvbXBhY3RfaWQgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgaWYgY29tcGFjdF9pZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiaW52YWxpZCBjb21wYWN0IHByb3RvY29sIGhlYWRlciB7Oj99IiwgY29tcGFjdF9pZCksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICBsZXQgdHlwZV9hbmRfYnl0ZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgcmVjZWl2ZWRfdmVyc2lvbiA9IHR5cGVfYW5kX2J5dGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgcmVjZWl2ZWRfdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHByb2Nlc3MgY29tcGFjdCBwcm90b2NvbCB2ZXJzaW9uIHs6P30iLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0/OworCisgICAgICAgIC8vIE5PVEU6IHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHdpbGwgcGFkIHdpdGggMHMKKyAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gVE1lc3NhZ2VUeXBlOjp0cnlfZnJvbSh0eXBlX2FuZF9ieXRlID4+IDUpPzsKKyAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIGxldCBzZXJ2aWNlX2NhbGxfbmFtZSA9IHNlbGYucmVhZF9zdHJpbmcoKT87CisKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSAwOworCisgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgc2VydmljZV9jYWxsX25hbWUsCisgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLnJlYWRfZmllbGRfaWRfc3RhY2sucHVzaChzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYKKyAgICAgICAgICAgIC5yZWFkX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICAvLyB3ZSBjYW4gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgd2hpY2ggaXM6CisgICAgICAgIC8vIC0gdGhlIHR5cGUKKyAgICAgICAgLy8gLSB0aGUgZmllbGQgZGVsdGEgYW5kIHRoZSB0eXBlCisgICAgICAgIGxldCBmaWVsZF90eXBlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IChmaWVsZF90eXBlICYgMHhGMCkgPj4gNDsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBtYXRjaCBmaWVsZF90eXBlICYgMHgwRiB7CisgICAgICAgICAgICAweDAxID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDB4MDIgPT4geworICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUgPSBTb21lKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR0dTggPT4gdThfdG9fdHlwZSh0dHU4KSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiBPaygKKyAgICAgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBPcHRpb248aTE2Pj4oCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgaWYgZmllbGRfZGVsdGEgIT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkICs9IGZpZWxkX2RlbHRhIGFzIGkxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYucmVhZF9pMTYoKT87CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBpZDogU29tZShzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKGIpID0+IE9rKGIpLAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgICAgICAgICAgMHgwMSA9PiBPayh0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgMHgwMiA9PiBPayhmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gYm9vbCIsIHVua24pLAorICAgICAgICAgICAgICAgICAgICB9KSksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IGxlbiA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPzsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgbGVuIGFzIHVzaXplXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5yZWFkX2J5dGUoKS5tYXAofGl8IGkgYXMgaTgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpMTY+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTMyPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGk2ND4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpID0gc2VsZi5yZWFkX2xpc3Rfc2V0X2JlZ2luKCk/OworICAgICAgICBPayhUTGlzdElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICBpZiBlbGVtZW50X2NvdW50ID09IDAgeworICAgICAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhOb25lLCBOb25lLCAwKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCB0eXBlX2hlYWRlciA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICAgICAgbGV0IGtleV90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKCh0eXBlX2hlYWRlciAmIDB4RjApID4+IDQpPzsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSh0eXBlX2hlYWRlciAmIDB4MEYpPzsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyAxXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZlswXSkKKyAgICB9Cit9CisKK2ltcGw8VD4gaW86OlNlZWsgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBpbzo6U2VlayArIFRSZWFkVHJhbnNwb3J0LAoreworICAgIGZuIHNlZWsoJm11dCBzZWxmLCBwb3M6IGlvOjpTZWVrRnJvbSkgLT4gaW86OlJlc3VsdDx1NjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuc2Vlayhwb3MpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IGNvbXBhY3QgcHJvdG9jb2wuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiBpMTYsCisgICAgLy8gU3RhY2sgb2YgdGhlIGxhc3Qgd3JpdHRlbiBmaWVsZCBpZHMgKG5ldyBlbnRyeSBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHdyaXR0ZW4pLgorICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBGaWVsZCBpZGVudGlmaWVyIG9mIHRoZSBib29sZWFuIGZpZWxkIHRvIGJlIHdyaXR0ZW4uCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZQorICAgIHBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyOiBPcHRpb248VEZpZWxkSWRlbnRpZmllcj4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgd3JpdGVfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IGZpZWxkX3R5cGUgYXMgdW5jb25zdHJhaW5lZCB1OCBpcyBiYWQKKyAgICBmbiB3cml0ZV9maWVsZF9oZWFkZXIoJm11dCBzZWxmLCBmaWVsZF90eXBlOiB1OCwgZmllbGRfaWQ6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGZpZWxkX2RlbHRhID0gZmllbGRfaWQgLSBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQ7CisgICAgICAgIGlmIGZpZWxkX2RlbHRhID4gMCAmJiBmaWVsZF9kZWx0YSA8IDE1IHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgoKGZpZWxkX2RlbHRhIGFzIHU4KSA8PCA0KSB8IGZpZWxkX3R5cGUpPzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihmaWVsZF9pZCk/OworICAgICAgICB9CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYsIGVsZW1lbnRfdHlwZTogVFR5cGUsIGVsZW1lbnRfY291bnQ6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGVsZW1faWRlbnRpZmllciA9IGNvbGxlY3Rpb25fdHlwZV90b191OChlbGVtZW50X3R5cGUpOworICAgICAgICBpZiBlbGVtZW50X2NvdW50IDw9IDE0IHsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSAoZWxlbWVudF9jb3VudCBhcyB1OCkgPDwgNCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gMHhGMCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAgICAgLndyaXRlX3ZhcmludChlbGVtZW50X2NvdW50IGFzIHUzMikKKyAgICAgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgmc2VsZikgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgZikgPSBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyIHsKKyAgICAgICAgICAgIHBhbmljISgicGVuZGluZyBib29sIGZpZWxkIHs6P30gbm90IHdyaXR0ZW4iLCBmKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShDT01QQUNUX1BST1RPQ09MX0lEKT87CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgodTg6OmZyb20oaWRlbnRpZmllci5tZXNzYWdlX3R5cGUpIDw8IDUpIHwgQ09NUEFDVF9WRVJTSU9OKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKT87CisgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgXzogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAud3JpdGVfZmllbGRfaWRfc3RhY2sKKyAgICAgICAgICAgIC5wb3AoKQorICAgICAgICAgICAgLmV4cGVjdCgic2hvdWxkIGhhdmUgcHJldmlvdXMgZmllbGQgaWRzIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIuZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB7CisgICAgICAgICAgICAgICAgaWYgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllci5pc19zb21lKCkgeworICAgICAgICAgICAgICAgICAgICBwYW5pYyEoCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGEgcGVuZGluZyBib29sIHdoaWxlIHdyaXRpbmcgYW5vdGhlciBib29sIHdpdGggaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyID0gU29tZShpZGVudGlmaWVyLmNsb25lKCkpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSB0eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSk7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkID0gaWRlbnRpZmllci5pZC5leHBlY3QoIm5vbi1zdG9wIGZpZWxkIHNob3VsZCBoYXZlIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZSwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUodHlwZV90b191OChUVHlwZTo6U3RvcCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIudGFrZSgpIHsKKyAgICAgICAgICAgIFNvbWUocGVuZGluZykgPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IHBlbmRpbmcuaWQuZXhwZWN0KCJib29sIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQiKTsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfdHlwZV9hc191OCA9IGlmIGIgeyAweDAxIH0gZWxzZSB7IDB4MDIgfTsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2hlYWRlcihmaWVsZF90eXBlX2FzX3U4LCBmaWVsZF9pZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGlmIGIgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoYi5sZW4oKSBhcyB1MzIpPzsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfYWxsKGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoaSBhcyB1OCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfbGlzdF9zZXRfYmVnaW4oaWRlbnRpZmllci5lbGVtZW50X3R5cGUsIGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLnNpemUgPT0gMCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3ZhcmludChpZGVudGlmaWVyLnNpemUgYXMgdTMyKT87CisKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICAgICAgbGV0IGtleV90eXBlX2J5dGUgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoa2V5X3R5cGUpIDw8IDQ7CisKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KHZhbF90eXBlKTsKKworICAgICAgICAgICAgbGV0IG1hcF90eXBlX2hlYWRlciA9IGtleV90eXBlX2J5dGUgfCB2YWxfdHlwZV9ieXRlOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKG1hcF90eXBlX2hlYWRlcikKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgmW2JdKS5tYXBfZXJyKEZyb206OmZyb20pLm1hcCh8X3wgKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQpKQorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDEsCisgICAgICAgIGYgPT4gdHlwZV90b191OChmKSwKKyAgICB9Cit9CisKK2ZuIHR5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OlN0b3AgPT4gMHgwMCwKKyAgICAgICAgVFR5cGU6OkkwOCA9PiAweDAzLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNCwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA1LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gMHgwNywKKyAgICAgICAgVFR5cGU6OlN0cmluZyA9PiAweDA4LAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDA5LAorICAgICAgICBUVHlwZTo6U2V0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBfID0+IHBhbmljIShmb3JtYXQhKAorICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhdHRlbXB0ZWQgdG8gY29udmVydCB7fSB0byB1OCIsCisgICAgICAgICAgICBmaWVsZF90eXBlCisgICAgICAgICkpLAorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl91OF90b190eXBlKGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgbyA9PiB1OF90b190eXBlKG8pLAorICAgIH0KK30KKworZm4gdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwNSA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwNyA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6U3RyaW5nKSwKKyAgICAgICAgMHgwOSA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MEEgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEIgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCwKKyAgICAgICAgICAgIDQzMQorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4MjEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4REUsCisgICAgICAgICAgICAweDA2LCAvKiB6aWctemFnIHZhcmludCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgIDB4MDMsIC8qIG1lc3NhZ2UtbmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiAvKiAiZm9vIiAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl8xKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICJiYXIiLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSwKKyAgICAgICAgICAgIDk5MTgyOAorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDldID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4NDEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4QTgsCisgICAgICAgICAgICAweDg5LAorICAgICAgICAgICAgMHg3OSwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDYyLAorICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgIDB4NzIgLyogImJhciIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEyODM5NDgpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCkpOworICAgIH0KKworICAgIC8vIE5PVEU6IHN0cnVjdHMgYW5kIGZpZWxkcyBhcmUgdGVzdGVkIHRvZ2V0aGVyCisgICAgLy8KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkxNiwgNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbCisgICAgICAgICAgICAweDAzLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaXJzdCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg0NCwgLyogZmllbGQgZGVsdGEgKDQpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg1OSwgLyogZmllbGQgZGVsdGEgKDUpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX25vbl96ZXJvX2luaXRpYWxfZmllbGRfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MTUsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MUEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NDgsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2xvbmdfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCA5OSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgwNSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDYsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MjAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEM2LAorICAgICAgICAgICAgMHgwMSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgb25seSAzIHVwIGZyb20gdGhlIHByZXZpb3VzIGl0IGlzIHJlY29yZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTBdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhEMCwKKyAgICAgICAgICAgIDB4MEYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEEyLAorICAgICAgICAgICAgMHgxRiwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9taXhfb2ZfbG9uZ19hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAxMDAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF81ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg3MywgLyogZmllbGQgZGVsdGEgKDcpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMCgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgzMywgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18xKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18yKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDgsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDc3LCAvKiBmaWVsZCBkZWx0YSg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NjMsIC8qIGZpZWxkIGRlbHRhICg2KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNiBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMjYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IHRydWUgKi8KKyAgICAgICAgICAgIDB4ODIsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZhbHNlICovCisgICAgICAgICAgICAweDAxLCAvKiB0cnVlICovCisgICAgICAgICAgICAweDM0LCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMiwgLyogZmFsc2UgKi8KKyAgICAgICAgICAgIDB4NUEsIC8qIGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIHN0b3AgZmllbGQgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdHdvIGZpZWxkcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzEsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8yLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzMsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV80LCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9maWVsZF9lbmRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0b3BfZmllbGRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdHJ1Y3RfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X2FueV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgNCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHg0NiAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkwOCwgMTApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHJlcyA9IG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TGlzdCwgOTk5OSkpOworICAgICAgICBhc3NlcnQhKHJlcy5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEY5LCAvKiAweEYwIHwgZWxlbV90eXBlICovCisgICAgICAgICAgICAweDhGLCAweDRFLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xhcmdlX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U2V0LCA0NzM4MSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cnVjdCwgMikpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgyQyAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgMjM4OTEpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHhGNywgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHhEMywgMHhCQSwgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIDM5Mjg0MjkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3NldF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U3RyaW5nLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsgLy8gc2luY2Ugc2l6ZSBpcyB6ZXJvIHdlIGRvbid0IHdyaXRlIGFueXRoaW5nCisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6RG91YmxlLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgJnJlcywKKyAgICAgICAgICAgICZUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAga2V5X3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogTm9uZSwKKyAgICAgICAgICAgICAgICBzaXplOiAwLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcsCisgICAgICAgICAgICAyMzgKKyAgICAgICAgKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsKKyAgICAgICAgICAgIDB4RUUsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDc4LCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6TGlzdCwgMTkyODM0OSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfd2l0aF9ib29sX2tleV9hbmRfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9lbmQoKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgICAgIDB4MTEsIC8qIGtleSB0eXBlIHwgdmFsIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDEsIC8qIGtleTogdHJ1ZSAqLworICAgICAgICAgICAgMHgwMiwgLyogdmFsOiBmYWxzZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF93aXRoX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgbWFwX2lkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmbWFwX2lkZW50KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIG1hcCBoZWFkZXIKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyY3ZkX2lkZW50LCAmbWFwX2lkZW50KTsKKyAgICAgICAgLy8ga2V5IDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gdmFsIDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCBmYWxzZSk7CisgICAgICAgIC8vIGtleSAyCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyB2YWwgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIHRydWUpOworICAgICAgICAvLyBtYXAgZW5kCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWFwX2VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKGlfcHJvdC5yZWFkX21hcF9lbmQoKS5pc19vaygpKTsgLy8gd2lsbCBibG93IHVwIGlmIHdlIHRyeSB0byByZWFkIGZyb20gZW1wdHkgYnVmZmVyCisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gKAorICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDgwLCA4MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtKTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYpCisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUQ29tcGFjdE91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWMwMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKQEAgLTAsMCArMSw5NjkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwcmltaXRpdmVzIGJldHdlZW4gYSBUaHJpZnQgY2xpZW50IGFuZCBzZXJ2ZXIuCisvLyEKKy8vISAjIEV4YW1wbGVzCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBkZWNvZGUgYnl0ZXMgaW50byB0eXBlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8hCisvLyEgLy8gcmVhZCB0eXBlcyBmcm9tIHRoZSB3aXJlCisvLyEgbGV0IGZpZWxkX2lkZW50aWZpZXIgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2NvbnRlbnRzID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vISBsZXQgZmllbGRfZW5kID0gcHJvdG9jb2wucmVhZF9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vISBgYGAKKy8vIQorLy8hIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVEZpZWxkSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUVHlwZX07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBlbmNvZGUgdHlwZXMgaW50byBieXRlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHdyaXRlIHR5cGVzCisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07Cit1c2Uge1Byb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kfTsKKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkb19wcm90OmlkZW50LCAkZXhwZWN0ZWRfYnl0ZXM6aWRlbnQpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKKy8vIEZJWE1FOiBzaG91bGQgdGFrZSBib3RoIHJlYWQgYW5kIHdyaXRlCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciB7CisgICAgKCRvX3Byb3Q6aWRlbnQpID0+IHt7CisgICAgICAgICRvX3Byb3QudHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIHNldF9yZWFkYWJsZV9ieXRlcyB7CisgICAgKCRpX3Byb3Q6aWRlbnQsICRieXRlczpleHByKSA9PiB7CisgICAgICAgICRpX3Byb3QudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygkYnl0ZXMpOworICAgIH07Cit9CisKK21vZCBiaW5hcnk7Cittb2QgY29tcGFjdDsKK21vZCBtdWx0aXBsZXhlZDsKK21vZCBzdG9yZWQ7CisKK3B1YiB1c2Ugc2VsZjo6YmluYXJ5Ojp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sLAorICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpjb21wYWN0Ojp7CisgICAgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bXVsdGlwbGV4ZWQ6OlRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOworcHViIHVzZSBzZWxmOjpzdG9yZWQ6OlRTdG9yZWRJbnB1dFByb3RvY29sOworCisvLyBEZWZhdWx0IG1heGltdW0gZGVwdGggdG8gd2hpY2ggYFRJbnB1dFByb3RvY29sOjpza2lwYCB3aWxsIHNraXAgYSBUaHJpZnQKKy8vIGZpZWxkLiBBIGRlZmF1bHQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVGhyaWZ0IHN0cnVjdHMgb3IgY29sbGVjdGlvbnMgbWF5CisvLyBjb250YWluIG5lc3RlZCBzdHJ1Y3RzIGFuZCBjb2xsZWN0aW9ucywgd2hpY2ggY291bGQgcmVzdWx0IGluIGluZGVmaW5pdGUKKy8vIHJlY3Vyc2lvbi4KK2NvbnN0IE1BWElNVU1fU0tJUF9ERVBUSDogaTggPSA2NDsKKworLy8vIENvbnZlcnRzIGEgc3RyZWFtIG9mIGJ5dGVzIGludG8gVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLAorLy8vIGNvbnRhaW5lcnMsIG9yIHN0cnVjdHMuCisvLy8KKy8vLyBUaGlzIHRyYWl0IGRvZXMgbm90IGRlYWwgd2l0aCBoaWdoZXItbGV2ZWwgVGhyaWZ0IGNvbmNlcHRzIGxpa2Ugc3RydWN0cyBvcgorLy8vIGV4Y2VwdGlvbnMgLSBvbmx5IHdpdGggcHJpbWl0aXZlcyBhbmQgbWVzc2FnZSBvciBjb250YWluZXIgYm91bmRhcmllcy4gT25jZQorLy8vIGJ5dGVzIGFyZSByZWFkIHRoZXkgYXJlIGRlc2VyaWFsaXplZCBhbmQgYW4gaWRlbnRpZmllciAoZm9yIGV4YW1wbGUKKy8vLyBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYSBwcmltaXRpdmUgaXMgcmV0dXJuZWQuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2wgeworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0IGZpZWxkLgorICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCBhIGJvb2wuCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD47CisgICAgLy8vIFJlYWQgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj47CisgICAgLy8vIFJlYWQgYSB3b3JkLgorICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD47CisgICAgLy8vIFJlYWQgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+OworICAgIC8vLyBSZWFkIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPjsKKyAgICAvLy8gUmVhZCBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIHN0cmluZyAobm90IG51bGwgdGVybWluYXRlZCkuCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVudGlsIHRoZSBkZWZhdWx0CisgICAgLy8vIG1heGltdW0gc2tpcCBkZXB0aCBpcyByZWFjaGVkLgorICAgIGZuIHNraXAoJm11dCBzZWxmLCBmaWVsZF90eXBlOiBUVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoZmllbGRfdHlwZSwgTUFYSU1VTV9TS0lQX0RFUFRIKQorICAgIH0KKyAgICAvLy8gU2tpcCBhIGZpZWxkIHdpdGggdHlwZSBgZmllbGRfdHlwZWAgcmVjdXJzaXZlbHkgdXAgdG8gYGRlcHRoYCBsZXZlbHMuCisgICAgZm4gc2tpcF90aWxsX2RlcHRoKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUsIGRlcHRoOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgZGVwdGggPT0gMCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBwYXJzZSBwYXN0IHs6P30iLCBmaWVsZF90eXBlKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gc2VsZi5yZWFkX2Jvb2woKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gc2VsZi5yZWFkX2k4KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHNlbGYucmVhZF9pMTYoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gc2VsZi5yZWFkX2kzMigpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6Okk2NCA9PiBzZWxmLnJlYWRfaTY0KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHNlbGYucmVhZF9kb3VibGUoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gc2VsZi5yZWFkX3N0cmluZygpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gc2VsZi5yZWFkX2ZpZWxkX2JlZ2luKCk/OworICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc3RydWN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TGlzdCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGxpc3RfaWRlbnQgPSBzZWxmLnJlYWRfbGlzdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChsaXN0X2lkZW50LmVsZW1lbnRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9saXN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6U2V0ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgc2V0X2lkZW50ID0gc2VsZi5yZWFkX3NldF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5zZXRfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKHNldF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc2V0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TWFwID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbWFwX2lkZW50ID0gc2VsZi5yZWFkX21hcF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJub24temVybyBzaXplZCBtYXAgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gbWFwX2lkZW50CisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoa2V5X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aCh2YWxfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9tYXBfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBza2lwIGZpZWxkIHR5cGUgezo/fSIsICZ1KSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gUmVhZCBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+OworfQorCisvLy8gQ29udmVydHMgVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLCBjb250YWluZXJzIG9yIHN0cnVjdHMgaW50byBhCisvLy8gc3RyZWFtIG9mIGJ5dGVzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuCisvLy8gV3JpdGUgbWV0aG9kcyB0YWtlIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlLCBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYQorLy8vIHByaW1pdGl2ZS4gQW55IG9yIGFsbCBvZiB0aGUgZmllbGRzIGluIGFuIGlkZW50aWZpZXIgbWF5IGJlIG9taXR0ZWQgd2hlbgorLy8vIHdyaXRpbmcgdG8gdGhlIHRyYW5zcG9ydC4gV3JpdGUgbWV0aG9kcyBtYXkgZXZlbiBiZSBub29wcy4gQWxsIG9mIHRoaXMgaXMKKy8vLyB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyOyBhcyBsb25nIGFzIGEgbWF0Y2hpbmcgYFRJbnB1dFByb3RvY29sYAorLy8vIGltcGxlbWVudGF0aW9uIGlzIHVzZWQsIHJlY2VpdmVkIG1lc3NhZ2VzIHdpbGwgYmUgZGVjb2RlZCBjb3JyZWN0bHkuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE91dHB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sIHsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgZmllbGQuCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBTVE9QIGZpZWxkIGluZGljYXRpbmcgdGhhdCBhbGwgdGhlIGZpZWxkcyBpbiBhIHN0cnVjdCBoYXZlIGJlZW4KKyAgICAvLy8gd3JpdHRlbi4KKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGJvb2wuCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIHN0cmluZy4KKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gRmx1c2ggYnVmZmVyZWQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworCisgICAgLy8gdXRpbGl0eSAoRE8gTk9UIFVTRSBJTiBHRU5FUkFURUQgQ09ERSEhISEpCisgICAgLy8KKworICAgIC8vLyBXcml0ZSBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT47IC8vIEZJWE1FOiBSRU1PVkUKK30KKworaW1wbDxQPiBUSW5wdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRJbnB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJ1Y3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k4KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTY0KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ieXRlKCkKKyAgICB9Cit9CisKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBCb3g8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9zdG9wKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYm9vbChiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2J5dGVzKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTgoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pNjQoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5mbHVzaCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVElucHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xGYWN0b3J5YCBhbmQgdXNlIGl0IHRvIGNyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBmYWN0b3J5ID0gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKHRyYW5zcG9ydCkKKyAgICB9Cit9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY3JlYXRlIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVE91dHB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworLy8vIGxldCBwcm90b2NvbCA9IGZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KGNoYW5uZWwpKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIFNlcnZpY2UgY2FsbCB0aGUgbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgcHViIG5hbWU6IFN0cmluZywKKyAgICAvLy8gTWVzc2FnZSB0eXBlLgorICAgIHB1YiBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAvLy8gT3JkZXJlZCBzZXF1ZW5jZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIG1lc3NhZ2UuCisgICAgcHViIHNlcXVlbmNlX251bWJlcjogaTMyLAorfQorCitpbXBsIFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIGZvciBhIFRocmlmdCBzZXJ2aWNlLWNhbGwgbmFtZWQgYG5hbWVgCisgICAgLy8vIHdpdGggbWVzc2FnZSB0eXBlIGBtZXNzYWdlX3R5cGVgIGFuZCBzZXF1ZW5jZSBudW1iZXIgYHNlcXVlbmNlX251bWJlcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICBuYW1lOiBTLAorICAgICAgICBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgc2VxdWVuY2VfbnVtYmVyOiBpMzIsCisgICAgKSAtPiBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogbmFtZS5pbnRvKCksCisgICAgICAgICAgICBtZXNzYWdlX3R5cGU6IG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlcjogc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBlbmNvZGVkIFRocmlmdCBzdHJ1Y3QuCisgICAgcHViIG5hbWU6IFN0cmluZywKK30KKworaW1wbCBUU3RydWN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RydWN0SWRlbnRpZmllcmAgZm9yIGEgc3RydWN0IG5hbWVkIGBuYW1lYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4obmFtZTogUykgLT4gVFN0cnVjdElkZW50aWZpZXIgeworICAgICAgICBUU3RydWN0SWRlbnRpZmllciB7IG5hbWU6IG5hbWUuaW50bygpIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgZmllbGQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRGaWVsZElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBUaHJpZnQgZmllbGQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBpZiBpdCdzIG5vdCBzZW50IG92ZXIgdGhlIHdpcmUuCisgICAgcHViIG5hbWU6IE9wdGlvbjxTdHJpbmc+LAorICAgIC8vLyBGaWVsZCB0eXBlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1heSBiZSBhIHByaW1pdGl2ZSwgY29udGFpbmVyLCBvciBhIHN0cnVjdC4KKyAgICBwdWIgZmllbGRfdHlwZTogVFR5cGUsCisgICAgLy8vIFRocmlmdCBmaWVsZCBpZC4KKyAgICAvLy8KKyAgICAvLy8gYE5vbmVgIG9ubHkgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGlkOiBPcHRpb248aTE2PiwKK30KKworaW1wbCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGaWVsZElkZW50aWZpZXJgIGZvciBhIGZpZWxkIG5hbWVkIGBuYW1lYCB3aXRoIHR5cGUKKyAgICAvLy8gYGZpZWxkX3R5cGVgIGFuZCBmaWVsZCBpZCBgaWRgLgorICAgIC8vLworICAgIC8vLyBgaWRgIHNob3VsZCBiZSBgTm9uZWAgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGZuIG5ldzxOLCBTLCBJPihuYW1lOiBOLCBmaWVsZF90eXBlOiBUVHlwZSwgaWQ6IEkpIC0+IFRGaWVsZElkZW50aWZpZXIKKyAgICB3aGVyZQorICAgICAgICBOOiBJbnRvPE9wdGlvbjxTPj4sCisgICAgICAgIFM6IEludG88U3RyaW5nPiwKKyAgICAgICAgSTogSW50bzxPcHRpb248aTE2Pj4sCisgICAgeworICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLm1hcCh8bnwgbi5pbnRvKCkpLAorICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGlkOiBpZC5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbGlzdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVExpc3RJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTGlzdElkZW50aWZpZXJgIGZvciBhIGxpc3Qgd2l0aCBgc2l6ZWAgZWxlbWVudHMgb2YgdHlwZQorICAgIC8vLyBgZWxlbWVudF90eXBlYC4KKyAgICBwdWIgZm4gbmV3KGVsZW1lbnRfdHlwZTogVFR5cGUsIHNpemU6IGkzMikgLT4gVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzZXQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTZXRJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgICBwdWIgZWxlbWVudF90eXBlOiBUVHlwZSwKKyAgICAvLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU2V0SWRlbnRpZmllcmAgZm9yIGEgc2V0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgVFNldElkZW50aWZpZXIgeworICAgICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1hcCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVE1hcElkZW50aWZpZXIgeworICAgIC8vLyBNYXAga2V5IHR5cGUuCisgICAgcHViIGtleV90eXBlOiBPcHRpb248VFR5cGU+LAorICAgIC8vLyBNYXAgdmFsdWUgdHlwZS4KKyAgICBwdWIgdmFsdWVfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hcC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRNYXBJZGVudGlmaWVyYCBmb3IgYSBtYXAgd2l0aCBgc2l6ZWAgZW50cmllcyBvZiB0eXBlCisgICAgLy8vIGBrZXlfdHlwZSAtPiB2YWx1ZV90eXBlYC4KKyAgICBwdWIgZm4gbmV3PEssIFY+KGtleV90eXBlOiBLLCB2YWx1ZV90eXBlOiBWLCBzaXplOiBpMzIpIC0+IFRNYXBJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgSzogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICAgICAgVjogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICB7CisgICAgICAgIFRNYXBJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGtleV90eXBlOiBrZXlfdHlwZS5pbnRvKCksCisgICAgICAgICAgICB2YWx1ZV90eXBlOiB2YWx1ZV90eXBlLmludG8oKSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWVzc2FnZSB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUTWVzc2FnZVR5cGUgeworICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVxdWVzdC4KKyAgICBDYWxsLAorICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVzcG9uc2UuCisgICAgUmVwbHksCisgICAgLy8vIFVuZXhwZWN0ZWQgZXJyb3IgaW4gdGhlIHJlbW90ZSBzZXJ2aWNlLgorICAgIEV4Y2VwdGlvbiwKKyAgICAvLy8gT25lLXdheSBzZXJ2aWNlLWNhbGwgcmVxdWVzdCAobm8gcmVzcG9uc2UgaXMgZXhwZWN0ZWQpLgorICAgIE9uZVdheSwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUTWVzc2FnZVR5cGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsID0+IHdyaXRlIShmLCAiQ2FsbCIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiB3cml0ZSEoZiwgIlJlcGx5IiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiA9PiB3cml0ZSEoZiwgIkV4Y2VwdGlvbiIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4gd3JpdGUhKGYsICJPbmVXYXkiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPFRNZXNzYWdlVHlwZT4gZm9yIHU4IHsKKyAgICBmbiBmcm9tKG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggbWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiAweDAxLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiAweDAyLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gMHgwMywKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IDB4MDQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTx1OD4gZm9yIFRNZXNzYWdlVHlwZSB7CisgICAgdHlwZSBFcnIgPSA6OkVycm9yOworICAgIGZuIHRyeV9mcm9tKGI6IHU4KSAtPiA6OlJlc3VsdDxTZWxmPiB7CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMHgwMSA9PiBPayhUTWVzc2FnZVR5cGU6OkNhbGwpLAorICAgICAgICAgICAgMHgwMiA9PiBPayhUTWVzc2FnZVR5cGU6OlJlcGx5KSwKKyAgICAgICAgICAgIDB4MDMgPT4gT2soVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24pLAorICAgICAgICAgICAgMHgwNCA9PiBPayhUTWVzc2FnZVR5cGU6Ok9uZVdheSksCisgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVE1lc3NhZ2VUeXBlIiwgdW5rbiksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc3RydWN0LWZpZWxkIHR5cGVzLgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRUeXBlIHsKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc2VyaWFsaXplZCBmaWVsZHMgaW4gdGhpcyBUaHJpZnQgc3RydWN0LgorICAgIFN0b3AsCisgICAgLy8vIFZvaWQgKGAoKWApIGZpZWxkLgorICAgIFZvaWQsCisgICAgLy8vIEJvb2xlYW4uCisgICAgQm9vbCwKKyAgICAvLy8gU2lnbmVkIDgtYml0IGludC4KKyAgICBJMDgsCisgICAgLy8vIERvdWJsZS1wcmVjaXNpb24gbnVtYmVyLgorICAgIERvdWJsZSwKKyAgICAvLy8gU2lnbmVkIDE2LWJpdCBpbnQuCisgICAgSTE2LAorICAgIC8vLyBTaWduZWQgMzItYml0IGludC4KKyAgICBJMzIsCisgICAgLy8vIFNpZ25lZCA2NC1iaXQgaW50LgorICAgIEk2NCwKKyAgICAvLy8gVVRGLTggc3RyaW5nLgorICAgIFN0cmluZywKKyAgICAvLy8gVVRGLTcgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjcsCisgICAgLy8vIFRocmlmdCBzdHJ1Y3QuCisgICAgU3RydWN0LAorICAgIC8vLyBNYXAuCisgICAgTWFwLAorICAgIC8vLyBTZXQuCisgICAgU2V0LAorICAgIC8vLyBMaXN0LgorICAgIExpc3QsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBVdGY4LAorICAgIC8vLyBVVEYtMTYgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjE2LAorfQorCitpbXBsIERpc3BsYXkgZm9yIFRUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IHdyaXRlIShmLCAiU1RPUCIpLAorICAgICAgICAgICAgVFR5cGU6OlZvaWQgPT4gd3JpdGUhKGYsICJ2b2lkIiksCisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB3cml0ZSEoZiwgImJvb2wiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gd3JpdGUhKGYsICJpMDgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gd3JpdGUhKGYsICJkb3VibGUiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMTYgPT4gd3JpdGUhKGYsICJpMTYiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gd3JpdGUhKGYsICJpMzIiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gd3JpdGUhKGYsICJpNjQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gd3JpdGUhKGYsICJzdHJpbmciKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGY3ID0+IHdyaXRlIShmLCAiVVRGNyIpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB3cml0ZSEoZiwgInN0cnVjdCIpLAorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB3cml0ZSEoZiwgIm1hcCIpLAorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB3cml0ZSEoZiwgInNldCIpLAorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4gd3JpdGUhKGYsICJsaXN0IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmOCA9PiB3cml0ZSEoZiwgIlVURjgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGYxNiA9PiB3cml0ZSEoZiwgIlVURjE2IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoZXhwZWN0ZWQ6IGkzMiwgYWN0dWFsOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIHNlcnZpY2UtY2FsbCBuYW1lIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQKKy8vLyBzZXJ2aWNlLWNhbGwgbmFtZSBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChleHBlY3RlZDogJnN0ciwgYWN0dWFsOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgdHlwZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkIG1lc3NhZ2UgdHlwZQorLy8vIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlKGV4cGVjdGVkOiBUTWVzc2FnZVR5cGUsIGFjdHVhbDogVE1lc3NhZ2VUeXBlKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENoZWNrIGlmIGEgcmVxdWlyZWQgVGhyaWZ0IHN0cnVjdCBmaWVsZCBleGlzdHMuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBpdCBkb2VzLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0czxUPihmaWVsZF9uYW1lOiAmc3RyLCBmaWVsZDogJk9wdGlvbjxUPikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBtYXRjaCAqZmllbGQgeworICAgICAgICBTb21lKF8pID0+IE9rKCgpKSwKKyAgICAgICAgTm9uZSA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJtaXNzaW5nIHJlcXVpcmVkIGZpZWxkIHt9IiwgZmllbGRfbmFtZSksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKy8vLyBFeHRyYWN0IHRoZSBmaWVsZCBpZCBmcm9tIGEgVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisvLy8KKy8vLyBgZmllbGRfaWRlbnRgIG11c3QgKm5vdCogaGF2ZSBgVEZpZWxkSWRlbnRpZmllci5maWVsZF90eXBlYCBvZiB0eXBlIGBUVHlwZTo6U3RvcGAuCisvLy8KKy8vLyBSZXR1cm4gYFRGaWVsZElkZW50aWZpZXIuaWRgIGlmIGFuIGlkIGV4aXN0cywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIGZpZWxkX2lkKGZpZWxkX2lkZW50OiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgZmllbGRfaWRlbnQuaWQub2tfb3JfZWxzZSh8fCB7CisgICAgICAgIDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyBmaWVsZCBpbiBpbiB7Oj99IiwgZmllbGRfaWRlbnQpLAorICAgICAgICB9KQorICAgIH0pCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9pbnB1dF9wcm90b2NvbF9mcm9tX2NvbmNyZXRlX2lucHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgcjogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9pbnB1dCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VElucHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocikpOworICAgICAgICB0YWtlc19pbnB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9vdXRwdXRfcHJvdG9jb2woKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodyk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9vdXRwdXQoKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUT3V0cHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpKTsKKyAgICAgICAgdGFrZXNfb3V0cHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICBmbiB0YWtlc19pbnB1dF9wcm90b2NvbDxSPih0OiAmbXV0IFIpCisgICAgd2hlcmUKKyAgICAgICAgUjogVElucHV0UHJvdG9jb2wsCisgICAgeworICAgICAgICB0LnJlYWRfYnl0ZSgpLnVud3JhcCgpOworICAgIH0KKworICAgIGZuIHRha2VzX291dHB1dF9wcm90b2NvbDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVE91dHB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWU0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorICAgIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKKworLy8vIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgcHJlZml4ZXMgdGhlIHNlcnZpY2UgbmFtZSB0byBhbGwgb3V0Z29pbmcgVGhyaWZ0CisvLy8gbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAgc2hvdWxkIGJlIHVzZWQgd2hlbiBtdWx0aXBsZSBUaHJpZnQgc2VydmljZXMKKy8vLyBzZW5kIG1lc3NhZ2VzIG92ZXIgYSBzaW5nbGUgSS9PIGNoYW5uZWwuIEJ5IHByZWZpeGluZyBzZXJ2aWNlIGlkZW50aWZpZXJzCisvLy8gdG8gb3V0Z29pbmcgbWVzc2FnZXMgcmVjZWl2ZXJzIGFyZSBhYmxlIHRvIGRlbXV4IHRoZW0gYW5kIHJvdXRlIHRoZW0gdG8gdGhlCisvLy8gYXBwcm9wcmlhdGUgc2VydmljZSBwcm9jZXNzb3IuIFJ1c3QgcmVjZWl2ZXJzIG11c3QgdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAKKy8vLyB0byBwcm9jZXNzIGluY29taW5nIG1lc3NhZ2VzLCB3aGlsZSBvdGhlciBsYW5ndWFnZXMgbXVzdCB1c2UgdGhlaXIKKy8vLyBjb3JyZXNwb25kaW5nIG11bHRpcGxleGVkIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBzZXJ2aWNlIGBUZXN0U2VydmljZWAgYW5kIGEgc2VydmljZSBjYWxsIGB0ZXN0X2NhbGxgLAorLy8vIHRoaXMgaW1wbGVtZW50YXRpb24gd291bGQgaWRlbnRpZnkgbWVzc2FnZXMgYXMgb3JpZ2luYXRpbmcgZnJvbQorLy8vIGBUZXN0U2VydmljZTp0ZXN0X2NhbGxgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoInNlcnZpY2VfbmFtZSIsIHByb3RvY29sKTsKKy8vLworLy8vIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzdmNfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8gcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgc2VydmljZV9uYW1lOiBTdHJpbmcsCisgICAgaW5uZXI6IFAsCit9CisKK2ltcGw8UD4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIC8vLyBDcmVhdGUgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHRoYXQgaWRlbnRpZmllcyBvdXRnb2luZyBtZXNzYWdlcworICAgIC8vLyBhcyBvcmlnaW5hdGluZyBmcm9tIGEgc2VydmljZSBuYW1lZCBgc2VydmljZV9uYW1lYCBhbmQgc2VuZHMgdGhlbSBvdmVyCisgICAgLy8vIHRoZSBgd3JhcHBlZGAgYFRPdXRwdXRQcm90b2NvbGAuIE91dGdvaW5nIG1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFuZCBzZW50CisgICAgLy8vIGJ5IGB3cmFwcGVkYCwgbm90IGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgcHViIGZuIG5ldyhzZXJ2aWNlX25hbWU6ICZzdHIsIHdyYXBwZWQ6IFApIC0+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+IHsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc2VydmljZV9uYW1lOiBzZXJ2aWNlX25hbWUudG9fb3duZWQoKSwKKyAgICAgICAgICAgIGlubmVyOiB3cmFwcGVkLAorICAgICAgICB9CisgICAgfQorfQorCisvLyBGSVhNRTogYXZvaWQgcGFzc3Rocm91Z2ggbWV0aG9kcworaW1wbDxQPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggaWRlbnRpZmllci5tZXNzYWdlX3R5cGUgeworICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBvdmVycmlkZSBpZGVudGlmaWVyIGhlcmU/CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgfCBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBmb3JtYXQhKCJ7fTp7fSIsIHNlbGYuc2VydmljZV9uYW1lLCBpZGVudGlmaWVyLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAuLippZGVudGlmaWVyCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50aWZpZXIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMzIoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RyaW5nKHMpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIuZmx1c2goKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2J5dGUoYikKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1RCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl93aXRoX3ByZWZpeGVkX3NlcnZpY2VfbmFtZSgpIHsKKyAgICAgICAgbGV0IG11dCBvX3Byb3QgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiYmFyIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxOV0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsIC8qIG1lc3NhZ2UgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNywKKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiwgLyogImZvbyIgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qICI6IiAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyLCAvKiAiYmFyIiAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiAvKiBzZXF1ZW5jZSBudW1iZXIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QuaW5uZXIudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4+CisgICAgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisgICAgICAgIGxldCAoXywgd19jaGFuKSA9IGMuc3BsaXQoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHByb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2NoYW4sIHRydWUpOworICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJmb28iLCBwcm90KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NTk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCkBAIC0wLDAgKzEsMTk2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKK3VzZSBQcm90b2NvbEVycm9yS2luZDsKKworLy8vIGBUSW5wdXRQcm90b2NvbGAgcmVxdWlyZWQgdG8gdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHJlYWRzIGluY29taW5nIG1lc3NhZ2UgaWRlbnRpZmllcnMgdG8gZGV0ZXJtaW5lIHRvCisvLy8gd2hpY2ggYFRQcm9jZXNzb3JgIHJlcXVlc3RzIHNob3VsZCBiZSBmb3J3YXJkZWQuIEhvd2V2ZXIsIG9uY2UgcmVhZCwgdGhvc2UKKy8vLyBtZXNzYWdlIGlkZW50aWZpZXIgYnl0ZXMgYXJlIG5vIGxvbmdlciBvbiB0aGUgd2lyZS4gU2luY2UgZG93bnN0cmVhbQorLy8vIHByb2Nlc3NvcnMgZXhwZWN0IHRvIHJlYWQgbWVzc2FnZSBpZGVudGlmaWVycyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorLy8vIHdlIG5lZWQgc29tZSB3YXkgb2Ygc3VwcGx5aW5nIGEgYFRNZXNzYWdlSWRlbnRpZmllcmAgd2l0aCB0aGUgc2VydmljZS1uYW1lCisvLy8gc3RyaXBwZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSByZWNlaXZlZCBgVE1lc3NhZ2VJZGVudGlmaWVyYAorLy8vICh3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUpIGFuZCBwYXNzZXMgaXQgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYAorLy8vIHdoZW4gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgaXMgY2FsbGVkLiBJdCBkZWxlZ2F0ZXMgYWxsCisvLy8gb3RoZXIgY2FsbHMgZGlyZWN0bHkgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIFRoaXMgdHlwZSAqKnNob3VsZCBub3QqKiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyAvLyBzYW1wbGUgcHJvY2Vzc29yCisvLy8gc3RydWN0IEFjdHVhbFByb2Nlc3NvcjsKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIEFjdHVhbFByb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoCisvLy8gICAgICAgICAmc2VsZiwKKy8vLyAgICAgICAgIF86ICZtdXQgVElucHV0UHJvdG9jb2wsCisvLy8gICAgICAgICBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbAorLy8vICAgICApIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpCisvLy8gICAgIH0KKy8vLyB9CisvLy8gbGV0IHByb2Nlc3NvciA9IEFjdHVhbFByb2Nlc3NvciB7fTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHRyYW5zcG9ydAorLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGNoYW5uZWwuc3BsaXQoKS51bndyYXAoKTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCisvLy8gbGV0IG11dCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfY2hhbiwgdHJ1ZSk7CisvLy8gbGV0IG11dCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX2NoYW4sIHRydWUpOworLy8vCisvLy8gLy8gbWVzc2FnZSBpZGVudGlmaWVyIHJlY2VpdmVkIGZyb20gcmVtb3RlIGFuZCBtb2RpZmllZCB0byByZW1vdmUgdGhlIHNlcnZpY2UgbmFtZQorLy8vIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHByb3h5IGlucHV0IHByb3RvY29sCisvLy8gbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KCZtdXQgaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKy8vLyBsZXQgcmVzID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsICZtdXQgb19wcm90KTsKKy8vLyBgYGAKKy8vIEZJWE1FOiBpbXBsZW1lbnQgRGVidWcKK3B1YiBzdHJ1Y3QgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBpbm5lcjogJidhIG11dCBUSW5wdXRQcm90b2NvbCwKKyAgICBtZXNzYWdlX2lkZW50OiBPcHRpb248VE1lc3NhZ2VJZGVudGlmaWVyPiwKK30KKworaW1wbDwnYT4gVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTdG9yZWRJbnB1dFByb3RvY29sYCB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgb3RoZXIgdGhhbgorICAgIC8vLyBgVElucHV0UHJvdG9jb2w6OnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYCB0byBhIGB3cmFwcGVkYAorICAgIC8vLyBgVElucHV0UHJvdG9jb2xgLiBgbWVzc2FnZV9pZGVudGAgaXMgdGhlIG1vZGlmaWVkIG1lc3NhZ2UgaWRlbnRpZmllciAtCisgICAgLy8vIHdpdGggc2VydmljZSBuYW1lIHN0cmlwcGVkIC0gdGhhdCB3aWxsIGJlIHBhc3NlZCB0bworICAgIC8vLyBgd3JhcHBlZC5yZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAuCisgICAgcHViIGZuIG5ldygKKyAgICAgICAgd3JhcHBlZDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgbWVzc2FnZV9pZGVudDogVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICkgLT4gVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICBUU3RvcmVkSW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IG1lc3NhZ2VfaWRlbnQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPCdhPiBUSW5wdXRQcm90b2NvbCBmb3IgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5tZXNzYWdlX2lkZW50LnRha2UoKS5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgICAgIDo6ZXJyb3JzOjpuZXdfcHJvdG9jb2xfZXJyb3IoCisgICAgICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UgaWRlbnRpZmllciBhbHJlYWR5IHJlYWQiLAorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2ZpZWxkX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlcygpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYm9vbCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kzMigpCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cmluZygpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfZW5kKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycwpAQCAtMCwwICsxLDEyNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBpbXBsZW1lbnQgYSBUaHJpZnQgc2VydmVyLgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07Cit1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworbW9kIG11bHRpcGxleGVkOworbW9kIHRocmVhZGVkOworCitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CitwdWIgdXNlIHNlbGY6OnRocmVhZGVkOjpUU2VydmVyOworCisvLy8gSGFuZGxlcyBpbmNvbWluZyBUaHJpZnQgbWVzc2FnZXMgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgdXNlci1kZWZpbmVkCisvLy8gaGFuZGxlciBmdW5jdGlvbnMuCisvLy8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBmb3IgZWFjaCBUaHJpZnQgc2VydmljZS4gV2hlbiB1c2VkIGJ5IGEKKy8vLyBzZXJ2ZXIgKGZvciBleGFtcGxlLCBhIGBUU2ltcGxlU2VydmVyYCksIGl0IHdpbGwgZGVtdXggaW5jb21pbmcgc2VydmljZQorLy8vIGNhbGxzIGFuZCBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24uCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHN0YXJ0IGEgc2VydmVyIHVzaW5nIHRoZSBhdXRvLWdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgZm9yCisvLy8gYSBUaHJpZnQgc2VydmljZSBgU2ltcGxlU2VydmljZWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGF0IHRoaXMgcG9pbnQgeW91IGNhbiBwYXNzIHRoZSBwcm9jZXNzb3IgdG8gdGhlIHNlcnZlcgorLy8vIC8vIGxldCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoLi4uLCBwcm9jZXNzb3IpOworLy8vIGBgYAorcHViIHRyYWl0IFRQcm9jZXNzb3IgeworICAgIC8vLyBQcm9jZXNzIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgICAvLy8KKyAgICAvLy8gUmVhZHMgYXJndW1lbnRzIGZyb20gYGlgLCBleGVjdXRlcyB0aGUgdXNlcidzIGhhbmRsZXIgY29kZSwgYW5kIHdyaXRlcworICAgIC8vLyB0aGUgcmVzcG9uc2UgdG8gYG9gLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIGAoKWAgaWYgdGhlIGhhbmRsZXIgd2FzIGV4ZWN1dGVkOyBgRXJyYCBvdGhlcndpc2UuCisgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPjsKK30KKworLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgaW4gZ2VuZXJhdGVkIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbnMgdG8KKy8vLyByZXR1cm4gYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGlmIHRocmlmdCBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkLgorcHViIGZuIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgKKyAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgcmVzOiA6OlJlc3VsdDwoKT4sCisgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKykgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBsZXQgRXJyKGUpID0gcmVzIHsKKyAgICAgICAgbGV0IGUgPSBtYXRjaCBlIHsKKyAgICAgICAgICAgIDo6RXJyb3I6OkFwcGxpY2F0aW9uKGEpID0+IGEsCisgICAgICAgICAgICBfID0+IEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwgZm9ybWF0ISgiezo/fSIsIGUpKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIG1zZ19pZGVudC5uYW1lLmNsb25lKCksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICk7CisKKyAgICAgICAgb19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KT87CisgICAgICAgIDo6RXJyb3I6OndyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgmZSwgb19wcm90KT87CisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsKKyAgICAgICAgb19wcm90LmZsdXNoKCkKKyAgICB9IGVsc2UgeworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzM3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDM1MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEZWJ1ZywgRm9ybWF0dGVyfTsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUU3RvcmVkSW5wdXRQcm90b2NvbH07CisKK3VzZSBzdXBlcjo6e2hhbmRsZV9wcm9jZXNzX3Jlc3VsdCwgVFByb2Nlc3Nvcn07CisKK2NvbnN0IE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxUOiAmJ3N0YXRpYyBzdHIgPQorICAgICJtaXNzaW5nIHNlcnZpY2Ugc2VwYXJhdG9yIGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBzZXQiOwordHlwZSBUaHJlYWRTYWZlUHJvY2Vzc29yID0gQm94PFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYz47CisKKy8vLyBBIGBUUHJvY2Vzc29yYCB0aGF0IGNhbiBkZW11eCBzZXJ2aWNlIGNhbGxzIHRvIG11bHRpcGxlIHVuZGVybHlpbmcKKy8vLyBUaHJpZnQgc2VydmljZXMuCisvLy8KKy8vLyBVc2VycyByZWdpc3RlciBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYCBpbnN0YW5jZXMgd2l0aCBhCisvLy8gYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAsIGFuZCB0aGVuIHJlZ2lzdGVyIHRoYXQgcHJvY2Vzc29yIHdpdGggYSBzZXJ2ZXIKKy8vLyBpbXBsZW1lbnRhdGlvbi4gRm9sbG93aW5nIHRoYXQsIGFsbCBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzIGFyZSBhdXRvbWF0aWNhbGx5CisvLy8gcm91dGVkIHRvIHRoZSBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYC4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgY2FuIG9ubHkgaGFuZGxlIG1lc3NhZ2VzIHNlbnQgYnkgYQorLy8vIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBzdG9yZWQ6IE11dGV4PFN0b3JlZFByb2Nlc3NvcnM+LAorfQorCisjW2Rlcml2ZShEZWZhdWx0KV0KK3N0cnVjdCBTdG9yZWRQcm9jZXNzb3JzIHsKKyAgICBwcm9jZXNzb3JzOiBIYXNoTWFwPFN0cmluZywgQXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiwKKyAgICBkZWZhdWx0X3Byb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCit9CisKK2ltcGwgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHdpdGggbm8gcmVnaXN0ZXJlZCBzZXJ2aWNlLXNwZWNpZmljCisgICAgLy8vIHByb2Nlc3NvcnMuCisgICAgcHViIGZuIG5ldygpIC0+IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgICAgICBzdG9yZWQ6IE11dGV4OjpuZXcoU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yczogSGFzaE1hcDo6bmV3KCksCisgICAgICAgICAgICAgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE5vbmUsCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZWdpc3RlciBhIHNlcnZpY2Utc3BlY2lmaWMgYHByb2Nlc3NvcmAgZm9yIHRoZSBzZXJ2aWNlIG5hbWVkCisgICAgLy8vIGBzZXJ2aWNlX25hbWVgLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFsc28gYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aAorICAgIC8vLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50cy4gU2V0IGBhc19kZWZhdWx0YCB0byBgdHJ1ZWAgdG8gYWxsb3cKKyAgICAvLy8gbm9uLW5hbWVzcGFjZWQgcmVxdWVzdHMgdG8gYmUgZGlzcGF0Y2hlZCB0byBhIGRlZmF1bHQgcHJvY2Vzc29yLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgYSBuZXcgZW50cnkgd2FzIGluc2VydGVkLiBSZXR1cm5zIGFuIGVycm9yIGlmOgorICAgIC8vLyAqIEEgcHJvY2Vzc29yIGV4aXN0cyBmb3IgYHNlcnZpY2VfbmFtZWAKKyAgICAvLy8gKiBZb3UgYXR0ZW1wdCB0byByZWdpc3RlciBhIHByb2Nlc3NvciBhcyBkZWZhdWx0LCBhbmQgYW4gZXhpc3RpbmcgZGVmYXVsdCBleGlzdHMKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobWFwX2VudHJ5KSldCisgICAgcHViIGZuIHJlZ2lzdGVyPFM6IEludG88U3RyaW5nPj4oCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgc2VydmljZV9uYW1lOiBTLAorICAgICAgICBwcm9jZXNzb3I6IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+LAorICAgICAgICBhc19kZWZhdWx0OiBib29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG11dCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG5hbWUgPSBzZXJ2aWNlX25hbWUuaW50bygpOworICAgICAgICBpZiAhc3RvcmVkLnByb2Nlc3NvcnMuY29udGFpbnNfa2V5KCZuYW1lKSB7CisgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gQXJjOjpuZXcocHJvY2Vzc29yKTsKKworICAgICAgICAgICAgaWYgYXNfZGVmYXVsdCB7CisgICAgICAgICAgICAgICAgaWYgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX25vbmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3NvciA9IFNvbWUocHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFcnIoImNhbm5vdCByZXNldCBkZWZhdWx0IHByb2Nlc3NvciIuaW50bygpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuaW5zZXJ0KG5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoZm9ybWF0ISgiY2Fubm90IG92ZXJ3cml0ZSBleGlzdGluZyBwcm9jZXNzb3IgZm9yIHNlcnZpY2Uge30iLCBuYW1lKS5pbnRvKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBwcm9jZXNzX21lc3NhZ2UoCisgICAgICAgICZzZWxmLAorICAgICAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCAoc3ZjX25hbWUsIHN2Y19jYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJm1zZ19pZGVudC5uYW1lKTsKKyAgICAgICAgZGVidWchKCJyb3V0aW5nIHN2Y19uYW1lIHs6P30gc3ZjX2NhbGwge30iLCAmc3ZjX25hbWUsICZzdmNfY2FsbCk7CisKKyAgICAgICAgbGV0IHByb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4gPSB7CisgICAgICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzdmNfbmFtZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuZ2V0KG5hbWUpLmNsb25lZCgpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5jbG9uZSgpCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbWF0Y2ggcHJvY2Vzc29yIHsKKyAgICAgICAgICAgIFNvbWUoYXJjKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld19tc2dfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgc3ZjX2NhbGwsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHByb3h5X2lfcHJvdCA9IFRTdG9yZWRJbnB1dFByb3RvY29sOjpuZXcoaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKyAgICAgICAgICAgICAgICAoKmFyYykucHJvY2VzcygmbXV0IHByb3h5X2lfcHJvdCwgb19wcm90KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiBFcnIobWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZSkuaW50bygpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUUHJvY2Vzc29yIGZvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIGZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1zZ19pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87CisKKyAgICAgICAgZGVidWchKCJwcm9jZXNzIGluY29taW5nIG1zZyBpZDp7Oj99IiwgJm1zZ19pZGVudCk7CisgICAgICAgIGxldCByZXMgPSBzZWxmLnByb2Nlc3NfbWVzc2FnZSgmbXNnX2lkZW50LCBpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAgICAgaGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtc2dfaWRlbnQsIHJlcywgb19wcm90KQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIGxldCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHdyaXRlISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVE11bHRpcGxleGVkUHJvY2VzcyB7eyByZWdpc3RlcmVkX2NvdW50OiB7Oj99IGRlZmF1bHQ6IHs6P30gfX0iLAorICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMua2V5cygpLmxlbigpLAorICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX3NvbWUoKQorICAgICAgICApCisgICAgfQorfQorCitmbiBzcGxpdF9pZGVudF9uYW1lKGlkZW50X25hbWU6ICZzdHIpIC0+IChPcHRpb248JnN0cj4sICZzdHIpIHsKKyAgICBpZGVudF9uYW1lCisgICAgICAgIC5maW5kKCc6JykKKyAgICAgICAgLm1hcCh8cG9zfCB7CisgICAgICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBpZGVudF9uYW1lLnNwbGl0X2F0KHBvcyk7CisgICAgICAgICAgICBsZXQgKF8sIHN2Y19jYWxsKSA9IHN2Y19jYWxsLnNwbGl0X2F0KDEpOyAvLyByZW1vdmUgY29sb24gZnJvbSBzZXJ2aWNlIGNhbGwgbmFtZQorICAgICAgICAgICAgKFNvbWUoc3ZjX25hbWUpLCBzdmNfY2FsbCkKKyAgICAgICAgfSkKKyAgICAgICAgLm9yX2Vsc2UofHwgU29tZSgoTm9uZSwgaWRlbnRfbmFtZSkpKQorICAgICAgICAudW53cmFwKCkKK30KKworZm4gbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZTogT3B0aW9uPCZzdHI+KSAtPiBTdHJpbmcgeworICAgIG1hdGNoIHN2Y19uYW1lIHsKKyAgICAgICAgU29tZShuYW1lKSA9PiBmb3JtYXQhKCJubyBwcm9jZXNzb3IgZm91bmQgZm9yIHNlcnZpY2Uge30iLCBuYW1lKSwKKyAgICAgICAgTm9uZSA9PiBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVC50b19vd25lZCgpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisgICAgdXNlIHN0ZDo6c3luYzo6YXRvbWljOjp7QXRvbWljQm9vbCwgT3JkZXJpbmd9OworICAgIHVzZSBzdGQ6OnN5bmM6OkFyYzsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworICAgIHVzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9zcGxpdF9uYW1lX2ludG9fcHJvcGVyX3NlcGFyYXRvcl9hbmRfc2VydmljZV9jYWxsKCkgeworICAgICAgICBsZXQgaWRlbnRfbmFtZSA9ICJmb286YmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgU29tZSgiZm9vIikpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcmV0dXJuX2Z1bGxfaWRlbnRfaWZfbm9fc2VwYXJhdG9yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiYmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgTm9uZSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FsbCwgImJhcl9jYWxsIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF93cml0ZV9lcnJvcl9pZl9ub19zZXBhcmF0b3JfZm91bmRfYW5kX25vX2RlZmF1bHRfcHJvY2Vzc29yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxULAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfc2VwYXJhdG9yX2V4aXN0c19hbmRfbm9fcHJvY2Vzc29yX2ZvdW5kKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygibWlzc2luZzpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOyAvLyBhdCB0aGlzIHBvaW50IGFuIGVycm9yIHNob3VsZCBiZSB3cml0dGVuIG91dAorCisgICAgICAgIGkudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygmby50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gaS5yZWFkX21lc3NhZ2VfYmVnaW4oKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9pZGVudCwgZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBsZXQgcmN2ZF9lcnIgPSA6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woJm11dCBpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2VyciA9IEFwcGxpY2F0aW9uRXJyb3I6Om5ldygKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShTb21lKCJtaXNzaW5nIikpLAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbZGVyaXZlKERlZmF1bHQpXQorICAgIHN0cnVjdCBTZXJ2aWNlIHsKKyAgICAgICAgcHViIGludm9rZWQ6IEFyYzxBdG9taWNCb29sPiwKKyAgICB9CisKKyAgICBpbXBsIFRQcm9jZXNzb3IgZm9yIFNlcnZpY2UgeworICAgICAgICBmbiBwcm9jZXNzKCZzZWxmLCBfOiAmbXV0IFRJbnB1dFByb3RvY29sLCBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgICAgIGxldCByZXMgPSBzZWxmCisgICAgICAgICAgICAgICAgLmludm9rZWQKKyAgICAgICAgICAgICAgICAuY29tcGFyZV9hbmRfc3dhcChmYWxzZSwgdHJ1ZSwgT3JkZXJpbmc6OlJlbGF4ZWQpOworICAgICAgICAgICAgaWYgcmVzIHsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRXJyKCJmYWlsZWQgc3dhcCIuaW50bygpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yb3V0ZV9jYWxsX3RvX2NvcnJlY3RfcHJvY2Vzc29yKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgZmFsc2UpLnVud3JhcCgpOworCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbAorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlXzE6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAxIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMgorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgZmFsc2UpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3Nvcl9pZl9ub19zZXBhcmF0b3JfZXhpc3RzX2FuZF9kZWZhdWx0X3Byb2Nlc3Nvcl9zZXQoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgc2VydmljZXMKKyAgICAgICAgbGV0IHN2Y18xID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8xID0gc3ZjXzEuaW52b2tlZC5jbG9uZSgpOworICAgICAgICBsZXQgc3ZjXzIgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzIgPSBzdmNfMi5pbnZva2VkLmNsb25lKCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlbQorICAgICAgICBsZXQgbXV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzEiLCBCb3g6Om5ldyhzdmNfMSksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8yIiwgQm94OjpuZXcoc3ZjXzIpLCB0cnVlKS51bndyYXAoKTsgLy8gc2Vjb25kIHByb2Nlc3NvciBpcyBkZWZhdWx0CisKKyAgICAgICAgLy8gbWFrZSB0aGUgc2VydmljZSBjYWxsIChpdCdzIGFuIG9sZCBjbGllbnQsIHNvIHdlIGhhdmUgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUpCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm9sZF9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsKKworICAgICAgICAvLyBzZXJ2aWNlIDIgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLCBub3Qgc2VydmljZSAxCisgICAgICAgIGFzc2VydF9lcSEoYXRtXzEubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgfQorCisgICAgZm4gYnVpbGRfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEyOCwgMTI4KTsKKyAgICAgICAgbGV0IChyX2MsIHdfYykgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgICgKKyAgICAgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9jLCB0cnVlKSwKKyAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfYywgdHJ1ZSksCisgICAgICAgICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpAQCAtMCwwICsxLDIzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpuZXQ6OntUY3BMaXN0ZW5lciwgVGNwU3RyZWFtfTsKK3VzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSB0aHJlYWRwb29sOjpUaHJlYWRQb29sOworCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OwordXNlIHRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK3VzZSBzdXBlcjo6VFByb2Nlc3NvcjsKKworLy8vIEZpeGVkLXNpemUgdGhyZWFkLXBvb2wgYmxvY2tpbmcgVGhyaWZ0IHNlcnZlci4KKy8vLworLy8vIEEgYFRTZXJ2ZXJgIGxpc3RlbnMgb24gYSBnaXZlbiBhZGRyZXNzIGFuZCBzdWJtaXRzIGFjY2VwdGVkIGNvbm5lY3Rpb25zCisvLy8gdG8gYW4gKip1bmJvdW5kZWQqKiBxdWV1ZS4gQ29ubmVjdGlvbnMgZnJvbSB0aGlzIHF1ZXVlIGFyZSBzZXJ2aWNlZCBieQorLy8vIHRoZSBmaXJzdCBhdmFpbGFibGUgd29ya2VyIHRocmVhZCBmcm9tIGEgKipmaXhlZC1zaXplKiogdGhyZWFkIHBvb2wuIEVhY2gKKy8vLyBhY2NlcHRlZCBjb25uZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhhdCB3b3JrZXIgdGhyZWFkLCBhbmQgY29tbXVuaWNhdGlvbgorLy8vIG92ZXIgdGhpcyB0aHJlYWQgb2NjdXJzIHNlcXVlbnRpYWxseSBhbmQgc3luY2hyb25vdXNseSAoaS5lLiBjYWxscyBibG9jaykuCisvLy8gQWNjZXB0ZWQgY29ubmVjdGlvbnMgaGF2ZSBhbiBpbnB1dCBoYWxmIGFuZCBhbiBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorLy8vIHVzZXMgYSBgVFRyYW5zcG9ydGAgYW5kIGBUSW5wdXRQcm90b2NvbGAvYFRPdXRwdXRQcm90b2NvbGAgdG8gdHJhbnNsYXRlCisvLy8gbWVzc2FnZXMgdG8gYW5kIGZyb20gYnllcy4gQW55IGNvbWJpbmF0aW9uIG9mIGBUSW5wdXRQcm90b2NvbGAsIGBUT3V0cHV0UHJvdG9jb2xgCisvLy8gYW5kIGBUVHJhbnNwb3J0YCBtYXkgYmUgdXNlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0aW5nIGFuZCBydW5uaW5nIGEgYFRTZXJ2ZXJgIHVzaW5nIFRocmlmdC1jb21waWxlci1nZW5lcmF0ZWQKKy8vLyBzZXJ2aWNlIGNvZGUuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjp7VFByb2Nlc3NvciwgVFNlcnZlcn07CisvLy8KKy8vLyAvLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkCisvLy8gLy8KKy8vLworLy8vIC8vIHByb2Nlc3NvciBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBuZXc8SDogU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyPihwcm9jZXNzb3I6IEgpIC0+IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb24gZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBzZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgU2ltcGxlU2VydmljZQorLy8vIHRyYWl0IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+OworLy8vIH0KKy8vLworLy8vIC8vCisvLy8gLy8gdXNlci1jb2RlIGZvbGxvd3MKKy8vLyAvLworLy8vCisvLy8gLy8gZGVmaW5lIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGBzZXJ2aWNlX2NhbGxgIGlzIHJlY2VpdmVkCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbDsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKKy8vLyBsZXQgcHJvY2Vzc29yID0gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwge30pOworLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHNlcnZlcgorLy8vIGxldCBpX3RyX2ZhY3Q6IEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgaV9wcl9mYWN0OiBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3RyX2ZhY3Q6IEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3ByX2ZhY3Q6IEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLworLy8vIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorLy8vICAgICBpX3RyX2ZhY3QsCisvLy8gICAgIGlfcHJfZmFjdCwKKy8vLyAgICAgb190cl9mYWN0LAorLy8vICAgICBvX3ByX2ZhY3QsCisvLy8gICAgIHByb2Nlc3NvciwKKy8vLyAgICAgMTAKKy8vLyApOworLy8vCisvLy8gLy8gc3RhcnQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworLy8vIG1hdGNoIHNlcnZlci5saXN0ZW4oIjEyNy4wLjAuMTo4MDgwIikgeworLy8vICAgT2soXykgID0+IHByaW50bG4hKCJsaXN0ZW4gY29tcGxldGVkIiksCisvLy8gICBFcnIoZSkgPT4gcHJpbnRsbiEoImxpc3RlbiBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSksCisvLy8gfQorLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPgord2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgcl90cmFuc19mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b19mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc19mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b19mYWN0b3J5OiBPUEYsCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICB3b3JrZXJfcG9vbDogVGhyZWFkUG9vbCwKK30KKworaW1wbDxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIC8vLyBDcmVhdGUgYSBgVFNlcnZlcmAuCisgICAgLy8vCisgICAgLy8vIEVhY2ggYWNjZXB0ZWQgY29ubmVjdGlvbiBoYXMgYW4gaW5wdXQgYW5kIG91dHB1dCBoYWxmLCBlYWNoIG9mIHdoaWNoCisgICAgLy8vIHJlcXVpcmVzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVFByb3RvY29sYC4gYFRTZXJ2ZXJgIHVzZXMKKyAgICAvLy8gYHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnlgIGFuZCBgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlCisgICAgLy8vIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGlucHV0LCBhbmQgYHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQKKyAgICAvLy8gYG91dHB1dF9wcm90b2NvbF9mYWN0b3J5YCB0byBjcmVhdGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgb3V0cHV0LgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHJlYWRfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICAgICAgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgICAgICB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgICAgICBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorICAgICAgICBwcm9jZXNzb3I6IFBSQywKKyAgICAgICAgbnVtX3dvcmtlcnM6IHVzaXplLAorICAgICkgLT4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4geworICAgICAgICBUU2VydmVyIHsKKyAgICAgICAgICAgIHJfdHJhbnNfZmFjdG9yeTogcmVhZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9fZmFjdG9yeTogaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNfZmFjdG9yeTogd3JpdGVfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvX2ZhY3Rvcnk6IG91dHB1dF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgcHJvY2Vzc29yOiBBcmM6Om5ldyhwcm9jZXNzb3IpLAorICAgICAgICAgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2w6OndpdGhfbmFtZSgiVGhyaWZ0IHNlcnZpY2UgcHJvY2Vzc29yIi50b19vd25lZCgpLCBudW1fd29ya2VycyksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gTGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBvbiBgbGlzdGVuX2FkZHJlc3NgLgorICAgIC8vLworICAgIC8vLyBgbGlzdGVuX2FkZHJlc3NgIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBgaG9zdDpwb3J0YCwKKyAgICAvLy8gZm9yIGV4YW1wbGU6IGAxMjcuMC4wLjE6ODA4MGAuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgKClgIGlmIHN1Y2Nlc3NmdWwuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgRXJyYCB3aGVuIHRoZSBzZXJ2ZXIgY2Fubm90IGJpbmQgdG8gYGxpc3Rlbl9hZGRyZXNzYCBvciB0aGVyZQorICAgIC8vLyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgIHB1YiBmbiBsaXN0ZW4oJm11dCBzZWxmLCBsaXN0ZW5fYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGxpc3RlbmVyID0gVGNwTGlzdGVuZXI6OmJpbmQobGlzdGVuX2FkZHJlc3MpPzsKKyAgICAgICAgZm9yIHN0cmVhbSBpbiBsaXN0ZW5lci5pbmNvbWluZygpIHsKKyAgICAgICAgICAgIG1hdGNoIHN0cmVhbSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IHNlbGYubmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbihzKT87CisgICAgICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzb3IgPSBzZWxmLnByb2Nlc3Nvci5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBzZWxmLndvcmtlcl9wb29sCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZShtb3ZlIHx8IGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uKHByb2Nlc3NvciwgaV9wcm90LCBvX3Byb3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgd2FybiEoImZhaWxlZCB0byBhY2NlcHQgcmVtb3RlIGNvbm5lY3Rpb24gd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiAiYWJvcnRlZCBsaXN0ZW4gbG9vcCIuaW50bygpLAorICAgICAgICB9KSkKKyAgICB9CisKKyAgICBmbiBuZXdfcHJvdG9jb2xzX2Zvcl9jb25uZWN0aW9uKAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHN0cmVhbTogVGNwU3RyZWFtLAorICAgICkgLT4gOjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+LCBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4pPiB7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgc2hhcmVkIHRjcCBzdHJlYW0KKyAgICAgICAgbGV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKworICAgICAgICAvLyBzcGxpdCBpdCBpbnRvIHR3byAtIG9uZSB0byBiZSBvd25lZCBieSB0aGUKKyAgICAgICAgLy8gaW5wdXQgdHJhbi9wcm90byBhbmQgdGhlIG90aGVyIGJ5IHRoZSBvdXRwdXQKKyAgICAgICAgbGV0IChyX2NoYW4sIHdfY2hhbikgPSBjaGFubmVsLnNwbGl0KCk/OworCisgICAgICAgIC8vIGlucHV0IHByb3RvY29sIGFuZCB0cmFuc3BvcnQKKyAgICAgICAgbGV0IHJfdHJhbiA9IHNlbGYucl90cmFuc19mYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhyX2NoYW4pKTsKKyAgICAgICAgbGV0IGlfcHJvdCA9IHNlbGYuaV9wcm90b19mYWN0b3J5LmNyZWF0ZShyX3RyYW4pOworCisgICAgICAgIC8vIG91dHB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCB3X3RyYW4gPSBzZWxmLndfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcod19jaGFuKSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBzZWxmLm9fcHJvdG9fZmFjdG9yeS5jcmVhdGUod190cmFuKTsKKworICAgICAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorICAgIH0KK30KKworZm4gaGFuZGxlX2luY29taW5nX2Nvbm5lY3Rpb248UFJDPigKKyAgICBwcm9jZXNzb3I6IEFyYzxQUkM+LAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSB3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciwKK3sKKyAgICBsZXQgbXV0IGlfcHJvdCA9IGlfcHJvdDsKKyAgICBsZXQgbXV0IG9fcHJvdCA9IG9fcHJvdDsKKyAgICBsb29wIHsKKyAgICAgICAgbGV0IHIgPSBwcm9jZXNzb3IucHJvY2VzcygmbXV0ICppX3Byb3QsICZtdXQgKm9fcHJvdCk7CisgICAgICAgIGlmIGxldCBFcnIoZSkgPSByIHsKKyAgICAgICAgICAgIHdhcm4hKCJwcm9jZXNzb3IgY29tcGxldGVkIHdpdGggZXJyb3I6IHs6P30iLCBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NmZWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKQEAgLTAsMCArMSw0ODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKwordXNlIHN1cGVyOjp7VFJlYWRUcmFuc3BvcnQsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHJlYWQgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgUkVBRF9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgd3JpdGUgYnVmZmVyIGluIGJ5dGVzLi4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBtZXNzYWdlcyB2aWEgYW4gaW50ZXJuYWwgYnVmZmVyLgorLy8vCisvLy8gQSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OnJlYWQoLi4uKWAgb25lIGZ1bGwgbWVzc2FnZSAtIGJvdGgKKy8vLyBmaXhlZC1sZW5ndGggaGVhZGVyIGFuZCBieXRlcyAtIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsIGFuZCBidWZmZXJlZC4KKy8vLyBTdWJzZXF1ZW50IHJlYWQgY2FsbHMgYXJlIHNlcnZpY2VkIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlciB1bnRpbCBpdCBpcworLy8vIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgZnVsbCBtZXNzYWdlIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZAorLy8vIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LnJlYWQoJm11dCB2ZWMhWzB1ODsgMV0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwgcmVhZCBhbmQKKyAgICAvLy8gd3JpdGUgYnVmZmVycyB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHJlYWRfY2FwYWNpdHlgIGFuZCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBnZXRfYnl0ZXMoJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCZbdThdPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBzZWxmLnBvcyA9IDA7CisgICAgICAgICAgICBzZWxmLmNhcCA9IHNlbGYuY2hhbi5yZWFkKCZtdXQgc2VsZi5idWYpPzsKKyAgICAgICAgfQorCisgICAgICAgIE9rKCZzZWxmLmJ1ZltzZWxmLnBvcy4uc2VsZi5jYXBdKQorICAgIH0KKworICAgIGZuIGNvbnN1bWUoJm11dCBzZWxmLCBjb25zdW1lZDogdXNpemUpIHsKKyAgICAgICAgLy8gVE9ETzogd2FzIGEgYnVnIGhlcmUgKz0gPC0tIHRlc3Qgc29tZWhvdworICAgICAgICBzZWxmLnBvcyA9IGNtcDo6bWluKHNlbGYuY2FwLCBzZWxmLnBvcyArIGNvbnN1bWVkKTsKKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IGJ5dGVzX3JlYWQgPSAwOworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IG5yZWFkID0geworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9ieXRlcyA9IHNlbGYuZ2V0X2J5dGVzKCk/OworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9zcGFjZSA9IGJ1Zi5sZW4oKSAtIGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYXZhaWxfc3BhY2UsIGF2YWlsX2J5dGVzLmxlbigpKTsKKyAgICAgICAgICAgICAgICBidWZbYnl0ZXNfcmVhZC4uKGJ5dGVzX3JlYWQgKyBucmVhZCldLmNvcHlfZnJvbV9zbGljZSgmYXZhaWxfYnl0ZXNbLi5ucmVhZF0pOworICAgICAgICAgICAgICAgIG5yZWFkCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzZWxmLmNvbnN1bWUobnJlYWQpOworICAgICAgICAgICAgYnl0ZXNfcmVhZCArPSBucmVhZDsKKworICAgICAgICAgICAgaWYgYnl0ZXNfcmVhZCA9PSBidWYubGVuKCkgfHwgbnJlYWQgPT0gMCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPayhieXRlc19yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKy8vLyBUcmFuc3BvcnQgdGhhdCB3cml0ZXMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKy8vLyBBbGwgd3JpdGVzIGFyZSBtYWRlIHRvIHRoaXMgYnVmZmVyIGFuZCBhcmUgc2VudCB0byB0aGUgd3JhcHBlZCBjaGFubmVsIG9ubHkKKy8vLyB3aGVuIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbm5lbDogQywKK30KKworaW1wbDxDPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIGFzc2VydCEoCisgICAgICAgICAgICB3cml0ZV9jYXBhY2l0eSA+IDAsCisgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiCisgICAgICAgICk7CisKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2FwOiB3cml0ZV9jYXBhY2l0eSwKKyAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiAhYnVmLmlzX2VtcHR5KCkgeworICAgICAgICAgICAgbGV0IG11dCBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgYXZhaWxfYnl0ZXMgPSBjbXA6Om1pbihidWYubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5idWYubGVuKCkpOworCisgICAgICAgICAgICAgICAgaWYgYXZhaWxfYnl0ZXMgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKT87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ1ZlsuLmF2YWlsX2J5dGVzXSk7CisgICAgICAgICAgICBhc3NlcnQhKHNlbGYuYnVmLmxlbigpIDw9IHNlbGYuY2FwLCAiY29weSBvdmVyZmxvd2VkIGJ1ZmZlciIpOworCisgICAgICAgICAgICBPayhhdmFpbF9ieXRlcykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKDApCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2FsbCgmc2VsZi5idWYpPzsKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCk/OworICAgICAgICBzZWxmLmJ1Zi5jbGVhcigpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX3JlYWRfYnVmZmVyX2lzX2VtcHR5KCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCBtdXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBiKTsKKworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfcmVhZHNfaW50b196ZXJvX2NhcGFjaXR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBbXSk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfbm90aGluZ19tb3JlX2Nhbl9iZV9yZWFkKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IGJ1Zl9hZ2FpbiA9IHZlYyFbMHU4OyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZfYWdhaW4sICZbMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZmlsbF91c2VyX2J1ZmZlcl93aXRoX29ubHlfYXNfbWFueV9ieXRlc19hc19hdmFpbGFibGUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0LCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gcmVhZCBidWZmZXIgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmWzQuLl0pOworCisgICAgICAgIC8vIHRoaXMgdGltZSwgMCBieXRlcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBidWZmZXIKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzLCAwLCAwLCAwLCAwXSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3N1Y2Nlc3NmdWxseSgpIHsKKyAgICAgICAgLy8gdGhpcyB0ZXN0IGludm9sdmVzIGEgZmV3IGxvb3BzIHdpdGhpbiB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0CisgICAgICAgIC8vIGl0c2VsZiB3aGVyZSBpdCBoYXMgdG8gZHJhaW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGluIG9yZGVyCisgICAgICAgIC8vIHRvIHNlcnZpY2UgYSByZWFkCisKKyAgICAgICAgLy8gd2UgaGF2ZSBhIG11Y2ggc21hbGxlciBidWZmZXIgdGhhbiB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyB0cmFuc3BvcnQgaGFzIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisKKyAgICAgICAgLy8gZmlsbCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBieXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IHJlYWRhYmxlX2J5dGVzID0gWzB1ODsgMTBdOworICAgICAgICBmb3IgaSBpbiAwLi4xMCB7CisgICAgICAgICAgICByZWFkYWJsZV9ieXRlc1tpXSA9IGkgYXMgdTg7CisgICAgICAgIH0KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gd2UgYXNrIHRvIHJlYWQgaW50byBhIGJ1ZmZlciB0aGF0J3MgbXVjaCBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgb25lIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgaGFzOyBhcyBhIHJlc3VsdAorICAgICAgICAvLyBpdCdzIGdvaW5nIHRvIGhhdmUgdG8ga2VlcCBhc2tpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAgICAgLy8gdHJhbnNwb3J0IGZvciBtb3JlIGJ5dGVzCisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgOF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgcmVhZCA4IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDgpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pOworCisgICAgICAgIC8vIGxldCdzIGNsZWFyIG91dCB0aGUgYnVmZmVyIGFuZCB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2Ugd2VyZSBvbmx5IGFibGUgdG8gcmVhZCAyIGJ5dGVzCisgICAgICAgIC8vIChhbGwgdGhhdCdzIHJlbWFpbmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCkKKyAgICAgICAgLy8gbGV0J3MgYWxzbyBjaGVjayB0aGF0IHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluICh3ZSBzaG91bGQgZ2V0IDApCisgICAgICAgIC8vIGFuZCBhbGwgdGhlIGV4aXN0aW5nIGJ5dGVzIHdlcmUgdW50b3VjaGVkCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uMl0sICZbOCwgOV0pOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMi4uXSwgJlswLCAwLCAwLCAwLCAwLCAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX3doZW5fbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b191bmRlcmx5aW5nX2NoYW5uZWwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIpOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMSk7CisKKyAgICAgICAgLy8gbGV0J3MgdHJ5IGFnYWluLi4uCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYlsxLi5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGF1dG8tZmx1c2ggZmFpbGVkCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgciA9IHQud3JpdGUoJltdKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYXV0b19mbHVzaF9pZl93cml0ZV9idWZmZXJfZnVsbCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDgpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIGxldCBiMCA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzXTsKKyAgICAgICAgbGV0IGIxID0gWzB4MDQsIDB4MDUsIDB4MDYsIDB4MDddOworCisgICAgICAgIC8vIHdyaXRlIHRoZSBmaXJzdCA0IGJ5dGVzOyB3ZSd2ZSBub3cgZmlsbGVkIHRoZSB0cmFuc3BvcnQncyB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMCk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIHRoZSBuZXh0IDQgYnl0ZXM7IHRoaXMgY2F1c2VzIHRoZSB0cmFuc3BvcnQgdG8gYXV0by1mbHVzaCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCA0KTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGluIHdyaXRpbmcgdGhlIHNlY29uZCA0IGJ5dGVzIHdlIGF1dG8tZmx1c2hlZCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMCk7CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyBub3cgZmx1c2ggdGhlIHRyYW5zcG9ydCB0byBwdXNoIHRoZSBzZWNvbmQgNCBieXRlcyB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2Ugd3JvdGUgb3V0IHRoZSBzZWNvbmQgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N1Y2Nlc3NmdWxseV9hZnRlcl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDUpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg1LCBtZW0pOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaAorICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFswLCAxLCAyLCAzLCA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2ggYWdhaW4KKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMKQEAgLTAsMCArMSw0NTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQKKy8vLyBidWZmZXJlZC4gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIKKy8vLyB1bnRpbCBpdCBpcyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkCisvLy8gZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OlJlYWQ7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YCB3aXRoIGEgZGVmYXVsdC1zaXplZAorICAgIC8vLyBpbnRlcm5hbCByZWFkIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFJFQURfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHJlYWRfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0sIC8vIEZJWE1FOiBkbyBJIGFjdHVhbGx5IGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV9zaXplID0gc2VsZi5jaGFuLnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpPyBhcyB1c2l6ZTsKKworICAgICAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWF4KG1lc3NhZ2Vfc2l6ZSwgUkVBRF9DQVBBQ0lUWSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKworICAgICAgICAgICAgc2VsZi5jaGFuLnJlYWRfZXhhY3QoJm11dCBzZWxmLmJ1ZlsuLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIHNlbGYuY2FwID0gbWVzc2FnZV9zaXplIGFzIHVzaXplOworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYi5sZW4oKSwgc2VsZi5jYXAgLSBzZWxmLnBvcyk7CisgICAgICAgIGJbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYucG9zICsgbnJlYWRdKTsKKyAgICAgICAgc2VsZi5wb3MgKz0gbnJlYWQ7CisKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIGZyYW1lZCBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuIEFsbAorLy8vIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpmbHVzaCgpYCBpcyBjYWxsZWQuIE9uIGEgZmx1c2ggYSBmaXhlZC1sZW5ndGgKKy8vLyBoZWFkZXIgd2l0aCBhIGNvdW50IG9mIHRoZSBidWZmZXJlZCBieXRlcyBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgYnl0ZXMKKy8vLyB0aGVtc2VsdmVzLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQud3JpdGUoJlsweDAwXSkudW53cmFwKCk7CisvLy8gdC5mbHVzaCgpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwKKyAgICAvLy8gd3JpdGUgYnVmZmVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIKKyAgICAvLy8gb2Ygc2l6ZSBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IFZlYzo6d2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eSksCisgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgY3VycmVudF9jYXBhY2l0eSA9IHNlbGYuYnVmLmNhcGFjaXR5KCk7CisgICAgICAgIGxldCBhdmFpbGFibGVfc3BhY2UgPSBjdXJyZW50X2NhcGFjaXR5IC0gc2VsZi5idWYubGVuKCk7CisgICAgICAgIGlmIGIubGVuKCkgPiBhdmFpbGFibGVfc3BhY2UgeworICAgICAgICAgICAgbGV0IGFkZGl0aW9uYWxfc3BhY2UgPSBjbXA6Om1heChiLmxlbigpIC0gYXZhaWxhYmxlX3NwYWNlLCBjdXJyZW50X2NhcGFjaXR5KTsKKyAgICAgICAgICAgIHNlbGYuYnVmLnJlc2VydmUoYWRkaXRpb25hbF9zcGFjZSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLmJ1Zi5leHRlbmRfZnJvbV9zbGljZShiKTsKKyAgICAgICAgT2soYi5sZW4oKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuYnVmLmxlbigpOworCisgICAgICAgIGlmIGxldCAwID0gbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLmNoYW5uZWwud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihtZXNzYWdlX3NpemUgYXMgaTMyKT87CisgICAgICAgIH0KKworICAgICAgICAvLyB3aWxsIHNwaW4gaWYgdGhlIHVuZGVybHlpbmcgY2hhbm5lbCBjYW4ndCBiZSB3cml0dGVuIHRvCisgICAgICAgIGxldCBtdXQgYnl0ZV9pbmRleCA9IDA7CisgICAgICAgIHdoaWxlIGJ5dGVfaW5kZXggPCBtZXNzYWdlX3NpemUgeworICAgICAgICAgICAgbGV0IG53cml0ZSA9IHNlbGYuY2hhbm5lbC53cml0ZSgmc2VsZi5idWZbYnl0ZV9pbmRleC4ubWVzc2FnZV9zaXplXSk/OworICAgICAgICAgICAgYnl0ZV9pbmRleCA9IGNtcDo6bWluKGJ5dGVfaW5kZXggKyBud3JpdGUsIG1lc3NhZ2Vfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgYnVmX2NhcGFjaXR5ID0gY21wOjptaW4oc2VsZi5idWYuY2FwYWNpdHkoKSwgV1JJVEVfQ0FQQUNJVFkpOworICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKworICAgICAgICBzZWxmLmNoYW5uZWwuZmx1c2goKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAvLyBGSVhNRTogdGVzdCBhIGZvcmNlZCByZXNlcnZlCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2Vfc21hbGxlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoOCwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX211bHRpcGxlX21lc3NhZ2VzX2luX3NlcXVlbmNlX2NvcnJlY3RseSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBjKTsKKworICAgICAgICAvLworICAgICAgICAvLyAxc3QgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDJuZCBtZXNzYWdlCisgICAgICAgIC8vCisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSAxIGJ5dGUKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX3NtYWxsZXJfdGhhbl9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMjAsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfY2FsbHNfd3JpdGVfd2l0aF9lbXB0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMF0gPSBbXTsKKworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJltdKS51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA1LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAwKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKip3b3JzZSoqIGNob2ljZSB0aGFuCisgICAgICAgIC8vIHNpbXBseSByZXNpemluZyB0aGUgYnVmZmVyIHRvIGIubGVuKCkKKworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKyAgICAgICAgbGV0IGIgPSBbMHgwMCwgMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAzIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAxKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKipiZXR0ZXIqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5fZXJyb3JfaWZfbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKworICAgICAgICAvLyBsZXQncyBmbHVzaAorICAgICAgICBsZXQgciA9IHQuZmx1c2goKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGZsdXNoIGNhbid0IHdyaXRlIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwKKyAgICAgICAgYXNzZXJ0IShyLmlzX2VycigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIC8vIElNUE9SVEFOVDogd3JpdGUgY2FwYWNpdHkgKk1VU1QqIGJlIGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiBtZXNzYWdlIHNpemVzIHVzZWQgaW4gdGhpcyB0ZXN0ICsgNC1ieXRlIGZyYW1lIGhlYWRlcgorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGZpcnN0X21lc3NhZ2U6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmZmlyc3RfbWVzc2FnZSkudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgbXV0IGV4cGVjdGVkID0gVmVjOjpuZXcoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV0pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmZpcnN0X21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKworICAgICAgICAvLyByZXNldCBvdXIgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBzZWNvbmRfbWVzc2FnZTogW3U4OyAzXSA9IFsweDA1LCAweDA2LCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZzZWNvbmRfbWVzc2FnZSkudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBleHBlY3RlZC5jbGVhcigpOworICAgICAgICBleHBlY3RlZC53cml0ZV9hbGwoJlsweDAwLCAweDAwLCAweDAwLCAweDAzXSkudW53cmFwKCk7IC8vIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmc2Vjb25kX21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjNGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycwpAQCAtMCwwICsxLDM4NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKy8vLyBJbi1tZW1vcnkgcmVhZCBhbmQgd3JpdGUgY2hhbm5lbCB3aXRoIGZpeGVkLXNpemUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKy8vLworLy8vIE9uIGEgYHdyaXRlYCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBXcml0ZXMgYXJlIG5vCisvLy8gbG9uZ2VyIGFjY2VwdGVkIG9uY2UgdGhpcyBidWZmZXIgaXMgZnVsbC4gQ2FsbGVycyBtdXN0IGBlbXB0eV93cml0ZV9idWZmZXIoKWAKKy8vLyBiZWZvcmUgc3Vic2VxdWVudCB3cml0ZXMgYXJlIGFjY2VwdGVkLgorLy8vCisvLy8gWW91IGNhbiBzZXQgcmVhZGFibGUgYnl0ZXMgaW4gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyIGJ5IGZpbGxpbmcgaXQgd2l0aAorLy8vIGBzZXRfcmVhZGFibGVfYnl0ZXMoLi4uKWAuIENhbGxlcnMgY2FuIHRoZW4gcmVhZCB1bnRpbCB0aGUgYnVmZmVyIGlzCisvLy8gZGVwbGV0ZWQuIE5vIGZ1cnRoZXIgcmVhZHMgYXJlIGFjY2VwdGVkIHVudGlsIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBpcworLy8vIHJlcGxlbmlzaGVkIGFnYWluLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgcmVhZDogQXJjPE11dGV4PFJlYWREYXRhPj4sCisgICAgd3JpdGU6IEFyYzxNdXRleDxXcml0ZURhdGE+PiwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFJlYWREYXRhIHsKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGlkeDogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFdyaXRlRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorfQorCitpbXBsIFRCdWZmZXJDaGFubmVsIHsKKyAgICAvLy8gQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYFRCdWZmZXJDaGFubmVsYCB3aXRoIHRoZSBnaXZlbgorICAgIC8vLyByZWFkIGJ1ZmZlciBjYXBhY2l0eSBhbmQgd3JpdGUgYnVmZmVyIGNhcGFjaXR5LgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCB3cml0ZV9jYXBhY2l0eTogdXNpemUpIC0+IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgcmVhZDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhSZWFkRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICBpZHg6IDAsCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogcmVhZF9jYXBhY2l0eSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIHdyaXRlOiBBcmM6Om5ldyhNdXRleDo6bmV3KFdyaXRlRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHdyaXRlX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgdmVjdG9yIGlmIG5vIHJlYWRhYmxlIGJ5dGVzIGFyZSBwcmVzZW50LgorICAgIHB1YiBmbiByZWFkX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgcmRhdGEuaWR4XTsKKyAgICAgICAgYnVmLmNvcHlfZnJvbV9zbGljZSgmcmRhdGEuYnVmWy4ucmRhdGEuaWR4XSk7CisgICAgICAgIGJ1ZgorICAgIH0KKworICAgIC8vIEZJWE1FOiBkbyBJIHJlYWxseSBuZWVkIHRoaXMgQVBJIGNhbGw/CisgICAgLy8gRklYTUU6IHNob3VsZCB0aGlzIHNpbXBseSByZXNldCB0byB0aGUgbGFzdCBzZXQgb2YgcmVhZGFibGUgYnl0ZXM/CisgICAgLy8vIFJlc2V0IHRoZSBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgdG8gemVyby4KKyAgICAvLy8KKyAgICAvLy8gU3Vic2VxdWVudCBjYWxscyB0byBgcmVhZGAgd2lsbCByZXR1cm4gbm90aGluZy4KKyAgICBwdWIgZm4gZW1wdHlfcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICByZGF0YS5wb3MgPSAwOworICAgICAgICByZGF0YS5pZHggPSAwOworICAgIH0KKworICAgIC8vLyBDb3B5IGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgYGJ1ZmAgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIsCisgICAgLy8vIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBieXRlcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCwKKyAgICAvLy8gd2hpY2ggaXMgYG1pbihidWYubGVuKCksIGludGVybmFsX3JlYWRfYnVmLmxlbigpKWAuCisgICAgcHViIGZuIHNldF9yZWFkYWJsZV9ieXRlcygmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IHVzaXplIHsKKyAgICAgICAgc2VsZi5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG1heF9ieXRlcyA9IGNtcDo6bWluKHJkYXRhLmNhcCwgYnVmLmxlbigpKTsKKyAgICAgICAgcmRhdGEuYnVmWy4ubWF4X2J5dGVzXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5tYXhfYnl0ZXNdKTsKKyAgICAgICAgcmRhdGEuaWR4ID0gbWF4X2J5dGVzOworICAgICAgICBtYXhfYnl0ZXMKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyBieXRlcyB3ZXJlIHdyaXR0ZW4uCisgICAgcHViIGZuIHdyaXRlX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHdkYXRhLnBvc107CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJndkYXRhLmJ1ZlsuLndkYXRhLnBvc10pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLy8gUmVzZXRzIHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIsIG1ha2luZyBpdCBzZWVtIGxpa2Ugbm8gYnl0ZXMgd2VyZQorICAgIC8vLyB3cml0dGVuLiBDYWxsaW5nIGB3cml0ZV9idWZmZXJgIGFmdGVyIHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IuCisgICAgcHViIGZuIGVtcHR5X3dyaXRlX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgbGV0IG11dCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICB3ZGF0YS5wb3MgPSAwOworICAgIH0KKworICAgIC8vLyBPdmVyd3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVhZCBidWZmZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgLy8vIHdyaXRlIGJ1ZmZlci4gVGhlIHdyaXRlIGJ1ZmZlciBpcyBlbXB0aWVkIGFmdGVyIHRoaXMgb3BlcmF0aW9uLgorICAgIHB1YiBmbiBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgLy8gRklYTUU6IHJlZG8gdGhpcyBlbnRpcmUgbWV0aG9kCisgICAgICAgIGxldCBidWYgPSB7CisgICAgICAgICAgICBsZXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBiID0gJndkYXRhLmJ1ZlsuLndkYXRhLnBvc107CisgICAgICAgICAgICBsZXQgbXV0IGJfcmV0ID0gdmVjIVswOyBiLmxlbigpXTsKKyAgICAgICAgICAgIGJfcmV0LmNvcHlfZnJvbV9zbGljZShiKTsKKyAgICAgICAgICAgIGJfcmV0CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGJ5dGVzX2NvcGllZCA9IHNlbGYuc2V0X3JlYWRhYmxlX2J5dGVzKCZidWYpOworICAgICAgICBhc3NlcnRfZXEhKGJ5dGVzX2NvcGllZCwgYnVmLmxlbigpKTsKKworICAgICAgICBzZWxmLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgT2soKAorICAgICAgICAgICAgUmVhZEhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFdyaXRlSGFsZiB7CisgICAgICAgICAgICAgICAgaGFuZGxlOiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHNlbGYucmVhZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICB3cml0ZTogc2VsZi53cml0ZS5jbG9uZSgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApKQorICAgIH0KK30KKworaW1wbCBpbzo6UmVhZCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYnVmLmxlbigpLCByZGF0YS5pZHggLSByZGF0YS5wb3MpOworICAgICAgICBidWZbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmcmRhdGEuYnVmW3JkYXRhLnBvcy4ucmRhdGEucG9zICsgbnJlYWRdKTsKKyAgICAgICAgcmRhdGEucG9zICs9IG5yZWFkOworICAgICAgICBPayhucmVhZCkKKyAgICB9Cit9CisKK2ltcGwgaW86OldyaXRlIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG53cml0ZSA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgd2RhdGEuY2FwIC0gd2RhdGEucG9zKTsKKyAgICAgICAgbGV0IChzdGFydCwgZW5kKSA9ICh3ZGF0YS5wb3MsIHdkYXRhLnBvcyArIG53cml0ZSk7CisgICAgICAgIHdkYXRhLmJ1ZltzdGFydC4uZW5kXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5ud3JpdGVdKTsKKyAgICAgICAgd2RhdGEucG9zICs9IG53cml0ZTsKKyAgICAgICAgT2sobndyaXRlKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkgLy8gbm90aGluZyB0byBkbyBvbiBmbHVzaAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCisgICAgdXNlIHN1cGVyOjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3dyaXRlX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMSk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICB0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X3dyaXRlc19hZnRlcl9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMik7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDJdID0gWzB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIGFnYWluIChub3RoaW5nIHNob3VsZCBiZSB3cml0dGVuKQorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsgLy8gc3RpbGwgdGhlIHNhbWUgYXMgYmVmb3JlCisKKyAgICAgICAgLy8gbm93IHJlc2V0IHRoZSBidWZmZXIKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIC8vIG5vdyB0cnkgd3JpdGUgYWdhaW4gLSB0aGUgd3JpdGUgc2hvdWxkIHN1Y2NlZWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X211bHRpcGxlX3dyaXRlc191bnRpbF9idWZmZXJfaXNfZnVsbCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzA6IFt1ODsgMl0gPSBbMHgwMSwgMHg0MV07CisgICAgICAgIGxldCB3cml0ZV8wX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzBfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZV8wKTsKKworICAgICAgICAvLyBzZWNvbmQgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuLCBzdGFydGluZyBhdCBpbmRleCAyKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMTogW3U4OyA3XSA9IFsweDI0LCAweDQxLCAweDMyLCAweDMzLCAweDExLCAweDk4LCAweEFGXTsKKyAgICAgICAgbGV0IHdyaXRlXzFfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMV9yZXN1bHQudW53cmFwKCksIDcpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKClbMi4uXSwgJmJ5dGVzX3RvX3dyaXRlXzEpOworCisgICAgICAgIC8vIHRoaXJkIHdyaXRlIChvbmx5IDEgYnl0ZSB3cml0dGVuIC0gdGhhdCdzIGFsbCB3ZSBoYXZlIHNwYWNlIGZvcikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzI6IFt1ODsgM10gPSBbMHhCRiwgMHhEQSwgMHg5OF07CisgICAgICAgIGxldCB3cml0ZV8yX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzIpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzJfcmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzkuLl0sICZieXRlc190b193cml0ZV8yWzAuLjFdKTsgLy8gaG93IGRvZXMgdGhpcyBzeW50YXggd29yaz8hCisKKyAgICAgICAgLy8gZm91cnRoIHdyaXRlIChubyB3cml0ZXMgYXJlIGFjY2VwdGVkKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMzogW3U4OyAzXSA9IFsweEJGLCAweEFBLCAweEZEXTsKKyAgICAgICAgbGV0IHdyaXRlXzNfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMyk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfM19yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmdWxsIHdyaXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkOiBWZWM8dTg+ID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8yWzAuLjFdKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZleHBlY3RlZFsuLl0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3JlYWRfYnVmZmVyKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZCk7CisKKyAgICAgICAgdC5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19yZWFkYWJsZV9ieXRlc190b19iZV9zZXRfYWZ0ZXJfcmVhZF9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzApOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMTogW3U4OyAxXSA9IFsweDAyXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV9yZWFkc191bnRpbF9hbGxfYnl0ZXNfcmVhZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlczogW3U4OyAxMF0gPSBbMHhGRiwgMHhFRSwgMHhERCwgMHhDQywgMHhCQiwgMHgwMCwgMHgxQSwgMHgyQiwgMHgzQywgMHg0RF07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzKTsKKworICAgICAgICAvLyBmaXJzdCByZWFkCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMCA9IHZlYyFbMDsgNV07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8wLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbMC4uNV0pKTsKKworICAgICAgICAvLyBzZWNvbmQgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzEgPSB2ZWMhWzA7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMS5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzUuLjldKSk7CisKKyAgICAgICAgLy8gdGhpcmQgcmVhZCAob25seSAxIGJ5dGUgcmVtYWlucyB0byBiZSByZWFkKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzIgPSB2ZWMhWzA7IDNdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8yKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIHJlYWRfYnVmXzIudHJ1bmNhdGUoMSk7IC8vIEZJWE1FOiBkb2VzIHRoZSBjYWxsZXIgaGF2ZSB0byBkbyB0aGlzPworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzIuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s5Li5dKSk7CisKKyAgICAgICAgLy8gZm91cnRoIHJlYWQgKG5vdGhpbmcgc2hvdWxkIGJlIHJlYWRhYmxlKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzMgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICByZWFkX2J1Zl8zLnRydW5jYXRlKDApOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBieXRlcyB3ZSByZWNlaXZlZCBtYXRjaCB0aGUgb3JpZ2luYWwgKGFnYWluISkKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzEpOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8yKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ5dGVzX3JlYWQsICZyZWFkYWJsZV9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZHNfdG9fc3VjY2VlZF9hZnRlcl9yZWFkX2J1ZmZlcl9yZXBsZW5pc2hlZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMywgMCk7CisKKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzA6IFt1ODsgM10gPSBbMHgwMiwgMHhBQiwgMHgzM107CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18wKTsKKworICAgICAgICBsZXQgbXV0IHJlYWRfYnVmID0gdmVjIVswOyA0XTsKKworICAgICAgICAvLyBkcmFpbiB0aGUgcmVhZCBidWZmZXIKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjNdKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGEgc3Vic2VxdWVudCByZWFkIGZhaWxzCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisKKyAgICAgICAgLy8gd2UgZG9uJ3QgbW9kaWZ5IHRoZSByZWFkIGJ1ZmZlciBvbiBmYWlsdXJlCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWRfYnl0ZXMgPSBWZWM6OndpdGhfY2FwYWNpdHkoNCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgZXhwZWN0ZWRfYnl0ZXMucHVzaCgweDAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVhZF9idWYsICZleHBlY3RlZF9ieXRlcyk7CisKKyAgICAgICAgLy8gcmVwbGVuaXNoIHRoZSByZWFkIGJ1ZmZlciBhZ2FpbgorICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXNfMTogW3U4OyAyXSA9IFsweDkxLCAweEFBXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXNfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzXzEpOworCisgICAgICAgIC8vIHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjJdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMzM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycwpAQCAtMCwwICsxLDI5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzIG92ZXIgYW4gSS9PIGNoYW5uZWwuCisvLyEKKy8vISBUaGUgY29yZSB0eXBlcyBhcmUgdGhlIGBUUmVhZFRyYW5zcG9ydGAsIGBUV3JpdGVUcmFuc3BvcnRgIGFuZCB0aGUKKy8vISBgVElvQ2hhbm5lbGAgdHJhaXRzLCB0aHJvdWdoIHdoaWNoIGBUSW5wdXRQcm90b2NvbGAgb3IKKy8vISBgVE91dHB1dFByb3RvY29sYCBjYW4gcmVjZWl2ZSBhbmQgc2VuZCBwcmltaXRpdmVzIG92ZXIgdGhlIHdpcmUuIFdoaWxlCisvLyEgYFRJbnB1dFByb3RvY29sYCBhbmQgYFRPdXRwdXRQcm90b2NvbGAgaW5zdGFuY2VzIGRlYWwgd2l0aCBsYW5ndWFnZSBwcmltaXRpdmVzCisvLyEgdGhlIHR5cGVzIGluIHRoaXMgbW9kdWxlIHVuZGVyc3RhbmQgb25seSBieXRlcy4KKwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om9wczo6e0RlcmVmLCBEZXJlZk11dH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkdHJhbnNwb3J0OmlkZW50LCAkbnVtX3dyaXR0ZW5fYnl0ZXM6ZXhwcikgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKS5sZW4oKSwgJG51bV93cml0dGVuX2J5dGVzKTsKKyAgICB9fTsKK30KKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCR0cmFuc3BvcnQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCAmJGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9fTsKK30KKworbW9kIGJ1ZmZlcmVkOworbW9kIGZyYW1lZDsKK21vZCBtZW07Cittb2Qgc29ja2V0OworCitwdWIgdXNlIHNlbGY6OmJ1ZmZlcmVkOjp7CisgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LAorICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6OmZyYW1lZDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bWVtOjpUQnVmZmVyQ2hhbm5lbDsKK3B1YiB1c2Ugc2VsZjo6c29ja2V0OjpUVGNwQ2hhbm5lbDsKKworLy8vIElkZW50aWZpZXMgYSB0cmFuc3BvcnQgdXNlZCBieSBhIGBUSW5wdXRQcm90b2NvbGAgdG8gcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydDogUmVhZCB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRSZWFkVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEgY2hhbm5lbCBvdmVyIHdoaWNoIGJ5dGVzIGFyZSB0byBiZSByZWFkLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYFRPdXRwdXRQcm90b2NvbGAgdG8gc2VuZCBieXRlcy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnQ6IFdyaXRlIHt9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGNyZWF0ZSBgVFdyaXRlVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgc2VudC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVFJlYWRUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogUmVhZCB7fQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydCBmb3IgVCB3aGVyZSBUOiBXcml0ZSB7fQorCisvLyBGSVhNRTogaW1wbGVtZW50IHRoZSBEZWJ1ZyB0cmFpdCBmb3IgYm94ZWQgdHJhbnNwb3J0cworCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKGNoYW5uZWwpCisgICAgfQorfQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworLy8vIElkZW50aWZpZXMgYSBzcGxpdHRhYmxlIGJpZGlyZWN0aW9uYWwgSS9PIGNoYW5uZWwgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzLgorcHViIHRyYWl0IFRJb0NoYW5uZWw6IFJlYWQgKyBXcml0ZSB7CisgICAgLy8vIFNwbGl0IHRoZSBjaGFubmVsIGludG8gYSByZWFkYWJsZSBoYWxmIGFuZCBhIHdyaXRhYmxlIGhhbGYsIHdoZXJlIHRoZQorICAgIC8vLyByZWFkYWJsZSBoYWxmIGltcGxlbWVudHMgYGlvOjpSZWFkYCBhbmQgdGhlIHdyaXRhYmxlIGhhbGYgaW1wbGVtZW50cworICAgIC8vLyBgaW86OldyaXRlYC4gUmV0dXJucyBgTm9uZWAgaWYgdGhlIGNoYW5uZWwgd2FzIG5vdCBpbml0aWFsaXplZCwgb3IgaWYgaXQKKyAgICAvLy8gY2Fubm90IGJlIHNwbGl0IHNhZmVseS4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuZWQgaGFsdmVzIG1heSBzaGFyZSB0aGUgdW5kZXJseWluZyBPUyBjaGFubmVsIG9yIGJ1ZmZlciByZXNvdXJjZXMuCisgICAgLy8vIEltcGxlbWVudGF0aW9ucyAqKnNob3VsZCBlbnN1cmUqKiB0aGF0IHRoZXNlIHR3byBoYWx2ZXMgY2FuIGJlIHNhZmVseQorICAgIC8vLyB1c2VkIGluZGVwZW5kZW50bHkgYnkgY29uY3VycmVudCB0aHJlYWRzLgorICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PCg6OnRyYW5zcG9ydDo6UmVhZEhhbGY8U2VsZj4sIDo6dHJhbnNwb3J0OjpXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkOworfQorCisvLy8gVGhlIHJlYWRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBoYW5kbGU6IEMsCit9CisKKy8vLyBUaGUgd3JpdGFibGUgaGFsZiBvZiBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBgVElvQ2hhbm5lbDo6c3BsaXRgLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgaGFuZGxlOiBDLAorfQorCitpbXBsPEM+IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBSZWFkSGFsZmAgYXNzb2NpYXRlZCB3aXRoIHJlYWRhYmxlIGBoYW5kbGVgCisgICAgcHViIGZuIG5ldyhoYW5kbGU6IEMpIC0+IFJlYWRIYWxmPEM+IHsKKyAgICAgICAgUmVhZEhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBXcml0ZUhhbGZgIGFzc29jaWF0ZWQgd2l0aCB3cml0YWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBXcml0ZUhhbGY8Qz4geworICAgICAgICBXcml0ZUhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmhhbmRsZS5yZWFkKGJ1ZikKKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUud3JpdGUoYnVmKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmhhbmRsZS5mbHVzaCgpCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIHR5cGUgVGFyZ2V0ID0gQzsKKworICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKKyAgICAgICAgJnNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmTXV0IGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWYgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3JlYWRfdHlwZSgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByOiBCb3g8UmVhZD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fY29uY3JldGVfd3JpdGVfdHlwZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3OiBCb3g8V3JpdGU+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfcmVhZF90cmFuc3BvcnQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgICAgICB0YWtlc19yZWFkX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfd3JpdGVfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV90cmFuc3BvcnRfZnJvbV9ib3hlZF93cml0ZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfcmVhZF90cmFuc3BvcnQ8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRSZWFkVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5ieXRlcygpOworICAgIH0KKworICAgIGZuIHRha2VzX3dyaXRlX3RyYW5zcG9ydDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVFdyaXRlVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVmNjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzCkBAIC0wLDAgKzEsMTY4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7RXJyb3JLaW5kLCBSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpuZXQ6OntTaHV0ZG93biwgVGNwU3RyZWFtfTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07Cit1c2Uge25ld190cmFuc3BvcnRfZXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisKKy8vLyBCaWRpcmVjdGlvbmFsIFRDUC9JUCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgYnkgd3JhcHBpbmcgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2Ugc3RkOjpuZXQ6OlRjcFN0cmVhbTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IHN0cmVhbSA9IFRjcFN0cmVhbTo6Y29ubmVjdCgiMTI3LjAuMC4xOjkxODkiKS51bndyYXAoKTsKKy8vLworLy8vIC8vIG5vIG5lZWQgdG8gY2FsbCBjLm9wZW4oKSBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZCBhYm92ZQorLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjp3aXRoX3N0cmVhbShzdHJlYW0pOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVFRjcENoYW5uZWwgeworICAgIHN0cmVhbTogT3B0aW9uPFRjcFN0cmVhbT4sCit9CisKK2ltcGwgVFRjcENoYW5uZWwgeworICAgIC8vLyBDcmVhdGUgYW4gdW5pbml0aWFsaXplZCBgVFRjcENoYW5uZWxgLgorICAgIC8vLworICAgIC8vLyBUaGUgcmV0dXJuZWQgaW5zdGFuY2UgbXVzdCBiZSBvcGVuZWQgdXNpbmcgYFRUY3BDaGFubmVsOjpvcGVuKC4uLilgCisgICAgLy8vIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7IHN0cmVhbTogTm9uZSB9CisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgdGhhdCB3cmFwcyBhbiBleGlzdGluZyBgVGNwU3RyZWFtYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHBhc3NlZC1pbiBzdHJlYW0gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gb3BlbmVkIGJlZm9yZSBiZWluZyB3cmFwcGVkCisgICAgLy8vIGJ5IHRoZSBjcmVhdGVkIGBUVGNwQ2hhbm5lbGAgaW5zdGFuY2UuCisgICAgcHViIGZuIHdpdGhfc3RyZWFtKHN0cmVhbTogVGNwU3RyZWFtKSAtPiBUVGNwQ2hhbm5lbCB7CisgICAgICAgIFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgIHN0cmVhbTogU29tZShzdHJlYW0pLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIENvbm5lY3QgdG8gYHJlbW90ZV9hZGRyZXNzYCwgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGZvcm0gYGhvc3Q6cG9ydGAuCisgICAgcHViIGZuIG9wZW4oJm11dCBzZWxmLCByZW1vdGVfYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0uaXNfc29tZSgpIHsKKyAgICAgICAgICAgIEVycihuZXdfdHJhbnNwb3J0X2Vycm9yKAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgInRjcCBjb25uZWN0aW9uIHByZXZpb3VzbHkgb3BlbmVkIiwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXRjaCBUY3BTdHJlYW06OmNvbm5lY3QoJnJlbW90ZV9hZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IFNvbWUocyk7CisgICAgICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4gRXJyKEZyb206OmZyb20oZSkpLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFNodXQgZG93biB0aGlzIGNoYW5uZWwuCisgICAgLy8vCisgICAgLy8vIEJvdGggc2VuZCBhbmQgcmVjZWl2ZSBoYWx2ZXMgYXJlIGNsb3NlZCwgYW5kIHRoaXMgaW5zdGFuY2UgY2FuIG5vCisgICAgLy8vIGxvbmdlciBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYW5vdGhlciBlbmRwb2ludC4KKyAgICBwdWIgZm4gY2xvc2UoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5zaHV0ZG93bihTaHV0ZG93bjo6Qm90aCkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIGlmX3NldDxGLCBUPigmbXV0IHNlbGYsIG11dCBzdHJlYW1fb3BlcmF0aW9uOiBGKSAtPiBpbzo6UmVzdWx0PFQ+CisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUY3BTdHJlYW0pIC0+IGlvOjpSZXN1bHQ8VD4sCisgICAgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgbXV0IHMpID0gc2VsZi5zdHJlYW0geworICAgICAgICAgICAgc3RyZWFtX29wZXJhdGlvbihzKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGlvOjpFcnJvcjo6bmV3KAorICAgICAgICAgICAgICAgIEVycm9yS2luZDo6Tm90Q29ubmVjdGVkLAorICAgICAgICAgICAgICAgICJ0Y3AgZW5kcG9pbnQgbm90IGNvbm5lY3RlZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRJb0NoYW5uZWwgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoUmVhZEhhbGY8U2VsZj4sIFdyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQsCisgICAgeworICAgICAgICBsZXQgbXV0IHMgPSBzZWxmOworCisgICAgICAgIHMuc3RyZWFtCisgICAgICAgICAgICAuYXNfbXV0KCkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8c3wgcy50cnlfY2xvbmUoKS5vaygpKQorICAgICAgICAgICAgLm1hcCh8Y2xvbmVkfCB7CisgICAgICAgICAgICAgICAgbGV0IHJlYWRfaGFsZiA9IFJlYWRIYWxmOjpuZXcoVFRjcENoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHMuc3RyZWFtLnRha2UoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBsZXQgd3JpdGVfaGFsZiA9IFdyaXRlSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBTb21lKGNsb25lZCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgKHJlYWRfaGFsZiwgd3JpdGVfaGFsZikKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICAgICAgbmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNsb25lIHVuZGVybHlpbmcgdGNwIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGwgUmVhZCBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBiOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMucmVhZChiKSkKKyAgICB9Cit9CisKK2ltcGwgV3JpdGUgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLndyaXRlKGIpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5mbHVzaCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGVjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCkBAIC0wLDAgKzEsMTUgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJraXRjaGVuLXNpbmsiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vIgorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGQ3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworc3R1YnM6IHRocmlmdHMvQmFzZV9PbmUudGhyaWZ0IHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IHRocmlmdHMvVWx0aW1hdGUudGhyaWZ0ICQodG9wX2J1aWxkZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL1VsdGltYXRlLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0CisKK2NoZWNrOiBzdHVicworCSQoQ0FSR08pIGJ1aWxkCisJJChDQVJHTykgdGVzdAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19zZXJ2ZXIgYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcva2l0Y2hlbl9zaW5rX2NsaWVudCBiaW4va2l0Y2hlbl9zaW5rX2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy9iYXNlX29uZS5ycworCS0kKFJNKSBzcmMvYmFzZV90d28ucnMKKwktJChSTSkgc3JjL21pZGxheWVyLnJzCisJLSQoUk0pIHNyYy91bHRpbWF0ZS5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwl0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBcCisJdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgXAorCXRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IFwKKwl0aHJpZnRzL1VsdGltYXRlLnRocmlmdCBcCisJc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIFwKKwlzcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTVjODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2VfdHdvOjp7VE5hcGtpblNlcnZpY2VTeW5jQ2xpZW50LCBUUmFtZW5TZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6e01lYWxTZXJ2aWNlU3luY0NsaWVudCwgVE1lYWxTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU6OntDb1JlYywgQ29SZWMyLCBSZWNMaXN0LCBSZWNUcmVlLCBUVGVzdFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7RnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudCwgVEZ1bGxNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIHRocmlmdDo6cHJvdG9jb2w6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsCisgICAgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwKK307Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBSZWFkSGFsZiwgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVElvQ2hhbm5lbCwgVFRjcENoYW5uZWwsIFdyaXRlSGFsZiwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJjb21wYWN0Iik7CisgICAgbGV0IHNlcnZpY2UgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2aWNlIikudW53cmFwX29yKCJwYXJ0Iik7CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKyAgICBsZXQgKGlfdHJhbiwgb190cmFuKSA9ICgKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pLAorICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pLAorICAgICk7CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSkpLAorICAgICAgICApLAorICAgICAgICAiY29tcGFjdCIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksCisgICAgICAgICksCisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBydW5fY2xpZW50KHNlcnZpY2UsIGlfcHJvdCwgb19wcm90KQorfQorCitmbiBydW5fY2xpZW50KAorICAgIHNlcnZpY2U6ICZzdHIsCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggc2VydmljZSB7CisgICAgICAgICJmdWxsIiA9PiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicGFydCIgPT4gZXhlY19tZWFsX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgICJyZWN1cnNpdmUiID0+IGV4ZWNfcmVjdXJzaXZlX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OmZyb20oZm9ybWF0ISgKKyAgICAgICAgICAgICJ1bmtub3duIHNlcnZpY2UgdHlwZSB7fSIsCisgICAgICAgICAgICBzZXJ2aWNlCisgICAgICAgICkpKSwKKyAgICB9Cit9CisKK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKworZm4gZXhlY19tZWFsX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIC8vIGNsaWVudC5mdWxsX21lYWwoKTsgLy8gPC0tIElNUE9SVEFOVDogaWYgeW91IHVuY29tbWVudCB0aGlzLCBjb21waWxhdGlvbiAqc2hvdWxkKiBmYWlsCisgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSBNZWFsU2VydmljZSBzdHJ1Y3QgZG9lcyBub3QgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgc2VydmljZSBtYXJrZXIKKworICAgIC8vIG9ubHkgdGhlIGZvbGxvd2luZyB0aHJlZSBjYWxscyB3b3JrCisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDUwKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJtZWFsIiwgfHwgY2xpZW50Lm1lYWwoKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJuYXBraW4iLCB8fCBjbGllbnQubmFwa2luKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDEwMCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgImZ1bGwgbWVhbCIsIHx8IGNsaWVudC5mdWxsX21lYWwoKSkubWFwKHxffCAoKSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWNfcmVjdXJzaXZlX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgbGV0IHRyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSg0KSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSldKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworCisgICAgbGV0IGV4cGVjdGVkX3RyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCByZXR1cm5lZF90cmVlID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob190cmVlIiwgfHwgY2xpZW50LmVjaG9fdHJlZSh0cmVlLmNsb25lKCkpKT87CisgICAgaWYgcmV0dXJuZWRfdHJlZSAhPSBleHBlY3RlZF90cmVlIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKAorICAgICAgICAgICAgIm1pc21hdGNoZWQgcmVjdXJzaXZlIHRyZWUgezo/fSB7Oj99IiwKKyAgICAgICAgICAgIGV4cGVjdGVkX3RyZWUsIHJldHVybmVkX3RyZWUKKyAgICAgICAgKQorICAgICAgICAuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgbGlzdCA9IFJlY0xpc3QgeworICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgIG5leHRpdGVtOiBTb21lKEJveDo6bmV3KFJlY0xpc3QgeworICAgICAgICAgICAgICAgIG5leHRpdGVtOiBOb25lLAorICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfbGlzdCA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fbGlzdCIsIHx8IGNsaWVudC5lY2hvX2xpc3QobGlzdC5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX2xpc3QgIT0gbGlzdCB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCByZWN1cnNpdmUgbGlzdCB7Oj99IHs6P30iLCBsaXN0LCByZXR1cm5lZF9saXN0KS5pbnRvKCkpOworICAgIH0KKworICAgIGxldCBjb19yZWMgPSBDb1JlYyB7CisgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7CisgICAgICAgICAgICBvdGhlcjogU29tZShDb1JlYyB7CisgICAgICAgICAgICAgICAgb3RoZXI6IFNvbWUoQm94OjpuZXcoQ29SZWMyIHsgb3RoZXI6IE5vbmUgfSkpLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0pKSwKKyAgICB9OworICAgIGxldCByZXR1cm5lZF9jb19yZWMgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2NvX3JlYyIsIHx8IHsKKyAgICAgICAgY2xpZW50LmVjaG9fY29fcmVjKGNvX3JlYy5jbG9uZSgpKQorICAgIH0pPzsKKyAgICBpZiByZXR1cm5lZF9jb19yZWMgIT0gY29fcmVjIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJtaXNtYXRjaGVkIGNvX3JlYyB7Oj99IHs6P30iLCBjb19yZWMsIHJldHVybmVkX2NvX3JlYykuaW50bygpKTsKKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY3V0ZV9jYWxsPEYsIFI+KHNlcnZpY2VfdHlwZTogJnN0ciwgY2FsbF9uYW1lOiAmc3RyLCBtdXQgZjogRikgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4KK3doZXJlCisgICAgRjogRm5NdXQoKSAtPiB0aHJpZnQ6OlJlc3VsdDxSPiwKK3sKKyAgICBsZXQgcmVzID0gZigpOworCisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2soXykgPT4gcHJpbnRsbiEoInt9OiBjb21wbGV0ZWQge30gY2FsbCIsIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lKSwKKyAgICAgICAgRXJyKHJlZiBlKSA9PiBwcmludGxuISgKKyAgICAgICAgICAgICJ7fTogZmFpbGVkIHt9IGNhbGwgd2l0aCBlcnJvciB7Oj99IiwKKyAgICAgICAgICAgIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lLCBlCisgICAgICAgICksCisgICAgfQorCisgICAgcmVzCit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MDFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycwpAQCAtMCwwICsxLDMxMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OwordXNlIHRocmlmdDo6c2VydmVyOjpUU2VydmVyOwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2Vfb25lOjpOb29kbGU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6eworICAgIEJyb3RoVHlwZSwgTmFwa2luLCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIsIFJhbWVuLCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6eworICAgIERlc3NlcnQsIE1lYWwsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsIE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3NvciwgUGllLAorfTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjpGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlcjsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7CisgICAgRHJpbmssIEZ1bGxNZWFsLCBGdWxsTWVhbEFuZERyaW5rcywgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY1Byb2Nlc3NvciwKKyAgICBGdWxsTWVhbFNlcnZpY2VTeW5jSGFuZGxlciwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgcl90cmFuc3BvcnRfZmFjdG9yeSA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IHdfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoCisgICAgICAgIEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgKSA9IG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gRklYTUU6IHNob3VsZCBwcm9jZXNzb3IgYmUgYm94ZWQgYXMgd2VsbD8KKyAgICAvLworICAgIC8vIFtzaWdoXSBJIGhhdGUgUnVzdCBnZW5lcmljcyBpbXBsZW1lbnRhdGlvbgorICAgIC8vCisgICAgLy8gSSB3b3VsZCBoYXZlIHByZWZlcnJlZCB0byBidWlsZCBhIHNlcnZlciBoZXJlLCByZXR1cm4gaXQsIGFuZCB0aGVuIGRvCisgICAgLy8gdGhlIGNvbW1vbiBsaXN0ZW4tYW5kLWhhbmRsZSBzdHVmZiwgYnV0IHNpbmNlIHRoZSBzZXJ2ZXIgZG9lc24ndCBoYXZlIGEKKyAgICAvLyBjb21tb24gdHlwZSAoYmVjYXVzZSBlYWNoIG1hdGNoIGFybSBpbnN0YW50aWF0ZXMgYSBzZXJ2ZXIgd2l0aCBhCisgICAgLy8gZGlmZmVyZW50IHByb2Nlc3NvcikgdGhpcyBpc24ndCBwb3NzaWJsZS4KKyAgICAvLworICAgIC8vIFNpbmNlIHdoYXQgSSdtIGRvaW5nIGlzIHVuY29tbW9uIEknbSBqdXN0IGdvaW5nIHRvIGR1cGxpY2F0ZSB0aGUgY29kZQorICAgIG1hdGNoICYqc2VydmljZSB7CisgICAgICAgICJwYXJ0IiA9PiBydW5fbWVhbF9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgImZ1bGwiID0+IHJ1bl9mdWxsX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJyZWN1cnNpdmUiID0+IHJ1bl9yZWN1cnNpdmVfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZpY2UgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSksCisgICAgfQorfQorCitmbiBydW5fbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFBhcnRIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworZm4gcnVuX2Z1bGxfbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhGdWxsSGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK3N0cnVjdCBQYXJ0SGFuZGxlcjsKKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCisvLyBmdWxsIHNlcnZpY2UKKy8vCisKK3N0cnVjdCBGdWxsSGFuZGxlcjsKKworaW1wbCBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9mdWxsX21lYWxfYW5kX2RyaW5rcygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWxBbmREcmlua3M+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBmdWxsIG1lYWwgYW5kIGRyaW5rcyBjYWxsIik7CisgICAgICAgIE9rKEZ1bGxNZWFsQW5kRHJpbmtzOjpuZXcoZnVsbF9tZWFsKCksIERyaW5rOjpDYW5hZGlhbldoaXNreSkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2Jlc3RfcGllKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxQaWU+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBwaWUgY2FsbCIpOworICAgICAgICBPayhQaWU6Ok1pc3Npc3NpcHBpTXVkKSAvLyBJIHByZWZlciBQaWU6OlB1bXBraW4sIGJ1dCBJIGhhdmUgdG8gY2hlY2sgdGhhdCBjYXNpbmcgd29ya3MKKyAgICB9Cit9CisKK2ltcGwgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxGdWxsTWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgZnVsbCBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2soZnVsbF9tZWFsKCkpCisgICAgfQorfQorCitpbXBsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKG1lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfcmFtZW4oJnNlbGYsIF86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8UmFtZW4+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIHJhbWVuIGNhbGwiKTsKKyAgICAgICAgT2socmFtZW4oKSkKKyAgICB9Cit9CisKK2ltcGwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX25hcGtpbigmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TmFwa2luPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBuYXBraW4gY2FsbCIpOworICAgICAgICBPayhuYXBraW4oKSkKKyAgICB9Cit9CisKK2ZuIGZ1bGxfbWVhbCgpIC0+IEZ1bGxNZWFsIHsKKyAgICBGdWxsTWVhbDo6bmV3KG1lYWwoKSwgRGVzc2VydDo6UG9ydCgiR3JhaGFtJ3MgVGF3bnkiLnRvX293bmVkKCkpKQorfQorCitmbiBtZWFsKCkgLT4gTWVhbCB7CisgICAgTWVhbDo6bmV3KG5vb2RsZSgpLCByYW1lbigpKQorfQorCitmbiBub29kbGUoKSAtPiBOb29kbGUgeworICAgIE5vb2RsZTo6bmV3KCJzcGVsdCIudG9fb3duZWQoKSwgMTAwKQorfQorCitmbiByYW1lbigpIC0+IFJhbWVuIHsKKyAgICBSYW1lbjo6bmV3KCJNciBSYW1lbiIudG9fb3duZWQoKSwgNzIsIEJyb3RoVHlwZTo6TWlzbykKK30KKworZm4gbmFwa2luKCkgLT4gTmFwa2luIHsKKyAgICBOYXBraW4ge30KK30KKworZm4gcnVuX3JlY3Vyc2l2ZV9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXI7CitpbXBsIHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9lY2hvX3RyZWUoJnNlbGYsIHRyZWU6IHJlY3Vyc2l2ZTo6UmVjVHJlZSkgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpSZWNUcmVlPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgdHJlZSk7CisgICAgICAgIE9rKHRyZWUpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fbGlzdCgmc2VsZiwgbHN0OiByZWN1cnNpdmU6OlJlY0xpc3QpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjTGlzdD4geworICAgICAgICBwcmludGxuISgiezo/fSIsIGxzdCk7CisgICAgICAgIE9rKGxzdCkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfZWNob19jb19yZWMoJnNlbGYsIGl0ZW06IHJlY3Vyc2l2ZTo6Q29SZWMpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6Q29SZWM+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBpdGVtKTsKKyAgICAgICAgT2soaXRlbSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvbGliLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUxNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBiYXNlX29uZTsKK3B1YiBtb2QgYmFzZV90d287CitwdWIgbW9kIG1pZGxheWVyOworcHViIG1vZCB1bHRpbWF0ZTsKK3B1YiBtb2QgcmVjdXJzaXZlOworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3IoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhfbm9fZmllbGRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoTm9uZSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3Jfd2l0aG91dF9vcHRpb25fd3JhcCgpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfZGVmYXVsdHMoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWwgeworICAgICAgICAgICAgbm9vZGxlOiBTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksCisgICAgICAgICAgICAuLkRlZmF1bHQ6OmRlZmF1bHQoKQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmYTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0CkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3R5cGVkZWYgaTY0IFRlbXBlcmF0dXJlCisKK3R5cGVkZWYgaTggU2l6ZQorCit0eXBlZGVmIHN0cmluZyBMb2NhdGlvbgorCitjb25zdCBpMzIgQm9pbGluZ1BvaW50ID0gMTAwCisKK2NvbnN0IGxpc3Q8VGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlcyA9IFsxMCwgMTEsIDIyLCAzM10KKworLy8gSU1QT1JUQU5UOiB0ZW1wcyBzaG91bGQgZW5kIHdpdGggIi4wIiBiZWNhdXNlIHRoaXMgdGVzdHMKKy8vIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25zdCBmbG9hdCBsaXN0IGdlbmVyYXRpb24KK2NvbnN0IGxpc3Q8ZG91YmxlPiBDb21tb25UZW1wZXJhdHVyZXMgPSBbMzAwLjAsIDQ1MC4wXQorCitjb25zdCBkb3VibGUgTWVhbHNQZXJEYXkgPSAyLjU7CisKK2NvbnN0IHN0cmluZyBEZWZhdWx0UmVjaXBlTmFtZSA9ICJTb3VwLXJpc2Ugb2YgdGhlIERheSIKK2NvbnN0IGJpbmFyeSBEZWZhdWx0UmVjaXBlQmluYXJ5ID0gIlNvdXAtcmlzZSBvZiB0aGUgMDEwMTAxMDEiCisKK3N0cnVjdCBOb29kbGUgeworICAxOiBzdHJpbmcgZmxvdXJUeXBlCisgIDI6IFRlbXBlcmF0dXJlIGNvb2tUZW1wCit9CisKK3N0cnVjdCBTcGFnaGV0dGkgeworICAxOiBvcHRpb25hbCBsaXN0PE5vb2RsZT4gbm9vZGxlcworfQorCitjb25zdCBOb29kbGUgU3BlbHROb29kbGUgPSB7ICJmbG91clR5cGUiOiAic3BlbHQiLCAiY29va1RlbXAiOiAxMTAgfQorCitzdHJ1Y3QgTWVhc3VyaW5nU3Bvb24geworICAxOiBTaXplIHNpemUKK30KKworc3RydWN0IE1lYXN1cmluZ0N1cCB7CisgIDE6IGRvdWJsZSBtaWxsaXMKK30KKwordW5pb24gTWVhc3VyaW5nQWlkcyB7CisgIDE6IE1lYXN1cmluZ1Nwb29uIHNwb29uCisgIDI6IE1lYXN1cmluZ0N1cCBjdXAKK30KKworc3RydWN0IENvb2tpbmdUZW1wZXJhdHVyZXMgeworICAxOiBzZXQ8ZG91YmxlPiBjb21tb25UZW1wZXJhdHVyZXMKKyAgMjogbGlzdDxkb3VibGU+IHVzZWRUZW1wZXJhdHVyZXMKKyAgMzogbWFwPGRvdWJsZSwgZG91YmxlPiBmYWhyZW5oZWl0VG9DZW50aWdyYWRlQ29udmVyc2lvbnMKK30KKworc3RydWN0IFJlY2lwZSB7CisgIDE6IHN0cmluZyByZWNpcGVOYW1lCisgIDI6IHN0cmluZyBjdWlzaW5lCisgIDM6IGk4IHBhZ2UKK30KKwordW5pb24gQ29va2luZ1Rvb2xzIHsKKyAgMTogc2V0PE1lYXN1cmluZ1Nwb29uPiBtZWFzdXJpbmdTcG9vbnMKKyAgMjogbWFwPFNpemUsIExvY2F0aW9uPiBtZWFzdXJpbmdDdXBzLAorICAzOiBsaXN0PFJlY2lwZT4gcmVjaXBlcworfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTZhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitjb25zdCBpMzIgV2F0ZXJXZWlnaHQgPSAyMDAKKworZW51bSBicm90aFR5cGUgeworICBNaXNvLAorICBzaG91eXUsCit9CisKK3N0cnVjdCBSYW1lbiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyByYW1lblR5cGUKKyAgMjogcmVxdWlyZWQgaTMyIG5vb2RsZUNvdW50CisgIDM6IGJyb3RoVHlwZSBicm90aAorfQorCitzdHJ1Y3QgTmFwa2luIHsKKyAgLy8gZW1wdHkKK30KKworc2VydmljZSBOYXBraW5TZXJ2aWNlIHsKKyAgTmFwa2luIG5hcGtpbigpCit9CisKK3NlcnZpY2UgUmFtZW5TZXJ2aWNlIGV4dGVuZHMgTmFwa2luU2VydmljZSB7CisgIFJhbWVuIHJhbWVuKDE6IGkzMiByZXF1ZXN0ZWROb29kbGVDb3VudCkKK30KKworLyogY29uc3Qgc3RydWN0IENvb2tlZFJhbWVuID0geyAiYmFyIjogMTAgfSAqLworCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmY0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJCYXNlX09uZS50aHJpZnQiCitpbmNsdWRlICJCYXNlX1R3by50aHJpZnQiCisKK2NvbnN0IGkzMiBXYXRlckJvaWxpbmdQb2ludCA9IEJhc2VfT25lLkJvaWxpbmdQb2ludAorCitjb25zdCBtYXA8c3RyaW5nLCBCYXNlX09uZS5UZW1wZXJhdHVyZT4gVGVtcGVyYXR1cmVOYW1lcyA9IHsgImZyZWV6aW5nIjogMCwgImJvaWxpbmciOiAxMDAgfQorCitjb25zdCBtYXA8c2V0PGkzMj4sIG1hcDxsaXN0PHN0cmluZz4sIHN0cmluZz4+IE15Q29uc3ROZXN0ZWRNYXAgPSB7CisgIFswLCAxLCAyLCAzXTogeyBbImZvbyJdOiAiYmFyIiB9LAorICBbMjBdOiB7IFsibnV0IiwgInRvbiJdIDogImJhciIgfSwKKyAgWzMwLCA0MF06IHsgWyJib3VuY3kiLCAidGlua2x5Il06ICJjYXN0bGUiIH0KK30KKworY29uc3QgbGlzdDxsaXN0PGkzMj4+IE15Q29uc3ROZXN0ZWRMaXN0ID0gWworICBbMCwgMSwgMl0sCisgIFszLCA0LCA1XSwKKyAgWzYsIDcsIDhdCitdCisKK2NvbnN0IHNldDxzZXQ8aTMyPj4gTXlDb25zdE5lc3RlZFNldCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitlbnVtIFBpZSB7CisgIFBVTVBLSU4sCisgIGFwcGxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBTVFJBV0JFUlJZX1JIVUJBUkIsCisgIEtleV9MaW1lLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBjb2NvbnV0X0NyZWFtLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBtaXNzaXNzaXBwaV9tdWQsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK3N0cnVjdCBNZWFsIHsKKyAgMTogQmFzZV9PbmUuTm9vZGxlIG5vb2RsZQorICAyOiBCYXNlX1R3by5SYW1lbiByYW1lbgorfQorCit1bmlvbiBEZXNzZXJ0ICB7CisgIDE6IHN0cmluZyBwb3J0CisgIDI6IHN0cmluZyBpY2VXaW5lCit9CisKK3NlcnZpY2UgTWVhbFNlcnZpY2UgZXh0ZW5kcyBCYXNlX1R3by5SYW1lblNlcnZpY2UgeworICBNZWFsIG1lYWwoKQorfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmExMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJNaWRsYXllci50aHJpZnQiCisKK2VudW0gRHJpbmsgeworICBXQVRFUiwKKyAgV0hJU0tFWSwKKyAgV0lORSwKKyAgc2NvdGNoLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBMQVRFX0hBUlZFU1RfV0lORSwKKyAgSW5kaWFfUGFsZV9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIGFwcGxlX2NpZGVyLCAvLyBpbnRlbnRpYWxseSBwb29ybHkgY2FzZWQKKyAgYmVsZ2lhbl9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIENhbmFkaWFuX3doaXNreSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKK30KKworY29uc3QgbWFwPGk4LCBNaWRsYXllci5QaWU+IFJhbmtlZFBpZXMgPSB7CisgIDE6IE1pZGxheWVyLlBpZS5QVU1QS0lOLAorICAyOiBNaWRsYXllci5QaWUuU1RSQVdCRVJSWV9SSFVCQVJCLAorICAzOiBNaWRsYXllci5QaWUuYXBwbGUsCisgIDQ6IE1pZGxheWVyLlBpZS5taXNzaXNzaXBwaV9tdWQsCisgIDU6IE1pZGxheWVyLlBpZS5jb2NvbnV0X0NyZWFtLAorICA2OiBNaWRsYXllci5QaWUuS2V5X0xpbWUsCit9CisKK3N0cnVjdCBGdWxsTWVhbCB7CisgIDE6IHJlcXVpcmVkIE1pZGxheWVyLk1lYWwgbWVhbAorICAyOiByZXF1aXJlZCBNaWRsYXllci5EZXNzZXJ0IGRlc3NlcnQKK30KKworc3RydWN0IEZ1bGxNZWFsQW5kRHJpbmtzIHsKKyAgMTogcmVxdWlyZWQgRnVsbE1lYWwgZnVsbE1lYWwKKyAgMjogb3B0aW9uYWwgRHJpbmsgZHJpbmsKK30KKworc2VydmljZSBGdWxsTWVhbFNlcnZpY2UgZXh0ZW5kcyBNaWRsYXllci5NZWFsU2VydmljZSB7CisgIEZ1bGxNZWFsIGZ1bGxNZWFsKCkKK30KKworc2VydmljZSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2UgZXh0ZW5kcyBGdWxsTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbEFuZERyaW5rcyBmdWxsTWVhbEFuZERyaW5rcygpCisKKyAgTWlkbGF5ZXIuUGllIGJlc3RQaWUoKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3QvUkVBRE1FIGIvbGliL3N0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3N0L1JFQURNRQpyZW5hbWUgdG8gbGliL3N0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvc3QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvc3QvcGFja2FnZS54bWwgYi9saWIvc3QvcGFja2FnZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzOTM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zdC9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8IS0tIEFwYWNoZSBUaHJpZnQgU21hbGx0YWxrIGxpYnJhcnkgdmVyc2lvbiAxLjAuMCAtLT4KKzxwYWNrYWdlPgorICA8bmFtZT5saWJ0aHJpZnQtc3Q8L25hbWU+CisgIDxmaWxlPnRocmlmdC5zdDwvZmlsZT4KKyAgPGZpbGVpbj50aHJpZnQuc3Q8L2ZpbGVpbj4KKzwvcGFja2FnZT4KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L01ha2VmaWxlLmFtIGIvbGliL3N3aWZ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODhiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2FsbC1sb2NhbDoKKwlzd2lmdCBidWlsZCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZQorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwlzd2lmdCBpbnN0YWxsCisKK2NsZWFuLWxvY2FsOgorCXN3aWZ0IHBhY2thZ2UgY2xlYW4KKwlybSAtcmYgLmJ1aWxkCisKK3ByZWNyb3NzOgorCXN3aWZ0CisKK2NoZWNrLWxvY2FsOgorCXN3aWZ0IHRlc3QKKworRVhUUkFfRElTVCA9IFwKKwlQYWNrYWdlLnN3aWZ0IFwKKwlTb3VyY2VzIFwKKwlUZXN0cyBcCisJUkVBRE1FLm1kCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorCU1ha2VmaWxlIFwKKwlNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMzZjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgUGFja2FnZURlc2NyaXB0aW9uCisKK2xldCBwYWNrYWdlID0gUGFja2FnZSgKKwluYW1lOiAiVGhyaWZ0IgorKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1JFQURNRS5tZCBiL2xpYi9zd2lmdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxMDk2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9SRUFETUUubWQKQEAgLTAsMCArMSwyMTUgQEAKK1RocmlmdCBTd2lmdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKyMjIEJ1aWxkCisgICAgc3dpZnQgYnVpbGQKKworIyMgVGVzdAorICAgIHN3aWZ0IHRlc3QKKworIyMgSW5zdGFsbCBMaWJyYXJ5CisjIyMjIyBDb2NvYXBvZHMKK0FkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgcG9kZmlsZQorYGBgcnVieQorICAgIHBvZCAnVGhyaWZ0LXN3aWZ0MycsIDpnaXQgPT4gJ2dpdEBnaXRodWIuY29tOmFwYWNoZS90aHJpZnQuZ2l0JywgOmJyYW5jaCA9PiAnbWFzdGVyJworYGBgCisKKyMjIyMjIFNQTQorVW5mb3J0dW5hdGVseSBkdWUgdG8gc29tZSBsaW1pdGF0aW9ucyBpbiBTUE0sIHRoZSBQYWNrYWdlIG1hbmlmZXN0IGFuZCBTb3VyY2VzIGRpcmVjdG9yeSBtdXN0IGJlIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LgorVG8gZ2V0IGFyb3VuZCB0aGF0IGZvciB0aGUgdGltZSBiZWluZywgeW91IGNhbiB1c2UgdGhpcyBtaXJyb3JlZCByZXBvLgorQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQYWNrYWdlLnN3aWZ0CitgYGBzd2lmdAorZGVwZW5kZW5jaWVzOiBbCisgICAgLlBhY2thZ2UodXJsOiAiaHR0cHM6Ly9naXRodWIuY29tL2Fwb2NvbGlwc2UvVGhyaWZ0LVN3aWZ0LmdpdCIsIG1ham9yVmVyc2lvbjogMSkKK10KK2BgYAorCisjIyBUaHJpZnQgQ29tcGlsZXIKKworWW91IGNhbiBjb21waWxlIElETCBzb3VyY2VzIGZvciBTd2lmdCAzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgdGhyaWZ0IC0tZ2VuIHN3aWZ0IHRocmlmdF9maWxlCisKKyMjIENsaWVudCBFeGFtcGxlCitgYGBzd2lmdAorbGV0IHRyYW5zcG9ydCA9IFRTb2NrZXRUcmFuc3BvcnQoaG9zdG5hbWU6ICJsb2NhbGhvc3QiLCBwb3J0OiA5MDkwKSEKKworLy8gIHZhciBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0OiB0cmFuc3BvcnQpCitsZXQgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKy8vICB2YXIgY2xpZW50ID0gSGVybWVzQ2xpZW50KGlub3V0UHJvdG9jb2w6IHByb3RvKQorbGV0IGNsaWVudCA9IFRocmlmdFRlc3RDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitkbyB7CisgICAgdHJ5IGNsaWVudC50ZXN0Vm9pZCgpCit9IGNhdGNoIGxldCBlcnJvciB7CisgICAgcHJpbnQoIlwoZXJyb3IpIikKK30KK2BgYAorCisjIyBMaWJyYXJ5IE5vdGVzCistIEVsaW1pbmF0ZWQgUHJvdG9jb2wgRmFjdG9yaWVzLCBUaGV5IHdlcmUgb25seSB1c2VkIGluIGFzeW5jIGNsaWVudHMgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIEdlbmVyaWNzIHByb3ZpZGUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuCistIFN3aWZ0eSBFcnJvcnMsIEFsbCBgVEVycm9yYCB0eXBlcyBoYXZlIGEgbmVzdGVkIGBFcnJvckNvZGVgIEVudW0gYXMgd2VsbCBhcyBzb21lIGV4dHJhIGZsYXZvciB3aGVyZSBuZWVkZWQuCistIFZhbHVlIHR5cGVkIGV2ZXJ5dGhpbmcuICBgVFRyYW5zcG9ydGAgb3BlcmF0ZXMgb24gdmFsdWUgdHlwZWQgYERhdGFgIHJhdGhlciB0aGFuIHJlZmVyZW5jZSB0eXBlZCBgTlNEYXRhYCBvciBgVW5zYWZlQnVmZmVyUG9pbnRlcmBzCistIFN3aWZ0IDMgTmFtZWQgcHJvdG9jb2xzLiAgU3dpZnQgMyBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCB0aGUgZWxpbWluYXRpb24gb2YgcmVkdW5kYW50IHdvcmRzIHRoYXQgY2FuIGJlIGluZmVycmVkIGZyb20gdmFyaWFibGUvZnVuY3Rpb24gc2lnbmF0dXJlcy4gIFRoaXMgcmVuYW1pbmcgaXMgYXBwbGllZCB0aHJvdWdob3V0IHRoZSBTd2lmdCAzIGxpYnJhcnkgY29udmVydGluZyBtb3N0IG5hbWluZyBjb252ZW50aW9ucyB1c2VkIGluIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0byBTd2lmdCAzLWVzcXVlIG5hbWluZyBjb252ZW50aW9ucy4gZWcuCitgYGBzd2lmdAorZnVuYyByZWFkU3RyaW5nKCkgdGhyb3dzIC0+IFN0cmluZworZnVuYyB3cml0ZVN0cmluZyhfIHZhbDogU3RyaW5nKSB0aHJvd3MKK2BgYAoraGF2ZSBiZWVuIHJlbmFtZWQgdG8gZWxpbWluYXRlIHJlZHVuZGFudCB3b3JkczoKK2BgYHN3aWZ0CitmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCisKKy0gRWxpbWluYXRlZCBgVEhUVFBUcmFuc3BvcnRgIHRoYXQgdXNlcyBgTlNVUkxDb25uZWN0aW9uYCBkdWUgdG8gaXQgYmVpbmcgZGVwcmVjYXRlZCBhbmQgbm90IGF2YWlsYWJsZSBhdCBhbGwgaW4gU3dpZnQgMyBmb3IgTGludXguICBgVEhUVFBTZXNzaW9uVHJhbnNwb3J0YCBmcm9tIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0aGF0IHVzZXMgYE5TVVJMU2Vzc2lvbmAgaGFzIGJlZW4gcmVuYW1lZCB0byBgVEhUVFBUcmFuc3BvcnRgIGZvciB0aGlzIGxpYnJhcnkgYW5kIGxldmVyYWdlcyBgVVJMU2Vzc2lvbmAsIHByb3ZpZGluZyBib3RoIHN5bmNocm9ub3VzICh3aXRoIHNlbWFwaG9yZXMpIGFuZCBhc3luY2hyb25vdXMgYmVoYXZpb3IuCistIFByb2JhYmx5IHNvbWUgTW9yZSB0aGluZ3MgSSd2ZSBtaXNzZWQgaGVyZS4KKworIyMgR2VuZXJhdG9yIE5vdGVzCisjIyMjIEdlbmVyYXRvciBGbGFncworfCBGbGFnICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLSB8Oi0tLS0tLS0tLS0tLS06fAorfCBhc3luY19jbGllbnRzIHwgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC4gQXN5bmNocm9ub3VzIGNsYXNzZXMgYXJlIGFwcGVuZGVkIHdpdGggYF9Bc3luY2AgfAorfCBub19zdHJpY3QqICAgIHwgR2VuZXJhdGVzIG5vbi1zdHJpY3Qgc3RydWN0cyAgICAgIHwKK3wgZGVidWdfZGVzY3JpcHRpb25zIHwgQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24gICAgICB8Cit8IGxvZ191bmV4cGVjdGVkIHwgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLiB8Cit8IHNhZmVfZW51bXMgICAgIHwgR2VuZXJhdGUgZW51bSB0eXBlcyB3aXRoIGFuIHVua25vd24gY2FzZSB0byBoYW5kbGUgdW5zcGVjaWZpZWQgdmFsdWVzIHJhdGhlciB0aGFuIHRocm93IGEgc2VyaWFsaXphdGlvbiBlcnJvciAgfAorCisKKworKk1vc3QgdGhyaWZ0IGxpYnJhcmllcyBhbGxvdyBlbXB0eSBpbml0aWFsaXphdGlvbiBvZiBTdHJ1Y3RzLCBpbml0aWFsaXppbmcgYHJlcXVpcmVkYCBmaWVsZHMgd2l0aCBuaWwvbnVsbC9Ob25lIChQeXRob24gYW5kIE5vZGUgZ2VuZXJhdG9ycykuICBTd2lmdCBvbiB0aGUgb3RoZXIgaGFuZCByZXF1aXJlcyBpbml0aWFsaXplcnMgdG8gaW5pdGlhbGl6ZSBhbGwgbm9uLU9wdGlvbmFsIGZpZWxkcywgYW5kIHRodXMgdGhlIFN3aWZ0IDMgZ2VuZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgKHVubGlrZSB0aGUgU3dpZnQgMi9Db2NvYSBnZW5lcmF0b3IpLiAgSW4gb3RoZXIgbGFuZ3VhZ2VzLCB0aGlzIGFsbG93cyB0aGUgc2VuZGluZyBvZiBOVUxMIHZhbHVlcyBpbiBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGByZXF1aXJlZGAsIGFuZCB0aHVzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gU3dpZnQgY2xpZW50cyBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGZpZWxkcy4gIFRoZSBgbm9fc3RyaWN0YCBvcHRpb24gaGVyZSB3aWxsIGlnbm9yZSB0aGUgdmFsaWRhdGlvbiBjaGVjaywgYXMgd2VsbCBhcyBiZWhhdmUgc2ltaWxhciB0byB0aGUgU3dpZnQyL0NvY29hIGdlbmVyYXRvciBhbmQgaW5pdGlhbGl6ZSByZXF1aXJlZCBmaWVsZHMgd2l0aCBlbXB0eSBpbml0aWFsaXplcnMgKHdoZXJlIHBvc3NpYmxlKS4KKworCisjIyBXaGF0cyBpbXBsZW1lbnRlZAorIyMjIyBMaWJyYXJ5CisjIyMjIyBUcmFuc3BvcnRzCistIFt4XSBUU29ja2V0VHJhbnNwb3J0IC0gQ0ZTb2NrZXQgYW5kIFBvc2l4U29ja2V0IHZhcmlhbnRzIGF2YWlsYWJsZS4gQ0ZTb2NrZXQgdmFyaWFudCBvbmx5IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMKKy0gW3hdIFRIVFRQVHJhbnNwb3J0IC0gQ3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBEYXJ3aW4gcGxhdGZvcm1zLCBTd2lmdCBGb3VuZGF0aW9uIFVSTFNlc3Npb24gaW1wbGVtZW50YXRpb24gbmVlZHMgY29tcGxldGlvbiBvbiBsaW51eC4KKy0gW3hdIFRTb2NrZXRTZXJ2ZXIgLSBVc2VzIENGU29ja2V0cyBvbmx5IGZvciBiaW5kaW5nLCBzaG91bGQgYmUgd29ya2luZyBvbiBsaW51eAorLSBbeF0gVEZyYW1lZFRyYW5zcG9ydAorLSBbeF0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorLSBbeF0gVEZpbGVUcmFuc3BvcnQgLSBBIGZldyB2YXJpYW50cyB1c2luZyBGaWxlIGhhbmRsZXMgYW5kIGZpbGUgZGVzY3JpcHRvcnMuCistIFt4XSBUU3RyZWFtVHJhbnNwb3J0IC0gRnVsbHkgZnVuY3Rpb25hbCBpbiBEYXJ3aW4sIEZvdW5kYXRpb24gYmFja2luZyBub3QgeWV0IGNvbXBsZXRlZCBpbiBMaW51eCAoVGhpcyBsaW1pdHMgVENGU29ja2V0VHJhbnNwb3J0IHRvIERhcndpbikKKy0gWyBdIEhUVFBTZXJ2ZXIgLSBDdXJyZW50bHkgdGhlcmUgaXMgbm8gbGlnaHR3ZWlnaHQgIEhUVFBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gdGhlIFN3aWZ0IFN0YW5kYXJkIExpYnJhcnksIHNvIG90aGVyIDNyZCBwYXJ0eSBhbHRlcm5hdGl2ZXMgYXJlIHJlcXVpcmVkIGFuZCBvdXQgb2Ygc2NvcGUgZm9yIHRoZSBUaHJpZnQgbGlicmFyeS4gIEV4YW1wbGVzIHVzaW5nIFBlcmZlY3Qgd2lsbCBiZSBwcm92aWRlZC4KKy0gWyBdIE90aGVyIChneiwgZXRjKQorCisjIyMjIyBQcm90b2NvbHMKKy0gW3hdIFRCaW5hcnlQcm90b2NvbAorLSBbeF0gVENvbXBhY3RQcm90b2NvbAorLSBbIF0gVEpTT05Qcm90b2NvbCAtIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGltcGxlbWVudGVkCisKKyMjIyMjIEdlbmVyYXRvcgorLSBbeF0gQ29kZSBDb21wbGV0ZSBHZW5lcmF0b3IKKy0gW3hdIEFzeW5jIGNsaWVudHMKKy0gW3hdIERvY3VtZW50YXRpb24gR2VuZXJhdGlvbiAtIEdlbmVyYXRvciB3aWxsIHRyYW5zcGxhbnQgSURMIGRvY3MgdG8gU3dpZnQgY29kZSBmb3IgZWFzeSBsb29rdXAgaW4gWGNvZGUKKy0gWyBdIERlZmF1bHQgVmFsdWVzIC0gVE9ETworLSBbIF0gbm9fc3RyaWN0IG1vZGUgLSBUT0RPCistIFsgXSBOYW1lc3BhY2luZyAtIFN0aWxsIGhhdmVuJ3QgbmFpbGVkIGRvd24gYSBnb29kIHBhcmFkaWdtIGZvciBuYW1lc3BhY2luZy4gIEl0IHdpbGwgbGlrZWx5IGludm9sdmUgY3JlYXRpbmcgc3ViZGlyZWN0b3JpZXMgZm9yIGRpZmZlcmVudCBuYW1lc3BhY2VzIGFuZCBleHBlY3RpbmcgdGhlIGRldmVsb3BlciB0byBpbXBvcnQgZWFjaCBzdWJkaXJlY3RvcnkgYXMgc2VwYXJhdGUgbW9kdWxlcy4gIEl0IGNvdWxkIGV4dGVuZCB0byBjcmVhdGluZyBTUE0gUGFja2FnZSBtYW5pZmVzdHMgd2l0aCBzdWItbW9kdWxlcyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBtb2R1bGUKKworCisKKyMjIEV4YW1wbGUgSFRUUCBTZXJ2ZXIgd2l0aCBQZXJmZWN0CitgYGBzd2lmdAoraW1wb3J0IFBlcmZlY3RMaWIKK2ltcG9ydCBQZXJmZWN0SFRUUAoraW1wb3J0IFBlcmZlY3RIVFRQU2VydmVyCitpbXBvcnQgRGlzcGF0Y2gKKworbGV0IGxvZ1F1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLmJhY2tncm91bmQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorbGV0IHBRdWV1ZSA9IERpc3BhdGNoUXVldWUobGFiZWw6ICJsb2ciLCBxb3M6IC51c2VySW5pdGlhdGVkLCBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKworCitjbGFzcyBUUGVyZmVjdFNlcnZlcjxJblByb3RvY29sOiBUUHJvdG9jb2wsIE91dFByb3RvY29sOiBUUHJvdG9jb2w+IHsKKworIHByaXZhdGUgdmFyIHNlcnZlciA9IEhUVFBTZXJ2ZXIoKQorIHByaXZhdGUgdmFyIHByb2Nlc3NvcjogVFByb2Nlc3NvcgorCisgaW5pdChhZGRyZXNzOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcGF0aDogU3RyaW5nPyA9IG5pbCwKKyAgICAgIHBvcnQ6IEludCwKKyAgICAgIHByb2Nlc3NvcjogVFByb2Nlc3NvciwKKyAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlKSB0aHJvd3MgeworCisgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgorCisgICBpZiBsZXQgYWRkcmVzcyA9IGFkZHJlc3MgeworICAgICBzZXJ2ZXIuc2VydmVyQWRkcmVzcyA9IGFkZHJlc3MKKyAgIH0KKyAgIHNlcnZlci5zZXJ2ZXJQb3J0ID0gVUludDE2KHBvcnQpCisKKyAgIHZhciByb3V0ZXMgPSBSb3V0ZXMoKQorICAgdmFyIHVyaSA9ICIvIgorICAgaWYgbGV0IHBhdGggPSBwYXRoIHsKKyAgICAgdXJpICs9IHBhdGgKKyAgIH0KKyAgIHJvdXRlcy5hZGQobWV0aG9kOiAucG9zdCwgdXJpOiB1cmkpIHsgcmVxdWVzdCwgcmVzcG9uc2UgaW4KKyAgICAgcFF1ZXVlLmFzeW5jIHsKKyAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoLmNvbnRlbnRUeXBlLCB2YWx1ZTogImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKworICAgICAgIGxldCBpdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KCkKKyAgICAgICBpZiBsZXQgYnl0ZXMgPSByZXF1ZXN0LnBvc3RCb2R5Qnl0ZXMgeworICAgICAgICAgbGV0IGRhdGEgPSBEYXRhKGJ5dGVzOiBieXRlcykKKyAgICAgICAgIGl0cmFucy5yZXNldChyZWFkQnVmZmVyOiBkYXRhKQorICAgICAgIH0KKworICAgICAgIGxldCBvdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeyB0cmFucywgYnVmZiBpbgorICAgICAgICAgbGV0IGFycmF5ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgICBBcnJheTxVSW50OD4oVW5zYWZlQnVmZmVyUG9pbnRlcihzdGFydDogJDAsIGNvdW50OiBidWZmLmNvdW50KSkKKyAgICAgICAgIH0KKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5vaworICAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShieXRlczogYXJyYXkpCisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0pCisKKyAgICAgICBsZXQgaW5wcm90byA9IEluUHJvdG9jb2wob246IGl0cmFucykKKyAgICAgICBsZXQgb3V0cHJvdG8gPSBPdXRQcm90b2NvbChvbjogb3RyYW5zKQorCisgICAgICAgZG8geworICAgICAgICAgdHJ5IHByb2Nlc3Nvci5wcm9jZXNzKG9uOiBpbnByb3RvLCBvdXRQcm90b2NvbDogb3V0cHJvdG8pCisgICAgICAgICB0cnkgb3RyYW5zLmZsdXNoKCkKKyAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5iYWRSZXF1ZXN0CisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0KKyAgICAgfQorICAgfQorICAgc2VydmVyLmFkZFJvdXRlcyhyb3V0ZXMpCisgfQorCisgZnVuYyBzZXJ2ZSgpIHRocm93cyB7CisgICB0cnkgc2VydmVyLnN0YXJ0KCkKKyB9Cit9CitgYGAKKworIyMjIyBFeGFtcGxlIFVzYWdlCitgYGBzd2lmdAorY2xhc3MgU2VydmljZUhhbmRsZXIgOiBTZXJ2aWNlIHsKKyAgICAuLi4KK30KK2xldCBzZXJ2ZXIgPSB0cnk/IFRQZXJmZWN0U2VydmVyKHBvcnQ6IDkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvcjogU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlOiBTZXJ2aWNlSGFuZGxlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm90b2NvbDogVEJpbmFyeVByb3RvY29sLnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZikKKwordHJ5PyBzZXJ2ZXI/LnNlcnZlKCkKK2BgYApkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ5MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorLy8vIEV4dGVuc2lvbnMgZm9yIExpbnV4IGZvciBpbmNvbXBsZXRlIEZvdW5kYXRpb24gQVBJJ3MuCisvLy8gc3dpZnQtY29yZWxpYnMtZm91bmRhdGlvbiBpcyBub3QgeWV0IDE6MSB3aXRoIE9TWC9pT1MgRm91bmRhdGlvbgorCitleHRlbnNpb24gQ0ZTb2NrZXRFcnJvciB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHN1Y2Nlc3MgPSBrQ0ZTb2NrZXRTdWNjZXNzCit9CisgIAorZXh0ZW5zaW9uIFVJbnQgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgJihsaHM6IFVJbnQsIHJoczogSW50KSAtPiBVSW50IHsKKyAgICBsZXQgY2FzdCA9IHVuc2FmZUJpdENhc3QocmhzLCB0bzogVUludC5zZWxmKQorICAgIHJldHVybiBsaHMgJiBjYXN0CisgIH0KK30KKworI2Vsc2UKK2V4dGVuc2lvbiBDRlN0cmVhbVByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBzaG91bGRDbG9zZU5hdGl2ZVNvY2tldCAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQpCisgIC8vIEV4aXN0cyBhcyBTdHJlYW0uUHJvcGVydHlLZXkuc29ja2V0U2VjdXJpdHlsZXZlbEtleSBidXQgZG9lc24ndCB3b3JrIHdpdGggQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkKKyAgc3RhdGljIGxldCBzb2NrZXRTZWN1cml0eUxldmVsICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCkKKyAgc3RhdGljIGxldCBTU0xTZXR0aW5ncyAgICAgICAgICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MpCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzOTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTU3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3B1YmxpYyBzdHJ1Y3QgVEFwcGxpY2F0aW9uRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSB1bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnZhbGlkTWVzc2FnZVR5cGUKKyAgICBjYXNlIHdyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgYmFkU2VxdWVuY2VJZAorICAgIGNhc2UgbWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgaW50ZXJuYWxFcnJvcgorICAgIGNhc2UgcHJvdG9jb2xFcnJvcgorICAgIGNhc2UgaW52YWxpZFRyYW5zZm9ybQorICAgIGNhc2UgaW52YWxpZFByb3RvY29sCisgICAgY2FzZSB1bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAKKyAgICAKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIFRBcHBsaWNhdGlvbkVycm9yIHdpdGggYSBUaHJpZnQgZXJyb3IgY29kZQorICAgIC8vLyBOb3JtYWxseSB0aGlzIHdvdWxkIGJlIGFjaGlldmVkIHdpdGggUmF3UmVwcmVzZW50YWJsZSBob3dldmVyCisgICAgLy8vIGJ5IGRvaW5nIHRoaXMgd2UgY2FuIGFsbG93IGZvciBhc3NvY2lhdGVkIHByb3BlcnRpZXMgb24gZW51bSBjYXNlcyBmb3IKKyAgICAvLy8gY2FzZSBzcGVjaWZpYyBjb250ZXh0IGRhdGEgaW4gYSBTd2lmdHksIHR5cGUtc2FmZSBtYW5uZXIuCisgICAgLy8vCisgICAgLy8vIC0gcGFyYW1ldGVyIHRocmlmdEVycm9yQ29kZTogSW50ZWdlciBUQXBwbGljYXRpb25FcnJvcihleGNlcHRpb24pIGVycm9yIGNvZGUuICAKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIDAgKC51bmtub3duKQorICAgIHB1YmxpYyBpbml0KHRocmlmdEVycm9yQ29kZTogSW50KSB7CisgICAgICBzd2l0Y2ggdGhyaWZ0RXJyb3JDb2RlIHsKKyAgICAgIGNhc2UgMTogIHNlbGYgPSAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDI6ICBzZWxmID0gLmludmFsaWRNZXNzYWdlVHlwZQorICAgICAgY2FzZSAzOiAgc2VsZiA9IC53cm9uZ01ldGhvZE5hbWUobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA0OiAgc2VsZiA9IC5iYWRTZXF1ZW5jZUlkCisgICAgICBjYXNlIDU6ICBzZWxmID0gLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA2OiAgc2VsZiA9IC5pbnRlcm5hbEVycm9yCisgICAgICBjYXNlIDc6ICBzZWxmID0gLnByb3RvY29sRXJyb3IKKyAgICAgIGNhc2UgODogIHNlbGYgPSAuaW52YWxpZFByb3RvY29sCisgICAgICBjYXNlIDk6ICBzZWxmID0gLmludmFsaWRUcmFuc2Zvcm0KKyAgICAgIGNhc2UgMTA6IHNlbGYgPSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICBkZWZhdWx0OiBzZWxmID0gLnVua25vd24KKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZDogICAgICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmludmFsaWRNZXNzYWdlVHlwZTogICAgIHJldHVybiAyCisgICAgICBjYXNlIC53cm9uZ01ldGhvZE5hbWU6ICAgICAgICByZXR1cm4gMworICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXN1bHQ6ICAgICAgICAgIHJldHVybiA1CisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICByZXR1cm4gNgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgcmV0dXJuIDcKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgIHJldHVybiA4CisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICByZXR1cm4gOQorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgcmV0dXJuIDEwCisgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICAvLy8gT3V0cHV0ICJmb3IgI21ldGhvZE5hbWUiIGlmIG1ldGhvZCBpcyBub3QgbmlsIGVsc2UgZW1wdHkKKyAgICAgIGxldCBtZXRob2RVbndyYXA6IChTdHJpbmc/KSAtPiBTdHJpbmcgPSAgeyBtZXRob2QgaW4KKyAgICAgICAgcmV0dXJuICJcKG1ldGhvZCA9PSBuaWwgPyAiIiA6ICIgZm9yIFwobWV0aG9kID8/ICIiKSIpIgorICAgICAgfQorICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRBcHBsaWNhdGlvbkVycm9yIgorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJVbmtub3duIE1ldGhvZFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UgVHlwZSIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZShsZXQgbWV0aG9kKTogIHJldHVybiAiV3JvbmcgTWV0aG9kIE5hbWVcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmJhZFNlcXVlbmNlSWQ6ICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIFNlcXVlbmNlIElEIgorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJNaXNzaW5nIFJlc3VsdFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW50ZXJuYWxFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBFcnJvciIKKyAgICAgIGNhc2UgLnByb3RvY29sRXJyb3I6ICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdG9jb2wgRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkUHJvdG9jb2w6ICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgUHJvdG9jb2wiCisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgVHJhbnNmb3JtIgorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBDbGllbnQgVHlwZSIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgaW5pdCgpIHsgfQorICAKKyAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlIGNvZGU6IEludCwgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCkgeworICAgIHNlbGYuZXJyb3IgPSBDb2RlKHRocmlmdEVycm9yQ29kZTogY29kZSkKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZXJyb3I6IENvZGUgPSAudW5rbm93bgorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyByZXR1cm4gLnVua25vd24gfQorfQorCitleHRlbnNpb24gVEFwcGxpY2F0aW9uRXJyb3IgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgdmFyIGVycm9yQ29kZTogSW50ID0gMAorICAgIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgICAgXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIGZpZWxkczogd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLnN0b3ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgIGNhc2UgKDEsIC5zdHJpbmcpOgorICAgICAgICBtZXNzYWdlID0gdHJ5IHByb3RvLnJlYWQoKQorICAgICAgY2FzZSAoMiwgLmkzMik6CisgICAgICAgIGVycm9yQ29kZSA9IEludCh0cnkgcHJvdG8ucmVhZCgpIGFzIEludDMyKQorICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgdHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICByZXR1cm4gVEFwcGxpY2F0aW9uRXJyb3IodGhyaWZ0RXJyb3JDb2RlOiBlcnJvckNvZGUsIG1lc3NhZ2U6IG1lc3NhZ2UpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogIm1lc3NhZ2UiLCB0eXBlOiAuc3RyaW5nLCBmaWVsZElEOiAxKQorICAgIHRyeSBwcm90by53cml0ZShtZXNzYWdlID8/ICIiKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICAKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKG5hbWU6ICJ0eXBlIiwgdHlwZTogLmkzMiwgZmllbGRJRDogMikKKyAgICBsZXQgdmFsID0gSW50MzIoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKQorICAgIHRyeSBwcm90by53cml0ZSh2YWwpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgcmV0dXJuIGVycm9yLnRocmlmdEVycm9yQ29kZSAmKyAobWVzc2FnZT8uaGFzaFZhbHVlID8/IDApCisgIH0KK30KKworcHVibGljIGZ1bmMgPT0obGhzOiBUQXBwbGljYXRpb25FcnJvciwgcmhzOiBUQXBwbGljYXRpb25FcnJvcikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuZXJyb3IudGhyaWZ0RXJyb3JDb2RlID09IHJocy5lcnJvci50aHJpZnRFcnJvckNvZGUgJiYgbGhzLm1lc3NhZ2UgPT0gcmhzLm1lc3NhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworZXh0ZW5zaW9uIERhdGEgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cmluZyB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBEYXRhIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKSBhcyBEYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVEJpbmFyeVByb3RvY29sVmVyc2lvbiB7CisgIHN0YXRpYyBsZXQgdmVyc2lvbjEgICAgPSBJbnQzMihiaXRQYXR0ZXJuOiAweDgwMDEwMDAwKQorICBzdGF0aWMgbGV0IHZlcnNpb25NYXNrID0gSW50MzIoYml0UGF0dGVybjogMHhmZmZmMDAwMCkKK30KKworcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbDogVFByb3RvY29sIHsKKyAgcHVibGljIHZhciBtZXNzYWdlU2l6ZUxpbWl0OiBVSW50MzIgID0gMAorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIC8vIGNsYXNzIGxldmVsIHByb3BlcnRpZXMgZm9yIHNldHRpbmcgZ2xvYmFsIGNvbmZpZyAodXNlZnVsIGZvciBzZXJ2ZXIgaW4gbGlldSBvZiBGYWN0b3J5IGRlc2lnbikKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0UmVhZDogQm9vbCA9IGZhbHNlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHN0cmljdFdyaXRlOiBCb29sID0gdHJ1ZQorCisgIHByaXZhdGUgdmFyIHN0cmljdFJlYWQ6IEJvb2wKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGU6IEJvb2wKKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKyAgdmFyIGN1cnJlbnRGaWVsZE5hbWU6IFN0cmluZz8KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHN0cmljdFJlYWQ6IEJvb2wsIHN0cmljdFdyaXRlOiBCb29sKSB7CisgICAgc2VsZi5pbml0KG9uOiB0cmFuc3BvcnQpCisgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICB9CisgIAorICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0V3JpdGUKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0UmVhZAorICB9CisgIAorICBmdW5jIHJlYWRTdHJpbmdCb2R5KF8gc2l6ZTogSW50KSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICAKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFN0cmluZyhkYXRhOiBkYXRhLCBlbmNvZGluZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpID8/ICIiCisgIH0KKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHZhciBtZXNzYWdlTmFtZSA9ICIiCisgICAgdmFyIHR5cGUgPSBUTWVzc2FnZVR5cGUuZXhjZXB0aW9uCisgICAgCisgICAgaWYgc2l6ZSA8IDAgeworICAgICAgbGV0IHZlcnNpb24gPSBzaXplICYgVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uTWFzaworICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6ICJcKHZlcnNpb24pIikpCisgICAgICB9CisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMihzaXplKSAmIDB4MDBGRikgPz8gdHlwZQorICAgICAgbWVzc2FnZU5hbWUgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIHN0cmljdFJlYWQgeworICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gIk1pc3NpbmcgbWVzc2FnZSB2ZXJzaW9uLCBvbGQgY2xpZW50PyBNZXNzYWdlIE5hbWU6IFwoY3VycmVudE1lc3NhZ2VOYW1lID8/ICIiKSIKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlKQorICAgICAgfQorICAgICAgaWYgbWVzc2FnZVNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IEludDMyKG1lc3NhZ2VTaXplTGltaXQpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IEludChtZXNzYWdlU2l6ZUxpbWl0KSwgZ290OiBJbnQoc2l6ZSkpKQorICAgICAgfQorICAgICAgCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkU3RyaW5nQm9keShJbnQoc2l6ZSkpCisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gdHlwZQorICAgIH0KKyAgICAKKyAgICBsZXQgc2VxSUQ6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHJldHVybiAobWVzc2FnZU5hbWUsIHR5cGUsIHNlcUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gVFR5cGUuc3RvcAorICAgIHZhciBmaWVsZElEOiBJbnQzMiA9IDAKKyAgICAKKyAgICBpZiBmaWVsZFR5cGUgIT0gLnN0b3AgeworICAgICAgZmllbGRJRCA9IEludDMyKHRyeSByZWFkKCkgYXMgSW50MTYpCisgICAgfQorICAgIAorICAgIHJldHVybiAoIiIsIGZpZWxkVHlwZSwgZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGtleVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBrZXlUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICAKKyAgICByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCB2YWx1ZVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciB2YWx1ZVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsZXQgZGF0YTogRGF0YSA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgc3RyID0gU3RyaW5nLmluaXQoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IC51dGY4KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsIG1lc3NhZ2U6ICJDb3VsZG4ndCBlbmNvZGUgVVRGLTggZnJvbSBkYXRhIHJlYWQiKQorICAgIH0KKyAgICByZXR1cm4gc3RyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuICh0cnkgcmVhZCgpIGFzIFVJbnQ4KSA9PSAxCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKQorICAgIH0KKyAgICByZXR1cm4gYnVmZlswXQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMikKKyAgICB9CisgICAgdmFyIHJldCA9IEludDE2KGJ1ZmZbMF0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDE2KGJ1ZmZbMV0gJiAweGZmKQorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDQpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQzMihidWZmWzBdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsxXSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbMl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbM10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDgpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQ2NChidWZmWzBdICYgMHhmZikgPDwgNTYKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsxXSAmIDB4ZmYpIDw8IDQ4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbMl0gJiAweGZmKSA8PCA0MAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzNdICYgMHhmZikgPDwgMzIKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls0XSAmIDB4ZmYpIDw8IDI0CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNV0gJiAweGZmKSA8PCAxNgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzZdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzddICYgMHhmZikKKyAgICAKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICBsZXQgdmFsID0gdHJ5IHJlYWQoKSBhcyBJbnQ2NAorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogVUludDY0KGJpdFBhdHRlcm46IHZhbCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHNpemUgPSBJbnQodHJ5IHJlYWQoKSBhcyBJbnQzMikKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGRhdGEKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHN0cmljdFdyaXRlIHsKKyAgICAgIGxldCB2ZXJzaW9uID0gVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSB8IEludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKQorICAgICAgdHJ5IHdyaXRlKHZlcnNpb24pCisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShVSW50OChtZXNzYWdlVHlwZS5yYXdWYWx1ZSkpCisgICAgICB0cnkgd3JpdGUoc2VxdWVuY2VJRCkKKyAgICB9CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChmaWVsZFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShJbnQxNihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChUVHlwZS5zdG9wLnJhd1ZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChrZXlUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoVUludDgodmFsdWVUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChlbGVtZW50VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZVZhbDogVUludDggPSB2YWx1ZSA/IDEgOiAwCisgICAgdHJ5IHdyaXRlKGJ5dGVWYWwpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBidWZmID0gRGF0YShieXRlczogW3ZhbHVlXSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQ4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA0MCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMzIpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDI0KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAxNikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgLy8gTm90YWJseSB1bnNhZmUsIHNpbmNlIERvdWJsZSBhbmQgSW50NjQgYXJlIHRoZSBzYW1lIHNpemUsIHRoaXMgc2hvdWxkIHdvcmsgZmluZQorICAgIHRyeSBzZWxmLndyaXRlKEludDY0KGJpdFBhdHRlcm46IHZhbHVlLmJpdFBhdHRlcm4pKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKEludDMyKGRhdGEuY291bnQpKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMyODhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworb3BlbiBjbGFzcyBUQ2xpZW50IHsKKyAgcHVibGljIGxldCBpblByb3RvY29sOiBUUHJvdG9jb2wKKyAgcHVibGljIGxldCBvdXRQcm90b2NvbDogVFByb3RvY29sCisKKyAgcmVxdWlyZWQgcHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSB7CisgICAgc2VsZi5pblByb3RvY29sID0gaW5vdXRQcm90b2NvbAorICAgIHNlbGYub3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgIH0KKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpblByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IG91dFByb3RvY29sCisgIH0KK30KKworCitvcGVuIGNsYXNzIFRBc3luY0NsaWVudDxQcm90b2NvbDogVFByb3RvY29sLCBGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB7CisgIHB1YmxpYyB2YXIgZmFjdG9yeTogRmFjdG9yeQorICBwdWJsaWMgaW5pdCh3aXRoIHByb3RvY29sOiBQcm90b2NvbC5UeXBlLCBmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9Cit9CisKKworcHVibGljIGVudW0gVEFzeW5jUmVzdWx0PFQ+IHsKKyAgY2FzZSBzdWNjZXNzKFQpCisgIGNhc2UgZXJyb3IoU3dpZnQuRXJyb3IpCisgIAorICBwdWJsaWMgZnVuYyB2YWx1ZSgpIHRocm93cyAtPiBUIHsKKyAgICBzd2l0Y2ggc2VsZiB7CisgICAgY2FzZSAuc3VjY2VzcyhsZXQgdCk6IHJldHVybiB0CisgICAgY2FzZSAuZXJyb3IobGV0IGUpOiB0aHJvdyBlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc3M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDU3NSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgZW51bSBUQ1R5cGU6IFVJbnQ4IHsKKyAgY2FzZSBzdG9wICAgICAgICAgID0gMHgwMAorICBjYXNlIGJvb2xlYW5fVFJVRSAgPSAweDAxCisgIGNhc2UgYm9vbGVhbl9GQUxTRSA9IDB4MDIKKyAgY2FzZSBpOCAgICAgICAgICAgID0gMHgwMworICBjYXNlIGkxNiAgICAgICAgICAgPSAweDA0CisgIGNhc2UgaTMyICAgICAgICAgICA9IDB4MDUKKyAgY2FzZSBpNjQgICAgICAgICAgID0gMHgwNgorICBjYXNlIGRvdWJsZSAgICAgICAgPSAweDA3CisgIGNhc2UgYmluYXJ5ICAgICAgICA9IDB4MDgKKyAgY2FzZSBsaXN0ICAgICAgICAgID0gMHgwOQorICBjYXNlIHNldCAgICAgICAgICAgPSAweDBBCisgIGNhc2UgbWFwICAgICAgICAgICA9IDB4MEIKKyAgY2FzZSBgc3RydWN0YCAgICAgID0gMHgwQworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZU1hc2s6IFVJbnQ4ID0gMHhFMCAvLyAxMTEwIDAwMDAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZUJpdHM6IFVJbnQ4ID0gMHgwNyAvLyAwMDAwIDAxMTEKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZVNoaWZ0QW1vdW50ID0gNQorIAorfQorCisKK3B1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgc3RhdGljIGxldCBwcm90b2NvbElEOiBVSW50OCAgPSAweDgyCisgIHB1YmxpYyBzdGF0aWMgbGV0IHZlcnNpb246IFVJbnQ4ICAgICA9IDEKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2s6IFVJbnQ4ID0gMHgxRiAvLyAwMDAxIDExMTEKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIAorICB2YXIgbGFzdEZpZWxkOiBbVUludDhdID0gW10KKyAgdmFyIGxhc3RGaWVsZElkOiBVSW50OCA9IDAKKyAgCisgIHZhciBib29sRmllbGROYW1lOiBTdHJpbmc/CisgIHZhciBib29sRmllbGRUeXBlOiBUVHlwZT8KKyAgdmFyIGJvb2xGaWVsZElkOiBJbnQzMj8KKyAgdmFyIGJvb2xlYW5WYWx1ZTogQm9vbD8KKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKworICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICB9CisKKyAgCisgIC8vLyBNYXJrOiAtIFRDb21wYWN0UHJvdG9jb2wgaGVscGVycworICAKKyAgZnVuYyB3cml0ZWJ5dGVEaXJlY3QoXyBieXRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZSA9IERhdGEoYnl0ZXM6IFtieXRlXSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBieXRlKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDMyKF8gdmFsOiBVSW50MzIpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciBpMzJidWYgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDUpCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMCB7CisgICAgICAgIGkzMmJ1ZltpZHhdID0gVUludDgodmFsKQorICAgICAgICBpZHggKz0gMQorICAgICAgICBicmVhaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCgodmFsICYgMHg3RikgfCAweDgwKQorICAgICAgICBpZHggKz0gMQorICAgICAgICB2YWwgPj49IDcKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogRGF0YShieXRlczogaTMyYnVmWzAuLjxpZHhdKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVWYXJpbnQ2NChfIHZhbDogVUludDY0KSB0aHJvd3MgeworICAgIHZhciB2YWwgPSB2YWwKKyAgICB2YXIgdmFyaW50NjRvdXQgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDEwKQorICAgIHZhciBpZHggPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBpZiAodmFsICYgfjB4N0YpID09IDB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICB2YXJpbnQ2NG91dFtpZHhdID0gVUludDgodmFsICYgMHg3RikgfCAweDgwCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiB2YXJpbnQ2NG91dFswLi48aWR4XSkpCisgICAgfQorICAKKyAgfQorICAKKyAgZnVuYyB3cml0ZUNvbGxlY3Rpb25CZWdpbihfIGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgbGV0IGN0eXBlID0gY29tcGFjdFR5cGUoZWxlbWVudFR5cGUpLnJhd1ZhbHVlCisgICAgaWYgc2l6ZSA8PSAxNCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFVJbnQ4KHNpemUgPDwgNCkgfCBjdHlwZSkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgweEYwIHwgY3R5cGUpCisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgfQorICB9CisgIAorICBmdW5jIHJlYWRCaW5hcnkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgcmVzdWx0ID0gRGF0YSgpCisgICAgaWYgc2l6ZSAhPSAwIHsKKyAgICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICAgIHJlc3VsdCA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50MzIoKSB0aHJvd3MgLT4gVUludDMyIHsKKyAgICB2YXIgcmVzdWx0OiBVSW50MzIgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50MzIgPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50MzIoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50NjQoKSB0aHJvd3MgLT4gVUludDY0IHsKKyAgICB2YXIgcmVzdWx0OiBVSW50NjQgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50NjQgPSAwCisgICAgCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50NjQoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKworICBmdW5jIHR0eXBlKF8gY29tcGFjdFR5cGVWYWw6IFVJbnQ4KSB0aHJvd3MgLT4gVFR5cGUgeworICAgIGd1YXJkIGxldCBjb21wYWN0VHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogY29tcGFjdFR5cGVWYWwpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIHZhbHVlOiBcKGNvbXBhY3RUeXBlVmFsKSIpCisgICAgfQorICAgIAorICAgIHN3aXRjaCBjb21wYWN0VHlwZSB7CisgICAgY2FzZSAuc3RvcDogcmV0dXJuIC5zdG9wOworICAgIGNhc2UgLmJvb2xlYW5fRkFMU0UsIC5ib29sZWFuX1RSVUU6IHJldHVybiAuYm9vbDsKKyAgICBjYXNlIC5pODogcmV0dXJuIC5pODsKKyAgICBjYXNlIC5pMTY6IHJldHVybiAuaTE2OworICAgIGNhc2UgLmkzMjogcmV0dXJuIC5pMzI7CisgICAgY2FzZSAuaTY0OiByZXR1cm4gLmk2NDsKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlOworICAgIGNhc2UgLmJpbmFyeTogcmV0dXJuIC5zdHJpbmc7CisgICAgY2FzZSAubGlzdDogcmV0dXJuIC5saXN0OworICAgIGNhc2UgLnNldDogcmV0dXJuIC5zZXQ7CisgICAgY2FzZSAubWFwOiByZXR1cm4gLm1hcDsKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0OworICAgIH0KKyAgfQorICAKKyAgZnVuYyBjb21wYWN0VHlwZShfIHR0eXBlOiBUVHlwZSkgLT4gVENUeXBlIHsKKyAgICBzd2l0Y2ggdHR5cGUgeworICAgIGNhc2UgLnN0b3A6ICAgcmV0dXJuIC5zdG9wCisgICAgY2FzZSAudm9pZDogICByZXR1cm4gLmk4CisgICAgY2FzZSAuYm9vbDogICByZXR1cm4gLmJvb2xlYW5fRkFMU0UKKyAgICBjYXNlIC5pODogICByZXR1cm4gLmk4CisgICAgY2FzZSAuZG91YmxlOiByZXR1cm4gLmRvdWJsZQorICAgIGNhc2UgLmkxNjogICAgcmV0dXJuIC5pMTYKKyAgICBjYXNlIC5pMzI6ICAgIHJldHVybiAuaTMyCisgICAgY2FzZSAuaTY0OiAgICByZXR1cm4gLmk2NAorICAgIGNhc2UgLnN0cmluZzogcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0CisgICAgY2FzZSAubWFwOiAgICByZXR1cm4gLm1hcAorICAgIGNhc2UgLnNldDogICAgcmV0dXJuIC5zZXQKKyAgICBjYXNlIC5saXN0OiAgIHJldHVybiAubGlzdAorICAgIGNhc2UgLnV0Zjg6ICAgcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC51dGYxNjogIHJldHVybiAuYmluYXJ5CisgICAgfQorICB9CisgIAorICAvLy8gWmlnWmFnIGVuY29kaW5nIG1hcHMgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIHNvIHRoYXQKKyAgLy8vIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCisgIC8vLyBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgLy8vICJ6aWctemFncyIgYmFjayBhbmQgZm9ydGggdGhyb3VnaCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGludGVnZXJzLAorICAvLy8gc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIG46IG51bWJlciB0byB6aWd6YWcKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IHppZ3phZ2VkIFVJbnQzMgorICBmdW5jIGkzMlRvWmlnWmFnKF8gbiA6IEludDMyKSAtPiBVSW50MzIgeworICAgIHJldHVybiBVSW50MzIoYml0UGF0dGVybjogSW50MzIobiA8PCAxKSBeIEludDMyKG4gPj4gMzEpKQorICB9CisKKyAgZnVuYyBpNjRUb1ppZ1phZyhfIG4gOiBJbnQ2NCkgLT4gVUludDY0IHsKKyAgICByZXR1cm4gVUludDY0KGJpdFBhdHRlcm46IEludDY0KG4gPDwgMSkgXiBJbnQ2NChuID4+IDYzKSkKKyAgfQorCisgIGZ1bmMgemlnWmFnVG9pMzIoXyBuOiBVSW50MzIpIC0+IEludDMyIHsKKyAgICByZXR1cm4gSW50MzIobiA+PiAxKSBeICgtSW50MzIobiAmIDEpKQorICB9CisgIAorICBmdW5jIHppZ1phZ1RvaTY0KF8gbjogVUludDY0KSAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIEludDY0KG4gPj4gMSkgXiAoLUludDY0KG4gJiAxKSkKKyAgfQorICAKKyAgCisgIAorICAvLy8gTWFyazogLSBUUHJvdG9jb2wgIAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHByb3RvY29sSWQ6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIAorICAgIGlmIHByb3RvY29sSWQgIT0gVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEIHsKKyAgICAgIGxldCBleHBlY3RlZCA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCkKKyAgICAgIGxldCBnb3QgICAgICA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIHByb3RvY29sSWQpCisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiV3JvbmcgUHJvdG9jb2wgSUQgXChnb3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC5taXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IGV4cGVjdGVkLCBnb3Q6IGdvdCkpCisKKyAgICB9CisKKyAgICBsZXQgdmVyc2lvbkFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIGxldCB2ZXJzaW9uOiBVSW50OCA9IHZlcnNpb25BbmRUeXBlICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaworICAgIGlmIHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuYmFkVmVyc2lvbihleHBlY3RlZDogIlwoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290OiJcKHZlcnNpb24pIikpCisKKyAgICB9CisgICAgCisgICAgbGV0IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gVUludDgoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpICYgVENUeXBlLnR5cGVCaXRzCisgICAgZ3VhcmQgbGV0IG10eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0eXBlKSkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUTWVzc2FnZVR5cGUgdmFsdWU6IFwodHlwZSkiKQorICAgIH0KKyAgICBsZXQgc2VxdWVuY2VJZCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGxldCBuYW1lOiBTdHJpbmcgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChuYW1lLCBtdHlwZSwgSW50MzIoc2VxdWVuY2VJZCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGFzdEZpZWxkLmFwcGVuZChsYXN0RmllbGRJZCkKKyAgICBsYXN0RmllbGRJZCA9IDAKKyAgICByZXR1cm4gIiIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgZ3VhcmQgbGV0IHR5cGUgPSBUQ1R5cGUocmF3VmFsdWU6IGJ5dGUgJiAweDBGKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRDVHlwZSBcKGJ5dGUgJiAweDBGKSIpCisgICAgfQorICAgIAorICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3ZlcgorICAgIGlmIHR5cGUgPT0gLnN0b3AgeworICAgICAgcmV0dXJuICgiIiwgLnN0b3AsIDApCisgICAgfQorICAgIAorICAgIHZhciBmaWVsZElkOiBJbnQxNiA9IDAKKyAgICAKKyAgICAvLyBtYXNrIG9mZiB0aGUgNE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuICBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEKKyAgICBsZXQgbW9kaWZpZXIgPSAoYnl0ZSAmIDB4RjApID4+IDQKKyAgICBpZiBtb2RpZmllciA9PSAwIHsKKyAgICAgIC8vIG5vdCBhIGRlbHRhLiAgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQKKyAgICAgIGZpZWxkSWQgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGhhcyBhIGRlbHRhLiAgYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgICAgZmllbGRJZCA9IEludDE2KGxhc3RGaWVsZElkICsgbW9kaWZpZXIpCisgICAgfQorICAgIAorICAgIGxldCBmaWVsZFR5cGUgPSB0cnkgdHR5cGUodHlwZS5yYXdWYWx1ZSkKKyAgICAKKyAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgIGlmIHR5cGUgPT0gLmJvb2xlYW5fVFJVRSB8fCB0eXBlID09IC5ib29sZWFuX0ZBTFNFIHsKKyAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlCisgICAgICBib29sZWFuVmFsdWUgPSB0eXBlID09IC5ib29sZWFuX1RSVUUKKyAgICB9CisgICAgCisgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSWQpCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBJbnQzMihmaWVsZElkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBsZW5ndGggPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICAKKyAgICB2YXIgcmVzdWx0OiBTdHJpbmcKKyAgICAKKyAgICBpZiBsZW5ndGggIT0gMCB7CisgICAgICBsZXQgZGF0YSA9IHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICAgICAgcmVzdWx0ID0gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gIiIKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIGlmIGxldCB2YWwgPSBib29sZWFuVmFsdWUgeworICAgICAgc2VsZi5ib29sZWFuVmFsdWUgPSBuaWwKKyAgICAgIHJldHVybiB2YWwKKyAgICB9IGVsc2UgeworICAgICAgbGV0IHJlc3VsdCA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICAgIHJldHVybiBUQ1R5cGUocmF3VmFsdWU6IHJlc3VsdCkgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmY6IFVJbnQ4ID0gMAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMSlbMF0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gSW50MTYoemlnWmFnVG9pMzIodikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHppZ1phZ1RvaTMyKHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQ2NCgpCisgICAgcmV0dXJuIHppZ1phZ1RvaTY0KHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgCisgICAgbGV0IGk2NDogVUludDY0ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeyAocHRyOiBVbnNhZmVQb2ludGVyPFVJbnQ4PikgLT4gVUludDY0IGluCisgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50NjQ+KE9wYXF1ZVBvaW50ZXIocHRyKSkucG9pbnRlZQorICAgIH0KKyAgICBsZXQgYml0cyA9IENGU3dhcEludDY0TGl0dGxlVG9Ib3N0KGk2NCkKKyAgICByZXR1cm4gRG91YmxlKGJpdFBhdHRlcm46IGJpdHMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiB0cnkgcmVhZEJpbmFyeShJbnQobGVuZ3RoKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIGtleUFuZFZhbHVlVHlwZTogVUludDggPSA4CisgICAgbGV0IHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAga2V5QW5kVmFsdWVUeXBlID0gdHJ5IHJlYWQoKQorICAgIH0KKyAgICAKKyAgICBsZXQga2V5VHlwZSA9IHRyeSB0dHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkKKyAgICBsZXQgdmFsdWVUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4RikKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgcmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZUFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIHZhciBzaXplOiBVSW50MzIgPSBVSW50MzIoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmCisgICAgaWYgc2l6ZSA9PSAxNSB7CisgICAgICBzaXplID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgfQorICAgIGxldCBlbGVtZW50VHlwZSA9IHRyeSB0dHlwZShzaXplQW5kVHlwZSAmIDB4MEYpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgIGxldCBuZXh0Qnl0ZTogVUludDggPSAoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDgoKFVJbnQzMihtZXNzYWdlVHlwZS5yYXdWYWx1ZSkgPDwgVUludDMyKFRDVHlwZS50eXBlU2hpZnRBbW91bnQpKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1R5cGUudHlwZU1hc2spCisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChuZXh0Qnl0ZSkKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2VxdWVuY2VJRCkpCisgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgCisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgZmllbGRUeXBlID09IC5ib29sIHsKKyAgICAgIGJvb2xGaWVsZE5hbWUgPSBuYW1lCisgICAgICBib29sRmllbGRUeXBlID0gZmllbGRUeXBlCisgICAgICBib29sRmllbGRJZCA9IGZpZWxkSUQKKyAgICAgIHJldHVybgorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogZmllbGRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IDB4RkYpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICAKKyAgICBsZXQgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IGNvbXBhY3RUeXBlKGZpZWxkVHlwZSkucmF3VmFsdWUgOiB0eXBlT3ZlcnJpZGUKKyAgICAKKyAgICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgICBsZXQgZGlmZiA9IFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQKKyAgICBpZiAoVUludDgoZmllbGRJRCkgPiBsYXN0RmllbGRJZCkgJiYgKGRpZmYgPD0gMTUpIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoKFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSkKKyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHR5cGVUb1dyaXRlKQorICAgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICAgIH0KKyAgICAKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSUQpCisgICAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENUeXBlLnN0b3AucmF3VmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBzaXplID09IDAgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgwKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgICAKKyAgICAgIGxldCBjb21wYWN0ZWRUeXBlcyA9IGNvbXBhY3RUeXBlKGtleVR5cGUpLnJhd1ZhbHVlIDw8IDQgfCBjb21wYWN0VHlwZSh2YWx1ZVR5cGUpLnJhd1ZhbHVlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KGNvbXBhY3RlZFR5cGVzKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKHZhbHVlLmRhdGEodXNpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgaWYgbGV0IGJvb2xGaWVsZElkID0gYm9vbEZpZWxkSWQsIGxldCBib29sRmllbGRUeXBlID0gYm9vbEZpZWxkVHlwZSwKKyAgICAgICBsZXQgYm9vbEZpZWxkTmFtZSA9IGJvb2xGaWVsZE5hbWUgeworICAgICAgCisgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgIGxldCBjb21wYWN0VHlwZTogVENUeXBlID0gdmFsdWUgPyAuYm9vbGVhbl9UUlVFIDogLmJvb2xlYW5fRkFMU0UKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBib29sRmllbGROYW1lLCB0eXBlOiBib29sRmllbGRUeXBlLCBmaWVsZElEOiBib29sRmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IGNvbXBhY3RUeXBlLnJhd1ZhbHVlKQorICAgICAgc2VsZi5ib29sRmllbGRJZCA9IG5pbAorICAgICAgc2VsZi5ib29sRmllbGRUeXBlID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZE5hbWUgPSBuaWwKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHZhbHVlID8gVENUeXBlLmJvb2xlYW5fVFJVRS5yYXdWYWx1ZSA6IFRDVHlwZS5ib29sZWFuX0ZBTFNFLnJhd1ZhbHVlKQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyhJbnQzMih2YWx1ZSkpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyh2YWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDY0KGk2NFRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHZhciBiaXRzID0gQ0ZTd2FwSW50NjRIb3N0VG9MaXR0bGUodmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgZGF0YSA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYml0cykgeworICAgICAgcmV0dXJuIERhdGEoYnl0ZXM6IFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKSwgY291bnQ6IE1lbW9yeUxheW91dDxVSW50NjQ+LnNpemUpCisgICAgfQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKGRhdGEuY291bnQpKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdApAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcHVibGljIHByb3RvY29sIFRFbnVtIDogVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICB2YXIgcmF3VmFsdWU6IEludDMyIHsgZ2V0IH0KK30KKworZXh0ZW5zaW9uIFRFbnVtIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeyByZXR1cm4gcmF3VmFsdWUuaGFzaFZhbHVlIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShyYXdWYWx1ZSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw3NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisvLy8gVEVycm9yQ29kZQorLy8vCisvLy8gUHJvdG9jb2wgZm9yIFRFcnJvciBjb25mb3JtZXJzJyBlbnVtJ3MgdG8gY29uZm9ybSB0by4KKy8vLyBHZW5lcmljIEludCBUaHJpZnQgZXJyb3IgY29kZSB0byBhbGxvdyBlcnJvciBjYXNlcyB0byBoYXZlCisvLy8gYXNzb2NpYXRlZCB2YWx1ZXMuCitwdWJsaWMgcHJvdG9jb2wgVEVycm9yQ29kZSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlIHsKKyAgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgZ2V0IH0KK30KKworLy8vIFRFcnJvcgorLy8vCisvLy8gQmFzZSBwcm90b2NvbCBmb3IgYWxsIFRocmlmdCBFcnJvcihFeGNlcHRpb24pIHR5cGVzIHRvIGNvbmZvcm0gdG8KK3B1YmxpYyBwcm90b2NvbCBURXJyb3IgOiBFcnJvciwgQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworCisgIC8vLyBFbnVtIGZvciBlcnJvciBjYXNlcy4gIENhbiBiZSB0eXBlYWxpYXNlZCB0byBhbnkgY29uZm9ybWluZyBlbnVtCisgIC8vLyBvciBkZWZpbmVkIG5lc3RlZC4KKyAgYXNzb2NpYXRlZHR5cGUgQ29kZTogVEVycm9yQ29kZQorICAKKyAgLy8vIEVycm9yIENhc2UsIHZhbHVlIGZyb20gaW50ZXJuYWwgZW51bQorICB2YXIgZXJyb3I6IENvZGUgeyBnZXQgc2V0IH0KKyAgCisgIC8vLyBPcHRpb25hbCBhZGRpdGlvbmFsIG1lc3NhZ2UKKyAgdmFyIG1lc3NhZ2U6IFN0cmluZz8geyBnZXQgc2V0IH0KKyAgCisgIC8vLyBEZWZhdWx0IGVycm9yIGNhc2UgZm9yIHRoZSBlcnJvciB0eXBlLCB1c2VkIGZvciBnZW5lcmljIGluaXQoKQorICBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorfQorCitleHRlbnNpb24gVEVycm9yIHsKKyAgLy8vIEh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGVycm9yLiBEZWZhdWx0IHByb3ZpZGVkIGZvciB5b3UgaW4gdGhlCisgIC8vLyBmb3JtYXQgXChTZWxmLnNlbGYpOiBcKGVycm9yLmVycm9yRGVzY3JpcHRpb24pIFxuIG1lc3NhZ2UKKyAgLy8vIGVnOgorICAvLy8KKyAgLy8vICAgICBUQXBwbGljYXRpb25FcnJvciAoMSk6IEludmFsaWQgTWVzc2FnZSBUeXBlCisgIC8vLyAgICAgQW4gdW5rbm93biBFcnJvciBoYXMgb2NjdXJlZC4KKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoU2VsZi5zZWxmKSAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpKTogIiArIGVycm9yLmRlc2NyaXB0aW9uICsgIlxuIgorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorCisgIC8vLyBTaW1wbGUgZGVmYXVsdCBJbml0aWFsaXplciBmb3IgVEVycm9yJ3MKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBlcnJvcjogICBFcnJvckNvZGUgdmFsdWUuICBEZWZhdWx0OiBkZWZhdWx0Q2FzZQorICAvLy8gLSBwYXJhbWV0ZXIgbWVzc2FnZTogQ3VzdG9tIG1lc3NhZ2Ugd2l0aCBlcnJvci4gIE9wdGlvbmFsCisgIC8vLworICAvLy8gLSByZXR1cm5zOiA8I3JldHVybiB2YWx1ZSBkZXNjcmlwdGlvbiM+CisgIHB1YmxpYyBpbml0KGVycm9yOiBDb2RlLCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNWZlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBURmlsZUhhbmRsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBpbnB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIG91dHB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgCisgIHB1YmxpYyBpbml0KGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSkgeworICAgIHNlbGYuaW5wdXRGaWxlSGFuZGxlID0gaW5wdXRGaWxlSGFuZGxlCisgICAgc2VsZi5vdXRwdXRGaWxlSGFuZGxlID0gb3V0cHV0RmlsZUhhbmRsZQorICB9CisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChmaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbml0KGlucHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHdoaWxlIGRhdGEuY291bnQgPCBzaXplIHsKKyAgICAgIGxldCByZWFkID0gaW5wdXRGaWxlSGFuZGxlLnJlYWREYXRhKG9mTGVuZ3RoOiBzaXplIC0gZGF0YS5jb3VudCkKKyAgICAgIGRhdGEuYXBwZW5kKHJlYWQpCisgICAgICBpZiByZWFkLmNvdW50ID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIG91dHB1dEZpbGVIYW5kbGUud3JpdGUoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIyNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyNlbmRpZgorCisvLy8gVEZpbGVUcmFuc3BvcnQKKy8vLyBGb3VuZGF0aW9uLWxlc3MgU3dpZnQgRmlsZSB0cmFuc3BvcnQuCisvLy8gVXNlcyBDIGZvcGVuL2ZyZWFkL2Z3cml0ZSwKKy8vLyBwcm92aWRlZCBieSBHbGliYyBpbiBsaW51eCBhbmQgRGFyd2luIG9uIE9TWC9pT1MKK3B1YmxpYyBjbGFzcyBURmlsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPj8gPSBuaWwKKyAgCisgIHB1YmxpYyBpbml0IChmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPikgeworICAgIHNlbGYuZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PworICAgIGZpbGVuYW1lLndpdGhDU3RyaW5nKHsgY0ZpbGVuYW1lIGluCisgICAgICAicnciLndpdGhDU3RyaW5nKHsgY01vZGUgaW4KKyAgICAgICAgZmlsZUhhbmRsZSA9IGZvcGVuKGNGaWxlbmFtZSwgY01vZGUpCisgICAgICB9KQorICAgIH0pCisgICAgaWYgbGV0IGZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlIHsKKyAgICAgIHNlbGYuaW5pdChmaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgIH0KKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBmY2xvc2Uoc2VsZi5maWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIAorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgLy8gc2V0IHVwIHJlYWQgYnVmZmVyLCBwb3NpdGlvbiAwCisgICAgdmFyIHJlYWQgPSBEYXRhKGNhcGFjaXR5OiBzaXplKQorICAgIHZhciBwb3NpdGlvbiA9IDAKKyAgICAKKyAgICAvLyByZWFkIGNoYXJhY3RlciBidWZmZXIKKyAgICB2YXIgbmV4dENoYXI6IFVJbnQ4ID0gMAorICAgIAorICAgIC8vIGNvbnRpbnVlIHVudGlsIHdlJ3ZlIHJlYWQgc2l6ZSBieXRlcworICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgIGlmIGZyZWFkKCZuZXh0Q2hhciwgMSwgMSwgc2VsZi5maWxlSGFuZGxlKSA9PSAxIHsKKyAgICAgICAgcmVhZFtwb3NpdGlvbl0gPSBuZXh0Q2hhcgorCisgICAgICAgIC8vIEluY3JlbWVudCBvdXRwdXQgYnl0ZSBwb2ludGVyCisgICAgICAgIHBvc2l0aW9uICs9IDEKKyAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgbGV0IGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgIGZ3cml0ZSgkMCwgMSwgZGF0YS5jb3VudCwgc2VsZi5maWxlSGFuZGxlKQorICAgIH0KKyAgICBpZiBieXRlc1dyaXR0ZW4gIT0gZGF0YS5jb3VudCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM4NWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgc3RhdGljIGxldCBoZWFkZXJTaXplICAgID0gNAorICBwdWJsaWMgc3RhdGljIGxldCBpbml0RnJhbWVTaXplID0gMTAyNAorICBwcml2YXRlIHN0YXRpYyBsZXQgZGVmYXVsdE1heExlbmd0aCA9IDE2Mzg0MDAwCisKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICBwcml2YXRlIHZhciBtYXhTaXplICAgICA9IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aAorICBwcml2YXRlIHZhciByZW1haW5pbmdCeXRlcyA9IDAKKworCisgIHB1YmxpYyBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgbWF4U2l6ZTogSW50KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICBzZWxmLm1heFNpemUgPSBtYXhTaXplCisgIH0KKworICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLmluaXQodHJhbnNwb3J0OiB0cmFuc3BvcnQsIG1heFNpemU6IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aCkKKyAgfQorCisgIGZ1bmMgcmVhZEhlYWRlcigpIHRocm93cyB7CisgICAgbGV0IHJlYWQgPSB0cnkgdHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplKQorICAgIHJlbWFpbmluZ0J5dGVzID0gSW50KGRlY29kZUZyYW1lU2l6ZShkYXRhOiByZWFkKSkKKyAgfQorCisgIC8vLyBNYXJrOiAtIFRUcmFuc3BvcnQKKworICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHdoaWxlIChyZW1haW5pbmdCeXRlcyA8PSAwKSB7CisgICAgICAgIHRyeSByZWFkSGVhZGVyKCkKKyAgICB9CisKKyAgICBsZXQgdG9SZWFkID0gbWluKHNpemUsIHJlbWFpbmluZ0J5dGVzKQorCisgICAgaWYgdG9SZWFkIDwgMCB7CisgICAgICAgIHRyeSBjbG9zZSgpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5lZ2F0aXZlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKFwodG9SZWFkKSkhIikKKyAgICB9CisKKyAgICBpZiB0b1JlYWQgPiBtYXhTaXplIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuc2l6ZUxpbWl0KGxpbWl0OiBtYXhTaXplLCBnb3Q6IHRvUmVhZCkpCisgICAgfQorCisgICAgcmV0dXJuIHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiB0b1JlYWQpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gY29weSBidWZmZXIgYW5kIHJlc2V0CisgICAgbGV0IGJ1ZmYgPSB3cml0ZUJ1ZmZlcgorICAgIHdyaXRlQnVmZmVyID0gRGF0YSgpCisKKyAgICBpZiBidWZmLmNvdW50IC0gVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplIDwgMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKworICAgIGxldCBmcmFtZVNpemUgPSBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKGJ1ZmYuY291bnQpKQorCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBmcmFtZVNpemUpCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIHRyeSB0cmFuc3BvcnQuZmx1c2goKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB3cml0ZUJ1ZmZlci5hcHBlbmQoZGF0YSkKKyAgfQorCisKKworICBwcml2YXRlIGZ1bmMgZW5jb2RlRnJhbWVTaXplKHNpemU6IFVJbnQzMikgLT4gRGF0YSB7CisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDI0KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDE2KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDgpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUpKV0pKQorCisgICAgcmV0dXJuIGRhdGEKKyAgfQorCisgIHByaXZhdGUgZnVuYyBkZWNvZGVGcmFtZVNpemUoZGF0YTogRGF0YSkgLT4gVUludDMyIHsKKyAgICB2YXIgc2l6ZTogVUludDMyCisgICAgc2l6ZSAgPSAoVUludDMyKGRhdGFbMF0gJiAweGZmKSA8PCAyNCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVsxXSAmIDB4ZmYpIDw8IDE2KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzJdICYgMHhmZikgPDwgIDgpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbM10gJiAweGZmKSkKKyAgICByZXR1cm4gc2l6ZQorICB9CisKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB0aHJvd3MgeworICAgIHRyeSB0cmFuc3BvcnQuY2xvc2UoKQorICB9CisKKyAgcHVibGljIGZ1bmMgb3BlbigpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5vcGVuKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5pc09wZW4oKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwYWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBEaXNwYXRjaAorCisKK3B1YmxpYyBjbGFzcyBUSFRUUFNlc3Npb25UcmFuc3BvcnQ6IFRBc3luY1RyYW5zcG9ydCB7CisgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHVibGljIHZhciByZXNwb25zZVZhbGlkYXRlOiAoKEhUVFBVUkxSZXNwb25zZT8sIERhdGE/KSB0aHJvd3MgLT4gVm9pZCk/CisgICAgCisgICAgdmFyIHNlc3Npb246IFVSTFNlc3Npb24KKyAgICB2YXIgdXJsOiBVUkwKKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgZnVuYyBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb24oXyBjb25maWc6IFVSTFNlc3Npb25Db25maWd1cmF0aW9uLCB3aXRoUHJvdG9jb2xOYW1lIHByb3RvY29sTmFtZTogU3RyaW5nPykgeworICAgICAgdmFyIHRocmlmdENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorICAgICAgCisgICAgICBpZiBsZXQgcHJvdG9jb2xOYW1lID0gcHJvdG9jb2xOYW1lIHsKKyAgICAgICAgdGhyaWZ0Q29udGVudFR5cGUgKz0gIjsgcD1cKHByb3RvY29sTmFtZSkiCisgICAgICB9CisgICAgICAKKyAgICAgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSAucmVsb2FkSWdub3JpbmdMb2NhbENhY2hlRGF0YQorICAgICAgY29uZmlnLnVybENhY2hlID0gbmlsCisgICAgICAKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkVXNlUGlwZWxpbmluZyAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cFNob3VsZFNldENvb2tpZXMgICAgID0gdHJ1ZQorICAgICAgY29uZmlnLmh0dHBBZGRpdGlvbmFsSGVhZGVycyAgICA9IFsiQ29udGVudC1UeXBlIjogdGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NlcHQiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiAiVGhyaWZ0L1N3aWZ0IChTZXNzaW9uKSJdCisgICAgICAKKyAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW5pdChzZXNzaW9uOiBVUkxTZXNzaW9uLCB1cmw6IFVSTCkgeworICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgorICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVEhUVFBTZXNzaW9uVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiBUSFRUUFNlc3Npb25UcmFuc3BvcnQoZmFjdG9yeTogc2VsZikKKyAgICB9CisgICAgCisgICAgZnVuYyB2YWxpZGF0ZVJlc3BvbnNlKF8gcmVzcG9uc2U6IEhUVFBVUkxSZXNwb25zZT8sIGRhdGE6IERhdGE/KSB0aHJvd3MgeworICAgICAgdHJ5IHJlc3BvbnNlVmFsaWRhdGU/KHJlc3BvbnNlLCBkYXRhKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHRhc2tXaXRoUmVxdWVzdChfIHJlcXVlc3Q6IFVSTFJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBAZXNjYXBpbmcgKERhdGE/LCBVUkxSZXNwb25zZT8sIEVycm9yPykgLT4gKCkpIHRocm93cyAtPiBVUkxTZXNzaW9uVGFzayB7CisgICAgICAKKyAgICAgIGxldCBuZXdUYXNrOiBVUkxTZXNzaW9uVGFzaz8gPSBzZXNzaW9uLmRhdGFUYXNrKHdpdGg6IHJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBjb21wbGV0aW9uSGFuZGxlcikKKyAgICAgIGlmIGxldCBuZXdUYXNrID0gbmV3VGFzayB7CisgICAgICAgIHJldHVybiBuZXdUYXNrCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIGRhdGEgdGFzayIpCisgICAgICB9CisgICAgfSAgICAKKyAgfQorICAKKyAgdmFyIGZhY3Rvcnk6IEZhY3RvcnkKKyAgdmFyIHJlcXVlc3REYXRhID0gRGF0YSgpCisgIHZhciByZXNwb25zZURhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YU9mZnNldDogSW50ID0gMAorICAKKyAgaW5pdChmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGF2YWlsID0gcmVzcG9uc2VEYXRhLmNvdW50IC0gcmVzcG9uc2VEYXRhT2Zmc2V0CisgICAgbGV0IChzdGFydCwgc3RvcCkgPSAocmVzcG9uc2VEYXRhT2Zmc2V0LCByZXNwb25zZURhdGFPZmZzZXQgKyBtaW4oc2l6ZSwgYXZhaWwpKQorICAgIGxldCByZWFkID0gcmVzcG9uc2VEYXRhLnN1YmRhdGEoaW46IHN0YXJ0Li48c3RvcCkKKyAgICByZXNwb25zZURhdGFPZmZzZXQgKz0gcmVhZC5jb3VudAorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgcmVxdWVzdERhdGEuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKF8gY29tcGxldGVkOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPiBWb2lkKSB7CisgICAgdmFyIGVycm9yOiBFcnJvcj8KKyAgICB2YXIgdGFzazogVVJMU2Vzc2lvblRhc2s/CisgICAgCisgICAgdmFyIHJlcXVlc3QgPSBVUkxSZXF1ZXN0KHVybDogZmFjdG9yeS51cmwpCisgICAgcmVxdWVzdC5odHRwTWV0aG9kID0gIlBPU1QiCisgICAgcmVxdWVzdC5odHRwQm9keSA9ICByZXF1ZXN0RGF0YQorCisgICAgcmVxdWVzdERhdGEgPSBEYXRhKCkKKworICAgIGRvIHsKKyAgICAgIHRhc2sgPSB0cnkgZmFjdG9yeS50YXNrV2l0aFJlcXVlc3QocmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IHsgKGRhdGEsIHJlc3BvbnNlLCB0YXNrRXJyb3IpIGluCisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIG5ldHdvcmsKKyAgICAgICAgaWYgdGFza0Vycm9yICE9IG5pbCB7CisgICAgICAgICAgICBlcnJvciA9IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnRpbWVkT3V0KQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayByZXNwb25zZSB0eXBlCisgICAgICAgIGlmIHRhc2tFcnJvciA9PSBuaWwgJiYgIShyZXNwb25zZSBpcyBIVFRQVVJMUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRSZXNwb25zZSkKKyAgICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgICAgICBpZiBsZXQgaHR0cFJlc3BvbnNlID0gcmVzcG9uc2UgYXM/IEhUVFBVUkxSZXNwb25zZSB7CisgICAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDAgeworICAgICAgICAgICAgaWYgaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5pbnZhbGlkU3RhdHVzKHN0YXR1c0NvZGU6IGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIHRyeSBzZWxmLmZhY3RvcnkudmFsaWRhdGVSZXNwb25zZShodHRwUmVzcG9uc2UsIGRhdGE6IGRhdGEpCisgICAgICAgICAgICB9IGNhdGNoIGxldCB2YWxpZGF0ZUVycm9yIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZUVycm9yCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhT2Zmc2V0ID0gMAorICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IERhdGEoKQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IGRhdGEgPz8gRGF0YSgpCisgICAgICAgICAgfQorICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgfQorICAgICAgfSkKKyAgICAgIAorICAgIH0gY2F0Y2ggbGV0IHRhc2tFcnJvciB7CisgICAgICBlcnJvciA9IHRhc2tFcnJvcgorICAgIH0KKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBlcnJvciwgdGFzayA9PSBuaWwgeworICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgIH0KKyAgICB0YXNrPy5yZXN1bWUoKQorICB9CisKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIGxldCBjb21wbGV0ZWQgPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKKyAgICB2YXIgaW50ZXJuYWxFcnJvcjogRXJyb3I/CisgICAgCisgICAgZmx1c2goKSB7IF8sIGVycm9yIGluCisgICAgICBpbnRlcm5hbEVycm9yID0gZXJyb3IKKyAgICAgIGNvbXBsZXRlZC5zaWduYWwoKQorICAgIH0KKyAgICAKKyAgICBfID0gY29tcGxldGVkLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCisgICAgCisgICAgaWYgbGV0IGVycm9yID0gaW50ZXJuYWxFcnJvciB7CisgICAgICB0aHJvdyBlcnJvcgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM5ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTGlzdDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBSYW5kb21BY2Nlc3NDb2xsZWN0aW9uLCBNdXRhYmxlQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBBcnJheTxFbGVtZW50PgorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKworICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICBwdWJsaWMgaW5pdCgpIHsgfQorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLmxpc3QgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRMaXN0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBlbGVtZW50VHlwZSkpCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxpc3Quc3RvcmFnZS5hcHBlbmQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICByZXR1cm4gbGlzdAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGUoZWxlbWVudCwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0RW5kKCkKKyAgfQorCisgIC8vLyBNYXJrOiBNdXRhYmxlQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcG9zaXRpb25dID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocmFuZ2U6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtyYW5nZV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcmFuZ2VdID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IEluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYmVmb3JlIGk6IGlub3V0IEludCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGJlZm9yZTogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBpbmRleChiZWZvcmUgaTogSW50KSAtPiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGJlZm9yZTogaSkKKyAgfQorCit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IFJhbmdlUmVwbGFjZWFibGVDb2xsZWN0aW9uIHsKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVwbGFjZVN1YnJhbmdlPEM6IENvbGxlY3Rpb24+KF8gc3VicmFuZ2U6IFJhbmdlPEluZGV4Piwgd2l0aCBuZXdFbGVtZW50czogQykKKyAgICB3aGVyZSBDLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZS5yZXBsYWNlU3VicmFuZ2Uoc3VicmFuZ2UsIHdpdGg6IG5ld0VsZW1lbnRzKQorICB9Cit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRMaXN0PEVsZW1lbnQ+LCByaHM6IFRMaXN0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAgPT0gJDEgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MDM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZSwgVmFsdWUgOiBUU2VyaWFsaXphYmxlPjogQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeURpY3Rpb25hcnlMaXRlcmFsLCBIYXNoYWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IERpY3Rpb25hcnk8S2V5LCBWYWx1ZT4KKyAgcHVibGljIHR5cGVhbGlhcyBFbGVtZW50ID0gU3RvcmFnZS5FbGVtZW50CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIC8vLyBNYXJrOiBCZSBMaWtlIERpY3Rpb25hcnkKKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KF8ga2V5OiBLZXkpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZVZhbHVlKF8gdmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChfIGluZGV4OiBEaWN0aW9uYXJ5SW5kZXg8S2V5LCBWYWx1ZT4pIC0+IChLZXksIFZhbHVlKSB7CisgICAgcmV0dXJuIHJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZVZhbHVlRm9yS2V5KF8ga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlVmFsdWUoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UobWluaW11bUNhcGFjaXR5OiBtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIC8vLyBpbml0IGZyb20gRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyBpbml0KF8gZGljdDogW0tleTogVmFsdWVdKSB7CisgICAgc3RvcmFnZSA9IGRpY3QKKyAgfQorCisgIC8vLyByZWFkIG9ubHkgYWNjZXNzIHRvIHN0b3JhZ2UgaWYgbmVlZGVkIGFzIERpY3Rpb25hcnk8SyxWPgorICBwdWJsaWMgdmFyIGRpY3Rpb25hcnk6IFtLZXk6IFZhbHVlXSB7CisgICAgcmV0dXJuIHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHZhciBpbmRpY2VzOiBJbmRpY2VzIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRpY2VzCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGRpc3RhbmNlKGZyb20gc3RhcnQ6IEluZGV4LCB0byBlbmQ6IEluZGV4KSAtPiBJbmRleERpc3RhbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kaXN0YW5jZShmcm9tOiBzdGFydCwgdG86IGVuZCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlLCBsaW1pdGVkQnkgbGltaXQ6IEluZGV4KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuLCBsaW1pdGVkQnk6IGxpbWl0KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKyAgCisgIC8vLyBNYXJrOiBEaWN0aW9uYXJ5TGl0ZXJhbENvbnZlcnRpYmxlCisgIAorICBwdWJsaWMgaW5pdChkaWN0aW9uYXJ5TGl0ZXJhbCBlbGVtZW50czogKEtleSwgVmFsdWUpLi4uKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZWxlbWVudHMgeworICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGtleS5oYXNoVmFsdWUKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5tYXAgfQorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKworICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTWFwQmVnaW4oKQorICAgIGlmIHNpemUgPiAwIHsKKyAgICAgIGlmIGtleVR5cGUgIT0gS2V5LnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIEtleSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGtleVR5cGUpKQorICAgICAgfQorICAgICAgaWYgdmFsdWVUeXBlICE9IFZhbHVlLnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIFZhbHVlIFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogdmFsdWVUeXBlKSkKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWFwID0gVE1hcCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGtleSA9IHRyeSBLZXkucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbWFwLnN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTWFwRW5kKCkKKyAgICByZXR1cm4gbWFwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTWFwQmVnaW4oa2V5VHlwZTogS2V5LnRocmlmdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiBWYWx1ZS50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlKGtleSwgdG86IHByb3RvKQorICAgICAgdHJ5IFZhbHVlLndyaXRlKHZhbHVlLCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZU1hcEVuZCgpCisgIH0KK30KKworLy8vIE1hcms6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlCisKK2V4dGVuc2lvbiBUTWFwIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKKy8vLyBNYXJrOiBFcXVhdGFibGUKKworcHVibGljIGZ1bmMgPT08S2V5LCBWYWx1ZT4obGhzOiBUTWFwPEtleSxWYWx1ZT4sIHJoczogVE1hcDxLZXksIFZhbHVlPikgLT4gQm9vbCB7CisgIGlmIGxocy5jb3VudCAhPSByaHMuY291bnQgeworICAgIHJldHVybiBmYWxzZQorICB9CisgIHJldHVybiBsaHMuc3RvcmFnZS5lbGVtZW50c0VxdWFsKHJocy5zdG9yYWdlKSB7ICQwLmtleSA9PSAkMS5rZXkgJiYgJDAudmFsdWUgPT0gJDEudmFsdWUgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1OGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciByZWFkQnVmZmVyID0gRGF0YSgpCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHdyaXRlQnVmZmVyID0gRGF0YSgpCisgIAorICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciBwb3NpdGlvbiA9IDAKKworICBwdWJsaWMgdmFyIGJ5dGVzUmVtYWluaW5nSW5CdWZmZXI6IEludCB7CisgICAgcmV0dXJuIHJlYWRCdWZmZXIuY291bnQgLSBwb3NpdGlvbgorICB9CisgIAorICBwdWJsaWMgZnVuYyBjb25zdW1lQnVmZmVyKHNpemU6IEludCkgeworICAgIHBvc2l0aW9uICs9IHNpemUKKyAgfQorICBwdWJsaWMgZnVuYyBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyID0gRGF0YSgpCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgfQorICAKKyAgCisgIHByaXZhdGUgdmFyIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/CisgIAorICBwdWJsaWMgaW5pdChmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPyA9IG5pbCkgeworICAgIHNlbGYuZmx1c2hIYW5kbGVyID0gZmx1c2hIYW5kbGVyCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHJlYWRCdWZmZXI6IERhdGEsIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlc2V0KHJlYWRCdWZmZXI6IERhdGEgPSBEYXRhKCksIHdyaXRlQnVmZmVyOiBEYXRhID0gRGF0YSgpKSB7CisgICAgc2VsZi5yZWFkQnVmZmVyID0gcmVhZEJ1ZmZlcgorICAgIHNlbGYud3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlcgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBhbW91bnRUb1JlYWQgPSBtaW4oYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlciwgc2l6ZSkKKyAgICBpZiBhbW91bnRUb1JlYWQgPiAwIHsKKyAgICAgIGxldCByZXQgPSByZWFkQnVmZmVyLnN1YmRhdGEoaW46IFJhbmdlKHVuY2hlY2tlZEJvdW5kczogKGxvd2VyOiBwb3NpdGlvbiwgdXBwZXI6IHBvc2l0aW9uICsgYW1vdW50VG9SZWFkKSkpCisgICAgICBwb3NpdGlvbiArPSByZXQuY291bnQKKyAgICAgIHJldHVybiByZXQKKyAgICB9CisgICAgcmV0dXJuIERhdGEoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgZmx1c2hIYW5kbGVyPyhzZWxmLCB3cml0ZUJ1ZmZlcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E4ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSw0NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+OiBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sPiB7CisgIHB1YmxpYyBsZXQgc2VwYXJhdG9yID0gIjoiCisKKyAgcHVibGljIHZhciBzZXJ2aWNlTmFtZSA9ICIiCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHNlcnZpY2VOYW1lOiBTdHJpbmcpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUgICAgCisgIH0KKworICBvdmVycmlkZSBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgc3dpdGNoIG1lc3NhZ2VUeXBlIHsKKyAgICBjYXNlIC5jYWxsLCAub25ld2F5OgorICAgICAgdmFyIHNlcnZpY2VGdW5jdGlvbiA9IHNlcnZpY2VOYW1lCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gc2VydmljZU5hbWUgPT0gIiIgPyAiIiA6IHNlcGFyYXRvcgorICAgICAgc2VydmljZUZ1bmN0aW9uICs9IG5hbWUKKyAgICAgIHJldHVybiB0cnkgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc2VydmljZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjIyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0CkBAIC0wLDAgKzEsMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHR5cGVhbGlhcyBUUHJvY2Vzc29yTWVzc2FnZUhhbmRsZXI8VD4gPSAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgVCkgLT4gVm9pZAorCitwdWJsaWMgcHJvdG9jb2wgVFByb2Nlc3NvciB7CisgIGFzc29jaWF0ZWR0eXBlIFNlcnZpY2UKKyAgdmFyIHNlcnZpY2U6IFNlcnZpY2UgeyBnZXQgc2V0IH0KKyAgZnVuYyBwcm9jZXNzKG9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzCisgIGluaXQoc2VydmljZTogU2VydmljZSkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwxODIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisvLworCitwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGU6IEludDMyIHsKKyAgY2FzZSBjYWxsID0gMQorICBjYXNlIHJlcGx5ID0gMgorICBjYXNlIGV4Y2VwdGlvbiA9IDMKKyAgY2FzZSBvbmV3YXkgPSA0Cit9CisKK3B1YmxpYyBlbnVtIFRUeXBlOiBJbnQzMiB7CisgIGNhc2Ugc3RvcCAgICAgPSAwCisgIGNhc2Ugdm9pZCAgICAgPSAxCisgIGNhc2UgYm9vbCAgICAgPSAyCisgIGNhc2UgaTggICAgICAgPSAzCisgIGNhc2UgZG91YmxlICAgPSA0CisgIGNhc2UgaTE2ICAgICAgPSA2CisgIGNhc2UgaTMyICAgICAgPSA4CisgIGNhc2UgaTY0ICAgICAgPSAxMAorICBjYXNlIHN0cmluZyAgID0gMTEKKyAgY2FzZSBgc3RydWN0YCA9IDEyCisgIGNhc2UgbWFwICAgICAgPSAxMworICBjYXNlIHNldCAgICAgID0gMTQKKyAgY2FzZSBsaXN0ICAgICA9IDE1CisgIGNhc2UgdXRmOCAgICAgPSAxNgorICBjYXNlIHV0ZjE2ICAgID0gMTcKK30KKworcHVibGljIHByb3RvY29sIFRQcm90b2NvbCB7CisgIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQgeyBnZXQgc2V0IH0KKyAgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpCisgIC8vIFJlYWRpbmcgTWV0aG9kcworICAKKyAgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nCisgIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cworICBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MKKyAgCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEKKyAgCisgIC8vIFdyaXRpbmcgbWV0aG9kcworICAKKyAgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MKKworICBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRGF0YSkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFZhbHVlKF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGlkOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IHR5cGUsIGZpZWxkSUQ6IGlkKQorICAgIHRyeSB2YWx1ZS53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB2YWxpZGF0ZVZhbHVlKF8gdmFsdWU6IEFueT8sIG5hbWVkIG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBpZiB2YWx1ZSA9PSBuaWwgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgZmllbGQ6IFwobmFtZSkiKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgaWYgdHlwZSA9PSAuZXhjZXB0aW9uIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgcmV0dXJuIHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRXhjZXB0aW9uKG1lc3NhZ2VOYW1lIG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50MzIsIGV4OiBUQXBwbGljYXRpb25FcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwgdHlwZTogLmV4Y2VwdGlvbiwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB0cnkgZXgud3JpdGUodG86IHNlbGYpCisgICAgdHJ5IHdyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHNraXAodHlwZTogVFR5cGUpIHRocm93cyB7CisgICAgc3dpdGNoIHR5cGUgeworICAgIGNhc2UgLmJvb2w6ICAgXyA9IHRyeSByZWFkKCkgYXMgQm9vbAorICAgIGNhc2UgLmk4OiAgIF8gPSB0cnkgcmVhZCgpIGFzIFVJbnQ4CisgICAgY2FzZSAuaTE2OiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQxNgorICAgIGNhc2UgLmkzMjogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50MzIKKyAgICBjYXNlIC5pNjQ6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgY2FzZSAuZG91YmxlOiBfID0gdHJ5IHJlYWQoKSBhcyBEb3VibGUKKyAgICBjYXNlIC5zdHJpbmc6IF8gPSB0cnkgcmVhZCgpIGFzIFN0cmluZworICAgICAgCisgICAgY2FzZSAuc3RydWN0OgorICAgICAgXyA9IHRyeSByZWFkU3RydWN0QmVnaW4oKQorICAgICAgd2hpbGUgdHJ1ZSB7CisgICAgICAgIGxldCAoXywgZmllbGRUeXBlLCBfKSA9IHRyeSByZWFkRmllbGRCZWdpbigpCisgICAgICAgIGlmIGZpZWxkVHlwZSA9PSAuc3RvcCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB0cnkgc2tpcCh0eXBlOiBmaWVsZFR5cGUpCisgICAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTdHJ1Y3RFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5tYXA6CisgICAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZE1hcEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZToga2V5VHlwZSkKKyAgICAgICAgdHJ5IHNraXAodHlwZTogdmFsdWVUeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRNYXBFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5zZXQ6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkU2V0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkU2V0RW5kKCkKKyAgICAgIAorICAgIGNhc2UgLmxpc3Q6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZTogZWxlbVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZExpc3RFbmQoKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTQ2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRQcm90b2NvbEVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGluaXQoKSB7IH0KKworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBpbnZhbGlkRGF0YQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgY2FzZSBiYWRWZXJzaW9uKGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogU3RyaW5nKQorICAgIGNhc2Ugbm90SW1wbGVtZW50ZWQKKyAgICBjYXNlIGRlcHRoTGltaXQKKworICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gMgorICAgICAgY2FzZSAuc2l6ZUxpbWl0OiAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRWZXJzaW9uOiAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5vdEltcGxlbWVudGVkOiByZXR1cm4gNQorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiA2CisgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuICJJbnZhbGlkIERhdGEiCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6ICAgcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICBjYXNlIC5iYWRWZXJzaW9uKGxldCBleHBlY3RlZCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiQmFkIFZlcnNpb24uIChFeHBlY3RlZDogXChleHBlY3RlZCksIEdvdDogXChnb3QpIgorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiAiTm90IEltcGxlbWVudGVkIgorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiAiRGVwdGggTGltaXQiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGVudW0gRXh0ZW5kZWRFcnJvckNvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG1pc3NpbmdSZXF1aXJlZEZpZWxkKGZpZWxkTmFtZTogU3RyaW5nKQorICAgIGNhc2UgdW5leHBlY3RlZFR5cGUodHlwZTogVFR5cGUpCisgICAgY2FzZSBtaXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgcmV0dXJuIDEwMDAKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkOiByZXR1cm4gMTAwMQorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGU6ICAgICAgIHJldHVybiAxMDAyCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2w6ICAgcmV0dXJuIDEwMDMKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IiCisgICAgICBjYXNlIC5taXNzaW5nUmVxdWlyZWRGaWVsZChsZXQgZmllbGROYW1lKTogICAgICAgIHJldHVybiAiTWlzc2luZyBSZXF1aXJlZCBGaWVsZDogXChmaWVsZE5hbWUpIgorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGUobGV0IHR5cGUpOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZXhwZWN0ZWQgVHlwZSBcKHR5cGUuc2VsZikiCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2wobGV0IGV4cGVjdGVkLCBsZXQgZ290KTogIHJldHVybiAiTWlzbWF0Y2hlZCBQcm90b2NvbC4gIChFeHBlY3RlZDogXChleHBlY3RlZCksIGdvdCBcKGdvdCkpIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2YXIgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsCisKKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUgPSAudW5rbm93biwKKyAgICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCwKKyAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIHNlbGYuZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IKKyAgfQorCisgIC8vLyBNYXJrOiBURXJyb3IKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9CisKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoVFByb3RvY29sRXJyb3Iuc2VsZik6ICAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpIFwoZXJyb3IuZGVzY3JpcHRpb24pXG4iCisgICAgaWYgbGV0IGV4dGVuZGVkRXJyb3IgPSBleHRlbmRlZEVycm9yIHsKKyAgICAgIG91dCArPSAiVFByb3RvY29sRXh0ZW5kZWRFcnJvciAoXChleHRlbmRlZEVycm9yLnRocmlmdEVycm9yQ29kZSkpOiBcKGV4dGVuZGVkRXJyb3IuZGVzY3JpcHRpb24pIgorICAgIH0KKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KK30KKworCisvLy8gV3JhcHBlciBmb3IgVHJhbnNwb3J0IGVycm9ycyBpbiBQcm90b2NvbHMuICBJbnNwaXJlZCBieSBUaHJpZnQtQ29jb2EgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SCisvLy8gbWFjcm8uICBNb2RpZmllZCB0byBiZSBtb3JlIFN3aWZ0LXkuICBDYXRjaGVzIGFueSBURXJyb3IgdGhyb3duIHdpdGhpbiB0aGUgYmxvY2sgYW5kCisvLy8gcmV0aHJvd3MgYSBnaXZlbiBUUHJvdG9jb2xFcnJvciwgdGhlIG9yaWdpbmFsIGVycm9yJ3MgZGVzY3JpcHRpb24gaXMgYXBwZW5kZWQgdG8gdGhlIG5ldworLy8vIFRQcm90b2NvbEVycm9yJ3MgbWVzc2FnZS4gIHNvdXJjZUZpbGUsIHNvdXJjZUxpbmUsIHNvdXJjZU1ldGhvZCBhcmUgYXV0by1wb3B1bGF0ZWQgYW5kIHNob3VsZAorLy8vIGJlIGlnbm9yZWQgd2hlbiBjYWxsaW5nLgorLy8vCisvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgICAgICBUUHJvdG9jb2xFcnJvciB0byB0aHJvdyBpZiB0aGUgYmxvY2sgdGhyb3dzCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlRmlsZTogICB0aHJvd2luZyBmaWxlLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTGluZTogICB0aHJvd2luZyBsaW5lLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTWV0aG9kOiB0aHJvd2luZyBtZXRob2QsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBibG9jazogICAgICAgIHRocm93aW5nIGJsb2NrCisvLy8KKy8vLyAtIHRocm93czogVFByb3RvY29sRXJyb3IgIERlZmF1bHQgaXMgVFByb3RvY29sRXJyb3IuRXJyb3JDb2RlLnVua25vd24uICBVbmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcidzIGRlc2NyaXB0aW9uIGFwcGVuZGVkIHRvIFRQcm90b2NvbEVycm9yLm1lc3NhZ2UKK2Z1bmMgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yID0gVFByb3RvY29sRXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZTogU3RyaW5nID0gI2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmU6IEludCA9ICNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNZXRob2Q6IFN0cmluZyA9ICNmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICgpIHRocm93cyAtPiAoKSkgdGhyb3dzIHsKKyAgLy8gTmVlZCBtdXRhYmxlIGNvcHkKKyAgdmFyIGVycm9yID0gZXJyb3IKKyAgZG8geworICAgIHRyeSBibG9jaygpCisgIH0gY2F0Y2ggbGV0IGVyciBhcyBURXJyb3IgeworICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/PyAiIgorICAgIG1lc3NhZ2UgKz0gIlxuRmlsZTogXChzb3VyY2VGaWxlKVxuIgorICAgIG1lc3NhZ2UgKz0gIkxpbmU6IFwoc291cmNlTGluZSlcbiIKKyAgICBtZXNzYWdlICs9ICJNZXRob2Q6IFwoc291cmNlTWV0aG9kKSIKKyAgICBtZXNzYWdlICs9ICJcbk9yaWdpbmFsIEVycm9yOlxuIiArIGVyci5kZXNjcmlwdGlvbgorICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgdGhyb3cgZXJyb3IKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjU5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0IHsKKyAgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHsKKyAgICAvLyBGSVhNRSEKKyAgICBhc3NlcnQoZmFsc2UsICJTZWN1cml0eSBub3QgYXZhaWxhYmxlIGluIExpbnV4LCBUU1NMU29ja2V0VHJhbnNwb3J0IFVuYXZpbGFibGUgZm9yIG5vdyIpCisgIH0KK30KKyNlbHNlCitsZXQgaXNMaXR0bGVFbmRpYW4gPSBJbnQoT1NIb3N0Qnl0ZU9yZGVyKCkpID09IE9TTGl0dGxlRW5kaWFuCitsZXQgaHRvbnMgID0gaXNMaXR0bGVFbmRpYW4gPyBfT1NTd2FwSW50MTYgOiB7ICQwIH0KK2xldCBodG9ubCAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQzMiA6IHsgJDAgfQorCitwdWJsaWMgY2xhc3MgVFNTTFNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgIHZhciBzc2xIb3N0bmFtZTogU3RyaW5nCisgIHZhciBzZDogSW50MzIgPSAwCisgIAorICBwdWJsaWMgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHRocm93cyB7CisgICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZQorICAgIHZhciByZWFkU3RyZWFtOiBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06IFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICAKKyAgICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCisgICAgdmFyIHBpbjogc29ja2FkZHJfaW4gPSBzb2NrYWRkcl9pbigpCisgICAgdmFyIGhwOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxob3N0ZW50Pj8gPSBuaWwKKyAgICBmb3IgaSBpbiAwLi48MTAgeworICAgICAgCisgICAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUuY1N0cmluZyh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgICAgIGlmIGhwID09IG5pbCB7CisgICAgICAgIHByaW50KCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSBcKGhvc3RuYW1lKSIpCisgICAgICAgIGhlcnJvcigicmVzb2x2IikKKyAgICAgICAgaWYgaSA9PSA5IHsKKyAgICAgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaG9zdGFuYW1lUmVzb2x1dGlvbihob3N0bmFtZTogaG9zdG5hbWUpKQorICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcChmb3JUaW1lSW50ZXJ2YWw6IDAuMikKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHBpbi5zaW5fZmFtaWx5ICA9IFVJbnQ4KEFGX0lORVQpCisgICAgcGluLnNpbl9hZGRyICAgID0gaW5fYWRkcihzX2FkZHI6IFVJbnQzMigoaHA/LnBvaW50ZWUuaF9hZGRyX2xpc3QucG9pbnRlZT8ucG9pbnRlZSkhKSkgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzPz8/CisgICAgcGluLnNpbl9wb3J0ICAgID0gaHRvbnMocG9ydCkKKyAgICAKKyAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICAgIHNkID0gc29ja2V0KEludDMyKEFGX0lORVQpLCBJbnQzMihTT0NLX1NUUkVBTSksIEludDMyKElQUFJPVE9fVENQKSkKKyAgICBpZiBzZCA9PSAtMSB7CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zb2NrZXRDcmVhdGUocG9ydDogSW50KHBvcnQpKSkKKyAgICB9CisgICAgCisgICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KKyAgICAvLyBuZWVkIGEgbm9uLXNlbGYgcmVmIHRvIHNkLCBvdGhlcndpc2UgdGhlIGogY29tcGxhaW5zCisgICAgbGV0IHNkX2xvY2FsID0gc2QKKyAgICBsZXQgY29ubmVjdFJlc3VsdCA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmcGluKSB7CisgICAgICBjb25uZWN0KHNkX2xvY2FsLCBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSksIHNvY2tsZW5fdChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIH0KKyAgICBpZiBjb25uZWN0UmVzdWx0ID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmNvbm5lY3QpCisgICAgfQorICAgIAorICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwgLnNvY2tldE5hdGl2ZUhhbmRsZSwga0NGQm9vbGVhblRydWUpCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPyA9IG5pbAorICAgIHZhciBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICBpZiByZWFkU3RyZWFtICE9IG5pbCAmJiB3cml0ZVN0cmVhbSAhPSBuaWwgeworICAgICAgCisgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvY2tldFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpCisgICAgICAKKyAgICAgIGxldCBzZXR0aW5nczogW1N0cmluZzogQm9vbF0gPSBba0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbiBhcyBTdHJpbmc6IHRydWVdCisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIGlucHV0U3RyZWFtPy5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIG91dHB1dFN0cmVhbSA9IHdyaXRlU3RyZWFtIS50YWtlUmV0YWluZWRWYWx1ZSgpCisgICAgICBvdXRwdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIG91dHB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgIH0KKyAgICAKKyAgICAKKyAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgc2VsZi5pbnB1dD8uZGVsZWdhdGUgPSBzZWxmCisgICAgc2VsZi5vdXRwdXQ/LmRlbGVnYXRlID0gc2VsZgorICB9CisgIAorICBmdW5jIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKF8gbXlUcnVzdDogU2VjVHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlKSAtPiBCb29sIHsKKyAgICBsZXQgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpCisgICAgbGV0IGN1cnJlbnRUaW1lID0gQ0ZBYnNvbHV0ZVRpbWVHZXRDdXJyZW50KCkKKyAgICAKKyAgICBsZXQgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwIC8vIGZyb20gVFNTTFNvY2tldFRyYW5zcG9ydC5tCisgICAgbGV0IG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIERvdWJsZSh0aW1lSW5jcmVtZW50KQorICAgIAorICAgIGlmIHRydXN0VGltZSAtIG5ld1RpbWUgIT0gMCB7CisgICAgICBsZXQgbmV3RGF0ZSA9IENGRGF0ZUNyZWF0ZShuaWwsIG5ld1RpbWUpCisgICAgICBTZWNUcnVzdFNldFZlcmlmeURhdGUobXlUcnVzdCwgbmV3RGF0ZSEpCisgICAgICAKKyAgICAgIHZhciB0ciA9IGxhc3RUcnVzdFJlc3VsdAorICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cikgeyB0clB0ciAtPiBCb29sIGluCisgICAgICAgIGlmIFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgdHJQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlCisgICAgICB9CisgICAgICBpZiAhc3VjY2VzcyB7IHJldHVybiBmYWxzZSB9CisgICAgfQorICAgIGlmIGxhc3RUcnVzdFJlc3VsdCA9PSAucHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0gLnVuc3BlY2lmaWVkIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorCisgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byByZWNvdmVyIGNlcnRpZmljYXRlIHRydXN0IGZhaWx1cmUiKQorICAgIHJldHVybiB0cnVlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIC0+IEJvb2wgeworICAgIHJldHVybiBzZCA+IDAKKyAgfQorfQorCitleHRlbnNpb24gVFNTTFNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeworICBwdWJsaWMgZnVuYyBzdHJlYW0oXyBhU3RyZWFtOiBTdHJlYW0sIGhhbmRsZSBldmVudENvZGU6IFN0cmVhbS5FdmVudCkgeworICAgIAorICAgIHN3aXRjaCBldmVudENvZGUgeworICAgIGNhc2UgU3RyZWFtLkV2ZW50KCk6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuaGFzQnl0ZXNBdmFpbGFibGU6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQub3BlbkNvbXBsZXRlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNTcGFjZUF2YWlsYWJsZToKKyAgICAgIHZhciBwcm9jZWVkID0gZmFsc2UKKyAgICAgIHZhciB0cnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlID0gLmludmFsaWQKKworICAgICAgdmFyIG5ld1BvbGljaWVzOiBDRk11dGFibGVBcnJheT8KKyAgICAgIAorICAgICAgcmVwZWF0IHsKKyAgICAgICAgbGV0IHRydXN0OiBTZWNUcnVzdCA9IGFTdHJlYW0ucHJvcGVydHkoZm9yS2V5OiAuU1NMUGVlclRydXN0KSBhcyEgU2VjVHJ1c3QKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgICBsZXQgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKGZhbHNlLCBzc2xIb3N0bmFtZSBhcyBDRlN0cmluZz8pCisgICAgICAgIHZhciBwcG9saWN5ID0gcG9saWN5IC8vIG11dGFibGUgZm9yIHBvaW50ZXIKKyAgICAgICAgbGV0IHBvbGljaWVzOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxDRkFycmF5Pz4/ID0gbmlsCisgICAgICAgIGlmIFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCBwb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmcHBvbGljeSkgeyBwdHIgaW4KKyAgICAgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShuaWwsIDAsIHBvbGljaWVzPy5wb2ludGVlKQorICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShuZXdQb2xpY2llcywgcHRyKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdHJ1c3QgcG9saWNpZXMKKyAgICAgICAgaWYgU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMhKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cnVzdFJlc3VsdCkgeyB0cnVzdFB0ciAtPiBCb29sIGluCisgICAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZSh0cnVzdCwgdHJ1c3RQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICFzdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgc3dpdGNoIHRydXN0UmVzdWx0IHsKKyAgICAgICAgY2FzZSAucHJvY2VlZDogICAgICBwcm9jZWVkID0gdHJ1ZQorICAgICAgICBjYXNlIC51bnNwZWNpZmllZDogIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICAgIHByb2NlZWQgPSBzZWxmLnJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCBsYXN0VHJ1c3RSZXN1bHQ6IHRydXN0UmVzdWx0KQorICAgICAgICAgIAorICAgICAgICBjYXNlIC5kZW55OiAgICAgICAgIGJyZWFrCisgICAgICAgIGNhc2UgLmZhdGFsVHJ1c3RGYWlsdXJlOiBicmVhaworICAgICAgICBjYXNlIC5vdGhlckVycm9yOiAgIGJyZWFrCisgICAgICAgIGNhc2UgLmludmFsaWQ6ICAgICAgYnJlYWsKKyAgICAgICAgZGVmYXVsdDogYnJlYWsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSBmYWxzZQorICAKKyAgICAgIGlmICFwcm9jZWVkIHsKKyAgICAgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gIFJlc3VsdDogXCh0cnVzdFJlc3VsdCkiKQorICAgICAgICBhU3RyZWFtLmNsb3NlKCkKKyAgICAgIH0KKyAgICAgIAorICAgIGNhc2UgU3RyZWFtLkV2ZW50LmVycm9yT2NjdXJyZWQ6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZW5kRW5jb3VudGVyZWQ6IGJyZWFrCisgICAgZGVmYXVsdDogYnJlYWsKKyAgICB9CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw0OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBTdHJpbmcpCisgICAgY2FzZSBzb2NrZXRDcmVhdGUocG9ydDogSW50KQorICAgIGNhc2UgY29ubmVjdAorICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb246ICByZXR1cm4gLTEwMDAwCisgICAgICBjYXNlIC5zb2NrZXRDcmVhdGU6ICAgICAgICAgcmV0dXJuIC0xMDAwMQorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgIHJldHVybiAtMTAwMDIKKyAgICAgIH0KKyAgICB9CisgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5ob3N0YW5hbWVSZXNvbHV0aW9uKGxldCBob3N0bmFtZSk6ICByZXR1cm4gIkZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lOiBcKGhvc3RuYW1lKSIKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZShsZXQgcG9ydCk6ICAgICAgICAgICAgIHJldHVybiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQgb24gcG9ydDogXChwb3J0KSIKKyAgICAgIGNhc2UgLmNvbm5lY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29ubmVjdCBlcnJvciIKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5jb25uZWN0CisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPworICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC5jb25uZWN0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU2VyaWFsaXphYmxlIHsKKyAgdmFyIGhhc2hWYWx1ZTogSW50IHsgZ2V0IH0KKworICAvLy8gVFR5cGUgZm9yIGluc3RhbmNlCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyBnZXQgfQorCisgIC8vLyBSZWFkIFRTZXJpYWxpemFibGUgaW5zdGFuY2UgZnJvbSBQcm90b2NvbAorICBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFNlbGYKKworICAvLy8gV3JpdGUgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSB0byBQcm90b2NvbAorICBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworCit9CisKK2V4dGVuc2lvbiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFNlbGYsIHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBwcm90bykKKyAgfQorCisgIC8vLyBjb252ZW5pZW5jZSBmb3IgbWVtYmVyIGFjY2VzcworICBwdWJsaWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIFNlbGYudGhyaWZ0VHlwZSB9Cit9CisKK3B1YmxpYyBmdW5jID09PFQ+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHdoZXJlIFQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcmV0dXJuIGxocy5oYXNoVmFsdWUgPT0gcmhzLmhhc2hWYWx1ZQorfQorCisvLy8gRGVmYXVsdCByZWFkL3dyaXRlIGZvciBwcmltaXRhdmUgVGhyaWZ0IHR5cGVzOgorLy8vIEJvb2wsIEludDggKGJ5dGUpLCBJbnQxNiwgSW50MzIsIEludDY0LCBEb3VibGUsIFN0cmluZworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuYm9vbCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDggOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk4IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ4IHsKKyAgICByZXR1cm4gSW50OCh0cnkgcHJvdG8ucmVhZCgpIGFzIFVJbnQ4KQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoVUludDgoc2VsZikpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDE2IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMTYgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKKworZXh0ZW5zaW9uIEludDY0IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pNjQgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gRG91YmxlIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5kb3VibGUgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNkMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRTZXQ8RWxlbWVudCA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZT4gOiBTZXRBbGdlYnJhLCBIYXNoYWJsZSwgQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSB7CisgIC8vLyBUeXBlYWxpYXMgZm9yIFN0b3JhZ2UgdHlwZQorICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIAorICAvLy8gSW50ZXJuYWwgU3RvcmFnZSB1c2VkIGZvciBUU2V0IChTZXRcPEVsZW1lbnRcPikKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeyByZXR1cm4gc3RvcmFnZS5pbmRpY2VzIH0KKyAgCisgIC8vIE11c3QgaW1wbGVtZW50IGlzRW1wdHkgZXZlbiB0aG91Z2ggYm90aCBTZXRBbGdlYnJhIGFuZCBDb2xsZWN0aW9uIHByb3ZpZGUgaXQgZHVlIHRvIHRoZWlyIGNvbmZsY2l0aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgICNpZiBzd2lmdCg+PTMuMikKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAjZWxzZQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgICNlbmRpZgorICAKKyAgLy8vIE1hcms6IFNldEFsZ2VicmEKKyAgaW50ZXJuYWwgaW5pdChzdG9yYWdlOiBTZXQ8RWxlbWVudD4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnRhaW5zKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5jb250YWlucyhtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChfIG5ld01lbWJlcjogRWxlbWVudCkgLT4gKGluc2VydGVkOiBCb29sLCBtZW1iZXJBZnRlckluc2VydDogRWxlbWVudCkgeworICAgIHJldHVybiBzdG9yYWdlLmluc2VydChuZXdNZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZShfIG1lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UudW5pb24ob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1JbnRlcnNlY3Rpb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1JbnRlcnNlY3Rpb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2UoXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1TeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1VbmlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVVuaW9uKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLmludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLnN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZSh3aXRoIG5ld01lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnVwZGF0ZSh3aXRoOiBuZXdNZW1iZXIpCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IFN0b3JhZ2UuSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKworICAKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLnNldCB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUU2V0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkU2V0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRTZXQ6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUU2V0PEVsZW1lbnQ+LCByaHM6IFRTZXQ8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0CkBAIC0wLDAgKzEsMTQ5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGxldCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gIlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQiCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXkgPSAiVFNvY2tldFNlcnZlclByb2Nlc3NvciIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleSA9ICJUU29ja2V0U2VydmVyVHJhbnNwb3J0IgorCitjbGFzcyBUU29ja2V0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbCwgUHJvY2Vzc29yOiBUUHJvY2Vzc29yLCBTZXJ2aWNlPiB3aGVyZSBQcm9jZXNzb3IuU2VydmljZSA9PSBTZXJ2aWNlIHsKKyAgdmFyIHNvY2tldEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIHByb2Nlc3NpbmdRdWV1ZSA9ICBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvczogLmJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKyAgdmFyIHNlcnZpY2VIYW5kbGVyOiBTZXJ2aWNlCisKKyAgcHVibGljIGluaXQocG9ydDogSW50LAorICAgICAgICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlLAorICAgICAgICAgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlLAorICAgICAgICAgICAgICBwcm9jZXNzb3I6IFByb2Nlc3Nvci5UeXBlKSB0aHJvd3MgeworICAgIC8vIHNldCBzZXJ2aWNlIGhhbmRsZXIKKyAgICBzZWxmLnNlcnZpY2VIYW5kbGVyID0gc2VydmljZQorCisgICAgLy8gY3JlYXRlIGEgc29ja2V0CisgICAgdmFyIGZkOiBJbnQzMiA9IC0xCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBJbnQzMihTT0NLX1NUUkVBTS5yYXdWYWx1ZSksIEludDMyKElQUFJPVE9fVENQKSwgMCwgbmlsLCBuaWwpCisgICAgI2Vsc2UKKyAgICAgIGxldCBzb2NrID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBuaWwsIG5pbCkKKyAgICAjZW5kaWYKKyAgICBpZiBzb2NrICE9IG5pbCB7CisgICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2ssIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29jaykgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpCisKKyAgICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29jaykKKyAgICAgIHZhciB5ZXMgPSAxCisgICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIFVJbnQzMihNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSkKKworICAgICAgI2lmIG9zKExpbnV4KQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2VuZGlmCisKKyAgICAgIGxldCBwdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpIHsKKyAgICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKQorICAgICAgfQorCisgICAgICBsZXQgYWRkcmVzcyA9IERhdGEoYnl0ZXM6IHB0ciwgY291bnQ6IE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkKKworICAgICAgbGV0IGNmYWRkciA9IGFkZHJlc3Mud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsICQwLCBhZGRyZXNzLmNvdW50LCBuaWwpCisgICAgICB9CisgICAgICBpZiBDRlNvY2tldFNldEFkZHJlc3Moc29jaywgY2ZhZGRyKSAhPSBDRlNvY2tldEVycm9yLnN1Y2Nlc3MgeyAvL2tDRlNvY2tldFN1Y2Nlc3MgeworICAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29jaykKKyAgICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IikKKyAgICB9CisKKyAgICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgICAgc29ja2V0RmlsZUhhbmRsZSA9IEZpbGVIYW5kbGUoZmlsZURlc2NyaXB0b3I6IGZkLCBjbG9zZU9uRGVhbGxvYzogdHJ1ZSkKKworICAgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorCisgICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICBfID0gTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQuYWRkT2JzZXJ2ZXIoZm9yTmFtZTogLk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBuaWwsIHF1ZXVlOiBuaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWFrIHNlbGZdIG5vdGlmaWNhdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQgbGV0IHN0cm9uZ1NlbGYgPSBzZWxmIGVsc2UgeyByZXR1cm4gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nU2VsZi5jb25uZWN0aW9uQWNjZXB0ZWQoc3Ryb25nU2VsZi5zb2NrZXRGaWxlSGFuZGxlKQorCisgICAgfQorCisgICAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCisgICAgc29ja2V0RmlsZUhhbmRsZS5hY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5KCkKKworICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgXChwb3J0KSIpCisgIH0KKworICBkZWluaXQgeworICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0LnJlbW92ZU9ic2VydmVyKHNlbGYpCisgIH0KKworICBmdW5jIGNvbm5lY3Rpb25BY2NlcHRlZChfIHNvY2tldDogRmlsZUhhbmRsZSkgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgdGhlIHJlcXVlc3Qgb24gcXVldWUKKyAgICBwcm9jZXNzaW5nUXVldWUuYXN5bmMgeworICAgICAgc2VsZi5oYW5kbGVDbGllbnRDb25uZWN0aW9uKHNvY2tldCkKKyAgICB9CisgIH0KKworICBmdW5jIGhhbmRsZUNsaWVudENvbm5lY3Rpb24oXyBjbGllbnRTb2NrZXQ6IEZpbGVIYW5kbGUpIHsKKworICAgIGxldCB0cmFuc3BvcnQgPSBURmlsZUhhbmRsZVRyYW5zcG9ydChmaWxlSGFuZGxlOiBjbGllbnRTb2NrZXQpCisgICAgbGV0IHByb2Nlc3NvciA9IFByb2Nlc3NvcihzZXJ2aWNlOiBzZXJ2aWNlSGFuZGxlcikKKworICAgIGxldCBpblByb3RvY29sID0gSW5Qcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIGxldCBvdXRQcm90b2NvbCA9IE91dFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisKKyAgICBkbyB7CisgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGluUHJvdG9jb2wsIG91dFByb3RvY29sOiBvdXRQcm90b2NvbCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBwcmludCgiRXJyb3IgcHJvY2Vzc2lnbiByZXF1ZXN0OiBcKGVycm9yKSIpCisgICAgfQorICAgIERpc3BhdGNoUXVldWUubWFpbi5hc3luYyB7CisgICAgICBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdAorICAgICAgICAucG9zdChuYW1lOiBOb3RpZmljYXRpb24uTmFtZShyYXdWYWx1ZTogVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCksCisgICAgICAgICAgICAgIG9iamVjdDogc2VsZiwKKyAgICAgICAgICAgICAgdXNlckluZm86IFtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleTogdHJhbnNwb3J0XSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHJpdmF0ZSBzdHJ1Y3QgU3lzIHsKKyAgI2lmIG9zKExpbnV4KQorICBzdGF0aWMgbGV0IHJlYWQgPSBHbGliYy5yZWFkCisgIHN0YXRpYyBsZXQgd3JpdGUgPSBHbGliYy53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gR2xpYmMuY2xvc2UKKyAgI2Vsc2UKKyAgc3RhdGljIGxldCByZWFkID0gRGFyd2luLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IERhcndpbi53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gRGFyd2luLmNsb3NlCisgICNlbmRpZgorfQorCitleHRlbnNpb24gaW5fYWRkciB7CisgIHB1YmxpYyBpbml0Pyhob3N0ZW50OiBob3N0ZW50PykgeworICAgIGd1YXJkIGxldCBob3N0ID0gaG9zdGVudCwgaG9zdC5oX2FkZHJfbGlzdCAhPSBuaWwsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSAhPSBuaWwgZWxzZSB7CisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIHNlbGYuaW5pdCgpCisgICAgbWVtY3B5KCZzZWxmLCBob3N0LmhfYWRkcl9saXN0LnBvaW50ZWUhLCBJbnQoaG9zdC5oX2xlbmd0aCkpCisgICAgCisgIH0KK30KKworCisjaWYgb3MoTGludXgpCisgIC8vLyBUQ0ZTb2NrZXRUcmFuc3BvcnQgY3VycmVudGx5IHVuYXZhaWxhYmxlCisgIC8vLyByZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIHNlZSB3aHkvZml4CisgIC8vLyBjdXJyZW50bHkgQ0ZbUmVhZHxXcml0ZV1TdHJlYW0ncyBjYW4ndCBjYXN0IHRvIFtJbnB1dHxPdXRwdXRdU3RyZWFtcyB3aGljaCBicmVha3MgdGhpZ25zCisjZWxzZQorZXh0ZW5zaW9uIFN0cmVhbS5Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgU1NMUGVlclRydXN0ID0gU3RyZWFtLlByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMUGVlclRydXN0IGFzIFN0cmluZykKK30KKworLy8vIFRDRlNvY2tldFRyYW5zcG9ydCwgdXNlcyBDRlNvY2tldHMgYW5kIChOUylTdHJlYW0ncworcHVibGljIGNsYXNzIFRDRlNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgICAgcHVibGljIGluaXQ/KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCwgc2VjdXJlOiBCb29sID0gZmFsc2UpIHsKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtCisgICAgCisgICAgdmFyIHJlYWRTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZXcml0ZVN0cmVhbT4/CisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgYXMgQ0ZTdHJpbmchLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyKHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgaWYgbGV0IHJlYWRTdHJlYW0gPSByZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgbGV0IHdyaXRlU3RyZWFtID0gd3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCkgeworICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAKKyAgICAgICAgaWYgc2VjdXJlIHsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgIH0KKworICAgICAgaW5wdXRTdHJlYW0gPSByZWFkU3RyZWFtIGFzIElucHV0U3RyZWFtCisgICAgICBpbnB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbS5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0gYXMgT3V0cHV0U3RyZWFtCisgICAgICBvdXRwdXRTdHJlYW0uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIAorICAgICAgaWYgcmVhZFN0cmVhbSAhPSBuaWwgeworICAgICAgICByZWFkU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIGlmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHdyaXRlU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpCisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICAKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KK30KKworZXh0ZW5zaW9uIFRDRlNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeyB9CisjZW5kaWYKKworCisvLy8gVFNvY2tldFRyYW5zcG9ydCwgcG9zaXggc29ja2V0cy4gIFN1cHBvcnRzIElQdjQgb25seSBmb3Igbm93CitwdWJsaWMgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgdmFyIHNvY2tldERlc2NyaXB0b3I6IEludDMyCisgIAorICAKKyAgCisgIC8vLyBJbml0aWFsaXplIGZyb20gYW4gYWxyZWFkeSBzZXQgdXAgc29ja2V0RGVzY3JpcHRvci4KKyAgLy8vIEV4cGVjdHMgc29ja2V0IHRoYXRzIGFscmVhZHkgYm91bmQvY29ubmVjdGVkIChpLmUuIGZyb20gbGlzdGVuaW5nKQorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIHNvY2tldERlc2NyaXB0b3I6IHBvc2l4IHNvY2tldCBkZXNjcmlwdG9yIChJbnQzMikKKyAgcHVibGljIGluaXQoc29ja2V0RGVzY3JpcHRvcjogSW50MzIpIHsKKyAgICBzZWxmLnNvY2tldERlc2NyaXB0b3IgPSBzb2NrZXREZXNjcmlwdG9yCisgIH0KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBJbnQpIHRocm93cyB7CisgICAgZ3VhcmQgbGV0IGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiAudXRmOCkhKT8ucG9pbnRlZSwKKyAgICAgIGxldCBob3N0QWRkciA9IGluX2FkZHIoaG9zdGVudDogaHApIGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiSW52YWxpZCBhZGRyZXNzOiBcKGhvc3RuYW1lKSIpCisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICNpZiBvcyhMaW51eCkKKyAgICAgIGxldCBzb2NrID0gc29ja2V0KEFGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgMCkKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBob3N0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApCisgICAgICAKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2xlbjogVUludDgoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgIAorICAgICNlbmRpZgorICAgIAorICAgIGxldCBhZGRyUHRyID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZhZGRyKXsgVW5zYWZlUG9pbnRlcjxzb2NrYWRkcj4oT3BhcXVlUG9pbnRlcigkMCkpIH0KKyAgICAKKyAgICBsZXQgY29ubmVjdGVkID0gY29ubmVjdChzb2NrLCBhZGRyUHRyLCBVSW50MzIoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSkKKyAgICBpZiBjb25uZWN0ZWQgIT0gMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiRXJyb3IgYmluZGluZyB0byBob3N0OiBcKGhvc3RuYW1lKSBcKHBvcnQpIikKKyAgICB9CisgICAgCisgICAgc2VsZi5pbml0KHNvY2tldERlc2NyaXB0b3I6IHNvY2spCisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgY2xvc2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBvdXQgPSBEYXRhKCkKKyAgICB3aGlsZSBvdXQuY291bnQgPCBzaXplIHsKKyAgICAgIG91dC5hcHBlbmQodHJ5IHNlbGYucmVhZChzaXplOiBzaXplKSkKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gQXJyYXk8VUludDg+LmluaXQocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSkKKyAgICBsZXQgcmVhZEJ5dGVzID0gU3lzLnJlYWQoc29ja2V0RGVzY3JpcHRvciwgJmJ1ZmYsIHNpemUpCisgICAgCisgICAgcmV0dXJuIERhdGEoYnl0ZXM6IGJ1ZmZbMC4uPHJlYWRCeXRlc10pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHsKKyAgICB2YXIgYnl0ZXNUb1dyaXRlID0gZGF0YS5jb3VudAorICAgIHZhciB3cml0ZUJ1ZmZlciA9IGRhdGEKKyAgICB3aGlsZSBieXRlc1RvV3JpdGUgPiAwIHsKKyAgICAgIGxldCB3cml0dGVuID0gd3JpdGVCdWZmZXIud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgU3lzLndyaXRlKHNvY2tldERlc2NyaXB0b3IsICQwLCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIH0KKyAgICAgIHdyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIuc3ViZGF0YShpbjogd3JpdHRlbiAuLjwgd3JpdGVCdWZmZXIuY291bnQpCisgICAgICBieXRlc1RvV3JpdGUgLT0gd3JpdHRlbgorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgc2h1dGRvd24oc29ja2V0RGVzY3JpcHRvciwgSW50MzIoU0hVVF9SRFdSKSkKKyAgICBfID0gU3lzLmNsb3NlKHNvY2tldERlc2NyaXB0b3IpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorICAvLy8gQ3VycmVudGx5IHVuYXZhaWxhYmxlIGluIExpbnV4CisgIC8vLyBSZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIGZpeAorICAvLy8gQ3VycmVudGx5IGtDb25zdGFudHMgZm9yIENGU29ja2V0cyBkb24ndCBleGlzdCBpbiBsaW51eCBhbmQgbm90IGFsbCBoYXZlIGJlZW4gbW92ZWQKKyAgLy8vIHRvIHByb3BlcnR5IHN0cnVjdHMgeWV0CisjZWxzZQorICAvLyBNdXN0IGluaGVyaXQgTlNPYmplY3QgZm9yIE5TU3RyZWFtRGVsZWdhdGUgY29uZm9ybWFuY2UKKyAgcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCwgVFRyYW5zcG9ydCB7CisgICAgcHVibGljIHZhciBpbnB1dDogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgcHVibGljIHZhciBvdXRwdXQ6IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICAKKyAgICBwdWJsaWMgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/LCBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIGlucHV0ICAgPSBpbnB1dFN0cmVhbQorICAgICAgb3V0cHV0ICA9IG91dHB1dFN0cmVhbQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgfQorICAgIAorICAgIGRlaW5pdCB7CisgICAgICBjbG9zZSgpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgCisgICAgICAgIGxldCBieXRlc1JlYWQgPSBidWZmZXIud2l0aFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyIHsgYnVmZmVyUHRyIGluCisgICAgICAgICAgcmV0dXJuIGlucHV0LnJlYWQoYnVmZmVyUHRyLmJhc2VBZGRyZXNzISwgbWF4TGVuZ3RoOiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNSZWFkIDw9IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgICAgIH0KKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeworICAgICAgICAgIGlucHV0LnJlYWQoJDAuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgICBndWFyZCBsZXQgb3V0cHV0ID0gb3V0cHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgYnl0ZXNXcml0dGVuID0gMAorICAgICAgd2hpbGUgYnl0ZXNXcml0dGVuIDwgZGF0YS5jb3VudCB7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKCQwLCBtYXhMZW5ndGg6IGRhdGEuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzV3JpdHRlbiA9PSAtMSB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfSBlbHNlIGlmIGJ5dGVzV3JpdHRlbiA9PSAwIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIGNsb3NlKCkgeworICAgICAgCisgICAgICBpZiBpbnB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRlJlYWRTdHJlYW0gPSBpbnB1dCB7CisgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlucHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBpbnB1dD8uY2xvc2UoKQorICAgICAgICBpbnB1dD8ucmVtb3ZlKGZyb206IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgICBpbnB1dCA9IG5pbAorICAgICAgfQorICAgICAgCisgICAgICBpZiBvdXRwdXQgIT0gbmlsIHsKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dCBzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRldyaXRlU3RyZWFtID0gb3V0cHV0IHsKKyAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBvdXRwdXQ/LmNsb3NlKCkKKyAgICAgICAgb3V0cHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIG91dHB1dCA9IG5pbAorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcyYTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vLyBQcm90b2NvbCBmb3IgR2VuZXJhdGVkIFN0cnVjdHMgdG8gY29uZm9ybSB0bworLy8vIERpY3Rpb25hcnkgbWFwcyBmaWVsZCBuYW1lcyB0byBpbnRlcm5hbCBJRHMgYW5kIHVzZXMgUmVmbGVjdGlvbgorLy8vIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZmllbGRzLiAgCisvLy8gYHdyaXRlRmllbGRWYWx1ZShfOm5hbWU6dHlwZTppZDopYCBjYWxscyBgVFNlcmlhbGl6YWJsZS53cml0ZSh0bzopYCBpbnRlcm5hbGx5CisvLy8gZ2l2aW5nIGEgbmljZSByZWN1cnNpdmUgYmVoYXZpb3IgZm9yIG5lc3RlZCBUU3RydWN0cywgVExpc3RzLCBUTWFwcywgYW5kIFRTZXRzCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworICBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiBJbnQzMl0geyBnZXQgfQorICBzdGF0aWMgdmFyIHN0cnVjdE5hbWU6IFN0cmluZyB7IGdldCB9Cit9CisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiAoaWQ6IEludDMyLCB0eXBlOiBUVHlwZSldIHsgcmV0dXJuIFs6XSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICAvLyBXcml0ZSBzdHJ1Y3QgbmFtZSBmaXJzdAorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFNlbGYuc3RydWN0TmFtZSkKKyAgICAKKyAgICB0cnkgc2VsZi5mb3JFYWNoIHsgbmFtZSwgdmFsdWUsIGlkIGluCisgICAgICAvLyBXcml0ZSB0byBwcm90b2NvbAorICAgICAgdHJ5IHByb3RvLndyaXRlRmllbGRWYWx1ZSh2YWx1ZSwgbmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUudGhyaWZ0VHlwZSwgaWQ6IGlkKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBzZWxmLmZvckVhY2ggeyBfLCB2YWx1ZSwgXyBpbgorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICh2YWx1ZS5oYXNoVmFsdWUpCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIFByb3ZpZGVzIGEgYmxvY2sgZm9yIGhhbmRsaW5nIGVhY2ggKGF2YWlsYWJsZSkgdGhyaWZ0IHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24KKyAgLy8vIENhdmVhdDogU2tpcHMgb3ZlciBvcHRpb25hbCB2YWx1ZXMKKyAgCisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiBibG9jayBmb3IgaGFuZGxpbmcgcHJvcGVydHkKKyAgLy8vCisgIC8vLyAtIHRocm93czogcmV0aHJvd3MgYW55IEVycm9yIHRocm93biBpbiBibG9jaworICBwcml2YXRlIGZ1bmMgZm9yRWFjaChfIGJsb2NrOiAoXyBuYW1lOiBTdHJpbmcsIF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIF8gaWQ6IEludDMyKSB0aHJvd3MgLT4gVm9pZCkgcmV0aHJvd3MgeworICAgIC8vIE1pcnJvciB0aGUgb2JqZWN0LCBnZXR0aW5nIChuYW1lOiBTdHJpbmc/LCB2YWx1ZTogQW55KSBmb3IgZXZlcnkgcHJvcGVydHkKKyAgICBsZXQgbWlycm9yID0gTWlycm9yKHJlZmxlY3Rpbmc6IHNlbGYpCisgICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBjaGlsZHJlbiwgaWdub3JlIGVtcHR5IHByb3BlcnR5IG5hbWVzCisgICAgZm9yIChwcm9wTmFtZSwgcHJvcFZhbHVlKSBpbiBtaXJyb3IuY2hpbGRyZW4geworICAgICAgZ3VhcmQgbGV0IHByb3BOYW1lID0gcHJvcE5hbWUgZWxzZSB7IGNvbnRpbnVlIH0KKworICAgICAgaWYgbGV0IHR2YWwgPSB1bndyYXAoYW55OiBwcm9wVmFsdWUpIGFzPyBUU2VyaWFsaXphYmxlLCBsZXQgaWQgPSBTZWxmLmZpZWxkSWRzW3Byb3BOYW1lXSB7CisgICAgICAgIHRyeSBibG9jayhwcm9wTmFtZSwgdHZhbCwgaWQpCisgICAgICB9CisgICAgfQorICB9CisgIAorICAKKyAgLy8vIEFueSBjYW4gbXlzdGVyaW91c2x5IGJlIGFuIE9wdGlvbmFsPEFueT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgLy8vIHRoaXMgY2hlY2tzIGFuZCBhbHdheXMgcmV0dXJucyBPcHRpb25hbDxBbnk+IHdpdGhvdXQgZG91YmxlIHdyYXBwaW5nCisgIC8vLyB3ZSB0aGVuIHRyeSB0byBiaW5kIHZhbHVlIGFzIFRTZXJpYWxpemFibGUgdG8gaWdub3JlIGFueSBleHRlbnNpb24gcHJvcGVydGllcworICAvLy8gYW5kIHRoZSBsaWtlIGFuZCB2ZXJpZnkgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgZ3JhYiB0aGUgVGhyaWZ0CisgIC8vLyBwcm9wZXJ0eSBJRCBhdCB0aGUgc2FtZSB0aW1lCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYW55OiBBbnkgaW5zdGFuY2UgdG8gYXR0ZW1wdCB0byB1bndyYXAKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IFVud3JhcHBlZCBBbnkgYXMgT3B0aW9uYWw8QW55PgorICBwcml2YXRlIGZ1bmMgdW53cmFwKGFueTogQW55KSAtPiBBbnk/IHsKKyAgICBsZXQgbWkgPSBNaXJyb3IocmVmbGVjdGluZzogYW55KQorICAgIAorICAgIGlmIG1pLmRpc3BsYXlTdHlsZSAhPSAub3B0aW9uYWwgeyByZXR1cm4gYW55IH0KKyAgICBpZiBtaS5jaGlsZHJlbi5jb3VudCA9PSAwIHsgcmV0dXJuIG5pbCB9CisgICAgCisgICAgbGV0IChfLCBzb21lKSA9IG1pLmNoaWxkcmVuLmZpcnN0IQorICAgIHJldHVybiBzb21lCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw2NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHByb3RvY29sIFRUcmFuc3BvcnQgeworICAKKyAgLy8gUmVxdWlyZWQKKyAgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEKKyAgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MKKyAgZnVuYyBmbHVzaCgpIHRocm93cworCisgIC8vIE9wdGlvbmFsIChkZWZhdWx0IHByb3ZpZGVkKQorICBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgb3BlbigpIHRocm93cworICBmdW5jIGNsb3NlKCkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFRyYW5zcG9ydCB7CisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeyByZXR1cm4gdHJ1ZSB9CisgIGZ1bmMgb3BlbigpIHRocm93cyB7IH0KKyAgZnVuYyBjbG9zZSgpIHRocm93cyB7IH0KKyAgCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHZhciBoYXZlID0gMAorICAgIHdoaWxlIGhhdmUgPCBzaXplIHsKKyAgICAgIGxldCBjaHVuayA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSAtIGhhdmUpCisgICAgICBoYXZlICs9IGNodW5rLmNvdW50CisgICAgICBidWZmLmFwcGVuZChjaHVuaykKKyAgICAgIGlmIGNodW5rLmNvdW50ID09IDAgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KK30KKworcHVibGljIHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvLyBGYWN0b3J5CisgIGZ1bmMgZmx1c2goXyBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPigpKQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgIGFzc29jaWF0ZWR0eXBlIFRyYW5zcG9ydCA6IFRBc3luY1RyYW5zcG9ydAorICBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRyYW5zcG9ydAorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDAwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBub3RPcGVuCisgICAgY2FzZSBhbHJlYWR5T3BlbgorICAgIGNhc2UgdGltZWRPdXQKKyAgICBjYXNlIGVuZE9mRmlsZQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAyCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAzCisgICAgICBjYXNlIC5lbmRPZkZpbGU6ICAgIHJldHVybiA0CisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6IHJldHVybiA1CisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgIHJldHVybiA2CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAiVW5rbm93biBUVHJhbnNwb3J0RXJyb3IiCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAiTm90IE9wZW4iCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAiQWxyZWFkeSBPcGVuIgorICAgICAgY2FzZSAudGltZWRPdXQ6ICAgICByZXR1cm4gIlRpbWVkIE91dCIKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuICJFbmQgT2YgRmlsZSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICB9CisgICAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9CisKK30KKworLy8vIFRIVFRQVHJhbnNwb3J0RXJyb3IKKy8vLworLy8vIEVycm9yJ3MgdGhyb3duIG9uIEhUVFAgVHJhbnNwb3J0CitwdWJsaWMgc3RydWN0IFRIVFRQVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBpbnZhbGlkUmVzcG9uc2UKKyAgICBjYXNlIGludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogSW50KQorICAgIGNhc2UgYXV0aGVudGljYXRpb24KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaW52YWxpZFJlc3BvbnNlOiAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgSFRUUCBSZXNwb25zZSIKKyAgICAgIGNhc2UgLmludmFsaWRTdGF0dXMobGV0IHN0YXR1c0NvZGUpOiAgcmV0dXJuICJJbnZhbGlkIEhUVFAgU3RhdHVzIENvZGUgKFwoc3RhdHVzQ29kZSkpIgorICAgICAgY2FzZSAuYXV0aGVudGljYXRpb246ICAgICAgICAgICAgICAgICByZXR1cm4gIkF1dGhlbnRpY2F0aW9uIEVycm9yIgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgcmV0dXJuIDAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5pbnZhbGlkUmVzcG9uc2UKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmludmFsaWRSZXNwb25zZSB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg1NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24gLy8gRm9yIChOUylEYXRhCisKKworLy8vIEdlbmVyaWMgcHJvdG9jb2wsIGltcGxlbWVudGVzIFRQcm90b2NvbCBhbmQgd3JhcHMgYSBjb25jcmV0ZSBwcm90b2NvbC4KKy8vLyBVc2VmdWwgZm9yIGdlbmVyaWNhbGx5IHN1YmNsYXNzaW5nIHByb3RvY29scyB0byBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIAorLy8vIChpLmUuIFRNdWx0aXBsZXhlZFByb3RvY29sKQorb3BlbiBjbGFzcyBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+IDogVFByb3RvY29sIHsKKyAgdmFyIGNvbmNyZXRlUHJvdG9jb2w6IFByb3RvY29sCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydAorICAgIH0KKyAgICBzZXQgeworICAgICAgY29uY3JldGVQcm90b2NvbC50cmFuc3BvcnQgPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuY29uY3JldGVQcm90b2NvbCA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgIH0KKyAgCisgIC8vIFJlYWQgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiBtZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IG5hbWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IGZpZWxkVHlwZSwgZmllbGRJRDogZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4oa2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKyAgfQorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKGRhdGEpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQxNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgVGhyaWZ0IHsKKwlsZXQgdmVyc2lvbiA9ICIxLjEuMCIKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGZlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IFhDVGVzdAorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnRUZXN0cworCitYQ1RNYWluKFsKKyAgICAgdGVzdENhc2UoVGhyaWZ0VGVzdHMuYWxsVGVzdHMpLAorICAgICB0ZXN0Q2FzZShUQmluYXJ5UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRDb21wYWN0UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCitdKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTU1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwxNjggQEAKKy8vCisvLyAgVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKKy8vICBUaHJpZnQKKy8vCisvLyAgQ3JlYXRlZCBieSBDaHJpc3RvcGhlciBTaW1wc29uIG9uIDgvMTgvMTYuCisvLworLy8KKworaW1wb3J0IFhDVGVzdAoraW1wb3J0IEZvdW5kYXRpb24KK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKKworLy8vIFRlc3RpbmcgQmluYXJ5IHByb3RvY29sIHJlYWQvd3JpdGUgYWdhaW5zdCBpdHNlbGYKKy8vLyBVc2VzIHNlcGFyYXRlIHJlYWQvd3JpdGUgdHJhbnNwb3J0L3Byb3RvY29scyAKK2NsYXNzIFRCaW5hcnlQcm90b2NvbFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgdmFyIHRyYW5zcG9ydDogVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7CisgICAgJDAucmVzZXQocmVhZEJ1ZmZlcjogJDEpCisgIH0pCisgIAorICB2YXIgcHJvdG86IFRCaW5hcnlQcm90b2NvbCEKKyAgCisgIG92ZXJyaWRlIGZ1bmMgc2V0VXAoKSB7CisgICAgc3VwZXIuc2V0VXAoKQorICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKworICAgIGxldCB3cml0ZVZhbDogSW50MTYgPSAxMjMxMgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICBmdW5jIHRlc3RVbnNhZmVCaXRjYXN0VXBkYXRlKCkgeworICAgIGxldCB2YWx1ZTogRG91YmxlID0gMy4xNDE1OQorICAgIGxldCB2YWw6IEludDY0ID0gMzE0MTU5MjYKKyAgICBsZXQgdXZhbDogVUludDY0ID0gMzE0MTU5MjYKKyAgICAKKyAgICBsZXQgaTY0ID0gSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgdWJjID0gdW5zYWZlQml0Q2FzdCh2YWx1ZSwgdG86IEludDY0LnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoaTY0LCB1YmMsICJCaXRjYXN0IERvdWJsZS0+IGk2NCBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYmwgPSBEb3VibGUoYml0UGF0dGVybjogVUludDY0KHZhbCkpCisgICAgbGV0IHViZGIgPSB1bnNhZmVCaXRDYXN0KHZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRibCwgdWJkYiwgIkJpdGNhc3QgaTY0IC0+IERvdWJsZSBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYjIgPSBEb3VibGUoYml0UGF0dGVybjogdXZhbCkKKyAgICBsZXQgdXNiYzIgPSB1bnNhZmVCaXRDYXN0KHV2YWwsIHRvOiBEb3VibGUuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChkYjIsIHVzYmMyLCAiQml0Y2FzdCB1NjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisKKyAgICAKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVEJpbmFyeVByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCkKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmMyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisvLworLy8gIFRDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOS8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzCitjbGFzcyBUQ29tcGFjdFByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgdmFyIHByb3RvOiBUQ29tcGFjdFByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IFVJbnQ4ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFVJbnQ4LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MTZXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MTYgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MTYsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDMyID0gMjAyOTIzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDMyID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDMyLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50NjRXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQ2NCA9IDIzNDIzNDk4MTM3NDEzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDY0ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDY0LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RG91YmxlV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRG91YmxlID0gMy4xNDE1OTI2CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRG91YmxlID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwLjAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRG91YmxlLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0Qm9vbFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEJvb2wgPSB0cnVlCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogQm9vbCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gZmFsc2UKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggQm9vbCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cmluZ1dyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFN0cmluZyA9ICJIZWxsbyBXb3JsZCIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBTdHJpbmchCisgICAgZG8geworICAgICAgcmVhZFZhbCA9IHRyeSBwcm90by5yZWFkKCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiRXJyb3IgcmVhZGluZyBcKGVycm9yKSIpCisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFN0cmluZywgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERhdGFXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEYXRhID0gIkRhdGEgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEYXRhID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAiR29vZGJ5ZSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEYXRhLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RydWN0V3JpdGVSZWFkKCkgeworICAgIGxldCBtc2cgPSAiVGVzdCBQcm90b2NvbCBFcnJvciIKKyAgICBsZXQgd3JpdGVWYWwgPSBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLnByb3RvY29sRXJyb3IsIG1lc3NhZ2U6IG1zZykKKyAgICBkbyB7CisgICAgICB0cnkgd3JpdGVWYWwud3JpdGUodG86IHByb3RvKQorICAgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJaaWdaYWcoKSB7CisgICAgbGV0IHplcm86IEludDMyID0gMAorICAgIGxldCBvbmU6IEludDMyID0gMQorICAgIGxldCBuT25lOiBJbnQzMiA9IC0xCisgICAgbGV0IHR3bzogSW50MzIgPSAyCisgICAgbGV0IG5Ud286IEludDMyID0gLTIKKyAgICBsZXQgbWF4ID0gSW50MzIubWF4CisgICAgbGV0IG1pbiA9IEludDMyLm1pbgorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcoemVybyksIFVJbnQzMigwKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigwKSwgemVybywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5PbmUpLCBVSW50MzIoMSksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMSksIG5PbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhvbmUpLCBVSW50MzIoMiksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigyKSwgb25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwob25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhuVHdvKSwgVUludDMyKDMpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDMpLCBuVHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcodHdvKSwgVUludDMyKDQpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoNCksIHR3bywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHR3bykiKQorCisgICAgbGV0IHVNYXhNaW51c09uZTogVUludDMyID0gVUludDMyLm1heCAtIDEKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhtYXgpLCB1TWF4TWludXNPbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMih1TWF4TWludXNPbmUpLCBtYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1pbiksIFVJbnQzMi5tYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMihVSW50MzIubWF4KSwgbWluLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWluKSIpCisgIH0KKworICBmdW5jIHRlc3RJbnQ2NFppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50NjQgPSAwCisgICAgbGV0IG9uZTogSW50NjQgPSAxCisgICAgbGV0IG5PbmU6IEludDY0ID0gLTEKKyAgICBsZXQgdHdvOiBJbnQ2NCA9IDIKKyAgICBsZXQgblR3bzogSW50NjQgPSAtMgorICAgIGxldCBtYXggPSBJbnQ2NC5tYXgKKyAgICBsZXQgbWluID0gSW50NjQubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh6ZXJvKSwgVUludDY0KDApLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDApLCB6ZXJvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobk9uZSksIFVJbnQ2NCgxKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgxKSwgbk9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG9uZSksIFVJbnQ2NCgyKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDIpLCBvbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG5Ud28pLCBVSW50NjQoMyksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMyksIG5Ud28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh0d28pLCBVSW50NjQoNCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCg0KSwgdHdvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50NjQgPSBVSW50NjQubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWluKSwgVUludDY0Lm1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KFVJbnQ2NC5tYXgpLCBtaW4sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVENvbXBhY3RQcm90b2NvbFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0SW50OFdyaXRlUmVhZCIsIHRlc3RJbnQ4V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDE2V3JpdGVSZWFkIiwgdGVzdEludDE2V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyV3JpdGVSZWFkIiwgdGVzdEludDMyV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDY0V3JpdGVSZWFkIiwgdGVzdEludDY0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERvdWJsZVdyaXRlUmVhZCIsIHRlc3REb3VibGVXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0Qm9vbFdyaXRlUmVhZCIsIHRlc3RCb29sV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cmluZ1dyaXRlUmVhZCIsIHRlc3RTdHJpbmdXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RGF0YVdyaXRlUmVhZCIsIHRlc3REYXRhV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cnVjdFdyaXRlUmVhZCIsIHRlc3RTdHJ1Y3RXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJaaWdaYWciLCB0ZXN0SW50MzJaaWdaYWcpLAorICAgICAgKCJ0ZXN0SW50NjRaaWdaYWciLCB0ZXN0SW50NjRaaWdaYWcpCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCitjbGFzcyBUaHJpZnRUZXN0czogWENUZXN0Q2FzZSB7CisgIGZ1bmMgdGVzdFZlcnNpb24oKSB7CisgICAgWENUQXNzZXJ0RXF1YWwoVGhyaWZ0KCkudmVyc2lvbiwgIjEuMS4wIikKKyAgfQorCisgIGZ1bmMgdGVzdF9pbl9hZGRyX2V4dGVuc2lvbigpIHsKKworICB9CisKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVGhyaWZ0VGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RWZXJzaW9uIiwgdGVzdFZlcnNpb24pLAorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3RzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvdHMvdGhyaWZ0LmQudHMgYi9saWIvdHMvdGhyaWZ0LmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNDZjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90aHJpZnQuZC50cwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitkZWNsYXJlIG1vZHVsZSBUaHJpZnQgeworICAvKioKKyAgICogVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSB2ZXJzaW9uLgorICAgKi8KKyAgdmFyIFZlcnNpb246IHN0cmluZzsKKworICAvKioKKyAgICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUT1AgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQk9PTCAgIC0gVHJ1ZS9GYWxzZSBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJZVEUgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLiAgICAgCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkxNiAgICAtIFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMzIgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTY0ICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUUklORyAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjcgICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY3IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJVQ1QgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBNQVAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAobWFwL2Fzc29jaWF0aXZlLWFycmF5L2RpY3Rpb25hcnkpLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNFVCAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBMSVNUICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY4ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGOCBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICovCisgIGludGVyZmFjZSBUeXBlIHsKKyAgICAnU1RPUCc6IG51bWJlcjsKKyAgICAnVk9JRCc6IG51bWJlcjsKKyAgICAnQk9PTCc6IG51bWJlcjsKKyAgICAnQllURSc6IG51bWJlcjsKKyAgICAnSTA4JzogbnVtYmVyOworICAgICdET1VCTEUnOiBudW1iZXI7CisgICAgJ0kxNic6IG51bWJlcjsKKyAgICAnSTMyJzogbnVtYmVyOworICAgICdJNjQnOiBudW1iZXI7CisgICAgJ1NUUklORyc6IG51bWJlcjsKKyAgICAnVVRGNyc6IG51bWJlcjsKKyAgICAnU1RSVUNUJzogbnVtYmVyOworICAgICdNQVAnOiBudW1iZXI7CisgICAgJ1NFVCc6IG51bWJlcjsKKyAgICAnTElTVCc6IG51bWJlcjsKKyAgICAnVVRGOCc6IG51bWJlcjsKKyAgICAnVVRGMTYnOiBudW1iZXI7CisgIH0KKyAgdmFyIFR5cGU6IFR5cGU7CisKKyAgLyoqCisgICAqIFRocmlmdCBSUEMgbWVzc2FnZSB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIENBTEwgICAgICAtIFJQQyBjYWxsIHNlbnQgZnJvbSBjbGllbnQgdG8gc2VydmVyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFJFUExZICAgICAtIFJQQyBjYWxsIG5vcm1hbCByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRVhDRVBUSU9OIC0gUlBDIGNhbGwgZXhjZXB0aW9uIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCisgICAqLworICBpbnRlcmZhY2UgTWVzc2FnZVR5cGUgeworICAgICdDQUxMJzogbnVtYmVyOworICAgICdSRVBMWSc6IG51bWJlcjsKKyAgICAnRVhDRVBUSU9OJzogbnVtYmVyOworICAgICdPTkVXQVknOiBudW1iZXI7CisgIH0KKyAgdmFyIE1lc3NhZ2VUeXBlOiBNZXNzYWdlVHlwZTsKKworICAvKioKKyAgICogVXRpbGl0eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvdW50IG9mIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLgorICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gT2JqZWN0IHRvIHRlc3QuCisgICAqIEByZXR1cm5zIHtudW1iZXJ9IG51bWJlciBvZiBvYmplY3QncyBvd24gcHJvcGVydGllcworICAgKi8KKyAgZnVuY3Rpb24gb2JqZWN0TGVuZ3RoKG9iajogT2JqZWN0KTogbnVtYmVyOworCisgIC8qKgorICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVzdGFibGlzaCBwcm90b3R5cGUgaW5oZXJpdGFuY2UuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBkZXJpdmVkLgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBiYXNlLgorICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVHlwZSBuYW1lIHRvIHNldCBhcyBuYW1lIHByb3BlcnR5IGluIGRlcml2ZWQgcHJvdG90eXBlLgorICAgKi8KKyAgZnVuY3Rpb24gaW5oZXJpdHMoY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBzdXBlckNvbnN0cnVjdG9yOiBGdW5jdGlvbiwgbmFtZT86IHN0cmluZyk6IHZvaWQ7CisKKyAgLyoqCisgICAqIFRFeGNlcHRpb24gaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBUaHJpZnQgZXhjZXB0aW9ucyB0eXBlcy4KKyAgICovCisgIGNsYXNzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBFcnJvciB7CisgICAgbmFtZTogc3RyaW5nOworICAgIG1lc3NhZ2U6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRFeGNlcHRpb24gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqLworICAgIGdldE1lc3NhZ2UoKTogc3RyaW5nOworICB9CisKKyAgLyoqCisgICAqIFRocmlmdCBBcHBsaWNhdGlvbiBFeGNlcHRpb24gdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOICAgICAgICAgICAgICAgICAtIFVua25vd24vdW5kZWZpbmVkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOS05PV05fTUVUSE9EICAgICAgICAgIC0gQ2xpZW50IGF0dGVtcHRlZCB0byBjYWxsIGEgbWV0aG9kIHVua25vd24gdG8gdGhlIHNlcnZlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX01FU1NBR0VfVFlQRSAgICAtIENsaWVudCBwYXNzZWQgYW4gdW5rbm93bi91bnN1cHBvcnRlZCBNZXNzYWdlVHlwZS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICAtIFVudXNlZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCQURfU0VRVUVOQ0VfSUQgICAgICAgICAtIFVudXNlZCBpbiBUaHJpZnQgUlBDLCB1c2VkIHRvIGZsYWcgcHJvcHJpZXRhcnkgc2VxdWVuY2UgbnVtYmVyIGVycm9ycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBNSVNTSU5HX1JFU1VMVCAgICAgICAgICAtIFJhaXNlZCBieSBhIHNlcnZlciBwcm9jZXNzb3IgaWYgYSBoYW5kbGVyIGZhaWxzIHRvIHN1cHBseSB0aGUgcmVxdWlyZWQgcmV0dXJuIHJlc3VsdC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICAtIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUFJPVE9DT0xfRVJST1IgICAgICAgICAgLSBUaGUgcHJvdG9jb2wgbGF5ZXIgZmFpbGVkIHRvIHNlcmlhbGl6ZSBvciBkZXNlcmlhbGl6ZSBkYXRhLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfVFJBTlNGT1JNICAgICAgIC0gVW51c2VkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfUFJPVE9DT0wgICAgICAgIC0gVGhlIHByb3RvY29sIChvciB2ZXJzaW9uKSBpcyBub3Qgc3VwcG9ydGVkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0gVW51c2VkLgorICAgKi8KKyAgaW50ZXJmYWNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgeworICAgICdVTktOT1dOJzogbnVtYmVyOworICAgICdVTktOT1dOX01FVEhPRCc6IG51bWJlcjsKKyAgICAnSU5WQUxJRF9NRVNTQUdFX1RZUEUnOiBudW1iZXI7CisgICAgJ1dST05HX01FVEhPRF9OQU1FJzogbnVtYmVyOworICAgICdCQURfU0VRVUVOQ0VfSUQnOiBudW1iZXI7CisgICAgJ01JU1NJTkdfUkVTVUxUJzogbnVtYmVyOworICAgICdJTlRFUk5BTF9FUlJPUic6IG51bWJlcjsKKyAgICAnUFJPVE9DT0xfRVJST1InOiBudW1iZXI7CisgICAgJ0lOVkFMSURfVFJBTlNGT1JNJzogbnVtYmVyOworICAgICdJTlZBTElEX1BST1RPQ09MJzogbnVtYmVyOworICAgICdVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSc6IG51bWJlcjsKKyAgfQorICB2YXIgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZTsKKworICAvKioKKyAgICogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCB0byBwcm9wYWdhdGUgZXhjZXB0aW9ucyBmcm9tIGFuIFJQQyBzZXJ2ZXIgYmFjayB0byBhIGNhbGxpbmcgY2xpZW50LgorICAgKi8KKyAgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgbWVzc2FnZTogc3RyaW5nOworICAgIGNvZGU6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZX0gW2NvZGVdIC0gVGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgY29kZS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU/OiBudW1iZXIpOworCisgICAgLyoqCisgICAgICogUmVhZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgorICAgICAqLworICAgIHJlYWQoaW5wdXQ6IE9iamVjdCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0byB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHtvYmplY3R9IG91dHB1dCAtIFRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgd3JpdGUob3V0cHV0OiBPYmplY3QpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNvZGUgc2V0IG9uIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybnMge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBleGNlcHRpb24gY29kZQorICAgICAqLworICAgIGdldENvZGUoKTogbnVtYmVyOworICB9CisKKyAgLyoqCisgICAqIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyBiZXR3ZWVuIFJQQworICAgKiBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUcmFuc3BvcnQgb2JqZWN0IHR5cGUgdXNlcyBIdHRwW3NdL1hIUiBhbmQgaXMKKyAgICogdGhlIHNvbGUgYnJvd3NlciBiYXNlZCBUaHJpZnQgdHJhbnNwb3J0LiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSAKKyAgICogdHJhbnNwb3J0IChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXIpLgorICAgKi8KKyAgY2xhc3MgVFhIUlRyYW5zcG9ydCB7CisgICAgdXJsOiBzdHJpbmc7CisgICAgd3BvczogbnVtYmVyOworICAgIHJwb3M6IG51bWJlcjsKKyAgICB1c2VDT1JTOiBhbnk7CisgICAgc2VuZF9idWY6IHN0cmluZzsKKyAgICByZWN2X2J1Zjogc3RyaW5nOworCisgICAgLyoqCisgICAgICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIFhIUiBvcGVyYXRpb25zIG9uCisgICAgICogeW91ciBvd24uIFRoaXMgdHlwZSBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgVHJhbnNwb3J0IGFsaWFzCisgICAgICogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHVybD86IHN0cmluZywgb3B0aW9ucz86IE9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorICAgICAqLworICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCk6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTCBhbmQKKyAgICAgKiB0aGUgYXN5bmMgcGFyYW1ldGVyIGlmIGZhbHNlLiBJZiB0aGUgdHJhbnNwb3J0IHdhcyBub3QgY3JlYXRlZCB3aXRoIGEgVVJMCisgICAgICogb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIG9yIHRoZSBVUkwgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgY3VycmVudCAKKyAgICAgKiBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyBvciB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBmbHVzaChhc3luYzogYW55LCBjYWxsYmFjaz86IEZ1bmN0aW9uKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGpRdWVyeSBYSFIgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGEgVGhyaWZ0IHNlcnZlciBjYWxsLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjbGllbnQgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xpZW50IG9iamVjdCBnZW5lcmF0ZWQgYnkgdGhlIElETCBjb21waWxlci4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdERhdGEgLSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlY3ZfbWV0aG9kIC0gVGhlIFRocmlmdCBTZXJ2aWNlIENsaWVudCByZWNlaXZlIG1ldGhvZCBmb3IgdGhlIGNhbGwuCisgICAgICogQHJldHVybnMge29iamVjdH0gQSBuZXcgalF1ZXJ5IFhIUiBvYmplY3QuCisgICAgICovCisgICAganFSZXF1ZXN0KGNsaWVudDogT2JqZWN0LCBwb3N0RGF0YTogYW55LCBhcmdzOiBGdW5jdGlvbiwgcmVjdl9tZXRob2Q6IEZ1bmN0aW9uKTogT2JqZWN0OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIGluIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdAorICAgICAqIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgICAgICovCisgICAgaXNPcGVuKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIGluIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdAorICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgYSBub3AuCisgICAgICovCisgICAgb3BlbigpOiB2b2lkOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgaW4gYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CisgICAgICogdGhpcyBmdW5jdGlvbiBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBjbG9zZSgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgICAgICogYnVmZmVyLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWQobGVuOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWRBbGwoKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICovCisgICAgd3JpdGUoYnVmOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXIoKTogc3RyaW5nOworICB9CisKKyAgLyoqCisgICAqIE9sZCBhbGlhcyBvZiB0aGUgVFhIUlRyYW5zcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAqLworICBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBUWEhSVHJhbnNwb3J0IHsgfQorCisgIC8qKgorICAgKiBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08gCisgICAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0IAorICAgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAgICovCisgIGNsYXNzIFRXZWJTb2NrZXRUcmFuc3BvcnQgeworICAgIHVybDogc3RyaW5nOyAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgICAgc29ja2V0OiBhbnk7ICAgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgICAgY2FsbGJhY2tzOiBGdW5jdGlvbltdOyAvL1BlbmRpbmcgY2FsbGJhY2tzCisgICAgc2VuZF9wZW5kaW5nOiBhbnlbXTsgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgICAgc2VuZF9idWY6IHN0cmluZzsgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgICAgcmVjdl9idWY6IHN0cmluZzsgICAgICAvL0luYm91bmQgZGF0YQorICAgIHJiX3dwb3M6IG51bWJlcjsgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgcmJfcnBvczogbnVtYmVyOyAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCisgICAgICogQHBhcmFtIHtzdHJpbmcgfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZyk7CisKKyAgICBfX3Jlc2V0KHVybDogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jIAorICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sgCisgICAgICogZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElnbm9yZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkgCisgICAgICovCisgICAgZmx1c2goYXN5bmM6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKTogc3RyaW5nOworCisgICAgX19vbk9wZW4oKTogdm9pZDsKKworICAgIF9fb25DbG9zZSgpOiB2b2lkOworCisgICAgX19vbk1lc3NhZ2UoKTogdm9pZDsKKworICAgIF9fb25FcnJvcigpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gCisgICAgICovCisgICAgaXNPcGVuKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBvcGVuKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgICAgICovCisgICAgY2xvc2UoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkKGxlbjogbnVtYmVyKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsKCk6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyKCk6IHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcyAKKyAgICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uIAorICAgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICAgKi8KKyAgY2xhc3MgVEpTT05Qcm90b2NvbCB7CisgICAgdHJhbnNwb3J0OiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgSWQgdG8gc3RyaW5nIG1hcHBpbmcuCisgICAgICogVGhlIG1hcHBpbmcgdGFibGUgbG9va3MgYXMgZm9sbG93czoKKyAgICAgKiBUaHJpZnQuVHlwZS5CT09MICAgLT4gInRmIjogVHJ1ZS9GYWxzZSBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkJZVEUgICAtPiAiaTgiOiBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JMTYgICAgLT4gImkxNiI6IFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JMzIgICAgLT4gImkzMiI6IFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JNjQgICAgLT4gImk2NCI6IFNpZ25lZCA2NCBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5ET1VCTEUgLT4gImRibCI6IDY0IGJpdCBJRUVFIDg1NCBmbG9hdGluZyBwb2ludC4KKyAgICAgKiBUaHJpZnQuVHlwZS5TVFJVQ1QgLT4gInJlYyI6IEEgbXVsdGlmaWVsZCB0eXBlLgorICAgICAqIFRocmlmdC5UeXBlLlNUUklORyAtPiAic3RyIjogQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAgICogVGhyaWZ0LlR5cGUuTUFQICAgIC0+ICJtYXAiOiBBIGNvbGxlY3Rpb24gdHlwZSAobWFwL2Fzc29jaWF0aXZlLWFycmF5L2RpY3Rpb25hcnkpLgorICAgICAqIFRocmlmdC5UeXBlLkxJU1QgICAtPiAibHN0IjogQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCkuCisgICAgICogVGhyaWZ0LlR5cGUuU0VUICAgIC0+ICJzZXQiOiBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAgICovCisgICAgVHlwZTogeyBbazogbnVtYmVyXTogc3RyaW5nIH07CisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAgICogVGhlIG1hcHBpbmcgdGFibGUgbG9va3MgYXMgZm9sbG93czoKKyAgICAgKiAidGYiICAtPiBUaHJpZnQuVHlwZS5CT09MICAKKyAgICAgKiAiaTgiICAtPiBUaHJpZnQuVHlwZS5CWVRFICAKKyAgICAgKiAiaTE2IiAtPiBUaHJpZnQuVHlwZS5JMTYgICAKKyAgICAgKiAiaTMyIiAtPiBUaHJpZnQuVHlwZS5JMzIgICAKKyAgICAgKiAiaTY0IiAtPiBUaHJpZnQuVHlwZS5JNjQgICAKKyAgICAgKiAiZGJsIiAtPiBUaHJpZnQuVHlwZS5ET1VCTEUKKyAgICAgKiAicmVjIiAtPiBUaHJpZnQuVHlwZS5TVFJVQ1QKKyAgICAgKiAic3RyIiAtPiBUaHJpZnQuVHlwZS5TVFJJTkcKKyAgICAgKiAibWFwIiAtPiBUaHJpZnQuVHlwZS5NQVAgICAKKyAgICAgKiAibHN0IiAtPiBUaHJpZnQuVHlwZS5MSVNUICAKKyAgICAgKiAic2V0IiAtPiBUaHJpZnQuVHlwZS5TRVQgICAKKyAgICAgKi8KKyAgICBSVHlwZTogeyBbazogc3RyaW5nXTogbnVtYmVyIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgVEpTT05Qcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KKyAgICAgKi8KKyAgICBWZXJzaW9uOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBKU09OIHByb3RvY29sIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3Rvcih0cmFuc3BvcnQ6IE9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRyYW5zcG9ydH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAqLworICAgIGdldFRyYW5zcG9ydCgpOiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgY2FsbCAoYWx3YXlzIDAgaW4gQXBhY2hlIFRocmlmdCkuCisgICAgICovCisgICAgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc3RyaW5nLCBtZXNzYWdlVHlwZTogbnVtYmVyLCBzZXFpZDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lPzogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0IGZpZWxkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZElkIC0gVGhlIGZpZWxkJ3MgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICovCisgICAgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBudW1iZXIsIGZpZWxkSWQ6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgdGhlIHNldCBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlRmllbGRTdG9wKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBrZXlUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IHZhbFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemVdIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwIChpZ25vcmVkKS4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IG51bWJlciwgdmFsVHlwZTogbnVtYmVyLCBzaXplPzogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlOiBudW1iZXIsIHNpemU6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0IGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gZWxlbVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgd3JpdGVTZXRCZWdpbihlbGVtVHlwZTogbnVtYmVyLCBzaXplOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICAgICAqLworICAgIHdyaXRlU2V0RW5kKCk6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KKyAgICB3cml0ZUJvb2wodmFsdWU6IGJvb2xlYW4pOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUJ5dGUoaTg6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTE2KGkxNjogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVJMzIoaTMyOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUk2NChpNjQ6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlRG91YmxlKGRibDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVTdHJpbmcoc3RyOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZUJpbmFyeShzdHI6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHJzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UgKDAgaW4gVGhyaWZ0IFJQQykuCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNZXNzYWdlQmVnaW4oKTogeyBmbmFtZTogc3RyaW5nOyBtdHlwZTogbnVtYmVyOyByc2VxaWQ6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KKyAgICByZWFkTWVzc2FnZUVuZCgpOiB2b2lkOworCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LiAKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkuCisgICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBzdHJpbmcgZm5hbWUgcHJvcGVydHkuCisgICAgICovCisgICAgcmVhZFN0cnVjdEJlZ2luKG5hbWU/OiBzdHJpbmcpOiB7IGZuYW1lOiBzdHJpbmcgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4gKi8KKyAgICByZWFkU3RydWN0RW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkRmllbGRCZWdpbigpOiB7IGZuYW1lOiBzdHJpbmc7IGZ0eXBlOiBudW1iZXI7IGZpZDogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4gKi8KKyAgICByZWFkRmllbGRFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBrdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1hcEJlZ2luKCk6IHsga3R5cGU6IG51bWJlcjsgdnR5cGU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuICovCisgICAgcmVhZE1hcEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGV0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZExpc3RCZWdpbigpOiB7IGV0eXBlOiBudW1iZXI7IHNpemU6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KKyAgICByZWFkTGlzdEVuZCgpOiB2b2lkOworCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LiAKKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzIChpZ25vcmVkKS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgKGlnbm9yZWQpLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRTZXRCZWdpbihlbGVtVHlwZT86IG51bWJlciwgc2l6ZT86IG51bWJlcik6IHsgZXR5cGU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCisgICAgcmVhZFNldEVuZCgpOiB2b2lkOworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gCisgICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAKKyAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZS4gKi8KKyAgICByZWFkQm9vbCgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkQnl0ZSgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkSTE2KCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRJMzIoZj86IGFueSk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRJNjQoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZERvdWJsZSgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkU3RyaW5nKCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRCaW5hcnkoKTogT2JqZWN0OworCisgICAgLyoqIAorICAgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YSAobm90IGltcGxlbWVudGVkKS4KKyAgICAgKi8KKyAgICBza2lwKHR5cGU6IG51bWJlcik6IHZvaWQ7CisgIH0KKworICAvKioKKyAgICogT2xkIGFsaWFzIG9mIHRoZSBUWEhSVHJhbnNwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICovCisgIGNsYXNzIFByb3RvY29sIGV4dGVuZHMgVEpTT05Qcm90b2NvbCB7IH0KKworICBjbGFzcyBNdWx0aXBsZXhQcm90b2NvbCBleHRlbmRzIFRKU09OUHJvdG9jb2wgeworICAgIHNlcnZpY2VOYW1lOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcnZOYW1lCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFucworICAgICAqIEBwYXJhbSB7YW55fSBbc3RyaWN0UmVhZF0KKyAgICAgKiBAcGFyYW0ge2FueX0gW3N0cmljdFdyaXRlXQorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHNydk5hbWU6IHN0cmluZywgdHJhbnM6IE9iamVjdCwgc3RyaWN0UmVhZD86IGFueSwgc3RyaWN0V3JpdGU/OiBhbnkpOworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZQorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzdHJpbmcsIHR5cGU6IG51bWJlciwgc2VxaWQ6IG51bWJlcik6IHZvaWQ7CisgIH0KKworICBjbGFzcyBNdWx0aXBsZXhlciB7CisgICAgc2VxaWQ6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG11bHRpcGxleGVkIGNsaWVudCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlLgorICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgICAgICogQHBhcmFtIHtUaHJpZnQuU2VydmljZUNsaWVudH0gU0NsIC0gVGhlIFNlcnZpY2UgQ2xpZW50IENsYXNzLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhyaWZ0LlRyYW5zcG9ydCBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyByZW1vdGUgaG9zdDpwb3J0LgorICAgICAqLworICAgIGNyZWF0ZUNsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBTQ2w6IGFueSwgdHJhbnNwb3J0OiBPYmplY3QpOiBhbnk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi94bWwvTWFrZWZpbGUuYW0gYi9saWIveG1sL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWQ2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgV0lUSF9KQVZBCisjIFNjaGVtYSB2YWxpZGF0aW9uIHRlc3QgZGVwZW5kcyBvbiBqYXZhCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBcCisgIHRocmlmdC1pZGwueHNkIFwKKyAgdGVzdApkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODdhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L2J1aWxkLnhtbCBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJYTUwgU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj5YTUwgU2NoZW1hIFZhbGlkYXRpb24gVGVzdDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9InhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLnhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uL2dlbi14bWwiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpZGwueG1sLnNjaGVtYSIgbG9jYXRpb249IiR7eG1sLmRpcn0vdGhyaWZ0LWlkbC54c2QiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQudGVzdC5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L3Rlc3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7Z2VuLnhtbC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9SZWN1cnNpdmUudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Db25zdGFudHNEZW1vLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1R5cGVkZWZUZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Bbm5vdGF0aW9uVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRG9jVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRW51bVRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L01hbnlUeXBlZGVmcy50aHJpZnQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQteG1sIi8+CisgICAgCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtZ2VuZXJhdGVkLXhtbCIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVGhyaWZ0VGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0luY2x1ZGUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9SZWN1cnNpdmUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9NYW55T3B0aW9uYWxzLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vT3B0aW9uYWxSZXF1aXJlZFRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Db25zdGFudHNEZW1vLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVHlwZWRlZlRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Bbm5vdGF0aW9uVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0RvY1Rlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9FbnVtVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L01hbnlUeXBlZGVmcy54bWwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4ueG1sLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJnZW5lcmF0ZS14bWwiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8YXJnIGxpbmU9Ii1nZW4geG1sOm1lcmdlIi8+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi54bWwuZGlyfSIvPgorICAgICAgICA8YXJnIGxpbmU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvZXhlYz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9InZhbGlkYXRlLXhtbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGVjaG8gbWVzc2FnZT0idmFsaWRhdGluZyBnZW5lcmF0ZWQgWE1MOiBAe2ZpbGV9IiAvPgorICAgICAgPHNjaGVtYXZhbGlkYXRlIGZpbGU9IkB7ZmlsZX0iPgorICAgICAgICA8c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICAgICAgICAgIGZpbGU9IiR7aWRsLnhtbC5zY2hlbWF9IiAvPgorICAgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCkBAIC0wLDAgKzEsMjgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDxlbGVtZW50IG5hbWU9ImlkbCIgdHlwZT0idG5zOklETCIgLz4KKyAgPGVsZW1lbnQgbmFtZT0iZG9jdW1lbnQiIHR5cGU9InRuczpEb2N1bWVudCIgLz4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iSURMIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCByZWY9InRuczpkb2N1bWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkRvY3VtZW50Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJ0bnM6SW5jbHVkZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ0bnM6TmFtZXNwYWNlIiAvPgorICAgICAgPC9jaG9pY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJleGNlcHRpb24iIHR5cGU9InRuczpFeGNlcHRpb24iIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InR5cGVkZWYiIHR5cGU9InRuczpUeXBlZGVmIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZXJ2aWNlIiB0eXBlPSJ0bnM6U2VydmljZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb25zdCIgdHlwZT0idG5zOkNvbnN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bmlvbiIgdHlwZT0idG5zOlVuaW9uIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbnVtIiB0eXBlPSJ0bnM6RW51bSIgLz4KKyAgICAgIDwvY2hvaWNlPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJJbmNsdWRlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iTmFtZXNwYWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkFic3RyYWN0U3RydWN0Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvZ3JvdXA+CisKKyAgPGF0dHJpYnV0ZUdyb3VwIG5hbWU9IlN0cnVjdEF0dHJpYnV0ZXMiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvYXR0cmlidXRlR3JvdXA+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkV4Y2VwdGlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InRuczpNZXRob2QiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LW1vZHVsZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LWlkIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+IAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJucyIgdHlwZT0idG5zOlRocmlmdFR5cGUiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0idGhyb3dzIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im9uZXdheSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUeXBlZGVmIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJVbmlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJFbnVtIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZW1iZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImludCIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cGxpY2l0IiB0eXBlPSJib29sZWFuIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkZpZWxkIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWVsZC1pZCIgdHlwZT0ibG9uZyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InRuczpSZXF1aXJlZG5lc3MiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxzaW1wbGVUeXBlIG5hbWU9IlJlcXVpcmVkbmVzcyI+CisgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25hbCIgLz4KKyAgICA8L3Jlc3RyaWN0aW9uPgorICA8L3NpbXBsZVR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkFubm90YXRpb24iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdCI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdExpc3QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0TWFwIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJrZXkiPgorICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+CisgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkNvbnN0VmFsdWUiPgorICAgIDxjaG9pY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZSIgdHlwZT0iZG91YmxlIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibGlzdCIgdHlwZT0idG5zOkNvbnN0TGlzdCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcCIgdHlwZT0idG5zOkNvbnN0TWFwIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJsb25nIiAvPgorICAgIDwvY2hvaWNlPgorICA8L2dyb3VwPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUaHJpZnRUeXBlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWxlbVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAvPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2V5VHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlVHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgPC9jaG9pY2U+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InRuczpUeXBlSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUtbW9kdWxlIiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlLWlkIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPHNpbXBsZVR5cGUgbmFtZT0iVHlwZUlkZW50aWZpZXIiPgorICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ2b2lkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJib29sIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJieXRlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpOCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTE2IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpMzIiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imk2NCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZG91YmxlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJiaW5hcnkiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im1hcCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic2V0IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsaXN0IiAvPgorICAgIDwvcmVzdHJpY3Rpb24+CisgIDwvc2ltcGxlVHlwZT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wYWNrYWdlLWxvY2suanNvbiBiL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDIxODMgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2NvZGUtZnJhbWUvLS9jb2RlLWZyYW1lLTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PZkMydWVtYWtuWHI4N2JkTFVrV29nN25ZdWxpTTlJajVIVWNhanNWY01DcFFyY0xtdHhSYlZGVElxbWNTa1NlWVJCRkJSeHMyRmlVcUZKRExkaWViQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQGJhYmVsL2hpZ2hsaWdodCI6ICJeNy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQGJhYmVsL2hpZ2hsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGlnaGxpZ2h0Ly0vaGlnaGxpZ2h0LTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VRk1DNFplRkM0OFRwdmo3QzhVZ0x2dGthVXVvdlFYKzV4Tldyc0lvTUc4bzJ6K1hGS2pLYU45aVZtUzg0ZFB3Vk4wMFc0d1BtcXZZb1pGM0VHQXNmdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjIuMC4wIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgImpzLXRva2VucyI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQHR5cGVzL25vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxMC4xMi42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvbm9kZS8tL25vZGUtMTAuMTIuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItK1pXQjVFYzFpa2k5OXhRRnpCbGl2bEt4U1pRK2Z1VUtCb3R0OFN0Qk9uTE40ZFdiUkhsZ2RnMVhrbnBXNmcwdHdlbmlONURjT3FBNjRDSnlPVVBTQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIkB0eXBlcy9xIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZXF6OGMvMGt3TmkvT0VIUWZ2SXVKVkxUc3QzaW4wZTd1VEtldVkrV0wvemZLbjB4VnVqT1RwNDJiUy92VVVva2hLNVAyQnBwTGQ5SlhNT01IY2diakE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4wLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rYlI1SllpbmM0d2w4MTNXOWpkU292aDNZVFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4vLS9hY29ybi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1htS0l2YnJOM1RWN2FWcUF6VkZhTVc4Rjh3elZYN3ZvRUJSTzNiREE2NCtFWDM3WVNheWdnUkpQNVhpZzZIWUhCa1dLcEZnOVc1Z2c2b3JrbHViaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLWpzeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhrQjUwZm4wTVVSRHl3dzkrVVlMM2MxeUxiT0J6MFpGdnJkWWxHQjhsK0lqZTFvU0M3NXFBcXJ6U1BqWVFiZG5RVXpobFVHTkt1ZXNyeUF2MGd4Wk9nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhanYiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWp2Ly0vYWp2LTYuNS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00V3lqdDgrdDZZc3pxYVhuTERmTW1HLzhBbE81WmJjc3kzQVRIbmNDempXL05vUHpBSWQ4QUs2NzQ5WWJqbWR0K2tVWTFnUDYwZkN1NDZvRHhQdi9tZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4yLjAuMSIsCisgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJeMi4wLjAiLAorICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuNC4xIiwKKyAgICAgICAgInVyaS1qcyI6ICJeNC4yLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYW1kZWZpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW1kZWZpbmUvLS9hbWRlZmluZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNsS0NyQlpIS2VrMkdiejlPdEZSK0JmT2tmVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1lc2NhcGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktZXNjYXBlcy8tL2Fuc2ktZXNjYXBlcy0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWdBYjhIOUQ0MUFRbnUvUGJXbENvZlFWY25WNEdzMmJCSmk5ZVpQeGZVL2hnZ2xGaDNTTURNRU5SSXFkcjdINlhGblhkb2tuY3RGQnlWc0NPb3RUVnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UU1Yd3lJR1QzbEdiQUtXYTkyMkJhczMyWmc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFwcm9iYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcHJvYmEvLS9hcHJvYmEtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVk5SjZaalh0b1loOFJuWFZDTU9VL3R0RG1rMWFCanVucTl2TzB0YTV4ODVXRFFpUWZVRjlzSVBCSVRkYmlpSVZjQm8wM0hpM2pNeGlnQnRzZGRsWFJ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcmUtd2UtdGhlcmUteWV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZS13ZS10aGVyZS15ZXQvLS9hcmUtd2UtdGhlcmUteWV0LTEuMS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01aFlkQWtabGNHOHRPTHVqVkRUZ0NUK3VQWDBWbnBBSDI4Z1dzTGZ6cFhZbTd3UDZtcDVRL2dZeVI3WVEwY0tWSmNYSm5sM2oya3BCYW4xM1B0UWY2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVsZWdhdGVzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC42IgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaW9uLy0vYXJyYXktdW5pb24tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1talJCRGs5T1BhSTk2amRiNWI1dzhrZDQ3RGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxLy0vYXJyYXktdW5pcS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXIycklkNkpjeC9kT0JZaVVkVGhZMzlzay9iWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyaWZ5Ly0vYXJyaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaVlVSTJpSW04NERma0Vjb1JXaEp3VkFhU3cwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdHcGhybFpJREF3OHNrSEpWaGppQ0pMNVp5bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYy1saW1pdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLWxpbWl0ZXIvLS9hc3luYy1saW1pdGVyLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcC91Rm5vb09pTytMMjExZVpPb1N5enBPSVRNWHgxckJJVGF1WXlrRzNCUllQdThoMFVjeHNQTkIwNFJSNXZvNFR5ejMrYXkxN3RSNkpWZjlxellXZz09IgorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFsYW5jZWQtbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWliVFJtYXNyN2tuZUZrNmdLNG5PUmkxeHQyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiaW5kaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iaW5kaW5ncy8tL2JpbmRpbmdzLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcExoNUV6TVIya3p2WDFLSWxWQzBWa0MzaVp0SEtUZ2R0WjBhM3BnbEJaZGFRRmp0NVM5Zzl4ZDFsRStZdlh5ZmQ2bXRDZVJuclVmT0xZaVRNbE5Tdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibC8tL2JsLTEuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lOHRRWW5ab2RtZWJZRFdHSDdLTVJ2dHpLWGFKSHgzQmJpbHJnWkNmdnlMVVlkS3BLMXQ1UFNQbXBrbnkvU2dpVFNDbmpmTFc3djVybE9OWFZGa1FFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuNSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJyYWNlLWV4cGFuc2lvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2UtZXhwYW5zaW9uLy0vYnJhY2UtZXhwYW5zaW9uLTEuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaUN1UEhERmdySFg3SDJ2RUkvNXhwejA3elNIQjAwVHB1Z3FobVl0Vm1NTzY1MThtQ3VSTW9PWUZsZEVCbDBnMTg3dWZvemRhSGdXS2NZRmI2MXFHaUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtbWFwIjogIjAuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MvLS9idWZmZXItYWxsb2MtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNGc0hRZ2p0VzFVQ2hkWGdieUpHdG5tK08vdUxRZVpkdGJEbzhtZlVnWVhDSFNNMXdnclZ4WG02YlN5clV1RXJFYis0c1lWR0N6QVNCUm90N3p5cm93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogIl4xLjEuMCIsCisgICAgICAgICJidWZmZXItZmlsbCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MtdW5zYWZlLy0vYnVmZmVyLWFsbG9jLXVuc2FmZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVEVNMmlNSUVRZEoyeWpQSm9TSXNsZG5sZVZhQWsxb1czREJWVXlreU9Mc0VzRm1FYzlrbitTRkZQeitnbDU0S1FOeGxEbkF3Q1hvc09TOU9reDJ4QWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1lcXVhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZXF1YWxzLy0vYnVmZmVyLWVxdWFscy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUExTzFUOUIvMlZaQmNHY2E1dlpyblBFTkovVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZmlsbC8tL2J1ZmZlci1maWxsLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1BlTGRuaVlpTzg1OGdYTlkzOW81d0lTS3l3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbGxlci1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxlci1wYXRoLy0vY2FsbGVyLXBhdGgtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sQWhlOWpXQjdOUGFxU1JFcVA2VTZDVjNkUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbHNpdGVzIjogIl4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYWxsc2l0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbHNpdGVzLy0vY2FsbHNpdGVzLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjZ1V0ppa1FwL004R2FWM1dDWEduelRqVU1vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZS1jb250cmliIjogIn4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhcmRldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFyZGV0Ly0vY2hhcmRldC0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVQ4aURjcmgwM3FER1JSbW9BMmhtQkpueHBsbE1SKzAvMHFsempxWkVTNk5kaVdEY1prQ05BazRyUEZaOVE4NXIyN3Vua2lOTmc4Wk9pd1pYQkh3Y0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNob3duciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaG93bnIvLS9jaG93bnItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWozOEV2TzUrTEhYODRqbG82aDRVem1Pd2kwVWdXNjFXUnlQdEp6NHFhYWRLNWVZM0JUUzVUWS9TMVN0YzNVazJsSU02VFBldkFsVUxpRUp3aWU4NjBnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaXJjdWxhci1qc29uIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NpcmN1bGFyLWpzb24vLS9jaXJjdWxhci1qc29uLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VWkszTkJ4Mk1jYStiNUxzRzdiWTE4M3BIV3Q1WTF4dHM0UDNQejdFTlR3R1ZuSk9VV2JSYjNvY2p2WDdoeDl0cS95VEFkY2xYbTlzWjM4Z051ZW00QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2xpLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktY3Vyc29yLy0vY2xpLWN1cnNvci0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMxMnNOMlI1K3N3K2xIUjlRZERROVNPUC9MVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXN0b3JlLWN1cnNvciI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xpLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS13aWR0aC8tL2NsaS13aWR0aC0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS94bnQ2S21sNVhreVFVZXd3UjhQdkxxKzFqaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2RlLXBvaW50LWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZGUtcG9pbnQtYXQvLS9jb2RlLXBvaW50LWF0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRFFjTFRRUTZXK296b3ZHa0RpN2JQWnBNejNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9yLWNvbnZlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFmQVV0ZCt2RmRBdEZRY0M4Q0N5WXQxZllXeFNxQWlLMmNTRDZ6REI4TjNjcHNFQkF2UnhwOXpPR2c2Ry9TSEhKWUFUODgvYXovSXVER0FMc05WYkdnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1uYW1lIjogIjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yLW5hbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItbmFtZS8tL2NvbG9yLW5hbWUtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wOUJWaTlpY1F2ZVYzVUl5ajNRSU1jcFR2Q1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tbWFuZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02dHZBT08rRDZPRU52UkFoNTI0RGg5amNmS1RZRFFBcXZxZXpiQ1c4MnhqNVgwcFNyY3B4dHZSS0hMRzB5Qlk2U0Q3UFNEckphaiswQWlPY0tWZDFYZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtbWFwLy0vY29uY2F0LW1hcC0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJLbHIxMy9XamZkNU9uTURhanVnMVVCZFIzcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25uZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy42LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nvbm5lY3QvLS9jb25uZWN0LTMuNi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2UvMnhWcjNJMjRUY1RXbkpYU0ZpMmVHOVNRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImZpbmFsaGFuZGxlciI6ICIxLjEuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAidXRpbHMtbWVyZ2UiOiAiMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uc29sZS1jb250cm9sLXN0cmluZ3MvLS9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBYejBSazIyUkc2bVJMOUxPVkIvbUZFQWpvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVidWciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkM3RWxyZEphSm5QYkFQKzFFb3RZdnFac2IzZWNsNXdpNkJmaTZCSlRVY05vd3A2Y3ZzcGcwalh6blJUS0RqbS9FN0FkZ0ZCVmVBUFZNTmNLR3NITUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1zIjogIjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjb21wcmVzcy1yZXNwb25zZS8tL2RlY29tcHJlc3MtcmVzcG9uc2UtMy4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nS1RkTWpkSU9FdjZKSUNEWWlydDdKZ3EzL009IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtcmVzcG9uc2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1lcXVhbC8tL2RlZXAtZXF1YWwtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZEpnS1N0bURnaE8vMHpieWZDSzB5UjBTTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1leHRlbmQvLS9kZWVwLWV4dGVuZC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTE9IeElPYVBZZEhsSlJ0Q1FmRElWWnRmdy91Zk04K3JWajY0OVJJSHpjbS92R3dRUlhGdDZPUHFJRldzbTJYRU1yTklFdFdSNjRzWTFMRUtEMnZBT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZXAtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1pcy8tL2RlZXAtaXMtMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMm5XKzEyOEUrN1BVaytSc0hEKzdjTlh6elE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnRpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnRpZXMvLS9kZWZpbmUtcHJvcGVydGllcy0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItM01xZllLajJsTHpkTVNmOFpJWkUvVitadXkrQmdENmYxNjRlOEsydzdkZ25wS0FyQkRlckdZcE00NklZWWNqbmtkUE5NalBrOUE2VkZCOCszU0tsWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9iamVjdC1rZXlzIjogIl4xLjAuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmVkLy0vZGVmaW5lZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXlZMmJ6dmRXZEJpT0VRbHBGUkdaNDVzZnBwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsLy0vZGVsLTIuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd1N5WUhRWjRSc2hMeXZoaXova3cyUWYvMGFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JieSI6ICJeNS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBhdGgtaW4tY3dkIjogIl4xLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjIuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxlZ2F0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsZWdhdGVzLy0vZGVsZWdhdGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaE1iaFdiZ1pCUDNLV2FEdlJNMkhEVEVsRDVvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1saWJjIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1saWJjLy0vZGV0ZWN0LWxpYmMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0raE44UzlhWTdmVmMxYzBDckZXZmthVEV1cHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9jdHJpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9jdHJpbmUvLS9kb2N0cmluZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMzVtU2t1NFpYSzB2ZkN1SEVEQXd0NTVkZzJqTmFqSFoxb2R2Ris4U1NyODJFc1pZNFFtWGZ1V3NvOG9FZDh6UmhWT2JTTjE4YU0wQ2pTZG9CWDd6SXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVlLWZpcnN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VlLWZpcnN0Ly0vZWUtZmlyc3QtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XUXhoRldzSzR2VHdKVmN5b1ZpeVpyeFdzaDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW5jb2RldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuY29kZXVybC8tL2VuY29kZXVybC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJULzB5RzdDMENreUwxb0N3Nm1tQnNsYlAxaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmQtb2Ytc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuZC1vZi1zdHJlYW0vLS9lbmQtb2Ytc3RyZWFtLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xTWtyWk52V1RLQ2FpZ2JuK1cxNWVscTJCQi9MMjJucXJTWTVES2xvM1g2K3ZjbEptOEJiNWRqWEpCbUVYNmZTMyt6Q2gvRjRWQks1WjJLeEp0NHMyUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS40LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtYWJzdHJhY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLWFic3RyYWN0Ly0vZXMtYWJzdHJhY3QtMS4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DOEZ4LzBqRm1WNUlQb01PRlBBOVA5RzVOdHFXKzRjT1BpdDNNSXV2UjJ0N0FnMksxNUVKVHB4bkhBWVR6TCthWVFKSUVTWWVYWm1EQmZPQkUxSGNwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXMtdG8tcHJpbWl0aXZlIjogIl4xLjEuMSIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIsCisgICAgICAgICJoYXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIsCisgICAgICAgICJpcy1yZWdleCI6ICJeMS4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtdG8tcHJpbWl0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLXRvLXByaW1pdGl2ZS8tL2VzLXRvLXByaW1pdGl2ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpyeUJPSmpWLy9MYXhMVFY2VUMvL1dld25lQjNMY1hPTDlOUCsrb3pLVlhzSUlJcG0vMmMxM1VEaUQ5SnAyZVRoc2VjdzltM2pQcUR3VHlvYmNkYmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuNCIsCisgICAgICAgICJpcy1kYXRlLW9iamVjdCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtc3ltYm9sIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtaHRtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtaHRtbC8tL2VzY2FwZS1odG1sLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQWxqcTVOUFF3SmRONGNGcEdJN3dCUjBkR1lnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1zdHJpbmctcmVnZXhwLy0vZXNjYXBlLXN0cmluZy1yZWdleHAtMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMkhBVmlHUXFOLzJyanV5endJQXloTUxodFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjb2RlZ2VuIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY29kZWdlbi8tL2VzY29kZWdlbi0xLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdsdFRyMGFURVF2cnNJWjZvME1OMDdjS0VCZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogIl4yLjcuMSIsCisgICAgICAgICJlc3RyYXZlcnNlIjogIl4xLjkuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJlc3RyYXZlcnNlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtMS45LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjJmeTNKSWxna0ZaVUpKZ2thUUFYU25KdTBRPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQvLS9lc2xpbnQtNS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpZQ2VGUWFoc3hmZkdsODdVMmFKN0RQeUg4Q2JXZ3hCQzIxM1k4K1RDYW5oVVRmMmdFdmZxM0VLcEhtRWNvelRMeVBtR2U5TFpkTUF3Qy9DcEpCTTVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvY29kZS1mcmFtZSI6ICJeNy4wLjAiLAorICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJjaGFsayI6ICJeMi4xLjAiLAorICAgICAgICAiY3Jvc3Mtc3Bhd24iOiAiXjYuMC41IiwKKyAgICAgICAgImRlYnVnIjogIl40LjAuMSIsCisgICAgICAgICJkb2N0cmluZSI6ICJeMi4xLjAiLAorICAgICAgICAiZXNsaW50LXNjb3BlIjogIl40LjAuMCIsCisgICAgICAgICJlc2xpbnQtdXRpbHMiOiAiXjEuMy4xIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImVzcHJlZSI6ICJeNC4wLjAiLAorICAgICAgICAiZXNxdWVyeSI6ICJeMS4wLjEiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAiZmlsZS1lbnRyeS1jYWNoZSI6ICJeMi4wLjAiLAorICAgICAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6ICJeMS4wLjEiLAorICAgICAgICAiZ2xvYiI6ICJeNy4xLjIiLAorICAgICAgICAiZ2xvYmFscyI6ICJeMTEuNy4wIiwKKyAgICAgICAgImlnbm9yZSI6ICJeNC4wLjYiLAorICAgICAgICAiaW11cm11cmhhc2giOiAiXjAuMS40IiwKKyAgICAgICAgImlucXVpcmVyIjogIl42LjEuMCIsCisgICAgICAgICJpcy1yZXNvbHZhYmxlIjogIl4xLjEuMCIsCisgICAgICAgICJqcy15YW1sIjogIl4zLjEyLjAiLAorICAgICAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeSI6ICJeMS4wLjEiLAorICAgICAgICAibGV2biI6ICJeMC4zLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjUiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgIm5hdHVyYWwtY29tcGFyZSI6ICJeMS40LjAiLAorICAgICAgICAib3B0aW9uYXRvciI6ICJeMC44LjIiLAorICAgICAgICAicGF0aC1pcy1pbnNpZGUiOiAiXjEuMC4yIiwKKyAgICAgICAgInBsdXJhbGl6ZSI6ICJeNy4wLjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjIuMC4wIiwKKyAgICAgICAgInJlZ2V4cHAiOiAiXjIuMC4xIiwKKyAgICAgICAgInJlcXVpcmUtdW5jYWNoZWQiOiAiXjEuMC4zIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjEiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJeMi4wLjEiLAorICAgICAgICAidGFibGUiOiAiXjUuMC4yIiwKKyAgICAgICAgInRleHQtdGFibGUiOiAiXjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctNC4xLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oZU5QSlVKSXFDK3hCNmF5TEFNSGFJcm1OOUhLYTdhUU84TUdxS3B2Q0ErdUpZVmN2UjZsNWtnZHJoUnV3UEZIVTdQNS9BMXcwQmpCeVBId3BmVERLZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtY29uZmlnLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1jb25maWctcHJldHRpZXIvLS9lc2xpbnQtY29uZmlnLXByZXR0aWVyLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RWUdmbXp1YzRxNEo2WElobHA4dlJLZEkvZkkwdFFmUVB5MWRNRTNVT0xwckUrdjRzc0gvM1c5TE0yUTdoNXFCY3k1bTBlaENyQkRVMllGOHE2T1k4dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl42LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1wbHVnaW4tcHJldHRpZXIvLS9lc2xpbnQtcGx1Z2luLXByZXR0aWVyLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00ZzExb3B6aHFxLzgrQU1tbzVWYzJHbjd6OWFsWjRKcXJiWitENGk4S2xTeXhlUWhaSGxtSXJZOFU5QWtmNTE0TW9FaG9nUGE4N0pna3E4N2FaMk9odz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJldHRpZXItbGludGVyLWhlbHBlcnMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1zY29wZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtc2NvcGUvLS9lc2xpbnQtc2NvcGUtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFHNlVURGk3SmMxRUxGd25SNThIVjRmSzlPUUs0UzZOOTg1ZjE2NnhxWHhwalU2cGx4RklTSmEyQmE5S0NRdUZhOFJDbmovbFNGSmJIbzdVRkRCblVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3JlY3Vyc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC11dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdXRpbHMvLS9lc2xpbnQtdXRpbHMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVo3WWpuSWxkWCsyWE1janI3WmtnRXNPai9iUkVPTlY2MHFZZUIvYmpNQXFxcVo0enhLeVdYK0JPVWtkbVJtQTlyaWlJUFZ2bzV4ODZtNWVsdmlPazBRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC12aXNpdG9yLWtleXMvLS9lc2xpbnQtdmlzaXRvci1rZXlzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xem0vWHhJYnhtL0ZIeUgzNDFacmJuTVVwZSs1Qm9jdGU5eGttRk16UE1qUmFaTWNYd3crTXBCcHRGdnRVKzc5TDM2Mm5xaUxoZWtDeEN4RFBhVU1CUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNwcmVlIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJlZS8tL2VzcHJlZS00LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSTVCeWNaVzZGQ1ZJdWI5M1RlVlkxczd2amhQOUNZNmNYQ3puSVJmaWlnN25SdmlLWllkUm5qL3NIRVdDNkE3V0U5UkRXT0ZxOSs3T3NXU1l6OHF2Mnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFjb3JuIjogIl42LjAuMiIsCisgICAgICAgICJhY29ybi1qc3giOiAiXjUuMC4wIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzcHJpbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVHdUZGdzdVcGRhK2c0cCtRSHZuVzBSeVRYL1NWZUpCRE0vZ0N0TUFSTzBjTHVUMkhjRUtuVFB2aGpWNmFHZXFyQ0Ivc2JOb3AwS3N6bTBqc2FXVTRBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3F1ZXJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcXVlcnkvLS9lc3F1ZXJ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1TbWl5WjV6SVdIOVZNK1NSVVJlTFM1UThhN0d4dFJkeEVCVlpwbTk4ckpNN1NiK0E5RFZDbmRYZmtlRlVkM2J5ZGVyZytFYkRrZm5ldmZDd3luV2FOQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNyZWN1cnNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcmVjdXJzZS8tL2VzcmVjdXJzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNjRSQkIrK2ZJT0FYUHczUDljeTg5cWZNbHZaRVhaa3FxSmtqcXFYSXZ6UDVlelJaalcrbFBXanczNVVYLzNFaFVQRlliZzVFUjRKWWdEdzQwMDcvRFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtNC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZTQvN1RIODFHbGhqT2MwSUpuOEd2b0wyeE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXN1dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3V0aWxzLy0vZXN1dGlscy0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNyOVBIS3BieXg5Nm5Zck1iZXBQcXFCTHJKcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHBhbmQtdGVtcGxhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhwYW5kLXRlbXBsYXRlLy0vZXhwYW5kLXRlbXBsYXRlLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jZWJxTHRWOEtPWmZ3MFVJOFRFRld4dGN6eHhDMWp2eVV2eDZINGZ5cDFLMUZON0E0USt1Z2dWVWxPc0kxSzhBR1UwcndPR3FQOG5DYXBkcnc4Q1lRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZXJuYWwtZWRpdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVybmFsLWVkaXRvci8tL2V4dGVybmFsLWVkaXRvci0zLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYm43MUg5K3FXb09RS3laRG8yNW1PTVZwU21YUk9Bc1RKVlZWWXpycnRvbDNkNHkrQXNLamY0SXdsMlErSXVUMGtGU1ExcW8xNjZVdUl3cVlxN21HbkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYXJkZXQiOiAiXjAuNy4wIiwKKyAgICAgICAgImljb252LWxpdGUiOiAiXjAuNC4yNCIsCisgICAgICAgICJ0bXAiOiAiXjAuMC4zMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXdVaGpkK1daNzkvTnd2My9iTExGZjNRcWtrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtZGlmZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRpZmYvLS9mYXN0LWRpZmYtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhKdW9UNStMOTlYbFo4dHdlZGFSZjZBeDJUZ1FWeHZnWk9Zb1BLcVp1Zm1KaWIwdEwydGVnUEJPWmIxcFZOZ0lobHFEbEEwZU8wYzN3QnZRY216eDR3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1sZXZlbnNodGVpbi8tL2Zhc3QtbGV2ZW5zaHRlaW4tMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QWXBjWm9nNkZxTU1xR1EraFI4WnVxZDVlUmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmlndXJlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWd1cmVzLy0vZmlndXJlcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9yR2kwcVlzaS90REdneVV5M2w2TDg0bnlXST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAiZmlsZS1lbnRyeS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWxlLWVudHJ5LWNhY2hlLy0vZmlsZS1lbnRyeS1jYWNoZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc1S1pERDVvUjRQWU9MaklTa1hZb0VoRmcyRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmbGF0LWNhY2hlIjogIl4xLjIuMSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5hbGhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluYWxoYW5kbGVyLy0vZmluYWxoYW5kbGVyLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtemd0b1ZiUllVK2VSc3Z6R2dBUnRpQ1U5MS9VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImVuY29kZXVybCI6ICJ+MS4wLjEiLAorICAgICAgICAiZXNjYXBlLWh0bWwiOiAifjEuMC4zIiwKKyAgICAgICAgIm9uLWZpbmlzaGVkIjogIn4yLjMuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAic3RhdHVzZXMiOiAifjEuMy4xIiwKKyAgICAgICAgInVucGlwZSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmxhdC1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGF0LWNhY2hlLy0vZmxhdC1jYWNoZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTB3TUxNck9CVlBUanQrbkhDZlNROSsrWHhJRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaXJjdWxhci1qc29uIjogIl4wLjMuMSIsCisgICAgICAgICJkZWwiOiAiXjIuMC4yIiwKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJ3cml0ZSI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yLWVhY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yLWVhY2gvLS9mb3ItZWFjaC0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanFZZkxwN21vOXZJeVFmOHlrVzJ2N0ErMk40UWplQ2VJNStEejlYcmFpTzFpZ244MXdqaUg3RmI5dlNPV3ZRZk50bVNhNEgyUm9RVHJyWGl2ZFVabXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1jb25zdGFudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMtY29uc3RhbnRzLy0vZnMtY29uc3RhbnRzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15Nk9Bd29TSWY3RnlqTUl2OTR1K2I1cmRoZVpFanpSNjNHVHlaSm01cWg0QmkrMllnd0xDY0kvZlBGWmtMNVBTaXhPdDZaTkttK3crSGZwL0JjaXdvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLy0vZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUd3cXp2VlU3S2cxam1kS2NEajZnc2xJSGd5Yz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnYXVnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nYXVnZS8tL2dhdWdlLTIuNy40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEFOQVhIVTR3NTErczNzeGNDTGpKZnNCaS9jPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFwcm9iYSI6ICJeMS4wLjMiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhcy11bmljb2RlIjogIl4yLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMSIsCisgICAgICAgICJ3aWRlLWFsaWduIjogIl4xLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNzU0eE9HOERHbjhOWkRyNEw5NVF4RmZ2QU1zPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1FWXZmVzR6Y1VhS241dzBoSGdmaXNMbXhCOU09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29kZS1wb2ludC1hdCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4xLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktMy4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwNHRIYXd5VjcrZmtrU0t5dmp1TFpzd2JsVXR6K1NRS3pTV25CYmlpMTZCdVprc0psVTF3dUJZWFk3NXIrZHVoL2xsRjF1cjZvTndpKzJaempLWjdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dpdGh1Yi1mcm9tLXBhY2thZ2UvLS9naXRodWItZnJvbS1wYWNrYWdlLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbC90ZGxyL2VpWE14UHlEb0tJNzVvV2Y2Wk00PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWxzIjogeworICAgICAgInZlcnNpb24iOiAiMTEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWxzLy0vZ2xvYmFscy0xMS44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlvNkxreVBWdXpDSEJTUVY5Zm1Pd3haa1VrNm5JYUdteGhlTERnbXVGdjg5ajBmbTJhcURiSVhLQUdmekNNSHF6M0hMRjJaZjhXU0c2VnFNaDJxRm1BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iYnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmJ5Ly0vZ2xvYmJ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNjloR1o4b051ek1MbWJ6OGFPckN2RlEzRGcwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaW9uIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJpZnkiOiAiXjEuMC4wIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMC4zIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncmFjZWZ1bC1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3JhY2VmdWwtZnMvLS9ncmFjZWZ1bC1mcy00LjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Eb3ZmNU5IZHVJVk5aT0JPcDhBT0tnSnVWbGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFuZGxlYmFycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFuZGxlYmFycy8tL2hhbmRsZWJhcnMtNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SaG1UZWtQK0ZaTCtYTmh3UzFXZitiVFRacGRMb3Vnd3Q1cGNnQTF0dXo2SmN4MGZwSC83ejBxZDcxUktuWkhCQ3hJUkJIZkJPbmlvNGdWaVBlbU56QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAiXjIuNS4wIiwKKyAgICAgICAgIm9wdGltaXN0IjogIl4wLjYuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjYuMSIsCisgICAgICAgICJ1Z2xpZnktanMiOiAiXjMuMS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMi42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mTkVpTDIrQVp0NkFsQXcvMjlDcjBVRGU0c1JBSENwRUhoNTRXTXorQmI3UWZOY0Z3NGgzbG9vZnlKcExlUXM0WXg3eXVxdS8yZExnTTVoS09zNkhsUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLy0vaGFzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mMmR2TzBWVTZPZWo3UmtXSkdyZWhqYnpNQWpGcDUvVktQcDV0VHBXSVY0SkhIWksxL0J4YkZSdGYvc2lBMlNXVGUwOWNhRG1WdFlZeldFSWJCUzR6dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWZsYWciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRkUlUzQ0dacmlKV21mTkdmbG9IODdsVnV2MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtc3ltYm9scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtc3ltYm9scy8tL2hhcy1zeW1ib2xzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdWhxUEd2S2cvRGxsRDF5RkEyZHdRU0lHTzBRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy11bmljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy11bmljb2RlLy0vaGFzLXVuaWNvZGUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00T2IrYWlqUFVST0lWZUNHMFdrZWR4M2lxTGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpZ25vcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWdub3JlLy0vaWdub3JlLTQuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jeUZES3JxYy9ZZGNXRm5pSmh6STQyK0F6UytnTndtVXpPU0ZjUkNRWXd5U3VCQkJ5L0tqdXhXTFovRkhFSDZNb3ExTml6TU9CV3lUY3Y4TzRPWklNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW11cm11cmhhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW11cm11cmhhc2gvLS9pbXVybXVyaGFzaC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWtoaTVzcmtvb2ppeFBjVDdhMjFYYnlNVVUrbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmZsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmZsaWdodC8tL2luZmxpZ2h0LTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2Ixak1kZlFMUXdKdkpFS0VIVzZnV1cxYmZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImluaGVyaXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaGVyaXRzLy0vaW5oZXJpdHMtMi4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZendzZytQYVFxVUM5U1JtQWlTQTlDQ0NZZDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5pIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaS8tL2luaS0xLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlpZNWh1SUtDTVJXRFVxWmxFaTcyZi9sbVhLTXZ1c3pjTUJkdWxpUTNubldieDlYL1pCUU83RGlqTUVZUzlFaEhCYjJxYWNSVU10Qzdzdkx3ZTBsY3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlucXVpcmVyIjogeworICAgICAgInZlcnNpb24iOiAiNi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lucXVpcmVyLy0vaW5xdWlyZXItNi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFJRVFHNFl5UTJVWVpHREM0c3JNWjdCakhPbU5rMWxSMkpRajVVa25CYXBrbG02V0hBK1ZWSDdOK3NVZFgzQTdOZUNmR0Y4bzRYMVMzQW83bkFjSWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLWVzY2FwZXMiOiAiXjMuMC4wIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjAuMCIsCisgICAgICAgICJjbGktY3Vyc29yIjogIl4yLjEuMCIsCisgICAgICAgICJjbGktd2lkdGgiOiAiXjIuMC4wIiwKKyAgICAgICAgImV4dGVybmFsLWVkaXRvciI6ICJeMy4wLjAiLAorICAgICAgICAiZmlndXJlcyI6ICJeMi4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIiwKKyAgICAgICAgIm11dGUtc3RyZWFtIjogIjAuMC43IiwKKyAgICAgICAgInJ1bi1hc3luYyI6ICJeMi4yLjAiLAorICAgICAgICAicnhqcyI6ICJeNi4xLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJ0aHJvdWdoIjogIl4yLjMuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1jYWxsYWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1jYWxsYWJsZS8tL2lzLWNhbGxhYmxlLTEuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yNXA5c3hKalluQXJMak9icGpBNHh1NUVLSTNDdUtIa0pYTWhUN2t3YnBVeUlGRDFuNVBNQXNvUHZXbnZ0WmlOejdMamtZRFJaaGQ3RmxJMGVNaWpFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZGF0ZS1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0ZS1vYmplY3QvLS9pcy1kYXRlLW9iamVjdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1xSU90cTdydi9kL3ZUUG5US0FiTTFnZE9oWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC8tL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzdNS1hFOFprWU1XZXFxNU8rNzY0OTM3WlU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtY3dkLy0vaXMtcGF0aC1jd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0waVhzSXhNdWllM1RqOXAyZEhMbUxtWHhFRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcGF0aC1pbi1jd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbi1jd2QvLS9pcy1wYXRoLWluLWN3ZC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRmpWMVJUVzQ4RTdDV003ZUUvSjJOSnZBRUVWZWt0ZWNEQlZCRTVIaDNuTTFKZDBrdmhIdFg2OFByM3hzRGY4NTd4dDNZNEFrd1ZVTEsxVmt1NjJhYVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXBhdGgtaW5zaWRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wYXRoLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWluc2lkZS8tL2lzLXBhdGgtaW5zaWRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtanZXMzNsQkRlai9jcHJUb1plOTZwVnkwZ0RZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtaXMtaW5zaWRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXByb21pc2UvLS9pcy1wcm9taXNlLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFLcDdPZndsdWdQTnRLeTg3d1d3ZjlMOC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlZ2V4Ly0vaXMtcmVnZXgtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WUmRJbTFSd2tiQ1REZ2xXVk03U1h1bCtsSkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1yZXNvbHZhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlc29sdmFibGUvLS9pcy1yZXNvbHZhYmxlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xZ0RZWEZTUjVXdkVmdVM1ZE1qNm9UTUVicnJTYU0wQ3JGazJZaXEvZ1huQnZEOXBNYTJqR1h4eWhHTGZ2aFpwdU1aZTE4Q0pwRnhBdDNDUnM0Mk5NZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtc3ltYm9sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN5bWJvbC8tL2lzLXN5bWJvbC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFM4Ylo5b3g2MHlDSkxIOXNuQnBJd3Y5cFlVQWtjdUxoU0Exb2VybzFVQjV5OWFpUXBSQTh5MmV4OTQ1QU90Q1pMMWxKRGVJazNHNUx0aHN3STQ2THc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1zeW1ib2xzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXN0YW5idWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXN0YW5idWwvLS9pc3RhbmJ1bC0wLjQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpjZlhQVXhOcUUxUE9zTVF1Umo3QzRBemN6cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMS4wLngiLAorICAgICAgICAiYXN5bmMiOiAiMS54IiwKKyAgICAgICAgImVzY29kZWdlbiI6ICIxLjgueCIsCisgICAgICAgICJlc3ByaW1hIjogIjIuNy54IiwKKyAgICAgICAgImdsb2IiOiAiXjUuMC4xNSIsCisgICAgICAgICJoYW5kbGViYXJzIjogIl40LjAuMSIsCisgICAgICAgICJqcy15YW1sIjogIjMueCIsCisgICAgICAgICJta2RpcnAiOiAiMC41LngiLAorICAgICAgICAibm9wdCI6ICIzLngiLAorICAgICAgICAib25jZSI6ICIxLngiLAorICAgICAgICAicmVzb2x2ZSI6ICIxLjEueCIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMy4xLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaGFzLWZsYWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW5aNTVNV1hPQVhvQThBUVl4RCtVS25zZEVmbz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMy4yLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmF3RkJMT1ZRWEhZcGtsR3NxNDh1NHBmVlBZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImhhcy1mbGFnIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqcy10b2tlbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMtdG9rZW5zLy0vanMtdG9rZW5zLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZEpVZmxjRTNjVXpLaU1xUWdzQ3UwNkZQdTlVZElKTzBiZVliUGhITjRrNmFwZ0p0aWZjb0N0VDliY3hPcFlCdHBEMmtDTTZTYnpnNENhdXNXL1BLUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QSXQyY253bVBmTDRoS053cWVpdXo0YktmbnpIVEJ2Nkh5VmdqYWhBNm1QTHdQRHpqRFdycGxKQk1qSFVGeGt1L04zRmxtcmJ5UGNsYWQrSSs0bUozQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC43IiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS8tL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uYmUxbEphdFB6eis4d3AxRkMwdGt3clhKbEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAia2xhdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjRW80TnhjNUJBZ0VWRVpUdXVjdjRXR1VQWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGV2biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZuLy0vbGV2bi0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU93bVNUdCtmQ0R3RWtQM1V3THhFSWVCSFpPND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJsb2Rhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjE3LjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2Rhc2gvLS9sb2Rhc2gtNC4xNy4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY1FLaDhpZ281UVVoWjdsZzM4RFlXQXhNdmpTQUtHMEE4d0dTVmltUDA3U0lVRUsyVU8rYXJTUktiUlpXdGVsTXRONVYwSGt3aDVyeU90by9Tc2hZSWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltaWMtZm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtZm4vLS9taW1pYy1mbi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamY4NHV4endpdWlJVktpT0xwZllrN040NlRTeTh1YlRvbm1uZVk5dnJwSE5BbnAwUUJ0MkJ4V1Y5ZE8zL2orQm9WQWIrYTVHNllEUFczTTVIT2RNV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLXJlc3BvbnNlLy0vbWltaWMtcmVzcG9uc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWo1RWN0bmtIN2FtZlYvcTVIZ21vYWwxZzJRSEZKUnJhT3RteDBKcElxa3hoQmhJL2xKU2wxbk1wUTQ1aFZhcndORVRPb1dFaW1uZFo0UUswUkh4dXhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hdGNoLy0vbWluaW1hdGNoLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SkhWUUVoeXFQTFVUZ3Q5QjgzUFh1Nlczcng0TXZ2SHZTVXZUb29ncHdvR0RPVVEreURyUjBIUm90K3lPQ2RDTzd1NGhYM3BXZnQ2a1dCQmNxaDBVQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJhY2UtZXhwYW5zaW9uIjogIl4xLjEuNyIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMC4wLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWC9LdjhNNWZTWWx1Q0tDWXVocXA2QVJzRjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIjAuMC44IgorICAgICAgfQorICAgIH0sCisgICAgIm1zIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibXV0ZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXV0ZS1zdHJlYW0vLS9tdXRlLXN0cmVhbS0wLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1IWE9rN3dodVBxMFBodkUybjZCRmUwZWU2cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFuLy0vbmFuLTIuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkFkSnY3ZkJMaFdDKy9CbHMwT3phK212VGFOUXRQKzFSeWhoaHZEOTVwZ1VKejZYTTVJemdteE9rSXRKOXRrb0NpcGx2QW5YSTF0Tm1tVUQvZVNjeUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hdHVyYWwtY29tcGFyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYXR1cmFsLWNvbXBhcmUvLS9uYXR1cmFsLWNvbXBhcmUtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TcjYvN3RkVUh5d25yUHNwdmJ2UlhJMWJwUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vZGUtYWJpIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtYWJpLy0vbm9kZS1hYmktMi40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFhL1VDNk5yMyt0cWhIR1JzQXV3L2VkejcvcTlubmV0QnJLV3hqNnJwVHRtKzBYOVQxcVU3bElFSE1TM3lOOUp3QWJSaUtVYlJSRnkxUEx6L3kzYWFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzZW12ZXIiOiAiXjUuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNmtHWE5zMVhUR0MyUGxNNFJHSXVDWEdpanM9IgorICAgIH0sCisgICAgIm5vb3AtbG9nZ2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vb3AtbG9nZ2VyLy0vbm9vcC1sb2dnZXItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sS0t4WXp4UEV4ZFZNQWZZbG0vUTZFRzJwTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9wdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJucG1sb2ciOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnBtbG9nLy0vbnBtbG9nLTQuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0ydVVxYXp1S2xUYVNJL2RDOEF6aWNVY2s3K0lyRWFPbk4vZTBqZDNYdHQxS2NHcHd4MzB2NTBtTDdvUHlyL2g5YkwzRTRhWmNjVndwd1ArNVc5VmprZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJlLXdlLXRoZXJlLXlldCI6ICJ+MS4xLjIiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAifjEuMS4wIiwKKyAgICAgICAgImdhdWdlIjogIn4yLjcuMyIsCisgICAgICAgICJzZXQtYmxvY2tpbmciOiAifjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWFzc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtYXNzaWduLy0vb2JqZWN0LWFzc2lnbi00LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlRbXR4NVpZaDgvQVhMdlVRc3JJdjdzMkNHTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtaW5zcGVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtaW5zcGVjdC8tL29iamVjdC1pbnNwZWN0LTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HSnpmQlo2RGdEQW1udWFNMzEwNGpSNHMxTXl4cjNZM3pmSXlONHozVWRxTjY5b1NSYWNOSzhVaG5vYkRkQys3SjJBSENqR3d4UXViTkpmRTcwU1hYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1rZXlzLy0vb2JqZWN0LWtleXMtMS4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GVE15RlVtMndCY0dIbkgyZVhtejd0QzZJd2xxUVo2bVZaKzZkbTZ2WjRJUUlIanM2RmROc1FCdUtHUHVVVVVZNk5mSncyUHNoQzA4VG42THpMRE9hZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib24tZmluaXNoZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb24tZmluaXNoZWQvLS9vbi1maW5pc2hlZC0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlQRXpaSUd3ZzgxMU0zbVNvV2x4cWkyUWFVYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlZS1maXJzdCI6ICIxLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9uZXRpbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25ldGltZS8tL29uZXRpbWUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CblFvSXcvV2RFT3llVXNpdTZVb3RvWjVZdFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtZm4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9wdGltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGltaXN0Ly0vb3B0aW1pc3QtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yajZuUm9iNklhR2FFUnd5YnBEckZhQVpab1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAifjAuMC4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4wLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAid29yZHdyYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW85WGFiTlhBdkFBSTAzSTB1NjhiN1dNRmtRYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpb25hdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGlvbmF0b3IvLS9vcHRpb25hdG9yLTAuOC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmt4ZVFKMC9UV01CMXNDMHdGdTZVQmdLNjJRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtaXMiOiAifjAuMS4zIiwKKyAgICAgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiAifjIuMC40IiwKKyAgICAgICAgImxldm4iOiAifjAuMy4wIiwKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcy1ob21lZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLWhvbWVkaXIvLS9vcy1ob21lZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtLzd4SmlETnVEb005NE1Gb3grOFZJU0dxZjdNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2V1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2V1cmwvLS9wYXJzZXVybC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS9DaWRUdGlaTVJsR0RCVmlVeVlzM0kzbVcvTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtaXMtaW5zaWRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtaW5zaWRlLy0vcGF0aC1pcy1pbnNpZGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ObFFYM3Q1RVF3MGNFYTloQW4rczhIUzkvRk09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcGFyc2UvLS9wYXRoLXBhcnNlLTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HU21PVDJFYkhySU5CZjlTUjdDREVMd2xKOEFFTmszUW43T2lrSzRuRllBdTNPdGUyK0pZTlZ2a3BBRVFtMy9UTE5FSkZEL3haSmp6eXhnM0tCV096dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBsdXJhbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wbHVyYWxpemUvLS9wbHVyYWxpemUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFSaEJPZHpTM2U0MUZia1cvWFdyVEV0dWtxcUxvSzUrWi80VWVEYUx1U1crMzlKUGVGZ3M0Z0NHcXNySkhWWlgwZlVyeC8vNE9GMEsxQ1VHd2xJRm93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmVidWlsZC1pbnN0YWxsIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWJ1aWxkLWluc3RhbGwvLS9wcmVidWlsZC1pbnN0YWxsLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03dGF5eGVZYm9KWDBSYlZ6ZG5LeUdsMnZoUVJXcjZxZkNsRVhEaE9rWGp1YU9LQ3cycThhaXVGaE9OUllWc0cvY3ppYTdLaHB5a0lsSTJTMlZhUHVuQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGV0ZWN0LWxpYmMiOiAiXjEuMC4zIiwKKyAgICAgICAgImV4cGFuZC10ZW1wbGF0ZSI6ICJeMS4wLjIiLAorICAgICAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6ICIwLjAuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJub2RlLWFiaSI6ICJeMi4yLjAiLAorICAgICAgICAibm9vcC1sb2dnZXIiOiAiXjAuMS4xIiwKKyAgICAgICAgIm5wbWxvZyI6ICJeNC4wLjEiLAorICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjEiLAorICAgICAgICAicHVtcCI6ICJeMi4wLjEiLAorICAgICAgICAicmMiOiAiXjEuMS42IiwKKyAgICAgICAgInNpbXBsZS1nZXQiOiAiXjIuNy4wIiwKKyAgICAgICAgInRhci1mcyI6ICJeMS4xMy4wIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAid2hpY2gtcG0tcnVucyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJwcmVsdWRlLWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWx1ZGUtbHMvLS9wcmVsdWRlLWxzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVpNcVZKOWVVdi9acUNmMWNPQkw1aXFYMmxRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci8tL3ByZXR0aWVyLTEuMTQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpEVm5Dcm5wc1JKSnE1blNzaUhDRTNCWU1FRDJPdHNJK2Ntekl6RjFRSWZxbTVBTGY4dEVKY08yN3pWMWdLTktSUGRoak8wZE5XbnJ6c3NEUTF0Rmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLy0vcHJldHRpZXItbGludGVyLWhlbHBlcnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdiSzJjUDlucmFTU1VGOU4yWHdVd3FmemxBRmxNTllZbCtTaEUvVitIOGE5dU5sL29VcUIxdzJFTDU0SmgwT2x5UlNkOFJmV1lKM2NvVlM0VFJPUDJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRpZmYiOiAiXjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnVQTU5Sa04zTUhQMWNXSmM5T1dyK1QveERQMGpoWFlDTGZKY0J1WDU0aGhmSUJuYVFtQVVNZkRjRzRETTVVTVdCeUJiSlk2OVFTcGhtM2p0REtJa0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhSc1JqZGYrajVtbCt5LzZHS0hQWmJyRi84cDJZZ2EwSlB0ZHFUSVkyWGU1b2hKUEQ5c2FESkpMUHZwOStOU0JwclZ2ZXZkWFp5Ym5qMmN2OE9FZDBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJxIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmpMM1cwRTRFcEhRUmhIeHZ4UVFtc0FHVWRjPSIKKyAgICB9LAorICAgICJyYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yYy8tL3JjLTEuMi44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15M2JHZ3FLajNRQmR4TGJMa29tbG9oa3ZzQThnZEFpVVFsU0JKbkJoZm4rQlB4ZzRiYzYyZDhUY0JXMTV3YXZEZmdleENnY2Nja2hjWnZ5d3lRWVBPdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1leHRlbmQiOiAiXjAuNi4wIiwKKyAgICAgICAgImluaSI6ICJ+MS4zLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMi4wIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4cHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXhwcC8tL3JlZ2V4cHAtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWx2ME02K1RrRFZuaUEzYUQxRWcwRFZwZlUvYm9vU3U3RWV2M1RETy9tWktIQmZWamdDR1RWNHQ0YnVwcEVTRVlEdGtBcllGT3hUSld2NlM1QytpYU53PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXF1aXJlLXVuY2FjaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpcmUtdW5jYWNoZWQvLS9yZXF1aXJlLXVuY2FjaGVkLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGcxVzFzbG1MOU1lUXdFY1M1V3FTWlZVSWRNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbGxlci1wYXRoIjogIl4wLjEuMCIsCisgICAgICAgICJyZXNvbHZlLWZyb20iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVpenpsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXp6bGUvLS9yZXF1aXp6bGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1hVVBEVXd4Tm1uNUc4YzNkVWNGWS9HY00yOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWZyb20iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS1mcm9tLy0vcmVzb2x2ZS1mcm9tLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnN2K2sxMGE3dXE3S2J3LzVhNndIcFBVUWlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc3RvcmUtY3Vyc29yIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3RvcmUtY3Vyc29yLy0vcmVzdG9yZS1jdXJzb3ItMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uMzdpaC9ndjB5YlUvUllwSTlZaEtlN2czNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25ldGltZSI6ICJeMi4wLjAiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInJlc3VtZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzdW1lci8tL3Jlc3VtZXItMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04ZWowWWVRR1M2T2VncTg4M0NxTWlUMEhaMWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjQiCisgICAgICB9CisgICAgfSwKKyAgICAicmltcmFmIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JpbXJhZi8tL3JpbXJhZi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHJlZXdMSy9CbGdobXh0ZkgzNllZVmcxaThJQWNlNFRJN29hbzc1STFnMjQ1KzZCY3RxVFZRaUJQM1lVSjlDNkRRT1hKbWtZUjlYOWZDTHRDT0pjNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAiXjcuMC41IgorICAgICAgfQorICAgIH0sCisgICAgInJ1bi1hc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ydW4tYXN5bmMvLS9ydW4tYXN5bmMtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM0dyU3VDOTF5RFVGbTE5L2FaUDk2UkZwc0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcHJvbWlzZSI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicnhqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yeGpzLy0vcnhqcy02LjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlRXbW9ZOXRXQ3M3enZJay9DdlJqaGpHYU9kK09WQk05ODdteEZvK09XNjZjR3BkS2paY3BtYzc0RVMxc0IvLzdLbC9QQWU4K3dFYWt1aEc0cGNnT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRzbGliIjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtYmxvY2tpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LWJsb2NraW5nLy0vc2V0LWJsb2NraW5nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkYrWGd0QVJycHBvQTkzVGdySkRrclBZa1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1jb25jYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWNvbmNhdC8tL3NpbXBsZS1jb25jYXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jMFRMdUxiaWI3Sjlackw4aHZuMjFabDFJY1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWdldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtZ2V0Ly0vc2ltcGxlLWdldC0yLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbFNTSFJTdzNtUU5VR1BBWVJxbzd4eTlkaEtteEZYSWpManA0S0hwZjk5R0VIMlZIN0MzQU0rUWZ4NmR1NmpoZlVpNlZtN1huYkVWRWY3V2I2TjhqUnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiAiXjMuMy4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIiwKKyAgICAgICAgInNpbXBsZS1jb25jYXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNsaWNlLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2xpY2UtYW5zaS8tL3NsaWNlLWFuc2ktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBPcXhCSzZMYjNxNnMwNDdEL1hzRFZOUG5GOURsOEpTYXFlOWg5bFVSbDBPZE5xeS91akRyT2lJSHRzcVhNR2JXV1RJb21SekFNYVR5YXdBVS8vUmVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJyYy92UHdycUJtMDNnTzliMjZxU0JaTFA1MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW1kZWZpbmUiOiAiPj0wLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcHJpbnRmLWpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0YXR1c2VzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXR1c2VzLy0vc3RhdHVzZXMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rdlVibnJkS3J2T3pyUFN0WDJHcjhreTN1VDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbk9xSDU5ZGVDcTlTUkhseHExQXc4NUpudDR3Nkt2TEtxV1ZpazZvQTlaa2xYTE5JT2xxZzRGMnlyVDFNVmFUakFxdlZ3ZGZlWjd3N2FDdkpEN3Vna3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLnByb3RvdHlwZS50cmltLy0vc3RyaW5nLnByb3RvdHlwZS50cmltLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMEUzaXlKNFRmMDE5SUc4SWExN1MrdWErak9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogIl4xLjEuMiIsCisgICAgICAgICJlcy1hYnN0cmFjdCI6ICJeMS41LjAiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVlUUl1c2F3MmlvY1RpYlkxSml4UVh1Tm84PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWJsZS8tL3RhYmxlLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lNTQyaW4yMlpMaEQvZk9JdVhzLzh5RFo5VzYxbHRGOGRhTTg4cmtSTnRnVEljdCt2STJmVG5BeXUvRGIyVENmRWNJOGk3bWpaejZtZUxxMG5XN1RZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAic2xpY2UtYW5zaSI6ICIxLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInRhZmZ5ZGIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFmZnlkYi8tL3RhZmZ5ZGItMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mTHkyUzFvVUcyb3UvQ3hkTEdlMDRWQ3lvbWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuOS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXBlLy0vdGFwZS00LjkuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNmZLSVhrbkxwb2UvSnA0cnpIS0ZQcEpVSERIRHFuOGp1czk5SWZQbkhJanl6NzhIWWxlZlRHRDNiNUVrYlF6dUxmYUV2bWZQSzNJb2xMZ3EyeFQza3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXF1YWwiOiAifjEuMC4xIiwKKyAgICAgICAgImRlZmluZWQiOiAifjEuMC4wIiwKKyAgICAgICAgImZvci1lYWNoIjogIn4wLjMuMyIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIn4xLjEuMSIsCisgICAgICAgICJnbG9iIjogIn43LjEuMiIsCisgICAgICAgICJoYXMiOiAifjEuMC4zIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJtaW5pbWlzdCI6ICJ+MS4yLjAiLAorICAgICAgICAib2JqZWN0LWluc3BlY3QiOiAifjEuNi4wIiwKKyAgICAgICAgInJlc29sdmUiOiAifjEuNy4xIiwKKyAgICAgICAgInJlc3VtZXIiOiAifjAuMC4wIiwKKyAgICAgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6ICJ+MS4xLjIiLAorICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjgiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZXNvbHZlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS43LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jN3J3TG9mcDhnMVUraDFLTnlITC9qaWNyS2cxRWs0cStMcjMzQUw2NXVaVGluVVpIZTMwRDVIbHlONVY5TlcwSlgxRDVkWFE0anFXNWw3U3kva0dmdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGF0aC1wYXJzZSI6ICJeMS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLWZzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItZnMvLS90YXItZnMtMS4xNi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OdkNlWHBZeDdPc21PaDh6SU9QL2ViRzU1elpteExFMGV0ZldSYldvaytxMlFvOHgvdk9SL0lKVDF0YUFEWFBlK2pzaXU5YXhEYjNYNEIraUlnTmxLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hvd25yIjogIl4xLjAuMSIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgInB1bXAiOiAiXjEuMC4wIiwKKyAgICAgICAgInRhci1zdHJlYW0iOiAiXjEuMS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJwdW1wIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04azBKdXBXbWU1NSs5dENWRStGUzVVTFQzSzZBYmdxckdhNThsVFQ0OVJweWZ3d2NHZWRIcWFDNUxsUU5kRUF1bW4vd0ZzdTZhUHdrdVBNaW95OGtxdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLXN0cmVhbS8tL3Rhci1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ6UzBoZWlOZjhYbjcvbXBkU1ZWU01BV0FveTliZmIxV09UWUM3OFowVVFLZUthL0NXUzhGT3EwbEtHTmE4RFdLQW45Z3hqQ3ZNTFljNVBHWFlsSzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibCI6ICJeMS4wLjAiLAorICAgICAgICAiYnVmZmVyLWFsbG9jIjogIl4xLjIuMCIsCisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjAuMCIsCisgICAgICAgICJmcy1jb25zdGFudHMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjAiLAorICAgICAgICAidG8tYnVmZmVyIjogIl4xLjEuMSIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGV4dC10YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXh0LXRhYmxlLy0vdGV4dC10YWJsZS0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWYxN29JNjZBVWdmQUN2TGZTb1RzUDgrbGNMUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidG1wIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjMzIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90bXAvLS90bXAtMC4wLjMzLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qUkNKbG9qS25aM2FkZHRUT2pkSXFvUnVQRUtCdk5YY0dZcXpPNnpXWlg4S2ZLRXBuR1k1amZnZ0pRM0VqS3V1OEQ0YkpScjB5K2NZSkZtWWJJbVhHdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtdG1wZGlyIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tYnVmZmVyLy0vdG8tYnVmZmVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1seDlCNWl2N21zdUZZRTNkeXRUK0tFNXRhcCtyTll3K0s0alZrYjlSL2FzQWIrcGJCU00xN2p0dW5IcGxoQmU2UlJKZFp4M1BuMkpwaDI0TzMybU9WZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHNsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHNsaWIvLS90c2xpYi0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNGtyRjhzY3BlamhhT2dxekJFY0dNN3lESUVmaTAvOCs4ekRSWmhOWloya2ptSEo0aHYzekNiUVd4b0pHejFpdzVVMEpsMG5tYTEzeHpIWGNuY01hdlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR1bm5lbC1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90dW5uZWwtYWdlbnQvLS90dW5uZWwtYWdlbnQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KNlhlb0dzMnNFb0ttV1ozU3lrSWFQRDhRUDA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGUtY2hlY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZS1jaGVjay8tL3R5cGUtY2hlY2stMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSVRLdFJMUEhUVmVQN2VFOHdnRXNyVWcyM0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlc2NyaXB0Ly0vdHlwZXNjcmlwdC0zLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdERNWWZWdHZwYjk2bXNTMWxEWDlNRWRIclc0eU91WjRLZGM0SGltOW9VNzk2WGxkUFlGL3QyK3VLb1gwQkJhMGhYWHdEbHFZUWJYWTVSemp6YzVoQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktanMvLS91Z2xpZnktanMtMy40LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThDSnNiS090RWJuSnNUeXY2TEU2bTZaS25pcU1pRldtbTlzUmJvcGJrR3MzZ01QUGZkM0ZoOGlJQTRZa3Y1TWdhVGJxSHI0QmFvR0xKTFpOaHNyVzFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogIn4yLjE3LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC42LjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjE3LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItd1BNVXQ2Rm5IMnl6Rzk1U0E2bXpqUU9FS1VVM2FMYURFbXpzMXRpKzFFOWgrQ3NyWmdoUmxxRU0vRUo0S3Njc1FWRzh1Tk40dVZyZVVlVDgrZHJsZ2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVR6KzFPeEJ1WUpmOCtjdEJDZktsNmIzNlVDST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5waXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VucGlwZS8tL3VucGlwZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNyOU82RkZLcm1GbHRJRjRLZEliTHZTWkJPdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cmktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLWpzLy0vdXJpLWpzLTQuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LWTlGcm1pcnFsOTFYMlFnanJ5MFdkNFkrWVRkcmRaaGVTOFRGd3ZrYkxXZi9HNUtOSkRDaDZwS0w1T1pjdEVXNCswQmFhNWlkSzJaUXVFTFJ3UHpuUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHVueWNvZGUiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0Zi04LXZhbGlkYXRlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0Zi04LXZhbGlkYXRlLy0vdXRmLTgtdmFsaWRhdGUtNC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNTNjNTc3A2enluQlE0SXhWemdqUDVBYmRvNkx1Sjg3SEZJY2dJaVZVZVk5NitNVEhrcUt0clVocGhid1E2alg4YVNHWnY4elg2bDFEQ1BwZmNBbnhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiaW5kaW5ncyI6ICJ+MS4zLjAiLAorICAgICAgICAibmFuIjogIn4yLjEwLjAiLAorICAgICAgICAicHJlYnVpbGQtaW5zdGFsbCI6ICJ+NC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlscy1tZXJnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlscy1tZXJnZS8tL3V0aWxzLW1lcmdlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjVWeEQxQ2laNVI3TE13U1IwSEJBb1FuNXhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2hpY2gtcG0tcnVucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC1wbS1ydW5zLy0vd2hpY2gtcG0tcnVucy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVp3czYrOFZTNExWZDlyZDRES2RHRmZJNjBjcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aWRlLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpZGUtYWxpZ24vLS93aWRlLWFsaWduLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RR2tPUWM4WEw2QnQ1UHduc0V4S0JQdU1LQnhuR3hXV1czZlU1NVh0NGZlSG96TVVoZFVNYUJDazI5MHFwbS93RzV1L1JTS3p3ZEFDNGk1MVlpZ2loQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMiB8fCAyIgorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KMWhJRUlrVVZxUVhISTBDSmtRYTNwREx5dXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cml0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cml0ZS8tL3dyaXRlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWDhBNEtPSmt6cVAra1VWVWR2ZWp4V2JMQjFjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiCisgICAgICB9CisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYy1saW1pdGVyIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ4bWxjcmVhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sY3JlYXRlLy0veG1sY3JlYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK212M1lxWUtRVCt6M1k5TEE4V3lhU09OTUk4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wY2JWTXI1bGJpUGJnZzc3bERvZkJKbU5ZNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NTNlZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDY2IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJub2RlLmpzIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKKyAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAorICAicmVwb3NpdG9yeSI6IHsKKyAgICAidHlwZSI6ICJnaXQiLAorICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICB9LAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJhdXRob3IiOiB7CisgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAiZW1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidXJsIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgfSwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICJsaWNlbnNlcyI6IFsKKyAgICB7CisgICAgICAidHlwZSI6ICJBcGFjaGUtMi4wIiwKKyAgICAgICJ1cmwiOiAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIgorICAgIH0KKyAgXSwKKyAgImJ1Z3MiOiB7CisgICAgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidXJsIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgorICB9LAorICAiZmlsZXMiOiBbCisgICAgImxpYi9ub2RlanMvbGliL3RocmlmdCIsCisgICAgImxpYi9ub2RlanMvUkVBRE1FLm1kIgorICBdLAorICAiZGlyZWN0b3JpZXMiOiB7CisgICAgImxpYiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIKKyAgfSwKKyAgIm1haW4iOiAiLi9saWIvbm9kZWpzL2xpYi90aHJpZnQiLAorICAiZW5naW5lcyI6IHsKKyAgICAibm9kZSI6ICI+PSA0LjEuMCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibm9kZS1pbnQ2NCI6ICJeMC40LjAiLAorICAgICJxIjogIl4xLjUuMCIsCisgICAgIndzIjogIl41LjAuMCIKKyAgfSwKKyAgImRldkRlcGVuZGVuY2llcyI6IHsKKyAgICAiYnVmZmVyLWVxdWFscyI6ICJeMS4wLjQiLAorICAgICJjb21tYW5kZXIiOiAiXjIuMTQuMSIsCisgICAgImNvbm5lY3QiOiAiXjMuNi42IiwKKyAgICAiZXNsaW50IjogIl41LjcuMCIsCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiAiXjMuMS4wIiwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6ICJeMy4wLjAiLAorICAgICJpc3RhbmJ1bCI6ICJeMC40LjUiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJwcmV0dGllciI6ICJeMS4xNC4zIiwKKyAgICAidGFwZSI6ICJeNC45LjAiLAorICAgICJ1dGYtOC12YWxpZGF0ZSI6ICJeNC4wLjAiLAorICAgICJ0eXBlc2NyaXB0IjogIl4zLjEuNiIsCisgICAgIkB0eXBlcy9ub2RlIjogIl4xMC4xMi42IiwKKyAgICAiQHR5cGVzL3EiOiAiXjEuNS4xIgorICB9LAorICAic2NyaXB0cyI6IHsKKyAgICAiY292ZXIiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggQ09WRVIiLAorICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAidGVzdC10cyI6ICJsaWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC0td3JpdGUgJyoqLyouanMnIiwKKyAgICAibGludCI6ICJlc2xpbnQgbGliL25vZGVqcy8uIC0tZXh0IC5qcyIsCisgICAgImxpbnQtdGVzdHMiOiAiZXNsaW50IGxpYi9ub2RlanMvdGVzdC8uIC0tZXh0IC5qcyIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGhwY3MueG1sLmRpc3QgYi9waHBjcy54bWwuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzODhhCi0tLSAvZGV2L251bGwKKysrIGIvcGhwY3MueG1sLmRpc3QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cnVsZXNldCBuYW1lPSJBcGFjaGVfVGhyaWZ0Ij4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvZGluZyBzdGFuZGFyZCBmb3IgdGhyaWZ0LjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZmlsZT5saWIvcGhwL2xpYjwvZmlsZT4KKyAgICA8ZmlsZT5saWIvcGhwL3Rlc3Q8L2ZpbGU+CisgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvcGFja2FnZXMvKjwvZXhjbHVkZS1wYXR0ZXJuPgorCisgICAgPGFyZyBuYW1lPSJiYXNlcGF0aCIgdmFsdWU9Ii4iLz4KKyAgICA8YXJnIG5hbWU9ImNvbG9ycyIgLz4KKyAgICA8YXJnIG5hbWU9InBhcmFsbGVsIiB2YWx1ZT0iNCIgLz4KKworICAgIDxydWxlIHJlZj0iUFNSMiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuTWV0aG9kcy5NZXRob2REZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuQ2xhc3Nlcy5Qcm9wZXJ0eURlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICA8L3J1bGU+CisKKyAgICA8cnVsZSByZWY9IlBTUjEuRmlsZXMuU2lkZUVmZmVjdHMiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorICAgIDxydWxlIHJlZj0iR2VuZXJpYy5GaWxlcy5MaW5lTGVuZ3RoIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKworPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kIGIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwxOSBAQAorU29tZSBoZWxwZnVsIHRpcHMgZm9yIGEgc3VjY2Vzc2Z1bCBBcGFjaGUgVGhyaWZ0IFBSOgorCisqIERpZCB5b3UgdGVzdCB5b3VyIGNoYW5nZXMgbG9jYWxseSBvciB1c2luZyBDSSBpbiB5b3VyIGZvcms/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIFBSIHRpdGxlPworKiBJcyB0aGUgQXBhY2hlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyIGluIHRoZSBjb21taXQgbWVzc2FnZT8KKyogRGlkIHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdD8KKyogQXJlIHRoZXNlIGNoYW5nZXMgYmFja3dhcmRzIGNvbXBhdGlibGU/IChwbGVhc2Ugc2F5IHNvIGluIFBSIGRlc2NyaXB0aW9uKQorKiBEbyB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIGxhbmd1YWdlLXNwZWNpZmljIFJFQURNRT8KKworRXhhbXBsZSBpZGVhbCBwdWxsIHJlcXVlc3QgdGl0bGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisKK0V4YW1wbGUgaWRlYWwgY29tbWl0IG1lc3NhZ2U6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbW1pdHRpbmcsIHNlZSBDT05UUklCVVRJTkcubWQKZGlmZiAtLWdpdCBhL3JhdF9leGNsdWRlIGIvcmF0X2V4Y2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2NlZDUuLjAwMDAwMDAKLS0tIGEvcmF0X2V4Y2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0uZ2l0aWdub3JlCi1DSEFOR0VTCi1DT05UUklCVVRPUlMKLWF1dG9zY2FuLmxvZwotY29uZmlnLmd1ZXNzCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWcuc3ViCi1jb25maWd1cmUKLWNvbmZpZ3VyZS5zY2FuCi1kZXBjb21wCi1pbnN0YWxsLXNoCi1saWJ0b29sCi1sdG1haW4uc2gKLW1pc3NpbmcKLXN0YW1wLWgxCi15bHdyYXAKLSoubTQKLWF1dG9tNHRlLmNhY2hlCi10aHJpZnR5LmgKLXZlcnNpb24uaAotdmVyc2lvbi5oLmluCi1tZDUuYwotbWQ1LmgKLWRvYwotbGliL2VybC92c24ubWsKLS9saWIvZXJsL2J1aWxkLyoqLyoKLWxpYi9lcmwvc3JjL01ha2VmaWxlCi10aHJpZnQuYXBwdXAuc3JjCi1PQ2FtbE1ha2VmaWxlCi1SRUFETUUtT0NhbWxNYWtlZmlsZQotVE9ETwotTWFuaWZlc3QKLXNldHVwLnJiCmRpZmYgLS1naXQgYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMgYi9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ1ZWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwpAQCAtMCwwICsxLDE0MCBAQAor77u/IyBBcGFjaGUgVGhyaWZ0IMKpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKworIyBGaWxlOiBzb25hci1wcm9qZWN0LnByb3BlcnRpZXMKKyMgQXBhY2hlIFRocmlmdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFNvbmFyIGh0dHBzOi8vYW5hbHlzaXMuYXBhY2hlLm9yZy8KKyMgU29uYXIgaXMgYW4gb3BlbiBwbGF0Zm9ybSB0byBtYW5hZ2UgY29kZSBxdWFsaXR5IGh0dHA6Ly93d3cuc29uYXJzb3VyY2Uub3JnLworCisKKyMgcmVxdWlyZWQgbWV0YWRhdGEKK3NvbmFyLnByb2plY3RLZXk9b3JnLmFwYWNoZS50aHJpZnQKK3NvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQKK3NvbmFyLnByb2plY3REZXNjcmlwdGlvbj0KK1RoZSBBcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIGZyYW1ld29yaywgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCitkZXZlbG9wbWVudCwgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZAorc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gYWxsIG1ham9yIGxhbmd1YWdlcy4KKworIyBBcGFjaGUgVGhyaWZ0IFZlcnNpb24KK3NvbmFyLnByb2plY3RWZXJzaW9uPTEuMC4wCisjIHVzZSB0aGlzIHRvIHNldCBhbm90aGVyIHZlcnNpb24gc3RyaW5nCisjICQgc29uYXItcnVubmVyIC1EIHNvbmFyLnByb2plY3RWZXJzaW9uPWBnaXQgcmV2LXBhcnNlIEhFQURgCisjIHNldCBwcm9qZWN0RGF0ZSBpbiBjb21iaW5hdGlvbiB3aXRoIHByb2plY3RWZXJzaW9uIGZvciBpbXBvcnRzIG9mIG9sZCByZWxlYXNlcworI3NvbmFyLnByb2plY3REYXRlPXl5eXktTU0tZGQKKworIyBUT0RPIGFkZCB3ZWJzaXRlIChzb25hci5wcm9qZWN0VXJsIGRvZXMgbm90IHdvcmspCisjc29uYXIuWFhYWD1odHRwLy90aHJpZnQuYXBhY2hlLm9yZworCisjIFNvbWUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZSBtb2R1bGVzCitzb25hci5zb3VyY2VzPXNyYworc29uYXIubGFuZ3VhZ2U9amF2YSxqcyxjKysscHksYworc29uYXIuc291cmNlRW5jb2Rpbmc9VVRGLTgKKworIyBzY20KK3NvbmFyLnNjbS51cmw9c2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKKworIyBjcHBjaGVjayAtcSAtLWVycm9yLWV4aXRjb2RlPTAgLS14bWwgLiAyPiBjcHBjaGVjay1yZXN1bHQueG1sCitzb25hci5jeHguY3BwY2hlY2sucmVwb3J0UGF0aD1jcHBjaGVjay1yZXN1bHQueG1sCisKKyMgTGlzdCBvZiB0aGUgbW9kdWxlIGlkZW50aWZpZXJzCitzb25hci5tb2R1bGVzPW1vZHVsZTEsbW9kdWxlMyxtb2R1bGU0LG1vZHVsZTUsbW9kdWxlNixtb2R1bGU3LG1vZHVsZTgsbW9kdWxlOSxtb2R1bGUxMCxtb2R1bGUxMSxtb2R1bGUxMixtb2R1bGUxNAorCisKKworIyB3ZSBuZWVkIHNvbmFyLXJ1bm5lciAyLjEgZm9yIHRoaXMsIHNlZSBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL1NPTkFSUExVR0lOUy0yNDIxCisjc29uYXIubW9kdWxlcz1tb2R1bGUyCisKKyMgZGVscGggcGx1Z2luIGlzIGJyb2tlbgorI3NvbmFyLm1vZHVsZXM9bW9kdWxlMTMKKworIyBwaHB1bml0IHBsdWdpbiBpcyBicm9rZW4KKyNzb25hci5tb2R1bGVzPW1vZHVsZTE1CisKK21vZHVsZTEuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmEgTGlicmFyeQorbW9kdWxlMS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvamF2YQorbW9kdWxlMS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMS5zb25hci50ZXN0cz10ZXN0Cittb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMS5zb25hci5saWJyYXJpZXM9YnVpbGQvZGVwcy8qLmphcgorbW9kdWxlMS5zb25hci5sYW5ndWFnZT1qYXZhCisKK21vZHVsZTIuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmEgVHV0b3JpYWwKK21vZHVsZTIuc29uYXIucHJvamVjdEJhc2VEaXI9LgorbW9kdWxlMi5zb25hci5zb3VyY2VzPXR1dG9yaWFsL2phdmEvc3JjLCB0dXRvcmlhbC9qYXZhL2dlbi1qYXZhCittb2R1bGUyLnNvbmFyLmJpbmFyaWVzPXR1dG9yaWFsL2phdmEvdHV0b3JpYWwuamFyCittb2R1bGUyLnNvbmFyLmxpYnJhcmllcz1saWIvamF2YS9idWlsZC9kZXBzLyouamFyLGxpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMi5zb25hci5sYW5ndWFnZT1qYXZhCisKK21vZHVsZTMuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmFTY3JpcHQgTGlicmFyeQorbW9kdWxlMy5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvanMKK21vZHVsZTMuc29uYXIuc291cmNlcz0uCittb2R1bGUzLnNvbmFyLmV4Y2x1c2lvbnM9dGVzdC8qKi8qCittb2R1bGUzLnNvbmFyLmxhbmd1YWdlPWpzCisKK21vZHVsZTQuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmFTY3JpcHQgVHV0b3JpYWwKK21vZHVsZTQuc29uYXIucHJvamVjdEJhc2VEaXI9dHV0b3JpYWwvanMKK21vZHVsZTQuc29uYXIuc291cmNlcz0uCittb2R1bGU0LnNvbmFyLmxhbmd1YWdlPXdlYgorCittb2R1bGU1LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDKysgTGlicmFyeQorbW9kdWxlNS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvY3BwCittb2R1bGU1LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU1LnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTUuc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTYuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBUdXRvcmlhbAorbW9kdWxlNi5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9jcHAKK21vZHVsZTYuc29uYXIuc291cmNlcz0uCittb2R1bGU2LnNvbmFyLmV4Y2x1c2lvbnM9Z2VuLWNwcC8qKi8qCittb2R1bGU2LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU3LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDKysgQ3Jvc3MgTGFuZ3VhZ2UgVGVzdAorbW9kdWxlNy5zb25hci5wcm9qZWN0QmFzZURpcj10ZXN0L2NwcAorbW9kdWxlNy5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlNy5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlOC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQ29tcGlsZXIKK21vZHVsZTguc29uYXIucHJvamVjdEJhc2VEaXI9Y29tcGlsZXIvY3BwCittb2R1bGU4LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU4LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU5LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQeXRob24gTGlicmFyeQorbW9kdWxlOS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvcHkKK21vZHVsZTkuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTkuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTAuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBUdXRvcmlhbAorbW9kdWxlMTAuc29uYXIucHJvamVjdEJhc2VEaXI9dHV0b3JpYWwvcHkKK21vZHVsZTEwLnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlMTAuc29uYXIuZXhjbHVzaW9ucz1nZW4tcHkvKiovKgorbW9kdWxlMTAuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTEuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBDcm9zcyBMYW5ndWFnZSBUZXN0Cittb2R1bGUxMS5zb25hci5wcm9qZWN0QmFzZURpcj10ZXN0L3B5Cittb2R1bGUxMS5zb25hci5zb3VyY2VzPS4KK21vZHVsZTExLnNvbmFyLmV4Y2x1c2lvbnM9Z2VuLSovKiovKgorbW9kdWxlMTEuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTIuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIGNfZ2xpYiBMaWJyYXJ5Cittb2R1bGUxMi5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvY19nbGliCittb2R1bGUxMi5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTIuc29uYXIubGFuZ3VhZ2U9YworCittb2R1bGUxMy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gRGVscGhpIExpYnJhcnkKK21vZHVsZTEzLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9kZWxwaGkKK21vZHVsZTEzLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxMy5zb25hci50ZXN0cz10ZXN0Cittb2R1bGUxMy5zb25hci5sYW5ndWFnZT1kZWxwaAorCittb2R1bGUxNC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gRmxleCAoYXMzKSBMaWJyYXJ5Cittb2R1bGUxNC5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvYXMzCittb2R1bGUxNC5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTQuc29uYXIubGFuZ3VhZ2U9ZmxleAorCittb2R1bGUxNS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUEhQIExpYnJhcnkKK21vZHVsZTE1LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9waHAKK21vZHVsZTE1LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxNS5zb25hci5sYW5ndWFnZT1waHAKKworIyBUT0RPIGFkZCBzb21lIG1vcmUgbGFuZ3VhZ2VzIGhlcmUKKwpkaWZmIC0tZ2l0IGEvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcCBiL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjljY2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSAiQWxsUHJvdG9jb2xUZXN0cy50Y2MiCi0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQotY2hhciBlcnJvck1lc3NhZ2VbRVJSX0xFTl07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICB0cnkgewotICAgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKLSAgICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgZS53aGF0KCkpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYyBiL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTMxMTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNQUk9UT0NPTFRFU1RfVENDXwotI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ1BST1RPQ09MVEVTVF9UQ0NfIDEKLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPFRocmlmdC5oPgotCi0jaW5jbHVkZSAiR2VuZXJpY0hlbHBlcnMuaCIKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KLSNkZWZpbmUgRVJSX0xFTiA1MTIKLWV4dGVybiBjaGFyIGVycm9yTWVzc2FnZVtFUlJfTEVOXTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bywgdHlwZW5hbWUgVmFsPgotdm9pZCB0ZXN0TmFrZWQoVmFsIHZhbCkgewotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUUHJvdG8odHJhbnNwb3J0KSk7Ci0KLSAgR2VuZXJpY0lPOjp3cml0ZShwcm90b2NvbCwgdmFsKTsKLSAgVmFsIG91dDsKLSAgR2VuZXJpY0lPOjpyZWFkKHByb3RvY29sLCBvdXQpOwotICBpZiAob3V0ICE9IHZhbCkgewotICAgIHNucHJpbnRmKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgbmFrZWQgdGVzdCAodHlwZTogJXMpIiwgQ2xhc3NOYW1lczo6Z2V0TmFtZTxWYWw+KCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFByb3RvLCBUVHlwZSB0eXBlLCB0eXBlbmFtZSBWYWw+Ci12b2lkIHRlc3RGaWVsZChjb25zdCBWYWwgdmFsKSB7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKLQotICBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RCZWdpbigidGVzdF9zdHJ1Y3QiKTsKLSAgcHJvdG9jb2wtPndyaXRlRmllbGRCZWdpbigidGVzdF9maWVsZCIsIHR5cGUsIChpbnQxNl90KTE1KTsKLQotICBHZW5lcmljSU86OndyaXRlKHByb3RvY29sLCB2YWwpOwotCi0gIHByb3RvY29sLT53cml0ZUZpZWxkRW5kKCk7Ci0gIHByb3RvY29sLT53cml0ZVN0cnVjdEVuZCgpOwotCi0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gIFRUeXBlIGZpZWxkVHlwZTsKLSAgaW50MTZfdCBmaWVsZElkOwotCi0gIHByb3RvY29sLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gIHByb3RvY29sLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwotCi0gIGlmIChmaWVsZElkICE9IDE1KSB7Ci0gICAgc25wcmludGYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCBJRCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7Ci0gIH0KLSAgaWYgKGZpZWxkVHlwZSAhPSB0eXBlKSB7Ci0gICAgc25wcmludGYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCBGaWVsZCBUeXBlICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgfQotCi0gIFZhbCBvdXQ7Ci0gIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKLQotICBpZiAob3V0ICE9IHZhbCkgewotICAgIHNucHJpbnRmKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgdmFsdWUgcmVhZCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7Ci0gIH0KLQotICBwcm90b2NvbC0+cmVhZEZpZWxkRW5kKCk7Ci0gIHByb3RvY29sLT5yZWFkU3RydWN0RW5kKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdG8+Ci12b2lkIHRlc3RNZXNzYWdlKCkgewotICBzdHJ1Y3QgVE1lc3NhZ2UgewotICAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICAgVE1lc3NhZ2VUeXBlIHR5cGU7Ci0gICAgaW50MzJfdCBzZXFpZDsKLSAgfSBtZXNzYWdlc1s0XSA9IHsKLSAgICB7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCi0gICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAotICAgIHsibG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyIsIFRfRVhDRVBUSU9OLCAxIDw8IDE2fSwKLSAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfQotICB9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUUHJvdG8odHJhbnNwb3J0KSk7Ci0KLSAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZXNbaV0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaV0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaV0uc2VxaWQpOwotICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VFbmQoKTsKLQotICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgVE1lc3NhZ2VUeXBlIHR5cGU7Ci0gICAgaW50MzJfdCBzZXFpZDsKLQotICAgIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKLSAgICBpZiAobmFtZSAhPSBtZXNzYWdlc1tpXS5uYW1lIHx8Ci0gICAgICAgIHR5cGUgIT0gbWVzc2FnZXNbaV0udHlwZSB8fAotICAgICAgICBzZXFpZCAhPSBtZXNzYWdlc1tpXS5zZXFpZCkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigicmVhZE1lc3NhZ2VCZWdpbiBmYWlsZWQuIik7Ci0gICAgfQotICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdG8+Ci12b2lkIHRlc3RQcm90b2NvbChjb25zdCBjaGFyKiBwcm90b25hbWUpIHsKLSAgdHJ5IHsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ4X3Q+KChpbnQ4X3QpMTIzKTsKLQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDEyODsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0JZVEUsIGludDhfdD4oKGludDhfdClpKTsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfQllURSwgaW50OF90PigoaW50OF90KS1pKTsKLSAgICB9Ci0KLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCkwKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCkxKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCkxNTAwMCk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpMHg3ZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpLTE1MDAwKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMHg3ZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCkpOwotCi0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCkxKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpNyk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTE1MCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTE1MDAwKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMHg3ZmZmKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpLTEpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktNyk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0xNTApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMHg3ZmZmKTsKLQotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDEpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDE1MDAwKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90PigweGZmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90PigtMTUwMDApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0weGZmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSk7Ci0KLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDEpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90Pig3KTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMTUwKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMTUwMDApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigzMTMzNyk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDB4ZmZmZik7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDB4ZmZmZmZmKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTEpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtNyk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0xNTApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwMDApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICsgMTApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpIC0gMTYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSk7Ci0KLQotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDApOwotICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IDYyOyBpKyspIHsKLSAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDFMIDw8IGkpOwotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oLSgxTCA8PCBpKSk7Ci0gICAgfQotCi0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KDApOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KDFMIDw8IGkpOwotICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KC0oMUwgPDwgaSkpOwotICAgIH0KLQotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGRvdWJsZT4oMTIzLjQ1Nik7Ci0KLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oIiIpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigic2hvcnQiKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oImJvcmRlcmxpbmV0aW55Iik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJhIGJpdCBsb25nZXIgdGhhbiB0aGUgc21hbGxlc3QgcG9zc2libGUiKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oIlx4MVx4Mlx4M1x4NFx4NVx4Nlx4N1x4OFx4OVx4QSIpOyAvL2tpbmRhIGJpbmFyeSB0ZXN0Ci0KLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCIiKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfU1RSSU5HLCBzdGQ6OnN0cmluZz4oImJvcmRlcmxpbmV0aW55Iik7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigiYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIik7Ci0KLSAgICB0ZXN0TWVzc2FnZTxUUHJvdG8+KCk7Ci0KLSAgICBwcmludGYoIiVzID0+IE9LXG4iLCBwcm90b25hbWUpOwotICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICIlcyA9PiBUZXN0IEZBSUxFRDogJXMiLCBwcm90b25hbWUsIGUud2hhdCgpKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7Ci0gIH0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdCBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CmluZGV4IDFhMzQzMjAuLjdlMjRlMWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CkBAIC0yOCw3ICsyOCw0NSBAQAogICBjcHAudHlwZSA9ICJEZW5zZUZvbyIsCiAgIHB5dGhvbi50eXBlID0gIkRlbnNlRm9vIiwKICAgamF2YS5maW5hbCA9ICIiLAorICBhbm5vdGF0aW9uLndpdGhvdXQudmFsdWUsCiApCiAKLXR5cGVkZWYgc3RyaW5nICggdW5pY29kZS5lbmNvZGluZyA9ICJVVEYtMTYiICkgbm9uX2xhdGluX3N0cmluZworZXhjZXB0aW9uIGZvb19lcnJvciB7CisgIDE6IGkzMiBlcnJvcl9jb2RlICggZm9vPSJiYXIiICkKKyAgMjogc3RyaW5nIGVycm9yX21zZworfSAoZm9vID0gImJhciIpCisKK3R5cGVkZWYgc3RyaW5nICggdW5pY29kZS5lbmNvZGluZyA9ICJVVEYtMTYiICkgbm9uX2xhdGluX3N0cmluZyAoZm9vPSJiYXIiKQogdHlwZWRlZiBsaXN0PCBkb3VibGUgKCBjcHAuZml4ZWRfcG9pbnQgPSAiMTYiICkgPiB0aW55X2Zsb2F0X2xpc3QKKworZW51bSB3ZWVrZGF5cyB7CisgIFNVTkRBWSAoIHdlZWtlbmQgPSAieWVzIiApLAorICBNT05EQVksCisgIFRVRVNEQVksCisgIFdFRE5FU0RBWSwKKyAgVEhVUlNEQVksCisgIEZSSURBWSwKKyAgU0FUVVJEQVkgKCB3ZWVrZW5kID0gInllcyIgKQorfSAoZm9vLmJhcj0iYmF6IikKKworLyogTm90ZSB0aGF0IGFubm90YXRpb25zIG9uIHNlbnVtIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KK3NlbnVtIHNlYXNvbnMgeworICAiU3ByaW5nIiwKKyAgIlN1bW1lciIsCisgICJGYWxsIiwKKyAgIldpbnRlciIKK30gKCBmb28gPSAiYmFyIiApCisKK3N0cnVjdCBvc3RyX2RlZmF1bHQgeworICAxOiBpMzIgYmFyOworfQorCitzdHJ1Y3Qgb3N0cl9jdXN0b20geworICAxOiBpMzIgYmFyOworfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKKworc2VydmljZSBmb29fc2VydmljZSB7CisgIHZvaWQgZm9vKCkgKCBmb28gPSAiYmFyIiApCit9IChhLmI9ImMiKQorCmRpZmYgLS1naXQgYS90ZXN0L0JlbmNobWFyay5jcHAgYi90ZXN0L0JlbmNobWFyay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTVmY2EuLjAwMDAwMDAKLS0tIGEvdGVzdC9CZW5jaG1hcmsuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KLSNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgIi4uL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotY2xhc3MgVGltZXIgewotcHVibGljOgotICB0aW1ldmFsIHZTdGFydDsKLQotICBUaW1lcigpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KLQotICBkb3VibGUgZnJhbWUoKSB7Ci0gICAgdGltZXZhbCB2RW5kOwotICAgIGdldHRpbWVvZmRheSgmdkVuZCwgMCk7Ci0gICAgZG91YmxlIGRzdGFydCA9IHZTdGFydC50dl9zZWMgKyAoKGRvdWJsZSl2U3RhcnQudHZfdXNlYyAvIDEwMDAwMDAuMCk7Ci0gICAgZG91YmxlIGRlbmQgPSB2RW5kLnR2X3NlYyArICgoZG91YmxlKXZFbmQudHZfdXNlYyAvIDEwMDAwMDAuMCk7Ci0gICAgcmV0dXJuIGRlbmQgLSBkc3RhcnQ7Ci0gIH0KLQotfTsKLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0gIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Ci0KLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0KLSAgaW50IG51bSA9IDEwMDAwMDA7Ci0KLSAgewotICAgIFRpbWVyIHRpbWVyOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkgKyspIHsKLSAgICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKLSAgICAgIFRCaW5hcnlQcm90b2NvbCBwcm90KGJ1Zik7Ci0gICAgICBvb2Uud3JpdGUoJnByb3QpOwotICAgIH0KLSAgICBjb3V0IDw8ICJXcml0ZTogIiA8PCBudW0gLyAoMTAwMCAqIHRpbWVyLmZyYW1lKCkpIDw8ICIga0h6IiA8PCBlbmRsOwotICB9Ci0KLSAgdWludDhfdCogZGF0YTsKLSAgdWludDMyX3QgZGF0YXNpemU7Ci0KLSAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7Ci0KLSAgewotCi0gICAgVGltZXIgdGltZXI7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSArKykgewotICAgICAgT25lT2ZFYWNoIG9vZTI7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKLSAgICAgIC8vYnVmMi0+cmVzZXRCdWZmZXIoZGF0YSwgZGF0YXNpemUpOwotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3QoYnVmMik7Ci0gICAgICBvb2UyLnJlYWQoJnByb3QpOwotCi0gICAgICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZTIpIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gICAgY291dCA8PCAiIFJlYWQ6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKLSAgfQotCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0IGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAppbmRleCBiZjQxNGVjLi5hNTQ1MzRkIDEwMDY0NAotLS0gYS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisrKyBiL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiBuYW1lc3BhY2UgY3BwIHlvem9uZQorbmFtZXNwYWNlIGVybCBjb25zdHNfCiAKIHN0cnVjdCB0aGluZyB7CiAgIDE6IGkzMiBoZWxsbywKQEAgLTI5LDIzICszMCwyNyBAQAogICBUV08gPSAyCiB9CiAKLXN0cnVjdCB0aGluZzIgewotICAvKiogc3RhbmRhcmQgZG9jc3RyaW5nICovCi0gIDE6IGVudW1jb25zdGFudHMgdmFsID0gVFdPCi19CisvLyBzdHJ1Y3QgdGhpbmcyIHsKKy8vICAgLyoqIHN0YW5kYXJkIGRvY3N0cmluZyAqLworLy8gICAxOiBlbnVtY29uc3RhbnRzIHZhbCA9IFRXTworLy8gfQogCiB0eXBlZGVmIGkzMiBteUludFR5cGUKIGNvbnN0IG15SW50VHlwZSBteUludCA9IDMKIAotY29uc3QgbWFwPGVudW1jb25zdGFudHMsc3RyaW5nPiBHRU5fRU5VTV9OQU1FUyA9IHtPTkUgOiAiSE9XRFkiLCBUV086IFBBUlRORVJ9CisvL2NvbnN0IG1hcDxlbnVtY29uc3RhbnRzLHN0cmluZz4gR0VOX0VOVU1fTkFNRVMgPSB7T05FIDogIkhPV0RZIiwgVFdPOiAiUEFSVE5FUiJ9CiAKIGNvbnN0IGkzMiBoZXhfY29uc3QgPSAweDAwMDFGCitjb25zdCBpMzIgbmVnYXRpdmVfaGV4X2NvbnN0YW50ID0gLTB4MDAwMUYKIAogY29uc3QgaTMyIEdFTl9NRSA9IC0zNTIzNTUzCiBjb25zdCBkb3VibGUgR0VuX0RVQiA9IDMyNS41MzIKIGNvbnN0IGRvdWJsZSBHRW5fRFUgPSAwODUuMjM1NQogY29uc3Qgc3RyaW5nIEdFTl9TVFJJTkcgPSAiYXNsZGtqYXNmZCIKIAorY29uc3QgZG91YmxlIGUxMCA9IDFlMTAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCitjb25zdCBkb3VibGUgZTExID0gLTFlMTAgIAorCiBjb25zdCBtYXA8aTMyLGkzMj4gR0VOX01BUCA9IHsgMzU1MzIgOiAyMzMsIDQzNTIzIDogODUzIH0KIGNvbnN0IGxpc3Q8aTMyPiBHRU5fTElTVCA9IFsgMjM1MjM1LCAyMzU5ODM1MiwgMzI1MzUyMyBdCiAKZGlmZiAtLWdpdCBhL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjFkOGYuLjAwMDAwMDAKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgIi4uL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgiCi0KLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Ci0KLQotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHhkNjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0KLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKLQotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBIb2x5TW9sZXkgaG07Ci0KLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotCi0gIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSA0OwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOwotCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKaW5kZXggYzY3ZmJjYi4uYjZhNzY1OSAxMDA2NDQKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKQEAgLTE3LDggKzE3LDEwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCituYW1lc3BhY2UgY19nbGliIFRUZXN0CiBuYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0LmRlYnVnCiBuYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIHJiIHRocmlmdC50ZXN0CiAKIHN0cnVjdCBEb3VibGVzIHsKICAxOiBkb3VibGUgbmFuLApAQCAtMjYsNyArMjgsNyBAQAogIDM6IGRvdWJsZSBuZWdpbmYsCiAgNDogZG91YmxlIHJlcGVhdGluZywKICA1OiBkb3VibGUgYmlnLAotIDY6IGRvdWJsZSBzbWFsbCwKKyA2OiBkb3VibGUgdGlueSwKICA3OiBkb3VibGUgemVybywKICA4OiBkb3VibGUgbmVnemVybywKIH0KQEAgLTM0LDggKzM2LDggQEAKIHN0cnVjdCBPbmVPZkVhY2ggewogICAxOiBib29sIGltX3RydWUsCiAgIDI6IGJvb2wgaW1fZmFsc2UsCi0gIDM6IGJ5dGUgYV9iaXRlID0gMjAwLAotICA0OiBpMTYgaW50ZWdlcjE2ID0gMzMwMDAsCisgIDM6IGk4IGFfYml0ZSA9IDB4N2YsCisgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAweDdmZmYsCiAgIDU6IGkzMiBpbnRlZ2VyMzIsCiAgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKICAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCkBAIC00Myw3ICs0NSw3IEBACiAgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCiAgIDEwOiBib29sIHdoYXRfd2hvLAogICAxMTogYmluYXJ5IGJhc2U2NCwKLSAgMTI6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAorICAxMjogbGlzdDxpOD4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAogICAxMzogbGlzdDxpMTY+IGkxNl9saXN0ID0gWzEsMiwzXSwKICAgMTQ6IGxpc3Q8aTY0PiBpNjRfbGlzdCA9IFsxLDIsM10KIH0KQEAgLTYwLDcgKzYyLDcgQEAKIAogc3RydWN0IEhvbHlNb2xleSB7CiAgIDE6IGxpc3Q8T25lT2ZFYWNoPiBiaWcsCi0gIDI6IHNldDxsaXN0PHN0cmluZz4+IGNvbnRhaW4sCisgIDI6IHNldDxsaXN0PHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+IGNvbnRhaW4sCiAgIDM6IG1hcDxzdHJpbmcsbGlzdDxCb25rPj4gYm9ua3MsCiB9CiAKQEAgLTcwLDExICs3MiwxNSBAQAogfQogCiBzdHJ1Y3QgRW1wdHkgewotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFdyYXBwZXIgewogICAxOiBFbXB0eSBmb28KLX0KK30gKAorICBweXRob24uaW1tdXRhYmxlID0gIiIsCispCiAKIHN0cnVjdCBSYW5kb21TdHVmZiB7CiAgIDE6IGkzMiBhLApAQCAtOTksNyArMTA1LDcgQEAKIAogc3RydWN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewogICAvLyBwcmltaXRpdmUgZmllbGRzCi0gIDE6IGJ5dGUgICBhX2J5dGU7CisgIDE6IGk4ICAgICBhX2J5dGU7CiAgIDI6IGkxNiAgICBhX2kxNjsKICAgMzogaTMyICAgIGFfaTMyOwogICA0OiBpNjQgICAgYV9pNjQ7CkBAIC0xMDksOSArMTE1LDkgQEAKICAgODogYm9vbCAgIHRydWVfZmllbGQ7CiAgIDk6IGJvb2wgICBmYWxzZV9maWVsZDsKICAgMTA6IEVtcHR5IGVtcHR5X3N0cnVjdF9maWVsZDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBsaXN0cwotICAxMTogbGlzdDxieXRlPiAgICBieXRlX2xpc3Q7CisgIDExOiBsaXN0PGk4PiAgICAgIGJ5dGVfbGlzdDsKICAgMTI6IGxpc3Q8aTE2PiAgICAgaTE2X2xpc3Q7CiAgIDEzOiBsaXN0PGkzMj4gICAgIGkzMl9saXN0OwogICAxNDogbGlzdDxpNjQ+ICAgICBpNjRfbGlzdDsKQEAgLTEyMCw5ICsxMjYsOSBAQAogICAxNzogbGlzdDxiaW5hcnk+ICBiaW5hcnlfbGlzdDsKICAgMTg6IGxpc3Q8Ym9vbD4gICAgYm9vbGVhbl9saXN0OwogICAxOTogbGlzdDxFbXB0eT4gICBzdHJ1Y3RfbGlzdDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBzZXRzCi0gIDIwOiBzZXQ8Ynl0ZT4gICAgIGJ5dGVfc2V0OworICAyMDogc2V0PGk4PiAgICAgICBieXRlX3NldDsKICAgMjE6IHNldDxpMTY+ICAgICAgaTE2X3NldDsKICAgMjI6IHNldDxpMzI+ICAgICAgaTMyX3NldDsKICAgMjM6IHNldDxpNjQ+ICAgICAgaTY0X3NldDsKQEAgLTEzMSwzNSArMTM3LDM5IEBACiAgIDI2OiBzZXQ8YmluYXJ5PiAgIGJpbmFyeV9zZXQ7CiAgIDI3OiBzZXQ8Ym9vbD4gICAgIGJvb2xlYW5fc2V0OwogICAyODogc2V0PEVtcHR5PiAgICBzdHJ1Y3Rfc2V0OwotICAKKwogICAvLyBtYXBzCiAgIC8vIHByaW1pdGl2ZXMgYXMga2V5cwotICAyOTogbWFwPGJ5dGUsIGJ5dGU+ICAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA7Ci0gIDMwOiBtYXA8aTE2LCBieXRlPiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOwotICAzMTogbWFwPGkzMiwgYnl0ZT4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKLSAgMzI6IG1hcDxpNjQsIGJ5dGU+ICAgICAgICAgICAgICBpNjRfYnl0ZV9tYXA7Ci0gIDMzOiBtYXA8ZG91YmxlLCBieXRlPiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOwotICAzNDogbWFwPHN0cmluZywgYnl0ZT4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKLSAgMzU6IG1hcDxiaW5hcnksIGJ5dGU+ICAgICAgICAgICBiaW5hcnlfYnl0ZV9tYXA7Ci0gIDM2OiBtYXA8Ym9vbCwgYnl0ZT4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKKyAgMjk6IG1hcDxpOCwgaTg+ICAgICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKKyAgMzA6IG1hcDxpMTYsIGk4PiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOworICAzMTogbWFwPGkzMiwgaTg+ICAgICAgICAgICAgICBpMzJfYnl0ZV9tYXA7CisgIDMyOiBtYXA8aTY0LCBpOD4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKKyAgMzM6IG1hcDxkb3VibGUsIGk4PiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOworICAzNDogbWFwPHN0cmluZywgaTg+ICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA7CisgIDM1OiBtYXA8YmluYXJ5LCBpOD4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKKyAgMzY6IG1hcDxib29sLCBpOD4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKICAgLy8gcHJpbWl0aXZlcyBhcyB2YWx1ZXMKLSAgMzc6IG1hcDxieXRlLCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7Ci0gIDM4OiBtYXA8Ynl0ZSwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOwotICAzOTogbWFwPGJ5dGUsIGk2ND4gICAgICAgICAgICAgIGJ5dGVfaTY0X21hcDsKLSAgNDA6IG1hcDxieXRlLCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7Ci0gIDQxOiBtYXA8Ynl0ZSwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOwotICA0MjogbWFwPGJ5dGUsIGJpbmFyeT4gICAgICAgICAgIGJ5dGVfYmluYXJ5X21hcDsKLSAgNDM6IG1hcDxieXRlLCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOworICAzNzogbWFwPGk4LCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7CisgIDM4OiBtYXA8aTgsIGkzMj4gICAgICAgICAgICAgIGJ5dGVfaTMyX21hcDsKKyAgMzk6IG1hcDxpOCwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOworICA0MDogbWFwPGk4LCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7CisgIDQxOiBtYXA8aTgsIHN0cmluZz4gICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcDsKKyAgNDI6IG1hcDxpOCwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOworICA0MzogbWFwPGk4LCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyBrZXlzCi0gIDQ0OiBtYXA8bGlzdDxieXRlPiwgYnl0ZT4gICAgICAgbGlzdF9ieXRlX21hcDsKLSAgNDU6IG1hcDxzZXQ8Ynl0ZT4sIGJ5dGU+ICAgICAgICBzZXRfYnl0ZV9tYXA7Ci0gIDQ2OiBtYXA8bWFwPGJ5dGUsYnl0ZT4sIGJ5dGU+ICAgbWFwX2J5dGVfbWFwOworICA0NDogbWFwPGxpc3Q8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgbGlzdF9ieXRlX21hcDsKKyAgNDU6IG1hcDxzZXQ8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgIHNldF9ieXRlX21hcDsKKyAgNDY6IG1hcDxtYXA8aTgsaTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgIG1hcF9ieXRlX21hcDsKICAgLy8gY29sbGVjdGlvbnMgYXMgdmFsdWVzCi0gIDQ3OiBtYXA8Ynl0ZSwgbWFwPGJ5dGUsYnl0ZT4+ICAgYnl0ZV9tYXBfbWFwOwotICA0ODogbWFwPGJ5dGUsIHNldDxieXRlPj4gICAgICAgIGJ5dGVfc2V0X21hcDsKLSAgNDk6IG1hcDxieXRlLCBsaXN0PGJ5dGU+PiAgICAgICBieXRlX2xpc3RfbWFwOworICA0NzogbWFwPGk4LCBtYXA8aTgsaTg+PiAgICAgYnl0ZV9tYXBfbWFwOworICA0ODogbWFwPGk4LCBzZXQ8aTg+PiAgICAgICAgYnl0ZV9zZXRfbWFwOworICA0OTogbWFwPGk4LCBsaXN0PGk4Pj4gICAgICAgYnl0ZV9saXN0X21hcDsKIH0KIAorLy8gVG8gYmUgdXNlZCB0byB0ZXN0IHRoZSBzZXJpYWxpemF0aW9uIG9mIGFuIGVtcHR5IG1hcAorc3RydWN0IFNpbmdsZU1hcFRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBtYXA8aTMyLCBpMzI+ICAgICAgIGkzMl9tYXA7Cit9CiAKIGNvbnN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgQ09NUEFDVF9URVNUID0gewogICAnYV9ieXRlJyAgICAgICAgICAgICA6IDEyNywKQEAgLTIzOCw2ICsyNDgsOCBAQAogICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncygxOiBpMzIgc29tZXRoaW5nID0gTVlDT05TVCk7CiAKICAgb25ld2F5IHZvaWQgb25ld2F5TWV0aG9kKCk7CisKKyAgYm9vbCBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCgxOiBib29sIHNob3VsZFRocm93KSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIHh3YW1hcCk7CiB9CiAKIHNlcnZpY2UgSW5oZXJpdGVkIGV4dGVuZHMgU3J2IHsKQEAgLTI0OSwxMCArMjYxLDEwIEBACiAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCiAvLyBzbyB0aGF0IFpsaWJUZXN0IGhhcyBtb3JlIGhpZ2hseSBjb21wcmVzc2libGUgZGF0YSB0byBwbGF5IHdpdGguCiBzdHJ1Y3QgQmxvd1VwIHsKLSAgMTogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjE7Ci0gIDI6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIyOwotICAzOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMzsKLSAgNDogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjQ7CisgIDE6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjE7CisgIDI6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjI7CisgIDM6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjM7CisgIDQ6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjQ7CiB9CiAKIApAQCAtMjcyLDEzICsyODQsMTQgQEAKICAgVFdPID0gMgogfQogCi1jb25zdCBTb21lRW51bSBNWV9TT01FX0VOVU0gPSBPTkUKKy8qKiBUaGlzIGlzIGEgZG9jc3RyaW5nIG9uIGEgY29uc3RhbnQhICovCitjb25zdCBTb21lRW51bSBNWV9TT01FX0VOVU0gPSBTb21lRW51bS5PTkUKIAogY29uc3QgU29tZUVudW0gTVlfU09NRV9FTlVNXzEgPSAxCiAvKmNvbnN0IFNvbWVFbnVtIE1ZX1NPTUVfRU5VTV8yID0gNyovCiAKIGNvbnN0IG1hcDxTb21lRW51bSxTb21lRW51bT4gTVlfRU5VTV9NQVAgPSB7Ci0gIE9ORSA6IFRXTworICBTb21lRW51bS5PTkUgOiBTb21lRW51bS5UV08KIH0KIAogc3RydWN0IFN0cnVjdFdpdGhTb21lRW51bSB7CkBAIC0yODYsNyArMjk5LDcgQEAKIH0KIAogY29uc3QgbWFwPFNvbWVFbnVtLFN0cnVjdFdpdGhTb21lRW51bT4gRVhUUkFfQ1JBWllfTUFQID0gewotICBPTkUgOiB7ImJsYWgiIDogVFdPfQorICBTb21lRW51bS5PTkUgOiB7ImJsYWgiIDogU29tZUVudW0uVFdPfQogfQogCiB1bmlvbiBUZXN0VW5pb24gewpAQCAtMzQ1LDMgKzM1OCwyMSBAQAogICAzOiBpMzIgZmllbGQzOwogfQogCitzdHJ1Y3QgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QgeworICBvcHRpb25hbCBpMzIgZmllbGQxOworICBvcHRpb25hbCBpMzIgZmllbGQyOworICBvcHRpb25hbCBpMzIgZmllbGQzOworICBvcHRpb25hbCBpMzIgZmllbGQ0OworICBvcHRpb25hbCBpMzIgZmllbGQ1OworICBvcHRpb25hbCBpMzIgZmllbGQ2OworICBvcHRpb25hbCBpMzIgZmllbGQ3OworICBvcHRpb25hbCBpMzIgZmllbGQ4OworICBvcHRpb25hbCBpMzIgZmllbGQ5OworICBvcHRpb25hbCBpMzIgZmllbGQxMDsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTE7CisgIG9wdGlvbmFsIGkzMiBmaWVsZDEyOworfQorCitzdHJ1Y3QgTGlzdERvdWJsZVBlcmYgeworICAxOiBsaXN0PGRvdWJsZT4gZmllbGQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgYi90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGM1NDQuLjAwMDAwMDAKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIERlYnVnUHJvdG9UZXN0X3R5cGVzIHRvIHdvcmsKLQotI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKLQotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeyBuYW1lc3BhY2UgZGVidWcgewotCi1ib29sIEVtcHR5OjpvcGVyYXRvcjwoRW1wdHkgY29uc3QmIG90aGVyKSBjb25zdCB7Ci0gIC8vIEl0IGlzIGVtcHR5LCBzbyBhbGwgYXJlIGVxdWFsLgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX19fQpkaWZmIC0tZ2l0IGEvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBiL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQKaW5kZXggY2Y2MTQ5Ni4uM2E1Yjk1NyAxMDA2NDQKLS0tIGEvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdAorKysgYi90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0CkBAIC0zNCw2ICszNCw3IEBACiAqLwogCiBuYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0CituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAogCiBzdHJ1Y3QgT25lT2ZFYWNoWlogewogICAxOiBib29sIGltX3RydWUsCkBAIC05MCwzICs5MSw4IEBACiBzZXJ2aWNlIFNydiB7CiAgIGkzMiBKYW5reSgxOiBpMzIgYXJnKQogfQorCitzZXJ2aWNlIFVuZGVyc2NvcmVTcnYgeworICBpNjQgc29tZV9ycGNfY2FsbCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAgYi90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNzg2NS4uMDAwMDAwMAotLS0gYS90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNwcDpkZW5zZSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3BwOmRlbnNlIE9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotZysrIC1XYWxsIC1nIC1JLi4vbGliL2NwcC9zcmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xIFwKLSAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0gIERlbnNlUHJvdG9UZXN0LmNwcCAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hIC1vIERlbnNlUHJvdG9UZXN0Ci0uL0RlbnNlUHJvdG9UZXN0Ci0qLwotCi0vLyBJIGRvIHRoaXMgdG8gcmVhY2ggaW50byB0aGUgZ3V0cyBvZiBURGVuc2VQcm90b2NvbC4gIFNvcnJ5LgotI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2RlZmluZSBpbmxpbmUKLQotI3VuZGVmIE5ERUJVRwotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9URGVuc2VQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi0KLS8vIENhbid0IHVzZSBtZW1jbXAgaGVyZS4gIEdDQyBpcyB0b28gc21hcnQuCi1ib29sIG15X21lbWVxKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIsIGludCBsZW4pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChzdHIxW2ldICE9IHN0cjJbaV0pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6c3RyaW5nOwotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0gIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZSkgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNSkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwotCi0gIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobikgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgSG9seU1vbGV5IGhtOwotCi0gIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKLSAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7Ci0gIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLQotICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7Ci0gIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAyOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2hhdD8iOwotICBobS5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5jbGVhcigpOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7Ci0gIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VERlbnNlUHJvdG9jb2w+IHByb3RvKG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKEhvbHlNb2xleTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0KLSAgaG0ud3JpdGUocHJvdG8uZ2V0KCkpOwotICBIb2x5TW9sZXkgaG0yOwotICBobTIucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KGhtID09IGhtMik7Ci0KLQotICAvLyBMZXQncyB0ZXN0IG91dCB0aGUgdmFyaWFibGUtbGVuZ3RoIGludHMsIHNoYWxsIHdlPwotICB1aW50NjRfdCB2bHE7Ci0gICNkZWZpbmUgY2hlY2tvdXQoaSwgYykgeyBcCi0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOyBcCi0gICAgcHJvdG8tPnZscVdyaXRlKGkpOyBcCi0gICAgcHJvdG8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyBcCi0gICAgYXNzZXJ0KG15X21lbWVxKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKS5kYXRhKCksIGMsIHNpemVvZihjKS0xKSk7IFwKLSAgICBwcm90by0+dmxxUmVhZCh2bHEpOyBcCi0gICAgYXNzZXJ0KHZscSA9PSBpKTsgXAotICB9Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMCwgIlx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA0MCwgIlx4NDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA3RiwgIlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA4MCwgIlx4ODFceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDIwMDAsICJceEMwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAzRkZGLCAiXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwNDAwMCwgIlx4ODFceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMTAwMDAwLCAiXHhDMFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAxRkZGRkYsICJceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDIwMDAwMCwgIlx4ODFceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwODAwMDAwMCwgIlx4QzBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwRkZGRkZGRiwgIlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgxMDAwMDAwMCwgIlx4ODFceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MjAwMDAwMDAsICJceDgyXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGLCAiXHg4MVx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRiwgIlx4OEZceEZGXHhGRlx4RkZceDdGIik7Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3V0IHRoZSBzbG93IHBhdGggd2l0aCBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KLSAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZfdHJhbnMobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChidWZmZXIsIDMpKTsKLSAgcHJvdG8ucmVzZXQobmV3IFREZW5zZVByb3RvY29sKGJ1ZmZfdHJhbnMpKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3B0aW9uYWwgc3R1ZmYuCi0gIHByb3RvLnJlc2V0KG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKE1hbnlPcHQ6OmxvY2FsX3JlZmxlY3Rpb24pOwotICBNYW55T3B0IG1vMSwgbW8yLCBtbzMsIG1vNCwgbW81LCBtbzY7Ci0gIG1vMS5vcHQxID0gOTIzNzU5MzQ3OwotICBtbzEub3B0MiA9IDM5Mjc0OTI3NDsKLSAgbW8xLm9wdDMgPSAzOTU3Mzk0MDI7Ci0gIG1vMS5kZWY0ID0gMjk0NzMwOTI4OwotICBtbzEub3B0NSA9IDM5NDMwOTIxODsKLSAgbW8xLm9wdDYgPSA4MzIxOTQ3MjM7Ci0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQyID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0LmRlZjQgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IHRydWU7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzIuX19pc3NldC5vcHQxID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MiA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0NSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzIpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8zLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzMuX19pc3NldC5vcHQxID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDIgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQzID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzMpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQzID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDIgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNC5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDIgPT0gZmFsc2UpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MyA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQ1ID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzQpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNS5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQ2ID09IGZhbHNlKTsKLQotICBhc3NlcnQobW8xID09IG1vNSk7Ci0KLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDMgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzYpOwotCi0KLSAgLy8gVGVzdCBmaW5nZXJwcmludCBjaGVja2luZyBzdHVmZi4KLQotICB7Ci0gICAgLy8gRGVmYXVsdCBhbmQgcmVxdWlyZWQgaGF2ZSB0aGUgc2FtZSBmaW5nZXJwcmludC4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgYXNzZXJ0KHN0cmluZyhUcmlja3kxOjphc2NpaV9maW5nZXJwcmludCkgPT0gVHJpY2t5Mzo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5Mzo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDMucmVhZChwcm90by5nZXQoKSk7Ci0gICAgYXNzZXJ0KHQzLmltX3JlcXVpcmVkID09IDIyNyk7Ci0gIH0KLQotICB7Ci0gICAgLy8gT3B0aW9uYWwgY2hhbmdlcyB0aGluZ3MuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IFRyaWNreTI6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kyOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIC8vIEhvbHkgY293LiAgV2UgY2FuIHVzZSB0aGUgVHJpY2t5MSB0eXBlc3BlYyB3aXRoIHRoZSBUcmlja3kyIHN0cnVjdHVyZS4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IHRydWUpOwotICAgIGFzc2VydCh0Mi5pbV9vcHRpb25hbCA9PSAyMjcpOwotICB9Ci0KLSAgewotICAgIC8vIEFuZCB0b3RhbGx5IG9mZiB0aGUgd2FsbC4KLSAgICBUcmlja3kxIHQxOwotICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IE9uZU9mRWFjaDo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0cnkgewotICAgICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gT2theSwgdGhpcyBpcyByZWFsbHkgb2ZmIHRoZSB3YWxsLgotICAvLyBKdXN0IGRvbid0IGNyYXNoLgotICBjb3V0IDw8ICJTdGFydGluZyBmdXp6IHRlc3QuICBUaGlzIHRha2VzIGEgd2hpbGUuICAoMjAgZG90cy4pIiA8PCBlbmRsOwotICBzdGQ6OnNyYW5kKDEyMzQ1KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKLSAgICBpZiAoaSAlIDEwMCA9PSAwKSB7Ci0gICAgICBjb3V0IDw8ICIuIjsKLSAgICAgIGNvdXQuZmx1c2goKTsKLSAgICB9Ci0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmluZ2VycHJpbnQgcHJlZml4IGlzIHJpZ2h0LgotICAgIGJ1ZmZlci0+d3JpdGUoTmVzdGluZzo6YmluYXJ5X2ZpbmdlcnByaW50LCA0KTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMjQqMTAyNDsgaisrKSB7Ci0gICAgICB1aW50OF90IHIgPSBzdGQ6OnJhbmQoKTsKLSAgICAgIGJ1ZmZlci0+d3JpdGUoJnIsIDEpOwotICAgIH0KLSAgICBOZXN0aW5nIG47Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdHJ5IHsKLSAgICAgIG4ucmVhZChwcm90by5nZXQoKSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7Ci0gICAgfQotICB9Ci0gIGNvdXQgPDwgZW5kbDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvRG9jVGVzdC50aHJpZnQgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CmluZGV4IGNiMzU1YWUuLmQ3MDJiMmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRG9jVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Eb2NUZXN0LnRocmlmdApAQCAtNTgsNyArNTgsNyBAQAogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZwogCiAgIC8qKiBkb2N0IHRleHQgZ29lcyBiZWZvcmUgYSBjb21tYSAqLwotICA0OiAgYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDQ6ICBpOCAgICAgYnl0ZV90aGluZywKIAogICA5OiAgaTMyICAgIGkzMl90aGluZywKICAgMTE6IGk2NCAgICBpNjRfdGhpbmcKQEAgLTc0LDcgKzc0LDcgQEAKIAogc3RydWN0IFh0cnVjdDIKIHsKLSAgMTogYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDE6IGk4ICAgICBieXRlX3RoaW5nLAogICAyOiBYdHJ1Y3Qgc3RydWN0X3RoaW5nLAogICAzOiBpMzIgICAgaTMyX3RoaW5nCiB9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgLyoqIEFuZCB0aGlzIGlzIGhvdyB5b3Ugd291bGQgZG9jdW1lbnQgZnVuY3Rpb25zIGluIGEgc2VydmljZSAqLwogICB2b2lkICAgICAgICAgdGVzdFZvaWQoKSwKICAgc3RyaW5nICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKLSAgYnl0ZSAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAorICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCiAgIGkzMiAgICAgICAgICB0ZXN0STMyKDE6IGkzMiB0aGluZyksCiAKICAgLyoqIExpa2UgdGhpcyBvbmUgKi8KQEAgLTE1NSw3ICsxNTUsNyBAQAogdHlwZWRlZiBpMzIgVHJpdmlhbE11bHRpTGluZQogCiAvKioKLSAqIFRoaXMgaXMgdGhlIGNhbm5vbmljYWwgZXhhbXBsZQorICogVGhpcyBpcyB0aGUgY2Fub25pY2FsIGV4YW1wbGUKICAqIG9mIGEgbXVsdGlsaW5lIGRvY3N0cmluZy4KICAqLwogdHlwZWRlZiBpMzIgU3RhbmRhcmRNdWx0aUxpbmUKQEAgLTI0NCw0ICsyNDQsNDQgQEAKICovCiB0eXBlZGVmIGkzMiBUb3RhbGx5RGVnZW5lcmF0ZQogCisvKipubyByb29tIGZvciBuZXdsaW5lIGhlcmUqLworCisvKiAqIC8gKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYQorCisvKioKKyAqIC8KKyAqLwordHlwZWRlZiBpMzIgVGVzdEZvcjM1MDFiCisKKworLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDAgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzAxIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDIgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAzIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDQgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDUgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNiB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDggeyAvKiA/ICovIDE6IGkzMiBmb28gfQorCitzdHJ1Y3QgVGVzdEZvcjM3MDkgeworICAvKiogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkLAorICAvKiogVGhpcyBpcyBhbHNvIGEgY29tbWVudCAqKi8KKyAgMjogcmVxdWlyZWQgc3RyaW5nIHR5cGVJZCwKKyAgLyoqIFlldCBhbm90aGVyIGNvbW1lbnQhICovCisgIDM6IHJlcXVpcmVkIGkzMiBlbmRUaW1lc3RhbXAKK30KKworCiAvKiBUSEUgRU5EICovCmRpZmYgLS1naXQgYS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIxMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDE3IEBACituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCisvLyBtb3JlIHRlc3RzIG9uIGRvdWJsZSBjb25zdGFudHMgKHByZWNpc2lvbiBhbmQgdHlwZSBjaGVja3MpCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUID0gMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCA9IC0xMDAKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QgPSAzLjE0MTU5MjY1MzU5Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAxMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC0xMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QgPSAxLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCA9IC0xLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisKK2NvbnN0IGxpc3Q8ZG91YmxlPiBET1VCTEVfTElTVF9URVNUID0gWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycworCitlbnVtIEdyZWVrR29kR29kZGVzcyB7CisgICAgQVJFUywKKyAgICBBUEhST0RJVEUsCisgICAgWkVVUywKKyAgICBQT1NFSURPTiwKKyAgICBIRVJBLAorfQorCit0eXBlZGVmIEdyZWVrR29kR29kZGVzcyBHcmVla0dvZEdvZGRlc3NUeXBlCit0eXBlZGVmIGkzMiBQb3dlcgorCitzdHJ1Y3QgR29kQmVhbiB7CisgICAgMTogb3B0aW9uYWwgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIFBvd2VyPiBwb3dlciwKKyAgICAyOiBvcHRpb25hbCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gZ29kZGVzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBHcmVla0dvZEdvZGRlc3M+IGJ5QWxpYXMsCisgICAgNDogb3B0aW9uYWwgc2V0PHN0cmluZz4gaW1hZ2VzLAorfQorCitjb25zdCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgc3RyaW5nPiBBVFRSSUJVVEVTID0KK3sKKyAgICBHcmVla0dvZEdvZGRlc3MuWkVVUzogImxpZ2h0bmluZyBib2x0IiwKKyAgICBHcmVla0dvZEdvZGRlc3MuUE9TRUlET046ICJ0cmlkZW50IiwKK30KKworY29uc3Qgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IEJFQVVUWSA9IFsgR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSwgR3JlZWtHb2RHb2RkZXNzLkhFUkEgXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtVGVzdC50aHJpZnQgYi90ZXN0L0VudW1UZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYxZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKKworZW51bSBNeUVudW0xIHsKKyAgTUUxXzAgPSAwLAorICBNRTFfMSA9IDEsCisgIE1FMV8yLAorICBNRTFfMywKKyAgTUUxXzUgPSA1LAorICBNRTFfNiwKK30KKworZW51bSBNeUVudW0yIHsKKyAgTUUyXzAsCisgIE1FMl8xLAorICBNRTJfMiwKK30KKworZW51bSBNeUVudW0yX2FnYWluIHsKKyAgLy8gZW51bSB2YWx1ZSBpZGVudGlmaWVycyBtYXkgYXBwZWFyIGFnYWluIGluIGFub3RoZXIgZW51bSB0eXBlCisgIE1FMF8xLAorICBNRTFfMSwKKyAgTUUyXzEsCisgIE1FM18xLAorfQorCitlbnVtIE15RW51bTMgeworICBNRTNfMCwKKyAgTUUzXzEsCisgIE1FM19OMiA9IC0yLAorICBNRTNfTjEsCisgIE1FM19EMCwKKyAgTUUzX0QxLAorICBNRTNfOSA9IDksCisgIE1FM18xMCwKK30KKworZW51bSBNeUVudW00IHsKKyAgTUU0X0EgPSAweDdmZmZmZmZkCisgIE1FNF9CCisgIE1FNF9DCisgIC8vIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGFub3RoZXIgZW51bSB2YWx1ZSBoZXJlIGZhaWxzCisgIC8vIHdpdGggYW4gb3ZlcmZsb3cgZXJyb3IsIGFzIHdlIG92ZXJmbG93IHZhbHVlcyB0aGF0IGNhbiBiZQorICAvLyByZXByZXNlbnRlZCB3aXRoIGFuIGkzMi4KK30KKworZW51bSBNeUVudW01IHsKKyAgZTEgICAgICAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKKyAgZTIgPSA0MiAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK30KKworZW51bSBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbSB7CisgIGN1c3RvbTEgPSAxLAorICBDdXN0b00yCit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKworc3RydWN0IE15U3RydWN0IHsKKyAgMTogTXlFbnVtMiBtZTJfMiA9IE15RW51bTEuTUUyXzIKKyAgMjogTXlFbnVtMyBtZTNfbjIgPSBNeUVudW0zLk1FM19OMgorICAzOiBNeUVudW0zIG1lM19kMSA9IE15RW51bTMuTUUzX0QxCit9CisKK3N0cnVjdCBFbnVtVGVzdFN0cnVjdCB7CisgIDE6IE15RW51bTMgYV9lbnVtOworICAyOiBsaXN0PE15RW51bTM+IGVudW1fbGlzdDsKKyAgMzogc2V0PE15RW51bTM+IGVudW1fc2V0OworICA0OiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bV9lbnVtX21hcDsKKyAgLy8gY29sbGVjdGlvbnMgYXMga2V5cworICA0NDogbWFwPGxpc3Q8TXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IGxpc3RfZW51bV9tYXA7CisgIDQ1OiBtYXA8c2V0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBzZXRfZW51bV9tYXA7CisgIDQ2OiBtYXA8bWFwPE15RW51bTMsTXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IG1hcF9lbnVtX21hcDsKKyAgLy8gY29sbGVjdGlvbnMgYXMgdmFsdWVzCisgIDQ3OiBtYXA8TXlFbnVtMywgbWFwPE15RW51bTMsIE15RW51bTM+PiBlbnVtX21hcF9tYXA7CisgIDQ4OiBtYXA8TXlFbnVtMywgc2V0PE15RW51bTM+PiBlbnVtX3NldF9tYXA7CisgIDQ5OiBtYXA8TXlFbnVtMywgbGlzdDxNeUVudW0zPj4gZW51bV9saXN0X21hcDsKK30KKworY29uc3QgRW51bVRlc3RTdHJ1Y3QgRU5VTV9URVNUID0geworICAnYV9lbnVtJzogTXlFbnVtMy5NRTNfRDEsCisgICdlbnVtX2xpc3QnOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzAsIE15RW51bTMuTUUzX04yXSwKKyAgJ2VudW1fc2V0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sCisgICdlbnVtX2VudW1fbWFwJzoge015RW51bTMuTUUzX0QxOiBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM18wOiBNeUVudW0zLk1FM19EMX0sCisgICdsaXN0X2VudW1fbWFwJzoge1tNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM19EMV06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfRDF9LAorICAnc2V0X2VudW1fbWFwJzoge1tNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM19EMV06IE15RW51bTMuTUUzXzB9LAorICAnbWFwX2VudW1fbWFwJzoge3tNeUVudW0zLk1FM19OMTogTXlFbnVtMy5NRTNfMTB9OiBNeUVudW0zLk1FM18xfSwKKyAgJ2VudW1fbWFwX21hcCc6IHtNeUVudW0zLk1FM19OMToge015RW51bTMuTUUzX0QxOiBNeUVudW0zLk1FM19EMX19LAorICAnZW51bV9zZXRfbWFwJzoge015RW51bTMuTUUzX04yOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXSwgTXlFbnVtMy5NRTNfMTA6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdfSwKKyAgJ2VudW1fbGlzdF9tYXAnOiB7TXlFbnVtMy5NRTNfRDE6IFtNeUVudW0zLk1FM18xMF0sIE15RW51bTMuTUUzXzA6IFtNeUVudW0zLk1FM185LCBNeUVudW0zLk1FM18xMF19LAorfQorCitzZXJ2aWNlIEVudW1UZXN0U2VydmljZSB7CisgIE15RW51bTMgdGVzdEVudW0oMTogTXlFbnVtMyBlbnVtMSksCisgIGxpc3Q8TXlFbnVtMz4gdGVzdEVudW1MaXN0KDE6IGxpc3Q8TXlFbnVtMz4gZW51bTEpLAorICBzZXQ8TXlFbnVtMz4gdGVzdEVudW1TZXQoMTogc2V0PE15RW51bTM+IGVudW0xKSwKKyAgbWFwPE15RW51bTMsIE15RW51bTM+IHRlc3RFbnVtTWFwKDE6IG1hcDxNeUVudW0zLCBNeUVudW0zPiBlbnVtMSksCisgIEVudW1UZXN0U3RydWN0IHRlc3RFbnVtU3RydWN0KDE6IEVudW1UZXN0U3RydWN0IGVudW0xKSwKK30KZGlmZiAtLWdpdCBhL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjZlZmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yIiIiCi10aHJpZnQgLS1nZW4gcHkgRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0uL0Zhc3RiaW5hcnlUZXN0LnB5Ci0iIiIKLQotIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgotCi1pbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4vZ2VuLXB5JykKLQotaW1wb3J0IG1hdGgKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgotZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotCi1pbXBvcnQgdGltZWl0Ci1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKLWZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKLQotY2xhc3MgVERldk51bGxUcmFuc3BvcnQoVFRyYW5zcG9ydC5UVHJhbnNwb3J0QmFzZSk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBwYXNzCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKLQotb29lMSA9IE9uZU9mRWFjaCgpCi1vb2UxLmltX3RydWUgICA9IFRydWU7Ci1vb2UxLmltX2ZhbHNlICA9IEZhbHNlOwotb29lMS5hX2JpdGUgICAgPSAweGQ2Owotb29lMS5pbnRlZ2VyMTYgPSAyNzAwMDsKLW9vZTEuaW50ZWdlcjMyID0gMTw8MjQ7Ci1vb2UxLmludGVnZXI2NCA9IDYwMDAgKiAxMDAwICogMTAwMDsKLW9vZTEuZG91YmxlX3ByZWNpc2lvbiA9IG1hdGgucGk7Ci1vb2UxLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotb29lMS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOwotCi1vb2UyID0gT25lT2ZFYWNoKCk7Ci1vb2UyLmludGVnZXIxNiA9IDE2Owotb29lMi5pbnRlZ2VyMzIgPSAzMjsKLW9vZTIuaW50ZWdlcjY0ID0gNjQ7Ci1vb2UyLmRvdWJsZV9wcmVjaXNpb24gPSAobWF0aC5zcXJ0KDUpKzEpLzI7Ci1vb2UyLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci1vb2UyLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotCi1obSA9IEhvbHlNb2xleSh7ImJpZyI6W10sICJjb250YWluIjpzZXQoKSwgImJvbmtzIjp7fX0pCi1obS5iaWcuYXBwZW5kKG9vZTEpCi1obS5iaWcuYXBwZW5kKG9vZTIpCi1obS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLWhtLmJpZ1sxXS5hX2JpdGUgPSAweDIyOwotCi1obS5jb250YWluLmFkZCgoImFuZCBhIG9uZSIsICJhbmQgYSB0d28iKSkKLWhtLmNvbnRhaW4uYWRkKCgidGhlbiBhIG9uZSwgdHdvIiwgInRocmVlISIsICJGT1VSISIpKQotaG0uY29udGFpbi5hZGQoKCkpCi0KLWhtLmJvbmtzWyJub3RoaW5nIl0gPSBbXTsKLWhtLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKLSAgQm9uayh7InR5cGUiOjEsICJtZXNzYWdlIjoiV2FpdC4ifSksCi0gIEJvbmsoeyJ0eXBlIjoyLCAibWVzc2FnZSI6IldoYXQ/In0pLAotXQotaG0uYm9ua3NbInBvZSJdID0gWwotICBCb25rKHsidHlwZSI6MywgIm1lc3NhZ2UiOiJxdW90aCJ9KSwKLSAgQm9uayh7InR5cGUiOjQsICJtZXNzYWdlIjoidGhlIHJhdmVuIn0pLAotICBCb25rKHsidHlwZSI6NSwgIm1lc3NhZ2UiOiJuZXZlcm1vcmUifSksCi1dCi0KLXJzID0gUmFuZG9tU3R1ZmYoKQotcnMuYSA9IDEKLXJzLmIgPSAyCi1ycy5jID0gMwotcnMubXlpbnRsaXN0ID0gcmFuZ2UoMjApCi1ycy5tYXBzID0gezE6V3JhcHBlcih7ImZvbyI6RW1wdHkoKX0pLDI6V3JhcHBlcih7ImZvbyI6RW1wdHkoKX0pfQotcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1TAotcnMudHJpcGxlID0gMy4xNAotCi0jIG1ha2Ugc3VyZSB0aGlzIHNwbGl0cyB0d28gYnVmZmVycyBpbiBhIGJ1ZmZlcmVkIHByb3RvY29sCi1yc2h1Z2UgPSBSYW5kb21TdHVmZigpCi1yc2h1Z2UubXlpbnRsaXN0PXJhbmdlKDEwMDAwKQotCi1teV96ZXJvID0gU3J2Lkphbmt5X3Jlc3VsdCh7ImFyZyI6NX0pCi0KLWRlZiBjaGVja1dyaXRlKG8pOgotICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHByb3RfZmFzdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFuc19mYXN0KQotICBwcm90X3Nsb3cgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zX3Nsb3cpCi0KLSAgby53cml0ZShwcm90X2Zhc3QpCi0gIG8ud3JpdGUocHJvdF9zbG93KQotICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCi0gIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKLSAgaWYgT1JJRyAhPSBNSU5FOgotICAgIHByaW50ICJtaW5lOiAlc1xub3JpZzogJXMiICUgKHJlcHIoTUlORSksIHJlcHIoT1JJRykpCi0KLWRlZiBjaGVja1JlYWQobyk6Ci0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpKQotICBvLndyaXRlKHByb3QpCi0KLSAgc2xvd192ZXJzaW9uX2JpbmFyeSA9IHByb3QudHJhbnMuZ2V0dmFsdWUoKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNsb3dfdmVyc2lvbl9iaW5hcnkpKSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLQotZGVmIGRvVGVzdCgpOgotICBjaGVja1dyaXRlKGhtKQotICBub19zZXQgPSBkZWVwY29weShobSkKLSAgbm9fc2V0LmNvbnRhaW4gPSBzZXQoKQotICBjaGVja1JlYWQobm9fc2V0KQotICBjaGVja1dyaXRlKHJzKQotICBjaGVja1JlYWQocnMpCi0gIGNoZWNrV3JpdGUocnNodWdlKQotICBjaGVja1JlYWQocnNodWdlKQotICBjaGVja1dyaXRlKG15X3plcm8pCi0gIGNoZWNrUmVhZChteV96ZXJvKQotICBjaGVja1JlYWQoQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkpCi0KLSAgIyBPbmUgY2FzZSB3aGVyZSB0aGUgc2VyaWFsaXplZCBmb3JtIGNoYW5nZXMsIGJ1dCBvbmx5IHN1cGVyZmljaWFsbHkuCi0gIG8gPSBCYWNrd2FyZHMoeyJmaXJzdF90YWcyIjo0LCAic2Vjb25kX3RhZzEiOjJ9KQotICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHByb3RfZmFzdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFuc19mYXN0KQotICBwcm90X3Nsb3cgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zX3Nsb3cpCi0KLSAgby53cml0ZShwcm90X2Zhc3QpCi0gIG8ud3JpdGUocHJvdF9zbG93KQotICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCi0gIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKLSAgaWYgT1JJRyA9PSBNSU5FOgotICAgIHByaW50ICJUaGF0IHNob3VsZG4ndCBoYXBwZW4uIgotCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKAotICAgICAgICAgICAgIHByb3QudHJhbnMuZ2V0dmFsdWUoKSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLQotZGVmIGRvQmVuY2htYXJrKCk6Ci0KLSAgaXRlcnMgPSAyNTAwMAotCi0gIHNldHVwID0gIiIiCi1mcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi10cmFucyA9IFREZXZOdWxsVHJhbnNwb3J0KCkKLXByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sJXModHJhbnMpCi0iIiIKLQotICBzZXR1cF9mYXN0ID0gc2V0dXAgJSAiQWNjZWxlcmF0ZWQiCi0gIHNldHVwX3Nsb3cgPSBzZXR1cCAlICIiCi0KLSAgcHJpbnQgIlN0YXJ0aW5nIEJlbmNobWFya3MiCi0KLSAgcHJpbnQgIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKQotICBwcmludCAiSG9seU1vbGV5IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdobS53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLSAgcHJpbnQgIkZhc3RTdHJ1Y3QgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykKLQotCi0KLWRvVGVzdCgpCi1kb0JlbmNobWFyaygpCi0KZGlmZiAtLWdpdCBhL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQgYi90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTRkZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsCisKK3N0cnVjdCBPbmVPZkVhY2haWiB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogYnl0ZSBhX2JpdGUsCisgIDQ6IGkxNiBpbnRlZ2VyMTYsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKK30KKworc2VydmljZSBVbmRlcnNjb3JlU3J2IHsKKyAgaTY0IHNvbWVfcnBjX2NhbGwoMTogc3RyaW5nIG1lc3NhZ2UpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaCBiL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MWQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXwotI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8gMQotCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotLyogQ2xhc3NOYW1lIEhlbHBlciBmb3IgY2xlYW5lciBleGNlcHRpb25zICovCi1jbGFzcyBDbGFzc05hbWVzIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJVbmtub3duIHR5cGUiOyB9Ci19OwotCi10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDhfdD4oKSB7IHJldHVybiAiYnl0ZSI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7IHJldHVybiAic2hvcnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeyByZXR1cm4gImludCI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50NjRfdD4oKSB7IHJldHVybiAibG9uZyI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsgcmV0dXJuICJzdHJpbmciOyB9Ci0KLS8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLwotY2xhc3MgR2VuZXJpY0lPIHsKLSBwdWJsaWM6Ci0KLSAgLyogV3JpdGUgZnVuY3Rpb25zICovCi0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPndyaXRlQnl0ZSh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZUkzMih2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7Ci0gIH0KLQotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPndyaXRlSTY0KHZhbCk7Ci0gIH0KLQotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZVN0cmluZyh2YWwpOwotICB9Ci0KLSAgLyogUmVhZCBmdW5jdGlvbnMgKi8KLQotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDhfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50MzJfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTMyKHZhbCk7Ci0gIH0KLQotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDY0X3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkU3RyaW5nKHZhbCk7Ci0gIH0KLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L0luY2x1ZGUudGhyaWZ0IGIvdGVzdC9JbmNsdWRlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjIzMTliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmNsdWRlLnRocmlmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgorCitzdHJ1Y3QgSW5jbHVkZVRlc3QgeworICAxOiByZXF1aXJlZCBUaHJpZnRUZXN0LkJvb2xzIGJvb2xzCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Nzk2MzguLjAwMDAwMDAKLS0tIGEvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9USlNPTlByb3RvY29sLmg+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotCi1pbnQgbWFpbigpIHsKLSAgdXNpbmcgc3RkOjpjb3V0OwotICB1c2luZyBzdGQ6OmVuZGw7Ci0gIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwotICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7Ci0KLSAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4ZDY7Ci0gIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLmludGVnZXIzMiA9IDE8PDI0OwotICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKLSAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJKU09OIFRISVMhIFwiXDEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLSAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhvb2UpIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwotCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcobikgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgSG9seU1vbGV5IGhtOwotCi0gIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKLSAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7Ci0gIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLQotICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7Ci0gIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAyOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2hhdD8iOwotICBobS5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5jbGVhcigpOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7Ci0gIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKLQotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKLQotCi0gIGNvdXQgPDwgIlRlc3Rpbmcgb29lIiA8PCBlbmRsOwotCi0gIG9vZS53cml0ZShwcm90by5nZXQoKSk7Ci0gIE9uZU9mRWFjaCBvb2UyOwotICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChvb2UgPT0gb29lMik7Ci0KLQotICBjb3V0IDw8ICJUZXN0aW5nIGhtIiA8PCBlbmRsOwotCi0gIGhtLndyaXRlKHByb3RvLmdldCgpKTsKLSAgSG9seU1vbGV5IGhtMjsKLSAgaG0yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChobSA9PSBobTIpOwotCi0gIGhtMi5iaWdbMF0uYV9iaXRlID0gMHhGRjsKLQotICBhc3NlcnQoaG0gIT0gaG0yKTsKLQotICBEb3VibGVzIGR1YjsKLSAgZHViLm5hbiA9IEhVR0VfVkFML0hVR0VfVkFMOwotICBkdWIuaW5mID0gSFVHRV9WQUw7Ci0gIGR1Yi5uZWdpbmYgPSAtSFVHRV9WQUw7Ci0gIGR1Yi5yZXBlYXRpbmcgPSAxMC4wLzMuMDsKLSAgZHViLmJpZyA9IDFFKzMwNTsKLSAgZHViLnNtYWxsID0gMUUtMzA1OwotICBkdWIuemVybyA9IDAuMDsKLSAgZHViLm5lZ3plcm8gPSAtMC4wOwotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKGR1YikgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvdXQgPDwgIlRlc3RpbmcgYmFzZSIgPDwgZW5kbDsKLQotICBCYXNlNjQgYmFzZTsKLSAgYmFzZS5hID0gMTIzOwotICBiYXNlLmIxID0gIjEiOwotICBiYXNlLmIyID0gIjEyIjsKLSAgYmFzZS5iMyA9ICIxMjMiOwotICBiYXNlLmI0ID0gIjEyMzQiOwotICBiYXNlLmI1ID0gIjEyMzQ1IjsKLSAgYmFzZS5iNiA9ICIxMjM0NTYiOwotCi0gIGJhc2Uud3JpdGUocHJvdG8uZ2V0KCkpOwotICBCYXNlNjQgYmFzZTI7Ci0gIGJhc2UyLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChiYXNlID09IGJhc2UyKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgYi90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTc0YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTkgQEAKK2luY2x1ZGUgIkphdmFUeXBlcy50aHJpZnQiCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBEZWVwQ29weUZvbyB7CisgIDE6IG9wdGlvbmFsIGxpc3Q8RGVlcENvcHlCYXI+IGwsCisgIDI6IG9wdGlvbmFsIHNldDxEZWVwQ29weUJhcj4gcywKKyAgMzogb3B0aW9uYWwgbWFwPHN0cmluZywgRGVlcENvcHlCYXI+IG0sCisgIDQ6IG9wdGlvbmFsIGxpc3Q8SmF2YVR5cGVzLk9iamVjdD4gbGksCisgIDU6IG9wdGlvbmFsIHNldDxKYXZhVHlwZXMuT2JqZWN0PiBzaSwKKyAgNjogb3B0aW9uYWwgbWFwPHN0cmluZywgSmF2YVR5cGVzLk9iamVjdD4gbWksCisgIDc6IG9wdGlvbmFsIERlZXBDb3B5QmFyIGJhciwKK30KKworc3RydWN0IERlZXBDb3B5QmFyIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIGEsCisgIDI6IG9wdGlvbmFsIGkzMiBiLAorICAzOiBvcHRpb25hbCBib29sIGMsCit9CmRpZmYgLS1naXQgYS90ZXN0L0phdmFUeXBlcy50aHJpZnQgYi90ZXN0L0phdmFUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3MzNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgSW50ZWdlciB7CisgIDE6IGkzMiB2YWwKK30KKworc3RydWN0IFN0cmluZyB7CisgIDE6IHN0cmluZyB2YWwKK30KKworc3RydWN0IEJvb2xlYW4geworICAxOiBib29sIHZhbAorfQorCitzdHJ1Y3QgRG91YmxlIHsKKyAgMTogZG91YmxlIHZhbAorfQorCitzdHJ1Y3QgTG9uZyB7CisgIDE6IGk2NCB2YWwKK30KKworc3RydWN0IEJ5dGUgeworICAxOiBieXRlIHZhbAorfQorCitzdHJ1Y3QgRmxvYXQgeworICAxOiBkb3VibGUgdmFsCit9CisKK3N0cnVjdCBMaXN0IHsKKyAgMTogbGlzdDxzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IEFycmF5TGlzdCB7CisgIDE6IGxpc3Q8c3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBTb3J0ZWRNYXAgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IFRyZWVNYXAgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IEhhc2hNYXAgeworICAxOiBtYXA8c3RyaW5nLCBTdHJpbmc+IHZhbHMKK30KKworc3RydWN0IE1hcCB7CisgIDE6IG1hcDxkb3VibGUsIERvdWJsZT4gdmFscworfQorCitzdHJ1Y3QgT2JqZWN0IHsKKyAgMTogSW50ZWdlciBpbnRlZ2VyLAorICAyOiBTdHJpbmcgc3RyLAorICAzOiBCb29sZWFuIGJvb2xlYW5fZmllbGQsCisgIDQ6IERvdWJsZSBkYmwsCisgIDU6IEJ5dGUgYml0ZSwKKyAgNjogbWFwPGkzMiwgSW50ZWdlcj4gaW50bWFwLAorICA3OiBNYXAgc29tZW1hcCwKK30KKworZXhjZXB0aW9uIEV4Y2VwdGlvbiB7CisgIDE6IHN0cmluZyBtc2cKK30KKworc2VydmljZSBBc3luY05vbmJsb2NraW5nU2VydmljZSB7CisgIE9iamVjdCBteW1ldGhvZCgKKyAgICAxOiBJbnRlZ2VyIGludGVnZXIsCisgICAgMjogU3RyaW5nIHN0ciwKKyAgICAzOiBCb29sZWFuIGJvb2xlYW5fZmllbGQsCisgICAgNDogRG91YmxlIGRibCwKKyAgICA1OiBCeXRlIGJpdGUsCisgICAgNjogbWFwPGkzMiwgSW50ZWdlcj4gaW50bWFwLAorICAgIDc6IE1hcCBzb21lbWFwLAorICApIHRocm93cyAoMTpFeGNlcHRpb24gZXgpOworfQorCitzdHJ1Y3QgU2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQorCmRpZmYgLS1naXQgYS90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgYi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1MTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdApAQCAtMCwwICsxLDE4IEBACitzdHJ1Y3QgU2ltcGxlIHsKKyAgMTogc3RyaW5nIHZhbHVlCit9CisKK3N0cnVjdCBDb21wbGV4IHsKKyAgMTogU2ltcGxlIHN0cnVjdF9maWVsZAorICAyOiBsaXN0PFNpbXBsZT4gc3RydWN0X2xpc3RfZmllbGQKKyAgMzogc2V0PFNpbXBsZT4gc3RydWN0X3NldF9maWVsZAorICA0OiBtYXA8c3RyaW5nLFNpbXBsZT4gc3RydWN0X21hcF9maWVsZAorICA1OiBsaXN0PHNldDxtYXA8c3RyaW5nLGxpc3Q8U2ltcGxlPj4+PiBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQKKyAgNjogbWFwPHN0cmluZywgbGlzdDxtYXA8c3RyaW5nLFNpbXBsZT4+ID4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMgorICA3OiBsaXN0PGxpc3Q8c3RyaW5nPj4gbGlzdF9vZl9saXN0X2ZpZWxkCisgIDg6IGxpc3Q8bGlzdDxsaXN0PHN0cmluZz4+PiBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZAorfQorCitzdHJ1Y3QgQ29tcGxleExpc3QgeworICAxOiBsaXN0PENvbXBsZXg+IHN0cnVjdF9saXN0X2ZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1ZmQ0ZjBkLi42OGYxOTg2Ci0tLSBhL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsMTY1ICsxNywxNTQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVNVQkRJUlMgPQorU1VCRElSUyA9IGZlYXR1cmVzCitQUkVDUk9TU19UQVJHRVQgPQorCitpZiBXSVRIX0NfR0xJQgorU1VCRElSUyArPSBjX2dsaWIKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jX2dsaWIKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jbAorZW5kaWYKKworaWYgV0lUSF9NT05PCitTVUJESVJTICs9IGNzaGFycAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNzaGFycAorZW5kaWYKKworaWYgV0lUSF9DUFAKK1NVQkRJUlMgKz0gY3BwCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY3BwCitlbmRpZgorCitpZiBXSVRIX1BFUkwKK1NVQkRJUlMgKz0gcGVybAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXBlcmwKK2VuZGlmCisKK2lmIFdJVEhfUEhQCitTVUJESVJTICs9IHBocAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXBocAorZW5kaWYKKworaWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1kYXJ0CitlbmRpZgogCiBpZiBXSVRIX1BZVEhPTgogU1VCRElSUyArPSBweQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXB5CitTVUJESVJTICs9IHB5LnRvcm5hZG8KK2lmIFdJVEhfVFdJU1RFRF9URVNUCitTVUJESVJTICs9IHB5LnR3aXN0ZWQKK2VuZGlmCiBlbmRpZgogCiBpZiBXSVRIX1JVQlkKIFNVQkRJUlMgKz0gcmIKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1yYgogZW5kaWYKIAotbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYQotbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKLQlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAotCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCi0JZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAotCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCi0JRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcAoraWYgV0lUSF9IQVNLRUxMCitTVUJESVJTICs9IGhzCitlbmRpZgogCi1UaHJpZnRUZXN0X2V4dHJhcy5vOiBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAotRGVidWdQcm90b1Rlc3RfZXh0cmFzLm86IGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAoraWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCiAKLWxpYnRlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKIAotbm9pbnN0X1BST0dSQU1TID0gQmVuY2htYXJrCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZ28KK2VuZGlmCiAKLUJlbmNobWFya19TT1VSQ0VTID0gXAotCUJlbmNobWFyay5jcHAKK2lmIFdJVEhfRVJMQU5HCitTVUJESVJTICs9IGVybAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWVybAorZW5kaWYKIAotQmVuY2htYXJrX0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQoraWYgV0lUSF9MVUEKK1NVQkRJUlMgKz0gbHVhCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtbHVhCitlbmRpZgogCi1jaGVja19QUk9HUkFNUyA9IFwKLQlURkRUcmFuc3BvcnRUZXN0IFwKLQlUUGlwZWRUcmFuc3BvcnRUZXN0IFwKLQlEZWJ1Z1Byb3RvVGVzdCBcCi0JSlNPTlByb3RvVGVzdCBcCi0JT3B0aW9uYWxSZXF1aXJlZFRlc3QgXAotCUFsbFByb3RvY29sc1Rlc3QgXAotCVVuaXRUZXN0cwotCi1URVNUUyA9IFwKLQkkKGNoZWNrX1BST0dSQU1TKQotCi1Vbml0VGVzdHNfU09VUkNFUyA9IFwKLQlVbml0VGVzdE1haW4uY3BwIFwKLQlUTWVtb3J5QnVmZmVyVGVzdC5jcHAgXAotCVRCdWZmZXJCYXNlVGVzdC5jcHAKLQotVW5pdFRlc3RzX0xEQUREID0gbGlidGVzdGdlbmNwcC5sYSAtbGJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ycworZW5kaWYKIAogIwotIyBURkRUcmFuc3BvcnRUZXN0CisjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CiAjCi1URkRUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCi0JVEZEVHJhbnNwb3J0VGVzdC5jcHAKLQotVEZEVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKLQkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKLQotCi0jCi0jIFRQaXBlZFRyYW5zcG9ydFRlc3QKLSMKLVRQaXBlZFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKLQlUUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAotCi1UUGlwZWRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAotCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQotCi0jCi0jIEFsbFByb3RvY29sc1Rlc3QKLSMKLUFsbFByb3RvY29sc1Rlc3RfU09VUkNFUyA9IFwKLQlBbGxQcm90b2NvbFRlc3RzLmNwcCBcCi0JQWxsUHJvdG9jb2xUZXN0cy50Y2MgXAotCUdlbmVyaWNIZWxwZXJzLmgKLQotQWxsUHJvdG9jb2xzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKLQotIwotIyBEZWJ1Z1Byb3RvVGVzdAotIwotRGVidWdQcm90b1Rlc3RfU09VUkNFUyA9IFwKLQlEZWJ1Z1Byb3RvVGVzdC5jcHAKLQotRGVidWdQcm90b1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCi0KLQotIwotIyBKU09OUHJvdG9UZXN0Ci0jCi1KU09OUHJvdG9UZXN0X1NPVVJDRVMgPSBcCi0JSlNPTlByb3RvVGVzdC5jcHAKLQotSlNPTlByb3RvVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKLQotIwotIyBPcHRpb25hbFJlcXVpcmVkVGVzdAotIwotT3B0aW9uYWxSZXF1aXJlZFRlc3RfU09VUkNFUyA9IFwKLQlPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKLQotT3B0aW9uYWxSZXF1aXJlZFRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCi0KLQotIwotIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwotIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oOiBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8Ci0KLWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaDogT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAotCi1nZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHA6IFN0cmVzc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAotCi1nZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaDogVGhyaWZ0VGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8Ci0KLUlOQ0xVREVTID0gXAotCS1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYwotCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpCitjaGVjay1sb2NhbDoKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBodG1sIC1yICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tY3BwCisJcm0gLXJmICQodG9wX3NyY2RpcikvdGVzdC9nZW4taHRtbAogCiBFWFRSQV9ESVNUID0gXAorCWF1ZGl0IFwKKwljcm9zc3J1bm5lciBcCisJa2V5cyBcCisJY19nbGliIFwKKwljbCBcCiAJY3BwIFwKLQl0aHJlYWRzIFwKLQljc2hhcnAgXAotCXB5IFwKLQlyYiBcCi0JcGVybCBcCi0JcGhwIFwKKwlkYXJ0IFwKIAllcmwgXAogCWhzIFwKKwlsdWEgXAogCW9jYW1sIFwKKwlwZXJsIFwKKwlwaHAgXAorCXB5IFwKKwlweS50d2lzdGVkIFwKKwlweS50b3JuYWRvIFwKKwlyYiBcCisJcnMgXAorCXRocmVhZHMgXAogCUFubm90YXRpb25UZXN0LnRocmlmdCBcCiAJQnJva2VuQ29uc3RhbnRzLnRocmlmdCBcCiAJQ29uc3RhbnRzRGVtby50aHJpZnQgXAogCURlYnVnUHJvdG9UZXN0LnRocmlmdCBcCisJRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgXAogCURlbnNlTGlua2luZ1Rlc3QudGhyaWZ0IFwKIAlEb2NUZXN0LnRocmlmdCBcCisJRW51bVRlc3QudGhyaWZ0IFwKKwlGdWxsQ2FtZWxUZXN0LnRocmlmdCBcCisJSW5jbHVkZS50aHJpZnQgXAogCUphdmFCZWFuc1Rlc3QudGhyaWZ0IFwKKwlKYXZhRGVlcENvcHlUZXN0LnRocmlmdCBcCisJSmF2YVR5cGVzLnRocmlmdCBcCisJSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCBcCisJTWFueU9wdGlvbmFscy50aHJpZnQgXAogCU1hbnlUeXBlZGVmcy50aHJpZnQgXAorCU5hbWVDb25mbGljdFRlc3QudGhyaWZ0IFwKIAlPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQgXAorCVJlY3Vyc2l2ZS50aHJpZnQgXAorCVJldXNlT2JqZWN0cy50aHJpZnQgXAorCUVudW1Db250YWluZXJzVGVzdC50aHJpZnQgXAogCVNtYWxsVGVzdC50aHJpZnQgXAogCVN0cmVzc1Rlc3QudGhyaWZ0IFwKIAlUaHJpZnRUZXN0LnRocmlmdCBcCi0JWmxpYlRlc3QuY3BwIFwKLQlEZW5zZVByb3RvVGVzdC5jcHAgXAotCUZhc3RiaW5hcnlUZXN0LnB5IFwKLQlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAotCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKwlUeXBlZGVmVGVzdC50aHJpZnQgXAorCVVuc2FmZVR5cGVzLnRocmlmdCBcCisJa25vd25fZmFpbHVyZXNfTGludXguanNvbiBcCisJdGVzdC5weSBcCisJdGVzdHMuanNvbiBcCisJcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaCBcCisJcmVzdWx0LmpzIFwKKwlpbmRleC5odG1sIFwKKwlSRUFETUUubWQgXAorCXZhbGdyaW5kLnN1cHByZXNzCiAKK3ByZWNyb3NzLSU6CisJJChNQUtFKSAtQyAkKiBwcmVjcm9zcworcHJlY3Jvc3M6ICQoUFJFQ1JPU1NfVEFSR0VUKQpkaWZmIC0tZ2l0IGEvdGVzdC9NYW55T3B0aW9uYWxzLnRocmlmdCBiL3Rlc3QvTWFueU9wdGlvbmFscy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMWQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTWFueU9wdGlvbmFscy50aHJpZnQKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhlIGphdmEgY29kZWdlbmVyYXRvciBoYXMgYSBmZXcgZGlmZmVyZW50IGNvZGVwYXRocyBkZXBlbmRpbmcKKy8vIG9uIGhvdyBtYW55IG9wdGlvbmFscyB0aGUgc3RydWN0IGhhczsgdGhpcyBhdHRlbXB0cyB0byBleGVyY2lzZQorLy8gdGhlbS4KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IE9wdDQgeworICAxOiBpMzIgZGVmMTsKKyAgMjogaTMyIGRlZjI7CisgIDM6IGkzMiBkZWYzOworICA0OiBpMzIgZGVmNDsKK30KKworc3RydWN0IE9wdDEzIHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7CisgIDU6IGkzMiBkZWY1OworICA2OiBpMzIgZGVmNjsKKyAgNzogaTMyIGRlZjc7CisgIDg6IGkzMiBkZWY4OworICA5OiBpMzIgZGVmOTsKKyAgMTA6IGkzMiBkZWYxMDsKKyAgMTE6IGkzMiBkZWYxMTsKKyAgMTI6IGkzMiBkZWYxMjsKKyAgMTM6IGkzMiBkZWYxMzsKK30KKworc3RydWN0IE9wdDMwIHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7CisgIDU6IGkzMiBkZWY1OworICA2OiBpMzIgZGVmNjsKKyAgNzogaTMyIGRlZjc7CisgIDg6IGkzMiBkZWY4OworICA5OiBpMzIgZGVmOTsKKyAgMTA6IGkzMiBkZWYxMDsKKyAgMTE6IGkzMiBkZWYxMTsKKyAgMTI6IGkzMiBkZWYxMjsKKyAgMTM6IGkzMiBkZWYxMzsKKyAgMTQ6IGkzMiBkZWYxNDsKKyAgMTU6IGkzMiBkZWYxNTsKKyAgMTY6IGkzMiBkZWYxNjsKKyAgMTc6IGkzMiBkZWYxNzsKKyAgMTg6IGkzMiBkZWYxODsKKyAgMTk6IGkzMiBkZWYxOTsKKyAgMjA6IGkzMiBkZWYyMDsKKyAgMjE6IGkzMiBkZWYyMTsKKyAgMjI6IGkzMiBkZWYyMjsKKyAgMjM6IGkzMiBkZWYyMzsKKyAgMjQ6IGkzMiBkZWYyNDsKKyAgMjU6IGkzMiBkZWYyNTsKKyAgMjY6IGkzMiBkZWYyNjsKKyAgMjc6IGkzMiBkZWYyNzsKKyAgMjg6IGkzMiBkZWYyODsKKyAgMjk6IGkzMiBkZWYyOTsKKyAgMzA6IGkzMiBkZWYzMDsKK30KKworc3RydWN0IE9wdDY0IHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7CisgIDU6IGkzMiBkZWY1OworICA2OiBpMzIgZGVmNjsKKyAgNzogaTMyIGRlZjc7CisgIDg6IGkzMiBkZWY4OworICA5OiBpMzIgZGVmOTsKKyAgMTA6IGkzMiBkZWYxMDsKKyAgMTE6IGkzMiBkZWYxMTsKKyAgMTI6IGkzMiBkZWYxMjsKKyAgMTM6IGkzMiBkZWYxMzsKKyAgMTQ6IGkzMiBkZWYxNDsKKyAgMTU6IGkzMiBkZWYxNTsKKyAgMTY6IGkzMiBkZWYxNjsKKyAgMTc6IGkzMiBkZWYxNzsKKyAgMTg6IGkzMiBkZWYxODsKKyAgMTk6IGkzMiBkZWYxOTsKKyAgMjA6IGkzMiBkZWYyMDsKKyAgMjE6IGkzMiBkZWYyMTsKKyAgMjI6IGkzMiBkZWYyMjsKKyAgMjM6IGkzMiBkZWYyMzsKKyAgMjQ6IGkzMiBkZWYyNDsKKyAgMjU6IGkzMiBkZWYyNTsKKyAgMjY6IGkzMiBkZWYyNjsKKyAgMjc6IGkzMiBkZWYyNzsKKyAgMjg6IGkzMiBkZWYyODsKKyAgMjk6IGkzMiBkZWYyOTsKKyAgMzA6IGkzMiBkZWYzMDsKKyAgMzE6IGkzMiBkZWYzMTsKKyAgMzI6IGkzMiBkZWYzMjsKKyAgMzM6IGkzMiBkZWYzMzsKKyAgMzQ6IGkzMiBkZWYzNDsKKyAgMzU6IGkzMiBkZWYzNTsKKyAgMzY6IGkzMiBkZWYzNjsKKyAgMzc6IGkzMiBkZWYzNzsKKyAgMzg6IGkzMiBkZWYzODsKKyAgMzk6IGkzMiBkZWYzOTsKKyAgNDA6IGkzMiBkZWY0MDsKKyAgNDE6IGkzMiBkZWY0MTsKKyAgNDI6IGkzMiBkZWY0MjsKKyAgNDM6IGkzMiBkZWY0MzsKKyAgNDQ6IGkzMiBkZWY0NDsKKyAgNDU6IGkzMiBkZWY0NTsKKyAgNDY6IGkzMiBkZWY0NjsKKyAgNDc6IGkzMiBkZWY0NzsKKyAgNDg6IGkzMiBkZWY0ODsKKyAgNDk6IGkzMiBkZWY0OTsKKyAgNTA6IGkzMiBkZWY1MDsKKyAgNTE6IGkzMiBkZWY1MTsKKyAgNTI6IGkzMiBkZWY1MjsKKyAgNTM6IGkzMiBkZWY1MzsKKyAgNTQ6IGkzMiBkZWY1NDsKKyAgNTU6IGkzMiBkZWY1NTsKKyAgNTY6IGkzMiBkZWY1NjsKKyAgNTc6IGkzMiBkZWY1NzsKKyAgNTg6IGkzMiBkZWY1ODsKKyAgNTk6IGkzMiBkZWY1OTsKKyAgNjA6IGkzMiBkZWY2MDsKKyAgNjE6IGkzMiBkZWY2MTsKKyAgNjI6IGkzMiBkZWY2MjsKKyAgNjM6IGkzMiBkZWY2MzsKKyAgNjQ6IGkzMiBkZWY2NDsKK30KKworc3RydWN0IE9wdDgwIHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7CisgIDU6IGkzMiBkZWY1OworICA2OiBpMzIgZGVmNjsKKyAgNzogaTMyIGRlZjc7CisgIDg6IGkzMiBkZWY4OworICA5OiBpMzIgZGVmOTsKKyAgMTA6IGkzMiBkZWYxMDsKKyAgMTE6IGkzMiBkZWYxMTsKKyAgMTI6IGkzMiBkZWYxMjsKKyAgMTM6IGkzMiBkZWYxMzsKKyAgMTQ6IGkzMiBkZWYxNDsKKyAgMTU6IGkzMiBkZWYxNTsKKyAgMTY6IGkzMiBkZWYxNjsKKyAgMTc6IGkzMiBkZWYxNzsKKyAgMTg6IGkzMiBkZWYxODsKKyAgMTk6IGkzMiBkZWYxOTsKKyAgMjA6IGkzMiBkZWYyMDsKKyAgMjE6IGkzMiBkZWYyMTsKKyAgMjI6IGkzMiBkZWYyMjsKKyAgMjM6IGkzMiBkZWYyMzsKKyAgMjQ6IGkzMiBkZWYyNDsKKyAgMjU6IGkzMiBkZWYyNTsKKyAgMjY6IGkzMiBkZWYyNjsKKyAgMjc6IGkzMiBkZWYyNzsKKyAgMjg6IGkzMiBkZWYyODsKKyAgMjk6IGkzMiBkZWYyOTsKKyAgMzA6IGkzMiBkZWYzMDsKKyAgMzE6IGkzMiBkZWYzMTsKKyAgMzI6IGkzMiBkZWYzMjsKKyAgMzM6IGkzMiBkZWYzMzsKKyAgMzQ6IGkzMiBkZWYzNDsKKyAgMzU6IGkzMiBkZWYzNTsKKyAgMzY6IGkzMiBkZWYzNjsKKyAgMzc6IGkzMiBkZWYzNzsKKyAgMzg6IGkzMiBkZWYzODsKKyAgMzk6IGkzMiBkZWYzOTsKKyAgNDA6IGkzMiBkZWY0MDsKKyAgNDE6IGkzMiBkZWY0MTsKKyAgNDI6IGkzMiBkZWY0MjsKKyAgNDM6IGkzMiBkZWY0MzsKKyAgNDQ6IGkzMiBkZWY0NDsKKyAgNDU6IGkzMiBkZWY0NTsKKyAgNDY6IGkzMiBkZWY0NjsKKyAgNDc6IGkzMiBkZWY0NzsKKyAgNDg6IGkzMiBkZWY0ODsKKyAgNDk6IGkzMiBkZWY0OTsKKyAgNTA6IGkzMiBkZWY1MDsKKyAgNTE6IGkzMiBkZWY1MTsKKyAgNTI6IGkzMiBkZWY1MjsKKyAgNTM6IGkzMiBkZWY1MzsKKyAgNTQ6IGkzMiBkZWY1NDsKKyAgNTU6IGkzMiBkZWY1NTsKKyAgNTY6IGkzMiBkZWY1NjsKKyAgNTc6IGkzMiBkZWY1NzsKKyAgNTg6IGkzMiBkZWY1ODsKKyAgNTk6IGkzMiBkZWY1OTsKKyAgNjA6IGkzMiBkZWY2MDsKKyAgNjE6IGkzMiBkZWY2MTsKKyAgNjI6IGkzMiBkZWY2MjsKKyAgNjM6IGkzMiBkZWY2MzsKKyAgNjQ6IGkzMiBkZWY2NDsKKyAgNjU6IGkzMiBkZWY2NTsKKyAgNjY6IGkzMiBkZWY2NjsKKyAgNjc6IGkzMiBkZWY2NzsKKyAgNjg6IGkzMiBkZWY2ODsKKyAgNjk6IGkzMiBkZWY2OTsKKyAgNzA6IGkzMiBkZWY3MDsKKyAgNzE6IGkzMiBkZWY3MTsKKyAgNzI6IGkzMiBkZWY3MjsKKyAgNzM6IGkzMiBkZWY3MzsKKyAgNzQ6IGkzMiBkZWY3NDsKKyAgNzU6IGkzMiBkZWY3NTsKKyAgNzY6IGkzMiBkZWY3NjsKKyAgNzc6IGkzMiBkZWY3NzsKKyAgNzg6IGkzMiBkZWY3ODsKKyAgNzk6IGkzMiBkZWY3OTsKKyAgODA6IGkzMiBkZWY4MDsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBiL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlZmI0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQKQEAgLTAsMCArMSwxMTAgQEAKKy8vIE5hbWluZyB0ZXN0Y2FzZXMsIHNlcGNpZmljYWxseSBmb3IgdGhlc2UgdGlja2V0cyAoYnV0IG5vdCBsaW1pdGVkIHRvIHRoZW0pCisvLyBUSFJJRlQtMjUwOCBVbmNvbXBpbGVhYmxlIEMjIGNvZGUgZHVlIHRvIGxhbmd1YWdlIGtleXdvcmRzIGluIElETAorLy8gVEhSSUZULTI1NTcgZXJyb3IgQ1MwNTQyIG1lbWJlciBuYW1lcyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgdGhlaXIgZW5jbG9zaW5nIHR5cGUKKworCitzdHJ1Y3QgdXNpbmcgeworICAgIDE6IGRvdWJsZSBzaW5nbGUKKyAgICAyOiBkb3VibGUgaW50ZWdlcgorfQorCitzdHJ1Y3QgZGVsZWdhdGUgeworICAgIDE6IHN0cmluZyBwYXJ0aWFsCisgICAgMjogZGVsZWdhdGUgZGVsZWdhdGUKK30KKworc3RydWN0IGdldCB7CisgICAgMTogYm9vbCBzYnl0ZQorfQorCitzdHJ1Y3QgcGFydGlhbCB7CisgICAgMTogdXNpbmcgdXNpbmcKKyAgICAyOiBib29sIHJlYWQKKyAgICAzOiBib29sIHdyaXRlCit9CisKK2VudW0gTWF5YmUgeworICBKVVNUID0gMSwKKyAgVFJVRSA9IDIsCisgIEZBTFNFID0gMworfQorCitlbnVtIEVpdGhlciB7CisgIExFRlQgPSAxLAorICBSSUdIVCA9IDIKK30KKworc3RydWN0IGZvbGRyIHsKKyAgMTogc3RyaW5nIGlkCit9CisKK3N0cnVjdCBvZiB7CisgIDE6IHN0cmluZyBsZXQKKyAgMjogc3RyaW5nIHdoZXJlCit9CisKK3N0cnVjdCBvZk9mIHsKKyAgMTogb2YgT2YKK30KKworCitzdHJ1Y3QgQ2xhc3NBbmRQcm9wIHsKKyAgMTogYm9vbCBDbGFzc0FuZFByb3AKKyAgMjogYm9vbCBDbGFzc0FuZFByb3BfCisgIDM6IGJvb2wgQ2xhc3NBbmRQcm9wX18KKyAgNDogYm9vbCBDbGFzc0FuZFByb3BlcgorfQorCitzdHJ1Y3Qgc2Vjb25kX2NoYW5jZSB7CisgIDE6IGJvb2wgU0VDT05EX0NIQU5DRQorICAyOiBib29sIFNFQ09ORF9DSEFOQ0VfCisgIDM6IGJvb2wgU0VDT05EX0NIQU5DRV9fCisgIDQ6IGJvb2wgU0VDT05EX0NIQU5DRVMKK30KKworc3RydWN0IE5PV19FQVRfVEhJUyB7CisgIDE6IGJvb2wgbm93X2VhdF90aGlzCisgIDI6IGJvb2wgbm93X2VhdF90aGlzXworICAzOiBib29sIG5vd19lYXRfdGhpc19fCisgIDQ6IGJvb2wgbm93X2VhdF90aGlzX2FuZF90aGlzCit9CisKK3N0cnVjdCBUaGVFZGdlQ2FzZSB7CisgIDE6IGJvb2wgdGhlRWRnZUNhc2UKKyAgMjogYm9vbCB0aGVFZGdlQ2FzZV8KKyAgMzogYm9vbCB0aGVFZGdlQ2FzZV9fCisgIDQ6IGJvb2wgVGhlRWRnZUNhc2UKKyAgNTogYm9vbCBUaGVFZGdlQ2FzZV8KKyAgNjogYm9vbCBUaGVFZGdlQ2FzZV9fCit9CisKK3N0cnVjdCBUcmlja3lfIHsKKyAgMTogYm9vbCB0cmlja3kKKyAgMjogYm9vbCBUcmlja3kKK30KKworc3RydWN0IE5lc3RlZCB7CisgIDE6IENsYXNzQW5kUHJvcCBDbGFzc0FuZFByb3AKKyAgMjogc2Vjb25kX2NoYW5jZSBzZWNvbmRfY2hhbmNlCisgIDM6IE5PV19FQVRfVEhJUyBOT1dfRUFUX1RISVMKKyAgNDogVGhlRWRnZUNhc2UgVGhlRWRnZUNhc2UKKyAgNTogVHJpY2t5XyBUcmlja3lfCisgIDY6IE5lc3RlZCBOZXN0ZWQKK30KKworZXhjZXB0aW9uIFByb2JsZW1fIHsKKyAgMTogYm9vbCBwcm9ibGVtCisgIDI6IGJvb2wgUHJvYmxlbQorfQorCisKK3NlcnZpY2UgZXh0ZXJuIHsKKyAgICBkZWxlZ2F0ZSBldmVudCgxOiBwYXJ0aWFsIGdldCkKKyAgICB2b2lkIEZvbygxOiBOZXN0ZWQgRm9vX2FyZ3MpIHRocm93cyAoMTogUHJvYmxlbV8gRm9vX3Jlc3VsdCkKK30KKworc2VydmljZSBxdWFsaWZpZWQgeworICAgIE1heWJlIG1heWJlKDE6IE1heWJlIGZvbGRyKQorICAgIEVpdGhlciBlaXRoZXIoMTogZm9sZHIgb2YpCit9CisvLyBlb2YKZGlmZiAtLWdpdCBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwIGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzI2MDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHByb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgotCi11c2luZyBzdGQ6OmNvdXQ7Ci11c2luZyBzdGQ6OmVuZGw7Ci11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotCi0vKgotdGVtcGxhdGU8dHlwZW5hbWUgU3RydWN0Pgotdm9pZCB0cnl3cml0ZShjb25zdCBTdHJ1Y3QmIHMsIGJvb2wgc2hvdWxkX3dvcmspIHsKLSAgYm9vbCB3b3JrZWQ7Ci0gIHRyeSB7Ci0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Ci0gICAgcy53cml0ZSgmcHJvdG9jb2wpOwotICAgIHdvcmtlZCA9IHRydWU7Ci0gIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAmIGV4KSB7Ci0gICAgd29ya2VkID0gZmFsc2U7Ci0gIH0KLSAgYXNzZXJ0KHdvcmtlZCA9PSBzaG91bGRfd29yayk7Ci19Ci0qLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RydWN0MSwgdHlwZW5hbWUgU3RydWN0Mj4KLXZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxICYgdywgU3RydWN0MiAmIHIpIHsKLSAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Ci0gIHcud3JpdGUoJnByb3RvY29sKTsKLSAgci5yZWFkKCZwcm90b2NvbCk7Ci19Ci0KLQotaW50IG1haW4oKSB7Ci0KLSAgY291dCA8PCAiVGhpcyBvbGQgc2Nob29sIHN0cnVjdCBzaG91bGQgaGF2ZSB0aHJlZSBmaWVsZHMuIiA8PCBlbmRsOwotICB7Ci0gICAgT2xkU2Nob29sIG87Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhvKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKLQotICBjb3V0IDw8ICJTZXR0aW5nIGEgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXNzZXQuIiA8PCBlbmRsOwotICB7Ci0gICAgU2ltcGxlIHM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOwotCi0gIGNvdXQgPDwgIlNldHRpbmcgaXNzZXQgYmVmb3JlIHNldHRpbmcgYSB2YWx1ZS4iIDw8IGVuZGw7Ci0gIHsKLSAgICBTaW1wbGUgczsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5pbV9vcHRpb25hbCA9IDEwOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgfQotICBjb3V0IDw8IGVuZGw7Ci0KLSAgLy8gV3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcy4KLSAgewotICAgIFNpbXBsZSBzMSwgczIsIHMzOwotICAgIHMxLmltX29wdGlvbmFsID0gMTA7Ci0gICAgYXNzZXJ0KCFzMS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCghczEuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCghczEuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0KLSAgICB3cml0ZV90b19yZWFkKHMxLCBzMik7Ci0KLSAgICBhc3NlcnQoIHMyLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIC8vYXNzZXJ0KCBzMi5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgYXNzZXJ0KCFzMi5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQoczMuaW1fb3B0aW9uYWwgPT0gMCk7Ci0KLSAgICBzMS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB3cml0ZV90b19yZWFkKHMxLCBzMyk7Ci0KLSAgICBhc3NlcnQoIHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIC8vYXNzZXJ0KCBzMy5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgYXNzZXJ0KCBzMy5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQoczMuaW1fb3B0aW9uYWwgPT0gMTApOwotICB9Ci0KLSAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCBkZWZhdWx0LgotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotCi0gICAgdDIuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICB3cml0ZV90b19yZWFkKHQyLCB0MSk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDIpOwotICAgIGFzc2VydCghdDEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgICBhc3NlcnQoIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydCh0MS5pbV9kZWZhdWx0ID09IHQyLmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQodDEuaW1fZGVmYXVsdCA9PSAwKTsKLSAgfQotCi0gIC8vIFdyaXRpbmcgYmV0d2VlbiBkZWZhdWx0IGFuZCByZXF1aXJlZC4KLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB3cml0ZV90b19yZWFkKHQxLCB0Myk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDEpOwotICAgIGFzc2VydCh0MS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICB9Ci0KLSAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCByZXF1aXJlZC4KLSAgewotICAgIFRyaWNreTIgdDI7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICB9Ci0KLSAgLy8gTXUtaHUtaGEtaGEtaGEhCi0gIHsKLSAgICBUcmlja3kyIHQyOwotICAgIFRyaWNreTMgdDM7Ci0gICAgdHJ5IHsKLSAgICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7fQotCi0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgfQotCi0gIGNvdXQgPDwgIkNvbXBsZXggc3RydWN0LCBzaW1wbGUgdGVzdC4iIDw8IGVuZGw7Ci0gIHsKLSAgICBDb21wbGV4IGM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhjKSA8PCBlbmRsOwotICB9Ci0KLQotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgLy8odm9pZCkodDEgPT0gdDIpOwotICB9Ci0KLSAgewotICAgIE9sZFNjaG9vbCBvMSwgbzIsIG8zOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1faW50ID0gbzIuaW1faW50ID0gMTA7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5fX2lzc2V0LmltX2ludCA9IHRydWU7Ci0gICAgbzIuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX2ludCA9IDIwOwotICAgIG8xLl9faXNzZXQuaW1faW50ID0gZmFsc2U7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9pbnQgPSAxMDsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX3N0ciA9IG8yLmltX3N0ciA9ICJmb28iOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuX19pc3NldC5pbV9zdHIgPSBvMi5fX2lzc2V0LmltX3N0ciA9IHRydWU7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBtYXA8aW50MzJfdCxzdHJpbmc+IG15bWFwOwotICAgIG15bWFwWzFdID0gImJhciI7Ci0gICAgbXltYXBbMl0gPSAiYmF6IjsKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG1hcDxpbnQzMl90LHN0cmluZz4oKSk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG1hcDxpbnQzMl90LHN0cmluZz4oKSk7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0KLSAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKLSAgICBvMS53cml0ZSgmcHJvdG9jb2wpOwotCi0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgbXltYXBbM10gPSAicXV4IjsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2JpZy5iYWNrKClbM10gPSAicXV4IjsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotCi0gICAgbzMucmVhZCgmcHJvdG9jb2wpOwotICAgIG8zLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSA9PSBvMyk7Ci0KLSAgICAvL2NvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcobzMpIDw8IGVuZGw7Ci0gIH0KLQotICB7Ci0gICAgVHJpY2t5MiB0MSwgdDI7Ci0gICAgYXNzZXJ0KHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQyLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IGZhbHNlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKaW5kZXggNjdlNmY1OC4uYTYwODg5OCAxMDA2NDQKLS0tIGEvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKysrIGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKQEAgLTIxLDYgKzIxLDcgQEAKICAqIGRldGFpbHMuCiAgKi8KIAorbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAogbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKIApAQCAtNDgsNiArNDksMTEgQEAKICAgMTogcmVxdWlyZWQgaTE2IGltX3JlcXVpcmVkOwogfQogCitzdHJ1Y3QgT3B0aW9uYWxEZWZhdWx0IHsKKyAgMTogb3B0aW9uYWwgaTE2IG9wdF9pbnQgPSAxMjM0OworICAyOiBvcHRpb25hbCBzdHJpbmcgb3B0X3N0ciA9ICJkZWZhdWx0IjsKK30KKwogc3RydWN0IENvbXBsZXggewogICAxOiAgICAgICAgICBpMTYgY3BfZGVmYXVsdDsKICAgMjogcmVxdWlyZWQgaTE2IGNwX3JlcXVpcmVkOwpAQCAtNzQsMyArODAsOSBAQAogICA1OiByZXF1aXJlZCBiaW5hcnkgcmVxX2JpbjsKICAgNjogb3B0aW9uYWwgYmluYXJ5IG9wdF9iaW47CiB9CisKK3N0cnVjdCBCaW5hcmllcyB7CisgIDQ6IGJpbmFyeSBiaW47CisgIDU6IHJlcXVpcmVkIGJpbmFyeSByZXFfYmluOworICA2OiBvcHRpb25hbCBiaW5hcnkgb3B0X2JpbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvUkVBRE1FLm1kIGIvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY4MmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTg1IEBACisjIEFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlCisKK1RoaXMgaXMgdGhlIGNyb3NzIGV2ZXJ5dGhpbmcgaW50ZWdyYXRpb24gdGVzdCBzdWl0ZSBmb3IgQXBhY2hlIFRocmlmdC4KKworIyMgUnVuCisKKyMjIyBBLiBVc2luZyBNYWtlCisKK1RoZSB0ZXN0IGNhbiBiZSBleGVjdXRlZCBieToKKworICAgIG1ha2UgY3Jvc3MKKworVGhpcyBzdGFydHMgdGhlIFt0ZXN0LnB5XSh0ZXN0LnB5KSBzY3JpcHQgd2hpY2ggZG9lcyB0aGUgcmVhbCBjcm9zcyB0ZXN0IHdpdGgKK2RpZmZlcmVudCB0cmFuc3BvcnRzLCBwcm90b2NvbHMgYW5kIGxhbmd1YWdlcy4KKworTm90ZSB0aGF0IHRoaXMgc2tpcHMgYW55IGxhbmd1YWdlIHRoYXQgaXMgbm90IGJ1aWx0IGxvY2FsbHkuIEl0IGFsc28gc2tpcHMKK3Rlc3RzIHRoYXQgYXJlIGtub3duIHRvIGJlIGZhaWxpbmcuIElmIHlvdSBuZWVkIG1vcmUgY29udHJvbCBvdmVyIHdoaWNoIHRlc3RzCit0byBydW4sIHJlYWQgZm9sbG93aW5nIHNlY3Rpb24uCisKKyMjIyBCLiBVc2luZyB0ZXN0IHNjcmlwdCBkaXJlY3RseQorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGludm9rZSBbdGVzdC5weV0odGVzdC5weSkgZGlyZWN0bHkuIFlvdSBuZWVkIHRvIHJ1bmBtYWtlCitwcmVjcm9zc2Agb25jZSBiZWZvcmUgZXhlY3V0aW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBjaGFuZ2VkIHNvbWV0aGluZyBpbiBgbm9kZWpzYCBsaWJyYXJ5IGFuZCBuZWVkIHRvIHZlcmlmeQordGhlIHBhdGNoLCB5b3UgY2FuIHNraXAgZXZlcnl0aGluZyBleGNlcHQgYG5vZGVqc2AgaXRzZWxmIGFuZCBzb21lIHJlZmVyZW5jZQoraW1wbGVtZW50YXRpb24gKGN1cnJlbnRseSBgY3BwYCBhbmQgYGphdmFgIGFyZSByZWNvbW1lbmRlZCkgbGlrZSB0aGlzOgorCisgICAgLi9jb25maWd1cmUgLS13aXRob3V0LWNfZ2xpYiAtd2l0aG91dC1jc2hhcnAgLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtbHVhIC4uLgorICAgIG1ha2UgcHJlY3Jvc3MgLWo4CisgICAgdGVzdC90ZXN0LnB5IC0tc2VydmVyIGNwcCxqYXZhIC0tY2xpZW50IG5vZGVqcworICAgIHRlc3QvdGVzdC5weSAtLXNlcnZlciBub2RlanMgLS1jbGllbnQgY3BwLGphdmEKKworQW5vdGhlciB1c2VmdWwgZmxhZyBpcyAtLXJlZ2V4LiBGb3IgZXhhbXBsZSwgdG8gcnVuIGFsbCB0ZXN0cyB0aGF0IGludm9sdmUKK0phdmEgVEJpbmFyeVByb3RvY29sOgorCisgICAgdGVzdC90ZXN0LnB5IC0tcmVnZXggImphdmEuKmJpbmFyeSIKKworIyMgVGVzdCBjYXNlIGRlZmluaXRpb24gZmlsZQorCitUaGUgY3Jvc3MgdGVzdCBjYXNlcyBhcmUgZGVmaW5lZCBpbiBbdGVzdHMuanNvbl0odGVzdHMuanNvbikuCitUaGUgcm9vdCBlbGVtZW50IGlzIGNvbGxlY3Rpb24gb2YgdGVzdCB0YXJnZXQgZGVmaW5pdGlvbnMuCitFYWNoIHRlc3QgdGFyZ2V0IGRlZmluaXRpb24gbG9va3MgbGlrZSB0aGlzOgorCisgICAgeworICAgICAgIm5hbWUiOiAic29tZWxpYiIsCisKKyAgICAgICJjbGllbnQiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX2NsaWVudF9leGVjdXRhYmxlIl0sCisgICAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAgIH0sCisgICAgICAic2VydmVyIjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9zZXJ2ZXJfZXhlY3V0YWJsZSJdLAorICAgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwIiwgImlwLXNzbCJdLAorICAgICAgfQorICAgIH0KKworRWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIgZGVmaW5pdGlvbiBvciBib3RoIHNob3VsZCBiZSBwcmVzZW50LgorCitQYXJhbWV0ZXJzIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIGBjbGllbnRgIGFuZCBgc2VydmVyYCBjYW4gYmUgcHV0IHRvIHRhcmdldAorZGVmaW5pdGlvbiByb290OgorCisgICAgeworICAgICAgIm5hbWUiOiAic29tZWxpYiIsCisKKyAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXSwKKworICAgICAgImNsaWVudCI6IHsgImNvbW1hbmQiOiBbInNvbWVsaWJfY2xpZW50X2V4ZWN1dGFibGUiXSB9LAorICAgICAgInNlcnZlciI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfc2VydmVyX2V4ZWN1dGFibGUiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwLXNzbCJdCisgICAgICB9CisgICAgfQorCitGb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIGtleXMgYW5kIHRoZWlyIGVmZmVjdCwgc2VlIHNvdXJjZSBjb2RlCitjb21tZW50IGF0IHRoZSBvcHQgb2YgW2Nyb3NzcnVubmVyL2NvbGxlY3QucHldKGNyb3NzcnVubmVyL2NvbGxlY3QucHkpLgorCisKKyMjIExpc3Qgb2Yga25vd24gZmFpbHVyZXMKKworU2luY2UgbWFueSBjcm9zcyB0ZXN0cyBjdXJyZW50bHkgZmFpbCAobWFpbmx5IGR1ZSB0byBwYXJ0aWFsIGluY29tcGF0aWJpbGl0eQorYXJvdW5kIGV4Y2VwdGlvbiBoYW5kbGluZyksIHRoZSB0ZXN0IHNjcmlwdCBzcGVjaWZpY2FsbHkgcmVwb3J0IGZvciAibm90IGtub3duCitiZWZvcmUiIGZhaWx1cmVzLgorCitGb3IgdGhpcyBwdXJwb3NlLCB0ZXN0IGNhc2VzIGtub3duIHRvIChvY2Nhc2lvbmFsbHkpIGZhaWwgYXJlIGxpc3RlZCBpbgorYGtub3duX2ZhaWx1cmVzXzxwbGF0Zm9ybT4uanNvbmAgd2hlcmUgYDxwbGF0Zm9ybT5gIG1hdGNoZXMgd2l0aCBweXRob24KK2BwbGF0Zm9ybS5zeXN0ZW0oKWAgc3RyaW5nLgorCitDdXJyZW50bHksIG9ubHkgTGludXggdmVyc2lvbiBpcyBpbmNsdWRlZC4KKworRllJLCB0aGUgZmlsZSBpcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5CisKKyAgICB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9b3ZlcndyaXRlCisKK2FmdGVyIGEgZnVsbCB0ZXN0IHJ1biwgdGhlbiByZXBlYXRlZGx5CisKKyAgICB0ZXN0L3Rlc3QucHkgLS1za2lwLWtub3duLWZhaWx1cmVzCisgICAgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW1lcmdlCisKK3RvIHVwZGF0ZSB0aGUga25vd24gZmFpbHVyZXMsIHJ1bgorCisgICAgbWFrZSBmYWlsCisKKyMjIFRlc3QgZXhlY3V0YWJsZSBzcGVjaWZpY2F0aW9uCisKKyMjIyBDb21tYW5kIGxpbmUgcGFyYW1ldGVycworCitVbml0IHRlc3RzIGZvciBsYW5ndWFnZXMgYXJlIHVzdWFsbHkgbG9jYXRlZCB1bmRlciBsaWIvPGxhbmc+L3Rlc3QvCitjcm9zcyBsYW5ndWFnZSB0ZXN0cyBhY2NvcmRpbmcgdG8gW1RocmlmdFRlc3QudGhyaWZ0XShUaHJpZnRUZXN0LnRocmlmdCkgc2hhbGwgYmUKK3Byb3ZpZGVkIGZvciBldmVyeSBsYW5ndWFnZSBpbmNsdWRpbmcgZXhlY3V0YWJsZXMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQKK2xpbmUgaW50ZXJmYWNlOgorCisqKlNlcnZlciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOioqCisKKyAgICAkIC4vY3BwL1Rlc3RTZXJ2ZXIgLWgKKyAgICBBbGxvd2VkIG9wdGlvbnM6CisgICAgICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkKKyAgICAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCAic2ltcGxlIiwgInRocmVhZC1wb29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciCisgICAgICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZQorICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMKKyAgICAgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorCisqKkNsaWVudCBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOioqCisKKyAgICAkIC4vY3BwL1Rlc3RDbGllbnQgLWgKKyAgICBBbGxvd2VkIG9wdGlvbnM6CisgICAgICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKKyAgICAgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0CisgICAgICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQKKyAgICAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMKKyAgICAgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisKK0lmIHlvdSBoYXZlIGV4ZWN1dGVkIHRoZSAqKm1ha2UgY2hlY2sqKiBvciAqKm1ha2UgY3Jvc3MqKiB0aGVuIHlvdSB3aWxsIGJlIGFibGUgdG8gYnJvd3NlCitbZ2VuLWh0bWwvVGhyaWZ0VGVzdC5odG1sXShnZW4taHRtbC9UaHJpZnRUZXN0Lmh0bWwpIHdpdGggdGhlIHRlc3QgZG9jdW1lbnRhdGlvbi4KKworIyMjIFJldHVybiBjb2RlCisKK1RoZSByZXR1cm4gY29kZSAoZXhpdCBjb2RlKSBzaGFsbCBiZSAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDEgLSAyNTUgb24gZXJyb3JzLgorSW4gb3JkZXIgdG8gc2lnbmFsIGZhaWxlZCB0ZXN0cywgdGhlIHJldHVybiBjb2RlIHNoYWxsIGJlIGNvbXBvc2VkIGZyb20gdGhlc2UgYml0cyB0byBpbmRpY2F0ZQorZmFpbGluZyB0ZXN0czoKKworICAgICAgI2RlZmluZSBURVNUX0JBU0VUWVBFUyAgICAgMSAgLy8gMDAwMCAwMDAxCisgICAgICAjZGVmaW5lIFRFU1RfU1RSVUNUUyAgICAgICAyICAvLyAwMDAwIDAwMTAKKyAgICAgICNkZWZpbmUgVEVTVF9DT05UQUlORVJTICAgIDQgIC8vIDAwMDAgMDEwMAorICAgICAgI2RlZmluZSBURVNUX0VYQ0VQVElPTlMgICAgOCAgLy8gMDAwMCAxMDAwCisgICAgICAjZGVmaW5lIFRFU1RfVU5LTk9XTiAgICAgIDY0ICAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKKyAgICAgICNkZWZpbmUgVEVTVF9USU1FT1VUICAgICAxMjggIC8vIDEwMDAgMDAwMAorICAgICAgI2RlZmluZSBURVNUX05PVFVTRUQgICAgICA0OCAgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorCitUZXN0cyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgYXQgYWxsIGNvdW50IGFzIGVycm9ycy4KKworKipFeGFtcGxlOioqCisKK0R1cmluZyB0ZXN0cywgdGhlIHRlc3QgY2xpZW50IG5vdGljZXMgdGhhdCBzb21lIG9mIHRoZSBTdHJ1Y3QgdGVzdHMgZmFpbC4KK0Z1cnRoZXJtb3JlLCBkdWUgdG8gc29tZSBvdGhlciBwcm9ibGVtIG5vbmUgb2YgdGhlIEV4Y2VwdGlvbiB0ZXN0cyBpcyBleGVjdXRlZC4KK1RoZXJlZm9yZSwgdGhlIHRlc3QgY2xpZW50IHJldHVybnMgdGhlIGNvZGUgYDEwID0gMiB8IDhgLCBpbmRpY2F0aW5nIHRoZSBmYWlsdXJlCitvZiBib3RoIHRlc3QgMiAoVEVTVF9TVFJVQ1RTKSBhbmQgdGVzdCA4IChURVNUX0VYQ0VQVElPTlMpLgorCisKKyMjIFNTTAorVGVzdCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMgYXJlIHByb3ZpZGVkIGluIG11bHRpcGxlIGZvcm1hdHMgdW5kZXIgdGhlIGZvbGxvd2luZworZGlyZWN0b3J5IFt0ZXN0L2tleXNdKGtleXMpCmRpZmYgLS1naXQgYS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgYi90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4MjU4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUmVjdXJzaXZlLnRocmlmdApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N0cnVjdCBSZWNUcmVlIHsKKyAgMTogbGlzdDxSZWNUcmVlPiBjaGlsZHJlbgorICAyOiBpMTYgaXRlbQorfQorCitzdHJ1Y3QgUmVjTGlzdCB7CisgIDE6IFJlY0xpc3QgJiBuZXh0aXRlbQorICAzOiBpMTYgaXRlbQorfQorCitzdHJ1Y3QgQ29SZWMgeworICAxOiAgQ29SZWMyICYgb3RoZXIKK30KKworc3RydWN0IENvUmVjMiB7CisgIDE6IENvUmVjIG90aGVyCit9CisKK3N0cnVjdCBWZWN0b3JUZXN0IHsKKyAgMTogbGlzdDxSZWNMaXN0PiBsaXN0ZXI7Cit9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UKK3sKKyAgUmVjVHJlZSBlY2hvVHJlZSgxOlJlY1RyZWUgdHJlZSkKKyAgUmVjTGlzdCBlY2hvTGlzdCgxOlJlY0xpc3QgbHN0KQorICBDb1JlYyBlY2hvQ29SZWMoMTpDb1JlYyBpdGVtKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9SZXVzZU9iamVjdHMudGhyaWZ0IGIvdGVzdC9SZXVzZU9iamVjdHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGUgamF2YSBjb2RlZ2VuZXJhdG9yIGhhcyBvcHRpb24gdG8gcmV1c2Ugb2JqZWN0cyBmb3IgZGVzZXJpYWxpemF0aW9uCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgorCitzdHJ1Y3QgUmV1c2UgeworICAxOiBpMzIgdmFsMTsKKyAgMjogc2V0PHN0cmluZz4gdmFsMjsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKaW5kZXggODdjNmU0Ny4uNDMxODExYiAxMDA2NDQKLS0tIGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKysgYi90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CkBAIC0xOCwxNiArMTgsMTggQEAKICAqLwogCiBuYW1lc3BhY2UgY3BwIHRlc3Quc3RyZXNzCituYW1lc3BhY2UgZCB0aHJpZnQudGVzdC5zdHJlc3MKK25hbWVzcGFjZSBnbyBzdHJlc3MKIAogc2VydmljZSBTZXJ2aWNlIHsKIAogICB2b2lkIGVjaG9Wb2lkKCksCi0gIGJ5dGUgZWNob0J5dGUoMTogYnl0ZSBhcmcpLAorICBpOCBlY2hvQnl0ZSgxOiBpOCBhcmcpLAogICBpMzIgZWNob0kzMigxOiBpMzIgYXJnKSwKICAgaTY0IGVjaG9JNjQoMTogaTY0IGFyZyksCiAgIHN0cmluZyBlY2hvU3RyaW5nKDE6IHN0cmluZyBhcmcpLAotICBsaXN0PGJ5dGU+ICBlY2hvTGlzdCgxOiBsaXN0PGJ5dGU+IGFyZyksCi0gIHNldDxieXRlPiAgZWNob1NldCgxOiBzZXQ8Ynl0ZT4gYXJnKSwKLSAgbWFwPGJ5dGUsIGJ5dGU+ICBlY2hvTWFwKDE6IG1hcDxieXRlLCBieXRlPiBhcmcpLAorICBsaXN0PGk4PiAgZWNob0xpc3QoMTogbGlzdDxpOD4gYXJnKSwKKyAgc2V0PGk4PiAgZWNob1NldCgxOiBzZXQ8aTg+IGFyZyksCisgIG1hcDxpOCwgaTg+ICBlY2hvTWFwKDE6IG1hcDxpOCwgaTg+IGFyZyksCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcCBiL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmNDc0Ny4uMDAwMDAwMAotLS0gYS90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0Lmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3Q6OlRTaG9ydFJlYWRUcmFuc3BvcnQ7Ci0KLS8vIFNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIFpsaWJUcmFuc3BvcnQuICBUT0RPOiByZWZhY3Rvci4KLXVuc2lnbmVkIGludCBkaXN0W11bNTAwMF0gPSB7Ci0geyAxPDwxNSB9LAotCi0gewotICA1LDEzLDksMSw4LDksMTEsMTMsMTgsNDgsMjQsMTMsMjEsMTMsNSwxMSwzNSwyLDQsMjAsMTcsNzIsMjcsMTQsMTUsNCw3LDI2LAotICAxMiwxLDE0LDksMiwxNiwyOSw0MSw3LDI0LDQsMjcsMTQsNCwxLDQsMjUsMyw2LDM0LDEwLDgsNTAsMiwxNCwxMyw1NSwyOSwzLAotICA0Myw1Myw0OSwxNCw0LDEwLDMyLDI3LDQ4LDEsMywxLDExLDUsMTcsMTYsNTEsMTcsMzAsMTUsMTEsOSwyLDIsMTEsNTIsMTIsMiwKLSAgMTMsOTQsMSwxOSwxLDM4LDIsOCw0Myw4LDMzLDcsMzAsOCwxNywyMiwyLDE1LDE0LDEyLDM0LDIsMTIsNiwzNywyOSw3NCwzLAotICAxNjUsMTYsMTEsMTcsNSwxNCwzLDEwLDcsMzcsMTEsMjQsNywxLDMsMTIsMzcsOCw5LDM0LDE3LDEyLDgsMjEsMTMsMzcsMSw0LAotICAzMCwxNCw3OCw0LDE1LDIsNDAsMzcsMTcsMTIsMzYsODIsMTQsNCwxLDQsNywxNywxMSwxNiw4OCw3NywyLDMsMTUsMywzNCwxMSwKLSAgNSw3OSwyMiwzNCw4LDQsNCw0MCwyMiwyNCwyOCw5LDEzLDMsMzQsMjcsOSwxNiwzOSwxNiwzOSwxMywyLDQsMyw0MSwyNiwxMCw0LAotICAzMyw0LDcsMTIsNSw2LDMsMTAsMzAsOCwyMSwxNiw1OCwxOSw5LDAsNDcsNywxMywxMSwxOSwxNSw3LDUzLDU3LDIsMTMsMjgsMjIsCi0gIDMsMTYsOSwyNSwzMywxMiw0MCw3LDEyLDY0LDcsMTQsMjQsNDQsOSwyLDE0LDExLDIsNTgsMSwyNiwzMCwxMSw5LDUsMjQsNyw5LAotICA5NCwyLDEwLDIxLDUsNSw0LDUsNiwxNzksOSwxOCwyLDcsMTMsMzEsNDEsMTcsNCwzNiwzLDIxLDYsMjYsOCwxNSwxOCw0NCwyNywKLSAgMTEsOSwyNSw3LDAsMTQsMiwxMiwyMCwyMywxMywyLDE2Myw5LDUsMTUsNjUsMiwxNCw2LDgsOTgsMTEsMTUsMTQsMzQsMiwzLDEwLAotICAyMiw5LDkyLDcsMTAsMzIsNjcsMTMsMyw0LDM1LDgsMiwxLDUsMCwyNiwzODEsNywyNyw4LDIsMTYsOTMsNCwxOSw1LDgsMjUsOSwKLSAgMzEsMTQsNCwyMSw1LDMsOSwyMiw1Niw0LDE4LDMsMTEsMTgsNiw0LDMsNDAsMTIsMTYsMTEwLDgsMzUsMTQsMSwxOCw0MCw5LDEyLAotICAxNCwzLDExLDcsNTcsMTMsMTgsMTE2LDUzLDE5LDIyLDcsMTYsMTEsNSw4LDIxLDE2LDEsNzUsMjEsMjAsMSwyOCwyLDYsMSw3LAotICAxOSwzOCw1LDYsOSw5LDQsMSw3LDU1LDM2LDYyLDUsNCw0LDI0LDE1LDEsMTIsMzUsNDgsMjAsNSwxNywxLDUsMjYsMTUsNCw1NCwKLSAgMTMsNSw1LDE1LDUsMTksMzIsMjksMzEsNyw2LDQwLDcsODAsMTEsMTgsOCwxMjgsNDgsNiwxMiw4NCwxMyw0LDcsMiwxMyw5LDE2LAotICAxNywzLDI1NCwxLDQsMTgxLDgsNDQsNyw2LDI0LDI3LDksMjMsMTQsMzQsMTYsMjIsMjUsMTAsMywzLDQsNCwxMiwyLDEyLDYsNywKLSAgMTMsNTgsMTMsNiwxMSwxOSw1MywxMSw2NiwxOCwxOSwxMCw0LDEzLDIsNSw0OSw1OCwxLDY3LDcsMjEsNjQsMTQsMTEsMTQsOCwzLAotICAyNiwzMyw5MSwzMSwyMCw3LDksNDIsMzksNCwzLDU1LDExLDEwLDAsNyw0LDc1LDgsMTIsMCwyNywzLDgsOSwwLDEyLDEyLDIzLAotICAyOCwyMywyMCw0LDEzLDMwLDIsMjIsMjAsMTksMzAsNiwyMiwyLDYsNCwyNCw3LDE5LDU1LDg2LDUsMzMsMiwxNjEsNiw3LDEsNjIsCi0gIDEzLDMsNzIsMTIsMTIsOSw3LDEyLDEwLDUsMTAsMjksMSw1LDIyLDEzLDEzLDUsMiwxMiwzLDcsMTQsMTgsMiwzLDQ2LDIxLDE3LAotICAxNSwxOSwzLDI3LDUsMTYsNDUsMzEsMTAsOCwxNywxOCwxOCwzLDcsMjQsNiw1NSw5LDMsNiwxMiwxMCwxMiw4LDkxLDksNCw0LDQsCi0gIDI3LDI5LDE2LDUsNywyMiw0MywyOCwxMSwxNCw4LDExLDI4LDEwOSw1NSw3MSw0MCwzLDgsMjIsMjYsMTUsNDQsMywyNSwyOSw1LAotICAzLDMyLDE3LDEyLDMsMjksMjcsMjUsMTUsMTEsOCw0MCwzOSwzOCwxNywzLDksMTEsMiwzMiwxMSw2LDIwLDQ4LDc1LDI3LDMsNywKLSAgNTQsMTIsOTUsMTIsNywyNCwyMywyLDEzLDgsMTUsMTYsNSwxMiw0LDE3LDcsMTksODgsMiw2LDEzLDExNSw0NSwxMiwyMSwyLDg2LAotICA3NCw5LDcsNSwxNiwzMiwxNiwyLDIxLDE4LDYsMzQsNSwxOCwyNjAsNywxMiwxNiw0NCwxOSw5MiwzMSw3LDgsMiw5LDAsMCwxNSwKLSAgOCwzOCw0LDgsMjAsMTgsMiw4MywzLDMsNCw5LDUsMywxMCwzLDUsMjksMTUsNywxMSw4LDQ4LDE3LDIzLDIsMTcsNCwxMSwyMiwKLSAgMjEsNjQsOCw4LDQsMTksOTUsMCwxNywyOCw5LDExLDIwLDcxLDUsMTEsMTgsMTIsMTMsNDUsNDksNCwxLDMzLDMyLDIzLDEzLDUsCi0gIDUyLDIsMiwxNiwzLDQsNywxMiwyLDEsMTIsNiwyNCwxLDIyLDE1NSwyMSwzLDQ1LDQsMTIsNDQsMjYsNSw0MCwzNiw5LDksOCwyMCwKLSAgMzUsMzEsMywyLDMyLDUwLDEwLDgsMzcsMiw3NSwzNSwyMiwxNSwxOTIsOCwxMSwyMywxLDQsMjksNiw4LDgsNSwxMiwxOCwzMiw0LAotICA3LDEyLDIsMCwwLDksNSw0OCwxMSwzNSwzLDEsMTIzLDYsMjksOCwxMSw4LDIzLDUxLDE2LDYsNjMsMTIsMiw1LDQsMTQsMiwxNSwKLSAgNywxNCwzLDIsNywxNywzMiw4LDgsMTAsMSwyMyw2MiwyLDQ5LDYsNDksNDcsMjMsMywyMCw3LDExLDM5LDEwLDI0LDYsMTUsNSw1LAotICAxMSw4LDE2LDM2LDgsMTMsMjAsMywxMCw0NCw3LDUyLDcsMTAsMzYsNiwxNSwxMCw1LDExLDQsMTQsMTksMTcsMTAsMTIsMyw2LAotICAyMyw0LDEzLDk0LDcwLDcsMzYsNywzOCw3LDI4LDgsNCwxNSwzLDE5LDQsMzMsMzksMjEsMTA5LDQsODAsNiw0MCw0LDQzMiw0LDQsCi0gIDcsOCwzLDMxLDgsMjgsMzcsMzQsMTAsMiwyMSw1LDIyLDAsNywzNiwxNCwxMiw2LDI0LDEsMjEsNSw5LDIsMjksMjAsNTQsMTEzLAotICAxMywzMSwzOSwyNyw2LDAsMjcsNCw1LDIsNDMsNyw4LDU3LDgsNjIsNyw5LDEyLDIyLDkwLDMwLDYsMTksNywxMCwyMCw2LDUsNTgsCi0gIDMyLDMwLDQxLDQsMTAsMjUsMTMsMyw4LDcsMTAsMiw5LDYsMTUxLDQ0LDE2LDEyLDE2LDIwLDgsMywxOCwxMSwxNyw0LDEwLDQ1LAotICAxNSw4LDU2LDM4LDUyLDI1LDQwLDE0LDQsMTcsMTUsOCwyLDE5LDcsOCwyNiwzMCwyLDMsMTgwLDgsMjYsMTcsMzgsMzUsNSwxNiwKLSAgMjgsNSwxNSw1NiwxMywxNCwxOCw5LDE1LDgzLDI3LDMsOSw0LDExLDgsMjcsMjcsNDQsMTAsMTIsOCwzLDQ4LDE0LDcsOSw0LDQsCi0gIDgsNCw1LDksMTIyLDgsMTQsMTIsMTksMTcsMjEsNCwyOSw2MywyMSwxNywxMCwxMiwxOCw0NywxMCwxMCw1Myw0LDE4LDE2LDQsOCwKLSAgMTE4LDksNSwxMiw5LDExLDksMywxMiwzMiwzLDIzLDIsMTUsMywzLDMwLDMsMTcsMjM1LDE1LDIyLDksMjk5LDE0LDE3LDEsNSwKLSAgMTYsOCwzLDcsMywxMywyLDcsNiw0LDgsNjYsMiwxMyw2LDE1LDE2LDQ3LDMsMzYsNSw3LDEwLDI0LDEsOSw5LDgsMTMsMTYsMjYsCi0gIDEyLDcsMjQsMjEsMTgsNDksMjMsMzksMTAsNDEsNCwxMyw0LDI3LDExLDEyLDEyLDE5LDQsMTQ3LDgsMTAsOSw0MCwyMSwyLDgzLAotICAxMCw1LDYsMTEsMjUsOSw1MCw1Nyw0MCwxMiwxMiwyMSwxLDMsMjQsMjMsOSwzLDksMTMsMiwzLDEyLDU3LDgsMTEsMTMsMTUsMjYsCi0gIDE1LDEwLDQ3LDM2LDQsMjUsMSw1LDgsNSw0LDAsMTIsNDksNSwxOSw0LDYsMTYsMTQsNiwxMCw2OSwxMCwzMywyOSw3LDgsNjEsCi0gIDEyLDQsMCwzLDcsNiwzLDE2LDI5LDI3LDM4LDQsMjEsMCwyNCwzLDIsMSwxOSwxNiwyMiwyLDgsMTM4LDExLDcsNywzLDEyLDIyLAotICAzLDE2LDUsNywzLDUzLDksMTAsMzIsMTQsNSw3LDMsNiwyMiw5LDU5LDI2LDgsNyw1OCw1LDE2LDExLDU1LDcsNCwxMSwxNDYsOTEsCi0gIDgsMTMsMTgsMTQsNiw4LDgsMzEsMjYsMjIsNiwxMSwzMCwxMSwzMCwxNSwxOCwzMSwzLDQ4LDE3LDcsNiw0LDksMiwyNSwzLDM1LAotICAxMywxMyw3LDgsNCwzMSwxMCw4LDEwLDQsMyw0NSwxMCwyMywyLDcsMjU5LDE3LDIxLDEzLDE0LDMsMjYsMyw4LDI3LDQsMTgsOSwKLSAgNjYsNywxMiw1LDgsMTcsNCwyMyw1NSw0MSw1MSwyLDMyLDI2LDY2LDQsMjEsMTQsMTIsNjUsMTYsMjIsMTcsNSwxNCwyLDI5LDI0LAotICA3LDMsMzYsMiw0Myw1Myw4Niw1LDI4LDQsNTgsMTMsNDksMTIxLDYsMiw3MywyLDEsNDcsNCwyLDI3LDEwLDM1LDI4LDI3LDEwLAotICAxNywxMCw1Niw3LDEwLDE0LDI4LDIwLDI0LDQwLDcsNCw3LDMsMTAsMTEsMzIsNiw2LDMsMTUsMTEsNTQsNTczLDIsMyw2LDIsMywKLSAgMTQsNjQsNCwxNiwxMiwxNiw0MiwxMCwyNiw0LDYsMTEsNjksMTgsMjcsMiwyLDE3LDIyLDksMTMsMjIsMTEsNiwxLDE1LDQ5LDMsCi0gIDE0LDEKLSB9LAotCi0gewotICAxMSwxMSwxMSwxNSw0NywxLDMsMSwyMyw1LDgsMTgsMywyMywxNSwyMSwxLDcsMTksMTAsMjYsMSwxNywxMSwzMSwyMSw0MSwxOCwKLSAgMzQsNCw5LDU4LDE5LDMsMywzNiw1LDE4LDEzLDMsMTQsNCw5LDEwLDQsMTksNTYsMTUsMyw1LDMsMTEsMjcsOSw0LDEwLDEzLDQsCi0gIDExLDYsOSwyLDE4LDMsMTAsMTksMTEsNCw1Myw0LDIsMiwzLDQsNTgsMTYsMywwLDUsMzAsMiwxMSw5MywxMCwyLDE0LDEwLDYsMiwKLSAgMTE1LDIsMjUsMTYsMjIsMzgsMTAxLDQsMTgsMTMsMiwxNDUsNTEsNDUsMTUsMTQsMTUsMTMsMjAsNywyNCw1LDEzLDE0LDMwLDQwLAotICAxMCw0LDEwNywxMiwyNCwxNCwzOSwxMiw2LDEzLDIwLDcsNywxMSw1LDE4LDE4LDQ1LDIyLDYsMzksMywyLDEsNTEsOSwxMSw0LAotICAxMyw5LDM4LDQ0LDgsMTEsOSwxNSwxOSw5LDIzLDE3LDE3LDE3LDEzLDksOSwxLDEwLDQsMTgsNiwyLDksNSwyNywzMiw3Miw4LAotICAzNyw5LDQsMTAsMzAsMTcsMjAsMTUsMTcsNjYsMTAsNCw3MywzNSwzNyw2LDQsMTYsMTE3LDQ1LDEzLDQsNzUsNSwyNCw2NSwxMCwKLSAgNCw5LDQsMTMsNDYsNSwyNiwyOSwxMCw0LDQsNTIsMywxMywxOCw2Myw2LDE0LDksMjQsMjc3LDksODgsMiw0OCwyNywxMjMsMTQsCi0gIDYxLDcsNSwxMCw4LDcsOTAsMywxMCwzLDMsNDgsMTcsMTMsMTAsMTgsMzMsMiwxOSwzNiw2LDIxLDEsMTYsMTIsNSw2LDIsMTYsCi0gIDE1LDI5LDg4LDI4LDIsMTUsNiwxMSw0LDYsMTEsMywzLDQsMTgsOSw1Myw1LDQsMywzMyw4LDksOCw2LDcsMzYsOSw2MiwxNCwyLAotICAxLDEwLDEsMTYsNywzMiw3LDIzLDIwLDExLDEwLDIzLDIsMSwwLDksMTYsNDAsMiw4MSw1LDIyLDgsNSw0LDM3LDUxLDM3LDEwLAotICAxOSw1NywxMSwyLDkyLDMxLDYsMzksMTAsMTMsMTYsOCwyMCw2LDksMywxMCwxOCwyNSwyMywxMiwzMCw2LDIsMjYsNyw2NCwxOCwKLSAgNiwzMCwxMiwxMywyNyw3LDEwLDUsMywzMywyNCw5OSw0LDIzLDQsMSwyNyw3LDI3LDQ5LDgsMjAsMTYsMyw0LDEzLDksMjIsNjcsCi0gIDI4LDMsMTAsMTYsMywyLDEwLDQsOCwxLDgsMTksMyw4NSw2LDIxLDEsOSwxNiwyLDMwLDEwLDMzLDEyLDQsOSwzLDEsNjAsMzgsNiwKLSAgMjQsMzIsMywxNCwzLDQwLDgsMzQsMTE1LDUsOSwyNyw1LDk2LDMsNDAsNiwxNSw1LDgsMjIsMTEyLDUsNSwyNSwxNyw1OCwyLDcsCi0gIDM2LDIxLDUyLDEsMyw5NSwxMiwyMSw0LDExLDgsNTksMjQsNSwyMSw0LDksMTUsOCw3LDIxLDMsMjYsNSwxMSw2LDcsMTcsNjUsCi0gIDE0LDExLDEwLDIsMTcsNSwxMiwyMiw0LDQsMiwyMSw4LDExMiwzLDM0LDYzLDM1LDIsMjUsMSwyLDE1LDY1LDIzLDAsMyw1LDE1LAotICAyNiwyNyw5LDUsNDgsMTEsMTUsNCw5LDUsMzMsMjAsMTUsMSwxOCwxOSwxMSwyNCw0MCwxMCwyMSw3NCw2LDYsMzIsMzAsNDAsNSwKLSAgNCw3LDQ0LDEwLDI1LDQ2LDE2LDEyLDUsNDAsNywxOCw1LDE4LDksMTIsOCw0LDI1LDUsNiwzNiw0LDQzLDgsOSwxMiwzNSwxNyw0LAotICA4LDksMTEsMjcsNSwxMCwxNyw0MCw4LDEyLDQsMTgsOSwxOCwxMiwyMCwyNSwzOSw0MiwxLDI0LDEzLDIyLDE1LDcsMTEyLDM1LDMsCi0gIDcsMTcsMzMsMiw1LDUsMTksOCw0LDEyLDI0LDE0LDEzLDIsMSwxMyw2LDUsMTksMTEsNyw1NywwLDE5LDYsMTE3LDQ4LDE0LDgsCi0gIDEwLDUxLDE3LDEyLDE0LDIsNSw4LDksMTUsNCw0OCw1MywxMywyMiw0LDI1LDEyLDExLDE5LDQ1LDUsMiw2LDU0LDIyLDksMTUsOSwKLSAgMTMsMiw3LDExLDI5LDgyLDE2LDQ2LDQsMjYsMTQsMjYsNDAsMjIsNCwyNiw2LDE4LDEzLDQsNCwyMCwzLDMsNywxMiwxNyw4LDksCi0gIDIzLDYsMjAsNywyNSwyMywxOSw1LDE1LDYsMjMsMTUsMTEsMTksMTEsMywxNyw1OSw4LDE4LDQxLDQsNTQsMjMsNDQsNzUsMTMsCi0gIDIwLDYsMTEsMiwzLDEsMTMsMTAsMyw3LDEyLDMsNCw3LDgsMzAsNiw2LDcsMywzMiw5LDUsMjgsNiwxMTQsNDIsMTMsMzYsMjcsCi0gIDU5LDYsOTMsMTMsNzQsOCw2OSwxNDAsMywxLDE3LDQ4LDEwNSw2LDExLDUsMTUsMSwxMCwxMCwxNCw4LDUzLDAsOCwyNCw2MCwyLAotICA2LDM1LDIsMTIsMzIsNDcsMTYsMTcsNzUsMiw1LDQsMzcsMjgsMTAsNSw5LDU3LDQsNTksNSwxMiwxMyw3LDkwLDUsMTEsNSwyNCwKLSAgMjIsMTMsMzAsMSwyLDEwLDksNiwxOSwzLDE4LDQ3LDIsNSw3LDksMzUsMTUsMyw2LDEsMjEsMTQsMTQsMTgsMTQsOSwxMiw4LDczLAotICA2LDE5LDMsMzIsOSwxNCwxNywxNyw1LDU1LDIzLDYsMTYsMjgsMywxMSw0OCw0LDYsNiw2LDEyLDE2LDMwLDEwLDMwLDI3LDUxLAotICAxOCwyOSwyLDMsMTUsMSw3NiwwLDE2LDMzLDQsMjcsMyw2Miw0LDEwLDIsNCw4LDE1LDksNDEsMjYsMjIsMiw0LDIwLDQsNDksMCwKLSAgOCwxLDU3LDEzLDEyLDM5LDMsNjMsMTAsMTksMzQsMzUsMiw3LDgsMjksNzIsNCwxMCwwLDc3LDgsNiw3LDksMTUsMjEsOSw0LDEsCi0gIDIwLDIzLDEsOSwxOCw5LDE1LDM2LDQsNyw2LDE1LDUsNyw3LDQwLDIsOSwyMiwyLDMsMjAsNCwxMiwzNCwxMyw2LDE4LDE1LDEsCi0gIDM4LDIwLDEyLDcsMTYsMywxOSw4NSwxMiwxNiwxOCwxNiwyLDE3LDEsMTMsOCw2LDEyLDE1LDk3LDE3LDEyLDksMywyMSwxNSwxMiwKLSAgMjMsNDQsODEsMjYsMzAsMiw1LDE3LDYsNiwwLDIyLDQyLDE5LDYsMTksNDEsMTQsMzYsNywzLDU2LDcsOSwzLDIsNiw5LDY5LDMsCi0gIDE1LDQsMzAsMjgsMjksNyw5LDE1LDE3LDE3LDYsMSw2LDE1Myw5LDMzLDUsMTIsMTQsMTYsMjgsMyw4LDcsMTQsMTIsNCw2LDM2LAotICA5LDI0LDEzLDEzLDQsMiw5LDE1LDE5LDksNTMsNywxMyw0LDE1MCwxNyw5LDIsNiwxMiw3LDMsNSw1OCwxOSw1OCwyOCw4LDE0LDMsCi0gIDIwLDMsMCwzMiw1Niw3LDUsNCwyNywxLDY4LDQsMjksMTMsNSw1OCwyLDksNjUsNDEsMjcsMTYsMTUsMTIsMTQsMiwxMCw5LDI0LAotICAzLDIsOSwyLDIsMywxNCwzMiwxMCwyMiwzLDEzLDExLDQsNiwzOSwxNywwLDEwLDUsNSwxMCwzNSwxNiwxOSwxNCwxLDgsNjMsMTksCi0gIDE0LDgsNTYsMTAsMiwxMiw2LDEyLDYsNywxNiwyLDksOSwxMiwyMCw3MywyNSwxMywyMSwxNywyNCw1LDMyLDgsMTIsMjUsOCwxNCwKLSAgMTYsNSwyMywzLDcsNiwzLDExLDI0LDYsMzAsNCwyMSwxMywyOCw0LDYsMjksMTUsNSwxNyw2LDI2LDgsMTUsOCwzLDcsNyw1MCwKLSAgMTEsMzAsNiwyLDI4LDU2LDE2LDI0LDI1LDIzLDI0LDg5LDMxLDMxLDEyLDcsMjIsNCwxMCwxNywzLDMsOCwxMSwxMyw1LDMsMjcsCi0gIDEsMTIsMSwxNCw4LDEwLDI5LDIsNSwyLDIsMjAsMTAsMCwzMSwxMCwyMSwxLDQ4LDMsNSw0Myw0LDUsMTgsMTMsNSwxOCwyNSwzNCwKLSAgMTgsMyw1LDIyLDE2LDMsNCwyMCwzLDksMywyNSw2LDYsNDQsMjEsMywxMiw3LDUsNDIsMywyLDE0LDQsMzYsNSwzLDQ1LDUxLDE1LAotICA5LDExLDI4LDksNyw2LDYsMTIsMjYsNSwxNCwxMCwxMSw0Miw1NSwxMywyMSw0LDI4LDYsNywyMywyNywxMSwxLDQxLDM2LDAsMzIsCi0gIDE1LDI2LDIsMywyMywzMiwxMSwyLDE1LDcsMjksMjYsMTQ0LDMzLDIwLDEyLDcsMjEsMTAsNywxMSw2NSw0NiwxMCwxMywyMCwzMiwKLSAgNCw0LDUsMTksMiwxOSwxNSw0OSw0MSwxLDc1LDEwLDExLDI1LDEsMiw0NSwxMSw4LDI3LDE4LDEwLDYwLDI4LDI5LDEyLDMwLDE5LAotICAxNiw0LDI0LDExLDE5LDI3LDE3LDQ5LDE4LDcsNDAsMTMsMTksMjIsOCw1NSwxMiwxMSwzLDYsNSwxMSw4LDEwLDIyLDUsOSw5LAotICAyNSw3LDE3LDcsNjQsMSwyNCwyLDEyLDE3LDQ0LDQsMTIsMjcsMjEsMTEsMTAsNyw0Nyw1LDksMTMsMTIsMzgsMjcsMjEsNywyOSwKLSAgNywxLDE3LDMsMyw1LDQ4LDYyLDEwLDMsMTEsMTcsMTUsMTUsNiwzLDgsMTAsOCwxOCwxOSwxMywzLDksNyw2LDQ0LDksMTAsNCwKLSAgNDMsOCw2LDYsMTQsMjAsMzgsMjQsMiw0LDUsNSw3LDUsOSwzOSw4LDQ0LDQwLDksMTksNywzLDE1LDI1LDIsMzcsMTgsMTUsOSw1LAotICA4LDMyLDEwLDUsMTgsNCw3LDQ2LDIwLDE3LDIzLDQsMTEsMTYsMTgsMzEsMTEsMywxMSwxLDE0LDEsMjUsNCwyNywxMywxMywzOSwKLSAgMTQsNiw2LDM1LDYsMTYsMTMsMTEsMTIyLDIxLDE1LDIwLDI0LDEwLDUsMTUyLDE1LDM5LDUsMjAsMTYsOSwxNCw3LDUzLDYsMyw4LAotICAxOSw2MywzMiw2LDIsMywyMCwxLDE5LDUsMTMsNDIsMTUsNCw2LDY4LDMxLDQ2LDExLDM4LDEwLDI0LDUsNSw4LDksMTIsMywzNSwKLSAgNDYsMjYsMTYsMiw4LDQsNzQsMTYsNDQsNCw1LDEsMTYsNCwxNCwyMywxNiw2OSwxNSw0MiwzMSwxNCw3LDcsNiw5NywxNCw0MCwxLAotICA4LDcsMzQsOSwzOSwxOSwxMywxNSwxMCwyMSwxOCwxMCw1LDE1LDM4LDcsNSwxMiw3LDIwLDE1LDQsMTEsNiwxNCw1LDE3LDcsMzksCi0gIDM1LDM2LDE4LDIwLDI2LDIyLDQsMiwzNiwyMSw2NCwwLDUsOSwxMCw2LDQsMSw3LDMsMSwzLDMsNCwxMCwyMCw5MCwyLDIyLDQ4LAotICAxNiwyMywyLDMzLDQwLDEsMjEsMjEsMTcsMjAsOCw4LDEyLDQsODMsMTQsNDgsNCwyMSwzLDksMjcsNSwxMSw0MCwxNSw5LDMsMTYsCi0gIDE3LDksMTEsNCwyNCwzMSwxNywzLDQsMiwxMSwxLDgsNCw4LDYsNDEsMTcsNCwxMywzLDcsMTcsOCwyNyw1LDEzLDYsMTAsNywxMywKLSAgMTIsMTgsMTMsNjAsMTgsMyw4LDEsMTIsMTI1LDIsNywxNiwyLDExLDIsNCw3LDI2LDUsOSwxNCwxNCwxNiw4LDE0LDcsMTQsNiw5LAotICAxMyw5LDYsNCwyNiwzNSw0OSwzNiw1NSwzLDksNiw0MCwyNiwyMywzMSwxOSw0MSwyLDEwLDMxLDYsNTQsNSw2OSwxNiw3LDgsMTYsCi0gIDEsNSw3LDQsMjIsNyw3LDUsNCw0OCwxMSwxMywzLDk4LDQsMTEsMTksNCwyLDE0LDcsMzQsNywxMCwzLDIsMTIsNyw2LDIsNSwxMTgKLSB9LAotfTsKLQotdWludDhfdCBkYXRhWzE8PDE1XTsKLXN0cmluZyBkYXRhX3N0cjsKLXZvaWQgaW5pdF9kYXRhKCkgewotICBzdGF0aWMgYm9vbCBpbml0dGVkID0gZmFsc2U7Ci0gIGlmIChpbml0dGVkKSByZXR1cm47Ci0gIGluaXR0ZWQgPSB0cnVlOwotCi0gIC8vIFJlcGVhdGFiaWxpdHkuICBLaW5kIG9mLgotICBzdGQ6OnNyYW5kKDQyKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KShzaXplb2YoZGF0YSkvc2l6ZW9mKGRhdGFbMF0pKTsgKytpKSB7Ci0gICAgZGF0YVtpXSA9ICh1aW50OF90KXJhbmQoKTsKLSAgfQotCi0gIGRhdGFfc3RyLmFzc2lnbigoY2hhciopZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLX0KLQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEUoIFRCdWZmZXJCYXNlVGVzdCApOwotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfR2V0QnVmZmVyICkgewotICBpbml0X2RhdGEoKTsKLQotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07Ci0gICAgICBpbmRleCsrOwotICAgIH0KLQotICAgIHN0cmluZyBvdXRwdXQgPSBidWZmZXIuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ciwgb3V0cHV0KTsKLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZCApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgewotICAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOwotICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgaW50IGluZGV4OwotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBnb3QgPSBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCBkaXN0W2QyXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWRTdHJpbmcgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKLSAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLSAgICAgIHN0cmluZyBvdXRwdXQ7Ci0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgaW50IGluZGV4OwotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBnb3QgPSBidWZmZXIucmVhZEFwcGVuZFRvU3RyaW5nKG91dHB1dCwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCBkaXN0W2QyXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBCT09TVF9DSEVDS19FUVVBTChvdXRwdXQsIGRhdGFfc3RyKTsKLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWRfTXVsdGkxICkgewotICBpbml0X2RhdGEoKTsKLQotICAvLyBEbyBzaG9ydGVyIHdyaXRlcyBhbmQgcmVhZHMgc28gd2UgZG9uJ3QgYWxpZ24gdG8gcG93ZXItb2YtdHdvIGJvdW5kYXJpZXMuCi0KLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgewotICAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOwotICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgaW50IGluZGV4OwotCi0gICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDY7IGl0ZXIrKykgewotICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCAoMTw8MTUpLTQyKSB7Ci0gICAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgKDE8PDE1KS00MikgewotICAgICAgICAgIGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QyXVtpbmRleF0pOwotICAgICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07Ci0gICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsICgxPDwxNSktNDIpKTsKLQotICAgICAgICAvLyBQdWxsIG91dCB0aGUgZXh0cmEgZGF0YS4KLSAgICAgICAgYnVmZmVyLnJlYWQoZGF0YV9vdXQsIDQyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWRfTXVsdGkyICkgewotICBpbml0X2RhdGEoKTsKLQotICAvLyBEbyBzaG9ydGVyIHdyaXRlcyBhbmQgcmVhZHMgc28gd2UgZG9uJ3QgYWxpZ24gdG8gcG93ZXItb2YtdHdvIGJvdW5kYXJpZXMuCi0gIC8vIFB1bGwgdGhlIGJ1ZmZlciBvdXQgb2YgdGhlIGxvb3Agc28gaXRzIHN0YXRlIGdldHMgd29ya2VkIGhhcmRlci4KLSAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOwotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGludCBpbmRleDsKLQotICAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCA2OyBpdGVyKyspIHsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgKDE8PDE1KS00MikgewotICAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07Ci0gICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOwotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCAoMTw8MTUpLTQyKSk7Ci0KLSAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGV4dHJhIGRhdGEuCi0gICAgICAgIGJ1ZmZlci5yZWFkKGRhdGFfb3V0LCA0Mik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkX0luY29tcGxldGUgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIC8vIERvIHNob3J0ZXIgd3JpdGVzIGFuZCByZWFkcyBzbyB3ZSBkb24ndCBhbGlnbiB0byBwb3dlci1vZi10d28gYm91bmRhcmllcy4KLSAgLy8gUHVsbCB0aGUgYnVmZmVyIG91dCBvZiB0aGUgbG9vcCBzbyBpdHMgc3RhdGUgZ2V0cyB3b3JrZWQgaGFyZGVyLgotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKLSAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTNdOwotCi0gICAgICBpbnQgd3JpdGVfb2Zmc2V0ID0gMDsKLSAgICAgIGludCB3cml0ZV9pbmRleCA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG9fd3JpdGUgPSAoMTw8MTQpLTQyOwotICAgICAgd2hpbGUgKHRvX3dyaXRlID4gMCkgewotICAgICAgICBpbnQgd3JpdGVfYW10ID0gc3RkOjptaW4oZGlzdFtkMV1bd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7Ci0gICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCB3cml0ZV9hbXQpOwotICAgICAgICB3cml0ZV9vZmZzZXQgKz0gd3JpdGVfYW10OwotICAgICAgICB3cml0ZV9pbmRleCsrOwotICAgICAgICB0b193cml0ZSAtPSB3cml0ZV9hbXQ7Ci0gICAgICB9Ci0KLSAgICAgIGludCByZWFkX29mZnNldCA9IDA7Ci0gICAgICBpbnQgcmVhZF9pbmRleCA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCA9ICgxPDwxMyktNDI7Ci0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApIHsKLSAgICAgICAgaW50IHJlYWRfYW10ID0gc3RkOjptaW4oZGlzdFtkMl1bcmVhZF9pbmRleF0sIHRvX3JlYWQpOwotICAgICAgICBpbnQgZ290ID0gYnVmZmVyLnJlYWQoJmRhdGFfb3V0W3JlYWRfb2Zmc2V0XSwgcmVhZF9hbXQpOwotICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIHJlYWRfYW10KTsKLSAgICAgICAgcmVhZF9vZmZzZXQgKz0gcmVhZF9hbXQ7Ci0gICAgICAgIHJlYWRfaW5kZXgrKzsKLSAgICAgICAgdG9fcmVhZCAtPSByZWFkX2FtdDsKLSAgICAgIH0KLQotICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgKDE8PDEzKS00MikpOwotCi0gICAgICBpbnQgc2Vjb25kX29mZnNldCA9IHdyaXRlX29mZnNldDsKLSAgICAgIGludCBzZWNvbmRfaW5kZXggPSB3cml0ZV9pbmRleC0xOwotICAgICAgdW5zaWduZWQgaW50IHRvX3NlY29uZCA9ICgxPDwxNCkrNDI7Ci0gICAgICB3aGlsZSAodG9fc2Vjb25kID4gMCkgewotICAgICAgICBpbnQgc2Vjb25kX2FtdCA9IHN0ZDo6bWluKGRpc3RbZDFdW3NlY29uZF9pbmRleF0sIHRvX3NlY29uZCk7Ci0gICAgICAgIC8vcHJpbnRmKCIlZFxuIiwgc2Vjb25kX2FtdCk7Ci0gICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtzZWNvbmRfb2Zmc2V0XSwgc2Vjb25kX2FtdCk7Ci0gICAgICAgIHNlY29uZF9vZmZzZXQgKz0gc2Vjb25kX2FtdDsKLSAgICAgICAgc2Vjb25kX2luZGV4Kys7Ci0gICAgICAgIHRvX3NlY29uZCAtPSBzZWNvbmRfYW10OwotICAgICAgfQotCi0gICAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ci5zdWJzdHIoKDE8PDEzKS00MiksIG91dHB1dCk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0J1ZmZlcmVkVHJhbnNwb3J0X1dyaXRlICkgewotICBpbml0X2RhdGEoKTsKLQotICBpbnQgc2l6ZXNbXSA9IHsKLSAgICAxMiwgMTUsIDE2LCAxNywgMjAsCi0gICAgNTAxLCA1MTIsIDUyMywKLSAgICAyMDAwLCAyMDQ4LCAyMDk2LAotICAgIDE8PDE0LCAxPDwxNywKLSAgfTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgewotICAgIGludCBzaXplID0gc2l6ZXNbaV07Ci0gICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7Ci0gICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLQotICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICB9Ci0gICAgICB0cmFucy5mbHVzaCgpOwotCi0gICAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOwotICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIsIG91dHB1dCk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0J1ZmZlcmVkVHJhbnNwb3J0X1JlYWRfRnVsbCApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgaW50IHNpemVzW10gPSB7Ci0gICAgMTIsIDE1LCAxNiwgMTcsIDIwLAotICAgIDUwMSwgNTEyLCA1MjMsCi0gICAgMjAwMCwgMjA0OCwgMjA5NiwKLSAgICAxPDwxNCwgMTw8MTcsCi0gIH07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpKTsKLSAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwotICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0KLSAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoICJyZWFkIiBiZWNhdXNlIFRCdWZmZXJlZFRyYW5zcG9ydAotICAgICAgICAvLyBkb2Vzbid0IHRyeSBsb29wIG92ZXIgcmVhZHMsIHNvIHdlIGdldCBzaG9ydCByZWFkcy4gIFdlIGRvbid0Ci0gICAgICAgIC8vIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUsIHNvIHRoYXQgbWVzc2VzIHVzIHVwLgotICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfQnVmZmVyZWRUcmFuc3BvcnRfUmVhZF9TaG9ydCApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgaW50IHNpemVzW10gPSB7Ci0gICAgMTIsIDE1LCAxNiwgMTcsIDIwLAotICAgIDUwMSwgNTEyLCA1MjMsCi0gICAgMjAwMCwgMjA0OCwgMjA5NiwKLSAgICAxPDwxNCwgMTw8MTcsCi0gIH07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFNob3J0UmVhZFRyYW5zcG9ydD4gdHNob3J0KG5ldyBUU2hvcnRSZWFkVHJhbnNwb3J0KGJ1ZmZlciwgMC4xMjUpKTsKLSAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwotICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0KLSAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoICJyZWFkIiBiZWNhdXNlIFRCdWZmZXJlZFRyYW5zcG9ydAotICAgICAgICAvLyBkb2Vzbid0IHRyeSBsb29wIG92ZXIgcmVhZHMsIHNvIHdlIGdldCBzaG9ydCByZWFkcy4gIFdlIGRvbid0Ci0gICAgICAgIC8vIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUsIHNvIHRoYXQgbWVzc2VzIHVzIHVwLgotICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotCi0gICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfRnJhbWVkVHJhbnNwb3J0X1dyaXRlICkgewotICBpbml0X2RhdGEoKTsKLQotICBpbnQgc2l6ZXNbXSA9IHsKLSAgICAxMiwgMTUsIDE2LCAxNywgMjAsCi0gICAgNTAxLCA1MTIsIDUyMywKLSAgICAyMDAwLCAyMDQ4LCAyMDk2LAotICAgIDE8PDE0LCAxPDwxNywKLSAgfTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgewotICAgIGludCBzaXplID0gc2l6ZXNbaV07Ci0gICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7Ci0gICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0KLSAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICB0cmFucy53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgICAgdHJhbnMuZmx1c2goKTsKLQotICAgICAgaW50MzJfdCBmcmFtZV9zaXplID0gLTE7Ci0gICAgICBidWZmZXItPnJlYWQocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmZyYW1lX3NpemUpLCBzaXplb2YoZnJhbWVfc2l6ZSkpOwotICAgICAgZnJhbWVfc2l6ZSA9IChpbnQzMl90KW50b2hsKCh1aW50MzJfdClmcmFtZV9zaXplKTsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZyYW1lX3NpemUsIDE8PDE1KTsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLnNpemUoKSwgKHVuc2lnbmVkIGludClmcmFtZV9zaXplKTsKLSAgICAgIHN0cmluZyBvdXRwdXQgPSBidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ciwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfRnJhbWVkVHJhbnNwb3J0X1JlYWQgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIpOwotICAgIGludDMyX3QgbGVuZ3RoID0gc2l6ZW9mKGRhdGEpOwotICAgIGxlbmd0aCA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdClsZW5ndGgpOwotICAgIGJ1ZmZlci0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmxlbmd0aCksIHNpemVvZihsZW5ndGgpKTsKLSAgICBidWZmZXItPndyaXRlKGRhdGEsIHNpemVvZihkYXRhKSk7Ci0KLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgLy8gVGhpcyBzaG91bGQgd29yayB3aXRoIHJlYWQgYmVjYXVzZSB3ZSBoYXZlIG9uZSBodWdlIGZyYW1lLgotICAgICAgdHJhbnMucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07Ci0gICAgICBpbmRleCsrOwotICAgIH0KLQotICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOwotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9Xcml0ZV9SZWFkICkgewotICBpbml0X2RhdGEoKTsKLQotICBpbnQgc2l6ZXNbXSA9IHsKLSAgICAxMiwgMTUsIDE2LCAxNywgMjAsCi0gICAgNTAxLCA1MTIsIDUyMywKLSAgICAyMDAwLCAyMDQ4LCAyMDk2LAotICAgIDE8PDE0LCAxPDwxNywKLSAgfTsKLQotICBpbnQgcHJvYnNbXSA9IHsgMSwgMiwgNCwgOCwgMTYsIDMyLCB9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7Ci0gICAgaW50IHNpemUgPSBzaXplc1tpXTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemVvZiAocHJvYnMpIC8gc2l6ZW9mIChwcm9ic1swXSk7IGorKykgewotICAgICAgaW50IHByb2IgPSBwcm9ic1tqXTsKLSAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7Ci0gICAgICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmx1c2hfc2l6ZXM7Ci0KLSAgICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7Ci0gICAgICAgIGludCB3cml0ZV9pbmRleCA9IDA7Ci0gICAgICAgIGludCBmbHVzaF9zaXplID0gMDsKLSAgICAgICAgd2hpbGUgKHdyaXRlX29mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbd3JpdGVfb2Zmc2V0XSwgZGlzdFtkMV1bd3JpdGVfaW5kZXhdKTsKLSAgICAgICAgICB3cml0ZV9vZmZzZXQgKz0gZGlzdFtkMV1bd3JpdGVfaW5kZXhdOwotICAgICAgICAgIGZsdXNoX3NpemUgKz0gZGlzdFtkMV1bd3JpdGVfaW5kZXhdOwotICAgICAgICAgIHdyaXRlX2luZGV4Kys7Ci0gICAgICAgICAgaWYgKGZsdXNoX3NpemUgPiAwICYmIHJhbmQoKSVwcm9iID09IDApIHsKLSAgICAgICAgICAgIGZsdXNoX3NpemVzLnB1c2hfYmFjayhmbHVzaF9zaXplKTsKLSAgICAgICAgICAgIGZsdXNoX3NpemUgPSAwOwotICAgICAgICAgICAgdHJhbnMuZmx1c2goKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsdXNoX3NpemUgIT0gMCkgewotICAgICAgICAgIGZsdXNoX3NpemVzLnB1c2hfYmFjayhmbHVzaF9zaXplKTsKLSAgICAgICAgICBmbHVzaF9zaXplID0gMDsKLSAgICAgICAgICB0cmFucy5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlYWRfb2Zmc2V0ID0gMDsKLSAgICAgICAgaW50IHJlYWRfaW5kZXggPSAwOwotCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmx1c2hfc2l6ZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICBpbnQgZnNpemUgPSBmbHVzaF9zaXplc1trXTsKLSAgICAgICAgICAvLyBXZSBhcmUgZXhwbG9pdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgVEZyYW1lZFRyYW5zcG9ydC4KLSAgICAgICAgICAvLyBUaGUgcmVhZCBidWZmZXIgc3RhcnRzIGVtcHR5IGFuZCBpdCB3aWxsIG5ldmVyIGRvIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgICAvLyByZWFkRnJhbWUgcGVyIHJlYWQsIHNvIHdlIHNob3VsZCBhbHdheXMgZ2V0IGV4YWN0bHkgb25lIGZyYW1lLgotICAgICAgICAgIGludCBnb3QgPSB0cmFucy5yZWFkKCZkYXRhX291dFtyZWFkX29mZnNldF0sIDE8PDE1KTsKLSAgICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGZzaXplKTsKLSAgICAgICAgICByZWFkX29mZnNldCArPSBnb3Q7Ci0gICAgICAgICAgcmVhZF9pbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHVuc2lnbmVkIGludClyZWFkX29mZnNldCwgc2l6ZW9mKGRhdGEpKTsKLSAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9FbXB0eV9GbHVzaCApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgc3RyaW5nIG91dHB1dDEoIlx4MDBceDAwXHgwMFx4MDEiImEiLCA1KTsKLSAgc3RyaW5nIG91dHB1dDIoIlx4MDBceDAwXHgwMFx4MDEiImFceDAwXHgwMFx4MDBceDAyIiJiYyIsIDExKTsKLQotICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIpOwotCi0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgIiIpOwotICB0cmFucy5mbHVzaCgpOwotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7Ci0gIHRyYW5zLndyaXRlKChjb25zdCB1aW50OF90KikiYSIsIDEpOwotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKLSAgdHJhbnMud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYyIsIDIpOwotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDEpOwotICB0cmFucy5mbHVzaCgpOwotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDIpOwotICB0cmFucy5mbHVzaCgpOwotICB0cmFucy5mbHVzaCgpOwotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7CmRpZmYgLS1naXQgYS90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwIGIvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjNTM4ZS4uMDAwMDAwMAotLS0gYS90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKLQotY2xhc3MgRHVtbXlFeGNlcHRpb24gOiBzdGQ6OmV4Y2VwdGlvbiB7Ci19OwotCi1pbnQgbWFpbigpIHsKLSAgewotICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpOT19DTE9TRV9PTl9ERVNUUk9ZKTsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgIH0KLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgICAgdGhyb3cgRHVtbXlFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgc3RkOjphYm9ydCgpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgIGFib3J0KCk7Ci0gIH0gY2F0Y2ggKER1bW15RXhjZXB0aW9uJikgewotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIGIvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzE5ZjguLjAwMDAwMDAKLS0tIGEvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEUoIFRNZW1vcnlCdWZmZXJUZXN0ICk7Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X3JvdW5kdHJpcCApIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwotICAgIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIpKTsKLQotICAgIHRocmlmdDo6dGVzdDo6WHRydWN0IGE7Ci0gICAgYS5pMzJfdGhpbmcgPSAxMDsKLSAgICBhLmk2NF90aGluZyA9IDMwOwotICAgIGEuc3RyaW5nX3RoaW5nID0iaG9sbGEgYmFjayBhIjsKLQotICAgIGEud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7Ci0gICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IHN0ckJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKLQotICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyMihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbDIobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIyKSk7Ci0KLSAgICBzdHJCdWZmZXIyLT5yZXNldEJ1ZmZlcigodWludDhfdCopc2VyaWFsaXplZC5kYXRhKCksIHNlcmlhbGl6ZWQubGVuZ3RoKCkpOwotICAgIHRocmlmdDo6dGVzdDo6WHRydWN0IGEyOwotICAgIGEyLnJlYWQoYmluYXJ5UHJvdGNvbDIuZ2V0KCkpOwotCi0gICAgYXNzZXJ0KGEgPT0gYTIpOwotICB9Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X2NvcHkgKQotICB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBzdGQ6OnN0cmluZzsKLSAgICB1c2luZyBzdGQ6OmNvdXQ7Ci0gICAgdXNpbmcgc3RkOjplbmRsOwotCi0gICAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKLSAgICBjb25zdCBjaGFyKiBkYXRhMSA9IHN0cjEtPmRhdGEoKTsKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLCBzdHIxLT5sZW5ndGgoKSwgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgZGVsZXRlIHN0cjE7Ci0gICAgc3RyaW5nKiBzdHIyID0gbmV3IHN0cmluZygicGxzcmV1c2UiKTsKLSAgICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICAgIGJvb2wgZGF0X3JldXNlID0gKGRhdGExID09IHN0cjItPmRhdGEoKSk7Ci0gICAgY291dCA8PCAiT2JqZWN0IHJldXNlOiAiIDw8IG9ial9yZXVzZSA8PCAiICAgRGF0YSByZXVzZTogIiA8PCBkYXRfcmV1c2UKLSAgICAgIDw8ICgob2JqX3JldXNlICYmIGRhdF9yZXVzZSkgPyAiICAgWUFZISIgOiAiIikgPDwgZW5kbDsKLSAgICBkZWxldGUgc3RyMjsKLQotICAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwotICAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7Ci0gICAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKLQotICAgIGFzc2VydChzdHIzID09ICJ3eHl6YWJjZCIpOwotICAgIGFzc2VydChzdHI0ID09ICI2Nzg5MTIzNCIpOwotICB9Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X2V4Y2VwdGlvbnMgKQotICB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICAgIHVzaW5nIHN0ZDo6c3RyaW5nOwotCi0gICAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOwotCi0gICAgVE1lbW9yeUJ1ZmZlciBidWYxKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpPQlNFUlZFKTsKLSAgICBzdHJpbmcgc3RyID0gYnVmMS5nZXRCdWZmZXJBc1N0cmluZygpOwotICAgIGFzc2VydChzdHIubGVuZ3RoKCkgPT0gNyk7Ci0gICAgYnVmMS5yZXNldEJ1ZmZlcigpOwotICAgIHRyeSB7Ci0gICAgICBidWYxLndyaXRlKChjb25zdCB1aW50OF90KikiZm9vIiwgMyk7Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7fQotCi0gICAgVE1lbW9yeUJ1ZmZlciBidWYyKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKLSAgICB0cnkgewotICAgICAgYnVmMi53cml0ZSgoY29uc3QgdWludDhfdCopImJhciIsIDMpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgIH0KLSAgfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7CmRpZmYgLS1naXQgYS90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwIGIvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwOGZkMi4uMDAwMDAwMAotLS0gYS90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0KLWludCBtYWluKCkgewotICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHVuZGVybHlpbmcobmV3IFRNZW1vcnlCdWZmZXIpOwotICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHBpcGUobmV3IFRNZW1vcnlCdWZmZXIpOwotICBzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7Ci0KLSAgdWludDhfdCBidWZmZXJbNF07Ci0KLSAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJhYmNkIiwgNCk7Ci0gIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7Ci0gIGFzc2VydCggc3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJhYiIgKTsKLSAgdHJhbnMtPnJlYWRFbmQoKTsKLSAgYXNzZXJ0KCBwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJhYiIgKTsKLSAgcGlwZS0+cmVzZXRCdWZmZXIoKTsKLSAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJlZiIsIDIpOwotICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOwotICBhc3NlcnQoIHN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiY2QiICk7Ci0gIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7Ci0gIGFzc2VydCggc3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJlZiIgKTsKLSAgdHJhbnMtPnJlYWRFbmQoKTsKLSAgYXNzZXJ0KCBwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJjZGVmIiApOwotCi0gIHJldHVybiAwOwotCi19CmRpZmYgLS1naXQgYS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAppbmRleCA5MTliNjhmLi4zNDk5YWI1IDEwMDY0NAotLS0gYS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKQEAgLTIxLDEyICsyMSwzMCBAQAogICogZGV0YWlscy4KICAqLwogCituYW1lc3BhY2UgY19nbGliIFRUZXN0CiBuYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAogbmFtZXNwYWNlIHJiIFRocmlmdC5UZXN0CiBuYW1lc3BhY2UgcGVybCBUaHJpZnRUZXN0CiBuYW1lc3BhY2UgY3NoYXJwIFRocmlmdC5UZXN0CiBuYW1lc3BhY2UganMgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHN0IFRocmlmdFRlc3QKK25hbWVzcGFjZSBweSBUaHJpZnRUZXN0CituYW1lc3BhY2UgcHkudHdpc3RlZCBUaHJpZnRUZXN0CituYW1lc3BhY2UgZ28gdGhyaWZ0dGVzdAorbmFtZXNwYWNlIHBocCBUaHJpZnRUZXN0CituYW1lc3BhY2UgZGVscGhpIFRocmlmdC5UZXN0CituYW1lc3BhY2UgY29jb2EgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGx1YSBUaHJpZnRUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvVGhyaWZ0VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRUZXN0CisKKy8vIFByZXNlbmNlIG9mIG5hbWVzcGFjZXMgYW5kIHN1Yi1uYW1lc3BhY2VzIGZvciB3aGljaCB0aGVyZSBpcworLy8gbm8gZ2VuZXJhdG9yIHNob3VsZCBjb21waWxlIHdpdGggd2FybmluZ3Mgb25seQorbmFtZXNwYWNlIG5vZXhpc3QgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGNwcC5ub2V4aXN0IFRocmlmdFRlc3QKKworbmFtZXNwYWNlICogdGhyaWZ0LnRlc3QKIAogLyoqCiAgKiBEb2NzdHJpbmchCkBAIC00MSw2ICs1OSwxMCBAQAogICBFSUdIVCA9IDgKIH0KIAorY29uc3QgTnVtYmVyeiBteU51bWJlcnogPSBOdW1iZXJ6Lk9ORTsKKy8vIHRoZSBmb2xsb3dpbmcgaXMgZXhwZWN0ZWQgdG8gZmFpbDoKKy8vIGNvbnN0IE51bWJlcnogdXJOdW1iZXJ6ID0gT05FOworCiB0eXBlZGVmIGk2NCBVc2VySWQKIAogc3RydWN0IEJvbmsKQEAgLTQ5LDYgKzcxLDggQEAKICAgMjogaTMyIHR5cGUKIH0KIAordHlwZWRlZiBtYXA8c3RyaW5nLEJvbms+IE1hcFR5cGUKKwogc3RydWN0IEJvb2xzIHsKICAgMTogYm9vbCBpbV90cnVlLAogICAyOiBib29sIGltX2ZhbHNlLApAQCAtNTcsMTQgKzgxLDE0IEBACiBzdHJ1Y3QgWHRydWN0CiB7CiAgIDE6ICBzdHJpbmcgc3RyaW5nX3RoaW5nLAotICA0OiAgYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDQ6ICBpOCAgICAgYnl0ZV90aGluZywKICAgOTogIGkzMiAgICBpMzJfdGhpbmcsCiAgIDExOiBpNjQgICAgaTY0X3RoaW5nCiB9CiAKIHN0cnVjdCBYdHJ1Y3QyCiB7Ci0gIDE6IGJ5dGUgICBieXRlX3RoaW5nLAorICAxOiBpOCAgICAgYnl0ZV90aGluZywgIC8vIHVzZWQgdG8gYmUgYnl0ZSwgaGVuY2UgdGhlIG5hbWUKICAgMjogWHRydWN0IHN0cnVjdF90aGluZywKICAgMzogaTMyICAgIGkzMl90aGluZwogfQpAQCAtODIsMTIgKzEwNiwyMiBAQAogewogICAxOiBtYXA8TnVtYmVyeiwgVXNlcklkPiB1c2VyTWFwLAogICAyOiBsaXN0PFh0cnVjdD4geHRydWN0cwotfQorfSAocHl0aG9uLmltbXV0YWJsZT0gIiIpCiAKIHN0cnVjdCBDcmF6eU5lc3RpbmcgewogICAxOiBzdHJpbmcgc3RyaW5nX2ZpZWxkLAogICAyOiBvcHRpb25hbCBzZXQ8SW5zYW5pdHk+IHNldF9maWVsZCwKLSAgMzogcmVxdWlyZWQgbGlzdDwgbWFwPHNldDxpMzI+LG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4+Pj4+PiBsaXN0X2ZpZWxkCisgIC8vIERvIG5vdCBpbnNlcnQgbGluZSBicmVhayBhcyB0ZXN0L2dvL01ha2VmaWxlLmFtIGlzIHJlbW92aW5nIHRoaXMgbGluZSB3aXRoIHBhdHRlcm4gbWF0Y2gKKyAgMzogcmVxdWlyZWQgbGlzdDxtYXA8c2V0PGkzMj4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+Pj4+IGxpc3RfZmllbGQsCisgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKK30KKwordW5pb24gU29tZVVuaW9uIHsKKyAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gbWFwX3RoaW5nLAorICAyOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAzOiBpMzIgaTMyX3RoaW5nLAorICA0OiBYdHJ1Y3QzIHh0cnVjdF90aGluZywKKyAgNTogSW5zYW5pdHkgaW5zYW5pdHlfdGhpbmcKIH0KIAogZXhjZXB0aW9uIFhjZXB0aW9uIHsKQEAgLTEwOCw0MyArMTQyLDE5MSBAQAogCiBzZXJ2aWNlIFRocmlmdFRlc3QKIHsKKyAgLyoqCisgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KKyAgICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAqLwogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdEJvb2woIiVzIiknIHdoZXJlICclcycgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworICAgKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50CisgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICovCisgIGJvb2wgICAgICAgICB0ZXN0Qm9vbCgxOiBib29sIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCisgICAqLworICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisgICAqLwogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAorICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisgICAqLwogICBpNjQgICAgICAgICAgdGVzdEk2NCgxOiBpNjQgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworICAgKiBAcGFyYW0gZG91YmxlIHRoaW5nIC0gdGhlIGRvdWJsZSB0byBwcmludAorICAgKiBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisgICAqLwogICBkb3VibGUgICAgICAgdGVzdERvdWJsZSgxOiBkb3VibGUgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKyAgICogQHBhcmFtIGJpbmFyeSAgdGhpbmcgLSB0aGUgYmluYXJ5IGRhdGEgdG8gcHJpbnQKKyAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICovCisgIGJpbmFyeSAgICAgICB0ZXN0QmluYXJ5KDE6IGJpbmFyeSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKKyAgICovCiAgIFh0cnVjdCAgICAgICB0ZXN0U3RydWN0KDE6IFh0cnVjdCB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKyAgICogQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAorICAgKiBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKyAgICovCiAgIFh0cnVjdDIgICAgICB0ZXN0TmVzdCgxOiBYdHJ1Y3QyIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKKyAgICogQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworICAgKi8KICAgbWFwPGkzMixpMzI+IHRlc3RNYXAoMTogbWFwPGkzMixpMzI+IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKyAgICovCisgIG1hcDxzdHJpbmcsc3RyaW5nPiB0ZXN0U3RyaW5nTWFwKDE6IG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisgICAqLwogICBzZXQ8aTMyPiAgICAgdGVzdFNldCgxOiBzZXQ8aTMyPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKKyAgICovCiAgIGxpc3Q8aTMyPiAgICB0ZXN0TGlzdCgxOiBsaXN0PGkzMj4gdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKKyAgICogQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorICAgKiBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKyAgICovCiAgIE51bWJlcnogICAgICB0ZXN0RW51bSgxOiBOdW1iZXJ6IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIEBwYXJhbSBVc2VySWQgdGhpbmcgLSB0aGUgVXNlcklkIHRvIHByaW50CisgICAqIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKyAgICovCiAgIFVzZXJJZCAgICAgICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAogCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIGhlbGxvIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgKiAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgKi8KICAgbWFwPGkzMixtYXA8aTMyLGkzMj4+IHRlc3RNYXBNYXAoMTogaTMyIGhlbGxvKSwKIAotICAvKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8gKi8KKyAgLyoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKi8KICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoMTogSW5zYW5pdHkgYXJndW1lbnQpLAogCi0gIC8qIE11bHRpcGxlIHBhcmFtZXRlcnMgKi8KLSAgWHRydWN0IHRlc3RNdWx0aSgxOiBieXRlIGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE11bHRpKCknCisgICAqIEBwYXJhbSBpOCBhcmcwIC0KKyAgICogQHBhcmFtIGkzMiBhcmcxIC0KKyAgICogQHBhcmFtIGk2NCBhcmcyIC0KKyAgICogQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisgICAqIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLQorICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKKyAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKKyAgICovCisgIFh0cnVjdCB0ZXN0TXVsdGkoMTogaTggYXJnMCwgMjogaTMyIGFyZzEsIDM6IGk2NCBhcmcyLCA0OiBtYXA8aTE2LCBzdHJpbmc+IGFyZzMsIDU6IE51bWJlcnogYXJnNCwgNjogVXNlcklkIGFyZzUpLAogCi0gIC8qIEV4Y2VwdGlvbiBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICovCiAgIHZvaWQgdGVzdEV4Y2VwdGlvbigxOiBzdHJpbmcgYXJnKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSksCiAKLSAgLyogTXVsdGlwbGUgZXhjZXB0aW9ucyBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICovCiAgIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oMTogc3RyaW5nIGFyZzAsIDI6IHN0cmluZyBhcmcxKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSwgMjogWGNlcHRpb24yIGVycjIpCiAKLSAgLyogVGVzdCBvbmV3YXkgdm9pZCAqLworICAvKioKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIHNsZWVwICdzZWNvbmRzVG9TbGVlcCcKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKyAgICovCiAgIG9uZXdheSB2b2lkIHRlc3RPbmV3YXkoMTppMzIgc2Vjb25kc1RvU2xlZXApCiB9CiAKIHNlcnZpY2UgU2Vjb25kU2VydmljZQogewotICB2b2lkIGJsYWhCbGFoKCkKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKyAgICovCisgIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZykKIH0KIAogc3RydWN0IFZlcnNpb25pbmdUZXN0VjEgewpAQCAtMTU3LDcgKzMzOSw3IEBACiAgICAgICAgMTogaTMyIGJlZ2luX2luX2JvdGgsCiAKICAgICAgICAyOiBpMzIgbmV3aW50LAotICAgICAgIDM6IGJ5dGUgbmV3Ynl0ZSwKKyAgICAgICAzOiBpOCBuZXdieXRlLAogICAgICAgIDQ6IGkxNiBuZXdzaG9ydCwKICAgICAgICA1OiBpNjQgbmV3bG9uZywKICAgICAgICA2OiBkb3VibGUgbmV3ZG91YmxlCkBAIC0xNzgsMyArMzYwLDUyIEBACiAgICAgICAgMTogbGlzdDxzdHJpbmc+IHN0cmluZ3M7CiAgICAgICAgMjogc3RyaW5nIGhlbGxvOwogfQorCitzdHJ1Y3QgR3Vlc3NQcm90b2NvbFN0cnVjdCB7CisgIDc6IG1hcDxzdHJpbmcsc3RyaW5nPiBtYXBfZmllbGQsCit9CisKK3N0cnVjdCBMYXJnZURlbHRhcyB7CisgIDE6IEJvb2xzIGIxLAorICAxMDogQm9vbHMgYjEwLAorICAxMDA6IEJvb2xzIGIxMDAsCisgIDUwMDogYm9vbCBjaGVja190cnVlLAorICAxMDAwOiBCb29scyBiMTAwMCwKKyAgMTUwMDogYm9vbCBjaGVja19mYWxzZSwKKyAgMjAwMDogVmVyc2lvbmluZ1Rlc3RWMiB2ZXJ0d28yMDAwLAorICAyNTAwOiBzZXQ8c3RyaW5nPiBhX3NldDI1MDAsCisgIDMwMDA6IFZlcnNpb25pbmdUZXN0VjIgdmVydHdvMzAwMCwKKyAgNDAwMDogbGlzdDxpMzI+IGJpZ19udW1iZXJzCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0c0kzMngyIHsKKyAgMTogbGlzdDxsaXN0PGkzMj4+IGludGVnZXJsaXN0Cit9CitzdHJ1Y3QgTmVzdGVkTGlzdHNJMzJ4MyB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PGkzMj4+PiBpbnRlZ2VybGlzdAorfQorc3RydWN0IE5lc3RlZE1peGVkeDIgeworICAxOiBsaXN0PHNldDxpMzI+PiBpbnRfc2V0X2xpc3QKKyAgMjogbWFwPGkzMixzZXQ8c3RyaW5nPj4gbWFwX2ludF9zdHJzZXQKKyAgMzogbGlzdDxtYXA8aTMyLHNldDxzdHJpbmc+Pj4gbWFwX2ludF9zdHJzZXRfbGlzdAorfQorc3RydWN0IExpc3RCb25rcyB7CisgIDE6IGxpc3Q8Qm9uaz4gYm9uaworfQorc3RydWN0IE5lc3RlZExpc3RzQm9uayB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PEJvbms+Pj4gYm9uaworfQorCitzdHJ1Y3QgQm9vbFRlc3QgeworICAxOiBvcHRpb25hbCBib29sIGIgPSB0cnVlOworICAyOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJ0cnVlIjsKK30KKworc3RydWN0IFN0cnVjdEEgeworICAxOiByZXF1aXJlZCBzdHJpbmcgczsKK30KKworc3RydWN0IFN0cnVjdEIgeworICAxOiBvcHRpb25hbCBTdHJ1Y3RBIGFhOworICAyOiByZXF1aXJlZCBTdHJ1Y3RBIGFiOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAgYi90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4ZjI3Ni4uMDAwMDAwMAotLS0gYS90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKLQotI2luY2x1ZGUgPHByb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCi0KLQotbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotYm9vbCBJbnNhbml0eTo6b3BlcmF0b3I8KHRocmlmdDo6dGVzdDo6SW5zYW5pdHkgY29uc3QmIG90aGVyKSBjb25zdCB7Ci0gIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZzsKLSAgcmV0dXJuIFRocmlmdERlYnVnU3RyaW5nKCp0aGlzKSA8IFRocmlmdERlYnVnU3RyaW5nKG90aGVyKTsKLX0KLQotfX0KZGlmZiAtLWdpdCBhL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0IGIvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzNzQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKKwordHlwZWRlZiBpMzIgTXlJbnQzMgordHlwZWRlZiBzdHJpbmcgTXlTdHJpbmc7CisKK3N0cnVjdCBUeXBlZGVmVGVzdFN0cnVjdCB7CisgIDE6IE15SW50MzIgZmllbGRfTXlJbnQzMjsKKyAgMjogTXlTdHJpbmcgZmllbGRfTXlTdHJpbmc7CisgIDM6IGkzMiBmaWVsZF9JbnQzMjsKKyAgNDogc3RyaW5nIGZpZWxkX1N0cmluZzsKK30KKwordHlwZWRlZiBUeXBlZGVmVGVzdFN0cnVjdCBNeVN0cnVjdCwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L1VuaXRUZXN0TWFpbi5jcHAgYi90ZXN0L1VuaXRUZXN0TWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTFlY2UuLjAwMDAwMDAKLS0tIGEvdGVzdC9Vbml0VGVzdE1haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIHRocmlmdAotI2RlZmluZSBCT09TVF9URVNUX0RZTl9MSU5LCi0jZGVmaW5lIEJPT1NUX0FVVE9fVEVTVF9NQUlOCi0jaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CmRpZmYgLS1naXQgYS90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdCBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGM5MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBVbnNhZmVCeXRlcyB7CisgIDE6IGJpbmFyeSBieXRlczsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvWmxpYlRlc3QuY3BwIGIvdGVzdC9abGliVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDNlY2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9abGliVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotdGhyaWZ0IC0tZ2VuIGNwcCBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLWcrKyAtV2FsbCAtZyAtSS4uL2xpYi9jcHAvc3JjIC1JL3Vzci9sb2NhbC9pbmNsdWRlL2Jvb3N0LTFfMzNfMSBcCi0gIFpsaWJUZXN0LmNwcCBcCi0gIC4uL2xpYi9jcHAvLmxpYnMvbGlidGhyaWZ0ei5hIC4uL2xpYi9jcHAvLmxpYnMvbGlidGhyaWZ0LmEgXAotICAtbHogLW8gWmxpYlRlc3QKLS4vWmxpYlRlc3QKLSovCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KLQotCi0vLyBEaXN0cmlidXRpb25zIG9mIHJlYWRzIGFuZCB3cml0ZXMgbWVhbnQgdG8gYXBwcm94aW1hdGUgYSByZWFsIGxvYWQsCi0vLyBtaXhpbmcgdXAgc21hbGwgYW5kIGxhcmdlIHdoaWxlIGFsc28gaGl0dGluZyB2YXJpb3VzIGJvdW5kYXJ5IGNvbmRpdGlvbnMuCi0vLyBHZW5lcmF0ZWQgYnkgUHl0aG9uOiBpbnQocmFuZG9tLmxvZ25vcm12YXJpYXRlKDIuNSwgMSkpCi11bnNpZ25lZCBpbnQgZGlzdFtdWzUwMDBdID0gewotIHsgMTw8MTUgfSwKLQotIHsKLSAgNSwxMyw5LDEsOCw5LDExLDEzLDE4LDQ4LDI0LDEzLDIxLDEzLDUsMTEsMzUsMiw0LDIwLDE3LDcyLDI3LDE0LDE1LDQsNywyNiwKLSAgMTIsMSwxNCw5LDIsMTYsMjksNDEsNywyNCw0LDI3LDE0LDQsMSw0LDI1LDMsNiwzNCwxMCw4LDUwLDIsMTQsMTMsNTUsMjksMywKLSAgNDMsNTMsNDksMTQsNCwxMCwzMiwyNyw0OCwxLDMsMSwxMSw1LDE3LDE2LDUxLDE3LDMwLDE1LDExLDksMiwyLDExLDUyLDEyLDIsCi0gIDEzLDk0LDEsMTksMSwzOCwyLDgsNDMsOCwzMyw3LDMwLDgsMTcsMjIsMiwxNSwxNCwxMiwzNCwyLDEyLDYsMzcsMjksNzQsMywKLSAgMTY1LDE2LDExLDE3LDUsMTQsMywxMCw3LDM3LDExLDI0LDcsMSwzLDEyLDM3LDgsOSwzNCwxNywxMiw4LDIxLDEzLDM3LDEsNCwKLSAgMzAsMTQsNzgsNCwxNSwyLDQwLDM3LDE3LDEyLDM2LDgyLDE0LDQsMSw0LDcsMTcsMTEsMTYsODgsNzcsMiwzLDE1LDMsMzQsMTEsCi0gIDUsNzksMjIsMzQsOCw0LDQsNDAsMjIsMjQsMjgsOSwxMywzLDM0LDI3LDksMTYsMzksMTYsMzksMTMsMiw0LDMsNDEsMjYsMTAsNCwKLSAgMzMsNCw3LDEyLDUsNiwzLDEwLDMwLDgsMjEsMTYsNTgsMTksOSwwLDQ3LDcsMTMsMTEsMTksMTUsNyw1Myw1NywyLDEzLDI4LDIyLAotICAzLDE2LDksMjUsMzMsMTIsNDAsNywxMiw2NCw3LDE0LDI0LDQ0LDksMiwxNCwxMSwyLDU4LDEsMjYsMzAsMTEsOSw1LDI0LDcsOSwKLSAgOTQsMiwxMCwyMSw1LDUsNCw1LDYsMTc5LDksMTgsMiw3LDEzLDMxLDQxLDE3LDQsMzYsMywyMSw2LDI2LDgsMTUsMTgsNDQsMjcsCi0gIDExLDksMjUsNywwLDE0LDIsMTIsMjAsMjMsMTMsMiwxNjMsOSw1LDE1LDY1LDIsMTQsNiw4LDk4LDExLDE1LDE0LDM0LDIsMywxMCwKLSAgMjIsOSw5Miw3LDEwLDMyLDY3LDEzLDMsNCwzNSw4LDIsMSw1LDAsMjYsMzgxLDcsMjcsOCwyLDE2LDkzLDQsMTksNSw4LDI1LDksCi0gIDMxLDE0LDQsMjEsNSwzLDksMjIsNTYsNCwxOCwzLDExLDE4LDYsNCwzLDQwLDEyLDE2LDExMCw4LDM1LDE0LDEsMTgsNDAsOSwxMiwKLSAgMTQsMywxMSw3LDU3LDEzLDE4LDExNiw1MywxOSwyMiw3LDE2LDExLDUsOCwyMSwxNiwxLDc1LDIxLDIwLDEsMjgsMiw2LDEsNywKLSAgMTksMzgsNSw2LDksOSw0LDEsNyw1NSwzNiw2Miw1LDQsNCwyNCwxNSwxLDEyLDM1LDQ4LDIwLDUsMTcsMSw1LDI2LDE1LDQsNTQsCi0gIDEzLDUsNSwxNSw1LDE5LDMyLDI5LDMxLDcsNiw0MCw3LDgwLDExLDE4LDgsMTI4LDQ4LDYsMTIsODQsMTMsNCw3LDIsMTMsOSwxNiwKLSAgMTcsMywyNTQsMSw0LDE4MSw4LDQ0LDcsNiwyNCwyNyw5LDIzLDE0LDM0LDE2LDIyLDI1LDEwLDMsMyw0LDQsMTIsMiwxMiw2LDcsCi0gIDEzLDU4LDEzLDYsMTEsMTksNTMsMTEsNjYsMTgsMTksMTAsNCwxMywyLDUsNDksNTgsMSw2Nyw3LDIxLDY0LDE0LDExLDE0LDgsMywKLSAgMjYsMzMsOTEsMzEsMjAsNyw5LDQyLDM5LDQsMyw1NSwxMSwxMCwwLDcsNCw3NSw4LDEyLDAsMjcsMyw4LDksMCwxMiwxMiwyMywKLSAgMjgsMjMsMjAsNCwxMywzMCwyLDIyLDIwLDE5LDMwLDYsMjIsMiw2LDQsMjQsNywxOSw1NSw4Niw1LDMzLDIsMTYxLDYsNywxLDYyLAotICAxMywzLDcyLDEyLDEyLDksNywxMiwxMCw1LDEwLDI5LDEsNSwyMiwxMywxMyw1LDIsMTIsMyw3LDE0LDE4LDIsMyw0NiwyMSwxNywKLSAgMTUsMTksMywyNyw1LDE2LDQ1LDMxLDEwLDgsMTcsMTgsMTgsMyw3LDI0LDYsNTUsOSwzLDYsMTIsMTAsMTIsOCw5MSw5LDQsNCw0LAotICAyNywyOSwxNiw1LDcsMjIsNDMsMjgsMTEsMTQsOCwxMSwyOCwxMDksNTUsNzEsNDAsMyw4LDIyLDI2LDE1LDQ0LDMsMjUsMjksNSwKLSAgMywzMiwxNywxMiwzLDI5LDI3LDI1LDE1LDExLDgsNDAsMzksMzgsMTcsMyw5LDExLDIsMzIsMTEsNiwyMCw0OCw3NSwyNywzLDcsCi0gIDU0LDEyLDk1LDEyLDcsMjQsMjMsMiwxMyw4LDE1LDE2LDUsMTIsNCwxNyw3LDE5LDg4LDIsNiwxMywxMTUsNDUsMTIsMjEsMiw4NiwKLSAgNzQsOSw3LDUsMTYsMzIsMTYsMiwyMSwxOCw2LDM0LDUsMTgsMjYwLDcsMTIsMTYsNDQsMTksOTIsMzEsNyw4LDIsOSwwLDAsMTUsCi0gIDgsMzgsNCw4LDIwLDE4LDIsODMsMywzLDQsOSw1LDMsMTAsMyw1LDI5LDE1LDcsMTEsOCw0OCwxNywyMywyLDE3LDQsMTEsMjIsCi0gIDIxLDY0LDgsOCw0LDE5LDk1LDAsMTcsMjgsOSwxMSwyMCw3MSw1LDExLDE4LDEyLDEzLDQ1LDQ5LDQsMSwzMywzMiwyMywxMyw1LAotICA1MiwyLDIsMTYsMyw0LDcsMTIsMiwxLDEyLDYsMjQsMSwyMiwxNTUsMjEsMyw0NSw0LDEyLDQ0LDI2LDUsNDAsMzYsOSw5LDgsMjAsCi0gIDM1LDMxLDMsMiwzMiw1MCwxMCw4LDM3LDIsNzUsMzUsMjIsMTUsMTkyLDgsMTEsMjMsMSw0LDI5LDYsOCw4LDUsMTIsMTgsMzIsNCwKLSAgNywxMiwyLDAsMCw5LDUsNDgsMTEsMzUsMywxLDEyMyw2LDI5LDgsMTEsOCwyMyw1MSwxNiw2LDYzLDEyLDIsNSw0LDE0LDIsMTUsCi0gIDcsMTQsMywyLDcsMTcsMzIsOCw4LDEwLDEsMjMsNjIsMiw0OSw2LDQ5LDQ3LDIzLDMsMjAsNywxMSwzOSwxMCwyNCw2LDE1LDUsNSwKLSAgMTEsOCwxNiwzNiw4LDEzLDIwLDMsMTAsNDQsNyw1Miw3LDEwLDM2LDYsMTUsMTAsNSwxMSw0LDE0LDE5LDE3LDEwLDEyLDMsNiwKLSAgMjMsNCwxMyw5NCw3MCw3LDM2LDcsMzgsNywyOCw4LDQsMTUsMywxOSw0LDMzLDM5LDIxLDEwOSw0LDgwLDYsNDAsNCw0MzIsNCw0LAotICA3LDgsMywzMSw4LDI4LDM3LDM0LDEwLDIsMjEsNSwyMiwwLDcsMzYsMTQsMTIsNiwyNCwxLDIxLDUsOSwyLDI5LDIwLDU0LDExMywKLSAgMTMsMzEsMzksMjcsNiwwLDI3LDQsNSwyLDQzLDcsOCw1Nyw4LDYyLDcsOSwxMiwyMiw5MCwzMCw2LDE5LDcsMTAsMjAsNiw1LDU4LAotICAzMiwzMCw0MSw0LDEwLDI1LDEzLDMsOCw3LDEwLDIsOSw2LDE1MSw0NCwxNiwxMiwxNiwyMCw4LDMsMTgsMTEsMTcsNCwxMCw0NSwKLSAgMTUsOCw1NiwzOCw1MiwyNSw0MCwxNCw0LDE3LDE1LDgsMiwxOSw3LDgsMjYsMzAsMiwzLDE4MCw4LDI2LDE3LDM4LDM1LDUsMTYsCi0gIDI4LDUsMTUsNTYsMTMsMTQsMTgsOSwxNSw4MywyNywzLDksNCwxMSw4LDI3LDI3LDQ0LDEwLDEyLDgsMyw0OCwxNCw3LDksNCw0LAotICA4LDQsNSw5LDEyMiw4LDE0LDEyLDE5LDE3LDIxLDQsMjksNjMsMjEsMTcsMTAsMTIsMTgsNDcsMTAsMTAsNTMsNCwxOCwxNiw0LDgsCi0gIDExOCw5LDUsMTIsOSwxMSw5LDMsMTIsMzIsMywyMywyLDE1LDMsMywzMCwzLDE3LDIzNSwxNSwyMiw5LDI5OSwxNCwxNywxLDUsCi0gIDE2LDgsMyw3LDMsMTMsMiw3LDYsNCw4LDY2LDIsMTMsNiwxNSwxNiw0NywzLDM2LDUsNywxMCwyNCwxLDksOSw4LDEzLDE2LDI2LAotICAxMiw3LDI0LDIxLDE4LDQ5LDIzLDM5LDEwLDQxLDQsMTMsNCwyNywxMSwxMiwxMiwxOSw0LDE0Nyw4LDEwLDksNDAsMjEsMiw4MywKLSAgMTAsNSw2LDExLDI1LDksNTAsNTcsNDAsMTIsMTIsMjEsMSwzLDI0LDIzLDksMyw5LDEzLDIsMywxMiw1Nyw4LDExLDEzLDE1LDI2LAotICAxNSwxMCw0NywzNiw0LDI1LDEsNSw4LDUsNCwwLDEyLDQ5LDUsMTksNCw2LDE2LDE0LDYsMTAsNjksMTAsMzMsMjksNyw4LDYxLAotICAxMiw0LDAsMyw3LDYsMywxNiwyOSwyNywzOCw0LDIxLDAsMjQsMywyLDEsMTksMTYsMjIsMiw4LDEzOCwxMSw3LDcsMywxMiwyMiwKLSAgMywxNiw1LDcsMyw1Myw5LDEwLDMyLDE0LDUsNywzLDYsMjIsOSw1OSwyNiw4LDcsNTgsNSwxNiwxMSw1NSw3LDQsMTEsMTQ2LDkxLAotICA4LDEzLDE4LDE0LDYsOCw4LDMxLDI2LDIyLDYsMTEsMzAsMTEsMzAsMTUsMTgsMzEsMyw0OCwxNyw3LDYsNCw5LDIsMjUsMywzNSwKLSAgMTMsMTMsNyw4LDQsMzEsMTAsOCwxMCw0LDMsNDUsMTAsMjMsMiw3LDI1OSwxNywyMSwxMywxNCwzLDI2LDMsOCwyNyw0LDE4LDksCi0gIDY2LDcsMTIsNSw4LDE3LDQsMjMsNTUsNDEsNTEsMiwzMiwyNiw2Niw0LDIxLDE0LDEyLDY1LDE2LDIyLDE3LDUsMTQsMiwyOSwyNCwKLSAgNywzLDM2LDIsNDMsNTMsODYsNSwyOCw0LDU4LDEzLDQ5LDEyMSw2LDIsNzMsMiwxLDQ3LDQsMiwyNywxMCwzNSwyOCwyNywxMCwKLSAgMTcsMTAsNTYsNywxMCwxNCwyOCwyMCwyNCw0MCw3LDQsNywzLDEwLDExLDMyLDYsNiwzLDE1LDExLDU0LDU3MywyLDMsNiwyLDMsCi0gIDE0LDY0LDQsMTYsMTIsMTYsNDIsMTAsMjYsNCw2LDExLDY5LDE4LDI3LDIsMiwxNywyMiw5LDEzLDIyLDExLDYsMSwxNSw0OSwzLAotICAxNCwxCi0gfSwKLQotIHsKLSAgMTEsMTEsMTEsMTUsNDcsMSwzLDEsMjMsNSw4LDE4LDMsMjMsMTUsMjEsMSw3LDE5LDEwLDI2LDEsMTcsMTEsMzEsMjEsNDEsMTgsCi0gIDM0LDQsOSw1OCwxOSwzLDMsMzYsNSwxOCwxMywzLDE0LDQsOSwxMCw0LDE5LDU2LDE1LDMsNSwzLDExLDI3LDksNCwxMCwxMyw0LAotICAxMSw2LDksMiwxOCwzLDEwLDE5LDExLDQsNTMsNCwyLDIsMyw0LDU4LDE2LDMsMCw1LDMwLDIsMTEsOTMsMTAsMiwxNCwxMCw2LDIsCi0gIDExNSwyLDI1LDE2LDIyLDM4LDEwMSw0LDE4LDEzLDIsMTQ1LDUxLDQ1LDE1LDE0LDE1LDEzLDIwLDcsMjQsNSwxMywxNCwzMCw0MCwKLSAgMTAsNCwxMDcsMTIsMjQsMTQsMzksMTIsNiwxMywyMCw3LDcsMTEsNSwxOCwxOCw0NSwyMiw2LDM5LDMsMiwxLDUxLDksMTEsNCwKLSAgMTMsOSwzOCw0NCw4LDExLDksMTUsMTksOSwyMywxNywxNywxNywxMyw5LDksMSwxMCw0LDE4LDYsMiw5LDUsMjcsMzIsNzIsOCwKLSAgMzcsOSw0LDEwLDMwLDE3LDIwLDE1LDE3LDY2LDEwLDQsNzMsMzUsMzcsNiw0LDE2LDExNyw0NSwxMyw0LDc1LDUsMjQsNjUsMTAsCi0gIDQsOSw0LDEzLDQ2LDUsMjYsMjksMTAsNCw0LDUyLDMsMTMsMTgsNjMsNiwxNCw5LDI0LDI3Nyw5LDg4LDIsNDgsMjcsMTIzLDE0LAotICA2MSw3LDUsMTAsOCw3LDkwLDMsMTAsMywzLDQ4LDE3LDEzLDEwLDE4LDMzLDIsMTksMzYsNiwyMSwxLDE2LDEyLDUsNiwyLDE2LAotICAxNSwyOSw4OCwyOCwyLDE1LDYsMTEsNCw2LDExLDMsMyw0LDE4LDksNTMsNSw0LDMsMzMsOCw5LDgsNiw3LDM2LDksNjIsMTQsMiwKLSAgMSwxMCwxLDE2LDcsMzIsNywyMywyMCwxMSwxMCwyMywyLDEsMCw5LDE2LDQwLDIsODEsNSwyMiw4LDUsNCwzNyw1MSwzNywxMCwKLSAgMTksNTcsMTEsMiw5MiwzMSw2LDM5LDEwLDEzLDE2LDgsMjAsNiw5LDMsMTAsMTgsMjUsMjMsMTIsMzAsNiwyLDI2LDcsNjQsMTgsCi0gIDYsMzAsMTIsMTMsMjcsNywxMCw1LDMsMzMsMjQsOTksNCwyMyw0LDEsMjcsNywyNyw0OSw4LDIwLDE2LDMsNCwxMyw5LDIyLDY3LAotICAyOCwzLDEwLDE2LDMsMiwxMCw0LDgsMSw4LDE5LDMsODUsNiwyMSwxLDksMTYsMiwzMCwxMCwzMywxMiw0LDksMywxLDYwLDM4LDYsCi0gIDI0LDMyLDMsMTQsMyw0MCw4LDM0LDExNSw1LDksMjcsNSw5NiwzLDQwLDYsMTUsNSw4LDIyLDExMiw1LDUsMjUsMTcsNTgsMiw3LAotICAzNiwyMSw1MiwxLDMsOTUsMTIsMjEsNCwxMSw4LDU5LDI0LDUsMjEsNCw5LDE1LDgsNywyMSwzLDI2LDUsMTEsNiw3LDE3LDY1LAotICAxNCwxMSwxMCwyLDE3LDUsMTIsMjIsNCw0LDIsMjEsOCwxMTIsMywzNCw2MywzNSwyLDI1LDEsMiwxNSw2NSwyMywwLDMsNSwxNSwKLSAgMjYsMjcsOSw1LDQ4LDExLDE1LDQsOSw1LDMzLDIwLDE1LDEsMTgsMTksMTEsMjQsNDAsMTAsMjEsNzQsNiw2LDMyLDMwLDQwLDUsCi0gIDQsNyw0NCwxMCwyNSw0NiwxNiwxMiw1LDQwLDcsMTgsNSwxOCw5LDEyLDgsNCwyNSw1LDYsMzYsNCw0Myw4LDksMTIsMzUsMTcsNCwKLSAgOCw5LDExLDI3LDUsMTAsMTcsNDAsOCwxMiw0LDE4LDksMTgsMTIsMjAsMjUsMzksNDIsMSwyNCwxMywyMiwxNSw3LDExMiwzNSwzLAotICA3LDE3LDMzLDIsNSw1LDE5LDgsNCwxMiwyNCwxNCwxMywyLDEsMTMsNiw1LDE5LDExLDcsNTcsMCwxOSw2LDExNyw0OCwxNCw4LAotICAxMCw1MSwxNywxMiwxNCwyLDUsOCw5LDE1LDQsNDgsNTMsMTMsMjIsNCwyNSwxMiwxMSwxOSw0NSw1LDIsNiw1NCwyMiw5LDE1LDksCi0gIDEzLDIsNywxMSwyOSw4MiwxNiw0Niw0LDI2LDE0LDI2LDQwLDIyLDQsMjYsNiwxOCwxMyw0LDQsMjAsMywzLDcsMTIsMTcsOCw5LAotICAyMyw2LDIwLDcsMjUsMjMsMTksNSwxNSw2LDIzLDE1LDExLDE5LDExLDMsMTcsNTksOCwxOCw0MSw0LDU0LDIzLDQ0LDc1LDEzLAotICAyMCw2LDExLDIsMywxLDEzLDEwLDMsNywxMiwzLDQsNyw4LDMwLDYsNiw3LDMsMzIsOSw1LDI4LDYsMTE0LDQyLDEzLDM2LDI3LAotICA1OSw2LDkzLDEzLDc0LDgsNjksMTQwLDMsMSwxNyw0OCwxMDUsNiwxMSw1LDE1LDEsMTAsMTAsMTQsOCw1MywwLDgsMjQsNjAsMiwKLSAgNiwzNSwyLDEyLDMyLDQ3LDE2LDE3LDc1LDIsNSw0LDM3LDI4LDEwLDUsOSw1Nyw0LDU5LDUsMTIsMTMsNyw5MCw1LDExLDUsMjQsCi0gIDIyLDEzLDMwLDEsMiwxMCw5LDYsMTksMywxOCw0NywyLDUsNyw5LDM1LDE1LDMsNiwxLDIxLDE0LDE0LDE4LDE0LDksMTIsOCw3MywKLSAgNiwxOSwzLDMyLDksMTQsMTcsMTcsNSw1NSwyMyw2LDE2LDI4LDMsMTEsNDgsNCw2LDYsNiwxMiwxNiwzMCwxMCwzMCwyNyw1MSwKLSAgMTgsMjksMiwzLDE1LDEsNzYsMCwxNiwzMyw0LDI3LDMsNjIsNCwxMCwyLDQsOCwxNSw5LDQxLDI2LDIyLDIsNCwyMCw0LDQ5LDAsCi0gIDgsMSw1NywxMywxMiwzOSwzLDYzLDEwLDE5LDM0LDM1LDIsNyw4LDI5LDcyLDQsMTAsMCw3Nyw4LDYsNyw5LDE1LDIxLDksNCwxLAotICAyMCwyMywxLDksMTgsOSwxNSwzNiw0LDcsNiwxNSw1LDcsNyw0MCwyLDksMjIsMiwzLDIwLDQsMTIsMzQsMTMsNiwxOCwxNSwxLAotICAzOCwyMCwxMiw3LDE2LDMsMTksODUsMTIsMTYsMTgsMTYsMiwxNywxLDEzLDgsNiwxMiwxNSw5NywxNywxMiw5LDMsMjEsMTUsMTIsCi0gIDIzLDQ0LDgxLDI2LDMwLDIsNSwxNyw2LDYsMCwyMiw0MiwxOSw2LDE5LDQxLDE0LDM2LDcsMyw1Niw3LDksMywyLDYsOSw2OSwzLAotICAxNSw0LDMwLDI4LDI5LDcsOSwxNSwxNywxNyw2LDEsNiwxNTMsOSwzMyw1LDEyLDE0LDE2LDI4LDMsOCw3LDE0LDEyLDQsNiwzNiwKLSAgOSwyNCwxMywxMyw0LDIsOSwxNSwxOSw5LDUzLDcsMTMsNCwxNTAsMTcsOSwyLDYsMTIsNywzLDUsNTgsMTksNTgsMjgsOCwxNCwzLAotICAyMCwzLDAsMzIsNTYsNyw1LDQsMjcsMSw2OCw0LDI5LDEzLDUsNTgsMiw5LDY1LDQxLDI3LDE2LDE1LDEyLDE0LDIsMTAsOSwyNCwKLSAgMywyLDksMiwyLDMsMTQsMzIsMTAsMjIsMywxMywxMSw0LDYsMzksMTcsMCwxMCw1LDUsMTAsMzUsMTYsMTksMTQsMSw4LDYzLDE5LAotICAxNCw4LDU2LDEwLDIsMTIsNiwxMiw2LDcsMTYsMiw5LDksMTIsMjAsNzMsMjUsMTMsMjEsMTcsMjQsNSwzMiw4LDEyLDI1LDgsMTQsCi0gIDE2LDUsMjMsMyw3LDYsMywxMSwyNCw2LDMwLDQsMjEsMTMsMjgsNCw2LDI5LDE1LDUsMTcsNiwyNiw4LDE1LDgsMyw3LDcsNTAsCi0gIDExLDMwLDYsMiwyOCw1NiwxNiwyNCwyNSwyMywyNCw4OSwzMSwzMSwxMiw3LDIyLDQsMTAsMTcsMywzLDgsMTEsMTMsNSwzLDI3LAotICAxLDEyLDEsMTQsOCwxMCwyOSwyLDUsMiwyLDIwLDEwLDAsMzEsMTAsMjEsMSw0OCwzLDUsNDMsNCw1LDE4LDEzLDUsMTgsMjUsMzQsCi0gIDE4LDMsNSwyMiwxNiwzLDQsMjAsMyw5LDMsMjUsNiw2LDQ0LDIxLDMsMTIsNyw1LDQyLDMsMiwxNCw0LDM2LDUsMyw0NSw1MSwxNSwKLSAgOSwxMSwyOCw5LDcsNiw2LDEyLDI2LDUsMTQsMTAsMTEsNDIsNTUsMTMsMjEsNCwyOCw2LDcsMjMsMjcsMTEsMSw0MSwzNiwwLDMyLAotICAxNSwyNiwyLDMsMjMsMzIsMTEsMiwxNSw3LDI5LDI2LDE0NCwzMywyMCwxMiw3LDIxLDEwLDcsMTEsNjUsNDYsMTAsMTMsMjAsMzIsCi0gIDQsNCw1LDE5LDIsMTksMTUsNDksNDEsMSw3NSwxMCwxMSwyNSwxLDIsNDUsMTEsOCwyNywxOCwxMCw2MCwyOCwyOSwxMiwzMCwxOSwKLSAgMTYsNCwyNCwxMSwxOSwyNywxNyw0OSwxOCw3LDQwLDEzLDE5LDIyLDgsNTUsMTIsMTEsMyw2LDUsMTEsOCwxMCwyMiw1LDksOSwKLSAgMjUsNywxNyw3LDY0LDEsMjQsMiwxMiwxNyw0NCw0LDEyLDI3LDIxLDExLDEwLDcsNDcsNSw5LDEzLDEyLDM4LDI3LDIxLDcsMjksCi0gIDcsMSwxNywzLDMsNSw0OCw2MiwxMCwzLDExLDE3LDE1LDE1LDYsMyw4LDEwLDgsMTgsMTksMTMsMyw5LDcsNiw0NCw5LDEwLDQsCi0gIDQzLDgsNiw2LDE0LDIwLDM4LDI0LDIsNCw1LDUsNyw1LDksMzksOCw0NCw0MCw5LDE5LDcsMywxNSwyNSwyLDM3LDE4LDE1LDksNSwKLSAgOCwzMiwxMCw1LDE4LDQsNyw0NiwyMCwxNywyMyw0LDExLDE2LDE4LDMxLDExLDMsMTEsMSwxNCwxLDI1LDQsMjcsMTMsMTMsMzksCi0gIDE0LDYsNiwzNSw2LDE2LDEzLDExLDEyMiwyMSwxNSwyMCwyNCwxMCw1LDE1MiwxNSwzOSw1LDIwLDE2LDksMTQsNyw1Myw2LDMsOCwKLSAgMTksNjMsMzIsNiwyLDMsMjAsMSwxOSw1LDEzLDQyLDE1LDQsNiw2OCwzMSw0NiwxMSwzOCwxMCwyNCw1LDUsOCw5LDEyLDMsMzUsCi0gIDQ2LDI2LDE2LDIsOCw0LDc0LDE2LDQ0LDQsNSwxLDE2LDQsMTQsMjMsMTYsNjksMTUsNDIsMzEsMTQsNyw3LDYsOTcsMTQsNDAsMSwKLSAgOCw3LDM0LDksMzksMTksMTMsMTUsMTAsMjEsMTgsMTAsNSwxNSwzOCw3LDUsMTIsNywyMCwxNSw0LDExLDYsMTQsNSwxNyw3LDM5LAotICAzNSwzNiwxOCwyMCwyNiwyMiw0LDIsMzYsMjEsNjQsMCw1LDksMTAsNiw0LDEsNywzLDEsMywzLDQsMTAsMjAsOTAsMiwyMiw0OCwKLSAgMTYsMjMsMiwzMyw0MCwxLDIxLDIxLDE3LDIwLDgsOCwxMiw0LDgzLDE0LDQ4LDQsMjEsMyw5LDI3LDUsMTEsNDAsMTUsOSwzLDE2LAotICAxNyw5LDExLDQsMjQsMzEsMTcsMyw0LDIsMTEsMSw4LDQsOCw2LDQxLDE3LDQsMTMsMyw3LDE3LDgsMjcsNSwxMyw2LDEwLDcsMTMsCi0gIDEyLDE4LDEzLDYwLDE4LDMsOCwxLDEyLDEyNSwyLDcsMTYsMiwxMSwyLDQsNywyNiw1LDksMTQsMTQsMTYsOCwxNCw3LDE0LDYsOSwKLSAgMTMsOSw2LDQsMjYsMzUsNDksMzYsNTUsMyw5LDYsNDAsMjYsMjMsMzEsMTksNDEsMiwxMCwzMSw2LDU0LDUsNjksMTYsNyw4LDE2LAotICAxLDUsNyw0LDIyLDcsNyw1LDQsNDgsMTEsMTMsMyw5OCw0LDExLDE5LDQsMiwxNCw3LDM0LDcsMTAsMywyLDEyLDcsNiwyLDUsMTE4Ci0gfSwKLX07Ci0KLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KLSAgY2hhciAqZmlsZV9uYW1lc1tdID0gewotICAgIC8vIEhpZ2hseSBjb21wcmVzc2libGUuCi0gICAgIi4vZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAiLAotICAgIC8vIFVuY29tcHJlc3NpYmxlLgotICAgICIvZGV2L3VyYW5kb20iLAotICAgIC8vIE51bGwtdGVybWluYXRlZC4KLSAgICBOVUxMLAotICB9OwotCi0KLSAgZm9yIChjaGFyKiogZm5hbWVwID0gJmZpbGVfbmFtZXNbMF07ICpmbmFtZXAgIT0gTlVMTDsgZm5hbWVwKyspIHsKLSAgICBpZnN0cmVhbSBmaWxlKCpmbmFtZXApOwotICAgIGNoYXIgYnVmWzMyKjEwMjRdOwotICAgIGZpbGUucmVhZChidWYsIHNpemVvZihidWYpKTsKLSAgICB2ZWN0b3I8dWludDhfdD4gY29udGVudChidWYsIGJ1ZitmaWxlLmdjb3VudCgpKTsKLSAgICB2ZWN0b3I8dWludDhfdD4gbWlycm9yOwotICAgIGZpbGUuY2xvc2UoKTsKLQotICAgIGFzc2VydChjb250ZW50LnNpemUoKSA9PSAzMioxMDI0KTsKLQotICAgIC8vIExldCdzIGp1c3Qgc3RhcnQgd2l0aCB0aGUgYmlnIGRvZyEKLSAgICB7Ci0gICAgICBtaXJyb3IuY2xlYXIoKTsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLCBmYWxzZSkpOwotICAgICAgemxpYl90cmFucy0+d3JpdGUoJmNvbnRlbnRbMF0sIGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7Ci0gICAgICBtaXJyb3IucmVzaXplKGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWQoJm1pcnJvclswXSwgbWlycm9yLnNpemUoKSk7Ci0gICAgICBhc3NlcnQoZ290ID09IGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIGFzc2VydChtaXJyb3IgPT0gY29udGVudCk7Ci0gICAgICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwotICAgIH0KLQotICAgIC8vIFRoaXMgb25lIGlzIHRyaWNreS4gIEkgc2VwYXJhdGUgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIG91dAotICAgIC8vIGludG8gYSBzZXBhcmF0ZSBjcmJ1Zl8uICBUaGUgbGFzdCBieXRlIGlzIHBhcnQgb2YgdGhlIGNoZWNrc3VtLAotICAgIC8vIHNvIHRoZSBlbnRpcmUgcmVhZCBnb2VzIGZpbmUsIGJ1dCB3aGVuIEkgZ28gdG8gdmVyaWZ5IHRoZSBjaGVja3N1bQotICAgIC8vIGl0IGlzbid0IHRoZXJlLiAgVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGNvbXBsYWluZWQgdGhhdAotICAgIC8vIHRoZSBzdHJlYW0gd2FzIG5vdCBjb21wbGV0ZS4gIEknbSBhYm91dCB0byBnbyBmaXggdGhhdC4KLSAgICAvLyBJdCB3b3JrZWQuICBBd2Vzb21lLgotICAgIHsKLSAgICAgIG1pcnJvci5jbGVhcigpOwotICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYsIGZhbHNlKSk7Ci0gICAgICB6bGliX3RyYW5zLT53cml0ZSgmY29udGVudFswXSwgY29udGVudC5zaXplKCkpOwotICAgICAgemxpYl90cmFucy0+Zmx1c2goKTsKLSAgICAgIHN0cmluZyB0bXBfYnVmOwotICAgICAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKLSAgICAgIHpsaWJfdHJhbnMucmVzZXQobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwgZmFsc2UsCi0gICAgICAgICAgICBUWmxpYlRyYW5zcG9ydDo6REVGQVVMVF9VUkJVRl9TSVpFLAotICAgICAgICAgICAgdG1wX2J1Zi5sZW5ndGgoKS0xKSk7Ci0gICAgICBtaXJyb3IucmVzaXplKGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWQoJm1pcnJvclswXSwgbWlycm9yLnNpemUoKSk7Ci0gICAgICBhc3NlcnQoZ290ID09IGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIGFzc2VydChtaXJyb3IgPT0gY29udGVudCk7Ci0gICAgICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgdGhhdCAibm90IGNvbXBsZXRlIiBlcnJvciBpZgotICAgIC8vIGl0IHJlYWxseSBpc24ndCBjb21wbGV0ZS4KLSAgICB7Ci0gICAgICBtaXJyb3IuY2xlYXIoKTsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLCBmYWxzZSkpOwotICAgICAgemxpYl90cmFucy0+d3JpdGUoJmNvbnRlbnRbMF0sIGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7Ci0gICAgICBzdHJpbmcgdG1wX2J1ZjsKLSAgICAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7Ci0gICAgICB0bXBfYnVmLmVyYXNlKHRtcF9idWYubGVuZ3RoKCkgLSAxKTsKLSAgICAgIG1lbWJ1Zi0+cmVzZXRGcm9tU3RyaW5nKHRtcF9idWYpOwotICAgICAgbWlycm9yLnJlc2l6ZShjb250ZW50LnNpemUoKSk7Ci0gICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKCZtaXJyb3JbMF0sIG1pcnJvci5zaXplKCkpOwotICAgICAgYXNzZXJ0KGdvdCA9PSBjb250ZW50LnNpemUoKSk7Ci0gICAgICBhc3NlcnQobWlycm9yID09IGNvbnRlbnQpOwotICAgICAgdHJ5IHsKLSAgICAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKLSAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7Ci0gICAgICAgIGFzc2VydChleC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRyeSBpdCB3aXRoIGEgbWl4IG9mIHJlYWQvd3JpdGUgc2l6ZXMuCi0gICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7Ci0gICAgICAgIG1pcnJvci5jbGVhcigpOwotICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgICAgICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLCBmYWxzZSkpOwotICAgICAgICBpbnQgaWR4OwotICAgICAgICB1bnNpZ25lZCBpbnQgdG90OwotCi0gICAgICAgIGlkeCA9IDA7Ci0gICAgICAgIHRvdCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3QgPCBjb250ZW50LnNpemUoKSkgewotICAgICAgICAgIHpsaWJfdHJhbnMtPndyaXRlKCZjb250ZW50W3RvdF0sIGRpc3RbZDFdW2lkeF0pOwotICAgICAgICAgIHRvdCArPSBkaXN0W2QxXVtpZHhdOwotICAgICAgICAgIGlkeCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgemxpYl90cmFucy0+Zmx1c2goKTsKLSAgICAgICAgbWlycm9yLnJlc2l6ZShjb250ZW50LnNpemUoKSk7Ci0KLSAgICAgICAgaWR4ID0gMDsKLSAgICAgICAgdG90ID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdCA8IG1pcnJvci5zaXplKCkpIHsKLSAgICAgICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKCZtaXJyb3JbdG90XSwgZGlzdFtkMl1baWR4XSk7Ci0gICAgICAgICAgYXNzZXJ0KGdvdCA9PSBkaXN0W2QyXVtpZHhdKTsKLSAgICAgICAgICB0b3QgKz0gZGlzdFtkMl1baWR4XTsKLSAgICAgICAgICBpZHgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydChtaXJyb3IgPT0gY29udGVudCk7Ci0gICAgICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVmVyaWZ5IGNoZWNrc3VtIGNoZWNraW5nLgotICAgIHsKLSAgICAgIG1pcnJvci5jbGVhcigpOwotICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYsIGZhbHNlKSk7Ci0gICAgICB6bGliX3RyYW5zLT53cml0ZSgmY29udGVudFswXSwgY29udGVudC5zaXplKCkpOwotICAgICAgemxpYl90cmFucy0+Zmx1c2goKTsKLSAgICAgIHN0cmluZyB0bXBfYnVmOwotICAgICAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKLSAgICAgIHRtcF9idWZbNTddKys7Ci0gICAgICBtZW1idWYtPnJlc2V0RnJvbVN0cmluZyh0bXBfYnVmKTsKLSAgICAgIG1pcnJvci5yZXNpemUoY29udGVudC5zaXplKCkpOwotICAgICAgdHJ5IHsKLSAgICAgICAgemxpYl90cmFucy0+cmVhZCgmbWlycm9yWzBdLCBtaXJyb3Iuc2l6ZSgpKTsKLSAgICAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKLSAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIH0gY2F0Y2ggKFRabGliVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgICAgICBhc3NlcnQoZXguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvUkVBRE1FLm1kIGIvdGVzdC9hdWRpdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyZjhkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDAgQEAKK1R5cGljYWwgdXNhZ2UKKz09PT09PT09PT09PT0KK2BgYAordGhyaWZ0LmV4ZSAtLWF1ZGl0IDxvbGRGaWxlPiA8bmV3RmlsZT4KK2BgYAorRXhhbXBsZSBydW4KKz09PT09PT09PT09CitgYGAKKz4gdGhyaWZ0LmV4ZSAtLWF1ZGl0IHRlc3QudGhyaWZ0IGJyZWFrMS50aHJpZnQKK1tUaHJpZnQgQXVkaXQgRmFpbHVyZTpicmVhazEudGhyaWZ0XSBOZXcgVGhyaWZ0IEZpbGUgaGFzIG1pc3NpbmcgZnVuY3Rpb24gYmFzZV9mdW5jdGlvbjMKK1tUaHJpZnQgQXVkaXQgV2FybmluZzpicmVhazEudGhyaWZ0XSBDb25zdGFudCBjb25zdDMgaGFzIGRpZmZlcmVudCB2YWx1ZQorYGBgCisKK1Byb2JsZW1zIHRoYXQgdGhlIGF1ZGl0IHRvb2wgY2FuIGNhdGNoCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRXJyb3JzCisqIFJlbW92aW5nIGFuIGVudW0gdmFsdWUKKyogQ2hhbmdpbmcgdGhlIHR5cGUgb2YgYSBzdHJ1Y3QgZmllbGQKKyogQ2hhbmdpbmcgdGhlIHJlcXVpcmVkLW5lc3Mgb2YgYSBzdHJ1Y3QgZmllbGQKKyogUmVtb3ZpbmcgYSBzdHJ1Y3QgZmllbGQKKyogQWRkaW5nIGEgcmVxdWlyZWQgc3RydWN0IGZpZWxkCisqIEFkZGluZyBhIHN0cnVjdCBmaWVsZCAnaW4gdGhlIG1pZGRsZScuICBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGFuIG9sZCBJRCBoYXMgYmVlbiByZWN5Y2xlZAorKiBTdHJ1Y3QgcmVtb3ZlZAorKiBPbmV3YXktbmVzcyBjaGFuZ2UKKyogUmV0dXJuIHR5cGUgY2hhbmdlCisqIE1pc3NpbmcgZnVuY3Rpb24KKyogTWlzc2luZyBzZXJ2aWNlCisqIENoYW5nZSBpbiBzZXJ2aWNlIGluaGVyaXRhbmNlCisKK1dhcm5pbmdzCisqIFJlbW92aW5nIGEgbGFuZ3VhZ2UgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCisqIENoYW5naW5nIGEgbmFtZXNwYWNlCisqIENoYW5naW5nIGFuIGVudW0gdmFsdWUncyBuYW1lCisqIFJlbW92aW5nIGFuIGVudW0gY2xhc3MKKyogRGVmYXVsdCB2YWx1ZSBjaGFuZ2VkCisqIFN0cnVjdCBmaWVsZCBuYW1lIGNoYW5nZQorKiBSZW1vdmVkIGNvbnN0YW50CisqIFR5cGUgb2YgY29uc3RhbnQgY2hhbmdlZAorKiBWYWx1ZSBvZiBjb25zdGFudCBjaGFuZ2VkCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2Y2NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaHJpZnQgTWV0aG9kIHJlbW92ZWQgZnJvbSBzZXJ2aWNlIGJhc2UuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL2NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMz0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2OTBhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazEwIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QyIGlkID0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTBhN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTEudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxMSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MyBpZCA9NworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1MjJlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZGVyaXZlZDFfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBlbnVtMSB0byBlbnVtMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTIgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk3NWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEzLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cnVjdDEgdG8gc3RydWN0MgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QyIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NkNTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE0LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cmluZyB0byBkb3VibGUgCisKK25hbWVzcGFjZSBjcHAgdGVzdAorLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWY2OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE1LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazE1IC0gZGVyaXZlZDJfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBsaXN0PGkzMj4gdG8gbGlzdDxpMTY+CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkxNj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNmZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhayAxNiAtIGRlcml2ZWQyX2Z1bmN0aW9uNSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IHRvIG1hcDx0ZXN0X2VudW0zLCB0ZXN0X2VudW0yPgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNiMTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE3LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTcgLSBkZXJpdmVkMl9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDxzdHJ1Y3QxLHN0cnVjdDI+IHRvIG1hcDxzdHJ1Y3QxLCBzdHJ1Y3QzPgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDM+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE4LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc4YjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE4LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTgtIG9uZXdheSByZW1vdmVkIGZyb20gYmFzZV9vbmV3YXkKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBiMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE5LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTkgLSBvbmV3YXkgYWRkZWQgdG8gYmFzZV9mdW5jdGlvbjEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgb25ld2F5IHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRmZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMzIgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjAudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTVmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjAudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrIDIwIC0gZmlyc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZGE0MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjEudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMS0gbGFzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDgzNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjIudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMiAtIGluLWJldHdlZW4gZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTVhNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjMudGhyaWZ0CkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMyAtIHJlcXVpcmVkIHN0cnVjdCBmaWVsZCBhZGRlZCB0byBzdHJ1Y3Q0CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyLAorICAgIDM6IHJlcXVpcmVkIGk2NCBzdHJ1Y3Q0X21lbWJlcjMKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDViOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNC50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI0IC0gcmVtb3ZlZCBpbmhlcml0YW5jZSBmcm9tIGRlcml2ZWQxLgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmU5N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjUudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vQ2hhbmdlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgZGVyaXZlZDEgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3NmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI2IC0gRmllbGQgdHlwZSBjaGFuZ2VkIGluIGJhc2VfZnVuY3Rpb24xIGFyZ3VtZW50IGlkPTMKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBkb3VibGUgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NjcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNy50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsyNyAtIGFyZ3VtZW50IGNoYW5nZWQgYmFzZV9mdW5jdGlvbjIgbGlzdDxlbnVtMT4gdG8gbGlzdDxlbnVtMz4gaWQgPTgKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMz4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGU1NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjgudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyOC0gZGVyaXZlZDFfZnVuY3Rpb241IGFyZ3VlbWVudCB0eXBlIGNoYW5nZWQgbWFwPGk2NCwgZG91YmxlPiB0byBsaXN0PGk2ND4KK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyOS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmMzA4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyOS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI5IC0gYmFzZV9mdW5jdGlvbjIgYXJndWVtbnQgdHlwZSBjaGFuZ2VkIGxpc3Q8c3RyaW5nPiB0byBzdHJpbmcKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDk5NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMgLSBTdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoZW51bTEgdG8gZW51bTIpCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTIgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4ZGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWszMC0gZGVyaXZlZDFfZnVuY3Rpb242IGFyZ3VtZW50IGNoYW5nZWQgc3RydWN0MSB0byBtYXA8c3RydWN0MSxzdHJ1Y3QxPgorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsdGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMzgwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMxIC0gRXhjZXB0aW9uIHJlbW92ZWQgdG8gYmFzZV9mdW5jdGlvbjIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2Y4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzIudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszMi0gRXhjZXB0aW9uMSBmaWVsZCB0eXBlIGNoYW5nZWQgZm9yIGlkID0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpNjQgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGJiODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzMudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszMyAtIGRlcml2ZWQxX2Z1bmN0aW9uMSBleGNlcHRpb24gdHlwZSBjaGFuZ2VkLgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMSBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazM0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjkzZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazM0LnRocmlmdApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzQgLSBGaWVsZCBhZGRlZCB0byBzdHJ1Y3Qgd2l0aCBGaWVsZCBJRCBiZWluZyBpbiBiZXR3ZWVuIHR3byBleGlzdGluZyBmaWVsZCBJRHMKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA2OiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gc3RydWN0M19tZW1iZXI2LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyOGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL0ZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBzdHJpbmcpCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID1bMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjMjJkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtZW1iZXIgZmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIGxpc3Q8Ym9vbD4pCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YTMwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QyIChsaXN0PGRvdWJsZT4gdG8gbGlzdDxpMTY+KQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYzJkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrNyAtIHJlcXVpcmVkbmVzcyByZW1vdmVkIGluIHN0cnVjdDYKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs4LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs4LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNhYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs4IC0gcmVxdWlyZWRuZXNzIGFkZGVkZCBpbiBzdHJ1Y3Q1CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs5LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIzMTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs5IC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QxCisKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQgYi90ZXN0L2F1ZGl0L3Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODM0YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwgYi90ZXN0L2F1ZGl0L3RocmlmdF9hdWRpdF90ZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWQ0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3RocmlmdF9hdWRpdF90ZXN0LnBsCkBAIC0wLDAgKzEsMjYxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworI2JyZWFrMSAtIFRocmlmdCBtZXRob2QgcmVtb3ZlZCBmcm9tIHNlcnZpY2UgYmFzZQorI2JyZWFrMiAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShpMTYgdG8gaTMyKQorI2JyZWFrMyAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShlbnVtMSB0byBlbnVtMikKKyNicmVhazQgLSBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gc3RyaW5nKQorI2JyZWFrNS0gbWVtYmVyIGZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBsaXN0PGJvb2w+KQorI2JyZWFrNi0gIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDIgKGxpc3Q8ZG91YmxlPiB0byBsaXN0PGkxNj4pCisjYnJlYWs3IC0gcmVxdWlyZWRuZXNzIHJlbW92ZWQgaW4gc3RydWN0NgorI2JyZWFrOCAtIHJlcXVpcmVkbmVzcyBhZGRlZGQgaW4gc3RydWN0NQorI2JyZWFrOSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MQorI2JyZWFrMTAgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDIgaWQgPSAxCisjYnJlYWsxMSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MyBsYXN0IGlkCisjYnJlYWsxMiAtICBkZXJpdmVkMV9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGVudW0xIHRvIGVudW0yCisjYnJlYWsxMyAtIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RydWN0MSB0byBzdHJ1Y3QyCisjYnJlYWsxNCAtICBkZXJpdmVkMV9mdW5jdGlvbjQgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cmluZyB0byBkb3VibGUgCisjYnJlYWsxNSAtIGRlcml2ZWQyX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbGlzdDxpMzI+IHRvIGxpc3Q8aTE2PgorI2JyZWFrMTYgLSBkZXJpdmVkMl9mdW5jdGlvbjUgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDx0ZXN0X2VudW0xLHRlc3RfZW51bTI+IHRvIG1hcDx0ZXN0X2VudW0zLCB0ZXN0X2VudW0yPgorI2JyZWFrMTcgLSBkZXJpdmVkMl9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDxzdHJ1Y3QxLHN0cnVjdDI+IHRvIG1hcDxzdHJ1Y3QxLCBzdHJ1Y3QzPgorI2JyZWFrMTgtIG9uZXdheSByZW1vdmVkIGZyb20gYmFzZV9vbmV3YXkKKyNicmVhazE5IC0gb25ld2F5IGFkZGVkIHRvIGJhc2VfZnVuY3Rpb24xCisjYnJlYWsyMCAtIGZpcnN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisjYnJlYWsyMS0gbGFzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMgorI2JyZWFrMjIgLSBpbi1iZXR3ZWVuIGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisjYnJlYWsyMyAtIHJlcXVpcmVkIHN0cnVjdCBmaWVsZCBhZGRlZCB0byBzdHJ1Y3Q0CisjYnJlYWsyNCAtIHJlbW92ZWQgaW5oZXJpdGFuY2Ugb2YgZGVyaXZlZDEuCisjYnJlYWsyNSAtIGNoYW5nZWQgaW5oZXJpdGFuY2Ugb2YgZGVyaXZlZDIuCisjYnJlYWsyNiAtIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiBiYXNlX2Z1bmN0aW9uMSBhcmd1bWVudCBpZD0zCisjYnJlYWsyNyAtIGFyZ3VtZW50IGNoYW5nZWQgYmFzZV9mdW5jdGlvbjIgbGlzdDxlbnVtMT4gdG8gbGlzdDxlbnVtMz4gaWQgPTgKKyNicmVhazI4LSBkZXJpdmVkMV9mdW5jdGlvbjUgYXJndWVtZW50IHR5cGUgY2hhbmdlZCBtYXA8aTY0LCBkb3VibGU+IHRvIGxpc3Q8aTY0PgorI2JyZWFrMjkgLSBiYXNlX2Z1bmN0aW9uMiBhcmd1ZW1udCB0eXBlIGNoYW5nZWQgbGlzdDxzdHJpbmc+IHRvIHN0cmluZworI2JyZWFrMzAtIGRlcml2ZWQxX2Z1bmN0aW9uNiBhcmd1bWVudCBjaGFuZ2VkIHN0cnVjdDEgdG8gbWFwPHN0cnVjdDEsc3RydWN0MT4KKyNicmVhazMxIC0gRXhjZXB0aW9uIHJlbW92ZWQgdG8gYmFzZV9mdW5jdGlvbjIKKyNicmVhazMyLSBFeGNlcHRpb24xIGZpZWxkIHR5cGUgY2hhbmdlZCBmb3IgaWQgPTEKKyNicmVhazMzIC0gZGVyaXZlZDFfZnVuY3Rpb24xIGV4Y2VwdGlvbiB0eXBlIGNoYW5nZWQuCisjYnJlYWszNCAtIEZpZWxkIGFkZGVkIHRvIHN0cnVjdCB3aXRoIEZpZWxkIElEIGJlaW5nIGluIGJldHdlZW4gdHdvIGV4aXN0aW5nIGZpZWxkIElEcworCisjd2FybmluZy50aHJpZnQKKyNDaGFuZ2luZyBkZWZhdWx0cworI0lkPTEgc3RydWN0NQorI2lkPTIgc3RydWN0NSAKKyNpZD00IHN0cnVjdDIobGlzdDxkb3VibGU+KQorI2lkPTMgc3RydWN0MihsaXN0PGk2ND4gIGRlZmF1bHQgdmFsdWVzIHJlbW92ZWQpCisjaWQgNCBzdHJ1Y3QxIGNoYW5nZSBpbiBkb3VibGUgdmFsdWUKKyNpZCA1IHN0cnVjdDEgKGRlZmF1bHQgc3RyaW5nIHZhbHVlIHJlbW92ZWQpCisjaWQ9MSBzdHJ1Y3QzIChjaGFuZ2UgaW4gbWFwIHZhbHVlcykKKyNpZDIgc3RydWN0MyAoY2hhbmdlIGluIG1hcCBrZXlzKQorCisjY2hhbmdlIGluIGluaGVyaXRhbmNlIGZvciBkZXJpdmVkMSBhbmQgZGVyaXZlZDIKKworI2NoYW5nZSBpbiBzdHJ1Y3QgZmllbGQgbmFtZXMKKyNpZDkgc3RydWN0MQorI2lkMiBzdHJ1Y3QyCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7CisKKyMgZ2xvYmFscworbXkgJGdBcmd1bWVudHMgPSAiIjsgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBBdWRpdFRvb2wKK215ICRnQXVkaXRUb29sUGF0aCA9ICIiOworbXkgJGdQcmV2aW91c1RocmlmdFBhdGg7ICAgICAgICAgICAgIyBwcmV2aW91cyB0aHJpZnQgcGF0aAorbXkgJGdDdXJyZW50VGhyaWZ0UGF0aDsgICAgICAgICAgICAgIyBjdXJyZW50IHRocmlmdCBwYXRoCitteSAkZ1RocmlmdEZpbGVGb2xkZXI7CitteSAkZ0JyZWFraW5nRmlsZXNDb3VudCA9MzQ7IAorCitteSAkZ1ZlcmJvc2UgPSAwOworI2Z1bmN0aW9ucworc3ViIGF1ZGl0QnJlYWtpbmdDaGFuZ2VzOworc3ViIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzOworCittYWluKCk7CisKK3N1YiBtYWluCit7CisgICAgcGFyc2VPcHRpb25zKCk7CisgICAgYXVkaXRCcmVha2luZ0NoYW5nZXMoKTsKKyAgICBhdWRpdE5vbkJyZWFraW5nQ2hhbmdlcygpOworfQorCitzdWIgcGFyc2VPcHRpb25zCit7CisgICAgbXkgJW9wdGlvbnMgPSAoKTsKKyAgICBpZiAoIGdldG9wdHMgKCd2ZjpvOnQ6JyxcJW9wdGlvbnMpICkKKyAgICB7CisgICAgICAgICMgY3VycmVudCAobmV3KSB0aHJpZnQgZm9sZGVyCisgICAgICAgIGlmICgkb3B0aW9uc3snZid9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ1RocmlmdEZpbGVGb2xkZXIgPSAkb3B0aW9uc3snZid9OworICAgICAgICAgICAgJGdQcmV2aW91c1RocmlmdFBhdGggPSAkZ1RocmlmdEZpbGVGb2xkZXIuIi90ZXN0LnRocmlmdCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWUgIk1pc3NpbmcgRm9sZGVyIGNvbnRhaW5pbmcgdGhyaWZ0IGZpbGVzXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYoJG9wdGlvbnN7J3QnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJGdBdWRpdFRvb2xQYXRoID0gJG9wdGlvbnN7J3QnfTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZSAiQXVkaXQgVG9vbCBQYXRoIHJlcXVpcmVkIFxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkb3B0aW9uc3sndid9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ1ZlcmJvc2UgPSAxOworICAgICAgICB9CisKKyAgICB9Cit9CisKK3N1YiBhdWRpdEJyZWFraW5nQ2hhbmdlcworeworICAgIG15ICRicmVha2luZ0ZpbGVCYXNlTmFtZSA9ICRnVGhyaWZ0RmlsZUZvbGRlci4iL2JyZWFrIjsKKyAgICBteSAkbmV3VGhyaWZ0RmlsZTsKKyAgICBmb3IobXkgJGk9MTsgJGkgPD0gJGdCcmVha2luZ0ZpbGVzQ291bnQ7ICRpKyspCisgICAgeworICAgICAgICAkbmV3VGhyaWZ0RmlsZSA9ICRicmVha2luZ0ZpbGVCYXNlTmFtZS4iJGkudGhyaWZ0IjsKKyAgICAgICAgbXkgJGFyZ3VtZW50cyA9ICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aC4iICIuJG5ld1RocmlmdEZpbGU7CisgICAgICAgIG15ICgkZXhpdENvZGUsICRvdXRwdXQpID0gY2FsbFRocmlmdEF1ZGl0VG9vbCgkYXJndW1lbnRzKTsKKyAgICAgICAgcHJpbnQgJG91dHB1dCBpZiAkZ1ZlcmJvc2UgZXEgMTsKKworICAgICAgICBpZigkZXhpdENvZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgIyB0aHJpZnRfYXVkaXQgcmV0dXJucyAxIHdoZW4gaXQgaXMgbm90IGFibGUgdG8gZmluZCBmaWxlcyBvciBvdGhlciBub24tYXVkaXQgZmFpbHVyZXMKKyAgICAgICAgICAgIHByaW50ICJleGl0aW5nIHdpdGggZXhpdCBjb2RlID0xIGkgPSAiLiRpLiJcbiI7CisgICAgICAgICAgICBwcmludCAkb3V0cHV0OworICAgICAgICAgICAgZXhpdCAkZXhpdENvZGU7CisgICAgICAgIH0KKyAgICAgICAgaWYoJGV4aXRDb2RlICE9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgdGhyaWZ0LWF1ZGl0IHJldHVybiAyIGZvciBhdWRpdCBmYWlsdXJlcy4gU28gZm9yIEJyZWFraW5nIGNoYW5nZXMgd2Ugc2hvdWxkIGdldCAyIGFzIHJldHVybiB2YWx1ZS4KKyAgICAgICAgICAgIHByaW50ICRvdXRwdXQ7CisgICAgICAgICAgICBkaWUgIlxuVEVTVCBGQUlMVVJFOiBCcmVha2luZyBDaGFuZ2Ugbm90IGRldGVjdGVkIGZvciB0aHJpZnQgZmlsZSAkbmV3VGhyaWZ0RmlsZSwgY29kZT0kZXhpdENvZGUgXG4iOworICAgICAgICB9CisgICAgICAgIGlmKGluZGV4KCRvdXRwdXQsZ2V0TWVzc2FnZVN1YlN0cmluZygiYnJlYWskaSIpKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgI0F1ZGl0IHRvb2wgZGV0ZWN0ZWQgZmFpbHVyZSwgYnV0IG5vdCB0aGUgZXhwZWN0ZWQgb25lLiBUaGUgY2hhbmdlIGluIGJyZWFraW5nIHRocmlmdCBmaWxlIGRvZXMgbm90IG1hdGNoIGdldE1lc3NhZ2VTdWJTdHJpbmcoKQorICAgICAgICAgICAgcHJpbnQgJG91dHB1dDsKKyAgICAgICAgICAgIGRpZSAiXG5UZXN0IEZBSUxVUkU6IEF1ZGl0IHRvb2wgZGV0ZWN0ZWQgZmFpbHVyZSwgYnV0IG5vdCB0aGUgZXhwZWN0ZWQgb25lIVxuIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICNUaHJpZnQgYXVkaXQgdG9vbCBoYXMgZGV0ZWN0ZWQgYXVkaXQgZmFpbHVyZSBhbmQgaGFzIHJldHVybmVkIGV4aXRlZCB0byBzdGF0dXMgY29kZSAyCisgICAgICAgICAgICBwcmludCAiVGVzdCBQYXNzOiBBdWRpdCBGYWlsdXJlIGRldGVjdGVkIGZvciB0aHJpZnQgZmlsZSBicmVhayRpLnRocmlmdCBcbiI7CisgICAgICAgIH0KKyAgICB9CisKK30KKworc3ViIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzCit7CisgICAgbXkgJGJyZWFraW5nRmlsZUJhc2VOYW1lID0gJGdUaHJpZnRGaWxlRm9sZGVyLiIvd2FybmluZyI7CisgICAgbXkgJG5ld1RocmlmdEZpbGU7CisgICAgJG5ld1RocmlmdEZpbGUgPSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUuIi50aHJpZnQiOworICAgIG15ICRhcmd1bWVudHMgPSAgJGdQcmV2aW91c1RocmlmdFBhdGguIiAiLiRuZXdUaHJpZnRGaWxlOworICAgIG15ICgkZXhpdENvZGUsICRvdXRwdXQpID0gY2FsbFRocmlmdEF1ZGl0VG9vbCgkYXJndW1lbnRzKTsKKyAgICBwcmludCAkb3V0cHV0IGlmICRnVmVyYm9zZSBlcSAxOworCisgICAgaWYoJGV4aXRDb2RlID09IDEpCisgICAgeworICAgICAgICAjIHRocmlmdF9hdWRpdCByZXR1cm5zIDEgd2hlbiBpdCBpcyBub3QgYWJsZSB0byBmaW5kIGZpbGVzIG9yIG90aGVyIG5vbi1hdWRpdCBmYWlsdXJlcworICAgICAgICBwcmludCAiZXhpdGluZyB3aXRoIGV4aXQgY29kZSA9IDEgIGZvciBmaWxlIHdhcm5pbmcudGhyaWZ0XG4iOworICAgICAgICBleGl0ICRleGl0Q29kZTsKKyAgICB9CisgICAgZWxzaWYoJGV4aXRDb2RlICE9IDApCisgICAgeworICAgICAgICAjIHRocmlmdC1hdWRpdCByZXR1cm4gMCBpZiB0aGVyZSBhcmUgbm8gYXVkaXQgZmFpbHVyZXMuCisgICAgICAgIGRpZSAiXG5URVNUIEZBSUxVUkU6IE5vbiBCcmVha2luZyBjaGFuZ2VzIHJldHVybmVkIGZhaWx1cmUgZm9yIHRocmlmdCBmaWxlICRuZXdUaHJpZnRGaWxlIFxuIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgI1RocmlmdCBhdWRpdCB0b29sIGhhcyBleGl0ZWQgd2l0aCBzdGF0dXMgMC4gCisgICAgICAgIHByaW50ICJUZXN0IFBhc3M6IEF1ZGl0IHRvb2wgZXhpdHMgd2l0aCBzdWNjZXNzIGZvciB3YXJuaW5ncyBcbiI7CisgICAgfQorCisKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxsIHRocmlmdEF1ZGl0VG9vbCBzY3JpcHQKK3N1YiBjYWxsVGhyaWZ0QXVkaXRUb29sICggJCApCit7CisgICAgbXkgJGFyZ3MgPSBzaGlmdDsKKworICAgIG15ICRjb21tYW5kID0gIiRnQXVkaXRUb29sUGF0aCAtLWF1ZGl0ICRhcmdzIjsKKyAgICBteSAkb3V0cHV0ID0gYCRjb21tYW5kIDI+JjFgOworICAgIG15ICRleGl0Q29kZSA9ICQ/ID4+IDg7CisKKyAgICByZXR1cm4gKCRleGl0Q29kZSwkb3V0cHV0KTsKK30KKworc3ViIGdldE1lc3NhZ2VTdWJTdHJpbmcoICQgKQoreworICAgIG15ICRmaWxlTmFtZSA9IHNoaWZ0OworICAgIG15ICVsb29rdXBUYWJsZSA9ICgKKyAgICAgICAgImJyZWFrMSIgID0+ICJiYXNlX2Z1bmN0aW9uMyIsCisgICAgICAgICJicmVhazIiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrMyIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWs0IiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazUiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrNiIgID0+ICJ0ZXN0X3N0cnVjdDIiLAorICAgICAgICAiYnJlYWs3IiAgPT4gInRlc3Rfc3RydWN0NiIsCisgICAgICAgICJicmVhazgiICA9PiAidGVzdF9zdHJ1Y3Q1IiwKKyAgICAgICAgImJyZWFrOSIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWsxMCIgPT4gInRlc3Rfc3RydWN0MiIsCisgICAgICAgICJicmVhazExIiA9PiAidGVzdF9zdHJ1Y3QzIiwKKyAgICAgICAgImJyZWFrMTIiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsxMyIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNiIsCisgICAgICAgICJicmVhazE0IiA9PiAiZGVyaXZlZDFfZnVuY3Rpb240IiwKKyAgICAgICAgImJyZWFrMTUiID0+ICJkZXJpdmVkMl9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsxNiIgPT4gImRlcml2ZWQyX2Z1bmN0aW9uNSIsCisgICAgICAgICJicmVhazE3IiA9PiAiZGVyaXZlZDJfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMTgiID0+ICJiYXNlX29uZXdheSIsCisgICAgICAgICJicmVhazE5IiA9PiAiYmFzZV9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsyMCIgPT4gInRlc3RfZW51bTEiLAorICAgICAgICAiYnJlYWsyMSIgPT4gInRlc3RfZW51bTIiLAorICAgICAgICAiYnJlYWsyMiIgPT4gInRlc3RfZW51bTEiLAorICAgICAgICAiYnJlYWsyMyIgPT4gInRlc3Rfc3RydWN0NCIsCisgICAgICAgICJicmVhazI0IiA9PiAiZGVyaXZlZDEiLAorICAgICAgICAiYnJlYWsyNSIgPT4gImRlcml2ZWQyIiwKKyAgICAgICAgImJyZWFrMjYiID0+ICJiYXNlX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazI3IiA9PiAiYmFzZV9mdW5jdGlvbjJfYXJncyIsCisgICAgICAgICJicmVhazI4IiA9PiAiZGVyaXZlZDFfZnVuY3Rpb241X2FyZ3MiLAorICAgICAgICAiYnJlYWsyOSIgPT4gImJhc2VfZnVuY3Rpb24yX2FyZ3MiLAorICAgICAgICAiYnJlYWszMCIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNiIsCisgICAgICAgICJicmVhazMxIiA9PiAiYmFzZV9mdW5jdGlvbjJfZXhjZXB0aW9uIiwKKyAgICAgICAgImJyZWFrMzIiID0+ICJ0ZXN0X2V4Y2VwdGlvbjEiLAorICAgICAgICAiYnJlYWszMyIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uMV9leGNlcHRpb24iLAorICAgICAgICAiYnJlYWszNCIgPT4gInRlc3Rfc3RydWN0MyIsCisgICAgKTsKKyAgICBpZiAobm90IGV4aXN0cyAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9KQorICAgIHsKKyAgICAgICAgcHJpbnQgImluIHRoZSBudWxsIGNhc2VcbiI7CisgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgfQorICAgIAorICAgIG15ICRyZXR2YWwgPSAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9OworICAgIHByaW50ICIkZmlsZU5hbWUgPT4gJHJldHZhbFxuIjsKKyAgICByZXR1cm4gJGxvb2t1cFRhYmxleyAkZmlsZU5hbWUgfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQgYi90ZXN0L2F1ZGl0L3dhcm5pbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTJkNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3dhcm5pbmcudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCisKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMjsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoiY2xhc3MiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNCwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1LAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBjaGFuZ2VkMTkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gY2hhbmdlZDIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMsCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCA9WzEuMCwgMi4xXSwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToxMCwgMjoyMH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MToxLjEsIDI6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxID0gMS4xLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3MiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNleworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhMDNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDc0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGNnbGliLmxhCitub2Rpc3RfbGlidGVzdGNnbGliX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBcCisJZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBcCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBcCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBcCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorCitsaWJ0ZXN0Y2dsaWJfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCitwcmVjcm9zczogbGlidGVzdGNnbGliLmxhIHRlc3RfY2xpZW50IHRlc3Rfc2VydmVyCisKK2NoZWNrX1BST0dSQU1TID0gXAorCXRlc3RfY2xpZW50IFwKKwl0ZXN0X3NlcnZlcgorCit0ZXN0X2NsaWVudF9TT1VSQ0VTID0gXAorCXNyYy90ZXN0X2NsaWVudC5jCisKK3Rlc3RfY2xpZW50X0xEQUREID0gXAorCWxpYnRlc3RjZ2xpYi5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCit0ZXN0X3NlcnZlcl9TT1VSQ0VTID0gXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBcCisJc3JjL3Rlc3Rfc2VydmVyLmMKKwordGVzdF9zZXJ2ZXJfTERBREQgPSBcCisJbGlidGVzdGNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKK2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliIC1yICQ8CisKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykKK0FNX0NYWEZMQUdTID0gJChBTV9DRkxBR1MpCitBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY19nbGliL3NyYyAtSWdlbi1jX2dsaWIKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jX2dsaWIvKgorCitFWFRSQV9ESVNUID0gXAorCXNyYy90ZXN0X2NsaWVudC5jIFwKKwlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oIFwKKwlzcmMvdGVzdF9zZXJ2ZXIuYwpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3Rlc3RfY2xpZW50LmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI0YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3Rlc3RfY2xpZW50LmMKQEAgLTAsMCArMSwxODA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKKworLyogSGFuZGxlIFNJR1BJUEUgc2lnbmFscyAoaW5kaWNhdGluZyB0aGUgc2VydmVyIGhhcyBjbG9zZWQgdGhlCisgICBjb25uZWN0aW9uIHByZW1hdHVyZWx5KSBieSBvdXRwdXR0aW5nIGFuIGVycm9yIG1lc3NhZ2UgYmVmb3JlCisgICBleGl0aW5nLiAqLworc3RhdGljIHZvaWQKK3NpZ3BpcGVfaGFuZGxlciAoaW50IHNpZ25hbF9udW1iZXIpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzaWduYWxfbnVtYmVyKTsKKworICAvKiBGbHVzaCBzdGFuZGFyZCBvdXRwdXQgdG8gbWFrZSBzdXJlIHRoZSB0ZXN0IHJlc3VsdHMgc28gZmFyIGFyZQorICAgICBsb2dnZWQgKi8KKyAgZmZsdXNoIChzdGRvdXQpOworCisgIGZwdXRzICgiQnJva2VuIHBpcGUgKHNlcnZlciBjbG9zZWQgY29ubmVjdGlvbiBwcmVtYXR1cmVseSlcbiIsIHN0ZGVycik7CisgIGZmbHVzaCAoc3RkZXJyKTsKKworICAvKiBSZS1yYWlzZSB0aGUgc2lnbmFsLCB0aGlzIHRpbWUgaW52b2tpbmcgdGhlIGRlZmF1bHQgc2lnbmFsCisgICAgIGhhbmRsZXIsIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSAqLworICByYWlzZSAoU0lHUElQRSk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGdpbnQzMiB2YWx1ZXMuIFVzZWQgZm9yIHNvcnRpbmcgYW5kIGZpbmRpbmcgaW50ZWdlcgorICAgdmFsdWVzIHdpdGhpbiBhIEdMaXN0LiAqLworc3RhdGljIGdpbnQKK2dpbnQzMl9jb21wYXJlIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgZ2ludDMyIGludDMyX2EgPSAqKGdpbnQzMiAqKWE7CisgIGdpbnQzMiBpbnQzMl9iID0gKihnaW50MzIgKiliOworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoaW50MzJfYSA8IGludDMyX2IpCisgICAgcmVzdWx0ID0gLTE7CisgIGVsc2UgaWYgKGludDMyX2EgPiBpbnQzMl9iKQorICAgIHJlc3VsdCA9IDE7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBJdCBnZXRzIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd2hpY2ggdXNlcyBhIGNvbmNyZXRlIHByb3RvY29sIHVuZGVybmVhdGgKKyAqIEBwYXJhbSAgcHJvdG9jb2xfbmFtZSAgdGhlIGZ1bGx5IHF1YWxpZmllZCBwcm90b2NvbCBwYXRoIChlLmcuICJiaW5hcnk6bXVsdGkiKQorICogQHBhcmFtICB0cmFuc3BvcnQgICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAqIEBwYXJhbSAgc2VydmljZV9uYW1lICAgdGhlIHNpbmdsZSBzdXBwb3J0ZWQgc2VydmljZSBuYW1lCisgKiBAdG9kbyAgICAgICAgICAgICAgICAgIG5lZWQgdG8gYWxsb3cgbXVsdGlwbGUgc2VydmljZXMgdG8gZnVsbHkgdGVzdCBtdWx0aXBsZXhlZAorICogQHJldHVybiAgICAgICAgICAgICAgICBhIG11bHRpcGxleGVkIHByb3RvY29sIHdyYXBwaW5nIHRoZSBjb3JyZWN0IHVuZGVybHlpbmcgcHJvdG9jb2wKKyAqLworVGhyaWZ0UHJvdG9jb2wgKgorZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKGdjaGFyICpwcm90b2NvbF9uYW1lLCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ2NoYXIgKnNlcnZpY2VfbmFtZSkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKiBtdWx0aXBsZXhlZF9wcm90b2NvbCA9IE5VTEw7CisKKyAgaWYgKCBzdHJuY21wKHByb3RvY29sX25hbWUsICJiaW5hcnk6IiwgNykgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIE5VTEwpOworICB9IGVsc2UgaWYgKCBzdHJuY21wKHByb3RvY29sX25hbWUsICJjb21wYWN0OiIsIDgpID09IDApIHsKKyAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG11bHRpcGxleCBwcm90b2NvbCBuYW1lOiAlc1xuIiwgcHJvdG9jb2xfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwKKyAgICAgICAgICAidHJhbnNwb3J0IiwgICAgICB0cmFuc3BvcnQsCisgICAgICAgICAgInByb3RvY29sIiwgICAgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wsCisgICAgICAgICAgInNlcnZpY2UtbmFtZSIsICAgc2VydmljZV9uYW1lLAorICAgICAgICAgIE5VTEwpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RhdGljIGdjaGFyICogIGhvc3QgPSBOVUxMOworICBzdGF0aWMgZ2ludCAgICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnYm9vbGVhbiBzc2wgID0gRkFMU0U7CisgIHN0YXRpYyBnY2hhciAqICB0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICogIHByb3RvY29sX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBudW1fdGVzdHMgPSAxOworCisgIHN0YXRpYworICAgIEdPcHRpb25FbnRyeSBvcHRpb25fZW50cmllc1tdID17CisgICAgeyAiaG9zdCIsICAgICAgICAgICAgJ2gnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZob3N0LAorICAgICAgIkhvc3QgdG8gY29ubmVjdCAoPWxvY2FsaG9zdCkiLCBOVUxMIH0sCisgICAgeyAicG9ydCIsICAgICAgICAgICAgJ3AnLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgKD05MDkwKSIsIE5VTEwgfSwKKyAgICB7ICJzc2wiLCAgICAgICAgICAgICAncycsIDAsIEdfT1BUSU9OX0FSR19OT05FLCAgICAgJnNzbCwKKyAgICAgICJFbmFibGUgU1NMIiwgTlVMTCB9LAorICAgIHsgInRyYW5zcG9ydCIsICAgICAgICd0JywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCisgICAgeyAicHJvdG9jb2wiLCAgICAgICAgJ3InLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZwcm90b2NvbF9vcHRpb24sCisgICAgICAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgbXVsdGksIG11bHRpYyAoPWJpbmFyeSkiLCBOVUxMIH0sCisgICAgeyAidGVzdGxvb3BzIiwgICAgICAgJ24nLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZudW1fdGVzdHMsCisgICAgICAiTnVtYmVyIG9mIHRlc3RzICg9MSkiLCBOVUxMIH0sCisgICAgeyBOVUxMIH0KKyAgfTsKKworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ3BpcGVfYWN0aW9uOworCisgIEdUeXBlICBzb2NrZXRfdHlwZSAgICA9IFRIUklGVF9UWVBFX1NPQ0tFVDsKKyAgZ2NoYXIgKnNvY2tldF9uYW1lICAgID0gImlwIjsKKyAgR1R5cGUgIHRyYW5zcG9ydF90eXBlID0gVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUOworICBnY2hhciAqdHJhbnNwb3J0X25hbWUgPSAiYnVmZmVyZWQiOworICBHVHlwZSAgcHJvdG9jb2xfdHlwZSAgPSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0w7CisgIGdjaGFyICpwcm90b2NvbF9uYW1lICA9ICJiaW5hcnkiOworCisgIFRocmlmdFNvY2tldCAgICAqc29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbDIgPSBOVUxMOyAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZXhlZCB0ZXN0cworCisgIFRUZXN0VGhyaWZ0VGVzdElmICp0ZXN0X2NsaWVudCA9IE5VTEw7CisgIFRUZXN0U2Vjb25kU2VydmljZUlmICpzZWNvbmRfc2VydmljZSA9IE5VTEw7ICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKKworICBzdHJ1Y3QgdGltZXZhbCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3AsIHRpbWVfZWxhcHNlZDsKKyAgZ3VpbnQ2NCB0aW1lX2VsYXBzZWRfdXNlYywgdGltZV90b3RhbF91c2VjID0gMDsKKyAgZ3VpbnQ2NCB0aW1lX21pbl91c2VjID0gR19NQVhVSU5UNjQsIHRpbWVfbWF4X3VzZWMgPSAwLCB0aW1lX2F2Z191c2VjOworCisgIEdPcHRpb25Db250ZXh0ICpvcHRpb25fY29udGV4dDsKKyAgZ2Jvb2xlYW4gb3B0aW9uc192YWxpZCA9IFRSVUU7CisgIGludCB0ZXN0X251bSA9IDA7CisgIGludCBmYWlsX2NvdW50ID0gMDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIC8qIENvbmZpZ3VyZSBhbmQgcGFyc2Ugb3VyIGNvbW1hbmQtbGluZSBvcHRpb25zICovCisgIG9wdGlvbl9jb250ZXh0ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKE5VTEwpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKG9wdGlvbl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKG9wdGlvbl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIHJldHVybiAyNTU7CisgIH0KKyAgZ19vcHRpb25fY29udGV4dF9mcmVlIChvcHRpb25fY29udGV4dCk7CisKKyAgLyogU2V0IHJlbWFpbmluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgb3B0aW9ucyAqLworICBpZiAoaG9zdCA9PSBOVUxMKQorICAgIGhvc3QgPSBnX3N0cmR1cCAoImxvY2FsaG9zdCIpOworCisgIC8qIFZhbGlkYXRlIHRoZSBwYXJzZWQgb3B0aW9ucyAqLworICBpZiAocHJvdG9jb2xfb3B0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiY29tcGFjdCIsIDgpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0IjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGkiLCA2KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF90eXBlID0gVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiY29tcGFjdDptdWx0aWMiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSA9PSAwKSB7CisgICAgICBwcmludGYoIldlIGFyZSBnb2luZyB3aXRoIGRlZmF1bHQgcHJvdG9jb2xcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJmcmFtZWQiLCA3KSA9PSAwKSB7CisgICAgICB0cmFuc3BvcnRfdHlwZSA9IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQ7CisgICAgICB0cmFuc3BvcnRfbmFtZSA9ICJmcmFtZWQiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wICh0cmFuc3BvcnRfb3B0aW9uLCAiYnVmZmVyZWQiLCA5KSAhPSAwKSB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHRyYW5zcG9ydCB0eXBlICVzXG4iLCB0cmFuc3BvcnRfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAoc3NsKSB7CisgICAgc29ja2V0X3R5cGUgPSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUOworICAgIHNvY2tldF9uYW1lID0gImlwLXNzbCI7CisgICAgcHJpbnRmKCJUeXBlIG5hbWUgJXNcbiIsIGdfdHlwZV9uYW1lIChzb2NrZXRfdHlwZSkpOworICB9CisKKyAgaWYgKCFvcHRpb25zX3ZhbGlkKQorICAgIHJldHVybiAyNTQ7CisKKyAgcHJpbnRmICgiQ29ubmVjdGluZyAoJXMvJXMpIHRvOiAlcy8lczolZFxuIiwKKyAgICAgICAgICB0cmFuc3BvcnRfbmFtZSwKKyAgICAgICAgICBwcm90b2NvbF9uYW1lLAorICAgICAgICAgIHNvY2tldF9uYW1lLAorICAgICAgICAgIGhvc3QsCisgICAgICAgICAgcG9ydCk7CisKKyAgLyogSW5zdGFsbCBvdXIgU0lHUElQRSBoYW5kbGVyLCB3aGljaCBvdXRwdXRzIGFuIGVycm9yIG1lc3NhZ2UgdG8KKyAgICAgc3RhbmRhcmQgZXJyb3IgYmVmb3JlIGV4aXRpbmcgc28gdGVzdGVycyBjYW4ga25vdyB3aGF0CisgICAgIGhhcHBlbmVkICovCisgIG1lbXNldCAoJnNpZ3BpcGVfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ3BpcGVfYWN0aW9uKSk7CisgIHNpZ3BpcGVfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWdwaXBlX2hhbmRsZXI7CisgIHNpZ3BpcGVfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICBzaWdhY3Rpb24gKFNJR1BJUEUsICZzaWdwaXBlX2FjdGlvbiwgTlVMTCk7CisKKyAgaWYgKHNzbCkgeworICAgIHRocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCgpOworICB9CisKKyAgLyogRXN0YWJsaXNoIGFsbCBvdXIgY29ubmVjdGlvbiBvYmplY3RzICovCisgIHNvY2tldCA9IGdfb2JqZWN0X25ldyAoc29ja2V0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmIChzc2wgJiYgIXRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUSFJJRlRfU1NMX1NPQ0tFVChzb2NrZXQpLCAiLi4va2V5cy9DQS5wZW0iKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGxvYWQgdmFsaWRhdGlvbiBjZXJ0aWZpY2F0ZSAuLi9rZXlzL0NBLnBlbSAtIGRpZCB5b3UgcnVuIGluIHRoZSB0ZXN0L2NfZ2xpYiBkaXJlY3Rvcnk/XG4iKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNvY2tldCk7CisgICAgcmV0dXJuIDI1MzsKKyAgfQorCisgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAodHJhbnNwb3J0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZihwcm90b2NvbF90eXBlPT1USFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkgeworICAgIC8vIFRPRE86IEEgbXVsdGlwbGV4ZWQgdGVzdCBzaG91bGQgYWxzbyB0ZXN0ICJTZWNvbmQiIChzZWUgSmF2YSBUZXN0U2VydmVyKQorICAgIC8vIFRoZSBjb250ZXh0IGNvbWVzIGZyb20gdGhlIG5hbWUgb2YgdGhlIHRocmlmdCBmaWxlLiBJZiBtdWx0aXBsZSB0aHJpZnQKKyAgICAvLyBzY2hlbWFzIGFyZSB1c2VkIHdlIGhhdmUgdG8gcmVkbyB0aGUgd2F5IHRoaXMgaXMgZG9uZS4KKyAgICBwcm90b2NvbCA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJUaHJpZnRUZXN0Iik7CisgICAgaWYgKE5VTEwgPT0gcHJvdG9jb2wpIHsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICAgIHJldHVybiAyNTI7CisgICAgfQorCisgICAgLy8gTWFrZSBhIHNlY29uZCBwcm90b2NvbCBhbmQgY2xpZW50IHJ1bm5pbmcgb24gdGhlIHNhbWUgbXVsdGlwbGV4ZWQgdHJhbnNwb3J0CisgICAgcHJvdG9jb2wyID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICBzZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB9ZWxzZXsKKyAgICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKKyAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgTlVMTCk7CisgIH0KKworICB0ZXN0X2NsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRlc3RzICovCisgIGZvciAodGVzdF9udW0gPSAwOyB0ZXN0X251bSA8IG51bV90ZXN0czsgKyt0ZXN0X251bSkgeworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSkgeworICAgICAgZ2NoYXIgICAqc3RyaW5nICA9IE5VTEw7CisgICAgICBnYm9vbGVhbiBib29sZWFuID0gMDsKKyAgICAgIGdpbnQ4ICAgIGJ5dGUgICAgPSAwOworICAgICAgZ2ludDMyICAgaW50MzIgICA9IDA7CisgICAgICBnaW50NjQgICBpbnQ2NCAgID0gMDsKKyAgICAgIGdkb3VibGUgIGR1YiAgICAgPSAwOworCisgICAgICBnaW50IGJ5dGVfdGhpbmcsIGkzMl90aGluZywgaW5uZXJfYnl0ZV90aGluZywgaW5uZXJfaTMyX3RoaW5nOworICAgICAgZ2ludDY0IGk2NF90aGluZywgaW5uZXJfaTY0X3RoaW5nOworCisgICAgICBUVGVzdFh0cnVjdCAgKnh0cnVjdF9vdXQsICAqeHRydWN0X291dDIsICp4dHJ1Y3RfaW4sICAqaW5uZXJfeHRydWN0X2luOworICAgICAgVFRlc3RYdHJ1Y3QyICp4dHJ1Y3QyX291dCwgKnh0cnVjdDJfaW47CisKKyAgICAgIEdIYXNoVGFibGUgKm1hcF9vdXQsICptYXBfaW4sICppbm5lcl9tYXBfaW47CisgICAgICBHSGFzaFRhYmxlICpzZXRfb3V0LCAqc2V0X2luOworICAgICAgZ3BvaW50ZXIga2V5LCB2YWx1ZTsKKyAgICAgIGdpbnQzMiAqaTMyX2tleV9wdHIsICppMzJfdmFsdWVfcHRyOworICAgICAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyLCBpbm5lcl9oYXNoX3RhYmxlX2l0ZXI7CisgICAgICBHTGlzdCAqa2V5c19vdXQsICprZXlzX2luLCAqa2V5c19lbGVtOworCisgICAgICBHQXJyYXkgKmxpc3Rfb3V0LCAqbGlzdF9pbjsKKworICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcno7CisgICAgICBUVGVzdE51bWJlcnogbnVtYmVyejI7CisKKyAgICAgIFRUZXN0VXNlcklkIHVzZXJfaWQsICp1c2VyX2lkX3B0ciwgKnVzZXJfaWRfcHRyMjsKKworICAgICAgVFRlc3RJbnNhbml0eSAqaW5zYW5pdHlfb3V0LCAqaW5zYW5pdHlfaW47CisgICAgICBHSGFzaFRhYmxlICp1c2VyX21hcDsKKyAgICAgIEdIYXNoVGFibGVJdGVyIHVzZXJfbWFwX2l0ZXI7CisgICAgICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgICAgIFRUZXN0WGNlcHRpb24gICp4Y2VwdGlvbiAgPSBOVUxMOworICAgICAgVFRlc3RYY2VwdGlvbjIgKnhjZXB0aW9uMiA9IE5VTEw7CisKKyAgICAgIGdib29sZWFuIG9uZXdheV9yZXN1bHQ7CisgICAgICBzdHJ1Y3QgdGltZXZhbCBvbmV3YXlfc3RhcnQsIG9uZXdheV9lbmQsIG9uZXdheV9lbGFwc2VkOworICAgICAgZ2ludCBvbmV3YXlfZWxhcHNlZF91c2VjOworCisgICAgICBnYm9vbGVhbiBmaXJzdDsKKyAgICAgIGdpbnQzMiBpLCBqOworCisgICAgICBwcmludGYgKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdF9udW0gKyAxLCBob3N0LCBwb3J0KTsKKyAgICAgIGdldHRpbWVvZmRheSAoJnRpbWVfc3RhcnQsIE5VTEwpOworCisgICAgICAvKiBUaGVzZSB0ZXN0IHJvdXRpbmVzIGhhdmUgYmVlbiBwb3J0ZWQgZnJvbSB0aGUgQysrIHRlc3QKKyAgICAgICAgIGNsaWVudCwgY2FyZSBiZWluZyB0YWtlbiB0byBlbnN1cmUgdGhlaXIgb3V0cHV0IHJlbWFpbnMgYXMKKyAgICAgICAgIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBvcmlnaW5hbCB0byBmYWNpbGl0YXRlIGRpZmZzLgorCisgICAgICAgICBGb3Igc2ltcGxpY2l0eSBjb21tZW50cyBoYXZlIGJlZW4gb21pdHRlZCwgYnV0IGV2ZXJ5IHJvdXRpbmUKKyAgICAgICAgIGhhcyB0aGUgc2FtZSBiYXNpYyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgIC0gQ3JlYXRlIGFuZCBwb3B1bGF0ZSBkYXRhIHN0cnVjdHVyZXMgYXMgbmVjZXNzYXJ5LgorCisgICAgICAgICAtIEZvcm1hdCBhbmQgb3V0cHV0ICh0byB0aGUgY29uc29sZSkgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgb3V0Z29pbmcgZGF0YS4KKworICAgICAgICAgLSBJc3N1ZSB0aGUgcmVtb3RlIG1ldGhvZCBjYWxsIHRvIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgIC0gRm9ybWF0IGFuZCBvdXRwdXQgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgZGF0YS4KKworICAgICAgICAgLSBWZXJpZnkgdGhlIHJldHVybmVkIGRhdGEgbWF0Y2hlcyB3aGF0IHdhcyBleHBlY3RlZC4KKworICAgICAgICAgLSBEZWFsbG9jYXRlIGFueSBjcmVhdGVkIGRhdGEgc3RydWN0dXJlcy4KKworICAgICAgICAgTm90ZSB0aGUgcmVjb2duaXplZCB2YWx1ZXMgYW5kIGV4cGVjdGVkIGJlaGF2aW91ciBvZiBlYWNoCisgICAgICAgICByZW1vdGUgbWV0aG9kIGFyZSBkZXNjcmliZWQgaW4gVGhyaWZ0VGVzdC50aHJpZnQsIHdoaWNoCisgICAgICAgICB5b3UnbGwgZmluZCBpbiB0aGUgdG9wLWxldmVsICJ0ZXN0IiBmb2xkZXIuICovCisKKyAgICAgIC8qKgorICAgICAgICogVk9JRCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RWb2lkKCkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF92b2lkICh0ZXN0X2NsaWVudCwgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSB2b2lkXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZihlcnJvciE9TlVMTCl7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFNUUklORyBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfc3RyaW5nICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IFwiJXNcIlxuIiwgc3RyaW5nKTsKKyAgICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZywgIlRlc3QiLCA1KSAhPSAwKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogTXVsdGlwbGV4ZWQgVGVzdCAtIGRvIHRoaXMgcmlnaHQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbm9ybWFsIFRlc3QgQ2xpZW50IHJ1bgorICAgICAgICovCisgICAgICBpZiAoc2Vjb25kX3NlcnZpY2UpIHsKKyAgICAgICAgcHJpbnRmICgidGVzdFNlY29uZFNlcnZpY2VNdWx0aXBsZXhTZWNvbmRUZXN0U3RyaW5nKFwiMm5kXCIpIik7CisgICAgICAgIGlmICh0X3Rlc3Rfc2Vjb25kX3NlcnZpY2VfaWZfc2Vjb25kdGVzdF9zdHJpbmcgKHNlY29uZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMm5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICAgIHByaW50ZiAoIiA9IFwiJXNcIlxuIiwgc3RyaW5nKTsKKyAgICAgICAgICBpZiAoc3RyY21wIChzdHJpbmcsICJ0ZXN0U3RyaW5nKFwiMm5kXCIpIikgIT0gMCkgeworICAgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICAgIH0KKworICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQk9PTCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RCeXRlKHRydWUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYm9vbCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVzXG4iLCBib29sZWFuID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIGlmIChib29sZWFuICE9IDEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdEJ5dGUoZmFsc2UpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYm9vbCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVzXG4iLCBib29sZWFuID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIGlmIChib29sZWFuICE9IDApCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEJZVEUgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSgxKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2J5dGUgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgYnl0ZSk7CisgICAgICAgIGlmIChieXRlICE9IDEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdEJ5dGUoLTEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYnl0ZSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgYnl0ZSk7CisgICAgICAgIGlmIChieXRlICE9IC0xKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBJMzIgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0STMyKC0xKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2kzMiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWRcbiIsIGludDMyKTsKKyAgICAgICAgaWYgKGludDMyICE9IC0xKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBJNjQgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9pNjQgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ2NCktMzQzNTk3MzgzNjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICUiIFBSSWQ2NCAiXG4iLCBpbnQ2NCk7CisgICAgICAgIGlmIChpbnQ2NCAhPSAoZ2ludDY0KS0zNDM1OTczODM2OCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRE9VQkxFIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmKCJ0ZXN0RG91YmxlKC01LjIwOTg1MjMpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZG91YmxlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNS4yMDk4NTIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZlxuIiwgZHViKTsKKyAgICAgICAgaWYgKChkdWIgLSAoLTUuMjA5ODUyMykpID4gMC4wMDEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEJJTkFSWSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RCaW5hcnkoZW1wdHkpIik7CisgICAgICBHQnl0ZUFycmF5ICplbXB0eUFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgR0J5dGVBcnJheSAqcmVzdWx0ID0gTlVMTDsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5QXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIEdCeXRlcyAqcmVzcG9uc2UgPSBnX2J5dGVfYXJyYXlfZnJlZV90b19ieXRlcyhyZXN1bHQpOyAgLy8gZnJlZXMgcmVzdWx0CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIGdzaXplIHNpeiA9IGdfYnl0ZXNfZ2V0X3NpemUocmVzcG9uc2UpOworICAgICAgICBpZiAoc2l6ID09IDApIHsKKyAgICAgICAgICBwcmludGYoIiA9IGVtcHR5XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIiA9IG5vdCBlbXB0eSAoJWxkIGJ5dGVzKVxuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZ19ieXRlc191bnJlZihyZXNwb25zZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGdfYnl0ZV9hcnJheV91bnJlZihlbXB0eUFycmF5KTsKKyAgICAgIGVtcHR5QXJyYXkgPSBOVUxMOworCisgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIHdpdGggZGF0YQorICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShbLTEyOC4uMTI3XSkgPSB7Iik7CisgICAgICBjb25zdCBzaWduZWQgY2hhciBiaW5fZGF0YVsyNTZdCisgICAgICAgID0gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsCisgICAgICAgICAgIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwKKyAgICAgICAgICAgLTk4LCAgLTk3LCAgLTk2LCAgLTk1LCAgLTk0LCAgLTkzLCAgLTkyLCAgLTkxLCAgLTkwLCAgLTg5LCAgLTg4LCAgLTg3LCAgLTg2LCAgLTg1LCAgLTg0LAorICAgICAgICAgICAtODMsICAtODIsICAtODEsICAtODAsICAtNzksICAtNzgsICAtNzcsICAtNzYsICAtNzUsICAtNzQsICAtNzMsICAtNzIsICAtNzEsICAtNzAsICAtNjksCisgICAgICAgICAgIC02OCwgIC02NywgIC02NiwgIC02NSwgIC02NCwgIC02MywgIC02MiwgIC02MSwgIC02MCwgIC01OSwgIC01OCwgIC01NywgIC01NiwgIC01NSwgIC01NCwKKyAgICAgICAgICAgLTUzLCAgLTUyLCAgLTUxLCAgLTUwLCAgLTQ5LCAgLTQ4LCAgLTQ3LCAgLTQ2LCAgLTQ1LCAgLTQ0LCAgLTQzLCAgLTQyLCAgLTQxLCAgLTQwLCAgLTM5LAorICAgICAgICAgICAtMzgsICAtMzcsICAtMzYsICAtMzUsICAtMzQsICAtMzMsICAtMzIsICAtMzEsICAtMzAsICAtMjksICAtMjgsICAtMjcsICAtMjYsICAtMjUsICAtMjQsCisgICAgICAgICAgIC0yMywgIC0yMiwgIC0yMSwgIC0yMCwgIC0xOSwgIC0xOCwgIC0xNywgIC0xNiwgIC0xNSwgIC0xNCwgIC0xMywgIC0xMiwgIC0xMSwgIC0xMCwgIC05LAorICAgICAgICAgICAtOCwgICAtNywgICAtNiwgICAtNSwgICAtNCwgICAtMywgICAtMiwgICAtMSwgICAwLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LAorICAgICAgICAgICA3LCAgICA4LCAgICA5LCAgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxOSwgICAyMCwgICAyMSwKKyAgICAgICAgICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsCisgICAgICAgICAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgICAgICAgICA1MiwgICA1MywgICA1NCwgICA1NSwgICA1NiwgICA1NywgICA1OCwgICA1OSwgICA2MCwgICA2MSwgICA2MiwgICA2MywgICA2NCwgICA2NSwgICA2NiwKKyAgICAgICAgICAgNjcsICAgNjgsICAgNjksICAgNzAsICAgNzEsICAgNzIsICAgNzMsICAgNzQsICAgNzUsICAgNzYsICAgNzcsICAgNzgsICAgNzksICAgODAsICAgODEsCisgICAgICAgICAgIDgyLCAgIDgzLCAgIDg0LCAgIDg1LCAgIDg2LCAgIDg3LCAgIDg4LCAgIDg5LCAgIDkwLCAgIDkxLCAgIDkyLCAgIDkzLCAgIDk0LCAgIDk1LCAgIDk2LAorICAgICAgICAgICA5NywgICA5OCwgICA5OSwgICAxMDAsICAxMDEsICAxMDIsICAxMDMsICAxMDQsICAxMDUsICAxMDYsICAxMDcsICAxMDgsICAxMDksICAxMTAsICAxMTEsCisgICAgICAgICAgIDExMiwgIDExMywgIDExNCwgIDExNSwgIDExNiwgIDExNywgIDExOCwgIDExOSwgIDEyMCwgIDEyMSwgIDEyMiwgIDEyMywgIDEyNCwgIDEyNSwgIDEyNiwKKyAgICAgICAgICAgMTI3fTsKKyAgICAgIEdCeXRlQXJyYXkgKmZ1bGxBcnJheSA9IGdfYnl0ZV9hcnJheV9uZXcoKTsKKyAgICAgIGdfYnl0ZV9hcnJheV9hcHBlbmQoZnVsbEFycmF5LCAoZ3VpbnQ4ICopKCZiaW5fZGF0YVswXSksIDI1Nik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYmluYXJ5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIEdCeXRlcyAqcmVzcG9uc2UgPSBnX2J5dGVfYXJyYXlfZnJlZV90b19ieXRlcyhyZXN1bHQpOyAgLy8gZnJlZXMgcmVzdWx0CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIGdzaXplIHNpeiA9IGdfYnl0ZXNfZ2V0X3NpemUocmVzcG9uc2UpOworICAgICAgICBnY29uc3Rwb2ludGVyIHB0ciA9IGdfYnl0ZXNfZ2V0X2RhdGEocmVzcG9uc2UsICZzaXopOworICAgICAgICBpZiAoc2l6ID09IDI1NikgeworICAgICAgICAgIGdib29sZWFuIGZpcnN0ID0gMTsKKyAgICAgICAgICBnYm9vbGVhbiBmYWlsZWQgPSAwOworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgaW50IHZhbCA9ICgoc2lnbmVkIGNoYXIgKilwdHIpW2ldOworICAgICAgICAgICAgcHJpbnRmKCIlZCIsIHZhbCk7CisgICAgICAgICAgICBpZiAoIWZhaWxlZCAmJiB2YWwgIT0gaSAtIDEyOCkgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIn0gIik7CisgICAgICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAgICAgcHJpbnRmKCJGQUlMIChiYWQgY29udGVudCkgc2l6ZSAlbGQgT0tcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiT0sgc2l6ZSAlbGQgT0tcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gYmFkIHNpemUgJWxkXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGZ1bGxBcnJheSk7CisgICAgICBmdWxsQXJyYXkgPSBOVUxMOworCisgICAgICAvKioKKyAgICAgICAqIFNUUlVDVCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgeHRydWN0X291dCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJaZXJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgICAgIC0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICAgLTVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfc3RydWN0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dHJ1Y3Rfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgiID0ge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn1cbiIsCisgICAgICAgICAgICAgICAgc3RyaW5nLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIGk2NF90aGluZyk7CisgICAgICAgIGlmICgoc3RyaW5nID09IE5VTEwgfHwgc3RybmNtcCAoc3RyaW5nLCAiWmVybyIsIDUpICE9IDApIHx8CisgICAgICAgICAgICBieXRlX3RoaW5nICE9IDEgfHwKKyAgICAgICAgICAgIGkzMl90aGluZyAhPSAtMyB8fAorICAgICAgICAgICAgaTY0X3RoaW5nICE9IChnaW50NjQpLTUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgLy8gZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOyB1c2VkIGJlbG93CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKKworICAgICAgLyoqCisgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7CisgICAgICB4dHJ1Y3QyX291dCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgeHRydWN0X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgICAgICAgICAgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdDJfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVDIsIE5VTEwpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbmVzdCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdDJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRydWN0Ml9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdDJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmlubmVyX2J5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgiID0geyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9XG4iLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgc3RyaW5nLAorICAgICAgICAgICAgICAgIGlubmVyX2J5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgaW5uZXJfaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIGlubmVyX2k2NF90aGluZywKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmcpOworICAgICAgICBpZiAoYnl0ZV90aGluZyAhPSAxIHx8CisgICAgICAgICAgICAoc3RyaW5nID09IE5VTEwgfHwgc3RybmNtcCAoc3RyaW5nLCAiWmVybyIsIDUpICE9IDApIHx8CisgICAgICAgICAgICBpbm5lcl9ieXRlX3RoaW5nICE9IDEgfHwKKyAgICAgICAgICAgIGlubmVyX2kzMl90aGluZyAhPSAtMyB8fAorICAgICAgICAgICAgaW5uZXJfaTY0X3RoaW5nICE9IChnaW50NjQpLTUgfHwKKyAgICAgICAgICAgIGkzMl90aGluZyAhPSA1KQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgICAgZ19mcmVlKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX291dCk7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogTUFQIFRFU1QKKyAgICAgICAqLworICAgICAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgaTMyX2tleV9wdHIgICA9IGdfbWFsbG9jIChzaXplb2YgKmkzMl9rZXlfcHRyKTsKKyAgICAgICAgaTMyX3ZhbHVlX3B0ciA9IGdfbWFsbG9jIChzaXplb2YgKmkzMl92YWx1ZV9wdHIpOworCisgICAgICAgICppMzJfa2V5X3B0ciAgID0gaTsKKyAgICAgICAgKmkzMl92YWx1ZV9wdHIgPSBpIC0gMTA7CisKKyAgICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgaTMyX2tleV9wdHIsIGkzMl92YWx1ZV9wdHIpOworICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdE1hcCh7Iik7CisgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfb3V0KTsKKyAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgcHJpbnRmICgiJWQgPT4gJWQiLCAqKGdpbnQzMiAqKWtleSwgKihnaW50MzIgKil2YWx1ZSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9KSIpOworCisgICAgICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9tYXAgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfaW4pOworICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiJWQgPT4gJWQiLCAqKGdpbnQzMiAqKWtleSwgKihnaW50MzIgKil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgifVxuIik7CisKKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplIChtYXBfaW4pICE9IGdfaGFzaF90YWJsZV9zaXplIChtYXBfb3V0KSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9vdXQpOworICAgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgICBncG9pbnRlciBpbl92YWx1ZSA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwga2V5KTsKKyAgICAgICAgICAgIGlmIChpbl92YWx1ZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgKihnaW50MzIgKilpbl92YWx1ZSAhPSAqKGdpbnQzMiAqKXZhbHVlKSB7CisgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogU1RSSU5HIE1BUCBURVNUCisgICAgICAgKi8KKyAgICAgIG1hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsICJhIiwgICAgIjIiKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsICJiIiwgICAgImJsYWgiKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsICJzb21lIiwgInRoaW5nIik7CisgICAgICBwcmludGYgKCJ0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9vdXQpOworICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCJcIiVzXCIgPT4gXCIlc1wiIiwgKGdjaGFyICopa2V5LCAoZ2NoYXIgKil2YWx1ZSk7CisgICAgICB9CisgICAgICBwcmludGYgKCIpfSIpOworCisgICAgICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zdHJpbmdfbWFwICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKyAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICAgIHByaW50ZiAoIlwiJXNcIiA9PiBcIiVzXCIiLCAoZ2NoYXIgKilrZXksIChnY2hhciAqKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9vdXQpKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGdwb2ludGVyIGluX3ZhbHVlID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCBrZXkpOworICAgICAgICAgICAgaWYgKGluX3ZhbHVlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAgKChnY2hhciAqKWluX3ZhbHVlLCAoZ2NoYXIgKil2YWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7CisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIFNFVCBURVNUCisgICAgICAgKi8KKyAgICAgIHNldF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsIGdfaW50X2VxdWFsLCBnX2ZyZWUsIE5VTEwpOworICAgICAgZm9yIChpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgaTMyX2tleV9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICppMzJfa2V5X3B0cik7CisgICAgICAgICppMzJfa2V5X3B0ciA9IGk7CisKKyAgICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2V0X291dCwgaTMyX2tleV9wdHIsIE5VTEwpOworICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdFNldCh7Iik7CisgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICBrZXlzX291dCA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoc2V0X291dCk7CisgICAgICBrZXlzX2VsZW0gPSBrZXlzX291dDsKKyAgICAgIHdoaWxlIChrZXlzX2VsZW0gIT0gTlVMTCkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgcHJpbnRmICgiJWQiLCAqKGdpbnQzMiAqKWtleXNfZWxlbS0+ZGF0YSk7CisKKyAgICAgICAga2V5c19lbGVtID0ga2V5c19lbGVtLT5uZXh0OworICAgICAgfQorICAgICAgcHJpbnRmICgifSkiKTsKKworICAgICAgc2V0X2luID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLCBnX2ludF9lcXVhbCwgZ19mcmVlLCBOVUxMKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3NldCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAga2V5c19pbiA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoc2V0X2luKTsKKyAgICAgICAga2V5c19lbGVtID0ga2V5c19pbjsKKyAgICAgICAgd2hpbGUgKGtleXNfZWxlbSAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiJWQiLCAqKGdpbnQzMiAqKWtleXNfZWxlbS0+ZGF0YSk7CisKKyAgICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2VsZW0tPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgifVxuIik7CisKKyAgICAgICAgaWYgKGdfbGlzdF9sZW5ndGggKGtleXNfaW4pICE9IGdfbGlzdF9sZW5ndGggKGtleXNfb3V0KSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGtleXNfZWxlbSA9IGtleXNfb3V0OworICAgICAgICAgIHdoaWxlIChrZXlzX2VsZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGdfbGlzdF9maW5kX2N1c3RvbSAoa2V5c19pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNfZWxlbS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMl9jb21wYXJlKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtleXNfZWxlbSA9IGtleXNfZWxlbS0+bmV4dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnX2xpc3RfZnJlZSAoa2V5c19pbik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAoc2V0X2luKTsKKyAgICAgIGdfbGlzdF9mcmVlIChrZXlzX291dCk7CisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHNldF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIExJU1QgVEVTVAorICAgICAgICovCisgICAgICBsaXN0X291dCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChnaW50MzIpKTsKKyAgICAgIGZvciAoaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAobGlzdF9vdXQsIGkpOworICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdExpc3QoeyIpOworICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgZm9yIChpID0gMDsgaSA8IChnaW50MzIpbGlzdF9vdXQtPmxlbjsgKytpKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCIlZCIsIGdfYXJyYXlfaW5kZXggKGxpc3Rfb3V0LCBnaW50MzIsIGkpKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0pIik7CisKKyAgICAgIGxpc3RfaW4gPSBnX2FycmF5X25ldyAoRkFMU0UsIFRSVUUsIHNpemVvZiAoZ2ludDMyKSk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9saXN0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGdpbnQzMilsaXN0X2luLT5sZW47ICsraSkgeworICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICAgIHByaW50ZiAoIiVkIiwgZ19hcnJheV9pbmRleCAobGlzdF9pbiwgZ2ludDMyLCBpKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgifVxuIik7CisKKyAgICAgICAgaWYgKGxpc3RfaW4tPmxlbiAhPSBsaXN0X291dC0+bGVuIHx8CisgICAgICAgICAgICBtZW1jbXAgKGxpc3RfaW4tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGxpc3Rfb3V0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICBsaXN0X2luLT5sZW4gKiBzaXplb2YgKGdpbnQzMikpICE9IDApCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2FycmF5X3VucmVmIChsaXN0X2luKTsKKyAgICAgIGdfYXJyYXlfdW5yZWYgKGxpc3Rfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBFTlVNIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX09ORSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIHByaW50ZigidGVzdEVudW0oVFdPKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2VudW0gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX1RXTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9UV08pCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBwcmludGYoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2VudW0gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX1RIUkVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX1RIUkVFKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2VudW0gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX0ZJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfRklWRSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIHByaW50ZigidGVzdEVudW0oRUlHSFQpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfRUlHSFQpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFRZUEVERUYgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfdHlwZWRlZiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5ODU4MjM1MDgyNTIzTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICUiIFBSSWQ2NCAiXG4iLCB1c2VyX2lkKTsKKyAgICAgICAgaWYgKHVzZXJfaWQgIT0gMzA5ODU4MjM1MDgyNTIzTEwpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIE5FU1RFRCBNQVAgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X21hcF9tYXAgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9pbik7CisKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgcHJpbnRmICgiJWQgPT4geyIsICooZ2ludDMyICopa2V5KTsKKworICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdIYXNoVGFibGUgKil2YWx1ZSk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHByaW50ZiAoIiVkID0+ICVkLCAiLCAqKGdpbnQzMiAqKWtleSwgKihnaW50MzIgKil2YWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgifVxuIik7CisKKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplIChtYXBfaW4pICE9IDIpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnaW50MzIgaW5uZXJfa2V5c1tdID0gezEsIDIsIDMsIDR9OworICAgICAgICAgIGdpbnQzMiBpMzJfa2V5OworCisgICAgICAgICAgaTMyX2tleSA9IC00OworICAgICAgICAgIGlubmVyX21hcF9pbiA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwgJmkzMl9rZXkpOworICAgICAgICAgIGlmIChpbm5lcl9tYXBfaW4gPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfc2l6ZSAoaW5uZXJfbWFwX2luKSAhPSA0KQorICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAga2V5c19pbiA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoaW5uZXJfbWFwX2luKTsKKyAgICAgICAgICAgIGtleXNfaW4gPSBnX2xpc3Rfc29ydCAoa2V5c19pbiwgZ2ludDMyX2NvbXBhcmUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgIGtleXNfZWxlbSA9IGdfbGlzdF9udGggKGtleXNfaW4sIDMgLSBpKTsKKworICAgICAgICAgICAgICBpZiAoKihnaW50MzIgKilrZXlzX2VsZW0tPmRhdGEgIT0gKC0xICogaW5uZXJfa2V5c1tpXSkgfHwKKyAgICAgICAgICAgICAgICAgICooZ2ludDMyICopZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5uZXJfbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzX2VsZW0tPmRhdGEpICE9CisgICAgICAgICAgICAgICAgICAoLTEgKiBpbm5lcl9rZXlzW2ldKSkgeworICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnX2xpc3RfZnJlZSAoa2V5c19pbik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaTMyX2tleSA9IDQ7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmaTMyX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDQpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBrZXlzX2luID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChpbm5lcl9tYXBfaW4pOworICAgICAgICAgICAga2V5c19pbiA9IGdfbGlzdF9zb3J0IChrZXlzX2luLCBnaW50MzJfY29tcGFyZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAga2V5c19lbGVtID0gZ19saXN0X250aCAoa2V5c19pbiwgaSk7CisKKyAgICAgICAgICAgICAgaWYgKCooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhICE9IGlubmVyX2tleXNbaV0gfHwKKyAgICAgICAgICAgICAgICAgICooZ2ludDMyICopZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5uZXJfbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzX2VsZW0tPmRhdGEpICE9CisgICAgICAgICAgICAgICAgICBpbm5lcl9rZXlzW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdfbGlzdF9mcmVlIChrZXlzX2luKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworCisgICAgICAvKioKKyAgICAgICAqIElOU0FOSVRZIFRFU1QKKyAgICAgICAqLworICAgICAgaW5zYW5pdHlfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgICAgICBnX29iamVjdF9nZXQgKGluc2FuaXR5X291dCwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBudW1iZXJ6ID0gVF9URVNUX05VTUJFUlpfRklWRTsKKyAgICAgIG51bWJlcnoyID0gVF9URVNUX05VTUJFUlpfRUlHSFQ7CisgICAgICB1c2VyX2lkX3B0ciA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgICAgICp1c2VyX2lkX3B0ciA9IDU7CisgICAgICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICAgICAqdXNlcl9pZF9wdHIyID0gODsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworCisgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDJMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgeHRydWN0X291dDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiR29vZGJ5ZTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICA0TEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0X291dDIpOworICAgICAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3Rfb3V0KTsKKyAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKworICAgICAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludDY0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50NjRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KWdfaGFzaF90YWJsZV91bnJlZik7CisKKyAgICAgIHByaW50ZigidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9pbnNhbml0eSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2FuaXR5X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9pbik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBwcmludGYgKCIlIiBQUklkNjQgIiA9PiB7IiwgKihUVGVzdFVzZXJJZCAqKWtleSk7CisKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHSGFzaFRhYmxlICopdmFsdWUpOworICAgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgICBwcmludGYgKCIlZCA9PiB7IiwgKFRUZXN0TnVtYmVyeilrZXkpOworCisgICAgICAgICAgICBnX29iamVjdF9nZXQgKChUVGVzdEluc2FuaXR5ICopdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgcHJpbnRmICgieyIpOworICAgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJnVzZXJfbWFwX2l0ZXIsIHVzZXJfbWFwKTsKKyAgICAgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmdXNlcl9tYXBfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiJWQgPT4gJSIgUFJJZDY0ICIsICIsCisgICAgICAgICAgICAgICAgICAgICAgKFRUZXN0TnVtYmVyeilrZXksCisgICAgICAgICAgICAgICAgICAgICAgKihUVGVzdFVzZXJJZCAqKXZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZiAoIn0sICIpOworICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgICAgICAgICAgIHByaW50ZigieyIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChnaW50MzIpeHRydWN0cy0+bGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIGkpOworICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgICAgcHJpbnRmICgie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYgKCJ9Iik7CisgICAgICAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgICAgICAgICAgIHByaW50ZiAoIn0sICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigifVxuIik7CisKKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplIChtYXBfaW4pICE9IDIpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBUVGVzdE51bWJlcnogbnVtYmVyel9rZXlfdmFsdWVzW10gPSB7CisgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9UV08sIFRfVEVTVF9OVU1CRVJaX1RIUkVFCisgICAgICAgICAgfTsKKyAgICAgICAgICBnaW50IHVzZXJfbWFwX3ZhbHVlc1tdID0geyA1LCA4IH07CisgICAgICAgICAgVFRlc3RVc2VySWQgdXNlcl9pZF9rZXk7CisKKyAgICAgICAgICB1c2VyX2lkX2tleSA9IDE7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmdXNlcl9pZF9rZXkpOworICAgICAgICAgIGlmIChpbm5lcl9tYXBfaW4gPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfc2l6ZSAoaW5uZXJfbWFwX2luKSAhPSAyKQorICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnpfa2V5OworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICAgIG51bWJlcnpfa2V5ID0gbnVtYmVyel9rZXlfdmFsdWVzW2ldOworICAgICAgICAgICAgICBpbnNhbml0eV9pbiA9CisgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5uZXJfbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY29uc3Rwb2ludGVyKW51bWJlcnpfa2V5KTsKKyAgICAgICAgICAgICAgaWYgKGluc2FuaXR5X2luID09IE5VTEwpCisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKGluc2FuaXR5X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAodXNlcl9tYXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAodXNlcl9tYXApICE9IDIpCisgICAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyel9rZXkgPSAoVFRlc3ROdW1iZXJ6KXVzZXJfbWFwX3ZhbHVlc1tqXTsKKworICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9sb29rdXAgKHVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjb25zdHBvaW50ZXIpbnVtYmVyel9rZXkpOworICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICooVFRlc3RVc2VySWQgKil2YWx1ZSAhPSAoVFRlc3RVc2VySWQpdXNlcl9tYXBfdmFsdWVzW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoeHRydWN0cy0+bGVuICE9IDIpCisgICAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4dHJ1Y3RfaW4gPSBnX3B0cl9hcnJheV9pbmRleCAoeHRydWN0cywgMCk7CisgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAgKHN0cmluZywgIkdvb2RieWU0IiwgOSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgIT0gNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nICE9IDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyAhPSA0KQorICAgICAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworCisgICAgICAgICAgICAgICAgICAgIHh0cnVjdF9pbiA9IGdfcHRyX2FycmF5X2luZGV4ICh4dHJ1Y3RzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcCAoc3RyaW5nLCAiSGVsbG8yIiwgNykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgIT0gMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nICE9IDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyAhPSAyKQorICAgICAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgdXNlcl9pZF9rZXkgPSAyOworICAgICAgICAgIGlubmVyX21hcF9pbiA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwgJnVzZXJfaWRfa2V5KTsKKyAgICAgICAgICBpZiAoaW5uZXJfbWFwX2luID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3NpemUgKGlubmVyX21hcF9pbikgIT0gMSkKKyAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluc2FuaXR5X2luID0KKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5uZXJfbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NvbnN0cG9pbnRlcilUX1RFU1RfTlVNQkVSWl9TSVgpOworICAgICAgICAgICAgaWYgKGluc2FuaXR5X2luID09IE5VTEwpCisgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKGluc2FuaXR5X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgICAgaWYgKHVzZXJfbWFwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKHVzZXJfbWFwKSAhPSAwKQorICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoeHRydWN0cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMtPmxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmaW5zYW5pdHlfb3V0KTsKKworICAgICAgLyogdGVzdCBleGNlcHRpb24gKi8KKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBwcmludGYgKCIgIHsldSwgXCIlc1wifVxuIiwgaW50MzIsIHN0cmluZyk7CisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBpZiAoeGNlcHRpb24gIT0gTlVMTCkgeworICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgICAgICAgICAgeGNlcHRpb24gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgaWYgKCF0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uID09IE5VTEwgJiYKKyAgICAgICAgICBlcnJvciAhPSBOVUxMKSB7CisgICAgICAgIHByaW50ZiAoIiAgQ2F1Z2h0IFRFeGNlcHRpb25cbiIpOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICAgICAgcHJpbnRmICgiICB2b2lkXG4iKTsKKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICAvKiB0ZXN0IG11bHRpIGV4Y2VwdGlvbiAqLworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICAgICAgaWYgKCF0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9tdWx0aV9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gIT0gTlVMTCAmJgorICAgICAgICAgIHhjZXB0aW9uMiA9PSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcHJpbnRmICgiICB7JXUsIFwiJXNcIn1cbiIsIGludDMyLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgICAgeGNlcHRpb24gPSBOVUxMOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisKKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X211bHRpX2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gPT0gTlVMTCAmJgorICAgICAgICAgIHhjZXB0aW9uMiAhPSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAgICAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsICZpbm5lcl94dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfb2JqZWN0X2dldCAoaW5uZXJfeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBwcmludGYgKCIgIHsldSwge1wiJXNcIn19XG4iLCBpbnQzMiwgc3RyaW5nKTsKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmaW5uZXJfeHRydWN0X2luKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4dHJ1Y3RfaW4pOworCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgIHh0cnVjdF9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9tdWx0aV9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiA9PSBOVUxMICYmCisgICAgICAgICAgeGNlcHRpb24yID09IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAge3tcIiVzXCJ9fVxuIiwgc3RyaW5nKTsKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeHRydWN0X2luKTsKKworICAgICAgLyogdGVzdCBvbmV3YXkgdm9pZCAqLworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0T25ld2F5KDEpID0+Iik7CisgICAgICBnZXR0aW1lb2ZkYXkgKCZvbmV3YXlfc3RhcnQsIE5VTEwpOworICAgICAgb25ld2F5X3Jlc3VsdCA9IHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X29uZXdheSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGdldHRpbWVvZmRheSAoJm9uZXdheV9lbmQsIE5VTEwpOworICAgICAgdGltZXJzdWIgKCZvbmV3YXlfZW5kLCAmb25ld2F5X3N0YXJ0LCAmb25ld2F5X2VsYXBzZWQpOworICAgICAgb25ld2F5X2VsYXBzZWRfdXNlYyA9CisgICAgICAgIG9uZXdheV9lbGFwc2VkLnR2X3NlYyAqIDEwMDAgKiAxMDAwICsgb25ld2F5X2VsYXBzZWQudHZfdXNlYzsKKworICAgICAgaWYgKG9uZXdheV9yZXN1bHQpIHsKKyAgICAgICAgaWYgKG9uZXdheV9lbGFwc2VkX3VzZWMgPiAyMDAgKiAxMDAwKSB7CisgICAgICAgICAgcHJpbnRmICgiICBGQUlMVVJFIC0gdG9vayAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvbmV3YXlfZWxhcHNlZF91c2VjIC8gMTAwMC4wKTsKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpb25ld2F5X2VsYXBzZWRfdXNlYyAvIDEwMDAuMCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogcmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5CisgICAgICAgKiBvbmUiIC0tIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQKKyAgICAgICAqIHRlc3Qgd2lsbCBmYWlsIHNpbmNlIGl0IHdpbGwgZ2V0IHRoZSB2b2lkIGNvbmZpcm1hdGlvbiByYXRoZXIgdGhhbgorICAgICAgICogdGhlIGNvcnJlY3QgcmVzdWx0LiBJbiB0aGlzIGNpcmN1bXN0YW5jZSwgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgdGhlCisgICAgICAgKiBlcnJvcjoKKyAgICAgICAqCisgICAgICAgKiAgIGFwcGxpY2F0aW9uIGVycm9yOiBXcm9uZyBtZXRob2QgbmFtZQorICAgICAgICovCisgICAgICAvKioKKyAgICAgICAqIEkzMiBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInJlLXRlc3QgdGVzdEkzMigtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9pMzIgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBpbnQzMik7CisgICAgICAgIGlmIChpbnQzMiAhPSAtMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdldHRpbWVvZmRheSAoJnRpbWVfc3RvcCwgTlVMTCk7CisgICAgICB0aW1lcnN1YiAoJnRpbWVfc3RvcCwgJnRpbWVfc3RhcnQsICZ0aW1lX2VsYXBzZWQpOworICAgICAgdGltZV9lbGFwc2VkX3VzZWMgPQorICAgICAgICB0aW1lX2VsYXBzZWQudHZfc2VjICogMTAwMCAqIDEwMDAgKyB0aW1lX2VsYXBzZWQudHZfdXNlYzsKKworICAgICAgcHJpbnRmKCJUb3RhbCB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9lbGFwc2VkX3VzZWMpOworCisgICAgICB0aW1lX3RvdGFsX3VzZWMgKz0gdGltZV9lbGFwc2VkX3VzZWM7CisgICAgICBpZiAodGltZV9lbGFwc2VkX3VzZWMgPCB0aW1lX21pbl91c2VjKQorICAgICAgICB0aW1lX21pbl91c2VjID0gdGltZV9lbGFwc2VkX3VzZWM7CisgICAgICBpZiAodGltZV9lbGFwc2VkX3VzZWMgPiB0aW1lX21heF91c2VjKQorICAgICAgICB0aW1lX21heF91c2VjID0gdGltZV9lbGFwc2VkX3VzZWM7CisKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwcmludGYgKCJDb25uZWN0IGZhaWxlZDogJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICAvKiBBbGwgZG9uZS0tLW91dHB1dCBzdGF0aXN0aWNzICovCisgIHB1dHMgKCJcbkFsbCB0ZXN0cyBkb25lLiIpOworICBwcmludGYoIk51bWJlciBvZiBmYWlsdXJlczogJWRcbiIsIGZhaWxfY291bnQpOworCisgIHRpbWVfYXZnX3VzZWMgPSB0aW1lX3RvdGFsX3VzZWMgLyBudW1fdGVzdHM7CisKKyAgcHJpbnRmICgiTWluIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21pbl91c2VjKTsKKyAgcHJpbnRmICgiTWF4IHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21heF91c2VjKTsKKyAgcHJpbnRmICgiQXZnIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2F2Z191c2VjKTsKKworICBnX2NsZWFyX29iamVjdCgmc2Vjb25kX3NlcnZpY2UpOworICBnX2NsZWFyX29iamVjdCgmcHJvdG9jb2wyKTsKKyAgZ19jbGVhcl9vYmplY3QoJnRlc3RfY2xpZW50KTsKKyAgZ19jbGVhcl9vYmplY3QoJnByb3RvY29sKTsKKyAgZ19jbGVhcl9vYmplY3QoJnRyYW5zcG9ydCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzb2NrZXQpOworCisgIGlmIChzc2wpIHsKKyAgICB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKCk7CisgIH0KKworICByZXR1cm4gZmFpbF9jb3VudDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3MTZlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCisjaW5jbHVkZSAidGhyaWZ0X3Rlc3RfaGFuZGxlci5oIgorI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIE91ciBzZXJ2ZXIgb2JqZWN0LCBkZWNsYXJlZCBnbG9iYWxseSBzbyBpdCBpcyBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgU0lHSU5UCisgICBzaWduYWwgaGFuZGxlciAqLworVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCisvKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VydmVyIHdhcyBpbnRlcnJ1cHRlZCB3aXRoIFNJR0lOVAorICAgKGkuZS4gQ3RybC1DKSBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyIGl0cyB0ZXJtaW5hdGlvbiB3YXMgYWJub3JtYWwgKi8KK2dib29sZWFuIHNpZ2ludF9yZWNlaXZlZCA9IEZBTFNFOworCisvKiBIYW5kbGUgU0lHSU5UICgiQ3RybC1DIikgc2lnbmFscyBieSBncmFjZWZ1bGx5IHN0b3BwaW5nIHRoZSBzZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkCitzaWdpbnRfaGFuZGxlciAoaW50IHNpZ25hbF9udW1iZXIpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzaWduYWxfbnVtYmVyKTsKKworICAvKiBUYWtlIG5vdGUgd2Ugd2VyZSBjYWxsZWQgKi8KKyAgc2lnaW50X3JlY2VpdmVkID0gVFJVRTsKKworICAvKiBTaHV0IGRvd24gdGhlIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIGlmIChzZXJ2ZXIgIT0gTlVMTCkKKyAgICB0aHJpZnRfc2VydmVyX3N0b3AgKHNlcnZlcik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdGF0aWMgZ2ludCAgIHBvcnQgPSA5MDkwOworICBzdGF0aWMgZ2NoYXIgKnNlcnZlcl90eXBlX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnY2hhciAqdHJhbnNwb3J0X29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnY2hhciAqcHJvdG9jb2xfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdpbnQgICBzdHJpbmdfbGltaXQgPSAwOworICBzdGF0aWMgZ2ludCAgIGNvbnRhaW5lcl9saW1pdCA9IDA7CisKKyAgc3RhdGljCisgICAgR09wdGlvbkVudHJ5IG9wdGlvbl9lbnRyaWVzW10gPSB7CisgICAgeyAicG9ydCIsICAgICAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmcG9ydCwKKyAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0ICg9OTA5MCkiLCBOVUxMIH0sCisgICAgeyAic2VydmVyLXR5cGUiLCAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmc2VydmVyX3R5cGVfb3B0aW9uLAorICAgICAgIlR5cGUgb2Ygc2VydmVyOiBzaW1wbGUgKD1zaW1wbGUpIiwgTlVMTCB9LAorICAgIHsgInRyYW5zcG9ydCIsICAgICAgIDAsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnRyYW5zcG9ydF9vcHRpb24sCisgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkICg9YnVmZmVyZWQpIiwgTlVMTCB9LAorICAgIHsgInByb3RvY29sIiwgICAgICAgIDAsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0ICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJzdHJpbmctbGltaXQiLCAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZzdHJpbmdfbGltaXQsCisgICAgICAiTWF4IHN0cmluZyBsZW5ndGggKD1ub25lKSIsIE5VTEwgfSwKKyAgICB7ICJjb250YWluZXItbGltaXQiLCAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZjb250YWluZXJfbGltaXQsCisgICAgICAiTWF4IGNvbnRhaW5lciBsZW5ndGggKD1ub25lKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwgfQorICB9OworCisgIGdjaGFyICpzZXJ2ZXJfbmFtZSAgICAgICAgICAgID0gInNpbXBsZSI7CisgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSAgICAgICAgID0gImJ1ZmZlcmVkIjsKKyAgR1R5cGUgIHRyYW5zcG9ydF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWTsKKyAgZ2NoYXIgKnByb3RvY29sX25hbWUgICAgICAgICAgPSAiYmluYXJ5IjsKKyAgR1R5cGUgIHByb3RvY29sX2ZhY3RvcnlfdHlwZSAgPSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWTsKKworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyICpoYW5kbGVyOworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyICpoYW5kbGVyX3NlY29uZF9zZXJ2aWNlID0gTlVMTDsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3JfdGVzdCA9IE5VTEw7CisgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAgKnNlcnZlcl90cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgICpwcm90b2NvbF9mYWN0b3J5OworCisgIHN0cnVjdCBzaWdhY3Rpb24gc2lnaW50X2FjdGlvbjsKKworICBHT3B0aW9uQ29udGV4dCAqb3B0aW9uX2NvbnRleHQ7CisgIGdib29sZWFuICAgICAgICBvcHRpb25zX3ZhbGlkID0gVFJVRTsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogQ29uZmlndXJlIGFuZCBwYXJzZSBvdXIgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KKyAgb3B0aW9uX2NvbnRleHQgPSBnX29wdGlvbl9jb250ZXh0X25ldyAoTlVMTCk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmIChnX29wdGlvbl9jb250ZXh0X3BhcnNlIChvcHRpb25fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpID09IEZBTFNFKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICByZXR1cm4gMjU1OworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAob3B0aW9uX2NvbnRleHQpOworCisgIC8qIFZhbGlkYXRlIHRoZSBwYXJzZWQgb3B0aW9ucyAqLworICBpZiAoc2VydmVyX3R5cGVfb3B0aW9uICE9IE5VTEwgJiYKKyAgICAgIHN0cm5jbXAgKHNlcnZlcl90eXBlX29wdGlvbiwgInNpbXBsZSIsIDcpICE9IDApIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHNlcnZlciB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0IjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGkiLCA2KSA9PSAwKSB7CisJcHJvdG9jb2xfbmFtZSA9ICJiaW5hcnk6bXVsdGkiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aWMiLCA3KSA9PSAwKSB7CisJcHJvdG9jb2xfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZOworCXByb3RvY29sX25hbWUgPSAiY29tcGFjdDptdWx0aWMiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHByb3RvY29sIHR5cGUgJXNcbiIsIHByb3RvY29sX29wdGlvbik7CisgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKHRyYW5zcG9ydF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wICh0cmFuc3BvcnRfb3B0aW9uLCAiZnJhbWVkIiwgNykgPT0gMCkgeworICAgICAgdHJhbnNwb3J0X2ZhY3RvcnlfdHlwZSA9IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWTsKKyAgICAgIHRyYW5zcG9ydF9uYW1lID0gImZyYW1lZCI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJidWZmZXJlZCIsIDkpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gdHJhbnNwb3J0IHR5cGUgJXNcbiIsIHRyYW5zcG9ydF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICghb3B0aW9uc192YWxpZCkKKyAgICByZXR1cm4gMjU0OworCisgIC8qIEVzdGFibGlzaCBhbGwgb3VyIGNvbm5lY3Rpb24gb2JqZWN0cyAqLworICBoYW5kbGVyICAgICAgICAgICA9IGdfb2JqZWN0X25ldyAoVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworCisgIGlmKHN0cnN0cihwcm90b2NvbF9uYW1lLCAiOm11bHRpIikpeworICAgICAgLyogV2hlbiBhIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyBpbnZvbHZlZCB0aGUgaGFuZGxlciBpcyBub3QKKyAgICAgICAgIHJlZ2lzdGVyZWQgYXMgdXN1YWwuIFdlIGNyZWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGUgcmVhbAorICAgICAgICAgcHJvY2Vzc29yIGlzIHJlZ2lzdGVyZWQuIE11bHRpcGxlIHByb2Nlc3NvcnMgY2FuIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgIGF0IG9uY2UuIFRoaXMgaXMgd2h5IHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBwcm9wZXJ0eSAqLworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsCisJCQkJCSBOVUxMKTsKKworICAgICAgaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLAorICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByb2Nlc3Nvcl90ZXN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKwkJCQkgICAgTlVMTCk7CisgICAgICBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UsCisJCQkJICAgIE5VTEwpOworCisgICAgICAvKiBXZSByZWdpc3RlciBhIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBUaHJpZnRUZXN0ICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlRocmlmdFRlc3QiLCBwcm9jZXNzb3JfdGVzdCwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorICAgICAgLyogV2UgcmVnaXN0ZXIgYSBzZWNvbmQgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFNlY29uZFNlcnZpY2UKKyAgICAgICAqIHdlIGFyZSByZXNwb25zaWJsZSBvZiBmcmVlaW5nIHRoZSBwcm9jZXNzb3Igd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiU2Vjb25kU2VydmljZSIsIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorCisgIH1lbHNleworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CisgIHNlcnZlcl90cmFuc3BvcnQgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHN0cnN0ciAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3QiKSAhPSBOVUxMKSB7CisgICAgcHJvdG9jb2xfZmFjdG9yeSAgPSBnX29iamVjdF9uZXcgKHByb3RvY29sX2ZhY3RvcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ19saW1pdCIsIHN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5lcl9saW1pdCIsIGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcHJvdG9jb2xfZmFjdG9yeSAgPSBnX29iamVjdF9uZXcgKHByb3RvY29sX2ZhY3RvcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0KKworICBzZXJ2ZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3RyYW5zcG9ydCIsICAgICAgICAgc2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEluc3RhbGwgb3VyIFNJR0lOVCBoYW5kbGVyLCB3aGljaCBoYW5kbGVzIEN0cmwtQyBiZWluZyBwcmVzc2VkIGJ5IHN0b3BwaW5nCisgICAgIHRoZSBzZXJ2ZXIgZ3JhY2VmdWxseSAqLworICBtZW1zZXQgKCZzaWdpbnRfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ2ludF9hY3Rpb24pKTsKKyAgc2lnaW50X2FjdGlvbi5zYV9oYW5kbGVyID0gc2lnaW50X2hhbmRsZXI7CisgIHNpZ2ludF9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CisgIHNpZ2FjdGlvbiAoU0lHSU5ULCAmc2lnaW50X2FjdGlvbiwgTlVMTCk7CisKKyAgcHJpbnRmICgiU3RhcnRpbmcgXCIlc1wiIHNlcnZlciAoJXMvJXMpIGxpc3RlbiBvbjogJWRcbiIsCisgICAgICAgICAgc2VydmVyX25hbWUsCisgICAgICAgICAgdHJhbnNwb3J0X25hbWUsCisgICAgICAgICAgcHJvdG9jb2xfbmFtZSwKKyAgICAgICAgICBwb3J0KTsKKyAgZmZsdXNoIChzdGRvdXQpOworCisgIC8qIFNlcnZlIGNsaWVudHMgdW50aWwgU0lHSU5UIGlzIHJlY2VpdmVkIChDdHJsLUMgaXMgcHJlc3NlZCkgKi8KKyAgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoc2VydmVyLCAmZXJyb3IpOworCisgIC8qIElmIHRoZSBzZXJ2ZXIgc3RvcHBlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGJlaW5nIGludGVycnVwdGVkIGJ5IHRoZQorICAgICB1c2VyLCByZXBvcnQgdGhlIGVycm9yICovCisgIGlmICghc2lnaW50X3JlY2VpdmVkKSB7CisgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NlcnZlcl9zZXJ2ZTogJXMiLAorICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgIH0KKworICBwdXRzICgiZG9uZS4iKTsKKworICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sX2ZhY3RvcnkpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOworICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgIGlmKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpOworICB9CisgIGlmKHByb2Nlc3Nvcl90ZXN0KXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3JfdGVzdCk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChTZWNvbmRTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXIsCisJICAgICAgIFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpOworCisKK2dib29sZWFuCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nIChUVGVzdFNlY29uZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIGdjaGFyIGJ1ZmZlclsyNTZdOworCisgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICAgIFRfVEVTVF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKworICBiYXNlX2NsYXNzLT5zZWNvbmR0ZXN0X3N0cmluZyA9CisgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nOworCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorI2RlZmluZSBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiAoc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIFNlY29uZFNlcnZpY2VIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzczsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudDsKKworfTsKKworLyogVXNlZCBieSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9ibGFoX2JsYWggKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgR0Vycm9yICoqZXJyb3IpOworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBnY2hhciAqKiBfcmV0dXJuLCBjb25zdCBnY2hhciAqIHRoaW5nLCBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhiY2IyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYwpAQCAtMCwwICsxLDgzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0VGhyaWZ0VGVzdElmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChUaHJpZnRUZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgIHRocmlmdF90ZXN0X2hhbmRsZXIsCisgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSKTsKKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF92b2lkIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdFZvaWQoKVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gZ19zdHJkdXAgKHRoaW5nKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ib29sIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEJvb2woJXMpXG4iLCB0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2J5dGUgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDggICAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0Qnl0ZSglZClcbiIsIChnaW50KXRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pMzIgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0STMyKCVkKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2k2NCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCAgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RJNjQoJSIgUFJJZDY0ICIpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdERvdWJsZSglZilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4gCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5IChUVGVzdFRocmlmdFRlc3RJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQnl0ZUFycmF5ICoqIF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQnl0ZUFycmF5ICogdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0QmluYXJ5KClcbiIpOyAgLy8gVE9ETzogaGV4IG91dHB1dAorICBnX2J5dGVfYXJyYXlfcmVmKChHQnl0ZUFycmF5ICopdGhpbmcpOworICAqX3JldHVybiA9IChHQnl0ZUFycmF5ICopdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIGdjaGFyICpzdHJpbmdfdGhpbmcgPSBOVUxMOworICBnaW50ICAgYnl0ZV90aGluZzsKKyAgZ2ludCAgIGkzMl90aGluZzsKKyAgZ2ludDY0IGk2NF90aGluZzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfb2JqZWN0X2dldCAoKFRUZXN0WHRydWN0ICopdGhpbmcsCisgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHByaW50ZiAoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAorICAgICAgICAgIHN0cmluZ190aGluZywKKyAgICAgICAgICAoZ2ludClieXRlX3RoaW5nLAorICAgICAgICAgIGkzMl90aGluZywKKyAgICAgICAgICBpNjRfdGhpbmcpOworCisgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIHN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICBpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHN0cmluZ190aGluZyAhPSBOVUxMKQorICAgIGdfZnJlZSAoc3RyaW5nX3RoaW5nKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9uZXN0IChUVGVzdFRocmlmdFRlc3RJZiAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdDIgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0MiAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQoreworICBnY2hhciAqaW5uZXJfc3RyaW5nX3RoaW5nID0gTlVMTDsKKyAgZ2ludCAgIGJ5dGVfdGhpbmcsIGlubmVyX2J5dGVfdGhpbmc7CisgIGdpbnQgICBpMzJfdGhpbmcsIGlubmVyX2kzMl90aGluZzsKKyAgZ2ludDY0IGlubmVyX2k2NF90aGluZzsKKyAgVFRlc3RYdHJ1Y3QgKnN0cnVjdF90aGluZzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfb2JqZWN0X2dldCAoKFRUZXN0WHRydWN0MiAqKXRoaW5nLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZpbm5lcl9zdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZpbm5lcl9ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaW5uZXJfaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaW5uZXJfaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHByaW50ZiAoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICVkfSlcbiIsCisgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICBpbm5lcl9zdHJpbmdfdGhpbmcsCisgICAgICAgICAgaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICBpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgaW5uZXJfaTY0X3RoaW5nLAorICAgICAgICAgIGkzMl90aGluZyk7CisKKyAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKGlubmVyX3N0cmluZ190aGluZyAhPSBOVUxMKQorICAgIGdfZnJlZSAoaW5uZXJfc3RyaW5nX3RoaW5nKTsKKyAgZ19vYmplY3RfdW5yZWYgKHN0cnVjdF90aGluZyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIEdIYXNoVGFibGVJdGVyIGhhc2hfdGFibGVfaXRlcjsKKyAgZ3BvaW50ZXIga2V5OworICBncG9pbnRlciB2YWx1ZTsKKyAgZ2Jvb2xlYW4gZmlyc3QgPSBUUlVFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdE1hcCh7Iik7CisgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIChHSGFzaFRhYmxlICopdGhpbmcpOworICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgZ2ludDMyICpuZXdfa2V5OworICAgIGdpbnQzMiAqbmV3X3ZhbHVlOworCisgICAgaWYgKGZpcnN0KQorICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICBwcmludGYgKCIsICIpOworCisgICAgcHJpbnRmICgiJWQgPT4gJWQiLCAqKGdpbnQzMiAqKWtleSwgKihnaW50MzIgKil2YWx1ZSk7CisKKyAgICBuZXdfa2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqbmV3X2tleSk7CisgICAgKm5ld19rZXkgPSAqKGdpbnQzMiAqKWtleTsKKyAgICBuZXdfdmFsdWUgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfdmFsdWUpOworICAgICpuZXdfdmFsdWUgPSAqKGdpbnQzMiAqKXZhbHVlOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBuZXdfa2V5LCBuZXdfdmFsdWUpOworICB9CisgIHByaW50ZiAoIn0pXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmdfbWFwIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIEdIYXNoVGFibGVJdGVyIGhhc2hfdGFibGVfaXRlcjsKKyAgZ3BvaW50ZXIga2V5OworICBncG9pbnRlciB2YWx1ZTsKKyAgZ2Jvb2xlYW4gZmlyc3QgPSBUUlVFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdFN0cmluZ01hcCh7Iik7CisgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIChHSGFzaFRhYmxlICopdGhpbmcpOworICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgZ2NoYXIgKm5ld19rZXk7CisgICAgZ2NoYXIgKm5ld192YWx1ZTsKKworICAgIGlmIChmaXJzdCkKKyAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgIHByaW50ZiAoIiVzID0+ICVzIiwgKGdjaGFyICopa2V5LCAoZ2NoYXIgKil2YWx1ZSk7CisKKyAgICBuZXdfa2V5ID0gZ19zdHJkdXAgKChnY2hhciAqKWtleSk7CisgICAgbmV3X3ZhbHVlID0gZ19zdHJkdXAgKChnY2hhciAqKXZhbHVlKTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgbmV3X2tleSwgbmV3X3ZhbHVlKTsKKyAgfQorICBwcmludGYgKCJ9KVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc2V0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIEdIYXNoVGFibGVJdGVyIGhhc2hfdGFibGVfaXRlcjsKKyAgZ3BvaW50ZXIga2V5OworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0U2V0KHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKEdIYXNoVGFibGUgKil0aGluZyk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgZ2ludDMyICpuZXdfa2V5OworCisgICAgaWYgKGZpcnN0KQorICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICBwcmludGYgKCIsICIpOworCisgICAgcHJpbnRmICgiJWQiLCAqKGdpbnQzMiAqKWtleSk7CisKKyAgICBuZXdfa2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqbmV3X2tleSk7CisgICAgKm5ld19rZXkgPSAqKGdpbnQzMiAqKWtleTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgbmV3X2tleSwgTlVMTCk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2xpc3QgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdBcnJheSAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgZ3VpbnQgaTsKKyAgZ2Jvb2xlYW4gZmlyc3QgPSBUUlVFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdExpc3QoeyIpOworICBmb3IgKGkgPSAwOyBpIDwgdGhpbmctPmxlbjsgaSArPSAxKSB7CisgICAgZ2ludDMyIHZhbHVlOworICAgIGdpbnQzMiAqbmV3X3ZhbHVlOworCisgICAgaWYgKGZpcnN0KQorICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICBwcmludGYgKCIsICIpOworCisgICAgdmFsdWUgPSBnX2FycmF5X2luZGV4ICh0aGluZywgZ2ludDMyLCBpKTsKKyAgICBwcmludGYgKCIlZCIsIHZhbHVlKTsKKworICAgIG5ld192YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKm5ld192YWx1ZSk7CisgICAgKm5ld192YWx1ZSA9IHZhbHVlOworICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoKl9yZXR1cm4sICpuZXdfdmFsdWUpOworICB9CisgIHByaW50ZiAoIn0pXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9lbnVtIChUVGVzdFRocmlmdFRlc3RJZiAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdE51bWJlcnogICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3R5cGVkZWYgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RVc2VySWQgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXBfbWFwIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgIGhlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIEdIYXNoVGFibGUgKnBvc2l0aXZlOworICBHSGFzaFRhYmxlICpuZWdhdGl2ZTsKKyAgZ2ludDMyICprZXk7CisgIGdpbnQzMiAqdmFsdWU7CisgIGd1aW50IGk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOworCisgIHBvc2l0aXZlID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworICBuZWdhdGl2ZSA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKworICBmb3IgKGkgPSAxOyBpIDwgNTsgaSArPSAxKSB7CisgICAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgICB2YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKnZhbHVlKTsKKyAgICAqa2V5ID0gaTsKKyAgICAqdmFsdWUgPSBpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHBvc2l0aXZlLCBrZXksIHZhbHVlKTsKKworICAgIGtleSA9IGdfbWFsbG9jIChzaXplb2YgKmtleSk7CisgICAgdmFsdWUgPSBnX21hbGxvYyAoc2l6ZW9mICp2YWx1ZSk7CisgICAgKmtleSA9IC1pOworICAgICp2YWx1ZSA9IC1pOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG5lZ2F0aXZlLCBrZXksIHZhbHVlKTsKKyAgfQorCisgIGtleSA9IGdfbWFsbG9jIChzaXplb2YgKmtleSk7CisgICprZXkgPSA0OworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwga2V5LCBwb3NpdGl2ZSk7CisKKyAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgKmtleSA9IC00OworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwga2V5LCBuZWdhdGl2ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0SW5zYW5pdHkgICphcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKQoreworICBUVGVzdFh0cnVjdCAqeHRydWN0X2luOworCisgIGdjaGFyICpzdHJpbmdfdGhpbmcgPSBOVUxMOworICBnaW50ICAgYnl0ZV90aGluZzsKKyAgZ2ludCAgIGkzMl90aGluZzsKKyAgZ2ludDY0IGk2NF90aGluZzsKKworICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgVFRlc3RJbnNhbml0eSAqbG9vbmV5OworCisgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICBHSGFzaFRhYmxlICpmaXJzdF9tYXA7CisgIEdIYXNoVGFibGUgKnNlY29uZF9tYXA7CisKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBHSGFzaFRhYmxlSXRlciBpbm5lcl9oYXNoX3RhYmxlX2l0ZXI7CisgIEdIYXNoVGFibGVJdGVyIHVzZXJfbWFwX2l0ZXI7CisKKyAgZ3BvaW50ZXIga2V5OworICBncG9pbnRlciB2YWx1ZTsKKworICBUVGVzdFVzZXJJZCAqdXNlcl9pZDsKKworICBndWludCBpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEluc2FuaXR5KClcbiIpOworCisgIGZpcnN0X21hcCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2Vjb25kX21hcCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19kaXJlY3RfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVmKTsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChmaXJzdF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfVFdPKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKWFyZ3VtZW50KTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RIUkVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKWFyZ3VtZW50KTsKKworICAvKiBJbmNyZW1lbnQgYXJndW1lbnQncyByZWYgY291bnQgYnkgdHdvIGJlY2F1c2UgZmlyc3RfbWFwIG5vdyBob2xkcworICAgICB0d28gcmVmZXJlbmNlcyB0byBpdCBhbmQgdGhlIGNhbGxlciBpcyBub3QgYXdhcmUgd2UgaGF2ZSBtYWRlIGFueQorICAgICBhZGRpdGlvbmFsIHJlZmVyZW5jZXMgdG8gYXJndW1lbnQuICAoVGhhdCBpcywgY2FsbGVyIG93bnMgYXJndW1lbnQKKyAgICAgYW5kIHdpbGwgdW5yZWYgaXQgZXhwbGljaXRseSBpbiBhZGRpdGlvbiB0byB1bnJlZi1pbmcgKl9yZXR1cm4uKQorCisgICAgIFdlIGRvIHRoaXMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNvcHkgb2YgYXJndW1lbnQgaW4gb3JkZXIgdG8gbWltaWMKKyAgICAgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiAoYW5kIHNpbmNlLCBmcmFua2x5LCB0aGUgd29ybGQgbmVlZHMgbGVzcworICAgICBhcmd1bWVudCwgbm90IG1vcmUpLiAqLworICBnX29iamVjdF9yZWYgKChncG9pbnRlcilhcmd1bWVudCk7CisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKKworICBsb29uZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vjb25kX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9TSVgpLAorICAgICAgICAgICAgICAgICAgICAgICBsb29uZXkpOworCisgIHVzZXJfaWQgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkKTsKKyAgKnVzZXJfaWQgPSAxOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgdXNlcl9pZCwgZmlyc3RfbWFwKTsKKworICB1c2VyX2lkID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZCk7CisgICp1c2VyX2lkID0gMjsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIHVzZXJfaWQsIHNlY29uZF9tYXApOworCisgIHByaW50ZiAoInJldHVybiIpOworICBwcmludGYgKCIgPSB7Iik7CisgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsICpfcmV0dXJuKTsKKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgIHByaW50ZiAoIiUiIFBSSWQ2NCAiID0+IHsiLCAqKFRUZXN0VXNlcklkICopa2V5KTsKKworICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdIYXNoVGFibGUgKil2YWx1ZSk7CisgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgIHByaW50ZiAoIiVkID0+IHsiLCAoVFRlc3ROdW1iZXJ6KWtleSk7CisKKyAgICAgIGdfb2JqZWN0X2dldCAoKFRUZXN0SW5zYW5pdHkgKil2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBwcmludGYgKCJ7Iik7CisgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmdXNlcl9tYXBfaXRlciwgdXNlcl9tYXApOworICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZ1c2VyX21hcF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICBwcmludGYgKCIlZCA9PiAlIiBQUklkNjQgIiwgIiwKKyAgICAgICAgICAgICAgICAoVFRlc3ROdW1iZXJ6KWtleSwKKyAgICAgICAgICAgICAgICAqKFRUZXN0VXNlcklkICopdmFsdWUpOworICAgICAgfQorICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICAgICAgcHJpbnRmICgieyIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHh0cnVjdHMtPmxlbjsgKytpKSB7CisgICAgICAgIHh0cnVjdF9pbiA9IGdfcHRyX2FycmF5X2luZGV4ICh4dHJ1Y3RzLCBpKTsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHByaW50ZiAoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgIHN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmcpOworICAgICAgfQorICAgICAgcHJpbnRmICgifSIpOworICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICB9CisgICAgcHJpbnRmICgifSwgIik7CisgIH0KKyAgcHJpbnRmICgifVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGkgKFRUZXN0VGhyaWZ0VGVzdElmICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICphcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGFyZzMpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJnNCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChhcmc1KTsKKworICBwcmludGYgKCJ0ZXN0TXVsdGkoKVxuIik7CisKKyAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgZ19zdHJkdXAgKCJIZWxsbzIiKSwKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgYXJnMCwKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgYXJnMSwKKyAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgYXJnMiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9leGNlcHRpb24gKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisKKyAgVFRlc3RYdHJ1Y3QgKnh0cnVjdDsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHByaW50ZiAoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcpOworCisgIC8qIFVubGlrZSBhcmd1bWVudCBvYmplY3RzLCBleGNlcHRpb24gb2JqZWN0cyBhcmUgbm90IHByZS1jcmVhdGVkICovCisgIGdfYXNzZXJ0ICgqZXJyMSA9PSBOVUxMKTsKKworICBpZiAoc3RybmNtcCAoYXJnLCAiWGNlcHRpb24iLCA5KSA9PSAwKSB7CisgICAgLyogIlRocm93IiBhIGN1c3RvbSBleGNlcHRpb246IFNldCB0aGUgY29ycmVzcG9uZGluZyBleGNlcHRpb24KKyAgICAgICBhcmd1bWVudCwgc2V0ICplcnJvciB0byBOVUxMIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAqZXJyMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICAgZ19zdHJkdXAgKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICplcnJvciA9IE5VTEw7CisgICAgcmVzdWx0ID0gRkFMU0U7CisgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnLCAiVEV4Y2VwdGlvbiIsIDExKSA9PSAwKSB7CisgICAgLyogIlRocm93IiBhIGdlbmVyaWMgVEV4Y2VwdGlvbiAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24pOiBTZXQKKyAgICAgICBhbGwgZXhjZXB0aW9uIGFyZ3VtZW50cyB0byBOVUxMLCBzZXQgKmVycm9yIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAqZXJyMSA9IE5VTEw7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICgpLAorICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgICJEZWZhdWx0IFRFeGNlcHRpb24uIik7CisgICAgcmVzdWx0ID0gRkFMU0U7CisgIH0KKyAgZWxzZSB7CisgICAgKmVycjEgPSBOVUxMOworICAgICplcnJvciA9IE5VTEw7CisKKyAgICAvKiBUaGlzIGNvZGUgaXMgZHVwbGljYXRlZCBmcm9tIHRoZSBDKysgdGVzdCBzdWl0ZSwgdGhvdWdoIGl0CisgICAgICAgYXBwZWFycyB0byBzZXJ2ZSBubyBwdXJwb3NlICovCisgICAgeHRydWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgZ19zdHJkdXAgKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoeHRydWN0KTsKKworICAgIHJlc3VsdCA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpX2V4Y2VwdGlvbiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24yICAgICoqZXJyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgVFRlc3RYdHJ1Y3QgKnN0cnVjdF90aGluZzsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHByaW50ZiAoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLCBhcmcxKTsKKworICBnX2Fzc2VydCAoKmVycjEgPT0gTlVMTCk7CisgIGdfYXNzZXJ0ICgqZXJyMiA9PSBOVUxMKTsKKworICBpZiAoc3RybmNtcCAoYXJnMCwgIlhjZXB0aW9uIiwgOCkgPT0gMCAmJiBzdHJsZW4oYXJnMCkgPT0gOCkgeworICAgICplcnIxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsIDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICBnX3N0cmR1cCAoIlRoaXMgaXMgYW4gWGNlcHRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcmVzdWx0ID0gRkFMU0U7CisgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMCwgIlhjZXB0aW9uMiIsIDkpID09IDApIHsKKyAgICAqZXJyMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBnX29iamVjdF9nZXQgKCplcnIyLAorICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsICZzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoIlRoaXMgaXMgYW4gWGNlcHRpb24yIiksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKCplcnIyLAorICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsIHN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChzdHJ1Y3RfdGhpbmcpOworCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIH0KKyAgZWxzZSB7CisgICAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoYXJnMSksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICByZXN1bHQgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9vbmV3YXkgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgIHNlY29uZHNUb1NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNlY29uZHNUb1NsZWVwKTsKKyAgc2xlZXAgKHNlY29uZHNUb1NsZWVwKTsKKyAgcHJpbnRmICgidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzZWNvbmRzVG9TbGVlcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdGVzdF9oYW5kbGVyX2luaXQgKFRocmlmdFRlc3RIYW5kbGVyICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdGVzdF9oYW5kbGVyX2NsYXNzX2luaXQgKFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MgKmtsYXNzKQoreworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MgKmJhc2VfY2xhc3MgPQorICAgIFRfVEVTVF9USFJJRlRfVEVTVF9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKyAgYmFzZV9jbGFzcy0+dGVzdF92b2lkID0KKyAgICBrbGFzcy0+dGVzdF92b2lkID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfdm9pZDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9zdHJpbmcgPQorICAgIGtsYXNzLT50ZXN0X3N0cmluZyA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZzsKKyAgYmFzZV9jbGFzcy0+dGVzdF9ib29sID0KKyAgICBrbGFzcy0+dGVzdF9ib29sID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYm9vbDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9ieXRlID0KKyAgICBrbGFzcy0+dGVzdF9ieXRlID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYnl0ZTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9pMzIgPQorICAgIGtsYXNzLT50ZXN0X2kzMiA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2kzMjsKKyAgYmFzZV9jbGFzcy0+dGVzdF9pNjQgPQorICAgIGtsYXNzLT50ZXN0X2k2NCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2k2NDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9kb3VibGUgPQorICAgIGtsYXNzLT50ZXN0X2RvdWJsZSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2RvdWJsZTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9iaW5hcnkgPQorICAgIGtsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2JpbmFyeTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9zdHJ1Y3QgPQorICAgIGtsYXNzLT50ZXN0X3N0cnVjdCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cnVjdDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9uZXN0ID0KKyAgICBrbGFzcy0+dGVzdF9uZXN0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbmVzdDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9tYXAgPQorICAgIGtsYXNzLT50ZXN0X21hcCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9zdHJpbmdfbWFwID0KKyAgICBrbGFzcy0+dGVzdF9zdHJpbmdfbWFwID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nX21hcDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9zZXQgPQorICAgIGtsYXNzLT50ZXN0X3NldCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3NldDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9saXN0ID0KKyAgICBrbGFzcy0+dGVzdF9saXN0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbGlzdDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9lbnVtID0KKyAgICBrbGFzcy0+dGVzdF9lbnVtID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZW51bTsKKyAgYmFzZV9jbGFzcy0+dGVzdF90eXBlZGVmID0KKyAgICBrbGFzcy0+dGVzdF90eXBlZGVmID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfdHlwZWRlZjsKKyAgYmFzZV9jbGFzcy0+dGVzdF9tYXBfbWFwID0KKyAgICBrbGFzcy0+dGVzdF9tYXBfbWFwID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwX21hcDsKKyAgYmFzZV9jbGFzcy0+dGVzdF9pbnNhbml0eSA9CisgICAga2xhc3MtPnRlc3RfaW5zYW5pdHkgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9tdWx0aSA9CisgICAga2xhc3MtPnRlc3RfbXVsdGkgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9leGNlcHRpb24gPQorICAgIGtsYXNzLT50ZXN0X2V4Y2VwdGlvbiA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2V4Y2VwdGlvbjsKKyAgYmFzZV9jbGFzcy0+dGVzdF9tdWx0aV9leGNlcHRpb24gPQorICAgIGtsYXNzLT50ZXN0X211bHRpX2V4Y2VwdGlvbiA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpX2V4Y2VwdGlvbjsKKyAgYmFzZV9jbGFzcy0+dGVzdF9vbmV3YXkgPQorICAgIGtsYXNzLT50ZXN0X29uZXdheSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X29uZXdheTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGNiMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVNUX0hBTkRMRVJfSAorI2RlZmluZSBfVEhSSUZUX1RFU1RfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0VGhyaWZ0VGVzdElmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiAodGhyaWZ0X3Rlc3RfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBUSFJJRlRfVEVTVF9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RIYW5kbGVyKSkKKyNkZWZpbmUgSVNfVEhSSUZUX1RFU1RfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUikpCisjZGVmaW5lIFRIUklGVF9URVNUX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1RIUklGVF9URVNUX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUikpCisjZGVmaW5lIFRIUklGVF9URVNUX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0SGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyIFRocmlmdFRlc3RIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyQ2xhc3MgVGhyaWZ0VGVzdEhhbmRsZXJDbGFzczsKKworc3RydWN0IF9UaHJpZnRUZXN0SGFuZGxlciB7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9UaHJpZnRUZXN0SGFuZGxlckNsYXNzIHsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKnRlc3Rfdm9pZCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3N0cmluZykgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2Jvb2wpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfYnl0ZSkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9pMzIpICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9pNjQpICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9kb3VibGUpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfYmluYXJ5KSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0J5dGVBcnJheSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0J5dGVBcnJheSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3N0cnVjdCkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X25lc3QpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0MiAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QyICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X21hcCkgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3N0cmluZ19tYXApICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3NldCkgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2xpc3QpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FycmF5ICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2VudW0pICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0TnVtYmVyeipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3R5cGVkZWYpICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0VXNlcklkKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbWFwX21hcCkgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfaW5zYW5pdHkpICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbXVsdGkpICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgICBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfZXhjZXB0aW9uKSAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X211bHRpX2V4Y2VwdGlvbikgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbjIgICAgICAqKmVycjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfb25ld2F5KSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHNlY29uZHNUb1NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK307CisKKy8qIFVzZWQgYnkgVEhSSUZUX1RFU1RfSEFORExFUl9HRVRfVFlQRSAqLworR1R5cGUgdGhyaWZ0X3Rlc3RfaGFuZGxlcl9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF92b2lkICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYnl0ZSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50OCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2kzMiAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pNjQgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9kb3VibGUgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0ICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0ICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbmVzdCAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdDIgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0MiAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nX21hcCAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc2V0ICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbGlzdCAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXJyYXkgICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdBcnJheSAgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfdHlwZWRlZiAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFVzZXJJZCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXBfbWFwICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIGhlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eSAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RJbnNhbml0eSAgKmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aSAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgICBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKmFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICAgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgICBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9leGNlcHRpb24gICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24yICAgICAgKiplcnIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9vbmV3YXkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBzZWNvbmRzVG9TbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RFU1RfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NsL01ha2VmaWxlLmFtIGIvdGVzdC9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWU3MmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNsIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK1Rlc3RTZXJ2ZXI6IG1ha2UtdGVzdC1zZXJ2ZXIubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10ZXN0LXNlcnZlci5saXNwCisKK1Rlc3RDbGllbnQ6IG1ha2UtdGVzdC1jbGllbnQubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10ZXN0LWNsaWVudC5saXNwCisKK3ByZWNyb3NzOiBzdHVicyBUZXN0U2VydmVyIFRlc3RDbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWNsCisJJChSTSkgVGVzdFNlcnZlcgorCSQoUk0pIFRlc3RDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwlpbXBsZW1lbnRhdGlvbi5saXNwIFwKKwltYWtlLXRlc3QtY2xpZW50Lmxpc3AgXAorCW1ha2UtdGVzdC1zZXJ2ZXIubGlzcCBcCisJdGVzdHMubGlzcApkaWZmIC0tZ2l0IGEvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwIGIvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWY3YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSwxMzYgQEAKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LnRlc3QtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtdm9pZCAoKQorICAoZm9ybWF0IHQgInRlc3RWb2lkKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYm9vbCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJvb2wofmEpfiUiIChpZiB0aGluZyAidHJ1ZSIgImZhbHNlIikpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ieXRlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qnl0ZSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pMzIgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJMzIofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaTY0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0STY0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWRvdWJsZSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdERvdWJsZSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1iaW5hcnkgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCaW5hcnkofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RydWN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RydWN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW5lc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3ROZXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE1hcCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJpbmctbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RyaW5nTWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXNldCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFNldCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1saXN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TGlzdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1lbnVtICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RW51bSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC10eXBlZGVmICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0VHlwZWRlZih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tYXAtbWFwIChoZWxsbykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwTWFwKH5hKX4lIiBoZWxsbykKKyAgJygoLTQgLiAoKC00IC4gLTQpICgtMyAuIC0zKSAoLTIgLiAtMikgKC0xIC4gLTEpKSkgKDQgLiAoKDEgLiAxKSAoMiAuIDIpICgzIC4gMykgKDQgLiA0KSkpKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaW5zYW5pdHkgKGFyZ3VtZW50KQorICAobGV0ICgocmVzdWx0IGAoKDEgLiAoKDIgLiAsYXJndW1lbnQpICgzIC4gLGFyZ3VtZW50KSkpCisgICAgICAgICAgICAgICAgICAoMiAuICgoNiAuICwodGhyaWZ0LnRlc3Q6Om1ha2UtaW5zYW5pdHkgOnVzZXItbWFwIG5pbCA6eHRydWN0cyBuaWwpKSkpKSkpCisgICAgKGZvcm1hdCB0ICJ+YX4lIiByZXN1bHQpCisgICAgcmVzdWx0KSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbXVsdGkgKGFyZzAgYXJnMSBhcmcyIGFyZzMgYXJnNCBhcmc1KQorICAoZGVjbGFyZSAoaWdub3JhYmxlIGFyZzMgYXJnNCBhcmc1KSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGkoKX4lIikKKyAgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIkhlbGxvMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIGFyZzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgYXJnMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyBhcmcyKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZXhjZXB0aW9uIChhcmcpCisgIChmb3JtYXQgdCAidGVzdEV4Y2VwdGlvbih+YSl+JSIgYXJnKQorICAoY29uZAorICAgICgoc3RyaW5nPSBhcmcgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSBhcmcpKQorICAgICgoc3RyaW5nPSBhcmcgIlRFeGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiU3R1ZmYhIikpKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbXVsdGktZXhjZXB0aW9uIChhcmcwIGFyZzEpCisgIChmb3JtYXQgdCAidGVzdE11bHRpRXhjZXB0aW9uKH5hLCB+YSl+JSIgYXJnMCBhcmcxKQorICAoY29uZAorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAxMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgIlRoaXMgaXMgYW4gWGNlcHRpb24iKSkKKyAgICAoKHN0cmluZz0gYXJnMCAiWGNlcHRpb24yIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAyMDAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0cnVjdC10aGluZyAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpKSkKKyAgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgYXJnMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDApKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1vbmV3YXkgKHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IFNsZWVwaW5nLi4ufiUiIHNlY29uZHMpCisgIChzbGVlcCBzZWNvbmRzKQorICAoZm9ybWF0IHQgInRlc3RPbmV3YXkofmEpOiBkb25lIHNsZWVwaW5nIX4lIiBzZWNvbmRzKSkKKworOzs7IFJlbW92ZWQgZnJvbSB0aGUgSURMIGRlZmluaXRpb24uCisjKyhvcikKKyhkZWZ1biB0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpibGFoLWJsYWggKCkKKyAgKGZvcm1hdCB0ICJibGFoQmxhaCgpfiUiKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOnNlY29uZHRlc3Qtc3RyaW5nICh0aGluZykKKyAgKGZvcm1hdCB0ICJzZWNvbmR0ZXN0U3RyaW5nKH5hKX4lIiB0aGluZykKKyAgKGNvbmNhdGVuYXRlICdzdHJpbmcgInRlc3RTdHJpbmcoXCIiIHRoaW5nICJcIikiKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AKQEAgLTAsMCArMSw5MyBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMrKG9yKSAod2hlbiAobm90IChib3VuZHAgJ3NiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0KQorICAgICAgICAgICAgICAgICAoc2V0ZiBzYi1pbXBsOjpkZWZhdWx0LWV4dGVybmFsLWZvcm1hdCA6VVRGLTgpKSkKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vLi4vbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1zeXN0ZW0gOmZpYXNjbykKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MKKyAgKDp1c2UgIzpjb21tb24tbGlzcCAjOmZpYXNjbykKKyAgKDpleHBvcnQgIzpjcm9zcy10ZXN0KSkKKworKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKyhkZWZwYXJhbWV0ZXIgKnByb3QqIG5pbCkKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAidGVzdHMubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSA6ZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkKKworKGNsb246ZGVmc3lub3BzaXMgKCkKKyAgKHRleHQgOmNvbnRlbnRzICJUaGUgQ29tbW9uIExpc3AgY2xpZW50IGZvciBUaHJpZnQncyBjcm9zcy1sYW5ndWFnZSB0ZXN0IHN1aXRlLiIpCisgIChncm91cCAoOmhlYWRlciAiQWxsb3dlZCBvcHRpb25zOiIpCisgICAgKGZsYWcgOnNob3J0LW5hbWUgImgiIDpsb25nLW5hbWUgImhlbHAiCisgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcmludCB0aGlzIGhlbHAgYW5kIGV4aXQuIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgImhvc3QiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRoZSBob3N0IHRvIGNvbm5lY3QgdG8uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImxvY2FsaG9zdCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiTnVtYmVyIG9mIHRoZSBwb3J0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgIjkwOTAiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIgorICAgICAgICAgICAgOmFyZ3VtZW50LXR5cGUgOm9wdGlvbmFsKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAidHJhbnNwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUcmFuc3BvcnQ6IHRyYW5zcG9ydCB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYnVmZmVyZWQiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInByb3RvY29sIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcm90b2NvbDogcHJvdG9jb2wgdG8gdXNlIChcImJpbmFyeVwiLCBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoaG9zdCAibG9jYWxob3N0IikKKyAgICAgICAgKGZyYW1lZCBuaWwpCisgICAgICAgIChtdWx0aXBsZXhlZCBuaWwpKQorICAgIChjbG9uOmRvLWNtZGxpbmUtb3B0aW9ucyAob3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKQorICAgICAgKHByaW50IChsaXN0IG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAiaG9zdCIpCisgICAgICAgICAgKHNldGYgaG9zdCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicG9ydCIpCisgICAgICAgICAgKHNldGYgcG9ydCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAidHJhbnNwb3J0IikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJ1ZmZlcmVkIikgKHNldGYgZnJhbWVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJmcmFtZWQiKSAoc2V0ZiBmcmFtZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQuIikpKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwcm90b2NvbCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJiaW5hcnkiKSAoc2V0ZiBtdWx0aXBsZXhlZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAibXVsdGkiKSAoc2V0ZiBtdWx0aXBsZXhlZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHByb3RvY29sLiIpKSkpKQorICAgICh0ZXJwcmkpCisgICAgKHNldGYgKnByb3QqICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsaWVudCAocHVyaTpwYXJzZS11cmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGhyaWZ0Oi8vIiBob3N0ICI6IiBwb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmcmFtZWQgZnJhbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKQorICAgIChsZXQgKChyZXN1bHQgKGNyb3NzLXRlc3QgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkpCisgICAgICAodGhyaWZ0LmltcGxlbWVudGF0aW9uOjpjbG9zZSAqcHJvdCopCisgICAgICAoY2xvbjpleGl0IHJlc3VsdCkpKSkKKworKGNsb246ZHVtcCAiVGVzdENsaWVudCIgbWFpbikKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzYzg3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwCkBAIC0wLDAgKzEsODAgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvVGhyaWZ0VGVzdC90aHJpZnQtZ2VuLVRocmlmdFRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC1nZW4tdGhyaWZ0dGVzdCkKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImltcGxlbWVudGF0aW9uLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBzZXJ2ZXIgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiTnVtYmVyIG9mIHRoZSBwb3J0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgIjkwOTAiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIgorICAgICAgICAgICAgOmFyZ3VtZW50LXR5cGUgOm9wdGlvbmFsKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAic2VydmVyLXR5cGUiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRoZSB0eXBlIG9mIHNlcnZlciwgY3VycmVudGx5IG9ubHkgXCJzaW1wbGVcIiBpcyBhdmFpbGFibGUuIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgInNpbXBsZSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAidHJhbnNwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUcmFuc3BvcnQ6IHRyYW5zcG9ydCB0byB1c2UgKFwiYnVmZmVyZWRcIiBvciBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIgb3IgXCJtdWx0aVwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJiaW5hcnkiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikpKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIG91ciBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLiIKKyAgKGNsb246bWFrZS1jb250ZXh0KQorICAod2hlbiAoY2xvbjpnZXRvcHQgOnNob3J0LW5hbWUgImgiKQorICAgIChjbG9uOmhlbHApCisgICAgKGNsb246ZXhpdCkpCisgIChsZXQgKChwb3J0ICI5MDkwIikKKyAgICAgICAgKGZyYW1lZCBuaWwpCisgICAgICAgIChtdWx0aXBsZXhlZCBuaWwpKQorICAgIChjbG9uOmRvLWNtZGxpbmUtb3B0aW9ucyAob3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKQorICAgICAgKHByaW50IChsaXN0IG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicG9ydCIpCisgICAgICAgICAgKHNldGYgcG9ydCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAidHJhbnNwb3J0IikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJ1ZmZlcmVkIikgKHNldGYgZnJhbWVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJmcmFtZWQiKSAoc2V0ZiBmcmFtZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQuIikpKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwcm90b2NvbCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJiaW5hcnkiKSAoc2V0ZiBtdWx0aXBsZXhlZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAibXVsdGkiKSAoc2V0ZiBtdWx0aXBsZXhlZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHByb3RvY29sLiIpKSkpKQorICAgICh0ZXJwcmkpCisgICAgKGxldCAoKHNlcnZpY2VzIChpZiBtdWx0aXBsZXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgdGhyaWZ0LnRlc3Q6dGhyaWZ0LXRlc3QgdGhyaWZ0LnRlc3Q6c2Vjb25kLXNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCkpKQorICAgICAgKHRocmlmdDpzZXJ2ZSAocHVyaTpwYXJzZS11cmkgKGNvbmNhdGVuYXRlICdzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0Oi8vMTI3LjAuMC4xOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMKKyAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkpCisgIChjbG9uOmV4aXQpKQorCisoY2xvbjpkdW1wICJUZXN0U2VydmVyIiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC90ZXN0cy5saXNwIGIvdGVzdC9jbC90ZXN0cy5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDM1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKQEAgLTAsMCArMSwyNDAgQEAKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LWNyb3NzKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgVGhlIHRlc3RzIGhlcmUgb25seSBtYWtlIHNlbnNlIGluIHRoZSBjb250ZXh0IG9mIGEgVGVzdFNlcnZlcgorOzs7OyBydW5uaW5nIGFuZCB0aGUgZHluYW1pYyB2YXJpYWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KgorOzs7OyBiZWluZyBzZXQgd2l0aCBhIGNsaWVudCBjb25uZWN0aW9uIHRvIHRoZSBUZXN0U2VydmVyLiBOb3JtYWxseSwKKzs7OzsgdGhpcyBpcyBoYW5kbGVkIGluIG1ha2UtdGVzdC1jbGllbnQubGlzcC4KKworCis7OzsgU3RhbmRhcmQgVGhyaWZ0IGNyb3NzLXRlc3QgZXJyb3IgY29kZXMKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfYmFzZXR5cGVzKiAxKQorKGRlZnBhcmFtZXRlciAqdGVzdF9zdHJ1Y3RzKiAyKQorKGRlZnBhcmFtZXRlciAqdGVzdF9jb250YWluZXJzKiA0KQorKGRlZnBhcmFtZXRlciAqdGVzdF9leGNlcHRpb25zKiA4KQorKGRlZnBhcmFtZXRlciAqdGVzdF91bmtub3duKiA2NCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfdGltZW91dCogMTI4KQorCisoZGVmdW4gY3Jvc3MtdGVzdCAoJmtleSAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgIlRoZSBtYWluIGNyb3NzLXRlc3QgcnVubmVyLiIKKyAgKGxldCAoKHJlc3VsdCBuaWwpKQorICAgIChoYW5kbGVyLWNhc2UKKyAgICAgICAgKHByb2duCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmJhc2UtdHlwZXMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9iYXNldHlwZXMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOnN0cnVjdHMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9zdHJ1Y3RzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpjb250YWluZXJzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfY29udGFpbmVycyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6ZXhjZXB0aW9ucykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2V4Y2VwdGlvbnMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOm1pc2MpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKQorCisgICAgICAgICAgOzsgSXQgZG9lc24ndCBzZWVtIGxpa2UgYW55b25lIGFjdHVhbGx5IHVzZXMKKyAgICAgICAgICA7OyB0aGUgc2Vjb25kIHRlc3Qgc2VydmljZSB3aGVuIHRlc3RpbmcgbXVsdGlwbGV4aW5nLAorICAgICAgICAgIDs7IHNvIHRoaXMgd291bGQgZmFpbCBhZ2FpbnN0IHNlcnZlcnMgaW4gb3RoZXIKKyAgICAgICAgICA7OyBsYW5ndWFnZXMuIEZvciBub3csIGFueXdheS4KKyAgICAgICAgICAjKyhvcikKKyAgICAgICAgICAod2hlbiBtdWx0aXBsZXhlZAorICAgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOm11bHRpcGxleCkKKyAgICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkpKQorICAgICAgKGVycm9yIChlKSAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkKKyAgICAoYXBwbHkgIycrIHJlc3VsdCkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpiYXNlLXR5cGVzKQorCisoaW4tcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhkZWZjb25zdGFudCAqbGFuZy1zdHJpbmcqICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSBNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIikKKworKGRlZnBhcmFtZXRlciAqdHJpY2stc3RyaW5nKiAoZm9ybWF0IG5pbCAicXVvdGU6IFwiIGJhY2tzbGFzaDogXFwgbmV3bGluZTogfiUgYmFja3NwYWNlOiB+QyB+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWI6IH5UIGp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICNcYmFja3NwYWNlKSkKKworKGRlZmNvbnN0YW50ICpiaW5hcnktc2VxdWVuY2UqICMoMTI4IDEyOSAxMzAgMTMxIDEzMiAxMzMgMTM0IDEzNSAxMzYgMTM3IDEzOCAxMzkgMTQwIDE0MSAxNDIgMTQzIDE0NCAxNDUgMTQ2IDE0NyAxNDggMTQ5IDE1MCAxNTEgMTUyIDE1MyAxNTQgMTU1IDE1NiAxNTcgMTU4IDE1OSAxNjAgMTYxIDE2MiAxNjMgMTY0IDE2NSAxNjYgMTY3IDE2OCAxNjkgMTcwIDE3MSAxNzIgMTczIDE3NCAxNzUgMTc2IDE3NyAxNzggMTc5IDE4MCAxODEgMTgyIDE4MyAxODQgMTg1IDE4NiAxODcgMTg4IDE4OSAxOTAgMTkxIDE5MiAxOTMgMTk0IDE5NSAxOTYgMTk3IDE5OCAxOTkgMjAwIDIwMSAyMDIgMjAzIDIwNCAyMDUgMjA2IDIwNyAyMDggMjA5IDIxMCAyMTEgMjEyIDIxMyAyMTQgMjE1IDIxNiAyMTcgMjE4IDIxOSAyMjAgMjIxIDIyMiAyMjMgMjI0IDIyNSAyMjYgMjI3IDIyOCAyMjkgMjMwIDIzMSAyMzIgMjMzIDIzNCAyMzUgMjM2IDIzNyAyMzggMjM5IDI0MCAyNDEgMjQyIDI0MyAyNDQgMjQ1IDI0NiAyNDcgMjQ4IDI0OSAyNTAgMjUxIDI1MiAyNTMgMjU0IDI1NSAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3IDc4IDc5IDgwIDgxIDgyIDgzIDg0IDg1IDg2IDg3IDg4IDg5IDkwIDkxIDkyIDkzIDk0IDk1IDk2IDk3IDk4IDk5IDEwMCAxMDEgMTAyIDEwMyAxMDQgMTA1IDEwNiAxMDcgMTA4IDEwOSAxMTAgMTExIDExMiAxMTMgMTE0IDExNSAxMTYgMTE3IDExOCAxMTkgMTIwIDEyMSAxMjIgMTIzIDEyNCAxMjUgMTI2IDEyNykpCisKKyhkZWZ0ZXN0IHZvaWQtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtdm9pZCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpKSkKKworKGRlZnRlc3QgYm9vbGVhbi10ZXN0ICgpCisgIChpcyAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ib29sIHRocmlmdC1jcm9zczo6KnByb3QqIHQpKQorICAoaXMgKG5vdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ib29sIHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKSkKKworKGRlZnRlc3QgaW50ZWdlci10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDEyNykgMTI3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTEyOCkgLTEyOCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyKSA0MikpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIDIxNDc0ODM2NDcpIDIxNDc0ODM2NDcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIC0yMTQ3NDgzNjQ4KSAtMjE0NzQ4MzY0OCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogOTIyMzM3MjAzNjg1NDc3NTgwNykgOTIyMzM3MjAzNjg1NDc3NTgwNykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTkyMjMzNzIwMzY4NTQ3NzU4MDgpIC05MjIzMzcyMDM2ODU0Nzc1ODA4KSkpCisKKyhkZWZ0ZXN0IGRvdWJsZS10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMC4wKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0Mi4wKSA0MikpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTU1NS4wKSAtNTU1KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTIuMzY3OCkgLTUyLjM2NzgpKSkKKworKGRlZnRlc3Qgc3RyaW5nLXRlc3QgKCkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiIikgIiIpKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIoZGVmdW4gYm90c2J1aWxkYm90cyAoKSAoYm90c2J1aWxzYm90cykpIikKKyAgICAgICAgICAgICAgICIoZGVmdW4gYm90c2J1aWxkYm90cyAoKSAoYm90c2J1aWxzYm90cykpIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKmxhbmctc3RyaW5nKikgKmxhbmctc3RyaW5nKikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRyaWNrLXN0cmluZyopICp0cmljay1zdHJpbmcqKSkpCisKKyhkZWZ0ZXN0IGJpbmFyeS10ZXN0ICgpCisgIChpcyAoZXF1YWxwICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJpbmFyeSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAjKCkpICMoKSkpCisgIChpcyAoZXF1YWxwICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJpbmFyeSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqYmluYXJ5LXNlcXVlbmNlKikgKmJpbmFyeS1zZXF1ZW5jZSopKSkKKworKGRlZnRlc3QgZW51bS10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnouZml2ZSkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5laWdodCkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5laWdodCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSB0aHJpZnQudGVzdDpudW1iZXJ6Lm9uZSkpKQorCisoZGVmdGVzdCB0eXBlZGVmLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXR5cGVkZWYgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMzA5ODU4MjM1MDgyNTIzKSAzMDk4NTgyMzUwODI1MjMpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6c3RydWN0cykKKworKGluLXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoZGVmcGFyYW1ldGVyICp0ZXN0LXN0cnVjdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIkhlbGwgaXMgZW1wdHkuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAtMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgNDI0MjQyNDIpKQorCisoZGVmcGFyYW1ldGVyICp0ZXN0LW5lc3QqICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdDIgOmJ5dGUtdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICp0ZXN0LXN0cnVjdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIC00MikpCisKKyhkZWZ0ZXN0IHN0cnVjdC10ZXN0ICgpCisgIChsZXQgKChyZWMtc3RydWN0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cnVjdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1zdHJ1Y3QqKSkpCisgICAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgcmVjLXN0cnVjdCkpKSkpCisKKyhkZWZ0ZXN0IG5lc3QtdGVzdCAoKQorICAobGV0KiAoKHJlYy1uZXN0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW5lc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRlc3QtbmVzdCopKQorICAgICAgICAgKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0Onh0cnVjdDItc3RydWN0LXRoaW5nIHJlYy1uZXN0KSkpCisgICAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1ieXRlLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1ieXRlLXRoaW5nIHJlYy1uZXN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWkzMi10aGluZyAqdGVzdC1uZXN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nIHJlYy1uZXN0KSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6Y29udGFpbmVycykKKworKGluLXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoZGVmdGVzdCBsaXN0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWxpc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAoZXF1YWwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKDQyIC00MiAwIDUpKSAnKDQyIC00MiAwIDUpKSkpCisKKyhkZWZ0ZXN0IHNldC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAoZXF1YWwgKHNvcnQgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc2V0IHRocmlmdC1jcm9zczo6KnByb3QqIChsaXN0IDQyIC00MiAwIDUpKSAjJzwpCisgICAgICAgICAgICAgJygtNDIgMCA1IDQyKSkpKQorCisoZGVmdW4gbWFwPSAobWFwMSBtYXAyICZrZXkgKGNhci1wcmVkaWNhdGUgIydlcXVhbCkgKGNkci1wcmVkaWNhdGUgIydlcXVhbCkpCisgICJDb21wYXJlIHR3byBhc3NvYyBtYXBzIGFjY29yZGluZyB0byB0aGUgcHJlZGljYXRlcyBnaXZlbi4iCisgIChub3QgKHNldC1leGNsdXNpdmUtb3IgbWFwMSBtYXAyIDp0ZXN0IChsYW1iZGEgKGVsMSBlbDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAoZnVuY2FsbCBjYXItcHJlZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGVsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIGNkci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDIpKSkpKSkpCisKKyhkZWZ0ZXN0IG1hcC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAobWFwPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogJygoMCAuIDEpICg0MiAuIC00MikgKDUgLiA1KSkpCisgICAgICAgICAgICAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkpCisgIChpcyAobWFwPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqIDQyKQorICAgICAgICAgICAgJygoLTQgLiAoKC00IC4gLTQpICgtMyAuIC0zKSAoLTIgLiAtMikgKC0xIC4gLTEpKSkKKyAgICAgICAgICAgICAgKDQgLiAoKDEgLiAxKSAoMiAuIDIpICgzIC4gMykgKDQgLiA0KSkpKQorICAgICAgICAgICAgOmNkci1wcmVkaWNhdGUgIydtYXA9KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmV4Y2VwdGlvbnMpCisKKyhpbi1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGRlZnVuIHRlc3QteGNlcHRpb24gKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uIGlzIHNpZ25hbGxlZCwgYW5kIHdoZXRoZXIgaXRzIGZpZWxkcyBoYXZlIHRoZSBleHBlY3RlZCB2YWx1ZXMuIgorICAoaGFuZGxlci1jYXNlIChwcm9nbiAoYXBwbHkgZnVuY3Rpb24gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgbmlsKQorICAgICh0aHJpZnQudGVzdDp4Y2VwdGlvbiAoZXgpIChhbmQgKD0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbi1tZXNzYWdlIGV4KSBleHBlY3RlZC1tZXNzYWdlKSkpKSkKKworKGRlZnVuIHRlc3QteGNlcHRpb24yIChleHBlY3RlZC1jb2RlIGV4cGVjdGVkLW1lc3NhZ2UgZnVuY3Rpb24gJnJlc3QgYXJncykKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB4Y2VwdGlvbjIgaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uMiAoZXgpIChhbmQgKD0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbjItZXJyb3ItY29kZSBleCkgZXhwZWN0ZWQtY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbjItc3RydWN0LXRoaW5nIGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1tZXNzYWdlKSkpKSkKKworKGRlZnRlc3QgZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEgIlhjZXB0aW9uIiAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJYY2VwdGlvbiIpKQorICAoc2lnbmFscyB0aHJpZnQ6YXBwbGljYXRpb24tZXJyb3IgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJURXhjZXB0aW9uIikpCisgIChmaW5pc2hlcyAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogInN1Y2Nlc3MiKSkpCisKKyhkZWZ0ZXN0IG11bHRpLWV4Y2VwdGlvbi10ZXN0ICgpCisgIChpcyAodGVzdC14Y2VwdGlvbiAxMDAxCisgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MiKSkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uMiAyMDAyCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIm1lYW5pbmdsZXNzIHRvbyEiKSkKKyAgKGlzIChzdHJpbmc9ICJmb29iYXIiICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2JhciIpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptaXNjKQorCisoaW4tcGFja2FnZSAjOm1pc2MpCisKKyhkZWZ0ZXN0IG9uZXdheS10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1vbmV3YXkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoaW4tcGFja2FnZSAjOm11bHRpcGxleCkKKworKGRlZnRlc3QgbXVsdGlwbGV4LXRlc3QgKCkKKyAgOzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyAgOzsgKGZpbmlzaGVzICh0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZTpibGFoLWJsYWggdGhyaWZ0LWNyb3NzOjoqcHJvdCopKQorICAoaXMgKHN0cmluZz0gImFzZCIgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOnNlY29uZHRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICJhc2QiKSkpKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NWQyOTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworZmluZF9wYWNrYWdlKE9wZW5TU0wgUkVRVUlSRUQpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisKK2ZpbmRfcGFja2FnZShMaWJldmVudCBSRVFVSVJFRCkgICMgTGliZXZlbnQgY29tZXMgd2l0aCBDTWFrZSBzdXBwb3J0IGZyb20gdXBzdHJlYW0KK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKworZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke1pMSUJfSU5DTFVERV9ESVJTfSkKKworI01ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwIikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvY3BwL3NyYyIpCisKK3NldChjcm9zc3Rlc3RnZW5jcHBfU09VUkNFUworICAgIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcAorKQorYWRkX2xpYnJhcnkoY3Jvc3N0ZXN0Z2VuY3BwIFNUQVRJQyAke2Nyb3NzdGVzdGdlbmNwcF9TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShjcm9zc3Rlc3RnZW5jcHAgdGhyaWZ0KQorCitzZXQoY3Jvc3NzdHJlc3NnZW5jcHBfU09VUkNFUworICAgIGdlbi1jcHAvU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAKKykKK2FkZF9saWJyYXJ5KGNyb3Nzc3RyZXNzZ2VuY3BwIFNUQVRJQyAke2Nyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNyb3Nzc3RyZXNzZ2VuY3BwIHRocmlmdCkKKworYWRkX2V4ZWN1dGFibGUoVGVzdFNlcnZlciBzcmMvVGVzdFNlcnZlci5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVGVzdFNlcnZlciBjcm9zc3Rlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0eikKKworYWRkX2V4ZWN1dGFibGUoVGVzdENsaWVudCBzcmMvVGVzdENsaWVudC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVGVzdENsaWVudCBjcm9zc3Rlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0eikKKworYWRkX2V4ZWN1dGFibGUoU3RyZXNzVGVzdCBzcmMvU3RyZXNzVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoU3RyZXNzVGVzdCBjcm9zc3N0cmVzc2dlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3QgdGhyaWZ0bmIpCithZGRfdGVzdChOQU1FIFN0cmVzc1Rlc3QgQ09NTUFORCBTdHJlc3NUZXN0KQorCithZGRfZXhlY3V0YWJsZShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoU3RyZXNzVGVzdE5vbkJsb2NraW5nIGNyb3Nzc3RyZXNzZ2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHRocmlmdHopCithZGRfdGVzdChOQU1FIFN0cmVzc1Rlc3ROb25CbG9ja2luZyBDT01NQU5EIFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuaCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgLXIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKykKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL01ha2VmaWxlLmFtIGIvdGVzdC9jcHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZThiZTgwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnN0cmVzc3Rlc3RnZW5jcHAubGEKK25vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS50Y2MgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMudGNjIFwKKwlnZW4tY3BwL1RocmlmdFRlc3QuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3QuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0LnRjYyBcCisJc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcAorCitsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitub2Rpc3RfbGlic3RyZXNzdGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL1NlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NlcnZpY2UuaAorCitsaWJzdHJlc3N0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitwcmVjcm9zczogVGVzdFNlcnZlciBUZXN0Q2xpZW50CisKK2NoZWNrX1BST0dSQU1TID0gXAorCVRlc3RTZXJ2ZXIgXAorCVRlc3RDbGllbnQgXAorCVN0cmVzc1Rlc3QgXAorCVN0cmVzc1Rlc3ROb25CbG9ja2luZworCisjIHdlIGN1cnJlbnRseSBkbyBub3QgcnVuIHRoZSB0ZXN0c3VpdGUsIHN0b3AgYysrIHNlcnZlciBpc3N1ZQorIyBURVNUUyA9IFwKKyMJJChjaGVja19QUk9HUkFNUykKKworVGVzdFNlcnZlcl9TT1VSQ0VTID0gXAorCXNyYy9UZXN0U2VydmVyLmNwcAorCitUZXN0U2VydmVyX0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtICQoWkxJQl9MSUJTKQorCitUZXN0Q2xpZW50X1NPVVJDRVMgPSBcCisJc3JjL1Rlc3RDbGllbnQuY3BwCisKK1Rlc3RDbGllbnRfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCisKK1N0cmVzc1Rlc3RfU09VUkNFUyA9IFwKKwlzcmMvU3RyZXNzVGVzdC5jcHAKKworU3RyZXNzVGVzdF9MREFERCA9IFwKKwlsaWJzdHJlc3N0ZXN0Z2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworU3RyZXNzVGVzdE5vbkJsb2NraW5nX1NPVVJDRVMgPSBcCisJc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKKworU3RyZXNzVGVzdE5vbkJsb2NraW5nX0xEQUREID0gXAorCWxpYnN0cmVzc3Rlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKwktbGV2ZW50CisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICQ8CisKK2dlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKExJQkVWRU5UX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUlnZW4tY3BwCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfTElNSVRfTUFDUk9TCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpICQoWkxJQl9MSUJTKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY3BwLyoKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL1Rlc3RDbGllbnQuY3BwIFwKKwlzcmMvVGVzdFNlcnZlci5jcHAgXAorCXNyYy9TdHJlc3NUZXN0LmNwcCBcCisJc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL1N0cmVzcy10ZXN0Lm1rIGIvdGVzdC9jcHAvU3RyZXNzLXRlc3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzUzYjMuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvU3RyZXNzLXRlc3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaWZuZGVmIHRocmlmdF9ob21lCi10aHJpZnRfaG9tZT0uLi8uLgotZW5kaWYgI3RocmlmdF9ob21lCi0KLXRhcmdldDogYWxsCi0KLWlmbmRlZiBib29zdF9ob21lCi0jYm9vc3RfaG9tZT0uLi8uLi8uLi8uLi8uLi90aGlyZHBhcnR5L2Jvb3N0XzFfMzNfMQotYm9vc3RfaG9tZT0vdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xCi1lbmRpZiAjYm9vc3RfaG9tZQotdGFyZ2V0OiBhbGwKLQotaW5jbHVkZV9wYXRocyA9ICQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvc3JjIFwKLSAgICAgICAgICAgICAgICAkKHRocmlmdF9ob21lKS9saWIvY3BwIFwKLSAgICAgICAgICAgICAgICAkKHRocmlmdF9ob21lKS8gXAotICAgICAgICAgICAgICAgICQoYm9vc3RfaG9tZSkKLQotaW5jbHVkZV9mbGFncyA9ICQocGF0c3Vic3QgJSwtSSUsICQoaW5jbHVkZV9wYXRocykpCi0KLSMgVG9vbHMKLWlmbmRlZiBUSFJJRlQKLVRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLWVuZGlmICMgVEhSSUZUCi0KLUNDICAgICA9IGcrKwotTEQgICAgID0gZysrCi0KLSMgQ29tcGlsZXIgZmxhZ3MKLURDRkwgID0gLVdhbGwgLU8zIC1nIC1JLi9nZW4tY3BwICQoaW5jbHVkZV9mbGFncykgLUwkKHRocmlmdF9ob21lKS9saWIvY3BwLy5saWJzIC1sdGhyaWZ0IC1sdGhyaWZ0bmIgLWxldmVudAotQ0ZMICAgPSAtV2FsbCAtTzMgLUkuL2dlbi1jcHAgJChpbmNsdWRlX2ZsYWdzKSAtTCQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvLmxpYnMgLWx0aHJpZnQgLWx0aHJpZnRuYiAtbGV2ZW50Ci0KLWFsbDogc3RyZXNzLXRlc3Qgc3RyZXNzLXRlc3QtbmIKLQotZGVidWc6IHN0cmVzcy10ZXN0LWRlYnVnIHN0cmVzcy10ZXN0LWRlYnVnLW5iCi0KLXN0dWJzOiAuLi9TdHJlc3NUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHAgLS1nZW4gcGhwIC4uL1N0cmVzc1Rlc3QudGhyaWZ0Ci0KLXN0cmVzcy10ZXN0LWRlYnVnLW5iOiBzdHVicwotCWcrKyAtbyBzdHJlc3MtdGVzdC1uYiAkKERDRkwpIHNyYy9uYi1tYWluLmNwcCAuL2dlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAotCi1zdHJlc3MtdGVzdC1uYjogc3R1YnMKLQlnKysgLW8gc3RyZXNzLXRlc3QtbmIgJChDRkwpIHNyYy9uYi1tYWluLmNwcCAuL2dlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAotCi1zdHJlc3MtdGVzdC1kZWJ1Zzogc3R1YnMKLQlnKysgLW8gc3RyZXNzLXRlc3QgJChEQ0ZMKSBzcmMvbWFpbi5jcHAgLi9nZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKLQotc3RyZXNzLXRlc3Q6IHN0dWJzCi0JZysrIC1vIHN0cmVzcy10ZXN0ICQoQ0ZMKSBzcmMvbWFpbi5jcHAgLi9nZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKLQotY2xlYW46Ci0Jcm0gLWZyIHN0cmVzcy10ZXN0IHN0cmVzcy10ZXN0LW5iIGdlbi1jcHAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL1RocmlmdC10ZXN0Lm1rIGIvdGVzdC9jcHAvVGhyaWZ0LXRlc3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2UzOGIuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvVGhyaWZ0LXRlc3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBNYWtlZmlsZSBmb3IgVGhyaWZ0IHRlc3QgcHJvamVjdC4KLSMgRGVmYXVsdCB0YXJnZXQgaXMgZXZlcnl0aGluZwotCi1pZm5kZWYgdGhyaWZ0X2hvbWUKLXRocmlmdF9ob21lPS4uLy4uCi1lbmRpZiAjdGhyaWZ0X2hvbWUKLQotdGFyZ2V0OiBhbGwKLQotaWZuZGVmIGJvb3N0X2hvbWUKLSNib29zdF9ob21lPS4uLy4uLy4uLy4uLy4uL3RoaXJkcGFydHkvYm9vc3RfMV8zM18xCi1ib29zdF9ob21lPS91c3IvbG9jYWwvaW5jbHVkZS9ib29zdC0xXzMzXzEKLWVuZGlmICNib29zdF9ob21lCi10YXJnZXQ6IGFsbAotCi1pbmNsdWRlX3BhdGhzID0gJCh0aHJpZnRfaG9tZSkvbGliL2NwcC9zcmMgXAotCQkkKGJvb3N0X2hvbWUpCi0KLWluY2x1ZGVfZmxhZ3MgPSAkKHBhdHN1YnN0ICUsLUklLCAkKGluY2x1ZGVfcGF0aHMpKQotCi0jIFRvb2xzCi1pZm5kZWYgVEhSSUZUCi1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci1lbmRpZiAjIFRIUklGVAotCi1DQyAgICAgPSBnKysKLUxEICAgICA9IGcrKwotCi0jIENvbXBpbGVyIGZsYWdzCi1EQ0ZMICA9IC1XYWxsIC1PMyAtZyAtSS4gLUkuL2dlbi1jcHAgJChpbmNsdWRlX2ZsYWdzKSAtTCQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvLmxpYnMgLWx0aHJpZnQgLWx0aHJpZnRuYiAtbGV2ZW50Ci1MRkwgICA9ICAtTCQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvLmxpYnMgLWx0aHJpZnQgLWx0aHJpZnRuYiAtbGV2ZW50Ci1DQ0ZMICA9IC1XYWxsIC1PMyAtSS4gLUkuL2dlbi1jcHAgJChpbmNsdWRlX2ZsYWdzKQotQ0ZMICAgPSAkKENDRkwpICQoTEZMKQotCi1hbGw6IHNlcnZlciBjbGllbnQKLQotZGVidWc6IHNlcnZlci1kZWJ1ZyBjbGllbnQtZGVidWcKLQotc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcCAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1zZXJ2ZXItZGVidWc6IHN0dWJzCi0JZysrIC1vIFRlc3RTZXJ2ZXIgJChEQ0ZMKSBzcmMvVGVzdFNlcnZlci5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3QuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCAuLi9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKLQotY2xpZW50LWRlYnVnOiBzdHVicwotCWcrKyAtbyBUZXN0Q2xpZW50ICQoRENGTCkgc3JjL1Rlc3RDbGllbnQuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgLi4vVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLXNlcnZlcjogc3R1YnMKLQlnKysgLW8gVGVzdFNlcnZlciAkKENGTCkgc3JjL1Rlc3RTZXJ2ZXIuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgLi4vVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLWNsaWVudDogc3R1YnMKLQlnKysgLW8gVGVzdENsaWVudCAkKENGTCkgc3JjL1Rlc3RDbGllbnQuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgLi4vVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLXNtYWxsOgotCSQoVEhSSUZUKSAtLWdlbiBjcHAgLi4vU21hbGxUZXN0LnRocmlmdAotCWcrKyAtYyAkKENDRkwpIC4vZ2VuLWNwcC9TbWFsbFNlcnZpY2UuY3BwIC4vZ2VuLWNwcC9TbWFsbFRlc3RfdHlwZXMuY3BwCi0KLWNsZWFuOgotCXJtIC1mciAqLm8gVGVzdFNlcnZlciBUZXN0Q2xpZW50IGdlbi1jcHAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUgYi90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliYmIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgZ28gaW50byAibWFrZSBjaGVjayIsIGJlY2F1c2UgaXQgaXMgYW4gZXhwZXJpbWVudCwKLSMgbm90IGEgdGVzdC4gIFNwZWNpZmljYWxseSwgaXQgaXMgbWVhbnQgdG8gZGV0ZXJtaW5lIGhvdyBsaWtlbHkgcmVhbGxvYyBpcwotIyB0byBhdm9pZCBhIGNvcHkuICBUaGlzIGlzIHBvb3JseSBkb2N1bWVudGVkLgotCi1ydW46IHJlYWxsb2NfdGVzdAotCWZvciBpdCBpbiAxIDQgNjQgOyBkbyBcCi0JCWZvciBuYiBpbiAxIDggNjQgNTEyIDsgZG8gXAotCQkJZm9yIG1pbnMgaW4gNjQgNTEyIDsgZG8gXAotCQkJCWZvciBtYXhzIGluIDIwNDggMjYyMTQ0IDsgZG8gXAotCQkJCQlmb3IgZGIgaW4gOCA2NCA7IGRvIFwKLQkJCQkJCS4vcmVhbGxvY190ZXN0ICQkbmIgJCRtaW5zICQkbWF4cyAkJGRiICQkaXQgXAotCQkJCQk7IGRvbmUgXAotCQkJCTsgZG9uZSBcCi0JCQk7IGRvbmUgXAotCQk7IGRvbmUgXAotCTsgZG9uZSBcCi0JPiByYXdfc3RhdHMKLQotQ0ZMQUdTID0gLVdhbGwgLWcgLXN0ZD1jOTkKLUxETElCUyA9IC1sZGwKLXJlYWxsb2NfdGVzdDogcmVhbGxvY190ZXN0LmMKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMgYi90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc2M2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLQotaW50IGNvcGllczsKLWludCBub25fY29waWVzOwotCi12b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgc3RhdGljIHZvaWQgKigqcmVhbF9yZWFsbG9jKSh2b2lkKiwgc2l6ZV90KSA9IE5VTEw7Ci0gIGlmIChyZWFsX3JlYWxsb2MgPT0gTlVMTCkgewotICAgIHJlYWxfcmVhbGxvYyA9ICh2b2lkKiAoKikgKHZvaWQqLCBzaXplX3QpKSBkbHN5bShSVExEX05FWFQsICJyZWFsbG9jIik7Ci0gIH0KLQotICB2b2lkICpyZXRfcHRyID0gKCpyZWFsX3JlYWxsb2MpKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldF9wdHIgPT0gcHRyKSB7Ci0gICAgbm9uX2NvcGllcysrOwotICB9IGVsc2UgewotICAgIGNvcGllcysrOwotICB9Ci0KLSAgcmV0dXJuIHJldF9wdHI7Ci19Ci0KLQotc3RydWN0IFRNZW1vcnlCdWZmZXIgewotICB2b2lkKiBwdHI7Ci0gIGludCBzaXplOwotfTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICBpbnQgbnVtX2J1ZmZlcnM7Ci0gIGludCBpbml0X3NpemU7Ci0gIGludCBtYXhfc2l6ZTsKLSAgaW50IGRvdWJsaW5nczsKLSAgaW50IGl0ZXJhdGlvbnM7Ci0KLSAgaWYgKGFyZ2MgPCA2IHx8Ci0gICAgICBhcmdjID4gNyB8fAotICAgICAgKG51bV9idWZmZXJzID0gYXRvaShhcmd2WzFdKSkgPT0gMCB8fAotICAgICAgKGluaXRfc2l6ZSA9IGF0b2koYXJndlsyXSkpID09IDAgfHwKLSAgICAgIChtYXhfc2l6ZSA9IGF0b2koYXJndlszXSkpID09IDAgfHwKLSAgICAgIGluaXRfc2l6ZSA+IG1heF9zaXplIHx8Ci0gICAgICAoaXRlcmF0aW9ucyA9IGF0b2koYXJndls0XSkpID09IDAgfHwKLSAgICAgIChkb3VibGluZ3MgPSBhdG9pKGFyZ3ZbNV0pKSA9PSAwIHx8Ci0gICAgICAoYXJnYyA9PSA3ICYmIGF0b2koYXJndls2XSkgPT0gMCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWFsbG9jX3Rlc3QgPG51bV9idWZmZXJzPiA8aW5pdF9zaXplPiA8bWF4X3NpemU+IDxkb3VibGluZ3M+IDxpdGVyYXRpb25zPiBbc2VlZF1cbiIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotCi0gIGZvciAoIGludCBpID0gMCA7IGkgPCBhcmdjIDsgaSsrICkgewotICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotCi0gIGlmIChhcmdjID09IDcpIHsKLSAgICBzcmFuZChhdG9pKGFyZ3ZbNl0pKTsKLSAgfSBlbHNlIHsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgfQotCi0gIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWZmZXJzID0gY2FsbG9jKG51bV9idWZmZXJzLCBzaXplb2YoKmJ1ZmZlcnMpKTsKLSAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgYWJvcnQoKTsKLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgYnVmZmVyc1tpXS5zaXplID0gbWF4X3NpemU7Ci0gIH0KLQotICB3aGlsZSAoaXRlcmF0aW9ucyAtLT4gMCkgewotICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBkb3VibGluZ3MgKiBudW1fYnVmZmVycyA7IGkrKyApIHsKLSAgICAgIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWYgPSAmYnVmZmVyc1tyYW5kKCkgJSBudW1fYnVmZmVyc107Ci0gICAgICBidWYtPnNpemUgKj0gMjsKLSAgICAgIGlmIChidWYtPnNpemUgPD0gbWF4X3NpemUpIHsKLSAgICAgICAgYnVmLT5wdHIgPSByZWFsbG9jKGJ1Zi0+cHRyLCBidWYtPnNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlZShidWYtPnB0cik7Ci0gICAgICAgIGJ1Zi0+c2l6ZSA9IGluaXRfc2l6ZTsKLSAgICAgICAgYnVmLT5wdHIgPSBtYWxsb2MoYnVmLT5zaXplKTsKLSAgICAgIH0KLSAgICAgIGlmIChidWYtPnB0ciA9PSBOVUxMKSBhYm9ydCgpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZigiTm9uLWNvcGllZCAlZC8lZCAoJS4yZiUlKVxuIiwgbm9uX2NvcGllcywgY29waWVzICsgbm9uX2NvcGllcywgMTAwLjAgKiBub25fY29waWVzIC8gKGNvcGllcyArIG5vbl9jb3BpZXMpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1Zjg5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcApAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KKworI2luY2x1ZGUgIlNlcnZpY2UuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCit1c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOworCitzdHJ1Y3QgZXFzdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9Cit9OworCitzdHJ1Y3QgbHRzdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7IH0KK307CisKKy8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Cit0eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOworCitjbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKK3B1YmxpYzoKKyAgU2VydmVyKCkge30KKworICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgeworICAgIEd1YXJkIG0obG9ja18pOworICAgIGludCBjdCA9IGNvdW50c19bbWV0aG9kXTsKKyAgICBjb3VudHNfW21ldGhvZF0gPSArK2N0OworICB9CisKKyAgdm9pZCBlY2hvVm9pZCgpIHsKKyAgICBjb3VudCgiZWNob1ZvaWQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb3VudF9tYXAgZ2V0Q291bnQoKSB7CisgICAgR3VhcmQgbShsb2NrXyk7CisgICAgcmV0dXJuIGNvdW50c187CisgIH0KKworICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nJiBhcmcpIHsKKyAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKKyAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyAoJXMpISEhISIsIGFyZy5jX3N0cigpKTsKKyAgICB9CisgICAgb3V0ID0gYXJnOworICB9CisgIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKworcHJpdmF0ZToKKyAgY291bnRfbWFwIGNvdW50c187CisgIE11dGV4IGxvY2tfOworfTsKKworZW51bSBUcmFuc3BvcnRPcGVuQ2xvc2VCZWhhdmlvciB7CisgIE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkLAorICBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQKK307CitjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgeworcHVibGljOgorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlLAorICAgICAgICAgICAgICAgVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgYmVoYXZpb3IpCisgICAgOiBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBfY2xpZW50KGNsaWVudCksCisgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCisgICAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCisgICAgICBfbG9vcFR5cGUobG9vcFR5cGUpLAorICAgICAgX2JlaGF2aW9yKGJlaGF2aW9yKSB7fQorCisgIHZvaWQgcnVuKCkgeworCisgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB3aGlsZSAoX3dvcmtlckNvdW50ID09IDApIHsKKyAgICAgICAgX21vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgeworICAgICAgX3RyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIHN3aXRjaCAoX2xvb3BUeXBlKSB7CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBsb29wRWNob1ZvaWQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgbG9vcEVjaG9CeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTMyOgorICAgICAgbG9vcEVjaG9JMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JNjQ6CisgICAgICBsb29wRWNob0k2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGxvb3BFY2hvU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgaWYoX2JlaGF2aW9yID09IE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSB7CisgICAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOworICAgIH0KKworICAgIF9kb25lID0gdHJ1ZTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgICAgX3dvcmtlckNvdW50LS07CisKKyAgICAgIGlmIChfd29ya2VyQ291bnQgPT0gMCkgeworCisgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9Wb2lkKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBfY2xpZW50LT5lY2hvVm9pZCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9CeXRlKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQ4X3QgYXJnID0gMTsKKyAgICAgIGludDhfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvQnl0ZShhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9JMzIoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDMyX3QgYXJnID0gMTsKKyAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0kzMihhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9JNjQoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDY0X3QgYXJnID0gMTsKKyAgICAgIGludDY0X3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9TdHJpbmcoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIHN0cmluZyBhcmcgPSAiaGVsbG8iOworICAgICAgc3RyaW5nIHJlc3VsdDsKKyAgICAgIF9jbGllbnQtPmVjaG9TdHJpbmcocmVzdWx0LCBhcmcpOworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBfY2xpZW50OworICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CisgIHNpemVfdCBfbG9vcENvdW50OworICBUVHlwZSBfbG9vcFR5cGU7CisgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgaW50NjRfdCBfZW5kVGltZTsKKyAgYm9vbCBfZG9uZTsKKyAgTW9uaXRvciBfc2xlZXA7CisgIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIF9iZWhhdmlvcjsKK307CisKK2NsYXNzIFRTdGFydE9ic2VydmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworcHVibGljOgorICBUU3RhcnRPYnNlcnZlcigpIDogYXdha2VfKGZhbHNlKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CisgICAgYXdha2VfID0gdHJ1ZTsKKyAgICBtXy5ub3RpZnlBbGwoKTsKKyAgfQorICB2b2lkIHdhaXRGb3JTZXJ2aWNlKCkgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMobV8pOworICAgIHdoaWxlICghYXdha2VfKQorICAgICAgbV8ud2FpdEZvcmV2ZXIoKTsKKyAgfQorCitwcml2YXRlOgorICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgbV87CisgIGJvb2wgYXdha2VfOworfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisKKyAgaW50IHBvcnQgPSA5MDkxOworICBzdHJpbmcgY2xpZW50VHlwZSA9ICJyZWd1bGFyIjsKKyAgc3RyaW5nIHNlcnZlclR5cGUgPSAidGhyZWFkLXBvb2wiOworICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7CisgIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7CisgIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOworICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7CisgIFRUeXBlIGxvb3BUeXBlID0gVF9WT0lEOworICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOworICBib29sIHJ1blNlcnZlciA9IHRydWU7CisgIGJvb2wgbG9nUmVxdWVzdHMgPSBmYWxzZTsKKyAgc3RyaW5nIHJlcXVlc3RMb2dQYXRoID0gIi4vcmVxdWVzdGxvZy50bG9nIjsKKyAgYm9vbCByZXBsYXlSZXF1ZXN0cyA9IGZhbHNlOworCisgIG9zdHJpbmdzdHJlYW0gdXNhZ2U7CisKKyAgdXNhZ2UgPDwgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudC10eXBlPTxjbGllbnQtdHlwZT5dIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbAorICAgICAgICA8PCAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsCisgICAgICAgIDw8ICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRjbGllbnQtdHlwZSAgICBUeXBlIG9mIGNsaWVudCwgXCJyZWd1bGFyXCIgb3IgXCJjb25jdXJyZW50XCIuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50VHlwZSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBhcmdzOworCisgIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7CisKKyAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKKworICAgIGlmIChhcmcuY29tcGFyZSgwLCAyLCAiLS0iKSA9PSAwKSB7CisKKyAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOworCisgICAgICBzdHJpbmcga2V5ID0gc3RyaW5nKGFyZywgMiwgZW5kIC0gMik7CisKKyAgICAgIGlmIChlbmQgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGFyZ3Nba2V5XSA9IHN0cmluZyhhcmcsIGVuZCArIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJnc1trZXldID0gInRydWUiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIiArIGFyZyk7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKworICAgIGlmICghYXJnc1siY2xpZW50cyJdLmVtcHR5KCkpIHsKKyAgICAgIGNsaWVudENvdW50ID0gYXRvaShhcmdzWyJjbGllbnRzIl0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJoZWxwIl0uZW1wdHkoKSkgeworICAgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghYXJnc1sibG9vcCJdLmVtcHR5KCkpIHsKKyAgICAgIGxvb3BDb3VudCA9IGF0b2koYXJnc1sibG9vcCJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1siY2FsbCJdLmVtcHR5KCkpIHsKKyAgICAgIGNhbGxOYW1lID0gYXJnc1siY2FsbCJdOworICAgIH0KKworICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKKyAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInNlcnZlciJdLmVtcHR5KCkpIHsKKyAgICAgIHJ1blNlcnZlciA9IGFyZ3NbInNlcnZlciJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImxvZy1yZXF1ZXN0Il0uZW1wdHkoKSkgeworICAgICAgbG9nUmVxdWVzdHMgPSBhcmdzWyJsb2ctcmVxdWVzdCJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInJlcGxheS1yZXF1ZXN0Il0uZW1wdHkoKSkgeworICAgICAgcmVwbGF5UmVxdWVzdHMgPSBhcmdzWyJyZXBsYXktcmVxdWVzdCJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgeworICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07CisKKyAgICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7CisKKyAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CisKKyAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiICsgc2VydmVyVHlwZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghYXJnc1siY2xpZW50LXR5cGUiXS5lbXB0eSgpKSB7CisgICAgICBjbGllbnRUeXBlID0gYXJnc1siY2xpZW50LXR5cGUiXTsKKworICAgICAgaWYgKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CisKKyAgICAgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSAiY29uY3VycmVudCIpIHsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIGNsaWVudCB0eXBlICIgKyBjbGllbnRUeXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgeworICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7CisgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKworICAvLyBEaXNwYXRjaGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisKKyAgaWYgKHJlcGxheVJlcXVlc3RzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworCisgICAgLy8gVHJhbnNwb3J0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKKworICAgIC8vIFByb3RvY29sIEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworCisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOworCisgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpZiAocnVuU2VydmVyKSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworCisgICAgLy8gVHJhbnNwb3J0CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisKKyAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKworICAgIC8vIFByb3RvY29sIEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworCisgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CisgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CisgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKKworICAgICAgdHJhbnNwb3J0RmFjdG9yeQorICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKworICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7CisKKyAgICAgIHNlcnZlci5yZXNldCgKKyAgICAgICAgICBuZXcgVFNpbXBsZVNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworCisgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKKworICAgICAgc2VydmVyLnJlc2V0KAorICAgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKworICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgICBzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFRTdGFydE9ic2VydmVyPiBvYnNlcnZlcihuZXcgVFN0YXJ0T2JzZXJ2ZXIpOworICAgIHNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKG9ic2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2VydmVyKTsKKworICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgZW5kbDsKKworICAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKKyAgICBvYnNlcnZlci0+d2FpdEZvclNlcnZpY2UoKTsKKworICAgIC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGNsaWVudHMsIGp1c3Qgd2FpdCBmb3JldmVyIGZvciBleHRlcm5hbCBjbGllbnRzCisgICAgaWYgKGNsaWVudENvdW50ID09IDApIHsKKyAgICAgIHNlcnZlclRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIGlmIChjbGllbnRDb3VudCA+IDApIHsgLy9GSVhNRTogc3RhcnQgaGVyZSBmb3IgY2xpZW50IHR5cGU/CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOworCisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKworICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfVk9JRDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9CWVRFOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JMzIiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTMyOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTY0OworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7CisgICAgICBsb29wVHlwZSA9IFRfU1RSSU5HOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiICsgY2FsbE5hbWUpOworICAgIH0KKworICAgIGlmKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKworICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYoY2xpZW50VHlwZSA9PSAiY29uY3VycmVudCIpIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAvL3N0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNvbmN1cnJlbnRDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDb25jdXJyZW50Q2xpZW50KHByb3RvY29sKSk7CisgICAgICBzb2NrZXQtPm9wZW4oKTsKKyAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgeworICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIERvbnRPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIHRocmVhZCsrKSB7CisgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lMDA7CisgICAgaW50NjRfdCB0aW1lMDE7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7CisKKyAgICAgIGNlcnIgPDwgIkxhdW5jaCAiIDw8IGNsaWVudENvdW50IDw8ICIgIiA8PCBjbGllbnRUeXBlIDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CisKKyAgICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7CisKKyAgICAgIHdoaWxlICh0aHJlYWRDb3VudCA+IDApIHsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgfQorCisgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBsYXN0VGltZSA9IDA7CisKKyAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOworICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IG1heFRpbWUgPSAwOworCisgICAgZm9yIChzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisKKyAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOworCisgICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKKworICAgICAgaWYgKGNsaWVudC0+X3N0YXJ0VGltZSA8IGZpcnN0VGltZSkgeworICAgICAgICBmaXJzdFRpbWUgPSBjbGllbnQtPl9zdGFydFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChjbGllbnQtPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKKyAgICAgICAgbGFzdFRpbWUgPSBjbGllbnQtPl9lbmRUaW1lOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPCBtaW5UaW1lKSB7CisgICAgICAgIG1pblRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhID4gbWF4VGltZSkgeworICAgICAgICBtYXhUaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOworICAgIH0KKworICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OworCisgICAgY291dCA8PCAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQKKyAgICAgICAgIDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CisKKyAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKKyAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gY291bnQuYmVnaW4oKTsgaXRlciAhPSBjb3VudC5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVkXG4iLCBpdGVyLT5maXJzdCwgaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgY2VyciA8PCAiZG9uZS4iIDw8IGVuZGw7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzZWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KKworI2luY2x1ZGUgIlNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3VzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7CisKK3N0cnVjdCBlcXN0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7IH0KK307CisKK3N0cnVjdCBsdHN0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsgfQorfTsKKworLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKK3R5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7CisKK2NsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgeworcHVibGljOgorICBTZXJ2ZXIoKSB7fQorCisgIHZvaWQgY291bnQoY29uc3QgY2hhciogbWV0aG9kKSB7CisgICAgR3VhcmQgbShsb2NrXyk7CisgICAgaW50IGN0ID0gY291bnRzX1ttZXRob2RdOworICAgIGNvdW50c19bbWV0aG9kXSA9ICsrY3Q7CisgIH0KKworICB2b2lkIGVjaG9Wb2lkKCkgeworICAgIGNvdW50KCJlY2hvVm9pZCIpOworICAgIC8vIFNsZWVwIHRvIHNpbXVsYXRlIHdvcmsKKyAgICBUSFJJRlRfU0xFRVBfVVNFQygxKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb3VudF9tYXAgZ2V0Q291bnQoKSB7CisgICAgR3VhcmQgbShsb2NrXyk7CisgICAgcmV0dXJuIGNvdW50c187CisgIH0KKworICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nJiBhcmcpIHsKKyAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKKyAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyAoJXMpISEhISIsIGFyZy5jX3N0cigpKTsKKyAgICB9CisgICAgb3V0ID0gYXJnOworICB9CisgIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKworcHJpdmF0ZToKKyAgY291bnRfbWFwIGNvdW50c187CisgIE11dGV4IGxvY2tfOworfTsKKworY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgQ2xpZW50VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LAorICAgICAgICAgICAgICAgTW9uaXRvciYgbW9uaXRvciwKKyAgICAgICAgICAgICAgIHNpemVfdCYgd29ya2VyQ291bnQsCisgICAgICAgICAgICAgICBzaXplX3QgbG9vcENvdW50LAorICAgICAgICAgICAgICAgVFR5cGUgbG9vcFR5cGUpCisgICAgOiBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBfY2xpZW50KGNsaWVudCksCisgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCisgICAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCisgICAgICBfbG9vcFR5cGUobG9vcFR5cGUpIHt9CisKKyAgdm9pZCBydW4oKSB7CisKKyAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgIHdoaWxlIChfd29ya2VyQ291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBfdHJhbnNwb3J0LT5vcGVuKCk7CisKKyAgICBzd2l0Y2ggKF9sb29wVHlwZSkgeworICAgIGNhc2UgVF9WT0lEOgorICAgICAgbG9vcEVjaG9Wb2lkKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGxvb3BFY2hvQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGxvb3BFY2hvSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTY0OgorICAgICAgbG9vcEVjaG9JNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICBsb29wRWNob1N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7CisKKyAgICBfZG9uZSA9IHRydWU7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAgIF93b3JrZXJDb3VudC0tOworCisgICAgICBpZiAoX3dvcmtlckNvdW50ID09IDApIHsKKworICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvVm9pZCgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgX2NsaWVudC0+ZWNob1ZvaWQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvQnl0ZSgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50OF90IGFyZyA9IDE7CisgICAgICBpbnQ4X3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvSTMyKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQzMl90IGFyZyA9IDE7CisgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvSTY0KCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQ2NF90IGFyZyA9IDE7CisgICAgICBpbnQ2NF90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JNjQoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvU3RyaW5nKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBzdHJpbmcgYXJnID0gImhlbGxvIjsKKyAgICAgIHN0cmluZyByZXN1bHQ7CisgICAgICBfY2xpZW50LT5lY2hvU3RyaW5nKHJlc3VsdCwgYXJnKTsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CisgIE1vbml0b3ImIF9tb25pdG9yOworICBzaXplX3QmIF93b3JrZXJDb3VudDsKKyAgc2l6ZV90IF9sb29wQ291bnQ7CisgIFRUeXBlIF9sb29wVHlwZTsKKyAgaW50NjRfdCBfc3RhcnRUaW1lOworICBpbnQ2NF90IF9lbmRUaW1lOworICBib29sIF9kb25lOworICBNb25pdG9yIF9zbGVlcDsKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgorCisgIGludCBwb3J0ID0gOTA5MTsKKyAgc3RyaW5nIHNlcnZlclR5cGUgPSAic2ltcGxlIjsKKyAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOworICB1aW50MzJfdCB3b3JrZXJDb3VudCA9IDQ7CisgIHVpbnQzMl90IGNsaWVudENvdW50ID0gMjA7CisgIHVpbnQzMl90IGxvb3BDb3VudCA9IDEwMDA7CisgIFRUeXBlIGxvb3BUeXBlID0gVF9WT0lEOworICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOworICBib29sIHJ1blNlcnZlciA9IHRydWU7CisgIGJvb2wgbG9nUmVxdWVzdHMgPSBmYWxzZTsKKyAgc3RyaW5nIHJlcXVlc3RMb2dQYXRoID0gIi4vcmVxdWVzdGxvZy50bG9nIjsKKyAgYm9vbCByZXBsYXlSZXF1ZXN0cyA9IGZhbHNlOworCisgIG9zdHJpbmdzdHJlYW0gdXNhZ2U7CisKKyAgdXNhZ2UgPDwgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gIgorICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgbG9vcENvdW50IDw8IGVuZGwgPDwgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyCisgICAgICAgIDw8IGVuZGwgPDwgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHNlcnZlclR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMKKyAgICAgICAgPDwgZW5kbCA8PCAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIgorICAgICAgICA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsIDw8ICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgPDwgZW5kbDsKKworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGFyZ3M7CisKKyAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKKworICAgIHN0cmluZyBhcmcoYXJndltpeF0pOworCisgICAgaWYgKGFyZy5jb21wYXJlKDAsIDIsICItLSIpID09IDApIHsKKworICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7CisKKyAgICAgIHN0cmluZyBrZXkgPSBzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKTsKKworICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgYXJnc1trZXldID0gc3RyaW5nKGFyZywgZW5kICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiICsgYXJnKTsKKyAgICB9CisgIH0KKworICB0cnkgeworCisgICAgaWYgKCFhcmdzWyJjbGllbnRzIl0uZW1wdHkoKSkgeworICAgICAgY2xpZW50Q291bnQgPSBhdG9pKGFyZ3NbImNsaWVudHMiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImhlbHAiXS5lbXB0eSgpKSB7CisgICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJsb29wIl0uZW1wdHkoKSkgeworICAgICAgbG9vcENvdW50ID0gYXRvaShhcmdzWyJsb29wIl0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJjYWxsIl0uZW1wdHkoKSkgeworICAgICAgY2FsbE5hbWUgPSBhcmdzWyJjYWxsIl07CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJwb3J0Il0uZW1wdHkoKSkgeworICAgICAgcG9ydCA9IGF0b2koYXJnc1sicG9ydCJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1sic2VydmVyIl0uZW1wdHkoKSkgeworICAgICAgcnVuU2VydmVyID0gYXJnc1sic2VydmVyIl0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sibG9nLXJlcXVlc3QiXS5lbXB0eSgpKSB7CisgICAgICBsb2dSZXF1ZXN0cyA9IGFyZ3NbImxvZy1yZXF1ZXN0Il0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sicmVwbGF5LXJlcXVlc3QiXS5lbXB0eSgpKSB7CisgICAgICByZXBsYXlSZXF1ZXN0cyA9IGFyZ3NbInJlcGxheS1yZXF1ZXN0Il0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sic2VydmVyLXR5cGUiXS5lbXB0eSgpKSB7CisgICAgICBzZXJ2ZXJUeXBlID0gYXJnc1sic2VydmVyLXR5cGUiXTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbIndvcmtlcnMiXS5lbXB0eSgpKSB7CisgICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOworICAgIH0KKworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICBjZXJyIDw8IHVzYWdlLnN0cigpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCisgIC8vIERpc3BhdGNoZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKworICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisKKyAgICAvLyBUcmFuc3BvcnRzCisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOworICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOworCisgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICBURmlsZVByb2Nlc3NvciBmaWxlUHJvY2Vzc29yKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgZmlsZVRyYW5zcG9ydCk7CisKKyAgICBmaWxlUHJvY2Vzc29yLnByb2Nlc3MoMCwgdHJ1ZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGlmIChydW5TZXJ2ZXIpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisKKyAgICAvLyBQcm90b2NvbCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OworCisgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CisgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CisgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKKworICAgICAgdHJhbnNwb3J0RmFjdG9yeQorICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDI7CisKKyAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgeworCisgICAgICBuYlNvY2tldDEucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MSkpKTsKKyAgICAgIG5iU29ja2V0Mi5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCArIDEpKTsKKyAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDIpKSk7CisKKyAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgICAgbmJTb2NrZXQxLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDEsIHRocmVhZE1hbmFnZXIpKSk7CisgICAgICBuYlNvY2tldDIucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQgKyAxKSk7CisgICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQyLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgIH0KKworICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgIiBhbmQgIiA8PCAocG9ydCArIDEpIDw8IGVuZGw7CisgICAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworICAgIHNlcnZlclRocmVhZDItPnN0YXJ0KCk7CisKKyAgICAvLyBJZiB3ZSBhcmVuJ3QgcnVubmluZyBjbGllbnRzLCBqdXN0IHdhaXQgZm9yZXZlciBmb3IgZXh0ZXJuYWwgY2xpZW50cworCisgICAgaWYgKGNsaWVudENvdW50ID09IDApIHsKKyAgICAgIHNlcnZlclRocmVhZC0+am9pbigpOworICAgICAgc2VydmVyVGhyZWFkMi0+am9pbigpOworICAgIH0KKyAgfQorICBUSFJJRlRfU0xFRVBfU0VDKDEpOworCisgIGlmIChjbGllbnRDb3VudCA+IDApIHsKKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CisKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworCisgICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9WT0lEOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9CeXRlIikgeworICAgICAgbG9vcFR5cGUgPSBUX0JZVEU7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JMzI7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JNjQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob1N0cmluZyIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9TVFJJTkc7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIgKyBjYWxsTmFtZSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisKKyAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUpKSkpOworICAgIH0KKworICAgIGZvciAoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICB0aHJlYWQrKykgeworICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOworICAgIH0KKworICAgIGludDY0X3QgdGltZTAwOworICAgIGludDY0X3QgdGltZTAxOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OworCisgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOworCisgICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOworCisgICAgICB3aGlsZSAodGhyZWFkQ291bnQgPiAwKSB7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorCisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIH0KKworICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbGFzdFRpbWUgPSAwOworCisgICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKKyAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKKworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKKworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworCisgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKKworICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7CisKKyAgICAgIGlmIChjbGllbnQtPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgZmlyc3RUaW1lID0gY2xpZW50LT5fc3RhcnRUaW1lOworICAgICAgfQorCisgICAgICBpZiAoY2xpZW50LT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7CisgICAgICAgIGxhc3RUaW1lID0gY2xpZW50LT5fZW5kVGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgeworICAgICAgICBtaW5UaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKKyAgICAgICAgbWF4VGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKKyAgICB9CisKKyAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKKworICAgIGNvdXQgPDwgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50CisgICAgICAgICA8PCAiLCByYXRlIDogIiA8PCAoY2xpZW50Q291bnQgKiBsb29wQ291bnQgKiAxMDAwKSAvICgoZG91YmxlKSh0aW1lMDEgLSB0aW1lMDApKSA8PCBlbmRsOworCisgICAgY291bnRfbWFwIGNvdW50ID0gc2VydmljZUhhbmRsZXItPmdldENvdW50KCk7CisgICAgY291bnRfbWFwOjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGNvdW50LmJlZ2luKCk7IGl0ZXIgIT0gY291bnQuZW5kKCk7ICsraXRlcikgeworICAgICAgcHJpbnRmKCIlcyA9PiAlZFxuIiwgaXRlci0+Zmlyc3QsIGl0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGNlcnIgPDwgImRvbmUuIiA8PCBlbmRsOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAgYi90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKaW5kZXggNWRkZmEwNi4uODlmM2ZkMSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8qCivvu78vKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNyw3NyArMTcsMzM1IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+IC8vIDxldmVudC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5kb20vcmFuZG9tX2RldmljZS5ocHA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU2Vjb25kU2VydmljZS5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKIAotLy9leHRlcm4gdWludDMyX3QgZ19zb2NrZXRfc3lzY2FsbHM7Ci0KIC8vIEN1cnJlbnQgdGltZSwgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAotdWludDY0X3Qgbm93KCkKLXsKLSAgbG9uZyBsb25nIHJldDsKK3VpbnQ2NF90IG5vdygpIHsKKyAgaW50NjRfdCByZXQ7CiAgIHN0cnVjdCB0aW1ldmFsIHR2OwogCi0gIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgTlVMTCk7CiAgIHJldCA9IHR2LnR2X3NlYzsKLSAgcmV0ID0gcmV0KjEwMDAqMTAwMCArIHR2LnR2X3VzZWM7CisgIHJldCA9IHJldCAqIDEwMDAgKiAxMDAwICsgdHYudHZfdXNlYzsKICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgdGVzdFN0cmluZ19jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKKyAgdHJ5IHsKKyAgICBzdHJpbmcgczsKKyAgICBjbGllbnQtPnJlY3ZfdGVzdFN0cmluZyhzKTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICBjb25zdCBib29sIG9rID0gKHMgPT0gb3Muc3RyKCkpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCAiICIgPDwgKChvaykgPyAib2siIDogImZhaWxlZCIpIDw8IGVuZGw7CisgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgeworICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0ZXN0TnIgPT0gOSkKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhiYXNlKTsgLy8gZW5kIHRlc3QKK30KKworc3RhdGljIHZvaWQgdGVzdFZvaWRfY2xpZW50UmV0dXJuKGV2ZW50X2Jhc2UqIGJhc2UsIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgeworICB0cnkgeworICAgIGNsaWVudC0+cmVjdl90ZXN0Vm9pZCgpOworICAgIGNvdXQgPDwgInRlc3RWb2lkIiA8PCBlbmRsOworCisgICAgZm9yIChpbnQgdGVzdE5yID0gMDsgdGVzdE5yIDwgMTA7ICsrdGVzdE5yKSB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgICAgY2xpZW50LT50ZXN0U3RyaW5nKHN0ZDo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSk7CisgICAgfQorICB9IGNhdGNoIChURXhjZXB0aW9uJiBleG4pIHsKKyAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBleG4ud2hhdCgpIDw8IGVuZGw7CisgIH0KK30KKworLy8gV29ya2Fyb3VuZCBmb3IgYWJzZW5zZSBvZiBDKysxMSAiYXV0byIga2V5d29yZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBwcmludF9lcShUIGV4cGVjdGVkLCBUIGFjdHVhbCkgeworICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgIGlmIChleHBlY3RlZCAhPSBhY3R1YWwpIHsKKyAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBCQVNFVFlQRV9JREVOVElUWV9URVNUKGZ1bmMsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb3V0IDw8ICNmdW5jICIoIiA8PCB2YWx1ZSA8PCAiKSA9ICI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcHJpbnRfZXEodmFsdWUsIHRlc3RDbGllbnQuZnVuYyh2YWx1ZSkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRocm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK2ludCBiaW5hcnlfdGVzdChUaHJpZnRUZXN0Q2xpZW50JiB0ZXN0Q2xpZW50LCBzdHJpbmc6OnNpemVfdHlwZSBzaXopOworCitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9CQVNFVFlQRVMgPSAxOworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfU1RSVUNUUyA9IDI7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9DT05UQUlORVJTID0gNDsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfVU5LTk9XTiA9IDY0OworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgY291dC5wcmVjaXNpb24oMTkpOworCisgIHN0cmluZyB0ZXN0RGlyICA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjYVBhdGggICA9IHRlc3REaXIgKyAiL2tleXMvQ0EucGVtIjsKKyAgc3RyaW5nIGNlcnRQYXRoID0gdGVzdERpciArICIva2V5cy9jbGllbnQuY3J0IjsKKyAgc3RyaW5nIGtleVBhdGggID0gdGVzdERpciArICIva2V5cy9jbGllbnQua2V5IjsKKworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGludCBudW1UZXN0cyA9IDE7Ci0gIGJvb2wgZnJhbWVkID0gZmFsc2U7CisgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOworICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOworICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICBib29sIGFic3RyYWN0X25hbWVzcGFjZSA9IGZhbHNlOworICBib29sIG5vaW5zYW5lID0gZmFsc2U7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKLSAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItaCIpID09IDApIHsKLSAgICAgIGNoYXIqIHBjaCA9IHN0cnRvayhhcmd2WysraV0sICI6Iik7Ci0gICAgICBpZiAocGNoICE9IE5VTEwpIHsKLSAgICAgICAgaG9zdCA9IHN0cmluZyhwY2gpOworICBpbnQgcmV0dXJuX2NvZGUgPSAwOworCisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIGRlc2MuYWRkX29wdGlvbnMoKQorICAgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICAgKCJob3N0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZob3N0KS0+ZGVmYXVsdF92YWx1ZShob3N0KSwKKyAgICAgICAgICAiSG9zdCB0byBjb25uZWN0IikKKyAgICAgICgicG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksCisgICAgICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQorICAgICAgKCJkb21haW4tc29ja2V0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KS0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwKKyAgICAgICAgICAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikKKyAgICAgICgiYWJzdHJhY3QtbmFtZXNwYWNlIiwKKyAgICAgICAgICAiTG9vayBmb3IgdGhlIGRvbWFpbiBzb2NrZXQgaW4gdGhlIEFic3RyYWN0IE5hbWVzcGFjZSIKKyAgICAgICAgICAiIChubyBjb25uZWN0aW9uIHdpdGggZmlsZXN5c3RlbSBwYXRobmFtZXMpIikKKyAgICAgICgidHJhbnNwb3J0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLAorICAgICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCwgemxpYiIpCisgICAgICAoInByb3RvY29sIiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwKKyAgICAgICAgICAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgICAoInNzbCIsCisgICAgICAgICAgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKKyAgICAgICgiemxpYiIsCisgICAgICAgICAgIldyYXAgVHJhbnNwb3J0IHdpdGggWmxpYiIpCisgICAgICAoInRlc3Rsb29wcyxuIiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZudW1UZXN0cyktPmRlZmF1bHRfdmFsdWUobnVtVGVzdHMpLAorICAgICAgICAgICJOdW1iZXIgb2YgVGVzdHMiKQorICAgICAgKCJub2luc2FuZSIsCisgICAgICAgICAgIkRvIG5vdCBydW4gaW5zYW5pdHkgdGVzdCIpOworCisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07CisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnN0b3JlKGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOworICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOworCisgIGlmICh2bS5jb3VudCgiaGVscCIpKSB7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOworICB9CisKKyAgdHJ5IHsKKyAgICBpZiAoIXByb3RvY29sX3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aSIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICB9Ci0gICAgICBwY2ggPSBzdHJ0b2soTlVMTCwgIjoiKTsKLSAgICAgIGlmIChwY2ggIT0gTlVMTCkgewotICAgICAgICBwb3J0ID0gYXRvaShwY2gpOworICAgIH0KKworICAgIGlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJldmh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3Qgd2lsbCBwYXNzIHpsaWIgYXMgYSB0cmFuc3BvcnQgYW5kIGFzIGEgZmxhZyByaWdodCBub3cuLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItbiIpID09IDApIHsKLSAgICAgIG51bVRlc3RzID0gYXRvaShhcmd2WysraV0pOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZiIpID09IDApIHsKLSAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgfQorCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZSkgeworICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICBjb3V0IDw8IGRlc2MgPDwgZW5kbDsKKyAgICByZXR1cm4gRVJSX1VOS05PV047CisgIH0KKworICBpZiAodm0uY291bnQoInNzbCIpKSB7CisgICAgc3NsID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgiemxpYiIpKSB7CisgICAgemxpYiA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoImFic3RyYWN0LW5hbWVzcGFjZSIpKSB7CisgICAgYWJzdHJhY3RfbmFtZXNwYWNlID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgibm9pbnNhbmUiKSkgeworICAgIG5vaW5zYW5lID0gdHJ1ZTsKKyAgfQorCisgIC8vIFRIUklGVC00MTY0OiBUaGUgZmFjdG9yeSBNVVNUIG91dGxpdmUgYW55IHNvY2tldHMgaXQgY3JlYXRlcyBmb3IgY29ycmVjdCBiZWhhdmlvciEKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wyOyAgLy8gU2Vjb25kU2VydmljZSBmb3IgbXVsdGlwbGV4ZWQKKworICBpZiAoc3NsKSB7CisgICAgY291dCA8PCAiQ2xpZW50IENlcnRpZmljYXRlIEZpbGU6ICIgPDwgY2VydFBhdGggPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJDbGllbnQgS2V5ICAgICAgICAgRmlsZTogIiA8PCBrZXlQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ0EgICAgICAgICAgICAgICAgIEZpbGU6ICIgPDwgY2FQYXRoIDw8IGVuZGw7CisKKyAgICBmYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgZmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2FQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKKyAgICBzb2NrZXQgPSBmYWN0b3J5LT5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGRvbWFpbl9zb2NrZXQgIT0gIiIpIHsKKyAgICAgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWJzdHJhY3Rfc29ja2V0KCJcMCIsIDEpOworICAgICAgICBhYnN0cmFjdF9zb2NrZXQgKz0gZG9tYWluX3NvY2tldDsKKyAgICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIH0KKyAgICAgIHBvcnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwogICAgIH0KICAgfQogCi0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7Ci0KLSAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwotCi0gIGlmIChmcmFtZWQpIHsKLSAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICB0cmFuc3BvcnQgPSBmcmFtZWRTb2NrZXQ7CisgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJodHRwIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBDbGllbnQ+KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIik7CisgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiZnJhbWVkIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfSBlbHNlIHsKLSAgICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICB0cmFuc3BvcnQgPSBidWZmZXJlZFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfQogCi0gIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICBpZiAoemxpYikgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFpsaWJUcmFuc3BvcnQ+KHRyYW5zcG9ydCk7CisgIH0KKworICBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSlNPTlByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEhlYWRlclByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0KKworICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgIHByb3RvY29sMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VE11bHRpcGxleGVkUHJvdG9jb2w+KHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpOworICAvLyB3ZSBkb24ndCBuZWVkIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgcHJvdG9jb2wgYW55IG1vcmUsIHNvLi4uCisgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJUaHJpZnRUZXN0Iik7CisgIH0KKworICAvLyBDb25uZWN0aW9uIGluZm8KKyAgY291dCA8PCAiQ29ubmVjdGluZyAoIiA8PCB0cmFuc3BvcnRfdHlwZSA8PCAiLyIgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKSB0bzogIjsKKyAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgIGNvdXQgPDwgJ0AnOworICB9CisgIGNvdXQgPDwgZG9tYWluX3NvY2tldDsKKyAgaWYgKHBvcnQgIT0gMCkgeworICAgIGNvdXQgPDwgaG9zdCA8PCAiOiIgPDwgcG9ydDsKKyAgfQorICBjb3V0IDw8IGVuZGw7CisKKyAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImV2aHR0cCIpID09IDApIHsKKyAgICBldmVudF9iYXNlKiBiYXNlID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgICBjb3V0IDw8ICJMaWJldmVudCBWZXJzaW9uOiAiIDw8IGV2ZW50X2dldF92ZXJzaW9uKCkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJMaWJldmVudCBNZXRob2Q6ICIgPDwgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGJhc2UpIDw8IGVuZGw7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMjAwMDAwMAorICAgIGNvdXQgPDwgIkxpYmV2ZW50IEZlYXR1cmVzOiAweCIgPDwgaGV4IDw8IGV2ZW50X2Jhc2VfZ2V0X2ZlYXR1cmVzKGJhc2UpIDw8IGVuZGw7CisjZW5kaWYKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCgKKyAgICAgICAgbmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKKyAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENvYkNsaWVudChjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkuZ2V0KCkpOworICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgICBldmVudF9iYXNlX2xvb3AoYmFzZSwgMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKwogICBUaHJpZnRUZXN0Q2xpZW50IHRlc3RDbGllbnQocHJvdG9jb2wpOwogCiAgIHVpbnQ2NF90IHRpbWVfbWluID0gMDsKQEAgLTk5LDE1ICszNTcsMTUgQEAKIAogICAgIHRyeSB7CiAgICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHByaW50ZigiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCB0dHgud2hhdCgpKTsKLSAgICAgIGNvbnRpbnVlOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICJDb25uZWN0IGZhaWxlZDogIiA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDT05ORUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoIlRlc3QgIyVkLCBjb25uZWN0ICVzOiVkXG4iLCB0ZXN0KzEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CisgICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCArIDEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CiAKICAgICB1aW50NjRfdCBzdGFydCA9IG5vdygpOwogCkBAIC0xMTUsNTMgKzM3MywyMjUgQEAKICAgICAgKiBWT0lEIFRFU1QKICAgICAgKi8KICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCgpIiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKLSAgICAgIHByaW50ZigiID0gdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRheCkgewotICAgICAgcHJpbnRmKCIlc1xuIiwgdGF4LndoYXQoKSk7CisgICAgICBjb3V0IDw8ICIgPSB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAvLyBTdG9wIGhlcmUgaWYgdHJhbnNwb3J0IGdvdCBicm9rZW4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTVFJJTkcgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIgPDwgZmx1c2g7CiAgICAgc3RyaW5nIHM7CiAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsICJUZXN0Iik7Ci0gICAgcHJpbnRmKCIgPSBcIiVzXCJcbiIsIHMuY19zdHIoKSk7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CisgICAgaWYgKHMgIT0gIlRlc3QiKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKKyAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKKyAgICAgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiCisgICAgICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIgorICAgICAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIKKyAgICAgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiCisgICAgICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIgorICAgICAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIKKyAgICAgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIgorICAgICAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiCisgICAgICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIgorICAgICAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIKKyAgICAgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiCisgICAgICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIKKyAgICAgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIKKyAgICAgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIgorICAgICAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIKKyAgICAgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIKKyAgICAgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIKKyAgICAgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiCisgICAgICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIgorICAgICAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIKKyAgICAgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIgorICAgICAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiCisgICAgICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbCA8PCAiQ0xFQVIiOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJxdW90ZTogXCIgYmFja3NsYXNoOiIKKyAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIgorICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIKKyAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcL1xiXG5cclx0IgorICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIKKyAgICAgICAgICAiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkNMRUFSIjsKKyAgICAgICAgOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQk9PTCBURVNUCisgICAgICovCisgICAgY291dCA8PCBib29sYWxwaGE7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgdHJ1ZSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogQllURSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0Qnl0ZSgxKSIpOwotICAgIHVpbnQ4X3QgdTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKDEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIChpbnQpdTgpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCk0Mik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMTI3KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS0xMjgpOwogCiAgICAgLyoqCiAgICAgICogSTMyIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RJMzIoLTEpIik7Ci0gICAgaW50MzJfdCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIGkzMik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIC0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIDE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMTkwMDAwMDEzKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKIAogICAgIC8qKgogICAgICAqIEk2NCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSAgICBpbnQ2NF90IGk2NCA9IHRlc3RDbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjhMTCk7Ci0gICAgcHJpbnRmKCIgPSAlIlBSSWQ2NCJcbiIsIGk2NCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOwogCiAgICAgLyoqCiAgICAgICogRE9VQkxFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKLSAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpOwotICAgIHByaW50ZigiID0gJWxmXG4iLCBkdWIpOworICAgIC8vIENvbXBhcmluZyBkb3VibGUgdmFsdWVzIHdpdGggcGxhaW4gZXF1YWxpdHkgYmVjYXVzZSBUaHJpZnQgaGFuZGxlcyBmdWxsIHByZWNpc2lvbiBvZiBkb3VibGUKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIDAuMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMS4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC01LjIwOTg1MjMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpICsgMSk7CisKKyAgICB0cnkgeworICAgICAgZG91YmxlIGV4cGVjdGVkID0gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAzMDcpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAyOTIpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0yOTIpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMzA3KSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCSU5BUlkgVEVTVAorICAgICAqLworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCAxMzEwNzMgJiYgIXJldHVybl9jb2RlOyApIHsKKyAgICAgIHJldHVybl9jb2RlIHw9IGJpbmFyeV90ZXN0KHRlc3RDbGllbnQsIGkpOworICAgICAgaWYgKGkgPiAwKSB7IGkgKj0gMjsgfSBlbHNlIHsgKytpOyB9CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgY291dCA8PCAidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIiA8PCBmbHVzaDsKICAgICBYdHJ1Y3Qgb3V0OwogICAgIG91dC5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CiAgICAgb3V0LmJ5dGVfdGhpbmcgPSAxOwpAQCAtMTY5LDE2ICs1OTksMjAgQEAKICAgICBvdXQuaTY0X3RoaW5nID0gLTU7CiAgICAgWHRydWN0IGluOwogICAgIHRlc3RDbGllbnQudGVzdFN0cnVjdChpbiwgb3V0KTsKLSAgICBwcmludGYoIiA9IHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifVxuIiwKKyAgICBwcmludGYoIiA9IHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9XG4iLAogICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcuY19zdHIoKSwKICAgICAgICAgICAgKGludClpbi5ieXRlX3RoaW5nLAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZyk7CisgICAgaWYgKGluICE9IG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgIGNvdXQgPDwgInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIgPDwgZmx1c2g7CiAgICAgWHRydWN0MiBvdXQyOwogICAgIG91dDIuYnl0ZV90aGluZyA9IDE7CiAgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CkBAIC0xODYsNDYgKzYyMCw4NSBAQAogICAgIFh0cnVjdDIgaW4yOwogICAgIHRlc3RDbGllbnQudGVzdE5lc3QoaW4yLCBvdXQyKTsKICAgICBpbiA9IGluMi5zdHJ1Y3RfdGhpbmc7Ci0gICAgcHJpbnRmKCIgPSB7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgJWR9XG4iLAorICAgIHByaW50ZigiID0geyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9XG4iLAogICAgICAgICAgICBpbjIuYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nLmNfc3RyKCksCiAgICAgICAgICAgIChpbnQpaW4uYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uaTMyX3RoaW5nLAogICAgICAgICAgICBpbi5pNjRfdGhpbmcsCiAgICAgICAgICAgIGluMi5pMzJfdGhpbmcpOworICAgIGlmIChpbjIgIT0gb3V0MikgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNQVAgVEVTVAogICAgICAqLwotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG1hcG91dDsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwb3V0OwogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaS0xMCkpOworICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaSAtIDEwKSk7CiAgICAgfQotICAgIHByaW50ZigidGVzdE1hcCh7Iik7CisgICAgY291dCA8PCAidGVzdE1hcCh7IiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IG1hcG91dC5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwb3V0LmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBtYXBpbjsKKyAgICBjb3V0IDw8ICJ9KSI7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG1hcGluOwogICAgIHRlc3RDbGllbnQudGVzdE1hcChtYXBpbiwgbWFwb3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBpbi5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwaW4uZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkID0+ICVkIiwgbV9pdGVyLT5maXJzdCwgbV9pdGVyLT5zZWNvbmQpOworICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtYXBpbiAhPSBtYXBvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU1RSSU5HIE1BUCBURVNUCisgICAgICovCisgICAgY291dCA8PCAidGVzdFN0cmluZ01hcCh7YSA9PiAyLCBiID0+IGJsYWgsIHNvbWUgPT4gdGhpbmd9KSA9IHsiIDw8IGZsdXNoOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcGluOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcG91dDsKKyAgICBzbWFwaW5bImEiXSA9ICIyIjsKKyAgICBzbWFwaW5bImIiXSA9ICJibGFoIjsKKyAgICBzbWFwaW5bInNvbWUiXSA9ICJ0aGluZyI7CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChzbWFwb3V0LCBzbWFwaW4pOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNtYXBvdXQuYmVnaW4oKTsgaXQgIT0gc21hcG91dC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBjb3V0IDw8IGl0LT5maXJzdCA8PCAiID0+ICIgPDwgaXQtPnNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAoc21hcGluICE9IHNtYXBvdXQpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNFVCBURVNUCkBAIC0yMzQsMjIyICs3MDcsMzY3IEBACiAgICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewogICAgICAgc2V0b3V0Lmluc2VydChpKTsKICAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U2V0KHsiIDw8IGZsdXNoOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHNfaXRlciA9IHNldG91dC5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0b3V0LmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7CisgICAgY291dCA8PCAifSkiOwogICAgIHNldDxpbnQzMl90PiBzZXRpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RTZXQoc2V0aW4sIHNldG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0aW4uYmVnaW4oKTsgc19pdGVyICE9IHNldGluLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKHNldGluICE9IHNldG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBMSVNUIFRFU1QKICAgICAgKi8KLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKLSAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7Ci0gICAgICBsaXN0b3V0LnB1c2hfYmFjayhpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7Ci0gICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdG91dC5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdG91dC5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIGNvdXQgPDwgInRlc3RMaXN0KGVtcHR5KSIgPDwgZmx1c2g7CisgICAgdHJ5IHsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OworICAgICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0b3V0LCB2ZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICBpZiAoIWxpc3RvdXQuZW1wdHkoKSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgY291dCA8PCAiaW52YWxpZCBsZW5ndGg6ICIgPDwgbGlzdG91dC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdGluOwotICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdGluLCBsaXN0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaXN0aW4uYmVnaW4oKTsgbF9pdGVyICE9IGxpc3Rpbi5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgICBjb3V0IDw8ICJ0ZXN0TGlzdCh7IiA8PCBmbHVzaDsKKyAgICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0pIjsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CiAKICAgICAvKioKICAgICAgKiBFTlVNIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RFbnVtKE9ORSkiKTsKLSAgICBOdW1iZXJ6IHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oT05FKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKE9ORSkiIDw8IGZsdXNoOworICAgIE51bWJlcno6OnR5cGUgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpPTkUpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpPTkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7Ci0gICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShUV08pOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAidGVzdEVudW0oVFdPKSIgPDwgZmx1c2g7CisgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUV08pOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUV08pIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUSFJFRSkiKTsKLSAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKFRIUkVFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKFRIUkVFKSIgPDwgZmx1c2g7CisgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUSFJFRSk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OlRIUkVFKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oRklWRSkiKTsKLSAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKEZJVkUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAidGVzdEVudW0oRklWRSkiIDw8IGZsdXNoOworICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RklWRSk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkZJVkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKLSAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKEVJR0hUKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEVJR0hUKSIgPDwgZmx1c2g7CisgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpFSUdIVCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRZUEVERUYgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgIGNvdXQgPDwgInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiIDw8IGZsdXNoOwogICAgIFVzZXJJZCB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0xMKTsKLSAgICBwcmludGYoIiA9ICUiUFJJZDY0IlxuIiwgdWlkKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHVpZCA8PCBlbmRsOworICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTEwpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgY291dCA8PCAidGVzdE1hcE1hcCgxKSIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+IG1tOwogICAgIHRlc3RDbGllbnQudGVzdE1hcE1hcChtbSwgMSk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+Ojpjb25zdF9pdGVyYXRvciBtaTsKICAgICBmb3IgKG1pID0gbW0uYmVnaW4oKTsgbWkgIT0gbW0uZW5kKCk7ICsrbWkpIHsKICAgICAgIHByaW50ZigiJWQgPT4geyIsIG1pLT5maXJzdCk7CiAgICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1pMjsKICAgICAgIGZvciAobWkyID0gbWktPnNlY29uZC5iZWdpbigpOyBtaTIgIT0gbWktPnNlY29uZC5lbmQoKTsgKyttaTIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiAlZCwgIiwgbWkyLT5maXJzdCwgbWkyLT5zZWNvbmQpOworICAgICAgICBjb3V0IDw8IG1pMi0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1pMi0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwKKyAgICAgICAgbW1bLTRdWy00XSAhPSAtNCB8fAorICAgICAgICBtbVstNF1bLTNdICE9IC0zIHx8CisgICAgICAgIG1tWy00XVstMl0gIT0gLTIgfHwKKyAgICAgICAgbW1bLTRdWy0xXSAhPSAtMSB8fAorICAgICAgICBtbVs0XVs0XSAhPSA0IHx8CisgICAgICAgIG1tWzRdWzNdICE9IDMgfHwKKyAgICAgICAgbW1bNF1bMl0gIT0gMiB8fAorICAgICAgICBtbVs0XVsxXSAhPSAxKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIElOU0FOSVRZIFRFU1QKICAgICAgKi8KLSAgICBJbnNhbml0eSBpbnNhbmU7Ci0gICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihGSVZFLCA1MDAwKSk7Ci0gICAgWHRydWN0IHRydWNrOwotICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7Ci0gICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7Ci0gICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKLSAgICB0cnVjay5pNjRfdGhpbmcgPSA4OwotICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjayk7Ci0gICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5PiA+IHdob2E7Ci0gICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkod2hvYSwgaW5zYW5lKTsKLSAgICBwcmludGYoIiA9IHsiKTsKLSAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOwotICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJSJQUklkNjQiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKLSAgICAgIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7Ci0gICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gICAgICAgICAgICsraTJfaXRlcikgewotICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7Ci0gICAgICAgIG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKLSAgICAgICAgbWFwPE51bWJlcnosIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgewotICAgICAgICAgIHByaW50ZigiJWQgPT4gJSJQUklkNjQiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgaWYgKCFub2luc2FuZSkgeworICAgICAgSW5zYW5pdHkgaW5zYW5lOworICAgICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1KSk7CisgICAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7CisgICAgICBYdHJ1Y3QgdHJ1Y2s7CisgICAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDQ7CisgICAgICB0cnVjay5pMzJfdGhpbmcgPSA0OworICAgICAgdHJ1Y2suaTY0X3RoaW5nID0gNDsKKyAgICAgIFh0cnVjdCB0cnVjazI7CisgICAgICB0cnVjazIuc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICB0cnVjazIuYnl0ZV90aGluZyA9IDI7CisgICAgICB0cnVjazIuaTMyX3RoaW5nID0gMjsKKyAgICAgIHRydWNrMi5pNjRfdGhpbmcgPSAyOworICAgICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrKTsKKyAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjazIpOworICAgICAgY291dCA8PCAidGVzdEluc2FuaXR5KCkiIDw8IGZsdXNoOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHdob2E7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eSh3aG9hLCBpbnNhbmUpOworICAgICAgY291dCA8PCAiID0geyI7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CisgICAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7IGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7ICsraTJfaXRlcikgeworICAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CisgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOworICAgICAgICAgIGNvdXQgPDwgInsiOworICAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKKyAgICAgICAgICAgIGNvdXQgPDwgdW0tPmZpcnN0IDw8ICIgPT4gIiA8PCB1bS0+c2Vjb25kOworICAgICAgICAgIH0KKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCi0gICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKLSAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7Ci0gICAgICAgIHByaW50ZigieyIpOwotICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICIsCi0gICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCi0gICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKLSAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn0iKTsKKyAgICAgICAgICB2ZWN0b3I8WHRydWN0PiB4dHJ1Y3RzID0gaTJfaXRlci0+c2Vjb25kLnh0cnVjdHM7CisgICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CisgICAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgeworICAgICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgICB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvdXQgPDwgIn0iOwogCi0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgICAgY291dCA8PCAifSwgIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDEgPSB3aG9hLmZpbmQoVXNlcklkKDEpKTsKKyAgICAgIGlmICh3aG9hLnNpemUoKSAhPSAyKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoaXQxID09IHdob2EuZW5kKCkpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MTIgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRXTyk7CisgICAgICAgIGlmIChpdDEyID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MTItPnNlY29uZCAhPSBpbnNhbmUpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MTMgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRIUkVFKTsKKyAgICAgICAgaWYgKGl0MTMgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQxMy0+c2Vjb25kICE9IGluc2FuZSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaXQyID0gd2hvYS5maW5kKFVzZXJJZCgyKSk7CisgICAgICBpZiAoaXQyID09IHdob2EuZW5kKCkpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MjYgPSBpdDItPnNlY29uZC5maW5kKE51bWJlcno6OlNJWCk7CisgICAgICAgIGlmIChpdDI2ID09IGl0Mi0+c2Vjb25kLmVuZCgpIHx8IGl0MjYtPnNlY29uZCAhPSBJbnNhbml0eSgpKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICB9CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisKKyAgICAvKioKKyAgICAgKiBNVUxUSSBURVNUCisgICAgICovCisgICAgY291dCA8PCAidGVzdE11bHRpKCkiIDw8IGVuZGw7CisgICAgdHJ5IHsKKyAgICAgIG1hcDxpbnQxNl90LCBzdHJpbmc+IG11bF9tYXA7CisgICAgICBYdHJ1Y3QgbXVsX3Jlc3VsdDsKKyAgICAgIG11bF9tYXBbMV0gPSAiYmxhaCI7CisgICAgICBtdWxfbWFwWzJdID0gInRoaW5nIjsKKyAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpKG11bF9yZXN1bHQsIDQyLCA0MjQyLCA0MjQyNDIsIG11bF9tYXAsIE51bWJlcno6OkVJR0hULCBVc2VySWQoMjQpKTsKKyAgICAgIFh0cnVjdCB4eHM7CisgICAgICB4eHMuc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICB4eHMuYnl0ZV90aGluZyA9IDQyOworICAgICAgeHhzLmkzMl90aGluZyA9IDQyNDI7CisgICAgICB4eHMuaTY0X3RoaW5nID0gNDI0MjQyOworICAgICAgaWYgKG11bF9yZXN1bHQgIT0geHhzKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAotICAgIH0gY2F0Y2goWGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChYY2VwdGlvbiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZS5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworCisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKKyAgICAgIGNvdXQgPDwgIiAgQ2F1Z2h0IFRFeGNlcHRpb24iIDw8IGVuZGw7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuIik7Ci0gICAgfSBjYXRjaCguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOworICAgICAgY291dCA8PCAiICB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3QgbXVsdGkgZXhjZXB0aW9uICovCiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgIHByaW50ZigiICByZXN1bHRcbkZBSUxVUkVcbiIpOwotICAgIH0gY2F0Y2goWGNlcHRpb24mIGUpIHsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0gY2F0Y2ggKFhjZXB0aW9uJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24yIiwgInRlc3QgMiIpOwotICAgICAgcHJpbnRmKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICBjb3V0IDw8ICIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAotICAgIH0gY2F0Y2goWGNlcHRpb24yJiBlKSB7CisgICAgfSBjYXRjaCAoWGNlcHRpb24yJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCB7XCIlc1wifX1cbiIsIGUuZXJyb3JDb2RlLCBlLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgInN1Y2Nlc3MiLCAidGVzdCAzIik7CiAgICAgICBwcmludGYoIiAge3tcIiVzXCJ9fVxuIiwgcmVzdWx0LnN0cmluZ190aGluZy5jX3N0cigpKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgcHJpbnRmKCIgIGV4Y2VwdGlvblxuRkFJTFVSRVxuIik7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfQogCiAgICAgLyogdGVzdCBvbmV3YXkgdm9pZCAqLwogICAgIHsKLSAgICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMykgPT4iKTsKLSAgICAgICAgdWludDY0X3Qgc3RhcnRPbmV3YXkgPSBub3coKTsKLSAgICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOwotICAgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKLSAgICAgICAgaWYgKGVsYXBzZWQgPiAyMDAgKiAxMDAwKSB7IC8vIDAuMiBzZWNvbmRzCi0gICAgICAgICAgICBwcmludGYoIiAgRkFJTFVSRSAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgIH0KKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIgPDwgZmx1c2g7CisgICAgICB1aW50NjRfdCBzdGFydE9uZXdheSA9IG5vdygpOworICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7CisgICAgICBpZiAoZWxhcHNlZCA+IDIwMCAqIDEwMDApIHsgLy8gMC4yIHNlY29uZHMKKyAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKiAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ2MywxNSArMTA4MSwxOCBAQAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7Ci0gICAgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOworICAgIGNvdXQgPDwgInJlLXRlc3QgdGVzdEkzMigtMSkiIDw8IGZsdXNoOworICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgaTMyIDw8IGVuZGw7CisgICAgaWYgKGkzMiAhPSAtMSkKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAKKyAgICBjb3V0IDw8IGVuZGwgPDwgIkFsbCB0ZXN0cyBkb25lLiIgPDwgZW5kbCA8PCBmbHVzaDsKIAogICAgIHVpbnQ2NF90IHN0b3AgPSBub3coKTsKLSAgICB1aW50NjRfdCB0b3QgPSBzdG9wLXN0YXJ0OworICAgIHVpbnQ2NF90IHRvdCA9IHN0b3AgLSBzdGFydDsKIAotICAgIHByaW50ZigiVG90YWwgdGltZTogJSJQUkl1NjQiIHVzXG4iLCBzdG9wLXN0YXJ0KTsKKyAgICBjb3V0IDw8ICJUb3RhbCB0aW1lOiAiIDw8IHN0b3AgLSBzdGFydCA8PCAiIHVzIiA8PCBlbmRsOwogCiAgICAgdGltZV90b3QgKz0gdG90OwogICAgIGlmICh0aW1lX21pbiA9PSAwIHx8IHRvdCA8IHRpbWVfbWluKSB7CkBAIC00ODEsMTcgKzExMDIsNzkgQEAKICAgICAgIHRpbWVfbWF4ID0gdG90OwogICAgIH0KIAorICAgIGNvdXQgPDwgZmx1c2g7CiAgICAgdHJhbnNwb3J0LT5jbG9zZSgpOwogICB9CiAKLSAgLy8gIHByaW50ZigiXG5Tb2NrZXQgc3lzY2FsbHM6ICV1IiwgZ19zb2NrZXRfc3lzY2FsbHMpOwotICBwcmludGYoIlxuQWxsIHRlc3RzIGRvbmUuXG4iKTsKIAogICB1aW50NjRfdCB0aW1lX2F2ZyA9IHRpbWVfdG90IC8gbnVtVGVzdHM7CiAKLSAgcHJpbnRmKCJNaW4gdGltZTogJSJQUkl1NjQiIHVzXG4iLCB0aW1lX21pbik7Ci0gIHByaW50ZigiTWF4IHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgdGltZV9tYXgpOwotICBwcmludGYoIkF2ZyB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHRpbWVfYXZnKTsKKyAgY291dCA8PCAiTWluIHRpbWU6ICIgPDwgdGltZV9taW4gPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiTWF4IHRpbWU6ICIgPDwgdGltZV9tYXggPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiQXZnIHRpbWU6ICIgPDwgdGltZV9hdmcgPDwgIiB1cyIgPDwgZW5kbDsKIAotICByZXR1cm4gMDsKKyAgcmV0dXJuIHJldHVybl9jb2RlOworfQorCit2b2lkIGJpbmFyeV9maWxsKHN0ZDo6c3RyaW5nJiBzdHIsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisKKyAgICBzdHIucmVzaXplKHNpeik7CisgICAgY2hhciAqcHRyID0gJnN0clswXTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwb3MgPT0gMjU1KSB7IHBvcyA9IDA7IH0gZWxzZSB7ICsrcG9zOyB9CisgICAgICAgICpwdHIrKyA9IGJpbl9kYXRhW3Bvc107CisgICAgfQorfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0cmluZyBiaW5fcmVxdWVzdDsKKyAgICBzdHJpbmcgYmluX3Jlc3VsdDsKKworICAgIGNvdXQgPDwgInRlc3RCaW5hcnkoc2l6ID0gIiA8PCBzaXogPDwgIikiIDw8IGVuZGw7CisgICAgYmluYXJ5X2ZpbGwoYmluX3JlcXVlc3QsIHNpeik7CisgICAgdHJ5IHsKKyAgICAgICAgdGVzdENsaWVudC50ZXN0QmluYXJ5KGJpbl9yZXN1bHQsIGJpbl9yZXF1ZXN0KTsKKworICAgICAgICBpZiAoYmluX3JlcXVlc3Quc2l6ZSgpICE9IGJpbl9yZXN1bHQuc2l6ZSgpKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiByZXF1ZXN0IHNpemUgIiA8PCBiaW5fcmVxdWVzdC5zaXplKCkgPDwgIjsgcmVzdWx0IHNpemUgIiA8PCBiaW5fcmVzdWx0LnNpemUoKSA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiaW5fcmVxdWVzdC5hdChpKSAhPSBiaW5fcmVzdWx0LmF0KGkpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogYXQgcG9zaXRpb24gIiA8PCBpIDw8ICIgcmVxdWVzdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3JlcXVlc3QuYXQoaSkgPDwgIiByZXN1bHRbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXN1bHQuYXQoaSkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCmluZGV4IDgzNDU0ZGMuLjYyMjIwMTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKQEAgLTE3LDI4ICsxNyw1OSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiU2Vjb25kU2VydmljZS5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKIAorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorCisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKQEAgLTQ2LDE5ICs3NywzMyBAQAogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKKwogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlc3RIYW5kbGVyKCkge30KIAotICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigidGVzdFZvaWQoKVxuIik7Ci0gIH0KKyAgdm9pZCB0ZXN0Vm9pZCgpIHsgcHJpbnRmKCJ0ZXN0Vm9pZCgpXG4iKTsgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAorICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKQEAgLTcwLDI3ICsxMTUsNDQgQEAKICAgfQogCiAgIGludDY0X3QgdGVzdEk2NChjb25zdCBpbnQ2NF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0STY0KCUiUFJJZDY0IilcbiIsIHRoaW5nKTsKKyAgICBwcmludGYoInRlc3RJNjQoJSIgUFJJZDY0ICIpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgZG91YmxlIHRlc3REb3VibGUoY29uc3QgZG91YmxlIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgICBwcmludGYoInRlc3REb3VibGUoJWYpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaGV4c3RyOworICAgIGhleHN0ciA8PCBzdGQ6OmhleCA8PCB0aGluZzsKKyAgICBwcmludGYoInRlc3RCaW5hcnkoJWx1OiAlcylcbiIsIHNhZmVfbnVtZXJpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHRoaW5nLnNpemUoKSksIGhleHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICBfcmV0dXJuID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAorICAgICAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgKGludCl0aGluZy5ieXRlX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgewotICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb25zdCBYdHJ1Y3QmIHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgcHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH0pXG4iLAorICAgICAgICAgICAoaW50KW5lc3QuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgIChpbnQpdGhpbmcuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcsCisgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nKTsKICAgICBvdXQgPSBuZXN0OwogICB9CiAKLSAgdm9pZCB0ZXN0TWFwKG1hcDxpbnQzMl90LCBpbnQzMl90PiAmb3V0LCBjb25zdCBtYXA8aW50MzJfdCwgaW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4mIG91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHByaW50ZigidGVzdE1hcCh7Iik7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMDYsNyArMTY4LDI0IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiJXMgPT4gJXMiLCAobV9pdGVyLT5maXJzdCkuY19zdHIoKSwgKG1faXRlci0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICB9CisgICAgcHJpbnRmKCJ9KVxuIik7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTZXQoeyIpOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTIyLDcgKzIwMSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKICAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTEzOCw4MCArMjE3LDU4IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICBOdW1iZXJ6IHRlc3RFbnVtKGNvbnN0IE51bWJlcnogdGhpbmcpIHsKKyAgTnVtYmVyejo6dHlwZSB0ZXN0RW51bShjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAogICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+JiBtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKICAgICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CiAKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBwb3M7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbmVnOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBwb3M7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG5lZzsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSxpKSk7Ci0gICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwtaSkpOworICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSwgaSkpOworICAgICAgbmVnLmluc2VydChtYWtlX3BhaXIoLWksIC1pKSk7CiAgICAgfQogCiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoNCwgcG9zKSk7CiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOwotCiAgIH0KIAotICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKKyAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+JiBpbnNhbmUsIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewogICAgIHByaW50ZigidGVzdEluc2FuaXR5KClcbiIpOwogCi0gICAgWHRydWN0IGhlbGxvOwotICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLQotICAgIFh0cnVjdCBnb29kYnllOwotICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgICBJbnNhbml0eSBjcmF6eTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoRUlHSFQsIDgpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhnb29kYnllKTsKLQogICAgIEluc2FuaXR5IGxvb25leTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoRklWRSwgNSkpOwotICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGhlbGxvKTsKKyAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IGZpcnN0X21hcDsKKyAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IHNlY29uZF9tYXA7CiAKLSAgICBtYXA8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcDsKLSAgICBtYXA8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXA7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VFdPLCBhcmd1bWVudCkpOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRIUkVFLCBhcmd1bWVudCkpOwogCi0gICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoVFdPLCBjcmF6eSkpOwotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKFRIUkVFLCBjcmF6eSkpOwotCi0gICAgc2Vjb25kX21hcC5pbnNlcnQobWFrZV9wYWlyKFNJWCwgbG9vbmV5KSk7CisgICAgc2Vjb25kX21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlNJWCwgbG9vbmV5KSk7CiAKICAgICBpbnNhbmUuaW5zZXJ0KG1ha2VfcGFpcigxLCBmaXJzdF9tYXApKTsKICAgICBpbnNhbmUuaW5zZXJ0KG1ha2VfcGFpcigyLCBzZWNvbmRfbWFwKSk7CiAKICAgICBwcmludGYoInJldHVybiIpOwogICAgIHByaW50ZigiID0geyIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CiAgICAgZm9yIChpX2l0ZXIgPSBpbnNhbmUuYmVnaW4oKTsgaV9pdGVyICE9IGluc2FuZS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJSJQUklkNjQiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKLSAgICAgIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7Ci0gICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gICAgICAgICAgICsraTJfaXRlcikgeworICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsgKytpMl9pdGVyKSB7CiAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKLSAgICAgICAgbWFwPE51bWJlcnosIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwotICAgICAgICBtYXA8TnVtYmVyeiwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwogICAgICAgICBwcmludGYoInsiKTsKICAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgewotICAgICAgICAgIHByaW50ZigiJWQgPT4gJSJQUklkNjQiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOworICAgICAgICAgIHByaW50ZigiJWQgPT4gJSIgUFJJZDY0ICIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CiAgICAgICAgIH0KICAgICAgICAgcHJpbnRmKCJ9LCAiKTsKIApAQCAtMjE5LDcgKzI3NiwxMSBAQAogICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKICAgICAgICAgcHJpbnRmKCJ7Iik7CiAgICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKLSAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgIiwgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpeC0+Ynl0ZV90aGluZywgeC0+aTMyX3RoaW5nLCB4LT5pNjRfdGhpbmcpOworICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKICAgICAgICAgfQogICAgICAgICBwcmludGYoIn0iKTsKIApAQCAtMjI4LDExICsyODksMTkgQEAKICAgICAgIHByaW50ZigifSwgIik7CiAgICAgfQogICAgIHByaW50ZigifVxuIik7Ci0KLQogICB9CiAKLSAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0ICZoZWxsbywgY29uc3QgaW50OF90IGFyZzAsIGNvbnN0IGludDMyX3QgYXJnMSwgY29uc3QgaW50NjRfdCBhcmcyLCBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4gICZhcmczLCBjb25zdCBOdW1iZXJ6IGFyZzQsIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgIHZvaWQgdGVzdE11bHRpKFh0cnVjdCYgaGVsbG8sCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFyZzEsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+JiBhcmczLAorICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgICAgKHZvaWQpYXJnMzsKKyAgICAodm9pZClhcmc0OworICAgICh2b2lkKWFyZzU7CisKICAgICBwcmludGYoInRlc3RNdWx0aSgpXG4iKTsKIAogICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwpAQCAtMjQxLDE2ICszMTAsMTQgQEAKICAgICBoZWxsby5pNjRfdGhpbmcgPSAoaW50NjRfdClhcmcyOwogICB9CiAKLSAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCi0gICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQotICB7CisgIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgYXJnKSB7CiAgICAgcHJpbnRmKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnLmNfc3RyKCkpOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwogICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOwogICAgICAgZS5tZXNzYWdlID0gYXJnOwogICAgICAgdGhyb3cgZTsKLSAgICB9IGVsc2UgaWYgKGFyZy5jb21wYXJlKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpID09IDApIHsKKyAgICB9IGVsc2UgaWYgKGFyZy5jb21wYXJlKCJURXhjZXB0aW9uIikgPT0gMCkgewogICAgICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gZTsKICAgICAgIHRocm93IGU7CiAgICAgfSBlbHNlIHsKQEAgLTI2MCw3ICszMjcsOSBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCAmcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzEpIHRocm93KFhjZXB0aW9uLCBYY2VwdGlvbjIpIHsKKyAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgewogCiAgICAgcHJpbnRmKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgYXJnMC5jX3N0cigpLCBhcmcxLmNfc3RyKCkpOwogCkBAIC0yODAsMTQ1ICszNDksNDk3IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7Ci0gICAgc2xlZXAoc2xlZXBGb3IpOwotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzbGVlcEZvcik7CisgIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IGFOdW0pIHsKKyAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBjYWxsIHJlY2VpdmVkXG4iLCBhTnVtKTsKICAgfQogfTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CitjbGFzcyBTZWNvbmRIYW5kbGVyIDogcHVibGljIFNlY29uZFNlcnZpY2VJZgoreworICBwdWJsaWM6CisgICAgdm9pZCBzZWNvbmR0ZXN0U3RyaW5nKHN0ZDo6c3RyaW5nJiByZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykKKyAgICB7IHJlc3VsdCA9ICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7IH0KK307CiAKLSAgaW50IHBvcnQgPSA5MDkwOwotICBzdHJpbmcgc2VydmVyVHlwZSA9ICJzaW1wbGUiOwotICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7CitjbGFzcyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyIDogcHVibGljIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgeworICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CisgICAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhmbl9uYW1lKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihjdHgpOworICB9CisgIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeyBjb21tdW5pY2F0ZSgicHJlUmVhZCIsIGN0eCwgZm5fbmFtZSk7IH0KKyAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZClieXRlczsKKyAgICBjb21tdW5pY2F0ZSgicG9zdFJlYWQiLCBjdHgsIGZuX25hbWUpOworICB9CisgIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVdyaXRlIiwgY3R4LCBmbl9uYW1lKTsgfQorICB2aXJ0dWFsIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZClieXRlczsKKyAgICBjb21tdW5pY2F0ZSgicG9zdFdyaXRlIiwgY3R4LCBmbl9uYW1lKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICBjb21tdW5pY2F0ZSgiYXN5bmNDb21wbGV0ZSIsIGN0eCwgZm5fbmFtZSk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICBjb21tdW5pY2F0ZSgiaGFuZGxlckVycm9yIiwgY3R4LCBmbl9uYW1lKTsKKyAgfQogCi0gIG9zdHJpbmdzdHJlYW0gdXNhZ2U7CisgIHZvaWQgY29tbXVuaWNhdGUoY29uc3QgY2hhciogZXZlbnQsIHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgIHN0ZDo6Y291dCA8PCBldmVudCA8PCAiOiAiIDw8ICpzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZyo+KGN0eCkgPDwgIiA9ICIgPDwgZm5fbmFtZSA8PCBzdGQ6OmVuZGw7CisgIH0KK307CiAKLSAgdXNhZ2UgPDwKLSAgICBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0iIDw8IGVuZGwgPDwKK2NsYXNzIFRlc3RIYW5kbGVyQXN5bmMgOiBwdWJsaWMgVGhyaWZ0VGVzdENvYlN2SWYgeworcHVibGljOgorICBUZXN0SGFuZGxlckFzeW5jKHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4mIGhhbmRsZXIpIDogX2RlbGVnYXRlKGhhbmRsZXIpIHt9CisgIHZpcnR1YWwgflRlc3RIYW5kbGVyQXN5bmMoKSB7fQogCi0gICAgIlx0XHRzZXJ2ZXItdHlwZVx0XHR0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLCBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKKyAgdmlydHVhbCB2b2lkIHRlc3RWb2lkKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IpIHsKKyAgICBfZGVsZWdhdGUtPnRlc3RWb2lkKCk7CisgICAgY29iKCk7CisgIH0KIAotICAgICJcdFx0cHJvdG9jb2wtdHlwZVx0XHR0eXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6OnN0cmluZyByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0U3RyaW5nKHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CiAKLSAgICAiXHRcdHdvcmtlcnNcdFx0TnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbDsKKyAgdmlydHVhbCB2b2lkIHRlc3RCb29sKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBib29sIHRoaW5nKSB7CisgICAgYm9vbCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCb29sKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQogCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKKyAgICBpbnQ4X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qnl0ZSh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KIAotICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewotICAgIHN0cmluZyBhcmcoYXJndltpeF0pOwotICAgIGlmIChhcmcuY29tcGFyZSgwLDIsICItLSIpID09IDApIHsKLSAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwotICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKLQlhcmdzW3N0cmluZyhhcmcsIDIsIGVuZCAtIDIpXSA9IHN0cmluZyhhcmcsIGVuZCArIDEpOwotICAgICAgfSBlbHNlIHsKLQlhcmdzW3N0cmluZyhhcmcsIDIpXSA9ICJ0cnVlIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIrYXJnKTsKKyAgdmlydHVhbCB2b2lkIHRlc3RJMzIoc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgICBpbnQzMl90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEkzMih0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdEk2NChzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgeworICAgIGludDY0X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STY0KHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgeworICAgIGRvdWJsZSByZXMgPSBfZGVsZWdhdGUtPnRlc3REb3VibGUodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6OnN0cmluZyByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0QmluYXJ5KHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgeworICAgIFh0cnVjdCByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0U3RydWN0KHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgeworICAgIFh0cnVjdDIgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdE5lc3QocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE1hcChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RNYXAocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZ01hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmdNYXAocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdFNldChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzZXQ8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGludDMyX3Q+JiB0aGluZykgeworICAgIHN0ZDo6c2V0PGludDMyX3Q+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RTZXQocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdExpc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdExpc3QocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdEVudW0oc3RkOjpmdW5jdGlvbjx2b2lkKE51bWJlcno6OnR5cGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CisgICAgTnVtYmVyejo6dHlwZSByZXMgPSBfZGVsZWdhdGUtPnRlc3RFbnVtKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0VHlwZWRlZihzdGQ6OmZ1bmN0aW9uPHZvaWQoVXNlcklkIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBVc2VySWQgdGhpbmcpIHsKKyAgICBVc2VySWQgcmVzID0gX2RlbGVnYXRlLT50ZXN0VHlwZWRlZih0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE1hcE1hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3QgaW50MzJfdCBoZWxsbykgeworICAgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdE1hcE1hcChyZXMsIGhlbGxvKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0SW5zYW5pdHkoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgeworICAgIHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdEluc2FuaXR5KHJlcywgYXJndW1lbnQpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aShzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+JiBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VySWQgYXJnNSkgeworICAgIFh0cnVjdCByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0TXVsdGkocmVzLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0RXhjZXB0aW9uKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKKyAgICB0cnkgeworICAgICAgX2RlbGVnYXRlLT50ZXN0RXhjZXB0aW9uKGFyZyk7CisgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKKyAgICAgIGV4bl9jb2IoYXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihlKSk7CisgICAgICByZXR1cm47CiAgICAgfQorICAgIGNvYigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CisgICAgWHRydWN0IHJlczsKKyAgICB0cnkgeworICAgICAgX2RlbGVnYXRlLT50ZXN0TXVsdGlFeGNlcHRpb24ocmVzLCBhcmcwLCBhcmcxKTsKKyAgICB9IGNhdGNoIChjb25zdCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiYgZSkgeworICAgICAgZXhuX2NvYihhcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGUpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE9uZXdheShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBpbnQzMl90IHNlY29uZHNUb1NsZWVwKSB7CisgICAgX2RlbGVnYXRlLT50ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwKTsKKyAgICBjb2IoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gX2RlbGVnYXRlOworfTsKKworbmFtZXNwYWNlIHBvID0gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisKKyAgc3RyaW5nIHRlc3REaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnN0cmluZygpOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL3NlcnZlci5jcnQiOworICBzdHJpbmcga2V5UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmtleSI7CisKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKyAgaW50IHBvcnQgPSA5MDkwOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHpsaWIgPSBmYWxzZTsKKyAgc3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKKyAgc3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKKyAgc3RyaW5nIHNlcnZlcl90eXBlID0gInNpbXBsZSI7CisgIHN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgIGJvb2wgYWJzdHJhY3RfbmFtZXNwYWNlID0gZmFsc2U7CisgIHNpemVfdCB3b3JrZXJzID0gNDsKKyAgaW50IHN0cmluZ19saW1pdCA9IDA7CisgIGludCBjb250YWluZXJfbGltaXQgPSAwOworCisgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOworICBkZXNjLmFkZF9vcHRpb25zKCkKKyAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCisgICAgKCJwb3J0IiwgcG86OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLCAiUG9ydCBudW1iZXIgdG8gbGlzdGVuIikKKyAgICAoImRvbWFpbi1zb2NrZXQiLCBwbzo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCkgLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLCAiVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpIikKKyAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsICJDcmVhdGUgdGhlIGRvbWFpbiBzb2NrZXQgaW4gdGhlIEFic3RyYWN0IE5hbWVzcGFjZSAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgKCJzZXJ2ZXItdHlwZSIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLCAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKQorICAgICgidHJhbnNwb3J0IiwgcG86OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQorICAgICgicHJvdG9jb2wiLCBwbzo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksICJwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKKyAgICAoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgKCJ6bGliIiwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQorICAgICgicHJvY2Vzc29yLWV2ZW50cyIsICJwcm9jZXNzb3ItZXZlbnRzIikKKyAgICAoIndvcmtlcnMsbiIsIHBvOjp2YWx1ZTxzaXplX3Q+KCZ3b3JrZXJzKS0+ZGVmYXVsdF92YWx1ZSh3b3JrZXJzKSwgIk51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiKQorICAgICgic3RyaW5nLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJnN0cmluZ19saW1pdCkpCisgICAgKCJjb250YWluZXItbGltaXQiLCBwbzo6dmFsdWU8aW50PigmY29udGFpbmVyX2xpbWl0KSk7CisKKyAgcG86OnZhcmlhYmxlc19tYXAgdm07CisgIHBvOjpzdG9yZShwbzo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CisgIHBvOjpub3RpZnkodm0pOworCisgIGlmICh2bS5jb3VudCgiaGVscCIpKSB7CisgICAgY291dCA8PCBkZXNjIDw8ICJcbiI7CisgICAgcmV0dXJuIDE7CiAgIH0KIAogICB0cnkgewotCi0gICAgaWYgKCFhcmdzWyJwb3J0Il0uZW1wdHkoKSkgewotICAgICAgcG9ydCA9IGF0b2koYXJnc1sicG9ydCJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1sic2VydmVyLXR5cGUiXS5lbXB0eSgpKSB7Ci0gICAgICBzZXJ2ZXJUeXBlID0gYXJnc1sic2VydmVyLXR5cGUiXTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7Ci0gICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewotICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKLSAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAibm9uYmxvY2tpbmciKSB7CisgICAgaWYgKCFzZXJ2ZXJfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAoc2VydmVyX3R5cGUgPT0gInNpbXBsZSIpIHsKKyAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZC1wb29sIikgeworICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkZWQiKSB7CisgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJub25ibG9ja2luZyIpIHsKICAgICAgIH0gZWxzZSB7Ci0JdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiK3NlcnZlclR5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIgKyBzZXJ2ZXJfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFhcmdzWyJwcm90b2NvbC10eXBlIl0uZW1wdHkoKSkgewotICAgICAgcHJvdG9jb2xUeXBlID0gYXJnc1sicHJvdG9jb2wtdHlwZSJdOwotICAgICAgaWYgKHByb3RvY29sVHlwZSA9PSAiYmluYXJ5IikgewotICAgICAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gImFzY2lpIikgewotCXRocm93IGludmFsaWRfYXJndW1lbnQoIkFTQ0lJIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICJ4bWwiKSB7Ci0JdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiWE1MIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpZiAoIXByb3RvY29sX3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aSIpIHsgIC8vIG11bHRpcGxleGVkIGJpbmFyeQorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7IC8vIG11bHRpcGxleGVkIGNvbXBhY3QKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeyAvLyBtdWx0aXBsZXhlZCBoZWFkZXIKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeyAvLyBtdWx0aXBsZXhlZCBqc29uCiAgICAgICB9IGVsc2UgewotCXRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiK3Byb3RvY29sVHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgewotICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKKyAgICBpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiYnVmZmVyZWQiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0ZXIgd2lsbCBwYXNzIHpsaWIgYXMgYSBmbGFnIGFuZCBhIHRyYW5zcG9ydCByaWdodCBub3cuLi4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKKyAgICAgIH0KICAgICB9Ci0gIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZSkgeworCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNlcnIgPDwgdXNhZ2U7CisgICAgY291dCA8PCBkZXNjIDw8ICJcbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAodm0uY291bnQoInNzbCIpKSB7CisgICAgc3NsID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgiemxpYiIpKSB7CisgICAgemxpYiA9IHRydWU7CisgIH0KKworI2lmIGRlZmluZWQoSEFWRV9TSUdOQUxfSCkgJiYgZGVmaW5lZChTSUdQSVBFKQorICBpZiAoc3NsKSB7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAvLyBmb3IgT3BlblNTTCwgb3RoZXJ3aXNlIHdlIGVuZCBhYnJ1cHRseQorICB9CisjZW5kaWYKKworICBpZiAodm0uY291bnQoImFic3RyYWN0LW5hbWVzcGFjZSIpKSB7CisgICAgYWJzdHJhY3RfbmFtZXNwYWNlID0gdHJ1ZTsKICAgfQogCiAgIC8vIERpc3BhdGNoZXIKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0KLSAgc2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOwotCi0gIHNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOwotCi0gIC8vIFRyYW5zcG9ydAotICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0KLSAgLy8gRmFjdG9yeQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwotCi0gIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7Ci0KLSAgICAvLyBTZXJ2ZXIKLSAgICBUU2ltcGxlU2VydmVyIHNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLAotCQkJICAgICAgIHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgICBwcmludGYoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAlZC4uLlxuIiwgcG9ydCk7Ci0gICAgc2ltcGxlU2VydmVyLnNlcnZlKCk7Ci0KLSAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KLSAgICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCi0gICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLQotICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICBUVGhyZWFkUG9vbFNlcnZlciB0aHJlYWRQb29sU2VydmVyKHRlc3RQcm9jZXNzb3IsCi0JCQkJICAgICAgIHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0JCQkJICAgICAgIHRocmVhZE1hbmFnZXIpOwotCi0gICAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgJWQuLi5cbiIsIHBvcnQpOwotICAgIHRocmVhZFBvb2xTZXJ2ZXIuc2VydmUoKTsKLQotICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgewotCi0gICAgVFRocmVhZGVkU2VydmVyIHRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQotICAgIHByaW50ZigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKLSAgICB0aHJlYWRlZFNlcnZlci5zZXJ2ZSgpOwotCi0gIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAibm9uYmxvY2tpbmciKSB7Ci0gICAgVE5vbmJsb2NraW5nU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHBvcnQpOwotICAgIHByaW50ZigiU3RhcnRpbmcgdGhlIG5vbmJsb2NraW5nIHNlcnZlciBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKLSAgICBub25ibG9ja2luZ1NlcnZlci5zZXJ2ZSgpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OworICBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBqc29uUHJvdG9jb2xGYWN0b3J5KG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBwcm90b2NvbEZhY3RvcnkgPSBqc29uUHJvdG9jb2xGYWN0b3J5OworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+ICpjb21wYWN0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4oKTsKKyAgICBjb21wYWN0UHJvdG9jb2xGYWN0b3J5LT5zZXRDb250YWluZXJTaXplTGltaXQoY29udGFpbmVyX2xpbWl0KTsKKyAgICBjb21wYWN0UHJvdG9jb2xGYWN0b3J5LT5zZXRTdHJpbmdTaXplTGltaXQoc3RyaW5nX2xpbWl0KTsKKyAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoY29tcGFjdFByb3RvY29sRmFjdG9yeSk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGhlYWRlclByb3RvY29sRmFjdG9yeShuZXcgVEhlYWRlclByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBwcm90b2NvbEZhY3RvcnkgPSBoZWFkZXJQcm90b2NvbEZhY3Rvcnk7CisgIH0gZWxzZSB7CisgICAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KiBiaW5hcnlQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRDb250YWluZXJTaXplTGltaXQoY29udGFpbmVyX2xpbWl0KTsKKyAgICBiaW5hcnlQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChiaW5hcnlQcm90b2NvbEZhY3RvcnkpOwogICB9CiAKLSAgcHJpbnRmKCJkb25lLlxuIik7CisgIC8vIFByb2Nlc3NvcnMKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CisKKyAgaWYgKHZtLmNvdW50KCJwcm9jZXNzb3ItZXZlbnRzIikpIHsKKyAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPihuZXcgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlcigpKSk7CisgIH0KKworICAvLyBUcmFuc3BvcnQKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBzc2xTb2NrZXRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OworCisgIGlmIChzc2wpIHsKKyAgICBzc2xTb2NrZXRGYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgICAgaWYgKHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7CisgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKKyAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7CisgICAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVubGluayhkb21haW5fc29ja2V0LmNfc3RyKCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQorICAgICAgcG9ydCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgfQorICB9CisKKyAgLy8gRmFjdG9yeQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIiAmJiBzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpOworICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CisgIH0gZWxzZSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKTsKKyAgfQorCisgIGlmICh6bGliKSB7CisgICAgLy8gaG1tLi4gZG9lc24ndCBzZWVtIHRvIGJlIGEgd2F5IHRvIG1ha2UgaXQgd3JhcCB0aGUgb3RoZXJzLi4uCisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFpsaWJUcmFuc3BvcnRGYWN0b3J5PigpOworICB9CisKKyAgLy8gU2VydmVyIEluZm8KKyAgY291dCA8PCAiU3RhcnRpbmcgXCIiIDw8IHNlcnZlcl90eXBlIDw8ICJcIiBzZXJ2ZXIgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUKKyAgICAgICA8PCAiKSBsaXN0ZW4gb246ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CisgIGlmIChwb3J0ICE9IDApIHsKKyAgICBjb3V0IDw8IHBvcnQ7CisgIH0KKyAgY291dCA8PCBlbmRsOworCisgIC8vIE11bHRpcGxleGVkIFByb2Nlc3NvciBpZiBuZWVkZWQKKyAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRIYW5kbGVyPiBzZWNvbmRIYW5kbGVyKG5ldyBTZWNvbmRIYW5kbGVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yPiBzZWNvbmRQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VQcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcikpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gbXVsdGlwbGV4ZWRQcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJEZWZhdWx0KHRlc3RQcm9jZXNzb3IpOyAvLyBub24tbXVsdGkgY2xpZW50cyBnbyB0byB0aGUgZGVmYXVsdCBwcm9jZXNzb3IgKG11bHRpOmJpbmFyeSwgbXVsdGljOmNvbXBhY3QsIC4uLikKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpOworICAgIHRlc3RQcm9jZXNzb3IgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQcm9jZXNzb3I+KG11bHRpcGxleGVkUHJvY2Vzc29yKTsKKyAgfQorCisgIC8vIFNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOworCisgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgeworICAgIHNlcnZlci5yZXNldChuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CisgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZGVkIikgeworICAgIHNlcnZlci5yZXNldCgKKyAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJub25ibG9ja2luZyIpIHsKKyAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAorICAgICAgICAgIG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKKyAgICAgICAgICBuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IodGVzdFByb2Nlc3NvckFzeW5jLCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgLy8gbm90IGxvYWRpbmcgbm9uYmxvY2tpbmdTZXJ2ZXIgaW50byAic2VydmVyIiBiZWNhdXNlCisgICAgICAvLyBURXZodHRwU2VydmVyIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFRTZXJ2ZXIsIGFuZCBkb2Vzbid0CisgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCisgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOworICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IG5iU29ja2V0OworICAgICAgbmJTb2NrZXQucmVzZXQoCisgICAgICAgICAgc3NsID8gbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpCisgICAgICAgICAgICAgIDogbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVE5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgY2VyciA8PCAic2VydmVyLXR5cGUgbm9uYmxvY2tpbmcgcmVxdWlyZXMgdHJhbnNwb3J0IG9mIGh0dHAgb3IgZnJhbWVkIiA8PCBlbmRsOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKworICBpZiAoc2VydmVyLmdldCgpICE9IE5VTEwpIHsKKyAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgLy8gVGVsbCB0aGUgc2VydmVyIHRvIHVzZSB0aGUgc2FtZSBwcm90b2NvbCBmb3IgaW5wdXQgLyBvdXRwdXQKKyAgICAgIC8vIGlmIHVzaW5nIGhlYWRlcgorICAgICAgc2VydmVyLT5zZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIH0KKyAgICAKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OworICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlPiBzZXJ2ZXJUaHJlYWRSdW5uZXIoc2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZAorICAgICAgICA9IGZhY3RvcnkubmV3VGhyZWFkKHNlcnZlclRocmVhZFJ1bm5lcik7CisKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisgICAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgZ01vbml0b3Iud2FpdEZvcmV2ZXIoKTsgICAgICAgICAvLyB3YWl0IGZvciBhIHNodXRkb3duIHNpZ25hbAorICAgIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyNlbmRpZgorCisgICAgc2VydmVyLT5zdG9wKCk7CisgICAgdGhyZWFkLT5qb2luKCk7CisgICAgc2VydmVyLnJlc2V0KCk7CisgIH0KKworICBjb3V0IDw8ICJkb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAgYi90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTYwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgorCituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworYm9vbCBJbnNhbml0eTo6b3BlcmF0b3I8KHRocmlmdDo6dGVzdDo6SW5zYW5pdHkgY29uc3QmIG90aGVyKSBjb25zdCB7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZzsKKyAgcmV0dXJuIFRocmlmdERlYnVnU3RyaW5nKCp0aGlzKSA8IFRocmlmdERlYnVnU3RyaW5nKG90aGVyKTsKK30KK30KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9tYWluLmNwcCBiL3Rlc3QvY3BwL3NyYy9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlZTk1MC4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9zcmMvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPFRMb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi11c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwotCi1zdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KLX07Ci0KLXN0cnVjdCBsdHN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9Ci19OwotCi0KLS8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Ci10eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwotCi1jbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIFNlcnZlcigpIHt9Ci0KLSAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07Ci0gICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKLSAgfQotCi0gIHZvaWQgZWNob1ZvaWQoKSB7Ci0gICAgY291bnQoImVjaG9Wb2lkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY291bnRfbWFwIGdldENvdW50KCkgewotICAgIEd1YXJkIG0obG9ja18pOwotICAgIHJldHVybiBjb3VudHNfOwotICB9Ci0KLSAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykge3JldHVybiBhcmc7fQotICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmYXJnKSB7Ci0gICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7Ci0gICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkchISEhIik7Ci0gICAgfQotICAgIG91dCA9IGFyZzsKLSAgfQotICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiAmb3V0LCBjb25zdCBzZXQ8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiAmb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0KLXByaXZhdGU6Ci0gIGNvdW50X21hcCBjb3VudHNfOwotICBNdXRleCBsb2NrXzsKLQotfTsKLQotY2xhc3MgQ2xpZW50VGhyZWFkOiBwdWJsaWMgUnVubmFibGUgewotcHVibGljOgotCi0gIENsaWVudFRocmVhZChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+dHJhbnNwb3J0LCBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwgTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiB3b3JrZXJDb3VudCwgc2l6ZV90IGxvb3BDb3VudCwgVFR5cGUgbG9vcFR5cGUpIDoKLSAgICBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCi0gICAgX2NsaWVudChjbGllbnQpLAotICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCi0gICAgX2xvb3BDb3VudChsb29wQ291bnQpLAotICAgIF9sb29wVHlwZShsb29wVHlwZSkKLSAge30KLQotICB2b2lkIHJ1bigpIHsKLQotICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAotCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLSAgICAgIHdoaWxlKF93b3JrZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKLQotICAgIHN3aXRjaChfbG9vcFR5cGUpIHsKLSAgICBjYXNlIFRfVk9JRDogbG9vcEVjaG9Wb2lkKCk7IGJyZWFrOwotICAgIGNhc2UgVF9CWVRFOiBsb29wRWNob0J5dGUoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0kzMjogbG9vcEVjaG9JMzIoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0k2NDogbG9vcEVjaG9JNjQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUklORzogbG9vcEVjaG9TdHJpbmcoKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOyBicmVhazsKLSAgICB9Ci0KLSAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOwotCi0gICAgX2RvbmUgPSB0cnVlOwotCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX3dvcmtlckNvdW50LS07Ci0KLSAgICAgIGlmIChfd29ya2VyQ291bnQgPT0gMCkgewotCi0gICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9Wb2lkKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBfY2xpZW50LT5lY2hvVm9pZCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9CeXRlKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQ4X3QgYXJnID0gMTsKLSAgICAgIGludDhfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9CeXRlKGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0kzMigpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50MzJfdCBhcmcgPSAxOwotICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvSTY0KCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQ2NF90IGFyZyA9IDE7Ci0gICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9TdHJpbmcoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIHN0cmluZyBhcmcgPSAiaGVsbG8iOwotICAgICAgc3RyaW5nIHJlc3VsdDsKLSAgICAgIF9jbGllbnQtPmVjaG9TdHJpbmcocmVzdWx0LCBhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OwotICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgc2l6ZV90JiBfd29ya2VyQ291bnQ7Ci0gIHNpemVfdCBfbG9vcENvdW50OwotICBUVHlwZSBfbG9vcFR5cGU7Ci0gIGxvbmcgbG9uZyBfc3RhcnRUaW1lOwotICBsb25nIGxvbmcgX2VuZFRpbWU7Ci0gIGJvb2wgX2RvbmU7Ci0gIE1vbml0b3IgX3NsZWVwOwotfTsKLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotICBpbnQgcG9ydCA9IDkwOTE7Ci0gIHN0cmluZyBzZXJ2ZXJUeXBlID0gInRocmVhZC1wb29sIjsKLSAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwotICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OwotICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKLSAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOwotICBUVHlwZSBsb29wVHlwZSAgPSBUX1ZPSUQ7Ci0gIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7Ci0gIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKLSAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOwotICBzdHJpbmcgcmVxdWVzdExvZ1BhdGggPSAiLi9yZXF1ZXN0bG9nLnRsb2ciOwotICBib29sIHJlcGxheVJlcXVlc3RzID0gZmFsc2U7Ci0KLSAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKLQotICB1c2FnZSA8PAotICAgIGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dIFstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbCA8PAotICAgICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbCA8PAotICAgICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbCA8PAotICAgICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbCA8PAotICAgICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsOwotCi0KLSAgbWFwPHN0cmluZywgc3RyaW5nPiAgYXJnczsKLQotICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewotCi0gICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7Ci0KLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7Ci0KLSAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwotCi0gICAgICBzdHJpbmcga2V5ID0gc3RyaW5nKGFyZywgMiwgZW5kIC0gMik7Ci0KLSAgICAgIGlmIChlbmQgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGFyZ3Nba2V5XSA9IHN0cmluZyhhcmcsIGVuZCArIDEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJnc1trZXldID0gInRydWUiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOwotICAgIH0KLSAgfQotCi0gIHRyeSB7Ci0KLSAgICBpZiAoIWFyZ3NbImNsaWVudHMiXS5lbXB0eSgpKSB7Ci0gICAgICBjbGllbnRDb3VudCA9IGF0b2koYXJnc1siY2xpZW50cyJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1siaGVscCJdLmVtcHR5KCkpIHsKLSAgICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImxvb3AiXS5lbXB0eSgpKSB7Ci0gICAgICBsb29wQ291bnQgPSBhdG9pKGFyZ3NbImxvb3AiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImNhbGwiXS5lbXB0eSgpKSB7Ci0gICAgICBjYWxsTmFtZSA9IGFyZ3NbImNhbGwiXTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInBvcnQiXS5lbXB0eSgpKSB7Ci0gICAgICBwb3J0ID0gYXRvaShhcmdzWyJwb3J0Il0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJzZXJ2ZXIiXS5lbXB0eSgpKSB7Ci0gICAgICBydW5TZXJ2ZXIgPSBhcmdzWyJzZXJ2ZXIiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJsb2ctcmVxdWVzdCJdLmVtcHR5KCkpIHsKLSAgICAgIGxvZ1JlcXVlc3RzID0gYXJnc1sibG9nLXJlcXVlc3QiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJyZXBsYXktcmVxdWVzdCJdLmVtcHR5KCkpIHsKLSAgICAgIHJlcGxheVJlcXVlc3RzID0gYXJnc1sicmVwbGF5LXJlcXVlc3QiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJzZXJ2ZXItdHlwZSJdLmVtcHR5KCkpIHsKLSAgICAgIHNlcnZlclR5cGUgPSBhcmdzWyJzZXJ2ZXItdHlwZSJdOwotCi0gICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewotCi0gICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgewotCi0gICAgICB9IGVsc2UgewotCi0gICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIitzZXJ2ZXJUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbIndvcmtlcnMiXS5lbXB0eSgpKSB7Ci0gICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOwotICAgIH0KLQotICB9IGNhdGNoKGV4Y2VwdGlvbiYgZSkgewotICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKLSAgICBjZXJyIDw8IHVzYWdlOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLQotICAvLyBEaXNwYXRjaGVyCi0gIHNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotCi0gIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIHNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIHNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwotCi0gICAgLy8gVHJhbnNwb3J0cwotICAgIHNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7Ci0gICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7Ci0gICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7Ci0gICAgZmlsZVRyYW5zcG9ydC0+c2Vla1RvRW5kKCk7Ci0KLSAgICAvLyBQcm90b2NvbCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0KLSAgICBURmlsZVByb2Nlc3NvciBmaWxlUHJvY2Vzc29yKHNlcnZpY2VQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHJhbnNwb3J0KTsKLQotICAgIGZpbGVQcm9jZXNzb3IucHJvY2VzcygwLCB0cnVlKTsKLSAgICBleGl0KDApOwotICB9Ci0KLQotICBpZiAocnVuU2VydmVyKSB7Ci0KLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKLQotICAgIC8vIFRyYW5zcG9ydAotICAgIHNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKLQotICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLQotICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLQotICAgIGlmIChsb2dSZXF1ZXN0cykgewotICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIHNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7Ci0gICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKLSAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwotICAgIH0KLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0KLSAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVFNpbXBsZVNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpKTsKLQotICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7Ci0KLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUVGhyZWFkZWRTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKSk7Ci0KLSAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewotCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLQotICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLSAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgfQotCi0gICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCBlbmRsOwotCi0gICAgc2VydmVyVGhyZWFkLT5zdGFydCgpOwotCi0gICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKLQotICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7Ci0gICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoY2xpZW50Q291bnQgPiAwKSB7Ci0KLSAgICBNb25pdG9yIG1vbml0b3I7Ci0KLSAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwotCi0gICAgc2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7Ci0KLSAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeyBsb29wVHlwZSA9IFRfVk9JRDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9CeXRlIikgeyBsb29wVHlwZSA9IFRfQllURTt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JMzIiKSB7IGxvb3BUeXBlID0gVF9JMzI7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeyBsb29wVHlwZSA9IFRfSTY0O30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob1N0cmluZyIpIHsgbG9vcFR5cGUgPSBUX1NUUklORzt9Ci0gICAgZWxzZSB7dGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIitjYWxsTmFtZSk7fQotCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wMSIsIHBvcnQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwotCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKLSAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICB9Ci0KLSAgICBsb25nIGxvbmcgdGltZTAwOwotICAgIGxvbmcgbG9uZyB0aW1lMDE7Ci0KLSAgICB7U3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0gICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OwotCi0gICAgICBjZXJyIDw8ICJMYXVuY2ggIjw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7Ci0KLSAgICAgIHRpbWUwMCA9ICBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwotCi0gICAgICB3aGlsZSh0aHJlYWRDb3VudCA+IDApIHsKLSAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICB9Ci0KLSAgICAgIHRpbWUwMSA9ICBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIH0KLQotICAgIGxvbmcgbG9uZyBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgbG9uZyBsb25nIGxhc3RUaW1lID0gMDsKLQotICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7Ci0gICAgbG9uZyBsb25nIG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgbG9uZyBsb25nIG1heFRpbWUgPSAwOwotCi0gICAgZm9yIChzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKLQotICAgICAgbG9uZyBsb25nIGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKLQotICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7Ci0KLSAgICAgIGlmIChjbGllbnQtPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKLSAgICAgICAgZmlyc3RUaW1lID0gY2xpZW50LT5fc3RhcnRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAoY2xpZW50LT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7Ci0gICAgICAgIGxhc3RUaW1lID0gY2xpZW50LT5fZW5kVGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgewotICAgICAgICBtaW5UaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKLSAgICAgICAgbWF4VGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOwotICAgIH0KLQotICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwotCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKLQotICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwotICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBjb3VudC5iZWdpbigpOyBpdGVyICE9IGNvdW50LmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJWRcbiIsIGl0ZXItPmZpcnN0LCBpdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICBjZXJyIDw8ICJkb25lLiIgPDwgZW5kbDsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL25iLW1haW4uY3BwIGIvdGVzdC9jcHAvc3JjL25iLW1haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc0YTgxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3NyYy9uYi1tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9NdXRleC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPFRMb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci11c2luZyBfX2dudV9jeHg6Omhhc2hfbWFwOwotdXNpbmcgX19nbnVfY3h4OjpoYXNoOwotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLXVzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7Ci0KLXN0cnVjdCBlcXN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKLSAgfQotfTsKLQotc3RydWN0IGx0c3RyIHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7Ci0gIH0KLX07Ci0KLQotLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKLXR5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7Ci0KLWNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewotIHB1YmxpYzoKLSAgU2VydmVyKCkge30KLQotICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgewotICAgIEd1YXJkIG0obG9ja18pOwotICAgIGludCBjdCA9IGNvdW50c19bbWV0aG9kXTsKLSAgICBjb3VudHNfW21ldGhvZF0gPSArK2N0OwotICB9Ci0KLSAgdm9pZCBlY2hvVm9pZCgpIHsKLSAgICBjb3VudCgiZWNob1ZvaWQiKTsKLSAgICAvLyBTbGVlcCB0byBzaW11bGF0ZSB3b3JrCi0gICAgdXNsZWVwKDUwMDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvdW50X21hcCBnZXRDb3VudCgpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICByZXR1cm4gY291bnRzXzsKLSAgfQotCi0gIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJmFyZykgewotICAgIGlmIChhcmcgIT0gImhlbGxvIikgewotICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HISEhISIpOwotICAgIH0KLSAgICBvdXQgPSBhcmc7Ci0gIH0KLSAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4gJm91dCwgY29uc3Qgc2V0PGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4gJm91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotCi1wcml2YXRlOgotICBjb3VudF9tYXAgY291bnRzXzsKLSAgTXV0ZXggbG9ja187Ci0KLX07Ci0KLWNsYXNzIENsaWVudFRocmVhZDogcHVibGljIFJ1bm5hYmxlIHsKLXB1YmxpYzoKLQotICBDbGllbnRUaHJlYWQoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PnRyYW5zcG9ydCwgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsIE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgd29ya2VyQ291bnQsIHNpemVfdCBsb29wQ291bnQsIFRUeXBlIGxvb3BUeXBlKSA6Ci0gICAgX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAotICAgIF9jbGllbnQoY2xpZW50KSwKLSAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAotICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKLSAgICBfbG9vcFR5cGUobG9vcFR5cGUpCi0gIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0KLSAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlKF93b3JrZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBfdHJhbnNwb3J0LT5vcGVuKCk7Ci0KLSAgICBzd2l0Y2goX2xvb3BUeXBlKSB7Ci0gICAgY2FzZSBUX1ZPSUQ6IGxvb3BFY2hvVm9pZCgpOyBicmVhazsKLSAgICBjYXNlIFRfQllURTogbG9vcEVjaG9CeXRlKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JMzI6IGxvb3BFY2hvSTMyKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JNjQ6IGxvb3BFY2hvSTY0KCk7IGJyZWFrOwotICAgIGNhc2UgVF9TVFJJTkc6IGxvb3BFY2hvU3RyaW5nKCk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsgYnJlYWs7Ci0gICAgfQotCi0gICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKLQotICAgIF9kb25lID0gdHJ1ZTsKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF93b3JrZXJDb3VudC0tOwotCi0gICAgICBpZiAoX3dvcmtlckNvdW50ID09IDApIHsKLQotICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvVm9pZCgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgX2NsaWVudC0+ZWNob1ZvaWQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvQnl0ZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50OF90IGFyZyA9IDE7Ci0gICAgICBpbnQ4X3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvQnl0ZShhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9JMzIoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDMyX3QgYXJnID0gMTsKLSAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvSTMyKGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0k2NCgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50NjRfdCBhcmcgPSAxOwotICAgICAgaW50NjRfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JNjQoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvU3RyaW5nKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBzdHJpbmcgYXJnID0gImhlbGxvIjsKLSAgICAgIHN0cmluZyByZXN1bHQ7Ci0gICAgICBfY2xpZW50LT5lY2hvU3RyaW5nKHJlc3VsdCwgYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKLSAgTW9uaXRvciYgX21vbml0b3I7Ci0gIHNpemVfdCYgX3dvcmtlckNvdW50OwotICBzaXplX3QgX2xvb3BDb3VudDsKLSAgVFR5cGUgX2xvb3BUeXBlOwotICBsb25nIGxvbmcgX3N0YXJ0VGltZTsKLSAgbG9uZyBsb25nIF9lbmRUaW1lOwotICBib29sIF9kb25lOwotICBNb25pdG9yIF9zbGVlcDsKLX07Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgaW50IHBvcnQgPSA5MDkxOwotICBzdHJpbmcgc2VydmVyVHlwZSA9ICJzaW1wbGUiOwotICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7Ci0gIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOwotICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7Ci0gIFRUeXBlIGxvb3BUeXBlICA9IFRfVk9JRDsKLSAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKLSAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOwotICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7Ci0gIHN0cmluZyByZXF1ZXN0TG9nUGF0aCA9ICIuL3JlcXVlc3Rsb2cudGxvZyI7Ci0gIGJvb2wgcmVwbGF5UmVxdWVzdHMgPSBmYWxzZTsKLQotICBvc3RyaW5nc3RyZWFtIHVzYWdlOwotCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byBmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7Ci0KLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOwotCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0KLSAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKLQotICAgIGlmIChhcmcuY29tcGFyZSgwLDIsICItLSIpID09IDApIHsKLQotICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7Ci0KLSAgICAgIHN0cmluZyBrZXkgPSBzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKTsKLQotICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgYXJnc1trZXldID0gc3RyaW5nKGFyZywgZW5kICsgMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7Ci0gICAgfQotICB9Ci0KLSAgdHJ5IHsKLQotICAgIGlmICghYXJnc1siY2xpZW50cyJdLmVtcHR5KCkpIHsKLSAgICAgIGNsaWVudENvdW50ID0gYXRvaShhcmdzWyJjbGllbnRzIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJoZWxwIl0uZW1wdHkoKSkgewotICAgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghYXJnc1sibG9vcCJdLmVtcHR5KCkpIHsKLSAgICAgIGxvb3BDb3VudCA9IGF0b2koYXJnc1sibG9vcCJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1siY2FsbCJdLmVtcHR5KCkpIHsKLSAgICAgIGNhbGxOYW1lID0gYXJnc1siY2FsbCJdOwotICAgIH0KLQotICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKLSAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlciJdLmVtcHR5KCkpIHsKLSAgICAgIHJ1blNlcnZlciA9IGFyZ3NbInNlcnZlciJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImxvZy1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgbG9nUmVxdWVzdHMgPSBhcmdzWyJsb2ctcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInJlcGxheS1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgcmVwbGF5UmVxdWVzdHMgPSBhcmdzWyJyZXBsYXktcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgewotICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgewotICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgfSBjYXRjaChleGNlcHRpb24mIGUpIHsKLSAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY2VyciA8PCB1c2FnZTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgLy8gRGlzcGF0Y2hlcgotICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLQotICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKLSAgICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKLQotICAgIC8vIFRyYW5zcG9ydHMKLSAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwotCi0gICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7Ci0KLSAgICBmaWxlUHJvY2Vzc29yLnByb2Nlc3MoMCwgdHJ1ZSk7Ci0gICAgZXhpdCgwKTsKLSAgfQotCi0KLSAgaWYgKHJ1blNlcnZlcikgewotCi0gICAgc2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7Ci0KLSAgICAvLyBQcm90b2NvbCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0KLSAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+ICAgICAgdHJhbnNwb3J0RmFjdG9yeTsKLQotICAgIGlmIChsb2dSZXF1ZXN0cykgewotICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIHNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7Ci0gICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKLSAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwotICAgIH0KLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7Ci0KLSAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCkpKTsKLSAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCsxKSkpOwotCi0gICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQrMSwgdGhyZWFkTWFuYWdlcikpKTsKLSAgICB9Ci0KLSAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwotICAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKLSAgICBzZXJ2ZXJUaHJlYWQyLT5zdGFydCgpOwotCi0gICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKLQotICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7Ci0gICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKLSAgICAgIHNlcnZlclRocmVhZDItPmpvaW4oKTsKLSAgICB9Ci0gIH0KLSAgc2xlZXAoMSk7Ci0KLSAgaWYgKGNsaWVudENvdW50ID4gMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKLQotICAgIHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwotCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOwotICAgICAgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7Ci0KLSAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPENsaWVudFRocmVhZD4obmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKLSAgICB9Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyB0aHJlYWQrKykgewotICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwotICAgIH0KLQotICAgIGxvbmcgbG9uZyB0aW1lMDA7Ci0gICAgbG9uZyBsb25nIHRpbWUwMTsKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLSAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7Ci0KLSAgICAgIGNlcnIgPDwgIkxhdW5jaCAiPDwgY2xpZW50Q291bnQgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKLQotICAgICAgdGltZTAwID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7Ci0KLSAgICAgIHdoaWxlKHRocmVhZENvdW50ID4gMCkgewotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLQotICAgICAgdGltZTAxID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgfQotCi0gICAgbG9uZyBsb25nIGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBsb25nIGxvbmcgbGFzdFRpbWUgPSAwOwotCi0gICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKLSAgICBsb25nIGxvbmcgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBsb25nIGxvbmcgbWF4VGltZSA9IDA7Ci0KLSAgICBmb3IgKHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudCA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwotCi0gICAgICBsb25nIGxvbmcgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOwotCi0gICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKLQotICAgICAgaWYgKGNsaWVudC0+X3N0YXJ0VGltZSA8IGZpcnN0VGltZSkgewotICAgICAgICBmaXJzdFRpbWUgPSBjbGllbnQtPl9zdGFydFRpbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbGllbnQtPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKLSAgICAgICAgbGFzdFRpbWUgPSBjbGllbnQtPl9lbmRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsdGEgPCBtaW5UaW1lKSB7Ci0gICAgICAgIG1pblRpbWUgPSBkZWx0YTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhID4gbWF4VGltZSkgewotICAgICAgICBtYXhUaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGF2ZXJhZ2VUaW1lKz0gZGVsdGE7Ci0gICAgfQotCi0gICAgYXZlcmFnZVRpbWUgLz0gY2xpZW50Q291bnQ7Ci0KLQotICAgIGNvdXQgPDwgICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudCA8PCAiLCByYXRlIDogIiA8PCAoY2xpZW50Q291bnQgKiBsb29wQ291bnQgKiAxMDAwKSAvICgoZG91YmxlKSh0aW1lMDEgLSB0aW1lMDApKSA8PCBlbmRsOwotCi0gICAgY291bnRfbWFwIGNvdW50ID0gc2VydmljZUhhbmRsZXItPmdldENvdW50KCk7Ci0gICAgY291bnRfbWFwOjppdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IGNvdW50LmJlZ2luKCk7IGl0ZXIgIT0gY291bnQuZW5kKCk7ICsraXRlcikgewotICAgICAgcHJpbnRmKCIlcyA9PiAlZFxuIiwgaXRlci0+Zmlyc3QsIGl0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGNlcnIgPDwgImRvbmUuIiA8PCBlbmRsOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL19faW5pdF9fLnB5IGIvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiODNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weQpAQCAtMCwwICsxLDIzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSAudGVzdCBpbXBvcnQgdGVzdF9uYW1lICAjIG5vcWEKK2Zyb20gLmNvbGxlY3QgaW1wb3J0IGNvbGxlY3RfY3Jvc3NfdGVzdHMsIGNvbGxlY3RfZmVhdHVyZV90ZXN0cyAgIyBub3FhCitmcm9tIC5ydW4gaW1wb3J0IFRlc3REaXNwYXRjaGVyICAjIG5vcWEKK2Zyb20gLnJlcG9ydCBpbXBvcnQgZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMsIGxvYWRfa25vd25fZmFpbHVyZXMgICMgbm9xYQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDg5NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkKQEAgLTAsMCArMSwxNjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKKworZnJvbSAudXRpbCBpbXBvcnQgbWVyZ2VfZGljdAorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5CisKKyMgVGhvc2Uga2V5cyBhcmUgcGFzc2VkIHRvIGV4ZWN1dGlvbiBhcyBpcy4KKyMgTm90ZSB0aGF0IHRoZXJlIGFyZSBrZXlzIG90aGVyIHRoYW4gdGhlc2UsIG5hbWVseToKKyMgZGVsYXk6IEFmdGVyIHNlcnZlciBpcyBzdGFydGVkLCBjbGllbnQgc3RhcnQgaXMgZGVsYXllZCBmb3IgdGhlIHZhbHVlCisjIChzZWNvbmRzKS4KKyMgdGltZW91dDogVGVzdCB0aW1lb3V0IGFmdGVyIGNsaWVudCBpcyBzdGFydGVkIChzZWNvbmRzKS4KKyMgcGxhdGZvcm1zOiBTdXBwb3J0ZWQgcGxhdGZvcm1zLiBTaG91bGQgbWF0Y2ggcGxhdGZvcm0uc3lzdGVtKCkgdmFsdWUuCisjIHByb3RvY29sczogbGlzdCBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzCisjIHRyYW5zcG9ydHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHRyYW5zcG9ydHMKKyMgc29ja2V0czogbGlzdCBvZiBzdXBwb3J0ZWQgc29ja2V0cworIworIyBwcm90b2NvbHMgYW5kIHRyYW5zcG9ydHMgZW50cmllcyBjYW4gYmUgY29sb24gc2VwYXJhdGVkICJzcGVjOmltcGwiIHBhaXIKKyMgKGUuZy4gYmluYXJ5OmFjY2VsKSB3aGVyZSB0ZXN0IGlzIHJ1biBmb3IgYW55IG1hdGNoaW5nICJzcGVjIiB3aGlsZSBhY3R1YWwKKyMgYXJndW1lbnQgcGFzc2VkIHRvIHRlc3QgZXhlY3V0YWJsZSBpcyAiaW1wbCIuCisjIE90aGVyd2lzZSAic3BlYyIgaXMgZXF1aXZhbGVudCB0byAic3BlYzpzcGVjIiBwYWlyLgorIyAoZS5nLiAiYmluYXJ5IiBpcyBlcXVpdmFsZW50IHRvICJiaW5hcnk6YmluYXJ5IiBpbiB0ZXN0cy5qc29uKQorIworVkFMSURfSlNPTl9LRVlTID0gWworICAgICduYW1lJywgICMgbmFtZSBvZiB0aGUgbGlicmFyeSwgdHlwaWNhbGx5IGEgbGFuZ3VhZ2UgbmFtZQorICAgICd3b3JrZGlyJywgICMgd29yayBkaXJlY3Rvcnkgd2hlcmUgY29tbWFuZCBpcyBleGVjdXRlZAorICAgICdjb21tYW5kJywgICMgdGVzdCBjb21tYW5kCisgICAgJ2V4dHJhX2FyZ3MnLCAgIyBhcmdzIGFwcGVuZGVkIHRvIGNvbW1hbmQgYWZ0ZXIgb3RoZXIgYXJncyBhcmUgYXBwZW5kZWQKKyAgICAncmVtb3RlX2FyZ3MnLCAgIyBhcmdzIGFkZGVkIHRvIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBwcm9ncmFtCisgICAgJ2pvaW5fYXJncycsICAjIHdoZXRoZXIgYXJncyBzaG91bGQgYmUgcGFzc2VkIGFzIHNpbmdsZSBjb25jYXRlbmF0ZWQgc3RyaW5nCisgICAgJ2VudicsICAjIGFkZGl0aW9uYWwgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorXQorCitERUZBVUxUX01BWF9ERUxBWSA9IDUKK0RFRkFVTFRfU0lHTkFMID0gMQorREVGQVVMVF9USU1FT1VUID0gNQorCisKK2RlZiBfY29sbGVjdF90ZXN0bGlicyhjb25maWcsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoPVtOb25lXSk6CisgICAgIiIiQ29sbGVjdHMgc2VydmVyL2NsaWVudCBjb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgY29uZmlndXJhdGlvbnMiIiIKKyAgICBkZWYgZXhwYW5kX2xpYnMoY29uZmlnKToKKyAgICAgICAgZm9yIGxpYiBpbiBjb25maWc6CisgICAgICAgICAgICBzdiA9IGxpYi5wb3AoJ3NlcnZlcicsIE5vbmUpCisgICAgICAgICAgICBjbCA9IGxpYi5wb3AoJ2NsaWVudCcsIE5vbmUpCisgICAgICAgICAgICB5aWVsZCBsaWIsIHN2LCBjbAorCisgICAgZGVmIHlpZWxkX3Rlc3RsaWJzKGJhc2VfY29uZmlncywgY29uZmlncywgbWF0Y2gpOgorICAgICAgICBmb3IgYmFzZSwgY29uZiBpbiB6aXAoYmFzZV9jb25maWdzLCBjb25maWdzKToKKyAgICAgICAgICAgIGlmIGNvbmY6CisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoIG9yIGJhc2VbJ25hbWUnXSBpbiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zID0gY29uZi5nZXQoJ3BsYXRmb3JtcycpIG9yIGJhc2UuZ2V0KCdwbGF0Zm9ybXMnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGxhdGZvcm1zIG9yIHBsYXRmb3JtLnN5c3RlbSgpIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIG1lcmdlX2RpY3QoYmFzZSwgY29uZikKKworICAgIGxpYnMsIHN2cywgY2xzID0gemlwKCpleHBhbmRfbGlicyhjb25maWcpKQorICAgIHNlcnZlcnMgPSBsaXN0KHlpZWxkX3Rlc3RsaWJzKGxpYnMsIHN2cywgc2VydmVyX21hdGNoKSkKKyAgICBjbGllbnRzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBjbHMsIGNsaWVudF9tYXRjaCkpCisgICAgcmV0dXJuIHNlcnZlcnMsIGNsaWVudHMKKworCitkZWYgY29sbGVjdF9mZWF0dXJlcyhjb25maWcsIG1hdGNoKToKKyAgICByZXMgPSBsaXN0KG1hcChyZS5jb21waWxlLCBtYXRjaCkpCisgICAgcmV0dXJuIGxpc3QoZmlsdGVyKGxhbWJkYSBjOiBhbnkobWFwKGxhbWJkYSByOiByLnNlYXJjaChjWyduYW1lJ10pLCByZXMpKSwgY29uZmlnKSkKKworCitkZWYgX2RvX2NvbGxlY3RfdGVzdHMoc2VydmVycywgY2xpZW50cyk6CisgICAgZGVmIGludGVyc2VjdGlvbihrZXksIG8xLCBvMik6CisgICAgICAgICIiImludGVyc2VjdGlvbiBvZiB0d28gY29sbGVjdGlvbnMuCisgICAgICAgIGNvbGxlY3Rpb25zIGFyZSByZXBsYWNlZCB3aXRoIHNldHMgdGhlIGZpcnN0IHRpbWUiIiIKKyAgICAgICAgZGVmIGNhY2hlZF9zZXQobywga2V5KToKKyAgICAgICAgICAgIHYgPSBvW2tleV0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHYsIHNldCk6CisgICAgICAgICAgICAgICAgdiA9IHNldCh2KQorICAgICAgICAgICAgICAgIG9ba2V5XSA9IHYKKyAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIHJldHVybiBjYWNoZWRfc2V0KG8xLCBrZXkpICYgY2FjaGVkX3NldChvMiwga2V5KQorCisgICAgZGVmIGludGVyc2VjdF93aXRoX3NwZWMoa2V5LCBvMSwgbzIpOgorICAgICAgICAjIHN0b3JlIGFzIHNldCBvZiAoc3BlYywgaW1wbCkgdHVwbGUKKyAgICAgICAgZGVmIGNhY2hlZF9zZXQobyk6CisgICAgICAgICAgICBkZWYgdG9fc3BlY19pbXBsX3R1cGxlcyh2YWx1ZXMpOgorICAgICAgICAgICAgICAgIGZvciB2IGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgc3BlYywgXywgaW1wbCA9IHYucGFydGl0aW9uKCc6JykKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc3BlYywgaW1wbCBvciBzcGVjCisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodG9fc3BlY19pbXBsX3R1cGxlcyhzZXQodikpKQorICAgICAgICAgICAgICAgIG9ba2V5XSA9IHYKKyAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIGZvciBzcGVjMSwgaW1wbDEgaW4gY2FjaGVkX3NldChvMSk6CisgICAgICAgICAgICBmb3Igc3BlYzIsIGltcGwyIGluIGNhY2hlZF9zZXQobzIpOgorICAgICAgICAgICAgICAgIGlmIHNwZWMxID09IHNwZWMyOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW1wbDEgaWYgaW1wbDEgPT0gaW1wbDIgZWxzZSAnJXMtJXMnICUgKGltcGwxLCBpbXBsMikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgbmFtZSwgaW1wbDEsIGltcGwyCisKKyAgICBkZWYgbWF5YmVfbWF4KGtleSwgbzEsIG8yLCBkZWZhdWx0KToKKyAgICAgICAgIiIibWF4aW11bSBvZiB0d28gaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQgdmFsdWUiIiIKKyAgICAgICAgdjEgPSBvMS5nZXQoa2V5KQorICAgICAgICB2MiA9IG8yLmdldChrZXkpCisgICAgICAgIHJldHVybiBtYXgodjEsIHYyKSBpZiB2MSBhbmQgdjIgZWxzZSB2MSBvciB2MiBvciBkZWZhdWx0CisKKyAgICBkZWYgZmlsdGVyX3dpdGhfdmFsaWRrZXlzKG8pOgorICAgICAgICByZXQgPSB7fQorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiBtZXJnZV9tZXRhZGF0YShvLCAqKnJldCk6CisgICAgICAgIGZvciBrZXkgaW4gVkFMSURfSlNPTl9LRVlTOgorICAgICAgICAgICAgaWYga2V5IGluIG86CisgICAgICAgICAgICAgICAgcmV0W2tleV0gPSBvW2tleV0KKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZm9yIHN2LCBjbCBpbiBwcm9kdWN0KHNlcnZlcnMsIGNsaWVudHMpOgorICAgICAgICBmb3IgcHJvdG8sIHByb3RvMSwgcHJvdG8yIGluIGludGVyc2VjdF93aXRoX3NwZWMoJ3Byb3RvY29scycsIHN2LCBjbCk6CisgICAgICAgICAgICBmb3IgdHJhbnMsIHRyYW5zMSwgdHJhbnMyIGluIGludGVyc2VjdF93aXRoX3NwZWMoJ3RyYW5zcG9ydHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgIGZvciBzb2NrIGluIGludGVyc2VjdGlvbignc29ja2V0cycsIHN2LCBjbCk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2ZXInOiBtZXJnZV9tZXRhZGF0YShzdiwgKip7J3Byb3RvY29sJzogcHJvdG8xLCAndHJhbnNwb3J0JzogdHJhbnMxfSksCisgICAgICAgICAgICAgICAgICAgICAgICAnY2xpZW50JzogbWVyZ2VfbWV0YWRhdGEoY2wsICoqeydwcm90b2NvbCc6IHByb3RvMiwgJ3RyYW5zcG9ydCc6IHRyYW5zMn0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGF5JzogbWF5YmVfbWF4KCdkZWxheScsIHN2LCBjbCwgREVGQVVMVF9NQVhfREVMQVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3Bfc2lnbmFsJzogbWF5YmVfbWF4KCdzdG9wX3NpZ25hbCcsIHN2LCBjbCwgREVGQVVMVF9TSUdOQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQnOiBtYXliZV9tYXgoJ3RpbWVvdXQnLCBzdiwgY2wsIERFRkFVTFRfVElNRU9VVCksCisgICAgICAgICAgICAgICAgICAgICAgICAncHJvdG9jb2wnOiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0cmFuc3BvcnQnOiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzb2NrZXQnOiBzb2NrCisgICAgICAgICAgICAgICAgICAgIH0KKworCitkZWYgX2ZpbHRlcl9lbnRyaWVzKHRlc3RzLCByZWdleCk6CisgICAgaWYgcmVnZXg6CisgICAgICAgIHJldHVybiBmaWx0ZXIobGFtYmRhIHQ6IHJlLnNlYXJjaChyZWdleCwgVGVzdEVudHJ5LmdldF9uYW1lKCoqdCkpLCB0ZXN0cykKKyAgICByZXR1cm4gdGVzdHMKKworCitkZWYgY29sbGVjdF9jcm9zc190ZXN0cyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgcmVnZXgpOgorICAgIHN2LCBjbCA9IF9jb2xsZWN0X3Rlc3RsaWJzKHRlc3RzX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKQorICAgIHJldHVybiBsaXN0KF9maWx0ZXJfZW50cmllcyhfZG9fY29sbGVjdF90ZXN0cyhzdiwgY2wpLCByZWdleCkpCisKKworZGVmIGNvbGxlY3RfZmVhdHVyZV90ZXN0cyh0ZXN0c19kaWN0LCBmZWF0dXJlc19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgXyA9IF9jb2xsZWN0X3Rlc3RsaWJzKHRlc3RzX2RpY3QsIHNlcnZlcl9tYXRjaCkKKyAgICBmdCA9IGNvbGxlY3RfZmVhdHVyZXMoZmVhdHVyZXNfZGljdCwgZmVhdHVyZV9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGZ0KSwgcmVnZXgpKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkgYi90ZXN0L2Nyb3NzcnVubmVyL2NvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWNhOTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKQEAgLTAsMCArMSwyNCBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICBfRU5DT0RFID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCisKKyAgICBkZWYgcGF0aF9qb2luKCphcmdzKToKKyAgICAgICAgYmluX2FyZ3MgPSBtYXAobGFtYmRhIGE6IGEuZGVjb2RlKF9FTkNPREUpLCBhcmdzKQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCpiaW5fYXJncykuZW5jb2RlKF9FTkNPREUpCisKKyAgICBkZWYgc3RyX2pvaW4ocywgbCk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgbCkKKyAgICAgICAgYiA9IHMuZGVjb2RlKF9FTkNPREUpCisgICAgICAgIHJldHVybiBiLmpvaW4oYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgbG9nZmlsZV9vcGVuID0gb3BlbgorCitlbHNlOgorCisgICAgcGF0aF9qb2luID0gb3MucGF0aC5qb2luCisgICAgc3RyX2pvaW4gPSBzdHIuam9pbgorCisgICAgZGVmIGxvZ2ZpbGVfb3BlbigqYXJncyk6CisgICAgICAgIHJldHVybiBvcGVuKCphcmdzLCBlcnJvcnM9J3JlcGxhY2UnKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFmMTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkKQEAgLTAsMCArMSw0NDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBqc29uCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKKworZnJvbSAuY29tcGF0IGltcG9ydCBsb2dmaWxlX29wZW4sIHBhdGhfam9pbiwgc3RyX2pvaW4KK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorCitMT0dfRElSID0gJ2xvZycKK1JFU1VMVF9IVE1MID0gJ2luZGV4Lmh0bWwnCitSRVNVTFRfSlNPTiA9ICdyZXN1bHRzLmpzb24nCitGQUlMX0pTT04gPSAna25vd25fZmFpbHVyZXNfJXMuanNvbicKKworCitkZWYgZ2VuZXJhdGVfa25vd25fZmFpbHVyZXModGVzdGRpciwgb3ZlcndyaXRlLCBzYXZlLCBvdXQpOgorICAgIGRlZiBjb2xsZWN0X2ZhaWx1cmVzKHJlc3VsdHMpOgorICAgICAgICBzdWNjZXNzX2luZGV4ID0gNQorICAgICAgICBmb3IgciBpbiByZXN1bHRzOgorICAgICAgICAgICAgaWYgbm90IHJbc3VjY2Vzc19pbmRleF06CisgICAgICAgICAgICAgICAgeWllbGQgVGVzdEVudHJ5LmdldF9uYW1lKCpyKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ocGF0aF9qb2luKHRlc3RkaXIsIFJFU1VMVF9KU09OKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgIHJlc3VsdHMgPSBqc29uLmxvYWQoZnApCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VuYWJsZSB0byBsb2FkIGxhc3QgcmVzdWx0LiBEaWQgeW91IHJ1biB0ZXN0cyA/XG4nKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBmYWlscyA9IGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0c1sncmVzdWx0cyddKQorICAgIGlmIG5vdCBvdmVyd3JpdGU6CisgICAgICAgIGtub3duID0gbG9hZF9rbm93bl9mYWlsdXJlcyh0ZXN0ZGlyKQorICAgICAgICBrbm93bi5leHRlbmQoZmFpbHMpCisgICAgICAgIGZhaWxzID0ga25vd24KKyAgICBmYWlsc19qc29uID0ganNvbi5kdW1wcyhzb3J0ZWQoc2V0KGZhaWxzKSksIGluZGVudD0yLCBzZXBhcmF0b3JzPSgnLCcsICc6ICcpKQorICAgIGlmIHNhdmU6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKG9zLnBhdGguam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICd3KycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoZmFpbHNfanNvbikKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQga25vd24gZmFpbHVyZXMuXG4nKQorICAgIGlmIG91dDoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShmYWlsc19qc29uKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgbG9hZF9rbm93bl9mYWlsdXJlcyh0ZXN0ZGlyKToKKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gW10KKworCitjbGFzcyBUZXN0UmVwb3J0ZXIob2JqZWN0KToKKyAgICAjIFVuZm9ydHVuYXRlbHksIHN0YW5kYXJkIGxpYnJhcnkgZG9lc24ndCBoYW5kbGUgdGltZXpvbmUgd2VsbAorICAgICMgREFURVRJTUVfRk9STUFUID0gJyVhICViICVkICVIOiVNOiVTICVaICVZJworICAgIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLl9sb2NrID0gbXVsdGlwcm9jZXNzaW5nLkxvY2soKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlc3RfbG9nZmlsZShjbHMsIHRlc3RfbmFtZSwgcHJvZ19raW5kLCBkaXI9Tm9uZSk6CisgICAgICAgIHJlbHBhdGggPSBwYXRoX2pvaW4oJ2xvZycsICclc18lcy5sb2cnICUgKHRlc3RfbmFtZSwgcHJvZ19raW5kKSkKKyAgICAgICAgcmV0dXJuIHJlbHBhdGggaWYgbm90IGRpciBlbHNlIG9zLnBhdGgucmVhbHBhdGgocGF0aF9qb2luKGRpciwgcmVscGF0aCkpCisKKyAgICBkZWYgX3N0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfZWxhcHNlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9mb3JtYXRfZGF0ZShjbHMpOgorICAgICAgICByZXR1cm4gJyVzJyAlIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKGNscy5EQVRFVElNRV9GT1JNQVQpCisKKyAgICBkZWYgX3ByaW50X2RhdGUoc2VsZik6CisgICAgICAgIHByaW50KHNlbGYuX2Zvcm1hdF9kYXRlKCksIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgX3ByaW50X2JhcihzZWxmLCBvdXQ9Tm9uZSk6CisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLAorICAgICAgICAgICAgZmlsZT0ob3V0IG9yIHNlbGYub3V0KSkKKworICAgIGRlZiBfcHJpbnRfZXhlY190aW1lKHNlbGYpOgorICAgICAgICBwcmludCgnVGVzdCBleGVjdXRpb24gdG9vayB7Oi4xZn0gc2Vjb25kcy4nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwgZmlsZT1zZWxmLm91dCkKKworCitjbGFzcyBFeGVjUmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgdGVzdCwgcHJvZyk6CisgICAgICAgIHN1cGVyKEV4ZWNSZXBvcnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLl90ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLl9wcm9nID0gcHJvZworICAgICAgICBzZWxmLmxvZ3BhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2cua2luZCwgdGVzdGRpcikKKyAgICAgICAgc2VsZi5vdXQgPSBOb25lCisKKyAgICBkZWYgYmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgc2VsZi5fb3BlbigpCisgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnT3V0cHV0IHN0cmVhbSBpcyBub3QgYXZhaWxhYmxlLicpCisKKyAgICBkZWYgZW5kKHNlbGYsIHJldHVybmNvZGUpOgorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wcmludF9mb290ZXIocmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5vdXQgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnT3V0cHV0IHN0cmVhbSBpcyBub3QgYXZhaWxhYmxlLicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGtpbGxlZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ1NlcnZlciBwcm9jZXNzIGlzIHN1Y2Nlc3NmdWxseSBraWxsZWQuJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIGRlZiBkaWVkKHNlbGYpOgorICAgICAgICBwcmludChmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnKioqIFNlcnZlciBwcm9jZXNzIGhhcyBkaWVkIHVuZXhwZWN0ZWRseSAqKionLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLmVuZChOb25lKQorCisgICAgX2luaXRfZmFpbHVyZV9leHBycyA9IHsKKyAgICAgICAgJ3NlcnZlcic6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQWFdZGRyZXNzIGFscmVhZHkgaW4gdXNlJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgYmluZCcsCisgICAgICAgICAgICAnRUFERFJJTlVTRScsCisgICAgICAgIF0pKSwKKyAgICAgICAgJ2NsaWVudCc6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQ2Ndb25uZWN0aW9uIHJlZnVzZWQnLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvJywKKyAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiBVTklYICcsICAgICAgICMgZG9tYWluIHNvY2tldCAocmIpCisgICAgICAgICAgICAnRUNPTk5SRUZVU0VEJywKKyAgICAgICAgICAgICdlY29ubnJlZnVzZWQnLCAgICAgICAgICAgICAgICMgZXJsCisgICAgICAgICAgICAnQ09OTkVDVElPTi1SRUZVU0VELUVSUk9SJywgICAjIGNsCisgICAgICAgICAgICAnY29ubmVjdCBFTk9FTlQnLCAgICAgICAgICAgICAjIG5vZGVqcyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScsICAjIGRvbWFpbiBzb2NrZXQKKyAgICAgICAgICAgICdTb2NrZXRzLlRjcENsaWVudC5Db25uZWN0JywgICMgY3NoYXJwCisgICAgICAgIF0pKSwKKyAgICB9CisKKyAgICBkZWYgbWF5YmVfZmFsc2VfcG9zaXRpdmUoc2VsZik6CisgICAgICAgICIiIlNlYXJjaGVzIHRocm91Z2ggbG9nIGZpbGUgZm9yIHNvY2tldCBiaW5kIGVycm9yLgorICAgICAgICBSZXR1cm5zIFRydWUgaWYgc3VzcGljaW91cyBleHByZXNzaW9uIGlzIGZvdW5kLCBvdGhlcndpc2UgRmFsc2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgZXhwcnMgPSBzZWxmLl9pbml0X2ZhaWx1cmVfZXhwcnNbc2VsZi5fcHJvZy5raW5kXQorCisgICAgICAgICAgICBkZWYgbWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgZm9yIGV4cHIgaW4gZXhwcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4cHIuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oIm1heWJlIGZhbHNlIHBvc2l0aXZlOiAlcyIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAncicpIGFzIGZwOgorICAgICAgICAgICAgICAgIGlmIGFueShtYXAobWF0Y2gsIGZwKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy53YXJuKCdbJXNdOiBFcnJvciB3aGlsZSBkZXRlY3RpbmcgZmFsc2UgcG9zaXRpdmU6ICVzJyAlIChzZWxmLl90ZXN0Lm5hbWUsIHN0cihleCkpKQorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5vdXQgPSBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAndysnKQorCisgICAgZGVmIF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5vdXQuY2xvc2UoKQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBwcmludCgnRXhlY3V0aW5nOiAlcycgJSBzdHJfam9pbignICcsIHNlbGYuX3Byb2cuY29tbWFuZCksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdEaXJlY3Rvcnk6ICVzJyAlIHNlbGYuX3Byb2cud29ya2RpciwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzpkZWxheTogJXMnICUgc2VsZi5fdGVzdC5kZWxheSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzp0aW1lb3V0OiAlcycgJSBzZWxmLl90ZXN0LnRpbWVvdXQsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKworICAgIGRlZiBfcHJpbnRfZm9vdGVyKHNlbGYsIHJldHVybmNvZGU9Tm9uZSk6CisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIGlmIHJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgnUmV0dXJuIGNvZGU6ICVkIChuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUga2lsbCBieSBzaWduYWwpJyAlIHJldHVybmNvZGUsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgnUHJvY2VzcyBpcyBraWxsZWQuJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisKKworY2xhc3MgU3VtbWFyeVJlcG9ydGVyKFRlc3RSZXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2VkaXIsIHRlc3RkaXJfcmVsYXRpdmUsIGNvbmN1cnJlbnQ9VHJ1ZSk6CisgICAgICAgIHN1cGVyKFN1bW1hcnlSZXBvcnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLl9iYXNlZGlyID0gYmFzZWRpcgorICAgICAgICBzZWxmLl90ZXN0ZGlyX3JlbCA9IHRlc3RkaXJfcmVsYXRpdmUKKyAgICAgICAgc2VsZi5sb2dkaXIgPSBwYXRoX2pvaW4oc2VsZi50ZXN0ZGlyLCBMT0dfRElSKQorICAgICAgICBzZWxmLm91dF9wYXRoID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgUkVTVUxUX0pTT04pCisgICAgICAgIHNlbGYuY29uY3VycmVudCA9IGNvbmN1cnJlbnQKKyAgICAgICAgc2VsZi5vdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0uc3lzdGVtKCkKKyAgICAgICAgc2VsZi5fcmV2aXNpb24gPSBzZWxmLl9nZXRfcmV2aXNpb24oKQorICAgICAgICBzZWxmLl90ZXN0cyA9IFtdCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvZ2Rpcik6CisgICAgICAgICAgICBvcy5ta2RpcihzZWxmLmxvZ2RpcikKKyAgICAgICAgc2VsZi5fa25vd25fZmFpbHVyZXMgPSBsb2FkX2tub3duX2ZhaWx1cmVzKHNlbGYudGVzdGRpcikKKyAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzID0gW10KKyAgICAgICAgc2VsZi5fZmxha3lfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSA9IFtdCisgICAgICAgIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRlc3RkaXIoc2VsZik6CisgICAgICAgIHJldHVybiBwYXRoX2pvaW4oc2VsZi5fYmFzZWRpciwgc2VsZi5fdGVzdGRpcl9yZWwpCisKKyAgICBkZWYgX3Jlc3VsdF9zdHJpbmcoc2VsZiwgdGVzdCk6CisgICAgICAgIGlmIHRlc3Quc3VjY2VzczoKKyAgICAgICAgICAgIGlmIHRlc3QucmV0cnlfY291bnQgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnCisgICAgICAgICAgICBlbGlmIHRlc3QucmV0cnlfY291bnQgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2ZsYWt5KDEgcmV0cnkpJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2ZsYWt5KCVkIHJldHJpZXMpJyAlIHRlc3QucmV0cnlfY291bnQKKyAgICAgICAgZWxpZiB0ZXN0LmV4cGlyZWQ6CisgICAgICAgICAgICByZXR1cm4gJ2ZhaWx1cmUodGltZW91dCknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ2ZhaWx1cmUoJWQpJyAlIHRlc3QucmV0dXJuY29kZQorCisgICAgZGVmIF9nZXRfcmV2aXNpb24oc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXNob3J0JywgJ0hFQUQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXNlbGYudGVzdGRpciwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgb3V0LCBfID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldHVybiBvdXQuc3RyaXAoKQorCisgICAgZGVmIF9mb3JtYXRfdGVzdChzZWxmLCB0ZXN0LCB3aXRoX3Jlc3VsdD1UcnVlKToKKyAgICAgICAgbmFtZSA9ICclcy0lcycgJSAodGVzdC5zZXJ2ZXIubmFtZSwgdGVzdC5jbGllbnQubmFtZSkKKyAgICAgICAgdHJhbnMgPSAnJXMtJXMnICUgKHRlc3QudHJhbnNwb3J0LCB0ZXN0LnNvY2tldCkKKyAgICAgICAgaWYgbm90IHdpdGhfcmVzdWx0OgorICAgICAgICAgICAgcmV0dXJuICd7OjI0c317OjE4c317OjI1c30nLmZvcm1hdChuYW1lWzoyM10sIHRlc3QucHJvdG9jb2xbOjE3XSwgdHJhbnNbOjI0XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfVxuJy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zWzoyNF0sIHNlbGYuX3Jlc3VsdF9zdHJpbmcodGVzdCkpCisKKyAgICBkZWYgX3ByaW50X3Rlc3RfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICd7OjI0c317OjE4c317OjI1c317OnN9Jy5mb3JtYXQoJ3NlcnZlci1jbGllbnQ6JywgJ3Byb3RvY29sOicsICd0cmFuc3BvcnQ6JywgJ3Jlc3VsdDonKSwKKyAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgX3ByaW50X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnQoKQorICAgICAgICBwcmludCgnQXBhY2hlIFRocmlmdCAtIEludGVncmF0aW9uIFRlc3QgU3VpdGUnLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorCisgICAgZGVmIF9wcmludF91bmV4cGVjdGVkX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpID4gMDoKKyAgICAgICAgICAgIHNlbGYub3V0LndyaXRlbGluZXMoWworICAgICAgICAgICAgICAgICcqKiogRm9sbG93aW5nICVkIGZhaWx1cmVzIHdlcmUgdW5leHBlY3RlZCAqKio6XG4nICUgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSksCisgICAgICAgICAgICAgICAgJ0lmIGl0IGlzIGludHJvZHVjZWQgYnkgeW91LCBwbGVhc2UgZml4IGl0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBjb2RlLlxuJywKKyAgICAgICAgICAgICAgICAjICdJZiBub3QsIHBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlRcbicsCisgICAgICAgICAgICBdKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgnTm8gdW5leHBlY3RlZCBmYWlsdXJlcy4nLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9mbGFreV9zdWNjZXNzKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fZmxha3lfc3VjY2VzcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgJ0ZvbGxvd2luZyAlZCB0ZXN0cyB3ZXJlIGV4cGVjdGVkIHRvIGNsZWFubHkgc3VjY2VlZCBidXQgbmVlZGVkIHJldHJ5OicgJSBsZW4oc2VsZi5fZmxha3lfc3VjY2VzcyksCisgICAgICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX2ZsYWt5X3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKworICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9zdWNjZXNzKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzKSA+IDA6CisgICAgICAgICAgICBwcmludCgKKyAgICAgICAgICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUga25vd24gdG8gZmFpbCBidXQgc3VjY2VlZGVkIChtYXliZSBmbGFreSk6JyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKworICAgIGRlZiBfaHR0cF9zZXJ2ZXJfY29tbWFuZChzZWxmLCBwb3J0KToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgICAgICByZXR1cm4gJ3B5dGhvbiAtbSBTaW1wbGVIVFRQU2VydmVyICVkJyAlIHBvcnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAncHl0aG9uIC1tIGh0dHAuc2VydmVyICVkJyAlIHBvcnQKKworICAgIGRlZiBfcHJpbnRfZm9vdGVyKHNlbGYpOgorICAgICAgICBmYWlsX2NvdW50ID0gbGVuKHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUpICsgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfdW5leHBlY3RlZF9zdWNjZXNzKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZmxha3lfc3VjY2VzcygpCisgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2h0bWxfZGF0YSgpCisgICAgICAgIHNlbGYuX2Fzc2VtYmxlX2xvZygndW5leHBlY3RlZCBmYWlsdXJlcycsIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkKKyAgICAgICAgc2VsZi5fYXNzZW1ibGVfbG9nKCdrbm93biBmYWlsdXJlcycsIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYub3V0LndyaXRlbGluZXMoWworICAgICAgICAgICAgJ1lvdSBjYW4gYnJvd3NlIHJlc3VsdHMgYXQ6XG4nLAorICAgICAgICAgICAgJ1x0ZmlsZTovLyVzLyVzXG4nICUgKHNlbGYudGVzdGRpciwgUkVTVUxUX0hUTUwpLAorICAgICAgICAgICAgJyMgSWYgeW91IHVzZSBDaHJvbWUsIHJ1bjpcbicsCisgICAgICAgICAgICAnIyBcdGNkICVzXG4jXHQlc1xuJyAlIChzZWxmLl9iYXNlZGlyLCBzZWxmLl9odHRwX3NlcnZlcl9jb21tYW5kKDgwMDEpKSwKKyAgICAgICAgICAgICcjIHRoZW4gYnJvd3NlOlxuJywKKyAgICAgICAgICAgICcjIFx0aHR0cDovL2xvY2FsaG9zdDolZC8lcy9cbicgJSAoODAwMSwgc2VsZi5fdGVzdGRpcl9yZWwpLAorICAgICAgICAgICAgJ0Z1bGwgbG9nIGZvciBlYWNoIHRlc3QgaXMgaGVyZTpcbicsCisgICAgICAgICAgICAnXHR0ZXN0L2xvZy9zZXJ2ZXJfY2xpZW50X3Byb3RvY29sX3RyYW5zcG9ydF9jbGllbnQubG9nXG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfc2VydmVyLmxvZ1xuJywKKyAgICAgICAgICAgICclZCBmYWlsZWQgb2YgJWQgdGVzdHMgaW4gdG90YWwuXG4nICUgKGZhaWxfY291bnQsIGxlbihzZWxmLl90ZXN0cykpLAorICAgICAgICBdKQorICAgICAgICBzZWxmLl9wcmludF9leGVjX3RpbWUoKQorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKworICAgIGRlZiBfcmVuZGVyX3Jlc3VsdChzZWxmLCB0ZXN0KToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIHRlc3Quc2VydmVyLm5hbWUsCisgICAgICAgICAgICB0ZXN0LmNsaWVudC5uYW1lLAorICAgICAgICAgICAgdGVzdC5wcm90b2NvbCwKKyAgICAgICAgICAgIHRlc3QudHJhbnNwb3J0LAorICAgICAgICAgICAgdGVzdC5zb2NrZXQsCisgICAgICAgICAgICB0ZXN0LnN1Y2Nlc3MsCisgICAgICAgICAgICB0ZXN0LmFzX2V4cGVjdGVkLAorICAgICAgICAgICAgdGVzdC5yZXR1cm5jb2RlLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICdzZXJ2ZXInOiBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHRlc3Quc2VydmVyLmtpbmQpLAorICAgICAgICAgICAgICAgICdjbGllbnQnOiBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHRlc3QuY2xpZW50LmtpbmQpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXQorCisgICAgZGVmIF93cml0ZV9odG1sX2RhdGEoc2VsZik6CisgICAgICAgICIiIldyaXRlcyBKU09OIGRhdGEgdG8gYmUgcmVhZCBieSByZXN1bHQgaHRtbCIiIgorICAgICAgICByZXN1bHRzID0gW3NlbGYuX3JlbmRlcl9yZXN1bHQocikgZm9yIHIgaW4gc2VsZi5fdGVzdHNdCisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYub3V0X3BhdGgsICd3KycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoanNvbi5kdW1wcyh7CisgICAgICAgICAgICAgICAgJ2RhdGUnOiBzZWxmLl9mb3JtYXRfZGF0ZSgpLAorICAgICAgICAgICAgICAgICdyZXZpc2lvbic6IHN0cihzZWxmLl9yZXZpc2lvbiksCisgICAgICAgICAgICAgICAgJ3BsYXRmb3JtJzogc2VsZi5fcGxhdGZvcm0sCisgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJzogJ3s6LjFmfScuZm9ybWF0KHNlbGYuX2VsYXBzZWQpLAorICAgICAgICAgICAgICAgICdyZXN1bHRzJzogcmVzdWx0cywKKyAgICAgICAgICAgIH0sIGluZGVudD0yKSkKKworICAgIGRlZiBfYXNzZW1ibGVfbG9nKHNlbGYsIHRpdGxlLCBpbmRleGVzKToKKyAgICAgICAgaWYgbGVuKGluZGV4ZXMpID4gMDoKKyAgICAgICAgICAgIGRlZiBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHByb2dfa2luZCk6CisgICAgICAgICAgICAgICAgcHJpbnQoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAlcyBtZXNzYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKicgJSBwcm9nX2tpbmQsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1mcCkKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nX2tpbmQsIHNlbGYudGVzdGRpcikKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ocGF0aCwgJ3InKSBhcyBwcm9nX2ZwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQocHJvZ19mcC5yZWFkKCksIGZpbGU9ZnApCisgICAgICAgICAgICBmaWxlbmFtZSA9IHRpdGxlLnJlcGxhY2UoJyAnLCAnXycpICsgJy5sb2cnCisgICAgICAgICAgICB3aXRoIGxvZ2ZpbGVfb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5sb2dkaXIsIGZpbGVuYW1lKSwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICAgICAgZm9yIHRlc3QgaW4gbWFwKHNlbGYuX3Rlc3RzLl9fZ2V0aXRlbV9fLCBpbmRleGVzKToKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoJ1RFU1Q6IFslc11cbicgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgdGVzdC5zZXJ2ZXIua2luZCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LmNsaWVudC5raW5kKQorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSgnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4nKQorICAgICAgICAgICAgcHJpbnQoJyVzIGFyZSBsb2dnZWQgdG8gJXMvJXMvJXMnICUgKHRpdGxlLmNhcGl0YWxpemUoKSwgc2VsZi5fdGVzdGRpcl9yZWwsIExPR19ESVIsIGZpbGVuYW1lKSkKKworICAgIGRlZiBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcigpCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA9PSAwCisKKyAgICBkZWYgYWRkX3Rlc3Qoc2VsZiwgdGVzdF9kaWN0KToKKyAgICAgICAgdGVzdCA9IFRlc3RFbnRyeShzZWxmLnRlc3RkaXIsICoqdGVzdF9kaWN0KQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb25jdXJyZW50OgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QsIEZhbHNlKSkKKyAgICAgICAgICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLl90ZXN0cy5hcHBlbmQodGVzdCkKKyAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5fdGVzdHMpIC0gMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBhZGRfcmVzdWx0KHNlbGYsIGluZGV4LCByZXR1cm5jb2RlLCBleHBpcmVkLCByZXRyeV9jb3VudCk6CisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZhaWxlZCA9IHJldHVybmNvZGUgaXMgTm9uZSBvciByZXR1cm5jb2RlICE9IDAKKyAgICAgICAgICAgIGZsYWt5ID0gbm90IGZhaWxlZCBhbmQgcmV0cnlfY291bnQgIT0gMAorICAgICAgICAgICAgdGVzdCA9IHNlbGYuX3Rlc3RzW2luZGV4XQorICAgICAgICAgICAga25vd24gPSB0ZXN0Lm5hbWUgaW4gc2VsZi5fa25vd25fZmFpbHVyZXMKKyAgICAgICAgICAgIGlmIGZhaWxlZDoKKyAgICAgICAgICAgICAgICBpZiBrbm93bjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCclcyBmYWlsZWQgYXMgZXhwZWN0ZWQnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBmYWlsdXJlOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICBlbGlmIGZsYWt5IGFuZCBub3Qga25vd246CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgZmxha3kgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgZWxpZiBub3QgZmxha3kgYW5kIGtub3duOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIHN1Y2Nlc3M6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgdGVzdC5zdWNjZXNzID0gbm90IGZhaWxlZAorICAgICAgICAgICAgdGVzdC5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQorICAgICAgICAgICAgdGVzdC5yZXRyeV9jb3VudCA9IHJldHJ5X2NvdW50CisgICAgICAgICAgICB0ZXN0LmV4cGlyZWQgPSBleHBpcmVkCisgICAgICAgICAgICB0ZXN0LmFzX2V4cGVjdGVkID0ga25vd24gPT0gZmFpbGVkCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb25jdXJyZW50OgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX3Jlc3VsdF9zdHJpbmcodGVzdCkgKyAnXG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0KSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGZiNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weQpAQCAtMCwwICsxLDQyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Zyb20gLmNvbXBhdCBpbXBvcnQgc3RyX2pvaW4KK2Zyb20gLnJlcG9ydCBpbXBvcnQgRXhlY1JlcG9ydGVyLCBTdW1tYXJ5UmVwb3J0ZXIKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorZnJvbSAudXRpbCBpbXBvcnQgZG9tYWluX3NvY2tldF9wYXRoCisKK1JFU1VMVF9FUlJPUiA9IDY0CitSRVNVTFRfVElNRU9VVCA9IDEyOAorU0lHTk9ORSA9IDAKK1NJR0tJTEwgPSAxNQorCisjIGdsb2JhbHMKK3BvcnRzID0gTm9uZQorc3RvcCA9IE5vbmUKKworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZCwgY3dkLCBlbnYsIHN0b3Bfc2lnbmFsLCBpc19zZXJ2ZXIsIHJlcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgc2VsZi5jd2QgPSBjd2QKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKyAgICAgICAgc2VsZi5zdG9wX3NpZ25hbCA9IHN0b3Bfc2lnbmFsCisgICAgICAgIHNlbGYuaXNfc2VydmVyID0gaXNfc2VydmVyCisgICAgICAgIHNlbGYucmVwb3J0ID0gcmVwb3J0CisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYua2lsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm9jID0gTm9uZQorCisgICAgZGVmIF9wb3Blbl9hcmdzKHNlbGYpOgorICAgICAgICBhcmdzID0geworICAgICAgICAgICAgJ2N3ZCc6IHNlbGYuY3dkLAorICAgICAgICAgICAgJ2Vudic6IHNlbGYuZW52LAorICAgICAgICAgICAgJ3N0ZG91dCc6IHNlbGYucmVwb3J0Lm91dCwKKyAgICAgICAgICAgICdzdGRlcnInOiBzdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgfQorICAgICAgICAjIG1ha2Ugc3VyZSBjaGlsZCBwcm9jZXNzZXMgZG9lc24ndCByZW1haW4gYWZ0ZXIga2lsbGluZworICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBERVRBQ0hFRF9QUk9DRVNTID0gMHgwMDAwMDAwOAorICAgICAgICAgICAgYXJncy51cGRhdGUoY3JlYXRpb25mbGFncz1ERVRBQ0hFRF9QUk9DRVNTIHwgc3VicHJvY2Vzcy5DUkVBVEVfTkVXX1BST0NFU1NfR1JPVVApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzLnVwZGF0ZShwcmVleGVjX2ZuPW9zLnNldHNpZCkKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgam9pbmVkID0gc3RyX2pvaW4oJyAnLCBzZWxmLmNtZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdDT01NQU5EOiAlcycsIGpvaW5lZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdXT1JLRElSOiAlcycsIHNlbGYuY3dkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ0xPR0ZJTEU6ICVzJywgc2VsZi5yZXBvcnQubG9ncGF0aCkKKyAgICAgICAgc2VsZi5yZXBvcnQuYmVnaW4oKQorICAgICAgICBzZWxmLnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHNlbGYuY21kLCAqKnNlbGYuX3BvcGVuX2FyZ3MoKSkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCcgICAgUElEOiAlZCcsIHNlbGYucHJvYy5waWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgUEdJRDogJWQnLCBvcy5nZXRwZ2lkKHNlbGYucHJvYy5waWQpKQorICAgICAgICByZXR1cm4gc2VsZi5fc2NvcGVkKCkKKworICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9zY29wZWQoc2VsZik6CisgICAgICAgIHlpZWxkIHNlbGYKKyAgICAgICAgaWYgc2VsZi5pc19zZXJ2ZXI6CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgaXMgc3VwcG9zZWQgdG8gcnVuIHVudGlsIHdlIHN0b3AgaXQKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydC5kaWVkKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdG9wX3NpZ25hbCAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnNpZ3dhaXQoc2VsZi5zdG9wX3NpZ25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQua2lsbGVkKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpZ3dhaXQoU0lHS0lMTCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGhlIGNsaWVudCBpcyBzdXBwb3NlZCB0byBleGl0IG5vcm1hbGx5CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQua2lsbGVkKCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBleGl0ZWQgd2l0aCByZXR1cm4gY29kZSB7MX0nLmZvcm1hdChzZWxmLnByb2MucGlkLCBzZWxmLnJldHVybmNvZGUpKQorCisgICAgIyBTZW5kIGEgc2lnbmFsIHRvIHRoZSBwcm9jZXNzIGFuZCB0aGVuIHdhaXQgZm9yIGl0IHRvIGVuZAorICAgICMgSWYgdGhlIHNpZ25hbCByZXF1ZXN0ZWQgaXMgU0lHTk9ORSwgbm8gc2lnbmFsIGlzIHNlbnQsIGFuZAorICAgICMgaW5zdGVhZCB3ZSBqdXN0IHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZDsgZnVydGhlciBpZiBpdAorICAgICMgZG9lcyBub3QgZW5kIG5vcm1hbGx5IHdpdGggU0lHTk9ORSwgd2UgbWFyayBpdCBhcyBleHBpcmVkLgorICAgICMgSWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gZW5kIGFuZCB0aGUgc2lnbmFsIGlzIG5vdCBTSUdLSUxMLAorICAgICMgaXQgcmUtcnVucyB3aXRoIFNJR0tJTEwgc28gdGhhdCBhIHJlYWwgcHJvY2VzcyBraWxsIG9jY3VycworICAgICMgcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9jZXNzIGVuZGVkLCBGYWxzZSBpZiBpdCBtYXkgbm90IGhhdmUKKyAgICBkZWYgc2lnd2FpdChzZWxmLCBzaWc9U0lHS0lMTCwgdGltZW91dD0yKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2lnICE9IFNJR05PTkU6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBzZW5kIHNpZ25hbCB7MX0nLmZvcm1hdChzZWxmLnByb2MucGlkLCBzaWcpKQorICAgICAgICAgICAgICAgIGlmIHNpZyA9PSBTSUdLSUxMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmtpbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmtpbGxwZyhvcy5nZXRwZ2lkKHNlbGYucHJvYy5waWQpLCBzaWcpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Muc2VuZF9zaWduYWwoc2lnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSBGYWlsZWQgdG8ga2lsbCBwcm9jZXNzJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCksIGV4Y19pbmZvPXN5cy5leGNfaW5mbygpKQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSB3YWl0IGJlZ2luLCB0aW1lb3V0IHsxfSBzZWMocyknLmZvcm1hdChzZWxmLnByb2MucGlkLCB0aW1lb3V0KSkKKyAgICAgICAgICAgIHNlbGYucHJvYy5jb21tdW5pY2F0ZSh0aW1lb3V0PXRpbWVvdXQpCisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1t7MH1dIHByb2Nlc3MgZW5kZWQgd2l0aCByZXR1cm4gY29kZSB7MX0nLmZvcm1hdChzZWxmLnByb2MucGlkLCBzZWxmLnJldHVybmNvZGUpKQorICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkOgorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ1t7MH1dIHRpbWVvdXQgd2FpdGluZyBmb3IgcHJvY2VzcyB0byBlbmQnLmZvcm1hdChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgICAgIGlmIHNpZyA9PSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwaXJlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZSBpZiBzaWcgPT0gU0lHS0lMTCBlbHNlIHNlbGYuc2lnd2FpdChTSUdLSUxMLCAxKQorCisgICAgIyBjYWxsZWQgb24gdGhlIGNsaWVudCBwcm9jZXNzIHRvIHdhaXQgZm9yIGl0IHRvIGVuZCBuYXR1cmFsbHkKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0KToKKyAgICAgICAgc2VsZi5zaWd3YWl0KFNJR05PTkUsIHRpbWVvdXQpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcmV0dXJuY29kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvYy5yZXR1cm5jb2RlIGlmIHNlbGYucHJvYyBlbHNlIE5vbmUKKworCitkZWYgZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgcHJvZywgaXNfc2VydmVyKToKKyAgICByZXBvcnQgPSBFeGVjUmVwb3J0ZXIobG9nZGlyLCB0ZXN0LCBwcm9nKQorICAgIHByb2cuYnVpbGRfY29tbWFuZChwb3J0KQorICAgIHJldHVybiBFeGVjdXRpb25Db250ZXh0KHByb2cuY29tbWFuZCwgcHJvZy53b3JrZGlyLCBwcm9nLmVudiwgcHJvZy5zdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpCisKKworZGVmIHJ1bl90ZXN0KHRlc3RkaXIsIGxvZ2RpciwgdGVzdF9kaWN0LCBtYXhfcmV0cnksIGFzeW5jX21vZGU9VHJ1ZSk6CisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorCisgICAgZGVmIGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCk6CisgICAgICAgIHNsZXB0ID0gMC4xCisgICAgICAgIHRpbWUuc2xlZXAoc2xlcHQpCisgICAgICAgIHNsZWVwX3N0ZXAgPSAwLjEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNsZXB0ID4gdGVzdC5kZWxheToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIGJ1dCBzZXJ2ZXIgaXMgbm90IG9wZW4nLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgdGVzdC5zb2NrZXQgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gZG9tYWluKHVuaXgpIHNvY2tldCBub3QgYXZhaWxhYmxlIHlldC4gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIHNvIGZhcicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgc2xlcHQgKz0gc2xlZXBfc3RlcAorICAgICAgICAgICAgZWxpZiB0ZXN0LnNvY2tldCA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQ3JlYXRlIHNvY2tldHMgZXZlcnkgaXRlcmF0aW9uIGJlY2F1c2UgcmVmdXNlZCBzb2NrZXRzIGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICMgcmV1c2VkIG9uIHNvbWUgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgICAgIHNvY2s2ID0gc29ja2V0LnNvY2tldChmYW1pbHk9c29ja2V0LkFGX0lORVQ2KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzdi5wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbezB9XSBzZXJ2ZXIgcHJvY2VzcyBpcyBleGl0ZWQnLmZvcm1hdChzdi5wcm9jLnBpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzb2NrNC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNvY2s2LmNsb3NlKCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc2VydmVyIHJlYWR5IC0gd2FpdGVkIGZvciB7MX0gc2Vjb25kcycuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgdHJ5OgorICAgICAgICBtYXhfYmluZF9yZXRyeSA9IDMKKyAgICAgICAgcmV0cnlfY291bnQgPSAwCisgICAgICAgIGJpbmRfcmV0cnlfY291bnQgPSAwCisgICAgICAgIHRlc3QgPSBUZXN0RW50cnkodGVzdGRpciwgKip0ZXN0X2RpY3QpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzdG9wLmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgYmVjYXVzZSBzaHV0dGluZyBkb3duJykKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBOb25lKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCcpCisgICAgICAgICAgICB3aXRoIFBvcnRBbGxvY2F0b3IuYWxsb2NfcG9ydF9zY29wZWQocG9ydHMsIHRlc3Quc29ja2V0KSBhcyBwb3J0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQgd2l0aCBwb3J0ICVkJyAlIHBvcnQpCisgICAgICAgICAgICAgICAgc3YgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LnNlcnZlciwgVHJ1ZSkKKyAgICAgICAgICAgICAgICBjbCA9IGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHRlc3QuY2xpZW50LCBGYWxzZSkKKworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgc2VydmVyJykKKyAgICAgICAgICAgICAgICB3aXRoIHN2LnN0YXJ0KCk6CisgICAgICAgICAgICAgICAgICAgIHBvcnRfb2sgPSBlbnN1cmVfc29ja2V0X29wZW4oc3YsIHBvcnQsIHRlc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIHBvcnRfb2s6CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X2NvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Nvbm5lY3RfcmV0cnkgPSAxMgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV93YWl0ID0gMC4yNQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdi5wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ25vdCBzdGFydGluZyBjbGllbnQgYmVjYXVzZSBzZXJ2ZXIgcHJvY2VzcyBpcyBhYnNlbnQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgY2xpZW50JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC5zdGFydCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGNsaWVudCAodXAgdG8gJWQgc2VjcyknICUgdGVzdC50aW1lb3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLndhaXQodGVzdC50aW1lb3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjbC5yZXBvcnQubWF5YmVfZmFsc2VfcG9zaXRpdmUoKSBvciBjb25uZWN0X3JldHJ5X2NvdW50ID49IG1heF9jb25uZWN0X3JldHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25uZWN0X3JldHJ5X2NvdW50ID4gMCBhbmQgY29ubmVjdF9yZXRyeV9jb3VudCA8IG1heF9jb25uZWN0X3JldHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1slc106IENvbm5lY3RlZCBhZnRlciAlZCByZXRyeSAoJS4yZiBzZWMgZWFjaCknICUgKHRlc3Quc2VydmVyLm5hbWUsIGNvbm5lY3RfcmV0cnlfY291bnQsIGNvbm5lY3RfcmV0cnlfd2FpdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgNTBtcyB0byBzZWUgaWYgc2VydmVyIGRvZXMgbm90IGRpZSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTZXJ2ZXIgbWF5IG5vdCBiZSByZWFkeSwgd2FpdGluZyAlLjJmIHNlY29uZC4uLicgJSBjb25uZWN0X3JldHJ5X3dhaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChjb25uZWN0X3JldHJ5X3dhaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV9jb3VudCArPSAxCisKKyAgICAgICAgICAgIGlmIHN2LnJlcG9ydC5tYXliZV9mYWxzZV9wb3NpdGl2ZSgpIGFuZCBiaW5kX3JldHJ5X2NvdW50IDwgbWF4X2JpbmRfcmV0cnk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1slc106IERldGVjdGVkIHNvY2tldCBiaW5kIGZhaWx1cmUsIHJldHJ5aW5nLi4uJywgdGVzdC5zZXJ2ZXIubmFtZSkKKyAgICAgICAgICAgICAgICBiaW5kX3JldHJ5X2NvdW50ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUkVTVUxUX1RJTUVPVVQgaWYgY2wuZXhwaXJlZCBlbHNlIGNsLnJldHVybmNvZGUgaWYgKGNsLnByb2MgYW5kIGNsLnByb2MucG9sbCgpKSBpcyBub3QgTm9uZSBlbHNlIFJFU1VMVF9FUlJPUgorCisgICAgICAgICAgICAgICAgIyBGb3Igc2VydmVycyB0aGF0IGhhbmRsZSBhIGNvbnRyb2xsZWQgc2h1dGRvd24gYnkgc2lnbmFsCisgICAgICAgICAgICAgICAgIyBpZiB0aGV5IGFyZSBraWxsZWQsIG9yIHJldHVybiBhbiBlcnJvciBjb2RlLCB0aGF0IGlzIGEKKyAgICAgICAgICAgICAgICAjIHByb2JsZW0uICBGb3Igc2VydmVycyB0aGF0IGFyZSBub3Qgc2lnbmFsLWF3YXJlLCB3ZSBzaW1wbHkKKyAgICAgICAgICAgICAgICAjIGtpbGwgdGhlbSBvZmY7IGlmIHdlIGRpZG4ndCBraWxsIHRoZW0gb2ZmLCBzb21ldGhpbmcgZWxzZQorICAgICAgICAgICAgICAgICMgaGFwcGVuZWQgKGNyYXNoZWQ/KQorICAgICAgICAgICAgICAgIGlmIHRlc3Quc2VydmVyLnN0b3Bfc2lnbmFsICE9IDA6CisgICAgICAgICAgICAgICAgICAgIGlmIHN2LmtpbGxlZCBvciBzdi5yZXR1cm5jb2RlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3Yua2lsbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJFU1VMVF9FUlJPUgorCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0ID09IDAgb3IgcmV0cnlfY291bnQgPj0gbWF4X3JldHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCByZXN1bHQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1slcy0lc106IHRlc3QgZmFpbGVkLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50ICs9IDEKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGxvZ2dlci53YXJuKCdFcnJvciBleGVjdXRpbmcgWyVzXScsIHRlc3QubmFtZSwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQorICAgIGV4Y2VwdDoKKyAgICAgICAgbG9nZ2VyLmluZm8oJ0ludGVycnVwdGVkIGV4ZWN1dGlvbicsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIGlmIG5vdCBhc3luY19tb2RlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc3RvcC5zZXQoKQorICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBSRVNVTFRfRVJST1IpCisKKworY2xhc3MgUG9ydEFsbG9jYXRvcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLl9sb2NrID0gbXVsdGlwcm9jZXNzaW5nLkxvY2soKQorICAgICAgICBzZWxmLl9wb3J0cyA9IHNldCgpCisgICAgICAgIHNlbGYuX2RvbV9wb3J0cyA9IHNldCgpCisgICAgICAgIHNlbGYuX2xhc3RfYWxsb2MgPSAwCisKKyAgICBkZWYgX2dldF90Y3BfcG9ydChzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBzb2NrLmJpbmQoKCcnLCAwKSkKKyAgICAgICAgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVsxXQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvayA9IHBvcnQgbm90IGluIHNlbGYuX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5hZGQocG9ydCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gdGltZS50aW1lKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfdGNwX3BvcnQoKQorCisgICAgZGVmIF9nZXRfZG9tYWluX3BvcnQoc2VsZik6CisgICAgICAgIHBvcnQgPSByYW5kb20ucmFuZGludCgxMDI0LCA2NTUzNikKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9kb21fcG9ydHMKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbV9wb3J0cy5hZGQocG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKworICAgIGRlZiBhbGxvY19wb3J0KHNlbGYsIHNvY2tldF90eXBlKToKKyAgICAgICAgaWYgc29ja2V0X3R5cGUgaW4gKCdkb21haW4nLCAnYWJzdHJhY3QnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF90Y3BfcG9ydCgpCisKKyAgICAjIHN0YXRpYyBtZXRob2QgZm9yIGludGVyLXByb2Nlc3MgaW52b2thdGlvbgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBhbGxvY19wb3J0X3Njb3BlZChhbGxvY2F0b3IsIHNvY2tldF90eXBlKToKKyAgICAgICAgcG9ydCA9IGFsbG9jYXRvci5hbGxvY19wb3J0KHNvY2tldF90eXBlKQorICAgICAgICB5aWVsZCBwb3J0CisgICAgICAgIGFsbG9jYXRvci5mcmVlX3BvcnQoc29ja2V0X3R5cGUsIHBvcnQpCisKKyAgICBkZWYgZnJlZV9wb3J0KHNlbGYsIHNvY2tldF90eXBlLCBwb3J0KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlX3BvcnQnKQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrZXRfdHlwZSA9PSAnZG9tYWluJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgICAgICAgICAgcGF0aCA9IGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgICAgIGVsaWYgc29ja2V0X3R5cGUgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdFcnJvciB3aGlsZSBmcmVlaW5nIHBvcnQnLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKworY2xhc3MgTm9uQXN5bmNSZXN1bHQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisKKyAgICBkZWYgZ2V0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlYWR5KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHN1Y2Nlc3NmdWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZSA9PSAwCisKKworY2xhc3MgVGVzdERpc3BhdGNoZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgYmFzZWRpciwgbG9nZGlyX3JlbCwgY29uY3VycmVuY3kpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYudGVzdGRpciA9IHRlc3RkaXIKKyAgICAgICAgc2VsZi5fcmVwb3J0ID0gU3VtbWFyeVJlcG9ydGVyKGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5ID4gMSkKKyAgICAgICAgc2VsZi5sb2dkaXIgPSBzZWxmLl9yZXBvcnQudGVzdGRpcgorICAgICAgICAjIHNlZW1zIG5lZWRlZCBmb3IgcHl0aG9uIDIueCB0byBoYW5kbGUga2V5Ym9hcmQgaW50ZXJydXB0CisgICAgICAgIHNlbGYuX3N0b3AgPSBtdWx0aXByb2Nlc3NpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9hc3luYyA9IGNvbmN1cnJlbmN5ID4gMQorICAgICAgICBpZiBub3Qgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sID0gTm9uZQorICAgICAgICAgICAgZ2xvYmFsIHN0b3AKKyAgICAgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICAgICAgc3RvcCA9IHNlbGYuX3N0b3AKKyAgICAgICAgICAgIHBvcnRzID0gUG9ydEFsbG9jYXRvcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9tID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKCkKKyAgICAgICAgICAgIHNlbGYuX20ucmVnaXN0ZXIoJ3BvcnRzJywgUG9ydEFsbG9jYXRvcikKKyAgICAgICAgICAgIHNlbGYuX20uc3RhcnQoKQorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKGNvbmN1cnJlbmN5LCBzZWxmLl9wb29sX2luaXQsIChzZWxmLl9tLmFkZHJlc3MsKSkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKAorICAgICAgICAgICAgJ1Rlc3REaXNwYXRjaGVyIHN0YXJ0ZWQgd2l0aCAlZCBjb25jdXJyZW50IGpvYnMnICUgY29uY3VycmVuY3kpCisKKyAgICBkZWYgX3Bvb2xfaW5pdChzZWxmLCBhZGRyZXNzKToKKyAgICAgICAgZ2xvYmFsIHN0b3AKKyAgICAgICAgZ2xvYmFsIG0KKyAgICAgICAgZ2xvYmFsIHBvcnRzCisgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgIG0gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIoYWRkcmVzcykKKyAgICAgICAgbS5jb25uZWN0KCkKKyAgICAgICAgcG9ydHMgPSBtLnBvcnRzKCkKKworICAgIGRlZiBfZGlzcGF0Y2hfc3luYyhzZWxmLCB0ZXN0LCBjb250LCBtYXhfcmV0cnkpOgorICAgICAgICByID0gcnVuX3Rlc3Qoc2VsZi50ZXN0ZGlyLCBzZWxmLmxvZ2RpciwgdGVzdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPUZhbHNlKQorICAgICAgICBjb250KHIpCisgICAgICAgIHJldHVybiBOb25Bc3luY1Jlc3VsdChyKQorCisgICAgZGVmIF9kaXNwYXRjaF9hc3luYyhzZWxmLCB0ZXN0LCBjb250LCBtYXhfcmV0cnkpOgorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ19kaXNwYXRjaF9hc3luYycpCisgICAgICAgIHJldHVybiBzZWxmLl9wb29sLmFwcGx5X2FzeW5jKGZ1bmM9cnVuX3Rlc3QsIGFyZ3M9KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSksIGNhbGxiYWNrPWNvbnQpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgdGVzdCwgbWF4X3JldHJ5KToKKyAgICAgICAgaW5kZXggPSBzZWxmLl9yZXBvcnQuYWRkX3Rlc3QodGVzdCkKKworICAgICAgICBkZWYgY29udChyZXN1bHQpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3N0b3AuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGFuZCBsZW4ocmVzdWx0KSA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCwgcmV0dXJuY29kZSA9IHJlc3VsdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICByZXR1cm5jb2RlID0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlaW5nIHBvcnQnKQorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnYWRkaW5nIHJlc3VsdCcpCisgICAgICAgICAgICAgICAgc2VsZi5fcmVwb3J0LmFkZF9yZXN1bHQoaW5kZXgsIHJldHVybmNvZGUsIHJldHVybmNvZGUgPT0gUkVTVUxUX1RJTUVPVVQsIHJldHJ5X2NvdW50KQorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZmluaXNoIGNvbnRpbnVhdGlvbicpCisgICAgICAgIGZuID0gc2VsZi5fZGlzcGF0Y2hfYXN5bmMgaWYgc2VsZi5fYXN5bmMgZWxzZSBzZWxmLl9kaXNwYXRjaF9zeW5jCisgICAgICAgIHJldHVybiBmbih0ZXN0LCBjb250LCBtYXhfcmV0cnkpCisKKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wuam9pbigpCisgICAgICAgICAgICBzZWxmLl9tLnNodXRkb3duKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcG9ydC5lbmQoKQorCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fc3RvcC5zZXQoKQorICAgICAgICBpZiBzZWxmLl9hc3luYzoKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wudGVybWluYXRlKCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wuam9pbigpCisgICAgICAgICAgICBzZWxmLl9tLnNodXRkb3duKCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnIGIvdGVzdC9jcm9zc3J1bm5lci9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTEyODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkKQEAgLTAsMCArMSwxNDkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29weQoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIC5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgorZnJvbSAudXRpbCBpbXBvcnQgbWVyZ2VfZGljdCwgZG9tYWluX3NvY2tldF9wYXRoCisKKworY2xhc3MgVGVzdFByb2dyYW0ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2luZCwgbmFtZSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCB3b3JrZGlyLCBzdG9wX3NpZ25hbCwgY29tbWFuZCwgZW52PU5vbmUsCisgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9W10sIGV4dHJhX2FyZ3MyPVtdLCBqb2luX2FyZ3M9RmFsc2UsICoqa3dhcmdzKToKKworICAgICAgICBzZWxmLmtpbmQgPSBraW5kCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CisgICAgICAgIHNlbGYud29ya2RpciA9IHdvcmtkaXIKKyAgICAgICAgc2VsZi5zdG9wX3NpZ25hbCA9IHN0b3Bfc2lnbmFsCisgICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fYmFzZV9jb21tYW5kID0gc2VsZi5fZml4X2NtZF9wYXRoKGNvbW1hbmQpCisgICAgICAgIGlmIGVudjoKKyAgICAgICAgICAgIHNlbGYuZW52ID0gY29weS5jb3B5KG9zLmVudmlyb24pCisgICAgICAgICAgICBzZWxmLmVudi51cGRhdGUoZW52KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbnYgPSBvcy5lbnZpcm9uCisgICAgICAgIHNlbGYuX2V4dHJhX2FyZ3MgPSBleHRyYV9hcmdzCisgICAgICAgIHNlbGYuX2V4dHJhX2FyZ3MyID0gZXh0cmFfYXJnczIKKyAgICAgICAgc2VsZi5fam9pbl9hcmdzID0gam9pbl9hcmdzCisKKyAgICBkZWYgX2ZpeF9jbWRfcGF0aChzZWxmLCBjbWQpOgorICAgICAgICAjIGlmIHRoZSBhcmcgaXMgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgbWFrZSBpdCBwYXRoCisgICAgICAgIGRlZiBhYnNfaWZfZXhpc3RzKGFyZyk6CisgICAgICAgICAgICBwID0gcGF0aF9qb2luKHNlbGYud29ya2RpciwgYXJnKQorICAgICAgICAgICAgcmV0dXJuIHAgaWYgb3MucGF0aC5leGlzdHMocCkgZWxzZSBhcmcKKworICAgICAgICBpZiBjbWRbMF0gPT0gJ3B5dGhvbic6CisgICAgICAgICAgICBjbWRbMF0gPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kWzBdID0gYWJzX2lmX2V4aXN0cyhjbWRbMF0pCisgICAgICAgIHJldHVybiBjbWQKKworICAgIGRlZiBfc29ja2V0X2FyZ3Moc2VsZiwgc29ja2V0LCBwb3J0KToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdpcC1zc2wnOiBbJy0tc3NsJ10sCisgICAgICAgICAgICAnZG9tYWluJzogWyctLWRvbWFpbi1zb2NrZXQ9JXMnICUgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpXSwKKyAgICAgICAgICAgICdhYnN0cmFjdCc6IFsnLS1hYnN0cmFjdC1uYW1lc3BhY2UnLCAnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgIH0uZ2V0KHNvY2tldCwgTm9uZSkKKworICAgIGRlZiBfdHJhbnNwb3J0X2FyZ3Moc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICd6bGliJzogWyctLXpsaWInXSwKKyAgICAgICAgfS5nZXQodHJhbnNwb3J0LCBOb25lKQorCisgICAgZGVmIGJ1aWxkX2NvbW1hbmQoc2VsZiwgcG9ydCk6CisgICAgICAgIGNtZCA9IGNvcHkuY29weShzZWxmLl9iYXNlX2NvbW1hbmQpCisgICAgICAgIGFyZ3MgPSBjb3B5LmNvcHkoc2VsZi5fZXh0cmFfYXJnczIpCisgICAgICAgIGFyZ3MuYXBwZW5kKCctLXByb3RvY29sPScgKyBzZWxmLnByb3RvY29sKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9JyArIHNlbGYudHJhbnNwb3J0KQorICAgICAgICB0cmFuc3BvcnRfYXJncyA9IHNlbGYuX3RyYW5zcG9ydF9hcmdzKHNlbGYudHJhbnNwb3J0KQorICAgICAgICBpZiB0cmFuc3BvcnRfYXJnczoKKyAgICAgICAgICAgIGFyZ3MgKz0gdHJhbnNwb3J0X2FyZ3MKKyAgICAgICAgc29ja2V0X2FyZ3MgPSBzZWxmLl9zb2NrZXRfYXJncyhzZWxmLnNvY2tldCwgcG9ydCkKKyAgICAgICAgaWYgc29ja2V0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHNvY2tldF9hcmdzCisgICAgICAgIGFyZ3MuYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkKKyAgICAgICAgaWYgc2VsZi5fam9pbl9hcmdzOgorICAgICAgICAgICAgY21kLmFwcGVuZCgnJXMnICUgIiAiLmpvaW4oYXJncykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWQuZXh0ZW5kKGFyZ3MpCisgICAgICAgIGlmIHNlbGYuX2V4dHJhX2FyZ3M6CisgICAgICAgICAgICBjbWQuZXh0ZW5kKHNlbGYuX2V4dHJhX2FyZ3MpCisgICAgICAgIHNlbGYuY29tbWFuZCA9IGNtZAorICAgICAgICByZXR1cm4gc2VsZi5jb21tYW5kCisKKworY2xhc3MgVGVzdEVudHJ5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHNlcnZlciwgY2xpZW50LCBkZWxheSwgdGltZW91dCwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fY29uZmlnID0ga3dhcmdzCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBrd2FyZ3NbJ3Byb3RvY29sJ10KKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBrd2FyZ3NbJ3RyYW5zcG9ydCddCisgICAgICAgIHNlbGYuc29ja2V0ID0ga3dhcmdzWydzb2NrZXQnXQorICAgICAgICBzcnZfZGljdCA9IHNlbGYuX2ZpeF93b3JrZGlyKG1lcmdlX2RpY3Qoc2VsZi5fY29uZmlnLCBzZXJ2ZXIpKQorICAgICAgICBjbGlfZGljdCA9IHNlbGYuX2ZpeF93b3JrZGlyKG1lcmdlX2RpY3Qoc2VsZi5fY29uZmlnLCBjbGllbnQpKQorICAgICAgICBjbGlfZGljdFsnZXh0cmFfYXJnczInXSA9IHNydl9kaWN0LnBvcCgncmVtb3RlX2FyZ3MnLCBbXSkKKyAgICAgICAgc3J2X2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBjbGlfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNlbGYuc2VydmVyID0gVGVzdFByb2dyYW0oJ3NlcnZlcicsICoqc3J2X2RpY3QpCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGVzdFByb2dyYW0oJ2NsaWVudCcsICoqY2xpX2RpY3QpCisgICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheQorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuX25hbWUgPSBOb25lCisgICAgICAgICMgcmVzdWx0cworICAgICAgICBzZWxmLnN1Y2Nlc3MgPSBOb25lCisgICAgICAgIHNlbGYuYXNfZXhwZWN0ZWQgPSBOb25lCisgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5leHBpcmVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5yZXRyeV9jb3VudCA9IDAKKworICAgIGRlZiBfZml4X3dvcmtkaXIoc2VsZiwgY29uZmlnKToKKyAgICAgICAga2V5ID0gJ3dvcmtkaXInCisgICAgICAgIHBhdGggPSBjb25maWcuZ2V0KGtleSwgTm9uZSkKKyAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICBwYXRoID0gc2VsZi50ZXN0ZGlyCisgICAgICAgIGlmIG9zLnBhdGguaXNhYnMocGF0aCk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aF9qb2luKHNlbGYudGVzdGRpciwgcGF0aCkpCisgICAgICAgIGNvbmZpZy51cGRhdGUoe2tleTogcGF0aH0pCisgICAgICAgIHJldHVybiBjb25maWcKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnZXRfbmFtZShjbHMsIHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiAnJXMtJXNfJXNfJXMtJXMnICUgKHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25hbWU6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gc2VsZi5nZXRfbmFtZSgKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5uYW1lLCBzZWxmLmNsaWVudC5uYW1lLCBzZWxmLnByb3RvY29sLCBzZWxmLnRyYW5zcG9ydCwgc2VsZi5zb2NrZXQpCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdHJhbnNwb3J0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKKworCitkZWYgdGVzdF9uYW1lKHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsICoqa3dhcmdzKToKKyAgICByZXR1cm4gVGVzdEVudHJ5LmdldF9uYW1lKHNlcnZlclsnbmFtZSddLCBjbGllbnRbJ25hbWUnXSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5IGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTRkZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBjb3B5CisKKworZGVmIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KToKKyAgICByZXR1cm4gJy90bXAvVGhyaWZ0VGVzdC50aHJpZnQuJWQnICUgcG9ydAorCisKK2RlZiBtZXJnZV9kaWN0KGJhc2UsIHVwZGF0ZSk6CisgICAgIiIiVXBkYXRlIGRpY3QgY29uY2F0ZW5hdGluZyBsaXN0IHZhbHVlcyIiIgorICAgIHJlcyA9IGNvcHkuZGVlcGNvcHkoYmFzZSkKKyAgICBmb3IgaywgdiBpbiBsaXN0KHVwZGF0ZS5pdGVtcygpKToKKyAgICAgICAgaWYgayBpbiBsaXN0KHJlcy5rZXlzKCkpIGFuZCBpc2luc3RhbmNlKHYsIGxpc3QpOgorICAgICAgICAgICAgcmVzW2tdLmV4dGVuZCh2KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzW2tdID0gdgorICAgIHJldHVybiByZXMKZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL0NTaGFycENsaWVudC5jcyBiL3Rlc3QvY3NoYXJwL0NTaGFycENsaWVudC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxZDVjOS4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9DU2hhcnBDbGllbnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBUaHJpZnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuU2VydmVyOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLQotCi1uYW1lc3BhY2UgQ1NoYXJwVHV0b3JpYWwKLXsKLSAgICBwdWJsaWMgY2xhc3MgQ1NoYXJwQ2xpZW50Ci0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOwotICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKLQotICAgICAgICAgICAgICAgIGNsaWVudC5waW5nKCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInBpbmcoKSIpOwotCi0gICAgICAgICAgICAgICAgaW50IHN1bSA9IGNsaWVudC5hZGQoMSwgMSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjErMT17MH0iLCBzdW0pOwotCi0gICAgICAgICAgICAgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKLQotICAgICAgICAgICAgICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFOwotICAgICAgICAgICAgICAgIHdvcmsubnVtMSA9IDE7Ci0gICAgICAgICAgICAgICAgd29yay5udW0yID0gMDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLndoeSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKLSAgICAgICAgICAgICAgICB3b3JrLm51bTEgPSAxNTsKLSAgICAgICAgICAgICAgICB3b3JrLm51bTIgPSAxMDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjE1LTEwPXswfSIsIGRpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLndoeSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU2hhcmVkU3RydWN0IGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNoZWNrIGxvZzogezB9IiwgbG9nLnZhbHVlKTsKLQotICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHguU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL0NTaGFycFNlcnZlci5jcyBiL3Rlc3QvY3NoYXJwL0NTaGFycFNlcnZlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYjhmZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9DU2hhcnBTZXJ2ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBUaHJpZnQuU2VydmVyOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLQotbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsCi17Ci0gICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogQ2FsY3VsYXRvci5JZmFjZQotICAgIHsKLSAgICAgICAgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gbG9nOwotCi0gICAgICAgIHB1YmxpYyBDYWxjdWxhdG9ySGFuZGxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYWRkKHswfSx7MX0pIiwgbjEsIG4yKTsKLSAgICAgICAgICAgIHJldHVybiBuMSArIG4yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjYWxjdWxhdGUoezB9LCBbezF9LHsyfSx7M31dKSIsIGxvZ2lkLCB3b3JrLm9wLCB3b3JrLm51bTEsIHdvcmsubnVtMik7Ci0gICAgICAgICAgICBpbnQgdmFsID0gMDsKLSAgICAgICAgICAgIHN3aXRjaCAod29yay5vcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgotICAgICAgICAgICAgICAgICAgICBpZiAod29yay5udW0yID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW8ud2hhdCA9IChpbnQpd29yay5vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW8ud2hhdCA9IChpbnQpd29yay5vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLndoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTaGFyZWRTdHJ1Y3QgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7Ci0gICAgICAgICAgICBlbnRyeS5rZXkgPSBsb2dpZDsKLSAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBsb2dbbG9naWRdID0gZW50cnk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2hhcmVkU3RydWN0IGdldFN0cnVjdChpbnQga2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZ2V0U3RydWN0KHswfSkiLCBrZXkpOwotICAgICAgICAgICAgcmV0dXJuIGxvZ1trZXldOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgemlwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInppcCgpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQ1NoYXJwU2VydmVyCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENhbGN1bGF0b3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKLSAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KTsKLQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCi0gICAgICAgICAgICAgICAgLy8gc2VydmVyID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KTsKLQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7Ci0gICAgICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoeC5TdGFja1RyYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0gYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE2NmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0dFTkVSQVRFRCA9IFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0JvbmsuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQ3JhenlOZXN0aW5nLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0VtcHR5U3RydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0d1ZXNzUHJvdG9jb2xTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvSW5zYW5pdHkuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGFyZ2VEZWx0YXMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdEJvbmtzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0kzMngyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTWl4ZWR4Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OdW1iZXJ6LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L09uZUZpZWxkLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1NlY29uZFNlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU3RydWN0QS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RCLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuQ29uc3RhbnRzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVmVyc2lvbmluZ1Rlc3RWMS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QzLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworaWYgTU9OT19NQ1MKK0NTQyA9IG1jcworZWxzZQorQ1NDID0gZ21jcworZW5kaWYKKworaWYgTkVUXzJfMAorQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCitlbmRpZgorCitMSUJESVIgPSAkKHRvcF9idWlsZGRpcikvbGliL2NzaGFycAorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCiskKEdFTkVSQVRFRCk6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwIC1vIC4gJDwKKworcHJlY3Jvc3M6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisKK1RocmlmdEltcGwuZGxsOiAkKEdFTkVSQVRFRCkgJChMSUJESVIpL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgJChHRU5FUkFURUQpCisKK1NSQ1MgPSBUZXN0Q2xpZW50LmNzIFRlc3RTZXJ2ZXIuY3MgUHJvZ3JhbS5jcworCitUZXN0Q2xpZW50U2VydmVyLmV4ZTogJChTUkNTKSBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkKFNSQ1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMAorY2hlY2stbG9jYWw6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisJTU9OT19QQVRIPSQoTElCRElSKSB0aW1lb3V0IDEwIG1vbm8gVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyIC0tcG9ydD0kKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0kKExJQkRJUikgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBjbGllbnQgLS1wb3J0PSQoVEVTVFBPUlQpCisKK0VYVFJBX0RJU1QgPSBcCisJUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorCVRocmlmdFRlc3QuY3Nwcm9qIFwKKwlUaHJpZnRUZXN0LnNsbiBcCisJUHJvZ3JhbS5jcyBcCisJVGVzdFNlcnZlci5jcyBcCisJVGVzdENsaWVudC5jcwpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKKy8vCisvLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6CisvLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11c3QgcHJvdmlkZSAnc2VydmVyJyBvciAnY2xpZW50JyBhcmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmdbXSBzdWJBcmdzID0gbmV3IHN0cmluZ1thcmdzLkxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ViQXJnc1tpLTFdID0gYXJnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmdzWzBdID09ICJjbGllbnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncykgPyAwIDogMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTAxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0VGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDljMDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpAQCAtMCwwICsxLDg3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuVGVzdDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgcHVibGljIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBtdWx0aXBsZXhlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgX2lzRmlyc3RUcmFuc3BvcnQgPSB0cnVlOworCisKKyAgICAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IENyZWF0ZVRyYW5zcG9ydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL2NsaWVudC5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobywgYywgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0ZpcnN0VHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaXNGaXJzdFRyYW5zcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yUHJvdG9jb2wgPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGVzdFBhcmFtcyBwYXJhbTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbWluOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQsIHNlY29uZCwgcGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFBhcmFtcyBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5udW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5waXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5ob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWMiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWoiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXByb3RvY29sPW11bHRpIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ubXVsdGlwbGV4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgbnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGhyZWFkKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgdC5Kb2luKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCwgYm9vbCBodWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBodWdlID0gdHJ1ZSB0ZXN0cyBmb3IgVEhSSUZULTQzNzIKKyAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVtodWdlID8gMHgxMjM0NSA6IDB4MTAwXTsKKyAgICAgICAgICAgIGludCBpbml0TGVuID0gcmV0dmFsLkxlbmd0aDsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGVDbGllbnRUZXN0KFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCwgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kLCBUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZWNvbmRUZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICAgICAgICBzID0gc2Vjb25kLnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICAgIGlmICgidGVzdFN0cmluZyhcIlRlc3QyXCIpIiAhPSBzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JQcm90b2NvbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgYm9vbCB0ID0gY2xpZW50LnRlc3RCb29sKChib29sKXRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICBzYnl0ZSBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgoc2J5dGUpMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICBpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMzIgPSAwOyBpMzIgPCAyOyArK2kzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaHVnZSA9IChpMzIgPiAwKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKGZhbHNlLGh1Z2UpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYmluSW4gPSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgQ3JhenlOZXN0aW5nIik7CisgICAgICAgICAgICBpZiggdHlwZW9mKENyYXp5TmVzdGluZykuR2V0TWV0aG9kKCJFcXVhbHMiKS5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyYXp5TmVzdGluZyBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIHR3byA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICBvbmUuQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgICAgIHR3by5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdCBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICBYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIE51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKKyAgICAgICAgICAgIGlmICgzMDk4NTgyMzUwODI1MjNMICE9IHVpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKKyAgICAgICAgICAgIGludCBhcmcxID0gMjsKKyAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKyAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm9rIik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgIk9LIikuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlLCBUaHJpZnQuVENvbnRyb2xsaW5nSGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHJldXNhYmxlU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSB0ZXN0TG9nRGVsZWdhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZSArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IixoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggcmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc2J5dGUgdGVzdEJ5dGUoc2J5dGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB0ZXN0QmluYXJ5KGJ5dGVbXSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRIYXNoU2V0PGludD4gdGVzdFNldChUSGFzaFNldDxpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiB0ZXN0TGlzdChMaXN0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KKyAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2FuaXR5CisgICAgICAgICAgICAvLyByZXR1cm5zOgorICAgICAgICAgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgfSwKKyAgICAgICAgICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOworICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlbGxvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgICAgICAgICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAgICAgICAgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgICAgICAgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gYXJnOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCxhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICAgICAgICAgIHguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uMiB4ID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LlN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0b3AoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIGFyZyk7CisgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKKworICAgICAgICBwcml2YXRlIGVudW0gU2VydmVyVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2ltcGxlU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZGVkU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIsCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvY2Vzc29yRmFjdG9yeVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2UsIHVzZUZyYW1lZCA9IGZhbHNlLCB1c2VFbmNyeXB0aW9uID0gZmFsc2UsIGNvbXBhY3QgPSBmYWxzZSwganNvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIFNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFNpbXBsZVNlcnZlcjsKKyAgICAgICAgICAgICAgICBQcm9jZXNzb3JGYWN0b3J5VHlwZSBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkUG9vbFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeVR5cGUgPSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUVuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChjb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk8VGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIFRlc3RIYW5kbGVyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmICh1c2VGcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZGVkU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgICAgICBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudHMgPSBuZXcgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICBzdHJpbmcgd2hlcmUgPSAocGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIiArIHBpcGUgOiAib24gcG9ydCAiICsgcG9ydCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSAiICsgc2VydmVyVHlwZS5Ub1N0cmluZygpICsgIiAiICsgd2hlcmUgKworICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc29yRmFjdG9yeVR5cGUgPT0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkgPyAiIHdpdGggcHJvY2Vzc29yIHByb3RvdHlwZSBmYWN0b3J5ICIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAoY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChqc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYyOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFNlcnZlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxsaWJcY3NoYXJwXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlxjc2hhcnBcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjVhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDE3IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIlRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvZ3JhbS5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvZ3JhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2M2NhNC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotCi1uYW1lc3BhY2UgVGVzdAotewotCWNsYXNzIFByb2dyYW0KLQl7Ci0JCXN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKLQkJewotCQkJaWYgKGFyZ3MuTGVuZ3RoID09IDApCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIm11c3QgcHJvdmlkZSAnc2VydmVyJyBvciAnY2xpZW50JyBhcmciKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXN0cmluZ1tdIHN1YkFyZ3MgPSBuZXcgc3RyaW5nW2FyZ3MuTGVuZ3RoIC0gMV07Ci0JCQlmb3IoaW50IGkgPSAxOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlzdWJBcmdzW2ktMV0gPSBhcmdzW2ldOwotCQkJfQotCQkJaWYgKGFyZ3NbMF0gPT0gImNsaWVudCIpCi0JCQl7Ci0JCQkJVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpOwotCQkJfQotCQkJZWxzZSBpZiAoYXJnc1swXSA9PSAic2VydmVyIikKLQkJCXsKLQkJCQlUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRjYThkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnRUZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCJmNDFiMTkzYi1mMWFiLTQ4ZWUtODg0My1mODhlNDMwODRlMjYiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbgotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdjNzVlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdENsaWVudC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuVGVzdDsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLQlwdWJsaWMgY2xhc3MgVGVzdENsaWVudAotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOwotCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7Ci0JCQkJaW50IHBvcnQgPSA5MDkwOwotCQkJCXN0cmluZyB1cmwgPSBudWxsOwotCQkJCWludCBudW1UaHJlYWRzID0gMTsKLQkJCQlib29sIGJ1ZmZlcmVkID0gZmFsc2U7Ci0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKGFyZ3NbaV0gPT0gIi1oIikKLQkJCQkJCXsKLQkJCQkJCQlzdHJpbmdbXSBob3N0cG9ydCA9IGFyZ3NbKytpXS5TcGxpdCgnOicpOwotCQkJCQkJCWhvc3QgPSBob3N0cG9ydFswXTsKLQkJCQkJCQlpZiAoaG9zdHBvcnQuTGVuZ3RoID4gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXBvcnQgPSBDb252ZXJ0LlRvSW50MzIoaG9zdHBvcnRbMV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGFyZ3NbaV0gPT0gIi11IikKLQkJCQkJCXsKLQkJCQkJCQl1cmwgPSBhcmdzWysraV07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItbiIpCi0JCQkJCQl7Ci0JCQkJCQkJbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi1idWZmZXJlZCIpCi0JCQkJCQl7Ci0JCQkJCQkJYnVmZmVyZWQgPSB0cnVlOwotCQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItdCIpCi0JCQkJCQl7Ci0JCQkJCQkJbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGUuU3RhY2tUcmFjZSk7Ci0JCQkJfQotCi0KLQotCQkJCS8vaXNzdWUgdGVzdHMgb24gc2VwYXJhdGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQotCQkJCVRocmVhZFtdIHRocmVhZHMgPSBuZXcgVGhyZWFkW251bVRocmVhZHNdOwotCQkJCURhdGVUaW1lIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OwotCQkJCWZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGhyZWFkczsgdGVzdCsrKQotCQkJCXsKLQkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50VGhyZWFkKSk7Ci0JCQkJCXRocmVhZHNbdGVzdF0gPSB0OwotCQkJCQlpZiAodXJsID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCVRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQkJCQlpZiAoYnVmZmVyZWQpCi0JCQkJCQl7Ci0JCQkJCQkJVEJ1ZmZlcmVkVHJhbnNwb3J0IGJ1ZmZlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KTsKLQkJCQkJCQl0LlN0YXJ0KGJ1ZmZlcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJdC5TdGFydChzb2NrZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVEh0dHBDbGllbnQgaHR0cCA9IG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOwotCQkJCQkJdC5TdGFydChodHRwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGhyZWFkczsgdGVzdCsrKQotCQkJCXsKLQkJCQkJdGhyZWFkc1t0ZXN0XS5Kb2luKCk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKLQkJCX0KLQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGhyZWFkKG9iamVjdCBvYmopCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFRUcmFuc3BvcnQpb2JqOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCi0JCQl7Ci0JCQkJQ2xpZW50VGVzdCh0cmFuc3BvcnQpOwotCQkJfQotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJewotCQkJVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0JCQlUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQoYmluYXJ5UHJvdG9jb2wpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotCQkJCXsKLQkJCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLQkJCWNsaWVudC50ZXN0Vm9pZCgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLQkJCXN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7Ci0JCQlieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7Ci0JCQlpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLQkJCWxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKLQkJCWRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotCQkJWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7Ci0JCQlvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKLQkJCW8uQnl0ZV90aGluZyA9IChieXRlKTE7Ci0JCQlvLkkzMl90aGluZyA9IC0zOwotCQkJby5JNjRfdGhpbmcgPSAtNTsKLQkJCVh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0JCQlYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLQkJCW8yLkJ5dGVfdGhpbmcgPSAoYnl0ZSkxOwotCQkJbzIuU3RydWN0X3RoaW5nID0gbzsKLQkJCW8yLkkzMl90aGluZyA9IDU7Ci0JCQlYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKLQkJCWkgPSBpMi5TdHJ1Y3RfdGhpbmc7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOwotCi0JCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQotCQkJewotCQkJCW1hcG91dFtqXSA9IGogLSAxMDsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOwotCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQkJCUxpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCWxpc3RvdXQuQWRkKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0JCQkvL3NldAotCQkJVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCXNldG91dC5BZGQoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKLQkJCU51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOwotCQkJcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKLQkJCWxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7Ci0JCQlEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07Ci0JCQkJZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCQkJSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0JCQlpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQlpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7Ci0JCQlYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0JCQl0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotCQkJdHJ1Y2suQnl0ZV90aGluZyA9IChieXRlKTg7Ci0JCQl0cnVjay5JMzJfdGhpbmcgPSA4OwotCQkJdHJ1Y2suSTY0X3RoaW5nID0gODsKLQkJCWluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotCQkJaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7Ci0JCQlEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZm9yZWFjaCAobG9uZyBrZXkgaW4gd2hvYS5LZXlzKQotCQkJewotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHZhbCA9IHdob2Fba2V5XTsKLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOwotCi0JCQkJZm9yZWFjaCAoTnVtYmVyeiBrMiBpbiB2YWwuS2V5cykKLQkJCQl7Ci0JCQkJCUluc2FuaXR5IHYyID0gdmFsW2syXTsKLQotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7Ci0JCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4gdXNlck1hcCA9IHYyLlVzZXJNYXA7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAodXNlck1hcCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChOdW1iZXJ6IGszIGluIHVzZXJNYXAuS2V5cykKLQkJCQkJCXsKLQkJCQkJCQlDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9LCAiKTsKLQotCQkJCQlMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLlh0cnVjdHM7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAoeHRydWN0cyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChYdHJ1Y3QgeCBpbiB4dHJ1Y3RzKQotCQkJCQkJewotCQkJCQkJCUNvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9Iik7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0JCQlieXRlIGFyZzAgPSAxOwotCQkJaW50IGFyZzEgPSAyOwotCQkJbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKLQkJCURpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKLQkJCW11bHRpRGljdFsxXSA9ICJvbmUiOwotCQkJTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOwotCQkJbG9uZyBhcmc1ID0gNTAwMDAwMDsKLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKLQkJCVh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZwotCQkJCQkJKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOwotCQkJY2xpZW50LnRlc3RPbmV3YXkoMSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzA2NDAuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi0vLwotLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgotLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwotdXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuU2VydmVyOwotCi1uYW1lc3BhY2UgVGVzdAotewotCXB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCi0JewotCQlwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlCi0JCXsKLQkJCXB1YmxpYyBUU2VydmVyIHNlcnZlcjsKLQotCQkJcHVibGljIFRlc3RIYW5kbGVyKCkgeyB9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RWb2lkKCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFZvaWQoKSIpOwotCQkJfQotCi0JCQlwdWJsaWMgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0c3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIGJ5dGUgdGVzdEJ5dGUoYnl0ZSB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEJ5dGUoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJMzIoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEk2NCgiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdERvdWJsZSgiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFN0cnVjdCh7IiArCi0JCQkJCQkJCSAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTY0X3RoaW5nICsgIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCi0JCQl7Ci0JCQkJWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3ROZXN0KHsiICsKLQkJCQkJCQkJIG5lc3QuQnl0ZV90aGluZyArICIsIHsiICsKLQkJCQkJCQkJICJcIiIgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKwotCQkJCQkJCQkgdGhpbmcuQnl0ZV90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTMyX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JNjRfdGhpbmcgKyAifSwgIiArCi0JCQkJCQkJCSBuZXN0LkkzMl90aGluZyArICJ9KSIpOwotCQkJCXJldHVybiBuZXN0OwotCQkJfQotCi0JCQlwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcCh7Iik7Ci0JCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0KQotCQkJCQl7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0JCQkJCX0KLQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoa2V5ICsgIiA9PiAiICsgdGhpbmdba2V5XSk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIFRIYXNoU2V0PGludD4gdGVzdFNldChUSGFzaFNldDxpbnQ+IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0U2V0KHsiKTsKLQkJCQlib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCQlmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKLQkJCQl7Ci0JCQkJCWlmIChmaXJzdCkKLQkJCQkJewotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGVsZW0pOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaXN0PGludD4gdGVzdExpc3QoTGlzdDxpbnQ+IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TGlzdCh7Iik7Ci0JCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0JCQkJewotCQkJCQlpZiAoZmlyc3QpCi0JCQkJCXsKLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RW51bSgiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpIik7Ci0JCQkJRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtYXBtYXAgPQotCQkJCSAgbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKLQotCQkJCURpY3Rpb25hcnk8aW50LCBpbnQ+IHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOwotCQkJCURpY3Rpb25hcnk8aW50LCBpbnQ+IG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKQotCQkJCXsKLQkJCQkJcG9zW2ldID0gaTsKLQkJCQkJbmVnWy1pXSA9IC1pOwotCQkJCX0KLQotCQkJCW1hcG1hcFs0XSA9IHBvczsKLQkJCQltYXBtYXBbLTRdID0gbmVnOwotCi0JCQkJcmV0dXJuIG1hcG1hcDsKLQkJCX0KLQotCQkJcHVibGljIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEluc2FuaXR5KCkiKTsKLQotCQkJCVh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQloZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLQkJCQloZWxsby5CeXRlX3RoaW5nID0gMjsKLQkJCQloZWxsby5JMzJfdGhpbmcgPSAyOwotCQkJCWhlbGxvLkk2NF90aGluZyA9IDI7Ci0KLQkJCQlYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQlnb29kYnllLlN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0JCQkJZ29vZGJ5ZS5CeXRlX3RoaW5nID0gKGJ5dGUpNDsKLQkJCQlnb29kYnllLkkzMl90aGluZyA9IDQ7Ci0JCQkJZ29vZGJ5ZS5JNjRfdGhpbmcgPSAobG9uZyk0OwotCi0JCQkJSW5zYW5pdHkgY3JhenkgPSBuZXcgSW5zYW5pdHkoKTsKLQkJCQljcmF6eS5Vc2VyTWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4oKTsKLQkJCQljcmF6eS5Vc2VyTWFwW051bWJlcnouRUlHSFRdID0gKGxvbmcpODsKLQkJCQljcmF6eS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotCQkJCWNyYXp5Llh0cnVjdHMuQWRkKGdvb2RieWUpOwotCi0JCQkJSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7Ci0JCQkJY3JhenkuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gKGxvbmcpNTsKLQkJCQljcmF6eS5YdHJ1Y3RzLkFkZChoZWxsbyk7Ci0KLQkJCQlEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKLQkJCQlEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKLQotCQkJCWZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBjcmF6eTsKLQkJCQlmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKLQotCQkJCXNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbG9vbmV5OwotCi0JCQkJRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gaW5zYW5lID0KLQkJCQkgIG5ldyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PigpOwotCQkJCWluc2FuZVsobG9uZykxXSA9IGZpcnN0X21hcDsKLQkJCQlpbnNhbmVbKGxvbmcpMl0gPSBzZWNvbmRfbWFwOwotCi0JCQkJcmV0dXJuIGluc2FuZTsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGkoKSIpOwotCi0JCQkJWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7Ci0JCQkJaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0JCQkJaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7Ci0JCQkJaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKLQkJCQloZWxsby5JNjRfdGhpbmcgPSBhcmcyOwotCQkJCXJldHVybiBoZWxsbzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKCIgKyBhcmcgKyAiKSIpOwotCQkJCWlmIChhcmcgPT0gIlhjZXB0aW9uIikKLQkJCQl7Ci0JCQkJCVhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLQkJCQkJeC5FcnJvckNvZGUgPSAxMDAxOwotCQkJCQl4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpIik7Ci0JCQkJaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKLQkJCQl7Ci0JCQkJCVhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLQkJCQkJeC5FcnJvckNvZGUgPSAxMDAxOwotCQkJCQl4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbjIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKLQkJCQkJeC5FcnJvckNvZGUgPSAyMDAyOwotCQkJCQl4LlN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQkJeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKLQkJCQkJdGhyb3cgeDsKLQkJCQl9Ci0KLQkJCQlYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwotCQkJCXJlc3VsdC5TdHJpbmdfdGhpbmcgPSBhcmcxOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RTdG9wKCkKLQkJCXsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJewotCQkJCQlzZXJ2ZXIuU3RvcCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgYXJnKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0T25ld2F5KCIgKyBhcmcgKyAiKSwgc2xlZXBpbmcuLi4iKTsKLQkJCQlTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOwotCQkJfQotCi0JCX0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOwotCQkJCWludCBwb3J0ID0gOTA5MDsKLQkJCQlpZiAoYXJncy5MZW5ndGggPiAwKQotCQkJCXsKLQkJCQkJcG9ydCA9IGludC5QYXJzZShhcmdzWzBdKTsKLQotCQkJCQlpZiAoYXJncy5MZW5ndGggPiAxKQotCQkJCQl7Ci0JCQkJCQlib29sLlRyeVBhcnNlKGFyZ3NbMV0sIG91dCB1c2VCdWZmZXJlZFNvY2tldHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gUHJvY2Vzc29yCi0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQlUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKLQotCQkJCS8vIFRyYW5zcG9ydAotCQkJCVRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7Ci0KLQkJCQlUU2VydmVyIHNlcnZlckVuZ2luZTsKLQotCQkJCS8vIFNpbXBsZSBTZXJ2ZXIKLQkJCQlzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0KTsKLQotCQkJCS8vIFRocmVhZFBvb2wgU2VydmVyCi0JCQkJLy8gc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0JCQkJLy8gVGhyZWFkZWQgU2VydmVyCi0JCQkJLy8gc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0KTsKLQotCQkJCXRlc3RIYW5kbGVyLnNlcnZlciA9IHNlcnZlckVuZ2luZTsKLQotCQkJCS8vIFJ1biBpdAotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIHBvcnQgKyAodXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKyAiLi4uIik7Ci0JCQkJc2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlDb25zb2xlLkVycm9yLldyaXRlKHgpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1NTgzYS4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+Ci0gICAgPFByb2plY3RHdWlkPns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9PC9Qcm9qZWN0R3VpZD4KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+Ci0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgotICAgIDxSb290TmFtZXNwYWNlPlRocmlmdFRlc3Q8L1Jvb3ROYW1lc3BhY2U+Ci0gICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRUZXN0PC9Bc3NlbWJseU5hbWU+Ci0gICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KLSAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+Ci0gICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+Ci0gICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+Ci0gICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+Ci0gICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KLSAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+Ci0gICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KLSAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+Ci0gICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KLSAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+Ci0gICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgotICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+Ci0gICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+Ci0gICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+Ci0gICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgotICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+Ci0gICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+Ci0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgotICA8L1RhcmdldD4KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIC0tPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCi1kZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKLVNFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKLVNFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXFRocmlmdFRlc3QudGhyaWZ0Ci1mb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKLWZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKLSIkKFByb2plY3REaXIpXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQotJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXGJpblxEZWJ1Z1xUaHJpZnQuZGxsIjwvUHJlQnVpbGRFdmVudD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaCBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvbWFrZXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ODBkZTguLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBjc2hhcnAgLW8gLiAuLi8uLi9UaHJpZnRUZXN0LnRocmlmdAotZ21jcyAvdDpsaWJyYXJ5IC9vdXQ6Li9UaHJpZnRJbXBsLmRsbCAvcmVjdXJzZTouL2dlbi1jc2hhcnAvKiAvcmVmZXJlbmNlOi4uLy4uLy4uL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbApkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L01ha2VmaWxlLmFtIGIvdGVzdC9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTBlYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0OiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3B1Yi1nZXQtZ2VuOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydAorCWNkIGdlbi1kYXJ0L3RocmlmdF90ZXN0OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0OiBwdWItZ2V0LWdlbgorCWNkIHRlc3RfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitzdHViczogZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQgcHViLWdldAorCitwcmVjcm9zczogc3R1YnMKKworY2hlY2s6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1kYXJ0IHRlc3RfY2xpZW50Ly5wdWIKKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQorCitjbGllbnQ6IHN0dWJzCisJJHtEQVJUfSB0ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4NDRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwzMzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIGFzIGh0dHA7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0X3Rlc3QvdGhyaWZ0X3Rlc3QuZGFydCc7CisKK2NvbnN0IFRFU1RfQkFTRVRZUEVTID0gMTsgLy8gMDAwMCAwMDAxCitjb25zdCBURVNUX1NUUlVDVFMgPSAyOyAvLyAwMDAwIDAwMTAKK2NvbnN0IFRFU1RfQ09OVEFJTkVSUyA9IDQ7IC8vIDAwMDAgMDEwMAorY29uc3QgVEVTVF9FWENFUFRJT05TID0gODsgLy8gMDAwMCAxMDAwCitjb25zdCBURVNUX1VOS05PV04gPSA2NDsgLy8gMDEwMCAwMDAwIChGYWlsZWQgdG8gcHJlcGFyZSBlbnZpcm9uZW10IGV0Yy4pCitjb25zdCBURVNUX1RJTUVPVVQgPSAxMjg7IC8vIDEwMDAgMDAwMAorY29uc3QgVEVTVF9OT1RVU0VEID0gNDg7IC8vIDAwMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKKwordHlwZWRlZiBGdXR1cmUgRnV0dXJlRnVuY3Rpb24oKTsKKworY2xhc3MgVFRlc3QgeworICBmaW5hbCBpbnQgZXJyb3JDb2RlOworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgRnV0dXJlRnVuY3Rpb24gZnVuYzsKKworICBUVGVzdCh0aGlzLmVycm9yQ29kZSwgdGhpcy5uYW1lLCB0aGlzLmZ1bmMpOworfQorCitjbGFzcyBUVGVzdEVycm9yIGV4dGVuZHMgRXJyb3IgeworICBmaW5hbCBhY3R1YWw7CisgIGZpbmFsIGV4cGVjdGVkOworCisgIFRUZXN0RXJyb3IodGhpcy5hY3R1YWwsIHRoaXMuZXhwZWN0ZWQpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICckYWN0dWFsICE9ICRleHBlY3RlZCc7Cit9CisKK0xpc3Q8VFRlc3Q+IF90ZXN0czsKK1RocmlmdFRlc3RDbGllbnQgY2xpZW50OworYm9vbCB2ZXJib3NlOworCisvLy8gQWRhcHRlZCBmcm9tIFRlc3RDbGllbnQucGhwCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIEFyZ1Jlc3VsdHMgcmVzdWx0cyA9IF9wYXJzZUFyZ3MoYXJncyk7CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfQorCisgIHZlcmJvc2UgPSByZXN1bHRzWyd2ZXJib3NlJ10gPT0gdHJ1ZTsKKworICBhd2FpdCBfaW5pdFRlc3RDbGllbnQoCisgICAgICBob3N0OiByZXN1bHRzWydob3N0J10sCisgICAgICBwb3J0OiBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKSwKKyAgICAgIHRyYW5zcG9ydFR5cGU6IHJlc3VsdHNbJ3RyYW5zcG9ydCddLAorICAgICAgcHJvdG9jb2xUeXBlOiByZXN1bHRzWydwcm90b2NvbCddKS5jYXRjaEVycm9yKChlKSB7CisgICAgc3Rkb3V0LndyaXRlbG4oJ0Vycm9yOicpOworICAgIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgIGlmIChlIGlzIEVycm9yKSB7CisgICAgICBzdGRvdXQud3JpdGVsbignJHtlLnN0YWNrVHJhY2V9Jyk7CisgICAgfQorICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfSk7CisKKyAgLy8gcnVuIHRlc3RzCisgIF90ZXN0cyA9IF9jcmVhdGVUZXN0cygpOworCisgIGludCByZXN1bHQgPSAwOworCisgIGZvciAoVFRlc3QgdGVzdCBpbiBfdGVzdHMpIHsKKyAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlKCcke3Rlc3QubmFtZX0uLi4gJyk7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IHRlc3QuZnVuYygpOworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCdzdWNjZXNzIScpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGVsbignJGUnKTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCB8IHRlc3QuZXJyb3JDb2RlOworICAgIH0KKyAgfQorCisgIGV4aXQocmVzdWx0KTsKK30KKworQXJnUmVzdWx0cyBfcGFyc2VBcmdzKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ2hvc3QnLCBkZWZhdWx0c1RvOiAnbG9jYWxob3N0JywgaGVscDogJ1RoZSBzZXJ2ZXIgaG9zdCcpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gY29ubmVjdCB0bycpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0cmFuc3BvcnQnLAorICAgICAgZGVmYXVsdHNUbzogJ2J1ZmZlcmVkJywKKyAgICAgIGFsbG93ZWQ6IFsnYnVmZmVyZWQnLCAnZnJhbWVkJywgJ2h0dHAnXSwKKyAgICAgIGhlbHA6ICdUaGUgdHJhbnNwb3J0IG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2J1ZmZlcmVkJzogJ1RCdWZmZXJlZFRyYW5zcG9ydCcsCisgICAgICAgICdmcmFtZWQnOiAnVEZyYW1lZFRyYW5zcG9ydCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkT3B0aW9uKCdwcm90b2NvbCcsCisgICAgICBkZWZhdWx0c1RvOiAnYmluYXJ5JywKKyAgICAgIGFsbG93ZWQ6IFsnYmluYXJ5JywgJ2NvbXBhY3QnLCAnanNvbiddLAorICAgICAgaGVscDogJ1RoZSBwcm90b2NvbCBuYW1lJywKKyAgICAgIGFsbG93ZWRIZWxwOiB7CisgICAgICAgICdiaW5hcnknOiAnVEJpbmFyeVByb3RvY29sJywKKyAgICAgICAgJ2NvbXBhY3QnOiAnVENvbXBhY3RQcm90b2NvbCcsCisgICAgICAgICdqc29uJzogJ1RKc29uUHJvdG9jb2wnCisgICAgICB9KTsKKyAgcGFyc2VyLmFkZEZsYWcoJ3ZlcmJvc2UnLCBkZWZhdWx0c1RvOiBmYWxzZSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBzdGRvdXQud3JpdGVsbignJGVcbicpOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgc3Rkb3V0LndyaXRlKHBhcnNlci51c2FnZSk7CisKKyAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK1RQcm90b2NvbEZhY3RvcnkgZ2V0UHJvdG9jb2xGYWN0b3J5KFN0cmluZyBwcm90b2NvbFR5cGUpIHsKKyAgaWYgKHByb3RvY29sVHlwZSA9PSAnYmluYXJ5JykgeworICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAnY29tcGFjdCcpIHsKKyAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdqc29uJykgeworICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbEZhY3RvcnkoKTsKKyAgfQorCisgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHByb3RvY29sVHlwZSk7Cit9CisKK0Z1dHVyZSBfaW5pdFRlc3RDbGllbnQoCisgICAge1N0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHRyYW5zcG9ydFR5cGUsIFN0cmluZyBwcm90b2NvbFR5cGV9KSBhc3luYyB7CisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICB2YXIgcHJvdG9jb2xGYWN0b3J5ID0gZ2V0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sVHlwZSk7CisKKyAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2h0dHAnKSB7CisgICAgdmFyIGh0dHBDbGllbnQgPSBuZXcgaHR0cC5JT0NsaWVudCgpOworICAgIHZhciB1cmkgPSBVcmkucGFyc2UoJ2h0dHA6Ly8kaG9zdDokcG9ydCcpOworICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcodXJpLCB7fSk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGh0dHBDbGllbnQsIGNvbmZpZyk7CisgIH0gZWxzZSB7CisgICAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgIHRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KG5ldyBUVGNwU29ja2V0KHNvY2tldCkpOworICAgIGlmICh0cmFuc3BvcnRUeXBlID09ICdmcmFtZWQnKSB7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgIH0KKyAgfQorCisgIHZhciBwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKK30KKworTGlzdDxUVGVzdD4gX2NyZWF0ZVRlc3RzKCkgeworICBMaXN0PFRUZXN0PiB0ZXN0cyA9IFtdOworCisgIHZhciB4dHJ1Y3QgPSBuZXcgWHRydWN0KCkKKyAgICAuLnN0cmluZ190aGluZyA9ICdaZXJvJworICAgIC4uYnl0ZV90aGluZyA9IDEKKyAgICAuLmkzMl90aGluZyA9IC0zCisgICAgLi5pNjRfdGhpbmcgPSAtNTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFZvaWQnLCAoKSBhc3luYyB7CisgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkKCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFN0cmluZycsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAnVGVzdCc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Qm9vbCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSB0cnVlOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJvb2woaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCeXRlJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDY0OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJ5dGUoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RJMzInLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMjE0NzQ4MzY0NzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJMzIoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RJNjQnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjQoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3REb3VibGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMy4xNDE1OTI2OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJpbmFyeScsICgpIGFzeW5jIHsKKyAgICB2YXIgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisgICAgdmFyIGlucHV0ID0gdXRmOENvZGVjLmVuY29kZSgnZm9vJyk7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0QmluYXJ5KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RTdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U3RydWN0KHh0cnVjdCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJHh0cnVjdCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgeHRydWN0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE5lc3QnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFh0cnVjdDIoKQorICAgICAgLi5ieXRlX3RoaW5nID0gMQorICAgICAgLi5zdHJ1Y3RfdGhpbmcgPSB4dHJ1Y3QKKyAgICAgIC4uaTMyX3RoaW5nID0gLTM7CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3ROZXN0KGlucHV0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckaW5wdXQnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBpbnQ+IGlucHV0ID0gezE6IC0xMCwgMjogLTksIDM6IC04LCA0OiAtNywgNTogLTZ9OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TWFwKGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBNYXBFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFNldCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgU2V0PGludD4uZnJvbShbLTIsIC0xLCAwLCAxLCAyXSk7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U2V0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBTZXRFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdExpc3QnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gWy0yLCAtMSwgMCwgMSwgMl07CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTGlzdEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0RW51bScsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0VHlwZWRlZicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzMDk4NTgyMzUwODI1MjM7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0VHlwZWRlZihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNYXBNYXAnLCAoKSBhc3luYyB7CisgICAgTWFwPGludCwgTWFwPGludCwgaW50Pj4gcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5IHx8IHJlc3VsdFtyZXN1bHQua2V5cy5maXJzdF0uaXNFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCAnTWFwPGludCwgTWFwPGludCwgaW50Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RJbnNhbml0eScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICBpbnB1dC51c2VyTWFwID0ge051bWJlcnouRklWRTogNTAwMH07CisgICAgaW5wdXQueHRydWN0cyA9IFt4dHJ1Y3RdOworCisgICAgTWFwPGludCwgTWFwPGludCwgSW5zYW5pdHk+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEluc2FuaXR5KGlucHV0KTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+Jyk7CisgICAgfQorICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TXVsdGknLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFh0cnVjdCgpCisgICAgICAuLnN0cmluZ190aGluZyA9ICdIZWxsbzInCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxMjMKKyAgICAgIC4uaTMyX3RoaW5nID0gNDU2CisgICAgICAuLmk2NF90aGluZyA9IDc4OTsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE11bHRpKGlucHV0LmJ5dGVfdGhpbmcsIGlucHV0LmkzMl90aGluZywKKyAgICAgICAgaW5wdXQuaTY0X3RoaW5nLCB7MTogJ29uZSd9LCBOdW1iZXJ6LkVJR0hULCA1Njc4KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckaW5wdXQnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9FWENFUFRJT05TLCAndGVzdEV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgfSBvbiBYY2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRocm93IG5ldyBUVGVzdEVycm9yKG51bGwsICdYY2VwdGlvbicpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0TXVsdGlFeGNlcHRpb24nLCAoKSBhc3luYyB7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdmb28nKTsKKyAgICB9IG9uIFhjZXB0aW9uMiBjYXRjaCAoXykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRocm93IG5ldyBUVGVzdEVycm9yKG51bGwsICdYY2VwdGlvbjInKTsKKyAgfSkpOworCisgIHJldHVybiB0ZXN0czsKK30KKworRnV0dXJlIF90ZXN0RW51bShpbnQgaW5wdXQpIGFzeW5jIHsKKyAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bShpbnB1dCk7CisgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbCBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2NDJmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnRfdGVzdF9jbGllbnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBjbGllbnQgaW50ZWdyYXRpb24gdGVzdCBmb3IgdGhlIERhcnQgVGhyaWZ0IGxpYnJhcnkKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogXjAuMTMuMAorICBodHRwOiBeMC4xMS4wCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0aHJpZnRfdGVzdDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90aHJpZnRfdGVzdAorCitkZXZfZGVwZW5kZW5jaWVzOgorICB0ZXN0OiAiXjAuMTIuMCIKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL01ha2VmaWxlIGIvdGVzdC9lcmwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjYwMzcuLjAwMDAwMDAKLS0tIGEvdGVzdC9lcmwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotR0VORElSPWdlbgotR0VOX0lOQ0xVREVESVI9JChHRU5ESVIpL2luY2x1ZGUKLUdFTl9TUkNESVI9JChHRU5ESVIpL3NyYwotR0VOX1RBUkdFVERJUj0kKEdFTkRJUikvZWJpbgotCi1JTkNMVURFRElSPWluY2x1ZGUKLVRBUkdFVERJUj1lYmluCi1TUkNESVI9c3JjCi0KLUFMTF9JTkNMVURFRElSPSQoR0VOX0lOQ0xVREVESVIpICQoSU5DTFVERURJUikgLi4vLi4vbGliL2VybC9pbmNsdWRlCi1JTkNMVURFRkxBR1M9JChwYXRzdWJzdCAlLC1JJSwgJHtBTExfSU5DTFVERURJUn0pCi0KLU1PRFVMRVMgPSBzdHJlc3Nfc2VydmVyIHRlc3Rfc2VydmVyIHRlc3RfZGlza2xvZyB0ZXN0X21lbWJ1ZmZlciB0ZXN0X3RldGhlcgotCi1JTkNMVURFUyA9IAotVEFSR0VUUyA9ICQocGF0c3Vic3QgJSwke1RBUkdFVERJUn0vJS5iZWFtLCR7TU9EVUxFU30pCi1IRUFERVJTID0gJChwYXRzdWJzdCAlLCR7SU5DTFVERURJUn0vJS5ocmwsJHtJTkNMVURFU30pCi0KLWFsbDogJHtHRU5fVEFSR0VURElSfS8gJHtUQVJHRVRTfQotCi1URVNUX1JQQ0ZJTEUgPSAuLi9UaHJpZnRUZXN0LnRocmlmdAotU1RSRVNTX1JQQ0ZJTEUgPSAuLi9TdHJlc3NUZXN0LnRocmlmdAotVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotCi0ke0dFTkRJUn0vOiAke1JQQ0ZJTEV9Ci0Jcm0gLXJmICR7R0VORElSfQotCSR7VEhSSUZUfSAtLWdlbiBlcmwgJHtURVNUX1JQQ0ZJTEV9Ci0JJHtUSFJJRlR9IC0tZ2VuIGVybCAke1NUUkVTU19SUENGSUxFfQotCW1rZGlyIC1wICR7R0VOX0lOQ0xVREVESVJ9Ci0JbWtkaXIgLXAgJHtHRU5fU1JDRElSfQotCW1rZGlyIC1wICR7R0VOX1RBUkdFVERJUn0KLQltdiAtdCAke0dFTl9JTkNMVURFRElSfSBnZW4tZXJsLyouaHJsCi0JbXYgLXQgJHtHRU5fU1JDRElSfSBnZW4tZXJsLyouZXJsCi0Jcm0gLXJmIGdlbi1lcmwKLQotJHtHRU5fVEFSR0VURElSfS86ICR7R0VORElSfS8KLQlybSAtcmYgJHtHRU5fVEFSR0VURElSfQotCW1rZGlyIC1wICR7R0VOX1RBUkdFVERJUn0KLQllcmxjICR7SU5DTFVERUZMQUdTfSAtbyAke0dFTl9UQVJHRVRESVJ9ICR7R0VOX1NSQ0RJUn0vKi5lcmwKLQotJChUQVJHRVRTKTogJHtUQVJHRVRESVJ9LyUuYmVhbTogJHtTUkNESVJ9LyUuZXJsICR7R0VOX0lOQ0xVREVESVJ9LyAke0hFQURFUlN9Ci0JbWtkaXIgLXAgJHtUQVJHRVRESVJ9Ci0JZXJsYyAke0lOQ0xVREVGTEFHU30gLW8gJHtUQVJHRVRESVJ9ICQ8Ci0KLWNsZWFuOgotCXJtIC1mICR7VEFSR0VURElSfS8qLmJlYW0KLQlybSAtcmYgJHtHRU5ESVJ9CmRpZmYgLS1naXQgYS90ZXN0L2VybC9NYWtlZmlsZS5hbSBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjVlODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCAuLi8qLnRocmlmdCkKKworaWYgRVJMQU5HX09UUDE2CitFUkxfRkxBRyA9IGVybDpvdHAxNgorZWxzZQorRVJMX0ZMQUcgPSBlcmwKK2VuZGlmCisjIG1ha2Ugc3VyZSBUaHJpZnRUZXN0LnRocmlmdCBpcyBnZW5lcmF0ZWQgbGFzdCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyICoudGhyaWZ0IGZpbGVzCisuZ2VuZXJhdGVkOiAkKFRIUklGVF9GSUxFUykKKwlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCisJICAkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjICQkZiA7IFwKKwlkb25lIDsgXAorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyBzcmMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwl0b3VjaCAuZ2VuZXJhdGVkCisKK3ByZWNyb3NzOiAuZ2VuZXJhdGVkCisJJChSRUJBUikgY29tcGlsZQorCitjbGVhbjoKKwlybSAtZiAuZ2VuZXJhdGVkCisJcm0gLXJmIHNyYy9nZW4tZXJsCisJJChSRUJBUikgY2xlYW4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWEwNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCkBAIC0wLDAgKzEsNiBAQAore3N1Yl9kaXJzLCBbIi4uLy4uL2xpYi9lcmwiXX0uCisKK3tlcmxfb3B0cywgWworICBkZWJ1Z19pbmZvLAorICB7aSwgIi4uLy4uL2xpYi9lcmwvaW5jbHVkZSJ9CitdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWQ1OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCkBAIC0wLDAgKzEsMTc0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X2NsaWVudCkuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCisKKy1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAorICAgICAgICAgICAgICAgICAgY2xpZW50X29wdHMgPSBbXX0pLgorCitwYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCitwYXJzZV9hcmdzKFtdLCBPcHRzKSAtPgorICBPcHRzOworcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgorICAgIE5ld09wdHMgPQorICAgICAgICBjYXNlIEhlYWQgb2YKKyAgICAgICAgICAgICItLXBvcnQ9IiArKyBQb3J0IC0+CisgICAgICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9faW50ZWdlcihQb3J0KSBvZgorICAgICAgICAgICAgICAgICAge0ludFBvcnQsX30gd2hlbiBpc19pbnRlZ2VyKEludFBvcnQpIC0+CisgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3twb3J0ID0gSW50UG9ydH07CisgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXRyYW5zcG9ydD0iICsrIFRyYW5zIC0+CisgICAgICAgICAgICAgICAgJSBUT0RPOiBFbmFibGUgQnVmZmVyZWQgYW5kIEhUVFAgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgY2FzZSBUcmFucyBvZgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVkIiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tmcmFtZWQsIHRydWV9IHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXX07CisgICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tc3NsIiAtPgorICAgICAgICAgICAgICAgIHNzbDpzdGFydCgpLAorICAgICAgICAgICAgICAgIFNzbE9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICB7c3Nsb3B0aW9ucywgWworICAgICAgICAgICAgICAgICAgICAgICAge2NhY2VydGZpbGUsICIuLi9rZXlzL0NBLnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9jbGllbnQucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7a2V5ZmlsZSwgIi4uL2tleXMvY2xpZW50LmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9XX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+IHN0YXJ0KGluaXQ6Z2V0X3BsYWluX2FyZ3VtZW50cygpKS4KK3N0YXJ0KEFyZ3MpIC0+CisgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBjbGllbnRfb3B0cyA9IENsaWVudE9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoCisgICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdF90ZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCisKKyAgRGVtb1h0cnVjdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3sKKyAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZyA9IDw8Ilplcm8iPj4sCisgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMSwKKyAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDkxMjgzNjEsCisgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKKworICBEZW1vTmVzdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0Mid7CisgICAgYnl0ZV90aGluZyA9IDcsCisgICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKKyAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKKyAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAorICAgICUgb3B0aW9uYWwKKyAgICBpMzJfdGhpbmcgPSAyfSwKKworICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPworICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAorICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKKworICBEZW1vSW5zYW5lID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7CisgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRklWRSwgNTAwMH1dKSwKKyAgICB4dHJ1Y3RzID0gWyMndGhyaWZ0LnRlc3QuWHRydWN0J3sgc3RyaW5nX3RoaW5nID0gPDwiVHJ1Y2siPj4sIGJ5dGVfdGhpbmcgPSA4LCBpMzJfdGhpbmcgPSA4LCBpNjRfdGhpbmcgPSA4fV19LAorCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFZvaWQiKSwKKyAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKKworICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJpbmciKSwKKyAge0NsaWVudDAyLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAxLCB0ZXN0U3RyaW5nLCBbIlRlc3QiXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cmluZyIpLAorICB7Q2xpZW50MDMsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDIsIHRlc3RTdHJpbmcsIFs8PCJUZXN0Ij4+XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEJ5dGUiKSwKKyAge0NsaWVudDA0LCB7b2ssIDYzfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAzLCB0ZXN0Qnl0ZSwgWzYzXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEkzMiIpLAorICB7Q2xpZW50MDUsIHtvaywgLTF9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDQsIHRlc3RJMzIsIFstMV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJMzIiKSwKKyAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJNjQiKSwKKyAge0NsaWVudDA3LCB7b2ssIC0zNDM1OTczODM2OH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA2LCB0ZXN0STY0LCBbLTM0MzU5NzM4MzY4XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdERvdWJsZSIpLAorICB7Q2xpZW50MDgsIHtvaywgLTUuMjA5ODUyM319ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDcsIHRlc3REb3VibGUsIFstNS4yMDk4NTIzXSksCisgICUlIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJ1Y3QiKSwKKyAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3ROZXN0IiksCisgIHtDbGllbnQxMCwge29rLCBEZW1vTmVzdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOSwgdGVzdE5lc3QsIFtEZW1vTmVzdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RNYXAiKSwKKyAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U2V0IiksCisgIHtDbGllbnQxMiwge29rLCBEZW1vU2V0fX0gICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMSwgdGVzdFNldCwgW0RlbW9TZXRdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TGlzdCIpLAorICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RW51bSIpLAorICB7Q2xpZW50MTQsIHtvaywgMX19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTMsIHRlc3RFbnVtLCBbP1RIUklGVF9URVNUX05VTUJFUlpfT05FXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFR5cGVkZWYiKSwKKyAge0NsaWVudDE1LCB7b2ssIDMwOTg1ODIzNTA4MjUyM319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE0LCB0ZXN0VHlwZWRlZiwgWzMwOTg1ODIzNTA4MjUyM10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJbnNhbml0eSIpLAorICB7Q2xpZW50MTYsIHtvaywgSW5zYW5lUmVzdWx0fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTUsIHRlc3RJbnNhbml0eSwgW0RlbW9JbnNhbmVdKSwKKyAgaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAorCisgIHtDbGllbnQxNywge29rLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiTWVzc2FnZSI+Pn19fSA9CisgICAgdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE2LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiU2FmZSIsICJNZXNzYWdlIl0pLAorCisgIENsaWVudDE4ID0KKyAgICB0cnkKKyAgICAgIHtDbGllbnRTMSwgUmVzdWx0MX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTcsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbiIsICJNZXNzYWdlIl0pLAorICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQxXSksCisgICAgICBDbGllbnRTMQorICAgIGNhdGNoCisgICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSA9IEV4blMxLAorICAgICAgICBDbGllbnRTMjsKKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAorICAgICAgICBDbGllbnRTMgorICAgIGVuZCwKKworICBDbGllbnQxOSA9CisgICAgdHJ5CisgICAgICB7Q2xpZW50UzMsIFJlc3VsdDJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE4LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24yIiwgIk1lc3NhZ2UiXSksCisgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDJdKSwKKyAgICAgIENsaWVudFMzCisgICAgY2F0Y2gKKyAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgX0V4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCisgICAgICAgIENsaWVudFM0OworICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBFeG5TMiA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3t9fX0gLT4KKyAgICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSA9IEV4blMyLAorICAgICAgICBDbGllbnRTNAorICAgIGVuZCwKKworICAlJSBTdGFydGVkID0gZXJsYW5nOm1vbm90b25pY190aW1lKG1pbGxpX3NlY29uZHMpLAorICB7XywgU3RhcnRTZWMsIFN0YXJ0VVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE9uZXdheSIpLAorICB7Q2xpZW50MjAsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOSwgdGVzdE9uZXdheSwgWzFdKSwKKyAge18sIEVuZFNlYywgRW5kVVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIEVsYXBzZWQgPSAoRW5kU2VjIC0gU3RhcnRTZWMpICogMTAwMCArIChFbmRVU2VjIC0gU3RhcnRVU2VjKSAvIDEwMDAsCisgIGlmCisgICAgRWxhcHNlZCA+IDEwMDAgLT4gZXhpdCgxKTsKKyAgICB0cnVlIC0+IHRydWUKKyAgZW5kLAorCisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MjApLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfZGlza2xvZy5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9kaXNrbG9nLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwYmU3Mi4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9kaXNrbG9nLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3RfZGlza2xvZykuCi0KLS1jb21waWxlKGV4cG9ydF9hbGwpLgotCi10KCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCi0gICAgICAgICAgdGVzdF9kaXNrbG9nLAotICAgICAgICAgIFt7ZmlsZSwgIi90bXAvdGVzdF9sb2cifSwKLSAgICAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgW10pLAotICAgIHtvaywgQ2xpZW50fSA9IHRocmlmdF9jbGllbnQ6c3RhcnRfbGluayhQcm90b2NvbEZhY3RvcnksIHRocmlmdFRlc3RfdGhyaWZ0KSwKLQotICAgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAotCi0gICAgJSBXZSBoYXZlIHRvIG1ha2Ugb25ld2F5IGNhbGxzIGludG8gdGhpcyBjbGllbnQgb25seSBzaW5jZSBvdGhlcndpc2UgaXQgd2lsbCB0cnkKLSAgICAlIHRvIHJlYWQgZnJvbSB0aGUgZGlza2xvZyBhbmQgZ28gYm9vbS4KLSAgICB7b2ssIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAotICAgIGlvOmZvcm1hdCgiQ2FsbCB3cml0dGVufm4iKSwKLQotICAgICUgVXNlIHRoZSBzZW5kX2NhbGwgbWV0aG9kIHRvIHdyaXRlIGEgbm9uLW9uZXdheSBjYWxsIGludG8gdGhlIGxvZwotICAgIG9rID0gdGhyaWZ0X2NsaWVudDpzZW5kX2NhbGwoQ2xpZW50LCB0ZXN0U3RyaW5nLCBbPDwiaGVsbG8gd29ybGQiPj5dKSwKLSAgICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKLQotICAgIG9rID0gdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQpLAotICAgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCi0KLSAgICBvay4KLQotCi0KLXRfYmFzZTY0KCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCi0gICAgICAgICAgdGVzdF9kaXNrbG9nLAotICAgICAgICAgIFt7ZmlsZSwgIi90bXAvdGVzdF9iNjRfbG9nIn0sCi0gICAgICAgICAgIHtzaXplLCB7MTAyNCoxMDI0LCAxMH19XSksCi0gICAge29rLCBCNjRGYWN0b3J5fSA9Ci0gICAgICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICB7b2ssIEJ1ZkZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoQjY0RmFjdG9yeSksCi0gICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZkZhY3RvcnksIFtdKSwKLSAgICB7b2ssIENsaWVudH0gPSB0aHJpZnRfY2xpZW50OnN0YXJ0X2xpbmsoUHJvdG9jb2xGYWN0b3J5LCB0aHJpZnRUZXN0X3RocmlmdCksCi0KLSAgICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKLQotICAgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlIGl0IHdpbGwgdHJ5Ci0gICAgJSB0byByZWFkIGZyb20gdGhlIGRpc2tsb2cgYW5kIGdvIGJvb20uCi0gICAge29rLCBva30gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50LCB0ZXN0T25ld2F5LCBbMTYjZGVhZGJlZWZdKSwKLSAgICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCi0KLSAgICAlIFVzZSB0aGUgc2VuZF9jYWxsIG1ldGhvZCB0byB3cml0ZSBhIG5vbi1vbmV3YXkgY2FsbCBpbnRvIHRoZSBsb2cKLSAgICBvayA9IHRocmlmdF9jbGllbnQ6c2VuZF9jYWxsKENsaWVudCwgdGVzdFN0cmluZywgWzw8ImhlbGxvIHdvcmxkIj4+XSksCi0gICAgaW86Zm9ybWF0KCJOb24tb25ld2F5IGNhbGwgc2VudH5uIiksCi0KLSAgICBvayA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50KSwKLSAgICBpbzpmb3JtYXQoIkNsaWVudCBjbG9zZWR+biIpLAotCi0gICAgb2suCi0gICAgCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9tZW1idWZmZXIuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfbWVtYnVmZmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMjNhMC4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9tZW1idWZmZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9tZW1idWZmZXIpLgotLWV4cG9ydChbdC8wXSkuCi0KLS1pbmNsdWRlKCJ0aHJpZnRUZXN0X3R5cGVzLmhybCIpLgotCi10ZXN0X2RhdGEoKSAtPgotICAgICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiZm9vYmFyIj4+LAotCSAgICBieXRlX3RoaW5nID0gMTIzLAotCSAgICBpMzJfdGhpbmcgPSAxMjM0NTY3LAotCSAgICBpNjRfdGhpbmcgPSAxMjM0NTY3ODkwMH0uCi0KLXQxKCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAgICB7b2ssIFByb3RvY29sfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gICAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbCwKLQkJCSAgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotCQkJCVRlc3REYXRhfSksCi0gICAge29rLCBSZXN1bHR9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wsCi0JCQkJCXtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0JykpfSwKLQkJCQkJJ3h0cnVjdCcpLAotCi0gICAgUmVzdWx0ID0gVGVzdERhdGEuCi0KLQotdDIoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICAgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICBUZXN0RGF0YSA9IHRlc3RfZGF0YSgpLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sLAotCQkJICAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0JCQkJVGVzdERhdGF9KSwKLSAgICB7b2ssIFJlc3VsdH0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbCwKLQkJCQkJe3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QzJykpfSwKLQkJCQkJJ3h0cnVjdDMnKSwKLQotICAgIFJlc3VsdCA9ICN4dHJ1Y3Qze3N0cmluZ190aGluZyA9IFRlc3REYXRhI3h0cnVjdC5zdHJpbmdfdGhpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHVuZGVmaW5lZCwKLSAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3QuaTMyX3RoaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IFRlc3REYXRhI3h0cnVjdC5pNjRfdGhpbmd9LgotCi0KLXQzKCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAgICB7b2ssIFByb3RvY29sfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gICAgVGVzdERhdGEgPSAjYm9vbHN7aW1fdHJ1ZSA9IHRydWUsIGltX2ZhbHNlID0gZmFsc2V9LAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sLAotCQkJICAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2Jvb2xzJykpfSwKLQkJCQlUZXN0RGF0YX0pLAotICAgIHtvaywgUmVzdWx0fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sLAotCQkJCQl7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2Jvb2xzJykpfSwKLQkJCQkJJ2Jvb2xzJyksCi0KLSAgICB0cnVlID0gVGVzdERhdGEjYm9vbHMuaW1fdHJ1ZSAgPTo9IFJlc3VsdCNib29scy5pbV90cnVlLAotICAgIHRydWUgPSBUZXN0RGF0YSNib29scy5pbV9mYWxzZSA9Oj0gUmVzdWx0I2Jvb2xzLmltX2ZhbHNlLgotCi0KLXQoKSAtPgotICAgIHQxKCksCi0gICAgdDIoKSwKLSAgICB0MygpLgotCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9zZXJ2ZXIuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3Rfc2VydmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0MzljYy4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9zZXJ2ZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3Rfc2VydmVyKS4KLQotLWV4cG9ydChbc3RhcnRfbGluay8xLCBoYW5kbGVfZnVuY3Rpb24vMl0pLgotCi0taW5jbHVkZSgidGhyaWZ0VGVzdF90eXBlcy5ocmwiKS4KLQotc3RhcnRfbGluayhQb3J0KSAtPgotICAgIHRocmlmdF9zZXJ2ZXI6c3RhcnRfbGluayhQb3J0LCB0aHJpZnRUZXN0X3RocmlmdCwgP01PRFVMRSkuCi0KLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RWb2lkLCB7fSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RWb2lkfm4iKSwKLSAgICBvazsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmcsIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmc6IH5wfm4iLCBbU10pLAotICAgIHtyZXBseSwgU307Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKLSAgICB7cmVwbHksIEk4fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKLSAgICB7cmVwbHksIEkzMn07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCi0gICAge3JlcGx5LCBJNjR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKLSAgICB7cmVwbHksIERvdWJsZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAotICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjeHRydWN0e3N0cmluZ190aGluZyA9IFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCi13aGVuIGlzX2JpbmFyeShTdHJpbmcpLAotICAgICBpc19pbnRlZ2VyKEJ5dGUpLAotICAgICBpc19pbnRlZ2VyKEkzMiksCi0gICAgIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKLSAgICB7cmVwbHksIFN0cnVjdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKLSAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsIHh0cnVjdDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWNvcmQoTmVzdCN4dHJ1Y3QyLnN0cnVjdF90aGluZywgeHRydWN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAotICAgIHtyZXBseSwgTmVzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKLSAgICB7cmVwbHksIE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KLSAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKLSAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKLSAgICB7cmVwbHksIFNldH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKLSAgICB7cmVwbHksIExpc3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCi0gICAge3JlcGx5LCBFbnVtfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAotICAgIHtyZXBseSwgVXNlcklEfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCi0KLSAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLSAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLQotICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKLSAgICB7cmVwbHksIE1hcE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCBpbnNhbml0eSkgLT4KLSAgICBIZWxsbyA9ICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCi0KLSAgICBHb29kYnllID0gI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKLSAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDR9LAotICAgIENyYXp5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRUlHSFQsIDh9XSksCi0gICAgICB4dHJ1Y3RzID0gW0dvb2RieWVdCi0gICAgICB9LAotCi0gICAgTG9vbmV5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRklWRSwgNX1dKSwKLSAgICAgIHh0cnVjdHMgPSBbSGVsbG9dCi0gICAgICB9LAotCi0gICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X1RXTywgQ3Jhenl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/dGhyaWZ0VGVzdF9USFJFRSwgQ3Jhenl9XSksCi0KLSAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X1NJWCwgTG9vbmV5fV0pLAotICAgIAotICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAotICAgIAotICAgIGlvOmZvcm1hdCgiUmV0dXJuID0gfnB+biIsIFtJbnNhbmVdKSwKLSAgICAKLSAgICB7cmVwbHksIEluc2FuZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQotICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCi0gICAgICAgaXNfaW50ZWdlcihBcmcxKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNCksCi0gICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgotCi0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAotICAgIHtyZXBseSwgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBBcmcwLAotICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBBcmcxLAotICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKLSAgICBjYXNlIFN0cmluZyBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9ue2Vycm9yQ29kZSA9IDEwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGlFeGNlcHRpb24sIHtBcmcwLCBBcmcxfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aUV4Y2VwdGlvbih+cCwgfnApfm4iLCBbQXJnMCwgQXJnMV0pLAotICAgIGNhc2UgQXJnMCBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9ue2Vycm9yQ29kZSA9IDEwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSk7Ci0gICAgICAgIDw8IlhjZXB0aW9uMiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9uMntlcnJvckNvZGUgPSAyMDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIHtyZXBseSwgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSBBcmcxfX0KLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0T25ld2F5LCB7U2Vjb25kc30pIC0+Ci0gICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAotICAgIG9rLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfdGV0aGVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RldGhlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTFhOWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9lcmwvc3JjL3Rlc3RfdGV0aGVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLSUlIFRlc3RzIHRoZSBiZWhhdmlvciBvZiBjbGllbnRzIGluIHRoZSBmYWNlIG9mIHRyYW5zcG9ydCBlcnJvcnMuCi0lJSBNYWtlcyBzdXJlIHN0YXJ0LCBzdGFydF9saW5rZWQsIGFuZCBzdGFydF90ZXRoZXJlZCB3b3JrIGFzIGV4cGVjdGVkLgotCi0tbW9kdWxlKHRlc3RfdGV0aGVyKS4KLQotLWNvbXBpbGUoZXhwb3J0X2FsbCkuCi0KLQotdCgpIC0+Ci0gICAgaW86Zm9ybWF0KCJCZWdpbm5pbmcgdHJhbnNwb3J0IGVycm9yIHRlc3Qufm4iKSwKLSAgICBQaWQxID0gZXJsYW5nOnNwYXduKD9NT0RVTEUsIHRfc3ViLCBbMl0pLAotICAgIHdhaXRfZm9yKFBpZDEpLAotICAgIGlvOmZvcm1hdCgiQmVnaW5uaW5nIHByb3RvY29sIGVycm9yIHRlc3Qufm4iKSwKLSAgICBQaWQyID0gZXJsYW5nOnNwYXduKD9NT0RVTEUsIHRfc3ViLCBbMjJdKSwKLSAgICB3YWl0X2ZvcihQaWQyKSwKLSAgICBvay4KLQotdF9zdWIoUG9ydCkgLT4KLSAgICBpbzpmb3JtYXQoIlN0YXJ0aW5nLn5uIiwgW10pLAotICAgIHJlZ2lzdGVyKHRlc3Rlciwgc2VsZigpKSwKLQotICAgIFBpZDEgPSBlcmxhbmc6c3Bhd24oP01PRFVMRSwgdGVzdF9zdGFydCwgW1BvcnRdKSwKLSAgICByZWNlaXZlIGFmdGVyIDIwMCAtPiBvayBlbmQsICAlIFdhaXQgZm9yIGNvbXBsZXRpb24uCi0gICAgY2FzZSBpc191cChQaWQxKSBvZgotICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIlBBU1MuICBVbmxpbmtlZCBvd25lciBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgVW5saW5rZWQgb3duZXIgaXMgZGVhZC5+biIpCi0gICAgZW5kLAotCi0gICAgUGlkMiA9IGVybGFuZzpzcGF3big/TU9EVUxFLCB0ZXN0X2xpbmtlZCwgW1BvcnRdKSwKLSAgICByZWNlaXZlIGFmdGVyIDIwMCAtPiBvayBlbmQsICAlIFdhaXQgZm9yIGNvbXBsZXRpb24uCi0gICAgY2FzZSBpc191cChQaWQyKSBvZgotICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBMaW5rZWQgb3duZXIgc3RpbGwgYWxpdmUufm4iKTsKLSAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIExpbmtlZCBvd25lciBpcyBkZWFkLn5uIikKLSAgICBlbmQsCi0KLSAgICBQaWQzID0gZXJsYW5nOnNwYXduKD9NT0RVTEUsIHRlc3RfdGV0aGVyZWQsIFtQb3J0XSksCi0gICAgcmVjZWl2ZSBhZnRlciAyMDAgLT4gb2sgZW5kLCAgJSBXYWl0IGZvciBjb21wbGV0aW9uLgotICAgIGNhc2UgaXNfdXAoUGlkMykgb2YKLSAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgVGV0aGVyZWQgb3duZXIgc3RpbGwgYWxpdmUufm4iKTsKLSAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIFRldGhlcmVkIG93bmVyIGlzIGRlYWQufm4iKQotICAgIGVuZCwKLQotICAgIGNoZWNrX2V4dHJhcygzKS4KLQotaXNfdXAoUGlkKSAtPgotICAgIE1vbml0b3JSZWYgPSBlcmxhbmc6bW9uaXRvcihwcm9jZXNzLCBQaWQpLAotICAgIHJlY2VpdmUKLSAgICAgICAgeydET1dOJywgTW9uaXRvclJlZiwgcHJvY2VzcywgUGlkLCBfSW5mb30gLT4KLSAgICAgICAgICAgIGZhbHNlCi0gICAgYWZ0ZXIKLSAgICAgICAgNTAgLT4KLSAgICAgICAgICAgIGVybGFuZzpkZW1vbml0b3IoTW9uaXRvclJlZiksCi0gICAgICAgICAgICB0cnVlCi0gICAgZW5kLgotCi13YWl0X2ZvcihQaWQpIC0+Ci0gICAgTW9uaXRvclJlZiA9IGVybGFuZzptb25pdG9yKHByb2Nlc3MsIFBpZCksCi0gICAgcmVjZWl2ZQotICAgICAgICB7J0RPV04nLCBNb25pdG9yUmVmLCBwcm9jZXNzLCBQaWQsIF9JbmZvfSAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQuCi0KLWNoZWNrX2V4dHJhcygwKSAtPiBvazsKLWNoZWNrX2V4dHJhcyhOKSAtPgotICAgIHJlY2VpdmUKLSAgICAgICAge2NsaWVudCwgVHlwZSwgUGlkfSAtPgotICAgICAgICAgICAgY2FzZSB7VHlwZSwgaXNfdXAoUGlkKX0gb2YKLSAgICAgICAgICAgICAgICB7dW5saW5rZWQsIHRydWV9IC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIFVubGlua2VkIGNsaWVudCBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICAgICAgICAgIHt1bmxpbmtlZCwgZmFsc2V9IC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIFVubGlua2VkIGNsaWVudCBkZWFkLn5uIik7Ci0gICAgICAgICAgICAgICAge2xpbmtlZCwgdHJ1ZX0gLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgTGlua2VkIGNsaWVudCBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICAgICAgICAgIHtsaW5rZWQsIGZhbHNlfSAtPgotICAgICAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIlBBU1MuICBMaW5rZWQgY2xpZW50IGRlYWQufm4iKTsKLSAgICAgICAgICAgICAgICB7dGV0aGVyZWQsIHRydWV9IC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIFRldGhlcmVkIGNsaWVudCBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICAgICAgICAgIHt0ZXRoZXJlZCwgZmFsc2V9IC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIFRldGhlcmVkIGNsaWVudCBkZWFkLn5uIikKLSAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgIGNoZWNrX2V4dHJhcyhOLTEpCi0gICAgYWZ0ZXIKLSAgICAgICAgNTAwIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBFeHBlY3RlZCB+cCBtb3JlIGNsaWVudHMufm4iLCBbTl0pCi0gICAgZW5kLgotCi1tYWtlX3RocmlmdF9jbGllbnQoT3B0cykgLT4KLSAgICAgdGhyaWZ0X2NsaWVudDpzdGFydChmdW4oKS0+b2sgZW5kLCB0aHJpZnRUZXN0X3RocmlmdCwgT3B0cykuCi0KLW1ha2VfcHJvdG9jb2xfZmFjdG9yeShQb3J0KSAtPgotICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCi0gICAgICAgICAgIjEyNy4wLjAuMSIsIFBvcnQsIFtdKSwKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFtdKSwKLSAgICBQcm90b2NvbEZhY3RvcnkuCi0KLQotdGVzdF9zdGFydChQb3J0KSAtPgotICAgIHtvaywgQ2xpZW50MX0gPSBtYWtlX3RocmlmdF9jbGllbnQoW3tjb25uZWN0LCBmYWxzZX1dKSwKLSAgICB0ZXN0ZXIgISB7Y2xpZW50LCB1bmxpbmtlZCwgQ2xpZW50MX0sCi0gICAge29rLCBDbGllbnQyfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfV0pLAotICAgIGlvOmZvcm1hdCgiUEFTUy4gIFVubGlua2VkIGNsaWVudHMgY3JlYXRlZC5+biIpLAotICAgIHRyeQotICAgICAgICBnZW5fc2VydmVyOmNhbGwoQ2xpZW50Miwge2Nvbm5lY3QsIG1ha2VfcHJvdG9jb2xfZmFjdG9yeShQb3J0KX0pLAotICAgICAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgdGVzdFZvaWQsIFtdKSwKLSAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgVW5saW5rZWQgY2xpZW50IGNvbm5lY3RlZCBhbmQgY2FsbGVkLn5uIiwgW10pCi0gICAgY2F0Y2gKLSAgICAgICAgS2luZDpJbmZvIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIlBBU1MuICBDYXVnaHQgdW5saW5rZWQgZXJyb3IuICB+cDp+cH5uIiwgW0tpbmQsIEluZm9dKQotICAgIGVuZCwKLSAgICByZWNlaXZlIGFmdGVyIDEwMCAtPgotICAgICAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIlBBU1MuICBTdGlsbCBhbGl2ZSBhZnRlciB1bmxpbmtlZCBkZWF0aC5+biIpLAotICAgICAgICAgICAgICAgICAgICAlJSBIYW5nIGFyb3VuZCBhIGxpdHRsZSBsb25nZXIgc28gb3VyIHBhcmVudCBjYW4gdmVyaWZ5LgotICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGFmdGVyIDIwMCAtPiBvayBlbmQKLSAgICBlbmQsCi0gICAgJSUgRXhpdCBhYm5vcm1hbGx5IHRvIG5vdCBraWxsIG91ciB1bmxpbmtlZCBleHRyYSBjbGllbnQuCi0gICAgZXhpdChkaWUpLgotCi10ZXN0X2xpbmtlZChQb3J0KSAtPgotICAgIHtvaywgQ2xpZW50MX0gPSBtYWtlX3RocmlmdF9jbGllbnQoW3tjb25uZWN0LCBmYWxzZX0sIHttb25pdG9yLCBsaW5rfV0pLAotICAgIHRlc3RlciAhIHtjbGllbnQsIGxpbmtlZCwgQ2xpZW50MX0sCi0gICAge29rLCBDbGllbnQyfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfSwge21vbml0b3IsIGxpbmt9XSksCi0gICAgaW86Zm9ybWF0KCJQQVNTLiAgTGlua2VkIGNsaWVudHMgY3JlYXRlZC5+biIpLAotICAgIHRyeQotICAgICAgICBnZW5fc2VydmVyOmNhbGwoQ2xpZW50Miwge2Nvbm5lY3QsIG1ha2VfcHJvdG9jb2xfZmFjdG9yeShQb3J0KX0pLAotICAgICAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgdGVzdFZvaWQsIFtdKSwKLSAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgTGlua2VkIGNsaWVudCBjb25uZWN0ZWQgYW5kIGNhbGxlZC5+biIsIFtdKQotICAgIGNhdGNoCi0gICAgICAgIEtpbmQ6SW5mbyAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgQ2F1Z2h0IGxpbmtlZCBlcnJvci4gIH5wOn5wfm4iLCBbS2luZCwgSW5mb10pCi0gICAgZW5kLAotICAgIHJlY2VpdmUgYWZ0ZXIgMTAwIC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIFN0aWxsIGFsaXZlIGFmdGVyIGxpbmtlZCBkZWF0aC5+biIpLAotICAgICAgICAgICAgICAgICAgICAlIEhhbmcgYXJvdW5kIGEgbGl0dGxlIGxvbmdlciBzbyBvdXIgcGFyZW50IGNhbiB2ZXJpZnkuCi0gICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYWZ0ZXIgMjAwIC0+IG9rIGVuZAotICAgIGVuZCwKLSAgICAlJSBFeGl0IGFibm9ybWFsbHkgdG8ga2lsbCBvdXIgbGlua2VkIGV4dHJhIGNsaWVudC4KLSAgICAlJSBCdXQgd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLgotICAgIGV4aXQoZGllKS4KLQotdGVzdF90ZXRoZXJlZChQb3J0KSAtPgotICAgIHtvaywgQ2xpZW50MX0gPSBtYWtlX3RocmlmdF9jbGllbnQoW3tjb25uZWN0LCBmYWxzZX0sIHttb25pdG9yLCB0ZXRoZXJ9XSksCi0gICAgdGVzdGVyICEge2NsaWVudCwgdGV0aGVyZWQsIENsaWVudDF9LAotICAgIHtvaywgQ2xpZW50Mn0gPSBtYWtlX3RocmlmdF9jbGllbnQoW3tjb25uZWN0LCBmYWxzZX0sIHttb25pdG9yLCB0ZXRoZXJ9XSksCi0gICAgaW86Zm9ybWF0KCJQQVNTLiAgVGV0aGVyZWQgY2xpZW50cyBjcmVhdGVkLn5uIiksCi0gICAgdHJ5Ci0gICAgICAgIGdlbl9zZXJ2ZXI6Y2FsbChDbGllbnQyLCB7Y29ubmVjdCwgbWFrZV9wcm90b2NvbF9mYWN0b3J5KFBvcnQpfSksCi0gICAgICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCB0ZXN0Vm9pZCwgW10pLAotICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBUZXRoZXJlZCBjbGllbnQgY29ubmVjdGVkIGFuZCBjYWxsZWQufm4iLCBbXSkKLSAgICBjYXRjaAotICAgICAgICBLaW5kOkluZm8gLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIENhdWdodCB0ZXRoZXJlZCBlcnJvci4gIH5wOn5wfm4iLCBbS2luZCwgSW5mb10pCi0gICAgZW5kLAotICAgIHJlY2VpdmUgYWZ0ZXIgMTAwIC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIFN0aWxsIGFsaXZlIGFmdGVyIHRldGhlcmVkIGRlYXRoLn5uIiksCi0gICAgICAgICAgICAgICAgICAgICUgSGFuZyBhcm91bmQgYSBsaXR0bGUgbG9uZ2VyIHNvIG91ciBwYXJlbnQgY2FuIHZlcmlmeS4KLSAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBhZnRlciAyMDAgLT4gb2sgZW5kCi0gICAgZW5kLAotICAgICUlIEV4aXQgYWJub3JtYWxseSB0byBraWxsIG91ciB0ZXRoZXJlZCBleHRyYSBjbGllbnQuCi0gICAgZXhpdChkaWUpLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ4ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwKQEAgLTAsMCArMSwyMzMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NlcnZlcikuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzEsIHN0YXJ0X2xpbmsvMiwgaGFuZGxlX2Z1bmN0aW9uLzJdKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KKworLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCisgICAgICAgICAgICAgICAgICBzZXJ2ZXJfb3B0cyA9IFtdfSkuCisKK3BhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KK3BhcnNlX2FyZ3MoW10sIE9wdHMpIC0+CisgIE9wdHM7CitwYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+CisgICAgTmV3T3B0cyA9CisgICAgICAgIGNhc2UgSGVhZCBvZgorICAgICAgICAgICAgIi0tcG9ydD0iICsrIFBvcnQgLT4KKyAgICAgICAgICAgICAgICBjYXNlIHN0cmluZzp0b19pbnRlZ2VyKFBvcnQpIG9mCisgICAgICAgICAgICAgICAgICB7SW50UG9ydCxffSB3aGVuIGlzX2ludGVnZXIoSW50UG9ydCkgLT4KKyAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBJbnRQb3J0fTsKKyAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tdHJhbnNwb3J0PSIgKysgVHJhbnMgLT4KKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zIG9mCisgICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKKyAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS1zc2wiIC0+CisgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCisgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9zZXJ2ZXIucGVtIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICx7a2V5ZmlsZSwgICIuLi9rZXlzL3NlcnZlci5rZXkifQorICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3NzbHRyYW5zcG9ydCwgdHJ1ZX0gfCBbU3NsT3B0aW9ucyB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c11dfTsKKyAgICAgICAgICAgICItLXByb3RvY29sPSIgKysgUHJvdG8gLT4KKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3Byb3RvY29sLCBsaXN0X3RvX2F0b20oUHJvdG8pfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICBlbmQsCisgICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KKworc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCitzdGFydChBcmdzKSAtPgorICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgorCitzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+CisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdF90ZXN0X3RocmlmdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0LCBQb3J0fV0gKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPcHRzKS4KKworCitoYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAorICAgIG9rOworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCisgICAge3JlcGx5LCBTfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCb29sLCB7Qn0pIHdoZW4gaXNfYm9vbGVhbihCKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJvb2w6IH5wfm4iLCBbQl0pLAorICAgIHtyZXBseSwgQn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKKyAgICB7cmVwbHksIEk4fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKKyAgICB7cmVwbHksIEkzMn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCisgICAge3JlcGx5LCBJNjR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKKyAgICB7cmVwbHksIERvdWJsZX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0QmluYXJ5LCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0QmluYXJ5OiB+cH5uIiwgW1NdKSwKKyAgICB7cmVwbHksIFN9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cnVjdCwKKyAgICAgICAgICAgICAgICB7U3RydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCit3aGVuIGlzX2JpbmFyeShTdHJpbmcpLAorICAgICBpc19pbnRlZ2VyKEJ5dGUpLAorICAgICBpc19pbnRlZ2VyKEkzMiksCisgICAgIGlzX2ludGVnZXIoSTY0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKKyAgICB7cmVwbHksIFN0cnVjdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKKyAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlY29yZChOZXN0Iyd0aHJpZnQudGVzdC5YdHJ1Y3QyJy5zdHJ1Y3RfdGhpbmcsICd0aHJpZnQudGVzdC5YdHJ1Y3QnKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAorICAgIHtyZXBseSwgTmVzdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nTWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmdNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KKyAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKKyAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKKyAgICB7cmVwbHksIFNldH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKKyAgICB7cmVwbHksIExpc3R9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCisgICAge3JlcGx5LCBFbnVtfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAorICAgIHtyZXBseSwgVXNlcklEfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCisKKyAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKyAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKworICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKKyAgICB7cmVwbHksIE1hcE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknKSAtPgorICAgIEhlbGxvID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDJ9LAorCisgICAgR29vZGJ5ZSA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCisgICAgQ3JhenkgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3sKKyAgICAgICAgICAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0VJR0hULCA4fV0pLAorICAgICAgICAgICAgICAgeHRydWN0cyA9IFtHb29kYnllXQorICAgICAgICAgICAgICB9LAorCisgICAgTG9vbmV5ID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7fSwKKworICAgIEZpcnN0TWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9UV08sIEluc2FuaXR5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7P1RIUklGVF9URVNUX05VTUJFUlpfVEhSRUUsIEluc2FuaXR5fV0pLAorCisgICAgU2Vjb25kTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9TSVgsIExvb25leX1dKSwKKworICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAorCisgICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAorCisgICAge3JlcGx5LCBJbnNhbmV9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpLCBBcmdzID0ge0FyZzAsIEFyZzEsIEFyZzIsIF9BcmczLCBBcmc0LCBBcmc1fSkKKyAgd2hlbiBpc19pbnRlZ2VyKEFyZzApLAorICAgICAgIGlzX2ludGVnZXIoQXJnMSksCisgICAgICAgaXNfaW50ZWdlcihBcmcyKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzQpLAorICAgICAgIGlzX2ludGVnZXIoQXJnNSkgLT4KKworICAgIGlvOmZvcm1hdCgidGVzdE11bHRpKH5wKX5uIiwgW0FyZ3NdKSwKKyAgICB7cmVwbHksICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gQXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKKyAgICBjYXNlIFN0cmluZyBvZgorICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nfSk7CisgICAgICAgIDw8IlRFeGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KHs/VEFwcGxpY2F0aW9uRXhjZXB0aW9uX1N0cnVjdHVyZX0pOworICAgICAgICBfIC0+CisgICAgICAgICAgICBvaworICAgIGVuZDsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aUV4Y2VwdGlvbiwge0FyZzAsIEFyZzF9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE11bHRpRXhjZXB0aW9uKH5wLCB+cCl+biIsIFtBcmcwLCBBcmcxXSksCisgICAgY2FzZSBBcmcwIG9mCisgICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0pOworICAgICAgICA8PCJYY2VwdGlvbjIiPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19KTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAge3JlcGx5LCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gQXJnMX19CisgICAgZW5kOworCitoYW5kbGVfZnVuY3Rpb24odGVzdE9uZXdheSwge1NlY29uZHN9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE9uZXdheTogfnB+biIsIFtTZWNvbmRzXSksCisgICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGVmOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQore2FwcGxpY2F0aW9uLCB0aHJpZnRfdGVzdCwgWworICAlIEEgcXVpY2sgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgorICB7ZGVzY3JpcHRpb24sICJUaHJpZnQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCJ9LAorCisgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KKyAge3ZzbiwgIjEuMC4wIn0sCisKKyAgJSBBbGwgbW9kdWxlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAge21vZHVsZXMsIFsKKyAgICB0ZXN0X2NsaWVudCwKKyAgICB0ZXN0X3RocmlmdF9zZXJ2ZXIKKyAgXX0sCisKKyAgJSBBbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbmFtZXMgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIFRoaXMgY2FuIGJlIGlnbm9yZWQuCisgIHtyZWdpc3RlcmVkLCBbXX0sCisKKyAgJSBBcHBsaWNhdGlvbnMgdGhhdCBhcmUgdG8gYmUgc3RhcnRlZCBwcmlvciB0byB0aGlzIG9uZS4gVGhpcyBjYW4gYmUgaWdub3JlZAorICAlIGxlYXZlIGl0IGFsb25lIHVubGVzcyB5b3UgdW5kZXJzdGFuZCBpdCB3ZWxsIGFuZCBsZXQgdGhlIC5yZWwgZmlsZXMgaW4KKyAgJSB5b3VyIHJlbGVhc2UgaGFuZGxlIHRoaXMuCisgIHthcHBsaWNhdGlvbnMsIFtrZXJuZWwsIHN0ZGxpYl19LAorCisgICUgT1RQIGFwcGxpY2F0aW9uIGxvYWRlciB3aWxsIGxvYWQsIGJ1dCBub3Qgc3RhcnQsIGluY2x1ZGVkIGFwcHMuIEFnYWluCisgICUgdGhpcyBjYW4gYmUgaWdub3JlZCBhcyB3ZWxsLiAgVG8gbG9hZCBidXQgbm90IHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGl0CisgICUgaXMgZWFzaWVyIHRvIGluY2x1ZGUgaXQgaW4gdGhlIC5yZWwgZmlsZSBmb2xsb3dlZCBieSB0aGUgYXRvbSAnbm9uZScKKyAge2luY2x1ZGVkX2FwcGxpY2F0aW9ucywgW119LAorCisgICUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIGNvbmZpZyBmaWxlIHNwZWNpZmllZAorICAlIG9uIHRoZSBjb21tYW5kIGxpbmUuIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2FzOmdldF9lbnYKKyAge2VudiwgWworICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCisgICAgJSBzaG91bGQgdGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzZXJpYWxpemVkIGJhY2sgdG8gdGhlIGNsaWVudAorICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KKyAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KKyAgXX0KK119LgpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbSBiL3Rlc3QvZmVhdHVyZXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZDc4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFWFRSQV9ESVNUID0gXAorCWxvY2FsX3RocmlmdCBcCisJaW5kZXguaHRtbCBcCisJY29udGFpbmVyX2xpbWl0LnB5IFwKKwlpbmRleC5odG1sIFwKKwlrbm93bl9mYWlsdXJlc19MaW51eC5qc29uIFwKKwlNYWtlZmlsZS5hbSBcCisgICAgICAgIG5vc3NsdjMuc2ggXAorCXN0cmluZ19saW1pdC5weSBcCisJdGVzdHMuanNvbiBcCisJdGhlYWRlcl9iaW5hcnkucHkgXAorCXNldHVwLmNmZyBcCisgICAgICAgIHRscy5zaCBcCisJdXRpbC5weQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9jb250YWluZXJfbGltaXQucHkgYi90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY4NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9jb250YWluZXJfbGltaXQucHkKQEAgLTAsMCArMSw3MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncywgaW5pdF9wcm90b2NvbAorZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKKworCisjIFRPRE86IGdlbmVyYXRlIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKK2RlZiB0ZXN0X2xpc3QocHJvdG8sIHZhbHVlKToKKyAgICBtZXRob2RfbmFtZSA9ICd0ZXN0TGlzdCcKKyAgICB0dHlwZSA9IFRUeXBlLkxJU1QKKyAgICBldHlwZSA9IFRUeXBlLkkzMgorICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKG1ldGhvZF9uYW1lLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMykKKyAgICBwcm90by53cml0ZVN0cnVjdEJlZ2luKG1ldGhvZF9uYW1lICsgJ19hcmdzJykKKyAgICBwcm90by53cml0ZUZpZWxkQmVnaW4oJ3RoaW5nJywgdHR5cGUsIDEpCisgICAgcHJvdG8ud3JpdGVMaXN0QmVnaW4oZXR5cGUsIGxlbih2YWx1ZSkpCisgICAgZm9yIGUgaW4gdmFsdWU6CisgICAgICAgIHByb3RvLndyaXRlSTMyKGUpCisgICAgcHJvdG8ud3JpdGVMaXN0RW5kKCkKKyAgICBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICAgIHByb3RvLndyaXRlTWVzc2FnZUVuZCgpCisgICAgcHJvdG8udHJhbnMuZmx1c2goKQorCisgICAgXywgbXR5cGUsIF8gPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICBhc3NlcnQgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkKKyAgICBfLCBmdHlwZSwgZmlkID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmaWQgPT0gMAorICAgIGFzc2VydCBmdHlwZSA9PSB0dHlwZQorICAgIGV0eXBlMiwgbGVuMiA9IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGFzc2VydCBldHlwZSA9PSBldHlwZTIKKyAgICBhc3NlcnQgbGVuMiA9PSBsZW4odmFsdWUpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuMik6CisgICAgICAgIHYgPSBwcm90by5yZWFkSTMyKCkKKyAgICAgICAgYXNzZXJ0IHYgPT0gdmFsdWVbaV0KKyAgICBwcm90by5yZWFkTGlzdEVuZCgpCisgICAgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICBfLCBmdHlwZSwgXyA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZnR5cGUgPT0gVFR5cGUuU1RPUAorICAgIHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHByb3RvLnJlYWRNZXNzYWdlRW5kKCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLWxpbWl0JywgdHlwZT1pbnQpCisgICAgYXJncyA9IHAucGFyc2VfYXJncygpCisgICAgcHJvdG8gPSBpbml0X3Byb3RvY29sKGFyZ3MpCisgICAgIyBUT0RPOiB0ZXN0IHNldCBhbmQgbWFwCisgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgLSAxKSkpCisgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgLSAxKSkpCisgICAgcHJpbnQoJ1tPS106IGxpbWl0IC0gMScpCisgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQpKSkKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCkpKQorICAgIHByaW50KCdbT0tdOiBqdXN0IGxpbWl0JykKKyAgICB0cnk6CisgICAgICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0ICsgMSkpKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHByaW50KCdbT0tdOiBsaW1pdCArIDEnKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCdbRVJST1JdOiBsaW1pdCArIDEnKQorICAgICAgICBhc3NlcnQgRmFsc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvaW5kZXguaHRtbCBiL3Rlc3QvZmVhdHVyZXMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGEwMDEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPCFET0NUWVBFIEhUTUw+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgY2hhcnNldD0idXRmLTgiPgorPHRpdGxlPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy5jc3MiPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS4zLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvanMvanF1ZXJ5LmRhdGFUYWJsZXMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL3Jlc3VsdC5qcyI+Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGgyPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlOiBSZXN1bHRzPC9oMj4KKzx0YWJsZSBpZD0idGVzdF9yZXN1bHRzIiBjbGFzcz0iZGlzcGxheSI+CisgICAgPHRoZWFkPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U2VydmVyPC90aD4KKyAgICAgICAgICAgIDx0aD5DbGllbnQ8L3RoPgorICAgICAgICAgICAgPHRoPlByb3RvY29sPC90aD4KKyAgICAgICAgICAgIDx0aD5UcmFuc3BvcnQ8L3RoPgorICAgICAgICAgICAgPHRoPlJlc3VsdCAobG9nKTwvdGg+CisgICAgICAgICAgICA8dGg+RXhwZWN0ZWQ8L3RoPgorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+Cis8L3RhYmxlPgorPGgyPlRlc3QgSW5mb3JtYXRpb248L2gyPgorPHByZSBpZD0idGVzdF9pbmZvIj48L3ByZT4KKworPGEgaHJlZj0ibG9nIj5icm93c2UgcmF3IGxvZyBmaWxlczwvYT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzY5NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTAsMCArMSw1MCBAQAorWworICAgICJjX2dsaWItbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjX2dsaWItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjbC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfZnJhbWVkX2JpbmFyeV9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfZnJhbWVkX2NvbXBhY3RfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX3VuZnJhbWVkX2JpbmFyeV9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicGVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX211bHRpYy1jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX211bHRpYy1jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibmV0Y29yZS1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIKK10KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvbG9jYWxfdGhyaWZ0L19faW5pdF9fLnB5IGIvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1Y2ViZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvbG9jYWxfdGhyaWZ0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK19TQ1JJUFRfRElSID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorX1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX1NDUklQVF9ESVIpKSkKK19MSUJESVIgPSBvcy5wYXRoLmpvaW4oX1JPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykKKworZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKF9MSUJESVIpOgorICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgbGlicGF0aCkKKyAgICAgICAgdGhyaWZ0ID0gX19pbXBvcnRfXygndGhyaWZ0JykKKyAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvbm9zc2x2My5zaCBiL3Rlc3QvZmVhdHVyZXMvbm9zc2x2My5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGNjYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoCkBAIC0wLDAgKzEsNTkgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgQ2hlY2tzIHRvIG1ha2Ugc3VyZSBTU0x2MyBpcyBub3QgYWxsb3dlZCBieSBhIHNlcnZlci4KKyMKKworVEhSSUZUSE9TVD1sb2NhbGhvc3QKK1RIUklGVFBPUlQ9OTA5MAorCit3aGlsZSBbWyAkIyAtZ2UgMSBdXTsgZG8KKyAgYXJnPSIkMSIKKyAgYXJnSU49KCR7YXJnLy89LyB9KQorCisgIGNhc2UgJHthcmdJTlswXX0gaW4KKyAgICAtaHwtLWhvc3QpCisgICAgVEhSSUZUSE9TVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgLXB8LS1wb3J0KQorICAgIFRIUklGVFBPUlQ9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgICopCisgICAgICAgICAgIyB1bmtub3duIG9wdGlvbiBpZ25vcmVkCisgICAgOzsKKyAgZXNhYworCisgIHNoaWZ0ICAgIyBwYXN0IGFyZ3VtZW50IG9yIHZhbHVlCitkb25lCisKK2Z1bmN0aW9uIG5vc3NsdjMKK3sKKyAgbG9jYWwgbmVnbworICBsb2NhbCBuZWdvZGVuaWVkCisgIGxvY2FsIG9wZW5zc2x2CisKKyAgb3BlbnNzbHY9JChvcGVuc3NsIHZlcnNpb24gfCBjdXQgLWQnICcgLWYyKQorICBpZiBbWyAkb3BlbnNzbHYgPiAiMS4wIiBdXTsgdGhlbgorICAgIGVjaG8gIltwYXNzXSBPcGVuU1NMIDEuMSBvciBsYXRlciAtIG5vIG5lZWQgdG8gY2hlY2sgc3NsMyIKKyAgICByZXR1cm4gMAorICBmaQorCisgICMgZWNobyAib3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC1zc2wzIDI+JjEgPCAvZGV2L251bGwiCisgIG5lZ289JChvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLXNzbDMgMj4mMSA8IC9kZXYvbnVsbCkKKyAgbmVnb2RlbmllZD0kPworCisgIGlmIFtbICRuZWdvZGVuaWVkIC1uZSAwIF1dOyB0aGVuCisgICAgZWNobyAiW3Bhc3NdIFNTTHYzIG5lZ290aWF0aW9uIGRpc2FibGVkIgorICAgIGVjaG8gJG5lZ28KKyAgICByZXR1cm4gMAorICBmaQorCisgIGVjaG8gIltmYWlsXSBTU0x2MyBuZWdvdGlhdGlvbiBlbmFibGVkISAgc3Rkb3V0OiIKKyAgZWNobyAkbmVnbworICByZXR1cm4gMQorfQorCitub3NzbHYzCitleGl0ICQ/CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3NldHVwLmNmZyBiL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5IGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OTFkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5CkBAIC0wLDAgKzEsNjIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKKworZnJvbSB1dGlsIGltcG9ydCBhZGRfY29tbW9uX2FyZ3MsIGluaXRfcHJvdG9jb2wKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUsIFRUeXBlCisKKworIyBUT0RPOiBnZW5lcmF0ZSBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CitkZWYgdGVzdF9zdHJpbmcocHJvdG8sIHZhbHVlKToKKyAgICBtZXRob2RfbmFtZSA9ICd0ZXN0U3RyaW5nJworICAgIHR0eXBlID0gVFR5cGUuU1RSSU5HCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kX25hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4obWV0aG9kX25hbWUgKyAnX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRCZWdpbigndGhpbmcnLCB0dHlwZSwgMSkKKyAgICBwcm90by53cml0ZVN0cmluZyh2YWx1ZSkKKyAgICBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICAgIHByb3RvLndyaXRlTWVzc2FnZUVuZCgpCisgICAgcHJvdG8udHJhbnMuZmx1c2goKQorCisgICAgXywgbXR5cGUsIF8gPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICBhc3NlcnQgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkKKyAgICBfLCBmdHlwZSwgZmlkID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmaWQgPT0gMAorICAgIGFzc2VydCBmdHlwZSA9PSB0dHlwZQorICAgIHJlc3VsdCA9IHByb3RvLnJlYWRTdHJpbmcoKQorICAgIHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisgICAgYXNzZXJ0IHZhbHVlID09IHJlc3VsdAorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tbGltaXQnLCB0eXBlPWludCkKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBwcm90byA9IGluaXRfcHJvdG9jb2woYXJncykKKyAgICB0ZXN0X3N0cmluZyhwcm90bywgJ2EnICogKGFyZ3MubGltaXQgLSAxKSkKKyAgICB0ZXN0X3N0cmluZyhwcm90bywgJ2EnICogKGFyZ3MubGltaXQgLSAxKSkKKyAgICBwcmludCgnW09LXTogbGltaXQgLSAxJykKKyAgICB0ZXN0X3N0cmluZyhwcm90bywgJ2EnICogYXJncy5saW1pdCkKKyAgICB0ZXN0X3N0cmluZyhwcm90bywgJ2EnICogYXJncy5saW1pdCkKKyAgICBwcmludCgnW09LXToganVzdCBsaW1pdCcpCisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N0cmluZyhwcm90bywgJ2EnICogKGFyZ3MubGltaXQgKyAxKSkKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwcmludCgnW09LXTogbGltaXQgKyAxJykKKyAgICBlbHNlOgorICAgICAgICBwcmludCgnW0VSUk9SXTogbGltaXQgKyAxJykKKyAgICAgICAgYXNzZXJ0IEZhbHNlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbiBiL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWUwN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uCkBAIC0wLDAgKzEsMTE0IEBACitbCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIHVuZnJhbWVkIGJpbmFyeSB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl91bmZyYW1lZF9iaW5hcnkiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9YmluYXJ5IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1idWZmZXJlZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyBmcmFtZWQgYmluYXJ5IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX2ZyYW1lZF9iaW5hcnkiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9YmluYXJ5IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1mcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgdW5mcmFtZWQgY29tcGFjdCB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl91bmZyYW1lZF9jb21wYWN0IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWNvbXBhY3QiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWJ1ZmZlcmVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIGZyYW1lZCBjb21wYWN0IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX2ZyYW1lZF9jb21wYWN0IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWNvbXBhY3QiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibGltaXRfc3RyaW5nX2xlbmd0aCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJzdHJpbmdfbGltaXQucHkiLAorICAgICAgIi0tbGltaXQ9NTAiCisgICAgXSwKKyAgICAicmVtb3RlX2FyZ3MiOiBbCisgICAgICAiLS1zdHJpbmctbGltaXQ9NTAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImxpbWl0X2NvbnRhaW5lcl9sZW5ndGgiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAiY29udGFpbmVyX2xpbWl0LnB5IiwKKyAgICAgICItLWxpbWl0PTUwIgorICAgIF0sCisgICAgInJlbW90ZV9hcmdzIjogWworICAgICAgIi0tY29udGFpbmVyLWxpbWl0PTUwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJub3NzbHYzIiwKKyAgICAiY29tbWVudCI6ICJjaGVjayB0byBtYWtlIHN1cmUgU1NMdjMgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAibm9zc2x2My5zaCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInRscyIsCisgICAgImNvbW1lbnQiOiAiY2hlY2sgdG8gbWFrZSBzdXJlIFRMU3YxLjAgb3IgbGF0ZXIgaXMgc3VwcG9ydGVkIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJ0bHMuc2giCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0KK10KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkgYi90ZXN0L2ZlYXR1cmVzL3RoZWFkZXJfYmluYXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3RoZWFkZXJfYmluYXJ5LnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzeXMKKworZnJvbSB1dGlsIGltcG9ydCBhZGRfY29tbW9uX2FyZ3MKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUsIFRUeXBlCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFNvY2tldCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRCdWZmZXJlZFRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKworCitkZWYgdGVzdF92b2lkKHByb3RvKToKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbigndGVzdFZvaWQnLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMykKKyAgICBwcm90by53cml0ZVN0cnVjdEJlZ2luKCd0ZXN0Vm9pZF9hcmdzJykKKyAgICBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICAgIHByb3RvLndyaXRlTWVzc2FnZUVuZCgpCisgICAgcHJvdG8udHJhbnMuZmx1c2goKQorCisgICAgXywgbXR5cGUsIF8gPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICBhc3NlcnQgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkKKyAgICBfLCBmdHlwZSwgXyA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZnR5cGUgPT0gVFR5cGUuU1RPUAorICAgIHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHByb3RvLnJlYWRNZXNzYWdlRW5kKCkKKworCisjIFRIZWFkZXIgc3RhY2sgc2hvdWxkIGFjY2VwdCBiaW5hcnkgcHJvdG9jb2wgd2l0aCBvcHRpb25hbGx5IGZyYW1lZCB0cmFuc3BvcnQKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgIyBTaW5jZSBUSGVhZGVyVHJhbnNwb3J0IGFjdHMgYXMgZnJhbWVkIHRyYW5zcG9ydCB3aGVuIGRldGVjdGVkIGZyYW1lLCB3ZQorICAgICMgY2Fubm90IHVzZSAtLXRyYW5zcG9ydD1mcmFtZWQgYXMgaXQgd291bGQgcmVzdWx0IGluIDIgbGF5ZXJlZCBmcmFtZXMuCisgICAgcC5hZGRfYXJndW1lbnQoJy0tb3ZlcnJpZGUtdHJhbnNwb3J0JykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1vdmVycmlkZS1wcm90b2NvbCcpCisgICAgYXJncyA9IHAucGFyc2VfYXJncygpCisgICAgYXNzZXJ0IGFyZ3MucHJvdG9jb2wgPT0gJ2hlYWRlcicKKyAgICBhc3NlcnQgYXJncy50cmFuc3BvcnQgPT0gJ2J1ZmZlcmVkJworICAgIGFzc2VydCBub3QgYXJncy5zc2wKKworICAgIHNvY2sgPSBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0LCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9JTkVUKQorICAgIGlmIG5vdCBhcmdzLm92ZXJyaWRlX3RyYW5zcG9ydCBvciBhcmdzLm92ZXJyaWRlX3RyYW5zcG9ydCA9PSAnYnVmZmVyZWQnOgorICAgICAgICB0cmFucyA9IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrKQorICAgIGVsaWYgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgPT0gJ2ZyYW1lZCc6CisgICAgICAgIHByaW50KCdURlJBTUVEJykKKyAgICAgICAgdHJhbnMgPSBURnJhbWVkVHJhbnNwb3J0KHNvY2spCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB0cmFuc3BvcnQnKQorICAgIHRyYW5zLm9wZW4oKQorCisgICAgaWYgbm90IGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgb3IgYXJncy5vdmVycmlkZV9wcm90b2NvbCA9PSAnYmluYXJ5JzoKKyAgICAgICAgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMpCisgICAgZWxpZiBhcmdzLm92ZXJyaWRlX3Byb3RvY29sID09ICdjb21wYWN0JzoKKyAgICAgICAgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgdHJhbnNwb3J0JykKKworICAgIHRlc3Rfdm9pZChwcm90bykKKyAgICB0ZXN0X3ZvaWQocHJvdG8pCisKKyAgICB0cmFucy5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3Rscy5zaCBiL3Rlc3QvZmVhdHVyZXMvdGxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhZGE2YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3Rscy5zaApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vYmFzaAorCisjCisjIENoZWNrcyB0byBtYWtlIHN1cmUgVExTdjEuMCBvciBsYXRlciBpcyBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZGVjbGFyZSAtQSBFWFBFQ1RfTkVHT1RJQVRFCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFdPTEKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV8xXT0xCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFfMl09MQorCitmYWlsdXJlcz0wCisKK2Z1bmN0aW9uIHRscworeworICBmb3IgUFJPVE8gaW4gIiR7IUVYUEVDVF9ORUdPVElBVEVbQF19IjsgZG8KKworICAgIGxvY2FsIG5lZ28KKyAgICBsb2NhbCBuZWdvZGVuaWVkCisgICAgbG9jYWwgcmVzCisKKyAgICBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLSRQUk9UTyAyPiYxIDwgL2Rldi9udWxsIgorICAgIG5lZ289JChvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLSRQUk9UTyAyPiYxIDwgL2Rldi9udWxsKQorICAgIG5lZ29kZW5pZWQ9JD8KKyAgICBlY2hvICJyZXN1bHQgb2YgY29tbWFuZDogJG5lZ29kZW5pZWQiCisKKyAgICByZXM9ImVuYWJsZWQiOyBpZiBbWyAke0VYUEVDVF9ORUdPVElBVEVbJFBST1RPXX0gLWVxIDAgXV07IHRoZW4gcmVzPSJkaXNhYmxlZCI7IGZpCisKKyAgICBpZiBbWyAkbmVnb2RlbmllZCAtbmUgJHtFWFBFQ1RfTkVHT1RJQVRFWyRQUk9UT119IF1dOyB0aGVuCisgICAgICBlY2hvICIkUFJPVE8gbmVnb3RpYXRpb24gYWxsb3dlZCIKKyAgICBlbHNlCisgICAgICBlY2hvICJbd2Fybl0gJFBST1RPIG5lZ290aWF0aW9uIGRpZCBub3Qgd29yayIKKyAgICAgIGVjaG8gJG5lZ28KKyAgICAgICgoZmFpbHVyZXMrKykpCisgICAgZmkKKyAgZG9uZQorfQorCit0bHMKKworaWYgW1sgJGZhaWx1cmVzIC1lcSAzIF1dOyB0aGVuCisgIGVjaG8gIltmYWlsXSBBdCBsZWFzdCBvbmUgb2YgVExTdjEuMCwgVExTdjEuMSwgb3IgVExTdjEuMiBuZWVkcyB0byB3b3JrLCBidXQgZG9lcyBub3QiCisgIGV4aXQgJGZhaWx1cmVzCitmaQorCitlY2hvICJbcGFzc10gQXQgbGVhc3Qgb25lIG9mIFRMU3YxLjAsIFRMU3YxLjEsIG9yIFRMU3YxLjIgd29ya2VkIgorZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3V0aWwucHkgYi90ZXN0L2ZlYXR1cmVzL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiYmJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdXRpbC5weQpAQCAtMCwwICsxLDQwIEBACitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzb2NrZXQKKworZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFNvY2tldCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRCdWZmZXJlZFRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50IGltcG9ydCBUSHR0cENsaWVudAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKworCitkZWYgYWRkX2NvbW1vbl9hcmdzKHApOgorICAgIHAuYWRkX2FyZ3VtZW50KCctLWhvc3QnLCBkZWZhdWx0PSdsb2NhbGhvc3QnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXBvcnQnLCB0eXBlPWludCwgZGVmYXVsdD05MDkwKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXByb3RvY29sJywgZGVmYXVsdD0nYmluYXJ5JykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS10cmFuc3BvcnQnLCBkZWZhdWx0PSdidWZmZXJlZCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tc3NsJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKworCitkZWYgcGFyc2VfY29tbW9uX2FyZ3MoYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICByZXR1cm4gcC5wYXJzZV9hcmdzKGFyZ3YpCisKKworZGVmIGluaXRfcHJvdG9jb2woYXJncyk6CisgICAgc29jayA9IFRTb2NrZXQoYXJncy5ob3N0LCBhcmdzLnBvcnQsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX0lORVQpCisgICAgc29jay5zZXRUaW1lb3V0KDUwMCkKKyAgICB0cmFucyA9IHsKKyAgICAgICAgJ2J1ZmZlcmVkJzogVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgICAgICAnZnJhbWVkJzogVEZyYW1lZFRyYW5zcG9ydCwKKyAgICAgICAgJ2h0dHAnOiBUSHR0cENsaWVudCwKKyAgICB9W2FyZ3MudHJhbnNwb3J0XShzb2NrKQorICAgIHRyYW5zLm9wZW4oKQorICAgIHJldHVybiB7CisgICAgICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wsCisgICAgICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbCwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLAorICAgIH1bYXJncy5wcm90b2NvbF0odHJhbnMpCmRpZmYgLS1naXQgYS90ZXN0L2dvL01ha2VmaWxlLmFtIGIvdGVzdC9nby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE4MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQlVJTFRfU09VUkNFUyA9IGdvcGF0aAorCitUSFJJRlRDTUQgPSAkKFRIUklGVCkgLW91dCBzcmMvZ2VuIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0JChDT01QSUxFUl9FWFRSQUZMQUcpCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKK3ByZWNyb3NzOiBiaW4vdGVzdGNsaWVudCBiaW4vdGVzdHNlcnZlcgorCitUaHJpZnRUZXN0LnRocmlmdDogJChUSFJJRlRURVNUKQorCWdyZXAgLXYgbGlzdC4qbWFwLipsaXN0LiptYXAgJChUSFJJRlRURVNUKSA+IFRocmlmdFRlc3QudGhyaWZ0CisKKy5QSE9OWTogZ29wYXRoCisKKyMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MworZ29wYXRoOiAkKFRIUklGVCkgVGhyaWZ0VGVzdC50aHJpZnQKKwlta2RpciAtcCBzcmMvZ2VuCisJJChUSFJJRlRDTUQpIFRocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlRDTUQpIC4uL1N0cmVzc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgc3JjL2dpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrL2NvbnRyb2xsZXIuZ28gfHwgdHJ1ZQorCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKKwlsbiAtbmZzIC4uLy4uLy4uL2xpYi9nby90aHJpZnQgc3JjL3RocmlmdAorCXRvdWNoIGdvcGF0aAorCitiaW4vdGVzdGNsaWVudDogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgYmluL3Rlc3RjbGllbnQKKworYmluL3Rlc3RzZXJ2ZXI6IGdvcGF0aAorCUdPUEFUSD1gcHdkYCAkKEdPKSBpbnN0YWxsIGJpbi90ZXN0c2VydmVyCisKK2Jpbi9zdHJlc3M6IGdvcGF0aAorCUdPUEFUSD1gcHdkYCAkKEdPKSBpbnN0YWxsIGJpbi9zdHJlc3MKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgc3JjL2dlbiBzcmMvZ2l0aHViLmNvbS9nb2xhbmcgc3JjL3RocmlmdCBiaW4gcGtnIGdvcGF0aCBUaHJpZnRUZXN0LnRocmlmdAorCitjaGVja19QUk9HUkFNUzogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIgYmluL3N0cmVzcworCitjaGVjazogZ29wYXRoIGdlbm1vY2sKKwlHT1BBVEg9YHB3ZGAgJChHTykgdGVzdCAtdiBjb21tb24vLi4uCisKK2dlbm1vY2s6IGdvcGF0aAorCUdPUEFUSD1gcHdkYCAkKEdPKSBpbnN0YWxsIGdpdGh1Yi5jb20vZ29sYW5nL21vY2svbW9ja2dlbgorCUdPUEFUSD1gcHdkYCBiaW4vbW9ja2dlbiAtZGVzdGluYXRpb249c3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28gLXBhY2thZ2U9Y29tbW9uIGdlbi90aHJpZnR0ZXN0IFRocmlmdFRlc3QKKworRVhUUkFfRElTVCA9IFwKKwlzcmMvYmluIFwKKwlzcmMvY29tbW9uCmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlMGYyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZmxhZyIKKwkiZm10IgorCSJnZW4vc3RyZXNzIgorCSJsb2ciCisJXyAibmV0L2h0dHAvcHByb2YiCisJIm9zIgorCSJydW50aW1lIgorCSJydW50aW1lL3Bwcm9mIgorCSJzeW5jIgorCSJzeW5jL2F0b21pYyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit2YXIgY3B1cHJvZmlsZSA9IGZsYWcuU3RyaW5nKCJjcHVwcm9maWxlIiwgIiIsICJ3cml0ZSBjcHUgcHJvZmlsZSB0byB0aGlzIGZpbGUiKQordmFyIG1lbXByb2ZpbGUgPSBmbGFnLlN0cmluZygibWVtcHJvZmlsZSIsICIiLCAid3JpdGUgbWVtb3J5IHByb2ZpbGUgdG8gdGhpcyBmaWxlIikKKwordmFyICgKKwlob3N0ICAgICAgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKKwlwb3J0ICAgICAgPSBmbGFnLkludDY0KCJwb3J0IiwgOTA5MSwgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQorCWxvb3AgICAgICA9IGZsYWcuSW50KCJsb29wcyIsIDUwMDAwLCAiVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzIikKKwlydW5zZXJ2ZXIgPSBmbGFnLkludCgic2VydmVyIiwgMSwgIlJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MiKQorCWNsaWVudHMgICA9IGZsYWcuSW50KCJjbGllbnRzIiwgMjAsICJOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gc2VydmVyIG9ubHkiKQorCWNhbGxOYW1lICA9IGZsYWcuU3RyaW5nKCJjYWxsIiwgImVjaG9Wb2lkIiwgIlNlcnZpY2UgbWV0aG9kIHRvIGNhbGwsIG9uZSBvZiBlY2hvVm9pZCwgZWNob0J5dGUsIGVjaG9JMzIsIGVjaG9JNjQsIGVjaG9TdHJpbmcsIGVjaGlMaXN0LCBlY2hvU2V0LCBlY2hvTWFwIikKKwljb21wYWN0ICAgPSBmbGFnLkJvb2woImNvbXBhY3QiLCBmYWxzZSwgIlVzZSBjb21wYWN0IHByb3RvY29sIGluc3RlYWQgb2YgYmluYXJ5LiIpCisJZnJhbWVkICAgID0gZmxhZy5Cb29sKCJmcmFtZWQiLCBmYWxzZSwgIlVzZSBmcmFtZWQgdHJhbnNwb3J0IGluc3RlYWQgb2YgYnVmZmVyZWQuIikKKykKK3ZhciBob3N0UG9ydCBzdHJpbmcKKwordHlwZSBjYWxsVCBpbnQ2NAorCitjb25zdCAoCisJZWNob1ZvaWQgY2FsbFQgPSBpb3RhCisJZWNob0J5dGUKKwllY2hvSTMyCisJZWNob0k2NAorCWVjaG9TdHJpbmcKKwllY2hpTGlzdAorCWVjaG9TZXQKKwllY2hvTWFwCispCisKK3ZhciBjYWxsVE1hcCA9IG1hcFtzdHJpbmddY2FsbFR7CisJImVjaG9Wb2lkIjogICBlY2hvVm9pZCwKKwkiZWNob0J5dGUiOiAgIGVjaG9CeXRlLAorCSJlY2hvSTMyIjogICAgZWNob0kzMiwKKwkiZWNob0k2NCI6ICAgIGVjaG9JNjQsCisJImVjaG9TdHJpbmciOiBlY2hvU3RyaW5nLAorCSJlY2hpTGlzdCI6ICAgZWNoaUxpc3QsCisJImVjaG9TZXQiOiAgICBlY2hvU2V0LAorCSJlY2hvTWFwIjogICAgZWNob01hcCwKK30KK3ZhciBjYWxsVHlwZSBjYWxsVAorCit2YXIgcmVhZHksIGRvbmUgc3luYy5XYWl0R3JvdXAKKwordmFyIGNsaWNvdW50ZXIgaW50NjQgPSAwCit2YXIgY291bnRlciBpbnQ2NCA9IDAKKworZnVuYyBtYWluKCkgeworCWZsYWcuUGFyc2UoKQorCWlmICptZW1wcm9maWxlICE9ICIiIHsKKwkJcnVudGltZS5NZW1Qcm9maWxlUmF0ZSA9IDEwMAorCX0KKwl2YXIgb2sgYm9vbAorCWlmIGNhbGxUeXBlLCBvayA9IGNhbGxUTWFwWypjYWxsTmFtZV07ICFvayB7CisJCWxvZy5GYXRhbCgiVW5rbm93biBzZXJ2aWNlIGNhbGwiLCAqY2FsbE5hbWUpCisJfQorCWlmICpjcHVwcm9maWxlICE9ICIiIHsKKwkJZiwgZXJyIDo9IG9zLkNyZWF0ZSgqY3B1cHJvZmlsZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlsb2cuRmF0YWwoZXJyKQorCQl9CisJCXBwcm9mLlN0YXJ0Q1BVUHJvZmlsZShmKQorCQlkZWZlciBwcHJvZi5TdG9wQ1BVUHJvZmlsZSgpCisJfQorCWhvc3RQb3J0ID0gZm10LlNwcmludGYoIiVzOiVkIiwgKmhvc3QsICpwb3J0KQorCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKworCWlmICpjb21wYWN0IHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwl9IGVsc2UgeworCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCX0KKworCWlmICpmcmFtZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4MTkyKQorCX0KKworCWlmICpydW5zZXJ2ZXIgPiAwIHsKKwkJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXQoaG9zdFBvcnQpCisJCWlmIGVyciAhPSBuaWwgeworCQkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0OiAlcyIsIGVycikKKwkJfQorCisJCXByb2Nlc3NvciA6PSBzdHJlc3MuTmV3U2VydmljZVByb2Nlc3NvcigmaGFuZGxlcnt9KQorCQlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisJCWlmICpjbGllbnRzID09IDAgeworCQkJc2VydmVyLlNlcnZlKCkKKwkJfSBlbHNlIHsKKwkJCWdvIHNlcnZlci5TZXJ2ZSgpCisJCX0KKwl9CisJLy9zdGFydCBjbGllbnRzCisJaWYgKmNsaWVudHMgIT0gMCB7CisJCXJlYWR5LkFkZCgqY2xpZW50cyArIDEpCisJCWRvbmUuQWRkKCpjbGllbnRzKQorCQlmb3IgaSA6PSAwOyBpIDwgKmNsaWVudHM7IGkrKyB7CisJCQlnbyBjbGllbnQocHJvdG9jb2xGYWN0b3J5KQorCQl9CisJCXJlYWR5LkRvbmUoKQorCQlyZWFkeS5XYWl0KCkKKwkJLy9ydW4hCisJCXN0YXJ0VGltZSA6PSB0aW1lLk5vdygpCisJCS8vd2FpdCBmb3IgY29tcGxldGlvbgorCQlkb25lLldhaXQoKQorCQllbmRUaW1lIDo9IHRpbWUuTm93KCkKKwkJZHVyYXRpb24gOj0gZW5kVGltZS5TdWIoc3RhcnRUaW1lKQorCQlsb2cuUHJpbnRmKCIlZCBjYWxscyBpbiAldiAoJWYgY2FsbHMgcGVyIHNlY29uZClcbiIsIGNsaWNvdW50ZXIsIGR1cmF0aW9uLCBmbG9hdDY0KGNsaWNvdW50ZXIpL2R1cmF0aW9uLlNlY29uZHMoKSkKKwl9CisJaWYgKm1lbXByb2ZpbGUgIT0gIiIgeworCQlmLCBlcnIgOj0gb3MuQ3JlYXRlKCptZW1wcm9maWxlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWxvZy5GYXRhbChlcnIpCisJCX0KKwkJcHByb2YuV3JpdGVIZWFwUHJvZmlsZShmKQorCQlmLkNsb3NlKCkKKwkJcmV0dXJuCisJfQorfQorCitmdW5jIGNsaWVudChwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpIHsKKwl0cmFucywgZXJyIDo9IHRocmlmdC5OZXdUU29ja2V0KGhvc3RQb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCX0KKwlidHJhbnMgOj0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgMjA0OCkKKwljbGllbnQgOj0gc3RyZXNzLk5ld1NlcnZpY2VDbGllbnRGYWN0b3J5KGJ0cmFucywgcHJvdG9jb2xGYWN0b3J5KQorCWVyciA9IHRyYW5zLk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gb3BlbiBjb25uZWN0aW9uOiAlcyIsIGVycikKKwl9CisJcmVhZHkuRG9uZSgpCisJcmVhZHkuV2FpdCgpCisJc3dpdGNoIGNhbGxUeXBlIHsKKwljYXNlIGVjaG9Wb2lkOgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob1ZvaWQoKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvQnl0ZToKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9CeXRlKDQyKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvSTMyOgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0kzMig0MjQyKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvSTY0OgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0k2NCg0MjQyNDIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9TdHJpbmc6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvU3RyaW5nKCJUZXN0U3RyaW5nIikKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNoaUxpc3Q6CisJCWwgOj0gW11pbnQ4ey0xMCwgLTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH0KKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9MaXN0KGwpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9TZXQ6CisJCXMgOj0gbWFwW2ludDhdc3RydWN0e317LTEwOiB7fSwgLTk6IHt9LCAtODoge30sIC03OiB7fSwgLTY6IHt9LCAtNToge30sIC00OiB7fSwgLTM6IHt9LCAtMjoge30sIC0xOiB7fSwgMDoge30sIDE6IHt9LCAyOiB7fSwgMzoge30sIDQ6IHt9LCA1OiB7fSwgNjoge30sIDc6IHt9LCA4OiB7fX0KKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9TZXQocykKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob01hcDoKKwkJbSA6PSBtYXBbaW50OF1pbnQ4ey0xMDogMTAsIC05OiA5LCAtODogOCwgLTc6IDcsIC02OiA2LCAtNTogNSwgLTQ6IDQsIC0zOiAzLCAtMjogMiwgLTE6IDEsIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDh9CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvTWFwKG0pCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwl9CisKKwlkb25lLkRvbmUoKQorfQorCit0eXBlIGhhbmRsZXIgc3RydWN0e30KKworZnVuYyAoaCAqaGFuZGxlcikgRWNob1ZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob0kzMihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvSTY0KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9TdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTGlzdChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgW11pbnQ4KSAociBbXWludDgsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9TZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XXN0cnVjdHt9KSAociBtYXBbaW50OF1zdHJ1Y3R7fSwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob01hcChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdaW50OCkgKHIgbWFwW2ludDhdaW50OCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1N2VlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBtYWluCisKK2ltcG9ydCAoCisJImNvbW1vbiIKKwkiY29udGV4dCIKKwkiZmxhZyIKKwkiZ2VuL3RocmlmdHRlc3QiCisJdCAibG9nIgorCSJyZWZsZWN0IgorCSJ0aHJpZnQiCispCisKK3ZhciBob3N0ID0gZmxhZy5TdHJpbmcoImhvc3QiLCAibG9jYWxob3N0IiwgIkhvc3QgdG8gY29ubmVjdCIpCit2YXIgcG9ydCA9IGZsYWcuSW50NjQoInBvcnQiLCA5MDkwLCAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCit2YXIgZG9tYWluX3NvY2tldCA9IGZsYWcuU3RyaW5nKCJkb21haW4tc29ja2V0IiwgIiIsICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvdGhyaWZ0dGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQordmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKK3ZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCit2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKK3ZhciB0ZXN0bG9vcHMgPSBmbGFnLkludCgidGVzdGxvb3BzIiwgMSwgIk51bWJlciBvZiBUZXN0cyIpCisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlBhcnNlKCkKKwljbGllbnQsIF8sIGVyciA6PSBjb21tb24uU3RhcnRDbGllbnQoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogIiwgZXJyKQorCX0KKwlmb3IgaSA6PSAwOyBpIDwgKnRlc3Rsb29wczsgaSsrIHsKKwkJY2FsbEV2ZXJ5dGhpbmcoY2xpZW50KQorCX0KK30KKwordmFyIHJtYXBtYXAgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCS00OiBtYXBbaW50MzJdaW50MzJ7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorfQorCit2YXIgeHhzID0gJnRocmlmdHRlc3QuWHRydWN0eworCVN0cmluZ1RoaW5nOiAiSGVsbG8yIiwKKwlCeXRlVGhpbmc6ICAgNDIsCisJSTMyVGhpbmc6ICAgIDQyNDIsCisJSTY0VGhpbmc6ICAgIDQyNDI0MiwKK30KKwordmFyIHhjZXB0ID0gJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiWGNlcHRpb24ifQordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQorCitmdW5jIGNhbGxFdmVyeXRoaW5nKGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50KSB7CisJdmFyIGVyciBlcnJvcgorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQorCX0KKworCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgdGhpbmcgIT0gInRoaW5nIiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmcoKSByZXN1bHQsIGV4cGVjdGVkICd0aGluZycgZ290ICclcycgIiwgdGhpbmcpCisJfQorCisJYmwsIGVyciA6PSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgdHJ1ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFibCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAlZiAiLCBibCkKKwl9CisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGJsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgZmFsc2UsIGdvdCAlZiAiLCBibCkKKwl9CisKKwliLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qnl0ZSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgYiAhPSA0MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RCeXRlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLCBnb3QgJWQgIiwgYikKKwl9CisKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBpMzIgIT0gNDI0MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJMzIoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MiwgZ290ICVkICIsIGkzMikKKwl9CisKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGk2NCAhPSA0MjQyNDIgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0STY0KCkgcmVzdWx0IGV4cGVjdGVkIDQyNDI0MiwgZ290ICVkICIsIGk2NCkKKwl9CisKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGQgIT0gNDIuNDIgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RG91YmxlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLjQyLCBnb3QgJWYgIiwgZCkKKwl9CisKKwliaW5vdXQgOj0gbWFrZShbXWJ5dGUsIDI1NikKKwlmb3IgaSA6PSAwOyBpIDwgMjU2OyBpKysgeworCQliaW5vdXRbaV0gPSBieXRlKGkpCisJfQorCWJpbiwgZXJyIDo9IGNsaWVudC5UZXN0QmluYXJ5KGRlZmF1bHRDdHgsIGJpbm91dCkKKwlmb3IgaSA6PSAwOyBpIDwgMjU2OyBpKysgeworCQlpZiBiaW5vdXRbaV0gIT0gYmluW2ldIHsKKwkJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RCaW5hcnkoKSByZXN1bHQgZXhwZWN0ZWQgJWQsIGdvdCAlZCAiLCBiaW5vdXRbaV0sIGJpbltpXSkKKwkJfQorCX0KKworCXhzIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl4cy5TdHJpbmdUaGluZyA9ICJ0aGluZyIKKwl4cy5CeXRlVGhpbmcgPSA0MgorCXhzLkkzMlRoaW5nID0gNDI0MgorCXhzLkk2NFRoaW5nID0gNDI0MjQyCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgKnhzICE9ICp4c3JldCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTdHJ1Y3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhzLCB4c3JldCkKKwl9CisKKwl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQorCXgyLlN0cnVjdFRoaW5nID0geHMKKwl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCB4MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4MiwgeDJyZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE5lc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHgyLCB4MnJldCkKKwl9CisKKwltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG0sIG1yZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbSwgbXJldCkKKwl9CisKKwlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KKwlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIHNtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nTWFwKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoc20sIHNtcmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmdNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHNtLCBzbXJldCkKKwl9CisKKwlzIDo9IFtdaW50MzJ7MSwgMiwgNDJ9CisJc3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KGRlZmF1bHRDdHgsIHMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTZXQoKSBjYWxsOiAiLCBlcnIpCisJfQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CisJfQorCisJbCA6PSBbXWludDMyezEsIDIsIDQyfQorCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QoZGVmYXVsdEN0eCwgbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdExpc3QoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChsLCBscmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RMaXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCX0KKworCWVyZXQsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGVyZXQgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTyB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFbnVtKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPLCBlcmV0KQorCX0KKworCXRyZXQsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgdHJldCAhPSB0aHJpZnR0ZXN0LlVzZXJJZCg0MikgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0VHlwZWRlZigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCB0cmV0KQorCX0KKworCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwTWFwKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobWFwbWFwLCBybWFwbWFwKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNYXBNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHJtYXBtYXAsIG1hcG1hcCkKKwl9CisKKwljcmF6eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHsKKwkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkU6ICA1LAorCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQ6IDgsCisJfQorCXRydWNrMSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJdHJ1Y2sxLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgorCXRydWNrMS5CeXRlVGhpbmcgPSA0CisJdHJ1Y2sxLkkzMlRoaW5nID0gNAorCXRydWNrMS5JNjRUaGluZyA9IDQKKwl0cnVjazIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXRydWNrMi5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJdHJ1Y2syLkJ5dGVUaGluZyA9IDIKKwl0cnVjazIuSTMyVGhpbmcgPSAyCisJdHJ1Y2syLkk2NFRoaW5nID0gMgorCWNyYXp5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHsKKwkJdHJ1Y2sxLAorCQl0cnVjazIsCisJfQorCWluc2FuaXR5LCBlcnIgOj0gY2xpZW50LlRlc3RJbnNhbml0eShkZWZhdWx0Q3R4LCBjcmF6eSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEluc2FuaXR5KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoY3JhenksIGluc2FuaXR5WzFdWzJdKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIGZpcnN0IHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwKKwkJCWNyYXp5LAorCQkJaW5zYW5pdHlbMV1bMl0pCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bM10pIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgc2Vjb25kIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwKKwkJCWNyYXp5LAorCQkJaW5zYW5pdHlbMV1bM10pCisJfQorCWlmIGxlbihpbnNhbml0eVsyXVs2XS5Vc2VyTWFwKSA+IDAgfHwgbGVuKGluc2FuaXR5WzJdWzZdLlh0cnVjdHMpID4gMCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIG5vbi1lbXB0eSByZXN1bHQgZ290ICUjdiAiLAorCQkJaW5zYW5pdHlbMl1bNl0pCisJfQorCisJeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aShkZWZhdWx0Q3R4LCA0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4eHMsIHh4c3JldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TXVsdGkoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHh4cywgeHhzcmV0KQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgeGNlcHQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeGNlcHQsIGVycikKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJXywgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmIGVyciA9PSBuaWwgfHwgIW9rIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKKwl9CisKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCisJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlRoaXMgaXMgYW4gWGNlcHRpb24ifSkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQorCX0KKworCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJZXhwZWN0aW5nIDo9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fQorCisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgZXhwZWN0aW5nKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICIsIGVycikKKwl9CisKKwkvL01ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBzdGlsbCBhbGl2ZQorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmQ5NjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBtYWluCisKK2ltcG9ydCAoCisJImNvbW1vbiIKKwkiZmxhZyIKKwkiZm10IgorCSJsb2ciCisJIm5ldC9odHRwIgorCSJ0aHJpZnQiCispCisKK3ZhciBob3N0ID0gZmxhZy5TdHJpbmcoImhvc3QiLCAibG9jYWxob3N0IiwgIkhvc3QgdG8gY29ubmVjdCIpCit2YXIgcG9ydCA9IGZsYWcuSW50NjQoInBvcnQiLCA5MDkwLCAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCit2YXIgZG9tYWluX3NvY2tldCA9IGZsYWcuU3RyaW5nKCJkb21haW4tc29ja2V0IiwgIiIsICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQordmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKK3ZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCit2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKK3ZhciBjZXJ0UGF0aCA9IGZsYWcuU3RyaW5nKCJjZXJ0UGF0aCIsICJrZXlzIiwgIkRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIFNTTCBjZXJ0aWZpY2F0ZXMiKQorCitmdW5jIG1haW4oKSB7CisJZmxhZy5QYXJzZSgpCisKKwlwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBlcnIgOj0gY29tbW9uLkdldFNlcnZlclBhcmFtcygqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wsICpjZXJ0UGF0aCwgY29tbW9uLlByaW50aW5nSGFuZGxlcikKKworCWlmIGVyciAhPSBuaWwgeworCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gcHJvY2VzcyBzZXJ2ZXIgcGFyYW1zOiAiLCBlcnIpCisJfQorCisJaWYgKnRyYW5zcG9ydCA9PSAiaHR0cCIgeworCQlodHRwLkhhbmRsZUZ1bmMoIi8iLCB0aHJpZnQuTmV3VGhyaWZ0SGFuZGxlckZ1bmMocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpCisKKwkJaWYgKnNzbCB7CisJCQllcnIgOj0gaHR0cC5MaXN0ZW5BbmRTZXJ2ZVRMUyhmbXQuU3ByaW50ZigiOiVkIiwgKnBvcnQpLAorCQkJCSpjZXJ0UGF0aCsiL3NlcnZlci5wZW0iLCAqY2VydFBhdGgrIi9zZXJ2ZXIua2V5IiwgbmlsKQorCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlmbXQuUHJpbnRsbihlcnIpCisJCQkJcmV0dXJuCisJCQl9CisJCX0gZWxzZSB7CisJCQlodHRwLkxpc3RlbkFuZFNlcnZlKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksIG5pbCkKKwkJfQorCX0gZWxzZSB7CisJCXNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwkJaWYgZXJyID0gc2VydmVyLkxpc3RlbigpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKKwkJc2VydmVyLlNlcnZlKCkKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZjZTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJjcnlwdG8vdGxzIgorCSJmbGFnIgorCSJmbXQiCisJImdlbi90aHJpZnR0ZXN0IgorCSJuZXQvaHR0cCIKKwkidGhyaWZ0IgorKQorCit2YXIgZGVidWdDbGllbnRQcm90b2NvbCBib29sCisKK2Z1bmMgaW5pdCgpIHsKKwlmbGFnLkJvb2xWYXIoJmRlYnVnQ2xpZW50UHJvdG9jb2wsICJkZWJ1Z19jbGllbnRfcHJvdG9jb2wiLCBmYWxzZSwgInR1cm4gY2xpZW50IHByb3RvY29sIHRyYWNlIG9uIikKK30KKworZnVuYyBTdGFydENsaWVudCgKKwlob3N0IHN0cmluZywKKwlwb3J0IGludDY0LAorCWRvbWFpbl9zb2NrZXQgc3RyaW5nLAorCXRyYW5zcG9ydCBzdHJpbmcsCisJcHJvdG9jb2wgc3RyaW5nLAorCXNzbCBib29sKSAoY2xpZW50ICp0aHJpZnR0ZXN0LlRocmlmdFRlc3RDbGllbnQsIHRyYW5zIHRocmlmdC5UVHJhbnNwb3J0LCBlcnIgZXJyb3IpIHsKKworCWhvc3RQb3J0IDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJc3dpdGNoIHByb3RvY29sIHsKKwljYXNlICJjb21wYWN0IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJzaW1wbGVqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJiaW5hcnkiOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCWRlZmF1bHQ6CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQgJXMiLCBwcm90b2NvbCkKKwl9CisJaWYgZGVidWdDbGllbnRQcm90b2NvbCB7CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdURGVidWdQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5LCAiY2xpZW50OiIpCisJfQorCWlmIHNzbCB7CisJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNvY2tldChob3N0UG9ydCwgJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSkKKwl9IGVsc2UgeworCQlpZiBkb21haW5fc29ja2V0ICE9ICIiIHsKKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChkb21haW5fc29ja2V0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU29ja2V0KGhvc3RQb3J0KQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCX0KKwlzd2l0Y2ggdHJhbnNwb3J0IHsKKwljYXNlICJodHRwIjoKKwkJaWYgc3NsIHsKKwkJCXRyIDo9ICZodHRwLlRyYW5zcG9ydHsKKwkJCQlUTFNDbGllbnRDb25maWc6ICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0sCisJCQl9CisJCQljbGllbnQgOj0gJmh0dHAuQ2xpZW50e1RyYW5zcG9ydDogdHJ9CisJCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RIdHRwUG9zdENsaWVudFdpdGhPcHRpb25zKGZtdC5TcHJpbnRmKCJodHRwczovLyVzLyIsIGhvc3RQb3J0KSwgdGhyaWZ0LlRIdHRwQ2xpZW50T3B0aW9uc3tDbGllbnQ6IGNsaWVudH0pCisJCQlmbXQuUHJpbnRsbihob3N0UG9ydCkKKwkJfSBlbHNlIHsKKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50KGZtdC5TcHJpbnRmKCJodHRwOi8vJXMvIiwgaG9zdFBvcnQpKQorCQl9CisJY2FzZSAiZnJhbWVkIjoKKwkJdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykKKwljYXNlICJidWZmZXJlZCI6CisJCXRyYW5zID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgODE5MikKKwljYXNlICJ6bGliIjoKKwkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgemxpYi5CZXN0Q29tcHJlc3Npb24pCisJY2FzZSAiIjoKKwkJdHJhbnMgPSB0cmFucworCWRlZmF1bHQ6CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CisJaWYgZXJyID0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CisJaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCW9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwljbGllbnQgPSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpKQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTNjNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJnZW4vdGhyaWZ0dGVzdCIKKwkicmVmbGVjdCIKKwkic3luYyIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorKQorCit0eXBlIHRlc3RfdW5pdCBzdHJ1Y3QgeworCWhvc3QgICAgICAgICAgc3RyaW5nCisJcG9ydCAgICAgICAgICBpbnQ2NAorCWRvbWFpbl9zb2NrZXQgc3RyaW5nCisJdHJhbnNwb3J0ICAgICBzdHJpbmcKKwlwcm90b2NvbCAgICAgIHN0cmluZworCXNzbCAgICAgICAgICAgYm9vbAorfQorCit2YXIgdW5pdHMgPSBbXXRlc3RfdW5pdHsKKwl7IjEyNy4wLjAuMSIsIDkwOTUsICIiLCAiIiwgImJpbmFyeSIsIGZhbHNlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTEsICIiLCAiIiwgImNvbXBhY3QiLCBmYWxzZX0sCisJeyIxMjcuMC4wLjEiLCA5MDkyLCAiIiwgIiIsICJiaW5hcnkiLCB0cnVlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTMsICIiLCAiIiwgImNvbXBhY3QiLCB0cnVlfSwKK30KKworZnVuYyBUZXN0QWxsQ29ubmVjdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwljZXJ0UGF0aCA9ICIuLi8uLi8uLi9rZXlzIgorCXdnIDo9ICZzeW5jLldhaXRHcm91cHt9CisJd2cuQWRkKGxlbih1bml0cykpCisJZm9yIF8sIHVuaXQgOj0gcmFuZ2UgdW5pdHMgeworCQlnbyBmdW5jKHUgdGVzdF91bml0KSB7CisJCQlkZWZlciB3Zy5Eb25lKCkKKwkJCWRvVW5pdCh0LCAmdSkKKwkJfSh1bml0KQorCX0KKwl3Zy5XYWl0KCkKK30KKworZnVuYyBkb1VuaXQodCAqdGVzdGluZy5ULCB1bml0ICp0ZXN0X3VuaXQpIHsKKwljdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgY3RybC5GaW5pc2goKQorCWhhbmRsZXIgOj0gTmV3TW9ja1RocmlmdFRlc3QoY3RybCkKKworCXByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIGVyciA6PSBHZXRTZXJ2ZXJQYXJhbXModW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsLCAiLi4vLi4vLi4va2V5cyIsIGhhbmRsZXIpCisKKwlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisJaWYgZXJyID0gc2VydmVyLkxpc3RlbigpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBzZXJ2ZXI6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCWRlZmVyIHNlcnZlci5TdG9wKCkKKwljbGllbnQsIHRyYW5zLCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFucy5DbG9zZSgpCisJY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0LCBjbGllbnQsIGhhbmRsZXIpCit9CisKK3ZhciBybWFwbWFwID0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwktNDogbWFwW2ludDMyXWludDMyey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJNDogIG1hcFtpbnQzMl1pbnQzMns0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKK30KKwordmFyIHh4cyA9ICZ0aHJpZnR0ZXN0Llh0cnVjdHsKKwlTdHJpbmdUaGluZzogIkhlbGxvMiIsCisJQnl0ZVRoaW5nOiAgIDQyLAorCUkzMlRoaW5nOiAgICA0MjQyLAorCUk2NFRoaW5nOiAgICA0MjQyNDIsCit9CisKK3ZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogInNvbWUifQordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQorCitmdW5jIGNhbGxFdmVyeXRoaW5nV2l0aE1vY2sodCAqdGVzdGluZy5ULCBjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgaGFuZGxlciAqTW9ja1RocmlmdFRlc3QpIHsKKwlnb21vY2suSW5PcmRlcigKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZChnb21vY2suQW55KCkpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmcoZ29tb2NrLkFueSgpLCAidGhpbmciKS5SZXR1cm4oInRoaW5nIiwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qm9vbChnb21vY2suQW55KCksIHRydWUpLlJldHVybih0cnVlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgZmFsc2UpLlJldHVybihmYWxzZSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShnb21vY2suQW55KCksIGludDgoNDIpKS5SZXR1cm4oaW50OCg0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEkzMihnb21vY2suQW55KCksIGludDMyKDQyNDIpKS5SZXR1cm4oaW50MzIoNDI0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEk2NChnb21vY2suQW55KCksIGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAorCQkvLyBUT0RPOiBhZGQgVGVzdEJpbmFyeSgpCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdERvdWJsZShnb21vY2suQW55KCksIGZsb2F0NjQoNDIuNDIpKS5SZXR1cm4oZmxvYXQ2NCg0Mi40MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cnVjdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9KS5SZXR1cm4oJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE5lc3QoZ29tb2NrLkFueSgpLCAmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcChnb21vY2suQW55KCksIG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0pLlJldHVybihtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmdNYXAoZ29tb2NrLkFueSgpLCBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0pLlJldHVybihtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFNldChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdExpc3QoZ29tb2NrLkFueSgpLCBbXWludDMyezEsIDIsIDQyfSkuUmV0dXJuKFtdaW50MzJ7MSwgMiwgNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFbnVtKGdvbW9jay5BbnkoKSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykuUmV0dXJuKHRocmlmdHRlc3QuTnVtYmVyel9UV08sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFR5cGVkZWYoZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpLlJldHVybih0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcE1hcChnb21vY2suQW55KCksIGludDMyKDQyKSkuUmV0dXJuKHJtYXBtYXAsIG5pbCksCisJCS8vIFRPRE86IG5vdCB0ZXN0aW5nIGluc2FuaXR5CisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpKGdvbW9jay5BbnkoKSwgaW50OCg0MiksIGludDMyKDQyNDIpLCBpbnQ2NCg0MjQyNDIpLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKS5SZXR1cm4oeHhzLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAic29tZSIpLlJldHVybih4Y2VwdCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEV4Y2VwdGlvbihnb21vY2suQW55KCksICJURXhjZXB0aW9uIikuUmV0dXJuKGVycm9ycy5OZXcoIkp1c3QgcmFuZG9tIGV4Y2VwdGlvbiIpKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbihnb21vY2suQW55KCksICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbjJ7RXJyb3JDb2RlOiAyMDAyLCBTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifX0pLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RPbmV3YXkoZ29tb2NrLkFueSgpLCBpbnQzMigyKSkuUmV0dXJuKG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFZvaWQoZ29tb2NrLkFueSgpKSwKKwkpCisJdmFyIGVyciBlcnJvcgorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCisJdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGhpbmciKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIHRoaW5nICE9ICJ0aGluZyIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nKCkgcmVzdWx0LCBleHBlY3RlZCAndGhpbmcnIGdvdCAnJXMnICIsIHRoaW5nKQorCX0KKworCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFibCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAldiAiLCBibCkKKwl9CisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgYmwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICV2ICIsIGJsKQorCX0KKworCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGIgIT0gNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCisJfQorCisJaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEkzMigpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBpMzIgIT0gNDI0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJMzIoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MiwgZ290ICVkICIsIGkzMikKKwl9CisKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgaTY0ICE9IDQyNDI0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQorCX0KKworCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCA0Mi40MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdERvdWJsZSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBkICE9IDQyLjQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdERvdWJsZSgpIHJlc3VsdCBleHBlY3RlZCA0Mi40MiwgZ290ICVmICIsIGQpCisJfQorCisJLy8gVE9ETzogYWRkIFRlc3RCaW5hcnkoKSBjYWxsCisKKwl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCisJeHMuQnl0ZVRoaW5nID0gNDIKKwl4cy5JMzJUaGluZyA9IDQyNDIKKwl4cy5JNjRUaGluZyA9IDQyNDI0MgorCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgeHMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgKnhzICE9ICp4c3JldCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJ1Y3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhzLCB4c3JldCkKKwl9CisKKwl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQorCXgyLlN0cnVjdFRoaW5nID0geHMKKwl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCB4MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHgyLCB4MnJldCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TmVzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeDIsIHgycmV0KQorCX0KKworCW0gOj0gbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfQorCW1yZXQsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtLCBtcmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIG0sIG1yZXQpCisJfQorCisJc20gOj0gbWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9CisJc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBzbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoc20sIHNtcmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmdNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHNtLCBzbXJldCkKKwl9CisKKwlzIDo9IFtdaW50MzJ7MSwgMiwgNDJ9CisJc3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KGRlZmF1bHRDdHgsIHMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTZXQoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJLy8gU2V0cyBjYW4gYmUgaW4gYW55IG9yZGVyLCBidXQgR28gc2xpY2VzIGFyZSBvcmRlcmVkLCBzbyByZWZsZWN0LkRlZXBFcXVhbCB3b24ndCB3b3JrLgorCXN0ZW1wIDo9IG1hcFtpbnQzMl1zdHJ1Y3R7fXt9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzIHsKKwkJc3RlbXBbdmFsXSA9IHN0cnVjdHt9e30KKwl9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzcmV0IHsKKwkJaWYgXywgb2sgOj0gc3RlbXBbdmFsXTsgIW9rIHsKKwkJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTZXQoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHMsIHNyZXQpCisJCX0KKwl9CisKKwlsIDo9IFtdaW50MzJ7MSwgMiwgNDJ9CisJbHJldCwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKKwl9CisKKwllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RFbnVtKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGVyZXQgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTyB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RFbnVtKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPLCBlcmV0KQorCX0KKworCXRyZXQsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCisJfQorCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwbWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCisJfQorCisJeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aShkZWZhdWx0Q3R4LCA0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgInNvbWUiKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0RXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsIHhjZXB0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhjZXB0LCBlcnIpCisJfQorCisJLy8gVE9ETzogY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQgb24gdGhpcworCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIikKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcigiZXhwZWN0ZWQgZXhjZXB0aW9uIGdvdCBuaWwiKQorCX0gZWxzZSBpZiB0ZXgsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7ICFvayB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgQXBwbGljYXRpb25FcnJvciwgZ290ICVUICIsIGVycikKKwl9IGVsc2UgaWYgdGV4LlR5cGVJZCgpICE9IHRocmlmdC5JTlRFUk5BTF9FUlJPUiB7CisJCXQuRXJyb3JmKCJleHBlY3RlZCBpbnRlcm5hbF9lcnJvciBnb3QgJXYiLCB0ZXguVHlwZUlkKCkpCisJfQorCisJaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKQorCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKKwl9CisKKwlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCisJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWV4cGVjdGluZyA6PSAmdGhyaWZ0dGVzdC5YY2VwdGlvbjJ7RXJyb3JDb2RlOiAyMDAyLCBTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifX0KKworCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsIGV4cGVjdGluZykgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RPbmV3YXkoKSBjYWxsOiAlcyIsIGVycikKKwl9CisKKwkvL01ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBzdGlsbCBhbGl2ZQorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogJXMiLCBlcnIpCisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL2NvbnRleHRfdGVzdC5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0ZGJiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28KQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbXQiCisJIm5ldCIKKwkibmV0L2h0dHAiCisJIm5ldC91cmwiCisJIm9zIgorCSJzeXNjYWxsIgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRpbWUiCispCisKK3R5cGUgc2xvd0h0dHBIYW5kbGVyIHN0cnVjdHt9CisKK2Z1bmMgKHNsb3dIdHRwSGFuZGxlcikgU2VydmVIVFRQKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJdGltZS5TbGVlcCgxICogdGltZS5TZWNvbmQpCit9CisKK2Z1bmMgVGVzdEh0dHBDb250ZXh0VGltZW91dCh0ICp0ZXN0aW5nLlQpIHsKKwljZXJ0UGF0aCA9ICIuLi8uLi8uLi9rZXlzIgorCisJdW5pdCA6PSB0ZXN0X3VuaXR7IjEyNy4wLjAuMSIsIDkwOTYsICIiLCAiaHR0cCIsICJiaW5hcnkiLCBmYWxzZX0KKworCXNlcnZlciA6PSAmaHR0cC5TZXJ2ZXJ7QWRkcjogdW5pdC5ob3N0ICsgZm10LlNwcmludGYoIjolZCIsIHVuaXQucG9ydCksIEhhbmRsZXI6IHNsb3dIdHRwSGFuZGxlcnt9fQorCWdvIHNlcnZlci5MaXN0ZW5BbmRTZXJ2ZSgpCisKKwljbGllbnQsIHRyYW5zLCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFucy5DbG9zZSgpCisKKwl1bndyYXBFcnIgOj0gZnVuYyhlcnIgZXJyb3IpIGVycm9yIHsKKwkJZm9yIHsKKwkJCXN3aXRjaCBlcnIuKHR5cGUpIHsKKwkJCWNhc2UgdGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb246CisJCQkJZXJyID0gZXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikuRXJyKCkKKwkJCWNhc2UgKnVybC5FcnJvcjoKKwkJCQllcnIgPSBlcnIuKCp1cmwuRXJyb3IpLkVycgorCQkJY2FzZSAqbmV0Lk9wRXJyb3I6CisJCQkJZXJyID0gZXJyLigqbmV0Lk9wRXJyb3IpLkVycgorCQkJY2FzZSAqb3MuU3lzY2FsbEVycm9yOgorCQkJCWVyciA9IGVyci4oKm9zLlN5c2NhbGxFcnJvcikuRXJyCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCX0KKworCXNlcnZlclN0YXJ0dXBEZWFkbGluZSA6PSB0aW1lLk5vdygpLkFkZCg1ICogdGltZS5TZWNvbmQpCisJZm9yIHsKKwkJY3R4LCBfIDo9IGNvbnRleHQuV2l0aFRpbWVvdXQoY29udGV4dC5CYWNrZ3JvdW5kKCksIDUwKnRpbWUuTWlsbGlzZWNvbmQpCisJCWVyciA9IGNsaWVudC5UZXN0Vm9pZChjdHgpCisJCWVyciA9IHVud3JhcEVycihlcnIpCisJCWlmIGVyciAhPSBzeXNjYWxsLkVDT05OUkVGVVNFRCB8fCB0aW1lLk5vdygpLkFmdGVyKHNlcnZlclN0YXJ0dXBEZWFkbGluZSkgeworCQkJYnJlYWsKKwkJfQorCQl0aW1lLlNsZWVwKHRpbWUuTWlsbGlzZWNvbmQpCisJfQorCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJSZXF1ZXN0IGNvbXBsZXRlZCAoc2hvdWxkIGhhdmUgdGltZWQgb3V0KSIpCisJCXJldHVybgorCX0KKworCS8vIFdlJ3ZlIGdvdCB0byBzd2l0Y2ggb24gYGVyci5FcnJvcigpYCBoZXJlIHNpbmNlIGdvMS43IGRvZXNuJ3QgcHJvcGVybHkgcmV0dXJuCisJLy8gYGNvbnRleHQuRGVhZGxpbmVFeGNlZWRlZGAgZXJyb3IgYW5kIGBodHRwLmVyclJlcXVlc3RDYW5jZWxlZGAgaXMgbm90IGV4cG9ydGVkLgorCS8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29sYW5nL2dvL2lzc3Vlcy8xNzcxMQorCXN3aXRjaCBlcnIuRXJyb3IoKSB7CisJY2FzZSBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWQuRXJyb3IoKSwgIm5ldC9odHRwOiByZXF1ZXN0IGNhbmNlbGVkIjoKKwkJLy8gRXhwZWN0ZWQgZXJyb3IKKwlkZWZhdWx0OgorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvcjogJXMiLCBlcnIpCisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL3ByaW50aW5nX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIyZDBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3ByaW50aW5nX2hhbmRsZXIuZ28KQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvaGV4IgorCSJlcnJvcnMiCisJImZtdCIKKwkuICJnZW4vdGhyaWZ0dGVzdCIKKwkidGltZSIKKykKKwordmFyIFByaW50aW5nSGFuZGxlciA9ICZwcmludGluZ0hhbmRsZXJ7fQorCit0eXBlIHByaW50aW5nSGFuZGxlciBzdHJ1Y3R7fQorCisvLyBQcmludHMgInRlc3RWb2lkKCkiIGFuZCByZXR1cm5zIG5vdGhpbmcuCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RWb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRsbigidGVzdFZvaWQoKSIpCisJcmV0dXJuIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworLy8gQHBhcmFtIHN0cmluZyB0aGluZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQKKy8vIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RCb29sKCIldCIpJyB3aXRoIHRoaW5nIGFzICd0cnVlJyBvciAnZmFsc2UnCisvLyBAcGFyYW0gYm9vbCB0aGluZyAtIHRoZSBib29sIHRvIHByaW50CisvLyBAcmV0dXJuIGJvb2wgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJvb2woY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgYm9vbCkgKHIgYm9vbCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEJvb2woJXQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RCeXRlKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGJ5dGUgdG8gcHJpbnQKKy8vIEByZXR1cm4gYnl0ZSAtIHJldHVybnMgdGhlIGJ5dGUgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEkzMigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisvLyBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorLy8gQHJldHVybiBpMzIgLSByZXR1cm5zIHRoZSBpMzIgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STMyKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEkzMiglZClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEk2NCgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisvLyBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAorLy8gQHJldHVybiBpNjQgLSByZXR1cm5zIHRoZSBpNjQgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STY0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEk2NCglZClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdERvdWJsZSgiJWYiKScgd2l0aCB0aGluZyBhcyAnJWYnCisvLyBAcGFyYW0gZG91YmxlIHRoaW5nIC0gdGhlIGRvdWJsZSB0byBwcmludAorLy8gQHJldHVybiBkb3VibGUgLSByZXR1cm5zIHRoZSBkb3VibGUgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3REb3VibGUoJWYpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKy8vIEBwYXJhbSBbXWJ5dGUgdGhpbmcgLSB0aGUgYmluYXJ5IHRvIHByaW50CisvLyBAcmV0dXJuIFtdYnl0ZSAtIHJldHVybnMgdGhlIGJpbmFyeSAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCaW5hcnkoJXMpXG4iLCBoZXguRW5jb2RlVG9TdHJpbmcodGhpbmcpKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisvLyBAcGFyYW0gWHRydWN0IHRoaW5nIC0gdGhlIFh0cnVjdCB0byBwcmludAorLy8gQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIHRoZSBYdHJ1Y3QgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICpYdHJ1Y3QpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlZH0pXG4iLCB0aGluZy5TdHJpbmdUaGluZywgdGhpbmcuQnl0ZVRoaW5nLCB0aGluZy5JMzJUaGluZywgdGhpbmcuSTY0VGhpbmcpCisJcmV0dXJuIHRoaW5nLCBlcnIKK30KKworLy8gUHJpbnRzICd0ZXN0TmVzdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiB0aGUgbmVzdGVkIHN0cnVjdAorLy8gQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAorLy8gQHJldHVybiBYdHJ1Y3QyIC0gcmV0dXJucyB0aGUgWHRydWN0MiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIG5lc3QgKlh0cnVjdDIpIChyICpYdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKKwl0aGluZyA6PSBuZXN0LlN0cnVjdFRoaW5nCisJZm10LlByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICVkfSwgJWR9KVxuIiwgbmVzdC5CeXRlVGhpbmcsIHRoaW5nLlN0cmluZ1RoaW5nLCB0aGluZy5CeXRlVGhpbmcsIHRoaW5nLkkzMlRoaW5nLCB0aGluZy5JNjRUaGluZywgbmVzdC5JMzJUaGluZykKKwlyZXR1cm4gbmVzdCwgbmlsCit9CisKKy8vIFByaW50cyAndGVzdE1hcCgieyVzIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworLy8gIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworLy8gQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKKy8vIEByZXR1cm4gbWFwPGkzMixpMzI+IC0gcmV0dXJucyB0aGUgbWFwPGkzMixpMzI+ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdE1hcCh7IikKKwlmaXJzdCA6PSB0cnVlCisJZm9yIGssIHYgOj0gcmFuZ2UgdGhpbmcgeworCQlpZiBmaXJzdCB7CisJCQlmaXJzdCA9IGZhbHNlCisJCX0gZWxzZSB7CisJCQlmbXQuUHJpbnRmKCIsICIpCisJCX0KKwkJZm10LlByaW50ZigiJWQgPT4gJWQiLCBrLCB2KQorCX0KKwlmbXQuUHJpbnRmKCJ9KVxuIikKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RTdHJpbmdNYXAoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gbWFwPHN0cmluZyxzdHJpbmc+IHRoaW5nIC0gdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiB0byBwcmludAorLy8gQHJldHVybiBtYXA8c3RyaW5nLHN0cmluZz4gLSByZXR1cm5zIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFN0cmluZ01hcCh7IikKKwlmaXJzdCA6PSB0cnVlCisJZm9yIGssIHYgOj0gcmFuZ2UgdGhpbmcgeworCQlpZiBmaXJzdCB7CisJCQlmaXJzdCA9IGZhbHNlCisJCX0gZWxzZSB7CisJCQlmbXQuUHJpbnRmKCIsICIpCisJCX0KKwkJZm10LlByaW50ZigiJXMgPT4gJXMiLCBrLCB2KQorCX0KKwlmbXQuUHJpbnRmKCJ9KVxuIikKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RTZXQoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworLy8gIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworLy8gQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisvLyBAcmV0dXJuIHNldDxpMzI+IC0gcmV0dXJucyB0aGUgc2V0PGkzMj4gJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U2V0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RTZXQoeyIpCisJZmlyc3QgOj0gdHJ1ZQorCWZvciBrLCBfIDo9IHJhbmdlIHRoaW5nIHsKKwkJaWYgZmlyc3QgeworCQkJZmlyc3QgPSBmYWxzZQorCQl9IGVsc2UgeworCQkJZm10LlByaW50ZigiLCAiKQorCQl9CisJCWZtdC5QcmludGYoIiVkIiwgaykKKwl9CisJZm10LlByaW50ZigifSlcbiIpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0TGlzdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gbGlzdDxpMzI+IHRoaW5nIC0gdGhlIGxpc3Q8aTMyPiB0byBwcmludAorLy8gQHJldHVybiBsaXN0PGkzMj4gLSByZXR1cm5zIHRoZSBsaXN0PGkzMj4gJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TGlzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TGlzdCh7IikKKwlmb3IgaSwgdiA6PSByYW5nZSB0aGluZyB7CisJCWlmIGkgIT0gMCB7CisJCQlmbXQuUHJpbnRmKCIsICIpCisJCX0KKwkJZm10LlByaW50ZigiJWQiLCB2KQorCX0KKwlmbXQuUHJpbnRmKCJ9KVxuIikKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKKy8vIEBwYXJhbSBOdW1iZXJ6IHRoaW5nIC0gdGhlIE51bWJlcnogdG8gcHJpbnQKKy8vIEByZXR1cm4gTnVtYmVyeiAtIHJldHVybnMgdGhlIE51bWJlcnogJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RW51bShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBOdW1iZXJ6KSAociBOdW1iZXJ6LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0RW51bSglZClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFR5cGVkZWYoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworLy8gQHBhcmFtIFVzZXJJZCB0aGluZyAtIHRoZSBVc2VySWQgdG8gcHJpbnQKKy8vIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgVXNlcklkKSAociBVc2VySWQsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RUeXBlZGVmKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0TWFwTWFwKCIlZCIpJyB3aXRoIGhlbGxvIGFzICclZCcKKy8vIEBwYXJhbSBpMzIgaGVsbG8gLSB0aGUgaTMyIHRvIHByaW50CisvLyBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorLy8gICB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gSGVsbG8KK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKQorCisJciA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJCS00OiBtYXBbaW50MzJdaW50MzJ7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwkJNDogIG1hcFtpbnQzMl1pbnQzMns0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKKwl9CisJcmV0dXJuCit9CisKKy8vIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworLy8KKy8vIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorLy8gICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorLy8gICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorLy8gICAgICAgICAgfSwKKy8vICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKy8vICAgfQorLy8gQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIEFyZ3VtZW50CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqSW5zYW5pdHkpIChyIG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKVxuIikKKwlyID0gbWFrZShtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSkKKwlyWzFdID0gbWFwW051bWJlcnpdKkluc2FuaXR5eworCQkyOiBhcmd1bWVudCwKKwkJMzogYXJndW1lbnQsCisJfQorCXJbMl0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHl7CisJCTY6IE5ld0luc2FuaXR5KCksCisJfQorCXJldHVybgorfQorCisvLyBQcmludHMgJ3Rlc3RNdWx0aSgpJworLy8gQHBhcmFtIGJ5dGUgYXJnMCAtCisvLyBAcGFyYW0gaTMyIGFyZzEgLQorLy8gQHBhcmFtIGk2NCBhcmcyIC0KKy8vIEBwYXJhbSBtYXA8aTE2LCBzdHJpbmc+IGFyZzMgLQorLy8gQHBhcmFtIE51bWJlcnogYXJnNCAtCisvLyBAcGFyYW0gVXNlcklkIGFyZzUgLQorLy8gQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIGFuIFh0cnVjdCB3aXRoIFN0cmluZ1RoaW5nID0gIkhlbGxvMiwgQnl0ZVRoaW5nID0gYXJnMCwgSTMyVGhpbmcgPSBhcmcxCisvLyAgICBhbmQgSTY0VGhpbmcgPSBhcmcyCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIEFyZzAKKy8vICAtIEFyZzEKKy8vICAtIEFyZzIKKy8vICAtIEFyZzMKKy8vICAtIEFyZzQKKy8vICAtIEFyZzUKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IE51bWJlcnosIGFyZzUgVXNlcklkKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TXVsdGkoKVxuIikKKwlyID0gTmV3WHRydWN0KCkKKworCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCXIuQnl0ZVRoaW5nID0gYXJnMAorCXIuSTMyVGhpbmcgPSBhcmcxCisJci5JNjRUaGluZyA9IGFyZzIKKwlyZXR1cm4KK30KKworLy8gUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisvLyBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworLy8gaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisvLyBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKy8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIEFyZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnKQorCXN3aXRjaCBhcmcgeworCWNhc2UgIlhjZXB0aW9uIjoKKwkJZSA6PSBOZXdYY2VwdGlvbigpCisJCWUuRXJyb3JDb2RlID0gMTAwMQorCQllLk1lc3NhZ2UgPSBhcmcKKwkJcmV0dXJuIGUKKwljYXNlICJURXhjZXB0aW9uIjoKKwkJcmV0dXJuIGVycm9ycy5OZXcoIkp1c3QgVEV4Y2VwdGlvbiIpCisJfQorCXJldHVybgorfQorCisvLyBQcmludCAndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknIHdpdGggYXJnMCBhcyAnJXMnIGFuZCBhcmcxIGFzICclcycKKy8vIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisvLyBpZiBhcmcwID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisvLyBlbHNlbiBpZiBhcmcwID09ICJYY2VwdGlvbjIiIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisvLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworLy8gQHJldHVybiBYdHJ1Y3QgLSBhbiBYdHJ1Y3Qgd2l0aCBTdHJpbmdUaGluZyA9IGFyZzEKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJnMAorLy8gIC0gQXJnMQorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgYXJnMCwgYXJnMSkKKwlzd2l0Y2ggYXJnMCB7CisKKwljYXNlICJYY2VwdGlvbiI6CisJCWUgOj0gTmV3WGNlcHRpb24oKQorCQllLkVycm9yQ29kZSA9IDEwMDEKKwkJZS5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisJCXJldHVybiBuaWwsIGUKKwljYXNlICJYY2VwdGlvbjIiOgorCQllIDo9IE5ld1hjZXB0aW9uMigpCisJCWUuRXJyb3JDb2RlID0gMjAwMgorCQllLlN0cnVjdFRoaW5nID0gTmV3WHRydWN0KCkKKwkJZS5TdHJ1Y3RUaGluZy5TdHJpbmdUaGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKwkJcmV0dXJuIG5pbCwgZQorCWRlZmF1bHQ6CisJCXIgPSBOZXdYdHJ1Y3QoKQorCQlyLlN0cmluZ1RoaW5nID0gYXJnMQorCQlyZXR1cm4KKwl9Cit9CisKKy8vIFByaW50ICd0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi4nIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworLy8gc2xlZXAgJ3NlY29uZHNUb1NsZWVwJworLy8gUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisvLyBAcGFyYW0gaTMyIHNlY29uZHNUb1NsZWVwIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFNlY29uZHNUb1NsZWVwCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RPbmV3YXkoY3R4IGNvbnRleHQuQ29udGV4dCwgc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNlY29uZHNUb1NsZWVwKQorCXRpbWUuU2xlZXAodGltZS5TZWNvbmQgKiB0aW1lLkR1cmF0aW9uKHNlY29uZHNUb1NsZWVwKSkKKwlmbXQuUHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNlY29uZHNUb1NsZWVwKQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNDQwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28KQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29tcHJlc3MvemxpYiIKKwkiY3J5cHRvL3RscyIKKwkiZmxhZyIKKwkiZm10IgorCSJnZW4vdGhyaWZ0dGVzdCIKKwkidGhyaWZ0IgorKQorCit2YXIgKAorCWRlYnVnU2VydmVyUHJvdG9jb2wgYm9vbAorCWNlcnRQYXRoICAgICAgICAgICAgc3RyaW5nCispCisKK2Z1bmMgaW5pdCgpIHsKKwlmbGFnLkJvb2xWYXIoJmRlYnVnU2VydmVyUHJvdG9jb2wsICJkZWJ1Z19zZXJ2ZXJfcHJvdG9jb2wiLCBmYWxzZSwgInR1cm4gc2VydmVyIHByb3RvY29sIHRyYWNlIG9uIikKK30KKworZnVuYyBHZXRTZXJ2ZXJQYXJhbXMoCisJaG9zdCBzdHJpbmcsCisJcG9ydCBpbnQ2NCwKKwlkb21haW5fc29ja2V0IHN0cmluZywKKwl0cmFuc3BvcnQgc3RyaW5nLAorCXByb3RvY29sIHN0cmluZywKKwlzc2wgYm9vbCwKKwljZXJ0UGF0aCBzdHJpbmcsCisJaGFuZGxlciB0aHJpZnR0ZXN0LlRocmlmdFRlc3QpICh0aHJpZnQuVFByb2Nlc3NvciwgdGhyaWZ0LlRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnksIGVycm9yKSB7CisKKwl2YXIgZXJyIGVycm9yCisJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwlzd2l0Y2ggcHJvdG9jb2wgeworCWNhc2UgImNvbXBhY3QiOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgInNpbXBsZWpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImJpbmFyeSI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQgJXMiLCBwcm90b2NvbCkKKwl9CisJaWYgZGVidWdTZXJ2ZXJQcm90b2NvbCB7CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdURGVidWdQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5LCAic2VydmVyOiIpCisJfQorCisJdmFyIHNlcnZlclRyYW5zcG9ydCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydAorCWlmIHNzbCB7CisJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKKwkJaWYgY2VydCwgZXJyIDo9IHRscy5Mb2FkWDUwOUtleVBhaXIoY2VydFBhdGgrIi9zZXJ2ZXIuY3J0IiwgY2VydFBhdGgrIi9zZXJ2ZXIua2V5Iik7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZXJyCisJCX0gZWxzZSB7CisJCQljZmcuQ2VydGlmaWNhdGVzID0gYXBwZW5kKGNmZy5DZXJ0aWZpY2F0ZXMsIGNlcnQpCisJCX0KKwkJc2VydmVyVHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNlcnZlclNvY2tldChob3N0UG9ydCwgY2ZnKQorCX0gZWxzZSB7CisJCWlmIGRvbWFpbl9zb2NrZXQgIT0gIiIgeworCQkJc2VydmVyVHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChkb21haW5fc29ja2V0KQorCQl9IGVsc2UgeworCQkJc2VydmVyVHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChob3N0UG9ydCkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZXJyCisJfQorCisJdmFyIHRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5CisKKwlzd2l0Y2ggdHJhbnNwb3J0IHsKKwljYXNlICJodHRwIjoKKwkJLy8gdGhlcmUgaXMgbm8gc3VjaCBmYWN0b3J5LCBhbmQgd2UgZG9uJ3QgbmVlZCBhbnkKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IG5pbAorCWNhc2UgImZyYW1lZCI6CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJY2FzZSAiYnVmZmVyZWQiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwljYXNlICJ6bGliIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24pCisJY2FzZSAiIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCX0KKwlwcm9jZXNzb3IgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0UHJvY2Vzc29yKGhhbmRsZXIpCisKKwlyZXR1cm4gcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmlsCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5NDYzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJlcnJvcnMiCisJLiAiZ2VuL3RocmlmdHRlc3QiCisJInRpbWUiCispCisKK3ZhciBTaW1wbGVIYW5kbGVyID0gJnNpbXBsZUhhbmRsZXJ7fQorCit0eXBlIHNpbXBsZUhhbmRsZXIgc3RydWN0e30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFZvaWQoKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U3RyaW5nKHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Qm9vbCh0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEJ5dGUodGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEkzMih0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RJNjQodGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0RG91YmxlKHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RCaW5hcnkodGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTdHJ1Y3QodGhpbmcgKlh0cnVjdCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHIsIGVycgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TmVzdChuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIG5lc3QsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TWFwKHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFNldCh0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TGlzdCh0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0RW51bSh0aGluZyBOdW1iZXJ6KSAociBOdW1iZXJ6LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0VHlwZWRlZih0aGluZyBVc2VySWQpIChyIFVzZXJJZCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE1hcE1hcChoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisKKwlyID0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwkJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCQk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEluc2FuaXR5KGFyZ3VtZW50ICpJbnNhbml0eSkgKHIgbWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHksIGVyciBlcnJvcikgeworCXJldHVybiBuaWwsIGVycm9ycy5OZXcoIk5vIEluc2FuaXR5IikKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE11bHRpKGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IE51bWJlcnosIGFyZzUgVXNlcklkKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyID0gTmV3WHRydWN0KCkKKworCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCXIuQnl0ZVRoaW5nID0gYXJnMAorCXIuSTMyVGhpbmcgPSBhcmcxCisJci5JNjRUaGluZyA9IGFyZzIKKwlyZXR1cm4KK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEV4Y2VwdGlvbihhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJc3dpdGNoIGFyZyB7CisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9IGFyZworCQlyZXR1cm4gZQorCWNhc2UgIlRFeGNlcHRpb24iOgorCQlyZXR1cm4gZXJyb3JzLk5ldygiSnVzdCBURXhjZXB0aW9uIikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCXN3aXRjaCBhcmcwIHsKKworCWNhc2UgIlhjZXB0aW9uIjoKKwkJZSA6PSBOZXdYY2VwdGlvbigpCisJCWUuRXJyb3JDb2RlID0gMTAwMQorCQllLk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKwkJcmV0dXJuIG5pbCwgZQorCWNhc2UgIlhjZXB0aW9uMiI6CisJCWUgOj0gTmV3WGNlcHRpb24yKCkKKwkJZS5FcnJvckNvZGUgPSAyMDAyCisJCWUuU3RydWN0VGhpbmcuU3RyaW5nVGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisJCXJldHVybiBuaWwsIGUKKwlkZWZhdWx0OgorCQlyID0gTmV3WHRydWN0KCkKKwkJci5TdHJpbmdUaGluZyA9IGFyZzEKKwkJcmV0dXJuCisJfQorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CisJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL01ha2VmaWxlLmFtIGIvdGVzdC9oYXhlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDQ4M2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCitCSU5fUEhQX1dFQiA9IGJpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocAorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4OiAkKFRIUklGVFRFU1QpCisJJChUSFJJRlRDTUQpICQoVEhSSUZUVEVTVCkKKworYWxsLWxvY2FsOiAkKEJJTl9DUFApICQoQklOX1BIUCkgJChCSU5fUEhQX1dFQikKKworJChCSU5fQ1BQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKworCisKKyNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGZsYXNoCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmEKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YXNjcmlwdAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBuZWtvCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWhheGUgYmluCisKKy5OT1RQQVJBTExFTDoKKworY2hlY2s6IGNoZWNrX2NwcCBcCisJY2hlY2tfcGhwIFwKKwljaGVja19waHBfd2ViIAorCitjaGVja19jcHA6ICQoQklOX0NQUCkgCisJdGltZW91dCAyMCAkKEJJTl9DUFApIHNlcnZlciAmCisJc2xlZXAgMQorCSQoQklOX0NQUCkgY2xpZW50CisJc2xlZXAgMTAKKworY2hlY2tfcGhwOiAkKEJJTl9QSFApIAorCXRpbWVvdXQgMjAgcGhwIC1mICQoQklOX1BIUCkgc2VydmVyICYKKwlzbGVlcCAxCisJcGhwIC1mICQoQklOX1BIUCkgY2xpZW50CisJc2xlZXAgMTAKKworY2hlY2tfcGhwX3dlYjogJChCSU5fUEhQX1dFQikgJChCSU5fQ1BQKQorCXRpbWVvdXQgMjAgcGhwIC1TIDEyNy4wLjAuMTo5MDkwIHJvdXRlci5waHAgJgorCXNsZWVwIDEKKwkkKEJJTl9DUFApIGNsaWVudCAtLXRyYW5zcG9ydCBodHRwCisJc2xlZXAgMTAKKworCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJVGVzdENsaWVudFNlcnZlci5oeHByb2ogXAorCW1ha2VfYWxsLmJhdCBcCisJbWFrZV9hbGwuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9UZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBiL3Rlc3QvaGF4ZS9UZXN0Q2xpZW50U2VydmVyLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk2ZDgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL1Rlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qCkBAIC0wLDAgKzEsNjcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSIyIj4KKyAgPCEtLSBPdXRwdXQgU1dGIG9wdGlvbnMgLS0+CisgIDxvdXRwdXQ+CisgICAgPG1vdmllIG91dHB1dFR5cGU9IkFwcGxpY2F0aW9uIiAvPgorICAgIDxtb3ZpZSBpbnB1dD0iIiAvPgorICAgIDxtb3ZpZSBwYXRoPSJiaW4vVGVzdENsaWVudFNlcnZlciIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vLi4vbGliL2hheGUvc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0PC9wcmVCdWlsZENvbW1hbmQ+CisgIDwhLS0gRXhlY3V0ZWQgYWZ0ZXIgYnVpbGQgLS0+CisgIDxwb3N0QnVpbGRDb21tYW5kIGFsd2F5c1J1bj0iRmFsc2UiIC8+CisgIDwhLS0gT3RoZXIgcHJvamVjdCBvcHRpb25zIC0tPgorICA8b3B0aW9ucz4KKyAgICA8b3B0aW9uIHNob3dIaWRkZW5QYXRocz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiB0ZXN0TW92aWU9IlVua25vd24iIC8+CisgICAgPG9wdGlvbiB0ZXN0TW92aWVDb21tYW5kPSIiIC8+CisgIDwvb3B0aW9ucz4KKyAgPCEtLSBQbHVnaW4gc3RvcmFnZSAtLT4KKyAgPHN0b3JhZ2UgLz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvY3BwLmh4bWwgYi90ZXN0L2hheGUvY3BwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYjUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9jcHAuaHhtbApAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1BQIHRhcmdldAorLWNwcCBiaW4KKworI1RvIHByb2R1Y2UgNjQgYml0IGJpbmFyaWVzIHRoZSBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIEhYQ1BQX002NCBjb21waWxlIHZhcmlhYmxlOgorIy1EIEhYQ1BQX002NAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL2NzaGFycC5oeG1sIGIvdGVzdC9oYXhlL2NzaGFycC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWMwMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvY3NoYXJwLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NTSEFSUCB0YXJnZXQKKy1jcyBiaW4vVHV0b3JpYWwuZXhlCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvZmxhc2guaHhtbCBiL3Rlc3QvaGF4ZS9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjA1NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvZmxhc2guaHhtbApAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjRmxhc2ggdGFyZ2V0Cistc3dmIGJpbi9UdXRvcmlhbC5zd2YKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyMgd2UgbmVlZCBzb21lIGdvb2RpZXMgZnJvbSBzeXMubmV0CisjIC0tbWFjcm8gYWxsb3dQYWNrYWdlKCJzeXMiKQorCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvamF2YS5oeG1sIGIvdGVzdC9oYXhlL2phdmEuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2phdmEuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMgCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmEgdGFyZ2V0CistamF2YSBiaW4vVHV0b3JpYWwuamFyCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvamF2YXNjcmlwdC5oeG1sIGIvdGVzdC9oYXhlL2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzODc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2phdmFzY3JpcHQuaHhtbApAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YVNjcmlwdCB0YXJnZXQKKy1qcyBiaW4vVHV0b3JpYWwuanMKKworI1lvdSBjYW4gdXNlIC1EIHNvdXJjZS1tYXAtY29udGVudCAocmVxdWlyZXMgSGF4ZSAzLjErKSB0byBoYXZlIHRoZSAuaHggCisjZmlsZXMgZGlyZWN0bHkgZW1iZWRkZWQgaW50byB0aGUgbWFwIGZpbGUsIHRoaXMgd2F5IHlvdSBvbmx5IGhhdmUgdG8gCisjdXBsb2FkIGl0LCBhbmQgaXQgd2lsbCBiZSBhbHdheXMgaW4gc3luYyB3aXRoIHRoZSBjb21waWxlZCAuanMgZXZlbiBpZiAKKyN5b3UgbW9kaWZ5IHlvdXIgLmh4IGZpbGVzLgorLUQgc291cmNlLW1hcC1jb250ZW50CisKKyNHZW5lcmF0ZSBzb3VyY2UgbWFwIGFuZCBhZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvbWFrZV9hbGwuYmF0IGIvdGVzdC9oYXhlL21ha2VfYWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWViYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL21ha2VfYWxsLmJhdApAQCAtMCwwICsxLDY4IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKK2lmICIlSE9NRURSSVZFJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSE9NRVBBVEglIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIQVhFUEFUSCUiPT0iIiBnb3RvIE5PVElOU1RBTExFRAorCitzZXQgcGF0aD0lSEFYRVBBVEglOyVIQVhFUEFUSCVcLi5cbmVrbzslcGF0aCUKKworcmVtICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgICAuLlxUaHJpZnRUZXN0LnRocmlmdAoraWYgZXJyb3JsZXZlbCAxIGdvdG8gU1RPUAorCityZW0gIyBpbnZva2UgSGF4ZSBjb21waWxlciBmb3IgYWxsIHRhcmdldHMKK2ZvciAlJWEgaW4gKCouaHhtbCkgZG8gKAorCXJlbSAqIGZpbHRlciBQeXRob24sIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSGF4ZSAzLjEuMyAoYnV0IHdpbGwgYmUgaW4gMy4xLjQpCisJaWYgbm90ICIlJWEiPT0icHl0aG9uLmh4bWwiICgKKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQllY2hvIEJ1aWxkaW5nICUlYSAuLi4KKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQloYXhlICAtLWN3ZCAuICAlJWEKKwkpCispCisKKworZWNoby4KK2VjaG8gZG9uZS4KK3BhdXNlCitnb3RvIGVvZgorCis6Tk9USU5TVEFMTEVECitlY2hvIEZBVEFMOiBFaXRoZXIgSGF4ZSBpcyBub3QgaW5zdGFsbGVkLCBvciB0aGUgSEFYRVBBVEggdmFyaWFibGUgaXMgbm90IHNldC4KK3BhdXNlCitnb3RvIGVvZgorCis6TUlTU0lOR1ZBUlMKK2VjaG8gRkFUQUw6IFVuYWJsZSB0byBsb2NhdGUgaG9tZSBmb2xkZXIuCitlY2hvLgorZWNobyBCb3RoIEhPTUVEUklWRSBhbmQgSE9NRVBBVEggbmVlZCB0byBiZSBzZXQgdG8gcG9pbnQgdG8geW91ciBIb21lIGZvbGRlci4KK2VjaG8gVGhlIGN1cnJlbnQgdmFsdWVzIGFyZToKK2VjaG8gSE9NRURSSVZFPSVIT01FRFJJVkUlCitlY2hvIEhPTUVQQVRIPSVIT01FUEFUSCUKK3BhdXNlCitnb3RvIGVvZgorCis6U1RPUAorcGF1c2UKK2dvdG8gZW9mCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaCBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjJjOWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKKy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLXIgLWdlbiBoYXhlICAuLi9UaHJpZnRUZXN0LnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBpbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvbmVrby5oeG1sIGIvdGVzdC9oYXhlL25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYxZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UdXRvcmlhbC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbCBiL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbApAQCAtMCwwICsxLDQzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLXdlYi1zZXJ2ZXIvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjZGVmaW5lcworLUQgcGhwd2Vic2VydmVyCisKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3BocC5oeG1sIGIvdGVzdC9oYXhlL3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTE4OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcGhwLmh4bWwKQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3Byb2plY3QuaGlkZSBiL3Rlc3QvaGF4ZS9wcm9qZWN0LmhpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjMDliYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9wcm9qZWN0LmhpZGUKQEAgLTAsMCArMSw3NiBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiQXBhY2hlIFRocmlmdCBjcm9zcy1wbGF0Zm9ybSB0ZXN0IGNsaWVudC9zZXJ2ZXIiCisgICAgLCJtYWluIiA6IG51bGwKKyAgICAsInByb2plY3RQYWNrYWdlIiA6ICIiCisgICAgLCJjb21wYW55IiA6ICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSIKKyAgICAsImxpY2Vuc2UiIDogIkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIKKyAgICAsInVybCIgOiAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIgorICAgICwidGFyZ2V0RGF0YSIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImZsYXNoLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vVHV0b3JpYWwuc3dmIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImphdmFzY3JpcHQuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpblxcaW5kZXguaHRtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJuZWtvLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJuZWtvIGJpbi9UdXRvcmlhbC5uIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInBocC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNwcC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL01haW4tZGVidWcuZXhlICBjbGllbnQgLS1wcm90b2NvbCBqc29uIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImphdmEuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjc2hhcnAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVHV0b3JpYWwucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcVGVzdENsaWVudC5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDE4OAorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcVGVzdFNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDg4CisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXFRlc3RDbGllbnQuaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3B5dGhvbi5oeG1sIGIvdGVzdC9oYXhlL3B5dGhvbi5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1R1dG9yaWFsLnB5CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcm91dGVyLnBocCBiL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9Bcmd1bWVudHMuaHggYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzEwNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9Bcmd1bWVudHMuaHgKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKK2ltcG9ydCBoYXhlLmlvLlBhdGg7CisKK3VzaW5nIFN0cmluZ1Rvb2xzOworCisKK2VudW0gUHJvdG9jb2xUeXBlIHsKKyAgICBiaW5hcnk7CisgICAganNvbjsKKyAgICBjb21wYWN0OworfQorCitlbnVtIEVuZHBvaW50VHJhbnNwb3J0IHsKKyAgICBzb2NrZXQ7CisgICAgaHR0cDsKK30KKworZW51bSBTZXJ2ZXJUeXBlIHsKKyAgICBzaW1wbGU7CisgICAgLyoKKyAgICB0aHJlYWRwb29sOworICAgIHRocmVhZGVkOworICAgIG5vbmJsb2NraW5nOworICAgICovCit9CisKKworY2xhc3MgQXJndW1lbnRzCit7CisgICAgcHVibGljIHZhciBwcmludEhlbHBPbmx5KGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdmFyIHNlcnZlcihkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworICAgIHB1YmxpYyB2YXIgc2VydmVydHlwZShkZWZhdWx0LG51bGwpIDogU2VydmVyVHlwZSA9IHNpbXBsZTsKKworICAgIHB1YmxpYyB2YXIgaG9zdChkZWZhdWx0LG51bGwpIDogU3RyaW5nID0gImxvY2FsaG9zdCI7CisgICAgcHVibGljIHZhciBwb3J0KGRlZmF1bHQsbnVsbCkgOiBJbnQgPSA5MDkwOworCisgICAgcHVibGljIHZhciBwcm90b2NvbChkZWZhdWx0LG51bGwpIDogUHJvdG9jb2xUeXBlID0gYmluYXJ5OworICAgIHB1YmxpYyB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiBFbmRwb2ludFRyYW5zcG9ydCA9IHNvY2tldDsKKyAgICBwdWJsaWMgdmFyIGZyYW1lZChkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworICAgIHB1YmxpYyB2YXIgYnVmZmVyZWQoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2YXIgbnVtSXRlcmF0aW9ucyhkZWZhdWx0LG51bGwpIDogSW50ID0gMTsKKyAgICBwdWJsaWMgdmFyIG51bVRocmVhZHMoZGVmYXVsdCxudWxsKSA6IEludCA9IDE7CisgICAgcHVibGljIHZhciBza2lwU3BlZWRUZXN0KGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgICAgICNpZiBzeXMKKyAgICAgICAgICAjaWYgIXBocHdlYnNlcnZlcgorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFBhcnNlQXJncygpOworICAgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgIH0KKyAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgLy9mb3JjaW5nIHNlcnZlcgorICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IGh0dHA7CisgICAgICAgICAgI2VuZAorICAgICAgICAjZWxzZQorICAgICAgICB0cmFjZSgiV046IFBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgcHJvZ3JhbSBhcmd1bWVudHMsIHVzaW5nIGRlZmF1bHRzLiIpOworICAgICAgICAjZW5kCisgICAgfQorCisgICAgI2lmIHN5cworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gR2V0SGVscCgpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIHNQcm9nID0gUGF0aC53aXRob3V0RGlyZWN0b3J5KCBTeXMuZXhlY3V0YWJsZVBhdGgoKSk7CisgICAgICAgIHJldHVybiAiXG4iCisgICAgICAgICAgICArc1Byb2crIiAgW2NsaWVudHxzZXJ2ZXJdICBbb3B0aW9uc11cbiIKKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIk1vZHVzOiBFaXRoZXIgY2xpZW50IG9yIHNlcnZlciwgdGhlIGRlZmF1bHQgaXMgY2xpZW50LlxuIgorICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiQ29tbW9uIG9wdGlvbnM6XG4iCisgICAgICAgICAgICArIiAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlXG4iCisgICAgICAgICAgICArIiAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbiAvIGNvbm5lY3QgdG9cbiIKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICArIiAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KVxuIgorICAgICAgICAgICAgKyIgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKVxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvblxuIgorICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgICAgICsiICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0xcbiIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJTZXJ2ZXIgb25seSBvcHRpb25zOlxuIgorICAgICAgICAgICAgKyIgIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzXG4iCisgICAgICAgICAgICArIiAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFxuIgorICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIlxuIgorICAgICAgICAgICAgKyIgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIFxuIgorICAgICAgICAgICAgKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZVxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIkNsaWVudCBvbmx5IG9wdGlvbnM6XG4iCisgICAgICAgICAgICArIiAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdFxuIgorICAgICAgICAgICAgKyIgIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cFxuIgorICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgICAgICsiICAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcylcbiIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICArIiAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0c1xuIgorICAgICAgICAgICAgKyIgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzXG4iCisgICAgICAgICAgICArIiAgLS1za2lwLXNwZWVkLXRlc3QgICAgICAgICAgIFNraXAgdGhlIHNwZWVkIHRlc3RcbiIKKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIkFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLlxuIgorICAgICAgICAgICAgOworICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZUFyZ3MoKSA6IFZvaWQgeworCisgICAgICAgIHZhciBhcmdzID0gU3lzLmFyZ3MoKS5jb3B5KCk7CisgICAgICAgIGlmKCAoYXJncyA9PSBudWxsKSB8fCAoYXJncy5sZW5ndGggPD0gMCkpIHsKKyAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICBpZiAoIGFyZyA9PSAiY2xpZW50IikgeworICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggYXJnID09ICJzZXJ2ZXIiKSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgbnVtVGhyZWFkcyA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChhcmcgPT0gIi1oIikgfHwgKGFyZyA9PSAiLS1oZWxwIikpIHsKKyAgICAgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICAgICAgU3lzLnByaW50bG4oIEdldEhlbHAoKSk7CisgICAgICAgICAgICBwcmludEhlbHBPbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJGaXJzdCBhcmd1bWVudCBtdXN0IGJlICdzZXJ2ZXInIG9yICdjbGllbnQnIjsKKyAgICAgICAgfQorCisKKyAgICAgICAgd2hpbGUoIGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworCisgICAgICAgICAgICBpZiAoIChhcmcgPT0gIi1oIikgfHwgKGFyZyA9PSAiLS1oZWxwIikpIHsKKyAgICAgICAgICAgICAgICAvLyAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBTeXMucHJpbnRsbiggR2V0SGVscCgpKTsKKyAgICAgICAgICAgICAgICBwcmludEhlbHBPbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tcG9ydCIpIHsKKyAgICAgICAgICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuCisgICAgICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgICAgIHZhciB0bXAgPSBTdGQucGFyc2VJbnQoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHRtcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IG51bWJlciAiK2FyZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tZG9tYWluLXNvY2tldCIpIHsKKyAgICAgICAgICAgICAgICAvLyAgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkKKyAgICAgICAgICAgICAgICB0aHJvdyAiZG9tYWluIHNvY2tldHMgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLW5hbWVkLXBpcGUiKSB7CisgICAgICAgICAgICAgICAgLy8gICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgICAgICAgICAgICB0aHJvdyAibmFtZWQgcGlwZXMgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXByb3RvY29sIikgeworICAgICAgICAgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgICAgIGlmKCBhcmcgPT0gImJpbmFyeSIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBiaW5hcnk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImNvbXBhY3QiKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gY29tcGFjdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAianNvbiIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBqc29uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tc3NsIikgeworICAgICAgICAgICAgICAgIC8vIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgICAgICAgICAgIHRocm93ICJTU0wgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgb25seSBvcHRpb25zOgorICAgICAgICAgICAgICAgIGlmKCBzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VTZXJ2ZXJBcmd1bWVudCggYXJnLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQYXJzZUNsaWVudEFyZ3VtZW50KCBhcmcsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZVNlcnZlckFyZ3VtZW50KCBhcmcgOiBTdHJpbmcsIGFyZ3MgOiBBcnJheTxTdHJpbmc+KSA6IFZvaWQgeworICAgICAgICBpZiAoYXJnID09ICItLXRyYW5zcG9ydCIpIHsKKyAgICAgICAgICAgIC8vICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZQorICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgaWYoIGFyZyA9PSAiYnVmZmVyZWQiKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImZyYW1lZCIpIHsKKyAgICAgICAgICAgICAgICBmcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImh0dHAiKSB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJhbm9ucGlwZSIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiQW5vbiBwaXBlcyB0cmFuc3BvcnQgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXByb2Nlc3Nvci1ldmVudHMiKSB7CisgICAgICAgICAgICB0aHJvdyAiUHJvY2Vzc29yIGV2ZW50cyBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXNlcnZlci10eXBlIikgeworICAgICAgICAgICAgLy8gIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwKKyAgICAgICAgICAgIC8vIG9uZSBvZiAic2ltcGxlIiwgInRocmVhZC1wb29sIiwgInRocmVhZGVkIiwgIm5vbmJsb2NraW5nIgorICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgaWYoIGFyZyA9PSAic2ltcGxlIikgeworICAgICAgICAgICAgICAgIHNlcnZlcnR5cGUgPSBzaW1wbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAidGhyZWFkLXBvb2wiKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYXJnKyIgc2VydmVyIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJ0aHJlYWRlZCIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBhcmcrIiBzZXJ2ZXIgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gIm5vbmJsb2NraW5nIikgeworICAgICAgICAgICAgICAgIHRocm93IGFyZysiIHNlcnZlciBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYXJnID09ICItbiIpIHx8IChhcmcgPT0gIi0td29ya2VycyIpKSB7CisgICAgICAgICAgICAvLyAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBTdGQucGFyc2VJbnQoYXJnKTsKKyAgICAgICAgICAgIGlmKCB0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSB0bXA7CisgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgbnVtYmVyICIrYXJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFBhcnNlQ2xpZW50QXJndW1lbnQoIGFyZyA6IFN0cmluZywgYXJncyA6IEFycmF5PFN0cmluZz4pIDogVm9pZCB7CisgICAgICAgIGlmIChhcmcgPT0gIi0taG9zdCIpIHsKKyAgICAgICAgICAgIC8vICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CisgICAgICAgICAgICBob3N0ID0gYXJncy5zaGlmdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS10cmFuc3BvcnQiKSB7CisgICAgICAgICAgICAvLyAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiggYXJnID09ICJidWZmZXJlZCIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiZnJhbWVkIikgeworICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiaHR0cCIpIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBodHRwOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImV2aHR0cCIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiZXZodHRwIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tYW5vbi1waXBlcyIpIHsKKyAgICAgICAgICAgIC8vICAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcykKKyAgICAgICAgICAgIHRocm93ICJBbm9uIHBpcGVzIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGFyZyA9PSAiLW4iKSB8fCAoYXJnID09ICItLXRlc3Rsb29wcyIpKSB7CisgICAgICAgICAgICAvLyAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cworICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgaWYoIHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHRtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgbnVtYmVyICIrYXJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhcmcgPT0gIi10IikgfHwgKGFyZyA9PSAiLS10aHJlYWRzIikpIHsKKyAgICAgICAgICAgIC8vICAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcworICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgaWYoIHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IHRtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgbnVtYmVyICIrYXJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1za2lwLXNwZWVkLXRlc3QiKSB7CisgICAgICAgICAgICAvLyAgLS1za2lwLXNwZWVkLXRlc3QgICAgICAgICAgICAgIFNraXAgdGhlIHNwZWVkIHRlc3QKKyAgICAgICAgICAgIHNraXBTcGVlZFRlc3QgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjZW5kCisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gSW52YWxpZEFyZyggYXJnIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB0aHJvdyAnSW52YWxpZCBhcmd1bWVudCAkYXJnJzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL01haW4uaHggYi90ZXN0L2hheGUvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViODI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeApAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCitjbGFzcyBNYWluCit7CisgICAgc3RhdGljIGZ1bmN0aW9uIG1haW4oKSB7CisgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgaW5pdFBocFdlYlNlcnZlcigpOworICAgICAgICAvL2NoZWNrIG1ldGhvZAorICAgICAgICBpZihwaHAuV2ViLmdldE1ldGhvZCgpICE9ICdQT1NUJykgeworICAgICAgICAgIFN5cy5wcmludGxuKCdodHRwIGVuZHBvaW50IGZvciB0aHJpZnQgdGVzdCBzZXJ2ZXInKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2VuZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBBcmd1bWVudHMoKTsKKworICAgICAgICAgICAgaWYoIGFyZ3MucHJpbnRIZWxwT25seSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChhcmdzLnNlcnZlcikKKyAgICAgICAgICAgICAgICBUZXN0U2VydmVyLkV4ZWN1dGUoYXJncyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVGVzdENsaWVudC5FeGVjdXRlKGFyZ3MpOworCisgICAgICAgICAgICB0cmFjZSgiQ29tcGxldGVkLiIpOworICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGhwV2ViU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCisgICAgICAgIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykKKyAgICAgICAgeworICAgICAgICAgIC8vIGhhbmRsZSB0cmFjZQorICAgICAgICAgIHZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisgICAgICAgICAgICB2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisgICAgICAgICAgICBmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKyAgICAgICAgICAgICAgZXh0cmEgKz0gIiwiICsgdjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdiArIGV4dHJhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisgICAgICAgICAgU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZAorCit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzMzE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeApAQCAtMCwwICsxLDkzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgaGF4ZS5JbnQzMjsKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5UaW1lcjsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBoYXhlLmRzLk9iamVjdE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworI2lmIGNwcAoraW1wb3J0IGNwcC52bS5UaHJlYWQ7CisjZWxzZQorLy8gbm8gdGhyZWFkIHN1cHBvcnQgKHlldCkKKyNlbmQKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK3VzaW5nIFN0cmluZ1Rvb2xzOworCitjbGFzcyBUZXN0UmVzdWx0cyB7CisgICAgcHJpdmF0ZSB2YXIgc3VjY2Vzc0NudCA6IEludCA9IDA7CisgICAgcHJpdmF0ZSB2YXIgZXJyb3JDbnQgOiBJbnQgPSAwOworICAgIHByaXZhdGUgdmFyIGZhaWxlZFRlc3RzIDogU3RyaW5nID0gIiI7CisgICAgcHJpdmF0ZSB2YXIgcHJpbnRfZGlyZWN0IDogQm9vbCA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfU1VDQ0VTUyAgICAgICAgICAgID0gMHgwMDsgIC8vIG5vIGVycm9ycyBiaXRzIHNldAorICAgIC8vCisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMgID0gMHgwMTsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX1NUUlVDVFMgICAgPSAweDAyOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyA9IDB4MDQ7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfRkFJTEJJVF9FWENFUFRJT05TID0gMHgwODsKKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0FMTF9GQUlMQklUUyAgICAgICA9IDB4MEY7CisgICAgLy8KKyAgICBwcml2YXRlIHZhciB0ZXN0c0V4ZWN1dGVkIDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciB0ZXN0c0ZhaWxlZCA6IEludCA9IDA7CisgICAgcHJpdmF0ZSB2YXIgY3VycmVudFRlc3QgOiBJbnQgPSAwOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGRpcmVjdCA6IEJvb2wpIHsKKyAgICAgICAgcHJpbnRfZGlyZWN0ID0gZGlyZWN0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBTdGFydFRlc3RHcm91cCggZ3JvdXBCaXQgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGN1cnJlbnRUZXN0ID0gZ3JvdXBCaXQ7CisgICAgICAgIHRlc3RzRXhlY3V0ZWQgfD0gZ3JvdXBCaXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEV4cGVjdCggZXhwciA6IEJvb2wsIG1zZyA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgaWYgKCBleHByKSB7CisgICAgICAgICAgICArK3N1Y2Nlc3NDbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2Vycm9yQ250OworICAgICAgICAgICAgdGVzdHNGYWlsZWQgfD0gY3VycmVudFRlc3Q7CisgICAgICAgICAgICBmYWlsZWRUZXN0cyArPSAiXG4gICIgKyBtc2c7CisgICAgICAgICAgICBpZiggcHJpbnRfZGlyZWN0KSB7CisgICAgICAgICAgICAgICAgdHJhY2UoJ0ZBSUw6ICRtc2cnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDYWxjdWxhdGVFeGl0Q29kZSgpIDogSW50IHsKKyAgICAgICAgdmFyIG5vdEV4ZWN1dGVkIDogSW50ID0gRVhJVENPREVfQUxMX0ZBSUxCSVRTICYgKH50ZXN0c0V4ZWN1dGVkKTsKKyAgICAgICAgcmV0dXJuIHRlc3RzRmFpbGVkIHwgbm90RXhlY3V0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFByaW50U3VtbWFyeSgpIDogVm9pZCB7CisgICAgICAgIHZhciB0b3RhbCA9IHN1Y2Nlc3NDbnQgKyBlcnJvckNudDsKKyAgICAgICAgdmFyIHNwID0gTWF0aC5yb3VuZCgoMTAwMCAqIHN1Y2Nlc3NDbnQpIC8gdG90YWwpIC8gMTA7CisgICAgICAgIHZhciBlcCA9IE1hdGgucm91bmQoKDEwMDAgKiBlcnJvckNudCkgLyB0b3RhbCkgLyAxMDsKKworICAgICAgICB0cmFjZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgICAgIHRyYWNlKCdUZXN0cyBleGVjdXRlZCAgICAkdG90YWwnKTsKKyAgICAgICAgdHJhY2UoJ1Rlc3RzIHN1Y2NlZWRlZCAgICRzdWNjZXNzQ250ICgkc3AlKScpOworICAgICAgICB0cmFjZSgnVGVzdHMgZmFpbGVkICAgICAgJGVycm9yQ250ICgkZXAlKScpOworICAgICAgICBpZiAoIGVycm9yQ250ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJz09PT09PT09PT09PT09PT09PT09PT09PT09PScpOworICAgICAgICAgICAgdHJhY2UoJ0ZBSUxFRCBURVNUUzogJGZhaWxlZFRlc3RzJyk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoJz09PT09PT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KK30KKworCitjbGFzcyBUZXN0Q2xpZW50IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhlY3V0ZShhcmdzIDogQXJndW1lbnRzKSA6ICBWb2lkCisgICAgeworICAgICAgICB2YXIgZXhpdENvZGUgPSAweEZGOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRpZmZ0ID0gVGltZXIuc3RhbXAoKTsKKworICAgICAgICAgICAgaWYgKCBhcmdzLm51bVRocmVhZHMgPiAxKSB7CisgICAgICAgICAgICAgICAgI2lmIGNwcAorICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gTXVsdGlUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICB0cmFjZSgnVGhyZWFkcyBub3Qgc3VwcG9ydGVkL2ltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtLicpOworICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpZmZ0ID0gTWF0aC5yb3VuZCggMTAwMCAqIChUaW1lci5zdGFtcCgpIC0gZGlmZnQpKSAvIDEwMDA7CisgICAgICAgICAgICB0cmFjZSgndG90YWwgdGVzdCB0aW1lOiAkZGlmZnQgc2Vjb25kcycpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb246ICRlJyk7CisgICAgICAgICAgICBleGl0Q29kZSA9IDB4RkY7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnRXhjZXB0aW9uOiAkZScpOworICAgICAgICAgICAgZXhpdENvZGUgPSAweEZGOworICAgICAgICB9CisKKyAgICAgICAgI2lmIHN5cworICAgICAgICBTeXMuZXhpdCggZXhpdENvZGUpOworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNpbmdsZVRocmVhZENsaWVudChhcmdzIDogQXJndW1lbnRzKSA6ICBJbnQKKyAgICB7CisgICAgICAgIHZhciByc2x0ID0gbmV3IFRlc3RSZXN1bHRzKHRydWUpOworICAgICAgICBSdW5DbGllbnQoYXJncyxyc2x0KTsKKyAgICAgICAgcnNsdC5QcmludFN1bW1hcnkoKTsKKyAgICAgICAgcmV0dXJuIHJzbHQuQ2FsY3VsYXRlRXhpdENvZGUoKTsKKyAgICB9CisKKworICAgICNpZiBjcHAKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE11bHRpVGhyZWFkQ2xpZW50KGFyZ3MgOiBBcmd1bWVudHMpIDogIEludAorICAgIHsKKyAgICAgICAgdmFyIHRocmVhZHMgPSBuZXcgTGlzdDxUaHJlYWQ+KCk7CisgICAgICAgIGZvciggdGVzdCBpbiAwIC4uLiBhcmdzLm51bVRocmVhZHMpIHsKKyAgICAgICAgICAgIHRocmVhZHMuYWRkKCBTdGFydFRocmVhZCggYXJncykpOworICAgICAgICB9CisgICAgICAgIHZhciBleGl0Q29kZSA6IEludCA9IDA7CisgICAgICAgIGZvciggdGhyZWFkIGluIHRocmVhZHMpIHsKKyAgICAgICAgICAgIGV4aXRDb2RlIHw9IFRocmVhZC5yZWFkTWVzc2FnZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpdENvZGU7CisgICAgfQorICAgICNlbmQKKworICAgICNpZiBjcHAKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBTdGFydFRocmVhZChhcmdzIDogQXJndW1lbnRzKSA6IFRocmVhZCB7CisgICAgICAgIHZhciB0aHJlYWQgPSBUaHJlYWQuY3JlYXRlKAorICAgICAgICAgICAgZnVuY3Rpb24oKSA6IFZvaWQgeworICAgICAgICAgICAgICAgIHZhciByc2x0ID0gbmV3IFRlc3RSZXN1bHRzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2YXIgbWFpbiA6IFRocmVhZCA9IFRocmVhZC5yZWFkTWVzc2FnZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJ1bkNsaWVudChhcmdzLHJzbHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICckZScpOworICAgICAgICAgICAgICAgICAgICB0cmFjZSgnJGUnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAnJGUnKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2UoJyRlJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1haW4uc2VuZE1lc3NhZ2UoIHJzbHQuQ2FsY3VsYXRlRXhpdENvZGUoKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0aHJlYWQuc2VuZE1lc3NhZ2UoVGhyZWFkLmN1cnJlbnQoKSk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorICAgICNlbmQKKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKQorICAgIHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICBzd2l0Y2ggKGFyZ3MudHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHNvY2tldDoKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCk7CisgICAgICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHthcmdzLmhvc3R9OiR7YXJncy5wb3J0fSc7CisgICAgICAgICAgICAgICAgdHJhY2UoJy0gaHR0cCBjbGllbnQgOiAke3VyaX0nKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3B0aW9uYWw6IGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgIGlmICggYXJncy5mcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhcmdzLmJ1ZmZlcmVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb3RvY29sCisgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG51bGw7CisgICAgICAgIHN3aXRjaCggYXJncy5wcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGJpbmFyeToKKyAgICAgICAgICAgIHRyYWNlKCItIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgIGNhc2UganNvbjoKKyAgICAgICAgICAgIHRyYWNlKCItIGpzb24gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgY2FzZSBjb21wYWN0OgorICAgICAgICAgICAgdHJhY2UoIi0gY29tcGFjdCBwcm90b2NvbCIpOworICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc29tZSBxdWljayBhbmQgYmFzaWMgdW5pdCB0ZXN0cworICAgICAgICBIYXhlQmFzaWNzVGVzdCggYXJncywgcnNsdCk7CisgICAgICAgIE1vZHVsZVVuaXRUZXN0cyggYXJncywgcnNsdCk7CisKKyAgICAgICAgLy8gbm93IHJ1biB0aGUgdGVzdCBjb2RlCisgICAgICAgIHRyYWNlKCctICR7YXJncy5udW1JdGVyYXRpb25zfSBpdGVyYXRpb25zJyk7CisgICAgICAgIGZvciggaSBpbiAwIC4uLiBhcmdzLm51bUl0ZXJhdGlvbnMpIHsKKyAgICAgICAgICAgIENsaWVudFRlc3QoIHRyYW5zcG9ydCwgcHJvdG9jb2wsIGFyZ3MsIHJzbHQpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEhheGVCYXNpY3NUZXN0KCBhcmdzIDogQXJndW1lbnRzLCByc2x0IDogVGVzdFJlc3VsdHMpIDogVm9pZAorICAgIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byB0ZXN0IGEgZmV3IGJhc2ljIHRoaW5ncyB1c2VkIGluIHRoZSBDbGllbnRUZXN0CisgICAgICAgIC8vIEFueXRoaW5nIGVsc2UgYmV5b25kIHRoaXMgc2NvcGUgc2hvdWxkIGdvIGludG8gL2xpYi9oYXhlLyBpbnN0ZWFkCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTKTsKKworICAgICAgICB2YXIgbWFwMzIgPSBuZXcgSW50TWFwPEludDMyPigpOworICAgICAgICB2YXIgbWFwNjQgPSBuZXcgSW50NjRNYXA8SW50MzI+KCk7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmtleXMoKS5oYXNOZXh0KCkgPT0gbWFwNjQua2V5cygpLmhhc05leHQoKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQ3MTEpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLnJlbW92ZSggNDcxMSkgPT0gbWFwNjQucmVtb3ZlKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM0Iik7CisKKyAgICAgICAgbWFwMzIuc2V0KCA0MiwgODE1KTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsNDIpLCA4MTUpOworICAgICAgICBtYXAzMi5zZXQoIC01MTcsIDIzKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpLCAyMyk7CisgICAgICAgIG1hcDMyLnNldCggMCwgLTEyMyk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubWFrZSgwLDApLCAtMTIzKTsKKworICAgICAgICAvL3RyYWNlKCdtYXAzMiA9ICRtYXAzMicpOworICAgICAgICAvL3RyYWNlKCdtYXA2NCA9ICRtYXA2NCcpOworCisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5rZXlzKCkuaGFzTmV4dCgpID09IG1hcDY0LmtleXMoKS5oYXNOZXh0KCksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTAiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDcxMSkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTEiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggLTUxNykgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0MikgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAwKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCwwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTQiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDcxMSkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTUiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggLTUxNykgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxNiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0MikgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICNJbnQ2NC5tYWtlKC01LDE3KSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAwKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCwwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTgiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLnJlbW92ZSggNDcxMSkgPT0gbWFwNjQucmVtb3ZlKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTkiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLnJlbW92ZSggLTUxNykgPT0gbWFwNjQucmVtb3ZlKCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyMCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyMSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAtNTE3KSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQyKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDApID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyNCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyNSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAtNTE3KSA9PSBtYXA2NC5nZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI2Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQyKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI3Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDApID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyOCIpOworCisgICAgICAgIG1hcDMyLnNldCggNDIsIDEpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm1ha2UoMCw0MiksIDEpOworICAgICAgICBtYXAzMi5zZXQoIC01MTcsIC0yKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpLCAtMik7CisgICAgICAgIG1hcDMyLnNldCggMCwgMyk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubWFrZSgwLDApLCAzKTsKKworICAgICAgICB2YXIgYzMyID0gMDsKKyAgICAgICAgdmFyIGtzdW0zMiA9IDA7CisgICAgICAgIGZvciAoa2V5IGluIG1hcDMyLmtleXMoKSkgeworICAgICAgICAgICAgKytjMzI7CisgICAgICAgICAgICBrc3VtMzIgKz0ga2V5OworICAgICAgICB9CisgICAgICAgIHZhciBjNjQgPSAwOworICAgICAgICB2YXIga3N1bTY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICBmb3IgKGtleSBpbiBtYXA2NC5rZXlzKCkpIHsKKyAgICAgICAgICAgICsrYzY0OworICAgICAgICAgICAga3N1bTY0ID0gSW50NjQuYWRkKCBrc3VtNjQsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcnNsdC5FeHBlY3QoIGMzMiA9PSBjNjQsICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMzAiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoICcka3N1bTY0JyA9PSAnJGtzdW0zMicsICcka3N1bTY0ID09ICRrc3VtMzIgICBUZXN0ICMzMScpOworCisgICAgICAgIC8vY29tcGFyZSB3aXRob3V0IHNwYWNlcyBiZWNhdXNlIGRpZmZlciBpbiBwaHAgYW5kIGNwcAorICAgICAgICB2YXIgczMyID0gbWFwMzIudG9TdHJpbmcoKS5yZXBsYWNlKCcgJywgJycpOworICAgICAgICB2YXIgczY0ID0gbWFwNjQudG9TdHJpbmcoKS5yZXBsYWNlKCcgJywgJycpOworICAgICAgICByc2x0LkV4cGVjdCggczMyID09IHM2NCwgIkludDY0TWFwPEludDMyPi50b1N0cmluZygpOiAiICsgJyAoIiRzMzIiID09ICIkczY0IikgVGVzdCAjMzInKTsKKworICAgICAgICBtYXAzMi5yZW1vdmUoIDQyKTsKKyAgICAgICAgbWFwNjQucmVtb3ZlKCBJbnQ2NC5tYWtlKDAsNDIpKTsKKyAgICAgICAgbWFwMzIucmVtb3ZlKCAtNTE3KTsKKyAgICAgICAgbWFwNjQucmVtb3ZlKCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKTsKKyAgICAgICAgbWFwMzIucmVtb3ZlKCAwKTsKKyAgICAgICAgbWFwNjQucmVtb3ZlKCBJbnQ2NC5tYWtlKDAsMCkpOworCisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5rZXlzKCkuaGFzTmV4dCgpID09IG1hcDY0LmtleXMoKS5oYXNOZXh0KCksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTAiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDcxMSkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTEiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggLTUxNykgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0MikgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAwKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCwwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTQiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDcxMSkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTUiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggLTUxNykgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKC01LDE3KSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTYiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDIpID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggMCkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsIDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5OCIpOworICAgIH0KKworCisgICAgLy8gY29yZSBtb2R1bGUgdW5pdCB0ZXN0cworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTW9kdWxlVW5pdFRlc3RzKCBhcmdzIDogQXJndW1lbnRzLCByc2x0IDogVGVzdFJlc3VsdHMpIDogVm9pZCB7CisgICAgICAgICNpZiBkZWJ1ZworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRDb252ZXJ0ZXIuVW5pdFRlc3QoKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAnQml0Q29udmVydGVyLlVuaXRUZXN0ICBUZXN0ICMxMDAnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ0JpdENvbnZlcnRlci5Vbml0VGVzdDogJGUgIFRlc3QgIzEwMCcpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFppZ1phZy5Vbml0VGVzdCgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICdaaWdaYWcuVW5pdFRlc3QgIFRlc3QgIzEwMScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogRHluYW1pYykgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAnWmlnWmFnLlVuaXRUZXN0OiAkZSAgVGVzdCAjMTAxJyk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJ5dGVzVG9IZXgoZGF0YSA6IEJ5dGVzKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBoZXggPSAiIjsKKyAgICAgICAgZm9yICggaSBpbiAwIC4uLiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgaGV4ICs9IFN0cmluZ1Rvb2xzLmhleCggZGF0YS5nZXQoaSksIDIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZXg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQcmVwYXJlVGVzdERhdGEocmFuZG9tRGlzdCA6IEJvb2wpIDogQnl0ZXMgICAgeworICAgICAgICB2YXIgcmV0dmFsID0gQnl0ZXMuYWxsb2MoMHgxMDApOworICAgICAgICB2YXIgaW5pdExlbiA6IEludCA9IChyZXR2YWwubGVuZ3RoID4gMHgxMDAgPyAweDEwMCA6IHJldHZhbC5sZW5ndGgpOworCisgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgIGlmICghcmFuZG9tRGlzdCkgeworICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIGluaXRMZW4pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwuc2V0KGksIGkgJSAweDEwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICBmb3IgKGkgaW4gMCAuLi4gaW5pdExlbikgeworICAgICAgICAgICAgcmV0dmFsLnNldChpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgaW4gMSAuLi4gaW5pdExlbikgeworICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICB2YXIgbmV4dFBvcyA9IFN0ZC5yYW5kb20oaW5pdExlbik7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbC5nZXQobmV4dFBvcykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwuc2V0KCBuZXh0UG9zLCBpICUgMHgxMDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ2xpZW50VGVzdCggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgcHJvdG9jb2wgOiBUUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzIDogQXJndW1lbnRzLCByc2x0IDogVGVzdFJlc3VsdHMpIDogVm9pZAorICAgIHsKKyAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0SW1wbChwcm90b2NvbCxwcm90b2NvbCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5pc09wZW4oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndW5hYmxlIHRvIG9wZW4gdHJhbnNwb3J0OiAkZScpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndW5hYmxlIHRvIG9wZW4gdHJhbnNwb3J0OiAkZScpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKTsKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMpOworCisgICAgICAgIC8vIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICAgICB0cmFjZSgndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpIHNob3VsZCB0aHJvdycpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogWGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBlLm1lc3NhZ2UgPT0gIlhjZXB0aW9uIiwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gIGUubWVzc2FnZSA9PSAiWGNlcHRpb24iJyk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZS5lcnJvckNvZGUgPT0gMTAwMSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gIGUuZXJyb3JDb2RlID09IDEwMDEnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gICR7ZX0gOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICAkZScpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgICAgIHRyYWNlKCd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIiknKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgc2hvdWxkIHRocm93Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSAgLSAgJGUgOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgIC0gICRlJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW9wZW4gdGhlIHRyYW5zcG9ydCwganVzdCBpbiBjYXNlIHRoZSBzZXJ2ZXIgY2xvc2VkIGhpcyBlbmQKKyAgICAgICAgaWYgKHRyYW5zcG9ydC5pc09wZW4oKSkKKyAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICB0cmFuc3BvcnQub3BlbigpOworCisgICAgICAgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgICAgIHRyYWNlKCd0ZXN0RXhjZXB0aW9uKCJibGEiKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oImJsYSIpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJibGEiKSBzaG91bGQgbm90IHRocm93Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJibGEiKSAgLSAgJHtlfSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAkZScpOworICAgICAgICB9CisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOworCisgICAgICAgIHRyYWNlKCd0ZXN0Vm9pZCgpJyk7CisgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICB0cmFjZSgnID0gdm9pZCcpOworICAgICAgICByc2x0LkV4cGVjdCh0cnVlLCJ0ZXN0Vm9pZCgpIik7ICAvLyBidW1wIGNvdW50ZXIKKworICAgICAgICB0cmFjZSgndGVzdEJvb2woJHt0cnVlfSknKTsKKyAgICAgICAgdmFyIGIgPSBjbGllbnQudGVzdEJvb2wodHJ1ZSk7CisgICAgICAgIHRyYWNlKCcgPSAkYicpOworICAgICAgICByc2x0LkV4cGVjdChiLCAnJGIgPT0gIiR7dHJ1ZX0iJyk7CisgICAgICAgIHRyYWNlKCd0ZXN0Qm9vbCgke2ZhbHNlfSknKTsKKyAgICAgICAgYiA9IGNsaWVudC50ZXN0Qm9vbChmYWxzZSk7CisgICAgICAgIHRyYWNlKCcgPSAkYicpOworICAgICAgICByc2x0LkV4cGVjdCggISBiLCAnJGIgPT0gIiR7ZmFsc2V9IicpOworCisgICAgICAgIHRyYWNlKCd0ZXN0U3RyaW5nKCJUZXN0IiknKTsKKyAgICAgICAgdmFyIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgICAgICB0cmFjZSgnID0gIiRzIicpOworICAgICAgICByc2x0LkV4cGVjdChzID09ICJUZXN0IiwgJyRzID09ICJUZXN0IicpOworCisgICAgICAgIHRyYWNlKCd0ZXN0Qnl0ZSgxKScpOworICAgICAgICB2YXIgaTggPSBjbGllbnQudGVzdEJ5dGUoMSk7CisgICAgICAgIHRyYWNlKCcgPSAkaTgnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoaTggPT0gMSwgJyRpOCA9PSAxJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RJMzIoLTEpJyk7CisgICAgICAgIHZhciBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICAgIHRyYWNlKCcgPSAkaTMyJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGkzMiA9PSAtMSwgJyRpMzIgPT0gLTEnKTsKKworICAgICAgICB0cmFjZSgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CisgICAgICAgIHZhciBpNjQgPSBjbGllbnQudGVzdEk2NCggSW50NjQubWFrZSggMHhGRkZGRkZGOCwgMHgwMDAwMDAwMCkpOyAvLyAtMzQzNTk3MzgzNjgKKyAgICAgICAgdHJhY2UoJyA9ICRpNjQnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGk2NCwgSW50NjQubWFrZSggMHhGRkZGRkZGOCwgMHgwMDAwMDAwMCkpID09IDAsCisgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cihpNjQpICsiID09ICIrSW50NjQudG9TdHIoSW50NjQubWFrZSggMHhGRkZGRkZGOCwgMHgwMDAwMDAwMCkpKTsKKworICAgICAgICAvLyBlZGdlIGNhc2U6IHRoZSBsYXJnZXN0IG5lZ2F0aXZlIEludDY0IGhhcyBubyBwb3NpdGl2ZSBJbnQ2NCBlcXVpdmFsZW50CisgICAgICAgIHRyYWNlKCd0ZXN0STY0KC05MjIzMzcyMDM2ODU0Nzc1ODA4KScpOworICAgICAgICBpNjQgPSBjbGllbnQudGVzdEk2NCggSW50NjQubWFrZSggMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpOyAvLyAtOTIyMzM3MjAzNjg1NDc3NTgwOAorICAgICAgICB0cmFjZSgnID0gJGk2NCcpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggaTY0LCBJbnQ2NC5tYWtlKCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKGk2NCkgKyIgPT0gIitJbnQ2NC50b1N0cihJbnQ2NC5tYWtlKCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkpOworCisgICAgICAgIHRyYWNlKCd0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KScpOworICAgICAgICB2YXIgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICB0cmFjZSgnID0gJGR1YicpOworICAgICAgICByc2x0LkV4cGVjdChkdWIgPT0gNS4zMjUwOTgyMzUsICckZHViID09IDUuMzI1MDk4MjM1Jyk7CisKKyAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgdHJhY2UoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgpID0gJytCeXRlc1RvSGV4KGJpbkluKSk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggYmluSW4ubGVuZ3RoID09IGJpbk91dC5sZW5ndGgsICcke2JpbkluLmxlbmd0aH0gPT0gJHtiaW5PdXQubGVuZ3RofScpOworICAgICAgICAgICAgdmFyIGxlbiA9ICgoYmluSW4ubGVuZ3RoIDwgYmluT3V0Lmxlbmd0aCkgID8gIGJpbkluLmxlbmd0aCAgOiBiaW5PdXQubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAob2ZzIGluIDAgLi4uIGxlbikgeworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5nZXQob2ZzKSAhPSBiaW5PdXQuZ2V0KG9mcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKTogY29udGVudCBtaXNtYXRjaCBhdCBvZmZzZXQgJG9mcycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyk6ICcrZS5lcnJvck1zZyk7ICAvLyBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCisgICAgICAgIH0KKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RTdHJ1Y3QoeyJaZXJvIiwgMSwgLTMsIC01fSknKTsKKyAgICAgICAgdmFyIG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgIG8uc3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICBvLmJ5dGVfdGhpbmcgPSAxOworICAgICAgICBvLmkzMl90aGluZyA9IC0zOworICAgICAgICBvLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMCwtNSk7CisgICAgICAgIHZhciBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7CisgICAgICAgIHRyYWNlKCcgPSB7IicgKyBpLnN0cmluZ190aGluZyArICciLCAnICsgaS5ieXRlX3RoaW5nICsnLCAnCisgICAgICAgICAgICAgICAgICAgICAgKyBpLmkzMl90aGluZyArJywgJysgSW50NjQudG9TdHIoaS5pNjRfdGhpbmcpICsgJ30nKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuc3RyaW5nX3RoaW5nID09IG8uc3RyaW5nX3RoaW5nLCAiaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmcsICJpLmJ5dGVfdGhpbmcgPT0gby5ieXRlX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmkzMl90aGluZyA9PSBvLmkzMl90aGluZywgImkuaTY0X3RoaW5nID09IG8uaTY0X3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmkzMl90aGluZyA9PSBvLmkzMl90aGluZywgImkuaTY0X3RoaW5nID09IG8uaTY0X3RoaW5nIik7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9KScpOworICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICBvMi5ieXRlX3RoaW5nID0gMTsKKyAgICAgICAgbzIuc3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgbzIuaTMyX3RoaW5nID0gNTsKKyAgICAgICAgdmFyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgICAgICAgaSA9IGkyLnN0cnVjdF90aGluZzsKKyAgICAgICAgdHJhY2UoIiA9IHsiICsgaTIuYnl0ZV90aGluZyArICIsIHtcIiIgKyBpLnN0cmluZ190aGluZyArICJcIiwgIgorICAgICAgICAgICAgICArIGkuYnl0ZV90aGluZyArICIsICIgKyBpLmkzMl90aGluZyArICIsICIgKyBJbnQ2NC50b1N0cihpLmk2NF90aGluZykgKyAifSwgIgorICAgICAgICAgICAgICArIGkyLmkzMl90aGluZyArICJ9Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpMi5ieXRlX3RoaW5nID09IG8yLmJ5dGVfdGhpbmcsICJpMi5ieXRlX3RoaW5nID09IG8yLmJ5dGVfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkyLmkzMl90aGluZyA9PSBvMi5pMzJfdGhpbmcsICJpMi5pMzJfdGhpbmcgPT0gbzIuaTMyX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLnN0cmluZ190aGluZyA9PSBvLnN0cmluZ190aGluZywgImkuc3RyaW5nX3RoaW5nID09IG8uc3RyaW5nX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmJ5dGVfdGhpbmcgPT0gby5ieXRlX3RoaW5nLCAiaS5ieXRlX3RoaW5nID09IG8uYnl0ZV90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5pMzJfdGhpbmcgPT0gby5pMzJfdGhpbmcsICJpLmkzMl90aGluZyA9PSBvLmkzMl90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggaS5pNjRfdGhpbmcsIG8uaTY0X3RoaW5nKSA9PSAwLCAiaS5pNjRfdGhpbmcgPT0gby5pNjRfdGhpbmciKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyk7CisKKyAgICAgICAgdmFyIG1hcG91dCA9IG5ldyBJbnRNYXA8IGhheGUuSW50MzI+KCk7CisgICAgICAgIGZvciAoIGogaW4gMCAuLi4gNSkKKyAgICAgICAgeworICAgICAgICAgICAgbWFwb3V0LnNldChqLCBqIC0gMTApOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwKHsiKTsKKyAgICAgICAgdmFyIGZpcnN0IDogQm9vbCA9IHRydWU7CisgICAgICAgIGZvcigga2V5IGluIG1hcG91dC5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSkiKTsKKworICAgICAgICB2YXIgbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworCisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gbWFwaW4ua2V5cygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4gIiArIG1hcGluLmdldChrZXkpKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBtYXBpbi5nZXQoa2V5KSA9PSBtYXBvdXQuZ2V0KGtleSksICcgbWFwaW4uZ2V0KCRrZXkpID09IG1hcG91dC5nZXQoJGtleSknKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSIpOworICAgICAgICBmb3IoIGtleSBpbiBtYXBvdXQua2V5cygpKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdChtYXBpbi5leGlzdHMoa2V5KSwgJ21hcGluLmV4aXN0cygka2V5KScpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxpc3RvdXQgPSBuZXcgTGlzdDxJbnQ+KCk7CisgICAgICAgIGZvciAoaiBpbiAtMiAuLi4gMykKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdG91dC5hZGQoaik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGogaW4gbGlzdG91dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSkiKTsKKworICAgICAgICB2YXIgbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworCisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIGxpc3RpbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSIpOworCisgICAgICAgIHJzbHQuRXhwZWN0KGxpc3Rpbi5sZW5ndGggPT0gbGlzdG91dC5sZW5ndGgsICJsaXN0aW4ubGVuZ3RoID09IGxpc3RvdXQubGVuZ3RoIik7CisgICAgICAgIHZhciBsaXRlcm91dCA9IGxpc3RvdXQuaXRlcmF0b3IoKTsKKyAgICAgICAgdmFyIGxpdGVyaW4gPSBsaXN0aW4uaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoIGxpdGVyaW4uaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByc2x0LkV4cGVjdChsaXRlcmluLm5leHQoKSA9PSBsaXRlcm91dC5uZXh0KCksICJsaXRlcmluW2ldID09IGxpdGVyb3V0W2ldIik7CisgICAgICAgIH0KKworICAgICAgICAvL3NldAorICAgICAgICB2YXIgc2V0b3V0ID0gbmV3IEludFNldCgpOworICAgICAgICBmb3IgKGogaW4gLTIgLi4uIDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldG91dC5hZGQoaik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoInRlc3RTZXQoeyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciggaiBpbiBzZXRvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoaik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0pIik7CisKKyAgICAgICAgdmFyIHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKworICAgICAgICB0cmFjZSgiID0geyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciggaiBpbiBzZXRpbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShqKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KHNldG91dC5jb250YWlucyhqKSwgJ3NldG91dC5jb250YWlucygkaiknKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSIpOworICAgICAgICByc2x0LkV4cGVjdChzZXRpbi5zaXplID09IHNldG91dC5zaXplLCAic2V0aW4ubGVuZ3RoID09IHNldG91dC5sZW5ndGgiKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oT05FKSIpOworICAgICAgICB2YXIgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5PTkUsICckcmV0ID09IE51bWJlcnouT05FJyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5UV08sICckcmV0ID09IE51bWJlcnouVFdPJyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgICAgIHRyYWNlKCIgPSAiICsgcmV0KTsKKyAgICAgICAgcnNsdC5FeHBlY3QocmV0ID09IE51bWJlcnouVEhSRUUsICckcmV0ID09IE51bWJlcnouVEhSRUUnKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICAgIHRyYWNlKCIgPSAiICsgcmV0KTsKKyAgICAgICAgcnNsdC5FeHBlY3QocmV0ID09IE51bWJlcnouRklWRSwgJyRyZXQgPT0gTnVtYmVyei5GSVZFJyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgICAgICAgIHRyYWNlKCIgPSAiICsgcmV0KTsKKyAgICAgICAgcnNsdC5FeHBlY3QocmV0ID09IE51bWJlcnouRUlHSFQsICckcmV0ID09IE51bWJlcnouRUlHSFQnKTsKKworICAgICAgICB0cmFjZSgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgICAgICB2YXIgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKCBJbnQ2NC5tYWtlKCAweDExOUQwLCAweDdFMDg2NzFCKSk7ICAvLyAzMDk4NTgyMzUwODI1MjMKKyAgICAgICAgdHJhY2UoIiA9ICIgKyB1aWQpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggdWlkLCBJbnQ2NC5tYWtlKCAweDExOUQwLCAweDdFMDg2NzFCKSkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKHVpZCkrIiA9PSAiK0ludDY0LnRvU3RyKEludDY0Lm1ha2UoIDB4MTE5RDAsIDB4N0UwODY3MUIpKSk7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgIHZhciBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICB0cmFjZSgiID0geyIpOworICAgICAgICBmb3IoIGtleSBpbiBtbS5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgdmFyIG0yID0gbW0uZ2V0KGtleSk7CisgICAgICAgICAgICBmb3IoIGsyIGluIG0yLmtleXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShrMiArICIgPT4gIiArIG0yLmdldChrMikgKyAiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKCJ9LCAiKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSIpOworCisgICAgICAgIHZhciBwb3MgPSBtbS5nZXQoNCk7CisgICAgICAgIHZhciBuZWcgPSBtbS5nZXQoLTQpOworICAgICAgICByc2x0LkV4cGVjdCggKHBvcyAhPSBudWxsKSAmJiAobmVnICE9IG51bGwpLCAiKHBvcyAhPSBudWxsKSAmJiAobmVnICE9IG51bGwpIik7CisgICAgICAgIGZvciAoaSBpbiAxIC4uLiA1KSB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggcG9zLmdldChpKSA9PSBpLCAncG9zLmdldCgkaSkgPT0gJGknKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBuZWcuZ2V0KC1pKSA9PSAtaSwgJ25lZy5nZXQoLSRpKSA9PSAtJGknKTsKKyAgICAgICAgfQorICAgICAgICByc2x0LkV4cGVjdCggISBwb3MuZXhpc3RzKDApLCAnIXBvcy5leGlzdHMoMCknKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoICEgbmVnLmV4aXN0cygtMCksICchbmVnLmV4aXN0cygtMCknKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoICEgcG9zLmV4aXN0cyg0MiksICchcG9zLmV4aXN0cyg0MiknKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoICEgbmVnLmV4aXN0cygtNDIpLCAnIW5lZy5leGlzdHMoLTQyKScpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTKTsKKworICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEludE1hcDwgSW50NjQ+KCk7CisgICAgICAgIGluc2FuZS51c2VyTWFwLnNldCggTnVtYmVyei5GSVZFLCBJbnQ2NC5tYWtlKDAsNTAwMCkpOworICAgICAgICB2YXIgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7CisgICAgICAgIHRydWNrLmJ5dGVfdGhpbmcgPSA4OworICAgICAgICB0cnVjay5pMzJfdGhpbmcgPSA4OworICAgICAgICB0cnVjay5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsOCk7CisgICAgICAgIGluc2FuZS54dHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOworICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQodHJ1Y2spOworICAgICAgICB0cmFjZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgdmFyIHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZvcigga2V5IGluIHdob2Eua2V5cygpKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsID0gd2hvYS5nZXQoa2V5KTsKKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICBmb3IoIGsyIGluIHZhbC5rZXlzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsLmdldChrMik7CisKKyAgICAgICAgICAgICAgICB0cmFjZShrMiArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIudXNlck1hcDsKKworICAgICAgICAgICAgICAgIHRyYWNlKCJ7Iik7CisgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggazMgaW4gdXNlck1hcC5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2UoIm51bGwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2UoIn0sICIpOworCisgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOworCisgICAgICAgICAgICAgICAgdHJhY2UoInsiKTsKKyAgICAgICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJ7XCIiICsgeC5zdHJpbmdfdGhpbmcgKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeC5ieXRlX3RoaW5nICsgIiwgIiArIHguaTMyX3RoaW5nICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4LmkzMl90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFjZSgibnVsbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgifSIpOworCisgICAgICAgICAgICAgICAgdHJhY2UoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2UoIn0sICIpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisKKworCQkvKioKKwkJKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKwkJKgorCQkqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorCQkqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKwkJKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisJCSogICAgICAgICAgfSwKKwkJKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisJCSogICB9CisJCSogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisJCSovCisJCQorICAgICAgICB2YXIgZmlyc3RfbWFwID0gd2hvYS5nZXQoSW50NjQubWFrZSgwLDEpKTsKKyAgICAgICAgdmFyIHNlY29uZF9tYXAgPSB3aG9hLmdldChJbnQ2NC5tYWtlKDAsMikpOworICAgICAgICByc2x0LkV4cGVjdCggKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSwgIihmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCkiKTsKKyAgICAgICAgaWYgKChmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjcmF6eTIgPSBmaXJzdF9tYXAuZ2V0KE51bWJlcnouVFdPKTsKKyAgICAgICAgICAgIHZhciBjcmF6eTMgPSBmaXJzdF9tYXAuZ2V0KE51bWJlcnouVEhSRUUpOworICAgICAgICAgICAgdmFyIGxvb25leSA9IHNlY29uZF9tYXAuZ2V0KE51bWJlcnouU0lYKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCAoY3JhenkyICE9IG51bGwpICYmIChjcmF6eTMgIT0gbnVsbCkgJiYgKGxvb25leSAhPSBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY3JhenkyICE9IG51bGwpICYmIChjcmF6eTMgIT0gbnVsbCkgJiYgKGxvb25leSAhPSBudWxsKSIpOworCisgICAgICAgICAgICB2YXIgY3J6Mml0ZXIgPSBjcmF6eTIueHRydWN0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgdmFyIGNyejNpdGVyID0gY3JhenkzLnh0cnVjdHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpLCAiY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSIpOworICAgICAgICAgICAgdmFyIGdvb2RieWUyID0gY3J6Mml0ZXIubmV4dCgpOworICAgICAgICAgICAgdmFyIGdvb2RieWUzID0gY3J6M2l0ZXIubmV4dCgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoICEgKGNyejJpdGVyLmhhc05leHQoKSB8fCBjcnozaXRlci5oYXNOZXh0KCkpLCAiISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSkiKTsKKworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5Mi51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpLCBpbnNhbmUudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSkgPT0gMCwgImNyYXp5Mi51c2VyTWFwWzVdID09IGluc2FuZS51c2VyTWFwWzVdIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUyLnN0cmluZ190aGluZywgInRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMi5zdHJpbmdfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMi5ieXRlX3RoaW5nLCAidHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTIuYnl0ZV90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTIuaTMyX3RoaW5nLCAidHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMi5pMzJfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB0cnVjay5pNjRfdGhpbmcsIGdvb2RieWUyLmk2NF90aGluZykgPT0gMCwgInRydWNrLmk2NF90aGluZyAgPT0gZ29vZGJ5ZTIuaTY0X3RoaW5nIik7CisKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTMudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgaW5zYW5lLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSkpID09IDAsICJjcmF6eTMudXNlck1hcFs1XSA9PSBpbnNhbmUudXNlck1hcFs1XSIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMy5zdHJpbmdfdGhpbmcsICJ0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTMuYnl0ZV90aGluZywgInRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUzLmJ5dGVfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUzLmkzMl90aGluZywgInRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTMuaTMyX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggdHJ1Y2suaTY0X3RoaW5nLCBnb29kYnllMy5pNjRfdGhpbmcpID09IDAsICJ0cnVjay5pNjRfdGhpbmcgID09IGdvb2RieWUzLmk2NF90aGluZyIpOworCQkJCisJCQlyc2x0LkV4cGVjdCggISBsb29uZXkuaXNTZXQoMSksICIhIGxvb25leS5pc1NldCgxKSIpOworCQkJcnNsdC5FeHBlY3QoICEgbG9vbmV5LmlzU2V0KDIpLCAiISBsb29uZXkuaXNTZXQoMikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhcmcwID0gMTsKKyAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICB2YXIgYXJnMiA9IEludDY0Lm1ha2UoIDB4N0ZGRkZGRkYsMHhGRkZGRkZGRik7CisgICAgICAgIHZhciBtdWx0aURpY3QgPSBuZXcgSW50TWFwPCBTdHJpbmc+KCk7CisgICAgICAgIG11bHRpRGljdC5zZXQoMSwgIm9uZSIpOworICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgdmFyIGFyZzUgPSBJbnQ2NC5tYWtlKDAsNTAwMDAwMCk7CisgICAgICAgIHRyYWNlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOworICAgICAgICB0cmFjZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuYnl0ZV90aGluZyArICIsc3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLnN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLmkzMl90aGluZworICAgICAgICAgICAgICAgICAgICArICIsaTY0X3RoaW5nOiIgKyBJbnQ2NC50b1N0cihtdWx0aVJlc3BvbnNlLmk2NF90aGluZykgKyAiKSIpOworCisgICAgICAgIHJzbHQuRXhwZWN0KCBtdWx0aVJlc3BvbnNlLnN0cmluZ190aGluZyA9PSAiSGVsbG8yIiwgJ211bHRpUmVzcG9uc2UuU3RyaW5nX3RoaW5nID09ICJIZWxsbzIiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtdWx0aVJlc3BvbnNlLmJ5dGVfdGhpbmcgPT0gYXJnMCwgJ211bHRpUmVzcG9uc2UuQnl0ZV90aGluZyA9PSBhcmcwJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtdWx0aVJlc3BvbnNlLmkzMl90aGluZyA9PSBhcmcxLCAnbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgPT0gYXJnMScpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggbXVsdGlSZXNwb25zZS5pNjRfdGhpbmcsIGFyZzIpID09IDAsICdtdWx0aVJlc3BvbnNlLkk2NF90aGluZyA9PSBhcmcyJyk7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCAwKTsKKworICAgICAgICB0cmFjZSgiVGVzdCBPbmV3YXkoMSkiKTsKKyAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisKKyAgICAgICAgaWYoICEgYXJncy5za2lwU3BlZWRUZXN0KSB7CisgICAgICAgICAgICB0cmFjZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgZGlmZnQgPSBUaW1lci5zdGFtcCgpOworICAgICAgICAgICAgZm9yICggayBpbiAwIC4uLiAxMDAwKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWZmdCA9IE1hdGgucm91bmQoIDEwMDAgKiAoVGltZXIuc3RhbXAoKSAtIGRpZmZ0KSkgLyAxMDAwOworICAgICAgICAgICAgdHJhY2UoJyRkaWZmdCBtcyBwZXIgdGVzdFZvaWQoKSBjYWxsJyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RNYWNyby5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdE1hY3JvLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjA3NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RNYWNyby5oeApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgOworCitpbXBvcnQgaGF4ZS5tYWNyby5Db250ZXh0OworaW1wb3J0IGhheGUubWFjcm8uRXhwcjsKKworLyoqKioKKyAqIElmIHlvdSBjYWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhpcyB3YXkgKGUuZy4gYnkgY2hhbmdpbmcgdGhlIHByZWJ1aWxkIGNvbW1hbmQpCisgKgorICogICAgIHRocmlmdCAtciAtZ2VuIGhheGU6YnVpbGRtYWNybz1UZXN0TWFjcm8uaGFuZGxlKCkgICAuLi9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIHRoZSBUZXN0TWFjcm8uaGFuZGxlKCkgZnVuY3Rpb24gaW1wbGVtZW50ZWQgYmVsb3cgaXMgY2FsbGVkIGZvciBlYWNoIGdlbmVyYXRlZCBjbGFzcworICogYW5kIGludGVyZmFjZS4gVXNlICJ0aHJpZnQgLS1oZWxwIiB0byBnZXQgbW9yZSBpbmZvIGFib3V0IG90aGVyIGF2YWlsYWJsZSBvcHRpb25zLgorICovCitjbGFzcyBUZXN0TWFjcm8KK3sKKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGUoICkgOiBBcnJheTwgRmllbGQ+IHsKKyAgICB0cmFjZSgnVGVzdE1hY3JvIGNhbGxlZCBmb3IgJyArIENvbnRleHQuZ2V0TG9jYWxUeXBlKCkpOworICAgIHJldHVybiBDb250ZXh0LmdldEJ1aWxkRmllbGRzKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MGM4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFRlc3RTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEV4ZWN1dGUoYXJncyA6IEFyZ3VtZW50cykgOiAgVm9pZAorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoKCBhcmdzLnRyYW5zcG9ydCkgeworICAgICAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gc29ja2V0IHBvcnQgIithcmdzLnBvcnQpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCBhcmdzLnBvcnQpOworICAgICAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGh0dHAiKTsKKyAgICAgICAgICAgICAgICAjaWYgIXBocHdlYnNlcnZlcgorICAgICAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAgICAvL3RyYW5zcG9ydCA9IG5ldyBUSHR0cFNlcnZlciggdGFyZ2V0SG9zdCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSAgICBuZXcgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgdHJhbnNwb3J0IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3B0aW9uYWw6IGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICB2YXIgdHJhbnNmYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgaWYgKCBhcmdzLmZyYW1lZCkgeworICAgICAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICB0cmFuc2ZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYXJncy5idWZmZXJlZCkgeworICAgICAgICAgICAgICAgIHRyYWNlKCItIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHByb3RvY29sCisgICAgICAgICAgICB2YXIgcHJvdGZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCggYXJncy5wcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgICAgIGNhc2UganNvbjoKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBqc29uIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgICAgIGNhc2UgY29tcGFjdDoKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IFRlc3RTZXJ2ZXJIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3RQcm9jZXNzb3IoaGFuZGxlcik7CisKKyAgICAgICAgICAgIC8vIFNpbXBsZSBTZXJ2ZXIKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgOiBUU2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCggYXJncy5zZXJ2ZXJ0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBzaW1wbGU6CisgICAgICAgICAgICAgICAgdmFyIHNpbXBsZVNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICAgICAgICAgIHNpbXBsZVNlcnZlci5ydW5PbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICAgICAgc2VydmVyID0gc2ltcGxlU2VydmVyOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgc2VydmVyIHR5cGUiOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAvLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgaWYoIGFyZ3Muc2VydmVyRXZlbnRzKSB7CisgICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9IG5ldyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgc2VydmVyLnNldEV2ZW50SGFuZGxlcihzZXJ2ZXJFdmVudHMpOworICAgICAgICAgICAgICAgIGhhbmRsZXIuc2VydmVyID0gc2VydmVyRW5naW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLy8gUnVuIGl0CisgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsKKyAgICAgICAgICAgIHRyYWNlKCJkb25lLiIpOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHggOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnJHggJHt4LmVycm9ySUR9ICR7eC5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoeCA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckeCcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyRXZlbnRIYW5kbGVyLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyRXZlbnRIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzU2N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworY2xhc3MgVGVzdFNlcnZlckV2ZW50SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIKK3sKKyAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKQorICAgIHsKKyAgICAgICAgY2FsbENvdW50Kys7CisgICAgfQorICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgeworICAgICAgICBjYWxsQ291bnQrKzsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgeworICAgICAgICBjYWxsQ291bnQrKzsKKyAgICB9Cit9CisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGEyNTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeApAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOworCitpbXBvcnQgaGF4ZS5JbnQzMjsKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7CitpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7CitpbXBvcnQgaGF4ZS5kcy5PYmplY3RNYXA7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBUZXN0U2VydmVySGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QgeworCisgICAgcHVibGljIHZhciBzZXJ2ZXI6VFNlcnZlcjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgInRlc3RWb2lkKCkiIGFuZCByZXR1cm5zIG5vdGhpbmcuCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWQoKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdFZvaWQoKSIpOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0Qm9vbCgiJXMiKScgd2hlcmUgJyVzJyB3aXRoIHRoaW5nIGFzICd0cnVlJyBvciAnZmFsc2UnCisgICAgKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50CisgICAgKiBAcmV0dXJuIGJvb2wgIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJvb2wodGhpbmcgOiBCb29sKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHRyYWNlKCd0ZXN0Qm9vbCgkdGhpbmcpJyk7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisgICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorICAgICogQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcodGhpbmc6U3RyaW5nKTpTdHJpbmcKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0c3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RCeXRlKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICAqIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGJ5dGUgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gYnl0ZSAtIHJldHVybnMgdGhlIGJ5dGUgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlKHRoaW5nOmhheGUuSW50MzIpOmhheGUuSW50MzIKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIGkzMiB0aGluZyAtIHRoZSBpMzIgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gaTMyIC0gcmV0dXJucyB0aGUgaTMyICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyKHRoaW5nOmhheGUuSW50MzIpOmhheGUuSW50MzIKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0STMyKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEk2NCgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAorICAgICogQHJldHVybiBpNjQgLSByZXR1cm5zIHRoZSBpNjQgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjQodGhpbmc6aGF4ZS5JbnQ2NCk6aGF4ZS5JbnQ2NAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RJNjQoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0RG91YmxlKCIlZiIpJyB3aXRoIHRoaW5nIGFzICclZicKKyAgICAqIEBwYXJhbSBkb3VibGUgdGhpbmcgLSB0aGUgZG91YmxlIHRvIHByaW50CisgICAgKiBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZSh0aGluZzpGbG9hdCk6RmxvYXQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKyAgICAgKiBAcGFyYW0gYmluYXJ5ICB0aGluZyAtIHRoZSBiaW5hcnkgZGF0YSB0byBwcmludAorICAgICAqIEByZXR1cm4gYmluYXJ5ICAtIHJldHVybnMgdGhlIGJpbmFyeSAndGhpbmcnCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeSh0aGluZyA6IGhheGUuaW8uQnl0ZXMpIDogaGF4ZS5pby5CeXRlcworICAgIHsKKyAgICAgICAgdmFyIGhleCA9ICIiOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIHRoaW5nLmxlbmd0aCkgeworICAgICAgICAgICAgaGV4ICs9IFN0cmluZ1Rvb2xzLmhleCggdGhpbmcuZ2V0KGkpLCAyKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgkaGV4KScpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisgICAgKiBAcGFyYW0gWHRydWN0IHRoaW5nIC0gdGhlIFh0cnVjdCB0byBwcmludAorICAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIHRoZSBYdHJ1Y3QgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3QodGhpbmc6WHRydWN0KTpYdHJ1Y3QKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0U3RydWN0KHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHRoaW5nLnN0cmluZ190aGluZyArICJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKHRoaW5nLmk2NF90aGluZykgKyAifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TmVzdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mIHRoZSBuZXN0ZWQgc3RydWN0CisgICAgKiBAcGFyYW0gWHRydWN0MiB0aGluZyAtIHRoZSBYdHJ1Y3QyIHRvIHByaW50CisgICAgKiBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdChuZXN0Olh0cnVjdDIpOlh0cnVjdDIKKyAgICB7CisgICAgICAgIHZhciB0aGluZzpYdHJ1Y3QgPSBuZXN0LnN0cnVjdF90aGluZzsKKyAgICAgICAgdHJhY2UoInRlc3ROZXN0KHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5ieXRlX3RoaW5nICsgIiwgeyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIodGhpbmcuaTY0X3RoaW5nKSArICJ9LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5pMzJfdGhpbmcgKyAifSkiKTsKKyAgICAgICAgcmV0dXJuIG5lc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RNYXAoInslcyIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gbWFwPGkzMixpMzI+IC0gcmV0dXJucyB0aGUgbWFwPGkzMixpMzI+ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwKHRoaW5nOkludE1hcDxoYXhlLkludDMyPik6SW50TWFwPGhheGUuSW50MzI+CisgICAgeworICAgICAgICB0cmFjZSgidGVzdE1hcCh7Iik7CisgICAgICAgIHZhciBmaXJzdDpCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yIChrZXkgaW4gdGhpbmcua2V5cygpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+ICIgKyB0aGluZy5nZXQoa2V5KSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNlKCJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RTdHJpbmdNYXAoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKyAgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICAqIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIG1hcDxzdHJpbmcsc3RyaW5nPiAtIHJldHVybnMgdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcCh0aGluZzpTdHJpbmdNYXA8U3RyaW5nPik6U3RyaW5nTWFwPFN0cmluZz4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGtleSBpbiB0aGluZy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4gIiArIHRoaW5nLmdldChrZXkpKTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2UoIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKyAgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICAqIEBwYXJhbSBzZXQ8aTMyPiB0aGluZyAtIHRoZSBzZXQ8aTMyPiB0byBwcmludAorICAgICogQHJldHVybiBzZXQ8aTMyPiAtIHJldHVybnMgdGhlIHNldDxpMzI+ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0KHRoaW5nOkludFNldCk6SW50U2V0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdFNldCh7Iik7CisgICAgICAgIHZhciBmaXJzdDpCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yIChlbGVtIGluIHRoaW5nKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cmFjZShlbGVtKTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2UoIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisgICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAgKiBAcGFyYW0gbGlzdDxpMzI+IHRoaW5nIC0gdGhlIGxpc3Q8aTMyPiB0byBwcmludAorICAgICogQHJldHVybiBsaXN0PGkzMj4gLSByZXR1cm5zIHRoZSBsaXN0PGkzMj4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0KHRoaW5nOkxpc3Q8aGF4ZS5JbnQzMj4pOkxpc3Q8aGF4ZS5JbnQzMj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgIHZhciBmaXJzdDpCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yIChlbGVtIGluIHRoaW5nKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cmFjZShlbGVtKTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2UoIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEVudW0oIiVkIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGl0J3MgbnVtZXJpYyB2YWx1ZQorICAgICogQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorICAgICogQHJldHVybiBOdW1iZXJ6IC0gcmV0dXJucyB0aGUgTnVtYmVyeiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW0odGhpbmc6SW50KTpJbnQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bSgiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RUeXBlZGVmKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICAqIEBwYXJhbSBVc2VySWQgdGhpbmcgLSB0aGUgVXNlcklkIHRvIHByaW50CisgICAgKiBAcmV0dXJuIFVzZXJJZCAtIHJldHVybnMgdGhlIFVzZXJJZCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWYodGhpbmc6aGF4ZS5JbnQ2NCk6aGF4ZS5JbnQ2NAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdE1hcE1hcCgiJWQiKScgd2l0aCBoZWxsbyBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIGhlbGxvIC0gdGhlIGkzMiB0byBwcmludAorICAgICogQHJldHVybiBtYXA8aTMyLG1hcDxpMzIsaTMyPj4gLSByZXR1cm5zIGEgZGljdGlvbmFyeSB3aXRoIHRoZXNlIHZhbHVlczoKKyAgICAqICAgey00ID0+IHstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMSwgfSwKKyAgICAqICAgICA0ID0+IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICAqCisgICAgKiBAcGFyYW0gaGVsbG8KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwKGhlbGxvOmhheGUuSW50MzIpOkludE1hcDxJbnRNYXA8aGF4ZS5JbnQzMj4+CisgICAgeworICAgICAgICB0cmFjZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOworICAgICAgICB2YXIgbWFwbWFwID0gbmV3IEludE1hcDxJbnRNYXA8SW50Pj4oKTsKKyAgICAgICAgdmFyIHBvcyA9IG5ldyBJbnRNYXA8SW50PigpOworICAgICAgICB2YXIgbmVnID0gbmV3IEludE1hcDxJbnQ+KCk7CisgICAgICAgIGZvciAoaSBpbiAxIC4uLiA1KSB7CisgICAgICAgICAgICBwb3Muc2V0KGksIGkpOworICAgICAgICAgICAgbmVnLnNldCgtaSwgLWkpOworICAgICAgICB9OworICAgICAgICBtYXBtYXAuc2V0KDQsIHBvcyk7CisgICAgICAgIG1hcG1hcC5zZXQoLTQsIG5lZyk7CisgICAgICAgIHJldHVybiBtYXBtYXA7CisgICAgfQorCisgICAgLyoqCisgICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICAqCisgICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAqICAgICAgICAgIH0sCisgICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgKiAgIH0KKyAgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgICoKKyAgICAqIEBwYXJhbSBhcmd1bWVudAorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eShhcmd1bWVudCA6IEluc2FuaXR5KSA6IEludDY0TWFwPCBJbnRNYXA8IEluc2FuaXR5Pj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0SW5zYW5pdHkoKSIpOworCisgICAgICAgIHZhciBmaXJzdF9tYXAgPSBuZXcgSW50TWFwPCBJbnNhbml0eT4oKTsKKyAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICAgICAgICBmaXJzdF9tYXAuc2V0KE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKworICAgICAgICB2YXIgc2Vjb25kX21hcCA9IG5ldyBJbnRNYXA8IEluc2FuaXR5PigpOworICAgICAgICB2YXIgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgIHNlY29uZF9tYXAuc2V0KE51bWJlcnouU0lYLCBsb29uZXkpOworCisgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgSW50NjRNYXA8IEludE1hcDwgSW5zYW5pdHk+PigpOworICAgICAgICBpbnNhbmUuc2V0KCBJbnQ2NC5tYWtlKDAsMSksIGZpcnN0X21hcCk7CisgICAgICAgIGluc2FuZS5zZXQoIEludDY0Lm1ha2UoMCwyKSwgc2Vjb25kX21hcCk7CisKKyAgICAgICAgcmV0dXJuIGluc2FuZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdE11bHRpKCknCisgICAgKiBAcGFyYW0gYnl0ZSBhcmcwIC0KKyAgICAqIEBwYXJhbSBpMzIgYXJnMSAtCisgICAgKiBAcGFyYW0gaTY0IGFyZzIgLQorICAgICogQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisgICAgKiBAcGFyYW0gTnVtYmVyeiBhcmc0IC0KKyAgICAqIEBwYXJhbSBVc2VySWQgYXJnNSAtCisgICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0CisgICAgKiAgICB3aXRoIHN0cmluZ190aGluZyA9ICJIZWxsbzIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxCisgICAgKiAgICBhbmQgaTY0X3RoaW5nID0gYXJnMgorICAgICoKKyAgICAqIEBwYXJhbSBhcmcwCisgICAgKiBAcGFyYW0gYXJnMQorICAgICogQHBhcmFtIGFyZzIKKyAgICAqIEBwYXJhbSBhcmczCisgICAgKiBAcGFyYW0gYXJnNAorICAgICogQHBhcmFtIGFyZzUKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMDpoYXhlLkludDMyLCBhcmcxOmhheGUuSW50MzIsIGFyZzI6aGF4ZS5JbnQ2NCwKKyAgICAgICAgYXJnMzpJbnRNYXA8U3RyaW5nPiwgYXJnNDpJbnQsIGFyZzU6aGF4ZS5JbnQ2NCk6WHRydWN0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdE11bHRpKCkiKTsKKyAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOworICAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CisgICAgICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgICAgIHJldHVybiBoZWxsbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICoKKyAgICAqIEBwYXJhbSBhcmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uKGFyZzpTdHJpbmcpOlZvaWQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0RXhjZXB0aW9uKCIgKyBhcmcgKyAiKSIpOworICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9OworICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCisgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICogaWYgYXJnMCA9PSAiWGNlcHRpb24iCisgICAgKiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAqIGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIgorICAgICogdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICAqCisgICAgKiBAcGFyYW0gYXJnMAorICAgICogQHBhcmFtIGFyZzEKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMDpTdHJpbmcsIGFyZzE6U3RyaW5nKTpYdHJ1Y3QKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpIik7CisgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9IGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAyMDAyOworICAgICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgcmVzdWx0LnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKyAgICAqIHNsZWVwICdzZWNvbmRzVG9TbGVlcCcKKyAgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyEnIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgICogQHBhcmFtIGkzMiBzZWNvbmRzVG9TbGVlcCAtIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBzbGVlcAorICAgICoKKyAgICAqIEBwYXJhbSBzZWNvbmRzVG9TbGVlcAorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXA6aGF4ZS5JbnQzMik6Vm9pZAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RPbmV3YXkoIiArIHNlY29uZHNUb1NsZWVwICsgIiksIHNsZWVwaW5nLi4uIik7CisgICAgICAgIFN5cy5zbGVlcChzZWNvbmRzVG9TbGVlcCk7CisgICAgICAgIHRyYWNlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdG9wKCk6Vm9pZAorICAgIHsKKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2EzZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTE0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KGhzX3Rlc3RfZ2VuCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvQ29uc3RhbnRzRGVtb19UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRGVidWdQcm90b1Rlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9JbmNsdWRlX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWRfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXBfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXAuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2X0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfSWZhY2UuaHMKKykKKworc2V0KGhzX2Nyb3NzdGVzdF9hcHBzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1Rlc3RTZXJ2ZXIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdENsaWVudAorKQorc2V0KGhzX2Nyb3NzdGVzdF9hcmdzCisgICAgLWlnZW4taHMKKyAgICAtb2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAtaGlkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CispCisKK2lmIChDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlKCkKKyAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hzX2Nyb3NzdGVzdF9hcHBzfQorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0U2VydmVyLmhzIC1vIFRlc3RTZXJ2ZXIKKyAgICBDT01NQU5EICR7R0hDfSAke2hzX29wdGltaXplfSAke2hzX2Nyb3NzdGVzdF9hcmdzfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVGVzdENsaWVudC5ocyAtbyBUZXN0Q2xpZW50CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSBoYXNrZWxsX2xpYnJhcnkgVGVzdFNlcnZlci5ocyBUZXN0Q2xpZW50LmhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2Nyb3NzdGVzdCBBTEwKKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGNyb3NzIHRlc3QgZXhlY3V0YWJsZXMiCisgICAgREVQRU5EUyAke2hzX2Nyb3NzdGVzdF9hcHBzfQorKQorCitzZXQoaHNfdGVzdF9zb3VyY2VzCisgICAgQ29uc3RhbnRzRGVtb19NYWluLmhzCisgICAgRGVidWdQcm90b1Rlc3RfTWFpbi5ocworICAgIEluY2x1ZGVfTWFpbi5ocworICAgIFRocmlmdFRlc3RfTWFpbi5ocworKQorc2V0KGhzX3Rlc3RfYXJncworICAgIC1XYWxsCisgICAgLVhTY29wZWRUeXBlVmFyaWFibGVzCisgICAgLWkke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2hzL3NyYworICAgIC1pJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocworKQorYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF90ZXN0cyBBTEwgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSkKK2ZvcmVhY2goU1JDICR7aHNfdGVzdF9zb3VyY2VzfSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEJBU0UgJHtTUkN9IE5BTUVfV0UpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsVGVzdHMtJHtCQVNFfQorICAgICAgICBDT01NQU5EICR7UlVOX0hBU0tFTEx9ICR7aHNfdGVzdF9hcmdzfSAke1NSQ30KKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorZW5kZm9yZWFjaCgpCisKK3NldChoc190ZXN0X2dlbl9zb3VyY2VzCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CispCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7aHNfdGVzdF9nZW59CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VuX3NvdXJjZXN9CispCmRpZmYgLS1naXQgYS90ZXN0L2hzL0NsaWVudC5ocyBiL3Rlc3QvaHMvQ2xpZW50LmhzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU0ZDkwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHMvQ2xpZW50LmhzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLW1vZHVsZSBDbGllbnQgd2hlcmUKLQotaW1wb3J0IFRocmlmdFRlc3RfQ2xpZW50Ci1pbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcwotaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0Ci1pbXBvcnQgQ29udHJvbC5Nb25hZAotaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uIGFzIENFCi0KLWltcG9ydCBOZXR3b3JrCi0KLWltcG9ydCBUaHJpZnQKLWltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQotaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKLQotCi1zZXJ2ZXJBZGRyZXNzID0gKCIxMjcuMC4wLjEiLCBQb3J0TnVtYmVyIDkwOTApCi0KLW1haW4gPSBkbyB0byA8LSBoT3BlbiBzZXJ2ZXJBZGRyZXNzCi0gICAgICAgICAgbGV0IHAgPSAgQmluYXJ5UHJvdG9jb2wgdG8KLSAgICAgICAgICBsZXQgcHMgPSAocCxwKQotICAgICAgICAgIHByaW50ID08PCB0ZXN0U3RyaW5nIHBzICJieWEiCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RCeXRlIHBzIDgKLSAgICAgICAgICBwcmludCA9PDwgdGVzdEJ5dGUgcHMgKC04KQotICAgICAgICAgIHByaW50ID08PCB0ZXN0STMyIHBzIDMyCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RJMzIgcHMgKC0zMikKLSAgICAgICAgICBwcmludCA9PDwgdGVzdEk2NCBwcyA2NAotICAgICAgICAgIHByaW50ID08PCB0ZXN0STY0IHBzICgtNjQpCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3REb3VibGUgcHMgMy4xNAotICAgICAgICAgIHByaW50ID08PCB0ZXN0RG91YmxlIHBzICgtMy4xNCkKLSAgICAgICAgICBwcmludCA9PDwgdGVzdE1hcCBwcyAoTWFwLmZyb21MaXN0IFsoMSwxKSwoMiwyKSwoMywzKV0pCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RMaXN0IHBzIFsxLDIsMyw0LDVdCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RTZXQgcHMgKFNldC5mcm9tTGlzdCBbMSwyLDMsNCw1XSkKLSAgICAgICAgICBwcmludCA9PDwgdGVzdFN0cnVjdCBwcyAoWHRydWN0IChKdXN0ICJoaSIpIChKdXN0IDQpIChKdXN0IDUpIE5vdGhpbmcpCi0gICAgICAgICAgQ0UuY2F0Y2ggKHRlc3RFeGNlcHRpb24gcHMgImUiID4+IHByaW50ICJiYWQiKSAoXGUgLT4gcHJpbnQgKGUgOjogWGNlcHRpb24pKQotICAgICAgICAgIENFLmNhdGNoICh0ZXN0TXVsdGlFeGNlcHRpb24gcHMgImUiICJlMiIgPj4gcHJpbnQgIm9rIikgKFxlIC0+IHByaW50IChlIDo6IFhjZXB0aW9uKSkKLSAgICAgICAgICBDRS5jYXRjaCAoQ0UuY2F0Y2ggKHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAiZSIgImUyIj4+IHByaW50ICJiYWQiKSAoXGUgLT4gcHJpbnQgKGUgOjogWGNlcHRpb24yKSkpIChcKGUgOjogU29tZUV4Y2VwdGlvbikgLT4gcHJpbnQgIm9rIikKLSAgICAgICAgICB0Q2xvc2UgdG8KLQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9Db25zdGFudHNEZW1vX01haW4uaHMgYi90ZXN0L2hzL0NvbnN0YW50c0RlbW9fTWFpbi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRlNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9Db25zdGFudHNEZW1vX01haW4uaHMKQEAgLTAsMCArMSw2OCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBNYWluIHdoZXJlCisKKworaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IHF1YWxpZmllZCBOZXR3b3JrCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlNlcnZlcgoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCisKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdFV0aWxzCisKK2ltcG9ydCBxdWFsaWZpZWQgWW93emEKK2ltcG9ydCBxdWFsaWZpZWQgWW93emFfQ2xpZW50IGFzIENsaWVudAoraW1wb3J0IHF1YWxpZmllZCBZb3d6YV9JZmFjZSBhcyBJZmFjZQorCisKK2RhdGEgWW93emFIYW5kbGVyID0gWW93emFIYW5kbGVyCitpbnN0YW5jZSBJZmFjZS5Zb3d6YV9JZmFjZSBZb3d6YUhhbmRsZXIgd2hlcmUKKyAgICBibGluZ2l0eSBfID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiU0VSVkVSOiBHb3QgYmxpbmdpdHkiCisgICAgICAgIHJldHVybiAoKQorCisgICAgYmxhbmdpdHkgXyA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIlNFUlZFUjogR290IGJsYW5naXR5IgorICAgICAgICByZXR1cm4gJCAzMQorCisKK2NsaWVudCA6OiAoU3RyaW5nLCBOZXR3b3JrLlBvcnRJRCkgLT4gSU8gKCkKK2NsaWVudCBhZGRyID0gZG8KKyAgICB0byA8LSBoT3BlbiBhZGRyCisgICAgbGV0IHBzID0gKEJpbmFyeVByb3RvY29sIHRvLCBCaW5hcnlQcm90b2NvbCB0bykKKworICAgIENsaWVudC5ibGluZ2l0eSBwcworCisgICAgcnYgPC0gQ2xpZW50LmJsYW5naXR5IHBzCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgcnYKKworICAgIHRDbG9zZSB0bworCitzZXJ2ZXIgOjogTmV0d29yay5Qb3J0TnVtYmVyIC0+IElPICgpCitzZXJ2ZXIgcG9ydCA9IGRvIAorICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIlJlYWR5Li4uIgorICAgIChydW5CYXNpY1NlcnZlciBZb3d6YUhhbmRsZXIgWW93emEucHJvY2VzcyBwb3J0KQorICAgIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAKKyAgICAoXChUcmFuc3BvcnRFeG4gcyBfKSAtPiBlcnJvciAkICJGQUlMVVJFOiAiICsrIHNob3cgcykKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IFRocmlmdFRlc3RVdGlscy5ydW5UZXN0IHNlcnZlciBjbGllbnQKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocyBiL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI4OTYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCkBAIC0wLDAgKzEsMTY4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorCittb2R1bGUgTWFpbiB3aGVyZQorCisKK2ltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgREJMCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCitpbXBvcnQgcXVhbGlmaWVkIE5ldHdvcmsKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuU2VydmVyCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKKworaW1wb3J0IHF1YWxpZmllZCBUaHJpZnRUZXN0VXRpbHMKKworaW1wb3J0IHF1YWxpZmllZCBEZWJ1Z1Byb3RvVGVzdF9UeXBlcyBhcyBUeXBlcworaW1wb3J0IHF1YWxpZmllZCBJbmhlcml0ZWQKK2ltcG9ydCBxdWFsaWZpZWQgSW5oZXJpdGVkX0NsaWVudCBhcyBJQ2xpZW50CitpbXBvcnQgcXVhbGlmaWVkIEluaGVyaXRlZF9JZmFjZSBhcyBJSWZhY2UKK2ltcG9ydCBxdWFsaWZpZWQgU3J2X0NsaWVudCBhcyBTQ2xpZW50CitpbXBvcnQgcXVhbGlmaWVkIFNydl9JZmFjZSBhcyBTSWZhY2UKKworLS0gd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0aGlzIGltcG9ydCwgYnV0IGZvcmNlIGl0IHRvIGNoZWNrIHRoZSBjb2RlIGdlbmVyYXRvciBleHBvcnRzIHByb3BlciBIYXNrZWxsIHN5bnRheAoraW1wb3J0IHF1YWxpZmllZCBTcnYoKQorCisKK2RhdGEgSW5oZXJpdGVkSGFuZGxlciA9IEluaGVyaXRlZEhhbmRsZXIKK2luc3RhbmNlIFNJZmFjZS5TcnZfSWZhY2UgSW5oZXJpdGVkSGFuZGxlciB3aGVyZQorICAgIGphbmt5IF8gYXJnID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkICJHb3QgamFua3kgbWV0aG9kIGNhbGw6ICIgKysgc2hvdyBhcmcKKyAgICAgICAgcmV0dXJuICQgMzEKKworICAgIHZvaWRNZXRob2QgXyA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIkdvdCB2b2lkTWV0aG9kIG1ldGhvZCBjYWxsIgorICAgICAgICByZXR1cm4gKCkKKworICAgIHByaW1pdGl2ZU1ldGhvZCBfID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiR290IHByaW1pdGl2ZU1ldGhvZCBjYWxsIgorICAgICAgICByZXR1cm4gJCA0MgorCisgICAgc3RydWN0TWV0aG9kIF8gPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJHb3Qgc3RydWN0TWV0aG9kIGNhbGwiCisgICAgICAgIHJldHVybiAkIFR5cGVzLkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgeworICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2J5dGUgPSAweDAxLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kxNiA9IDB4MDIsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTMyID0gMHgwMywKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9pNjQgPSAweDA0LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2RvdWJsZSA9IDAuMSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9zdHJpbmcgPSAiYWJjZGVmIiwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9iaW5hcnkgPSBEQkwuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3RydWVfZmllbGQgPSBUcnVlLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9mYWxzZV9maWVsZCA9IEZhbHNlLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9lbXB0eV9zdHJ1Y3RfZmllbGQgPSBUeXBlcy5FbXB0eSwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RydWN0X2xpc3QgPSBWZWN0b3IuZW1wdHksCisKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kzMl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cmluZ19zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fc2V0ID0gU2V0LmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJ1Y3Rfc2V0ID0gU2V0LmVtcHR5LAorCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pNjRfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9iaW5hcnlfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pMTZfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2kzMl9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTY0X21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9kb3VibGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3N0cmluZ19tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfYmluYXJ5X21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9ib29sZWFuX21hcCA9IE1hcC5lbXB0eSwKKworICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9saXN0X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zZXRfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X21hcF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKworICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX21hcF9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfc2V0X21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9saXN0X21hcCA9IE1hcC5lbXB0eSB9CisKKyAgICBtZXRob2RXaXRoRGVmYXVsdEFyZ3MgXyBhcmcgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgIkdvdCBtZXRob2RXaXRoRGVmYXVsdEFyZ3M6ICIgKysgc2hvdyBhcmcKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBvbmV3YXlNZXRob2QgXyA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIkdvdCBvbmV3YXlNZXRob2QiCisKK2luc3RhbmNlIElJZmFjZS5Jbmhlcml0ZWRfSWZhY2UgSW5oZXJpdGVkSGFuZGxlciB3aGVyZQorICAgIGlkZW50aXR5IF8gYXJnID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkICJHb3QgaWRlbnRpdHkgbWV0aG9kOiAiICsrIHNob3cgYXJnCisgICAgICAgIHJldHVybiBhcmcKKworY2xpZW50IDo6IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKSAtPiBJTyAoKQorY2xpZW50IGFkZHIgPSBkbworICAgIHRvIDwtIGhPcGVuIGFkZHIKKyAgICBsZXQgcCA9ICBCaW5hcnlQcm90b2NvbCB0bworICAgIGxldCBwcyA9IChwLHApCisKKyAgICB2MSA8LSBTQ2xpZW50Lmphbmt5IHBzIDQyCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEKKworICAgIFNDbGllbnQudm9pZE1ldGhvZCBwcworCisgICAgdjIgPC0gU0NsaWVudC5wcmltaXRpdmVNZXRob2QgcHMKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MgorCisgICAgdjMgPC0gU0NsaWVudC5zdHJ1Y3RNZXRob2QgcHMKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MworCisgICAgU0NsaWVudC5tZXRob2RXaXRoRGVmYXVsdEFyZ3MgcHMgNDIKKworICAgIFNDbGllbnQub25ld2F5TWV0aG9kIHBzCisKKyAgICB2NCA8LSBJQ2xpZW50LmlkZW50aXR5IHBzIDQyCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjQKKworICAgIHJldHVybiAoKQorCitzZXJ2ZXIgOjogTmV0d29yay5Qb3J0TnVtYmVyIC0+IElPICgpCitzZXJ2ZXIgcG9ydCA9IGRvIAorICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIlJlYWR5Li4uIgorICAgIChydW5CYXNpY1NlcnZlciBJbmhlcml0ZWRIYW5kbGVyIEluaGVyaXRlZC5wcm9jZXNzIHBvcnQpCisgICAgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYAorICAgIChcKFRyYW5zcG9ydEV4biBzIF8pIC0+IGVycm9yICQgIkZBSUxVUkU6ICIgKysgc2hvdyBzKQorCittYWluIDo6IElPICgpCittYWluID0gVGhyaWZ0VGVzdFV0aWxzLnJ1blRlc3Qgc2VydmVyIGNsaWVudApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9JbmNsdWRlX01haW4uaHMgYi90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk3N2ExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9JbmNsdWRlX01haW4uaHMKQEAgLTAsMCArMSw3IEBACittb2R1bGUgTWFpbiB3aGVyZQorCitpbXBvcnQgSW5jbHVkZV9UeXBlcworaW1wb3J0IFRocmlmdFRlc3RfVHlwZXMKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IHB1dFN0ckxuICgiSW5jbHVkZXMgd29yazogIiArKyAoc2hvdyAoSW5jbHVkZVRlc3QgJCBCb29scyBUcnVlIEZhbHNlKSkpCmRpZmYgLS1naXQgYS90ZXN0L2hzL01ha2VmaWxlLmFtIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQ4OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6ICQoVEhSSUZUKSAuLi9Db25zdGFudHNEZW1vLnRocmlmdCAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vSW5jbHVkZS50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaHMgLi4vQ29uc3RhbnRzRGVtby50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaHMgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0luY2x1ZGUudGhyaWZ0CisKK2NoZWNrOiBzdHVicworCXNoIHJ1bi10ZXN0LnNoIENvbnN0YW50c0RlbW8KKwlzaCBydW4tdGVzdC5zaCBEZWJ1Z1Byb3RvVGVzdAorCXNoIHJ1bi10ZXN0LnNoIFRocmlmdFRlc3QKKwlzaCBydW4tdGVzdC5zaCBJbmNsdWRlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1ocworCSQoUk0pICouaGkKKwkkKFJNKSAqLm8KKworYWxsLWxvY2FsOiBzdHVicworCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCisJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9TZXJ2ZXIuaHMgYi90ZXN0L2hzL1NlcnZlci5ocwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhOWQ5Zi4uMDAwMDAwMAotLS0gYS90ZXN0L2hzL1NlcnZlci5ocworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS0tCi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0tLQotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS0tCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0tLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotLS0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLQotCi1tb2R1bGUgU2VydmVyIHdoZXJlCi0KLWltcG9ydCBUaHJpZnRUZXN0Ci1pbXBvcnQgVGhyaWZ0VGVzdF9JZmFjZQotaW1wb3J0IERhdGEuTWFwIGFzIE1hcAotaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCi1pbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcwotCi1pbXBvcnQgVGhyaWZ0Ci1pbXBvcnQgVGhyaWZ0LlNlcnZlcgotCi0KLWRhdGEgVGVzdEhhbmRsZXIgPSBUZXN0SGFuZGxlcgotaW5zdGFuY2UgVGhyaWZ0VGVzdF9JZmFjZSBUZXN0SGFuZGxlciB3aGVyZQotICAgIHRlc3RWb2lkIGEgPSByZXR1cm4gKCkKLSAgICB0ZXN0U3RyaW5nIGEgKEp1c3QgcykgPSBkbyBwcmludCBzOyByZXR1cm4gcwotICAgIHRlc3RCeXRlIGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RJMzIgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdEk2NCBhIChKdXN0IHgpID0gZG8gcHJpbnQgeDsgcmV0dXJuIHgKLSAgICB0ZXN0RG91YmxlIGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RTdHJ1Y3QgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdE5lc3QgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdE1hcCBhIChKdXN0IHgpID0gZG8gcHJpbnQgeDsgcmV0dXJuIHgKLSAgICB0ZXN0U2V0IGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RMaXN0IGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RFbnVtIGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RUeXBlZGVmIGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RNYXBNYXAgYSAoSnVzdCB4KSA9IHJldHVybiAoTWFwLmZyb21MaXN0IFsoMSxNYXAuZnJvbUxpc3QgWygyLDIpXSldKQotICAgIHRlc3RJbnNhbml0eSBhIChKdXN0IHgpID0gcmV0dXJuIChNYXAuZnJvbUxpc3QgWygxLE1hcC5mcm9tTGlzdCBbKE9ORSx4KV0pXSkKLSAgICB0ZXN0TXVsdGkgYSBhMSBhMiBhMyBhNCBhNSBhNiA9IHJldHVybiAoWHRydWN0IE5vdGhpbmcgTm90aGluZyBOb3RoaW5nIE5vdGhpbmcpCi0gICAgdGVzdEV4Y2VwdGlvbiBhIGMgPSB0aHJvdyAoWGNlcHRpb24gKEp1c3QgMSkgKEp1c3QgImJ5YSIpKQotICAgIHRlc3RNdWx0aUV4Y2VwdGlvbiBhIGMxIGMyID0gdGhyb3cgKFhjZXB0aW9uIChKdXN0IDEpIChKdXN0ICJ4eXoiKSkKLSAgICB0ZXN0T25ld2F5IGEgKEp1c3QgaSkgPSBkbyBwcmludCBpCi0KLQotbWFpbiA9IGRvIChydW5CYXNpY1NlcnZlciBUZXN0SGFuZGxlciBwcm9jZXNzIDkwOTApCi0gICAgICAgICAgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYAotICAgICAgICAgIChcKFRyYW5zcG9ydEV4biBzIHQpIC0+IHByaW50IHMpCmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RDbGllbnQuaHMgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmYjU5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvVGVzdENsaWVudC5ocwpAQCAtMCwwICsxLDMwNiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncywgUmVjb3JkV2lsZENhcmRzLCBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorbW9kdWxlIE1haW4gd2hlcmUKKworaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuTGlzdC5TcGxpdAoraW1wb3J0IERhdGEuU3RyaW5nCitpbXBvcnQgTmV0d29yaworaW1wb3J0IE5ldHdvcmsuVVJJCitpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CitpbXBvcnQgU3lzdGVtLkV4aXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTyBhcyBJTworCitpbXBvcnQgVGhyaWZ0VGVzdF9JZmFjZQoraW1wb3J0IFRocmlmdFRlc3RfVHlwZXMKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdF9DbGllbnQgYXMgQ2xpZW50CisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCitkYXRhIE9wdGlvbnMgPSBPcHRpb25zCisgIHsgaG9zdCAgICAgICAgIDo6IFN0cmluZworICAsIHBvcnQgICAgICAgICA6OiBJbnQKKyAgLCBkb21haW5Tb2NrZXQgOjogU3RyaW5nCisgICwgdHJhbnNwb3J0ICAgIDo6IFN0cmluZworICAsIHByb3RvY29sICAgICA6OiBQcm90b2NvbFR5cGUKKyAgLS0gVE9ETzogSGFza2VsbCBsaWIgZG9lcyBub3QgaGF2ZSBTU0wgc3VwcG9ydAorICAsIHNzbCAgICAgICAgICA6OiBCb29sCisgICwgdGVzdExvb3BzICAgIDo6IEludAorICB9CisgIGRlcml2aW5nIChTaG93LCBFcSkKKworZGF0YSBUcmFuc3BvcnRUeXBlID0gQnVmZmVyZWQgSU8uSGFuZGxlCisgICAgICAgICAgICAgICAgICAgfCBGcmFtZWQgKEZyYW1lZFRyYW5zcG9ydCBJTy5IYW5kbGUpCisgICAgICAgICAgICAgICAgICAgfCBIdHRwIEh0dHBDbGllbnQKKyAgICAgICAgICAgICAgICAgICB8IE5vVHJhbnNwb3J0IFN0cmluZworCitnZXRUcmFuc3BvcnQgOjogU3RyaW5nIC0+IFN0cmluZyAtPiBJbnQgLT4gKElPIFRyYW5zcG9ydFR5cGUpCitnZXRUcmFuc3BvcnQgImJ1ZmZlcmVkIiBob3N0IHBvcnQgPSBkbworICBoIDwtIGhPcGVuIChob3N0LCBQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisgIElPLmhTZXRCdWZmZXJpbmcgaCAkIElPLkJsb2NrQnVmZmVyaW5nIE5vdGhpbmcKKyAgcmV0dXJuICQgQnVmZmVyZWQgaAorZ2V0VHJhbnNwb3J0ICJmcmFtZWQiIGhvc3QgcG9ydCA9IGRvCisgIGggPC0gaE9wZW4gKGhvc3QsIFBvcnROdW1iZXIgJCBmcm9tSW50ZWdyYWwgcG9ydCkKKyAgdCA8LSBvcGVuRnJhbWVkVHJhbnNwb3J0IGgKKyAgcmV0dXJuICQgRnJhbWVkIHQKK2dldFRyYW5zcG9ydCAiaHR0cCIgaG9zdCBwb3J0ID0gbGV0IHVyaVN0ciA9ICJodHRwOi8vIiArKyBob3N0ICsrICI6IiArKyBzaG93IHBvcnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZVVSSSB1cmlTdHIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RoaW5nIC0+IGRvIHJldHVybiAoTm9UcmFuc3BvcnQgJCAiRmFpbGVkIHRvIHBhcnNlIFVSSTogIiArKyB1cmlTdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVzdCh1cmkpIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IDwtIG9wZW5IdHRwQ2xpZW50IHVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQgSHR0cCB0CitnZXRUcmFuc3BvcnQgdCBob3N0IHBvcnQgPSBkbyByZXR1cm4gKE5vVHJhbnNwb3J0ICQgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydDogIiArKyB0KQorCitkYXRhIFByb3RvY29sVHlwZSA9IEJpbmFyeQorICAgICAgICAgICAgICAgICAgfCBDb21wYWN0CisgICAgICAgICAgICAgICAgICB8IEpTT04KKyAgICAgICAgICAgICAgICAgIHwgSGVhZGVyCisgICAgICAgICAgICAgICAgICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2dldFByb3RvY29sIDo6IFN0cmluZyAtPiBQcm90b2NvbFR5cGUKK2dldFByb3RvY29sICJiaW5hcnkiICA9IEJpbmFyeQorZ2V0UHJvdG9jb2wgImNvbXBhY3QiID0gQ29tcGFjdAorZ2V0UHJvdG9jb2wgImpzb24iICAgID0gSlNPTgorZ2V0UHJvdG9jb2wgImhlYWRlciIgPSBIZWFkZXIKK2dldFByb3RvY29sIHAgPSBlcnJvciAkICJVbnN1cHBvcnRlZCBQcm90b2NvbDogIiArKyBwCisKK2RlZmF1bHRPcHRpb25zIDo6IE9wdGlvbnMKK2RlZmF1bHRPcHRpb25zID0gT3B0aW9ucworICB7IHBvcnQgICAgICAgICA9IDkwOTAKKyAgLCBkb21haW5Tb2NrZXQgPSAiIgorICAsIGhvc3QgICAgICAgICA9ICJsb2NhbGhvc3QiCisgICwgdHJhbnNwb3J0ICAgID0gImJ1ZmZlcmVkIgorICAsIHByb3RvY29sICAgICA9IEJpbmFyeQorICAsIHNzbCAgICAgICAgICA9IEZhbHNlCisgICwgdGVzdExvb3BzICAgID0gMQorICB9CisKK3J1bkNsaWVudCA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gKCkKK3J1bkNsaWVudCBwID0gZG8KKyAgbGV0IHByb3QgPSAocCxwKQorICBwdXRTdHJMbiAiU3RhcnRpbmcgVGVzdHMiCisKKyAgLS0gVk9JRCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Vm9pZCIKKyAgQ2xpZW50LnRlc3RWb2lkIHByb3QKKworICAtLSBTdHJpbmcgVGVzdAorICBwdXRTdHJMbiAidGVzdFN0cmluZyIKKyAgcyA8LSBDbGllbnQudGVzdFN0cmluZyBwcm90ICJUZXN0IgorICB3aGVuIChzIC89ICJUZXN0IikgZXhpdEZhaWx1cmUKKworICAtLSBCb29sIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCb29sIgorICBib29sIDwtIENsaWVudC50ZXN0Qm9vbCBwcm90IFRydWUKKyAgd2hlbiAobm90IGJvb2wpIGV4aXRGYWlsdXJlCisgIHB1dFN0ckxuICJ0ZXN0Qm9vbCIKKyAgYm9vbCA8LSBDbGllbnQudGVzdEJvb2wgcHJvdCBGYWxzZQorICB3aGVuIChib29sKSBleGl0RmFpbHVyZQorCisgIC0tIEJ5dGUgVGVzdAorICBwdXRTdHJMbiAidGVzdEJ5dGUiCisgIGJ5dGUgPC0gQ2xpZW50LnRlc3RCeXRlIHByb3QgMQorICB3aGVuIChieXRlIC89IDEpIGV4aXRGYWlsdXJlCisKKyAgLS0gSTMyIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RJMzIiCisgIGkzMiA8LSBDbGllbnQudGVzdEkzMiBwcm90ICgtMSkKKyAgd2hlbiAoaTMyIC89IC0xKSBleGl0RmFpbHVyZQorCisgIC0tIEk2NCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0STY0IgorICBpNjQgPC0gQ2xpZW50LnRlc3RJNjQgcHJvdCAoLTM0MzU5NzM4MzY4KQorICB3aGVuIChpNjQgLz0gLTM0MzU5NzM4MzY4KSBleGl0RmFpbHVyZQorCisgIC0tIERvdWJsZSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RG91YmxlIgorICBkdWIgPC0gQ2xpZW50LnRlc3REb3VibGUgcHJvdCAoLTUuMjA5ODUyMykKKyAgd2hlbiAoYWJzIChkdWIgKyA1LjIwOTg1MjMpID4gMC4wMDEpIGV4aXRGYWlsdXJlCisKKyAgLS0gQmluYXJ5IFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCaW5hcnkiCisgIGJpbiA8LSBDbGllbnQudGVzdEJpbmFyeSBwcm90IChMQlMucGFjayAuIHJldmVyc2UgJCBbLTEyOC4uMTI3XSkKKyAgd2hlbiAoKHJldmVyc2UgWy0xMjguLjEyN10pIC89IExCUy51bnBhY2sgYmluKSBleGl0RmFpbHVyZQorICAKKyAgLS0gU3RydWN0IFRlc3QKKyAgbGV0IHN0cnVjdEluID0gWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2J5dGVfdGhpbmcgICA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTMyX3RoaW5nICAgID0gLTMKKyAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTY0X3RoaW5nICAgID0gLTUKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdFN0cnVjdCIKKyAgc3RydWN0T3V0IDwtIENsaWVudC50ZXN0U3RydWN0IHByb3Qgc3RydWN0SW4KKyAgd2hlbiAoc3RydWN0SW4gLz0gc3RydWN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIE5lc3RlZCBTdHJ1Y3QgVGVzdAorICBsZXQgbmVzdEluID0gWHRydWN0MnsgeHRydWN0Ml9ieXRlX3RoaW5nICAgPSAxCisgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3QyX3N0cnVjdF90aGluZyA9IHN0cnVjdEluCisgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3QyX2kzMl90aGluZyAgICA9IDUKKyAgICAgICAgICAgICAgICAgICAgICB9CisgIHB1dFN0ckxuICJ0ZXN0TmVzdCIKKyAgbmVzdE91dCA8LSBDbGllbnQudGVzdE5lc3QgcHJvdCBuZXN0SW4KKyAgd2hlbiAobmVzdEluIC89IG5lc3RPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gTWFwIFRlc3QKKyAgbGV0IG1hcEluID0gTWFwLmZyb21MaXN0ICQgbWFwIChcaSAtPiAoaSwgaS0xMCkpIFsxLi41XQorICBwdXRTdHJMbiAidGVzdE1hcCIKKyAgbWFwT3V0IDwtIENsaWVudC50ZXN0TWFwIHByb3QgbWFwSW4KKyAgd2hlbiAobWFwSW4gLz0gbWFwT3V0KSBleGl0RmFpbHVyZQorCisgIC0tIFNldCBUZXN0CisgIGxldCBzZXRJbiA9IFNldC5mcm9tTGlzdCBbLTIuLjNdCisgIHB1dFN0ckxuICJ0ZXN0U2V0IgorICBzZXRPdXQgPC0gQ2xpZW50LnRlc3RTZXQgcHJvdCBzZXRJbgorICB3aGVuIChzZXRJbiAvPSBzZXRPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gTGlzdCBUZXN0CisgIGxldCBsaXN0SW4gPSBWZWN0b3IuZnJvbUxpc3QgWy0yLi4zXQorICBwdXRTdHJMbiAidGVzdExpc3QiCisgIGxpc3RPdXQgPC0gQ2xpZW50LnRlc3RMaXN0IHByb3QgbGlzdEluCisgIHdoZW4gKGxpc3RJbiAvPSBsaXN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIEVudW0gVGVzdAorICBwdXRTdHJMbiAidGVzdEVudW0iCisgIG51bXoxIDwtIENsaWVudC50ZXN0RW51bSBwcm90IE9ORQorICB3aGVuIChudW16MSAvPSBPTkUpIGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgorICBudW16MiA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBUV08KKyAgd2hlbiAobnVtejIgLz0gVFdPKSBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKKyAgbnVtejUgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgRklWRQorICB3aGVuIChudW16NSAvPSBGSVZFKSBleGl0RmFpbHVyZQorCisgIC0tIFR5cGVkZWYgVGVzdAorICBwdXRTdHJMbiAidGVzdFR5cGVkZWYiCisgIHVpZCA8LSBDbGllbnQudGVzdFR5cGVkZWYgcHJvdCAzMDk4NTgyMzUwODI1MjMKKyAgd2hlbiAodWlkIC89IDMwOTg1ODIzNTA4MjUyMykgZXhpdEZhaWx1cmUKKworICAtLSBOZXN0ZWQgTWFwIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RNYXBNYXAiCisgIF8gPC0gQ2xpZW50LnRlc3RNYXBNYXAgcHJvdCAxCisKKyAgLS0gRXhjZXB0aW9uIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RFeGNlcHRpb24iCisgIGV4bjEgPC0gdHJ5ICQgQ2xpZW50LnRlc3RFeGNlcHRpb24gcHJvdCAiWGNlcHRpb24iCisgIGNhc2UgZXhuMSBvZgorICAgIExlZnQgKFhjZXB0aW9uIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBwdXRTdHJMbiAoc2hvdyBleG4xKSA+PiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4yIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgIlRFeGNlcHRpb24iCisgIGNhc2UgZXhuMiBvZgorICAgIExlZnQgKF8gOjogU29tZUV4Y2VwdGlvbikgLT4gcmV0dXJuICgpCisgICAgUmlnaHQgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4zIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgInN1Y2Nlc3MiCisgIGNhc2UgZXhuMyBvZgorICAgIExlZnQgKF8gOjogU29tZUV4Y2VwdGlvbikgLT4gZXhpdEZhaWx1cmUKKyAgICBSaWdodCBfIC0+IHJldHVybiAoKQorCisgIC0tIE11bHRpIEV4Y2VwdGlvbiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMSA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uIiAidGVzdCAxIgorICBjYXNlIG11bHRpMSBvZgorICAgIExlZnQgKFhjZXB0aW9uIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMiA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uMiIgInRlc3QgMiIKKyAgY2FzZSBtdWx0aTIgb2YKKyAgICBMZWZ0IChYY2VwdGlvbjIgXyBfKSAtPiByZXR1cm4gKCkKKyAgICBfIC0+IGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RNdWx0aUV4Y2VwdGlvbiIKKyAgbXVsdGkzIDwtIHRyeSAkIENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24gcHJvdCAic3VjY2VzcyIgInRlc3QgMyIKKyAgY2FzZSBtdWx0aTMgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IGV4aXRGYWlsdXJlCisgICAgUmlnaHQgXyAtPiByZXR1cm4gKCkKKworCittYWluIDo6IElPICgpCittYWluID0gZG8KKyAgb3B0aW9ucyA8LSBmbGlwIHBhcnNlRmxhZ3MgZGVmYXVsdE9wdGlvbnMgPCQ+IGdldEFyZ3MKKyAgY2FzZSBvcHRpb25zIG9mCisgICAgTm90aGluZyAtPiBzaG93SGVscAorICAgIEp1c3QgT3B0aW9uc3suLn0gLT4gZG8KKyAgICAgIHRyYW5zIDwtIE1haW4uZ2V0VHJhbnNwb3J0IHRyYW5zcG9ydCBob3N0IHBvcnQKKyAgICAgIGNhc2UgdHJhbnMgb2YKKyAgICAgICAgQnVmZmVyZWQgdCAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIEZyYW1lZCB0ICAgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBIdHRwIHQgICAgIC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgTm9UcmFuc3BvcnQgZXJyIC0+IHB1dFN0ckxuIGVycgorICB3aGVyZQorICAgIG1ha2VDbGllbnQgcCB0ID0gY2FzZSBwIG9mCisgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSAgLT4gcnVuQ2xpZW50ICQgQmluYXJ5UHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0IC0+IHJ1bkNsaWVudCAkIENvbXBhY3RQcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIEpTT04gICAgLT4gcnVuQ2xpZW50ICQgSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyICAtPiBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQgPj49IHJ1bkNsaWVudAorICAgIHJ1blRlc3QgbG9vcHMgcCB0ID0gZG8KKyAgICAgIGxldCBjbGllbnQgPSBtYWtlQ2xpZW50IHAgdAorICAgICAgcmVwbGljYXRlTV8gbG9vcHMgY2xpZW50CisgICAgICBwdXRTdHJMbiAiQ09NUExFVEVEIFNVQ0NFU1NGVUxMWSIKKworcGFyc2VGbGFncyA6OiBbU3RyaW5nXSAtPiBPcHRpb25zIC0+IE1heWJlIE9wdGlvbnMKK3BhcnNlRmxhZ3MgKGZsYWcgOiBmbGFncykgb3B0cyA9IGRvCisgIGxldCBwaWVjZXMgPSBzcGxpdE9uICI9IiBmbGFnCisgIGNhc2UgcGllY2VzIG9mCisgICAgIi0tcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcG9ydCA9IHJlYWQgYXJnIH0KKyAgICAiLS1kb21haW4tc29ja2V0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBkb21haW5Tb2NrZXQgPSByZWFkIGFyZyB9CisgICAgIi0taG9zdCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgaG9zdCA9IGFyZyB9CisgICAgIi0tdHJhbnNwb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB0cmFuc3BvcnQgPSBhcmcgfQorICAgICItLXByb3RvY29sIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwcm90b2NvbCA9IGdldFByb3RvY29sIGFyZyB9CisgICAgIi1uIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB0ZXN0TG9vcHMgPSByZWFkIGFyZyB9CisgICAgIi0taCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1oZWxwIiA6IF8gLT4gTm90aGluZworICAgICItLXNzbCIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgc3NsID0gVHJ1ZSB9CisgICAgIi0tcHJvY2Vzc29yLWV2ZW50cyIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0cworICAgIF8gLT4gTm90aGluZworcGFyc2VGbGFncyBbXSBvcHRzID0gSnVzdCBvcHRzCisKK3Nob3dIZWxwIDo6IElPICgpCitzaG93SGVscCA9IHB1dFN0ckxuCisgICJBbGxvd2VkIG9wdGlvbnM6XG5cCisgIFwgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZVxuXAorICBcICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0XG5cCisgIFwgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0XG5cCisgIFwgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLFxuXAorICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0XG5cCisgIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHBcblwKKyAgXCAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb25cblwKKyAgXCAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMXG5cCisgIFwgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3MzFhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpAQCAtMCwwICsxLDMxMiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyxSZWNvcmRXaWxkQ2FyZHMgIy19Cittb2R1bGUgTWFpbiB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5IYXNoTWFwLlN0cmljdCAoSGFzaE1hcCkKK2ltcG9ydCBEYXRhLkxpc3QKK2ltcG9ydCBEYXRhLkxpc3QuU3BsaXQKK2ltcG9ydCBEYXRhLlN0cmluZworaW1wb3J0IE5ldHdvcmsKK2ltcG9ydCBTeXN0ZW0uRW52aXJvbm1lbnQKK2ltcG9ydCBTeXN0ZW0uRXhpdAoraW1wb3J0IFN5c3RlbS5JTworaW1wb3J0IENvbnRyb2wuQ29uY3VycmVudCAodGhyZWFkRGVsYXkpCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTyBhcyBJTworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIFRleHQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKK2ltcG9ydCBUaHJpZnRUZXN0CitpbXBvcnQgVGhyaWZ0VGVzdF9JZmFjZQoraW1wb3J0IFRocmlmdFRlc3RfVHlwZXMKKworaW1wb3J0IFRocmlmdAoraW1wb3J0IFRocmlmdC5TZXJ2ZXIKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK2RhdGEgT3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgOjogSW50CisgICwgZG9tYWluU29ja2V0IDo6IFN0cmluZworICAsIHNlcnZlclR5cGUgICA6OiBTZXJ2ZXJUeXBlCisgICwgdHJhbnNwb3J0ICAgIDo6IFN0cmluZworICAsIHByb3RvY29sICAgICA6OiBQcm90b2NvbFR5cGUKKyAgLCBzc2wgICAgICAgICAgOjogQm9vbAorICAsIHdvcmtlcnMgICAgICA6OiBJbnQKKyAgfQorCitkYXRhIFNlcnZlclR5cGUgPSBTaW1wbGUKKyAgICAgICAgICAgICAgICB8IFRocmVhZFBvb2wKKyAgICAgICAgICAgICAgICB8IFRocmVhZGVkCisgICAgICAgICAgICAgICAgfCBOb25CbG9ja2luZworICAgICAgICAgICAgICAgIGRlcml2aW5nIChTaG93LCBFcSkKKworaW5zdGFuY2UgSXNTdHJpbmcgU2VydmVyVHlwZSB3aGVyZQorICBmcm9tU3RyaW5nICJzaW1wbGUiICAgICAgPSBTaW1wbGUKKyAgZnJvbVN0cmluZyAidGhyZWFkLXBvb2wiID0gVGhyZWFkUG9vbAorICBmcm9tU3RyaW5nICJ0aHJlYWRlZCIgICAgPSBUaHJlYWRlZAorICBmcm9tU3RyaW5nICJub25ibG9ja2luZyIgPSBOb25CbG9ja2luZworICBmcm9tU3RyaW5nIF8gPSBlcnJvciAibm90IGEgdmFsaWQgc2VydmVyIHR5cGUiCisKK2RhdGEgVHJhbnNwb3J0VHlwZSA9IEJ1ZmZlcmVkIChTb2NrZXQgLT4gKElPIElPLkhhbmRsZSkpCisgICAgICAgICAgICAgICAgICAgfCBGcmFtZWQgKFNvY2tldCAtPiAoSU8gKEZyYW1lZFRyYW5zcG9ydCBJTy5IYW5kbGUpKSkKKyAgICAgICAgICAgICAgICAgICB8IE5vVHJhbnNwb3J0IFN0cmluZworCitnZXRUcmFuc3BvcnQgOjogU3RyaW5nIC0+IFRyYW5zcG9ydFR5cGUKK2dldFRyYW5zcG9ydCAiYnVmZmVyZWQiID0gQnVmZmVyZWQgJCBccyAtPiBkbworICAoaCwgXywgXykgPC0gKGFjY2VwdCBzKQorICBJTy5oU2V0QnVmZmVyaW5nIGggJCBJTy5CbG9ja0J1ZmZlcmluZyBOb3RoaW5nCisgIHJldHVybiBoCitnZXRUcmFuc3BvcnQgImZyYW1lZCIgPSBGcmFtZWQgJCBccyAtPiBkbworICAoaCwgXywgXykgPC0gKGFjY2VwdCBzKQorICBvcGVuRnJhbWVkVHJhbnNwb3J0IGgKK2dldFRyYW5zcG9ydCB0ID0gTm9UcmFuc3BvcnQgJCAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0OiAiICsrIHQKKworZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAorICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgorCitnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKK2dldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKK2dldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiICA9IEhlYWRlcgorZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAorCitkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCitkZWZhdWx0T3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgPSA5MDkwCisgICwgZG9tYWluU29ja2V0ID0gIiIKKyAgLCBzZXJ2ZXJUeXBlICAgPSBUaHJlYWRlZAorICAsIHRyYW5zcG9ydCAgICA9ICJidWZmZXJlZCIKKyAgLCBwcm90b2NvbCAgICAgPSBCaW5hcnkKKyAgLS0gVE9ETzogSGFza2VsbCBsaWIgZG9lcyBub3QgaGF2ZSBTU0wgc3VwcG9ydAorICAsIHNzbCAgICAgICAgICA9IEZhbHNlCisgICwgd29ya2VycyAgICAgID0gNAorICB9CisKK3N0cmluZ2lmeU1hcCA6OiAoU2hvdyBhLCBTaG93IGIpID0+IE1hcC5IYXNoTWFwIGEgYiAtPiBTdHJpbmcKK3N0cmluZ2lmeU1hcCA9IERhdGEuTGlzdC5pbnRlcmNhbGF0ZSAiLCAiIC4gRGF0YS5MaXN0Lm1hcCBqb2luS1YgLiBNYXAudG9MaXN0CisgIHdoZXJlIGpvaW5LViAoaywgdikgPSBzaG93IGsgKysgIiA9PiAiICsrIHNob3cgdgorCitzdHJpbmdpZnlTZXQgOjogU2hvdyBhID0+IFNldC5IYXNoU2V0IGEgLT4gU3RyaW5nCitzdHJpbmdpZnlTZXQgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgc2hvdyAuIFNldC50b0xpc3QKKworc3RyaW5naWZ5TGlzdCA6OiBTaG93IGEgPT4gVmVjdG9yLlZlY3RvciBhIC0+IFN0cmluZworc3RyaW5naWZ5TGlzdCA9IERhdGEuTGlzdC5pbnRlcmNhbGF0ZSAiLCAiIC4gRGF0YS5MaXN0Lm1hcCBzaG93IC4gVmVjdG9yLnRvTGlzdAorCitkYXRhIFRlc3RIYW5kbGVyID0gVGVzdEhhbmRsZXIKK2luc3RhbmNlIFRocmlmdFRlc3RfSWZhY2UgVGVzdEhhbmRsZXIgd2hlcmUKKyAgdGVzdFZvaWQgXyA9IFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdFZvaWQoKSIKKworICB0ZXN0U3RyaW5nIF8gcyA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJpbmcoIiArKyBzaG93IHMgKysgIikiCisgICAgcmV0dXJuIHMKKworICB0ZXN0Qm9vbCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0Qm9vbCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RCeXRlIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RCeXRlKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEkzMiBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0STMyKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEk2NCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0STY0KCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdERvdWJsZSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0RG91YmxlKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEJpbmFyeSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0QmluYXJ5KCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdFN0cnVjdCBfIHN0cnVjdEBYdHJ1Y3R7Li59ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cnVjdCh7IiArKyBzaG93IHh0cnVjdF9zdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2J5dGVfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2kzMl90aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICIsICIgKysgc2hvdyB4dHJ1Y3RfaTY0X3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIn0pIgorICAgIHJldHVybiBzdHJ1Y3QKKworICB0ZXN0TmVzdCBfIG5lc3RAWHRydWN0MnsuLn0gPSBkbworICAgIGxldCBYdHJ1Y3R7Li59ID0geHRydWN0Ml9zdHJ1Y3RfdGhpbmcKKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE5lc3QoeyIgKysgc2hvdyB4dHJ1Y3QyX2J5dGVfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAieywgIiArKyBzaG93IHh0cnVjdF9zdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAgIiwgIiArKyBzaG93IHh0cnVjdF9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfaTMyX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfaTY0X3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgIn0sICIgKysgc2hvdyB4dHJ1Y3QyX2kzMl90aGluZworICAgIHJldHVybiBuZXN0CisKKyAgdGVzdE1hcCBfIG0gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TWFwKHsiICsrIHN0cmluZ2lmeU1hcCBtICsrICJ9KSIKKyAgICByZXR1cm4gbQorCisgIHRlc3RTdHJpbmdNYXAgXyBtID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cmluZ01hcCgiICsrIHN0cmluZ2lmeU1hcCBtICsrICJ9KSIKKyAgICByZXR1cm4gbQorCisgIHRlc3RTZXQgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFNldCh7IiArKyBzdHJpbmdpZnlTZXQgeCArKyAifSkiCisgICAgcmV0dXJuIHgKKworICB0ZXN0TGlzdCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TGlzdCgiICsrIHN0cmluZ2lmeUxpc3QgeCArKyAifSkiCisgICAgcmV0dXJuIHgKKworICB0ZXN0RW51bSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0RW51bSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RUeXBlZGVmIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RUeXBlZGVmKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdE1hcE1hcCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TWFwTWFwKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiAkIE1hcC5mcm9tTGlzdCBbICgtNCwgTWFwLmZyb21MaXN0IFsgKC00LCAtNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgtMywgLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoLTIsIC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKC0xLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAsICg0LCAgTWFwLmZyb21MaXN0IFsgKDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMiwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgzLCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDQsIDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXQorCisgIHRlc3RJbnNhbml0eSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdEluc2FuaXR5KCkiCisgICAgcmV0dXJuICQgTWFwLmZyb21MaXN0IFsgKDEsIE1hcC5mcm9tTGlzdCBbIChUV08gICwgeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKFRIUkVFLCB4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMiwgTWFwLmZyb21MaXN0IFsgKFNJWCwgZGVmYXVsdF9JbnNhbml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICB0ZXN0TXVsdGkgXyBieXRlIGkzMiBpNjQgXyBfIF8gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdE11bHRpKCkiCisgICAgcmV0dXJuIFh0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9IFRleHQucGFjayAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9ieXRlX3RoaW5nICAgPSBieXRlCisgICAgICAgICAgICAgICAgICwgeHRydWN0X2kzMl90aGluZyAgICA9IGkzMgorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pNjRfdGhpbmcgICAgPSBpNjQKKyAgICAgICAgICAgICAgICAgfQorCisgIHRlc3RFeGNlcHRpb24gXyBzID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEV4Y2VwdGlvbigiICsrIHNob3cgcyArKyAiKSIKKyAgICBjYXNlIHMgb2YKKyAgICAgICJYY2VwdGlvbiIgICAtPiB0aHJvdyAkIFhjZXB0aW9uIDEwMDEgcworICAgICAgIlRFeGNlcHRpb24iIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbgorICAgICAgXyAtPiByZXR1cm4gKCkKKworICB0ZXN0TXVsdGlFeGNlcHRpb24gXyBzMSBzMiA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RNdWx0aUV4Y2VwdGlvbigiICsrIHNob3cgczEgKysgIiwgIiArKyBzaG93IHMyICsrICAiKSIKKyAgICBjYXNlIHMxIG9mCisgICAgICAiWGNlcHRpb24iICAgLT4gdGhyb3cgJCBYY2VwdGlvbiAxMDAxICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgIlhjZXB0aW9uMiIgIC0+IHRocm93ICQgWGNlcHRpb24yIDIwMDIgJCBYdHJ1Y3QgIlRoaXMgaXMgYW4gWGNlcHRpb24yIiAwIDAgMAorICAgICAgIlRFeGNlcHRpb24iIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbgorICAgICAgXyAtPiByZXR1cm4gZGVmYXVsdF9YdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSBzMiB9CisKKyAgdGVzdE9uZXdheSBfIGkgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBTbGVlcGluZy4uLiIKKyAgICB0aHJlYWREZWxheSAkIChmcm9tSW50ZWdyYWwgaSkgKiAxMDAwMDAwCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IGRvbmUgc2xlZXBpbmchIgorCittYWluIDo6IElPICgpCittYWluID0gZG8KKyAgb3B0aW9ucyA8LSBmbGlwIHBhcnNlRmxhZ3MgZGVmYXVsdE9wdGlvbnMgPCQ+IGdldEFyZ3MKKyAgY2FzZSBvcHRpb25zIG9mCisgICAgTm90aGluZyAtPiBzaG93SGVscAorICAgIEp1c3QgT3B0aW9uc3suLn0gLT4gZG8KKyAgICAgIGNhc2UgTWFpbi5nZXRUcmFuc3BvcnQgdHJhbnNwb3J0IG9mCisgICAgICAgIEJ1ZmZlcmVkIGYgLT4gcnVuU2VydmVyIHByb3RvY29sIGYgcG9ydAorICAgICAgICBGcmFtZWQgICBmIC0+IHJ1blNlcnZlciBwcm90b2NvbCBmIHBvcnQKKyAgICAgICAgTm9UcmFuc3BvcnQgZXJyIC0+IHB1dFN0ckxuIGVycgorICAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgIlN0YXJ0aW5nIFwiIiArKyBzaG93IHNlcnZlclR5cGUgKysgIlwiIHNlcnZlciAoIiArKworICAgICAgICBzaG93IHRyYW5zcG9ydCArKyAiKSBsaXN0ZW4gb246ICIgKysgZG9tYWluU29ja2V0ICsrIHNob3cgcG9ydAorICAgICAgd2hlcmUKKyAgICAgICAgYWNjZXB0b3IgcCBmIHNvY2tldCA9IGRvCisgICAgICAgICAgdCA8LSBmIHNvY2tldAorICAgICAgICAgIHJldHVybiAocCB0LCBwIHQpCisKKyAgICAgICAgaGVhZGVyQWNjZXB0b3IgZiBzb2NrZXQgPSBkbworICAgICAgICAgIHQgPC0gZiBzb2NrZXQKKyAgICAgICAgICBwIDwtIGNyZWF0ZUhlYWRlclByb3RvY29sMSB0CisgICAgICAgICAgcmV0dXJuIChwLCBwKQorCisgICAgICAgIGRvUnVuU2VydmVyIHAgZiA9IGRvCisgICAgICAgICAgcnVuVGhyZWFkZWRTZXJ2ZXIgKGFjY2VwdG9yIHAgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIC4gUG9ydE51bWJlciAuIGZyb21JbnRlZ3JhbAorCisgICAgICAgIHJ1blNlcnZlciBwIGYgcG9ydCA9IGNhc2UgcCBvZgorICAgICAgICAgIEJpbmFyeSAgLT4gZG9SdW5TZXJ2ZXIgQmluYXJ5UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgQ29tcGFjdCAtPiBkb1J1blNlcnZlciBDb21wYWN0UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSlNPTiAgICAtPiBkb1J1blNlcnZlciBKU09OUHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSGVhZGVyICAtPiBydW5UaHJlYWRlZFNlcnZlciAoaGVhZGVyQWNjZXB0b3IgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIChQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisKK3BhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCitwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbworICBsZXQgcGllY2VzID0gc3BsaXRPbiAiPSIgZmxhZworICBjYXNlIHBpZWNlcyBvZgorICAgICItLXBvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHBvcnQgPSByZWFkIGFyZyB9CisgICAgIi0tZG9tYWluLXNvY2tldCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgZG9tYWluU29ja2V0ID0gcmVhZCBhcmcgfQorICAgICItLXNlcnZlci10eXBlIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBzZXJ2ZXJUeXBlID0gZnJvbVN0cmluZyBhcmcgfQorICAgICItLXRyYW5zcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdHJhbnNwb3J0ID0gYXJnIH0KKyAgICAiLS1wcm90b2NvbCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCBhcmcgfQorICAgICItLXdvcmtlcnMiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHdvcmtlcnMgPSByZWFkIGFyZyB9CisgICAgIi1uIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB3b3JrZXJzID0gcmVhZCBhcmcgfQorICAgICItLWgiIDogXyAtPiBOb3RoaW5nCisgICAgIi0taGVscCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1zc2wiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHNzbCA9IFRydWUgfQorICAgICItLXByb2Nlc3Nvci1ldmVudHMiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHMKKyAgICBfIC0+IE5vdGhpbmcKK3BhcnNlRmxhZ3MgW10gb3B0cyA9IEp1c3Qgb3B0cworCitzaG93SGVscCA6OiBJTyAoKQorc2hvd0hlbHAgPSBTeXN0ZW0uSU8ucHV0U3RyTG4KKyAgIkFsbG93ZWQgb3B0aW9uczpcblwKKyAgXCAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlXG5cCisgIFwgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW5cblwKKyAgXCAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KVxuXAorICBcICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIixcblwKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiXG5cCisgIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWRcblwKKyAgXCAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb25cblwKKyAgXCAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMXG5cCisgIFwgIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzXG5cCisgIFwgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yXG5cCisgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZSIKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzIGIvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOWI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCkBAIC0wLDAgKzEsNjUgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0VGVzdFV0aWxzIChDbGllbnRGdW5jLCBTZXJ2ZXJGdW5jLCBjbGllbnRMb2csIHNlcnZlckxvZywgdGVzdExvZywgcnVuVGVzdCkgd2hlcmUKKworCitpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuQ29uY3VycmVudAoraW1wb3J0IHF1YWxpZmllZCBOZXR3b3JrCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTworCisKK3NlcnZlclBvcnQgOjogTmV0d29yay5Qb3J0TnVtYmVyCitzZXJ2ZXJQb3J0ID0gOTA5MAorCitzZXJ2ZXJBZGRyZXNzIDo6IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKQorc2VydmVyQWRkcmVzcyA9ICgibG9jYWxob3N0IiwgTmV0d29yay5Qb3J0TnVtYmVyIHNlcnZlclBvcnQpCisKKwordGVzdExvZyA6OiBTdHJpbmcgLT4gSU8gKCkKK3Rlc3RMb2cgc3RyID0gZG8KKyAgICBTeXN0ZW0uSU8uaFB1dFN0ciBTeXN0ZW0uSU8uc3Rkb3V0ICQgc3RyICsrICJcbiIKKyAgICBTeXN0ZW0uSU8uaEZsdXNoIFN5c3RlbS5JTy5zdGRvdXQKKworCitjbGllbnRMb2cgOjogU3RyaW5nIC0+IElPICgpCitjbGllbnRMb2cgc3RyID0gdGVzdExvZyAkICJDTElFTlQ6ICIgKysgc3RyCisKK3NlcnZlckxvZyA6OiBTdHJpbmcgLT4gSU8gKCkKK3NlcnZlckxvZyBzdHIgPSB0ZXN0TG9nICQgIlNFUlZFUjogIiArKyBzdHIKKworCit0eXBlIFNlcnZlckZ1bmMgPSBOZXR3b3JrLlBvcnROdW1iZXIgLT4gSU8gKCkKK3R5cGUgQ2xpZW50RnVuYyA9IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKSAtPiBJTyAoKQorCitydW5UZXN0IDo6IFNlcnZlckZ1bmMgLT4gQ2xpZW50RnVuYyAtPiBJTyAoKQorcnVuVGVzdCBzZXJ2ZXIgY2xpZW50ID0gZG8KKyAgICBfIDwtIENvbnRyb2wuQ29uY3VycmVudC5mb3JrSU8gKHNlcnZlciBzZXJ2ZXJQb3J0KQorCisgICAgLS0gRmFpcmx5IGhvcnJpYmxlOyB0aGlzIGRvZXMgbm90IDEwMCUgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlciB0aHJlYWQKKyAgICAtLSBoYXMgYWN0dWFsbHkgb3BlbmVkIHRoZSBzb2NrZXQgd2UgbmVlZC4uLiBidXQgbm90IG11Y2ggZWxzZSB3ZSBjYW4gZG8KKyAgICAtLSB3aXRob3V0IHRoaXMsIHRoZSBjbGllbnQgcmFjZXMgdGhlIHNlcnZlciB0byB0aGUgc29ja2V0LCBhbmQgd2lucyBldmVyeQorICAgIC0tIHRpbWUKKyAgICBDb250cm9sLkNvbmN1cnJlbnQueWllbGQKKyAgICBDb250cm9sLkNvbmN1cnJlbnQudGhyZWFkRGVsYXkgJCA1MDAgKiAxMDAwIC0tIHVuaXQgaXMgaW4gX21pY3JvX3NlY29uZHMKKyAgICBDb250cm9sLkNvbmN1cnJlbnQueWllbGQKKworICAgIGNsaWVudCBzZXJ2ZXJBZGRyZXNzCisKKyAgICB0ZXN0TG9nICJTVUNDRVNTIgpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMgYi90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAwMjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKQEAgLTAsMCArMSwyMTQgQEAKK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KKworbW9kdWxlIE1haW4gd2hlcmUKKworCitpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKK2ltcG9ydCBxdWFsaWZpZWQgTmV0d29yaworCitpbXBvcnQgVGhyaWZ0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQoraW1wb3J0IFRocmlmdC5TZXJ2ZXIKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQorCitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RVdGlscworCitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3QKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdF9DbGllbnQgYXMgQ2xpZW50CitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RfSWZhY2UgYXMgSWZhY2UKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdF9UeXBlcyBhcyBUeXBlcworCisKK2RhdGEgVGVzdEhhbmRsZXIgPSBUZXN0SGFuZGxlcgoraW5zdGFuY2UgSWZhY2UuVGhyaWZ0VGVzdF9JZmFjZSBUZXN0SGFuZGxlciB3aGVyZQorICAgIHRlc3RWb2lkIF8gPSByZXR1cm4gKCkKKworICAgIHRlc3RTdHJpbmcgXyBzID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgcworICAgICAgICByZXR1cm4gcworCisgICAgdGVzdEJ5dGUgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdEkzMiBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0STY0IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3REb3VibGUgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdEJpbmFyeSBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0U3RydWN0IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3ROZXN0IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RNYXAgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdFN0cmluZ01hcCBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0U2V0IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RMaXN0IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RFbnVtIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RUeXBlZGVmIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RNYXBNYXAgXyBfID0gZG8KKyAgICAgICAgcmV0dXJuIChNYXAuZnJvbUxpc3QgWygxLCBNYXAuZnJvbUxpc3QgWygyLCAyKV0pXSkKKworICAgIHRlc3RJbnNhbml0eSBfIHggPSBkbworICAgICAgICByZXR1cm4gKE1hcC5mcm9tTGlzdCBbKDEsIE1hcC5mcm9tTGlzdCBbKFR5cGVzLk9ORSwgeCldKV0pCisKKyAgICB0ZXN0TXVsdGkgXyBfIF8gXyBfIF8gXyA9IGRvCisgICAgICAgIHJldHVybiAoVHlwZXMuWHRydWN0ICIiIDAgMCAwKQorCisgICAgdGVzdEV4Y2VwdGlvbiBfIF8gPSBkbworICAgICAgICBDb250cm9sLkV4Y2VwdGlvbi50aHJvdyAoVHlwZXMuWGNlcHRpb24gMSAiYnlhIikKKworICAgIHRlc3RNdWx0aUV4Y2VwdGlvbiBfIF8gXyA9IGRvCisgICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAxICJ4eXoiKQorCisgICAgdGVzdE9uZXdheSBfIGkgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyBpCisKKworY2xpZW50IDo6IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKSAtPiBJTyAoKQorY2xpZW50IGFkZHIgPSBkbworICAgIHRvIDwtIGhPcGVuIGFkZHIKKyAgICBsZXQgcHMgPSAoQmluYXJ5UHJvdG9jb2wgdG8sIEJpbmFyeVByb3RvY29sIHRvKQorCisgICAgdjEgPC0gQ2xpZW50LnRlc3RTdHJpbmcgcHMgImJ5YSIKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MQorCisgICAgdjIgPC0gQ2xpZW50LnRlc3RCeXRlIHBzIDgKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MgorCisgICAgdjMgPC0gQ2xpZW50LnRlc3RCeXRlIHBzICgtOCkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MworCisgICAgdjQgPC0gQ2xpZW50LnRlc3RJMzIgcHMgMzIKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2NAorCisgICAgdjUgPC0gQ2xpZW50LnRlc3RJMzIgcHMgKC0zMikKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2NQorCisgICAgdjYgPC0gQ2xpZW50LnRlc3RJNjQgcHMgNjQKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2NgorCisgICAgdjcgPC0gQ2xpZW50LnRlc3RJNjQgcHMgKC02NCkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2NworCisgICAgdjggPC0gQ2xpZW50LnRlc3REb3VibGUgcHMgMy4xNAorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHY4CisKKyAgICB2OSA8LSBDbGllbnQudGVzdERvdWJsZSBwcyAoLTMuMTQpCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjkKKworICAgIC0tIFRPRE86IENsaWVudC50ZXN0QmluYXJ5IC4uLgorCQorICAgIHYxMCA8LSBDbGllbnQudGVzdE1hcCBwcyAoTWFwLmZyb21MaXN0IFsoMSwxKSwoMiwyKSwoMywzKV0pCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEwCisKKyAgICB2MTEgPC0gQ2xpZW50LnRlc3RTdHJpbmdNYXAgcHMgKE1hcC5mcm9tTGlzdCBbKCJhIiwiMTIzIiksKCJhIGIiLCJ3aXRoIHNwYWNlcyAiKSwoInNhbWUiLCJzYW1lIiksKCIwIiwibnVtZXJpYyBrZXkiKV0pCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjExCisKKyAgICB2MTIgPC0gQ2xpZW50LnRlc3RMaXN0IHBzIChWZWN0b3IuZnJvbUxpc3QgWzEsMiwzLDQsNV0pCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEyCisKKyAgICB2MTMgPC0gQ2xpZW50LnRlc3RTZXQgcHMgKFNldC5mcm9tTGlzdCBbMSwyLDMsNCw1XSkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTMKKworICAgIHYxNCA8LSBDbGllbnQudGVzdFN0cnVjdCBwcyAoVHlwZXMuWHRydWN0ICJoaSIgNCA1IDApCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjE0CisKKyAgICAodGVzdEV4Y2VwdGlvbiBwcyAiYmFkIikgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0ZXN0RXhjZXB0aW9uSGFuZGxlcgorCisgICAgKHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAib2siKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIxCisgICAgKHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAiYmFkIikgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0ZXN0TXVsdGlFeGNlcHRpb25IYW5kbGVyMiBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIzCisKKyAgICAtLSAoICAoQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAiZSIgImUyIj4+IFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgImJhZCIpIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgCisKKyAgICB0Q2xvc2UgdG8KKyAgd2hlcmUgdGVzdEV4Y2VwdGlvbiBwcyBtc2cgPSBkbworICAgICAgICAgICAgXyA8LSBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcyAiZSIKKyAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgbXNnCisgICAgICAgICAgICByZXR1cm4gKCkKKworICAgICAgICB0ZXN0RXhjZXB0aW9uSGFuZGxlciAoZSA6OiBUeXBlcy5YY2VwdGlvbikgPSBkbworICAgICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgZQorCisgICAgICAgIHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyBtc2cgPSBkbworICAgICAgICAgICAgXyA8LSBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHBzICJlIiAiZTIiCisgICAgICAgICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nIG1zZworICAgICAgICAgICAgcmV0dXJuICgpCisKKyAgICAgICAgdGVzdE11bHRpRXhjZXB0aW9uSGFuZGxlcjEgKGUgOjogVHlwZXMuWGNlcHRpb24pID0gZG8KKyAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IGUKKworICAgICAgICB0ZXN0TXVsdGlFeGNlcHRpb25IYW5kbGVyMiAoZSA6OiBUeXBlcy5YY2VwdGlvbjIpID0gZG8KKyAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IGUKKworICAgICAgICB0ZXN0TXVsdGlFeGNlcHRpb25IYW5kbGVyMyAoXyA6OiBDb250cm9sLkV4Y2VwdGlvbi5Tb21lRXhjZXB0aW9uKSA9IGRvCisgICAgICAgICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICJvayIKKworCitzZXJ2ZXIgOjogTmV0d29yay5Qb3J0TnVtYmVyIC0+IElPICgpCitzZXJ2ZXIgcG9ydCA9IGRvCisgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiUmVhZHkuLi4iCisgICAgKHJ1bkJhc2ljU2VydmVyIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyBwb3J0KQorICAgIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAKKyAgICAoXChUcmFuc3BvcnRFeG4gcyBfKSAtPiBlcnJvciAkICJGQUlMVVJFOiAiICsrIHMpCisKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IFRocmlmdFRlc3RVdGlscy5ydW5UZXN0IHNlcnZlciBjbGllbnQKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvcnVuLXRlc3Quc2ggYi90ZXN0L2hzL3J1bi10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjYWZjMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL3J1bi10ZXN0LnNoCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWYgWyAieCIgPSAieCQxIiBdOyB0aGVuCisgIHByaW50ZiAicnVuLXRlc3Quc2ggbmVlZHMgYW4gYXJndW1lbnQsIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHRvIHJ1bi4gVHJ5ICdUaHJpZnRUZXN0JyBvciAnUHJvdG9EZWJ1Z1Rlc3QnXG4iCisgIGV4aXQgMgorZmkKKworIyBDaGVjayBzb21lIGJhc2ljcworaWYgWyAteiAkQkFTRSBdOyB0aGVuCisgICAgQkFTRT0uLi8uLgorZmkKKworIyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0byBydW4gaGFzIGEgc2VydmVyCitpZiBbIC16ICRURVNUX1NPVVJDRV9GSUxFIF07IHRoZW4KKyAgICBURVNUX1NPVVJDRV9GSUxFPSRCQVNFL3Rlc3QvaHMvJDFfTWFpbi5ocworZmkKKworaWYgWyAhIC1lICRURVNUX1NPVVJDRV9GSUxFIF07IHRoZW4KKyAgICBwcmludGYgIk1pc3Npbmcgc2VydmVyIGNvZGUgZmlsZSAkVEVTVF9TT1VSQ0VfRklMRSBcbiIKKyAgICBleGl0IDMKK2ZpCisKK3ByaW50ZiAiUnVubmluZyB0ZXN0Li4uIFxuIgorcnVuaGFza2VsbCAtV2FsbCAtWFNjb3BlZFR5cGVWYXJpYWJsZXMgLWkkQkFTRS9saWIvaHMvc3JjIC1pZ2VuLWhzICRURVNUX1NPVVJDRV9GSUxFCmRpZmYgLS1naXQgYS90ZXN0L2hzL3J1bmNsaWVudC5zaCBiL3Rlc3QvaHMvcnVuY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTNiYmIxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHMvcnVuY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pZiBbIC16ICRCQVNFIF07IHRoZW4KLSAgICBCQVNFPS4uLy4uCi1maQotCi1naGNpIC1mZ2xhc2dvdy1leHRzIC1pJEJBU0UvbGliL2hzL3NyYyAtaSRCQVNFL3Rlc3QvaHMvZ2VuLWhzIENsaWVudC5ocwpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9ydW5zZXJ2ZXIuc2ggYi90ZXN0L2hzL3J1bnNlcnZlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzMzAxYi4uMDAwMDAwMAotLS0gYS90ZXN0L2hzL3J1bnNlcnZlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaWYgWyAteiAkQkFTRSBdOyB0aGVuCi0gICAgQkFTRT0uLi8uLgotZmkKLQotcHJpbnRmICJTdGFydGluZyBzZXJ2ZXIuLi4gIgotZ2hjIC1mZ2xhc2dvdy1leHRzIC1pJEJBU0UvbGliL2hzL3NyYyAtaSRCQVNFL3Rlc3QvaHMvZ2VuLWhzIFNlcnZlci5ocyAtZSAicHV0U3RyTG4gXCJyZWFkeS5cIiA+PiBTZXJ2ZXIubWFpbiIKZGlmZiAtLWdpdCBhL3Rlc3QvaW5kZXguaHRtbCBiL3Rlc3QvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjExYTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPCFET0NUWVBFIEhUTUw+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgY2hhcnNldD0idXRmLTgiPgorPHRpdGxlPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy5jc3MiPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS4zLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvanMvanF1ZXJ5LmRhdGFUYWJsZXMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc3VsdC5qcyI+Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGgyPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlOiBSZXN1bHRzPC9oMj4KKzx0YWJsZSBpZD0idGVzdF9yZXN1bHRzIiBjbGFzcz0iZGlzcGxheSI+CisgICAgPHRoZWFkPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U2VydmVyPC90aD4KKyAgICAgICAgICAgIDx0aD5DbGllbnQ8L3RoPgorICAgICAgICAgICAgPHRoPlByb3RvY29sPC90aD4KKyAgICAgICAgICAgIDx0aD5UcmFuc3BvcnQ8L3RoPgorICAgICAgICAgICAgPHRoPlJlc3VsdCAobG9nKTwvdGg+CisgICAgICAgICAgICA8dGg+RXhwZWN0ZWQ8L3RoPgorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+Cis8L3RhYmxlPgorPGgyPlRlc3QgSW5mb3JtYXRpb248L2gyPgorPHByZSBpZD0idGVzdF9pbmZvIj48L3ByZT4KKworPGEgaHJlZj0ibG9nIj5icm93c2UgcmF3IGxvZzwvYT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL0NBLnBlbSBiL3Rlc3Qva2V5cy9DQS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0N2I5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9DQS5wZW0KQEAgLTAsMCArMSw4MiBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxNjU4MjA4MDA4ODk1NDM4MTIxMiAoMHhlNjFmNjFmYzNiMzQyMzljKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIFNUPU1hcnlsYW5kLCBMPUZvcmVzdCBIaWxsLCBPPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgT1U9QXBhY2hlIFRocmlmdCwgQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEFwciAgNyAxODo1ODowMCAyMDE0IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVuIDI0IDE4OjU4OjAwIDIwMjIgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIFNUPU1hcnlsYW5kLCBMPUZvcmVzdCBIaWxsLCBPPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgT1U9QXBhY2hlIFRocmlmdCwgQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDphYToxMzpkNDpjNDpmNzowMToxNzphNzo5MjpkMTpiNDpiNDoxNTowZDoKKyAgICAgICAgICAgICAgICAgICAgMjE6OTA6MTk6NWU6ZmM6ZmI6YjY6NmQ6M2Y6ZjI6M2Y6NjU6YTI6N2E6NDM6CisgICAgICAgICAgICAgICAgICAgIGE2OjQ2Ojk1OmZjOjQzOjE2OmY2OjYzOjE0OjVlOmY3OmIxOmUzOjYxOjAyOgorICAgICAgICAgICAgICAgICAgICBmOTo0YTo5NTo4OTpiZjo4ZDpmOTo0ODoxZDo4MjplNzozNDplMDpiMjo0ODoKKyAgICAgICAgICAgICAgICAgICAgZGY6MDg6ZDk6N2M6M2E6MmY6ZDM6MWI6MGI6ZTg6ZWY6YzI6NDE6MGE6N2Q6CisgICAgICAgICAgICAgICAgICAgIDBhOjM4Ojc4OjNhOjMxOjY2OjczOjk5OjhjOmQxOjc5OjI3OjVmOmU1OjY2OgorICAgICAgICAgICAgICAgICAgICBkMDo1ZTozYTo4YzowYzo5MjoxODo3MzowNDpjMTpmNTo0NTpkYjozNzplNzoKKyAgICAgICAgICAgICAgICAgICAgNWY6Yzc6OGM6YTM6NjA6ZTk6OTI6YTA6ZDg6Mjk6NWQ6Nzc6NDg6ZmI6MWQ6CisgICAgICAgICAgICAgICAgICAgIGIwOmVkOjEyOjJjOjRlOjJlOjAyOmRiOjNkOjFhOjQxOjcxOmE2OjJiOjJlOgorICAgICAgICAgICAgICAgICAgICBiMzo0Yzo2YTpjNzpmNzoxZDphOTo3ZTpjNzpjZjpkYjpmMjplNzpiNjpmMzoKKyAgICAgICAgICAgICAgICAgICAgMWY6Nzc6MWQ6MjQ6MDE6MWE6NjY6NjY6MzA6ODU6MzA6MDI6Mjk6YzQ6YmI6CisgICAgICAgICAgICAgICAgICAgIGY3OmNkOjNmOjg5OjRiOjFhOjVmOmY0OjkxOjk2OmZiOmU5OjM5OmYyOjQ2OgorICAgICAgICAgICAgICAgICAgICA5NjoxMjozZDo4YToyMzpiNToyZTo4Mjo5ZTo0MTpmZTo0MDpiNjoyNzpiMToKKyAgICAgICAgICAgICAgICAgICAgMTQ6NDQ6NWM6OTY6MzA6MGY6NTU6ZTQ6YmI6YWQ6OGI6OGE6OTk6MTc6YzA6CisgICAgICAgICAgICAgICAgICAgIDI5OjExOjRlOjc2Ojc5OjlkOjRiOjAzOjMxOjdlOjg1OjNjOmE4OjIzOjQwOgorICAgICAgICAgICAgICAgICAgICA1NDowMjo1ODozNTpjNjpmYzpkZDozZDplYjplMzpkMTo1MTowMDowMjo4NjoKKyAgICAgICAgICAgICAgICAgICAgMWE6ZDc6YjA6OWY6YTA6MTc6NzM6NmE6NWE6ZDA6ZTY6YjY6Yjg6NTU6NDA6CisgICAgICAgICAgICAgICAgICAgIDVlOjI3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAyODpGMjpGRDozMDpDRDowMzpGMTpEQzo0MToxRTpDNDo5MzpDNjo5NzoxMzpDQTpENDpGQTo2MDoyQQorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6Mjg6RjI6RkQ6MzA6Q0Q6MDM6RjE6REM6NDE6MUU6QzQ6OTM6QzY6OTc6MTM6Q0E6RDQ6RkE6NjA6MkEKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgICA0NjoxNToxODo4OTpiMjo1NzoxNzpkMTphMjo2NDpjMTo5YTo3Mzo0ZjowNDo5NDo3NjowNzoKKyAgICAgICAgIDFmOjI5OmJhOjZmOjM0OjQ2OmMyOjM2OmQ1OjY4Ojg1OmY0OjE1OjRjOjhlOjFhOmZlOjgzOgorICAgICAgICAgNzk6NTM6ZWM6YWE6MGQ6OTI6NjA6ZGU6ZjM6OWE6M2E6ZTg6ODA6NjY6YWM6ODc6NzA6ODk6CisgICAgICAgICA1OTpmMjphYzo5ZTpiMDoyODoxMTozNzo3ZDo3ODo0ZTo1ZTozZjoyNTowZjpiZTowOTo2ZjoKKyAgICAgICAgIDI2OjJhOjNkOjY2Ojc5OjM4OjI4OmU1OjgxOjcxOjcxOjk2OjI2OjRmOmRiOmVjOjIzOjcwOgorICAgICAgICAgYmU6Mzc6Mzk6ZmM6ZTA6MzI6MGQ6ODA6OGY6NjY6Yzc6YWM6YTQ6YjQ6OGI6Nzc6NDA6ZTI6CisgICAgICAgICA5OTo0NDozYTo3MzpjODpmOToxNDpjZjoxYjozMjoyNzpjMjo3ODpkYjpiMDpkYTo4YTo2MDoKKyAgICAgICAgIGViOjhkOjM0OjdlOjdkOjNjOjAzOmQ0OjM4Ojc0OmY3OjE3OjllOjMyOjc0OjlhOmU3OjM3OgorICAgICAgICAgOTU6ZDQ6NzE6MDM6Yzg6OTQ6ZWE6MDk6N2I6YWQ6MmQ6ZWI6NzA6NDM6ZjI6MzI6N2U6NjM6CisgICAgICAgICAwMTo4NDo4Yzo3ZTo5ZTpmMDo3OTo3ZjphZTplOTpjZjpmOTpiZTowZTpmZTo5NTpkMjpiZDoKKyAgICAgICAgIGM4OmE3OjgxOmMyOjcxOmQ5OmMzOjUwOjMxOjg5OjZkOmZhOmFkOmEyOmFiOjAwOjAxOjM0OgorICAgICAgICAgMTA6NTg6ZWY6OTY6NWE6ZWI6MzA6MDc6YTk6OGU6ODQ6MzY6ZWY6M2Q6M2M6NjE6NDY6OTY6CisgICAgICAgICA2YTplODowOToyMDo1YTphYjpmODo0YjplYjpiNzozMzo2MTo4ZTphZjo5YTo3ZDoxNjpiMDoKKyAgICAgICAgIDYwOjZhOmYwOjMwOmU1OmIyOjhlOmU3OjgwOmI0OmExOjAyOmE5OjM3OmZlOjVmOmI1OmFlOgorICAgICAgICAgNjU6ZTk6NmI6MzQKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU56Q0NBeCtnQXdJQkFnSUpBT1lmWWZ3N05DT2NNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3hNUXN3Q1FZRAorVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNQzBadmNtVnpkQ0JJYVd4cworTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhGakFVQmdOVgorQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERFa01DSUdDU3FHU0liMworRFFFSkFSWVZaR1YyUUhSb2NtbG1kQzVoY0dGamFHVXViM0puTUI0WERURTBNRFF3TnpFNE5UZ3dNRm9YRFRJeQorTURZeU5ERTROVGd3TUZvd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoTllYSjViR0Z1WkRFVQorTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm9aU0JCY0dGamFHVWdVMjltZEhkaAorY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm9jbWxtZERFU01CQUdBMVVFQXd3SgorYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHlhV1owTG1Gd1lXTm9aUzV2Y21jdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FFOVRFOXdFWHA1TFJ0TFFWRFNHUQorR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3lTTjhJMlh3NgorTDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0hqS05nNlpLZworMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUJHbVptTUlVdworQWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGt1NjJMaXBrWAord0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG10cmhWUUY0bgorQWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQWZCZ05WSFNNRQorR0RBV2dCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFCR0ZSaUpzbGNYMGFKa3dacHpUd1NVZGdjZkticHZORWJDTnRWb2hmUVZUSTRhL29ONQorVSt5cURaSmczdk9hT3VpQVpxeUhjSWxaOHF5ZXNDZ1JOMzE0VGw0L0pRKytDVzhtS2oxbWVUZ281WUZ4Y1pZbQorVDl2c0kzQytOem44NERJTmdJOW14NnlrdEl0M1FPS1pSRHB6eVBrVXp4c3lKOEo0MjdEYWltRHJqVFIrZlR3RAorMURoMDl4ZWVNblNhNXplVjFIRUR5SlRxQ1h1dExldHdRL0l5Zm1NQmhJeCtudkI1ZjY3cHovbStEdjZWMHIzSQorcDRIQ2NkbkRVREdKYmZxdG9xc0FBVFFRV08rV1d1c3dCNm1PaERidlBUeGhScFpxNkFrZ1dxdjRTK3UzTTJHTworcjVwOUZyQmdhdkF3NWJLTzU0QzBvUUtwTi81ZnRhNWw2V3MwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvUkVBRE1FLm1kIGIvdGVzdC9rZXlzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTA4MzVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL1JFQURNRS5tZApAQCAtMCwwICsxLDEwMiBAQAorIyBUZXN0IEtleXMgYW5kIENlcnRpZmljYXRlcworVGhpcyBmb2xkZXIgaXMgZGVkaWNhdGVkIHRvIHRlc3Qga2V5cyBhbmQgY2VydGlmaWNhdGVzIHByb3ZpZGVkIGluIG11bHRpcGxlIGZvcm1hdHMuCitQcmltYXJ5IHVzZSBhcmUgdW5pdCB0ZXN0IHN1aXRlcyBhbmQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMuCisKKyAgICB0ZXN0L2tleXMKKworKipUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgbXVzdCBuZXZlciBiZSB1c2VkIG9uIHByb2R1Y3Rpb24gc3lzdGVtcy4qKgorCisjIyBTU0wgS2V5cyBhbmQgQ2VydGlmaWNhdGVzCisKKworIyMgY3JlYXRlIGNlcnRpZmljYXRlcworCit3ZSB1c2UgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGZvciB0ZXN0IGtleSBhbmQgY2VydGlmaWNhdGUgY3JlYXRpb24KKworICAgIEM9VVMsCisgICAgU1Q9TWFyeWxhbmQsCisgICAgTD1Gb3Jlc3QgSGlsbCwKKyAgICBPPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgICBPVT1BcGFjaGUgVGhyaWZ0LAorICAgIENOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCisKKyMjIyBjcmVhdGUgc2VsZi1zaWduZWQgc2VydmVyIGtleSBhbmQgY2VydGlmaWNhdGUKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLW5vZGVzICAtZGF5cyAzMDAwIC1vdXQgc2VydmVyLmNydCAta2V5b3V0IHNlcnZlci5rZXkKKyAgICBvcGVuc3NsIHg1MDkgLWluIHNlcnZlci5jcnQgLXRleHQgPiBDQS5wZW0KKyAgICBjYXQgc2VydmVyLmNydCBzZXJ2ZXIua2V5ID4gc2VydmVyLnBlbQorCitFeHBvcnQgcGFzc3dvcmQgaXMgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzCisKKyAgICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1jbGNlcnRzIC1pbiBzZXJ2ZXIuY3J0IC1pbmtleSBzZXJ2ZXIua2V5IC1vdXQgc2VydmVyLnAxMgorCisjIyMgY3JlYXRlIGNsaWVudCBrZXkgYW5kIGNlcnRpZmljYXRlCisKKyAgICBvcGVuc3NsIGdlbnJzYSAtb3V0IGNsaWVudC5rZXkKKworY3JlYXRlIGEgc2lnbmluZyByZXF1ZXN0OgorCisgICAgb3BlbnNzbCByZXEgLW5ldyAta2V5IGNsaWVudC5rZXkgLW91dCBjbGllbnQuY3NyCisKK3NpZ24gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIua2V5CisKKyAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzMDAwIC1pbiBjbGllbnQuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnQuY3J0CisKK2V4cG9ydCBjZXJ0aWZpY2F0ZSBpbiBQS0NTMTIgZm9ybWF0IChFeHBvcnQgcGFzc3dvcmQgaXMgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzKQorCisgICAgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtY2xjZXJ0cyAtaW4gY2xpZW50LmNydCAtaW5rZXkgY2xpZW50LmtleSAtb3V0IGNsaWVudC5wMTIKKworZXhwb3J0IGNlcnRpZmljYXRlIGluIFBFTSBmb3JtYXQgZm9yIE9wZW5TU0wgdXNhZ2UKKworICAgIG9wZW5zc2wgcGtjczEyIC1pbiBjbGllbnQucDEyIC1vdXQgY2xpZW50LnBlbSAtY2xjZXJ0cworCisjIyMgY3JlYXRlIGNsaWVudCBrZXkgYW5kIGNlcnRpZmljYXRlIHdpdGggYWx0bmFtZXMKKworY29weSBvcGVuc3NsLmNuZiBmcm9tIHlvdXIgc3lzdGVtIGUuZy4gL2V0Yy9zc2wvb3BlbnNzbC5jbmYgYW5kIGFwcGVuZCBmb2xsb3dpbmcgdG8gdGhlIGVuZCBvZiBbIHYzX3JlcSBdCisKKyAgICBzdWJqZWN0QWx0TmFtZT1AYWx0ZXJuYXRlX25hbWVzCisKKyAgICBbIGFsdGVybmF0ZV9uYW1lcyBdCisgICAgSVAuMT0xMjcuMC4wLjEKKyAgICBJUC4yPTo6MQorICAgIElQLjM9OjpmZmZmOjEyNy4wLjAuMQorCitjcmVhdGUgYSBzaWduaW5nIHJlcXVlc3Q6CisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC1rZXkgY2xpZW50X3YzLmtleSAtb3V0IGNsaWVudF92My5jc3IgLWNvbmZpZyBvcGVuc3NsLmNuZiBcCisgICAgICAgIC1zdWJqICIvQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0IiAtZXh0ZW5zaW9ucyB2M19yZXEKKworc2lnbiB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlIHNlcnZlci5rZXkKKworICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDMwMDAgLWluIGNsaWVudF92My5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudF92My5jcnQgLWV4dGVuc2lvbnMgdjNfcmVxIC1leHRmaWxlIG9wZW5zc2wuY25mCisKKyMjIEphdmEga2V5IGFuZCBjZXJ0aWZpY2F0ZSBpbXBvcnQKK0phdmEgVGVzdCBFbnZpcm9ubWVudCB1c2VzIGtleSBhbmQgdHJ1c3Qgc3RvcmUgcGFzc3dvcmQgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzCisKK2xpc3Qga2V5c3RvcmUgZW50cmllcworCisgICAga2V5dG9vbCAtbGlzdCAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKKworbGlzdCB0cnVzdHN0b3JlIGVudHJpZXMKKworICAgIGtleXRvb2wgLWxpc3QgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUKKworCitkZWxldGUgYW4gZW50cnkKKworICAgIGtleXRvb2wgLWRlbGV0ZSAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSAtYWxpYXMgc3NsdGVzdAorCisKK2ltcG9ydCBjZXJ0aWZpY2F0ZSBpbnRvIHRydXN0c3RvcmUKKworICAgIGtleXRvb2wgLWltcG9ydGNlcnQgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgLWFsaWFzIGxvY2FsaG9zdCAtLWZpbGUgc2VydmVyLmNydAorCitpbXBvcnQga2V5IGludG8ga2V5c3RvcmUKKworICAgIGtleXRvb2wgLWltcG9ydGtleXN0b3JlIC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZSAtc3Jjc3RvcmV0eXBlIHBrY3MxMiAtc3Jja2V5c3RvcmUgc2VydmVyLnAxMgorCisjIFRlc3QgU1NMIHNlcnZlciBhbmQgY2xpZW50cworCisgICAgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCBsb2NhbGhvc3Q6OTA5MAorICAgIG9wZW5zc2wgc19zZXJ2ZXIgLWFjY2VwdCA5MDkwIC13d3cKKwpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5jcnQgYi90ZXN0L2tleXMvY2xpZW50LmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5jcnQKQEAgLTAsMCArMSwyMyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEMkRDQ0FzQUNBUUV3RFFZSktvWklodmNOQVFFTEJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECitWUVFJREFoTllYSjViR0Z1WkRFVU1CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvCitaU0JCY0dGamFHVWdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvCitjbWxtZERFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5CithV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFV4TWpJek1EY3dOelV3V2hjTk1qUXdNekV3TURjd056VXdXakNCCitzVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psCitjM1FnU0dsc2JERW5NQ1VHQTFVRUNnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1CitNUll3RkFZRFZRUUxEQTFCY0dGamFHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpCitCZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGwvYkpoZzE3UHUxdDc4NUpJdXdsaDdlMkU1MWVvV0Z2dXhNV2ZICitkc1VBVnFEYU96OTlPNXN2OHBnV0tYcmtQQnR0RTk4VCtNeC9Qd3o1SkhzNFFjcmUzQTVhZG02Y2RhYjBBS3VnCitlVkcxUHZIcld6VjRhaGVnNEtVZlZTaU16OEJHMkszUTFWR3Zaa2dNUmEvUTQwOUZLalU2WjREOXZCRzRQYXMzCitQTjVGeG5BTDZQNzB5V0NFcjJWdS90V0psQ04rcXJSRGZTYUUyaHFtVDFpcnhhb1BhNjFHdnVSVnNHUTNUZW9FCittR2ZFTnR2RnFDNnFRV3VTQ2JHNWFJNDdSdjY2cHFvV1d4cWtyY29sTmM3K3ZoeDZyVyt3ZEZPM0lscUlUOElHCitzZFFWcCtZNGlyL2RHcDJlanpxR1pDcmVtUEoxdUVLakxNcEl1a2RnMjV5bUhDMENBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQmNSZHdjOW1kWTl6T3ZUaXh0VGhIcmNpVnZxd3A2UmFpUXFNRVZvbW96WWlsWkRSCitKOTBNM0g2S25sQURKYkN2MEZYdWpzYUFwQjUzYXdxNUk3c09iQVlXRmhESlo5TEtsdzBsREY3S2NoTFhpQWxrCitYVnl2TDJuSmp1SmN4UENGUFdrdHdydzViVGd1UkNCekcxMkh6aWtuK3hzNnVQdXI3VlFZTTMzamJYRWRhNVBTCitVRXF2QVZXYU9OSkNYOE1EWU9zY1ZvSkYwRVN5SStmTjkyaXBGYVhSN2ZHYWpvZC9yYzBBZmVOMkdWTVpFVHZlCisyMXBrVXlEd3dDR0E0NHV2TlVDZDFlMzJOeEUzYWg5VUFwQ1JuNXNHSjY0UjZ1cnBGVFhUM0lBTEYza2FPTzdVCitWc01oRnJVaVo3K0J3NW5JZWlLMFFPRjZFaXBqK2JKdnJMWnBTZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LmtleSBiL3Rlc3Qva2V5cy9jbGllbnQua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LmtleQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFb3dJQkFBS0NBUUVBdVg5c21HRFhzKzdXM3Z6a2tpN0NXSHQ3WVRuVjZoWVcrN0V4WjhkMnhRQldvTm83CitQMzA3bXkveW1CWXBldVE4RzIwVDN4UDR6SDgvRFBra2V6aEJ5dDdjRGxwMmJweDFwdlFBcTZCNVViVSs4ZXRiCitOWGhxRjZEZ3BSOVZLSXpQd0ViWXJkRFZVYTltU0F4RnI5RGpUMFVxTlRwbmdQMjhFYmc5cXpjODNrWEdjQXZvCisvdlRKWUlTdlpXNysxWW1VSTM2cXRFTjlKb1RhR3FaUFdLdkZxZzlyclVhKzVGV3daRGRONmdTWVo4UTIyOFdvCitMcXBCYTVJSnNibG9qanRHL3JxbXFoWmJHcVN0eWlVMXp2NitISHF0YjdCMFU3Y2lXb2hQd2dheDFCV241amlLCit2OTBhblo2UE9vWmtLdDZZOG5XNFFxTXN5a2k2UjJEYm5LWWNMUUlEQVFBQkFvSUJBRm90YkNtWHlzVWFjekxzCitWbUlLZ1VocW4weGd4WEdMVTVrQVJ6aGdhNGpSNVV0RlRGQk5IVkVRT2l0ZGVzVFhkN0VOa2Y5OHdoTUlPU3FoCitZKzdUSm9qdFZxVlRyUWVRNEZGTmhaWHA2WkNqUC9wenBGK1dMbDFXUkYrQm4vQ2FvOVNobkd6RGZUQzh5RWgyCitUdHB0L2xObkdHSFFCc2xha0xjOGpoNVNPREVGZmJ1Z1g4U2RUQ3daWXNlc0tOclhtMXBTLzVJRXVuUHFhUmkwCitJSTBFY25xSEVzZ3FTbytDbGpwVzd1TnhTcnlBMnZTQVZkbFBlajYrOUZaamRJSExQNUFFS1l2azdlOUQyQ01WCisxK2dyTmUvUWtRcHBTaGl6UGlyYmI5M3RIbTg2djVia0RGQ005eVdyaGNNY2p2SUxNWEVUeElwcE1HUG1hY1J1CitqcXRZY0FFQ2dZRUE4VkR6eWxUejRrUzMrRDNuM2hUZ2I0MVhWWWE3ZmVVc2g5OUdXUk8xd1hJRnBIakNJUmpBCis5ci9CWFc5K1J4M3B1VlBoUzhod0xRNEJMZEE3bEZwVjFDOGFnMGUzK3ZuNnpWaXJuejFqdEkrdUhNdlN0emhPCitkNmkwbmYrdzRIWVhvN21ONm85WmRIRWZDOFNGTmJ5bWhDb1ZLaDJESUxEd2I0RVg5UlhOcHkwQ2dZRUF4TWo0CisrdnJrbEovaWxIK1J5MXpzdDR6UVlJd21tM1FXamFyRHJ5cEd1Y0hnZDRqZzV2OUEvQ0pJS1VpOHgwTWpyY3VOCit3VmI3UjhYSnlZekZRUlhJVVhSNkduTGVlU25mcHh6dDRZbGlmQ3ZYeG5PaTh3NGZ2N0tlR0JWNW5wMUVncG84CituV055WkZ4ZHZRRHVDb3ByM1NVb1M5Skk4SlB3VmdBN1QrN0RhUUVDZ1lBR29hdmhibzQ1Tkp3OXBTM2ZDNEhUCitidlhzY3NScVJFY0NBTi9GQ09hZ3gwcGlaN01tQjdFZDFzMHdqU1RTUFg4enladFNZdEs2V2owc0RpSGxCTXFCCitCejVhUnpsR0cyS0tEQnJEU0lPWjdhemlPN094dDBsb3Zta2dRbXVRNzQzY3dQZW1iNFFNMENNRFJzWkdZTVhPCitzZjFjNSt5M2xFVTNPenYyVDBBVWpRS0JnQmxuek9VeU1RS1RKY0NBTzhWaWlOa2xuOTFuR3JEbEt1ZzlUS2czCitzQXZaWU81dHlJTnFIdXl1VEZ5d0hGY3BidGpJTjlQbk0rZlBQRDcrSXBWRmg2Z2tmb01kbzJWSEo2MitpV09kCit4ZzQ3NXM2akxUMXQ3R0ZtWVF6QThRT3VVQ01BWUtUOUtzNlVNakh0aGMzc2t3SnBBcXZQU1VWdUJCQkdWV0g3CitkRlVCQW9HQkFMNjdBUkx1amlBRVZOSHQ1cmFqaXhCNm5jbDcvUitaMnVhd0kxSmZtZG5DWm9uQUtWWllIdVhVCisvNGoyK280UWhKSVBMdFdJb2F4QWtNaWdRdEFrZXNxaXJuM0trL2M3a1pSSW9ONTQ5SFRKdXdacVlxTnA3Q0IvCitrVmk1UjMzNStNOXo0OWk2cUEwUlpzSkdTb1NCazdQdWZHNFJtTGltY1JiR3dyWTkzc1BECistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5wMTIgYi90ZXN0L2tleXMvY2xpZW50LnAxMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDI2NjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5wMTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5wZW0gYi90ZXN0L2tleXMvY2xpZW50LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmVmNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5wZW0KQEAgLTAsMCArMSw2MCBAQAorQmFnIEF0dHJpYnV0ZXMKKyAgICBsb2NhbEtleUlEOiAzOSBFQyAzRCA1QiAyOCAxNyBEQSBERCAwOSA3QSA2MiA2OCBENSA0NCAxRiBDNyBFMiBGOCBFMCBDRCAKK3N1YmplY3Q9L0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCitpc3N1ZXI9L0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQyRENDQXNBQ0FRRXdEUVlKS29aSWh2Y05BUUVMQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKK1ZRUUlEQWhOWVhKNWJHRnVaREVVTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm8KK1pTQkJjR0ZqYUdVZ1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm8KK2NtbG1kREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHkKK2FXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UVXhNakl6TURjd056VXdXaGNOTWpRd016RXdNRGN3TnpVd1dqQ0IKK3NURUxNQWtHQTFVRUJoTUNWVk14RVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmwKK2MzUWdTR2xzYkRFbk1DVUdBMVVFQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKK01SWXdGQVlEVlFRTERBMUJjR0ZqYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWkKK0Jna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMbC9iSmhnMTdQdTF0Nzg1Skl1d2xoN2UyRTUxZW9XRnZ1eE1XZkgKK2RzVUFWcURhT3o5OU81c3Y4cGdXS1hya1BCdHRFOThUK014L1B3ejVKSHM0UWNyZTNBNWFkbTZjZGFiMEFLdWcKK2VWRzFQdkhyV3pWNGFoZWc0S1VmVlNpTXo4QkcySzNRMVZHdlprZ01SYS9RNDA5RktqVTZaNEQ5dkJHNFBhczMKK1BONUZ4bkFMNlA3MHlXQ0VyMlZ1L3RXSmxDTitxclJEZlNhRTJocW1UMWlyeGFvUGE2MUd2dVJWc0dRM1Rlb0UKK21HZkVOdHZGcUM2cVFXdVNDYkc1YUk0N1J2NjZwcW9XV3hxa3Jjb2xOYzcrdmh4NnJXK3dkRk8zSWxxSVQ4SUcKK3NkUVZwK1k0aXIvZEdwMmVqenFHWkNyZW1QSjF1RUtqTE1wSXVrZGcyNXltSEMwQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCY1Jkd2M5bWRZOXpPdlRpeHRUaEhyY2lWdnF3cDZSYWlRcU1FVm9tb3pZaWxaRFIKK0o5ME0zSDZLbmxBREpiQ3YwRlh1anNhQXBCNTNhd3E1STdzT2JBWVdGaERKWjlMS2x3MGxERjdLY2hMWGlBbGsKK1hWeXZMMm5KanVKY3hQQ0ZQV2t0d3J3NWJUZ3VSQ0J6RzEySHppa24reHM2dVB1cjdWUVlNMzNqYlhFZGE1UFMKK1VFcXZBVldhT05KQ1g4TURZT3NjVm9KRjBFU3lJK2ZOOTJpcEZhWFI3Zkdham9kL3JjMEFmZU4yR1ZNWkVUdmUKKzIxcGtVeUR3d0NHQTQ0dXZOVUNkMWUzMk54RTNhaDlVQXBDUm41c0dKNjRSNnVycEZUWFQzSUFMRjNrYU9PN1UKK1ZzTWhGclVpWjcrQnc1bkllaUswUU9GNkVpcGorYkp2ckxacFNnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0JhZyBBdHRyaWJ1dGVzCisgICAgbG9jYWxLZXlJRDogMzkgRUMgM0QgNUIgMjggMTcgREEgREQgMDkgN0EgNjIgNjggRDUgNDQgMUYgQzcgRTIgRjggRTAgQ0QgCitLZXkgQXR0cmlidXRlczogPE5vIEF0dHJpYnV0ZXM+CistLS0tLUJFR0lOIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCitNSUlGRGpCQUJna3Foa2lHOXcwQkJRMHdNekFiQmdrcWhraUc5dzBCQlF3d0RnUUlSS29sNDJiQVMzQUNBZ2dBCitNQlFHQ0NxR1NJYjNEUU1IQkFqT3VsY3lITWFXc1FTQ0JNZ2JlWFE4cElZVEVOS20wOFVQZXF4a0NSMm5MeFNPCitndFJtQnhEWWpxWXYzNXk0SzhLaHliQnZTQmxJUGdFNWpFV3hVQ2NjMVF2eTV5ZFVRL1g5cG1rVThkbm1BbURDCitvMHp3ZDNsdDJlTlB5KzRXbGlxRkRWbUhyTGZZUUZPb0lySGp1ekMwbEk0QzJpUE9qeGhmYTF6RnVtZWRnd0dTCitHeDEwWDV1RVZINU42NGZXNkIzQnZ6UU0wcm4ycXIwT051U1JtdGVSdEk4TnN6bmZrZ2VKOWE0Q0lBRjdFNVoyCitKVEdJMTJlZE56elVKMUpoWDQ3Wlc0bWlRd0NVNUxjeTAxVVpxVEZ1VXBtSzdGVVFlZ3RMeTNlNWVES3ErYklnCitaWXE2SHg3bHU4aGpUNWtXWkdLeTcxYVltSEtFakkwZjcyN2NBYnFEVEc1dVpCSEJqd0svM3Avem5RVlFYeEJiCisxK0U5Q2lLZUZkWGoyRWxwdHNuRHlvVHZyU3dKL0pxdTF3a1hCY0g1RW1iZzdhSk1vZDFJT3M2T1FCMXJQRHZkCitGRmE4NHpicVJOV0hTeHh4WVp4Y0I4WVppbkw2L2RRSm5pc0t1OUxNUWQzQkJHc0dXcUg4Wno1dEV2WGpTNUt2CiszZzlKUmE3UURrU0YwMDV4NlUrcS82NzhHMk1HK1crTldxamUzTlp4OVBzaC9QdG0raCtxOW4yR1N2bmliaUs1CittRWo5Rkl3R3F1R3BiWlVUSzVhWEhjS042NTdkS2lJQ3NFSmVOYXIxaVp6blJtenJNYlpKK0R4cUpuVHcrR0F2Cis3WWI2My9DTkF0cVN4aXlOSEdaNk5NMlpBOXZBS1kxSFhuMFJWQzB5MSs5Rm1OcFNSd3YzdS8reWRTQ25Kb25SCitHRUtqek9xTTlEbjdxeGQraDRVbm5BN2hYV3hJVGFnZUI2RzZLbWZpWFJ4aGlXeXF0T0lDZENuZUN3cHE4VVo0CitlMGZtMDVOUlc2TTJtcUdRSHNNTlN2VFdkZHd6NWI4d2d3NGVWc2IreFF5dHhWZGo5bHBCdUI5S3lqUWp4VWdVCiszb1p4NEt5V0xvRVdqa3p0UEFpSzN1djVHZm90TklNZHpuUmZPTjEreG0xTTVzd3RuM3kzUnUxZjZTVFpDN1NwCitxdmJHN2pQbXBCNWdMRVVyaStjaHcrYUtVWWJKMGI4MjBPZDRGTFFZbndMV3I0NlZlbFltVjQ0eHVSMDZ3Z3FQCisxSGNoTVNzSHRTK1psSWlRUVU5amhkeVRybDg2RVFISDMzZGgrU3VhOEFoZmV3UFJ5MlZGcDNaazM0QVVzV2NYCitFZklZR2VtaHFVRDNkckcwU01WYkZGTk9hRkdwOWUwdFFvdVlPQzYvcUZCdi9TTmdRejNtQUVrY2lKWWJVdVVaCitWNFlRUHZ0ZHZTcklTVjBlN2JqRmdkU0VqRzdQN0Y2Q0ZyV1RyalVsSFp1V2o2L3JKMysvMVBIZUpWaXloc3JKCitaWUZlMTRXLzQ4UER4QlJsNElFQW14Y04xRWIyRXo5ZUNxdjBIVzc3SHZpRzZ6SWdua1ByaFdIakZHVXB4S2s0CitqTGZ1QjJUZnE5RjdvenY0TDJRQW4rRi95S3QxUm0ySGg1SjYxZVVKdEFUNjBwYWpnK2dKdGptcHU1UHI0SERuCitiNnAzeG1Zd2FMNUxldDF6Q0FiYk1mZGxESzE0WWpkT2RNL0JFS3BYYjl5NEVJdWJYNUFNWTRsalhlRzlneCtUCitCMVR1UVZkSjBQNXdJSy9EMTBUUXpBV0RLYW0wa3YzUlhpZGx6UnhwWjNzblJuTi9MM0VWZDU4Um50ajFPYzB5CitGaUlpU0tSc3pEYlB6S0R4UUUyc05nUWNkTzI0Sk5MU2Evc1pZdHEyZ1Jnc3BsL1lxSURvNFpZcWk5eDhGNU9TCityZFBVNUQvSDhMV1I0dnBKTEw4RFlySGg1cUZHM0JYMk9KSWhQUlMrNDhwRFl0clJqcDdTLzFaVTY0T0pBeXRrCis5OWhEcVNybjFqMmE2eUZFOEwyUHR6KzRVQ0YyT1FYRWM5UnFxZWI4UUVVdU1Ta05ING9RK0EyRjZ1ekxwWmkwCitYSDY0UjJuaU5DNTZMeFYyaSszVDVLUkVGTGFoeWs4ZXBMWmx2OFlkeFlSNFNiN0ovNXlpb29LM2c5aG1ZVktPCit6TGM9CistLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudF92My5jcnQgYi90ZXN0L2tleXMvY2xpZW50X3YzLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudF92My5jcnQKQEAgLTAsMCArMSwyNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQ0RDQ0F2Q2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQnNURUxNQWtHQTFVRUJoTUNWVk14CitFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbGMzUWdTR2xzYkRFbk1DVUdBMVVFCitDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dU1SWXdGQVlEVlFRTERBMUJjR0ZqCithR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaUJna3Foa2lHOXcwQkNRRVdGV1JsCitka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekFlRncweE5qQXlNakl4TVRVNE5ERmFGdzB5TkRBMU1UQXhNVFU0CitOREZhTUlHTE1Rc3dDUVlEVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNCitDMFp2Y21WemRDQklhV3hzTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrCitZWFJwYjI0eEZqQVVCZ05WQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6CitkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMWjB3aVFuWGc1UU1aWld1Z2QvCitPM3dvYXR5SHVjekp1RlNtWWlSR1dMcjNQdWdCK3h0dmp5MHJUY0UyTU54L2Jkc1Z4cmFwQ0tBK3RNRk9SYkVsCitzRjZqazBIK0I3QnpHb0l3SHI2TjhHUDFWT29BMmVzcmhzTkV6MjJhSkkwMFZhRlRGRThHL3FnRmNpaHlhVldICitac0xhM01ha096RlVtT0JhVjJ0TEJqQ2phem5xWHczZW8zWHdVSTBCa2dTOWI5dnFYalNjbWZXWER3NSsxaXM0CitiQ2d1bUcyemo5RXBMeXBjOXFDR05LRkJPMllJZzBYc0lJSjhScHJsaWFuakw2UDRNZkM2R1BPeVc0TmJaYUxkCitFU3YvYnVtcFZ5dVYvQy94cWtQYWh2T3dCdVBFMWxveFpaUHg2UXYzNjhxbjdTVk5WWk9MeVg3MjJzcG9vQTVHCis2Y3NDQXdFQUFhTlBNRTB3Q1FZRFZSMFRCQUl3QURBTEJnTlZIUThFQkFNQ0JlQXdNd1lEVlIwUkJDd3dLb2NFCitmd0FBQVljUUFBQUFBQUFBQUFBQUFBQUFBQUFBQVljUUFBQUFBQUFBQUFBQUFQLy9md0FBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQlVFbWVRa0cvUFM5MzVqTUhEcmcvNXptNFgyeHJuRnRtVHdiMGpkeGZhdTZ6LzdoCitBYnhENWlveVk3RlVUTkN6STZTeU1vOXZKSnRZQ1RDdUVHcjg0SmpUMlI3MjMyejYwazRjMXovYXYwMVczT3J2CitFeEhmQVo4bGxoa2Z1MDIwOVQ1VGFJWUNCN2hERmo1S0RidGE4YzZmRWN3dG1sSFFXajNNMzFsU05zcjRadFdXCit3T2JoSzNzcVRzT2x1SGJoS053bE5FYXQ0OGxiT1FVQzE5STFXaTNkQVM2bjhscjBsRWhmR0t2cXh1MFZpQVNTCitOMW5MZmRrUkVHcDM5YllwS2cwbjZFRnc1Yll5VjRxRTNjbkllZEZKcDdOSU9NLzZ4bmRKTWgvYzVsNk4ydXlaCit1cEFyUlFwdy8zaitIa0wxeDlicys5MDBRSzBHSTZBeGdqYm9wQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50X3YzLmtleSBiL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODlmNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50X3YzLmtleQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFcEFJQkFBS0NBUUVBdG5UQ0pDZGVEbEF4bGxhNkIzODdmQ2hxM0llNXpNbTRWS1ppSkVaWXV2Yys2QUg3CitHMitQTFN0TndUWXczSDl0MnhYR3Rxa0lvRDYwd1U1RnNTV3dYcU9UUWY0SHNITWFnakFldm8zd1kvVlU2Z0RaCis2eXVHdzBUUGJab2tqVFJWb1ZNVVR3YitxQVZ5S0hKcFZZZG13dHJjeHFRN01WU1k0RnBYYTBzR01LTnJPZXBmCitEZDZqZGZCUWpRR1NCTDF2MitwZU5KeVo5WmNQRG43V0t6aHNLQzZZYmJPUDBTa3ZLbHoyb0lZMG9VRTdaZ2lECitSZXdnZ254R211V0pxZU12by9neDhMb1k4N0piZzF0bG90MFJLLzl1NmFsWEs1WDhML0dxUTlxRzg3QUc0OFRXCitXakZsay9IcEMvZnJ5cWZ0SlUxVms0dkpmdmJheW1pZ0RrYnB5d0lEQVFBQkFvSUJBUUNKcHlVaGFhSUlZbkJHCis0RCtSa0dnc2o4R3ZoNmFoM2o1M2Z0L2tSajZETUM0QmxCMEM0Zk8vUEVCNVdJMGNqZmN2cHdvNG5PYXBIeVg0CitBVG1MSU1nalhuMm0rQ1NNOXdvMDFtRWJtcktXZDIwTTduOTZjV2hHd2c5TXZWSitSZEdrMkswbHdqMDJQb1dXCitCbHQ1NzZHVHVOTi8raisrUS9qaXFzWHhhTFRPMC9Xais0YjJnUWgzbjhJMHU2YmtvbERMb0VSS0lkckxHSEgrCitGVTNzazhicFVoSG1laVVUZnd3Y2kranVodE9ZOWUzMEFFc3Q2eGFrQ0hicTFsUlJ5RVlQdFdMN29MZHM2eXYwCitVQUtQN3dTOVlsNmRjZWtYU0YxUlpwQitmb3ZUVytxUFluOGFFdWtzYU16MHdLOTZGQ09qVk5HWXhNcCtYbnZsCitzS3g2M1VaQkFvR0JBT0NiQ2JKdE8wSHNnSWF1dkN2R1o1MGFaMXZEdlFSZUN3cmk0aW91dEVnNEpDQVhIRXNYCisrYXh6Mko1ajNVRVFoR0tyMEVYOUJHNllieEdXME1tamYzUXhlUkIrMFdMcE1NWTJTRnQ5M29DMlIxQVg5bDBJCitoNTBPNnRZdjVTWG05NnBLeHdSejAxZDg0bUNKZ3duL0crY1ovRUpqNHJmWnNOYlFzdDZKUUZ2ekFvR0JBTS8xCitnTFZRdDVsK0lLKzZzNjhFbkFESTY2aTdjS2U2c2ozckZSVGFoWkp4TDJ2WTI4SjlFQjJtRi9YRWdBUlNOSlFWCitYL0g5ekRyd0ttOU1YODcvZUNIMm5FYmMrNXFTR3BEUFFtNDgyQzlEcXNNaXR4Q0tEOGJibGUxQmxwakZiOGhyCitSMFEzdjVxOHU1dW9tTEJkczVlVUJlUktNdHU5dE9NQTlLUlNER2pKQW9HQUY0NEsyVXg5VDIrWEZ3alNNU0VRCitrcmhIS0tlQmRpaktyYXlYbldiaWYwUnIvWFdQQVEwVm9SRlJJV05GdStJWWtDU0dwaUJmeTUxdTRJQlppeHY3CitiTnNYWURSOGp3djNrb0gwMnF0N256SCtqcGJFdm9MN2Zld25rcWpaTmoxZnNkcy92ZWJMdmp3Wm5aZ3VSdWtiCitLd1Jkb1RUS2ZROTJiVURiMFZ6QmhDTUNnWUI3SCszT2JEWG9DUWN0UkNzeWlsWWJHTnArRWt4RzRvQzVyRC9WCitFdlJXbWZEcnQzK1ZqUnBIazVsSUI4bUx4V2dmN08vYmhOcXdZcFdkUStqTjArKzZuQm8yMG91ZEhyZmYyUGFKCis4amhFODVsYzQyYmp3ZnBKVUtWWnphVnVXaWN1MEdWbmZHSlRLVDhpa0JXbkJqTllvV2xEbXJLMTY0SDNqUTlMCitZdEM2RVFLQmdRQ2FiRlhYSHg1Y0lKMlhPbTRLL25UT0c3Q2x2RDgweGFwcXlHcm9RZDlFL2NKVUhIUHAvd1E0CitjMWRNTzVFVmlNN0pSc0tmeGtsOXZNNW85SU03c3dsWWg0RU1GU0xKTmp6Z09ZOVhWa3ZRaDB1R2JpSk9CTzRmCitpblV1V24xWVdVai9IRnRyVCswTm8rY1l2WlZjTUtyRkF5M0svQXdwVGJmS0NrNnJvdWxsTkE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0IGIvdGVzdC9rZXlzL3NlcnZlci5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1ZWYzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0CkBAIC0wLDAgKzEsMjUgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU56Q0NBeCtnQXdJQkFnSUpBT1lmWWZ3N05DT2NNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3hNUXN3Q1FZRAorVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNQzBadmNtVnpkQ0JJYVd4cworTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhGakFVQmdOVgorQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERFa01DSUdDU3FHU0liMworRFFFSkFSWVZaR1YyUUhSb2NtbG1kQzVoY0dGamFHVXViM0puTUI0WERURTBNRFF3TnpFNE5UZ3dNRm9YRFRJeQorTURZeU5ERTROVGd3TUZvd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoTllYSjViR0Z1WkRFVQorTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm9aU0JCY0dGamFHVWdVMjltZEhkaAorY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm9jbWxtZERFU01CQUdBMVVFQXd3SgorYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHlhV1owTG1Gd1lXTm9aUzV2Y21jdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FFOVRFOXdFWHA1TFJ0TFFWRFNHUQorR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3lTTjhJMlh3NgorTDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0hqS05nNlpLZworMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUJHbVptTUlVdworQWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGt1NjJMaXBrWAord0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG10cmhWUUY0bgorQWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQWZCZ05WSFNNRQorR0RBV2dCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFCR0ZSaUpzbGNYMGFKa3dacHpUd1NVZGdjZkticHZORWJDTnRWb2hmUVZUSTRhL29ONQorVSt5cURaSmczdk9hT3VpQVpxeUhjSWxaOHF5ZXNDZ1JOMzE0VGw0L0pRKytDVzhtS2oxbWVUZ281WUZ4Y1pZbQorVDl2c0kzQytOem44NERJTmdJOW14NnlrdEl0M1FPS1pSRHB6eVBrVXp4c3lKOEo0MjdEYWltRHJqVFIrZlR3RAorMURoMDl4ZWVNblNhNXplVjFIRUR5SlRxQ1h1dExldHdRL0l5Zm1NQmhJeCtudkI1ZjY3cHovbStEdjZWMHIzSQorcDRIQ2NkbkRVREdKYmZxdG9xc0FBVFFRV08rV1d1c3dCNm1PaERidlBUeGhScFpxNkFrZ1dxdjRTK3UzTTJHTworcjVwOUZyQmdhdkF3NWJLTzU0QzBvUUtwTi81ZnRhNWw2V3MwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLmtleSBiL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2NmY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLmtleQpAQCAtMCwwICsxLDI4IEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5wMTIgYi90ZXN0L2tleXMvc2VydmVyLnAxMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkwOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5wMTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5wZW0gYi90ZXN0L2tleXMvc2VydmVyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVhOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5wZW0KQEAgLTAsMCArMSw1MyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiMmFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMCwwICsxLDQ5NCBAQAorWworICAiY19nbGliLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpLWJpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9mcmFtZWQtaXAiLAorICAiY2wtZ29fYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNwcC1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZGFydF9qc29uX2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcCIsCisgICJjcHAtZ29fanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9qc29uX2h0dHAtaXAiLAorICAiY3BwLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpY19odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpal9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpaC1oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5X2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfanNvbl9odHRwLWlwIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLW11bHRpYV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpYy1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1tdWx0aWFjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNwcC1yc19tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19mcmFtZWQtaXAiLAorICAiY3NoYXJwLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLWNsX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLWNsX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2ZyYW1lZC1pcCIsCisgICJkLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jcHBfanNvbl9odHRwLWlwIiwKKyAgImQtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1kX2pzb25faHR0cC1pcCIsCisgICJkLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImQtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAiZC1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1nb19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtZ29fanNvbl9odHRwLWlwIiwKKyAgImQtZ29fanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9qc29uX2h0dHAtaXAiLAorICAiZC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1qc19qc29uX2h0dHAtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19iaW5hcnlfaHR0cC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLW5vZGVqc19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCisgICJkLW5vZGVqc19qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1ub2RldHNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5M19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1weTNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1weTNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9mcmFtZWQtaXAiLAorICAiZC1weTNfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcCIsCisgICJkLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1weV9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLXB5X2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtcHlfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLXB5X2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfanNvbl9mcmFtZWQtaXAiLAorICAiZC1weV9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2h0dHAtaXAiLAorICAiZC1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImVybC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RldHNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImVybC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJnby1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWNwcF9qc29uX2h0dHAtaXAiLAorICAiZ28tY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tZF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJnby1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tZF9qc29uX2h0dHAtaXAiLAorICAiZ28tZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImdvLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tZGFydF9qc29uX2h0dHAtaXAiLAorICAiZ28tamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJnby1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tamF2YV9qc29uX2h0dHAtaXAiLAorICAiZ28tamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImdvLXB5M19iaW5hcnktYWNjZWxfemxpYi1pcC1zc2wiLAorICAiZ28tcHkzX2NvbXBhY3QtYWNjZWxjX3psaWItaXAtc3NsIiwKKyAgImdvLXB5X2JpbmFyeS1hY2NlbF96bGliLWlwLXNzbCIsCisgICJnby1weV9jb21wYWN0LWFjY2VsY196bGliLWlwLXNzbCIsCisgICJocy1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImhzLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImhzLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImhzLWNzaGFycF9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtaHNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtaHNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtanNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJwZXJsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgInBlcmwtcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcC1zc2wiLAorICAicHktY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfaGVhZGVyX2h0dHAtaXAiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwIiwKKyAgInB5LWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9qc29uX2h0dHAtaXAiLAorICAicHktZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRhcnRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9qc29uX2h0dHAtaXAiLAorICAicHktaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfaGVhZGVyX2h0dHAtaXAiLAorICAicHktaHNfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9qc29uX2h0dHAtaXAiLAorICAicHktamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWx1YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1sdWFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1sdWFfanNvbl9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtZF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfanNvbl9odHRwLWlwIiwKKyAgInB5My1kX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWRhcnRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgInB5My1oc19hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtaHNfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtaHNfaGVhZGVyX2h0dHAtaXAiLAorICAicHkzLWhzX2pzb25faHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfanNvbl9odHRwLWlwIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWx1YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtbHVhX2pzb25faHR0cC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1kb21haW4iLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtaXAiLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1kb21haW4iLAorICAicmItY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiCitdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvTWFrZWZpbGUuYW0gYi90ZXN0L2x1YS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhjNWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyMgUmVtb3ZlICJNYXBUeXBlID0iIGxpbmUgdG8gaWdub3JlIHNvbWUgbWFwIGJ1ZyBmb3Igbm93CitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGx1YSAkPAorCSQoU0VEKSAtaS5iYWsgJ3MvTWFwVHlwZSA9Ly9nJyBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YQorCSQoUk0pIGdlbi1sdWEvVGhyaWZ0VGVzdF90dHlwZXMubHVhLmJhaworCitwcmVjcm9zczogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWx1YQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDhkMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKQEAgLTAsMCArMSwxNzkgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK3JlcXVpcmUoJ1RTb2NrZXQnKQorcmVxdWlyZSgnVEJ1ZmZlcmVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RGcmFtZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEh0dHBUcmFuc3BvcnQnKQorcmVxdWlyZSgnVENvbXBhY3RQcm90b2NvbCcpCityZXF1aXJlKCdUSnNvblByb3RvY29sJykKK3JlcXVpcmUoJ1RCaW5hcnlQcm90b2NvbCcpCityZXF1aXJlKCdUaHJpZnRUZXN0X1RocmlmdFRlc3QnKQorcmVxdWlyZSgnbGlibHVhbG9uZ251bWJlcicpCisKK2xvY2FsIGNsaWVudAorCitmdW5jdGlvbiB0ZWFyZG93bigpCisgIGlmIGNsaWVudCB0aGVuCisgICAgLS0gY2xvc2UgdGhlIGNvbm5lY3Rpb24KKyAgICBjbGllbnQ6Y2xvc2UoKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBwYXJzZUFyZ3MocmF3QXJncykKKyAgbG9jYWwgb3B0ID0geworICAgIHByb3RvY29sPSdiaW5hcnknLAorICAgIHRyYW5zcG9ydD0nYnVmZmVyZWQnLAorICAgIHBvcnQ9JzkwOTAnLAorICB9CisgIGZvciBpLCBzdHIgaW4gcGFpcnMocmF3QXJncykgZG8KKyAgICBpZiBpID4gMCB0aGVuCisgICAgICBrLCB2ID0gc3RyaW5nLm1hdGNoKHN0ciwgJy0tKCV3Kyk9KCV3KyknKQorICAgICAgYXNzZXJ0KG9wdFtrXSB+PSBuaWwsICdVbmtub3duIGFyZ3VtZW50JykKKyAgICAgIG9wdFtrXSA9IHYKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBvcHQKK2VuZAorCitmdW5jdGlvbiBhc3NlcnRFcXVhbCh2YWwxLCB2YWwyLCBtc2cpCisgIGFzc2VydCh2YWwxID09IHZhbDIsIG1zZykKK2VuZAorCitmdW5jdGlvbiB0ZXN0QmFzaWNDbGllbnQocmF3QXJncykKKyAgbG9jYWwgb3B0ID0gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIHNvY2tldCA9IFRTb2NrZXQ6bmV3eworICAgIHBvcnQgPSB0b251bWJlcihvcHQucG9ydCkKKyAgfQorICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQgc29ja2V0JykKKyAgc29ja2V0OnNldFRpbWVvdXQoNTAwMCkKKworICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQsCisgICAgaHR0cCA9IFRIdHRwVHJhbnNwb3J0LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdIH49IG5pbCkKKyAgbG9jYWwgdHJhbnNwb3J0ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7CisgICAgdHJhbnMgPSBzb2NrZXQsCisgICAgaXNTZXJ2ZXIgPSBmYWxzZQorICB9CisKKyAgbG9jYWwgcHJvdG9jb2xzID0geworICAgIGJpbmFyeSA9IFRCaW5hcnlQcm90b2NvbCwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbCwKKyAgICBqc29uID0gVEpTT05Qcm90b2NvbCwKKyAgfQorICBhc3NlcnQocHJvdG9jb2xzW29wdC5wcm90b2NvbF0gfj0gbmlsKQorICBsb2NhbCBwcm90b2NvbCA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3sKKyAgICB0cmFucyA9IHRyYW5zcG9ydAorICB9CisgIGFzc2VydChwcm90b2NvbCwgJ0ZhaWxlZCB0byBjcmVhdGUgYmluYXJ5IHByb3RvY29sJykKKworICBjbGllbnQgPSBUaHJpZnRUZXN0Q2xpZW50Om5ld3sKKyAgICBwcm90b2NvbCA9IHByb3RvY29sCisgIH0KKyAgYXNzZXJ0KGNsaWVudCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50JykKKworICAtLSBPcGVuIHRoZSB0cmFuc3BvcnQKKyAgbG9jYWwgc3RhdHVzLCBfID0gcGNhbGwodHJhbnNwb3J0Lm9wZW4sIHRyYW5zcG9ydCkKKyAgYXNzZXJ0KHN0YXR1cywgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlcicpCisKKyAgLS0gU3RyaW5nCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCdsYWxhJyksICAnbGFsYScsICAnRmFpbGVkIHRlc3RTdHJpbmcnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnd2Fob28nKSwgJ3dhaG9vJywgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKKworICAtLSBCb29sCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCB0cnVlJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKGZhbHNlKSwgZmFsc2UsICdGYWlsZWQgdGVzdEJvb2wgZmFsc2UnKQorCisgIC0tIEJ5dGUKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4MDEpLCAxLCAgICAnRmFpbGVkIHRlc3RCeXRlIDEnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg0MCksIDY0LCAgICdGYWlsZWQgdGVzdEJ5dGUgMicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDdmKSwgMTI3LCAgJ0ZhaWxlZCB0ZXN0Qnl0ZSAzJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4ODApLCAtMTI4LCAnRmFpbGVkIHRlc3RCeXRlIDQnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHhiZiksIC02NSwgICdGYWlsZWQgdGVzdEJ5dGUgNScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweGZmKSwgLTEsICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA2JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDEyOCksIC0xMjgsICAnRmFpbGVkIHRlc3RCeXRlIDcnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMjU1KSwgLTEsICAgICdGYWlsZWQgdGVzdEJ5dGUgOCcpCisKKyAgLS0gSTMyCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4MDAwMDAwMDEpLCAxLCAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STMyIDEnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDQwMDAwMDAwKSwgMTA3Mzc0MTgyNCwgICdGYWlsZWQgdGVzdEkzMiAyJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHg3ZmZmZmZmZiksIDIxNDc0ODM2NDcsICAnRmFpbGVkIHRlc3RJMzIgMycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4ODAwMDAwMDApLCAtMjE0NzQ4MzY0OCwgJ0ZhaWxlZCB0ZXN0STMyIDQnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweGJmZmZmZmZmKSwgLTEwNzM3NDE4MjUsICdGYWlsZWQgdGVzdEkzMiA1JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHhmZmZmZmZmZiksIC0xLCAgICAgICAgICAnRmFpbGVkIHRlc3RJMzIgNicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDIxNDc0ODM2NDgpLCAtMjE0NzQ4MzY0OCwgJ0ZhaWxlZCB0ZXN0STMyIDcnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMig0Mjk0OTY3Mjk1KSwgLTEsICAgICAgICAgICdGYWlsZWQgdGVzdEkzMiA4JykKKworICAtLSBJNjQgKGx1YSBvbmx5IHN1cHBvcnRzIDE2IGRlY2ltYWwgcHJlY2lzaW9uIHNvIGxhcmdlciBudW1iZXJzIGFyZQorICAtLSBpbml0aWFsaXplZCBieSB0aGVpciBzdHJpbmcgdmFsdWUpCisgIGxvY2FsIGxvbmcgPSBsaWJsdWFsb25nbnVtYmVyLm5ldworICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKDB4MDAwMDAwMDAwMDAwMDAwMSkpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoMSksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDEnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKDB4NDAwMDAwMDAwMDAwMDAwMCkpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoNDYxMTY4NjAxODQyNzM4NzkwNCksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDInKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKCcweDdmZmZmZmZmZmZmZmZmZmYnKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygnOTIyMzM3MjAzNjg1NDc3NTgwNycpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCAzJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygweDgwMDAwMDAwMDAwMDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKC05MjIzMzcyMDM2ODU0Nzc1ODA4KSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgNCcpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoJzB4YmZmZmZmZmZmZmZmZmZmZicpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKCctNDYxMTY4NjAxODQyNzM4NzkwNScpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCA1JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygnMHhmZmZmZmZmZmZmZmZmZmZmJykpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoLTEpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCA2JykKKworICAtLSBEb3VibGUKKyAgYXNzZXJ0RXF1YWwoCisgICAgICBjbGllbnQ6dGVzdERvdWJsZSgxLjIzNDU2Nzg5KSwgMS4yMzQ1Njc4OSwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDEnKQorICBhc3NlcnRFcXVhbCgKKyAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDAuMTIzNDU2Nzg5KSwgMC4xMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAyJykKKyAgYXNzZXJ0RXF1YWwoCisgICAgICBjbGllbnQ6dGVzdERvdWJsZSgwLjEyMzQ1Njc4OSksIDAuMTIzNDU2Nzg5LCAnRmFpbGVkIHRlc3REb3VibGUgMycpCisKKyAgLS0gVE9ETyB0ZXN0QmluYXJ5KCkgLi4uCisJICAKKyAgLS0gQWNjdXJhY3kgb2YgMTYgZGVjaW1hbCBkaWdpdHMgKHJvdW5kcykKKyAgbG9jYWwgYSwgYiA9IDEuMTIzNDU2Nzg5MDY2NjY2NjMsIDEuMTIzNDU2Nzg5MDY2NjY2NjEKKyAgYXNzZXJ0RXF1YWwoYSwgYikKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3REb3VibGUoYSksIGIsICdGYWlsZWQgdGVzdERvdWJsZSA1JykKKworICAtLSBTdHJ1Y3QKKyAgbG9jYWwgbyA9IFh0cnVjdDpuZXd7CisgICAgc3RyaW5nX3RoaW5nID0gJ1plcm8nLAorICAgIGJ5dGVfdGhpbmcgPSAxLAorICAgIGkzMl90aGluZyA9IC0zLAorICAgIGk2NF90aGluZyA9IGxvbmcoLTUpCisgIH0KKyAgbG9jYWwgciA9IGNsaWVudDp0ZXN0U3RydWN0KG8pCisgIGFzc2VydEVxdWFsKG8uc3RyaW5nX3RoaW5nLCByLnN0cmluZ190aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDEnKQorICBhc3NlcnRFcXVhbChvLmJ5dGVfdGhpbmcsIHIuYnl0ZV90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDInKQorICBhc3NlcnRFcXVhbChvLmkzMl90aGluZywgci5pMzJfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCAzJykKKyAgYXNzZXJ0RXF1YWwoby5pNjRfdGhpbmcsIHIuaTY0X3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgNCcpCisKKyAgLS0gVE9ETyBhZGQgbGlzdCBtYXAgc2V0IGV4Y2VwdGlvbiBldGMgZXRjCitlbmQKKwordGVzdEJhc2ljQ2xpZW50KGFyZykKK3RlYXJkb3duKCkKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2QyZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCkBAIC0wLDAgKzEsMTQyIEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKworcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKK3JlcXVpcmUoJ1RTb2NrZXQnKQorcmVxdWlyZSgnVEJ1ZmZlcmVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RGcmFtZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEh0dHBUcmFuc3BvcnQnKQorcmVxdWlyZSgnVENvbXBhY3RQcm90b2NvbCcpCityZXF1aXJlKCdUSnNvblByb3RvY29sJykKK3JlcXVpcmUoJ1RCaW5hcnlQcm90b2NvbCcpCityZXF1aXJlKCdUU2VydmVyJykKK3JlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gSGFuZGxlcgorVGVzdEhhbmRsZXIgPSBUaHJpZnRUZXN0SWZhY2U6bmV3e30KKworLS0gU3RvcHMgdGhlIHNlcnZlcgorZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdFZvaWQoKQorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RTdHJpbmcoc3RyKQorICByZXR1cm4gc3RyCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJvb2woYm9vbCkKKyAgcmV0dXJuIGJvb2wKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0Qnl0ZShieXRlKQorICByZXR1cm4gYnl0ZQorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RJMzIoaTMyKQorICByZXR1cm4gaTMyCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEk2NChpNjQpCisgIHJldHVybiBpNjQKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0RG91YmxlKGQpCisgIHJldHVybiBkCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJpbmFyeShieSkKKyAgcmV0dXJuIGJ5CitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdFN0cnVjdCh0aGluZykKKyAgcmV0dXJuIHRoaW5nCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFRlc3QKK2xvY2FsIHNlcnZlcgorCitmdW5jdGlvbiB0ZWFyZG93bigpCisgIGlmIHNlcnZlciB0aGVuCisgICAgc2VydmVyOmNsb3NlKCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKworZnVuY3Rpb24gdGVzdEJhc2ljU2VydmVyKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHBhcnNlQXJncyhyYXdBcmdzKQorICAtLSBIYW5kbGVyICYgUHJvY2Vzc29yCisgIGxvY2FsIGhhbmRsZXIgPSBUZXN0SGFuZGxlcjpuZXd7fQorICBhc3NlcnQoaGFuZGxlciwgJ0ZhaWxlZCB0byBjcmVhdGUgaGFuZGxlcicpCisgIGxvY2FsIHByb2Nlc3NvciA9IFRocmlmdFRlc3RQcm9jZXNzb3I6bmV3eworICAgIGhhbmRsZXIgPSBoYW5kbGVyCisgIH0KKyAgYXNzZXJ0KHByb2Nlc3NvciwgJ0ZhaWxlZCB0byBjcmVhdGUgcHJvY2Vzc29yJykKKworICAtLSBTZXJ2ZXIgU29ja2V0CisgIGxvY2FsIHNvY2tldCA9IFRTZXJ2ZXJTb2NrZXQ6bmV3eworICAgIHBvcnQgPSBvcHQucG9ydAorICB9CisgIGFzc2VydChzb2NrZXQsICdGYWlsZWQgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQnKQorCisgIC0tIFRyYW5zcG9ydCAmIEZhY3RvcnkKKyAgbG9jYWwgdHJhbnNwb3J0cyA9IHsKKyAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgaHR0cCA9IFRIdHRwVHJhbnNwb3J0RmFjdG9yeSwKKyAgfQorICBhc3NlcnQodHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XSwgJ0ZhaWxlZCB0byBjcmVhdGUgZnJhbWVkIHRyYW5zcG9ydCBmYWN0b3J5JykKKyAgbG9jYWwgdHJhbnNfZmFjdG9yeSA9IHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF06bmV3e30KKyAgbG9jYWwgcHJvdG9jb2xzID0geworICAgIGJpbmFyeSA9IFRCaW5hcnlQcm90b2NvbEZhY3RvcnksCisgICAgY29tcGFjdCA9IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5LAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sRmFjdG9yeSwKKyAgfQorICBsb2NhbCBwcm90X2ZhY3RvcnkgPSBwcm90b2NvbHNbb3B0LnByb3RvY29sXTpuZXd7fQorICBhc3NlcnQocHJvdF9mYWN0b3J5LCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wgZmFjdG9yeScpCisKKyAgLS0gU2ltcGxlIFNlcnZlcgorICBzZXJ2ZXIgPSBUU2ltcGxlU2VydmVyOm5ld3sKKyAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IsCisgICAgc2VydmVyVHJhbnNwb3J0ID0gc29ja2V0LAorICAgIHRyYW5zcG9ydEZhY3RvcnkgPSB0cmFuc19mYWN0b3J5LAorICAgIHByb3RvY29sRmFjdG9yeSA9IHByb3RfZmFjdG9yeQorICB9CisgIGFzc2VydChzZXJ2ZXIsICdGYWlsZWQgdG8gY3JlYXRlIHNlcnZlcicpCisKKyAgLS0gU2VydmUKKyAgc2VydmVyOnNlcnZlKCkKKyAgc2VydmVyID0gbmlsCitlbmQKKwordGVzdEJhc2ljU2VydmVyKGFyZykKK3RlYXJkb3duKCkKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvLmdpdGlnbm9yZSBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q1NTEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2ogYi90ZXN0L25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2YWYzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDMxIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5DbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkNsaWVudDwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRocmVhZGluZyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiZxdW90OyQoUGF0aFRvVGhyaWZ0KSZxdW90OyAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxMzlkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDcyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnRUZXN0OworCituYW1lc3BhY2UgQ2xpZW50Cit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRCdWZmZXJTaXplKENvbnNvbGUuQnVmZmVyV2lkdGgsIDQwOTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmFpbGVkIHRvIGdyb3cgc2Nyb2xsLWJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNwbGl0IG1vZGUgYW5kIG9wdGlvbnMKKyAgICAgICAgICAgIHZhciBzdWJBcmdzID0gbmV3IExpc3Q8c3RyaW5nPihhcmdzKTsKKyAgICAgICAgICAgIHZhciBmaXJzdEFyZyA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGlmIChzdWJBcmdzLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgZmlyc3RBcmcgPSBzdWJBcmdzWzBdOworICAgICAgICAgICAgICAgIHN1YkFyZ3MuUmVtb3ZlQXQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJ1biB3aGF0ZXZlciBtb2RlIGlzIGNob29zZW4KKyAgICAgICAgICAgIHN3aXRjaChmaXJzdEFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJjbGllbnQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpOworICAgICAgICAgICAgICAgIGNhc2UgIi0taGVscCI6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludEhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNhZ2U6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIGNsaWVudCAgW29wdGlvbnNdJyIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgQ2xpZW50ICAtLWhlbHAiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKKworICAgICAgICAgICAgVGVzdENsaWVudC5QcmludE9wdGlvbnNIZWxwKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MTUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ2xpZW50IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIkIwQzEzREEwLTMxMTctNDg0NC04QUU4LUIxNzc1RTQ2MjIzRCIpXQorCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Rlc3RDbGllbnQuY3MgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Rlc3RDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlMTk4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpAQCAtMCwwICsxLDk0MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUZXN0UGFyYW1zCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7CisgICAgICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIGhvc3QgPSBJUEFkZHJlc3MuQW55OworICAgICAgICAgICAgcHVibGljIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHVybDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcGlwZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGJ1ZmZlcmVkOworICAgICAgICAgICAgcHVibGljIGJvb2wgZnJhbWVkOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwcm90b2NvbDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGVuY3J5cHRlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFBhcnNlKCBMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MuQ291bnQ7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItdSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgbmFtZWQgcGlwZXMgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLWhvc3Q9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZXJlIGZvciBpcGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBuZXcgSVBBZGRyZXNzKEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWYiIHx8IGFyZ3NbaV0gPT0gIi0tZnJhbWVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWJpbmFyeSIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1iaW5hcnkiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJiaW5hcnkiOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAiY29tcGFjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgY29tcGFjdCBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAianNvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBlbmNyeXB0ZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDbGllbnRDZXJ0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2VydE5hbWUgPSAiY2xpZW50LnAxMiI7CisgICAgICAgICAgICAgICAgdmFyIHBvc3NpYmxlUGF0aHMgPSBuZXcgTGlzdDxzdHJpbmc+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiLi4vLi4vLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICAgICAiLi4vLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICAgICAia2V5cy8iLAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcG9zc2libGVQYXRoIGluIHBvc3NpYmxlUGF0aHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgY2xpZW50Q2VydE5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMocGF0aCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShleGlzdGluZ1BhdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtjbGllbnRDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YXIgY2VydCA9IG5ldyBYNTA5Q2VydGlmaWNhdGUyKGV4aXN0aW5nUGF0aCwgInRocmlmdCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IENyZWF0ZVRyYW5zcG9ydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQocGlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBHZXRDbGllbnRDZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VydCA9PSBudWxsIHx8ICFjZXJ0Lkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2VydGlmaWNhdGUgZG9lc24ndCBjb250YWluIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCwgMCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5kZXIsIGNlcnRpZmljYXRlLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzIHwgU3NsUHJvdG9jb2xzLlRsczExIHwgU3NsUHJvdG9jb2xzLlRsczEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChuZXcgVXJpKHVybCksIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIENyZWF0ZVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAiY29tcGFjdCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImpzb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JCYXNlVHlwZXMgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclN0cnVjdHMgPSAyOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckNvbnRhaW5lcnMgPSA0OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckV4Y2VwdGlvbnMgPSA4OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKKworICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwYXJhbS5DcmVhdGVQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gcGFyYW0ubnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTsKKworICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuQXN5bmModG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEV4ZWN1dGVDbGllbnRUZXN0QXN5bmMoY2xpZW50KS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlIGNsb3NpbmcgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgUHJpbnRPcHRpb25zSGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDbGllbnQgb3B0aW9uczoiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC11IDxVUkw+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtdCA8IyBvZiB0aHJlYWRzIHRvIHJ1bj4gICAgICAgIGRlZmF1bHQgPSAxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtbiA8IyBvZiBpdGVyYXRpb25zPiAgICAgICAgICAgIHBlciB0aHJlYWQiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcGlwZT08cGlwZSBuYW1lPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1ob3N0PTxJUCBhZGRyZXNzPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wb3J0PTxwb3J0IG51bWJlcj4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tdHJhbnNwb3J0PTx0cmFuc3BvcnQgbmFtZT4gICAgb25lIG9mIGJ1ZmZlcmVkLGZyYW1lZCAgKGRlZmF1bHRzIHRvIG5vbmUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb3RvY29sPTxwcm90b2NvbCBuYW1lPiAgICAgIG9uZSBvZiBjb21wYWN0LGpzb24gIChkZWZhdWx0cyB0byBiaW5hcnkpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdGVzdHMgPSBFbnVtZXJhYmxlLlJhbmdlKDAsIHBhcmFtLm51bVRocmVhZHMpLlNlbGVjdChfID0+IG5ldyBDbGllbnRUZXN0KHBhcmFtKSkuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGFzayh0ZXN0LkV4ZWN1dGUpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVGFzay5XYWl0QWxsKHRocmVhZHMpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldHZhbCA9IG5ldyBieXRlWzB4MTAwXTsKKyAgICAgICAgICAgIHZhciBpbml0TGVuID0gTWF0aC5NaW4oMHgxMDAsIHJldHZhbC5MZW5ndGgpOworCisgICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxpbnQ+IEV4ZWN1dGVDbGllbnRUZXN0QXN5bmMoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworICAgICAgICAgICAgdmFyIHJldHVybkNvZGUgPSAwOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdFZvaWRBc3luYyh0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgICAgICAgdmFyIHMgPSBhd2FpdCBjbGllbnQudGVzdFN0cmluZ0FzeW5jKCJUZXN0IiwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgIGlmICgiVGVzdCIgIT0gcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgdmFyIHQgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbCl0cnVlLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOworICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbChmYWxzZSkiKTsKKyAgICAgICAgICAgIHZhciBmID0gYXdhaXQgY2xpZW50LnRlc3RCb29sQXN5bmMoKGJvb2wpZmFsc2UsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZik7CisgICAgICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qnl0ZSgxKSIpOworICAgICAgICAgICAgdmFyIGk4ID0gYXdhaXQgY2xpZW50LnRlc3RCeXRlQXN5bmMoKHNieXRlKTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOworICAgICAgICAgICAgaWYgKDEgIT0gaTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICAgICAgICAgIHZhciBpMzIgPSBhd2FpdCBjbGllbnQudGVzdEkzMkFzeW5jKC0xLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7CisgICAgICAgICAgICBpZiAoLTEgIT0gaTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgICAgICAgdmFyIGk2NCA9IGF3YWl0IGNsaWVudC50ZXN0STY0QXN5bmMoLTM0MzU5NzM4MzY4LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7CisgICAgICAgICAgICBpZiAoLTM0MzU5NzM4MzY4ICE9IGk2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSIpOworICAgICAgICAgICAgdmFyIGR1YiA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlQXN5bmMoNS4zMjUwOTgyMzUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICg1LjMyNTA5ODIzNSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSIpOworICAgICAgICAgICAgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYygtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzksIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEodHJ1ZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0QmluYXJ5KCIgKyBCeXRlc1RvSGV4KGJpbk91dCkgKyAiKSIpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJpbkluID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnlBc3luYyhiaW5PdXQsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICh2YXIgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgQ3JhenlOZXN0aW5nIik7CisgICAgICAgICAgICB2YXIgb25lID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgdmFyIHR3byA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgdHdvLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICBvbmUuQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIHR3by5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICBpZiAodHlwZW9mKENyYXp5TmVzdGluZykuR2V0TWV0aG9kKCJFcXVhbHMiKT8uRGVjbGFyaW5nVHlwZSA9PSB0eXBlb2YoQ3JhenlOZXN0aW5nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQ29udGFpbmVyczsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICAgICAgdmFyIG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICBvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICAgICAgICAgIG8uQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgby5JMzJfdGhpbmcgPSAtMzsKKyAgICAgICAgICAgIG8uSTY0X3RoaW5nID0gLTU7CisgICAgICAgICAgICB2YXIgaSA9IGF3YWl0IGNsaWVudC50ZXN0U3RydWN0QXN5bmMobywgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9KSIpOworICAgICAgICAgICAgdmFyIG8yID0gbmV3IFh0cnVjdDIoKTsKKyAgICAgICAgICAgIG8yLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8yLlN0cnVjdF90aGluZyA9IG87CisgICAgICAgICAgICBvMi5JMzJfdGhpbmcgPSA1OworICAgICAgICAgICAgdmFyIGkyID0gYXdhaXQgY2xpZW50LnRlc3ROZXN0QXN5bmMobzIsIHRva2VuKTsKKyAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICB2YXIgbWFwb3V0ID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDU7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXBvdXRbal0gPSBqIC0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwKHsiKTsKKyAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcG91dC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIG1hcGluID0gYXdhaXQgY2xpZW50LnRlc3RNYXBBc3luYyhtYXBvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtYXBpbi5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwaW5ba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgbGlzdG91dCA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBqIGluIGxpc3RvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIHZhciBsaXN0aW4gPSBhd2FpdCBjbGllbnQudGVzdExpc3RBc3luYyhsaXN0b3V0LCB0b2tlbik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBqIGluIGxpc3RpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy9zZXQKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIHNldGluID0gYXdhaXQgY2xpZW50LnRlc3RTZXRBc3luYyhzZXRvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgICAgICAgdmFyIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouT05FLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5PTkUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUV08pIik7CisgICAgICAgICAgICByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6LlRXTywgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVFdPICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7CisgICAgICAgICAgICByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6LlRIUkVFLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5USFJFRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICAgICAgICByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6LkZJVkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LkZJVkUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRUlHSFQsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LkVJR0hUICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgICAgICAgICAgdmFyIHVpZCA9IGF3YWl0IGNsaWVudC50ZXN0VHlwZWRlZkFzeW5jKDMwOTg1ODIzNTA4MjUyM0wsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKKyAgICAgICAgICAgIGlmICgzMDk4NTgyMzUwODI1MjNMICE9IHVpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICAgICAgdmFyIG1tID0gYXdhaXQgY2xpZW50LnRlc3RNYXBNYXBBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1tLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICB2YXIgbTIgPSBtbVtrZXldOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMiBpbiBtMi5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgICAgIGluc2FuZS5Vc2VyTWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4oKTsKKyAgICAgICAgICAgIGluc2FuZS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSA1MDAwTDsKKyAgICAgICAgICAgIHZhciB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIHRydWNrLlN0cmluZ190aGluZyA9ICJUcnVjayI7CisgICAgICAgICAgICB0cnVjay5CeXRlX3RoaW5nID0gKHNieXRlKTg7CisgICAgICAgICAgICB0cnVjay5JMzJfdGhpbmcgPSA4OworICAgICAgICAgICAgdHJ1Y2suSTY0X3RoaW5nID0gODsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgICB2YXIgd2hvYSA9IGF3YWl0IGNsaWVudC50ZXN0SW5zYW5pdHlBc3luYyhpbnNhbmUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gd2hvYS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWwgPSB3aG9hW2tleV07CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMiBpbiB2YWwuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2MiA9IHZhbFtrMl07CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4geyIpOworICAgICAgICAgICAgICAgICAgICB2YXIgdXNlck1hcCA9IHYyLlVzZXJNYXA7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgieyIpOworICAgICAgICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgazMgaW4gdXNlck1hcC5LZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB4dHJ1Y3RzID0gdjIuWHRydWN0czsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKKyAgICAgICAgICAgIHZhciBhcmcxID0gMjsKKyAgICAgICAgICAgIHZhciBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKKyAgICAgICAgICAgIHZhciBtdWx0aURpY3QgPSBuZXcgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPigpOworICAgICAgICAgICAgbXVsdGlEaWN0WzFdID0gIm9uZSI7CisKKyAgICAgICAgICAgIHZhciB0bXBNdWx0aURpY3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFpciBpbiBtdWx0aURpY3QpCisgICAgICAgICAgICAgICAgdG1wTXVsdGlEaWN0LkFkZChwYWlyLktleSArIiA9PiAiKyBwYWlyLlZhbHVlKTsKKworICAgICAgICAgICAgdmFyIGFyZzQgPSBOdW1iZXJ6LkZJVkU7CisgICAgICAgICAgICBsb25nIGFyZzUgPSA1MDAwMDAwOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBNdWx0aSgiICsgYXJnMCArICIsIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIix7IiArIHN0cmluZy5Kb2luKCIsIiwgdG1wTXVsdGlEaWN0KSArICJ9LCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgICAgICB2YXIgbXVsdGlSZXNwb25zZSA9IGF3YWl0IGNsaWVudC50ZXN0TXVsdGlBc3luYyhhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlRFeGNlcHRpb24iLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwib2tcIikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbkFzeW5jKCJvayIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24iLCAiaWdub3JlIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uMiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMjAwMiB8fCBleC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJPS1wiKSIpOworICAgICAgICAgICAgICAgIGlmICgiT0siICE9IChhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoInN1Y2Nlc3MiLCAiT0siLCB0b2tlbikpLlN0cmluZ190aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBPbmV3YXkoMSkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0T25ld2F5QXN5bmMoMSwgdG9rZW4pOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgaWYgKHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgPiAxMDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOworICAgICAgICAgICAgdmFyIHRpbWVzID0gNTA7CisgICAgICAgICAgICBzdy5SZXNldCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGltZXM7ICsraykKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdFZvaWRBc3luYyh0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gezB9IG1zIGEgdGVzdFZvaWQoKSBjYWxsIiwgc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyAvIHRpbWVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL01ha2VmaWxlLmFtIGIvdGVzdC9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NmZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuIAorCithbGwtbG9jYWw6CisJJChET1RORVRDT1JFKSBidWlsZAorCitwcmVjcm9zczoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIENsaWVudC9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9vYmoKKwkkKFJNKSAtciBUaHJpZnRUZXN0L1RocmlmdFRlc3QKKworRVhUUkFfRElTVCA9IFwKKwlDbGllbnQgXAorCVJFQURNRS5tZCBcCisJU2VydmVyIFwKKwlUaHJpZnRUZXN0LnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1JFQURNRS5tZCBiL3Rlc3QvbmV0Y29yZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MjhkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyMCBAQAorIyBBcGFjaGUgVGhyaWZ0IG5ldC1jb3JlLWxpYiB0ZXN0cworCitUZXN0cyBmb3IgVGhyaWZ0IGNsaWVudCBsaWJyYXJ5IHBvcnRlZCB0byBNaWNyb3NvZnQgLk5ldCBDb3JlIAorCisjIENvbnRlbnQKKy0gVGhyaWZ0VGVzdCAtIHRlc3RzIGZvciBUaHJpZnQgbGlicmFyeSAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gTkVUIENvcmUgU3RhbmRhcmQgMS42IChTREsgMi4wLjApCisKKyMgSG93IHRvIGJ1aWxkIG9uIFdpbmRvd3MKKy0gR2V0IFRocmlmdCBJREwgY29tcGlsZXIgZXhlY3V0YWJsZSwgYWRkIHRvIHNvbWUgZm9sZGVyIGFuZCBhZGQgcGF0aCB0byB0aGlzIGZvbGRlciBpbnRvIFBBVEggdmFyaWFibGUKKy0gT3BlbiBUaHJpZnRUZXN0LnNsbiBpbiBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZAorb3IgCistIEJ1aWxkIHdpdGggc2NyaXB0cworCisjIEhvdyB0byBidWlsZCBvbiBVbml4CistIEVuc3VyZSB5b3UgaGF2ZSAuTkVUIENvcmUgMi4wLjAgU0RLIGluc3RhbGxlZCBvciB1c2UgdGhlIFVidW50dSBYZW5pYWwgZG9ja2VyIGltYWdlCistIEZvbGxvdyBjb21tb24gYnVpbGQgcHJhY3RpY2UgZm9yIFRocmlmdDogYm9vdHN0cmFwLCBjb25maWd1cmUsIGFuZCBtYWtlIHByZWNyb3NzCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvLmdpdGlnbm9yZSBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q1NTEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0N2U1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDcyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnRUZXN0OworCituYW1lc3BhY2UgU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRCdWZmZXJTaXplKENvbnNvbGUuQnVmZmVyV2lkdGgsIDQwOTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmFpbGVkIHRvIGdyb3cgc2Nyb2xsLWJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNwbGl0IG1vZGUgYW5kIG9wdGlvbnMKKyAgICAgICAgICAgIHZhciBzdWJBcmdzID0gbmV3IExpc3Q8c3RyaW5nPihhcmdzKTsKKyAgICAgICAgICAgIHZhciBmaXJzdEFyZyA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGlmIChzdWJBcmdzLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgZmlyc3RBcmcgPSBzdWJBcmdzWzBdOworICAgICAgICAgICAgICAgIHN1YkFyZ3MuUmVtb3ZlQXQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJ1biB3aGF0ZXZlciBtb2RlIGlzIGNob29zZW4KKyAgICAgICAgICAgIHN3aXRjaChmaXJzdEFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJzZXJ2ZXIiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFNlcnZlci5FeGVjdXRlKHN1YkFyZ3MpOworICAgICAgICAgICAgICAgIGNhc2UgIi0taGVscCI6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludEhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNhZ2U6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIHNlcnZlciAgW29wdGlvbnNdJyIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgU2VydmVyICAtLWhlbHAiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKKworICAgICAgICAgICAgVGVzdFNlcnZlci5QcmludE9wdGlvbnNIZWxwKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NDk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiU2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIkIwQzEzREEwLTMxMTctNDg0NC04QUU4LUIxNzc1RTQ2MjIzRCIpXQorCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2ogYi90ZXN0L25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5YjRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDMxIEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5TZXJ2ZXI8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlNlcnZlcjwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRocmVhZGluZyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiZxdW90OyQoUGF0aFRvVGhyaWZ0KSZxdW90OyAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9UZXN0U2VydmVyLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9UZXN0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDMzMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKQEAgLTAsMCArMSw1OTQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyOworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIGludGVybmFsIGNsYXNzIFNlcnZlclBhcmFtCisgICAgeworICAgICAgICBpbnRlcm5hbCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIHVzZUZyYW1lZCA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIHVzZUVuY3J5cHRpb24gPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBjb21wYWN0ID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wganNvbiA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgIGludGVybmFsIHN0cmluZyBwaXBlID0gbnVsbDsKKworICAgICAgICBpbnRlcm5hbCB2b2lkIFBhcnNlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBpcGU9IikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWYiIHx8IGFyZ3NbaV0gPT0gIi0tZnJhbWVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1iaW5hcnkiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9YmluYXJ5IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgbmVlZGVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRlZCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRlZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkcG9vbCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRwb29sIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1wcm90b3R5cGUiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvY2Vzc29yPXByb3RvdHlwZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzZUVuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBfY2xpZW50SUQgPSAtMTsKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgVGVzdExvZ0RlbGVnYXRlKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeVNlcnZlckV2ZW50SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOworCisgICAgICAgICAgICBwdWJsaWMgVGFzayBQcmVTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPG9iamVjdD4gQ3JlYXRlQ29udGV4dEFzeW5jKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdDxvYmplY3Q+KG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayBEZWxldGVDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgUHJvY2Vzc0NvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IFRocmlmdFRlc3QuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUQmFzZVNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdExvZ0RlbGVnYXRlIGxvZ2dlcjsKKworICAgICAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyQXN5bmMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJJRCA9IEludGVybG9ja2VkLkluY3JlbWVudChyZWYgX2NsaWVudElEKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIgKz0gdGVzdENvbnNvbGVMb2dnZXI7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgiTmV3IFRlc3RIYW5kbGVyIGluc3RhbmNlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdENvbnNvbGVMb2dnZXIoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiaGFuZGxlcnswOkQzfToiLCBoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdChtc2csIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RWb2lkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cmluZyh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxib29sPiB0ZXN0Qm9vbEFzeW5jKGJvb2wgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPHNieXRlPiB0ZXN0Qnl0ZUFzeW5jKHNieXRlIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Qnl0ZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxpbnQ+IHRlc3RJMzJBc3luYyhpbnQgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJMzIoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdEk2NEFzeW5jKGxvbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8ZG91YmxlPiB0ZXN0RG91YmxlQXN5bmMoZG91YmxlIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RG91YmxlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJ5dGVbXT4gdGVzdEJpbmFyeUFzeW5jKGJ5dGVbXSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGhleCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyh0aGluZykuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJpbmFyeSh7MDpYfSkiLCBoZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RTdHJ1Y3RBc3luYyhYdHJ1Y3QgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdDI+IHRlc3ROZXN0QXN5bmMoWHRydWN0MiBuZXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TmVzdCh7e3swfSwge3tcInsxfVwiLCB7Mn0sIHszfSwgezR9LCB7NX19fX19KSIsCisgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5JMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5JMzJfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwQXN5bmMoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0TWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPj4gdGVzdFN0cmluZ01hcEFzeW5jKERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8VEhhc2hTZXQ8aW50Pj4gdGVzdFNldEFzeW5jKFRIYXNoU2V0PGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U2V0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPExpc3Q8aW50Pj4gdGVzdExpc3RBc3luYyhMaXN0PGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0TGlzdCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxOdW1iZXJ6PiB0ZXN0RW51bUFzeW5jKE51bWJlcnogdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RFbnVtKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGxvbmc+IHRlc3RUeXBlZGVmQXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFR5cGVkZWYoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+Pj4gdGVzdE1hcE1hcEFzeW5jKGludCBoZWxsbywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIHZhciBtYXBtYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PigpOworCisgICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIHZhciBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobWFwbWFwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4+IHRlc3RJbnNhbml0eUFzeW5jKEluc2FuaXR5IGFyZ3VtZW50LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0SW5zYW5pdHkoKSIpOworCisgICAgICAgICAgICAgICAgLyoqIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQ6CisgICAgICAgICAgICAgICAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAgICAgICAgICAgICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgICAgICAgICAgICAgICAqICAgfQorICAgICAgICAgICAgICAgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgdmFyIGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOworICAgICAgICAgICAgICAgIHZhciBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5zYW5lID0gbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbMV0gPSBmaXJzdF9tYXAsCisgICAgICAgICAgICAgICAgICAgIFsyXSA9IHNlY29uZF9tYXAKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChpbnNhbmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RNdWx0aUFzeW5jKHNieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE11bHRpKCkiKTsKKworICAgICAgICAgICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOworICAgICAgICAgICAgICAgIGhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgICAgICAgIGhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICAgICAgICAgIGhlbGxvLkkzMl90aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGhlbGxvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdEV4Y2VwdGlvbkFzeW5jKHN0cmluZyBhcmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RFeGNlcHRpb24oezB9KSIsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPSBhcmcKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE11bHRpRXhjZXB0aW9uKHswfSwgezF9KSIsIGFyZzAsIGFyZzEpOworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24yCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0IHsgU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIiB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSBhcmcxIH07CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0T25ld2F5QXN5bmMoaW50IHNlY29uZHNUb1NsZWVwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0T25ld2F5KHswfSksIHNsZWVwaW5nLi4uIiwgc2Vjb25kc1RvU2xlZXApOworICAgICAgICAgICAgICAgIFRhc2suRGVsYXkoc2Vjb25kc1RvU2xlZXAgKiAxMDAwLCBjYW5jZWxsYXRpb25Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNlcnZlciBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc2VydmVyLXR5cGU9PHR5cGU+ICAgICAgICAgICAgb25lIG9mIHRocmVhZGVkLHRocmVhZHBvb2wgIChkZWZhdWx0cyB0byBzaW1wbGUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb2Nlc3Nvcj08cHJvdG90eXBlPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zc2wiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldFNlcnZlckNlcnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyQ2VydE5hbWUgPSAic2VydmVyLnAxMiI7CisgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiLi4vLi4vLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAia2V5cy8iLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc3RyaW5nIGV4aXN0aW5nUGF0aCA9IG51bGw7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcG9zc2libGVQYXRoIGluIHBvc3NpYmxlUGF0aHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBQYXRoLkdldEZ1bGxQYXRoKHBvc3NpYmxlUGF0aCArIHNlcnZlckNlcnROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMocGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShleGlzdGluZ1BhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oJCJDYW5ub3QgZmluZCBmaWxlOiB7c2VydmVyQ2VydE5hbWV9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBjZXJ0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxvZ2dlckZhY3RvcnkgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpOy8vLkFkZENvbnNvbGUoKS5BZGREZWJ1ZygpOworICAgICAgICAgICAgdmFyIGxvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQ3JlYXRlTG9nZ2VyKCJUZXN0Iik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYXJhbSA9IG5ldyBTZXJ2ZXJQYXJhbSgpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS5QYXJzZShhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ucGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwYXJhbS5waXBlKTsKKyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS51c2VGcmFtZWQpCisvLyAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChwYXJhbS5wb3J0KTsKKy8vICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0udXNlRW5jcnlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBHZXRTZXJ2ZXJDZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2VydGlmaWNhdGUgZG9lc24ndCBjb250YWluIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQocGFyYW0ucG9ydCwgcGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzLCBwYXJhbS51c2VGcmFtZWQsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5kZXIsIGNlcnRpZmljYXRlLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzIHwgU3NsUHJvdG9jb2xzLlRsczExIHwgU3NsUHJvdG9jb2xzLlRsczEyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQocGFyYW0ucG9ydCwgMCwgcGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzLCBwYXJhbS51c2VGcmFtZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgcHJvdG87CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmNvbXBhY3QpCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLmpzb24pCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIElUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworCisgICAgICAgICAgICAgICAgLy8gUHJvY2Vzc29yCisgICAgICAgICAgICAgICAgdmFyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyQXN5bmMoKTsKKyAgICAgICAgICAgICAgICB2YXIgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LkFzeW5jUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFNpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5KHRlc3RQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7IAorCisgICAgICAgICAgICAgICAgVEJhc2VTZXJ2ZXIgc2VydmVyRW5naW5lID0gbmV3IEFzeW5jQmFzZVNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCB0cmFuc0ZhY3RvcnksIHByb3RvLCBwcm90bywgbG9nZ2VyKTsKKworICAgICAgICAgICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgICAgICB2YXIgc2VydmVyRXZlbnRzID0gbmV3IE15U2VydmVyRXZlbnRIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNldEV2ZW50SGFuZGxlcihzZXJ2ZXJFdmVudHMpOworCisgICAgICAgICAgICAgICAgLy8gUnVuIGl0CisgICAgICAgICAgICAgICAgdmFyIHdoZXJlID0gKCEgc3RyaW5nLklzTnVsbE9yRW1wdHkocGFyYW0ucGlwZSkpID8gIm9uIHBpcGUgIiArIHBhcmFtLnBpcGUgOiAib24gcG9ydCAiICsgcGFyYW0ucG9ydDsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIEFzeW5jQmFzZVNlcnZlciAiICsgd2hlcmUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBwcm9jZXNzb3IgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkgcHJvdG90eXBlIGZhY3RvcnkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnVzZUJ1ZmZlcmVkU29ja2V0cyA/ICIgd2l0aCBidWZmZXJlZCBzb2NrZXQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmNvbXBhY3QgPyAiIHdpdGggY29tcGFjdCBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS5qc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSkuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1RocmlmdFRlc3Quc2xuIGIvdGVzdC9uZXRjb3JlL1RocmlmdFRlc3Quc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjI0MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KQEAgLTAsMCArMSw2NCBAQAor77u/TWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjY3MzAuMTIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQ2xpZW50IiwgIkNsaWVudFxDbGllbnQuY3Nwcm9qIiwgInsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJTZXJ2ZXIiLCAiU2VydmVyXFNlcnZlci5jc3Byb2oiLCAiezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHs1MkNFOUExMi1GNkNCLTRGMEMtQkI0Mi0wMTA1NjEyRjVGRjR9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvYnVpbGQuY21kIGIvdGVzdC9uZXRjb3JlL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvYnVpbGQuc2ggYi90ZXN0L25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk3ZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbCBiL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKaW5kZXggM2Y1YzllZS4uZWZlMGY0YiAxMDA2NDQKLS0tIGEvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbAorKysgYi90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCkBAIC0zNiw2ICszNiw3IEBACiAgIG1ldGhvZCB0ZXN0STMyIHggPSBwICJ0ZXN0STMyKCVkKVxuIiAoc29kIHgpOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0STY0IHggPSBwICJ0ZXN0STY0KCVzKVxuIiAoSW50NjQudG9fc3RyaW5nIChzb2QgeCkpOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0RG91YmxlIHggPSBwICJ0ZXN0RG91YmxlKCVmKVxuIiAoc29kIHgpOyAoc29kIHgpCisgIG1ldGhvZCB0ZXN0QmluYXJ5IHggPSBwICJ0ZXN0QmluYXJ5KCVzKVxuIiAoc29kIHgpOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0U3RydWN0IHggPSBwICJ0ZXN0U3RydWN0KC0tLSlcbiI7IChzb2QgeCkKICAgbWV0aG9kIHRlc3ROZXN0IHggPSBwICJ0ZXN0TmVzdCgtLS0pXG4iOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0TWFwIHggPSBwICJ0ZXN0TWFwKC0tLSlcbiI7IChzb2QgeCkKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9NYWtlZmlsZSBiL3Rlc3QvcGVybC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkODFkNC4uMDAwMDAwMAotLS0gYS90ZXN0L3BlcmwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBEZWZhdWx0IHRhcmdldCBpcyBldmVyeXRoaW5nCi10YXJnZXQ6IGFsbAotCi0jIFRvb2xzCi1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWFsbDogLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1jbGVhbjoKLQkkKFJNKSAtciBnZW4tcGVybApkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtIGIvdGVzdC9wZXJsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NWI5YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwZXJsIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3ByZWNyb3NzOiBzdHVicworCitjaGVjazogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLXBlcmwKKwpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGFmODBkNDYuLjk2ZTNiZWMKLS0tIGEvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwKKysrIGIvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwKQEAgLTE5LDEwICsxOSwxMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogdXNlIERhdGE6OkR1bXBlcjsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcoR2V0T3B0aW9ucyk7CiB1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5KTsKIAogdXNlIGxpYiAnLi4vLi4vbGliL3BlcmwvbGliJzsKQEAgLTMwLDEwNCArMzEsMjI3IEBACiAKIHVzZSBUaHJpZnQ7CiB1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKLXVzZSBUaHJpZnQ6OlNvY2tldDsKIHVzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKK3VzZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7CiAKK3VzZSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlOwogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CiAKICR8Kys7CiAKLW15ICRob3N0ID0gJ2xvY2FsaG9zdCc7Ci1teSAkcG9ydCA9IDkwOTA7CitzdWIgdXNhZ2UgeworICAgIHByaW50IDw8IkVPRiI7CitVc2FnZTogJDAgW09QVElPTlNdCiAKK09wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0EgdG8gdmFsaWRhdGUgc2VydmVyIHdpdGguCisgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCisgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1wb3J0IDxwb3J0bnVtPiAgICAgICAgICAgICAgICA5MDkwICAgICAgICAgUG9ydCB0byB1c2UuCisgIC0tcHJvdG9jb2wge2JpbmFyeX0gICAgICAgICAgICAgYmluYXJ5ICAgICAgIFByb3RvY29sIHRvIHVzZS4KKyAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJlc2VudCwgdXNlIFNTTC4KKyAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KIAotbXkgJHNvY2tldCA9IG5ldyBUaHJpZnQ6OlNvY2tldCgkaG9zdCwgJHBvcnQpOworRU9GCit9CiAKLW15ICRidWZmZXJlZFNvY2tldCA9IG5ldyBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsIDEwMjQsIDEwMjQpOwotbXkgJHRyYW5zcG9ydCA9ICRidWZmZXJlZFNvY2tldDsKLW15ICRwcm90b2NvbCA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotbXkgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOworbXkgJW9wdHMgPSAoCisgICAgJ3BvcnQnID0+IDkwOTAsCisgICAgJ3Byb3RvY29sJyA9PiAnYmluYXJ5JywKKyAgICAndHJhbnNwb3J0JyA9PiAnYnVmZmVyZWQnCispOwogCi1ldmFsewotJHRyYW5zcG9ydC0+b3BlbigpOwotfTsgaWYoJEApeworR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCisgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAga2V5PXMKKyAgICBkb21haW4tc29ja2V0PXMKKyAgICBoZWxwCisgICAgaG9zdD1zCisgICAgcG9ydD1pCisgICAgcHJvdG9jb2w9cworICAgIHNzbAorICAgIHRyYW5zcG9ydD1zCispKSB8fCBleGl0IDE7CisKK2lmICgkb3B0c3toZWxwfSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAwOworfQorCitteSAkc29ja2V0ID0gdW5kZWY7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgICRzb2NrZXQgPSBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKK30KK2Vsc2lmICgkb3B0c3tzc2x9KSB7CisgICRzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoJG9wdHN7aG9zdH0sICRvcHRze3BvcnR9KTsKK30KKworbXkgJHRyYW5zcG9ydDsKK2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsIDEwMjQsIDEwMjQpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0KTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitteSAkcHJvdG9jb2w7CitteSAkcHJvdG9jb2wyOworaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JyB8fCAkb3B0c3twcm90b2NvbH0gZXEgJ211bHRpJykgeworICAgICRwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnNwb3J0KTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitteSAkc2Vjb25kU2VydmljZSA9IHVuZGVmOworaWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICAkcHJvdG9jb2wyICAgICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KCRwcm90b2NvbCwgJ1NlY29uZFNlcnZpY2UnKTsKKyAgJHByb3RvY29sICAgICAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldygkcHJvdG9jb2wsICdUaHJpZnRUZXN0Jyk7CisgICRzZWNvbmRTZXJ2aWNlID0gVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUNsaWVudC0+bmV3KCRwcm90b2NvbDIpOworfQorCitteSAkdGVzdENsaWVudCA9IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQtPm5ldygkcHJvdG9jb2wpOworCitldmFsIHsKKyAgJHRyYW5zcG9ydC0+b3BlbigpOworfTsKK2lmKCRAKXsKICAgICBkaWUoRHVtcGVyKCRAKSk7CiB9CisKK3VzZSBjb25zdGFudCBFUlJfQkFTRVRZUEVTID0+IDE7Cit1c2UgY29uc3RhbnQgRVJSX1NUUlVDVFMgPT4gMjsKK3VzZSBjb25zdGFudCBFUlJfQ09OVEFJTkVSUyA9PiA0OwordXNlIGNvbnN0YW50IEVSUl9FWENFUFRJT05TID0+IDg7Cit1c2UgY29uc3RhbnQgRVJSX1BST1RPQ09MID0+IDE2OwordXNlIGNvbnN0YW50IEVSUl9VTktOT1dOID0+IDY0OworCiBteSAkc3RhcnQgPSBnZXR0aW1lb2ZkYXkoKTsKIAogIwogIyBWT0lEIFRFU1QKICMKLXByaW50KCJ0ZXN0Vm9pZCgpIik7CitwcmludCgndGVzdFZvaWQoKScpOwogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludCgiID0gdm9pZFxuIik7CiAKICMKICMgU1RSSU5HIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnQoIiA9IFwiJHNcIlxuIik7CitwcmludCgndGVzdFN0cmluZygiVGVzdCIpJyk7CitteSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCdUZXN0Jyk7CitwcmludChxcXwgPSAiJHMiXG58KTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRzIG5lICdUZXN0Jyk7CisKKyMKKyMgTVVMVElQTEVYRUQgVEVTVAorIworaWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICAgIHByaW50KCdzZWNvbmR0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7CisgICAgJHMgPSAkc2Vjb25kU2VydmljZS0+c2Vjb25kdGVzdFN0cmluZygnVGVzdDInKTsKKyAgICBwcmludChxcXwgPSAiJHMiXG58KTsKKyAgICBleGl0KEVSUl9QUk9UT0NPTCkgaWYgKCRzIG5lICd0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7Cit9CisKKyMKKyMgQk9PTCBURVNUCisjCitwcmludCgndGVzdEJvb2woMSknKTsKK215ICR0ID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDEpOworcHJpbnQoIiA9ICR0XG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCR0IG5lIDEpOworcHJpbnQoJ3Rlc3RCb29sKDApJyk7CitteSAkZiA9ICR0ZXN0Q2xpZW50LT50ZXN0Qm9vbCgwKTsKK3ByaW50KCIgPSAkZlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkZiBuZSBxfHwpOworCiAKICMKICMgQllURSBURVNUCiAjCi1wcmludCgidGVzdEJ5dGUoMSkiKTsKK3ByaW50KCd0ZXN0Qnl0ZSgxKScpOwogbXkgJHU4ID0gJHRlc3RDbGllbnQtPnRlc3RCeXRlKDEpOwogcHJpbnQoIiA9ICR1OFxuIik7CiAKICMKICMgSTMyIFRFU1QKICMKLXByaW50KCJ0ZXN0STMyKC0xKSIpOworcHJpbnQoJ3Rlc3RJMzIoLTEpJyk7CiBteSAkaTMyID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoLTEpOwogcHJpbnQoIiA9ICRpMzJcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGkzMiBuZSAtMSk7CiAKICMKLSNJNjQgVEVTVAorIyBJNjQgVEVTVAogIwotcHJpbnQoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworcHJpbnQoJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KScpOwogbXkgJGk2NCA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KC0zNDM1OTczODM2OCk7CiBwcmludCgiID0gJGk2NFxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkaTY0IG5lIC0zNDM1OTczODM2OCk7CiAKICMKICMgRE9VQkxFIFRFU1QKICMKLXByaW50KCJ0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KSIpOworcHJpbnQoJ3Rlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpJyk7CiBteSAkZHViID0gJHRlc3RDbGllbnQtPnRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpOwogcHJpbnQoIiA9ICRkdWJcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGR1YiBuZSAtODUyLjIzNDIzNDIzNCk7CisKKyMKKyMgQklOQVJZIFRFU1QgICAtLS0gIFRPRE8KKyMKKwogCiAjCiAjIFNUUlVDVCBURVNUCiAjCi1wcmludCgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7Ci1teSAkb3V0ID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJG91dC0+c3RyaW5nX3RoaW5nKCJaZXJvIik7CitwcmludCgndGVzdFN0cnVjdCh7Ilplcm8iLCAxLCAtMywgLTV9KScpOworbXkgJG91dCA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KCk7Ciskb3V0LT5zdHJpbmdfdGhpbmcoJ1plcm8nKTsKICRvdXQtPmJ5dGVfdGhpbmcoMSk7CiAkb3V0LT5pMzJfdGhpbmcoLTMpOwogJG91dC0+aTY0X3RoaW5nKC01KTsKIG15ICRpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RydWN0KCRvdXQpOwotcHJpbnQoIiA9IHtcIiIuJGluLT5zdHJpbmdfdGhpbmcuIlwiLCAiLgotICAgICAgICAkaW4tPmJ5dGVfdGhpbmcuIiwgIi4KLSAgICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KK3ByaW50KCcgPSB7IicuJGluLT5zdHJpbmdfdGhpbmcuJyIsICcuCisgICAgICAgICRpbi0+Ynl0ZV90aGluZy4nLCAnLgorICAgICAgICAkaW4tPmkzMl90aGluZy4nLCAnLgogICAgICAgICAkaW4tPmk2NF90aGluZy4ifVxuIik7CiAKICMKICMgTkVTVEVEIFNUUlVDVCBURVNUCiAjCi1wcmludCgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0iKTsKLW15ICRvdXQyID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdDIoKTsKK3ByaW50KCd0ZXN0TmVzdCh7MSwgeyJaZXJvIiwgMSwgLTMsIC01fSwgNX0nKTsKK215ICRvdXQyID0gVGhyaWZ0VGVzdDo6WHRydWN0Mi0+bmV3KCk7CiAkb3V0Mi0+Ynl0ZV90aGluZygxKTsKICRvdXQyLT5zdHJ1Y3RfdGhpbmcoJG91dCk7CiAkb3V0Mi0+aTMyX3RoaW5nKDUpOwogbXkgJGluMiA9ICR0ZXN0Q2xpZW50LT50ZXN0TmVzdCgkb3V0Mik7CiAkaW4gPSAkaW4yLT5zdHJ1Y3RfdGhpbmc7Ci1wcmludCgiID0geyIuJGluMi0+Ynl0ZV90aGluZy4iLCB7XCIiLgotICAgICAgJGluLT5zdHJpbmdfdGhpbmcuIlwiLCAiLgotICAgICAgJGluLT5ieXRlX3RoaW5nLiIsICIuCi0gICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgotICAgICAgJGluLT5pNjRfdGhpbmcuIn0sICIuCitwcmludCgnID0geycuJGluMi0+Ynl0ZV90aGluZy4nLCB7IicuCisgICAgICAkaW4tPnN0cmluZ190aGluZy4nIiwgJy4KKyAgICAgICRpbi0+Ynl0ZV90aGluZy4nLCAnLgorICAgICAgJGluLT5pMzJfdGhpbmcuJywgJy4KKyAgICAgICRpbi0+aTY0X3RoaW5nLid9LCAnLgogICAgICAgJGluMi0+aTMyX3RoaW5nLiJ9XG4iKTsKIAogIwpAQCAtMTM3LDI4ICsyNjEsMzAgQEAKIGZvciAobXkgJGkgPSAwOyAkaSA8IDU7ICsrJGkpIHsKICAgJG1hcG91dC0+eyRpfSA9ICRpLTEwOwogfQotcHJpbnQoInRlc3RNYXAoeyIpOworcHJpbnQoJ3Rlc3RNYXAoeycpOwogbXkgJGZpcnN0ID0gMTsKIHdoaWxlKCBteSgka2V5LCR2YWwpID0gZWFjaCAlJG1hcG91dCkgewogICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50KCcsICcpOwogICAgIH0KICAgICBwcmludCgiJGtleSA9PiAkdmFsIik7CiB9Ci1wcmludCgifSkiKTsKK3ByaW50KCd9KScpOwogCiAKIG15ICRtYXBpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0TWFwKCRtYXBvdXQpOwotcHJpbnQoIiA9IHsiKTsKK3ByaW50KCcgPSB7Jyk7CiAKICRmaXJzdCA9IDE7CiB3aGlsZSggbXkoJGtleSwkdmFsKSA9IGVhY2ggJSRtYXBpbil7CiAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQoJywgJyk7CiAgICAgfQogICAgIHByaW50KCIka2V5ID0+ICR2YWwiKTsKIH0KQEAgLTE3MiwxMSArMjk4LDExIEBACiAgICAgcHVzaChAJHNldG91dCwgJGkpOwogfQogCi1wcmludCgidGVzdFNldCh7Ii5qb2luKCIsIixAJHNldG91dCkuIn0pIik7CitwcmludCgndGVzdFNldCh7Jy5qb2luKCcsJyxAJHNldG91dCkuJ30pJyk7CiAKIG15ICRzZXRpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U2V0KCRzZXRvdXQpOwogCi1wcmludCgiID0geyIuam9pbigiLCIsQCRzZXRvdXQpLiJ9XG4iKTsKK3ByaW50KCcgPSB7Jy5qb2luKCcsJyxAJHNldG91dCkuIn1cbiIpOwogCiAjCiAjIExJU1QgVEVTVApAQCAtMTg2LDEwNSArMzEyLDExMSBAQAogICAgIHB1c2goQCRsaXN0b3V0LCAkaSk7CiB9CiAKLXByaW50KCJ0ZXN0TGlzdCh7Ii5qb2luKCIsIixAJGxpc3RvdXQpLiJ9KSIpOworcHJpbnQoJ3Rlc3RMaXN0KHsnLmpvaW4oJywnLEAkbGlzdG91dCkuJ30pJyk7CiAKIG15ICRsaXN0aW4gPSAkdGVzdENsaWVudC0+dGVzdExpc3QoJGxpc3RvdXQpOwogCi1wcmludCgiID0geyIuam9pbigiLCIsQCRsaXN0aW4pLiJ9XG4iKTsKK3ByaW50KCcgPSB7Jy5qb2luKCcsJyxAJGxpc3RpbikuIn1cbiIpOwogCiAjCiAjIEVOVU0gVEVTVAogIwotcHJpbnQoInRlc3RFbnVtKE9ORSkiKTsKK3ByaW50KCd0ZXN0RW51bShPTkUpJyk7CiBteSAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6Ok9ORSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShUV08pIik7CitwcmludCgndGVzdEVudW0oVFdPKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUV08pOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oVEhSRUUpIik7CitwcmludCgndGVzdEVudW0oVEhSRUUpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKEZJVkUpIik7CitwcmludCgndGVzdEVudW0oRklWRSknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6RklWRSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKK3ByaW50KCd0ZXN0RW51bShFSUdIVCknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6RUlHSFQpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCiAjCiAjIFRZUEVERUYgVEVTVAogIwotcHJpbnQoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKK3ByaW50KCd0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpJyk7CiBteSAkdWlkID0gJHRlc3RDbGllbnQtPnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CiBwcmludCgiID0gJHVpZFxuIik7CiAKICMKICMgTkVTVEVEIE1BUCBURVNUCiAjCi1wcmludCgidGVzdE1hcE1hcCgxKSIpOworcHJpbnQoJ3Rlc3RNYXBNYXAoMSknKTsKIG15ICRtbSA9ICR0ZXN0Q2xpZW50LT50ZXN0TWFwTWFwKDEpOwotcHJpbnQoIiA9IHsiKTsKK3ByaW50KCcgPSB7Jyk7CiB3aGlsZSggbXkgKCRrZXksJHZhbCkgPSBlYWNoICUkbW0pIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+ICR2MiwgIik7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgSU5TQU5JVFkgVEVTVAogIwotbXkgJGluc2FuZSA9IG5ldyBUaHJpZnRUZXN0OjpJbnNhbml0eSgpOworbXkgJGluc2FuZSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKICRpbnNhbmUtPnt1c2VyTWFwfS0+e1RocmlmdFRlc3Q6Ok51bWJlcno6OkZJVkV9ID0gNTAwMDsKLW15ICR0cnVjayA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QoKTsKLSR0cnVjay0+c3RyaW5nX3RoaW5nKCJUcnVjayIpOwotJHRydWNrLT5ieXRlX3RoaW5nKDgpOwotJHRydWNrLT5pMzJfdGhpbmcoOCk7Ci0kdHJ1Y2stPmk2NF90aGluZyg4KTsKK215ICR0cnVjayA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KCk7CiskdHJ1Y2stPnN0cmluZ190aGluZygnSGVsbG8yJyk7CiskdHJ1Y2stPmJ5dGVfdGhpbmcoMik7CiskdHJ1Y2stPmkzMl90aGluZygyKTsKKyR0cnVjay0+aTY0X3RoaW5nKDIpOworbXkgJHRydWNrMiA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KCk7CiskdHJ1Y2syLT5zdHJpbmdfdGhpbmcoJ0dvb2RieWU0Jyk7CiskdHJ1Y2syLT5ieXRlX3RoaW5nKDQpOworJHRydWNrMi0+aTMyX3RoaW5nKDQpOworJHRydWNrMi0+aTY0X3RoaW5nKDQpOwogcHVzaChAeyRpbnNhbmUtPnt4dHJ1Y3RzfX0sICR0cnVjayk7CitwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrMik7CiAKLXByaW50KCJ0ZXN0SW5zYW5pdHkoKSIpOworcHJpbnQoJ3Rlc3RJbnNhbml0eSgpJyk7CiBteSAkd2hvYSA9ICR0ZXN0Q2xpZW50LT50ZXN0SW5zYW5pdHkoJGluc2FuZSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSR3aG9hKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiB7Iik7CiAgICAgICAgIG15ICR1c2VyTWFwID0gJHYyLT57dXNlck1hcH07Ci0gICAgICAgIHByaW50KCJ7Iik7Ci0gICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICJIQVNIIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR1c2VyTWFwKSBlcSAnSEFTSCcpIHsKICAgICAgICAgICAgIHdoaWxlKCBteSgkazMsJHYzKSA9IGVhY2ggJSR1c2VyTWFwKSB7CiAgICAgICAgICAgICAgICAgcHJpbnQoIiRrMyA9PiAkdjMsICIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9LCAiKTsKKyAgICAgICAgcHJpbnQoJ30sICcpOwogCiAgICAgICAgIG15ICR4dHJ1Y3RzID0gJHYyLT57eHRydWN0c307Ci0gICAgICAgIHByaW50KCJ7Iik7Ci0gICAgICAgIGlmIChyZWYoJHh0cnVjdHMpIGVxICJBUlJBWSIpIHsKKyAgICAgICAgcHJpbnQoJ3snKTsKKyAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgZm9yZWFjaCBteSAkeCAoQCR4dHJ1Y3RzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQoIntcIiIuJHgtPntzdHJpbmdfdGhpbmd9LiJcIiwgIi4KLSAgICAgICAgICAgICAgICAgICAgICAkeC0+e2J5dGVfdGhpbmd9LiIsICIuJHgtPntpMzJfdGhpbmd9LiIsICIuJHgtPntpNjRfdGhpbmd9LiJ9LCAiKTsKKyAgICAgICAgICAgICAgICBwcmludCgneyInLiR4LT57c3RyaW5nX3RoaW5nfS4nIiwgJy4KKyAgICAgICAgICAgICAgICAgICAgICAkeC0+e2J5dGVfdGhpbmd9LicsICcuJHgtPntpMzJfdGhpbmd9LicsICcuJHgtPntpNjRfdGhpbmd9Lid9LCAnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwcmludCgifSIpOworICAgICAgICBwcmludCgnfScpOwogCi0gICAgICAgIHByaW50KCJ9LCAiKTsKKyAgICAgICAgcHJpbnQoJ30sICcpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIEVYQ0VQVElPTiBURVNUCiAjCi1wcmludCgidGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKSIpOworcHJpbnQocXx0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpfCk7CiBldmFsIHsKICAgICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgICBwcmludCgiICB2b2lkXG5GQUlMVVJFXG4iKTsKQEAgLTI5Nyw3ICs0MjksNyBAQAogIyBOb3JtYWwgdGVzdHMgZG9uZS4KICMKIG15ICRzdG9wID0gZ2V0dGltZW9mZGF5KCk7Ci1teSAkZWxwICA9IHNwcmludGYoIiVkIiwxMDAwKigkc3RvcCAtICRzdGFydCksIDApOworbXkgJGVscCAgPSBzcHJpbnRmKCclZCcsMTAwMCooJHN0b3AgLSAkc3RhcnQpLCAwKTsKIHByaW50KCJUb3RhbCB0aW1lOiAkZWxwIG1zXG4iKTsKIAogIwpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RTZXJ2ZXIucGwgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI5YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wZXJsL1Rlc3RTZXJ2ZXIucGwKQEAgLTAsMCArMSw0MTEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcoR2V0T3B0aW9ucyk7Cit1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5KTsKKworJFNJR3tJTlR9ID0gXCZzaWdpbnRfaGFuZGxlcjsKKwordXNlIGxpYiAnLi4vLi4vbGliL3BlcmwvbGliJzsKK3VzZSBsaWIgJ2dlbi1wZXJsJzsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3VzZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlcjsKK3VzZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7CisKK3VzZSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlOwordXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7Cit1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CisKKyR8Kys7CisKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgPDwiRU9GIjsKK1VzYWdlOiAkMCBbT1BUSU9OU10KKworT3B0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0KQorICAtLWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZSAob3B0aW9uYWwpLgorICAtLWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1jaXBoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0YWJsZSBjaXBoZXIgbGlzdC4KKyAgLS1kb21haW4tc29ja2V0IDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgdW5peCBkb21haW4gc29ja2V0LgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHVzYWdlLgorICAtLWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YXRlIGtleSBmaWxlIGZvciBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wgYW5kIHByaXZhdGUga2V5IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbiB0aGUgY2VydGlmaWNhdGUgZmlsZS4KKyAgLS1wb3J0IDxwb3J0bnVtPiAgICAgICAgICAgICAgICA5MDkwICAgICAgICAgUG9ydCB0byB1c2UuCisgIC0tcHJvdG9jb2wge2JpbmFyeX0gICAgICAgICAgICAgYmluYXJ5ICAgICAgIFByb3RvY29sIHRvIHVzZS4KKyAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJlc2VudCwgdXNlIFNTTC9UTFMuCisgIC0tdHJhbnNwb3J0IHtidWZmZXJlZHxmcmFtZWR9ICAgYnVmZmVyZWQgICAgIFRyYW5zcG9ydCB0byB1c2UuCisKK0VPRgorfQorCitteSAlb3B0cyA9ICgKKyAgICAncG9ydCcgPT4gOTA5MCwKKyAgICAncHJvdG9jb2wnID0+ICdiaW5hcnknLAorICAgICd0cmFuc3BvcnQnID0+ICdidWZmZXJlZCcKKyk7CisKK0dldE9wdGlvbnMoXCVvcHRzLCBxdyAoCisgICAgY2E9cworICAgIGNlcnQ9cworICAgIGNpcGhlcnM9cworICAgIGRvbWFpbi1zb2NrZXQ9cworICAgIGhlbHAKKyAgICBob3N0PXMKKyAgICBrZXk9cworICAgIHBvcnQ9aQorICAgIHByb3RvY29sPXMKKyAgICBzc2wKKyAgICB0cmFuc3BvcnQ9cworKSkgfHwgZXhpdCAxOworCitpZiAoJG9wdHN7aGVscH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMDsKK30KKworaWYgKCRvcHRze3NzbH0gYW5kIG5vdCBkZWZpbmVkICRvcHRze2NlcnR9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRoYW5kbGVyICAgID0gVGhyaWZ0VGVzdEhhbmRsZXItPm5ldygpOworbXkgJGhhbmRsZXIyICAgPSBTZWNvbmRTZXJ2aWNlSGFuZGxlci0+bmV3KCk7CitteSAkcHJvY2Vzc29yICA9IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RQcm9jZXNzb3ItPm5ldygkaGFuZGxlcik7CitteSAkcHJvY2Vzc29yMiA9IFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VQcm9jZXNzb3ItPm5ldygkaGFuZGxlcjIpOworCitteSAkc2VydmVyc29ja2V0OworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICB1bmxpbmsoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7CisgICAgJHNlcnZlcnNvY2tldCA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorZWxzZSB7CisgICAgJHNlcnZlcnNvY2tldCA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK215ICR0cmFuc3BvcnQ7CitpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnYnVmZmVyZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KK215ICRwcm90b2NvbDsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworaWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICBteSAkbmV3UHJvY2Vzc29yID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3Nvci0+bmV3KCRwcm90b2NvbCk7CisgICRuZXdQcm9jZXNzb3ItPmRlZmF1bHRQcm9jZXNzb3IoJHByb2Nlc3Nvcik7CisgICRuZXdQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCdUaHJpZnRUZXN0JywgJHByb2Nlc3Nvcik7CisgICRuZXdQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCdTZWNvbmRTZXJ2aWNlJywgJHByb2Nlc3NvcjIpOworICAkcHJvY2Vzc29yID0gJG5ld1Byb2Nlc3NvcjsKK30KKworbXkgJHNzbHRhZyA9ICcnOworaWYgKCRvcHRze3NzbH0pIHsKKyAgICAkc3NsdGFnID0gJyhTU0wpJzsKK30KK215ICRsaXN0ZW5pbmdfb24gPSAiJG9wdHN7cG9ydH0gJHNzbHRhZyI7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgICRsaXN0ZW5pbmdfb24gPSAkb3B0c3snZG9tYWluLXNvY2tldCd9OworfQorbXkgJHNlcnZlciA9IFRocmlmdDo6U2ltcGxlU2VydmVyLT5uZXcoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCwgJHRyYW5zcG9ydCwgJHByb3RvY29sKTsKK3ByaW50IHFxfFN0YXJ0aW5nICJzaW1wbGUiIHNlcnZlciAoJG9wdHN7dHJhbnNwb3J0fS8kb3B0c3twcm90b2NvbH0pIGxpc3RlbiBvbjogJGxpc3RlbmluZ19vblxufDsKKyRzZXJ2ZXItPnNlcnZlKCk7CitwcmludCAiZG9uZS5cbiI7CisKK3N1YiBzaWdpbnRfaGFuZGxlciB7CisgIHByaW50ICJyZWNlaXZlZCBTSUdJTlQsIHN0b3BwaW5nLi4uXG4iOworICAkc2VydmVyLT5zdG9wKCk7Cit9CisKKyMjIworIyMjIFRlc3Qgc2VydmVyIGltcGxlbWVudGF0aW9uCisjIyMKKworcGFja2FnZSBUaHJpZnRUZXN0SGFuZGxlcjsKKwordXNlIGJhc2UgcXcoIFRocmlmdFRlc3Q6OlRocmlmdFRlc3RJZiApOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7fTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgdGVzdFZvaWQgeworICBwcmludCgidGVzdFZvaWQoKVxuIik7Cit9CisKK3N1YiB0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEJvb2wgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgbXkgJHN0ciA9ICR0aGluZyA/ICd0cnVlJyA6ICdmYWxzZSc7CisgIHByaW50KCJ0ZXN0Qm9vbCgkc3RyKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0Qnl0ZSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdEJ5dGUoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0STMyIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0STMyKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEk2NCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdEk2NCgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3REb3VibGUgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3REb3VibGUoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0QmluYXJ5IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR0aGluZyA9IHNoaWZ0OworICAgIG15IEBieXRlcyA9IHNwbGl0IC8vLCAkdGhpbmc7CisgICAgcHJpbnQgJ3Rlc3RCaW5hcnkoJzsKKyAgICBwcmludGYoICclMDJseCcsIG9yZCAkXyApIGZvcmVhY2ggKEBieXRlcyk7CisgICAgcHJpbnQgIilcbiI7CisgICAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTdHJ1Y3QgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmKHFxfHRlc3RTdHJ1Y3QoeyIlcyIsICVkLCAlZCwgJWxsZH0pXG58LAorICAgICAgICAgICAkdGhpbmctPntzdHJpbmdfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTMyX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTY0X3RoaW5nfSk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0TmVzdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRuZXN0ID0gc2hpZnQ7CisgIG15ICR0aGluZyA9ICRuZXN0LT57c3RydWN0X3RoaW5nfTsKKyAgcHJpbnRmKHFxfHRlc3ROZXN0KHslZCwgeyIlcyIsICVkLCAlZCwgJWxsZH0sICVkfSlcbnwsCisgICAgICAgICAgICRuZXN0LT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpNjRfdGhpbmd9LAorICAgICAgICAgICAkbmVzdC0+e2kzMl90aGluZ30pOworICByZXR1cm4gJG5lc3Q7Cit9CisKK3N1YiB0ZXN0TWFwIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ZiAidGVzdE1hcCh7JXN9KVxuIiwKKyAgICBqb2luKCAnLCAnLAorICAgICAgICAgIG1hcCB7ICRfIC4gJyA9PiAnIC4gJHRoaW5nLT57JF99IH0KKyAgICAgICAgICBzb3J0IGtleXMgJSR0aGluZworICAgICk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0U3RyaW5nTWFwIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ZiAidGVzdFN0cmluZ01hcCh7JXN9KVxuIiwKKyAgICBqb2luKCAnLCAnLAorICAgICAgICAgIG1hcCB7ICRfIC4gJyA9PiAnIC4gJHRoaW5nLT57JF99IH0KKyAgICAgICAgICBzb3J0IGtleXMgJSR0aGluZworICAgICk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0U2V0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIG15IEByZXN1bHQgPSBzb3J0IGtleXMgJSR0aGluZzsKKyAgcHJpbnRmICJ0ZXN0U2V0KHslc30pXG4iLCBqb2luKCcsICcsIEByZXN1bHQgKTsKKyAgcmV0dXJuIFxAcmVzdWx0OworfQorCitzdWIgdGVzdExpc3QgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQgInRlc3RMaXN0KHslc30pXG4iLCBqb2luKCcsICcsIEAkdGhpbmcpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEVudW0geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQgInRlc3RFbnVtKCR0aGluZylcbiI7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0VHlwZWRlZiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFR5cGVkZWYoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0TWFwTWFwIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGhlbGxvID0gc2hpZnQ7CisKKyAgcHJpbnRmKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgJGhlbGxvKTsKKyAgbXkgJHJlc3VsdCA9IHsgNCA9PiB7IDEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCB9LCAtNCA9PiB7IC0xID0+IC0xLCAtMiA9PiAtMiwgLTMgPT4gLTMsIC00ID0+IC00IH0gfTsKKyAgcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiB0ZXN0SW5zYW5pdHkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJndW1lbnQgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJbnNhbml0eSgpXG4iKTsKKworICBteSAkaGVsbG8gPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLCBieXRlX3RoaW5nID0+IDIsIGkzMl90aGluZyA9PiAyLCBpNjRfdGhpbmcgPT4gMn0pOworICBteSBAaGVsbG9zOworICBwdXNoKEBoZWxsb3MsICRoZWxsbyk7CisgIG15ICRnb29kYnllID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnR29vZGJ5ZTQnLCBieXRlX3RoaW5nID0+IDQsIGkzMl90aGluZyA9PiA0LCBpNjRfdGhpbmcgPT4gNH0pOworICBteSBAZ29vZGJ5ZXM7CisgIHB1c2goQGdvb2RieWVzLCAkZ29vZGJ5ZSk7CisgIG15ICRjcmF6eSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoe3VzZXJNYXAgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4IH0sIHh0cnVjdHMgPT4gXEBnb29kYnllc30pOworICBteSAkbG9vbnkgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KCk7CisgIG15ICRyZXN1bHQgPSB7IDEgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUV08gPT4gJGFyZ3VtZW50LCBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUSFJFRSA9PiAkYXJndW1lbnQgfSwKKyAgICAgICAgICAgICAgICAgMiA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlNJWCA9PiAkbG9vbnkgfSB9OworICByZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIHRlc3RNdWx0aSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmcwID0gc2hpZnQ7CisgIG15ICRhcmcxID0gc2hpZnQ7CisgIG15ICRhcmcyID0gc2hpZnQ7CisgIG15ICRhcmczID0gc2hpZnQ7CisgIG15ICRhcmc0ID0gc2hpZnQ7CisgIG15ICRhcmc1ID0gc2hpZnQ7CisKKyAgcHJpbnQoInRlc3RNdWx0aSgpXG4iKTsKKyAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0hlbGxvMicsIGJ5dGVfdGhpbmcgPT4gJGFyZzAsIGkzMl90aGluZyA9PiAkYXJnMSwgaTY0X3RoaW5nID0+ICRhcmcyfSk7Cit9CisKK3N1YiB0ZXN0RXhjZXB0aW9uIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZyA9IHNoaWZ0OworICBwcmludCgidGVzdEV4Y2VwdGlvbigkYXJnKVxuIik7CisgIGlmICgkYXJnIGVxICdYY2VwdGlvbicpIHsKKyAgICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbi0+bmV3KHtlcnJvckNvZGUgPT4gMTAwMSwgbWVzc2FnZSA9PiAkYXJnfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcgZXEgJ1RFeGNlcHRpb24nKSB7CisgICAgICBkaWUgJ2FzdHJpbmcnOyAjIGFsbCB1bmhhbmRsZWQgZXhjZXB0aW9ucyBiZWNvbWUgVEV4Y2VwdGlvbnMKKyAgfQorICBlbHNlIHsKKyAgICAgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICRhcmd9KTsKKyAgfQorfQorCitzdWIgdGVzdE11bHRpRXhjZXB0aW9uIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZzAgPSBzaGlmdDsKKyAgbXkgJGFyZzEgPSBzaGlmdDsKKworICBwcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCAkYXJnMCwgJGFyZzEpOworICBpZiAoJGFyZzAgZXEgJ1hjZXB0aW9uJykgeworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbi0+bmV3KHtlcnJvckNvZGUgPT4gMTAwMSwgbWVzc2FnZSA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbid9KTsKKyAgfQorICBlbHNpZiAoJGFyZzAgZXEgJ1hjZXB0aW9uMicpIHsKKyAgICBteSAkc3RydWN0X3RoaW5nID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbjInfSk7CisgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uMi0+bmV3KHtlcnJvckNvZGUgPT4gMjAwMiwgc3RydWN0X3RoaW5nID0+ICRzdHJ1Y3RfdGhpbmd9KTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnMX0pOworICB9Cit9CisKK3N1YiB0ZXN0T25ld2F5IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJG51bSA9IHNoaWZ0OworICBwcmludCgidGVzdE9uZXdheSgkbnVtKTogcmVjZWl2ZWRcbiIpOworfQorCisjIyMKKyMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgorIyMjCisKK3BhY2thZ2UgU2Vjb25kU2VydmljZUhhbmRsZXI7CisKK3VzZSBiYXNlIHF3KCBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlSWYgKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge307CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIHNlY29uZHRlc3RTdHJpbmcgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RTdHJpbmcoJHRoaW5nKVxuIik7CisgIHJldHVybiBxcXx0ZXN0U3RyaW5nKCIkdGhpbmciKXw7Cit9CisKKzE7CmRpZmYgLS1naXQgYS90ZXN0L3BocC9NYWtlZmlsZSBiL3Rlc3QvcGhwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM1YzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcGhwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgRGVmYXVsdCB0YXJnZXQgaXMgZXZlcnl0aGluZwotdGFyZ2V0OiBhbGwKLQotIyBUb29scwotVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotCi1hbGw6IG5vcm1hbCBpbmxpbmUKLQotbm9ybWFsOiBzdHVicwotCi1pbmxpbmU6IHN0dWJzLWlubGluZQotCi1zdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0KLXN0dWJzLWlubGluZTogLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcGhwOmlubGluZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotY2xlYW46Ci0JJChSTSkgLXIgZ2VuLXBocCBnZW4tcGhwaQpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUuYW0gYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MmY3ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOmlubGluZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKE1LRElSX1ApIGdlbi1waHAtY2xhc3NtYXAKKwkkKFRIUklGVCkgLW91dCBnZW4tcGhwLWNsYXNzbWFwIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwaHBfZXh0X2RpcjoKKwlta2RpciAtcCBwaHBfZXh0X2RpcgorCWxuIC1zIC4uLy4uLy4uL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy90aHJpZnRfcHJvdG9jb2wuc28gcGhwX2V4dF9kaXIvCisJbG4gLXMgIiQkKHBocC1jb25maWcgLS1leHRlbnNpb24tZGlyKS9zb2NrZXRzLnNvIiBwaHBfZXh0X2Rpci8KKworcHJlY3Jvc3M6IHN0dWJzIHBocF9leHRfZGlyCisKK2NoZWNrOiBzdHVicyBwaHBfZXh0X2RpcgorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpIGdlbi1waHAtY2xhc3NtYXAgcGhwX2V4dF9kaXIKKworY2xpZW50OiBzdHVicyBwaHBfZXh0X2RpcgorCXBocCBUZXN0Q2xpZW50LnBocApkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMTU5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCis8P3BocAorJEdFTl9ESVIgPSAnZ2VuLXBocC1jbGFzc21hcCc7CitpbmNsdWRlX29uY2UoJ1Rlc3RDbGllbnQucGhwJyk7Cis/PgpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDhlY2ExNzUuLmFjZDkwMWQKLS0tIGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAKKysrIGIvdGVzdC9waHAvVGVzdENsaWVudC5waHAKQEAgLTEsMyArMSwyOCBAQAorPD9waHAKKworbmFtZXNwYWNlIHRlc3RccGhwOworCisvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKK2lmICghaXNzZXQoJEdFTl9ESVIpKSB7CisgICRHRU5fRElSID0gJ2dlbi1waHAnOworfQoraWYgKCFpc3NldCgkTU9ERSkpIHsKKyAgJE1PREUgPSAnbm9ybWFsJzsKK30KKworCitpZiAoJEdFTl9ESVIgPT0gJ2dlbi1waHAnKSB7CisgICRsb2FkZXItPmFkZFBzcjQoJycsICRHRU5fRElSKTsKK30gZWxzZSB7CisgICRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyAgJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOworICAkbG9hZGVyLT5yZWdpc3RlcigpOworfQorCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE3LDQxICs0Miw0MCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotPD9waHAKLQotaWYgKCFpc3NldCgkR0VOX0RJUikpIHsKLSAgJEdFTl9ESVIgPSAnZ2VuLXBocCc7Ci19Ci1pZiAoIWlzc2V0KCRNT0RFKSkgewotICAkTU9ERSA9ICdub3JtYWwnOwotfQotCi0vKiogU2V0IHRoZSBUaHJpZnQgcm9vdCAqLwotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnLi4vLi4vbGliL3BocC9zcmMnOwotCiAvKiogSW5jbHVkZSB0aGUgVGhyaWZ0IGJhc2UgKi8KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotCi0vKiogSW5jbHVkZSB0aGUgYmluYXJ5IHByb3RvY29sICovCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwJzsKKy8qKiBJbmNsdWRlIHRoZSBwcm90b2NvbHMgKi8KK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKIAogLyoqIEluY2x1ZGUgdGhlIHNvY2tldCBsYXllciAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCc7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldFBvb2w7CiAKIC8qKiBJbmNsdWRlIHRoZSBzb2NrZXQgbGF5ZXIgKi8KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CiAKLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcbiI7Ci1lY2hvICcgU0FGRSBUTyBJR05PUkUgVEhFU0UgSU4gVEVTVCcuIlxuIjsKLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcbiI7CitmdW5jdGlvbiBtYWtlUHJvdG9jb2woJHRyYW5zcG9ydCwgJFBST1RPKQoreworICBpZiAoJFBST1RPID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnYWNjZWwnKSB7CisgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgZWNobyAiQWNjZWxlcmF0aW9uIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkXG4iOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgfQogCi0vKiogSW5jbHVkZSB0aGUgZ2VuZXJhdGVkIGNvZGUgKi8KLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0X3R5cGVzLnBocCc7Ci0KLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcbiI7Ci1lY2hvICcgRU5EIE9GIFNBRkUgRVJST1JTIFNFQ1RJT04nLiJcbiI7Ci1lY2hvICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jy4iXG5cbiI7CisgIGVjaG8gIi0tcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2Yge2JpbmFyeXxjb21wYWN0fGpzb258YWNjZWx9XG4iOworICBleGl0KDEpOworfQogCiAkaG9zdCA9ICdsb2NhbGhvc3QnOwogJHBvcnQgPSA5MDkwOwpAQCAtNjQsNiArODgsMTYgQEAKICAgJGhvc3QgPSAkYXJndlsxXTsKIH0KIAorZm9yZWFjaCAoJGFyZ3YgYXMgJGFyZykgeworICBpZiAoc3Vic3RyKCRhcmcsIDAsIDcpID09ICctLXBvcnQ9JykgeworICAgICRwb3J0ID0gc3Vic3RyKCRhcmcsIDcpOworICB9IGVsc2UgaWYgKHN1YnN0cigkYXJnLCAwLCAxMikgPT0gJy0tdHJhbnNwb3J0PScpIHsKKyAgICAkTU9ERSA9IHN1YnN0cigkYXJnLCAxMik7CisgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDExKSA9PSAnLS1wcm90b2NvbD0nKSB7CisgICAgJFBST1RPID0gc3Vic3RyKCRhcmcsIDExKTsKKyAgfQorfQorCiAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0Jyk7CiAKICRzb2NrZXQgPSBuZXcgVFNvY2tldCgkaG9zdCwgJHBvcnQpOwpAQCAtNzIsMTggKzEwNiwyOSBAQAogCiBpZiAoJE1PREUgPT0gJ2lubGluZScpIHsKICAgJHRyYW5zcG9ydCA9ICRzb2NrZXQ7Ci0gICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3RDbGllbnQoJHRyYW5zcG9ydCk7CisgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHRyYW5zcG9ydCk7Cit9IGVsc2UgaWYgKCRNT0RFID09ICdmcmFtZWQnKSB7CisgICRmcmFtZWRTb2NrZXQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCgkc29ja2V0KTsKKyAgJHRyYW5zcG9ydCA9ICRmcmFtZWRTb2NrZXQ7CisgICRwcm90b2NvbCA9IG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pOworICAkdGVzdENsaWVudCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CiB9IGVsc2UgewogICAkYnVmZmVyZWRTb2NrZXQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsIDEwMjQsIDEwMjQpOwogICAkdHJhbnNwb3J0ID0gJGJ1ZmZlcmVkU29ja2V0OwotICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAkdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CisgICRwcm90b2NvbCA9IG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pOworICAkdGVzdENsaWVudCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CiB9CiAKICR0cmFuc3BvcnQtPm9wZW4oKTsKIAogJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogCitkZWZpbmUoJ0VSUl9CQVNFVFlQRVMnLCAxKTsKK2RlZmluZSgnRVJSX1NUUlVDVFMnLCAyKTsKK2RlZmluZSgnRVJSX0NPTlRBSU5FUlMnLCA0KTsKK2RlZmluZSgnRVJSX0VYQ0VQVElPTlMnLCA4KTsKK2RlZmluZSgnRVJSX1VOS05PV04nLCA2NCk7CiskZXhpdGNvZGUgPSAwOwogLyoqCiAgKiBWT0lEIFRFU1QKICAqLwpAQCAtOTEsNDYgKzEzNiw2MyBAQAogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludF9yKCIgPSB2b2lkXG4iKTsKIAorZnVuY3Rpb24gcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAkbWV0aG9kLCAkdmFsdWUpIHsKKyAgZ2xvYmFsICRleGl0Y29kZTsKKyAgcHJpbnRfcigiJG1ldGhvZCgkdmFsdWUpIik7CisgICRyZXQgPSAkdGVzdENsaWVudC0+JG1ldGhvZCgkdmFsdWUpOworICBwcmludF9yKCIgPSBcIiRyZXRcIlxuIik7CisgIGlmICgkdmFsdWUgIT09ICRyZXQpIHsKKyAgICBwcmludF9yKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgIH0KK30KKwogLyoqCiAgKiBTVFJJTkcgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnRfcigiID0gXCIkc1wiXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RTdHJpbmcnLCAiVGVzdCIpOworCisvKioKKyAqIEJPT0wgVEVTVAorICovCityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIHRydWUpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJvb2wnLCBmYWxzZSk7CiAKIC8qKgogICogQllURSBURVNUCiAgKi8KLXByaW50X3IoInRlc3RCeXRlKDEpIik7Ci0kdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7Ci1wcmludF9yKCIgPSAkdThcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxMjcpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMTI4KTsKIAogLyoqCiAgKiBJMzIgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STMyKC0xKSIpOwotJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKLXByaW50X3IoIiA9ICRpMzJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsIC0xKTsKIAogLyoqCiAgKiBJNjQgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwotcHJpbnRfcigiID0gJGk2NFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMCk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIC0zNDM1OTczODM2OCk7CiAKIC8qKgogICogRE9VQkxFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKLSRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7Ci1wcmludF9yKCIgPSAkZHViXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3REb3VibGUnLCAtODUyLjIzNDIzNDIzNCk7CisKKy8qKgorICogQklOQVJZIFRFU1QgIC0tICBUT0RPCisgKi8KIAogLyoqCiAgKiBTVFJVQ1QgVEVTVAogICovCiBwcmludF9yKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLSRvdXQgPSBuZXcgWHRydWN0KCk7Ciskb3V0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgpOwogJG91dC0+c3RyaW5nX3RoaW5nID0gIlplcm8iOwogJG91dC0+Ynl0ZV90aGluZyA9IDE7CiAkb3V0LT5pMzJfdGhpbmcgPSAtMzsKQEAgLTE0MSwxMSArMjAzLDE2IEBACiAgICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbiAhPSAkb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTkVTVEVEIFNUUlVDVCBURVNUCiAgKi8KIHByaW50X3IoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOwotJG91dDIgPSBuZXcgWHRydWN0MigpOworJG91dDIgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0MigpOwogJG91dDItPmJ5dGVfdGhpbmcgPSAxOwogJG91dDItPnN0cnVjdF90aGluZyA9ICRvdXQ7CiAkb3V0Mi0+aTMyX3RoaW5nID0gNTsKQEAgLTE1OCw2ICsyMjUsMTEgQEAKICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn0sICIuCiAgICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKK2lmICgkaW4yICE9ICRvdXQyKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTUFQIFRFU1QKICAqLwpAQCAtMTkwLDM2ICsyNjIsNjkgQEAKIH0KIHByaW50X3IoIn1cbiIpOwogCitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKworJG1hcG91dCA9IGFycmF5KCk7Citmb3IgKCRpID0gMDsgJGkgPCAxMDsgJGkrKykgeworICAgICRtYXBvdXRbImtleSRpIl0gPSAidmFsJGkiOworfQorcHJpbnRfcigndGVzdFN0cmluZ01hcCh7Jyk7CiskZmlyc3QgPSB0cnVlOworZm9yZWFjaCAoJG1hcG91dCBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn0pIik7CiskbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZ01hcCgkbWFwb3V0KTsKK3ByaW50X3IoIiA9IHsiKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwaW4gYXMgJGtleSA9PiAkdmFsKSB7CisgIGlmICgkZmlyc3QpIHsKKyAgICAkZmlyc3QgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBwcmludF9yKCIsICIpOworICB9CisgIHByaW50X3IoIlwiJGtleVwiID0+IFwiJHZhbFwiIik7Cit9CitwcmludF9yKCJ9XG4iKTsKK2tzb3J0KCRtYXBpbik7CitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKwogLyoqCiAgKiBTRVQgVEVTVAogICovCiAkc2V0b3V0ID0gYXJyYXkoKTs7CiBmb3IgKCRpID0gLTI7ICRpIDwgMzsgKyskaSkgewotICAkc2V0b3V0IFtdPSAkaTsKKyAgJHNldG91dFskaV09IHRydWU7CiB9CiBwcmludF9yKCJ0ZXN0U2V0KHsiKTsKLSRmaXJzdCA9IHRydWU7Ci1mb3JlYWNoICgkc2V0b3V0IGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHNldG91dCkpOwogcHJpbnRfcigifSkiKTsKICRzZXRpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U2V0KCRzZXRvdXQpOwogcHJpbnRfcigiID0geyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRpbiBhcyAkdmFsKSB7Ci0gIGlmICgkZmlyc3QpIHsKLSAgICAkZmlyc3QgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9yKCIsICIpOwotICB9Ci0gIHByaW50X3IoJHZhbCk7Ci19CitlY2hvIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkc2V0aW4pKTsKIHByaW50X3IoIn1cbiIpOworLy8gT3JkZXIgb2Yga2V5cyBpbiBzZXQgZG9lcyBub3QgbWF0dGVyCitrc29ydCgkc2V0aW4pOworaWYgKCRzZXRvdXQgIT09ICRzZXRpbikgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBjb3JydXB0ZWQgYXJyYXkKK2lmICgkc2V0aW5bMl0gIT09ICRzZXRvdXRbMl0gfHwgaXNfaW50KCRzZXRpblsyXSkpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KIAogLyoqCiAgKiBMSVNUIFRFU1QKQEAgLTI1MSwyOSArMzU2LDUzIEBACiAgIHByaW50X3IoJHZhbCk7CiB9CiBwcmludF9yKCJ9XG4iKTsKK2lmICgkbGlzdGluICE9PSAkbGlzdG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIEVOVU0gVEVTVAogICovCiBwcmludF9yKCJ0ZXN0RW51bShPTkUpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKE51bWJlcno6Ok9ORSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6Ok9ORSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6Ok9ORSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiBwcmludF9yKCJ0ZXN0RW51bShUV08pIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKE51bWJlcno6OlRXTyk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRXTyk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRXTykgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiBwcmludF9yKCJ0ZXN0RW51bShUSFJFRSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6VEhSRUUpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUSFJFRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEZJVkUpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKE51bWJlcno6OkZJVkUpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6RklWRSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiBwcmludF9yKCJ0ZXN0RW51bShFSUdIVCkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpFSUdIVCk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIC8qKgogICogVFlQRURFRiBURVNUCkBAIC0yODEsNiArNDEwLDEwIEBACiBwcmludF9yKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CiAkdWlkID0gJHRlc3RDbGllbnQtPnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CiBwcmludF9yKCIgPSAkdWlkXG4iKTsKK2lmICgkdWlkICE9PSAzMDk4NTgyMzUwODI1MjMpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTI5NiwxMyArNDI5LDIxIEBACiAgIHByaW50X3IoIn0sICIpOwogfQogcHJpbnRfcigifVxuIik7CiskZXhwZWN0ZWRfbW0gPSBbCisgIC00ID0+IFstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMV0sCisgIDQgPT4gWzQgPT4gNCwgMyA9PiAzLCAyID0+IDIsIDEgPT4gMV0sCitdOworaWYgKCRtbSAhPSAkZXhwZWN0ZWRfbW0pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KIAogLyoqCiAgKiBJTlNBTklUWSBURVNUCiAgKi8KLSRpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKLSRpbnNhbmUtPnVzZXJNYXBbTnVtYmVyejo6RklWRV0gPSA1MDAwOwotJHRydWNrID0gbmV3IFh0cnVjdCgpOworJGluc2FuZSA9IG5ldyBcVGhyaWZ0VGVzdFxJbnNhbml0eSgpOworJGluc2FuZS0+dXNlck1hcFtcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFXSA9IDUwMDA7CiskdHJ1Y2sgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCk7CiAkdHJ1Y2stPnN0cmluZ190aGluZyA9ICJUcnVjayI7CiAkdHJ1Y2stPmJ5dGVfdGhpbmcgPSA4OwogJHRydWNrLT5pMzJfdGhpbmcgPSA4OwpAQCAtMzE3LDcgKzQ1OCw3IEBACiAgICAgcHJpbnRfcigiJGsyID0+IHsiKTsKICAgICAkdXNlck1hcCA9ICR2Mi0+dXNlck1hcDsKICAgICBwcmludF9yKCJ7Iik7Ci0gICAgaWYgKGlzX2FycmF5KCR1c2VybWFwKSkgeworICAgIGlmIChpc19hcnJheSgkdXNlck1hcCkpIHsKICAgICAgIGZvcmVhY2ggKCR1c2VyTWFwIGFzICRrMyA9PiAkdjMpIHsKICAgICAgICAgcHJpbnRfcigiJGszID0+ICR2MywgIik7CiAgICAgICB9CkBAIC0zNDcsMTAgKzQ4OCwyOSBAQAogdHJ5IHsKICAgJHRlc3RDbGllbnQtPnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CiAgIHByaW50X3IoIiAgdm9pZFxuRkFJTFVSRVxuIik7Ci19IGNhdGNoIChYY2VwdGlvbiAkeCkgeworICAkZXhpdGNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7Cit9IGNhdGNoIChcVGhyaWZ0VGVzdFxYY2VwdGlvbiAkeCkgewogICBwcmludF9yKCcgY2F1Z2h0IHhjZXB0aW9uICcuJHgtPmVycm9yQ29kZS4nOiAnLiR4LT5tZXNzYWdlLiJcbiIpOwogfQogCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIFRIUklGVC00MjYzCitwcmludF9yKCJ0ZXN0QmluYXJ5U2VyaWFsaXplcl9EZXNlcmlhbGl6ZSgnZm9vJykiKTsKK3RyeSB7CisgIFxUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoYmFzZTY0X2RlY29kZSgnZm9vJyksIFxUaHJpZnRUZXN0XFh0cnVjdDI6OmNsYXNzKTsKKyAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfSBjYXRjaCAoXFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbiAkaGFwcHlfZXhjZXB0aW9uKSB7CisgIC8vIFdlIGV4cGVjdGVkIHRoaXMgZHVlIHRvIGJpbmFyeSBkYXRhIG9mIGJhc2U2NF9kZWNvZGUoJ2ZvbycpIGlzIGxlc3MgdGhlbiA0CisgIC8vIGJ5dGVzIGFuZCBpdCB0cmllcyB0byBmaW5kIHRocmlmdCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgdHJhbnNwb3J0IGJ5CisgIC8vIHJlYWRpbmcgaTMyKCkgYXQgdGhlIGJlZ2lubmluZy4gIENhc3RpbmcgdG8gc3RyaW5nIHZhbGlkYXRlcyB0aGF0CisgIC8vIGV4Y2VwdGlvbiBpcyBzdGlsbCBhY2Nlc3NpYmxlIGluIG1lbW9yeSBhbmQgbm90IGNvcnJ1cHRlZC4gIFdpdGhvdXQgcGF0Y2gsCisgIC8vIFBIUCB3aWxsIGVycm9yIGxvZyB0aGF0IHRoZSBleGNlcHRpb24gZG9lc24ndCBoYXZlIGFueSB0b3N0cmluZyBtZXRob2QsCisgIC8vIHdoaWNoIGlzIGEgbGllIGR1ZSB0byBjb3JydXB0ZWQgbWVtb3J5LgorICBmb3IoJGk9OTk7ICRpID4gMDsgJGktLSkgeworICAgIChzdHJpbmcpJGhhcHB5X2V4Y2VwdGlvbjsKKyAgfQorICBwcmludF9yKCIgIFNVQ0NFU1NcbiIpOworfQogCiAvKioKICAqIE5vcm1hbCB0ZXN0cyBkb25lLgpAQCAtMzY0LDM1ICs1MjQsMzQgQEAKICAqIEV4dHJhbmVvdXMgIkkgZG9uJ3QgdHJ1c3QgUEhQIHRvIHBhY2svdW5wYWNrIGludGVnZXIiIHRlc3RzCiAgKi8KIAoraWYgKCRwcm90b2NvbCBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSB7CisgICAgLy8gUmVncmVzc2lvbiBjaGVjazogY2hlY2sgdGhhdCBtZXRob2QgbmFtZSBpcyBub3QgZG91YmxlLWZyZWVkCisgICAgLy8gTWV0aG9kIG5hbWUgc2hvdWxkIG5vdCBiZSBhbiBpbnRlcm5lZCBzdHJpbmcuCisgICAgJG1ldGhvZF9uYW1lID0gIlZvaWQiOworICAgICRtZXRob2RfbmFtZSA9ICJ0ZXN0JG1ldGhvZF9uYW1lIjsKKworICAgICRzZXFpZCA9IDA7CisgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRtZXRob2RfbmFtZSwgXFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICRzZXFpZCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOworICAgICR0ZXN0Q2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisKK30KKwogLy8gTWF4IEkzMgogJG51bSA9IHBvdygyLCAzMCkgKyAocG93KDIsIDMwKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNaW4gSTMyCiAkbnVtID0gMCAtIHBvdygyLCAzMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1heCBJNjQKICRudW0gPSBwb3coMiwgNjIpICsgKHBvdygyLCA2MikgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogLy8gTWluIEk2NAotJG51bSA9IDAgLSBwb3coMiwgNjMpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorJG51bSA9IDAgLSBwb3coMiwgNjIpIC0gcG93KDIsIDYyKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLXJldHVybjsKLQotPz4KK2V4aXQoJGV4aXRjb2RlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaSBiL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjliYjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCkBAIC0wLDAgKzEsMiBAQAorZXh0ZW5zaW9uPXRocmlmdF9wcm90b2NvbC5zbworZXh0ZW5zaW9uPXNvY2tldHMuc28KZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU2ODBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKwordGhyaWZ0X2dlbjogLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweTp0b3JuYWRvIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLi4vU21hbGxUZXN0LnRocmlmdAorCitjaGVjazogdGhyaWZ0X2dlbgorCS4vdGVzdF9zdWl0ZS5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tcHkudG9ybmFkbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZyBiL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ODdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcKQEAgLTAsMCArMSwzIEBACitbZmxha2U4XQoraWdub3JlID0gRTQwMgorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weSBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ0N2ZkZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQpAQCAtMCwwICsxLDIzNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworYmFzZXBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK3N5cy5wYXRoLmluc2VydCgwLCBiYXNlcGF0aCArICcvZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpKVswXSkKKwordHJ5OgorICAgIF9faW1wb3J0X18oJ3Rvcm5hZG8nKQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50KCJtb2R1bGUgYHRvcm5hZG9gIG5vdCBmb3VuZCwgc2tpcHBpbmcgdGVzdCIpCisgICAgc3lzLmV4aXQoMCkKKworZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KK2Zyb20gdG9ybmFkby50ZXN0aW5nIGltcG9ydCBBc3luY1Rlc3RDYXNlLCBnZXRfdW51c2VkX3BvcnQsIGdlbl90ZXN0CisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Citmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYY2VwdGlvbiwgWHRydWN0CisKKworY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9pbnN0YW5jZSk6CisgICAgICAgIHNlbGYudGVzdF9pbnN0YW5jZSA9IHRlc3RfaW5zdGFuY2UKKworICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ3VuZXhwZWN0ZWRfZXJyb3InOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHMpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CisgICAgICAgIHJldHVybiBiCisKKyAgICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgorICAgICAgICByZXR1cm4gaTE2CisKKyAgICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gaTMyCisKKyAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgorICAgICAgICByZXR1cm4gaTY0CisKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICByZXR1cm4gZHViCisKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHMpOgorICAgICAgICBpZiBzID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICB4ID0gWGNlcHRpb24oKQorICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxCisgICAgICAgICAgICB4Lm1lc3NhZ2UgPSBzCisgICAgICAgICAgICByYWlzZSB4CisgICAgICAgIGVsaWYgcyA9PSAndGhyb3dfdW5kZWNsYXJlZCc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0ZXN0aW5nIHVuZGVjbGFyZWQgZXhjZXB0aW9uJykKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgorICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCisKKyAgICAgICAgZGVmIGZpcmVfb25ld2F5KCk6CisgICAgICAgICAgICBlbmQgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLnN0b3AoKHN0YXJ0LCBlbmQsIHNlY29uZHMpKQorCisgICAgICAgIHNlbGYudGVzdF9pbnN0YW5jZS5pb19sb29wLmFkZF90aW1lb3V0KAorICAgICAgICAgICAgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9c2Vjb25kcyksCisgICAgICAgICAgICBmaXJlX29uZXdheSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd0ZXN0aW5nIGV4Y2VwdGlvbiBpbiBvbmV3YXkgbWV0aG9kJykKKworICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIHlpZWxkIGdlbi5tb21lbnQKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybih0aGluZykKKworICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdExpc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKworY2xhc3MgVGhyaWZ0VGVzdENhc2UoQXN5bmNUZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUaHJpZnRUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorCisgICAgICAgIHNlbGYucG9ydCA9IGdldF91bnVzZWRfcG9ydCgpCisKKyAgICAgICAgIyBzZXJ2ZXIKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gVGVzdEhhbmRsZXIoc2VsZikKKyAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihzZWxmLmhhbmRsZXIpCisgICAgICAgIHNlbGYucGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBUVG9ybmFkby5UVG9ybmFkb1NlcnZlcihzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSwgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIHNlbGYuc2VydmVyLmJpbmQoc2VsZi5wb3J0KQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgxKQorCisgICAgICAgICMgY2xpZW50CisgICAgICAgIHRyYW5zcG9ydCA9IFRUb3JuYWRvLlRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQsIGlvX2xvb3A9c2VsZi5pb19sb29wKQorICAgICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgc2VsZi5pb19sb29wLnJ1bl9zeW5jKHRyYW5zcG9ydC5vcGVuKQorICAgICAgICBzZWxmLmNsaWVudCA9IFRocmlmdFRlc3QuQ2xpZW50KHRyYW5zcG9ydCwgcGZhY3RvcnkpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF92b2lkKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFZvaWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIE5vbmUpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsICdQeXRob24nKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDYzKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfaTMyKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAtMSkKKworICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDApCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9pNjQoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAtMzQzNTk3MzgzNjgpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAtNS4yMzUwOTgyMzUpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHguaTMyX3RoaW5nID0gLTMKKyAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQorICAgICAgICB5ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICJaZXJvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmJ5dGVfdGhpbmcsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pMzJfdGhpbmcsIC0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTY0X3RoaW5nLCAtNSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X29uZXdheShzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKQorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAtMSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3RIYW5kbGVyLnRlc3RNYXAgaXMgYSBjb3JvdXRpbmUsIHRoaXMgdGVzdCBjaGVja3MgaWYgZ2VuLlJldHVybigpIGZyb20gYSBjb3JvdXRpbmUgd29ya3MuCisgICAgICAgICIiIgorICAgICAgICBleHBlY3RlZCA9IHsxOiAxfQorICAgICAgICByZXMgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0TWFwKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgZXhwZWN0ZWQpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCd0aHJvd191bmRlY2xhcmVkJykKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUaHJpZnRUZXN0Q2FzZSkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5UZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0nc3VpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtIGIvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTkwOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RSSUFMID89IHRyaWFsCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9TbWFsbFRlc3QudGhyaWZ0CisKK2NoZWNrOiBzdHVicworCSQoVFJJQUwpIC4vdGVzdF9zdWl0ZS5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tcHkudHdpc3RlZApkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZyBiL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ODdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcKQEAgLTAsMCArMSwzIEBACitbZmxha2U4XQoraWdub3JlID0gRTQwMgorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weSBiL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAyZWI3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQpAQCAtMCwwICsxLDE5OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihiYXNlcGF0aCwgJ2dlbi1weS50d2lzdGVkJykpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpKVswXSkKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24KKworZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Citmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYY2VwdGlvbiwgWHRydWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKK2Zyb20gdHdpc3RlZC50cmlhbCBpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIsIHJlYWN0b3IKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgorCitmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRlcgorCisKK0BpbXBsZW1lbnRlcihUaHJpZnRUZXN0LklmYWNlKQorY2xhc3MgVGVzdEhhbmRsZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm9uZXdheXNRdWV1ZSA9IGRlZmVyLkRlZmVycmVkUXVldWUoKQorCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBpMTYKKworICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBpMzIKKworICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBpNjQKKworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHggPSBYY2VwdGlvbigpCisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDEKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKKyAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgZWxpZiBzID09ICJ0aHJvd191bmRlY2xhcmVkIjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZvbyIpCisKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgZGVmIGZpcmVPbmV3YXkodCk6CisgICAgICAgICAgICBzZWxmLm9uZXdheXNRdWV1ZS5wdXQoKHQsIHRpbWUudGltZSgpLCBzZWNvbmRzKSkKKyAgICAgICAgcmVhY3Rvci5jYWxsTGF0ZXIoc2Vjb25kcywgZmlyZU9uZXdheSwgdGltZS50aW1lKCkpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJykKKworICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdExpc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKworY2xhc3MgVGhyaWZ0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKKyAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICAgICAgMCwgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKKworICAgICAgICBzZWxmLnBvcnRObyA9IHNlbGYuc2VydmVyLmdldEhvc3QoKS5wb3J0CisKKyAgICAgICAgc2VsZi50eGNsaWVudCA9IHlpZWxkIENsaWVudENyZWF0b3IocmVhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKKyAgICAgICAgc2VsZi5jbGllbnQgPSBzZWxmLnR4Y2xpZW50LmNsaWVudAorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgeWllbGQgc2VsZi5zZXJ2ZXIuc3RvcExpc3RlbmluZygpCisgICAgICAgIHNlbGYudHhjbGllbnQudHJhbnNwb3J0Lmxvc2VDb25uZWN0aW9uKCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpKSwgTm9uZSkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpKSwgJ1B5dGhvbicpCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3RCeXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpKSwgNjMpCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigwKSksIDApCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3RJNjQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCkpLCAtMzQzNTk3MzgzNjgpCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSkpLCAtNS4yMzUwOTgyMzUpCisKKyAgICAjIFRPRE86IGRlZiB0ZXN0QmluYXJ5KHNlbGYpIC4uLgorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4LmkzMl90aGluZyA9IC0zCisgICAgICAgIHguaTY0X3RoaW5nID0gLTUKKyAgICAgICAgeSA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJ1Y3QoeCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5LmJ5dGVfdGhpbmcsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuaTMyX3RoaW5nLCAtMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeS5pNjRfdGhpbmcsIC01KQorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguZXJyb3JDb2RlLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oInRocm93X3VuZGVjbGFyZWQiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmKToKKyAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKQorICAgICAgICBzdGFydCwgZW5kLCBzZWNvbmRzID0geWllbGQgc2VsZi5oYW5kbGVyLm9uZXdheXNRdWV1ZS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscyhzZWNvbmRzLCAoZW5kIC0gc3RhcnQpLCBwbGFjZXM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpKSwgLTEpCmRpZmYgLS1naXQgYS90ZXN0L3B5L0NNYWtlTGlzdHMudHh0IGIvdGVzdC9weS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMyMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworYWRkX3Rlc3QoTkFNRSBweXRob25fdGVzdF9nZW5lcmF0ZQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfQorICAgICAgICAgICAgLURUSFJJRlRDT01QSUxFUj0kPFRBUkdFVF9GSUxFOnRocmlmdC1jb21waWxlcj4KKyAgICAgICAgICAgIC1ETVlfUFJPSkVDVF9ESVI9JHtQUk9KRUNUX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAtRE1ZX0NVUlJFTlRfU09VUkNFX0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9CSU5BUllfRElSPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIC1QICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZW5lcmF0ZS5jbWFrZQorKQorCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0CisgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vUnVuQ2xpZW50U2VydmVyLnB5IC0tZ2VuLWJhc2U9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgREVQRU5EUyBweXRob25fdGVzdF9nZW5lcmF0ZQorICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorKQorCmRpZmYgLS1naXQgYS90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWMwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weQpAQCAtMCwwICsxLDI1NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityIiIiCitQWVRIT05QQVRIPS4vZ2VuLXB5Oi4uLy4uL2xpYi9weS9idWlsZC9saWIuLi4gLi9GYXN0YmluYXJ5VGVzdC5weQorIiIiCisKKyMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZWl0CisKK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBCYWNrd2FyZHMsIEJvbmssIEVtcHR5LCBIb2x5TW9sZXksIE9uZU9mRWFjaCwgUmFuZG9tU3R1ZmYsIFdyYXBwZXIKKworCitjbGFzcyBURGV2TnVsbFRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKworb29lMSA9IE9uZU9mRWFjaCgpCitvb2UxLmltX3RydWUgPSBUcnVlCitvb2UxLmltX2ZhbHNlID0gRmFsc2UKK29vZTEuYV9iaXRlID0gMHhkNgorb29lMS5pbnRlZ2VyMTYgPSAyNzAwMAorb29lMS5pbnRlZ2VyMzIgPSAxIDw8IDI0Citvb2UxLmludGVnZXI2NCA9IDYwMDAgKiAxMDAwICogMTAwMAorb29lMS5kb3VibGVfcHJlY2lzaW9uID0gbWF0aC5waQorb29lMS5zb21lX2NoYXJhY3RlcnMgPSAiRGVidWcgVEhJUyEiCitvb2UxLnpvbWdfdW5pY29kZSA9IHUiXHhkN1xuXGFcdCIKKworb29lMiA9IE9uZU9mRWFjaCgpCitvb2UyLmludGVnZXIxNiA9IDE2Citvb2UyLmludGVnZXIzMiA9IDMyCitvb2UyLmludGVnZXI2NCA9IDY0Citvb2UyLmRvdWJsZV9wcmVjaXNpb24gPSAobWF0aC5zcXJ0KDUpICsgMSkgLyAyCitvb2UyLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIgorb29lMi56b21nX3VuaWNvZGUgPSB1Ilx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKKyAgICAgICAgICAgICAgICAgICAgdSJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKKyAgICAgICAgICAgICAgICAgICAgdSJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4YzdceDgzXHhlMlx4ODBceGJjIgorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUycpOgorICAgIG9vZTEuem9tZ191bmljb2RlID0gb29lMS56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKyAgICBvb2UyLnpvbWdfdW5pY29kZSA9IG9vZTIuem9tZ191bmljb2RlLmVuY29kZSgndXRmOCcpCisKK2htID0gSG9seU1vbGV5KCoqeyJiaWciOiBbXSwgImNvbnRhaW4iOiBzZXQoKSwgImJvbmtzIjoge319KQoraG0uYmlnLmFwcGVuZChvb2UxKQoraG0uYmlnLmFwcGVuZChvb2UyKQoraG0uYmlnWzBdLmFfYml0ZSA9IDB4MjIKK2htLmJpZ1sxXS5hX2JpdGUgPSAweDIyCisKK2htLmNvbnRhaW4uYWRkKCgiYW5kIGEgb25lIiwgImFuZCBhIHR3byIpKQoraG0uY29udGFpbi5hZGQoKCJ0aGVuIGEgb25lLCB0d28iLCAidGhyZWUhIiwgIkZPVVIhIikpCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUycpOgorICAgIGhtLmNvbnRhaW4uYWRkKCh1Ilx4ZDdcblxhXHQiLmVuY29kZSgndXRmOCcpLCkpCitlbHNlOgorICAgIGhtLmNvbnRhaW4uYWRkKCh1Ilx4ZDdcblxhXHQiLCkpCitobS5jb250YWluLmFkZCgoKSkKKworaG0uYm9ua3NbIm5vdGhpbmciXSA9IFtdCitobS5ib25rc1sic29tZXRoaW5nIl0gPSBbCisgICAgQm9uaygqKnsidHlwZSI6IDEsICJtZXNzYWdlIjogIldhaXQuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiAyLCAibWVzc2FnZSI6ICJXaGF0PyJ9KSwKK10KK2htLmJvbmtzWyJwb2UiXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMywgIm1lc3NhZ2UiOiAicXVvdGgifSksCisgICAgQm9uaygqKnsidHlwZSI6IDQsICJtZXNzYWdlIjogInRoZSByYXZlbiJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNSwgIm1lc3NhZ2UiOiAibmV2ZXJtb3JlIn0pLAorXQorCitycyA9IFJhbmRvbVN0dWZmKCkKK3JzLmEgPSAxCitycy5iID0gMgorcnMuYyA9IDMKK3JzLm15aW50bGlzdCA9IGxpc3QocmFuZ2UoMjApKQorcnMubWFwcyA9IHsxOiBXcmFwcGVyKCoqeyJmb28iOiBFbXB0eSgpfSksIDI6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KX0KK3JzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNQorcnMudHJpcGxlID0gMy4xNAorCisjIG1ha2Ugc3VyZSB0aGlzIHNwbGl0cyB0d28gYnVmZmVycyBpbiBhIGJ1ZmZlcmVkIHByb3RvY29sCityc2h1Z2UgPSBSYW5kb21TdHVmZigpCityc2h1Z2UubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgxMDAwMCkpCisKK215X3plcm8gPSBTcnYuSmFua3lfcmVzdWx0KCoqeyJzdWNjZXNzIjogNX0pCisKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYXN0LCBzbG93KToKKyAgICAgICAgc2VsZi5fZmFzdCA9IGZhc3QKKyAgICAgICAgc2VsZi5fc2xvdyA9IHNsb3cKKworICAgIGRlZiBfY2hlY2tfd3JpdGUoc2VsZiwgbyk6CisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGlmIE9SSUcgIT0gTUlORToKKyAgICAgICAgICAgIHByaW50KCJhY3R1YWwgIDogJXNcbmV4cGVjdGVkOiAlcyIgJSAocmVwcihNSU5FKSwgcmVwcihPUklHKSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3dyaXRlIHZhbHVlIG1pc21hdGNoJykKKworICAgIGRlZiBfY2hlY2tfcmVhZChzZWxmLCBvKToKKyAgICAgICAgcHJvdCA9IHNlbGYuX3Nsb3coVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCisgICAgICAgIG8ud3JpdGUocHJvdCkKKworICAgICAgICBzbG93X3ZlcnNpb25fYmluYXJ5ID0gcHJvdC50cmFucy5nZXR2YWx1ZSgpCisKKyAgICAgICAgcHJvdCA9IHNlbGYuX2Zhc3QoCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICAgICAgcHJvdCA9IHNlbGYuX2Zhc3QoCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgYyA9IG8uX19jbGFzc19fKCkKKyAgICAgICAgYy5yZWFkKHByb3QpCisgICAgICAgIGlmIGMgIT0gbzoKKyAgICAgICAgICAgIHByaW50KCJhY3R1YWwgIDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKGMpKQorICAgICAgICAgICAgcHJpbnQoImV4cGVjdGVkOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3JlYWQgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIGRvX3Rlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKEhvbHlNb2xleSgpKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKEhvbHlNb2xleSgpKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKGhtKQorICAgICAgICBub19zZXQgPSBkZWVwY29weShobSkKKyAgICAgICAgbm9fc2V0LmNvbnRhaW4gPSBzZXQoKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKG5vX3NldCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChobSkKKworICAgICAgICBzZWxmLl9jaGVja193cml0ZShycykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChycykKKworICAgICAgICBzZWxmLl9jaGVja193cml0ZShyc2h1Z2UpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQocnNodWdlKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKG15X3plcm8pCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobXlfemVybykKKworICAgICAgICBzZWxmLl9jaGVja19yZWFkKEJhY2t3YXJkcygqKnsiZmlyc3RfdGFnMiI6IDQsICJzZWNvbmRfdGFnMSI6IDJ9KSkKKworICAgICAgICAjIE9uZSBjYXNlIHdoZXJlIHRoZSBzZXJpYWxpemVkIGZvcm0gY2hhbmdlcywgYnV0IG9ubHkgc3VwZXJmaWNpYWxseS4KKyAgICAgICAgbyA9IEJhY2t3YXJkcygqKnsiZmlyc3RfdGFnMiI6IDQsICJzZWNvbmRfdGFnMSI6IDJ9KQorICAgICAgICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3RfZmFzdCA9IHNlbGYuX2Zhc3QodHJhbnNfZmFzdCwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIHByb3Rfc2xvdyA9IHNlbGYuX3Nsb3codHJhbnNfc2xvdykKKworICAgICAgICBvLndyaXRlKHByb3RfZmFzdCkKKyAgICAgICAgby53cml0ZShwcm90X3Nsb3cpCisgICAgICAgIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKKyAgICAgICAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQorICAgICAgICBhc3NlcnQgaWQoT1JJRykgIT0gaWQoTUlORSkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIG8ud3JpdGUocHJvdCkKKyAgICAgICAgcHJvdCA9IHNlbGYuX3Nsb3coCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIocHJvdC50cmFucy5nZXR2YWx1ZSgpKSkKKyAgICAgICAgYyA9IG8uX19jbGFzc19fKCkKKyAgICAgICAgYy5yZWFkKHByb3QpCisgICAgICAgIGlmIGMgIT0gbzoKKyAgICAgICAgICAgIHByaW50KCJjb3B5OiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgib3JpZzogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorCisKK2RlZiBkb190ZXN0KGZhc3QsIHNsb3cpOgorICAgIFRlc3QoZmFzdCwgc2xvdykuZG9fdGVzdCgpCisKKworZGVmIGRvX2JlbmNobWFyayhwcm90b2NvbCwgaXRlcnM9NTAwMCwgc2tpcF9zbG93PUZhbHNlKToKKyAgICBzZXR1cCA9ICIiIgorZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wuezB9IGltcG9ydCB7MH17MX0KK3RyYW5zID0gVERldk51bGxUcmFuc3BvcnQoKQorcHJvdCA9IHswfXsxfSh0cmFuc3syfSkKKyIiIgorCisgICAgc2V0dXBfZmFzdCA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJ0FjY2VsZXJhdGVkJywgJywgZmFsbGJhY2s9RmFsc2UnKQorICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHNldHVwX3Nsb3cgPSBzZXR1cC5mb3JtYXQocHJvdG9jb2wsICcnLCAnJykKKworICAgIHByaW50KCJTdGFydGluZyBCZW5jaG1hcmtzIikKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJQorICAgICAgICAgICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykpCisKKyAgICBwcmludCgiSG9seU1vbGV5IEFjY2VsZXIuID0gJWYiICUKKyAgICAgICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykpCisKKyAgICBpZiBub3Qgc2tpcF9zbG93OgorICAgICAgICBwcmludCgiRmFzdFN0cnVjdCBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUKKyAgICAgICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludCgnVGVzdGluZyBUQmluYXJ5QWNjZWxlcmF0ZWQnKQorICAgIGRvX3Rlc3QoVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsIFRCaW5hcnlQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RCaW5hcnlQcm90b2NvbCcpCisgICAgcHJpbnQoJ1Rlc3RpbmcgVENvbXBhY3RBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsIFRDb21wYWN0UHJvdG9jb2wpCisgICAgZG9fYmVuY2htYXJrKCdUQ29tcGFjdFByb3RvY29sJykKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0gYi90ZXN0L3B5L01ha2VmaWxlLmFtCmluZGV4IDYzYjdhODkuLjgyOTYyMDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9weS9NYWtlZmlsZS5hbQpAQCAtMTYsMzMgKzE2LDgyIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKLVRIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1weV91bml0X3Rlc3RzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFNlcmlhbGl6YXRpb25UZXN0LnB5ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFRlc3RFb2YucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFRlc3RTeW50YXgucHkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJ1bkNsaWVudFNlcnZlci5weQorcHlfdW5pdF90ZXN0cyA9IFJ1bkNsaWVudFNlcnZlci5weQogCiB0aHJpZnRfZ2VuID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weQorICAgICAgICBnZW4tcHkvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1zbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1zbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1zbG90cy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9UaHJpZnRUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1keW5hbWljL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9SZWN1cnNpdmUvX19pbml0X18ucHkKKworCitwcmVjcm9zczogJCh0aHJpZnRfZ2VuKQorQlVJTFRfU09VUkNFUyA9ICQodGhyaWZ0X2dlbikKIAogaGVscGVyX3NjcmlwdHM9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUZXN0Q2xpZW50LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUZXN0U2VydmVyLnB5CiAKIGNoZWNrX1NDUklQVFM9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJCh0aHJpZnRfZ2VuKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJCh0aHJpZnRfZ2VuKSBcCiAgICAgICAgICQocHlfdW5pdF90ZXN0cykgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICQoaGVscGVyX3NjcmlwdHMpCiAKIFRFU1RTPSAkKHB5X3VuaXRfdGVzdHMpCiAKIAotZ2VuLXB5LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIHB5ICQ8CitnZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHB5ICAkPAorCitnZW4tcHktZGVmYXVsdC8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1kZWZhdWx0IHx8ICQoTUtESVJfUCkgZ2VuLXB5LWRlZmF1bHQKKwkkKFRIUklGVCkgLS1nZW4gcHkgLW91dCBnZW4tcHktZGVmYXVsdCAkPAorCitnZW4tcHktc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktc2xvdHMgfHwgJChNS0RJUl9QKSBnZW4tcHktc2xvdHMKKwkkKFRIUklGVCkgLS1nZW4gcHk6c2xvdHMgLW91dCBnZW4tcHktc2xvdHMgJDwKKworZ2VuLXB5LW9sZHN0eWxlLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LW9sZHN0eWxlIHx8ICQoTUtESVJfUCkgZ2VuLXB5LW9sZHN0eWxlCisJJChUSFJJRlQpIC0tZ2VuIHB5Om9sZF9zdHlsZSAtb3V0IGdlbi1weS1vbGRzdHlsZSAkPAorCitnZW4tcHktbm9fdXRmOHN0cmluZ3MvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgfHwgJChNS0RJUl9QKSBnZW4tcHktbm9fdXRmOHN0cmluZ3MKKwkkKFRIUklGVCkgLS1nZW4gcHk6bm9fdXRmOHN0cmluZ3MgLW91dCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgJDwKKworZ2VuLXB5LWR5bmFtaWMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pYyB8fCAkKE1LRElSX1ApIGdlbi1weS1keW5hbWljCisJJChUSFJJRlQpIC0tZ2VuIHB5OmR5bmFtaWMgLW91dCBnZW4tcHktZHluYW1pYyAkPAorCitnZW4tcHktZHluYW1pY3Nsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LWR5bmFtaWNzbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1keW5hbWljc2xvdHMKKwkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyxzbG90cyAtb3V0IGdlbi1weS1keW5hbWljc2xvdHMgJDwKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXB5CisJJChSTSkgLXIgZ2VuLXB5IGdlbi1weS1zbG90cyBnZW4tcHktZGVmYXVsdCBnZW4tcHktb2xkc3R5bGUgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzIGdlbi1weS1keW5hbWljIGdlbi1weS1keW5hbWljc2xvdHMKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKaW5kZXggMmJkNjA5NC4uNTZhNDA4ZSAxMDA3NTUKLS0tIGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKQEAgLTE5LDQyICsxOSwzMDUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCB0aW1lCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgY29weQogaW1wb3J0IG9zCiBpbXBvcnQgc2lnbmFsCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKKworU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCitTQ1JJUFRTID0gWworICAgICdGYXN0YmluYXJ5VGVzdC5weScsCisgICAgJ1Rlc3RGcm96ZW4ucHknLAorICAgICdUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHknLAorICAgICdUU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weScsCisgICAgJ1NlcmlhbGl6YXRpb25UZXN0LnB5JywKKyAgICAnVGVzdEVvZi5weScsCisgICAgJ1Rlc3RTeW50YXgucHknLAorICAgICdUZXN0U29ja2V0LnB5JywKK10KK0ZSQU1FRCA9IFsiVE5vbmJsb2NraW5nU2VydmVyIl0KK1NLSVBfWkxJQiA9IFsnVE5vbmJsb2NraW5nU2VydmVyJywgJ1RIdHRwU2VydmVyJ10KK1NLSVBfU1NMID0gWydUSHR0cFNlcnZlciddCitFWFRSQV9ERUxBWSA9IGRpY3QoVFByb2Nlc3NQb29sU2VydmVyPTUuNSkKKworUFJPVE9TID0gWworICAgICdhY2NlbCcsCisgICAgJ2FjY2VsYycsCisgICAgJ2JpbmFyeScsCisgICAgJ2NvbXBhY3QnLAorICAgICdqc29uJywKKyAgICAnaGVhZGVyJywKK10KKworCitkZWYgZGVmYXVsdF9zZXJ2ZXJzKCk6CisgICAgc2VydmVycyA9IFsKKyAgICAgICAgJ1RTaW1wbGVTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZGVkU2VydmVyJywKKyAgICAgICAgJ1RUaHJlYWRQb29sU2VydmVyJywKKyAgICAgICAgJ1ROb25ibG9ja2luZ1NlcnZlcicsCisgICAgICAgICdUSHR0cFNlcnZlcicsCisgICAgXQorICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCisgICAgICAgIHNlcnZlcnMuYXBwZW5kKCdURm9ya2luZ1NlcnZlcicpCisgICAgcmV0dXJuIHNlcnZlcnMKKwogCiBkZWYgcmVsZmlsZShmbmFtZSk6Ci0gICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBmbmFtZSkKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIGZuYW1lKQogCi1GUkFNRUQgPSBbIlROb25ibG9ja2luZ1NlcnZlciJdCiAKLWRlZiBydW5UZXN0KHNlcnZlcl9jbGFzcyk6Ci0gICAgcHJpbnQgIlRlc3RpbmcgIiwgc2VydmVyX2NsYXNzCi0gICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCJUZXN0U2VydmVyLnB5IiksIHNlcnZlcl9jbGFzc10pCi0gICAgdGltZS5zbGVlcCgwLjI1KQorZGVmIHNldHVwX3B5cGF0aChsaWJkaXIsIGdlbmRpcik6CisgICAgZGlycyA9IFtsaWJkaXIsIGdlbmRpcl0KKyAgICBlbnYgPSBjb3B5LmRlZXBjb3B5KG9zLmVudmlyb24pCisgICAgcHlwYXRoID0gZW52LmdldCgnUFlUSE9OUEFUSCcsIE5vbmUpCisgICAgaWYgcHlwYXRoOgorICAgICAgICBkaXJzLmFwcGVuZChweXBhdGgpCisgICAgZW52WydQWVRIT05QQVRIJ10gPSBvcy5wYXRoc2VwLmpvaW4oZGlycykKKyAgICBpZiBnZW5kaXIuZW5kc3dpdGgoJ2dlbi1weS1ub191dGY4c3RyaW5ncycpOgorICAgICAgICBlbnZbJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJ10gPSAnMScKKyAgICByZXR1cm4gZW52CisKKworZGVmIHJ1blNjcmlwdFRlc3QobGliZGlyLCBnZW5iYXNlLCBnZW5weWRpciwgc2NyaXB0KToKKyAgICBlbnYgPSBzZXR1cF9weXBhdGgobGliZGlyLCBvcy5wYXRoLmpvaW4oZ2VuYmFzZSwgZ2VucHlkaXIpKQorICAgIHNjcmlwdF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKHNjcmlwdCldCisgICAgcHJpbnQoJ1xuVGVzdGluZyBzY3JpcHQ6ICVzXG4tLS0tJyAlICgnICcuam9pbihzY3JpcHRfYXJncykpKQorICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChzY3JpcHRfYXJncywgZW52PWVudikKKyAgICBpZiByZXQgIT0gMDoKKyAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1BZX0dFTjogJXMnICUgZ2VucHlkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1NDUklQVDogJXMnICUgc2NyaXB0LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQorCisKK2RlZiBydW5TZXJ2aWNlVGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzZXJ2ZXJfY2xhc3MsIHByb3RvLCBwb3J0LCB1c2VfemxpYiwgdXNlX3NzbCwgdmVyYm9zZSk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICAjIEJ1aWxkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBzZXJ2ZXJfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdFNlcnZlci5weScpXQorICAgIGNsaV9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0Q2xpZW50LnB5JyldCisgICAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICAjIGFjY2VsLCBiaW5hcnksIGNvbXBhY3Qgb3IganNvbgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAgIyBkZWZhdWx0IHRvIDkwOTAKKyAgICAgICAgaWYgdXNlX3psaWI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0temxpYicpCisgICAgICAgIGlmIHVzZV9zc2w6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAwOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctcScpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQorICAgICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCisgICAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9jbGFzcykKKyAgICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCisgICAgZWxzZToKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1idWZmZXJlZCcpCisgICAgaWYgc2VydmVyX2NsYXNzID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1odHRwPS8nKQorICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICBwcmludCgnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIGVudj1lbnYpCisKKyAgICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKKyAgICAgICAgaWYgc2VydmVycHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgoJ0ZBSUw6IFNlcnZlciBwcm9jZXNzICglcykgZmFpbGVkIHdpdGggcmV0Y29kZSAlZCcpCisgICAgICAgICAgICAgICAgICAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciBzdWJwcm9jZXNzICVzIGRpZWQsIGFyZ3M6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKworICAgICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCisgICAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCisgICAgbWF4X2F0dGVtcHRzID0gMTAwCisgICAgYXR0ZW1wdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dGVtcHQgKz0gMQorICAgICAgICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUZXN0U2VydmVyIG5vdCByZWFkeSBvbiBwb3J0ICVkIGFmdGVyICUuMmYgc2Vjb25kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpKQorICAgICAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgc29jazYuY2xvc2UoKQorCiAgICAgdHJ5OgotICAgICAgICBhcmd2ID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCJUZXN0Q2xpZW50LnB5IildCi0gICAgICAgIGlmIHNlcnZlcl9jbGFzcyBpbiBGUkFNRUQ6Ci0gICAgICAgICAgICBhcmd2LmFwcGVuZCgnLS1mcmFtZWQnKQotICAgICAgICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICAgICAgICAgIGFyZ3YuYXBwZW5kKCctLWh0dHA9LycpCi0gICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChhcmd2KQorICAgICAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdUZXN0aW5nIGNsaWVudDogJXMnICUgKCcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbGlfYXJncywgZW52PWVudikKICAgICAgICAgaWYgcmV0ICE9IDA6Ci0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInN1YnByb2Nlc3MgZmFpbGVkIikKKyAgICAgICAgICAgIHByaW50KCcqKiogRkFJTEVEICoqKicsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHByaW50KCdMSUJESVI6ICVzJyAlIGxpYmRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcHJpbnQoJ1BZX0dFTjogJXMnICUgZ2VucHlkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2xpZW50IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihjbGlfYXJncykpKQogICAgIGZpbmFsbHk6Ci0gICAgICAgICMgZml4bWU6IHNob3VsZCBjaGVjayB0aGF0IHNlcnZlciBkaWRuJ3QgZGllCi0gICAgICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZ25hbC5TSUdLSUxMKQorICAgICAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKKyAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCisgICAgICAgIGlmIGV4dHJhX3NsZWVwID4gMCBhbmQgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQnCisgICAgICAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCisgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsIHByb3RvLCB1c2VfemxpYiwgdXNlX3NzbCwgZXh0cmFfc2xlZXApKQorICAgICAgICAgICAgdGltZS5zbGVlcChleHRyYV9zbGVlcCkKKyAgICAgICAgc2lnID0gc2lnbmFsLlNJR0tJTEwgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnIGVsc2Ugc2lnbmFsLlNJR0FCUlQKKyAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnKQorICAgICAgICBzZXJ2ZXJwcm9jLndhaXQoKQogCi0gICAgIyB3YWl0IGZvciBzaHV0ZG93bgotICAgIHRpbWUuc2xlZXAoMSkKIAotbWFwKHJ1blRlc3QsIFsKLSAgIlRTaW1wbGVTZXJ2ZXIiLAotICAiVFRocmVhZGVkU2VydmVyIiwKLSAgIlRUaHJlYWRQb29sU2VydmVyIiwKLSAgIlRGb3JraW5nU2VydmVyIiwKLSAgIlROb25ibG9ja2luZ1NlcnZlciIsCi0gICJUSHR0cFNlcnZlciIsCi0gIF0pCitjbGFzcyBUZXN0Q2FzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuYmFzZSwgbGliZGlyLCBwb3J0LCBnZW5kaXJzLCBzZXJ2ZXJzLCB2ZXJib3NlKToKKyAgICAgICAgc2VsZi5nZW5iYXNlID0gZ2VuYmFzZQorICAgICAgICBzZWxmLmxpYmRpciA9IGxpYmRpcgorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5nZW5kaXJzID0gZ2VuZGlycworICAgICAgICBzZWxmLnNlcnZlcnMgPSBzZXJ2ZXJzCisKKyAgICBkZWYgZGVmYXVsdF9jb25mKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2dlbmRpcic6IHNlbGYuZ2VuZGlyc1swXSwKKyAgICAgICAgICAgICdzZXJ2ZXInOiBzZWxmLnNlcnZlcnNbMF0sCisgICAgICAgICAgICAncHJvdG8nOiBQUk9UT1NbMF0sCisgICAgICAgICAgICAnemxpYic6IEZhbHNlLAorICAgICAgICAgICAgJ3NzbCc6IEZhbHNlLAorICAgICAgICB9CisKKyAgICBkZWYgcnVuKHNlbGYsIGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICB3aXRoX3psaWIgPSBjb25mWyd6bGliJ10KKyAgICAgICAgd2l0aF9zc2wgPSBjb25mWydzc2wnXQorICAgICAgICB0cnlfc2VydmVyID0gY29uZlsnc2VydmVyJ10KKyAgICAgICAgdHJ5X3Byb3RvID0gY29uZlsncHJvdG8nXQorICAgICAgICBnZW5weWRpciA9IGNvbmZbJ2dlbmRpciddCisgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKKyAgICAgICAgaWYgd2l0aF96bGliIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfWkxJQjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgIGlmIHdpdGhfc3NsIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfU1NMOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICBydW5TZXJ2aWNlVGVzdChzZWxmLmxpYmRpciwgc2VsZi5nZW5iYXNlLCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBzZWxmLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wsIHNlbGYudmVyYm9zZSkKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB0ZXN0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgdmFsdWVzKToKKyAgICAgICAgdGVzdF9jb3VudCA9IDAKKyAgICAgICAgY29uZiA9IHNlbGYuZGVmYXVsdF9jb25mKCkKKyAgICAgICAgZm9yIHRyeV9zZXJ2ZXIgaW4gdmFsdWVzOgorICAgICAgICAgICAgY29uZltuYW1lXSA9IHRyeV9zZXJ2ZXIKKyAgICAgICAgICAgIGlmIHNlbGYucnVuKGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisgICAgZGVmIHJ1bl9hbGxfdGVzdHMoc2VsZik6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIGZvciBnZW5weWRpciBpbiBzZWxmLmdlbmRpcnM6CisgICAgICAgICAgICAgICAgZm9yIHRyeV9wcm90byBpbiBQUk9UT1M6CisgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3psaWIgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdpdGhfemxpYiBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1pMSUI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3NzbCBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpKQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1hbGwnLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSdhbGwnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxvbGRzdHlsZSxub191dGY4c3RyaW5ncyxkeW5hbWljLGR5bmFtaWNzbG90cycsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IGV4dGVuc2lvbnMgZm9yIGdlbmVyYXRlZCBjb2RlLCB1c2VkIGFzIHN1ZmZpeGVzIGZvciBcImdlbi1weS0qXCIgYWRkZWQgc3lzLnBhdGggZm9yIGluZGl2aWR1YWwgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwgZGVmYXVsdD05MDkwLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctTCcsICctLWxpYmRpcicsIGRlc3Q9ImxpYmRpciIsIGRlZmF1bHQ9bG9jYWxfbGlicGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW4tYmFzZScsIGRlc3Q9Imdlbl9iYXNlIiwgZGVmYXVsdD1TQ1JJUFRfRElSLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgZ2VuZXJhdGVkX2RpcnMgPSBbXQorICAgIGZvciBncF9kaXIgaW4gb3B0aW9ucy5nZW5weWRpcnMuc3BsaXQoJywnKToKKyAgICAgICAgZ2VuZXJhdGVkX2RpcnMuYXBwZW5kKCdnZW4tcHktJXMnICUgKGdwX2RpcikpCisKKyAgICAjIGNvbW1hbmRsaW5lIHBlcm1pdHMgYSBzaW5nbGUgY2xhc3MgbmFtZSB0byBiZSBzcGVjaWZpZWQgdG8gb3ZlcnJpZGUgU0VSVkVSUz1bLi4uXQorICAgIHNlcnZlcnMgPSBkZWZhdWx0X3NlcnZlcnMoKQorICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBhcmdzWzBdIGluIHNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJzID0gYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1VuYXZhaWxhYmxlIHNlcnZlciB0eXBlICIlcyIsIHBsZWFzZSBjaG9vc2Ugb25lIG9mOiAlcycgJSAoYXJnc1swXSwgc2VydmVycykpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgdGVzdHMgPSBUZXN0Q2FzZXMob3B0aW9ucy5nZW5fYmFzZSwgb3B0aW9ucy5saWJkaXIsIG9wdGlvbnMucG9ydCwgZ2VuZXJhdGVkX2RpcnMsIHNlcnZlcnMsIG9wdGlvbnMudmVyYm9zZSkKKworICAgICMgcnVuIHRlc3RzIHdpdGhvdXQgYSBjbGllbnQvc2VydmVyIGZpcnN0CisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIHByaW50KCcgRXhlY3V0aW5nIGluZGl2aWR1YWwgdGVzdCBzY3JpcHRzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgU2NyaXB0cyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oU0NSSVBUUykpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIGZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKKyAgICAgICAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgorICAgICAgICAgICAgcnVuU2NyaXB0VGVzdChvcHRpb25zLmxpYmRpciwgb3B0aW9ucy5nZW5fYmFzZSwgZ2VucHlkaXIsIHNjcmlwdCkKKworICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBDbGllbnQvU2VydmVyIHRlc3RzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBTZXJ2ZXJzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihzZXJ2ZXJzKSkKKyAgICBwcmludCgnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykpCisgICAgcHJpbnQoJyBQcm90b2NvbHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFBST1RPUykpCisgICAgcHJpbnQoJyBPcHRpb25zIHRvIGJlIHRlc3RlZDogWkxJQih5ZXMvbm8pLCBTU0woeWVzL25vKScpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorCisgICAgaWYgb3B0aW9ucy5hbGw6CisgICAgICAgIHRlc3RzLnJ1bl9hbGxfdGVzdHMoKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnZ2VuZGlyJywgZ2VuZXJhdGVkX2RpcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc2VydmVyJywgc2VydmVycykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdwcm90bycsIFBST1RPUykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCd6bGliJywgW0ZhbHNlLCBUcnVlXSkKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdzc2wnLCBbRmFsc2UsIFRydWVdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weSBiL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKaW5kZXggZTM3MDk4Yi4uZWY3OTgzNSAxMDA3NTUKLS0tIGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQorKysgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CkBAIC0xOSwxMzQgKzE5LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICgKKyAgICBCb25rLAorICAgIEJvb2xzLAorICAgIExhcmdlRGVsdGFzLAorICAgIExpc3RCb25rcywKKyAgICBOZXN0ZWRMaXN0c0JvbmssCisgICAgTmVzdGVkTGlzdHNJMzJ4MiwKKyAgICBOZXN0ZWRMaXN0c0kzMngzLAorICAgIE5lc3RlZE1peGVkeDIsCisgICAgTnVtYmVyeiwKKyAgICBWZXJzaW9uaW5nVGVzdFYxLAorICAgIFZlcnNpb25pbmdUZXN0VjIsCisgICAgWHRydWN0LAorICAgIFh0cnVjdDIsCispCiAKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjVHJlZQorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBSZWNMaXN0Citmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjMgorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBWZWN0b3JUZXN0Citmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHkKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQ29tcGFjdFByb3RvY29sLCBUSlNPTlByb3RvY29sCiBmcm9tIHRocmlmdC5UU2VyaWFsaXphdGlvbiBpbXBvcnQgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZQoraW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGltZQorCiAKIGNsYXNzIEFic3RyYWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgc2VsZi52MW9iaiA9IFZlcnNpb25pbmdUZXN0VjEoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAotICAgICAgICAgIGVuZF9pbl9ib3RoPTU0MzIxLAotICAgICAgICAgICkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG5ld2ludD0xLAotICAgICAgICAgIG5ld2J5dGU9MiwKLSAgICAgICAgICBuZXdzaG9ydD0zLAotICAgICAgICAgIG5ld2xvbmc9NCwKLSAgICAgICAgICBuZXdkb3VibGU9NS4wLAotICAgICAgICAgIG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9IkhlbGxvISIsIHR5cGU9MTIzKSwKLSAgICAgICAgICBuZXdsaXN0PVs3LDgsOV0sCi0gICAgICAgICAgbmV3c2V0PVs0MiwxLDhdLAotICAgICAgICAgIG5ld21hcD17MToyLDI6M30sCi0gICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgotICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICAgIG9iai53cml0ZShwcm90KQotICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5ib29scyA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIHNlbGYuYm9vbHNfZmxpcHBlZCA9IEJvb2xzKGltX3RydWU9RmFsc2UsIGltX2ZhbHNlPVRydWUpCiAKLSAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKLSAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQotICAgICAgcmV0ID0gb2JqdHlwZSgpCi0gICAgICByZXQucmVhZChwcm90KQotICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLmxhcmdlX2RlbHRhcyA9IExhcmdlRGVsdGFzKAorICAgICAgICAgICAgYjE9c2VsZi5ib29scywKKyAgICAgICAgICAgIGIxMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBiMTAwPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBjaGVja190cnVlPVRydWUsCisgICAgICAgICAgICBiMTAwMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBjaGVja19mYWxzZT1GYWxzZSwKKyAgICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAorICAgICAgICAgICAgYV9zZXQyNTAwPXNldChbJ2xhenknLCAnYnJvd24nLCAnY293J10pLAorICAgICAgICAgICAgdmVydHdvMzAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3NldD1zZXQoWzIsIDMsIDUsIDcsIDExXSkpLAorICAgICAgICAgICAgYmlnX251bWJlcnM9WzIgKiogOCwgMiAqKiAxNiwgMiAqKiAzMSAtIDEsIC0oMiAqKiAzMSAtIDEpXQorICAgICAgICApCiAKLSAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKLSAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCisgICAgICAgIHNlbGYuY29tcGFjdF9zdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KAorICAgICAgICAgICAgYV9ieXRlPTEyNywKKyAgICAgICAgICAgIGFfaTE2PTMyMDAwLAorICAgICAgICAgICAgYV9pMzI9MTAwMDAwMDAwMCwKKyAgICAgICAgICAgIGFfaTY0PTB4ZmZmZmZmZmZmZiwKKyAgICAgICAgICAgIGFfZG91YmxlPTUuNjc4OSwKKyAgICAgICAgICAgIGFfc3RyaW5nPSJteSBzdHJpbmciLAorICAgICAgICAgICAgdHJ1ZV9maWVsZD1UcnVlLAorICAgICAgICAgICAgZmFsc2VfZmllbGQ9RmFsc2UsCisgICAgICAgICAgICBlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSwKKyAgICAgICAgICAgIGJ5dGVfbGlzdD1bLTEyNywgLTEsIDAsIDEsIDEyN10sCisgICAgICAgICAgICBpMTZfbGlzdD1bLTEsIDAsIDEsIDB4N2ZmZl0sCisgICAgICAgICAgICBpMzJfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4N2ZmZmZmZmZdLAorICAgICAgICAgICAgaTY0X2xpc3Q9Wy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZmZmLCAweDdmZmZmZmZmZmZmZmZmZmZdLAorICAgICAgICAgICAgZG91YmxlX2xpc3Q9WzAuMSwgMC4yLCAwLjNdLAorICAgICAgICAgICAgc3RyaW5nX2xpc3Q9WyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiXSwKKyAgICAgICAgICAgIGJvb2xlYW5fbGlzdD1bVHJ1ZSwgVHJ1ZSwgVHJ1ZSwgRmFsc2UsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgICAgICBzdHJ1Y3RfbGlzdD1bRW1wdHkoKSwgRW1wdHkoKV0sCisgICAgICAgICAgICBieXRlX3NldD1zZXQoWy0xMjcsIC0xLCAwLCAxLCAxMjddKSwKKyAgICAgICAgICAgIGkxNl9zZXQ9c2V0KFstMSwgMCwgMSwgMHg3ZmZmXSksCisgICAgICAgICAgICBpMzJfc2V0PXNldChbMSwgMiwgM10pLAorICAgICAgICAgICAgaTY0X3NldD1zZXQoWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZmZmLCAweDdmZmZmZmZmZmZmZmZmZmZdKSwKKyAgICAgICAgICAgIGRvdWJsZV9zZXQ9c2V0KFswLjEsIDAuMiwgMC4zXSksCisgICAgICAgICAgICBzdHJpbmdfc2V0PXNldChbImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdKSwKKyAgICAgICAgICAgIGJvb2xlYW5fc2V0PXNldChbVHJ1ZSwgRmFsc2VdKSwKKyAgICAgICAgICAgICMgc3RydWN0X3NldD1zZXQoW0VtcHR5KCldKSwgIyB1bmhhc2hhYmxlIGluc3RhbmNlCisgICAgICAgICAgICBieXRlX2J5dGVfbWFwPXsxOiAyfSwKKyAgICAgICAgICAgIGkxNl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZjogMX0sCisgICAgICAgICAgICBpMzJfYnl0ZV9tYXA9ezE6IDEsIC0xOiAxLCAweDdmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGk2NF9ieXRlX21hcD17MDogMSwgMTogMSwgLTE6IDEsIDB4N2ZmZmZmZmZmZmZmZmZmZjogMX0sCisgICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA9ey0xLjE6IDEsIDEuMTogMX0sCisgICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA9eyJmaXJzdCI6IDEsICJzZWNvbmQiOiAyLCAidGhpcmQiOiAzLCAiIjogMH0sCisgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwPXtUcnVlOiAxLCBGYWxzZTogMH0sCisgICAgICAgICAgICBieXRlX2kxNl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZ9LAorICAgICAgICAgICAgYnl0ZV9pMzJfbWFwPXsxOiAxLCAyOiAtMSwgMzogMHg3ZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2k2NF9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmZmZmZmZmZmZ9LAorICAgICAgICAgICAgYnl0ZV9kb3VibGVfbWFwPXsxOiAwLjEsIDI6IC0wLjEsIDM6IDEwMDAwMDAuMX0sCisgICAgICAgICAgICBieXRlX3N0cmluZ19tYXA9ezE6ICIiLCAyOiAiYmxhaCIsIDM6ICJsb29vb29vb29vb29vb29uZyBzdHJpbmcifSwKKyAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA9ezE6IFRydWUsIDI6IEZhbHNlfSwKKyAgICAgICAgICAgICMgbGlzdF9ieXRlX21hcCAjIHVuaGFzaGFibGUKKyAgICAgICAgICAgICMgc2V0X2J5dGVfbWFwPXtzZXQoWzEsIDIsIDNdKSA6IDEsIHNldChbMCwgMV0pIDogMiwgc2V0KFtdKSA6IDB9LCAjIHVuaGFzaGFibGUKKyAgICAgICAgICAgICMgbWFwX2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgYnl0ZV9tYXBfbWFwPXswOiB7fSwgMTogezE6IDF9LCAyOiB7MTogMSwgMjogMn19LAorICAgICAgICAgICAgYnl0ZV9zZXRfbWFwPXswOiBzZXQoW10pLCAxOiBzZXQoWzFdKSwgMjogc2V0KFsxLCAyXSl9LAorICAgICAgICAgICAgYnl0ZV9saXN0X21hcD17MDogW10sIDE6IFsxXSwgMjogWzEsIDJdfSwKKyAgICAgICAgKQogCi0gIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgotICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjJvYmouYmVnaW5faW5fYm90aCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MyA9IE5lc3RlZExpc3RzSTMyeDMoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgICAgIFszLCA1LCA4XQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbMSwgMSwgMl0sCisgICAgICAgICAgICAgICAgICAgIFsxLCA0LCA5XQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubmVzdGVkX21peGVkeDIgPSBOZXN0ZWRNaXhlZHgyKGludF9zZXRfbGlzdD1bCisgICAgICAgICAgICBzZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIHNldChbMSwgNCwgOV0pLAorICAgICAgICAgICAgc2V0KFsxLCAyLCAzLCA1LCA4LCAxMywgMjFdKSwKKyAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQorICAgICAgICBdLAorICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldD17MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKKyAgICAgICAgICAgICAgICB7MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICAgICAgezEwMDogc2V0KCdsbW4nKSwgMjAwOiBzZXQoJ29wcScpLCAzMDA6IHNldCgnUlNUJyl9LAorICAgICAgICAgICAgICAgIHsxMDAwOiBzZXQoJ3V2dycpLCAyMDAwOiBzZXQoJ3d4eScpLCAzMDAwOiBzZXQoJ1hZWicpfV0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2JvbmsgPSBOZXN0ZWRMaXN0c0JvbmsoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgZmlyc3QnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIHNlY29uZCcsIHR5cGU9MSkKKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIGZpcnN0JywgdHlwZT0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBzZWNvbmQnLCB0eXBlPTIpCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBJywgdHlwZT0xKSwKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKworICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52MW9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCisKKyAgICBkZWYgdGVzdEJhY2t3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjJvYmouZW5kX2luX2JvdGgpCisKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVYxKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52MW9iaikKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYyb2JqKQorCisgICAgZGVmIHRlc3RCb29scyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi5ib29sc19mbGlwcGVkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLnYxb2JqKQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHMpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29sc19mbGlwcGVkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5ib29scykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TGFyZ2VEZWx0YXMoc2VsZik6CisgICAgICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0kzMngyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0kzMngzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRNaXhlZHgyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRNaXhlZHgyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbWl4ZWR4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbWl4ZWR4MikKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0Jvbmsoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzQm9uaywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TGlzdEJvbmtzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMaXN0Qm9ua3MsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxpc3RfYm9ua3MpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmxpc3RfYm9ua3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdENvbXBhY3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmNvbXBhY3Rfc3RydWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmNvbXBhY3Rfc3RydWN0KQorICAgICAgICByZXAgPSByZXByKHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdEludGVnZXJMaW1pdHMoc2VsZik6CisgICAgICAgIGlmIChzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gNik6CisgICAgICAgICAgICBwcmludCgnU2tpcHBpbmcgdGVzdEludGVnZXJMaW1pdHMgZm9yIFB5dGhvbiAyLjYnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGJhZF92YWx1ZXMgPSBbQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9MTI4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9LTEyOSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0zMjc2OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9LTMyNzY5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPTIxNDc0ODM2NDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPS0yMTQ3NDgzNjQ5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PTkyMjMzNzIwMzY4NTQ3NzU4MDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PS05MjIzMzcyMDM2ODU0Nzc1ODA5KQorICAgICAgICAgICAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgdmFsdWUgaW4gYmFkX3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgc2VsZi5fc2VyaWFsaXplLCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0UmVjVHJlZShzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHJlY3Vyc2l2ZSB0cmVlIG5vZGUgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNUcmVlKGl0ZW09aWR4LCBjaGlsZHJlbj1Ob25lKQorICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKG5vZGUpCisKKyAgICAgICAgcGFyZW50ID0gUmVjVHJlZShpdGVtPTAsIGNoaWxkcmVuPWNoaWxkcmVuKQorICAgICAgICBzZXJkZV9wYXJlbnQgPSBzZWxmLl9kZXNlcmlhbGl6ZShSZWNUcmVlLCBzZWxmLl9zZXJpYWxpemUocGFyZW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgc2VyZGVfcGFyZW50Lml0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQsIGxlbihzZXJkZV9wYXJlbnQuY2hpbGRyZW4pKQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VyZGVfcGFyZW50LmNoaWxkcmVuOgorICAgICAgICAgICAgIyBDYW5ub3QgdXNlIGFzc2VydElzSW5zdGFuY2UgaW4gcHl0aG9uIDIuNj8KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNoaWxkLCBSZWNUcmVlKSkKKworICAgIGRlZiBfYnVpbGRMaW5rZWRMaXN0KHNlbGYpOgorICAgICAgICBoZWFkID0gY3VyID0gUmVjTGlzdChpdGVtPTApCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBub2RlID0gUmVjTGlzdChpdGVtPWlkeCkKKyAgICAgICAgICAgIGN1ci5uZXh0aXRlbSA9IG5vZGUKKyAgICAgICAgICAgIGN1ciA9IG5vZGUKKyAgICAgICAgcmV0dXJuIGhlYWQKKworICAgIGRlZiBfY29sbGFwc2VMaW5rZWRMaXN0KHNlbGYsIGhlYWQpOgorICAgICAgICBvdXRfbGlzdCA9IFtdCisgICAgICAgIGN1ciA9IGhlYWQKKyAgICAgICAgd2hpbGUgY3VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0X2xpc3QuYXBwZW5kKGN1ci5pdGVtKQorICAgICAgICAgICAgY3VyID0gY3VyLm5leHRpdGVtCisgICAgICAgIHJldHVybiBvdXRfbGlzdAorCisgICAgZGVmIHRlc3RSZWNMaXN0KHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIGxpbmtlZCBsaXN0IGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICByZWNfbGlzdCA9IHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpCisgICAgICAgIHNlcmRlX2xpc3QgPSBzZWxmLl9kZXNlcmlhbGl6ZShSZWNMaXN0LCBzZWxmLl9zZXJpYWxpemUocmVjX2xpc3QpKQorICAgICAgICBvdXRfbGlzdCA9IHNlbGYuX2NvbGxhcHNlTGlua2VkTGlzdChzZXJkZV9saXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbMCwgMSwgMiwgMywgNF0sIG91dF9saXN0KQorCisgICAgZGVmIHRlc3RDb1JlYyhzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGNvLXJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBpdGVtMSA9IENvUmVjKCkKKyAgICAgICAgaXRlbTIgPSBDb1JlYzIoKQorCisgICAgICAgIGl0ZW0xLm90aGVyID0gaXRlbTIKKyAgICAgICAgaXRlbTIub3RoZXIgPSBpdGVtMQorCisgICAgICAgICMgTk9URSBbZWNvbm5lcjcyNCwyMDE3LTA2LTIxXTogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBzZXJpYWxpemF0aW9uCisgICAgICAgICMgcmVzdWx0cyBpbiBhbiBpbmZpbml0ZSBsb29wLiBmYnRocmlmdCBhbHNvIHN1ZmZlcnMgZnJvbSB0aGlzCisgICAgICAgICMgcHJvYmxlbS4KKworICAgIGRlZiB0ZXN0UmVjVmVjdG9yKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgYSBsaXN0IG9mIHJlY3Vyc2l2ZSBub2RlcyBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgbXlsaXN0ID0gW3NlbGYuX2J1aWxkTGlua2VkTGlzdCgpLCBzZWxmLl9idWlsZExpbmtlZExpc3QoKV0KKyAgICAgICAgbXl2ZWMgPSBWZWN0b3JUZXN0KGxpc3Rlcj1teWxpc3QpCisKKyAgICAgICAgc2VyZGVfdmVjID0gc2VsZi5fZGVzZXJpYWxpemUoVmVjdG9yVGVzdCwgc2VsZi5fc2VyaWFsaXplKG15dmVjKSkKKyAgICAgICAgZ29sZGVuX2xpc3QgPSBbMCwgMSwgMiwgMywgNF0KKyAgICAgICAgZm9yIGN1cl9saXN0IGluIHNlcmRlX3ZlYy5saXN0ZXI6CisgICAgICAgICAgICBvdXRfbGlzdCA9IHNlbGYuX2NvbGxhcHNlTGlua2VkTGlzdChjdXJfbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2xpc3QsIG91dF9saXN0KQogCiAKIGNsYXNzIE5vcm1hbEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpCisKKworY2xhc3MgQ29tcGFjdFByb3RvY29sVGVzdChBYnN0cmFjdFRlc3QpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKworCitjbGFzcyBKU09OUHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQogCiAKIGNsYXNzIEFjY2VsZXJhdGVkRnJhbWVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0U3BsaXQoc2VsZik6Ci0gICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKKyAgICBkZWYgdGVzdFNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAotICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKKyAgICAgICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgICAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCiAKLSAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCi0gICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSArIDEpKQogCi0gICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKLSAgICBwcm90LndyaXRlSTMyKDQyKQotICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQotICAgIHByb3Qud3JpdGVJMTYoMjQpCi0gICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQotICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpLzIKLSAgICBwYXJ0cyA9IFsgZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol0gXQorICAgICAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKKyAgICAgICAgcHJvdC53cml0ZUkzMig0MikKKyAgICAgICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCisgICAgICAgIHByb3Qud3JpdGVJMTYoMjQpCisgICAgICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKKyAgICAgICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkgLy8gMgorICAgICAgICBwYXJ0cyA9IFtkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XV0KIAotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBmb3IgcGFydCBpbiBwYXJ0czoKLSAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKLSAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKIAotICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQotICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKyAgICAgICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQorICAgICAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorCiAKIGNsYXNzIFNlcmlhbGl6ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6Ci0gICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKKyAgICAgICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCiAKLSAgICBzMSA9IHNlcmlhbGl6ZShvYmopCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQotICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQotICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIHMxID0gc2VyaWFsaXplKG9iaikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQotICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKKyAgICAgICAgb2JqY29weSA9IFh0cnVjdCgpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGJvb2xlYW5zCisgICAgICAgIG9iaiA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIG9iamNvcHkgPSBCb29scygpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGVudW1zCisgICAgICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvYmogPSBCb25rKG1lc3NhZ2U9J2VudW0gTnVtYmVyeiB2YWx1ZSAlZCBpcyBzdHJpbmcgJXMnICUgKG51bSwgbmFtZSksIHR5cGU9bnVtKQorICAgICAgICAgICAgb2JqY29weSA9IEJvbmsoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEZyYW1lZFRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoU2VyaWFsaXplcnNUZXN0KSkKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vcm1hbEJpbmFyeVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZENvbXBhY3RUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05Qcm90b2NvbFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEZyYW1lZFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkgYi90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTg3NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IEJvbmssIFZlcnNpb25pbmdUZXN0VjEsIFZlcnNpb25pbmdUZXN0VjIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworaW1wb3J0IGpzb24KK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFNpbXBsZUpTT05Qcm90b2NvbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKworICAgIGRlZiBfYXNzZXJ0RGljdEVxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnYXNzZXJ0RGljdEVxdWFsJyk6CisgICAgICAgICAgICAjIGFzc2VydERpY3RFcXVhbCBvbmx5IGluIFB5dGhvbiAyLjcuIERlcGVuZHMgb24geW91ciBtYWNoaW5lLgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYSwgYiwgbXNnKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTdWJzdGl0dXRlIGltcGxlbWVudGF0aW9uIG5vdCBhcyBnb29kIGFzIHVuaXR0ZXN0IGxpYnJhcnkncworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYSksIGxlbihiKSwgbXNnKQorICAgICAgICBmb3IgaywgdiBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gYiwgbXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYi5nZXQoayksIHYsIG1zZykKKworICAgIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgb2JqLndyaXRlKHByb3QpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisKKyAgICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhKSkKKyAgICAgICAgcmV0ID0gb2JqdHlwZSgpCisgICAgICAgIHJldC5yZWFkKHByb3QpCisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXNlcmlhbGl6ZSwgVmVyc2lvbmluZ1Rlc3RWMSwgYid7fScpCisKKyAgICBkZWYgdGVzdFNpbXBsZU1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYxb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc3RyaW5nPXYxb2JqLm9sZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12MW9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjFvYmopLmRlY29kZSgnYXNjaWknKSkKKworICAgICAgICBzZWxmLl9hc3NlcnREaWN0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKworICAgIGRlZiB0ZXN0Q29tcGxpY2F0ZWQoc2VsZik6CisgICAgICAgIHYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYyb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdpbnQ9djJvYmoubmV3aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Ynl0ZT12Mm9iai5uZXdieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2hvcnQ9djJvYmoubmV3c2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsb25nPXYyb2JqLm5ld2xvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdkb3VibGU9djJvYmoubmV3ZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3RydWN0PWRpY3QobWVzc2FnZT12Mm9iai5uZXdzdHJ1Y3QubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9djJvYmoubmV3c3RydWN0LnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGlzdD12Mm9iai5uZXdsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2V0PWxpc3QodjJvYmoubmV3c2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld21hcD12Mm9iai5uZXdtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJpbmc9djJvYmoubmV3c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2luX2JvdGg9djJvYmouZW5kX2luX2JvdGgpCisKKyAgICAgICAgIyBOZWVkIHRvIGxvYWQvZHVtcCBiZWNhdXNlIG1hcCBrZXlzIGdldCBlc2NhcGVkLgorICAgICAgICBleHBlY3RlZCA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhleHBlY3RlZCkpCisgICAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYyb2JqKS5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkgYi90ZXN0L3B5L1Rlc3RDbGllbnQucHkKaW5kZXggMGEzOGIwMy4uZGRjY2U4ZCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0Q2xpZW50LnB5CisrKyBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQpAQCAtMSw1ICsxLDUgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgotCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwxNDIgKzE5LDQyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTApCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIgYXQgcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iaG9zdCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tZnJhbWVkIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZnJhbWVkIiwKLSAgICBoZWxwPSJ1c2UgZnJhbWVkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKLSAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6Ci0gICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KAotICAgICAgICAgIG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCBvcHRpb25zLmh0dHBfcGF0aCkKLSAgICBlbHNlOgotICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnaHR0cCc6CisgICAgICAgICAgICB1cmkgPSAnezB9Oi8vezF9OnsyfXszfScuZm9ybWF0KCgnaHR0cHMnIGlmIG9wdGlvbnMuc3NsIGVsc2UgJ2h0dHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmh0dHBfcGF0aCBpZiBvcHRpb25zLmh0dHBfcGF0aCBlbHNlICcvJykpCisgICAgICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgICAgICBfX2NhZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgIkNBLnBlbSIpCisgICAgICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5jcnQiKQorICAgICAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5rZXkiKQorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpLCBjYWZpbGU9X19jYWZpbGUsIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCB2YWxpZGF0ZT1GYWxzZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgICAgICAgICAgIyBmcmFtZSBvciBidWZmZXIgZGVwZW5kaW5nIHVwb24gYXJncworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuemxpYjoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHNlbGYudHJhbnNwb3J0LCA5KQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKyAgICAgICAgcHJvdG9jb2wgPSBzZWxmLmdldF9wcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICAgICAgIyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXM6CisgICAgICAgIHByb3RvY29sMiA9IHNlbGYuZ2V0X3Byb3RvY29sMihzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQyID0gU2Vjb25kU2VydmljZS5DbGllbnQocHJvdG9jb2wyKSBpZiBwcm90b2NvbDIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAKLSAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKLSAgICAgIGlmIG9wdGlvbnMuZnJhbWVkOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKIAotICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RWb2lkJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQogCi0gICAgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCi0gICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgICAgICBzMSA9IHUnXGJcdFxuL1xcXFxccnt9OuODkeOCpOOCveODsyInCisgICAgICAgIHMyID0gdSIiIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLAorICAgICAgICBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwKKyAgICAgICAg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLAorICAgICAgICDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sCisgICAgICAgIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywKKyAgICAgICAgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLAorICAgICAgICBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsCisgICAgICAgIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywKKyAgICAgICAgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwKKyAgICAgICAgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwKKyAgICAgICAgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLAorICAgICAgICDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsCisgICAgICAgIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywKKyAgICAgICAgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EKKyAgICAgICAgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhCisgICAgICAgIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqgorICAgICAgICBOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsCisgICAgICAgIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILAorICAgICAgICBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywKKyAgICAgICAg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZQorICAgICAgICBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssCisgICAgICAgIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywKKyAgICAgICAgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywKKyAgICAgICAgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywKKyAgICAgICAgQsOibi1sw6JtLWfDuiwg57K16KqeIiIiCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgICAgICAgICBzMSA9IHMxLmVuY29kZSgndXRmOCcpCisgICAgICAgICAgICBzMiA9IHMyLmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMSksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczIpLCBzMikKIAotICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgIyBDbG9zZSEKLSAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCisgICAgZGVmIHRlc3RNdWx0aXBsZXhlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbGllbnQyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aXBsZXhlZCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Mi5zZWNvbmR0ZXN0U3RyaW5nKCdmb29iYXInKSwgJ3Rlc3RTdHJpbmcoImZvb2JhciIpJykKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQorICAgIGRlZiB0ZXN0Qm9vbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCb29sJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChGYWxzZSksIEZhbHNlKQogCi0gIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCeXRlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKC0xMjcpLCAtMTI3KQogCi0gIGRlZiB0ZXN0Qnl0ZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKIAotICBkZWYgdGVzdEkzMihzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCisgICAgZGVmIHRlc3RJNjQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STY0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSwgLTM0MzU5NzM4MzY4KQogCi0gIGRlZiB0ZXN0STY0KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCisgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RG91YmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSksIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkKIAotICBkZWYgdGVzdERvdWJsZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJpbmFyeScpCisgICAgICAgIHZhbCA9IGJ5dGVhcnJheShbaSBmb3IgaSBpbiByYW5nZSgwLCAyNTYpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlYXJyYXkoc2VsZi5jbGllbnQudGVzdEJpbmFyeShieXRlcyh2YWwpKSksIHZhbCkKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmKToKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDEKLSAgICB4LmkzMl90aGluZyA9IC0zCi0gICAgeC5pNjRfdGhpbmcgPSAtNQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U3RydWN0JykKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICJaZXJvIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTMyX3RoaW5nLCAtMykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTY0X3RoaW5nLCAtNSkKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TmVzdCcpCisgICAgICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLCBpNjRfdGhpbmc9LTUpCisgICAgICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBYY2VwdGlvbiwgeDoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICBkZWYgdGVzdE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXAnKQorICAgICAgICB4ID0gezA6IDEsIDE6IDIsIDI6IDMsIDM6IDQsIC0xOiAtMn0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXAoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBFeGNlcHRpb246ICMgdHlwZSBpcyB1bmRlZmluZWQKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdFNldChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTZXQnKQorICAgICAgICB4ID0gc2V0KFs4LCAxLCA0Ml0pCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE9uZXdheShzZWxmKToKLSAgICBzdGFydCA9IHRpbWUudGltZSgpCi0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgwLjUpCi0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAwLjIsCi0gICAgICAgICAgICAgICAgICAgICJvbmV3YXkgc2xlZXAgdG9vayAlZiBzZWMiICUgKGVuZCAtIHN0YXJ0KSkKLSAgCi0gIGRlZiB0ZXN0T25ld2F5VGhlbk5vcm1hbChzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDAuNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICBkZWYgdGVzdExpc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TGlzdCcpCisgICAgICAgIHggPSBbMSwgNCwgOSwgLTQyXQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdExpc3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgZGVmIHRlc3RFbnVtKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEVudW0nKQorICAgICAgICB4ID0gTnVtYmVyei5GSVZFCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0RW51bSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLWNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFR5cGVkZWYnKQorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZiAgIyA3IGJ5dGVzIG9mIDB4ZmYKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RUeXBlZGVmKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKworICAgIGRlZiB0ZXN0TWFwTWFwKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE1hcE1hcCcpCisgICAgICAgIHggPSB7CisgICAgICAgICAgICAtNDogey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisgICAgICAgICAgICA0OiB7NDogNCwgMzogMywgMjogMiwgMTogMX0sCisgICAgICAgIH0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXBNYXAoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKworICAgIGRlZiB0ZXN0TXVsdGkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TXVsdGknKQorICAgICAgICB4cGVjdGVkID0gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywgYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TXVsdGkoeHBlY3RlZC5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiAnYWJjJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyei5GSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjBmMGYwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RFeGNlcHRpb24nKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZXJyb3JDb2RlLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCisgICAgICAgICAgICAjIFRPRE8gZW5zdXJlIHNhbWUgYmVoYXZpb3IgZm9yIHJlcHIgd2l0aGluIGdlbmVyYXRlZCBweXRob24gdmFyaWFudHMKKyAgICAgICAgICAgICMgZW5zdXJlIGV4Y2VwdGlvbidzIHJlcHIgbWV0aG9kIHdvcmtzCisgICAgICAgICAgICAjIHhfcmVwciA9IHJlcHIoeCkKKyAgICAgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbCh4X3JlcHIsICdYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1cJ1hjZXB0aW9uXCcpJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBURXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBTaG91bGQgbm90IHRocm93CisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3N1Y2Nlc3MnKQorCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aUV4Y2VwdGlvbicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24nLCAnaWdub3JlJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Lm1lc3NhZ2UsICdUaGlzIGlzIGFuIFhjZXB0aW9uJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24yIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDIwMDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdUaGlzIGlzIGFuIFhjZXB0aW9uMicpCisKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignc3VjY2VzcycsICdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuc3RyaW5nX3RoaW5nLCAnZm9vYmFyJykKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE9uZXdheScpCisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmQgLSBzdGFydCA8IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisKKyAgICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5VGhlbk5vcm1hbCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKworCitjbGFzcyBNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdChBYnN0cmFjdFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBKU09OVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgSGVhZGVyVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICBmYWN0b3J5ID0gVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIGlmIG9wdGlvbnMucHJvdG8gPT0gJ2JpbmFyeSc6ICAjIGxvb2sgZm9yIC0tcHJvdG8gb24gY21kbGluZQorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWxjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnY29tcGFjdCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdoZWFkZXInOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSGVhZGVyVGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdqc29uJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05UZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWEnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlhYyc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGljJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlqJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkSlNPTlRlc3QpKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIHByb3RvY29sIGdpdmVuIHdpdGggLS1wcm90b2NvbDogJXMnICUgb3B0aW9ucy5wcm90bykKKyAgICByZXR1cm4gc3VpdGUKIAotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICByZXR1cm4gc3VpdGUKIAogY2xhc3MgT3duQXJnc1Rlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKICAgICBkZWYgcGFyc2VBcmdzKHNlbGYsIGFyZ3YpOgogICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBhcmdzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChzZWxmLmRlZmF1bHRUZXN0LCkKKyAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKFtzZWxmLmRlZmF1bHRUZXN0XSkKICAgICAgICAgc2VsZi5jcmVhdGVUZXN0cygpCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGlhLCBtdWx0aWFjLCBtdWx0aWMsIG11bHRpaiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhmcmFtZWQ9RmFsc2UsIGh0dHBfcGF0aD1Ob25lLCB2ZXJib3NlPTEsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgcHJvdG89J2JpbmFyeScpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdGlvbnMuZ2VucHlkaXI6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKKworICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgorICAgICAgICBvcHRpb25zLnRyYW5zID0gJ2h0dHAnCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFNlY29uZFNlcnZpY2UKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKKyAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFh0cnVjdDIsIE51bWJlcnosIFhjZXB0aW9uLCBYY2VwdGlvbjIKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCisgICAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RW9mLnB5IGIvdGVzdC9weS9UZXN0RW9mLnB5CmluZGV4IDdkNjQyODkuLjBiNGE4MjkgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdEVvZi5weQorKysgYi90ZXN0L3B5L1Rlc3RFb2YucHkKQEAgLTE5LDEwMyArMTksMTE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgVGVzdEVvZih1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBkZWYgbWFrZV9kYXRhKHNlbGYsIHBmYWN0b3J5PU5vbmUpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlmIHBmYWN0b3J5OgorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnMpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDAKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDAKIAotICAgIHgud3JpdGUocHJvdCkKKyAgICAgICAgeC53cml0ZShwcm90KQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgotICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIk9uZSIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICBzZWxmLmRhdGEgPSB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCiAKLSAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLmRhdGEpCi0gICAgdHJhbnMucmVhZEFsbCgxKQorICAgIGRlZiB0ZXN0VHJhbnNwb3J0UmVhZEFsbChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IHJlYWRBbGwgb24gYW55IHR5cGUgb2YgdHJhbnNwb3J0IHRocm93cyBhbiBFT0ZFcnJvciIiIgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YSgpKQorICAgICAgICB0cmFucy5yZWFkQWxsKDEpCiAKLSAgICB0cnk6Ci0gICAgICB0cmFucy5yZWFkQWxsKDEwMDAwKQotICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cmFucy5yZWFkQWxsKDEwMDAwKQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KIAotICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQogCi0gIGRlZiBlb2ZUZXN0SGVscGVyKHNlbGYsIHBmYWN0b3J5KToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLmRhdGEpCi0gICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgIGRlZiBlb2ZUZXN0SGVscGVyKHNlbGYsIHBmYWN0b3J5KToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpKQorICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnJlYWQocHJvdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDApCi0KLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnJlYWQocHJvdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiT25lIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKLQotICAgIHRyeToKLSAgICAgIHggPSBYdHJ1Y3QoKQotICAgICAgeC5yZWFkKHByb3QpCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgcmV0dXJuCi0KLSAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCi0KLSAgZGVmIGVvZlRlc3RIZWxwZXJTdHJlc3Moc2VsZiwgcGZhY3RvcnkpOgotICAgICIiIlRlZXN0IHRoZSBhYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbCB0byBkZWFsIHdpdGggdGhlIHJlbW92YWwgb2YgZXZlcnkgYnl0ZSBpbiB0aGUgZmlsZSIiIgotICAgICMgVE9ETzogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBtb3JlIG9mIHRoZSBjb2RlIHBhdGhzCi0KLSAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKHNlbGYuZGF0YSkgKyAxKToKLSAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYuZGF0YVswOmldKQotICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgICAgdHJ5OgogICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICAgIHgucmVhZChwcm90KQotICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgY29udGludWUKLSAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIEVPRkVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiT25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQorCisgICAgZGVmIGVvZlRlc3RIZWxwZXJTdHJlc3Moc2VsZiwgcGZhY3RvcnkpOgorICAgICAgICAiIiJUZXN0IHRoZSBhYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbCB0byBkZWFsIHdpdGggdGhlIHJlbW92YWwgb2YgZXZlcnkgYnl0ZSBpbiB0aGUgZmlsZSIiIgorICAgICAgICAjIFRPRE86IHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgbW9yZSBvZiB0aGUgY29kZSBwYXRocworCisgICAgICAgIGRhdGEgPSBzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRhdGEpICsgMSk6CisgICAgICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhWzA6aV0pCisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIEVPRkVycm9yIikKKworICAgIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorCisgICAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkQmluYXJ5RW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisKKyAgICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRDb21wYWN0RW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RFb2YpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RFb2YpKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdEZyb3plbi5weSBiL3Rlc3QvcHkvVGVzdEZyb3plbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDI1OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9UZXN0RnJvemVuLnB5CkBAIC0wLDAgKzEsMTIzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBFbXB0eSwgV3JhcHBlcgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURnJvemVuRGljdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQ29tcGFjdFByb3RvY29sCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RGcm96ZW5CYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3JvdW5kdHJpcChzZWxmLCBzcmMsIGRzdCk6CisgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIG9wdG9ybyA9IHNlbGYucHJvdG9jb2wob3RyYW5zKQorICAgICAgICBzcmMud3JpdGUob3B0b3JvKQorICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIGlwcm90byA9IHNlbGYucHJvdG9jb2woaXRyYW5zKQorICAgICAgICByZXR1cm4gZHN0LnJlYWQoaXByb3RvKSBvciBkc3QKKworICAgIGRlZiB0ZXN0X2RpY3RfaXNfaGFzaGFibGVfb25seV9hZnRlcl9mcm96ZW4oc2VsZik6CisgICAgICAgIGQwID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKGQwLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkpCisgICAgICAgIGQxID0gVEZyb3plbkRpY3QoZDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGQxLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Rfd2l0aF9jb2xsZWN0aW9uX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIHNldCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KHNldF9ieXRlX21hcD17CisgICAgICAgICAgICBmcm96ZW5zZXQoWzQyLCAxMDAsIC0xMDBdKTogOTksCisgICAgICAgICAgICBmcm96ZW5zZXQoWzBdKTogMTAwLAorICAgICAgICAgICAgZnJvemVuc2V0KFtdKTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoWzQyLCAxMDAsIC0xMDBdKV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoWzBdKV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFtdKV0sIDApCisKKyAgICBkZWYgdGVzdF9tYXAoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgbWFwIGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QobWFwX2J5dGVfbWFwPXsKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHs0MjogNDIsIDEwMDogLTEwMH0pOiA5OSwKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHswOiAwfSk6IDEwMCwKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHt9KTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7NDI6IDQyLCAxMDA6IC0xMDB9KV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7MDogMH0pXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7fSldLCAwKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBsaXN0IGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QobGlzdF9ieXRlX21hcD17CisgICAgICAgICAgICAoNDIsIDEwMCwgLTEwMCk6IDk5LAorICAgICAgICAgICAgKDAsKTogMTAwLAorICAgICAgICAgICAgKCk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWyg0MiwgMTAwLCAtMTAwKV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKDAsKV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWygpXSwgMCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cnVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBlbXB0eSBzdHJ1Y3QgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmVtcHR5X3N0cnVjdF9maWVsZCwgRW1wdHkoKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBzdHJ1Y3QgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gV3JhcHBlcihmb289RW1wdHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgRW1wdHkoKSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgV3JhcHBlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5mb28sIEVtcHR5KCkpCisKKworY2xhc3MgVGVzdEZyb3plbihUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworY2xhc3MgVGVzdEZyb3plbkFjY2VsZXJhdGVkQmluYXJ5KFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworY2xhc3MgVGVzdEZyb3plbkFjY2VsZXJhdGVkQ29tcGFjdChUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuKSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbkFjY2VsZXJhdGVkQmluYXJ5KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbkFjY2VsZXJhdGVkQ29tcGFjdCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkwM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkKQEAgLTAsMCArMSwxNzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBEb3VibGVDb25zdGFudHNUZXN0IGltcG9ydCBjb25zdGFudHMKKworIworIyBJbiBvcmRlciB0byBydW4gdGhlIHRlc3QgdW5kZXIgV2luZG93cy4gV2UgbmVlZCB0byBjcmVhdGUgc3ltYm9saWMgbGluaworIyBuYW1lICd0aHJpZnQnIHRvICcuLi9zcmMnIGZvbGRlciBieSB1c2luZzoKKyMKKyMgbWtsaW5rIC9EIHRocmlmdCAuLlxzcmMKKyMKKworCitjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPSBcCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgZG91YmxlIGNvbnN0YW50IGdlbmVyYXRlZCBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSIKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9XAorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGxpc3QgaXRlbSBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSIKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgPSAidGhlIHJlbmRlcmVkIHZhcmlhYmxlIHdpdGggbmFtZSAlcyBpcyBub3Qgb2YgZG91YmxlIHR5cGUiCisKKyAgICAjIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBkZWYgdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjEKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisKKyAgICAjIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBkZWYgdGVzdF9yZW5kZXJlZF9kb3VibGVfbGlzdChzZWxmKToKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0xJU1QgPSBbMS4wLCAtMTAwLjAsIDEwMC4wLCA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAsIC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsIDMuMTQxNTkyNjUzNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAuMSwgLTEwMDAwMDAuMSwgMS43ZSszMDgsIC0xLjdlKzMwOCwgOTIyMzM3MjAzNjg1NDc3NTgxNi40MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUKSwgbGVuKEVYUEVDVEVEX0RPVUJMRV9MSVNUKSkKKyAgICAgICAgZm9yIGksIGV4cGVjdGVkVmFsdWUgaW4gZW51bWVyYXRlKEVYUEVDVEVEX0RPVUJMRV9MSVNUKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIGV4cGVjdGVkVmFsdWUsIHBsYWNlcz03KQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkgYi90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKaW5kZXggM2QzNzllYS4uYWJhMGQ0MiAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U2VydmVyLnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQpAQCAtMTgsOTggKzE4LDMyNSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCi1pbXBvcnQgc3lzLCBnbG9iLCB0aW1lCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorZnJvbSB1dGlsIGltcG9ydCBsb2NhbF9saWJwYXRoCiAKLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBUSHR0cFNlcnZlcgorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCi1jbGFzcyBUZXN0SGFuZGxlcjoKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgcHJpbnQgJ3Rlc3RWb2lkKCknCitjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFZvaWQoKScpCiAKLSAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBwcmludCAndGVzdFN0cmluZyglcyknICUgc3RyCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYsIHN0cik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJpbmcoJXMpJyAlIHN0cikKKyAgICAgICAgcmV0dXJuIHN0cgogCi0gIGRlZiB0ZXN0Qnl0ZShzZWxmLCBieXRlKToKLSAgICBwcmludCAndGVzdEJ5dGUoJWQpJyAlIGJ5dGUKLSAgICByZXR1cm4gYnl0ZQorICAgIGRlZiB0ZXN0Qm9vbChzZWxmLCBib29sZWFuKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJvb2woJXMpJyAlIHN0cihib29sZWFuKS5sb3dlcigpKQorICAgICAgICByZXR1cm4gYm9vbGVhbgogCi0gIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6Ci0gICAgcHJpbnQgJ3Rlc3RJMTYoJWQpJyAlIGkxNgotICAgIHJldHVybiBpMTYKKyAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCeXRlKCVkKScgJSBieXRlKQorICAgICAgICByZXR1cm4gYnl0ZQogCi0gIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6Ci0gICAgcHJpbnQgJ3Rlc3RJMzIoJWQpJyAlIGkzMgotICAgIHJldHVybiBpMzIKKyAgICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0STE2KCVkKScgJSBpMTYpCisgICAgICAgIHJldHVybiBpMTYKIAotICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgotICAgIHByaW50ICd0ZXN0STY0KCVkKScgJSBpNjQKLSAgICByZXR1cm4gaTY0CisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKLSAgICBwcmludCAndGVzdERvdWJsZSglZiknICUgZHViCi0gICAgcmV0dXJuIGR1YgorICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJNjQoJWQpJyAlIGk2NCkKKyAgICAgICAgcmV0dXJuIGk2NAogCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKLSAgICBwcmludCAndGVzdFN0cnVjdCh7JXMsICVkLCAlZCwgJWR9KScgJSAodGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZykKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RG91YmxlKCVmKScgJSBkdWIpCisgICAgICAgIHJldHVybiBkdWIKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBzdHIpOgotICAgIHByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgJSBzdHIKLSAgICBpZiBzdHIgPT0gJ1hjZXB0aW9uJzoKLSAgICAgIHggPSBYY2VwdGlvbigpCi0gICAgICB4LmVycm9yQ29kZSA9IDEwMDEKLSAgICAgIHgubWVzc2FnZSA9IHN0cgotICAgICAgcmFpc2UgeAotICAgIGVsaWYgc3RyID09ICJ0aHJvd191bmRlY2xhcmVkIjoKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZvbyIpCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0QmluYXJ5KCknKSAgIyBUT0RPOiBoZXggb3V0cHV0CisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgotICAgIHByaW50ICd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzCi0gICAgdGltZS5zbGVlcChzZWNvbmRzKQotICAgIHByaW50ICdkb25lIHNsZWVwaW5nJworICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cnVjdCh7JXMsICVzLCAlcywgJXN9KScgJSAodGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZykpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgYXJnKToKKyAgICAgICAgIyBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIGFyZykKKyAgICAgICAgaWYgYXJnID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1hcmcpCisgICAgICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQogCi0gIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYsIGFyZzAsIGFyZzEpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgJSAoYXJnMCwgYXJnMSkpCisgICAgICAgIGlmIGFyZzAgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPSdUaGlzIGlzIGFuIFhjZXB0aW9uJykKKyAgICAgICAgZWxpZiBhcmcwID09ICdYY2VwdGlvbjInOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24yKAorICAgICAgICAgICAgICAgIGVycm9yQ29kZT0yMDAyLAorICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdUaGlzIGlzIGFuIFhjZXB0aW9uMicpKQorICAgICAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz1hcmcxKQogCi0gIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcykKKyAgICAgICAgdGltZS5zbGVlcChzZWNvbmRzIC8gMykgICMgYmUgcXVpY2sKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnZG9uZSBzbGVlcGluZycpCiAKLSAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TmVzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFN0cmluZ01hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJpbmdNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCi1oYW5kbGVyID0gVGVzdEhhbmRsZXIoKQotcHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTZXQoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotaWYgc3lzLmFyZ3ZbMV0gPT0gIlRIdHRwU2VydmVyIjoKLSAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIDkwOTApLCBwZmFjdG9yeSkKLWVsc2U6Ci0gIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldCg5MDkwKQotICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdExpc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBpZiBzeXMuYXJndlsxXSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKLSAgICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0KQotICBlbHNlOgotICAgIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzeXMuYXJndlsxXSkKLSAgICBzZXJ2ZXIgPSBTZXJ2ZXJDbGFzcyhwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFbnVtKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLXNlcnZlci5zZXJ2ZSgpCisgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFR5cGVkZWYoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TWFwTWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE1hcE1hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAtNDogeworICAgICAgICAgICAgICAgIC00OiAtNCwKKyAgICAgICAgICAgICAgICAtMzogLTMsCisgICAgICAgICAgICAgICAgLTI6IC0yLAorICAgICAgICAgICAgICAgIC0xOiAtMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICA0OiB7CisgICAgICAgICAgICAgICAgNDogNCwKKyAgICAgICAgICAgICAgICAzOiAzLAorICAgICAgICAgICAgICAgIDI6IDIsCisgICAgICAgICAgICAgICAgMTogMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0KKworICAgIGRlZiB0ZXN0SW5zYW5pdHkoc2VsZiwgYXJndW1lbnQpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0SW5zYW5pdHkoJXMpJyAlIGFyZ3VtZW50KQorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgMTogeworICAgICAgICAgICAgICAgIDI6IGFyZ3VtZW50LAorICAgICAgICAgICAgICAgIDM6IGFyZ3VtZW50LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDI6IHs2OiBJbnNhbml0eSgpfSwKKyAgICAgICAgfQorCisgICAgZGVmIHRlc3RNdWx0aShzZWxmLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0pCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdIZWxsbzInLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc9YXJnMCwgaTMyX3RoaW5nPWFyZzEsIGk2NF90aGluZz1hcmcyKQorCisKK2RlZiBtYWluKG9wdGlvbnMpOgorICAgICMgc2V0IHVwIHRoZSBwcm90b2NvbCBmYWN0b3J5IGZvcm0gdGhlIC0tcHJvdG9jb2wgb3B0aW9uCisgICAgcHJvdF9mYWN0b3JpZXMgPSB7CisgICAgICAgICdhY2NlbCc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSwKKyAgICAgICAgJ2FjY2VsYyc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnYmluYXJ5JzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ2NvbXBhY3QnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdoZWFkZXInOiBUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeShhbGxvd2VkX2NsaWVudF90eXBlcz1bCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMsCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QsCisgICAgICAgIF0pLAorICAgICAgICAnanNvbic6IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKyAgICB9CisgICAgcGZhY3RvcnkgPSBwcm90X2ZhY3Rvcmllcy5nZXQob3B0aW9ucy5wcm90bywgTm9uZSkKKyAgICBpZiBwZmFjdG9yeSBpcyBOb25lOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXByb3RvY29sIG9wdGlvbjogJXMnICUgb3B0aW9ucy5wcm90bykKKyAgICB0cnk6CisgICAgICAgIHBmYWN0b3J5LnN0cmluZ19sZW5ndGhfbGltaXQgPSBvcHRpb25zLnN0cmluZ19saW1pdAorICAgICAgICBwZmFjdG9yeS5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5jb250YWluZXJfbGltaXQKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAjIElnbm9yZSBlcnJvcnMgZm9yIHRob3NlIHByb3RvY29scyB0aGF0IGRvZXMgbm90IHN1cHBvcnQgbGVuZ3RoIGxpbWl0CisgICAgICAgIHBhc3MKKworICAgICMgZ2V0IHRoZSBzZXJ2ZXIgdHlwZSAoVFNpbXBsZVNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBldGMuLi4pCisgICAgaWYgbGVuKGFyZ3MpID4gMToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ09ubHkgb25lIHNlcnZlciB0eXBlIG1heSBiZSBzcGVjaWZpZWQsIG5vdCBtdWx0aXBsZSB0eXBlcy4nKQorICAgIHNlcnZlcl90eXBlID0gYXJnc1swXQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICBzZXJ2ZXJfdHlwZSA9ICdUSHR0cFNlcnZlcicKKworICAgICMgU2V0IHVwIHRoZSBoYW5kbGVyIGFuZCBwcm9jZXNzb3Igb2JqZWN0cworICAgIGhhbmRsZXIgPSBUZXN0SGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcikKKworICAgIGdsb2JhbCBzZXJ2ZXIKKworICAgICMgSGFuZGxlIFRIdHRwU2VydmVyIGFzIGEgc3BlY2lhbCBjYXNlCisgICAgaWYgc2VydmVyX3R5cGUgPT0gJ1RIdHRwU2VydmVyJzoKKyAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICBfX2NlcnRmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmNydCIpCisgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJzZXJ2ZXIua2V5IikKKyAgICAgICAgICAgIHNlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSwgY2VydF9maWxlPV9fY2VydGZpbGUsIGtleV9maWxlPV9fa2V5ZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNlcnZlKCkKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICMgc2V0IHVwIHNlcnZlciB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5CisKKyAgICBhYnNfa2V5X3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAna2V5cycsICdzZXJ2ZXIucGVtJykKKworICAgIGhvc3QgPSBOb25lCisgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAorICAgICAgICB0cmFuc3BvcnQgPSBUU1NMU29ja2V0LlRTU0xTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0LCBjZXJ0ZmlsZT1hYnNfa2V5X3BhdGgpCisgICAgZWxzZToKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQorICAgIGVsc2U6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICAjIGlmIC0temxpYiwgdGhlbiB3cmFwIHNlcnZlciB0cmFuc3BvcnQsIGFuZCB1c2UgYSBkaWZmZXJlbnQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICBpZiBvcHRpb25zLnpsaWI6CisgICAgICAgIHRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHRyYW5zcG9ydCkgICMgd3JhcCAgd2l0aCB6bGliCisgICAgICAgIHRmYWN0b3J5ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkKKworICAgICMgZG8gc2VydmVyLXNwZWNpZmljIHNldHVwIGhlcmU6CisgICAgaWYgc2VydmVyX3R5cGUgPT0gIlROb25ibG9ja2luZ1NlcnZlciI6CisgICAgICAgIHNlcnZlciA9IFROb25ibG9ja2luZ1NlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIGlucHV0UHJvdG9jb2xGYWN0b3J5PXBmYWN0b3J5KQorICAgIGVsaWYgc2VydmVyX3R5cGUgPT0gIlRQcm9jZXNzUG9vbFNlcnZlciI6CisgICAgICAgIGltcG9ydCBzaWduYWwKKyAgICAgICAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUUHJvY2Vzc1Bvb2xTZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gVFByb2Nlc3NQb29sU2VydmVyLlRQcm9jZXNzUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICAgICBzZXJ2ZXIuc2V0TnVtV29ya2Vycyg1KQorCisgICAgICAgIGRlZiBzZXRfYWxhcm0oKToKKyAgICAgICAgICAgIGRlZiBjbGVhbl9zaHV0ZG93bihzaWdudW0sIGZyYW1lKToKKyAgICAgICAgICAgICAgICBmb3Igd29ya2VyIGluIHNlcnZlci53b3JrZXJzOgorICAgICAgICAgICAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdUZXJtaW5hdGluZyB3b3JrZXI6ICVzJyAlIHdvcmtlcikKKyAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdSZXF1ZXN0aW5nIHNlcnZlciB0byBzdG9wKCknKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnN0b3AoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNsZWFuX3NodXRkb3duKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDQpCisgICAgICAgIHNldF9hbGFybSgpCisgICAgZWxzZToKKyAgICAgICAgIyBsb29rIHVwIHNlcnZlciBjbGFzcyBkeW5hbWljYWxseSB0byBpbnN0YW50aWF0ZSBzZXJ2ZXIKKyAgICAgICAgU2VydmVyQ2xhc3MgPSBnZXRhdHRyKFRTZXJ2ZXIsIHNlcnZlcl90eXBlKQorICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJDbGFzcyhwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgZW50ZXIgc2VydmVyIG1haW4gbG9vcAorICAgIHNlcnZlci5zZXJ2ZSgpCisKKworZGVmIGV4aXRfZ3JhY2VmdWxseShzaWdudW0sIGZyYW1lKToKKyAgICBwcmludCgiU0lHSU5UIHJlY2VpdmVkXG4iKQorICAgIHNlcnZlci5zaHV0ZG93bigpICAgIyBkb2Vzbid0IHdvcmsgcHJvcGVybHksIHlldAorICAgIHN5cy5leGl0KDApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIGV4aXRfZ3JhY2VmdWxseSkKKworICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSB0byBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYWNjZWxjLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsIGRlc3Q9InRyYW5zIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWNvbnRhaW5lci1saW1pdCcsIGRlc3Q9J2NvbnRhaW5lcl9saW1pdCcsIHR5cGU9J2ludCcsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1zdHJpbmctbGltaXQnLCBkZXN0PSdzdHJpbmdfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhwb3J0PTkwOTAsIHZlcmJvc2U9MSwgcHJvdG89J2JpbmFyeScsIHRyYW5zcG9ydD0nYnVmZmVyZWQnKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICAjIFByaW50IFRTZXJ2ZXIgbG9nIHRvIHN0ZG91dCBzbyB0aGF0IHRoZSB0ZXN0LXJ1bm5lciBjYW4gcmVkaXJlY3QgaXQgdG8gbG9nIGZpbGVzCisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1vcHRpb25zLnZlcmJvc2UpCisKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIG9wdGlvbnMuZ2VucHlkaXIpKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBsb2NhbF9saWJwYXRoKCkpCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKKyAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFhjZXB0aW9uLCBYY2VwdGlvbjIsIEluc2FuaXR5CisgICAgZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBUSHR0cFNlcnZlcgorCisgICAgc3lzLmV4aXQobWFpbihvcHRpb25zKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNvY2tldC5weSBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQppbmRleCAyZjczNTNmLi42MTllYjEwIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKKysrIGIvdGVzdC9weS9UZXN0U29ja2V0LnB5CkBAIC0xOSwyNCArMTksMTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRpbWUKIGltcG9ydCBzb2NrZXQKIGltcG9ydCByYW5kb20KLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCiAKIGNsYXNzIFRpbWVvdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGZvciBpIGluIHhyYW5nZSg1MCk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDUwKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAjIGZpbmQgYSBwb3J0IHdlIGNhbiB1c2UKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQpAQCAtNDQsNyArMzYsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2suYmluZCgoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCkpCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jay5saXN0ZW4oNSkKICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICBpZiBpID09IDQ5OgogICAgICAgICAgICAgICAgICAgICByYWlzZQogCkBAIC01MywxMiArNDUsMTIgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsZWFreSA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpCiAgICAgICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMTApCiAgICAgICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgICAgIGxlYWt5LmFwcGVuZChzb2NrZXQpCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLnRpbWUoKSAtIHN0YXJ0dGltZSA8IDUuMCkKIAogICAgIGRlZiB0ZXN0V3JpdGVUaW1lb3V0KHNlbGYpOgpAQCAtNzAsMTUgKzYyLDE3IEBACiAgICAgICAgICAgICBzb2NrZXQub3BlbigpCiAgICAgICAgICAgICBsc29jayA9IHNlbGYubGlzdGVuX3NvY2suYWNjZXB0KCkKICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc29ja2V0LndyaXRlKCJoaSIgKiAxMDApCisgICAgICAgICAgICAgICAgbHNvY2sud3JpdGUoImhpIiAqIDEwMCkKIAotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKLXN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLWxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi1zdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKLXRlc3RSdW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikKLXRlc3RSdW5uZXIucnVuKHN1aXRlKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUaW1lb3V0VGVzdCkpCisKKyAgICB0ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCisgICAgdGVzdFJ1bm5lci5ydW4oc3VpdGUpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTeW50YXgucHkgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKaW5kZXggZGY2N2Q0OC4uZGJlNzk3NSAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U3ludGF4LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFN5bnRheC5weQpAQCAtMTksMTAgKzE5LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KICMgSnVzdCBpbXBvcnQgdGhlc2UgZ2VuZXJhdGVkIGZpbGVzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBzeW50YWN0aWNhbGx5IHZhbGlkCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBFbXB0eVNlcnZpY2UKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEluaGVyaXRlZAorZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlICAjIG5vcWEKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEluaGVyaXRlZCAgIyBub3FhCmRpZmYgLS1naXQgYS90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoIGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaAppbmRleCAyZTVhNGYxLi42ZDczNDYyIDEwMDc1NQotLS0gYS90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCisrKyBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKQEAgLTIyLDYgKzIyLDcgQEAKIHJtIC1yZiBnZW4tcHkKIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDEudGhyaWZ0IHx8IGV4aXQgMQogLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0Mi50aHJpZnQgfHwgZXhpdCAxCisuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QzLnRocmlmdCAmJiBleGl0IDEgICMgRmFpbCBzaW5jZSB0ZXN0My50aHJpZnQgaGFzIHB5dGhvbiBrZXl3b3JkcwogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCBmb28uYmFyLmJheicgfHwgZXhpdCAxCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IHRlc3QyJyB8fCBleGl0IDEKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgdGVzdDEnICY+L2Rldi9udWxsICYmIGV4aXQgMSAgIyBTaG91bGQgZmFpbC4KZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3Rlc3QzLnRocmlmdCBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3Rlc3QzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ3ODZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvdGVzdDMudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIHB5IHZhbGlkYXRpb25zCisKK3N0cnVjdCBmcm9tIHsKKyAgMTogaTMyIGRlZjsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZSBiL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorbWFjcm8oR0VORVJBVEUgRklMRU5BTUUgR0VORVJBVE9SIE9VVFBVVERJUikKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke01ZX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtPVVRQVVRESVJ9KQorICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVENPTVBJTEVSfSAtLWdlbiAke0dFTkVSQVRPUn0gLW91dCAke01ZX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtPVVRQVVRESVJ9ICR7RklMRU5BTUV9CisgICAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgQ01EX1JFU1VMVCkKKyAgaWYoQ01EX1JFU1VMVCkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRXJyb3IgZ2VuZXJhdGluZyAke0ZJTEVOQU1FfSB3aXRoIGdlbmVyYXRvciAke0dFTkVSQVRPUn0iKQorICBlbmRpZigpCitlbmRtYWNybyhHRU5FUkFURSkKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvc2V0dXAuY2ZnIGIvdGVzdC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS91dGlsLnB5IGIvdGVzdC9weS91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjNmNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3V0aWwucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX1NDUklQVF9ESVIpKQorCisKK2RlZiBsb2NhbF9saWJwYXRoKCk6CisgICAgZ2xvYmRpciA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorICAgIGZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihnbG9iZGlyKToKKyAgICAgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgICAgICByZXR1cm4gbGlicGF0aApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9HZW1maWxlIGIvdGVzdC9yYi9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjA1MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL0dlbWZpbGUKQEAgLTAsMCArMSw3IEBACitzb3VyY2UgImh0dHA6Ly9ydWJ5Z2Vtcy5vcmciCisKK3JlcXVpcmUgInJ1YnlnZW1zIgorCitnZW0gJ3JhY2snLCAnfj4gMi4wJywgJz49IDIuMC40JworZ2VtICd0aGluJywgJ34+IDEuNycsICc+PSAxLjcuMicKK2dlbSAndGVzdC11bml0JywgJ34+IDMuMicsICc+PSAzLjIuNycKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0gYi90ZXN0L3JiL01ha2VmaWxlLmFtCmluZGV4IGE2ZjQzMWMuLmNmZGMxNDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKK3N0dWJzOiAkKFRIUklGVCkgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1JlY3Vyc2l2ZS50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCiAKIGNoZWNrOiBzdHVicwotCSQoUlVCWSkgdGVzdF9zdWl0ZS5yYgoraWYgSEFWRV9CVU5ETEVSCisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjICQoUlVCWSkgLUkuIHRlc3Rfc3VpdGUucmIKK2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIgYi90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCmluZGV4IDUyNzU1YzEuLjM3YWZhODUgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKKysrIGIvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgpAQCAtNTEsNyArNTEsNyBAQAogICAKICAgIyBUT0RPOgogICAjIFRoaXMgZG9lc24ndCBuZWNlc3NhcmlseSB0ZXN0IGhlIHJpZ2h0IHRoaW5nLgotICAjIEl0IF9sb29rc18gbGlrZSByZWFkIGlzbid0IGd1YXJlbnRlZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGgKKyAgIyBJdCBfbG9va3NfIGxpa2UgcmVhZCBpc24ndCBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgbGVuZ3RoCiAgICMgeW91IGFzayBmb3IgYW5kIHJlYWRfYWxsIGlzLiBUaGlzIG1lYW5zIG91ciB0ZXN0IG5lZWRzIHRvIGNoZWNrCiAgICMgZm9yIGJsb2NraW5nLiAtLSBLZXZpbiBDbGFyayAzLzI3LzA4CiAgIGRlZiB0ZXN0X3JlYWRfYWxsCmRpZmYgLS1naXQgYS90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMmY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKK3JlcXVpcmUgJ3JlY3Vyc2l2ZV90eXBlcycKKworY2xhc3MgVGVzdFJlY3Vyc2l2ZUdlbmVyYXRpb24gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBDSElMRF9JVEVNID0gImNoaWxkIGl0ZW0iCisgIFBBUkVOVF9JVEVNID0gInBhcmVudCBpdGVtIgorCisgIGRlZiB0ZXN0X2Nhbl9jcmVhdGVfcmVjdXJzaXZlX3RyZWUKKworICAgIGNoaWxkX3RyZWUgPSBSZWNUcmVlLm5ldworICAgIGNoaWxkX3RyZWUuaXRlbSA9IENISUxEX0lURU0KKworICAgIHBhcmVudF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBwYXJlbnRfdHJlZS5pdGVtID0gUEFSRU5UX0lURU0KKyAgICBwYXJlbnRfdHJlZS5jaGlsZHJlbiA9IFtjaGlsZF90cmVlXQorCisgICAgYXNzZXJ0X2VxdWFsKFBBUkVOVF9JVEVNLCBwYXJlbnRfdHJlZS5pdGVtKQorICAgIGFzc2VydF9lcXVhbCgxLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5sZW5ndGgpCisgICAgYXNzZXJ0X2VxdWFsKENISUxEX0lURU0sIHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0Lml0ZW0pCisgICAgYXNzZXJ0X25pbChwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5jaGlsZHJlbikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzlhY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCkBAIC0wLDAgKzEsMzgxIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJDoucHVzaCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLicKKworcmVxdWlyZSAndGVzdF9oZWxwZXInCityZXF1aXJlICd0aHJpZnQnCityZXF1aXJlICd0aHJpZnRfdGVzdCcKKworJGRvbWFpbl9zb2NrZXQgPSBuaWwKKyRob3N0ID0gImxvY2FsaG9zdCIKKyRwb3J0ID0gOTA5MAorJHByb3RvY29sVHlwZSA9ICJiaW5hcnkiCiskc3NsID0gZmFsc2UKKyR0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCisKK0FSR1YuZWFjaCBkb3xhfAorICBpZiBhID09ICItLWhlbHAiCisgICAgcHV0cyAiQWxsb3dlZCBvcHRpb25zOiIKKyAgICBwdXRzICJcdCAtaCBbIC0taGVscCBdIFx0IHByb2R1Y2UgaGVscCBtZXNzYWdlIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLWhvc3QgYXJnICg9bG9jYWxob3N0KSBcdCBIb3N0IHRvIGNvbm5lY3QgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4gXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIKKyAgICBwdXRzICJcdC0tc3NsIFx0IHVzZSBzc2wgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiCisgICAgZXhpdAorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWRvbWFpbi1zb2NrZXQiKQorICAgICRkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0taG9zdCIpCisgICAgJGhvc3QgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wcm90b2NvbCIpCisgICAgJHByb3RvY29sVHlwZSA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICAkc3NsID0gdHJ1ZQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXRyYW5zcG9ydCIpCisgICAgJHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQorICAgICRwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kKKyAgZW5kCitlbmQKKworY2xhc3MgU2ltcGxlQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGRlZiBzZXR1cAorICAgIHVubGVzcyBAc29ja2V0CisgICAgICBpZiAkZG9tYWluX3NvY2tldC50b19zLnN0cmlwLmVtcHR5PworICAgICAgICBpZiAkc3NsCisgICAgICAgICAgIyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHJ1YnkgY3Jvc3N0ZXN0IGlzIHRlc3QvcmIvZ2VuLXJiCisgICAgICAgICAga2V5c0RpciA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoRmlsZS5kaXJuYW1lKERpci5wd2QpKSwgImtleXMiKQorICAgICAgICAgIGN0eCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICAgICAgICBjdHguY2FfZmlsZSA9IEZpbGUuam9pbihrZXlzRGlyLCAiQ0EucGVtIikKKyAgICAgICAgICBjdHguY2VydCA9IE9wZW5TU0w6Olg1MDk6OkNlcnRpZmljYXRlLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJjbGllbnQuY3J0IikpKQorICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlID0gT3BlblNTTDo6WDUwOTo6U3RvcmUubmV3CisgICAgICAgICAgY3R4LmNlcnRfc3RvcmUuYWRkX2ZpbGUoRmlsZS5qb2luKGtleXNEaXIsICdzZXJ2ZXIucGVtJykpCisgICAgICAgICAgY3R4LmtleSA9IE9wZW5TU0w6OlBLZXk6OlJTQS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmtleSIpKSkKKyAgICAgICAgICBjdHgub3B0aW9ucyA9IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjIgfCBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYzCisgICAgICAgICAgY3R4LnNzbF92ZXJzaW9uID0gOlNTTHYyMworICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIKKyAgICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCRob3N0LCAkcG9ydCwgbmlsLCBjdHgpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3KCRob3N0LCAkcG9ydCkKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KCRkb21haW5fc29ja2V0KQorICAgICAgZW5kCisgICAgICAKKyAgICAgIGlmICR0cmFuc3BvcnQgPT0gImJ1ZmZlcmVkIgorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkKKyAgICAgIGVsc2lmICR0cmFuc3BvcnQgPT0gImZyYW1lZCIKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KQorICAgICAgZWxzZQorICAgICAgICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKKyAgICAgIGVuZAorCisgICAgICBpZiAkcHJvdG9jb2xUeXBlID09ICJiaW5hcnkiCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICJjb21wYWN0IgorICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2lmICRwcm90b2NvbFR5cGUgPT0gImpzb24iCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgZWxzaWYgJHByb3RvY29sVHlwZSA9PSAiYWNjZWwiCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgJ1Vua25vd24gcHJvdG9jb2wgdHlwZScKKyAgICAgIGVuZAorICAgICAgQGNsaWVudCA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCisgICAgICBAc29ja2V0Lm9wZW4KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlYXJkb3duCisgICAgQHNvY2tldC5jbG9zZQorICBlbmQKKworICBkZWYgdGVzdF92b2lkCisgICAgcCAndGVzdF92b2lkJworICAgIEBjbGllbnQudGVzdFZvaWQoKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmcKKyAgICBwICd0ZXN0X3N0cmluZycKKyAgICB0ZXN0X3N0cmluZyA9CisgICAgICAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JyArCisgICAgICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFwiIH19fXsgW1tbICcKKyAgICB0ZXN0X3N0cmluZyA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAgICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAgICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAgICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAgICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAgICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIgorCisgICAgcmVzdWx0X3N0cmluZyA9IEBjbGllbnQudGVzdFN0cmluZyh0ZXN0X3N0cmluZykKKyAgICBhc3NlcnRfZXF1YWwodGVzdF9zdHJpbmcsIHJlc3VsdF9zdHJpbmcuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYm9vbAorICAgIHAgJ3Rlc3RfYm9vbCcKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qm9vbChmYWxzZSksIGZhbHNlKQorICBlbmQKKworICBkZWYgdGVzdF9ieXRlCisgICAgcCAndGVzdF9ieXRlJworICAgIHZhbCA9IDEyMAorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaTMyCisgICAgcCAndGVzdF9pMzInCisgICAgdmFsID0gMjAwMDAwMDAzMgorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2k2NAorICAgIHAgJ3Rlc3RfaTY0JworICAgIHZhbCA9IDkwMDAwMDAwMDAwMDAwMDAwNjQKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQorICBlbmQKKworICBkZWYgdGVzdF9kb3VibGUKKyAgICBwICd0ZXN0X2RvdWJsZScKKyAgICB2YWwgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2JpbmFyeQorICAgIHAgJ3Rlc3RfYmluYXJ5JworICAgIHZhbCA9ICgwLi4uMjU2KS5yZXZlcnNlX2VhY2gudG9fYQorICAgIHJldCA9IEBjbGllbnQudGVzdEJpbmFyeSh2YWwucGFjaygnQyonKSkKKyAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQuYnl0ZXMudG9fYSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwCisgICAgcCAndGVzdF9tYXAnCisgICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9CisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19tYXAKKyAgICBwICd0ZXN0X3N0cmluZ19tYXAnCisgICAgdmFsID0geydhJyA9PiAnMicsICdiJyA9PiAnYmxhaCcsICdzb21lJyA9PiAndGhpbmcnfQorICAgIHJldCA9IEBjbGllbnQudGVzdFN0cmluZ01hcCh2YWwpCisgICAgYXNzZXJ0X2VxdWFsKHZhbCwgcmV0KQorICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdAorICAgIHAgJ3Rlc3RfbGlzdCcKKyAgICB2YWwgPSBbMSwyLDMsNCw1XQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQorICBlbmQKKworICBkZWYgdGVzdF9lbnVtCisgICAgcCAndGVzdF9lbnVtJworICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCisgICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCisKKyAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQorICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF90eXBlZGVmCisgICAgcCAndGVzdF90eXBlZGVmJworICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSwgMzA5ODU4MjM1MDgyNTIzKQorICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgQGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpKQorICAgIHRydWUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2V0CisgICAgcCAndGVzdF9zZXQnCisgICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQorICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCisgIGVuZAorCisgIGRlZiBnZXRfc3RydWN0CisgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQorICBlbmQKKworICBkZWYgdGVzdF9zdHJ1Y3QKKyAgICBwICd0ZXN0X3N0cnVjdCcKKyAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKKworICAgICMgVE9ETzogbm90IHN1cmUgd2hhdCB1bnNwZWNpZmllZCAiZGVmYXVsdCIgcmVxdWlyZWRuZXNzIHZhbHVlcyBzaG91bGQgYmUKKyAgICBhc3NlcnQocmV0LmJ5dGVfdGhpbmcgPT0gbmlsIHx8IHJldC5ieXRlX3RoaW5nID09IDApCisgICAgYXNzZXJ0KHJldC5pNjRfdGhpbmcgPT0gbmlsIHx8IHJldC5pNjRfdGhpbmcgPT0gMCkKKworICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKKyAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKKyAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0CisgICAgcCAndGVzdF9uZXN0JworICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCisKKyAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCisKKyAgICAjIFRPRE86IG5vdCBzdXJlIHdoYXQgdW5zcGVjaWZpZWQgImRlZmF1bHQiIHJlcXVpcmVkbmVzcyB2YWx1ZXMgc2hvdWxkIGJlCisgICAgYXNzZXJ0KHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyA9PSBuaWwgfHwgcmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nID09IDApCisgICAgYXNzZXJ0KHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nID09IG5pbCB8fCByZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyA9PSAwKQorCisgICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKKyAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCisgICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQorCisgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCisgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luc2FuaXR5CisgICAgcCAndGVzdF9pbnNhbml0eScKKyAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7CisgICAgICAndXNlck1hcCcgPT4geworICAgICAgICBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkZJVkUgPT4gNSwKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4LAorICAgICAgfSwKKyAgICAgICd4dHJ1Y3RzJyA9PiBbCisgICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0dvb2RieWU0JywKKyAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAorICAgICAgICAgICdpNjRfdGhpbmcnID0+IDQsCisgICAgICAgIH0pLAorICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeworICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAorICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCisgICAgICAgICAgJ2k2NF90aGluZycgPT4gMiwKKyAgICAgICAgfSkKKyAgICAgIF0KKyAgICB9KQorCisgICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQorCisgICAgYXNzZXJ0X2VxdWFsKGluc2FuZSwgcmV0WzFdWzJdKQorICAgIGFzc2VydF9lcXVhbChpbnNhbmUsIHJldFsxXVszXSkKKworICAgIGFzc2VydChyZXRbMl1bNl0udXNlck1hcCA9PSBuaWwgfHwgcmV0WzJdWzZdLnVzZXJNYXAubGVuZ3RoID09IDApCisgICAgYXNzZXJ0KHJldFsyXVs2XS54dHJ1Y3RzID09IG5pbCB8fCByZXRbMl1bNl0ueHRydWN0cy5sZW5ndGggPT0gMCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX21hcAorICAgIHAgJ3Rlc3RfbWFwX21hcCcKKyAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKKyAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCisgICAgZXhwZWN0ZWQgPSB7CisgICAgICAtNCA9PiB7CisgICAgICAgIC00ID0+IC00LAorICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgLTIgPT4gLTIsCisgICAgICAgIC0xID0+IC0xLAorICAgICAgfSwKKyAgICAgIDQgPT4geworICAgICAgICA0ID0+IDQsCisgICAgICAgIDMgPT4gMywKKyAgICAgICAgMiA9PiAyLAorICAgICAgICAxID0+IDEsCisgICAgICB9CisgICAgfQorICAgIGFzc2VydF9lcXVhbChleHBlY3RlZCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aQorICAgIHAgJ3Rlc3RfbXVsdGknCisgICAgcmV0ID0gQGNsaWVudC50ZXN0TXVsdGkoNDIsIDQyNDIsIDQyNDI0MiwgezEgPT4gJ2JsYWgnLCAyID0+ICd0aGluZyd9LCBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkVJR0hULCAyNCkKKyAgICBleHBlY3RlZCA9IFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICA6c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLAorICAgICAgOmJ5dGVfdGhpbmcgPT4gICA0MiwKKyAgICAgIDppMzJfdGhpbmcgPT4gICAgNDI0MiwKKyAgICAgIDppNjRfdGhpbmcgPT4gICAgNDI0MjQyCisgICAgfSkKKyAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uCisgICAgcCAndGVzdF9leGNlcHRpb24nCisgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KKyAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgIGVuZAorICAgIGJlZ2luCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQorICAgIHJlc2N1ZSA9PiBlCisgICAgICBhc3NlcnQgZS5jbGFzcy5hbmNlc3RvcnMuaW5jbHVkZT8oVGhyaWZ0OjpFeGNlcHRpb24pCisgICAgZW5kCisgICAgYXNzZXJ0X25vdGhpbmdfcmFpc2VkIGRvCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rlc3QnKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aV9leGNlcHRpb24KKyAgICBwICd0ZXN0X211bHRpX2V4Y2VwdGlvbicKKyAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbworICAgICAgQGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24yIGRvCisgICAgICBAY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgInRlc3QgMiIpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsKCBAY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiU3VjY2VzcyIsICJ0ZXN0IDMiKS5zdHJpbmdfdGhpbmcsICJ0ZXN0IDMiKQorICBlbmQKKworICBkZWYgdGVzdF9vbmV3YXkKKyAgICBwICd0ZXN0X29uZXdheScKKyAgICB0aW1lMSA9IFRpbWUubm93LnRvX2YKKyAgICBAY2xpZW50LnRlc3RPbmV3YXkoMSkKKyAgICB0aW1lMiA9IFRpbWUubm93LnRvX2YKKyAgICBhc3NlcnRfb3BlcmF0b3IgKHRpbWUyLXRpbWUxKSwgOjwsIDAuMQorICBlbmQKKworZW5kCisKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2FmNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCkBAIC0wLDAgKzEsMTg4IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCiskOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uJworCityZXF1aXJlICd0ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdF90ZXN0JworcmVxdWlyZSAndGhyaWZ0X3Rlc3RfdHlwZXMnCisKK2NsYXNzIFNpbXBsZUhhbmRsZXIKKyAgWzp0ZXN0Vm9pZCwgOnRlc3RTdHJpbmcsIDp0ZXN0Qm9vbCwgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLCA6dGVzdEJpbmFyeSwKKyAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTdHJpbmdNYXAsIDp0ZXN0U2V0LCA6dGVzdExpc3QsIDp0ZXN0TmVzdCwgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWYsCisgICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwgOnRlc3RNdWx0aUV4Y2VwdGlvbl0uZWFjaCBkbyB8bWV0aHwKKworICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAorICAgICAgcCBtZXRoCisgICAgICBwIHRoaW5nCisgICAgICB0aGluZworICAgIGVuZAorCisgIGVuZAorCisgIGRlZiB0ZXN0Vm9pZCgpCisgIGVuZAorCisgIGRlZiB0ZXN0SW5zYW5pdHkodGhpbmcpCisgICAgcmV0dXJuIHsKKyAgICAgIDEgPT4geworICAgICAgICAyID0+IHRoaW5nLAorICAgICAgICAzID0+IHRoaW5nCisgICAgICB9LAorICAgICAgMiA9PiB7CisgICAgICAgIDYgPT4gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eTo6bmV3KCkKKyAgICAgIH0KKyAgICB9CisgIGVuZAorCisgIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQorICAgIHJldHVybiB7CisgICAgICAtNCA9PiB7CisgICAgICAgIC00ID0+IC00LAorICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgLTIgPT4gLTIsCisgICAgICAgIC0xID0+IC0xLAorICAgICAgfSwKKyAgICAgIDQgPT4geworICAgICAgICA0ID0+IDQsCisgICAgICAgIDMgPT4gMywKKyAgICAgICAgMiA9PiAyLAorICAgICAgICAxID0+IDEsCisgICAgICB9CisgICAgfQorICBlbmQKKworICBkZWYgdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCisgICAgcmV0dXJuIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICdieXRlX3RoaW5nJyA9PiBhcmcwLAorICAgICAgJ2kzMl90aGluZycgPT4gYXJnMSwKKyAgICAgICdpNjRfdGhpbmcnID0+IGFyZzIsCisgICAgfSkKKyAgZW5kCisKKyAgZGVmIHRlc3RFeGNlcHRpb24odGhpbmcpCisgICAgaWYgdGhpbmcgPT0gIlhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOmVycm9yQ29kZSA9PiAxMDAxLCA6bWVzc2FnZSA9PiB0aGluZworICAgIGVsc2lmIHRoaW5nID09ICJURXhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24sIDptZXNzYWdlID0+IHRoaW5nCisgICAgZWxzZQorICAgICAgIyBuby1vcAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpCisgICAgaWYgYXJnMCA9PSAiWGNlcHRpb24yIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbjIsIDplcnJvckNvZGUgPT4gMjAwMiwgOnN0cnVjdF90aGluZyA9PiA6OlRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7IDpzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJyB9KQorICAgIGVsc2lmIGFyZzAgPT0gIlhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOmVycm9yQ29kZSA9PiAxMDAxLCA6bWVzc2FnZSA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbicKKyAgICBlbHNlCisgICAgICByZXR1cm4gOjpUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+IGFyZzF9KQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdE9uZXdheShhcmcwKQorICAgIHNsZWVwKGFyZzApCisgIGVuZAorCitlbmQKKworZG9tYWluX3NvY2tldCA9IG5pbAorcG9ydCA9IDkwOTAKK3Byb3RvY29sID0gImJpbmFyeSIKK0Bwcm90b2NvbEZhY3RvcnkgPSBuaWwKK3NzbCA9IGZhbHNlCit0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCitAdHJhbnNwb3J0RmFjdG9yeSA9IG5pbAorCitBUkdWLmVhY2ggZG98YXwKKyAgaWYgYSA9PSAiLS1oZWxwIgorICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCisgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKKyAgICBwdXRzICJcdC0tZG9tYWluLXNvY2tldCBhcmcgKD0pIFx0IFVuaXggZG9tYWluIHNvY2tldCBwYXRoIgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKKyAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgZG9tYWluX3NvY2tldCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKKyAgICBwcm90b2NvbCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICBzc2wgPSB0cnVlCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKKyAgICB0cmFuc3BvcnQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wb3J0IikKKyAgICBwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kgCisgIGVuZAorZW5kCisKK2lmIHByb3RvY29sID09ICJiaW5hcnkiIHx8IHByb3RvY29sLnRvX3Muc3RyaXAuZW1wdHk/CisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKK2Vsc2lmIHByb3RvY29sID09ICJjb21wYWN0IgorICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldworZWxzaWYgcHJvdG9jb2wgPT0gImpzb24iCisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3CitlbHNpZiBwcm90b2NvbCA9PSAiYWNjZWwiCisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldworZWxzZQorICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJworZW5kCisKK2lmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiIHx8IHRyYW5zcG9ydC50b19zLnN0cmlwLmVtcHR5PworICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworZWxzaWYgdHJhbnNwb3J0ID09ICJmcmFtZWQiCisgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworZWxzZQorICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKK2VuZAorCitAaGFuZGxlciA9IFNpbXBsZUhhbmRsZXIubmV3CitAcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQorQHRyYW5zcG9ydCA9IG5pbAoraWYgZG9tYWluX3NvY2tldC50b19zLnN0cmlwLmVtcHR5PworICBpZiBzc2wKKyAgICAjIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgcnVieSBjcm9zc3Rlc3QgaXMgdGVzdC9yYi9nZW4tcmIKKyAgICBrZXlzRGlyID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShGaWxlLmRpcm5hbWUoRGlyLnB3ZCkpLCAia2V5cyIpCisgICAgY3R4ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgIGN0eC5jYV9maWxlID0gRmlsZS5qb2luKGtleXNEaXIsICJDQS5wZW0iKQorICAgIGN0eC5jZXJ0ID0gT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5jcnQiKSkpCisgICAgY3R4LmNlcnRfc3RvcmUgPSBPcGVuU1NMOjpYNTA5OjpTdG9yZS5uZXcKKyAgICBjdHguY2VydF9zdG9yZS5hZGRfZmlsZShGaWxlLmpvaW4oa2V5c0RpciwgJ2NsaWVudC5wZW0nKSkKKyAgICBjdHgua2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJzZXJ2ZXIua2V5IikpKQorICAgIGN0eC5vcHRpb25zID0gT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MiB8IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjMKKyAgICBjdHguc3NsX3ZlcnNpb24gPSA6U1NMdjIzCisgICAgY3R4LnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUgorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcobmlsLCBwb3J0LCBjdHgpCisgIGVsc2UKKyAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KHBvcnQpCisgIGVuZAorZWxzZQorICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpVTklYU2VydmVyU29ja2V0Lm5ldyhkb21haW5fc29ja2V0KQorZW5kCisKK0BzZXJ2ZXIgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0LCBAdHJhbnNwb3J0RmFjdG9yeSwgQHByb3RvY29sRmFjdG9yeSkKKworcHV0cyAiU3RhcnRpbmcgVGVzdFNlcnZlciAje0BzZXJ2ZXIudG9fc30iCitAc2VydmVyLnNlcnZlCitwdXRzICJkb25lLiIKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfY2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9jbGllbnQucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWMxZGYuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIEFjY2VsZXJhdGVkQnVmZmVyZWRDbGllbnRUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLSAgZGVmIHNldHVwCi0gICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5uZXcoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotICAKLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLWVuZAotCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX3NlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfc2VydmVyLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E2NmU1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfc2VydmVyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vZ2VuLXJiJwotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9saWInKQotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9leHQnKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBTaW1wbGVIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi1lbmQKLQotQGhhbmRsZXIgICA9IFNpbXBsZUhhbmRsZXIubmV3Ci1AcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyg5MDkwKQotQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldywgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCi0KLUBzZXJ2ZXIuc2VydmUKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYnVmZmVyZWRfY2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9idWZmZXJlZF9jbGllbnQucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTI1Y2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9idWZmZXJlZF9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIEJ1ZmZlcmVkQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0gIGRlZiBzZXR1cAotICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDkwOTApCi0gICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KSkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0gIAotICBkZWYgdGVzdF9zdHJpbmcKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U3RyaW5nKCdzdHJpbmcnKSwgJ3N0cmluZycpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pMzIKLSAgICB2YWwgPSAzMgotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2k2NAotICAgIHZhbCA9IDY0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9tYXAKLSAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbGlzdAotICAgIHZhbCA9IFsxLDIsMyw0LDVdCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2VudW0KLSAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAotICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQotCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKLSAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdHlwZWRlZgotICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCi0gICAgdHJ1ZQotICBlbmQKLQotICBkZWYgdGVzdF9zZXQKLSAgICB2YWwgPSBTZXQubmV3KFsxLDIsM10pCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFNldCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX2NsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX2NsaWVudC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2NDgyMi4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFNpbXBsZUNsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAgICAgCi0gICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KEBzb2NrZXQpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotICAKLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLWVuZAotCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9zZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9zZXJ2ZXIucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MThkMmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfc2VydmVyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vZ2VuLXJiJwotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9saWInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBTaW1wbGVIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi1lbmQKLQotQGhhbmRsZXIgICA9IFNpbXBsZUhhbmRsZXIubmV3Ci1AcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyg5MDkwKQotQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQpCi0KLUBzZXJ2ZXIuc2VydmUKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vdGVzdF9zaW1wbGVfaGFuZGxlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vdGVzdF9zaW1wbGVfaGFuZGxlci5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0YWE3ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL3Rlc3Rfc2ltcGxlX2hhbmRsZXIucmIKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFRlc3RIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi0KLWVuZAotY2xhc3MgVGVzdFRocmlmdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0KLSAgQEBJTklUID0gbmlsCi0KLSAgZGVmIHNldHVwCi0gICAgaWYgQEBJTklULm5pbD8KLSAgICAgICMgSW5pdGlhbGl6ZSB0aGUgc2VydmVyCi0gICAgICBAaGFuZGxlciAgID0gVGVzdEhhbmRsZXIubmV3KCkKLSAgICAgIEBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi0gICAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDkwOTApCi0gICAgICBAc2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCkKLQotICAgICAgQHRocmVhZCAgICA9IFRocmVhZC5uZXcgeyBAc2VydmVyLnNlcnZlIH0KLQotICAgICAgIyBBbmQgdGhlIENsaWVudAotICAgICAgQHNvY2tldCAgID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA5MDkwKQotICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoQHNvY2tldCkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwgMiwgM10pCi0gICAgYXNzZXJ0X2VxdWFsKHZhbCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZWFyZG93bgotICBlbmQKLQotZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggYi90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NjlmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vYmFzaAorCitpZiBbIC16ICQxIF07IHRoZW4KKyAgZWNobyBVc2FnZTogJDAgTEFOR1VBR0UKKyAgZWNobyBSZS1saXN0IGFsbCBmYWlsdXJlcyBvZiBhIHNwZWNpZmljIExBTkdVQUdFIGludG8ga25vd25fZmFpbHVyZXNfTGludXguanNvbgorICBlY2hvIExBTkdVQUdFIHNob3VsZCBiZSBsaWJyYXJ5IG5hbWUgbGlrZSBjcHAsIGphdmEsIHB5IGV0YworICBleGl0IDEKK2ZpCisKK2lmIFsgLXogJFBZVEhPTl07IHRoZW4KKyAgUFlUSE9OPXB5dGhvbgorZmkKKworVEFSR0VUX0xBTkc9JDEKK09VVF9GSUxFPWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KK2VjaG8gUmVidWlsZGluZyBrbm93biBmYWlsdXJlcyBmb3IgJFRBUkdFVF9MQU5HCisKK1RNUEZJTEU9Ll9fdG1wX19yZWJ1aWxkX18KK2dyZXAgLXYgLWUgIlwiJDEtIiAtZSAiXC0kMV8iICRPVVRfRklMRSA+ICRUTVBGSUxFCittdiAkVE1QRklMRSAkT1VUX0ZJTEUKKyRQWVRIT04gdGVzdC5weSAtLWNsaWVudCAkMQorJFBZVEhPTiB0ZXN0LnB5IC1VIG1lcmdlCiskUFlUSE9OIHRlc3QucHkgLS1zZXJ2ZXIgJDEKKyRQWVRIT04gdGVzdC5weSAtVSBtZXJnZQpkaWZmIC0tZ2l0IGEvdGVzdC9yZXN1bHQuanMgYi90ZXN0L3Jlc3VsdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGIxYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZXN1bHQuanMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyQuZ2V0SlNPTigncmVzdWx0cy5qc29uJywgZnVuY3Rpb24ocmVzdWx0cykgeworICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgdHJhbnNwb3J0ID0gMzsKKyAgICAgICAgdmFyIHNvY2tldCA9IDQ7CisgICAgICAgIHZhciBzdWNjZXNzID0gNTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gNjsKKyAgICAgICAgdmFyIHJldHVybkNvZGUgPSA3OworICAgICAgICB2YXIgbG9nRmlsZSA9IDg7CisgICAgICAgIHRlc3RUYWJsZSA9ICQoJyN0ZXN0X3Jlc3VsdHMnKS5EYXRhVGFibGUoeworICAgICAgICAgICAgZGF0YTogcmVzdWx0c1sncmVzdWx0cyddLAorICAgICAgICAgICAgY29sdW1uRGVmczogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogMywKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dbdHJhbnNwb3J0XSArICctJyArIHJvd1tzb2NrZXRdOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA0LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyb3dbc3VjY2Vzc10gPyAnc3VjY2VzcycgOiAnZmFpbHVyZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJygnICsgKHJvd1tyZXR1cm5Db2RlXSA9PSAxMjggPyAndGltZW91dCcgOiByb3dbcmV0dXJuQ29kZV0pICsgJyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyg8YSBocmVmPSInICsgcm93W2xvZ0ZpbGVdLnNlcnZlciArICciPlNlcnZlcjwvYT4sICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5jbGllbnQgKyAnIj5DbGllbnQ8L2E+KSc7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDUsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAneWVzJyByYXRoZXIgdGhhbiAnZXhwZWN0ZWQnIHRvIGVhc2Ugc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W2V4cGVjdGVkXSA/ICd5ZXMnIDogJ3VuZXhwZWN0ZWQnOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgIH0pOworICAgICAgICAkKCcjdGVzdF9yZXN1bHRzX2ZpbHRlciBsYWJlbCBpbnB1dCcpLmZvY3VzKCkudmFsKCd1bmV4cGVjdGVkIGZhaWx1cmUnKTsKKyAgICAgICAgJCgnI3Rlc3RfaW5mbycpLnRleHQoCisgICAgICAgICAgICAiVGVzdCBEYXRlOiAgICAgIiArIHJlc3VsdHNbJ2RhdGUnXSArICJcbiIgKworICAgICAgICAgICAgIlJldmlzaW9uOiAgICAgICIgKyByZXN1bHRzWydyZXZpc2lvbiddICsgIlxuIiArCisgICAgICAgICAgICAiUGxhdGZvcm06ICAgICAgIiArIHJlc3VsdHNbJ3BsYXRmb3JtJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJUZXN0IGR1cmF0aW9uOiAiICsgcmVzdWx0c1snZHVyYXRpb24nXSkgKyAiIHNlY29uZHMiOworICAgIH0pOworfSk7CisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvQ2FyZ28udG9tbCBiL3Rlc3QvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM1ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTcgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdGVzdCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitlbnZfbG9nZ2VyID0gIjAuNC4wIgorbG9nID0gIjAuMy43Igorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vLi4vbGliL3JzIgorCmRpZmYgLS1naXQgYS90ZXN0L3JzL01ha2VmaWxlLmFtIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkwNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwcmVjcm9zczogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL3Rlc3Rfc2VydmVyIGJpbi90ZXN0X3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X2NsaWVudCBiaW4vdGVzdF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvdGhyaWZ0X3Rlc3QucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisgICAgICAgIHNyYy9saWIucnMgXAorCXNyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdGVzdF9jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjViODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMKQEAgLTAsMCArMSw2MDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworZXh0ZXJuIGNyYXRlIGVudl9sb2dnZXI7CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3Rlc3Q7IC8vIGh1aC4gSSBoYXZlIHRvIGRvIHRoaXMgdG8gdXNlIG15IGxpYgorCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydCwgV3JpdGVIYWxmfTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBjbGllbnQiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLWFub24tcGlwZXMKKyAgICAvLyAtLXNzbAorICAgIC8vIC0tdGhyZWFkcworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAiVGhyaWZ0IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHRlc3Rsb29wczogLW4gLS10ZXN0bG9vcHMgK3Rha2VzX3ZhbHVlICJOdW1iZXIgb2YgdGltZXMgdG8gcnVuIHRlc3RzIikKKyAgICApCisgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHRlc3Rsb29wcyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ0ZXN0bG9vcHMiLCB1OCkudW53cmFwX29yKDEpOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworCisKKyAgICBsZXQgbXV0IHRocmlmdF90ZXN0X2NsaWVudCA9IHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlRocmlmdFRlc3QiKT87CisgICAgICAgIFRocmlmdFRlc3RTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpCisgICAgfTsKKworICAgIGxldCBtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50ID0gaWYgcHJvdG9jb2wuc3RhcnRzX3dpdGgoIm11bHRpIikgeworICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IGJ1aWxkX3Byb3RvY29scyhob3N0LCBwb3J0LCB0cmFuc3BvcnQsIHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpPzsKKyAgICAgICAgU29tZShTZWNvbmRTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KSkKKyAgICB9IGVsc2UgeworICAgICAgICBOb25lCisgICAgfTsKKworICAgIGluZm8hKAorICAgICAgICAiY29ubmVjdGluZyB0byB7fTp7fSB3aXRoIHt9K3t9IHN0YWNrIiwKKyAgICAgICAgaG9zdCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgcHJvdG9jb2wsCisgICAgICAgIHRyYW5zcG9ydAorICAgICk7CisKKyAgICBmb3IgXyBpbiAwLi50ZXN0bG9vcHMgeworICAgICAgICBtYWtlX3RocmlmdF9jYWxscygmbXV0IHRocmlmdF90ZXN0X2NsaWVudCwgJm11dCBzZWNvbmRfc2VydmljZV9jbGllbnQpPworICAgIH0KKworICAgIE9rKCgpKQorfQorCitmbiBidWlsZF9wcm90b2NvbHMoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCisgICAgdHJhbnNwb3J0OiAmc3RyLAorICAgIHByb3RvY29sOiAmc3RyLAorICAgIHNlcnZpY2VfbmFtZTogJnN0ciwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KT4geworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gdGNwX2NoYW5uZWwoaG9zdCwgcG9ydCk/OworCisgICAgbGV0IChpX3RyYW4sIG9fdHJhbik6IChCb3g8VFJlYWRUcmFuc3BvcnQ+LCBCb3g8VFdyaXRlVHJhbnNwb3J0PikgPSBtYXRjaCB0cmFuc3BvcnQgeworICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIGxldCAoaV9wcm90LCBvX3Byb3QpOiAoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pID0gbWF0Y2ggcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGkiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgIEJveDo6bmV3KAorICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgICAgICAiY29tcGFjdCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGljIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldyhzZXJ2aWNlX25hbWUsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSwpKQorICAgICAgICB9CisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorfQorCisvLyBGSVhNRTogZXhwb3NlICJvcGVuIiB0aHJvdWdoIHRoZSBjbGllbnQgaW50ZXJmYWNlIHNvIEkgZG9uJ3QgaGF2ZSB0byBlYXJseQorLy8gb3BlbgorZm4gdGNwX2NoYW5uZWwoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PChSZWFkSGFsZjxUVGNwQ2hhbm5lbD4sIFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4pPiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworICAgIGMuc3BsaXQoKQorfQorCit0eXBlIEJ1aWxkVGhyaWZ0VGVzdENsaWVudCA9IFRocmlmdFRlc3RTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKK3R5cGUgQnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50ID0gU2Vjb25kU2VydmljZVN5bmNDbGllbnQ8Qm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4+OworCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY3ljbG9tYXRpY19jb21wbGV4aXR5KSldCitmbiBtYWtlX3RocmlmdF9jYWxscygKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQ6ICZtdXQgQnVpbGRUaHJpZnRUZXN0Q2xpZW50LAorICAgIHNlY29uZF9zZXJ2aWNlX2NsaWVudDogJm11dCBPcHRpb248QnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50PiwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoInRlc3RWb2lkIik7CisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfdm9pZCgpPzsKKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nKCJ0aGluZyIudG9fb3duZWQoKSksCisgICAgICAgICJ0aGluZyIudG9fb3duZWQoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbCh0cnVlKSwgdHJ1ZSk/OworCisgICAgaW5mbyEoInRlc3RCb29sIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9ib29sKGZhbHNlKSwgZmFsc2UpPzsKKworICAgIGluZm8hKCJ0ZXN0Qnl0ZSIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYnl0ZSg0MiksIDQyKT87CisKKyAgICBpbmZvISgidGVzdGkzMiIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTMyKDExNTkzNDgzNzQpLCAxMTU5MzQ4Mzc0KT87CisKKyAgICBpbmZvISgidGVzdGk2NCIpOworICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pNjQoLTg2NTE4Mjk4Nzk0MzgyOTQ1NjUpLAorICAgIC8vIC04NjUxODI5ODc5NDM4Mjk0NTY1KSk7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KGk2NDo6bWluX3ZhbHVlKCkpLAorICAgICAgICBpNjQ6Om1pbl92YWx1ZSgpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3REb3VibGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9kb3VibGUoT3JkZXJlZEZsb2F0Ojpmcm9tKDQyLjQyKSksCisgICAgICAgIE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MiksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdFR5cGVkZWYiKTsKKyAgICB7CisgICAgICAgIGxldCB1X3NuZDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgbGV0IHVfY21wOiBVc2VySWQgPSAyMzQ4OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3R5cGVkZWYodV9zbmQpLCB1X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RW51bSIpOworICAgIHsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9lbnVtKE51bWJlcno6OlR3byksIE51bWJlcno6OlR3byk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0QmluYXJ5Iik7CisgICAgeworICAgICAgICBsZXQgYl9zbmQgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICBsZXQgYl9jbXAgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2JpbmFyeShiX3NuZCksIGJfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTdHJ1Y3QiKTsKKyAgICB7CisgICAgICAgIGxldCB4X3NuZCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMTIpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIxOTEyOSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cnVjdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gWHRydWN0IGFnYWluLCB3aXRoIG9wdGlvbmFsIHZhbHVlcworICAgIC8vIEZJWE1FOiBhcHBhcmVudGx5IHRoZSBlcmxhbmcgdGhyaWZ0IHNlcnZlciBkb2VzIG5vdCBsaWtlIG9wdC1pbi1yZXEtb3V0CisgICAgLy8gcGFyYW1ldGVycyB0aGF0IGFyZSB1bmRlZmluZWQuIEpveS4KKyAgICAvLyB7CisgICAgLy8gbGV0IHhfc25kID0gWHRydWN0IHsgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLCBieXRlX3RoaW5nOiBOb25lLAorICAgIC8vIGkzMl90aGluZzogTm9uZSwgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSB9OworICAgIC8vIGxldCB4X2NtcCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzoKKyAgICAvLyBTb21lKDApLCBpMzJfdGhpbmc6IFNvbWUoMCksIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsgLy8gdGhlIEMrKworICAgIC8vIHNlcnZlciBpcyByZXNwb25kaW5nIGNvcnJlY3RseQorICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCkpOworICAgIC8vIH0KKyAgICAvLworCisgICAgaW5mbyEoInRlc3ROZXN0Iik7IC8vIChGSVhNRTogdHJ5IFh0cnVjdDIgd2l0aCBvcHRpb25hbCB2YWx1ZXMpCisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QyIHsKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMzIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDMyNDM4MjA5OCksCisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjkzNDgxMDk4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbmVzdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gZG8gdGhlIG11bHRpcGxleGVkIGNhbGxzIHdoaWxlIG1ha2luZyB0aGUgbWFpbiBUaHJpZnRUZXN0IGNhbGxzCisgICAgaWYgbGV0IFNvbWUocmVmIG11dCBjbGllbnQpID0gc2Vjb25kX3NlcnZpY2VfY2xpZW50LmFzX211dCgpIHsKKyAgICAgICAgaW5mbyEoIlNlY29uZFNlcnZpY2Ugc2Vjb25kdGVzdFN0cmluZyIpOworICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICAgICAgICAgIGNsaWVudC5zZWNvbmR0ZXN0X3N0cmluZygidGVzdF9zdHJpbmciLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICJ0ZXN0U3RyaW5nKFwidGVzdF9zdHJpbmdcIikiLnRvX293bmVkKCksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TGlzdCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCB2X3NuZDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X3NuZC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9zbmQucHVzaCgyMzgpOworICAgICAgICB2X3NuZC5wdXNoKDMyNDk4KTsKKworICAgICAgICBsZXQgbXV0IHZfY21wOiBWZWM8aTMyPiA9IFZlYzo6bmV3KCk7CisgICAgICAgIHZfY21wLnB1c2goMjkzODQpOworICAgICAgICB2X2NtcC5wdXNoKDIzOCk7CisgICAgICAgIHZfY21wLnB1c2goMzI0OTgpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbGlzdCh2X3NuZCksIHZfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTZXQiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgc19zbmQ6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfc25kLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjMpOworICAgICAgICBzX3NuZC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcDogQlRyZWVTZXQ8aTMyPiA9IEJUcmVlU2V0OjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDI5MzQ4MSk7CisgICAgICAgIHNfY21wLmluc2VydCgyMyk7CisgICAgICAgIHNfY21wLmluc2VydCgzMjM0KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3NldChzX3NuZCksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDIsIDQpOworICAgICAgICBtX3NuZC5pbnNlcnQoNCwgNik7CisgICAgICAgIG1fc25kLmluc2VydCg4LCA3KTsKKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX2NtcC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tYXAobV9zbmQpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgiMiIudG9fb3duZWQoKSwgIjRfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI0Ii50b19vd25lZCgpLCAiNl9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjgiLnRvX293bmVkKCksICI3X3N0cmluZyIudG9fb3duZWQoKSk7CisKKyAgICAgICAgbGV0IG11dCBtX3JjdjogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nX21hcChtX3NuZCksIG1fcmN2KT87CisgICAgfQorCisgICAgLy8gbmVzdGVkIG1hcAorICAgIC8vIGV4cGVjdCA6IHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMgorICAgIC8vID0+IDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisgICAgaW5mbyEoInRlc3RNYXBNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gKC00IGFzIGkzMikuLjAgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gMS4uNSB7CisgICAgICAgICAgICBtX2NtcF9uZXN0ZWRfMS5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgtNCwgbV9jbXBfbmVzdGVkXzApOworICAgICAgICBtX2NtcC5pbnNlcnQoNCwgbV9jbXBfbmVzdGVkXzEpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwX21hcCg0MiksIG1fY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aSIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8aTE2LCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoMTI5OCwgImZpenoiLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoLTE0OCwgImJ1enoiLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBzX2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKC0xMjM5NDgpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xOTIzNDEyMzk4MSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpKDEsIC0xMjM5NDgsIC0xOTIzNDEyMzk4MSwgbV9zbmQsIE51bWJlcno6OkVpZ2h0LCA4MSksCisgICAgICAgICAgICBzX2NtcCwKKyAgICAgICAgKT87CisgICAgfQorCisgICAgLy8gSW5zYW5pdHkKKyAgICAvLyByZXR1cm5zOgorICAgIC8vIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLyAgICAgICAgfSwKKyAgICAvLyAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vIH0KKyAgICB7CisgICAgICAgIGxldCBtdXQgYXJnX21hcF91c2VybWFwOiBCVHJlZU1hcDxOdW1iZXJ6LCBpNjQ+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6Ok9uZSwgNDI4OSk7CisgICAgICAgIGFyZ19tYXBfdXNlcm1hcC5pbnNlcnQoTnVtYmVyejo6RWlnaHQsIDE5KTsKKworICAgICAgICBsZXQgbXV0IGFyZ192ZWNfeHRydWN0czogVmVjPFh0cnVjdD4gPSBWZWM6Om5ldygpOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5KSwKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoOTIzODQpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiYmFyIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDI4KSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMiksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjgxKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJheiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzk0ODUzOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjkzODQ5MiksCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoYXJnX21hcF91c2VybWFwKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoYXJnX3ZlY194dHJ1Y3RzKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzEuaW5zZXJ0KE51bWJlcno6OlR3bywgaW5zYW5pdHkuY2xvbmUoKSk7CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgaW5zYW5pdHkuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcF9uZXN0ZWRfMjogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgZW1wdHlfaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogU29tZShCVHJlZU1hcDo6bmV3KCkpLAorICAgICAgICAgICAgeHRydWN0czogU29tZShWZWM6Om5ldygpKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzIuaW5zZXJ0KE51bWJlcno6OlNpeCwgZW1wdHlfaW5zYW5pdHkpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDEgYXMgVXNlcklkLCBzX2NtcF9uZXN0ZWRfMSk7CisgICAgICAgIHNfY21wLmluc2VydCgyIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzIpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaW5zYW5pdHkoaW5zYW5pdHkuY2xvbmUoKSksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiWGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgJnhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlRFeGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBpbmZvISgicmVjZWl2ZWQgYW4gezo/fSIsIGUpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJmb28iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIE9rKF8pID0+IE9rKCgpKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoInJlY2VpdmVkIGFuIGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9CisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aV9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24geworICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uMiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbjIiLnRvX293bmVkKCksICJpZ25vcmVkIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24yPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24yIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJoYWhhIi50b19vd25lZCgpLCAiUkVUVVJORUQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKGUpID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoInJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHs6P30iLCBlKS5pbnRvKCksKSwpLAorICAgICAgICAgICAgXyA9PiByLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJSRVRVUk5FRCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksIHhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RPbmVXYXkgLSByZW1vdGUgc2xlZXBzIGZvciAxIHNlY29uZCIpOworICAgIHsKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfb25ld2F5KDEpPzsKKyAgICB9CisKKyAgICAvLyBmaW5hbCB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIHdyaXRhYmxlIGFmdGVyIHRoZSBvbmUtd2F5CisgICAgLy8gY2FsbAorICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKQorfQorCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobmVlZGxlc3NfcGFzc19ieV92YWx1ZSkpXQorZm4gdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdDxUOiBEZWJ1ZyArIFBhcnRpYWxFcSArIFNpemVkPigKKyAgICBhY3R1YWw6IFJlc3VsdDxULCB0aHJpZnQ6OkVycm9yPiwKKyAgICBleHBlY3RlZDogVCwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoIioqKiBFWFBFQ1RFRDogT2soezo/fSkiLCBleHBlY3RlZCk7CisgICAgaW5mbyEoIioqKiBBQ1RVQUwgIDogezo/fSIsIGFjdHVhbCk7CisgICAgbWF0Y2ggYWN0dWFsIHsKKyAgICAgICAgT2sodikgPT4geworICAgICAgICAgICAgaWYgdiA9PSBleHBlY3RlZCB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBPSyAqKioiKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoZm9ybWF0ISgiZXhwZWN0ZWQgezo/fSBidXQgZ290IHs6P30iLCAmZXhwZWN0ZWQsICZ2KS5pbnRvKCkpLCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZSkgPT4gRXJyKGUpLAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMxZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3Rfc2VydmVyLnJzCkBAIC0wLDAgKzEsMzk4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OworCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6dGhyZWFkOwordXNlIHN0ZDo6dGltZTo6RHVyYXRpb247CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6e1RNdWx0aXBsZXhlZFByb2Nlc3NvciwgVFNlcnZlcn07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBzZXJ2ZXIiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisKKyAgICAvLyB1bnN1cHBvcnRlZCBvcHRpb25zOgorICAgIC8vIC0tZG9tYWluLXNvY2tldAorICAgIC8vIC0tbmFtZWQtcGlwZQorICAgIC8vIC0tc3NsCisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF90ZXN0X2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJSdXN0IFRocmlmdCB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAidHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAicHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2ZXJfdHlwZTogLS1zZXJ2ZXJfdHlwZSArdGFrZXNfdmFsdWUgInR5cGUgb2Ygc2VydmVyIGluc3RhbnRpYXRlZCAoXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiKSIpCisgICAgICAgIChAYXJnIHdvcmtlcnM6IC1uIC0td29ya2VycyArdGFrZXNfdmFsdWUgIm51bWJlciBvZiB0aHJlYWQtcG9vbCB3b3JrZXJzIChcIjRcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworICAgIGxldCBzZXJ2ZXJfdHlwZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZlcl90eXBlIikudW53cmFwX29yKCJ0aHJlYWQtcG9vbCIpOworICAgIGxldCB3b3JrZXJzID0gdmFsdWVfdCEobWF0Y2hlcywgIndvcmtlcnMiLCB1c2l6ZSkudW53cmFwX29yKDQpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgaW5mbyEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgKGlfdHJhbnNwb3J0X2ZhY3RvcnksIG9fdHJhbnNwb3J0X2ZhY3RvcnkpOiAoQm94PFRSZWFkVHJhbnNwb3J0RmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PikgPQorICAgICAgICBtYXRjaCAmKnRyYW5zcG9ydCB7CisgICAgICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJipwcm90b2NvbCB7CisgICAgICAgICAgICAiYmluYXJ5IiB8ICJtdWx0aSIgfCAibXVsdGk6YmluYXJ5IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiY29tcGFjdCIgfCAibXVsdGljIiB8ICJtdWx0aTpjb21wYWN0IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgbGV0IHRlc3RfcHJvY2Vzc29yID0gVGhyaWZ0VGVzdFN5bmNQcm9jZXNzb3I6Om5ldyhUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsIHt9KTsKKworICAgIG1hdGNoICYqc2VydmVyX3R5cGUgeworICAgICAgICAic2ltcGxlIiB8ICJ0aHJlYWQtcG9vbCIgPT4geworICAgICAgICAgICAgaWYgcHJvdG9jb2wgPT0gIm11bHRpIiB8fCBwcm90b2NvbCA9PSAibXVsdGljIiB7CisgICAgICAgICAgICAgICAgbGV0IHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciA9IFNlY29uZFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbCB7fSwpOworCisgICAgICAgICAgICAgICAgbGV0IG11dCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoIlRocmlmdFRlc3QiLCBCb3g6Om5ldyh0ZXN0X3Byb2Nlc3NvciksIHRydWUpPzsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJTZWNvbmRTZXJ2aWNlIiwgQm94OjpuZXcoc2Vjb25kX3NlcnZpY2VfcHJvY2Vzc29yKSwgZmFsc2UpPzsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIGlfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5rbm93biA9PiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgc2VydmVyIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworc3RydWN0IFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGw7CitpbXBsIFRocmlmdFRlc3RTeW5jSGFuZGxlciBmb3IgVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7CisgICAgZm4gaGFuZGxlX3Rlc3Rfdm9pZCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaW5mbyEoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RyaW5nKCZzZWxmLCB0aGluZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYm9vbCgmc2VsZiwgdGhpbmc6IGJvb2wpIC0+IHRocmlmdDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCb29sKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYnl0ZSgmc2VsZiwgdGhpbmc6IGk4KSAtPiB0aHJpZnQ6OlJlc3VsdDxpOD4geworICAgICAgICBpbmZvISgidGVzdEJ5dGUoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pMzIoJnNlbGYsIHRoaW5nOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBpbmZvISgidGVzdGkzMih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2k2NCgmc2VsZiwgdGhpbmc6IGk2NCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0aTY0KHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZG91YmxlKCZzZWxmLCB0aGluZzogT3JkZXJlZEZsb2F0PGY2ND4pIC0+IHRocmlmdDo6UmVzdWx0PE9yZGVyZWRGbG9hdDxmNjQ+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RG91YmxlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYmluYXJ5KCZzZWxmLCB0aGluZzogVmVjPHU4PikgLT4gdGhyaWZ0OjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBpbmZvISgidGVzdEJpbmFyeSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RydWN0KCZzZWxmLCB0aGluZzogWHRydWN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJ1Y3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X25lc3QoJnNlbGYsIHRoaW5nOiBYdHJ1Y3QyKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3QyPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TmVzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbWFwKCZzZWxmLCB0aGluZzogQlRyZWVNYXA8aTMyLCBpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIGkzMj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXAoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZ19tYXAoCisgICAgICAgICZzZWxmLAorICAgICAgICB0aGluZzogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zZXQoJnNlbGYsIHRoaW5nOiBCVHJlZVNldDxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZVNldDxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U2V0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9saXN0KCZzZWxmLCB0aGluZzogVmVjPGkzMj4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TGlzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZW51bSgmc2VsZiwgdGhpbmc6IE51bWJlcnopIC0+IHRocmlmdDo6UmVzdWx0PE51bWJlcno+IHsKKyAgICAgICAgaW5mbyEoInRlc3RFbnVtKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF90eXBlZGVmKCZzZWxmLCB0aGluZzogVXNlcklkKSAtPiB0aHJpZnQ6OlJlc3VsdDxVc2VySWQ+IHsKKyAgICAgICAgaW5mbyEoInRlc3RUeXBlZGVmKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgLy8vIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisgICAgLy8vIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PgorICAgIC8vLyAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGZuIGhhbmRsZV90ZXN0X21hcF9tYXAoJnNlbGYsIGhlbGxvOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPGkzMiwgQlRyZWVNYXA8aTMyLCBpMzI+Pj4geworICAgICAgICBpbmZvISgidGVzdE1hcE1hcCh7fSkiLCBoZWxsbyk7CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAtNC4uKDAgYXMgaTMyKSB7CisgICAgICAgICAgICBpbm5lcl9tYXBfMC5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IGlubmVyX21hcF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgaW5uZXJfbWFwXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCByZXRfbWFwOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KC00LCBpbm5lcl9tYXBfMCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KDQsIGlubmVyX21hcF8xKTsKKworICAgICAgICBPayhyZXRfbWFwKQorICAgIH0KKworICAgIC8vLyBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAvLy8gICAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8vICAgICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgIH0sCisgICAgLy8vICAgICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vLyAgICAgfQorICAgIC8vLyByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgIGZuIGhhbmRsZV90ZXN0X2luc2FuaXR5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgYXJndW1lbnQ6IEluc2FuaXR5LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0SW5zYW5pdHkoezo/fSkiLCBhcmd1bWVudCk7CisgICAgICAgIGxldCBtdXQgbWFwXzA6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbWFwXzAuaW5zZXJ0KE51bWJlcno6OlR3bywgYXJndW1lbnQuY2xvbmUoKSk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgYXJndW1lbnQuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBtYXBfMTogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogTm9uZSwKKyAgICAgICAgICAgIHh0cnVjdHM6IE5vbmUsCisgICAgICAgIH07CisgICAgICAgIG1hcF8xLmluc2VydChOdW1iZXJ6OjpTaXgsIGluc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHJldDogQlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXQuaW5zZXJ0KDEsIG1hcF8wKTsKKyAgICAgICAgcmV0Lmluc2VydCgyLCBtYXBfMSk7CisKKyAgICAgICAgT2socmV0KQorICAgIH0KKworICAgIC8vLyByZXR1cm5zIGFuIFh0cnVjdCB3aXRoOgorICAgIC8vLyBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yIiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEgYW5kCisgICAgLy8vIGk2NF90aGluZyA9IGFyZzIKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZzA6IGk4LAorICAgICAgICBhcmcxOiBpMzIsCisgICAgICAgIGFyZzI6IGk2NCwKKyAgICAgICAgXzogQlRyZWVNYXA8aTE2LCBTdHJpbmc+LAorICAgICAgICBfOiBOdW1iZXJ6LAorICAgICAgICBfOiBVc2VySWQsCisgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbGV0IHhfcmV0ID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiSGVsbG8yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoYXJnMCksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoYXJnMiksCisgICAgICAgIH07CisKKyAgICAgICAgT2soeF9yZXQpCisgICAgfQorCisgICAgLy8vIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9CisgICAgLy8vIGFyZworICAgIC8vLyBlbHNlIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgIC8vLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgIGZuIGhhbmRsZV90ZXN0X2V4Y2VwdGlvbigmc2VsZiwgYXJnOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uKHt9KSIsIGFyZyk7CisKKyAgICAgICAgbWF0Y2ggJiphcmcgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlRFeGNlcHRpb24iID0+IEVycigidGhpcyBpcyBhIHJhbmRvbSBlcnJvciIuaW50bygpKSwKKyAgICAgICAgICAgIF8gPT4gT2soKCkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGlmIGFyZzAgPT0gIlhjZXB0aW9uIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4KKyAgICAvLy8gWGNlcHRpb24iCisgICAgLy8vIGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9CisgICAgLy8vICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAvLyBlbHNlOgorICAgIC8vICAgZG8gbm90IHRocm93IGFueXRoaW5nIGFuZCByZXR1cm4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgIGZuIGhhbmRsZV90ZXN0X211bHRpX2V4Y2VwdGlvbigmc2VsZiwgYXJnMDogU3RyaW5nLCBhcmcxOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdD4geworICAgICAgICBtYXRjaCAmKmFyZzAgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiWGNlcHRpb24yIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgyMDAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBPaygKKyAgICAgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZShhcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfb25ld2F5KCZzZWxmLCBzZWNvbmRzX3RvX3NsZWVwOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHRocmVhZDo6c2xlZXAoRHVyYXRpb246OmZyb21fc2VjcyhzZWNvbmRzX3RvX3NsZWVwIGFzIHU2NCkpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK3N0cnVjdCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsOworaW1wbCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV9zZWNvbmR0ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCIoc2Vjb25kKXRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgbGV0IHJldCA9IGZvcm1hdCEoInRlc3RTdHJpbmcoXCJ7fVwiKSIsICZ0aGluZyk7CisgICAgICAgIE9rKHJldCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9saWIucnMgYi90ZXN0L3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5YmY5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworbW9kIHRocmlmdF90ZXN0OworcHViIHVzZSB0aHJpZnRfdGVzdDo6KjsKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC5weSBiL3Rlc3QvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTkyNTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnB5CkBAIC0wLDAgKzEsMTkyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gKGNyb3NzKSB0ZXN0IHN1aXRlCisjCisjIHRlc3RzIGRpZmZlcmVudCBzZXJ2ZXItY2xpZW50LCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGNvbWJpbmF0aW9ucworIworIyBUaGlzIHNjcmlwdCByZXF1aXJlcyBweXRob24gMy54IGR1ZSB0byB0aGUgaW1wcm92ZW1lbnRzIGluCisjIHN1YnByb2Nlc3MgbWFuYWdlbWVudCB0aGF0IGFyZSBuZWVkZWQgZm9yIHJlbGlhYmlsaXR5LgorIworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGNyb3NzcnVubmVyCitmcm9tIGNyb3NzcnVubmVyLmNvbXBhdCBpbXBvcnQgcGF0aF9qb2luCisKKyMgMy4zIGludHJvZHVjZWQgc3VicHJvY2VzcyB0aW1lb3V0cyBvbiB3YWl0aW5nIGZvciBjaGlsZAorcmVxX3ZlcnNpb24gPSAoMywgMykKK2N1cl92ZXJzaW9uID0gc3lzLnZlcnNpb25faW5mbworYXNzZXJ0IChjdXJfdmVyc2lvbiA+PSByZXFfdmVyc2lvbiksICJQeXRob24gMy4zIG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uLiIKKworCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKQorVEVTVF9ESVJfUkVMQVRJVkUgPSAndGVzdCcKK1RFU1RfRElSID0gcGF0aF9qb2luKFJPT1RfRElSLCBURVNUX0RJUl9SRUxBVElWRSkKK0ZFQVRVUkVfRElSX1JFTEFUSVZFID0gcGF0aF9qb2luKFRFU1RfRElSX1JFTEFUSVZFLCAnZmVhdHVyZXMnKQorQ09ORklHX0ZJTEUgPSAndGVzdHMuanNvbicKKworCitkZWYgcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfY3Jvc3NfdGVzdHMoaiwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGNsaWVudHM6ICVzJyAlIGNsaWVudF9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKKworICAgIGRpc3BhdGNoZXIgPSBjcm9zc3J1bm5lci5UZXN0RGlzcGF0Y2hlcihURVNUX0RJUiwgUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFLCBqb2JzKQorICAgIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCisgICAgdHJ5OgorICAgICAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0LCByZXRyeV9jb3VudCkgZm9yIHRlc3QgaW4gdGVzdHNdOgorICAgICAgICAgICAgci53YWl0KCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBjb21wbGV0aW9uJykKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQorICAgICAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIG9ubHlfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CisgICAgYmFzZWRpciA9IHBhdGhfam9pbihST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUpCisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihURVNUX0RJUiwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqID0ganNvbi5sb2FkKGZwKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oYmFzZWRpciwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqMiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfZmVhdHVyZV90ZXN0cyhqLCBqMiwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCkKKyAgICBpZiBub3QgdGVzdHM6CisgICAgICAgIHByaW50KCdObyB0ZXN0IGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIHNlcnZlcnM6ICVzJyAlIHNlcnZlcl9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBmZWF0dXJlczogJXMnICUgZmVhdHVyZV9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhiYXNlZGlyKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBpbiBrbm93biwgdGVzdHMpKQorICAgIGlmIHNraXBfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgbm90IGluIGtub3duLCB0ZXN0cykpCisKKyAgICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSwgam9icykKKyAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQorICAgIHRyeToKKyAgICAgICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCwgcmV0cnlfY291bnQpIGZvciB0ZXN0IGluIHRlc3RzXToKKyAgICAgICAgICAgIHIud2FpdCgpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKKyAgICAgICAgZGlzcGF0Y2hlci50ZXJtaW5hdGUoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZGVmYXVsdF9jb25jdXJyZW50eSgpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGludChvcy5lbnZpcm9uLmdldCgnVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWScpKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgIyBTaW5jZSBtdWNoIHRpbWUgaXMgc3BlbnQgc2xlZXBpbmcsIHVzZSBtYW55IHRocmVhZHMKKyAgICAgICAgcmV0dXJuIGludChtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkgKiAxLjI1KSArIDEKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJ2ZXInLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIHNlcnZlcnMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jbGllbnQnLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIGNsaWVudHMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLUYnLCAnLS1mZWF0dXJlcycsIG5hcmdzPScqJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHNlcnZlciBmZWF0dXJlIHRlc3RzIGluc3RlYWQgb2YgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1SJywgJy0tcmVnZXgnLCBoZWxwPSd0ZXN0IG5hbWUgcGF0dGVybiB0byBydW4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgJy0tb25seS1rbm93bl9mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J29ubHlfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nb25seSBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2tpcC1rbm93bi1mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3NraXBfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZG8gbm90IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yZXRyeS1jb3VudCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0wLCBoZWxwPSdtYXhpbXVtIHJldHJ5IG9uIGZhaWx1cmUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1qJywgJy0tam9icycsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0X2NvbmN1cnJlbnR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdudW1iZXIgb2YgY29uY3VycmVudCB0ZXN0IGV4ZWN1dGlvbnMnKQorCisgICAgZyA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAodGl0bGU9J0FkdmFuY2VkJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nbG9nX2xldmVsJywgY29uc3Q9bG9nZ2luZy5ERUJVRywgZGVmYXVsdD1sb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgaGVscD0nc2hvdyBkZWJ1ZyBvdXRwdXQgZm9yIHRlc3QgcnVubmVyJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wcmludC1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdwcmludF9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHByaW50IHRvIHN0ZG91dCIpCisgICAgZy5hZGRfYXJndW1lbnQoJy1VJywgJy0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZGF0ZV9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHNhdmUgdG8gZGVmYXVsdCBmaWxlIGxvY2F0aW9uIikKKyAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5sb2dfdG9fc3RkZXJyKCkKKyAgICBsb2dnZXIuc2V0TGV2ZWwob3B0aW9ucy5sb2dfbGV2ZWwpCisKKyAgICBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGFuZCBvcHRpb25zLmNsaWVudDoKKyAgICAgICAgcHJpbnQoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1mZWF0dXJlcyBhbmQgLS1jbGllbnQgJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBBbGxvdyBtdWx0aXBsZSBhcmdzIHNlcGFyYXRlZCB3aXRoICcsJyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHNlcnZlcl9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5zZXJ2ZXJdKSkKKyAgICBjbGllbnRfbWF0Y2ggPSBsaXN0KGNoYWluKCpbeC5zcGxpdCgnLCcpIGZvciB4IGluIG9wdGlvbnMuY2xpZW50XSkpCisKKyAgICBpZiBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyBvciBvcHRpb25zLnByaW50X2ZhaWx1cmVzOgorICAgICAgICBkaXJlID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkgaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZSBlbHNlIFRFU1RfRElSCisgICAgICAgIHJlcyA9IGNyb3NzcnVubmVyLmdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKAorICAgICAgICAgICAgZGlyZSwgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgPT0gJ292ZXJ3cml0ZScsCisgICAgICAgICAgICBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcywgb3B0aW9ucy5wcmludF9mYWlsdXJlcykKKyAgICBlbGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmU6CisgICAgICAgIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcyBvciBbJy4qJ10KKyAgICAgICAgcmVzID0gcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlcywgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMub25seV9rbm93bl9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICBlbHNlOgorICAgICAgICByZXMgPSBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIG9wdGlvbnMuam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICByZXR1cm4gMCBpZiByZXMgZWxzZSAxCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RzLmpzb24gYi90ZXN0L3Rlc3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNmRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdHMuanNvbgpAQCAtMCwwICsxLDc0OSBAQAorWworICB7CisgICAgIm5hbWUiOiAiY19nbGliIiwKKyAgICAicGxhdGZvcm1zIjogWworICAgICAgIkxpbnV4IgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAtc3NsIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJjX2dsaWIiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjbCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0U2VydmVyIl0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RDbGllbnQiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9CisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJkIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS10cmFjZSIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRocmlmdF90ZXN0X2NsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiLAorICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvZC90ZXN0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZ28iLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RzZXJ2ZXIiLAorICAgICAgICAiLS1jZXJ0UGF0aD0uLi8uLi9rZXlzIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdGNsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJnby9iaW4iCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJqYXZhIiwKKyAgICAiam9pbl9hcmdzIjogZmFsc2UsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJkZWxheSI6IDE1LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEzLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5jbGllbnQiCisgICAgICBdLAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGlqOmpzb24iCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJmcmFtZWQ6ZmFzdGZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGlqIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2phdmEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJub2RlanMiLAorICAgICJlbnYiOiB7CisgICAgICAiTk9ERV9QQVRIIjogIi4uL2xpYiIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm5vZGUiLAorICAgICAgICAic2VydmVyLmpzIiwKKyAgICAgICAgIi0tdHlwZT10Y3AiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJub2RlIiwKKyAgICAgICAgImNsaWVudC5qcyIsCisgICAgICAgICItLXR5cGU9dGNwIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGVqcy90ZXN0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiaHMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiaGVhZGVyIiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJocyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInB5IiwKKyAgICAic2VydmVyIjogeworICAgICAgImV4dHJhX2FyZ3MiOiBbIlRTaW1wbGVTZXJ2ZXIiXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdFNlcnZlci5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCisgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGk6bXVsdGlhIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAgICJtdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3Q6YWNjZWxjIiwKKyAgICAgICJoZWFkZXIiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJweSIKKyAgfSwKKyAgeworICAgICJjb21tZW50IjogIlVzaW5nICdweXRob24zJyBleGVjdXRhYmxlIHRvIHRlc3QgcHkyIGFuZCAzIGF0IG9uY2UiLAorICAgICJuYW1lIjogInB5MyIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdFNlcnZlci5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicHl0aG9uMyIsCisgICAgICAgICJUZXN0Q2xpZW50LnB5IiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjcHAiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJoZWFkZXI6bXVsdGloIiwKKyAgICAgICAgImpzb246bXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogOCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpaDpoZWFkZXIiLAorICAgICAgICAibXVsdGlqOmpzb24iCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImhlYWRlciIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGloIiwKKyAgICAgICJtdWx0aWoiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJjcHAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJyYiIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVieSIsCisgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVieSIsCisgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIiwKKyAgICAgICAgIi0tIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImRvbWFpbiIsCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJyYi9nZW4tcmIiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjc2hhcnAiLAorICAgICJlbnYiOiB7CisgICAgICAiTU9OT19QQVRIIjogIi4uLy4uL2xpYi9jc2hhcnAvIgorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAorICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAorICAgICAgICAic2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogOSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibW9ubyIsCisgICAgICAgICJUZXN0Q2xpZW50U2VydmVyLmV4ZSIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJjc2hhcnAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJuZXRjb3JlIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1TZXJ2ZXIvU2VydmVyLmNzcHJvaiIsCisgICAgICAgICJzZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1DbGllbnQvQ2xpZW50LmNzcHJvaiIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAgICAgIndvcmtkaXIiOiAibmV0Y29yZSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInBlcmwiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAibXVsdGkiCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwZXJsIiwKKyAgICAgICAgIi1JZ2VuLXBlcmwvIiwKKyAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCisgICAgICAgICJUZXN0Q2xpZW50LnBsIiwKKyAgICAgICAgIi0tY2E9Li4va2V5cy9DQS5wZW0iLAorICAgICAgICAiLS1jZXJ0PS4uL2tleXMvY2xpZW50LmNydCIsCisgICAgICAgICItLWtleT0uLi9rZXlzL2NsaWVudC5rZXkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIKKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBlcmwiLAorICAgICAgICAiLUlnZW4tcGVybC8iLAorICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucGwiLAorICAgICAgICAiLS1jZXJ0PS4uL2tleXMvc2VydmVyLmNydCIsCisgICAgICAgICItLWtleT0uLi9rZXlzL3NlcnZlci5rZXkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogInBlcmwiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJwaHAiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJiaW5hcnk6YWNjZWwiCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwaHAiLAorICAgICAgICAiLWRleHRlbnNpb25fZGlyPXBocF9leHRfZGlyIiwKKyAgICAgICAgIi0tcGhwLWluaT10ZXN0X3BocC5pbmkiLAorICAgICAgICAiLS1uby1waHAtaW5pIiwKKyAgICAgICAgIi1kZGlzcGxheV9lcnJvcnM9c3RkZXJyIiwKKyAgICAgICAgIi1kbG9nX2Vycm9ycz0wIiwKKyAgICAgICAgIi1kZXJyb3JfcmVwb3J0aW5nPUVfQUxMIiwKKyAgICAgICAgIlRlc3RDbGllbnQucGhwIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAicGhwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZGFydCIsCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRhcnQiLAorICAgICAgICAidGVzdF9jbGllbnQvYmluL21haW4uZGFydCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImRhcnQiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJlcmwiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJlcmwiLAorICAgICAgICAiK0siLAorICAgICAgICAidHJ1ZSIsCisgICAgICAgICItbm9zaGVsbCIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi4vLi4vbGliL2VybC9lYmluLyIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi9lYmluIiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgImluaXQiLAorICAgICAgICAic3RvcCIsCisgICAgICAgICItZXh0cmEiCisgICAgICBdCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJlcmwiLAorICAgICAgICAiK0siLAorICAgICAgICAidHJ1ZSIsCisgICAgICAgICItbm9zaGVsbCIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi4vLi4vbGliL2VybC9lYmluLyIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi9lYmluIiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgInRlc3RfdGhyaWZ0X3NlcnZlciIsCisgICAgICAgICItZXh0cmEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJlcmwiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJqcyIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiaHR0cCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGhhbnRvbWpzIiwKKyAgICAgICAgInRlc3QvcGhhbnRvbS1jbGllbnQuanMiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvanMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsdWEiLAorICAgICJUT0RPIjogIkFkZCBkbGwgdG8gTFVBX0NQQVRIIiwKKyAgICAiZW52IjogeworICAgICAgIkxVQV9QQVRIIjogIjs7Z2VuLWx1YS8/Lmx1YTsuLi8uLi9saWIvbHVhLz8ubHVhIiwKKyAgICAgICJMVUFfQ1BBVEgiOiAiOzsuLi8uLi9saWIvbHVhLy5saWJzLz8uc28iCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA1LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiLAorICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJqc29uIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibHVhIiwKKyAgICAgICAgInRlc3RfYmFzaWNfY2xpZW50Lmx1YSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImx1YSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInJzIiwKKyAgICAiZW52IjogeworICAgICAgIlJVU1RfQkFDS1RSQUNFIjogIjEiLAorICAgICAgIlJVU1RfTE9HIjogImluZm8iCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X3NlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9jbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0KKyAgICB9LAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicnMvYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZXRzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5TZXJ2ZXIuc2giCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5DbGllbnQuc2giCisgICAgICBdCisgICAgfSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvbm9kZXRzL3Rlc3QiCisgIH0KK10KZGlmZiAtLWdpdCBhL3Rlc3QvdGhyZWFkcy9NYWtlZmlsZSBiL3Rlc3QvdGhyZWFkcy9NYWtlZmlsZQppbmRleCAxNGYxYTU4Li5kZjcyMzk2IDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHMvTWFrZWZpbGUKKysrIGIvdGVzdC90aHJlYWRzL01ha2VmaWxlCkBAIC01NCwxMCArNTQsMTAgQEAKIAkkKFRIUklGVCkgLS1nZW4gY3BwIC0tZ2VuIHB5IFRocmVhZHNUZXN0LnRocmlmdAogCiBzZXJ2ZXI6IHN0dWJzCi0JZysrIC1vIFRocmVhZHNTZXJ2ZXIgJChDRkwpIFRocmVhZHNTZXJ2ZXIuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0X3R5cGVzLmNwcAorCSQoQ0MpIC1vIFRocmVhZHNTZXJ2ZXIgJChDRkwpIFRocmVhZHNTZXJ2ZXIuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0X3R5cGVzLmNwcAogCiBjbGllbnQ6IHN0dWJzCi0JZysrIC1vIFRocmVhZHNDbGllbnQgJChDRkwpIFRocmVhZHNDbGllbnQuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0X3R5cGVzLmNwcAorCSQoQ0MpIC1vIFRocmVhZHNDbGllbnQgJChDRkwpIFRocmVhZHNDbGllbnQuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0X3R5cGVzLmNwcAogCiBjbGVhbjoKIAkkKFJNKSAtciAqLm8gVGhyZWFkc1NlcnZlciBUaHJlYWRzQ2xpZW50IGdlbi1jcHAgZ2VuLXB5CmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAgYi90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKaW5kZXggODUyNzRhNi4uOTMwNmEzZiAxMDA2NDQKLS0tIGEvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCisrKyBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcApAQCAtMjEsMTMgKzIxLDE2IEBACiAvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4KIAogI2luY2x1ZGUgIlRocmVhZHNUZXN0LmgiCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2lmIF9XSU4zMgorICAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAogdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CkBAIC0zNyw2ICs0MCw5IEBACiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKICAgaW50IHBvcnQgPSA5MDkwOwogICBzdGQ6OnN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcCBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcAppbmRleCA4NzM0ZWU4Li5hMjY3YzNiIDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKKysrIGIvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCkBAIC0yMSwxNCArMjEsMTcgQEAKIC8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LgogCiAjaW5jbHVkZSAiVGhyZWFkc1Rlc3QuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaWYgX1dJTjMyCisgICAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKQEAgLTg1LDExICs4OCwxMiBAQAogcHJvdGVjdGVkOgogICB2b2lkIGdvMnNsZWVwKGludCB0aHJlYWQsIGludCBzZWNvbmRzKSB7CiAgICAgTW9uaXRvciBtOworICAgIFN5bmNocm9uaXplZCBzKG0pOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgKytpKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZDogc2xlZXAgJWRcbiIsIHRocmVhZCwgaSk7CiAgICAgICB0cnkgewogICAgICAgICBtLndhaXQoMTAwMCk7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7CisgICAgICB9IGNhdGNoKGNvbnN0IFRpbWVkT3V0RXhjZXB0aW9uJikgewogICAgICAgfQogICAgIH0KICAgICBmcHJpbnRmKHN0ZGVyciwgIlRIUkVBRCAlZCBET05FXG4iLCB0aHJlYWQpOwpAQCAtMTAxLDYgKzEwNSw5IEBACiB9OwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKICAgaW50IHBvcnQgPSA5MDkwOwogICBzaGFyZWRfcHRyPFRocmVhZHNUZXN0SGFuZGxlcj4gaGFuZGxlcihuZXcgVGhyZWFkc1Rlc3RIYW5kbGVyKCkpOwogICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVGhyZWFkc1Rlc3RQcm9jZXNzb3IoaGFuZGxlcikpOwpAQCAtMTExLDggKzExOCw4IEBACiAgIC8qCiAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CiAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigxMCk7Ci0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKKyAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQorICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCmRpZmYgLS1naXQgYS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE3Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwpAQCAtMCwwICsxLDUzIEBACit7CisgICBib29zdC9nZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoL2lnbm9yZQorICAgTWVtY2hlY2s6TGVhaworICAgbWF0Y2gtbGVhay1raW5kczogcmVhY2hhYmxlCisgICBmdW46bWFsbG9jCisgICBmdW46X1pONWJvb3N0NmRldGFpbDI1Z2V0X29uY2VfcGVyX3RocmVhZF9lcG9jaEV2Cit9Cit7CisgICBib29zdHRocmVhZHMvb25jZS9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjpfWk41Ym9vc3QxM3RocmVhZF9kZXRhaWwxN2VudGVyX29uY2VfcmVnaW9uRVJOU185b25jZV9mbGFnRQorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyM2dldF9jdXJyZW50X3RocmVhZF9kYXRhRXYKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjBpbnRlcnJ1cHRpb25fY2hlY2tlckMxRVAxNXB0aHJlYWRfbXV0ZXhfdFAxNHB0aHJlYWRfY29uZF90CisgICBmdW46X1pONWJvb3N0MjJjb25kaXRpb25fdmFyaWFibGVfYW55NHdhaXRJTlNfMTF1bmlxdWVfbG9ja0lOU18xMXRpbWVkX211dGV4RUVFRUV2UlRfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDExd2FpdEZvcmV2ZXJFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGwxOXdhaXRGb3JUaW1lUmVsYXRpdmVFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGw0d2FpdEVsCisgICBmdW46X1pOSzZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNHdhaXRFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTExQm9vc3RUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KK3sKKyAgIHB0aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yKgorICAgb2JqOi91c3IvbGliL3ZhbGdyaW5kL3ZncHJlbG9hZF9oZWxncmluZC1hbWQ2NC1saW51eC5zbworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTEzUHRocmVhZFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgYm9vc3QtdGhyZWFkL2NyZWF0aW9uLXRscy9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjptZW1wY3B5CisgICBmdW46X2RsX2FsbG9jYXRlX3Rsc19pbml0CisgICBmdW46Z2V0X2NhY2hlZF9zdGFjaworICAgZnVuOmFsbG9jYXRlX3N0YWNrCisgICBmdW46cHRocmVhZF9jcmVhdGVAQEdMSUJDXzIuMi41CisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONWJvb3N0NnRocmVhZDIxc3RhcnRfdGhyZWFkX25vZXhjZXB0RXYKKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMTJzdGFydF90aHJlYWRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWRDMUlTdDVfQmluZElGUEZQdlMzX0VTM19FRUVFT1RfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQorCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ5OTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTEwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIE1JTkdXCisjIGRvIG5vdGhpbmcsIGp1c3QgYnVpbGQgdGhlIGNvbXBpbGVyCitlbHNlCisKK2lmIFdJVEhfQ19HTElCCitTVUJESVJTICs9IGNfZ2xpYgorZW5kaWYKKworaWYgV0lUSF9DUFAKK1NVQkRJUlMgKz0gY3BwCitlbmRpZgorCitpZiBXSVRIX0QKK1NVQkRJUlMgKz0gZAorZW5kaWYKKworaWYgV0lUSF9KQVZBCitTVUJESVJTICs9IGphdmEKK1NVQkRJUlMgKz0ganMKK2VuZGlmCisKK2lmIFdJVEhfUFlUSE9OCitTVUJESVJTICs9IHB5CitTVUJESVJTICs9IHB5LnR3aXN0ZWQKK1NVQkRJUlMgKz0gcHkudG9ybmFkbworZW5kaWYKKworaWYgV0lUSF9SVUJZCitTVUJESVJTICs9IHJiCitlbmRpZgorCitpZiBXSVRIX0hBU0tFTEwKK1NVQkRJUlMgKz0gaHMKK2VuZGlmCisKK2lmIFdJVEhfSEFYRQorU1VCRElSUyArPSBoYXhlCitlbmRpZgorCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKworaWYgV0lUSF9HTworU1VCRElSUyArPSBnbworZW5kaWYKKworaWYgV0lUSF9OT0RFSlMKK1NVQkRJUlMgKz0gbm9kZWpzCitlbmRpZgorCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorZW5kaWYKKworaWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKworIworIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAorIworYWxsLWxvY2FsOgorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGh0bWwgLXIgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKworY2xlYW4tbG9jYWw6CisJcm0gLXJmICQodG9wX3NyY2RpcikvdHV0b3JpYWwvZ2VuLWh0bWwKKworZW5kaWYKKworIyBBbnkgZm9sZGVycyBvciBmaWxlcyBub3QgbGlzdGVkIGFib3ZlIGJlaW5nIGFkZGVkIHRvIFNVQkRJUiBuZWVkIHRvIGJlIHBsYWNlZCBoZXJlIGluCisjIEVYVFJBX0RJU1QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlbGVhc2UKK0VYVFJBX0RJU1QgPSBcCisJYXMzIFwKKwljc2hhcnAgXAorCWQgXAorCWRlbHBoaSBcCisJZXJsIFwKKwlocyBcCisJb2NhbWwgXAorCXBlcmwgXAorCXBocCBcCisJc2hhcmVkLnRocmlmdCBcCisJdHV0b3JpYWwudGhyaWZ0IFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL1JFQURNRSBiL3R1dG9yaWFsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5Zjk3Ny4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1UaHJpZnQgVHV0b3JpYWwKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVHV0b3JpYWwKLT09PT09PT09Ci0KLTEpIEZpcnN0IHRoaW5ncyBmaXJzdCwgeW91J2xsIG5lZWQgdG8gaW5zdGFsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCB0aGUKLSAgIGxhbmd1YWdlIGxpYnJhcmllcy4gRG8gdGhhdCB1c2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSB0b3AgbGV2ZWwKLSAgIFJFQURNRSBmaWxlLgotCi0yKSBSZWFkIHR1dG9yaWFsLnRocmlmdCB0byBsZWFybiBhYm91dCB0aGUgc3ludGF4IG9mIGEgVGhyaWZ0IGZpbGUKLQotMykgQ29tcGlsZSB0aGUgY29kZSBmb3IgdGhlIGxhbmd1YWdlIG9mIHlvdXIgY2hvaWNlOgotCi0gICAgICQgdGhyaWZ0Ci0gICAgICQgdGhyaWZ0IC1yIC0tZ2VuIGNwcCB0dXRvcmlhbC50aHJpZnQKLQotNCkgVGFrZSBhIGxvb2sgYXQgdGhlIGdlbmVyYXRlZCBjb2RlLgotCi01KSBMb29rIGluIHRoZSBsYW5ndWFnZSBkaXJlY3RvcmllcyBmb3Igc2FtcGxlIGNsaWVudC9zZXJ2ZXIgY29kZS4KLQotNikgVGhhdCdzIGFib3V0IGl0IGZvciBub3cuIFRoaXMgdHV0b3JpYWwgaXMgaW50ZW50aW9uYWxseSBicmllZi4gSXQgc2hvdWxkIGJlCi0gICBqdXN0IGVub3VnaCB0byBnZXQgeW91IHN0YXJ0ZWQgYW5kIHJlYWR5IHRvIGJ1aWxkIHlvdXIgb3duIHByb2plY3QuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9SRUFETUUubWQgYi90dXRvcmlhbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3MmJmMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL1JFQURNRS5tZApAQCAtMCwwICsxLDQyIEBACitUaHJpZnQgVHV0b3JpYWwKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVHV0b3JpYWwKKz09PT09PT09CisKKzEpIEZpcnN0IHRoaW5ncyBmaXJzdCwgeW91J2xsIG5lZWQgdG8gaW5zdGFsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCB0aGUKKyAgIGxhbmd1YWdlIGxpYnJhcmllcy4gRG8gdGhhdCB1c2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSB0b3AgbGV2ZWwKKyAgIFJFQURNRS5tZCBmaWxlLgorCisyKSBSZWFkIHR1dG9yaWFsLnRocmlmdCB0byBsZWFybiBhYm91dCB0aGUgc3ludGF4IG9mIGEgVGhyaWZ0IGZpbGUKKworMykgQ29tcGlsZSB0aGUgY29kZSBmb3IgdGhlIGxhbmd1YWdlIG9mIHlvdXIgY2hvaWNlOgorCisgICAgICQgdGhyaWZ0CisgICAgICQgdGhyaWZ0IC1yIC0tZ2VuIGNwcCB0dXRvcmlhbC50aHJpZnQKKworNCkgVGFrZSBhIGxvb2sgYXQgdGhlIGdlbmVyYXRlZCBjb2RlLgorCis1KSBMb29rIGluIHRoZSBsYW5ndWFnZSBkaXJlY3RvcmllcyBmb3Igc2FtcGxlIGNsaWVudC9zZXJ2ZXIgY29kZS4KKworNikgVGhhdCdzIGFib3V0IGl0IGZvciBub3cuIFRoaXMgdHV0b3JpYWwgaXMgaW50ZW50aW9uYWxseSBicmllZi4gSXQgc2hvdWxkIGJlCisgICBqdXN0IGVub3VnaCB0byBnZXQgeW91IHN0YXJ0ZWQgYW5kIHJlYWR5IHRvIGJ1aWxkIHlvdXIgb3duIHByb2plY3QuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9hczMvYnVpbGQueG1sIGIvdHV0b3JpYWwvYXMzL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VkMzJkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvYXMzL2J1aWxkLnhtbApAQCAtMCwwICsxLDUwIEBACis8cHJvamVjdCBuYW1lPSJ0dXRvcmlhbCIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiI+CisKKyAgPGRlc2NyaXB0aW9uPlRocmlmdCBhY3Rpb25zY3JpcHQgMy4wIHR1dG9yaWFsLjwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1hczMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuc3JjIiBsb2NhdGlvbj0iLi4vLi4vbGliL2FzMy9zcmMvIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZGlzdCIgbG9jYXRpb249ImRpc3QiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSJhczMtdHV0b3JpYWwiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzd2YubmFtZSIgdmFsdWU9IiR7ZGlzdH0vJHtmaW5hbC5uYW1lfS5zd2YiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJmbGV4LmNoZWNrIiB1bmxlc3M9IkZMRVhfSE9NRSI+CisgICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBGTEVYX0hPTUUgcHJvcGVydHkgcG9pbnRpbmcgdG8geW91ciBmbGV4IFNESywgZWcuIGFudCAtREZMRVhfSE9NRT0iL0FwcGxpY2F0aW9ucy9BZG9iZSBGbGV4IEJ1aWxkZXIgMy9zZGtzLzMuMi4wIicvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZsZXguaW5pdCIgZGVwZW5kcz0iZmxleC5jaGVjayIgdW5sZXNzPSJmbGV4LmZpbmlzaGVkIj4KKyAgICA8dGFza2RlZiByZXNvdXJjZT0iZmxleFRhc2tzLnRhc2tzIiBjbGFzc3BhdGg9IiR7RkxFWF9IT01FfS9hbnQvbGliL2ZsZXhUYXNrcy5qYXIiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZsZXguZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPHRzdGFtcCAvPgorICAgIDxta2RpciBkaXI9IiR7ZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJnZW5lcmF0ZSwgZmxleC5pbml0LCBpbml0Ij4KKyAgICA8bXhtbGMgb3V0cHV0PSIke3N3Zi5uYW1lfSIgZmlsZT0iJHtzcmN9L0NhbGN1bGF0b3JVSS5hcyI+CisgICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke2dlbn0iIC8+CisgICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3NyY30iIC8+CisgICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3RocmlmdC5zcmN9IiAvPgorICAgIDwvbXhtbGM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBhczMgLi4vc2hhcmVkLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGFzMyAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2dlbn0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0fSIgLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2FzMy9zcmMvQ2FsY3VsYXRvclVJLmFzIGIvdHV0b3JpYWwvYXMzL3NyYy9DYWxjdWxhdG9yVUkuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2FzMy9zcmMvQ2FsY3VsYXRvclVJLmFzCkBAIC0wLDAgKzEsMTQyIEBACitwYWNrYWdlIHsKKyAgaW1wb3J0IGZsYXNoLmRpc3BsYXkuU3ByaXRlOworICBpbXBvcnQgZmxhc2gudGV4dC5UZXh0RmllbGQ7CisgIGltcG9ydCBmbGFzaC50ZXh0LlRleHRGaWVsZFR5cGU7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuTW91c2VFdmVudDsKKyAgaW1wb3J0IGZsYXNoLnN5c3RlbS5TZWN1cml0eTsKKworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7CisgIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKyAgaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKyAgaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKworICAvKioKKyAgICogU2ltcGxlIGludGVyZmFjZSBhbmQgY29ubmVjdGlvbiBsb2dpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdHV0b3JpYWwuCisgICAqLworICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvclVJIGV4dGVuZHMgU3ByaXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IEJVVFRPTl9QQURESU5HOnVpbnQgPSA1OworCisgICAgcHJpdmF0ZSB2YXIgbUNhbGN1bGF0b3JDbGllbnQ6Q2FsY3VsYXRvcjsgLy8gd2UgdXNlIGNhbGN1bGF0b3IgdGhyb3VnaCBpbnRlcmZhY2UKKyAgICBwcml2YXRlIHZhciBtVHJhbnNwb3J0OlRUcmFuc3BvcnQ7IC8vIFRyYW5zcG9ydCwgdXNlZCB0byBjb211bmljYXRlIHdpdGggc2VydmVyCisKKyAgICBwcml2YXRlIHZhciBtQWRkQnV0dG9uOlNwcml0ZTsKKyAgICBwcml2YXRlIHZhciBtTGVmdDpUZXh0RmllbGQ7CisgICAgcHJpdmF0ZSB2YXIgbVJpZ2h0OlRleHRGaWVsZDsKKyAgICBwcml2YXRlIHZhciBtUmVzdWx0OlRleHRGaWVsZDsKKworICAgIHByaXZhdGUgdmFyIHBpbmdCdXR0b246U3ByaXRlOworCisgICAgcHVibGljIGZ1bmN0aW9uIENhbGN1bGF0b3JVSSgpIHsKKyAgICAgIGJ1aWxkSW50ZXJmYWNlKCk7CisgICAgICBpbml0U2VjdXJpdHkoKTsKKyAgICAgIGluaXRDb25uZWN0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpbml0U2VjdXJpdHkoKTp2b2lkIHsKKyAgICAgIFNlY3VyaXR5LmxvYWRQb2xpY3lGaWxlKCJ4bWxzb2NrZXQ6Ly8xMjcuMC4wLjE6OTA5MiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4YW1wbGUgb2YgaW5pdGlhbGl6aW5nIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpbml0Q29ubmVjdGlvbigpOnZvaWQgeworICAgICAgbVRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCA5MDkwKTsgLy8gd2UgY29ubmVjdCB0byBzZXJ2ZXIKKyAgICAgIG1UcmFuc3BvcnQub3BlbigpOworICAgICAgLy8gaW5pdGlhbGl6ZSBwcm90b2NvbDoKKyAgICAgIHZhciBwcm90b2NvbDpUUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKG1UcmFuc3BvcnQsIGZhbHNlLCBmYWxzZSk7CisgICAgICBtQ2FsY3VsYXRvckNsaWVudCA9IG5ldyBDYWxjdWxhdG9ySW1wbChwcm90b2NvbCk7IC8vIGZpbmFsbHksIHdlIGNyZWF0ZSBjYWxjdWxhdG9yIGNsaWVudCBpbnN0YW5jZQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25QaW5nQ2xpY2sobWU6TW91c2VFdmVudCk6dm9pZCB7CisgICAgICBpZighbVRyYW5zcG9ydC5pc09wZW4oKSkgcmV0dXJuOworICAgICAgbUNhbGN1bGF0b3JDbGllbnQucGluZyhvblBpbmdFcnJvciwgb25QaW5nU3VjY2Vzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblBpbmdFcnJvcihlcnJvcjpFcnJvcik6dm9pZCB7CisgICAgICB0cmFjZSgiRXJyb3IsIHdoaWxlIHJlcXVlc3RpbmcgcGluZy4iKTsKKyAgICAgIHRocm93IGVycm9yOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25QaW5nU3VjY2VzcygpOnZvaWQgeworICAgICAgdHJhY2UoIlBpbmcgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvbkFkZENsaWNrKG1lOk1vdXNlRXZlbnQpOnZvaWQgeworICAgICAgaWYoIW1UcmFuc3BvcnQuaXNPcGVuKCkpIHJldHVybjsKKyAgICAgIHZhciBudW0xOk51bWJlciA9IE51bWJlcihtTGVmdC50ZXh0KTsKKyAgICAgIHZhciBudW0yOk51bWJlciA9IE51bWJlcihtUmlnaHQudGV4dCk7CisgICAgICBtUmVzdWx0LnRleHQgPSAiUHJvY2Vzc2luZy4uLiI7CisgICAgICBtQ2FsY3VsYXRvckNsaWVudC5hZGQobnVtMSwgbnVtMiwgb25BZGRFcnJvciwgb25BZGRTdWNjZXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uQWRkRXJyb3IoZXJyb3I6RXJyb3IpOnZvaWQgeworICAgICAgdHJhY2UoIkVycm9yLCB3aGlsZSByZXF1ZXN0aW5nIGFkZC4iKTsKKyAgICAgIHRocm93IGVycm9yOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25BZGRTdWNjZXNzKHJlczpOdW1iZXIpOnZvaWQgeworICAgICAgbVJlc3VsdC50ZXh0ID0gU3RyaW5nKHJlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpOnZvaWQgeworICAgICAgYWRkQ2hpbGQocGluZ0J1dHRvbiA9IGJ1aWxkQnV0dG9uKCJQSU5HIikpOworICAgICAgcGluZ0J1dHRvbi54ID0gKHN0YWdlLnN0YWdlV2lkdGggLSBwaW5nQnV0dG9uLndpZHRoKSAvIDI7CisgICAgICBwaW5nQnV0dG9uLnkgPSAxMDsKKyAgICAgIHBpbmdCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihNb3VzZUV2ZW50LkNMSUNLLCBvblBpbmdDbGljayk7CisKKyAgICAgIHZhciB0b3A6TnVtYmVyID0gcGluZ0J1dHRvbi55ICsgcGluZ0J1dHRvbi5oZWlnaHQgKyAyMDsKKyAgICAgIGFkZENoaWxkKG1MZWZ0ID0gYnVpbGREaWdpdElucHV0KCkpOworICAgICAgbUxlZnQueCA9IDE1OworICAgICAgbUxlZnQueSA9IHRvcCArIEJVVFRPTl9QQURESU5HOworICAgICAgYWRkQ2hpbGQobVJpZ2h0ID0gYnVpbGREaWdpdElucHV0KCkpOworICAgICAgbVJpZ2h0LnggPSBtTGVmdC54ICsgbUxlZnQud2lkdGggKyAxNTsKKyAgICAgIG1SaWdodC55ID0gdG9wICsgQlVUVE9OX1BBRERJTkc7CisgICAgICBhZGRDaGlsZChtQWRkQnV0dG9uID0gYnVpbGRCdXR0b24oIkFERCIpKTsKKyAgICAgIG1BZGRCdXR0b24ueCA9IG1SaWdodC54ICsgbVJpZ2h0LndpZHRoICsgMTU7CisgICAgICBtQWRkQnV0dG9uLnkgPSB0b3A7CisgICAgICBtQWRkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoTW91c2VFdmVudC5DTElDSywgb25BZGRDbGljayk7CisgICAgICBhZGRDaGlsZChtUmVzdWx0ID0gYnVpbGREaWdpdElucHV0KCkpOworICAgICAgbVJlc3VsdC54ID0gbUFkZEJ1dHRvbi54ICsgbUFkZEJ1dHRvbi53aWR0aCArIDE1OworICAgICAgbVJlc3VsdC55ID0gdG9wICsgQlVUVE9OX1BBRERJTkc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGRpZ2l0LW9ubHkgaW5wdXQgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBidWlsZERpZ2l0SW5wdXQoKTpUZXh0RmllbGQgeworICAgICAgdmFyIHRleHRGaWVsZDpUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkOworICAgICAgdGV4dEZpZWxkLndpZHRoID0gNzU7CisgICAgICB0ZXh0RmllbGQuaGVpZ2h0ID0gMjA7CisgICAgICB0ZXh0RmllbGQucmVzdHJpY3QgPSAiMDk4NzY1NDMyMS4iOworICAgICAgdGV4dEZpZWxkLnR5cGUgPSBUZXh0RmllbGRUeXBlLklOUFVUOworICAgICAgdGV4dEZpZWxkLmJhY2tncm91bmQgPSB0cnVlOworICAgICAgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IDB4YWFhYWZmOworICAgICAgdGV4dEZpZWxkLnRleHRDb2xvciA9IDB4ZmZmZjAwOworICAgICAgcmV0dXJuIHRleHRGaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgYnV0dG9uIGRyYXdpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBidWlsZEJ1dHRvbih0ZXh0OlN0cmluZyk6U3ByaXRlIHsKKyAgICAgIHZhciBidXR0b246U3ByaXRlID0gbmV3IFNwcml0ZTsKKyAgICAgIHZhciB0ZXh0RmllbGQ6VGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZDsKKyAgICAgIHRleHRGaWVsZC53aWR0aCA9IDQwMDA7CisgICAgICB0ZXh0RmllbGQudGV4dCA9IHRleHQ7CisgICAgICB0ZXh0RmllbGQudGV4dENvbG9yID0gMHhmZmZmMDA7CisgICAgICB0ZXh0RmllbGQud2lkdGggPSB0ZXh0RmllbGQudGV4dFdpZHRoICsgNDsKKyAgICAgIHRleHRGaWVsZC5oZWlnaHQgPSB0ZXh0RmllbGQudGV4dEhlaWdodCArIDQ7CisgICAgICB0ZXh0RmllbGQubW91c2VFbmFibGVkID0gZmFsc2U7CisgICAgICBidXR0b24uZ3JhcGhpY3MuYmVnaW5GaWxsKDB4MDAwMGZmKTsKKyAgICAgIGJ1dHRvbi5ncmFwaGljcy5saW5lU3R5bGUoMCwgMHgwMDAwMDApOworICAgICAgYnV0dG9uLmdyYXBoaWNzLmRyYXdSb3VuZFJlY3QoMCwgMCwgdGV4dEZpZWxkLndpZHRoICsgQlVUVE9OX1BBRERJTkcgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkLmhlaWdodCArIEJVVFRPTl9QQURESU5HICogMiwgQlVUVE9OX1BBRERJTkcpOworICAgICAgYnV0dG9uLmdyYXBoaWNzLmVuZEZpbGwoKTsKKyAgICAgIGJ1dHRvbi5hZGRDaGlsZCh0ZXh0RmllbGQpOworICAgICAgdGV4dEZpZWxkLnggPSBCVVRUT05fUEFERElORzsKKyAgICAgIHRleHRGaWVsZC55ID0gQlVUVE9OX1BBRERJTkc7CisgICAgICBidXR0b24udXNlSGFuZEN1cnNvciA9IGJ1dHRvbi5idXR0b25Nb2RlID0gdHJ1ZTsKKyAgICAgIHJldHVybiBidXR0b247CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGRiZTY1NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IFwKKwlnZW4tY19nbGliL2NhbGN1bGF0b3IuaCBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF90eXBlcy5oIFwKKwlnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmgKKworQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBAR0NPVl9DRkxBR1NACitBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY19nbGliL3NyYyAtSWdlbi1jX2dsaWIKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKKworbm9pbnN0X0xUTElCUkFSSUVTID0gXAorCWxpYnR1dG9yaWFsZ2VuY2dsaWIubGEKKworbm9kaXN0X2xpYnR1dG9yaWFsZ2VuY2dsaWJfbGFfU09VUkNFUyA9IFwKKwlnZW4tY19nbGliL2NhbGN1bGF0b3IuYyBcCisJZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuYyBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF90eXBlcy5jIFwKKwlnZW4tY19nbGliL3NoYXJlZF90eXBlcy5oIFwKKwlnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmMgXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaAorCitsaWJ0dXRvcmlhbGdlbmNnbGliX2xhX0xJQkFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK2xpYnR1dG9yaWFsZ2VuY2dsaWJfbGFfQ0ZMQUdTID0gXAorCSQoQU1fQ0ZMQUdTKSAtV25vLXVudXNlZC1mdW5jdGlvbgorCitub2luc3RfUFJPR1JBTVMgPSBcCisJdHV0b3JpYWxfc2VydmVyIFwKKwl0dXRvcmlhbF9jbGllbnQKKwordHV0b3JpYWxfc2VydmVyX1NPVVJDRVMgPSBcCisJY19nbGliX3NlcnZlci5jCit0dXRvcmlhbF9zZXJ2ZXJfTERGTEFHUyA9ICQoT1BFTlNTTF9MSUJTKQorCit0dXRvcmlhbF9zZXJ2ZXJfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCit0dXRvcmlhbF9jbGllbnRfU09VUkNFUyA9IFwKKwljX2dsaWJfY2xpZW50LmMKKwordHV0b3JpYWxfY2xpZW50X0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY2dsaWIubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworCitnZW4tY19nbGliL2NhbGN1bGF0b3IuYyBnZW4tY19nbGliL2NhbGN1bGF0b3IuaCBnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5oIGdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmMgZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuaCBnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmMgZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgLXIgJDwKKworY2xlYW4tbG9jYWw6CisJJChSTSkgZ2VuLWNfZ2xpYi8qCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkuL3R1dG9yaWFsX3NlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi90dXRvcmlhbF9jbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwljX2dsaWJfc2VydmVyLmMgXAorCWNfZ2xpYl9jbGllbnQuYwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2ZDUxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfY2xpZW50LmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisKKyNpbmNsdWRlICJnZW4tY19nbGliL2NhbGN1bGF0b3IuaCIKKworaW50IG1haW4gKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0OworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sOworICBDYWxjdWxhdG9ySWYgKmNsaWVudDsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgSW52YWxpZE9wZXJhdGlvbiAqaW52YWxpZF9vcGVyYXRpb24gPSBOVUxMOworCisgIFdvcmsgKndvcms7CisKKyAgZ2ludDMyIHN1bTsKKyAgZ2ludDMyIGRpZmY7CisKKyAgaW50IGV4aXRfc3RhdHVzID0gMDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgc29ja2V0ICAgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgICA5MDkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBwcm90b2NvbCAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpOworCisKKyAgLyogSW4gdGhlIEMgKEdMaWIpIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCwgc2VydmljZSBtZXRob2RzIG9uIHRoZQorICAgICBzZXJ2ZXIgYXJlIGFjY2Vzc2VkIHZpYSBhIGdlbmVyYXRlZCBjbGllbnQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisgICAgIHRoZSBzZXJ2aWNlIGludGVyZmFjZS4gSW4gdGhpcyB0dXRvcmlhbCwgd2UgYWNjZXNzIGEgQ2FsY3VsYXRvcgorICAgICBzZXJ2aWNlIHRocm91Z2ggYW4gaW5zdGFuY2Ugb2YgQ2FsY3VsYXRvckNsaWVudCwgd2hpY2ggaW1wbGVtZW50cworICAgICBDYWxjdWxhdG9ySWYuICovCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVFlQRV9DQUxDVUxBVE9SX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEVhY2ggb2YgdGhlIGNsaWVudCBtZXRob2RzIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBwYXJhbWV0ZXJzOiBBCisgICAgIHBvaW50ZXIgdG8gdGhlIGNsaWVudC1pbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gKHRoZSBjbGllbnQKKyAgICAgb2JqZWN0KSwgYW5kIGEgaGFuZGxlIHRvIGEgR0Vycm9yIHN0cnVjdHVyZSB0byByZWNlaXZlCisgICAgIGluZm9ybWF0aW9uIGFib3V0IGFueSBlcnJvciB0aGF0IG9jY3Vycy4KKworICAgICBPbiBzdWNjZXNzLCBjbGllbnQgbWV0aG9kcyByZXR1cm4gVFJVRS4gQSByZXR1cm4gdmFsdWUgb2YgRkFMU0UKKyAgICAgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkIGFuZCB0aGUgZXJyb3IgcGFyYW1ldGVyIGhhcyBiZWVuCisgICAgIHNldC4gKi8KKyAgaWYgKCFlcnJvciAmJiBjYWxjdWxhdG9yX2lmX3BpbmcgKGNsaWVudCwgJmVycm9yKSkgeworICAgIHB1dHMgKCJwaW5nKCkiKTsKKyAgfQorCisgIC8qIFNlcnZpY2UgbWV0aG9kcyB0aGF0IHJldHVybiBhIHZhbHVlIGRvIHNvIGJ5IHBhc3NpbmcgdGhlIHJlc3VsdAorICAgICBiYWNrIHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIChoZXJlLCAic3VtIikuICovCisgIGlmICghZXJyb3IgJiYgY2FsY3VsYXRvcl9pZl9hZGQgKGNsaWVudCwgJnN1bSwgMSwgMSwgJmVycm9yKSkgeworICAgIHByaW50ZiAoIjErMT0lZFxuIiwgc3VtKTsKKyAgfQorCisgIC8qIFRocmlmdCBzdHJ1Y3RzIGFyZSBpbXBsZW1lbnRlZCBhcyBHT2JqZWN0cywgd2l0aCBlYWNoIG9mIHRoZQorICAgICBzdHJ1Y3QncyBtZW1iZXJzIGV4cG9zZWQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LiAqLworICB3b3JrID0gZ19vYmplY3RfbmV3IChUWVBFX1dPUkssIE5VTEwpOworCisgIGlmICghZXJyb3IpIHsKKyAgICBnX29iamVjdF9zZXQgKHdvcmssCisgICAgICAgICAgICAgICAgICAibnVtMSIsIDEsCisgICAgICAgICAgICAgICAgICAibnVtMiIsIDAsCisgICAgICAgICAgICAgICAgICAib3AiLCAgIE9QRVJBVElPTl9ESVZJREUsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIC8qIEV4Y2VwdGlvbnMgYXJlIHBhc3NlZCBiYWNrIGZyb20gc2VydmljZSBtZXRob2RzIGluIGEgbWFubmVyCisgICAgICAgc2ltaWxhciB0byByZXR1cm4gdmFsdWVzLiAqLworICAgIGlmIChjYWxjdWxhdG9yX2lmX2NhbGN1bGF0ZSAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludmFsaWRfb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgcHV0cyAoIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyEiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoaW52YWxpZF9vcGVyYXRpb24pIHsKKyAgICAgICAgZ2NoYXIgKndoeTsKKworICAgICAgICAvKiBMaWtlIHN0cnVjdHMsIGV4Y2VwdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG9iamVjdHMgd2l0aAorICAgICAgICAgICBwcm9wZXJ0aWVzLiAqLworICAgICAgICBnX29iamVjdF9nZXQgKGludmFsaWRfb3BlcmF0aW9uLCAid2h5IiwgJndoeSwgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgiSW52YWxpZE9wZXJhdGlvbjogJXNcbiIsIHdoeSk7CisKKyAgICAgICAgaWYgKHdoeSAhPSBOVUxMKQorICAgICAgICAgIGdfZnJlZSAod2h5KTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKGludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgICAgaW52YWxpZF9vcGVyYXRpb24gPSBOVUxMOworICAgICAgfQorCisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgIH0KKyAgfQorCisgIGlmICghZXJyb3IpIHsKKyAgICAvKiBTdHJ1Y3Qgb2JqZWN0cyBjYW4gYmUgcmV1c2VkIGFjcm9zcyBtZXRob2QgaW52b2NhdGlvbnMuICovCisgICAgZ19vYmplY3Rfc2V0ICh3b3JrLAorICAgICAgICAgICAgICAgICAgIm51bTEiLCAxNSwKKyAgICAgICAgICAgICAgICAgICJudW0yIiwgMTAsCisgICAgICAgICAgICAgICAgICAib3AiLCAgIE9QRVJBVElPTl9TVUJUUkFDVCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgaWYgKGNhbGN1bGF0b3JfaWZfY2FsY3VsYXRlIChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludmFsaWRfb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgcHJpbnRmICgiMTUtMTA9JWRcbiIsIGRpZmYpOworICAgIH0KKyAgfQorCisgIGdfb2JqZWN0X3VucmVmICh3b3JrKTsKKworICBpZiAoIWVycm9yKSB7CisgICAgU2hhcmVkU3RydWN0ICpzaGFyZWRfc3RydWN0OworICAgIGdjaGFyICp2YWx1ZTsKKworICAgIHNoYXJlZF9zdHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRZUEVfU0hBUkVEX1NUUlVDVCwgTlVMTCk7CisKKyAgICAvKiBBcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgZmlsZSwgdGhlIENhbGN1bGF0b3Igc2VydmljZSBleHRlbmRzCisgICAgICAgdGhlIFNoYXJlZFNlcnZpY2Ugc2VydmljZS4gQ29ycmVzcG9uZGluZ2x5LCBpbiB0aGUgZ2VuZXJhdGVkCisgICAgICAgY29kZSBDYWxjdWxhdG9ySWYgaW5oZXJpdHMgZnJvbSBTaGFyZWRTZXJ2aWNlSWYsIGFuZCB0aGUgcGFyZW50CisgICAgICAgc2VydmljZSdzIG1ldGhvZHMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCBhIHNpbXBsZSBjYXN0LiAqLworICAgIGlmIChzaGFyZWRfc2VydmljZV9jbGllbnRfZ2V0X3N0cnVjdCAoU0hBUkVEX1NFUlZJQ0VfSUYgKGNsaWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcmVkX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICBnX29iamVjdF9nZXQgKHNoYXJlZF9zdHJ1Y3QsICJ2YWx1ZSIsICZ2YWx1ZSwgTlVMTCk7CisgICAgICBwcmludGYgKCJDaGVjayBsb2c6ICVzXG4iLCB2YWx1ZSk7CisgICAgICBnX2ZyZWUgKHZhbHVlKTsKKyAgICB9CisKKyAgICBnX29iamVjdF91bnJlZiAoc2hhcmVkX3N0cnVjdCk7CisgIH0KKworICBpZiAoZXJyb3IpIHsKKyAgICBwcmludGYgKCJFUlJPUjogJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCisgICAgZXhpdF9zdGF0dXMgPSAxOworICB9CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworCisgIHJldHVybiBleGl0X3N0YXR1czsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMgYi90dXRvcmlhbC9jX2dsaWIvY19nbGliX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jX2dsaWIvY19nbGliX3NlcnZlci5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKworI2luY2x1ZGUgImdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEluIHRoZSBDIChHTGliKSBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQsIHRoZSBhY3R1YWwgd29yayBkb25lIGJ5IGEKKyAgIHNlcnZlci0tLXRoYXQgaXMsIHRoZSBjb2RlIHRoYXQgcnVucyB3aGVuIGEgY2xpZW50IGludm9rZXMgYQorICAgc2VydmljZSBtZXRob2QtLS1pcyBkZWZpbmVkIGluIGEgc2VwYXJhdGUgImhhbmRsZXIiIGNsYXNzIHRoYXQKKyAgIGltcGxlbWVudHMgdGhlIHNlcnZpY2UgaW50ZXJmYWNlLiBIZXJlIHdlIGRlZmluZSB0aGUKKyAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgdGhlIENhbGN1bGF0b3JJZgorICAgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyB0aGUgYmVoYXZpb3IgZXhwZWN0ZWQgYnkgdHV0b3JpYWwgY2xpZW50cy4KKyAgIChUeXBpY2FsbHkgdGhpcyBjb2RlIHdvdWxkIGJlIHBsYWNlZCBpbiBpdHMgb3duIG1vZHVsZSBidXQgZm9yCisgICBjbGFyaXR5IHRoaXMgdHV0b3JpYWwgaXMgcHJlc2VudGVkIGVudGlyZWx5IGluIGEgc2luZ2xlIGZpbGUuKQorCisgICBGb3IgZWFjaCBzZXJ2aWNlIHRoZSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIGFuIGFic3RyYWN0IGJhc2UKKyAgIGNsYXNzIGZyb20gd2hpY2ggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGluaGVyaXQuIEluIG91cgorICAgY2FzZSBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIGluaGVyaXRzIGZyb20gQ2FsY3VsYXRvckhhbmRsZXIsCisgICBkZWZpbmVkIGluIGdlbi1jX2dsaWIvY2FsY3VsYXRvci5oLgorCisgICBJZiB5b3UncmUgbmV3IHRvIEdPYmplY3QsIHRyeSBub3QgdG8gYmUgaW50aW1pZGF0ZWQgYnkgdGhlIHF1YW50aXR5CisgICBvZiBjb2RlIGhlcmUtLS1tdWNoIG9mIGl0IGlzIGJvaWxlcnBsYXRlIGFuZCBjYW4gbW9zdGx5IGJlCisgICBjb3BpZWQtYW5kLXBhc3RlZCBmcm9tIGV4aXN0aW5nIHdvcmsuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvCisgICB0aGUgR09iamVjdCBSZWZlcmVuY2UgTWFudWFsLCBhdmFpbGFibGUgb25saW5lIGF0CisgICBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ29iamVjdC8uICovCisKKyNkZWZpbmUgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgXAorICAodHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcikpCisjZGVmaW5lIFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUikpCisjZGVmaW5lIElTX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUikpCisjZGVmaW5lIFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MpKQorCitzdHJ1Y3QgX1R1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgeworICBDYWxjdWxhdG9ySGFuZGxlciBwYXJlbnRfaW5zdGFuY2U7CisKKyAgLyogcHJpdmF0ZSAqLworICBHSGFzaFRhYmxlICpsb2c7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1R1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcjsKKworc3RydWN0IF9UdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgeworICBDYWxjdWxhdG9ySGFuZGxlckNsYXNzIHBhcmVudF9jbGFzczsKK307Cit0eXBlZGVmIHN0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzczsKKworR1R5cGUgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBmb2xsb3dzLiAqLworCitHX0RFRklORV9UWVBFIChUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyLAorICAgICAgICAgICAgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgVFlQRV9DQUxDVUxBVE9SX0hBTkRMRVIpCisKKy8qIEVhY2ggb2YgYSBoYW5kbGVyJ3MgbWV0aG9kcyBhY2NlcHRzIGF0IGxlYXN0IHR3byBwYXJhbWV0ZXJzOiBBCisgICBwb2ludGVyIHRvIHRoZSBzZXJ2aWNlLWludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAodGhlIGhhbmRsZXIgb2JqZWN0CisgICBpdHNlbGYpIGFuZCBhIGhhbmRsZSB0byBhIEdFcnJvciBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZSBpbmZvcm1hdGlvbgorICAgYWJvdXQgYW55IGVycm9yIHRoYXQgb2NjdXJzLgorCisgICBPbiBzdWNjZXNzLCBhIGhhbmRsZXIgbWV0aG9kIHJldHVybnMgVFJVRS4gQSByZXR1cm4gdmFsdWUgb2YgRkFMU0UKKyAgIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCBhbmQgdGhlIGVycm9yIHBhcmFtZXRlciBoYXMgYmVlbgorICAgc2V0LiAoTWV0aG9kcyBzaG91bGQgbm90IHJldHVybiBGQUxTRSB3aXRob3V0IGZpcnN0IHNldHRpbmcgdGhlCisgICBlcnJvciBwYXJhbWV0ZXIuKSAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfcGluZyAoQ2FsY3VsYXRvcklmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHV0cyAoInBpbmcoKSIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBTZXJ2aWNlLW1ldGhvZCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhyb3VnaCBhcyBwYXJhbWV0ZXJzIHRvIHRoZQorICAgaGFuZGxlciBtZXRob2QuCisKKyAgIElmIHRoZSBzZXJ2aWNlIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgYW4gb3V0cHV0IHBhcmFtZXRlciwgX3JldHVybiwKKyAgIGlzIGFkZGl0aW9uYWxseSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgbWV0aG9kLiBUaGlzIHBhcmFtZXRlciBzaG91bGQKKyAgIGJlIHNldCBhcHByb3ByaWF0ZWx5IGJlZm9yZSB0aGUgbWV0aG9kIHJldHVybnMsIHdoZW5ldmVyIGl0CisgICBzdWNjZWVkcy4KKworICAgVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGhhcHBlbnMgdG8gYmUgb2YgYSBiYXNlIHR5cGUsCisgICBpMzIsIGJ1dCBub3RlIGlmIGEgbWV0aG9kIHJldHVybnMgYSBjb21wbGV4IHR5cGUgc3VjaCBhcyBhIG1hcCBvcgorICAgbGlzdCAqX3JldHVybiB3aWxsIHBvaW50IHRvIGEgcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlLWFsbG9jYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9hZGQgKENhbGN1bGF0b3JJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgIG51bTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICBudW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgiYWRkKCVkLCVkKVxuIiwgbnVtMSwgbnVtMik7CisgICpfcmV0dXJuID0gbnVtMSArIG51bTI7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEFueSBoYW5kbGVyIG1ldGhvZCBjYW4gcmV0dXJuIGEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gdG8gdGhlCisgICBjbGllbnQgYnkgc2V0dGluZyBpdHMgZXJyb3IgcGFyYW1ldGVyIGFwcHJvcHJpYXRlbHkgYW5kIHJldHVybmluZworICAgRkFMU0UuIFNlZSB0aGUgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25FcnJvciBlbnVtZXJhdGlvbiBkZWZpbmVkCisgICBpbiB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmggZm9yIGEgbGlzdCBvZiByZWNvZ25pemVkCisgICBleGNlcHRpb24gdHlwZXMgKEdFcnJvciBjb2RlcykuCisKKyAgIElmIGEgc2VydmljZSBtZXRob2QgY2FuIGFsc28gdGhyb3cgYSBjdXN0b20gZXhjZXB0aW9uICh0aGF0IGlzLCBvbmUKKyAgIGRlZmluZWQgaW4gdGhlIC50aHJpZnQgZmlsZSkgYW4gYWRkaXRpb25hbCBvdXRwdXQgcGFyYW1ldGVyIHdpbGwgYmUKKyAgIHByb3ZpZGVkIChoZXJlLCAib3VjaCIpIHRvIGhvbGQgYW4gaW5zdGFuY2Ugb2YgdGhlIGV4Y2VwdGlvbiwgd2hlbgorICAgbmVjZXNzYXJ5LiBOb3RlIHRoZXJlIHdpbGwgYmUgYSBzZXBhcmF0ZSBwYXJhbWV0ZXIgYWRkZWQgZm9yIGVhY2gKKyAgIHR5cGUgb2YgZXhjZXB0aW9uIHRoZSBtZXRob2QgY2FuIHRocm93LgorCisgICBVbmxpa2UgcmV0dXJuIHZhbHVlcywgZXhjZXB0aW9uIG9iamVjdHMgYXJlIG5ldmVyIHByZS1jcmVhdGVkOyB0aGlzCisgICBpcyBhbHdheXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBoYW5kbGVyIG1ldGhvZC4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2NhbGN1bGF0ZSAoQ2FsY3VsYXRvcklmICAgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgbG9naWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JrICAgICAgICAqdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gKipvdWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAqKmVycm9yKQoreworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpzZWxmOworCisgIGdpbnQgKmxvZ19rZXk7CisgIGdjaGFyIGxvZ192YWx1ZVsxMl07CisgIFNoYXJlZFN0cnVjdCAqbG9nX3N0cnVjdDsKKworICBnaW50IG51bTE7CisgIGdpbnQgbnVtMjsKKyAgT3BlcmF0aW9uIG9wOworICBnYm9vbGVhbiByZXN1bHQgPSBUUlVFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKElTX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAoaWZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICBzZWxmID0gVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogUmVtZW1iZXI6IEV4Y2VwdGlvbiBvYmplY3RzIGFyZSBuZXZlciBwcmUtY3JlYXRlZCAqLworICBnX2Fzc2VydCAoKm91Y2ggPT0gTlVMTCk7CisKKyAgLyogRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIG91ciBXb3JrIHBhcmFtZXRlci4KKworICAgICBOb3RlIHRoYXQgaW50ZWdlciBwcm9wZXJ0aWVzIG9mIHRoaXJ0eS10d28gYml0cyBvciBmZXdlciBpbiB3aWR0aAorICAgICBhcmUgX2Fsd2F5c18gb2YgdHlwZSBnaW50LCByZWdhcmRsZXNzIG9mIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhleQorICAgICBob2xkLiBBIGNvbW1vbiBlcnJvciBpcyB0cnlpbmcgdG8gcmV0cmlldmUsIHNheSwgYSBzdHJ1Y3R1cmUKKyAgICAgbWVtYmVyIGRlZmluZWQgaW4gdGhlIC50aHJpZnQgZmlsZSBhcyB0eXBlIGkxNiBpbnRvIGEgdmFyaWFibGUgb2YKKyAgICAgdHlwZSBnaW50MTYsIHdoaWNoIHdpbGwgY2xvYmJlciB2YXJpYWJsZXMgYWRqYWNlbnQgb24gdGhlCisgICAgIHN0YWNrLiBSZW1lbWJlcjogSWYgeW91J3JlIHJldHJpZXZpbmcgYW4gaW50ZWdlciBwcm9wZXJ0eSB0aGUKKyAgICAgcmVjZWl2aW5nIHZhcmlhYmxlIG11c3QgYmUgb2YgZWl0aGVyIHR5cGUgZ2ludCBvciBnaW50NjQsIGFzCisgICAgIGFwcHJvcHJpYXRlLiAqLworICBnX29iamVjdF9nZXQgKChXb3JrICopdywKKyAgICAgICAgICAgICAgICAibnVtMSIsICZudW0xLAorICAgICAgICAgICAgICAgICJudW0yIiwgJm51bTIsCisgICAgICAgICAgICAgICAgIm9wIiwgICAmb3AsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcHJpbnRmICgiY2FsY3VsYXRlKCVkLHslZCwlZCwlZH0pXG4iLCBsb2dpZCwgb3AsIG51bTEsIG51bTIpOworCisgIHN3aXRjaCAob3ApIHsKKyAgY2FzZSBPUEVSQVRJT05fQUREOgorICAgICpfcmV0dXJuID0gbnVtMSArIG51bTI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBPUEVSQVRJT05fU1VCVFJBQ1Q6CisgICAgKl9yZXR1cm4gPSBudW0xIC0gbnVtMjsKKyAgICBicmVhazsKKworICBjYXNlIE9QRVJBVElPTl9NVUxUSVBMWToKKyAgICAqX3JldHVybiA9IG51bTEgKiBudW0yOworICAgIGJyZWFrOworCisgIGNhc2UgT1BFUkFUSU9OX0RJVklERToKKyAgICBpZiAobnVtMiA9PSAwKSB7CisgICAgICAvKiBGb3IgZWFjaCBjdXN0b20gZXhjZXB0aW9uIHR5cGUgYSBzdWJjbGFzcyBvZiBUaHJpZnRTdHJ1Y3QgaXMKKyAgICAgICAgIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLiBUaHJvdyBhbiBleGNlcHRpb24gYnkKKyAgICAgICAgIHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHBhcmFtZXRlciB0byBhIG5ldyBpbnN0YW5jZQorICAgICAgICAgb2YgaXRzIHR5cGUgYW5kIHJldHVybmluZyBGQUxTRS4gKi8KKyAgICAgICpvdWNoID0gZ19vYmplY3RfbmV3IChUWVBFX0lOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0T3AiLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2h5IiwgIGdfc3RyZHVwICgiQ2Fubm90IGRpdmlkZSBieSAwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKworICAgICAgLyogTm90ZSB0aGUgY2FsbCB0byBnX3N0cmR1cCBhYm92ZTogQWxsIHRoZSBtZW1vcnkgdXNlZCBieSBhCisgICAgICAgICBUaHJpZnRTdHJ1Y3QncyBwcm9wZXJ0aWVzIGJlbG9uZ3MgdG8gdGhlIG9iamVjdCBpdHNlbGYgYW5kCisgICAgICAgICB3aWxsIGJlIGZyZWVkIG9uIGRlc3RydWN0aW9uLiBSZW1vdmluZyB0aGlzIGNhbGwgdG8gZ19zdHJkdXAKKyAgICAgICAgIHdpbGwgbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdCBhcyB0aGUgb2JqZWN0IHRyaWVzIHRvCisgICAgICAgICByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgc3RhdGljYWxseSB0byB0aGUgcHJvZ3JhbS4gKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqX3JldHVybiA9IG51bTEgLyBudW0yOworICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgICpvdWNoID0gZ19vYmplY3RfbmV3IChUWVBFX0lOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdE9wIiwgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aHkiLCAgZ19zdHJkdXAgKCJJbnZhbGlkIE9wZXJhdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorCisgIC8qIE9uIHN1Y2Nlc3MsIGxvZyBhIHJlY29yZCBvZiB0aGUgcmVzdWx0IHRvIG91ciBoYXNoIHRhYmxlICovCisgIGlmIChyZXN1bHQpIHsKKyAgICBsb2dfa2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqbG9nX2tleSk7CisgICAgKmxvZ19rZXkgPSBsb2dpZDsKKworICAgIHNucHJpbnRmIChsb2dfdmFsdWUsIHNpemVvZiBsb2dfdmFsdWUsICIlZCIsICpfcmV0dXJuKTsKKworICAgIGxvZ19zdHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRZUEVfU0hBUkVEX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5IiwgICAqbG9nX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiLCAgZ19zdHJkdXAgKGxvZ192YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19oYXNoX3RhYmxlX3JlcGxhY2UgKHNlbGYtPmxvZywgbG9nX2tleSwgbG9nX3N0cnVjdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBBIG9uZS13YXkgbWV0aG9kIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUgYXMgYW4gZXF1aXZhbGVudCwgcmVndWxhcgorICAgbWV0aG9kIHRoYXQgcmV0dXJucyBubyB2YWx1ZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX3ppcCAoQ2FsY3VsYXRvcklmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwdXRzICgiemlwKCkiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogQXMgc3BlY2lmaWVkIGluIHRoZSAudGhyaWZ0IGZpbGUgKHR1dG9yaWFsLnRocmlmdCksIHRoZSBDYWxjdWxhdG9yCisgICBzZXJ2aWNlIGV4dGVuZHMgdGhlIFNoYXJlZFNlcnZpY2Ugc2VydmljZS4gQ29ycmVzcG9uZGluZ2x5LCBpbiB0aGUKKyAgIGdlbmVyYXRlZCBjb2RlIHRoZSBDYWxjdWxhdG9yIGludGVyZmFjZSwgQ2FsY3VsYXRvcklmLCBleHRlbmRzIHRoZQorICAgU2hhcmVkU2VydmljZSBpbnRlcmZhY2UsIFNoYXJlZFNlcnZpY2VJZiwgYW5kIHN1YmNsYXNzZXMgb2YKKyAgIENhbGN1bGF0b3JIYW5kbGVyIHNob3VsZCBpbXBsZW1lbnQgaXRzIG1ldGhvZHMgYXMgd2VsbC4KKworICAgSGVyZSB3ZSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2V0U3RydWN0IG1ldGhvZCBmcm9tIHRoZQorICAgcGFyZW50IHNlcnZpY2UuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9nZXRfc3RydWN0IChTaGFyZWRTZXJ2aWNlSWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRTdHJ1Y3QgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgIGtleTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAqKmVycm9yKQoreworICBnaW50IGtleSA9IChnaW50KWtleTMyOworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpzZWxmOworICBTaGFyZWRTdHJ1Y3QgKmxvZ19zdHJ1Y3Q7CisgIGdpbnQgbG9nX2tleTsKKyAgZ2NoYXIgKmxvZ192YWx1ZTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChJU19UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgc2VsZiA9IFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAoaWZhY2UpOworCisgIC8qIFJlbWVtYmVyOiBDb21wbGV4IHJldHVybiB0eXBlcyBhcmUgYWx3YXlzIHByZS1jcmVhdGVkIGFuZCBuZWVkCisgICAgIG9ubHkgYmUgcG9wdWxhdGVkICovCisgIGdfYXNzZXJ0ICgqX3JldHVybiAhPSBOVUxMKTsKKworICBwcmludGYgKCJnZXRTdHJ1Y3QoJWQpXG4iLCBrZXkpOworCisgIC8qIElmIHRoZSBrZXkgZXhpc3RzIGluIG91ciBsb2csIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBsb2dnZWQKKyAgICAgZGF0YSAob3IgYW4gZW1wdHkgU2hhcmVkU3RydWN0IHN0cnVjdHVyZSBpZiBpdCBkb2VzIG5vdCkuCisKKyAgICAgSW5jaWRlbnRhbGx5LCBub3RlIHdlIF9tdXN0XyBoZXJlIGNvcHkgdGhlIHZhbHVlcyBmcm9tIHRoZSBoYXNoCisgICAgIHRhYmxlIGludG8gdGhlIHJldHVybiBzdHJ1Y3R1cmUuIEFsbCBtZW1vcnkgdXNlZCBieSB0aGUgcmV0dXJuCisgICAgIHN0cnVjdHVyZSBiZWxvbmdzIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGFuZCB3aWxsIGJlIGZyZWVkIG9uY2UKKyAgICAgYSByZXNwb25zZSBpcyBzZW50IHRvIHRoZSBjbGllbnQuIElmIHdlIG1lcmVseSBmcmVlZCAqX3JldHVybiBhbmQKKyAgICAgc2V0IGl0IHRvIHBvaW50IHRvIG91ciBoYXNoLXRhYmxlIGVudHJ5LCB0aGF0IHdvdWxkIG1lYW4gbWVtb3J5CisgICAgIHdvdWxkIGJlIHJlbGVhc2VkIChlZmZlY3RpdmVseSwgZGF0YSBlcmFzZWQpIG91dCBvZiB0aGUgaGFzaAorICAgICB0YWJsZSEgKi8KKyAgbG9nX3N0cnVjdCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKHNlbGYtPmxvZywgJmtleSk7CisgIGlmIChsb2dfc3RydWN0ICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF9nZXQgKGxvZ19zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAia2V5IiwgICAmbG9nX2tleSwKKyAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsICZsb2dfdmFsdWUsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgImtleSIsICAgbG9nX2tleSwKKyAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsIGdfc3RyZHVwIChsb2dfdmFsdWUpLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcidzIGluc3RhbmNlIGZpbmFsaXplciAoZGVzdHJ1Y3RvcikgKi8KK3N0YXRpYyB2b2lkCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZiA9CisgICAgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIGNhbGN1bGF0aW9uLWxvZyBoYXNoIHRhYmxlICovCisgIGdfaGFzaF90YWJsZV91bnJlZiAoc2VsZi0+bG9nKTsKKyAgc2VsZi0+bG9nID0gTlVMTDsKKworICAvKiBDaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzICovCisgIEdfT0JKRUNUX0NMQVNTICh0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfcGFyZW50X2NsYXNzKS0+CisgICAgZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIncyBpbnN0YW5jZSBpbml0aWFsaXplciAoY29uc3RydWN0b3IpICovCitzdGF0aWMgdm9pZAordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2luaXQgKFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGYpCit7CisgIC8qIENyZWF0ZSBvdXIgY2FsY3VsYXRpb24tbG9nIGhhc2ggdGFibGUgKi8KKyAgc2VsZi0+bG9nID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX29iamVjdF91bnJlZik7Cit9CisKKy8qIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIncyBjbGFzcyBpbml0aWFsaXplciAqLworc3RhdGljIHZvaWQKK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9jbGFzc19pbml0IChUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgKmtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBTaGFyZWRTZXJ2aWNlSGFuZGxlckNsYXNzICpzaGFyZWRfc2VydmljZV9oYW5kbGVyX2NsYXNzID0KKyAgICBTSEFSRURfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisgIENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgKmNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcyA9CisgICAgQ0FMQ1VMQVRPUl9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKyAgLyogUmVnaXN0ZXIgb3VyIGRlc3RydWN0b3IgKi8KKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZmluYWxpemU7CisKKyAgLyogUmVnaXN0ZXIgb3VyIGltcGxlbWVudGF0aW9ucyBvZiBDYWxjdWxhdG9ySGFuZGxlcidzIG1ldGhvZHMgKi8KKyAgY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzLT5waW5nID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfcGluZzsKKyAgY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzLT5hZGQgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9hZGQ7CisgIGNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcy0+Y2FsY3VsYXRlID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfY2FsY3VsYXRlOworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPnppcCA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX3ppcDsKKworICAvKiBSZWdpc3RlciBvdXIgaW1wbGVtZW50YXRpb24gb2YgU2hhcmVkU2VydmljZUhhbmRsZXIncyBtZXRob2QgKi8KKyAgc2hhcmVkX3NlcnZpY2VfaGFuZGxlcl9jbGFzcy0+Z2V0X3N0cnVjdCA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2dldF9zdHJ1Y3Q7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhhdCBlbmRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyLgorICAgRXZlcnl0aGluZyBiZWxvdyBpcyBmYWlybHkgZ2VuZXJpYyBjb2RlIHRoYXQgc2V0cyB1cCBhIG1pbmltYWwKKyAgIFRocmlmdCBzZXJ2ZXIgZm9yIHR1dG9yaWFsIGNsaWVudHMuICovCisKKworLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZQorICAgU0lHSU5UIHNpZ25hbCBoYW5kbGVyICovCitUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CisKKy8qIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGludGVycnVwdGVkIHdpdGgKKyAgIFNJR0lOVCAoaS5lLiBDdHJsLUMpIHNvIHdlIGNhbiB0ZWxsIHdoZXRoZXIgaXRzIHRlcm1pbmF0aW9uIHdhcworICAgYWJub3JtYWwgKi8KK2dib29sZWFuIHNpZ2ludF9yZWNlaXZlZCA9IEZBTFNFOworCisvKiBIYW5kbGUgU0lHSU5UICgiQ3RybC1DIikgc2lnbmFscyBieSBncmFjZWZ1bGx5IHN0b3BwaW5nIHRoZQorICAgc2VydmVyICovCitzdGF0aWMgdm9pZAorc2lnaW50X2hhbmRsZXIgKGludCBzaWduYWxfbnVtYmVyKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2lnbmFsX251bWJlcik7CisKKyAgLyogVGFrZSBub3RlIHdlIHdlcmUgY2FsbGVkICovCisgIHNpZ2ludF9yZWNlaXZlZCA9IFRSVUU7CisKKyAgLyogU2h1dCBkb3duIHRoZSBzZXJ2ZXIgZ3JhY2VmdWxseSAqLworICBpZiAoc2VydmVyICE9IE5VTEwpCisgICAgdGhyaWZ0X3NlcnZlcl9zdG9wIChzZXJ2ZXIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqaGFuZGxlcjsKKyAgQ2FsY3VsYXRvclByb2Nlc3NvciAqcHJvY2Vzc29yOworCisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqcHJvdG9jb2xfZmFjdG9yeTsKKworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2ludF9hY3Rpb247CisKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGludCBleGl0X3N0YXR1cyA9IDA7CisKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIC8qIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBvdXIgaGFuZGxlciwgd2hpY2ggcHJvdmlkZXMgdGhlIHNlcnZpY2UncworICAgICBtZXRob2RzJyBpbXBsZW1lbnRhdGlvbiAqLworICBoYW5kbGVyID0KKyAgICBnX29iamVjdF9uZXcgKFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlJ3MgcHJvY2Vzc29yLCBhdXRvbWF0aWNhbGx5CisgICAgIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLCB3aGljaCBwYXJzZXMgaW5jb21pbmcgbWVzc2FnZXMKKyAgICAgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGluIHRoZSBoYW5kbGVyICovCisgIHByb2Nlc3NvciA9CisgICAgZ19vYmplY3RfbmV3IChUWVBFX0NBTENVTEFUT1JfUFJPQ0VTU09SLAorICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIG91ciBzZXJ2ZXIgc29ja2V0LCB3aGljaCBiaW5kcyB0byB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kCisgICAgIGxpc3RlbnMgZm9yIGNsaWVudCBjb25uZWN0aW9ucyAqLworICBzZXJ2ZXJfdHJhbnNwb3J0ID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAicG9ydCIsIDkwOTAsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgb3VyIHRyYW5zcG9ydCBmYWN0b3J5LCB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8gd3JhcCAicmF3IgorICAgICBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBjbGllbnQgKGluIHRoaXMgY2FzZSB3aXRoIGEKKyAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSkgKi8KKyAgdHJhbnNwb3J0X2ZhY3RvcnkgPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgb3VyIHByb3RvY29sIGZhY3RvcnksIHdoaWNoIGRldGVybWluZXMgd2hpY2ggd2lyZSBwcm90b2NvbAorICAgICB0aGUgc2VydmVyIHdpbGwgdXNlIChpbiB0aGlzIGNhc2UsIFRocmlmdCdzIGJpbmFyeSBwcm90b2NvbCkgKi8KKyAgcHJvdG9jb2xfZmFjdG9yeSA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSB0aGUgc2VydmVyIGl0c2VsZiAqLworICBzZXJ2ZXIgPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICJwcm9jZXNzb3IiLCAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAic2VydmVyX3RyYW5zcG9ydCIsICAgICAgICAgc2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICJvdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBJbnN0YWxsIG91ciBTSUdJTlQgaGFuZGxlciwgd2hpY2ggaGFuZGxlcyBDdHJsLUMgYmVpbmcgcHJlc3NlZCBieQorICAgICBzdG9wcGluZyB0aGUgc2VydmVyIGdyYWNlZnVsbHkgKG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBhCisgICAgIG5pY2UgdG91Y2gpICovCisgIG1lbXNldCAoJnNpZ2ludF9hY3Rpb24sIDAsIHNpemVvZiAoc2lnaW50X2FjdGlvbikpOworICBzaWdpbnRfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWdpbnRfaGFuZGxlcjsKKyAgc2lnaW50X2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgc2lnYWN0aW9uIChTSUdJTlQsICZzaWdpbnRfYWN0aW9uLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgc2VydmVyLCB3aGljaCB3aWxsIHJ1biB1bnRpbCBpdHMgc3RvcCBtZXRob2QgaXMgaW52b2tlZAorICAgICAoZnJvbSB3aXRoaW4gdGhlIFNJR0lOVCBoYW5kbGVyLCBpbiB0aGlzIGNhc2UpICovCisgIHB1dHMgKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgIHRocmlmdF9zZXJ2ZXJfc2VydmUgKHNlcnZlciwgJmVycm9yKTsKKworICAvKiBJZiB0aGUgc2VydmVyIHN0b3BwZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBoYXZpbmcgYmVlbgorICAgICBpbnRlcnJ1cHRlZCBieSB0aGUgdXNlciwgcmVwb3J0IHRoZSBlcnJvciAqLworICBpZiAoIXNpZ2ludF9yZWNlaXZlZCkgeworICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKyAgICAgICAgICAgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICB9CisKKyAgcHV0cyAoImRvbmUuIik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcik7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworCisgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOworICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjIwMTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldHVwLWxvY2FsLWxpc3AtZW52OiBlbnN1cmUtZXh0ZXJuYWxzLnNoCisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK2dlbi1jbDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLXIgJDwKKworQUxMX0ZJTEVfUFJFUkVRUyA9IFwKKwkJICAgbG9hZC1sb2NhbGx5Lmxpc3AgXAorCQkgICBtYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIFwKKwkJICAgbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcCBcCisJCSAgIHNoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwkJICAgdGhyaWZ0LXR1dG9yaWFsLmFzZCBcCisJCSAgIHR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKKworIyBOT1RFOiB0aGUgc2VydmVyIGFuZCBjbGllbnQgY2Fubm90IGJlIGJ1aWx0IGluIHBhcmFsbGVsCisjIGJlY2F1c2Ugb24gbG9hZGluZyB0aGUgbWFrZS10dXRvcmlhbC0qIHNjcmlwdHMgU0JDTCB3aWxsCisjIGF0dGVtcHQgdG8gY29tcGlsZSB0aGVpciBkZXBlbmRlbmNpZXMuIFVuZm9ydHVuYXRlbHksCisjIGJlY2F1c2UgdGhlaXIgZGVwZW5kZW5jaWVzIGFyZSBzaGFyZWQsIHBhcmFsbGVsIGpvYnMgY2FuCisjIGVuZCB1cCBvdmVyd3JpdGluZyBvciBjb3JydXB0aW5nIHRoZSBjb21waWxlZCBmaWxlcworYWxsLWxvY2FsOiBnZW4tY2wgc2V0dXAtbG9jYWwtbGlzcC1lbnYgJChBTExfRklMRV9QUkVSRVFTKQorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi9UdXRvcmlhbFNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi9UdXRvcmlhbENsaWVudAorCitjbGVhbi1sb2NhbDoKKwktJChSTSkgLXIgZ2VuLSoKKwktJChSTSkgLXIgZXh0ZXJuYWxzCisJLSQoUk0pIC1yIHF1aWNrbGlzcAorCS0kKFJNKSAtciBsaWIKKwktJChSTSkgcXVpY2tsaXNwLmxpc3AKKwktJChSTSkgYmFja3BvcnQtdXBkYXRlLnppcAorCS0kKFJNKSBzaGFyZWQtaW1wbGVtZW50YXRpb24uZmFzbAorCS0kKFJNKSB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5mYXNsCisJLSQoUk0pIFR1dG9yaWFsU2VydmVyCisJLSQoUk0pIFR1dG9yaWFsQ2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCXRocmlmdC10dXRvcmlhbC5hc2QgXAorCW1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgXAorCW1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2ggYi90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVhZThjNTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTJhMGEyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKQEAgLTAsMCArMSwyMiBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgSnVzdCBhIHNjcmlwdCBmb3IgbG9hZGluZyB0aGUgbGlicmFyeSBpdHNlbGYsIHVzaW5nIGJ1bmRsZWQgZGVwZW5kZW5jaWVzLgorOzs7OyBUaGlzIGlzIGFuIGlkZW50aWNhbCBjb3B5IG9mIHRoZSBmaWxlIGluIGxpYi9jbC4KKworKHJlcXVpcmUgImFzZGYiKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJleHRlcm5hbHMvYnVuZGxlLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJsaWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3RocmlmdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcCBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDg2MQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKQEAgLTAsMCArMSw1MSBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImxvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3NoYXJlZC90aHJpZnQtZ2VuLXNoYXJlZC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvdHV0b3JpYWwvdGhyaWZ0LWdlbi10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJ0aHJpZnQtdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10dXRvcmlhbCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3IgdGhlIGJpbmFyeS4iCisgICh0aHJpZnQ6d2l0aC1jbGllbnQgKHByb3QgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTAiKQorICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOnBpbmcgcHJvdCkKKyAgICAoZm9ybWF0IHQgInBpbmcoKX4lIikKKyAgICAoZm9ybWF0IHQgIjEgKyAxID0gfmF+JSIgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3QgMSAxKSkKKyAgICAobGV0ICgod29yay1pbnN0YW5jZSAodHV0b3JpYWw6bWFrZS13b3JrIDpudW0xIDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudW0yIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvcCB0dXRvcmlhbDpvcGVyYXRpb24uZGl2aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tbWVudCAiQm9veWEhIikpKQorICAgICAgKGhhbmRsZXItY2FzZSAoZm9ybWF0IHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAvIDAgPSB+YSAtIE9oLCByZWFsbHk/IEFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBoZXJlLn4lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90IDEgd29yay1pbnN0YW5jZSkpCisgICAgICAgICh0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uIChlKQorICAgICAgICAgIChmb3JtYXQgdCAiLS0tfiUoRXhwZWN0ZWQpIEludmFsaWQgT3BlcmF0aW9uIGNhdWdodDogfiV+YX4lLS0tfiUiIGUpKSkpCisgICAgKGxldCAoKHdvcmstaW5zdGFuY2UgKHR1dG9yaWFsOm1ha2Utd29yayA6bnVtMSAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bTIgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvcCB0dXRvcmlhbDpvcGVyYXRpb24uc3VidHJhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21tZW50ICJQbGF5aW5nIG5pY2UgdGhpcyB0aW1lLiIpKSkKKyAgICAgIChoYW5kbGVyLWNhc2UgKGZvcm1hdCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE1IC0gMTAgPSB+YX4lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90IDEgd29yay1pbnN0YW5jZSkpCisgICAgICAgICh0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uIChlKQorICAgICAgICAgIChmb3JtYXQgdCAiLS0tfiUoVW5leHBlY3RlZCkgSW52YWxpZCBPcGVyYXRpb24gY2F1Z2h0OiB+JX5hfiUtLS1+JSIgZSkpKSkKKyAgICAoZm9ybWF0IHQgIkNoZWNrIGxvZzogfmF+JSIgKHNoYXJlZC5zaGFyZWQtc2VydmljZTpnZXQtc3RydWN0IHByb3QgMSkpKSkKKworKGNsb246ZHVtcCAiVHV0b3JpYWxDbGllbnQiIG1haW4pCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2YxYTkwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcApAQCAtMCwwICsxLDI5IEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAibG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvc2hhcmVkL3RocmlmdC1nZW4tc2hhcmVkLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC90dXRvcmlhbC90aHJpZnQtZ2VuLXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgInRocmlmdC10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXR1dG9yaWFsKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5LiIKKyAgKHRocmlmdDpzZXJ2ZSAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MCIgdHV0b3JpYWw6Y2FsY3VsYXRvcikpCisKKyhjbG9uOmR1bXAgIlR1dG9yaWFsU2VydmVyIiBtYWluKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgYi90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTk3NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSwyNSBAQAorKGluLXBhY2thZ2UgIzpzaGFyZWQtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnZhciAqc3RydWN0cyogKG1ha2UtaGFzaC10YWJsZSkpCisKKyhkZWZ1biBzaGFyZWQuc2hhcmVkLXNlcnZpY2UtaW1wbGVtZW50YXRpb246Z2V0LXN0cnVjdCAoa2V5KQorICAoZm9ybWF0IHQgImdldFN0cnVjdCh+YSl+JSIga2V5KQorICAoZ2V0aGFzaCBrZXkgKnN0cnVjdHMqKSkKKworKGRlZnVuIGFkZC1sb2cgKGtleSB2YWx1ZSkKKyAgKHNldGYgKGdldGhhc2gga2V5ICpzdHJ1Y3RzKikKKyAgICAgICAgKG1ha2UtaW5zdGFuY2UgJ3NoYXJlZDpzaGFyZWRzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgOmtleSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlICh3cml0ZS10by1zdHJpbmcgdmFsdWUpKSkpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkIGIvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAzNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZApAQCAtMCwwICsxLDE3IEBACis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhhc2RmOmRlZnN5c3RlbSAjOnRocmlmdC10dXRvcmlhbAorICA6ZGVwZW5kcy1vbiAoIzp0aHJpZnQtZ2VuLXR1dG9yaWFsKQorICA6c2VyaWFsIHQKKyAgOmNvbXBvbmVudHMgKCg6ZmlsZSAic2hhcmVkLWltcGxlbWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICg6ZmlsZSAidHV0b3JpYWwtaW1wbGVtZW50YXRpb24iKSkpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwIGIvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkyZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDQxIEBACisoaW4tcGFja2FnZSAjOnR1dG9yaWFsLWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnBpbmcgKCkKKyAgKGZvcm1hdCB0ICJwaW5nKCl+JSIpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgKGZvcm1hdCB0ICJhZGQofmEsIH5hKX4lIiBudW0xIG51bTIpCisgICgrIG51bTEgbnVtMikpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgd29yaykKKyAgKGZvcm1hdCB0ICJjYWxjdWxhdGUofmEsIH5hKX4lIiBsb2dpZCB3b3JrKQorICAoaGFuZGxlci1jYXNlCisgICAgICAobGV0KiAoKG51bTEgKHR1dG9yaWFsOndvcmstbnVtMSB3b3JrKSkKKyAgICAgICAgICAgICAobnVtMiAodHV0b3JpYWw6d29yay1udW0yIHdvcmspKQorICAgICAgICAgICAgIChvcCAodHV0b3JpYWw6d29yay1vcCB3b3JrKSkKKyAgICAgICAgICAgICAocmVzdWx0CisgICAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5hZGQpICgrIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5zdWJ0cmFjdCkgKC0gbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLm11bHRpcGx5KSAoKiBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uZGl2aWRlKSAoLyBudW0xIG51bTIpKSkpKQorICAgICAgICAoc2hhcmVkLWltcGxlbWVudGF0aW9uOjphZGQtbG9nIGxvZ2lkIHJlc3VsdCkKKyAgICAgICAgcmVzdWx0KQorICAgIChkaXZpc2lvbi1ieS16ZXJvICgpIChlcnJvciAndHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2h5ICJEaXZpc2lvbiBieSB6ZXJvLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoYXQtb3AgKHR1dG9yaWFsOndvcmstb3Agd29yaykpKSkpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAoZm9ybWF0IHQgInppcCgpfiUiKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dCBiL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM0YjQxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworI01ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwIikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvY3BwL3NyYyIpCisKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitzZXQodHV0b3JpYWxnZW5jcHBfU09VUkNFUworICAgIGdlbi1jcHAvQ2FsY3VsYXRvci5jcHAKKyAgICBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcAorICAgIGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcAorICAgIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCispCithZGRfbGlicmFyeSh0dXRvcmlhbGdlbmNwcCBTVEFUSUMgJHt0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0dXRvcmlhbGdlbmNwcCB0aHJpZnQpCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CispCisKK2FkZF9leGVjdXRhYmxlKFR1dG9yaWFsU2VydmVyIENwcFNlcnZlci5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxTZXJ2ZXIgdHV0b3JpYWxnZW5jcHApCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHV0b3JpYWxTZXJ2ZXIgdGhyaWZ0KQoraWYgKFpMSUJfRk9VTkQpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciAke1pMSUJfTElCUkFSSUVTfSkKK2VuZGlmICgpCisKK2FkZF9leGVjdXRhYmxlKFR1dG9yaWFsQ2xpZW50IENwcENsaWVudC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxDbGllbnQgdHV0b3JpYWxnZW5jcHApCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHV0b3JpYWxDbGllbnQgdGhyaWZ0KQoraWYgKFpMSUJfRk9VTkQpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCAke1pMSUJfTElCUkFSSUVTfSkKK2VuZGlmICgpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCmluZGV4IGEzZjE3ZmUuLjUyMDg0MTEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCkBAIC0xNywxMyArMTcsMTEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KIAogI2luY2x1ZGUgIi4uL2dlbi1jcHAvQ2FsY3VsYXRvci5oIgogCkBAIC0zNSw1MCArMzMsNDggQEAKIHVzaW5nIG5hbWVzcGFjZSB0dXRvcmlhbDsKIHVzaW5nIG5hbWVzcGFjZSBzaGFyZWQ7CiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworaW50IG1haW4oKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwogICBDYWxjdWxhdG9yQ2xpZW50IGNsaWVudChwcm90b2NvbCk7CiAKICAgdHJ5IHsKICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKIAogICAgIGNsaWVudC5waW5nKCk7Ci0gICAgcHJpbnRmKCJwaW5nKClcbiIpOworICAgIGNvdXQgPDwgInBpbmcoKSIgPDwgZW5kbDsKIAotICAgIGludDMyX3Qgc3VtID0gY2xpZW50LmFkZCgxLDEpOwotICAgIHByaW50ZigiMSsxPSVkXG4iLCBzdW0pOworICAgIGNvdXQgPDwgIjEgKyAxID0gIiA8PCBjbGllbnQuYWRkKDEsIDEpIDw8IGVuZGw7CiAKICAgICBXb3JrIHdvcms7Ci0gICAgd29yay5vcCA9IERJVklERTsKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uOjpESVZJREU7CiAgICAgd29yay5udW0xID0gMTsKICAgICB3b3JrLm51bTIgPSAwOwogCiAgICAgdHJ5IHsKLSAgICAgIGludDMyX3QgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgcHJpbnRmKCJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hXG4iKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uICZpbykgewotICAgICAgcHJpbnRmKCJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiwgaW8ud2h5LmNfc3RyKCkpOworICAgICAgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIGNvdXQgPDwgIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyEiIDw8IGVuZGw7CisgICAgfSBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiYgaW8pIHsKKyAgICAgIGNvdXQgPDwgIkludmFsaWRPcGVyYXRpb246ICIgPDwgaW8ud2h5IDw8IGVuZGw7CisgICAgICAvLyBvciB1c2luZyBnZW5lcmF0ZWQgb3BlcmF0b3I8PDogY291dCA8PCBpbyA8PCBlbmRsOworICAgICAgLy8gb3IgYnkgdXNpbmcgc3RkOjpleGNlcHRpb24gbmF0aXZlIG1ldGhvZCB3aGF0KCk6IGNvdXQgPDwgaW8ud2hhdCgpIDw8IGVuZGw7CiAgICAgfQogCi0gICAgd29yay5vcCA9IFNVQlRSQUNUOworICAgIHdvcmsub3AgPSBPcGVyYXRpb246OlNVQlRSQUNUOwogICAgIHdvcmsubnVtMSA9IDE1OwogICAgIHdvcmsubnVtMiA9IDEwOwogICAgIGludDMyX3QgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgcHJpbnRmKCIxNS0xMD0lZFxuIiwgZGlmZik7CisgICAgY291dCA8PCAiMTUgLSAxMCA9ICIgPDwgZGlmZiA8PCBlbmRsOwogCiAgICAgLy8gTm90ZSB0aGF0IEMrKyB1c2VzIHJldHVybiBieSByZWZlcmVuY2UgZm9yIGNvbXBsZXggdHlwZXMgdG8gYXZvaWQKICAgICAvLyBjb3N0bHkgY29weSBjb25zdHJ1Y3Rpb24KICAgICBTaGFyZWRTdHJ1Y3Qgc3M7CiAgICAgY2xpZW50LmdldFN0cnVjdChzcywgMSk7Ci0gICAgcHJpbnRmKCJDaGVjayBsb2c6ICVzXG4iLCBzcy52YWx1ZS5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJSZWNlaXZlZCBsb2c6ICIgPDwgc3MgPDwgZW5kbDsKIAogICAgIHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICBwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKyAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBjb3V0IDw8ICJFUlJPUjogIiA8PCB0eC53aGF0KCkgPDwgZW5kbDsKICAgfQotCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCmluZGV4IDIzYzJiODMuLmY3Mzc5ZDUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCkBAIC0xNywxNCArMTcsMTYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgpAQCAtMzQsNiArMzYsNyBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwpAQCAtNDEsMzkgKzQ0LDM1IEBACiB1c2luZyBuYW1lc3BhY2UgdHV0b3JpYWw7CiB1c2luZyBuYW1lc3BhY2Ugc2hhcmVkOwogCi11c2luZyBuYW1lc3BhY2UgYm9vc3Q7Ci0KIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogcHVibGljIENhbGN1bGF0b3JJZiB7Ci0gcHVibGljOgorcHVibGljOgogICBDYWxjdWxhdG9ySGFuZGxlcigpIHt9CiAKLSAgdm9pZCBwaW5nKCkgewotICAgIHByaW50ZigicGluZygpXG4iKTsKLSAgfQorICB2b2lkIHBpbmcoKSB7IGNvdXQgPDwgInBpbmcoKSIgPDwgZW5kbDsgfQogCiAgIGludDMyX3QgYWRkKGNvbnN0IGludDMyX3QgbjEsIGNvbnN0IGludDMyX3QgbjIpIHsKLSAgICBwcmludGYoImFkZCglZCwlZClcbiIsIG4xLCBuMik7CisgICAgY291dCA8PCAiYWRkKCIgPDwgbjEgPDwgIiwgIiA8PCBuMiA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gbjEgKyBuMjsKICAgfQogCi0gIGludDMyX3QgY2FsY3VsYXRlKGNvbnN0IGludDMyX3QgbG9naWQsIGNvbnN0IFdvcmsgJndvcmspIHsKLSAgICBwcmludGYoImNhbGN1bGF0ZSglZCx7JWQsJWQsJWR9KVxuIiwgbG9naWQsIHdvcmsub3AsIHdvcmsubnVtMSwgd29yay5udW0yKTsKKyAgaW50MzJfdCBjYWxjdWxhdGUoY29uc3QgaW50MzJfdCBsb2dpZCwgY29uc3QgV29yayYgd29yaykgeworICAgIGNvdXQgPDwgImNhbGN1bGF0ZSgiIDw8IGxvZ2lkIDw8ICIsICIgPDwgd29yayA8PCAiKSIgPDwgZW5kbDsKICAgICBpbnQzMl90IHZhbDsKIAogICAgIHN3aXRjaCAod29yay5vcCkgewotICAgIGNhc2UgQUREOgorICAgIGNhc2UgT3BlcmF0aW9uOjpBREQ6CiAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFNVQlRSQUNUOgorICAgIGNhc2UgT3BlcmF0aW9uOjpTVUJUUkFDVDoKICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTVVMVElQTFk6CisgICAgY2FzZSBPcGVyYXRpb246Ok1VTFRJUExZOgogICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBESVZJREU6CisgICAgY2FzZSBPcGVyYXRpb246OkRJVklERToKICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgewogICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvOwotICAgICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgIHRocm93IGlvOwogICAgICAgfQpAQCAtODEsNzQgKzgwLDEwMCBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CiAgICAgICBpby53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOwogICAgICAgdGhyb3cgaW87CiAgICAgfQogCiAgICAgU2hhcmVkU3RydWN0IHNzOwogICAgIHNzLmtleSA9IGxvZ2lkOwotICAgIGNoYXIgYnVmZmVyWzEyXTsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQiLCB2YWwpOwotICAgIHNzLnZhbHVlID0gYnVmZmVyOworICAgIHNzLnZhbHVlID0gdG9fc3RyaW5nKHZhbCk7CiAKICAgICBsb2dbbG9naWRdID0gc3M7CiAKICAgICByZXR1cm4gdmFsOwogICB9CiAKLSAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0ICZyZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKLSAgICBwcmludGYoImdldFN0cnVjdCglZClcbiIsIGxvZ2lkKTsKKyAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0JiByZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKKyAgICBjb3V0IDw8ICJnZXRTdHJ1Y3QoIiA8PCBsb2dpZCA8PCAiKSIgPDwgZW5kbDsKICAgICByZXQgPSBsb2dbbG9naWRdOwogICB9CiAKLSAgdm9pZCB6aXAoKSB7Ci0gICAgcHJpbnRmKCJ6aXAoKVxuIik7Ci0gIH0KKyAgdm9pZCB6aXAoKSB7IGNvdXQgPDwgInppcCgpIiA8PCBlbmRsOyB9CiAKIHByb3RlY3RlZDoKICAgbWFwPGludDMyX3QsIFNoYXJlZFN0cnVjdD4gbG9nOwotCiB9OwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKy8qCisgIENhbGN1bGF0b3JJZkZhY3RvcnkgaXMgY29kZSBnZW5lcmF0ZWQuCisgIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgaXMgdXNlZnVsIGZvciBnZXR0aW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIHNpZGUgb2YgdGhlCisgIHRyYW5zcG9ydC4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBtYWtpbmcgcGVyLWNvbm5lY3Rpb24gc3RhdGUuICBXaXRob3V0IHRoaXMKKyAgQ2xvbmVGYWN0b3J5LCBhbGwgY29ubmVjdGlvbnMgd2lsbCBlbmQgdXAgc2hhcmluZyB0aGUgc2FtZSBoYW5kbGVyIGluc3RhbmNlLgorKi8KK2NsYXNzIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBDYWxjdWxhdG9ySWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhbGN1bGF0b3JDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIENhbGN1bGF0b3JJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2sgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTb2NrZXQ+KGNvbm5JbmZvLnRyYW5zcG9ydCk7CisgICAgY291dCA8PCAiSW5jb21pbmcgY29ubmVjdGlvblxuIjsKKyAgICBjb3V0IDw8ICJcdFNvY2tldEluZm86ICIgIDw8IHNvY2stPmdldFNvY2tldEluZm8oKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckhvc3Q6ICIgICAgPDwgc29jay0+Z2V0UGVlckhvc3QoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckFkZHJlc3M6ICIgPDwgc29jay0+Z2V0UGVlckFkZHJlc3MoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlclBvcnQ6ICIgICAgPDwgc29jay0+Z2V0UGVlclBvcnQoKSA8PCAiXG4iOworICAgIHJldHVybiBuZXcgQ2FsY3VsYXRvckhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCA6OnNoYXJlZDo6U2hhcmVkU2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CiAKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0gIHNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+IGhhbmRsZXIobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpOwotICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKSk7Ci0gIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKK2ludCBtYWluKCkgeworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAKLSAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLQotICAvKioKLSAgICogT3IgeW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZQotCi0gIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLSAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLSAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCisgIC8qCisgIC8vIGlmIHlvdSBkb24ndCBuZWVkIHBlci1jb25uZWN0aW9uIHN0YXRlLCBkbyB0aGUgZm9sbG93aW5nIGluc3RlYWQKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogICAqLwogCi0gIHByaW50ZigiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIik7CisgIC8qKgorICAgKiBIZXJlIGFyZSBzb21lIGFsdGVybmF0ZSBzZXJ2ZXIgdHlwZXMuLi4KKworICAvLyBUaGlzIHNlcnZlciBvbmx5IGFsbG93cyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGJ1dCBzcGF3bnMgbm8gdGhyZWFkcworICBUU2ltcGxlU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CisKKyAgY29uc3QgaW50IHdvcmtlckNvdW50ID0gNDsKKworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CisgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkoCisgICAgc3RkOjptYWtlX3NoYXJlZDxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KCkpOworICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgIC8vIFRoaXMgc2VydmVyIGFsbG93cyAid29ya2VyQ291bnQiIGNvbm5lY3Rpb24gYXQgYSB0aW1lLCBhbmQgcmV1c2VzIHRocmVhZHMKKyAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpLAorICAgIHRocmVhZE1hbmFnZXIpOworICAqLworCisgIGNvdXQgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iIDw8IGVuZGw7CiAgIHNlcnZlci5zZXJ2ZSgpOwotICBwcmludGYoImRvbmUuXG4iKTsKKyAgY291dCA8PCAiRG9uZS4iIDw8IGVuZGw7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM0ZGVlLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2NwcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1CT09TVF9ESVIgPSAvdXNyL2xvY2FsL2Jvb3N0L2luY2x1ZGUvYm9vc3QtMV8zM18xLwotVEhSSUZUX0RJUiA9IC91c3IvbG9jYWwvaW5jbHVkZS90aHJpZnQKLUxJQl9ESVIgPSAvdXNyL2xvY2FsL2xpYgotCi1HRU5fU1JDID0gLi4vZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCAuLi9nZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgLi4vZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAgLi4vZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAotCi1kZWZhdWx0OiBzZXJ2ZXIgY2xpZW50Ci0KLXNlcnZlcjogQ3BwU2VydmVyLmNwcAotCWcrKyAtbyBDcHBTZXJ2ZXIgLUkke1RIUklGVF9ESVJ9IC1JJHtCT09TVF9ESVJ9ICAtSS4uL2dlbi1jcHAgLUwke0xJQl9ESVJ9IC1sdGhyaWZ0IENwcFNlcnZlci5jcHAgJHtHRU5fU1JDfQotCi1jbGllbnQ6IENwcENsaWVudC5jcHAKLQlnKysgLW8gQ3BwQ2xpZW50IC1JJHtUSFJJRlRfRElSfSAtSSR7Qk9PU1RfRElSfSAgLUkuLi9nZW4tY3BwIC1MJHtMSUJfRElSfSAtbHRocmlmdCBDcHBDbGllbnQuY3BwICR7R0VOX1NSQ30KLQotY2xlYW46Ci0JJChSTSkgLXIgQ3BwQ2xpZW50IENwcFNlcnZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5Y2YzYmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnR1dG9yaWFsZ2VuY3BwLmxhCitub2Rpc3RfbGlidHV0b3JpYWxnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIFwKKwlnZW4tY3BwL0NhbGN1bGF0b3IuaCBcCisJZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmggXAorCWdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgXAorCWdlbi1jcHAvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAgXAorCWdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuaAorCisKKworbGlidHV0b3JpYWxnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlUdXRvcmlhbFNlcnZlciBcCisJVHV0b3JpYWxDbGllbnQKKworVHV0b3JpYWxTZXJ2ZXJfU09VUkNFUyA9IFwKKwlDcHBTZXJ2ZXIuY3BwCisKK1R1dG9yaWFsU2VydmVyX0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworVHV0b3JpYWxDbGllbnRfU09VUkNFUyA9IFwKKwlDcHBDbGllbnQuY3BwCisKK1R1dG9yaWFsQ2xpZW50X0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwIC1yICQ8CisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY3BwLyoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vVHV0b3JpYWxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vVHV0b3JpYWxDbGllbnQKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCisKK0VYVFJBX0RJU1QgPSBcCisJQ01ha2VMaXN0cy50eHQgXAorCUNwcENsaWVudC5jcHAgXAorCUNwcFNlcnZlci5jcHAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzYTQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCisKK25hbWVzcGFjZSBDU2hhcnBUdXRvcmlhbAoreworICAgIHB1YmxpYyBjbGFzcyBDU2hhcnBDbGllbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuQ2xpZW50IGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInBpbmcoKSIpOworCisgICAgICAgICAgICAgICAgICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsIDEpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiMSsxPXswfSIsIHN1bSk7CisKKyAgICAgICAgICAgICAgICAgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKworICAgICAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMSA9IDE1OworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxNS0xMD17MH0iLCBkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2hlY2sgbG9nOiB7MH0iLCBsb2cuVmFsdWUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhN2ZmNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDExMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkNzaGFycENsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkNzaGFycENsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIj4KKyAgICAgIDxMaW5rPkNhbGN1bGF0b3IuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5JbnZhbGlkT3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5PcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTZXJ2aWNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTdHJ1Y3QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcdHV0b3JpYWwuQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxMaW5rPnR1dG9yaWFsLkNvbnN0YW50cy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxXb3JrLmNzIj4KKyAgICAgIDxMaW5rPldvcmsuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5ZWI2M2MtZDc0Yy00N2U4LWFlNDgtYTJmYzk0NTM4ZTlkfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5wdXNoZCAiJChTb2x1dGlvbkRpcikiCit0aHJpZnQgIC1nZW4gY3NoYXJwICAgLXIgIC4uL3R1dG9yaWFsLnRocmlmdAorcG9wZAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY2NThjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwQ2xpZW50IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMWE0NjEyMTQtZmEyOC00NTJhLWJkMWQtZDIzY2E4ZTk0N2UzIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5NzkwYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCkBAIC0wLDAgKzEsMTI5IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgQ1NoYXJwVHV0b3JpYWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgOiBDYWxjdWxhdG9yLklmYWNlCisgICAgeworICAgICAgICBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PiBsb2c7CisKKyAgICAgICAgcHVibGljIENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nID0gbmV3IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInBpbmcoKSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGQoaW50IG4xLCBpbnQgbjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGQoezB9LHsxfSkiLCBuMSwgbjIpOworICAgICAgICAgICAgcmV0dXJuIG4xICsgbjI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNhbGN1bGF0ZShpbnQgbG9naWQsIFdvcmsgd29yaykKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImNhbGN1bGF0ZSh7MH0sIFt7MX0sezJ9LHszfV0pIiwgbG9naWQsIHdvcmsuT3AsIHdvcmsuTnVtMSwgd29yay5OdW0yKTsKKyAgICAgICAgICAgIGludCB2YWwgPSAwOworICAgICAgICAgICAgc3dpdGNoICh3b3JrLk9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLSB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAqIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrLk51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0T3AgPSAoaW50KXdvcmsuT3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAvIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXRPcCA9IChpbnQpd29yay5PcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaGFyZWRTdHJ1Y3QgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgICAgICAgICBlbnRyeS5LZXkgPSBsb2dpZDsKKyAgICAgICAgICAgIGVudHJ5LlZhbHVlID0gdmFsLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBsb2dbbG9naWRdID0gZW50cnk7CisKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2hhcmVkU3RydWN0IGdldFN0cnVjdChpbnQga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZ2V0U3RydWN0KHswfSkiLCBrZXkpOworICAgICAgICAgICAgcmV0dXJuIGxvZ1trZXldOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgemlwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInppcCgpIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ1NoYXJwU2VydmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENhbGN1bGF0b3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgICAgICAgICAgICAgLy8gc2VydmVyID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoeC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDgxODAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwxMTEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5Dc2hhcnBTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5Dc2hhcnBTZXJ2ZXI8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQ2FsY3VsYXRvci5jcyI+CisgICAgICA8TGluaz5DYWxjdWxhdG9yLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEludmFsaWRPcGVyYXRpb24uY3MiPgorICAgICAgPExpbms+SW52YWxpZE9wZXJhdGlvbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxPcGVyYXRpb24uY3MiPgorICAgICAgPExpbms+T3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFNlcnZpY2UuY3MiPgorICAgICAgPExpbms+U2hhcmVkU2VydmljZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTaGFyZWRTdHJ1Y3QuY3MiPgorICAgICAgPExpbms+U2hhcmVkU3RydWN0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXHR1dG9yaWFsLkNvbnN0YW50cy5jcyI+CisgICAgICA8TGluaz50dXRvcmlhbC5Db25zdGFudHMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcV29yay5jcyI+CisgICAgICA8TGluaz5Xb3JrLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDc2hhcnBTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cHVzaGQgIiQoU29sdXRpb25EaXIpIgordGhyaWZ0ICAtZ2VuIGNzaGFycCAgIC1yICAuLi90dXRvcmlhbC50aHJpZnQKK3BvcGQKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZhNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwU2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZTNiNDI4ZjQtYjJlOS00ZmMxLThhMzQtODRhYmM0MzM5ODYwIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4gYi90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTdhMTgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuCkBAIC0wLDAgKzEsMzkgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBDbGllbnQiLCAiQ3NoYXJwQ2xpZW50XENzaGFycENsaWVudC5jc3Byb2oiLCAiezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0iCisgICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9CisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9ID0gezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0KKyAgICBFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBTZXJ2ZXIiLCAiQ3NoYXJwU2VydmVyXENzaGFycFNlcnZlci5jc3Byb2oiLCAiezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0iCisgICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9CisgICAgRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK0dsb2JhbAorICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisgICAgICAgIERlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIFJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorICAgIEVuZEdsb2JhbFNlY3Rpb24KKyAgICBHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorICAgIEVuZEdsb2JhbFNlY3Rpb24KKyAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorICAgICAgICBIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKyAgICBFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzhiMjkKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMSUJfRF9ESVIgPSAkKHRvcF9zcmNkaXIpL2xpYi9kCisKK0dFTl9TUkMgPSBnZW4tZC9zaGFyZS9TaGFyZWRTZXJ2aWNlLmQgZ2VuLWQvc2hhcmUvc2hhcmVkX3R5cGVzLmQgXAorCWdlbi1kL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLmQgZ2VuLWQvdHV0b3JpYWwvQ2FsY3VsYXRvci5kCisKKyQoR0VOX1NSQyk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gZCAtciAkPAorCitzZXJ2ZXI6IHNlcnZlci5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgc2VydmVyLmQgJHtHRU5fU1JDfQorCitjbGllbnQ6IGNsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQorCitQUk9HUyA9IHNlcnZlciBjbGllbnQKKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCithc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQtZXZlbnQgLUwtbHRocmlmdGQgLUwtbGV2ZW50IGFzeW5jX2NsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgKz0gYXN5bmNfY2xpZW50CitlbmRpZgorCithbGwtbG9jYWw6ICQoUFJPR1MpCisKK2NsZWFuOgorCSQoUk0pIC1mICQoUFJPR1MpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL2FzeW5jX2NsaWVudC5kIGIvdHV0b3JpYWwvZC9hc3luY19jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGVmY2UwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9hc3luY19jbGllbnQuZApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgYXN5bmNfY2xpZW50OworCitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKKworaW1wb3J0IHR1dG9yaWFsLkNhbGN1bGF0b3I7CitpbXBvcnQgdHV0b3JpYWwudHV0b3JpYWxfdHlwZXM7CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBhc3luY01hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworCisgIC8vIElmIHdlIGFyZSBkb25lLCBncmFjZWZ1bGx5IHN0b3AgdGhlIGFzeW5jIG1hbmFnZXIgdG8gYXZvaWQgaGFuZ2luZyBvbgorICAvLyBhcHBwbGljYXRpb24gc2h1dGRvd24uCisgIHNjb3BlIChleGl0KSBhc3luY01hbmFnZXIuc3RvcCgpOworCisgIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChhc3luY01hbmFnZXIsICJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IUNhbGN1bGF0b3IoCisgICAgc29ja2V0LAorICAgIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IVRCdWZmZXJlZFRyYW5zcG9ydAorICApOworCisgIHNvY2tldC5vcGVuKCk7CisKKyAgLy8gSW52b2tlIGFsbCB0aGUgbWV0aG9kcy4KKyAgYXV0byBwaW5nUmVzdWx0ID0gY2xpZW50LnBpbmcoKTsKKworICBhdXRvIGFkZFJlc3VsdCA9IGNsaWVudC5hZGQoMSwgMSk7CisKKyAgYXV0byB3b3JrID0gV29yaygpOworICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgd29yay5udW0xID0gMTsKKyAgd29yay5udW0yID0gMDsKKyAgYXV0byBxdW90aWVudFJlc3VsdCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgd29yay5udW0xID0gMTU7CisgIHdvcmsubnVtMiA9IDEwOworICBhdXRvIGRpZmZSZXN1bHQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworCisgIGF1dG8gbG9nUmVzdWx0ID0gY2xpZW50LmdldFN0cnVjdCgxKTsKKworICAvLyBBd2FpdCB0aGUgcmVzcG9uc2VzLgorICBwaW5nUmVzdWx0LndhaXRHZXQoKTsKKyAgd3JpdGVsbigicGluZygpIik7CisKKyAgaW50IHN1bSA9IGFkZFJlc3VsdC53YWl0R2V0KCk7CisgIHdyaXRlZmxuKCIxICsgMSA9ICVzIiwgc3VtKTsKKworICB0cnkgeworICAgIHF1b3RpZW50UmVzdWx0LndhaXRHZXQoKTsKKyAgICB3cml0ZWxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgd3JpdGVsbigiSW52YWxpZCBvcGVyYXRpb246ICIgfiBpby53aHkpOworICB9CisKKyAgd3JpdGVmbG4oIjE1IC0gMTAgPSAlcyIsIGRpZmZSZXN1bHQud2FpdEdldCgpKTsKKworICAvLyBURnV0dXJlIGlzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gdGhlIHJlc3VsdCB0eXBlIHZpYSDCu2FsaWFzIHRoaXPCqywKKyAgLy8gZm9yIHdoaWNoIGl0IChlYWdlcmx5LCBvZiBjb3Vyc2UpIGF3YWl0cyBjb21wbGV0aW9uLgorICB3cml0ZWZsbigiQ2hlY2sgbG9nOiAlcyIsIGxvZ1Jlc3VsdC52YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL2NsaWVudC5kIGIvdHV0b3JpYWwvZC9jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9jbGllbnQuZApAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgY2xpZW50OworCitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCB0dXRvcmlhbC5DYWxjdWxhdG9yOworaW1wb3J0IHR1dG9yaWFsLnR1dG9yaWFsX3R5cGVzOworCit2b2lkIG1haW4oKSB7CisgIGF1dG8gc29ja2V0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICBhdXRvIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KTsKKyAgYXV0byBwcm90b2NvbCA9IHRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBhdXRvIGNsaWVudCA9IHRDbGllbnQhQ2FsY3VsYXRvcihwcm90b2NvbCk7CisKKyAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICBjbGllbnQucGluZygpOworICB3cml0ZWxuKCJwaW5nKCkiKTsKKworICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLCAxKTsKKyAgd3JpdGVmbG4oIjEgKyAxID0gJXMiLCBzdW0pOworCisgIGF1dG8gd29yayA9IFdvcmsoKTsKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREU7CisgIHdvcmsubnVtMSA9IDE7CisgIHdvcmsubnVtMiA9IDA7CisgIHRyeSB7CisgICAgaW50IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICB3cml0ZWxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgd3JpdGVsbigiSW52YWxpZCBvcGVyYXRpb246ICIgfiBpby53aHkpOworICB9CisKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgd29yay5udW0xID0gMTU7CisgIHdvcmsubnVtMiA9IDEwOworICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgIHdyaXRlZmxuKCIxNSAtIDEwID0gJXMiLCBkaWZmKTsKKworICBhdXRvIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgIHdyaXRlZmxuKCJDaGVjayBsb2c6ICVzIiwgbG9nLnZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2Qvc2VydmVyLmQgYi90dXRvcmlhbC9kL3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2VkY2MKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL3NlcnZlci5kCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgc2VydmVyOworCitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CisKK2ltcG9ydCBzaGFyZS5TaGFyZWRTZXJ2aWNlOworaW1wb3J0IHNoYXJlLnNoYXJlZF90eXBlczsKK2ltcG9ydCB0dXRvcmlhbC5DYWxjdWxhdG9yOworaW1wb3J0IHR1dG9yaWFsLnR1dG9yaWFsX3R5cGVzOworCisvKioKKyAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIENhbGN1bGF0b3IgaW50ZXJmYWNlIHRoYXQgaXMgY2FsbGVkIGJ5CisgKiB0aGUgc2VydmVyIHRvIGFuc3dlciB0aGUgcmVxdWVzdHMuCisgKi8KK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogQ2FsY3VsYXRvciB7CisgIHZvaWQgcGluZygpIHsKKyAgICB3cml0ZWxuKCJwaW5nKCkiKTsKKyAgfQorCisgIGludCBhZGQoaW50IG4xLCBpbnQgbjIpIHsKKyAgICB3cml0ZWZsbigiYWRkKCVzLCVzKSIsIG4xLCBuMik7CisgICAgcmV0dXJuIG4xICsgbjI7CisgIH0KKworICBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgcmVmIGNvbnN0KFdvcmspIHdvcmspIHsKKyAgICB3cml0ZWZsbigiY2FsY3VsYXRlKCVzLCB7JXMsICVzLCAlc30pIiwgbG9naWQsIHdvcmsub3AsIHdvcmsubnVtMSwgd29yay5udW0yKTsKKyAgICBpbnQgdmFsOworCisgICAgc3dpdGNoICh3b3JrLm9wKSB7CisgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgeworICAgICAgICBhdXRvIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgIHRocm93IGlvOworICAgICAgfQorICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGF1dG8gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CisgICAgICB0aHJvdyBpbzsKKyAgICB9CisKKyAgICBhdXRvIHNzID0gU2hhcmVkU3RydWN0KCk7CisgICAgc3Mua2V5ID0gbG9naWQ7CisgICAgc3MudmFsdWUgPSB0byFzdHJpbmcodmFsKTsKKyAgICBsb2dbbG9naWRdID0gc3M7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgU2hhcmVkU3RydWN0IGdldFN0cnVjdChpbnQgbG9naWQpIHsKKyAgICB3cml0ZWZsbigiZ2V0U3RydWN0KCVzKSIsIGxvZ2lkKTsKKyAgICByZXR1cm4gbG9nW2xvZ2lkXTsKKyAgfQorCisgIHZvaWQgemlwKCkgeworICAgIHdyaXRlbG4oInppcCgpIik7CisgIH0KKworcHJvdGVjdGVkOgorICBTaGFyZWRTdHJ1Y3RbaW50XSBsb2c7Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsKKyAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhQ2FsY3VsYXRvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIpOworICBhdXRvIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKworICBhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKAorICAgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworCisgIHdyaXRlbG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCA5MDkwLi4uIik7CisgIHNlcnZlci5zZXJ2ZSgpOworICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NWFjYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0CisKK2dlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQ6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBwdWItZ2V0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworcHViLWdldDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQgcHViLWdldC1jb25zb2xlLWNsaWVudCBwdWItZ2V0LXNlcnZlcgorCitwdWItZ2V0LWdlbjogcHViLWdldC10dXRvcmlhbCBwdWItZ2V0LXNoYXJlZAorCitwdWItZ2V0LXR1dG9yaWFsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydAorCWNkIGdlbi1kYXJ0L3R1dG9yaWFsOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNoYXJlZDogZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCWNkIGdlbi1kYXJ0L3NoYXJlZDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jbGllbnQ6CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNvbnNvbGUtY2xpZW50OgorCWNkIGNvbnNvbGVfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNlcnZlcjoKKwljZCBzZXJ2ZXI7ICR7REFSVFBVQn0gZ2V0CisKK3R1dG9yaWFsc2VydmVyOiBwdWItZ2V0LWdlbiBwdWItZ2V0LXNlcnZlcgorCSR7REFSVH0gc2VydmVyL2Jpbi9tYWluLmRhcnQKKwordHV0b3JpYWxjbGllbnQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IHNlcnZlCisKK3R1dG9yaWFsY29uc29sZWNsaWVudDogcHViLWdldC1jb25zb2xlLWNsaWVudAorCSR7REFSVH0gY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCWNsaWVudC93ZWIvY2xpZW50LmRhcnQgXAorCWNsaWVudC93ZWIvaW5kZXguaHRtbCBcCisJY2xpZW50L3dlYi9zdHlsZXMuY3NzIFwKKwljbGllbnQvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IFwKKwljb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgXAorCXNlcnZlci9iaW4vbWFpbi5kYXJ0IFwKKwlzZXJ2ZXIvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwlzZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWU7CitybSAtciBnZW4tZGFydCB8fCB0cnVlOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi9zaGFyZWQudGhyaWZ0OworY2QgZ2VuLWRhcnQvc2hhcmVkOworcHViIGdldDsKK2NkIC4uLy4uOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi90dXRvcmlhbC50aHJpZnQ7CitjZCBnZW4tZGFydC90dXRvcmlhbDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKworY2QgY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBjb25zb2xlX2NsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2Qgc2VydmVyOworcHViIGdldDsKK2NkIC4uOworCitkYXJ0Zm10IC13IGdlbi1kYXJ0OworCitlY2hvICJcbkVuam95IHRoZSBEYXJ0IHR1dG9yaWFsISI7CitlY2hvICJcblRvIHJ1biB0aGUgc2VydmVyOiI7CitlY2hvICI+IGRhcnQgc2VydmVyL2Jpbi9tYWluLmRhcnQiOworZWNobyAiXG5UbyBydW4gdGhlIGNsaWVudDoiOworZWNobyAiIyBTZXJ2ZSB0aGUgYXBwIGZyb20gdGhlIGNsaWVudCBkaXJlY3RvcnkgYW5kIHZpZXcgaW4gYSBicm93c2VyIjsKK2VjaG8gIj4gY2QgY2xpZW50OyI7CitlY2hvICI+IHB1YiBzZXJ2ZTsiOworZWNobyAiXG5UbyBydW4gdGhlIGNvbnNvbGUgY2xpZW50OiI7CitlY2hvICI+IGRhcnQgY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCI7CitlY2hvICIiOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBjbGllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYnJvd3NlcjogXjAuMTAuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDJkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKQEAgLTAsMCArMSwyNzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6aHRtbCc7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfYnJvd3Nlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBBUzMgdHV0b3JpYWwKK3ZvaWQgbWFpbigpIHsKKyAgbmV3IENhbGN1bGF0b3JVSShxdWVyeVNlbGVjdG9yKCcjb3V0cHV0JykpLnN0YXJ0KCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JVSSB7CisgIGZpbmFsIERpdkVsZW1lbnQgb3V0cHV0OworCisgIENhbGN1bGF0b3JVSSh0aGlzLm91dHB1dCk7CisKKyAgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworICBDYWxjdWxhdG9yIF9jYWxjdWxhdG9yQ2xpZW50OworCisgIHZvaWQgc3RhcnQoKSB7CisgICAgX2J1aWxkSW50ZXJmYWNlKCk7CisgICAgX2luaXRDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIF92YWxpZGF0ZSgpIHsKKyAgICBpZiAoIV90cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICB3aW5kb3cuYWxlcnQoIlRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4hIik7CisgICAgfQorICB9CisKKyAgdm9pZCBfaW5pdENvbm5lY3Rpb24oKSB7CisgICAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgIG5ldyBUV2ViU29ja2V0KFVyaS5wYXJzZSgnd3M6Ly8xMjcuMC4wLjE6OTA5MC93cycpKSwKKyAgICAgICAgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICAgIF90cmFuc3BvcnQub3BlbigpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIF9idWlsZEludGVyZmFjZSgpIHsKKyAgICBvdXRwdXQuY2hpbGRyZW4uZm9yRWFjaCgoZSkgeworICAgICAgZS5yZW1vdmUoKTsKKyAgICB9KTsKKworICAgIF9idWlsZFBpbmdDb21wb25lbnQoKTsKKworICAgIF9idWlsZEFkZENvbXBvbmVudCgpOworCisgICAgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpOworCisgICAgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCk7CisgIH0KKworICB2b2lkIF9idWlsZFBpbmdDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJQaW5nIik7CisgICAgQnV0dG9uRWxlbWVudCBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlBJTkciCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vblBpbmdDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChwaW5nQnV0dG9uKTsKKyAgfQorCisgIHZvaWQgX29uUGluZ0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQucGluZygpOworICB9CisKKyAgdm9pZCBfYnVpbGRBZGRDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJBZGQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTcGFuRWxlbWVudCBvcCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQWRkQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoYWRkQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGRSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25BZGRDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2FkZDEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQyIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2FkZFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmFkZChpbnQucGFyc2UobnVtMS52YWx1ZSksIGludC5wYXJzZShudW0yLnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJDYWxjdWxhdG9yIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBuZXcgU2VsZWN0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNPcCIKKyAgICAgIC4ubXVsdGlwbGUgPSBmYWxzZQorICAgICAgLi5zZWxlY3RlZEluZGV4ID0gMAorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNnB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIE9wdGlvbkVsZW1lbnQgYWRkT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uQURELnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGFkZE9wLCAwKTsKKyAgICBPcHRpb25FbGVtZW50IHN1YnRyYWN0T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLSIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uU1VCVFJBQ1QudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoc3VidHJhY3RPcCwgMSk7CisgICAgT3B0aW9uRWxlbWVudCBtdWx0aXBseU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIioiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLk1VTFRJUExZLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKG11bHRpcGx5T3AsIDIpOworICAgIE9wdGlvbkVsZW1lbnQgZGl2aWRlT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uRElWSURFLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGRpdmlkZU9wLCAzKTsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGNhbGNCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25DYWxjQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoY2FsY0J1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY1Jlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkxvZyBJRDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImxvZ0lkIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBMYWJlbEVsZW1lbnQgY29tbWVudExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiQ29tbWVudDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50TGFiZWwpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNvbW1lbnQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjEwMHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudCk7CisgIH0KKworICB2b2lkIF9vbkNhbGNDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2NhbGMxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzIiKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gcXVlcnlTZWxlY3RvcigiI2NhbGNPcCIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjUmVzdWx0Iik7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gcXVlcnlTZWxlY3RvcigiI2xvZ0lkIik7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBxdWVyeVNlbGVjdG9yKCIjY29tbWVudCIpOworCisgICAgaW50IGxvZ0lkVmFsdWUgPSBpbnQucGFyc2UobG9nSWQudmFsdWUpOworICAgIGxvZ0lkLnZhbHVlID0gKGxvZ0lkVmFsdWUgKyAxKS50b1N0cmluZygpOworCisgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKyAgICB3b3JrLm51bTEgPSBpbnQucGFyc2UobnVtMS52YWx1ZSk7CisgICAgd29yay5udW0yID0gaW50LnBhcnNlKG51bTIudmFsdWUpOworICAgIHdvcmsub3AgPSBpbnQucGFyc2Uob3Aub3B0aW9uc1tvcC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7CisgICAgd29yay5jb21tZW50ID0gY29tbWVudC52YWx1ZTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LmNhbGN1bGF0ZShsb2dJZFZhbHVlLCB3b3JrKS50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJHZXQgU3RydWN0Iik7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJTdHJ1Y3QgS2V5OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAic3RydWN0S2V5IgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBCdXR0b25FbGVtZW50IGdldFN0cnVjdEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJHRVQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uR2V0U3RydWN0Q2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoZ2V0U3RydWN0QnV0dG9uKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBuZXcgVGV4dEFyZWFFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiZ2V0U3RydWN0UmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIzMDBweCIKKyAgICAgIC4uc3R5bGUuaGVpZ2h0ID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25HZXRTdHJ1Y3RDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBzdHJ1Y3RLZXkgPSBxdWVyeVNlbGVjdG9yKCIjc3RydWN0S2V5Iik7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNnZXRTdHJ1Y3RSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5nZXRTdHJ1Y3QoaW50LnBhcnNlKHN0cnVjdEtleS52YWx1ZSkpCisgICAgICAgIC50aGVuKChTaGFyZWRTdHJ1Y3QgcykgeworICAgICAgcmVzdWx0LnRleHQgPSAiJHtzLnRvU3RyaW5nKCl9IjsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxODRlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgVHV0b3JpYWw8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzLmNzcyI+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9ImNsaWVudC5kYXJ0IiB0eXBlPSJhcHBsaWNhdGlvbi9kYXJ0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IGFzeW5jIHNyYz0icGFja2FnZXMvYnJvd3Nlci9kYXJ0LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisKKyAgPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90byk7CisKK2h0bWwsIGJvZHkgeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7Cit9CisKK2gzIHsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47CisgICAgcGFkZGluZy10b3A6IDIwcHg7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNDkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKK1RUcmFuc3BvcnQgX3RyYW5zcG9ydDsKK0NhbGN1bGF0b3IgX2NhbGN1bGF0b3I7CitpbnQgbG9naWQgPSAwOworCitjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG9wZXJhdGlvbkxvb2t1cCA9IGNvbnN0IHsKKyAgJysnOiBPcGVyYXRpb24uQURELAorICAnLSc6IE9wZXJhdGlvbi5TVUJUUkFDVCwKKyAgJyonOiBPcGVyYXRpb24uTVVMVElQTFksCisgICcvJzogT3BlcmF0aW9uLkRJVklERQorfTsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisKKyAgX2luaXRDb25uZWN0aW9uKHBvcnQpLnRoZW4oKF8pID0+IF9ydW4oKSk7Cit9CisKK0Z1dHVyZSBfaW5pdENvbm5lY3Rpb24oaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICBuZXcgVFRjcFNvY2tldChzb2NrZXQpLCBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICBhd2FpdCBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICBfY2FsY3VsYXRvciA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKK30KKworRnV0dXJlIF9ydW4oKSBhc3luYyB7CisgIF9oZWxwKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGRvdXQud3JpdGUoIj4gIik7CisgICAgdmFyIGlucHV0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CisgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJyAnKTsKKyAgICB2YXIgY29tbWFuZCA9IHBhcnRzWzBdOworICAgIHZhciBhcmdzID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnN1Ymxpc3QoMSkgOiBbXTsKKworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgY2FzZSAncGluZyc6CisgICAgICAgIGF3YWl0IF9waW5nKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdhZGQnOgorICAgICAgICBhd2FpdCBfYWRkKGludC5wYXJzZShhcmdzWzBdKSwgaW50LnBhcnNlKGFyZ3NbMV0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2NhbGMnOgorICAgICAgICBpbnQgb3AgPSBvcGVyYXRpb25Mb29rdXBbYXJnc1sxXV07CisgICAgICAgIGlmICghT3BlcmF0aW9uLlZBTElEX1ZBTFVFUy5jb250YWlucyhvcCkpIHsKKyAgICAgICAgICBzdGRvdXQud3JpdGVsbignVW5rbm93biBvcGVyYXRvciAke2FyZ3NbMV19Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICAgICAgICAuLm51bTEgPSBpbnQucGFyc2UoYXJnc1swXSkKKyAgICAgICAgICAuLm9wID0gb3AKKyAgICAgICAgICAuLm51bTIgPSBpbnQucGFyc2UoYXJnc1syXSkKKyAgICAgICAgICAuLmNvbW1lbnQgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogJyc7CisKKyAgICAgICAgYXdhaXQgX2NhbGMod29yayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdzdHJ1Y3QnOgorICAgICAgICBhd2FpdCBfc3RydWN0KGludC5wYXJzZShhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoZWxwJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9oZWxwKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIF9oZWxwKCkgeworICBzdGRvdXQud3JpdGVsbignQ29tbWFuZHM6Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGhlbHAnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgcGluZycpOworICBzdGRvdXQud3JpdGVsbignICBhZGQgeCB5Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGNhbGMgeCBvcCB5IFtjb21tZW50XScpOworICBzdGRvdXQud3JpdGVsbignICBzdHJ1Y3QgaWQnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJycpOworfQorCitGdXR1cmUgX3BpbmcoKSBhc3luYyB7CisgIGF3YWl0IF9jYWxjdWxhdG9yLnBpbmcoKTsKKyAgc3Rkb3V0LndyaXRlbG4oJ3Bpbmcgc3VjY2VlZGVkJyk7Cit9CisKK0Z1dHVyZSBfYWRkKGludCB4LCBpbnQgeSkgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuYWRkKHgsIHkpOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfY2FsYyhXb3JrIHdvcmspIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmNhbGN1bGF0ZShsb2dpZCsrLCB3b3JrKTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX3N0cnVjdChpbnQga2V5KSBhc3luYyB7CisgIHZhciBzdHJ1Y3QgPSBhd2FpdCBfY2FsY3VsYXRvci5nZXRTdHJ1Y3Qoa2V5KTsKKyAgc3Rkb3V0LndyaXRlbG4oc3RydWN0LnRvU3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRlMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jb25zb2xlX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBjb25zb2xlIGNsaWVudCB0byBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGNvbGxlY3Rpb246IF4xLjEuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTYzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CisKK1RQcm90b2NvbCBfcHJvdG9jb2w7CitUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CitXZWJTb2NrZXQgX3dlYlNvY2tldDsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGxpc3RlbiBvbicpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0eXBlJywKKyAgICAgIGRlZmF1bHRzVG86ICd3cycsCisgICAgICBhbGxvd2VkOiBbJ3dzJywgJ3RjcCddLAorICAgICAgaGVscDogJ1RoZSB0eXBlIG9mIHNvY2tldCcsCisgICAgICBhbGxvd2VkSGVscDogeyd3cyc6ICdXZWJTb2NrZXQnLCAndGNwJzogJ1RDUCBTb2NrZXQnfSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworICBTdHJpbmcgc29ja2V0VHlwZSA9IHJlc3VsdHNbJ3R5cGUnXTsKKworICBpZiAoc29ja2V0VHlwZSA9PSAndGNwJykgeworICAgIF9ydW5UY3BTZXJ2ZXIocG9ydCk7CisgIH0gZWxzZSBpZiAoc29ja2V0VHlwZSA9PSAnd3MnKSB7CisgICAgX3J1bldlYlNvY2tldFNlcnZlcihwb3J0KTsKKyAgfQorfQorCitGdXR1cmUgX3J1bldlYlNvY2tldFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgaHR0cFNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIGh0dHBTZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CisgICAgaWYgKHJlcXVlc3QudXJpLnBhdGggPT0gJy93cycpIHsKKyAgICAgIF93ZWJTb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlKHJlcXVlc3QpOworICAgICAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRXZWJTb2NrZXQoX3dlYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgnSW52YWxpZCBwYXRoOiAke3JlcXVlc3QudXJpLnBhdGh9Jyk7CisgICAgfQorICB9KTsKK30KKworRnV0dXJlIF9ydW5UY3BTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNlcnZlclNvY2tldCA9IGF3YWl0IFNlcnZlclNvY2tldC5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgVENQIGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgU29ja2V0IHNvY2tldCA9IGF3YWl0IHNlcnZlclNvY2tldC5maXJzdDsKKyAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7Cit9CisKK0Z1dHVyZSBfaW5pdFByb2Nlc3NvcihUU29ja2V0IHNvY2tldCkgYXN5bmMgeworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgIHRyYW5zcG9ydC5vbkluY29taW5nTWVzc2FnZS5saXN0ZW4oX3Byb2Nlc3NNZXNzYWdlKTsKKyAgX3Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yU2VydmVyKCkpOworICBfcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGF3YWl0IF9wcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworCisgIHByaW50KCdjb25uZWN0ZWQnKTsKK30KKworRnV0dXJlIF9wcm9jZXNzTWVzc2FnZShfKSBhc3luYyB7CisgIF9wcm9jZXNzb3IucHJvY2VzcyhfcHJvdG9jb2wsIF9wcm90b2NvbCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JTZXJ2ZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKyAgZmluYWwgTWFwPGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0ge307CisKKyAgRnV0dXJlIHBpbmcoKSBhc3luYyB7CisgICAgcHJpbnQoJ3BpbmcoKScpOworICB9CisKKyAgRnV0dXJlPGludD4gYWRkKGludCBudW0xLCBpbnQgbnVtMikgYXN5bmMgeworICAgIHByaW50KCdhZGQoJG51bTEsICRudW0yKScpOworCisgICAgcmV0dXJuIG51bTEgKyBudW0yOworICB9CisKKyAgRnV0dXJlPGludD4gY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSBhc3luYyB7CisgICAgcHJpbnQoJ2NhbHVsYXRlKCRsb2dpZCwgJHt3b3JrLnRvU3RyaW5nKCl9KScpOworCisgICAgaW50IHZhbDsKKworICAgIHN3aXRjaCAod29yay5vcCkgeworICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgICAgdmFyIHggPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gKHdvcmsubnVtMSAvIHdvcmsubnVtMikuZmxvb3IoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdmFyIGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBsb2cua2V5ID0gbG9naWQ7CisgICAgbG9nLnZhbHVlID0gJyR2YWwgIiR7d29yay5jb21tZW50fSInOworICAgIHRoaXMuX2xvZ1tsb2dpZF0gPSBsb2c7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgRnV0dXJlIHppcCgpIGFzeW5jIHsKKyAgICBwcmludCgnemlwKCknKTsKKyAgfQorCisgIEZ1dHVyZTxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdChpbnQga2V5KSBhc3luYyB7CisgICAgcHJpbnQoJ2dldFN0cnVjdCgka2V5KScpOworCisgICAgcmV0dXJuIF9sb2dba2V5XTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDA3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9zZXJ2ZXIKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IHNlcnZlciB0byBzdXBwb3J0IHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQwZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCkBAIC0wLDAgKzEsMTE0IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorcHJvZ3JhbSBEZWxwaGlDbGllbnQ7CisKK3skQVBQVFlQRSBDT05TT0xFfQoreyREICdDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ30KKwordXNlcworICBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgU2hhcmVkIGluICcuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMnLAorICBUdXRvcmlhbCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMnOworCisKK3R5cGUKKyAgRGVscGhpVHV0b3JpYWxDbGllbnQgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgTWFpbjsKKyAgZW5kOworCisKKy8vLS0tIERlbHBoaVR1dG9yaWFsQ2xpZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIHByb2NlZHVyZSBEZWxwaGlUdXRvcmlhbENsaWVudC5NYWluOwordmFyIHRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgcHJvdG9jb2wgIDogSVByb3RvY29sOworICAgIGNsaWVudCAgICA6IFRDYWxjdWxhdG9yLklmYWNlOworICAgIHdvcmsgICAgICA6IElXb3JrOworICAgIHN1bSwgcXVvdGllbnQsIGRpZmYgOiBJbnRlZ2VyOworICAgIGxvZyAgICAgICA6IElTaGFyZWRTdHJ1Y3Q7CitiZWdpbgorICB0cnkKKyAgICB0cmFuc3BvcnQgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCAnbG9jYWxob3N0JywgOTA5MCk7CisgICAgcHJvdG9jb2wgIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFuc3BvcnQpOworICAgIGNsaWVudCAgICA6PSBUQ2FsY3VsYXRvci5UQ2xpZW50LkNyZWF0ZSggcHJvdG9jb2wpOworCisgICAgdHJhbnNwb3J0Lk9wZW47CisKKyAgICBjbGllbnQucGluZzsKKyAgICBXcml0ZUxuKCdwaW5nKCknKTsKKworICAgIHN1bSA6PSBjbGllbnQuYWRkKCAxLCAxKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICcxKzE9JWQnLCBbc3VtXSkpOworCisgICAgd29yayA6PSBUV29ya0ltcGwuQ3JlYXRlOworCisgICAgd29yay5PcCAgIDo9IFRPcGVyYXRpb24uRElWSURFOworICAgIHdvcmsuTnVtMSA6PSAxOworICAgIHdvcmsuTnVtMiA6PSAwOworICAgIHRyeQorICAgICAgcXVvdGllbnQgOj0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIFdyaXRlTG4oICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgorICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICBlbmQ7CisKKyAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICB3b3JrLk51bTEgOj0gMTU7CisgICAgd29yay5OdW0yIDo9IDEwOworICAgIHRyeQorICAgICAgZGlmZiA6PSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMTUtMTA9JWQnLCBbZGlmZl0pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgorICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICBlbmQ7CisKKyAgICBsb2cgOj0gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICdDaGVjayBsb2c6ICVzJywgW2xvZy5WYWx1ZV0pKTsKKworICAgIHRyYW5zcG9ydC5DbG9zZSgpOworCisgIGV4Y2VwdAorICAgIG9uIGUgOiBFeGNlcHRpb24KKyAgICBkbyBXcml0ZUxuKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworCitiZWdpbgorICB0cnkKKyAgICBEZWxwaGlUdXRvcmlhbENsaWVudC5NYWluOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2Nzk5MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qCkBAIC0wLDAgKzEsMTE5IEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPkRlbHBoaUNsaWVudC5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Li5cLi5cLi5cbGliXGRlbHBoaVxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpQ2xpZW50LmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaUNsaWVudDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlDbGllbnQuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaUNsaWVudC5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCkBAIC0wLDAgKzEsMTczIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorcHJvZ3JhbSBEZWxwaGlTZXJ2ZXI7CisKK3skQVBQVFlQRSBDT05TT0xFfQoreyREICdDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ30KKworeyRRK30gICAgIC8vIHRocm93cyBleGNlcHRpb25zIG9uIG51bWVyaWMgb3ZlcmZsb3dzCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFNoYXJlZCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzJywKKyAgVHV0b3JpYWwgaW4gJy4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzJzsKKworCit0eXBlCisgIFRDYWxjdWxhdG9ySGFuZGxlciA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgVENhbGN1bGF0b3IuSWZhY2UpCisgIHByb3RlY3RlZAorICAgIEZMb2cgOiBURGljdGlvbmFyeTwgSW50ZWdlciwgSVNoYXJlZFN0cnVjdD47CisKKyAgICAvLyBUU2hhcmVkU2VydmljZS5JZmFjZQorICAgIGZ1bmN0aW9uICBnZXRTdHJ1Y3Qoa2V5OiBJbnRlZ2VyKTogSVNoYXJlZFN0cnVjdDsKKworICAgIC8vIFRDYWxjdWxhdG9yLklmYWNlCisgICAgcHJvY2VkdXJlIHBpbmcoKTsKKyAgICBmdW5jdGlvbiAgYWRkKG51bTE6IEludGVnZXI7IG51bTI6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uICBjYWxjdWxhdGUobG9naWQ6IEludGVnZXI7IGNvbnN0IHc6IElXb3JrKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgemlwKCk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgIGVuZDsKKworICBEZWxwaGlUdXRvcmlhbFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBNYWluOworICBlbmQ7CisKKworLy8tLS0gVENhbGN1bGF0b3JIYW5kbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRDYWxjdWxhdG9ySGFuZGxlci5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTG9nIDo9IFREaWN0aW9uYXJ5PCBJbnRlZ2VyLCBJU2hhcmVkU3RydWN0Pi5DcmVhdGUoKTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRDYWxjdWxhdG9ySGFuZGxlci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRkxvZyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2FsY3VsYXRvckhhbmRsZXIucGluZzsKK2JlZ2luCisgIFdyaXRlTG4oICdwaW5nKCknKTsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuYWRkKG51bTE6IEludGVnZXI7IG51bTI6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgV3JpdGVMbiggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CisgIHJlc3VsdCA6PSBudW0xICsgbnVtMjsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuY2FsY3VsYXRlKGxvZ2lkOiBJbnRlZ2VyOyBjb25zdCB3OiBJV29yayk6IEludGVnZXI7Cit2YXIgZW50cnkgOiBJU2hhcmVkU3RydWN0OworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVMbiggRm9ybWF0KCdjYWxjdWxhdGUoICVkLCBbJWQsJWQsJWRdKScsIFtsb2dpZCwgT3JkKHcuT3ApLCB3Lk51bTEsIHcuTnVtMl0pKTsKKworICAgIGNhc2Ugdy5PcCBvZgorICAgICAgVE9wZXJhdGlvbi5BREQgICAgICA6ICByZXN1bHQgOj0gdy5OdW0xICsgdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5TVUJUUkFDVCA6ICByZXN1bHQgOj0gdy5OdW0xIC0gdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5NVUxUSVBMWSA6ICByZXN1bHQgOj0gdy5OdW0xICogdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5ESVZJREUgICA6ICByZXN1bHQgOj0gUm91bmQoIHcuTnVtMSAvIHcuTnVtMik7CisgICAgZWxzZQorICAgICAgcmFpc2UgVEludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCBPcmQody5PcCksICdVbmtub3duIG9wZXJhdGlvbicpOworICAgIGVuZDsKKworICBleGNlcHQKKyAgICBvbiBlOlRocmlmdC5URXhjZXB0aW9uIGRvIHJhaXNlOyAgLy8gbGV0IFRocmlmdCBFeGNlcHRpb25zIHBhc3MgdGhyb3VnaAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIHJhaXNlIFRJbnZhbGlkT3BlcmF0aW9uLkNyZWF0ZSggT3JkKHcuT3ApLCBlLk1lc3NhZ2UpOyAgLy8gcmVwYWNrYWdlIGFsbCBvdGhlcgorICBlbmQ7CisKKyAgZW50cnkgOj0gVFNoYXJlZFN0cnVjdEltcGwuQ3JlYXRlOworICBlbnRyeS5LZXkgICA6PSBsb2dpZDsKKyAgZW50cnkuVmFsdWUgOj0gSW50VG9TdHIoIHJlc3VsdCk7CisgIEZMb2cuQWRkT3JTZXRWYWx1ZSggbG9naWQsIGVudHJ5KTsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuZ2V0U3RydWN0KGtleTogSW50ZWdlcik6IElTaGFyZWRTdHJ1Y3Q7CitiZWdpbgorICBXcml0ZUxuKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKKyAgcmVzdWx0IDo9IEZMb2dba2V5XTsKK2VuZDsKKworCitwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnppcDsKK2JlZ2luCisgIFdyaXRlTG4oICd6aXAoKScpOworZW5kOworCisKKy8vLS0tIERlbHBoaVR1dG9yaWFsU2VydmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBwcm9jZWR1cmUgRGVscGhpVHV0b3JpYWxTZXJ2ZXIuTWFpbjsKK3ZhciBoYW5kbGVyICAgOiBUQ2FsY3VsYXRvci5JZmFjZTsKKyAgICBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOworICAgIHRyYW5zcG9ydCA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgc2VydmVyICAgIDogSVNlcnZlcjsKK2JlZ2luCisgIHRyeQorICAgIGhhbmRsZXIgICA6PSBUQ2FsY3VsYXRvckhhbmRsZXIuQ3JlYXRlOworICAgIHByb2Nlc3NvciA6PSBUQ2FsY3VsYXRvci5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGhhbmRsZXIpOworICAgIHRyYW5zcG9ydCA6PSBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIDkwOTApOworICAgIHNlcnZlciAgICA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggcHJvY2Vzc29yLCB0cmFuc3BvcnQpOworCisgICAgV3JpdGVMbiggJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKTsKKyAgICBzZXJ2ZXIuU2VydmUoKTsKKworICBleGNlcHQKKyAgICBvbiBlOiBFeGNlcHRpb24gZG8gV3JpdGVMbiggZS5NZXNzYWdlKTsKKyAgZW5kOworCisgIFdyaXRlTG4oJ2RvbmUuJyk7CitlbmQ7CisKKworYmVnaW4KKyAgdHJ5CisgICAgRGVscGhpVHV0b3JpYWxTZXJ2ZXIuTWFpbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvaiBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNGE2YTEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagpAQCAtMCwwICsxLDExOCBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaVNlcnZlcjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlTZXJ2ZXIuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaVNlcnZlci5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2ogYi90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmEyMzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qCkBAIC0wLDAgKzEsNDggQEAKK++7vyAgICA8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgICAgICAgPFByb3BlcnR5R3JvdXA+CisgICAgICAgICAgICA8UHJvamVjdEd1aWQ+ezNEMDQyQzdGLTNFRjItNDU3NC04MzA0LUFCN0ZCNzlGODE0Q308L1Byb2plY3RHdWlkPgorICAgICAgICA8L1Byb3BlcnR5R3JvdXA+CisgICAgICAgIDxJdGVtR3JvdXA+CisgICAgICAgICAgICA8UHJvamVjdHMgSW5jbHVkZT0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiI+CisgICAgICAgICAgICAgICAgPERlcGVuZGVuY2llcy8+CisgICAgICAgICAgICA8L1Byb2plY3RzPgorICAgICAgICAgICAgPFByb2plY3RzIEluY2x1ZGU9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiPgorICAgICAgICAgICAgICAgIDxEZXBlbmRlbmNpZXMvPgorICAgICAgICAgICAgPC9Qcm9qZWN0cz4KKyAgICAgICAgPC9JdGVtR3JvdXA+CisgICAgICAgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICAgICAgICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlZmF1bHQuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisgICAgICAgICAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisgICAgICAgICAgICA8Qm9ybGFuZFByb2plY3Q+CisgICAgICAgICAgICAgICAgPERlZmF1bHQuUGVyc29uYWxpdHkvPgorICAgICAgICAgICAgPC9Cb3JsYW5kUHJvamVjdD4KKyAgICAgICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXIiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6TWFrZSI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6TWFrZSI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJCdWlsZCI+CisgICAgICAgICAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJEZWxwaGlTZXJ2ZXI7RGVscGhpQ2xpZW50Ii8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkNsZWFuIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjpDbGVhbjtEZWxwaGlDbGllbnQ6Q2xlYW4iLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iTWFrZSI+CisgICAgICAgICAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJEZWxwaGlTZXJ2ZXI6TWFrZTtEZWxwaGlDbGllbnQ6TWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cyIvPgorICAgIDwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9SRUFETUUubWQgYi90dXRvcmlhbC9lcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTdjZDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsOCBAQAorVG8gdHJ5IHRoaW5ncyBvdXQsIHJ1bgorCislIC4vc2VydmVyLnNoCitFcmxhbmcgUjE0QiAoZXJ0cy01LjguMSkgW3NvdXJjZV0gWzY0LWJpdF0gW3NtcDo0OjRdIFtycTo0XSBbYXN5bmMtdGhyZWFkczowXSBbaGlwZV0gW2tlcm5lbC1wb2xsOmZhbHNlXQorCitFc2hlbGwgVjUuOC4xICAoYWJvcnQgd2l0aCBeRykKKz4gc2VydmVyOnN0YXJ0KCkuCis+IGNsaWVudDp0KCkuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCmluZGV4IDk3ODAzMzQuLjAzNzQyMjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCkBAIC0yOCw0NyArMjgsNTEgQEAKICAgICBvay4KIAogdCgpIC0+Ci0gICAgUG9ydCA9IDk5OTksCi0gICAgCi0gICAge29rLCBDbGllbnR9ID0gdGhyaWZ0X2NsaWVudDpzdGFydF9saW5rKCIxMjcuMC4wLjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdG9yX3RocmlmdCksCisgICAgUG9ydCA9IDkwOTAsCiAKLSAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50LCBwaW5nLCBbXSksCisgICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoIjEyNy4wLjAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdG9yX3RocmlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSksCisKKyAgICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHBpbmcsIFtdKSwKICAgICBpbzpmb3JtYXQoInBpbmd+biIsIFtdKSwKIAotICAgIHtvaywgU3VtfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIGFkZCwgIFsxLCAxXSksCisgICAge0NsaWVudDIsIHtvaywgU3VtfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MSwgYWRkLCAgWzEsIDFdKSwKICAgICBpbzpmb3JtYXQoIjErMT1+cH5uIiwgW1N1bV0pLAogCi0gICAge29rLCBTdW0xfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIGFkZCwgWzEsIDRdKSwKKyAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9TVUJUUkFDVCwKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAogICAgICAgICAgICAgICAgICBudW0xPTE1LAogICAgICAgICAgICAgICAgICBudW0yPTEwfSwKLSAgICB7b2ssIERpZmZ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgY2FsY3VsYXRlLCBbMSwgV29ya10pLAorICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCiAgICAgaW86Zm9ybWF0KCIxNS0xMD1+cH5uIiwgW0RpZmZdKSwKIAotICAgIHtvaywgTG9nfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIGdldFN0cnVjdCwgWzFdKSwKKyAgICB7Q2xpZW50NSwge29rLCBMb2d9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ0LCBnZXRTdHJ1Y3QsIFsxXSksCiAgICAgaW86Zm9ybWF0KCJMb2c6IH5wfm4iLCBbTG9nXSksCiAKLSAgICB0cnkKLSAgICAgICAgV29yazEgPSAjd29ya3tvcD0/dHV0b3JpYWxfRElWSURFLAotICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKLSAgICAgICAgICAgICAgICAgICAgICBudW0yPTB9LAotICAgICAgICB7b2ssIF9RdW90fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCisgICAgQ2xpZW50NiA9CisgICAgICAgIHRyeQorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCisgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLAogCi0gICAgICAgIGlvOmZvcm1hdCgiTEFNRTogZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGJyb2tlbn5uIiwgW10pCi0gICAgY2F0Y2gKLSAgICAgICAgWiAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJHb3QgZXhjZXB0aW9uIHdoZXJlIGV4cGVjdGluZyAtIHRoZSAiICsrCi0gICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBpcyBOT1QgYSBwcm9ibGVtISEhfm4iKSwKLSAgICAgICAgICAgIHAoWikKLSAgICBlbmQsCisgICAgICAgICAgICBpbzpmb3JtYXQoIkxBTUU6IGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBicm9rZW5+biIsIFtdKSwKKyAgICAgICAgICAgIENsaWVudFMxCisgICAgICAgIGNhdGNoCisgICAgICAgICAgICB0aHJvdzp7Q2xpZW50UzIsIFp9IC0+CisgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJHb3QgZXhjZXB0aW9uIHdoZXJlIGV4cGVjdGluZyAtIHRoZSAiICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xsb3dpbmcgaXMgTk9UIGEgcHJvYmxlbSEhIX5uIiksCisgICAgICAgICAgICAgICAgcChaKSwKKyAgICAgICAgICAgICAgICBDbGllbnRTMgorICAgICAgICBlbmQsCiAKIAotICAgIHtvaywgb2t9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgemlwLCBbXSksCisgICAge0NsaWVudDcsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ2LCB6aXAsIFtdKSwKICAgICBpbzpmb3JtYXQoInppcH5uIiwgW10pLAogCi0gICAgb2sgPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudCksCisgICAge19DbGllbnQ4LCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDcpLAogICAgIG9rLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGE0MTdlMGQuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNlcnZlci5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3NWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVJMX1RIUklGVD0uLi8uLi9saWIvZXJsCisKK2lmICEgWyAtZCAke0VSTF9USFJJRlR9L2ViaW4gXTsgdGhlbgorICAgIGVjaG8gIlBsZWFzZSBidWlsZCB0aGUgVGhyaWZ0IGxpYnJhcnkgYnkgcnVubmluZyBcYG1ha2UnIGluICR7RVJMX1RIUklGVH0iCisgICAgZXhpdCAxCitmaQorCitpZiAhIFsgLWQgZ2VuLWVybCBdOyB0aGVuCisgIC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLXIgLS1nZW4gZXJsIC4uL3R1dG9yaWFsLnRocmlmdAorZmkKKworCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzljZWQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCkBAIC0wLDAgKzEsODkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIVFRQIGltcGxlbWVudGF0aW9uIHdhcyBjcmVhdGVkIGJ5CislJSBQZXRlciBOZXVtYXJrIDxuZXVtYXJrLnBldGVyQGdtYWlsLmNvbT4gYmFzZWQgb24KKyUlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKyBzb2NrZXQgdHV0b3JpYWwuIFVzZSB3aXRoIHRoZSBzYW1lIHNlcnZlcgorJSUgdGhhdCB0aGUgSmF2YXNjcmlwdCB0dXRvcmlhbCB1c2VzIQorCistbW9kdWxlKGpzb25fY2xpZW50KS4KKworLWluY2x1ZGUoImNhbGN1bGF0b3JfdGhyaWZ0LmhybCIpLgorCistZXhwb3J0KFt0LzBdKS4KKworJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgaHR0cCB0cmFuc3BvcnRzCislJSB3aXRoIHRoZSBqc29uIHByb3RvY29sCituZXdfY2xpZW50KEhvc3QsIFBhdGgsIFNlcnZpY2UsIF9PcHRpb25zKSAtPgorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSB7W10sW119LAorICAgIFRyYW5zcG9ydEZhY3RvcnkgPSBmdW4oKSAtPiB0aHJpZnRfaHR0cF90cmFuc3BvcnQ6bmV3KEhvc3QsIFBhdGgsIFRyYW5zT3B0cykgZW5kLAorICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9qc29uX3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAorICAgIHRocmlmdF9jbGllbnQ6bmV3KFByb3RvY29sLCBTZXJ2aWNlKS4KKworcChYKSAtPgorICAgIGlvOmZvcm1hdCgifnB+biIsIFtYXSksCisgICAgb2suCisKK3QoKSAtPgorICAgIGluZXRzOnN0YXJ0KCksCisgICAge29rLCBDbGllbnQwfSA9IG5ld19jbGllbnQoIjEyNy4wLjAuMTo4MDg4IiwgIi90aHJpZnQvc2VydmljZS90dXRvcmlhbC8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3JfdGhyaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKyAgICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHBpbmcsIFtdKSwKKyAgICBpbzpmb3JtYXQoInBpbmd+biIsIFtdKSwKKworICAgIHtDbGllbnQyLCB7b2ssIFN1bX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEsIGFkZCwgIFsxLCAxXSksCisgICAgaW86Zm9ybWF0KCIxKzE9fnB+biIsIFtTdW1dKSwKKworICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCisgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCisKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAorICAgICAgICAgICAgICAgICBudW0xPTE1LAorICAgICAgICAgICAgICAgICBudW0yPTEwfSwKKyAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLAorICAgIGlvOmZvcm1hdCgiMTUtMTA9fnB+biIsIFtEaWZmXSksCisKKyAgICB7Q2xpZW50NSwge29rLCBMb2d9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ0LCBnZXRTdHJ1Y3QsIFsxXSksCisgICAgaW86Zm9ybWF0KCJMb2c6IH5wfm4iLCBbTG9nXSksCisKKyAgICBDbGllbnQ2ID0KKyAgICAgICAgdHJ5CisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKKyAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCisKKyAgICAgICAgICAgIGlvOmZvcm1hdCgiTEFNRTogZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGJyb2tlbn5uIiwgW10pLAorICAgICAgICAgICAgQ2xpZW50UzEKKyAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHRocm93OntDbGllbnRTMiwgWn0gLT4KKyAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIkdvdCBleGNlcHRpb24gd2hlcmUgZXhwZWN0aW5nIC0gdGhlICIgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBpcyBOT1QgYSBwcm9ibGVtISEhfm4iKSwKKyAgICAgICAgICAgICAgICBwKFopLAorICAgICAgICAgICAgICAgIENsaWVudFMyCisgICAgICAgIGVuZCwKKworCisgICAge0NsaWVudDcsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ2LCB6aXAsIFtdKSwKKyAgICBpbzpmb3JtYXQoInppcH5uIiwgW10pLAorCisgICAge19DbGllbnQ4LCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDcpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybAppbmRleCA1YTk5NGNlLi42NDdjYzI0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgTjErTjIuCiAKIGNhbGN1bGF0ZShMb2dpZCwgV29yaykgLT4KLSAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjd29yay5vcCwgV29yayN3b3JrLm51bTEsIFdvcmsjd29yay5udW0yIH0sCisgICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrIydXb3JrJy5vcCwgV29yayMnV29yaycubnVtMSwgV29yayMnV29yaycubnVtMiB9LAogICAgIGRlYnVnKCJjYWxjdWxhdGUofnAsIHt+cCx+cCx+cH0pIiwgW0xvZ2lkLCBPcCwgTnVtMSwgTnVtMl0pLAogICAgIGNhc2UgT3Agb2YKLSAgICAgICAgP3R1dG9yaWFsX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOwotCT90dXRvcmlhbF9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKLQk/dHV0b3JpYWxfTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fQUREICAgICAgLT4gTnVtMSArIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QgLT4gTnVtMSAtIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CiAKLQk/dHV0b3JpYWxfRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+Ci0JICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOwotCT90dXRvcmlhbF9ESVZJREUgLT4KLQkgICAgTnVtMSBkaXYgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgd2hlbiBOdW0yID09IDAgLT4KKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFIC0+CisgICAgICAgICAgTnVtMSBkaXYgTnVtMjsKIAotCV9FbHNlIC0+Ci0JICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iSW52YWxpZCBvcGVyYXRpb24ifSkKKyAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQogICAgIGVuZC4KIAogZ2V0U3RydWN0KEtleSkgLT4KICAgICBkZWJ1ZygiZ2V0U3RydWN0KH5wKSIsIFtLZXldKSwKLSAgICAjc2hhcmVkU3RydWN0e2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCisgICAgIydTaGFyZWRTdHJ1Y3Qne2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCiAKIHppcCgpIC0+CiAgICAgZGVidWcoInppcCIsIFtdKSwKQEAgLTYzLDcgKzYzLDcgQEAKICUlCiAKIHN0YXJ0KCkgLT4KLSAgICBzdGFydCg5OTk5KS4KKyAgICBzdGFydCg5MDkwKS4KIAogc3RhcnQoUG9ydCkgLT4KICAgICBIYW5kbGVyICAgPSA/TU9EVUxFLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5zaCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuc2gKaW5kZXggMTA2Yzg5ZS4uNzc1YWZiNiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvZXJsL3NlcnZlci5zaAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLnNoCkBAIC0yNiwxMiArMjYsMTIgQEAKICAgICBleGl0IDEKIGZpCiAKLWlmICEgWyAtZCAuLi9nZW4tZXJsIF07IHRoZW4KLSAgICBlY2hvICJQbGVhc2UgcnVuIHRocmlmdCBmaXJzdCB0byBnZW5lcmF0ZSAuLi9nZW4tZXJsLyIKLSAgICBleGl0IDEKK2lmICEgWyAtZCBnZW4tZXJsIF07IHRoZW4KKyAgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtLWdlbiBlcmwgLi4vdHV0b3JpYWwudGhyaWZ0CiBmaQogCiAKLWVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIC4uL2dlbi1lcmwgLW8gLi4vZ2VuLWVybCAuLi9nZW4tZXJsLyouZXJsICAmJgotICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAuLi9nZW4tZXJsICouZXJsICYmCi0gIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIC4uL2dlbi1lcmwgCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1N2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tZ28vdHV0b3JpYWwvY2FsY3VsYXRvci5nbyBnZW4tZ28vc2hhcmVkL3NoYXJlZF9zZXJ2aWNlLmdvOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvCisKK2NoZWNrOiBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQgdGhpcmRwYXJ0eS1kZXAKKwkkKFRIUklGVCkgLXIgLS1nZW4gZ28kKENPTVBJTEVSX0VYVFJBRkxBRykgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwljcCAtciBnZW4tZ28vKiBzcmMvCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGdvLXR1dG9yaWFsIC4vc3JjCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGNhbGN1bGF0b3ItcmVtb3RlIHNyYy90dXRvcmlhbC9jYWxjdWxhdG9yLXJlbW90ZS9jYWxjdWxhdG9yLXJlbW90ZS5nbworCitzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQ6CisJbWtkaXIgLXAgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28KKwlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdAorCit0aGlyZHBhcnR5LWRlcDoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIC1zZXJ2ZXI9dHJ1ZSAtc2VjdXJlPXRydWUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlY3VyZT10cnVlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qIHNyYy9zaGFyZWQgc3JjL3R1dG9yaWFsIHNyYy9naXQuYXBhY2hlLm9yZyBnby10dXRvcmlhbCBjYWxjdWxhdG9yLXJlbW90ZQorCitFWFRSQV9ESVNUID0gXAorCXNyYy9jbGllbnQuZ28gXAorCXNyYy9oYW5kbGVyLmdvIFwKKwlzcmMvc2VydmVyLmdvIFwKKwlzcmMvbWFpbi5nbyBcCisJc2VydmVyLmNydCBcCisJc2VydmVyLmtleQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zZXJ2ZXIuY3J0IGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc2VydmVyLmtleSBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28gYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWJlMDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJInR1dG9yaWFsIgorCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgaGFuZGxlQ2xpZW50KGNsaWVudCAqdHV0b3JpYWwuQ2FsY3VsYXRvckNsaWVudCkgKGVyciBlcnJvcikgeworCWNsaWVudC5QaW5nKGRlZmF1bHRDdHgpCisJZm10LlByaW50bG4oInBpbmcoKSIpCisKKwlzdW0sIF8gOj0gY2xpZW50LkFkZChkZWZhdWx0Q3R4LCAxLCAxKQorCWZtdC5QcmludCgiMSsxPSIsIHN1bSwgIlxuIikKKworCXdvcmsgOj0gdHV0b3JpYWwuTmV3V29yaygpCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREUKKwl3b3JrLk51bTEgPSAxCisJd29yay5OdW0yID0gMAorCXF1b3RpZW50LCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnRsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAgd2l0aCBuZXcgdmFsdWU6IiwgcXVvdGllbnQpCisJfQorCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9TVUJUUkFDVAorCXdvcmsuTnVtMSA9IDE1CisJd29yay5OdW0yID0gMTAKKwlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnQoIjE1LTEwPSIsIGRpZmYsICJcbiIpCisJfQorCisJbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdChkZWZhdWx0Q3R4LCAxKQorCWlmIGVyciAhPSBuaWwgeworCQlmbXQuUHJpbnRsbigiVW5hYmxlIHRvIGdldCBzdHJ1Y3Q6IiwgZXJyKQorCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJZm10LlByaW50bG4oIkNoZWNrIGxvZzoiLCBsb2cuVmFsdWUpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyBydW5DbGllbnQodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWNmZy5JbnNlY3VyZVNraXBWZXJpZnkgPSB0cnVlCisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoYWRkciwgY2ZnKQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoYWRkcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKCJFcnJvciBvcGVuaW5nIHNvY2tldDoiLCBlcnIpCisJCXJldHVybiBlcnIKKwl9CisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlpZiBlcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwlvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXJldHVybiBoYW5kbGVDbGllbnQodHV0b3JpYWwuTmV3Q2FsY3VsYXRvckNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBlZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkic2hhcmVkIgorCSJzdHJjb252IgorCSJ0dXRvcmlhbCIKKykKKwordHlwZSBDYWxjdWxhdG9ySGFuZGxlciBzdHJ1Y3QgeworCWxvZyBtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0Cit9CisKK2Z1bmMgTmV3Q2FsY3VsYXRvckhhbmRsZXIoKSAqQ2FsY3VsYXRvckhhbmRsZXIgeworCXJldHVybiAmQ2FsY3VsYXRvckhhbmRsZXJ7bG9nOiBtYWtlKG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QpfQorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJwaW5nKClcbiIpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKGN0eCBjb250ZXh0LkNvbnRleHQsIG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKKwlyZXR1cm4gbnVtMSArIG51bTIsIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwgeyIsIHcuT3AsICIsIiwgdy5OdW0xLCAiLCIsIHcuTnVtMiwgIn0pXG4iKQorCXN3aXRjaCB3Lk9wIHsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9BREQ6CisJCXZhbCA9IHcuTnVtMSArIHcuTnVtMgorCQlicmVhaworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUOgorCQl2YWwgPSB3Lk51bTEgLSB3Lk51bTIKKwkJYnJlYWsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9NVUxUSVBMWToKKwkJdmFsID0gdy5OdW0xICogdy5OdW0yCisJCWJyZWFrCisJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fRElWSURFOgorCQlpZiB3Lk51bTIgPT0gMCB7CisJCQlvdWNoIDo9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQorCQkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQkJb3VjaC5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorCQkJZXJyID0gb3VjaAorCQkJcmV0dXJuCisJCX0KKwkJdmFsID0gdy5OdW0xIC8gdy5OdW0yCisJCWJyZWFrCisJZGVmYXVsdDoKKwkJb3VjaCA6PSB0dXRvcmlhbC5OZXdJbnZhbGlkT3BlcmF0aW9uKCkKKwkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQlvdWNoLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKwkJZXJyID0gb3VjaAorCQlyZXR1cm4KKwl9CisJZW50cnkgOj0gc2hhcmVkLk5ld1NoYXJlZFN0cnVjdCgpCisJZW50cnkuS2V5ID0gbG9naWQKKwllbnRyeS5WYWx1ZSA9IHN0cmNvbnYuSXRvYShpbnQodmFsKSkKKwlrIDo9IGludChsb2dpZCkKKwkvKgorCSAgIG9sZHZhbHVlLCBleGlzdHMgOj0gcC5sb2dba10KKwkgICBpZiBleGlzdHMgeworCSAgICAgZm10LlByaW50KCJSZXBsYWNpbmcgIiwgb2xkdmFsdWUsICIgd2l0aCAiLCBlbnRyeSwgIiBmb3Iga2V5ICIsIGssICJcbiIpCisJICAgfSBlbHNlIHsKKwkgICAgIGZtdC5QcmludCgiQWRkaW5nICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKKwkgICB9CisJKi8KKwlwLmxvZ1trXSA9IGVudHJ5CisJcmV0dXJuIHZhbCwgZXJyCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwga2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIGVycm9yKSB7CisJZm10LlByaW50KCJnZXRTdHJ1Y3QoIiwga2V5LCAiKVxuIikKKwl2LCBfIDo9IHAubG9nW2ludChrZXkpXQorCXJldHVybiB2LCBuaWwKK30KKworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJ6aXAoKVxuIikKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzBkN2IKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvbWFpbi5nbwpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJmbGFnIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJvcyIKKykKKworZnVuYyBVc2FnZSgpIHsKKwlmbXQuRnByaW50KG9zLlN0ZGVyciwgIlVzYWdlIG9mICIsIG9zLkFyZ3NbMF0sICI6XG4iKQorCWZsYWcuUHJpbnREZWZhdWx0cygpCisJZm10LkZwcmludChvcy5TdGRlcnIsICJcbiIpCit9CisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlVzYWdlID0gVXNhZ2UKKwlzZXJ2ZXIgOj0gZmxhZy5Cb29sKCJzZXJ2ZXIiLCBmYWxzZSwgIlJ1biBzZXJ2ZXIiKQorCXByb3RvY29sIDo9IGZsYWcuU3RyaW5nKCJQIiwgImJpbmFyeSIsICJTcGVjaWZ5IHRoZSBwcm90b2NvbCAoYmluYXJ5LCBjb21wYWN0LCBqc29uLCBzaW1wbGVqc29uKSIpCisJZnJhbWVkIDo9IGZsYWcuQm9vbCgiZnJhbWVkIiwgZmFsc2UsICJVc2UgZnJhbWVkIHRyYW5zcG9ydCIpCisJYnVmZmVyZWQgOj0gZmxhZy5Cb29sKCJidWZmZXJlZCIsIGZhbHNlLCAiVXNlIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpCisJYWRkciA6PSBmbGFnLlN0cmluZygiYWRkciIsICJsb2NhbGhvc3Q6OTA5MCIsICJBZGRyZXNzIHRvIGxpc3RlbiB0byIpCisJc2VjdXJlIDo9IGZsYWcuQm9vbCgic2VjdXJlIiwgZmFsc2UsICJVc2UgdGxzIHNlY3VyZSB0cmFuc3BvcnQiKQorCisJZmxhZy5QYXJzZSgpCisKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJc3dpdGNoICpwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IiwgIiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJZm10LkZwcmludChvcy5TdGRlcnIsICJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCIsIHByb3RvY29sLCAiXG4iKQorCQlVc2FnZSgpCisJCW9zLkV4aXQoMSkKKwl9CisKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKwlpZiAqYnVmZmVyZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwl9IGVsc2UgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl9CisKKwlpZiAqZnJhbWVkIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCX0KKworCWlmICpzZXJ2ZXIgeworCQlpZiBlcnIgOj0gcnVuU2VydmVyKHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIHNlcnZlcjoiLCBlcnIpCisJCX0KKwl9IGVsc2UgeworCQlpZiBlcnIgOj0gcnVuQ2xpZW50KHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIGNsaWVudDoiLCBlcnIpCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwOGViCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJ0dXRvcmlhbCIKKykKKworZnVuYyBydW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWlmIGNlcnQsIGVyciA6PSB0bHMuTG9hZFg1MDlLZXlQYWlyKCJzZXJ2ZXIuY3J0IiwgInNlcnZlci5rZXkiKTsgZXJyID09IG5pbCB7CisJCQljZmcuQ2VydGlmaWNhdGVzID0gYXBwZW5kKGNmZy5DZXJ0aWZpY2F0ZXMsIGNlcnQpCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNlcnZlclNvY2tldChhZGRyLCBjZmcpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChhZGRyKQorCX0KKwkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlmbXQuUHJpbnRmKCIlVFxuIiwgdHJhbnNwb3J0KQorCWhhbmRsZXIgOj0gTmV3Q2FsY3VsYXRvckhhbmRsZXIoKQorCXByb2Nlc3NvciA6PSB0dXRvcmlhbC5OZXdDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZm10LlByaW50bG4oIlN0YXJ0aW5nIHRoZSBzaW1wbGUgc2VydmVyLi4uIG9uICIsIGFkZHIpCisJcmV0dXJuIHNlcnZlci5TZXJ2ZSgpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYyNzEzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeCBnZW4taGF4ZS9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuaHg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIgJDwKKworYWxsLWxvY2FsOiAkKEJJTl9DUFApICQoQklOX1BIUCkgJChCSU5fUEhQX1dFQikKKworY2hlY2s6IGdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKworJChCSU5fQ1BQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyCisKK3R1dG9yaWFsc2VydmVyX3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApCisKK3R1dG9yaWFsY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwkkKEJJTl9DUFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudF9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlY3VyZQorCit0dXRvcmlhbHNlcnZlcl9waHBfaHR0cDogYWxsCisJcGhwIC1TIDEyNy4wLjAuMTo5MDkwIHJvdXRlci5waHAKKwordHV0b3JpYWxjbGllbnRfaHR0cDogYWxsCisJJChCSU5fQ1BQKSBjbGllbnQgaHR0cAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4taGF4ZSBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCVR1dG9yaWFsLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2ogYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZmNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2oKQEAgLTAsMCArMSw2NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjIiPgorICA8IS0tIE91dHB1dCBTV0Ygb3B0aW9ucyAtLT4KKyAgPG91dHB1dD4KKyAgICA8bW92aWUgb3V0cHV0VHlwZT0iQXBwbGljYXRpb24iIC8+CisgICAgPG1vdmllIGlucHV0PSIiIC8+CisgICAgPG1vdmllIHBhdGg9ImJpbi9IYXhlVHV0b3JpYWwiIC8+CisgICAgPG1vdmllIGZwcz0iMzAiIC8+CisgICAgPG1vdmllIHdpZHRoPSI4MDAiIC8+CisgICAgPG1vdmllIGhlaWdodD0iNjAwIiAvPgorICAgIDxtb3ZpZSB2ZXJzaW9uPSIxIiAvPgorICAgIDxtb3ZpZSBtaW5vclZlcnNpb249IjAiIC8+CisgICAgPG1vdmllIHBsYXRmb3JtPSJDKysiIC8+CisgICAgPG1vdmllIGJhY2tncm91bmQ9IiNGRkZGRkYiIC8+CisgIDwvb3V0cHV0PgorICA8IS0tIE90aGVyIGNsYXNzZXMgdG8gYmUgY29tcGlsZWQgaW50byB5b3VyIFNXRiAtLT4KKyAgPGNsYXNzcGF0aHM+CisgICAgPGNsYXNzIHBhdGg9InNyYyIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iZ2VuLWhheGUiIC8+CisgICAgPGNsYXNzIHBhdGg9Ii4uLy4uL2xpYi9oYXhlL3NyYyIgLz4KKyAgPC9jbGFzc3BhdGhzPgorICA8IS0tIEJ1aWxkIG9wdGlvbnMgLS0+CisgIDxidWlsZD4KKyAgICA8b3B0aW9uIGRpcmVjdGl2ZXM9IiIgLz4KKyAgICA8b3B0aW9uIGZsYXNoU3RyaWN0PSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG5vSW5saW5lT25EZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBtYWluQ2xhc3M9Ik1haW4iIC8+CisgICAgPG9wdGlvbiBlbmFibGVkZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBhZGRpdGlvbmFsPSIiIC8+CisgIDwvYnVpbGQ+CisgIDwhLS0gaGF4ZWxpYiBsaWJyYXJpZXMgLS0+CisgIDxoYXhlbGliPgorICAgIDwhLS0gZXhhbXBsZTogPGxpYnJhcnkgbmFtZT0iLi4uIiAvPiAtLT4KKyAgPC9oYXhlbGliPgorICA8IS0tIENsYXNzIGZpbGVzIHRvIGNvbXBpbGUgKG90aGVyIHJlZmVyZW5jZWQgY2xhc3NlcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQpIC0tPgorICA8Y29tcGlsZVRhcmdldHM+CisgICAgPCEtLSBleGFtcGxlOiA8Y29tcGlsZSBwYXRoPSIuLi4iIC8+IC0tPgorICA8L2NvbXBpbGVUYXJnZXRzPgorICA8IS0tIFBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB0cmVlIC0tPgorICA8aGlkZGVuUGF0aHM+CisgICAgPGhpZGRlbiBwYXRoPSJvYmoiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjcHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNzaGFycC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iZmxhc2guaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmEuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmFzY3JpcHQuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLmJhdCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLnNoIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iTWFrZWZpbGUuYW0iIC8+CisgICAgPGhpZGRlbiBwYXRoPSJuZWtvLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwaHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InByb2plY3QuaGlkZSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InB5dGhvbi5oeG1sIiAvPgorICA8L2hpZGRlblBhdGhzPgorICA8IS0tIEV4ZWN1dGVkIGJlZm9yZSBidWlsZCAtLT4KKyAgPHByZUJ1aWxkQ29tbWFuZD50aHJpZnQgLXIgLWdlbiBoYXhlICAuLi90dXRvcmlhbC50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iVW5rbm93biIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9IiIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UdXRvcmlhbC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbCBiL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1R1dG9yaWFsLnN3ZgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworIyB3ZSBuZWVkIHNvbWUgZ29vZGllcyBmcm9tIHN5cy5uZXQKKyMgLS1tYWNybyBhbGxvd1BhY2thZ2UoInN5cyIpCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxNTU2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYyAKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UdXRvcmlhbC5qYXIKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhU2NyaXB0IHRhcmdldAorLWpzIGJpbi9UdXRvcmlhbC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0IGIvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgIC4uXHR1dG9yaWFsLnRocmlmdAoraWYgZXJyb3JsZXZlbCAxIGdvdG8gU1RPUAorCityZW0gIyBpbnZva2UgSGF4ZSBjb21waWxlciBmb3IgYWxsIHRhcmdldHMKK2ZvciAlJWEgaW4gKCouaHhtbCkgZG8gKAorCXJlbSAqIGZpbHRlciBQeXRob24sIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSGF4ZSAzLjEuMyAoYnV0IHdpbGwgYmUgaW4gMy4xLjQpCisJaWYgbm90ICIlJWEiPT0icHl0aG9uLmh4bWwiICgKKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQllY2hvIEJ1aWxkaW5nICUlYSAuLi4KKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQloYXhlICAtLWN3ZCAuICAlJWEKKwkpCispCisKKworZWNoby4KK2VjaG8gZG9uZS4KK3BhdXNlCitnb3RvIGVvZgorCis6Tk9USU5TVEFMTEVECitlY2hvIEZBVEFMOiBFaXRoZXIgSGF4ZSBpcyBub3QgaW5zdGFsbGVkLCBvciB0aGUgSEFYRVBBVEggdmFyaWFibGUgaXMgbm90IHNldC4KK3BhdXNlCitnb3RvIGVvZgorCis6TUlTU0lOR1ZBUlMKK2VjaG8gRkFUQUw6IFVuYWJsZSB0byBsb2NhdGUgaG9tZSBmb2xkZXIuCitlY2hvLgorZWNobyBCb3RoIEhPTUVEUklWRSBhbmQgSE9NRVBBVEggbmVlZCB0byBiZSBzZXQgdG8gcG9pbnQgdG8geW91ciBIb21lIGZvbGRlci4KK2VjaG8gVGhlIGN1cnJlbnQgdmFsdWVzIGFyZToKK2VjaG8gSE9NRURSSVZFPSVIT01FRFJJVkUlCitlY2hvIEhPTUVQQVRIPSVIT01FUEFUSCUKK3BhdXNlCitnb3RvIGVvZgorCis6U1RPUAorcGF1c2UKK2dvdG8gZW9mCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2ggYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTY1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL3R1dG9yaWFsLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBvaWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwgYi90dXRvcmlhbC9oYXhlL25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYxZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVHV0b3JpYWwubgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKQEAgLTAsMCArMSw0MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC13ZWItc2VydmVyLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI2RlZmluZXMKKy1EIHBocHdlYnNlcnZlcgorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjY4ODcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZSBiL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWQ0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDEwNSBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiQXBhY2hlIFRocmlmdCBUdXRvcmlhbCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIgorICAgICwibGljZW5zZSIgOiAiQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgorICAgICwidXJsIiA6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UdXRvcmlhbC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1R1dG9yaWFsLm4iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicGhwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3BwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vTWFpbi1kZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YS5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNzaGFycC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxUdXRvcmlhbC5leGVcXGJpblxcTWFpbi1EZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1R1dG9yaWFsLnB5IgorICAgICAgICB9CisgICAgXQorICAgICwiZmlsZXMiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXG9yZ1xcYXBhY2hlXFx0aHJpZnRcXHNlcnZlclxcVFNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc2CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxvcmdcXGFwYWNoZVxcdGhyaWZ0XFxzZXJ2ZXJcXFRTaW1wbGVTZXJ2ZXIuaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAxMDAKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXHNoYXJlZFxcU2hhcmVkU2VydmljZVByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDIwCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFx0dXRvcmlhbFxcQ2FsY3VsYXRvclByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc5CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMAorICAgICAgICB9CisgICAgXQorICAgICwiYWN0aXZlRmlsZSIgOiAic3JjXFxNYWluLmh4IgorICAgICwib3BlbkZMVGFyZ2V0IiA6IG51bGwKKyAgICAsIm9wZW5GTEJ1aWxkTW9kZSIgOiAiRGVidWciCisgICAgLCJydW5BY3Rpb25UeXBlIiA6IG51bGwKKyAgICAsInJ1bkFjdGlvblRleHQiIDogbnVsbAorICAgICwiYnVpbGRBY3Rpb25Db21tYW5kIiA6IG51bGwKKyAgICAsImhpZGRlbkl0ZW1zIiA6IFsKKworICAgIF0KKyAgICAsInNob3dIaWRkZW5JdGVtcyIgOiBmYWxzZQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQeXRob24gdGFyZ2V0CistcHl0aG9uIGJpbi9UdXRvcmlhbC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwIGIvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKQEAgLTAsMCArMSwzMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworCisKKy8vcm91dGVyIGZpbGUgdG8gcnVuIHRlc3Rpbmcgd2ViIHNlcnZlcgorCisvL3NldF90aW1lX2xpbWl0KDEpOworCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4IGIvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3NTJkYgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4CkBAIC0wLDAgKzEsMTAxIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKworICAgIHByaXZhdGUgdmFyIGxvZyA9IG5ldyBJbnRNYXA8U2hhcmVkU3RydWN0PigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGluZygpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCJwaW5nKCkiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQoIG51bTEgOiBoYXhlLkludDMyLCBudW0yIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ2FkZCggJG51bTEsICRudW0yKScpOworICAgICAgICByZXR1cm4gbnVtMSArIG51bTI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSggbG9naWQgOiBoYXhlLkludDMyLCB3b3JrIDogV29yaykgOiBoYXhlLkludDMyICB7CisgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoICRsb2dpZCwgJyt3b3JrLm9wKyIsIit3b3JrLm51bTErIiwiK3dvcmsubnVtMisiKSIpOworCisgICAgICAgIHZhciB2YWwgOiBoYXhlLkludDMyID0gMDsKKyAgICAgICAgc3dpdGNoICh3b3JrLm9wKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworCisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKworICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gU3RkLmludCggd29yay5udW0xIC8gd29yay5udW0yKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgICAgIGVudHJ5LnZhbHVlID0gJyR2YWwnOworICAgICAgICBsb2cuc2V0KGxvZ2lkLCBlbnRyeSk7CisKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RydWN0KCBrZXkgOiBoYXhlLkludDMyKSA6IFNoYXJlZFN0cnVjdCB7CisgICAgICAgIHRyYWNlKCdnZXRTdHJ1Y3QoJGtleSknKTsKKyAgICAgICAgcmV0dXJuIGxvZy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvLyBvbmV3YXkgbWV0aG9kLCAgbm8gYXJncworICAgIHB1YmxpYyBmdW5jdGlvbiB6aXAoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgiemlwKCkiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHggYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0dXRvcmlhbC4qOworaW1wb3J0IHNoYXJlZC4qOworCisKK2VudW0gUHJvdCB7CisgICAgYmluYXJ5OworICAgIGpzb247Cit9CisKK2VudW0gVHJucyB7CisgICAgc29ja2V0OworICAgIGh0dHA7Cit9CisKK2NsYXNzIE1haW4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgZnJhbWVkIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBidWZmZXJlZCA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgcHJvdCA6IFByb3QgPSBiaW5hcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRybnMgOiBUcm5zID0gc29ja2V0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRhcmdldEhvc3QgOiBTdHJpbmcgPSAibG9jYWxob3N0IjsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGFyZ2V0UG9ydCA6IEludCA9IDkwOTA7CisKKyAgICBzdGF0aWMgZnVuY3Rpb24gbWFpbigpIHsKKworICAgICAgICAjaWYgISAoZmxhc2ggfHwganMgfHwgcGhwd2Vic2VydmVyKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICB0cmFjZShHZXRIZWxwKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiAgcGhwd2Vic2VydmVyCisgICAgICAgIC8vZm9yY2luZyBzZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcnZlcikKKyAgICAgICAgICAgICAgICBSdW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSdW5DbGllbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIH0KKworICAgICAgICB0cmFjZSgiQ29tcGxldGVkLiIpOworICAgIH0KKworICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGhwV2ViU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCisgICAgICAgIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykKKyAgICAgICAgeworICAgICAgICAgIC8vIGhhbmRsZSB0cmFjZQorICAgICAgICAgIHZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisgICAgICAgICAgICB2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisgICAgICAgICAgICBmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKyAgICAgICAgICAgICAgZXh0cmEgKz0gIiwiICsgdjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdiArIGV4dHJhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisgICAgICAgICAgU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBHZXRIZWxwKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gU3lzLmV4ZWN1dGFibGVQYXRoKCkrIiAgbW9kdXMgIHRybnNPcHRpb24gIHRyYW5zcG9ydCAgcHJvdG9jb2xcbiIKKyAgICAgICAgKyJPcHRpb25zOlxuIgorICAgICAgICArIiAgbW9kdXM6ICAgICAgIGNsaWVudCwgc2VydmVyICAgKGRlZmF1bHQ6IGNsaWVudClcbiIKKyAgICAgICAgKyIgIHRybnNPcHRpb246ICBmcmFtZWQsIGJ1ZmZlcmVkIChkZWZhdWx0OiBub25lKVxuIgorICAgICAgICArIiAgdHJhbnNwb3J0OiAgIHNvY2tldCwgaHR0cCAgICAgKGRlZmF1bHQ6IHNvY2tldClcbiIKKyAgICAgICAgKyIgIHByb3RvY29sOiAgICBiaW5hcnksIGpzb24gICAgIChkZWZhdWx0OiBiaW5hcnkpXG4iCisgICAgICAgICsiXG4iCisgICAgICAgICsiQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4iOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gUGFyc2VBcmdzKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHN0ZXAgPSAwOworICAgICAgICBmb3IgKGFyZyBpbiBTeXMuYXJncygpKSB7CisKKyAgICAgICAgICAgIC8vIHNlcnZlcnxjbGllbnQKKyAgICAgICAgICAgIHN3aXRjaChzdGVwKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJjbGllbnQiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggYXJnID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImZyYW1lZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICJzb2NrZXQiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBzb2NrZXQ7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImh0dHAiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBodHRwOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gdHJhbnNwb3J0ICIrYXJnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJiaW5hcnkiKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBiaW5hcnk7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImpzb24iKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBqc29uOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gcHJvdG9jb2wgIithcmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIGFyZ3VtZW50ICIrYXJnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGZyYW1lZCAmJiBidWZmZXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiV046IGZyYW1lZCBzdXBlcnNlZGVzIGJ1ZmZlcmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgICNlbmQKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIENsaWVudFNldHVwKCkgOiBDYWxjdWxhdG9yIHsKKyAgICAgICAgIHRyYWNlKCJDbGllbnQgY29uZmlndXJhdGlvbjoiKTsKKworICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQ7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgJHRhcmdldEhvc3Q6JHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCB0YXJnZXRIb3N0LCB0YXJnZXRQb3J0KTsKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHt0YXJnZXRIb3N0fToke3RhcmdldFBvcnR9JzsKKyAgICAgICAgICAgIHRyYWNlKCctIEhUVFAgdHJhbnNwb3J0ICR1cmknKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICB9CisKKworICAgICAgICAvLyBvcHRpbmFsIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgIGlmICggZnJhbWVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHByb3RvY29sCisgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbDsKKyAgICAgICAgc3dpdGNoKHByb3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zcG9ydCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gcHV0IGV2ZXJ5dGhpbmcgdG9nZXRoZXIKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySW1wbChwcm90b2NvbCxwcm90b2NvbCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoKSA6IFZvaWQgeworICAgICAgICB2YXIgY2xpZW50ID0gQ2xpZW50U2V0dXAoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjbGllbnQucGluZygpOworICAgICAgICAgICAgdHJhY2UoInBpbmcoKSBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHN1bSA9IGNsaWVudC5hZGQoIDEsIDEpOworICAgICAgICAgICAgdHJhY2UoJzErMT0kc3VtJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnYWRkKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdhZGQoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisKKworICAgICAgICB2YXIgd29yayA9IG5ldyB0dXRvcmlhbC5Xb3JrKCk7CisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uRElWSURFOworICAgICAgICB3b3JrLm51bTEgPSAxOworICAgICAgICB3b3JrLm51bTIgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAhIFJlc3VsdCA9ICRxdW90aWVudCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgIHdvcmsubnVtMSA9IDE1OworICAgICAgICB3b3JrLm51bTIgPSAxMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnMTUtMTA9JGRpZmYnKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgbG9nIDogU2hhcmVkU3RydWN0ID0gY2xpZW50LmdldFN0cnVjdCggMSk7CisgICAgICAgICAgICB2YXIgbG9ndmFsID0gbG9nLnZhbHVlOworICAgICAgICAgICAgdHJhY2UoJ0NoZWNrIGxvZzogJGxvZ3ZhbCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2dldFN0cnVjdCgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnZ2V0U3RydWN0KCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU2VydmVyU2V0dXAoKSA6IFRTZXJ2ZXIgeworICAgICAgICAgdHJhY2UoIlNlcnZlciBjb25maWd1cmF0aW9uOiIpOworCisgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgICAgIHRocm93ICdjdXJyZW50IHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgc29ja2V0IHNlcnZlcnMnOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICB0cmFjZSgnLSBzb2NrZXQgdHJhbnNwb3J0IHBvcnQgJHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCB0YXJnZXRQb3J0KTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAvL3RyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIHRyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAjZW5kCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zZmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgaWYgKCBmcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc2ZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RmYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgICAgIHN3aXRjaChwcm90KQorICAgICAgICB7CisgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgIHRyYWNlKCItIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CisgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgc2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAjZW5kCisKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFJ1blNlcnZlcigpIDogVm9pZCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyID0gU2VydmVyU2V0dXAoKTsKKworICAgICAgICAgICAgdHJhY2UoIlxuU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnUnVuU2VydmVyKCkgZmFpbGVkOiAkZScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJkb25lLiIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzIGIvdHV0b3JpYWwvaHMvSGFza2VsbENsaWVudC5ocwppbmRleCBhNTYxODdiLi5iZDI5ZGYwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzCisrKyBiL3R1dG9yaWFsL2hzL0hhc2tlbGxDbGllbnQuaHMKQEAgLTMwLDcgKzMwLDkgQEAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQogaW1wb3J0IFRocmlmdC5TZXJ2ZXIKIAoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiBpbXBvcnQgRGF0YS5NYXliZQoraW1wb3J0IERhdGEuVGV4dC5MYXp5CiBpbXBvcnQgVGV4dC5QcmludGYKIGltcG9ydCBOZXR3b3JrCiAKQEAgLTQ2LDI4ICs0OCwyNyBAQAogICBwcmludGYgIjErMT0lZFxuIiBzdW0KIAogCi0gIGxldCB3b3JrID0gV29yayB7IGZfV29ya19vcCA9IEp1c3QgRElWSURFLAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMSwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX251bTIgPSBKdXN0IDAsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19jb21tZW50ID0gTm90aGluZworICBsZXQgd29yayA9IFdvcmsgeyB3b3JrX29wID0gRElWSURFLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTEgPSAxLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTIgPSAwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKLSAgLS0gVE9ETyAtIGdldCB0aGlzIG9uZSB3b3JraW5nCi0gIC0tY2F0Y2ggKENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykgKFxleGNlcHQgLT4KLSAgLS0gICAgIHByaW50ZiAiSW52YWxpZE9wICVzIiAoc2hvdyBleGNlcHQpKQorICBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCAocHJpbnRmICIxLzA9JWRcbiIgPTw8IENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykKKyAgICAgICAgKFxlIC0+IHByaW50ZiAiSW52YWxpZE9wZXJhdGlvbiAlc1xuIiAoc2hvdyAoZSA6OiBJbnZhbGlkT3BlcmF0aW9uKSkpCiAKIAotICBsZXQgd29yayA9IFdvcmsgeyBmX1dvcmtfb3AgPSBKdXN0IFNVQlRSQUNULAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMTUsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19udW0yID0gSnVzdCAxMCwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX2NvbW1lbnQgPSBOb3RoaW5nCisgIGxldCB3b3JrID0gV29yayB7IHdvcmtfb3AgPSBTVUJUUkFDVCwKKyAgICAgICAgICAgICAgICAgICAgd29ya19udW0xID0gMTUsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfbnVtMiA9IDEwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKICAgZGlmZiA8LSBDbGllbnQuY2FsY3VsYXRlIGNsaWVudCAxIHdvcmsKICAgcHJpbnRmICIxNS0xMD0lZFxuIiBkaWZmCiAKICAgbG9nIDwtIFNDbGllbnQuZ2V0U3RydWN0IGNsaWVudCAxCi0gIHByaW50ZiAiQ2hlY2sgbG9nOiAlc1xuIiAgJCBmcm9tSnVzdCAkIGZfU2hhcmVkU3RydWN0X3ZhbHVlIGxvZworICBwcmludGYgIkNoZWNrIGxvZzogJXNcbiIgJCB1bnBhY2sgJCBzaGFyZWRTdHJ1Y3RfdmFsdWUgbG9nCiAKICAgLS0gQ2xvc2UhCiAgIHRDbG9zZSB0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMgYi90dXRvcmlhbC9ocy9IYXNrZWxsU2VydmVyLmhzCmluZGV4IDRmOWFiN2MuLmNmZTEzNDQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMKKysrIGIvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocwpAQCAtMTcsNiArMTcsOCBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIGltcG9ydCBxdWFsaWZpZWQgQ2FsY3VsYXRvcgogaW1wb3J0IENhbGN1bGF0b3JfSWZhY2UKIGltcG9ydCBUdXRvcmlhbF9UeXBlcwpAQCAtMjgsNiArMzAsOCBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIGltcG9ydCBUaHJpZnQuU2VydmVyCiAKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuU3RyaW5nCiBpbXBvcnQgRGF0YS5NYXliZQogaW1wb3J0IFRleHQuUHJpbnRmCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKHRocm93KQpAQCAtMzYsNyArNDAsNyBAQAogaW1wb3J0IERhdGEuTWFwICgoISkpCiBpbXBvcnQgRGF0YS5Nb25vaWQKIAotZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludCBTaGFyZWRTdHJ1Y3QpfQorZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludDMyIFNoYXJlZFN0cnVjdCl9CiAKIG5ld0NhbGN1bGF0b3JIYW5kbGVyID0gZG8KICAgbG9nIDwtIG5ld01WYXIgbWVtcHR5CkBAIC00NSw3ICs0OSw3IEBACiBpbnN0YW5jZSBTaGFyZWRTZXJ2aWNlX0lmYWNlIENhbGN1bGF0b3JIYW5kbGVyIHdoZXJlCiAgIGdldFN0cnVjdCBzZWxmIGsgPSBkbwogICAgIG15TG9nIDwtIHJlYWRNVmFyIChtYXRoTG9nIHNlbGYpCi0gICAgcmV0dXJuICQgKG15TG9nICEgKGZyb21KdXN0IGspKQorICAgIHJldHVybiAkIChteUxvZyAhIGspCiAKIAogaW5zdGFuY2UgQ2FsY3VsYXRvcl9JZmFjZSBDYWxjdWxhdG9ySGFuZGxlciB3aGVyZQpAQCAtNTMsOCArNTcsOCBAQAogICAgIHByaW50ICJwaW5nKCkiCiAKICAgYWRkIF8gbjEgbjIgPSBkbwotICAgIHByaW50ZiAiYWRkKCVkLCVkKVxuIiAoZnJvbUp1c3QgbjEpIChmcm9tSnVzdCBuMikKLSAgICByZXR1cm4gKChmcm9tSnVzdCBuMSkrKGZyb21KdXN0IG4yKSkKKyAgICBwcmludGYgImFkZCglZCwlZClcbiIgbjEgbjIKKyAgICByZXR1cm4gKG4xICsgbjIpCiAKICAgY2FsY3VsYXRlIHNlbGYgbWxvZ2lkIG13b3JrID0gZG8KICAgICBwcmludGYgImNhbGN1bGF0ZSglZCwgJXMpXG4iIGxvZ2lkIChzaG93IHdvcmspCkBAIC03MCwyNyArNzQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgbnVtMiB3b3JrID09IDAgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2hhdCA9IEp1c3QgJCBmcm9tRW51bSAkIG9wIHdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2h5ID0gSnVzdCAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZE9wZXJhdGlvbl93aGF0T3AgPSBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAkIG9wIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkT3BlcmF0aW9uX3doeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgbnVtMSB3b3JrIGBkaXZgIG51bTIgd29yawogCi0gICAgbGV0IGxvZ0VudHJ5ID0gU2hhcmVkU3RydWN0IChKdXN0IGxvZ2lkKSAoSnVzdCAoc2hvdyB2YWwpKQorICAgIGxldCBsb2dFbnRyeSA9IFNoYXJlZFN0cnVjdCBsb2dpZCAoZnJvbVN0cmluZyAkIHNob3cgJCB2YWwpCiAgICAgbW9kaWZ5TVZhcl8gKG1hdGhMb2cgc2VsZikgJCByZXR1cm4gLihNLmluc2VydCBsb2dpZCBsb2dFbnRyeSkKIAotICAgIHJldHVybiB2YWwKKyAgICByZXR1cm4gJCEgdmFsCiAKICAgIHdoZXJlCiAgICAgIC0tIHN0dXBpZCBkeW5hbWljIGxhbmd1YWdlcyBmJ2luZyBpdCB1cAotICAgICBudW0xID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMQotICAgICBudW0yID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMgotICAgICBvcCA9IGZyb21KdXN0IC4gZl9Xb3JrX29wCi0gICAgIGxvZ2lkID0gZnJvbUp1c3QgbWxvZ2lkCi0gICAgIHdvcmsgPSBmcm9tSnVzdCBtd29yawotCi0KLSAgICAtLXJldHVybiB2YWwKKyAgICAgbnVtMSA9IHdvcmtfbnVtMQorICAgICBudW0yID0gd29ya19udW0yCisgICAgIG9wID0gd29ya19vcAorICAgICBsb2dpZCA9IG1sb2dpZAorICAgICB3b3JrID0gbXdvcmsKIAogICB6aXAgXyA9CiAgICAgcHJpbnQgInppcCgpIgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTElDRU5TRSBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMzkgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qczoKKworLyoKKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTNlY2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHMgLXIgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKENBQkFMKSBpbnN0YWxsCisKK2luc3RhbGwtZXhlYy1ob29rOgorCSQoQ0FCQUwpIGluc3RhbGwKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgSGFza2VsbCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCSQoQ0FCQUwpIGNsZWFuCisJJChSTSkgLXIgZ2VuLSoKKworY2hlY2stbG9jYWw6CisJJChDQUJBTCkgY2hlY2sKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCWRpc3QvYnVpbGQvSGFza2VsbFNlcnZlci9IYXNrZWxsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlkaXN0L2J1aWxkL0hhc2tlbGxDbGllbnQvSGFza2VsbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCUxJQ0VOU0UKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL1NldHVwLmxocyBiL3R1dG9yaWFsL2hzL1NldHVwLmxocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMTgyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvU2V0dXAubGhzCkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1bmhhc2tlbGwKKworPiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis+IC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCis+IC0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis+IC0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorPiAtLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis+IC0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKz4gLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis+IC0tCis+IC0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis+IC0tCis+IC0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKz4gLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKz4gLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCis+IC0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCis+IC0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKz4gLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKKz4gaW1wb3J0IERpc3RyaWJ1dGlvbi5TaW1wbGUKKz4gbWFpbiA9IGRlZmF1bHRNYWluCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbCBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMTY1NWNlNy4uNjJlNjgyZgotLS0gYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbAorKysgYi90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbApAQCAtMTgsMzEgKzE4LDU2IEBACiAtLQogCiBOYW1lOiAgICAgICAgICAgVGhyaWZ0VHV0b3JpYWwKLVZlcnNpb246ICAgICAgICAwLjEuMAotQ2FiYWwtVmVyc2lvbjogID49IDEuMgotTGljZW5zZTogICAgICAgIEFwYWNoZTIKK1ZlcnNpb246ICAgICAgICAxLjAuMAorQ2FiYWwtVmVyc2lvbjogID49IDEuNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KIEJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKIFN5bm9wc2lzOiAgICAgICBUaHJpZnQgVHV0b3JpYWwgbGlicmFyeSBwYWNrYWdlCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQogCiBFeGVjdXRhYmxlIEhhc2tlbGxTZXJ2ZXIKICAgTWFpbi1pczogSGFza2VsbFNlcnZlci5ocwogICBIcy1Tb3VyY2UtRGlyczoKLSAgICAuLCAuLi9nZW4taHMvCisgICAgLiwgZ2VuLWhzLwogICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj00LCBuZXR3b3JrLCBnaGMtcHJpbSwgY29udGFpbmVycywgVGhyaWZ0Ci0gIGdoYy1vcHRpb25zOgotICAgIC1mZ2xhc2dvdy1leHRzCisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgZ2hjLXByaW0sIGNvbnRhaW5lcnMsIHRocmlmdCwgdmVjdG9yLCB1bm9yZGVyZWQtY29udGFpbmVycywgdGV4dCwgaGFzaGFibGUsIGJ5dGVzdHJpbmcsIFF1aWNrQ2hlY2sKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCiAKIEV4ZWN1dGFibGUgSGFza2VsbENsaWVudAogICBNYWluLWlzOiBIYXNrZWxsQ2xpZW50LmhzCiAgIEhzLVNvdXJjZS1EaXJzOgotICAgIC4sIC4uL2dlbi1ocy8KKyAgICAuLCBnZW4taHMvCiAgIEJ1aWxkLURlcGVuZHM6Ci0gICAgYmFzZSA+PTQsIG5ldHdvcmssIGdoYy1wcmltLCBjb250YWluZXJzLCBUaHJpZnQKLSAgZ2hjLW9wdGlvbnM6Ci0gICAgLWZnbGFzZ293LWV4dHMKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBnaGMtcHJpbSwgY29udGFpbmVycywgdGhyaWZ0LCB2ZWN0b3IsIFF1aWNrQ2hlY2sKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQgYi90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4ZDg3YjguLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9KYXZhQ2xpZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1qYXZhIC1jcCB0dXRvcmlhbC5qYXI6L3Vzci9sb2NhbC9saWIvbGlidGhyaWZ0LmphciBKYXZhQ2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIgYi90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NjE2MDAuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9KYXZhU2VydmVyCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1qYXZhIC1jcCB0dXRvcmlhbC5qYXI6L3Vzci9sb2NhbC9saWIvbGlidGhyaWZ0LmphciBKYXZhU2VydmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvamF2YS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTkwOGIxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvamF2YS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZXhwb3J0IENMQVNTUEFUSAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCithbGwtbG9jYWw6CisJJChBTlQpICQoQU5UX0ZMQUdTKSBjb21waWxlCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKwordHV0b3JpYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWxzZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWxjbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC54bWwgXAorCXNyYyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL1JFQURNRS5tZCBiL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDlmZWEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qYXZhL1JFQURNRS5tZApAQCAtMCwwICsxLDI0IEBACitUaHJpZnQgSmF2YSBUdXRvcmlhbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzEpIENvbXBpbGUgdGhlIEphdmEgbGlicmFyeQorCisgICAgdGhyaWZ0L2xpYi9qYXZhJCBtYWtlCitvcjoKKworICAgIHRocmlmdC9saWIvamF2YSQgYW50CisKKzQpIFJ1biB0aGUgdHV0b3JpYWw6CisKK3N0YXJ0IHNlcnZlciBhbmQgY2xpZW50IHdpdGggb25lIHN0ZXA6CisKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgbWFrZSB0dXRvcmlhbAorCitvcjoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBtYWtlIHR1dG9yaWFsc2VydmVyCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIG1ha2UgdHV0b3JpYWxjbGllbnQKKworb3I6CisKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgYW50IHR1dG9yaWFsc2VydmVyCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGFudCB0dXRvcmlhbGNsaWVudApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9idWlsZC54bWwgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAppbmRleCAwZWMxZWE0Li41NWNkYjhmIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbApAQCAtMTgsMjkgKzE4LDk3IEBACiAtLT4KIDxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJ0dXRvcmlhbCIgYmFzZWRpcj0iLiI+CiAKLSAgPGRlc2NyaXB0aW9uPlRocmlmdCBUdXRvcmlhbDwvZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj5UaHJpZnQgSmF2YSBUdXRvcmlhbDwvZGVzY3JpcHRpb24+CiAKICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2dlbi1qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgotICA8cHJvcGVydHkgbmFtZT0iY3BhdGgiIGxvY2F0aW9uPSIvdXNyL2xvY2FsL2xpYi9saWJ0aHJpZnQuamFyIiAvPgorCisgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnRlc3QuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2RlcHMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CisgIDxwYXRoIGlkPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtnZW59IiAvPgorICA8L3BhdGg+CisgIDxwYXRoIGlkPSJ0dXRvcmlhbC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJidWlsZC5jbGFzc3BhdGgiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGR9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0dXRvcmlhbC5qYXIiIC8+CisgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aD0iJHtjcGF0aH0iIC8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRoPSIke2NwYXRofToke2dlbn0iIC8+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIiAvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXNjcmlwdGlvbj0iUnVuIHRoZSB0dXRvcmlhbCIgZGVwZW5kcz0iY29tcGlsZSI+CiAgICAgPGphciBqYXJmaWxlPSJ0dXRvcmlhbC5qYXIiIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CisgICAgPHBhcmFsbGVsPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdHV0b3JpYWwubG9nIj4KKyAgICAgIDwvamF2YT4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2ltcGxlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzaW1wbGUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvcGFyYWxsZWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzaW1wbGU6PC9lY2hvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSmF2YUNsaWVudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9InNpbXBsZSIvPgorICAgIDwvamF2YT4KKyAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIgorICAgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy90dXRvcmlhbC5sb2ciPgorICAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgogICAgIDxkZWxldGUgZmlsZT0idHV0b3JpYWwuamFyIiAvPgogICA8L3RhcmdldD4KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YSBiL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5NDRiMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0dXRvcmlhbC4qOworaW1wb3J0IHNoYXJlZC4qOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciBpbXBsZW1lbnRzIENhbGN1bGF0b3IuSWZhY2UgeworCisgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLFNoYXJlZFN0cnVjdD4gbG9nOworCisgIHB1YmxpYyBDYWxjdWxhdG9ySGFuZGxlcigpIHsKKyAgICBsb2cgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTaGFyZWRTdHJ1Y3Q+KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwaW5nKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGluZygpIik7CisgIH0KKworICBwdWJsaWMgaW50IGFkZChpbnQgbjEsIGludCBuMikgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkKCIgKyBuMSArICIsIiArIG4yICsgIikiKTsKKyAgICByZXR1cm4gbjEgKyBuMjsKKyAgfQorCisgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSB0aHJvd3MgSW52YWxpZE9wZXJhdGlvbiB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxjdWxhdGUoIiArIGxvZ2lkICsgIiwgeyIgKyB3b3JrLm9wICsgIiwiICsgd29yay5udW0xICsgIiwiICsgd29yay5udW0yICsgIn0pIik7CisgICAgaW50IHZhbCA9IDA7CisgICAgc3dpdGNoICh3b3JrLm9wKSB7CisgICAgY2FzZSBBREQ6CisgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVQlRSQUNUOgorICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNVUxUSVBMWToKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElWSURFOgorICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wLmdldFZhbHVlKCk7CisgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICB0aHJvdyBpbzsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKKyAgICAgIGlvLndoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7CisgICAgICB0aHJvdyBpbzsKKyAgICB9CisKKyAgICBTaGFyZWRTdHJ1Y3QgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgZW50cnkudmFsdWUgPSBJbnRlZ2VyLnRvU3RyaW5nKHZhbCk7CisgICAgbG9nLnB1dChsb2dpZCwgZW50cnkpOworCisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIHB1YmxpYyBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KGludCBrZXkpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFN0cnVjdCgiICsga2V5ICsgIikiKTsKKyAgICByZXR1cm4gbG9nLmdldChrZXkpOworICB9CisKKyAgcHVibGljIHZvaWQgemlwKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiemlwKCkiKTsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvc3JjL0phdmFDbGllbnQuamF2YSBiL3R1dG9yaWFsL2phdmEvc3JjL0phdmFDbGllbnQuamF2YQppbmRleCA1ZGM3MGVkLi4yZTM1ZDQxIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL3NyYy9KYXZhQ2xpZW50LmphdmEKKysrIGIvdHV0b3JpYWwvamF2YS9zcmMvSmF2YUNsaWVudC5qYXZhCkBAIC0yMiw2NCArMjIsODUgQEAKIGltcG9ydCBzaGFyZWQuKjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVyczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KIHB1YmxpYyBjbGFzcyBKYXZhQ2xpZW50IHsKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLSAgICB0cnkgewogCi0gICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKLSAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgIENhbGN1bGF0b3IuQ2xpZW50IGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7Ci0KLSAgICAgIHRyYW5zcG9ydC5vcGVuKCk7Ci0KLSAgICAgIGNsaWVudC5waW5nKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBpbmcoKSIpOwotCi0gICAgICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLDEpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIxKzE9IiArIHN1bSk7Ci0KLSAgICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7Ci0KLSAgICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFOwotICAgICAgd29yay5udW0xID0gMTsKLSAgICAgIHdvcmsubnVtMiA9IDA7Ci0gICAgICB0cnkgewotICAgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOwotICAgICAgfQotCi0gICAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOwotICAgICAgd29yay5udW0xID0gMTU7Ci0gICAgICB3b3JrLm51bTIgPSAxMDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIxNS0xMD0iICsgZGlmZik7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOwotICAgICAgfQotCi0gICAgICBTaGFyZWRTdHJ1Y3QgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2sgbG9nOiAiICsgbG9nLnZhbHVlKTsKLQotICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7Ci0KLSAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKLSAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGxlYXNlIGVudGVyICdzaW1wbGUnIG9yICdzZWN1cmUnIik7CisgICAgICBTeXN0ZW0uZXhpdCgwKTsKICAgICB9CiAKKyAgICB0cnkgeworICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICBpZiAoYXJnc1swXS5jb250YWlucygic2ltcGxlIikpIHsKKyAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIHNlcnZlciwgeW91IGNhbiB1c2UgdGhlIHBhcmFtZXRlcnMgdG8gc2V0dXAgY2xpZW50IHBhcmFtZXRlcnMgb3IKKyAgICAgICAgICogdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLiBPbiB0aGUgY2xpZW50IHNpZGUsIHlvdSB3aWxsIG5lZWQgYSBUcnVzdFN0b3JlIHdoaWNoCisgICAgICAgICAqIGNvbnRhaW5zIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlIGFsb25nIHdpdGggdGhlIHB1YmxpYyBrZXkuIAorICAgICAgICAgKiBGb3IgdGhpcyBleGFtcGxlIGl0J3MgYSBzZWxmLXNpZ25lZCBjZXJ0LiAKKyAgICAgICAgICovCisgICAgICAgIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZSgiLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSIsICJ0aHJpZnQiLCAiU3VuWDUwOSIsICJKS1MiKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IGEgY2xpZW50IHRyYW5zcG9ydCBpbnN0ZWFkIG9mIGEgc2VydmVyIHRyYW5zcG9ydC4gVGhlIGNvbm5lY3Rpb24gaXMgb3BlbmVkIG9uCisgICAgICAgICAqIGludm9jYXRpb24gb2YgdGhlIGZhY3RvcnkgbWV0aG9kLCBubyBuZWVkIHRvIHNwZWNpZmljYWxseSBjYWxsIG9wZW4oKQorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNwb3J0ID0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KCJsb2NhbGhvc3QiLCA5MDkxLCAwLCBwYXJhbXMpOworICAgICAgfQorCisgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgIFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKKworICAgICAgcGVyZm9ybShjbGllbnQpOworCisgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSAKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcGVyZm9ybShDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpIHRocm93cyBURXhjZXB0aW9uCisgIHsKKyAgICBjbGllbnQucGluZygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGluZygpIik7CisKKyAgICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLDEpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMSsxPSIgKyBzdW0pOworCisgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKworICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFOworICAgIHdvcmsubnVtMSA9IDE7CisgICAgd29yay5udW0yID0gMDsKKyAgICB0cnkgeworICAgICAgaW50IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8ud2h5KTsKKyAgICB9CisKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICAgIHdvcmsubnVtMSA9IDE1OworICAgIHdvcmsubnVtMiA9IDEwOworICAgIHRyeSB7CisgICAgICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjE1LTEwPSIgKyBkaWZmKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8ud2h5KTsKKyAgICB9CisKKyAgICBTaGFyZWRTdHJ1Y3QgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrIGxvZzogIiArIGxvZy52YWx1ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvc3JjL0phdmFTZXJ2ZXIuamF2YSBiL3R1dG9yaWFsL2phdmEvc3JjL0phdmFTZXJ2ZXIuamF2YQppbmRleCAxNDQ0MGViLi43ODg0NzNhIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL3NyYy9KYXZhU2VydmVyLmphdmEKKysrIGIvdHV0b3JpYWwvamF2YS9zcmMvSmF2YVNlcnZlci5qYXZhCkBAIC0xNywxMyArMTcsMTQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNpbXBsZVNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVyczsKIAogLy8gR2VuZXJhdGVkIGNvZGUKIGltcG9ydCB0dXRvcmlhbC4qOwpAQCAtMzMsODcgKzM0LDc3IEBACiAKIHB1YmxpYyBjbGFzcyBKYXZhU2VydmVyIHsKIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgQ2FsY3VsYXRvci5JZmFjZSB7CisgIHB1YmxpYyBzdGF0aWMgQ2FsY3VsYXRvckhhbmRsZXIgaGFuZGxlcjsKIAotICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLFNoYXJlZFN0cnVjdD4gbG9nOwotCi0gICAgcHVibGljIENhbGN1bGF0b3JIYW5kbGVyKCkgewotICAgICAgbG9nID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU2hhcmVkU3RydWN0PigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBpbmcoKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBpbmcoKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZCgiICsgbjEgKyAiLCIgKyBuMiArICIpIik7Ci0gICAgICByZXR1cm4gbjEgKyBuMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGNhbGN1bGF0ZShpbnQgbG9naWQsIFdvcmsgd29yaykgdGhyb3dzIEludmFsaWRPcGVyYXRpb24gewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxjdWxhdGUoIiArIGxvZ2lkICsgIiwgeyIgKyB3b3JrLm9wICsgIiwiICsgd29yay5udW0xICsgIiwiICsgd29yay5udW0yICsgIn0pIik7Ci0gICAgICBpbnQgdmFsID0gMDsKLSAgICAgIHN3aXRjaCAod29yay5vcCkgewotICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgotICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKLSAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7Ci0gICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgaW8ud2hhdCA9IHdvcmsub3A7Ci0gICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7Ci0gICAgICAgICAgdGhyb3cgaW87Ci0gICAgICAgIH0KLSAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICBpby53aGF0ID0gd29yay5vcDsKLSAgICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKLSAgICAgICAgdGhyb3cgaW87Ci0gICAgICB9Ci0KLSAgICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKLSAgICAgIGVudHJ5LmtleSA9IGxvZ2lkOwotICAgICAgZW50cnkudmFsdWUgPSBJbnRlZ2VyLnRvU3RyaW5nKHZhbCk7Ci0gICAgICBsb2cucHV0KGxvZ2lkLCBlbnRyeSk7Ci0KLSAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRTdHJ1Y3QoIiArIGtleSArICIpIik7Ci0gICAgICByZXR1cm4gbG9nLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHppcCgpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiemlwKCkiKTsKLSAgICB9Ci0KLSAgfQorICBwdWJsaWMgc3RhdGljIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvcjsKIAogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewogICAgIHRyeSB7Ci0gICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7Ci0gICAgICBDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcik7Ci0gICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOwotICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisgICAgICBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcik7CiAKLSAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCi0gICAgICAvLyBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOworICAgICAgUnVubmFibGUgc2ltcGxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgc2ltcGxlKHByb2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgIH07ICAgICAgCisgICAgICBSdW5uYWJsZSBzZWN1cmUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBzZWN1cmUocHJvY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgfTsKIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7Ci0gICAgICBzZXJ2ZXIuc2VydmUoKTsKLQorICAgICAgbmV3IFRocmVhZChzaW1wbGUpLnN0YXJ0KCk7CisgICAgICBuZXcgVGhyZWFkKHNlY3VyZSkuc3RhcnQoKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewogICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKICAgICB9Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lLiIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNpbXBsZShDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICB0cnkgeworICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAgIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIobmV3IEFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKSk7CisKKyAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgICAvLyBUU2VydmVyIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKKworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2ltcGxlIHNlcnZlci4uLiIpOworICAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNlY3VyZShDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICB0cnkgeworICAgICAgLyoKKyAgICAgICAqIFVzZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB0byBzZXR1cCB0aGUgcmVxdWlyZWQgU1NMIHBhcmFtZXRlcnMuIEluIHRoaXMgZXhhbXBsZQorICAgICAgICogd2UgYXJlIHNldHRpbmcgdGhlIGtleXN0b3JlIGFuZCB0aGUga2V5c3RvcmUgcGFzc3dvcmQuIE90aGVyIHRoaW5ncyBsaWtlIGFsZ29yaXRobXMsCisgICAgICAgKiBjaXBoZXIgc3VpdGVzLCBjbGllbnQgYXV0aCBldGMgY2FuIGJlIHNldC4gCisgICAgICAgKi8KKyAgICAgIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworICAgICAgLy8gVGhlIEtleXN0b3JlIGNvbnRhaW5zIHRoZSBwcml2YXRlIGtleQorICAgICAgcGFyYW1zLnNldEtleVN0b3JlKCIuLi8uLi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZSIsICJ0aHJpZnQiLCBudWxsLCBudWxsKTsKKworICAgICAgLyoKKyAgICAgICAqIFVzZSBhbnkgb2YgdGhlIFRTU0xUcmFuc3BvcnRGYWN0b3J5IHRvIGdldCBhIHNlcnZlciB0cmFuc3BvcnQgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAqIFNTTCBjb25maWd1cmF0aW9uLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBpZiBwcm9wZXJ0aWVzIGFyZSBzZXQgaW4gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAqIEV4OiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9LmtleXN0b3JlIGFuZCAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD10aHJpZnQKKyAgICAgICAqIAorICAgICAgICogTm90ZTogWW91IG5lZWQgbm90IGV4cGxpY2l0bHkgY2FsbCBvcGVuKCkuIFRoZSB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQgaXMgYm91bmQgb24gcmV0dXJuCisgICAgICAgKiBmcm9tIHRoZSBmYWN0b3J5IGNsYXNzLiAKKyAgICAgICAqLworICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoOTA5MSwgMCwgbnVsbCwgcGFyYW1zKTsKKyAgICAgIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIobmV3IEFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKSk7CisKKyAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpIHRocmVhZGVkIHNlcnZlcgorICAgICAgLy8gVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIobmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKSk7CisKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlIHNlY3VyZSBzZXJ2ZXIuLi4iKTsKKyAgICAgIHNlcnZlci5zZXJ2ZSgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmUwODg4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvanMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2V4cG9ydCBDTEFTU1BBVEgKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKworYWxsLWxvY2FsOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgY29tcGlsZQorCitjaGVjay1sb2NhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsc2VydmVyCisKK0VYVFJBX0RJU1QgPSBcCisJYnVpbGQueG1sIFwKKwlzcmMgXAorCXR1dG9yaWFsLmh0bWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2pzL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E2ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEphdmFTY3JpcHQgVHV0b3JpYWw8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhc3JjIiBsb2NhdGlvbj0iLi4vamF2YS9zcmMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSIuLi9qYXZhL2dlbi1qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIgLz4KKworICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vIiAvPgorICA8IS0tIEphdmFTY3JpcHQgdHV0b3JpYWwgZGVwZW5kcyBvbiB0aGUgamF2YSB0dXRvcmlhbCB0aHJpZnQgaGFuZGxlciBhbmQgc2VydmVyIGluZnJhc3RydWN0dXJlIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KKworICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CisgIDxwYXRoIGlkPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtnZW59IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkfSIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPHRzdGFtcCAvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICAgIDxleGNsdWRlIG5hbWU9IkphdmFDbGllbnQuamF2YSIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YVNlcnZlci5qYXZhIi8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJDYWxjdWxhdG9ySGFuZGxlci5qYXZhIi8+CisgICAgPC9qYXZhYz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmFsbCIvPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0idHV0b3JpYWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbCIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPGphciBqYXJmaWxlPSJ0dXRvcmlhbC1qcy5qYXIiIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJydW4gdGhlIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJ0dXRvcmlhbCwgZ2VuZXJhdGUiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSHR0cGQiIGZvcms9InRydWUiCisgICAgICBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLi4vLi4vIiAvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqcyAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9Imdlbi1qcyIvPgorICAgIDxkZWxldGUgZmlsZT0idHV0b3JpYWwtanMuamFyIiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvc3JjL0h0dHBkLmphdmEgYi90dXRvcmlhbC9qcy9zcmMvSHR0cGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg1NDcxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvanMvc3JjL0h0dHBkLmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKgorICovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTZXJ2ZXJDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5Db250ZW50UHJvZHVjZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5FbnRpdHlUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkZpbGVFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuRGVmYXVsdEh0dHBSZXNwb25zZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuRGVmYXVsdEh0dHBTZXJ2ZXJDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLk5vQ29ubmVjdGlvblJldXNlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5CYXNpY0h0dHBQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5Db3JlQ29ubmVjdGlvblBOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVQcm90b2NvbFBOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RIYW5kbGVyUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKKy8vIEdlbmVyYXRlZCBjb2RlCitpbXBvcnQgdHV0b3JpYWwuKjsKK2ltcG9ydCBzaGFyZWQuKjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEJhc2ljLCB5ZXQgZnVsbHkgZnVuY3Rpb25hbCBhbmQgc3BlYyBjb21wbGlhbnQsIEhUVFAvMS4xIGZpbGUgc2VydmVyLgorICogPHA+CisgKiBQbGVhc2Ugbm90ZSB0aGUgcHVycG9zZSBvZiB0aGlzIGFwcGxpY2F0aW9uIGlzIGRlbW9uc3RyYXRlIHRoZSB1c2FnZSBvZgorICogSHR0cENvcmUgQVBJcy4gSXQgaXMgTk9UIGludGVuZGVkIHRvIGRlbW9uc3RyYXRlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgb2YKKyAqIGJ1aWxkaW5nIGFuIEhUVFAgZmlsZSBzZXJ2ZXIuCisgKiAKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSHR0cGQgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGxlYXNlIHNwZWNpZnkgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFJlcXVlc3RMaXN0ZW5lclRocmVhZCg4MDg4LCBhcmdzWzBdKTsKKyAgICAgICAgdC5zZXREYWVtb24oZmFsc2UpOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEh0dHBGaWxlSGFuZGxlciBpbXBsZW1lbnRzIEh0dHBSZXF1ZXN0SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9jUm9vdDsKKworICAgICAgICBwdWJsaWMgSHR0cEZpbGVIYW5kbGVyKGZpbmFsIFN0cmluZyBkb2NSb290KSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5kb2NSb290ID0gZG9jUm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBIdHRwUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0TWV0aG9kKCkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICAgICAgaWYgKCFtZXRob2QuZXF1YWxzKCJHRVQiKSAmJiAhbWV0aG9kLmVxdWFscygiSEVBRCIpICYmICFtZXRob2QuZXF1YWxzKCJQT1NUIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKG1ldGhvZCArICIgbWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSByZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0VXJpKCk7CisKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QgJiYgdGFyZ2V0LmVxdWFscygiL3RocmlmdC9zZXJ2aWNlL3R1dG9yaWFsLyIpKSB7CisgICAgICAgICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSAoKEh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KSByZXF1ZXN0KS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBieXRlW10gZW50aXR5Q29udGVudCA9IEVudGl0eVV0aWxzLnRvQnl0ZUFycmF5KGVudGl0eSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbmNvbWluZyBjb250ZW50OiAiICsgbmV3IFN0cmluZyhlbnRpdHlDb250ZW50KSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IHRoaXMudGhyaWZ0UmVxdWVzdChlbnRpdHlDb250ZW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk91dGdvaW5nIGNvbnRlbnQ6ICIrb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFbnRpdHlUZW1wbGF0ZSBib2R5ID0gbmV3IEVudGl0eVRlbXBsYXRlKG5ldyBDb250ZW50UHJvZHVjZXIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0c3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0c3RyZWFtLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGJvZHkuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5kb2NSb290LCBVUkxEZWNvZGVyLmRlY29kZSh0YXJnZXQsICJVVEYtOCIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgICAgICAgICAgRW50aXR5VGVtcGxhdGUgYm9keSA9IG5ldyBFbnRpdHlUZW1wbGF0ZShuZXcgQ29udGVudFByb2R1Y2VyKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0c3RyZWFtLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxodG1sPjxib2R5PjxoMT4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIkZpbGUgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvaDE+PC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBmaWxlLmdldFBhdGgoKSArICIgbm90IGZvdW5kIik7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWxlLmNhblJlYWQoKSB8fCBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgICAgICAgICAgRW50aXR5VGVtcGxhdGUgYm9keSA9IG5ldyBFbnRpdHlUZW1wbGF0ZShuZXcgQ29udGVudFByb2R1Y2VyKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0c3RyZWFtLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxodG1sPjxib2R5PjxoMT4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIkFjY2VzcyBkZW5pZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvaDE+PC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgcmVhZCBmaWxlICIgKyBmaWxlLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19PSyk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRpdHkgYm9keSA9IG5ldyBGaWxlRW50aXR5KGZpbGUsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5KGJvZHkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZpbmcgZmlsZSAiICsgZmlsZS5nZXRQYXRoKCkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyB0aHJpZnRSZXF1ZXN0KGJ5dGVbXSBpbnB1dCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL0lucHV0CisgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciBpbmJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKGlucHV0Lmxlbmd0aCk7ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbmJ1ZmZlci53cml0ZShpbnB1dCk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgIGlucHJvdG9jb2wgICA9IG5ldyBUSlNPTlByb3RvY29sKGluYnVmZmVyKTsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9PdXRwdXQKKyAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyIG91dGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMCk7ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHJvdG9jb2wgICA9IG5ldyBUSlNPTlByb3RvY29sKG91dGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpOyAgICAgIAorICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHJvdG9jb2wsIG91dHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbb3V0YnVmZmVyLmxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBvdXRidWZmZXIucmVhZEFsbChvdXRwdXQsIDAsIG91dHB1dC5sZW5ndGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcob3V0cHV0LCJVVEYtOCIpOworICAgICAgICAgICAgfWNhdGNoKFRocm93YWJsZSB0KXsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVycm9yOiIrdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUmVxdWVzdExpc3RlbmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXJzb2NrZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZpY2UgaHR0cFNlcnZpY2U7CisKKyAgICAgICAgcHVibGljIFJlcXVlc3RMaXN0ZW5lclRocmVhZChpbnQgcG9ydCwgZmluYWwgU3RyaW5nIGRvY3Jvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnNlcnZlcnNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7CisgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKKyAgICAgICAgICAgIHRoaXMucGFyYW1zLnNldEludFBhcmFtZXRlcihDb3JlQ29ubmVjdGlvblBOYW1lcy5TT19USU1FT1VULCAxMDAwKS5zZXRJbnRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuU09DS0VUX0JVRkZFUl9TSVpFLCA4ICogMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEJvb2xlYW5QYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuU1RBTEVfQ09OTkVDVElPTl9DSEVDSywgZmFsc2UpLnNldEJvb2xlYW5QYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuVENQX05PREVMQVksIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXIoQ29yZVByb3RvY29sUE5hbWVzLk9SSUdJTl9TRVJWRVIsICJIdHRwQ29tcG9uZW50cy8xLjEiKTsKKworICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBIVFRQIHByb3RvY29sIHByb2Nlc3NvcgorICAgICAgICAgICAgSHR0cFByb2Nlc3NvciBodHRwcHJvYyA9IG5ldyBCYXNpY0h0dHBQcm9jZXNzb3IoKTsKKworICAgICAgICAgICAgLy8gU2V0IHVwIHJlcXVlc3QgaGFuZGxlcnMKKyAgICAgICAgICAgIEh0dHBSZXF1ZXN0SGFuZGxlclJlZ2lzdHJ5IHJlcWlzdHJ5ID0gbmV3IEh0dHBSZXF1ZXN0SGFuZGxlclJlZ2lzdHJ5KCk7CisgICAgICAgICAgICByZXFpc3RyeS5yZWdpc3RlcigiKiIsIG5ldyBIdHRwRmlsZUhhbmRsZXIoZG9jcm9vdCkpOworCisgICAgICAgICAgICAvLyBTZXQgdXAgdGhlIEhUVFAgc2VydmljZQorICAgICAgICAgICAgdGhpcy5odHRwU2VydmljZSA9IG5ldyBIdHRwU2VydmljZShodHRwcHJvYywgbmV3IE5vQ29ubmVjdGlvblJldXNlU3RyYXRlZ3koKSwgbmV3IERlZmF1bHRIdHRwUmVzcG9uc2VGYWN0b3J5KCkpOworICAgICAgICAgICAgdGhpcy5odHRwU2VydmljZS5zZXRQYXJhbXModGhpcy5wYXJhbXMpOworICAgICAgICAgICAgdGhpcy5odHRwU2VydmljZS5zZXRIYW5kbGVyUmVzb2x2ZXIocmVxaXN0cnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaXN0ZW5pbmcgb24gcG9ydCAiICsgdGhpcy5zZXJ2ZXJzb2NrZXQuZ2V0TG9jYWxQb3J0KCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL2xvY2FsaG9zdDo4MDg4L3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBIVFRQIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IHRoaXMuc2VydmVyc29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0SHR0cFNlcnZlckNvbm5lY3Rpb24gY29ubiA9IG5ldyBEZWZhdWx0SHR0cFNlcnZlckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbmNvbWluZyBjb25uZWN0aW9uIGZyb20gIiArIHNvY2tldC5nZXRJbmV0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5iaW5kKHNvY2tldCwgdGhpcy5wYXJhbXMpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHdvcmtlciB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgV29ya2VyVGhyZWFkKHRoaXMuaHR0cFNlcnZpY2UsIGNvbm4pOworICAgICAgICAgICAgICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkkvTyBlcnJvciBpbml0aWFsaXNpbmcgY29ubmVjdGlvbiB0aHJlYWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBXb3JrZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZpY2UgaHR0cHNlcnZpY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZlckNvbm5lY3Rpb24gY29ubjsKKworICAgICAgICBwdWJsaWMgV29ya2VyVGhyZWFkKGZpbmFsIEh0dHBTZXJ2aWNlIGh0dHBzZXJ2aWNlLCBmaW5hbCBIdHRwU2VydmVyQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5odHRwc2VydmljZSA9IGh0dHBzZXJ2aWNlOworICAgICAgICAgICAgdGhpcy5jb25uID0gY29ubjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IGNvbm5lY3Rpb24gdGhyZWFkIik7CisgICAgICAgICAgICBIdHRwQ29udGV4dCBjb250ZXh0ID0gbmV3IEJhc2ljSHR0cENvbnRleHQobnVsbCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICghVGhyZWFkLmludGVycnVwdGVkKCkgJiYgdGhpcy5jb25uLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaHR0cHNlcnZpY2UuaGFuZGxlUmVxdWVzdCh0aGlzLmNvbm4sIGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWVudCBjbG9zZWQgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkkvTyBlcnJvcjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbnJlY292ZXJhYmxlIEhUVFAgcHJvdG9jb2wgdmlvbGF0aW9uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uLnNodXRkb3duKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwMjBiZWQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCkBAIC0wLDAgKzEsMTA5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzIC0gVHV0b3JpYWwgRXhhbXBsZTwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9qcy9zcmMvdGhyaWZ0LmpzIiAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy90dXRvcmlhbF90eXBlcy5qcyIgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9zaGFyZWRfdHlwZXMuanMiICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9TaGFyZWRTZXJ2aWNlLmpzIiAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9DYWxjdWxhdG9yLmpzIiAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKworICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNC4yL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgorCisKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKyAgLy88IVtDREFUQVsKKyAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKKyAgICAvLyByZW1vdmUgcHNldWRvIGNoaWxkIHJlcXVpcmVkIGZvciB2YWxpZCB4aHRtbCBzdHJpY3QKKyAgICAkKCIjb3AiKS5jaGlsZHJlbigpLnJlbW92ZSgpOworICAgIC8vIGFkZCBvcGVyYXRpb25zIHRvIGl0J3MgZHJvcGRvd24gbWVudQorICAgICQuZWFjaChPcGVyYXRpb24sIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICAgICQoJyNvcCcpLmFwcGVuZCgkKCI8b3B0aW9uPjwvb3B0aW9uPiIpLmF0dHIoInZhbHVlIix2YWx1ZSkudGV4dChrZXkpKTsgCisgICAgfSk7CisgICAgCisgICAgICQoJ3RhYmxlLmNhbGN1bGF0b3InKS5hdHRyKCd3aWR0aCcsIDUwMCk7CisgIH0pOworCisgIGZ1bmN0aW9uIGNhbGMoKSB7CisgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvdGhyaWZ0L3NlcnZpY2UvdHV0b3JpYWwvIik7CisgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB2YXIgY2xpZW50ICAgID0gbmV3IENhbGN1bGF0b3JDbGllbnQocHJvdG9jb2wpOworCisgICAgdmFyIHdvcmsgPSBuZXcgV29yaygpOworICAgIHdvcmsubnVtMSA9ICQoIiNudW0xIikudmFsKCk7CisgICAgd29yay5udW0yID0gJCgiI251bTIiKS52YWwoKTsKKyAgICB3b3JrLm9wID0gJCgiI29wIikudmFsKCk7CisgICAgCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICAkKCcjcmVzdWx0JykudmFsKHJlc3VsdCk7CisgICAgICAkKCcjcmVzdWx0JykuY3NzKCdjb2xvcicsICdibGFjaycpOworICAgIH0gY2F0Y2gob3VjaCl7CisgICAgICAkKCcjcmVzdWx0JykudmFsKG91Y2gud2h5KTsKKyAgICAgICQoJyNyZXN1bHQnKS5jc3MoJ2NvbG9yJywgJ3JlZCcpOworICAgIH0KKyAgfQorICAKKyAgZnVuY3Rpb24gYXV0b19jYWxjKCkgeworICAgIGlmICgkKCcjYXV0b3VwZGF0ZTpjaGVja2VkJykudmFsKCkgIT09IHVuZGVmaW5lZCkgeworICAgICAgY2FsYygpOworICAgIH0KKyAgfQorICAvL11dPgorICA8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgIDxoMj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczwvaDI+CisgIDxmb3JtIGFjdGlvbj0iIj4KKyAgPHRhYmxlIGNsYXNzPSJjYWxjdWxhdG9yIj4KKyAgICA8dHI+CisgICAgICA8dGQ+bnVtMTwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJudW0xIiB2YWx1ZT0iMjAiIG9ua2V5dXA9ImphdmFzY3JpcHQ6YXV0b19jYWxjKCk7Ii8+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5PcGVyYXRpb248L3RkPgorICAgICAgPHRkPjxzZWxlY3QgaWQ9Im9wIiBzaXplPSIxIiBvbmNoYW5nZT0iamF2YXNjcmlwdDphdXRvX2NhbGMoKTsiPjxvcHRpb24+PC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5udW0yPC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im51bTIiIHZhbHVlPSI1IiBvbmtleXVwPSJqYXZhc2NyaXB0OmF1dG9fY2FsYygpOyIvPjwvdGQ+PC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+cmVzdWx0PC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InJlc3VsdCIgdmFsdWU9IiIvPjwvdGQ+PC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iYXV0b3VwZGF0ZSIgY2hlY2tlZD0iY2hlY2tlZCIvPmF1dG91cGRhdGU8L3RkPgorICAgICAgPHRkPjxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJjYWxjdWxhdGUiIHZhbHVlPSJjYWxjdWxhdGUiIG9uY2xpY2s9ImphdmFzY3JpcHQ6Y2FsYygpOyIvPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgPC9mb3JtPgorICAKKyAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ij50dXRvcmlhbC50aHJpZnQ8L2E+IGFuZCBhIFRocmlmdCBzZXJ2ZXIgdXNpbmcgSlNPTiBwcm90b2NvbCBhbmQgSFRUUCB0cmFuc3BvcnQuCisgIDwvcD4KKyAgICA8cD4KKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICAgIDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM4YmIyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyEqKi8qLnBmeApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTI3MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMTkgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVkOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDM1NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OwordXNpbmcgdHV0b3JpYWw7Cit1c2luZyBzaGFyZWQ7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoKS5BZGREZWJ1ZygpLkNyZWF0ZUxvZ2dlcihuYW1lb2YoQ2xpZW50KSk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEaXNwbGF5SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbihAIgorVXNhZ2U6IAorICAgIENsaWVudC5leGUgLWhlbHAKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIENsaWVudC5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IC1tYzo8bnVtQ2xpZW50cz4KKyAgICAgICAgd2lsbCBydW4gY2xpZW50IHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpIGFuZCB3aXRoIDEgY2xpZW50CisKK09wdGlvbnM6CisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgdGNwIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChhZGRyZXNzIC0gIiJodHRwOi8vbG9jYWxob3N0OjkwOTAiIikgICAgICAgIAorICAgICAgICB0Y3B0bHMgLSB0Y3AgdGxzIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgbXVsdGlwbGV4ZWQgLSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKworICAgIC1tYyAobXVsdGlwbGUgY2xpZW50cyk6CisgICAgICAgIDxudW1DbGllbnRzPiAtIG51bWJlciBvZiBtdWx0aXBsZSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gc2VydmVyIChtYXggMTAwLCBkZWZhdWx0IDEpCisKK1NhbXBsZToKKyAgICBDbGllbnQuZXhlIC10cjp0Y3AgLXA6YmluYXJ5CisiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzID8/IG5ldyBzdHJpbmdbMF07CisKKyAgICAgICAgICAgIGlmIChhcmdzLkFueSh4ID0+IHguU3RhcnRzV2l0aCgiLWhlbHAiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlzcGxheUhlbHAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU3RhcnRpbmcgY2xpZW50Li4uIik7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc291cmNlID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUnVuQXN5bmMoYXJncywgc291cmNlLlRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkFzeW5jKHN0cmluZ1tdIGFyZ3MsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbnVtQ2xpZW50cyA9IEdldE51bWJlck9mQ2xpZW50cyhhcmdzKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydHMgPSBuZXcgVENsaWVudFRyYW5zcG9ydFtudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0ID0gR2V0VHJhbnNwb3J0KGFyZ3MpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydHNbaV0gPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgdHJhbnNwb3J0OiB7dHJhbnNwb3J0c1swXX0iKTsKKworICAgICAgICAgICAgdmFyIHByb3RvY29scyA9IG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPltudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwID0gR2V0UHJvdG9jb2woYXJncywgdHJhbnNwb3J0c1tpXSk7CisgICAgICAgICAgICAgICAgcHJvdG9jb2xzW2ldID0gcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgY2xpZW50IHByb3RvY29sOiB7cHJvdG9jb2xzWzBdLkl0ZW0xfSIpOworCisgICAgICAgICAgICB2YXIgdGFza3MgPSBuZXcgVGFza1tudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0YXNrID0gUnVuQ2xpZW50QXN5bmMocHJvdG9jb2xzW2ldLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgdGFza3NbaV0gPSB0YXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYXNrLldhaXRBbGwodGFza3MpOworCisgICAgICAgICAgICBhd2FpdCBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXRyIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgVHJhbnNwb3J0IHNlbGVjdGVkVHJhbnNwb3J0OworICAgICAgICAgICAgaWYgKEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgc2VsZWN0ZWRUcmFuc3BvcnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3A6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuTmFtZWRQaXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KCIudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5IdHRwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0OjkwOTAiKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcEJ1ZmZlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcFRsczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTAsIEdldENlcnRpZmljYXRlKCksIENlcnRWYWxpZGF0b3IsIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldE51bWJlck9mQ2xpZW50cyhzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbnVtQ2xpZW50cyA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1tYyIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkICMgb2YgY2xpZW50czoge251bUNsaWVudHN9Iik7CisKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgaWYoIGludC5UcnlQYXJzZShudW1DbGllbnRzLCBvdXQgYykgJiYgKDAgPCBjKSAmJiAoYyA8PSAxMDApKQorCQkJCXJldHVybiBjOworCQkJZWxzZQorCQkJCXJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDZXJ0aWZpY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGR1ZSB0byBmaWxlcyBsb2NhdGlvbiBpbiBuZXQgY29yZSBiZXR0ZXIgdG8gdGFrZSBjZXJ0cyBmcm9tIHRvcCBmb2xkZXIKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9IEdldENlcnRQYXRoKERpcmVjdG9yeS5HZXRQYXJlbnQoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRGaWxlLCAiVGhyaWZ0VGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldENlcnRQYXRoKERpcmVjdG9yeUluZm8gZGksIGludCBtYXhDb3VudCA9IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3BEaXIgPSBkaTsKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9CisgICAgICAgICAgICAgICAgdG9wRGlyLkVudW1lcmF0ZUZpbGVzKCJUaHJpZnRUZXN0LnBmeCIsIFNlYXJjaE9wdGlvbi5BbGxEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoY2VydEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4Q291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSBpbiBkaXJlY3RvcmllcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0UGF0aChkaS5QYXJlbnQsIG1heENvdW50IC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjZXJ0RmlsZS5GdWxsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sob2JqZWN0IHNlbmRlciwKKyAgICAgICAgICAgIHN0cmluZyB0YXJnZXRIb3N0LCBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGxvY2FsQ2VydGlmaWNhdGVzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJlbW90ZUNlcnRpZmljYXRlLCBzdHJpbmdbXSBhY2NlcHRhYmxlSXNzdWVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENlcnRpZmljYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENlcnRWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsUG9saWN5RXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+IEdldFByb3RvY29sKHN0cmluZ1tdIGFyZ3MsIFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItcHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBQcm90b2NvbCBzZWxlY3RlZFByb3RvY29sOworICAgICAgICAgICAgaWYgKEVudW0uVHJ5UGFyc2UocHJvdG9jb2wsIHRydWUsIG91dCBzZWxlY3RlZFByb3RvY29sKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGVkUHJvdG9jb2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Db21wYWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Kc29uOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5NdWx0aXBsZXhlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHJldHVybnMgQmluYXJ5UHJvdG9jb2wgdG8gYXZvaWQgbWFraW5nIHdyYXBwZWQgcHJvdG9jb2wgYXMgcHVibGljIGluIFRQcm90b2NvbERlY29yYXRvciAoaW4gUnVuQ2xpZW50QXN5bmMgaXQgd2lsbCBiZSB3cmFwcGVkIGludG8gTXVsdGlwbGV4ZWQgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkNsaWVudEFzeW5jKFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+IHByb3RvY29sVHVwbGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSBwcm90b2NvbFR1cGxlLkl0ZW0yOworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbFR5cGUgPSBwcm90b2NvbFR1cGxlLkl0ZW0xOworCisgICAgICAgICAgICAgICAgVEJhc2VDbGllbnQgY2xpZW50ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sVHlwZSAhPSBQcm90b2NvbC5NdWx0aXBsZXhlZCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoQ2FsY3VsYXRvci5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHVzZXMgYmluYXJ5IHByb3RvY29sIHRoZXJlICB0byBjcmVhdGUgTXVsdGlwbGV4ZWQgcHJvdG9jb2xzCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCBuYW1lb2YoQ2FsY3VsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG11bHRpcGxleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihTaGFyZWRTZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgU2hhcmVkU2VydmljZS5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKFNoYXJlZFNlcnZpY2UuQ2xpZW50KWNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcigkIntjbGllbnQ/LkNsaWVudElkfSAiICsgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5UcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBQaW5nQXN5bmMoKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnBpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEFkZEFzeW5jKDEsMSkiKTsKKyAgICAgICAgICAgIHZhciBzdW0gPSBhd2FpdCBjbGllbnQuYWRkQXN5bmMoMSwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKT17c3VtfSIpOworCisgICAgICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3AgPSBPcGVyYXRpb24uRElWSURFLAorICAgICAgICAgICAgICAgIE51bTEgPSAxLAorICAgICAgICAgICAgICAgIE51bTIgPSAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5jYWxjdWxhdGVBc3luYygxLCB3b3JrLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICAgICAgICAgICAgd29yay5OdW0xID0gMTU7CisgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQ2FsY3VsYXRlQXN5bmMoMSkiKTsKKyAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGF3YWl0IGNsaWVudC5jYWxjdWxhdGVBc3luYygxLCB3b3JrLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gMTUtMTA9e2RpZmZ9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gR2V0U3RydWN0QXN5bmMoMSkiKTsKKyAgICAgICAgICAgIHZhciBsb2cgPSBhd2FpdCBjbGllbnQuZ2V0U3RydWN0QXN5bmMoMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQ2hlY2sgbG9nOiB7bG9nLlZhbHVlfSIpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBaaXBBc3luYygpIHdpdGggZGVsYXkgMTAwbWMgb24gc2VydmVyIHNpZGUiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC56aXBBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBFeGVjdXRlU2hhcmVkU2VydmljZUNsaWVudE9wZXJhdGlvbnMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4sIFNoYXJlZFNlcnZpY2UuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgY2xpZW50Lk9wZW5UcmFuc3BvcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIC8vIEFzeW5jIHZlcnNpb24KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gU2hhcmVkU2VydmljZSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIFZhbHVlOiB7bG9nLlZhbHVlfSIpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGVudW0gVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcCwKKyAgICAgICAgICAgIE5hbWVkUGlwZSwKKyAgICAgICAgICAgIEh0dHAsCisgICAgICAgICAgICBUY3BCdWZmZXJlZCwKKyAgICAgICAgICAgIEZyYW1lZCwKKyAgICAgICAgICAgIFRjcFRscworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpbmFyeSwKKyAgICAgICAgICAgIENvbXBhY3QsCisgICAgICAgICAgICBKc29uLAorICAgICAgICAgICAgTXVsdGlwbGV4ZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4MzgyZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImRlNzhhMDFiLWY3YzYtNDlkMS05N2RhLTY2OWQyZWQzNzY0MSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiNjBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsOCBAQAoreworICAicHJvZmlsZXMiOiB7CisgICAgIkNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kTmFtZSI6ICJQcm9qZWN0IiwKKyAgICAgICJjb21tYW5kTGluZUFyZ3MiOiAiLXA6bXVsdGlwbGV4ZWQiCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvVGhyaWZ0VGVzdC5wZnggYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvVGhyaWZ0VGVzdC5wZngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzLy5naXRpZ25vcmUgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc0NDZlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL3NoYXJlZAorL3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5N2EwNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpAQCAtMCwwICsxLDMwIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5JbnRlcmZhY2VzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5JbnRlcmZhY2VzPC9QYWNrYWdlSWQ+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uLy4uL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9Ii4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyNmIxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCI0ZDEzMTYzZC05MDY3LTRjOWMtOGFmMC02NGUwODQ1MTM5N2QiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIEludGVyZmFjZXMuZGxsCisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIENsaWVudC9vYmoKKwkkKFJNKSAtciBTZXJ2ZXIvYmluCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIEludGVyZmFjZXMvYmluCisJJChSTSkgLXIgSW50ZXJmYWNlcy9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlDbGllbnQgXAorCUludGVyZmFjZXMgXAorCVJFQURNRS5tZCBcCisJU2VydmVyIFwKKwlUdXRvcmlhbC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2gKKwkJCSAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kIGIvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2ZWY5MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjc4IEBACisjIEJ1aWxkaW5nIG9mIHNhbXBsZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIE5FVCBDb3JlIFN0YW5kYXJkIDIuMAorLSBORVQgQ29yZSBBcHAgMi4wCisKKyMgSG93IHRvIGJ1aWxkCistIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBsYXRlc3QgLk5FVCBDb3JlIFNESyBmb3IgeW91ciBwbGF0Zm9ybSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9jb3JlI3dpbmRvd3N2czIwMTUgKGFyY2hpdmUgZm9yIFNESyAxLjAuMC1wcmV2aWV3Mi0wMDMxMjEgbG9jYXRlZCBieTogaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlL2Jsb2IvbWFzdGVyL3JlbGVhc2Utbm90ZXMvZG93bmxvYWQtYXJjaGl2ZS5tZCkKKy0gRW5zdXJlIHRoYXQgeW91IGhhdmUgdGhyaWZ0LmV4ZSB3aGljaCBzdXBwb3J0cyBuZXRjb3JlIGxpYiBhbmQgaXQgYWRkZWQgdG8gUEFUSCAKKy0gR28gdG8gY3VycmVudCBmb2xkZXIgCistIFJ1biAqKmJ1aWxkLnNoKiogb3IgKipidWlsZC5jbWQqKiBmcm9tIHRoZSByb290IG9mIGNsb25lZCByZXBvc2l0b3J5CistIENoZWNrIHRlc3RzIGluICoqc3JjL1Rlc3RzKiogZm9sZGVyCistIENvbnRpbnVlIHdpdGggL3R1dG9yaWFscy9uZXRjb3JlIAorCisjIEhvdyB0byBydW4gCisKK05vdGVzOiBkb3RuZXQgcnVuIHN1cHBvcnRzIHBhc3NpbmcgYXJndW1lbnRzIHRvIGFwcCBhZnRlciAtLSBzeW1ib2xzIChodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvYXJ0aWNsZXMvY29yZS90b29scy9kb3RuZXQtcnVuKSAtIGV4YW1wbGU6ICoqZG90bmV0IHJ1biAtLSAtaCoqIHdpbGwgc2hvdyBoZWxwIGZvciBhcHAKKworLSBidWlsZCAKKy0gZ28gdG8gZm9sZGVyIChDbGllbnQvU2VydmVyKSAKKy0gcnVuIHdpdGggc3BlY2lmeWluZyBvZiBjb3JyZWN0IHBhcmFtZXRlcnMgKipkb3RuZXQgcnVuIC10cjp0Y3AgLXByOm11bHRpcGxleGVkKiosICoqZG90bmV0IHJ1biAtaGVscCoqIChsYXRlciwgYWZ0ZXIgbWlncmF0aW9uIHRvIGNzcHJvaiBhbmQgbGF0ZXN0IFNESyB3aWxsIGJlIHBvc3NpYmlsaXR5IHRvIHVzZSBtb3JlIHVzYWJsZSBmb3JtICoqZG90bmV0IHJ1biAtLSBhcmd1bWVudHMqKikKKworI05vdGVzCistIFBvc3NpYmxlIGFkZGluZyBhZGRpdGlvbmFsIHBsYXRmb3JtcyBhZnRlciBzdGFiaWxpemF0aW9uIG9mIC5ORVQgQ29yZSAocnVudGltZXMsIHBsYXRmb3JtcyAoUmVkIEhhdCBMaW51eCwgT3BlblN1c2UsIGV0Yy4pIAorCisjS25vd24gaXNzdWVzCistIEluIHRyYWNlIGxvZ2dpbmcgbW9kZSB5b3UgY2FuIHNlZSBzb21lIG5vdCBpbXBvcnRhbnQgaW50ZXJuYWwgZXhjZXB0aW9ucworCisjIFJ1bm5pbmcgb2Ygc2FtcGxlcyAKK1BsZWFzZSBpbnN0YWxsIFRocmlmdCBDIyAuTkVUIENvcmUgbGlicmFyeSBvciBjb3B5IHNvdXJjZXMgYW5kIGJ1aWxkIHRoZW0gdG8gY29ycmVjbHkgYnVpbGQgYW5kIHJ1biBzYW1wbGVzIAorCisjIE5ldENvcmUgU2VydmVyCisKK1VzYWdlOiAKKworICAgIFNlcnZlci5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIFNlcnZlci5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IAorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKworICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIHRjcCBidWZmZXJlZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGh0dHAgYWRkcmVzcyAtICIibG9jYWxob3N0OjkwOTAiIikKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRyYW5zcG9ydCB3aXRoIHRscyB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKwkJCitTYW1wbGU6CisKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AKKworKipSZW1hcmtzKio6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3Rvcnkgd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisKKworIyBOZXRDb3JlIENsaWVudAorCitVc2FnZTogCisKKyAgICBDbGllbnQuZXhlIC1oCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBDbGllbnQuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAtbWM6PG51bUNsaWVudHM+CisgICAgICAgIHdpbGwgcnVuIGNsaWVudCB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgdGNwIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChhZGRyZXNzIC0gIiJodHRwOi8vbG9jYWxob3N0OjkwOTAiIikgICAgICAgIAorICAgICAgICB0Y3B0bHMgLSB0Y3AgdGxzIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorCisgICAgQ2xpZW50LmV4ZSAtdHI6dGNwIC1wcjpiaW5hcnkgLW1jOjEwCisKK1JlbWFya3M6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3RvcnkgCisJd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisjIEhvdyB0byB0ZXN0IGNvbW11bmljYXRpb24gYmV0d2VlbiBOZXRDb3JlIGFuZCBQeXRob24KKworKiBHZW5lcmF0ZSBjb2RlIHdpdGggdGhlIGxhdGVzdCAqKnRocmlmdC5leGUqKiB1dGlsCisqIEVuc3VyZSB0aGF0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwgZ2VuZXJhdGVkIGZvbGRlciAqKmdlbi1weSoqIHdpdGggZ2VuZXJhdGVkIGNvZGUgZm9yIFB5dGhvbgorKiBDcmVhdGUgKipjbGllbnQucHkqKiBhbmQgKipzZXJ2ZXIucHkqKiBmcm9tIHRoZSBjb2RlIGV4YW1wbGVzIGJlbG93IGFuZCBzYXZlIHRoZW0gdG8gdGhlIGZvbGRlciB3aXRoIHByZXZpb3NseSBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5KioKKyogUnVuIG5ldGNvcmUgc2FtcGxlcyAoY2xpZW50IGFuZCBzZXJ2ZXIpIGFuZCBweXRob24gc2FtcGxlcyAoY2xpZW50IGFuZCBzZXJ2ZXIpCisKK1JlbWFya3M6CisKK1NhbXBsZXMgb2YgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZSBiZWxvdyB1c2UgY29ycmVjdCBtZXRob2RzIChvcGVyYXRpb25zKSAKK2FuZCBmaWVsZHMgKHByb3BlcnRpZXMpIGFjY29yZGluZyB0byBnZW5lcmF0ZWQgY29udHJhY3RzIGZyb20gKi50aHJpZnQgZmlsZXMKKworQXQgV2luZG93cyAxMCBhZGQgcmVjb3JkICoqMTI3LjAuMC4xIHRlc3RzZXJ2ZXIqKiB0byAqKkM6XFdpbmRvd3NcU3lzdGVtMzJcZHJpdmVyc1xldGNcaG9zdHMqKiBmaWxlCitmb3IgY29ycmVjdCB3b3JrIG9mIHB5dGhvbiBzZXJ2ZXIKKworCisqKlB5dGhvbiBDbGllbnQ6KioKKwkKK2BgYHB5dGhvbgoraW1wb3J0IHN5cworaW1wb3J0IGdsb2IKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29yaworCitmcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCisKK2RlZiBtYWluKCk6CisgICAgIyBNYWtlIHNvY2tldAorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnMTI3LjAuMC4xJywgOTA5MCkKKworICAgICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93CisgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQorCisgICAgIyBXcmFwIGluIGEgcHJvdG9jb2wKKyAgICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisKKyAgICAjIENvbm5lY3QhCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCisgICAgY2xpZW50LlBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQorCisgICAgc3VtID0gY2xpZW50LkFkZCgxLCAxKQorICAgIHByaW50KCgnMSsxPSVkJyAlIChzdW0pKSkKKworICAgIHdvcmsgPSBXb3JrKCkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uRGl2aWRlCisgICAgd29yay5OdW0xID0gMQorICAgIHdvcmsuTnVtMiA9IDAKKworICAgIHRyeToKKyAgICAgICAgcXVvdGllbnQgPSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JykKKyAgICAgICAgcHJpbnQoJ0ZZSSB0aGUgYW5zd2VyIGlzICVkJyAlIHF1b3RpZW50KQorICAgIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uIGFzIGU6CisgICAgICAgIHByaW50KCgnSW52YWxpZE9wZXJhdGlvbjogJXInICUgZSkpCisKKyAgICB3b3JrLk9wID0gT3BlcmF0aW9uLlN1YnN0cmFjdAorICAgIHdvcmsuTnVtMSA9IDE1CisgICAgd29yay5OdW0yID0gMTAKKworICAgIGRpZmYgPSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoKCcxNS0xMD0lZCcgJSAoZGlmZikpKQorCisgICAgbG9nID0gY2xpZW50LkdldFN0cnVjdCgxKQorICAgIHByaW50KCgnQ2hlY2sgbG9nOiAlcycgJSAobG9nLlZhbHVlKSkpCisKKyAgICBjbGllbnQuWmlwKCkKKyAgICBwcmludCgnemlwKCknKQorCisgICAgIyBDbG9zZSEKKyAgICB0cmFuc3BvcnQuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB0cnk6CisgICAgbWFpbigpCisgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICBwcmludCgnJXMnICUgdHgubWVzc2FnZSkKK2BgYAorCisKKyoqUHl0aG9uIFNlcnZlcjoqKgorCisKK2BgYHB5dGhvbgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CisKKyAgICBkZWYgUGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBkZWYgQWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgorCisgICAgZGVmIENhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQorCisgICAgICAgIGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLkFkZDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSArIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLlN1YnN0cmFjdDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAtIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLk11bHRpcGx5OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICogd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uRGl2aWRlOgorICAgICAgICAgICAgaWYgd29yay5OdW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHguV2hhdE9wID0gd29yay5PcAorICAgICAgICAgICAgICAgIHguV2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHguV2hhdE9wID0gd29yay5PcAorICAgICAgICAgICAgeC5XaHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLktleSA9IGxvZ2lkCisgICAgICAgIGxvZy5WYWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKworICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgR2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorCisgICAgZGVmIFppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3Q9InRlc3RzZXJ2ZXIiLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorCisgICAgc2VydmVyID0gVFNlcnZlci5UU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgcHJpbnQoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKQorICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgcHJpbnQoJ2RvbmUuJykKKworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2BgYApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExODFiYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw0MjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5CdWlsZGVyOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuSG9zdGluZzsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkNvbmZpZ3VyYXRpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5EZXBlbmRlbmN5SW5qZWN0aW9uOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZShMb2dMZXZlbC5UcmFjZSkuQWRkRGVidWcoTG9nTGV2ZWwuVHJhY2UpLkNyZWF0ZUxvZ2dlcihuYW1lb2YoU2VydmVyKSk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUHJlc3MgYW55IGtleSB0byBzdG9wLi4uIik7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgc291cmNlLkNhbmNlbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlNlcnZlciBzdG9wcGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgU2VydmVyLmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4KKyAgICAgICAgd2lsbCBydW4gc2VydmVyIHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCitTYW1wbGU6CisgICAgU2VydmVyLmV4ZSAtdHI6dGNwIAorIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkFzeW5jKHN0cmluZ1tdIGFyZ3MsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUcmFuc3BvcnQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRQcm90b2NvbCA9IEdldFByb3RvY29sKGFyZ3MpOworCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFuc3BvcnQgPT0gVHJhbnNwb3J0Lkh0dHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEh0dHBTZXJ2ZXJTYW1wbGUoKS5SdW4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJ1blNlbGVjdGVkQ29uZmlndXJhdGlvbkFzeW5jKHNlbGVjdGVkVHJhbnNwb3J0LCBzZWxlY3RlZFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBQcm90b2NvbCBHZXRQcm90b2NvbChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXByIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBQcm90b2NvbCBzZWxlY3RlZFByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFRyYW5zcG9ydCBzZWxlY3RlZFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFRyYW5zcG9ydDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoVHJhbnNwb3J0IHRyYW5zcG9ydCwgUHJvdG9jb2wgcHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmFicmljID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSk7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CisKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoICh0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydCg5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHBvcnQ6IDkwOTAsIGNsaWVudFRpbWVvdXQ6IDEwMDAwLCB1c2VCdWZmZXJlZFNvY2tldHM6IHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KCIudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BUbHM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTAsIGZhbHNlLCBHZXRDZXJ0aWZpY2F0ZSgpLCBDbGllbnRDZXJ0VmFsaWRhdG9yLCBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5GcmFtZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5CaW5hcnk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuSnNvbjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5NdWx0aXBsZXhlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjSGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjUHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoY2FsY0hhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlSGFuZGxlciA9IG5ldyBTaGFyZWRTZXJ2aWNlQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yID0gbmV3IFNoYXJlZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3Ioc2hhcmVkU2VydmljZUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKENhbGN1bGF0b3IpLCBjYWxjUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKFNoYXJlZFNlcnZpY2UpLCBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBtdWx0aXBsZXhlZFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSwgcHJvdG9jb2wsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oCisgICAgICAgICAgICAgICAgICAgICQiU2VsZWN0ZWQgVEFzeW5jU2VydmVyIHdpdGgge3NlcnZlclRyYW5zcG9ydH0gdHJhbnNwb3J0LCB7cHJvY2Vzc29yfSBwcm9jZXNzb3IgYW5kIHtpbnB1dFByb3RvY29sRmFjdG9yeX0gcHJvdG9jb2wgZmFjdG9yaWVzIik7CisKKyAgICAgICAgICAgICAgICB2YXIgc2VydmVyID0gbmV3IEFzeW5jQmFzZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgZmFicmljKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZlci5TZXJ2ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2VydGlmaWNhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkdWUgdG8gZmlsZXMgbG9jYXRpb24gaW4gbmV0IGNvcmUgYmV0dGVyIHRvIHRha2UgY2VydHMgZnJvbSB0b3AgZm9sZGVyCisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPSBHZXRDZXJ0UGF0aChEaXJlY3RvcnkuR2V0UGFyZW50KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0RmlsZSwgIlRocmlmdFRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRDZXJ0UGF0aChEaXJlY3RvcnlJbmZvIGRpLCBpbnQgbWF4Q291bnQgPSA2KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9wRGlyID0gZGk7CisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPQorICAgICAgICAgICAgICAgIHRvcERpci5FbnVtZXJhdGVGaWxlcygiVGhyaWZ0VGVzdC5wZngiLCBTZWFyY2hPcHRpb24uQWxsRGlyZWN0b3JpZXMpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGNlcnRGaWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1heENvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGZpbGUgaW4gZGlyZWN0b3JpZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q2VydFBhdGgoZGkuUGFyZW50LCBtYXhDb3VudCAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2VydEZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKG9iamVjdCBzZW5kZXIsCisgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0SG9zdCwgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBsb2NhbENlcnRpZmljYXRlcywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSByZW1vdGVDZXJ0aWZpY2F0ZSwgc3RyaW5nW10gYWNjZXB0YWJsZUlzc3VlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0aWZpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDbGllbnRDZXJ0VmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFBvbGljeUVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcFRscywKKyAgICAgICAgICAgIEZyYW1lZAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpbmFyeSwKKyAgICAgICAgICAgIENvbXBhY3QsCisgICAgICAgICAgICBKc29uLAorICAgICAgICAgICAgTXVsdGlwbGV4ZWQKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBIdHRwU2VydmVyU2FtcGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFJ1bihDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKHByZWZpeDogIkFTUE5FVENPUkVfIikKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaG9zdCA9IG5ldyBXZWJIb3N0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VDb25maWd1cmF0aW9uKGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgLlVzZUtlc3RyZWwoKQorICAgICAgICAgICAgICAgICAgICAuVXNlVXJscygiaHR0cDovL2xvY2FsaG9zdDo5MDkwIikKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbnRlbnRSb290KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VTdGFydHVwPFN0YXJ0dXA+KCkKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICBob3N0LlJ1bkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBTdGFydHVwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFN0YXJ0dXAoSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBDb25maWd1cmF0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2V0QmFzZVBhdGgoZW52LkNvbnRlbnRSb290UGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRFbnZpcm9ubWVudFZhcmlhYmxlcygpOworCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gPSBidWlsZGVyLkJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIElDb25maWd1cmF0aW9uUm9vdCBDb25maWd1cmF0aW9uIHsgZ2V0OyB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGFkZCBzZXJ2aWNlcyB0byB0aGUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZVNlcnZpY2VzKElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxDYWxjdWxhdG9yLklBc3luYywgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PElUQXN5bmNQcm9jZXNzb3IsIENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3I+KCk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxUSHR0cFNlcnZlclRyYW5zcG9ydCwgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUuIFVzZSB0aGlzIG1ldGhvZCB0byBjb25maWd1cmUgdGhlIEhUVFAgcmVxdWVzdCBwaXBlbGluZS4KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmUoSUFwcGxpY2F0aW9uQnVpbGRlciBhcHAsIElIb3N0aW5nRW52aXJvbm1lbnQgZW52LAorICAgICAgICAgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwLlVzZU1pZGRsZXdhcmU8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JBc3luY0hhbmRsZXIgOiBDYWxjdWxhdG9yLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IF9sb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKKworICAgICAgICAgICAgcHVibGljIENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KF9sb2dba2V5XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHBpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlBpbmdBc3luYygpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGFkZEFzeW5jKGludCBudW0xLCBpbnQgbnVtMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQWRkQXN5bmMoe251bTF9LHtudW0yfSkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG51bTEgKyBudW0yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8aW50PiBjYWxjdWxhdGVBc3luYyhpbnQgbG9naWQsIFdvcmsgdywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQ2FsY3VsYXRlQXN5bmMoe2xvZ2lkfSwgW3t3Lk9wfSx7dy5OdW0xfSx7dy5OdW0yfV0pIik7CisKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHcuT3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKyB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAtIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xICogdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcuTnVtMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAvIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdE9wID0gKGludCkgdy5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiVW5rbm93biBvcGVyYXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGxvZ2lkLAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IHZhbC5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIF9sb2dbbG9naWRdID0gZW50cnk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KHZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHppcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiWmlwQXN5bmMoKSB3aXRoIGRlbGF5IDEwMG1jIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheSgxMDAsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIgOiBTaGFyZWRTZXJ2aWNlLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiR2V0U3RydWN0QXN5bmMoezB9KSIsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChuZXcgU2hhcmVkU3RydWN0KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGtleSwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiR2V0U3RydWN0QXN5bmMiCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDQyMzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJlMjEwZmMxMC01YWZmLTRiMDQtYWMyMS01OGFmYzdiNzRiMGMiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24gYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNzZmZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInByb2ZpbGVzIjogeworICAgICJTZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZE5hbWUiOiAiUHJvamVjdCIsCisgICAgICAiY29tbWFuZExpbmVBcmdzIjogIi1wOm11bHRpcGxleGVkIgorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmQzMDMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMjYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsuV2ViIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qIiAvPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uLy4uL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUuU2VydmVyLklJU0ludGVncmF0aW9uIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUuU2VydmVyLktlc3RyZWwiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uLkZpbGVFeHRlbnNpb25zIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbiBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGNkNDYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbgpAQCAtMCwwICsxLDc4IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjExNC4yCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkludGVyZmFjZXMiLCAiSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIsICJ7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiQ2xpZW50IiwgIkNsaWVudFxDbGllbnQuY3Nwcm9qIiwgIntFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJTZXJ2ZXIiLCAiU2VydmVyXFNlcnZlci5jc3Byb2oiLCAie0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7MDcwQTVEMUQtQjI5RC00NjAzLTk5OUQtNjkzREI0NDRBRDBEfQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNSBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKKworOmVvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk3ZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKK3NldCAtZQorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE2ZmVjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tbm9kZWpzL0NhbGN1bGF0b3IuanMgZ2VuLW5vZGVqcy9TaGFyZWRTZXJ2aWNlLmpzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLW5vZGVqcy9DYWxjdWxhdG9yLmpzCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVTZXJ2ZXIuanMKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZUNsaWVudC5qcworCit0dXRvcmlhbHNlcnZlcl9wcm9taXNlOiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVTZXJ2ZXJQcm9taXNlLmpzCisKK3R1dG9yaWFsY2xpZW50X3Byb21pc2U6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZUNsaWVudFByb21pc2UuanMKKworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCU5vZGVTZXJ2ZXIuanMgXAorCU5vZGVDbGllbnQuanMgXAorCU5vZGVTZXJ2ZXJQcm9taXNlLmpzIFwKKwlOb2RlQ2xpZW50UHJvbWlzZS5qcwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg4NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKKwordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CisgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKKyAgcHJvdG9jb2wgOiBwcm90b2NvbAorfSk7CisKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCisvLyBDcmVhdGUgYSBDYWxjdWxhdG9yIGNsaWVudCB3aXRoIHRoZSBjb25uZWN0aW9uCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYWxjdWxhdG9yLCBjb25uZWN0aW9uKTsKKworCitjbGllbnQucGluZyhmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGNvbnNvbGUubG9nKCdwaW5nKCknKTsKK30pOworCisKK2NsaWVudC5hZGQoMSwxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGNvbnNvbGUubG9nKCIxKzE9IiArIHJlc3BvbnNlKTsKK30pOworCisKK3dvcmsgPSBuZXcgdHR5cGVzLldvcmsoKTsKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERTsKK3dvcmsubnVtMSA9IDE7Cit3b3JrLm51bTIgPSAwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmssIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSkgeworICBpZiAoZXJyKSB7CisgICAgY29uc29sZS5sb2coIkludmFsaWRPcGVyYXRpb24gIiArIGVycik7CisgIH0gZWxzZSB7CisgICAgY29uc29sZS5sb2coJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKTsKKyAgfQorfSk7CisKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUOword29yay5udW0xID0gMTU7Cit3b3JrLm51bTIgPSAxMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrLCBmdW5jdGlvbihlcnIsIG1lc3NhZ2UpIHsKKyAgY29uc29sZS5sb2coJzE1LTEwPScgKyBtZXNzYWdlKTsKKworICBjbGllbnQuZ2V0U3RydWN0KDEsIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSl7CisgICAgY29uc29sZS5sb2coJ0NoZWNrIGxvZzogJyArIG1lc3NhZ2UudmFsdWUpOworCisgICAgLy9jbG9zZSB0aGUgY29ubmVjdGlvbiBvbmNlIHdlJ3JlIGRvbmUKKyAgICBjb25uZWN0aW9uLmVuZCgpOworICB9KTsKK30pOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGMxODQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKKwordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CisgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKKyAgcHJvdG9jb2wgOiBwcm90b2NvbAorfSk7CisKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCisvLyBDcmVhdGUgYSBDYWxjdWxhdG9yIGNsaWVudCB3aXRoIHRoZSBjb25uZWN0aW9uCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYWxjdWxhdG9yLCBjb25uZWN0aW9uKTsKKworCitjbGllbnQucGluZygpCisgIC50aGVuKGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCdwaW5nKCknKTsKKyAgfSk7CisKK2NsaWVudC5hZGQoMSwxKQorICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworCSAgY29uc29sZS5sb2coIjErMT0iICsgcmVzcG9uc2UpOworICB9KTsKKword29yayA9IG5ldyB0dHlwZXMuV29yaygpOword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uRElWSURFOword29yay5udW0xID0gMTsKK3dvcmsubnVtMiA9IDA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgeworCWNvbnNvbGUubG9nKCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/Jyk7CisgIH0pCisgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgIGNvbnNvbGUubG9nKCJJbnZhbGlkT3BlcmF0aW9uICIgKyBlcnIpOworICB9KTsKKworCit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVDsKK3dvcmsubnVtMSA9IDE1Oword29yay5udW0yID0gMTA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsKKwkgIGNvbnNvbGUubG9nKCcxNS0xMD0nICsgdmFsdWUpOworCSAgcmV0dXJuIGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgIH0pCisgIC50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdDaGVjayBsb2c6ICcgKyBtZXNzYWdlLnZhbHVlKTsKKyAgfSkKKyAgLmZpbihmdW5jdGlvbigpIHsKKwkgIC8vY2xvc2UgdGhlIGNvbm5lY3Rpb24gb25jZSB3ZSdyZSBkb25lCisgICAgICBjb25uZWN0aW9uLmVuZCgpOworICB9KTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkMzgxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvQ2FsY3VsYXRvciIpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcyIpOwordmFyIFNoYXJlZFN0cnVjdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9zaGFyZWRfdHlwZXMiKS5TaGFyZWRTdHJ1Y3Q7CisKK3ZhciBkYXRhID0ge307CisKK3ZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKENhbGN1bGF0b3IsIHsKKyAgcGluZzogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coInBpbmcoKSIpOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKG4xLCBuMiwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImFkZCgiLCBuMSwgIiwiLCBuMiwgIikiKTsKKyAgICByZXN1bHQobnVsbCwgbjEgKyBuMik7CisgIH0sCisKKyAgY2FsY3VsYXRlOiBmdW5jdGlvbihsb2dpZCwgd29yaywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwiLCB3b3JrLCAiKSIpOworCisgICAgdmFyIHZhbCA9IDA7CisgICAgaWYgKHdvcmsub3AgPT0gdHR5cGVzLk9wZXJhdGlvbi5BREQpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1QpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uTVVMVElQTFkpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uRElWSURFKSB7CisgICAgICBpZiAod29yay5udW0yID09PSAwKSB7CisgICAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKyAgICAgICAgcmVzdWx0KHgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGVudHJ5LmtleSA9IGxvZ2lkOworICAgIGVudHJ5LnZhbHVlID0gIiIrdmFsOworICAgIGRhdGFbbG9naWRdID0gZW50cnk7CisKKyAgICByZXN1bHQobnVsbCwgdmFsKTsKKyAgfSwKKworICBnZXRTdHJ1Y3Q6IGZ1bmN0aW9uKGtleSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImdldFN0cnVjdCgiLCBrZXksICIpIik7CisgICAgcmVzdWx0KG51bGwsIGRhdGFba2V5XSk7CisgIH0sCisKKyAgemlwOiBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygiemlwKCkiKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0KKworfSk7CisKK3NlcnZlci5saXN0ZW4oOTA5MCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMjg3YgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3IiKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMiKTsKK3ZhciBTaGFyZWRTdHJ1Y3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvc2hhcmVkX3R5cGVzIikuU2hhcmVkU3RydWN0OworCit2YXIgZGF0YSA9IHt9OworCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihDYWxjdWxhdG9yLCB7CisgIHBpbmc6IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCJwaW5nKCkiKTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKG4xLCBuMikgeworICAgIGNvbnNvbGUubG9nKCJhZGQoIiwgbjEsICIsIiwgbjIsICIpIik7CisgICAgcmV0dXJuIG4xICsgbjI7CisgIH0sCisKKyAgY2FsY3VsYXRlOiBmdW5jdGlvbihsb2dpZCwgd29yaykgeworICAgIGNvbnNvbGUubG9nKCJjYWxjdWxhdGUoIiwgbG9naWQsICIsIiwgd29yaywgIikiKTsKKworICAgIHZhciB2YWwgPSAwOworICAgIGlmICh3b3JrLm9wID09IHR0eXBlcy5PcGVyYXRpb24uQUREKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLk1VTFRJUExZKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERSkgeworICAgICAgaWYgKHdvcmsubnVtMiA9PT0gMCkgeworICAgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CisJCXRocm93IHg7CisgICAgICB9CisgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbic7CisgICAgICB0aHJvdyB4OworICAgIH0KKworICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICBlbnRyeS52YWx1ZSA9ICIiK3ZhbDsKKyAgICBkYXRhW2xvZ2lkXSA9IGVudHJ5OworICAgIHJldHVybiB2YWw7CisgIH0sCisKKyAgZ2V0U3RydWN0OiBmdW5jdGlvbihrZXkpIHsKKyAgICBjb25zb2xlLmxvZygiZ2V0U3RydWN0KCIsIGtleSwgIikiKTsKKyAgICByZXR1cm4gZGF0YVtrZXldOworICB9LAorCisgIHppcDogZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coInppcCgpIik7CisgIH0KKworfSk7CisKK3NlcnZlci5saXN0ZW4oOTA5MCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY0NsaWVudC5tbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTg0NjdiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY0NsaWVudC5tbApAQCAtMCwwICsxLDc0IEBACisoKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyopCisKK29wZW4gQXJnCitvcGVuIFRocmlmdAorb3BlbiBUdXRvcmlhbF90eXBlcworb3BlbiBTaGFyZWRfdHlwZXMKKworZXhjZXB0aW9uIERpZTs7CitsZXQgc29kID0gZnVuY3Rpb24KKyAgICBTb21lIHYgLT4gdgorICB8IE5vbmUgLT4gcmFpc2UgRGllOzsKKwordHlwZSBjb25uZWN0aW9uID0geworICB0cmFucyA6IFRyYW5zcG9ydC50IDsKKyAgcHJvdG8gOiBUaHJpZnQuUHJvdG9jb2wudDsKKyAgY2FsYyA6IENhbGN1bGF0b3IuY2xpZW50IDsKK30KKworbGV0IGNvbm5lY3Qgfmhvc3QgcG9ydCA9CisgIGxldCB0eCA9IG5ldyBUU29ja2V0LnQgaG9zdCBwb3J0IGluCisgIGxldCBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wudCB0eCBpbgorICBsZXQgY2FsYyA9IG5ldyBDYWxjdWxhdG9yLmNsaWVudCBwcm90byBwcm90byBpbgorICAgIHR4I29wbjsKKyAgICB7IHRyYW5zID0gdHggOyBwcm90byA9IHByb3RvOyBjYWxjID0gY2FsYyB9Cis7OworCitsZXQgZG9jbGllbnQgKCkgPQorICBsZXQgY2xpID0gY29ubmVjdCB+aG9zdDoiMTI3LjAuMC4xIiA5MDkwIGluCisgIHRyeQorICAgIGNsaS5jYWxjI3BpbmcgOworICAgIFByaW50Zi5wcmludGYgInBpbmcoKVxuIiA7IGZsdXNoIHN0ZG91dCA7CisgICAgKGxldCBzdW0gPSBjbGkuY2FsYyNhZGQgKEludDMyLm9mX2ludCAxKSAoSW50MzIub2ZfaW50IDEpIGluCisgICAgICAgUHJpbnRmLnByaW50ZiAiMSsxPSVsZFxuIiBzdW0gOworICAgICAgIGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgdyA9IG5ldyB3b3JrIGluCisgICAgICAgdyNzZXRfb3AgT3BlcmF0aW9uLkRJVklERSA7CisgICAgICAgdyNzZXRfbnVtMSAoSW50MzIub2ZfaW50IDEpIDsKKyAgICAgICB3I3NldF9udW0yIChJbnQzMi5vZl9pbnQgMCkgOworICAgICAgIHRyeQorCSBsZXQgcXVvdGllbnQgPSBjbGkuY2FsYyNjYWxjdWxhdGUgKEludDMyLm9mX2ludCAxKSB3IGluCisJICAgUHJpbnRmLnByaW50ZiAiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvIVxuIiA7IGZsdXNoIHN0ZG91dAorICAgICAgIHdpdGggSW52YWxpZE9wZXJhdGlvbiBpbyAtPgorCSBQcmludGYucHJpbnRmICJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiBpbyNncmFiX3doeSA7IGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgdyA9IG5ldyB3b3JrIGluCisgICAgICAgdyNzZXRfb3AgT3BlcmF0aW9uLlNVQlRSQUNUIDsKKyAgICAgICB3I3NldF9udW0xIChJbnQzMi5vZl9pbnQgMTUpIDsKKyAgICAgICB3I3NldF9udW0yIChJbnQzMi5vZl9pbnQgMTApIDsKKyAgICAgICBsZXQgZGlmZiA9IGNsaS5jYWxjI2NhbGN1bGF0ZSAoSW50MzIub2ZfaW50IDEpIHcgaW4KKwkgUHJpbnRmLnByaW50ZiAiMTUtMTA9JWxkXG4iIGRpZmYgOyBmbHVzaCBzdGRvdXQpIDsKKyAgICAobGV0IHNzID0gY2xpLmNhbGMjZ2V0U3RydWN0IChJbnQzMi5vZl9pbnQgMSkgaW4KKyAgICAgICBQcmludGYucHJpbnRmICJDaGVjayBsb2c6ICVzXG4iIHNzI2dyYWJfdmFsdWUgOyBmbHVzaCBzdGRvdXQpIDsKKyAgICBjbGkudHJhbnMjY2xvc2UKKyAgd2l0aCBUcmFuc3BvcnQuRSAoXyx3aGF0KSAtPgorICAgIFByaW50Zi5wcmludGYgIkVSUk9SOiAlc1xuIiB3aGF0IDsgZmx1c2ggc3Rkb3V0Cis7OworCitkb2NsaWVudCgpOzsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwgYi90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZmFjYjcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sCkBAIC0wLDAgKzEsODkgQEAKKygqCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorKikKKworb3BlbiBBcmcKK29wZW4gVGhyaWZ0CitvcGVuIFR1dG9yaWFsX3R5cGVzCitvcGVuIFNoYXJlZF90eXBlcworCitleGNlcHRpb24gRGllOzsKK2xldCBzb2QgPSBmdW5jdGlvbgorICAgIFNvbWUgdiAtPiB2CisgIHwgTm9uZSAtPiByYWlzZSBEaWU7OworCitjbGFzcyBjYWxjX2hhbmRsZXIgPQorb2JqZWN0IChzZWxmKQorICBpbmhlcml0IENhbGN1bGF0b3IuaWZhY2UKKyAgdmFsIGxvZyA9IEhhc2h0YmwuY3JlYXRlIDIzCisgIG1ldGhvZCBwaW5nICA9IFByaW50Zi5wcmludGYgInBpbmcoKVxuIiA7IGZsdXNoIHN0ZG91dAorICBtZXRob2QgYWRkIGEgYiA9CisgICAgUHJpbnRmLnByaW50ZiJhZGQoJWxkLCVsZClcbiIgKHNvZCBhKSAoc29kIGIpOyBmbHVzaCBzdGRvdXQgOworICAgIEludDMyLmFkZCAoc29kIGEpIChzb2QgYikKKyAgbWV0aG9kIGNhbGN1bGF0ZSBsb2dpZCB3ID0KKyAgICBsZXQgdyA9IHNvZCB3IGluCisgICAgICBQcmludGYucHJpbnRmICJjYWxjdWxhdGUoJWxkLHslbGQsJWxkLCVsZH0pXG4iIChzb2QgbG9naWQpIChPcGVyYXRpb24udG9faSB3I2dyYWJfb3ApIHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yOyBmbHVzaCBzdGRvdXQgOworICAgIGxldCBydiA9CisgICAgICBtYXRjaCB3I2dyYWJfb3Agd2l0aAorCSAgT3BlcmF0aW9uLkFERCAtPgorCSAgICBJbnQzMi5hZGQgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5TVUJUUkFDVCAtPgorCSAgICBJbnQzMi5zdWIgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5NVUxUSVBMWSAtPgorCSAgICBJbnQzMi5tdWwgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5ESVZJREUgLT4KKwkgICAgaWYgdyNncmFiX251bTIgPSBJbnQzMi56ZXJvIHRoZW4KKwkgICAgICBsZXQgaW8gPSBuZXcgaW52YWxpZE9wZXJhdGlvbiBpbgorCQlpbyNzZXRfd2hhdE9wIChPcGVyYXRpb24udG9faSB3I2dyYWJfb3ApIDsKKwkJaW8jc2V0X3doeSAiQ2Fubm90IGRpdmlkZSBieSAwIiA7CisJCXJhaXNlIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorCSAgICBlbHNlCisJICAgICAgSW50MzIuZGl2IHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yIGluCisKKyAgICBsZXQgc3MgPSBuZXcgc2hhcmVkU3RydWN0IGluCisgICAgICBzcyNzZXRfa2V5IChzb2QgbG9naWQpIDsKKyAgICBsZXQgYnVmZmVyID0gSW50MzIudG9fc3RyaW5nIHJ2IGluCisgICAgICBzcyNzZXRfdmFsdWUgYnVmZmVyIDsKKyAgICAgIEhhc2h0YmwuYWRkIGxvZyAoc29kIGxvZ2lkKSBzcyA7CisgICAgICBydgorCisgIG1ldGhvZCB6aXAgPQorICAgIFByaW50Zi5wcmludGYgInppcCgpXG4iOyBmbHVzaCBzdGRvdXQKKworICBtZXRob2QgZ2V0U3RydWN0IGxvZ2lkID0KKyAgICBQcmludGYucHJpbnRmICJnZXRTdHJ1Y3QoJWxkKVxuIiAoc29kIGxvZ2lkKSA7IGZsdXNoIHN0ZG91dCA7CisgICAgSGFzaHRibC5maW5kIGxvZyAoc29kIGxvZ2lkKQorCitlbmQKKworbGV0IGRvc2VydmVyICgpID0KKyAgbGV0IGggPSBuZXcgY2FsY19oYW5kbGVyIGluCisgIGxldCBwcm9jID0gbmV3IENhbGN1bGF0b3IucHJvY2Vzc29yIGggaW4KKyAgbGV0IHBvcnQgPSA5MDkwIGluCisgIGxldCBwZiA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuZmFjdG9yeSBpbgorICBsZXQgc2VydmVyID0gbmV3IFRUaHJlYWRlZFNlcnZlci50CisJCSBwcm9jCisJCSAobmV3IFRTZXJ2ZXJTb2NrZXQudCBwb3J0KQorCQkgKG5ldyBUcmFuc3BvcnQuZmFjdG9yeSkKKwkJIHBmCisJCSBwZgorICBpbgorICAgIHNlcnZlciNzZXJ2ZQorOzsKKworZG9zZXJ2ZXIoKTs7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9SRUFETUUubWQgYi90dXRvcmlhbC9vY2FtbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4ZTgzNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZApAQCAtMCwwICsxLDE1IEBACisKK1RoaXMgaXMgdGhlIG9jYW1sIHR1dG9yaWFsIGV4YW1wbGUuICBJdCBhc3N1bWVzIHRoYXQgeW91J3ZlIGFscmVhZHkKK2J1aWx0IGFuZCBpbnN0YWxsZWQgdGhlIHRocmlmdCBvY2FtbCBydW50aW1lIGxpYnJhcmllcyBpbiBsaWIvb2NhbWwuCisKK1RvIGNvbXBpbGUgdGhpcywgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSB0aGUgVGhyaWZ0IHNvdXJjZXMgZm9yCitvY2FtbCBpbiB0aGlzIGRpcmVjdG9yeSAoZHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBPQVNJUyBidWlsZC10b29sKToKKworICAlIHRocmlmdCAtciAtLWdlbiBvY2FtbCAuLi90dXRvcmlhbC50aHJpZnQKKyAgJSBvYXNpcyBzZXR1cAorICAlIG1ha2UKKworVGhpcyB3aWxsIHByb2R1Y2UgdHdvIGV4ZWN1dGFibGVzIENhbGN7U2VydmVyLENsaWVudH0uPHR5cGU+IHdoZXJlCis8dHlwZT4gaXMgb25lIG9mICJieXRlIiBvciAibmF0aXZlIiwgZGVwZW5kaW5nIG9uIHlvdXIgb2NhbWwKK2luc3RhbGxhdGlvbi4gIEp1c3QgcnVuIHRoZSBzZXJ2ZXIgaW4gdGhlIGJhY2tncm91bmQsIHRoZW4gdGhlIGNsaWVudAorKGFzIHlvdSB3b3VsZCBkbyBmb3IgdGhlIEMrKyBleGFtcGxlKS4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL19vYXNpcyBiL3R1dG9yaWFsL29jYW1sL19vYXNpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDVjMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCkBAIC0wLDAgKzEsMzIgQEAKK05hbWU6IHR1dG9yaWFsCitWZXJzaW9uOiAxLjAuMAorT0FTSVNGb3JtYXQ6IDAuMworU3lub3BzaXM6IE9DYW1sIFR1dG9yaWFsIGV4YW1wbGUKK0F1dGhvcnM6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorTGljZW5zZTogQXBhY2hlLTIuMAorSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworQnVpbGRUb29sczogb2NhbWxidWlsZAorUGx1Z2luczogICAgIE1FVEEgKDAuMyksCisgIERldkZpbGVzICgwLjMpCisKK0xpYnJhcnkgdHV0b3JpYWxfdGhyaWZ0CisgIFBhdGg6IGdlbi1vY2FtbAorICBGaW5kbGliTmFtZTogdHV0b3JpYWxfdGhyaWZ0CisgIGJ1aWxkVG9vbHM6IG9jYW1sYnVpbGQKKyAgQnVpbGREZXBlbmRzOiB0aHJlYWRzLHRocmlmdAorICBNb2R1bGVzOiBDYWxjdWxhdG9yLFNoYXJlZF9jb25zdHMsVHV0b3JpYWxfY29uc3RzLFNoYXJlZFNlcnZpY2UsU2hhcmVkX3R5cGVzLFR1dG9yaWFsX3R5cGVzCisgIFhNRVRBUmVxdWlyZXM6IHRocmVhZHMKKworRXhlY3V0YWJsZSBDYWxjQ2xpZW50CisgIFBhdGg6IC4KKyAgTWFpbklzOiBDYWxjQ2xpZW50Lm1sCisgIEJ1aWxkJDogdHJ1ZQorICBDb21waWxlZE9iamVjdDogYmVzdAorICBCdWlsZERlcGVuZHM6IHRocmlmdCwgdHV0b3JpYWxfdGhyaWZ0LCB0aHJlYWRzCisKK0V4ZWN1dGFibGUgQ2FsY1NlcnZlcgorICBQYXRoOiAuCisgIE1haW5JczogQ2FsY1NlcnZlci5tbAorICBCdWlsZCQ6IHRydWUKKyAgQ29tcGlsZWRPYmplY3Q6IGJlc3QKKyAgQnVpbGREZXBlbmRzOiB0aHJpZnQsIHR1dG9yaWFsX3RocmlmdCwgdGhyZWFkcwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsIGIvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCmluZGV4IDFkNTk2NTYuLjdjMjMyODkgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbAorKysgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKQEAgLTM3LDEwICszNywxMCBAQAogCiB1c2UgRGF0YTo6RHVtcGVyOwogCi1teSAkc29ja2V0ICAgID0gbmV3IFRocmlmdDo6U29ja2V0KCdsb2NhbGhvc3QnLDkwOTApOwotbXkgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsMTAyNCwxMDI0KTsKLW15ICRwcm90b2NvbCAgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLW15ICRjbGllbnQgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKK215ICRzb2NrZXQgICAgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KCdsb2NhbGhvc3QnLDkwOTApOworbXkgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LDEwMjQsMTAyNCk7CitteSAkcHJvdG9jb2wgID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworbXkgJGNsaWVudCAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yQ2xpZW50LT5uZXcoJHByb3RvY29sKTsKIAogCiBldmFsewpAQCAtNTMsNyArNTMsNyBAQAogICAgIG15ICRzdW0gPSAkY2xpZW50LT5hZGQoMSwxKTsKICAgICBwcmludCAiMSsxPSRzdW1cbiI7CiAKLSAgICBteSAkd29yayA9IG5ldyB0dXRvcmlhbDo6V29yaygpOworICAgIG15ICR3b3JrID0gdHV0b3JpYWw6OldvcmstPm5ldygpOwogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OkRJVklERSk7CiAgICAgJHdvcmstPm51bTEoMSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICRjbGllbnQtPmNhbGN1bGF0ZSgxLCAkd29yayk7CiAgICAgICAgIHByaW50ICJXaG9hISBXZSBjYW4gZGl2aWRlIGJ5IHplcm8/XG4iOwogICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIHdhcm4gIkludmFsaWRPcGVyYXRpb246ICIuRHVtcGVyKCRAKTsKKyAgICAgICAgd2FybiAnSW52YWxpZE9wZXJhdGlvbjogJy5EdW1wZXIoJEApOwogICAgIH0KIAogICAgICR3b3JrLT5vcCh0dXRvcmlhbDo6T3BlcmF0aW9uOjpTVUJUUkFDVCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKaW5kZXggYTQwZWM2OS4uZGZlNmI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbApAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcGVybAorIyEvdXNyL2Jpbi9lbnYgcGVybAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTY3LDIwICs2NywyMCBAQAogICB9IGVsc2lmICgkb3AgPT0gdHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKSB7CiAgICAgaWYgKCRudW0yID09IDApCiAgICAgewotICAgICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247Ci0gICAgICAkeC0+d2hhdCgkb3ApOworICAgICAgbXkgJHggPSB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbi0+bmV3KCk7CisgICAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgICAkeC0+d2h5KCdDYW5ub3QgZGl2aWRlIGJ5IDAnKTsKICAgICAgIGRpZSAkeDsKICAgICB9CiAgICAgJHZhbCA9ICRudW0xIC8gJG51bTI7CiAgIH0gZWxzZSB7Ci0gICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247Ci0gICAgJHgtPndoYXQoJG9wKTsKKyAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKKyAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgJHgtPndoeSgnSW52YWxpZCBvcGVyYXRpb24nKTsKICAgICBkaWUgJHg7CiAgIH0KIAotICBteSAkbG9nID0gbmV3IHNoYXJlZDo6U2hhcmVkU3RydWN0OworICBteSAkbG9nID0gc2hhcmVkOjpTaGFyZWRTdHJ1Y3QtPm5ldygpOwogICAkbG9nLT5rZXkoJGxvZ2lkKTsKICAgJGxvZy0+dmFsdWUoaW50KCR2YWwpKTsKICAgJHNlbGYtPntsb2d9LT57JGxvZ2lkfSA9ICRsb2c7CkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogCiAKIGV2YWwgewotICBteSAkaGFuZGxlciAgICAgICA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKLSAgbXkgJHByb2Nlc3NvciAgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOwotICBteSAkc2VydmVyc29ja2V0ICA9IG5ldyBUaHJpZnQ6OlNlcnZlclNvY2tldCg5MDkwKTsKLSAgbXkgJGZvcmtpbmdzZXJ2ZXIgPSBuZXcgVGhyaWZ0OjpGb3JraW5nU2VydmVyKCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOworICBteSAkaGFuZGxlciAgICAgICA9IENhbGN1bGF0b3JIYW5kbGVyLT5uZXcoKTsKKyAgbXkgJHByb2Nlc3NvciAgICAgPSB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKKyAgbXkgJHNlcnZlcnNvY2tldCAgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KDkwOTApOworICBteSAkZm9ya2luZ3NlcnZlciA9IFRocmlmdDo6Rm9ya2luZ1NlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOwogICBwcmludCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIjsKICAgJGZvcmtpbmdzZXJ2ZXItPnNlcnZlKCk7CiAgIHByaW50ICJkb25lLlxuIjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKaW5kZXggYTY2MzlkNS4uOTJkYzNjYiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKQEAgLTEsNSArMSwyMiBAQAogIyEvdXNyL2Jpbi9lbnYgcGhwCiA8P3BocAorCituYW1lc3BhY2UgdHV0b3JpYWxccGhwOworCitlcnJvcl9yZXBvcnRpbmcoRV9BTEwpOworCityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKyRHRU5fRElSID0gcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykuJy8uLicpLicvZ2VuLXBocCc7CisKKyRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi9saWIvcGhwL2xpYicpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdzaGFyZWQnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3R1dG9yaWFsJywgJEdFTl9ESVIpOworJGxvYWRlci0+cmVnaXN0ZXIoKTsKKwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwyOSArMzYsMTEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSRHTE9CQUxTWydUSFJJRlRfUk9PVCddID0gJy4uLy4uL2xpYi9waHAvc3JjJzsKLQotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVGhyaWZ0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU29ja2V0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKLQotLyoqCi0gKiBTdXBwcmVzcyBlcnJvcnMgaW4gaGVyZSwgd2hpY2ggaGFwcGVuIGJlY2F1c2Ugd2UgaGF2ZSBub3QgaW5zdGFsbGVkIGludG8KLSAqICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvdHV0b3JpYWwnIGxpa2Ugd2UgYXJlIHN1cHBvc2VkIHRvIQotICoKLSAqIE5vcm1hbGx5IHdlIHdvdWxkIG9ubHkgaGF2ZSB0byBpbmNsdWRlIENhbGN1bGF0b3IucGhwIHdoaWNoIHdvdWxkIHByb3Blcmx5Ci0gKiBpbmNsdWRlIHRoZSBvdGhlciBmaWxlcyBmcm9tIHRoZWlyIHBhY2thZ2VzLyBmb2xkZXIgbG9jYXRpb25zLCBidXQgd2UKLSAqIGluY2x1ZGUgZXZlcnl0aGluZyBoZXJlIGR1ZSB0byB0aGUgYm9ndXMgcGF0aCBzZXR1cC4KLSAqLwotZXJyb3JfcmVwb3J0aW5nKEVfTk9ORSk7Ci0kR0VOX0RJUiA9ICcuLi9nZW4tcGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9zaGFyZWQvc2hhcmVkX3R5cGVzLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy90dXRvcmlhbC9DYWxjdWxhdG9yLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5waHAnOwotZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRIdHRwQ2xpZW50OwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKIAogdHJ5IHsKICAgaWYgKGFycmF5X3NlYXJjaCgnLS1odHRwJywgJGFyZ3YpKSB7CkBAIC01MSw3ICs1MCw3IEBACiAgIH0KICAgJHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7CiAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICRjbGllbnQgPSBuZXcgQ2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOworICAkY2xpZW50ID0gbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yQ2xpZW50KCRwcm90b2NvbCk7CiAKICAgJHRyYW5zcG9ydC0+b3BlbigpOwogCkBAIC02MSwyMCArNjAsMjAgQEAKICAgJHN1bSA9ICRjbGllbnQtPmFkZCgxLDEpOwogICBwcmludCAiMSsxPSRzdW1cbiI7CiAKLSAgJHdvcmsgPSBuZXcgdHV0b3JpYWxfV29yaygpOworICAkd29yayA9IG5ldyBcdHV0b3JpYWxcV29yaygpOwogCi0gICR3b3JrLT5vcCA9IHR1dG9yaWFsX09wZXJhdGlvbjo6RElWSURFOworICAkd29yay0+b3AgPSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpESVZJREU7CiAgICR3b3JrLT5udW0xID0gMTsKICAgJHdvcmstPm51bTIgPSAwOwogCiAgIHRyeSB7CiAgICAgJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKICAgICBwcmludCAiV2hvYSEgV2UgY2FuIGRpdmlkZSBieSB6ZXJvP1xuIjsKLSAgfSBjYXRjaCAodHV0b3JpYWxfSW52YWxpZE9wZXJhdGlvbiAkaW8pIHsKKyAgfSBjYXRjaCAoXHR1dG9yaWFsXEludmFsaWRPcGVyYXRpb24gJGlvKSB7CiAgICAgcHJpbnQgIkludmFsaWRPcGVyYXRpb246ICRpby0+d2h5XG4iOwogICB9CiAKLSAgJHdvcmstPm9wID0gdHV0b3JpYWxfT3BlcmF0aW9uOjpTVUJUUkFDVDsKKyAgJHdvcmstPm9wID0gXHR1dG9yaWFsXE9wZXJhdGlvbjo6U1VCVFJBQ1Q7CiAgICR3b3JrLT5udW0xID0gMTU7CiAgICR3b3JrLT5udW0yID0gMTA7CiAgICRkaWZmID0gJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKaW5kZXggMjM1YjE1Yi4uNWE5YjQ5YiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKQEAgLTEsNSArMSwyMiBAQAogIyEvdXNyL2Jpbi9lbnYgcGhwCiA8P3BocAorCituYW1lc3BhY2UgdHV0b3JpYWxccGhwOworCitlcnJvcl9yZXBvcnRpbmcoRV9BTEwpOworCityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKyRHRU5fRElSID0gcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykuJy8uLicpLicvZ2VuLXBocCc7CisKKyRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi9saWIvcGhwL2xpYicpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdzaGFyZWQnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3R1dG9yaWFsJywgJEdFTl9ESVIpOworJGxvYWRlci0+cmVnaXN0ZXIoKTsKKwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0zMSwzMCArNDgsMTEgQEAKICAgaW5pX3NldCgiZGlzcGxheV9lcnJvcnMiLCAic3RkZXJyIik7CiB9CiAKLSRHTE9CQUxTWydUSFJJRlRfUk9PVCddID0gcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykuJy8uLi8uLicpLicvbGliL3BocC9zcmMnOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUUGhwU3RyZWFtOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OwogCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKLQotLyoqCi0gKiBTdXBwcmVzcyBlcnJvcnMgaW4gaGVyZSwgd2hpY2ggaGFwcGVuIGJlY2F1c2Ugd2UgaGF2ZSBub3QgaW5zdGFsbGVkIGludG8KLSAqICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvdHV0b3JpYWwnIGxpa2Ugd2UgYXJlIHN1cHBvc2VkIHRvIQotICoKLSAqIE5vcm1hbGx5IHdlIHdvdWxkIG9ubHkgaGF2ZSB0byBpbmNsdWRlIENhbGN1bGF0b3IucGhwIHdoaWNoIHdvdWxkIHByb3Blcmx5Ci0gKiBpbmNsdWRlIHRoZSBvdGhlciBmaWxlcyBmcm9tIHRoZWlyIHBhY2thZ2VzLyBmb2xkZXIgbG9jYXRpb25zLCBidXQgd2UKLSAqIGluY2x1ZGUgZXZlcnl0aGluZyBoZXJlIGR1ZSB0byB0aGUgYm9ndXMgcGF0aCBzZXR1cC4KLSAqLwotZXJyb3JfcmVwb3J0aW5nKEVfTk9ORSk7Ci0kR0VOX0RJUiA9IHJlYWxwYXRoKGRpcm5hbWUoX19GSUxFX18pLicvLi4nKS4nL2dlbi1waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL1NoYXJlZFNlcnZpY2UucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3NoYXJlZC9zaGFyZWRfdHlwZXMucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL0NhbGN1bGF0b3IucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLnBocCc7Ci1lcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwotCi1jbGFzcyBDYWxjdWxhdG9ySGFuZGxlciBpbXBsZW1lbnRzIENhbGN1bGF0b3JJZiB7CitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciBpbXBsZW1lbnRzIFx0dXRvcmlhbFxDYWxjdWxhdG9ySWYgewogICBwcm90ZWN0ZWQgJGxvZyA9IGFycmF5KCk7CiAKICAgcHVibGljIGZ1bmN0aW9uIHBpbmcoKSB7CkBAIC02NiwzNSArNjQsMzUgQEAKICAgICByZXR1cm4gJG51bTEgKyAkbnVtMjsKICAgfQogCi0gIHB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGUoJGxvZ2lkLCAkdykgeworICBwdWJsaWMgZnVuY3Rpb24gY2FsY3VsYXRlKCRsb2dpZCwgXHR1dG9yaWFsXFdvcmsgJHcpIHsKICAgICBlcnJvcl9sb2coImNhbGN1bGF0ZSh7JGxvZ2lkfSwge3skdy0+b3B9LCB7JHctPm51bTF9LCB7JHctPm51bTJ9fSkiKTsKICAgICBzd2l0Y2ggKCR3LT5vcCkgewotICAgICAgY2FzZSB0dXRvcmlhbF9PcGVyYXRpb246OkFERDoKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6QUREOgogICAgICAgICAkdmFsID0gJHctPm51bTEgKyAkdy0+bnVtMjsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHR1dG9yaWFsX09wZXJhdGlvbjo6U1VCVFJBQ1Q6CisgICAgICBjYXNlIFx0dXRvcmlhbFxPcGVyYXRpb246OlNVQlRSQUNUOgogICAgICAgICAkdmFsID0gJHctPm51bTEgLSAkdy0+bnVtMjsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHR1dG9yaWFsX09wZXJhdGlvbjo6TVVMVElQTFk6CisgICAgICBjYXNlIFx0dXRvcmlhbFxPcGVyYXRpb246Ok1VTFRJUExZOgogICAgICAgICAkdmFsID0gJHctPm51bTEgKiAkdy0+bnVtMjsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHR1dG9yaWFsX09wZXJhdGlvbjo6RElWSURFOgorICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpESVZJREU6CiAgICAgICAgIGlmICgkdy0+bnVtMiA9PSAwKSB7Ci0gICAgICAgICAgJGlvID0gbmV3IHR1dG9yaWFsX0ludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgICAkaW8tPndoYXQgPSAkdy0+b3A7CisgICAgICAgICAgJGlvID0gbmV3IFx0dXRvcmlhbFxJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgJGlvLT53aGF0T3AgPSAkdy0+b3A7CiAgICAgICAgICAgJGlvLT53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgICB0aHJvdyAkaW87CiAgICAgICAgIH0KICAgICAgICAgJHZhbCA9ICR3LT5udW0xIC8gJHctPm51bTI7CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgJGlvID0gbmV3IHR1dG9yaWFsX0ludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgJGlvLT53aGF0ID0gJHctPm9wOworICAgICAgICAkaW8gPSBuZXcgXHR1dG9yaWFsXEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgJGlvLT53aGF0T3AgPSAkdy0+b3A7CiAgICAgICAgICRpby0+d2h5ID0gIkludmFsaWQgT3BlcmF0aW9uIjsKICAgICAgICAgdGhyb3cgJGlvOwogICAgIH0KIAotICAgICRsb2cgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgJGxvZyA9IG5ldyBcc2hhcmVkXFNoYXJlZFN0cnVjdCgpOwogICAgICRsb2ctPmtleSA9ICRsb2dpZDsKICAgICAkbG9nLT52YWx1ZSA9IChzdHJpbmcpJHZhbDsKICAgICAkdGhpcy0+bG9nWyRsb2dpZF0gPSAkbG9nOwpAQCAtMTA3LDcgKzEwNSw3IEBACiAgICAgLy8gVGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYmVjYXVzZSB0aGUgUEhQIGludGVycHJldGVyIGlzCiAgICAgLy8gcmVzdGFydGVkIGZvciBldmVyeSByZXF1ZXN0LgogICAgIC8vcmV0dXJuICR0aGlzLT5sb2dbJGtleV07Ci0gICAgcmV0dXJuIG5ldyBTaGFyZWRTdHJ1Y3QoYXJyYXkoImtleSIgPT4gJGtleSwgInZhbHVlIiA9PiAiUEhQIGlzIHN0YXRlbGVzcyEiKSk7CisgICAgcmV0dXJuIG5ldyBcc2hhcmVkXFNoYXJlZFN0cnVjdChhcnJheSgia2V5IiA9PiAka2V5LCAidmFsdWUiID0+ICJQSFAgaXMgc3RhdGVsZXNzISIpKTsKICAgfQogCiAgIHB1YmxpYyBmdW5jdGlvbiB6aXAoKSB7CkBAIC0xMjIsNyArMTIwLDcgQEAKIH0KIAogJGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKLSRwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7CiskcHJvY2Vzc29yID0gbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKCRoYW5kbGVyKTsKIAogJHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQobmV3IFRQaHBTdHJlYW0oVFBocFN0cmVhbTo6TU9ERV9SIHwgVFBocFN0cmVhbTo6TU9ERV9XKSk7CiAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQsIHRydWUsIHRydWUpOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weSBiL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKaW5kZXggYWUyOWZlZC4uMDc3ZGFhMSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQorKysgYi90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CkBAIC0yNiw3ICsyNiw4IEBACiAjIGNoZGlyKDIpIGludG8gdGhlIHR1dG9yaWFsIGRpcmVjdG9yeS4KIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpKSkKIAorCiBjbGFzcyBIYW5kbGVyKENHSUhUVFBTZXJ2ZXIuQ0dJSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgY2dpX2RpcmVjdG9yaWVzICA9IFsnL3BocCddCisgICAgY2dpX2RpcmVjdG9yaWVzID0gWycvcGhwJ10KIAogQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcigoJycsIDgwODApLCBIYW5kbGVyKS5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiNzNjMWUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkudG9ybmFkby90dXRvcmlhbC9DYWxjdWxhdG9yLnB5IGdlbi1weS50b3JuYWRvL3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweTp0b3JuYWRvIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXB5LnRvcm5hZG8vdHV0b3JpYWwvQ2FsY3VsYXRvci5weQorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtQWVRIT059IFB5dGhvblNlcnZlci5weQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtQWVRIT059IFB5dGhvbkNsaWVudC5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVB5dGhvblNlcnZlci5weSBcCisJUHl0aG9uQ2xpZW50LnB5CmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyNjE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weQpAQCAtMCwwICsxLDEwOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKKworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgT3BlcmF0aW9uLCBXb3JrLCBJbnZhbGlkT3BlcmF0aW9uCisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKK2Zyb20gdG9ybmFkbyBpbXBvcnQgZ2VuCitmcm9tIHRvcm5hZG8gaW1wb3J0IGlvbG9vcAorCisKK0BnZW4uY29yb3V0aW5lCitkZWYgY29tbXVuaWNhdGUoKToKKyAgICAjIGNyZWF0ZSBjbGllbnQKKyAgICB0cmFuc3BvcnQgPSBUVG9ybmFkby5UVG9ybmFkb1N0cmVhbVRyYW5zcG9ydCgnbG9jYWxob3N0JywgOTA5MCkKKyAgICAjIG9wZW4gdGhlIHRyYW5zcG9ydCwgYmFpbCBvbiBlcnJvcgorICAgIHRyeToKKyAgICAgICAgeWllbGQgdHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBwcmludCgnVHJhbnNwb3J0IGlzIG9wZW5lZCcpCisgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgbG9nZ2luZy5lcnJvcihleCkKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybigpCisKKyAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudCh0cmFuc3BvcnQsIHBmYWN0b3J5KQorCisgICAgIyBwaW5nCisgICAgeWllbGQgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCJwaW5nKCkiKQorCisgICAgIyBhZGQKKyAgICBzdW1fID0geWllbGQgY2xpZW50LmFkZCgxLCAxKQorICAgIHByaW50KCIxICsgMSA9IHswfSIuZm9ybWF0KHN1bV8pKQorCisgICAgIyBtYWtlIGEgb25ld2F5IGNhbGwgd2l0aG91dCBhIGNhbGxiYWNrIChzY2hlZHVsZSB0aGUgd3JpdGUgYW5kIGNvbnRpbnVlCisgICAgIyB3aXRob3V0IGJsb2NraW5nKQorICAgIGNsaWVudC56aXAoKQorICAgIHByaW50KCJ6aXAoKSB3aXRob3V0IGNhbGxiYWNrIikKKworICAgICMgbWFrZSBhIG9uZXdheSBjYWxsIHdpdGggYSBjYWxsYmFjayAod2UnbGwgd2FpdCBmb3IgdGhlIHN0cmVhbSB3cml0ZSB0bworICAgICMgY29tcGxldGUgYmVmb3JlIGNvbnRpbnVpbmcpCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGggY2FsbGJhY2siKQorCisgICAgIyBjYWxjdWxhdGUgMS8wCisgICAgd29yayA9IFdvcmsoKQorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCisgICAgd29yay5udW0xID0gMQorICAgIHdvcmsubnVtMiA9IDAKKworICAgIHRyeToKKyAgICAgICAgcXVvdGllbnQgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCJXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8gPyAtPiB7MH0iLmZvcm1hdChxdW90aWVudCkpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgaW86CisgICAgICAgIHByaW50KCJJbnZhbGlkT3BlcmF0aW9uOiB7MH0iLmZvcm1hdChpbykpCisKKyAgICAjIGNhbGN1bGF0ZSAxNS0xMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCisKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCIxNSAtIDEwID0gezB9Ii5mb3JtYXQoZGlmZikpCisKKyAgICAjIGdldFN0cnVjdAorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgiQ2hlY2sgbG9nOiB7MH0iLmZvcm1hdChsb2cudmFsdWUpKQorCisgICAgIyBjbG9zZSB0aGUgdHJhbnNwb3J0CisgICAgY2xpZW50Ll90cmFuc3BvcnQuY2xvc2UoKQorICAgIHJhaXNlIGdlbi5SZXR1cm4oKQorCisKK2RlZiBtYWluKCk6CisgICAgIyBjcmVhdGUgYW4gaW9sb29wLCBkbyB0aGUgYWJvdmUsIHRoZW4gc3RvcAorICAgIGlvbG9vcC5JT0xvb3AuY3VycmVudCgpLnJ1bl9zeW5jKGNvbW11bmljYXRlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwMjI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQpAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIEludmFsaWRPcGVyYXRpb24KKworZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKK2Zyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgicGluZygpIikKKworICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoImFkZCh7fSwge30pIi5mb3JtYXQobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKKworICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgiY2FsY3VsYXRlKHt9LCB7fSkiLmZvcm1hdChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgICAgICB4LndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgIHgud2h5ID0gIkludmFsaWQgb3BlcmF0aW9uIgorICAgICAgICAgICAgcmFpc2UgeAorCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoImdldFN0cnVjdCh7fSkiLmZvcm1hdChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoInppcCgpIikKKworCitkZWYgbWFpbigpOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBzZXJ2ZXIgPSBUVG9ybmFkby5UVG9ybmFkb1NlcnZlcihwcm9jZXNzb3IsIHBmYWN0b3J5KQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKQorICAgIHNlcnZlci5iaW5kKDkwOTApCisgICAgc2VydmVyLnN0YXJ0KDEpCisgICAgaW9sb29wLklPTG9vcC5pbnN0YW5jZSgpLnN0YXJ0KCkKKyAgICBwcmludCgiZG9uZS4iKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MGNkMzQyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweTp0d2lzdGVkIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSR7UFlUSE9OfSBQeXRob25TZXJ2ZXIucHkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSR7UFlUSE9OfSBQeXRob25DbGllbnQucHkKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKworRVhUUkFfRElTVCA9IFwKKwlQeXRob25DbGllbnQucHkgXAorCVB5dGhvblNlcnZlci5weSBcCisJUHl0aG9uU2VydmVyLnRhYwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42M2RkZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkKQEAgLTAsMCArMSw3OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCisKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC5kZWZlciBpbXBvcnQgaW5saW5lQ2FsbGJhY2tzCitmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKKworQGlubGluZUNhbGxiYWNrcworZGVmIG1haW4oY2xpZW50KToKKyAgICB5aWVsZCBjbGllbnQucGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBzdW0gPSB5aWVsZCBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoKCcxKzE9JWQnICUgKHN1bSkpKQorCisgICAgd29yayA9IFdvcmsoKQorCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKKworICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCisKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCgnMTUtMTA9JWQnICUgKGRpZmYpKSkKKworICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkpKQorICAgIHJlYWN0b3Iuc3RvcCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZCA9IENsaWVudENyZWF0b3IocmVhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRDbGllbnRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdG9yLkNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICkuY29ubmVjdFRDUCgiMTI3LjAuMC4xIiwgOTA5MCkKKyAgICBkLmFkZENhbGxiYWNrKGxhbWJkYSBjb25uOiBjb25uLmNsaWVudCkKKyAgICBkLmFkZENhbGxiYWNrKG1haW4pCisKKyAgICByZWFjdG9yLnJ1bigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMGUyZDUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQpAQCAtMCwwICsxLDk2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KKworZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKKworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCByZWFjdG9yCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKKyAgICBpbXBsZW1lbnRzKENhbGN1bGF0b3IuSWZhY2UpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKKworICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJworICAgICAgICAgICAgcmFpc2UgeAorCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICA5MDkwLAorICAgICAgICBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwgcGZhY3RvcnkpLAorICAgICAgICBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCisgICAgcmVhY3Rvci5ydW4oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0Nzk2MzYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKQEAgLTAsMCArMSw1MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHR3aXN0ZWQuYXBwbGljYXRpb24gaW1wb3J0IGludGVybmV0LCBzZXJ2aWNlCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIFB5dGhvblNlcnZlciBpbXBvcnQgQ2FsY3VsYXRvckhhbmRsZXIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworCitkZWYgbWFrZV9hcHBsaWNhdGlvbigpOgorICAgIGFwcGxpY2F0aW9uID0gc2VydmljZS5BcHBsaWNhdGlvbignQ2FsY1NlcnZlcicpCisKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBzZXJ2ZXJGYWN0b3J5ID0gVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeSgKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorCisgICAgY2FsY1NlcnZpY2UgPSBpbnRlcm5ldC5UQ1BTZXJ2ZXIoOTA5MCwgc2VydmVyRmFjdG9yeSkKKworICAgIG11bHRpU2VydmljZSA9IHNlcnZpY2UuTXVsdGlTZXJ2aWNlKCkKKyAgICBjYWxjU2VydmljZS5zZXRTZXJ2aWNlUGFyZW50KG11bHRpU2VydmljZSkKKyAgICBtdWx0aVNlcnZpY2Uuc2V0U2VydmljZVBhcmVudChhcHBsaWNhdGlvbikKKworICAgIHJldHVybiBhcHBsaWNhdGlvbgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYjgxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJc2V0dXAuY2ZnIFwKKwlQeXRob25TZXJ2ZXIucHkgXAorCVB5dGhvbkNsaWVudC5weQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDkxNmU5MTUuLmE2YzE5NjYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKQEAgLTIwLDYzICsyMCw3MCBAQAogIwogCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weScpCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAotdHJ5OgogCi0gICMgTWFrZSBzb2NrZXQKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQorZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQogCi0gICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93Ci0gIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKIAotICAjIFdyYXAgaW4gYSBwcm90b2NvbAotICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKIAotICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKLSAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCiAKLSAgIyBDb25uZWN0IQotICB0cmFuc3BvcnQub3BlbigpCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKIAotICBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtXyA9IGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgnMSsxPSVkJyAlIHN1bV8pCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAotICB3b3JrLm51bTEgPSAxNQotICB3b3JrLm51bTIgPSAxMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgcHJpbnQgJzE1LTEwPSVkJyAlIChkaWZmKQorICAgIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoJzE1LTEwPSVkJyAlIGRpZmYpCiAKLSAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQorICAgIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgnQ2hlY2sgbG9nOiAlcycgJSBsb2cudmFsdWUpCiAKLSAgIyBDbG9zZSEKLSAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCiAKLWV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiwgdHg6Ci0gIHByaW50ICclcycgJSAodHgubWVzc2FnZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICAgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKaW5kZXggNjNmOTkzYi4uZTY0MjFlZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQpAQCAtMTksMTEgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHknKQorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KIAogZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKIApAQCAtMzIsNjUgKzM0LDcwIEBACiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIAorCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYubG9nID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6Ci0gICAgcHJpbnQgJ2FkZCglZCwlZCknICUgKG4xLCBuMikKLSAgICByZXR1cm4gbjErbjIKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQogCi0gICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgotICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKLSAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgotICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJwotICAgICAgICByYWlzZSB4Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKLSAgICBlbHNlOgotICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCi0gICAgICByYWlzZSB4CisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAotaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKLXByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCi10cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoOTA5MCkKLXRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLXBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi1zZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PScxMjcuMC4wLjEnLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0jIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSNzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKIAotcHJpbnQgJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nCi1zZXJ2ZXIuc2VydmUoKQotcHJpbnQgJ2RvbmUuJworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKworICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9zZXR1cC5jZmcgYi90dXRvcmlhbC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzNzI0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L2NhbGN1bGF0b3IucmIgZ2VuLXB5L3NoYXJlZF9zZXJ2aWNlLnJiOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS9jYWxjdWxhdG9yLnJiCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1JVQll9IFJ1YnlTZXJ2ZXIucmIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSR7UlVCWX0gUnVieUNsaWVudC5yYgorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVJ1YnlTZXJ2ZXIucmIgXAorCVJ1YnlDbGllbnQucmIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIgYi90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiCmluZGV4IGZkNzI2OTkuLjlhNWFhNDMgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIKKysrIGIvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYgpAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotJDoucHVzaCgnLi4vZ2VuLXJiJykKKyQ6LnB1c2goJ2dlbi1yYicpCiAkOi51bnNoaWZ0ICcuLi8uLi9saWIvcmIvbGliJwogCiByZXF1aXJlICd0aHJpZnQnCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiIGIvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgppbmRleCAzMGFhN2YyLi4xZDcwN2Q3IDEwMDc1NQotLS0gYS90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCisrKyBiL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKQEAgLTE5LDcgKzE5LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSQ6LnB1c2goJy4uL2dlbi1yYicpCiskOi5wdXNoKCdnZW4tcmInKQogJDoudW5zaGlmdCAnLi4vLi4vbGliL3JiL2xpYicKIAogcmVxdWlyZSAndGhyaWZ0JwpAQCAtNTIsMTQgKzUyLDE0IEBACiAgICAgZWxzaWYgd29yay5vcCA9PSBPcGVyYXRpb246OkRJVklERQogICAgICAgaWYgd29yay5udW0yID09IDAKICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24ubmV3KCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAorICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgICAgeC53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgogICAgICAgICByYWlzZSB4CiAgICAgICBlbmQKICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgogICAgIGVsc2UKICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uLm5ldygpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgIHgud2h5ID0gIkludmFsaWQgb3BlcmF0aW9uIgogICAgICAgcmFpc2UgeAogICAgIGVuZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbCBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNiBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdC10dXRvcmlhbCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInNoYXJlZC5ycyIsICJ0dXRvcmlhbC5ycyJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzMzFlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1ycy90dXRvcmlhbC5ycyBnZW4tcnMvc2hhcmVkLnJzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAtciAkPAorCithbGwtbG9jYWw6IGdlbi1ycy90dXRvcmlhbC5ycworCSQoQ0FSR08pIGJ1aWxkCisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfc2VydmVyIGJpbi90dXRvcmlhbF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfY2xpZW50IGJpbi90dXRvcmlhbF9jbGllbnQKKworY2hlY2s6IGFsbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJYmluL3R1dG9yaWFsX3NlcnZlcgkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCWJpbi90dXRvcmlhbF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvc2hhcmVkLnJzCisJLSQoUk0pIHNyYy90dXRvcmlhbC5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgXAorCVJFQURNRS5tZAorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9SRUFETUUubWQgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ZTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDMxNyBAQAorIyBSdXN0IExhbmd1YWdlIEJpbmRpbmdzIGZvciBUaHJpZnQKKworIyMgR2V0dGluZyBTdGFydGVkCisKKzEuIEdldCB0aGUgW1RocmlmdCBjb21waWxlcl0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZykuCisKKzIuIEFkZCB0aGUgZm9sbG93aW5nIGNyYXRlcyB0byB5b3VyIGBDYXJnby50b21sYC4KKworYGBgdG9tbAordGhyaWZ0ID0gIngueS56IiAjIHgueS56IGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSB0aHJpZnQgY29tcGlsZXIKK29yZGVyZWRfZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKK2BgYAorCiszLiBBZGQgdGhlIHNhbWUgY3JhdGVzIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgLgorCitgYGBydXN0CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CitgYGAKKworNC4gR2VuZXJhdGUgUnVzdCBzb3VyY2VzIGZvciB5b3VyIElETCAoZm9yIGV4YW1wbGUsIGBUdXRvcmlhbC50aHJpZnRgKS4KKworYGBgc2hlbGwKK3RocmlmdCAtb3V0IG15X3J1c3RfcHJvZ3JhbS9zcmMgLS1nZW4gcnMgLXIgVHV0b3JpYWwudGhyaWZ0CitgYGAKKworNS4gVXNlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGluIHlvdXIgY29kZS4KKworYGBgcnVzdAorLy8gYWRkIGV4dGVybiBjcmF0ZXMgaGVyZSwgb3IgaW4geW91ciBsaWIucnMKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworLy8gZ2VuZXJhdGVkIFJ1c3QgbW9kdWxlCit1c2UgdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKK3VzZSB0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBUQ2FsY3VsYXRvclN5bmNDbGllbnR9OwordXNlIHR1dG9yaWFsOjp7T3BlcmF0aW9uLCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgiY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJjbGllbnQgZmFpbGVkIHdpdGggezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vCisgICAgLy8gYnVpbGQgY2xpZW50CisgICAgLy8KKworICAgIHByaW50bG4hKCJjb25uZWN0IHRvIHNlcnZlciBvbiAxMjcuMC4wLjE6OTA5MCIpOworICAgIGxldCBtdXQgYyA9IFRUY3BUcmFuc3BvcnQ6Om5ldygpOworICAgIGMub3BlbigiMTI3LjAuMC4xOjkwOTAiKT87CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGMuc3BsaXQoKT87CisgICAgCisgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KAorICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikKKyAgICApOworICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbikKKyAgICApOworCisgICAgbGV0IGNsaWVudCA9IENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgLy8KKyAgICAvLyBhbHJpZ2h0ISAtIGxldCdzIG1ha2Ugc29tZSBjYWxscworICAgIC8vCisKKyAgICAvLyB0d28td2F5LCB2b2lkIHJldHVybgorICAgIGNsaWVudC5waW5nKCk/OworCisgICAgLy8gdHdvLXdheSB3aXRoIHNvbWUgcmV0dXJuCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUoCisgICAgICAgIDcyLAorICAgICAgICBXb3JrOjpuZXcoNywgOCwgT3BlcmF0aW9uOjpNVUxUSVBMWSwgTm9uZSkKKyAgICApPzsKKyAgICBwcmludGxuISgibXVsdGlwbGllZCA3IGFuZCA4LCBnb3Qge30iLCByZXMpOworCisgICAgLy8gdHdvLXdheSBhbmQgcmV0dXJucyBhIFRocmlmdC1kZWZpbmVkIGV4Y2VwdGlvbgorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKAorICAgICAgICA3NywKKyAgICAgICAgV29yazo6bmV3KDIsIDAsIE9wZXJhdGlvbjo6RElWSURFLCBOb25lKQorICAgICk7CisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2sodikgPT4gcGFuaWMhKCJzaG91bGRuJ3QgaGF2ZSBzdWNjZWVkZWQgd2l0aCByZXN1bHQge30iLCB2KSwKKyAgICAgICAgRXJyKGUpID0+IHByaW50bG4hKCJkaXZpZGUgYnkgemVybyBmYWlsZWQgd2l0aCB7Oj99IiwgZSksCisgICAgfQorCisgICAgLy8gb25lLXdheQorICAgIGNsaWVudC56aXAoKT87CisKKyAgICAvLyBkb25lIQorICAgIE9rKCgpKQorfQorYGBgCisKKyMjIENvZGUgR2VuZXJhdGlvbgorCisjIyMgVGhyaWZ0IEZpbGVzIGFuZCBHZW5lcmF0ZWQgTW9kdWxlcworCitUaGUgVGhyaWZ0IGNvZGUgZ2VuZXJhdG9yIHRha2VzIGVhY2ggVGhyaWZ0IGZpbGUgYW5kIGdlbmVyYXRlcyBhIFJ1c3QgbW9kdWxlCit3aXRoIHRoZSBzYW1lIG5hbWUgc25ha2UtY2FzZWQuIEZvciBleGFtcGxlLCBydW5uaW5nIHRoZSBjb21waWxlciBvbgorYFRocmlmdFRlc3QudGhyaWZ0YCBjcmVhdGVzIGB0aHJpZnRfdGVzdC5yc2AuIFRvIHVzZSB0aGVzZSBnZW5lcmF0ZWQgZmlsZXMgYWRkCitgbW9kIC4uLmAgYW5kIGB1c2UgLi4uYCBkZWNsYXJhdGlvbnMgdG8geW91ciBgbGliLnJzYCBvciBgbWFpbi5yc2AgLSBvbmUgZm9yCitlYWNoIGdlbmVyYXRlZCBmaWxlLgorCisjIyMgUmVzdWx0cyBhbmQgRXJyb3JzCisKK1RoZSBUaHJpZnQgcnVudGltZSBsaWJyYXJ5IGRlZmluZXMgYSBgdGhyaWZ0OjpSZXN1bHRgIGFuZCBhIGB0aHJpZnQ6OkVycm9yYCB0eXBlLAorYm90aCBvZiB3aGljaCBhcmUgdXNlZCB0aHJvdWdodCB0aGUgcnVudGltZSBsaWJyYXJ5IGFuZCBpbiBhbGwgZ2VuZXJhdGVkIGNvZGUuCitDb252ZXJzaW9ucyBhcmUgZGVmaW5lZCBmcm9tIGBzdGQ6OmlvOjpFcnJvcmAsIGBzdHJgIGFuZCBgU3RyaW5nYCBpbnRvCitgdGhyaWZ0OjpFcnJvcmAuCisKKyMjIyBUaHJpZnQgVHlwZSBhbmQgdGhlaXIgUnVzdCBFcXVpdmFsZW50cworCitUaHJpZnQgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlcywgZWFjaCBvZiB3aGljaCBpcyB0cmFuc2xhdGVkIGludG8gaXRzIFJ1c3QKK2VxdWl2YWxlbnQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorCisqIFByaW1pdGl2ZXMgKGJvb2wsIGk4LCBpMTYsIGkzMiwgaTY0LCBkb3VibGUsIHN0cmluZywgYmluYXJ5KQorKiBUeXBlZGVmcworKiBFbnVtcworKiBDb250YWluZXJzCisqIFN0cnVjdHMKKyogVW5pb25zCisqIEV4Y2VwdGlvbnMKKyogU2VydmljZXMKKyogQ29uc3RhbnRzIChwcmltaXRpdmVzLCBjb250YWluZXJzLCBzdHJ1Y3RzKQorCitJbiBhZGRpdGlvbiwgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgdGhyaWZ0IGluY2x1ZGVzIGFyZSB0cmFuc2xhdGVkIGludG8KK2B1c2UgLi4uYCBzdGF0ZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYW5kIGFsbCBkZWNsYXJhdGlvbnMsIHBhcmFtZXRlcnMsCit0cmFpdHMgYW5kIHR5cGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBhcmUgbmFtZXNwYWNlZCBhcHByb3ByaWF0ZWx5LgorCitUaGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zIGNvdmVyIGVhY2ggdHlwZSBhbmQgdGhlaXIgZ2VuZXJhdGVkIFJ1c3QgZXF1aXZhbGVudC4KKworIyMjIFByaW1pdGl2ZXMKKworVGhyaWZ0IHByaW1pdGl2ZXMgaGF2ZSBzdHJhaWdodGZvcndhcmQgUnVzdCBlcXVpdmFsZW50cy4KKworKiBib29sOiBgYm9vbGAKKyogaTg6IGBpOGAKKyogaTE2OiBgaTE2YAorKiBpMzI6IGBpMzJgCisqIGk2NDogYGk2NGAKKyogZG91YmxlOiBgT3JkZXJlZEZsb2F0PGY2ND5gCisqIHN0cmluZzogYFN0cmluZ2AKKyogYmluYXJ5OiBgVmVjPHU4PmAKKworIyMjIFR5cGVkZWZzCisKK0EgdHlwZWRlZiBpcyB0cmFuc2xhdGVkIHRvIGEgYHB1YiB0eXBlYCBkZWNsYXJhdGlvbi4KKworYGBgdGhyaWZ0Cit0eXBlZGVmIGk2NCBVc2VySWQKKwordHlwZWRlZiBtYXA8c3RyaW5nLCBVc2VySWQ+IE1hcFR5cGUKK2BgYAorYGBgcnVzdAorcHViIHR5cGUgVXNlcklkID0gaTY0OworCitwdWIgdHlwZSBNYXBUeXBlID0gQlRyZWVNYXA8U3RyaW5nLCBCb25rPjsKK2BgYAorCisjIyMgRW51bXMKKworQSBUaHJpZnQgZW51bSBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3QgZW51bSwgYW5kIGVhY2ggdmFyaWFudCBpcyB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorZW51bSBOdW1iZXJ6Cit7CisgICAgT05FID0gMSwKKyAgICBUV08sCisgICAgVEhSRUUsCisgICAgRklWRSA9IDUsCisgICAgU0lYLAorICAgIEVJR0hUID0gOAorfQorYGBgCisKK2BgYHJ1c3QKKyNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBlbnVtIE51bWJlcnogeworICAgIE9ORSA9IDEsCisgICAgVFdPID0gMiwKKyAgICBUSFJFRSA9IDMsCisgICAgRklWRSA9IDUsCisgICAgU0lYID0gNiwKKyAgICBFSUdIVCA9IDgsCit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBOdW1iZXJ6IHsKKyAgICAvLyAuLi4KK30KKworYGBgCisKKyMjIyBDb250YWluZXJzCisKK1RocmlmdCBoYXMgdGhyZWUgY29udGFpbmVyIHR5cGVzOiBsaXN0LCBzZXQgYW5kIG1hcC4gVGhleSBhcmUgdHJhbnNsYXRlZCBpbnRvCitSdXN0IGBWZWNgLCBgQlRyZWVTZXRgIGFuZCBgQlRyZWVNYXBgIHJlc3BlY3RpdmVseS4gQW55IFRocmlmdCB0eXBlICh0aGlzCitpbmNsdWRlcyBzdHJ1Y3RzLCBlbnVtcyBhbmQgdHlwZWRlZnMpIGNhbiBiZSBhIGxpc3Qvc2V0IGVsZW1lbnQgb3IgYSBtYXAKK2tleS92YWx1ZS4KKworIyMjIyBMaXN0CisKK2BgYHRocmlmdAorbGlzdCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogVmVjPGkzMj4KK2BgYAorCisjIyMjIFNldAorCitgYGB0aHJpZnQKK3NldCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogQlRyZWVTZXQ8aTMyPgorYGBgCisKKyMjIyMgTWFwCisKK2BgYHRocmlmdAorbWFwIDxzdHJpbmcsIGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IEJUcmVlTWFwPFN0cmluZywgaTMyPgorYGBgCisKKyMjIyBTdHJ1Y3RzCisKK0EgVGhyaWZ0IHN0cnVjdCBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3Qgc3RydWN0LCBhbmQgZWFjaCBmaWVsZCB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorc3RydWN0IENyYXp5TmVzdGluZyB7CisgICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKKyAgICAyOiBvcHRpb25hbCBzZXQ8SW5zYW5pdHk+IHNldF9maWVsZCwKKyAgICAzOiByZXF1aXJlZCBsaXN0PAorICAgICAgICAgbWFwPHNldDxpMzI+LCBtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+PgorICAgICAgID4KKyAgICA0OiBiaW5hcnkgYmluYXJ5X2ZpZWxkCit9CitgYGAKK2BgYHJ1c3QKKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgc3RyaW5nX2ZpZWxkOiBPcHRpb248U3RyaW5nPiwKKyAgICBwdWIgc2V0X2ZpZWxkOiBPcHRpb248QlRyZWVTZXQ8SW5zYW5pdHk+PiwKKyAgICBwdWIgbGlzdF9maWVsZDogVmVjPAorICAgICAgICBCVHJlZU1hcDwKKyAgICAgICAgICAgIEJUcmVlU2V0PGkzMj4sCisgICAgICAgICAgICBCVHJlZU1hcDxpMzIsIEJUcmVlU2V0PFZlYzxCVHJlZU1hcDxJbnNhbml0eSwgU3RyaW5nPj4+PgorICAgICAgICA+CisgICAgPiwKKyAgICBwdWIgYmluYXJ5X2ZpZWxkOiBPcHRpb248VmVjPHU4Pj4sCit9CisKK2ltcGwgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PENyYXp5TmVzdGluZz4geworICAgICAgICAvLyAuLi4KKyAgICB9CisgICAgcHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIC8vIC4uLgorICAgIH0KK30KKworYGBgCisjIyMjIyBPcHRpb25hbGl0eQorCitUaHJpZnQgaGFzIDMgIm9wdGlvbmFsaXR5IiB0eXBlczoKKworMS4gUmVxdWlyZWQKKzIuIE9wdGlvbmFsCiszLiBEZWZhdWx0CisKK1RoZSBSdXN0IGNvZGUgZ2VuZXJhdG9yIGVuY29kZXMgKlJlcXVpcmVkKiBmaWVsZHMgYXMgdGhlIGJhcmUgdHlwZSBpdHNlbGYsIHdoaWxlCisqT3B0aW9uYWwqIGFuZCAqRGVmYXVsdCogZmllbGRzIGFyZSBlbmNvZGVkIGFzIGBPcHRpb248VHlwZU5hbWU+YC4KKworYGBgdGhyaWZ0CitzdHJ1Y3QgRm9vIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgYmFyICAvLyAxLiByZXF1aXJlZAorICAgIDI6IG9wdGlvbmFsIHN0cmluZyBiYXogIC8vIDIuIG9wdGlvbmFsCisgICAgMzogc3RyaW5nIHF1eCAgICAgICAgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKK2BgYHJ1c3QKK3B1YiBzdHJ1Y3QgRm9vIHsKKyAgICBiYXI6IFN0cmluZywgICAgICAgICAgICAvLyAxLiByZXF1aXJlZAorICAgIGJhejogT3B0aW9uPFN0cmluZz4sICAgIC8vIDIuIG9wdGlvbmFsCisgICAgcXV4OiBPcHRpb248U3RyaW5nPiwgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKKyMjIEtub3duIElzc3VlcworCisqIFN0cnVjdCBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyogTWFwLCBsaXN0IGFuZCBzZXQgY29uc3RhbnRzIHJlcXVpcmUgYSBjb25zdCBob2xkZXIgc3RydWN0CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycwpAQCAtMCwwICsxLDEzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90dXRvcmlhbDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCit1c2UgdGhyaWZ0X3R1dG9yaWFsOjpzaGFyZWQ6OlRTaGFyZWRTZXJ2aWNlU3luY0NsaWVudDsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNDbGllbnQsIE9wZXJhdGlvbiwgVENhbGN1bGF0b3JTeW5jQ2xpZW50LCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgidHV0b3JpYWwgY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJ0dXRvcmlhbCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBvcHRpb25zID0gY2xhcF9hcHAhKHJ1c3RfdHV0b3JpYWxfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3QgdHV0b3JpYWwgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiaG9zdCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgKTsKKyAgICBsZXQgbWF0Y2hlcyA9IG9wdGlvbnMuZ2V0X21hdGNoZXMoKTsKKworICAgIC8vIGdldCBhbnkgcGFzc2VkLWluIGFyZ3Mgb3IgdGhlIGRlZmF1bHRzCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisKKyAgICAvLyBidWlsZCBvdXIgY2xpZW50IGFuZCBjb25uZWN0IHRvIHRoZSBob3N0OnBvcnQKKyAgICBsZXQgbXV0IGNsaWVudCA9IG5ld19jbGllbnQoaG9zdCwgcG9ydCk/OworCisgICAgLy8gYWxyaWdodCEKKyAgICAvLyBsZXQncyBzdGFydCBtYWtpbmcgc29tZSBjYWxscworCisgICAgLy8gbGV0J3Mgc3RhcnQgd2l0aCBhIHBpbmc7IHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQKKyAgICBwcmludGxuISgicGluZyEiKTsKKyAgICBjbGllbnQucGluZygpPzsKKworICAgIC8vIHNpbXBsZSBhZGQKKyAgICBwcmludGxuISgiYWRkIik7CisgICAgbGV0IHJlcyA9IGNsaWVudC5hZGQoMSwgMik/OworICAgIHByaW50bG4hKCJhZGRlZCAxLCAyIGFuZCBnb3Qge30iLCByZXMpOworCisgICAgbGV0IGxvZ2lkID0gMzI7CisKKyAgICAvLyBsZXQncyBkby4uLmEgbXVsdGlwbHkhCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUobG9naWQsIFdvcms6Om5ldyg3LCA4LCBPcGVyYXRpb246Ok11bHRpcGx5LCBOb25lKSk/OworICAgIHByaW50bG4hKCJtdWx0aXBsaWVkIDcgYW5kIDggYW5kIGdvdCB7fSIsIHJlcyk7CisKKyAgICAvLyBsZXQncyBnZXQgdGhlIGxvZyBmb3IgaXQKKyAgICBsZXQgcmVzID0gY2xpZW50LmdldF9zdHJ1Y3QoMzIpPzsKKyAgICBwcmludGxuISgiZ290IGxvZyB7Oj99IGZvciBvcGVyYXRpb24ge30iLCByZXMsIGxvZ2lkKTsKKworICAgIC8vIG9rIC0gbGV0J3MgYmUgYmFkIDooCisgICAgLy8gZG8gYSBkaXZpZGUgYnkgMAorICAgIC8vIGxvZ2lkIGRvZXNuJ3QgbWF0dGVyOyB3b24ndCBiZSByZWNvcmRlZAorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKDc3LCBXb3JrOjpuZXcoMiwgMCwgT3BlcmF0aW9uOjpEaXZpZGUsICJ3ZSBiYWQiLnRvX293bmVkKCkpKTsKKworICAgIC8vIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBhbiBleGNlcHRpb24gYmFjaworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKHYpID0+IHBhbmljISgic2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZCB3aXRoIHJlc3VsdCB7fSIsIHYpLAorICAgICAgICBFcnIoZSkgPT4gcHJpbnRsbiEoImRpdmlkZSBieSB6ZXJvIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKSwKKyAgICB9CisKKyAgICAvLyBsZXQncyBkbyBhIG9uZS13YXkgY2FsbAorICAgIHByaW50bG4hKCJ6aXAiKTsKKyAgICBjbGllbnQuemlwKCk/OworCisgICAgLy8gYW5kIHRoZW4gY2xvc2Ugb3V0IHdpdGggYSBmaW5hbCBwaW5nCisgICAgcHJpbnRsbiEoInBpbmchIik7CisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICBPaygoKSkKK30KKwordHlwZSBDbGllbnRJbnB1dFByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sPFRGcmFtZWRSZWFkVHJhbnNwb3J0PFJlYWRIYWxmPFRUY3BDaGFubmVsPj4+OwordHlwZSBDbGllbnRPdXRwdXRQcm90b2NvbCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VEZyYW1lZFdyaXRlVHJhbnNwb3J0PFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4+PjsKKworZm4gbmV3X2NsaWVudCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8Q2FsY3VsYXRvclN5bmNDbGllbnQ8Q2xpZW50SW5wdXRQcm90b2NvbCwgQ2xpZW50T3V0cHV0UHJvdG9jb2w+PiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworCisgICAgLy8gb3BlbiB0aGUgdW5kZXJseWluZyBUQ1Agc3RyZWFtCisgICAgcHJpbnRsbiEoImNvbm5lY3RpbmcgdG8gdHV0b3JpYWwgc2VydmVyIG9uIHt9Ont9IiwgaG9zdCwgcG9ydCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisKKyAgICAvLyBjbG9uZSB0aGUgVENQIGNoYW5uZWwgaW50byB0d28gaGFsdmVzLCBvbmUgd2hpY2gKKyAgICAvLyB3ZSdsbCB1c2UgZm9yIHJlYWRpbmcsIHRoZSBvdGhlciBmb3Igd3JpdGluZworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gYy5zcGxpdCgpPzsKKworICAgIC8vIHdyYXAgdGhlIHJhdyBzb2NrZXRzIChzbG93KSB3aXRoIGEgYnVmZmVyZWQgdHJhbnNwb3J0IG9mIHNvbWUga2luZAorICAgIGxldCBpX3RyYW4gPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbik7CisgICAgbGV0IG9fdHJhbiA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbik7CisKKyAgICAvLyBub3cgY3JlYXRlIHRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKKyAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKTsKKyAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbik7CisKKyAgICAvLyB3ZSdyZSBkb25lIQorICAgIE9rKENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIxYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdHV0b3JpYWw7CisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKK3VzZSBzdGQ6OnN5bmM6Ok11dGV4OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKKwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnNoYXJlZDo6e1NoYXJlZFNlcnZpY2VTeW5jSGFuZGxlciwgU2hhcmVkU3RydWN0fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNIYW5kbGVyLCBDYWxjdWxhdG9yU3luY1Byb2Nlc3Nvcn07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0ludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoInR1dG9yaWFsIHNlcnZlciByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgidHV0b3JpYWwgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgb3B0aW9ucyA9IGNsYXBfYXBwIShydXN0X3R1dG9yaWFsX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IHR1dG9yaWFsIHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICApOworICAgIGxldCBtYXRjaGVzID0gb3B0aW9ucy5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgaV90cmFuX2ZhY3QgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCBpX3Byb3RfZmFjdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgbGV0IG9fdHJhbl9mYWN0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IG9fcHJvdF9mYWN0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgLy8gZGVtdXggaW5jb21pbmcgbWVzc2FnZXMKKyAgICBsZXQgcHJvY2Vzc29yID0gQ2FsY3VsYXRvclN5bmNQcm9jZXNzb3I6Om5ldyhDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICB9KTsKKworICAgIC8vIGNyZWF0ZSB0aGUgc2VydmVyIGFuZCBzdGFydCBsaXN0ZW5pbmcKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgaV90cmFuX2ZhY3QsCisgICAgICAgIGlfcHJvdF9mYWN0LAorICAgICAgICBvX3RyYW5fZmFjdCwKKyAgICAgICAgb19wcm90X2ZhY3QsCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMTAsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorfQorCisvLy8gSGFuZGxlcyBpbmNvbWluZyBDYWxjdWxhdG9yIHNlcnZpY2UgY2FsbHMuCitzdHJ1Y3QgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgbG9nOiBNdXRleDxIYXNoTWFwPGkzMiwgU2hhcmVkU3RydWN0Pj4sCit9CisKK2ltcGwgRGVmYXVsdCBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gZGVmYXVsdCgpIC0+IENhbGN1bGF0b3JTZXJ2ZXIgeworICAgICAgICBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgICAgIGxvZzogTXV0ZXg6Om5ldyhIYXNoTWFwOjpuZXcoKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNpbmNlIENhbGN1bGF0b3IgZXh0ZW5kcyBTaGFyZWRTZXJ2aWNlIHdlIGhhdmUgdG8gaW1wbGVtZW50IHRoZQorLy8gaGFuZGxlciBmb3IgYm90aCB0cmFpdHMuCisvLworCisvLyBTaGFyZWRTZXJ2aWNlIGhhbmRsZXIKK2ltcGwgU2hhcmVkU2VydmljZVN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfZ2V0X3N0cnVjdCgmc2VsZiwga2V5OiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFNoYXJlZFN0cnVjdD4geworICAgICAgICBsZXQgbG9nID0gc2VsZi5sb2cubG9jaygpLnVud3JhcCgpOworICAgICAgICBsb2cuZ2V0KCZrZXkpCisgICAgICAgICAgICAuY2xvbmVkKCkKKyAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IGZvcm1hdCEoImNvdWxkIG5vdCBmaW5kIGxvZyBmb3Iga2V5IHt9Iiwga2V5KS5pbnRvKCkpCisgICAgfQorfQorCisvLyBDYWxjdWxhdG9yIGhhbmRsZXIKK2ltcGwgQ2FsY3VsYXRvclN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfcGluZygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoInBvbmchIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9hZGQoJnNlbGYsIG51bTE6IGkzMiwgbnVtMjogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIGFkZDogbjE6e30gbjI6e30iLCBudW0xLCBudW0yKTsKKyAgICAgICAgT2sobnVtMSArIG51bTIpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2NhbGN1bGF0ZSgmc2VsZiwgbG9naWQ6IGkzMiwgdzogV29yaykgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyBjYWxjdWxhdGU6IGw6e30sIHc6ezo/fSIsIGxvZ2lkLCB3KTsKKworICAgICAgICBsZXQgcmVzID0gaWYgbGV0IFNvbWUocmVmIG9wKSA9IHcub3AgeworICAgICAgICAgICAgaWYgdy5udW0xLmlzX25vbmUoKSB8fCB3Lm51bTIuaXNfbm9uZSgpIHsKKyAgICAgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdoYXRfb3A6IFNvbWUoKm9wIGFzIGkzMiksCisgICAgICAgICAgICAgICAgICAgIHdoeTogU29tZSgibm8gb3BlcmFuZHMgc3BlY2lmaWVkIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IEkgZG9uJ3QgaGF2ZSB0byBjYWxsIHVud3JhcCgpIG11bHRpcGxlIHRpbWVzIGJlbG93CisgICAgICAgICAgICAgICAgbGV0IG51bTEgPSB3Lm51bTEuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisgICAgICAgICAgICAgICAgbGV0IG51bTIgPSB3Lm51bTIuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisKKyAgICAgICAgICAgICAgICBtYXRjaCAqb3AgeworICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OkFkZCA9PiBPayhudW0xICsgbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6U3VidHJhY3QgPT4gT2sobnVtMSAtIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246Ok11bHRpcGx5ID0+IE9rKG51bTEgKiBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpEaXZpZGUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKm51bTIgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0X29wOiBTb21lKCpvcCBhcyBpMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aHk6IFNvbWUoImRpdmlkZSBieSAwIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPayhudW0xIC8gbnVtMikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uOjpuZXcoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIudG9fb3duZWQoKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH07CisKKyAgICAgICAgLy8gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBsb2cgaXQKKyAgICAgICAgaWYgbGV0IE9rKHJlZiB2KSA9IHJlcyB7CisgICAgICAgICAgICBsZXQgbXV0IGxvZyA9IHNlbGYubG9nLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxvZy5pbnNlcnQobG9naWQsIFNoYXJlZFN0cnVjdDo6bmV3KGxvZ2lkLCBmb3JtYXQhKCJ7fSIsIHYpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgdHJ5ISBtYWNybyBhdXRvbWF0aWNhbGx5IG1hcHMgZXJyb3JzCisgICAgICAgIC8vIGJ1dCwgc2luY2Ugd2UgYXJlbid0IHVzaW5nIHRoYXQgaGVyZSB3ZSBoYXZlIHRvIG1hcCBlcnJvcnMgbWFudWFsbHkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZXhjZXB0aW9uIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGUgSURMIGhhdmUgYW4gYXV0by1nZW5lcmF0ZWQKKyAgICAgICAgLy8gaW1wbCBvZiBGcm9tOjpmcm9tCisgICAgICAgIHJlcy5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gaGFuZGxlX3ppcCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIHppcCIpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvbGliLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAwN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBzaGFyZWQ7CitwdWIgbW9kIHR1dG9yaWFsOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdCBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKaW5kZXggNDc1ZTdmOC4uZjE2ODViZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAorKysgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CkBAIC0yMiw5ICsyMiwxNSBAQAogICogdGhlc2UgZGVmaW5pdGlvbnMuCiAgKi8KIAorbmFtZXNwYWNlIGNsIHNoYXJlZAogbmFtZXNwYWNlIGNwcCBzaGFyZWQKK25hbWVzcGFjZSBkIHNoYXJlIC8vICJzaGFyZWQiIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZXBvbnltb3VzIEQga2V5d29yZC4KK25hbWVzcGFjZSBkYXJ0IHNoYXJlZAogbmFtZXNwYWNlIGphdmEgc2hhcmVkCiBuYW1lc3BhY2UgcGVybCBzaGFyZWQKK25hbWVzcGFjZSBwaHAgc2hhcmVkCituYW1lc3BhY2UgaGF4ZSBzaGFyZWQKK25hbWVzcGFjZSBuZXRjb3JlIHNoYXJlZAogCiBzdHJ1Y3QgU2hhcmVkU3RydWN0IHsKICAgMTogaTMyIGtleQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0IGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CmluZGV4IDg2ZTQzM2QuLmUwMjc1NDYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorKysgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKQEAgLTMyLDcgKzMyLDcgQEAKICAqIFRoZSBmaXJzdCB0aGluZyB0byBrbm93IGFib3V0IGFyZSB0eXBlcy4gVGhlIGF2YWlsYWJsZSB0eXBlcyBpbiBUaHJpZnQgYXJlOgogICoKICAqICBib29sICAgICAgICBCb29sZWFuLCBvbmUgYnl0ZQotICogIGJ5dGUgICAgICAgIFNpZ25lZCBieXRlCisgKiAgaTggKGJ5dGUpICAgU2lnbmVkIDgtYml0IGludGVnZXIKICAqICBpMTYgICAgICAgICBTaWduZWQgMTYtYml0IGludGVnZXIKICAqICBpMzIgICAgICAgICBTaWduZWQgMzItYml0IGludGVnZXIKICAqICBpNjQgICAgICAgICBTaWduZWQgNjQtYml0IGludGVnZXIKQEAgLTYyLDExICs2MiwxNiBAQAogICogVGhyaWZ0IGZpbGVzIGNhbiBuYW1lc3BhY2UsIHBhY2thZ2UsIG9yIHByZWZpeCB0aGVpciBvdXRwdXQgaW4gdmFyaW91cwogICogdGFyZ2V0IGxhbmd1YWdlcy4KICAqLworCituYW1lc3BhY2UgY2wgdHV0b3JpYWwKIG5hbWVzcGFjZSBjcHAgdHV0b3JpYWwKK25hbWVzcGFjZSBkIHR1dG9yaWFsCituYW1lc3BhY2UgZGFydCB0dXRvcmlhbAogbmFtZXNwYWNlIGphdmEgdHV0b3JpYWwKIG5hbWVzcGFjZSBwaHAgdHV0b3JpYWwKIG5hbWVzcGFjZSBwZXJsIHR1dG9yaWFsCi1uYW1lc3BhY2Ugc21hbGx0YWxrLmNhdGVnb3J5IFRocmlmdC5UdXRvcmlhbAorbmFtZXNwYWNlIGhheGUgdHV0b3JpYWwKK25hbWVzcGFjZSBuZXRjb3JlIHR1dG9yaWFsCiAKIC8qKgogICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCkBAIC0xMTIsNyArMTE3LDcgQEAKICAqIFN0cnVjdHMgY2FuIGFsc28gYmUgZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgbmFzdHkuCiAgKi8KIGV4Y2VwdGlvbiBJbnZhbGlkT3BlcmF0aW9uIHsKLSAgMTogaTMyIHdoYXQsCisgIDE6IGkzMiB3aGF0T3AsCiAgIDI6IHN0cmluZyB3aHkKIH0KIAo=